From 897671fd00542b779926ff0e9495a65c020e0c54 Mon Sep 17 00:00:00 2001 From: XYenChi <466530436@qq.com> Date: Sun, 16 Apr 2017 07:20:28 +0800 Subject: [PATCH 0001/1407] XYenChi is translating --- ...20170118 Arrive On Time With NTP -- Part 1- Usage Overview.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170118 Arrive On Time With NTP -- Part 1- Usage Overview.md b/sources/tech/20170118 Arrive On Time With NTP -- Part 1- Usage Overview.md index c5ad01dc35..fe91661852 100644 --- a/sources/tech/20170118 Arrive On Time With NTP -- Part 1- Usage Overview.md +++ b/sources/tech/20170118 Arrive On Time With NTP -- Part 1- Usage Overview.md @@ -1,3 +1,4 @@ +XYenChi is translating Arrive On Time With NTP -- Part 1: Usage Overview ============================================================ From 523168c3ebafc355b11bc3c73d78dae1dece2698 Mon Sep 17 00:00:00 2001 From: XYenChi <466530436@qq.com> Date: Wed, 26 Apr 2017 07:08:06 +0800 Subject: [PATCH 0002/1407] translated --- ...Time With NTP -- Part 1- Usage Overview.md | 62 ------------------- ...Time With NTP -- Part 1- Usage Overview.md | 62 +++++++++++++++++++ 2 files changed, 62 insertions(+), 62 deletions(-) delete mode 100644 sources/tech/20170118 Arrive On Time With NTP -- Part 1- Usage Overview.md create mode 100644 translated/20170118 Arrive On Time With NTP -- Part 1- Usage Overview.md diff --git a/sources/tech/20170118 Arrive On Time With NTP -- Part 1- Usage Overview.md b/sources/tech/20170118 Arrive On Time With NTP -- Part 1- Usage Overview.md deleted file mode 100644 index fe91661852..0000000000 --- a/sources/tech/20170118 Arrive On Time With NTP -- Part 1- Usage Overview.md +++ /dev/null @@ -1,62 +0,0 @@ -XYenChi is translating -Arrive On Time With NTP -- Part 1: Usage Overview -============================================================ - - ![NTP](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ntp-time.jpg?itok=zu8dqpki "NTP") -In this first of a three-part series, Chris Binnie looks at why NTP services are essential to a happy infrastructure.[Used with permission][1] - -Few services on the Internet can claim to be so critical in nature as time. Subtle issues which affect the timekeeping of your systems can sometimes take a day or two to be realized, and they are almost always unwelcome because of the knock-on effects they cause. - -Consider as an example that your backup server loses connectivity to your Network Time Protocol (NTP) server and, over a period of a few days, introduces several hours of clock skew. Your colleagues arrive at work at 9am as usual only to find the bandwidth-intensive backups consuming all the network resources meaning that they can barely even log into their workstations to start their day’s work until the backup has finished. - -In this first of a three-part series, I’ll provide brief overview of NTP to help prevent such disasters. From the timestamps on your emails to remembering when you started your shift at work, NTP services are essential to a happy infrastructure. - -You might consider that the really important NTP servers (from which other servers pick up their clock data) are at the bottom of an inverted pyramid and referred to as Stratum 1 servers (also known as “primary” servers). These servers speak directly to national time services (known as Stratum 0, which might be devices such as atomic clocks or GPS clocks, for example). There are a number of ways of communicating with them securely, via satellite or radio, for example. - -Somewhat surprisingly, it’s reasonably common for even large enterprises to connect to Stratum 2 servers (or “secondary” servers) as opposed to primary servers. Stratum 2 servers, as you’d expect, synchronize directly with Stratum 1 servers. If you consider that a corporation might have their own onsite NTP servers (at least two, usually three, for resilience) then these would be Stratum 3 servers. As a result, such a corporation’s Stratum 3 servers would then connect upstream to predefined secondary servers and dutifully pass the time onto its many client and server machines as an accurate reflection of the current time. - -A simple design component of NTP is that it works on the premise -- thanks to the large geographical distances travelled by Internet traffic -- that round-trip times (of when a packet was sent and how many seconds later it was received) are sensibly taken into account before trusting to a time as being entirely accurate. There’s a lot more to setting a computer’s clock than you might at first think, if you don’t believe me, then [this fascinating web page][3] is well worth looking at. - -At the risk of revisiting the point, NTP is so key to making sure your infrastructure functions as expected that the Stratum servers to which your NTP servers connect to fuel your internal timekeeping must be absolutely trusted and additionally offer redundancy. There’s an informative list of the Stratum 1 servers available at the [main NTP site][4]. - -As you can see from that list, some NTP Stratum 1 servers run in a “ClosedAccount” state; these servers can’t be used without prior consent. However, as long as you adhere to their usage guidelines, “OpenAccess” servers are indeed open for polling. Any “RestrictedAccess” servers can sometimes be limited due to a maximum number of clients or a minimum poll interval. Additionally, these are sometimes only available to certain types of organizations, such as academia. - -### Respect My Authority - -On a public NTP server, you are likely to find that the usage guidelines follow several rules. Let’s have a look at some of them now. - -The “iburst” option involves a client sending a number of packets (eight packets rather than the usual single packet) to an NTP server should it not respond during at a standard polling interval. If, after shouting loudly at the NTP server a few times within a short period of time, a recognized response isn’t forthcoming, then the local time is not  changed. - -Unlike “iburst” the “burst” option is not commonly allowed (so don’t use it!) as per the general rules for NTP servers. That option instead sends numerous packets (eight again apparently) at each polling interval and also when the server is available. If you are continually throwing packets at higher-up Stratum servers even when they are responding normally, you may get blacklisted for using the “burst” option. - -Clearly, how often you connect to a server makes a difference to its load (and the negligible amount of bandwidth used). These settings can be configured locally using the “minpoll” and “maxpoll” options. However, to follow the connecting rules on to an NTP server, you shouldn’t generally alter the the defaults of 64 seconds and 1024 seconds, respectively. - -Another, far from tacit, rule is that clients should always respect Kiss-Of-Death (KOD) messages generated by those servers from which they request time. If an NTP server doesn’t want to respond to a particular request, similar to certain routing and firewalling techniques, then it’s perfectly possible for it to simply discard or blackhole any associated packets. - -In other words, the recipient server of these unwanted packets takes on no extra load to speak of and simply drops the traffic that it doesn’t think it should serve a response to. As you can imagine, however, this isn’t always entirely helpful, and sometimes it’s better to politely ask the client to cease and desist, rather than ignoring the requests. For this reason, there’s a specific packet type called the KOD packet. Should a client be sent an unwelcome KOD packet then it should then remember that particular server as having responded with an access-denied style marker. - -If it’s not the first KOD packet received from back the server, then the client assumes that there is a rate-limiting condition (or something similar) present on the server. It’s common at this stage for the client to write to its local logs, noting the less-than-satisfactory outcome of the transaction with that particular server, if you ever need to troubleshoot such a scenario. - -Bear in mind that, for obvious reasons, it’s key that your NTP’s infrastructure be dynamic. Thus, it’s important not to hard-code IP addresses into your NTP config. By using DNS names, individual servers can fall off the network and the service can still be maintained, IP address space can be reallocated and simple load balancing (with a degree of resilience) can be introduced. - -Let’s not forget that we also need to consider that the exponential growth of the Internet of Things (IoT), eventually involving billions of new devices, will mean a whole host of equipment will need to keep its wristwatches set to the correct time. Should a hardware vendor inadvertently (or purposely) configure their devices to only communicate with one provider’s NTP servers (or even a single server) then there can be -- and have been in the past -- very unwelcome issues. - -As you might imagine, as more units of hardware are purchased and brought online, the owner of the NTP infrastructure is likely to be less than grateful for the associated fees that they are incurring without any clear gain. This scenario is far from being unique to the realms of fantasy. Ongoing headaches -- thanks to NTP traffic forcing a provider’s infrastructure to creak -- have been seen several times over the last few years. - -In the next two articles, I’ll look at some important NTP configuration options and examine server setup. - --------------------------------------------------------------------------------- - -via: https://www.linux.com/learn/arrive-time-ntp-part-1-usage-overview - -作者:[CHRIS BINNIE][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.linux.com/users/chrisbinnie -[1]:https://www.linux.com/licenses/category/used-permission -[2]:https://www.linux.com/files/images/ntp-timejpg -[3]:http://www.ntp.org/ntpfaq/NTP-s-sw-clocks-quality.htm -[4]:http://support.ntp.org/bin/view/Servers/StratumOneTimeServers diff --git a/translated/20170118 Arrive On Time With NTP -- Part 1- Usage Overview.md b/translated/20170118 Arrive On Time With NTP -- Part 1- Usage Overview.md new file mode 100644 index 0000000000..b563af8f83 --- /dev/null +++ b/translated/20170118 Arrive On Time With NTP -- Part 1- Usage Overview.md @@ -0,0 +1,62 @@ +用 NTP 把控时间 -- 第一部分:使用概览 +============================================================ + + ![NTP](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/ntp-time.jpg?itok=zu8dqpki "NTP") +这系列共三部分,首先,Chirs Binnie考量了一个令人愉快的基础建设中 NTP 服务的重要性。[经许可使用][1] + +鲜有网络服务器在计时方面称得上是标准。影响你系统的时间计时的小问题可能花了一两天被发现,这样的不速之客通常会引起连锁效应。 + +设想你的备份服务器与网络时间协议(NTP)断开连接,过了几天,引起几小时的时间扭曲。你的同事照常九点上班,发现 bandwidth-intensive 类型的备份服务器消耗了所有网络资源,这也就意味着他们在备份完成之前几乎不能登录工作台开始他们的日常工作。 + +这系列共三部分,首先,我将提供简要介绍 NTP 防止这种困境的发生。从邮件的时间戳到记录你工作的进展,NTP 服务对于一个令人愉快的基础建设是如此重要。 + +想想非常重要的 NTP 服务器 (其他服务器时间数据来源) 是倒置金字塔的底部,与第1层的服务器(也被称为“主要”服务器)相关。这些服务器(0层,是原子钟和GPS钟之类的装置)与自然时间直接交互。安全沟通的方法很多,例如通过卫星或者无线电。 + +令人惊讶的是,几乎所有的大型企业都会连接二层服务器(或“次级”服务器)而是不主服务器。如你所料,二层服务器和一层直接同步。如果你觉得大公司可能有自己的本地 NTP 服务器(至少两个,通常三个,为了恢复),这样就会有三层服务器。结果,第3层服务器将连接上层去预定义次级服务器,负责任地传递时间给客户端和服务器作为当前时间的精确反馈。 + +简单设计构成的 NTP 工作前提是——多亏了英特网通路走过大量地理距离——在信任时间完全准确之前,来回时间(包什么时候发出和多少秒后被收到)都会被清楚记录。设置电脑时间比你想象的要多做很多,如果你不信我,那[这神奇的网站][3]值得一看。 + +由于有重复访问节点的风险,NTP 如此关键以至于 NTP 与层次服务器之间的连接被期望必须确保内部计时完全被信赖并且能提供额外信息。有一个有用的 Stratum 1 服务器列表在 [主 NTP 站点][4]. + +正如你在列表所见,一些 NTP 一层服务器以“ClosedAccount”状态运行;这些服务器需要提前同意才可以使用。但是只要你完全按照他们的使用引导做,“OpenAccess” 服务一定会为了轮询开放。每个 “RestrictedAccess” 服务有时候会因为大量客户端访问或者少数轮询间隙而受限。另外有时候会专供某种类型的组织,例如学术界。 + +### 尊重我的权威 + +在公共 NTP 服务器上,你可能发现使用引导遵从某些规则。现在让我们看看其中一些。 + + “iburst” 选项作用是客户端发送一定数量的包(八个包而不是通常的一个)给 NTP 服务器,轮询间隔会没有应答。 +如果在短时间内呼叫 NTP 服务器几次,没有出现可辨识的应答,那么本地时间没有变化。 + +不像 “iburst” ,按照 NTP 服务器的规则, “burst” 选项一般不允许使用(所以不要用它!)。这个选项不仅在探询间隙发送大量包(明显又是八个),而且也会在能正常使用时这样做。如果你在高层服务器持续发送包,甚至是它们在正常应答时,你可能会因为使用 “burst” 选项而被拉黑。 + +显然,你连接服务器的频率影响了它加载的速度(和少量带宽使用)。使用“minpoll”和“maxpoll”选项可以本地设置。然而,根据连接 NTP 服务器的规则,你不应该分别修改默认的 64 秒和 1024 秒。 + +此外,需要提出的是客户应该重视请求时间的服务器发出的 Kiss-Of-Death (KOD) 消息。如果 NTP 服务器不想反馈特殊请求,类似于路由和防火墙技术,那么它极有可能遗弃或吞没每个相关的包。 + +换句话说,接受异常数据的服务器交互不需要额外的负载而且几乎不消耗流量以至于它认为这不值得回应。你就可以想象,这很无力,有时候礼貌地问客户是否中止或停止比忽略请求更为有效。因此,这种特别的包类型叫做 KOD 包。不受欢迎的 KOD 包被传送给客户端,然后记住这特别的拒绝访问标志。 + +如果收到不止一个服务器反馈的 KOD 包,客户端会猜想服务器上发生了流量限速的情况(或类似的)。客户端一般会写入本地日志,使用特别服务器差强人意的处理结果,如果你需要分析解决方案。 + +牢记, NTP 服务器的动态基础建设明显是关键。因此,不要给你的 NTP 配置硬编码 IP 地址。通过使用 DNS 域名,独立服务器衰减网络,服务仍能继续进行,IP 地址空间能被重新分配并且可引入简单的负载均衡(具有一定程度的弹性)。 + +请别忘了我们也需要考虑呈指数增长的物联网(IoT),最终将包括数以亿万计的新装置,意味着设备的主机需要保持正确时间。硬件卖家无意(或有意)设置他们的设备只能与一个提供者的(甚至一个) NTP 服务器连接将成为过去,变成非常不受欢迎的问题。 + +你可能会想象,随着更多的硬件单元被在线购进,NTP 基础设施的拥有者大概不会为相关费用感激,因为他们正被没有实际收入所困扰。这方案远非在奇幻领域独树一帜。正当头疼 -- 感谢 NTP 通路提供的基本设置强制停止 -- 过去几年里已遇多次。 + +在下面两篇文章里,我将着重于一些重要的 NTP 配置和测试服务器启动。 + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/learn/arrive-time-ntp-part-1-usage-overview + +作者:[CHRIS BINNIE][a] +译者:[译者ID](https://github.com/XYenChi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.linux.com/users/chrisbinnie +[1]:https://www.linux.com/licenses/category/used-permission +[2]:https://www.linux.com/files/images/ntp-timejpg +[3]:http://www.ntp.org/ntpfaq/NTP-s-sw-clocks-quality.htm +[4]:http://support.ntp.org/bin/view/Servers/StratumOneTimeServers From 0f321e1996f7619d9a8ec4c4a46d36b6671632f4 Mon Sep 17 00:00:00 2001 From: Kenneth Hawk Date: Thu, 4 May 2017 19:44:00 +0800 Subject: [PATCH 0003/1407] translating --- ... Discovering my inner curmudgeon A Linux laptop review.md | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/sources/tech/20170403 Discovering my inner curmudgeon A Linux laptop review.md b/sources/tech/20170403 Discovering my inner curmudgeon A Linux laptop review.md index 2f68b6b491..ecc72c7280 100644 --- a/sources/tech/20170403 Discovering my inner curmudgeon A Linux laptop review.md +++ b/sources/tech/20170403 Discovering my inner curmudgeon A Linux laptop review.md @@ -1,5 +1,8 @@ +translating by [kenxx](https://github.com/kenxx) + # [Discovering my inner curmudgeon: A Linux laptop review][1] + Quick refresher: I'm a life-long Mac user, but I was [disappointed by Apple's latest MacBook Pro release][2]. I researched [a set of alternative computers][3] to consider. And, as a surprise even to myself, I decided to leave the Mac platform. I chose the HP Spectre x360 13" laptop that was released after CES 2017, the new version with a 4K display. I bought the machine [from BestBuy][4] (not an affiliate link) because that was the only retailer selling this configuration. My goal was to run Ubuntu Linux instead of Windows. @@ -67,7 +70,7 @@ Follow @haxor if you'd like to read posts from me in the future. You can also em via: http://www.onebigfluke.com/2017/04/discovering-my-inner-curmudgeon-linux.html 作者:[Brett Slatkin ][a] -译者:[译者ID](https://github.com/译者ID) +译者:[kenxx](https://github.com/kenxx) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 284abf065854858785650e97b0665eee2db42d43 Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 5 May 2017 09:06:41 +0800 Subject: [PATCH 0004/1407] translating --- .../tech/20170415 bd – Quickly Go Back to a Parent Directory.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170415 bd – Quickly Go Back to a Parent Directory.md b/sources/tech/20170415 bd – Quickly Go Back to a Parent Directory.md index f6d4ef39a7..c16d0d1611 100644 --- a/sources/tech/20170415 bd – Quickly Go Back to a Parent Directory.md +++ b/sources/tech/20170415 bd – Quickly Go Back to a Parent Directory.md @@ -1,3 +1,5 @@ +translating---geekpi + bd – Quickly Go Back to a Parent Directory Instead of Typing “cd ../../..” Redundantly ============================================================ From 6ed93004b8f79b575ff54df3eb79dbd2c62fcae9 Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 5 May 2017 09:22:41 +0800 Subject: [PATCH 0005/1407] =?UTF-8?q?PRF&PUB:20170314=20Integrate=20Ubuntu?= =?UTF-8?q?=2016.04=20to=20AD=20as=20a=20Domain=20Member=20with=20Samba=20?= =?UTF-8?q?and=20Winbind=20=E2=80=93=20Part=208.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @rusking --- ... Member with Samba and Winbind – Part 8.md | 83 +++++++++---------- 1 file changed, 41 insertions(+), 42 deletions(-) rename {translated/tech => published}/20170314 Integrate Ubuntu 16.04 to AD as a Domain Member with Samba and Winbind – Part 8.md (72%) diff --git a/translated/tech/20170314 Integrate Ubuntu 16.04 to AD as a Domain Member with Samba and Winbind – Part 8.md b/published/20170314 Integrate Ubuntu 16.04 to AD as a Domain Member with Samba and Winbind – Part 8.md similarity index 72% rename from translated/tech/20170314 Integrate Ubuntu 16.04 to AD as a Domain Member with Samba and Winbind – Part 8.md rename to published/20170314 Integrate Ubuntu 16.04 to AD as a Domain Member with Samba and Winbind – Part 8.md index 4d2cfcd16f..c4df921e8d 100644 --- a/translated/tech/20170314 Integrate Ubuntu 16.04 to AD as a Domain Member with Samba and Winbind – Part 8.md +++ b/published/20170314 Integrate Ubuntu 16.04 to AD as a Domain Member with Samba and Winbind – Part 8.md @@ -1,10 +1,9 @@ -Integrate Ubuntu 16.04 to AD as a Domain Member with Samba and Winbind – Part 8 +Samba 系列(八):使用 Samba 和 Winbind 将 Ubuntu 16.04 添加到 AD 域 ============================================================ -使用 Samba 和 Winbind 将 Ubuntu 16.04 添加到 AD 域 ——(八) 这篇文章讲述了如何将 Ubuntu 主机加入到 Samba4 AD 域,并实现使用域帐号登录 Ubuntu 系统。 -#### 要求: +### 要求: 1. [在 Ubuntu 系统上使用 Samba4 软件来创建活动目录架构][1] @@ -12,7 +11,7 @@ Integrate Ubuntu 16.04 to AD as a Domain Member with Samba and Winbind – Part 1、在将 Ubuntu 主机加入到 AD DC 之前,你得先确保 Ubuntu 系统中的一些服务配置正常。 -主机名是你的机器的一个重要标识。因此,在加入域前,使用 hostnamectl 命令或者通过手动编辑 /etc/hostname 文件来为 Ubuntu 主机设置一个合适的主机名。 +主机名是你的机器的一个重要标识。因此,在加入域前,使用 `hostnamectl` 命令或者通过手动编辑 `/etc/hostname` 文件来为 Ubuntu 主机设置一个合适的主机名。 ``` # hostnamectl set-hostname your_machine_short_name @@ -23,32 +22,32 @@ Integrate Ubuntu 16.04 to AD as a Domain Member with Samba and Winbind – Part ![Set System Hostname](http://www.tecmint.com/wp-content/uploads/2017/03/Set-Ubuntu-System-Hostname.png) ][2] -设置系统主机名 +*设置系统主机名* 2、在这一步中,打开并编辑网卡配置文件,为你的主机设置一个合适的 IP 地址。注意把 DNS 地址设置为你的域控制器的地址。 -编辑 /etc/network/interfaces 文件,添加 dns-nameservers 参数,并设置为 AD 服务器的 IP 地址,添加 dns-search 参数,其值为域控制器的主机名,如下图所示。 +编辑 `/etc/network/interfaces` 文件,添加 `dns-nameservers` 参数,并设置为 AD 服务器的 IP 地址;添加 `dns-search` 参数,其值为域控制器的主机名,如下图所示。 -并且,把上面设置的 DNS IP 地址和域名添加到 /etc/resolv.conf 配置文件中,如下图所示: +并且,把上面设置的 DNS IP 地址和域名添加到 `/etc/resolv.conf` 配置文件中,如下图所示: [ ![Configure Network Settings for AD](http://www.tecmint.com/wp-content/uploads/2017/03/Configure-Network-Settings-for-AD.png) ][3] -为 AD 配置网络设置 +*为 AD 配置网络设置* -在上面的截图中, 192.168.1.254 和 192.168.1.253 是 Samba4 AD DC 服务器的 IP 地址, Tecmint.lan 是 AD 域名,已加入到这个域中的所有机器都可以查询到该域名。 +在上面的截图中, `192.168.1.254` 和 `192.168.1.253` 是 Samba4 AD DC 服务器的 IP 地址, `Tecmint.lan` 是 AD 域名,已加入到这个域中的所有机器都可以查询到该域名。 3、重启网卡服务或者重启计算机以使网卡配置生效。使用 ping 命令加上域名来检测 DNS 解析是否正常。 -AD DC 应该返回的 FQDN 。如果你的网络中配置了 DHCP 服务器来为局域网中的计算机自动分配 IP 地址,请确保你已经把 AD DC 服务器的 IP 地址添加到 DHCP 服务器的 DNS 配置中。 +AD DC 应该返回的是 FQDN 。如果你的网络中配置了 DHCP 服务器来为局域网中的计算机自动分配 IP 地址,请确保你已经把 AD DC 服务器的 IP 地址添加到 DHCP 服务器的 DNS 配置中。 ``` # systemctl restart networking.service # ping -c2 your_domain_name ``` -4、最后一步是配置服务器时间同步。安装 ntpdate 包,使用下面的命令来查询并同步 AD DC 服务器的时间。 +4、最后一步是配置服务器时间同步。安装 `ntpdate` 包,使用下面的命令来查询并同步 AD DC 服务器的时间。 ``` $ sudo apt-get install ntpdate @@ -59,7 +58,7 @@ $ sudo ntpdate your_domain_name ![Time Synchronization with AD](http://www.tecmint.com/wp-content/uploads/2017/03/Time-Synchronization-with-AD.png) ][4] -AD 服务器时间同步 +*AD 服务器时间同步* 5、下一步,在 Ubuntu 机器上执行下面的命令来安装加入域环境所必需软件。 @@ -70,7 +69,7 @@ $ sudo apt-get install samba krb5-config krb5-user winbind libpam-winbind libnss ![Install Samba4 in Ubuntu Client](http://www.tecmint.com/wp-content/uploads/2017/03/Install-Samba4-in-Ubuntu-Client.png) ][5] -在 Ubuntu 机器上安装 Samba4 软件 +*在 Ubuntu 机器上安装 Samba4 软件* 在 Kerberos 软件包安装的过程中,你会被询问输入默认的域名。输入大写的域名,并按 Enter 键继续安装。 @@ -78,7 +77,7 @@ $ sudo apt-get install samba krb5-config krb5-user winbind libpam-winbind libnss ![Add AD Domain Name](http://www.tecmint.com/wp-content/uploads/2017/03/Add-AD-Domain-Name.png) ][6] -添加 AD 域名 +*添加 AD 域名* 6、当所有的软件包安装完成之后,使用域管理员帐号来测试 Kerberos 认证,然后执行下面的命令来列出票据信息。 @@ -90,7 +89,7 @@ $ sudo apt-get install samba krb5-config krb5-user winbind libpam-winbind libnss ![Check Kerberos Authentication with AD](http://www.tecmint.com/wp-content/uploads/2017/03/Check-Kerberos-Authentication-with-AD.png) ][7] -使用 AD 来检查 Kerberos 认证是否正常 +*使用 AD 来检查 Kerberos 认证是否正常* ### 第二步:将 Ubuntu 主机添加到 Samba4 AD DC @@ -129,11 +128,11 @@ store dos attributes = Yes ![Configure Samba for AD](http://www.tecmint.com/wp-content/uploads/2017/03/Configure-Samba.png) ][8] -Samba 服务的 AD 环境配置 +*Samba 服务的 AD 环境配置* -根据你本地的实际情况来替换 workgroup , realm , netbios name 和 dns forwarder 的参数值。 +根据你本地的实际情况来替换 `workgroup` , `realm` , `netbios name` 和 `dns forwarder` 的参数值。 -由于 winbind use default domain 这个参数会让 winbind 服务把任何登录系统的帐号都当作 AD 帐号。因此,如果存在本地帐号名跟域帐号同名的情况下,请不要设置该参数。 +由于 `winbind use default domain` 这个参数会让 winbind 服务把任何登录系统的帐号都当作 AD 帐号。因此,如果存在本地帐号名跟域帐号同名的情况下,请不要设置该参数。 8、现在,你应该重启 Samba 后台服务,停止并卸载一些不必要的服务,然后启用 samba 服务的 system-wide 功能,使用下面的命令来完成。 @@ -153,7 +152,7 @@ $ sudo net ads join -U ad_admin_user ![Join Ubuntu to Samba4 AD DC](http://www.tecmint.com/wp-content/uploads/2017/03/Join-Ubuntu-to-Samba4-AD-DC.png) ][9] -把 Ubuntu 主机加入到 Samba4 AD DC +*把 Ubuntu 主机加入到 Samba4 AD DC* 10、在 [安装了 RSAT 工具的 Windows 机器上][10] 打开 AD UC ,展开到包含的计算机。你可以看到已加入域的 Ubuntu 计算机。 @@ -161,7 +160,7 @@ $ sudo net ads join -U ad_admin_user ![Confirm Ubuntu Client in Windows AD DC](http://www.tecmint.com/wp-content/uploads/2017/03/Confirm-Ubuntu-Client-in-RSAT-.png) ][11] -确认 Ubuntu 计算机已加入到 Windows AD DC +*确认 Ubuntu 计算机已加入到 Windows AD DC* ### 第三步:配置 AD 帐号认证 @@ -173,7 +172,7 @@ $ sudo net ads join -U ad_admin_user $ sudo nano /etc/nsswitch.conf ``` -然后在 passwd 和 group 行添加 winbind 值,如下图所示: +然后在 `passwd` 和 `group` 行添加 winbind 值,如下图所示: ``` passwd: compat winbind @@ -183,9 +182,9 @@ group: compat winbind ![Configure AD Accounts Authentication](http://www.tecmint.com/wp-content/uploads/2017/03/Configure-AD-Accounts-Authentication.png) ][12] -配置 AD 帐号认证 +*配置 AD 帐号认证* -12、为了测试 Ubuntu 机器是否已加入到域中,你可以使用 wbinfo 命令来列出域帐号和组。 +12、为了测试 Ubuntu 机器是否已加入到域中,你可以使用 `wbinfo` 命令来列出域帐号和组。 ``` $ wbinfo -u @@ -195,9 +194,9 @@ $ wbinfo -g ![List AD Domain Accounts and Groups](http://www.tecmint.com/wp-content/uploads/2017/03/List-AD-Domain-Accounts-and-Groups.png) ][13] -列出域帐号和组 +*列出域帐号和组* -13、同时,使用 getent 命令加上管道符及 grep 参数来过滤指定域用户或组,以测试 Winbind nsswitch 模块是否运行正常。 +13、同时,使用 `getent` 命令加上管道符及 `grep` 参数来过滤指定域用户或组,以测试 Winbind nsswitch 模块是否运行正常。 ``` $ sudo getent passwd| grep your_domain_user @@ -207,9 +206,9 @@ $ sudo getent group|grep 'domain admins' ![Check AD Domain Users and Groups](http://www.tecmint.com/wp-content/uploads/2017/03/Check-AD-Domain-Users-and-Groups.png) ][14] -检查 AD 域用户和组 +*检查 AD 域用户和组* -14、为了让域帐号在 Ubuntu 机器上完成认证登录,你需要使用 root 帐号运行 pam-auth-update 命令,然后勾选 winbind 服务所需的选项,以让每个域帐号首次登录时自动创建 home 目录。 +14、为了让域帐号在 Ubuntu 机器上完成认证登录,你需要使用 root 帐号运行 `pam-auth-update` 命令,然后勾选 winbind 服务所需的选项,以让每个域帐号首次登录时自动创建 home 目录。 查看所有的选项,按 ‘[空格]’键选中,单击 OK 以应用更改。 @@ -220,9 +219,9 @@ $ sudo pam-auth-update ![Authenticate Ubuntu with Domain Accounts](http://www.tecmint.com/wp-content/uploads/2017/03/Authenticate-Ubuntu-with-Domain-Accounts.png) ][15] -使用域帐号登录 Ubuntu 主机 +*使用域帐号登录 Ubuntu 主机* -15、在 Debian 系统中,如果想让系统自动为登录的域帐号创建家目录,你需要手动编辑 /etc/pam.d/common-account 配置文件,并添加下面的内容。 +15、在 Debian 系统中,如果想让系统自动为登录的域帐号创建家目录,你需要手动编辑 `/etc/pam.d/common-account` 配置文件,并添加下面的内容。 ``` session required pam_mkhomedir.so skel=/etc/skel/ umask=0022 @@ -231,9 +230,9 @@ session required pam_mkhomedir.so skel=/etc/skel/ umask=0022 ![Authenticate Debian with Domain Accounts](http://www.tecmint.com/wp-content/uploads/2017/03/Authenticate-Debian-with-Domain-Accounts.png) ][16] -使用域帐号登录 Debian 系统 +*使用域帐号登录 Debian 系统* -16、为了让 AD 用户能够在 Linux 的命令行下修改密码,你需要打开 /etc/pam.d/common-password 配置文件,在 password 那一行删除 use_authtok 参数,如下图所示: +16、为了让 AD 用户能够在 Linux 的命令行下修改密码,你需要打开 /etc/pam.d/common-password 配置文件,在 `password` 那一行删除 `use_authtok` 参数,如下图所示: ``` password [success=1 default=ignore] pam_winbind.so try_first_pass @@ -242,9 +241,9 @@ password [success=1 default=ignore] pam_winbind.so try_first_pass ![Users Allowed to Change Password](http://www.tecmint.com/wp-content/uploads/2017/03/AD-Domain-Users-Change-Password.png) ][17] -允许域帐号在 Linux 命令行下修改密码 +*允许域帐号在 Linux 命令行下修改密码* -17、要使用 Samba4 AD 帐号来登录 Ubuntu 主机,在 su - 后面加上域用户名即可。你还可以通过运行 id 命令来查看 AD 帐号的其它信息。 +17、要使用 Samba4 AD 帐号来登录 Ubuntu 主机,在 `su -` 后面加上域用户名即可。你还可以通过运行 `id` 命令来查看 AD 帐号的其它信息。 ``` $ su - your_ad_user @@ -253,9 +252,9 @@ $ su - your_ad_user ![Find AD User Information](http://www.tecmint.com/wp-content/uploads/2017/03/Find-AD-User-Information.png) ][18] -查看 AD 用户信息 +*查看 AD 用户信息* -使用 [pwd 命令][19]来查看域帐号的当前目录,如果你想修改域帐号的密码,你可以使用 passwd 命令来完成。 +使用 [pwd 命令][19]来查看域帐号的当前目录,如果你想修改域帐号的密码,你可以使用 `passwd` 命令来完成。 18、如果想让域帐号在 ubuntu 机器上拥有 root 权限,你可以使用下面的命令来把 AD 帐号添加到 sudo 系统组中: @@ -263,15 +262,15 @@ $ su - your_ad_user $ sudo usermod -aG sudo your_domain_user ``` -登录域帐号登录到 Ubuntu 主机,然后运行 apt-get-update 命令来更新系统,以验证域账号是否拥有 root 权限。 +登录域帐号登录到 Ubuntu 主机,然后运行 `apt-get-update` 命令来更新系统,以验证域账号是否拥有 root 权限。 [ ![Add Sudo User Root Group](http://www.tecmint.com/wp-content/uploads/2017/03/Add-Sudo-User-Root-Group.png) ][20] -给域帐号添加 root 权限 +*给域帐号添加 root 权限* -19、要为整个域用户组添加 root 权限,使用 vi 命令打开并编辑 /etc/sudoers 配置文件,如下图所示,添加如下内容: +19、要为整个域用户组添加 root 权限,使用 `vi` 命令打开并编辑 `/etc/sudoers` 配置文件,如下图所示,添加如下内容: ``` %YOUR_DOMAIN\\your_domain\ group ALL=(ALL:ALL) ALL @@ -280,13 +279,13 @@ $ sudo usermod -aG sudo your_domain_user ![Add Root Privileges to Domain Group](http://www.tecmint.com/wp-content/uploads/2017/03/Add-Root-Privileges-to-Domain-Group.jpg) ][21] -为域帐号组添加 root 权限 +*为域帐号组添加 root 权限* 使用反斜杠来转义域用户组的名称中包含的空格,或者用来转义第一个反斜杠。在上面的例子中, TECMINT 域的域用户组的名字是 “domain admins" 。 -前边的 `(%)` 表明我们指定是的用户组而不是用户名。 +前边的 `%` 表明我们指定是的用户组而不是用户名。 -20、如果你使用的是图形界面的 Ubuntu 系统,并且你想使用域帐号来登录系统,你需要修改 LightDM 显示管理器,编辑 /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf 配置文件,添加下面的内容,然后重启系统才能生效。 +20、如果你使用的是图形界面的 Ubuntu 系统,并且你想使用域帐号来登录系统,你需要修改 LightDM 显示管理器,编辑 `/usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf` 配置文件,添加下面的内容,然后重启系统才能生效。 ``` greeter-show-manual-login=true @@ -307,7 +306,7 @@ via: http://www.tecmint.com/join-ubuntu-to-active-directory-domain-member-samba- 作者:[Matei Cezar][a] 译者:[rusking](https://github.com/rusking) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 04be1b5285ecd6a61a18fd0b0e9c960c50a9c946 Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 5 May 2017 09:54:10 +0800 Subject: [PATCH 0006/1407] translated --- ...– Quickly Go Back to a Parent Directory.md | 144 ------------------ ...– Quickly Go Back to a Parent Directory.md | 142 +++++++++++++++++ 2 files changed, 142 insertions(+), 144 deletions(-) delete mode 100644 sources/tech/20170415 bd – Quickly Go Back to a Parent Directory.md create mode 100644 translated/tech/20170415 bd – Quickly Go Back to a Parent Directory.md diff --git a/sources/tech/20170415 bd – Quickly Go Back to a Parent Directory.md b/sources/tech/20170415 bd – Quickly Go Back to a Parent Directory.md deleted file mode 100644 index c16d0d1611..0000000000 --- a/sources/tech/20170415 bd – Quickly Go Back to a Parent Directory.md +++ /dev/null @@ -1,144 +0,0 @@ -translating---geekpi - -bd – Quickly Go Back to a Parent Directory Instead of Typing “cd ../../..” Redundantly -============================================================ - - -While navigating the file system via the command line on Linux systems, in order to move back into a parent directory (in a long path), we would normally issue the [cd command][1] repeatedly (`cd ../../..`) until we land into the directory of interest. - -This can be so tedious and boring much of the time, especially for experienced Linux users or system administrators who carry out so many various tasks, therefore hope to discover shortcuts to ease their jobs while operating a system. - -**Suggested Read:** [Autojump – An Advanced ‘cd’ Command to Quickly Navigate Linux Filesystem][2] - -In this article, we will review a simple but helpful utility for quickly moving back into a parent directory in Linux with the help of bd tool. - -bd is a handy utility for navigating the filesystem, it enables you to quickly go back to a parent directory without typing `cd ../../..` repeatedly. You can reliably combine it with other Linux commands to perform a few daily operations. - -### How to Install bd in Linux Systems - -Run the following commands to download and install bd under `/usr/bin/` using the [wget command][3], make it executable and create the required alias in your `~/.bashrc` file: - -``` -$ wget --no-check-certificate -O /usr/bin/bd https://raw.github.com/vigneshwaranr/bd/master/bd -$ chmod +rx /usr/bin/bd -$ echo 'alias bd=". bd -si" >> ~/.bashrc -$ source ~/.bashrc -``` - -Note: To enable case-sensitive directory name matching, set the `-s` flag instead of `-si` in the alias created above. - -To enable autocomplete support, run these commands: - -``` -$ sudo wget -O /etc/bash_completion.d/bd https://raw.github.com/vigneshwaranr/bd/master/bash_completion.d/bd -$ sudo source /etc/bash_completion.d/bd -``` - -#### How to Use bd in Linux Systems - -Assuming your currently in the top directory in this path: - -``` -/media/aaronkilik/Data/Computer Science/Documents/Books/LEARN/Linux/Books/server $ -``` - -and you want to go to Documents directory quickly, then simply type: - -``` -$ bd Documents -``` - -Then to go straight into the Data directory, you can type: - -``` -$ bd Data -``` -[ - ![Switch Between Directories Quickly](http://www.tecmint.com/wp-content/uploads/2017/03/Switch-Between-Directories-Quickly.png) -][4] - -Switch Between Directories Quickly - -Actually, bd makes it even more straight forward, all you need to do is just type bd such as: - -``` -$ bd Doc -$ bd Da -``` -[ - ![Quickly Switch Directories](http://www.tecmint.com/wp-content/uploads/2017/03/Quickly-Switch-Directories.png) -][5] - -Quickly Switch Directories - -Important: In case there are more than one directories with the same name up in the hierarchy, bd will move you into the closest without considering the immediate parent as explained in the example below. - -For instance, in the path above, there are two directories with the same name Books, if you want to move into: - -``` -/media/aaronkilik/Data/ComputerScience/Documents/Books/LEARN/Linux/Books -``` - -Typing bd books will take you into: - -``` -/media/aaronkilik/Data/ComputerScience/Documents/Books -``` -[ - ![Move to 'Books' Directory Quickly](http://www.tecmint.com/wp-content/uploads/2017/03/Move-to-Directory-Quickly.png) -][6] - -Move to ‘Books’ Directory Quickly - -Additionally, using bd within backticks in the form ``bd `` prints out the path minus changing the current directory, so you can use ``bd `` with other common Linux commands such as [ls][7], [echo][8] etc.. - -In the example below, am currently in the directory, /var/www/html/internship/assets/filetree and to print the absolute path, long-list the contents and sum up the size of all files in the directory html without moving into it, I can just type: - -``` -$ echo `bd ht` -$ ls -l `bd ht` -$ du -cs `bd ht` -``` -[ - ![Switch Directory with Listing](http://www.tecmint.com/wp-content/uploads/2017/03/Switch-Directory-with-Listing.png) -][9] - -Switch Directory with Listing - -Find out more about bd tool on Github: [https://github.com/vigneshwaranr/bd][10] - -That’s all! In this article, we showed reviewed a handy way of [quickly navigating the filesystem in Linux][11]using bd utility. - -Have your say via the feedback form below. Plus, do you know of any similar utilities out there, let us know in the comments as well. - --------------------------------------------------------------------------------- - -作者简介: - -Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. - ---------------- - -via: http://www.tecmint.com/bd-quickly-go-back-to-a-linux-parent-directory/ - -作者:[Aaron Kili ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.tecmint.com/author/aaronkili/ -[1]:http://www.tecmint.com/cd-command-in-linux/ -[2]:http://www.tecmint.com/autojump-a-quickest-way-to-navigate-linux-filesystem/ -[3]:http://www.tecmint.com/10-wget-command-examples-in-linux/ -[4]:http://www.tecmint.com/wp-content/uploads/2017/03/Switch-Between-Directories-Quickly.png -[5]:http://www.tecmint.com/wp-content/uploads/2017/03/Quickly-Switch-Directories.png -[6]:http://www.tecmint.com/wp-content/uploads/2017/03/Move-to-Directory-Quickly.png -[7]:http://www.tecmint.com/tag/linux-ls-command/ -[8]:http://www.tecmint.com/echo-command-in-linux/ -[9]:http://www.tecmint.com/wp-content/uploads/2017/03/Switch-Directory-with-Listing.png -[10]:https://github.com/vigneshwaranr/bd -[11]:http://www.tecmint.com/autojump-a-quickest-way-to-navigate-linux-filesystem/ -[12]:http://www.tecmint.com/author/aaronkili/ -[13]:http://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ -[14]:http://www.tecmint.com/free-linux-shell-scripting-books/ diff --git a/translated/tech/20170415 bd – Quickly Go Back to a Parent Directory.md b/translated/tech/20170415 bd – Quickly Go Back to a Parent Directory.md new file mode 100644 index 0000000000..b64455511f --- /dev/null +++ b/translated/tech/20170415 bd – Quickly Go Back to a Parent Directory.md @@ -0,0 +1,142 @@ +bd - 快速返回到父目录而不用冗余地输入 “cd ../../ ..” +============================================================ + + +在 Linux 系统上通过命令行切换文件夹时,为了回到父目录(长路径),我们通常会重复输入[ cd 命令][1](`cd ../../..`),直到进入感兴趣的目录。 + +对于经验丰富的 Linux 用户或需要进行各种不同任务的系统管理员而言,这可能非常乏味,因此希望在操作系统时有一个快捷方式来简化工作。 + +**建议阅读:** [Autojump - 一个快速浏览 Linux 文件系统的高级 “cd” 命令][2] + +在本文中,我们将在 bd 工具的帮助下,用这个简单而有用的工具快速回到 Linux 中的父目录。 + +bd 是用于切换文件夹的便利工具,它可以使你快速返回到父目录,而不必重复键入 `cd ../../..` 。 你可以可靠地将其与其他 Linux 命令组合以执行几个日常操作。 + +### 如何在 Linux 中安装 bd + +运行下面的命令,使用[ wget 命令][3]下载并安装 bd 到 `/usr/bin/` 中,添加执行权限,并在 `~/.bashrc` 中创建需要的别名: + +``` +$ wget --no-check-certificate -O /usr/bin/bd https://raw.github.com/vigneshwaranr/bd/master/bd +$ chmod +rx /usr/bin/bd +$ echo 'alias bd=". bd -si" >> ~/.bashrc +$ source ~/.bashrc +``` + +注意:要启用大小写敏感的目录名匹配,在上面创建的别名中,设置  `-s` 标志而不是 `-si` 标志。 + +要启用自动补全支持,运行这些命令: + +``` +$ sudo wget -O /etc/bash_completion.d/bd https://raw.github.com/vigneshwaranr/bd/master/bash_completion.d/bd +$ sudo source /etc/bash_completion.d/bd +``` + +#### 如何在 Linux 中使用 bd + +假设你目前在这个路径的顶层目录: + +``` +/media/aaronkilik/Data/Computer Science/Documents/Books/LEARN/Linux/Books/server $ +``` + +你想要快速进入 “Documents” 目录,只要输入: + +``` +$ bd Documents +``` + +接着直接进入到 Data 目录,你可以输入: + +``` +$ bd Data +``` +[ + ![Switch Between Directories Quickly](http://www.tecmint.com/wp-content/uploads/2017/03/Switch-Between-Directories-Quickly.png) +][4] + +目录间快速切换 + +实际上,bd 让它变得更加直接,你要做的是输入 “bd <开头几个字母>”,比如: + +``` +$ bd Doc +$ bd Da +``` +[ + ![Quickly Switch Directories](http://www.tecmint.com/wp-content/uploads/2017/03/Quickly-Switch-Directories.png) +][5] + +快速切换目录 + +重要:如果层次结构中有不止一个具有相同名称的目录,bd 将会移动到最接近的目录,而不考虑最接近的父目录,如下面的例子那样。 + +例如,在上面的路径中,有两个名称相同的目录 Books,如果你想移动到: + +``` +/media/aaronkilik/Data/ComputerScience/Documents/Books/LEARN/Linux/Books +``` + +输入 “bd Books” 会进入: + +``` +/media/aaronkilik/Data/ComputerScience/Documents/Books +``` +[ + ![Move to 'Books' Directory Quickly](http://www.tecmint.com/wp-content/uploads/2017/03/Move-to-Directory-Quickly.png) +][6] + +快速进入 ‘Books’ 目录 + +另外,在引号中使用 bd 如 ``bd `` 会打印出路径而不更改当前目录,所以你可以与其他常见的 Linux 命令,如 [ls][7],[echo][8] 等一起使用 ``bd ` 。 + +在下面的例子中,当前在 /var/www/html/internship/assets/filetree 目录中,要打印出绝对路径、详细列出内容、统计目录 html 中所有文件的大小,你不必进入它,只需要键入: + +``` +$ echo `bd ht` +$ ls -l `bd ht` +$ du -cs `bd ht` +``` +[ + ![Switch Directory with Listing](http://www.tecmint.com/wp-content/uploads/2017/03/Switch-Directory-with-Listing.png) +][9] + +列出切换的目录 + +要在 Github 上了解更多关于 bd 的信息:[https://github.com/vigneshwaranr/bd][10] + +就是这样了!在本文中,我们展示了使用 bd 程序[在 Linux 中快速切换文件夹][11]的便捷方法。 + +通过下面的反馈栏单发表你的看法。此外,你还知道其他类似的工具么,在评论中让我们知道。 + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Kili是一名 Linux 和 F.O.S.S 的爱好者,未来的 Linux 系统管理员、网站开发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,并乐于分享知识。 + +--------------- + +via: http://www.tecmint.com/bd-quickly-go-back-to-a-linux-parent-directory/ + +作者:[Aaron Kili ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.tecmint.com/author/aaronkili/ +[1]:http://www.tecmint.com/cd-command-in-linux/ +[2]:http://www.tecmint.com/autojump-a-quickest-way-to-navigate-linux-filesystem/ +[3]:http://www.tecmint.com/10-wget-command-examples-in-linux/ +[4]:http://www.tecmint.com/wp-content/uploads/2017/03/Switch-Between-Directories-Quickly.png +[5]:http://www.tecmint.com/wp-content/uploads/2017/03/Quickly-Switch-Directories.png +[6]:http://www.tecmint.com/wp-content/uploads/2017/03/Move-to-Directory-Quickly.png +[7]:http://www.tecmint.com/tag/linux-ls-command/ +[8]:http://www.tecmint.com/echo-command-in-linux/ +[9]:http://www.tecmint.com/wp-content/uploads/2017/03/Switch-Directory-with-Listing.png +[10]:https://github.com/vigneshwaranr/bd +[11]:http://www.tecmint.com/autojump-a-quickest-way-to-navigate-linux-filesystem/ +[12]:http://www.tecmint.com/author/aaronkili/ +[13]:http://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[14]:http://www.tecmint.com/free-linux-shell-scripting-books/ From 363a1dd3d867b16adadbbcd118f4bfe499ec15e9 Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 5 May 2017 12:44:55 +0800 Subject: [PATCH 0007/1407] PRF:20170210 Fedora 25 Wayland vs Xorg.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @cycoe 翻译的不错! --- .../20170210 Fedora 25 Wayland vs Xorg.md | 61 +++++++++---------- 1 file changed, 30 insertions(+), 31 deletions(-) diff --git a/translated/tech/20170210 Fedora 25 Wayland vs Xorg.md b/translated/tech/20170210 Fedora 25 Wayland vs Xorg.md index d118b09380..78115dc216 100644 --- a/translated/tech/20170210 Fedora 25 Wayland vs Xorg.md +++ b/translated/tech/20170210 Fedora 25 Wayland vs Xorg.md @@ -1,60 +1,63 @@ -# Fedora 25: Wayland 大战 Xorg +Fedora 25: Wayland 大战 Xorg +============ -就像异形大战铁血战士一样,后者略胜一筹。不管怎样,你可能知道,我最近测试了 [Fedora 25][1],体验还可以。总的来说,这个发行版表现的相当不错。它不是最快速的,但随着一系列的改进,变得足够稳定也足够可用。最重要的是,除了一些性能以及响应性的损失,Wayland 并没有造成我的系统瘫痪。但这还仅仅是个开始。 +就像异形大战铁血战士的结果一样,后者略胜一筹。不管怎样,你可能知道,我最近测试了 [Fedora 25][1],体验还可以。总的来说,这个发行版表现的相当不错。它不是最快速的,但随着一系列的改进,变得足够稳定也足够好用。最重要的是,除了一些性能以及响应性的损失,Wayland 并没有造成我的系统瘫痪。但这还仅仅是个开始。 -Wayland 作为一种消费者技术还处在它的襁褓期,或者至少是当人们在处理桌面事物时应理所当然的这么认为。因此,我必须继续测试,绝不弃坑。在过去的积极地使用 Fedora 25 的几个星期里,我确实碰到了几个其他的问题,有些不用太担心,有些确实很恼人,有些很奇怪,有些却无意义。让我们来讲述一下吧! +Wayland 作为一种消费者技术还处在它的襁褓期,或者至少是当人们在处理桌面事物时应就这么认为。因此,我必须继续测试,绝不弃坑。在过去的积极地使用 Fedora 25 的几个星期里,我确实碰到了几个其它的问题,有些不用太担心,有些确实很恼人,有些很奇怪,有些却无意义。让我们来讲述一下吧! - ![Teaser](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-wayland-xorg-teaser.jpg) +![Teaser](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-wayland-xorg-teaser.jpg) -注: 图片来自 [Wikimedia][2] 并做了些修改, 证书为 [CC BY-SA 3.0][3]. +注: 图片来自 [Wikimedia][2] 并做了些修改, [CC BY-SA 3.0][3] 许可 ### Wayland 并不支持所有软件 -当然不,这是一个事实。如果你去网站上阅读相关的信息,你会发现各种各样的软件都还没为 Wayland 做好准备。但是,我们都知道 Fedora 是一个激进的高端发行版,所以它是为了探索新功能的测试床。这很公平。有一段时间,所有东西都很正常,没有瞎忙活,没有错误。但接下来,我突然需要使用 GParted。我当时很着急,正在排除一个大故障,然后我不得不让自己侧重于无意义的额外工作。 GParted 没办法在 Wayland 下直接启动。在探索了更多一些细节之后,我知道了分区软件目前还没有被支持。 +没错,这是一个事实。如果你去网站上阅读相关的信息,你会发现各种各样的软件都还没为 Wayland 做好准备。当然,我们都知道 Fedora 是一个激进的高端发行版,它是为了探索新功能而出现的测试床。这没毛病。有一段时间,所有东西都很正常,没有瞎忙活,没有错误。但接下来,我突然需要使用 GParted。我当时很着急,正在排除一个大故障,然而我却让自己置身于一些无意义的额外工作。 GParted 没办法在 Wayland 下直接启动。在探索了更多一些细节之后,我知道了该分区软件目前还没有被 Wayland 支持。 - ![GParted 无法运行于 Wayland](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-wayland-xorg-gparted.jpg) +![GParted 无法运行于 Wayland](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-wayland-xorg-gparted.jpg) -问题就在于我并不太清楚其他哪些应用不能在 Wayland 下运行,并且我不能在一个正确估计的时间敏锐地发现。通过在线搜索,我还是不能找到一个目前的简要的不兼容列表。可能只是我,在搜索中遇到了困难,但显然的是一定有什么东西和 "Wayland + 兼容性" 一样琐碎。 +问题就在于我并不太清楚其它哪些应用不能在 Wayland 下运行,并且我不能在一个正确估计的时间敏锐地发现这一点。通过在线搜索,我还是不能快速找到一个简要的当前不兼容列表。可能只是我在搜索方面不太在行,但显而易见这些东西是和“Wayland + 兼容性” 这样的问题一样零零散散的。 -我已经找到的是一个告诉我们 Wayland 很棒的[自我评论][4],一个目前已被这个新玩意儿支持的 [Gnome][5] 应用程序列表,一些 ArchWiki 上的死板的资料,一个在 [英伟达][6] 开发论坛上的呆板得让我后悔点进去的主题,以及一些其他含糊的讨论。 +我找到了一个[自诩][4] Wayland 很棒的文章、一个目前已被这个新玩意儿支持的 [Gnome][5] 应用程序列表、一些 ArchWiki 上难懂的资料,一篇在[英伟达][6]开发论坛上的晦涩得让我后悔点进去的主题,以及一些其他含糊的讨论。 ### 再次提到性能 在 Fedora 25 上,我把登录会话从 Gnome(Wayland)切换到 Gnome Xorg,观察会对系统产生什么影响。我之前已经提到过在同一个笔记本([联想 G50][8])上的性能跑分和与 [Fedora 24][7] 的比较,但这次会给我们提供更加准确的结果。 -Wayland(截图 1)空闲时的内存占用为 1.4GB, CPU 的平均负载约为 4-5%。Xorg(截图 2)占用了同样大小的内存,处理器消耗了全部性能的 3-4%,单纯从数字上来看少了一小点。但是 Xorg 会话的体验却好得多。虽然只是毫秒级,但你感受的到差距。传统的会话看起来更加的灵动、快速、清新一点。但(Wayland)落后并不明显。如果你对你的电脑响应速度很敏感,你可能不会对这点延迟满意。当然,这可能只会成为新手的一点点优化措施,Wayland 会随时间进步。但它也是我们所不能忽视的。 +Wayland(截图 1)空闲时的内存占用为 1.4GB, CPU 的平均负载约为 4-5%。Xorg(截图 2)占用了同样大小的内存,处理器消耗了全部性能的 3-4%,单纯从数字上来看少了一小点。但是 Xorg 会话的体验却好得多。虽然只是毫秒级的差距,但你能感受得到。传统的会话方式看起来更加的灵动、快速、清新一点。但 Wayland 落后得并不明显。如果你对你的电脑响应速度很敏感,你可能会对这点延迟不会太满意。当然,这也许只是作为新手缺乏优化的缘故,Wayland 会随时间进步。但这一点也是我们所不能忽视的。 - ![Wayland resources](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-wayland-xorg-resources-wayland.jpg) +![Wayland resources](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-wayland-xorg-resources-wayland.jpg) - ![Xorg resources](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-wayland-xorg-resources-xorg.jpg) +![Xorg resources](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-wayland-xorg-resources-xorg.jpg) -### 杂谈 +### 批评 -我对此并不高兴。并不是很愤怒,但我不喜欢为了能完全享受我的桌面体验,我却需要登录到传统的 X 会话。因为 X 给了我 100%,但 Wayland 没有。这意味着在一天结束的时候,我不是在用着 Wayland。我喜欢探索科技,但我不是一个盲目的狂热追随者。我只是想用我的桌面,有时我可能需要它快速响应。注销然后重新登录在急需使用的时候会成为恼人的麻烦。我们遇到这个问题的原因就是 Wayland 没有让 Linux 桌面用户的生活变得更简单,而恰恰相反。引用: +我对此并不高兴。虽然并不是很愤怒,但我不喜欢为了能完全享受我的桌面体验,我却需要登录到传统的 X 会话。因为 X 给了我全部,但 Wayland 则没有。这意味着我不能一天都用着 Wayland。我喜欢探索科技,但我不是一个盲目的狂热追随者。我只是想用我的桌面,有时我可能需要它快速响应。注销然后重新登录在急需使用的时候会成为恼人的麻烦。我们遇到这个问题的原因就是 Wayland 没有让 Linux 桌面用户的生活变得更简单,而恰恰相反。 + +引用: > Wayland 是为了成为 X 的更加简单的替代品,更加容易开发和维护。建议 GNOME 和 KDE 都使用它。 -你能看到,这就是问题的一方面原因。东西不应该被设计成容易开发或维护。它能成为所有其他消费需求碰撞后提供的有益的副产品。但如果它们不是,那么不管它对于程序员敲代码来说多么困难或简单都将不重要。那是他们的工作。科技的所有目的都是为了达到一种无缝并且流畅的用户体验。 +你能看到,这就是问题的一方面原因。东西不应该被设计成容易开发或维护。它可以是满足了所有其它消费需求之后提供的有益副产品。但如果没有,那么不管它对于程序员敲代码来说多么困难或简单都将不重要。那是他们的工作。科技的所有目的都是为了达到一种无缝并且流畅的用户体验。 -不幸的是,现在很大数量的产品都被重新设计或者开发,只是为了使软件人员更加轻松,而不是用户。在很大程度上,Gnome 3、PulseAudio、[Systemd][9] 和 Wayland 都没有遵循提高用户体验的宗旨。在这个意义上来说,它们更像是一种侵略,而没有为 Linux 桌面生态的稳定性和易用性作出贡献。 +不幸的是,现在很大数量的产品都被重新设计或者开发,只是为了使软件人员更加轻松,而不是用户。在很大程度上,Gnome 3、PulseAudio、[Systemd][9] 和 Wayland 都没有遵循提高用户体验的宗旨。在这个意义上来说,它们更像是一种打扰,而没有为 Linux 桌面生态的稳定性和易用性作出贡献。 -这也是为什么 Linux 桌面是一个相对不成熟产品的一个主要原因————它被设计成开发人员的自我支持产品,更像一个活生生的生物。而不是依附于用户各种怪念头和想法的奴隶。这也是伟大事物是如何形成的。你满足于主要需求,接下来只是担心细节方面。优秀的用户体验不依赖于(也永远不依赖于)编程语言、编译器的选择,或任何其他无意义的东西。如果依赖了,那么不管谁来设计这个抽象层做的不够好的产品,我们都会得到一个失败的作品,需要把它的存在抹去。 +这也是为什么 Linux 桌面是一个相对不成熟产品的一个主要原因————它被设计成开发人员的自我支持产品,更像一个活生生的生物,而不是依附于用户各种怪念头和想法的奴隶。这也是伟大事物是如何形成的,你满足于主要需求,接下来只是担心细节方面。优秀的用户体验不依赖于(也永远不依赖于)编程语言、编译器的选择,或任何其他无意义的东西。如果依赖了,那么不管谁来设计这个抽象层做的不够好的产品,我们都会得到一个失败的作品,需要把它的存在抹去。 -那么在我的展望中,我不在乎是否要花费 10 升心血,或其他的什么,去编译一个版本。我是一个用户,我所在乎的只是我的桌面能否像它昨天或者 5 年前一样健壮地工作。如果没发生那种事,我不会对宏、类、变量、声明、结构体,或其他任何极客的计算机科技感兴趣。那是不着边际的。一个产品宣传自己是被创造出来为人们的开发提供方便的,那是个悖论。接下来也不用去开发它了。这样反而会使事情更简单。 +那么在我的展望中,我不在乎是否要吐血十升去编译一个 Xorg 或其它什么的版本。我是一个用户,我所在乎的只是我的桌面能否像它昨天或者 5 年前一样健壮地工作。没事的情况下,我不会对宏、类、变量、声明、结构体,或其他任何极客的计算机科技感兴趣。那是不着边际的。一个产品宣传自己是被创造出来为人们的开发提供方便的,那是个悖论。如果接下来再也不用去开发它了,这样反而会使事情更简单。 -现在,事实是 Wayland 大体上可用,但它仍然不像 X 那么好。并且它也不应该在任何的桌面上作为就绪的产品被提供。一但它能够无缝取代那人们没听说过的过时技术,到那时,它能够在它需要去实现的目标取得成功。然后,它能够用 C、D 或者 K 语言重写,拥有开发者需要的任何东西。在那之前,它都是一个蚕食资源和人们思想的寄生虫。 +现在,事实是 Wayland 大体上可用,但它仍然不像 Xorg 那么好,并且它也不应该在任何的桌面上作为就绪的产品被提供。一但它能够无人知晓般无缝地取代那些过时技术,只有在那种时候,它才获得了它所需要的成功,那之后,它可以用 C、D 或者 K 之类的无论什么语言编写,拥有开发者需要的任何东西。而在那之前,它都是一个蚕食资源和人们思想的寄生虫而已。 -不要误会,我们需要进步,需要改变。但它不得不为了进化的目而服务。现在 X 能很好地掌握用户需求了吗?它能为第三方库提供图形支持吗?它能支持 HD、UHD、DPI 或其他的什么吗?你能用它玩最新的游戏吗?是或否?如果不能,那么它需要被修复。这些就是进化的驱动力。而不是写代码或者编译代码的困难程度。软件开发者是数字工业的矿工,他们需要努力工作来使用户开心。就像短语“更加易于开发”应该被取缔一样,那些崇尚于此的人也应该用老式收音机的电池处以电刑,然后用没有空调的飞船流放到火星上去。如果你不能写出高明的代码,那是你的问题。用户不能因为开发者认为自己是公主而遭受折磨。 +不要误会,我们需要进步,需要改变。但它必须为了进化的目而服务。现在 Xorg 能很好地满足用户需求了吗?它能为第三方库提供图形支持吗?它能支持 HD、UHD、DPI 或其他的什么吗?你能用它玩最新的游戏吗?行还是不行?如果不行,那么它就需要被改进。这些就是进化的驱动力,而不是写代码或者编译代码的困难程度。软件开发者是数字工业的矿工,他们需要努力工作而取悦于用户。就像短语“更加易于开发”应该被取缔一样,那些崇尚于此的人也应该用老式收音机的电池处以电刑,然后用没有空调的飞船流放到火星上去。如果你不能写出高明的代码,那是你的问题。用户不能因为开发者认为自己是公主而遭受折磨。 ### 结语 -说到这里。大体上说,Wayland 还可以,并不差。但这说的就像是某人决定修改你工资单上的布局,导致你从昨天能赚 100% 到今天只能赚 83% 一样。讲道理这是不能接受的,即使 Wayland 工作的相当好。正是那些不能运作的东西导致如此大的不同。忽略所有数落它的一方, Wayland 被认为的降低了可用性、性能以及软件的知名度,正是 Fedora 亟待解决的问题。 +说到这里。大体上说,Wayland 还可以,并不差。但这说的就像是某人决定修改你工资单上分配比例,导致你从昨天能赚 100% 到今天只能赚 83% 一样。讲道理这是不能接受的,即使 Wayland 工作的相当好。正是那些不能运作的东西导致如此大的不同。忽略所有批评它的一面,Wayland 被认为降低了可用性、性能以及软件的知名度,这正是 Fedora 亟待解决的问题。 -其他的发行版会跟进,然后我们会看到一个循环的模式,就像 Gnome 3 和 Systemd 所发生的一样。没有完全准备好的东西被放到开放环境中,然后我们花费一两年时间修复无需修复的东西,最终我们将拥有我们已经拥有的相同功能,只是用不同的编程语言来实现。我并不感兴趣。计算机科学曾在 1999 年非常受欢迎,当时 Excel 用户每小时能赚 50 美元。现在,编程就像是躲在平底船下划桨,人们并不会在乎你在甲板下流下的汗水与磨出的水泡。 +其他的发行版会跟进,然后我们会看到历史重演,就像 Gnome 3 和 Systemd 所发生的一样。没有完全准备好的东西被放到开放环境中,然后我们花费一两年时间修复那些本无需修复的东西,最终我们将拥有的是我们已经拥有的相同功能,只是用不同的编程语言来实现。我并不感兴趣这些。计算机科学曾在 1999 年非常受欢迎,当时 Excel 用户每小时能赚 50 美元。而现在,编程就像是躲在平底船下划桨,人们并不会在乎你在甲板下流下的汗水与磨出的水泡。 -性能可能已经不是一个问题,因为你可以放弃 1-2% 的变化,尤其是它会受随机的来自任何一个因素的影响。如果你已经用 Linux 超过一、两年你就会知道的。但是无法启动应用是个大问题。至少 Fedora 也友好地提供了传统的平台。但是,它可能会在 Wayland 100% 成熟前就消失了。我们再来看看,不,不会有灾难。我原本的 Fedora 25 宣称支持这种看法。我们有的就是烦恼,不必要的烦恼。啊,这是 Linux 故事中的第 9000 部。 +性能可能不太是一个问题了,因为你可以放弃 1-2% 的变化,尤其是它会受随机的来自任何一个因素的影响,如果你已经用 Linux 超过一、两年你就会知道的。但是无法启动应用是个大问题。不过至少, Fedora 也友好地提供了传统的平台。但是,它可能会在 Wayland 100% 成熟前就消失了。我们再来看看,不,不会有灾难。我原本的 Fedora 25 宣称支持这种看法。我们有的就是烦恼,不必要的烦恼。啊,这是 Linux 故事中的第 9000 集。 -那么,在今天结束之际,我们已经讨论了所有事情。从中我们学到:臣伏于 Xorg!天呐!真棒,现在我将淡入背景,而笑声会将你的欢乐带给寒冷的夜晚。再见! +那么,在今天结束之际,我们已经讨论了所有事情。从中我们学到:**臣伏于 Xorg!天呐!**真棒,现在我将淡入背景音乐,而笑声会将你的欢乐带给寒冷的夜晚。再见! 干杯。 @@ -65,13 +68,9 @@ Wayland(截图 1)空闲时的内存占用为 1.4GB, CPU 的平均负载约 我是 Igor Ljubuncic。现在大约 38 岁,已婚但还没有孩子。我现在在一个大胆创新的云科技公司做首席工程师。直到大约 2015 年初,我还在一个全世界最大的 IT 公司之一中做系统架构工程师,和一个工程计算团队开发新的基于 Linux 的解决方案,优化内核以及攻克 Linux 的问题。在那之前,我是一个为高性能计算环境设计创新解决方案的团队的技术领导。还有一些其他花哨的头衔,包括系统专家、系统程序员等等。所有这些都曾是我的爱好,但从 2008 年开始成为了我的有偿的工作。还有什么比这更令人满意的呢? -从 2004 年到 2008 年间,我曾通过作为医学影像行业的物理学家来糊口。我的工作专长集中在解决问题和算法开发。为此,我广泛地使用了Matlab,主要用于信号和图像处理。另外,我得到了几个主要的工程方法学的认证,包括 MEDIC 六西格玛绿带、试验设计以及统计工程学。 +从 2004 年到 2008 年间,我曾通过作为医学影像行业的物理学家来糊口。我的工作专长集中在解决问题和算法开发。为此,我广泛地使用了 Matlab,主要用于信号和图像处理。另外,我得到了几个主要的工程方法学的认证,包括 MEDIC 六西格玛绿带、试验设计以及统计工程学。 -我也写过书,包括《Linux 上的高幻想和技术工作》和《相互包容》。 - -请参阅我的完整开源项目,出版物和专利列表,只需向下滚动。 - -有关我的奖项、提名和 IT 相关认证的完整列表,请进行跳转。 +我也写过书,包括高度魔幻类和 Linux 上的技术工作方面的,彼此交织。 ------------- @@ -81,7 +80,7 @@ via: http://www.dedoimedo.com/computers/fedora-25-wayland-vs-xorg.html 作者:[Igor Ljubuncic][a] 译者:[cycoe](https://github.com/cycoe) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 12922a7b8f09777c9cdee5b3eca17bd31e6b6aef Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 5 May 2017 12:45:13 +0800 Subject: [PATCH 0008/1407] PUB:20170210 Fedora 25 Wayland vs Xorg.md @cycoe --- .../tech => published}/20170210 Fedora 25 Wayland vs Xorg.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170210 Fedora 25 Wayland vs Xorg.md (100%) diff --git a/translated/tech/20170210 Fedora 25 Wayland vs Xorg.md b/published/20170210 Fedora 25 Wayland vs Xorg.md similarity index 100% rename from translated/tech/20170210 Fedora 25 Wayland vs Xorg.md rename to published/20170210 Fedora 25 Wayland vs Xorg.md From 5c44f3ebea77168b9d71f965745ecc8efef76d32 Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 5 May 2017 23:25:57 +0800 Subject: [PATCH 0009/1407] PRF:20150316 Linux on UEFI A Quick Installation Guide.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @fuowang 翻译的很细致,辛苦了! --- ...inux on UEFI A Quick Installation Guide.md | 168 ++++++++---------- 1 file changed, 74 insertions(+), 94 deletions(-) diff --git a/translated/tech/20150316 Linux on UEFI A Quick Installation Guide.md b/translated/tech/20150316 Linux on UEFI A Quick Installation Guide.md index 6ec82d8308..44edcc5b25 100644 --- a/translated/tech/20150316 Linux on UEFI A Quick Installation Guide.md +++ b/translated/tech/20150316 Linux on UEFI A Quick Installation Guide.md @@ -1,142 +1,122 @@ -在 UEFI 模式下安装 Linux:快速安装指南 +详解 UEFI 模式下安装 Linux ============================================================ - -此页面是免费浏览的,没有烦人的外部广告;然而,我的确花了时间准备,网站托管也花了钱。如果您发现此页面帮到了您,请考虑进行小额捐款,以帮助保持网站的运行。谢谢! +> 此页面是免费浏览的,没有烦人的外部广告;然而,我的确花了时间准备,网站托管也花了钱。如果您发现此页面帮到了您,请考虑进行小额[捐款](http://www.rodsbooks.com/linux-uefi/),以帮助保持网站的运行。谢谢! +> 原著于 2013/10/19;最后修改于 2015/3/16 ### 引言 -几年来,一种新的固件技术一直潜伏在大多数普通用户中。该技术被称为 [可扩展固件接口(EFI)][29](译者注:Extensible Firmware Interface), 或更新的统一可扩展固件接口(UEFI, 本质上是 EFI 2. _x_ )(译者注:Unified EFI),它已经开始替代古老的[基本输入/输出系统(BIOS)][30](译者注:Basic Input/Output System)固件技术,有经验的计算机用户或多或少都有些熟悉。 +几年来,一种新的固件技术悄然出现,而大多数普通用户对此并无所知。该技术被称为 [ 可扩展固件接口Extensible Firmware Interface][29](EFI), 或更新一些的统一可扩展固件接口(Unified EFI,UEFI,本质上是 EFI 2.x),它已经开始替代古老的[基本输入/输出系统Basic Input/Output System][30](BIOS)固件技术,有经验的计算机用户或多或少都有些熟悉 BIOS。 -本页面面向 Linux 用户,是使用 EFI 技术的一个快速介绍,其中包括有关开始将 Linux 安装到此类计算机上的建议。不幸的是,EFI 是一个密集的话题;EFI 软件本身是复杂的,许多实现有系统特定的怪异甚至是缺陷。因此,我无法在一个页面上描述在 EFI 计算机上安装和使用 Linux 的一切。我希望你能将本页面作为一个有用的起点,尽管如此,每个部分以及末尾[参考文献][31]部分的链接都会指向其他文档。 - -#### 目录 - -* [引言][18] -* [你的计算机是否使用 EFI 技术?][19] -* [你的发行版是否支持 EFI 技术?][20] -* [准备安装 Linux][21] -* [安装 Linux][22] -* [修复安装后的问题][23] -* [哎呀:将传统模式下安装的引导转为 EFI 模式下的引导][24] -* [参考文献][25] +本页面是给 Linux 用户使用 EFI 技术的一个快速介绍,其中包括有关开始将 Linux 安装到此类计算机上的建议。不幸的是,EFI 是一个庞杂的话题;EFI 软件本身是复杂的,许多实现有系统特定的怪异行为甚至是缺陷。因此,我无法在一个页面上描述在 EFI 计算机上安装和使用 Linux 的一切知识。我希望你能将本页面作为一个有用的起点,不管怎么说,每个部分以及末尾[参考文献][31]部分的链接可以指引你找到更多的文档。 ### 你的计算机是否使用 EFI 技术? -EFI 是一种_固件_,意味着它是内置于计算机中处理低级任务的软件。最重要的是,固件控制着计算机的引导过程,反过来说就是基于 EFI 的计算机与基于 BIOS 的计算机的引导过程不同。(有关此规律的例外之处稍后再说。)这种差异可能使操作系统安装介质的设计超级复杂化,但是一旦安装运行,它对计算机的日常操作几乎没有影响。请注意,大多数制造商使用术语 “BIOS” 来表示他们的 EFI。我认为这种用法很混乱,所以我避免了;在我看来,EFI 和 BIOS 是两种不同类型的固件。 +EFI 是一种_固件_,意味着它是内置于计算机中处理低级任务的软件。最重要的是,固件控制着计算机的引导过程,反过来说这代表着基于 EFI 的计算机与基于 BIOS 的计算机的引导过程不同。(有关此规律的例外之处稍后再说。)这种差异可能使操作系统安装介质的设计超级复杂化,但是一旦安装好并运行之后,它对计算机的日常操作几乎没有影响。请注意,大多数制造商使用术语 “BIOS” 来表示他们的 EFI。我认为这种用法很混乱,所以我避免了;在我看来,EFI 和 BIOS 是两种不同类型的固件。 -**注意:**苹果公司的 Mac 使用的 EFI 在许多方面是不寻常的。尽管本页面的大部分内容同样适用于 Mac,但有些细节上的出入,特别是在设置 EFI 引导加载程序的时候。这个任务最好在 OS X 上进行,使用 Mac 的 [bless utility][49]工具,我不在此做过多描述。 +> **注意:**苹果公司的 Mac 使用的 EFI 在许多方面是不同寻常的。尽管本页面的大部分内容同样适用于 Mac,但有些细节上的出入,特别是在设置 EFI 引导加载程序的时候。这个任务最好在 OS X 上进行,使用 Mac 的 [bless utility][49]工具,我不在此做过多描述。 -自从2006年第一次推出以来,EFI 已被用于基于英特尔的 Mac 上。从2012年底开始,大多数安装 Windows 8 或更高版本系统的计算机就已经默认使用 UEFI 启动,实际上大多数 PC 从 2011 年中期就开始使用 UEFI,尽管默认情况下它们可能无法以 EFI 模式启动。尽管2011年前销出的 PC 大都默认使用 BIOS 模式启动,但也有一些支持 EFI。 +自从 2006 年第一次推出以来,EFI 已被用于基于英特尔的 Mac 上。从 2012 年底开始,大多数安装 Windows 8 或更高版本系统的计算机就已经默认使用 UEFI 启动,实际上大多数 PC 从 2011 年中期就开始使用 UEFI,虽然默认情况下它们可能无法以 EFI 模式启动。2011 年前销出的 PC 也有一些支持 EFI,尽管它们大都默认使用 BIOS 模式启动。 -如果你不确定你的计算机是否支持 EFI,则应查看固件设置实用程序,参考用户手册,以便了解 _EFI_、_UEFI_ 以及 _legacy booting_。(可以通过查找用户手册的 PDF 文件来快速了解。)如果你没有找到类似的参考,你的计算机可能使用老式的(“legacy”) BIOS 引导;但如果你找到了这些术语的参考,几乎可以肯定它使用了 EFI 技术。你还可以尝试_只_有 EFI 模式引导加载器的安装介质。使用 [rEFInd][50] 制作的 USB 闪存驱动器或 CD-R 镜像是用来测试不错的选择。 +如果你不确定你的计算机是否支持 EFI,则应查看固件设置实用程序和参考用户手册关于 _EFI_、_UEFI_ 以及 _legacy booting_ 的部分。(可以通过搜索用户手册的 PDF 文件来快速了解。)如果你没有找到类似的参考,你的计算机可能使用老式的(“legacy”) BIOS 引导;但如果你找到了这些术语的参考,几乎可以肯定它使用了 EFI 技术。你还可以尝试_只_有 EFI 模式的引导加载器的安装介质。使用 [rEFInd][50] 制作的 USB 闪存驱动器或 CD-R 镜像是用来测试不错的选择。 -在继续之前,你应当了解大多数 _x_ 86 和 _x_ 86-64 架构的计算机上的 EFI 都包含一个叫做_兼容支持模块(CSM)_(译者注:Compatibility Support Module)的组件,这使得 EFI 能够使用旧的 BIOS 风格的引导机制来引导操作系统。这会非常方便,因为它向后兼容;但是这样也导致一些意外情况的发生,因为计算机不论以 EFI 模式引导还是以 BIOS 模式(也称为 CSM 或 legacy)引导,在控制时没有标准的使用规范和用户界面。特别地,你的 Linux 安装介质非常容易意外的以 BIOS/CSM/legacy 模式启动,这会导致 Linux 以 BIOS/CSM/legacy 模式安装。如果 Linux 是唯一的操作系统,也可以正常工作,但是如果与在 EFI 模式下的 Windows 组成双启动的话,就会非常复杂。(反过来问题也可能发生。)以下部分将帮助你以正确模式引导安装程序。如果你在阅读这篇文章之前就已经以 BIOS 模式安装了 Linux,并且希望切换引导模式,请阅读后续章节,[哎呀:将传统模式下安装的引导转为 EFI 模式下的引导][51]。 +在继续之前,你应当了解大多数 x86 和 x86-64 架构的计算机上的 EFI 都包含一个叫做兼容支持模块Compatibility Support Module(CSM)的组件,这使得 EFI 能够使用旧的 BIOS 风格的引导机制来引导操作系统。这会非常方便,因为它向后兼容;但是这样也导致一些意外情况的发生,因为计算机不论以 EFI 模式引导还是以 BIOS (也称为 CSM 或 legacy)模式引导,在控制时没有标准的使用规范和用户界面。特别地,你的 Linux 安装介质非常容易意外的以 BIOS/CSM/legacy 模式启动,这会导致 Linux 以 BIOS/CSM/legacy 模式安装。如果 Linux 是唯一的操作系统,也可以正常工作,但是如果与在 EFI 模式下的 Windows 组成双启动的话,就会非常复杂。(反过来问题也可能发生。)以下部分将帮助你以正确模式引导安装程序。如果你在阅读这篇文章之前就已经以 BIOS 模式安装了 Linux,并且希望切换引导模式,请阅读后续章节,[哎呀:将传统模式下安装的引导转为 EFI 模式下的引导][51]。 -UEFI 的一个附加功能值得一提:_Secure Boot_(译者注:直译为安全启动)。此特性旨在最大限度的降低计算机受到 _boot kit_ 病毒感染的风险,这是一种感染计算机引导加载程序的恶意软件。Boot kits 很难检测和删除,阻止它们的运行刻不容缓。微软公司要求所有带有支持 Windows 8 标志的台式机和笔记本电脑启用 Secure Boot。这一配置使 Linux 的安装变得复杂,尽管有些发行版可以较好的处理这个问题。不要将 Secure Boot 和 EFI 或 UEFI 混淆;支持 EFI 的计算机不一定支持 Secure Boot,而且支持 EFI 的 _x_ 86-64 的计算机也可以禁用 Secure Boot。微软同意用户在 Windows 8 认证的 _x_ 86 和 _x_ 86-64 计算机上禁用 Secure Boot功能;然而对装有 Windows 8 的 ARM 计算机而言却相反,它们必须_不允许_禁用 Secure Boot。幸运的是,基于 ARM 的 Windows 8 计算机目前很少见。我建议避免使用它们。 +UEFI 的一个附加功能值得一提:安全启动Secure Boot。此特性旨在最大限度的降低计算机受到 _boot kit_ 病毒感染的风险,这是一种感染计算机引导加载程序的恶意软件。Boot kits 很难检测和删除,阻止它们的运行刻不容缓。微软公司要求所有带有支持 Windows 8 标志的台式机和笔记本电脑启用 安全启动。这一配置使 Linux 的安装变得复杂,尽管有些发行版可以较好的处理这个问题。不要将安全启动和 EFI 或 UEFI 混淆;支持 EFI 的计算机不一定支持 安全启动,而且支持 EFI 的 x86-64 的计算机也可以禁用 安全启动。微软同意用户在 Windows 8 认证的 x86 和 x86-64 计算机上禁用安全启动功能;然而对装有 Windows 8 的 ARM 计算机而言却相反,它们必须**不允许**用户禁用 安全启动。幸运的是,基于 ARM 的 Windows 8 计算机目前很少见。我建议避免使用它们。 ### 你的发行版是否支持 EFI 技术? -大多数 Linux 发行版多年来一直支持 EFI。然而,不同的发行版对 EFI 的支持程度不同。大多数主流发行版(Fedora,OpenSUSE,Ubuntu 等)都能很好的支持 EFI,包括对 Secure Boot 的支持。另外一些“自定义”的发行版,比如 Gentoo,对 EFI 的支持较弱,但他们的性质使其很容易添加 EFI 支持。事实上,可以向_任意_ Linux 发行版添加 EFI 支持:你需要安装它(即使在 BIOS 模式下),然后在计算机上安装 EFI 引导加载程序。有关如何执行此操作的信息,请参阅[哎呀:将传统模式下安装的引导转为 EFI 模式下的引导][52]部分。 +大多数 Linux 发行版已经支持 EFI 好多年了。然而,不同的发行版对 EFI 的支持程度不同。大多数主流发行版(Fedora,OpenSUSE,Ubuntu 等)都能很好的支持 EFI,包括对安全启动的支持。另外一些“自行打造”的发行版,比如 Gentoo,对 EFI 的支持较弱,但它们的性质使其很容易添加 EFI 支持。事实上,可以向_任意_ Linux 发行版添加 EFI 支持:你需要安装 Linux(即使在 BIOS 模式下),然后在计算机上安装 EFI 引导加载程序。有关如何执行此操作的信息,请参阅[哎呀:将传统模式下安装的引导转为 EFI 模式下的引导][52]部分。 -你应当查看发行版的功能列表,来确定它是否支持 EFI。你还应当注意你的发行版对 Secure Boot 的支持情况,特别是如果你打算和 Windows 8 组成双启动。请注意,即使正式支持 Secure Boot 的发行版也可能要求禁用此功能,因为 Linux 对 Secure Boot 的支持通常很差劲,或者导致意外情况的发生。 +你应当查看发行版的功能列表,来确定它是否支持 EFI。你还应当注意你的发行版对安全启动的支持情况,特别是如果你打算和 Windows 8 组成双启动。请注意,即使正式支持安全启动的发行版也可能要求禁用此功能,因为 Linux 对安全启动的支持通常很差劲,或者导致意外情况的发生。 ### 准备安装 Linux 下面几个准备步骤有助于在 EFI 计算机上 Linux 的安装,使其更加顺利: -1. **升级固件** — 有些 EFI 并不完整,但硬件制造商偶尔会发布其固件的更新。因此我建议你将固件升级到最新可用的版本。如果你从论坛的帖子知道自己计算机的 EFI 有问题,你应当在安装 Linux 之前更新它,因为如果安装 Linux 之后更新固件,会有些问题需要额外的操作才能解决。另一方面,升级固件是有一定风险的,所以如果制造商提供了 EFI 支持,最好的办法就是按他们提供的方式进行升级。 +#### 1、 升级固件 -2. **了解如何使用固件** - 通常你可以通过在引导之前按 Del 键或功能键进入固件设置实用程序。按下开机键后尽快查看相关的提示信息,或者尝试每个功能键。类似的,ESC 键或功能键通常进入固件内置的引导管理器,可以选择要进入的操作系统或外部设备。一些制造商不断让这些设置隐藏的更深。在某些情况下,如[此页面][32]所述,你可以在 Windows 8 内这样做。 +有些 EFI 是有问题的,不过硬件制造商偶尔会发布其固件的更新。因此我建议你将固件升级到最新可用的版本。如果你从论坛的帖子知道自己计算机的 EFI 有问题,你应当在安装 Linux 之前更新它,因为如果安装 Linux 之后更新固件,会有些问题需要额外的操作才能解决。另一方面,升级固件是有一定风险的,所以如果制造商提供了 EFI 支持,最好的办法就是按它们提供的方式进行升级。 -3. **调整以下固件设置:** +#### 2、 了解如何使用固件 - * **快速启动** — 此功能可以通过在硬件初始化时使用快捷方式来加快引导过程。这很好用,但会使 USB 设备不能初始化,导致计算机无法从 USB 闪存驱动器或类似的设备启动。因此禁用快速启动_可能_有一定的帮助,甚至是必须的;但是只有在 Linux 安装程序启动遇到问题时,你才能安全地将其停用。请注意,此功能有时可能会以其他名字出现。在某些情况下,你必须_启用_ USB 支持,而不是_禁用_快速启动功能。 +通常你可以通过在引导过程之初按 Del 键或功能键进入固件设置实用程序。按下开机键后尽快查看相关的提示信息,或者尝试每个功能键。类似的,ESC 键或功能键通常可以进入固件的内置引导管理器,可以选择要进入的操作系统或外部设备。一些制造商把这些设置隐藏的很深。在某些情况下,如[此页面][32]所述,你可以在 Windows 8 内做到这些。 - * **安全启动** — Fedora,OpenSUSE,Ubuntu 以及其他的发行版官方就支持 Secure Boot;但是如果在启动引导加载程序或内核时遇到问题,可能需要禁用此功能。不幸的是,没办法具体描述怎么禁用,因为不同计算机的设置方法也不同。请参阅[我的 Secure Boot 页面][1]获取更多关于此话题的信息。 +#### 3、调整以下固件设置 - **注意:** 一些教程说安装 Linux 时需要启用 BIOS/CSM/legacy 支持。通常情况下,这样做是错的。启用这些支持可以解决启动安装程序涉及的问题,但也会带来新的问题。以这种方式安装的教程通常通过引导修复来解决这些问题,但最好从一开始就做对。本页面提供了帮助你以 EFI 模式启动 Linux 安装程序的提示,从而避免以后的问题。 +* **快速启动** — 此功能可以通过在硬件初始化时使用快捷方式来加快引导过程。这很好用,但有时候会使 USB 设备不能初始化,导致计算机无法从 USB 闪存驱动器或类似的设备启动。因此禁用快速启动_可能_有一定的帮助,甚至是必须的;你可以让它保持激活,而只在 Linux 安装程序启动遇到问题时将其停用。请注意,此功能有时可能会以其它名字出现。在某些情况下,你必须_启用_ USB 支持,而不是_禁用_快速启动功能。 +* **安全启动** — Fedora,OpenSUSE,Ubuntu 以及其它的发行版官方就支持安全启动;但是如果在启动引导加载程序或内核时遇到问题,可能需要禁用此功能。不幸的是,没办法具体描述怎么禁用,因为不同计算机的设置方法也不同。请参阅[我的安全启动页面][1]获取更多关于此话题的信息。 - * **CSM/legacy 选项** — 如果你想以 EFI 模式安装,请_关闭_这些选项。一些教程推荐启用这些选项,有时这是必须的 —— 比如,有些附加视频卡需要在固件中启用 BIOS 模式。尽管如此,大多数情况下启用 CSM/legacy 支持只会无意中增加以 BIOS 模式启动 Linux 的风险,但你并_不想_这样。请注意,Secure Boot 和 CSM/legacy 选项有时会交织在一起,因此更改任一选项之后务必检查另一个。 + > **注意:** 一些教程说安装 Linux 时需要启用 BIOS/CSM/legacy 支持。通常情况下,这样做是错的。启用这些支持可以解决启动安装程序涉及的问题,但也会带来新的问题。以这种方式安装的教程通常可以通过“引导修复”来解决这些问题,但最好从一开始就做对。本页面提供了帮助你以 EFI 模式启动 Linux 安装程序的提示,从而避免以后的问题。 +* **CSM/legacy 选项** — 如果你想以 EFI 模式安装,请_关闭_这些选项。一些教程推荐启用这些选项,有时这是必须的 —— 比如,有些附加视频卡需要在固件中启用 BIOS 模式。尽管如此,大多数情况下启用 CSM/legacy 支持只会无意中增加以 BIOS 模式启动 Linux 的风险,但你并_不想_这样。请注意,安全启动和 CSM/legacy 选项有时会交织在一起,因此更改任一选项之后务必检查另一个。 -4. **禁用 Windows 的快速启动功能** — [这个页面][33]描述了如何禁用此功能,不禁用的话会导致文件系统损坏。请注意此功能与固件的快速启动不同。 +#### 4、 禁用 Windows 的快速启动功能 -5. **检查分区表** — 使用 [GPT fdisk][34],parted 或其他任意分区工具检查磁盘分区。理想情况下,你应该创建一个包含每个分区确切起点和终点(以扇区为单位)的硬拷贝。这会是很有用的参考,特别是在安装时进行手动分区的时候。如果已经安装了 Windows,确定可以识别你的 [EFI 系统分区(ESP)][35],它是一个 FAT 分区,设置了“启动标记”(parted 或 Gparted)或在 gdisk 中有名为 EF00 的类别码。 +[这个页面][33]描述了如何禁用此功能,不禁用的话会导致文件系统损坏。请注意此功能与固件的快速启动不同。 + +#### 5、 检查分区表 + +使用 [GPT fdisk][34]、parted 或其它任意分区工具检查磁盘分区。理想情况下,你应该创建一个包含每个分区确切起点和终点(以扇区为单位)的纸面记录。这会是很有用的参考,特别是在安装时进行手动分区的时候。如果已经安装了 Windows,确定可以识别你的 [EFI 系统分区(ESP)][35],它是一个 FAT 分区,设置了“启动标记”(在 parted 或 Gparted 中)或在 gdisk 中的类型码为 EF00。 ### 安装 Linux 大部分 Linux 发行版都提供了足够的安装说明;然而我注意到了在 EFI 模式安装中的几个常见的绊脚石: -* **确保使用正确位深的发行版** — EFI 启动加载器和 EFI 自身的位深相同。现代计算机通常是 64 位,尽管最初几代基于 Intel 的 Mac,一些现代的平板电脑和变形本,以及一些鲜为人知的电脑使用 32 位 EFI。虽然可以将 32 位 EFI 引导加载程序添加至 32 位发行版,但我还没有遇到过正式支持 32 位 EFI 的 Linux 发行版。(我的 [Managing EFI Boot Loaders for Linux][36] 工具一般包括引导加载程序,而且理解了这些原则你就可以修改 32 位发行版的安装程序,尽管这不是一个初学者该做的。)在 64 位 EFI 的计算机上安装 32 位发行版最让人头疼,而且我不在这里描述这一过程;在具有 64 位 EFI 的计算机上,你应当使用 64 位的发行版。 - -* **正确准备引导介质** — 将 .iso 镜像转移到 USB 闪存驱动器的第三方工具,比如 unetbootin,在创建正确的 EFI 模式引导项时经常失败。我建议按照发行版维护者的建议创建 USB 闪存驱动器。如果没有类似的建议,使用 Linux 的 dd 工具,通过执行 dd if=image.iso of=/dev/sdc 在识别为 /dev/sdc 的 USB 闪存驱动器上创建一个镜像。至于 Windows,有 [WinDD][37] 和 [dd for windows][38],但我从没测试过他们。请注意,使用不兼容 EFI 的工具创建安装介质是错误的,这会导致在 BIOS 模式下安装的巨大错误的发生,然后必须纠正它们,所以不要忽视这一点! - -* **备份 ESP 分区** — 如果计算机已经存在 Windows 或者其他的操作系统,我建议在安装 Linux 之前备份你的 ESP 分区。尽管 Linux _不应_ 损坏 ESP 分区已有的文件,但似乎这时不时发生。发生这种事情时备份会有很大用处。只需简单的文件级的备份(使用 cp,tar,或者 zip 类似的工具)就足够了。 - +* **确保使用正确位深的发行版** — EFI 启动加载器和 EFI 自身的位深相同。现代计算机通常是 64 位,尽管最初几代基于 Intel 的 Mac、一些现代的平板电脑和变形本、以及一些鲜为人知的电脑使用 32 位 EFI。虽然可以将 32 位 EFI 引导加载程序添加至 32 位发行版,但我还没有遇到过正式支持 32 位 EFI 的 Linux 发行版。(我的 《[在 Linux 上管理 EFI 引导加载程序][36]》 一文概述了引导加载程序,而且理解了这些原则你就可以修改 32 位发行版的安装程序,尽管这不是一个初学者该做的。)在 64 位 EFI 的计算机上安装 32 位发行版最让人头疼,我不准备在这里描述这一过程;在具有 64 位 EFI 的计算机上,你应当使用 64 位的发行版。 +* **正确准备引导介质** — 将 .iso 镜像传输到 USB 闪存驱动器的第三方工具,比如 unetbootin,在创建正确的 EFI 模式引导项时经常失败。我建议按照发行版维护者的建议来创建 USB 闪存驱动器。如果没有类似的建议,使用 Linux 的 dd 工具,通过执行 `dd if=image.iso of=/dev/sdc` 在识别为 `/dev/sdc` 的 USB 闪存驱动器上创建一个镜像。至于 Windows,有 [WinDD][37] 和 [dd for windows][38],但我从没测试过它们。请注意,使用不兼容 EFI 的工具创建安装介质是错误的,这会导致人们进入在 BIOS 模式下安装然后再纠正它们的误区,所以不要忽视这一点! +* **备份 ESP 分区** — 如果计算机已经存在 Windows 或者其它的操作系统,我建议在安装 Linux 之前备份你的 ESP 分区。尽管 Linux _不应该_ 损坏 ESP 分区已有的文件,但似乎这时不时发生。发生这种事情时备份会有很大用处。只需简单的文件级的备份(使用 cp,tar,或者 zip 类似的工具)就足够了。 * **以 EFI 模式启动** — 以 BIOS/CSM/legacy 模式引导 Linux 安装程序的意外非常容易发生,特别是当固件启用 CSM/legacy 选项时。下面一些提示可以帮助你避免此问题: + * 进入 Linux shell 环境执行 `ls /sys/firmware/efi` 验证当前是否处于 EFI 引导模式。如果你看到一系列文件和目录,表明你已经以 EFI 模式启动,而且可以忽略以下多余的提示;如果没有,表明你是以 BIOS 模式启动的,应当重新检查你的设置。 + * 使用固件内置的引导管理器(你应该已经知道在哪;请参阅[了解如何使用固件][26])使之以 EFI 模式启动。一般你会看到 CD-R 或 USB 闪存驱动器两个选项,其中一个选项包括 _EFI_ 或 _UEFI_ 字样的描述,另一个不包括。使用 EFI/UEFI 选项来启动介质。 + * 禁用安全启动 - 即使你使用的发行版官方支持安全启动,有时它们也不能生效。在这种情况下,计算机会静默的转到下一个引导加载程序,它可能是启动介质的 BIOS 模式的引导加载程序,导致你以 BIOS 模式启动。请参阅我的[安全启动的相关文章][27]以得到禁用安全启动的相关提示。 + * 如果 Linux 安装程序总是无法以 EFI 模式启动,试试用我的 [rEFInd 引导管理器][28] 制作的 USB 闪存驱动器或 CD-R。如果 rEFInd 启动成功,那它保证是以 EFI 模式运行的,而且在基于 UEFI 的 PC 上,它只显示 EFI 模式的引导项,因此若您启动到 Linux 安装程序,则应处于 EFI 模式。(但是在 Mac 上,除了 EFI 模式选项之外,rEFInd 还显示 BIOS 模式的引导项。) +* **准备 ESP 分区** — 除了 Mac,EFI 使用 ESP 分区来保存引导加载程序。如果你的计算机已经预装了 Windows,那么 ESP 分区就已存在,可以在 Linux 上直接使用。如果不是这样,那么我建议创建一个大小为 550 MB 的 ESP 分区。(如果你已有的 ESP 分区比这小,别担心,直接用就行。)在此分区上创建一个 FAT32 文件系统。如果你使用 Gparted 或者 parted 准备 ESP 分区,记得给它一个“启动标记”。如果你使用 GPT fdisk(gdisk,cgdisk 或 sgdisk)准备 ESP 分区,记得给它一个名为 EF00 的类型码。有些安装程序会创建一个较小的 ESP 分区,并且设置为 FAT16 文件系统。尽管这样能正常工作,但如果你之后需要重装 Windows,安装程序会无法识别 FAT16 文件系统的 ESP 分区,所以你需要将其备份后转为 FAT32 文件系统。 +* **使用 ESP 分区** — 不同发行版的安装程序以不同的方式辨识 ESP 分区。比如,Debian 和 Ubuntu 的某些版本把 ESP 分区称为“EFI boot partition”,而且不会明确显示它的挂载点(尽管它会在后台挂载);但是有些发行版,像 Arch 或 Gentoo,需要你去手动挂载。尽管将 ESP 分区挂载到 /boot 进行相应配置后可以正常工作,特别是当你想使用 gummiboot 或 ELILO(译者注:gummiboot 和 ELILO 都是 EFI 引导工具)时,但是在 Linux 中最标准的 ESP 分区挂载点是 /boot/efi。某些发行版的 /boot 不能用 FAT 分区。因此,当你设置 ESP 分区挂载点时,请将其设置为 /boot/efi。除非 ESP 分区没有,否则_不要_为其新建文件系统 — 如果已经安装 Windows 或其它操作系统,它们的引导文件都在 ESP 分区里,新建文件系统会销毁这些文件。 +* **设置引导程序的位置** — 某些发行版会询问将引导程序(GRUB)装到何处。如果 ESP 分区按上述内容正确标记,不必理会此问题,但有些发行版仍会询问。请尝试使用 ESP 分区。 +* **其它分区** — 除了 ESP 分区,不再需要其它的特殊分区;你可以设置 根(/)分区,swap 分区,/home 分区,或者其它分区,就像你在 BIOS 模式下安装时一样。请注意 EFI 模式下_不需要设置_[BIOS 启动分区][39],所以如果安装程序提示你需要它,意味着你可能意外的进入了 BIOS 模式。另一方面,如果你创建了 BIOS 启动分区,会更灵活,因为你可以安装 BIOS 模式下的 GRUB,然后以任意模式(EFI 模式 或 BIOS 模式)引导。 +* **解决无显示问题** — 2013 年,许多人在 EFI 模式下经常遇到(之后出现的频率逐渐降低)无显示的问题。有时可以在命令行下通过给内核添加 `nomodeset` 参数解决这一问题。在 GRUB 界面按 `e` 键会打开一个简易文本编辑器。大多数情况下你需要搜索有关此问题的更多信息,因为此问题更多是由特定硬件引起的。 -* 进入 Linux shell 环境执行 ls /sys/firmware/efi 验证当前是否处于 EFI 模式。如果你看到一个文件和目录的列表,表明你已经以 EFI 模式启动,而且可以忽略以下多余的提示;如果没有,表明你是以 BIOS 模式启动的,应当重新检查你的设置。 - -* 使用固件内置的引导管理器(你应该已经知道在哪;请参阅[了解如何使用固件][26])使之以 EFI 模式启动。一般你会看到 CD-R 或 USB 闪存驱动器两个选项,其中一个选项包括 _EFI_ 或 _UEFI_ 字样的描述,另一个不包括。使用 EFI/UEFI 选项来启动介质。 - -* 禁用安全启动 - 即使你使用的发行版官方支持 Secure Boot,有时他们不能生效。在这种情况下,计算机会静默的转到下一个启动项,它可能是启动介质的 BIOS 模式,导致你以 BIOS 模式启动。请参阅[我的 Secure Boot 页面][27]以得到禁用 Secure Boot 的相关提示。 - -* 如果 Linux 安装程序总是无法以 EFI 模式启动,试试用我的 [rEFInd boot manager][28] 制作的 USB 闪存驱动器或 CD-R。如果 rEFInd 启动成功,它保证是以 EFI 模式运行的,而且在基于 UEFI 的 PC 上,它只显示 EFI 模式的引导项,因此若您启动到 Linux 安装程序,则应处于 EFI 模式。(但是在 Mac 上,除了 EFI 模式选项之外,rEFInd 还显示 BIOS 模式的引导项。) - -* **准备 ESP 分区** — 除了 Mac,EFI 使用 ESP 分区来保存引导加载程序。如果你的计算机已经安装了 Windows,那么 ESP 分区就已存在,可以在 Linux 上直接使用。如果不是这样,那么我建议创建一个大小为 550 MB 的 ESP 分区。(如果你已有的 ESP 分区比这小,别担心,直接用就行。)在此分区上创建一个 FAT32 文件系统。如果你使用 Gparted 或者 parted 准备 ESP 分区,记得给它一个“启动标记”。如果你使用 GPT fdisk(gdisk,cgdisk 或 sgdisk)准备 ESP 分区,记得给它一个名为 EF00 的类别码。有些安装程序会创建一个较小的 ESP 分区,并且设置为 FAT16 文件系统。尽管这样能正常工作,但如果你之后需要重装 Windows,安装程序会无法识别 FAT16 文件系统的 ESP 分区,所以你需要将其备份后转为 FAT32 文件系统。 - -* **使用 ESP 分区** — 不同发行版的安装程序以不同的方式辨识 ESP 分区。比如,Debian 和 Ubuntu 的某些版本把 ESP 分区称为“EFI boot partition”,而且不会明确显示它的挂载点(尽管它会在后台挂载);但是有些发行版,像 Arch 或 Gentoo,需要你去手动挂载。尽管将 ESP 分区挂载到 /boot 进行相应配置后可以正常工作,特别是当你想使用 gummiboot 或 ELILO(译者注:gummiboot 和 ELILO 都是 EFI 引导工具)时,但是在 Linux 中最标准的 ESP 分区挂载点是 /boot/efi。某些发行版的 /boot 不能用 FAT 分区。因此,当你设置 ESP 分区挂载点时,请将其设置为 /boot/efi。除非 ESP 分区没有,否则_不要_为其新建文件系统 — 如果已经安装 Windows 或其他操作系统,它们的引导文件都在 ESP 分区里,新建文件系统会销毁这些文件。 - -* **设置引导程序的位置** — 某些发行版会询问将引导程序(GRUB)装到何处。如果 ESP 分区按上述内容被正确标记,不必理会此问题,但有些发行版仍会询问。请尝试使用 ESP 分区。 - -* **其他分区** — 除了 ESP 分区,不再需要其他的特殊分区;你可以设置 根(/)分区,swap 分区,/home 分区,或者其他你想在 BIOS 模式下安装时使用的分区。请注意 EFI 模式下_不需要设置_[BIOS 启动分区][39],所以如果安装程序提示你需要它,意味着你可能意外的进入了 BIOS 模式。另一方面,如果你创建了 BIOS 启动分区,会更灵活,因为你可以安装 BIOS 模式下的 GRUB,然后以任意模式(EFI模式 或 BIOS模式)引导。 - -* **解决无显示问题** — 2013 年,许多人在 EFI 模式下经常遇到(之后出现的频率逐渐降低)无显示的问题。有时可以在命令行下通过给内核添加 nomodeset 参数解决这一问题。在 GRUB 界面按 e 键会打开一个简易文本编辑器。大多数情况下你需要搜索有关此问题的更多信息,因为此问题更多是由特定硬件引起的。 - -在某些情况下,你可能不得不以 BIOS 模式安装 Linux。但你可以手动安装 EFI 引导程序让 Linux 以 EFI 模式启动。请参阅 [Managing EFI Boot Loaders for Linux][53] 页面获取更多有关它们以及如何安装的可用信息。 +在某些情况下,你可能不得不以 BIOS 模式安装 Linux。但你可以手动安装 EFI 引导程序让 Linux 以 EFI 模式启动。请参阅《 [在 Linux 上管理 EFI 引导加载程序][53]》 页面获取更多有关它们以及如何安装的可用信息。 ### 解决安装后的问题 -如果 Linux 无法在 EFI 模式下工作,但在 BIOS 模式下成功了,那么你可以完全放弃 EFI 模式。在只有 Linux 的计算机上这非常简单;安装 BIOS 引导程序即可(如果你是在 BIOS 模式下安装的,引导程序也应随之装好)。如果是和 EFI 下的 Windows 组成双系统,最简单的方法是安装我的[rEFInd boot manager][54]。在 Windows 上安装它,然后编辑 refind.conf 文件:取消注释 scanfor 一行,并确保拥有 hdbios 选项。这样 rEFInd 在引导时会重定向到 BIOS 模式的引导项。 +如果 Linux 无法在 EFI 模式下工作,但在 BIOS 模式下成功了,那么你可以完全放弃 EFI 模式。在只有 Linux 的计算机上这非常简单;安装 BIOS 引导程序即可(如果你是在 BIOS 模式下安装的,引导程序也应随之装好)。如果是和 EFI 下的 Windows 组成双系统,最简单的方法是安装我的 [rEFInd 引导管理器][54]。在 Windows 上安装它,然后编辑 `refind.conf` 文件:取消注释 `scanfor` 一行,并确保拥有 `hdbios` 选项。这样 rEFInd 在引导时会重定向到 BIOS 模式的引导项。 -如果重启后计算机直接进入了 Windows,很可能是 Linux 的引导程序或管理器安装不正确。(但是应当首先尝试禁用 Secure Boot;之前提到过,它经常引发各种问题。)下面是关于此问题的几种可能的解决方案: +如果重启后计算机直接进入了 Windows,很可能是 Linux 的引导程序或管理器安装不正确。(但是应当首先尝试禁用安全启动;之前提到过,它经常引发各种问题。)下面是关于此问题的几种可能的解决方案: -* **使用 efibootmgr** — 你可以以 _EFI 模式_引导一个 Linux 急救盘,使用 efibootmgr 实用工具尝试重写你的 Linux 引导程序,如[这里][40]所述。 +* **使用 efibootmgr** — 你可以以 _EFI 模式_引导一个 Linux 急救盘,使用 efibootmgr 实用工具尝试重新注册你的 Linux 引导程序,如[这里][40]所述。 +* **使用 Windows 上的 bcdedit** — 在 Windows 管理员命令提示符窗口中,输入 `bcdedit /set {bootmgr}path \EFI\fedora\grubx64.efi` 会用 ESP 分区的 `EFI/fedora/grubx64.efi` 文件作为默认的引导加载程序。根据需要更改此路径,指向你想设置的引导文件。如果你启用了安全启动,需要设置 `shim.efi`,`shimx64.efi` 或者 `PreLoader.efi`(不管有哪个)为引导而不是 `grubx64.efi`。 +* **安装 rEFInd** — 有时候 rEFInd 可以解决这个问题。我推荐使用 [CD-R 或者 USB 闪存驱动器][41]进行测试。如果 Linux 可以启动,就安装 Debian 软件包、RPM 程序,或者 .zip 文件包。(请注意,你需要在一个高亮的 Linux vmlinuz* 选项按两次 `F2` 或 `Insert` 修改启动选项。如果你的启动分区是单独的,这就更有必要了,因为这种情况下,rEFInd 无法找到根(/)分区,也就无法传递参数给内核。) +* **使用修复引导程序** — Ubuntu 的[引导修复实用工具][42]可以自动修复一些问题;然而,我建议只在 Ubuntu 和 密切相关的发行版上使用,比如 Mint。有时候,有必要通过高级选项备份并替换 Windows 的引导。 +* **劫持 Windows 引导程序** — 有些不完整的 EFI 引导只能引导 Windows,就是 ESP 分区上的 `EFI/Microsoft/Boot/bootmgfw.efi` 文件。因此,你可能需要将引导程序改名(我建议将其移动到上级目录 `EFI/Microsoft/bootmgfw.efi`),然后将首选引导程序复制到这里。(大多数发行版会在 EFI 的子目录放置 GRUB 的副本,例如 Ubuntu 的 EFI/ubuntu,Fedora 的 EFI/fedora。)请注意此方法是个丑陋的解决方法,有用户反映 Windows 会替换引导程序,所以这个办法不是 100% 有效。然而,这是在不完整的 EFI 上生效的唯一办法。在尝试之前,我建议你升级固件并重新注册自己的引导程序,Linux 上用 efibootmgr,Windows 上用 bcdedit。 -* **使用 Windows 上的 bcdedit** — 在 Windows 管理员命令提示符窗口中,输入 bcdedit /set {bootmgr}path \EFI\fedora\grubx64.efi 会用 ESP 分区的 EFI/fedora/grubx64.efi 文件作为默认的引导。根据需要更改此路径,指向你想设置的引导文件。如果你启用了 Secure Boot,需要设置 shim.efi,shimx64.efi 或者 PreLoader.efi(不管有哪个)为引导而不是 grubx64.efi。 +有关引导程序的其它类型的问题 - 如果 GRUB(或者你的发行版默认的其它引导程序或引导管理器)没有引导操作系统,你必须修复这个问题。因为 GRUB 2 引导 Windows 时非常挑剔,所以 Windows 经常启动失败。在某些情况下,安全启动会加剧这个问题。请参阅[我的关于 GRUB 2 的页面][55]获取一个引导 Windows 的 GRUB 2 示例。还会有很多原因导致 Linux 引导出现问题,类似于 BIOS 模式下的情况,所以我没有全部写出来。 -* **安装 rEFInd** — 有时候 rEFInd 可以解决这个问题。我推荐使用 [CD-R 或者 USB 闪存驱动器][41]进行测试。如果 Linux 可以启动,就安装 Debian 软件包,RPM 程序,或者 .zip 文件包。(请注意,你需要在一个高亮选项 Linux vmlinuz* 按两次 F2 或 Insert 修改启动项。如果你的启动分区是单独的,这就更有必要了,因为这种情况下,rEFInd 无法找到根(/)分区,也就无法传递参数给内核。) +尽管 GRUB 2 使用很普遍,但我对它的评价却不高 - 它很复杂,而且难以配置和使用。因此,如果你在使用 GRUB 的时候遇到了问题,我的第一反应就是用别的东西代替。[我的用于 Linux 的 EFI 引导程序页面][56]有其它的选择。其中包括我的 [rEFInd 引导管理器][57],它除了能够让许多发行版上的 GRUB 2 工作,也更容易安装和维护 - 但是它还不能完全代替 GRUB 2。 -* **修复引导** — Ubuntu 的[引导修复实用工具][42]可以自动修复一些问题;然而,我建议只在 Ubuntu 和 相关的发行版上使用,比如 Mint。有时候,有必要通过高级选项备份并替换 Windows 的引导。 +除此之外,EFI 引导的问题可能很奇怪,所以你需要去论坛发帖求助。尽量将问题描述完整。[Boot Info Script][58] 可帮助你提供有用的信息 - 运行此脚本,将生成的名为 RESULTS.txt 的文件粘贴到论坛的帖子上。一定要将文本粘贴到 `[code]` 和 `[/code]` 之间;不然会遭人埋怨。或者将 RESULTS.txt 文件上传到 pastebin 网站上,比如 [pastebin.com][59],然后将网站给你的 URL 地址发布到论坛。 -* **劫持 Windows 引导程序** — 有些不完整的 EFI 引导只能引导 Windows,就是 ESP 分区上的 EFI/Microsoft/Boot/bootmgfw.efi 文件。因此,你可能需要将引导程序改名(我建议将其移动到上级目录 EFI/Microsoft/bootmgfw.efi),然后将首选引导程序复制到这里。(大多数发行版会在 EFI 的子目录放置 GRUB 的副本,例如 Ubuntu 的 EFI/ubuntu,Fedora 的 EFI/fedora。)请注意此方法是不光彩的破解行为,有用户反映 Windows 会替换引导程序,所以这个办法不是 100% 有效。然而,这是在不完整的 EFI 上生效的唯一办法。在尝试之前,我建议你升级固件并重新注册自己的引导程序,Linux 上用 efibootmgr,Windows 上用 bcdedit。 - -有关引导程序的其他类型的问题 - 如果 GRUB(或者你的发行版默认的其他引导程序或引导管理器)没有引导操作系统,你必须修复这个问题。因为 GRUB 2 引导 Windows 时非常挑剔,所以 Windows 经常启动失败。在某些情况下,Secure Boot 会加剧这个问题。请参阅[我的 GRUB 2 页面][55]获取一个引导 Windows 的 GRUB 2 示例。还会有很多原因导致 Linux 引导出现问题,类似于 BIOS 模式下的情况,所以我没有全部写出来。 - -尽管 GRUB 2 使用很普遍,但我对它的评价却不高 - 它很复杂,而且难以配置和使用。因此,如果你在使用 GRUB 的时候遇到了问题,我的第一反应就是用别的东西代替。[我的 EFI 引导程序页面][56]有其他的选择。其中包括我的 [rEFInd boot manager][57],它除了能够让许多发行版上的 GRUB 2 工作,也更容易安装和维护 - 但是它还不能完全代替 GRUB 2。 - -除此之外,EFI 引导的问题可能很奇怪,所以你需要去论坛发帖求助。尽量将问题描述完整。[Boot Info Script][58] 可帮助你提供有用的信息 - 运行此脚本,将生成的名为 RESULTS.txt 的文件粘贴到论坛的帖子上。一定要将文本粘贴到 [code] 和 [/code] 之间;不然会遭人埋怨。或者将 RESULTS.txt 文件上传到 pastebin 网站上,比如 [pastebin.com][59],然后将网站给你的 URL 地址发布到论坛。 - -### 哎呀:将传统模式下安装的引导转为 EFI 模式下的引导 +### 哎呀:将传统模式下安装的系统转为 EFI 模式下引导 **警告:**这些指南主要用于基于 UEFI 的 PC。如果你的 Mac 已经安装了 BIOS 模式下的 Linux,但想以 EFI 模式启动 Linux,可以_在 OS X_ 中安装引导程序。rEFInd(或者旧式的 rEFIt)是 Mac 上的常用选择,但 GRUB 可以做的更多。 -论坛上有很多人看了错误的教程,在已经存在 EFI 模式的 Windows 的情况下,安装了 BIOS 引导的 Linux,这一问题在 2015 年初很普遍。这样配置效果很不好,因为大多数 EFI 很难在两种模式之间切换,而且 GRUB 也无法胜任这项工作。你可能会遇到不完整的 EFI 无法启动外部介质的情况,也可能遇到 EFI 模式下的显示问题,或者其他问题。 +论坛上有很多人看了错误的教程,在已经存在 EFI 模式的 Windows 的情况下,安装了 BIOS 引导的 Linux,这一问题在 2015 年初很普遍。这样配置效果很不好,因为大多数 EFI 很难在两种模式之间切换,而且 GRUB 也无法胜任这项工作。你可能会遇到不完善的 EFI 无法启动外部介质的情况,也可能遇到 EFI 模式下的显示问题,或者其它问题。 -如前所述,在[解决安装后的问题][60]部分,解决办法之一就是_在 Windows_ 上安装 rEFInd,将其配置为支持 BIOS 模式引导。然后可以通过 rEFInd 和 chainload 引导 BIOS 模式下的 GRUB。在 Linux 上遇到 EFI 特定的问题时,例如无法使用显卡,我建议你使用这个办法修复。如果你没有这样的 EFI 特定的问题,在 Windows 中安装 rEFInd 和合适的 EFI 文件系统驱动可以让 Linux 直接以 EFI 模式启动。这个解决方案很完美,它和我下面描述的内容等同。 +如前所述,在[解决安装后的问题][60]部分,解决办法之一就是_在 Windows_ 上安装 rEFInd,将其配置为支持 BIOS 模式引导。然后可以引导 rEFInd 并链式引导到你的 BIOS 模式的 GRUB。在 Linux 上遇到 EFI 特定的问题时,例如无法使用显卡,我建议你使用这个办法修复。如果你没有这样的 EFI 特定的问题,在 Windows 中安装 rEFInd 和合适的 EFI 文件系统驱动可以让 Linux 直接以 EFI 模式启动。这个解决方案很完美,它和我下面描述的内容等同。 -大多数情况下,最好将 Linux 配置为以 EFI 模式启动。有很多办法可以做到,但最好的是以 EFI 模式引导 Linux(或者,可以想到,Windows,或者一个 EFI shell)来注册首选引导管理器。实现这一目标的方法如下: - -1. 下载适用于 USB 闪存驱动器或 CD-R 的 [rEFInd boot manager][43]。 -2. 从下载的镜像文件准备安装介质。可以在计算机上准备,不管是 EFI 还是 BIOS 的计算机都可以(或者在其他平台上使用其他方法)。 -3. 如果你还没有这样做,[请禁用 Secure Boot][44]。因为 rEFInd CD-R 和 USB 镜像不支持 Secure Boot,所以这很必要,你可以以后重新启用它。 -4. 在目标计算机上启动 rEFInd。如前所述,你可能需要调整固件设置,并使用内置引导管理器选择要引导的介质。你选择的那一项需要包含 _UEFI_ 这样描述的字符串。 +大多数情况下,最好将 Linux 配置为以 EFI 模式启动。有很多办法可以做到,但最好的是使用 Linux 的 EFI 引导模式(或者,可以想到,Windows,或者一个 EFI shell)注册到你首选的引导管理器。实现这一目标的方法如下: +1. 下载适用于 USB 闪存驱动器或 CD-R 的 [rEFInd 引导管理器][43]。 +2. 从下载的镜像文件生成安装介质。可以在任何计算机上准备,不管是 EFI 还是 BIOS 的计算机都可以(或者在其它平台上使用其它方法)。 +3. 如果你还没有这样做,[请禁用安全启动][44]。因为 rEFInd CD-R 和 USB 镜像不支持安全启动,所以这很必要,你可以在以后重新启用它。 +4. 在目标计算机上启动 rEFInd。如前所述,你可能需要调整固件设置,并使用内置引导管理器选择要引导的介质。你选择的那一项也许在其描述中包含 _UEFI_ 这样的字符串。 5. 在 rEFInd 上测试引导项。你应该至少看到一个启动 Linux 内核的选项(名字含有 vmlinuz 这样的字符串)。有两种方法可以启动它: - * 如果你_没有_独立的 /boot 分区,只需简单的在高亮选项上按回车键。Linux 就会启动。 - * 如果你_确定有_一个独立的 /boot 分区,按两次 Insert 或 F2 键。这样会打开一个编辑器,你可以用它来编辑内核选项。按 root= 格式添加这些选项以标识根(/)文件系统,如果根(/)分区在 /dev/sda5 上,就添加 root=/dev/sda5。如果不知道根文件系统是什么,那你需要重启并尽可能想到办法。在一些罕见的情况下,你可能需要添加其他内核选项来代替 root= 选项。比如配置了 LVM(译者注:Logical Volume Manager,逻辑卷管理)的 Gentoo 就需要 dolvm 选项。 -6. Linux 一旦启动,安装你想要的引导程序。rEFInd 的安装很简单,可以通过 RPM,Debian 软件包,PPA,或从[rEFInd 下载页面][45]下载的二进制 .zip 文件进行安装。在 Ubuntu 和相关的发行版上,Boot Repair 可以相对简单地修复你的 GRUB 设置,但它会有质的飞跃,从而正常工作。(它通常工作良好,但有时候会把事情搞得一团糟。)另外一些选项都在我的 [Managing EFI Boot Loader for Linux][46] 页面上。 -7. 如果你想在 Secure Boot 激活的情况下引导,只需重启并启用它。但是,请注意,可能需要额外的安装步骤才能将引导程序设置为使用 Secure Boot。有关详细信息,请参阅[我的主题页面][47]或引导程序有关 Secure Boot 的文档资料。 + * 如果你_没有_独立的 `/boot` 分区,只需简单的选择内核并按回车键。Linux 就会启动。 + * 如果你_确定有_一个独立的 `/boot` 分区,按两次 `Insert` 或 `F2` 键。这样会打开一个行编辑器,你可以用它来编辑内核选项。增加一个 `root=` 格式以标识根(/)文件系统,如果根(/)分区在 `/dev/sda5` 上,就添加 `root=/dev/sda5`。如果不知道根文件系统在哪里,那你需要重启并尽可能想到办法。 + + 在一些罕见的情况下,你可能需要添加其它内核选项来代替或补充 `root=` 选项。比如配置了 LVM(LCTT 译注:Logical Volume Manager,逻辑卷管理)的 Gentoo 就需要 `dolvm` 选项。 +6. Linux 一旦启动,安装你想要的引导程序。rEFInd 的安装很简单,可以通过 RPM、Debian 软件包、PPA,或从[rEFInd 下载页面][45]下载的二进制 .zip 文件进行安装。在 Ubuntu 和相关的发行版上,引导修改程序可以相对简单地修复你的 GRUB 设置,但你要对它有信心可以正常工作。(它通常工作良好,但有时候会把事情搞得一团糟。)另外一些选项都在我的 《[在 Linux 上管理 EFI 引导加载程序][46]》 页面上。 +7. 如果你想在安全启动激活的情况下引导,只需重启并启用它。但是,请注意,可能需要额外的安装步骤才能将引导程序设置为使用安全启动。有关详细信息,请参阅[我关于这个主题的页面][47]或你的引导程序有关安全启动的文档资料。 重启时,你可以看到刚才安装的引导程序。如果计算机进入了 BIOS 模式下的 GRUB,你应当进入固件禁用 BIOS/CSM/legacy 支持,或调整引导顺序。如果计算机直接进入了 Windows,那么你应当阅读前一部分,[解决安装后的问题][61]。 @@ -144,33 +124,33 @@ UEFI 的一个附加功能值得一提:_Secure Boot_(译者注:直译为 ### 参考和附加信息 - * **信息网页** - * 我的 [Managing EFI Boot Loaders for Linux][2] 页面含有可用的 EFI 引导程序和引导管理器。 + * 我的 《[在 Linux 上管理 EFI 引导加载程序][2]》 页面含有可用的 EFI 引导程序和引导管理器。 * [OS X's bless tool 的手册页][3] 页面在设置 OS X 平台上的引导程序或引导管理器时可能会很有用。 - * [EFI 启动过程][4] 描述了 EFI 是启动时的大致框架。 + * [EFI 启动过程][4] 描述了 EFI 启动时的大致框架。 * [Arch Linux UEFI wiki page][5] 有大量关于 UEFI 和 Linux 的详细信息。 - * 亚当·威廉姆森写的 [什么是 EFI,它是怎么工作的][6]。 - * [这个页面][7] 描述了如何从 Windows 8 调整 EFI 的固件设置。describes how to adjust EFI firmware settings from within Windows 8. - * 马修·J·加勒特是 Shim 引导程序的开发者,此程序支持 Secure Boot,他维护的[博客][8]经常更新有关 EFI 的问题。 - * 如果你对 EFI 软件的开发感兴趣,我的 [Programming for EFI][9] 页面可以为你起步助力。 + * 亚当·威廉姆森写的一篇不错的 《[什么是 EFI,它是怎么工作的][6]》。 + * [这个页面][7] 描述了如何从 Windows 8 调整 EFI 的固件设置。 + * 马修·J·加勒特是 Shim 引导程序的开发者,此程序支持安全启动,他维护的[博客][8]经常更新有关 EFI 的问题。 + * 如果你对 EFI 软件的开发感兴趣,我的 《[EFI 编程][9]》 页面可以为你起步助力。 * **附加程序** * [rEFInd 官网][10] * [gummiboot 官网][11] * [ELILO 官网][12] * [GRUB 官网][13] * [GPT fdisk 分区软件官网][14] - * Ubuntu 的 [Boot Repair 实用工具][15]可帮助解决一些引启动问题 + * Ubuntu 的 [引导修复实用工具][15]可帮助解决一些引启动问题 * **交流** * [Sourceforge 上的 rEFInd 交流论坛][16]是 rEFInd 用户互相交流或与我联系的一种方法。 * Pastebin 网站,比如 [http://pastebin.com][17], 是在 Web 论坛上与其他用户交换大量文本的一种便捷的方法。 + -------------------------------------------------------------------------------- via: http://www.rodsbooks.com/linux-uefi/ 作者:[Roderick W. Smith][a] 译者:[fuowang](https://github.com/fuowang) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From a8070e110a7093d29e0ebc41431fcebe55fe3bf8 Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 5 May 2017 23:26:45 +0800 Subject: [PATCH 0010/1407] PUB:20150316 Linux on UEFI A Quick Installation Guide.md @fuowang --- .../20150316 Linux on UEFI A Quick Installation Guide.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20150316 Linux on UEFI A Quick Installation Guide.md (100%) diff --git a/translated/tech/20150316 Linux on UEFI A Quick Installation Guide.md b/published/20150316 Linux on UEFI A Quick Installation Guide.md similarity index 100% rename from translated/tech/20150316 Linux on UEFI A Quick Installation Guide.md rename to published/20150316 Linux on UEFI A Quick Installation Guide.md From f043ee0c56e7e9727a866c7c2b4bdc8c9c41110f Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 6 May 2017 19:00:56 +0800 Subject: [PATCH 0011/1407] PRF:20161111 Can Linux containers save IoT from a security meltdown.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @firstadream 辛苦了,很抱歉这篇这么久才校对出来。 --- ...iners save IoT from a security meltdown.md | 158 +++++++++--------- 1 file changed, 78 insertions(+), 80 deletions(-) diff --git a/translated/tech/20161111 Can Linux containers save IoT from a security meltdown.md b/translated/tech/20161111 Can Linux containers save IoT from a security meltdown.md index e76f5a1882..52f75b2d78 100644 --- a/translated/tech/20161111 Can Linux containers save IoT from a security meltdown.md +++ b/translated/tech/20161111 Can Linux containers save IoT from a security meltdown.md @@ -1,130 +1,128 @@ +Linux 容器能否弥补 IoT 的安全短板? +======== -###[Linux容器能否弥补IoT的安全短板?][28] +![](http://hackerboards.com/files/internet_of_things_wikimedia1-thm.jpg) + +> 在这个最后的物联网系列文章中,Canonical 和 Resin.io 向以 Linux 容器技术作为解决方案向物联网安全性和互操作性发起挑战。 - ![](http://hackerboards.com/files/internet_of_things_wikimedia1-thm.jpg) -在这个最后的物联网系列文章中,Canonical和Resin.io向以Linux容器技术作为物联网安全性和互操作性的解决方案发起挑战。 +![](http://hackerboards.com/files/samsung_artik710-thm.jpg) - ![](http://hackerboards.com/files/samsung_artik710-thm.jpg) +*Artik 7* -**Artik 7** | +尽管受到日益增长的安全威胁,但对物联网(IoT)的炒作没有显示减弱的迹象。为了刷存在感,公司们正忙于重新规划它们的物联网方面的路线图。物联网大潮迅猛异常,比移动互联网革命渗透的更加深入和广泛。IoT 像黑洞一样,吞噬一切,包括智能手机,它通常是我们通向物联网世界的窗口,有时也作为我们的汇聚点或终端。 -尽管受到日益增长的安全威胁,物联网炒作没有显示减弱的迹象。为了刷存在感,公司正忙于重新安排物联网的路线图。物联网大潮迅猛异常,比移动互联网革命渗透地更加深入和广泛。IoT像黑洞一样,吞噬一切,包括智能手机,它通常是我们在物联网世界中的窗口,有时作为我们的集线器或传感器端点。 +新的针对物联网的处理器和嵌入式主板继续重塑其技术版图。自从 9 月份推出 [面向物联网的 Linux 和开源硬件][5] 系列文章之后,我们看到了面向物联网网关的 “Apollo Lake]” SoC 芯片 [Intel Atom E3900][6] 以及[三星 新的 Artik 模块][7],包括用于网关并由 Linux 驱动的 64 位 Artik 7 COM 及自带 RTOS 的 Cortex-M4 Artik。 ARM 为具有 ARMv8-M 和 TrustZone 安全性的 IoT 终端发布了 [Cortex-M23 和 Cortex-M33][8] 芯片。 -新的物联网处理器和嵌入式主板继续重塑技术版图。自从9月份推出[Linux和开源硬件IoT] [5]系列文章之后,我们看到了面向物联网网关的“Apollo Lake]”SoC [Intel Atom E3900] [6]以及[新三星Artik模块][7],包括用于网关并由Linux驱动的64位Artik 7 COM及自带RTOS的Cortex-M4 Artik。 ARM为具有ARMv8-M和TrustZone安全性的IoT终端发布了[Cortex-M23和Cortex-M33] [8]内核。 +讲道理,安全是这些产品的卖点。最近攻击 Dyn 服务并在一天内摧毁了美国大部分互联网的 Mirai 僵尸网络将基于 Linux 的物联网推到台前 - 当然这种方式似乎不太体面。就像 IoT 设备可以成为 DDoS 的帮凶一样,设备及其所有者同样可能直接遭受恶意攻击。 -安全是这些产品的卖点。最近攻击Dyn服务并在一天内摧毁了美国大部分互联网的未来僵尸网络将基于Linux的物联网推到台前 - 当然这种方式似乎不太体面。通过DDoS攻击可以黑掉物联网设备,其设备所有者同样可能直接遭受恶意攻击。 +![](http://hackerboards.com/files/arm_cortexm33m23-thm.jpg) - ![](http://hackerboards.com/files/arm_cortexm33m23-thm.jpg) +*Cortex-M33 和 -M23* -**Cortex-M33 和 -M23** +Dyn 攻击更加证明了这种观点,即物联网将更加蓬勃地在受控制和受保护的工业环境发展,而不是家用环境中。这不是因为没有消费级[物联网安全技术][9],但除非产品设计之初就以安全为目标,否则如我们的[智能家居集线器系列][10]中的许多解决方案一样,后期再考虑安全就会增加成本和复杂性。 -Dyn攻击让我们更加笃定,物联网将更加自信地在受控制和受保护的工业环境而不是家用环境中向前发展。这不是因为消费者[物联网安全技术] [9]不可用,但除非产品设计之初就以安全为目标,否则如我们的[智能家居集线器系列] [10]中的许多解决方案,后期再考虑安全就会增加成本和复杂性。 +在物联网系列的最后这个未来展望的部分,我们将探讨两种基于 Linux 的面向 Docker 的容器技术,这些技术被提出作为物联网安全解决方案。容器还可以帮助解决我们在[物联网框架][11]中探讨的开发复杂性和互操作性障碍的问题。 -在物联网系列的最后一个未来展望的部分,我们将探讨两种基于Linux的面向Docker的容器技术,这些技术被提出作为物联网安全解决方案。容器还可以帮助解决在[物联网框架] [11]中探讨的开发复杂性和互操作性障碍的问题。 +我们与 Canonical 的 Ubuntu 客户平台工程副总裁 Oliver Ries 讨论了 Ubuntu Core 和适用于 Docker 的容器式 Snaps 包管理技术。我们还就新的基于 Docker 的物联网方案 ResinOS 采访了 Resin.io 首席执行官和联合创始人 Alexandros Marinos。 -我们与Canonical的Ubuntu客户平台工程副总裁Oliver Ries讨论了Ubuntu Core和Docker友好的容器式Snaps包管理技术。我们还就新的基于Docker的物联网方案ResinO采访了Resin.io首席执行官和联合创始人Alexandros Marinos。 +### Ubuntu Core Snaps -**Ubuntu Core 与快照管理** +Canonical 面向物联网的 [Snappy Ubuntu Core][12] 版本的 Ubuntu 是围绕一个类似容器的快照包管理机制而构建的,并提供应用商店支持。 snaps 技术最近[自行发布了][13]用于其他 Linux 发行版的版本。去年 11 月 3 日,Canonical 发布了 [Ubuntu Core 16] [14],该版本改进了白标应用商店和更新控制服务。 -Canonical面向物联网的[Snappy Ubuntu Core] [12]版本的Ubuntu是围绕一个类似容器的快照包管理机制构建,并提供应用商店支持。 snap技术最近[自行发布] [13]用于其他Linux发行版。 11月3日,Canonical发布了[Ubuntu Core 16] [14],该版本改进了白标应用商店和更新控制服务。 + -
-[ - ![](http://hackerboards.com/files/canonical_ubuntucore16_diagram-sm.jpg) -][15] -**传统Ubuntu(左)架构 与 Ubuntu Core 16** -(点击图片放大) -
+![](http://hackerboards.com/files/canonical_ubuntucore16_diagram.jpg) -快照机制提供自动更新,并有助于阻止未经授权的更新。 使用事务系统管理,快照可确保更新按预期部署或根本不部署。 在Ubuntu Core中,使用AppArmor进一步加强了安全性,并且所有应用程序文件都只读且保存在隔离的孤岛中。 - ![](http://hackerboards.com/files/limesdr-thm.jpg) + +*传统 Ubuntu(左)架构 与 Ubuntu Core 16* + +快照机制提供自动更新,并有助于阻止未经授权的更新。 使用事务系统管理,快照可确保更新按预期部署或根本不部署。 在 Ubuntu Core 中,使用 AppArmor 进一步加强了安全性,并且所有应用程序文件都是只读的且保存在隔离的孤岛中。 -**LimeSDR** | +![](http://hackerboards.com/files/limesdr-thm.jpg) -Ubuntu Core是我们最近展开的[开源物联网操作系统调查] [16]的一部分,现在运行在Gumstix主板,Erle机器人无人机,Dell Edge网关,[Nextcloud Box] [17],LimeSDR,Mycroft家庭集线器 ,英特尔的Joule和符合Linaro的96Boards规范的SBC上。 Canonical公司还与Linaro物联网和嵌入式(LITE)部门集团[96Boards物联网版] [18]合作。最初,96Boards IE专注于Zephyr驱动的Cortex-M4板卡,如Seeed的[BLE Carbon] [19] 它将扩展到可以运行Ubuntu Core的网关板卡。 +*LimeSDR* -“Ubuntu Core和快照具有从边缘到网关到云的相关性,”Canonical的Ries说。 “能够在任何主要发行版(包括Ubuntu Server和Ubuntu for Cloud)上运行快照包,使我们能够提供一致的体验。 Snaps可以使用事务更新以故障安全方式升级,可用于安全性,错误修复或新功能的持续更新,这在物联网环境中非常重要。 +Ubuntu Core 是我们最近展开的[开源物联网操作系统调查][16]的一部分,现在运行于 Gumstix 主板、Erle 机器人无人机、Dell Edge 网关、[Nextcloud Box][17]、LimeSDR、Mycroft 家庭集线器、英特尔的 Joule 和符合 Linaro 的 96Boards 规范的 SBC(单板计算机) 上。 Canonical 公司还与 Linaro 物联网和嵌入式(LITE)部门集团在其 [96Boards 物联网版(IE)][18] 上达成合作。最初,96Boards IE 专注于 Zephyr 驱动的 Cortex-M4 板卡,如 Seeed 的 [BLE Carbon] [19],不过它将扩展到可以运行 Ubuntu Core 的网关板卡上。 - ![](http://hackerboards.com/files/nextcloud_box3-thm.jpg) +“Ubuntu Core 和 snaps 具有从边缘到网关到云的相关性,”Canonical 的 Ries 说。 “能够在任何主要发行版(包括 Ubuntu Server 和 Ubuntu for Cloud)上运行快照包,使我们能够提供一致的体验。 snaps 可以使用事务更新以免故障方式升级,可用于安全性更新、错误修复或新功能的持续更新,这在物联网环境中非常重要。” -**Nextcloud盒子** | +![](http://hackerboards.com/files/nextcloud_box3-thm.jpg) -安全性和可靠性是关注的重点,Ries说。 “Snaps可以完全独立于彼此和操作系统运行,使得两个应用程序可以安全地在单个网关上运行,”他说。 “Snaps是只读的和经过认证的,可以保证代码的完整性。 +*Nextcloud盒子* -Ries还采用了减少开发时间的技术。 “Snap软件包允许开发人员向支持它的任何平台提供相同的二进制包,从而降低开发和测试成本,减少部署时间和提高更新速度。 “使用snap包,开发人员完全控制开发生命周期,并可以立即更新。 Snap包提供所有必需的依赖项,因此开发人员可以选择定制他们使用的组件。 +安全性和可靠性是关注的重点,Ries 说。 “snaps 应用可以完全独立于彼此和操作系统而运行,使得两个应用程序可以安全地在单个网关上运行,”他说。 “snaps 是只读的和经过认证的,可以保证代码的完整性。 -**ResinOS: 为IoT而生的Docker** +Ries 还说这种技术减少开发时间。 “snap 软件包允许开发人员向支持它的任何平台提供相同的二进制包,从而降低开发和测试成本,减少部署时间和提高更新速度。 “使用 snap 软件包,开发人员完可以全控制开发生命周期,并可以立即更新。 snap 包提供了所有必需的依赖项,因此开发人员可以选择定制他们使用的组件。” -Resin.io公司,与其商用IoT框架同名,最近剥离了该框架的Yocto Linux [ResinOS 2.0] [20],ResinOS 2.0将作为一个独立的开源项目运营。 Ubuntu Core在snap包中运行Docker容器引擎,ResinOS在主机上运行Docker。 极致简约的ResinOS抽离了使用Yocto代码的复杂性,使开发人员能够快速部署Docker容器。 +### ResinOS: 为 IoT 而生的 Docker -
-[ - ![](http://hackerboards.com/files/resinio_resinos_arch-sm.jpg) -][21] -**ResinOS 2.0 架构** -(点击图片放大) -
+Resin.io 公司,与其商用的 IoT 框架同名,最近剥离了该框架的基于 Yocto Linux 的 [ResinOS 2.0][20],ResinOS 2.0 将作为一个独立的开源项目运营。 Ubuntu Core 在 snap 包中运行 Docker 容器引擎,ResinOS 在主机上运行 Docker。 极致简约的 ResinOS 抽离了使用 Yocto 代码的复杂性,使开发人员能够快速部署 Docker 容器。 -与基于Linux的CoreOS一样,ResinOS集成了系统控制服务和网络协议栈,可通过异构网络安全地部署更新的应用程序。 但是,它为在资源受限的设备(如ARM黑客板)上运行而设计,与之相反,CoreOS和其他基于Docker的操作系统(例如基于Red Hat的Project Atomic)目前仅能运行在x86上,并且更喜欢资源丰富的服务器平台。 ResinOS可以在20个Linux设备上运行,包括Raspberry Pi,BeagleBone和Odroid-C1等。 + -“我们认为Linux容器对嵌入式系统比对于云更重要,”Resin.io的Marinos说。 “在云中,容器代表了对之前进程的优化,但在嵌入式中,它们代表了姗姗来迟的通用虚拟化“ +![](http://hackerboards.com/files/resinio_resinos_arch.jpg) - ![](http://hackerboards.com/files/beaglebone-hand-thm.jpg) + +*ResinOS 2.0 架构* -**BeagleBone Black** | +与基于 Linux 的 CoreOS 一样,ResinOS 集成了 systemd 控制服务和网络协议栈,可通过异构网络安全地部署更新的应用程序。 但是,它是为在资源受限的设备(如 ARM 黑客板)上运行而设计的,与之相反,CoreOS 和其他基于 Docker 的操作系统(例如基于 Red Hat 的 Project Atomic)目前仅能运行在 x86 上,并且更喜欢资源丰富的服务器平台。 ResinOS 可以在 20 中 Linux 设备上运行,并不断增长,包括 Raspberry Pi,BeagleBone 和Odroid-C1 等。 -当应用于物联网时,完整的企业虚拟机有直接硬件访问的性能问题和限制,Marinos说。像OSGi和Android的Dalvik这样的移动虚拟机可以用于IoT,但是它们依赖Java并有其他限制。 +“我们认为 Linux 容器对嵌入式系统比对于云更重要,”Resin.io 的 Marinos 说。 “在云中,容器代表了对之前的进程的优化,但在嵌入式中,它们代表了姗姗来迟的通用虚拟化“ -对于企业开发人员来说,使用Docker似乎很自然,但是你如何说服嵌入式黑客转向全新的范式呢? “Marinos解释说,”ResinOS不是把云技术的实践经验照单全收,而是针对嵌入式进行了优化。”此外,他说,容器比典型的物联网技术更好地包容故障。 “如果有软件缺陷,主机操作系统可以继续正常工作,甚至保持连接。要恢复,您可以重新启动容器或推送更新。更新设备而不重新启动它的能力进一步消除了故障引发问题的机率。” +![](http://hackerboards.com/files/beaglebone-hand-thm.jpg) -根据Marinos,其他好处源自与云技术的一致性,例如拥有更广泛的开发人员。容器提供了“跨数据中心和边缘的统一范式,以及一种方便地将技术,工作流,基础设施,甚至应用程序转移到边缘(终端)的方式。 +*BeagleBone Black* -Marinos说,容器中的固有安全性优势正在被其他技术增强。 “随着Docker社区推动实现签名的图像和证据,这些自然转移并应用到ResinOS,”他说。 “当Linux内核被强化以提高容器安全性时,或者获得更好地管理容器所消耗的资源的能力时,会产生类似的好处。 +当应用于物联网时,完整的企业级虚拟机有直接访问硬件的限制的性能缺陷,Marinos 说。像 OSGi 和 Android 的Dalvik 这样的移动设备虚拟机可以用于 IoT,但是它们依赖 Java 并有其他限制。 -容器也适合开源IoT框架,Marinos说。 “Linux容器很容易与几乎各种协议,应用程序,语言和库结合使用,”Marinos说。 “Resin.io参加了AllSeen联盟,我们与使用IoTivity和Thread的伙伴合作。 +对于企业开发人员来说,使用 Docker 似乎很自然,但是你如何说服嵌入式黑客转向全新的范式呢? “Marinos 解释说,”ResinOS 不是把云技术的实践经验照单全收,而是针对嵌入式进行了优化。”此外,他说,容器比典型的物联网技术更好地包容故障。 “如果有软件缺陷,主机操作系统可以继续正常工作,甚至保持连接。要恢复,您可以重新启动容器或推送更新。更新设备而不重新启动它的能力进一步消除了故障引发问题的机率。” -**IoT的未来:智能网关与智能终端** +据 Marinos 所说,其他好处源自与云技术的一致性,例如拥有更广泛的开发人员。容器提供了“跨数据中心和边缘的统一范式,以及一种方便地将技术、工作流、基础设施,甚至应用程序转移到边缘(终端)的方式。” -Marinos和Canonical的Ries对未来物联网的几个发展趋势具有一致的看法。 首先,物联网的最初概念(其中基于MCU的端点直接与云进行通信以进行处理)正在迅速被雾化计算架构取代。 这需要更智能的网关,也需要比仅仅在ZigBee和WiFi之间聚合和转换数据更多的功能。 +Marinos 说,容器中的固有安全性优势正在被其他技术增强。 “随着 Docker 社区推动实现镜像签名和鉴证,这些自然会转移并应用到 ResinOS,”他说。 “当 Linux 内核被强化以提高容器安全性时,或者获得更好地管理容器所消耗的资源的能力时,会产生类似的好处。 -第二,网关和智能边缘设备越来越多地运行多个应用程序。 第三,许多这些设备将提供板载分析,这些在最新的[智能家居集线器] [22]上都有体现。 最后,富媒体将很快成为物联网组合的一部分。 +容器也适合开源 IoT 框架,Marinos 说。 “Linux 容器很容易与几乎各种协议、应用程序、语言和库结合使用,”Marinos 说。 “Resin.io 参加了 AllSeen 联盟,我们与使用 IoTivity 和 Thread的 伙伴一起合作。” -
-[ - ![](http://hackerboards.com/files/eurotech_reliagate2026-sm.jpg) -][23] [ - ![](http://hackerboards.com/files/advantech_ubc221-sm.jpg) -][24] -**最新设备网关: Eurotech’s [ReliaGate 20-26][1] 和 Advantech’s [UBC-221][2]** -(点击图片放大) -
+### IoT的未来:智能网关与智能终端 -“智能网关正在接管最初为云服务设计的许多处理和控制功能,”Marinos说。 “因此,我们看到对容器化的推动力在增加,可以在IoT设备中使用类似云工作流程来部署与功能和安全相关的优化。 去中心化是由移动数据紧缩,不断发展的法律框架和各种物理限制等因素驱动的。 +Marinos 和 Canonical 的 Ries 对未来物联网的几个发展趋势具有一致的看法。 首先,物联网的最初概念(其中基于 MCU 的端点直接与云进行通信以进行处理)正在迅速被雾化计算架构所取代。 这需要更智能的网关,也需要比仅仅在 ZigBee 和 WiFi 之间聚合和转换数据更多的功能。 -Ubuntu Core等平台正在使“可用于网关的软件爆炸式增长”,Canonical的Ries说。 “在单个设备上运行多个应用程序的能力吸引了众多单一功能设备的用户,以及现在可以产生持续的软件收入的设备所有者。 +其次,网关和智能边缘设备越来越多地运行多个应用程序。 第三,许多这些设备将提供板载分析,这些在最新的[智能家居集线器][22]上都有体现。 最后,富媒体将很快成为物联网组合的一部分。 -
-[ - ![](http://hackerboards.com/files/myomega_mynxg-sm.jpg) -][25] [ - ![](http://hackerboards.com/files/technexion_ls1021aiot_front-sm.jpg) -][26] -**两种IoT网关: [MyOmega MYNXG IC2 Controller (左) 和TechNexion’s ][3][LS1021A-IoT Gateway][4]** -(点击图片放大) -
-不仅是网关 - 终端也变得更聪明。 “阅读大量的物联网新闻报道,你得到的印象是所有终端都运行在微控制器上,”Marinos说。 “但是我们对大量的Linux终端,如数字标牌,无人机和工业机械等直接执行任务,而不是作为操作中介(数据转发)感到惊讶。我们称之为影子IoT。 + ![](http://hackerboards.com/files/eurotech_reliagate2026.jpg) + + +*最新设备网关: Eurotech 的 [ReliaGate 20-26][1]* -Canonical的Ries同意,对简约技术的专注使他们忽视了新兴物联网领域。 “轻量化的概念在一个发展速度与物联网一样快的行业中初现端倪,”Ries说。 “今天的高级消费硬件可以持续为终端供电数月。“ + ![](http://hackerboards.com/files/advantech_ubc221.jpg) -虽然大多数物联网设备将保持轻量和“无头”(一种配置方式,比如物联网设备缺少显示器,键盘等),它们装备有传感器如加速度计和温度传感器并通过低速率的数据流通信,但是许多较新的物联网应用已经使用富媒体。 “媒体输入/输出只是另一种类型的外设,”Marinos说。 “总是存在多个容器竞争有限资源的问题,但它与传感器或蓝牙竞争天线资源没有太大区别。” + +*最新设备网关: Advantech 的 [UBC-221][2]* -Ries看到了工业和家庭网关中“提高边缘智能”的趋势。 “我们看到人工智能,机器学习,计算机视觉和上下文意识的大幅上升,”Ries说。 “为什么要在云中运行面部检测软件,如果相同的软件可以在边缘设备运行而又没有网络延迟和带宽及计算成本?“ +“智能网关正在接管最初为云服务设计的许多处理和控制功能,”Marinos 说。 “因此,我们看到对容器化的推动力在增加,可以在 IoT 设备中使用类似云工作流程来部署与功能和安全相关的优化。去中心化是由移动数据紧缩、不断发展的法律框架和各种物理限制等因素驱动的。” -当我们在这个物联网系列的[开篇故事] [27]中探索时,我们发现存在与安全相关的物联网问题,例如隐私丧失和生活在监视文化中的权衡。还有一些问题如把个人决策交给可能由他人操控的AI裁定。这些不会被容器,快照或任何其他技术完全解决。 +Ubuntu Core 等平台正在使“可用于网关的软件爆炸式增长”,Canonical 的 Ries 说。 “在单个设备上运行多个应用程序的能力吸引了众多单一功能设备的用户,以及现在可以产生持续的软件收入的设备所有者。” -Perhaps we’d be happier if Alexa handled the details of our lives while we sweat the big stuff, and maybe there’s a way to balance privacy and utility. For now, we’re still exploring, and that’s all for the good. -如果Alexa可以处理生活琐碎,而我们专注在要事上,也许我们会更快乐。或许有一个方法来平衡隐私和效用,现在,我们仍在探索,如此甚好。 +![](http://hackerboards.com/files/myomega_mynxg-sm.jpg) + +*两种 IoT 网关: [MyOmega MYNXG IC2 Controller][3]* + +![](http://hackerboards.com/files/technexion_ls1021aiot_front-sm.jpg) + +*两种 IoT 网关: TechNexion 的 [LS1021A-IoT Gateway][4]* + +不仅是网关 - 终端也变得更聪明。 “阅读大量的物联网新闻报道,你得到的印象是所有终端都运行在微控制器上,”Marinos 说。 “但是我们对大量的 Linux 终端,如数字标牌,无人机和工业机械等直接执行任务,而不是作为操作中介(数据转发)感到惊讶。我们称之为影子 IoT。” + +Canonical 的 Ries 同意,对简约技术的专注使他们忽视了新兴物联网领域。 “轻量化的概念在一个发展速度与物联网一样快的行业中初现端倪,”Ries 说。 “今天的高级消费硬件可以持续为终端供电数月。” + +虽然大多数物联网设备将保持轻量和“无头”(一种配置方式,比如物联网设备缺少显示器,键盘等),它们装备有如加速度计和温度传感器这样的传感器并通过低速率的数据流通信,但是许多较新的物联网应用已经使用富媒体。 “媒体输入/输出只是另一种类型的外设,”Marinos 说。 “总是存在多个容器竞争有限资源的问题,但它与传感器或蓝牙竞争天线资源没有太大区别。” + +Ries 看到了工业和家庭网关中“提高边缘智能”的趋势。 “我们看到人工智能、机器学习、计算机视觉和上下文意识的大幅上升,”Ries 说。 “为什么要在云中运行面部检测软件,如果相同的软件可以在边缘设备运行而又没有网络延迟和带宽及计算成本呢?“ + +当我们在这个物联网系列的[开篇故事][27]中探索时,我们发现存在与安全相关的物联网问题,例如隐私丧失和生活在监视文化中的权衡。还有一些问题如把个人决策交给可能由他人操控的 AI 裁定。这些不会被容器,快照或任何其他技术完全解决。 + +如果 AWS Alexa 可以处理生活琐事,而我们专注在要事上,也许我们会更快乐。或许有一个方法来平衡隐私和效用,现在,我们仍在探索,如此甚好。 -------------------------------------------------------------------------------- @@ -132,7 +130,7 @@ via: http://hackerboards.com/can-linux-containers-save-iot-from-a-security-meltd 作者:[Eric Brown][a] 译者:[firstadream](https://github.com/firstadream) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From fea72a97f2240791e8e3bd1ca1648ec73ded3424 Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 6 May 2017 19:01:14 +0800 Subject: [PATCH 0012/1407] PUB:20161111 Can Linux containers save IoT from a security meltdown.md @firstadream --- ...1111 Can Linux containers save IoT from a security meltdown.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20161111 Can Linux containers save IoT from a security meltdown.md (100%) diff --git a/translated/tech/20161111 Can Linux containers save IoT from a security meltdown.md b/published/20161111 Can Linux containers save IoT from a security meltdown.md similarity index 100% rename from translated/tech/20161111 Can Linux containers save IoT from a security meltdown.md rename to published/20161111 Can Linux containers save IoT from a security meltdown.md From 00c64ca03b8d132bb6fb7c09b2b408f886fea745 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 7 May 2017 02:39:11 +0800 Subject: [PATCH 0013/1407] PRF:20160901 A Raspberry Pi Hadoop Cluster with Apache Spark on YARN - Big Data 101.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @sfantree 翻译时应该尽量忠实原文,并保留格式和链接。 --- ...ith Apache Spark on YARN - Big Data 101.md | 350 +++++++++++++----- 1 file changed, 263 insertions(+), 87 deletions(-) diff --git a/translated/tech/20160901 A Raspberry Pi Hadoop Cluster with Apache Spark on YARN - Big Data 101.md b/translated/tech/20160901 A Raspberry Pi Hadoop Cluster with Apache Spark on YARN - Big Data 101.md index 7041cbebcd..e125a15b2f 100644 --- a/translated/tech/20160901 A Raspberry Pi Hadoop Cluster with Apache Spark on YARN - Big Data 101.md +++ b/translated/tech/20160901 A Raspberry Pi Hadoop Cluster with Apache Spark on YARN - Big Data 101.md @@ -1,109 +1,214 @@ - -在树莓派上通过Apache Spark on YARN搭建Hadoop集群 +大数据初步:在树莓派上通过 Apache Spark on YARN 搭建 Hadoop 集群 === -有些时候我们想从DQYDJ网站的数据中分析点有用的东西出来,在过去,我们要用R语言提取固定宽度的数据,然后通过数学建模分析美国的最低收入补贴,当然也包括其他优秀的方法。 -今天我将向你展示对大数据的一点探索,不过有点变化,使用的是全世界最流行的微型电脑————树莓派,如果手头没有,那就看下一篇吧(可能是已经处理好的数据)对于其他用户,请继续阅读吧,今天我们要建立一个树莓派 Hadoop集群! +有些时候我们想从 DQYDJ 网站的数据中分析点有用的东西出来,在过去,我们要[用 R 语言提取固定宽度的数据](https://dqydj.com/how-to-import-fixed-width-data-into-a-spreadsheet-via-r-playing-with-ipums-cps-data/),然后通过数学建模来分析[美国的最低收入补贴](http://dqydj.com/negative-income-tax-cost-calculator-united-states/),当然也包括其他优秀的方法。 +今天我将向你展示对大数据的一点探索,不过有点变化,使用的是全世界最流行的微型电脑————[树莓派](https://www.raspberrypi.org/),如果手头没有,那就看下一篇吧(可能是已经处理好的数据),对于其他用户,请继续阅读吧,今天我们要建立一个树莓派 Hadoop集群! -为什么要建立一个Raspberry Pi的Hadoop集群? +### I. 为什么要建立一个树莓派的 Hadoop 集群? ![](https://dqydj.com/wp-content/uploads/2016/08/IMG_9132-245x300.png) ->由三个树莓派节点组成的Hadoop集群 -对DQYDJ这句谚语我们做了大量的数据处理工作,但这些还不能称得上是大数据。 +*由三个树莓派节点组成的 Hadoop 集群* + +我们对 DQYDJ 的数据做了[大量的处理工作](https://dqydj.com/finance-calculators-investment-calculators-and-visualizations/),但这些还不能称得上是大数据。 和许许多多有争议的话题一样,数据的大小之别被解释成这样一个笑话: -如果能被RAM所存储,那么它就不是大数据。 ————佚名 +> 如果能被内存所存储,那么它就不是大数据。 ————佚名 似乎这儿有两种解决问题的方法: -1.我们可以找到一个足够大的数据集合,任何家用电脑的内存都存不下。 -2.我们可以 +1. 我们可以找到一个足够大的数据集合,任何家用电脑的物理或虚拟内存都存不下。 +2. 我们可以买一些不用特别定制,我们现有数据就能淹没它的电脑: -上手树莓派2B +—— 上手树莓派 2B -这个由设计师和工程师制作出来的精致小玩意儿拥有1GB的RAM,扩展SD卡充当它的硬盘,此外,每一台的价格都低于50刀,这意味着你可以花不到250刀的价格搭建一个集群。 +这个由设计师和工程师制作出来的精致小玩意儿拥有 1GB 的内存, MicroSD 卡充当它的硬盘,此外,每一台的价格都低于 50 美元,这意味着你可以花不到 250 美元的价格搭建一个 Hadoop 集群。 或许天下没有比这更便宜的入场券来带你进入大数据的大门。 -### 制作一个树莓派集群 +### II. 制作一个树莓派集群 我最喜欢制作的原材料。 这里我将给出我原来为了制作树莓派集群购买原材料的链接,如果以后要在亚马逊购买的话你可先这些链接收藏起来,也是对本站的一点支持。(谢谢) -- 树莓派2B x3 -- 集群原理图 -- 4层亚克力支架 -- 6口USB转接器 -- 内存卡 -- MicroUSB数据线 -- 短网线 -- 双面胶 +- [树莓派 2B 3 块](http://amzn.to/2bEFTVh) +- [4 层亚克力支架](http://amzn.to/2bTo1br) +- [6 口 USB 转接器](http://amzn.to/2bEGO8g),我选了白色 RAVPower 50W 10A 6 口 USB 转接器 +- [MicroSD 卡](http://amzn.to/2cguV9I),这个五件套 32GB 卡非常棒 +- [短的 MicroUSB 数据线](http://amzn.to/2bX2mwm),用于给树莓派供电 +- [短网线](http://amzn.to/2bDACQJ) +- 双面胶,我有一些 3M 的,很好用 -开始制作 +#### 开始制作 -1.首先,装好三个树莓派,每一个用螺丝钉固定在亚克力面板上。(看下图) -2.接下来,安装以太网交换机,用双面胶贴在其中一个在亚克力面板上。 -3.用双面胶贴将USB转接器贴在一个在亚克力面板使之成为最顶层。 -4.接着就是一层一层都拼好——这里我选择将树莓派放在交换机和USB转接器的底下(可以看看完整安装好的两张截图) +1. 首先,装好三个树莓派,每一个用螺丝钉固定在亚克力面板上。(看下图) +2. 接下来,安装以太网交换机,用双面胶贴在其中一个在亚克力面板上。 +3. 用双面胶贴将 USB 转接器贴在一个在亚克力面板使之成为最顶层。 +4. 接着就是一层一层都拼好——这里我选择将树莓派放在交换机和USB转接器的底下(可以看看完整安装好的两张截图) -如果你需要电线的话我想出了一个好方法-如果你和我一样购买力USB线和网线,我可以将它们卷起来放在亚克力板子的每一层 +想办法把线路放在需要的地方——如果你和我一样购买力 USB 线和网线,我可以将它们卷起来放在亚克力板子的每一层 -现在不要急着上电,需要将系统烧录到SD卡上才能继续。 +现在不要急着上电,需要将系统烧录到 SD 卡上才能继续。 -烧录 +#### 烧录 Raspbian -按照这个教程将Raspbian烧录到三张SD卡上,我使用的是Win7下的[Win32DiskImager][2]。 +按照[这个教程](https://www.raspberrypi.org/downloads/raspbian/)将 Raspbian 烧录到三张 SD 卡上,我使用的是 Win7 下的 [Win32DiskImager][2]。 -将其中一张烧录好的SD卡插在你想作为主节点的树莓派上,连接USB线并启动它。 +将其中一张烧录好的 SD 卡插在你想作为主节点的树莓派上,连接 USB 线并启动它。 -启动主节点 +#### 启动主节点 -这里有一篇非常棒的教程,讲如何安装Hadoop 2.7.1,此处就不再熬述。 +这里有[一篇非常棒的“Because We Can Geek”的教程](http://www.becausewecangeek.com/building-a-raspberry-pi-hadoop-cluster-part-1/),讲如何安装 Hadoop 2.7.1,此处就不再熬述。 -在启动过程中有一些要注意的地方,我将和你一起设置直到最后一步,记住我现在使用的IP段为192.168.1.50 – 192.168.1.52,主节点是.50,从节点是.51和.52,你的网络可能会有所不同,如果你想设置静态IP的话可以在评论区看看或讨论。 +在启动过程中有一些要注意的地方,我将带着你一起设置直到最后一步,记住我现在使用的 IP 段为 192.168.1.50 – 192.168.1.52,主节点是 .50,从节点是 .51 和 .52,你的网络可能会有所不同,如果你想设置静态 IP 的话可以在评论区看看或讨论。 -一旦你完成了这些步骤,接下来要做的就是启用交换文件,Spark on YARN将分割出一块很接近内存空间的交换文件,当你内存快用完时便会使用这个交换分区。 +一旦你完成了这些步骤,接下来要做的就是启用交换文件,Spark on YARN 将分割出一块非常接近内存大小的交换文件,当你内存快用完时便会使用这个交换分区。 -(如果你以前没有做过有关交换分区的操作的话,可以看看这篇教程,记住交换分区不要太多,因为内存卡的性能扛不住) +(如果你以前没有做过有关交换分区的操作的话,可以看看[这篇教程](https://www.digitalocean.com/community/tutorials/how-to-add-swap-on-ubuntu-14-04),让 `swappiness` 保持较低水准,因为 MicroSD 卡的性能扛不住) -现在我准备介绍有关我和其他Geek关于启动设置一些微妙的区别 +现在我准备介绍有关我的和“Because We Can Geek”关于启动设置一些微妙的区别。 -对于初学者,确保你给你的树莓派起了一个名字——在/etc/hostname设置,我的主节点设置为‘RaspberryPiHadoopMaster’ ,从节点设置为 ‘RaspberryPiHadoopSlave#’ +对于初学者,确保你给你的树莓派起了一个正式的名字——在 `/etc/hostname` 设置,我的主节点设置为 ‘RaspberryPiHadoopMaster’ ,从节点设置为 ‘RaspberryPiHadoopSlave#’ -主节点的/etc/hosts配置如下: - -如果你想让 Hadoop, YARN, and Spark运行正常的话,你也需要修改这些配置文件。 - -hdfs-site.xml: +主节点的 `/etc/hosts` 配置如下: ``` -yarn-site.xml (Note the changes in memory!): +#/etc/hosts +127.0.0.1 localhost +::1 localhost ip6-localhost ip6-loopback +ff02::1 ip6-allnodes +ff02::2 ip6-allrouters -slaves: - -core-site.xml: +192.168.1.50 RaspberryPiHadoopMaster +192.168.1.51 RaspberryPiHadoopSlave1 +192.168.1.52 RaspberryPiHadoopSlave2 ``` -设置从节点: +如果你想让 Hadoop、YARN 和 Spark 运行正常的话,你也需要修改这些配置文件(不妨现在就编辑)。 -接下来按照Because We Can Geek上的教程,你需要对上面的文件作出小小的改动。主节点没有改变其中的yarn-site.xml,所以从节点中不必含有这个文件。 +这是 `hdfs-site.xml`: -III.在我们的树莓派集群中测试YARN! +``` + + + + + fs.default.name + hdfs://RaspberryPiHadoopMaster:54310 + + + hadoop.tmp.dir + /hdfs/tmp + + +``` + +这是 `yarn-site.xml` (注意内存方面的改变): + +``` + + + + + + yarn.nodemanager.aux-services + mapreduce_shuffle + + + yarn.nodemanager.resource.cpu-vcores + 4 + + + yarn.nodemanager.resource.memory-mb + 1024 + + + yarn.scheduler.minimum-allocation-mb + 128 + + + yarn.scheduler.maximum-allocation-mb + 1024 + + + yarn.scheduler.minimum-allocation-vcores + 1 + + + yarn.scheduler.maximum-allocation-vcores + 4 + + + yarn.nodemanager.vmem-check-enabled + false + Whether virtual memory limits will be enforced for containers + + + yarn.nodemanager.vmem-pmem-ratio + 4 + Ratio between virtual memory to physical memory when setting memory limits for containers + + +yarn.resourcemanager.resource-tracker.address +RaspberryPiHadoopMaster:8025 + + +yarn.resourcemanager.scheduler.address +RaspberryPiHadoopMaster:8030 + + +yarn.resourcemanager.address +RaspberryPiHadoopMaster:8040 + + +``` + +`slaves`: + +``` +RaspberryPiHadoopMaster +RaspberryPiHadoopSlave1 +RaspberryPiHadoopSlave2 +``` + +`core-site.xml`: + +``` + + + + + fs.default.name + hdfs://RaspberryPiHadoopMaster:54310 + + + hadoop.tmp.dir + /hdfs/tmp + + +``` + +#### 设置两个从节点: + +接下来[按照 “Because We Can Geek”上的教程](http://www.becausewecangeek.com/building-a-raspberry-pi-hadoop-cluster-part-2/),你需要对上面的文件作出小小的改动。 在 `yarn-site.xml` 中主节点没有改变,所以从节点中不必含有这个 `slaves` 文件。 + +### III. 在我们的树莓派集群中测试 YARN 如果所有设备都正常工作,在主节点上你应该执行如下命令: -> start-dfs.sh +``` +start-dfs.sh +start-yarn.sh +``` -> start-yarn.sh +当设备启动后,以 Hadoop 用户执行,如果你遵循教程,用户应该是 `hduser`。 -当设备启动后,遵循教程以Hadoop用户方式执行。 - -接下来执行`hdfs dfsadmin -report`查看三个节点是否都正确启动,确认你看到一行粗体文字‘Live datanodes (3)’: +接下来执行 `hdfs dfsadmin -report` 查看三个节点是否都正确启动,确认你看到一行粗体文字 ‘Live datanodes (3)’: +``` Configured Capacity: 93855559680 (87.41 GB) Raspberry Pi Hadoop Cluster picture Straight On Present Capacity: 65321992192 (60.84 GB) @@ -119,78 +224,149 @@ Live datanodes (3): Name: 192.168.1.51:50010 (RaspberryPiHadoopSlave1) Hostname: RaspberryPiHadoopSlave1 Decommission Status : Normal +``` -你现在可以做一些简单的诸如‘Hello, World!’的测试,或者直接进行下一步。 +你现在可以做一些简单的诸如 ‘Hello, World!’ 的测试,或者直接进行下一步。 -IV.安装SPARK ON YARN +### IV. 安装 SPARK ON YARN -YARN是另一种非常好用的资源调度器,已经集成在Hadoop安装包中。 +YARN 的意思是另一种非常好用的资源调度器(Yet Another Resource Negotiator),已经作为一个易用的资源管理器集成在 Hadoop 基础安装包中。 -Apache Spark 是 Hadoop 生态圈中的一款软件包,它是一个可执行的引擎。就像著名的预装软件MapReduce一样。在一般情况下,Spark得益于存储在基于磁盘的MapReduce。运行负载堪比10-100倍的MapReduce-安装完成后你可以试试Spark 和 MapReduce的有什么不同。 +[Apache Spark](https://spark.apache.org/) 是 Hadoop 生态圈中的另一款软件包,它是一个毁誉参半的执行引擎和[捆绑的 MapReduce](https://hadoop.apache.org/docs/r1.2.1/mapred_tutorial.html)。在一般情况下,相对于基于磁盘存储的 MapReduce,Spark 更适合基于内存的存储,某些运行任务能够得到 10-100 倍提升——安装完成集群后你可以试试 Spark 和 MapReduce 有什么不同。 -我个人对Spark还是留下非常深刻的印象,因为它提供了两种数据工程师和科学家都比较擅长的语言– Python 和 R。 +我个人对 Spark 还是留下非常深刻的印象,因为它提供了两种数据工程师和科学家都比较擅长的语言—— Python 和 R。 -安装Apache Spark非常简单,在你家目录下,wget这个地址,然后‘tar -xzf ’,最后把解压出来的文件移动至 /opt 并清除刚才下载的文件,以上这些就是安装步骤。 +安装 Apache Spark 非常简单,在你家目录下,`wget "为 Hadoop 2.7 构建的 Apache Spark”`([来自这个页面](https://spark.apache.org/downloads.html)),然后运行 `tar -xzf “tgz 文件”`,最后把解压出来的文件移动至 `/opt`,并清除刚才下载的文件,以上这些就是安装步骤。 -我又创建了只有两行的文件spark-env.sh,其中包含Spark的配置文件目录。 +我又创建了只有两行的文件 `spark-env.sh`,其中包含 Spark 的配置文件目录。 +``` SPARK_MASTER_IP=192.168.1.50 - SPARK_WORKER_MEMORY=512m +``` -(在YARN跑起来之前我不确定这些是否有必要。) +(在 YARN 跑起来之前我不确定这些是否有必要。) -V. 你好,世界! 为Apache Spark发现一个有趣的数据集! +### V. 你好,世界! 为 Apache Spark 寻找有趣的数据集! -在Hadoop进行对‘Hello, World!’的单词计数。 +在 Hadoop 世界里面的 ‘Hello, World!’ 就是做单词计数。 -我决定改进一下`hello world`的例子,这个例子在平常也用不上,也许统计一些关于我自己的大数据会更有用… +我决定让我们的作品做一些内省式……为什么不统计本站最常用的单词呢?也许统计一些关于本站的大数据会更有用。 -如果你有一个正在运行的`WordPress`博客,可以通过简单的两步来导出和 +如果你有一个正在运行的 WordPress 博客,可以通过简单的两步来导出和净化。 -我使用`Export to Text‘导出文章的内容到纯文本文件中,我使用一些压缩库编写了一个`Python`来压缩了`HTML文件`,现在你可以将一个更小的文件复制到pi搭建的HDFS集群。 +1. 我使用 [Export to Text](https://wordpress.org/support/plugin/export-to-text) 插件导出文章的内容到纯文本文件中 +2. 我使用一些[压缩库](https://pypi.python.org/pypi/bleach)编写了一个 Python 脚本来剔除 HTML -如果你没有进行上面的操作,还有一种方法将文件转移到pi上 +``` +import bleach ->hdfs dfs -copyFromLocal dqydj_stripped.txt /dqydj_stripped.txt +# Change this next line to your 'import' filename, whatever you would like to strip +# HTML tags from. +ascii_string = open('dqydj_with_tags.txt', 'r').read() -现在准备进行最后一步 - 向Apache Spark写入相同的代码。 -### VI: 点燃 Apache Spark +new_string = bleach.clean(ascii_string, tags=[], attributes={}, styles=[], strip=True) +new_string = new_string.encode('utf-8').strip() -我们的单词计数程序基于Cloudera进行修改,你可以在这里找到。我们要修改我们的自己的单词计数程序。 +# Change this next line to your 'export' filename +f = open('dqydj_stripped.txt', 'w') +f.write(new_string) +f.close() +``` -在主节点上安装‘stop-words’这个`python`第三方包,有趣的是我在DQYDJ上使用了23,295次the这个单词,你可能不想看到这些语法单词占据着单词计数的前列,另外,用下列代码替换所有有关dqydj的参考文件,注意你自己的数据库路径。 +现在我们有了一个更小的、适合复制到树莓派所搭建的 HDFS 集群上的文件。 -保存好wordCount.py确保上面的路径都是正确无误的。 +如果你不能树莓派主节点上完成上面的操作,找个办法将它传输上去(scp、 rsync 等等),然后用下列命令行复制到 HDFS 上。 -现在,通过运行在YARN上的Spark,你可以看到我在DQYDJ使用最多的单词是哪一个。 +``` +hdfs dfs -copyFromLocal dqydj_stripped.txt /dqydj_stripped.txt +``` ->/opt/spark-2.0.0-bin-hadoop2.7/bin/spark-submit –master yarn –executor-memory 512m –name wordcount –executor-cores 8 wordCount.py /dqydj_stripped.txt +现在准备进行最后一步 - 向 Apache Spark 写入一些代码。 -### 我在DQYDJ使用最多的单词 +### VI. 点亮 Apache Spark -可能入列的单词有哪一些呢?can, will, it’s, one, even, like, people, money, don’t, also“. +Cloudera 有个极棒的程序可以作为我们的超级单词计数程序的基础,[你可以在这里找到](https://www.cloudera.com/documentation/enterprise/5-6-x/topics/spark_develop_run.html)。我们接下来为我们的内省式单词计数程序修改它。 -嘿,不差钱–悄悄进入前十。在一个致力于金融、投资和经济的网站上谈论这似乎是件好事,对吧? +在主节点上[安装‘stop-words’](https://pypi.python.org/pypi/stop-words)这个 python 第三方包,虽然有趣(我在 DQYDJ 上使用了 23,295 次 the 这个单词),你可能不想看到这些语法单词占据着单词计数的前列,另外,在下列代码用你自己的数据集替换所有有关指向 dqydj 文件的地方。 -这是余下的50个最常用的词汇,请用他们得出有关我余下文章的结论。 +``` +import sys + +from stop_words import get_stop_words +from pyspark import SparkContext, SparkConf + +if __name__ == "__main__": + + # create Spark context with Spark configuration + conf = SparkConf().setAppName("Spark Count") + sc = SparkContext(conf=conf) + + # get threshold + try: + threshold = int(sys.argv[2]) + except: + threshold = 5 + + # read in text file and split each document into words + tokenized = sc.textFile(sys.argv[1]).flatMap(lambda line: line.split(" ")) + + # count the occurrence of each word + wordCounts = tokenized.map(lambda word: (word.lower().strip(), 1)).reduceByKey(lambda v1,v2:v1 +v2) + + # filter out words with fewer than threshold occurrences + filtered = wordCounts.filter(lambda pair:pair[1] >= threshold) + + print "*" * 80 + print "Printing top words used" + print "-" * 80 + filtered_sorted = sorted(filtered.collect(), key=lambda x: x[1], reverse = True) + for (word, count) in filtered_sorted: print "%s : %d" % (word.encode('utf-8').strip(), count) + + + # Remove stop words + print "\n\n" + print "*" * 80 + print "Printing top non-stop words used" + print "-" * 80 + # Change this to your language code (see the stop-words documentation) + stop_words = set(get_stop_words('en')) + no_stop_words = filter(lambda x: x[0] not in stop_words, filtered_sorted) + for (word, count) in no_stop_words: print "%s : %d" % (word.encode('utf-8').strip(), count) +``` + +保存好 wordCount.py,确保上面的路径都是正确无误的。 + +现在,准备念出咒语,让运行在 YARN 上的 Spark 跑起来,你可以看到我在 DQYDJ 使用最多的单词是哪一个。 + +``` +/opt/spark-2.0.0-bin-hadoop2.7/bin/spark-submit –master yarn –executor-memory 512m –name wordcount –executor-cores 8 wordCount.py /dqydj_stripped.txt +``` + +### VII. 我在 DQYDJ 使用最多的单词 + +可能入列的单词有哪一些呢?“can, will, it’s, one, even, like, people, money, don’t, also“. + +嘿,不错,“money”悄悄挤进了前十。在一个致力于金融、投资和经济的网站上谈论这似乎是件好事,对吧? + +下面是的前 50 个最常用的词汇,请用它们刻画出有关我的文章的水平的结论。 ![](https://dqydj.com/wp-content/uploads/2016/08/dqydj_pk_most_used_words.png) -我希望你能喜欢这篇关于Hadoop, YARN, 和 Apache Spark的教程,现在你可以在Spark运行其他的任务。 +我希望你能喜欢这篇关于 Hadoop、YARN 和 Apache Spark 的教程,现在你可以在 Spark 运行和编写其他的应用了。 -你的下一步是任务是开始读pyspark文档(库或其他语言)去学习一些可用的功能。根据你的兴趣和你实际存储的数据,你将会深入学习到有流数据包的SQL,甚至机器学习! +你的下一步是任务是开始[阅读 pyspark 文档](https://spark.apache.org/docs/2.0.0/api/python/index.html)(以及用于其他语言的该库),去学习一些可用的功能。根据你的兴趣和你实际存储的数据,你将会深入学习到更多——有流数据、SQL,甚至机器学习的软件包! -你要建立一个树莓派集群吗?看看你使用最频繁的单词是什么? +你怎么看?你要建立一个树莓派 Hadoop 集群吗?想要在其中挖掘一些什么吗?你在上面看到最令你惊奇的单词是什么?为什么 'S&P' 也能上榜? -------------------------------------------------------------------------------- -原文: https://dqydj.com/raspberry-pi-hadoop-cluster-apache-spark-yarn/?utm_source=dbweekly&utm_medium=email +via: https://dqydj.com/raspberry-pi-hadoop-cluster-apache-spark-yarn/ 作者:[PK][a] 译者:[popy32](https://github.com/sfantree) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出 From 5f42b33a8e1716ecf14aa033942d3d48777e67de Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 7 May 2017 02:39:32 +0800 Subject: [PATCH 0014/1407] PUB:20160901 A Raspberry Pi Hadoop Cluster with Apache Spark on YARN - Big Data 101.md @sfantree --- ... Pi Hadoop Cluster with Apache Spark on YARN - Big Data 101.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20160901 A Raspberry Pi Hadoop Cluster with Apache Spark on YARN - Big Data 101.md (100%) diff --git a/translated/tech/20160901 A Raspberry Pi Hadoop Cluster with Apache Spark on YARN - Big Data 101.md b/published/20160901 A Raspberry Pi Hadoop Cluster with Apache Spark on YARN - Big Data 101.md similarity index 100% rename from translated/tech/20160901 A Raspberry Pi Hadoop Cluster with Apache Spark on YARN - Big Data 101.md rename to published/20160901 A Raspberry Pi Hadoop Cluster with Apache Spark on YARN - Big Data 101.md From fff84405e84f915c5ee536eacfea2becade47126 Mon Sep 17 00:00:00 2001 From: Flynn Date: Sun, 7 May 2017 11:41:42 +0800 Subject: [PATCH 0015/1407] Translating by ucasFL --- ...Applying the Linus Torvalds Good Taste Coding Requirement.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md b/sources/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md index 61bd5ac57a..d4d62d7021 100644 --- a/sources/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md +++ b/sources/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md @@ -1,4 +1,4 @@ -Translating by cposture 20161228 +Translating by ucasFL # Applying the Linus Torvalds “Good Taste” Coding Requirement In [a recent interview with Linus Torvalds][1], the creator of Linux, at approximately 14:20 in the interview, he made a quick point about coding with “good taste”. Good taste? The interviewer prodded him for details and Linus came prepared with illustrations. From 8c9ce0762a0311fd0c1de994c2657687da985bdf Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 7 May 2017 21:05:07 +0800 Subject: [PATCH 0016/1407] PUB:20170307 Assign Read-Write Access to a User on Specific Directory in Linux.md @mr-ping @jasminepeng --- ...o a User on Specific Directory in Linux.md | 41 ++++++++----------- 1 file changed, 18 insertions(+), 23 deletions(-) rename {translated/tech => published}/20170307 Assign Read-Write Access to a User on Specific Directory in Linux.md (75%) diff --git a/translated/tech/20170307 Assign Read-Write Access to a User on Specific Directory in Linux.md b/published/20170307 Assign Read-Write Access to a User on Specific Directory in Linux.md similarity index 75% rename from translated/tech/20170307 Assign Read-Write Access to a User on Specific Directory in Linux.md rename to published/20170307 Assign Read-Write Access to a User on Specific Directory in Linux.md index ecde430a6f..ad7e80daa6 100644 --- a/translated/tech/20170307 Assign Read-Write Access to a User on Specific Directory in Linux.md +++ b/published/20170307 Assign Read-Write Access to a User on Specific Directory in Linux.md @@ -1,25 +1,20 @@ 在 Linux 上给用户赋予指定目录的读写权限 ============================================================ - 在上篇文章中我们向您展示了如何在 Linux 上[创建一个共享目录][3]。这次,我们会为您介绍如何将 Linux 上指定目录的读写权限赋予用户。 - 有两种方法可以实现这个目标:第一种是 [使用 ACL (访问控制列表)][4] ,第二种是[创建用户组来管理文件权限][5],下面会一一介绍。 - 为了完成这个教程,我们将使用以下设置。 -``` -Operating system: CentOS 7 -Test directory: /shares/project1/reports -Test user: tecmint -Filesystem type: Ext4 -``` +- 操作系统:CentOS 7 +- 测试目录:`/shares/project1/reports` +- 测试用户:tecmint +- 文件系统类型:ext4 请确认所有的命令都是使用 root 用户执行的,或者使用 [sudo 命令][6] 来享受与之同样的权限。 -让我们开始吧!下面,先使用 mkdir 命令来创建一个名为 `reports` 的目录。 +让我们开始吧!下面,先使用 `mkdir` 命令来创建一个名为 `reports` 的目录。 ``` # mkdir -p /shares/project1/reports @@ -27,16 +22,16 @@ Filesystem type: Ext4 ### 使用 ACL 来为用户赋予目录的读写权限 -重要提示:打算使用此方法的话,您需要确认您的 Linux 文件系统类型(如 Ext3 和 Ext4, NTFS, BTRFS)支持 ACL。 +重要提示:打算使用此方法的话,您需要确认您的 Linux 文件系统类型(如 ext3 和 ext4, NTFS, BTRFS)支持 ACL。 -1. 首先, 依照以下命令在您的系统中[检查当前文件系统类型][7],并且查看内核是否支持 ACL: +1、 首先, 依照以下命令在您的系统中[检查当前文件系统类型][7],并且查看内核是否支持 ACL: ``` # df -T | awk '{print $1,$2,$NF}' | grep "^/dev" # grep -i acl /boot/config* ``` -从下方的截屏可以看到,文件系统类型是 **Ext4**,并且从 **CONFIG_EXT4_FS_POSIX_ACL=y** 选项可以发现内核是支持 **POSIX ACLs** 的。 +从下方的截屏可以看到,文件系统类型是 `ext4`,并且从 `CONFIG_EXT4_FS_POSIX_ACL=y` 选项可以发现内核是支持 **POSIX ACLs** 的。 [ ![Check Filesystem Type and Kernel ACL Support](http://www.tecmint.com/wp-content/uploads/2017/03/Check-Filesystem-Type-and-Kernel-ACL-Support.png) @@ -44,7 +39,7 @@ Filesystem type: Ext4 *查看文件系统类型和内核的 ACL 支持。* -2. 接下来,查看文件系统(分区)挂载时是否使用了 ACL 选项。 +2、 接下来,查看文件系统(分区)挂载时是否使用了 ACL 选项。 ``` # tune2fs -l /dev/sda1 | grep acl @@ -55,14 +50,14 @@ Filesystem type: Ext4 *查看分区是否支持 ACL* -通过上边的输出可以发现,默认的挂载项目中已经对 **ACL** 进行了支持。如果发现结果不如所愿,你可以通过以下命令对指定分区(此例中使用 **/dev/sda3**)开启 ACL 的支持。 +通过上边的输出可以发现,默认的挂载项目中已经对 **ACL** 进行了支持。如果发现结果不如所愿,你可以通过以下命令对指定分区(此例中使用 `/dev/sda3`)开启 ACL 的支持。 ``` # mount -o remount,acl / # tune2fs -o acl /dev/sda3 ``` -3. 现在是时候指定目录 `reports` 的读写权限分配给名为 `tecmint` 的用户了,依照以下命令执行即可。 +3、 现在是时候指定目录 `reports` 的读写权限分配给名为 `tecmint` 的用户了,依照以下命令执行即可。 ``` # getfacl /shares/project1/reports # Check the default ACL settings for the directory @@ -75,9 +70,9 @@ Filesystem type: Ext4 *通过 ACL 对指定目录赋予读写权限* -在上方的截屏中,通过输出结果的第二行 **getfacl** 命令可以发现,用户 `tecmint` 已经成功的被赋予了 **/shares/project1/reports** 目录的读写权限。 +在上方的截屏中,通过输出结果的第二行 `getfacl` 命令可以发现,用户 `tecmint` 已经成功的被赋予了 `/shares/project1/reports` 目录的读写权限。 -如果想要获取ACL列表的更多信息。可以在下方查看我们的其他指南。 +如果想要获取 ACL 列表的更多信息。可以在下方查看我们的其他指南。 1.  [如何使用访问控制列表(ACL)为用户/组设置磁盘配额][1] 2.  [如何使用访问控制列表(ACL)挂载网络共享][2] @@ -86,7 +81,7 @@ Filesystem type: Ext4 ### 使用用户组来为用户赋予指定目录的读写权限 -1. 如果用户已经拥有了默认的用户组(通常组名与用户名相同),就可以简单的通过变更文件夹的所属用户组来完成。 +1、 如果用户已经拥有了默认的用户组(通常组名与用户名相同),就可以简单的通过变更文件夹的所属用户组来完成。 ``` # chgrp tecmint /shares/project1/reports @@ -98,20 +93,20 @@ Filesystem type: Ext4 # groupadd projects ``` -2. 接下来将用户 `tecmint` 添加到 `projects` 组中: +2、 接下来将用户 `tecmint` 添加到 `projects` 组中: ``` # usermod -aG projects tecmint # add user to projects # groups tecmint # check users groups ``` -3. 将目录的所属用户组变更为 projects: +3、 将目录的所属用户组变更为 projects: ``` # chgrp projects /shares/project1/reports ``` -4. 现在,给组成员设置读写权限。 +4、 现在,给组成员设置读写权限。 ``` # chmod -R 0760 /shares/projects/reports @@ -141,7 +136,7 @@ via: http://www.tecmint.com/give-read-write-access-to-directory-in-linux/ [a]:http://www.tecmint.com/author/aaronkili/ [1]:http://www.tecmint.com/set-access-control-lists-acls-and-disk-quotas-for-users-groups/ [2]:http://www.tecmint.com/rhcsa-exam-configure-acls-and-mount-nfs-samba-shares/ -[3]:http://www.tecmint.com/create-a-shared-directory-in-linux/ +[3]:https://linux.cn/article-8187-1.html [4]:http://www.tecmint.com/secure-files-using-acls-in-linux/ [5]:http://www.tecmint.com/manage-users-and-groups-in-linux/ [6]:http://www.tecmint.com/sudoers-configurations-for-setting-sudo-in-linux/ From 4e65ec632cb1400286ace29aa09a7185cfc4bb98 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 8 May 2017 08:30:43 +0800 Subject: [PATCH 0017/1407] PRF&PUB:20161125 How to Install Jenkins Automation Server with Apache on Ubuntu 16.04.md @ictlyh --- ...tion Server with Apache on Ubuntu 16.04.md | 116 +++++++++++------- 1 file changed, 72 insertions(+), 44 deletions(-) rename {translated/tech => published}/20161125 How to Install Jenkins Automation Server with Apache on Ubuntu 16.04.md (82%) diff --git a/translated/tech/20161125 How to Install Jenkins Automation Server with Apache on Ubuntu 16.04.md b/published/20161125 How to Install Jenkins Automation Server with Apache on Ubuntu 16.04.md similarity index 82% rename from translated/tech/20161125 How to Install Jenkins Automation Server with Apache on Ubuntu 16.04.md rename to published/20161125 How to Install Jenkins Automation Server with Apache on Ubuntu 16.04.md index 4e9cbe95a7..a98c08054c 100644 --- a/translated/tech/20161125 How to Install Jenkins Automation Server with Apache on Ubuntu 16.04.md +++ b/published/20161125 How to Install Jenkins Automation Server with Apache on Ubuntu 16.04.md @@ -1,8 +1,7 @@ 如何在 Ubuntu16.04 中用 Apache 部署 Jenkins 自动化服务器 ============================================================ - -Jenkins 是从 Hudson 项目衍生出来的自动化服务器。Jenkins 是一个基于服务器的应用程序,运行在 Java servlet 容器中,它支持包括 Git、SVN 以及 Mercurial 在内的多种 SCM(Source Control Management,源码控制工具)。Jenkins 提供了上百种插件帮助你的项目实现自动化。Jenkins 由 Kohsuke Kawaguchi 开发,在 2011 年使用 MIT 协议发布了第一个发行版,它是个免费软件。 +Jenkins 是从 Hudson 项目衍生出来的自动化服务器。Jenkins 是一个基于服务器的应用程序,运行在 Java servlet 容器中,它支持包括 Git、SVN 以及 Mercurial 在内的多种 SCM(Source Control Management,源码控制工具)。Jenkins 提供了上百种插件帮助你的项目实现自动化。Jenkins 由 Kohsuke Kawaguchi 开发,在 2011 年使用 MIT 协议发布了第一个发行版,它是个自由软件。 在这篇指南中,我会向你介绍如何在 Ubuntu 16.04 中安装最新版本的 Jenkins。我们会用自己的域名运行 Jenkins,在 apache web 服务器中安装和配置 Jenkins,而且支持反向代理。 @@ -17,22 +16,28 @@ Jenkins 基于 Java,因此我们需要在服务器上安装 Java OpenJDK 7。 默认情况下,Ubuntu 16.04 没有安装用于管理 PPA 仓库的 python-software-properties 软件包,因此我们首先需要安装这个软件。使用 apt 命令安装 python-software-properties。 -`apt-get install python-software-properties` +``` +apt-get install python-software-properties +``` 下一步,添加 Java PPA 仓库到服务器中。 -`add-apt-repository ppa:openjdk-r/ppa` +``` +add-apt-repository ppa:openjdk-r/ppa +``` -输入回车键 +用 apt 命令更新 Ubuntu 仓库并安装 Java OpenJDK。 -用 apt 命令更新 Ubuntu 仓库并安装 Java OpenJDK。` - -`apt-get update` -`apt-get install openjdk-7-jdk` +``` +apt-get update +apt-get install openjdk-7-jdk +``` 输入下面的命令验证安装: -`java -version` +``` +java -version +``` 你会看到安装到服务器上的 Java 版本。 @@ -46,21 +51,29 @@ Jenkins 给软件安装包提供了一个 Ubuntu 仓库,我们会从这个仓 用下面的命令添加 Jenkins 密钥和仓库到系统中。 -`wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add -` -`echo 'deb https://pkg.jenkins.io/debian-stable binary/' | tee -a /etc/apt/sources.list` +``` +wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add - +echo 'deb https://pkg.jenkins.io/debian-stable binary/' | tee -a /etc/apt/sources.list +``` 更新仓库并安装 Jenkins。 -`apt-get update` -`apt-get install jenkins` +``` +apt-get update +apt-get install jenkins +``` 安装完成后,用下面的命令启动 Jenkins。 -`systemctl start jenkins` +``` +systemctl start jenkins +``` -通过检查 Jenkins 默认使用的端口(端口 8080)验证 Jenkins 正在运行。我会像下面这样用 netstat 命令检测: +通过检查 Jenkins 默认使用的端口(端口 8080)验证 Jenkins 正在运行。我会像下面这样用 `netstat` 命令检测: -`netstat -plntu` +``` +netstat -plntu +``` Jenkins 已经安装好了并运行在 8080 端口。 @@ -70,23 +83,29 @@ Jenkins 已经安装好了并运行在 8080 端口。 ### 第三步 - 为 Jenkins 安装和配置 Apache 作为反向代理 -在这篇指南中,我们会在一个 apache web 服务器中运行 Jenkins,我们会为 Jenkins 配置 apache 作为反向代理。首先我会安装 apache 并启用一些需要的模块,然后我会为 Jenkins 用域名 my.jenkins.id 创建虚拟 host 文件。请在这里使用你自己的域名并在所有配置文件中出现的地方替换。 +在这篇指南中,我们会在一个 Apache web 服务器中运行 Jenkins,我们会为 Jenkins 配置 apache 作为反向代理。首先我会安装 apache 并启用一些需要的模块,然后我会为 Jenkins 用域名 my.jenkins.id 创建虚拟主机文件。请在这里使用你自己的域名并在所有配置文件中出现的地方替换。 从 Ubuntu 仓库安装 apache2 web 服务器。 -`apt-get install apache2` +``` +apt-get install apache2 +``` 安装完成后,启用 proxy 和 proxy_http 模块以便将 apache 配置为 Jenkins 的前端服务器/反向代理。 -`a2enmod proxy` -`a2enmod proxy_http` +``` +a2enmod proxy +a2enmod proxy_http +``` -下一步,在 sites-available 目录创建新的虚拟 host 文件。 +下一步,在 `sites-available` 目录创建新的虚拟主机文件。 -`cd /etc/apache2/sites-available/` -`vim jenkins.conf` +``` +cd /etc/apache2/sites-available/ +vim jenkins.conf +``` -粘贴下面的虚拟 host 配置。 +粘贴下面的虚拟主机配置。 ``` @@ -106,18 +125,24 @@ Jenkins 已经安装好了并运行在 8080 端口。 ``` -保存文件。然后用 a2ensite 命令激活 Jenkins 虚拟 host。 +保存文件。然后用 `a2ensite` 命令激活 Jenkins 虚拟主机。 -`a2ensite jenkins` +``` +a2ensite jenkins +``` 重启 Apache 和 Jenkins。 -`systemctl restart apache2` -`systemctl restart jenkins` +``` +systemctl restart apache2 +systemctl restart jenkins +``` 检查 Jenkins 和 Apache 正在使用 80 和 8080 端口。 -`netstat -plntu` +``` +netstat -plntu +``` [ ![检查 Apache 和 Jenkins 是否在运行](https://www.howtoforge.com/images/how-to-install-jenkins-with-apache-on-ubuntu-16-04/3.png) @@ -127,29 +152,30 @@ Jenkins 已经安装好了并运行在 8080 端口。 Jenkins 用域名 'my.jenkins.id' 运行。打开你的 web 浏览器然后输入 URL。你会看到要求你输入初始管理员密码的页面。Jenkins 已经生成了一个密码,因此我们只需要显示并把结果复制到密码框。 -用 cat 命令显示 Jenkins 初始管理员密码。 - -`cat /var/lib/jenkins/secrets/initialAdminPassword` +用 `cat` 命令显示 Jenkins 初始管理员密码。 +``` +cat /var/lib/jenkins/secrets/initialAdminPassword a1789d1561bf413c938122c599cf65c9 +``` [ ![获取 Jenkins 管理员密码](https://www.howtoforge.com/images/how-to-install-jenkins-with-apache-on-ubuntu-16-04/4.png) ][12] -将结果粘贴到密码框然后点击 ‘**Continue**’。 +将结果粘贴到密码框然后点击 Continue。 [ ![安装和配置 Jenkins](https://www.howtoforge.com/images/how-to-install-jenkins-with-apache-on-ubuntu-16-04/5.png) ][13] -现在为了后面能比较好的使用,我们需要在 Jenkins 中安装一些插件。选择 ‘**Install Suggested Plugin**’,点击它。 +现在为了后面能比较好的使用,我们需要在 Jenkins 中安装一些插件。选择 Install Suggested Plugin,点击它。 [ ![安装 Jenkins 插件](https://www.howtoforge.com/images/how-to-install-jenkins-with-apache-on-ubuntu-16-04/6.png) ][14] -Jenkins 插件安装过程 +Jenkins 插件安装过程: [ ![Jenkins 安装完插件](https://www.howtoforge.com/images/how-to-install-jenkins-with-apache-on-ubuntu-16-04/7.png) @@ -199,27 +225,29 @@ Jenkins 在 ‘**Access Control**’ 部分提供了多种认证方法。为了 ![在 Jenkins 中创建新的任务](https://www.howtoforge.com/images/how-to-install-jenkins-with-apache-on-ubuntu-16-04/13.png) ][21] -输入任务的名称,在这里我用 ‘Checking System’,选择 ‘**Freestyle Project**’ 然后点击 ‘**OK**’。 +输入任务的名称,在这里我输入 ‘Checking System’,选择 Freestyle Project 然后点击 OK。 [ ![配置 Jenkins 任务](https://www.howtoforge.com/images/how-to-install-jenkins-with-apache-on-ubuntu-16-04/14.png) ][22] -进入 ‘**Build**’ 标签页。在 ‘**Add build step**’,选择选项 ‘**Execute shell**’。 +进入 Build 标签页。在 Add build step,选择选项 Execute shell。 在输入框输入下面的命令。 -`top -b -n 1 | head -n 5` +``` +top -b -n 1 | head -n 5 +``` -点击 ‘**Save**’。 +点击 Save。 [ ![启动 Jenkins 任务](https://www.howtoforge.com/images/how-to-install-jenkins-with-apache-on-ubuntu-16-04/15.png) ][23] -现在你是在任务 ‘Project checking system’的任务页。点击 ‘**Build Now**’ 执行任务 ‘checking system’。 +现在你是在任务 ‘Project checking system’ 的任务页。点击 Build Now 执行任务 ‘checking system’。 -任务执行完成后,你会看到 ‘**Build History**’,点击第一个任务查看结果。 +任务执行完成后,你会看到 Build History,点击第一个任务查看结果。 下面是 Jenkins 任务执行的结果。 @@ -233,9 +261,9 @@ Jenkins 在 ‘**Access Control**’ 部分提供了多种认证方法。为了 via: https://www.howtoforge.com/tutorial/how-to-install-jenkins-with-apache-on-ubuntu-16-04/ -作者:[Muhammad Arul ][a] +作者:[Muhammad Arul][a] 译者:[ictlyh](https://github.com/ictlyh) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出 From ec2c59a729857fbe4a8386883e574d66a71a874a Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 8 May 2017 09:16:48 +0800 Subject: [PATCH 0018/1407] translating --- ...rdiff-backup – A Remote Incremental Backup Tool for Linux.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md b/sources/tech/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md index 65f6703b98..7d6eaed60a 100644 --- a/sources/tech/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md +++ b/sources/tech/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md @@ -1,3 +1,5 @@ +translating---geekpi + rdiff-backup – A Remote Incremental Backup Tool for Linux ============================================================ From 3a48a39f00c88078f5cb2cf2323f79aea906b180 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 8 May 2017 09:48:30 +0800 Subject: [PATCH 0019/1407] PRF:20161221 Living Android without Kotlin.md @DockerChen --- .../20161221 Living Android without Kotlin.md | 88 +++++++++---------- 1 file changed, 41 insertions(+), 47 deletions(-) diff --git a/translated/tech/20161221 Living Android without Kotlin.md b/translated/tech/20161221 Living Android without Kotlin.md index 4f28c8ecd5..aeac926c75 100644 --- a/translated/tech/20161221 Living Android without Kotlin.md +++ b/translated/tech/20161221 Living Android without Kotlin.md @@ -1,44 +1,43 @@ -没有Kotlin(Android)生活 +在没有 Kotlin 的世界与 Android 共舞 ============================================================ ![](https://cdn-images-1.medium.com/max/2000/1*Fd349rzh3XWwSbCP2IV7zA.jpeg) > 开始投入一件事比远离它更容易。 — Donald Rumsfeld -没有Kotlin的生活就像在触摸板上玩魔兽争霸3。购买鼠标很简单,但如果你的新雇主不想让你在生产中使用Kotlin,你该怎么办? +没有 Kotlin 的生活就像在触摸板上玩魔兽争霸 3。购买鼠标很简单,但如果你的新雇主不想让你在生产中使用 Kotlin,你该怎么办? 下面有一些选择。 -* 与你的产品负责人争取获得使用Kotlin的权利。 -* 使用Kotlin并且不告诉其他人因为你知道最好的东西是只适合你的。 -* 擦掉你的眼泪,自豪地使用Java。 +* 与你的产品负责人争取获得使用 Kotlin 的权利。 +* 使用 Kotlin 并且不告诉其他人因为你知道最好的东西是只适合你的。 +* 擦掉你的眼泪,自豪地使用 Java。 -想象一下,你在和产品负责人的斗争中失败,作为一个专业的工程师,在没有任何人的允许下你将不会去依靠和使用时髦的技术。我知道这听起来非常恐怖,特别当你已经品尝到Kotlin的好处但是又没有失去你的希望。 +想象一下,你在和产品负责人的斗争中失败,作为一个专业的工程师,你不能在没有同意的情况下私自去使用那些时髦的技术。我知道这听起来非常恐怖,特别当你已经品尝到 Kotlin 的好处时,不过不要失去生活的信念。 -在文章接下来的部分,我想简短地描述一些Kotlin的特征,使你通过一些知名的工具和库,可以应用到你的Android里的Java代码中去。对于Kotlin和Java一个基本的认识是需要的。 +在文章接下来的部分,我想简短地描述一些 Kotlin 的特征,使你通过一些知名的工具和库,可以应用到你的 Android 里的 Java 代码中去。对于 Kotlin 和 Java 的基本认识是需要的。 ### 数据类 -你真的已经喜欢上Kotlin的数据类,不是吗?对于你来说,得到`equals()`, `hashCode()`, `toString()` 和 `copy()`这些类是很容易的。具体来说,`data`关键字还会按照声明顺序生成对应于属性的`componentN()`函数。 它们用于构造声明。 +我想你肯定已经喜欢上 Kotlin 的数据类。对于你来说,得到 `equals()`、 `hashCode()`、 `toString()` 和 `copy()` 这些是很容易的。具体来说,`data` 关键字还可以按照声明顺序生成对应于属性的 `componentN()` 函数。 它们用于解构声明。 + ``` data class Person(val name: String) val (riddle) = Person("Peter") println(riddle) ``` -你知道什么会被打印吗?确信它不会是从`Person` 类的`toString()` 返回的值。这是构造声明的作用,它赋值从`name`到`riddle`。使用园括号`(riddle)`编译器知道它必须使用构造声明机制。 - +你知道什么会被打印出来吗?确实,它不会是从 `Person` 类的 `toString()` 返回的值。这是解构声明的作用,它赋值从 `name` 到 `riddle`。使用园括号 `(riddle)` 编译器知道它必须使用解构声明机制。 ``` val (riddle): String = Person("Peter").component1() -println(riddle) // prints Peter -view raw +println(riddle) // prints Peter) ``` ->这个代码没有编译。它就是展示了构造声明怎么工作的。 +> 这个代码没编译。它就是展示了构造声明怎么工作的。 -正如你可以看到`data`关键字是一个超级有用的语言特性,所以你能做什么把它带到你的Java世界? 使用注释处理器并修改抽象语法树。 如果你想更深入,请阅读文章末尾列出的文章(Project Lombok— Trick Explained)。 +正如你可以看到 `data` 关键字是一个超级有用的语言特性,所以你能做什么把它带到你的 Java 世界? 使用注释处理器并修改抽象语法树(Abstract Syntax Tree)。 如果你想更深入,请阅读文章末尾列出的文章(Project Lombok— Trick Explained)。 -使用项目Lombok你可以实现几乎相同的功能,`data`关键字提供。 不幸的是,没有办法进行构造声明。 +使用项目 Lombok 你可以实现 `data`关键字所提供的几乎相同的功能。 不幸的是,没有办法进行解构声明。 ``` import lombok.Data; @@ -48,24 +47,23 @@ import lombok.Data; } ``` +`@Data` 注解生成 `equals()`、`hashCode()` 和 `toString()`。 此外,它为所有字段创建 getter,为所有非最终字段创建setter,并为所有必填字段(final)创建构造函数。 值得注意的是,Lombok 仅用于编译,因此库代码不会添加到您的最终的 .apk。 -`@ Data`注解生成`equals()`,`hashCode()`和`toString()`。 此外,它为所有字段创建getters,为所有非最终字段创建setters,并为所有必填字段(finalals)创建构造函数。 值得注意的是,Lombok仅用于编译,因此库代码不会添加到您的最终的.apk。 +### Lambda 表达式 -### Lambda表达式 - -Android工程师有一个非常艰难的生活,因为Android中缺乏Java 8的特性,而且其中之一是lambda表达式。 Lambdas是很棒的,因为它们为你减少了成吨的样板。 你可以在回调和流中使用它们。 在Kotlin中,lambda表达式是内置的,它们看起来比它们在Java中看起来好多了。 此外,lambda的字节码可以直接插入到调用方法的字节码中,因此方法计数不会增加。 它可以使用内联函数。 +Android 工程师有一个非常艰难的生活,因为 Android 中缺乏 Java 8 的特性,而且其中之一是 lambda 表达式。 Lambda 是很棒的,因为它们为你减少了成吨的样板。 你可以在回调和流中使用它们。 在 Kotlin 中,lambda 表达式是内置的,它们看起来比它们在 Java 中看起来好多了。 此外,lambda 的字节码可以直接插入到调用方法的字节码中,因此方法计数不会增加。 它可以使用内联函数。 ``` button.setOnClickListener { println("Hello World") } -``` -最近Google宣布在Android中支持Java 8的特性,由于Jack编译器,你可以在你的代码中使用lambdas。还要提及的是,它们在API 23或者更低的级别都可用。 +``` + +最近 Google 宣布在 Android 中支持 Java 8 的特性,由于 Jack 编译器,你可以在你的代码中使用 lambda。还要提及的是,它们在 API 23 或者更低的级别都可用。 ``` button.setOnClickListener(view -> System.out.println("Hello World!")); ``` -怎样使用它们?就只用添加下面几行到你的` build.gradle `文件中。 - +怎样使用它们?就只用添加下面几行到你的 `build.gradle` 文件中。 ``` defaultConfig { @@ -80,7 +78,8 @@ compileOptions { } ``` -如果你不是一个Jack编译器的粉丝,或则你由于一些原因不能使用它,这里有一个不同的解决方案提供给你。Retrolambda项目允许你使用Java 7,6或者5上的lambda表达式来运行Java 8的代码,下面是设置过程。 +如果你不喜欢用 Jack 编译器,或者你由于一些原因不能使用它,这里有一个不同的解决方案提供给你。Retrolambda 项目允许你在 Java 7,6 或者 5 上运行带有 lambda 表达式的 Java 8 代码,下面是设置过程。 + ``` dependencies { classpath 'me.tatarka:gradle-retrolambda:3.4.0' @@ -92,17 +91,17 @@ compileOptions { sourceCompatibility JavaVersion.VERSION_1_8 targetCompatibility JavaVersion.VERSION_1_8 } -``` -正如我前面提到的,在Kotlin下的lambdas内联函数不增加方法计数,但是如何在Jack或者Retrolambda下使用它们? 显然,它们不是免费的,隐藏的成本如下。 +``` +正如我前面提到的,在 Kotlin 下的 lambda 内联函数不增加方法计数,但是如何在 Jack 或者 Retrolambda 下使用它们呢? 显然,它们不是没成本的,隐藏的成本如下。 - - ![](https://cdn-images-1.medium.com/max/800/1*H7h2MB2auMslMkdaDtqAfg.png) - +![](https://cdn-images-1.medium.com/max/800/1*H7h2MB2auMslMkdaDtqAfg.png) + +*该表展示了使用不同版本的 Retrolambda 和 Jack 编译器生成的方法数量。该比较结果来自 Jake Wharton 的“[探索 Java 的隐藏成本](http://jakewharton.com/exploring-java-hidden-costs/)” 技术讨论之中。* + ### 数据操作 - -Kotlin引入了高阶函数作为流的替代。 当您必须将一组数据转换为另一组数据或过滤集合时,它们非常有用。 +Kotlin 引入了高阶函数作为流的替代。 当您必须将一组数据转换为另一组数据或过滤集合时,它们非常有用。 ``` fun foo(persons: MutableList) { @@ -116,8 +115,7 @@ fun foo(persons: MutableList) { data class Person(val name: String, val age: Int) ``` -Streams也由Google使用Jack编译器提供。 不幸的是,Jack不使用Lombok,因为它在编译代码时跳过生成中间的`.class`文件,而Lombok依赖于这些文件。 - +流也由 Google 通过 Jack 编译器提供。 不幸的是,Jack 不使用 Lombok,因为它在编译代码时跳过生成中间的 `.class` 文件,而 Lombok 却依赖于这些文件。 ``` void foo(List persons) { @@ -143,9 +141,9 @@ class Person { } ``` -这太好了以至于不是真的,所以在哪里捉住? 悲伤的是,流从API 24 \可用。谷歌做的不错,但为什么广泛的应用程序有` minSdkVersion = 24 `? +这简直太好了,所以 catch 在哪里? 令人悲伤的是,流从 API 24 才可用。谷歌做了好事,但哪个应用程序有用 `minSdkVersion = 24`? -幸运的是,Android平台有一个很好的开源社区提供许多很棒的库。Lightweight-Stream-API是其中的一个,它包含基于Java 7及以下版本的迭代器的流实现。 +幸运的是,Android 平台有一个很好的提供许多很棒的库的开源社区。Lightweight-Stream-API 就是其中的一个,它包含了 Java 7 及以下版本的基于迭代器的流实现。 ``` import lombok.Data; @@ -166,14 +164,13 @@ void foo(List persons) { } ``` -上面的例子结合了Lombok,Retrolambda和Lightweight-Stream-API,它看起来几乎和Kotlin一样好,不是。 使用静态工厂方法允许您将任何Iterable转换为流,并对其应用lambdas,就像Java 8流一样。 将静态调用` Stream.of(persons) `包装为Iterable类型的扩展函数是完美的,但是Java不支持它。 +上面的例子结合了 Lombok、Retrolambda 和 Lightweight-Stream-API,它看起来几乎和 Kotlin 一样棒。使用静态工厂方法允许您将任何 Iterable 转换为流,并对其应用 lambda,就像 Java 8 流一样。 将静态调用 `Stream.of(persons)` 包装为 Iterable 类型的扩展函数是完美的,但是 Java 不支持它。 -### 扩展功能 +### 扩展函数 -扩展机制提供了向类添加功能而无需继承它的能力。 这个众所周知的概念非常适合Android世界,这就是Kotlin在社区很受欢迎的原因。 - -有没有技术或魔术将扩展功能添加到你的Java工具箱? 由于Lombok,你可以使用它们作为一个实验功能。 根据Lombok文档的说明,他们想把它从实验状态移出,没有或微小的变化很快。 让我们重构最后一个样例,并将` Stream.of(persons) `包装成扩展函数。 +扩展机制提供了向类添加功能而无需继承它的能力。 这个众所周知的概念非常适合 Android 世界,这就是 Kotlin 在该社区很受欢迎的原因。 +有没有技术或魔术将扩展功能添加到你的 Java 工具箱? 因 Lombok,你可以使用它们作为一个实验功能。 根据 Lombok 文档的说明,他们想把它从实验状态移出,基本上没有什么变化的话很快。 让我们重构最后一个例子,并将 `Stream.of(persons)` 包装成扩展函数。 ``` import lombok.Data; @@ -203,17 +200,14 @@ class Streams { } ``` -所有的方法是`public`,`static`,并且至少有一个参数的类型不是原始的,被认为是扩展方法。 `@ ExtensionMethod`注解允许你指定一个包含你的扩展函数的类。 而不是使用一个`.class`对象,你也可以传递数组。 +所有的方法是 `public`、`static` 的,并且至少有一个参数的类型不是原始的,因而是扩展方法。 `@ExtensionMethod` 注解允许你指定一个包含你的扩展函数的类。 你也可以传递数组,而不是使用一个 `.class` 对象。 * * * -我完全知道我的一些想法是非常有争议的,特别是Lombok,我也知道,有很多的库,可以使你的生活更轻松。请不要犹豫在评论里分享你的经验。干杯! - +我完全知道我的一些想法是非常有争议的,特别是 Lombok,我也知道,有很多的库,可以使你的生活更轻松。请不要犹豫在评论里分享你的经验。干杯! ![](https://cdn-images-1.medium.com/max/800/1*peB9mmElOn6xwR3eH0HXXA.png) - - --------------------------------- 作者简介: @@ -224,11 +218,11 @@ Coder and professional dreamer @ Grid Dynamics -------------------------------------------------------------------------------- -via: https://hackernoon.com/living-android-without-kotlin-db7391a2b170#.q95i5232f +via: https://medium.com/proandroiddev/living-android-without-kotlin-db7391a2b170 作者:[Piotr Ślesarew][a] 译者:[DockerChen](https://github.com/DockerChen) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From f0e9b4b4cfbbefc0e5a9d0c157119bed637cc2ce Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 8 May 2017 09:48:52 +0800 Subject: [PATCH 0020/1407] PUB:20161221 Living Android without Kotlin.md @DockerChen --- .../tech => published}/20161221 Living Android without Kotlin.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20161221 Living Android without Kotlin.md (100%) diff --git a/translated/tech/20161221 Living Android without Kotlin.md b/published/20161221 Living Android without Kotlin.md similarity index 100% rename from translated/tech/20161221 Living Android without Kotlin.md rename to published/20161221 Living Android without Kotlin.md From eee3e381bdba71950e6a48628915859a67d4cc27 Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 8 May 2017 10:20:34 +0800 Subject: [PATCH 0021/1407] translated --- ... Remote Incremental Backup Tool for Linux.md | 258 ------------------ ... Remote Incremental Backup Tool for Linux.md | 255 +++++++++++++++++ 2 files changed, 255 insertions(+), 258 deletions(-) delete mode 100644 sources/tech/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md create mode 100644 translated/tech/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md diff --git a/sources/tech/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md b/sources/tech/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md deleted file mode 100644 index 7d6eaed60a..0000000000 --- a/sources/tech/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md +++ /dev/null @@ -1,258 +0,0 @@ -translating---geekpi - -rdiff-backup – A Remote Incremental Backup Tool for Linux -============================================================ - -rdiff-backup is a powerful and easy-to-use Python script for local/remote incremental backup, which works on any POSIX operating system such as Linux, Mac OS X or [Cygwin][1]. It brings together the remarkable features of a mirror and an incremental backup. - -Significantly, it preserves subdirectories, dev files, hard links, and critical file attributes such as permissions, uid/gid ownership, modification times, extended attributes, acls, and resource forks. It can work in a bandwidth-efficient mode over a pipe, in a similar way as the popular [rsync backup tool][2]. - -rdiff-backup backs up a single directory to another over a network using SSH, implying that the data transfer is encrypted thus secure. The target directory (on the remote system) ends up an exact copy of the source directory, however extra reverse diffs are stored in a special subdirectory in the target directory, making it possible to recover files lost some time ago. - -#### Dependencies - -To use rdiff-backup in Linux, you’ll need the following packages installed on your system: - -* Python v2.2 or later -* librsync v0.9.7 or later -* pylibacl and pyxattr Python modules are optional but necessary for POSIX access control list(ACL) and extended attribute support respectively. -* rdiff-backup-statistics requires Python v2.4 or later. - -### How to Install rdiff-backup in Linux - -Important: If you are operating over a network, you’ll have to install rdiff-backup both systems, preferably both installations of rdiff-backup will have to be the exact same version. - -The script is already present in the official repositories of the mainstream Linux distributions, simply run the command below to install rdiff-backup as well as its dependencies: - -#### On Debian/Ubuntu - -``` -$ sudo apt-get update -$ sudo apt-get install librsync-dev rdiff-backup -``` - -#### On CentOS/RHEL 7 - -``` -# wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm -# rpm -ivh epel-release-7-9.noarch.rpm -# yum install librsync rdiff-backup -``` - -#### On CentOS/RHEL 6 - -``` -# wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm -# rpm -ivh epel-release-6-8.noarch.rpm -# yum install librsync rdiff-backup -``` - -#### On Fedora - -``` -# yum install librsync rdiff-backup -# dnf install librsync rdiff-backup [Fedora 22+] -``` - -### How to Use rdiff-backup in Linux - -As I mentioned before, rdiff-backup uses SSH to connect to remote machines on your network, and the default authentication in SSH is the username/password method, which normally requires human interaction. - -However, to automate tasks such as automatic backups with scripts and beyond, you will need to configure [SSH Passwordless Login Using SSH keys][3], because SSH keys increases the trust between two Linux servers for [easy file synchronization or transfer][4]. - -Once you have setup [SSH Passwordless Login][5], you can start using the script with the following examples. - -#### Backup Files to Different Partition - -The example below will backup the `/etc` directory in a Backup directory on another partition: - -``` -$ sudo rdiff-backup /etc /media/aaronkilik/Data/Backup/mint_etc.backup -``` -[ - ![Backup Files to Different Partition](http://www.tecmint.com/wp-content/uploads/2017/03/Backup-Files-to-Different-Partition.png) -][6] - -Backup Files to Different Partition - -To exclude a particular directory as well as it’s subdirectories, you can use the `--exclude` option as follows: - -``` -$ sudo rdiff-backup --exclude /etc/cockpit --exclude /etc/bluetooth /media/aaronkilik/Data/Backup/mint_etc.backup -``` - -We can include all device files, fifo files, socket files, and symbolic links with the `--include-special-files` option as below: - -``` -$ sudo rdiff-backup --include-special-files --exclude /etc/cockpit /media/aaronkilik/Data/Backup/mint_etc.backup -``` - -There are two other important flags we can set for file selection; `--max-file-size` size which excludes files that are larger than the given size in bytes and `--min-file-size` size which excludes files that are smaller than the given size in bytes: - -``` -$ sudo rdiff-backup --max-file-size 5M --include-special-files --exclude /etc/cockpit /media/aaronkilik/Data/Backup/mint_etc.backup -``` - -#### Backup Remote Files on Local Linux Server - -For the purpose of this section, we’ll use: - -``` -Remote Server (tecmint) : 192.168.56.102 -Local Backup Server (backup) : 192.168.56.10 -``` - -As we stated before, you must install the same version of rdiff-backup on both machines, now try to check the version on both machines as follows: - -``` -$ rdiff-backup -V -``` -[ - ![Check rdiff Version on Servers](http://www.tecmint.com/wp-content/uploads/2017/03/check-rdif-versions-on-servers.png) -][7] - -Check rdiff Version on Servers - -On the backup server, create a directory which will store the backup files like so: - -``` -# mkdir -p /backups -``` - -Now from the backup server, run the following commands to make a backup of directories `/var/log/`and `/root` from remote Linux server 192.168.56.102 in `/backups`: - -``` -# rdiff-backup root@192.168.56.102::/var/log/ /backups/192.168.56.102_logs.backup -# rdiff-backup root@192.168.56.102::/root/ /backups/192.168.56.102_rootfiles.backup -``` - -The screenshot below shows the root file on remote server 192.168.56.102 and the backed up files on the back server 192.168.56.10: - -[ - ![Backup Remote Directory on Local Server](http://www.tecmint.com/wp-content/uploads/2017/03/Backup-Remote-Linux-Directory-on-Local-Server.png) -][8] - -Backup Remote Directory on Local Server - -Take note of the rdiff-backup-data directory created in the `backup` directory as seen in the screenshot, it contains vital data concerning the backup process and incremental files. - -[ - ![rdiff-backup - Backup Process Files](http://www.tecmint.com/wp-content/uploads/2017/03/rdiff-backup-data-directory-contents.png) -][9] - -rdiff-backup – Backup Process Files - -Now, on the server 192.168.56.102, additional files have been added to the root directory as shown below: - -[ - ![Verify Backup Directory](http://www.tecmint.com/wp-content/uploads/2017/03/additional-files-in-root-directory.png) -][10] - -Verify Backup Directory - -Let’s run the backup command once more time to get the changed data, we can use the `-v[0-9]`(where the number specifies the verbosity level, default is 3 which is silent) option to set the verbosity feature: - -``` -# rdiff-backup -v4 root@192.168.56.102::/root/ /backups/192.168.56.102_rootfiles.backup -``` -[ - ![Incremental Backup with Summary](http://www.tecmint.com/wp-content/uploads/2017/03/incremental-backup-of-root-files.png) -][11] - -Incremental Backup with Summary - -And to list the number and date of partial incremental backups contained in the /backups/192.168.56.102_rootfiles.backup directory, we can run: - -``` -# rdiff-backup -l /backups/192.168.56.102_rootfiles.backup/ -``` - -#### Automating rdiff-back Backup Using Cron - -We can print summary statistics after a successful backup with the `--print-statistics`. However, if we don’t set this option, the info will still be available from the session statistics file. Read more concerning this option in the STATISTICS section of the man page. - -And the –remote-schema flag enables us to specify an alternative method of connecting to a remote computer. - -Now, let’s start by creating a `backup.sh` script on the backup server 192.168.56.10 as follows: - -``` -# cd ~/bin -# vi backup.sh -``` - -Add the following lines to the script file. - -``` -#!/bin/bash -#This is a rdiff-backup utility backup script -#Backup command -rdiff-backup --print-statistics --remote-schema 'ssh -C %s "sudo /usr/bin/rdiff-backup --server --restrict-read-only /"' root@192.168.56.102::/var/logs /backups/192.168.56.102_logs.back -#Checking rdiff-backup command success/error -status=$? -if [ $status != 0 ]; then -#append error message in ~/backup.log file -echo "rdiff-backup exit Code: $status - Command Unsuccessful" >>~/backup.log; -exit 1; -fi -#Remove incremental backup files older than one month -rdiff-backup --force --remove-older-than 1M /backups/192.168.56.102_logs.back -``` - -Save the file and exit, then run the following command to add the script to the crontab on the backup server 192.168.56.10: - -``` -# crontab -e -``` - -Add this line to run your backup script daily at midnight: - -``` -0 0 * * * /root/bin/backup.sh > /dev/null 2>&1 -``` - -Save the crontab and close it, now we’ve successful automated the backup process. Ensure that it is working as expected. - -Read through the rdiff-backup man page for additional info, exhaustive usage options and examples: - -``` -# man rdiff-backup -``` - -rdiff-backup Homepage: [http://www.nongnu.org/rdiff-backup/][12] - -That’s it for now! In this tutorial, we showed you how to install and basically use rdiff-backup, an easy-to-use Python script for local/remote incremental backup in Linux. Do share your thoughts with us via the feedback section below. - --------------------------------------------------------------------------------- - -作者简介: - -Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. - - - ------------- - -via: http://www.tecmint.com/rdiff-backup-remote-incremental-backup-for-linux/ - -作者:[Aaron Kili ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.tecmint.com/author/aaronkili/ -[1]:http://www.tecmint.com/install-cygwin-to-run-linux-commands-on-windows-system/ -[2]:http://www.tecmint.com/rsync-local-remote-file-synchronization-commands/ -[3]:http://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/ -[4]:http://www.tecmint.com/sync-new-changed-modified-files-rsync-linux/ -[5]:http://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/ -[6]:http://www.tecmint.com/wp-content/uploads/2017/03/Backup-Files-to-Different-Partition.png -[7]:http://www.tecmint.com/wp-content/uploads/2017/03/check-rdif-versions-on-servers.png -[8]:http://www.tecmint.com/wp-content/uploads/2017/03/Backup-Remote-Linux-Directory-on-Local-Server.png -[9]:http://www.tecmint.com/wp-content/uploads/2017/03/rdiff-backup-data-directory-contents.png -[10]:http://www.tecmint.com/wp-content/uploads/2017/03/additional-files-in-root-directory.png -[11]:http://www.tecmint.com/wp-content/uploads/2017/03/incremental-backup-of-root-files.png -[12]:http://www.nongnu.org/rdiff-backup/ -[13]:http://www.tecmint.com/author/aaronkili/ -[14]:http://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ -[15]:http://www.tecmint.com/free-linux-shell-scripting-books/ diff --git a/translated/tech/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md b/translated/tech/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md new file mode 100644 index 0000000000..5e1ad5627d --- /dev/null +++ b/translated/tech/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md @@ -0,0 +1,255 @@ +rdiff-backup - 一个 Linux 中的远程增量备份工具 +============================================================ + +rdiff-backup 是用于本地/远程增量备份的强大且易于使用的 Python 脚本,它适用于任何 POSIX 操作系统,如Linux、Mac OS X 或 [Cygwin][1]。它集合了镜像和增量备份的显著特性。 + +值得注意的是,它保留了子目录、dev文件、硬链接和关键的文件属性,如权限、uid/gid 所有权、修改时间、扩展属性、acls 以及 resource fork。它可以通过管道以高效带宽的模式工作,这与流行的[ rsync 备份工具][2]类似。 + +rdiff-backup 通过使用 SSH 将单个目录备份到另一个目录,这意味着数据传输被加密并且是安全的。目标目录(在远程系统上)最终会得到源目录的完整副本,但是额外的反向差异存储在目标目录的特殊子目录中,从而可以恢复前一段时间丢失的文件。 + +#### 依赖 + +要在 Linux 中使用 rdiff-backup,你需要在系统上安装以下软件包: + +* Python v2.2 或更高版本 +* librsync v0.9.7 或更高版本 +* pylibacl 和 pyxattr Python 模块是可选的,但它们分别是 POSIX 访问控制列表(ACL)和扩展属性支持必需的。 +* rdiff-backup-statistics 需要 Python v2.4 或更高版本。 + +### 如何在 Linux 中安装 rdiff-backup + +重要:如果你通过网络运行它,则必须在两个系统中都安装 rdiff-backup,两者最好是相同版本。 + +该脚本已经存在于主流 Linux 发行版的官方仓库中,只需运行以下命令来安装 rdiff-backup 及其依赖关系: + +#### 在 Debian/Ubuntu 中 + +``` +$ sudo apt-get update +$ sudo apt-get install librsync-dev rdiff-backup +``` + +#### 在 CentOS/RHEL 7 中 + +``` +# wget http://dl.fedoraproject.org/pub/epel/7/x86_64/e/epel-release-7-9.noarch.rpm +# rpm -ivh epel-release-7-9.noarch.rpm +# yum install librsync rdiff-backup +``` + +#### 在 CentOS/RHEL 6 中 + +``` +# wget http://download.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm +# rpm -ivh epel-release-6-8.noarch.rpm +# yum install librsync rdiff-backup +``` + +#### 在 Fedora 中 + +``` +# yum install librsync rdiff-backup +# dnf install librsync rdiff-backup [Fedora 22+] +``` + +### 如何在 Linux 中使用 rdiff-backup + +如前所述,rdiff-backup 使用 SSH 连接到网络上的远程计算机,SSH 的默认身份验证方式是用户名/密码,这通常需要人工交互。 + +但是,要自动执行诸如脚本等自动备份之类的任务,那么你需要配置[使用 SSH 密钥无密码登录 SSH][3],因为 SSH 密钥增加了两台 Linux服务器之间的信任来[简化文件同步或传输][4]。 + +在你设置了[ SSH 无密码登录][5]后,你可以使用下面的例子开始使用该脚本。 + +#### 备份文件到不同分区 + +下面的例子会备份 `/etc` 文件夹到另外一个分区的 Backup 文件夹内: + +``` +$ sudo rdiff-backup /etc /media/aaronkilik/Data/Backup/mint_etc.backup +``` +[ + ![Backup Files to Different Partition](http://www.tecmint.com/wp-content/uploads/2017/03/Backup-Files-to-Different-Partition.png) +][6] + +备份文件到不同分区 + +要排除一个特定文件夹和它的子目录,你可以如下使用 `--exclude` 选项: + +``` +$ sudo rdiff-backup --exclude /etc/cockpit --exclude /etc/bluetooth /media/aaronkilik/Data/Backup/mint_etc.backup +``` + +我们可以如下使用 `--include-special-files` 包含所有的设备文件、fifo 文件、socket 文件和链接文件: + +``` +$ sudo rdiff-backup --include-special-files --exclude /etc/cockpit /media/aaronkilik/Data/Backup/mint_etc.backup +``` + +还有另外两个重要标志来用于选择文件,`--max-file-size` 用来排除大于给定字节大小的文件,`--max-file-size` 用于排除小于给定字节大小的文件: + +``` +$ sudo rdiff-backup --max-file-size 5M --include-special-files --exclude /etc/cockpit /media/aaronkilik/Data/Backup/mint_etc.backup +``` + +#### 在本地 Linux 服务器上备份远程文件 + +要这么做,我们使用: + +``` +Remote Server (tecmint) : 192.168.56.102 +Local Backup Server (backup) : 192.168.56.10 +``` + +如前所述,你必须在两台机器上安装相同版本的 rdiff-backup,如下所示,请尝试在两台机器上检查版本,: + +``` +$ rdiff-backup -V +``` +[ + ![Check rdiff Version on Servers](http://www.tecmint.com/wp-content/uploads/2017/03/check-rdif-versions-on-servers.png) +][7] + +检查服务器中 rdiff 版本 + +在备份服务器中,像这样创建一个存储备份文件的目录: + +``` +# mkdir -p /backups +``` + +现在在备份服务器中,运行下面的命令来将远程 Linux 服务器 192.168.56.102 中的 `/var/log/` 和 `/root` 备份到 `/backups` 中: + +``` +# rdiff-backup root@192.168.56.102::/var/log/ /backups/192.168.56.102_logs.backup +# rdiff-backup root@192.168.56.102::/root/ /backups/192.168.56.102_rootfiles.backup +``` + +下面的截图展示了远程服务器 192.168.56.102 中的 root 文件夹以及 192.168.56.10 备份服务器中的已备份文件: + +[ + ![Backup Remote Directory on Local Server](http://www.tecmint.com/wp-content/uploads/2017/03/Backup-Remote-Linux-Directory-on-Local-Server.png) +][8] + +在本地服务器备份远程目录 + +注意截图中 “backup” 目录中创建的 rdiff-backup-data 文件夹,它包含了备份过程和增量文件的重要数据。 + +[ + ![rdiff-backup - Backup Process Files](http://www.tecmint.com/wp-content/uploads/2017/03/rdiff-backup-data-directory-contents.png) +][9] + +rdiff-backup – 备份过程文件 + +现在,在 192.168.56.102 服务器中,如下所示 root 目录已经添加了额外的文件: + +[ + ![Verify Backup Directory](http://www.tecmint.com/wp-content/uploads/2017/03/additional-files-in-root-directory.png) +][10] + +验证备份目录 + +让我们再次运行备份命令以获取更改的数据,我们可以使用 `-v[0-9]`(其中数字指定详细程度级别,默认值为 3,这是静默模式)选项设置详细功能: + +``` +# rdiff-backup -v4 root@192.168.56.102::/root/ /backups/192.168.56.102_rootfiles.backup +``` +[ + ![Incremental Backup with Summary](http://www.tecmint.com/wp-content/uploads/2017/03/incremental-backup-of-root-files.png) +][11] + +带有摘要的增量备份 + +要列出 /backups/192.168.56.102_rootfiles.backup 目录中包含的部分增量备份的数量和日期,我们可以运行: + +``` +# rdiff-backup -l /backups/192.168.56.102_rootfiles.backup/ +``` + +#### 使用 cron 自动进行 rdiff-back 备份 + +使用 `--print-statistics` 成功备份后,我们可以打印摘要统计信息。但是,如果我们不设置此选项,我们可以仍从会话统计中获得。在手册页的 “STATISTICS” 部分中阅读有关此选项的更多信息。 + +-remote-schema 标志使我们能够指定使用替代方法连接到远程计算机。 + +现在,我们开始在备份服务器 192.168.56.10 上创建一个 `backup.sh` 脚本,如下所示: + +``` +# cd ~/bin +# vi backup.sh +``` + +添加下面的行到脚本中。 + +``` +#!/bin/bash +#This is a rdiff-backup utility backup script +#Backup command +rdiff-backup --print-statistics --remote-schema 'ssh -C %s "sudo /usr/bin/rdiff-backup --server --restrict-read-only /"' root@192.168.56.102::/var/logs /backups/192.168.56.102_logs.back +#Checking rdiff-backup command success/error +status=$? +if [ $status != 0 ]; then +#append error message in ~/backup.log file +echo "rdiff-backup exit Code: $status - Command Unsuccessful" >>~/backup.log; +exit 1; +fi +#Remove incremental backup files older than one month +rdiff-backup --force --remove-older-than 1M /backups/192.168.56.102_logs.back +``` + +保存文件并退出,接着运行下面的命令在服务器 192.168.56.10 上的 crontab 中添加此脚本: + +``` +# crontab -e +``` + +添加此行在每天午夜运行你的备份脚本: + +``` +0 0 * * * /root/bin/backup.sh > /dev/null 2>&1 +``` + +保存 crontab 并退出,现在我们已经成功自动化了备份过程。确保一切如希望那样工作。 + +阅读 rdiff-backup 的手册页获取更多信息、详尽的使用选项以及示例: + +``` +# man rdiff-backup +``` + +rdiff-backup 主页: [http://www.nongnu.org/rdiff-backup/][12] + +就是这样了!在本教程中,我们向你展示了如何安装并基础地使用 rdiff-backup 这个易于使用的 Python 脚本,用于 Linux 中的本地/远程增量备份。 请通过下面的反馈栏与我们分享你的想法。 + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux SysAdmin 和 web 开发人员,目前是 TecMint 的内容创建者,他喜欢用电脑工作,并坚信分享知识。 + + +------------ + +via: http://www.tecmint.com/rdiff-backup-remote-incremental-backup-for-linux/ + +作者:[Aaron Kili ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.tecmint.com/author/aaronkili/ +[1]:http://www.tecmint.com/install-cygwin-to-run-linux-commands-on-windows-system/ +[2]:http://www.tecmint.com/rsync-local-remote-file-synchronization-commands/ +[3]:http://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/ +[4]:http://www.tecmint.com/sync-new-changed-modified-files-rsync-linux/ +[5]:http://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/ +[6]:http://www.tecmint.com/wp-content/uploads/2017/03/Backup-Files-to-Different-Partition.png +[7]:http://www.tecmint.com/wp-content/uploads/2017/03/check-rdif-versions-on-servers.png +[8]:http://www.tecmint.com/wp-content/uploads/2017/03/Backup-Remote-Linux-Directory-on-Local-Server.png +[9]:http://www.tecmint.com/wp-content/uploads/2017/03/rdiff-backup-data-directory-contents.png +[10]:http://www.tecmint.com/wp-content/uploads/2017/03/additional-files-in-root-directory.png +[11]:http://www.tecmint.com/wp-content/uploads/2017/03/incremental-backup-of-root-files.png +[12]:http://www.nongnu.org/rdiff-backup/ +[13]:http://www.tecmint.com/author/aaronkili/ +[14]:http://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[15]:http://www.tecmint.com/free-linux-shell-scripting-books/ From fc93be4636acdbaa6742591add608629ef8c97e1 Mon Sep 17 00:00:00 2001 From: mec2cod Date: Mon, 8 May 2017 10:56:33 +0800 Subject: [PATCH 0022/1407] finish 20170322 5 big ways AI is rapidly invading our lives.md --- ...g ways AI is rapidly invading our lives.md | 116 ------------------ ...g ways AI is rapidly invading our lives.md | 112 +++++++++++++++++ 2 files changed, 112 insertions(+), 116 deletions(-) delete mode 100644 sources/tech/20170322 5 big ways AI is rapidly invading our lives.md create mode 100644 translated/tech/20170322 5 big ways AI is rapidly invading our lives.md diff --git a/sources/tech/20170322 5 big ways AI is rapidly invading our lives.md b/sources/tech/20170322 5 big ways AI is rapidly invading our lives.md deleted file mode 100644 index 6c217cf342..0000000000 --- a/sources/tech/20170322 5 big ways AI is rapidly invading our lives.md +++ /dev/null @@ -1,116 +0,0 @@ -translated by zhousiyu325 - -5 big ways AI is rapidly invading our lives -============================================================ - -> Let's look at five real ways we're already surrounded by artificial intelligence. - - - ![5 big ways AI is rapidly invading our lives](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/brain-think-ai-intelligence-ccby.png?itok=-EK6Vpz1 "5 big ways AI is rapidly invading our lives") ->Image by : opensource.com - -Open source projects [are helping drive][2] artificial intelligence advancements, and we can expect to hear much more about how AI impacts our lives as the technologies mature. Have you considered how AI is changing the world around you already? Let's take a look at our increasingly artificially enhanced universe and consider the bold predictions about our AI-influenced future. - -### 1\. AI influences your purchasing decisions - -A recent story on [VentureBeat][3], "[How AI will help us decipher millennials][4]," caught my eye. I confess that I haven't given much thought to artificial intelligence—nor have I had a hard time deciphering millennials—so I was curious to learn more. As it turns out, the headline was a bit misleading; "How to sell to millennials" would have been a more accurate title. - -According to the article, the millennial generation is a "the demographic segment so coveted that marketing managers from all over the globe are fighting over them." By analyzing online behavior—be it shopping, social media, or other activities—machine learning can help predict behavioral patterns, which can then turn into targeted advertising. The article goes on to explain how the Internet of Things and social media platforms can be mined for data points. "Using machine learning to mine social media data allows companies to determine how millennials talk about its products, what their sentiments are towards a product category, how they respond to competitors’ advertising campaigns, and a multitude of other data that can be used to design targeted advertising campaigns," the article explains. That AI and millennials are the future of marketing is no huge surprise, but Gen Xers and Baby Boomers, you're not off the hook yet. - ->AI is being used to target entire groups—including cities—of people based on behavior changes.AI is being used to target entire groups—including cities—of people based on behavior changes. - -For example, an article on [Raconteur][23], "[How AI will change buyer behaviour][24]," explains that the biggest strength of AI in the online retail industry is its ability to adapt quickly to fluid situations that change customer behavior. Abhinav Aggarwal, chief executive of artificial intelligence startup [Fluid AI][25], says that his company's software was being used by a client to predict customer behavior, and the system noticed a change during a snow storm. "Users who would typically ignore the e-mails or in-app notifications sent in the middle of the day were now opening them as they were stuck at home without much to do. Within an hour the AI system adapted to the new situation and started sending more promotional material during working hours," he explains. - -AI is changing how, why, and when we spend money, but how is it changing the way we earn our paychecks? - -### 2\. AI is changing how we work - -A recent [Fast Company][5] article, "[This is how AI will change your work in 2017][6]," says that job seekers will benefit from artificial intelligence. The author explains that AI will be used to send job seekers alerts for relevant job openings, in addition to updates on salary trends, when you're due for a promotion, and the likelihood that you'll get one. - -Artificial intelligence also will be used by companies to help on-board new talent. "Many new hires get a ton of information during their first couple of days on the job, much of which won't get retained," the article explains. Instead, a bot could "drip information" to a new employee over time as it becomes more relevant. - -On [Inc.][7], "[Businesses Beyond Bias: How AI Will Reshape Hiring Practices][8]" looks at how [SAP SuccessFactors][9], a talent management solutions provider, leverages AI as a job description "bias checker" and to check for bias in employee compensation. - -[Deloitte's 2017 Human Capital Trends Report][10] indicates that AI is motivating organizations to restructure. Fast Company's article "[How AI is changing the way companies are organized][11]" examines the report, which was based on surveys with more than 10,000 HR and business leaders around the world. "Instead of hiring the most qualified person for a specific task, many companies are now putting greater emphasis on cultural fit and adaptability, knowing that individual roles will have to evolve along with the implementation of AI," the article explains. To adapt to changing technologies, organizations are also moving away from top-down structures and to multidisciplinary teams, the article says. - -### 3\. AI is transforming education - ->AI will benefit all the stakeholders of the education ecosystem. - -Education budgets are shrinking, whereas classroom sizes are growing, so leveraging technological advancements can help improve the productivity and efficiency of the education system, and play a role in improving the quality and affordability of education, according to an article on VentureBeat. "[How AI will transform education in 2017][26]" says that this year we'll see AI grading students' written answers, bots answering students' questions, virtual personal assistants tutoring students, and more. "AI will benefit all the stakeholders of the education ecosystem," the article explains. "Students would be able to learn better with instant feedback and guidance, teachers would get rich learning analytics and insights to personalize instruction, parents would see improved career prospects for their children at a reduced cost, schools would be able to scale high-quality education, and governments would be able to provide affordable education to all." - -### 4\. AI is reshaping healthcare - -A February 2017 article on [CB Insights][12] rounded up [106 artificial intelligence startups in healthcare][13], and many of those raised their first equity funding round within the past couple of years. "19 out of the 24 companies under imaging and diagnostics raised their first equity funding round since January 2015," the article says. Other companies on the list include those working on AI for remote patient monitoring, drug discovery, and oncology. - -An article published on March 16 on TechCrunch that looks at [how AI advances are reshaping healthcare][14] explains, "Once a better understanding of human DNA is established, there is an opportunity to go one step further and provide personalized insights to individuals based on their idiosyncratic biological dispositions. This trend is indicative of a new era of 'personalized genetics,' whereby individuals are able to take full control of their health through access to unprecedented information about their own bodies." - -The article goes on to explain that AI and machine learning are lowering the cost and time to discover new drugs. Thanks in part to extensive testing, new drugs can take more than 12 years to enter the market. "ML algorithms can allow computers to 'learn' how to make predictions based on the data they have previously processed or choose (and in some cases, even conduct) what experiments need to be done. Similar types of algorithms also can be used to predict the side effects of specific chemical compounds on humans, speeding up approvals," the article says. In 2015, the article notes, a San Francisco-based startup, [Atomwise][15], completed analysis on two new drugs to reduce Ebola infectivity within one day, instead of taking years. - ->AI is helping with discovering, diagnosing, and managing new diseases. - -Another startup, London-based [BenevolentAI][27], is harnessing AI to look for patterns in scientific literature. "Recently, the company identified two potential chemical compounds that may work on Alzheimer’s, attracting the attention of pharmaceutical companies," the article says. - -In addition to drug discovery, AI is helping with discovering, diagnosing, and managing new diseases. The TechCrunch article explains that, historically, illnesses are diagnosed based on symptoms displayed, but AI is being used to detect disease signatures in the blood, and to develop treatment plans using deep learning insights from analyzing billions of clinical cases. "IBM's Watson is working with Memorial Sloan Kettering in New York to digest reams of data on cancer patients and treatments used over decades to present and suggest treatment options to doctors in dealing with unique cancer cases," the article says. - -### 5\. AI is changing our love lives - -More than 50-million active users across 195 countries swipe through potential mates with [Tinder][16], a dating app launched in 2012\. In a [Forbes Interview podcast][17], Tinder founder and chairman Sean Rad spoke with Steven Bertoni about how artificial intelligence is changing the dating game. In [an article][18] about the interview, Bertoni quotes Rad, who says, "There might be a moment when Tinder is just so good at predicting the few people that you're interested in, and Tinder might do a lot of the leg work in organizing a date, right?" So instead of presenting users with potential partners, the app would make a suggestion for a nearby partner and take it a step further, coordinate schedules, and set up a date. - ->Future generations literally might fall in love with artificial intelligence. - -Are you in love with AI yet? Future generations literally might fall in love with artificial intelligence. An article by Raya Bidshahri on [Singularity Hub][19], "[How AI will redefine love][20]," says that in a few decades we might be arguing that love is not limited by biology. - -"Our technology, powered by Moore's law, is growing at a staggering rate—intelligent devices are becoming more and more integrated to our lives," Bidshahri explains, adding, "Futurist Ray Kurzweil predicts that we will have AI at a human level by 2029, and it will be a billion times more capable than humans by the 2040s. Many predict that one day we will merge with powerful machines, and we ourselves may become artificially intelligent." She argues that it's inevitable in such a world that humans would accept being in love with entirely non-biological beings. - -That might sound a bit freaky, but falling in love with AI is a more optimistic outcome than a future in which robots take over the world. "Programming AI to have the capacity to feel love can allow us to create more compassionate AI and may be the very key to avoiding the AI apocalypse many fear," Bidshahri says. - -This list of big ways AI is invading all areas of our lives barely scrapes the surface of the artificial intelligence bubbling up around us. Which AI innovations are most exciting—or troubling—to you? Let us know about them in the comments. - --------------------------------------------------------------------------------- - - -作者简介: - -Rikki Endsley - Rikki Endsley is a community manager for Opensource.com. In the past, she worked as the community evangelist on the Open Source and Standards (OSAS) team at Red Hat; a freelance tech journalist; community manager for the USENIX Association; associate publisher of Linux Pro Magazine, ADMIN, and Ubuntu User; and as the managing editor of Sys Admin magazine and UnixReview.com. Follow her on Twitter at: @rikkiends. - - -------------------- - -via: https://opensource.com/article/17/3/5-big-ways-ai-rapidly-invading-our-lives - -作者:[Rikki Endsley ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/rikki-endsley -[1]:https://opensource.com/article/17/3/5-big-ways-ai-rapidly-invading-our-lives?rate=ORfqhKFu9dpA9aFfg-5Za9ZWGcBcx-f0cUlf_VZNeQs -[2]:https://www.linux.com/news/open-source-projects-are-transforming-machine-learning-and-ai -[3]:https://twitter.com/venturebeat -[4]:http://venturebeat.com/2017/03/16/how-ai-will-help-us-decipher-millennials/ -[5]:https://opensource.com/article/17/3/5-big-ways-ai-rapidly-invading-our-lives -[6]:https://www.fastcompany.com/3066620/this-is-how-ai-will-change-your-work-in-2017 -[7]:https://twitter.com/Inc -[8]:http://www.inc.com/bill-carmody/businesses-beyond-bias-how-ai-will-reshape-hiring-practices.html -[9]:https://www.successfactors.com/en_us.html -[10]:https://dupress.deloitte.com/dup-us-en/focus/human-capital-trends.html?id=us:2el:3pr:dup3575:awa:cons:022817:hct17 -[11]:https://www.fastcompany.com/3068492/how-ai-is-changing-the-way-companies-are-organized -[12]:https://twitter.com/CBinsights -[13]:https://www.cbinsights.com/blog/artificial-intelligence-startups-healthcare/ -[14]:https://techcrunch.com/2017/03/16/advances-in-ai-and-ml-are-reshaping-healthcare/ -[15]:http://www.atomwise.com/ -[16]:https://twitter.com/Tinder -[17]:https://www.forbes.com/podcasts/the-forbes-interview/#5e962e5624e1 -[18]:https://www.forbes.com/sites/stevenbertoni/2017/02/14/tinders-sean-rad-on-how-technology-and-artificial-intelligence-will-change-dating/#4180fc2e5b99 -[19]:https://twitter.com/singularityhub -[20]:https://singularityhub.com/2016/08/05/how-ai-will-redefine-love/ -[21]:https://opensource.com/user/23316/feed -[22]:https://opensource.com/article/17/3/5-big-ways-ai-rapidly-invading-our-lives#comments -[23]:https://twitter.com/raconteur -[24]:https://www.raconteur.net/technology/how-ai-will-change-buyer-behaviour -[25]:http://www.fluid.ai/ -[26]:http://venturebeat.com/2017/02/04/how-ai-will-transform-education-in-2017/ -[27]:https://twitter.com/benevolent_ai -[28]:https://opensource.com/users/rikki-endsley diff --git a/translated/tech/20170322 5 big ways AI is rapidly invading our lives.md b/translated/tech/20170322 5 big ways AI is rapidly invading our lives.md new file mode 100644 index 0000000000..3c060bdbae --- /dev/null +++ b/translated/tech/20170322 5 big ways AI is rapidly invading our lives.md @@ -0,0 +1,112 @@ + +AI正快速入侵我们生活的五个方面 +============================================================ + +> 让我们来看看我们已经被人工智能包围的五个真实存在的方面 + + ![5 big ways AI is rapidly invading our lives](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/brain-think-ai-intelligence-ccby.png?itok=-EK6Vpz1 "5 big ways AI is rapidly invading our lives") +> 图片来源: opensource.com + +开源项目[正在帮助推动][2]人工智能进步,而且随着技术的成熟,我们可以听到更多关于AI如何影响我们的生活的消息。你有没有考虑过AI是如何改变你周围的世界的?让我们来看看我们日益人为增强的宇宙,并考虑对我们的AI影响的未来做些大胆预测。 + +### 1. AI影响你的购买决定 + +一篇[VentureBeat][3]上的最近的新闻报道[《AI将如何帮助我们解读千禧一代》][4]"吸引了我的注意。我承认我对人工智能没有思考太多,也没有很难解读千禧一代,所以我渴望了解更多。事实证明,文章标题有点误导人;《如何卖东西给千禧一代》会是一个更准确的标题。 + +根据这篇文章,千禧一代是一个"人口统计细分,非常令人羡慕的一代人,以至于来自全世界的市场经理都在争抢他们"。通过分析网络行为——无论是购物、社交媒体或其他活动 - 机器学习可以帮助预测行为模式,这将可以变成有针对性的广告。文章接着解释如何将物联网和社交媒体平台挖掘成数据点。"使用机器学习挖掘社交媒体数据可以让公司了解千禧一代如何谈论其产品和他们对一个产品类别的看法,以及如何回应竞争对手的广告活动,还有可用于设计有针对性的广告系列的众多其他数据,"这篇文章解释。AI和千禧一代成为营销的未来并不是什么很令人吃惊的事,但是X一代和婴儿潮一代,你们也逃不掉呢! + +> 人工智能被用来根据行为变化来定位包括城市人在内的整个人群。 + +例如, [Raconteur上][23]的一篇文章——"AI将怎样改变购买者的行为"解释说,AI在网上零售行业最大的力量是它能够迅速适应流动的情况下改变客户行为。人工智能创业公司 [Fluid AI][25]首席执行官Abhinav +Aggarwal表示,他的公司的软件被客户用来预测客户行为,并且系统注意到在暴风雪期间发生了变化。“那些通常会忽略在一天中发送的电子邮件或应用内通知的用户现在正在打开它们,因为他们在家里没有太多的事情可做。一个小时,AI系统就适应了新的情况,并在工作时间发送更多的促销材料。"他解释说。 + +AI正在改变了我们怎样花钱和为什么花钱,但是AI是怎样改变我们挣钱的方式的呢? + +### 2. 人工智能正在改变我们如何工作 + +[Fast公司][5]最近的一篇文章《这就是在2017年人工智能如何改变我们的生活》说道,求职者将会从人工智能中受益。作者解释说,除薪酬趋势更新之外,人工智能将被用来给求职者发送相关职位空缺信息。当你应该升职的时候,你就会得到一个升职的机会。 + +人造智能也将被公司用来帮助新入职的员工。文章解释说:“许多新员工在头几天内获得了大量信息,其中大部分不会被保留。” 相反,机器人可能会随着时间的推移向一名新员工“滴滴”,因为它变得更加相关。 + +[Inc.][7]的一篇文章[《没有偏见的企业:人工智能将如何重塑招聘机制》][8]着眼于人才管理解决方案提供商[SAP SuccessFactors][9]是怎样利用人工智能作为一个工作描述偏差检查器”和检查员工赔偿金的偏差。 + +[《Deloitte2017人力资本趋势报告》][10]显示,AI正在激励组织进行重组。Fast公司的文章[《AI是怎样改变公司组织的方式》][11]审查了这篇报告,该文章是基于全球10,000多名人力资源和商业领袖的调查结果。这篇文章解释说:"许多公司现在更注重文化和环境的适应性,而不是聘请最有资格的人来做某个具体任务,因为知道个人角色必须随AI的实施而发展 。" 为了适应不断变化的技术,组织也从自上而下的结构转向多学科团队,文章说。 + +###3. AI正在改变教育 + +> AI将使所有教育生态系统的利益相关者受益。 + +尽管教育的预算正在缩减,但是教室的规模却正在增长。因此利用技术的进步有助于提高教育体系的生产率和效率,并在提高教育质量和负担能力方面发挥作用。根据VentureBeat上的一篇文章[《2017年人工智能是怎样改变教育》][26],今年我们将看到AI对学生们的书面答案进行评分,机器人回答学生的答案,虚拟个人助理辅导学生等等。文章解释说:“AI将惠及教育生态系统的所有利益相关者。学生将能够通过即时的反馈和指导学习地更好,教师将获得丰富的学习分析和对个性化教学的见解,父母将以更低的成本看到他们的孩子的更好的职业前景,学校能够规模化优质的教育,政府能够向所有人提供可负担得起的教育。" + +### 4. 人工智能正在重塑医疗保健 + +2017年2月[CB Insights][12]的一篇文章挑选了106个医疗保健领域的人工智能初创公司,它们中的很多在过去几年中提高了第一次股权融资。这篇文章说:“在24家成像和诊断公司中,19家公司自2015年1月起就首次公开募股。”这份名单上了有那些从事于远程病人监测,药物发现和肿瘤学方面人工智能的公司。 + +3月16日发表在TechCrunch上的一篇关于AI进步如何重塑医疗保健的文章解释说:"一旦对人类的DNA有了更好的理解,就有机会更进一步,并能根据他们特殊的生活习性为他们提供个性化的见解"。这种趋势预示着“个性化遗传学”的新纪元,人们能够通过获得关于自己身体的前所未有的信息来充分控制自己的健康。" + +本文接着解释说,AI和机器学习降低了研发新药的成本和时间。部分得益于广泛的测试,新药进入市场需要12年以上的时间。这篇文章说:“机器学习算法可以让计算机根据先前处理的数据来"学习"如何做出预测,或者选择(在某些情况下,甚至是产品)需要做什么实验。类似的算法还可用于预测特定化合物对人体的副作用,这样可以加快审批速度。"这篇文章指出,2015年旧金山的一个创业公司[Atomwise][15]完成了对两种可以减少一天内Ebola感染的新药物。 + +> AI正在帮助发现、诊断和治疗新疾病。 + +另外一个位于伦敦的初创公司[BenevolentAI][27]正在利用人工智能寻找科学文献中的模式。这篇文章说:"最近,这家公司找到了两种可能对Alzheimer起作用的化合物,引起了很多制药公司的关注。" + +除了有助于研发新药,AI正在帮助发现、诊断和治疗新疾病。TechCrunch上 文章解释说,过去是根据显示的症状诊断疾病,但是现在AI正在被用于检测血液中的疾病特征,并利用对数十亿例临床病例分析进行深度学习获得经验来制定治疗计划。这篇文章说:“IBM的Watson正在与纽约的Memorial Sloan Kettering合作,消化理解数十年来关于癌症患者和治疗方面的数据,为了向治疗疑难的癌症病例的医生提供和建议治疗方案。” + +### 5. AI正在改变我们的爱情生活 + +有195个国家的超过5000万活跃用户通过一个在2012年推出的约会应用程序[Tinder][16]找到潜在的伴侣。在一篇[Forbes采访播客][17]中,Tinder的创始人兼董事长Sean Rad spoke与Steven Bertoni对人工智能是如何正在改变人们约会进行过讨论。在一篇[关于采访的文章][18]中,Bertoni引用了Rad说的话,他说:"可能有这样一个时刻,这时Tinder非常擅长推测你会感兴趣的人,Tinder在组织一次约会中可能会做很多跑腿的工作,对吧?"所以,这个app会向用户推荐一些附近的同伴,并更进一步,协调彼此的时间安排一次约会,而不只是向用户显示一些有可能的同伴。 + +> 我们的后代真的可能会爱上人工智能。 + +你爱上了AI吗?我们的后代真的可能会爱上人工智能。Raya Bidshahri发表在[Singularity Hub][19]的一篇文章《AI将如何重新定义爱情》说,几十年的后,我们可能会认为爱情不再受生物学的限制。 + +Bidshahri解释说:"我们的技术符合摩尔定律,正在以惊人的速度增长——智能设备正在越来越多地融入我们的生活。",他补充道:"到2029年,我们将会有和人类同等智慧的AI,而到21世纪40年代,AI将会比人类聪明无数倍。许多人预测,有一天我们会与强大的机器合并,我们自己可能会变成人工智能。"他认为在这样一个世界上那些是不可避免的,人们将会接受与完全的非生物相爱。 + +这听起来有点怪异,但是相比较于未来机器人将统治世界,爱上AI会是一个更乐观的结果。Bidshahri说:"对AI进行编程,让他们能够感受到爱,这将使我们创造出更富有同情心的AI,这可能也是避免很多人忧虑的AI大灾难的关键。" + +这份AI正在入侵我们生活各领域的其中五个方面的清单仅仅只是涉及到了我们身边的人工智能的表面。哪些AI创新是让你最兴奋的,或者是让你最烦恼的?大家可以在文章评论区写下你们的感受。 + +-------------------------------------------------------------------------------- + +Rikki Endsley - Rikki Endsley是开源社区Opensource.com的管理员。在过去,她曾做过Red Hat开源和标准(OSAS)团队社区传播者;自由技术记者;USENIX协会的社区管理员;linux权威杂志ADMIN和Ubuntu User的合作出版者,还是杂志Sys Admin和UnixReview.com的主编。在Twitter上关注她:@rikkiends。 + + + +via: https://opensource.com/article/17/3/5-big-ways-ai-rapidly-invading-our-lives + +作者:[Rikki Endsley ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/rikki-endsley +[1]:https://opensource.com/article/17/3/5-big-ways-ai-rapidly-invading-our-lives?rate=ORfqhKFu9dpA9aFfg-5Za9ZWGcBcx-f0cUlf_VZNeQs +[2]:https://www.linux.com/news/open-source-projects-are-transforming-machine-learning-and-ai +[3]:https://twitter.com/venturebeat +[4]:http://venturebeat.com/2017/03/16/how-ai-will-help-us-decipher-millennials/ +[5]:https://opensource.com/article/17/3/5-big-ways-ai-rapidly-invading-our-lives +[6]:https://www.fastcompany.com/3066620/this-is-how-ai-will-change-your-work-in-2017 +[7]:https://twitter.com/Inc +[8]:http://www.inc.com/bill-carmody/businesses-beyond-bias-how-ai-will-reshape-hiring-practices.html +[9]:https://www.successfactors.com/en_us.html +[10]:https://dupress.deloitte.com/dup-us-en/focus/human-capital-trends.html?id=us:2el:3pr:dup3575:awa:cons:022817:hct17 +[11]:https://www.fastcompany.com/3068492/how-ai-is-changing-the-way-companies-are-organized +[12]:https://twitter.com/CBinsights +[13]:https://www.cbinsights.com/blog/artificial-intelligence-startups-healthcare/ +[14]:https://techcrunch.com/2017/03/16/advances-in-ai-and-ml-are-reshaping-healthcare/ +[15]:http://www.atomwise.com/ +[16]:https://twitter.com/Tinder +[17]:https://www.forbes.com/podcasts/the-forbes-interview/#5e962e5624e1 +[18]:https://www.forbes.com/sites/stevenbertoni/2017/02/14/tinders-sean-rad-on-how-technology-and-artificial-intelligence-will-change-dating/#4180fc2e5b99 +[19]:https://twitter.com/singularityhub +[20]:https://singularityhub.com/2016/08/05/how-ai-will-redefine-love/ +[21]:https://opensource.com/user/23316/feed +[22]:https://opensource.com/article/17/3/5-big-ways-ai-rapidly-invading-our-lives#comments +[23]:https://twitter.com/raconteur +[24]:https://www.raconteur.net/technology/how-ai-will-change-buyer-behaviour +[25]:http://www.fluid.ai/ +[26]:http://venturebeat.com/2017/02/04/how-ai-will-transform-education-in-2017/ +[27]:https://twitter.com/benevolent_ai +[28]:https://opensource.com/users/rikki-endsley + From f432a2e092fb6bf544415be9c404ddcb3722fa29 Mon Sep 17 00:00:00 2001 From: Flynn Date: Mon, 8 May 2017 13:55:31 +0800 Subject: [PATCH 0023/1407] Translated --- ... Torvalds Good Taste Coding Requirement.md | 164 ------------------ ... Torvalds Good Taste Coding Requirement.md | 163 +++++++++++++++++ 2 files changed, 163 insertions(+), 164 deletions(-) delete mode 100644 sources/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md create mode 100644 translated/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md diff --git a/sources/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md b/sources/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md deleted file mode 100644 index d4d62d7021..0000000000 --- a/sources/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md +++ /dev/null @@ -1,164 +0,0 @@ -Translating by ucasFL -# Applying the Linus Torvalds “Good Taste” Coding Requirement - -In [a recent interview with Linus Torvalds][1], the creator of Linux, at approximately 14:20 in the interview, he made a quick point about coding with “good taste”. Good taste? The interviewer prodded him for details and Linus came prepared with illustrations. - -He presented a code snippet. But this wasn’t “good taste” code. This snippet was an example of poor taste in order to provide some initial contrast. - -![](https://d262ilb51hltx0.cloudfront.net/max/1200/1*X2VgEA_IkLvsCS-X4iPY7g.png) - -It’s a function, written in C, that removes an object from a linked list. It contains 10 lines of code. - -He called attention to the if-statement at the bottom. It was _this_ if-statement that he criticized. - -I paused the video and studied the slide. I had recently written code very similar. Linus was effectively saying I had poor taste. I swallowed my pride and continued the video. - -Linus explained to the audience, as I already knew, that when removing an object from a linked list, there are two cases to consider. If the object is at the start of the list there is a different process for its removal than if it is in the middle of the list. And this is the reason for the “poor taste” if-statement. - -But if he admits it is necessary, then why is it so bad? - -Next he revealed a second slide to the audience. This was his example of the same function, but written with “good taste”. - - ![](https://d262ilb51hltx0.cloudfront.net/max/1200/1*GHFLYFB3vDQeakMyUGPglw.png) - -The original 10 lines of code had now been reduced to 4. - -But it wasn’t the line count that mattered. It was that if-statement. It’s gone. No longer needed. The code has been refactored so that, regardless of the object’s position in the list, the same process is applied to remove it. - -Linus explained the new code, the elimination of the edge case, and that was it. The interview then moved on to the next topic. - -I studied the code for a moment. Linus was right. The second slide _was_better. If this was a test to determine good taste from poor taste, I would have failed. The thought that it may be possible to eliminate that conditional statement had never occurred to me. And I had written it more than once, since I commonly work with linked lists. - -What’s good about this illustration isn’t just that it teaches you a better way to remove an item from a linked list, but that it makes you consider that the code you’ve written, the little algorithms you’ve sprinkled throughout the program, may have room for improvement in ways you’ve never considered. - -So this was my focus as I went back and reviewed the code in my most recent project. Perhaps it was serendipitous that it also happened to be written in C. - -To the best of my ability to discern, the crux of the “good taste” requirement is the elimination of edge cases, which tend to reveal themselves as conditional statements. The fewer conditions you test for, the better your code “_tastes”_. - -Here is one particular example of an improvement I made that I wanted to share. - -Initializing Grid Edges - -Below is an algorithm I wrote to initialize the points along the edge of a grid, which is represented as a multidimensional array: grid[rows][cols]. - -Again, the purpose of this code was to only initialize the values of the points that reside on the edge of the grid — so only the top row, bottom row, left column, and right column. - -To accomplish this I initially looped over every point in the grid and used conditionals to test for the edges. This is what it looked like: - -```Tr -for (r = 0; r < GRID_SIZE; ++r) { - for (c = 0; c < GRID_SIZE; ++c) { -``` - -``` - // Top Edge - if (r == 0) - grid[r][c] = 0; -``` - -``` - // Left Edge - if (c == 0) - grid[r][c] = 0; -``` - -``` - // Right Edge - if (c == GRID_SIZE - 1) - grid[r][c] = 0; -``` - -``` - // Bottom Edge - if (r == GRID_SIZE - 1) - grid[r][c] = 0; - } -} -``` - -Even though it works, in hindsight, there are some issues with this construct. - -1. Complexity — The use 4 conditional statements inside 2 embedded loops seems overly complex. -2. Efficiency — Given that GRID_SIZE has a value of 64, this loop performs 4096 iterations in order to set values for only the 256 edge points. - -Linus would probably agree, this is not very _tasty_. - -So I did some tinkering with it. After a little bit I was able to reduce the complexity to only a single for_-_loop containing four conditionals. It was only a slight improvement in complexity, but a large improvement in performance, because it only performed 256 loop iterations, one for each point along the edge. - -``` -for (i = 0; i < GRID_SIZE * 4; ++i) { -``` - -``` - // Top Edge - if (i < GRID_SIZE) - grid[0][i] = 0; -``` - -``` - // Right Edge - else if (i < GRID_SIZE * 2) - grid[i - GRID_SIZE][GRID_SIZE - 1] = 0; -``` - -``` - // Left Edge - else if (i < GRID_SIZE * 3) - grid[i - (GRID_SIZE * 2)][0] = 0; -``` - -``` - // Bottom Edge - else - grid[GRID_SIZE - 1][i - (GRID_SIZE * 3)] = 0; -} -``` - -An improvement, yes. But it looked really ugly. It’s not exactly code that is easy to follow. Based on that alone, I wasn’t satisfied. - -I continued to tinker. Could this really be improved further? In fact, the answer was _YES_. And what I eventually came up with was so astoundingly simple and elegant that I honestly couldn’t believe it took me this long to find it. - -Below is the final version of the code. It has _one for-loop_ and _no conditionals_. Moreover, the loop only performs 64 iterations. It vastly improves both complexity and efficiency. - -``` -for (i = 0; i < GRID_SIZE; ++i) { -``` - -``` - // Top Edge - grid[0][i] = 0; - - // Bottom Edge - grid[GRID_SIZE - 1][i] = 0; -``` - -``` - // Left Edge - grid[i][0] = 0; -``` - -``` - // Right Edge - grid[i][GRID_SIZE - 1] = 0; -} -``` - -This code initializes four different edge points for each loop iteration. It’s not complex. It’s highly efficient. It’s easy to read. Compared to the original version, and even the second version, they are like night and day. - -I was quite satisfied. - - --------------------------------------------------------------------------------- - -via: https://medium.com/@bartobri/applying-the-linus-tarvolds-good-taste-coding-requirement-99749f37684a - -作者:[Brian Barto][a] - -译者:[译者ID](https://github.com/译者ID) - -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://medium.com/@bartobri?source=post_header_lockup -[1]:https://www.ted.com/talks/linus_torvalds_the_mind_behind_linux diff --git a/translated/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md b/translated/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md new file mode 100644 index 0000000000..be03510e3c --- /dev/null +++ b/translated/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md @@ -0,0 +1,163 @@ +# 像 Linus Torvalds 学习让编出的代码具有“good taste” + +在[最近关于 Linus Torvalds 的一个采访中][1],这位 Linux 的创始人,在采访过程中大约 14:20 的时候,快速的指出了关于代码的 "good taste"。good taste?采访者请他展示更多的细节,于是,Linus Torvalds 展示了一张提前准备好的插图。 + +这张插图中展示了一个代码片段。但这段代码并没有 “good taste”。这是一个具有 “poor taste” 的代码片段,把它作为例子,以提供一些初步的比较。 + +![](https://d262ilb51hltx0.cloudfront.net/max/1200/1*X2VgEA_IkLvsCS-X4iPY7g.png) + +这是一个用 C 写的函数,作用是删除链表中的一个对象,它包含有 10 行代码。 + +他把注意力集中在底部的 if 语句。正是这个 if 语句受到他的批判。 + +我暂停视频,开始研究幻灯片。我发现我最近有写过和这很像的代码。Linus 不就是在说我的代码品味很差吗?我吞下自尊,继续观看视频。 + +随后, Linus 向观众解释,正如我们所知道的,当从链表中删除一个对象时,需要考虑两种可能的情况。当所需删除的对象位于链表的表头时,删除过程和位于链表中间的情况不同。这就是这个 if 语句具有 "poor taste" 的原因。 + +但既然他承认考虑这两种不同的情况是必要的,那为什么像上面那样写如此糟糕呢? + +接下来,他又向观众展示了第二张幻灯片。这个幻灯片展示的是实现同样功能的一个函数,但这段代码具有 “goog taste” 。 + + ![](https://d262ilb51hltx0.cloudfront.net/max/1200/1*GHFLYFB3vDQeakMyUGPglw.png) + +原先的 10 行代码现在减少为 4 行。 + +但代码的行数并不重要,关键是 if 语句,它不见了,因为不再需要了。代码已经被重构,所以,尽管对象的地址还在列表中,但已经运用同样的操作把它删除了。 + +Linus 解释了一下新的代码,它消除了边缘情况,就是这样。然后采访转入了下一个话题。 + +我琢磨了一会这段代码。 Linus 是对的,的确,第二个函数更好。如果这是一个确定代码具有 “good taste” 还是 “bad taste” 的测试,那么很遗憾,我失败了。我从未想到过有可能能够去除条件语句。我写过不止一次这样的 if 语句,因为我经常使用链表。 + +这个例子的启发,不仅仅是教给了我们一个从链表中删除对象的更好方法,而是启发了我们去考虑自己写的代码。你通过程序实现的一个简单算法,可能还有改进的空间,只是你从来没有考虑过。 + +以这种方式,我回去审查最近正在做的项目的代码。也许是一个巧合,刚好也是用 C 写的。 + +我尽最大的能力去审查代码,“good taste” 的一个基本要求是关于边缘情况的消除方法,通常我们会使用条件语句来消除边缘情况。然而,你的测试使用的条件语句越少,你的代码就会有更好的 “tastes” 。 + +下面,我将分享一个通过审查代码进行了改进的一个特殊例子。 + +这是一个关于初始化网格边缘的算法。 + +下面所写的是一个用来初始化 grid 的网格边缘的算法,gird 表示一个二维数组:grid[行][列] + +再次说明,这段代码的目的只是用来初始化位于 grid 边缘的点的值,所以,只需要给最上方一行、最下方一行、最左边一列以及最右边一列赋值即可。 + +为了完成这件事,我通过循环遍历 grid 中的每一个点,然后使用条件语句来测试该点是否位于边缘。代码看起来就是下面这样: + +```Tr +for (r = 0; r < GRID_SIZE; ++r) { + for (c = 0; c < GRID_SIZE; ++c) { +``` + +``` + // Top Edge + if (r == 0) + grid[r][c] = 0; +``` + +``` + // Left Edge + if (c == 0) + grid[r][c] = 0; +``` + +``` + // Right Edge + if (c == GRID_SIZE - 1) + grid[r][c] = 0; +``` + +``` + // Bottom Edge + if (r == GRID_SIZE - 1) + grid[r][c] = 0; + } +} +``` + +虽然这样做是对的,但回过头来看,这个结构存在一些问题。 + +1. 复杂性 — 在双层循环里面使用 4 个条件语句似乎过于复杂。 +2. 高效性 — 假设 GRID_SIZE 的值为 64,那么这个循环需要执行 4096 次,但需要进行赋值的只有位于边缘的 256 个点。 + +用 Linus 的眼光来看,将会认为这段代码没有 “good taste” 。 + +所以,我对上面的问题进行了一下思考。经过一番思考,我把复杂度减少为包含四个条件语句的单层循环。虽然只是稍微改进了一下复杂性,但在性能上也有了极大的提高,因为它只是沿着边缘的点进行了 256 次循环。 + +``` +for (i = 0; i < GRID_SIZE * 4; ++i) { +``` + +``` + // Top Edge + if (i < GRID_SIZE) + grid[0][i] = 0; +``` + +``` + // Right Edge + else if (i < GRID_SIZE * 2) + grid[i - GRID_SIZE][GRID_SIZE - 1] = 0; +``` + +``` + // Left Edge + else if (i < GRID_SIZE * 3) + grid[i - (GRID_SIZE * 2)][0] = 0; +``` + +``` + // Bottom Edge + else + grid[GRID_SIZE - 1][i - (GRID_SIZE * 3)] = 0; +} +``` + +的确是一个很大的提高。但是它看起来很丑,并不是易于遵循的代码。基于这一点,我并不满意。 + +我继续思考,是否可以进一步改进呢?事实上,答案是 YES!最后,我想出了一个非常简单且优雅的算法,老实说,我不敢相信我会花了那么长时间才发现这个算法。 + +下面是这段代码的最后版本。它只有一层循环并且没有条件语句。另外。循环只执行了 64 次迭代,极大的改善了复杂性和高效性。 + +``` +for (i = 0; i < GRID_SIZE; ++i) { +``` + +``` + // Top Edge + grid[0][i] = 0; + + // Bottom Edge + grid[GRID_SIZE - 1][i] = 0; +``` + +``` + // Left Edge + grid[i][0] = 0; +``` + +``` + // Right Edge + grid[i][GRID_SIZE - 1] = 0; +} +``` + +这段代码通过单层循环迭代来初始化四条边缘上的点。它并不复杂,而且非常高效,易于阅读。和原始的版本,甚至是第二个版本相比,都有天壤之别。 + +至此,我已经非常满意了。 + + +-------------------------------------------------------------------------------- + +via: https://medium.com/@bartobri/applying-the-linus-tarvolds-good-taste-coding-requirement-99749f37684a + +作者:[Brian Barto][a] + +译者:[ucasFL](https://github.com/ucasFL) + +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://medium.com/@bartobri?source=post_header_lockup +[1]:https://www.ted.com/talks/linus_torvalds_the_mind_behind_linux From 723ba5e3c60d29f4c136f16b9c9a10d861c9f56a Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 8 May 2017 15:35:49 +0800 Subject: [PATCH 0024/1407] =?UTF-8?q?PRF&PUB:20170415=20bd=20=E2=80=93=20Q?= =?UTF-8?q?uickly=20Go=20Back=20to=20a=20Parent=20Directory.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @geekpi --- ...– Quickly Go Back to a Parent Directory.md | 33 +++++++++---------- 1 file changed, 16 insertions(+), 17 deletions(-) rename {translated/tech => published}/20170415 bd – Quickly Go Back to a Parent Directory.md (79%) diff --git a/translated/tech/20170415 bd – Quickly Go Back to a Parent Directory.md b/published/20170415 bd – Quickly Go Back to a Parent Directory.md similarity index 79% rename from translated/tech/20170415 bd – Quickly Go Back to a Parent Directory.md rename to published/20170415 bd – Quickly Go Back to a Parent Directory.md index b64455511f..bd7b1e2230 100644 --- a/translated/tech/20170415 bd – Quickly Go Back to a Parent Directory.md +++ b/published/20170415 bd – Quickly Go Back to a Parent Directory.md @@ -1,8 +1,7 @@ -bd - 快速返回到父目录而不用冗余地输入 “cd ../../ ..” +bd:快速返回某级父目录而不用冗余地输入 “cd ../../..” ============================================================ - -在 Linux 系统上通过命令行切换文件夹时,为了回到父目录(长路径),我们通常会重复输入[ cd 命令][1](`cd ../../..`),直到进入感兴趣的目录。 +在 Linux 系统上通过命令行切换文件夹时,为了回到父目录(长路径),我们通常会重复输入 [cd 命令][1](`cd ../../..`),直到进入感兴趣的目录。 对于经验丰富的 Linux 用户或需要进行各种不同任务的系统管理员而言,这可能非常乏味,因此希望在操作系统时有一个快捷方式来简化工作。 @@ -14,7 +13,7 @@ bd 是用于切换文件夹的便利工具,它可以使你快速返回到父 ### 如何在 Linux 中安装 bd -运行下面的命令,使用[ wget 命令][3]下载并安装 bd 到 `/usr/bin/` 中,添加执行权限,并在 `~/.bashrc` 中创建需要的别名: +运行下面的命令,使用 [wget 命令][3]下载并安装 bd 到 `/usr/bin/` 中,添加执行权限,并在 `~/.bashrc` 中创建需要的别名: ``` $ wget --no-check-certificate -O /usr/bin/bd https://raw.github.com/vigneshwaranr/bd/master/bd @@ -23,7 +22,7 @@ $ echo 'alias bd=". bd -si" >> ~/.bashrc $ source ~/.bashrc ``` -注意:要启用大小写敏感的目录名匹配,在上面创建的别名中,设置  `-s` 标志而不是 `-si` 标志。 +注意:如果要启用大小写敏感的目录名匹配,请在上面创建的别名中,设置  `-s` 标志而不是 `-si` 标志。 要启用自动补全支持,运行这些命令: @@ -55,7 +54,7 @@ $ bd Data ![Switch Between Directories Quickly](http://www.tecmint.com/wp-content/uploads/2017/03/Switch-Between-Directories-Quickly.png) ][4] -目录间快速切换 +*目录间快速切换* 实际上,bd 让它变得更加直接,你要做的是输入 “bd <开头几个字母>”,比如: @@ -67,9 +66,9 @@ $ bd Da ![Quickly Switch Directories](http://www.tecmint.com/wp-content/uploads/2017/03/Quickly-Switch-Directories.png) ][5] -快速切换目录 +*快速切换目录* -重要:如果层次结构中有不止一个具有相同名称的目录,bd 将会移动到最接近的目录,而不考虑最接近的父目录,如下面的例子那样。 +重要:如果层次结构中有不止一个具有相同名称的目录,bd 将会移动到最接近的目录,而不考虑最近的父目录,如下面的例子那样。 例如,在上面的路径中,有两个名称相同的目录 Books,如果你想移动到: @@ -77,7 +76,7 @@ $ bd Da /media/aaronkilik/Data/ComputerScience/Documents/Books/LEARN/Linux/Books ``` -输入 “bd Books” 会进入: +输入 `bd Books` 会进入: ``` /media/aaronkilik/Data/ComputerScience/Documents/Books @@ -86,11 +85,11 @@ $ bd Da ![Move to 'Books' Directory Quickly](http://www.tecmint.com/wp-content/uploads/2017/03/Move-to-Directory-Quickly.png) ][6] -快速进入 ‘Books’ 目录 +*快速进入 ‘Books’ 目录* -另外,在引号中使用 bd 如 ``bd `` 会打印出路径而不更改当前目录,所以你可以与其他常见的 Linux 命令,如 [ls][7],[echo][8] 等一起使用 ``bd ` 。 +另外,在引号中使用 bd 如 ``bd <开头几个字母>`` 会打印出路径而不更改当前目录,所以你可以与其他常见的 Linux 命令,如 [ls][7],[echo][8] 等一起使用 ``bd <开头几个字母>`` 。 -在下面的例子中,当前在 /var/www/html/internship/assets/filetree 目录中,要打印出绝对路径、详细列出内容、统计目录 html 中所有文件的大小,你不必进入它,只需要键入: +在下面的例子中,当前在 `/var/www/html/internship/assets/filetree` 目录中,要打印出绝对路径、详细列出内容、统计目录 html 中所有文件的大小,你不必进入它,只需要键入: ``` $ echo `bd ht` @@ -101,7 +100,7 @@ $ du -cs `bd ht` ![Switch Directory with Listing](http://www.tecmint.com/wp-content/uploads/2017/03/Switch-Directory-with-Listing.png) ][9] -列出切换的目录 +*列出切换的目录* 要在 Github 上了解更多关于 bd 的信息:[https://github.com/vigneshwaranr/bd][10] @@ -119,15 +118,15 @@ Aaron Kili是一名 Linux 和 F.O.S.S 的爱好者,未来的 Linux 系统管 via: http://www.tecmint.com/bd-quickly-go-back-to-a-linux-parent-directory/ -作者:[Aaron Kili ][a] +作者:[Aaron Kili][a] 译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 [a]:http://www.tecmint.com/author/aaronkili/ [1]:http://www.tecmint.com/cd-command-in-linux/ -[2]:http://www.tecmint.com/autojump-a-quickest-way-to-navigate-linux-filesystem/ +[2]:https://linux.cn/article-5983-1.html [3]:http://www.tecmint.com/10-wget-command-examples-in-linux/ [4]:http://www.tecmint.com/wp-content/uploads/2017/03/Switch-Between-Directories-Quickly.png [5]:http://www.tecmint.com/wp-content/uploads/2017/03/Quickly-Switch-Directories.png @@ -136,7 +135,7 @@ via: http://www.tecmint.com/bd-quickly-go-back-to-a-linux-parent-directory/ [8]:http://www.tecmint.com/echo-command-in-linux/ [9]:http://www.tecmint.com/wp-content/uploads/2017/03/Switch-Directory-with-Listing.png [10]:https://github.com/vigneshwaranr/bd -[11]:http://www.tecmint.com/autojump-a-quickest-way-to-navigate-linux-filesystem/ +[11]:https://linux.cn/article-5983-1.html [12]:http://www.tecmint.com/author/aaronkili/ [13]:http://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ [14]:http://www.tecmint.com/free-linux-shell-scripting-books/ From bf61487f7407f312b7a4e9432f0d2c91258aba80 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 9 May 2017 08:43:55 +0800 Subject: [PATCH 0025/1407] PRF&PUB:20170430 How to Install Discord on Ubuntu Linux.md @geekpi --- ... How to Install Discord on Ubuntu Linux.md | 21 +++++++++---------- 1 file changed, 10 insertions(+), 11 deletions(-) rename {translated/tech => published}/20170430 How to Install Discord on Ubuntu Linux.md (79%) diff --git a/translated/tech/20170430 How to Install Discord on Ubuntu Linux.md b/published/20170430 How to Install Discord on Ubuntu Linux.md similarity index 79% rename from translated/tech/20170430 How to Install Discord on Ubuntu Linux.md rename to published/20170430 How to Install Discord on Ubuntu Linux.md index 557a257305..6cdbd0e494 100644 --- a/translated/tech/20170430 How to Install Discord on Ubuntu Linux.md +++ b/published/20170430 How to Install Discord on Ubuntu Linux.md @@ -1,14 +1,13 @@ -如何在 Ubuntu 中安装 Discord +如何在 Ubuntu 中安装语音聊天工具 Discord ============================================================ ![](https://www.maketecheasier.com/assets/uploads/2017/04/discord-feat.jpg "How to Install Discord on Ubuntu Linuxs") +Discord 是一个非常受欢迎的文字和语音聊天程序。虽然开始时主要面向游戏玩家,但它几乎获得了所有人的了广泛青睐。 -Discord 是一个非常受欢迎的文字和语音聊天程序。虽然开始了主要面向游戏玩家,但它几乎获得了所有人的了广泛青睐。 +Discord 不仅仅是一个很好的聊天客户端。当你安装它时,你还可以获得其强大的服务端功能,强力而自足。游戏玩家和非玩家都可以在几分钟内开启自己的私人聊天服务,这使 Discord 成为团队、公会和各种社区的明显选择。 -Discord 不仅仅是一个很好的聊天客户端。当你安装它时,你还可以获得其强大的服务端功能,包括电池。游戏玩家和非玩家都可以在几分钟内开启自己的私人聊天服务,这使 Discord 成为团队、公会和各种社区的明显选择。 - -Linux 用户经常在游戏世界中被遗忘。但 Discord 并不是这样。它的开发人员也在 Linux 下积极构建并维护其流行聊天平台。Ubuntu 用户拥有更好的功能。Discord 捆绑在方便的 Debian/Ubuntu .deb 包中。 +Linux 用户经常被游戏世界遗忘。但 Discord 并不是这样。它的开发人员也在 Linux 下积极构建并维护其流行聊天平台。Ubuntu 用户甚至拥有更好的待遇,Discord 捆绑在方便的 Debian/Ubuntu .deb 包中。 ### 获取并安装软件包 @@ -46,7 +45,7 @@ sudo apt install libgconf-2-4 libappindicator1 ### 命令行安装 -懒惰的 Linux 熟手并不在意花哨的 GUI 工具。如果你是这个阵营的人,那么你有一个更直接的命令行选项。 +“懒惰”的 Linux 熟手并不在意花哨的 GUI 工具。如果你是这个阵营的人,那么你有一个更直接的命令行选项。 首先,打开一个终端并进入你的下载目录。在那里可以使用 `wget` 直接下载 .deb 包。 @@ -55,7 +54,7 @@ cd ~/Downloads wget -O discord-0.0.1.deb https://discordapp.com/api/download?platform=linux&format=deb ``` -下载完成后,你可以使用 dpkg 直接安装 .deb 软件包。运行下面的命令: +下载完成后,你可以使用 `dpkg` 直接安装 .deb 软件包。运行下面的命令: ``` sudo dpkg -i discord-0.0.1.deb @@ -69,19 +68,19 @@ sudo dpkg -i discord-0.0.1.deb ![Login to Discord on Ubuntu](https://www.maketecheasier.com/assets/uploads/2017/04/discord-login.jpg "Login to Discord on Ubuntu") -首次启动,你需要创建一个帐户或者登录。做任意一个你需要做的。 +首次启动,根据你需求,创建一个帐户或者登录。 ![Discord running on Ubuntu Linux](https://www.maketecheasier.com/assets/uploads/2017/04/discord-running.jpg "Discord running on Ubuntu Linux") -登录后,你就进入 Discord 了。它会提供一些介绍教程和建议。你可以直接略过开始尝试。欢迎进入你新的 Linux 聊天体验! +登录后,你就进入 Discord 了。它会提供一些介绍教程和建议。你可以直接略过并开始尝试。欢迎进入你新的 Linux 聊天体验! -------------------------------------------------------------------------------- via: https://www.maketecheasier.com/install-discord-ubuntu/ -作者:[ Nick Congleton][a] +作者:[Nick Congleton][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/) 荣誉推出 From 182d60b937fbc4a0aafc76a15cee9fd6538306a0 Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 9 May 2017 08:57:19 +0800 Subject: [PATCH 0026/1407] translating --- .../tech/20170206 Oracle Policy Change Raises Prices on AWS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170206 Oracle Policy Change Raises Prices on AWS.md b/sources/tech/20170206 Oracle Policy Change Raises Prices on AWS.md index 53de41aac2..2b7541fc84 100644 --- a/sources/tech/20170206 Oracle Policy Change Raises Prices on AWS.md +++ b/sources/tech/20170206 Oracle Policy Change Raises Prices on AWS.md @@ -1,3 +1,5 @@ +translating--geekpi + Oracle Policy Change Raises Prices on AWS ============================================================ From 04563103b340412a146b1be7a886074dd216cbfc Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 9 May 2017 09:07:38 +0800 Subject: [PATCH 0027/1407] =?UTF-8?q?PRF&PUB:20170403=20Remmina=20?= =?UTF-8?q?=E2=80=93=20A=20Feature=20Rich=20Remote=20Desktop=20Sharing=20T?= =?UTF-8?q?ool=20for=20Linux.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @geekpi --- ...ich Remote Desktop Sharing Tool for Linux.md | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) rename {translated/tech => published}/20170403 Remmina – A Feature Rich Remote Desktop Sharing Tool for Linux.md (86%) diff --git a/translated/tech/20170403 Remmina – A Feature Rich Remote Desktop Sharing Tool for Linux.md b/published/20170403 Remmina – A Feature Rich Remote Desktop Sharing Tool for Linux.md similarity index 86% rename from translated/tech/20170403 Remmina – A Feature Rich Remote Desktop Sharing Tool for Linux.md rename to published/20170403 Remmina – A Feature Rich Remote Desktop Sharing Tool for Linux.md index dc4343dc5e..02c74b451c 100644 --- a/translated/tech/20170403 Remmina – A Feature Rich Remote Desktop Sharing Tool for Linux.md +++ b/published/20170403 Remmina – A Feature Rich Remote Desktop Sharing Tool for Linux.md @@ -1,24 +1,24 @@ -Remmina - 一个 Linux 下功能丰富的远程桌面共享工具 +Remmina:一个 Linux 下功能丰富的远程桌面共享工具 ============================================================ -**Remmina** 是一款在 Linux 和其他类 Unix 系统下的免费开源、功能丰富、强大的远程桌面客户端,它用 GTK+ 3 编写而成。它适用于那些需要远程访问及使用许多计算机的系统管理员和在外出行人员。 +**Remmina** 是一款在 Linux 和其他类 Unix 系统下的自由开源、功能丰富、强大的远程桌面客户端,它用 GTK+ 3 编写而成。它适用于那些需要远程访问及使用许多计算机的系统管理员和在外出行人员。 -它以简单、统一、同一性、易于使用的用户界面支持多种网络协议。 +它以简单、统一、同质、易用的用户界面支持多种网络协议。 -#### Remmina 功能 +### Remmina 功能 * 支持 RDP、VNC、NX、XDMCP 和 SSH。 * 用户能够以组的形式维护一份连接配置列表。 * 支持用户直接输入服务器地址的快速连接。 *   具有更高分辨率的远程桌面,可以在窗口和全屏模式下滚动/缩放。 * 支持窗口全屏模式;当鼠标移动到屏幕边缘时,远程桌面会自动滚动。 -* 还支持全屏模式浮动工具栏;使你能够在不同模式间切换、触发键盘获取、最小化等。 -* 提供选项卡式界面,可选择由组管理。 +* 还支持全屏模式的浮动工具栏;使你能够在不同模式间切换、触发键盘获取、最小化等。 +* 提供选项卡式界面,可以按组管理。 * 还提供托盘图标,允许你快速访问已配置的连接文件。 在本文中,我们将向你展示如何在 Linux 中安装 Remmina,以及使用它通过支持的不同协议实现桌面共享。 -#### 先决条件 +### 先决条件 * 在远程机器上允许桌面共享(让远程机器允许远程连接)。 * 在远程机器上设置 SSH 服务。 @@ -43,7 +43,7 @@ $ sudo dnf copr enable hubbitus/remmina-next $ sudo dnf upgrade --refresh 'remmina*' 'freerdp*' ``` -一旦安装完成后,在 Ubuntu 或 Linux Mint 菜单中搜索 **remmina**,接着运行它: +一旦安装完成后,在 Ubuntu 或 Linux Mint 菜单中搜索 `remmina`,接着运行它: [ ![Remmina Desktop Sharing Client](http://www.tecmint.com/wp-content/uploads/2017/03/Remmina-Desktop-Sharing-Client.png) @@ -53,7 +53,7 @@ $ sudo dnf upgrade --refresh 'remmina*' 'freerdp*' 你可以通过图形界面或者编辑 `$HOME/.remmina` 或者 `$HOME/.config/remmina` 下的文件来进行配置。 -要设置到一个新的远程服务器的连接,按下 `[Ctrl+N]` 并点击 **Connection -> New**,如下截图中配置远程连接。这是基本的设置界面。 +要设置到一个新的远程服务器的连接,按下 `Ctrl+N` 并点击 **Connection -> New**,如下截图中配置远程连接。这是基本的设置界面。 [ ![Remmina Basic Desktop Preferences](http://www.tecmint.com/wp-content/uploads/2017/03/Remmina-Basic-Desktop-Preferences.png) @@ -87,7 +87,7 @@ $ sudo dnf upgrade --refresh 'remmina*' 'freerdp*' #### 使用 sFTP 连接到远程机器 -选择连接配置并编辑设置,在 “**Protocols**” 下拉菜单中选择 **sFTP - 安全文件传输**。接着设置启动路径(可选),并指定 SSH 验证细节。最后点击**连接**。 +选择连接配置并编辑设置,在 “**Protocols**” 下拉菜单中选择 **sFTP - Secure File Transfer**。接着设置启动路径(可选),并指定 SSH 验证细节。最后点击**连接**。 [ ![Remmina sftp Connection](http://www.tecmint.com/wp-content/uploads/2017/03/Remmina-sftp-connection.png) @@ -103,7 +103,7 @@ $ sudo dnf upgrade --refresh 'remmina*' 'freerdp*' *输入 SSH 密码* -如果你看到下面的界面,那么代表 SFTP 连接成功了,你现在可以[在两台机器键传输文件了][8]。 +如果你看到下面的界面,那么代表 sFTP 连接成功了,你现在可以[在两台机器键传输文件了][8]。 [ ![Remmina Remote sFTP Filesystem](http://www.tecmint.com/wp-content/uploads/2017/03/Remmina-Remote-sFTP-Filesystem.png) @@ -131,7 +131,7 @@ $ sudo dnf upgrade --refresh 'remmina*' 'freerdp*' #### 使用 VNC 连接到远程机器 -选择连接配置并编辑设置,在 “**Protocols**” 下拉菜单中选择 **VNC - 虚拟网络计算**。为连接配置基础、高级以及 ssh 设置,点击**连接**,接着输入用户 SSH 密码。 +选择连接配置并编辑设置,在 “**Protocols**” 下拉菜单中选择 **VNC - Virtual Network Computing**。为该连接配置基础、高级以及 ssh 设置,点击**连接**,接着输入用户 SSH 密码。 [ ![Remmina VNC Connection](http://www.tecmint.com/wp-content/uploads/2017/03/Remmina-VNC-Connection.png) @@ -172,7 +172,7 @@ via: http://www.tecmint.com/remmina-remote-desktop-sharing-and-ssh-client/ 作者:[Aaron Kili][a] 译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From b06020c8017841a72c691473aad145ab19017be4 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 9 May 2017 09:08:33 +0800 Subject: [PATCH 0028/1407] =?UTF-8?q?=E6=A0=A1=E5=AF=B9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20161025 GitLab Workflow An Overview.md | 98 ++++++------------- 1 file changed, 31 insertions(+), 67 deletions(-) diff --git a/translated/tech/20161025 GitLab Workflow An Overview.md b/translated/tech/20161025 GitLab Workflow An Overview.md index 70abe479f0..b4421ffd6a 100644 --- a/translated/tech/20161025 GitLab Workflow An Overview.md +++ b/translated/tech/20161025 GitLab Workflow An Overview.md @@ -1,107 +1,71 @@ -GitLab工作流:概览 +GitLab 工作流概览 ====== -GitLab是一个基于git的仓库管理程序,也是一个方便软件开发的强大完整应用。 +GitLab 是一个基于 git 的仓库管理程序,也是一个方便软件开发的强大完整应用。 -GitLab拥有一个”用户新人友好“的界面,通过自由图形和命令行界面,使你的工作更加具有效率。GitLab不仅仅对开发者是一个有用的工具,它甚至可以被集成到你的整个团队中,使得每一个人获得一个唯一的平台。 +GitLab 拥有一个“用户新人友好”的界面,通过图形界面和命令行界面,使你的工作更加具有效率。GitLab 不仅仅对开发者是一个有用的工具,它甚至可以被集成到你的整个团队中,使得每一个人获得一个独自唯一的平台。 -GitLab工作流逻辑符合使用者思维,使得整个平台变得更加易用。相信我,使用一次,你就离不开它了! - -* * * - -### 在这篇文章中 - -* [GitLab工作流][53] - * [软件开发阶段][22] -* [GitLab工单跟踪][52] - * [秘密工单][21] - * [截止日期][20] - * [委托人][19] - * [标签][18] - * [工单重要性][17] - * [GitLab工单看板][16] -* [GitLab中的代码审查][51] - * [第一次提交][15] - * [合并请求][14] - * [WIP MR][13] - * [审查][12] -* [建立,测试以及部署][50] - * [Koding][11] - * [用户案例][10] -* [反馈: 循环分析][49] -* [增强][48] - * [工单 & MR模版][9] - * [里程碑][8] -* [高级技巧][47] - * [对于工单 & MRs][7] - * [订阅][3] - * [添加 TO-DO][2] - * [搜索你的工单 & MRs][1] - * [转移工单][6] - * [代码片段][5] -* [GitLab 工作流 用户案例 梗概][46] -* [尾声][45] - -* * * +GitLab 工作流逻辑符合使用者思维,使得整个平台变得更加易用。相信我,使用一次,你就离不开它了! ### GitLab 工作流 -**GitLab 工作流** 使用GitLab作为平台管理你的代码,它是一系列具有逻辑可能性的过程——这个逻辑过程依据软件开发的生命周期来制定。 +**GitLab 工作流** 使用 GitLab 作为平台管理你的代码,它是一系列具有逻辑可能性的过程——这个逻辑过程依据软件开发的生命周期来制定。 -GitLab 工作流考虑到[GitLab Flow][97],是由一系列由**基于Git**的方法和策略组成的,这些方法为版本的管理,例如**分支策略**,**Git最佳实践**等等提供了保障。 +GitLab 工作流遵循了 [GitLab Flow][97] 策略,这是由一系列由**基于 Git** 的方法和策略组成的,这些方法为版本的管理,例如**分支策略**,**Git最佳实践**等等提供了保障。 -通过GitLab工作流,可以很方便的提升团队的工作效率以及凝聚力。这种提升,在引入一个新的项目的开始,一直到发布这个项目,成为一个产品都有所体现。这就是我们所说的“如何通过最快的速度把一个点子在10步之内变成一个产品”。 +通过 GitLab 工作流,可以很方便的[提升](https://about.gitlab.com/2016/09/13/gitlab-master-plan/)团队的工作效率以及凝聚力。这种提升,从引入一个新的项目开始,一直到发布这个项目,成为一个产品都有所体现。这就是我们所说的“如何通过最快的速度把一个点子在 10 步之内变成一个产品”。 ![FROM IDEA TO PRODUCTION IN 10 STEPS](https://about.gitlab.com/images/blogimages/idea-to-production-10-steps.png) -### 软件开发阶段 +#### 软件开发阶段 -一般情况下,软件开发经过10个主要阶段;GitLab为这10个阶段依次提供了解决方案: +一般情况下,软件开发经过 10 个主要阶段;GitLab 为这 10 个阶段依次提供了解决方案: -1. **IDEA:** 每一个从点子开始的项目,通常来源于一次闲聊。在这个阶段,GitLab集成了[Mattermost][44]。 -2. **ISSUE:** 最有效的讨论一个点子的方法,就是为这个点子建立一个工单讨论。你的团队和你的合作伙伴可以帮助你去提升这个点子,通过[issue tracker][43] -3. **PLAN:** 一旦讨论得到一致的同意,就是开始编码的时候了。但是等等!首先,我们需要优先考虑组织我们的工作流。对于此,我们可以使用[Issue Board][42]。 -4. **CODE:** 现在,当一切准备就绪,我们可以开始写代码了。 -5. **COMMIT:** 当我们为我们的草稿欢呼的时候,我们就可以在版本控制下,提交代码到功能分支了。 -6. **TEST:** 通过[GitLab CI][41],我们可以运行脚本来创建和测试我们的应用 -7. **REVIEW:** 一旦脚本成功运行,我们的创建和测试成功,我们就可以进行[code review][40]以及批准。 -8. **STAGING:** 现在是时候[将我们的代码部署到演示环境][39]来检查一下,是否一切就像我们预估的那样顺畅——或者我们可能仍然需要修改。 -9. **PRODUCTION:** 当项目已经运行的时分通畅,就是[部署到生产环境][38]的时候了! -10. **FEEDBACK**: 现在是时候翻回去看我们能在项目中提升的部分了。我们使用[循环分析][37]来对当前项目中关键的部分进行的反馈。 +1. **IDEA**: 每一个从点子开始的项目,通常来源于一次闲聊。在这个阶段,GitLab 集成了 [Mattermost][44]。 +2. **ISSUE**: 最有效的讨论一个点子的方法,就是为这个点子建立一个工单讨论。你的团队和你的合作伙伴可以帮助你去提升这个点子,通过 [issue tracker][43] +3. **PLAN**: 一旦讨论得到一致的同意,就是开始编码的时候了。但是等等!首先,我们需要优先考虑组织我们的工作流。对于此,我们可以使用 [Issue Board][42]。 +4. **CODE**: 现在,当一切准备就绪,我们可以开始写代码了。 +5. **COMMIT**: 当我们为我们的初步成果欢呼的时候,我们就可以在版本控制下,提交代码到功能分支了。 +6. **TEST**: 通过 [GitLab CI][41],我们可以运行脚本来创建和测试我们的应用 +7. **REVIEW**: 一旦脚本成功运行,我们测试和构建成功,我们就可以进行 [code review][40] 以及批准。 +8. **STAGING:**: 现在是时候[将我们的代码部署到演示环境][39]来检查一下,是否一切就像我们预估的那样顺畅——或者我们可能仍然需要修改。 +9. **PRODUCTION**: 当项目已经运行的十分通畅,就是[部署到生产环境][38]的时候了! +10. **FEEDBACK**: 现在是时候翻回去看我们能在项目中提升的部分了。我们使用[循环分析][37]来对当前项目中关键的部分进行的反馈。 -简单浏览这些步骤,我们可以发现,提供强大的工具来支持这些步骤是十分重要的。在接下来的部分,我们为GitLab的可用工具提供一个简单的概览。 +简单浏览这些步骤,我们可以发现,提供强大的工具来支持这些步骤是十分重要的。在接下来的部分,我们为 GitLab 的可用工具提供一个简单的概览。 ### GitLab 工单追踪 -GitLab有一个强大的工单追溯系统,在使用过程中,允许你和你的团队,以及你的合作者分享和讨论建议。 +GitLab 有一个强大的工单追溯系统,在使用过程中,允许你和你的团队,以及你的合作者分享和讨论建议。 ![issue tracker - view list](https://about.gitlab.com/images/blogimages/gitlab-workflow-an-overview/issue-tracker-list-view.png) -工单是GitLab工作流的第一个重要重要特性。[以工单的讨论为开始][95]; 跟随点子的改变是一个最好的方式。 +工单是 GitLab 工作流的第一个重要重要特性。[以工单的讨论为开始][95]; 跟随点子的改变是一个最好的方式。 这十分有利于: + * 讨论点子 * 提交功能建议 * 提问题 -* 提交bug +* 提交 bug * 获取支持 * 精细化新代码的引入 -对于每一个在GitLab上部署的项目都有一个工单追踪器。找到你的项目中的 **Issues** > **New issue**,来创建一个新的工单。建立一个标题来总结要被讨论的主题,并且使用[Markdown][94]来形容它。检查[pro tips][93]来加强你的工单描述。 +对于每一个在 GitLab 上部署的项目都有一个工单追踪器。找到你的项目中的 **Issues** > **New issue** 来创建一个新的工单。建立一个标题来总结要被讨论的主题,并且使用 [Markdown][94] 来形容它。看看 [pro tips][93] 来加强你的工单描述。 -GitLab 工单追踪器代表了一个额外的实用功能,使得步骤变的更佳易于管理和考虑。下面的部分仔细描述了它。 +GitLab 工单追踪器提供了一个额外的实用功能,使得步骤变的更佳易于管理和考虑。下面的部分仔细描述了它。 ![new issue - additional settings](https://about.gitlab.com/images/blogimages/gitlab-workflow-an-overview/issue-features-view.png) -### 秘密工单 +#### 秘密工单 -无论何时,你仅仅想要在团队中讨论这个工单,你可以使用[issue confidential][92]。即使你的项目是公开的,你的工单也会被保留。当一个不是本项目成员的人,就算是[Reporter level][01],想要访问工单的地址时,浏览器也会返回一个404错误。 +无论何时,如果你仅仅想要在团队中讨论这个工单,你可以使用 [issue confidential][92]。即使你的项目是公开的,你的工单也会被保密起来。当一个不是本项目成员的人,就算是 [Reporter level][01],想要访问工单的地址时,浏览器也会返回一个 404 错误。 -### 截止日期 +#### 截止日期 -每一个工单允许你填写一个[截止日期][90]。有些团队以紧凑的时间表工作,并且拥有一种方式去设置一个截止日期来解决问题,是有必要的。这些都可以通过截止日期这一功能实现。 +每一个工单允许你填写一个[截止日期][90]。有些团队以紧凑的时间表工作,以某种方式去设置一个截止日期来解决问题,是有必要的。这些都可以通过截止日期这一功能实现。 -当你有一个多任务的项目截止日期的时候——比如说,一个新的发布,项目的启动,或者追踪团体任务——你可以使用[milestones][89]。 +当你有一个多任务的项目截止日期的时候——比如说,一个新的发布、项目的启动,或者追踪团体任务——你可以使用 [milestones][89]。 ### 受托者 From b9426de72a932bad7fccbf10b6201197ee1c8125 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 9 May 2017 09:42:49 +0800 Subject: [PATCH 0029/1407] PRF&PUB:20170320 How to deploy Node.js Applications with pm2 and Nginx on Ubuntu.md @ictlyh --- ...plications with pm2 and Nginx on Ubuntu.md | 237 ++++++++++-------- 1 file changed, 136 insertions(+), 101 deletions(-) rename {translated/tech => published}/20170320 How to deploy Node.js Applications with pm2 and Nginx on Ubuntu.md (58%) diff --git a/translated/tech/20170320 How to deploy Node.js Applications with pm2 and Nginx on Ubuntu.md b/published/20170320 How to deploy Node.js Applications with pm2 and Nginx on Ubuntu.md similarity index 58% rename from translated/tech/20170320 How to deploy Node.js Applications with pm2 and Nginx on Ubuntu.md rename to published/20170320 How to deploy Node.js Applications with pm2 and Nginx on Ubuntu.md index cf9ccafdb7..67a19986cc 100644 --- a/translated/tech/20170320 How to deploy Node.js Applications with pm2 and Nginx on Ubuntu.md +++ b/published/20170320 How to deploy Node.js Applications with pm2 and Nginx on Ubuntu.md @@ -1,20 +1,11 @@ 如何在 Ubuntu 上使用 pm2 和 Nginx 部署 Node.js 应用 ============================================================ - -### 导航 - -1. [第一步 - 安装 Node.js][1] -2. [第二步 - 生成 Express 事例 App][2] -3. [第三步- 安装 pm2][3] -4. [第四步 - 安装配置 Nginx 作为反向代理][4] -5. [第五步 - 测试][5] -6. [链接][6] - -pm2 是一个 Node.js 应用的进程管理器,它允许你让你的应用程序保持运行,还有一个内建的负载均衡器。它非常简单而且强大,你可以零间断重启或重新加载你的 node 应用,它也允许你为你的 node 应用创建集群。 + +pm2 是一个 Node.js 应用的进程管理器,它可以让你的应用程序保持运行,还有一个内建的负载均衡器。它非常简单而且强大,你可以零间断重启或重新加载你的 node 应用,它也允许你为你的 node 应用创建集群。 在这篇博文中,我会向你展示如何安装和配置 pm2 用于这个简单的 'Express' 应用,然后配置 Nginx 作为运行在 pm2 下的 node 应用的反向代理。 -**前提** +前提: * Ubuntu 16.04 - 64bit * Root 权限 @@ -23,50 +14,64 @@ pm2 是一个 Node.js 应用的进程管理器,它允许你让你的应用程 在这篇指南中,我们会从零开始我们的实验。首先,我们需要在服务器上安装 Node.js。我会使用 Nodejs LTS 6.x 版本,它能从 nodesource 仓库中安装。 -从 Ubuntu 仓库安装 '**python-software-properties**' 软件包并添加 'nodesource' Nodejs 仓库。 +从 Ubuntu 仓库安装 `python-software-properties` 软件包并添加 “nodesource” Nodejs 仓库。 -`sudo apt-get install -y python-software-properties` -`curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash -` +``` +sudo apt-get install -y python-software-properties +curl -sL https://deb.nodesource.com/setup_6.x | sudo -E bash - +``` -安装最新版本的 Nodejs LTS +安装最新版本的 Nodejs LTS: -`sudo apt-get install -y nodejs` +``` +sudo apt-get install -y nodejs +``` 安装完成后,查看 node 和 npm 版本。 -`node -v` -`npm -v` +``` +node -v +npm -v +``` [ ![检查 node.js 版本](https://www.howtoforge.com/images/how_to_deploy_nodejs_applications_with_pm2_and_nginx_on_ubuntu/1.png) ][10] -### 第二步 - 生成 Express 事例 App +### 第二步 - 生成 Express 示例 App -我会使用 **express-generator**' 软件包生成的简单 web 应用框架进行事例安装。Express-generator 可以使用 npm 命令安装。 +我会使用 `express-generator` 软件包生成的简单 web 应用框架进行示例安装。`express-generator` 可以使用 `npm` 命令安装。 -用 npm 安装 '**express-generator**': +用 `npm `安装 `express-generator`: -`npm install express-generator -g` +``` +npm install express-generator -g +``` -**-g:** 在系统内部安装软件包 +- `-g` : 在系统内部安装软件包。 我会以普通用户运行应用程序,而不是 root 或者超级用户。我们首先需要创建一个新的用户。 -创建一个名为 '**yume**' 的用户: +创建一个名为 `yume` 的用户: -`useradd -m -s /bin/bash yume` -`passwd yume` +``` +useradd -m -s /bin/bash yume +passwd yume +``` -使用 su 命令登录到新用户: +使用 `su` 命令登录到新用户: -`su - yume` +``` +su - yume +``` -下一步,用 express 命令生成一个新的简单 web 应用程序: +下一步,用 `express` 命令生成一个新的简单 web 应用程序: -`express hakase-app` +``` +express hakase-app +``` -命令会创建新项目目录 '**hakase-app**'。 +命令会创建新项目目录 `hakase-app`。 [ ![用 express-generator 生成应用框架](https://www.howtoforge.com/images/how_to_deploy_nodejs_applications_with_pm2_and_nginx_on_ubuntu/2.png) @@ -74,47 +79,59 @@ pm2 是一个 Node.js 应用的进程管理器,它允许你让你的应用程 进入到项目目录并安装应用需要的所有依赖。 -`cd hakase-app` -`npm install` +``` +cd hakase-app +npm install +``` 然后用下面的命令测试并启动一个新的简单应用程序: -`DEBUG=myapp:* npm start` +``` +DEBUG=myapp:* npm start +``` -默认情况下,我们的 express 应用汇运行在 **3000** 端口。现在访问服务器的 IP 地址:[192.168.33.10:3000][12] +默认情况下,我们的 express 应用会运行在 `3000` 端口。现在访问服务器的 IP 地址:192.168.33.10:3000 : [ ![express nodejs 运行在 3000 端口](https://www.howtoforge.com/images/how_to_deploy_nodejs_applications_with_pm2_and_nginx_on_ubuntu/3.png) ][13] -简单 web 应用框架以 'yume' 用户运行在 3000 端口。 +这个简单 web 应用框架现在以 'yume' 用户运行在 3000 端口。 ### 第三步 - 安装 pm2 -pm2 是一个 node 软件包,可以使用 npm 命令安装。让我们用 npm 命令安装吧(用 root 权限,如果你仍然以 yume 用户登录,那么运行命令 "exit" 再次成为 root 用户): +pm2 是一个 node 软件包,可以使用 `npm` 命令安装。(用 root 权限,如果你仍然以 yume 用户登录,那么运行命令 `exit` 再次成为 root 用户): -`npm install pm2 -g` +``` +npm install pm2 -g +``` 现在我们可以为我们的 web 应用使用 pm2 了。 -进入应用目录 '**hakase-app**': +进入应用目录 `hakase-app`: -`su - yume` -`cd ~/hakase-app/` +``` +su - yume +cd ~/hakase-app/ +``` -这里你可以看到一个名为 '**package.json**' 的文件,用 cat 命令显示它的内容。 +这里你可以看到一个名为 `package.json` 的文件,用 `cat` 命令显示它的内容。 -`cat package.json` +``` +cat package.json +``` [ ![配置 express nodejs 服务](https://www.howtoforge.com/images/how_to_deploy_nodejs_applications_with_pm2_and_nginx_on_ubuntu/4.png) ][14] -你可以看到 '**start**' 行有一个 nodejs 用于启动 express 应用的命令。我们会和 pm2 进程管理器一起使用这个命令。 +你可以看到 `start` 行有一个 nodejs 用于启动 express 应用的命令。我们会和 pm2 进程管理器一起使用这个命令。 -像下面这样使用 pm2 命令运行 express 应用: +像下面这样使用 `pm2` 命令运行 express 应用: -`pm2 start ./bin/www` +``` +pm2 start ./bin/www +``` 现在你可以看到像下面这样的结果: @@ -122,9 +139,11 @@ pm2 是一个 node 软件包,可以使用 npm 命令安装。让我们用 npm ![使用 pm2 运行 nodejs app](https://www.howtoforge.com/images/how_to_deploy_nodejs_applications_with_pm2_and_nginx_on_ubuntu/5.png) ][15] -我们的 express 应用正在 pm2 中运行,名称为 '**www**',id '**0**'。你可以用 show 选项 '**show nodeid|name**' 获取更多 pm2 下运行的应用的信息。 +我们的 express 应用正在 `pm2` 中运行,名称为 `www`,id 为 `0`。你可以用 show 选项 `show nodeid|name` 获取更多 pm2 下运行的应用的信息。 -`pm2 show www` +``` +pm2 show www +``` [ ![pm2 服务状态](https://www.howtoforge.com/images/how_to_deploy_nodejs_applications_with_pm2_and_nginx_on_ubuntu/6.png) @@ -132,7 +151,9 @@ pm2 是一个 node 软件包,可以使用 npm 命令安装。让我们用 npm 如果你想看我们应用的日志,你可以使用 logs 选项。它包括访问和错误日志,你还可以看到应用程序的 HTTP 状态。 -`pm2 logs www` +``` +pm2 logs www +``` [ ![pm2 服务日志](https://www.howtoforge.com/images/how_to_deploy_nodejs_applications_with_pm2_and_nginx_on_ubuntu/7.png) @@ -140,14 +161,17 @@ pm2 是一个 node 软件包,可以使用 npm 命令安装。让我们用 npm 你可以看到我们的程序正在运行。现在,让我们来让它开机自启动。 -`pm2 startup systemd` +``` +pm2 startup systemd +``` -**systemd**: Ubuntu 16 使用的是 systemd。 +- `systemd`: Ubuntu 16 使用的是 systemd。 -你会看到要用 root 用户运行命令的信息。使用 "exit" 命令回到 root 用户然后运行命令。 +你会看到要用 root 用户运行命令的信息。使用 `exit` 命令回到 root 用户然后运行命令。 - -`sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u yume --hp /home/yume` +``` +sudo env PATH=$PATH:/usr/bin /usr/lib/node_modules/pm2/bin/pm2 startup systemd -u yume --hp /home/yume +``` 它会为启动应用程序生成 systemd 配置文件。当你重启服务器的时候,应用程序就会自动运行。 @@ -157,66 +181,73 @@ pm2 是一个 node 软件包,可以使用 npm 命令安装。让我们用 npm ### 第四步 - 安装和配置 Nginx 作为反向代理 -在这篇指南中,我们会使用 Nginx 作为 node 应用的反向代理。Ubuntu 仓库中有 Nginx,用 apt 命令安装它: +在这篇指南中,我们会使用 Nginx 作为 node 应用的反向代理。Ubuntu 仓库中有 Nginx,用 `apt` 命令安装它: -`sudo apt-get install -y nginx` +``` +sudo apt-get install -y nginx +``` -下一步,进入到 '**sites-available**' 目录并创建新的虚拟 host 配置文件。 +下一步,进入到 `sites-available` 目录并创建新的虚拟主机配置文件。 -`cd /etc/nginx/sites-available/` -`vim hakase-app` +``` +cd /etc/nginx/sites-available/ +vim hakase-app +``` 粘贴下面的配置: - upstream hakase-app { -     # Nodejs app upstream -     server 127.0.0.1:3000; -     keepalive 64; - } - - # Server on port 80 - server { -     listen 80; -     server_name hakase-node.co; -     root /home/yume/hakase-app; - -     location / { -         # Proxy_pass configuration -         proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; -         proxy_set_header Host $http_host; -         proxy_set_header X-NginX-Proxy true; -         proxy_http_version 1.1; -         proxy_set_header Upgrade $http_upgrade; -         proxy_set_header Connection "upgrade"; -         proxy_max_temp_file_size 0; -         proxy_pass http://hakase-app/; -         proxy_redirect off; -         proxy_read_timeout 240s; -     } - } +``` +upstream hakase-app { +    # Nodejs app upstream +    server 127.0.0.1:3000; +    keepalive 64; +} +# Server on port 80 +server { +    listen 80; +    server_name hakase-node.co; +    root /home/yume/hakase-app; + +    location / { +        # Proxy_pass configuration +        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; +        proxy_set_header Host $http_host; +        proxy_set_header X-NginX-Proxy true; +        proxy_http_version 1.1; +        proxy_set_header Upgrade $http_upgrade; +        proxy_set_header Connection "upgrade"; +        proxy_max_temp_file_size 0; +        proxy_pass http://hakase-app/; +        proxy_redirect off; +        proxy_read_timeout 240s; +    } +} +``` 保存文件并退出 vim。 在配置中: -* node 应用使用域名 '**hakase-node.co**' 运行。 -* 所有来自 nginx 的流量都会被转发到运行在 **3000** 端口的 node app。 +* node 应用使用域名 `hakase-node.co` 运行。 +* 所有来自 nginx 的流量都会被转发到运行在 `3000` 端口的 node app。 测试 Nginx 配置确保没有错误。 -`nginx -t` +``` +nginx -t +``` 启用 Nginx 并使其开机自启动。 -`systemctl start nginx` -`systemctl enable nginx` +``` +systemctl start nginx +systemctl enable nginx +``` ### 第五步 - 测试 -打开你的 web 浏览器并访问域名(我的是): - -[http://hakase-app.co][19] +打开你的 web 浏览器并访问域名(我的是):[http://hakase-app.co][19] 你可以看到 express 应用正在 Nginx web 服务器中运行。 @@ -226,13 +257,17 @@ pm2 是一个 node 软件包,可以使用 npm 命令安装。让我们用 npm 下一步,重启你的服务器,确保你的 node app 能开机自启动: -`pm2 save` -`sudo reboot` +``` +pm2 save +sudo reboot +``` -如果你再次登录到了你的服务器,检查 node app 进程。以 '**yume**' 用户运行下面的命令。 +如果你再次登录到了你的服务器,检查 node app 进程。以 `yume` 用户运行下面的命令。 -`su - yume` -`pm2 status www` +``` +su - yume +pm2 status www +``` [ ![nodejs 在 pm2 下开机自启动](https://www.howtoforge.com/images/how_to_deploy_nodejs_applications_with_pm2_and_nginx_on_ubuntu/10.png) @@ -250,9 +285,9 @@ Node 应用在 pm2 中运行并使用 Nginx 作为反向代理。 via: https://www.howtoforge.com/tutorial/how-to-deploy-nodejs-applications-with-pm2-and-nginx-on-ubuntu/ -作者:[Muhammad Arul ][a] +作者:[Muhammad Arul][a] 译者:[ictlyh](https://github.com/ictlyh) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 0a065f2ca783f003f0cfe9e68bf2bce7b153d9f7 Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 9 May 2017 10:03:33 +0800 Subject: [PATCH 0030/1407] translated --- ...acle Policy Change Raises Prices on AWS.md | 51 ------------------- ...acle Policy Change Raises Prices on AWS.md | 49 ++++++++++++++++++ 2 files changed, 49 insertions(+), 51 deletions(-) delete mode 100644 sources/tech/20170206 Oracle Policy Change Raises Prices on AWS.md create mode 100644 translated/tech/20170206 Oracle Policy Change Raises Prices on AWS.md diff --git a/sources/tech/20170206 Oracle Policy Change Raises Prices on AWS.md b/sources/tech/20170206 Oracle Policy Change Raises Prices on AWS.md deleted file mode 100644 index 2b7541fc84..0000000000 --- a/sources/tech/20170206 Oracle Policy Change Raises Prices on AWS.md +++ /dev/null @@ -1,51 +0,0 @@ -translating--geekpi - -Oracle Policy Change Raises Prices on AWS -============================================================ - ->The change, which effectively doubles Oracle's prices for implementing its software on AWS, was put in effect quietly, with little notification to users. - - ![](http://windowsitpro.com/site-files/windowsitpro.com/files/imagecache/large_img/uploads/2017/02/ellison-hero.jpg) - -News came last week that Oracle has, in effect, doubled the price for running its products on Amazon's cloud. It has done so with a bit of sleight-of-hand on [how it counts AWS's virtual CPUs.][6] It also did so without fanfare. The company's new pricing policy went in effect on January 23, and pretty much went unnoticed until January 28, when Oracle follower Tim Hall stumbled on the change in Big Red's ["Licensing Oracle Software in the Cloud Computing Environment"][7] document and blew the whistle. - -At first glance, this move might not seem to mean much, as it only puts Oracle's AWS pricing on par with its prices on Microsoft Azure. But Azure is only about a third the size of market leading AWS, so if you want to make money selling licenses in the cloud, AWS is the place to be. And while this move may or may not affect those already using Oracle on AWS -- it's not clear whether the new rules apply to those already using the products -- it will certainly push some new users who might otherwise consider Oracle to look elsewhere. - -The main reason for this move is obvious. Oracle is hoping to make its own cloud more attractive -- which led [The Register to observe][8] with a bit of snark, "Larry Ellison did promise Oracle's cloud would be faster and cheaper." Faster and cheaper both remain to be seen. Faster maybe, if Oracle's SPARC cloud launches as planned and if it performs as advertised. Cheaper might be less likely. Oracle is known for playing hardball with its prices. - -With declining sales of its signature database and business stack, and with its $7.4 billion dollar bet on Sun not working out as planned, Oracle is betting its future on the cloud. But Oracle came late to the party and its efforts so far seem to be returning lackluster results, with some financial forecasters not seeing a bright future for Oracle Cloud. The cloud is a crowded market, they say, and the big four -- Amazon, Microsoft, IBM and Google -- already have a commanding lead. - -That's true. But the biggest obstacle Oracle faces in the cloud is...well, Oracle. Its reputation precedes it. - -It's an understatement to say the company is not known for stellar customer service. Indeed, press reports paint Oracle as something of a bully and a manipulator. - -Back in 2015, for example, Oracle, evidently growing frustrated because its cloud wasn't growing as fast as anticipated, began [activating what Business Insider called the "nuclear option."][9] It would audit a client's datacenter and if the client wasn't in compliance, it would issue a "breach notice" -- usually reserved only for cases of large scale abuse -- and order the client to quit using its software within 30 days. - -In case you don't know, big corporations heavily invested in Oracle's stack absolutely couldn't migrate to another solution on such short notice. An Oracle breach notice spelled disaster. - -"[T]o make the breach notice go away — or to reduce an outrageously high out-of-compliance fine — an Oracle sales rep often wants the customer to add cloud "credits" to the contract...," Business Insider's Julie Bort explained. - -In other words, Oracle was using the audit to arm-twist clients to buy into its cloud, whether or not they had a need. There might also be a tie-in between this tactic and the recent price doubling on AWS. A commenter to Hall's article noted that the purpose behind the secrecy surrounding the price boost could possibly be to trigger software audits. - -The trouble with employing tactics like these is that sooner or later they catch up with you. Word gets out. Your customers start looking for other options. It might be time for Big Red to take a page from Microsoft's playbook and start working to build a kinder and gentler Oracle that puts the needs of its customers first. - --------------------------------------------------------------------------------- - -via: http://windowsitpro.com/cloud/oracle-policy-change-raises-prices-aws - -作者:[Christine Hall][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://windowsitpro.com/author/christine-hall -[1]:http://windowsitpro.com/penton_ur/nojs/user/register?path=node%2F186491&nid=186491&source=email -[2]:http://windowsitpro.com/author/christine-hall -[3]:http://windowsitpro.com/author/christine-hall -[4]:http://windowsitpro.com/cloud/oracle-policy-change-raises-prices-aws#comments -[5]:http://windowsitpro.com/cloud/oracle-policy-change-raises-prices-aws#comments -[6]:https://oracle-base.com/blog/2017/01/28/oracles-cloud-licensing-change-be-warned/ -[7]:http://www.oracle.com/us/corporate/pricing/cloud-licensing-070579.pdf -[8]:https://www.theregister.co.uk/2017/01/30/oracle_effectively_doubles_licence_fees_to_run_in_aws/ -[9]:http://www.businessinsider.com/oracle-is-using-the-nuclear-option-to-sell-its-cloud-software-2015-7 diff --git a/translated/tech/20170206 Oracle Policy Change Raises Prices on AWS.md b/translated/tech/20170206 Oracle Policy Change Raises Prices on AWS.md new file mode 100644 index 0000000000..7a77b90887 --- /dev/null +++ b/translated/tech/20170206 Oracle Policy Change Raises Prices on AWS.md @@ -0,0 +1,49 @@ +Oracle 政策更改提高了 AWS 的价格 +============================================================ + +>这种改变使甲骨文在 AWS 上实施其软件的价格翻了一番,它已经安静地生效了,而几乎没有通知用户。 + + ![](http://windowsitpro.com/site-files/windowsitpro.com/files/imagecache/large_img/uploads/2017/02/ellison-hero.jpg) + +上周消息传出,甲骨文使亚马逊云上的产品价格翻了一倍。它在[如何计算 AWS 的虚拟 CPU][6]上耍了一些花招。它这么做也没有任何宣扬。该公司的新定价政策于 1 月 23 日生效,直到 1 月 28 日,几乎没有被注意到,直到 Oracle 的关注者 Tim Hall 偶然发现 Big Red 的[ Oracle 软件云计算环境许可][7]文件并揭发了出来。 + +乍一看,这一举动似乎并不太大,因为它仅将 Oracle 的 AWS 定价与 Microsoft Azure 的价格相提并论。但是 Azure 只有市场领先的 AWS 体量的三分之一,所以如果你想在云中销售许可证,AWS 是合适的地方。虽然此举可能或可能不会影响已经在 AWS 上使用 Oracle 的用户,但是尚不清楚新规则是否适用于已在使用产品的用户 - 它肯定会让一些考虑可能使用 Oracle 的用户另寻它处。 + +这个举动的主要原因是显而易见的。甲骨文希望使自己的云更具吸引力 - 这让[The Register 观察][8]到一点:“拉里·埃里森确实承诺过 Oracle 的云将会更快更便宜”。更快和更便宜仍然有待看到。如果 Oracle 的 SPARC 云计划启动,并且按照广告的形式执行,那么可能会更快,但是更便宜的可能性较小。甲骨文以对其价格的强硬态度而著称。 + +随着其签名数据库和业务栈销售的下滑,并且对 Sun 的 74 亿美元的投资并未能按照如期那样,Oracle 将其未来堵在云计算上。但是甲骨文来晚了,迄今为止, 它的努力似乎还没有结果, 一些金融预测者并没有看到 Oracle Cloud 的光明前景。他们说,云是一个拥挤的市场,而四大公司 - 亚马逊、微软、IBM 和谷歌 - 已经有了领先优势。 + +确实如此。但是 Oracle 面临的最大的障碍是,好吧,是 Oracle。它的声誉在它之前。 + +保守地说这个公司并不是因为明星客户服务而闻名。事实上, 新闻报道将甲骨文描绘成一个恶霸和操纵者。 + +例如,早在 2015 年,Oracle 就因为它的云并不像预期那样快速增长而越来越沮丧,开始[激活业内人士称之为的“核特权”][9]。它会审核客户的数据中心,如果客户不符合规定,将发出“违规通知” - 它通常只适用于大规模滥用情况,并命令客户在 30 天内退出使用其软件。 + +以防你还不知道,那么大量投资 Oracle 栈的大公司绝对不能在短时间内迁移到另一个解决方案。Oracle 的违规通知会引发灾难。 + +商业内幕人士 Julie Bort 解释到:“为了使违规通知消失 - 或者减少高额的违规罚款 - 甲骨文销售代表通常希望客户向合同中添加云额度”。 + +换句话说,Oracle 正在使用审计来扭转客户去购买它的云,而无论他们是否有需要。这种策略与最近 AWS 价格翻倍之间也可能存在联系。Hall 的文章的评论者指出,围绕价格提升的秘密背后的目的可能是触发软件审计。 + +使用这些策略的麻烦迟早会出来。消息一旦传播开来,你的客户就开始寻找其他选项。对 Big Red 而言或许是时候参考微软的做法,开始建立一个更好和更温和的 Oracle,将客户的需求放在第一位。 + +-------------------------------------------------------------------------------- + +via: http://windowsitpro.com/cloud/oracle-policy-change-raises-prices-aws + +作者:[Christine Hall][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://windowsitpro.com/author/christine-hall +[1]:http://windowsitpro.com/penton_ur/nojs/user/register?path=node%2F186491&nid=186491&source=email +[2]:http://windowsitpro.com/author/christine-hall +[3]:http://windowsitpro.com/author/christine-hall +[4]:http://windowsitpro.com/cloud/oracle-policy-change-raises-prices-aws#comments +[5]:http://windowsitpro.com/cloud/oracle-policy-change-raises-prices-aws#comments +[6]:https://oracle-base.com/blog/2017/01/28/oracles-cloud-licensing-change-be-warned/ +[7]:http://www.oracle.com/us/corporate/pricing/cloud-licensing-070579.pdf +[8]:https://www.theregister.co.uk/2017/01/30/oracle_effectively_doubles_licence_fees_to_run_in_aws/ +[9]:http://www.businessinsider.com/oracle-is-using-the-nuclear-option-to-sell-its-cloud-software-2015-7 From a1bc2e047070adf7ea66f4c022634785fe2a225a Mon Sep 17 00:00:00 2001 From: hkurj Date: Tue, 9 May 2017 16:30:33 +0800 Subject: [PATCH 0031/1407] ok --- ...o Directories Using Diff and Meld Tools.md | 47 ++++++++----------- 1 file changed, 20 insertions(+), 27 deletions(-) diff --git a/sources/tech/20170502 How to Find Difference Between Two Directories Using Diff and Meld Tools.md b/sources/tech/20170502 How to Find Difference Between Two Directories Using Diff and Meld Tools.md index 0e5d65fb13..8016da3379 100644 --- a/sources/tech/20170502 How to Find Difference Between Two Directories Using Diff and Meld Tools.md +++ b/sources/tech/20170502 How to Find Difference Between Two Directories Using Diff and Meld Tools.md @@ -1,21 +1,20 @@ -hkurj translating -How to Find Difference Between Two Directories Using Diff and Meld Tools +怎么使用Diff和Meld工具得到2个目录之间的不同之处呢 ============================================================ -In an earlier article, we reviewed [9 best file comparison and difference (Diff) tools for Linux][1] and in this article, we will describe how to find the difference between two directories in Linux. +在一个之前的一篇文章,我们回顾了[ Linux 下的 9 个最好的文件比较工具][1]在这片文章,我们将会描述在 Linux 下这么找到2个目录之间的不同。 -Normally, to [compare two files in Linux][2], we use the diff – a simple and original Unix command-line tool that shows you the difference between two computer files; compares files line by line and it is easy to use, comes with pre-installed on most if not all Linux distributions. +一般,在Linux下比较2个文件,我们会使用diff (一个简单的原版的Unix命令行工具 )来显示2个计算机文件的不同;一行一行的去比较文件,而且很方便使用,几乎在全部的 Linux 发行版都预装了。 -The question is how do we get the difference between two directories in Linux? Here, we want to know what files/subdirectories are common in the two directories, those that are present in one directory but not in the other. +问题是在 Linux 下我们怎么才能比较2个目录的不同? 现在,我们想知道2个目录中那些文件/子目录是通用的,那些只存在一个目录。 -The conventional syntax for running diff is as follows: +运行diff常规的语法如下: ``` $ diff [OPTION]… FILES $ diff options dir1 dir2 ``` -By default, its output is ordered alphabetically by file/subdirectory name as shown in the screenshot below. In this command, the `-q` switch tells diff to report only when files differ. +默认情况下,输出是按文件/子文件夹的文件名的字母排序的,如下面截图所示,在这命令“-q”开关是告诉diif只有在文件有差异时报告。 ``` $ diff -q directory-1/ directory-2/ @@ -24,17 +23,17 @@ $ diff -q directory-1/ directory-2/ ![Difference Between Two Directories](http://www.tecmint.com/wp-content/uploads/2017/05/Difference-Between-Two-Directories.png) ][3] -Difference Between Two Directories +2个文件之间的差异 -Again diff doesn’t go into the subdirectories, but we can use the `-r` switch to read the subdirectories as well like this. +再次运行diff并不能进入子文件夹,但是我们可以使用'-r'开关和下面一样来读子文件夹。 ``` $ diff -qr directory-1/ directory-2/ ``` -### Using Meld Visual Diff and Merge Tool +###使用Meld可视化的比较和合并工具 -There is a cool graphical option called meld (a visual diff and merge tool for the GNOME Desktop) for those who enjoy using the mouse, you can install it as follows. +meld是一个很酷的图形化工具(一个GNOME桌面下的可视化的比较和合并工具)给那些喜欢使用鼠标的人,你们能根据下面来安装。 ``` $ sudo apt install meld [Debian/Ubuntu systems] @@ -42,42 +41,36 @@ $ sudo yum install meld [RHEL/CentOS systems] $ sudo dnf install meld [Fedora 22+] ``` -Once you have installed it, search for “meld” in the Ubuntu Dash or Linux Mint Menu, in Activities Overview in Fedora or CentOS desktop and launch it. - -You will see the Meld interface below, where you can choose file or directory comparison as well as version control view. Click on directory comparison and move to the next interface. +一旦你安装了它之后,搜索“meld”在 Ubuntu Dash 或者 Linux Mint 菜单,也可以是Fedora或者CentOS桌面的Activities Overview,然后启动它。 +你可以看到在下面看到Meld接口,你能和版本控制视图一样选择文件或者文件夹来比较。点击目录比较并移动到下个界面 [ ![Meld Comparison Tool](http://www.tecmint.com/wp-content/uploads/2017/05/Meld-Comparison-Tool.png) ][4] -Meld Comparison Tool - -Select the directories you want to compare, note that you can add a third directory by checking the option “3-way Comparison”. +Meld 比较工具 +选择你想要比较的文件夹,注意你可以勾选“3-way Comparison”选项添加第3个文件夹。 [ ![Select Comparison Directories](http://www.tecmint.com/wp-content/uploads/2017/05/Select-Comparison-Directories.png) ][5] -Select Comparison Directories - -Once you selected the directories, click on “Compare”. +选择比较的文件夹。 +一旦你选择好了要比较的文件夹,点击 “Compare”。 [ - ![Listing Difference Between Directories](http://www.tecmint.com/wp-content/uploads/2017/05/Listing-Difference-Between-Directories.png) + ![Listing Difference Between +](http://www.tecmint.com/wp-content/uploads/2017/05/Listing-Difference-Between-Directories.png) ][6] -Listing Difference Between Directories - -In this article, we described how to find the difference between two directories in Linux. If you know any other commandline or gui way don’t forget to share your thoughts to this article via the comment section below. +看结果出来了吧。 +在这片文章我们描述了怎么在Linux下找到找出2个文件夹的不同。如果你知道其他的命令或者图形界面工具,不要忘记在下方评论分享你们的想法。 -------------------------------------------------------------------------------- 作者简介: -Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. - - +Aaron Kili 是一个Linux和F.O.S.S爱好者,即将变成的Linux 系统管理员,Web开发者,目前是TecMint的内容创建者,他喜欢与电脑工作,并且非常相信分享知识。 ------------------- From aa99dde2ff69c30b967be78ac7440738a1200722 Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 10 May 2017 08:28:44 +0800 Subject: [PATCH 0032/1407] =?UTF-8?q?PRF&PUB:20170413=20rdiff-backup=20?= =?UTF-8?q?=E2=80=93=20A=20Remote=20Incremental=20Backup=20Tool=20for=20Li?= =?UTF-8?q?nux.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @geekpi --- ... Remote Incremental Backup Tool for Linux.md | 54 +++++++++---------- 1 file changed, 27 insertions(+), 27 deletions(-) rename {translated/tech => published}/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md (81%) diff --git a/translated/tech/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md b/published/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md similarity index 81% rename from translated/tech/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md rename to published/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md index 5e1ad5627d..874e2315d5 100644 --- a/translated/tech/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md +++ b/published/20170413 rdiff-backup – A Remote Incremental Backup Tool for Linux.md @@ -1,20 +1,20 @@ -rdiff-backup - 一个 Linux 中的远程增量备份工具 +rdiff-backup:一个 Linux 中的远程增量备份工具 ============================================================ -rdiff-backup 是用于本地/远程增量备份的强大且易于使用的 Python 脚本,它适用于任何 POSIX 操作系统,如Linux、Mac OS X 或 [Cygwin][1]。它集合了镜像和增量备份的显著特性。 +rdiff-backup 是一个用于本地/远程增量备份的强大而易用的 Python 脚本,它适用于任何 POSIX 操作系统,如Linux、Mac OS X 或 [Cygwin][1]。它集合了镜像和增量备份的显著特性。 -值得注意的是,它保留了子目录、dev文件、硬链接和关键的文件属性,如权限、uid/gid 所有权、修改时间、扩展属性、acls 以及 resource fork。它可以通过管道以高效带宽的模式工作,这与流行的[ rsync 备份工具][2]类似。 +值得注意的是,它保留了子目录、dev 文件、硬链接,以及关键的文件属性,如权限、uid/gid 所有权、修改时间、扩展属性、acl 以及 resource fork。它可以通过管道以高效带宽的模式工作,这与流行的 [rsync 备份工具][2]类似。 -rdiff-backup 通过使用 SSH 将单个目录备份到另一个目录,这意味着数据传输被加密并且是安全的。目标目录(在远程系统上)最终会得到源目录的完整副本,但是额外的反向差异存储在目标目录的特殊子目录中,从而可以恢复前一段时间丢失的文件。 +rdiff-backup 通过使用 SSH 将单个目录备份到另一个目录,这意味着数据传输被加密并且是安全的。目标目录(在远程系统上)最终会得到源目录的完整副本,但是此外的反向差异会存储在目标目录的特殊子目录中,从而可以恢复前一段时间丢失的文件。 -#### 依赖 +### 依赖 要在 Linux 中使用 rdiff-backup,你需要在系统上安装以下软件包: -* Python v2.2 或更高版本 -* librsync v0.9.7 或更高版本 -* pylibacl 和 pyxattr Python 模块是可选的,但它们分别是 POSIX 访问控制列表(ACL)和扩展属性支持必需的。 -* rdiff-backup-statistics 需要 Python v2.4 或更高版本。 +* Python v2.2 或更高版本 +* librsync v0.9.7 或更高版本 +* pylibacl 和 pyxattr Python 模块是可选的,但它们分别是 POSIX 访问控制列表(ACL)和扩展属性支持必需的。 +* rdiff-backup-statistics 需要 Python v2.4 或更高版本。 ### 如何在 Linux 中安装 rdiff-backup @@ -58,11 +58,11 @@ $ sudo apt-get install librsync-dev rdiff-backup 但是,要自动执行诸如脚本等自动备份之类的任务,那么你需要配置[使用 SSH 密钥无密码登录 SSH][3],因为 SSH 密钥增加了两台 Linux服务器之间的信任来[简化文件同步或传输][4]。 -在你设置了[ SSH 无密码登录][5]后,你可以使用下面的例子开始使用该脚本。 +在你设置了 [SSH 无密码登录][5]后,你可以使用下面的例子开始使用该脚本。 #### 备份文件到不同分区 -下面的例子会备份 `/etc` 文件夹到另外一个分区的 Backup 文件夹内: +下面的例子会备份 `/etc` 文件夹到另外一个分区的 `Backup` 文件夹内: ``` $ sudo rdiff-backup /etc /media/aaronkilik/Data/Backup/mint_etc.backup @@ -71,7 +71,7 @@ $ sudo rdiff-backup /etc /media/aaronkilik/Data/Backup/mint_etc.backup ![Backup Files to Different Partition](http://www.tecmint.com/wp-content/uploads/2017/03/Backup-Files-to-Different-Partition.png) ][6] -备份文件到不同分区 +*备份文件到不同分区* 要排除一个特定文件夹和它的子目录,你可以如下使用 `--exclude` 选项: @@ -85,7 +85,7 @@ $ sudo rdiff-backup --exclude /etc/cockpit --exclude /etc/bluetooth /media/aaron $ sudo rdiff-backup --include-special-files --exclude /etc/cockpit /media/aaronkilik/Data/Backup/mint_etc.backup ``` -还有另外两个重要标志来用于选择文件,`--max-file-size` 用来排除大于给定字节大小的文件,`--max-file-size` 用于排除小于给定字节大小的文件: +还有另外两个重要标志来用于选择文件,`--max-file-size` 用来排除大于给定字节大小的文件,`--min-file-size` 用于排除小于给定字节大小的文件: ``` $ sudo rdiff-backup --max-file-size 5M --include-special-files --exclude /etc/cockpit /media/aaronkilik/Data/Backup/mint_etc.backup @@ -100,7 +100,7 @@ Remote Server (tecmint) : 192.168.56.102 Local Backup Server (backup) : 192.168.56.10 ``` -如前所述,你必须在两台机器上安装相同版本的 rdiff-backup,如下所示,请尝试在两台机器上检查版本,: +如前所述,你必须在两台机器上安装相同版本的 rdiff-backup,如下所示,请尝试在两台机器上检查版本: ``` $ rdiff-backup -V @@ -109,7 +109,7 @@ $ rdiff-backup -V ![Check rdiff Version on Servers](http://www.tecmint.com/wp-content/uploads/2017/03/check-rdif-versions-on-servers.png) ][7] -检查服务器中 rdiff 版本 +*检查服务器中 rdiff 版本* 在备份服务器中,像这样创建一个存储备份文件的目录: @@ -124,13 +124,13 @@ $ rdiff-backup -V # rdiff-backup root@192.168.56.102::/root/ /backups/192.168.56.102_rootfiles.backup ``` -下面的截图展示了远程服务器 192.168.56.102 中的 root 文件夹以及 192.168.56.10 备份服务器中的已备份文件: +下面的截图展示了远程服务器 192.168.56.102 中的 `root` 文件夹以及 192.168.56.10 备份服务器中的已备份文件: [ ![Backup Remote Directory on Local Server](http://www.tecmint.com/wp-content/uploads/2017/03/Backup-Remote-Linux-Directory-on-Local-Server.png) ][8] -在本地服务器备份远程目录 +*在本地服务器备份远程目录* 注意截图中 “backup” 目录中创建的 rdiff-backup-data 文件夹,它包含了备份过程和增量文件的重要数据。 @@ -138,15 +138,15 @@ $ rdiff-backup -V ![rdiff-backup - Backup Process Files](http://www.tecmint.com/wp-content/uploads/2017/03/rdiff-backup-data-directory-contents.png) ][9] -rdiff-backup – 备份过程文件 +*rdiff-backup – 备份过程文件* -现在,在 192.168.56.102 服务器中,如下所示 root 目录已经添加了额外的文件: +现在,在 192.168.56.102 服务器中,如下所示 `root` 目录已经添加了额外的文件: [ ![Verify Backup Directory](http://www.tecmint.com/wp-content/uploads/2017/03/additional-files-in-root-directory.png) ][10] -验证备份目录 +*验证备份目录* 让我们再次运行备份命令以获取更改的数据,我们可以使用 `-v[0-9]`(其中数字指定详细程度级别,默认值为 3,这是静默模式)选项设置详细功能: @@ -157,9 +157,9 @@ rdiff-backup – 备份过程文件 ![Incremental Backup with Summary](http://www.tecmint.com/wp-content/uploads/2017/03/incremental-backup-of-root-files.png) ][11] -带有摘要的增量备份 +*带有摘要的增量备份* -要列出 /backups/192.168.56.102_rootfiles.backup 目录中包含的部分增量备份的数量和日期,我们可以运行: +要列出 `/backups/192.168.56.102_rootfiles.backup` 目录中包含的部分增量备份的数量和日期,我们可以运行: ``` # rdiff-backup -l /backups/192.168.56.102_rootfiles.backup/ @@ -169,7 +169,7 @@ rdiff-backup – 备份过程文件 使用 `--print-statistics` 成功备份后,我们可以打印摘要统计信息。但是,如果我们不设置此选项,我们可以仍从会话统计中获得。在手册页的 “STATISTICS” 部分中阅读有关此选项的更多信息。 --remote-schema 标志使我们能够指定使用替代方法连接到远程计算机。 +`-remote-schema` 选项使我们能够指定使用替代方法连接到远程计算机。 现在,我们开始在备份服务器 192.168.56.10 上创建一个 `backup.sh` 脚本,如下所示: @@ -231,18 +231,18 @@ Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux SysAdmin 和 web via: http://www.tecmint.com/rdiff-backup-remote-incremental-backup-for-linux/ -作者:[Aaron Kili ][a] +作者:[Aaron Kili][a] 译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 [a]:http://www.tecmint.com/author/aaronkili/ [1]:http://www.tecmint.com/install-cygwin-to-run-linux-commands-on-windows-system/ [2]:http://www.tecmint.com/rsync-local-remote-file-synchronization-commands/ -[3]:http://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/ +[3]:https://linux.cn/article-6901-1.html [4]:http://www.tecmint.com/sync-new-changed-modified-files-rsync-linux/ -[5]:http://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/ +[5]:https://linux.cn/article-6901-1.html [6]:http://www.tecmint.com/wp-content/uploads/2017/03/Backup-Files-to-Different-Partition.png [7]:http://www.tecmint.com/wp-content/uploads/2017/03/check-rdif-versions-on-servers.png [8]:http://www.tecmint.com/wp-content/uploads/2017/03/Backup-Remote-Linux-Directory-on-Local-Server.png From dfffe0906d215c6c9d43580c925d3b9848785937 Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 10 May 2017 08:29:38 +0800 Subject: [PATCH 0033/1407] =?UTF-8?q?=E4=B8=8D=E5=8F=91=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @robot527 需要根据情况调整后才可接受发布 --- translated/tech/GDB-common-commands.md | 259 ------------------------- 1 file changed, 259 deletions(-) delete mode 100644 translated/tech/GDB-common-commands.md diff --git a/translated/tech/GDB-common-commands.md b/translated/tech/GDB-common-commands.md deleted file mode 100644 index 4ba6de54ef..0000000000 --- a/translated/tech/GDB-common-commands.md +++ /dev/null @@ -1,259 +0,0 @@ -# 常用的 GDB 命令中文释义 - -## 目录 - - - [break](#break) -- 缩写 `b`,在指定的行或函数处设置断点 - - [info breakpoints](#info-breakpoints) -- 简写 `i b`,打印未删除的所有断点,观察点和捕获点的列表 - - [disable](#disable) -- 禁用断点,可以缩写为 `dis` - - [enable](#enable) -- 启用断点 - - [clear](#clear) -- 清除指定行或函数处的断点 - - [delete](#delete) -- 缩写 `d`,删除断点 - - [tbreak](#tbreak) -- 设置临时断点,参数同 `break`,但在程序第一次停住后会被自动删除 - - [watch](#watch) -- 为表达式(或变量)设置观察点,当表达式(或变量)的值有变化时,停住程序 - - - [step](#step) -- 缩写 `s`,单步跟踪,如果有函数调用,会进入该函数 - - [reverse-step](#reverse-step) -- 反向单步跟踪,如果有函数调用,会进入该函数 - - [next](#next) -- 缩写 `n`,单步跟踪,如果有函数调用,不会进入该函数 - - [reverse-next](#reverse-next) -- 反向单步跟踪,如果有函数调用,不会进入该函数 - - [return](#return) -- 使选定的栈帧返回到其调用者 - - [finish](#finish) -- 缩写 `fin`,执行直到选择的栈帧返回 - - [until](#until) -- 缩写 `u`,执行直到...(用于跳过循环、递归函数调用) - - [continue](#continue) -- 同义词 `c`,恢复程序执行 - - - [print](#print) -- 缩写 `p`,打印表达式 EXP 的值 - - [x](#x) -- 查看内存 - - - [display](#display) -- 每次程序停止时打印表达式 EXP 的值(自动显示) - - [info display](#info-display) -- 打印早先设置为自动显示的表达式列表 - - [disable display](#disable-display) -- 禁用自动显示 - - [enable display](#enable-display) -- 启用自动显示 - - [undisplay](#undisplay) -- 删除自动显示项 - - - [help](#help) -- 缩写 `h`,打印命令列表(带参数时查找命令的帮助) - - - [attach](#attach) -- 挂接到已在运行的进程来调试 - - [run](#run) -- 缩写 `r`,启动被调试的程序 - - - [backtrace](#backtrace) -- 缩写 `bt`,查看程序调用栈的信息 - - -************ - -## break -使用 `break` 命令(缩写 `b`)来设置断点。 参见[官方文档][1]。 - - - `break` 当不带参数时,在所选栈帧中执行的下一条指令处设置断点。 - - `break ` 在函数体入口处打断点,在 C++ 中可以使用 `class::function` 或 `function(type, ...)` 格式来指定函数名。 - - `break ` 在当前源码文件指定行的开始处打断点。 - - `break -N` `break +N` 在当前源码行前面或后面的 `N` 行开始处打断点,`N` 为正整数。 - - `break ` 在源码文件 `filename` 的 `linenum` 行处打断点。 - - `break ` 在源码文件 `filename` 的 `function` 函数入口处打断点。 - - `break
` 在程序指令的地址处打断点。 - - `break ... if ` 设置条件断点,`...` 代表上述参数之一(或无参数),`cond` 为条件表达式,仅在 `cond` 值非零时停住程序。 - -## info breakpoints -查看断点,观察点和捕获点的列表。用法: -`info breakpoints [list…]` -`info break [list…]` -`list…` 用来指定若干个断点的编号(可省略),可以是 `2`, `1-3`, `2 5` 等。 - -## disable -禁用一些断点。 参见[官方文档][2]。 -参数是用空格分隔的断点编号。 -要禁用所有断点,不加参数。 -禁用的断点不会被忘记,但直到重新启用才有效。 -用法: `disable [breakpoints] [list…]` -`breakpoints` 是 `disable` 的子命令(可省略),`list…` 同 `info breakpoints` 中的描述。 - -## enable -启用一些断点。 参见[官方文档][2]。 -给出断点编号(以空格分隔)作为参数。 -没有参数时,所有断点被启用。 - - - `enable [breakpoints] [list…]` 启用指定的断点(或所有定义的断点)。 - - `enable [breakpoints] once list…` 临时启用指定的断点。GDB 在停止您的程序后立即禁用这些断点。 - - `enable [breakpoints] delete list…` 使指定的断点启用一次,然后删除。一旦您的程序停止,GDB 就会删除这些断点。等效于用 `tbreak` 设置的断点。 - -`breakpoints` 同 `disable` 中的描述。 - -## clear -在指定行或函数处清除断点。 参见[官方文档][3]。 -参数可以是行号,函数名称或 "*" 跟一个地址。 - - - `clear` 当不带参数时,清除所选栈帧在执行的源码行中的所有断点。 - - `clear `, `clear ` 删除在命名函数的入口处设置的任何断点。 - - `clear `, `clear ` 删除在指定的文件指定的行号的代码中设置的任何断点。 - - `clear
` 清除指定程序指令的地址处的断点。 - -## delete -删除一些断点或自动显示表达式。 参见[官方文档][3]。 -参数是用空格分隔的断点编号。 -要删除所有断点,不加参数。 -用法: `delete [breakpoints] [list…]` - -## tbreak -设置临时断点。参数形式同 `break` 一样。 参见[官方文档][1]。 -除了断点是临时的之外像 `break` 一样,所以在命中时会被删除。 - -## watch -为表达式设置观察点。 参见[官方文档][4]。 -用法: `watch [-l|-location] ` -每当一个表达式的值改变时,观察点就会停止执行您的程序。 -如果给出了 `-l` 或者 `-location`,则它会对 `expr` 求值并观察它所指向的内存。 -例如,`watch *(int *)0x12345678` 将在指定的地址处观察一个 4 字节的区域(假设 int 占用 4 个字节)。 - -## step -单步执行程序,直到到达不同的源码行。 参见[官方文档][5]。 -用法: `step [N]` -参数 `N` 表示执行 N 次(或由于另一个原因直到程序停止)。 -警告:如果当控制在没有调试信息的情况下编译的函数中使用 `step` 命令,则执行将继续进行, -直到控制到达具有调试信息的函数。 同样,它不会进入没有调试信息编译的函数。 -要执行没有调试信息的函数,请使用 `stepi` 命令,后文再述。 - -## reverse-step -反向步进程序,直到到达另一个源码行的开头。 参见[官方文档][6]。 -用法: `reverse-step [N]` -参数 `N` 表示执行 N 次(或由于另一个原因直到程序停止)。 - -## next -单步执行程序,执行完子程序调用。 参见[官方文档][5]。 -用法: `next [N]` -与 `step` 不同,如果当前的源代码行调用子程序,则此命令不会进入子程序,而是继续执行,将其视为单个源代码行。 - -## reverse-next -反向步进程序,执行完子程序调用。 参见[官方文档][6]。 -用法: `reverse-next [N]` -如果要执行的源代码行调用子程序,则此命令不会进入子程序,调用被视为一个指令。 -参数 `N` 表示执行 N 次(或由于另一个原因直到程序停止)。 - -## return -您可以使用 `return` 命令取消函数调用的执行。 参见[官方文档][7]。 -如果你给出一个表达式参数,它的值被用作函数的返回值。 -`return ` 将 `expression` 的值作为函数的返回值并使函数直接返回。 - -## finish -执行直到选定的栈帧返回。 参见[官方文档][5]。 -用法: `finish` -返回后,返回的值将被打印并放入到值历史记录中。 - -## until -执行直到程序到达大于当前栈帧或当前栈帧中的指定位置(与 [break](#break) 命令相同的参数)的源码行。 参见[官方文档][5]。 -此命令用于通过一个多次的循环,以避免单步执行。 -`until ` 或 `u ` 继续运行程序,直到达到指定的位置,或者当前栈帧返回。 - -## continue -在信号或断点之后,继续运行被调试的程序。 参见[官方文档][5]。 -用法: `continue [N]` -如果从断点开始,可以使用数字 `N` 作为参数,这意味着将该断点的忽略计数设置为 `N - 1`(以便断点在第 N 次到达之前不会中断)。 -如果启用了非停止模式(使用 `show non-stop` 查看),则仅继续当前线程,否则程序中的所有线程都将继续。 - -## print -求值并打印表达式 EXP 的值。 参见[官方文档][8]。 -可访问的变量是所选栈帧的词法环境,以及范围为全局或整个文件的所有变量。 -用法: `print [expr]` 或 `print /f [expr]` -`expr` 是一个(在源代码语言中的)表达式。 -默认情况下,`expr` 的值以适合其数据类型的格式打印;您可以通过指定 `/f` 来选择不同的格式,其中 `f` 是一个指定格式的字母;参见[输出格式][9]。 -如果省略 `expr`,GDB 再次显示最后一个值。 - -## x -检查内存。 参见[官方文档][10]。 -用法: `x/nfu ` 或 `x ` -`n`, `f`, 和 `u` 都是可选参数,用于指定要显示的内存以及如何格式化。 -`addr` 是要开始显示内存的地址的表达式。 -`n` 重复次数(默认值是 1),指定要显示多少个单位(由 `u` 指定)的内存值。 -`f` 显示格式(初始默认值是 `x`),显示格式是 `print('x','d','u','o','t','a','c','f','s')` 使用的格式之一,再加 `i`(机器指令)。 -`u` 单位大小,`b` 表示单字节,`h` 表示双字节,`w` 表示四字节,`g` 表示八字节。 -例如,`x/3uh 0x54320` 表示从地址 0x54320 开始以无符号十进制整数的方式,双字节为单位显示 3 个内存值。 - -## display -每次程序停止时打印表达式 EXP 的值。 参见[官方文档][11]。 -用法: `display `, `display/fmt ` 或 `display/fmt ` -`fmt` 用于指定显示格式。像 [print](#print) 命令里的 `/f` 一样。 -对于格式 `i` 或 `s`,或者包括单位大小或单位数量,将表达式 `addr` 添加为每次程序停止时要检查的内存地址。 - -## info display -打印自动显示的表达式列表,每个表达式都带有项目编号,但不显示其值。 -包括被禁用的表达式和不能立即显示的表达式(当前不可用的自动变量)。 - -## undisplay -取消某些表达式在程序停止时自动显示。 -参数是表达式的编号(使用 `info display` 查询编号)。 -不带参数表示取消所有自动显示表达式。 -`delete display` 具有与此命令相同的效果。 - -## disable display -禁用某些表达式在程序停止时自动显示。 -禁用的显示项目不会被自动打印,但不会被忘记。 它可能稍后再次被启用。 -参数是表达式的编号(使用 `info display` 查询编号)。 -不带参数表示禁用所有自动显示表达式。 - -## enable display -启用某些表达式在程序停止时自动显示。 -参数是重新显示的表达式的编号(使用 `info display` 查询编号)。 -不带参数表示启用所有自动显示表达式。 - -## help -打印命令列表。 参见[官方文档][12]。 -您可以使用不带参数的 `help`(缩写为 `h`)来显示命令的类别名的简短列表。 -使用 `help ` 您可以获取该类中各个命令的列表。 -使用 `help ` 显示如何使用该命令的简述。 - -## attach -挂接到 GDB 之外的进程或文件。 参见[官方文档][13]。 -该命令可以将进程 ID 或设备文件作为参数。 -对于进程 ID,您必须具有向进程发送信号的权限,并且必须具有与调试器相同的有效的 uid。 -用法: `attach ` -GDB 在安排调试指定的进程之后做的第一件事是停住它。 -您可以使用所有通过 `run` 命令启动进程时可以使用的 GDB 命令来检查和修改挂接的进程。 - -## run -启动被调试的程序。 参见[官方文档][14]。 -可以直接指定参数,也可以用 [set args][15] 设置(启动所需的)参数。 -例如: `run arg1 arg2 ...` 等效于 -``` -set args arg1 arg2 ... -run -``` -还允许使用 ">", "<", 或 ">>" 进行输入和输出重定向。 - -## backtrace -打印整个栈的回溯。 参见[官方文档][16]。 - - - `bt` 打印整个栈的回溯,每个栈帧一行。 - - `bt n` 类似于上,但只打印最内层的 n 个栈帧。 - - `bt -n` 类似于上,但只打印最外层的 n 个栈帧。 - - `bt full n` 类似于 `bt n`,还打印局部变量的值。 - -`where` 和 `info stack`(缩写 `info s`) 是 `backtrace` 的别名。 - -************ - -## 参考资料 - - - [Debugging with GDB](https://sourceware.org/gdb/current/onlinedocs/gdb/) - - [用 GDB 调试程序(二)](http://blog.csdn.net/haoel/article/details/2880) - --------------------------------------------------------------------------------- - -编译者:[robot527](https://github.com/robot527) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[1]:https://sourceware.org/gdb/current/onlinedocs/gdb/Set-Breaks.html -[2]:https://sourceware.org/gdb/current/onlinedocs/gdb/Disabling.html -[3]:https://sourceware.org/gdb/current/onlinedocs/gdb/Delete-Breaks.html -[4]:https://sourceware.org/gdb/current/onlinedocs/gdb/Set-Watchpoints.html -[5]:https://sourceware.org/gdb/current/onlinedocs/gdb/Continuing-and-Stepping.html -[6]:https://sourceware.org/gdb/current/onlinedocs/gdb/Reverse-Execution.html -[7]:https://sourceware.org/gdb/current/onlinedocs/gdb/Returning.html -[8]:https://sourceware.org/gdb/current/onlinedocs/gdb/Data.html -[9]:https://sourceware.org/gdb/current/onlinedocs/gdb/Output-Formats.html -[10]:https://sourceware.org/gdb/current/onlinedocs/gdb/Memory.html -[11]:https://sourceware.org/gdb/current/onlinedocs/gdb/Auto-Display.html -[12]:https://sourceware.org/gdb/current/onlinedocs/gdb/Help.html -[13]:https://sourceware.org/gdb/current/onlinedocs/gdb/Attach.html -[14]:https://sourceware.org/gdb/current/onlinedocs/gdb/Starting.html -[15]:https://sourceware.org/gdb/current/onlinedocs/gdb/Arguments.html -[16]:https://sourceware.org/gdb/current/onlinedocs/gdb/Backtrace.html - From 46466f6dbdef66850066dc384449d01b04bb324e Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 10 May 2017 08:30:47 +0800 Subject: [PATCH 0034/1407] =?UTF-8?q?=E4=B8=8D=E5=8F=91=E5=B8=83?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @theo-l 缺乏校对,不能发布 --- translated/tech/Tmux_doc_cn.md | 1648 -------------------------------- 1 file changed, 1648 deletions(-) delete mode 100644 translated/tech/Tmux_doc_cn.md diff --git a/translated/tech/Tmux_doc_cn.md b/translated/tech/Tmux_doc_cn.md deleted file mode 100644 index 4d94302414..0000000000 --- a/translated/tech/Tmux_doc_cn.md +++ /dev/null @@ -1,1648 +0,0 @@ -校对中 - -- [名称](#名称) -- [用法](#用法) -- [描述](#描述) -- [键绑定](#键绑定) -- [命令](#命令) -- [客户端和会话](#客户端和会话) -- [窗口和面板](#窗口和面板) - - [窗口和面板命令](#窗口和面板命令) -- [键绑定2](#键绑定2) - - [键绑定命令](#键绑定命令) -- [选项](#选项) - - [选项设置](#选项设置) - - [服务器选项](#服务器选项) - - [会话选项](#会话选项) - - [窗口选项](#窗口选项) -- [鼠标支持](#鼠标支持) -- [格式](#格式) -- [名称和标题](#名称和标题) -- [环境](#环境) -- [状态行](#状态行) -- [缓冲区](#缓冲区) -- [杂项](#杂项) -- [TERMINFO EXTENSIONS](#TERMINFO EXTENSIONS) -- [控制模式](#控制模式) -- [文件](#文件) -- [样例](#样例) - - -##名称 -tmux — terminal multiplexer(终端复用器) - -##用法: - - tmux [-2lCuv] [-c shell-command] [-f file] [-L socket-name] [-S socket-path] [command [flags]] - -##描述 - -tmux是一个终端复用器:它可以在单个屏幕中创建、访问以及控制多个终端。 -tmux也可以从窗口中脱离附着并且继续在后台运行,以便在之后再回到会话。 -当开启tmux之后,它会创建带有一个单独窗口的会话并且在屏幕中进行显示。 -在屏幕底部的状态行显示当前会话的信息并且用来进入交互式命令。 -一个会话是一个在tmux管理下的伪终端集合,每个会话具有一个或多个窗口与其链接。 -一个窗口占用了整个屏幕,并且可以被分割成长方形的面板,每个面板分别为一个伪终端。 -多个tmux实例可能连接到同一个会话,并且任何的窗口可能在一个会话中表示。 -当所有的会话被终止之后,tmux就会退出。 - -每个会话都是持久的并且可能在意外失联或故意脱离附着之后生存下来,tmux可以使用下面的命令来恢复原来的会话: - - $ tmux attach - -在tmux中,一个会话由一个客户端在整个屏幕中显示,并且所有的会话都是由一个单独的服务器进行管理的。 -这个服务器以及每个客户端是通过一个在/tmp中的socket进行交流的。 - -*选项描述*: - - '-2' - 强制tmux假设终端支持256颜色。 - - '-C' - 以控制模式开启,使用-CC来让echo失效 - - '-c shell-command' - 使用默认的shell来执行shell命令。 - 如果有必要的话,tmux服务器会开启来检索默认的shell选项。 - 这个选项用来当tmux作为一个登录shell时与sh进行兼容的。 - - '-f file' - 指定一个可选的配置文件,默认情况下,tmux会从/etc/tmux.conf中加载系统配置文件-如果这个文件存在的话。 - 然后会尝试查找用户的配置文件 ~/.tmux.conf。 - 配置文件是一个tmux命令集合,其中的命令在服务器第一次启动时按顺序执行的。 - tmux会在服务器进程启动之后加载一次配置文件。 - "source-file"命令可以用来在稍后加载一个文件。 - tmux在第一次会话创建时会显示配置文件中的命令出现的任何错误,但是会继续处理配置文件的余下部分。 - - '-L socket-name' - tmurx 将服务器*socsket*存储在*TMUX_TMPDIR*目录下,如果这个变量没有设置的话就会使用*TMPDIR*替换, - 或者当两者都不存在时,就会存储在 /tmp 目录下。默认的*socket*的名称为*default*。 - 这个选项允许指定一个不同的socket名称,允许多个独立的tmux服务器运行。 - 与-S不同的是,不需要使用全路经:所有的sockets文件会创建在一个相同的目录下。 - 如果socket被意外地删除了,那么SIGUSR1信号会发送给tmux服务器进程来重新创建socket文件(注意如果当之前描述的任何 - 父目录不存在的话会出错)。 - - '-l' - 当作一个登录shell使用,当前这个标记没有什么效果是当tmux被用来作为登录shell时与其他shell进行兼容的。 - - '-S socket-path' - 为服务器的socket指定一个可选的全路经,当这个选项指定之后,那么默认的目录不会被使用,并且-L选项会被忽略。 - - '-u' - tmux尝试通过第一个LC_ALL,LC_CTYPE和LANG环境变量来猜测终端是否可能支持UTF-8,这可能不会总是正确。 - -u 选项显式地告知tmux UTF-8是支持的。 - 如果服务器通过客户端传递-u或者检测到UTF-8进行启动的,那么utf8和status-utf8选项会分别在全局窗口和会话选项中生效。 - - '-v' - 请求详细登录,这个选项可能由于不断增长的修饰词被多次指定。登录消息会被存储在当前目录下的tmux-clientPID.log - 和tmux-serverPID.log文件中。其中的PID代表服务器或客户端进程ID。 - - 'command [flags]' - 这个用来指定命令集合中的一个来控制tmux,如果没有指定任何命令那么假设一个新建会话命令。 - -##键绑定 - -tmux可以通过一个前缀键与跟随的命令键进行结合的方式从一个附着的客户端进行控制,前缀键默认为'C-b' - -默认的命令键绑定为: - - 结合键 |含义 --------------------------------------|--------------------- - C-b |给应用发送一个前缀键 C-b - C-o |将当前窗口中的面板向前切换。 - C-z |将tmux客户端挂起 - ! |将当前面板在窗口中突出显示 - " |将当前的面板分割为上下两个面板 - # |列出所有的粘贴缓存 - $ |重命名当前会话 - % |将当前面板分割为左右两个面板 - & |终止当前窗口 - ' |显示一个窗口索引来进行选择 - ( |将当前附着的客户端转换到前一个会话 - ) |将附着的客户端转换到下一个会话 - , |重命名当前窗口 - - |删除最近的复制文本缓存 - . |提示一个索引来移动当前窗口 - 0-9 |选择0-9个窗口 - : |输入tmux命令提示 - ; |移动到前面的活动面板 - = |从一个列表中选择一个缓存来交互式粘贴。 - ? |列出所有的键绑定 - D |选择一个客户端来脱离其附着 - L |将附着的客户端切换到最后一个会话中 - [ |输入赋值模式来复制文本或查看历史 - ] |粘贴最近复制的文本缓存 - c |创建一个新的窗口 - d |脱离当前的客户端 - f |提示在打开的窗口中搜索文本 - i |显示关于当前窗口的一些信息 - l |移动到之前选择的窗口 - n |移动到下一个窗口 - o |移动到当前窗口的下一个面板 - p |移动到之前的窗口 - q |简单地显示面板索引 - r |强制重绘附着的客户端 - s |为当前附着的客户端交互式地选择一个新的会话 - t |显示时间 - w |交互式地选择当前的窗口 - x |终止当前的面板 - z |切换当前面板的放大状态 - { |使用之前的面板来替换当前的面板 - } |使用下一个面板来替换当前的面板 - ~ |显示tmux之前的消息如果存在的话。 - PageUp |进入复制模式并且将页面向上滚动一页。 - Up,Down,Left,Right |转换到当前面板的上, 下,左,右 - M-1到M-5(M=Alt) |将面板按照预设的1-5个布局进行安排:偶数水平,偶数垂直,主水平,主垂直或平铺 - Space |将当前窗口按照下一个预设布局进行安排 - M-n |移动到下一个窗口并且带有一个响铃或者活动标记 - M-o |将当前窗口中的面板从前向后反转 - M-p |移动到前一个窗口并且带有响铃或者活动标记 - C-Up, C-Down C-Left, C-Right |以一个单格的步调调整当前面板的大小 - M-Up, M-Down M-Left, M-Right |以五个单格的步调调整当前面板的大小 - -键绑定可以通过bind-key和unbind-key命令来改变。 - - -##命令 - -这部分包含了tmux支持的命令列表,大部分的命令接收可选的-t参数与一个目标客户端,目标会话,目标窗口或者目标面板。 -它们指定了受命令影响的客户端,会话,窗口或面板 - -目标客户端应该为客户端链接的pty文件的名称,例如对于附着在/dev/ttyp1的客户端可能为 /dev/ttyp1或 -ttyp1。如果没有指定客户端,tmux会尝试当前使用的客户端; -如果失败的话,就会报告一个错误。客户端可以通过list-clients命令列出。 - -目标会话会按照以下顺序进行尝试: - - 1. 一个以$作为前缀的会话ID。 - 2. 一个精确的会话名称(会在list-sessions命令中列出)。 - 3. 会话名称的开始部分,例如“mysess”会匹配一个名为"mysession"的会话。 - 4. 一个与会话名称匹配的fnmatch 模式 - -如果找到了一个单独的会话,就会将其作为目标会话;如果匹配多个会话就会产生错误。 -如果忽略一个会话的话,那么就会使用当前的会话-如果可用的话;如果当前会话不可用,那么最近使用的会话就会被选择。 - -目标窗口通过session:window的格式来指定一个窗口。 会话按照target-session的规则,而窗口会按照以下的顺序来查找: - - 1. 一个下面列表中的特殊标记。 - 2. 一个窗口索引,例如'mysession:1'表示会话'mysession'中的第一个窗口。 - 3. 一个窗口ID,例如@1。 - 4. 一个精确的窗口名称,例如'mysession:mywindow'。 - 5. 一个窗口名称的开始部分,例如'mysession:mywin'。 - 6. 一个于窗口名称相匹配的fnmatch模式。 - 7. 一个空窗口名称制定了下一个未使用的索引如果合适的话(例如new-window或link-window命令), - 否则会话中的当前窗口就被选择。 - -下面的特殊标记可用来指定一个特定的窗口。每个都具有一个可选的单字符格式。 - - 符号 | 别名 | 含义 ---------------|------|--------------- - {start} | ^ | 最小数值的窗口 - {end} | $ | 最大数值的窗口 - {last} | ! | 最后一个窗口 - {next} | + | 按照数字的下一个窗口 - {previous}| - | 按照数字的上一个窗口 - {mouse} | = | 鼠标事件发生的窗口 - -目标面板可以是一个面板ID或者是一个与目标窗口相似的形式,但是带有一个额外可选的跟随面板索引或面板ID的点号“.”。 -如果忽略面板索引的话,那么指定窗口当前的活动面板就会被使用,下面的特殊符号可以作为面板索引使用: - - 符号 |别名 | 含义 --------------------|------|------------- - {last} | ! | 最后一个面板 - {next} | + | 数字指定的下一个面板 - {previous} | - | 数字指定的前一个面板 - {top} | | 顶端面板 - {bottom} | | 底端面板 - {left} | | 最左端面板 - {right} | | 最右端面板 - {top-left} | | 左顶端面板 - {top-right} | | 右顶端面板 - {bottom-left} | | 左底端面板 - {bottom-right} | | 右底端面板 - {up} | | 活动面板上面的面板 - {down} | | 活动面板下面的面板 - {left} | | 活动面板左边的面板 - {right} | | 活动面板右边的面板 - {mouse} | = | 鼠标事件发生的面板 - -符号'+'和'-'可能跟随一个位移,例如: - - select-window -t:+2 - -会话,窗口和面板都通过一个唯一的ID来进行数字编码; -会话ID带有一个*$*前缀,窗口ID带有一个*@*前缀,面板ID带有一个*%*前缀。 -这些在tmux服务器中的会话,窗口或面板生命周期中都是唯一不变的。 -面板ID通过TMUX_PANE环境变量传递给面板的子进程, -ID可能使用'session_id','window_id'或'pane_id'何display-message,list-sesions,list-windows或list-panes命令的格式进行显示。 - -shell-command 参数是sh命令,这可能是一个传递给shell的参数,例如: - - new-window 'vi /etc/passwd' - -会运行: - /bin/sh -c 'vi /etc/passwd' - -此外,new-window,new-session,split-window, respawn-window以及respawn-pane命令允许 shell-command -作为多参数给定并且可以直接执行(不需要 'sh -C')。 者可以避免shell引用问题,例如: - - $ tmux new-window vi /etc/passwd - -会直接运行vi,而不需要调用shell。 - -命令 [参数] 指向一个tmux命令,命令和参数分别进行传递,例如: - - bind-key F1 set-window-option force-width 81 - -或者,如果使用sh的话: - - $ tmux bind-key F1 set-window-option force-width 81 - -多个命令可以作为命令序列的一部分一起指定,每个命令需要使用空格和分号来分隔; -命令按照从左至右的顺序执行,并且以反斜线结束的行会继续到下一行,除非被另外一个反斜线转义。 -一个字面量分号可以通过一个反斜线进行转义包含进来(例如,当需要制定一个命令行序列给键绑定时) - -tmux命令包含样例: - - refresh-client -t/dev/ttyp2 - rename-session -tfirst newname - set-window-option -t:0 monitor-activity on - new-window ; split-window -d - bind-key R source-file ~/.tmux.conf \; \ - display-message "source-file done" - -或者从sh中: - - $ tmux kill-window -t :1 - $ tmux new-window \; split-window -d - $ tmux new-session -d 'vi /etc/passwd' \; split-window -d \; attach - -##客户端和会话: - -tmux服务器管理客户端,会话,窗口和面板。 -客户端是附着在会话上来与他们交互的,不论他们是通过new-session命令或者之后的attach-session命令创建的会话。 -每个会话具有一个或多个窗口与其链接。 -窗口可以连接到多个会话上,窗口又是有一个或多个面板组成的,每个面板包含了一个伪终端。 -对于创建、链接或其他窗口操作的命令会在 [窗口和面板](#窗口和面板)部分详解。 - -下面的命令可以用来管理客户端和会话: - - attach-session [-dr] [-c working-directory] [-t target-session] - (别名: attach) - -如果在tmux外部来运行,会在当前终端中创建一个新的客户端并且将其附着在一个目标会话上。如果这个命令是在tmux中运行的,就会切换当前的客户端。 --d 使附着在这个会话上的其他客户端就会脱离, --r表示这个客户端时只读的(只有键绑定到detach-client或switch-client命令时具有效果)。 -如果没有启动服务器, attach-session 会尝试启动服务器;除非在配置文件中创建了会话否则就会失败。 -对于attach-session命令的目标会话规则稍微有一点调整:如果tmux需要选择最近使用的会话,会偏好选择最近使用的脱离附着的会话。 --c 设置会话的工作目录(为新窗口所使用)为working-directory - - detach-client [-P] [-a] [-s target-session] [-t target-client] - (别名: detach) - -如果绑定了一个键时会脱离当前客户端,由-t来指定客户端,或者所有附着在由-s指定的会话中的客户端。 --a选项会终止除-t指定的目标客户端之外的所有客户端。 --P发送一个SIGHUP信号给当前客户端的父进程,一般是导致其触发退出动作。 - - has-session [-t target-session] - (别名: has) - -如果指定的会话不存在的话,就会报告一个错误并且退出,返回值为1. 如果存在的话,就会退出,返回值为0. - - kill-server - -终止tmux服务器和客户端并且销毁所有的会话。 - - kill-session [-a] [-t target-session] - -销毁指定的会话,关闭连接到会话的任何窗口,并且让所有附着在其上的客户端脱离。 -如果给定了-a选项的话,除了指定的会话之外的会话都被终止。 - - list-clients [-F format] [-t target-session] - (别名: lsc) - -列出附着在服务器上的所有客户端。 对于-F标记,可以参考 [FORMATS](#格式)部分。 -如果给定了目标会话的话,只列出连接到该会话上的客户端。 - - list-commands - (别名: lscm) - -列出所有tmux支持的所有命令语法。 - - list-sessions [-F format] - (别名: ls) - -列出服务器管理的所有会话,对于-F标记,参考 [FORMATS](#格式)部分。 - - lock-client [-t target-client] - (别名: lockc) - -锁定目标客户端, 可以参考 lock-server 命令。 - - lock-session [-t target-session] - (别名: locks) - -锁定附着在目标会话上的所有客户端。 - - new-session [-AdDP] [-c start-directory] [-F format] [-n window-name] [-s session-name] [-t target-session] [-x width] [-y height] [shell-command] - (别名:new) - -使用session-name 来创建一个新的会话。 - -除非给定-d选项,否则新的会话就会附着在当前的终端上。 window-name和shell-comand -是在初始化窗口中执行的窗口和shell命令名称。 -如果使用了-d选项, -x和-y用来指定初始窗口的大小(默认为80x24)。 -如果从终端中运行,任何的termios特殊字符都被保存并且在新会话中的新窗口中使用。 --A 标记使得新会话与一个附着会话具有相同的行为,如果会话名称已经存在的话;这种情况下,对于attach-session来说-D具有与-d相同的行为。 -如果给定了-t选项,新的会话被分组到目标会话中。 -这就意味着他们共享相同的窗口集合--目标会话中的所有窗口都会连接到新的会话上,并且任何后续的新建窗口或关闭窗口都会被应用在两个会话上。 -当前的窗口和之前的窗口以及任何会话选项保持独立,并且每个会话都会在不影响其他会话的情况下被终止。 --n或 shell-command只有在使用-t选项时合法。 --P选项会在新会话创建之后来打印新会话相关信息。默认情况下,会使用'#{session_name}:'格式,但是可以通过-F来指定一个不同的格式。 - - refresh-client [-S] [-t target-client] - (别名:refresh) - -如果绑定了一个键的话会刷新当前客户端,如果使用-t指定了一个客户端的话会刷新单独的客户端。 --S 只会更新客户端的状态条。 - - rename-session [-t target-session] new-name - (别名:rename) - -重命名会话为一个新名称。 - - show-messages [-IJT] [-t target-client] - (别名:showmsgs) - -显示客户端消息或服务器信息。 -所有显示在状态行的消息都存储在一个客户端独立的消息日志中,具有一个由message-limit选项设置的最大限制。 --t 显示目标客户端的日志。 --I,-J 和-T分别显示运行服务器,任务和终端的调试信息。 - - source-file path - (别名:source) - -从路径中来执行命令 - - start-server - (别名:start) - -开启tmux服务器,如果还没有运行,不会创建任何会话。 - - suspend-client [-t target-client] - (别名:suspendc) - -通过发送一个SIGTSTP(tty stop)信号来挂起一个客户端。 - - switch-client [-lnpr] [-c target-client] [-t target-session] [-T key-table] - (别名:switchc) - -将目标客户端所在的当前会话切换到目标会话中, -如果-l, -n或者-p被使用的话,客户端会被分别移动到最后,下一个或上一个会话中。 --r 转换一个客户端的只读(可以参考attach-session命令) --T 设置客户端的键表;来自客户端的下一个键会被解释为来自键表。 -这可能会被用在配置多个前缀键时或者绑定命令到一序列键值时使用。 - -例如,让键入'abc'来运行 list-keys命令: - - bind-key -Ttable2 c list-keys - bind-key -Ttable1 b switch-client -Ttable2 - bind-key -Troot a switch-client -Ttable1 - -##窗口和面板 - -一个tmux窗口可能会在处在多个模式中的某一个模式。 -默认的模式时直接访问附着在窗口上的终端。 -另外一个是复制模式,允许一个窗口的一部分或者其历史能够被复制到一个粘贴缓存中,以便稍候插入到另外的窗口中。 -这个模式时使用 copy-mode命令来进入的,默认绑定到'\['上。也会在一个命令产生输出时进入,例如通过键绑定执行的list-keys。 -可用的键依赖于是选择emacs还是vi模式(参考 mode-keys 选项)。 下面的键对于不同的模式具有合适的支持。 - - 函数 |vi模式 |emacs模式 --------------------------------|-----------|---------------- - Append selection |A | - Back to indentation |^ |M-m - Bottom of history |G |M-< - Clear selection Escape |C-g | - Copy selection Enter |M-w | - Copy to named buffer |" | - Cursor down |j |Down - Cursor left |h |Left - Cursor right |l |Right - Cursor to bottom line |L | - Cursor to middle line |M |M-r - Cursor to top line |H |M-R - Cursor up |k |Up - Delete entire line |d |C-u - Delete/Copy to end of line |D |C-k - End of line |$ |C-e - Go to line |: |g - Half page down |C-d |M-Down - Half page up |C-u |M-Up - Jump again |; |; - Jump again in reverse |, |, - Jump backward |F |F - Jump forward |f |f - Jump to backward |T | - Jump to forward |t | - Next page |C-f |Page down - Next space |W | - Next space, end of word |E | - Next word |w | - Next word end |e |M-f - Other end of selection |o | - Paste buffer |p |C-y - Previous page |C-b |Page up - Previous space |B | - Previous word |b |M-b - Quit mode |q |Escape - Rectangle toggle |v |R - Scroll down |C-Down/C-e |C-Down - Scroll up |C-Up/C-y |C-Up - Search again |n |n - Search again in reverse |N |N - Search backward |? |C-r - Search forward |/ |C-s - Select line |V | - Start of line |0 |C-a - Start selection |Space |C-Space - Top of history |g |M-> - Transpose characters |C-t | - -下一个和上一个单词简默认使用空格和'-','_'以及'@'字符作为单词分隔符,但是可以通过设置会话的word-separators选项进行调整。 -下一个单词会移动到下一个单词的开始位置,下一个单词的末尾会移动到下一个单词的末尾位置, -前一个单词移动到前一个单词的开始位置。 三个下一个和前一个空格键具有相似的作用但是单独使用一个空格作为单词分隔符。 - -跳转命令允许在一个行中快速移动,例如,输入'f'跟随一个'/'会将光标移动到当前行的下一个'/'字符处。 -一个';'之后会移动到字符下一次出现的地方。 - -复制模式中的命令可能由一个可选的重复计数器作为前导,在vi键绑定下,通过数字键来输入前导; -使用emacs时,使用Alt(meta)+数字作为前导实体。例如,为了将光标向前移动10个单词使用'M-1 0 M-f'-对于emacs模式,'10w'-对于vi模式。 - -模式键绑定是通过一个命名表集合定义的:在命令提示的行编辑时使用vi-edit和emacs-edit键, -当从列表中选择时使用vi-choice和emacs-coice键,在复制模式中时使用vi-copy和emacs-copy键。 -这些表可以通过list-keys命令来查看,另外可以通过bind-key和unbund-key命令来修改或移除键。 -如果append-selection,copy-selection或者start-named-buffer给定-x标记,tmux将不会在复制之后退出复制模式。 -copy-pipe复制所选内容并且将其管道到一个命令。 - -例如下面的命令会绑定'C-w'在复制之后不会退出, 'C-q'将所选内容复制到/tmp和粘贴缓冲中。 - - bind-key -temacs-copy C-w copy-selection -x - bind-key -temacs-copy C-q copy-pipe "cat >/tmp/out" - -粘贴缓存键会从栈中顶端的粘贴缓存中粘贴第一行。 -copy-mode命令的简介为: - - copy-mode [-Mu] [-t target-pane] - -进入复制模式。-u选项向上滚动一页。 -M 开始一个鼠标拖拽(只有在绑定鼠标键绑定时有效,参考MOUSE SUPPORT) - -tmux显示的每个窗口可能会被分割为一个或多个面板;每个面板占用一个特定的区域进行显示并且具有一个单独的终端。 -一个窗口可以通过split-window名令分割为多个面板。窗口可以被水平分割(使用-h标记)或者垂直分割。 -面板可以通过resize-pane命令改变大小(默认绑定为'C-up','C-down','C-left','C-right'), -当前的面板可能会通过select-panel命令改变,而rotate-window和swap-panel命令可以在不改变面板位置的情况下切换面板。 -面板被从0开始的数字按顺序计数。 - -有一些默认的预设布局可用,这可以通过select-layout命令来选择或者使用next-layout命令循环选择(默认绑定为'Space'布局); -一旦布局被选定,其中的面板会被移动以及重新改变大小。 - -支持以下的布局: - -even-horizontal: 面板按照偶数地从左到右来分布在窗口中。 -even-vertical: 面板按照偶数地从上到下来分布在窗口中 -main-horizontal: 在窗口的顶端会显示一个大的面板,其余的面板按照从左到右的方式在底部左端的空间分布, -可以使用main-pane-height窗口选项来指定顶部面板的高度。 -main-vertical: 类似于main-horizontal,但是最大的面板会放置在窗口左边而其他的面板按照从上往下的方式在右边进行分布。 -可以参考main-pane-width窗口选项。 -tiled: 面板会尽量将面板在窗口中在行列上以偶数地方式分布。 - -此外,select-layout可以用来应用一个之前使用的布局,list-windows命令会以一个合适的格式显示每个窗口的布局来于select-layout命令结合使用,例如: - - $ tmux list-windows - - 0: ksh [159x48] layout: bb62,159x48,0,0{79x48,0,0,79x48,80,0} - $ tmux select-layout bb62,159x48,0,0{79x48,0,0,79x48,80,0} - -tmux自动地调整当前窗口大小中的布局大小。 注意,一个布局不能应用在多于布局默认定义的面板数量。 - -###窗口和面板命令 -与窗口和面板相关的命令如下: - - break-pane [-dP] [-F format] [-t target-pane] - (别名:breakp) - -将目标面板从其所在的窗口中终止,并将其作为一个新窗口中的唯一的面板。 如果指定-d,新的窗口不会称为当前的窗口。 --P选项会在新窗口创建之后显示其信息。 默认会使用 -'#{session_name}:#{window_index}'的显示格式,但是可以通过-f来指定一个不同的格式。 - - capture-pane [-aepPq] [-b buffer-name] [-E end-line] [-S start-line] [-t target-pane] - (别名:capturep) -捕获一个面板的内容,如果指定-p,那么输出会到达stdou,否则会到达有-b指定的缓冲区(如果没有指定-b缓冲区的话就会指定一个新的缓冲区)。 -如果指定-a, 会使用备用屏幕,并且历史是不可以访问的。如果没有备用的屏幕,在没有指定-q的情况下会返回一个错误。 -如果指定-e,那么输出会包含文本转义序列和后台属性。 -C 也会转义非打印字符为八进制 \\xxx。 -J -会链接包裹的多行并且保留每行末尾尾随的空格。 -P 只会面板接受到的捕获开头是一个非完整转义序列的任意输出。 --S 和 -E 指定开始和结束行的行数,0是可视面板的第一行,而负数时历史行。 '-'到 -S是历史的开始,而 -'-'到-E是可视面板的结尾。 默认情况下只会捕获面板的可视内容。 - - choose-client [-F format] [-t target-window] [template] -将一个窗口置于客户端选择模式,允许从一个列表中交互地选择一个客户端。 -在一个客户端被选择之后'%%'会由模板中的客户端pty路径替换,之后的结果会作为一个命令被执行。 -如果模板没有给定,会使用"detach-client -t '%%'"。 -对于-F标记,可以参考[FORMATS](#格式)部分。 这个命令只有在至少一个客户端被附着之后才工作。 - - choose-session [-F format] [-t target-window] [template] -将一个窗口置于会话选择模式中,可以从一个列表中交互式地选择一个会话。 -当一个会话被选择时,'%%'会由模板中的会话名称替换,之后的结果会作为一个命令被执行。 -如果模板没有给定,会使用"switch-client -t '%%'"。 -对于-F标记,可以参考[FORMATS](#格式)部分。这个命令只有在至少有一个客户端附着时工作。 - - choose-tree [-suw] [-b session-template] [-c window-template] [-S format] [-W format] [-t target-window] -将窗口置于一个树选择模式,其中的会话或窗口可能是从一个列表中交互地选择的。 -默认情况下,窗口属于一个会话主要为了显示他们与一个会话的关系。 -注意choose-window和choose-session命令被包裹在choose-tree中。 -如果给定-s会显示会话,如果给定-w会显示窗口。 -默认情形下,树是被折叠起来的,会话必须通过右箭头简将其展开为窗口。 -u选项会将所有的会话展开。 -如果给定-b,会重载默认的会话命令。 注意 '%%'可以被使用而且会被会话名称替换。如果没有指定的话,默认为"switch-client -t -'%%'"。 如果给定-c,会重载默认的窗口命令,与-b类似,'%%'可以被使用而且会被会话名与窗口索引替换。 -当一个窗口从列表中被选择时,会话命令会在窗口命令运行之前运行。 -如果给定-S,会显示指定的格式而不是默认的会话格式。如果给定-W,会显示指定的格式而不是默认的窗口格式。 -对于-s和-w选项的含义可以参考[FORMATS](#格式)部分。 -这个命令只有当至少有一个客户端附着时工作。 - - choose-window [-F format] [-t target-window] [template] -将一个窗口置于一个选择模式,其中的窗口可以从一个列表中交互地选择。 -当选择一个窗口之后,'%%'会被模板中的会话名称和窗括索引替换,之后的结果作为一个命令被执行。 -如果没有给定模板,"select-window -t '%%'"被使用。 -对于-F的含义可以参考[FORMATS](#格式)部分。 这个命令只有在至少一个客户端附着之后才会工作。 - - display-panes [-t target-client] - (别名:displayp) -由一个客户端来显示每个面板的可视化指示器,可以参考 display-panes-time, display-panes-colour和 -display-panes-active-colour会话选项。由于指示器在屏幕上,一个面板可以通过'0-9'键来选择。 - - find-window [-CNT] [-F format] [-t target-window] match-string - (别名:findw) -在窗口名称,标题和可见的内容中搜索fnmatch模式的匹配字符串。标记被用来控制匹配行为: -C只匹配可见窗口内容, --N只匹配窗口名称,-T匹配窗口标题。 -默认为-CNT。如果只有一个窗口匹配,就会被自动选择,否则就会显示一个选项列表。 -对于-F标记可以参考[FORMATS](#格式)部分。这个命令只有在至少一个客户端被附着时会工作。 - - join-pane [-bdhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane] - (别名:joinp) -与split-window相似,但是取代分割dst-panel并创建一个新面板而代之的是,将其分割并将src-panel移动到空间中。 -这个可以用来逆转break-pane动作。-b选项使得src-pane被联接到dst-pane的左边或上边。 - - kill-pane [-a] [-t target-pane] - (别名:killp) -销毁给定的pane。如果所在窗口中没有剩余的面板,该窗口也会被销毁。 -a选项会销毁除由-t指定面板之外的所有面板。 - - kill-window [-a] [-t target-window] - (别名:killw) -终止当前窗口或目标窗口,将其从所链接的任意会话中移除。 -a选项终止除-t指定窗口之外的所有窗口。 - - last-pane [-de] [-t target-window] - (别名:lastp) -选择最后一个面板,-e 使得输入到面板生效,-d使得输入到面板失效。 - - last-window [-t target-session] - (别名:last) -选择最后一个窗口,如果没有目标窗口指定,选择当前会话中的最后一个窗口。 - - link-window [-dk] [-s src-window] [-t dst-window] - (别名:linkw) -将在src-window的窗口链接到指定的dst-window。如果dst-window被指定但是不存在的话,那么src-window会被链接导那儿。 -如果给定-k并且dst-window存在,那么就会将其终止,否则就会生成一个错误。如果给定-d,新链接的窗口不会被选择。 - - list-panes [-as] [-F format] [-t target] - (别名:lsp) -如果给定-a, 会湖绿target并且会列出服务器上的所有面板。 -如果给定-s,target就是一个会话(或者当前会话)。如果都没有指定,target就是一个窗口(或者当前窗口)。对于-F标记可以参考[FORMATS](#格式)部分。 - - list-windows [-a] [-F format] [-t target-session] - (别名:lsw) -如果给定-a,会列出服务器上的所有窗口。 否则会列出当前会话或target-session中的窗口。对于-F标记可以参考[FORMATS](#格式)部分。 - - move-pane [-bdhv] [-l size | -p percentage] [-s src-pane] [-t dst-pane] - (别名:movep) -与join-pane类似,但是src-pane和dst-pane可以属于相同的窗口。 - - move-window [-rdk] [-s src-window] [-t dst-window] - (别名: movew) -这个于link-window相似,除了src-window中的窗口被移动到dst-window。给定-r会话中的所有窗口都会在遵照base-index选项下按照序列顺序重新编号。 - - new-window [-adkP] [-c start-directory] [-F format] [-n window-name] [-t target-window] [shell-command] - (别名:neww) -创建一个新的窗口,给定-a,新建的窗口会被插入到指定target-window的下一个索引上,必要的话会将窗口向上移,否则target-window就是这个新建的窗口。 - -如果给定-d, 会话不会将新建窗口作为当前窗口。target-window表示将会创建的窗口;如果目标窗口已经存在会显示一个错误,如果使用-k标记就会销毁。 -shell-command是将要执行的命令。如果没有指定shell-command, -default-command选项的值被默认使用。-c选项指定了新窗口创建的工作目录。 -当shell命令完成时,窗口关闭。 参考remain-on-exit选项来改变这个行为。 -对于运行在tmux中的所有程序需要将TERM环境变量设置为"screen"。 -新的窗口会自动将"TERM=screen"加到他们的环境中,但是必须注意不要在shell启动文件中重置这个变量。 --P 选项在新窗口创建后会打印与之相关的信息。 -默认情况下,使用'#{session_name}:#{window_index}'的格式,但是可以通过使用-F来指定一个不同的格式。 - - next-layout [-t target-window] - (别名:nextl) -将窗口移动到下一个布局模式并且重新安排面板来使之适应。 - - next-window [-a] [-t target-session] - (别名:next) -移动到会话中的下一个窗口,如果-a指定,在移动到下一个窗口时带有警告。 - - pipe-pane [-o] [-t target-pane] [shell-command] - (别名:pipep) -将target-pane中程序的输出通过管道传递给一个shell命令。一个面板可能一次只能管道给一个命令,在shell-command命令执行之前任何存在的管道都会关闭。 -shell-command字符串可能会包含status-left选项所支持的特殊字符序列。 如果没有指定shell-command,那么当前的管道就会被关闭。 --o选项只有在没有之前的管道存在时打开一个新管道,允许一个管道通过一个单键进行切换,例如: - - bind-key C-p pipe-pane -o 'cat >>~/output.#I-#P' - - - previous-layout [-t target-window] - (别名:prevl ) -移动到会话之前的布局。 - - previous-window [-a] [-t target-session] - (别名:prev) -移动到会话之前的窗口,使用-a选项会带有一个警告。 - - rename-window [-t target-window] new-name - (别名: renamew) -重命名当前窗口或者由-t指定的target-window窗口为new-name - - resize-pane [-DLMRUZ] [-t target-pane] [-x width] [-y height] [adjustment] - (别名:resizep) -重新定义面板的大小,通过-U, -D, -L或-R来调整上下左右,或者通过-x/-y指定绝对值大小。 -调整是通过行或单元格来给定的(默认为1)。 -使用-Z时,活动面板会在放大(占用整个窗口)或未放大(在布局中的正常位置)之间进行切换。 --M 开始鼠标重定义大小(只有在鼠标键绑定时有效,参考MOUSE SUPPORT部分) - - respawn-pane [-k] [-t target-pane] [shell-command] - (别名:respawnp) -在shell-comman退出之后重新激活面板(可以参考remain-on-exit 窗口选项)。如果没有给定shell-comman, -那么面板创建时所使用的命令会被执行。面板必须是已经激活的状态,如果给定-k,任何存在的命令都会被终止。 - - respawn-window [-k] [-t target-window] [shell-command] - (别名:respawnw) -在shell-command退出之后重新激活窗口(可以参考remain-on-exit窗口选项)。 如果没有指定shell-comman, -那么窗口创建时所使用的命令会被执行。 窗口必须是已经激活的状态,如果指定-k任何存在的命令都会被终止。 - - rotate-window [-DU] [-t target-window] - (别名:rotatew) -轮换窗口中面板的位置,或者通过-U向前或者向后。 - - select-layout [-nop] [-t target-window] [layout-name] - (别名:selectl) -为窗口选择一个特定的布局,如果没有指定布局名称,就会使用最后使用的预设布局并且重新布局。 - - select-pane [-DdegLlRU] [-P style] [-t target-pane] - (别名:selectp) -将target-pane面板作为target-window窗口中的活动面板,或者设置其风格(使用-P)。 -如果使用了-D,-L,-R或者-U的话,就会分别使用target-pane面板的下面,左边,右边或上面的面板。 --l与使用last-pane命令效果一样。 -e使得输入到面板生效,-d使得输入到面板失效。 - -每个面板具有一个风格:默认使用window-style和window-active-style选项。select-pane -P 为单个面板设置风格。 -例如将第一个面板的北京设置为红色red: - - select-pane -t:.1 -P 'bg=red' - --g 显示当前面板的样式。 - - select-window [-lnpT] [-t target-window] - (别名:selectw) -选择目标窗口。-l,-n和-p等价于last-window,next-window和previous-window命令。 -如果给定-T,而且选择的窗口已经是当前窗口,那么命令表现为last-windown命令。 - - split-window [-bdhvP] [-c start-directory] [-l size | -p percentage] [-t target-pane] [shell-command] [-F format] - (别名:splitw) -通过分割target-pane窗口来创建一个新面板: -h为水平分割,-v为垂直分割; 默认为垂直分割。 --l和-p选项指定新面板的行(对于垂直分割)或单元格(水平分割),或者作为百分比。-b选项使得新建面板在target-pane的左边或上边。 -其他的任何选项的含义于new-window命令一样。 - - swap-pane [-dDU] [-s src-pane] [-t dst-pane] - (别名:swapp) -转换两个面板。如果使用-U并且没有通过-s来指定源面板的话,dst-pane会与之前的面板进行转换;-D与下一个面板进行转换。 --d用来指示tmux不要改变活动面板。 - - swap-window [-d] [-s src-window] [-t dst-window] - (别名:swapw) -这个与link-window类似,除了源面板与目标面板相互转换之外。如果在src-window没有窗口的话会出错。 - - unlink-window [-k] [-t target-window] - (别名:unlinkw) -取消target-window的链接。除非给定-k选项,否则只有当一个窗口链接到多个会话时才会被取消链接-窗口不能链接到空会话; -如果指定-k选项,而且窗口只有与一个会话相关联,那么窗口会被取消该链接并且被销毁。 - -##键绑定2 - - tmux允许一个命令被绑定到大多数键上-无论是否带有前导键。当指定键时,大部分键代表其本身字面量含义(例如'A-Z')。 -Control键可能表示为'C-'或'^'前导,而Alt(meta)表示为'M-'。此外,特殊的键名称也是被接受的:Up,Down, Left, Right, -BSpace, BTab, DC(delete), End, Enter, Escape, F1-F12, Home, IC(insert), NPage/PageDown/PgDn, PPage/PageUp/PgUp, Space和Tab。 -注意为了绑定双引号或单引号键,引号标记是必需的,例如: - - bind-key '"' split-window - bind-key "'" new-window - -###键绑定命令 -与键绑定相关的命令如下: - - bind-key [-cnr] [-t mode-table] [-T key-table] key command [arguments] - (别名:bind) -将键绑定到命令。键被绑定到一个键表中。 -默认情况(没有'-T')时,键被绑定到前导键表中。这个表被用在前导键键入之后再键入的键(例如,'c'默认绑定为前导键表中的新建窗口命令, -所以'C-b c'会创建一个新窗口)。 -根键表被用在不需要前导键的键输入:将'c'在根键表中绑定为新建窗口命令时意味着一个普通的'c'键就会创建一个新窗口。 -'-n' 是 '-T root' 的别名。键同样可以绑定到客制化的键表中,'switch-client -T command' 用来从一个键绑定中切换到相应的键。 -'-r' 标记指定这个键可以重复,参考'repeat-time'选项。 - -如果出现-t选项,那么键会绑定到一个mode-table(模式表): 使用-c来绑定到命令模式,缺省时绑定为普通模式。 -可以参考WINDOWS AND PANES部分,并且 list-keys命令可以查看模式键绑定。 - -为了查看默认的绑定和可用的命令可以参考list-keys 命令: - - list-keys [-t mode-table] [-T key-table] - (别名:lsk) -列出所有的键绑定。 没有指定-T时会打印所有的键表,指定-T时只会打印key-table. -带-t时,在模式表中的键绑定会被列出来; 模式可能为以下之一:vi-edit,emacs-edit,vi-choice,emacs-choice, -vi-copy或emcas-copy。 - - send-keys [-lMR] [-t target-pane] key ... - (别名:send) -发送一个或多个键到一个窗口中,其中的每个参数key是发送的键的名称(例如'C-a'或者'npage'); -如果字符串不能作为键来识别,就会作为一系列字符串发送。 --l标记让键名查找失效并且发送键的字面量值。所有的参数被按照先后顺序序列地发送。 --R标记导致终端状态被重置。 --M 通过一个鼠标时间传递(只有当绑定一个鼠标键绑定时有效,参考MOUSE SUPPORT)。 - - send-prefix [-2] [-t target-pane] -发送前导键-或者发送二级前导键如果与-2一起使用时-到一个窗口就像该键被按下一样。 - - unbind-key [-acn] [-t mode-table] [-T key-table] key - (别名:unbind) -取消命令到键的绑定,-c,-n,-T 和-t与bind-key命令的含义一样。 如果-a存在,所有的键绑定都会被移除。 - -##选项 -tmux的外观和行为可以通过修改各个选项的值来进行改变,具有三种选项:服务器选项,会话选项和窗口选项。 -tmux服务器具有一个全局选项集合--这个选项集合不会应用到任何特定的窗口或会话中。 -这些选项通过'set-option -s'命令进行修改,或者通过'show-options -s' 命令进行显示。 -此外,每个单独的会话可能具有一个会话选项集合,同时具有一个分开全局会话选项集合。 -没有特定选项配置的会话会从全局会话选项中继承其值。会话选项可以通过set-option命令进行设置或重置, -可以通过show-options命令来列出会话选项。可用的服务器和会话选项会在set-option命令下列出。 -类似地,每个窗口都附着了一个窗口选项集合,并且具有一个全局窗口集合来继承所有的重置选项。 -窗口选项使用set-window-option命令来进行修改,并且可以通过show-window-options命令来列出。 -所有的窗口选项使用set-window-option命令归档。 - -tmux也支持以'@'作为前导的用户选项, 用户选项可以具有任何名称,可以被设置为任何字符串,只要具有'@'作为前导,例如: - - $ tmux setw -q @foo "abc123" - $ tmux showw -v @foo - abc123 - -###选项设置 - -设置选项的命令如下: - - set-option [-agoqsuw] [-t target-session | target-window] option value - (别名:set) -通过-w来设置窗口选项(与set-window-option命令等价),-s设置服务器选项,否则设置会话选项。 -如果指定-g,那么全局会话或窗口选项就会被设置。 --u标记用来重置选项,所以一个会话从全局选项中来继承,不能重置一个全局选项。 --o标记阻止设置一个已经存在的选项。 --q标记会取消位置选项发生的错误。 -带有-a时,如果选项期待一个字符串或者一个样式,那么只会被附加在已经设置的值后面,例如: - - set -g status-left "foo" - set -ag status-left "bar" - -会得到'foobar'结果,而: - - set -g status-style "bg=red" - set -ag status-style "fg=blue" - -会得到一个红色背景和蓝色前景的结果。 -没有-a时,这个值会使用默认的背景和一个蓝色前景。 -可用的窗口选项在set-window-option下列出。 -选项的值依赖于选项类型,可以为数字,字符串,或者一个标记(on/off/省略)。 - - - - -###服务器选项 -可选的服务器选项有: - - buffer-limit number -设置缓冲器数量; 新的缓冲器被放置在栈顶端,旧的缓冲器在维护最大长度时有必要时从栈底端移除。 - - default-terminal terminal -为会话中新创键的窗口设置一个默认的终端-默认值为TERM环境变量。为了让tmux正确工作,这个值必须设置为'screen','tmux'或者来自他们的一个派生值。 - - escape-time time -设置一个tmux用来在接受到一个转义字符输入时的等待毫秒数,以此让tmux来判断该字符时函数的一部分还是一个meta键序列的一部分。 -默认为500毫秒。 -设置一个tmux用来在接受到一个转义字符输入时的等待毫秒数,以此让tmux来判断该字符时函数的一部分还是一个meta键序列的一部分。 -默认为500毫秒。 - - exit-unattached [on | off] -如果生效,服务器会在没有任何附着的客户端时退出。 - - - focus-events [on | off] -如果生效,在终端支持的情况下会从终端获取聚焦事件请求,然后通过tmux中运行的应用来传递。 -附着的客户端应该被脱离附着状态然后在选项修改之后重新进行附着。 - - message-limit number -设置每个客户端保存到消息日志中的错误或信息消息的数量,默认为100。 - - set-clipboard [on | off] -尝试使用\e]52;...\007 xterm转义序列来设置终端的剪切版。 -如果在客户终端的terminfo描述中存在一个Ms实体,那么这个选项默认为on. 注意在xterm中需要设置以下资源来让这个特性生效: - - disallowedWindowOps: 20,21,SetXprop - -或者在需要的时候从xterm交互中改变这个属性值。 - - terminal-overrides string -包含了一个个实体列表来重载使用terminfo读取的终端描述信息。 -字符串是一个"逗号"分割的项目列表,每个项目是一个':'分割的字符串来组成终端类型模式以及一个name=value实体集合。 - -例如,为了给所有的终端类型设置terminfo实体'clear'为'\e[H\e[J',以及将'rxvt'终端类型的实体'dch1'的值设置为'\e[P', -那么这个选项会按照以下字符串进行设置: - - "*:clear=\e[H\e[2J,rxvt:dch1=\e[P" - -终端实体值会在解释之前通过strunvis传递,默认的值会强制地更新支持256colors的终端的'colors'实体: - - "*256col*:colors=256,xterm*:XT" - - - -###会话选项 - -可用的会话选项有: - - assume-paste-time milliseconds -如果被键入的键快于用毫秒指定的值,那么这些键会被假设为粘贴而不是键入,而且tmux键绑定不会被执行。默认为一毫秒,0用来让选项失效。 - - base-index index -设置在创建一个新窗口时应该搜索的未使用索引的基索引,默认为0。 - - bell-action [any | none | current] -窗口响铃动作,any表示连接到一个会话的任何窗口中的响铃会导致这个会话中的当前窗口中的一个响铃,none表示所有的响铃被忽略, -current表示除了当前窗口之外的窗口中的响铃将会被忽略。 - - bell-on-alert [on | off] -如果为on,在出现一个警告时,终端会响铃。 - - default-command shell-command -设置新窗口所使用的命令(如果没有指定就是窗口创建时的命令)为shell-command, 可能为任何sh命令。 -默认是一个空字符串,用来指示tmux使用默认shell选项来创建一个登录shell。 - - default-shell path -指定默认的shell, 当default-command为空时,这个会作为新建窗口的登录shell,这个path值必须为完整的路径名。 -在启动之后,tmux会尝试从第一个合适的SHELL环境变量中来设置为默认值,shell由'getpwuid'或者 '/bin/sh'。 -这个选项在将tmux作为一个登录shell使用时应该被配置。 - - destroy-unattached [on | off] -如果生效的话,当会话不再附着在任何客户端时就会被销毁。 - - detach-on-destroy [on | off] -如果为on(默认值), 当附着的会话被销毁时,客户端会脱离附着。 如果off,客户端会被切换为剩余会话中的最近活动的会话。 - - display-panes-active-colour colour -设置为活动面板显示指令的display-panes命令所使用的colour。 - - display-panes-colour colour -设置为不活动面板显示指令的display-panes命令所使用的colour。 - - display-panes-time time -以毫秒为淡灰来设置display-panes命令显示指令出现的时间。 - - display-time time -设置状态行消息和其他屏幕指令显示的时间总和,时间是以毫秒指定的。 - - history-limit lines -设置窗口历史持有的最大行数,这个设置只会应用在新窗口上--退出时窗口历史不会重写大小并且会保留在其创建时段的限制。 - - lock-after-time number -在number秒时间不活动后会锁定会话(与lock-session命令类似),如果lock-server选项被设置的话, -那么整个服务器(所有会话)都会被锁定。默认为不锁定(number为0)。 - - lock-command shell-command -锁定每个客户端时运行的命令,默认为lock -np 命令。 - - lock-server [on | off] -如果选项为on(默认值), 与每个会话单独锁定不同的是,整个服务器会在所有会话被锁定时锁定。 -作为一个会话选项这个没有什么影响,这个必须时一个全局选项。 - - message-command-style style -设置状态行命令样式,样式是一个由逗号分割的字符列表来指定的。 -这些样式可能时'bg=colour'来设置背景颜色,'fg=colour'来设置前景颜色,另外有下面指定的属性列表: - -颜色值可以为这些颜色中的一个:black,red,green, yellow, blue, magenta,cyan,white,aixterm bright -variants(如果支持的话,会有:brightred,breightgreen,等)。 -256-colour集合中从colour0到colour255为默认值,或者一个十六进制的RGB字符串,例如'#ffffff'-会从默认的256-colour集合中选择最匹配的颜色。 -属性既可以为none或者一个逗号分割一个或多个包含(bright(或bold),dim,underscore,blink,reverse, hidden或者italics)的列表来开启属性, -或者带有'no'前缀的属性来关闭属性。 - -样例: - - fg=yellow,bold,underscore,blink - bg=black,fg=default,noreverse - -如果set-option命令具有一个 '-a' 标记的话,新的样式会添加进来,否则已经存在的样式被替换。 - - message-style style -设置状态行消息样式,对于如何指定样式,可以参考message-command-style选项。 - - mouse [on | off] -如果为on,tmux会捕获鼠标并且允许鼠标时间作为键绑定进行结合。 可以参考MOUSE SUPPORT 部分详解。 - - mouse-utf8 [on | off] -如果生效,在UTF-8终端请求鼠标输入作为UTF-8。 - - prefix key -设置接收到的key作为前导键 - - prefix2 key -设置接收到的键作为二级前导键。 - - renumber-windows [on | off] -如果为on, 当一个窗口在会话中关闭时,自动地将其他窗口按照数字顺序重新编序。 -这回参考base-index选项如果设置了这个选项的话。如果为off,不会对窗口进行重新排序。 - - repeat-time time -允许指定的时间内(默认为500毫秒)在不重新输入前导键时输入多个命令。 -一个键是否可以重复可以在使用bind-key命令结合时使用-r选项进行设置。 -对于与resize-pane命令结合的默认键的重复是开启的。 - - set-remain-on-exit [on | off] -为在这个会话中任何第一次创建的窗口设置remain-on-exit窗口选项。 -当这个选项为true时,运行程序所在的窗口在程序退出时不会关闭,而是保持打开但是不活动。 -可以使用respawn-window命令来重新激活这个窗口,或者使用kill-window来销毁窗口。 - -如果tsl和fslterminfo实体存在的话,会尝试用其来设置客户终端的标题。 -如果终端显示为一个xterm的话tmux自动将其设置为\e]2;...\007序列。 -这个选项默认为off。注意elinks只会在设置了STY环境变量时才尝试设置窗口标题。 - - set-titles-string string -如果set-titles为on,那么字符串string就会用来设置窗口标题。 格式被扩展,参考[FORMATS](#格式)部分。 - - status [on | off] -显示或隐藏状态行。 - - status-interval interval -在每个间隔时间段更新状态栏。 默认时没15秒更新。如果为0会让时间间隔重绘状态失效。 - - status-justify [left | centre | right] -设置状态行窗口列表组件的位置:left,center,或者right对齐。 - - status-keys [vi | emacs] -在状态栏使用vi或者emacs-样式的键绑定,例如在命令提示时。默认为emacs, 除非VISUAL -或者EDITOR环境变量被设置并且包含字符串'vi'。 - - status-left string -将字符串(默认为会话名称)显示在状态栏的左边。字符串会通过strftime传递并且格式会被扩展,也可能会包含下面特殊字符序列的任意字符: - - 字符对 | 替换值 ----------------------------|--------------------------------- - #(shell-command) | 命令输出的首行。 - #[attributes] | 颜色或属性改变 - ## | 一个'#'字面量值。 - -'\#(shell-command)'形式执行'shell-command'然后插入其输出的首行。 -注意shell命令只会在由status-interval选项指定的时间间隔内执行一次:如果同时重绘状态的话,会使用之前输出结果。 -shell命令的执行会带有tmux的全局变量集合(参考 ENVIRONMENT部分)。 -对于如何设置名字和标题的细节可以参考NAMES AND TITLES 部分。 对于允许设定的属性可以参考message-command-style选项。 - -样例有: - - #(sysctl vm.loadavg) - #[fg=yellow,bold]#(apm -l)%%#[default] [#S] - -默认字符串中的UTF-8不会被解释,需要使用status-utf8选项来开启UTF-8。 -默认值为'[#s]'。 - - status-left-length length -设置状态栏左边组件的最大长度,默认为10。 - - status-left-style style -设置状态行左边部分的样式,参考message-style-style选项来指定样式。 - - status-position [top | bottom] -设置状态行的位置。 - - status-right string -显示字符串在状态栏的右边,默认为带双引号的当前窗口标题以及日期时间会被显示。 -与status-left类似,字符串也会传递给strftime,字符对会被替换而且UTF-8也依赖于status-utf8选项。 - - status-right-length length -设置状态栏右边组件的最大长度,默认为10。 - - status-right-style style -设置状态行右边部分的样式,参考message-command-style选项设置样式。 - - status-style style -设置状态行样式,参考message-command-style选项设置样式。 - - status-utf8 [on | off] -指示tmux将status-left和status-right中的字符串中的top-bit-set当作UTF-8处理;值得注意的时,这对于宽字符很重要。默认为off。 - - update-environment variables -设置一个包含由空格分开的环境变量列表字符串--这些环境变量会在新会话创建时或一个已存在的会话被附着时复制到会话环境中。 -任何在源环境中不存在的变量会从会话环境中设置为移除(类似于将-r传递给set-environment命令)。 -默认值为"DISPLAY SSH_ASKPASS SSH_AUTH_SOCK SSH_AGENT_PID SSH_CONNECTION WINDOWID XAUTHORITY"。 - - visual-activity [on | off] -如果为on, 当活动出现在一个由monitor-activity窗口选项生效的窗口中时显示一个状态行。 - - visual-bell [on | off] -如果为on,响铃时会显示一个消息而不是将其传递到终端(会产生一个声音)。可以参考bell-action选项。 - - visual-silence [on | off] -如果monitor-silence生效的话,那么当时间间隔在一个指定窗口中过期时会打印一个消息。 - - word-separators string -设置会话关于单词分隔符字符的概念,主要是为了复制模式中的下一个或前一个单词命令的目的。默认为'-_@'。 - - set-window-option [-agoqu] [-t target-window] option value - (别名:setw) -Set a window option. The -a, -g, -o, -q and -u flags work similarly to the set-option command. - -###窗口选项 -支持的窗口选项有: - - aggressive-resize [on | off] -积极地重新调整所选窗口大小。意味着tmux会重新调整窗口的尺寸为当前窗口的最小会话尺寸,而不是其附着的最小的会话。 -在当前窗口改变为另外一个会话时窗口会重新调整大小;这个选项对于支持SIGWINCH的全屏程序有好处而对于交互式程序如shell不是太好。 - - allow-rename [on | off] -允许程序通过终端转义序列(\033k...\033\\)改变窗口名称。默认为on。 - - alternate-screen [on | off] -这个选项用来配置运行在tmux中的程序是否可以使用终端的被用屏幕特性-允许terminfo的smcup和rmcup能力。 -被用屏幕特性在一个交互式程序开启并且在从退出后恢复之后可以保留窗口的内容, -这样任何程序开始之前的可视输出会在程序退出之后重新出现。默认为on。 - - automatic-rename [on | off] -控制自动化窗口命名。当开启这个设置时,tmux会使用由automatic-rename-format指定的格式来自动地重命名窗口。 -对于由new-window和new-session在创建时,或者之后通过rename-window或者使用终端转义序列指定的窗口名称, 这个标识会自动失效。 - -可以通过以下方式来将其在全局范围内关闭: - - set-window-option -g automatic-rename off - - - automatic-rename-format format - -在automatic-rename选项生效时会使用这个格式, 参考 [FORMATS](#格式) 。 - - c0-change-interval interval - c0-change-trigger trigger -这两个选项配置面板改变时间间隔的一个简单格式。如果tmux在1毫秒内查看到除C0序列之外的触发器(例如回车,换行或删除) -修改屏幕,会立即停止更新面板。否则会在每个时间间隔内重绘整个面板。 -这个可以帮助来阻止快速输出(例如yes)覆盖整个终端。默认为触发器250, 时间间隔100。 -0触发器用来失效速率限制。 - - - - clock-mode-colour colour -设置时钟颜色。 - - clock-mode-style [12 | 24] -设置时钟小时格式 - - force-height height - force-width width -阻止tmux将窗口的大小值超过width或height, 0值会恢复默认无限制设置。 - - main-pane-height height - main-pane-width width -设置main-horizontal 或 main-vertical布局中的主面板的长和宽。 - - -mode-keys [vi | emacs] -在复制或选择模式中使用vi/emacs键绑定。与status-keys选项一样默认为emacs, 除非VISUAL或EDITOR包含了vi。 - -mode-style style -设置窗口模式样式, 参考message-command-style选项指定样式。 - -monitor-activity [on | off] -监视窗口中的活动。具有活动事件的窗口在状态栏上高亮显示。 - -monitor-silence [interval] -在一段时间间隔内对非活动窗口进行监控。时间间隔内沉默的窗口在状态栏高亮。 -0间隔值让其监控失效。 - - -other-pane-height height -设置main-horizontal布局中主面板之外的面板高度。默认为0-没有任何作用。 -如果main-pane-height和other-pane-height选项同时设置,主面板会变得来使得 -其他面板达到指定高度,但是不会反过来作用。 - -other-pane-width width -与other-pane-height类似,只是用来设置 main-vertical布局中的其他面板的宽度。 - -pane-active-border-style style -设置当前活动面板的边框样式。 参考 message-command-style选项来指定样式,属性被忽视。 - -pane-base-index index -与 base-index类似,只是用来设置面板的开始数字。 - -pane-border-style style -设置活动面板周围面板的样式。 参考 message-command-style选项来指定样式,属性被忽视。 - -remain-on-exit [on | off] -带有该标识设置的窗口在其中程序退出时不会被销毁。 -窗口可能使用respawn-window命令重新激活。 - -synchronize-panes [on | off] -将到任意面板的输入复制到相同窗口中的所有其他面板(没有在特殊模式中的面板)。 - -utf8 [on | off] -指示tmux期待在窗口中出现 UTF-8序列。 - -window-active-style style -设置窗口的活动面板的样式。参考 message-command-style选项来指定样式。 - -window-status-activity-style style -设置窗口的状态行样式带有一个活动警告。参考 message-command-style选项来指定样式。 - -window-status-bell-style style -设置窗口的状态行样式带有一个响铃警告。参考 message-command-style选项来指定样式。 - - window-status-current-format string -与 window-status-format类似,只是这个格式在窗口为当前窗口时使用。 - - window-status-current-style style -为当前的活动窗口设置状态行样式。 参考 message-command-style选项来指定样式。 - - window-status-format string -设置状态行列表中显示窗口的格式。 参考 status-left选项关于可用的特殊字符序列信息。默认值为'#I:#W#F'。 - - window-status-last-style style -为最后一个活动窗口设置状态行样式。参考 message-command-style选项来指定样式。 - - window-status-separator string -设置状态行中窗口之间的分隔符,默认为单个空格符。 - - window-status-style style -为单个窗口设置状态行样式。参考 message-command-style选项来指定样式。 - - window-style style -设置默认窗口样式。参考 message-command-style选项来指定样式。 - - xterm-keys [on | off] -设置该选项会使tmux生成xterm-style功能键序列; 这些包含了一个数字来指定修饰符如Shift,Alt或Ctrl。默认为off。 - - wrap-search [on | off] -设置这个选项会使得搜索动作包含面板内容的末尾。 默认为on。 - - show-options [-gqsvw] [-t target-session | target-window] [option] -(别名:show) -使用-w来显示窗口选项(可以指定单个窗口),使用-s显示服务器选项,否则显示target-session的会话选项。 --g用来显示全局会话或窗口选项。 --v只显示选项值,不包含名称。 --q指示重置选项不会返回错误。 - - show-window-options [-gv] [-t target-window] [option] -(别名:showw) -列出窗口选项或者target-window指定的单个窗口选项。 --g用来显示全局窗口选项。 --v显示选项值,忽略选项名。 - -##鼠标支持 -如果鼠标选项开启(默认为关闭),tmux允许将鼠标时间作为键来结合。 -每个键的名称是由鼠标事件(例如'MouseUp1')和一个位置后缀('Pane'表示面板内容,'Border'面板边界 -或者'Status'状态行)组成的。可以使用以下的鼠标事件: - - MouseDown1 MouseUp1 MouseDrag1 - MouseDown2 MouseUp2 MouseDrag2 - MouseDown3 MouseUp3 MouseDrag3 - WheelUp WheelDown - -每个都需要带有一个位置后缀,例如'MouseDown1Status' - -特殊标记'{mouse}'或'='可能在命令中作为target-window或target-pane与鼠标键绑定进行结合。 -会在鼠标事件发生的位置解析为窗口或面板(例如,对于一个'MouseUp1Status'绑定在在状态行上的窗口, -或者对于'WheelDownPane'绑定面板上的鼠标滚动)。 - -'send-key -M'标记可以用来将一个鼠标时间转发到一个面板上。 - -默认的键绑定允许鼠标用来选择和改变面板大小,复制文本或者使用状态行来改变窗口。 -这些动作在开启鼠标选项时发生作用。 - - -##格式 - -有些命令接受由-F标记附带的格式参数。这个参数是一个控制命令输出格式的字符串。 -可替换的变量被包含在'#{'和'}'之间,例如'#{session_name}'。 -可用的变量在下表中列出,或者tmux选项的名称可以一个选项的值。 -有些变量具有一个简短的别名,例如'#s', 而'##'会使用一个单独的'#'来替换。 - - -条件可以通过'?'作为前缀,逗号作为分隔符来使用,如果指定的变量存在并且不是0,那么第一个选项被选择,否则选择第二个选项。 -例如'#{?session_attached,attached,not attached}'条件,当会话是附着的就会包含'attached'否则就会包含'not attached'。 -而对于'#{?automatic-rename, yes, no}'如果开启了automatic-rename的话会包含'yes'否则包含'no'。 -可以通过一个前缀'=',一个数字和一个冒号来作为字符串的长度限制,所以'#{=10:pane_title}'最多包含pane标题的前10个字符。 - -在合适的地方有以下的变量是可用的: - - 变量名 | 别名 | 替换值 - -----------------------|--------------|----------------------------------- - alternate_on | | If pane is in alternate screen - alternate_saved_x | | Saved cursor X in alternate screen - alternate_saved_y | | Saved cursor Y in alternate screen - buffer_sample | | Sample of start of buffer - buffer_size | | Size of the specified buffer in bytes - client_activity | | Integer time client last had activity - client_activity_string | | String time client last had activity - client_created | | Integer time client created - client_created_string | | String time client created - client_height | | Height of client - client_last_session | | Name of the client's last session - client_prefix | | 1 if prefix key has been pressed - client_readonly | | 1 if client is readonly - client_session | | Name of the client's session - client_termname | | Terminal name of client - client_tty | | Pseudo terminal of client - client_utf8 | | 1 if client supports utf8 - client_width | | Width of client - cursor_flag | | Pane cursor flag - cursor_x | | Cursor X position in pane - cursor_y | | Cursor Y position in pane - history_bytes | | Number of bytes in window history - history_limit | | Maximum window history lines - history_size | | Size of history in bytes - host | #H | Hostname of local host - host_short | #h | Hostname of local host (no domain name) - insert_flag | | Pane insert flag - keypad_cursor_flag | | Pane keypad cursor flag - keypad_flag | | Pane keypad flag - line | | Line number in the list - mouse_any_flag | | Pane mouse any flag - mouse_button_flag | | Pane mouse button flag - mouse_standard_flag | | Pane mouse standard flag - mouse_utf8_flag | | Pane mouse UTF-8 flag - pane_active | | 1 if active pane - pane_bottom | | Bottom of pane - pane_current_command | | Current command if available - pane_dead | | 1 if pane is dead - pane_dead_status | | Exit status of process in dead pane - pane_height | | Height of pane - pane_id | #D | Unique pane ID - pane_in_mode | | If pane is in a mode - pane_input_off | | If input to pane is disabled - pane_index | #P | Index of pane - pane_left | | Left of pane - pane_pid | | PID of first process in pane - pane_right | | Right of pane - pane_start_command | | Command pane started with - pane_synchronized | | If pane is synchronized - pane_tabs | | Pane tab positions - pane_title | #T | Title of pane - pane_top | | Top of pane - pane_tty | | Pseudo terminal of pane - pane_width | | Width of pane - saved_cursor_x | | Saved cursor X in pane - saved_cursor_y | | Saved cursor Y in pane - scroll_region_lower | | Bottom of scroll region in pane - scroll_region_upper | | Top of scroll region in pane - session_attached | | Number of clients session is attached to - session_activity | | Integer time of session last activity - session_activity_string| | String time of session last activity - session_created | | Integer time session created - session_created_string | | String time session created - session_group | | Number of session group - session_grouped | | 1 if session in a group - session_height | | Height of session - session_id | | Unique session ID - session_many_attached | | 1 if multiple clients attached - session_name | #S | Name of session - session_width | | Width of session - session_windows | | Number of windows in session - window_active | | 1 if window active - window_activity_flag | | 1 if window has activity alert - window_bell_flag | | 1 if window has bell - window_find_matches | | Matched data from the find-window - window_flags | #F | Window flags - window_height | | Height of window - window_id | | Unique window ID - window_index | #I | Index of window - window_last_flag | | 1 if window is the last used - window_layout | | Window layout description - window_name | #W | Name of window - window_panes | | Number of panes in window - window_silence_flag | | 1 if window has silence alert - window_width | | Width of window - window_zoomed_flag | | 1 if window is zoomed - wrap_flag | | Pane wrap flag - - -##名称和标题 - -tmux区分名称和标题,窗口和会话具有名称用来作为目标标识,并且在状态行和不同的列表中显示: -名称是tmux对于一个窗口或会话的标识符。 -只有pane面板有标题,面板的标题是由在其中运行的程序设置的并且不能由tmux改变。 -与X窗口管理器中的xterm窗口标题的设置所使用的机制相同。 -窗口本身没有标题----一个窗口的标题就是其活动面板的标题。 -tmux本身会设置客户端所在终端的标题,参考set-title选项。 - -A session's name is set with the new-session and rename-session commands. A window's name is set with one of: -一个会话的名称通过new-session和rename-session命令来设置的,一个窗口的名称可以通过以下方式设置: - - 1. 一个命令的参数(如new-window和new-session的-n参数) - 2. 一个转义序列: $ printf '\033kWINDOW_NAME\033\\' - -自动重命名会将名称设置为窗口活动面板中的活动程序,参考automatic-rename选项。 - -当一个面板第一次创建时,其标题为主机名hostname。一个面板的标题可以通过OSC标题设置序列进行设置,例如: - $ printf '\033]2;My Title\033\\' - -##环境 - -当tmux服务器启动时,tmux会将环境复制到全局环境中,此外每个会话具有一个会话环境。 -当一个窗口被创建时,会将会话环境和全局环境合并。 -如果一个变量存在两个环境中,会使用会话环境中的变量。结果就是初始环境传递给新进程。 - -当一个新会话创建或者一个就会话重新附着时,update-environment会话选项可以用来从一个客户端来更新会话环境。 -tmux也会使用一些内部信息来初始化TMUX变量以便允许命令在内部执行,TERM变量会设置为正确的终端'screen'。 - -修改和查看环境的命令有: - - set-environment [-gru] [-t target-session] name [value] - (别名:setenv) -设置或重置一个环境变量,如果使用-g,会在全局变量中进行改变;否则只会改变target-session的会话环境。 --u标记用来重置一个变量。 -r用来指示在开起一个新进程时从环境中移除该变量。 - - show-environment [-g] [-t target-session] [variable] - (别名:showenv) -显示目标会话target-session或者全局环境(使用-g时)变量。 -如果忽略变量,会显示所有的变量。从环境中移除的变量会用'-'作为前导。 - -##状态行 -tmux包含了一个可选的状态行会显示在每个终端的底端行。 -默认状态行时有效的(可以通过status会话选项失效)并且被包含的,从左到右分别有: -包含在方括号中的当前会话名称;窗口列表;双引号包含的活动面板;以及时间和日期。 - -状态行由三部分组成: -可配置的左边和右边部分(可以包含shell命令输出的动态的内容,例如时间和日期, -参考status-left,status-left-length,status-right,status-right-length选项), 以及中间的窗口列表。 -默认窗口列表显示当前会话中按照数字升序排列窗口的索引,名称和标记(如果存在的话)。 -可以通过window-status-format和window-status-current-format选项客制化。 - -附加在窗口名称后面的标记可以是以下符号之一: - - 符号 | 含义 ----------|----------- - * | 表示当前窗口 - - | 最有一个选择的窗口。 - # | 窗口被监控并且活动会被检测。 - ! | 会在窗口中出现一个响铃。 - ~ | 窗口会在monitor-silence时间间隔中保持沉默。 - Z | 窗口的活动面板被放大了。 - -符号#与monitor-activity窗口选项相关。窗口名称会在有警告(响铃,活动或沉默)出现的时候以反转的颜色打印 - -状态行的颜色和属性是可以配置的,整个状态行使用status-style会话选项,单个的窗口使用window=status-style窗口选项配置。 - -状态行会自动地刷新如果当其在时间间隔内被改变的话,时间间隔可以通过status-interval会话选项控制。 - -与状态行相关的命令有: - - command-prompt [-I inputs] [-p prompts] [-t target-client] [template] -在客户端打开一个命令提示,可以在tmux内用用来执行交互式命令。 - -如果指定了template的话,其会被作为命令使用。 --I是每个提示初始化文本列表-由逗号分割的。 --p 提示是一个按照顺序显示的逗号分割的提示列表;否则只显示一个单独的构造于template(如果提供了的话)提示,否则使用':'。 -inputs和prompts都可能包含由status-left选项支持的特殊字符序列。 -在命令被执行之前,第一个出现的字符串'%%'和出现的所有'%1'都会被第一个提示的响应替换, -第二个'%%'和所有的'%2'会被第二个提示的响应替换,以此类推, 直到第九个提示可以被替换。 - - confirm-before [-p prompt] [-t target-client] command - (别名:confirm) -在执行命令之前进行确认,如果指定-p, 提示为prompt参数的显示,否则提示会从command来构造。 -可能会包含由status-left选项支持的特殊字符序列。 -这个命令只会在tmux中工作。 - - display-message [-p] [-c target-client] [-t target-pane] [message] - (别名:display) -显示一个消息, 如果没有给定-p, -那么输出会被打印到标准输出中,否则会显示在target-client的状态行上。 -消息的格式在[FORMTS](#格式)部分描述。 -如果给第-t就会从target-pane中获取信息,否则就会从附着在target-client的会话中的活动窗口中获取。 - -##缓冲区 -tmux维护了一个命名的粘贴缓冲区集合,每个可能显式地或自动地命名。 -显式地命名的缓冲区是在通过set-buffer或load-buffer命令创建时命名的, -或者是通过set-buffer -n 来重命名一个自动命名的缓冲区。 -自动命名的缓冲区的名称会类似于'buffer0001','buffer0002'等。 -当达到buffer-limit选项的限制时,最旧的自动命名的缓冲区被删除。 -显示命名的缓冲区不会收到buffer-limit的限制,可以通过delete-buffer命令删除。 - -缓冲区可以使用copy-mode或set-buffer以及load-buffer命令来添加,并且通过paste-buffer命令来将其粘贴到一个窗口。 -如果一个缓冲区命令没有指定缓冲区时,就会假设使用最近添加的自动命名的缓冲区。 - -每个窗口也会维护一个可配值的历史缓冲区,默认会保留到2000行;这个可以通过history-limit选项修改(参考set-option命令)。 - -缓冲区命令有: - choose-buffer [-F format] [-t target-window] [template] -将窗口置于缓冲区选择模式,一个缓冲区可以从一个列表中交互地选择。 -在选择一个缓冲区之后,'%%'会被template中的缓冲区名称替换,之后的结果会作为一个命令被执行。 -如果没有给定template,会使用"paste-buffer -b '%%'"来替换。 对于-F标记参考[FORMATS](#格式)部分。 -这个命令只有在至少有一个客户端附着时工作。 - - clear-history [-t target-pane] - (别名:clearhist) -对指定的pane删除并释放history。 - - delete-buffer [-b buffer-name] - (别名:deleteb) -删除名为buffer-name的缓冲区,在没有指定buffer-name时删除最佳男自动命名添加的缓冲区。 - - list-buffers [-F format] - (别名:lsb) -列出全局缓冲区,对于-F可以参考[FORMATS](#格式)部分。 - - load-buffer [-b buffer-name] path - (别名:loadb) -从path中加载指定粘贴缓冲区的内容。 - - paste-buffer [-dpr] [-b buffer-name] [-s separator] [-t target-pane] - (别名:pasteb) -将一个粘贴缓冲却中的内容插入到一个指定的pane中。如果没有指定target-pane,会被粘贴到当前的一个。 --d 同时也会删除粘贴缓冲区。当输出时,任何粘贴缓冲区中的换行符会使用一个分隔符替换(默认为回车符)。 --s 指定客制化分隔符。 --r 标记意味着不做换行符的替换。 --p 当应用程序请求大括号粘贴模式的话,粘贴的大括号控制代码会被插入到缓冲区中。 - - save-buffer [-a] [-b buffer-name] path - (别名:saveb) -将指定的粘贴缓冲区中的内容保存到一个路径path. -a选项用来指示附加模式而不是直接重写文件。 - - set-buffer [-a] [-b buffer-name] [-n new-buffer-name] data - (别名:setb) -将指定缓冲区的内容设置为data. -使用-a选项来将data附加到缓冲区而不是直接重写缓冲区。-n用来重命名缓冲区到一个new-buffer-name。 - - show-buffer [-b buffer-name] - (别名:showb) -显示指定缓冲区的内容。 - -##杂项 -其他杂项命令有: - clock-mode [-t target-pane] -显示一个大的时钟。 - - if-shell [-bF] [-t target-pane] shell-command command [command] - (别名:if) -如果shell-command返回成功的话执行第一个命令,否则执行第二个命令。 -在执行之前,shell-command会使用[FORMATS](#格式)部分指定的规则进行扩展,包括相关的target-pane。-b指示shell-command在后台运行。 -如果给定-F,shell-command不会被执行而是认为时成功的(如果既不是空的也不是0的话-在格式扩展之后)。 - - lock-server - (别名:lock) -通过运行lock-command选项指定的命令来分别锁定每个客户端。 - - run-shell [-b] [-t target-pane] shell-command - (别名:run) -在不创建一个窗口的前提下在后台中运行一个shell-command。 -执行之前,shell-command使用[FORMATS](#格式)部分指定的规则进行扩展。 --b指示在后台运行。 -在完成之后,任何到标准输出的输出会在copy模式中显示(在由-t指定的pane或当前pane-如果缺省的话)。 -如果命令没有成功返回,退出状态也会被显示。 - - wait-for [-L | -S | -U] channel - (别名:wait) -当不带选项使用时,在使用相同的channel的wait-for -S唤醒之前阻止客户端退出。 --L会锁定channel,任何尝试锁定相同channel的客户端会一直等待直到使用wait-for -U 解锁。 这个命令只有在tmux外部工作。 - -##TERMINFO EXTENSIONS - -tmux可以理解terminfo的一些扩展: -Cs, Cr -设置光标颜色,第一个使用一个单个字符串参数来设置颜色;第二个没有参数来恢复默认的光标颜色。 -如果设置的话一系列这样的值会被用来在tmux中改变光标颜色: - - $ printf '\033]12;red\033\\' - -Ss, Se -设置或重置光标样式。 如果设置以下的序列可能会用来将光标变为一个下划线: - - $ printf '\033[4 q' - -如果没有设置Se,Ss和参数0会被用来重新设置光标样式。 - -Ms -这个序列可以被tmux用来存储当前缓冲区到主机终端剪贴板中。可以参考set-clipboad选项和xterm的man页面。 - -##控制模式 - -tmux提供了一个成为control(控制)模式的文本界面。这使得应用程序可以通过一个简单的文本协议与tmux进行交流。 -在控制模式中,一个客户端发送tmux命令或以新行结束的命令序列到标准输入中。 -每个命令将会在标准输出中产生一个输出块。 -一个输出块包含了一个%begin行与跟随的输出(可能为空)。 -输出块会以一个%end或%error作为结尾。 -%begin和匹配的%end/%error具有两个参数:一个整数时间和命令编号,例如: - - %begin 1363006971 2 - 0: ksh* (1 panes) [80x24] [layout b25f,80x24,0,0,2] @2 (active) - %end 1363006971 2 - -在控制模式中,tmux输出通知,一个通知不会出现在输出块中。 - -下面是通知的定义: - - %exit [reason] - -当tmux客户端没有附着在任何会话中或者出现错误时,tmux客户端会立即退出。如果存在的话,reason描述了客户端退出的原因。 - - %layout-change window-id window-layout - -一个带有window-id的窗口布局被改变,新的布局为window-layout。 - - %output pane-id value - -一个窗口面板产生的输出。 值会转义非打印字符而且饭斜线作为八进制\xxx。 - - %session-changed session-id name -客户端现在被附着在ID为session-id的会话上,并且使用name命名。 - - %session-renamed name -当前会话被重命名为name。 - - %sessions-changed - -一个会话被创建或销毁。 - - %unlinked-window-add window-id - -ID为window-id的窗口被创建,但是没有连接到当前会话。 - - %window-add window-id -ID为window-id的窗口被连接到当前会话。 - - %window-close window-id -ID为window-id的窗口被关闭。 - - %window-renamed window-id name -ID为window-id的窗口重命名为name。 - -##文件 -o - ~/.tmux.conf : 默认的tmux配置文件。 - /etc/tmux.conf : 系统范围的配置文件。 - -##样例 - -创建一个运行vi的新的tmux会话: - - $ tmux new-session vi - -大部分命令具有一个简短形式,也成为别名。例如new-session的别名为new: - $ tmux new vi - -可选地,一个命令最短的不混淆的简短格式是被接受的,如果有多个选项,会被列出: - - $ tmux n - ambiguous command: n, could be: new-session, new-window, next-window - -在一个活动会话中,一个新的窗口可以通过键入'C-b c'来创建(ctrl 跟随b 然后跟随c键)。 - -窗口可以使用'C-b 0-9'来在窗口0-9中导航,也可以通过'C-b n'选择下一个窗口,'C-b p'选择上一个窗口。 - -一个会话可以通过使用'C-b d'来脱离附着,也可以通过以下命令来重新附着: - $ tmux attach-session - -键入'C-b ?' 列出当前窗口中的当前键绑定; 使用上下箭头可以导航列表,'q'从其中退出。 - -当tmux启动时运行的命令可能放置在 ~/.tmux.conf配置文件中,常见样例包括: - -改变默认的前导键: - - set-option -g prefix C-a - unbind-key C-b - bind-key C-a send-prefix - -关闭状态行或者改变其颜色: - - set-option -g status off - set-option -g status-style bg=blue - -设置其他选项,例如默认命令或者在30分钟不活动之后锁定: - - set-option -g default-command "exec /bin/ksh" - set-option -g lock-after-time 1800 - -创建新的键绑定: - - bind-key b set-option status - bind-key / command-prompt "split-window 'exec man %%'" - bind-key S command-prompt "new-window -n %1 'ssh %1'" - -参考: pty(4) - -作者: Nicholas Marriott - -译者: Liang Guisheng From 4ffae0c43f2a3c6cd01d0639845cf519d19e6993 Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 10 May 2017 08:32:24 +0800 Subject: [PATCH 0035/1407] =?UTF-8?q?=E4=BF=AE=E6=94=B9=E6=96=87=E4=BB=B6?= =?UTF-8?q?=E5=90=8D?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... Building a Blogging Engine API with Golang and PostgreSQL.md} | 0 ...FEWER MALLOCS IN CURL.md => 20170422 FEWER MALLOCS IN CURL.md} | 0 2 files changed, 0 insertions(+), 0 deletions(-) rename sources/tech/{201701 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md => 20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md} (100%) rename sources/tech/{ 20170422 FEWER MALLOCS IN CURL.md => 20170422 FEWER MALLOCS IN CURL.md} (100%) diff --git a/sources/tech/201701 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md b/sources/tech/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md similarity index 100% rename from sources/tech/201701 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md rename to sources/tech/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md diff --git a/sources/tech/ 20170422 FEWER MALLOCS IN CURL.md b/sources/tech/20170422 FEWER MALLOCS IN CURL.md similarity index 100% rename from sources/tech/ 20170422 FEWER MALLOCS IN CURL.md rename to sources/tech/20170422 FEWER MALLOCS IN CURL.md From 1d12038ee72b55e2111f371a1858fc7755e54237 Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 10 May 2017 09:10:03 +0800 Subject: [PATCH 0036/1407] translating --- .../tech/20170306 Understanding 7z command switches - part I.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170306 Understanding 7z command switches - part I.md b/sources/tech/20170306 Understanding 7z command switches - part I.md index b804a053e8..ef670277c8 100644 --- a/sources/tech/20170306 Understanding 7z command switches - part I.md +++ b/sources/tech/20170306 Understanding 7z command switches - part I.md @@ -1,3 +1,5 @@ +translating---geekpi + Understanding 7z command switches - part I ============================================================ From 6272ddae053914a9b1bbdee999a0ac3cc6891882 Mon Sep 17 00:00:00 2001 From: Louis Wei Date: Wed, 10 May 2017 09:48:08 +0800 Subject: [PATCH 0037/1407] Update 20110127 How debuggers work Part 2 - Breakpoints.md --- .../tech/20110127 How debuggers work Part 2 - Breakpoints.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20110127 How debuggers work Part 2 - Breakpoints.md b/sources/tech/20110127 How debuggers work Part 2 - Breakpoints.md index 59bad4ee0f..ac65b08866 100644 --- a/sources/tech/20110127 How debuggers work Part 2 - Breakpoints.md +++ b/sources/tech/20110127 How debuggers work Part 2 - Breakpoints.md @@ -1,3 +1,5 @@ +translating by wi-cuckoo + [How debuggers work: Part 2 - Breakpoints][26] ============================================================ From 3f3de43b76de08fc93ed88e4d1266d74ee394a34 Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 10 May 2017 10:13:06 +0800 Subject: [PATCH 0038/1407] translated --- ...erstanding 7z command switches - part I.md | 274 ------------------ ...erstanding 7z command switches - part I.md | 272 +++++++++++++++++ 2 files changed, 272 insertions(+), 274 deletions(-) delete mode 100644 sources/tech/20170306 Understanding 7z command switches - part I.md create mode 100644 translated/tech/20170306 Understanding 7z command switches - part I.md diff --git a/sources/tech/20170306 Understanding 7z command switches - part I.md b/sources/tech/20170306 Understanding 7z command switches - part I.md deleted file mode 100644 index ef670277c8..0000000000 --- a/sources/tech/20170306 Understanding 7z command switches - part I.md +++ /dev/null @@ -1,274 +0,0 @@ -translating---geekpi - -Understanding 7z command switches - part I -============================================================ - -### On this page - -1. [Include files][1] -2. [Exclude files][2] -3. [Set password for your archive][3] -4. [Set output directory][4] -5. [Creating multiple volumes][5] -6. [Set compression level of archive][6] -7. [Display technical information of archive][7] - -7z is no doubt a feature-rich and powerful archiver (claimed to offer the highest compression ratio). Here at HowtoForge, we have [already discussed][9] how you can install and use it. But the discussion was limited to basic features that you can access using the 'function letters' the tool provides. - -Expanding our coverage on the tool, here in this tutorial, we will be discussing some of the 'switches' 7z offers. But before we proceed, it's worth sharing that all the instructions and commands mentioned in this tutorial have been tested on Ubuntu 16.04 LTS. - -**Note**: We will be using the files displayed in the following screenshot for performing various operations using 7zip. - -[ - ![ls from test directory](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/ls.png) -][10] - -### -Include files - -The 7z tool allows you selectively include files in an archive. This feature can be accessed using the -i switch. - -Syntax: - --i[r[-|0]]{@listfile|!wildcard} - -For example, if you want to include only ‘.txt’ files in your archive, you can use the following command: - -$ 7z a ‘-i!*.txt’ include.7z - -Here is the output: - -[ - ![add files to 7zip](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/include.png) -][11] - -Now, to check whether the newly-created archive file contains only ‘.txt’ file or not, you can use the following command: - -$ 7z l include.7z - -Here is the output: - -[ - ![Result](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/includelist.png) -][12] - -In the above screenshot, you can see that only ‘testfile.txt’ file has been added to the archive. - -### Exclude files - -If you want, you can also exclude the files that you don’t need. This can be done using the -x switch. - -Syntax: - --x[r[-|0]]]{@listfile|!wildcard} - -For example, if you want to exclude a file named ‘abc.7z’ from the archive that you are going to create, then you can use the following command: - -$ 7z a ‘-x!abc.7z’ exclude.7z - -Here is the output: - -[ - ![exclude files from 7zip](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/exclude.png) -][13] - -To check whether the resulting archive file has excluded ‘abc.7z’ or not, you can use the following command: - -$ 7z l exclude.7z - -Here is the output: - -[ - ![result of file exclusion](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/excludelist.png) -][14] - -In the above screenshot, you can see that ‘abc.7z’ file has been excluded from the new archive file. - -**Pro tip**: Suppose the task is to exclude all the .7z files with names starting with letter ‘t’ and include all .7z files with names starting with letter ‘a’ . This can be done by combining both ‘-i’ and ‘-x’ switches in the following way: - -$ 7z a '-x!t*.7z' '-i!a*.7z' combination.7z - -### Set password for your archive - -7z also lets you password protect your archive file. This feature can be accessed using the -p switch. - -$ 7z a [archive-filename] -p[your-password] -mhe=[on/off] - -**Note**: The -mhe option enables or disables archive header encryption (default is off). - -For example: - -$ 7z a password.7z -pHTF -mhe=on - -Needless to say, when you will extract your password protected archive, the tool will ask you for the password. To extract a password-protected file, use the 'e' function letter. Following is an example: - -$ 7z e password.7z - -[ - ![protect 7zip archive with a password](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/password.png) -][15] - -### Set output directory - -The tool also lets you extract an archive file in the directory of your choice. This can be done using the -o switch. Needless to say, the switch only works when the command contains either the ‘e’ function letter or the ‘x’ function letter. - -$ 7z [e/x] [existing-archive-filename] -o[path-of-directory] - -For example, suppose the following command is run in the present working directory: - -$ 7z e output.7z -ohow/to/forge - -And, as the value passed to the -o switch suggests, the aim is to extract the archive in the ./how/to/forge directory. - -Here is the output: - -[ - ![7zip output directory](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/output.png) -][16] - -In the above screenshot, you can see that all the contents of existing archive file has been extracted. But where? To check whether or not the archive file has been extracted in the ./how/to/forge directory or not, we can use the ‘ls -R’ command. - -[ - ![result](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/ls_-R.png) -][17] - -In the above screenshot, we can see that all the contents of output.7z have indeed been extracted to ./how/to/forge. - -### Creating multiple volumes - -With the help of the 7z tool, you can create multiple volumes (smaller sub-archives) of your archive file. This is very useful when transferring large files over a network or in a USB. This feature can be accessed using the -v switch. The switch requires you to specify size of sub-archives. - -We can specify size of sub-archives in bytes (b), kilobytes (k), megabytes (m) and gigabytes (g). - -$ 7z a [archive-filename] [files-to-archive] -v[size-of-sub-archive1] -v[size-of-sub-archive2] .... - -Let's understand this using an example. Please note that we will be using a new directory for performing operations on the -v switch. - -Here is the screenshot of the directory contents: - -[ - ![7zip volumes](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/volumels.png) -][18] - -Now, we can run the following command for creating multiple volumes (sized 100b each) of an archive file: - -7z a volume.7z * -v100b - -Here is the screenshot: - -[ - ![compressing volumes](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/volume.png) -][19] - -Now, to see the list of sub-archives that were created, use the ‘ls’ command. - -[ - ![list of archives](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/volumels2.png) -][20] - -As seen in the above screenshot, a total of four multiple volumes have been created - volume.7z.001, volume.7z.002, volume.7z.003, and volume.7z.004 - -**Note**: You can extract files using the .7z.001 archive. But, for that, all the other sub-archive volumes should be present in the same directory. - -### Set compression level of archive - -7z also allows you to set compression levels of your archives. This feature can be accessed using the -m switch. There are various compression levels in 7z, such as -mx0, -mx1, -mx3, -mx5, -mx7 and -mx9. - -Here's a brief summary about these levels: - --**mx0** = Don't compress at all - just copy the contents to archive. --**mx1** = Consumes least time, but compression is low. --**mx3** = Better than -mx1. --**mx5** = This is default (compression is normal). --**mx7** = Maximum compression. --**mx9** = Ultra compression. - -**Note**: For more information on these compression levels, head [here][8]. - -$ 7z a [archive-filename] [files-to-archive] -mx=[0,1,3,5,7,9] - -For example, we have a bunch of files and folders in a directory, which we tried compressing using a different compression level each time. Just to give you an idea, here's the command used when the archive was created with compression level '0'. - -$ 7z a compression(-mx0).7z * -mx=0 - -Similarly, other commands were executed. - -Here is the list of output archives (produced using the 'ls' command), with their names suggesting the compression level used in their creation, and the fifth column in the output revealing the effect of compression level on their size. - -[ - ![7zip compression level](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/compression.png) -][21] - -### -Display technical information of archive - -If you want, 7z also lets you display technical information of an archive - it's type, physical size, header size, and so on - on the standard output. This feature can be accessed using the -slt switch. This switch only works with the ‘l’ function letter. - -$ 7z l -slt [archive-filename] - -For example: - -$ 7z l -slt abc.7z - -Here is the output: - -[ - ![](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/slt.png) -][22] - -# Specify type of archive to create - -If you want to create a non 7zip archive (which gets created by default), you can specify your choice using the -t switch.  - -$ 7z a -t[specify-type-of-archive] [archive-filename] [file-to-archive] - -The following example shows a command to create a .zip file: - -7z a -tzip howtoforge * - -The output file produced is 'howtoforge.zip'. To cross verify its type, use the 'file' command: - -[ - ![](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/type.png) -][23] - -So, howtoforge.zip is indeed a ZIP file. Similarly, you can create other kind of archives that 7z supports. - -# Conclusion - -As you would agree, the knowledge of 7z 'function letters' along with 'switches' lets you make the most out of the tool. We aren't yet done with switches - there are some more that will be discussed in part 2. - --------------------------------------------------------------------------------- - -via: https://www.howtoforge.com/tutorial/understanding-7z-command-switches/ - -作者:[ Himanshu Arora][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.howtoforge.com/tutorial/understanding-7z-command-switches/ -[1]:https://www.howtoforge.com/tutorial/understanding-7z-command-switches/#include-files -[2]:https://www.howtoforge.com/tutorial/understanding-7z-command-switches/#exclude-files -[3]:https://www.howtoforge.com/tutorial/understanding-7z-command-switches/#set-password-for-your-archive -[4]:https://www.howtoforge.com/tutorial/understanding-7z-command-switches/#set-output-directory -[5]:https://www.howtoforge.com/tutorial/understanding-7z-command-switches/#creating-multiple-volumes -[6]:https://www.howtoforge.com/tutorial/understanding-7z-command-switches/#set-compression-level-of-archive -[7]:https://www.howtoforge.com/tutorial/understanding-7z-command-switches/#display-technical-information-of-archive -[8]:http://askubuntu.com/questions/491223/7z-ultra-settings-for-zip-format -[9]:https://www.howtoforge.com/tutorial/how-to-install-and-use-7zip-file-archiver-on-ubuntu-linux/ -[10]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/ls.png -[11]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/include.png -[12]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/includelist.png -[13]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/exclude.png -[14]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/excludelist.png -[15]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/password.png -[16]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/output.png -[17]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/ls_-R.png -[18]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/volumels.png -[19]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/volume.png -[20]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/volumels2.png -[21]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/compression.png -[22]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/slt.png -[23]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/type.png diff --git a/translated/tech/20170306 Understanding 7z command switches - part I.md b/translated/tech/20170306 Understanding 7z command switches - part I.md new file mode 100644 index 0000000000..4005607cd5 --- /dev/null +++ b/translated/tech/20170306 Understanding 7z command switches - part I.md @@ -0,0 +1,272 @@ +了解 7z 命令开关 - 第一部分 +============================================================ + +### 本篇中 + +1. [包含文件][1] +2. [排除文件][2] +3. [设置归档的密码][3] +4. [设置输出目录][4] +5. [创建多个卷][5] +6. [设置归档的压缩级别][6] +7. [显示归档的技术信息][7] + +7z 无疑是一个功能强大的强大的归档工具(声称提供最高的压缩比)。在 HowtoForge 中,我们已经[已经讨论过][9]如何安装和使用它。但讨论仅限于你可以使用该工具提供的“功能字母”来使用基本功能。 + +在本教程中,我们将扩展对这个工具的说明,我们会讨论一些 7z 提供的“开关”。 但在继续之前,需要分享的是本教程中提到的所有说明和命令都已在 Ubuntu 16.04 LTS 上进行了测试。 + +**注意**:我们将使用以下截图中显示的文件来执行使用 7zip 的各种操作。 + +[ + ![ls from test directory](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/ls.png) +][10] + +### +包含文件 + +7z 工具允许你有选择地将文件包含在归档中。可以使用 -i 开关来使用此功能。 + +语法: + +-i[r[-|0]]{@listfile|!wildcard} + +比如,如果你想在归档中只包含 “.txt” 文件,你可以使用下面的命令: + +$ 7z a ‘-i!*.txt’ include.7z + +这是输出: + +[ + ![add files to 7zip](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/include.png) +][11] + +现在,检查新创建的归档是否只包含 “.txt” 文件,你可以使用下面的命令: + +$ 7z l include.7z + +这是输出: + +[ + ![Result](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/includelist.png) +][12] + +在上面的截图中,你可以看到 “testfile.txt” 已经包含到归档中了。 + +### 排除文件 + +如果你想要,你可以排除不想要的文件。可以使用 -x 开关做到。 + +语法: + +-x[r[-|0]]]{@listfile|!wildcard} + +比如,如果你想在要创建的归档中排除 “abc.7z” ,你可以使用下面的命令: + +$ 7z a ‘-x!abc.7z’ exclude.7z + +这是输出: + +[ + ![exclude files from 7zip](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/exclude.png) +][13] + +要检查最后的归档是否排除了 “abc.7z”, 你可以使用下面的命令: + +$ 7z l exclude.7z + +这是输出: + +[ + ![result of file exclusion](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/excludelist.png) +][14] + +上面的截图中,你可以看到 “abc.7z” 已经从新的归档中排除了。 + +**专业提示**:假设任务是排除以 “t” 开头的所有 .7z 文件,并且包含以字母 “a” 开头的所有 .7z 文件。这可以通过以下方式组合 “-i” 和 “-x” 开关来实现: + +$ 7z a '-x!t*.7z' '-i!a*.7z' combination.7z + +### 设置归档密码 + +7z 同样也支持用密码保护你的归档文件。这个功能可以使用 -p 开关来实现。 + +$ 7z a [archive-filename] -p[your-password] -mhe=[on/off] + +**注意**:-mhe 选项用来启用或者禁用归档头加密(默认是 off)。 + +例子: + +$ 7z a password.7z -pHTF -mhe=on + +无需多说,当你解压密码保护的归档时,工具会向你询问密码。要解压一个密码保护的文件,使用 “e” 功能字母。下面是例子: + +$ 7z e password.7z + +[ + ![protect 7zip archive with a password](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/password.png) +][15] + +### 设置输出目录 + +工具同样支持解压文件到你选择的目录中。这可以使用 -o 开关。无需多说,这个开关只在含有 “e” 或者 “x” 功能字母的时候有用。 + +$ 7z [e/x] [existing-archive-filename] -o[path-of-directory] + +比如,假设下面命令工作在当前的工作目录中: + +$ 7z e output.7z -ohow/to/forge + +如 -o 开关的值所指的那样,它的目标是解压文件到 ./how/to/forge 中。 + +这是输出: + +[ + ![7zip output directory](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/output.png) +][16] + +在上面的截图中,你可以看到归档文件的所有内容都已经解压了。但是在哪里?要检查文件是否被解压到 ./how/to/forge,我们可以使用 “ls -R” 命令。 + +[ + ![result](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/ls_-R.png) +][17] + +在上面的截图中,我们可以看到 .7z 中的内容都被解压到 ./how/to/forge 中。 + +### 创建多个卷 + +借助 7z 工具,你可以为归档创建多个卷(较小的子档案)。当通过网络或 USB 传输大文件时,这是非常有用的。可以使用 -v 开关使用此功能。这个开关需要指定子档案的大小。 + +我们可以以字节(b)、千字节(k)、兆字节(m)和千兆字节(g)指定子档案大小。 + +$ 7z a [archive-filename] [files-to-archive] -v[size-of-sub-archive1] -v[size-of-sub-archive2] .... + +让我们用一个例子来理解这个。请注意,我们将使用一个新的目录来执行 -v 开关的操作。 + +这是目录内容的截图: + +[ + ![7zip volumes](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/volumels.png) +][18] + +现在,我们运行下面的命令来为一个归档文件创建多个卷(每个大小 100b): + +7z a volume.7z * -v100b + +这是截图: + +[ + ![compressing volumes](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/volume.png) +][19] + +现在,要查看创建的子归档,使用 “ls” 命令。 + +[ + ![list of archives](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/volumels2.png) +][20] + +如下截图所示,一个四个卷创建了 - volume.7z.001、volume.7z.002、volume.7z.003 和 volume.7z.004 + +**注意**:你可以使用 .7z.001 归档解压文件。但是,要这么做,其他所有的卷都应该在同一个目录内。 + +### 设置归档的压缩级别 + +7z 允许你设置归档的压缩级别。这个功能可以使用 -m 开关。7z 中有不同的压缩级别,比如:-mx0、-mx1、-mx3、-mx5、-mx7 和 -mx9 + +这是这些压缩级别的简要说明: + +-**mx0** = 完全不压缩 - 只是复制文件到归档中。 +-**mx1** = 消耗最少时间,但是压缩最小。 +-**mx3** = 比 -mx1 好。 +-**mx5** = 这是默认级别 (常规压缩)。 +-**mx7** = 最大化压缩。 +-**mx9** = 极端压缩。 + +**注意**:关于这些压缩级别的更多信息,阅读[这里][8]。 + +$ 7z a [archive-filename] [files-to-archive] -mx=[0,1,3,5,7,9] + +例如,我们在目录中有一堆文件和文件夹,我们每次尝试使用不同的压缩级别进行压缩。只是为了给你一个想法,这是当使用压缩级别 “0” 时创建存档时使用的命令。 + +$ 7z a compression(-mx0).7z * -mx=0 + +相似地,其他命令也这样执行。 + +以下是输出档案(使用 “ls” 命令生成)的列表,其名称表示其创建中使用的压缩级别,输出中的第五列显示压缩级别对其大小的影响。 + +[ + ![7zip compression level](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/compression.png) +][21] + +### +显示归档的技术信息 + +如果需要,7z 还可以在标准输出中显示归档的技术信息 - 类型、物理大小、头大小等。可以使用 -slt 开关使用此功能。 此开关仅适用于带有 “l” 功能字母的情况下。 + +$ 7z l -slt [archive-filename] + +比如: + +$ 7z l -slt abc.7z + +这是输出: + +[ + ![](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/slt.png) +][22] + +# 指定创建归档的类型 + +如果你想要创建一个非 7z 的归档文件(这是默认的创建类型),你可以使用 -t 开关来指定。 + +$ 7z a -t[specify-type-of-archive] [archive-filename] [file-to-archive] + +下面的例子展示创建了一个 .zip 文件: + +7z a -tzip howtoforge * + +输出的文件是 “howtoforge.zip”。要交叉验证它的类型,使用 “file” 命令: + +[ + ![](https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/type.png) +][23] + +因此,howtoforge.zip 的确是一个 ZIP 文件。相似地,你可以创建其他 7z 支持的归档。 + +# 总结 + +你会同意的是 7z 的 “功能字母” 以及 “开关” 的知识可以让你充分利用这个工具。我们还没有完成开关的部分 - 其余部分将在第 2 部分中讨论。 + +-------------------------------------------------------------------------------- + +via: https://www.howtoforge.com/tutorial/understanding-7z-command-switches/ + +作者:[ Himanshu Arora][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.howtoforge.com/tutorial/understanding-7z-command-switches/ +[1]:https://www.howtoforge.com/tutorial/understanding-7z-command-switches/#include-files +[2]:https://www.howtoforge.com/tutorial/understanding-7z-command-switches/#exclude-files +[3]:https://www.howtoforge.com/tutorial/understanding-7z-command-switches/#set-password-for-your-archive +[4]:https://www.howtoforge.com/tutorial/understanding-7z-command-switches/#set-output-directory +[5]:https://www.howtoforge.com/tutorial/understanding-7z-command-switches/#creating-multiple-volumes +[6]:https://www.howtoforge.com/tutorial/understanding-7z-command-switches/#set-compression-level-of-archive +[7]:https://www.howtoforge.com/tutorial/understanding-7z-command-switches/#display-technical-information-of-archive +[8]:http://askubuntu.com/questions/491223/7z-ultra-settings-for-zip-format +[9]:https://www.howtoforge.com/tutorial/how-to-install-and-use-7zip-file-archiver-on-ubuntu-linux/ +[10]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/ls.png +[11]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/include.png +[12]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/includelist.png +[13]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/exclude.png +[14]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/excludelist.png +[15]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/password.png +[16]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/output.png +[17]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/ls_-R.png +[18]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/volumels.png +[19]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/volume.png +[20]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/volumels2.png +[21]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/compression.png +[22]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/slt.png +[23]:https://www.howtoforge.com/images/understanding_7z_command_switches_part_i/big/type.png From 13c926c824c3d37ae0a0666c82cd8d821163122a Mon Sep 17 00:00:00 2001 From: KS Date: Wed, 10 May 2017 18:19:39 +0800 Subject: [PATCH 0039/1407] Update 20160831 Apache Spark Scale - A 60 TB production use case.md --- ...0160831 Apache Spark Scale - A 60 TB production use case.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20160831 Apache Spark Scale - A 60 TB production use case.md b/sources/tech/20160831 Apache Spark Scale - A 60 TB production use case.md index eb33ca61c9..7e0268a00f 100644 --- a/sources/tech/20160831 Apache Spark Scale - A 60 TB production use case.md +++ b/sources/tech/20160831 Apache Spark Scale - A 60 TB production use case.md @@ -1,3 +1,5 @@ +wyangsun translating + Apache Spark @Scale: A 60 TB+ production use case =========== From fa15c324b95733bfc172e626f4071855365292d2 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 11 May 2017 07:23:27 +0800 Subject: [PATCH 0040/1407] PRF:20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @ucasFL 翻译的不错 --- ... Torvalds Good Taste Coding Requirement.md | 83 +++++++------------ 1 file changed, 29 insertions(+), 54 deletions(-) diff --git a/translated/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md b/translated/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md index be03510e3c..78740a7ac8 100644 --- a/translated/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md +++ b/translated/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md @@ -1,44 +1,45 @@ -# 像 Linus Torvalds 学习让编出的代码具有“good taste” +向 Linus Torvalds 学习让编出的代码具有 “good taste” +======== -在[最近关于 Linus Torvalds 的一个采访中][1],这位 Linux 的创始人,在采访过程中大约 14:20 的时候,快速的指出了关于代码的 "good taste"。good taste?采访者请他展示更多的细节,于是,Linus Torvalds 展示了一张提前准备好的插图。 +在[最近关于 Linus Torvalds 的一个采访中][1],这位 Linux 的创始人,在采访过程中大约 14:20 的时候,提及了关于代码的 “good taste”。good taste?采访者请他展示更多的细节,于是,Linus Torvalds 展示了一张提前准备好的插图。 -这张插图中展示了一个代码片段。但这段代码并没有 “good taste”。这是一个具有 “poor taste” 的代码片段,把它作为例子,以提供一些初步的比较。 +他展示的是一个代码片段。但这段代码并没有 “good taste”。这是一个具有 “poor taste” 的代码片段,把它作为例子,以提供一些初步的比较。 -![](https://d262ilb51hltx0.cloudfront.net/max/1200/1*X2VgEA_IkLvsCS-X4iPY7g.png) +![Poor Taste Code Example](https://d262ilb51hltx0.cloudfront.net/max/1200/1*X2VgEA_IkLvsCS-X4iPY7g.png) 这是一个用 C 写的函数,作用是删除链表中的一个对象,它包含有 10 行代码。 -他把注意力集中在底部的 if 语句。正是这个 if 语句受到他的批判。 +他把注意力集中在底部的 `if` 语句。正是这个 `if` 语句受到他的批判。 -我暂停视频,开始研究幻灯片。我发现我最近有写过和这很像的代码。Linus 不就是在说我的代码品味很差吗?我吞下自尊,继续观看视频。 +我暂停了这段视频,开始研究幻灯片。我发现我最近有写过和这很像的代码。Linus 不就是在说我的代码品味很差吗?我放下自傲,继续观看视频。 -随后, Linus 向观众解释,正如我们所知道的,当从链表中删除一个对象时,需要考虑两种可能的情况。当所需删除的对象位于链表的表头时,删除过程和位于链表中间的情况不同。这就是这个 if 语句具有 "poor taste" 的原因。 +随后, Linus 向观众解释,正如我们所知道的,当从链表中删除一个对象时,需要考虑两种可能的情况。当所需删除的对象位于链表的表头时,删除过程和位于链表中间的情况不同。这就是这个 `if` 语句具有 “poor taste” 的原因。 但既然他承认考虑这两种不同的情况是必要的,那为什么像上面那样写如此糟糕呢? 接下来,他又向观众展示了第二张幻灯片。这个幻灯片展示的是实现同样功能的一个函数,但这段代码具有 “goog taste” 。 - ![](https://d262ilb51hltx0.cloudfront.net/max/1200/1*GHFLYFB3vDQeakMyUGPglw.png) +![Good Taste Code Example](https://d262ilb51hltx0.cloudfront.net/max/1200/1*GHFLYFB3vDQeakMyUGPglw.png) 原先的 10 行代码现在减少为 4 行。 -但代码的行数并不重要,关键是 if 语句,它不见了,因为不再需要了。代码已经被重构,所以,尽管对象的地址还在列表中,但已经运用同样的操作把它删除了。 +但代码的行数并不重要,关键是 `if` 语句,它不见了,因为不再需要了。代码已经被重构,所以,不用管对象在列表中的位置,都可以运用同样的操作把它删除。 Linus 解释了一下新的代码,它消除了边缘情况,就是这样。然后采访转入了下一个话题。 -我琢磨了一会这段代码。 Linus 是对的,的确,第二个函数更好。如果这是一个确定代码具有 “good taste” 还是 “bad taste” 的测试,那么很遗憾,我失败了。我从未想到过有可能能够去除条件语句。我写过不止一次这样的 if 语句,因为我经常使用链表。 +我琢磨了一会这段代码。 Linus 是对的,的确,第二个函数更好。如果这是一个确定代码具有 “good taste” 还是 “bad taste” 的测试,那么很遗憾,我失败了。我从未想到过有可能能够去除条件语句。我写过不止一次这样的 `if` 语句,因为我经常使用链表。 -这个例子的启发,不仅仅是教给了我们一个从链表中删除对象的更好方法,而是启发了我们去考虑自己写的代码。你通过程序实现的一个简单算法,可能还有改进的空间,只是你从来没有考虑过。 +这个例子的意义,不仅仅是教给了我们一个从链表中删除对象的更好方法,而是启发了我们去思考自己写的代码。你通过程序实现的一个简单算法,可能还有改进的空间,只是你从来没有考虑过。 以这种方式,我回去审查最近正在做的项目的代码。也许是一个巧合,刚好也是用 C 写的。 -我尽最大的能力去审查代码,“good taste” 的一个基本要求是关于边缘情况的消除方法,通常我们会使用条件语句来消除边缘情况。然而,你的测试使用的条件语句越少,你的代码就会有更好的 “tastes” 。 +我尽最大的能力去审查代码,“good taste” 的一个基本要求是关于边缘情况的消除方法,通常我们会使用条件语句来消除边缘情况。你的测试使用的条件语句越少,你的代码就会有更好的 “taste” 。 下面,我将分享一个通过审查代码进行了改进的一个特殊例子。 这是一个关于初始化网格边缘的算法。 -下面所写的是一个用来初始化 grid 的网格边缘的算法,gird 表示一个二维数组:grid[行][列] +下面所写的是一个用来初始化网格边缘的算法,网格 grid 以一个二维数组表示:grid[行][列] 。 再次说明,这段代码的目的只是用来初始化位于 grid 边缘的点的值,所以,只需要给最上方一行、最下方一行、最左边一列以及最右边一列赋值即可。 @@ -47,27 +48,15 @@ Linus 解释了一下新的代码,它消除了边缘情况,就是这样。 ```Tr for (r = 0; r < GRID_SIZE; ++r) { for (c = 0; c < GRID_SIZE; ++c) { -``` - -``` // Top Edge if (r == 0) grid[r][c] = 0; -``` - -``` // Left Edge if (c == 0) grid[r][c] = 0; -``` - -``` // Right Edge if (c == GRID_SIZE - 1) grid[r][c] = 0; -``` - -``` // Bottom Edge if (r == GRID_SIZE - 1) grid[r][c] = 0; @@ -78,84 +67,70 @@ for (r = 0; r < GRID_SIZE; ++r) { 虽然这样做是对的,但回过头来看,这个结构存在一些问题。 1. 复杂性 — 在双层循环里面使用 4 个条件语句似乎过于复杂。 -2. 高效性 — 假设 GRID_SIZE 的值为 64,那么这个循环需要执行 4096 次,但需要进行赋值的只有位于边缘的 256 个点。 +2. 高效性 — 假设 `GRID_SIZE` 的值为 64,那么这个循环需要执行 4096 次,但需要进行赋值的只有位于边缘的 256 个点。 用 Linus 的眼光来看,将会认为这段代码没有 “good taste” 。 -所以,我对上面的问题进行了一下思考。经过一番思考,我把复杂度减少为包含四个条件语句的单层循环。虽然只是稍微改进了一下复杂性,但在性能上也有了极大的提高,因为它只是沿着边缘的点进行了 256 次循环。 +所以,我对上面的问题进行了一下思考。经过一番思考,我把复杂度减少为包含四个条件语句的单层 `for` 循环。虽然只是稍微改进了一下复杂性,但在性能上也有了极大的提高,因为它只是沿着边缘的点进行了 256 次循环。 ``` for (i = 0; i < GRID_SIZE * 4; ++i) { -``` - -``` // Top Edge if (i < GRID_SIZE) grid[0][i] = 0; -``` - -``` // Right Edge else if (i < GRID_SIZE * 2) grid[i - GRID_SIZE][GRID_SIZE - 1] = 0; -``` - -``` // Left Edge else if (i < GRID_SIZE * 3) grid[i - (GRID_SIZE * 2)][0] = 0; -``` - -``` // Bottom Edge else grid[GRID_SIZE - 1][i - (GRID_SIZE * 3)] = 0; } ``` -的确是一个很大的提高。但是它看起来很丑,并不是易于遵循的代码。基于这一点,我并不满意。 +的确是一个很大的提高。但是它看起来很丑,并不是易于阅读理解的代码。基于这一点,我并不满意。 我继续思考,是否可以进一步改进呢?事实上,答案是 YES!最后,我想出了一个非常简单且优雅的算法,老实说,我不敢相信我会花了那么长时间才发现这个算法。 -下面是这段代码的最后版本。它只有一层循环并且没有条件语句。另外。循环只执行了 64 次迭代,极大的改善了复杂性和高效性。 +下面是这段代码的最后版本。它只有一层 `for` 循环并且没有条件语句。另外。循环只执行了 64 次迭代,极大的改善了复杂性和高效性。 ``` for (i = 0; i < GRID_SIZE; ++i) { -``` - -``` // Top Edge grid[0][i] = 0; // Bottom Edge grid[GRID_SIZE - 1][i] = 0; -``` - -``` // Left Edge grid[i][0] = 0; -``` - -``` // Right Edge grid[i][GRID_SIZE - 1] = 0; } ``` -这段代码通过单层循环迭代来初始化四条边缘上的点。它并不复杂,而且非常高效,易于阅读。和原始的版本,甚至是第二个版本相比,都有天壤之别。 +这段代码通过每次循环迭代来初始化四条边缘上的点。它并不复杂,而且非常高效,易于阅读。和原始的版本,甚至是第二个版本相比,都有天壤之别。 至此,我已经非常满意了。 +那么,我是一个有 “good taste” 的开发者么? + +我觉得我是,但是这并不是因为我上面提供的这个例子,也不是因为我在这篇文章中没有提到的其它代码……而是因为具有 “good taste” 的编码工作远非一段代码所能代表。Linus 自己也说他所提供的这段代码不足以表达他的观点。 + +我明白 Linus 的意思,也明白那些具有 “good taste” 的程序员虽各有不同,但是他们都是会将他们之前开发的代码花费时间重构的人。他们明确界定了所开发的组件的边界,以及是如何与其它组件之间的交互。他们试着确保每一样工作都完美、优雅。 + +其结果就是类似于 Linus 的 “good taste” 的例子,或者像我的例子一样,不过是千千万万个 “good taste”。 + +你会让你的下个项目也具有这种 “good taste” 吗? -------------------------------------------------------------------------------- via: https://medium.com/@bartobri/applying-the-linus-tarvolds-good-taste-coding-requirement-99749f37684a 作者:[Brian Barto][a] - 译者:[ucasFL](https://github.com/ucasFL) - -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出 From c05e4d7fe33f1ba6860d97012842dc8804e1864b Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 11 May 2017 07:23:39 +0800 Subject: [PATCH 0041/1407] PUB:20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md @ucasFL --- ...6 Applying the Linus Torvalds Good Taste Coding Requirement.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md (100%) diff --git a/translated/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md b/published/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md similarity index 100% rename from translated/tech/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md rename to published/20161026 Applying the Linus Torvalds Good Taste Coding Requirement.md From 851d292dfb90858394f6cc6dfa889cd401145210 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 11 May 2017 07:42:06 +0800 Subject: [PATCH 0042/1407] PUB:20170321 How to deploy Kubernetes on the Raspberry Pi.md @geekpi @jasminepeng --- ...o deploy Kubernetes on the Raspberry Pi.md | 28 ++++++++----------- 1 file changed, 11 insertions(+), 17 deletions(-) rename {translated/tech => published}/20170321 How to deploy Kubernetes on the Raspberry Pi.md (69%) diff --git a/translated/tech/20170321 How to deploy Kubernetes on the Raspberry Pi.md b/published/20170321 How to deploy Kubernetes on the Raspberry Pi.md similarity index 69% rename from translated/tech/20170321 How to deploy Kubernetes on the Raspberry Pi.md rename to published/20170321 How to deploy Kubernetes on the Raspberry Pi.md index c2f82cd8b9..37736b7d20 100644 --- a/translated/tech/20170321 How to deploy Kubernetes on the Raspberry Pi.md +++ b/published/20170321 How to deploy Kubernetes on the Raspberry Pi.md @@ -5,40 +5,34 @@ ![How to deploy Kubernetes on the Raspberry Pi ](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/raspberrypi_cartoon.png?itok=sntNdheJ "How to deploy Kubernetes on the Raspberry Pi ") ->图片提供: opensource.com + +> 图片提供: opensource.com 当我开始对 [ARM][6]设备,特别是 Raspberry Pi 感兴趣时,我的第一个项目是一个 OpenVPN 服务器。 -通过将 Raspberry Pi 作为家庭网络的安全网关,我可以使用我的手机来控制我的桌面,远程播放 Spotify,打开文档以及一些其他有趣的东西。我在第一个项目中使用了一个现有的教程,因为我害怕自己使用命令行。 +通过将 Raspberry Pi 作为家庭网络的安全网关,我可以使用我的手机来控制我的桌面,远程播放 Spotify,打开文档以及一些其他有趣的东西。我在第一个项目中使用了一个现有的教程,因为我害怕自己在命令行中拼砌。 -更多关于 Raspberry Pi 的文章: - -* [最新的 Raspberry Pi][1] -* [什么是 Raspberry Pi?][2] -* [开始使用 Raspberry Pi][3] -* [给我们发送你的 Raspberry Pi 项目和教程][4] - -几个月后,这种恐惧消失了。我扩展了我的原始项目,并使用[ Samba 服务器][7]从文件服务器隔离了 OpenVPN 服务器。这是我第一个没有完全按照教程来的项目。不幸的是,在我的 Samba 项目结束后,我意识到我没有记录任何东西,所以我无法复制它。为了重新创建它,我不得不重新参考我曾经用过的那些单独的教程,将项目拼回到一起。 +几个月后,这种恐惧消失了。我扩展了我的原始项目,并使用 [Samba 服务器][7]从文件服务器分离出了 OpenVPN 服务器。这是我第一个没有完全按照教程来的项目。不幸的是,在我的 Samba 项目结束后,我意识到我没有记录任何东西,所以我无法复制它。为了重新创建它,我不得不重新参考我曾经用过的那些单独的教程,将项目拼回到一起。 我学到了关于开发人员工作流程的宝贵经验 - 跟踪你所有的更改。我在本地做了一个小的 git 仓库,并记录了我输入的所有命令。 ### 发现 Kubernetes -2015 年 5 月,我发现了 Linux 容器和 Kubernetes。我觉得 Kubernetes 很有魅力,我可以使用仍在技术上发展的概念 - 并且我实际上可以用它。平台本身及其所呈现的可能性令人兴奋。在此之前,我才刚刚在一块 Raspberry Pi 上运行了一个程序。有了 Kubernetes,我可以做出比以前更高级的配置。 +2015 年 5 月,我发现了 Linux 容器和 Kubernetes。我觉得 Kubernetes 很有魅力,我可以使用仍然处于技术发展的概念 - 并且我实际上可以用它。平台本身及其所呈现的可能性令人兴奋。在此之前,我才刚刚在一块 Raspberry Pi 上运行了一个程序。而有了 Kubernetes,我可以做出比以前更先进的配置。 那时候,Docker(v1.6 版本,如果我记得正确的话)在 ARM 上有一个 bug,这意味着在 Raspberry Pi 上运行 Kubernetes 实际上是不可能的。在早期的 0.x 版本中,Kubernetes 的变化很快。每次我在 AMD64 上找到一篇关于如何设置 Kubernetes 的指南时,它针对的还都是一个旧版本,与我当时使用的完全不兼容。 不管怎样,我用自己的方法在 Raspberry Pi 上创建了一个 Kubernetes 节点,而在 Kubernetes v1.0.1 中,我使用 Docker v1.7.1 [让它工作了][8]。这是第一个将 Kubernetes 全功能部署到 ARM 的方法。 -在 Raspberry Pi 上运行 Kubernetes 的优势在于,由于 ARM 设备非常小巧,因此不会产生大量的功耗。如果程序以正确的方式构建,那么同样可以在 AMD64 上用同样的方法运行程序。有一块小型 IoT 板为教育创造了巨大的机会。用它来做演示也很有用,比如你要出差参加一个会议。携带 Raspberry Pi (通常)比拖着大型英特尔机器要容易得多。 +在 Raspberry Pi 上运行 Kubernetes 的优势在于,由于 ARM 设备非常小巧,因此不会产生大量的功耗。如果程序以正确的方式构建而成,那么就可以在 AMD64 上用同样的方法运行同一个程序。这样的一块小型 IoT 板为教育创造了巨大的机会。用它来做演示也很有用,比如你要出差参加一个会议。携带 Raspberry Pi (通常)比拖着大型英特尔机器要容易得多。 -现在按照[我建议][9]的 ARM(32 位和 64 位)的支持已被合并到核心中。ARM 的二进制文件会自动与 Kubernetes 一起发布。虽然我们还没有为 ARM 提供自动化的 CI(持续集成)系统,在 PR 合并之前会自动确定它可在 ARM 上工作,它仍然工作得不错。 +现在按照[我建议][9]的 ARM(32 位和 64 位)的支持已被合并到 Kubernetes 核心中。ARM 的二进制文件会自动与 Kubernetes 一起发布。虽然我们还没有为 ARM 提供自动化的 CI(持续集成)系统,不过在 PR 合并之前会自动确定它可在 ARM 上工作,现在它运转得不错。 ### Raspberry Pi 上的分布式网络 -我通过 [kubeadm][10] 发现了 Weave Net。[Weave Mesh][11]是一个有趣的分布式网络解决方案,因此我开始阅读更多关于它的内容。在 2016 年 12 月,我在 [Weaveworks][12] 收到了第一份合同工作。我是 Weave Net 中 ARM 支持团队的一员。 +我通过 [kubeadm][10] 发现了 Weave Net。[Weave Mesh][11] 是一个有趣的分布式网络解决方案,因此我开始了解更多关于它的内容。在 2016 年 12 月,我在 [Weaveworks][12] 收到了第一份合同工作,我成为了 Weave Net 中 ARM 支持团队的一员。 -我很高兴可以在 Raspberry Pi 上运行 Weave Net 的工业案例,比如那些需要更加移动化的工厂。目前,将 Weave Scope 或 Weave Cloud 部署到 Raspberry Pi 可能不太现实(尽管可以考虑使用其他 ARM 设备),因为我猜这个软件需要更多的内存才能运行良好。理想情况下,随着 Raspberry Pi 升级到 2GB 内存,我想我可以在它上面运行 Weave Cloud 了。 +我很高兴可以在 Raspberry Pi 上运行 Weave Net 的工业案例,比如那些需要设备更加移动化的工厂。目前,将 Weave Scope 或 Weave Cloud 部署到 Raspberry Pi 可能不太现实(尽管可以考虑使用其他 ARM 设备),因为我猜这个软件需要更多的内存才能运行良好。理想情况下,随着 Raspberry Pi 升级到 2GB 内存,我想我可以在它上面运行 Weave Cloud 了。 在 Weave Net 1.9 中,Weave Net 支持了 ARM。Kubeadm(通常是 Kubernetes)在多个平台上工作。你可以使用 Weave 将 Kubernetes 部署到 ARM,就像在任何 AMD64 设备上一样安装 Docker、kubeadm、kubectl 和 kubelet。然后初始化控制面板组件运行的主机: @@ -52,7 +46,7 @@ kubeadm init kubectl apply -f https://git.io/weave-kube ``` -在此之前在 ARM 上,你只可以用 Flannel 安装一个 pod 网络,但是在 Weave Net 1.9 中已经改变了,它官方支持了 ARM。 +在此之前在 ARM 上,你只能用 Flannel 安装 pod 网络,但是在 Weave Net 1.9 中已经改变了,它官方支持了 ARM。 最后,加入你的节点: @@ -84,7 +78,7 @@ Lucas Käldström - 谢谢你发现我!我是一名来自芬兰的说瑞典语 via: https://opensource.com/article/17/3/kubernetes-raspberry-pi -作者:[ Lucas Käldström][a] +作者:[Lucas Käldström][a] 译者:[geekpi](https://github.com/geekpi) 校对:[jasminepeng](https://github.com/jasminepeng) From 3414e2c13673e0d465befcf219edc49b08ef142c Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 11 May 2017 08:08:21 +0800 Subject: [PATCH 0043/1407] PRF&PUB:20170213 Recover from a badly corrupt Linux EFI installation.md @ictlyh --- ... a badly corrupt Linux EFI installation.md | 40 ++++++++----------- 1 file changed, 16 insertions(+), 24 deletions(-) rename {translated/tech => published}/20170213 Recover from a badly corrupt Linux EFI installation.md (62%) diff --git a/translated/tech/20170213 Recover from a badly corrupt Linux EFI installation.md b/published/20170213 Recover from a badly corrupt Linux EFI installation.md similarity index 62% rename from translated/tech/20170213 Recover from a badly corrupt Linux EFI installation.md rename to published/20170213 Recover from a badly corrupt Linux EFI installation.md index d045105961..aa32f8c1b7 100644 --- a/translated/tech/20170213 Recover from a badly corrupt Linux EFI installation.md +++ b/published/20170213 Recover from a badly corrupt Linux EFI installation.md @@ -1,24 +1,25 @@ -# 从损坏的 Linux EFI 安装中恢复 +从损坏的 Linux EFI 安装中恢复 +========= 在过去的十多年里,Linux 发行版在安装前、安装过程中、以及安装后偶尔会失败,但我总是有办法恢复系统并继续正常工作。然而,[Solus][1] 损坏了我的笔记本。 -GRUB 恢复。不行,重装。还不行!Ubuntu 拒绝安装,报错目标设备不是这个或那个。哇。我之前还没有遇到过想这样的事情。我的测试机已变成无用的砖块。我们该失望吗?不,绝对不。让我来告诉你怎样你可以修复它吧。 +GRUB 恢复。不行,重装。还不行!Ubuntu 拒绝安装,目标设备的报错一会这样,一会那样。哇。我之前还没有遇到过像这样的事情。我的测试机已变成无用的砖块。难道我该绝望吗?不,绝对不。让我来告诉你怎样你可以修复它吧。 ### 问题详情 -所有事情都从 Solus 尝试安装它自己的启动引导器 - goofiboot 开始。不知道什么原因、它没有成功完成安装,留给我的就是一个无法启动的系统。BIOS 之后,我有一个 GRUB 恢复终端。 +所有事情都从 Solus 尝试安装它自己的启动引导器 - goofiboot 开始。不知道什么原因、它没有成功完成安装,留给我的就是一个无法启动的系统。经过 BIOS 引导之后,我进入一个 GRUB 恢复终端。 - ![安装失败](http://www.dedoimedo.com/images/computers-years/2016-2/solus-installation-failed.png) +![安装失败](http://www.dedoimedo.com/images/computers-years/2016-2/solus-installation-failed.png) -我尝试在终端中手动修复,使用类似和我在我的扩展 [GRUB2 指南][2]中介绍的这个或那个命令。但还是不行。然后我尝试按照我在[GRUB2 和 EFI 指南][3]中的建议从 Live CD(译者注:Live CD 是一个完整的计算机可引导安装媒介,它包括在计算机内存中运行的操作系统,而不是从硬盘驱动器加载; CD 本身是只读的。 它允许用户为任何目的运行操作系统,而无需安装它或对计算机的配置进行任何更改)中恢复。我用 efibootmgr 工具创建了一个条目,确保标记它为有效。正如我们之前在指南中做的那样,之前这些是能正常工作的。哎,现在这个方法也不起作用。 +我尝试在终端中手动修复,使用类似和我在我详实的 [GRUB2 指南][2]中介绍的各种命令。但还是不行。然后我尝试按照我在 [GRUB2 和 EFI 指南][3]中的建议从 Live CD 中恢复(LCTT 译注:Live CD 是一个完整的计算机可引导安装媒介,它包括在计算机内存中运行的操作系统,而不是从硬盘驱动器加载;CD 本身是只读的。 它允许用户为任何目的运行操作系统,而无需安装它或对计算机的配置进行任何更改)。我用 efibootmgr 工具创建了一个引导入口,确保标记它为有效。正如我们之前在指南中做的那样,之前这些是能正常工作的。哎,现在这个方法也不起作用。 -我尝试一次完整的 Ubuntu 安装,把它安装到 Solus 所在的分区,希望安装程序能给我一些有用的信息。但是 Ubuntu 无法按成安装。它报错:failed to install into /target。又回到开始的地方了。怎么办? +我尝试做一个完整的 Ubuntu 安装,把它安装到 Solus 所在的分区,希望安装程序能给我一些有用的信息。但是 Ubuntu 无法完成安装。它报错:failed to install into /target。又回到开始的地方了。怎么办? ### 手动清除 EFI 分区 -显然,我们的 EFI 分区出现了严重问题。简单回顾以下,如果你使用的是 UEFI,那么你需要一个单独的 FAT-32 格式化分区。该分区用于存储 EFI 引导镜像。例如,当你安装 Fedora 时,Fedora 引导镜像会被拷贝到 EFI 子目录。每个操作系统都会被存储到一个它自己的目录,一般是 /boot/efi/EFI/<操作系统版本>/。 +显然,我们的 EFI 分区出现了严重问题。简单回顾以下,如果你使用的是 UEFI,那么你需要一个单独的 FAT-32 格式化的分区。该分区用于存储 EFI 引导镜像。例如,当你安装 Fedora 时,Fedora 引导镜像会被拷贝到 EFI 子目录。每个操作系统都会被存储到一个它自己的目录,一般是 `/boot/efi/EFI/<操作系统版本>/`。 - ![EFI 分区内容](http://www.dedoimedo.com/images/computers-years/2016-2/grub2-efi-partition-contents.png) +![EFI 分区内容](http://www.dedoimedo.com/images/computers-years/2016-2/grub2-efi-partition-contents.png) 在我的 [G50][4] 机器上,这里有很多各种发行版测试条目,包括:centos、debian、fedora、mx-15、suse、Ubuntu、zorin 以及其它。这里也有一个 goofiboot 目录。但是,efibootmgr 并没有在它的菜单中显示 goofiboot 条目。显然这里出现了一些问题。 @@ -45,7 +46,7 @@ Boot2003* EFI Network P.S. 上面的输出是在 LIVE 会话中运行命令生成的! -我决定清除所有非默认的以及非微软的条目然后重新开始。显然,有些东西被损坏了,妨碍了新的发行版设置它们自己的启动引导程序。因此我删除了 /boot/efi/EFI 分区下面出 Boot 和 Windows 外的所有目录。同时,我也通过删除所有额外的条目更新了启动管理器。 +我决定清除所有非默认的以及非微软的条目然后重新开始。显然,有些东西被损坏了,妨碍了新的发行版设置它们自己的启动引导程序。因此我删除了 `/boot/efi/EFI` 分区下面除了 Boot 和 Windows 以外的所有目录。同时,我也通过删除所有额外的条目更新了启动管理器。 ``` efibootmgr -b -B @@ -53,23 +54,20 @@ efibootmgr -b -B 最后,我重新安装了 Ubuntu,并仔细监控 GRUB 安装和配置的过程。这次,成功完成啦。正如预期的那样,几个无效条目出现了一些错误,但整个安装过程完成就好了。 - ![安装错误](http://www.dedoimedo.com/images/computers-years/2016-2/grub2-install-errors.jpg) +![安装的错误消息](http://www.dedoimedo.com/images/computers-years/2016-2/grub2-install-errors.jpg) - ![安装成功](http://www.dedoimedo.com/images/computers-years/2016-2/grub2-install-successful.jpg) +![安装的成功消息](http://www.dedoimedo.com/images/computers-years/2016-2/grub2-install-successful.jpg) ### 额外阅读 如果你不喜欢这种手动修复,你可以阅读: -``` -[Boot-Info][5] 手册,里面有帮助你恢复系统的自动化工具 - -[Boot-repair-cd][6] 自动恢复工具下载页面 -``` +- [Boot-Info][5] 手册,里面有帮助你恢复系统的自动化工具 +- [Boot-repair-cd][6] 自动恢复工具下载页面 ### 总结 -如果你遇到由于 EFI 分区破坏而导致系统严重瘫痪的情况,那么你可能需要遵循本指南中的建议。 删除所有非默认条目。 如果你使用 Windows 进行多重引导,请确保不要修改任何和 Microsoft 相关的东西。 然后相应地更新引导菜单,以便删除损坏的条目。 重新运行所需发行版的安装设置,或者尝试用之前介绍的比较不严格的修复方法。 +如果你遇到由于 EFI 分区破坏而导致系统严重瘫痪的情况,那么你可能需要遵循本指南中的建议。 删除所有非默认条目。 如果你使用 Windows 进行多重引导,请确保不要修改任何和 Microsoft 相关的东西。 然后相应地更新引导菜单,以便删除损坏的条目。 重新运行所需发行版的安装设置,或者尝试用之前介绍的比较不严谨的修复方法。 我希望这篇小文章能帮你节省一些时间。Solus 对我系统的更改使我很懊恼。这些事情本不应该发生,恢复过程也应该更简单。不管怎样,虽然事情似乎很可怕,修复并不是很难。你只需要删除损害的文件然后重新开始。你的数据应该不会受到影响,你也应该能够顺利进入到运行中的系统并继续工作。开始吧。 @@ -84,12 +82,6 @@ efibootmgr -b -B 从 2004 到 2008 年,我通过在医疗图像行业担任物理专家养活自己。我的工作主要关注解决问题和开发算法。为此,我广泛使用 Matlab,主要用于信号和图像处理。另外,我已通过几个主要工程方法的认证,包括 MEDIC Six Sigma Green Belt、实验设计以及统计工程。 -有时候我也会写书,包括 Linux 创新及技术工作。 - -往下滚动你可以查看我开源项目的完整列表、发表文章以及专利。 - -有关我奖项、提名以及 IT 相关认证的完整列表,稍后也会有。 - ------------- @@ -98,7 +90,7 @@ via: http://www.dedoimedo.com/computers/grub2-efi-corrupt-part-recovery.html 作者:[Igor Ljubuncic][a] 译者:[ictlyh](https://github.com/ictlyh) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From e8c56cb727b35ebc4b5ae651a3904dd2f685bd80 Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 11 May 2017 08:56:35 +0800 Subject: [PATCH 0044/1407] translating --- sources/tech/20170501 Containers running Containers.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170501 Containers running Containers.md b/sources/tech/20170501 Containers running Containers.md index b300a6e38b..ef6de95610 100644 --- a/sources/tech/20170501 Containers running Containers.md +++ b/sources/tech/20170501 Containers running Containers.md @@ -1,3 +1,5 @@ +translating---geekpi + Containers running Containers ============================================================ From adee0a255655420d496ab1e1a45b7257b52343f6 Mon Sep 17 00:00:00 2001 From: mec2cod Date: Thu, 11 May 2017 09:12:21 +0800 Subject: [PATCH 0045/1407] translate 20170317 How to control GPIO pins and operate relays with the Raspberry Pi.md --- ...ontrol GPIO pins and operate relays with the Raspberry Pi.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170317 How to control GPIO pins and operate relays with the Raspberry Pi.md b/sources/tech/20170317 How to control GPIO pins and operate relays with the Raspberry Pi.md index b8409c85f3..71a5bf4fd2 100644 --- a/sources/tech/20170317 How to control GPIO pins and operate relays with the Raspberry Pi.md +++ b/sources/tech/20170317 How to control GPIO pins and operate relays with the Raspberry Pi.md @@ -1,3 +1,5 @@ +being translated by zhousiyu325 + How to control GPIO pins and operate relays with the Raspberry Pi ============================================================ From 3d60b99b87c54b28a22f9dc30b3c5c0dac73825a Mon Sep 17 00:00:00 2001 From: Louis Wei Date: Thu, 11 May 2017 12:04:20 +0800 Subject: [PATCH 0046/1407] Create 20110127 How debuggers work Part 2 - Breakpoints.md --- .../tech/20110127 How debuggers work Part 2 - Breakpoints.md | 1 + 1 file changed, 1 insertion(+) create mode 100644 translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md diff --git a/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md b/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md new file mode 100644 index 0000000000..8b13789179 --- /dev/null +++ b/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md @@ -0,0 +1 @@ + From 0828780b7b27ca1717465140d156accd115d2c0a Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 11 May 2017 12:49:30 +0800 Subject: [PATCH 0047/1407] translated --- .../20170501 Containers running Containers.md | 134 ------------------ .../20170501 Containers running Containers.md | 132 +++++++++++++++++ 2 files changed, 132 insertions(+), 134 deletions(-) delete mode 100644 sources/tech/20170501 Containers running Containers.md create mode 100644 translated/tech/20170501 Containers running Containers.md diff --git a/sources/tech/20170501 Containers running Containers.md b/sources/tech/20170501 Containers running Containers.md deleted file mode 100644 index ef6de95610..0000000000 --- a/sources/tech/20170501 Containers running Containers.md +++ /dev/null @@ -1,134 +0,0 @@ -translating---geekpi - -Containers running Containers -============================================================ - -Some genuinely exciting news piqued my interest at this year’s DockerCon, that being the new Operating System (OS), LinuxKit, which was announced and is immediately on offer from the undisputed heavyweight container company, Docker.  - -The container giant has announced a flexible, extensible Operating System where system services run inside containers for portability. You might be surprised to hear that even includes the Docker runtime daemon itself. - -In this article we’ll have a quick look at what’s promised in LinuxKit, how to try it out for yourself and at ever-shrinking, optimised containers. - -**Less Is More** - -There’s no denying that users have been looking for a stripped-down version of Linux to run their microservices upon. With containerisation you’re trying your hardest to minimise each application so that it becomes a standalone process which sits inside a container of its own. However constantly shifting containers around because you’re patching the host that the containers reside on causes issues. In fact without an orchestrator like Kubernetes or Docker Swarm that container-shuffling is almost always going to cause downtime. - -Needless to say that’s just one reason to keep your OS as miniscule as possible; one of many. - -A favourite quote I’ve repeated on a number of occasions, comes from the talented Dutch programmer, Wietse Zweitze, who brought us the e-mail stalwart Postfix and TCP Wrappers amongst other renowned software. - -The Postfix website ([Postfix TLS_README][10]) states that even if you’re as careful with your coding as Wietse that for “every 1000 lines [you] introduce one additional bug into Postfix.” From my professional DevSecOps perspective by the mention of “bug” I might be forgiven for loosely translating that definition into security issues too. - -From a security perspective it’s precisely for this reason that less-is-more in the world of code. Simply put there’s a number of benefits to using less lines of code; namely security, administration time and performance. For starters there’s less security bugs, less time updating packages and faster boot times. - -**Look deeper inside** - -Think about what runs your application from inside a container. - -A good starting point is Alpine Linux ([https://alpinelinux.org/downloads][1]) which is a low-fat, boiled-down, reduced OS commonly preferred over the more bloated host favourites, such as Ubuntu or CentOS. Alpine also provides a miniroot filesystem (for use within containers) which comes in at a staggering 1.8MB at the last check. Indeed the ISO download for a fully-working Linux Operating System comes in at a remarkable 80MB in size. - -If you decide to utilise a Docker base image from Alpine Linux then you can find one on the Docker Hub ([https://hub.docker.com/_/alpine][2]) where Alpine Linux describes itself as: “A minimal Docker image based on Alpine Linux with a complete package index and only 5 MB in size!”. - -It’s been said, and I won’t attempt to verify this meme, that the ubiquitous Window Start Button is around the same filesize! I’ll refrain from commenting further. - -In all seriousness hopefully that gives you an idea of the power of innovative Unix-type OSs like Alpine Linux. - -**Lock everything up** - -What’s more, it goes on to explain that Alpine Linux is (not surprisingly) based on BusyBox ([BusyBox][3]), the famous set of Linux commands neatly packaged which many people won’t be aware sits inside their broadband router, smart television and of course many IoT devices in their homes as they read this. - -Comments on the the About page ([Alpine Linux][4]) of the Alpine Linux site states: - -“Alpine Linux was designed with security in mind. The kernel is patched with an unofficial port of grsecurity/PaX, and all userland binaries are compiled as Position Independent Executables (PIE) with stack smashing protection. These proactive security features prevent exploitation of entire classes of zero-day and other vulnerabilities.” - -In other words the boiled-down binaries bundled inside the Alpine Linux builds which offers the system its functionality have already been sieved through clever industry-standard security tools in order to help mitigate buffer overflow attacks. - -**Odd socks** - -Why do the innards of containers matter when we’re dealing with Docker’s new OS you may quite rightly ask? - -Well, as you might have guessed, when it comes to containers their construction is all about losing bloat. It’s about not including anything unless it’s absolutely necessary. It’s about having confidence so that you can reap the rewards of decluttering your cupboards, garden shed, garage and sock drawer with total impunity. - -Docker certainly deserve some credit for their foresight. Reportedly, early 2016 Docker hired a key driving force behind Alpine Linux, Nathaniel Copa, who helped switch the default, official image library away from Ubuntu to Alpine. The bandwidth that Docker Hub saved from the newly-streamlined image downloads alone must have been welcomed. - -And, bringing us up-to-date, that work will stand arm-in-arm with the latest container-based OS work; Docker’s LinuxKit. - -For clarity LinuxKit is not ever-likely destined to replace Alpine but rather to sit underneath the containers and act as a stripped-down OS that you can happily spin up your runtime daemon (in this case the Docker daemon which spawns your containers) upon. - -**Blondie's Atomic** - -A finely-tuned host is by no means a new thing (I mentioned the household devices embedded with Linux previously) and the evil geniuses who have been optimising Linux for the last couple of decades realised sometime ago that the underlying OS was key to churning out a server estate fulls of hosts brimming with containers. - -For example the mighty Red Hat have long been touting Red Hat Atomic ([https://www.redhat.com/en/resources/red-hat-enterprise-linux-atomic-host][5]) having contributed to Project Atomic ([Project Atomic][6]). The latter goes on to explain: - -“Based on proven technology either from Red Hat Enterprise Linux or the CentOS and Fedora projects, Atomic Host is a lightweight, immutable platform, designed with the sole purpose of running containerized applications.” - -There’s good reason that the underlying, immutable Atomic OS is forwarded as the recommended choice with Red Hat’s OpenShift PaaS (Platform as a Service) product. It’s minimal, performant and sophisticated. - -**Features** - -The mantra that less-is-more was evident throughout Docker’s announcement regarding LinuxKit. The project to realise the vision of LinuxKit was apparently no small undertaking and with the guiding hand of expert Justin Cormack, a Docker veteran and master with unikernels ([https://en.wikipedia.org/wiki/Unikernel][7]), and in partnership with HPE, Intel, ARM, IBM and Microsoft LinuxKit can run on mainframes as well as IoT-based fridge freezers. - -The configurable, pluggable and extensible nature of LinuxKit will appeal to many projects looking for a baseline upon which to build their services. By open-sourcing the project Docker are wisely inviting input from every man and their dog to contribute to its functionality which will mature like a good cheese undoubtedly over time.   - -**Proof of the pudding** - -Having promised to point those eager to get going with this new OS, let us wait no longer. If you want to get your hands on LinuxKit you can do so from the GitHub page here: [LinuxKit][11] - -On the GitHub page there’s instructions on how to get up and running along with some features. - -Time permitting I plan to get my hands much dirtier with LinuxKit. The somewhat-contentious Kubernetes versus Docker Swarm orchestration capabilities will be interesting to try out. I’d like to see memory footprints, boot times and diskspace-usage benchmarking too. - -If the promises are true then pluggable system services which run as containers is a fascinating way to build an OS. Docker blogged ([https://blog.docker.com/2017/04/introducing-linuxkit-container-os-toolkit][12]) the following on its tiny footprint: “Because LinuxKit is container-native, it has a very minimal size – 35MB with a very minimal boot time. All system services are containers, which means that everything can be removed or replaced.” - -I don’t know about you but that certainly whets my appetite. - -**Call the cops** - -Features aside with my DevSecOps hat on I will be in seeing how the promise of security looks in reality. - -Docker quotes from NIST (the National Institute of Standards and Technology: [https://www.nist.gov][8]) and claims on their blog that: - -“Security is a top-level objective and aligns with NIST stating, in their draft Application Container Security Guide: “Use container-specific OSes instead of general-purpose ones to reduce attack surfaces. When using a container-specific OS, attack surfaces are typically much smaller than they would be with a general-purpose OS, so there are fewer opportunities to attack and compromise a container-specific OS.” - -Possibly the most important container-to-host and host-to-container security innovation will be the fact that system containers (system services) are apparently heavily sandboxed into their own unprivileged space, given just the external access that they need. - -Couple that functionality with the collaboration of the Kernel Self Protection Project (KSPP) ([https://kernsec.org/wiki/index.php/Kernel_Self_Protection_Project][9]) and with a resounding thumbs-up from me it looks like Docker have focussed on something very worthwhile. For those unfamiliar KSPP’s raison d’etre is as follows: - -“This project starts with the premise that kernel bugs have a very long lifetime, and that the kernel must be designed in ways to protect against these flaws.” - -The KSPP site goes on to state admirably that: - -“Those efforts are important and on-going, but if we want to protect our billion Android phones, our cars, the International Space Station, and everything else running Linux, we must get proactive defensive technologies built into the upstream Linux kernel. We need the kernel to fail safely, instead of just running safely.” - -And, initially, if Docker only take baby steps with LinuxKit the benefit that it will bring over time through maturity will likely make great strides in the container space. - -**The End is far from nigh** - -As the powerhouse that is Docker continues to grow arms and legs there’s no doubt whatsoever that these giant-sized leaps in the direction of solid progress will benefit users and other software projects alike. - -I would encourage all with an interest in Linux to closely watch this (name)space... - --------------------------------------------------------------------------------- - -via: http://www.devsecops.cc/devsecops/containers.html - -作者:[Chris Binnie ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.devsecops.cc/ -[1]:https://alpinelinux.org/downloads/ -[2]:https://hub.docker.com/_/alpine -[3]:https://busybox.net/ -[4]:https://www.alpinelinux.org/about/ -[5]:https://www.redhat.com/en/resources/red-hat-enterprise-linux-atomic-host -[6]:http://www.projectatomic.io/ -[7]:https://en.wikipedia.org/wiki/Unikernel -[8]:https://www.nist.gov/ -[9]:https://kernsec.org/wiki/index.php/Kernel_Self_Protection_Project -[10]:http://www.postfix.org/TLS_README.html -[11]:https://github.com/linuxkit/linuxkit -[12]:https://blog.docker.com/2017/04/introducing-linuxkit-container-os-toolkit diff --git a/translated/tech/20170501 Containers running Containers.md b/translated/tech/20170501 Containers running Containers.md new file mode 100644 index 0000000000..6a2370fb0b --- /dev/null +++ b/translated/tech/20170501 Containers running Containers.md @@ -0,0 +1,132 @@ +容器中运行容器 +============================================================ + +一些令人振奋的消息引发了我对今年 DockerCon 的兴趣,在会议中宣布了一个新的操作系统(OS)LinuxKit,并由无可争议的容器巨头公司 Docker 提供。 + +容器巨头已经宣布了一个灵活的、可扩展的操作系统,为了可移植性系统服务在其内运行。当你听到包括 Docker 运行时也在内时,你可能会感到惊讶。 + +在本文中,我们将简要介绍一下 LinuxKit 中承诺的内容,以及如何自己尝试并不断缩小优化容器。 + +**少即是多** + +不可否认的是,用户一直在寻找一个被剥离版本的 Linux 来运行他们的微服务。通过容器化,你会尽可能地减少每个应用程序,使其成为一个位于其自身容器内的独立进程。但是,由于你对那些驻留容器主机的修补导致的问题,因此你不断地移动容器。实际上如果没有像 Kubernetes 或 Docker Swarm 这样的协调者,容器编排几乎总是会导致停机。 + +不用说,这只是让你保持操作系统尽可能小的原因之一。 + +我曾多次在不同场合重复过的最喜爱的名言,来自荷兰的天才程序员 Wietse Zweitze,他为我们提供了 email 中的 Postfix 和 TCP Wrappers 等知名软件。 + +Postfix 网站([Postfix TLS_README][10])指出,即使你编码和 Wietse 一样小心,“每 1000 行[你]就会在 Postfix 中引入一个额外的错误”。从我的专业的 DevSecOps 角度提到我可以被原谅的 “bug” 可以不严谨地说成安全问题。 + +从安全的角度来看,正是由于这个原因,代码世界中“少即是多”。简单地说,使用较少的代码行有很多好处,即安全性、管理时间和性能。对于初学者来说,安全漏洞较少,更新软件包的时间更短,启动时间更快。 + +**深入观察** + +考虑下从容器内部运行你的程序。 + +一个好的起点是 Alpine Linux([https://alpinelin.org.org/downloads][1]),它是一个精简化的操作系统,通常比那些笨重的系统更受喜欢,如 Ubuntu 或 CentOS 等。Alpine 还提供了一个 miniroot 文件系统(用于容器内),最后一次检测是惊人的 1.8M。事实上,完整的 Linux 操作系统下载后有 80M。 + +如果你决定使用 Alpine Linux 作为 Docker 基础镜像,那么你可以在Docker Hub([https://hub.docker.com/_/alpine][2])上找到一个,其中 Alpine Linux 将自己描述为:“一个基于 Alpine Linux 的最小 Docker 镜像,具有完整的包索引,大小只有5 MB!” + +据说无处不在的 “Window Start Button” 也是大致相同的大小!我不会尝试去验证,也不会进一步评论。 + +严肃地希望能让你了解创新的类 Unix 操作系统(如 Alpine Linux)的强大功能。 + +**锁定一切** + +再说一点,Alpine Linux 是(并不惊人)基于 BusyBox([BusyBox][3]),一套著名的打包了 Linux 命令的集合,许多人不会意识到他们的宽带路由器、智能电视,当然还有他们家庭中的物联网设备就有它。 + +Alpine Linux 站点的“关于”页面([Alpine Linux][4])的评论中指出: + +“Alpine Linux 的设计考虑到安全性。内核使用非官方的 grsecurity/PaX 移植进行修补,所有用户态二进制文件都编译为具有堆栈保护的地址无关可执行文件(PIE)。 这些主动安全特性可以防止所有类别的零日和其他漏洞利用” + +换句话说,Alpine Linux 中的二进制文件捆绑在一起,提供了那些通过行业安全工具筛选的功能,以帮助缓解缓冲区溢出攻击。 + +**奇怪的袜子** + +你可能会问,为什么当我们处理 Docker 的新操作系统时,容器的内部结构很重要? + +那么,你可能已经猜到,当涉及容器时,他们的目标是精简。除非绝对必要,否则不包括任何东西。所以有信心的是,你可以在清理橱柜、花园棚子、车库和袜子抽屉后获得回报而没有惩罚。 + +Docker 的确因为它们的先见而获得声望。据报道,2 月初,Docker 聘请了 Alpine Linux 的主要推动者 Nathaniel Copa,他帮助将默认的官方镜像库从 Ubuntu 切换到 Alpine。Docker Hub 从新近精简镜像节省的带宽受到了欢迎。 + +并且最新的情况是,这项工作将与最新的基于容器的操作系统相结合:Docker 的 LinuxKit。 + +要说清楚的是 LinuxKit 不会注定代替 Alpine,而是位于容器下层,并作为一个完整的操作系统,你可以高兴地启动你的运行时守护程序(在这种情况下,在容器中产生 Docker 守护程序)。 + +**Blondie Atomic ** + +经过精心调试的主机绝对不是一件新事物(以前提到过嵌入式 Linux 的家用设备)。在过去几十年中一直在优化 Linux 的天才在某个时候意识到底层的操作系统是快速生产含有大量容器主机的关键。 + +例如,强大的红帽长期以来一直在出售已经贡献给 Project Atomic ([Project Atomic][6]) 的 Red Hat Atomic([https://www.redhat.com/en/resources/red-hat-enterprise-linux-atomic-host][5])。后者继续解释: + +“基于 Red Hat Enterprise Linux 或 CentOS 和 Fedora 项目的成熟技术,Atomic Host 是一个轻量级的、不可变的平台,其设计目的仅在于运行容器化应用程序。 + +有一个很好理由将底层的、不可变的 Atomic OS 作为 Red Hat OpenShift PaaS(平台即服务)产品推荐。它最小化、高性能、尖端。 + +**特性** + +在 Docker 关于 LinuxKit 的公告中,少即是多的口号是显而易见的。实现 LinuxKit 愿景的项目显然是不小的事业,它由 Docker 老将和 Unikernels([https://en.wikipedia.org/wiki/Unikernel][7])的主管 Justin Cormack 指导,并与 HPE、Intel、ARM、IBM 和 Microsoft LinuxKit 合作,可以在大型机以及基于物联网的冰柜中运行。 + +LinuxKit 的可配置、可插拔和可扩展性质将吸引许多项目寻找建立其服务的基准。通过开源项目,Docker 明智地邀请每个男人和他们的狗投入其功能开发,随着时间的推移,它会像好的奶酪那样成熟。 + +**布丁的证明** + +有承诺称那些急于使用新系统的人不用再等待了。如果你准备着手 LinuxKit,你可以从 GitHub 中开始:[LinuxKit][11] + +在 GitHub 页面上有关于如何启动和运行一些功能的指导。 + +时间允许的话我准备更加深入 LinuxKit。有争议的 Kubernetes 与 Docker Swarm 编排功能对比会是有趣的尝试。我还想看到内存占用、启动时间和磁盘空间使用率的基准测试。 + +如果承诺是真实的,则作为容器运行的可插拔系统服务是构建操作系统的迷人方式。Docker 在博客([https://blog.docker.com/2017/04/introducing-linuxkit-container-os-toolkit][12])中提到:“因为 LinuxKit 是原生容器,它有一个非常小的尺寸 - 35MB,引导时间非常小。所有系统服务都是容器,这意味着可以删除或替换所有的内容。“ + +我不知道你怎么样,但这非常符合我的胃口。 + +**呼叫警察** + +除了站在我 DevSecOps 角度看到的功能,我将看到承诺的安全在现实中的面貌。 + +Docker 引用来自 NIST(国家标准与技术研究所:[https://www.nist.gov] [8]),并在他们的博客上声称: + +安全性是最高目标,这与 NIST 在其“应用程序容器安全指南”草案中说明的保持一致:“使用容器专用操作系统而不是通用操作系统来减少攻击面。当使用专用容器操作系统时,攻击面通常比通用操作系统小得多,因此攻击和危及专用容器操作系统的机会较少。” + +可能最重要的容器到主机和主机到容器的安全创新将是系统容器(系统服务)被完全地沙箱化到自己的非特权空间中,而只给它们需要的外部访问。 + +通过内核自我保护项目(KSPP)([https://kernsec.org/wiki/index.php/Kernel_Self_Protection_Project][9])的协作来实现这一功能,我很满意 Docker 开始专注于一些非常值得的东西上。对于那些不熟悉的 KSPP 的人而言,它存在理由如下: + +“启动这个项目的的假设是内核 bug 的存在时间很长,内核必须设计成防止这些缺陷。” + +KSPP 网站继续表态: + +“这些努力非常重要并还在进行,但如果我们要保护我们的十亿 Android 手机、我们的汽车、国际空间站,还有其他运行 Linux 的产品,我们必须在上游的 Linux 内核中建立积极的防御性技术。我们需要内核安全地错误,而不只是安全地运行。” + +而且,如果 Docker 最初只能在 LinuxKit 前进一小步,那么随着时间的推移,成熟度带来的好处可能会在容器领域中取得长足的进步。 + +**离终点还远** + +像 Docker 这样不断发展壮大的集团无论在哪个方向上取得巨大的飞跃都将会用户和其他软件带来益处。 + +我鼓励所有对 Linux 感兴趣的人密切关注这个领域。 + +-------------------------------------------------------------------------------- + +via: http://www.devsecops.cc/devsecops/containers.html + +作者:[Chris Binnie ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.devsecops.cc/ +[1]:https://alpinelinux.org/downloads/ +[2]:https://hub.docker.com/_/alpine +[3]:https://busybox.net/ +[4]:https://www.alpinelinux.org/about/ +[5]:https://www.redhat.com/en/resources/red-hat-enterprise-linux-atomic-host +[6]:http://www.projectatomic.io/ +[7]:https://en.wikipedia.org/wiki/Unikernel +[8]:https://www.nist.gov/ +[9]:https://kernsec.org/wiki/index.php/Kernel_Self_Protection_Project +[10]:http://www.postfix.org/TLS_README.html +[11]:https://github.com/linuxkit/linuxkit +[12]:https://blog.docker.com/2017/04/introducing-linuxkit-container-os-toolkit From ff99483972104b9c2ddf721beba9db105f0f107e Mon Sep 17 00:00:00 2001 From: Louis Wei Date: Thu, 11 May 2017 14:03:39 +0800 Subject: [PATCH 0048/1407] Update 20110127 How debuggers work Part 2 - Breakpoints.md --- .../tech/20110127 How debuggers work Part 2 - Breakpoints.md | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md b/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md index 8b13789179..d2d6733b4d 100644 --- a/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md +++ b/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md @@ -1 +1,6 @@ +[调试器如何工作: Part 2 - 断点][26] +============================================================ +这是调试器如何工作系列文章的第二部分,阅读本文前,请确保你已经读过[第一部分][27]。 + +### 关于本文 From c71c2dbeb285165ab612862ad03ca21a89a6cfa4 Mon Sep 17 00:00:00 2001 From: Louis Wei Date: Thu, 11 May 2017 14:04:51 +0800 Subject: [PATCH 0049/1407] Update 20110127 How debuggers work Part 2 - Breakpoints.md --- ...How debuggers work Part 2 - Breakpoints.md | 38 +++++++++++++++++++ 1 file changed, 38 insertions(+) diff --git a/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md b/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md index d2d6733b4d..88d30da543 100644 --- a/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md +++ b/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md @@ -4,3 +4,41 @@ ### 关于本文 +-------------------------------------------------------------------------------- + +via: http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints + +作者:[Eli Bendersky][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://eli.thegreenplace.net/ +[1]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id1 +[2]:http://en.wikipedia.org/wiki/Out-of-order_execution +[3]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id2 +[4]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id3 +[5]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id4 +[6]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id5 +[7]:http://en.wikipedia.org/wiki/Executable_and_Linkable_Format +[8]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id6 +[9]:http://eli.thegreenplace.net/tag/articles +[10]:http://eli.thegreenplace.net/tag/debuggers +[11]:http://eli.thegreenplace.net/tag/programming +[12]:http://www.alexonlinux.com/how-debugger-works +[13]:http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html +[14]:http://mainisusuallyafunction.blogspot.com/2011/01/implementing-breakpoints-on-x86-linux.html +[15]:http://www.nasm.us/xdoc/2.09.04/html/nasmdoc0.html +[16]:http://stackoverflow.com/questions/2187484/elf-binary-entry-point +[17]:http://news.ycombinator.net/item?id=2131894 +[18]:http://www.deansys.com/doc/gdbInternals/gdbint_toc.html +[19]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id7 +[20]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id8 +[21]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id9 +[22]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id10 +[23]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id11 +[24]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id12 +[25]:https://github.com/eliben/code-for-blog/tree/master/2011/debuggers_part2_code +[26]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints +[27]:http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1/ From ae97cc17569ec7d005491bd0172aaab27f11b4ab Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 12 May 2017 09:07:46 +0800 Subject: [PATCH 0050/1407] translating --- ...w Neural Network Software for CPU and GPU on Ubuntu 16.04.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md b/sources/tech/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md index 340b1ed86b..a30d8c74ba 100644 --- a/sources/tech/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md +++ b/sources/tech/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md @@ -1,3 +1,5 @@ +translating---geekpi + Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04 ============================================================ From 1fe703e68265f5bd3074b2c8b3a2d0ae2040596b Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 12 May 2017 10:18:40 +0800 Subject: [PATCH 0051/1407] translated --- ...oftware for CPU and GPU on Ubuntu 16.04.md | 155 ------------------ ...oftware for CPU and GPU on Ubuntu 16.04.md | 154 +++++++++++++++++ 2 files changed, 154 insertions(+), 155 deletions(-) delete mode 100644 sources/tech/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md create mode 100644 translated/tech/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md diff --git a/sources/tech/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md b/sources/tech/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md deleted file mode 100644 index a30d8c74ba..0000000000 --- a/sources/tech/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md +++ /dev/null @@ -1,155 +0,0 @@ -translating---geekpi - -Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04 -============================================================ - -### On this page - -1. [1 Install CUDA][1] -2. [2 Install the CuDNN library][2] -3. [3 Add the installation location to Bashrc file][3] -4. [4 Install TensorFlow with GPU support][4] -5. [5 Install TensorFlow with only CPU support][5] - -TensorFlow is an open source software for performing machine learning tasks. Google, its creator wanted to expose a powerful tool to help developers explore and build machine learning based applications and so they released this as an open source project. TensorFlow is an extremely powerful tool specializing in a type of neural network called the deep neural network. - -Deep neural networks are used to perform complex machine learning tasks such as image recognition, handwriting recognition, Natural language processing, chatbots, and more. These neural networks are trained to learn the tasks it is supposed to perform. As the computations required for training is extremely huge, most of the time, a GPU support is required and this is where TensorFlow comes to the rescue. It is GPU enabled and thus by installing the software with GPU support, the training time required can be significantly reduced. - -This tutorial helps you to install TensorFlow for CPU only and also with GPU support. So, to get TensorFlow with GPU support, you must have a Nvidia GPU with CUDA support. Installation of CUDA and CuDNN ( Nvidia computation libraries) are a bit tricky and this guide provides a step by step approach to installing them before actually coming to the installation of TensorFlow itself. - -The Nvidia CUDA is a GPU-accelerated library that has highly tuned implementations for standard routines used in neural networks. the CuDNN is a tuning library for the GPU which takes care of GPU performance tuning automatically. TensorFlow relies on both these for training and running deep neural networks and hence they have to be installed before TensorFlow is installed. - -It is very important to note that, those who DO NOT wish to install TensorFlow with GPU support, then you can skip all these following steps and jump straight to "Step 5: Install TensorFlow with only CPU support" section of this guide. - -An introduction to TensorFlow can be found [here][10]. - -### 1 Install CUDA - -Firstly, download CUDA for Ubuntu 16.04 from [here.][11] This file is pretty big (2GB) so, it might take sometime to get downloaded. - -The downloaded file is ".deb" package. To install it, run the following commands: - -sudo dpkg -i cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64.deb - -[ - ![Install CUDA](https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/image1.png) -][12] - -the following commands install any dependencies that have been missed and finally install the cuda toolkit: - -sudo apt install -f - -sudo apt update - -sudo apt install cuda - -If it successfully installed, you will get a message saying it's "successfully installed". If it's already installed, then you will get output similar to the image below: - -[ - ![Install CUDA with apt](https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/image2.png) -][13] - -### 2 Install the CuDNN library - -CuDNN downloading requires a bit of work sadly. Nvidia does not directly give you the files to download (It's free however). Follow the steps to get your CuDNN files. - -1. click [here][8] to goto Nvidia's register page and create an account. First page asks you to enter your personal details and the second page asks you to answer a few survey questions. It's alright if you do not know answers to all, you can just select an option at random. -2. The previous step would have lead to Nvidia sending you an activation link to your mail-Id. Once you have activated, head over to the CuDNN download link [here][9]. -3. Once you login to that page, you will have to fill out another smaller survey. Randomly click on the checkboxes and then click on "proceed to Download" button at the bottom of the survey and in the next page click on agree to terms of use. -4. Finally, in the drop down, click on "Download cuDNN v5.1 (Jan 20, 2017), for CUDA 8.0", and within that drop down, you need to download two files by clicking on it: - * [cuDNN v5.1 Runtime Library for Ubuntu14.04 (Deb)][6] - * [cuDNN v5.1 Developer Library for Ubuntu14.04 (Deb)][7] - -NOTE: even though the library says it's for Ubuntu 14.04, use that link only. it works for 16.04 as well - -Now that you finally have both the CuDNN files, it's time to install them!! Use the following commands from the folder which contains this downloaded files: - -sudo dpkg -i libcudnn5_5.1.5-1+cuda8.0_amd64.deb - -sudo dpkg -i libcudnn5-dev_5.1.5-1+cuda8.0_amd64.deb - -Following image shows the output of running these commands: - -[ - ![Install the CuDNN library](https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/image3.png) -][14] - -### 3 Add the installation location to Bashrc file - -the installation location should be added to the bashrc file so that from the next time onward, the system should know where to find the installed directory for CUDA. use the following command to open the bashrc file: - -sudo gedit ~/.bashrc - -once the file opens, add the following two lines at the end of that file: - -``` - export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64" - export CUDA_HOME=/usr/local/cuda -``` - -### 4 Install TensorFlow with GPU support - -this step we install TensorFlow with GPU support. Run the following command if you are using python 2.7: - -pip install TensorFlow-gpu - -if you have python 3.x instead of the above command, use the following: - -pip3 install TensorFlow-gpu - -You will get a "successfully installed" message once the command finishes execution. Now, all that remains to test is whether it has installed correctly. To test this, open a command prompt and type the following commands: - -python - -import TensorFlow as tf - -You should get an output similar to the image below. From the image you can observe that the CUDA libraries have been successfully opened. Now, if there were errors, messages saying failure to open CUDA and even modules not being found will appear. In that case you might have missed one of the step above and re-doing this tutorial carefully will be the way to go. - -[ - ![Install TensorFlow with GPU support](https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/image4.png) -][15] - -### 5 Install TensorFlow with only CPU support - -NOTE : This step has to be executed by people who do not have a GPU or people who do not have a Nvidia GPU. Others, please ignore this step!! - -installing TensorFlow for CPU only is extremely easy. Use the following two commands : - -pip install TensorFlow - -if you have python 3.x instead of the above command, use the following: - -pip3 install TensorFlow - -Yes, it's that simple! - -This concludes, the installation guide, you can now start to build your deep learning applications. If you are just starting out, then you can look at the official tutorial for beginners [here][16]. If you are looking for more advanced tutorials, then you can learn how to setup an image recognition system/tool which capable of identifying thousands of objects with high accuracy from [here][17]. - --------------------------------------------------------------------------------- - -via: https://www.howtoforge.com/tutorial/installing-tensorflow-neural-network-software-for-cpu-and-gpu-on-ubuntu-16-04/ - -作者:[Akshay Pai ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.howtoforge.com/tutorial/installing-tensorflow-neural-network-software-for-cpu-and-gpu-on-ubuntu-16-04/ -[1]:https://www.howtoforge.com/tutorial/installing-tensorflow-neural-network-software-for-cpu-and-gpu-on-ubuntu-16-04/#-install-cuda -[2]:https://www.howtoforge.com/tutorial/installing-tensorflow-neural-network-software-for-cpu-and-gpu-on-ubuntu-16-04/#-install-the-cudnn-library -[3]:https://www.howtoforge.com/tutorial/installing-tensorflow-neural-network-software-for-cpu-and-gpu-on-ubuntu-16-04/#-add-the-installation-location-to-bashrc-file -[4]:https://www.howtoforge.com/tutorial/installing-tensorflow-neural-network-software-for-cpu-and-gpu-on-ubuntu-16-04/#-install-tensorflow-with-gpu-support -[5]:https://www.howtoforge.com/tutorial/installing-tensorflow-neural-network-software-for-cpu-and-gpu-on-ubuntu-16-04/#-install-tensorflow-with-only-cpu-support -[6]:https://developer.nvidia.com/compute/machine-learning/cudnn/secure/v5.1/prod_20161129/8.0/libcudnn5_5.1.10-1+cuda8.0_amd64-deb -[7]:https://developer.nvidia.com/compute/machine-learning/cudnn/secure/v5.1/prod_20161129/8.0/libcudnn5-dev_5.1.10-1+cuda8.0_amd64-deb -[8]:https://developer.nvidia.com/group/node/873374/subscribe/og_user_node -[9]:https://developer.nvidia.com/rdp/form/cudnn-download-survey -[10]:http://sourcedexter.com/what-is-tensorflow/ -[11]:https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64-deb -[12]:https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/big/image1.png -[13]:https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/big/image2.png -[14]:https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/big/image3.png -[15]:https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/big/image4.png -[16]:https://www.tensorflow.org/get_started/mnist/beginners -[17]:https://www.tensorflow.org/tutorials/image_recognition diff --git a/translated/tech/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md b/translated/tech/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md new file mode 100644 index 0000000000..3a9d2a21a0 --- /dev/null +++ b/translated/tech/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md @@ -0,0 +1,154 @@ +在 Ubuntu 16.04 中安装支持 CPU 和 GPU 的 Google TensorFlow 神经网络软件 +============================================================ + +### 在本页中 + +1. [1 安装 CUDA][1] +2. [2 安装 CuDNN 库][2] +3. [3 在 .bashrc 中添加安装位置][3] +4. [4 安装带有 GPU 支持的 TensorFlow][4] +5. [5 安装只支持 CPU 的 TensorFlow][5] + +TensorFlow 是用于机器学习任务的开源软件。它的创建者 Google 希望发布一个强大的工具帮助开发者探索和建立基于机器学习的程序,所以他们在今年作为开源项目发布了它。TensorFlow 是一个非常强大的工具,专注于一种称为深层神经网络的神经网络。 + +深层神经网络被用来执行复杂的机器学习任务,例如图像识别、手写识别、自然语言处理、聊天机器人等等。这些神经网络被训练学习它应该执行的任务。至于训练所需的计算是非常巨大的,在大多数情况下需要 CPU 支持,这时 TensorFlow 就派上用场了。启用了 GPU 并安装了支持 GPU 的软件,那么训练所需的时间就可以大大减少。 + +本教程可以帮助你安装只支持 CPU 和支持 GPU 的 TensorFlow。因此,要获得带有 GPU 支持的 TensorFLow,你必须要有一块支持 CUDA 的 Nvidia GPU。CUDA 和 CuDNN(Nvidia 的计算库)的安装有点棘手,本指南提供在实际安装 TensorFlow 之前一步步安装它们的方法。 + +Nvidia CUDA 是一个 GPU 加速库,它已经为标准神经网络程序调整过。CuDNN 是一个用于 GPU 的调整库,它负责 GPU 性能的自动调整。TensorFlow 同时依赖这两者用于训练并运行深层神经网络,因此它们必须在 TensorFlow 之前安装。 + +需要指出的是,那些不希望安装支持 GPU 的 TensorFlow 的人,你可以跳过以下所有的步骤并直接跳到:“步骤 5:安装只支持 CPU 的 TensorFlow”。 + +关于 TensorFlow 的介绍可以在[这里][10]找到。 + + +### 1 安装 CUDA + +首先,在[这里][11]下载用于 Ubuntu 16.04 的 CUDA。此文件非常大(2GB),因此也许会花费一些时间下载。 + +下载的文件是 “.deb” 包。要安装它,运行下面的命令: + +sudo dpkg -i cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64.deb + +[ + ![Install CUDA](https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/image1.png) +][12] + +下面的的命令会安装所有的依赖,并最后安装 cuda 工具包: + +sudo apt install -f + +sudo apt update + +sudo apt install cuda + +如果成功安装,你会看到一条消息说:“successfully installed”。如果已经安装了,接着你可以看到类似下面的输出: + +[ + ![Install CUDA with apt](https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/image2.png) +][13] + +### 2 successfully installed + +CuDNN 下载需要花费一些功夫。Nvidia 没有直接提供下载文件(虽然它是免费的)。通过下面的步骤获取 CuDNN。 + +1.点击[此处][8]进入 Nvidia 的注册页面并创建一个帐户。第一页要求你输入你的个人资料,第二页会要求你回答几个调查问题。如果你不知道所有答案也没问题,你可以随机选择一个选项。 +2.通过前面的步骤,Nvidia 会向你的邮箱发送一个激活链接。在你激活之后,直接进入[这里][9]的 CuDNN 下载链接。 +3.登录之后,你需要填写另外一份类似的调查。随机点击复选框,然后点击调查底部的 “proceed to Download”,在下一页我们点击同意使用条款。 +4.最后,在下拉中点击 “Download cuDNN v5.1 (Jan 20, 2017), for CUDA 8.0”,最后,你需要下载这两个文件: + * [cuDNN v5.1 Runtime Library for Ubuntu14.04 (Deb)][6] + * [cuDNN v5.1 Developer Library for Ubuntu14.04 (Deb)][7] + +注意:即使说的是用于 Ubuntu 14.04 的库。它也适用于 16.04。 + +现在你已经同时有 CuDNN 的两个文件了,是时候安装它们了!在包含这些文件的文件夹内运行下面的命令: + +sudo dpkg -i libcudnn5_5.1.5-1+cuda8.0_amd64.deb + +sudo dpkg -i libcudnn5-dev_5.1.5-1+cuda8.0_amd64.deb + +下面的图片展示了这些命令的输出: + +[ + ![Install the CuDNN library](https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/image3.png) +][14] + +### 3 在 bashrc 中添加安装位置 + +安装位置应该被添加到 bashrc 中,以便系统下一次知道如何找到这些用于 CUDA 的文件。使用下面的命令打开 bashrc 文件: + +sudo gedit ~/.bashrc + +文件打开后,添加下面两行到文件的末尾: + +``` + export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64" + export CUDA_HOME=/usr/local/cuda +``` + +### 4 安装带有 GPU 支持的 TensorFlow + +这步我们将安装带有 GPU 支持的 TensorFlow。如果你使用的是 Python 2.7,运行下面的命令: + +pip install TensorFlow-gpu + +如果安装了 Python 3.x,使用下面的命令: + +pip3 install TensorFlow-gpu + +安装完后,你会看到一条 “successfully installed” 的消息。现在,剩下要测试的是是否已经正确安装。打开终端并输入下面的命令测试: + +python + +import TensorFlow as tf + +你应该会看到类似下面图片的输出。在图片中你可以观察到 CUDA 库已经成功打开了。如果有任何错误,消息会提示说无法打开 CUDA 甚至无法找到模块。为防你或许遗漏了上面的某步,仔细重做教程的每一步就行了。 + +[ + ![Install TensorFlow with GPU support](https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/image4.png) +][15] + +### 5 安装只支持 CPU 的 TensorFlow + +注意:这步是对那些没有 GPU 或者没有 Nvidia GPU 的人而言的。其他人请忽略这步!! + +安装只支持 CPU 的 TensorFlow 非常简单。使用下面两个命令: + +pip install TensorFlow + +如果你有 python 3.x,使用下面的命令: + +pip3 install TensorFlow + +是的,就是这么简单! + +安装指南至此结束,你现在可以开始构建深度学习应用了。如果你刚刚起步,你可以在[这里][16]看下适合初学者的官方教程。如果你正在寻找更多的高级教程,你可以在[这里][17]学习了解如何设置可以高精度识别上千个物体的图片识别系统/工具。 + +-------------------------------------------------------------------------------- + +via: https://www.howtoforge.com/tutorial/installing-tensorflow-neural-network-software-for-cpu-and-gpu-on-ubuntu-16-04/ + +作者:[Akshay Pai ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.howtoforge.com/tutorial/installing-tensorflow-neural-network-software-for-cpu-and-gpu-on-ubuntu-16-04/ +[1]:https://www.howtoforge.com/tutorial/installing-tensorflow-neural-network-software-for-cpu-and-gpu-on-ubuntu-16-04/#-install-cuda +[2]:https://www.howtoforge.com/tutorial/installing-tensorflow-neural-network-software-for-cpu-and-gpu-on-ubuntu-16-04/#-install-the-cudnn-library +[3]:https://www.howtoforge.com/tutorial/installing-tensorflow-neural-network-software-for-cpu-and-gpu-on-ubuntu-16-04/#-add-the-installation-location-to-bashrc-file +[4]:https://www.howtoforge.com/tutorial/installing-tensorflow-neural-network-software-for-cpu-and-gpu-on-ubuntu-16-04/#-install-tensorflow-with-gpu-support +[5]:https://www.howtoforge.com/tutorial/installing-tensorflow-neural-network-software-for-cpu-and-gpu-on-ubuntu-16-04/#-install-tensorflow-with-only-cpu-support +[6]:https://developer.nvidia.com/compute/machine-learning/cudnn/secure/v5.1/prod_20161129/8.0/libcudnn5_5.1.10-1+cuda8.0_amd64-deb +[7]:https://developer.nvidia.com/compute/machine-learning/cudnn/secure/v5.1/prod_20161129/8.0/libcudnn5-dev_5.1.10-1+cuda8.0_amd64-deb +[8]:https://developer.nvidia.com/group/node/873374/subscribe/og_user_node +[9]:https://developer.nvidia.com/rdp/form/cudnn-download-survey +[10]:http://sourcedexter.com/what-is-tensorflow/ +[11]:https://developer.nvidia.com/compute/cuda/8.0/Prod2/local_installers/cuda-repo-ubuntu1604-8-0-local-ga2_8.0.61-1_amd64-deb +[12]:https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/big/image1.png +[13]:https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/big/image2.png +[14]:https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/big/image3.png +[15]:https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/big/image4.png +[16]:https://www.tensorflow.org/get_started/mnist/beginners +[17]:https://www.tensorflow.org/tutorials/image_recognition From fb58b24d1b90da1e322ae36cd12979161dca29a4 Mon Sep 17 00:00:00 2001 From: ictlyh Date: Fri, 12 May 2017 15:28:21 +0800 Subject: [PATCH 0052/1407] Translated tech/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md --- ...g Engine API with Golang and PostgreSQL.md | 403 ------------------ ...g Engine API with Golang and PostgreSQL.md | 402 +++++++++++++++++ 2 files changed, 402 insertions(+), 403 deletions(-) delete mode 100644 sources/tech/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md create mode 100644 translated/tech/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md diff --git a/sources/tech/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md b/sources/tech/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md deleted file mode 100644 index bff6d03773..0000000000 --- a/sources/tech/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md +++ /dev/null @@ -1,403 +0,0 @@ -ictlyh Translating -GraphQL In Use: Building a Blogging Engine API with Golang and PostgreSQL -============================================================ - -### Abstract - -GraphQL appears hard to use in production: the graph interface is flexible in its modeling capabilities but is a poor match for relational storage, both in terms of implementation and performance. - -In this document, we will design and write a simple blogging engine API, with the following specification: - -* three types of resources (users, posts and comments) supporting a varied set of functionality (create a user, create a post, add a comment to a post, follow posts and comments from another user, etc.) -* use PostgreSQL as the backing data store (chosen because it’s a popular relational DB) -* write the API implementation in Golang (a popular language for writing APIs). - -We will compare a simple GraphQL implementation with a pure REST alternative in terms of implementation complexity and efficiency for a common scenario: rendering a blog post page. - -### Introduction - -GraphQL is an IDL (Interface Definition Language), designers define data types and model information as a graph. Each vertex is an instance of a data type, while edges represent relationships between nodes. This approach is flexible and can accommodate any business domain. However, the problem is that the design process is more complex and traditional data stores don’t map well to the graph model. See _Appendix 1_ for more details on this topic. - -GraphQL has been first proposed in 2014 by the Facebook Engineering Team. Although interesting and compelling in its advantages and features, it hasn’t seen mass adoption. Developers have to trade REST’s simplicity of design, familiarity and rich tooling for GraphQL’s flexibility of not being limited to just CRUD and network efficiency (it optimizes for round-trips to the server). - -Most walkthroughs and tutorials on GraphQL avoid the problem of fetching data from the data store to resolve queries. That is, how to design a database using general-purpose, popular storage solutions (like relational databases) to support efficient data retrieval for a GraphQL API. - -This document goes through building a blog engine GraphQL API. It is moderately complex in its functionality. It is scoped to a familiar business domain to facilitate comparisons with a REST based approach. - -The structure of this document is the following: - -* in the first part we will design a GraphQL schema and explain some of features of the language that are used. -* next is the design of the PostgreSQL database in section two. -* part three covers the Golang implementation of the GraphQL schema designed in part one. -* in part four we compare the task of rendering a blog post page from the perspective of fetching the needed data from the backend. - -### Related - -* The excellent [GraphQL introduction document][1]. -* The complete and working code for this project is on [github.com/topliceanu/graphql-go-example][2]. - -### Modeling a blog engine in GraphQL - -_Listing 1_ contains the entire schema for the blog engine API. It shows the data types of the vertices composing the graph. The relationships between vertices, ie. the edges, are modeled as attributes of a given type. - -``` -type User { - id: ID - email: String! - post(id: ID!): Post - posts: [Post!]! - follower(id: ID!): User - followers: [User!]! - followee(id: ID!): User - followees: [User!]! -} - -type Post { - id: ID - user: User! - title: String! - body: String! - comment(id: ID!): Comment - comments: [Comment!]! -} - -type Comment { - id: ID - user: User! - post: Post! - title: String - body: String! -} - -type Query { - user(id: ID!): User -} - -type Mutation { - createUser(email: String!): User - removeUser(id: ID!): Boolean - follow(follower: ID!, followee: ID!): Boolean - unfollow(follower: ID!, followee: ID!): Boolean - createPost(user: ID!, title: String!, body: String!): Post - removePost(id: ID!): Boolean - createComment(user: ID!, post: ID!, title: String!, body: String!): Comment - removeComment(id: ID!): Boolean -} -``` - -_Listing 1_ - -The schema is written in the GraphQL DSL, which is used for defining custom data types, such as `User`, `Post` and `Comment`. A set of primitive data types is also provided by the language, such as `String`, `Boolean` and `ID` (which is an alias of `String` with the additional semantics of being the unique identifier of a vertex). - -`Query` and `Mutation` are optional types recognized by the parser and used in querying the graph. Reading data from a GraphQL API is equivalent to traversing the graph. As such a starting vertex needs to be provided; this role is fulfilled by the `Query` type. In this case, all queries to the graph must start with a user specified by id `user(id:ID!)`. For writing data, the `Mutation` vertex type is defined. This exposes a set of operations, modeled as parameterized attributes which traverse (and return) the newly created vertex types. See _Listing 2_ for examples of how these queries might look. - -Vertex attributes can be parameterized, ie. accept arguments. In the context of graph traversal, if a post vertex has multiple comment vertices, you can traverse just one of them by specifying `comment(id: ID)`. All this is by design, the designer can choose not to provide direct paths to individual vertices. - -The `!` character is a type post-fix, works for both primitive or user-defined types and has two semantics: - -* when used for the type of a param in a parametriezed attribute, it means that the param is required. -* when used for the return type of an attribute it means that the attribute will not be null when the vertex is retrieved. -* combinations are possible, for instance `[Comment!]!` represents a list of non-null Comment vertices, where `[]`, `[Comment]` are valid, but `null, [null], [Comment, null]` are not. - -_Listing 2_ contains a list of _curl_ commands against the blogging API which will populate the graph using mutations and then query it to retrieve data. To run them, follow the instructions in the [topliceanu/graphql-go-example][3] repo to build and run the service. - -``` -# Mutations to create users 1,2 and 3\. Mutations also work as queries, in these cases we retrieve the ids and emails of the newly created users. -curl -XPOST http://vm:8080/graphql -d 'mutation {createUser(email:"user1@x.co"){id, email}}' -curl -XPOST http://vm:8080/graphql -d 'mutation {createUser(email:"user2@x.co"){id, email}}' -curl -XPOST http://vm:8080/graphql -d 'mutation {createUser(email:"user3@x.co"){id, email}}' -# Mutations to add posts for the users. We retrieve their ids to comply with the schema, otherwise we will get an error. -curl -XPOST http://vm:8080/graphql -d 'mutation {createPost(user:1,title:"post1",body:"body1"){id}}' -curl -XPOST http://vm:8080/graphql -d 'mutation {createPost(user:1,title:"post2",body:"body2"){id}}' -curl -XPOST http://vm:8080/graphql -d 'mutation {createPost(user:2,title:"post3",body:"body3"){id}}' -# Mutations to all comments to posts. `createComment` expects the user's ID, a title and a body. See the schema in Listing 1. -curl -XPOST http://vm:8080/graphql -d 'mutation {createComment(user:2,post:1,title:"comment1",body:"comment1"){id}}' -curl -XPOST http://vm:8080/graphql -d 'mutation {createComment(user:1,post:3,title:"comment2",body:"comment2"){id}}' -curl -XPOST http://vm:8080/graphql -d 'mutation {createComment(user:3,post:3,title:"comment3",body:"comment3"){id}}' -# Mutations to have the user3 follow users 1 and 2\. Note that the `follow` mutation only returns a boolean which doesn't need to be specified. -curl -XPOST http://vm:8080/graphql -d 'mutation {follow(follower:3, followee:1)}' -curl -XPOST http://vm:8080/graphql -d 'mutation {follow(follower:3, followee:2)}' - -# Query to fetch all data for user 1 -curl -XPOST http://vm:8080/graphql -d '{user(id:1)}' -# Queries to fetch the followers of user2 and, respectively, user1. -curl -XPOST http://vm:8080/graphql -d '{user(id:2){followers{id, email}}}' -curl -XPOST http://vm:8080/graphql -d '{user(id:1){followers{id, email}}}' -# Query to check if user2 is being followed by user1\. If so retrieve user1's email, otherwise return null. -curl -XPOST http://vm:8080/graphql -d '{user(id:2){follower(id:1){email}}}' -# Query to return ids and emails for all the users being followed by user3. -curl -XPOST http://vm:8080/graphql -d '{user(id:3){followees{id, email}}}' -# Query to retrieve the email of user3 if it is being followed by user1. -curl -XPOST http://vm:8080/graphql -d '{user(id:1){followee(id:3){email}}}' -# Query to fetch user1's post2 and retrieve the title and body. If post2 was not created by user1, null will be returned. -curl -XPOST http://vm:8080/graphql -d '{user(id:1){post(id:2){title,body}}}' -# Query to retrieve all data about all the posts of user1. -curl -XPOST http://vm:8080/graphql -d '{user(id:1){posts{id,title,body}}}' -# Query to retrieve the user who wrote post2, if post2 was written by user1; a contrived example that displays the flexibility of the language. -curl -XPOST http://vm:8080/graphql -d '{user(id:1){post(id:2){user{id,email}}}}' -``` - -_Listing 2_ - -By carefully desiging the mutations and type attributes, powerful and expressive queries are possible. - -### Designing the PostgreSQL database - -The relational database design is, as usual, driven by the need to avoid data duplication. This approach was chosen for two reasons: 1\. to show that there is no need for a specialized database technology or to learn and use new design techniques to accommodate a GraphQL API. 2\. to show that a GraphQL API can still be created on top of existing databases, more specifically databases originally designed to power REST endpoints or even traditional server-side rendered HTML websites. - -See _Appendix 1_ for a discussion on differences between relational and graph databases with respect to building a GraphQL API. _Listing 3_ shows the SQL commands to create the new database. The database schema generally matches the GraphQL schema. The `followers` relation needed to be added to support the `follow/unfollow` mutations. - -``` -CREATE TABLE IF NOT EXISTS users ( - id SERIAL PRIMARY KEY, - email VARCHAR(100) NOT NULL -); -CREATE TABLE IF NOT EXISTS posts ( - id SERIAL PRIMARY KEY, - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - title VARCHAR(200) NOT NULL, - body TEXT NOT NULL -); -CREATE TABLE IF NOT EXISTS comments ( - id SERIAL PRIMARY KEY, - user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - post_id INTEGER NOT NULL REFERENCES posts(id) ON DELETE CASCADE, - title VARCHAR(200) NOT NULL, - body TEXT NOT NULL -); -CREATE TABLE IF NOT EXISTS followers ( - follower_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - followee_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, - PRIMARY KEY(follower_id, followee_id) -); -``` - -_Listing 3_ - -### Golang API Implementation - -The GraphQL parser implemented in Go and used in this project is `github.com/graphql-go/graphql`. It contains a query parser, but no schema parser. This requires the programmer to build the GraphQL schema in Go using the constructs offered by the library. This is unlike the reference [nodejs implementation][4], which offers a schema parser and exposes hooks for data fetching. As such the schema in `Listing 1` is only useful as a guideline and has to be translated into Golang code. However, this _“limitation”_ offers the opportunity to peer behind the levels of abstraction and see how the schema relates to the graph traversal model for retrieving data. _Listing 4_ shows the implementation of the `Comment` vertex type: - -``` -var CommentType = graphql.NewObject(graphql.ObjectConfig{ - Name: "Comment", - Fields: graphql.Fields{ - "id": &graphql.Field{ - Type: graphql.NewNonNull(graphql.ID), - Resolve: func(p graphql.ResolveParams) (interface{}, error) { - if comment, ok := p.Source.(*Comment); ok == true { - return comment.ID, nil - } - return nil, nil - }, - }, - "title": &graphql.Field{ - Type: graphql.NewNonNull(graphql.String), - Resolve: func(p graphql.ResolveParams) (interface{}, error) { - if comment, ok := p.Source.(*Comment); ok == true { - return comment.Title, nil - } - return nil, nil - }, - }, - "body": &graphql.Field{ - Type: graphql.NewNonNull(graphql.ID), - Resolve: func(p graphql.ResolveParams) (interface{}, error) { - if comment, ok := p.Source.(*Comment); ok == true { - return comment.Body, nil - } - return nil, nil - }, - }, - }, -}) -func init() { - CommentType.AddFieldConfig("user", &graphql.Field{ - Type: UserType, - Resolve: func(p graphql.ResolveParams) (interface{}, error) { - if comment, ok := p.Source.(*Comment); ok == true { - return GetUserByID(comment.UserID) - } - return nil, nil - }, - }) - CommentType.AddFieldConfig("post", &graphql.Field{ - Type: PostType, - Args: graphql.FieldConfigArgument{ - "id": &graphql.ArgumentConfig{ - Description: "Post ID", - Type: graphql.NewNonNull(graphql.ID), - }, - }, - Resolve: func(p graphql.ResolveParams) (interface{}, error) { - i := p.Args["id"].(string) - id, err := strconv.Atoi(i) - if err != nil { - return nil, err - } - return GetPostByID(id) - }, - }) -} -``` - -_Listing 4_ - -Just like in the schema in _Listing 1_, the `Comment` type is a structure with three attributes defined statically; `id`, `title` and `body`. Two other attributes `user` and `post` are defined dynamically to avoid circular dependencies. - -Go does not lend itself well to this kind of dynamic modeling, there is little type-checking support, most of the variables in the code are of type `interface{}` and need to be type asserted before use. `CommentType` itself is a variable of type `graphql.Object` and its attributes are of type `graphql.Field`. So, there’s no direct translation between the GraphQL DSL and the data structures used in Go. - -The `resolve` function for each field exposes the `Source` parameter which is a data type vertex representing the previous node in the traversal. All the attributes of a `Comment` have, as source, the current `CommentType` vertex. Retrieving the `id`, `title` and `body` is a straightforward attribute access, while retrieving the `user` and the `post` requires graph traversals, and thus database queries. The SQL queries are left out of this document because of their simplicity, but they are available in the github repository listed in the _References_ section. - -### Comparison with REST in common scenarios - -In this section we will present a common blog page rendering scenario and compare the REST and the GraphQL implementations. The focus will be on the number of inbound/outbound requests, because these are the biggest contributors to the latency of rendering the page. - -The scenario: render a blog post page. It should contain information about the author (email), about the blog post (title, body), all comments (title, body) and whether the user that made the comment follows the author of the blog post or not. _Figure 1_ and _Figure 2_ show the interaction between the client SPA, the API server and the database, for a REST API and, respectively, for a GraphQL API. - -``` -+------+ +------+ +--------+ -|client| |server| |database| -+--+---+ +--+---+ +----+---+ - | GET /blogs/:id | | -1\. +-------------------------> SELECT * FROM blogs... | - | +---------------------------> - | <---------------------------+ - <-------------------------+ | - | | | - | GET /users/:id | | -2\. +-------------------------> SELECT * FROM users... | - | +---------------------------> - | <---------------------------+ - <-------------------------+ | - | | | - | GET /blogs/:id/comments | | -3\. +-------------------------> SELECT * FROM comments... | - | +---------------------------> - | <---------------------------+ - <-------------------------+ | - | | | - | GET /users/:id/followers| | -4\. +-------------------------> SELECT * FROM followers.. | - | +---------------------------> - | <---------------------------+ - <-------------------------+ | - | | | - + + + -``` - -_Figure 1_ - -``` -+------+ +------+ +--------+ -|client| |server| |database| -+--+---+ +--+---+ +----+---+ - | GET /graphql | | -1\. +-------------------------> SELECT * FROM blogs... | - | +---------------------------> - | <---------------------------+ - | | | - | | | - | | | -2\. | | SELECT * FROM users... | - | +---------------------------> - | <---------------------------+ - | | | - | | | - | | | -3\. | | SELECT * FROM comments... | - | +---------------------------> - | <---------------------------+ - | | | - | | | - | | | -4\. | | SELECT * FROM followers.. | - | +---------------------------> - | <---------------------------+ - <-------------------------+ | - | | | - + + + -``` - -_Figure 2_ - -_Listing 5_ contains the single GraphQL query which will fetch all the data needed to render the blog post. - -``` -{ - user(id: 1) { - email - followers - post(id: 1) { - title - body - comments { - id - title - user { - id - email - } - } - } - } -} -``` - -_Listing 5_ - -The number of queries to the database for this scenario is deliberately identical, but the number of HTTP requests to the API server has been reduced to just one. We argue that the HTTP requests over the Internet are the most costly in this type of application. - -The backend doesn’t have to be designed differently to start reaping the benefits of GraphQL, transitioning from REST to GraphQL can be done incrementally. This allows to measure performance improvements and optimize. From this point, the API developer can start to optimize (potentially merge) SQL queries to improve performance. The opportunity for caching is greatly increased, both on the database and API levels. - -Abstractions on top of SQL (for instance ORM layers) usually have to contend with the `n+1` problem. In step `4.` of the REST example, a client could have had to request the follower status for the author of each comment in separate requests. This is because in REST there is no standard way of expressing relationships between more than two resources, whereas GraphQL was designed to prevent this problem by using nested queries. Here, we cheat by fetching all the followers of the user. We defer to the client the logic of determining the users who commented and also followed the author. - -Another difference is fetching more data than the client needs, in order to not break the REST resource abstractions. This is important for bandwidth consumption and battery life spent parsing and storing unneeded data. - -### Conclusions - -GraphQL is a viable alternative to REST because: - -* while it is more difficult to design the API, the process can be done incrementally. Also for this reason, it’s easy to transition from REST to GraphQL, the two paradigms can coexist without issues. -* it is more efficient in terms of network requests, even with naive implementations like the one in this document. It also offers more opportunities for query optimization and result caching. -* it is more efficient in terms of bandwidth consumption and CPU cycles spent parsing results, because it only returns what is needed to render the page. - -REST remains very useful if: - -* your API is simple, either has a low number of resources or simple relationships between them. -* you already work with REST APIs inside your organization and you have the tooling all set up or your clients expect REST APIs from your organization. -* you have complex ACL policies. In the blog example, a potential feature could allow users fine-grained control over who can see their email, their posts, their comments on a particular post, whom they follow etc. Optimizing data retrieval while checking complex business rules can be more difficult. - -### Appendix 1: Graph Databases And Efficient Data Storage - -While it is intuitive to think about application domain data as a graph, as this document demonstrates, the question of efficient data storage to support such an interface is still open. - -In recent years graph databases have become more popular. Deferring the complexity of resolving the request by translating the GraphQL query into a specific graph database query language seems like a viable solution. - -The problem is that graphs are not an efficient data structure compared to relational databases. A vertex can have links to any other vertex in the graph and access patterns are less predictable and thus offer less opportunity for optimization. - -For instance, the problem of caching, ie. which vertices need to be kept in memory for fast access? Generic caching algorithms may not be very efficient in the context of graph traversal. - -The problem of database sharding: splitting the database into smaller, non-interacting databases, living on separate hardware. In academia, the problem of splitting a graph on the minimal cut is well understood but it is suboptimal and may potentially result in highly unbalanced cuts due to pathological worst-case scenarios. - -With relational databases, data is modeled in records (or rows, or tuples) and columns, tables and database names are simply namespaces. Most databases are row-oriented, which means that each record is a contiguous chunk of memory, all records in a table are neatly packed one after the other on the disk (usually sorted by some key column). This is efficient because it is optimal for the way physical storage works. The most expensive operation for an HDD is to move the read/write head to another sector on the disk, so minimizing these accesses is critical. - -There is also a high probability that, if the application is interested in a particular record, it will need the whole record, not just a single key from it. There is a high probabilty that if the application is interested in a record, it will be interested in its neighbours as well, for instance a table scan. These two observations make relational databases quite efficient. However, for this reason also, the worst use-case scenario for a relational database is random access across all data all the time. This is exactly what graph databases do. - -With the advent of SSD drives which have faster random access, cheap RAM memory which makes caching large portions of a graph database possible, better techniques to optimize graph caching and partitioning, graph databases have become a viable storage solution. And most large companies use it: Facebook has the Social Graph, Google has the Knowledge Graph. - --------------------------------------------------------------------------------- - -via: http://alexandrutopliceanu.ro/post/graphql-with-go-and-postgresql - -作者:[Alexandru Topliceanu][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://github.com/topliceanu -[1]:http://graphql.org/learn/ -[2]:https://github.com/topliceanu/graphql-go-example -[3]:https://github.com/topliceanu/graphql-go-example -[4]:https://github.com/graphql/graphql-js diff --git a/translated/tech/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md b/translated/tech/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md new file mode 100644 index 0000000000..062681cd70 --- /dev/null +++ b/translated/tech/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md @@ -0,0 +1,402 @@ +GraphQL 用例:使用 Golang 和 PostgreSQL 构建一个博客引擎 API +============================================================ + +### 摘要 + +GraphQL 在生产环境中似乎难以使用:虽然对于建模功能来说图接口非常灵活,但是并不适用于关系型存储,不管是在实现还是性能方面。 + +在这篇博客中,我们会设计并实现一个简单的博客引擎 API,它支持以下功能: + +* 三种类型的资源(用户、博文以及评论)支持多种功能(创建用户、创建博文、给博文添加评论、关注其它用户的博文和评论,等等。) +* 使用 PostgreSQL 作为后端数据存储(选择它因为它是一个流行的关系型数据库)。 +* 使用 Golang(开发 API 的一个流行语言)进行 API 实现。 + +我们会比较简单的 GraphQL 实现和纯 REST 替代方案,在一种普通场景(呈现博客文章页面)下对比它们的实现复杂性和效率。 + +### 介绍 + +GraphQL 是一种 IDL(Interface Definition Language,接口定义语言),设计者定义数据类型和并把数据建模为一个图。每个顶点都是一种数据类型的一个实例,边代表了节点之间的关系。这种方式非常灵活,能适应任何业务领域。然而,问题是设计过程更加复杂,而且传统的数据存储不能很好地映射到图模型。阅读_附录1_了解更多关于这个问题的详细信息。 + +GraphQL 在 2014 年由 Facebook 的工程师团队首次提出。尽管它的优点和功能非常有趣而且引人注目,它并没有得到大规模应用。开发者需要权衡 REST 的设计简单性、熟悉性、丰富的工具和 GraphQL 不会受限于 CRUD(LCTT 译注:Create、Read、Update、Delete) 以及网络性能(它优化了往返服务器的网络)的灵活性。 + +大部分关于 GraphQL 的教程和指南都跳过了从数据存储获取数据以便解决查询的问题。也就是,如何使用通用目的、流行存储方案(例如关系型数据库)为 GraphQL API 设计一个支持高效数据提取的数据库。 + +这篇博客介绍构建一个博客引擎 GraphQL API 的流程。它的功能相当复杂。为了和基于 REST 的方法进行比较,它的范围被限制为一个熟悉的业务领域。 + +这篇博客的文章结构如下: + +* 第一部分我们会设计一个 GraphQL 模式并介绍所使用语言的一些功能。 +* 第二部分是 PostgreSQL 数据库的设计。 +* 第三部分介绍了使用 Golang 实现第一部分设计的 GraphQL 模式。 +* 第四部分我们以从后端获取所需数据的角度来比较呈现博客文章页面的任务。 + +### 相关阅读 + +* 很棒的 [GraphQL 介绍文档][1]。 +* 该项目的完整实现代码在 [github.com/topliceanu/graphql-go-example][2]。 + +### 在 GraphQL 中建模一个博客引擎 + +_列表1_包括了博客引擎 API 的全部模式。它显示了组成图的顶点的数据类型。顶点之间的关系,也就是边,被建模为指定类型的属性。 + +``` +type User { + id: ID + email: String! + post(id: ID!): Post + posts: [Post!]! + follower(id: ID!): User + followers: [User!]! + followee(id: ID!): User + followees: [User!]! +} + +type Post { + id: ID + user: User! + title: String! + body: String! + comment(id: ID!): Comment + comments: [Comment!]! +} + +type Comment { + id: ID + user: User! + post: Post! + title: String + body: String! +} + +type Query { + user(id: ID!): User +} + +type Mutation { + createUser(email: String!): User + removeUser(id: ID!): Boolean + follow(follower: ID!, followee: ID!): Boolean + unfollow(follower: ID!, followee: ID!): Boolean + createPost(user: ID!, title: String!, body: String!): Post + removePost(id: ID!): Boolean + createComment(user: ID!, post: ID!, title: String!, body: String!): Comment + removeComment(id: ID!): Boolean +} +``` + +_列表1_ + +模式使用 GraphQL DSL 编写,它用于定义自定义数据类型,例如 `User`、`Post` 和 `Comment`。该语言也提供了一系列原始数据类型,例如 `String`、`Boolean` 和 `ID`(是`String` 的别名,但是有顶点唯一标识符的额外语义)。 + +`Query` 和 `Mutation` 是语法解析器能识别并用于查询图的可选类型。从 GraphQL API 读取数据等同于遍历图。需要提供这样一个起始顶点;该角色通过 `Query` 类型来实现。在这种情况中,所有图的查询都要从一个由 id `user(id:ID!)` 指定的用户开始。对于写数据,定义了 `Mutation` 顶点。它提供了一系列操作,建模为能遍历(并返回)新创建顶点类型的参数化属性。_列表2_是这些查询的一些例子。 + +顶点属性能被参数化,也就是能接受参数。在图遍历场景中,如果一个博文顶点有多个评论顶点,你可以通过指定 `comment(id: ID)` 只遍历其中的一个。所有这些都取决于设计,设计者可以选择不提供到每个独立顶点的直接路径。 + +`!` 字符是一个类型后缀,适用于原始类型和用户定义类型,它有两种语义: + +* 当被用于参数化属性的参数类型时,表示这个参数是必须的。 +* 当被用于一个属性的返回类型时,表示当顶点被获取时该属性不会为空。 +* 也可以把它们组合起来,例如 `[Comment!]!` 表示一个非空 Comment 顶点链表,其中 `[]`、`[Comment]` 是有效的,但 `null, [null], [Comment, null]` 就不是。 + + +_列表2_ 包括一系列用于博客 API 的 _curl_ 命令,它们会使用 mutation 填充图然后查询图以便获取数据。要运行它们,按照 [topliceanu/graphql-go-example][3] 仓库中的指令编译并运行服务。 + +``` +# 创建用户 1、2 和 3 的更改。更改和查询类似,在该情景中我们检索新创建用户的 id 和 email。 +curl -XPOST http://vm:8080/graphql -d 'mutation {createUser(email:"user1@x.co"){id, email}}' +curl -XPOST http://vm:8080/graphql -d 'mutation {createUser(email:"user2@x.co"){id, email}}' +curl -XPOST http://vm:8080/graphql -d 'mutation {createUser(email:"user3@x.co"){id, email}}' +# 为用户添加博文的更改。为了和模式匹配我们需要检索他们的 id,否则会出现错误。 +curl -XPOST http://vm:8080/graphql -d 'mutation {createPost(user:1,title:"post1",body:"body1"){id}}' +curl -XPOST http://vm:8080/graphql -d 'mutation {createPost(user:1,title:"post2",body:"body2"){id}}' +curl -XPOST http://vm:8080/graphql -d 'mutation {createPost(user:2,title:"post3",body:"body3"){id}}' +# 博文所有评论的更改。`createComment` 需要用户 id,标题和正文。看列表 1 的模式。 +curl -XPOST http://vm:8080/graphql -d 'mutation {createComment(user:2,post:1,title:"comment1",body:"comment1"){id}}' +curl -XPOST http://vm:8080/graphql -d 'mutation {createComment(user:1,post:3,title:"comment2",body:"comment2"){id}}' +curl -XPOST http://vm:8080/graphql -d 'mutation {createComment(user:3,post:3,title:"comment3",body:"comment3"){id}}' +# 让用户 3 关注用户 1 和用户 2 的更改。注意 `follow` 更改只返回一个布尔值而不需要指定。 +curl -XPOST http://vm:8080/graphql -d 'mutation {follow(follower:3, followee:1)}' +curl -XPOST http://vm:8080/graphql -d 'mutation {follow(follower:3, followee:2)}' + +# 用户获取用户 1 所有数据的查询。 +curl -XPOST http://vm:8080/graphql -d '{user(id:1)}' +# 用户获取用户 2 和用户 1 的关注者的查询。 +curl -XPOST http://vm:8080/graphql -d '{user(id:2){followers{id, email}}}' +curl -XPOST http://vm:8080/graphql -d '{user(id:1){followers{id, email}}}' +# 检测用户 2 是否被用户 1 关注的查询。如果是,检索用户 1 的 email,否则返回空。 +curl -XPOST http://vm:8080/graphql -d '{user(id:2){follower(id:1){email}}}' +# 返回用户 3 关注的所有用户 id 和 email 的查询。 +curl -XPOST http://vm:8080/graphql -d '{user(id:3){followees{id, email}}}' +# 如果用户 3 被用户 1 关注,就获取用户 3 email 的查询。 +curl -XPOST http://vm:8080/graphql -d '{user(id:1){followee(id:3){email}}}' +# 获取用户 1 的第二篇博文的查询,检索它的标题和正文。如果博文 2 不是由用户 1 创建的,就会返回空。 +curl -XPOST http://vm:8080/graphql -d '{user(id:1){post(id:2){title,body}}}' +# 获取用户 1 的所有博文的所有数据的查询。 +curl -XPOST http://vm:8080/graphql -d '{user(id:1){posts{id,title,body}}}' +# 获取写博文 2 用户的查询,如果博文 2 是由 用户 1 撰写;一个现实语言灵活性的例证。 +curl -XPOST http://vm:8080/graphql -d '{user(id:1){post(id:2){user{id,email}}}}' +``` + +_列表2_ + +通过仔细设计 mutation 和类型属性,可以实现强大而富有表达力的查询。 + +### 设计 PostgreSQL 数据库 + +关系型数据库的设计,一如以往,由避免数据冗余的需求驱动。选择该方式有两个原因:1\. 表明实现 GraphQL API 不需要定制化的数据库技术或者学习和使用新的设计技巧。2\. 表明 GraphQL API 能在现有的数据库之上创建,更具体地说,最初设计用于 REST 后端甚至传统的呈现 HTML 站点的服务器端数据库。 + +阅读 _附录1_ 了解关于关系型和图数据库在构建 GraphQL API 方面的区别。_列表3_ 显示了用于创建新数据库的 SQL 命令。数据库模式和 GraphQL 模式相对应。为了支持 `follow/unfollow` 更改,需要添加 `followers` 关系。 + +``` +CREATE TABLE IF NOT EXISTS users ( + id SERIAL PRIMARY KEY, + email VARCHAR(100) NOT NULL +); +CREATE TABLE IF NOT EXISTS posts ( + id SERIAL PRIMARY KEY, + user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + title VARCHAR(200) NOT NULL, + body TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS comments ( + id SERIAL PRIMARY KEY, + user_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + post_id INTEGER NOT NULL REFERENCES posts(id) ON DELETE CASCADE, + title VARCHAR(200) NOT NULL, + body TEXT NOT NULL +); +CREATE TABLE IF NOT EXISTS followers ( + follower_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + followee_id INTEGER NOT NULL REFERENCES users(id) ON DELETE CASCADE, + PRIMARY KEY(follower_id, followee_id) +); +``` + +_列表3_ + +### Golang API 实现 + +本项目使用的用 Go 实现的 GraphQL 语法解析器是 `github.com/graphql-go/graphql`。它包括一个查询解析器,但不包括模式解析器。这要求开发者利用库提供的结构使用 Go 构建 GraphQL 模式。这和 [nodejs 实现][3] 不同,后者提供了一个模式解析器并为数据获取暴露了钩子。因此 `列表1` 中的模式只是作为指导使用,需要转化为 Golang 代码。然而,这个_“限制”_提供了与抽象级别对等的机会,并且了解模式如何和用于检索数据的图遍历模型相关。_列表4_ 显示了 `Comment` 顶点类型的实现: + +``` +var CommentType = graphql.NewObject(graphql.ObjectConfig{ + Name: "Comment", + Fields: graphql.Fields{ + "id": &graphql.Field{ + Type: graphql.NewNonNull(graphql.ID), + Resolve: func(p graphql.ResolveParams) (interface{}, error) { + if comment, ok := p.Source.(*Comment); ok == true { + return comment.ID, nil + } + return nil, nil + }, + }, + "title": &graphql.Field{ + Type: graphql.NewNonNull(graphql.String), + Resolve: func(p graphql.ResolveParams) (interface{}, error) { + if comment, ok := p.Source.(*Comment); ok == true { + return comment.Title, nil + } + return nil, nil + }, + }, + "body": &graphql.Field{ + Type: graphql.NewNonNull(graphql.ID), + Resolve: func(p graphql.ResolveParams) (interface{}, error) { + if comment, ok := p.Source.(*Comment); ok == true { + return comment.Body, nil + } + return nil, nil + }, + }, + }, +}) +func init() { + CommentType.AddFieldConfig("user", &graphql.Field{ + Type: UserType, + Resolve: func(p graphql.ResolveParams) (interface{}, error) { + if comment, ok := p.Source.(*Comment); ok == true { + return GetUserByID(comment.UserID) + } + return nil, nil + }, + }) + CommentType.AddFieldConfig("post", &graphql.Field{ + Type: PostType, + Args: graphql.FieldConfigArgument{ + "id": &graphql.ArgumentConfig{ + Description: "Post ID", + Type: graphql.NewNonNull(graphql.ID), + }, + }, + Resolve: func(p graphql.ResolveParams) (interface{}, error) { + i := p.Args["id"].(string) + id, err := strconv.Atoi(i) + if err != nil { + return nil, err + } + return GetPostByID(id) + }, + }) +} +``` + +_列表4_ + +正如 _列表1_ 中的模式,`Comment` 类型是静态定义的一个有三个属性的结构体:`id`、`title` 和 `body`。为了避免循环依赖,动态定义了 `user` 和 `post` 两个其它属性。 + +Go 并不适用于这种动态建模,它只支持一些类型检查,代码中大部分变量都是 `interface{}` 类型,在使用之前都需要进行类型断言。`CommentType` 是一个 `graphql.Object` 类型的变量,它的属性是 `graphql.Field` 类型。因此,GraphQL DSL 和 Go 中使用的数据结构并没有直接的转换。 + +每个字段的 `resolve` 函数暴露了 `Source` 参数,它是表示遍历时前一个节点的数据类型顶点。`Comment` 的所有属性都有作为 source 的当前 `CommentType` 顶点。检索`id`、`title` 和 `body` 是一个直接属性访问,而检索 `user` 和 `post` 要求图遍历,也需要数据库查询。由于它们非常简单,这篇文章并没有介绍这些 SQL 查询,但在_参考文献_部分列出的 github 仓库中有。 + +### 普通场景下和 REST 的对比 + +在这一部分,我们会展示一个普通的博客文章呈现场景,并比较 REST 和 GraphQL 的实现。关注重点会放在入站/出站请求数量,因为这些是造成页面呈现延迟的最主要原因。 + +场景:呈现一个博客文章页面。它应该包含关于作者(email)、博客文章(标题、正文)、所有评论(标题、正文)以及评论人是否关注博客文章作者的信息。_图1_ 和 _图2_ 显示了客户端 SPA、API 服务器以及数据库之间的交互,一个是 REST API、另一个对应是 GraphQL API。 + +``` ++------+ +------+ +--------+ +|client| |server| |database| ++--+---+ +--+---+ +----+---+ + | GET /blogs/:id | | +1\. +-------------------------> SELECT * FROM blogs... | + | +---------------------------> + | <---------------------------+ + <-------------------------+ | + | | | + | GET /users/:id | | +2\. +-------------------------> SELECT * FROM users... | + | +---------------------------> + | <---------------------------+ + <-------------------------+ | + | | | + | GET /blogs/:id/comments | | +3\. +-------------------------> SELECT * FROM comments... | + | +---------------------------> + | <---------------------------+ + <-------------------------+ | + | | | + | GET /users/:id/followers| | +4\. +-------------------------> SELECT * FROM followers.. | + | +---------------------------> + | <---------------------------+ + <-------------------------+ | + | | | + + + + +``` + +_图1_ + +``` ++------+ +------+ +--------+ +|client| |server| |database| ++--+---+ +--+---+ +----+---+ + | GET /graphql | | +1\. +-------------------------> SELECT * FROM blogs... | + | +---------------------------> + | <---------------------------+ + | | | + | | | + | | | +2\. | | SELECT * FROM users... | + | +---------------------------> + | <---------------------------+ + | | | + | | | + | | | +3\. | | SELECT * FROM comments... | + | +---------------------------> + | <---------------------------+ + | | | + | | | + | | | +4\. | | SELECT * FROM followers.. | + | +---------------------------> + | <---------------------------+ + <-------------------------+ | + | | | + + + + +``` + +_图2_ + +_列表5_ 是一条用于获取所有呈现博文所需数据的简单 GraphQL 查询。 + +``` +{ + user(id: 1) { + email + followers + post(id: 1) { + title + body + comments { + id + title + user { + id + email + } + } + } + } +} +``` + +_列表5_ + +对于这种情况,对数据库的查询次数是故意相同的,但是到 API 服务器的 HTTP 请求已经减少到只有一个。我们认为在这种类型的应用程序中通过互联网的 HTTP 请求是最昂贵的。 + +为了获取 GraphQL 的优势,后端并不需要进行特别设计,从 REST 到 GraphQL 的转换可以逐步完成。这使得可以测量性能提升和优化。从这一点,API 设计者可以开始优化(潜在的合并) SQL 查询从而提高性能。缓存的机会在数据库和 API 级别都大大增加。 + +SQL 之上的抽象(例如 ORM 层)通常会和 `n+1` 问题想抵触。在 REST 事例的步骤 4 中,客户端可能不得不在单独的请求中为每个评论的作者请求关注状态。这是因为在 REST 中没有标准的方式来表达两个以上资源之间的关系,而 GraphQL 旨在通过使用嵌套查询来防止这类问题。这里我们通过获取用户的所有关注者进行欺骗。我们向客户推荐确定评论和关注作者用户的逻辑。 + +另一个区别是获取比客户端所需更多的数据,以免破坏 REST 资源抽象。这对于用于解析和存储不需要数据的带宽消耗和电池寿命非常重要。 + +### 总结 + +GraphQL 是 REST 的一个可用替代方案,因为: + +* 尽管设计 API 更加困难,该过程可以逐步完成。也是由于这个原因,从 REST 转换到 GraphQL 非常容易,两个流程可以没有任何问题地共存。 +* 在网络请求方面更加高效,即使是类似本博客中的简单实现。它还提供了更多查询优化和结果缓存的机会。 +* 在用于解析结果的带宽消耗和 CPU 周期方面它更加高效,因为它只返回呈现页面所需的数据。 + +REST 仍然非常有用,如果: + +* 你的 API 非常简单,只有少量的资源或者资源之间关系简单。 +* 在你的组织中已经在使用 REST API,而且你已经配置好了所有工具,或者你的客户希望获取 REST API。 +* 你有复杂的 ACL(LCTT 译注:Access Control List) 策略。在博客例子中,可能的功能是允许用户良好地控制谁能查看他们的电子邮箱、博客、特定博客的评论、他们关注了谁,等等。优化数据获取同时检查复杂的业务规则可能会更加困难。 + +### 附录1:图数据库和高效数据存储 + +尽管将应用领域数据想象为一个图非常直观,正如这篇博文介绍的那样,但是支持这种接口的高效数据存储问题仍然没有解决。 + +近年来图数据库变得越来越流行。通过将 GraphQL 查询转换为特定的图数据库查询语言从而延迟解决请求的复杂性似乎是一种可行的方案。 + +问题是和关系型数据库相比图并不是一种高效的数据结构。图中一个顶点可能有到任何其它顶点的连接,访问模式比较难以预测因此提供了较少的优化机会。 + +例如缓存的问题,为了快速访问需要将哪些顶点保存在内存中?通用缓存算法在图遍历场景中可能没那么高效。 + +数据库分片问题:把数据库切分为更小、没有交叉的数据库并保存到独立的硬件。在学术上,最小切割的图划分问题已经得到了很好的理解,但可能是次优的而且由于病态的最坏情况可能导致高度不平衡切割。 + +在关系型数据库中,数据被建模为记录(行或者元组)和列,表和数据库名称都只是简单的命名空间。大部分数据库都是面向行的,意味着每个记录都是一个连续的内存块,一个表中的所有记录在磁盘上一个接一个地整齐地打包(通常按照某个关键列排序)。这非常高效,因为这是物理存储最优的工作方式。HDD 最昂贵的操作是将磁头移动到磁盘上的另一个扇区,因此最小化此类访问非常重要。 + +很有可能如果应用程序对一条特定记录感兴趣,它需要获取整条记录,而不仅仅是记录中的其中一列。也很有可能如果应用程序对一条记录感兴趣,它也会对该记录周围的记录感兴趣,例如全表扫描。这两点使得关系型数据库相当高效。然而,也是因为这个原因,关系型数据库的最差使用场景就是总是随机访问所有数据。图数据库正是如此。 + +随着支持更快随机访问的 SSD 驱动器的出现,更便宜的内存使得缓存大部分图数据库成为可能,更好的优化图缓存和分区的技术,图数据库开始成为可选的存储解决方案。大部分大公司也使用它:Facebook 有 Social Graph,Google 有 Knowledge Graph。 + +-------------------------------------------------------------------------------- + +via: http://alexandrutopliceanu.ro/post/graphql-with-go-and-postgresql + +作者:[Alexandru Topliceanu][a] +译者:[ictlyh](https://github.com/ictlyh) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://github.com/topliceanu +[1]:http://graphql.org/learn/ +[2]:https://github.com/topliceanu/graphql-go-example +[3]:https://github.com/graphql/graphql-js From ab98241e06e835fe227944db04126eb8d76a47a0 Mon Sep 17 00:00:00 2001 From: ictlyh Date: Fri, 12 May 2017 15:36:09 +0800 Subject: [PATCH 0053/1407] Translating tech/20170308 Our guide to a Golang logs world.md --- sources/tech/20170308 Our guide to a Golang logs world.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170308 Our guide to a Golang logs world.md b/sources/tech/20170308 Our guide to a Golang logs world.md index 357f61de78..0eeb06089a 100644 --- a/sources/tech/20170308 Our guide to a Golang logs world.md +++ b/sources/tech/20170308 Our guide to a Golang logs world.md @@ -1,3 +1,4 @@ +ictlyh translating Our guide to a Golang logs world ============================================================ From 9c1c257c25c30486ea5d37b615544e08eefe07df Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 12 May 2017 19:51:14 +0800 Subject: [PATCH 0054/1407] PRF:20170317 How to Build Your Own Media Center with OpenELEC.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @svtter 还可以更细心些~ --- ...ild Your Own Media Center with OpenELEC.md | 78 +++++++++---------- 1 file changed, 39 insertions(+), 39 deletions(-) diff --git a/translated/tech/20170317 How to Build Your Own Media Center with OpenELEC.md b/translated/tech/20170317 How to Build Your Own Media Center with OpenELEC.md index 7196c70c7c..3b8732bb18 100644 --- a/translated/tech/20170317 How to Build Your Own Media Center with OpenELEC.md +++ b/translated/tech/20170317 How to Build Your Own Media Center with OpenELEC.md @@ -1,18 +1,19 @@ -# 如何通过OpenELEC创建你自己的媒体中心 +如何通过 OpenELEC 创建你自己的媒体中心 +====== ![](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-media-center.jpg "How to Build Your Own Media Center with OpenELECs") -你是否曾经想要创建你自己的家庭影院系统?如果是的话,这里有一个为你准备的指南!在本篇文章中,我们将会介绍如何设置一个由OpenELEC以及Kodi驱动的家庭娱乐系统。我们将会介绍如何合适的安装,哪些设备可以运行软件,如何安装它,以及其他一切需要知道的事情。 +你是否曾经想要创建你自己的家庭影院系统?如果是的话,这里有一个为你准备的指南!在本篇文章中,我们将会介绍如何设置一个由 OpenELEC 以及 Kodi 驱动的家庭娱乐系统。我们将会介绍如何制作安装介质,哪些设备可以运行该软件,如何安装它,以及其他一切需要知道的事情等等。 ### 选择一个设备 -在开始设定媒体中心的软件前,你需要选择一个设备。OpenELEC支持一系列设备。从一般的桌面设备到树莓派2/3等等。选择好设备以后,考虑一下你怎么访问OpenELEC系统中的媒体,以及准备好使用 +在开始设定媒体中心的软件前,你需要选择一个设备。OpenELEC 支持一系列设备。从一般的桌面设备到树莓派 2/3 等等。选择好设备以后,考虑一下你怎么访问 OpenELEC 系统中的媒体并让其就绪。 -**注意: **OpenELEC基于Okdi,有许多方式加载一个可以运行的媒体(像是Samba网络分享,额外的设备,等等)。 +**注意: **OpenELEC 基于 Kodi,有许多方式加载一个可播放的媒体(比如 Samba 网络分享,外设,等等)。 ### 制作安装磁盘 -OpenELEC安装磁盘需要一个USB存储器,且其至少1GB的容量。这是安装软件的唯一方式,因为开发者没有发布ISO文件。取而代之的是一个需要被创建的IMG原始文件。选择与你设备相关的链接并且[下载][10]原始的磁盘镜像。当磁盘镜像下载完毕,打开一个终端,并且使用命令将数据从压缩包中解压出来。 +OpenELEC 安装磁盘需要一个 USB 存储器,且其至少有 1GB 的容量。这是安装该软件的唯一方式,因为开发者没有发布 ISO 文件。取而代之的是需要创建一个 IMG 原始文件。选择与你设备相关的链接并且[下载][10]原始磁盘镜像。当磁盘镜像下载完毕,打开一个终端,并且使用命令将数据从压缩包中解压出来。 **在Linux/macOS上** @@ -23,80 +24,79 @@ gunzip -d OpenELEC*.img.gz **在Windows上** -下载[7zip][11],安装它,然后解压压缩文件。 +下载 [7zip][11],安装它,然后解压压缩文件。 -当原始的 .IMG 文件被解压后,下载[Etcher USB creation tool][12],并且依据在界面上的指南来安装它,以及创建USB磁盘。 +当原始的 .IMG 文件被解压后,下载 [Etcher USB creation tool][12],并且依据在界面上的指示来安装它并创建 USB 磁盘。 -**注意:** 对于树莓派用户, Etcher也支持将文件写入到SD卡中。 +**注意:** 对于树莓派用户,Etcher 也支持将文件写入到 SD 卡中。 -### 安装OpenElEC +### 安装 OpenELEC -OpenELEC安装进程可能是安装流程中最简单的操作系统之一了。将USB设备加入,然后配置设备使其以USB方式启动作为开始。同样,这个过程也可以通过按DEL或者F2来替代。然而并不是所有的BIOS都是一样的, 所以最好的方式就是看看手册什么的。 +OpenELEC 安装进程可能是安装流程最简单的操作系统之一了。将 USB 设备加入,然后配置设备使其以 USB 方式启动。同样,这个过程也可以通过按 DEL 或者 F2 来替代。然而并不是所有的 BIOS 都是一样的,所以最好的方式就是看看手册什么的。 - ![openelec-installer-selection](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-installer-selection.png "openelec-installer-selection") +![openelec-installer-selection](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-installer-selection.png "openelec-installer-selection") -一旦进入BIOS,修改设置使其从USB磁盘中直接加载。这将会允许电脑从USB磁盘中启动,这将会使你从Syslinux boot屏幕中启动。在提示中,进入”installer“,然后按下Enter按键。 +一旦进入 BIOS,修改设置使其从 USB 磁盘中直接加载。这将会允许电脑从 USB 磁盘中启动,这将会使你进入到 Syslinux 引导屏幕。在提示符中,键入 `installer`,然后按下回车键。 - ![openelec-installation-selection-menu](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-installation-selection-menu.png "openelec-installation-selection-menu") +![openelec-installation-selection-menu](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-installation-selection-menu.png "openelec-installation-selection-menu") -通常,快速安装选项是被选中的。按Enter来开始安装。这将会使安装器跳转到磁盘选择界面。选择硬盘——那个OpenELEC应该被安装的地方,然后按下Enter按键来开始安装过程。 +默认情况下,快速安装选项已经是选中的。按回车键来开始安装。这将会使安装器跳转到磁盘选择界面。选择 OpenELEC 要被安装到的地方,然后按下回车键来开始安装过程。 - ![openelec-installation-in-progress](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-installation-in-progress.png "openelec-installation-in-progress") +![openelec-installation-in-progress](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-installation-in-progress.png "openelec-installation-in-progress") -一旦完成安装,重启系统,并且加载OpenELEC。 +一旦完成安装,重启系统并加载 OpenELEC。 ### 配置 OpenELEC - ![openelec-wireless-network-setup](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-wireless-network-setup.jpg "openelec-wireless-network-setup") +![openelec-wireless-network-setup](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-wireless-network-setup.jpg "openelec-wireless-network-setup") -在第一次启动时,用户必须配置一些东西。如果你的媒体中心拥有一个无线网卡,OpenELEC将会提示用户将其连接到一个热点上。选择一个列表中的网络并且输入密码。 +在第一次启动时,用户必须配置一些东西。如果你的媒体中心拥有一个无线网卡,OpenELEC 将会提示用户将其连接到一个热点上。选择一个列表中的网络并且输入密码。 - ![openelec-sharing-setup](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-sharing-setup.jpg "openelec-sharing-setup") +![openelec-sharing-setup](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-sharing-setup.jpg "openelec-sharing-setup") -在下一步”欢迎来到OpenELEC“屏上,用户必须配置不同的分享设置(SSH以及Samba)。它将会建议你把这些设置开启,因为拥有命令行权限,这将会使得远程传输媒体文件变得很简单。 +在下一步“欢迎来到 OpenELECWelcome to OpenELEC”屏上,用户必须配置不同的分享设置(SSH 以及 Samba)。建议你把这些设置开启,因为可以用命令行访问,这将会使得远程传输媒体文件变得很简单。 -## 增加媒体 +### 增加媒体 -在OpenELEC(Kodi)中增加媒体,首先选择你希望添加的媒体的部分。为照片音乐等添加媒体,是同一个过程。在这个指南中,我们将着重讲解添加视频。 +在 OpenELEC(Kodi)中增加媒体,首先选择你希望添加的媒体到的部分。以同样的流程,为照片、音乐等添加媒体。在这个指南中,我们将着重讲解添加视频。 - ![openelec-add-files-to-kodi](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-add-files-to-kodi.jpg "openelec-add-files-to-kodi") +![openelec-add-files-to-kodi](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-add-files-to-kodi.jpg "openelec-add-files-to-kodi") -点击在主页的”视频“选项来进入视频页面。选择”文件“选项,在下一个页面点击“添加视频...",这将会使得用户进入Kodi的添加媒体页面。在这个页面,你可以随意的添加媒体源了(包括内部和外部的)。 +点击在主页的“视频Video”选项来进入视频页面。选择“文件Files”选项,在下一个页面点击“添加视频...Add videos…”,这将会使得用户进入Kodi 的添加媒体页面。在这个页面,你可以随意的添加媒体源了(包括内部和外部的)。 - ![openelec-add-media-source-kodi](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-add-media-source-kodi.jpg "openelec-add-media-source-kodi") +![openelec-add-media-source-kodi](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-add-media-source-kodi.jpg "openelec-add-media-source-kodi") -OpenELEC自动挂载外部的设备(像是USB,DVD信息碟片,等等),并且他可以被添加到浏览文件挂载点。一般情况下,这些设备都会被放在”/run“下,或者,返回你点击”添加视频..."的页面,在那里选择设备。任何外部设备,包括 DVD/CD,将会直接展示那些可以展示的部分。这是一个很好的选择——对于那些不懂如何找到挂载点的用户。 +OpenELEC 会自动挂载外部的设备(像是 USB,DVD 碟片,等等),并且它可以通过浏览文件挂载点来挂载。一般情况下,这些设备都会被放在“/run”下,或者,返回你点击“添加视频...Add videos…”的页面,在那里选择设备。任何外部设备,包括 DVD/CD,将会直接展示在那里,并可以直接访问。这是一个很好的选择——对于那些不懂如何找到挂载点的用户。 - ![openelec-name-video-source-folder](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-name-video-source-folder.jpg "openelec-name-video-source-folder") +![openelec-name-video-source-folder](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-name-video-source-folder.jpg "openelec-name-video-source-folder") -现在这个设备在Kodi中被选中了,界面将会询问用户去浏览设备上私人文件夹,里面有私人文件——这一切都是在媒体中心文件浏览器工具下执行的。一旦有文件的文件夹被找到阿勒,添加它,给予文件夹一个名字,然后按下OK按钮来保存它。 +现在这个设备在 Kodi 中被选中了,界面将会询问用户去浏览设备上私人文件夹,里面有私人文件——这一切都是在媒体中心文件浏览器工具下执行的。一旦找到了放置文件的文件夹,添加它,给予文件夹一个名字,然后按下 OK 按钮来保存它。 - ![openelec-show-added-media-kodi](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-show-added-media-kodi.jpg "openelec-show-added-media-kodi") +![openelec-show-added-media-kodi](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-show-added-media-kodi.jpg "openelec-show-added-media-kodi") -当一个用户浏览“视频”,他们将会看到可以点击的文件夹,这个文件夹中带有从外部设备添加的媒体。这些文件夹可以在系统上很简单的播放。 +当一个用户浏览“视频Videos”,他们将会看到可以点击的文件夹,这个文件夹中带有从外部设备添加的媒体。这些文件夹可以很容易地在系统上播放。 ### 使用 OpenELec -当用户登录他们将会看见一个“主界面”,这个主界面有许多部分,用户可以点击他们并且进入,包括:图片,视频,音乐,程序等等。当悬停在这些部分的时候,子部分就会出现。例如,当悬停在“图片”上时,子部分”文件“以及”插件”就会出现。 +当用户登录他们将会看见一个“主界面”,这个主界面有许多部分,用户可以点击它们并且进入,包括:图片,视频,音乐,程序等等。当悬停在这些部分的时候,子部分就会出现。例如,当悬停在“图片”上时,子部分”文件“以及”插件”就会出现。 - ![openelec-navigation-bar](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-navigation-bar.jpg "openelec-navigation-bar") +![openelec-navigation-bar](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-navigation-bar.jpg "openelec-navigation-bar") -Additionally, clicking the files subsection of any section (e.g. Videos) takes the user directly to any available files in that section. 如果一个用户点击了一个部分中的子部分,例如“插件”,Kodi 插件选择就会出现。这个安装器将会允许用户浏览新的插件内容,来安装到这个子部分(像是图片关联插件,等等)或者启动一个已经存在的图片关联插件,当然,这个插件应该已经安装到系统上了。 -此外,点击任何部分的文件子部分(例如 视频)将会直接带领用户到任何可用的文件的那个部分。 +此外,点击任何部分的文件子部分(例如视频)将会直接给显示用户该部分可用的文件。 ### 系统设置 - ![openelec-system-settings](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-system-settings.jpg "openelec-system-settings") +![openelec-system-settings](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2017/03/openelec-system-settings.jpg "openelec-system-settings") -Kodi有许多扩展设置区域。为了获得这些设置,使鼠标在右方悬停,目录选择器将会滚动右方并且显示”系统“。点他来打开全局系统设定区。 +Kodi 有丰富的设置区域。为了找到这些设置,使鼠标在右方悬停,目录选择器将会滚动右方并且显示”系统System“。点击来打开全局系统设定区。 -任何设置都可以被用户修改,安装插件从Kodi仓库到激活额外的服务,到改变他们,甚至天气。如果想要退出设定区域并且返回主页面,点击右下方角落中的”home“图标。 +用户可以修改任何设置,从安装 Kodi 仓库的插件,到激活各种服务,到改变主题,甚至天气。如果想要退出设定区域并且返回主页面,点击右下方角落中的“home”图标。 ### 结论 -通过OpenELEC的安装和配置,你现在可以随意离开或者使用你自己的Linux支持的家庭影院系统。在所有的家庭影院系统Linux发行版中,这个是最用户有好的。请记住,尽管这个系统是以”OpenELEC“来被熟知的,它运行着Kodi以及它适应任何Kodi的插件,工具以及程序。 +通过 OpenELEC 的安装和配置,你现在可以随意体验使用你自己的 Linux 支持的家庭影院系统。在所有的家庭影院系统 Linux 发行版中,这个是最用户友好的。请记住,尽管这个系统是以“OpenELEC”为名,但它运行着的是 Kodi ,并兼容任何 Kodi 的插件,工具以及程序。 ------ @@ -104,7 +104,7 @@ via: https://www.maketecheasier.com/build-media-center-with-openelec/ 作者:[Derrik Diener][a] 译者:[svtter](https://github.com/svtter) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From c1c1c86bce96f9d7e1620a80611018c0c01e6d5a Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 12 May 2017 19:51:30 +0800 Subject: [PATCH 0055/1407] PUB:20170317 How to Build Your Own Media Center with OpenELEC.md @svtter --- .../20170317 How to Build Your Own Media Center with OpenELEC.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170317 How to Build Your Own Media Center with OpenELEC.md (100%) diff --git a/translated/tech/20170317 How to Build Your Own Media Center with OpenELEC.md b/published/20170317 How to Build Your Own Media Center with OpenELEC.md similarity index 100% rename from translated/tech/20170317 How to Build Your Own Media Center with OpenELEC.md rename to published/20170317 How to Build Your Own Media Center with OpenELEC.md From 1236ac72712bd2f44f84174b9d6ab392295930d2 Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 12 May 2017 20:06:42 +0800 Subject: [PATCH 0056/1407] PUB:20170207 5 Open Source Software Defined Networking Projects to Know.md @geekpi @jasminepeng --- ...are Defined Networking Projects to Know.md | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) rename {translated/tech => published}/20170207 5 Open Source Software Defined Networking Projects to Know.md (69%) diff --git a/translated/tech/20170207 5 Open Source Software Defined Networking Projects to Know.md b/published/20170207 5 Open Source Software Defined Networking Projects to Know.md similarity index 69% rename from translated/tech/20170207 5 Open Source Software Defined Networking Projects to Know.md rename to published/20170207 5 Open Source Software Defined Networking Projects to Know.md index f0ccff46ef..7b8f7e8563 100644 --- a/translated/tech/20170207 5 Open Source Software Defined Networking Projects to Know.md +++ b/published/20170207 5 Open Source Software Defined Networking Projects to Know.md @@ -1,17 +1,17 @@ -5 个要了解的开源软件定义网络项目 +5 个需要知道的开源的软件定义网络(SDN)项目 ============================================================ ![SDN](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/software-defined-networking_0.jpg?itok=FeWzZo8n "SDN") -SDN 开始重新定义企业网络。这里有五个应该知道的开源项目。 -                                       [Creative Commons Zero][1] Pixabay +> SDN 开始重新定义企业网络。这里有五个应该知道的开源项目。 + 纵观整个 2016 年,软件定义网络(SDN)持续快速发展并变得成熟。我们现在已经超出了开源网络的概念阶段,两年前评估这些项目潜力的公司已经开始了企业部署。如几年来所预测的,SDN 正在开始重新定义企业网络。 这与市场研究人员的观点基本上是一致的。IDC 在今年早些时候公布了 SDN 市场的[一份研究][3],它预计从 2014 年到 2020 年 SDN 的年均复合增长率为 53.9%,届时市场价值将达到 125 亿美元。此外,“2016 技术趋势Technology Trends 2016” 报告中将 SDN 列为 2016 年最佳技术投资。 -IDC 网络基础设施副总裁,[Rohit Mehra][4] 说:“云计算和第三方平台推动了 SDN 的需求,这将在 2020 年代表一个价值超过 125 亿美元的市场。毫无疑问的是 SDN 的价值将越来越多地渗透到网络虚拟化软件和 SDN 应用中,包括虚拟化网络和安全服务,大型企业在数据中心实现 SDN 的价值,但它们最终会认识到其在分支机构和校园网络中的广泛应用。“ +IDC 网络基础设施副总裁,[Rohit Mehra][4] 说:“云计算和第三方平台推动了 SDN 的需求,这预示着 2020 年的一个价值超过 125 亿美元的市场。毫无疑问的是 SDN 的价值将越来越多地渗透到网络虚拟化软件和 SDN 应用中,包括虚拟化网络和安全服务。大型企业现在正在数据中心体现 SDN 的价值,但它们最终会认识到其在分支机构和校园网络中的广泛应用。“ Linux 基金会最近[发布][5]了其 2016 年度报告[“开放云指南:当前趋势和开源项目”][6]。其中第三份年度报告全面介绍了开放云计算的状态,并包含关于 unikernel 的部分。你现在可以[下载报告][7]了,首先要注意的是汇总和分析研究,说明了容器、unikernel 等的趋势是如何重塑云计算的。该报告提供了对当今开放云环境中心的分类项目的描述和链接。 @@ -19,27 +19,37 @@ Linux 基金会最近[发布][5]了其 2016 年度报告[“开放云指南: ### 软件定义网络 -[ONOS][8] +#### [ONOS][8] -开放网络操作系统Open Network Operating System (ONOS)是一个 Linux 基金会项目,它是一个给服务提供商的软件定义网络操作系统,它具有可扩展性、高可用性、高性能和抽象功能来创建应用程序和服务。[ONOS 的 GitHub 地址][9]。 +开放网络操作系统Open Network Operating System(ONOS)是一个 Linux 基金会项目,它是一个面向服务提供商的软件定义网络操作系统,它具有可扩展性、高可用性、高性能和抽象功能来创建应用程序和服务。 -[OpenContrail][10] +[ONOS 的 GitHub 地址][9]。 -OpenContrail 是 Juniper Networks 的云开源网络虚拟化平台。它提供网络虚拟化的所有必要组件:SDN 控制器、虚拟路由器、分析引擎和已发布的上层 API。其 REST API 配置并收集来自系统的操作和分析数据。[OpenContrail 的 GitHub 地址][11]。 +#### [OpenContrail][10] -[OpenDaylight][12] +OpenContrail 是 Juniper Networks 的云开源网络虚拟化平台。它提供网络虚拟化的所有必要组件:SDN 控制器、虚拟路由器、分析引擎和已发布的上层 API。其 REST API 配置并收集来自系统的操作和分析数据。 -OpenDaylight 是 Linux 基金会的一个 OpenDaylight Foundation 项目,它是一个可编程的、提供给服务提供商和企业的软件定义网络平台。它基于微服务架构,可以在多供应商环境中的一系列硬件上实现网络服务。[OpenDaylight 的 GitHub 地址][13]。 +[OpenContrail 的 GitHub 地址][11]。 -[Open vSwitch][14] +#### [OpenDaylight][12] -Open vSwitch 是一个 Linux 基金会项目,具有生产级别质量的多层虚拟交换机。它通过程序化扩展设计用于大规模网络自动化,同时还支持标准管理接口和协议,包括 NetFlow、sFlow、IPFIX、RSPAN、CLI、LACP 和 802.1ag。它支持类似 VMware 的分布式 vNetwork 或者 Cisco Nexus 1000V 那样跨越多个物理服务器分发。[OVS 在 GitHub 的地址][15]。 +OpenDaylight 是 Linux 基金会旗下的 OpenDaylight 基金会项目,它是一个可编程的、提供给服务提供商和企业的软件定义网络平台。它基于微服务架构,可以在多供应商环境中的一系列硬件上实现网络服务。 -[OPNFV][16] +[OpenDaylight 的 GitHub 地址][13]。 -网络功能虚拟化开放平台Open Platform for Network Functions Virtualization(OPNFV) 是 Linux 基金会项目,它用于企业和服务提供商网络的 NFV 平台。它汇集了计算、存储和网络虚拟化方面的上游组件以创建 NFV 程序的端到端平台。[OPNFV 在 Bitergia 上的地址][17]。 +#### [Open vSwitch][14] -_要了解更多关于开源云计算趋势和查看顶级开源云计算项目完整列表,[请下载 Linux 基金会的 “开放云指南”。][18]_ +Open vSwitch 是一个 Linux 基金会项目,是具有生产级品质的多层虚拟交换机。它通过程序化扩展设计用于大规模网络自动化,同时还支持标准管理接口和协议,包括 NetFlow、sFlow、IPFIX、RSPAN、CLI、LACP 和 802.1ag。它支持类似 VMware 的分布式 vNetwork 或者 Cisco Nexus 1000V 那样跨越多个物理服务器分发。 + +[OVS 在 GitHub 的地址][15]。 + +#### [OPNFV][16] + +网络功能虚拟化开放平台Open Platform for Network Functions Virtualization(OPNFV)是 Linux 基金会项目,它用于企业和服务提供商网络的 NFV 平台。它汇集了计算、存储和网络虚拟化方面的上游组件以创建 NFV 程序的端到端平台。 + +[OPNFV 在 Bitergia 上的地址][17]。 + +_要了解更多关于开源云计算趋势和查看顶级开源云计算项目完整列表,[请下载 Linux 基金会的 “开放云指南”][18]。_ -------------------------------------------------------------------------------- From 16e0492b44cbbc6d6f4a1cbeeaf1b4d38e430134 Mon Sep 17 00:00:00 2001 From: Dongliang Mu Date: Fri, 12 May 2017 23:56:28 -0400 Subject: [PATCH 0057/1407] translating request --- sources/tech/20170422 FEWER MALLOCS IN CURL.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170422 FEWER MALLOCS IN CURL.md b/sources/tech/20170422 FEWER MALLOCS IN CURL.md index e1b65b94f8..87bc8a12ae 100644 --- a/sources/tech/20170422 FEWER MALLOCS IN CURL.md +++ b/sources/tech/20170422 FEWER MALLOCS IN CURL.md @@ -1,3 +1,5 @@ +tranlated by mudongliang + FEWER MALLOCS IN CURL =========================================================== From 69c13ca2dc5439dc15ce6364b7e6dd06bbfd1f27 Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 13 May 2017 14:13:43 +0800 Subject: [PATCH 0058/1407] PRF:20161025 GitLab Workflow An Overview.md @svtter --- .../20161025 GitLab Workflow An Overview.md | 293 +++++++++--------- 1 file changed, 147 insertions(+), 146 deletions(-) diff --git a/translated/tech/20161025 GitLab Workflow An Overview.md b/translated/tech/20161025 GitLab Workflow An Overview.md index b4421ffd6a..d17653f0d2 100644 --- a/translated/tech/20161025 GitLab Workflow An Overview.md +++ b/translated/tech/20161025 GitLab Workflow An Overview.md @@ -9,9 +9,9 @@ GitLab 工作流逻辑符合使用者思维,使得整个平台变得更加易 ### GitLab 工作流 -**GitLab 工作流** 使用 GitLab 作为平台管理你的代码,它是一系列具有逻辑可能性的过程——这个逻辑过程依据软件开发的生命周期来制定。 +**GitLab 工作流** 是在软件开发过程中,在使用 GitLab 作为代码托管平台时,可以采取的动作的一个逻辑序列。 -GitLab 工作流遵循了 [GitLab Flow][97] 策略,这是由一系列由**基于 Git** 的方法和策略组成的,这些方法为版本的管理,例如**分支策略**,**Git最佳实践**等等提供了保障。 +GitLab 工作流遵循了 [GitLab Flow][97] 策略,这是由一系列由**基于 Git** 的方法和策略组成的,这些方法为版本的管理,例如**分支策略**、**Git最佳实践**等等提供了保障。 通过 GitLab 工作流,可以很方便的[提升](https://about.gitlab.com/2016/09/13/gitlab-master-plan/)团队的工作效率以及凝聚力。这种提升,从引入一个新的项目开始,一直到发布这个项目,成为一个产品都有所体现。这就是我们所说的“如何通过最快的速度把一个点子在 10 步之内变成一个产品”。 @@ -22,346 +22,347 @@ GitLab 工作流遵循了 [GitLab Flow][97] 策略,这是由一系列由**基 一般情况下,软件开发经过 10 个主要阶段;GitLab 为这 10 个阶段依次提供了解决方案: 1. **IDEA**: 每一个从点子开始的项目,通常来源于一次闲聊。在这个阶段,GitLab 集成了 [Mattermost][44]。 -2. **ISSUE**: 最有效的讨论一个点子的方法,就是为这个点子建立一个工单讨论。你的团队和你的合作伙伴可以帮助你去提升这个点子,通过 [issue tracker][43] -3. **PLAN**: 一旦讨论得到一致的同意,就是开始编码的时候了。但是等等!首先,我们需要优先考虑组织我们的工作流。对于此,我们可以使用 [Issue Board][42]。 +2. **ISSUE**: 最有效的讨论一个点子的方法,就是为这个点子建立一个工单讨论。你的团队和你的合作伙伴可以在 工单追踪器issue tracker 中帮助你去提升这个点子 +3. **PLAN**: 一旦讨论得到一致的同意,就是开始编码的时候了。但是等等!首先,我们需要优先考虑组织我们的工作流。对于此,我们可以使用 工单看板Issue Board。 4. **CODE**: 现在,当一切准备就绪,我们可以开始写代码了。 5. **COMMIT**: 当我们为我们的初步成果欢呼的时候,我们就可以在版本控制下,提交代码到功能分支了。 -6. **TEST**: 通过 [GitLab CI][41],我们可以运行脚本来创建和测试我们的应用 -7. **REVIEW**: 一旦脚本成功运行,我们测试和构建成功,我们就可以进行 [code review][40] 以及批准。 -8. **STAGING:**: 现在是时候[将我们的代码部署到演示环境][39]来检查一下,是否一切就像我们预估的那样顺畅——或者我们可能仍然需要修改。 -9. **PRODUCTION**: 当项目已经运行的十分通畅,就是[部署到生产环境][38]的时候了! -10. **FEEDBACK**: 现在是时候翻回去看我们能在项目中提升的部分了。我们使用[循环分析][37]来对当前项目中关键的部分进行的反馈。 +6. **TEST**: 通过 [GitLab CI][41],我们可以运行脚本来构建和测试我们的应用。 +7. **REVIEW**: 一旦脚本成功运行,我们测试和构建成功,我们就可以进行 代码复审code review 以及批准。 +8. **STAGING:**: 现在是时候[将我们的代码部署到演示环境][39]来检查一下,看看是否一切就像我们预估的那样顺畅——或者我们可能仍然需要修改。 +9. **PRODUCTION**: 当一切都如预期,就是[部署到生产环境][38]的时候了! +10. **FEEDBACK**: 现在是时候返回去看我们项目中需要提升的部分了。我们使用[周期分析 Cycle Analytics][37]来对当前项目中关键的部分进行的反馈。 简单浏览这些步骤,我们可以发现,提供强大的工具来支持这些步骤是十分重要的。在接下来的部分,我们为 GitLab 的可用工具提供一个简单的概览。 -### GitLab 工单追踪 +### GitLab 工单追踪器 GitLab 有一个强大的工单追溯系统,在使用过程中,允许你和你的团队,以及你的合作者分享和讨论建议。 ![issue tracker - view list](https://about.gitlab.com/images/blogimages/gitlab-workflow-an-overview/issue-tracker-list-view.png) -工单是 GitLab 工作流的第一个重要重要特性。[以工单的讨论为开始][95]; 跟随点子的改变是一个最好的方式。 +工单是 GitLab 工作流的第一个重要重要特性。[以工单的讨论为开始][95]; 跟踪新点子的改变是一个最好的方式。 这十分有利于: * 讨论点子 * 提交功能建议 * 提问题 -* 提交 bug +* 提交错误和故障 * 获取支持 * 精细化新代码的引入 -对于每一个在 GitLab 上部署的项目都有一个工单追踪器。找到你的项目中的 **Issues** > **New issue** 来创建一个新的工单。建立一个标题来总结要被讨论的主题,并且使用 [Markdown][94] 来形容它。看看 [pro tips][93] 来加强你的工单描述。 +每一个在 GitLab 上部署的项目都有一个工单追踪器。找到你的项目中的 **Issues** > **New issue** 来创建一个新的工单。建立一个标题来总结要被讨论的主题,并且使用 [Markdown][94] 来形容它。看看下面的“专业技巧”来加强你的工单描述。 -GitLab 工单追踪器提供了一个额外的实用功能,使得步骤变的更佳易于管理和考虑。下面的部分仔细描述了它。 +GitLab 工单追踪器提供了一个额外的实用功能,使得步骤变得更佳易于管理和考虑。下面的部分仔细描述了它。 ![new issue - additional settings](https://about.gitlab.com/images/blogimages/gitlab-workflow-an-overview/issue-features-view.png) #### 秘密工单 -无论何时,如果你仅仅想要在团队中讨论这个工单,你可以使用 [issue confidential][92]。即使你的项目是公开的,你的工单也会被保密起来。当一个不是本项目成员的人,就算是 [Reporter level][01],想要访问工单的地址时,浏览器也会返回一个 404 错误。 +无论何时,如果你仅仅想要在团队中讨论这个工单,你可以使[该工单成为秘密的][92]。即使你的项目是公开的,你的工单也会被保密起来。当一个不是本项目成员的人,就算是 [报告人级别][01],想要访问工单的地址时,浏览器也会返回一个 404 错误。 #### 截止日期 -每一个工单允许你填写一个[截止日期][90]。有些团队以紧凑的时间表工作,以某种方式去设置一个截止日期来解决问题,是有必要的。这些都可以通过截止日期这一功能实现。 +每一个工单允许你填写一个[截止日期][90]。有些团队工作时间表安排紧凑,以某种方式去设置一个截止日期来解决问题,是有必要的。这些都可以通过截止日期这一功能实现。 -当你有一个多任务的项目截止日期的时候——比如说,一个新的发布、项目的启动,或者追踪团体任务——你可以使用 [milestones][89]。 +当你对一个多任务项目有截止日期的时候——比如说,一个新的发布活动、项目的启动,或者按阶段追踪任务——你可以使用[里程碑][89]。 -### 受托者 +#### 受托者 -任何时候,一个人想要完成工单中的工作,这个工单都可以被分配个那个人。你可以任意修改被分配者,直到满足你的需求。这个功能的想法是,一个受托者本身对这个工单负责,直到其将这个工单重新赋予其他人。 +要让某人处理某个工单,可以将其分配给他。你可以任意修改被分配者,直到满足你的需求。这个功能的想法是,一个受托者本身对这个工单负责,直到其将这个工单重新赋予其他人。 -这对于筛选每个受托者的工单也有帮助。 +这也可以用于按受托者筛选工单。 -### 标签 +#### 标签 -GitLab标签也是GitLab流的一个重要组成部分。你可以使用它们来分类你的工单,在工作流中定位,以及通过[优先级标签][88]来组织它们。 +GitLab 标签也是 GitLab 流的一个重要组成部分。你可以使用它们来分类你的工单,在工作流中定位,以及通过[优先级标签][88]来安装优先级组织它们。 -标签使得你与[GitLab Issue Board][87]协同工作,加快工程进度以及组织你的工作流。 +标签使得你与[GitLab 工单看板][87]协同工作,加快工程进度以及组织你的工作流。 -**New!** 你可以创建[组标签][86]。它可以使得在每一个项目组中使用相同的标签。 +**新功能:** 你可以创建[组标签][86]。它可以使得在每一个项目组中使用相同的标签。 -### 工单权重 +#### 工单权重 -你可以添加个[工单权重][85]使得一个工单重要性表现的更为清晰。01-03表示工单不是特别重要,07-09表示十分重要,04-06表示程度适中。此外,你可以与你的团队自行定义工单重要性的指标。 +你可以添加个[工单权重][85]使得一个工单重要性表现的更为清晰。01 - 03 表示工单不是特别重要,07 - 09 表示十分重要,04 - 06 表示程度适中。此外,你可以与你的团队自行定义工单重要性的指标。 -### GitLab工单看板 +注:该功能仅可用于 GitLab 企业版和 GitLab.com 上。 -在项目中,[GitLab工单看板][84]是一个计划以及组织你的工单理想工具。 +#### GitLab 工单看板 -看板包含了与其相关的各自标签,每一个列表包含了相关的被标记的工单,并且以卡片的形式展示出来。 +在项目中,[GitLab 工单看板][84]是一个用于计划以及组织你的工单,使之符合你的项目工作流的工具。 -这些卡片可以在列表之间移动,被移动的卡片,其标签将会依据你移动的位置发生改变。 +看板包含了与其相关的相应标签,每一个列表包含了相关的被标记的工单,并且以卡片的形式展示出来。 + +这些卡片可以在列表之间移动,被移动的卡片,其标签将会依据你移动的位置相应更新到列表上。 ![GitLab Issue Board](https://about.gitlab.com/images/blogimages/designing-issue-boards/issue-board.gif) -**New!** 你也可以在看板右边创建工单,通过点击列表上方的按钮。当你这么做的时候,这个工单将会自动添加与列表相关的标签。 -**New!** 我们[最近被告知][83] 每一个GitLab项目拥有**多个工单看板** (仅存在于[GitLab Enterprise Edition][82]); 为不同的工作流组织你的工单,这是一个最好的方式。 +**新功能:** 你也可以通过点击列表上方的“+”按钮在看板右边创建工单。当你这么做的时候,这个工单将会自动添加与列表相关的标签。 + +**新功能:** 我们[最近推出了][83] 每一个 GitLab 项目拥有**多个工单看板**的功能(仅存在于 [GitLab 企业版][82]);这是为不同的工作流组织你的工单的好方法。 ![Multiple Issue Boards](https://about.gitlab.com/images/8_13/m_ib.gif) -### 通过GitLab进行代码复审 +### 通过 GitLab 进行代码复审 -在工单追踪中,讨论了新的提议之后,就是在代码上做工作的时候了。你在本地书写代码,一旦你完成了你的第一个版本,你提交你的代码并且推送到你的GitLab仓库。你基于Git的管理策略可以在[GitLab流][81]中被提升。 +在工单追踪器中,讨论了新的提议之后,就是在代码上做工作的时候了。你在本地书写代码,一旦你完成了你的第一个版本,提交你的代码并且推送到你的 GitLab 仓库。你基于 Git 的管理策略可以在 [GitLab 流][81]中被提升。 -### 第一次提交 +#### 第一次提交 在你的第一次提交信息中,你可以添加涉及到工单号在其中。通过这样做你可以将两个阶段的开发工作流链接起来:工单本身以及关于这个工单的第一次提交。 -这样做,如果你提交的代码和工单属于同一个项目,你可以简单的添加 `#xxx` 到提交信息中(译者注:git commit message),`xxx`是一个工单号。如果它们不在一个项目中,你可以添加整个工单的整个URL(`https://gitlab.com///issues/`)。 +这样做,如果你提交的代码和工单属于同一个项目,你可以简单的添加 `#xxx` 到提交信息中(LCTT 译注:`git commit message`),`xxx`是一个工单号。如果它们不在一个项目中,你可以添加整个工单的整个URL(`https://gitlab.com///issues/`)。 ``` -`git commit -m "this is my commit message. Ref #xxx"` +git commit -m "this is my commit message. Ref #xxx" ``` 或者 ``` -`git commit -m "this is my commit message. Related to https://gitlab.com///issues/"` +git commit -m "this is my commit message. Related to https://gitlab.com///issues/" ``` -当然,你也可以替换`gitlab.com`,以你自己的GitLab实例来替换这个URL +当然,你也可以替换 `gitlab.com`,以你自己的 GitLab 实例来替换这个 URL。 -**Note:** 链接工单和你的第一次提交是为了追踪你的进展,通过[GitLab Cycle Analytics][80]. 这将会衡量完成时间与计划工单的实施。这个时间是创建工单与第一次提交的间隔时间。 +**注:** 链接工单和你的第一次提交是为了通过 [GitLab 周期分析][80]追踪你的进展。这将会衡量计划执行该工单所采取的时间,即创建工单与第一次提交的间隔时间。 -### 合并请求 +#### 合并请求 -一旦你提交你的改动到功能分支,GitLab将对定义这次修改,并且建议你提交一次合并请求(MR)。 +一旦将你的改动提交到功能分支,GitLab 将识别该修改,并且建议你提交一次合并请求Merge Request(MR)。 -每一次MR都会有一个题目(这个题目总结了这次的改动)并且一个书写自[Markdown][79]的描述。在描述中,你可以简单的描述MR做了什么,涉及到任何工单以及Mr(通过创建一个链接联系他们),并且,你也可以添加个[关闭工单模式][78],当MR被**合并**的时候,相关联的工单就会被关闭。 +每一次 MR 都会有一个标题(这个标题总结了这次的改动)并且一个用 [Markdown][79] 书写的描述。在描述中,你可以简单的描述该 MR 做了什么,提及任何工单以及 MR(在它们之间创建联系),并且,你也可以添加个[关闭工单模式][78],当该 MR 被**合并**的时候,相关联的工单就会被关闭。 例如: ``` -`## 增加一个新页面 +## 增加一个新页面 -个MR将会为这个项目创建一个`readme.md`,此文件包含这个app的概览 +这个 MR 将会为这个项目创建一个包含该 app 概览的 `readme.md`。 Closes #xxx and https://gitlab.com///issues/ -预览: +预览: -![preview the new page](#image-url) +![预览新页面](#image-url) -cc/ @Mary @Jane @John` +cc/ @Mary @Jane @John ``` -当你创建一个带有描述的MR,就像是上文叙述的那样,它将会: +当你创建一个如上的带有描述的 MR,它将会: * 当合并时,关闭包括工单 `#xxx` 以及 `https://gitlab.com///issues/` * 展示一张图片 -* 提醒用户 `@Mary`, `@Jane`,以及给`@John`发邮件 +* 通过邮件提醒用户 `@Mary`、`@Jane`,以及给 `@John` -你可以分配这个MR给你自己,直到你完成你的工作,然后把他分配给其他人来做一次代码复审。如果有必要的话,这个可以被重新分配多次,直到你覆盖你所需要的所有复审。 +你可以分配这个 MR 给你自己,直到你完成你的工作,然后把它分配给其他人来做一次代码复审。如果有必要的话,这个 MR 可以被重新分配多次,直到你覆盖你所需要的所有复审。 -它也可以被标记,并且添加一个[milestone][77]来促进管理。 +它也可以被标记,并且添加一个[里程碑][77]来促进管理。 -当你添加或者修改一个文件并且提交一个新的分支,从UI而不是命令行的时候,它也一样简单。创建一个新的合并请求,仅仅需要标记一下复选框,“以这些改变开始一个新的合并请求”,然后,一旦你提交你的改动,GitLab将会自动创建一个新的MR。 +当你从图形界面而不是命令行添加或者修改一个文件并且提交一个新的分支时,也很容易创建一个新的 MR,仅仅需要标记一下复选框,“以这些改变开始一个新的合并请求”,然后,一旦你提交你的改动,GitLab 将会自动创建一个新的 MR。 ![commit to a feature branch and add a new MR from the UI](https://about.gitlab.com/images/blogimages/gitlab-workflow-an-overview/start-new-mr-edit-from-ui.png) -**Note:** 添加[关闭工单样式][76]到你的MR来使得[GitLab Cycle Analytics][75]追踪你的项目进展,是十分重要的。它将会追踪“代码”阶段,衡量项目的时间。这个时间是第一次提交和创建一个合并请求间隔的时间。 +**注:** 添加[关闭工单样式][76]到你的 MR 以便可以使用 [GitLab 周期分析][75]追踪你的项目进展,是十分重要的。它将会追踪“CODE”阶段,衡量第一次提交及创建一个相关的合并请求所间隔的时间。 -**New!** 我们已经开发了[审查应用][74],一个新的功能是使得你可以部署你的应用到一个动态的环境中,来自那些你可以预览的改动。这些改动基于分支的名字,以及每一个合并请求。看看[working example][73]。 +**新功能:** 我们已经开发了[审查应用][74],这是一个可以让你部署你的应用到一个动态的环境中的新功能,在此你可以按分支名字、每个合并请求来预览改变。参看这里的[可用示例][73]。 -### WIP MR +#### WIP MR -一个 WIP MR,含义是 **在工作过程中的合并请求**,是一个我们在GitLab中避免MR在准备就绪前被合并的技术。只需要添加`WIP:` 在MR的标题开头,它将不会被合并,除非你把`WIP:`删除。 +WIP MR 含义是 **在工作过程中的合并请求**,是一个我们在 GitLab 中避免 MR 在准备就绪前被合并的技术。只需要添加 `WIP:` 在 MR 的标题开头,它将不会被合并,除非你把 `WIP:` 删除。 -当你改动已经准备好被合并,删除`WIP:` 编辑工单来手动删除,或者使用一个快捷键,允许你在MR描述下使用。 +当你改动已经准备好被合并,编辑工单来手动删除 `WIP:` ,或者使用就像如下 MR 描述下方的快捷方式。 ![WIP MR click to remove WIP from the title](https://about.gitlab.com/images/blogimages/gitlab-workflow-an-overview/gitlab-wip-mr.png) -**New!** `WIP`模式可以被[很快的添加到合并请求][72],通过[slash command][71]`/wip`。只需要输入它并且在评论或者MR描述中提交。 +**新功能:** `WIP` 模式可以通过[斜线命令][71] `/wip` [快速添加到合并请求中][72]。只需要在评论或者 MR 描述中输入它并提交即可。 -### 复审 +#### 复审 -一旦你创建一个合并请求,就是你开始从你的团队以及合作方收取反馈的时候了。使用UI中可用的区别功能,你可以简单的添加行中注释,来回复他们或者解决他们。 +一旦你创建一个合并请求,就是你开始从你的团队以及合作方收取反馈的时候了。使用图形界面中的差异比较功能,你可以简单的添加行内注释,以及回复或者解决它们。 -你也可以在每一行代码中获取一个链接,通过点击行号。 +你也可以通过点击行号获取每一行代码的链接。 -提交历史在UI中是可见的,通过提交历史,你可以追踪文件的每一次改变。你可以在行中浏览他们, +在图形界面中可以看到提交历史,通过提交历史,你可以追踪文件的每一次改变。你可以以行内差异或左右对比的方式浏览它们。 ![code review in MRs at GitLab](https://about.gitlab.com/images/blogimages/gitlab-workflow-an-overview/gitlab-code-review.png) -**New!** 你可以找到合并冲突,快速[通过UI界面来解决][70],或者依据你的需要修改文件来修复冲突。 +**新功能:** 如果你遇到合并冲突,可以快速地[通过图形界面来解决][70],或者依据你的需要修改文件来修复冲突。 ![mr conflict resolution](https://about.gitlab.com/images/8_13/inlinemergeconflictresolution.gif) -### 创建,测试以及发布 +### 构建、测试以及发布 -[GitLab CI][69] 是一个强大的内建工具,其作用是[持续集成,持续发布以及持续投递][58],可以按照你希望的运行一些脚本。它的可能性是无止尽的:它就像是你自己的命令行为你工作。 +[GitLab CI][69] 是一个强大的内建工具,其作用是[持续集成、持续发布以及持续分发][58],它可以按照你希望的运行一些脚本。它的可能性是无止尽的:你可以把它看做是自己运行的命令行。 -它完全是通过Yaml文件设置的,`.gitlab-ci.yml`,放置在你的项目仓库中。使用网络,通过简单的添加一个文件,命名为`.gitlab-ci.yml`来打开一个下拉目录,为不同的应用选择各种CI模版。 +它完全是通过一个名为 `.gitlab-ci.yml` 的 YAML 文件设置的,其放置在你的项目仓库中。使用 Web 界面简单的添加一个文件,命名为 `.gitlab-ci.yml` 来触发一个下拉菜单,为不同的应用选择各种 CI 模版。 ![GitLab CI templates - dropdown menu](https://about.gitlab.com/images/blogimages/gitlab-workflow-an-overview/gitlab-ci-template.png) -### Koding +#### Koding Use GitLab's [Koding integration][67] to run your entire development environment in the cloud. This means that you can check out a project or just a merge request in a full-fledged IDE with the press of a button. -使用 GitLab的[Koding集成][67]去使用你整个云端开发环境。这意味着你可以通过一个完整的IDE点,点击一个按键,在一个项目中切换分支,或者合并一个请求。 +可以使用 GitLab 的 [Koding 集成][67]功能在云端运行你的整个云端开发环境。这意味着你可以轻轻一键即可在一个完整的 IDE 中检出以个项目,或者合并一个请求。 -### 使用案例 +#### 使用案例 -GitLab CI的使用案例: +GitLab CI 的使用案例: -* 使用它去[创建][36]任何[静态网站生成器][35],并且通过[GitLab Pages][34]发布你的网站。 -* 使用它来[发布你的网站][33]来`staging`以及`production`[环境][32](译者注:展示以及产品化) -* 用它来[创建一个iOS应用][31] -* 用它来[创建一集发布你的Docker镜像][30]通过[GitLab容器注册][29] +* 用它来[构建][36]任何[静态网站生成器][35],并且通过 [GitLab Pages][34] 发布你的网站。 +* 用它来[发布你的网站][33] 到 `staging` 以及 `production` [环境][32]。 +* 用它来[构建一个 iOS 应用][31]。 +* 用它来[构建和发布你的 Docker 镜像][30]到 [GitLab 容器注册库][29]。 -我们已经准备一大堆[GitLab CI样例工程][66]作为您的指南。看看他们吧! +我们已经准备一大堆 [GitLab CI 样例工程][66]作为您的指南。看看它们吧! -### 反馈:循环分析 +### 反馈:周期分析 -当你依据 GitLab工作流 工作,你的团队从点子到产品,在每一个[过程的关键部分][64],你将会即时获得一个[GitLab循环分析][65]的反馈: +当你遵循 GitLab 工作流进行工作,你的团队从点子到产品,在每一个[过程的关键部分][64],你将会在下列时间获得一个 [GitLab 周期分析][65]的反馈: -* **Issue:** 创建一个工单到分配这个工单到一个里程碑,或者添加一个工单到你的工单看板的时间 -* **Plan:** 给工单分配一个里程碑或者把它添加到工单看板,到发布第一次提交的时间。 -* **Code:** 第一次提交到提出合并请求的时间 -* **Test:** CI为了相关合并请求,运行整个管道的时间 -* **Review:** 创建一个合并请求到合并的时间 -* **Staging:** 合并到发布成为产品的时间 -* **Production** (总的): 创建一个工单到把代码发布成[产品][28]的时间 +* **Issue**: 从创建一个工单,到分配这个工单给一个里程碑或者添加工单到你的工单看板的时间。 +* **Plan**: 从给工单分配一个里程碑或者把它添加到工单看板,到推送第一次提交的时间。 +* **Code**: 从第一次提交到提出该合并请求的时间。 +* **Test**: CI 为了相关合并请求而运行整个过程的时间。 +* **Review**: 从创建一个合并请求到合并它的时间。 +* **Staging**: 从合并到发布成为产品的时间。 +* **Production(Total)**: 从创建工单到把代码发布成[产品][28]的时间。 ### 加强 -### 工单以及合并模版 +#### 工单以及合并请求模版 -[工单以及合并模版][63]允许你去定义一个关于工单的详细模版,以及合并您的项目中请求描述部分。 +[工单以及合并请求模版][63]允许你为你的项目去定义一个特定内容的工单模版和合并请求的描述字段。 -您将会把他们以[Markdown][62]形式书写,并且把他们加入您仓库的默认分支。任何时候一个工单或者MR被创建,他们都可以被一个下拉菜单访问。 +你可以以 [Markdown][62] 形式书写它们,并且把它们加入仓库的默认分支。当创建工单或者合并请求时,可以通过下拉菜单访问它们。 -他们节省了您在描述工单和MR,以及标准化需要持续跟踪的重要信息的时间。它确保了你需要的一切都在你的掌控之中。 +它们节省了您在描述工单和合并请求的时间,并标准化了需要持续跟踪的重要信息。它确保了你需要的一切都在你的掌控之中。 -当你可以创建许多模版,他们为不同的目的提供服务。例如,你可以有一个提供功能建议的工单模版,或者一个bug汇报的工单模版。在[GitLab CE project][61]中寻找真实的例子吧! +你可以创建许多模版,用于不同的用途。例如,你可以有一个提供功能建议的工单模版,或者一个 bug 汇报的工单模版。在 [GitLab CE project][61] 中寻找真实的例子吧! ![issues and MR templates - dropdown menu screenshot](https://about.gitlab.com/images/blogimages/gitlab-workflow-an-overview/issues-choose-template.png) -### 里程碑 +#### 里程碑 -[里程碑][60] 是GitLab中追踪你队伍工作的最好工具。它基于共同的目标,详细的日期。 +[里程碑][60] 是 GitLab 中基于共同的目标、详细的日期追踪你队伍工作的最好工具。 -不同情况的目的是不同的,但是概述是相同的:你有一个工单的集合以及正在编码的合并请求来达到特定的目标。 +不同情况下的目的是不同的,但是大致是相同的:你有为了达到特定的目标的工单的集合以及正在编码的合并请求。 -这个目标基本上可以是任何东西——用来组合团队工作,通过一个截止日期来提高团队的工作时间。例如,发布一个新的release,启动一个新的产品,通过日期让事情完成,或者集合一些项目,使之一个季度完成。 +这个目标基本上可以是任何东西——用来结合团队的工作,在一个截止日期前完成一些事情。例如,发布一个新的版本,启动一个新的产品,在某个日期前完成,或者按季度收尾一些项目。 ![milestone dashboard](https://about.gitlab.com/images/blogimages/gitlab-workflow-an-overview/gitlab-milestone.png) -### 高级要点 +### 专业技巧 -### 工单和MR +#### 工单和 MR -* 工单和MR的描述中: - * 输入`#`来触发一个关于现存工单的下拉列表 - * 输入`!` 来触发一个关于现存MR的下拉列表 - * 输入 `/` 来触发[slash 命令][4] - * 输入 `:` 来出发emoji表情 (也支持行中评论) -* 添加图片(jpg, png, gif) 和视频到行中评论,通过按钮 **Attach a file** -* [自动应用标签][27] 通过 [GitLab Webhooks][26] +* 在工单和 MR 的描述中: + * 输入 `#` 来触发一个已有工单的下拉列表 + * 输入 `!` 来触发一个已有 MR 的下拉列表 + * 输入 `/` 来触发[斜线命令][4] + * 输入 `:` 来出发 emoji 表情 (也支持行中评论) +* 通过按钮“附加文件”来添加图片(jpg、png、gif) 和视频到行内评论 +* 通过 [GitLab Webhooks][26] [自动应用标签][27] * [构成引用][24]: 使用语法 `>>>` 来开始或者结束一个引用 ``` - `>>> + >>> Quoted text Another paragraph - >>>` + >>> ``` -* Create [task lists][23]: +* 创建[任务列表][23]: ``` - `- [ ] Task 1 + - [ ] Task 1 - [ ] Task 2 - - [ ] Task 3` + - [ ] Task 3 ``` -#### 订阅 +##### 订阅 -你是否发现你有一个工单或者MR想要追踪?在你的右边,扩展导航中,点击[订阅][59],你就可以在任何时候收到一个评论的更新。要是你想要一次订阅多个工单和MR?使用[bulk subscription][58]. 😃 +你是否发现你有一个工单或者 MR 想要追踪?展开你的右边的导航,点击[订阅][59],你就可以在随时收到一个评论的提醒。要是你想要一次订阅多个工单和 MR?使用[批量订阅][58]。 -#### 添加代办 +##### 添加代办 -除了一直留意工单和MR,如果你想要预先做点什么,或者在任何时候你想要在GitLab 代办列表中添加什么,点击你右边的导航,并且[点击 **添加代办**][57]。 +除了一直留意工单和 MR,如果你想要对它预先做点什么,或者不管什么时候你想要在 GitLab 代办列表中添加点什么,点击你右边的导航,并且[点击**添加代办**][57]。 -#### 寻找你的工单和MR +##### 寻找你的工单和 MR -当你寻找一个在很久以前由你开启的工单——他们可能数以千计——所以你很难找到他们。打开你左边的导航,并且点击**工单**或者**合并请求**,你就会看到那些分配给你的。同时,在那里或者任何工单追踪器,你可以通过作者,分配者,里程碑,标签以及重要性来过滤工单,也可以通过搜索所有不同状态的工单,例如开启的,合并的,关闭的等等。 +当你寻找一个在很久以前由你开启的工单或 MR——它们可能数以十计、百计、甚至千计——所以你很难找到它们。打开你左边的导航,并且点击**工单**或者**合并请求**,你就会看到那些分配给你的。同时,在那里或者任何工单追踪器里,你可以通过作者、分配者、里程碑、标签以及重要性来过滤工单,也可以通过搜索所有不同状态的工单,例如开启的、合并的,关闭的等等。 -### 移动工单 +#### 移动工单 -一个工单在一个错误的项目中结束了?不用单机,点击**Edit**,然后[移动工单][56]到正确的项目。 +一个工单在一个错误的项目中结束了?不用担心,点击**Edit**,然后[移动工单][56]到正确的项目。 -### 代码片段 +#### 代码片段 -有时候你在不同的项目以及文件中,使用一些相同的代码段和模版吗?创建一个代码段并且使它在你需要的时候可用。打开左边导航栏,点击**[Snipptes][25]**。所有你的片段都会在那里。你可以把她们设置成公开的,内部的(仅仅为GitLab注册用户提供),或者私有的。 +你经常在不同的项目以及文件中使用一些相同的代码段和模版吗?创建一个代码段并且使它在你需要的时候可用。打开左边导航栏,点击**[Snipptes][25]**。所有你的片段都会在那里。你可以把它们设置成公开的,内部的(仅为 GitLab 注册用户提供),或者私有的。 ![Snippets - screenshot](https://about.gitlab.com/images/blogimages/gitlab-workflow-an-overview/gitlab-code-snippet.png) -### GitLab 工作流用户案例设想 +### GitLab 工作流用户案例概要 -为了全神贯注,让我们把所有东西聚在一起理顺一下。不必担心,这十分简单。 +作为总结,让我们把所有东西聚在一起理顺一下。不必担心,这十分简单。 -让我们假设:你工作于一个聚焦于软件开发的公司。你创建了一个新的工单,这个工单是为了开发一个新功能,实施于你的一个应用中。 +让我们假设:你工作于一个专注于软件开发的公司。你创建了一个新的工单,这个工单是为了开发一个新功能,实施于你的一个应用中。 -### 标签策略 +**标签策略** -为了这个应用,你已经创建了几个标签,“讨论”,“后端”,“前端”,“正在进行”,“展示”,“就绪”,“文档”,“营销”以及“产品”。所有都已经在工单看板有他们自己的列表。你的工单已经有标签“讨论”。 +为了这个应用,你已经创建了几个标签,“讨论”、“后端”、“前端”、“正在进行”、“展示”、“就绪”、“文档”、“营销”以及“产品”。所有都已经在工单看板有它们自己的列表。你的当前的工单已经有了标签“讨论”。 -在工单追踪器中的讨论达成一致,你的后端团队开始在工单上工作,所以他们把这个工单的标签从“讨论”移动到“后端”。第一个开发者开始写代码,并且把这个工单分配给自己,增加标签“正在进行”。 +在工单追踪器中的讨论达成一致之后,你的后端团队开始在工单上工作,所以他们把这个工单的标签从“讨论”移动到“后端”。第一个开发者开始写代码,并且把这个工单分配给自己,增加标签“正在进行”。 -### 编码 & 提交 +**编码 & 提交** -在他的第一次提交的信息中,他提及了他的工单编号。在工作后,他把他的提交推送到一个功能分支,并且创建一个新的合并请求,在MR描述中,包含工单关闭模式。他的团队复审了他的代码并且保证所有的测试和建立都已经通过。 +在他的第一次提交的信息中,他提及了他的工单编号。在工作后,他把他的提交推送到一个功能分支,并且创建一个新的合并请求,在 MR 描述中,包含工单关闭模式。他的团队复审了他的代码并且保证所有的测试和建立都已经通过。 -### 使用工单看板 +**使用工单看板** 一旦后端团队完成了他们的工作,他们就删除“正在进行”标签,并且把工单从“后端”移动到“前端”看板。所以,前端团队接到通知,这个工单已经为他们准备好了。 -### 发布到演示 +**发布到演示** -当一个前端开发者开始为工单工作,他(她)增加一个标签“正在进行”,并且把这个工单重新分配给自己。当工作完成,这个实施将会被发布到一个**演示**环境。标签“正在进行”就会被删除,然后在工单看板里,工单卡被移动到“演示”表中。 +当一个前端开发者开始在该工单上工作,他(她)增加一个标签“正在进行”,并且把这个工单重新分配给自己。当工作完成,该实现将会被发布到一个**演示**环境。标签“正在进行”就会被删除,然后在工单看板里,工单卡被移动到“演示”列表中。 -### 团队合作 +**团队合作** -最后,当新功能引入成功,你的团队把它移动到“就绪”列表。 +最后,当新功能成功实现,你的团队把它移动到“就绪”列表。 -然后,就是你的技术文档编写团队的时间了,他们为新功能书写文档。一旦某个人完成书写,他添加标签“文档”。同时,你的市场团队开始启动以及推荐功能,所以某个人添加“市场化”。当技术文档书写完毕,书写者删除标签“文档”。一旦市场团队完成他们的工作,他们将工单从“市场化”移动到“生产”。 +然后,就是你的技术文档编写团队的时间了,他们为新功能书写文档。一旦某个人完成书写,他添加标签“文档”。同时,你的市场团队开始启动并推荐该功能,所以某个人添加“市场”。当技术文档书写完毕,书写者删除标签“文档”。一旦市场团队完成他们的工作,他们将工单从“市场”移动到“生产”。 -### 部署到生产环境 +**部署到生产环境** -最后,你将会成为那个为新释出负责的人,合并“合并请求”并且将新功能部署到**生产**环境,然后工单的状态转变为**关闭**。 +最后,你将会成为那个为新版本负责的人,合并“合并请求”并且将新功能部署到**生产**环境,然后工单的状态转变为**关闭**。 -### 反馈 +**反馈** -通过 [循环分析][55],你和你的团队节省了如何从点子到产品的时间,并且开启另一个工单,来讨论如何将这个过程进一步提升。 +通过[周期分析][55],你和你的团队节省了如何从点子到产品的时间,并且开启另一个工单,来讨论如何将这个过程进一步提升。 ### 总结 -GitLab 工作流 通过一个平台,帮助你的团队加速从点子到生产的改变: +GitLab 工作流通过一个单一平台帮助你的团队加速从点子到生产的改变: * 它是**有效的**:因为你可以获取你想要的结果 -* 它是**效率高的**:因为你可以用最小的努力和话费达到最大的生产力。 +* 它是**高效的**:因为你可以用最小的努力和成本达到最大的生产力 * 它是**高产的**:因为你可以非常有效的计划和行动 -* 它是**简单的**:因为你不需要安装不同的工具去完成你的目的,仅仅需要GitLab -* 它是**快速的**:因为你不需要跳过多个平台来完成你的工作 +* 它是**简单的**:因为你不需要安装不同的工具去完成你的目的,仅仅需要 GitLab +* 它是**快速的**:因为你不需要在多个平台间跳转来完成你的工作 -每月的22号都会有一个新的GitLab版本释出,来让它变的更好的称谓集成软件开发方法,并且让团队在一个单一的,唯一的界面一起工作。 +每一个月的 22 号都会有一个新的 GitLab 版本释出,让它在集成软件开发解决方案上变得越来越好,让团队可以在一个单一的、唯一的界面下一起工作。 -在GitLab,每个人都可以奉献!多亏了我们强大的社区,我们获得了我们想要的。并且多亏了他们,我们才能一直为你提供更好的产品。 +在 GitLab,每个人都可以奉献!多亏了我们强大的社区,我们获得了我们想要的。并且多亏了他们,我们才能一直为你提供更好的产品。 -还有什么问题和反馈吗?请留言,或者在推特上@我们[@GitLab][54]!🙌 +还有什么问题和反馈吗?请留言,或者在推特上@我们[@GitLab][54]! -------------------------------------------------------------------------------- via: https://about.gitlab.com/2016/10/25/gitlab-workflow-an-overview/ 作者:[Marcia Ramos][a] - 译者:[svtter](https://github.com/svtter) - -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 09c513e45282b5e672954afd42f4494659c6bf3e Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 13 May 2017 14:14:10 +0800 Subject: [PATCH 0059/1407] PUB:20161025 GitLab Workflow An Overview.md @svtter --- .../tech => published}/20161025 GitLab Workflow An Overview.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20161025 GitLab Workflow An Overview.md (100%) diff --git a/translated/tech/20161025 GitLab Workflow An Overview.md b/published/20161025 GitLab Workflow An Overview.md similarity index 100% rename from translated/tech/20161025 GitLab Workflow An Overview.md rename to published/20161025 GitLab Workflow An Overview.md From c4b9037304639e3f6d647ccadd7a295bd9fff34a Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 13 May 2017 20:42:30 +0800 Subject: [PATCH 0060/1407] PRF&PUB:20170215 How to Secure a FTP Server Using SSL TLS for Secure File Transfer in CentOS 7.md @ictlyh --- ...LS for Secure File Transfer in CentOS 7.md | 63 ++++++++++--------- 1 file changed, 32 insertions(+), 31 deletions(-) rename {translated/tech => published}/20170215 How to Secure a FTP Server Using SSL TLS for Secure File Transfer in CentOS 7.md (67%) diff --git a/translated/tech/20170215 How to Secure a FTP Server Using SSL TLS for Secure File Transfer in CentOS 7.md b/published/20170215 How to Secure a FTP Server Using SSL TLS for Secure File Transfer in CentOS 7.md similarity index 67% rename from translated/tech/20170215 How to Secure a FTP Server Using SSL TLS for Secure File Transfer in CentOS 7.md rename to published/20170215 How to Secure a FTP Server Using SSL TLS for Secure File Transfer in CentOS 7.md index ec6302e009..37bd5b63c0 100644 --- a/translated/tech/20170215 How to Secure a FTP Server Using SSL TLS for Secure File Transfer in CentOS 7.md +++ b/published/20170215 How to Secure a FTP Server Using SSL TLS for Secure File Transfer in CentOS 7.md @@ -1,33 +1,33 @@ 如何在 CentOS 7 中使用 SSL/TLS 加固 FTP 服务器进行安全文件传输 ============================================================ -在一开始的设计中,FTP(文件传输协议)是不安全的,意味着它不会加密两台机器之间传输的数据以及用户的凭据。这使得数据和服务器安全面临很大威胁。 +在一开始的设计中,FTP(文件传输协议)就是不安全的,意味着它不会加密两台机器之间传输的数据以及用户的凭据。这使得数据和服务器安全面临很大威胁。 在这篇文章中,我们会介绍在 CentOS/RHEL 7 以及 Fedora 中如何在 FTP 服务器中手动启用数据加密服务;我们会介绍使用 SSL/TLS 证书保护 VSFTPD(Very Secure FTP Daemon)服务的各个步骤。 #### 前提条件: -1. 你必须已经[在 CentOS 7 中安装和配置 FTP 服务][1] +- 你必须已经[在 CentOS 7 中安装和配置 FTP 服务][1] 。 在我们开始之前,要注意本文中所有命令都以 root 用户运行,否则,如果现在你不是使用 root 用户控制服务器,你可以使用 [sudo 命令][2] 去获取 root 权限。 ### 第一步:生成 SSL/TLS 证书和密钥 -1. 我们首先要在 `/etc/ssl` 目录下创建用于保存 SSL/TLS 证书和密钥文件的子目录: +1、 我们首先要在 `/etc/ssl` 目录下创建用于保存 SSL/TLS 证书和密钥文件的子目录: ``` # mkdir /etc/ssl/private ``` -2. 然后运行下面的命令为 vsftpd 创建证书和密钥并保存到一个文件中,下面会解析使用的每个标签。 +2、 然后运行下面的命令为 vsftpd 创建证书和密钥并保存到一个文件中,下面会解析使用的每个选项。 -1. req - 是 X.509 Certificate Signing Request (CSR,证书签名请求)管理的一个命令。 -2. x509 - X.509 证书数据管理。 -3. days - 定义证书的有效日期。 -4. newkey - 指定证书密钥处理器。 -5. rsa:2048 - RSA 密钥处理器,会生成一个 2048 位的密钥。 -6. keyout - 设置密钥存储文件。 -7. out - 设置证书存储文件,注意证书和密钥都保存在一个相同的文件:/etc/ssl/private/vsftpd.pem。 +1. `req` - 是 X.509 Certificate Signing Request (CSR,证书签名请求)管理的一个命令。 +2. `x509` - X.509 证书数据管理。 +3. `days` - 定义证书的有效日期。 +4. `newkey` - 指定证书密钥处理器。 +5. `rsa:2048` - RSA 密钥处理器,会生成一个 2048 位的密钥。 +6. `keyout` - 设置密钥存储文件。 +7. `out` - 设置证书存储文件,注意证书和密钥都保存在一个相同的文件:/etc/ssl/private/vsftpd.pem。 ``` # openssl req -x509 -nodes -keyout /etc/ssl/private/vsftpd.pem -out /etc/ssl/private/vsftpd.pem -days 365 -newkey rsa:2048 @@ -47,7 +47,7 @@ Email Address []:admin@tecmint.com ### 第二步:配置 VSFTPD 使用 SSL/TLS -3. 在我们进行任何 VSFTPD 配置之前,首先开放 990 和 40000-50000 端口,以便在 VSFTPD 配置文件中分别定义 TLS 连接的端口和被动端口的端口范围: +3、 在我们进行任何 VSFTPD 配置之前,首先开放 990 和 40000-50000 端口,以便在 VSFTPD 配置文件中分别定义 TLS 连接的端口和被动端口的端口范围: ``` # firewall-cmd --zone=public --permanent --add-port=990/tcp @@ -55,7 +55,7 @@ Email Address []:admin@tecmint.com # firewall-cmd --reload ``` -4. 现在,打开 VSFTPD 配置文件并在文件中指定 SSL 的详细信息: +4、 现在,打开 VSFTPD 配置文件并在文件中指定 SSL 的详细信息: ``` # vi /etc/vsftpd/vsftpd.conf @@ -70,14 +70,14 @@ ssl_sslv2=NO ssl_sslv3=NO ``` -5. 然后,添加下面的行定义 SSL 证书和密钥文件的位置: +5、 然后,添加下面的行来定义 SSL 证书和密钥文件的位置: ``` rsa_cert_file=/etc/ssl/private/vsftpd.pem rsa_private_key_file=/etc/ssl/private/vsftpd.pem ``` -6. 下面,我们要阻止匿名用户使用 SSL,然后强制所有非匿名用户登录使用安全的 SSL 连接进行数据传输和登录过程中的密码发送: +6、 下面,我们要阻止匿名用户使用 SSL,然后强制所有非匿名用户登录使用安全的 SSL 连接进行数据传输和登录过程中的密码发送: ``` allow_anon_ssl=NO @@ -85,7 +85,7 @@ force_local_data_ssl=YES force_local_logins_ssl=YES ``` -7. 另外,我们还可以添加下面的选项增强 FTP 服务器的安全性。当选项 `require_ssl_reuse` 被设置为 `YES` 时,要求所有 SSL 数据连接都显示 SSL 会话重用;表明它们知道与控制频道相同的主机密码。 +7、 另外,我们还可以添加下面的选项增强 FTP 服务器的安全性。当选项 `require_ssl_reuse` 被设置为 `YES` 时,要求所有 SSL 数据连接都会重用 SSL 会话;这样它们会知道控制通道的主密码。 因此,我们需要把它关闭。 @@ -93,19 +93,19 @@ force_local_logins_ssl=YES require_ssl_reuse=NO ``` -另外,我们还要用 `ssl_ciphers` 选项选择 VSFTPD 允许用于加密 SSL 连接的 SSL 密码。这可以大大限制尝试使用在漏洞中发现的特定密码的攻击者: +另外,我们还要用 `ssl_ciphers` 选项选择 VSFTPD 允许用于加密 SSL 连接的 SSL 算法。这可以极大地限制那些尝试发现使用存在缺陷的特定算法的攻击者: ``` ssl_ciphers=HIGH ``` -8. 现在,设置被动端口的端口范围(最小和最大端口)。 +8、 现在,设置被动端口的端口范围(最小和最大端口)。 ``` pasv_min_port=40000 pasv_max_port=50000 ``` -9. 选择性启用 `debug_ssl` 选项以允许 SSL 调试,意味着 OpenSSL 连接诊断会被记录到 VSFTPD 日志文件: +9、 选择性启用 `debug_ssl` 选项以允许 SSL 调试,这意味着 OpenSSL 连接诊断会被记录到 VSFTPD 日志文件: ``` debug_ssl=YES @@ -119,7 +119,7 @@ debug_ssl=YES ### 第三步:用 SSL/TLS 连接测试 FTP 服务器 -10. 完成上面的所有配置之后,像下面这样通过在命令行中尝试使用 FTP 测试 VSFTPD 是否使用 SSL/TLS 连接: +10、 完成上面的所有配置之后,像下面这样通过在命令行中尝试使用 FTP 测试 VSFTPD 是否使用 SSL/TLS 连接: ``` # ftp 192.168.56.10 @@ -131,11 +131,12 @@ Login failed. 421 Service not available, remote server has closed connection ftp> ``` + [ ![验证 FTP SSL 安全连接](http://www.tecmint.com/wp-content/uploads/2017/02/Verify-FTP-Secure-Connection.png) ][3] -验证 FTP SSL 安全连接 +*验证 FTP SSL 安全连接* 从上面的截图中,我们可以看到这里有个错误提示我们 VSFTPD 只允许用户从支持加密服务的客户端登录。 @@ -143,7 +144,7 @@ ftp> ### 第四步:安装 FileZilla 以便安全地连接到 FTP 服务器 -11. FileZilla 是一个时尚、流行且重要的交叉平台 FTP 客户端,它默认支持 SSL/TLS 连接。 +11、 FileZilla 是一个现代化、流行且重要的跨平台的 FTP 客户端,它默认支持 SSL/TLS 连接。 要在 Linux 上安装 FileZilla,可以运行下面的命令: @@ -154,7 +155,7 @@ ftp> $ sudo apt-get install filezilla ``` -12. 当安装完成后(或者你已经安装了该软件),打开它,选择 File=>Sites Manager 或者按 `Ctrl + S` 打开 Site Manager 界面。 +12、 当安装完成后(或者你已经安装了该软件),打开它,选择 File => Sites Manager 或者按 `Ctrl + S` 打开 Site Manager 界面。 点击 New Site 按钮添加一个新的站点/主机连接详细信息。 @@ -162,7 +163,7 @@ $ sudo apt-get install filezilla ![在 FileZilla 中添加新 FTP 站点](http://www.tecmint.com/wp-content/uploads/2017/02/Add-New-FTP-Site-in-Filezilla.png) ][4] -在 FileZilla 中添加新 FTP 站点 +*在 FileZilla 中添加新 FTP 站点* 13. 下一步,像下面这样设置主机/站点名称、添加 IP 地址、定义使用的协议、加密和登录类型(使用你自己情况的值): @@ -177,15 +178,15 @@ User: username ![在 Filezilla 中添加 FTP 服务器详细信息](http://www.tecmint.com/wp-content/uploads/2017/02/Add-FTP-Server-Details-in-Filezilla.png) ][5] -在 Filezilla 中添加 FTP 服务器详细信息 +*在 Filezilla 中添加 FTP 服务器详细信息* -14. 然后点击 Connect,再次输入密码,然后验证用于 SSL/TLS 连接的证书,再一次点击 `OK` 连接到 FTP 服务器: +14、 然后点击 Connect,再次输入密码,然后验证用于 SSL/TLS 连接的证书,再一次点击 `OK` 连接到 FTP 服务器: [ ![验证 FTP SSL 证书](http://www.tecmint.com/wp-content/uploads/2017/02/Verify-FTP-SSL-Certificate.png) ][6] -验证 FTP SSL 证书 +*验证 FTP SSL 证书* 到了这里,我们应该使用 TLS 连接成功地登录到了 FTP 服务器,在下面的界面中检查连接状态部分获取更多信息。 @@ -193,15 +194,15 @@ User: username ![通过 TLS/SSL 连接到 FTP 服务器](http://www.tecmint.com/wp-content/uploads/2017/02/connected-to-ftp-server-with-tls.png) ][7] -通过 TLS/SSL 连接到 FTP 服务器 +*通过 TLS/SSL 连接到 FTP 服务器* -15. 最后,在文件目录尝试 [从本地传输文件到 FTP 服务器][8],看 FileZilla 界面后面的部分查看文件传输相关的报告。 +15、 最后,在文件目录尝试 [从本地传输文件到 FTP 服务器][8],看 FileZilla 界面后面的部分查看文件传输相关的报告。 [ ![使用 FTP 安全地传输文件](http://www.tecmint.com/wp-content/uploads/2017/02/Transfer-Files-Securely-Using-FTP.png) ][9] -使用 FTP 安全地传输文件 +*使用 FTP 安全地传输文件* 就是这些。记住 FTP 默认是不安全的,除非我们像上面介绍的那样配置它使用 SSL/TLS 连接。在下面的评论框中和我们分享你关于这篇文章/主题的想法吧。 @@ -217,7 +218,7 @@ via: http://www.tecmint.com/secure-vsftpd-using-ssl-tls-on-centos/ 作者:[Aaron Kili][a] 译者:[ictlyh](https://github.com/ictlyh) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 3d118d43f5641b0981975e6023b14f9eb5775be9 Mon Sep 17 00:00:00 2001 From: Louis Wei Date: Sat, 13 May 2017 21:57:17 +0800 Subject: [PATCH 0061/1407] Update 20110127 How debuggers work Part 2 - Breakpoints.md --- ...How debuggers work Part 2 - Breakpoints.md | 152 ++++++++++++++++++ 1 file changed, 152 insertions(+) diff --git a/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md b/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md index 88d30da543..0337e85a27 100644 --- a/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md +++ b/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md @@ -4,6 +4,158 @@ ### 关于本文 +我不会去说明调试器如何打断点。断点是调试的两大利器之一,另一个是可以在调试进程的内存中检查变量值。我们在系列的第一部分已经预览过值检查啦,但是断点对我们来说依然神秘。不过本文过后,他们就不再如此了。 + +### 软件中断 + +为了在 x86 架构机器上实现断点,软件中断(也被称作 陷阱)被派上用场。在我们深入细节之前,我想先大致解释一下中断和陷阱的概念。 + +一个 CPU 有一条单独的执行流,一条指令接一条的执行 [[1]][19]。为了能够处理异步的事件,如 IO 和 硬件定时器,CPU 使用了中断。一个硬件中断通常是一个特定的电子信号,并附加了一个特别的”响应电路”。该电路通知中断激活,并让 CPU 停止当前执行,保存状态,然后跳转到一个预定义的地址,也就是处理中断程序的位置。当处理程序完成其工作后,CPU 又从之前停止的地方重新恢复运行。 + +软件中断在规则上与硬件相似,但实际操作中有些不同。CPU 支持一些特殊的指令,来允许软件模拟出一个中断。当这样的一个指令被执行时,CPU 像对待一个硬件中断那样 ———— 停止正常的执行流,保存状态,然后跳转到一个处理程序。这种 ”陷阱” 使得许多现代操作系统的惊叹设计得以高效地实现(如任务调度,虚拟内存,内存保护,调试) + +许多编程错误(如被 0 除)也被 CPU 当做陷阱对待,常常也叫做”异常”, 这时候硬件和软件中断之间的界限就模糊了,很难说这种异常到底是硬件中断还是软件中断。但我已经偏离今天主题太远了,所以现在让我们回到断点上来。 + +### int 3 理论 + +前面说了很多,现在简单来说断点就是一个部署在 CPU 上的特殊陷阱,叫 int 3。int 是一个 “陷阱指令”的 x86 术语,该指令是对一个预定义中断处理的调用。x86 支持 8 位的 int 指令操作数,决定了中断的数量,所以理论上可以支持 256 个陷阱。前 32 个陷阱为 CPU 自己保留,and number 3 is the one we're interested in here - it's called "trap to debugger". + +避免更深的解释,我将引用理论本身一段话[[2]][20]。 + +> The INT 3 instruction generates a special one byte opcode (CC) that is intended for calling the debug exception handler. (This one byte form is valuable because it can be used to replace the first byte of any instruction with a breakpoint, including other one byte instructions, without over-writing other code). + +上述引用非常重要,但是目前去解释它还是为时过早。本文后面我们会回过头再看。 + +### int 3 实践 + +没错,知道事物背后的理论非常不错,不过,这些理论到底意思是啥?我们怎样使用 int 3 部署断点?或者怎么翻译成通用的编程术语 ———— _请给我看代码!_ + +实际上,实现非常简单。一旦你的程序执行了 int 3 指令,操作系统就会停止程序 [[3]][21]。在 Linux(这也是本文比较关心的地方) 上,操作系统会发送给进程一个信号 ——  SIGTRAP。 + + +That's all there is to it - honest! Now recall from the first part of the series that a tracing (debugger) process gets notified of all the signals its child (or the process it attaches to for debugging) gets, and you can start getting a feel of where we're going. + +That's it, no more computer architecture 101 jabber. It's time for examples and code. + +### 手动设置断点 + +现在我要演示在程序里设置断点的代码。我要使用的程序如下: + +``` +section .text + ; The _start symbol must be declared for the linker (ld) + global _start + +_start: + + ; Prepare arguments for the sys_write system call: + ; - eax: system call number (sys_write) + ; - ebx: file descriptor (stdout) + ; - ecx: pointer to string + ; - edx: string length + mov edx, len1 + mov ecx, msg1 + mov ebx, 1 + mov eax, 4 + + ; Execute the sys_write system call + int 0x80 + + ; Now print the other message + mov edx, len2 + mov ecx, msg2 + mov ebx, 1 + mov eax, 4 + int 0x80 + + ; Execute sys_exit + mov eax, 1 + int 0x80 + +section .data + +msg1 db 'Hello,', 0xa +len1 equ $ - msg1 +msg2 db 'world!', 0xa +len2 equ $ - msg2 +``` + +我现在在使用汇编语言,是为了当我们面对 C 代码的时候,能清楚一些编译细节。上面代码做的事情非常简单,就是在一行打印出“hello,”,然后在下一行打印出“world!”。这与之前文章中的程序非常类似。 + +现在我想在第一次打印和第二次打印之间设置一个断点。我们看到在第一条 int 0x80 后面,指令 mov edx, len2。首先,我们需要知道该指令所映射的地址。运行 objdump -d: + +``` +traced_printer2: file format elf32-i386 + +Sections: +Idx Name Size VMA LMA File off Algn + 0 .text 00000033 08048080 08048080 00000080 2**4 + CONTENTS, ALLOC, LOAD, READONLY, CODE + 1 .data 0000000e 080490b4 080490b4 000000b4 2**2 + CONTENTS, ALLOC, LOAD, DATA + +Disassembly of section .text: + +08048080 <.text>: + 8048080: ba 07 00 00 00 mov $0x7,%edx + 8048085: b9 b4 90 04 08 mov $0x80490b4,%ecx + 804808a: bb 01 00 00 00 mov $0x1,%ebx + 804808f: b8 04 00 00 00 mov $0x4,%eax + 8048094: cd 80 int $0x80 + 8048096: ba 07 00 00 00 mov $0x7,%edx + 804809b: b9 bb 90 04 08 mov $0x80490bb,%ecx + 80480a0: bb 01 00 00 00 mov $0x1,%ebx + 80480a5: b8 04 00 00 00 mov $0x4,%eax + 80480aa: cd 80 int $0x80 + 80480ac: b8 01 00 00 00 mov $0x1,%eax + 80480b1: cd 80 int $0x80 +``` + +所以,我们要设置断点的地址是 0x8048096\。等等,这不是调试器工作的真是姿势,不是吗?真正的调试器是在代码行和函数上设置断点,而不是赤裸裸的内存地址?完全正确,但是目前我们仍然还没到那一步,为了更像_真正的_调试器一样设置断点,我们仍不得不首先理解一些符号和调试信息。所以现在,我们就得面对内存地址。 + +在这点上,我真想又偏离一下主题。所以现在你有两个选择,如果你真的感兴趣想知道_为什么_那个地址应该是 0x8048096,它代表着什么,那就看下面的部分。否则你只是想了解断点,你可以跳过这部分。 + +### 题外话 —— 程序地址和入口 + +坦白说,0x8048096 本身没多大意义,仅仅是偏移可执行 text 部分开端的一些字节。如果你看上面导出来的列表,你会看到 text 部分从地址 0x08048080\ 开始。这告诉操作系统在分配给进程的虚拟地址空间里,将该地址映射到 text 部分开始的地方。在 Linux 上面,这些地址可以是绝对地址(i.e. 当这些),因为通过虚拟地址系统,每个进程获得自己的一块内存,并且将整个 32 位地址空间看着自己的(称为 “线性” 地址)。 + +如果我们使用 readelf 命令检查 ELF 文件头部,我们会看到: + +``` +$ readelf -h traced_printer2 +ELF Header: + Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 + Class: ELF32 + Data: 2's complement, little endian + Version: 1 (current) + OS/ABI: UNIX - System V + ABI Version: 0 + Type: EXEC (Executable file) + Machine: Intel 80386 + Version: 0x1 + Entry point address: 0x8048080 + Start of program headers: 52 (bytes into file) + Start of section headers: 220 (bytes into file) + Flags: 0x0 + Size of this header: 52 (bytes) + Size of program headers: 32 (bytes) + Number of program headers: 2 + Size of section headers: 40 (bytes) + Number of section headers: 4 + Section header string table index: 3 +``` + +注意头部里的 "entry point address",它同样指向 0x8048080\。所以我们在系统层面解释该 elf 文件的编码信息,它意思是: +1. 映射 text 部分(包含所给的内容)到地址 0x8048080 +2. 从入口 —— 地址 0x8048080 处开始执行 + +但是,为什么是 0x8048080 呢?事实证明是一些历史原因。一些 google 的结果把我引向源头,声明每个进程的地址空间的前 128M 是保留在栈里的。128M 对应为 0x8000000,该地址是可执行程序其他部分可能开始的地方。而 0x8048080,比较特别,是 Linux ld 链接器用作默认的入口地址。该入口可以通过给 ld 传递 -Ttextargument 参数改变。 + +总结一下,这地址没啥特别的,我们可以随意修改它。只要 ELF 可执行文件被合理的组织,并且头部里的入口地址与真正的程序代码(text 部分)开始的地址匹配,一切都没问题。 + + + + -------------------------------------------------------------------------------- via: http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints From d397ce0d7db157c88c365e74048489986ecd2e13 Mon Sep 17 00:00:00 2001 From: Flynn Date: Sun, 14 May 2017 10:27:08 +0800 Subject: [PATCH 0062/1407] Translating by ucasFL --- ... make file-specific setting changes in Vim using Modeline.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md b/sources/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md index c8b51fcb8c..f8bf7eb43e 100644 --- a/sources/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md +++ b/sources/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md @@ -1,6 +1,6 @@ +ucasFL translating How to make file-specific setting changes in Vim using Modeline ============================================================ -ch-cn translating ### On this page From a0e1d01b967eaa9e5e804a1b6c49e72bab9953c5 Mon Sep 17 00:00:00 2001 From: Louis Wei Date: Sun, 14 May 2017 16:17:01 +0800 Subject: [PATCH 0063/1407] Update 20110127 How debuggers work Part 2 - Breakpoints.md --- ...How debuggers work Part 2 - Breakpoints.md | 302 +++++++++++++++--- 1 file changed, 266 insertions(+), 36 deletions(-) diff --git a/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md b/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md index 0337e85a27..ffd9302c1f 100644 --- a/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md +++ b/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md @@ -18,9 +18,9 @@ ### int 3 理论 -前面说了很多,现在简单来说断点就是一个部署在 CPU 上的特殊陷阱,叫 int 3。int 是一个 “陷阱指令”的 x86 术语,该指令是对一个预定义中断处理的调用。x86 支持 8 位的 int 指令操作数,决定了中断的数量,所以理论上可以支持 256 个陷阱。前 32 个陷阱为 CPU 自己保留,and number 3 is the one we're interested in here - it's called "trap to debugger". +前面说了很多,现在简单来说断点就是一个部署在 CPU 上的特殊陷阱,叫 int 3。int 是一个 “陷阱指令”的 x86 术语,该指令是对一个预定义中断处理的调用。x86 支持 8 位的 int 指令操作数,决定了中断的数量,所以理论上可以支持 256 个中断。前 32 个中断为 CPU 自己保留,而 int 3 就是本文关注的 —— 它被叫做 ”trap to debugger“。 -避免更深的解释,我将引用理论本身一段话[[2]][20]。 +避免更深的解释,我将引用“圣经”一段话[[2]][20]。 > The INT 3 instruction generates a special one byte opcode (CC) that is intended for calling the debug exception handler. (This one byte form is valuable because it can be used to replace the first byte of any instruction with a breakpoint, including other one byte instructions, without over-writing other code). @@ -153,44 +153,274 @@ ELF Header: 总结一下,这地址没啥特别的,我们可以随意修改它。只要 ELF 可执行文件被合理的组织,并且头部里的入口地址与真正的程序代码(text 部分)开始的地址匹配,一切都没问题。 +### 用 int 3 在调试器中设置断点 + +为了在被追踪进程的某些目标地址设置一个断点,调试器会做如下工作: + +1. 记住存储在目标地址的数据 +2. 用 int 指令替换掉目标地址的第一个字节 + +然后,当调试器要求 OS 运行该进程的时候(通过上一次文章中提过的 PTRACE_CONT),进程就会跑起来直到遇到 int 3,此处进程会停止运行,并且 OS 会发送一个信号给调试器。这里调试器会收到一个信号表明其子进程(或者说被追踪进程)停止了。调试器可以做以下工作: + +1. 在目标地址,用原来的正常执行指令替换掉 int 3 指令 +2. Roll the instruction pointer of the traced process back by one. This is needed because the instruction pointer now points  _after_  the int 3, having already executed it. +3. 允许用户在某些地方可以与进程交互,, since the process is still halted at the desired target address。这里你的调试器可以让你取得变量值,调用栈等等。 +4. 当用户想继续运行,调试器会小心地把断点放回目标地址去,除非用户要求取消该断点。 + +让我们来看看,这些步骤是如何翻译成具体代码的。我们会用到 part 1 里的调试器 “模板”(fork 一个子进程并追踪它)。任何情况下,文末会有一个完整样例源代码的链接 + +``` +/* Obtain and show child's instruction pointer */ +ptrace(PTRACE_GETREGS, child_pid, 0, ®s); +procmsg("Child started. EIP = 0x%08x\n", regs.eip); + +/* Look at the word at the address we're interested in */ +unsigned addr = 0x8048096; +unsigned data = ptrace(PTRACE_PEEKTEXT, child_pid, (void*)addr, 0); +procmsg("Original data at 0x%08x: 0x%08x\n", addr, data); +``` + +这里调试器从被追踪的进程中取回了指令指针,也检查了在 0x8048096\ 的字。当开始追踪运行文章开头的汇编代码,将会打印出: + +``` +[13028] Child started. EIP = 0x08048080 +[13028] Original data at 0x08048096: 0x000007ba +``` + +目前为止都看起来不错。接下来: + +``` +/* Write the trap instruction 'int 3' into the address */ +unsigned data_with_trap = (data & 0xFFFFFF00) | 0xCC; +ptrace(PTRACE_POKETEXT, child_pid, (void*)addr, (void*)data_with_trap); + +/* See what's there again... */ +unsigned readback_data = ptrace(PTRACE_PEEKTEXT, child_pid, (void*)addr, 0); +procmsg("After trap, data at 0x%08x: 0x%08x\n", addr, readback_data); +``` + +注意到 int 3 是如何被插入到目标地址的。此处打印: + +``` +[13028] After trap, data at 0x08048096: 0x000007cc +``` + +正如预料的那样 —— 0xba 被 0xcc 替换掉了。现在调试器运行子进程并等待它在断点处停止: + +``` +/* Let the child run to the breakpoint and wait for it to +** reach it +*/ +ptrace(PTRACE_CONT, child_pid, 0, 0); + +wait(&wait_status); +if (WIFSTOPPED(wait_status)) { + procmsg("Child got a signal: %s\n", strsignal(WSTOPSIG(wait_status))); +} +else { + perror("wait"); + return; +} + +/* See where the child is now */ +ptrace(PTRACE_GETREGS, child_pid, 0, ®s); +procmsg("Child stopped at EIP = 0x%08x\n", regs.eip); +``` + +这里打印出: + +``` +Hello, +[13028] Child got a signal: Trace/breakpoint trap +[13028] Child stopped at EIP = 0x08048097 +``` + +注意到 “Hello,” 在断点前打印出来了 —— 完全如我们计划的那样。同时注意到子进程停止的地方 —— 刚好就是单字节中断指令后面。 + +最后,如早先诠释的那样,为了让子进程继续运行,我们得做一些工作。我们用原来的指令替换掉中断指令,并且让进程从这里继续之前的运行。 + +``` +/* Remove the breakpoint by restoring the previous data +** at the target address, and unwind the EIP back by 1 to +** let the CPU execute the original instruction that was +** there. +*/ +ptrace(PTRACE_POKETEXT, child_pid, (void*)addr, (void*)data); +regs.eip -= 1; +ptrace(PTRACE_SETREGS, child_pid, 0, ®s); + +/* The child can continue running now */ +ptrace(PTRACE_CONT, child_pid, 0, 0); +``` + +这会使子进程继续打印出 “world!”,然后退出。 + +注意,我们在这里没有恢复断点。通过在单步调试模式下,运行原来的指令,然后将中断放回去,并且只在运行 PTRACE_CONT 时做到恢复断点。文章稍后会展示 debuglib 如何做到这点。 + +### 更多关于 int 3 + +现在可以回过头去看看 int 3 和 Intel 手册里那个神秘的说明,原文如下: +> This one byte form is valuable because it can be used to replace the first byte of any instruction with a breakpoint, including other one byte instructions, without over-writing other code --------------------------------------------------------------------------------- +int 指令在 x86 机器上占两个字节 —— 0xcd 紧跟在中断数后 [[6]][24]。int 3 已经编码为 cd 03,但是为其还保留有一个单字节指令 —— 0xcc。 -via: http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints +为什么这样呢?因为这可以允许我们插入一个断点,而不需要重写多余的指令。这非常重要,考虑下面的代码: -作者:[Eli Bendersky][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) +``` + .. some code .. + jz foo + dec eax +foo: + call bar + .. some code .. +``` -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 +假设你想在 dec eax 这里放置一个断点。这对应一个单字节指令(操作码为 0x48)。由于替换断点的指令长于一个字节,我们不得不强制覆盖掉下个指令(call)的一部分,这就会篡改 call 指令,并很可能导致一些完全不合理的事情发生。这样一来 jz foo 会导致什么?都不用说在 dec eax 这里停止,CPU 就已经直接去执行后面一些未知指令了。 + +而有了单字节的 int 3 指令,这个问题就解决了。一个字节在 x86 上面的其他指令短得多,这样我们可以保证仅在我们想停止的指令处有改变。 + +### 封装一些晦涩的细节 + +很多上述章节样例代码的底层细节,都可以很容易封装在方便使用的 API 里。我已经做了很多封装的工作,将它们都放在一个叫做 debuglib 的通用库里 —— 文末可以去下载。这里我仅仅是想展示它的用法示例,但是绕了一圈。下面我们将追踪一个用 C 写的程序。 + +### 追踪一个 C 程序地址和入口 + +目前为止,为了简单,我把注意力放在了目标汇编代码。现在是时候往上一个层次,去看看我们如何追踪一个 C 程序。 + +事实证明没那么简单 —— 找到放置断点位置的难度增加了。考虑下面样例程序: + +``` +#include + +void do_stuff() +{ + printf("Hello, "); +} + +int main() +{ + for (int i = 0; i < 4; ++i) + do_stuff(); + printf("world!\n"); + return 0; +} +``` + +假设我想在 do_stuff 入口处放置一个断点。我会先使用 objdump 反汇编一下可执行文件,但是打印出的东西太多。尤其看到很多无用,也不感兴趣的 C 程序运行时的初始化代码。所以我们仅看一下 do_stuff 部分: + +``` +080483e4 : + 80483e4: 55 push %ebp + 80483e5: 89 e5 mov %esp,%ebp + 80483e7: 83 ec 18 sub $0x18,%esp + 80483ea: c7 04 24 f0 84 04 08 movl $0x80484f0,(%esp) + 80483f1: e8 22 ff ff ff call 8048318 + 80483f6: c9 leave + 80483f7: c3 ret +``` + +那么,我们将会把断点放在 0x080483e4,这是 do_stuff 第一条指令执行的地方。而且,该函数是在循环里面调用的,我们想要在断点处一直停止执行直到循环结束。我们将会使用 debuglib 来简化该流程,下面是完整的调试函数: + +``` +void run_debugger(pid_t child_pid) +{ + procmsg("debugger started\n"); + + /* Wait for child to stop on its first instruction */ + wait(0); + procmsg("child now at EIP = 0x%08x\n", get_child_eip(child_pid)); + + /* Create breakpoint and run to it*/ + debug_breakpoint* bp = create_breakpoint(child_pid, (void*)0x080483e4); + procmsg("breakpoint created\n"); + ptrace(PTRACE_CONT, child_pid, 0, 0); + wait(0); + + /* Loop as long as the child didn't exit */ + while (1) { + /* The child is stopped at a breakpoint here. Resume its + ** execution until it either exits or hits the + ** breakpoint again. + */ + procmsg("child stopped at breakpoint. EIP = 0x%08X\n", get_child_eip(child_pid)); + procmsg("resuming\n"); + int rc = resume_from_breakpoint(child_pid, bp); + + if (rc == 0) { + procmsg("child exited\n"); + break; + } + else if (rc == 1) { + continue; + } + else { + procmsg("unexpected: %d\n", rc); + break; + } + } + + cleanup_breakpoint(bp); +} +``` + +为了避免去处理 EIP 标志位和目的进程的内存空间太麻烦,我们仅需要调用 create_breakpoint, resume_from_breakpoint 和 cleanup_breakpoint。让我们来看看追踪上面的 C 代码样例会输出啥: + +``` +$ bp_use_lib traced_c_loop +[13363] debugger started +[13364] target started. will run 'traced_c_loop' +[13363] child now at EIP = 0x00a37850 +[13363] breakpoint created +[13363] child stopped at breakpoint. EIP = 0x080483E5 +[13363] resuming +Hello, +[13363] child stopped at breakpoint. EIP = 0x080483E5 +[13363] resuming +Hello, +[13363] child stopped at breakpoint. EIP = 0x080483E5 +[13363] resuming +Hello, +[13363] child stopped at breakpoint. EIP = 0x080483E5 +[13363] resuming +Hello, +world! +[13363] child exited +``` + +如预期一样! + +### 样例代码 + +[这里是][25]本文用到的完整源代码文件。在归档中你可以找到: + +* debuglib.h and debuglib.c - the simple library for encapsulating some of the inner workings of a debugger +* bp_manual.c - the "manual" way of setting breakpoints presented first in this article. Uses the debuglib library for some boilerplate code. +* bp_use_lib.c - uses debuglib for most of its code, as demonstrated in the second code sample for tracing the loop in a C program. + +### 引用 + +在准备本文的时候,我搜集了如下的资源和文章: + +* [How debugger works][12] +* [Understanding ELF using readelf and objdump][13] +* [Implementing breakpoints on x86 Linux][14] +* [NASM manual][15] +* [SO discussion of the ELF entry point][16] +* [This Hacker News discussion][17] of the first part of the series +* [GDB Internals][18] + + +[1] On a high-level view this is true. Down in the gory details, many CPUs today execute multiple instructions in parallel, some of them not in their original order. + +[2] The bible in this case being, of course, Intel's Architecture software developer's manual, volume 2A. + +[3] How can the OS stop a process just like that? The OS registered its own handler for int 3 with the CPU, that's how! + +[4] Wait, int again? Yes! Linux uses int 0x80 to implement system calls from user processes into the OS kernel. The user places the number of the system call and its arguments into registers and executes int 0x80. The CPU then jumps to the appropriate interrupt handler, where the OS registered a procedure that looks at the registers and decides which system call to execute. + +[5] ELF (Executable and Linkable Format) is the file format used by Linux for object files, shared libraries and executables. + +[6] An observant reader can spot the translation of int 0x80 into cd 80 in the dumps listed above. -[a]:http://eli.thegreenplace.net/ -[1]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id1 -[2]:http://en.wikipedia.org/wiki/Out-of-order_execution -[3]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id2 -[4]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id3 -[5]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id4 -[6]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id5 -[7]:http://en.wikipedia.org/wiki/Executable_and_Linkable_Format -[8]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id6 -[9]:http://eli.thegreenplace.net/tag/articles -[10]:http://eli.thegreenplace.net/tag/debuggers -[11]:http://eli.thegreenplace.net/tag/programming -[12]:http://www.alexonlinux.com/how-debugger-works -[13]:http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html -[14]:http://mainisusuallyafunction.blogspot.com/2011/01/implementing-breakpoints-on-x86-linux.html -[15]:http://www.nasm.us/xdoc/2.09.04/html/nasmdoc0.html -[16]:http://stackoverflow.com/questions/2187484/elf-binary-entry-point -[17]:http://news.ycombinator.net/item?id=2131894 -[18]:http://www.deansys.com/doc/gdbInternals/gdbint_toc.html -[19]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id7 -[20]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id8 -[21]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id9 -[22]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id10 -[23]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id11 -[24]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id12 -[25]:https://github.com/eliben/code-for-blog/tree/master/2011/debuggers_part2_code -[26]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints -[27]:http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1/ From 63204082834908b0e52ced6f0802f0a8542f9305 Mon Sep 17 00:00:00 2001 From: Louis Wei Date: Sun, 14 May 2017 16:20:33 +0800 Subject: [PATCH 0064/1407] Update 20110127 How debuggers work Part 2 - Breakpoints.md --- ...How debuggers work Part 2 - Breakpoints.md | 42 +++++++++++++++++++ 1 file changed, 42 insertions(+) diff --git a/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md b/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md index ffd9302c1f..cc6fcf44ae 100644 --- a/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md +++ b/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md @@ -1,5 +1,6 @@ [调试器如何工作: Part 2 - 断点][26] ============================================================ + 这是调试器如何工作系列文章的第二部分,阅读本文前,请确保你已经读过[第一部分][27]。 ### 关于本文 @@ -424,3 +425,44 @@ world! [6] An observant reader can spot the translation of int 0x80 into cd 80 in the dumps listed above. + + + +-------------------------------------------------------------------------------- + +via: http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints + +作者:[Eli Bendersky][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://eli.thegreenplace.net/ +[1]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id1 +[2]:http://en.wikipedia.org/wiki/Out-of-order_execution +[3]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id2 +[4]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id3 +[5]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id4 +[6]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id5 +[7]:http://en.wikipedia.org/wiki/Executable_and_Linkable_Format +[8]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id6 +[9]:http://eli.thegreenplace.net/tag/articles +[10]:http://eli.thegreenplace.net/tag/debuggers +[11]:http://eli.thegreenplace.net/tag/programming +[12]:http://www.alexonlinux.com/how-debugger-works +[13]:http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html +[14]:http://mainisusuallyafunction.blogspot.com/2011/01/implementing-breakpoints-on-x86-linux.html +[15]:http://www.nasm.us/xdoc/2.09.04/html/nasmdoc0.html +[16]:http://stackoverflow.com/questions/2187484/elf-binary-entry-point +[17]:http://news.ycombinator.net/item?id=2131894 +[18]:http://www.deansys.com/doc/gdbInternals/gdbint_toc.html +[19]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id7 +[20]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id8 +[21]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id9 +[22]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id10 +[23]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id11 +[24]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id12 +[25]:https://github.com/eliben/code-for-blog/tree/master/2011/debuggers_part2_code +[26]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints +[27]:http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1/ From e50e20a73400c439a759ab7b1783a6350c8d91b7 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 14 May 2017 19:45:28 +0800 Subject: [PATCH 0065/1407] PRF:20170315 Hire a DDoS service to take down your enemies.md @kenxx --- ... DDoS service to take down your enemies.md | 50 ++++++++----------- 1 file changed, 22 insertions(+), 28 deletions(-) diff --git a/translated/talk/20170315 Hire a DDoS service to take down your enemies.md b/translated/talk/20170315 Hire a DDoS service to take down your enemies.md index f6db2d15bf..db22e357f8 100644 --- a/translated/talk/20170315 Hire a DDoS service to take down your enemies.md +++ b/translated/talk/20170315 Hire a DDoS service to take down your enemies.md @@ -1,62 +1,56 @@ -雇个 `DDoS` 服务干掉你的对手 +买个 DDoS 服务干掉你的对手 ======================== ->随着物联网设备的普及,网络犯罪分子提供拒绝服务攻击来占密码问题的便宜。 +> 随着物联网设备的普及,网络犯罪分子通过利用密码的缺陷而提供拒绝服务攻击。 ![](http://images.techhive.com/images/article/2016/12/7606416730_e659cea89c_o-100698667-large.jpg) -随物联网设备飞速发展,分布式拒绝服务攻击也变得越来越具有危险性了。就如 [DNS 服务商 Dyn 上年秋季之遭遇][3] 一样,黑客似乎瞄上了每个人,使用未受保护的物联网设备来轰炸网络正迎面而来。 +随着物联网设备飞速发展,分布式拒绝服务(DDoS)攻击正在成为一种危险的趋势。就如 [DNS 服务商 Dyn 上年秋季之遭遇][3] 一样,黑客似乎瞄上了每个人,使用未保护的物联网设备来轰炸网络的做法正在抬头。 -可雇用的分布式拒绝服务攻击的出现意味着每个会点技术的人都能精准报复一些网站。加大攻击能力甚至可以从系统级别的让一个公司完蛋。 +可雇佣的 DDoS 攻击的出现意味着即使是最不精通技术的人都能精准报复某些网站。就像在柜台前面买个东西一样方便,然后就可以彻底搞定一个公司。 -根据 [Neustar][4] 的报告,全球四分之三的品牌、组织和公司都是 `DDos` 攻击的受害者。[每天 `DDoS` 攻击发生次数][5] 不少于 3700 次。 +根据 [Neustar][4] 的报告,四分之三的国际品牌、机构和公司都是 DDoS 攻击的受害者。[每天至少会发生 3700 起 DDoS 攻击][5]。 +睿科网络公司(A10 Networks)网络运营总监 Chase Cunningham 说:“想要找个可用的物联网设备,你只需要在地下网站四处打听一下 Mirai 扫描器代码,一旦你找到了,你将能够利用在线的每一台设备来进行攻击”。 -#### [■ 相关阅读:如何判断假绑架信?][1] +“或者你可以去一些类似 Shodan 的网站,然后简单的搜一下设备特定的请求。当你得到这些信息之后,你就可以将你所雇佣的 DDoS 工具配置正确的流量模拟器类型、指向正确的目标并发动攻击。” - 睿科网络公司(A10 Networks)网络运营总监 Chase Cunningham 说:“想要找个可用的物联网设备,你只需要在地下网站找一个 `Mirai` 扫描器,一旦你得到了这款扫描器,你将能够利用在线的每一台设备来进行攻击”。 +“几乎所有东西都是可买卖的。”他补充道,“你可以购买一个 ‘stresser’,这就是个随便哪个会点按钮的人都会使用的 DDoS 僵尸网络。” -“或者你可以去一些类似 `Shodan` 的网站,然后简单的搜一下特殊设备的请求。当你得到这些信息之后,你就可以将你的雇佣的 `DDoS` 工具配置正确的流量模拟器类型、指向正确的目标并发动攻击。” +网络安全提供商 Imperva 说,用户只需要出几十美金,就可以快速发动攻击。有些公司在它们的网站上说它们的工具包含肉鸡负载和 CnC(命令与控制)文件。使用这些工具,那些有点想法的肉鸡大师(或者被称为 herders)就可以开始传播恶意软件,通过垃圾邮件、漏洞扫描程序、暴力攻击等来感染设备。 -“几乎所有东西都是可售的。”他补充道,“你可以购买一个‘stresser’,这就是个随便哪个会点按钮的人都会使用的 `DDoS` 功能的僵尸网络。” - ->当你得到这些信息之后,你就可以将你的雇佣的 `DDoS` 工具配置正确的流量模拟器类型、指向正确的目标并发动攻击。 - ->Chase Cunningham,睿科网络公司(A10 Networks)网络运营总监 - -网络安全提供商 Imperva 说,用户只需要出几十元美金,就可以快速发动攻击。有些公司编写了一些工具包含了肉鸡负载和 `CnC`(命令与控制)文件。使用这些工具,那些有点想法的肉鸡大师(或者说 `herders`)就可以开始通过垃圾邮件来传播使设备感染恶意软件、漏洞扫描程序、暴力攻击等等。 - -大部分 [stressers and booters][6] 都会有一个常见的、基于订阅的 `SaaS`(软件即服务)业务模式。来自 Incapsula 公司的 [Q2 2015 DDoS 报告][7] 显示,一个月范围内平均每小时就会有38美元(规模较低的在19.99美元)花在购买 `DDoS` 服务上。 +大部分 [stresser 和 booter][6] 都会有一个常见的、基于订阅服务的 SaaS(软件即服务)业务模式。来自 Incapsula 公司的 [Q2 2015 DDoS 报告][7] 显示,在 DDoS 上的月均每小时花费是 38 美元(规模较低的是 19.99 美元)。 ![雇佣ddos服务](http://images.techhive.com/images/article/2017/03/ddos-hire-100713247-large.jpg) -“`Stresser` 和 `booter` 只是一个新型现实的副产品,这些可以扳倒企业和组织的服务只被允许运作在灰色领域”,Imperva 写道。 +“stresser 和 booter 只是新世界的一个副产品,这些可以扳倒企业和机构的服务只能运作在灰色领域”,Imperva 写道。 -虽然成本不同,但是企业受到 [攻击可在任何地方,每次损失在 1.4 万美元到 235 万美元][8]。然而企业受到一次攻击后,[有 82% 的可能性会再次受到攻击][9]。 +虽然成本不同,但是企业受到的[各种攻击,每次损失在 1.4 万美元到 235 万美元之间][8]。而且企业受到一次攻击后,[有 82% 的可能性会再次受到攻击][9]。 -物联网洪水攻击(DoT, DDoS of Things)使用物联网设备建立僵尸网络可造成非常大规模的 `DDoS` 攻击。物联网洪水攻击会利用成百上千的物联网设备造成杠杆来攻击大型服务提供商。 +物联网洪水攻击(DoT,DDoS of Things)使用物联网设备建立的僵尸网络可造成非常大规模的 DDoS 攻击。物联网洪水攻击会利用成百上千的物联网设备攻击,无论是大型服务提供商还是企业,均无幸免。 -“大部分可信的 `DDoS` 卖家都会将他们的工具的配置设置的很简单,这样你就可以简单的更换配置开始攻击。虽然我还没怎么看到有哪些可以‘付费’物联网流量模拟器的选项,但我敢肯定准备要有了。如果是我来搞这个服务,我是绝对会加入这个选项的。”Cunningham 如是说。 +“大部分讲究声誉的 DDoS 卖家都会将他们的工具配置为可修改的,这样你就可以轻松地设置攻击的类型。虽然我还没怎么看到有哪些可以‘付费的’物联网流量模拟器的选项,但我敢肯定就要有了。如果是我来搞这个服务,我是绝对会加入这个选项的。”Cunningham 如是说。 -由 IDG 新闻服务的故事我们可知,要建造一个攻击服务的 `DDoS` 服务也可以很简单。通常黑客会租用 6 到 12 个左右的服务器,然后使用他们随意的攻击任何目标。十月下旬,HackForums.net [关闭][10]了他们的”服务器压力测试“部分,此次做法就是考虑到黑客可能通过使用他们十美元每月的服务建造可雇佣的 `DDoS` 服务。 +由 IDG 新闻服务的消息可知,要建造一个 DDoS 服务也是很简单的。通常黑客会租用 6 到 12 个左右的服务器,然后使用它们随意的攻击任何目标。去年十月下旬,HackForums.net [关闭][10]了他们的“服务器压力测试”版块,这个做法就是考虑到黑客可能通过使用他们每月十美元的服务建造可雇佣的 DDoS 服务。 -同样地在十二月时,美国和欧洲的执法机构 [逮捕][11] 34个参与可雇佣的 `DDoS` 服务的嫌犯。 +同样地在十二月时,美国和欧洲的执法机构 [逮捕][11] 34个参与可雇佣的 DDoS 服务的嫌犯。 -如果这很简单,怎么还没有经常发生攻击? +但是如果这很简单,怎么还没有经常发生攻击? -Cunningham 说这其实每时每刻都在发生,实际上每天每秒没完没了。他说:”你不知道的原因是因为大部分的都是扰乱攻击,而不是大规模的、想要搞倒公司的攻击。“ +Cunningham 说这其实每时每刻都在发生,实际上每天每秒都在发生。他说:”你不知道它们的原因是因为大部分都是扰乱攻击,而不是大规模的、想要搞倒公司的攻击。“ -他说,大部分的攻击平台只出售那些会让系统宕机一个小时或就长一点点的攻击。通常宕机一小时的攻击大概需要15到50美元的成本。当然这得看平台,有些可能想让其一小时就要花上百美元。 +他说,大部分的攻击平台只出售那些会让系统宕机一个小时或稍长一点的攻击。通常宕机一小时的攻击大概需要花费 15 到 50 美元。当然这得看平台,有些可能一小时就要花上百美元。 -减少这些攻击的解决方案是让用户把所有联网设备的恢复出厂设置的预设密码改掉,改掉默认密码然后还要禁用那些你不需要的功能。 +**减少这些攻击的解决方案是让用户把所有联网设备的出厂预置的密码改掉,然后还要禁用那些你不需要的功能。** +(题图:[Victor](https://www.flickr.com/photos/v1ctor/7606416730/)) -------------------------------------------------------------------------------- via: http://www.csoonline.com/article/3180246/data-protection/hire-a-ddos-service-to-take-down-your-enemies.html 作者:[Ryan Francis][a] 译者:[kenxx](https://github.com/kenxx) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 975c29e4310a67df4e6fd74d3c3b18df28dc11cd Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 14 May 2017 19:45:46 +0800 Subject: [PATCH 0066/1407] PUB:20170315 Hire a DDoS service to take down your enemies.md @kenxx --- .../20170315 Hire a DDoS service to take down your enemies.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/talk => published}/20170315 Hire a DDoS service to take down your enemies.md (100%) diff --git a/translated/talk/20170315 Hire a DDoS service to take down your enemies.md b/published/20170315 Hire a DDoS service to take down your enemies.md similarity index 100% rename from translated/talk/20170315 Hire a DDoS service to take down your enemies.md rename to published/20170315 Hire a DDoS service to take down your enemies.md From 5561d4fceba8cdf2d08feb092adefadbab08f0c1 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 14 May 2017 20:41:28 +0800 Subject: [PATCH 0067/1407] PUB:20170307 How to set up a personal web server with a Raspberry Pi.md @chenxinlong @jasminepeng --- ...personal web server with a Raspberry Pi.md | 101 ++++++++---------- 1 file changed, 47 insertions(+), 54 deletions(-) rename {translated/tech => published}/20170307 How to set up a personal web server with a Raspberry Pi.md (56%) diff --git a/translated/tech/20170307 How to set up a personal web server with a Raspberry Pi.md b/published/20170307 How to set up a personal web server with a Raspberry Pi.md similarity index 56% rename from translated/tech/20170307 How to set up a personal web server with a Raspberry Pi.md rename to published/20170307 How to set up a personal web server with a Raspberry Pi.md index 24d0aea995..b56888b094 100644 --- a/translated/tech/20170307 How to set up a personal web server with a Raspberry Pi.md +++ b/published/20170307 How to set up a personal web server with a Raspberry Pi.md @@ -1,30 +1,30 @@ -如何用树莓派搭建一个自己的 web 服务器 +如何用树莓派搭建个人 web 服务器 ============================================================ ![How to set up a personal web server with a Raspberry Pi](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/lightbulb_computer_person_general_.png?itok=ZY3UuQQa "How to set up a personal web server with a Raspberry Pi") + >图片来源 : opensource.com -个人网络服务器即 “云”,只不过是你拥有和控制它,而不是一个大型公司。 +个人 Web 服务器即 “云”,只不过是你拥有和控制它,而不是一个大型公司。 -拥有一个自己的云有很多好处,包括定制,免费存储,免费的互联网服务,开源软件的路径,高品质的安全性,完全控制您的内容,快速更改的能力,实验代码的地方等等。 这些好处大部分是无法估量的,但在财务上,这些好处可以为您每个月节省超过 100 美元。 +拥有一个自己的云有很多好处,包括可定制、免费存储、免费的互联网服务、通往开源软件之路、高安全性、完全控制您的内容、快速更改的能力、实验代码的地方等等。 这些好处大部分是无法估量的,但在财务上,这些好处可以为您每个月节省超过 100 美元。 ![Building your own web server with Raspberry Pi](https://opensource.com/sites/default/files/1-image_by_mitchell_mclaughlin_cc_by-sa_4.0.png "Building your own web server with Raspberry Pi") -图片来自 Mitchell McLaughlin, CC BY-SA 4.0 我本可以选择 AWS ,但我更喜欢完全自由且安全性可控,并且我可以学一下这些东西是如何搭建的。 -* 私有主机: 不使用 BlueHost 或 DreamHost -* 云存储:不使用 Dropbox, Box, Google Drive, Microsoft Azure, iCloud, 或是 AWS -* 内部部署安全 +* 私有 Web 托管:而非 BlueHost 或 DreamHost +* 云存储:而非 Dropbox、Box、Google Drive、Microsoft Azure、iCloud 或是 AWS +* 自主部署安全 * HTTPS:Let’s Encrypt * 分析: Google -* OpenVPN:不需要专有互联网连接 (预计每个月花费 $7) +* OpenVPN:不需要专有互联网连接(预计每个月花费 $7) 我所使用的物品清单: * 树莓派 3 代 Model B -*   MicroSD 卡(推荐使用 32 GB, [兼容树莓派的 SD 卡][a1]) +*   MicroSD 卡(推荐使用 32 GB, [兼容树莓派的 SD 卡][a1]) *   USB microSD 卡读卡器 * 以太网络线 * 连接上 Wi-Fi 的路由器 @@ -37,36 +37,38 @@ * 显示器 (支持接入 HDMI) * MacBook Pro -### 步骤 1: 启动树莓派 +### 步骤 1: 启动树莓派 -下载最新发布的 Raspbian (树莓派的操作系统)。 [Raspbian Jessie][a6] 的 ZIP 包就可以用 [1]。解压缩或提取下载的文件然后把它拷贝到 SD 卡里。使用 [Pi Filler][a7] 可以让这些过程变得更简单。[下载 Pi Filer 1.3][8] 或最新的版本。解压或提取下载文件之后打开它,你应该会看到这样的提示: +下载最新发布的 Raspbian (树莓派的操作系统)。 [Raspbian Jessie][a6] 的 ZIP 包就可以用 [脚注 1]。解压缩或提取下载的文件然后把它拷贝到 SD 卡里。使用 [Pi Filler][a7] 可以让这些过程变得更简单。[下载 Pi Filer 1.3][8] 或最新的版本。解压或提取下载文件之后打开它,你应该会看到这样的提示: ![Pi Filler prompt](https://opensource.com/sites/default/files/2-image_by_mitchell_mclaughlin_cc_by-sa_4.0.png "Pi Filler prompt") -确保 USB 读卡器这时还没有插上。如果已经插上了那就先推出。点 Continue 继续下一步。你会看到一个让你选择文件的界面,选择你之前解压缩后的树莓派系统文件。然后你会看到另一个提示,如图所示: +确保 USB 读卡器这时还没有插上。如果已经插上了那就先弹出。点 “Continue” 继续下一步。你会看到一个让你选择文件的界面,选择你之前解压缩后的树莓派系统文件。然后你会看到另一个提示,如图所示: ![USB card reader prompt](https://opensource.com/sites/default/files/3-image_by_mitchell_mclaughlin_cc_by-sa_4.0.png "USB card reader") -把 MicroSD 卡 (推荐 32 GB ,至少 16GB) 插入到 USB MicroSD 卡读卡器里。然后把 USB 读卡器接入到你的电脑里。你可以把你的 SD 卡重命名为 “Raspberry” 以区别其他设备。然后点击 continue。请先确保你的 SD 卡是空的,因为 Pi Filler 会在运行时 _擦除_ 所有事先存在 SD 卡里的内容。如果你要备份卡里的内容,那你最好就马上备份。当你点 continue 的时候,Raspbian OS 就会被写入到 SD 卡里。这个过程大概会花费一到三分钟左右。当写入完成后,推出 USB 读卡器,把 SD 卡拔出来插入到树莓派的 SD 卡槽里。把电源线接上,给树莓派提供电源。这时树莓派就会自己启动。树莓派的默认登录账户信息是: +把 MicroSD 卡(推荐 32 GB ,至少 16GB)插入到 USB MicroSD 卡读卡器里。然后把 USB 读卡器接入到你的电脑里。你可以把你的 SD 卡重命名为 “Raspberry” 以区别其他设备。然后点击 “Continue”。请先确保你的 SD 卡是空的,因为 Pi Filler 会在运行时 _擦除_ 所有事先存在 SD 卡里的内容。如果你要备份卡里的内容,那你最好就马上备份。当你点 “Continue” 的时候,Raspbian OS 就会被写入到 SD 卡里。这个过程大概会花费一到三分钟左右。当写入完成后,推出 USB 读卡器,把 SD 卡拔出来插入到树莓派的 SD 卡槽里。把电源线接上,给树莓派供电。这时树莓派就会自己启动。树莓派的默认登录账户信息是: -**用户名: pi -密码: raspberry** +- 用户名: pi +- 密码:raspberry -当树莓派首次启动完成时,会跳出一个标题为 设置选项Setup Options 的配置界面,就像下面的图片一样 [2]: +当树莓派首次启动完成时,会跳出一个标题为 “设置选项Setup Options” 的配置界面,就像下面的图片一样 [脚注 2]: ![Raspberry Pi software configuration setup](https://opensource.com/sites/default/files/4-image_by_mitchell_mclaughlin_cc_by-sa_4.0.png "Raspberry Pi software configuration setup") -选择 “Expand Filesystem” 这一选项并回车 [3]。 同时,我还推荐选择第二个选项 “Change User Password”。这对保证安全性来说尤为重要。它还能个性化你的树莓派。 +选择 “扩展文件系统Expand Filesystem” 这一选项并回车 [脚注 3]。 同时,我还推荐选择第二个选项 “修改密码Change User Password”。这对保证安全性来说尤为重要。它还能个性化你的树莓派。 -在选项列表中选择第三项 “Enable Boot To Desktop/Scratch” 并回车。这时会跳到另一个标题为 “Choose boot option” 的界面,就像下面这张图这样。 +在选项列表中选择第三项 “启用引导到桌面Enable Boot To Desktop/Scratch” 并回车。这时会跳到另一个标题为 “选择引导选项Choose boot option” 的界面,就像下面这张图这样: ![Choose boot option](https://opensource.com/sites/default/files/5-image_by_mitchell_mclaughlin_cc_by-sa_4.0.png "Choose boot option") -在 “Choose boot option” 这个界面选择第二个选项 “Desktop log in as user 'pi' at the graphical desktop” 并回车 [4]。完成这个操作之后会回到之前的 “Setup Options” 界面。如果没有回到之前的界面的话就选择当前界面底部的 “OK” 按钮并回车。 +在这个界面选择第二个选项 “以用户‘pi’登录图形化桌面Desktop log in as user 'pi' at the graphical desktop” 并回车 [脚注 4]。完成这个操作之后会回到之前的 “设置选项Setup Options” 界面。如果没有回到之前的界面的话就选择当前界面底部的 “OK” 按钮并回车。 当这些操作都完成之后,选择当前界面底部的 “Finish” 按钮并回车,这时它就会自动重启。如果没有自动重启的话,就在终端里使用如下命令来重启。 -**$ sudo reboot** +``` +$ sudo reboot +``` 接上一步的重启,如果所有步骤都顺利进行的话,你会进入到类似下面这样桌面环境中。 @@ -76,17 +78,14 @@ ``` $ sudo apt-get update - $ sudo apt-get upgrade-y - $ sudo apt-get dist-upgrade -y - $ sudo rpi-update ``` 这些操作可能会花费几分钟时间。完成之后,现在运行着的树莓派就是最新的了。 -### 步骤 2: 配置树莓派 +### 步骤 2: 配置树莓派 SSH 指的是 Secure Shell,是一种加密网络协议,可让你在计算机和树莓派之间安全地传输数据。 你可以从 Mac 的命令行控制你的树莓派,而无需显示器或键盘。 @@ -96,9 +95,9 @@ SSH 指的是 Secure Shell,是一种加密网络协议,可让你在计算机 $ sudo ifconfig ``` -如果你在使用以太网,看 “eth0” 部分。如果你在使用 Wi-Fi, 看 “wlan0” 部分。 +如果你在使用以太网,看 `eth0` 部分。如果你在使用 Wi-Fi, 看 `wlan0` 部分。 -查找 “inet addr”,后跟一个 IP 地址,如 192.168.1.115,这是本篇文章中使用的默认 IP。 +查找 `inet addr`,后跟一个 IP 地址,如 192.168.1.115,这是本篇文章中使用的默认 IP。 有了这个地址,在终端中输入 : @@ -106,9 +105,9 @@ $ sudo ifconfig $ ssh pi@192.168.1.115 ``` -对于 PC 上的 SSH,请参见脚注 [5]。 +对于 PC 上的 SSH,请参见 [脚注 5]。 -出现提示时输入默认密码 “raspberry”,除非你之前更改过密码。 +出现提示时输入默认密码 `raspberry`,除非你之前更改过密码。 现在你已经通过 SSH 登录成功。 @@ -120,22 +119,18 @@ $ ssh pi@192.168.1.115 $ sudo apt-get install xrdp ``` -Xrdp 支持 Mac 和 PC 的 Microsoft Remote Desktop 客户端。 +xrdp 支持 Mac 和 PC 的 Microsoft Remote Desktop 客户端。 -在 Mac 上,在 App store 中搜索 “Microsoft Remote Desktop”。 下载它。 (对于 PC,请参见脚注 [6]。) +在 Mac 上,在 App store 中搜索 “Microsoft Remote Desktop”。 下载它。 (对于 PC,请参见 [脚注 6]。) 安装完成之后,在你的 Mac 中搜索一个叫 “Microsoft Remote Desktop” 的应用并打开它,你会看到 : ![Microsoft Remote Desktop](https://opensource.com/sites/default/files/7-image_by_mitchell_mclaughlin_cc_by-sa_4.0.png "Microsoft Remote Desktop") -*图片来自 Mitchell McLaughlin, CC BY-SA 4.0* - 点击 “New” 新建一个远程连接,在空白处填写如下配置。 ![Setting up a remote connection](https://opensource.com/sites/default/files/8-image_by_mitchell_mclaughlin_cc_by-sa_4.0.png "Setting up a remote connection") -*图片来自 Mitchell McLaughlin, CC BY-SA 4.0* - 关闭 “New” 窗口就会自动保存。 你现在应该看到 “My Desktop” 下列出的远程连接。 双击它。 @@ -146,7 +141,7 @@ Xrdp 支持 Mac 和 PC 的 Microsoft Remote Desktop 客户端。 好了,现在你不需要额外的鼠标、键盘或显示器就能控制你的树莓派。这是一个更为轻量级的配置。 -### 静态本地 IP 地址 +### 静态化本地 IP 地址 有时候你的本地 IP 地址 192.168.1.115 会发生改变。我们需要让这个 IP 地址静态化。输入: @@ -154,17 +149,17 @@ Xrdp 支持 Mac 和 PC 的 Microsoft Remote Desktop 客户端。 $ sudo ifconfig ``` -从 “eth0” 部分或 “wlan0” 部分,“inet addr”(树莓派当前 IP),“bcast”(广播 IP 范围)和 “mask”(子网掩码地址))中写入。 然后输入: +从 `eth0` 部分或 `wlan0` 部分,记下 `inet addr`(树莓派当前 IP),`bcast`(广播 IP 范围)和 `mask`(子网掩码地址)。 然后输入: ``` $ netstat -nr ``` -记下 “destination” 和 “gateway/network”。 +记下 `destination` 和 `gateway/network`。 ![Setting up a local IP address](https://opensource.com/sites/default/files/setting_up_local_ip_address.png "Setting up a local IP address") -应该大概是这样子的: +大概应该是这样子的: ``` net address 192.168.1.115 @@ -181,7 +176,7 @@ destination 192.168.1.0 $ sudo nano /etc/dhcpcd.conf ``` -不要使用 **/etc/network/interfaces**。 +不要去动 `/etc/network/interfaces`。 剩下要做的就是把这些内容追加到这个文件的底部,把 IP 换成你想要的 IP 地址。 @@ -206,25 +201,25 @@ $ sudo ifconfig 这时你就可以看到你的树莓派上的新的静态配置了。 -### 静态全局 IP address +### 静态化全局 IP 地址 如果您的 ISP(互联网服务提供商)已经给您一个静态外部 IP 地址,您可以跳到端口转发部分。 如果没有,请继续阅读。 -你已经设置了 SSH,远程桌面和静态内部 IP 地址,因此现在本地网络中的计算机将会知道在哪里可以找到你的树莓派。 但是你仍然无法从本地 Wi-Fi 网络外部访问你的树莓派。 你需要树莓派可以从互联网上的任何地方公开访问。这需要静态外部 IP 地址 [7]。 +你已经设置了 SSH、远程桌面和静态内部 IP 地址,因此现在本地网络中的计算机将会知道在哪里可以找到你的树莓派。 但是你仍然无法在本地 Wi-Fi 网络外部访问你的树莓派。 你需要树莓派可以从互联网上的任何地方公开访问。这需要静态的外部 IP 地址 [脚注 7]。 -调用您的 ISP 并请求静态外部(有时称为静态全局)IP 地址可能会是一个非常敏感的过程。 ISP 拥有决策权,所以我会非常小心处理。 他们可能拒绝你的的静态外部 IP 地址请求。 如果他们拒绝了你的请求,你不要怪罪于他们,因为这种类型的请求有法律和操作风险。 他们特别不希望客户运行中型或大型互联网服务。 他们可能会明确地询问为什么需要一个静态的外部 IP 地址。 最好说实话,告诉他们你打算主办一个低流量的个人网站或类似的小型非营利互联网服务。 如果一切顺利,他们应该会建立一个任务,并在一两个星期内给你打电话。 +联系您的 ISP 并请求静态的外部(有时称为静态全局)IP 地址可能会是一个非常敏感的过程。 ISP 拥有决策权,所以我会非常小心处理。 他们可能拒绝你的的静态外部 IP 地址请求。 如果他们拒绝了你的请求,你不要怪罪于他们,因为这种类型的请求有法律和操作风险。 他们特别不希望客户运行中型或大型互联网服务。 他们可能会明确地询问为什么需要一个静态的外部 IP 地址。 最好说实话,告诉他们你打算主办一个低流量的个人网站或类似的小型非营利互联网服务。 如果一切顺利,他们应该会建立一个工单,并在一两个星期内给你打电话。 ### 端口转发 这个新获得的 ISP 分配的静态全局 IP 地址是用于访问路由器。 树莓派现在仍然无法访问。 你需要设置端口转发才能访问树莓派。 -端口是信息在互联网上传播的虚拟途径。 你有时需要转发端口,以使计算机像树莓派一样可以访问 Internet,因为它位于网络路由器后面。 VollmilchTV 专栏在 YouTube 上的一个视频,名字是[什么是 TCP/IP,端口,路由,Intranet,防火墙,互联网][9],帮助我更好地了解端口。 +端口是信息在互联网上传播的虚拟途径。 你有时需要转发端口,以使计算机像树莓派一样可以访问 Internet,因为它位于网络路由器后面。 VollmilchTV 专栏在 YouTube 上的一个视频,名字是[什么是 TCP/IP,端口,路由,Intranet,防火墙,互联网][9],可以帮助你更好地了解端口。 -端口转发可用于像 树莓派 Web 服务器或 VoIP 或点对点下载的应用程序。 有 [65,000+个端口][10]可供选择,因此你可以为你构建的每个 Internet 应用程序分配一个不同的端口。 +端口转发可用于像 树莓派 Web 服务器或 VoIP 或点对点下载的应用程序。 有 [65000个以上的端口][10]可供选择,因此你可以为你构建的每个 Internet 应用程序分配一个不同的端口。 -设置端口转发的方式取决于你的路由器。 如果你有 Linksys 的话,Gabriel Ramirez 在 YouTbue 上有一个标题叫 [How to go online with your Apache Ubuntu server][a2] 的视频解释了如何设置。 如果您没有 Linksys,请阅读路由器附带的文档,以便自定义和定义要转发的端口。 +设置端口转发的方式取决于你的路由器。 如果你有 Linksys 的话,Gabriel Ramirez 在 YouTbue 上有一个标题叫 [如何让你的 Apache Ubuntu 服务器连到互联网][a2] 的视频解释了如何设置。 如果您没有 Linksys,请阅读路由器附带的文档,以便自定义和定义要转发的端口。 -你将需要转发 SSH 以及远程桌面端口。 +你需要转发 SSH 以及远程桌面端口。 如果你认为你已经过配置端口转发了,输入下面的命令以查看它是否正在通过 SSH 工作: @@ -234,17 +229,17 @@ $ ssh pi@your_global_ip_address 它应该会提示你输入密码。 -检查端口转发是否也适用于远程桌面。 打开 Microsoft Remote Desktop。 你之前的的远程连接设置应该已经保存了,但需要使用静态外部 IP 地址(例如195.198.227.116)来更新 “PC名称” 字段,而不是静态内部地址(例如 192.168.1.115)。 +检查端口转发是否也适用于远程桌面。 打开 Microsoft Remote Desktop。 你之前的的远程连接设置应该已经保存了,但需要使用静态的外部 IP 地址(例如 195.198.227.116)来更新 “PC 名称” 字段,而不是静态的内部地址(例如 192.168.1.115)。 -现在,尝试通过远程桌面连接。 它应该简单地加载并到达树莓派的桌面。 +现在,尝试通过远程桌面连接。 它应该简单地加载并显示树莓派的桌面。 ![Raspberry Pi desktop](https://opensource.com/sites/default/files/6-image_by_mitchell_mclaughlin_cc_by-sa_4.0_1.png "Raspberry Pi desktop") 好了, 树莓派现在可以从互联网上访问了,并且已经准备好进行高级项目了。 -作为一个奖励选项,您可以保持两个远程连接到您的 Pi。 一个通过互联网,另一个通过 LAN(局域网)。很容易设置。在 Microsoft Remote Desktop 中,保留一个称为 “Pi Internet” 的远程连接,另一个称为 “Pi Local”。 将 Pi Internet 的 “PC name” 配置为静态外部 IP 地址,例如 195.198.227.116。 将 Pi Local 的 “PC name” 配置为静态内部 IP 地址,例如192.168.1.115。 现在,您可以选择在全球或本地连接。 +作为一个奖励选项,您可以保持到您的 Pi 的两个远程连接。 一个通过互联网,另一个通过 LAN(局域网)。很容易设置。在 Microsoft Remote Desktop 中,保留一个称为 “Pi Internet” 的远程连接,另一个称为 “Pi Local”。 将 Pi Internet 的 “PC 名称” 配置为静态外部 IP 地址,例如 195.198.227.116。 将 Pi Local 的 “PC 名称” 配置为静态内部 IP 地址,例如 192.168.1.115。 现在,您可以选择在全局或本地连接。 -如果你还没有看过由 Gabriel Ramirez 发布的 [如何使用您的Apache Ubuntu服务器上线][a3],那么你可以去看一下,作为过渡到第二个项目的教程。 它将向您展示项目背后的技术架构。 在我们的例子中,你使用的是树莓派而不是 Ubuntu 服务器。 动态 DNS 位于域公司和您的路由器之间,这是 Ramirez 省略的部分。 除了这个微妙之处外,视频是在整体上解释系统的工作原理。 您可能会注意到本教程涵盖了树莓派设置和端口转发,这是服务器端或后端。 查看原始来源,涵盖域名,动态 DNS,Jekyll(静态 HTML 生成器)和 Apache(网络托管)的更高级项目,这是客户端或前端。 +如果你还没有看过由 Gabriel Ramirez 发布的 [如何让你的 Apache Ubuntu 服务器连到互联网][a3],那么你可以去看一下,作为过渡到第二个项目的教程。 它将向您展示项目背后的技术架构。 在我们的例子中,你使用的是树莓派而不是 Ubuntu 服务器。 动态 DNS 位于域名公司和您的路由器之间,这是 Ramirez 省略的部分。 除了这个微妙之处外,视频是在整体上解释系统的工作原理。 您可能会注意到本教程涵盖了树莓派设置和端口转发,这是服务器端或后端。 查看原始来源,涵盖域名,动态 DNS,Jekyll(静态 HTML 生成器)和 Apache(网络托管)的更高级项目,这是客户端或前端。 ### 脚注 @@ -264,7 +259,7 @@ $ sudo-rasps-config ![PuTTY configuration](https://opensource.com/sites/default/files/putty_configuration.png "PuTTY configuration") -[下载并运行 PuTTY][11] 或 Windows 的另一个 SSH 客户端。 在该字段中输入你的 IP 地址,如上图所示。 将默认端口保留在 22。 回车,PuTTY 将打开一个终端窗口,提示你输入用户名和密码。 填写然后开始在树莓派上进行你的远程工作。 +[下载并运行 PuTTY][11] 或 Windows 的其它 SSH 客户端。 在该字段中输入你的 IP 地址,如上图所示。 将默认端口保留为 22。 回车,PuTTY 将打开一个终端窗口,提示你输入用户名和密码。 填写然后开始在树莓派上进行你的远程工作。 [6] 如果尚未安装,请下载 [Microsoft Remote Desktop][12]。 搜索您的计算机上的的 Microsoft Remote Desktop。 运行。 提示时输入 IP 地址。 接下来,会弹出一个 xrdp 窗口,提示你输入用户名和密码。 @@ -276,12 +271,10 @@ $ sudo-rasps-config 作者简介: -Mitchell McLaughlin - 我是一名开放网络的贡献者和开发者。我感兴趣的领域很广泛,但我特别喜欢开源软件/硬件,比特币和编程。 我住在旧金山 我有过一些简短的 GoPro 和 Oracle 工作经验。 - +Mitchell McLaughlin - 我是一名开放网络的贡献者和开发者。我感兴趣的领域很广泛,但我特别喜欢开源软件/硬件,比特币和编程。 我住在旧金山,我有过一些简短的 GoPro 和 Oracle 工作经验。 ------------- - via: https://opensource.com/article/17/3/building-personal-web-server-raspberry-pi-3 作者:[Mitchell McLaughlin ][a] From 6b0b9e54c28ce848efc6be0ddf53fab983bf4729 Mon Sep 17 00:00:00 2001 From: Dot Date: Sun, 14 May 2017 22:28:59 +0800 Subject: [PATCH 0068/1407] translated --- ...est Third-Party Repositories for CentOS.md | 109 ------------------ ...est Third-Party Repositories for CentOS.md | 106 +++++++++++++++++ 2 files changed, 106 insertions(+), 109 deletions(-) delete mode 100644 sources/tech/20170210 Best Third-Party Repositories for CentOS.md create mode 100644 translated/tech/20170210 Best Third-Party Repositories for CentOS.md diff --git a/sources/tech/20170210 Best Third-Party Repositories for CentOS.md b/sources/tech/20170210 Best Third-Party Repositories for CentOS.md deleted file mode 100644 index d2e52675a6..0000000000 --- a/sources/tech/20170210 Best Third-Party Repositories for CentOS.md +++ /dev/null @@ -1,109 +0,0 @@ -Dotcra translating -Best Third-Party Repositories for CentOS -============================================================ - - - ![CentOS](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/centos.png?itok=YRMQVk7U "CentOS") ->Get reliable up-to-date packages for CentOS from the Software Collections repository, EPEL, and Remi.[Creative Commons Attribution][1] - -Red Hat Enterprise Linux, in the grand tradition of enterprise software vendors, packages and supports old mold long after it should be dead and buried. They don't do this out of laziness, but because that is what their customers want. A lot of businesses view software the same way they see furniture: you buy a desk once and keep it forever, and software is just like a desk. - -CentOS, as a RHEL clone, suffers from this as well. Red Hat supports deprecated software that is no longer supported by upstream -- presumably patching security holes and keeping it working. But that is not good enough when you are running a software stack that requires newer versions. I have bumped into this numerous times running web servers on RHEL and CentOS. LAMP stacks are not forgiving, and every piece of the stack must be compatible with all of the others. For example, last year I had ongoing drama with RHEL/CentOS because version 6 shipped with PHP 5.3, and version 7 had PHP 5.4\. PHP 5.3 was end-of-life in August, 2014 and unsupported by upstream. PHP 5.4 went EOL in Sept. 2015, and 5.5 in July 2016\. MySQL, Python, and many other ancient packages that should be on display in museums as mummies also ship in these releases. - -So, what's a despairing admin to do? If you run both RHEL and CentOS turn first to the [Software Collections][3], as this is only Red Hat-supported source of updated packages. There is a Software Collections repository for CentOS, and installing and managing it is similar to any third-party repository, with a couple of unique twists. (If you're running RHEL, the procedure is different, as it is for all software management; you must do it [the RHEL way][4].) Software Collections also supports Fedora and Scientific Linux. - -### Installing Software Collections - -Install Software Collections on CentOS 6 and 7 with this command: - -``` -$ sudo yum install centos-release-scl -``` - -Then use Yum to search for and install packages in the usual way: - -``` -$ yum search php7 - [...] - rh-php70.x86_64 : Package that installs PHP 7.0 - [...] -$ sudo yum install rh-php70 -``` - -This may also pull in `centos-release-scl-rh` as a dependency. - -There is one more step, and that is enabling your new packages: - -``` -$ scl enable rh-php70 bash -$ php -v -PHP 7.0.10 -``` - -This runs a script that loads the new package and changes your environment, and you should see a change in your prompt. You must also install the appropriate connectors for the new package if necessary, for example for Python, PHP, and MySQL, and update configuration files (e.g., Apache) to use the new version. - -The SCL package will not be active after reboot. SCL is designed to run your old and new versions side-by-side and not overwrite your existing configurations. You can start your new packages automatically by sourcing their `enable` scripts in `.bashrc`. SCL installs everything into `opt`, so add this line to `.bashrc` for our PHP 7 example: - -``` -source /opt/rh/rh-php70/enable -``` - -It will automatically load and be available at startup, and you can go about your business cloaked in the warm glow of fresh up-to-date software. - -### Listing Available Packages - -So, what exactly do you get in Software Collections on CentOS? There are some extra community-maintained packages in `centos-release-scl`. You can see package lists in the [CentOS Wiki][5], or use Yum. First, let's see all our installed repos: - -``` -$ yum repolist -[...] -repo id repo name -base/7/x86_64 CentOS-7 - Base -centos-sclo-rh/x86_64 CentOS-7 - SCLo rh -centos-sclo-sclo/x86_64 CentOS-7 - SCLo sclo -extras/7/x86_64 CentOS-7 - Extras -updates/7/x86_64 CentOS-7 - Updates -``` - -Yum does not have a simple command to list packages in a single repo, so you have to do this: - -``` -$ yum --disablerepo "*" --enablerepo centos-sclo-rh \ - list available | less -``` - -This use of the `--disablerepo` and `--enablerepo` options is not well documented. You're not really disabling or enabling anything, but only limiting your search query to a single repo. It spits out a giant list of packages, and that is why we pipe it through `less`. - -### EPEL - -The excellent Fedora peoples maintain the [EPEL, Extra Packages for Enterprise Linux][6] repository for Fedora and all RHEL-compatible distributions. This contains updated package versions and software that is not included in the stock distributions. Install software from EPEL in the usual way, without having to bother with enable scripts. Specify that you want packages from EPEL using the `--disablerepo` and `--enablerepo` options: - -``` -$ sudo yum --disablerepo "*" --enablerepo epel install [package] -``` - -### Remi Collet - -Remi Collet maintains a large collection of updated and extra packages at [Remi's RPM repository][7]. Install EPEL first as Remi's repo depends on it. - -The CentOS wiki has a list of [additional third-party repositories][8] to use, and some to avoid. - --------------------------------------------------------------------------------- - -via: https://www.linux.com/learn/intro-to-linux/2017/2/best-third-party-repositories-centos - -作者:[CARLA SCHRODER][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.linux.com/users/cschroder -[1]:https://www.linux.com/licenses/category/creative-commons-attribution -[2]:https://www.linux.com/files/images/centospng -[3]:https://www.softwarecollections.org/en/ -[4]:https://access.redhat.com/solutions/472793 -[5]:https://wiki.centos.org/SpecialInterestGroup/SCLo/CollectionsList -[6]:https://fedoraproject.org/wiki/EPEL -[7]:http://rpms.remirepo.net/ -[8]:https://wiki.centos.org/AdditionalResources/Repositories diff --git a/translated/tech/20170210 Best Third-Party Repositories for CentOS.md b/translated/tech/20170210 Best Third-Party Repositories for CentOS.md new file mode 100644 index 0000000000..cabc81df2d --- /dev/null +++ b/translated/tech/20170210 Best Third-Party Repositories for CentOS.md @@ -0,0 +1,106 @@ +CentOS 最好用的第三方仓库 +============================================================ + + + ![CentOS](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/centos.png?itok=YRMQVk7U "CentOS") +>CentOS 上从 Software Collections, EPEL, 和 Remi 获得可靠的新版软件。[Creative Commons Attribution][1] + +在 RHEL 上,为那些早已老掉牙的软件提供支持已经是厂家的传统了。这倒不是因为他们懒,而确实是用户需要。很多公司像看待家具一样看待软件:我买一张桌子,能用一辈子,软件不应该也这样吗? + +CentOS 作为 RHEL 的复制品有着同样的遭遇。虽然 Red Hat 还在为这些被厂商抛弃的过时软件提供支持、修补安全漏洞等,但如果你的应用依赖新版软件,你就得想办法了。 我在这个问题上不止一次碰壁。 LAMP 组合里任一个组件都需要其他所有组件能与其兼容,这有时就显得很麻烦。 比如说去年我就被 RHEL/CentOS 折腾得够呛。第 6 版最高支持 PHP 5.3 ,第 7 版支持到 PHP 5.4 。而 PHP 5.3 早在 2014 年 8 月就到达 EOL(End Of Life) ,不再被厂商支持了, PHP 5.4 的 EOL 在 2015 年 9 月, 5.5 则是 2016 年 7 月。 有太多古老的软件版本,包括 MySQL ,Python 等,它们应该像木乃伊一样被展示在博物馆里,但它们却在你的系统上。 + +那么,可怜的管理员们该怎么办呢?如果你跑着 RHEL/CentOS ,那应该先试试 [Software Collections][3],因为这是 Red Hat 唯一支持的新软件包源。 [Software Collections][3] 为 CentOS 设立了专门的仓库,安装和管理都和其他第三方仓库一样。但如果你用的是 RHEL 的,情况就有点不同了,具体请参考 [the RHEL way][4] 。[Software Collections][3] 同样支持 Fedora 和 Scientific Linux 。 + +### 安装 Software Collections + +在 CentOS 6/7 上安装 Software Collections 的命令如下: + +``` +$ sudo yum install centos-release-scl +``` +`centos-release-scl-rh` 可能作为依赖被同时安装。 + +然后就可以像平常一样搜索、安装软件包了: + +``` +$ yum search php7 + [...] + rh-php70.x86_64 : Package that installs PHP 7.0 + [...] +$ sudo yum install rh-php70 +``` + +最后一件事就是启用你的新软件包: + +``` +$ scl enable rh-php70 bash +$ php -v +PHP 7.0.10 +``` + +此命令会开启一个新的 bash 并配置好环境变量以便运行新软件包。 如果需要的话,你还得为 Python ,PHP,MySQL 等安装对应的扩展包,有些配置文件也需要修改以指向新版软件(比如 Apache )。 + +上面设置的环境变量 PATH 并不会保存,重启后要重新设置。SCL 的设计初衷就是在不影响原有配置的前提下,让新旧软件能一起运行。不过你可以通过 `~/.bashrc` 加载 SCL 提供的脚本来实现自动启用。 SCL 的所有软件包都安装在 `/opt` 下, 以我们的 PHP 7 为例,在 `~/.bashrc` 里加入一行: + +``` +source /opt/rh/rh-php70/enable +``` + +以后相应的软件包就能在重启后自动启用了。有新软件保驾护航,你终于可以专注于自己的业务了。 + +### 打印出可用软件包 + +那么,到底 Software Collections 里都是些什么呢? centos-release-scl 里有一些额外的由社区维护的软件包。除了在 [CentOS Wiki][5] 查看软件包列表外,你还可以使用 Yum 。我们先来看看安装了哪些仓库: + +``` +$ yum repolist +[...] +repo id repo name +base/7/x86_64 CentOS-7 - Base +centos-sclo-rh/x86_64 CentOS-7 - SCLo rh +centos-sclo-sclo/x86_64 CentOS-7 - SCLo sclo +extras/7/x86_64 CentOS-7 - Extras +updates/7/x86_64 CentOS-7 - Updates +``` + +Yum 没有专门用来打印某一个仓库中所有软件包的命令,所以你得这样来: (译者注:实际上有,`yum repo-pkgs REPO list`,需要root 权限,dnf 同) +``` +$ yum --disablerepo "*" --enablerepo centos-sclo-rh \ + list available | less +``` + +`--disablerepo` 与 `--enablerepo` 选项的用法没有详细的文档,这里简单说下。 实际上在这个命令里你并没有禁用或启用什么东西,而只是将你的搜索范围限制在某一个仓库内。 此命令会打印出一个很长的列表,所以我们用管道传递给 `less` 输出。 + +### EPEL + +强大的 Fedora 社区为 Feora 及所有 RHEL 系的发行版维护着 [EPEL, Extra Packages for Enterprise Linux][6] 。 里面包含一些最新软件包以及一些未被发行版收纳的软件包。安装 EPEL 里的软件就不用麻烦 enable 脚本了,直接像平常一样用。你还可以用 `--disablerepo` 和 `--enablerepo` 选项指定从 EPEL 里安装软件包: + +``` +$ sudo yum --disablerepo "*" --enablerepo epel install [package] +``` + +### Remi Collet + +Remi Collet 在 [Remi's RPM repository][7] 维护着大量额外的最新软件包。先安装 EPEL ,因为 Remi 仓库依赖它。 + +CentOS wiki 上有较完整的仓库列表 [additional third-party repositories][8] ,用哪些,不用哪些,里面都有建议。 + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/learn/intro-to-linux/2017/2/best-third-party-repositories-centos + +作者:[CARLA SCHRODER][a] +译者:[Dotcra](https://github.com/Dotcra) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.linux.com/users/cschroder +[1]:https://www.linux.com/licenses/category/creative-commons-attribution +[2]:https://www.linux.com/files/images/centospng +[3]:https://www.softwarecollections.org/en/ +[4]:https://access.redhat.com/solutions/472793 +[5]:https://wiki.centos.org/SpecialInterestGroup/SCLo/CollectionsList +[6]:https://fedoraproject.org/wiki/EPEL +[7]:http://rpms.remirepo.net/ +[8]:https://wiki.centos.org/AdditionalResources/Repositories From 2c5518b6a373dc2b03b378b09d879b624ab219b0 Mon Sep 17 00:00:00 2001 From: Flynn Date: Mon, 15 May 2017 00:22:57 +0800 Subject: [PATCH 0069/1407] Translated --- ...to make file-specific setting changes in Vim using Modeline.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {sources => translated}/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md (100%) diff --git a/sources/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md b/translated/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md similarity index 100% rename from sources/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md rename to translated/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md From b730fe97b75722efc8d1d336f30505fd9b448068 Mon Sep 17 00:00:00 2001 From: Flynn Date: Mon, 15 May 2017 00:25:58 +0800 Subject: [PATCH 0070/1407] Translated --- ...c setting changes in Vim using Modeline.md | 77 +++++++++---------- 1 file changed, 38 insertions(+), 39 deletions(-) diff --git a/translated/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md b/translated/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md index f8bf7eb43e..ecb1f82826 100644 --- a/translated/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md +++ b/translated/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md @@ -1,80 +1,79 @@ -ucasFL translating -How to make file-specific setting changes in Vim using Modeline +如何在 Vim 中使用模式行进行文件特定设置的更改 ============================================================ -### On this page +### 摘要 -1. [VIM Modeline][2] - 1. [Usage][1] -2. [Conclusion][3] +1. [VIM 模式行][2] + 1. [用法][1] +2. [结论][3] -While [plugins][4] are no doubt one of Vim's biggest strengths, there are several other functionalities that make it one of the most powerful and feature-rich text editors/IDEs available to Linux users today. One of these functionalities is the ability to make file-specific setting changes. This ability can be accessed using the editor's Modeline feature. +虽然[插件][4]毫无疑问是 Vim 最大的优势,然而,还有其它一些功能,使得它成为当今 Linux 用户中最强大、功能最丰富的文本编辑器/IDE 之一。其中一个功能就是进行文本特定设置的更改。我们可以使用编辑器的模式行特性来实现该功能。 -In this article, we will discuss how you can use Vim's [Modeline][5] feature using easy to understand examples. +在这篇文章中,我将讨论如何使用 Vim 的[模式行][5]特性来简单的理解一些例子。 -But before we start doing that, it's worth mentioning that all the examples, commands, and instructions mentioned in this tutorial have been tested on Ubuntu 16.04, and the Vim version we've used is 7.4. +在开始之前,值得提醒一下,这篇教程中提及的所有例子、命令和指令都已经在 Ubuntu 16.04 中使用 Vim 7.4 版本测试过。 -### VIM Modeline +### VIM 模式行 -### Usage +### 用法 -As we've already mentioned, Vim's Modeline feature lets you make file-specific changes. For example, suppose you want to replace all the tabs used in a particular file of your project with spaces, and make sure that all other files aren't affected by this change. This is an ideal use-case where Modeline helps you in what you want to do. +正如上面已经提到的, Vim 的模式行特性让你能够进行文件特定设置更改。比如,假设你想把项目中的一个特定文件中的所有制表符用空格替换,并且确保这个更改不会影响到其它所有文件。这是模式行帮助你完成你想做的事情的一个理想情况。 -So, what you can do is, you can put the following line in the beginning or end of the file in question: +因此,你可以考虑将下面这一行加入文件的开头或结尾来完成这件事。 ``` # vim: set expandtab: ``` -There are high chances that if you try doing the aforementioned exercise to test the use-case on your Linux machine, things won't work as expected. If that's the case, worry not, as the Modeline feature needs to be activated first in some cases (it's disabled by default on systems such as Debian, Ubuntu, Gentoo, and OSX for security reasons). +有很大的可能性,如果你在 Linux 系统上尝试上面的练习来测试用例,它将不会像你所期望的那样工作。如果是这样,也不必担心,因为某些情况下,模式行特性需要先激活才能起作用(出于安全原因,在一些系统比如 Debian、Ubuntu、GGentoo 和 OSX 上默认情况下禁用)。 -To enable the feature, open the .vimrc file (located in your home directory), and then add the following line to it: +为了启用该特性,打开 .vimrc 文件(位于 `home` 目录),然后加入下面一行内容: ``` set modeline ``` -Now, whenever you enter a tab and save the file (where the expandtab modeline command was entered), the tab will automatically convert into white spaces. +现在,无论何时你输入一个制表符然后保存文件(文件中已输入 expandtab 模式行命令的情况下),都会被自动转换为空白符 -Let's consider another use-case. Suppose the default tab space in Vim is set to 4, but for a particular file, you want to increase it to 8. For this, you need to add the following line in the beginning or the end of the file: +让我们考虑另一个用例。假设在 Vim 中, Tab 默认设置为 4 个空格,但对于某个特殊的文件,你想把它增加到 8 个。对于这种情况,你需要在文件的开头或末尾加上下面这行内容: ``` // vim: noai:ts=8: ``` -Now try entering a tab and you'll see that the number of spaces it covers will be 8.  +现在,输入一个 Tab,你会看到,空格的数量为 8 个。 -You might have noticed me saying that these modeline commands need to be entered somewhere near the top or the bottom of the file. If you're wondering why this is so, the reason is that the feature is designed this way. The following lines (taken from the official Vim documentation) should make this more clear: +你可能已经注意到我刚才说的,这些模式行命令需要加在靠近文件的顶部或底部。如果你好奇为什么是这样,那么理由是该特性以这种方式设计的。下面这一行(来自 Vim 官方文件)将会解释清楚: -"The modeline cannot be anywhere in the file: it must be in the first or last few lines. The exact location where vim checks for the modeline is controlled by the `modelines` variable; see :help modelines. By default, it is set to 5 lines." +“模式行不能随意放在文件中的一个位置:它需要放在文件中的前几行或最后几行。‘模式行’变量控制 Vim 检查模式行在文件中的确切位置。请查看: help modelines 。默认情况下,设置为 5 行。” -And here's what the :help modelines command (referred to in the above lines) says: +下面是 :help modelines 命令(指上面提到的)输出的内容: -If 'modeline' is on 'modelines' gives the number of lines that is checked for set commands. If 'modeline' is off or 'modelines' is zero no lines are checked. +如果模式行已启用并且给出了行数那么便在相应位置查找设置命令。如果模式行禁用或模式行设置的行数为 0 则不查找。 -Try and put the modeline command beyond the default 5 lines (either from the bottom or from the top) range, and you'll notice that tab spaces will revert to the Vim default - in my case that's 4 spaces. +尝试把模式行命令置于超出 5 行的范围(距离文件底部和顶部的距离均超过 5 行),你会发现, Tab 将会恢复为 Vim 默认数目的空格 — 在我的情况里是 4 个空格。 -However, you can change this behavior if you want, using the following command in your .vimrc file.  +然而,你可以按照自己的意愿改变默认行数,只需在你的 .vimrc 文件中加入下面一行命令 ``` -set modelines=[new-value] +set modelines=[新值] ``` -For example, I increased the value from 5 to 10. +比如,我把值从 5 增加到了 10 。 ``` set modelines=10 ``` -This means that now I can put the modeline command anywhere between first or last 10 lines of the file. +这意味着,现在我可以把模式行命令置于文件前 10 行或最后 10 行的任意位置。 -Moving on, at any point in time, while editing a file, you can enter the following (with the Vim editor in the command mode) to see the current modeline-related settings as well as where they were last set. +继续,无论何时,当你在编辑以个文件的时候,你可以输入下面的命令(在 Vim 编辑器的命令模式下输入)来查看当前与命令行相关的设置以及它们最新的设置。 ``` :verbose set modeline? modelines? ``` -For example, in my case, the above command produced the following output: +比如,在我的例子中,上面的命令产生了如下所示的输出: ``` modeline @@ -83,28 +82,28 @@ For example, in my case, the above command produced the following output: Last set from ~/.vimrc ``` -Here are some of the important points you need to know about Vim's Modeline feature: +关于 Vim 的模式行特性,你还需要知道一些重要的点: -* This feature is enabled by default for Vim running in nocompatible (non Vi-compatible) mode, but some notable distributions of Vim disable this option in the system vimrc for security. -* The feature is disabled by default when editing as root (if you've opened the file using 'sudo' then there's no issue - the feature works). -* With '`set'`, the modeline ends at the first colon not following a backslash. And without '`set'`, no text can follow the options. For example, **/* vim: noai:ts=4:sw=4 */** is an invalid modeline. +* 默认情况下,该特性是启用的,并以不兼容 Vi 的模式运行,但需要注意的是,在一些发行版中,出于安全考虑,系统的 vimrc 文件禁止了 Vim 的该选项。 +* 默认情况下,当以 `root` 权限编辑文件时,该特性被禁用(如果你是使用 `sudo` 命令打开文件,那么该特性依旧能够正常工作)。 +* 通过 `set` 来设置模式行,以一个冒号结束,而不是反斜杠。没有 `set`,就无法设置该选项。比如,**/* vim: noai:ts=4:sw=4*/** 是一个无效的模式行。 -### Security Concerns +### 安全考虑 -Sadly, Vim's Modeline feature can be used to compromise security. In fact, multiple security-related Modeline issues have been reported in the past, including [shell command injection][6], [arbitrary commands execution][7], [unauthorized access][8], and more. Agreed, most of these are old, and would have been fixed by now, but it does give an idea that the Modeline feature could be misused by hackers. +令人沮丧的是, Vim 的模式行特性可能会造成安全性问题。事实上,在过去,已经报道过多个和模式行相关的问题,包括[ shell 命令注入][6],[任意命令执行][7]和[无授权访问][8]等。我同意,这些问题发生在很早的一些时候,现在应该已经修复好了,但是,这提醒了我们,模式行特性有可能会被黑客滥用。 -### Conclusion +### 结论 -Modeline may be an advanced feature of the Vim editor, but it's not very difficult to understand. There's no doubt that a bit of learning curve involved, but that's not much to ask for given how useful the feature is. Of course, there are security concerns, which means that you should weigh your options before enabling and using the feature. +模式行可能是 Vim 编辑器的一个高级命令,但是它并不难理解。毫无疑问,它的学习曲线会有一些复杂,但是不需多问也知道,该特性是多么的有用。当然,出于安全考虑,在启用并使用该选项前,你需要对自己的选择进行权衡。 -Have you ever used the Modeline feature? How was your experience? Share with us (and the whole HowtoForge community) in the comments below. +你有使用过模式行特性吗?你的体验是什么样的?记得在下面的评论中分享给我们(以及整个 HowtoForge 社区)。 -------------------------------------------------------------------------------- via: https://www.howtoforge.com/tutorial/vim-modeline-settings/ 作者:[ Ansh][a] -译者:[译者ID](https://github.com/译者ID) +译者:[ucasFL](https://github.com/ucasFL) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From a555dcbc591fbc2c83f921bdd3e1ba80020cd7c3 Mon Sep 17 00:00:00 2001 From: hkurj Date: Mon, 15 May 2017 05:50:25 +0800 Subject: [PATCH 0071/1407] ok --- ...ifference Between Two Directories Using Diff and Meld Tools.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {sources => translated}/tech/20170502 How to Find Difference Between Two Directories Using Diff and Meld Tools.md (100%) diff --git a/sources/tech/20170502 How to Find Difference Between Two Directories Using Diff and Meld Tools.md b/translated/tech/20170502 How to Find Difference Between Two Directories Using Diff and Meld Tools.md similarity index 100% rename from sources/tech/20170502 How to Find Difference Between Two Directories Using Diff and Meld Tools.md rename to translated/tech/20170502 How to Find Difference Between Two Directories Using Diff and Meld Tools.md From 7ef84699ba2c3362d8f78596926c34294d02a9eb Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 15 May 2017 09:42:09 +0800 Subject: [PATCH 0072/1407] translating --- .../tech/20170126 How to use slice capacity and length in Go.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170126 How to use slice capacity and length in Go.md b/sources/tech/20170126 How to use slice capacity and length in Go.md index 59a2c50779..ea7f253206 100644 --- a/sources/tech/20170126 How to use slice capacity and length in Go.md +++ b/sources/tech/20170126 How to use slice capacity and length in Go.md @@ -1,3 +1,5 @@ +translating--geekpi +
[How to use slice capacity and length in Go][14] ============================================================
From fa7f195f0d48a00164c59d3a2dcd2d4ad5a178ba Mon Sep 17 00:00:00 2001 From: mec2cod Date: Mon, 15 May 2017 12:19:21 +0800 Subject: [PATCH 0073/1407] finishing 20170317 How to control GPIO pins and operate relays with the Raspberry Pi.md --- ...nd operate relays with the Raspberry Pi.md | 412 ------------------ 1 file changed, 412 deletions(-) delete mode 100644 sources/tech/20170317 How to control GPIO pins and operate relays with the Raspberry Pi.md diff --git a/sources/tech/20170317 How to control GPIO pins and operate relays with the Raspberry Pi.md b/sources/tech/20170317 How to control GPIO pins and operate relays with the Raspberry Pi.md deleted file mode 100644 index 71a5bf4fd2..0000000000 --- a/sources/tech/20170317 How to control GPIO pins and operate relays with the Raspberry Pi.md +++ /dev/null @@ -1,412 +0,0 @@ -being translated by zhousiyu325 - -How to control GPIO pins and operate relays with the Raspberry Pi -============================================================ - -> Learn how to operate relays and control GPIO pins with the Pi using PHP and a temperature sensor. - - ![How to control GPIO pins and operate relays with the Raspberry Pi](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/raspberry_pi_day_lead_0.jpeg?itok=lCxmviRD "How to control GPIO pins and operate relays with the Raspberry Pi") ->Image by : opensource.com - -Ever wondered how to control items like your fans, lights, and more using your phone or computer from anywhere? - -I was looking to control my Christmas lights using any mobile phone, tablet, laptop... simply by using a Raspberry Pi. Let me show you how to operate relays and control GPIO pins with the Pi using PHP and a temperature sensor. I put them all together using AJAX. - -### Hardware requirements - -* Raspberry Pi -* SD Card with Raspbian installed (any SD card would work, but I prefer to use a 32GB class 10 card) -* Power adapter -* Jumper wires (female to female and male to female) -* Relay board (I use a 12V relay board with for relays) -* DS18B20 temperature probe -* Wi-Fi adapter for Raspberry Pi -* Router (for Internet access, you need to have a port-forwarding supported router) -* 10K-ohm resistor - -### Software requirements - -* Download and install Raspbian on your SD Card -* Working Internet connection -* Apache web server -* PHP -* WiringPi -* SSH client on a Mac or Windows client - -### General configurations and setup - -1\. Insert the SD card into Raspberry Pi and connect it to the router using an Ethernet cable - -2\. Connect the Wi-Fi Adapter. - -3\. Now SSH to Pi and edit the **interfaces** file using: - -**sudo nano /etc/network/interfaces** - -This will open the file in an editor called **nano**. It is a very simple text editor that is easy to approach and use. If you're not familiar to a Linux-based operating systems, just use the arrow keys. - -After opening the file in **nano** you will see a screen like this: - - ![File editor nano](https://opensource.com/sites/default/files/putty_0.png "File editor nano") - -4\. To configure your wireless network, modify the file as follows: - -**iface lo inet loopback** - -**iface eth0 inet dhcp** - -**allow-hotplug wlan0** - -**auto wlan0** - -**iface wlan0 inet dhcp** - -**   wpa-ssid "Your Network SSID"** - -**   wpa-psk "Your Password"** - -5\. Press CTRL + O to save it, and then CTRL + X to exit the editor. - -At this point, everything is configured and all you need to do is reload the network interfaces by running: - -**sudo service networking reload** - -(Warning: if you are connected using a remote connection it will disconnect now.) - -### Software configurations - -### Installing Apache Web Server - -Apache is a popular web server application you can install on the Raspberry Pi to allow it to serve web pages. On its own, Apache can serve HTML files over HTTP, and with additional modules it can serve dynamic web pages using scripting languages such as PHP. - -Install Apache by typing the following command on the command line: - -**sudo apt-get install apache2 -y** - -Once the installation is complete, type in the IP Address of your Pi to test the server. If you get the next image, then you have installed and set up your server successfully. - - ![Successful server setup](https://opensource.com/sites/default/files/itworks.png "Successful server setup") - -To change this default page and add your own html file, go to **var/www/html**: - -**cd /var/www/html** - -To test this, add any file to this folder. - -### Installing PHP - -PHP is a preprocessor, meaning this is code that runs when the server receives a request for a web page. It runs, works out what needs to be shown on the page, then sends that page to the browser. Unlike static HTML, PHP can show different content under different circumstances. Other languages are capable of this, but since WordPress is written in PHP it's what you need to use this time. PHP is a very popular language on the web, with large projects like Facebook and Wikipedia written in it. - -Install the PHP and Apache packages with the following command: - -**sudo apt-get install php5 libapache2-mod-php5 -y** - -### Testing PHP - -Create the file **index.php**: - -**sudo nano index.php** - -Put some PHP content in it: - -**** - -Save the file. Next, delete "index.html" because it takes precedence over "index.php": - -**sudo rm index.html** - -Refresh your browser. You should see “hello world.” This is not dynamic, but it is still served by PHP. If you see the raw PHP above instead of “hello world,” reload and restart Apache with: - -**sudo /etc/init.d/apache2 reload** - -**sudo /etc/init.d/apache2 restart** - -### Installing WiringPi - -WiringPi is maintained under **git** for ease of change tracking; however, you have a plan B if you’re unable to use **git** for whatever reason. (Usually your firewall will be blocking you, so do check that first!) - -If you do not have **git** installed, then under any of the Debian releases (e.g., Raspbian), you can install it with: - -**sudo apt-get install git-core** - -If you get any errors here, make sure your Pi is up to date with the latest version of Raspbian: - -**sudo apt-get update sudo apt-get upgrade** - -To obtain WiringPi using **git**: - -**sudo git clone git://git.drogon.net/wiringPi** - -If you have already used the clone operation for the first time, then: - -**cd wiringPi git pull origin** - -It will fetch an updated version, and then you can re-run the build script below. - -To build/install there is a new simplified script: - -**cd wiringPi ./build** - -The new build script will compile and install it all for you. It does use the **sudo** command at one point, so you may wish to inspect the script before running it. - -### Testing WiringPi - -Run the **gpio** command to check the installation: - -**gpio -v gpio readall** - -This should give you some confidence that it’s working OK. - -### Connecting DS18B20 To Raspberry Pi - -* The Black wire on your probe is for GND -* The Red wire is for VCC -* The Yellow wire is the GPIO wire - - ![GPIO image](https://opensource.com/sites/default/files/gpio_0.png "GPIO image") - -Connect: - -* VCC to 3V Pin 1 -* GPIO wire to Pin 7 (GPIO 04) -* Ground wire to any GND Pin 9 - -### Software Configuration - -For using DS18B20 temperature sensor module with PHP, you need to activate the kernel module for the GPIO pins on the Raspberry Pi and the DS18B20 by executing the commands: - -**sudo modprobe w1-gpio** - -**sudo modprobe w1-therm** - -You do not want to do that manually every time the Raspberry reboots, so you want to enable these modules on every boot. This is done by adding the following lines to the file **/etc/modules**: - -**sudo nano /etc/modules/** - -Add the following lines to it: - -**w1-gpio** - -**w1-therm** - -To test this, type in: - -**cd /sys/bus/w1/devices/** - -Now type **ls. ** - -You should see your device information. In the device drivers, your DS18B20 sensor should be listed as a series of numbers and letters. In this case, the device is registered as 28-000005e2fdc3\. You then need to access the sensor with the cd command, replacing my serial number with your own: **cd 28-000005e2fdc3. ** - -The DS18B20 sensor periodically writes to the **w1_slave** file, so you simply use the cat command to read it**: cat w1_slave.** - -This yields the following two lines of text, with the output **t=** showing the temperature in degrees Celsius. Place a decimal point after the first two digits (e.g., the temperature reading I received is 30.125 degrees Celsius). - -### Connecting the relay - -1\. Take two jumper wires and connect one of them to the GPIO 24 (Pin18) on the Pi and the other one to the GND Pin. You may refer the following diagram. - -2\. Now connect the other ends of the wire to the relay board. Connect the GND to the GND on the relay and GPIO Output wire to the relay channel pin number, which depends on the relay that you are using. Remember theGNDgoes to GND on the relay and GPIO Output goes to the relay input pin. - - ![Headers](https://opensource.com/sites/default/files/headers.png "Headers") - -Caution! Be very careful with the relay connections with Pi because if it causes a backflow of current, you with have a short circuit. - -3\. Now connect the power supply to the relay, either using 12V power adapter or by connecting the VCC Pin to 3.3V or 5V on the Pi. - -### Controlling the relay using PHP - -Let's create a PHP script to control the GPIO pins on the Raspberry Pi, with the help of the WiringPi software. - -1\. Create a file in the Apache server’s root web directory. Navigate using: - -**cd ../../../** - -**cd var/www/html/** - -2\. Create a new folder called Home: - -**sudo mkdir Home** - -3\. Create a new PHP file called **on.php**: - -**sudo nano on.php** - -4\. Add the following code to it: - -``` - -``` - -5\. Save the file using CTRL + O and exit using CTRL + X - -In the code above, in the first line you've set the GPIO Pin 24 to output mode using the command: - -``` -system(“ gpio-g mode 24 out “) ; -``` - -In the second line, you’ve turned on the GPIO Pin 24, Using “1,” where “1” in binary refers to ON and “0” Means OFF. - -6\. To turn off the relay, create another file called **off.php** and replace “1” with “0.” - -``` - -``` - -7\. If you have your relay connected to the Pi, visit your web browser and type in the IP Address of your Pi followed by the directory name and file name:        - -**http://{IPADDRESS}/home/on.php** - -This will turn ON the relay. - -8\. To turn it OFF, open the page called **off.php**, - -**http://{IPADDRESS}/home/off.php** - -Now you need to control both these things from a single page without refreshing or visiting the pages individually. For that you'll use AJAX. - -9\. Create a new HTML file and add this code to it. - -``` -[html + php + ajax codeblock] - - - - - - - - - - -``` - -10\. Save the file, go to your web browser, and open that page. You’ll see two buttons, which will turn lights on and off. Based on the same idea, you can create a beautiful web interface using bootstrap and CSS skills. - -### Viewing temperature on this web page - -1\. Create a file called **temperature.php**: - -``` -sudo nano temperature.php -``` - -2\. Add the following code to it, replace 10-000802292522 with your device ID: - -``` - -``` - -3\. Go to the HTML file that you just created, and create a new **
** with the **id** “screen”: **
.** - -4\. Add the following code after the **** tag or at the end of the document: - -``` - -``` - -In this, **#screen** is the **id** of **
** in which you want to display the temperature. It loads the **temperature.php** file every 1000 milliseconds. - -I have used bootstrap to make a beautiful panel for displaying temperature. You can add multiple icons and glyphicons as well to make it more attractive. - -This was just a basic system that controls a relay board and displays the temperature. You can develop it even further by creating event-based triggers based on timings, temperature readings from the thermostat, etc. - --------------------------------------------------------------------------------- - - -作者简介: - -Abdul Hannan Mustajab - I'm 17 years old and live in India. I am pursuing an education in science, math, and computer science. I blog about my projects at spunkytechnology.com. I've been working on AI based IoT using different micro controllers and boards . - --------- - - -via: https://opensource.com/article/17/3/operate-relays-control-gpio-pins-raspberry-pi - -作者:[ Abdul Hannan Mustajab][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/mustajabhannan -[1]:http://www.php.net/system -[2]:http://www.php.net/system -[3]:http://www.php.net/system -[4]:http://www.php.net/system -[5]:http://www.php.net/system -[6]:http://www.php.net/file -[7]:http://www.php.net/explode -[8]:http://www.php.net/number_format -[9]:https://opensource.com/article/17/3/operate-relays-control-gpio-pins-raspberry-pi?rate=RX8QqLzmUb_wEeLw0Ee0UYdp1ehVokKZ-JbbJK_Cn5M -[10]:https://opensource.com/user/123336/feed -[11]:https://opensource.com/users/mustajabhannan From 21c8d933acb490168b44f1d304ffd833dd13f59c Mon Sep 17 00:00:00 2001 From: mec2cod Date: Mon, 15 May 2017 12:20:54 +0800 Subject: [PATCH 0074/1407] finishing 20170317 How to control GPIO pins and operate relays with the Raspberry Pi.md --- ...nd operate relays with the Raspberry Pi.md | 408 ++++++++++++++++++ 1 file changed, 408 insertions(+) create mode 100644 translated/tech/20170317 How to control GPIO pins and operate relays with the Raspberry Pi.md diff --git a/translated/tech/20170317 How to control GPIO pins and operate relays with the Raspberry Pi.md b/translated/tech/20170317 How to control GPIO pins and operate relays with the Raspberry Pi.md new file mode 100644 index 0000000000..8abe934f8a --- /dev/null +++ b/translated/tech/20170317 How to control GPIO pins and operate relays with the Raspberry Pi.md @@ -0,0 +1,408 @@ +如何用Raspberry Pi控制GOIO引脚并操作继电器 +========================================== + +> 学习如何用PHP和温度传感器实现Raspberry Pi控制GPIO并操作继电器 + + ![How to control GPIO pins and operate relays with the Raspberry Pi](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/raspberry_pi_day_lead_0.jpeg?itok=lCxmviRD "How to control GPIO pins and operate relays with the Raspberry Pi") + + > 图片来源: opensource.com + + 你是否曾经想知道怎样使用手机或者电脑在任何地方控制你的风扇和等一些家用电器? + +我现在想控制我的圣诞彩灯,是使用手机呢,还是使用平板电脑呢,或者是使用笔记本电脑呢?都不是,而是仅仅使用一个Raspberry Pi。让我来告诉你如何使用PHP和温度传感器实现Raspberry Pi控制GPIO引脚并操作继电器。我使用AJAX把它们整合在了一起。 + +### 硬件要求: + +* Raspberry Pi +* 安装有Raspbian系统的SD卡(任何一张SD卡都可以,但是我更偏向使用一张大小为32GB等级为class 10的SD卡) +* 电源适配器 +* 跳线(母对母跳线和公转母跳线) +* 继电器板(我使用一个用于12V继电器的继电器板) +* DS18B20温度传感器 +* Raspberry Pi的Wi-Fi适配器 +* 路由器(为了访问互联网,你需要有一个拥有端口转发的路由器) +* 10KΩ的电阻 + +### 软件要求: +* 下载并安装Raspbian系统到你的SD卡 +* 有效的互联网连接 +* Apache web服务器 +* PHP +* WiringPi +* 基于Mac或者Windows的SSH客户端 + +### 一般的配置和设置 + +1\. 插入SD卡到Raspberry Pi,然后使用以太网网线将它连接到路由器; + +2\. 连接WiFi适配器; + +3\. 使用SSH方式登录到Raspberry Pi,然后使用下面的命令编辑**interfaces**文件: + +> **sudo nano /etc/network/interfaces** + +这个命令会用一个叫做**nano**的编辑器打开这个文件。它是一个非常简单又易于使用的文本编辑器。如果你不熟悉基于linux的操作系统,可以使用键盘上的方向键来操作。 + +用**nano**打开这个文件后,你会看到这样一个界面: + + ![File editor nano](https://opensource.com/sites/default/files/putty_0.png "File editor nano") + +4\.要配置你的无线网络,按照下面所示修改这个文件: + +>**iface lo inet loopback** + +>**iface eth0 inet dhcp** + +>**allow-hotplug wlan0** + +>**auto wlan0** + +>**iface wlan0 inet dhcp** + +>**   wpa-ssid "Your Network SSID"** + +>**   wpa-psk "Your Password"** + +5\. 按CTRL+O保存,然后按CTRL+X退出编辑器。 + +到目前为止,一切都已经配置完成,接下来你需要做的就是使用命令重新加载网络: + +> **sudo service networking reload** + +(警告:如果你是使用远程连接的方式连接的Raspberry Pi,连接将会中断。) + +### 软件配置 + +#### 安装Apache web 服务器 + +Apache是一个受欢迎的服务器应用,你可以在Raspberry Pi安装这个程序让它提供网页服务。 +Apache原本就可以通过HTTP方式提供HTML文件服务,添加其他模块后,Apache还可以使用像PHP这样的脚本语言来提供动态网页的服务。 + +可以在命令行输入下面命令安装Apache: + +> **sudo apt-get install apache2 -y** + +安装完成后,可以在浏览器地址栏输入Raspberry Pi的IP地址来测试web服务器。如果你可以获得下面图片的内容,说明你已经成功地安装并设置好了你的服务器。 + +![Successful server setup](https://opensource.com/sites/default/files/itworks.png "Successful server setup") + +要改变这个默认的页面和添加你自己的html文件,进入**var/www/html**目录: + +> **cd /var/www/html** + +添加一些文件来测试是否成功。 + +### 安装PHP + +PHP是一个预处理器,这意味着它是当服务器收到网页请求时才会运行的一段代码。它开始运行,处理网页上需要被显示的内容,然后把网页发送给浏览器。不像静态的HTML,PHP在不同的环境下可以显示不同的内容。其他的语言也可以做到这一点,但是由于WordPress是用PHP编写的,有些时候你需要使用它。PHP是web上一种非常受欢迎的语言,像Facebok和Wikipeadia这样的大型项目都是用PHP编写的。 + +使用下面的命令安装PHP和Apache软件包: + +> **sudo apt-get install php5 libapache2-mod-php5 -y** + +#### 测试PHP + +创建文件:**index.php**: + +> **sudo nano index.php** + +在里面写入一些PHP内容: + +> **** + +保存文件,接下来删除"index.html",因为它比"index.php"的优先级更高: + +> sudo rm index.html + +刷新你的浏览器,你会看到"hello world"。这并不是动态的,但是它仍然由PHP提供服务。如果你在上面看到提原始的PHP文件而不是"hello world",重新加载和重启Apahce: + +> **sudo /etc/init.d/apache2 reload** + +> **sudo /etc/init.d/apache2 restart** + +### 安装WiringPi + +为了可以对代码的更改进行跟踪,WiringPi的维护采用git。但假如你因为某些原因而没法使用git,还有一种可以替代的方案B。(通常你的防火墙会把你隔离开来,所以请先检查一下你的防火墙的设置情况!) + +如果你还没有安装git,那么在Debian及其衍生版本中(比如Raspbian),你可以这样安装它: + +> **sudo apt-get install git-core** + +若是你遇到了一些错误,请确保你的Raspberry Pi是最新版本的Raspbian系统: + +> **sudo apt-get update sudo apt-get upgrade** + +使用git获取最WiringPi: + +> **sudo git clone git://git.drogon.net/wiringPi** + +如果你之前已经使用过 clone操作,那么可以使用下面命令: + +> **cd wiringPi && git pull origin** + +这个命令会将会获取更新的版本,你然后可以重新运行下面的构建脚本。 + +有一个新的简化的脚本来构建和安装: + +> cd wiringPi && ./build + +这个新的构建脚本将会为你完成编译和安装WiringPi。它曾一度需要使用**sudo**命令,所以在运行这它之前你可能需要检查一下这个脚本。 + +### 测试WiringPi + +运行 **gpio** 命令来检查安装成功与否: + +> **gpio -v gpio readall** + +这将给你一些信心,软件运行良好。 + +### 连接DS18B20传感器到Raspberry Pi + +* 传感器上的黑线用于GND。 +* 红线用于VCC。 +* 黄线是GPIO线。 + + ![GPIO image](https://opensource.com/sites/default/files/gpio_0.png "GPIO image") + + 连线: + + * VCC连接3V的1号引脚。 + * GPIO线连接7号引脚(GPIO4)。 + * 地线连接GND的9号引脚。 + +### 软件配置 + +为了用PHP使用DS18B20温度传感器模块,你需要执行下面的命令来激活用于Raspberry Pi 上GPIO引脚和DS18B20的内核模块: + +> **sudo modprobe w1-gpio** +> **sudo modprobe w1-therm** + +你不想每次Raspberry重启后都手动执行上述命令,所以你想每次开机能自动启动这些模块。可以在文件**/etc/modules**中添加下面的命令行来做到: + +> **sudo nano /etc/modules/** + +添加下面的命令行到它里面: + +> **w1-gpio** +> **w1-therm** + +为了测试,输入: + +> cd /sys/bus/w1/devices/ + +现在输入ls。 + +你会看到你的设备信息。在设备驱动程序中,你的DS18B20传感器应该作为一串字母和数字被列出。在本例中,设备被记录为 28-000005e2fdc3。然后你需要使用cd命令来访问传感器,用你自己的序列号替代我的: **cd 28-000005e2fdc3. **。 + +DS18B20会周期性的将数据写入文件**w1_slave**,所以你只需要使用命令cat来读出数据:**cat w1_slave.**。 + +这会生成下面的两行文本,输出中**t=** 表示摄氏单位的温度。在前两位数后面加上一个小数点(例如,我收到的温度读数是30.125摄氏度)。 + +### 连接继电器 + +1\. 取两根跳线,把其中一根连接到Pi上的GPIO24(18号引脚),另一根连接GND引脚。你可以参考下面这张图。 + +2\. 现在将跳线的另一端连接到继电器板。GND连接到继电器上的GND,GPIO输出线连接到继电器的通道引脚号,这取决于你正使用的继电器型号。记住,将Pi上的GND与继电器上的GND连接连接起来,Pi上的GPIO输出连接继电器上的输入引脚。 + +![Headers](https://opensource.com/sites/default/files/headers.png "Headers") + +注意!将继电器连接Pi的时候小心一些,因为它可能会导致电流回流,这会造成短路。 + +3\. 现在将电源连接继电器,可以使用12V的电源适配器,也可以将VCC引脚连接到Pi上的3.3V或5.5V引脚。 + +### 使用PHP控制继电器 + +让我们先写一个借助于WiringPi软件用来控制Paspberry Pi上GPIO引脚的PHP脚本。 + +1\. 在Apache服务器的网站根目录下创建一个文件,使用下面命令切换到该目录: + +> **cd /var/www/html** + +2\. 新建一个叫Home的文件夹: + +> **sudo mkdir Home** + +3\. 新建一个叫on.php的脚本 + +> **sudo nano on.php** + +4\. 在脚本中加入下面的代码: + +``` + +``` + +5\. 使用CTRL+O保存文件,CTRL+X退出。 + +上面的代码中,你在第一行使用命令将24号GPIO引脚设置为output模式: + +> system(“ gpio-g mode 24 out “) ; + +在第二行,你使用"1"将24号引脚GPIO打开,在二进制中"1"表示打开,"0"表示关闭。 + +6\. 为了关闭继电器,可以创建另外一个off.php文件,并用"0"替换"1"。 + +``` + +``` + +7\. 如果你已经将继电器连接了Pi,可以在浏览器中输入你的Pi的IP地址并在后面加上目录名和文件名来进行访问: + +>** http://{IPADDRESS}/home/on.php ** + +这将会打开继电器。 + +8\. 要关闭它,可以访问叫off.php的文件: + +>**http://{IPADDRESS}/home/off.php** + +现在你需要能够在一个单独 的页面来控制这两样事情,而不用单独的刷新或者访问这两个页面。你可以使用AJAX来完成。 + +9\. 新建一个HTML文件,并在其中加入下面代码: + +``` +[html + php + ajax codeblock] + + + + + + + + + + +``` + +10\. 保存文件,进入你的web 浏览器目录,然后打开那个网页。你会看到两个按钮,它们可以打开和关闭灯泡。基于同样的想法,你还可以使用bootstrap和CSS来创建一个更加漂亮的web界面。 + +### 在这个网页上观察温度 + +1\. 新建一个temperature.php的文件: + +``` +sudo nano temperature.php +``` + +2\. 在文件中加入下面的代码,用你自己的设备ID替换10-000802292522: + +``` + +``` + +3\. 打开你刚刚创建的HTML文件,并创建一个新的带有 **id** “screen”的 `
`标签 +``` +
+``` + +4\. 在这个标签后或者这个文档的尾部下面的代码: + +``` + +``` + +其中,`#screen`是标签`
`的`id`,你想在它里面显示温度。它会每隔1000毫秒加载一次`temperature.php`文件。 + +我使用了bootstrap框架来制作一个漂亮的面板来显示温度,你还可以加入多个icons和 glyphicons让网页更有吸引力。 + +这只是一个控制继电器板并显示温度的基础的系统,你可以通过创建基于定时和从恒温器读数等基于事件触发来进一步地对系统进行开发。 + +-------------------------------------------------------------------------------- + + +作者简介: + +Abdul Hannan Mustajab: 我17岁,生活在印度。我正在追求科学,数学和计算机科学方面的教育。我在spunkytechnology.com上发表关于我的项目的博客。我一直在对使用不同的微控制器和电路板的基于物联网的AI进行研究。 + + +via: https://opensource.com/article/17/3/operate-relays-control-gpio-pins-raspberry-pi + +作者:[ Abdul Hannan Mustajab][a] +译者:[译者ID](https://github.com/zhousiyu325) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/mustajabhannan +[1]:http://www.php.net/system +[2]:http://www.php.net/system +[3]:http://www.php.net/system +[4]:http://www.php.net/system +[5]:http://www.php.net/system +[6]:http://www.php.net/file +[7]:http://www.php.net/explode +[8]:http://www.php.net/number_format +[9]:https://opensource.com/article/17/3/operate-relays-control-gpio-pins-raspberry-pi?rate=RX8QqLzmUb_wEeLw0Ee0UYdp1ehVokKZ-JbbJK_Cn5M +[10]:https://opensource.com/user/123336/feed +[11]:https://opensource.com/users/mustajabhannan + + From 0f59da826951fe1130eda6e484011c791c0b148c Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 15 May 2017 13:46:25 +0800 Subject: [PATCH 0075/1407] translated --- ... to use slice capacity and length in Go.md | 326 ------------------ ... to use slice capacity and length in Go.md | 324 +++++++++++++++++ 2 files changed, 324 insertions(+), 326 deletions(-) delete mode 100644 sources/tech/20170126 How to use slice capacity and length in Go.md create mode 100644 translated/tech/20170126 How to use slice capacity and length in Go.md diff --git a/sources/tech/20170126 How to use slice capacity and length in Go.md b/sources/tech/20170126 How to use slice capacity and length in Go.md deleted file mode 100644 index ea7f253206..0000000000 --- a/sources/tech/20170126 How to use slice capacity and length in Go.md +++ /dev/null @@ -1,326 +0,0 @@ -translating--geekpi - -
[How to use slice capacity and length in Go][14] -============================================================
- - - -Quick pop quiz - what does the following code output? - -``` -vals := make([]int, 5) -for i := 0; i < 5; i++ { - vals = append(vals, i) -} -fmt.Println(vals) -``` - -_[Cheat and run it on the Go Playground][1]_ - -If you guessed `[0 0 0 0 0 0 1 2 3 4]` you are correct. - -_Wait, what?_ Why isn't it `[0 1 2 3 4]`? - -Don't worry if you got the pop quiz wrong. This is a fairly common mistake when transitioning into Go and in this post we are going to cover both why the output isn't what you expected along with how to utilize the nuances of Go to make your code more efficient. - -### Slices vs Arrays - -In Go there are both arrays and slices. This can be confusing at first, but once you get used to it you will love it. Trust me. - -There are many differences between slices and arrays, but the primary one we want to focus on in this article is that the size of an array is part of its type, whereas slices can have a dynamic size because they are wrappers around arrays. - -What does this mean in practice? Well, let's say we have the array `val a [10]int`. This array has a fixed size and that can't be changed. If we were to call `len(a)` it would always return 10, because that size is part of the type. As a result, if you suddenly need more than 10 items in your array you have to create a new object with an entirely different type, such as `val b [11]int`, and then copy all of your values from `a` over to `b`. - -While having arrays with set sizes is valuable in specific cases, generally speaking this isn't what developers want. Instead, they want to work with something similar to an array in Go, but with the ability to grow over time. One crude way to do this would be to create an array that is much bigger than it needs to be and then to treat a subset of the array as your array. An example of this is shown in the code below. - -``` -var vals [20]int -for i := 0; i < 5; i++ { - vals[i] = i * i -} -subsetLen := 5 - -fmt.Println("The subset of our array has a length of:", subsetLen) - -// Add a new item to our array -vals[subsetLen] = 123 -subsetLen++ -fmt.Println("The subset of our array has a length of:", subsetLen) -``` - -_[Run it on the Go Playground][2]_ - -With this code we have an array with a set size of 20, but because we are only using a subset our code can pretend that the length of the array is 5, and then 6 after we add a new item to our array. - -This is (very roughly speaking) how slices work. They wrap an array with a set size, much like our array in the previous example has a set size of 20. - -They also keep track of the subset of the array that is available for your program to use - this is the `length` attribute, and it is similar to the `subsetLen` variable in the previous example. - -Finally, a slice also has a `capacity`, which is similar to the total length of our array (20) in the previous example. This is useful because it tells you how large your subset can grow before it will no longer fit in the array that is backing the slice. When this does happen, a new array will need to be allocated, but all of this logic is hidden behind the `append` function. - -In short, combining slices with the `append` function gives us a type that is very similar to arrays, but is capable of growing over time to handle more elements. - -Let's look at the previous example again, but this time we will use a slice instead of an array. - -``` -var vals []int -for i := 0; i < 5; i++ { - vals = append(vals, i) - fmt.Println("The length of our slice is:", len(vals)) - fmt.Println("The capacity of our slice is:", cap(vals)) -} - -// Add a new item to our array -vals = append(vals, 123) -fmt.Println("The length of our slice is:", len(vals)) -fmt.Println("The capacity of our slice is:", cap(vals)) - -// Accessing items is the same as an array -fmt.Println(vals[5]) -fmt.Println(vals[2]) -``` - -_[Run it on the Go Playground][3]_ - -We can still access elements in our slice just like we would arrays, but by using a slice and the `append` function we no longer have to think about the size of the backing array. We are still able to figure these things out by using the `len` and `cap` functions, but we don't have to worry too much about them. Neat, right? - -### Back to the pop quiz - -With that in mind, let's look back at our pop quiz code to see what went wrong. - -``` -vals := make([]int, 5) -for i := 0; i < 5; i++ { - vals = append(vals, i) -} -fmt.Println(vals) -``` - -When calling `make` we are permitted to pass in up to 3 arguments. The first is the type that we are allocating, the second is the `length` of the type, and the third is the `capacity` of the type (_this parameter is optional_). - -By passing in the arguments `make([]int, 5)` we are telling our program that we want to create a slice with a length of 5, and the capacity is defaulted to the length provided - 5 in this instance. - -While this might seem like what we wanted at first, the important distinction here is that we told our slice that we wanted to set both the `length` and `capacity` to 5, and then we proceeded to call the `append` function which assumes you want to add a new element _after_ the initial 5, so it will increase the capacity and start adding new elements at the end of the slice. - -You can actually see the capacity changing if you add a `Println()` statement to your code. - -``` -vals := make([]int, 5) -fmt.Println("Capacity was:", cap(vals)) -for i := 0; i < 5; i++ { - vals = append(vals, i) - fmt.Println("Capacity is now:", cap(vals)) -} - -fmt.Println(vals) -``` - -_[Run it on the Go Playground][4]_ - -As a result, we end up getting the output `[0 0 0 0 0 0 1 2 3 4]` instead of the desired `[0 1 2 3 4]`. - -How do we fix it? Well, there are several ways to do this, so we are going to cover two of them and you can pick whichever makes the most sense in your situation. - -### Write directly to indexes instead of using `append` - -The first fix is to leave the `make` call unchanged and explicitly state the index that you want to set each element to. Doing this, we would get the following code: - -``` -vals := make([]int, 5) -for i := 0; i < 5; i++ { - vals[i] = i -} -fmt.Println(vals) -``` - -_[Run it on the Go Playground][5]_ - -In this case the value we are setting happens to be the same as the index we want to use, but you can also keep track of the index independently. - -For example, if you wanted to get the keys of a map you could use the following code. - -``` -package main - -import "fmt" - -func main() { - fmt.Println(keys(map[string]struct{}{ - "dog": struct{}{}, - "cat": struct{}{}, - })) -} - -func keys(m map[string]struct{}) []string { - ret := make([]string, len(m)) - i := 0 - for key := range m { - ret[i] = key - i++ - } - return ret -} -``` - -_[Run it on the Go Playground][6]_ - -This works well because we know that the exact length of the slice we return will be the same as the length of the map, so we can initialize our slice with that length and then assign each element to an appropriate index. The downside to this approach is that we have to keep track of `i` so that we know what index to place every value in. - -This leads us to the second approach we are going to cover... - -### Use `0` as your length and specify your capacity instead - -Rather than keeping track of which index we want to add our values to, we can instead update our `make` call and provide it with two arguments after the slice type. The first, the length of our new slice, will be set to `0`, as we haven't added any new elements to our slice. The second, the capacity of our new slice, will be set to the length of the map parameter because we know that our slice will eventually have that many strings added to it. - -This will still construct the same array behind the scenes as the previous example, but now when we call `append` it will know to place items at the start of our slice because the length of the slice is 0. - -``` -package main - -import "fmt" - -func main() { - fmt.Println(keys(map[string]struct{}{ - "dog": struct{}{}, - "cat": struct{}{}, - })) -} - -func keys(m map[string]struct{}) []string { - ret := make([]string, 0, len(m)) - for key := range m { - ret = append(ret, key) - } - return ret -} -``` - -_[Run it on the Go Playground][7]_ - -### Why do we bother with capacity at all if `append` handles it? - -The next thing you might be asking is, "Why are we even telling our program a capacity if the `append` function can handle increasing the capacity of my slice for me?" - -The truth is, in most cases you don't need to worry about this too much. If it makes your code significantly more complicated, just initialize your slice with `var vals []int` and let the `append`function handle the heavy lifting for you. - -But this case is different. It isn't an instance where declaring the capacity is difficult; In fact, it is actually quite easy to determine what the final capacity of our slice needs to be because we know it will map directly to the provided map. As a result, we can declare the capacity of our slice when we initialize it and save our program from needing to perform unnecessary memory allocations. - -If you want to see what the extra memory allocations look like, run the following code on the Go Playground. Every time capacity increases our program needed to do another memory allocation. - -``` -package main - -import "fmt" - -func main() { - fmt.Println(keys(map[string]struct{}{ - "dog": struct{}{}, - "cat": struct{}{}, - "mouse": struct{}{}, - "wolf": struct{}{}, - "alligator": struct{}{}, - })) -} - -func keys(m map[string]struct{}) []string { - var ret []string - fmt.Println(cap(ret)) - for key := range m { - ret = append(ret, key) - fmt.Println(cap(ret)) - } - return ret -} -``` - -_[Run it on the Go Playground][8]_ - -Now compare this to the same code but with a predefined capacity. - -``` -package main - -import "fmt" - -func main() { - fmt.Println(keys(map[string]struct{}{ - "dog": struct{}{}, - "cat": struct{}{}, - "mouse": struct{}{}, - "wolf": struct{}{}, - "alligator": struct{}{}, - })) -} - -func keys(m map[string]struct{}) []string { - ret := make([]string, 0, len(m)) - fmt.Println(cap(ret)) - for key := range m { - ret = append(ret, key) - fmt.Println(cap(ret)) - } - return ret -} -``` - -_[Run it on the Go Playground][9]_ - -In the first code sample our capacity starts at `0`, and then increases to `1`, `2`, `4`, and then finally `8`, meaning we had to allocate a new array 5 different times, and on top of that the final array used to back our slice has a capacity of `8`, which is bigger than we ultimately needed. - -On the other hand, our second sample starts and ends with the same capacity (`5`) and only needs to allocate it once at the start of the `keys()` function. We also avoid wasting any extra memory and return a slice with the perfect size array backing it. - -### Don't over-optimize - -As I said before, I typically wouldn't encourage anyone to worry about minor optimizations like this, but in cases where it is really obvious what the final size should be I strongly encourage you to try to set an appropriate capacity or length for your slices. - -Not only does it help improve the performance of your application, but it can also help clarify your code a bit by explicitly stating the relationship between the size of your input and the size of your output. - -### In summary... - -> Hi there! I write a lot about Go, web development, and other topics I find interesting. -> -> If you want to stay up to date with my writing, please [sign up for my mailing list][10]. I'll send you a FREE sample of my upcoming book, Web Development with Go, and an occasional email when I publish a new article (usually 1-2 per week). -> -> Oh, and I promise I don't spam. I hate it as much as you do :) - -This article is not meant to be an exhaustive discussion on the differences between slices or arrays, but instead is meant to serve as a brief introduction into how capacity and length affect your slices, and what purpose they serve in the grand scheme of things. - -For further reading, I highly recommend the following articles from the Go Blog: - -* [Go Slices: usage and internals][11] -* [Arrays, slices (and strings): The mechanics of 'append'][12] -* [Slice Tricks][13] - --------------------------------------------------------------------------------- - -作者简介: - -Jon is a software consultant and the author of the book Web Development with Go. Prior to that he founded EasyPost, a Y Combinator backed startup, and worked at Google. -https://www.usegolang.com - --------------------------------------------------------------------------------- - - -via: https://www.calhoun.io/how-to-use-slice-capacity-and-length-in-go - -作者:[Jon Calhoun][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.calhoun.io/hire-me -[1]:https://play.golang.org/p/7PgUqBdZ6Z -[2]:https://play.golang.org/p/Np6-NEohm2 -[3]:https://play.golang.org/p/M_qaNGVbC- -[4]:https://play.golang.org/p/d6OUulTYM7 -[5]:https://play.golang.org/p/JI8Fx3fJCU -[6]:https://play.golang.org/p/kIKxkdX35B -[7]:https://play.golang.org/p/h5hVAHmqJm -[8]:https://play.golang.org/p/fDbAxtAjLF -[9]:https://play.golang.org/p/nwT8X9-7eQ -[10]:https://www.calhoun.io/how-to-use-slice-capacity-and-length-in-go/?utm_source=golangweekly&utm_medium=email#mailing-list-form -[11]:https://blog.golang.org/go-slices-usage-and-internals -[12]:https://blog.golang.org/slices -[13]:https://github.com/golang/go/wiki/SliceTricks -[14]:https://www.calhoun.io/how-to-use-slice-capacity-and-length-in-go/ diff --git a/translated/tech/20170126 How to use slice capacity and length in Go.md b/translated/tech/20170126 How to use slice capacity and length in Go.md new file mode 100644 index 0000000000..f44d13bfa5 --- /dev/null +++ b/translated/tech/20170126 How to use slice capacity and length in Go.md @@ -0,0 +1,324 @@ +
[在 Go 中如何使用切片的容量和长度][14] +============================================================
+ + + +快速测试 - 下面的代码输出什么? + +``` +vals := make([]int, 5) +for i := 0; i < 5; i++ { + vals = append(vals, i) +} +fmt.Println(vals) +``` + +_[在 Go Playground 运行一下][1]_ + +如果你猜测的是 `[0 0 0 0 0 0 1 2 3 4]`,那你是对的。 + +_等等,什么?_ 为什么不是 `[0 1 2 3 4]`? + +如果你在测试中做错了,你也不用担心。这是在 Go 过渡的过程中相当常见的错误,在这篇文章中,我们将说明为什么输出不是你预期的,以及如何利用 Go 的细微差别来使你的代码更有效率。 + +### 切片 vs 数组 + +在 Go 中同时有数组和切片。这可能令人困惑,但一旦你习惯了,你会喜欢上它。请相信我 + +切片和数组之间存在许多差异,但我们要在本文中重点介绍的内容是数组的大小是其类型的一部分,而切片可以具有动态大小,因为它们是围绕数组的包装。 + +这在实践中意味着什么?那么假设我们有数组 `val a [10]int`。该数组具有固定大小,且无法更改。如果我们调用 “len(a)”,它总是返回 10,因为这个大小是类型的一部分。因此,如果你突然在数组中需要超过 10 个项,则必须创建一个完全不同类型的新对象,例如 `val b [11]int`,然后将所有值从 `a` 复制到 `b`。 + +在特定情况下,含有集合大小的数组是有价值的,但一般而言,这不是开发人员想要的。相反,他们希望在 Go 中使用类似于数组的东西,但是随着时间的推移,它们能够随时增长。一个粗略的方式是创建一个比它需要大得多的数组,然后将数组的一个子集视为数组。下面的代码是个例子。 + +``` +var vals [20]int +for i := 0; i < 5; i++ { + vals[i] = i * i +} +subsetLen := 5 + +fmt.Println("The subset of our array has a length of:", subsetLen) + +// Add a new item to our array +vals[subsetLen] = 123 +subsetLen++ +fmt.Println("The subset of our array has a length of:", subsetLen) +``` + +_[在 Go Playground 中运行][2]_ + +在代码中,我们有一个长度为 20 的数组,但是由于我们只使用一个子集,代码中我们可以假定数组的长度是 5,然后在我们向数组中添加一个新的项之后是 6。 + +这是(非常粗略地说)切片是如何工作的。它们包含一个具有设置大小的数组,就像我们前面的例子中的数组一样,它的大小为 20。 + +它们还跟踪程序中使用的数组的子集 - 这就是 `append` 属性,它类似于上一个例子中的 `subsetLen` 变量。 + +最后,一个 slice 还有一个 `capacity`,类似于前面例子中我们的数组(20)的总长度。这是很有用的, 因为它会告诉你的子集在无法容纳切片数组之前可以增长的大小。当发生这种情况时,需要分配一个新的数组,但所有这些逻辑都隐藏在 `append` 函数的后面。 + +简而言之,使用 `append` 函数组合切片给我们一个非常类似于数组的类型,但随着时间的推移,它可以处理更多的元素。 + +我们再来看一下前面的例子,但是这次我们将使用切片而不是数组。 + +``` +var vals []int +for i := 0; i < 5; i++ { + vals = append(vals, i) + fmt.Println("The length of our slice is:", len(vals)) + fmt.Println("The capacity of our slice is:", cap(vals)) +} + +// Add a new item to our array +vals = append(vals, 123) +fmt.Println("The length of our slice is:", len(vals)) +fmt.Println("The capacity of our slice is:", cap(vals)) + +// Accessing items is the same as an array +fmt.Println(vals[5]) +fmt.Println(vals[2]) +``` + +_[在 Go Playground 中运行][3]_ + +我们仍然可以像数组一样访问我们的切片中的元素,但是通过使用切片和 `append` 函数,我们不再需要考虑背后数组的大小。我们仍然可以通过使用 `len` 和 `cap` 函数来计算出这些东西,但是我们不用担心太多。简洁吧? + +### 回到测试 + +记住这点,让我们回顾前面的测试,看下什么出错了。 + +``` +vals := make([]int, 5) +for i := 0; i < 5; i++ { + vals = append(vals, i) +} +fmt.Println(vals) +``` + +当调用 `make` 时,我们允许最多传入 3 个参数。第一个是我们分配的类型,第二个是类型的 `长度`,第三个是类型的 `容量`(_这个参数是可选的_)。 + +通过传递参数 `make([]int, 5)`,我们告诉程序我们要创建一个长度为 5 的切片,在这种情况下,默认的容量与长度相同 - 本例中是 5。 + +虽然这可能看起来像我们想要的那样,这里的重要区别是我们告诉我们的切片,我们要将 `长度` 和 `容量` 设置为 5,假设你想要在初始的 5 个元素_之后_添加新的元素,我们接着调用 `append` 函数,那么它会增加容量的大小,并且会在切片的最后添加新的元素。 + +如果在代码中添加一条 `Println()` 语句,你可以看到容量的变化。 + +``` +vals := make([]int, 5) +fmt.Println("Capacity was:", cap(vals)) +for i := 0; i < 5; i++ { + vals = append(vals, i) + fmt.Println("Capacity is now:", cap(vals)) +} + +fmt.Println(vals) +``` + +_[在 Go Playground 中运行][4]_ + +最后,我们最终得到 `[0 0 0 0 0 0 1 2 3 4]` 的输出而不是希望的 `[0 1 2 3 4]`。 + +如何修复它呢?好的,这有几种方法,我们将讲解两种,你可以选取任何一种在你的场景中最有用的方法。 + +### 直接使用索引写入而不是 `append` + +第一种修复是保留 `make` 调用不变,并且显式地使用索引来设置每个元素。这样,我们就得到如下的代码: + +``` +vals := make([]int, 5) +for i := 0; i < 5; i++ { + vals[i] = i +} +fmt.Println(vals) +``` + +_[在 Go Playground 中运行][5]_ + +在这种情况下,我们设置的值恰好与我们要使用的索引相同,但是你也可以独立跟踪索引。 + +比如,如果你想要获取 map 的键,你可以使用下面的代码。 + +``` +package main + +import "fmt" + +func main() { + fmt.Println(keys(map[string]struct{}{ + "dog": struct{}{}, + "cat": struct{}{}, + })) +} + +func keys(m map[string]struct{}) []string { + ret := make([]string, len(m)) + i := 0 + for key := range m { + ret[i] = key + i++ + } + return ret +} +``` + +_[在 Go Playground 中运行][6]_ + +这样做很好,因为我们知道我们返回的切片的长度将与 map 的长度相同,因此我们可以用该长度初始化我们的切片,然后将每个元素分配到适当的索引中。这种方法的缺点是我们必须跟踪 `i`,以便了解每个索引要设置的值。 + +这就让我们引出了第二种方法。。。 + +### 使用 `0` 作为你的长度并指定容量 + +与其跟踪我们要添加的值的索引,我们可以更新我们的 `make` 调用,并在切片类型之后提供两个参数。第一个,我们的新切片的长度将被设置为 `0`,因为我们还没有添加任何新的元素到切片中。第二个,我们新切片的容量将被设置为 map 参数的长度,因为我们知道我们的切片最终会添加许多字符串。 + +这会如前面的例子那样仍旧会在背后构建相同的数组,但是现在当我们调用 `append` 时,它会将它们放在切片开始处,因为切片的长度是0。 + +``` +package main + +import "fmt" + +func main() { + fmt.Println(keys(map[string]struct{}{ + "dog": struct{}{}, + "cat": struct{}{}, + })) +} + +func keys(m map[string]struct{}) []string { + ret := make([]string, 0, len(m)) + for key := range m { + ret = append(ret, key) + } + return ret +} +``` + +_[在 Go Playground 中运行][7]_ + +### 如果 `append` 处理它,为什么我们还要担心容量呢? + +接下来你可能会问:“如果 `append` 函数可以为我增加切片的容量,那我们为什么要告诉程序容量呢? + +事实是,在大多数情况下,你不必担心这太多。如果它使你的代码变得更复杂,只需用 `var vals []int` 初始化你的切片,然后让 `append` 函数处理接下来的事。 + +但这种情况是不同的。它并不是声明容量是困难的例子,实际上这很容易确定我们的切片的最后容量,因为我们知道它将直接映射到提供的 map 中。因此,当我们初始化它时,我们可以声明切片的容量,并免于让我们程序执行不必要的内存分配。 + +如果要查看额外的内存分配情况,请在 Go Playground 上运行以下代码。每次增加容量,程序都需要做一次内存分配。 + +``` +package main + +import "fmt" + +func main() { + fmt.Println(keys(map[string]struct{}{ + "dog": struct{}{}, + "cat": struct{}{}, + "mouse": struct{}{}, + "wolf": struct{}{}, + "alligator": struct{}{}, + })) +} + +func keys(m map[string]struct{}) []string { + var ret []string + fmt.Println(cap(ret)) + for key := range m { + ret = append(ret, key) + fmt.Println(cap(ret)) + } + return ret +} +``` + +_[在 Go Playground 中运行][8]_ + +现在将此与相同的代码进行比较, 但具有预定义的容量。 + +``` +package main + +import "fmt" + +func main() { + fmt.Println(keys(map[string]struct{}{ + "dog": struct{}{}, + "cat": struct{}{}, + "mouse": struct{}{}, + "wolf": struct{}{}, + "alligator": struct{}{}, + })) +} + +func keys(m map[string]struct{}) []string { + ret := make([]string, 0, len(m)) + fmt.Println(cap(ret)) + for key := range m { + ret = append(ret, key) + fmt.Println(cap(ret)) + } + return ret +} +``` + +_[在 Go Playground 中运行][9]_ + +在第一个代码示例中,我们的容量从 `0` 开始,然后增加到 `1`、 `2`、 `4`, 最后是 `8`,这意味着我们不得不分配 5 次数组,最后一个容纳我们切片的数组的容量是 `8`,这比我们最终需要的要大。 + +另一方面,我们的第二个例子开始和结束都是相同的容量(`5`),它只需要在 `keys()` 函数的开头分配一次。我们还避免了浪费任何额外的内存,并返回一个能放下这个数组的完美大小的切片。 + +### 不要过分优化 + +如前所述,我通常不鼓励任何人担心这样的小优化,但如果最后大小的效果真的很明显,那么我强烈建议你尝试为切片设置适当的容量或长度。 + +这不仅有助于提高程序的性能,还可以通过明确说明输入的大小和输出的大小之间的关系来帮助澄清你的代码。 + +### 总结 + +>你好!我写了很多关于Go、Web 开发和其他我觉得有趣的话题。 +> +>如果你想跟上最新的文章,请[注册我的邮件列表][10]。我会给你发送我新书的样例、Go 的 Web 开发、以及每当有新文章(通常每周 1-2 次)会给你发送邮件。 +> +>哦,我保证不会发垃圾邮件。我像你一样讨厌它 :) + +本文并不是对切片或数组之间差异的详细讨论,而是简要介绍了容量和长度如何影响切片,以及它们在方案中的用途。 + +为了进一步阅读,我强烈推荐 Go 博客中的以下文章: + +* [Go Slices:使用及内部][11] +* [数组、切片(和字符串):“append” 的机制][12] +* [切片技巧][13] + +-------------------------------------------------------------------------------- + +作者简介: + +Jon 是一名软件顾问,也是 “Web Development with Go” 一书的作者。在此之前,他创立了 EasyPost,一家 Y Combinator 支持的创业公司,并在 Google 工作。 +https://www.usegolang.com + +-------------------------------------------------------------------------------- + + +via: https://www.calhoun.io/how-to-use-slice-capacity-and-length-in-go + +作者:[Jon Calhoun][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.calhoun.io/hire-me +[1]:https://play.golang.org/p/7PgUqBdZ6Z +[2]:https://play.golang.org/p/Np6-NEohm2 +[3]:https://play.golang.org/p/M_qaNGVbC- +[4]:https://play.golang.org/p/d6OUulTYM7 +[5]:https://play.golang.org/p/JI8Fx3fJCU +[6]:https://play.golang.org/p/kIKxkdX35B +[7]:https://play.golang.org/p/h5hVAHmqJm +[8]:https://play.golang.org/p/fDbAxtAjLF +[9]:https://play.golang.org/p/nwT8X9-7eQ +[10]:https://www.calhoun.io/how-to-use-slice-capacity-and-length-in-go/?utm_source=golangweekly&utm_medium=email#mailing-list-form +[11]:https://blog.golang.org/go-slices-usage-and-internals +[12]:https://blog.golang.org/slices +[13]:https://github.com/golang/go/wiki/SliceTricks +[14]:https://www.calhoun.io/how-to-use-slice-capacity-and-length-in-go/ From 62f9e3871c8e2d3c7b61426c652564727635956e Mon Sep 17 00:00:00 2001 From: xiaojin Date: Mon, 15 May 2017 15:36:33 +0800 Subject: [PATCH 0076/1407] Delete 20170223 What a Linux Desktop Does Better.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 翻译完成,删除原文。 --- ...170223 What a Linux Desktop Does Better.md | 91 ------------------- 1 file changed, 91 deletions(-) delete mode 100644 sources/talk/20170223 What a Linux Desktop Does Better.md diff --git a/sources/talk/20170223 What a Linux Desktop Does Better.md b/sources/talk/20170223 What a Linux Desktop Does Better.md deleted file mode 100644 index 993ec19996..0000000000 --- a/sources/talk/20170223 What a Linux Desktop Does Better.md +++ /dev/null @@ -1,91 +0,0 @@ -# rusking translating -What a Linux Desktop Does Better -============================================================ - - ![linux-desktop-advantages](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2017-linux-1.jpg) - - ![](http://www.linuxinsider.com/images/2015/image-credit-adobe-stock_130x15.gif) - -After I [resolved to adopt Linux][3], my confidence grew slowly but surely. Security-oriented considerations were compelling enough to convince me to switch, but I soon discovered many more advantages to the Linux desktop. - -For those still unsure about making the transition, or those who have done so but may not know everything their system can do, I'll showcase here some of the Linux desktop's advantages. - -### You Can't Beat Free! - -First and foremost, Linux is literally free. Neither the operating system nor any of the programs you run will cost you a dime. Beyond the obvious financial benefit of getting software for free, Linux allows users to  _be_  free by affording access to the basic tools of modern computer use -- such as word processing and photo editing -- which otherwise might be unavailable due to the cost barrier. - -Microsoft Office, which sets the de facto standard formats for documents of nearly every kind, demands a US$70 per year subscription. However, you can run [LibreOffice][4] for free while still handling documents in all the same formats with ease. - -Free software also gives you the chance to try new programs, and with them new ways of pursuing business and leisure, without their prospective costs forcing you to make a commitment. - -Instead of painstakingly weighing the merits of Mac or Windows and then taking a leap of faith, you can consider a vast spectrum of choices offered by[hundreds of distributions][5] -- basically, different flavors of Linux -- by trying each in turn until you find the one that's right for you. - -Linux can even save money on hardware, as some manufacturers -- notably Dell -- offer a discount for buying a computer with Linux preinstalled. They can charge less because they don't have to pass on the cost of licensing Windows from Microsoft. - -### You Can Make It Your Own - -There is practically nothing in Linux that can't be customized. Among the projects central to the Linux ecosystem are desktop environments -- that is, collections of basic user programs and visual elements, like status bars and launchers, that make up the user interface. - -Some Linux distributions come bundled with a desktop environment. Ubuntu is paired with the Unity desktop, for example. Others, such as with Debian, give you a choice at installation. In either case, users are free to change to any one they like. - -Most distributions officially support (i.e., vouch for compatibility) dozens of the most popular desktops, which makes finding the one you like best that much simpler. Within the pantheon of desktops, you can find anything from glossy modern interfaces like KDE Plasma or [Gnome][6], to simple and lightweight ones like Xfce and MATE. Within each of these, you can personalize your setup further by changing the themes, system trays and menus, choosing from galleries of other users' screens for inspiration. - -The customization possibilities go well beyond aesthetics. If you prize system stability, you can run a distribution like Mint, which offers dependable hardware support and ensures smooth updates. - -On the other hand, if you want to live on the cutting edge, you can install an OS like Arch Linux, which gives you the latest update to each program as soon as developers release it. - -If you'd rather take the middle path and stick with a stable foundation while running a few programs on the bleeding edge, you can download the source code -- that is, the code files written by the program's developers -- and compile them yourself. That requires running the source code through a utility to translate them into files of 1s and 0s (called "binaries") for your computer to execute. - -The Linux system is yours to tweak in whatever ways work best for you. - -### Lock It Down - -This versatility lends itself well to a third major advantage to Linux: security. - -To start with, while there are viruses for Linux, the number pales in comparison even to those for Mac. More importantly, the fact that the code for the core OS framework is open source -- and thus transparent to evaluation -- means there are fewer vulnerabilities in your basic system. - -While proprietary (i.e., non-open source) OSes sometimes are criticized as maliciously compromising user security, they pose just as great a threat due to poorly implemented, opaque processes. - -For instance, lots of Windows computers by default [do not check the cryptographic signatures][7] -- the mathematically guaranteed seals of authenticity -- on OS updates. - -With Linux, you can implement as much fine-grained control over signature checking as you choose, and the major distributions enforce safe default settings. This kind of accountability arises directly from the transparency of Linux's open source development model. - -Rolling release distributions like Arch add even more security, as critical patches are available almost as soon as they are approved. You would be hard-pressed to find a single mainstream OS that offers daily updates, but with Linux there are dozens. - -### It's a Natural Development Platform - -With a Linux desktop, developers -- or anyone interested in programming -- have the added benefit of Linux's great development tools. Among the best compiling tools around are the GNU C Compiler, or GCC, and GNU Autoconf, both key foundations of Linux. - -Linux comfortably supports dozens of programming languages available in most default repositories, which are the pools of pre-compiled software available to a distribution. - -Much of the Internet's infrastructure and many connected devices run on Linux -- from servers to smart devices such as security cameras and thermostats. Coding for these devices on Linux makes testing that much easier. If you have a computer-related project, Linux has everything you need to get the job done. - -### Community Is at the Heart of Everything Linux - -Finally, Linux has a tightly knit and friendly community. Because Linux is a relatively niche desktop OS, with around 3 percent market share, those who use it want prospective newcomers to stick around. - -User forums, especially for beginner-friendly distributions like Ubuntu, include comprehensive guides to walk you through the basics and troubleshoot issues. Because power users tend to prefer Linux, wiki pages for distributions often contain thorough documentation -- often applicable across distributions -- to enable users to pursue even the most esoteric projects. - -There are even casual Linux forums and [Reddit][8] threads for everything from comparing different software to showing off desktop themes. Taken together, this makes for a community with more camaraderie than I ever experienced as a Windows user. - -Immersing myself in the world of Linux for just over two years has convinced me that it offers something for everyone. I hope this brief sampling of its advantages gives you a sense of what you might discover in a Linux desktop. But don't just take my word for it -- the real fun is finding out for yourself! - --------------------------------------------------------------------------------- - -via: http://www.linuxinsider.com/story/84326.html?rss=1 - -作者:[Jonathan Terrasi ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.linkedin.com/company/ect-news-network -[1]:http://www.linuxinsider.com/story/84326.html?rss=1# -[2]:http://www.linuxinsider.com/perl/mailit/?id=84326 -[3]:http://www.linuxinsider.com/story/84286.html -[4]:http://www.libreoffice.org/ -[5]:https://en.wikipedia.org/wiki/Linux_distribution -[6]:http://en.wikipedia.org/wiki/GNOME -[7]:https://duo.com/blog/out-of-box-exploitation-a-security-analysis-of-oem-updaters -[8]:http://www.reddit.com/ From 1a3d0789f8da1734aa7d54861e92a2f9a32f44ee Mon Sep 17 00:00:00 2001 From: xiaojin Date: Mon, 15 May 2017 15:42:27 +0800 Subject: [PATCH 0077/1407] Add files via upload --- ...170223 What a Linux Desktop Does Better.md | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 sources/talk/20170223 What a Linux Desktop Does Better.md diff --git a/sources/talk/20170223 What a Linux Desktop Does Better.md b/sources/talk/20170223 What a Linux Desktop Does Better.md new file mode 100644 index 0000000000..4e926e480b --- /dev/null +++ b/sources/talk/20170223 What a Linux Desktop Does Better.md @@ -0,0 +1,91 @@ +What a Linux Desktop Does Better +============================================================ +Linux 桌面系统的优势 + + ![linux-desktop-advantages](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2017-linux-1.jpg) + + ![](http://www.linuxinsider.com/images/2015/image-credit-adobe-stock_130x15.gif) + +当我放弃 Windows [转而使用 Linux 系统][3] 后,我的信心不断增长。出于安全方面的考虑促使我选用 Linux 系统,但是我很快发现了很多使用 Linux 桌面系统的优势。 + +对于那些还对 Linux 系统犹豫不决,或是那些不甚了解 Linux 系统的用户,我将通过这篇文章给大家介绍一些使用 Linux 桌面系统的优势。 + +### 免费才是王道 + +首先, Linux 系统完全免费。你无须为使用的操作系统或软件花费一分钱。除了免费获取软件产生的经济效益之外,你还可以在 Linux 系统中随意使用当前一些很流行的软件——比如文字处理软件和照片编辑软件——但是,由于费用方面的原因,我们可能不太愿意花钱去购买这些软件。 + +微软的 Office 办公软件几乎是处理各种类型文档的一种标准软件了,但是它每年的费用竟高达 70 美元。然而,你却可以免费使用 [LibreOffice][4] 软件来代替,它同样可以处理各种类型的文档,而且使用也很方便。 + +免费软件还能让您有机会尝试新的功能,并与它们一起寻求商业发展和操作便捷的新方式,而且你也不需要支付任何预期的费用。 + +与其费尽周折的去衡量 Mac 或 Windows 系统的优点,你可以考虑下在[上百款不同风格的 Linux 发行版][5]中选择一款最适合自己的操作系统。 + +Linux 系统甚至在硬件方面也为用户节省了不少钱,比如有些厂商——尤其是戴尔公司——为购买预安装了 Linux 系统的电脑的用户提供打折优惠。这些电脑的价格相对来说比较便宜,因为用户无须再花钱购买微软的 Windows 系统许可证。 + +### 随心所欲的系统定制 + +其次,在 Linux 系统中,你可以对系统功能进行任意更改。 Linux 生态系统中的核心项目之一就是桌面环境——它是一些由基础用户程序和可视化元素组成的一个集合,比如状态栏和启动器,这些元素构成了用户与计算机的一个交互界面。 + +有些 Linux 发行版还预安装了桌面环境。比如, Ubuntu 系统就预安装了 Unity 桌面。其它系统,比如 Debian 会在系统安装的过程中让用户选择需要的桌面环境。总之,在 Linux 系统中,用户都可以随意更换他们喜欢的桌面环境。 + +大多数的 Linux 发行版都支持(也就是兼容)那些非常流行的桌面环境,因此,找到一款适合自己的桌面系统也非常容易。在桌面系统这个万花筒里,你可以找到界面华丽的系统桌面,比如 KDE Plasma 或者 [Gnome][6],以及轻量级的系统桌面,比如 Xfce 和 MATE 桌面。使用任一款系统桌面,你都可以通过更改主题、系统托盘和菜单,以及根据其它用户的桌面环境来进一步定制自己的桌面环境。 + +Linux 系统的可定制特性完全超出你的想象力。如果你更看重系统的稳定性,你可以使用 Mint 这个发行版系统,它对硬件的兼容性非常好,而且也能确保系统顺利更新。 + +除此之外,如果你想使用最简洁的 Linux 系统,你可以安装 Arch Linux ,它提供最新的稳定版系统,并且每一款软件只要开发者发布出来,你就可以进行更新使用。 + +如果你愿意在源生版的 Linux 系统中运行几个小程序,你可以下载程序的源代码,然后自己进行编译。这就需要你使用工具来编译源代码,生成 01 的二进制文件,这样你的电脑才能运行该软件。 + +你可以使用自己喜欢的任何方式去折腾属于自己的 Linux 系统。 + +### 无与伦比的安全性 + +第三,Linux 系统还有一个更重要的特性:安全。 + +起初,尽管有一些针对 Linux 系统的病毒,但是跟 Mac 系统比起来,已经屈指可数了。更重要的是,实际上 Linux 系统的核心代码是开源的,对用户完全透明,这意味着你的 Linux 系统漏洞更少。 + +然而,一些专有(未开源)的操作系统被认为是不安全的,因为它们会启动一些不透明的进程,这严重影响了系统的安全性。 + +比如说, Windows 系统在升级的过程中,默认情况下[不会检查加密签名][7]来验证更新文件的可靠性。 + +而使用 Linux 系统,你可以在选择更新时通过签名方式进行严格的细粒度控制,大多数的发行版在系统更新时都实行默认的安全设置。这种安全性源自 Linux 系统的开源开发模式。 + +像 Arch Linux 这种滚动发行版则增加了更多的安全性设置,因为一些重要的补丁一旦可用, Arch Linux 会即时进行验证。你可能很难找到那些每天都提供更新的单一主流操作系统,但是这样的 Linux 发行版却有很多。 + +### 开箱即用的编程环境 + +很多开发者或者任何对编程有兴趣的人都得益于 Linux 桌面系统中集成的强大开发工具。其中包括那些最经典的编程工具,比如 GNU C 编译器,或者 GCC 和 GNU Autoconf 工具都是 Linux 系统中一些非常重要的基础工具。 + +Linux 系统的默认软件库友好地支持数十种编程语言,这个软件库是 Linux 系统中的一个预编译软件池。 + +很多因特网的基础架构和相关连接设备都运行于 Linux 系统中——从服务器到智能设备,比如安防摄像机和恒温器。在 Linux 系统下开发调试这些设备的软件时非常容易。如果你有一个跟计算机相关的项目, Linux 系统可以完美地支持你完成这个项目。 + +### 社区是 Linux 系统发展的关键 + +最后一点, Linux 系统拥有一个紧密且友好型的社区。由于 Linux 在桌面系统中仅占有 3% 左右的市场份额,因此, Linux 社区更希望有更多的潜在用户加入进来。 + +Linux 系统有很多的用户论坛,尤其是对新手比较友好的 Unbuntu 系统论坛,它包括非常丰富且全面的知识来帮助用户解决一些基本的系统问题。很多高级用户更倾向于使用 Linux 系统,因此那些 Linux 发行版都拥有非常非常详尽维基文档,以指导用户完成高级的系统应用项目。 + +甚至还有业余的 Linux 论坛和 [Reddit] [8] 讨论区,所涉及的范围包括从对比 Linux 系统各种应用软件到炫耀桌面主题等。总而言之,这是一个比 Windows 用户群更加友善的社区。 + +我沉浸在 Linux 的世界里两年多了,我更加相信 Linux 系统对每一个用户都有所帮助。我希望这篇文章能够让你了解到 Linux 桌面系统的各种优势。但是真正的乐趣是从中发现自己感兴趣的东西! + +-------------------------------------------------------------------------------- + +via: http://www.linuxinsider.com/story/84326.html?rss=1 + +作者:[Jonathan Terrasi ][a] +译者:[rusking](https://github.com/rusking) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.linkedin.com/company/ect-news-network +[1]:http://www.linuxinsider.com/story/84326.html?rss=1# +[2]:http://www.linuxinsider.com/perl/mailit/?id=84326 +[3]:http://www.linuxinsider.com/story/84286.html +[4]:http://www.libreoffice.org/ +[5]:https://en.wikipedia.org/wiki/Linux_distribution +[6]:http://en.wikipedia.org/wiki/GNOME +[7]:https://duo.com/blog/out-of-box-exploitation-a-security-analysis-of-oem-updaters +[8]:http://www.reddit.com/ From 4ef842ba613a28534fd83558c8a336410b9d0513 Mon Sep 17 00:00:00 2001 From: xiaojin Date: Mon, 15 May 2017 15:47:25 +0800 Subject: [PATCH 0078/1407] Delete 20170223 What a Linux Desktop Does Better.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加错了,删除译文。 --- ...170223 What a Linux Desktop Does Better.md | 91 ------------------- 1 file changed, 91 deletions(-) delete mode 100644 sources/talk/20170223 What a Linux Desktop Does Better.md diff --git a/sources/talk/20170223 What a Linux Desktop Does Better.md b/sources/talk/20170223 What a Linux Desktop Does Better.md deleted file mode 100644 index 4e926e480b..0000000000 --- a/sources/talk/20170223 What a Linux Desktop Does Better.md +++ /dev/null @@ -1,91 +0,0 @@ -What a Linux Desktop Does Better -============================================================ -Linux 桌面系统的优势 - - ![linux-desktop-advantages](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2017-linux-1.jpg) - - ![](http://www.linuxinsider.com/images/2015/image-credit-adobe-stock_130x15.gif) - -当我放弃 Windows [转而使用 Linux 系统][3] 后,我的信心不断增长。出于安全方面的考虑促使我选用 Linux 系统,但是我很快发现了很多使用 Linux 桌面系统的优势。 - -对于那些还对 Linux 系统犹豫不决,或是那些不甚了解 Linux 系统的用户,我将通过这篇文章给大家介绍一些使用 Linux 桌面系统的优势。 - -### 免费才是王道 - -首先, Linux 系统完全免费。你无须为使用的操作系统或软件花费一分钱。除了免费获取软件产生的经济效益之外,你还可以在 Linux 系统中随意使用当前一些很流行的软件——比如文字处理软件和照片编辑软件——但是,由于费用方面的原因,我们可能不太愿意花钱去购买这些软件。 - -微软的 Office 办公软件几乎是处理各种类型文档的一种标准软件了,但是它每年的费用竟高达 70 美元。然而,你却可以免费使用 [LibreOffice][4] 软件来代替,它同样可以处理各种类型的文档,而且使用也很方便。 - -免费软件还能让您有机会尝试新的功能,并与它们一起寻求商业发展和操作便捷的新方式,而且你也不需要支付任何预期的费用。 - -与其费尽周折的去衡量 Mac 或 Windows 系统的优点,你可以考虑下在[上百款不同风格的 Linux 发行版][5]中选择一款最适合自己的操作系统。 - -Linux 系统甚至在硬件方面也为用户节省了不少钱,比如有些厂商——尤其是戴尔公司——为购买预安装了 Linux 系统的电脑的用户提供打折优惠。这些电脑的价格相对来说比较便宜,因为用户无须再花钱购买微软的 Windows 系统许可证。 - -### 随心所欲的系统定制 - -其次,在 Linux 系统中,你可以对系统功能进行任意更改。 Linux 生态系统中的核心项目之一就是桌面环境——它是一些由基础用户程序和可视化元素组成的一个集合,比如状态栏和启动器,这些元素构成了用户与计算机的一个交互界面。 - -有些 Linux 发行版还预安装了桌面环境。比如, Ubuntu 系统就预安装了 Unity 桌面。其它系统,比如 Debian 会在系统安装的过程中让用户选择需要的桌面环境。总之,在 Linux 系统中,用户都可以随意更换他们喜欢的桌面环境。 - -大多数的 Linux 发行版都支持(也就是兼容)那些非常流行的桌面环境,因此,找到一款适合自己的桌面系统也非常容易。在桌面系统这个万花筒里,你可以找到界面华丽的系统桌面,比如 KDE Plasma 或者 [Gnome][6],以及轻量级的系统桌面,比如 Xfce 和 MATE 桌面。使用任一款系统桌面,你都可以通过更改主题、系统托盘和菜单,以及根据其它用户的桌面环境来进一步定制自己的桌面环境。 - -Linux 系统的可定制特性完全超出你的想象力。如果你更看重系统的稳定性,你可以使用 Mint 这个发行版系统,它对硬件的兼容性非常好,而且也能确保系统顺利更新。 - -除此之外,如果你想使用最简洁的 Linux 系统,你可以安装 Arch Linux ,它提供最新的稳定版系统,并且每一款软件只要开发者发布出来,你就可以进行更新使用。 - -如果你愿意在源生版的 Linux 系统中运行几个小程序,你可以下载程序的源代码,然后自己进行编译。这就需要你使用工具来编译源代码,生成 01 的二进制文件,这样你的电脑才能运行该软件。 - -你可以使用自己喜欢的任何方式去折腾属于自己的 Linux 系统。 - -### 无与伦比的安全性 - -第三,Linux 系统还有一个更重要的特性:安全。 - -起初,尽管有一些针对 Linux 系统的病毒,但是跟 Mac 系统比起来,已经屈指可数了。更重要的是,实际上 Linux 系统的核心代码是开源的,对用户完全透明,这意味着你的 Linux 系统漏洞更少。 - -然而,一些专有(未开源)的操作系统被认为是不安全的,因为它们会启动一些不透明的进程,这严重影响了系统的安全性。 - -比如说, Windows 系统在升级的过程中,默认情况下[不会检查加密签名][7]来验证更新文件的可靠性。 - -而使用 Linux 系统,你可以在选择更新时通过签名方式进行严格的细粒度控制,大多数的发行版在系统更新时都实行默认的安全设置。这种安全性源自 Linux 系统的开源开发模式。 - -像 Arch Linux 这种滚动发行版则增加了更多的安全性设置,因为一些重要的补丁一旦可用, Arch Linux 会即时进行验证。你可能很难找到那些每天都提供更新的单一主流操作系统,但是这样的 Linux 发行版却有很多。 - -### 开箱即用的编程环境 - -很多开发者或者任何对编程有兴趣的人都得益于 Linux 桌面系统中集成的强大开发工具。其中包括那些最经典的编程工具,比如 GNU C 编译器,或者 GCC 和 GNU Autoconf 工具都是 Linux 系统中一些非常重要的基础工具。 - -Linux 系统的默认软件库友好地支持数十种编程语言,这个软件库是 Linux 系统中的一个预编译软件池。 - -很多因特网的基础架构和相关连接设备都运行于 Linux 系统中——从服务器到智能设备,比如安防摄像机和恒温器。在 Linux 系统下开发调试这些设备的软件时非常容易。如果你有一个跟计算机相关的项目, Linux 系统可以完美地支持你完成这个项目。 - -### 社区是 Linux 系统发展的关键 - -最后一点, Linux 系统拥有一个紧密且友好型的社区。由于 Linux 在桌面系统中仅占有 3% 左右的市场份额,因此, Linux 社区更希望有更多的潜在用户加入进来。 - -Linux 系统有很多的用户论坛,尤其是对新手比较友好的 Unbuntu 系统论坛,它包括非常丰富且全面的知识来帮助用户解决一些基本的系统问题。很多高级用户更倾向于使用 Linux 系统,因此那些 Linux 发行版都拥有非常非常详尽维基文档,以指导用户完成高级的系统应用项目。 - -甚至还有业余的 Linux 论坛和 [Reddit] [8] 讨论区,所涉及的范围包括从对比 Linux 系统各种应用软件到炫耀桌面主题等。总而言之,这是一个比 Windows 用户群更加友善的社区。 - -我沉浸在 Linux 的世界里两年多了,我更加相信 Linux 系统对每一个用户都有所帮助。我希望这篇文章能够让你了解到 Linux 桌面系统的各种优势。但是真正的乐趣是从中发现自己感兴趣的东西! - --------------------------------------------------------------------------------- - -via: http://www.linuxinsider.com/story/84326.html?rss=1 - -作者:[Jonathan Terrasi ][a] -译者:[rusking](https://github.com/rusking) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.linkedin.com/company/ect-news-network -[1]:http://www.linuxinsider.com/story/84326.html?rss=1# -[2]:http://www.linuxinsider.com/perl/mailit/?id=84326 -[3]:http://www.linuxinsider.com/story/84286.html -[4]:http://www.libreoffice.org/ -[5]:https://en.wikipedia.org/wiki/Linux_distribution -[6]:http://en.wikipedia.org/wiki/GNOME -[7]:https://duo.com/blog/out-of-box-exploitation-a-security-analysis-of-oem-updaters -[8]:http://www.reddit.com/ From 742d569e84d6e0e8e711c895b38ddb84b12d45bb Mon Sep 17 00:00:00 2001 From: xiaojin Date: Mon, 15 May 2017 15:48:16 +0800 Subject: [PATCH 0079/1407] translated: 20170223 What a Linux Desktop Does Better MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 翻译完成,添加译文。 --- ...170223 What a Linux Desktop Does Better.md | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 translated/talk/20170223 What a Linux Desktop Does Better.md diff --git a/translated/talk/20170223 What a Linux Desktop Does Better.md b/translated/talk/20170223 What a Linux Desktop Does Better.md new file mode 100644 index 0000000000..4e926e480b --- /dev/null +++ b/translated/talk/20170223 What a Linux Desktop Does Better.md @@ -0,0 +1,91 @@ +What a Linux Desktop Does Better +============================================================ +Linux 桌面系统的优势 + + ![linux-desktop-advantages](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2017-linux-1.jpg) + + ![](http://www.linuxinsider.com/images/2015/image-credit-adobe-stock_130x15.gif) + +当我放弃 Windows [转而使用 Linux 系统][3] 后,我的信心不断增长。出于安全方面的考虑促使我选用 Linux 系统,但是我很快发现了很多使用 Linux 桌面系统的优势。 + +对于那些还对 Linux 系统犹豫不决,或是那些不甚了解 Linux 系统的用户,我将通过这篇文章给大家介绍一些使用 Linux 桌面系统的优势。 + +### 免费才是王道 + +首先, Linux 系统完全免费。你无须为使用的操作系统或软件花费一分钱。除了免费获取软件产生的经济效益之外,你还可以在 Linux 系统中随意使用当前一些很流行的软件——比如文字处理软件和照片编辑软件——但是,由于费用方面的原因,我们可能不太愿意花钱去购买这些软件。 + +微软的 Office 办公软件几乎是处理各种类型文档的一种标准软件了,但是它每年的费用竟高达 70 美元。然而,你却可以免费使用 [LibreOffice][4] 软件来代替,它同样可以处理各种类型的文档,而且使用也很方便。 + +免费软件还能让您有机会尝试新的功能,并与它们一起寻求商业发展和操作便捷的新方式,而且你也不需要支付任何预期的费用。 + +与其费尽周折的去衡量 Mac 或 Windows 系统的优点,你可以考虑下在[上百款不同风格的 Linux 发行版][5]中选择一款最适合自己的操作系统。 + +Linux 系统甚至在硬件方面也为用户节省了不少钱,比如有些厂商——尤其是戴尔公司——为购买预安装了 Linux 系统的电脑的用户提供打折优惠。这些电脑的价格相对来说比较便宜,因为用户无须再花钱购买微软的 Windows 系统许可证。 + +### 随心所欲的系统定制 + +其次,在 Linux 系统中,你可以对系统功能进行任意更改。 Linux 生态系统中的核心项目之一就是桌面环境——它是一些由基础用户程序和可视化元素组成的一个集合,比如状态栏和启动器,这些元素构成了用户与计算机的一个交互界面。 + +有些 Linux 发行版还预安装了桌面环境。比如, Ubuntu 系统就预安装了 Unity 桌面。其它系统,比如 Debian 会在系统安装的过程中让用户选择需要的桌面环境。总之,在 Linux 系统中,用户都可以随意更换他们喜欢的桌面环境。 + +大多数的 Linux 发行版都支持(也就是兼容)那些非常流行的桌面环境,因此,找到一款适合自己的桌面系统也非常容易。在桌面系统这个万花筒里,你可以找到界面华丽的系统桌面,比如 KDE Plasma 或者 [Gnome][6],以及轻量级的系统桌面,比如 Xfce 和 MATE 桌面。使用任一款系统桌面,你都可以通过更改主题、系统托盘和菜单,以及根据其它用户的桌面环境来进一步定制自己的桌面环境。 + +Linux 系统的可定制特性完全超出你的想象力。如果你更看重系统的稳定性,你可以使用 Mint 这个发行版系统,它对硬件的兼容性非常好,而且也能确保系统顺利更新。 + +除此之外,如果你想使用最简洁的 Linux 系统,你可以安装 Arch Linux ,它提供最新的稳定版系统,并且每一款软件只要开发者发布出来,你就可以进行更新使用。 + +如果你愿意在源生版的 Linux 系统中运行几个小程序,你可以下载程序的源代码,然后自己进行编译。这就需要你使用工具来编译源代码,生成 01 的二进制文件,这样你的电脑才能运行该软件。 + +你可以使用自己喜欢的任何方式去折腾属于自己的 Linux 系统。 + +### 无与伦比的安全性 + +第三,Linux 系统还有一个更重要的特性:安全。 + +起初,尽管有一些针对 Linux 系统的病毒,但是跟 Mac 系统比起来,已经屈指可数了。更重要的是,实际上 Linux 系统的核心代码是开源的,对用户完全透明,这意味着你的 Linux 系统漏洞更少。 + +然而,一些专有(未开源)的操作系统被认为是不安全的,因为它们会启动一些不透明的进程,这严重影响了系统的安全性。 + +比如说, Windows 系统在升级的过程中,默认情况下[不会检查加密签名][7]来验证更新文件的可靠性。 + +而使用 Linux 系统,你可以在选择更新时通过签名方式进行严格的细粒度控制,大多数的发行版在系统更新时都实行默认的安全设置。这种安全性源自 Linux 系统的开源开发模式。 + +像 Arch Linux 这种滚动发行版则增加了更多的安全性设置,因为一些重要的补丁一旦可用, Arch Linux 会即时进行验证。你可能很难找到那些每天都提供更新的单一主流操作系统,但是这样的 Linux 发行版却有很多。 + +### 开箱即用的编程环境 + +很多开发者或者任何对编程有兴趣的人都得益于 Linux 桌面系统中集成的强大开发工具。其中包括那些最经典的编程工具,比如 GNU C 编译器,或者 GCC 和 GNU Autoconf 工具都是 Linux 系统中一些非常重要的基础工具。 + +Linux 系统的默认软件库友好地支持数十种编程语言,这个软件库是 Linux 系统中的一个预编译软件池。 + +很多因特网的基础架构和相关连接设备都运行于 Linux 系统中——从服务器到智能设备,比如安防摄像机和恒温器。在 Linux 系统下开发调试这些设备的软件时非常容易。如果你有一个跟计算机相关的项目, Linux 系统可以完美地支持你完成这个项目。 + +### 社区是 Linux 系统发展的关键 + +最后一点, Linux 系统拥有一个紧密且友好型的社区。由于 Linux 在桌面系统中仅占有 3% 左右的市场份额,因此, Linux 社区更希望有更多的潜在用户加入进来。 + +Linux 系统有很多的用户论坛,尤其是对新手比较友好的 Unbuntu 系统论坛,它包括非常丰富且全面的知识来帮助用户解决一些基本的系统问题。很多高级用户更倾向于使用 Linux 系统,因此那些 Linux 发行版都拥有非常非常详尽维基文档,以指导用户完成高级的系统应用项目。 + +甚至还有业余的 Linux 论坛和 [Reddit] [8] 讨论区,所涉及的范围包括从对比 Linux 系统各种应用软件到炫耀桌面主题等。总而言之,这是一个比 Windows 用户群更加友善的社区。 + +我沉浸在 Linux 的世界里两年多了,我更加相信 Linux 系统对每一个用户都有所帮助。我希望这篇文章能够让你了解到 Linux 桌面系统的各种优势。但是真正的乐趣是从中发现自己感兴趣的东西! + +-------------------------------------------------------------------------------- + +via: http://www.linuxinsider.com/story/84326.html?rss=1 + +作者:[Jonathan Terrasi ][a] +译者:[rusking](https://github.com/rusking) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.linkedin.com/company/ect-news-network +[1]:http://www.linuxinsider.com/story/84326.html?rss=1# +[2]:http://www.linuxinsider.com/perl/mailit/?id=84326 +[3]:http://www.linuxinsider.com/story/84286.html +[4]:http://www.libreoffice.org/ +[5]:https://en.wikipedia.org/wiki/Linux_distribution +[6]:http://en.wikipedia.org/wiki/GNOME +[7]:https://duo.com/blog/out-of-box-exploitation-a-security-analysis-of-oem-updaters +[8]:http://www.reddit.com/ From 6dca62fceba07201a7e32da9384ccfb9a71accb1 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 15 May 2017 17:06:19 +0800 Subject: [PATCH 0080/1407] PRF:20170210 Best Third-Party Repositories for CentOS.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @Dotcra 可以看得出翻译的很用心。不过如果有和原文不同的调整,可以写个译者注告知校对,我会校对和发布时酌情处理。加油! --- ...est Third-Party Repositories for CentOS.md | 34 ++++++++++--------- 1 file changed, 18 insertions(+), 16 deletions(-) diff --git a/translated/tech/20170210 Best Third-Party Repositories for CentOS.md b/translated/tech/20170210 Best Third-Party Repositories for CentOS.md index cabc81df2d..db17012bc1 100644 --- a/translated/tech/20170210 Best Third-Party Repositories for CentOS.md +++ b/translated/tech/20170210 Best Third-Party Repositories for CentOS.md @@ -1,15 +1,15 @@ -CentOS 最好用的第三方仓库 +CentOS 上最佳的第三方仓库 ============================================================ +![CentOS](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/centos.png?itok=YRMQVk7U "CentOS") - ![CentOS](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/centos.png?itok=YRMQVk7U "CentOS") ->CentOS 上从 Software Collections, EPEL, 和 Remi 获得可靠的新版软件。[Creative Commons Attribution][1] +> 从 Software Collections、EPEL 和 Remi 获得可靠的 CentOS 新版软件。 -在 RHEL 上,为那些早已老掉牙的软件提供支持已经是厂家的传统了。这倒不是因为他们懒,而确实是用户需要。很多公司像看待家具一样看待软件:我买一张桌子,能用一辈子,软件不应该也这样吗? +在 Red Hat 企业 Linux(RHEL) 上,提供那些早已老掉牙的软件已经是企业级软件厂商的传统了。这倒不是因为他们懒,而确实是用户需要。很多公司像看待家具一样看待软件:我买一张桌子,能用一辈子,软件不应该也这样吗? -CentOS 作为 RHEL 的复制品有着同样的遭遇。虽然 Red Hat 还在为这些被厂商抛弃的过时软件提供支持、修补安全漏洞等,但如果你的应用依赖新版软件,你就得想办法了。 我在这个问题上不止一次碰壁。 LAMP 组合里任一个组件都需要其他所有组件能与其兼容,这有时就显得很麻烦。 比如说去年我就被 RHEL/CentOS 折腾得够呛。第 6 版最高支持 PHP 5.3 ,第 7 版支持到 PHP 5.4 。而 PHP 5.3 早在 2014 年 8 月就到达 EOL(End Of Life) ,不再被厂商支持了, PHP 5.4 的 EOL 在 2015 年 9 月, 5.5 则是 2016 年 7 月。 有太多古老的软件版本,包括 MySQL ,Python 等,它们应该像木乃伊一样被展示在博物馆里,但它们却在你的系统上。 +CentOS 作为 RHEL 的复制品有着同样的遭遇。虽然 Red Hat 还在为这些被厂商抛弃的过时软件提供支持、修补安全漏洞等,但如果你的应用依赖新版软件,你就得想办法了。 我在这个问题上不止一次碰壁。 LAMP 组合里任一个组件都需要其它所有组件能与其兼容,这有时就显得很麻烦。 比如说去年我就被 RHEL/CentOS 折腾得够呛。REHL/CentOS 第 6 版最高支持 PHP 5.3 ,第 7 版支持到 PHP 5.4 。而 PHP 5.3 早在 2014 年 8 月就到达 EOL(End Of Life) ,不再被厂商支持了, PHP 5.4 的 EOL 在 2015 年 9 月, 5.5 则是 2016 年 7 月。 有太多古老的软件版本,包括 MySQL、Python 等,它们应该像木乃伊一样被展示在博物馆里,但它们却活在你的系统上。 -那么,可怜的管理员们该怎么办呢?如果你跑着 RHEL/CentOS ,那应该先试试 [Software Collections][3],因为这是 Red Hat 唯一支持的新软件包源。 [Software Collections][3] 为 CentOS 设立了专门的仓库,安装和管理都和其他第三方仓库一样。但如果你用的是 RHEL 的,情况就有点不同了,具体请参考 [the RHEL way][4] 。[Software Collections][3] 同样支持 Fedora 和 Scientific Linux 。 +那么,可怜的管理员们该怎么办呢?如果你跑着 RHEL/CentOS ,那应该先试试 [Software Collections][3],因为这是 Red Hat 唯一支持的新软件包源。 [Software Collections][3] 为 CentOS 设立了专门的仓库,安装和管理都和其它第三方仓库一样。但如果你用的是 RHEL 的,情况就有点不同了,具体请参考 [RHEL 的解决方法][4]。[Software Collections][3] 同样支持 Fedora 和 Scientific Linux 。 ### 安装 Software Collections @@ -18,7 +18,8 @@ CentOS 作为 RHEL 的复制品有着同样的遭遇。虽然 Red Hat 还在为 ``` $ sudo yum install centos-release-scl ``` -`centos-release-scl-rh` 可能作为依赖被同时安装。 + +`centos-release-scl-rh` 可能作为依赖包被同时安装。 然后就可以像平常一样搜索、安装软件包了: @@ -38,9 +39,9 @@ $ php -v PHP 7.0.10 ``` -此命令会开启一个新的 bash 并配置好环境变量以便运行新软件包。 如果需要的话,你还得为 Python ,PHP,MySQL 等安装对应的扩展包,有些配置文件也需要修改以指向新版软件(比如 Apache )。 +此命令会开启一个新的 bash 并配置好环境变量以便运行新软件包。 如果需要的话,你还得安装对应的扩展包,比如对于 Python 、PHP、MySQL 等软件包,有些配置文件也需要修改以指向新版软件(比如 Apache )。 -上面设置的环境变量 PATH 并不会保存,重启后要重新设置。SCL 的设计初衷就是在不影响原有配置的前提下,让新旧软件能一起运行。不过你可以通过 `~/.bashrc` 加载 SCL 提供的脚本来实现自动启用。 SCL 的所有软件包都安装在 `/opt` 下, 以我们的 PHP 7 为例,在 `~/.bashrc` 里加入一行: +这些 SCL 软件包在重启后不会激活。SCL 的设计初衷就是在不影响原有配置的前提下,让新旧软件能一起运行。不过你可以通过 `~/.bashrc` 加载 SCL 提供的 `enable` 脚本来实现自动启用。 SCL 的所有软件包都安装在 `/opt` 下, 以我们的 PHP 7 为例,在 `~/.bashrc` 里加入一行: ``` source /opt/rh/rh-php70/enable @@ -48,9 +49,9 @@ source /opt/rh/rh-php70/enable 以后相应的软件包就能在重启后自动启用了。有新软件保驾护航,你终于可以专注于自己的业务了。 -### 打印出可用软件包 +### 列出可用软件包 -那么,到底 Software Collections 里都是些什么呢? centos-release-scl 里有一些额外的由社区维护的软件包。除了在 [CentOS Wiki][5] 查看软件包列表外,你还可以使用 Yum 。我们先来看看安装了哪些仓库: +那么,到底 Software Collections 里都是些什么呢? centos-release-scl 里有一些由社区维护的额外的软件包。除了在 [CentOS Wiki][5] 查看软件包列表外,你还可以使用 Yum 。我们先来看看安装了哪些仓库: ``` $ yum repolist @@ -63,7 +64,8 @@ extras/7/x86_64 CentOS-7 - Extras updates/7/x86_64 CentOS-7 - Updates ``` -Yum 没有专门用来打印某一个仓库中所有软件包的命令,所以你得这样来: (译者注:实际上有,`yum repo-pkgs REPO list`,需要root 权限,dnf 同) +Yum 没有专门用来打印某一个仓库中所有软件包的命令,所以你得这样来: (LCTT 译注:实际上有,`yum repo-pkgs REPO list`,需要 root 权限,dnf 同) + ``` $ yum --disablerepo "*" --enablerepo centos-sclo-rh \ list available | less @@ -73,7 +75,7 @@ $ yum --disablerepo "*" --enablerepo centos-sclo-rh \ ### EPEL -强大的 Fedora 社区为 Feora 及所有 RHEL 系的发行版维护着 [EPEL, Extra Packages for Enterprise Linux][6] 。 里面包含一些最新软件包以及一些未被发行版收纳的软件包。安装 EPEL 里的软件就不用麻烦 enable 脚本了,直接像平常一样用。你还可以用 `--disablerepo` 和 `--enablerepo` 选项指定从 EPEL 里安装软件包: +强大的 Fedora 社区为 Feora 及所有 RHEL 系的发行版维护着 [EPEL:Extra Packages for Enterprise Linux][6] 。 里面包含一些最新软件包以及一些未被发行版收纳的软件包。安装 EPEL 里的软件就不用麻烦 `enable` 脚本了,直接像平常一样用。你还可以用 `--disablerepo` 和 `--enablerepo` 选项指定从 EPEL 里安装软件包: ``` $ sudo yum --disablerepo "*" --enablerepo epel install [package] @@ -81,9 +83,9 @@ $ sudo yum --disablerepo "*" --enablerepo epel install [package] ### Remi Collet -Remi Collet 在 [Remi's RPM repository][7] 维护着大量额外的最新软件包。先安装 EPEL ,因为 Remi 仓库依赖它。 +Remi Collet 在 [Remi 的 RPM 仓库][7] 里维护着大量更新的和额外的软件包。需要先安装 EPEL ,因为 Remi 仓库依赖它。 -CentOS wiki 上有较完整的仓库列表 [additional third-party repositories][8] ,用哪些,不用哪些,里面都有建议。 +CentOS wiki 上有较完整的仓库列表:[更多的第三方仓库][8] ,用哪些,不用哪些,里面都有建议。 -------------------------------------------------------------------------------- @@ -91,7 +93,7 @@ via: https://www.linux.com/learn/intro-to-linux/2017/2/best-third-party-reposito 作者:[CARLA SCHRODER][a] 译者:[Dotcra](https://github.com/Dotcra) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 5e4bf9a8f6aae872be53a28d23ec1429326652e9 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 15 May 2017 17:07:47 +0800 Subject: [PATCH 0081/1407] PUB:20170210 Best Third-Party Repositories for CentOS.md https://linux.cn/article-8509-1.html --- .../20170210 Best Third-Party Repositories for CentOS.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170210 Best Third-Party Repositories for CentOS.md (100%) diff --git a/translated/tech/20170210 Best Third-Party Repositories for CentOS.md b/published/20170210 Best Third-Party Repositories for CentOS.md similarity index 100% rename from translated/tech/20170210 Best Third-Party Repositories for CentOS.md rename to published/20170210 Best Third-Party Repositories for CentOS.md From be15a9731ae11a1213b1674b645f0823ceda3c12 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 15 May 2017 18:11:31 +0800 Subject: [PATCH 0082/1407] PRF:20170202 How to make file-specific setting changes in Vim using Modeline.md @ucasFL --- ...c setting changes in Vim using Modeline.md | 60 +++++++++---------- 1 file changed, 29 insertions(+), 31 deletions(-) diff --git a/translated/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md b/translated/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md index ecb1f82826..82f497fc54 100644 --- a/translated/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md +++ b/translated/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md @@ -1,23 +1,17 @@ -如何在 Vim 中使用模式行进行文件特定设置的更改 +如何在 Vim 中使用模式行进行文件特定的设置 ============================================================ -### 摘要 +虽然[插件][4]毫无疑问是 Vim 最大的优势,然而,还有其它一些功能,使得它成为当今 Linux 用户中最强大、功能最丰富的文本编辑器/IDE 之一。其中一个功能就是可以根据文件做特定的设置。我们可以使用该编辑器的模式行(Modeline)特性来实现该功能。 -1. [VIM 模式行][2] - 1. [用法][1] -2. [结论][3] - -虽然[插件][4]毫无疑问是 Vim 最大的优势,然而,还有其它一些功能,使得它成为当今 Linux 用户中最强大、功能最丰富的文本编辑器/IDE 之一。其中一个功能就是进行文本特定设置的更改。我们可以使用编辑器的模式行特性来实现该功能。 - -在这篇文章中,我将讨论如何使用 Vim 的[模式行][5]特性来简单的理解一些例子。 +在这篇文章中,我将讨论如何使用 Vim 的[模式行(Modeline)][5]特性来简单的理解一些例子。 在开始之前,值得提醒一下,这篇教程中提及的所有例子、命令和指令都已经在 Ubuntu 16.04 中使用 Vim 7.4 版本测试过。 ### VIM 模式行 -### 用法 +#### 用法 -正如上面已经提到的, Vim 的模式行特性让你能够进行文件特定设置更改。比如,假设你想把项目中的一个特定文件中的所有制表符用空格替换,并且确保这个更改不会影响到其它所有文件。这是模式行帮助你完成你想做的事情的一个理想情况。 +正如上面已经提到的, Vim 的模式行特性让你能够进行特定于文件的更改。比如,假设你想把项目中的一个特定文件中的所有制表符用空格替换,并且确保这个更改不会影响到其它所有文件。这是模式行帮助你完成你想做的事情的一个理想情况。 因此,你可以考虑将下面这一行加入文件的开头或结尾来完成这件事。 @@ -25,35 +19,37 @@ # vim: set expandtab: ``` -有很大的可能性,如果你在 Linux 系统上尝试上面的练习来测试用例,它将不会像你所期望的那样工作。如果是这样,也不必担心,因为某些情况下,模式行特性需要先激活才能起作用(出于安全原因,在一些系统比如 Debian、Ubuntu、GGentoo 和 OSX 上默认情况下禁用)。 +(LCTT 译注:模式行就是一行以注释符,如 `#`、`//`、`/*` 开头,间隔一个空格,以 `vim:` 关键字触发的设置命令。可参看:http://vim.wikia.com/wiki/Modeline_magic ) -为了启用该特性,打开 .vimrc 文件(位于 `home` 目录),然后加入下面一行内容: +如果你是在 Linux 系统上尝试上面的练习来测试用例,很有可能它将不会像你所期望的那样工作。如果是这样,也不必担心,因为某些情况下,模式行特性需要先激活才能起作用(出于安全原因,在一些系统比如 Debian、Ubuntu、GGentoo 和 OSX 上默认情况下禁用)。 + +为了启用该特性,打开 `.vimrc` 文件(位于 `home` 目录),然后加入下面一行内容: ``` set modeline ``` -现在,无论何时你输入一个制表符然后保存文件(文件中已输入 expandtab 模式行命令的情况下),都会被自动转换为空白符 +现在,无论何时你在该文件输入一个制表符然后保存时(文件中已输入 `expandtab` 模式行命令的前提下),都会被自动转换为空格。 -让我们考虑另一个用例。假设在 Vim 中, Tab 默认设置为 4 个空格,但对于某个特殊的文件,你想把它增加到 8 个。对于这种情况,你需要在文件的开头或末尾加上下面这行内容: +让我们考虑另一个用例。假设在 Vim 中, 制表符默认设置为 4 个空格,但对于某个特殊的文件,你想把它增加到 8 个。对于这种情况,你需要在文件的开头或末尾加上下面这行内容: ``` // vim: noai:ts=8: ``` -现在,输入一个 Tab,你会看到,空格的数量为 8 个。 +现在,输入一个制表符,你会看到,空格的数量为 8 个。 你可能已经注意到我刚才说的,这些模式行命令需要加在靠近文件的顶部或底部。如果你好奇为什么是这样,那么理由是该特性以这种方式设计的。下面这一行(来自 Vim 官方文件)将会解释清楚: -“模式行不能随意放在文件中的一个位置:它需要放在文件中的前几行或最后几行。‘模式行’变量控制 Vim 检查模式行在文件中的确切位置。请查看: help modelines 。默认情况下,设置为 5 行。” +> “模式行不能随意放在文件中的任何位置:它需要放在文件中的前几行或最后几行。`modelines` 变量控制 Vim 检查模式行在文件中的确切位置。请查看 `:help modelines` 。默认情况下,设置为 5 行。” -下面是 :help modelines 命令(指上面提到的)输出的内容: +下面是 `:help modelines` 命令(上面提到的)输出的内容: -如果模式行已启用并且给出了行数那么便在相应位置查找设置命令。如果模式行禁用或模式行设置的行数为 0 则不查找。 +> 如果 `modeline` 已启用并且 `modelines` 给出了行数,那么便在相应位置查找 `set` 命令。如果 `modeline` 禁用或 `modelines` 设置的行数为 0 则不查找。 -尝试把模式行命令置于超出 5 行的范围(距离文件底部和顶部的距离均超过 5 行),你会发现, Tab 将会恢复为 Vim 默认数目的空格 — 在我的情况里是 4 个空格。 +尝试把模式行命令置于超出 5 行的范围(距离文件底部和顶部的距离均超过 5 行),你会发现, 制表符将会恢复为 Vim 默认数目的空格 — 在我的情况里是 4 个空格。 -然而,你可以按照自己的意愿改变默认行数,只需在你的 .vimrc 文件中加入下面一行命令 +然而,你可以按照自己的意愿改变默认行数,只需在你的 `.vimrc` 文件中加入下面一行命令 ``` set modelines=[新值] @@ -67,7 +63,7 @@ set modelines=10 这意味着,现在我可以把模式行命令置于文件前 10 行或最后 10 行的任意位置。 -继续,无论何时,当你在编辑以个文件的时候,你可以输入下面的命令(在 Vim 编辑器的命令模式下输入)来查看当前与命令行相关的设置以及它们最新的设置。 +继续,无论何时,当你在编辑一个文件的时候,你可以输入下面的命令(在 Vim 编辑器的命令模式下输入)来查看当前与命令行相关的设置以及它们最新的设置。 ``` :verbose set modeline? modelines? @@ -84,27 +80,29 @@ set modelines=10 关于 Vim 的模式行特性,你还需要知道一些重要的点: -* 默认情况下,该特性是启用的,并以不兼容 Vi 的模式运行,但需要注意的是,在一些发行版中,出于安全考虑,系统的 vimrc 文件禁止了 Vim 的该选项。 -* 默认情况下,当以 `root` 权限编辑文件时,该特性被禁用(如果你是使用 `sudo` 命令打开文件,那么该特性依旧能够正常工作)。 -* 通过 `set` 来设置模式行,以一个冒号结束,而不是反斜杠。没有 `set`,就无法设置该选项。比如,**/* vim: noai:ts=4:sw=4*/** 是一个无效的模式行。 +* 默认情况下,当 Vim 以非兼容(`nocompatible`)模式运行时该特性是启用的,但需要注意的是,在一些发行版中,出于安全考虑,系统的 `vimrc` 文件禁用了该选项。 +* 默认情况下,当以 root 权限编辑文件时,该特性被禁用(如果你是使用 `sudo` 方式打开该文件,那么该特性依旧能够正常工作)。 +* 通过 `set` 来设置模式行,其结束于第一个冒号,而非反斜杠。不使用 `set`,则后面的文本都是选项。比如,`/* vim: noai:ts=4:sw=4 */` 是一个无效的模式行。 -### 安全考虑 +(LCTT 译注:关于模式行中的 `set`,上述描述指的是:如果用 `set` 来设置,那么当发现第一个 `:` 时,表明选项结束,后面的 `*/` 之类的为了闭合注释而出现的文本均无关;而如果不用 `set` 来设置,那么以 `vim:` 起头的该行所有内容均视作选项。 ) -令人沮丧的是, Vim 的模式行特性可能会造成安全性问题。事实上,在过去,已经报道过多个和模式行相关的问题,包括[ shell 命令注入][6],[任意命令执行][7]和[无授权访问][8]等。我同意,这些问题发生在很早的一些时候,现在应该已经修复好了,但是,这提醒了我们,模式行特性有可能会被黑客滥用。 +#### 安全考虑 + +令人沮丧的是, Vim 的模式行特性可能会造成安全性问题。事实上,在过去,已经报道过多个和模式行相关的问题,包括 [shell 命令注入][6],[任意命令执行][7]和[无授权访问][8]等。我知道,这些问题发生在很早的一些时候,现在应该已经修复好了,但是,这提醒了我们,模式行特性有可能会被黑客滥用。 ### 结论 模式行可能是 Vim 编辑器的一个高级命令,但是它并不难理解。毫无疑问,它的学习曲线会有一些复杂,但是不需多问也知道,该特性是多么的有用。当然,出于安全考虑,在启用并使用该选项前,你需要对自己的选择进行权衡。 -你有使用过模式行特性吗?你的体验是什么样的?记得在下面的评论中分享给我们(以及整个 HowtoForge 社区)。 +你有使用过模式行特性吗?你的体验是什么样的?记得在下面的评论中分享给我们。 -------------------------------------------------------------------------------- via: https://www.howtoforge.com/tutorial/vim-modeline-settings/ -作者:[ Ansh][a] +作者:[Ansh][a] 译者:[ucasFL](https://github.com/ucasFL) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 @@ -112,7 +110,7 @@ via: https://www.howtoforge.com/tutorial/vim-modeline-settings/ [1]:https://www.howtoforge.com/tutorial/vim-modeline-settings/#usage [2]:https://www.howtoforge.com/tutorial/vim-modeline-settings/#vim-modeline [3]:https://www.howtoforge.com/tutorial/vim-modeline-settings/#conclusion -[4]:https://www.howtoforge.com/tutorial/vim-editor-plugins-for-software-developers-3/ +[4]:https://linux.cn/article-7901-1.html [5]:http://vim.wikia.com/wiki/Modeline_magic [6]:https://tools.cisco.com/security/center/viewAlert.x?alertId=13223 [7]:http://usevim.com/2012/03/28/modelines/ From dd75d8b620ecad5dd190b83c8eba4e299ddc88c1 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 15 May 2017 18:11:51 +0800 Subject: [PATCH 0083/1407] PUB:20170202 How to make file-specific setting changes in Vim using Modeline.md https://linux.cn/article-8510-1.html --- ...to make file-specific setting changes in Vim using Modeline.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170202 How to make file-specific setting changes in Vim using Modeline.md (100%) diff --git a/translated/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md b/published/20170202 How to make file-specific setting changes in Vim using Modeline.md similarity index 100% rename from translated/tech/20170202 How to make file-specific setting changes in Vim using Modeline.md rename to published/20170202 How to make file-specific setting changes in Vim using Modeline.md From 743ab5ae53f0a387686d3ef94e16f31527ef1f1b Mon Sep 17 00:00:00 2001 From: Flynn Date: Mon, 15 May 2017 18:38:30 +0800 Subject: [PATCH 0084/1407] Translating by ucasFL --- ...0212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md b/sources/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md index 78189e520d..c8e754b9d1 100644 --- a/sources/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md +++ b/sources/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md @@ -1,3 +1,4 @@ +ucasFL translating WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS ============================================================ From e4d5429eadfe4c4daa775af3335bfa3b8c1d19e4 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 16 May 2017 00:51:27 +0800 Subject: [PATCH 0085/1407] PRF:20170112 The 6 unwritten rules of open source development.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @Taylor1024 你翻译的文风比较自如,不错。不过有部分我的理解不同。此外,如果可以润色文字更优美一些就更好了,尤其是几个标题,要是有应景的古诗词则更佳。先校对一 遍,回头看看是否可以进一步改进。 --- ...ritten rules of open source development.md | 46 +++++++++++-------- 1 file changed, 26 insertions(+), 20 deletions(-) diff --git a/translated/tech/20170112 The 6 unwritten rules of open source development.md b/translated/tech/20170112 The 6 unwritten rules of open source development.md index 572fdffa91..47332fd4af 100644 --- a/translated/tech/20170112 The 6 unwritten rules of open source development.md +++ b/translated/tech/20170112 The 6 unwritten rules of open source development.md @@ -1,43 +1,49 @@ -六个开源开发的"潜规则" +六个开源软件开发的“潜规则” ============================================================ -你想成为开源项目中得意满满,功成名就的那个人吗,那就要遵守下面的"潜规则" +> 你想成为开源项目中得意满满、功成名就的那个人吗,那就要遵守下面的“潜规则”。 ![The 6 unwritten rules of open source development](http://images.techhive.com/images/article/2016/12/09_opensource-100698477-large.jpg) +正如体育界不成文的规定一样,这些规则基本上不会出现在官方文档和正式记录上。比如说,在棒球运动中,从比分远超时不要盗垒,到跑垒员跑了第一时也不要放弃四坏球保送。对于圈外人来讲,这些东西很难懂,甚至觉得没什么意义。但是对于那些想成为 MVP 的队员来说,这些都是理所当然的。 -Matt Hicks 是 Red Hat软件工程的副主席,也是 Red Hat 开源合作团队的奠基成员之一.他历时十五年,在软件工程中担任多种职务:开发,运行,架构,管理. +软件开发,特别是开源软件开发中,也有一套不成文的规定。和其它的团队运动一样,这些规定很大程度上决定了开源社区如何看待一名开发者,特别是小白。 -正如体育界不成文的规定一样,这些规则基本上不会在官方文档上,正式记录.比如说,在棒球运动中,从井口跑法时不要偷球,到有人第一时候不要放弃全力疾走.对于圈外人来讲,这些东西很难懂,甚至觉得没什么意义.但是对于那些想成为 MVP 的队员来说,这些都是理所应当的. +### 运行之前先调试 -软件开发,特别是开源软件开发中,也有一套不成文的规定.和其他团队运动一样,这些规定很大程度上决定了开源社区如何看待一名开发者,特别是小白. +在参与社区之前,比如开放源代码或者其它什么的,你需要做一些基本工作。对于有眼界的开源贡献者,这意味这你需要理解社区的目标,并学习应该从哪里起步。人人都想贡献源代码,但是只有少量的人做过准备,并且乐意、以及有能力完成这项艰苦卓绝的工作:测试补丁、复审代码、撰写文档、修正错误。所有的这些不受待见的任务在一个健康的社区中都是必要的。 -运行之前先调试 +为什么要在优雅地码代码前做这些呢?这是一种信任,更重要的是,不要只关注自己开发的功能,而是要关注整个社区的动向。 -在与社区互动前,开放源代码,或者其他什么的,你需要做一下基本工作.对于有眼界的开源贡献者,这意味这你需要理解社区的目标,从头学习.人人都想贡献源代码,但是只有少量的人做过准备,并且乐意,有能力完成这项艰苦卓绝的工作:测试补丁,检查代码,写文档,校正错误.所有的这些不受待见的任务在一个健康的社区中都需要有人去完成. +### 填坑而不是挖坑 -为什么要在优雅地码代码前做这些呢?这是一种信任,更重要的是,不要只关注自己开发的功能,而是要关注整个社区的动向 +当你在某个社区中建立起自己的声望,那么很有必要去全面了解该项目和代码。不要停留于任务状态上,而是要去钻研项目本身,理解那些超出你擅长范围之外的知识。不要只把自己的理解局限于开发者,这样会让你着眼于让你的代码有更大的影响,而不只是你那一亩三分地。 -填坑而不是挖坑 +打个比方,你已经完成了一个网络模块的测试版本。你测试了一下,觉得不错。然后你把它开放到社区,想要更多的人测试。结果发现,当它以特定的方式部署时,它有可能破坏安全设置,还可能导致主要的存储泄露。如果你将代码视为一个整体时候问题就可以迎刃而解,而不是孤立地看待问题。这表明,你要对项目各个部分如何与其他人协作交互有比较深入的理解。让你的补丁填坑而不是挖坑。这样你朝成为社区大牛的目标上又前进了一大步。 -当你在特定的社区中建立起自己的声望,那么很有必要去深入理解项目,和基础代码.不要在任务状态上停留,要去钻研项目本身,理解那些超出你擅长范围之外的知识.不要只把自己的理解局限于开发者.这样你会获得一种洞察力,让你的代码有更大的影响,而不只是你那一亩三分地. +### 不投放代码炸弹 -打个比方,你已经完成了一个网络模块的测试版本.你测试了一下,觉得不错.然后你把它开放到社区,想要更多的人测试.结果发现,如果将它运行在特定的管理器中,它有可能损害安全设置,还可能导致主存泄露.这个问题本可以在基础代码阶段就被解决,而不需要单独测试时候才发现.这说明,你要对项目各个部分如何与其他人协作交互有比较深的理解.让你的补丁填坑而不是挖坑.这样你朝成为社区大牛的目标上又前进了一大步. +代码提交完毕后你的工作还没结束。如果代码被接受,还会有一些关于这些更改的讨论,和常见的问答,还要做测试。你要确保你可以准时提交,努力去理解如何在不影响社区其他成员的情况下,改进代码和补丁。 -不要投放代码炸弹 +### 助己之前先助人 -代码提交完毕你的工作还没结束.你还要想一想以后的改变,和常见的问答,测试也没有完成.你要确保你可以准时提交,努力去理解如何在不影响社区其他成员的情况下,运行和修复代码. +开源社区不是自相残杀的世界,我们更看重项目的价值而非个体的贡献和成功。如果你想给自己加分,让自己成为更重要的社区成员和让社区接纳你的代码,那就努力帮助别人。如果你熟悉网络部分,那就去复审网络部分,用你的专业技能让整个代码更加优雅。很简单的道理,顶级的审查者经常和顶级的贡献者打交道。你帮助的人越多,你就越有价值。 -助己前先助人 -开源社区不是自相残杀的世界,我们更看重项目的价值而非个体的贡献和成功.如果你想给自己加分,让自己成为更厉害的社区成员,那就努力帮助别人.如果你熟悉网络部分,那就审查网络模块,用你的专业技能让整个代码更加优雅.很简单的道理,顶级的审查者经常和顶级的贡献者打交道.你帮助的越多,你就越有价值 +### 打磨抛光才算完 -作为一个开发者,你很可能需要开源项目中解决一个你十分头痛的技术点.可能你更想运行在一个目前还不支持的系统,你超想改革社区目前使用的安全技术.想要引进新技术,特别是比较有争议的技术,最好的办法就是让人无法拒绝它.你需要透彻地了解底层代码,考虑每一个微小的优势.在不影响已实现功能的前提下增加新功能.不仅要在计划上下功夫,还要在特性的完善上下功夫. +作为一个开发者,你很可能希望为开源项目解决一个特定的痛点。或许你想要运行在一个目前还不支持的系统上,抑或你超想改革社区目前使用的安全技术。想要引进新技术,特别是比较有争议的技术,最好的办法就是让人无法拒绝它。你需要透彻地了解底层代码,考虑每个极端情况。在不影响已实现功能的前提下增加新功能。不仅仅是完成就行,还要在特性的完善上下功夫。 -不要放弃 +### 不离不弃方始终 -开源社区也有多不靠谱的成员,所以提交中可靠性高的才能被采用.不要只是因为提交被上游拒绝就离开社区.找出原因,修正错误,然后再试一试.当你开发时候,要和基础代码保持一致,确保即使项目进化你的代码仍然可用.不要把你的代码留给别人修复,要自己修复.这样可以在社区形成良好的风气,每个人都自己改. +开源社区也有许多玩玩就算的人,但是承诺了就不要轻易失信。不要只是因为提交被拒就离开社区。找出原因,修正错误,然后再试一试。当你开发时候,要和整个代码保持一致,确保即使项目发生变化而你的补丁仍然可用。不要把你的代码留给别人修复,要自己修复。这样可以在社区形成良好的风气,每个人都自己改。 -这些"潜规则"看上去很简单,但是还是有许多开源项目的贡献者并没有遵守.成功的开发者不仅可以成功地为自己完成项目,还可以帮助开源社区. +--- + +这些"潜规则"看上去很简单,但是还是有许多开源项目的贡献者并没有遵守。这样做的开发者不仅可以为成功地推动他们自己的项目,而且也有助于开源社区。 + +作者简介: + +Matt Hicks 是 Red Hat 软件工程的副主席,也是 Red Hat 开源合作团队的奠基成员之一。他历时十五年,在软件工程中担任多种职务:开发,运行,架构,管理。 -------------------------------------------------------------------------------- @@ -45,7 +51,7 @@ via: http://www.infoworld.com/article/3156776/open-source-tools/the-6-unwritten- 作者:[Matt Hicks][a] 译者:[Taylor1024](https://github.com/Taylor1024) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 413650fac50283373cdb525d3b21c8c32a0b15f9 Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 16 May 2017 09:04:14 +0800 Subject: [PATCH 0086/1407] translating --- sources/tech/20170210 How to install OTRS on Ubuntu 16.04.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170210 How to install OTRS on Ubuntu 16.04.md b/sources/tech/20170210 How to install OTRS on Ubuntu 16.04.md index a51fb58308..ca6ddf42af 100644 --- a/sources/tech/20170210 How to install OTRS on Ubuntu 16.04.md +++ b/sources/tech/20170210 How to install OTRS on Ubuntu 16.04.md @@ -1,3 +1,5 @@ +translating---geekpi + How to install OTRS (OpenSource Trouble Ticket System) on Ubuntu 16.04 ============================================================ From 4560f5440d7155d88047e97ab9cb4129a41bd4be Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 16 May 2017 09:22:07 +0800 Subject: [PATCH 0087/1407] PRF&PUB:20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md @geekpi --- ...oftware for CPU and GPU on Ubuntu 16.04.md | 73 ++++++++++--------- 1 file changed, 39 insertions(+), 34 deletions(-) rename {translated/tech => published}/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md (71%) diff --git a/translated/tech/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md b/published/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md similarity index 71% rename from translated/tech/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md rename to published/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md index 3a9d2a21a0..828739dd01 100644 --- a/translated/tech/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md +++ b/published/20170502 Installing Google TensorFlow Neural Network Software for CPU and GPU on Ubuntu 16.04.md @@ -1,34 +1,27 @@ 在 Ubuntu 16.04 中安装支持 CPU 和 GPU 的 Google TensorFlow 神经网络软件 ============================================================ + +TensorFlow 是用于机器学习任务的开源软件。它的创建者 Google 希望提供一个强大的工具以帮助开发者探索和建立基于机器学习的应用,所以他们在去年作为开源项目发布了它。TensorFlow 是一个非常强大的工具,专注于一种称为深层神经网络deep neural network(DNN)的神经网络。 -### 在本页中 +深层神经网络被用来执行复杂的机器学习任务,例如图像识别、手写识别、自然语言处理、聊天机器人等等。这些神经网络被训练学习其所要执行的任务。由于训练所需的计算是非常巨大的,在大多数情况下需要 GPU 支持,这时 TensorFlow 就派上用场了。启用了 GPU 并安装了支持 GPU 的软件,那么训练所需的时间就可以大大减少。 -1. [1 安装 CUDA][1] -2. [2 安装 CuDNN 库][2] -3. [3 在 .bashrc 中添加安装位置][3] -4. [4 安装带有 GPU 支持的 TensorFlow][4] -5. [5 安装只支持 CPU 的 TensorFlow][5] +本教程可以帮助你安装只支持 CPU 的和同时支持 GPU 的 TensorFlow。要使用带有 GPU 支持的 TensorFLow,你必须要有一块支持 CUDA 的 Nvidia GPU。CUDA 和 CuDNN(Nvidia 的计算库)的安装有点棘手,本指南会提供在实际安装 TensorFlow 之前一步步安装它们的方法。 -TensorFlow 是用于机器学习任务的开源软件。它的创建者 Google 希望发布一个强大的工具帮助开发者探索和建立基于机器学习的程序,所以他们在今年作为开源项目发布了它。TensorFlow 是一个非常强大的工具,专注于一种称为深层神经网络的神经网络。 - -深层神经网络被用来执行复杂的机器学习任务,例如图像识别、手写识别、自然语言处理、聊天机器人等等。这些神经网络被训练学习它应该执行的任务。至于训练所需的计算是非常巨大的,在大多数情况下需要 CPU 支持,这时 TensorFlow 就派上用场了。启用了 GPU 并安装了支持 GPU 的软件,那么训练所需的时间就可以大大减少。 - -本教程可以帮助你安装只支持 CPU 和支持 GPU 的 TensorFlow。因此,要获得带有 GPU 支持的 TensorFLow,你必须要有一块支持 CUDA 的 Nvidia GPU。CUDA 和 CuDNN(Nvidia 的计算库)的安装有点棘手,本指南提供在实际安装 TensorFlow 之前一步步安装它们的方法。 - -Nvidia CUDA 是一个 GPU 加速库,它已经为标准神经网络程序调整过。CuDNN 是一个用于 GPU 的调整库,它负责 GPU 性能的自动调整。TensorFlow 同时依赖这两者用于训练并运行深层神经网络,因此它们必须在 TensorFlow 之前安装。 +Nvidia CUDA 是一个 GPU 加速库,它已经为标准神经网络中用到的标准例程调优过。CuDNN 是一个用于 GPU 的调优库,它负责 GPU 性能的自动调整。TensorFlow 同时依赖这两者用于训练并运行深层神经网络,因此它们必须在 TensorFlow 之前安装。 需要指出的是,那些不希望安装支持 GPU 的 TensorFlow 的人,你可以跳过以下所有的步骤并直接跳到:“步骤 5:安装只支持 CPU 的 TensorFlow”。 关于 TensorFlow 的介绍可以在[这里][10]找到。 +### 1、 安装 CUDA -### 1 安装 CUDA - -首先,在[这里][11]下载用于 Ubuntu 16.04 的 CUDA。此文件非常大(2GB),因此也许会花费一些时间下载。 +首先,在[这里][11]下载用于 Ubuntu 16.04 的 CUDA 库。此文件非常大(2GB),因此也许会花费一些时间下载。 下载的文件是 “.deb” 包。要安装它,运行下面的命令: +``` sudo dpkg -i cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64.deb +``` [ ![Install CUDA](https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/image1.png) @@ -36,11 +29,11 @@ sudo dpkg -i cuda-repo-ubuntu1604-8-0-local_8.0.44-1_amd64.deb 下面的的命令会安装所有的依赖,并最后安装 cuda 工具包: +``` sudo apt install -f - sudo apt update - sudo apt install cuda +``` 如果成功安装,你会看到一条消息说:“successfully installed”。如果已经安装了,接着你可以看到类似下面的输出: @@ -48,24 +41,25 @@ sudo apt install cuda ![Install CUDA with apt](https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/image2.png) ][13] -### 2 successfully installed +### 2、安装 CuDNN 库 CuDNN 下载需要花费一些功夫。Nvidia 没有直接提供下载文件(虽然它是免费的)。通过下面的步骤获取 CuDNN。 -1.点击[此处][8]进入 Nvidia 的注册页面并创建一个帐户。第一页要求你输入你的个人资料,第二页会要求你回答几个调查问题。如果你不知道所有答案也没问题,你可以随机选择一个选项。 -2.通过前面的步骤,Nvidia 会向你的邮箱发送一个激活链接。在你激活之后,直接进入[这里][9]的 CuDNN 下载链接。 -3.登录之后,你需要填写另外一份类似的调查。随机点击复选框,然后点击调查底部的 “proceed to Download”,在下一页我们点击同意使用条款。 -4.最后,在下拉中点击 “Download cuDNN v5.1 (Jan 20, 2017), for CUDA 8.0”,最后,你需要下载这两个文件: +1. 点击[此处][8]进入 Nvidia 的注册页面并创建一个帐户。第一页要求你输入你的个人资料,第二页会要求你回答几个调查问题。如果你不知道所有答案也没问题,你可以随便选择一个选项。 +2. 通过前面的步骤,Nvidia 会向你的邮箱发送一个激活链接。在你激活之后,直接进入[这里][9]的 CuDNN 下载链接。 +3. 登录之后,你需要填写另外一份类似的调查。随机勾选复选框,然后点击调查底部的 “proceed to Download”,在下一页我们点击同意使用条款。 +4. 最后,在下拉中点击 “Download cuDNN v5.1 (Jan 20, 2017), for CUDA 8.0”,最后,你需要下载这两个文件: * [cuDNN v5.1 Runtime Library for Ubuntu14.04 (Deb)][6] * [cuDNN v5.1 Developer Library for Ubuntu14.04 (Deb)][7] -注意:即使说的是用于 Ubuntu 14.04 的库。它也适用于 16.04。 +注意:即使上面说的是用于 Ubuntu 14.04 的库。它也适用于 16.04。 现在你已经同时有 CuDNN 的两个文件了,是时候安装它们了!在包含这些文件的文件夹内运行下面的命令: +``` sudo dpkg -i libcudnn5_5.1.5-1+cuda8.0_amd64.deb - sudo dpkg -i libcudnn5-dev_5.1.5-1+cuda8.0_amd64.deb +``` 下面的图片展示了这些命令的输出: @@ -73,34 +67,41 @@ sudo dpkg -i libcudnn5-dev_5.1.5-1+cuda8.0_amd64.deb ![Install the CuDNN library](https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/image3.png) ][14] -### 3 在 bashrc 中添加安装位置 +### 3、 在 bashrc 中添加安装位置 -安装位置应该被添加到 bashrc 中,以便系统下一次知道如何找到这些用于 CUDA 的文件。使用下面的命令打开 bashrc 文件: +安装位置应该被添加到 bashrc 文件中,以便系统下一次知道如何找到这些用于 CUDA 的文件。使用下面的命令打开 bashrc 文件: +``` sudo gedit ~/.bashrc +``` 文件打开后,添加下面两行到文件的末尾: ``` - export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64" - export CUDA_HOME=/usr/local/cuda +export LD_LIBRARY_PATH="$LD_LIBRARY_PATH:/usr/local/cuda/lib64:/usr/local/cuda/extras/CUPTI/lib64" +export CUDA_HOME=/usr/local/cuda ``` -### 4 安装带有 GPU 支持的 TensorFlow +### 4、 安装带有 GPU 支持的 TensorFlow 这步我们将安装带有 GPU 支持的 TensorFlow。如果你使用的是 Python 2.7,运行下面的命令: +``` pip install TensorFlow-gpu +``` 如果安装了 Python 3.x,使用下面的命令: +``` pip3 install TensorFlow-gpu +``` 安装完后,你会看到一条 “successfully installed” 的消息。现在,剩下要测试的是是否已经正确安装。打开终端并输入下面的命令测试: +``` python - import TensorFlow as tf +``` 你应该会看到类似下面图片的输出。在图片中你可以观察到 CUDA 库已经成功打开了。如果有任何错误,消息会提示说无法打开 CUDA 甚至无法找到模块。为防你或许遗漏了上面的某步,仔细重做教程的每一步就行了。 @@ -108,17 +109,21 @@ import TensorFlow as tf ![Install TensorFlow with GPU support](https://www.howtoforge.com/images/installing_tensorflow_machine_learning_software_for_cpu_and_gpu_on_ubuntu_1604/image4.png) ][15] -### 5 安装只支持 CPU 的 TensorFlow +### 5、 安装只支持 CPU 的 TensorFlow 注意:这步是对那些没有 GPU 或者没有 Nvidia GPU 的人而言的。其他人请忽略这步!! 安装只支持 CPU 的 TensorFlow 非常简单。使用下面两个命令: +``` pip install TensorFlow +``` 如果你有 python 3.x,使用下面的命令: +``` pip3 install TensorFlow +``` 是的,就是这么简单! @@ -128,9 +133,9 @@ pip3 install TensorFlow via: https://www.howtoforge.com/tutorial/installing-tensorflow-neural-network-software-for-cpu-and-gpu-on-ubuntu-16-04/ -作者:[Akshay Pai ][a] +作者:[Akshay Pai][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/) 荣誉推出 From 1209c5db70fbad19d3d029aeccaff7cab17107a2 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 16 May 2017 09:50:55 +0800 Subject: [PATCH 0088/1407] PRF&PUB:20160604 Microfluidic cooling may prevent the demise of Moore's Law.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @messon007 翻译的很专业 --- ...g may prevent the demise of Moore's Law.md | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) rename {translated/talk => published}/20160604 Microfluidic cooling may prevent the demise of Moore's Law.md (55%) diff --git a/translated/talk/20160604 Microfluidic cooling may prevent the demise of Moore's Law.md b/published/20160604 Microfluidic cooling may prevent the demise of Moore's Law.md similarity index 55% rename from translated/talk/20160604 Microfluidic cooling may prevent the demise of Moore's Law.md rename to published/20160604 Microfluidic cooling may prevent the demise of Moore's Law.md index 95bba906d8..32e26525d2 100644 --- a/translated/talk/20160604 Microfluidic cooling may prevent the demise of Moore's Law.md +++ b/published/20160604 Microfluidic cooling may prevent the demise of Moore's Law.md @@ -1,46 +1,44 @@ - 微流冷却技术可能让摩尔定律起死回生 ============================================================ ![](http://tr1.cbsistatic.com/hub/i/r/2015/12/09/a7cb82d1-96e8-43b5-bfbd-d4593869b230/resize/620x/9607388a284e3a61a39f4399a9202bd7/networkingistock000042544852agsandrew.jpg) ->Image: iStock/agsandrew + +*Image: iStock/agsandrew* 现有的技术无法对微芯片进行有效的冷却,这正快速成为摩尔定律消亡的第一原因。 随着对数字计算速度的需求,科学家和工程师正努力地将更多的晶体管和支撑电路放在已经很拥挤的硅片上。的确,它非常地复杂,然而,和复杂性相比,热量聚积引起的问题更严重。 -洛克希德马丁公司首席研究员John Ditri在新闻稿中说到:当前,我们可以放入微芯片的功能是有限的,最主要的原因之一是发热的管理。如果你能管理好发热,你可以用较少的芯片,较少的材料,那样就可以节约成本,并能减少系统的大小和重量。如果你能管理好发热,用相同数量的芯片将能获得更好的系统性能。 +洛克希德马丁公司首席研究员 John Ditri 在新闻稿中说到:当前,我们可以放入微芯片的功能是有限的,最主要的原因之一是发热的管理。如果你能管理好发热,你可以用较少的芯片,也就是说较少的材料,那样就可以节约成本,并能减少系统的大小和重量。如果你能管理好发热,用相同数量的芯片将能获得更好的系统性能。 硅对电子流动的阻力产生了热量,在如此小的空间封装如此多的晶体管累积了足以毁坏元器件的热量。一种消除热累积的方法是在芯片层用光子学技术减少电子的流动,然而光子学技术有它的一系列问题。 -SEE:2015年硅光子将引起数据中心的革命 [Silicon photonics will revolutionize data centers in 2015][5] +参见: [2015 年硅光子将引起数据中心的革命][5] ### 微流冷却技术可能是问题的解决之道 -为了寻找其他解决办法,国防高级研究计划局DARPA发起了一个关于ICECool应用[ICECool Applications][6] (片内/片间增强冷却技术)的项目。GSA网站 [GSA website FedBizOpps.gov][7] 报道:ICECool正在探索革命性的热技术,其将减轻热耗对军用电子系统的限制,同时能显著减小军用电子系统的尺寸,重量和功耗。 +为了寻找其他解决办法,美国国防高级研究计划局 DARPA 发起了一个关于 [ICECool 应用][6] (片内/片间增强冷却技术)的项目。 [GSA 的网站 FedBizOpps.gov][7] 报道:ICECool 正在探索革命性的热技术,其将减轻热耗对军用电子系统的限制,同时能显著减小军用电子系统的尺寸,重量和功耗。 微流冷却方法的独特之处在于组合使用片内和(或)片间微流冷却技术和片上热互连技术。 ![](http://tr4.cbsistatic.com/hub/i/r/2016/05/25/fd3d0d17-bd86-4d25-a89a-a7050c4d59c4/resize/300x/e9c18034bde66526310c667aac92fbf5/microcooling-1.png) ->MicroCooling 1 Image: DARPA -DARPA ICECool应用项目 [DARPA ICECool Application announcement][8] 指出, 这种微型片内和(或)片间通道可采用轴向微通道,径向通道和(或)横流通道,采用微孔和歧管结构及局部液体喷射形式来疏散和重新引导微流,从而以最有利的方式来满足指定的散热指标。 +*MicroCooling 1 Image: DARPA* -通过上面的技术,洛克希德马丁的工程师已经实验性地证明了片上冷却是如何得到显著改善的。洛克希德马丁新闻报道:ICECool项目的第一阶段发现,当冷却具有多个局部30kW/cm2热点,发热为1kw/cm2的芯片时热阻减少了4倍,进而验证了洛克希德的嵌入式微流冷却方法的有效性。 +[DARPA ICECool 应用发布的公告][8] 指出,这种微型片内和(或)片间通道可采用轴向微通道、径向通道和(或)横流通道,采用微孔和歧管结构及局部液体喷射形式来疏散和重新引导微流,从而以最有利的方式来满足指定的散热指标。 -第二阶段,洛克希德马丁的工程师聚焦于RF放大器。通过ICECool的技术,团队演示了RF的输出功率可以得到6倍的增长,而放大器仍然比其常规冷却的更凉。 +通过上面的技术,洛克希德马丁的工程师已经实验性地证明了片上冷却是如何得到显著改善的。洛克希德马丁新闻报道:ICECool 项目的第一阶段发现,当冷却具有多个局部 30kW/cm2 热点,发热为 1kw/cm2 的芯片时热阻减少了 4 倍,进而验证了洛克希德的嵌入式微流冷却方法的有效性。 + +第二阶段,洛克希德马丁的工程师聚焦于 RF 放大器。通过 ICECool 的技术,团队演示了 RF 的输出功率可以得到 6 倍的增长,而放大器仍然比其常规冷却的更凉。 ### 投产 -出于对技术的信心,洛克希德马丁已经在设计和制造实用的微流冷却发射天线。 Lockheed Martin还与Qorvo合作,将其热解决方案与Qorvo的高性能GaN工艺 [GaN process][9] 集成. +出于对技术的信心,洛克希德马丁已经在设计和制造实用的微流冷却发射天线。 洛克希德马丁还与 Qorvo 合作,将其热解决方案与 Qorvo 的高性能 [ GaN 工艺][9] 相集成。 -研究论文 [DARPA's Intra/Interchip Enhanced Cooling (ICECool) Program][10] 的作者认为ICECool将使电子系统的热管理模式发生改变。ICECool应用的执行者将根据应用来定制片内和片间的热管理方法,这个方法需要兼顾应用的材料,制造工艺和工作环境。 +研究论文 [DARPA 的片间/片内增强冷却技术(ICECool)流程][10] 的作者认为 ICECool 将使电子系统的热管理模式发生改变。ICECool 应用的执行者将根据应用来定制片内和片间的热管理方法,这个方法需要兼顾应用的材料,制造工艺和工作环境。 如果微流冷却能像科学家和工程师所说的成功的话,似乎摩尔定律会起死回生。 -更多的关于网络的信息,请订阅Data Centers newsletter。 - -[SUBSCRIBE](https://secure.techrepublic.com/user/login/?regSource=newsletter-button&position=newsletter-button&appId=true&redirectUrl=http%3A%2F%2Fwww.techrepublic.com%2Farticle%2Fmicrofluidic-cooling-may-prevent-the-demise-of-moores-law%2F&) -------------------------------------------------------------------------------- @@ -48,7 +46,7 @@ via: http://www.techrepublic.com/article/microfluidic-cooling-may-prevent-the-de 作者:[Michael Kassner][a] 译者:[messon007](https://github.com/messon007) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 38b734edf096c6342bc9e6f9f41756ca37c1c497 Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 16 May 2017 10:12:02 +0800 Subject: [PATCH 0089/1407] translated --- ...210 How to install OTRS on Ubuntu 16.04.md | 211 +++++++++--------- 1 file changed, 107 insertions(+), 104 deletions(-) rename {sources => translated}/tech/20170210 How to install OTRS on Ubuntu 16.04.md (60%) diff --git a/sources/tech/20170210 How to install OTRS on Ubuntu 16.04.md b/translated/tech/20170210 How to install OTRS on Ubuntu 16.04.md similarity index 60% rename from sources/tech/20170210 How to install OTRS on Ubuntu 16.04.md rename to translated/tech/20170210 How to install OTRS on Ubuntu 16.04.md index ca6ddf42af..a2f0fc8bef 100644 --- a/sources/tech/20170210 How to install OTRS on Ubuntu 16.04.md +++ b/translated/tech/20170210 How to install OTRS on Ubuntu 16.04.md @@ -1,49 +1,47 @@ -translating---geekpi - -How to install OTRS (OpenSource Trouble Ticket System) on Ubuntu 16.04 +如何在 Ubuntu 16.04 上安装 OTRS (开源故障单系统) ============================================================ -### On this page +### 在本页中 -1. [Step 1 - Install Apache and PostgreSQL][1] -2. [Step 2 - Install Perl Modules][2] -3. [Step 3 - Create New User for OTRS][3] -4. [Step 4 - Create and Configure the Database][4] -5. [Step 5 - Download and Configure OTRS][5] -6. [Step 6 - Import the Sample Database][6] -7. [Step 7 - Start OTRS][7] -8. [Step 8 - Configure OTRS Cronjob][8] -9. [Step 9 - Testing OTRS][9] -10. [Step 10 - Troubleshooting][10] -11. [Reference][11] +1. [步骤 1 - 安装 Apache 和 PostgreSQL][1] +2. [步骤 2 - 安装 Perl 模块][2] +3. [步骤 3 - 为 OTRS 创建新用户][3] +4. [步骤 4 - 创建和配置数据库][4] +5. [步骤 5 - 下载和配置 OTRS][5] +6. [步骤 6 - 导入样本数据库][6] +7. [步骤 7 - 启动 OTRS][7] +8. [步骤 8 - 配置 OTRS 计划任务][8] +9. [步骤 9 - 测试 OTRS][9] +10. [步骤 10 - 疑难排查][10] +11. [参考][11] -OTRS or Open-source Ticket Request System is an open source ticketing software used for Customer Service, Help Desk, and IT Service Management. The software is written in Perl and javascript. It is a ticketing solution for companies and organizations that have to manage tickets, complaints, support request or other kinds of reports. OTRS supports several database systems including MySQL, PostgreSQL, Oracle and SQL Server it is a multiplatform software that can be installed on Windows and Linux. +OTRS 或者开源单据申请系统一个用于客户服务、帮助台和 IT 服务管理的开源单据软件。该软件是用 Perl 和 javascript 编写的。对于那些需要管理票据、投诉、支持请求或其他类型的报告的公司和组织,这是一个单据解决方案。OTRS 支持包括 MySQL、PostgreSQL、Oracle 和 SQL Server 在内的多个数据库系统,它是一个可以安装在 Windows 和 Linux 上的多平台软件。 -In this tutorial, I will show you how to install and configure OTRS on Ubuntu 16.04\. I will use PostgreSQL as the database for OTRS, and Apache web server as the web server. +在本教程中,我将介绍如何在 Ubuntu 16.04 上安装和配置 OTRS。我将使用 PostgreSQL 作为 OTRS 的数据库,将 Apache Web 服务器用作 Web 服务器。 -**Prerequisites** +**先决条件** -* Ubuntu 16.04. -* Min 2GB of Memory. -* Root privileges. +* Ubuntu 16.04。 +* 最小 2GB 的内存。 +* root 权限 -### Step 1 - Install Apache and PostgreSQL +### 步骤 1 - 安装 Apache 和 PostgreSQL -In this first step, we will install the Apache web server and PostgreSQL. We will use the latest versions from the ubuntu repository. +在第一步中,我们将安装 Apache Web 服务器以及 PostgreSQL。我们将从 ubuntu 仓库中使用最新的版本。 -Login to your Ubuntu server with SSH: +使用 SSH 登录到你的 Ubuntu 服务器中: `ssh root@192.168.33.14` -Update Ubuntu repository. +更新 Ubuntu 仓库。 `sudo apt-get update` -Install Apache2 and a PostgreSQL with the apt: +使用 apt 安装 Apache2 以及 PostgreSQL: `sudo apt-get install -y apache2 libapache2-mod-perl2 postgresql` -Then make sure that Apache and PostgreSQL are running by checking the server port. +通过检查服务器端口确保 Apache 以及 PostgreSQL 运行了。 `netstat -plntu` @@ -51,26 +49,26 @@ Then make sure that Apache and PostgreSQL are running by checking the server por ![Install Apache and PostgreSQL](https://www.howtoforge.com/images/how-to-install-otrs-opensource-trouble-ticket-system-on-ubuntu-16-04/1.png) ][17] -You will see port 80 is used by apache, and port 5432 used by postgresql database. +你可以看到 80 端口被 apache 使用了,5432 端口被 postgresql 数据库使用了。 -### Step 2 - Install Perl Modules +### 步骤 2 - 安装 Perl 模块 -OTRS is based on Perl, so we need to install some Perl modules that are required by OTRS. +OTRS 基于 Perl,因此我们需要安装一些 OTRS 需要的 Perl 模块。 -Install perl modules for OTRS with this apt command: +使用这个 apt 命令安装 perl 模块: ``` sudo apt-get install -y libapache2-mod-perl2 libdbd-pg-perl libnet-dns-perl libnet-ldap-perl libio-socket-ssl-perl libpdf-api2-perl libsoap-lite-perl libgd-text-perl libgd-graph-perl libapache-dbi-perl libarchive-zip-perl libcrypt-eksblowfish-perl libcrypt-ssleay-perl libencode-hanextra-perl libjson-xs-perl libmail-imapclient-perl libtemplate-perl libtemplate-perl libtext-csv-xs-perl libxml-libxml-perl libxml-libxslt-perl libpdf-api2-simple-perl libyaml-libyaml-perl ``` -When the installation is finished, we need to activate the Perl module for apache, then restart the apache service. +安装完成后,我们需要为 apache 激活 Perl 模块,接着重启 apache 服务。 ``` a2enmod perl systemctl restart apache2 ``` -Next, check the apache module is loaded with the command below: +接下来,使用下面的命令检查模块已经加载了: `apachectl -M | sort` @@ -78,13 +76,13 @@ Next, check the apache module is loaded with the command below: ![Enable Apache Perl Module](https://www.howtoforge.com/images/how-to-install-otrs-opensource-trouble-ticket-system-on-ubuntu-16-04/2.png) ][18] -And you will see **perl_module** under 'Loaded Modules' section. +你可以在 “Loaded Modules” 部分下看到 **perl_module**。 -### Step 3 - Create New User for OTRS +### 步骤 3 - 为 OTRS 创建新用户 -OTRS is a web based application and running under the apache web server. For best security, we need to run it under a normal user, not the root user. +OTRS 是一个基于 web 的程序并且运行与 apache web 服务器下。为了安全,我们需要以普通用户运行它,而不是 root 用户。 -Create a new user named 'otrs' with the useradd command below: +使用 useradd 命令创建一个 “otrs” 新用户: ``` useradd -r -d /opt/otrs -c 'OTRS User' otrs @@ -94,11 +92,11 @@ useradd -r -d /opt/otrs -c 'OTRS User' otrs **-c**: comment. ``` -Next, add the otrs user to 'www-data' group, because apache is running under 'www-data' user and group. +接下来,将 otrs 用户加入到 “www-data” 用户组,因为 apache 运行于 “www-data” 用户以及用户组。 `usermod -a -G www-data otrs` -Check that the otrs user is available in the '/etc/passwd' file. +在 “/etc/passwd” 文件中已经有 otrs 用户了。 ``` grep -rin otrs /etc/passwd @@ -108,74 +106,76 @@ grep -rin otrs /etc/passwd ![Create new user for OTRS](https://www.howtoforge.com/images/how-to-install-otrs-opensource-trouble-ticket-system-on-ubuntu-16-04/3.png) ][19] -New user for OTRS is created. +OTRS 的新用户已经创建了。 -### Step 4 - Create and Configure the Database +### 步骤 4 - 创建和配置数据库 -In this section, we will create a new PostgreSQL database for the OTRS system and make some small changes in PostgreSQL database configuration. +在这节中,我们会为 OTRS 系统创建一个新 PostgreSQL 数据库并对 PostgreSQL 数据库的配置做一些小的更改。 -Login to the **postgres** user and access the PostgreSQL shell. +登录到 **postgres** 用户并访问 PostgreSQL shell。 ``` su - postgres psql ``` -Create a new role named '**otrs**' with the password '**myotrspw**' and the nosuperuser option. +创建一个新的 “**otrs**” 角色,密码是 “**myotrspw**”,并且是非特权用户。 +``` create user otrs password 'myotrspw' nosuperuser; +``` -Then create a new database named '**otrs**' under the '**otrs**' user privileges: +接着使用 “**otrs**” 用户权限创建一个新的 “**otrs**” 数据库: ``` create database otrs owner otrs; \q ``` -Next, edit the PostgreSQL configuration file for otrs role authentication. +接下来为 otrs 角色验证编辑 PostgreSQL 配置文件。 ``` vim /etc/postgresql/9.5/main/pg_hba.conf ``` -Paste the cConfiguration below after line 84: +在 84 换行后粘贴下面的配置: ``` local   otrs            otrs                                    password host    otrs            otrs            127.0.0.1/32            password ``` -Save the file and exit vim. +保存文件并退出 vim [ ![Database Authentication OTRS](https://www.howtoforge.com/images/how-to-install-otrs-opensource-trouble-ticket-system-on-ubuntu-16-04/4.png) ][20] -Back to the root privileges with "exit" and restart PostgreSQL: +使用 “exit” 回到 root 权限并重启 PostgreSQL: ``` exit systemctl restart postgresql ``` -PostgreSQL is ready for the OTRS installation. +PostgreSQL 已经为 OTRS 的安装准备好了。 [ ![Configure PostgreSQL for OTRS](https://www.howtoforge.com/images/how-to-install-otrs-opensource-trouble-ticket-system-on-ubuntu-16-04/5.png) ][21] -### Step 5 - Download and Configure OTRS +### 步骤 5 - 下载和配置 OTRS -In this tutorial, we will use the latest OTRS version that is available on the OTRS web site. +在本教程中,我们会使用 OTRS 网站中最新的版本。 -Go to the '/opt' directory and download OTRS 5.0 with the wget command: +进入 “/opt” 目录并使用 wget 命令下载 OTRS 5.0: ``` cd /opt/ wget http://ftp.otrs.org/pub/otrs/otrs-5.0.16.tar.gz ``` -Extract the otrs file, rename the directory and change owner of all otrs files and directories the 'otrs' user. + otrs 文件,重命名目录并更改所有 otrs 的文件和目录的所属人为 “otrs”。 ``` tar -xzvf otrs-5.0.16.tar.gz @@ -183,60 +183,60 @@ mv otrs-5.0.16 otrs chown -R otrs:otrs otrs ``` -Next, we need to check the system and make sure it's ready for OTRS installation. +接下来,我们需要检查系统并确保可以安装 OTRS 了。 -Check system packages for OTRS installation with the otrs script command below: +使用下面的 otrs 脚本命令检查 OTRS 安装需要的系统软件包: ``` /opt/otrs/bin/otrs.CheckModules.pl ``` -Make sure all results are ok, it means is our server ready for OTRS. +确保所有的结果是对的,这意味着我们的服务器可以安装 OTRS 了。 [ ![OTRS Chek Module needed for Installation](https://www.howtoforge.com/images/how-to-install-otrs-opensource-trouble-ticket-system-on-ubuntu-16-04/6.png) ][22] -OTRS is downloaded, and our server is ready for the OTRS installation. +OTRS 已下载,并且我们的服务器可以安装 OTRS 了。 -Next, go to the otrs directory and copy the configuration file. +接下,进入 otrs 目录并复制配置文件。 ``` cd /opt/otrs/ cp Kernel/Config.pm.dist Kernel/Config.pm ``` -Edit 'Config.pm' file with vim: +使用 vim 编辑 “Config.pm” 文件: ``` vim Kernel/Config.pm ``` -Change the database password line 42: +更改 42 行的数据库密码: ``` $Self->{DatabasePw} = 'myotrspw'; ``` -Comment the MySQL database support line 45: +注释 45 行的 MySQL 数据库支持: # $Self->{DatabaseDSN} = "DBI:mysql:database=$Self->{Database};host=$Self->{DatabaseHost};"; -Uncomment PostgreSQL database support line 49: +取消注释 49 行的 PostgreSQL 数据库支持: ``` $Self->{DatabaseDSN} = "DBI:Pg:dbname=$Self->{Database};"; ``` -Save the file and exit vim. +保存文件并退出 vim。 -Then edit apache startup file to enable PostgreSQL support. +接着编辑 apache 启动文件来启用 PostgreSQL 支持。 ``` vim scripts/apache2-perl-startup.pl ``` -Uncomment line 60 and 61: +取消注释 60 和 61 行: ``` # enable this if you use postgresql @@ -244,9 +244,9 @@ use DBD::Pg (); use Kernel::System::DB::postgresql; ``` -Save the file and exit the editor. +保存文件并退出编辑器。 -Finally, check for any missing dependency and modules. +最后,检查缺失的依赖和模块。 ``` perl -cw /opt/otrs/bin/cgi-bin/index.pl @@ -254,23 +254,23 @@ perl -cw /opt/otrs/bin/cgi-bin/customer.pl perl -cw /opt/otrs/bin/otrs.Console.pl ``` -You should see that the result is '**OK**' asshown in the screenshot below: +你可以在下面的截图中看到结果是 “**OK**”: [ ![Check all modules again](https://www.howtoforge.com/images/how-to-install-otrs-opensource-trouble-ticket-system-on-ubuntu-16-04/7.png) ][23] -### Step 6 - Import the Sample Database +### 步骤 6 - 导入样本数据库 -In this tutorial, we will use the sample database, it's available in the script directory. So we just need to import all sample databases and the schemes to the existing database created in step 4. +在本教程中,我们会使用样本数据库,这可以在脚本目录中找到。因此我们只需要将所有的样本数据库以及表结构导入到第 4 步创建的数据库中。 -Login to the postgres user and go to the otrs directory. +登录到 postgres 用户并进入 otrs 目录中。 ``` su - postgres cd /opt/otrs/ ``` -Insert database and table scheme with psql command as otrs user. +作为 otrs 用户使用 psql 命令插入数据库以及表结构。 ``` psql -U otrs -W -f scripts/database/otrs-schema.postgresql.sql otrs @@ -278,46 +278,46 @@ psql -U otrs -W -f scripts/database/otrs-initial_insert.postgresql.sql otrs psql -U otrs -W -f scripts/database/otrs-schema-post.postgresql.sql otrs ``` -Type the database password '**myotrspw**' when requested. +在需要的时候输入数据库密码 “**myotrspw**”。 [ ![Import OTRS Sample Database](https://www.howtoforge.com/images/how-to-install-otrs-opensource-trouble-ticket-system-on-ubuntu-16-04/8.png) ][24] -### Step 7 - Start OTRS +### 步骤 7 - 启动 OTRS -Database and OTRS are configured, now we can start OTRS. +数据库以及 OTRS 已经配置了,现在我们可以启动 OTRS。 -Set the permission of otrs file and directory to the www-data user and group. +将 otrs 的文件及目录权限设置为 www-data 用户和用户组。 ``` /opt/otrs/bin/otrs.SetPermissions.pl --otrs-user=www-data --web-group=www-data ``` -Then enable the otrs apache configuration by creating a new symbolic link of the file to the apache virtual host directory. +通过创建一个新的链接文件到 apache 虚拟主机目录中启用 otrs apache 配置。 ``` ln -s /opt/otrs/scripts/apache2-httpd.include.conf /etc/apache2/sites-available/otrs.conf ``` -Enable otrs virtual host and restart apache. +启用 otrs 虚拟主机并重启 apache。 ``` a2ensite otrs systemctl restart apache2 ``` -Make sure apache has no error. +确保 apache 没有错误。 [ ![Enable OTRS Apache Virtual Host](https://www.howtoforge.com/images/how-to-install-otrs-opensource-trouble-ticket-system-on-ubuntu-16-04/9.png) ][25] -### Step 8 - Configure OTRS Cronjob +### 步骤 8 - 配置 OTRS 计划任务 -OTRS is installed and now running under apache web server, but we still need to configure the OTRS Cronjob. +OTRS 已经安装并运行在 Apache Web 服务器中了,但是我们仍然需要配置 OTRS 计划任务。 -Login to the 'otrs' user, then go to the 'var/cron' directory as the otrs user. +登录到 “otrs” 用户,接着以 otrs 用户进入 “var/cron” 目录。 ``` su - otrs @@ -325,11 +325,13 @@ cd var/cron/ pwd ``` -Copy all cronjob .dist scripts with the command below: +使用下面的命令复制所有 .dist 计划任务脚本: +``` for foo in *.dist; do cp $foo `basename $foo .dist`; done +``` -Back to the root privilege with exit and then start the cron script as otrs user. +使用 exit 回到 root 权限,并使用 otrs 用户启动计划任务脚本。 ``` exit @@ -340,22 +342,22 @@ exit ![Enable OTRS Cron](https://www.howtoforge.com/images/how-to-install-otrs-opensource-trouble-ticket-system-on-ubuntu-16-04/10.png) ][26] -Next, manually create a new cronjob for PostMaster which fetches the emails. I'll configure it tp fetch emails every 2 minutes. +接下来,手动收取电子邮件的 PostMaster 创建一个新的计划任务。我会配置为每 2 分钟收取一次邮件。 ``` su - otrs crontab -e ``` -Paste the configuration below: +粘贴下面的配置: ``` */2 * * * *    $HOME/bin/otrs.PostMasterMailbox.pl >> /dev/null ``` -Save and exit. +保存并退出。 -Now stop otrs daemon and start it again. +现在停止 otrs 守护进程并再次启动。 ``` bin/otrs.Daemon.pl stop @@ -366,66 +368,67 @@ bin/otrs.Daemon.pl start ![Enable OTRS Fetching Email](https://www.howtoforge.com/images/how-to-install-otrs-opensource-trouble-ticket-system-on-ubuntu-16-04/11.png) ][27] -The OTRS installation and configuration is finished. +OTRS 安装以及配置完成了。 -### Step 9 - Testing OTRS +### 步骤 9 - 测试 OTRS -Open your web browser and type in your server IP address: +打开你的 web 浏览器并输入你的服务器 IP 地址: [http://192.168.33.14/otrs/][28] -Login with default user '**root@localhost**' and password '**root**'. +使用默认的用户 “**root@localhost**'” 以及密码 “**root**” 登录。 [ ![Installation Successfully OTRS Home Page](https://www.howtoforge.com/images/how-to-install-otrs-opensource-trouble-ticket-system-on-ubuntu-16-04/12.png) ][29] -You will see a warning about using default root account. Click on that warning message to create new admin root user. +使用默认的 root 账户你会看到一个警告。点击警告信息来创建一个新的 admin root 用户。 -Below the admin page after login with different admin root user, and there is no error message again. +下面是用另外的 admin root 用户登录后出现的 admin 页面,这里没有出现错误信息。 [ ![OTRS Admin Dashboard Without Error Messages](https://www.howtoforge.com/images/how-to-install-otrs-opensource-trouble-ticket-system-on-ubuntu-16-04/13.png) ][30] -If you want to log in as Customer, you can use 'customer.pl'. +如果你想作为客户登录,你可以使用 “customer.pl”。 [http://192.168.33.14/otrs/customer.pl][31] -You will see the customer login page. Type in a customer username and password. +你会看到客户登录界面,输入客户的用户名和密码。 [ ![OTRS Customer Login Page](https://www.howtoforge.com/images/how-to-install-otrs-opensource-trouble-ticket-system-on-ubuntu-16-04/14.png) ][32] -Below is the customer page for creating a new ticket. +下面是一个创建新单据的客户页面。 [ ![Customer Open Ticket](https://www.howtoforge.com/images/how-to-install-otrs-opensource-trouble-ticket-system-on-ubuntu-16-04/15.png) ][33] -### Step 10 - Troubleshooting +### 步骤 10 - 疑难排查 + +如果你仍旧看到 “OTRS Daemon is not running” 的错误,你可以像这样调试 OTRS 守护进程。 -If you still have an error like 'OTRS Daemon is not running', you can enable debugging in the OTRS daemon like this. ``` su - otrs cd /opt/otrs/ ``` -Stop OTRS daemon: +停止 OTRS 守护进程: ``` bin/otrs.Daemon.pl stop ``` -And start OTRS daemon with --debug option. +使用 --debug 选项启动 OTRS 守护进程。 ``` bin/otrs.Daemon.pl start --debug ``` -### Reference +### 参考 * [http://wiki.otterhub.org/index.php?title=Installation_on_Debian_6_with_Postgres][12][][13] * [http://www.geoffstratton.com/otrs-installation-5011-ubuntu-1604][14][][15] @@ -436,7 +439,7 @@ bin/otrs.Daemon.pl start --debug via: https://www.howtoforge.com/tutorial/how-to-install-otrs-opensource-trouble-ticket-system-on-ubuntu-16-04/ 作者:[Muhammad Arul][a] -译者:[译者ID](https://github.com/译者ID) +译者:[geekpi](https://github.com/geekpi) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From a0f22f104cfba5bdece40be270dac82aa1d2d069 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 16 May 2017 10:39:27 +0800 Subject: [PATCH 0090/1407] PUB:20170112 The 6 unwritten rules of open source development.md @Taylor1024 https://linux.cn/article-8514-1.html --- ...ritten rules of open source development.md | 22 +++++++++---------- 1 file changed, 11 insertions(+), 11 deletions(-) rename {translated/tech => published}/20170112 The 6 unwritten rules of open source development.md (64%) diff --git a/translated/tech/20170112 The 6 unwritten rules of open source development.md b/published/20170112 The 6 unwritten rules of open source development.md similarity index 64% rename from translated/tech/20170112 The 6 unwritten rules of open source development.md rename to published/20170112 The 6 unwritten rules of open source development.md index 47332fd4af..23773430ba 100644 --- a/translated/tech/20170112 The 6 unwritten rules of open source development.md +++ b/published/20170112 The 6 unwritten rules of open source development.md @@ -5,41 +5,41 @@ ![The 6 unwritten rules of open source development](http://images.techhive.com/images/article/2016/12/09_opensource-100698477-large.jpg) -正如体育界不成文的规定一样,这些规则基本上不会出现在官方文档和正式记录上。比如说,在棒球运动中,从比分远超时不要盗垒,到跑垒员跑了第一时也不要放弃四坏球保送。对于圈外人来讲,这些东西很难懂,甚至觉得没什么意义。但是对于那些想成为 MVP 的队员来说,这些都是理所当然的。 +正如体育界不成文的规定一样,这些规则基本上不会出现在官方文档和正式记录上。比如说,在棒球运动中,从比分领先时不要盗垒,到跑垒员跑了第一时也不要放弃四坏球保送。对于圈外人来讲,这些东西很难懂,甚至觉得没什么意义。但是对于那些想成为 MVP 的队员来说,这些都是理所当然的。 -软件开发,特别是开源软件开发中,也有一套不成文的规定。和其它的团队运动一样,这些规定很大程度上决定了开源社区如何看待一名开发者,特别是小白。 +软件开发,特别是开源软件开发中,也有一套不成文的规定。和其它的团队运动一样,这些规定很大程度上决定了开源社区如何看待一名开发者,特别是新加入社区的开发者。 ### 运行之前先调试 -在参与社区之前,比如开放源代码或者其它什么的,你需要做一些基本工作。对于有眼界的开源贡献者,这意味这你需要理解社区的目标,并学习应该从哪里起步。人人都想贡献源代码,但是只有少量的人做过准备,并且乐意、以及有能力完成这项艰苦卓绝的工作:测试补丁、复审代码、撰写文档、修正错误。所有的这些不受待见的任务在一个健康的社区中都是必要的。 +在参与社区之前,比如开放源代码或者其它什么的,你需要做一些基本工作。对于有眼界的开源贡献者,这意味这你需要理解社区的目标,并学习应该从哪里起步。人人都想贡献源代码,但是只有少量的人做过准备,并且乐意、同时也有能力完成这项艰苦卓绝的工作:测试补丁、复审代码、撰写文档、修正错误。所有的这些不受待见的任务在一个健康的社区中都是必要的。 -为什么要在优雅地码代码前做这些呢?这是一种信任,更重要的是,不要只关注自己开发的功能,而是要关注整个社区的动向。 +为什么要在优雅地写代码前做这些呢?这是一种信任,更重要的是,不要只关注自己开发的功能,而是要关注整个社区的动向。 ### 填坑而不是挖坑 -当你在某个社区中建立起自己的声望,那么很有必要去全面了解该项目和代码。不要停留于任务状态上,而是要去钻研项目本身,理解那些超出你擅长范围之外的知识。不要只把自己的理解局限于开发者,这样会让你着眼于让你的代码有更大的影响,而不只是你那一亩三分地。 +当你在某个社区中建立起自己的声望,那么很有必要全面了解该项目和代码。不要停留于任务状态上,而是要去钻研项目本身,理解那些超出你擅长范围之外的知识。不要只把自己的理解局限于开发者,这样会让你着眼于让你的代码有更大的影响,而不只是你那一亩三分地。 -打个比方,你已经完成了一个网络模块的测试版本。你测试了一下,觉得不错。然后你把它开放到社区,想要更多的人测试。结果发现,当它以特定的方式部署时,它有可能破坏安全设置,还可能导致主要的存储泄露。如果你将代码视为一个整体时候问题就可以迎刃而解,而不是孤立地看待问题。这表明,你要对项目各个部分如何与其他人协作交互有比较深入的理解。让你的补丁填坑而不是挖坑。这样你朝成为社区大牛的目标上又前进了一大步。 +打个比方,你已经完成了一个网络模块的测试版本。你测试了一下,觉得不错。然后你把它开放到社区,想要更多的人测试。结果发现,当它以特定的方式部署时,有可能会破坏安全设置,还可能导致主存储泄露。如果你将代码视为一个整体时问题就可以迎刃而解,而不是孤立地看待问题。这表明,你要对项目各个部分如何与其他人协作交互有比较深入的理解。让你的补丁填坑而不是挖坑。这样你朝成为社区精英的目标上又前进了一大步。 ### 不投放代码炸弹 -代码提交完毕后你的工作还没结束。如果代码被接受,还会有一些关于这些更改的讨论,和常见的问答,还要做测试。你要确保你可以准时提交,努力去理解如何在不影响社区其他成员的情况下,改进代码和补丁。 +代码提交完毕后你的工作还没结束。如果代码被接受,还会有一些关于这些更改的讨论和常见的问答,还要做测试。你要确保你可以准时提交,努力去理解如何在不影响社区其他成员的情况下,改进代码和补丁。 ### 助己之前先助人 -开源社区不是自相残杀的世界,我们更看重项目的价值而非个体的贡献和成功。如果你想给自己加分,让自己成为更重要的社区成员和让社区接纳你的代码,那就努力帮助别人。如果你熟悉网络部分,那就去复审网络部分,用你的专业技能让整个代码更加优雅。很简单的道理,顶级的审查者经常和顶级的贡献者打交道。你帮助的人越多,你就越有价值。 +开源社区不是自相残杀的丛林世界,我们更看重项目的价值而非个体的贡献和成功。如果你想给自己加分,让自己成为更重要的社区成员、让社区接纳你的代码,那就努力帮助别人。如果你熟悉网络部分,那就去复审网络部分,用你的专业技能让整个代码更加优雅。道理很简单,顶级的审查者经常和顶级的贡献者打交道。你帮助的人越多,你就越有价值。 ### 打磨抛光才算完 -作为一个开发者,你很可能希望为开源项目解决一个特定的痛点。或许你想要运行在一个目前还不支持的系统上,抑或你超想改革社区目前使用的安全技术。想要引进新技术,特别是比较有争议的技术,最好的办法就是让人无法拒绝它。你需要透彻地了解底层代码,考虑每个极端情况。在不影响已实现功能的前提下增加新功能。不仅仅是完成就行,还要在特性的完善上下功夫。 +作为一个开发者,你很可能希望为开源项目解决一个特定的痛点。或许你想要运行在一个目前还不支持的系统上,抑或你很希望改革社区目前使用的安全技术。想要引进新技术,特别是比较有争议的技术,最好的办法就是让人无法拒绝它。你需要透彻地了解底层代码,考虑每个极端情况。在不影响已实现功能的前提下增加新功能。不仅仅是完成就行,还要在特性的完善上下功夫。 ### 不离不弃方始终 -开源社区也有许多玩玩就算的人,但是承诺了就不要轻易失信。不要只是因为提交被拒就离开社区。找出原因,修正错误,然后再试一试。当你开发时候,要和整个代码保持一致,确保即使项目发生变化而你的补丁仍然可用。不要把你的代码留给别人修复,要自己修复。这样可以在社区形成良好的风气,每个人都自己改。 +开源社区也有许多玩玩就算的人,但是承诺了就不要轻易失信。不要就因为提交被拒就离开社区。找出原因,修正错误,然后再试一试。当你开发时候,要和整个代码库保持一致,确保即使项目发生变化而你的补丁仍然可用。不要把你的代码留给别人修复,要自己修复。这样可以在社区形成良好的风气,每个人都自己改。 --- -这些"潜规则"看上去很简单,但是还是有许多开源项目的贡献者并没有遵守。这样做的开发者不仅可以为成功地推动他们自己的项目,而且也有助于开源社区。 +这些“潜规则”看上去很简单,但是还是有许多开源项目的贡献者并没有遵守。这样做的开发者不仅可以为成功地推动他们自己的项目,而且也有助于开源社区。 作者简介: From 73ac2ee3ee7e35e730d3771ad04d3850b65e3d0e Mon Sep 17 00:00:00 2001 From: Louis Wei Date: Tue, 16 May 2017 21:41:25 +0800 Subject: [PATCH 0091/1407] Update 20110127 How debuggers work Part 2 - Breakpoints.md --- ...110127 How debuggers work Part 2 - Breakpoints.md | 12 ++++++------ 1 file changed, 6 insertions(+), 6 deletions(-) diff --git a/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md b/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md index cc6fcf44ae..04f4a303b4 100644 --- a/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md +++ b/translated/tech/20110127 How debuggers work Part 2 - Breakpoints.md @@ -11,17 +11,17 @@ 为了在 x86 架构机器上实现断点,软件中断(也被称作 陷阱)被派上用场。在我们深入细节之前,我想先大致解释一下中断和陷阱的概念。 -一个 CPU 有一条单独的执行流,一条指令接一条的执行 [[1]][19]。为了能够处理异步的事件,如 IO 和 硬件定时器,CPU 使用了中断。一个硬件中断通常是一个特定的电子信号,并附加了一个特别的”响应电路”。该电路通知中断激活,并让 CPU 停止当前执行,保存状态,然后跳转到一个预定义的地址,也就是处理中断程序的位置。当处理程序完成其工作后,CPU 又从之前停止的地方重新恢复运行。 +一个 CPU 有一条单独的执行流,一条指令接一条的执行 [[1]][19]。为了能够处理异步的事件,如 IO 和 硬件定时器,CPU 使用了中断。一个硬件中断通常是一个特定的电子信号,并附加了一个特别的”响应电路”。该电路通知中断激活,并让 CPU 停止当前执行,保存状态,然后跳转到一个预定义的地址,也就是中断处理程序的位置。当处理程序完成其工作后,CPU 又从之前停止的地方重新恢复运行。 -软件中断在规则上与硬件相似,但实际操作中有些不同。CPU 支持一些特殊的指令,来允许软件模拟出一个中断。当这样的一个指令被执行时,CPU 像对待一个硬件中断那样 ———— 停止正常的执行流,保存状态,然后跳转到一个处理程序。这种 ”陷阱” 使得许多现代操作系统的惊叹设计得以高效地实现(如任务调度,虚拟内存,内存保护,调试) +软件中断在规则上与硬件相似,但实际操作中有些不同。CPU 支持一些特殊的指令,来允许软件模拟出一个中断。当这样的一个指令被执行时,CPU 像对待一个硬件中断那样 —— 停止正常的执行流,保存状态,然后跳转到一个处理程序。这种“中断”使得许多现代操作系统的惊叹设计得以高效地实现(如任务调度,虚拟内存,内存保护,调试) -许多编程错误(如被 0 除)也被 CPU 当做陷阱对待,常常也叫做”异常”, 这时候硬件和软件中断之间的界限就模糊了,很难说这种异常到底是硬件中断还是软件中断。但我已经偏离今天主题太远了,所以现在让我们回到断点上来。 +许多编程错误(如被 0 除)也被 CPU 当做中断对待,常常也叫做”异常”, 这时候硬件和软件中断之间的界限就模糊了,很难说这种异常到底是硬件中断还是软件中断。但我已经偏离今天主题太远了,所以现在让我们回到断点上来。 ### int 3 理论 -前面说了很多,现在简单来说断点就是一个部署在 CPU 上的特殊陷阱,叫 int 3。int 是一个 “陷阱指令”的 x86 术语,该指令是对一个预定义中断处理的调用。x86 支持 8 位的 int 指令操作数,决定了中断的数量,所以理论上可以支持 256 个中断。前 32 个中断为 CPU 自己保留,而 int 3 就是本文关注的 —— 它被叫做 ”trap to debugger“。 +前面说了很多,现在简单来说断点就是一个部署在 CPU 上的特殊中断,叫 int 3。int 是一个 “中断指令”的 x86 术语,该指令是对一个预定义中断处理的调用。x86 支持 8 位的 int 指令操作数,决定了中断的数量,所以理论上可以支持 256 个中断。前 32 个中断为 CPU 自己保留,而 int 3 就是本文关注的 —— 它被叫做 “调试器专用中断”。 -避免更深的解释,我将引用“圣经”一段话[[2]][20]。 +避免更深的解释,我将引用“圣经”里一段话[[2]][20]。 > The INT 3 instruction generates a special one byte opcode (CC) that is intended for calling the debug exception handler. (This one byte form is valuable because it can be used to replace the first byte of any instruction with a breakpoint, including other one byte instructions, without over-writing other code). @@ -29,7 +29,7 @@ ### int 3 实践 -没错,知道事物背后的理论非常不错,不过,这些理论到底意思是啥?我们怎样使用 int 3 部署断点?或者怎么翻译成通用的编程术语 ———— _请给我看代码!_ +没错,知道事物背后的理论非常不错,不过,这些理论到底意思是啥?我们怎样使用 int 3 部署断点?或者怎么翻译成通用的编程术语 —— _请给我看代码!_ 实际上,实现非常简单。一旦你的程序执行了 int 3 指令,操作系统就会停止程序 [[3]][21]。在 Linux(这也是本文比较关心的地方) 上,操作系统会发送给进程一个信号 ——  SIGTRAP。 From 158ebe9a3a5ab63579f743532c3cecb0d517c72d Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 17 May 2017 09:10:01 +0800 Subject: [PATCH 0092/1407] translating --- ...01 How to capture and stream your gaming session on Linux.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170201 How to capture and stream your gaming session on Linux.md b/sources/tech/20170201 How to capture and stream your gaming session on Linux.md index 8d1e9ce350..4783b90bec 100644 --- a/sources/tech/20170201 How to capture and stream your gaming session on Linux.md +++ b/sources/tech/20170201 How to capture and stream your gaming session on Linux.md @@ -1,3 +1,5 @@ +translating---geekpi + How to capture and stream your gaming session on Linux ============================================================ From 1b5104a52f1decf8ff406d1e00132ce935174d3d Mon Sep 17 00:00:00 2001 From: jasminepeng Date: Wed, 17 May 2017 11:01:36 +0800 Subject: [PATCH 0093/1407] =?UTF-8?q?=E6=A0=A1=E5=AF=B9=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 校对中 --- ...rence Between Two Directories Using Diff and Meld Tools.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/translated/tech/20170502 How to Find Difference Between Two Directories Using Diff and Meld Tools.md b/translated/tech/20170502 How to Find Difference Between Two Directories Using Diff and Meld Tools.md index 8016da3379..5af0046856 100644 --- a/translated/tech/20170502 How to Find Difference Between Two Directories Using Diff and Meld Tools.md +++ b/translated/tech/20170502 How to Find Difference Between Two Directories Using Diff and Meld Tools.md @@ -77,8 +77,8 @@ Aaron Kili 是一个Linux和F.O.S.S爱好者,即将变成的Linux 系统管理 via: http://www.tecmint.com/compare-find-difference-between-two-directories-in-linux/ 作者:[Aaron Kili ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) +译者:[hkurj](https://github.com/hkurj) +校对:[jasminepeng](https://github.com/jasminepeng) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From d3cda39978e69114c546f415d74395ea452fec99 Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 17 May 2017 11:03:47 +0800 Subject: [PATCH 0094/1407] translated --- ...and stream your gaming session on Linux.md | 110 ------------------ ...and stream your gaming session on Linux.md | 108 +++++++++++++++++ 2 files changed, 108 insertions(+), 110 deletions(-) delete mode 100644 sources/tech/20170201 How to capture and stream your gaming session on Linux.md create mode 100644 translated/tech/20170201 How to capture and stream your gaming session on Linux.md diff --git a/sources/tech/20170201 How to capture and stream your gaming session on Linux.md b/sources/tech/20170201 How to capture and stream your gaming session on Linux.md deleted file mode 100644 index 4783b90bec..0000000000 --- a/sources/tech/20170201 How to capture and stream your gaming session on Linux.md +++ /dev/null @@ -1,110 +0,0 @@ -translating---geekpi - -How to capture and stream your gaming session on Linux -============================================================ - -### On this page - -1. [Capture settings][1] -2. [Setting up the sources][2] -3. [Transitioning][3] -4. [Conclusion][4] - -There may not be many hardcore gamers who use Linux, but there certainly are quite a lot Linux users who like to play a game now and then. If you are one of them and would like to show the world that Linux gaming isn’t a joke anymore, then you will find the following quick tutorial on how to capture and/or stream your gaming session interesting. The software tool that I will be using for this purpose is called “[Open Broadcaster Software Studio][5]” and it is maybe the best of the kind that we have at our disposal. - -### Capture settings - -Through the top panel menu, we choose File → Settings and then we select the “Output” to set our preferences for the file that is to be produced. Here we can set the audio and video bitrate that we want, the destination path for the newly created file, and the file format. A rough setting for the quality is also available on this screen. - -[ - ![Select output set in OBS Studio](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_1.png) -][6] - -If we change the output mode on the top from “Simple” to “Advanced” we will be able to set the CPU usage load that we allow OBS to induce to our system. Depending on the selected quality, the CPU capabilities, and the game that we are capturing, there’s a CPU load setting that won’t cause the frames to drop. You may have to do some trial to find that optimal setting, but if the quality is set to low you shouldn’t worry about it. - -[ - ![Change OBS output mode](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_2.png) -][7] - -Next, we go to the “Video” section of the settings where we can set the output video resolution that we want. Pay attention to the down-scaling filtering method as it makes all the difference in regards to the quality of the end result. - -[ - ![Down scaling filter](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_3.png) -][8] - -You may also want to bind hotkeys for the starting, pausing, and stopping of a recording. This is especially useful since you will be seeing your game’s screen while recording. To do this, choose the “Hotkeys” section in the settings and assign the keys that you want in the corresponding boxes. Of course, you don’t have to fill out every box, only the ones you need. - -[ - ![Configure Hotkeys in OBS](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_4.png) -][9] - -If you are interested in streaming and not just recording, then select the “Stream” category of settings and then you may select the streaming service among the 30 that are supported including Twitch, Facebook Live and Youtube, and then select a server and enter a stream key. - -[ - ![Streaming settings](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_5.png) -][10] - -### Setting up the sources - -On the lower left, you will find a box entitled as “Sources”. There we press the plus sign button to add a new source that is essentially our recording media source. Here you can set audio and video sources, but images and even text as well. - -[ - ![OBS Media Source](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_6.png) -][11] - -The first three concern audio sources, the next two images, the JACK option is for live audio capturing from an instrument, the Media Source is for the addition of a file, etc. What we are interested in for our purpose are the “Screen Capture (XSHM)”, the “Video Capture Device (V4L2)”, and the “Window Capture (Xcomposite) options. - -The screen capture option let’s you select the screen that you want to capture (including the active one), so everything is recorded. Workspace changes, window minimizations, etc. It is a suitable option for a standard bulk recording that will get edited before getting released. - -Let’s explore the other two. The Window Capture will let us select one of our active windows and put it into the capturing monitor. The Video Capture Device is useful in order to put our face right there on a corner so people can see us while we’re talking. Of course, each added source offers a set of options that we can fiddle with in order to achieve the result that we are after. - -[ - ![OBS Window Capture](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_7.png) -][12] - -The added sources are re-sizable and also movable along the plane of the recording frame, so you may add multiple sources, arrange them as you like, and finally perform basic editing tasks by right-clicking on them. - -[ - ![Add Multiple sources](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_8.png) -][13] - -### Transitioning - -Finally, let’s suppose that you are streaming your gaming session and you want to be able to rotate between the game view and yourself (or any other source). To do this, change to “Studio Mode” from the lower right and add a second scene with assigned another source assigned to it. You may also rotate between sources by unchecking the “Duplicate scene” and checking the “Duplicate sources” on the gear icon next to the “Transitions”. This is helpful for when you want to show your face only for short commentary, etc. - -[ - ![Studio mode](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_9.png) -][14] - -There are many transition effects available in this software and you may add more by pressing the plus sign icon next to “Quick Transitions” in the center. As you add them, you will also be prompt to set them. - -### Conclusion - -The OBS Studio software is a powerful piece of free software that works stably, is fairly simple and straightforward to use, and has a growing set of [additional plugins][15] that extend its functionality. If you need to record and/or stream your gaming session on Linux, I can’t think of a better solution other than using OBS. What is your experience with this or other similar tools? Share in the comments and feel free to also include a video link that showcases your skills. :) - --------------------------------------------------------------------------------- - -via: https://www.howtoforge.com/tutorial/how-to-capture-and-stream-your-gaming-session-on-linux/ - -作者:[Bill Toulas ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.howtoforge.com/tutorial/how-to-capture-and-stream-your-gaming-session-on-linux/ -[1]:https://www.howtoforge.com/tutorial/how-to-capture-and-stream-your-gaming-session-on-linux/#capture-settings -[2]:https://www.howtoforge.com/tutorial/how-to-capture-and-stream-your-gaming-session-on-linux/#setting-up-the-sources -[3]:https://www.howtoforge.com/tutorial/how-to-capture-and-stream-your-gaming-session-on-linux/#transitioning -[4]:https://www.howtoforge.com/tutorial/how-to-capture-and-stream-your-gaming-session-on-linux/#conclusion -[5]:https://obsproject.com/download -[6]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_1.png -[7]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_2.png -[8]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_3.png -[9]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_4.png -[10]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_5.png -[11]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_6.png -[12]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_7.png -[13]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_8.png -[14]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_9.png -[15]:https://obsproject.com/forum/resources/categories/obs-studio-plugins.6/ diff --git a/translated/tech/20170201 How to capture and stream your gaming session on Linux.md b/translated/tech/20170201 How to capture and stream your gaming session on Linux.md new file mode 100644 index 0000000000..0021e80714 --- /dev/null +++ b/translated/tech/20170201 How to capture and stream your gaming session on Linux.md @@ -0,0 +1,108 @@ +如何在 Linux 中捕获并流式传输你的游戏会话 +============================================================ + +### 在本页中 + +1. [捕获设置][1] +2. [设置源][2] +3. [过渡][3] +4. [总结][4] + +也许没有许多铁杆玩家使用 Linux,但现在肯定有很多 Linux 用户喜欢玩游戏。如果你是其中之一,并希望向世界展示 Linux 游戏不再是一个笑话,那么你会发现下面这个关于如何捕捉并且/或者流式播放游戏的快速教程。我在这将用一个名为 “[Open Broadcaster Software Studio][5]” 的软件,这可能是我们找到最好的一种。 + +### 捕获设置 + +在顶层菜单中,我们选择 File → Settings,然后我们选择 “Output” 来设置要生成的文件的选项。这里我们可以设置想要的音频和视频的比特率、新创建的文件的目标路径和文件格式。这上面还提供了粗略的质量设置。 + +[ + ![Select output set in OBS Studio](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_1.png) +][6] + +如果我们将顶部的输出模式从 “Simple” 更改为 “Advanced”,我们就能够设置 CPU 负载,使 OBS 能够控制系统。根据所选的质量,CPU 能力和捕获的游戏,存在一个 CPU 负载设置不会导致帧丢失。你可能需要做一些试验才能找到最佳设置,但如果质量设置为低,则不用担心。 + +[ + ![Change OBS output mode](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_2.png) +][7] + +接下来,我们转到设置的 “Video” 部分,我们可以设置我们想要的输出视频分辨率。注意缩小过滤方法,因为它使最终的质量有所不同。 + +[ + ![Down scaling filter](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_3.png) +][8] + +你可能还需要绑定热键以启动、暂停和停止录制。这是特别有用的,因为你可以在录制时看到游戏的屏幕。为此,请在设置中选择 “Hotkeys” 部分,并在相应的框中分配所需的按键。当然,你不必每个框都填写,你只需要填写所需的。 + +[ + ![Configure Hotkeys in OBS](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_4.png) +][9] + +如果你对流式传输感兴趣,而不仅仅是录制,请选择 “Stream” 分类的设置,然后你可以选择支持的 30 种流媒体服务,包括Twitch、Facebook Live 和 Youtube,然后选择服务器并输入 流密钥。 + +[ + ![Streaming settings](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_5.png) +][10] + +### 设置源 + +在左下方,你会发现一个名为 “Sources” 的框。我们按下加号好添加一个新的源,它本质上就是我们录制的媒体源。在这你可以设置音频和视频源,但是图像甚至文本也是可以的。 + +[ + ![OBS Media Source](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_6.png) +][11] + +前三个是关于音频源,接下来的两个是图像,JACK 选项用于从乐器捕获的实时音频,媒体源用于添加文件等。这里我们感兴趣的是 “Screen Capture (XSHM)”、“Video Capture Device (V4L2)” 和 “Window Capture (Xcomposite)” 选项。 + +屏幕捕获选项让你选择要捕获的屏幕(包括活动屏幕),以便记录所有内容。如工作区更改、窗口最小化等。对于标准批量录制来说,这是一个适合的选项,它可在发布之前进行编辑。 + +我们来探讨另外两个。Window Capture 将让我们选择一个活动窗口并将其放入捕获监视器。为了将我们的脸放在一个角落,视频捕获设备是有用的,这样人们可以在我们说话时看到我们。当然,每个添加的源都提供了一组选项来供我们实现我们最后要的效果。 + +[ + ![OBS Window Capture](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_7.png) +][12] + +添加的来源是可以调整大小的,也可以沿着录制帧的平面移动,因此你可以添加多个来源,并根据需要进行排列,最后通过右键单击执行基本的编辑任务。 + +[ + ![Add Multiple sources](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_8.png) +][13] + +### 过渡 + +最后,我们假设你正在流式传输游戏会话,并希望能够在游戏视图和自己(或任何其他来源)之间切换。为此,请从右下角切换为“Studio Mode”,并添加一个分配给另一个源的场景。你还可以通过取消选中 “Duplicate scene” 并检查 “Transitions” 旁边的齿轮图标上的 “Duplicate sources” 来切换。 当你想在简短评论中显示你的脸部时,这很有帮助。 + +[ + ![Studio mode](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_9.png) +][14] + +这个软件有许多过渡效果,你可以按中心的 “Quick Transitions” 旁边的加号图标添加更多。当你添加它们时,还将会提示你进行设置。 + +### 总结 + +OBS Studio 是一个功能强大的免费软件,它工作稳定,使用起来相当简单直接,并且拥有越来越多的扩展其功能的[附加插件][15]。如果你需要在 Linux 上记录并且/或者流式传输游戏会话,除了使用 OBS 之外,我无法想到其他更好的解决方案。你有其他类似工具的经验么? 请在评论中分享也欢迎包含一个展示你技能的视频链接。:) + +-------------------------------------------------------------------------------- + +via: https://www.howtoforge.com/tutorial/how-to-capture-and-stream-your-gaming-session-on-linux/ + +作者:[Bill Toulas ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.howtoforge.com/tutorial/how-to-capture-and-stream-your-gaming-session-on-linux/ +[1]:https://www.howtoforge.com/tutorial/how-to-capture-and-stream-your-gaming-session-on-linux/#capture-settings +[2]:https://www.howtoforge.com/tutorial/how-to-capture-and-stream-your-gaming-session-on-linux/#setting-up-the-sources +[3]:https://www.howtoforge.com/tutorial/how-to-capture-and-stream-your-gaming-session-on-linux/#transitioning +[4]:https://www.howtoforge.com/tutorial/how-to-capture-and-stream-your-gaming-session-on-linux/#conclusion +[5]:https://obsproject.com/download +[6]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_1.png +[7]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_2.png +[8]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_3.png +[9]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_4.png +[10]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_5.png +[11]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_6.png +[12]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_7.png +[13]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_8.png +[14]:https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/big/pic_9.png +[15]:https://obsproject.com/forum/resources/categories/obs-studio-plugins.6/ From e954ca713dd9699ccc944cc594279b462964597e Mon Sep 17 00:00:00 2001 From: jasminepeng Date: Wed, 17 May 2017 11:33:07 +0800 Subject: [PATCH 0095/1407] =?UTF-8?q?=E6=A0=A1=E5=AF=B9=E5=AE=8C=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 校对完毕,谢谢。 --- ...o Directories Using Diff and Meld Tools.md | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/translated/tech/20170502 How to Find Difference Between Two Directories Using Diff and Meld Tools.md b/translated/tech/20170502 How to Find Difference Between Two Directories Using Diff and Meld Tools.md index 5af0046856..878b00998a 100644 --- a/translated/tech/20170502 How to Find Difference Between Two Directories Using Diff and Meld Tools.md +++ b/translated/tech/20170502 How to Find Difference Between Two Directories Using Diff and Meld Tools.md @@ -1,20 +1,20 @@ -怎么使用Diff和Meld工具得到2个目录之间的不同之处呢 +怎么使用 Diff 和 Meld 工具发现两个目录间的不同之处 ============================================================ -在一个之前的一篇文章,我们回顾了[ Linux 下的 9 个最好的文件比较工具][1]在这片文章,我们将会描述在 Linux 下这么找到2个目录之间的不同。 +在之前的一篇文章里,我们回顾了[ Linux 下 9 个最好的文件比较工具][1],本篇文章中,我们将会描述在 Linux 下怎样找到两个目录之间的不同。 -一般,在Linux下比较2个文件,我们会使用diff (一个简单的原版的Unix命令行工具 )来显示2个计算机文件的不同;一行一行的去比较文件,而且很方便使用,几乎在全部的 Linux 发行版都预装了。 +一般情况下,要在 Linux 下比较两个文件,我们会使用 **diff** (一个简单的源自 Unix 的命令行工具 )来显示两个计算机文件的不同;它一行一行的去比较文件,而且很方便使用,在几乎全部的 Linux 发行版都预装了。 -问题是在 Linux 下我们怎么才能比较2个目录的不同? 现在,我们想知道2个目录中那些文件/子目录是通用的,那些只存在一个目录。 +问题是在 Linux 下我们怎么才能比较两个目录?现在,我们想知道两个目录中哪些文件/子目录是共有的,哪些只存在一个于目录。 -运行diff常规的语法如下: +运行 diff 常规的语法如下: ``` $ diff [OPTION]… FILES $ diff options dir1 dir2 ``` -默认情况下,输出是按文件/子文件夹的文件名的字母排序的,如下面截图所示,在这命令“-q”开关是告诉diif只有在文件有差异时报告。 +默认情况下,输出是按文件/子文件夹的文件名的字母排序的,如下面截图所示,在命令中, `-q` 开关是告诉 diif 只有在文件有差异时报告。 ``` $ diff -q directory-1/ directory-2/ @@ -23,17 +23,17 @@ $ diff -q directory-1/ directory-2/ ![Difference Between Two Directories](http://www.tecmint.com/wp-content/uploads/2017/05/Difference-Between-Two-Directories.png) ][3] -2个文件之间的差异 +*两个文件夹之间的差异* -再次运行diff并不能进入子文件夹,但是我们可以使用'-r'开关和下面一样来读子文件夹。 +再次运行 diff 并不能进入子文件夹,但是我们可以使用 `-r` 开关来读子文件夹,如下所示。 ``` $ diff -qr directory-1/ directory-2/ ``` -###使用Meld可视化的比较和合并工具 +### 使用 Meld 可视化比较和合并工具 -meld是一个很酷的图形化工具(一个GNOME桌面下的可视化的比较和合并工具)给那些喜欢使用鼠标的人,你们能根据下面来安装。 +meld 是一个很酷的图形化工具(一个 GNOME 桌面下的可视化的比较和合并工具),可供那些喜欢使用鼠标的人使用,可按如下来安装。 ``` $ sudo apt install meld [Debian/Ubuntu systems] @@ -41,36 +41,36 @@ $ sudo yum install meld [RHEL/CentOS systems] $ sudo dnf install meld [Fedora 22+] ``` -一旦你安装了它之后,搜索“meld”在 Ubuntu Dash 或者 Linux Mint 菜单,也可以是Fedora或者CentOS桌面的Activities Overview,然后启动它。 +一旦你安装了它之后,在 **Ubuntu Dash** 或者 **Linux Mint** 菜单搜索 “**meld**” ,或者 Fedora 或 CentOS 桌面的 Activities Overview,然后启动它。 -你可以看到在下面看到Meld接口,你能和版本控制视图一样选择文件或者文件夹来比较。点击目录比较并移动到下个界面 +你可以看到如下的 Meld 界面,可以选择文件或者文件夹来比较,此外还有版本控制视图。点击目录比较并移动到下个界面。 [ ![Meld Comparison Tool](http://www.tecmint.com/wp-content/uploads/2017/05/Meld-Comparison-Tool.png) ][4] -Meld 比较工具 +*Meld 比较工具* -选择你想要比较的文件夹,注意你可以勾选“3-way Comparison”选项添加第3个文件夹。 +选择你想要比较的文件夹,注意你可以勾选 “**3-way Comparison**” 选项,添加第三个文件夹。 [ ![Select Comparison Directories](http://www.tecmint.com/wp-content/uploads/2017/05/Select-Comparison-Directories.png) ][5] -选择比较的文件夹。 +*选择比较的文件夹* -一旦你选择好了要比较的文件夹,点击 “Compare”。 +选择好要比较的文件夹后,点击 “Compare”。 [ ![Listing Difference Between +](http://www.tecmint.com/wp-content/uploads/2017/05/Listing-Difference-Between-Directories.png) ][6] -看结果出来了吧。 +*文件夹不同列表* -在这片文章我们描述了怎么在Linux下找到找出2个文件夹的不同。如果你知道其他的命令或者图形界面工具,不要忘记在下方评论分享你们的想法。 +在这篇文章中,我们描述了怎么在 Linux 下找到两个文件夹的不同。如果你知道其他的命令或者图形界面工具,不要忘记在下方评论分享你们的想法。 -------------------------------------------------------------------------------- 作者简介: -Aaron Kili 是一个Linux和F.O.S.S爱好者,即将变成的Linux 系统管理员,Web开发者,目前是TecMint的内容创建者,他喜欢与电脑工作,并且非常相信分享知识。 +Aaron Kili 是一个 Linux 和 F.O.S.S 爱好者,即将成为 Linux 系统管理员,Web 开发者,目前是 TecMint 的内容创建者,他喜欢使用电脑工作,并且非常相信分享知识。 ------------------- From 3b9136898afe66c82a1f9abfd295e9c68e0648ba Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 17 May 2017 14:38:30 +0800 Subject: [PATCH 0096/1407] =?UTF-8?q?PR=20=E8=A1=A5=E5=AE=8C?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @wi-cuckoo --- ...How debuggers work Part 2 - Breakpoints.md | 475 ------------------ 1 file changed, 475 deletions(-) delete mode 100644 sources/tech/20110127 How debuggers work Part 2 - Breakpoints.md diff --git a/sources/tech/20110127 How debuggers work Part 2 - Breakpoints.md b/sources/tech/20110127 How debuggers work Part 2 - Breakpoints.md deleted file mode 100644 index ac65b08866..0000000000 --- a/sources/tech/20110127 How debuggers work Part 2 - Breakpoints.md +++ /dev/null @@ -1,475 +0,0 @@ -translating by wi-cuckoo - -[How debuggers work: Part 2 - Breakpoints][26] -============================================================ - -This is the second part in a series of articles on how debuggers work. Make sure you read [the first part][27]before this one. - -### In this part - -I'm going to demonstrate how breakpoints are implemented in a debugger. Breakpoints are one of the two main pillars of debugging - the other being able to inspect values in the debugged process's memory. We've already seen a preview of the other pillar in part 1 of the series, but breakpoints still remain mysterious. By the end of this article, they won't be. - -### Software interrupts - -To implement breakpoints on the x86 architecture, software interrupts (also known as "traps") are used. Before we get deep into the details, I want to explain the concept of interrupts and traps in general. - -A CPU has a single stream of execution, working through instructions one by one [[1]][19]. To handle asynchronous events like IO and hardware timers, CPUs use interrupts. A hardware interrupt is usually a dedicated electrical signal to which a special "response circuitry" is attached. This circuitry notices an activation of the interrupt and makes the CPU stop its current execution, save its state, and jump to a predefined address where a handler routine for the interrupt is located. When the handler finishes its work, the CPU resumes execution from where it stopped. - -Software interrupts are similar in principle but a bit different in practice. CPUs support special instructions that allow the software to simulate an interrupt. When such an instruction is executed, the CPU treats it like an interrupt - stops its normal flow of execution, saves its state and jumps to a handler routine. Such "traps" allow many of the wonders of modern OSes (task scheduling, virtual memory, memory protection, debugging) to be implemented efficiently. - -Some programming errors (such as division by 0) are also treated by the CPU as traps, and are frequently referred to as "exceptions". Here the line between hardware and software blurs, since it's hard to say whether such exceptions are really hardware interrupts or software interrupts. But I've digressed too far away from the main topic, so it's time to get back to breakpoints. - -### int 3 in theory - -Having written the previous section, I can now simply say that breakpoints are implemented on the CPU by a special trap called int 3. int is x86 jargon for "trap instruction" - a call to a predefined interrupt handler. x86 supports the int instruction with a 8-bit operand specifying the number of the interrupt that occurred, so in theory 256 traps are supported. The first 32 are reserved by the CPU for itself, and number 3 is the one we're interested in here - it's called "trap to debugger". - -Without further ado, I'll quote from the bible itself [[2]][20]: - -> The INT 3 instruction generates a special one byte opcode (CC) that is intended for calling the debug exception handler. (This one byte form is valuable because it can be used to replace the first byte of any instruction with a breakpoint, including other one byte instructions, without over-writing other code). - -The part in parens is important, but it's still too early to explain it. We'll come back to it later in this article. - -### int 3 in practice - -Yes, knowing the theory behind things is great, OK, but what does this really mean? How do we use int 3to implement breakpoints? Or to paraphrase common programming Q&A jargon -  _Plz show me the codes!_ - -In practice, this is really very simple. Once your process executes the int 3 instruction, the OS stops it [[3]][21]. On Linux (which is what we're concerned with in this article) it then sends the process a signal - SIGTRAP. - -That's all there is to it - honest! Now recall from the first part of the series that a tracing (debugger) process gets notified of all the signals its child (or the process it attaches to for debugging) gets, and you can start getting a feel of where we're going. - -That's it, no more computer architecture 101 jabber. It's time for examples and code. - -### Setting breakpoints manually - -I'm now going to show code that sets a breakpoint in a program. The target program I'm going to use for this demonstration is the following: - -``` -section .text - ; The _start symbol must be declared for the linker (ld) - global _start - -_start: - - ; Prepare arguments for the sys_write system call: - ; - eax: system call number (sys_write) - ; - ebx: file descriptor (stdout) - ; - ecx: pointer to string - ; - edx: string length - mov edx, len1 - mov ecx, msg1 - mov ebx, 1 - mov eax, 4 - - ; Execute the sys_write system call - int 0x80 - - ; Now print the other message - mov edx, len2 - mov ecx, msg2 - mov ebx, 1 - mov eax, 4 - int 0x80 - - ; Execute sys_exit - mov eax, 1 - int 0x80 - -section .data - -msg1 db 'Hello,', 0xa -len1 equ $ - msg1 -msg2 db 'world!', 0xa -len2 equ $ - msg2 -``` - -I'm using assembly language for now, in order to keep us clear of compilation issues and symbols that come up when we get into C code. What the program listed above does is simply print "Hello," on one line and then "world!" on the next line. It's very similar to the program demonstrated in the previous article. - -I want to set a breakpoint after the first printout, but before the second one. Let's say right after the first int 0x80 [[4]][22], on the mov edx, len2 instruction. First, we need to know what address this instruction maps to. Running objdump -d: - -``` -traced_printer2: file format elf32-i386 - -Sections: -Idx Name Size VMA LMA File off Algn - 0 .text 00000033 08048080 08048080 00000080 2**4 - CONTENTS, ALLOC, LOAD, READONLY, CODE - 1 .data 0000000e 080490b4 080490b4 000000b4 2**2 - CONTENTS, ALLOC, LOAD, DATA - -Disassembly of section .text: - -08048080 <.text>: - 8048080: ba 07 00 00 00 mov $0x7,%edx - 8048085: b9 b4 90 04 08 mov $0x80490b4,%ecx - 804808a: bb 01 00 00 00 mov $0x1,%ebx - 804808f: b8 04 00 00 00 mov $0x4,%eax - 8048094: cd 80 int $0x80 - 8048096: ba 07 00 00 00 mov $0x7,%edx - 804809b: b9 bb 90 04 08 mov $0x80490bb,%ecx - 80480a0: bb 01 00 00 00 mov $0x1,%ebx - 80480a5: b8 04 00 00 00 mov $0x4,%eax - 80480aa: cd 80 int $0x80 - 80480ac: b8 01 00 00 00 mov $0x1,%eax - 80480b1: cd 80 int $0x80 -``` - -So, the address we're going to set the breakpoint on is 0x8048096\. Wait, this is not how real debuggers work, right? Real debuggers set breakpoints on lines of code and on functions, not on some bare memory addresses? Exactly right. But we're still far from there - to set breakpoints like  _real_  debuggers we still have to cover symbols and debugging information first, and it will take another part or two in the series to reach these topics. For now, we'll have to do with bare memory addresses. - -At this point I really want to digress again, so you have two choices. If it's really interesting for you to know  _why_  the address is 0x8048096 and what does it mean, read the next section. If not, and you just want to get on with the breakpoints, you can safely skip it. - -### Digression - process addresses and entry point - -Frankly, 0x8048096 itself doesn't mean much, it's just a few bytes away from the beginning of the text section of the executable. If you look carefully at the dump listing above, you'll see that the text section starts at 0x08048080\. This tells the OS to map the text section starting at this address in the virtual address space given to the process. On Linux these addresses can be absolute (i.e. the executable isn't being relocated when it's loaded into memory), because with the virtual memory system each process gets its own chunk of memory and sees the whole 32-bit address space as its own (called "linear" address). - -If we examine the ELF [[5]][23] header with readelf, we get: - -``` -$ readelf -h traced_printer2 -ELF Header: - Magic: 7f 45 4c 46 01 01 01 00 00 00 00 00 00 00 00 00 - Class: ELF32 - Data: 2's complement, little endian - Version: 1 (current) - OS/ABI: UNIX - System V - ABI Version: 0 - Type: EXEC (Executable file) - Machine: Intel 80386 - Version: 0x1 - Entry point address: 0x8048080 - Start of program headers: 52 (bytes into file) - Start of section headers: 220 (bytes into file) - Flags: 0x0 - Size of this header: 52 (bytes) - Size of program headers: 32 (bytes) - Number of program headers: 2 - Size of section headers: 40 (bytes) - Number of section headers: 4 - Section header string table index: 3 -``` - -Note the "entry point address" section of the header, which also points to 0x8048080\. So if we interpret the directions encoded in the ELF file for the OS, it says: - -1. Map the text section (with given contents) to address 0x8048080 -2. Start executing at the entry point - address 0x8048080 - -But still, why 0x8048080? For historic reasons, it turns out. Some googling led me to a few sources that claim that the first 128MB of each process's address space were reserved for the stack. 128MB happens to be 0x8000000, which is where other sections of the executable may start. 0x8048080, in particular, is the default entry point used by the Linux ld linker. This entry point can be modified by passing the -Ttextargument to ld. - -To conclude, there's nothing really special in this address and we can freely change it. As long as the ELF executable is properly structured and the entry point address in the header matches the real beginning of the program's code (text section), we're OK. - -### Setting breakpoints in the debugger with int 3 - -To set a breakpoint at some target address in the traced process, the debugger does the following: - -1. Remember the data stored at the target address -2. Replace the first byte at the target address with the int 3 instruction - -Then, when the debugger asks the OS to run the process (with PTRACE_CONT as we saw in the previous article), the process will run and eventually hit upon the int 3, where it will stop and the OS will send it a signal. This is where the debugger comes in again, receiving a signal that its child (or traced process) was stopped. It can then: - -1. Replace the int 3 instruction at the target address with the original instruction -2. Roll the instruction pointer of the traced process back by one. This is needed because the instruction pointer now points  _after_  the int 3, having already executed it. -3. Allow the user to interact with the process in some way, since the process is still halted at the desired target address. This is the part where your debugger lets you peek at variable values, the call stack and so on. -4. When the user wants to keep running, the debugger will take care of placing the breakpoint back (since it was removed in step 1) at the target address, unless the user asked to cancel the breakpoint. - -Let's see how some of these steps are translated into real code. We'll use the debugger "template" presented in part 1 (forking a child process and tracing it). In any case, there's a link to the full source code of this example at the end of the article. - -``` -/* Obtain and show child's instruction pointer */ -ptrace(PTRACE_GETREGS, child_pid, 0, ®s); -procmsg("Child started. EIP = 0x%08x\n", regs.eip); - -/* Look at the word at the address we're interested in */ -unsigned addr = 0x8048096; -unsigned data = ptrace(PTRACE_PEEKTEXT, child_pid, (void*)addr, 0); -procmsg("Original data at 0x%08x: 0x%08x\n", addr, data); -``` - -Here the debugger fetches the instruction pointer from the traced process, as well as examines the word currently present at 0x8048096\. When run tracing the assembly program listed in the beginning of the article, this prints: - -``` -[13028] Child started. EIP = 0x08048080 -[13028] Original data at 0x08048096: 0x000007ba -``` - -So far, so good. Next: - -``` -/* Write the trap instruction 'int 3' into the address */ -unsigned data_with_trap = (data & 0xFFFFFF00) | 0xCC; -ptrace(PTRACE_POKETEXT, child_pid, (void*)addr, (void*)data_with_trap); - -/* See what's there again... */ -unsigned readback_data = ptrace(PTRACE_PEEKTEXT, child_pid, (void*)addr, 0); -procmsg("After trap, data at 0x%08x: 0x%08x\n", addr, readback_data); -``` - -Note how int 3 is inserted at the target address. This prints: - -``` -[13028] After trap, data at 0x08048096: 0x000007cc -``` - -Again, as expected - 0xba was replaced with 0xcc. The debugger now runs the child and waits for it to halt on the breakpoint: - -``` -/* Let the child run to the breakpoint and wait for it to -** reach it -*/ -ptrace(PTRACE_CONT, child_pid, 0, 0); - -wait(&wait_status); -if (WIFSTOPPED(wait_status)) { - procmsg("Child got a signal: %s\n", strsignal(WSTOPSIG(wait_status))); -} -else { - perror("wait"); - return; -} - -/* See where the child is now */ -ptrace(PTRACE_GETREGS, child_pid, 0, ®s); -procmsg("Child stopped at EIP = 0x%08x\n", regs.eip); -``` - -This prints: - -``` -Hello, -[13028] Child got a signal: Trace/breakpoint trap -[13028] Child stopped at EIP = 0x08048097 -``` - -Note the "Hello," that was printed before the breakpoint - exactly as we planned. Also note where the child stopped - just after the single-byte trap instruction. - -Finally, as was explained earlier, to keep the child running we must do some work. We replace the trap with the original instruction and let the process continue running from it. - -``` -/* Remove the breakpoint by restoring the previous data -** at the target address, and unwind the EIP back by 1 to -** let the CPU execute the original instruction that was -** there. -*/ -ptrace(PTRACE_POKETEXT, child_pid, (void*)addr, (void*)data); -regs.eip -= 1; -ptrace(PTRACE_SETREGS, child_pid, 0, ®s); - -/* The child can continue running now */ -ptrace(PTRACE_CONT, child_pid, 0, 0); -``` - -This makes the child print "world!" and exit, just as planned. - -Note that we don't restore the breakpoint here. That can be done by executing the original instruction in single-step mode, then placing the trap back and only then do PTRACE_CONT. The debug library demonstrated later in the article implements this. - -### More on int 3 - -Now is a good time to come back and examine int 3 and that curious note from Intel's manual. Here it is again: - -> This one byte form is valuable because it can be used to replace the first byte of any instruction with a breakpoint, including other one byte instructions, without over-writing other code - -int instructions on x86 occupy two bytes - 0xcd followed by the interrupt number [[6]][24]. int 3 could've been encoded as cd 03, but there's a special single-byte instruction reserved for it - 0xcc. - -Why so? Because this allows us to insert a breakpoint without ever overwriting more than one instruction. And this is important. Consider this sample code: - -``` - .. some code .. - jz foo - dec eax -foo: - call bar - .. some code .. -``` - -Suppose we want to place a breakpoint on dec eax. This happens to be a single-byte instruction (with the opcode 0x48). Had the replacement breakpoint instruction been longer than 1 byte, we'd be forced to overwrite part of the next instruction (call), which would garble it and probably produce something completely invalid. But what is the branch jz foo was taken? Then, without stopping on dec eax, the CPU would go straight to execute the invalid instruction after it. - -Having a special 1-byte encoding for int 3 solves this problem. Since 1 byte is the shortest an instruction can get on x86, we guarantee than only the instruction we want to break on gets changed. - -### Encapsulating some gory details - -Many of the low-level details shown in code samples of the previous section can be easily encapsulated behind a convenient API. I've done some encapsulation into a small utility library called debuglib - its code is available for download at the end of the article. Here I just want to demonstrate an example of its usage, but with a twist. We're going to trace a program written in C. - -### Tracing a C program - -So far, for the sake of simplicity, I focused on assembly language targets. It's time to go one level up and see how we can trace a program written in C. - -It turns out things aren't very different - it's just a bit harder to find where to place the breakpoints. Consider this simple program: - -``` -#include - -void do_stuff() -{ - printf("Hello, "); -} - -int main() -{ - for (int i = 0; i < 4; ++i) - do_stuff(); - printf("world!\n"); - return 0; -} -``` - -Suppose I want to place a breakpoint at the entrance to do_stuff. I'll use the old friend objdump to disassemble the executable, but there's a lot in it. In particular, looking at the text section is a bit useless since it contains a lot of C runtime initialization code I'm currently not interested in. So let's just look for do_stuff in the dump: - -``` -080483e4 : - 80483e4: 55 push %ebp - 80483e5: 89 e5 mov %esp,%ebp - 80483e7: 83 ec 18 sub $0x18,%esp - 80483ea: c7 04 24 f0 84 04 08 movl $0x80484f0,(%esp) - 80483f1: e8 22 ff ff ff call 8048318 - 80483f6: c9 leave - 80483f7: c3 ret -``` - -Alright, so we'll place the breakpoint at 0x080483e4, which is the first instruction of do_stuff. Moreover, since this function is called in a loop, we want to keep stopping at the breakpoint until the loop ends. We're going to use the debuglib library to make this simple. Here's the complete debugger function: - -``` -void run_debugger(pid_t child_pid) -{ - procmsg("debugger started\n"); - - /* Wait for child to stop on its first instruction */ - wait(0); - procmsg("child now at EIP = 0x%08x\n", get_child_eip(child_pid)); - - /* Create breakpoint and run to it*/ - debug_breakpoint* bp = create_breakpoint(child_pid, (void*)0x080483e4); - procmsg("breakpoint created\n"); - ptrace(PTRACE_CONT, child_pid, 0, 0); - wait(0); - - /* Loop as long as the child didn't exit */ - while (1) { - /* The child is stopped at a breakpoint here. Resume its - ** execution until it either exits or hits the - ** breakpoint again. - */ - procmsg("child stopped at breakpoint. EIP = 0x%08X\n", get_child_eip(child_pid)); - procmsg("resuming\n"); - int rc = resume_from_breakpoint(child_pid, bp); - - if (rc == 0) { - procmsg("child exited\n"); - break; - } - else if (rc == 1) { - continue; - } - else { - procmsg("unexpected: %d\n", rc); - break; - } - } - - cleanup_breakpoint(bp); -} -``` - -Instead of getting our hands dirty modifying EIP and the target process's memory space, we just use create_breakpoint, resume_from_breakpoint and cleanup_breakpoint. Let's see what this prints when tracing the simple C code displayed above: - -``` -$ bp_use_lib traced_c_loop -[13363] debugger started -[13364] target started. will run 'traced_c_loop' -[13363] child now at EIP = 0x00a37850 -[13363] breakpoint created -[13363] child stopped at breakpoint. EIP = 0x080483E5 -[13363] resuming -Hello, -[13363] child stopped at breakpoint. EIP = 0x080483E5 -[13363] resuming -Hello, -[13363] child stopped at breakpoint. EIP = 0x080483E5 -[13363] resuming -Hello, -[13363] child stopped at breakpoint. EIP = 0x080483E5 -[13363] resuming -Hello, -world! -[13363] child exited -``` - -Just as expected! - -### The code - -[Here are][25] the complete source code files for this part. In the archive you'll find: - -* debuglib.h and debuglib.c - the simple library for encapsulating some of the inner workings of a debugger -* bp_manual.c - the "manual" way of setting breakpoints presented first in this article. Uses the debuglib library for some boilerplate code. -* bp_use_lib.c - uses debuglib for most of its code, as demonstrated in the second code sample for tracing the loop in a C program. - -### Conclusion and next steps - -We've covered how breakpoints are implemented in debuggers. While implementation details vary between OSes, when you're on x86 it's all basically variations on the same theme - substituting int 3 for the instruction where we want the process to stop. - -That said, I'm sure some readers, just like me, will be less than excited about specifying raw memory addresses to break on. We'd like to say "break on do_stuff", or even "break on  _this_  line in do_stuff" and have the debugger do it. In the next article I'm going to show how it's done. - -### References - -I've found the following resources and articles useful in the preparation of this article: - -* [How debugger works][12] -* [Understanding ELF using readelf and objdump][13] -* [Implementing breakpoints on x86 Linux][14] -* [NASM manual][15] -* [SO discussion of the ELF entry point][16] -* [This Hacker News discussion][17] of the first part of the series -* [GDB Internals][18] - - -[1] On a high-level view this is true. Down in the gory details, many CPUs today execute multiple instructions in parallel, some of them not in their original order. - -[2] The bible in this case being, of course, Intel's Architecture software developer's manual, volume 2A. - -[3] How can the OS stop a process just like that? The OS registered its own handler for int 3 with the CPU, that's how! - -[4] Wait, int again? Yes! Linux uses int 0x80 to implement system calls from user processes into the OS kernel. The user places the number of the system call and its arguments into registers and executes int 0x80. The CPU then jumps to the appropriate interrupt handler, where the OS registered a procedure that looks at the registers and decides which system call to execute. - -[5] ELF (Executable and Linkable Format) is the file format used by Linux for object files, shared libraries and executables. - -[6] An observant reader can spot the translation of int 0x80 into cd 80 in the dumps listed above. - - - - --------------------------------------------------------------------------------- - -via: http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints - -作者:[Eli Bendersky][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://eli.thegreenplace.net/ -[1]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id1 -[2]:http://en.wikipedia.org/wiki/Out-of-order_execution -[3]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id2 -[4]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id3 -[5]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id4 -[6]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id5 -[7]:http://en.wikipedia.org/wiki/Executable_and_Linkable_Format -[8]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id6 -[9]:http://eli.thegreenplace.net/tag/articles -[10]:http://eli.thegreenplace.net/tag/debuggers -[11]:http://eli.thegreenplace.net/tag/programming -[12]:http://www.alexonlinux.com/how-debugger-works -[13]:http://www.linuxforums.org/articles/understanding-elf-using-readelf-and-objdump_125.html -[14]:http://mainisusuallyafunction.blogspot.com/2011/01/implementing-breakpoints-on-x86-linux.html -[15]:http://www.nasm.us/xdoc/2.09.04/html/nasmdoc0.html -[16]:http://stackoverflow.com/questions/2187484/elf-binary-entry-point -[17]:http://news.ycombinator.net/item?id=2131894 -[18]:http://www.deansys.com/doc/gdbInternals/gdbint_toc.html -[19]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id7 -[20]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id8 -[21]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id9 -[22]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id10 -[23]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id11 -[24]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints#id12 -[25]:https://github.com/eliben/code-for-blog/tree/master/2011/debuggers_part2_code -[26]:http://eli.thegreenplace.net/2011/01/27/how-debuggers-work-part-2-breakpoints -[27]:http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1/ From fd394dbe1f82169fa7859ad9bc257006f81a33ef Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 17 May 2017 16:05:20 +0800 Subject: [PATCH 0097/1407] =?UTF-8?q?PRF&PUB:20170317=20Join=20CentOS=207?= =?UTF-8?q?=20Desktop=20to=20Samba4=20AD=20as=20a=20Domain=20Member=20?= =?UTF-8?q?=E2=80=93=20Part=209?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @rusking --- ...o Samba4 AD as a Domain Member – Part 9.md | 92 +++++++++---------- 1 file changed, 46 insertions(+), 46 deletions(-) rename {translated/tech => published}/20170317 Join CentOS 7 Desktop to Samba4 AD as a Domain Member – Part 9.md (82%) diff --git a/translated/tech/20170317 Join CentOS 7 Desktop to Samba4 AD as a Domain Member – Part 9.md b/published/20170317 Join CentOS 7 Desktop to Samba4 AD as a Domain Member – Part 9.md similarity index 82% rename from translated/tech/20170317 Join CentOS 7 Desktop to Samba4 AD as a Domain Member – Part 9.md rename to published/20170317 Join CentOS 7 Desktop to Samba4 AD as a Domain Member – Part 9.md index 73a6241a21..313b518d37 100644 --- a/translated/tech/20170317 Join CentOS 7 Desktop to Samba4 AD as a Domain Member – Part 9.md +++ b/published/20170317 Join CentOS 7 Desktop to Samba4 AD as a Domain Member – Part 9.md @@ -1,15 +1,14 @@ -Join CentOS 7 Desktop to Samba4 AD as a Domain Member – Part 9 +Samba 系列(九):将 CentOS 7 桌面系统加入到 Samba4 AD 域环境中 ============================================================ -将 CentOS 7 桌面系统加入到 Samba4 AD 域环境中——(九) 这篇文章讲述了如何使用 Authconfig-gtk 工具将 CentOS 7 桌面系统加入到 Samba4 AD 域环境中,并使用域帐号登录到 CentOS 系统。 -#### 要求 +### 要求 1、[在 Ubuntu 系统中使用 Samba4 创建活动目录架构][1] -2、[CentOS 7.3 安装指南]][2] +2、[CentOS 7.3 安装指南][2] -### 第一步:在 CentOS 系统中配置 Samba4 AD DC Step 1: Configure CentOS Network for Samba4 AD DC +### 第一步:在 CentOS 系统中配置 Samba4 AD DC 1、在将 CentOS 7 加入到 Samba4 域环境之前,你得先配置 CentOS 系统的网络环境,确保在 CentOS 系统中通过 DNS 可以解析到域名。 @@ -21,13 +20,13 @@ Join CentOS 7 Desktop to Samba4 AD as a Domain Member – Part 9 ![Network Settings](http://www.tecmint.com/wp-content/uploads/2017/03/Network-Settings.jpg) ][3] -网络设置 +*网络设置* [ ![Configure Network](http://www.tecmint.com/wp-content/uploads/2017/03/Configure-Network.jpg) ][4] -配置网络 +*配置网络* 2、下一步,打开网络配置文件,在文件末尾添加一行域名信息。这样能确保当你仅使用主机名来查询域中的 DNS 记录时, DNS 解析器会自动把域名添加进来。 @@ -44,7 +43,7 @@ SEARCH="your_domain_name" ![Network Interface Configuration](http://www.tecmint.com/wp-content/uploads/2017/03/Network-Interface-Configuration.jpg) ][5] -网卡配置 +*网卡配置* 3、最后,重启网卡服务以应用更改,并验证解析器的配置文件是否正确配置。我们通过使用 ping 命令加上 DC 服务器的主机名或域名以验证 DNS 解析能否正常运行。 @@ -54,12 +53,13 @@ $ cat /etc/resolv.conf $ ping -c1 adc1 $ ping -c1 adc2 $ ping tecmint.lan -``` +``` + [ ![Verify Network Configuration](http://www.tecmint.com/wp-content/uploads/2017/03/Verify-Network-Configuration.jpg) ][6] -验证网络配置是否正常 +*验证网络配置是否正常* 4、同时,使用下面的命令来配置你的主机名,然后重启计算机以应用更改: @@ -68,7 +68,7 @@ $ sudo hostnamectl set-hostname your_hostname $ sudo init 6 ``` -使用下面的命令来验证主机名是否正确配置 +使用下面的命令来验证主机名是否正确配置: ``` $ cat /etc/hostname @@ -106,30 +106,30 @@ $ sudo authconfig-gtk 打开身份或认证配置页面: -* 用户帐号数据库 = 选择 Winbind -* Winbind 域 = 你的域名 -* 安全模式 = ADS -* Winbind ADS 域 = 你的域名.TLD -* 域控制器 = 域控服务器的全域名 -* 默认Shell = /bin/bash +* 用户帐号数据库 : 选择 Winbind +* Winbind 域 : 你的域名 +* 安全模式 : ADS +* Winbind ADS 域 : 你的域名.TLD +* 域控制器 : 域控服务器的全域名 +* 默认Shell : /bin/bash * 勾选允许离线登录 [ ![Authentication Configuration](http://www.tecmint.com/wp-content/uploads/2017/03/Authentication-Configuration.jpg) ][7] -域认证配置 +*域认证配置* 打开高级选项配置页面: -* 本地认证选项 = 支持指纹识别 -* 其它认证选项 = 用户首次登录创建家目录 +* 本地认证选项 : 支持指纹识别 +* 其它认证选项 : 用户首次登录创建家目录 [ ![Authentication Advance Configuration](http://www.tecmint.com/wp-content/uploads/2017/03/Authentication-Advance-Configuration.jpg) ][8] -高级认证配置 +*高级认证配置* 9、修改完上面的配置之后,返回到身份或认证配置页面,点击加入域按钮,在弹出的提示框点保存即可。 @@ -137,13 +137,13 @@ $ sudo authconfig-gtk ![Identity and Authentication](http://www.tecmint.com/wp-content/uploads/2017/03/Identity-and-Authentication.jpg) ][9] -身份和认证 +*身份和认证* [ ![Save Authentication Configuration](http://www.tecmint.com/wp-content/uploads/2017/03/Save-Authentication-Configuration.jpg) ][10] -保存认证配置 +*保存认证配置* 10、保存配置之后,系统将会提示你提供域管理员信息以将 CentOS 系统加入到域中。输入域管理员帐号及密码后点击 OK 按钮,加入域完成。 @@ -151,15 +151,15 @@ $ sudo authconfig-gtk ![Joining Winbind Domain](http://www.tecmint.com/wp-content/uploads/2017/03/Joining-Winbind-Domain.jpg) ][11] -加入 Winbind 域环境 +*加入 Winbind 域环境* -11、另入域后,点击应用按钮以让配置生效,选择所有的 windows 并重启机器。 +11、加入域后,点击应用按钮以让配置生效,选择所有的 windows 并重启机器。 [ ![Apply Authentication Configuration](http://www.tecmint.com/wp-content/uploads/2017/03/Apply-Authentication-Configuration.jpg) ][12] -应用认证配置 +*应用认证配置* 12、要验证 CentOS 是否已成功加入到 Samba4 AD DC 中,你可以在安装了 [RSAT 工具][13] 的 windows 机器上,打开 AD 用户和计算机工具,点击域中的计算机。 @@ -169,7 +169,7 @@ $ sudo authconfig-gtk ![Active Directory Users and Computers](http://www.tecmint.com/wp-content/uploads/2017/03/Active-Directory-Users-and-Computers.jpg) ][14] -活动目录用户和计算机 +*活动目录用户和计算机* ### 第四步:使用 Samba4 AD DC 帐号登录 CentOS 桌面系统 @@ -177,20 +177,20 @@ $ sudo authconfig-gtk ``` Domain\domain_account -or +或 Domain_user@domain.tld ``` [ ![Not listed Users](http://www.tecmint.com/wp-content/uploads/2017/03/Not-listed-Users.jpg) ][15] -使用其它账户 +*使用其它账户* [ ![Enter Domain Username](http://www.tecmint.com/wp-content/uploads/2017/03/Enter-Domain-Username.jpg) ][16] -输入域用户名 +*输入域用户名* 14、在 CentOS 系统的命令行中,你也可以使用下面的任一方式来切换到域帐号进行登录: @@ -202,15 +202,15 @@ $ su - domain_user@domain.tld ![Authenticate Domain Username](http://www.tecmint.com/wp-content/uploads/2017/03/Authenticate-Domain-User.jpg) ][17] -使用域帐号登录 +*使用域帐号登录* [ ![Authenticate Domain User Email](http://www.tecmint.com/wp-content/uploads/2017/03/Authenticate-Domain-User-Email.jpg) ][18] -使用域帐号邮箱登录 +*使用域帐号邮箱登录* -15、要为域用户或组添加 root 权限,在命令行下使用 root 权限帐号打开 sudoers 配置文件,添加下面一行内容: +15、要为域用户或组添加 root 权限,在命令行下使用 root 权限帐号打开 `sudoers` 配置文件,添加下面一行内容: ``` YOUR_DOMAIN\\domain_username ALL=(ALL:ALL) ALL #For domain users @@ -220,7 +220,7 @@ YOUR_DOMAIN\\domain_username ALL=(ALL:ALL) ALL #For domain users ![Assign Permission to User and Group](http://www.tecmint.com/wp-content/uploads/2017/03/Assign-Permission-to-User-and-Group.jpg) ][19] -指定用户和用户组权限 +*指定用户和用户组权限* 16、使用下面的命令来查看域控制器信息: @@ -231,7 +231,7 @@ $ sudo net ads info ![Check Domain Controller Info](http://www.tecmint.com/wp-content/uploads/2017/03/Check-Domain-Controller-Info.jpg) ][20] -查看域控制器信息 +*查看域控制器信息* 17、你可以在安装了 Winbind 客户端的机器上使用下面的命令来验证 CentOS 加入到 Samba4 AD DC 后的信任关系是否正常: @@ -242,17 +242,17 @@ $ sudo yum install samba-winbind-clients 然后,执行下面的一些命令来查看 Samba4 AD DC 的相关信息: ``` -$ wbinfo -p #Ping 域名 -$ wbinfo -t #检查信任关系 -$ wbinfo -u #列出域用户帐号 -$ wbinfo -g #列出域用户组 -$ wbinfo -n domain_account #查看域帐号的 SID 信息 +$ wbinfo -p ### Ping 域名 +$ wbinfo -t ### 检查信任关系 +$ wbinfo -u ### 列出域用户帐号 +$ wbinfo -g ### 列出域用户组 +$ wbinfo -n domain_account ### 查看域帐号的 SID 信息 ``` [ ![Get Samba4 AD DC Details](http://www.tecmint.com/wp-content/uploads/2017/03/Get-Samba4-AD-DC-Details.jpg) ][21] -查看 Samba4 AD DC 信息 +*查看 Samba4 AD DC 信息* 18、如果你想让 CentOS 系统退出域环境,使用具有管理员权限的帐号执行下面的命令,后面加上域名及域管理员帐号,如下图所示: @@ -263,7 +263,7 @@ $ sudo net ads leave your_domain -U domain_admin_username ![Leave Domain from Samba4 AD](http://www.tecmint.com/wp-content/uploads/2017/03/Leave-Domain-from-Samba4-AD.jpg) ][22] -退出 Samba4 AD 域 +*退出 Samba4 AD 域* 这篇文章就写到这里吧!尽管上面的这些操作步骤是将 CentOS 7 系统加入到 Samba4 AD DC 域中,其实这些步骤也同样适用于将 CentOS 7 桌面系统加入到 Microsoft Windows Server 2008 或 2012 的域中。 @@ -279,14 +279,14 @@ via: http://www.tecmint.com/join-centos-7-to-samba4-active-directory/ 作者:[Matei Cezar][a] 译者:[rusking](https://github.com/rusking) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 [a]:http://www.tecmint.com/author/cezarmatei/ -[1]:http://www.tecmint.com/install-samba4-active-directory-ubuntu/ -[2]:http://www.tecmint.com/centos-7-3-installation-guide/ +[1]:https://linux.cn/article-8065-1.html +[2]:https://linux.cn/article-8048-1.html [3]:http://www.tecmint.com/wp-content/uploads/2017/03/Network-Settings.jpg [4]:http://www.tecmint.com/wp-content/uploads/2017/03/Configure-Network.jpg [5]:http://www.tecmint.com/wp-content/uploads/2017/03/Network-Interface-Configuration.jpg @@ -297,7 +297,7 @@ via: http://www.tecmint.com/join-centos-7-to-samba4-active-directory/ [10]:http://www.tecmint.com/wp-content/uploads/2017/03/Save-Authentication-Configuration.jpg [11]:http://www.tecmint.com/wp-content/uploads/2017/03/Joining-Winbind-Domain.jpg [12]:http://www.tecmint.com/wp-content/uploads/2017/03/Apply-Authentication-Configuration.jpg -[13]:http://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/ +[13]:https://linux.cn/article-8097-1.html [14]:http://www.tecmint.com/wp-content/uploads/2017/03/Active-Directory-Users-and-Computers.jpg [15]:http://www.tecmint.com/wp-content/uploads/2017/03/Not-listed-Users.jpg [16]:http://www.tecmint.com/wp-content/uploads/2017/03/Enter-Domain-Username.jpg From 1fadc12ff8adaa5c1d66db2ba4d6d0466b54e22e Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 17 May 2017 20:45:36 +0800 Subject: [PATCH 0098/1407] PRF&PUB:20170217 How to install pandom a true random number generator for Linux.md @FSSlc https://linux.cn/article-8517-1.html --- ... true random number generator for Linux.md | 432 +++++++++--------- 1 file changed, 219 insertions(+), 213 deletions(-) rename {translated/tech => published}/20170217 How to install pandom a true random number generator for Linux.md (51%) diff --git a/translated/tech/20170217 How to install pandom a true random number generator for Linux.md b/published/20170217 How to install pandom a true random number generator for Linux.md similarity index 51% rename from translated/tech/20170217 How to install pandom a true random number generator for Linux.md rename to published/20170217 How to install pandom a true random number generator for Linux.md index 2c7b232aca..b2915a4fee 100644 --- a/translated/tech/20170217 How to install pandom a true random number generator for Linux.md +++ b/published/20170217 How to install pandom a true random number generator for Linux.md @@ -1,195 +1,175 @@ -如何安装 pandom : 一个针对 linux 的真随机数生成器 +如何安装 pandom : 一个针对 Linux 的真随机数生成器 ============================================================ -### 在本文中,你将看到 - -1. [简介][40] -2. [1 pandom 的安装][41] - 1. [1.1 获取 root 权限][1] - 2. [1.2 安装编译所需的依赖][2] - 3. [基于 Arch 的系统][3] - 4. [基于 Debian 的系统][4] - 5. [基于 Red Hat 的系统][5] - 6. [基于 SUSE 的系统][6] - 7. [1.3 下载并析出源码][7] - 8. [1.4 在安装前进行测试 (推荐)][8] - 9. [1.5 确定初始化系统][9] - 10. [1.6 安装 pandom][10] - 11. [基于 init.d 的初始化系统 (例如 upstart、sysvinit)][11] - 12. [以 systemd 作为初始化程序的系统][12] -3. [2 checkme 文件的分析][42] - 1. [2.1 获取 root 权限][13] - 2. [2.2 安装编译所需的依赖][14] - 3. [基于 Arch 的系统][15] - 4. [基于 Debian 的系统][16] - 5. [基于 Red Hat 的系统][17] - 6. [基于 SUSE 的系统][18] - 7. [2.3 下载并析出源码][19] - 8. [2.4 安装 entropyarray][20] - 9. [2.5 分析 checkme 文件][21] - 10. [2.6 卸载 entropyarray (可选)][22] -4. [3 使用 debian 软件仓库安装 pandom][43] - 1. [3.1 获取 root 权限][23] - 2. [3.2 安装密钥][24] - 3. [3.3 安装软件源列表][25] - 4. [Wheezy][26] - 5. [Jessie][27] - 6. [Stretch][28] - 7. [3.4 更新软件源列表][29] - 8. [3.5 测试 pandom][30] - 9. [3.6 安装 pandom][31] -5. [4 管理 pandom][44] - 1. [4.1 性能测试][32] - 2. [4.2 熵及序列相关性测试][33] - 3. [4.3 系统服务][34] - 4. [基于 init.d 的初始化系统 (例如 upstart、sysvinit)][35] - 5. [以 systemd 作为初始化程序的系统][36] -6. [5 增强不可预测性或者性能][45] - 1. [5.1 编辑源文件][37] - 2. [5.2 测试不可预测性][38] - 3. [5.3 安装个人定制的 pandom][39] - -本教程只针对 amd64/x86_64 架构 linux 内核版本大于等于 2.6.9 的系统。本文将解释如何安装 [pandom][46],一个由 ncomputers.org 维护的定时颤动真随机数生成器。 +本教程只针对 amd64/x86_64 架构 Linux 内核版本大于等于 2.6.9 的系统。本文将解释如何安装 [pandom][46],这是一个由 ncomputers.org 维护的定时抖动真随机数生成器。 ### 简介 -以现代的眼光来看,Linux 内核内置的真随机数发生器提供了一个很低的吞吐量,例如在配置固态硬盘 (SSD) 的个人电脑和虚拟专用服务器 (VPS)的环境中。 +在现在的计算机状况下,比如说配置了固态硬盘(SSD)的个人电脑和虚拟专用服务器(VPS)的环境中,Linux 内核内置的真随机数发生器提供的吞吐量很低。 -各种不同的加密目的使得对真随机数的需求持续增长,从而使得这个低吞吐量问题在各种 linux 实现中变得越来越普遍。 +而出于各种不同的加密目的使得对真随机数的需求持续增长,从而使得这个低吞吐量问题在 Linux 实现中变得越来越严重。 -在相同的物理或者虚拟环境下,并假设没有其他进程以 root 身份向 /dev/random 进行写操作的话,64 [ubits][47]/64 bits 的 pandom 可以以 8 KiB/s 的速率生成随机数。 +在与上述相同的物理或者虚拟环境下,并假设没有其它进程以 root 身份向 `/dev/random` 进行写操作的话,64 [ubits][47]/64 bits 的 pandom 可以以 8 KiB/s 的速率生成随机数。 ### 1 pandom 的安装 -### 1.1 获得 root 权限 +#### 1.1 获得 root 权限 Pandom 必须以 root 身份来安装,所以在必要的时候请运行如下命令: - su - +``` +su - +``` -### 1.2 安装编译所需的依赖 +#### 1.2 安装编译所需的依赖 -为了下载并安装 pandom,你需要 GNU **as** 汇编器、GNU **make**、GNU **tar** 和 GNU **wget** (最后两个工具通常已被安装)。随后你可以按照你的意愿卸载它们。 +为了下载并安装 pandom,你需要 GNU `as` 汇编器、GNU `make`、GNU `tar` 和 GNU `wget` (最后两个工具通常已被安装)。随后你可以按照你的意愿卸载它们。 -### 基于 Arch 的系统 - - pacman -S binutils make - -### 基于 Debian 的系统 - - apt-get install binutils make - -### 基于 Red Hat 的系统 - - dnf install binutils make - - yum install binutils make - -### 基于 SUSE 的系统 - - zypper install binutils make - -### 1.3 下载并析出源码 - -下面的命令将使用 **wget** 和 **tar** 从 ncomputers.org 下载 pandom 的源代码并将它们解压出来: - - wget [http://ncomputers.org/pandom.tar.gz][48] - tar xf pandom.tar.gz - cd pandom/amd64-linux - -### 1.4 在安装前进行测试 (推荐) - -这个被推荐的测试将花费大约 8 分钟的时间,它将检查内核支持情况并生成一个名为 **checkme** 的文件 (在下一节中将被分析)。 - - make check - -### 1.5 确定系统的初始化程序 - -在安装 pandom 之前,你需要知道你的系统使用的是哪个初始化程序。假如下面命令的输出中包含 **running**,则意味着你的系统使用了 **systemd**,否则你的系统则可能使用了一个 **init.d** 的实现 (例如 upstart、sysvinit)。 - - systemctl is-system-running +**基于 Arch 的系统:** ``` +pacman -S binutils make +``` + +**基于 Debian 的系统:** + +``` +apt-get install binutils make +``` + +基于 Red Hat 的系统: + +``` +dnf install binutils make +yum install binutils make +``` + +**基于 SUSE 的系统:** + +``` +zypper install binutils make +``` + +#### 1.3 下载并析出源码 + +下面的命令将使用 `wget` 和 `tar` 从 ncomputers.org 下载 pandom 的源代码并将它们解压出来: + +``` +wget http://ncomputers.org/pandom.tar.gz +tar xf pandom.tar.gz +cd pandom/amd64-linux +``` + +#### 1.4 在安装前进行测试 (推荐) + +这个被推荐的测试将花费大约 8 分钟的时间,它将检查内核支持情况并生成一个名为 `checkme` 的文件(在下一节中将被分析)。 + +``` +make check +``` +#### 1.5 确定系统的初始化程序 + +在安装 pandom 之前,你需要知道你的系统使用的是哪个初始化程序。假如下面命令的输出中包含 `running`,则意味着你的系统使用了 `systemd`,否则你的系统则可能使用了一个 `init.d` 的实现(例如 upstart、sysvinit)。 + +``` +systemctl is-system-running running ``` -### 1.6 安装 pandom +#### 1.6 安装 pandom -一旦你知道了你的系统使用何种 linux 实现,那么你就可以相应地安装 pandom 了。 +一旦你知道了你的系统使用何种 Linux 实现,那么你就可以相应地安装 pandom 了。 -### 使用基于 init.d 作为初始化程序(如: upstart、sysvinit) 的系统 +**使用基于 init.d 作为初始化程序(如: upstart、sysvinit)的系统:** -假如你的系统使用了一个 **init.d** 的实现(如: upstart、sysvinit),请运行下面的命令来安装 pandom: +假如你的系统使用了一个 init.d 的实现(如: upstart、sysvinit),请运行下面的命令来安装 pandom: - make install-init.d +``` +make install-init.d +``` -### 以 systemd 作为初始化程序的系统 +**以 systemd 作为初始化程序的系统:** -假如你的系统使用 **systemd**,则请运行以下命令来安装 pandom: +假如你的系统使用 `systemd`,则请运行以下命令来安装 pandom: - make install-systemd +``` +make install-systemd +``` ### 2 checkme 文件的分析 -在使用 pandom 进行加密之前,强烈建议分析一下先前在安装过程中生成的 **checkme** 文件。通过分析我们便可以知道用 pandom 生成的数是否真的随机。本节将解释如何使用 ncomputers.org 的 shell 脚本 **entropyarray** 来测试由 pandom 产生的输出的熵及序列相关性。 +在使用 pandom 进行加密之前,强烈建议分析一下先前在安装过程中生成的 `checkme` 文件。通过分析我们便可以知道用 pandom 生成的数是否真的随机。本节将解释如何使用 ncomputers.org 的 shell 脚本 `entropyarray` 来测试由 pandom 产生的输出的熵及序列相关性。 -**注**:整个分析过程也可以在另一台电脑上完成,例如在一个笔记本电脑或台式机上。举个例子:假如你正在一个资源受到限制的 VPS 上安装 pandom 程序,或许你更倾向于将 **checkme** 复制到自己的个人电脑中,然后再进行分析。 +**注**:整个分析过程也可以在另一台电脑上完成,例如在一个笔记本电脑或台式机上。举个例子:假如你正在一个资源受到限制的 VPS 上安装 pandom 程序,或许你更倾向于将 `checkme` 复制到自己的个人电脑中,然后再进行分析。 -### 2.1 获取 root 权限 +#### 2.1 获取 root 权限 `entropyarray` 程序也必须以 root 身份来安装,所以在必要时请运行如下命令: - su - +``` +su - +``` -### 2.2 安装编译所需的依赖 +#### 2.2 安装编译所需的依赖 -为了下载并安装 entropyarray, 你需要 GNU **g++** 编译器、GNU **make**、GNU **tar** 和 GNU **wget**。在随后你可以任意卸载这些依赖。 +为了下载并安装 `entropyarray`, 你需要 GNU g++ 编译器、GNU `make`、GNU `tar` 和 GNU `wget`。在随后你可以任意卸载这些依赖。 -### 基于 Arch 的系统 - - pacman -S gcc make - -### 基于 Debian 的系统 - - apt-get install g++ make - -### 基于 Red Hat 的系统 - - dnf install gcc-c++ make - - yum install gcc-c++ make - -### 基于 SUSE 的系统 - - zypper install gcc-c++ make - -### 2.3 下载并析出源码 - -以下命令将使用 **wget** 和 **tar** 从 ncomputers.org 下载到 entropyarray 的源码并进行解压: - - wget [http://ncomputers.org/rearray.tar.gz][50] - wget [http://ncomputers.org/entropy.tar.gz][51] - wget [http://ncomputers.org/entropyarray.tar.gz][52] - - tar xf entropy.tar.gz - tar xf rearray.tar.gz - tar xf entropyarray.tar.gz - -### 2.4 安装 entropyarray - -**注**:如果在编译过程中报有关 -std=c++11 的错误,则说明当前系统安装的 GNU **g++** 版本不支持 ISO C++ 2011 标准,那么你可能需要在另一个支持该标准的系统中编译 ncomputers.org/**entropy** 和 ncomputers.org/**rearray** (例如在一个你喜爱的较新的 linux 发行版本中来编译)。接着使用 **make install** 来安装编译好的二进制文件,再接着你可能想继续运行 **entropyarray** 程序,或者跳过运行该程序这一步骤,然而我还是建议在使用 pandom 来达到加密目地之前先分析一下 **checkme** 文件。 - - cd rearray; make install; cd .. - cd entropy; make install; cd .. - cd entropyarray; make install; cd .. - -### 2.5 分析 checkme 文件 - -**注**:64 [ubits][53] / 64 bits 的 pandom 实现所生成的结果中熵应该高于 **15.977** 且 **max** 字段低于 **70**。假如你的结果与之相差巨大,或许你应该按照下面第 5 节介绍的那样增加你的 pandom 实现的不可预测性。假如你跳过了生成 checkme 文件的那一步,你也可以使用其他的工具来进行测试,例如 [伪随机数序列测试][54]。 - - entropyarray checkme +**基于 Arch 的系统:** ``` +pacman -S gcc make +``` + +**基于 Debian 的系统:** + +``` +apt-get install g++ make +``` + +**基于 Red Hat 的系统:** + +``` +dnf install gcc-c++ make +yum install gcc-c++ make +``` + +**基于 SUSE 的系统:** + +``` +zypper install gcc-c++ make +``` + +#### 2.3 下载并析出源码 + +以下命令将使用 `wget` 和 `tar` 从 ncomputers.org 下载到 entropyarray 的源码并进行解压: + +``` +wget http://ncomputers.org/rearray.tar.gz +wget http://ncomputers.org/entropy.tar.gz +wget http://ncomputers.org/entropyarray.tar.gz + +tar xf entropy.tar.gz +tar xf rearray.tar.gz +tar xf entropyarray.tar.gz +``` + +#### 2.4 安装 entropyarray + +**注**:如果在编译过程中报有关 `-std=c++11` 的错误,则说明当前系统安装的 GNU g++ 版本不支持 ISO C++ 2011 标准,那么你可能需要在另一个支持该标准的系统中编译 ncomputers.org/entropy 和 ncomputers.org/rearray (例如在一个你喜爱的较新的 Linux 发行版本中来编译)。接着使用 `make install` 来安装编译好的二进制文件,再接着你可能想继续运行 `entropyarray` 程序,或者跳过运行该程序这一步骤,然而我还是建议在使用 pandom 来达到加密目地之前先分析一下 `checkme` 文件。 + +``` +cd rearray; make install; cd .. +cd entropy; make install; cd .. +cd entropyarray; make install; cd .. +``` + +#### 2.5 分析 checkme 文件 + +**注**:64 [ubits][53] / 64 bits 的 pandom 实现所生成的结果中熵应该高于 `15.977` 且 `max` 字段低于 `70`。假如你的结果与之相差巨大,或许你应该按照下面第 5 节介绍的那样增加你的 pandom 实现的不可预测性。假如你跳过了生成 `checkme` 文件的那一步,你也可以使用其他的工具来进行测试,例如 [伪随机数序列测试][54]。 + +``` +entropyarray checkme + entropyarray in /tmp/tmp.mbCopmzqsg 15.977339 min:12 @@ -221,75 +201,90 @@ med:32 max:67 ``` -### 2.6 卸载 entropyarray (可选) +#### 2.6 卸载 entropyarray (可选) -假如你打算不再使用 entropyarray,那么你可以按照你自己的需求卸载它: +假如你打算不再使用 `entropyarray`,那么你可以按照你自己的需求卸载它: - cd entropyarray; make uninstall; cd .. - cd entropy; make uninstall; cd .. - cd rearray; make uninstall; cd .. + +``` +cd entropyarray; make uninstall; cd .. +cd entropy; make uninstall; cd .. +cd rearray; make uninstall; cd .. +``` ### 3 使用 debian 的软件仓库来进行安装 假如你想在你基于 debian 的系统中让 pandom 保持更新,则你可以使用 ncomputers.org 的 debian 软件仓库来安装或者重新安装它。 -### 3.1 获取 root 权限 +#### 3.1 获取 root 权限 以下的 debian 软件包必须以 root 身份来安装,所以在必要时请运行下面这个命令: - su - +``` +su - +``` -### 3.2 安装密钥 +#### 3.2 安装密钥 下面的 debian 软件包中包含 ncomputers.org debian 软件仓库的公匙密钥: - wget [http://ncomputers.org/debian/keyring.deb][55] - dpkg -i keyring.deb - rm keyring.deb +``` +wget http://ncomputers.org/debian/keyring.deb +dpkg -i keyring.deb +rm keyring.deb +``` -### 3.3 安装软件源列表 +#### 3.3 安装软件源列表 下面这些 debian 软件包含有 ncomputers.org debian 软件仓库的软件源列表,这些软件源列表对应最新的 debian 发行版本(截至 2017 年)。 -**注**:你也可以将下面的以 `#` 注释的行加入 **/etc/apt/sources.list** 文件中,而不是为你的 debian 发行版本安装对应的 debian 软件包。但假如这些源在将来改变了,你就需要手动更新它们。 +**注**:你也可以将下面的以 `#` 注释的行加入 `/etc/apt/sources.list` 文件中,而不是为你的 debian 发行版本安装对应的 debian 软件包。但假如这些源在将来改变了,你就需要手动更新它们。 -### Wheezy +**Wheezy:** - #deb [http://ncomputers.org/debian][56] wheezy main - wget [http://ncomputers.org/debian/wheezy.deb][57] - dpkg -i wheezy.deb - rm wheezy.deb +``` +#deb http://ncomputers.org/debian wheezy main +wget http://ncomputers.org/debian/wheezy.deb +dpkg -i wheezy.deb +rm wheezy.deb +``` -### Jessie +Jessie: - #deb [http://ncomputers.org/debian][58] jessie main - wget [http://ncomputers.org/debian/jessie.deb][59] - dpkg -i jessie.deb - rm jessie.deb +``` +#deb http://ncomputers.org/debian jessie main +wget http://ncomputers.org/debian/jessie.deb +dpkg -i jessie.deb +rm jessie.deb +``` -### Stretch +**Stretch:** - #deb [http://ncomputers.org/debian][60] stretch main - wget [http://ncomputers.org/debian/stretch.deb][61] - dpkg -i stretch.deb - rm stretch.deb +``` +#deb http://ncomputers.org/debian stretch main +wget http://ncomputers.org/debian/stretch.deb +dpkg -i stretch.deb +rm stretch.deb +``` -### 3.4 升级软件源列表 +#### 3.4 升级软件源列表 一旦密钥和软件源列表安装完成,则可以使用下面的命令来更新: - apt-get update +``` +apt-get update +``` -### 3.5 测试 pandom +#### 3.5 测试 pandom 测试完毕后,你可以随意卸载下面的软件包。 -**注**:假如你已经在你的 linux 中测试了 pandom , 则你可以跳过这一步。 - - apt-get install pandom-test - pandom-test +**注**:假如你已经在你的 Linux 中测试了 pandom , 则你可以跳过这一步。 ``` +apt-get install pandom-test +pandom-test + generating checkme file, please wait around 8 minutes ... entropyarray in /tmp/tmp.5SkiYsYG3h 15.977366 @@ -322,57 +317,64 @@ med:32 max:57 ``` -### 3.6 安装 pandom +#### 3.6 安装 pandom - apt-get install pandom +``` +apt-get install pandom +``` ### 4 管理 pandom 在 pandom 安装完成后,你可能想对它进行管理。 -### 4.1 性能测试 +#### 4.1 性能测试 pandom 提供大约 8 kB/s 的随机数生成速率,但它的性能可能根据环境而有所差异。 - dd if=/dev/random of=/dev/null bs=8 count=512 - ``` +dd if=/dev/random of=/dev/null bs=8 count=512 + 512+0 records in 512+0 records out 4096 bytes (4.1 kB, 4.0 KiB) copied, 0.451253 s, 9.1 kB/s ``` -### 4.2 熵和序列相关性检验 +#### 4.2 熵和序列相关性检验 -除了 ncomputers.org/**entropyarray**,还存在更多的测试,例如 [Ilja Gerhardt 的 NIST 测试套件][62]. +除了 ncomputers.org/entropyarray,还存在更多的测试,例如 [Ilja Gerhardt 的 NIST 测试套件][62]。 - entropyarray /dev/random 1M +``` +entropyarray /dev/random 1M +``` -### 4.3 系统服务 +#### 4.3 系统服务 pandom 还可以以系统服务的形式运行。 -### 基于 init.d 的初始化系统(如 upstart、sysvinit) +**基于 init.d 的初始化系统(如 upstart、sysvinit):** - /etc/init.d/random status - /etc/init.d/random start - /etc/init.d/random stop - /etc/init.d/random restart +``` +/etc/init.d/random status +/etc/init.d/random start +/etc/init.d/random stop +/etc/init.d/random restart +``` +**以 systemd 作为初始化程序的系统:** -### 以 systemd 作为初始化程序的系统 - - systemctl status random - systemctl start random - systemctl stop random - systemctl restart random +``` +systemctl status random +systemctl start random +systemctl stop random +systemctl restart random +``` ### 5 增强不可预测性或者性能 假如你想增加你编译的 pandom 程序的不可预测性或者性能,你可以尝试增加或删减 CPU 时间测量选项。 -### 5.1 编辑源文件 +#### 5.1 编辑源文件 -请按照自己的意愿,在源文件 **test.s** 和 **tRNG.s** 中增加或者移除 measurement blocks 字段。 +请按照自己的意愿,在源文件 `test.s` 和 `tRNG.s` 中增加或者移除 `measurement blocks` 字段。 ``` #measurement block @@ -388,17 +390,21 @@ rdtsc [...] ``` -### 5.2 测试不可预测性 +#### 5.2 测试不可预测性 我们总是建议在使用个人定制的 pandom 实现来用于加密目地之前,先进行一些测试。 - make check +``` +make check +``` -### 5.3 安装定制的 pandom +#### 5.3 安装定制的 pandom 假如你对测试的结果很满意,你就可以使用下面的命令来安装你的 pandom 实现。 - make install +``` +make install +``` 更多额外信息及更新详见 [http://ncomputers.org/pandom][63] @@ -408,7 +414,7 @@ via: https://www.howtoforge.com/tutorial/how-to-install-pandom-a-true-random-num 作者:[Oliver][a] 译者:[FSSlc](https://github.com/FSSlc) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From ff787f55c61421b1a75580325dca9b374d8fea18 Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 18 May 2017 08:53:46 +0800 Subject: [PATCH 0099/1407] translating --- ...Like About Error Handling in Go and How to Work Around It.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170123 What I Dont Like About Error Handling in Go and How to Work Around It.md b/sources/tech/20170123 What I Dont Like About Error Handling in Go and How to Work Around It.md index 2ed55758a2..1c2a7e01f4 100644 --- a/sources/tech/20170123 What I Dont Like About Error Handling in Go and How to Work Around It.md +++ b/sources/tech/20170123 What I Dont Like About Error Handling in Go and How to Work Around It.md @@ -1,3 +1,5 @@ +translating---geekpi + What I Don’t Like About Error Handling in Go, and How to Work Around It ====================== From 94443e604e18cad7d47ba5534d4e0a5d272751d8 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 18 May 2017 10:30:32 +0800 Subject: [PATCH 0100/1407] PRF:20170501 Containers running Containers.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @geekpi 这篇比较难以翻译校对,我们已经尽力了~ --- .../20170501 Containers running Containers.md | 104 +++++++++--------- 1 file changed, 52 insertions(+), 52 deletions(-) diff --git a/translated/tech/20170501 Containers running Containers.md b/translated/tech/20170501 Containers running Containers.md index 6a2370fb0b..13c84bec31 100644 --- a/translated/tech/20170501 Containers running Containers.md +++ b/translated/tech/20170501 Containers running Containers.md @@ -1,109 +1,109 @@ -容器中运行容器 +LinuxKit:在容器中运行容器 ============================================================ -一些令人振奋的消息引发了我对今年 DockerCon 的兴趣,在会议中宣布了一个新的操作系统(OS)LinuxKit,并由无可争议的容器巨头公司 Docker 提供。 +一些令人振奋的消息引发了我对今年 DockerCon 的兴趣,在这次会议中,无可争议的容器巨头公司 Docker 发布了一个新的操作系统:LinuxKit。 -容器巨头已经宣布了一个灵活的、可扩展的操作系统,为了可移植性系统服务在其内运行。当你听到包括 Docker 运行时也在内时,你可能会感到惊讶。 +这家容器巨头宣布的是一个灵活的、可扩展的操作系统,而为了可移植性,系统服务也是运行在容器之中。甚至,令人惊讶的是,就连 Docker 运行时环境也是运行在容器内! -在本文中,我们将简要介绍一下 LinuxKit 中承诺的内容,以及如何自己尝试并不断缩小优化容器。 +在本文中,我们将简要介绍一下 LinuxKit 中所承诺的内容,以及如何自己尝试一下这个不断精简、优化的容器。 -**少即是多** +### 少即是多 -不可否认的是,用户一直在寻找一个被剥离版本的 Linux 来运行他们的微服务。通过容器化,你会尽可能地减少每个应用程序,使其成为一个位于其自身容器内的独立进程。但是,由于你对那些驻留容器主机的修补导致的问题,因此你不断地移动容器。实际上如果没有像 Kubernetes 或 Docker Swarm 这样的协调者,容器编排几乎总是会导致停机。 +不可否认的是,用户一直在寻找一个可以运行他们的微服务的精简版本的 Linux 。通过容器化,你会尽可能地最小化每个应用程序,使其成为一个适合于运行在其自身容器内的独立进程。但是,由于你需要对那些驻留容器的宿主机出现的问题进行修补,因此你不断地在宿主机间移动容器。实际上,如果没有像 Kubernetes 或 Docker Swarm 这样的编排系统,容器编排几乎总是会导致停机。 不用说,这只是让你保持操作系统尽可能小的原因之一。 -我曾多次在不同场合重复过的最喜爱的名言,来自荷兰的天才程序员 Wietse Zweitze,他为我们提供了 email 中的 Postfix 和 TCP Wrappers 等知名软件。 +我曾多次在不同场合重复过的最喜爱的名言,来自荷兰的天才程序员 Wietse Zweitze,他为我们提供了重要的 Email 软件 Postfix 和 TCP Wrappers 等知名软件。 -Postfix 网站([Postfix TLS_README][10])指出,即使你编码和 Wietse 一样小心,“每 1000 行[你]就会在 Postfix 中引入一个额外的错误”。从我的专业的 DevSecOps 角度提到我可以被原谅的 “bug” 可以不严谨地说成安全问题。 +在 [Postfix 网站][10] 指出,即使你编码和 Wietse 一样小心,“每 1000 行[你]就会在 Postfix 中引入一个额外的 bug”。从我的专业的 DevSecOps 角度看,这里提到的“bug” 可以将其大致看做安全问题。 -从安全的角度来看,正是由于这个原因,代码世界中“少即是多”。简单地说,使用较少的代码行有很多好处,即安全性、管理时间和性能。对于初学者来说,安全漏洞较少,更新软件包的时间更短,启动时间更快。 +从安全的角度来看,正是由于这个原因,代码世界中“少即是多”。简单地说,使用较少的代码行有很多好处,即安全性、管理时间和性能。对于初学者来说,这意味着安全漏洞较少,更新软件包的时间更短,启动时间更快。 -**深入观察** +### 深入观察 -考虑下从容器内部运行你的程序。 +考虑下在容器内部运行你的程序。 -一个好的起点是 Alpine Linux([https://alpinelin.org.org/downloads][1]),它是一个精简化的操作系统,通常比那些笨重的系统更受喜欢,如 Ubuntu 或 CentOS 等。Alpine 还提供了一个 miniroot 文件系统(用于容器内),最后一次检测是惊人的 1.8M。事实上,完整的 Linux 操作系统下载后有 80M。 +一个好的起点是 [Alpine Linux][1],它是一个苗条、精简的操作系统,通常比那些笨重的系统更受喜欢,如 Ubuntu 或 CentOS 等。Alpine 还提供了一个 miniroot 文件系统(用于容器内),最近我看到的大小是惊人的 1.8M。事实上,这个完整的 Linux 操作系统下载后有 80M。 -如果你决定使用 Alpine Linux 作为 Docker 基础镜像,那么你可以在Docker Hub([https://hub.docker.com/_/alpine][2])上找到一个,其中 Alpine Linux 将自己描述为:“一个基于 Alpine Linux 的最小 Docker 镜像,具有完整的包索引,大小只有5 MB!” +如果你决定使用 Alpine Linux 作为 Docker 基础镜像,那么你可以在 Docker Hub 上[找到][2]一个, 它将其描述为:“一个基于 Alpine Linux 的最小 Docker 镜像,具有完整的包索引,大小只有5 MB!” -据说无处不在的 “Window Start Button” 也是大致相同的大小!我不会尝试去验证,也不会进一步评论。 +据说无处不在的 “Window 开始菜单” 文件也是大致相同的大小!我没有验证过,也不会进一步评论。 -严肃地希望能让你了解创新的类 Unix 操作系统(如 Alpine Linux)的强大功能。 +讲真,希望你去了解一下这个创新的类 Unix 操作系统(如 Alpine Linux)的强大功能。 -**锁定一切** +### 锁定一切 -再说一点,Alpine Linux 是(并不惊人)基于 BusyBox([BusyBox][3]),一套著名的打包了 Linux 命令的集合,许多人不会意识到他们的宽带路由器、智能电视,当然还有他们家庭中的物联网设备就有它。 +再说一点,Alpine Linux 是(并不惊人)基于 [BusyBox][3],这是一套著名的打包了 Linux 命令的集合,许多人不会意识到他们的宽带路由器、智能电视,当然还有他们家庭中的物联网设备就有它。 -Alpine Linux 站点的“关于”页面([Alpine Linux][4])的评论中指出: +Alpine Linux 站点的“[关于][4]”页面的评论中指出: -“Alpine Linux 的设计考虑到安全性。内核使用非官方的 grsecurity/PaX 移植进行修补,所有用户态二进制文件都编译为具有堆栈保护的地址无关可执行文件(PIE)。 这些主动安全特性可以防止所有类别的零日和其他漏洞利用” +> “Alpine Linux 的设计考虑到安全性。内核使用 grsecurity/PaX 的非官方移植进行了修补,所有用户态二进制文件都编译为具有堆栈保护的地址无关可执行文件(PIE)。 这些主动安全特性可以防止所有类别的零日漏洞和其它漏洞利用。” -换句话说,Alpine Linux 中的二进制文件捆绑在一起,提供了那些通过行业安全工具筛选的功能,以帮助缓解缓冲区溢出攻击。 +换句话说,这些捆绑在 Alpine Linux 中的精简二进制文件提供的功能通过了那些行业级安全工具筛选,以缓解缓冲区溢出攻击所带来的危害。 -**奇怪的袜子** +### 多出一只袜子 -你可能会问,为什么当我们处理 Docker 的新操作系统时,容器的内部结构很重要? +你可能会问,为什么当我们谈及 Docker 的新操作系统时,容器的内部结构很重要? -那么,你可能已经猜到,当涉及容器时,他们的目标是精简。除非绝对必要,否则不包括任何东西。所以有信心的是,你可以在清理橱柜、花园棚子、车库和袜子抽屉后获得回报而没有惩罚。 +那么,你可能已经猜到,当涉及容器时,他们的目标是精简。除非绝对必要,否则不包括任何东西。所以你可以放心地清理橱柜、花园棚子、车库和袜子抽屉了。 -Docker 的确因为它们的先见而获得声望。据报道,2 月初,Docker 聘请了 Alpine Linux 的主要推动者 Nathaniel Copa,他帮助将默认的官方镜像库从 Ubuntu 切换到 Alpine。Docker Hub 从新近精简镜像节省的带宽受到了欢迎。 +Docker 的确因为它们的先见而获得声望。据报道,2 月初,Docker 聘请了 Alpine Linux 的主要推动者 Nathaniel Copa,他帮助将默认的官方镜像库从 Ubuntu 切换到 Alpine。Docker Hub 从新近精简镜像节省的带宽受到了赞誉。 并且最新的情况是,这项工作将与最新的基于容器的操作系统相结合:Docker 的 LinuxKit。 -要说清楚的是 LinuxKit 不会注定代替 Alpine,而是位于容器下层,并作为一个完整的操作系统,你可以高兴地启动你的运行时守护程序(在这种情况下,在容器中产生 Docker 守护程序)。 +要说清楚的是 LinuxKit 注定不会代替 Alpine,而是位于容器下层,并作为一个完整的操作系统出现,你可以高兴地启动你的运行时守护程序(在这种情况下,是生成你的容器的Docker 守护程序 )。 -**Blondie Atomic ** +### 金发女郎的 Atomic -经过精心调试的主机绝对不是一件新事物(以前提到过嵌入式 Linux 的家用设备)。在过去几十年中一直在优化 Linux 的天才在某个时候意识到底层的操作系统是快速生产含有大量容器主机的关键。 +经过精心调试的宿主机绝对不是一件新事物(以前提到过嵌入式 Linux 的家用设备)。在过去几十年中一直在优化 Linux 的天才在某个时候意识到底层的操作系统才是快速生产含有大量容器主机的关键。 -例如,强大的红帽长期以来一直在出售已经贡献给 Project Atomic ([Project Atomic][6]) 的 Red Hat Atomic([https://www.redhat.com/en/resources/red-hat-enterprise-linux-atomic-host][5])。后者继续解释: +例如,强大的红帽长期以来一直在出售已经贡献给 [Project Atomic][6] 的 [红帽 Atomic][5]。后者继续解释: -“基于 Red Hat Enterprise Linux 或 CentOS 和 Fedora 项目的成熟技术,Atomic Host 是一个轻量级的、不可变的平台,其设计目的仅在于运行容器化应用程序。 +> “基于 Red Hat Enterprise Linux 或 CentOS 和 Fedora 项目的成熟技术,Atomic Host 是一个轻量级的、不可变的平台,其设计目的仅在于运行容器化应用程序。” -有一个很好理由将底层的、不可变的 Atomic OS 作为 Red Hat OpenShift PaaS(平台即服务)产品推荐。它最小化、高性能、尖端。 +将底层的、不可变的 Atomic OS 作为红帽的 OpenShift PaaS(平台即服务)产品推荐有一个很好理由:它最小化、高性能、尖端。 -**特性** +### 特性 -在 Docker 关于 LinuxKit 的公告中,少即是多的口号是显而易见的。实现 LinuxKit 愿景的项目显然是不小的事业,它由 Docker 老将和 Unikernels([https://en.wikipedia.org/wiki/Unikernel][7])的主管 Justin Cormack 指导,并与 HPE、Intel、ARM、IBM 和 Microsoft LinuxKit 合作,可以在大型机以及基于物联网的冰柜中运行。 +在 Docker 关于 LinuxKit 的公告中,“少即是多”的口号是显而易见的。实现 LinuxKit 愿景的项目显然是不小的事业,它由 Docker 老将和 [Unikernel][7] 的主管 Justin Cormack 指导,并与 HPE、Intel、ARM、IBM 和 Microsoft LinuxKit 合作,可以运行在从大型机到基于物联网的冰柜之中。 -LinuxKit 的可配置、可插拔和可扩展性质将吸引许多项目寻找建立其服务的基准。通过开源项目,Docker 明智地邀请每个男人和他们的狗投入其功能开发,随着时间的推移,它会像好的奶酪那样成熟。 +LinuxKit 的可配置性、可插拔性和可扩展性将吸引许多寻求建立其服务基准的项目。通过开源项目,Docker 明智地邀请每个人全身心地投入其功能开发,随着时间的推移,它会像好的奶酪那样成熟。 -**布丁的证明** +### 布丁作证 -有承诺称那些急于使用新系统的人不用再等待了。如果你准备着手 LinuxKit,你可以从 GitHub 中开始:[LinuxKit][11] +按照该发布消息中所承诺的,那些急于使用新系统的人不用再等待了。如果你准备着手 LinuxKit,你可以从 GitHub 中开始:[LinuxKit][11]。 在 GitHub 页面上有关于如何启动和运行一些功能的指导。 -时间允许的话我准备更加深入 LinuxKit。有争议的 Kubernetes 与 Docker Swarm 编排功能对比会是有趣的尝试。我还想看到内存占用、启动时间和磁盘空间使用率的基准测试。 +时间允许的话我准备更加深入研究 LinuxKit。对有争议的 Kubernetes 与 Docker Swarm 编排功能对比会是有趣的尝试。此外,我还想看到内存占用、启动时间和磁盘空间使用率的基准测试。 -如果承诺是真实的,则作为容器运行的可插拔系统服务是构建操作系统的迷人方式。Docker 在博客([https://blog.docker.com/2017/04/introducing-linuxkit-container-os-toolkit][12])中提到:“因为 LinuxKit 是原生容器,它有一个非常小的尺寸 - 35MB,引导时间非常小。所有系统服务都是容器,这意味着可以删除或替换所有的内容。“ +如果该承诺可靠,则作为容器运行的可插拔系统服务是构建操作系统的迷人方式。Docker 在[博客][12])中提到:“因为 LinuxKit 是原生容器,它有一个非常小的尺寸 - 35MB,引导时间非常小。所有系统服务都是容器,这意味着可以删除或替换所有的内容。” -我不知道你怎么样,但这非常符合我的胃口。 +我不知道你觉得怎么样,但这非常符合我的胃口。 -**呼叫警察** +### 呼叫警察 -除了站在我 DevSecOps 角度看到的功能,我将看到承诺的安全在现实中的面貌。 +除了我站在 DevSecOps 角度看到的功能,我会看看其对安全的承诺。 -Docker 引用来自 NIST(国家标准与技术研究所:[https://www.nist.gov] [8]),并在他们的博客上声称: +Docker 在他们的博客上引用来自 NIST([国家标准与技术研究所] [8])的话: -安全性是最高目标,这与 NIST 在其“应用程序容器安全指南”草案中说明的保持一致:“使用容器专用操作系统而不是通用操作系统来减少攻击面。当使用专用容器操作系统时,攻击面通常比通用操作系统小得多,因此攻击和危及专用容器操作系统的机会较少。” +> “安全性是最高目标,这与 NIST 在其《应用程序容器安全指南》草案中说明的保持一致:‘使用容器专用操作系统而不是通用操作系统来减少攻击面。当使用专用容器操作系统时,攻击面通常比通用操作系统小得多,因此攻击和危及专用容器操作系统的机会较少。’” -可能最重要的容器到主机和主机到容器的安全创新将是系统容器(系统服务)被完全地沙箱化到自己的非特权空间中,而只给它们需要的外部访问。 +可能最重要的容器到主机和主机到容器的安全创新是将系统容器(系统服务)完全地沙箱化到自己的非特权空间中,而只给它们需要的外部访问。 -通过内核自我保护项目(KSPP)([https://kernsec.org/wiki/index.php/Kernel_Self_Protection_Project][9])的协作来实现这一功能,我很满意 Docker 开始专注于一些非常值得的东西上。对于那些不熟悉的 KSPP 的人而言,它存在理由如下: +通过内核自我保护项目Kernel Self Protection Project([KSPP][9])的协作来实现这一功能,我很满意 Docker 开始专注于一些非常值得的东西上。对于那些不熟悉的 KSPP 的人而言,它存在理由如下: -“启动这个项目的的假设是内核 bug 的存在时间很长,内核必须设计成防止这些缺陷。” +> “启动这个项目的的假设是内核 bug 的存在时间很长,内核必须设计成可以防止这些缺陷的危害。” -KSPP 网站继续表态: +KSPP 网站进一步表态: -“这些努力非常重要并还在进行,但如果我们要保护我们的十亿 Android 手机、我们的汽车、国际空间站,还有其他运行 Linux 的产品,我们必须在上游的 Linux 内核中建立积极的防御性技术。我们需要内核安全地错误,而不只是安全地运行。” +> “这些努力非常重要并还在进行,但如果我们要保护我们的十亿 Android 手机、我们的汽车、国际空间站,还有其他运行 Linux 的产品,我们必须在上游的 Linux 内核中建立积极的防御性技术。我们需要内核安全地出错,而不只是安全地运行。” -而且,如果 Docker 最初只能在 LinuxKit 前进一小步,那么随着时间的推移,成熟度带来的好处可能会在容器领域中取得长足的进步。 +而且,如果 Docker 最初只是在 LinuxKit 前进了一小步,那么随着时间的推移,成熟度带来的好处可能会在容器领域中取得长足的进步。 -**离终点还远** +### 离终点还远 -像 Docker 这样不断发展壮大的集团无论在哪个方向上取得巨大的飞跃都将会用户和其他软件带来益处。 +像 Docker 这样不断发展壮大的巨头无论在哪个方向上取得巨大的飞跃都将会用户和其他软件带来益处。 我鼓励所有对 Linux 感兴趣的人密切关注这个领域。 @@ -111,9 +111,9 @@ KSPP 网站继续表态: via: http://www.devsecops.cc/devsecops/containers.html -作者:[Chris Binnie ][a] +作者:[Chris Binnie][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/) 荣誉推出 From 2d77d1ff5e4e18b6dfb3d0414eb19be2e663693b Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 18 May 2017 10:30:56 +0800 Subject: [PATCH 0101/1407] PUB:20170501 Containers running Containers.md @geekpi --- .../tech => published}/20170501 Containers running Containers.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170501 Containers running Containers.md (100%) diff --git a/translated/tech/20170501 Containers running Containers.md b/published/20170501 Containers running Containers.md similarity index 100% rename from translated/tech/20170501 Containers running Containers.md rename to published/20170501 Containers running Containers.md From ac8bcf9aa88834d8658c81a5f705dbe2c9a69b04 Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 18 May 2017 11:12:52 +0800 Subject: [PATCH 0102/1407] translated --- ...andling in Go and How to Work Around It.md | 356 ------------------ ...andling in Go and How to Work Around It.md | 354 +++++++++++++++++ 2 files changed, 354 insertions(+), 356 deletions(-) delete mode 100644 sources/tech/20170123 What I Dont Like About Error Handling in Go and How to Work Around It.md create mode 100644 translated/tech/20170123 What I Dont Like About Error Handling in Go and How to Work Around It.md diff --git a/sources/tech/20170123 What I Dont Like About Error Handling in Go and How to Work Around It.md b/sources/tech/20170123 What I Dont Like About Error Handling in Go and How to Work Around It.md deleted file mode 100644 index 1c2a7e01f4..0000000000 --- a/sources/tech/20170123 What I Dont Like About Error Handling in Go and How to Work Around It.md +++ /dev/null @@ -1,356 +0,0 @@ -translating---geekpi - -What I Don’t Like About Error Handling in Go, and How to Work Around It -====================== - -More often than not, people who write Go have some sort of opinion on its error handling model. Depending on your experience with other languages, you may be used to different approaches. That’s why I’ve decided to write this article, as despite being relatively opinionated, I think drawing on my experiences can be useful in the debate. The main issues I wanted to cover are that it is difficult to force good error handling practice, that errors don’t have stack traces, and that error handling itself is too verbose. However I’ve looked at some potential workarounds for these problems which could help negate the issues somewhat. - -### Quick Comparison to Other Languages - - -[In Go, all errors are values][1]. Because of this, a fair amount of functions end up returning an `error`, looking something like this: - -``` -func (s *SomeStruct) Function() (string, error) -``` - -As a result of this, the calling code will regularly have `if` statements to check for them: - -``` -bytes, err := someStruct.Function() -if err != nil { - // Process error -} -``` - -Another approach is the `try-catch` model that is used in other languages such as Java, C#, Javascript, Objective C, Python etc. You could see the following Java code as synonymous to the previous Go examples, declaring `throws` instead of returning an `error`: - -``` -public String function() throws Exception -``` - -And then doing `try-catch` instead of `if err != nil`: - -``` -try { - String result = someObject.function() - // continue logic -} -catch (Exception e) { - // process exception -} -``` - -Of course, there are more differences than this. For example, an `error` can’t crash your program, whereas an `Exception` can. There are others as well, and I want to focus on them in this article. - -### Implementing Centralised Error Handling - -Taking a step back, let’s look at why and how we might want to have a centralised place for handling errors. - -An example most people would be familiar with is a web service – if some unexpected server-side error were to happen, we would generate a 5xx error. At a first pass in Go you might implement this: - -``` -func init() { - http.HandleFunc("/users", viewUsers) - http.HandleFunc("/companies", viewCompanies) -} - -func viewUsers(w http.ResponseWriter, r *http.Request) { - user // some code - if err := userTemplate.Execute(w, user); err != nil { - http.Error(w, err.Error(), 500) - } -} - -func viewCompanies(w http.ResponseWriter, r *http.Request) { - companies = // some code - if err := companiesTemplate.Execute(w, companies); err != nil { - http.Error(w, err.Error(), 500) - } -} -``` - -This isn’t a good solution, as we would have to repeat the same error handling across all of our handler functions. It would be much better to do it all in one place for maintainability purposes. Fortunately, there is [an alternative by Andrew Gerrand on the Go blog][2] which works quite nicely. We can create a Type which does http error handling: - -``` -type appHandler func(http.ResponseWriter, *http.Request) error - -func (fn appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { - if err := fn(w, r); err != nil { - http.Error(w, err.Error(), 500) - } -} -``` - -And then it can be used as a wrapper to decorate our handlers: - -``` -func init() { - http.Handle("/users", appHandler(viewUsers)) - http.Handle("/companies", appHandler(viewCompanies)) -} -``` - -Then all we need to do is change the signature of handler functions so they return `errors`. This works nicely, as we have been able to apply the [dry][3] principle and not re-use code unnecessarily – now we return default errors in a single place. - -### Error Context - -In the previous example, there are many potential errors which we could receive, all of which could be generated in many parts of the call stack. This is when things start to get tricky. - -To demonstrate this, we can expand on our handler. It’s more likely to look like this as the template execution is not the only place where an error could occur: - -``` -func viewUsers(w http.ResponseWriter, r *http.Request) error { - user, err := findUser(r.formValue("id")) - if err != nil { - return err; - } - return userTemplate.Execute(w, user); -} -``` - -The call chain could get quite deep, and throughout it, all sorts of errors could be instantiated in different places. This post by [Russ Cox][4] explains the best practice to prevent this from being too much of a problem: - -> Part of the intended contract for error reporting in Go is that functions include relevant available context, including the operation being attempted (such as the function name and its arguments) - -The example given is a call to the OS package: - -``` -err := os.Remove("/tmp/nonexist") -fmt.Println(err) -``` - -Which prints the output: - -``` -remove /tmp/nonexist: no such file or directory -``` - -To summarise, you are outputting the method called, the arguments given, and the specific thing that went wrong, immediately after doing it. When creating an `Exception` message in another language you would also follow this practice. So if we stuck to these rules in our `viewUsers` handler, it could almost always be clear what the cause of an error is. - -The problem comes from people not following this best practice, and quite often in third party Go libraries you will see messages like: - -``` -Oh no I broke -``` - -Which is just not helpful – you don’t know anything about the context which makes it really hard to debug. Even worse is when these sorts of errors are ignored or returned really far back up the stack until they are handled: - -``` -if err != nil { - return err -} -``` - -This means that when they happened isn’t communicated. - -It should be noted that all these mistakes can be made in an `Exception` driven model – poor error messages, swallowing exceptions etc. So why do I think that model is more helpful? - -If we’re dealing with a poor exception message, _we are still able to know where it occurred in the call stack_. This is because of stack traces, which raises something I don’t get about Go – you have the concept of `panic` in Go which contains a stack trace, but an `error` which does not. I think the reasoning is that a `panic` can crash your program, so requires a stack trace, whereas a handled error does not as you are supposed to do something about it where it occurs. - -So let’s go back to our previous example – a third party library with a poor error message, which just gets propagated all the way up the call chain. Do you think debugging would be easier if you had this? - -``` -panic: Oh no I broke -[signal 0xb code=0x1 addr=0x0 pc=0xfc90f] - -goroutine 1103 [running]: -panic(0x4bed00, 0xc82000c0b0) -/usr/local/go/src/runtime/panic.go:481 +0x3e6 -github.com/Org/app/core.(_app).captureRequest(0xc820163340, 0x0, 0x55bd50, 0x0, 0x0) -/home/ubuntu/.go_workspace/src/github.com/Org/App/core/main.go:313 +0x12cf -github.com/Org/app/core.(_app).processRequest(0xc820163340, 0xc82064e1c0, 0xc82002aab8, 0x1) -/home/ubuntu/.go_workspace/src/github.com/Org/App/core/main.go:203 +0xb6 -github.com/Org/app/core.NewProxy.func2(0xc82064e1c0, 0xc820bb2000, 0xc820bb2000, 0x1) -/home/ubuntu/.go_workspace/src/github.com/Org/App/core/proxy.go:51 +0x2a -github.com/Org/app/core/vendor/github.com/rusenask/goproxy.FuncReqHandler.Handle(0xc820da36e0, 0xc82064e1c0, 0xc820bb2000, 0xc5001, 0xc820b4a0a0) -/home/ubuntu/.go_workspace/src/github.com/Org/app/core/vendor/github.com/rusenask/goproxy/actions.go:19 +0x30 -``` - -I think this might be something which has been overlooked in the design of Go – not that things aren’t overlooked in all languages. - -If we use Java as an arbitrary example, one of the silliest mistakes people make is not logging the stack trace: - -``` -LOGGER.error(ex.getMessage()) // Doesn't log stack trace -LOGGER.error(ex.getMessage(), ex) // Does log stack trace -``` - -But Go seems to not have this information by design. - -In terms of getting context information – Russ also mentions the community are talking about some potential interfaces for stripping out error contexts. It would be interesting to hear more about this. - -### Solution to the Stack Trace Problem - -Fortunately, after doing some searching, I found this excellent [Go Errors][5] library which helps solves the problem, by adding stack traces to errors: - -``` -if errors.Is(err, crashy.Crashed) { - fmt.Println(err.(*errors.Error).ErrorStack()) -} -``` - -However, I’d think it would be an improvement for this feature to have first class citizenship in the language, so you wouldn’t have to fiddle around with types. Also, if we are working with a third party library like in the previous example then it is probably not using `crashy` – we still have the same problem. - -### What Should We Do with an Error? - -We also have to think about what should happen when an error occurs. [It’s definitely useful that they can’t crash your program][6], and it’s also idiomatic to handle them immediately: - -``` -err := method() -if err != nil { - // some logic that I must do now in the event of an error! -} -``` - -But what happens if we want to call lots of methods which return errors, and then handle them all in the same place? Something like this: - -``` -err := doSomething() -if err != nil { - // handle the error here -} - -func doSomething() error { - err := someMethod() - if err != nil { - return err - } - err = someOther() - if err != nil { - return err - } - someOtherMethod() -} -``` - -It feels a little verbose, whereas in other languages you can treat multiple statements that fail as a block: - -``` -try { - someMethod() - someOther() - someOtherMethod() -} -catch (Exception e) { - // process exception -} -``` - -Or just propagate failure in the method signature: - -``` -public void doSomething() throws SomeErrorToPropogate { - someMethod() - someOther() - someOtherMethod() -} -``` - -Personally I think both of these example achieve the same thing, only the `Exception` model is less verbose and more flexible. If anything, I find the `if err != nil` to feel like boilerplate. Maybe there is a way that it could be cleaned up? - -### Treating Multiple Statements That Fail as a Block - -To begin with, I did some more reading and found a relatively pragmatic solution on the [by Rob Pike on the Go Blog.][7] - -He defines a struct with a method which wraps errors: - -``` -type errWriter struct { - w io.Writer - err error -} - -func (ew *errWriter) write(buf []byte) { - if ew.err != nil { - return - } - _, ew.err = ew.w.Write(buf) -} -``` - -This let’s us do: - -``` -ew := &errWriter{w: fd} -ew.write(p0[a:b]) -ew.write(p1[c:d]) -ew.write(p2[e:f]) -// and so on -if ew.err != nil { - return ew.err -} -``` - -This is also a good solution, but I still feel like something is missing – as we can’t re-use this pattern. If we wanted a method which took a string as an argument, then we’d have to change the function signature. Or what if we didn’t want to perform a write? We could try and make it more generic: - -``` -type errWrapper struct { - err error -} -``` - -``` -func (ew *errWrapper) do(f func() error) { - if ew.err != nil { - return - } - ew.err = f(); -} -``` - -But we have the same problem that it won’t compile if we want to call functions which have different arguments. However you simply wrap those function calls: - -``` -w := &errWrapper{} - -w.do(func() error { - return someFunction(1, 2); -}) - -w.do(func() error { - return otherFunction("foo"); -}) - -err := w.err - -if err != nil { -// process error here -} -``` - -This works, but doesn’t help too much as it ends up being more verbose than the standard `if err != nil`checks. I would be interested to hear if anyone can offer any other solutions. Maybe the language itself needs some sort of way to propagate or group errors in a less bloated fashion – but it feels like it’s been specifically designed to not do that. - -### Conclusion - -After reading this, you might think that by picking on `errors` I’m opposed to Go. But that’s not the case, I’m just describing how it compares to my experience with the `try catch` model. It’s a great language for systems programming, and some outstanding tools have been produced by it. To name a few there is [Kubernetes][8], [Docker][9], [Terraform][10], [Hoverfly][11] and others. There’s also the advantage of your tiny, highly performant, native binary. But `errors` have been difficult to adjust to. I hope my reasoning makes sense, and also that some of the solutions and workarounds could be of help. - --------------------------------------------------------------------------------- - -作者简介: - -Andrew is a Consultant for OpenCredo having Joined the company in 2015. Andrew has several years experience working in the across a number of industries, developing web-based enterprise applications. - --------------------------------------------------------------------------------- - - -via: https://opencredo.com/why-i-dont-like-error-handling-in-go - -作者:[Andrew Morgan][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opencredo.com/author/andrew/ -[1]:https://blog.golang.org/errors-are-values -[2]:https://blog.golang.org/error-handling-and-go -[3]:https://en.wikipedia.org/wiki/Don't_repeat_yourself -[4]:https://research.swtch.com/go2017 -[5]:https://github.com/go-errors/errors -[6]:https://davidnix.io/post/error-handling-in-go/ -[7]:https://blog.golang.org/errors-are-values -[8]:https://kubernetes.io/ -[9]:https://www.docker.com/ -[10]:https://www.terraform.io/ -[11]:http://hoverfly.io/en/latest/ diff --git a/translated/tech/20170123 What I Dont Like About Error Handling in Go and How to Work Around It.md b/translated/tech/20170123 What I Dont Like About Error Handling in Go and How to Work Around It.md new file mode 100644 index 0000000000..d7b7627e49 --- /dev/null +++ b/translated/tech/20170123 What I Dont Like About Error Handling in Go and How to Work Around It.md @@ -0,0 +1,354 @@ +我对 Go 的错误处理有哪些不满,以及我是如何处理的 +====================== + +写 Go 的人往往对它的错误处理模式有一定的看法。根据你对其他语言的经验,你可能习惯于不同的方法。这就是为什么我决定要写这篇文章,尽管有点固执己见,但我认为吸收我的经验在辩论中是有用的。 我想要解决的主要问题是,很难去强制良好的错误处理实践,错误没有堆栈追踪,并且错误处理本身太冗长。不过,我已经看到了一些潜在的解决方案或许能帮助解决一些问题。 + +### 与其他语言的快速比较 + + +[在 Go 中,所有的错误是值][1]。因为这点,相当多的函数最后会返回一个 `error`, 看起来像这样: + +``` +func (s *SomeStruct) Function() (string, error) +``` + +由于这点,调用代码常规上会使用 `if` 语句来检查它们: + +``` +bytes, err := someStruct.Function() +if err != nil { + // Process error +} +``` + +另外一种是在其他语言中如 Java、C#、Javascript、Objective C、Python 等使用的 `try-catch` 模式。如下你可以看到与先前的 Go 示例类似的 Java 代码,声明 `throws` 而不是返回 `error`: + +``` +public String function() throws Exception +``` + + `try-catch` 而不是 `if err != nil`: + +``` +try { + String result = someObject.function() + // continue logic +} +catch (Exception e) { + // process exception +} +``` + +当然,还有其他的不同。不如,`error` 不会使你的程序崩溃,然而 `Exception` 会。还有其他的一些,我希望在在本篇中专注在这些上。 + +### 实现集中式错误处理 + +退一步,让我们看看为什么以及如何在一个集中的地方处理错误。 + +大多数人或许会熟悉的一个例子是 web 服务 - 如果出现了一些未预料的的服务端错误,我们会生成一个 5xx 错误。在 Go 中,你或许会这么实现: + +``` +func init() { + http.HandleFunc("/users", viewUsers) + http.HandleFunc("/companies", viewCompanies) +} + +func viewUsers(w http.ResponseWriter, r *http.Request) { + user // some code + if err := userTemplate.Execute(w, user); err != nil { + http.Error(w, err.Error(), 500) + } +} + +func viewCompanies(w http.ResponseWriter, r *http.Request) { + companies = // some code + if err := companiesTemplate.Execute(w, companies); err != nil { + http.Error(w, err.Error(), 500) + } +} +``` + +这并不是一个好的解决方案,因为我们不得不重复在所有的处理函数中处理错误。为了能更好地维护,最好能在一处地方处理错误。幸运的是,[在 Go 的博客中,Andrew Gerrand 提供了一个替代方法][2]可以完美地实现。我们可以错见一个处理错误的类型: + +``` +type appHandler func(http.ResponseWriter, *http.Request) error + +func (fn appHandler) ServeHTTP(w http.ResponseWriter, r *http.Request) { + if err := fn(w, r); err != nil { + http.Error(w, err.Error(), 500) + } +} +``` + +这可以作为一个封装器来修饰我们的处理函数: + +``` +func init() { + http.Handle("/users", appHandler(viewUsers)) + http.Handle("/companies", appHandler(viewCompanies)) +} +``` + +接着我们需要做的是修改处理函数的签名来使它们返回 `errors`。这个方法很好,因为我们做到了 [dry][3] 原则,并且没有重复使用不必要的代码 - 现在我们可以在一处返回默认错误了。 + +### 错误上下文 + +在先前的例子中,我们可能会收到许多潜在的错误,它们的任何一个都可能在调用堆栈的许多部分生成。这时候事情就变得棘手了。 + +为了演示这点,我们可以扩展我们的处理函数。它可能看上去像这样,因为模板执行并不是唯一一处会发生错误的地方: + +``` +func viewUsers(w http.ResponseWriter, r *http.Request) error { + user, err := findUser(r.formValue("id")) + if err != nil { + return err; + } + return userTemplate.Execute(w, user); +} +``` + +调用链可能会相当深,在整个过程中,各种错误可能在不同的地方实例化。[Russ Cox][4]的这篇文章解释了如何避免遇到太多这类问题的最佳实践: + + 在 Go 中错误报告的部分约定是函数包含相关的上下文、包含正在尝试的操作(比如函数名和它的参数) + +给出的例子是 OS 包中的一个调用: + +``` +err := os.Remove("/tmp/nonexist") +fmt.Println(err) +``` + +它会输出: + +``` +remove /tmp/nonexist: no such file or directory +``` + +总结一下,执行后,输出的是被调用的函数、给定的参数、特定的出错信息。当在其他语言中创建一个 `Exception` 消息时,你也可以遵循这个实践。如果我们在 `viewUsers` 处理中坚持这点,那么几乎总是能明确错误的原因。 + +问题来自于那些不遵循这个最佳实践的人,并且你经常会在第三方的 Go 库中看到这些消息: + +``` +Oh no I broke +``` + +这没什么帮助 - 你无法了解上下文,这使得调试很困难。更糟糕的是,当这些错误被忽略或返回时,这些错误会被备份到堆栈中,直到它们被处理为止: + +``` +if err != nil { + return err +} +``` + +这意味着错误发生时它们没有交流。 + +应该注意的是,所有这些错误都可以在 `Exception` 驱动的模型中发生 - 糟糕的错误信息、隐藏异常等。那么为什么我认为该模型更有用? + +如果我们在处理一个糟糕的异常消息,_我们仍然能够了解堆栈中发生了什么_。因为堆栈跟踪,这引发了一些我对 Go 不了解的部分 - 你知道 Go 的 `panic` 包含了堆栈追踪,但是 `error` 没有。我认为推论是 `panic` 可能会使你的程序崩溃,因此需要一个堆栈追踪,而处理错误并不会,因为它会假定你在它发生的地方做一些事。 + +所以让我们回到之前的例子 - 一个有糟糕错误信息的第三方库,它只是输出了调用链。你认为调试会更容易吗? + +``` +panic: Oh no I broke +[signal 0xb code=0x1 addr=0x0 pc=0xfc90f] + +goroutine 1103 [running]: +panic(0x4bed00, 0xc82000c0b0) +/usr/local/go/src/runtime/panic.go:481 +0x3e6 +github.com/Org/app/core.(_app).captureRequest(0xc820163340, 0x0, 0x55bd50, 0x0, 0x0) +/home/ubuntu/.go_workspace/src/github.com/Org/App/core/main.go:313 +0x12cf +github.com/Org/app/core.(_app).processRequest(0xc820163340, 0xc82064e1c0, 0xc82002aab8, 0x1) +/home/ubuntu/.go_workspace/src/github.com/Org/App/core/main.go:203 +0xb6 +github.com/Org/app/core.NewProxy.func2(0xc82064e1c0, 0xc820bb2000, 0xc820bb2000, 0x1) +/home/ubuntu/.go_workspace/src/github.com/Org/App/core/proxy.go:51 +0x2a +github.com/Org/app/core/vendor/github.com/rusenask/goproxy.FuncReqHandler.Handle(0xc820da36e0, 0xc82064e1c0, 0xc820bb2000, 0xc5001, 0xc820b4a0a0) +/home/ubuntu/.go_workspace/src/github.com/Org/app/core/vendor/github.com/rusenask/goproxy/actions.go:19 +0x30 +``` + +我认为这可能是 Go 的设计中被忽略的东西 - 不是所有语言都不会忽视的。 + +如果我们使用 Java 作为一个随意的例子,其中人们犯的一个最愚蠢的错误是不记录堆栈追踪: + +``` +LOGGER.error(ex.getMessage()) // Doesn't log stack trace +LOGGER.error(ex.getMessage(), ex) // Does log stack trace +``` + +但是 Go 设计中似乎没有这个信息 + +在获取上下文信息方面 - Russ 还提到了社区正在讨论一些潜在的接口用于剥离上下文错误。了解更多这点或许会很有趣。 + +### 堆栈追踪问题解决方案 + +幸运的是,在做了一些查找后,我发现了这个出色的[ Go 错误][5]库来帮助解决这个问题,来给错误添加堆栈跟踪: + +``` +if errors.Is(err, crashy.Crashed) { + fmt.Println(err.(*errors.Error).ErrorStack()) +} +``` + +不过,我认为这个功能能成为语言的一等公民将是一个改进,这样你就不必对类型做一些修改了。此外,如果我们像先前的例子那样使用第三方库,那就可能不必使用 `crashy` - 我们仍有相同的问题。 + +### 我们对错误应该做什么? + +我们还必须考虑发生错误时应该发生什么。[这一定有用,它们不会让你的程序崩溃][6],通常也会立即处理它们: + +``` +err := method() +if err != nil { + // some logic that I must do now in the event of an error! +} +``` + +如果我们想要调用大量会返回错误的方法时会发生什么,在同一个地方处理它们么?看上去像这样: + +``` +err := doSomething() +if err != nil { + // handle the error here +} + +func doSomething() error { + err := someMethod() + if err != nil { + return err + } + err = someOther() + if err != nil { + return err + } + someOtherMethod() +} +``` + +这感觉有点冗余,然而在其他语言中你可以将多条语句作为一个整体处理。 + +``` +try { + someMethod() + someOther() + someOtherMethod() +} +catch (Exception e) { + // process exception +} +``` + +或者只要在方法签名中传递错误: + +``` +public void doSomething() throws SomeErrorToPropogate { + someMethod() + someOther() + someOtherMethod() +} +``` + +我个人认为这两个例子实现了一件事情,只有 `Exception` 模式更少冗余更加弹性。如果有什么,我发现 `if err!= nil` 感觉像样板。也许有一种方法可以清理? + +### 将多条语句像一个整体那样发生错误 + +首先,我做了更多的阅读,并[在 Rob Pike 写的 Go 博客中][7]发现了一个比较务实的解决方案。 + +他定义了一个封装了错误的方法的结构体: + +``` +type errWriter struct { + w io.Writer + err error +} + +func (ew *errWriter) write(buf []byte) { + if ew.err != nil { + return + } + _, ew.err = ew.w.Write(buf) +} +``` + +让我们这么做: + +``` +ew := &errWriter{w: fd} +ew.write(p0[a:b]) +ew.write(p1[c:d]) +ew.write(p2[e:f]) +// and so on +if ew.err != nil { + return ew.err +} +``` + +这也是一个很好的方案,但是我感觉缺少了点什么 - 因为我们不能重复使用这个模式。如果我们想要一个含有字符串参数的方法,我们就不得不改变函数签名。或者如果我们不想执行写会怎样?我们可以尝试使它更通用: + +``` +type errWrapper struct { + err error +} +``` + +``` +func (ew *errWrapper) do(f func() error) { + if ew.err != nil { + return + } + ew.err = f(); +} +``` + +但是我们有一个相同的问题,如果我们想要调用含有不同参数的函数,它就无法编译了。然而你可以简单地封装这些函数调用: + +``` +w := &errWrapper{} + +w.do(func() error { + return someFunction(1, 2); +}) + +w.do(func() error { + return otherFunction("foo"); +}) + +err := w.err + +if err != nil { +// process error here +} +``` + +这可以用,但是并没有帮助太大,因为它最后比标准的 `if err != nil` 检查带来了更多的冗余。我有兴趣听到有人能提供其他解决方案。或许语言本身需要一些方法来以不那么臃肿的方式的传递或者组合错误 - 但是感觉似乎是特意设计成不那么做。 + +### 总结 + +看完这些之后,你可能会认为我反对在 Go 中使用 `error`。但事实并非如此,我只是描述了如何将它与 `try catch` 模型的经验进行比较。它是一个用于系统编程很好的语言,并且已经出现了一些优秀的工具。仅举几例有 [Kubernetes][8]、[Docker][9]、[Terraform][10]、[Hoverfly][11] 等。还有小型、高性能、本地二进制的优点。但是,`error` 难以适应。 我希望我的推论是有道理的,而且一些方案和解决方法可能会有帮助。 + +-------------------------------------------------------------------------------- + +作者简介: + +Andrew 是 OpenCredo 的顾问,于 2015 年加入公司。Andrew 在多个行业工作多年,开发基于 Web 的企业应用程序。 + +-------------------------------------------------------------------------------- + + +via: https://opencredo.com/why-i-dont-like-error-handling-in-go + +作者:[Andrew Morgan][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opencredo.com/author/andrew/ +[1]:https://blog.golang.org/errors-are-values +[2]:https://blog.golang.org/error-handling-and-go +[3]:https://en.wikipedia.org/wiki/Don't_repeat_yourself +[4]:https://research.swtch.com/go2017 +[5]:https://github.com/go-errors/errors +[6]:https://davidnix.io/post/error-handling-in-go/ +[7]:https://blog.golang.org/errors-are-values +[8]:https://kubernetes.io/ +[9]:https://www.docker.com/ +[10]:https://www.terraform.io/ +[11]:http://hoverfly.io/en/latest/ From 57f9f16c0934dfe90ee7774bea50b4c6267386d1 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 18 May 2017 12:03:12 +0800 Subject: [PATCH 0103/1407] PRF&PUB:20170203 Record and Replay Terminal Session with Asciinema on Linux.md @ucasFL https://linux.cn/article-8519-1.html --- ...erminal Session with Asciinema on Linux.md | 107 +++++++++--------- 1 file changed, 56 insertions(+), 51 deletions(-) rename {translated/tech => published}/20170203 Record and Replay Terminal Session with Asciinema on Linux.md (76%) diff --git a/translated/tech/20170203 Record and Replay Terminal Session with Asciinema on Linux.md b/published/20170203 Record and Replay Terminal Session with Asciinema on Linux.md similarity index 76% rename from translated/tech/20170203 Record and Replay Terminal Session with Asciinema on Linux.md rename to published/20170203 Record and Replay Terminal Session with Asciinema on Linux.md index 9713441cd7..2cc6389838 100644 --- a/translated/tech/20170203 Record and Replay Terminal Session with Asciinema on Linux.md +++ b/published/20170203 Record and Replay Terminal Session with Asciinema on Linux.md @@ -1,71 +1,47 @@ -### 如何在 Linux 终端会话中使用 Asciinema 进行录制和回放 +如何在 Linux 中使用 Asciinema 进行录制和回放终端会话 +=========== ![](https://linuxconfig.org/images/asciimena-video-example.jpg?58942057) -内容 - -* * [1、简介][11] - * [2、困难][12] - * [3、惯例][13] - * [4、标准库安装][14] - * [4.1、在 Arch Linux 上安装][1] - * [4.2、在 Debian 上安装][2] - * [4.3、在 Ubuntu 上安装][3] - * [4.4、在 Fedora 上安装][4] - * [5、从源代码安装][15] - * [6、前提条件][16] - * [6.1、在 Arch Linux 上安装 ruby][5] - * [6.2、在 Debian 上安装 ruby][6] - * [6.3、在 Ubuntu 安装 ruby][7] - * [6.4、在 Fedora 安装 ruby][8] - * [6.5、在 CentOS 安装 ruby][9] - * [7、 安装 Linuxbrew][17] - * [8、 安装 Asciinema][18] - * [9、录制终端会话][19] - * [10、回放已录制终端会话][20] - * [11、将视频嵌入 HTML][21] - * [12、结论][22] - * [13、 故障排除][23] - * [13.1、在 UTF-8 环境下运行 asciinema][10] ### 简介 -Asciinema 是一个轻量并且非常高效的脚本终端会话录制器的替代品。使用它可以录制、回放和分享 JSON 格式的终端会话记录。和一些桌面录制器,比如 Recordmydesktop、Simplescreenrecorder、Vokoscreen 或 Kazam 相比,Asciinema 最主要的优点是,它能够以通过 ANSI 转义码编码的 ASCII 文本录制所有的标准终端输入、输出和错误。 +Asciinema 是一个轻量并且非常高效的终端会话录制器。使用它可以录制、回放和分享 JSON 格式的终端会话记录。与一些桌面录制器,比如 Recordmydesktop、Simplescreenrecorder、Vokoscreen 或 Kazam 相比,Asciinema 最主要的优点是,它能够以通过 ASCII 文本以及 ANSI 转义码编码来录制所有的标准终端输入、输出和错误信息。 事实上,即使是很长的终端会话,录制出的 JSON 格式文件也非常小。另外,JSON 格式使得用户可以利用简单的文件转化器,将输出的 JSON 格式文件嵌入到 HTML 代码中,然后分享到公共网站或者使用 asciinema 账户分享到 Asciinema.org 。最后,如果你的终端会话中有一些错误,并且你还懂一些 ASCI 转义码语法,那么你可以使用任何编辑器来修改你的已录制终端会话。 -### 困难 +**难易程度:** 很简单! -### 惯例 +**标准终端:** * **#** - 给定命令需要以 root 用户权限运行或者使用 `sudo` 命令 * **$** - 给定命令以常规权限用户运行 -### 标准库安装 +### 从软件库安装 -很有可能, asciinema 可以使用你的版本库进行安装。但是,如果不可以使用系统版本库进行安装或者你想安装最新的版本,那么,你可以像下面的“从源代码安装”部分所描述的那样,使用 Linuxbrew 包管理器来执行 Asciinema 安装。 +通常, asciinema 可以使用你的发行版的软件库进行安装。但是,如果不可以使用系统的软件库进行安装或者你想安装最新的版本,那么,你可以像下面的“从源代码安装”部分所描述的那样,使用 Linuxbrew 包管理器来执行 Asciinema 安装。 -### 在 Arch Linux 上安装 +**在 Arch Linux 上安装:** ``` # pacman -S asciinema ``` -### 在 Debian 上安装 +**在 Debian 上安装:** ``` # apt install asciinema ``` -### 在 Ubuntu 上安装 +**在 Ubuntu 上安装:** ``` $ sudo apt install asciinema ``` -### 在 Fedora 上安装 +**在 Fedora 上安装:** ``` $ sudo dnf install asciinema @@ -75,7 +51,7 @@ $ sudo dnf install asciinema 最简单并且值得推荐的方式是使用 Linuxbrew 包管理器,从源代码安装最新版本的 Asciinema 。 -### 前提条件 +#### 前提条件 下面列出的前提条件是安装 Linuxbrew 和 Asciinema 需要满足的依赖关系: @@ -86,61 +62,69 @@ $ sudo dnf install asciinema 在安装 Linuxbrew 之前,请确保上面的这些包都已经安装在了你的 Linux 系统中。 -### 在 Arch Linux 上安装 ruby +**在 Arch Linux 上安装 ruby:** ``` # pacman -S git gcc make ruby ``` -### 在 Debian 上安装 ruby +**在 Debian 上安装 ruby:** ``` # apt install git gcc make ruby ``` -### 在 Ubuntu 上安装 ruby +**在 Ubuntu 上安装 ruby:** ``` $ sudo apt install git gcc make ruby ``` -### 在 Fedora 上安装 ruby +**在 Fedora 上安装 ruby:** ``` $ sudo dnf install git gcc make ruby ``` -### 在 CentOS 上安装 ruby +**在 CentOS 上安装 ruby:** ``` # yum install git gcc make ruby ``` -### 安装 Linuxbrew +#### 安装 Linuxbrew Linuxbrew 包管理器是苹果的 MacOS 操作系统很受欢迎的 Homebrew 包管理器的一个复刻版本。还没发布多久,Homebrew 就以容易使用而著称。如果你想使用 Linuxbrew 来安装 Asciinema,那么,请运行下面命令在你的 Linux 版本上安装 Linuxbrew: + ``` $ ruby -e "$(curl -fsSL https://raw.githubusercontent.com/Linuxbrew/install/master/install)" ``` + 现在,Linuxbrew 已经安装到了目录 `$HOME/.linuxbrew/` 下。剩下需要做的就是使它成为可执行 `PATH` 环境变量的一部分。 + ``` $ echo 'export PATH="$HOME/.linuxbrew/bin:$PATH"' >>~/.bash_profile $ . ~/.bash_profile ``` + 为了确认 Linuxbrew 是否已经安装好,你可以使用 `brew` 命令来查看它的版本: + ``` $ brew --version Homebrew 1.1.7 Homebrew/homebrew-core (git revision 5229; last commit 2017-02-02) ``` -### 安装 Asciinema +#### 安装 Asciinema 安装好 Linuxbrew 以后,安装 Asciinema 就变得无比容易了: + ``` $ brew install asciinema ``` + 检查 Asciinema 是否安装正确: + ``` $ asciinema --version asciinema 1.3.0 @@ -151,10 +135,13 @@ asciinema 1.3.0 经过一番辛苦的安装工作以后,是时候来干一些有趣的事情了。Asciinema 是一个非常容易使用的软件。事实上,目前的 1.3 版本只有很少的几个可用命令行选项,其中一个是 `--help` 。 我们首先使用 `rec` 选项来录制终端会话。下面的命令将会开始录制终端会话,之后,你将会有一个选项来丢弃已录制记录或者把它上传到 asciinema.org 网站以便将来参考。 + ``` $ asciinema rec ``` + 运行上面的命令以后,你会注意到, Asciinema 已经开始录制终端会话了,你可以按下 `CTRL+D` 快捷键或执行 `exit` 命令来停止录制。如果你使用的是 Debian/Ubuntu/Mint Linux 系统,你可以像下面这样尝试进行第一次 asciinema 录制: + ``` $ su Password: @@ -162,7 +149,9 @@ Password: # exit $ sl ``` + 一旦输入最后一个 `exit` 命令以后,将会询问你: + ``` $ exit ~ Asciicast recording finished. @@ -170,11 +159,15 @@ $ exit https://asciinema.org/a/7lw94ys68gsgr1yzdtzwijxm4 ``` + 如果你不想上传你的私密命令行技巧到 asciinema.org 网站,那么有一个选项可以把 Asciinema 记录以 JSON 格式保存为本地文件。比如,下面的 asciinema 记录将被存为 `/tmp/my_rec.json`: + ``` $ asciinema rec /tmp/my_rec.json ``` -另一个非常有用的 asciinema 特性是时间微调。如果你的键盘输入速度很慢,或者你在进行多任务,输入命令和执行命令之间的时间可以延长。Asciinema 会记录你的实时按键时间,这意味着每一个停顿都将反映在最终视频的长度上。可以使用 `-w` 选项来缩短按键的时间间隔。比如,下面的命令将按键的时间间隔缩短为 0.2 秒: + +另一个非常有用的 asciinema 特性是时间微调。如果你的键盘输入速度很慢,或者你在进行多任务,输入命令和执行命令之间的时间会比较长。Asciinema 会记录你的实时按键时间,这意味着每一个停顿都将反映在最终视频的长度上。可以使用 `-w` 选项来缩短按键的时间间隔。比如,下面的命令将按键的时间间隔缩短为 0.2 秒: + ``` $ asciinema rec -w 0.2 ``` @@ -182,15 +175,19 @@ $ asciinema rec -w 0.2 ### 回放已录制终端会话 有两种方式可以来回放已录制会话。第一种方式是直接从 asciinema.org 网站上播放终端会话。这意味着,你之前已经把录制会话上传到了 asciinema.org 网站,并且需要提供有效链接: + ``` $ asciinema play https://asciinema.org/a/7lw94ys68gsgr1yzdtzwijxm4 ``` -Alternatively, use your locally stored JSON file: + 另外,你也可以使用本地存储的 JSON 文件: + ``` $ asciinema play /tmp/my_rec.json ``` + 如果要使用 `wget` 命令来下载之前的上传记录,只需在链接的后面加上 `.json`: + ``` $ wget -q -O steam_locomotive.json https://asciinema.org/a/7lw94ys68gsgr1yzdtzwijxm4.json $ asciinema play steam_locomotive.json @@ -198,7 +195,8 @@ $ asciinema play steam_locomotive.json ### 将视频嵌入 HTML -最后,Asciinema 还带有一个独立的 JavaScript 播放器。这意味者你可以很容易的在你的网站上分享终端会话记录。下面,使用一段简单的 `index.html` 代码来说明这个方法。首先,下载所有必要的东西: +最后,asciinema 还带有一个独立的 JavaScript 播放器。这意味者你可以很容易的在你的网站上分享终端会话记录。下面,使用一段简单的 `index.html` 代码来说明这个方法。首先,下载所有必要的东西: + ``` $ cd /tmp/ $ mkdir steam_locomotive @@ -208,6 +206,7 @@ $ wget -q https://github.com/asciinema/asciinema-player/releases/download/v2.4.0 $ wget -q https://github.com/asciinema/asciinema-player/releases/download/v2.4.0/asciinema-player.js ``` 之后,创建一个新的包含下面这些内容的 `/tmp/steam_locomotive/index.html` 文件: + ``` @@ -219,28 +218,34 @@ $ wget -q https://github.com/asciinema/asciinema-player/releases/download/v2.4.0 ``` + 完成以后,打开你的网页浏览器,按下 `CTRL+O` 来打开新创建的 `/tmp/steam_locomotive/index.html` 文件。 ### 结论 -正如前面所说的,使用 Asciinema 录制器来录制终端会话最主要的优点是它的输出文件非常小,这使得你的视频很容易分享出去。上面的例子产生了一个包含 58472 个字符的文件,它是一个只有 58 KB 大的 22 秒终端会话视频。如果我们查看输出的 JSON 文件,会发现甚至这个数字已经非常大了,这主要是因为一个 “蒸汽机车” 已经跑过了终端。这个长度的正常终端会话会产生一个更小的输出文件。 +正如前面所说的,使用 asciinema 录制器来录制终端会话最主要的优点是它的输出文件非常小,这使得你的视频很容易分享出去。上面的例子产生了一个包含 58472 个字符的文件,它是一个只有 58 KB 大 小的 22 秒终端会话视频。如果我们查看输出的 JSON 文件,会发现甚至这个数字已经非常大了,这主要是因为一个 “蒸汽机车” 已经跑过了终端。这个长度的正常终端会话一般会产生一个更小的输出文件。 下次,当你想要在一个论坛上询问关于 Linux 配置的问题,并且很难描述你的问题的时候,只需运行下面的命令: + ``` $ asciinema rec ``` + 然后把最后的链接贴到论坛的帖子里。 ### 故障排除 -### 在 UTF-8 环境下运行 asciinema +#### 在 UTF-8 环境下运行 asciinema 错误信息: + ``` -asciinema 需要在 UTF-8 环境下运行。请检查 `locale` 命令的输出。 +asciinema needs a UTF-8 native locale to run. Check the output of `locale` command. ``` + 解决方法: -生成并导出UTF-8语言环境。例如: +生成并导出 UTF-8 语言环境。例如: + ``` $ localedef -c -f UTF-8 -i en_US en_US.UTF-8 $ export LC_ALL=en_US.UTF-8 @@ -252,7 +257,7 @@ via: https://linuxconfig.org/record-and-replay-terminal-session-with-asciinema-o 作者:[Lubos Rendek][a] 译者:[ucasFL](https://github.com/ucasFL) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 33957d68bdb4d146756d2b32517ec58b7b53fe3f Mon Sep 17 00:00:00 2001 From: Ezio Date: Thu, 18 May 2017 13:23:16 +0800 Subject: [PATCH 0104/1407] =?UTF-8?q?20170518-1=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20170518 Maintaining a Git Repository.md | 244 ++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 sources/tech/20170518 Maintaining a Git Repository.md diff --git a/sources/tech/20170518 Maintaining a Git Repository.md b/sources/tech/20170518 Maintaining a Git Repository.md new file mode 100644 index 0000000000..e1e62e5db5 --- /dev/null +++ b/sources/tech/20170518 Maintaining a Git Repository.md @@ -0,0 +1,244 @@ +Maintaining a Git Repository +============================================================ + +Maintenance of your Git repository typically involves reducing a repository's size.  If you imported from another version control system, you may need to clean up unnecessary files after the import.  This page focuses on removing large files from a Git repo and contains the following topics: + +* [Understanding file removal from Git history][1] + +* [Using the BFG to rewrite history][2] + +* [Alternatively, using git filter-branch to rewrite history][3] + +* [Garbage collecting dead data][4] + +Be very careful... + +The procedure and tools on this page use advanced techniques that involve destructive operations.  Make sure you read carefully and **backup your repository** before starting. The easiest way to create a backup is to clone your repository using the [--mirror][5] flag, and zip the whole clone. With the backup, if you accidentally corrupt a key element of your repo during maintenance, you can recover. + +Keep in mind that maintenance can be disruptive to repository users. It is a good idea to communicate repository maintenance with your team or repository followers. Make sure everyone has checked in their code and have agreed to cease development during maintenance. + +### Understanding file removal from Git history + +Recall that cloning a repository clones the entire history — including every version of every source code file.  If a user commits a huge file, such as a JAR, every clone thereafter includes this file. Even if a user ends up removing the file from the project with a subsequent commit, the file still exists in the repository history.  To remove this file from your repository you must: + +* remove the file from your project's  _current_  file-tree + +* remove the file from repository history -  _rewriting_  Git history, deleting the file from **all** commits containing it + +* remove all [reflog][6] history that refers to the  _old_  commit history + +* repack the repository, garbage-collecting the now-unused data using [git gc][7] + +Git 'gc' (garbage collection) will remove all data from the repository that is not actually used, or in some way referenced, by any of your branches or tags. In order for that to be useful, we need to rewrite all Git repository history that contained the unwanted file, so that it no longer references it - git gc will then be able to discard the now-unused data. + +Rewriting repository history is a tricky business, because every commit depends on it's parents, so any small change will change the commit id of every subsequent commit. There are two automated tools for doing this: + +1. [the BFG Repo Cleaner][8] - fast, simple, easy to use. Require Java 6 or above. + +2. [git filter-branch][9] - powerful, tricky to configure, slow on big repositories. Part of the core Git suite. + +Remember, after you rewrite the history, whether you use the BFG or filter-branch, you will need to remove `reflog` entries that point to old history, and finally run the garbage collector to purge the old data.  + +### Using the BFG to rewrite history + +[The BFG][11] is specifically designed for removing unwanted data like big files or passwords from Git repos, so it has a simple flag that will remove any large historical (not-in-your-current-commit) files: '--strip-blobs-bigger-than' + + +``` +$ java -jar bfg.jar --strip-blobs-bigger-than 100M +``` + +Any files over 100MB in size (that aren't in your  _latest_  commit - because [your latest content is protected][12] by the BFG) will be removed from your Git repository's history. If you'd like to specify files by name, you can do that too: + + +``` +$ java -jar bfg.jar --delete-files *.mp4 +``` + +The BFG is [10-1000x][13] faster than git filter-branch, and generally much easier to use - check the full [usage instructions][14] and [examples][15] for more details. + +### Alternatively, using git filter-branch to rewrite history + +The `filter-branch` command rewrites a Git repo's revision history, just like the BFG, but the process is slower and more manual. If you don't know  _where_  the big file is, your first step will be to find it: + +### Manually reviewing large files in your repository + +[Antony Stubbs][16] has written a BASH script that does this very well. The script examines the contents of your packfile and lists out the large files.  Before you begin removing files, do the following to obtain and install this script: + +1. [Download the script][10] to your local system. + +2. Put it in a well known location accessible to your Git repository. + +3. Make the script an  executable: + + + ``` + $ chmod 777 git_find_big.sh + ``` + +4. Clone the repository to your local system. + +5. Change directory to your repository root. + +6. Run the Git garbage collector manually. + + + ``` + git gc --auto + ``` + +7. Find out the size of the .git folder. + + + ``` + $ du -hs .git/objects + ``` + + ``` + 45M .git/objects + ``` + + Note this size down for later reference. + +8. List the big files in your repo by running the `git_find_big.sh` script. + + + ``` + $ git_find_big.sh + ``` + + ``` + All sizes are in kB's. The pack column is the size of the object, compressed, inside the pack file. + ``` + + ``` + size pack SHA                                       location + ``` + + ``` + 592   580   e3117f48bc305dd1f5ae0df3419a0ce2d9617336 media/img/emojis.jar + ``` + + ``` + 550   169   b594a7f59ba7ba9daebb20447a87ea4357874f43 media/js/aui/aui-dependencies.jar + ``` + + ``` + 518   514   22f7f9a84905aaec019dae9ea1279a9450277130 media/images/screenshots/issue-tracker-wiki.jar + ``` + + ``` + 337   92   1fd8ac97c9fecf74ba6246eacef8288e89b4bff5 media/js/lib/bundle.js + ``` + + ``` + 240   239   e0c26d9959bd583e5ef32b6206fc8abe5fea8624 media/img/featuretour/heroshot.png + ``` + + The big files are all JAR files.  The pack size column is the most relevant.  The `aui-dependencies.jar` compacts to 169KB  but the `emojis.jar` compacts only to 580\.  The `emojis.jar` is a candidate for removal. + +### Running filter-branch + +You can pass this command a filter for rewriting the Git index.  For example, a filter can remove a file from every indexed commit.  The syntax for this is the following: + +`git filter-branch --index-filter 'git rm --cached --ignore-unmatch  _pathname_ ' commitHASH` + +The `--index-filter` option modifies a repo's staging (or index). The `--cached` option removes a file from the index not the disk.  This is faster as you don't have to checkout each revision before running the filter.  The -`-ignore-unmatch` option in `git rm` prevents the command from failing if the  _pathname_  it is trying to remove isn't there.  By specifying a commit HASH, you remove the `pathname` from every commit starting with the HASH on up.  To remove from the start, leave this off or you can specify HEAD.   + +If all your large files are in different branches, you'll need to delete each file by name. If all the files are within a single branch,  you can delete the branch itself. + +### Option 1: Delete files by name + +Use the following procedure to remove large files: + +1. Run the following command to remove the first large file you identified: + + + ``` + git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD + ``` + +2. Repeat Step 1 for each remaining large file. + +3. Update the references in your repository. `filter-branch` creates backups of your original refs namespaced under `refs/original/`. Once you're confident that you deleted the correct files, you can run the following command to delete the backed up refs, allowing the large objects to be garbage collected: + + + ``` + $ git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d + ``` + +### Option 2: Delete just the branch + +If all your large files are on a single branch,  you can just delete the branch. Deleting the branch automatically removes all the references. + +1. Delete the branch. + + + ``` + $ git branch -D PROJ567bugfix + ``` + +2. Prune all of the reflog references from the branch on back. + + + ``` + $ git reflog expire --expire=now PROJ567bugfix + ``` + +### Garbage collecting dead data + +1. Prune all of the reflog references from now on back (unless you're explicitly only operating on one branch). + + + ``` + $ git reflog expire --expire=now --all + ``` + +2. Repack the repository by running the garbage collector and pruning old objects. + + + ``` + $ git gc --prune=now + ``` + +3. Push all your changes back to the Bitbucket repository. + + + ``` + $ git push --all --force + ``` + +4. Make sure all your tags are current too: + + + ``` + $ git push --tags --force + ``` + +-------------------------------------------------------------------------------- + +via: https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html + +作者:[atlassian.com][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html +[1]:https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html#MaintainingaGitRepository-UnderstandingfileremovalfromGithistory +[2]:https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html#MaintainingaGitRepository-UsingtheBFGtorewritehistory +[3]:https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html#MaintainingaGitRepository-Alternatively,usinggitfilter-branchtorewritehistory +[4]:https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html#MaintainingaGitRepository-Garbagecollectingdeaddata +[5]:http://stackoverflow.com/questions/3959924/whats-the-difference-between-git-clone-mirror-and-git-clone-bare +[6]:http://git-scm.com/docs/git-reflog +[7]:http://git-scm.com/docs/git-gc +[8]:http://rtyley.github.io/bfg-repo-cleaner/ +[9]:http://git-scm.com/docs/git-filter-branch +[10]:https://confluence.atlassian.com/bitbucket/files/321848291/321979854/1/1360604134990/git_find_big.sh +[11]:http://rtyley.github.io/bfg-repo-cleaner/ +[12]:http://rtyley.github.io/bfg-repo-cleaner/#protected-commits +[13]:https://www.youtube.com/watch?v=Ir4IHzPhJuI +[14]:http://rtyley.github.io/bfg-repo-cleaner/#usage +[15]:http://rtyley.github.io/bfg-repo-cleaner/#examples +[16]:https://stubbisms.wordpress.com/2009/07/10/git-script-to-show-largest-pack-objects-and-trim-your-waist-line/ From 0e9809e448c8fa738cf5c476e24ca8c92aae563e Mon Sep 17 00:00:00 2001 From: Ezio Date: Thu, 18 May 2017 13:30:07 +0800 Subject: [PATCH 0105/1407] =?UTF-8?q?20170518-2=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20170516 What's the point of DevOps.md | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 sources/tech/20170516 What's the point of DevOps.md diff --git a/sources/tech/20170516 What's the point of DevOps.md b/sources/tech/20170516 What's the point of DevOps.md new file mode 100644 index 0000000000..357955f3f0 --- /dev/null +++ b/sources/tech/20170516 What's the point of DevOps.md @@ -0,0 +1,136 @@ +What's the point of DevOps? +============================================================ + +### True organizational culture change helps you bridge the gaps you thought were uncrossable. + + +![What's the point of DevOps?](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/BUSINESS_creativity.png?itok=x2HTRKVW "What's the point of DevOps?") +>Image by : opensource.com + +Think about the last time you tried to change a personal habit. You likely hit a point where you needed to alter the way you think and make the habit less a part of your identity. This is difficult—and you're only trying to change  _your own_  ways of thinking. + +So you may have tried to put yourself in new situations. New situations can actually help us create  _new_  habits, which in turn lead to new ways of thinking. + +That's the thing about successful change: It's as much about  _outlook_  as  _outcome_ . You need to know  _why_  you're changing and  _where_  you're headed (not just how you're going to do it), because change for its own sake is often short-lived and short-sighted. + +Now think about the changes your IT organization needs to make. Perhaps you're thinking about adopting something like DevOps. This thing we call "DevOps" has three components: people, process, and tools. People and process are the basis for  _any_  organization. Adopting DevOps, therefore, requires making fundamental changes to the core of most organizations—not just learning new tools. + +Open Organization resources + +* [Download the Open Organization Leaders Manual][1] + +* [Download the Open Organization Field Guide][2] + +* [What is an Open Organization?][3] + +* [What is an Open Decision?][4] + +And like any change, it can be short-sighted. If you're focused on the change as a point solution—"Get a better tool to do alerting," for example—you'll likely come up with a narrow vision of the problem. This mode of thinking may furnish a tool with more bells and whistles and a better way of handling on-call rotations. But it can't fix the fact that alerts aren't going to the right team, or that those failures remain failures since no one actually knows how to fix the service. + +The new tool (or at least the idea of a new tool) creates a moment to have a conversation about the underlying issues that plague your team's views on monitoring. The new tool allows you to make bigger changes—changes to your beliefs and practices—which, as the foundation of your organization, are even more important. + +Creating deeper change requires new approaches to the notion of change altogether. And to discover those approaches, we need to better understand the drive for change in the first place. + +### Clearing the fences + +> "In the matter of reforming things, as distinct from deforming them, there is one plain and simple principle; a principle which will probably be called a paradox. There exists in such a case a certain institution or law; let us say, for the sake of simplicity, a fence or gate erected across a road. The more modern type of reformer goes gaily up to it and says, "I don't see the use of this; let us clear it away." To which the more intelligent type of reformer will do well to answer: "If you don't see the use of it, I certainly won't let you clear it away. Go away and think. Then, when you can come back and tell me that you do see the use of it, I may allow you to destroy it."—G.K Chesterton, 1929 + +To understand the need for DevOps, which tries to recombine the traditionally "split" entities of "development" and "operations," we must first understand how the split came about. Once we "know the use of it," then we can see the split for what it really is—and dismantle it if necessary. + +Today we have no single theory of management, but we can trace the origins of most modern management theory to Frederick Winslow Taylor. Taylor was a mechanical engineer who created a system for measuring the efficiency of workers at a steel mill. Taylor believed he could apply scientific analysis to the laborers in the mill, not only to improve individual tasks, but also to prove that there was a discoverable best method for performing  _any_  task. + +We can easily draw a historical tree with Taylor at the root. From Taylor's early efforts in the late 1880s emerged the time-motion study and other quality-improvement programs that span the 1920s all the way to today, where we see Six Sigma, Lean, and the like. Top-down, directive-style management, coupled with a methodical approach to studying process, dominates mainstream business culture today. It's primarily focused on efficiency as the primary measure of worker success. + +>The "Dev" and "Ops" split is not the result of personality, diverging skills, or a magic hat placed on the heads of new employees; it's a byproduct of Taylorism and Sloanianism. + +If Taylor is our root of our historical tree, then our next major fork in the trunk would be Alfred P. Sloan of General Motors in the 1920s. The structure Sloan created at GM would not only hold strong there until the 2000s, but also prove to be the major model of the corporation for much of the next 50 years. + +In 1920, GM was experiencing a crisis of management—or rather a crisis from the lack thereof. Sloan wrote his "Organizational Study" for the board, proposing a new structure for the multitudes of GM divisions. This new structure centered on the concept of "decentralized operations with centralized control." The individual divisions, associated now with brands like Chevrolet, Cadillac, and Buick, would operate independently while providing central management the means to drive strategy and control finances. + +Under Sloan's recommendations (and later guidance as CEO), GM rose to a dominant position in the US auto industry. Sloan's plan created a highly successful corporation from one on the brink of disaster. From the central view, the autonomous units are black boxes. Incentives and goals get set at the top levels, and the teams at the bottom drive to deliver. + +The Taylorian idea of "best practices"—standard, interchangeable, and repeatable behaviors—still holds a place in today's management ideals, where it gets coupled with the hierarchical model of the Sloan corporate structure, which advocates rigid departmental splits and silos for maximum control. + +We can point to several management studies that demonstrate this. But business culture isn't created and propagated only through reading books. Organizational culture is the product of  _real_  people in  _actual_  situations performing  _concrete_  behaviors that propel cultural norms through time. That's how things like Taylorism and and Sloanianism get solidified and come to appear immovable. + +Technology sector funding is a case in point. Here's how the cycle works: Investors only invest in those companies they believe could achieve  _their_  particular view of success.  This model for success doesn't necessarily originate from the company itself (and its particular goals); it comes from a board's ideas of what a successful company  _should_  look like. Many investors come from companies that have survived the trials and tribulations of running a business, and as a result they have  _different_  blueprints for what makes a successful company. They fund companies that can be taught to mimic their models for success. So companies wishing to acquire funding learn to mimic. In this way, the start-up incubator is a  _direct_  way of reproducing a supposedly  _ideal_  structure and culture. + +The "Dev" and "Ops" split is not the result of personality, diverging skills, or a magic hat placed on the heads of new employees; it's a byproduct of Taylorism and Sloanianism. Clear and impermeable boundaries between responsibilities and personnel is a management function coupled with a focus on worker efficiency. The management split could have easily landed on product or project boundaries instead of skills, but the history of business management theory through today tells us that skills-based grouping is the "best" way to be efficient. + +Unfortunately, those boundaries create tensions, and those tensions are a direct result of opposing goals set by different management chains with different objectives. For example: + + +Agility ⟷ Stability + +Drawing new users ⟷ Existing users' experience + +Application getting features ⟷ Application available to use + +Beating the competition ⟷ Protecting revenue + +Fixing problems that come up ⟷ Preventing problems before they happen + + + +Today, we can see growing recognition among organizations' top leaders that the existing business culture (and by extension the set of tensions it produces) is a serious problem. In a 2016 Gartner report, 57 percent of respondents said that culture change was one of the major challenges to the business through 2020\. The rise of new methods like Agile and DevOps as a means of affecting organizational changes reflects that recognition. The rise of "[shadow IT][7]" is the flip side of the coin; recent estimates peg nearly 30 percent of IT spend outside the control of the IT organization. + +These are only some of the "culture concerns" that business are having. The need to change is clear, but the path ahead is still governed by the decisions of yesterday. + +### Resistance isn't futile + +> "Bert Lance believes he can save Uncle Sam billions if he can get the government to adopt a simple motto: 'If it ain't broke, don't fix it.' He explains: 'That's the trouble with government: Fixing things that aren't broken and not fixing things that are broken.'" — Nation's Business, May 1977 + +Typically, change is an organizational response to something gone wrong. In this sense, then, if tension (even adversity) is the normal catalyst for change, then the  _resistance_  to change is an indicator of success. But overemphasis on successful paths can make organizations inflexible, hidebound, and dogmatic. Valuing policy navigation over effective results is a symptom of this growing rigidity. + +Success in traditional IT departments has thickened the walls of the IT silo. Other departments are now "customers," not co-workers. Attempts to shift IT  _away_  from being a cost-center create a new operating model that disconnects IT from the rest of the business' goals. This in turn creates resistance that limits agility, increases friction, and decreases responsiveness. Collaboration gets shelved in favor of "expert direction." The result is an isolationist view of IT can only do more harm than good. + +And yet as "software eats the world," IT becomes more and more central to the overall success of the organization. Forward-thinking IT organizations recognize this and are already making deliberate changes to their playbooks, rather than treating change as something to fear. + +>Change isn't just about rebuilding the organization; it's also about new ways to cross historically uncrossable gaps. + +For instance, Facebook consulted with [anthropologist Robin Dunbar][8] on its approach to social groups, but realized the impact this had on internal groups (not just external users of the site) as the company grew. Zappos' culture has garnered so much praise that the organization created a department focused on training others in their views on core values and corporate culture. And of course, this book is a companion to  _The Open Organization_ , a book that shows how open principles applied to management—transparency, participation, and community—can reinvent the organization for our fast-paced, connected era. + +### Resolving to change + +> "If the rate of change on the outside exceeds the rate of change on the inside, the end is near."—Jack Welch, 2004 + +A colleague once told me he could explain DevOps to a project manager using only the vocabulary of the [Information Technology Infrastructure Library][9] framework. + +While these frameworks  _appear_  to be opposed, they actually both center on risk and change management. They simply present different processes and tools for such management. This point is important to note when to talking about DevOps outside IT. Instead of emphasizing process breakdowns and failures, show how smaller changes introduce  _less_  risk, and so on. This is a powerful way to highlight the benefits changing a team's culture: Focusing on the  _new_  capabilities instead of the  _old_  problems is an effective agent for change, especially when you adopt someone else's frame of reference. + +Change isn't just about  _rebuilding_  the organization; it's also about new ways to cross historically uncrossable gaps—resolving those tensions I mapped earlier by refusing to position things like "agility" and "stability" as mutually exclusive forces. Setting up cross-silo teams focused on  _outcomes_  over  _functions_  is one of the strategies in play. Bringing different teams, each of whose work relies on the others, together around a single project or goal is one of the most common approaches. Eliminating friction between these teams and improving communications yields massive improvements—even while holding to the iron silo structures of management (silos don't need to be demolished if they can be mastered). In these cases,  _resistance_  to change isn't an indicator of success; an embrace of change is. + +These aren't "best practices." They're simply a way for you to examine your own fences. Every organization has unique fences created by the people within it. And once you "know the use of it," you can decide whether it needs dismantling or mastering. + + _This article is part of Opensource.com's forthcoming guide to open organizations and IT culture. [Register to be notified][5] when it's released._ + +-------------------------------------------------------------------------------- + + +作者简介: + +Matt Micene - Matt Micene is an evangelist for Linux and containers at Red Hat. He has over 15 years of experience in information technology, ranging from architecture and system design to data center design. He has a deep understanding of key technologies, such as containers, cloud computing and virtualization. His current focus is evangelizing Red Hat Enterprise Linux, and how the OS relates to the new age of compute environments. + +------------------------------------------ + +via: https://opensource.com/open-organization/17/5/what-is-the-point-of-DevOps + +作者:[Matt Micene ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/matt-micene +[1]:https://opensource.com/open-organization/resources/leaders-manual?src=too_resource_menu +[2]:https://opensource.com/open-organization/resources/field-guide?src=too_resource_menu +[3]:https://opensource.com/open-organization/resources/open-org-definition?src=too_resource_menu +[4]:https://opensource.com/open-organization/resources/open-decision-framework?src=too_resource_menu +[5]:https://opensource.com/open-organization/resources/book-series +[6]:https://opensource.com/open-organization/17/5/what-is-the-point-of-DevOps?rate=gOQvGqsEbNk_RSnoU0wP3PJ71E_XDYiYo7KS2HKFfP0 +[7]:https://thenewstack.io/parity-check-dont-afraid-shadow-yet/ +[8]:http://www.npr.org/2017/01/13/509358157/is-there-a-limit-to-how-many-friends-we-can-have +[9]:https://en.wikipedia.org/wiki/ITIL +[10]:https://opensource.com/user/18066/feed +[11]:https://opensource.com/open-organization/17/5/what-is-the-point-of-DevOps#comments +[12]:https://opensource.com/users/matt-micene From dd0a088c17ca5b7e8460239fc6a81b43df0d9dc5 Mon Sep 17 00:00:00 2001 From: Ezio Date: Thu, 18 May 2017 13:33:21 +0800 Subject: [PATCH 0106/1407] =?UTF-8?q?20170518-3=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ding great command-line user interfaces.md | 308 ++++++++++++++++++ 1 file changed, 308 insertions(+) create mode 100644 sources/tech/20170509 4 Python libraries for building great command-line user interfaces.md diff --git a/sources/tech/20170509 4 Python libraries for building great command-line user interfaces.md b/sources/tech/20170509 4 Python libraries for building great command-line user interfaces.md new file mode 100644 index 0000000000..b4c4ced5dd --- /dev/null +++ b/sources/tech/20170509 4 Python libraries for building great command-line user interfaces.md @@ -0,0 +1,308 @@ +4 Python libraries for building great command-line user interfaces +============================================================ + +### In the second installment of a two-part series on terminal applications with great command-line UIs, we explore Prompt Toolkit, Click, Pygments, and Fuzzy Finder. + + +![Getting started with 4 practical Python libraries: Prompt Toolkit, Click, Pygments, and Fuzzy Finder](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/library-libraries-search.png?itok=YE0Qk276 "Getting started with 4 practical Python libraries: Prompt Toolkit, Click, Pygments, and Fuzzy Finder") +>Image by : [Mennonite Church USA Archives][16]. Modified by Opensource.com. [CC BY-SA 4.0][17] + +This is the second installment in my two-part series on terminal applications with great command-line UIs. In the [first article][18], I discussed features that make a command-line application a pure joy to use. In part two, I'll look at how to implement those features in Python with the help of a few libraries. By the end of this article, readers should have a good understanding of how to use [Prompt Toolkit][19], [Click][20] (Command Line Interface Creation Kit), [Pygments][21], and [Fuzzy Finder][22] to implement an easy-to-use [REPL][23]. + +I plan to achieve this in fewer than 20 lines of Python code. Let's begin. + +Programming and development + +* [New Python content][1] + +* [Our latest JavaScript articles][2] + +* [Recent Perl posts][3] + +* [Red Hat Developers Blog][4] + +### Python Prompt Toolkit + +I like to think of this library as the Swiss Army knife of command-line apps—it acts as a replacement for **[readline][5]**, **[curses][6]**, and much more. Let's install the library and get started: + +``` +pip install prompt_toolkit +``` + +We'll start with a simple REPL. Typically a REPL will accept user input, do an operation, and print the results. For our example, we're going to build an "echo" REPL. It merely prints back what the user typed in: + +### REPL + +``` +from prompt_toolkit import prompt + +while 1: + user_input = prompt('>') + print(user_input) +``` + +That is all it takes to implement a REPL. It can read user input and print out what they have entered. The **prompt** function used in this code snippet is from the **prompt_toolkit** library; it is a replacement for the **readline** library. + +### History + +To enhance our REPL, we can add command history: + +``` +from prompt_toolkit import prompt +from prompt_toolkit.history import FileHistory + +while 1: + user_input = prompt('>', + history=FileHistory('history.txt'), + ) + print(user_input) +``` + +We've just added persistent history to our REPL. Now we can use the up/down arrow to navigate the history, and use the **Ctrl**+**R** to search the history. This satisfies the basic etiquette of a command line. + +### Auto-suggestion + +One of the discoverability tricks I covered in part one was the automatic suggestion of commands from the history. (We saw this feature pioneered in the **fish** shell.) Let's add that feature to our REPL: + +``` +from prompt_toolkit import prompt +from prompt_toolkit.history import FileHistory +from prompt_toolkit.auto_suggest import AutoSuggestFromHistory + +while 1: + user_input = prompt('>', + history=FileHistory('history.txt'), + auto_suggest=AutoSuggestFromHistory(), + ) + print(user_input) +``` + +All we had to do was add a new argument to the **prompt()** API call. Now we have a REPL that has **fish**-style auto-suggestion from the history. + +### Auto-completion + +Now let's implement an enhancement of Tab-completion via auto-completion, which pops up possible suggestions as the user starts typing input. + +How will our REPL know what to suggest? We supply a dictionary of possible items to suggest. + +Let's say we're implementing a REPL for SQL. We can stock our auto-completion dictionary with SQL keywords. Let's see how to do that: + +``` +from prompt_toolkit import prompt +from prompt_toolkit.history import FileHistory +from prompt_toolkit.auto_suggest import AutoSuggestFromHistory +from prompt_toolkit.contrib.completers import WordCompleter + +SQLCompleter = WordCompleter(['select', 'from', 'insert', 'update', 'delete', 'drop'], + ignore_case=True) + +while 1: + user_input = prompt('SQL>', + history=FileHistory('history.txt'), + auto_suggest=AutoSuggestFromHistory(), + completer=SQLCompleter, + ) + print(user_input) +``` + +Once again, we simply can use a built-in completion routine of prompt-toolkit called **WordCompleter**, which matches the user input with the dictionary of possible suggestions and offers up a list. + +We now have a REPL that can do auto-completion, fish-style suggestions from history, and up/down traversal of history. All of that in less than 10 lines of actual code. + +### Click + +Click is a command-line creation toolkit that makes it easy to parse command-line options arguments and parameters for the program. This section does not talk about how to use Click as an arguments parser; instead, I'm going to look at some utilities that ship with Click. + +Installing click is simple: + +``` +pip install click +``` + +### Pager + +Pagers are Unix utilities that display long output one page at a time. Examples of pagers are **less**, **more**, **most**, etc. Displaying the output of a command via a pager is not just friendly design, but also the decent thing to do. + +Let's take the previous example further. Instead of using the default **print()** statement, we can use **click.echo_via_pager()**. This will take care of sending the output to stdout via a pager. It is platform-agnostic, so it will work in Unix or Windows. **click.echo_via_pager()** will try to use decent defaults for the pager to be able to show color codes if necessary: + +``` +from prompt_toolkit import prompt +from prompt_toolkit.history import FileHistory +from prompt_toolkit.auto_suggest import AutoSuggestFromHistory +from prompt_toolkit.contrib.completers import WordCompleter +import click + +SQLCompleter = WordCompleter(['select', 'from', 'insert', 'update', 'delete', 'drop'], + ignore_case=True) + +while 1: + user_input = prompt(u'SQL>', + history=FileHistory('history.txt'), + auto_suggest=AutoSuggestFromHistory(), + completer=SQLCompleter, + ) + click.echo_via_pager(user_input) +``` + +### Editor + +One of the niceties mentioned in my previous article was falling back to an editor when the command gets too complicated. Once again **click** has an [easy API][24] to launch an editor and return the text entered in the editor back to the application: + +``` +import click +message = click.edit() +``` + +### Fuzzy Finder + +Fuzzy Finder is a way for users to narrow down the suggestions with minimal typing. Once again, there is a library that implements Fuzzy Finder. Let's install the library: + +``` +pip install fuzzyfinder +``` + +The API for Fuzzy Finder is simple. You pass in the partial string and a list of possible choices, and Fuzzy Finder will return a new list that matches the partial string using the fuzzy algorithm ranked in order of relevance. For example: + +``` +>>> from fuzzyfinder import fuzzyfinder + +>>> suggestions = fuzzyfinder('abc', ['abcd', 'defabca', 'aagbec', 'xyz', 'qux']) + +>>> list(suggestions) +['abcd', 'defabca', 'aagbec'] +``` + +Now that we have our **fuzzyfinder**, let's add it into our SQL REPL. The way we do this is to define a custom completer instead of the **WordCompleter** that comes with **prompt-toolkit**. For example: + +``` +from prompt_toolkit import prompt +from prompt_toolkit.history import FileHistory +from prompt_toolkit.auto_suggest import AutoSuggestFromHistory +from prompt_toolkit.completion import Completer, Completion +import click +from fuzzyfinder import fuzzyfinder + +SQLKeywords = ['select', 'from', 'insert', 'update', 'delete', 'drop'] + +class SQLCompleter(Completer): + def get_completions(self, document, complete_event): + word_before_cursor = document.get_word_before_cursor(WORD=True) + matches = fuzzyfinder(word_before_cursor, SQLKeywords) + for m in matches: + yield Completion(m, start_position=-len(word_before_cursor)) + +while 1: + user_input = prompt(u'SQL>', + history=FileHistory('history.txt'), + auto_suggest=AutoSuggestFromHistory(), + completer=SQLCompleter(), + ) + click.echo_via_pager(user_input) +``` + +### Pygments + +Now let's add syntax highlighting to the user input. We are building a SQL REPL, and having colorful SQL statements will be nice. + +Pygments is a syntax highlighting library with built-in support for more than 300 languages. Adding syntax highlighting makes an application colorful, which helps users spot mistakes—such as typos, unmatched quotes, or brackets—in their SQL before executing it. + +First install Pygments: + +``` +pip install pygments +``` + +Let's use Pygments to add color to our SQL REPL: + +``` +from prompt_toolkit import prompt +from prompt_toolkit.history import FileHistory +from prompt_toolkit.auto_suggest import AutoSuggestFromHistory +from prompt_toolkit.completion import Completer, Completion +import click +from fuzzyfinder import fuzzyfinder +from pygments.lexers.sql import SqlLexer + +SQLKeywords = ['select', 'from', 'insert', 'update', 'delete', 'drop'] + +class SQLCompleter(Completer): + def get_completions(self, document, complete_event): + word_before_cursor = document.get_word_before_cursor(WORD=True) + matches = fuzzyfinder(word_before_cursor, SQLKeywords) + for m in matches: + yield Completion(m, start_position=-len(word_before_cursor)) + +while 1: + user_input = prompt(u'SQL>', + history=FileHistory('history.txt'), + auto_suggest=AutoSuggestFromHistory(), + completer=SQLCompleter(), + lexer=SqlLexer, + ) + click.echo_via_pager(user_input) +``` + +Prompt Toolkit works well with the Pygments library. We pick **SqlLexer** supplied by **Pygments** and pass it into the **prompt** API from **prompt-toolkit**. Now all user input is treated as SQL statements and colored appropriately. + +### Conclusion + +That concludes our journey through the creation of a powerful REPL that has all the features of a common shell, such as history, key bindings, and user-friendly features such as auto-completion, fuzzy finding, pager support, editor support, and syntax highlighting. We achieved all of that in fewer than 20 statements of Python. + +Wasn't that easy? Now you have no excuses not to write a stellar command-line app. These resources might help: + +* [Click][7] (Command Line Interface Creation Kit) + +* [Fuzzy Finder][8] + +* [Prompt Toolkit][9] + +* See the [Prompt Toolkit tutorial tutorial][10] and [examples][11] in the prompt-toolkit repository. + +* [Pygments][12] + + _Learn more in Amjith Ramanujam's  [PyCon US 2017][13] talk, [Awesome Commandline Tools][14], May 20th in Portland, Oregon._ + +-------------------------------------------------------------------------------- + +作者简介: + +Amjith Ramanujam - Amjith Ramanujam is the creator of pgcli and mycli. People think they're pretty cool and he doesn't disagree. He likes programming in Python, Javascript and C. He likes to write simple, understandable code, sometimes he even succeeds. + +---------------------------- + +via: https://opensource.com/article/17/5/4-practical-python-libraries + +作者:[ Amjith Ramanujam][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/amjith +[1]:https://opensource.com/tags/python?src=programming_resource_menu +[2]:https://opensource.com/tags/javascript?src=programming_resource_menu +[3]:https://opensource.com/tags/perl?src=programming_resource_menu +[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu +[5]:https://docs.python.org/2/library/readline.html +[6]:https://docs.python.org/2/library/curses.html +[7]:http://click.pocoo.org/5/ +[8]:https://pypi.python.org/pypi/fuzzyfinder +[9]:https://python-prompt-toolkit.readthedocs.io/en/latest/ +[10]:https://github.com/jonathanslenders/python-prompt-toolkit/tree/master/examples/tutorial +[11]:https://github.com/jonathanslenders/python-prompt-toolkit/tree/master/examples/ +[12]:http://pygments.org/ +[13]:https://us.pycon.org/2017/ +[14]:https://us.pycon.org/2017/schedule/presentation/518/ +[15]:https://opensource.com/article/17/5/4-practical-python-libraries?rate=SEw4SQN1U2QSXM7aUHJZb2ZsPwyFylPIbgcVLgC_RBg +[16]:https://www.flickr.com/photos/mennonitechurchusa-archives/6987770030/in/photolist-bDu9zC-ovJ8gx-aecxqE-oeZerP-orVJHj-oubnD1-odmmg1-ouBNHR-otUoui-occFe4-ot7LTD-oundj9-odj4iX-9QSskz-ouaoMo-ous5V6-odJKBW-otnxbj-osXERb-iqdyJ8-ovgmPu-bDukCS-sdk9QB-5JQauY-fteJ53-ownm41-ov9Ynr-odxW52-rgqPBV-osyhxE-6QLRz9-i7ki3F-odbLQd-ownZP1-osDU6d-owrTXy-osLLXS-out7Dp-hNHsya-wPbFkS-od7yfD-ouA53c-otnzf9-ormX8L-ouTj6h-e8kAze-oya2zR-hn3B2i-aDNNqk-aDNNmR +[17]:https://creativecommons.org/licenses/by-sa/4.0/ +[18]:https://opensource.com/article/17/4/4-terminal-apps +[19]:https://python-prompt-toolkit.readthedocs.io/en/latest/ +[20]:http://click.pocoo.org/5/ +[21]:http://pygments.org/ +[22]:https://pypi.python.org/pypi/fuzzyfinder +[23]:https://en.wikipedia.org/wiki/Read%E2%80%93eval%E2%80%93print_loop +[24]:http://click.pocoo.org/5/utils/#launching-editors +[25]:https://opensource.com/user/125521/feed +[26]:https://opensource.com/article/17/5/4-practical-python-libraries#comments +[27]:https://opensource.com/users/amjith From 79f5be5c8986f4a22d76a3392bd1f011c5e26e8c Mon Sep 17 00:00:00 2001 From: Ezio Date: Thu, 18 May 2017 13:35:56 +0800 Subject: [PATCH 0107/1407] =?UTF-8?q?20170518-4=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...pplications with great command-line UIs.md | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 sources/tech/20170508 4 terminal applications with great command-line UIs.md diff --git a/sources/tech/20170508 4 terminal applications with great command-line UIs.md b/sources/tech/20170508 4 terminal applications with great command-line UIs.md new file mode 100644 index 0000000000..6294039746 --- /dev/null +++ b/sources/tech/20170508 4 terminal applications with great command-line UIs.md @@ -0,0 +1,142 @@ +4 terminal applications with great command-line UIs +============================================================ + +### We look at a few well-designed CLI programs and how they overcome some discoverability problems. + + +![4 awesome command-line tools](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/code_computer_development_programming.png?itok=wMspQJcO "4 awesome command-line tools") +>Image by : opensource.com + +In this article, I'll look at a shortcoming of command-line interfaces—discoverability—and a few ways to overcome this problem. + +I love command lines. My first command line was DOS 6.2, back in 1997\. I learned the syntax for various commands and showed off how to list hidden files in a directory (**attrib**). I would carefully craft my commands one character at a time. When I made a mistake, I would proceed to retype the command from the beginning. One fine day someone showed me how to traverse the history using the up and down arrow keys and I was blown away. + +Programming and development + +* [New Python content][1] + +* [Our latest JavaScript articles][2] + +* [Recent Perl posts][3] + +* [Red Hat Developers Blog][4] + +Later when I was introduced to Linux, I was pleasantly surprised that up and down arrows retained their ability to traverse the history. I was still typing each character meticulously, but by now I knew how to touch type and I was doing exceedingly well with my 55 words per minute. Then someone showed me tab-completion and changed my life once again. + +In GUI applications menus, tool tips and icons are used to advertise a feature for the user. Command lines lack that ability, but there are ways to overcome this problem. Before diving into solutions, I'll look at a couple of problematic CLI apps: + +### 1\. MySQL + +First we have our beloved MySQL REPL. I often find myself typing **SELECT * FROM** and then press **Tab** out of habit. MySQL asks whether I'd like to see all 871 possibilities. I most definitely don't have 871 tables in my database. If I said **yes**, it shows a bunch of SQL keywords, tables, functions, and so on. + +![MySQL gif](https://opensource.com/sites/default/files/mysql.gif) + +### 2\. Python + +Let's look at another example, the standard Python REPL. I start typing a command and press the **Tab** key out of habit. Lo and behold a **Tab** character is inserted, which is a problem considering that a **Tab** character has no business in a Python source code. + +![Python gif](https://opensource.com/sites/default/files/python.gif "Python gif") + +### Good UX + +Now let's look at well-designed CLI programs and how they overcome some discoverability problems. + +### Auto-completion: bpython + +[Bpython][15] is a fancy replacement for the Python REPL. When I launch bpython and start typing, suggestions appear right away. I haven't triggered them via a special key combo, not even the famed **Tab** key. + +![bpython gif](https://opensource.com/sites/default/files/bpython.gif "bpython gif") + +When I press the **Tab** key out of habit, it completes the first suggestion from the list. This is a great example of bringing discoverability to CLI design. + +The next aspect of bpython is the way it surfaces documentation for modules and functions. When I type in the name of a function, it presents the function signature and the doc string attached with the function. What an incredibly thoughtful design. + +### Context-aware completion: mycli + +[Mycli][16] is a modern alternative to the default MySQL client. This tool does to MySQL what bpython does to the standard Python REPL. Mycli will auto-complete keywords, table names, columns, and functions as you type them. + +The completion suggestions are context-sensitive. For example, after the **SELECT * FROM**, only tables from the current database are listed in the completion, rather than every possible keyword under the sun. + +![mycli gif](https://opensource.com/sites/default/files/mycli.gif "mycli gif") + +### Fuzzy search and online Help: pgcli + +If you're looking for a PostgreSQL version of mycli, check out [pgcli][17]. As with mycli, context-aware auto-completion is presented. The items in the menu are narrowed down using fuzzy search. Fuzzy search allows users to type sub-strings from different parts of the whole string to try and find the right match. + +![pgcli gif](https://opensource.com/sites/default/files/pgcli.gif "pgcli gif") + +Both pgcli and mycli implement this feature in their CLI. Documentation for slash commands are presented as part of the completion menu. + +### Discoverability: fish + +In traditional Unix shells (Bash, zsh, etc.), there is a way to search your history. This search mode is triggered by **Ctrl-R**. This is an incredibly useful tool for recalling a command you ran last week that starts with, for example, **ssh** or **docker**. Once you know this feature, you'll find yourself using it often. + +If this feature is so useful, why not do this search all the time? That's exactly what the [**fish** shell][18] does. As soon as you start typing a command, **fish** will start suggesting commands from history that are similar to the one you're typing. You can then press the right arrow key to accept that suggestion. + +### Command-line etiquette + +I've reviewed innovative ways to solve the discoverability problems, but there are command-line basics everyone should implement as part of the basic REPL functionality: + +* Make sure the REPL has a history that can be recalled via the arrow keys. Make sure the history persists between sessions. + +* Provide a way to edit the command in an editor. No matter how awesome your completions are, sometimes users just need an editor to craft that perfect command to drop all the tables in production. + +* Use a pager to pipe the output. Don't make the user scroll through their terminal. Oh, and use sane defaults for your pager. (Add the option to handle color codes.) + +* Provide a way to search the history either via the **Ctrl-R** interface or the **fish**-style auto-search. + +### Conclusion + +In part 2, I'll look at specific libraries in Python that allow you to implement these techniques. In the meantime, check out some of these well-designed command-line applications: + +* [bpython][5] or [ptpython][6]: Fancy REPL for Python with auto-completion support. + +* [http-prompt][7]: An interactive HTTP client. + +* [mycli][8]: A command-line interface for MySQL, MariaDB, and Percona with auto-completion and syntax highlighting. + +* [pgcli][9]: An alternative to [psql][10] with auto-completion and syntax-highlighting. + +* [wharfee][11]: A shell for managing Docker containers. + + _Learn more in Amjith Ramanujam's  [PyCon US 2017][12] talk, [Awesome Commandline Tools][13], May 20th in Portland, Oregon._ + +-------------------------------------------------------------------------------- + + +作者简介: + +Amjith Ramanujam - Amjith Ramanujam is the creator of pgcli and mycli. People think they're pretty cool and he doesn't disagree. He likes programming in Python, Javascript and C. He likes to write simple, understandable code, sometimes he even succeeds. + +----------------------- + +via: https://opensource.com/article/17/5/4-terminal-apps + +作者:[Amjith Ramanujam ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/amjith +[1]:https://opensource.com/tags/python?src=programming_resource_menu +[2]:https://opensource.com/tags/javascript?src=programming_resource_menu +[3]:https://opensource.com/tags/perl?src=programming_resource_menu +[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu +[5]:http://bpython-interpreter.org/ +[6]:http://github.com/jonathanslenders/ptpython/ +[7]:https://github.com/eliangcs/http-prompt +[8]:http://mycli.net/ +[9]:http://pgcli.com/ +[10]:https://www.postgresql.org/docs/9.2/static/app-psql.html +[11]:http://wharfee.com/ +[12]:https://us.pycon.org/2017/ +[13]:https://us.pycon.org/2017/schedule/presentation/518/ +[14]:https://opensource.com/article/17/5/4-terminal-apps?rate=3HL0zUQ8_dkTrinonNF-V41gZvjlRP40R0RlxTJQ3G4 +[15]:https://bpython-interpreter.org/ +[16]:http://mycli.net/ +[17]:http://pgcli.com/ +[18]:https://fishshell.com/ +[19]:https://opensource.com/user/125521/feed +[20]:https://opensource.com/article/17/5/4-terminal-apps#comments +[21]:https://opensource.com/users/amjith From 00ba13f4a0050c935bb383b366571c2c484ebe44 Mon Sep 17 00:00:00 2001 From: Ezio Date: Thu, 18 May 2017 13:37:59 +0800 Subject: [PATCH 0108/1407] =?UTF-8?q?20170518-5=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20170509 Much ado about communication.md | 88 +++++++++++++++++++ 1 file changed, 88 insertions(+) create mode 100644 sources/tech/20170509 Much ado about communication.md diff --git a/sources/tech/20170509 Much ado about communication.md b/sources/tech/20170509 Much ado about communication.md new file mode 100644 index 0000000000..dfd0696ab7 --- /dev/null +++ b/sources/tech/20170509 Much ado about communication.md @@ -0,0 +1,88 @@ +Much ado about communication +============================================================ + +### One of an open source project's first challenges is determining the best way for contributors to collaborate. + + +![Much ado about communication](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/rh_003601_05_mech_osyearbook2016_business_cc.png?itok=xZestz1h "Much ado about communication") +>Image by : Opensource.com + +One of the first challenges an open source project faces is how to communicate among contributors. There are a plethora of options: forums, chat channels, issues, mailing lists, pull requests, and more. How do we choose which is the right medium to use and how do we do it right? + +Sadly and all too often, projects shy away from making a disciplined decision and instead opt for "all of the above." This results in a fragmented community: Some people sit in Slack/Mattermost/IRC, some use the forum, some use mailing lists, some live in issues, and few read all of them. + +This is a common issue I see in organizations I'm [working with to build their internal and external communities][2]. Which of these channels do we choose and for which purposes? Also, when is it OK to say no to one of them? + +This is what I want to dig into here. + +### Structured and unstructured + +I have a tiny, peanut-sized brain in my head. Because of this, I tend to break problems down into smaller pieces so I can better understand them. Likewise, I tend to break different options in a scenario down into smaller thematic pieces to better understand their purpose. I take this approach with communication channels too. + +I believe there are two broad categories of communication channels: structured and unstructured. + +Structured channels have a very specific focus in each individual unit of communication. An example here is a GitHub/GitLab/Jira issue. An issue is a very specific piece of information that relates to a bug or feature. The discussion that cascades after the initial issue post is typically very focused on that specific topic and finding an outcome (such as a bugfix or a final plan for a feature). The outcome is then typically reflected in a status (e.g. "FIXED," "WONTFIX," or "INVALID"). This means you can understand the beginning and end of the communication without reading the pieces in between. + +Likewise, pull/merge requests are structured. They are focused on a specific type (typically code) of contribution. After the initial pull/merge request, the discussion is very focused on an outcome: getting the contribution in shape to merge into the wider codebase. + +Another example here is a StackOverflow/AskBot style Q&A post. These posts start with a question and are then edited and responded to in order to provide a concise answer to the question. + +With each of these structured mechanisms there usually is little deviation from the structure. You never see people asking others how their kids/cats/dogs/family are doing in an issue, pull request, or Q&A topic. It is socially unacceptable to veer off topic, and that is part of the power of a structured medium: It is focused and (usually) efficient. + +The inverse, unstructured media, include chat channels and forums. In these environments there is typically a theme (such as the topic of a channel or sub-forum), but conversations are much less tied to a specific outcome or conclusion and can often be more general in nature. As an example, in a developer mailing list you will get a mix of discussions including general questions, ideas for new features, architectural challenges, and discussions that relate to the operational running of the community itself. With each of these discussions it is imperative on the participants to keep the conversation focused, on topic, and productive. As you can imagine, this is often not the case, and these kinds of discussions can veer away from a productive outcome. + +### The impact of recording + +Aside from the subtle differences between structured and unstructured communication, the impact of what is recorded and how it can be searched plays a large role too. + +Typically, all structured channels are recorded. People reference old bugs, questions from StackOverflow are reused over and over again. You can search for something, and even if there is lots of discussion, the issue, pull request, or question is usually updated to reflect the ultimate conclusion. + +This is part of the point: We want to be able to quickly and easily dig up old issues/questions/pull requests/etc., link to them, and reference them. A key component here is that we convert this content into referenceable material that can be used to educate and inform people about previous knowledge. As our community grows, our structured communication becomes a corpus of knowledge that can inform the future from lessons in the past. + +This gets murkier with unstructured communication. On one hand, forums are generally simple and effective to search, but they are of course filled with unstructured conversation, so the thing you are looking for might be buried inside a discussion. As an example, many communities use a forum as a support tool. While this is a more than capable platform, the problem is that the answer to a question may be response #16 or response #340 in a discussion. As we are bombarded with more and more sources of information (and in smaller pieces, such as Twitter), we have become increasingly impatient to reading through large swaths of material, and this can be problematic with an unstructured medium. + +A particularly interesting case is real-time chat. Historically, IRC has paved the way for real-time chat for many years, and for most IRC users there was little (if any) notion of recording those discussions. Sure, some projects (such as Ubuntu) record IRC logs, but this is generally not a useful resource. As my pal Jeff Atwood said to me once: "If you have to search chat for something, you have already lost." + +While IRC is limited in recording, Slack and Mattermost are better. Conversations are archived, but the point still typically stands: Why would you want to search through large bodies of conversation to find a point that someone made? Other channels are far better for referencing previous discussions. + +This does create an interesting opportunity though. One consistent benefit that chat exhibits over all other media is how human it is. Structured channels, and even unstructured channels such as forums and mailing lists, rarely encourage off-the-cuff social discussion. Chat does. Chat is where you ask: "How was your weekend?" "Did you see the game?" and "Are you going to see Testament, Sepultura, and Prong next week?" (OK, maybe the last one is just me.) + +So, while real-time discussion may be less effective in our corpus of previous collaboration, it does provide a vital glue in shaping relationships. + +### Choose your poison + +So, back to our original question for open source communities: Which of these do we pick? + +While this answer will vary from project to project, I tend to think of this on two levels. + +First, you should generally prioritize structured communication. This is where tangible work gets done: in bugs/issues, pull requests, in support Q&A discussions, etc. If you are tight on resources, focus your efforts on these channels: You can more easily draw a dotted line between the investment of time and money there and productive output in the community. + +Second, if you are passionate about building a broader community that can focus on engineering, advocacy, translations, documentation, and more, explore whether bringing in unstructured channels makes sense. Community is not just about getting stuff done, it is also about building relationships and friendships, providing support to each other in our work, and helping people grow and flourish in our communities. Unstructured communication is a helpful tool in this. + +Of course, I am merely scratching the surface of a large topic here, but I hope this provides a little clarity in how to assess and choose the value of communication channels. Remember, less is more here: Don't be tempted to defer the decision and provide all of the above; you will get a fragmented community that's just about as inviting as an empty restaurant. + +May the force be with you, and be sure to let me know how you get on. I am always available through my [website][3] and at [jono@jonobacon.com][4]. + +-------------------------------------------------------------------------------- + +作者简介: + +Jono Bacon - Jono Bacon is a leading community manager, speaker, author, and podcaster. He is the founder of Jono Bacon Consulting which provides community strategy/execution, developer workflow, and other services. He also previously served as director of community at GitHub, Canonical, XPRIZE, OpenAdvantage, and consulted and advised a range of organizations. + +-------------------- + +via: https://opensource.com/article/17/5/much-ado-about-communication + +作者:[ Jono Bacon][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/jonobacon +[1]:https://opensource.com/article/17/5/much-ado-about-communication?rate=fBsUIx1TCGIXAFnRdYGTUqSG1pMmMCpdhYlyrFtRLS8 +[2]:http://www.jonobaconconsulting.com/ +[3]:http://www.jonobacon.com/ +[4]:mailto:jono@jonobacon.com +[5]:https://opensource.com/user/26312/feed +[6]:https://opensource.com/users/jonobacon From 8f822a6ac558a8afa037842ce4dd2f48f648f358 Mon Sep 17 00:00:00 2001 From: Ezio Date: Thu, 18 May 2017 13:40:40 +0800 Subject: [PATCH 0109/1407] =?UTF-8?q?20170518-6=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...o get started with open source hardware.md | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 sources/tech/20170508 8 ways to get started with open source hardware.md diff --git a/sources/tech/20170508 8 ways to get started with open source hardware.md b/sources/tech/20170508 8 ways to get started with open source hardware.md new file mode 100644 index 0000000000..bc7cf57e9b --- /dev/null +++ b/sources/tech/20170508 8 ways to get started with open source hardware.md @@ -0,0 +1,97 @@ +8 ways to get started with open source hardware +============================================================ + +### Making your own hardware is easier and less expensive than ever. Here's what you need to design, build, and test your first board. + + +![8 ways to get started with open source hardware](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/hardware_hammer_sign.jpg?itok=vh76LBib "8 ways to get started with open source hardware") +>Image by : Thomas Hawk on [Flickr][11]. [CC BY-NC 2.0][12]. Modified by Opensource.com + +Alan Kay, famed computer scientist, once said, "People who are really serious about software should make their own hardware." I'd argue that's as true today as it was in 1982 when he said it. However, what's changed between then and now is that hardware has gotten faster, smaller, and most importantly: cheaper. it's now possible to buy a full computer for $5. + +With big companies driving down prices for their own products, it's grown a manufacturing ecosystem capable of producing production-grade hardware that's cheap enough and accessible enough that it is now within reach of normal individuals. This accessibility and affordability are helping drive things like crowdfunding and the maker movement, but they're also giving way to more individuals being able to participate in open source through open source hardware. + +Explore open hardware + +* [What is open hardware?][1] + +* [What is Raspberry Pi?][2] + +* [What is an Arduino?][3] + +* [Our latest open hardware articles][4] + +There's some pretty big differences in what is or isn't open source hardware, but the Open Source Hardware Association (OSHWA) has a definition that most folks agree with, and if you're familiar with open source software this shouldn't sound too weird: + +> "Open source hardware (OSHW) is a term for tangible artifacts—machines, devices, or other physical things—whose design has been released to the public in such a way that anyone can make, modify, distribute, and use those things." + +There's lots of open source hardware around; you may not have noticed the boards you already use may, in fact, be open hardware. From the humble but ever versatile [Arduino][13] and all the way up through full computers like the [BeagleBone][14] family and the [C.H.I.P.][15] computer, there are lots of examples of open hardware around, and more designs are being made all the time. + +Hardware can be complicated, and sometimes non-obvious to beginners why a design needs something. But open source hardware gives you the ability to not only see working examples, but also the ability to change those designs or strike off and replicate the pieces you need in your own designs, and it might be as simple as copy and paste. + +### How can I get started? + +Let's start off by pointing out that hardware is hard, it's complicated, sometimes esoteric, and the tools you may be using are not always the most user-friendly. It's also more than likely, as anyone who's played around with a microcontroller long enough can attest: you are going to fry something and let the magic smoke out at some point. It's ok, we've all done it, some of us repeatedly because we didn't learn the lesson the first 100 times we did something, but don't let this discourage you: Lessons are learned when things go wrong, and you usually get an interesting story to tell later. + +### Modeling + +The first thing to do is to start modeling what you want to do with an existing board, jumper wires, a breadboard, and whatever devices you want to hook up. In many cases, the simplest thing to play with is just adding more LEDs to a board and getting them to blink in novel ways. This is a great way to prototype something, and it's a fairly common thing to do. It won't look pretty, and you may find that you wire something wrong, but these are prototypes—you just want to prove things work. When things don't work, always double check everything, and don't be afraid to ask for help—sometimes a second pair of eyes will find your oddball ground short. + +### Design + +When you've figured out what you want to build, it's time to start taking your idea from jumper wires and breadboards to an actual design. This is where things can get a bit daunting, but start small—in fact, it's worth starting really small just to get used to the tooling and process, so why not make a printed circuit board that has a LED and a battery on it? Seriously, this might sound overly simplistic but there's a lot of new ground to cover here. + +1. **Find an electronic design automation (EDA) tool to use.** There are some good open source software options out there, but they aren't always the most user-friendly. [Fritzing][5], [gEDA][6], and [KiCad ][7]are all open source in ascending order of approachability. There are also some options if you want to try more commercial offerings; Eagle has a free version available with some restrictions and a lot of open source hardware designs are done in it. + +1. **Design your board in your EDA tool.** Depending on the tool you choose, this could be fairly quick, or it could be quite the exercise in learning how things work. This is one of the reasons I suggest starting small; a circuit with an LEDaan be as simple as a battery, a resistor, and an LED. The schematic capture is pretty simple, and the layout can be small and very simple. + +1. **Export your design for manufacturing.** This goes hand-in-hand with the next thing on the list, but it can also be a confusing process if you haven't done it before. There's a lot of knobs and dials to twist and adjust when you do the export, and things need to be exported in certain ways to make it easier on board houses to actually figure out what you want them to make. + +1. **Find a board house.** There are lots of board houses out there that can make your design, and some are more friendly and helpful than others. One place that's particularly awesome to work with is [OSH Park][8], these guys are very friendly and supportive of open source hardware. They also have a very solid process for confirming that what you are sending them is what will get built, so they are worth checking out. There are lots of other options though; take a look at [PCB Shopper][9], which lets you compare pricing, turnaround times, etc. of a number of solid PCB manufacturers. + +1. **Wait.** This might be the hardest part of building your own board, as it takes time to make something digital into a physical product. Plan on two weeks from when you hit "go" to getting your boards back. This is a great time to work on your next project, ensure or acquire all the parts for your current build, or generally try not to worry. On your first board it's hard—you really want it now, but be patient. + +1. **Solder up and bring up.** Once you've got your board, it's time to make it up and then test it. If you've gone with the LED option to start, it should be fairly easy to debug, and you'll have something that works. If you went more complex, be methodical and patient; sometimes things don't work and you'll need all your debugging skills to track things down. + +1. **Last, if you are doing open source hardware, release it.** We are talking about open source hardware, so make sure you include a license, but release it, share it, put it somewhere people can see what you've done. You may even want to write a blog post and submit it to someplace like Hackaday. + +1. **Above all, have fun.** Frankly if you are doing something and you aren't having fun, you should stop doing it. Open source hardware can be a lot of fun, though sometimes hard and complicated. Not everything may work; heck, I've had designs where half the board wasn't working or where I (accidentally) caused 12 shorts between power and ground. Were those boards bunked boards: yup. Did I learn something in the process: A LOT, and I won't make those same mistakes again. I'll make new ones, sure, but not THOSE. (I'd point and glare at those boards and their mistakes, but they wouldn't feel bad for me glaring at them, sadly). + +There's a lot of open source hardware out there and lots of good examples to look at, copy, and derive from and lots of information to help make building hardware easier. That's what open source hardware is: A community of people making things and sharing them so that everyone can make their own things and build the hardware that they want—not the hardware they can get. + +-------------------------------------------------------------------------------- + + + +作者简介: + +John 'Warthog9' Hawley - John works for VMware in the Open Source Program Office on upstream open source projects. In a previous life he's worked on the MinnowBoard open source hardware project, led the system administration team on kernel.org, and built desktop clusters before they were cool. For fun he's built multiple star ship bridges, a replica of K-9 from a popular British TV show, done in flight computer vision processing from UAVs, designed and built a pile of his own hardware. + +------------------------------------- + +via: https://opensource.com/article/17/5/8-ways-get-started-open-source-hardware + +作者:[John 'Warthog9' Hawley ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/article/17/5/8-ways-get-started-open-source-hardware +[1]:https://opensource.com/resources/what-open-hardware?src=open_hardware_resources_menu +[2]:https://opensource.com/resources/what-raspberry-pi?src=open_hardware_resources_menu +[3]:https://opensource.com/resources/what-arduino?src=open_hardware_resources_menu +[4]:https://opensource.com/tags/hardware?src=open_hardware_resources_menu +[5]:http://fritzing.org/home/ +[6]:http://www.geda-project.org/ +[7]:http://kicad-pcb.org/ +[8]:https://oshpark.com/ +[9]:http://pcbshopper.com/ +[10]:https://opensource.com/article/17/5/8-ways-get-started-open-source-hardware?rate=jPBGDIa2vBXW6kb837X8JWdjI2V47hZ4KecI8-GJBjQ +[11]:https://www.flickr.com/photos/thomashawk/3048157616/in/photolist-5DmB4E-BzrZ4-5aUXCN-nvBWYa-qbkwAq-fEFeDm-fuZxgC-dufA8D-oi8Npd-b6FiBp-7ChGA3-aSn7xK-7NXMyh-a9bQQr-5NG9W7-agCY7E-4QD9zm-7HLTtj-4uCiHy-bYUUtG +[12]:https://creativecommons.org/licenses/by-nc/2.0/ +[13]:https://opensource.com/node/20751 +[14]:https://opensource.com/node/35211 +[15]:https://opensource.com/node/24891 +[16]:https://opensource.com/user/130046/feed +[17]:https://opensource.com/users/warthog9 From 9dd59ccaf433ee96415f458e54a005fdd1daed13 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 18 May 2017 15:01:30 +0800 Subject: [PATCH 0110/1407] PRF:20170206 Oracle Policy Change Raises Prices on AWS.md @geekpi --- ...acle Policy Change Raises Prices on AWS.md | 26 +++++++++---------- 1 file changed, 13 insertions(+), 13 deletions(-) diff --git a/translated/tech/20170206 Oracle Policy Change Raises Prices on AWS.md b/translated/tech/20170206 Oracle Policy Change Raises Prices on AWS.md index 7a77b90887..56cba17c49 100644 --- a/translated/tech/20170206 Oracle Policy Change Raises Prices on AWS.md +++ b/translated/tech/20170206 Oracle Policy Change Raises Prices on AWS.md @@ -1,31 +1,31 @@ -Oracle 政策更改提高了 AWS 的价格 +甲骨文的政策更改提高了其在 AWS 上的价格 ============================================================ ->这种改变使甲骨文在 AWS 上实施其软件的价格翻了一番,它已经安静地生效了,而几乎没有通知用户。 +> 这种改变使在 AWS 上实施甲骨文的软件的价格翻了一番,它已经安静地生效了,而几乎没有通知用户。 ![](http://windowsitpro.com/site-files/windowsitpro.com/files/imagecache/large_img/uploads/2017/02/ellison-hero.jpg) -上周消息传出,甲骨文使亚马逊云上的产品价格翻了一倍。它在[如何计算 AWS 的虚拟 CPU][6]上耍了一些花招。它这么做也没有任何宣扬。该公司的新定价政策于 1 月 23 日生效,直到 1 月 28 日,几乎没有被注意到,直到 Oracle 的关注者 Tim Hall 偶然发现 Big Red 的[ Oracle 软件云计算环境许可][7]文件并揭发了出来。 +之前有消息传出,甲骨文使亚马逊云上的产品价格翻了一倍。它在[如何计算 AWS 的虚拟 CPU][6] 上耍了一些花招。它这么做也没有任何宣扬。该公司的新定价政策于 1 月 23 日生效,直到 1 月 28 日都几乎没有被人注意到, 甲骨文的关注者 Tim Hall 偶然发现 Big Red 公司的 [甲骨文软件云计算环境许可][7]文件并披露了出来。 -乍一看,这一举动似乎并不太大,因为它仅将 Oracle 的 AWS 定价与 Microsoft Azure 的价格相提并论。但是 Azure 只有市场领先的 AWS 体量的三分之一,所以如果你想在云中销售许可证,AWS 是合适的地方。虽然此举可能或可能不会影响已经在 AWS 上使用 Oracle 的用户,但是尚不清楚新规则是否适用于已在使用产品的用户 - 它肯定会让一些考虑可能使用 Oracle 的用户另寻它处。 +乍一看,这一举动似乎并不太大,因为它仅将甲骨文的 AWS 定价与 Microsoft Azure 的价格相提并论。但是 Azure 只有市场领先的 AWS 体量的三分之一,所以如果你想在云中销售许可证,AWS 是合适的地方。虽然此举可能或可能不会影响已经在 AWS 上使用甲骨文产品的用户,但是尚不清楚新规则是否适用于已在使用产品的用户 - 它肯定会让一些考虑可能使用甲骨文的用户另寻它处。 -这个举动的主要原因是显而易见的。甲骨文希望使自己的云更具吸引力 - 这让[The Register 观察][8]到一点:“拉里·埃里森确实承诺过 Oracle 的云将会更快更便宜”。更快和更便宜仍然有待看到。如果 Oracle 的 SPARC 云计划启动,并且按照广告的形式执行,那么可能会更快,但是更便宜的可能性较小。甲骨文以对其价格的强硬态度而著称。 +这个举动的主要原因是显而易见的。甲骨文希望使自己的云更具吸引力 - 这让 [The Register 观察][8]到一点:“拉里·埃里森确实承诺过甲骨文的云将会更快更便宜”。更快和更便宜仍然有待看到。如果甲骨文的 SPARC 云计划启动,并且按照广告的形式执行,那么可能会更快,但是更便宜的可能性较小。甲骨文以对其价格的强硬态度而著称。 -随着其签名数据库和业务栈销售的下滑,并且对 Sun 的 74 亿美元的投资并未能按照如期那样,Oracle 将其未来堵在云计算上。但是甲骨文来晚了,迄今为止, 它的努力似乎还没有结果, 一些金融预测者并没有看到 Oracle Cloud 的光明前景。他们说,云是一个拥挤的市场,而四大公司 - 亚马逊、微软、IBM 和谷歌 - 已经有了领先优势。 +随着其招牌数据库和业务栈销售的下滑,并且对 Sun 公司的 74 亿美元的投资并未能按照如期那样,甲骨文将其未来赌在云计算上。但是甲骨文来晚了,迄今为止,它的努力似乎还没有结果, 一些金融预测者并没有看到甲骨文云的光明前景。他们说,云是一个拥挤的市场,而四大公司 - 亚马逊、微软、IBM 和谷歌 - 已经有了领先优势。 -确实如此。但是 Oracle 面临的最大的障碍是,好吧,是 Oracle。它的声誉在它之前。 +确实如此。但是甲骨文面临的最大的障碍是,好吧,就是甲骨文。它的声誉在它之前。 -保守地说这个公司并不是因为明星客户服务而闻名。事实上, 新闻报道将甲骨文描绘成一个恶霸和操纵者。 +保守地说这个公司并不是因为明星客户服务而闻名。事实上,各种新闻报道将甲骨文描绘成一个恶霸和操纵者。 -例如,早在 2015 年,Oracle 就因为它的云并不像预期那样快速增长而越来越沮丧,开始[激活业内人士称之为的“核特权”][9]。它会审核客户的数据中心,如果客户不符合规定,将发出“违规通知” - 它通常只适用于大规模滥用情况,并命令客户在 30 天内退出使用其软件。 +例如,早在 2015 年,甲骨文就因为它的云并不像预期那样快速增长而越来越沮丧,开始[激活业内人士称之为的“核特权”][9]。它会审核客户的数据中心,如果客户不符合规定,将发出“违规通知” - 它通常只适用于大规模滥用情况,并命令客户在 30 天内退出使用其软件。 -以防你还不知道,那么大量投资 Oracle 栈的大公司绝对不能在短时间内迁移到另一个解决方案。Oracle 的违规通知会引发灾难。 +或许你能想到,大量投入在甲骨文软件平台上的大公司们绝对不能在短时间内迁移到另一个解决方案。甲骨文的违规通知将会引发灾难。 商业内幕人士 Julie Bort 解释到:“为了使违规通知消失 - 或者减少高额的违规罚款 - 甲骨文销售代表通常希望客户向合同中添加云额度”。 -换句话说,Oracle 正在使用审计来扭转客户去购买它的云,而无论他们是否有需要。这种策略与最近 AWS 价格翻倍之间也可能存在联系。Hall 的文章的评论者指出,围绕价格提升的秘密背后的目的可能是触发软件审计。 +换句话说,甲骨文正在使用审计来扭转客户去购买它的云,而无论他们是否有需要。这种策略与最近 AWS 价格翻倍之间也可能存在联系。Hall 的文章的评论者指出,围绕价格提升的秘密背后的目的可能是触发软件审计。 -使用这些策略的麻烦迟早会出来。消息一旦传播开来,你的客户就开始寻找其他选项。对 Big Red 而言或许是时候参考微软的做法,开始建立一个更好和更温和的 Oracle,将客户的需求放在第一位。 +使用这些策略的麻烦迟早会出来。消息一旦传播开来,你的客户就开始寻找其他选项。对 Big Red 而言或许是时候参考微软的做法,开始建立一个更好和更温和的甲骨文,将客户的需求放在第一位。 -------------------------------------------------------------------------------- @@ -33,7 +33,7 @@ via: http://windowsitpro.com/cloud/oracle-policy-change-raises-prices-aws 作者:[Christine Hall][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/) 荣誉推出 From eca4f450ef5adbad97512b39e68154d1638ad7c7 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 18 May 2017 15:01:48 +0800 Subject: [PATCH 0111/1407] PUB:20170206 Oracle Policy Change Raises Prices on AWS.md @geekpi https://linux.cn/article-8520-1.html --- .../20170206 Oracle Policy Change Raises Prices on AWS.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170206 Oracle Policy Change Raises Prices on AWS.md (100%) diff --git a/translated/tech/20170206 Oracle Policy Change Raises Prices on AWS.md b/published/20170206 Oracle Policy Change Raises Prices on AWS.md similarity index 100% rename from translated/tech/20170206 Oracle Policy Change Raises Prices on AWS.md rename to published/20170206 Oracle Policy Change Raises Prices on AWS.md From 8ca9fab979cd152456145e15930c740bea94eb30 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 18 May 2017 15:33:13 +0800 Subject: [PATCH 0112/1407] =?UTF-8?q?PRF:20161214=20The=20Cost=20of=20Nati?= =?UTF-8?q?ve=20Mobile=20App=20Development=20is=20Too=20Damn=C2=A0High.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @fuowang 翻译的很流畅! --- ...Mobile App Development is Too Damn High.md | 75 ++++++++++--------- 1 file changed, 41 insertions(+), 34 deletions(-) diff --git a/translated/tech/20161214 The Cost of Native Mobile App Development is Too Damn High.md b/translated/tech/20161214 The Cost of Native Mobile App Development is Too Damn High.md index 5dd472644c..cbedfd6882 100644 --- a/translated/tech/20161214 The Cost of Native Mobile App Development is Too Damn High.md +++ b/translated/tech/20161214 The Cost of Native Mobile App Development is Too Damn High.md @@ -1,68 +1,67 @@ 该死,原生移动应用的开发成本太高了! ============================================================ -### 一个有价值的命题 +> 一个有价值的命题 -我们遇到了一个临界点。除去几个比较好的用例之外,使用原生框架和原生应用开发团队构建、维护移动应用再也没有意义了。 +我们遇到了一个临界点。除去少数几个特别的的用例之外,使用原生框架和原生应用开发团队构建、维护移动应用再也没有意义了。 ![](https://cdn-images-1.medium.com/max/1000/1*4nyeufIIgw9B7nMSr5Sybg.jpeg) -在美国,雇佣 iOS,Android,JavaScript 开发人员的平均花费([http://www.indeed.com/salary][1],[http://www.payscale.com/research/US/Skill=JavaScript/Salary][2]) +*在美国,雇佣 [iOS,Android][1],[JavaScript][2] 开发人员的平均花费* -在过去的几年,原生移动应用开发的费用螺旋式上升,无法控制。对没有大量资金的新创业者来说,创建原生应用、MVP 设计架构和原型的难度大大增加。现有的公司需要抓住人才,以便在现有应用上进行迭代开发或者构建一个新的应用。要尽一切努力留住最好的人才,与 [世界各地的公司][9] 拼尽全力 [争][6] 个 [高][7] [下][8]。 +在过去的几年,原生移动应用开发的费用螺旋式上升,无法控制。对没有大量资金的新创业者来说,创建原生应用、MVP 设计架构和原型的难度大大增加。现有的公司需要抓住人才,以便在现有应用上进行迭代开发或者构建一个新的应用。要尽一切努力才能留住最好的人才,与 [世界各地的公司][9] 拼尽全力[争个][6][高][7][下][8]。 ![](https://cdn-images-1.medium.com/max/800/1*imThyh2e45RW1np0xXIE4Q.png) -2015年初,原生方式和混合方式开发 MVP 设计架构的费用对比([Comomentum.com][3]) +*2015 年初,原生方式和混合方式开发 MVP 设计架构的费用[对比][3]* ### 这一切对于我们意味着什么? 如果你的公司很大或者有足够多的现金,旧思维是只要你在原生应用开发方面投入足够多的资金,就高枕无忧。但事实不再如此。 -Facebook 是你最不会想到的在人才战中失败的公司(因为他们没有失败),它也遇到了原生应用方面金钱无法解决的问题。他们的移动应用庞大而又复杂,[可以看到编译它竟然需要15分钟][10]。这意味着哪怕是极小的用户界面改动,比如移动几个点,测试起来都要花费几个小时(甚至几天)。 +Facebook 是你最不会想到的在人才战中失败的公司(因为他们没有失败),它也遇到了原生应用方面金钱无法解决的问题。他们的移动应用庞大而又复杂,[他们发现编译它竟然需要 15 分钟][10]。这意味着哪怕是极小的用户界面改动,比如移动几个点,测试起来都要花费几个小时(甚至几天)。 除了冗长的编译时间,应用的每一个小改动在测试时都需要在两个完全不同的环境(IOS 和 Android)实施,开发团队需要使用两种语言和框架工作,这趟水更浑了。 Facebook 对这个问题的解决方案是 [React Native][11]。 -### 能不能抛弃移动应用,仅面向Web呢? +### 能不能抛弃移动应用,仅面向 Web 呢? -[一些人认为移动应用的末日已到。][12] 尽管我很欣赏、尊重 [Eric Elliott][13] 和他的工作,但我们还是通过考察一些近期的数据,进而讨论一下某些相反的观点: +[一些人认为移动应用的末日已到][12]。尽管我很欣赏、尊重 [Eric Elliott][13] 和他的工作,但我们还是通过考察一些近期的数据,进而讨论一下某些相反的观点: +![](https://cdn-images-1.medium.com/max/800/1*s0O7X2PgIqP5_zselxQdqQ.png) - ![](https://cdn-images-1.medium.com/max/800/1*s0O7X2PgIqP5_zselxQdqQ.png) - -人们在移动应用上花费的时间(2016年4月,[smartinsights.com][4]) +*人们在移动应用上花费的[时间][4](2016年4月)* > 人们使用 APP 的时间占使用手机总时长的 90% 目前世界上有 25 亿人在使用移动手机。[这个数字增长到 50 亿的速度会比我们想象的还要快。][14] 在正常情况下,丢掉 45 亿人的生意,或者抛弃有 45 亿人使用的应用程序是绝对荒唐且行不通的。 -老问题是原生移动应用的开发成本对大多数公司来说太高了。尽管这个问题确实存在,但面向 web 的开发成本也在增加。[在美国,JavaScript 开发者的平均工资已达到 $97,000.00。][15] +老问题是原生移动应用的开发成本对大多数公司来说太高了。然而,面向 web 的开发成本也在增加。[在美国,JavaScript 开发者的平均工资已达到 $97,000.00][15]。 -伴随着复杂性的增加以及暴涨的高质量 web 开发需求,雇佣一个JavaScript 开发者的平均价格直逼原生应用开发者。论证 web 开发更便宜已经没用了。 +伴随着复杂性的增加以及对高质量 web 开发的需求暴涨,雇佣一个 JavaScript 开发者的平均价格直逼原生应用开发者。论证 web 开发更便宜已经没用了。 ### 那混合开发呢? 混合应用是将 HTML5 应用内嵌在原生应用的容器里,并且提供实现原生平台特性所需的权限。Cordova 和 PhoneGap 就是典型的例子。 -如果你想构建一个 MVP 设计架构、一个产品原型,或者不担心模仿原生应用的用户体验,那么混合应用会很适合你。谨记如果你最后想把它转为原生应用,整个项目都得重写。 +如果你想构建一个 MVP 设计架构、一个产品原型,或者不担心对原生应用的模仿的用户体验,那么混合应用会很适合你。但谨记如果你最后想把它转为原生应用,整个项目都得重写。 此领域有很多创新的东西,我最喜欢的当属 [Ionic Framework][16]。混合开发正变得越来越好,但还不如原生开发那么流畅自然。 有很多公司,包括最严峻的初创公司,也包括大中规模的公司,混合应用在质量上的表现似乎没有满足客户的要求,给人的感觉是活糙、不够专业。 -[听说应用商店里的前 100 名都不是混合应用,][17]我没有证据支持这一观点。如果说有百分之零到百分之五是混合应用,我就不怀疑了。 +[听说应用商店里的前 100 名都不是混合应用][17],我没有证据支持这一观点。如果说有百分之零到百分之五是混合应用,我就不怀疑了。 -> [我们最大的错误是在 HTML5 身上下了太多的赌注][18] — 马克 扎克伯格  +> [我们最大的错误是在 HTML5 身上下了太多的赌注][18] — 马克·扎克伯格  ### 解决方案 如果你紧跟移动开发动向,那么你绝对听说过像 [NativeScript][19] 和 [React Native][20] 这样的项目。 -通过这些项目,使用用 JavaScript 写成的基本 UI 组成块,像常规 iOS 和 Android 应用那样,就可以构建出高质量的原生移动应用。 +通过这些项目,使用由 JavaScript 写成的基本 UI 组成块,像常规 iOS 和 Android 应用那样,就可以构建出高质量的原生移动应用。 -你可以仅用一位工程师,也可以用一个专业的工程师团队,通过 React Native 使用 [现有代码库][22] 或者 [底层技术][23] 进行跨平台移动应用开发,[原生桌面开发][21], 甚至还有 web 开发。把你的应用发布到 APP Store上, Play Store上,还有 Web 上。如此可以在保证不丧失原生应用性能和质量的同时,使成本仅占传统开发的一小部分。 +你可以仅用一位工程师,也可以用一个专业的工程师团队,通过 React Native 使用 [现有代码库][22] 或者 [底层技术][23] 进行跨平台移动应用开发、[原生桌面开发][21],甚至还有 web 开发。把你的应用发布到 APP Store 上、 Play Store 上,还有 Web 上。如此可以在保证不丧失原生应用性能和质量的同时,使成本仅占传统开发的一小部分。 通过 React Native 进行跨平台开发时重复使用其中 90% 的代码也不是没有的事,这个范围通常是 80% 到 90%。 @@ -72,7 +71,7 @@ Facebook 对这个问题的解决方案是 [React Native][11]。 React Native 还可以使用 [Code Push][24] 和 [AppHub][25] 这样的工具来远程更新你的 JavaScript 代码。这意味着你可以向用户实时推送更新、新特性,快速修复 bug,绕过打包、发布这些工作,绕过 App Store、Google Play Store 的审核,省去了耗时 2 到 7 天的过程(App Store 一直是整个过程的痛点)。混合应用的这些优势原生应用不可能比得上。 -如果这个领域的创新力能像刚发行时那样保持,将来你甚至可以为 [Apple Watch ][26],[Apple TV][27],和 [Tizen][28] 这样的平台开发应用。 +如果这个领域的创新力能像刚发行时那样保持,将来你甚至可以为 [Apple Watch][26]、[Apple TV][27],和 [Tizen][28] 这样的平台开发应用。 > NativeScript 依然是个相当年轻的框架驱动,Angular 版本 2,[上个月刚刚发布测试版][29]。但只要它保持良好的市场份额,未来就很有前途。 @@ -84,49 +83,57 @@ React Native 还可以使用 [Code Push][24] 和 [AppHub][25] 这样的工具 看下面的例子,[这是一个使用 React Native 技术的著名应用列表][31]。 -### Facebook +#### Facebook ![](https://cdn-images-1.medium.com/max/800/1*36atCP-kVNoYrit2RMR-8g.jpeg) -Facebook 公司的 React Native 应用 +*Facebook 公司的 React Native 应用* -Facebook 的两款应用 [Ads Manager][32] 和 [Facebook Groups][33]都在使用 React Native 技术,并且[将会应用到实现动态消息的框架上][34]。 +Facebook 的两款应用 [Ads Manager][32] 和 [Facebook Groups][33] 都在使用 React Native 技术,并且[将会应用到实现动态消息的框架上][34]。 Facebook 也会投入大量的资金创立和维护像 React Native 这样的开源项目,而且开源项目的开发者最近已经创建很多了不起的项目,这是很了不起的工作,像我以及全世界的业务每天都从中享受诸多好处。 -### Instagram +#### Instagram ![](https://cdn-images-1.medium.com/max/800/1*MQ0ezjRsUW3A5I0ahryHPg.jpeg) -Instagram +*Instagram* Instagram 应用的一部分已经使用了 React Native 技术。 -### Airbnb +#### Airbnb ![](https://cdn-images-1.medium.com/max/800/1*JS3R_cfLsDFCmAZJmtVEvg.jpeg) -Airbnb +*Airbnb* Airbnb 的很多东西正用 React Native 重写。(来自 [Leland Richardson][36]) 超过 90% 的 Airbnb 旅行平台都是用 React Native 写的。(来自 [spikebrehm][37]) -### Vogue +#### Vogue ![](https://cdn-images-1.medium.com/max/800/1*V9JMA2L3lXcO1nczCN3gcA.jpeg) -Vogue 是 2016 年度十佳应用之一 +*Vogue 是 2016 年度十佳应用之一* Vogue 这么突出不仅仅因为它也用 React Native 写成,而是[因为它被苹果公司评为年度十佳应用之一][38]。 ![](https://cdn-images-1.medium.com/max/800/1*vPDVV-vwvjfL3MsHpOO8rQ.jpeg) -微软 +#### 沃尔玛 -微软在 React Native 身上下的赌注很大 +![](https://cdn-images-1.medium.com/max/800/1*ZlUk9AGwfOAPKdEBpa8avg.jpeg) -它早已发布多个开源工具,包括 [Code Push][39],[React Native VS Code][40],以及 [React Native Windows][41],旨在帮助开发者向 React Native 领域转移。 +*Walmart Labs* + +查看这篇 [Keerti](https://medium.com/@Keerti) 的[文章](https://medium.com/walmartlabs/react-native-at-walmartlabs-cdd140589560#.azpn97g8t)来了解沃尔玛是怎样看待 React Native 的优势的。 + +#### 微软 + +微软在 React Native 身上下的赌注很大。 + +它早已发布多个开源工具,包括 [Code Push][39]、[React Native VS Code][40],以及 [React Native Windows][41],旨在帮助开发者向 React Native 领域转移。 微软考虑的是那些已经使用 React Native 为 iOS 和 Android 开发应用的开发者,他们可以重用高达 90% 的代码,不用花费太多额外的时间和成本就可将应用发布到 Windows 上。 @@ -136,11 +143,11 @@ Vogue 这么突出不仅仅因为它也用 React Native 写成,而是[因为 移动应用界面设计和移动应用开发要进行范式转变,下一步就是 React Native 以及与其相似的技术。 -公司 +#### 公司 如果你的公司正想着削减成本、加快开发速度,而又不想在应用质量和性能上妥协,这是最适合使用 React Native 的时候,它能提高你的净利润。 -开发者 +#### 开发者 如果你是一个开发者,想进入一个将来会快速发展的领域,我强烈推荐你把 React Native 列入你的学习清单。 @@ -166,7 +173,7 @@ via: https://hackernoon.com/the-cost-of-native-mobile-app-development-is-too-dam 作者:[Nader Dabit][a] 译者:[fuowang](https://github.com/fuowang) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 3e61f043f5ae8ba45711c72844b21ae4bb7d035f Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 18 May 2017 15:33:28 +0800 Subject: [PATCH 0113/1407] =?UTF-8?q?PUB:20161214=20The=20Cost=20of=20Nati?= =?UTF-8?q?ve=20Mobile=20App=20Development=20is=20Too=20Damn=C2=A0High.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @fuowang --- ... The Cost of Native Mobile App Development is Too Damn High.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20161214 The Cost of Native Mobile App Development is Too Damn High.md (100%) diff --git a/translated/tech/20161214 The Cost of Native Mobile App Development is Too Damn High.md b/published/20161214 The Cost of Native Mobile App Development is Too Damn High.md similarity index 100% rename from translated/tech/20161214 The Cost of Native Mobile App Development is Too Damn High.md rename to published/20161214 The Cost of Native Mobile App Development is Too Damn High.md From c8744e1c99ca593a0476342e8d0c191ba389c711 Mon Sep 17 00:00:00 2001 From: jasminepeng Date: Thu, 18 May 2017 15:52:49 +0800 Subject: [PATCH 0114/1407] =?UTF-8?q?=E6=A0=A1=E5=AF=B9=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 校对中 --- .../20170322 5 big ways AI is rapidly invading our lives.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translated/tech/20170322 5 big ways AI is rapidly invading our lives.md b/translated/tech/20170322 5 big ways AI is rapidly invading our lives.md index 3c060bdbae..41269f0ac7 100644 --- a/translated/tech/20170322 5 big ways AI is rapidly invading our lives.md +++ b/translated/tech/20170322 5 big ways AI is rapidly invading our lives.md @@ -76,7 +76,7 @@ via: https://opensource.com/article/17/3/5-big-ways-ai-rapidly-invading-our-live 作者:[Rikki Endsley ][a] 译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) +校对:[jasminepeng](https://github.com/jasminepeng) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 2e8575dfd8c0d903e0261b0236d0a346c88ead8a Mon Sep 17 00:00:00 2001 From: jasminepeng Date: Thu, 18 May 2017 16:20:55 +0800 Subject: [PATCH 0115/1407] =?UTF-8?q?=E6=A0=A1=E5=AF=B9=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 校对中 --- ...g ways AI is rapidly invading our lives.md | 51 +++++++++---------- 1 file changed, 25 insertions(+), 26 deletions(-) diff --git a/translated/tech/20170322 5 big ways AI is rapidly invading our lives.md b/translated/tech/20170322 5 big ways AI is rapidly invading our lives.md index 41269f0ac7..17ced968ac 100644 --- a/translated/tech/20170322 5 big ways AI is rapidly invading our lives.md +++ b/translated/tech/20170322 5 big ways AI is rapidly invading our lives.md @@ -1,81 +1,80 @@ -AI正快速入侵我们生活的五个方面 +AI 正快速入侵我们生活的五个方面 ============================================================ -> 让我们来看看我们已经被人工智能包围的五个真实存在的方面 +> 让我们来看看我们已经被人工智能包围的五个真实存在的方面。 ![5 big ways AI is rapidly invading our lives](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/brain-think-ai-intelligence-ccby.png?itok=-EK6Vpz1 "5 big ways AI is rapidly invading our lives") > 图片来源: opensource.com -开源项目[正在帮助推动][2]人工智能进步,而且随着技术的成熟,我们可以听到更多关于AI如何影响我们的生活的消息。你有没有考虑过AI是如何改变你周围的世界的?让我们来看看我们日益人为增强的宇宙,并考虑对我们的AI影响的未来做些大胆预测。 +开源项目[正在帮助推动][2]人工智能进步,而且随着技术的成熟,我们将听到更多关于 AI 如何影响我们生活的消息。你有没有考虑过 AI 是如何改变你周围的世界的?让我们来看看我们日益人为增强的世界,以及 AI 对未来影响的大胆预测。 -### 1. AI影响你的购买决定 +### 1. AI 影响你的购买决定 -一篇[VentureBeat][3]上的最近的新闻报道[《AI将如何帮助我们解读千禧一代》][4]"吸引了我的注意。我承认我对人工智能没有思考太多,也没有很难解读千禧一代,所以我渴望了解更多。事实证明,文章标题有点误导人;《如何卖东西给千禧一代》会是一个更准确的标题。 +最近 [VentureBeat][3] 上的一篇文章,[“AI 将如何帮助我们解读千禧一代”][4]吸引了我的注意。我承认我对人工智能没有思考太多,也没有费力尝试解读千禧一代,所以我很好奇,渴望了解更多。事实证明,文章标题有点误导;“如何卖东西给千禧一代”会是一个更准确的标题。 -根据这篇文章,千禧一代是一个"人口统计细分,非常令人羡慕的一代人,以至于来自全世界的市场经理都在争抢他们"。通过分析网络行为——无论是购物、社交媒体或其他活动 - 机器学习可以帮助预测行为模式,这将可以变成有针对性的广告。文章接着解释如何将物联网和社交媒体平台挖掘成数据点。"使用机器学习挖掘社交媒体数据可以让公司了解千禧一代如何谈论其产品和他们对一个产品类别的看法,以及如何回应竞争对手的广告活动,还有可用于设计有针对性的广告系列的众多其他数据,"这篇文章解释。AI和千禧一代成为营销的未来并不是什么很令人吃惊的事,但是X一代和婴儿潮一代,你们也逃不掉呢! +根据这篇文章,千禧一代是“一个年龄阶段的人群,被人觊觎,以至于来自全世界的市场经理都在争抢他们”。通过分析网络行为 —— 无论是购物、社交媒体或其他活动 - 机器学习可以帮助预测行为模式,这将可以变成有针对性的广告。文章接着解释如何对物联网和社交媒体平台进行挖掘形成数据点。“使用机器学习挖掘社交媒体数据,可以让公司了解千禧一代如何谈论其产品,他们对一个产品类别的看法,他们对竞争对手的广告活动如何响应,还可获得很多数据,用于设计有针对性的广告,"这篇文章解释说。AI 和千禧一代成为营销的未来并不是什么很令人吃惊的事,但是 X 一代和婴儿潮一代,你们也逃不掉呢! > 人工智能被用来根据行为变化来定位包括城市人在内的整个人群。 -例如, [Raconteur上][23]的一篇文章——"AI将怎样改变购买者的行为"解释说,AI在网上零售行业最大的力量是它能够迅速适应流动的情况下改变客户行为。人工智能创业公司 [Fluid AI][25]首席执行官Abhinav -Aggarwal表示,他的公司的软件被客户用来预测客户行为,并且系统注意到在暴风雪期间发生了变化。“那些通常会忽略在一天中发送的电子邮件或应用内通知的用户现在正在打开它们,因为他们在家里没有太多的事情可做。一个小时,AI系统就适应了新的情况,并在工作时间发送更多的促销材料。"他解释说。 +例如, [Raconteur上][23]的一篇文章——"AI将怎样改变购买者的行为"解释说,AI 在网上零售行业最大的力量是它能够迅速适应流动的情况下改变客户行为。人工智能创业公司 [Fluid AI][25]首席执行官 Abhinav Aggarwal 表示,他的公司的软件被客户用来预测客户行为,并且系统注意到在暴风雪期间发生了变化。“那些通常会忽略在一天中发送的电子邮件或应用内通知的用户现在正在打开它们,因为他们在家里没有太多的事情可做。一个小时,AI 系统就适应了新的情况,并在工作时间发送更多的促销材料。"他解释说。 AI正在改变了我们怎样花钱和为什么花钱,但是AI是怎样改变我们挣钱的方式的呢? ### 2. 人工智能正在改变我们如何工作 -[Fast公司][5]最近的一篇文章《这就是在2017年人工智能如何改变我们的生活》说道,求职者将会从人工智能中受益。作者解释说,除薪酬趋势更新之外,人工智能将被用来给求职者发送相关职位空缺信息。当你应该升职的时候,你就会得到一个升职的机会。 +[Fast 公司][5]最近的一篇文章《这就是在 2017 年人工智能如何改变我们的生活》说道,求职者将会从人工智能中受益。作者解释说,除薪酬趋势更新之外,人工智能将被用来给求职者发送相关职位空缺信息。当你应该升职的时候,你就会得到一个升职的机会。 人造智能也将被公司用来帮助新入职的员工。文章解释说:“许多新员工在头几天内获得了大量信息,其中大部分不会被保留。” 相反,机器人可能会随着时间的推移向一名新员工“滴滴”,因为它变得更加相关。 -[Inc.][7]的一篇文章[《没有偏见的企业:人工智能将如何重塑招聘机制》][8]着眼于人才管理解决方案提供商[SAP SuccessFactors][9]是怎样利用人工智能作为一个工作描述偏差检查器”和检查员工赔偿金的偏差。 +[Inc.][7]的一篇文章[《没有偏见的企业:人工智能将如何重塑招聘机制》][8]着眼于人才管理解决方案提供商 [SAP SuccessFactors][9] 是怎样利用人工智能作为一个工作描述偏差检查器”和检查员工赔偿金的偏差。 -[《Deloitte2017人力资本趋势报告》][10]显示,AI正在激励组织进行重组。Fast公司的文章[《AI是怎样改变公司组织的方式》][11]审查了这篇报告,该文章是基于全球10,000多名人力资源和商业领袖的调查结果。这篇文章解释说:"许多公司现在更注重文化和环境的适应性,而不是聘请最有资格的人来做某个具体任务,因为知道个人角色必须随AI的实施而发展 。" 为了适应不断变化的技术,组织也从自上而下的结构转向多学科团队,文章说。 +[《Deloitte 2017 人力资本趋势报告》][10]显示,AI 正在激励组织进行重组。Fast公司的文章[《AI 是怎样改变公司组织的方式》][11]审查了这篇报告,该文章是基于全球 10,000 多名人力资源和商业领袖的调查结果。这篇文章解释说:"许多公司现在更注重文化和环境的适应性,而不是聘请最有资格的人来做某个具体任务,因为知道个人角色必须随 AI 的实施而发展 。" 为了适应不断变化的技术,组织也从自上而下的结构转向多学科团队,文章说。 -###3. AI正在改变教育 +###3. AI 正在改变教育 -> AI将使所有教育生态系统的利益相关者受益。 +> AI 将使所有教育生态系统的利益相关者受益。 -尽管教育的预算正在缩减,但是教室的规模却正在增长。因此利用技术的进步有助于提高教育体系的生产率和效率,并在提高教育质量和负担能力方面发挥作用。根据VentureBeat上的一篇文章[《2017年人工智能是怎样改变教育》][26],今年我们将看到AI对学生们的书面答案进行评分,机器人回答学生的答案,虚拟个人助理辅导学生等等。文章解释说:“AI将惠及教育生态系统的所有利益相关者。学生将能够通过即时的反馈和指导学习地更好,教师将获得丰富的学习分析和对个性化教学的见解,父母将以更低的成本看到他们的孩子的更好的职业前景,学校能够规模化优质的教育,政府能够向所有人提供可负担得起的教育。" +尽管教育的预算正在缩减,但是教室的规模却正在增长。因此利用技术的进步有助于提高教育体系的生产率和效率,并在提高教育质量和负担能力方面发挥作用。根据VentureBeat上的一篇文章[《2017 年人工智能是怎样改变教育》][26],今年我们将看到 AI 对学生们的书面答案进行评分,机器人回答学生的答案,虚拟个人助理辅导学生等等。文章解释说:“AI 将惠及教育生态系统的所有利益相关者。学生将能够通过即时的反馈和指导学习地更好,教师将获得丰富的学习分析和对个性化教学的见解,父母将以更低的成本看到他们的孩子的更好的职业前景,学校能够规模化优质的教育,政府能够向所有人提供可负担得起的教育。" ### 4. 人工智能正在重塑医疗保健 -2017年2月[CB Insights][12]的一篇文章挑选了106个医疗保健领域的人工智能初创公司,它们中的很多在过去几年中提高了第一次股权融资。这篇文章说:“在24家成像和诊断公司中,19家公司自2015年1月起就首次公开募股。”这份名单上了有那些从事于远程病人监测,药物发现和肿瘤学方面人工智能的公司。 +2017 年 2 月[CB Insights][12]的一篇文章挑选了 106 个医疗保健领域的人工智能初创公司,它们中的很多在过去几年中提高了第一次股权融资。这篇文章说:“在24 家成像和诊断公司中,19 家公司自 2015 年 1 月起就首次公开募股。”这份名单上了有那些从事于远程病人监测,药物发现和肿瘤学方面人工智能的公司。 -3月16日发表在TechCrunch上的一篇关于AI进步如何重塑医疗保健的文章解释说:"一旦对人类的DNA有了更好的理解,就有机会更进一步,并能根据他们特殊的生活习性为他们提供个性化的见解"。这种趋势预示着“个性化遗传学”的新纪元,人们能够通过获得关于自己身体的前所未有的信息来充分控制自己的健康。" +3 月 16 日发表在 TechCrunch 上的一篇关于 AI 进步如何重塑医疗保健的文章解释说:"一旦对人类的 DNA 有了更好的理解,就有机会更进一步,并能根据他们特殊的生活习性为他们提供个性化的见解"。这种趋势预示着“个性化遗传学”的新纪元,人们能够通过获得关于自己身体的前所未有的信息来充分控制自己的健康。" -本文接着解释说,AI和机器学习降低了研发新药的成本和时间。部分得益于广泛的测试,新药进入市场需要12年以上的时间。这篇文章说:“机器学习算法可以让计算机根据先前处理的数据来"学习"如何做出预测,或者选择(在某些情况下,甚至是产品)需要做什么实验。类似的算法还可用于预测特定化合物对人体的副作用,这样可以加快审批速度。"这篇文章指出,2015年旧金山的一个创业公司[Atomwise][15]完成了对两种可以减少一天内Ebola感染的新药物。 +本文接着解释说,AI 和机器学习降低了研发新药的成本和时间。部分得益于广泛的测试,新药进入市场需要 12年 以上的时间。这篇文章说:“机器学习算法可以让计算机根据先前处理的数据来"学习"如何做出预测,或者选择(在某些情况下,甚至是产品)需要做什么实验。类似的算法还可用于预测特定化合物对人体的副作用,这样可以加快审批速度。"这篇文章指出,2015 年旧金山的一个创业公司 [Atomwise][15] 完成了对两种可以减少一天内 Ebola 感染的新药物。 -> AI正在帮助发现、诊断和治疗新疾病。 +> AI 正在帮助发现、诊断和治疗新疾病。 -另外一个位于伦敦的初创公司[BenevolentAI][27]正在利用人工智能寻找科学文献中的模式。这篇文章说:"最近,这家公司找到了两种可能对Alzheimer起作用的化合物,引起了很多制药公司的关注。" +另外一个位于伦敦的初创公司 [BenevolentAI][27] 正在利用人工智能寻找科学文献中的模式。这篇文章说:"最近,这家公司找到了两种可能对 Alzheimer 起作用的化合物,引起了很多制药公司的关注。" -除了有助于研发新药,AI正在帮助发现、诊断和治疗新疾病。TechCrunch上 文章解释说,过去是根据显示的症状诊断疾病,但是现在AI正在被用于检测血液中的疾病特征,并利用对数十亿例临床病例分析进行深度学习获得经验来制定治疗计划。这篇文章说:“IBM的Watson正在与纽约的Memorial Sloan Kettering合作,消化理解数十年来关于癌症患者和治疗方面的数据,为了向治疗疑难的癌症病例的医生提供和建议治疗方案。” +除了有助于研发新药,AI正在帮助发现、诊断和治疗新疾病。TechCrunch 上 文章解释说,过去是根据显示的症状诊断疾病,但是现在 AI 正在被用于检测血液中的疾病特征,并利用对数十亿例临床病例分析进行深度学习获得经验来制定治疗计划。这篇文章说:“IBM 的 Watson 正在与纽约的 Memorial Sloan Kettering 合作,消化理解数十年来关于癌症患者和治疗方面的数据,为了向治疗疑难的癌症病例的医生提供和建议治疗方案。” ### 5. AI正在改变我们的爱情生活 -有195个国家的超过5000万活跃用户通过一个在2012年推出的约会应用程序[Tinder][16]找到潜在的伴侣。在一篇[Forbes采访播客][17]中,Tinder的创始人兼董事长Sean Rad spoke与Steven Bertoni对人工智能是如何正在改变人们约会进行过讨论。在一篇[关于采访的文章][18]中,Bertoni引用了Rad说的话,他说:"可能有这样一个时刻,这时Tinder非常擅长推测你会感兴趣的人,Tinder在组织一次约会中可能会做很多跑腿的工作,对吧?"所以,这个app会向用户推荐一些附近的同伴,并更进一步,协调彼此的时间安排一次约会,而不只是向用户显示一些有可能的同伴。 +有 195 个国家的超过 5000 万活跃用户通过一个在 2012 年推出的约会应用程序 [Tinder][16] 找到潜在的伴侣。在一篇 [Forbes 采访播客][17]中,Tinder 的创始人兼董事长 Sean Rad spoke 与 Steven Bertoni 对人工智能是如何正在改变人们约会进行过讨论。在一篇[关于采访的文章][18]中,Bertoni 引用了 Rad 说的话,他说:"可能有这样一个时刻,这时 Tinder 非常擅长推测你会感兴趣的人,Tinder 在组织一次约会中可能会做很多跑腿的工作,对吧?"所以,这个 app 会向用户推荐一些附近的同伴,并更进一步,协调彼此的时间安排一次约会,而不只是向用户显示一些有可能的同伴。 > 我们的后代真的可能会爱上人工智能。 -你爱上了AI吗?我们的后代真的可能会爱上人工智能。Raya Bidshahri发表在[Singularity Hub][19]的一篇文章《AI将如何重新定义爱情》说,几十年的后,我们可能会认为爱情不再受生物学的限制。 +你爱上了 AI 吗?我们的后代真的可能会爱上人工智能。Raya Bidshahri 发表在 [Singularity Hub][19] 的一篇文章《AI 将如何重新定义爱情》说,几十年的后,我们可能会认为爱情不再受生物学的限制。 -Bidshahri解释说:"我们的技术符合摩尔定律,正在以惊人的速度增长——智能设备正在越来越多地融入我们的生活。",他补充道:"到2029年,我们将会有和人类同等智慧的AI,而到21世纪40年代,AI将会比人类聪明无数倍。许多人预测,有一天我们会与强大的机器合并,我们自己可能会变成人工智能。"他认为在这样一个世界上那些是不可避免的,人们将会接受与完全的非生物相爱。 +Bidshahri 解释说:"我们的技术符合摩尔定律,正在以惊人的速度增长——智能设备正在越来越多地融入我们的生活。",他补充道:"到 2029 年,我们将会有和人类同等智慧的 AI,而到 21 世纪 40 年代,AI 将会比人类聪明无数倍。许多人预测,有一天我们会与强大的机器合并,我们自己可能会变成人工智能。"他认为在这样一个世界上那些是不可避免的,人们将会接受与完全的非生物相爱。 这听起来有点怪异,但是相比较于未来机器人将统治世界,爱上AI会是一个更乐观的结果。Bidshahri说:"对AI进行编程,让他们能够感受到爱,这将使我们创造出更富有同情心的AI,这可能也是避免很多人忧虑的AI大灾难的关键。" -这份AI正在入侵我们生活各领域的其中五个方面的清单仅仅只是涉及到了我们身边的人工智能的表面。哪些AI创新是让你最兴奋的,或者是让你最烦恼的?大家可以在文章评论区写下你们的感受。 +这份 AI 正在入侵我们生活各领域的其中五个方面的清单仅仅只是涉及到了我们身边的人工智能的表面。哪些 AI 创新是让你最兴奋的,或者是让你最烦恼的?大家可以在文章评论区写下你们的感受。 -------------------------------------------------------------------------------- -Rikki Endsley - Rikki Endsley是开源社区Opensource.com的管理员。在过去,她曾做过Red Hat开源和标准(OSAS)团队社区传播者;自由技术记者;USENIX协会的社区管理员;linux权威杂志ADMIN和Ubuntu User的合作出版者,还是杂志Sys Admin和UnixReview.com的主编。在Twitter上关注她:@rikkiends。 +Rikki Endsley - Rikki Endsley 是开源社区 Opensource.com 的管理员。在过去,她曾做过 Red Hat 开源和标准(OSAS)团队社区传播者;自由技术记者;USENIX 协会的社区管理员; linux 权威杂志 ADMIN 和 Ubuntu User 的合作出版者,还是杂志 Sys Admin 和 UnixReview.com 的主编。在 Twitter上关注她:@rikkiends。 via: https://opensource.com/article/17/3/5-big-ways-ai-rapidly-invading-our-lives 作者:[Rikki Endsley ][a] -译者:[译者ID](https://github.com/译者ID) +译者:[zhousiyu325](https://github.com/zhousiyu325) 校对:[jasminepeng](https://github.com/jasminepeng) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 7f2eb3b524387c583069a81fe268005a0b233437 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E5=AE=B6=E6=9C=AA?= Date: Thu, 18 May 2017 22:09:39 +0800 Subject: [PATCH 0116/1407] GitFuture is translating --- ...0170312 OpenGL Go Tutorial Part 2 Drawing the Game Board.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170312 OpenGL Go Tutorial Part 2 Drawing the Game Board.md b/sources/tech/20170312 OpenGL Go Tutorial Part 2 Drawing the Game Board.md index 34012a6ec6..e5a622350f 100644 --- a/sources/tech/20170312 OpenGL Go Tutorial Part 2 Drawing the Game Board.md +++ b/sources/tech/20170312 OpenGL Go Tutorial Part 2 Drawing the Game Board.md @@ -1,3 +1,5 @@ +GitFuture is translating + OpenGL & Go Tutorial Part 2: Drawing the Game Board ============================================================ From 812e8324f7aba53d48b82a26cca923aa0e0d6e8e Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 19 May 2017 08:34:48 +0800 Subject: [PATCH 0117/1407] PRF:20161024 Physical RAM attack can root Android and possibly other devices.md @wcnnbdk1 --- ...root Android and possibly other devices.md | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/translated/talk/20161024 Physical RAM attack can root Android and possibly other devices.md b/translated/talk/20161024 Physical RAM attack can root Android and possibly other devices.md index f9af56131f..aa2143c29d 100644 --- a/translated/talk/20161024 Physical RAM attack can root Android and possibly other devices.md +++ b/translated/talk/20161024 Physical RAM attack can root Android and possibly other devices.md @@ -1,24 +1,24 @@ -针对物理 RAM 的攻击可以取得 Android 设备的根权限,其它设备也存在这样的可能 +Rowhammer:针对物理内存的攻击可以取得 Android 设备的 root 权限 === ->攻击者确实可以在物理存储单元中实现位翻转来达到侵入(这里把 compromise 翻译成了侵入,感觉还是有点词不达意)移动设备与计算机的目的 +> 攻击者确实可以在物理存储单元中实现位翻转来达到侵入移动设备与计算机的目的 ![](http://images.techhive.com/images/idgnsImport/2015/08/id-2969037-security1-100606370-large.jpg) -研究者们发现了一种新的在不利用任何软件漏洞情况下,利用 RAM 芯片物理设计上的弱点来侵入 Android 设备的方式。这种攻击技术同样可以影响到其它如 ARM 和 X86 架构的设备与计算机。 +研究者们发现了一种新的在不利用任何软件漏洞情况下,利用内存芯片物理设计上的弱点来侵入 Android 设备的方式。这种攻击技术同样可以影响到其它如 ARM 和 X86 架构的设备与计算机。 -攻击起源于过去十多年中将更多的 DRAM(动态随机存取存储器)容量封装进越来越小的芯片中,这将导致存储单元在特定情况下电子在相邻的两行中从一边泄漏到另一边。(这里翻译的有点不太通顺,特别是这 row 的概念,只是查看了维基百科有了大致了解,结合起来看可能会更有助理解 https://en.wikipedia.org/wiki/Row_hammer) +这种称之为“Rowhammer”的攻击起源于过去十多年中将更多的 DRAM(动态随机存取存储器)容量封装进越来越小的芯片中,这将导致在特定情况下存储单元电子可以从相邻两row的一边泄漏到另一边。(LCTT 译注:参见 https://en.wikipedia.org/wiki/Row_hammer) -例如,反复且快速的访问相同的物理储存位置 -- 一种被称为 “hammering” (这里 hammering 实在不知道该如何处理,用英文原文似乎也挺好的,在读英文内容的时候也会带来一定的便利)的行为 -- 可以导致相邻位置的位值从 0 反转成 1,或者相反。 +例如,反复且快速的访问相同的物理储存位置,这种被称为 “锤击hammering” 的行为可以导致相邻位置的位值从 0 反转成 1,或者相反。 -虽然这样的电子干扰已经被生产商知晓并且从可靠性角度研究了一段时间了 -- 因为内存错误能够导致系统崩溃 -- 研究者展示了在可控方式的触发下它所存在的严重安全隐患。 +虽然这样的电子干扰已经被生产商知晓并且从可靠性角度研究了一段时间了,因为内存错误能够导致系统崩溃。而研究者们现在展示了在可控方式的触发下它所存在的严重安全隐患。 -在 2015 年 4 月,来自谷歌 Project Zero 项目的研究者公布了两份基于内存 “row hammer” 对于 x86-64 CPU 架构的 [提权利用][7]。其中一份利用可以使代码从谷歌的 Chrome 浏览器沙盒里逃逸并且直接在系统上执行,另一份可以在 Linux 机器上获取高级权限。(这里的 kernel-level 不太确定该如何处理,这个可以参看 https://en.wikipedia.org/wiki/Privilege_level) +在 2015 年 4 月,来自谷歌 Project Zero 项目的研究者公布了两份基于内存 “Rowhammer”漏洞对于 x86-64 CPU 架构的 [提权利用][7]。其中一份利用可以使代码从谷歌的 Chrome 浏览器沙盒里逃逸并且直接在系统上执行,另一份可以在 Linux 机器上获取内核级权限。 此后,其他的研究者进行了更深入的调查并且展示了[通过网站中 JaveScript 脚本进行利用的方式][6]甚至能够影响运行在云环境下的[虚拟服务器][5]。然而,对于这项技术是否可以应用在智能手机和移动设备大量使用的 ARM 架构中还是有疑问的。 -现在,一队成员来自荷兰阿姆斯特丹自由大学,奥地利格拉茨技术大学和加州大学圣塔芭芭拉分校的 VUSec 小组,已经证明了 Rowhammer 不仅仅可以应用在 ARM 架构上并且甚至比在 x86 架构上更容易。 +现在,一队成员来自荷兰阿姆斯特丹自由大学、奥地利格拉茨技术大学和加州大学圣塔芭芭拉分校的 VUSec 小组,已经证明了 Rowhammer 不仅仅可以应用在 ARM 架构上并且甚至比在 x86 架构上更容易。 研究者们将他们的新攻击命名为 Drammer,代表了 Rowhammer 确实存在,并且计划于周三在维也纳举办的第 23 届 ACM 计算机与通信安全大会上展示。这种攻击建立在之前就被发现与实现的 Rowhammer 技术之上。 @@ -28,7 +28,7 @@ VUSec 小组的研究者已经制造了一个适用于 Android 设备的恶意 此外,Drammer 能够与其它的 Android 漏洞组合使用,例如 [Stagefright][4] 或者 [BAndroid][3] 来实现无需用户手动下载恶意应用的远程攻击。 -谷歌已经注意到了这一类型的攻击。“在研究者向漏洞奖励计划(这里应该是特指谷歌的那个吧,不知道把它翻译成中文是否合适)报告了这个问题之后,我们与他们进行了密切的沟通来深入理解这个问题以便我们更好的保护用户,”一位谷歌的代表在一份邮件申明中这样说到。“我们已经开发了一个缓解方案(这里将 mitigation 翻成了缓解方案不知是否妥当,这又是一个有丰富含义的概念 https://en.wikipedia.org/wiki/Vulnerability_management)将会包含在十一月的安全更新中。” +谷歌已经注意到了这一类型的攻击。“在研究者向谷歌漏洞奖励计划报告了这个问题之后,我们与他们进行了密切的沟通来深入理解这个问题以便我们更好的保护用户,”一位谷歌的代表在一份邮件申明中这样说到。“我们已经开发了一个缓解方案,将会包含在十一月的安全更新中。”(LCTT 译注:缓解方案,参见 https://en.wikipedia.org/wiki/Vulnerability_management) VUSec 的研究者认为,谷歌的缓解方案将会使得攻击过程更为复杂,但是它不能修复潜在的问题。 @@ -36,27 +36,25 @@ VUSec 的研究者认为,谷歌的缓解方案将会使得攻击过程更为 更糟的是,研究者们说,由于有许多因素会影响到攻击的成功与否并且这些因素尚未被研究透彻,因此很难去说有哪些设备会被影响到。例如,内存控制器可能会在不同的电量的情况下展现不同的行为,因此一个设备可能在满电的情况下没有风险,当它处于低电量的情况下就是有风险的。 -同样的,在网络安全中有这样一句俗语:Attacks always get getter, they never get worse.(这里借用“道高一尺,魔高一仗。”不知是否合适)Rowhammer 攻击已经从理论变成了变成了现实,同样的他可能也会从现在的简单实现变成确确实实的存在。(这一句凭自己的理解翻的)这意味着今天某个设备是不被影响的,在明天就有可能被改进后的 Rowhammer 技术证明它是存在风险的。 +同样的,在网络安全中有这样一句俗语:攻击将变本加厉,如火如荼Attacks always get getter, they never get worse。Rowhammer 攻击已经从理论变成了现实可能,同样的,它也可能会从现在的现实可能变成确确实实的存在。这意味着今天某个设备是不被影响的,在明天就有可能被改进后的 Rowhammer 技术证明它是存在风险的。 Drammer 在 Android 上实现是因为研究者期望研究基于 ARM 设备的影响,但是潜在的技术可以被使用在所有的架构与操作系统上。新的攻击相较于之前建立在运气与特殊特性与特定平台之上并且十分容易失效的技术已经是一个巨大的进步了。 -Drammer 依靠被大量硬件子系统所使用的 DMA(直接存储访问)缓存,其中包括了图形,网络,声音。Drammer 的实现采用了所有操作系统上都有的 Android 的 ION内存分配器,接口,与方法,这个特征(这里将 warning 翻译成了特征,纯粹是自己的理解,不知是否妥当)是文章中主要的贡献之一。 +Drammer 攻击的实现依靠于被包括图形、网络、声音等大量硬件子系统所使用的 DMA(直接存储访问)缓存。Drammer 的实现采用了所有操作系统上都有的 Android 的 ION 内存分配器、接口与方法,这给我们带来的警示是该论文的主要贡献之一。 -"破天荒的,我们成功的展示了我们可以做到,在不依赖任何特定的特性情况下完全可靠的证明了 Rowhammer,“ VUSec 小组中的其中一位研究者, Cristiano Giuffrida 这样说道。”攻击所利用的内存位置并非是 Android 独有的。攻击在任何的 Linux 平台上都能工作 -- 我们甚至怀疑其它操作系统也可以 -- 因为它利用的是操作系统内核内存管理中固有的特性。“ +“破天荒的,我们成功地展示了我们可以做到,在不依赖任何特定的特性情况下完全可靠的证明了 Rowhammer”, VUSec 小组中的其中一位研究者 Cristiano Giuffrida 这样说道。“攻击所利用的内存位置并非是 Android 独有的。攻击在任何的 Linux 平台上都能工作 -- 我们甚至怀疑其它操作系统也可以 -- 因为它利用的是操作系统内核内存管理中固有的特性。” -”我期待我们可以看到更多针对其它平台的攻击的变种,“阿姆斯特丹自由大学的教授兼 VUSec 系统安全研究小组的领导者,Herbert Bos 补充道。 +“我期待我们可以看到更多针对其它平台的攻击的变种,”阿姆斯特丹自由大学的教授兼 VUSec 系统安全研究小组的领导者 Herbert Bos 补充道。 -在他们的[文章][2]之外,研究者们也释出了一个 Android 应用来测试 Android 设备在受到 Rowhammer 攻击时是否会有风险 -- 在当前所知的技术条件下。应用还没有传上[谷歌应用商店][Google Play],可以从 [VUSec Drammer 网站][1] 下载来手动安装。一个开源的 Rowhammer 模拟器同样能够帮助其他的研究者来更深入的研究这个问题。 +在他们的[论文][2]之外,研究者们也释出了一个 Android 应用来测试 Android 设备在当前所知的技术条件下受到 Rowhammer 攻击时是否会有风险。应用还没有传上谷歌应用商店,可以从 [VUSec Drammer 网站][1] 下载来手动安装。一个开源的 Rowhammer 模拟器同样能够帮助其他的研究者来更深入的研究这个问题。 -------------------------------------------------------------------------------- via:http://www.csoonline.com/article/3134726/security/physical-ram-attack-can-root-android-and-possibly-other-devices.html 作者:[Lucian Constantin][a] - 译者:[wcnnbdk1](https://github.com/wcnnbdk1) - -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 608308528783881d47334fcc89f95ec090e01d83 Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 19 May 2017 08:35:14 +0800 Subject: [PATCH 0118/1407] PUB:20161024 Physical RAM attack can root Android and possibly other devices.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @wcnnbdk1 翻译的很认真! --- ...ical RAM attack can root Android and possibly other devices.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/talk => published}/20161024 Physical RAM attack can root Android and possibly other devices.md (100%) diff --git a/translated/talk/20161024 Physical RAM attack can root Android and possibly other devices.md b/published/20161024 Physical RAM attack can root Android and possibly other devices.md similarity index 100% rename from translated/talk/20161024 Physical RAM attack can root Android and possibly other devices.md rename to published/20161024 Physical RAM attack can root Android and possibly other devices.md From 57e53cf52a4f97d035c34a4182427868f2e25662 Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 19 May 2017 09:15:29 +0800 Subject: [PATCH 0119/1407] translating --- ...70508 4 terminal applications with great command-line UIs.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170508 4 terminal applications with great command-line UIs.md b/sources/tech/20170508 4 terminal applications with great command-line UIs.md index 6294039746..74a675eead 100644 --- a/sources/tech/20170508 4 terminal applications with great command-line UIs.md +++ b/sources/tech/20170508 4 terminal applications with great command-line UIs.md @@ -1,3 +1,5 @@ +translating---geekpi + 4 terminal applications with great command-line UIs ============================================================ From 466f08dd35c13c355bea54ff170718a8acc0ed31 Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 19 May 2017 10:37:34 +0800 Subject: [PATCH 0120/1407] translated --- ...pplications with great command-line UIs.md | 144 ------------------ ...pplications with great command-line UIs.md | 141 +++++++++++++++++ 2 files changed, 141 insertions(+), 144 deletions(-) delete mode 100644 sources/tech/20170508 4 terminal applications with great command-line UIs.md create mode 100644 translated/tech/20170508 4 terminal applications with great command-line UIs.md diff --git a/sources/tech/20170508 4 terminal applications with great command-line UIs.md b/sources/tech/20170508 4 terminal applications with great command-line UIs.md deleted file mode 100644 index 74a675eead..0000000000 --- a/sources/tech/20170508 4 terminal applications with great command-line UIs.md +++ /dev/null @@ -1,144 +0,0 @@ -translating---geekpi - -4 terminal applications with great command-line UIs -============================================================ - -### We look at a few well-designed CLI programs and how they overcome some discoverability problems. - - -![4 awesome command-line tools](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/code_computer_development_programming.png?itok=wMspQJcO "4 awesome command-line tools") ->Image by : opensource.com - -In this article, I'll look at a shortcoming of command-line interfaces—discoverability—and a few ways to overcome this problem. - -I love command lines. My first command line was DOS 6.2, back in 1997\. I learned the syntax for various commands and showed off how to list hidden files in a directory (**attrib**). I would carefully craft my commands one character at a time. When I made a mistake, I would proceed to retype the command from the beginning. One fine day someone showed me how to traverse the history using the up and down arrow keys and I was blown away. - -Programming and development - -* [New Python content][1] - -* [Our latest JavaScript articles][2] - -* [Recent Perl posts][3] - -* [Red Hat Developers Blog][4] - -Later when I was introduced to Linux, I was pleasantly surprised that up and down arrows retained their ability to traverse the history. I was still typing each character meticulously, but by now I knew how to touch type and I was doing exceedingly well with my 55 words per minute. Then someone showed me tab-completion and changed my life once again. - -In GUI applications menus, tool tips and icons are used to advertise a feature for the user. Command lines lack that ability, but there are ways to overcome this problem. Before diving into solutions, I'll look at a couple of problematic CLI apps: - -### 1\. MySQL - -First we have our beloved MySQL REPL. I often find myself typing **SELECT * FROM** and then press **Tab** out of habit. MySQL asks whether I'd like to see all 871 possibilities. I most definitely don't have 871 tables in my database. If I said **yes**, it shows a bunch of SQL keywords, tables, functions, and so on. - -![MySQL gif](https://opensource.com/sites/default/files/mysql.gif) - -### 2\. Python - -Let's look at another example, the standard Python REPL. I start typing a command and press the **Tab** key out of habit. Lo and behold a **Tab** character is inserted, which is a problem considering that a **Tab** character has no business in a Python source code. - -![Python gif](https://opensource.com/sites/default/files/python.gif "Python gif") - -### Good UX - -Now let's look at well-designed CLI programs and how they overcome some discoverability problems. - -### Auto-completion: bpython - -[Bpython][15] is a fancy replacement for the Python REPL. When I launch bpython and start typing, suggestions appear right away. I haven't triggered them via a special key combo, not even the famed **Tab** key. - -![bpython gif](https://opensource.com/sites/default/files/bpython.gif "bpython gif") - -When I press the **Tab** key out of habit, it completes the first suggestion from the list. This is a great example of bringing discoverability to CLI design. - -The next aspect of bpython is the way it surfaces documentation for modules and functions. When I type in the name of a function, it presents the function signature and the doc string attached with the function. What an incredibly thoughtful design. - -### Context-aware completion: mycli - -[Mycli][16] is a modern alternative to the default MySQL client. This tool does to MySQL what bpython does to the standard Python REPL. Mycli will auto-complete keywords, table names, columns, and functions as you type them. - -The completion suggestions are context-sensitive. For example, after the **SELECT * FROM**, only tables from the current database are listed in the completion, rather than every possible keyword under the sun. - -![mycli gif](https://opensource.com/sites/default/files/mycli.gif "mycli gif") - -### Fuzzy search and online Help: pgcli - -If you're looking for a PostgreSQL version of mycli, check out [pgcli][17]. As with mycli, context-aware auto-completion is presented. The items in the menu are narrowed down using fuzzy search. Fuzzy search allows users to type sub-strings from different parts of the whole string to try and find the right match. - -![pgcli gif](https://opensource.com/sites/default/files/pgcli.gif "pgcli gif") - -Both pgcli and mycli implement this feature in their CLI. Documentation for slash commands are presented as part of the completion menu. - -### Discoverability: fish - -In traditional Unix shells (Bash, zsh, etc.), there is a way to search your history. This search mode is triggered by **Ctrl-R**. This is an incredibly useful tool for recalling a command you ran last week that starts with, for example, **ssh** or **docker**. Once you know this feature, you'll find yourself using it often. - -If this feature is so useful, why not do this search all the time? That's exactly what the [**fish** shell][18] does. As soon as you start typing a command, **fish** will start suggesting commands from history that are similar to the one you're typing. You can then press the right arrow key to accept that suggestion. - -### Command-line etiquette - -I've reviewed innovative ways to solve the discoverability problems, but there are command-line basics everyone should implement as part of the basic REPL functionality: - -* Make sure the REPL has a history that can be recalled via the arrow keys. Make sure the history persists between sessions. - -* Provide a way to edit the command in an editor. No matter how awesome your completions are, sometimes users just need an editor to craft that perfect command to drop all the tables in production. - -* Use a pager to pipe the output. Don't make the user scroll through their terminal. Oh, and use sane defaults for your pager. (Add the option to handle color codes.) - -* Provide a way to search the history either via the **Ctrl-R** interface or the **fish**-style auto-search. - -### Conclusion - -In part 2, I'll look at specific libraries in Python that allow you to implement these techniques. In the meantime, check out some of these well-designed command-line applications: - -* [bpython][5] or [ptpython][6]: Fancy REPL for Python with auto-completion support. - -* [http-prompt][7]: An interactive HTTP client. - -* [mycli][8]: A command-line interface for MySQL, MariaDB, and Percona with auto-completion and syntax highlighting. - -* [pgcli][9]: An alternative to [psql][10] with auto-completion and syntax-highlighting. - -* [wharfee][11]: A shell for managing Docker containers. - - _Learn more in Amjith Ramanujam's  [PyCon US 2017][12] talk, [Awesome Commandline Tools][13], May 20th in Portland, Oregon._ - --------------------------------------------------------------------------------- - - -作者简介: - -Amjith Ramanujam - Amjith Ramanujam is the creator of pgcli and mycli. People think they're pretty cool and he doesn't disagree. He likes programming in Python, Javascript and C. He likes to write simple, understandable code, sometimes he even succeeds. - ------------------------ - -via: https://opensource.com/article/17/5/4-terminal-apps - -作者:[Amjith Ramanujam ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/amjith -[1]:https://opensource.com/tags/python?src=programming_resource_menu -[2]:https://opensource.com/tags/javascript?src=programming_resource_menu -[3]:https://opensource.com/tags/perl?src=programming_resource_menu -[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu -[5]:http://bpython-interpreter.org/ -[6]:http://github.com/jonathanslenders/ptpython/ -[7]:https://github.com/eliangcs/http-prompt -[8]:http://mycli.net/ -[9]:http://pgcli.com/ -[10]:https://www.postgresql.org/docs/9.2/static/app-psql.html -[11]:http://wharfee.com/ -[12]:https://us.pycon.org/2017/ -[13]:https://us.pycon.org/2017/schedule/presentation/518/ -[14]:https://opensource.com/article/17/5/4-terminal-apps?rate=3HL0zUQ8_dkTrinonNF-V41gZvjlRP40R0RlxTJQ3G4 -[15]:https://bpython-interpreter.org/ -[16]:http://mycli.net/ -[17]:http://pgcli.com/ -[18]:https://fishshell.com/ -[19]:https://opensource.com/user/125521/feed -[20]:https://opensource.com/article/17/5/4-terminal-apps#comments -[21]:https://opensource.com/users/amjith diff --git a/translated/tech/20170508 4 terminal applications with great command-line UIs.md b/translated/tech/20170508 4 terminal applications with great command-line UIs.md new file mode 100644 index 0000000000..822a67ddc7 --- /dev/null +++ b/translated/tech/20170508 4 terminal applications with great command-line UIs.md @@ -0,0 +1,141 @@ +4 个拥有漂亮命令行 UI 的终端程序 +============================================================ + +### 我们来看几个精心设计的 CLI 程序,以及如何克服一些可发现的问题。 + +![4 awesome command-line tools](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/code_computer_development_programming.png?itok=wMspQJcO "4 awesome command-line tools") +>图片提供: opensource.com + +在本文中,我会指出命令行界面的可见缺点以及克服这些问题的几种方法。 + +我喜欢命令行。我第一次接触命令行是在 1997 的 DOS 6.2 上。我学习了各种命令的语法,并展示了如何在目录中列出隐藏的文件(**attrib**)。我会每次仔细检查命令中的每个字符。 当我犯了一个错误,我会从头开始重新输入命令。有一天,有人向我展示了如何使用向上和向下箭头按键遍历历史,我被震惊了。 + +编程和开发 + +* [新的 Python 内容][1] + +* [我们最新的 JavaScript 文章][2] + +* [最近的 Perl 帖子][3] + +* [红帽开发者博客][4] + +后来当我被介绍 Linux 时,让我感到惊喜的是,上下箭头保留了它们遍历历史记录的能力。我仍然仔细地打字,但到现在为止,我了解如何输入,并且我能以每分钟 55 个单词的速度做的很好。接着有人向我展示了 tab 键,并再次改变了我的生活。 + +在 GUI 应用程序菜单中,工具提示和图标向用户展示功能。命令行缺乏这种能力,但有办法克服这个问题。在深入解决方案之前,我会来看看几个有问题的 CLI 程序: + +### 1\. MySQL + +首先我们有我们所钟爱的 MySQL REPL。我经常发现自己在输入 **SELECT * FROM** 然后按 **Tab** 的习惯。MySQL 会询问我是否想看到所有的 871 中可能性。我的数据库中绝对没有 871 张表。如果我选择 **yes**,它会显示一堆 SQL 关键字、表、函数等。 + +![MySQL gif](https://opensource.com/sites/default/files/mysql.gif) + +### 2\. Python + +我们来看另一个例子,标准的 Python REPL。我开始输入命令,然后习惯按 **Tab** 键。瞧,插入了一个 **Tab** 字符,考虑到 **Tab** 在 Python 中没有作用,这是一个问题。 + +![Python gif](https://opensource.com/sites/default/files/python.gif "Python gif") + +### 好的 UX + +让我看下设计良好的 CLI 程序以及它们是如何克服这些可见问题的。 + +### 自动补全: bpython + +[Bpython][15] 是对 Python REPL 的一个很好的替代。当我运行 bpython 并开始输入时,建议会立即出现。我没用通过特殊的键盘绑定触发它,甚至没有按下 **Tab** 键。 + +![bpython gif](https://opensource.com/sites/default/files/bpython.gif "bpython gif") + +当我出于习惯按下 **Tab** 键时,它会用列表中的第一个建议补全。这是给 CLI 设计带来可见性的一个很好的例子。 + +bpython 另一方面可以展示模块和函数的文档。当我输入一个函数的名字时,它会显示函数签名以及这个函数附带的文档字符串。这是一个多么令人难以置信的周到设计啊。 + +### 上下文感知补全:mycli + +[Mycli][16]是默认的 MySQL 客户端的现代替代品。这个工具对 MySQL 来说就像 bpython 对标准 Python REPL 做的那样。Mycli 将在你输入时自动补全关键字、表名、列和函数。 + +补全建议是上下文相关的。例如,在 **SELECT * FROM** 之后,只有来自当前数据库的表才会列出,而不是所有可能的关键字。 + +![mycli gif](https://opensource.com/sites/default/files/mycli.gif "mycli gif") + +### 模糊搜索和在线帮助: pgcli + +如果您正在寻找 PostgreSQL 版本的 mycli,请查看 [pgcli][17]。 与 mycli 一样,它提供了上下文感知的自动补全。菜单中的项使用模糊搜索缩小。模糊搜索允许用户输入整体字符串中的任意子字符串来尝试找到正确的匹配项。 + +![pgcli gif](https://opensource.com/sites/default/files/pgcli.gif "pgcli gif") + +pgcli 和 mycli 同时在 CLI 中实现了这个功能。斜杠命令的文档也作为补全菜单的一部分展示。 + +### 可发现性: fish + +在传统的 Unix shell(Bash、zsh 等)中,有一种搜索历史记录的方法。此搜索模式由 **Ctrl-R** 触发。当在再次调用你上周运行的命令时,这是一个令人难以置信的有用的工具,例如 **ssh**或 **docker**。 一旦你知道这个功能,你会发现自己经常使用它。 + +如果这个功能是如此有用,那为什么不每次都搜索呢?这正是 [**fish** shell][18] 所做的。一旦你开始输入命令,**fish** 将开始建议与历史记录类似的命令。然后,你可以按右箭头键接受该建议。 + +### 命令行规矩 + +我已经回顾了一些创新的方法来解决可见的问题,但也有一些命令行的基础知识, 每个人都应该作为基本的 repl 功能的一部分来执行: + +* 确保 REPL 有可通过箭头键调用的历史记录。确保会话之间的历史持续存在。 + +* 提供在编辑器中编辑命令的方法。不管你的补全是多么棒,有时用户只需要一个编辑器来制作完美的命令来删除生产环境中所有的表。 + +* 使用 pager 来管道输出。不要让用户滚动他们的终端。哦,并为 pager 使用合理的默认值。(添加选项来处理颜色代码。) + +* 提供一种通过 **Ctrl-R** 界面或者 **fish** 样式的自动搜索来搜索历史记录的方法。 + +### 总结 + +在第 2 部分中,我将来看看 Python 中使你能够实现这些技术的特定库。同时,请查看其中一些精心设计的命令行应用程序: + +* [bpython][5]或 [ptpython][6]:具有自动补全支持的 Python REPL。 + +* [http-prompt][7]:交互式 HTTP 客户端。 + +* [mycli][8]:MySQL、MariaDB 和 Percona 的命令行界面,具有自动补全和语法高亮。 + +* [pgcli][9]:具有自动补全和语法高亮,是对 [psql][10] 的替代工具。 + +* [wharfee][11]:用于管理 Docker 容器的 shell。 + +_在这了解 Amjith Ramanujam 更多的在 5 月 20 日在波特兰俄勒冈州举办的 [PyCon US 2017][12] 上的谈话“[令人敬畏的命令行工具][13]”。_ + +-------------------------------------------------------------------------------- + + +作者简介: + +Amjith Ramanujam - Amjith Ramanujam 是 pgcli 和 mycli 的创始人。人们认为它们很酷,他并不反对。他喜欢用 Python、Javascript 和 C 编程。他喜欢编写简单易懂的代码,它们有时甚至会成功。 + +----------------------- + +via: https://opensource.com/article/17/5/4-terminal-apps + +作者:[Amjith Ramanujam ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/amjith +[1]:https://opensource.com/tags/python?src=programming_resource_menu +[2]:https://opensource.com/tags/javascript?src=programming_resource_menu +[3]:https://opensource.com/tags/perl?src=programming_resource_menu +[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu +[5]:http://bpython-interpreter.org/ +[6]:http://github.com/jonathanslenders/ptpython/ +[7]:https://github.com/eliangcs/http-prompt +[8]:http://mycli.net/ +[9]:http://pgcli.com/ +[10]:https://www.postgresql.org/docs/9.2/static/app-psql.html +[11]:http://wharfee.com/ +[12]:https://us.pycon.org/2017/ +[13]:https://us.pycon.org/2017/schedule/presentation/518/ +[14]:https://opensource.com/article/17/5/4-terminal-apps?rate=3HL0zUQ8_dkTrinonNF-V41gZvjlRP40R0RlxTJQ3G4 +[15]:https://bpython-interpreter.org/ +[16]:http://mycli.net/ +[17]:http://pgcli.com/ +[18]:https://fishshell.com/ +[19]:https://opensource.com/user/125521/feed +[20]:https://opensource.com/article/17/5/4-terminal-apps#comments +[21]:https://opensource.com/users/amjith From e8c94f4a7878b4a2f7b393f882e134eb6b0b487a Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 19 May 2017 11:19:09 +0800 Subject: [PATCH 0121/1407] PRF&PUB:20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @ictlyh 翻译的很好很专业~ https://linux.cn/article-8524-1.html --- ...g Engine API with Golang and PostgreSQL.md | 33 ++++++++++--------- 1 file changed, 18 insertions(+), 15 deletions(-) rename {translated/tech => published}/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md (89%) diff --git a/translated/tech/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md b/published/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md similarity index 89% rename from translated/tech/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md rename to published/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md index 062681cd70..b2056c95e9 100644 --- a/translated/tech/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md +++ b/published/20170101 GraphQL In Use Building a Blogging Engine API with Golang and PostgreSQL.md @@ -9,15 +9,15 @@ GraphQL 在生产环境中似乎难以使用:虽然对于建模功能来说图 * 三种类型的资源(用户、博文以及评论)支持多种功能(创建用户、创建博文、给博文添加评论、关注其它用户的博文和评论,等等。) * 使用 PostgreSQL 作为后端数据存储(选择它因为它是一个流行的关系型数据库)。 -* 使用 Golang(开发 API 的一个流行语言)进行 API 实现。 +* 使用 Golang(开发 API 的一个流行语言)实现 API。 我们会比较简单的 GraphQL 实现和纯 REST 替代方案,在一种普通场景(呈现博客文章页面)下对比它们的实现复杂性和效率。 ### 介绍 -GraphQL 是一种 IDL(Interface Definition Language,接口定义语言),设计者定义数据类型和并把数据建模为一个图。每个顶点都是一种数据类型的一个实例,边代表了节点之间的关系。这种方式非常灵活,能适应任何业务领域。然而,问题是设计过程更加复杂,而且传统的数据存储不能很好地映射到图模型。阅读_附录1_了解更多关于这个问题的详细信息。 +GraphQL 是一种 IDL(Interface Definition Language,接口定义语言),设计者定义数据类型和并把数据建模为一个图(graph)。每个顶点都是一种数据类型的一个实例,边代表了节点之间的关系。这种方式非常灵活,能适应任何业务领域。然而,问题是设计过程更加复杂,而且传统的数据存储不能很好地映射到图模型。阅读_附录1_了解更多关于这个问题的详细信息。 -GraphQL 在 2014 年由 Facebook 的工程师团队首次提出。尽管它的优点和功能非常有趣而且引人注目,它并没有得到大规模应用。开发者需要权衡 REST 的设计简单性、熟悉性、丰富的工具和 GraphQL 不会受限于 CRUD(LCTT 译注:Create、Read、Update、Delete) 以及网络性能(它优化了往返服务器的网络)的灵活性。 +GraphQL 在 2014 年由 Facebook 的工程师团队首次提出。尽管它的优点和功能非常有趣而且引人注目,但它并没有得到大规模应用。开发者需要权衡 REST 的设计简单性、熟悉性、丰富的工具和 GraphQL 不会受限于 CRUD(LCTT 译注:Create、Read、Update、Delete) 以及网络性能(它优化了往返服务器的网络)的灵活性。 大部分关于 GraphQL 的教程和指南都跳过了从数据存储获取数据以便解决查询的问题。也就是,如何使用通用目的、流行存储方案(例如关系型数据库)为 GraphQL API 设计一个支持高效数据提取的数据库。 @@ -37,7 +37,7 @@ GraphQL 在 2014 年由 Facebook 的工程师团队首次提出。尽管它的 ### 在 GraphQL 中建模一个博客引擎 -_列表1_包括了博客引擎 API 的全部模式。它显示了组成图的顶点的数据类型。顶点之间的关系,也就是边,被建模为指定类型的属性。 +下述_列表1_包括了博客引擎 API 的全部模式。它显示了组成图的顶点的数据类型。顶点之间的关系,也就是边,被建模为指定类型的属性。 ``` type User { @@ -86,7 +86,7 @@ type Mutation { _列表1_ -模式使用 GraphQL DSL 编写,它用于定义自定义数据类型,例如 `User`、`Post` 和 `Comment`。该语言也提供了一系列原始数据类型,例如 `String`、`Boolean` 和 `ID`(是`String` 的别名,但是有顶点唯一标识符的额外语义)。 +模式使用 GraphQL DSL 编写,它用于定义自定义数据类型,例如 `User`、`Post` 和 `Comment`。该语言也提供了一系列原始数据类型,例如 `String`、`Boolean` 和 `ID`(它是`String` 的别名,但是有顶点唯一标识符的额外语义)。 `Query` 和 `Mutation` 是语法解析器能识别并用于查询图的可选类型。从 GraphQL API 读取数据等同于遍历图。需要提供这样一个起始顶点;该角色通过 `Query` 类型来实现。在这种情况中,所有图的查询都要从一个由 id `user(id:ID!)` 指定的用户开始。对于写数据,定义了 `Mutation` 顶点。它提供了一系列操作,建模为能遍历(并返回)新创建顶点类型的参数化属性。_列表2_是这些查询的一些例子。 @@ -99,7 +99,7 @@ _列表1_ * 也可以把它们组合起来,例如 `[Comment!]!` 表示一个非空 Comment 顶点链表,其中 `[]`、`[Comment]` 是有效的,但 `null, [null], [Comment, null]` 就不是。 -_列表2_ 包括一系列用于博客 API 的 _curl_ 命令,它们会使用 mutation 填充图然后查询图以便获取数据。要运行它们,按照 [topliceanu/graphql-go-example][3] 仓库中的指令编译并运行服务。 +_列表2_ 包括一系列用于博客 API 的 `curl` 命令,它们会使用 mutation 填充图然后查询图以便获取数据。要运行它们,按照 [topliceanu/graphql-go-example][3] 仓库中的指令编译并运行服务。 ``` # 创建用户 1、2 和 3 的更改。更改和查询类似,在该情景中我们检索新创建用户的 id 和 email。 @@ -143,7 +143,10 @@ _列表2_ ### 设计 PostgreSQL 数据库 -关系型数据库的设计,一如以往,由避免数据冗余的需求驱动。选择该方式有两个原因:1\. 表明实现 GraphQL API 不需要定制化的数据库技术或者学习和使用新的设计技巧。2\. 表明 GraphQL API 能在现有的数据库之上创建,更具体地说,最初设计用于 REST 后端甚至传统的呈现 HTML 站点的服务器端数据库。 +关系型数据库的设计,一如以往,由避免数据冗余的需求驱动。选择该方式有两个原因: + +1. 表明实现 GraphQL API 不需要定制化的数据库技术或者学习和使用新的设计技巧。 +2. 表明 GraphQL API 能在现有的数据库之上创建,更具体地说,最初设计用于 REST 后端甚至传统的呈现 HTML 站点的服务器端数据库。 阅读 _附录1_ 了解关于关系型和图数据库在构建 GraphQL API 方面的区别。_列表3_ 显示了用于创建新数据库的 SQL 命令。数据库模式和 GraphQL 模式相对应。为了支持 `follow/unfollow` 更改,需要添加 `followers` 关系。 @@ -176,7 +179,7 @@ _列表3_ ### Golang API 实现 -本项目使用的用 Go 实现的 GraphQL 语法解析器是 `github.com/graphql-go/graphql`。它包括一个查询解析器,但不包括模式解析器。这要求开发者利用库提供的结构使用 Go 构建 GraphQL 模式。这和 [nodejs 实现][3] 不同,后者提供了一个模式解析器并为数据获取暴露了钩子。因此 `列表1` 中的模式只是作为指导使用,需要转化为 Golang 代码。然而,这个_“限制”_提供了与抽象级别对等的机会,并且了解模式如何和用于检索数据的图遍历模型相关。_列表4_ 显示了 `Comment` 顶点类型的实现: +本项目使用的用 Go 实现的 GraphQL 语法解析器是 `github.com/graphql-go/graphql`。它包括一个查询解析器,但不包括模式解析器。这要求开发者利用库提供的结构使用 Go 构建 GraphQL 模式。这和 [nodejs 实现][3] 不同,后者提供了一个模式解析器并为数据获取暴露了钩子。因此 _列表1_ 中的模式只是作为指导使用,需要转化为 Golang 代码。然而,这个_“限制”_提供了与抽象级别对等的机会,并且了解模式如何和用于检索数据的图遍历模型相关。_列表4_ 显示了 `Comment` 顶点类型的实现: ``` var CommentType = graphql.NewObject(graphql.ObjectConfig{ @@ -348,9 +351,9 @@ _列表5_ 对于这种情况,对数据库的查询次数是故意相同的,但是到 API 服务器的 HTTP 请求已经减少到只有一个。我们认为在这种类型的应用程序中通过互联网的 HTTP 请求是最昂贵的。 -为了获取 GraphQL 的优势,后端并不需要进行特别设计,从 REST 到 GraphQL 的转换可以逐步完成。这使得可以测量性能提升和优化。从这一点,API 设计者可以开始优化(潜在的合并) SQL 查询从而提高性能。缓存的机会在数据库和 API 级别都大大增加。 +为了利用 GraphQL 的优势,后端并不需要进行特别设计,从 REST 到 GraphQL 的转换可以逐步完成。这使得可以测量性能提升和优化。从这一点,API 设计者可以开始优化(潜在的合并) SQL 查询从而提高性能。缓存的机会在数据库和 API 级别都大大增加。 -SQL 之上的抽象(例如 ORM 层)通常会和 `n+1` 问题想抵触。在 REST 事例的步骤 4 中,客户端可能不得不在单独的请求中为每个评论的作者请求关注状态。这是因为在 REST 中没有标准的方式来表达两个以上资源之间的关系,而 GraphQL 旨在通过使用嵌套查询来防止这类问题。这里我们通过获取用户的所有关注者进行欺骗。我们向客户推荐确定评论和关注作者用户的逻辑。 +SQL 之上的抽象(例如 ORM 层)通常会和 `n+1` 问题相抵触。在 REST 示例的步骤 4 中,客户端可能不得不在单独的请求中为每个评论的作者请求关注状态。这是因为在 REST 中没有标准的方式来表达两个以上资源之间的关系,而 GraphQL 旨在通过使用嵌套查询来防止这类问题。这里我们通过获取用户的所有关注者来作弊。我们向客户提出了如何确定评论并关注了作者的用户的逻辑。 另一个区别是获取比客户端所需更多的数据,以免破坏 REST 资源抽象。这对于用于解析和存储不需要数据的带宽消耗和电池寿命非常重要。 @@ -358,7 +361,7 @@ SQL 之上的抽象(例如 ORM 层)通常会和 `n+1` 问题想抵触。在 GraphQL 是 REST 的一个可用替代方案,因为: -* 尽管设计 API 更加困难,该过程可以逐步完成。也是由于这个原因,从 REST 转换到 GraphQL 非常容易,两个流程可以没有任何问题地共存。 +* 尽管设计 API 更加困难,但该过程可以逐步完成。也是由于这个原因,从 REST 转换到 GraphQL 非常容易,两个流程可以没有任何问题地共存。 * 在网络请求方面更加高效,即使是类似本博客中的简单实现。它还提供了更多查询优化和结果缓存的机会。 * 在用于解析结果的带宽消耗和 CPU 周期方面它更加高效,因为它只返回呈现页面所需的数据。 @@ -370,15 +373,15 @@ REST 仍然非常有用,如果: ### 附录1:图数据库和高效数据存储 -尽管将应用领域数据想象为一个图非常直观,正如这篇博文介绍的那样,但是支持这种接口的高效数据存储问题仍然没有解决。 +尽管将其应用领域数据想象为一个图非常直观,正如这篇博文介绍的那样,但是支持这种接口的高效数据存储问题仍然没有解决。 近年来图数据库变得越来越流行。通过将 GraphQL 查询转换为特定的图数据库查询语言从而延迟解决请求的复杂性似乎是一种可行的方案。 -问题是和关系型数据库相比图并不是一种高效的数据结构。图中一个顶点可能有到任何其它顶点的连接,访问模式比较难以预测因此提供了较少的优化机会。 +问题是和关系型数据库相比,图并不是一种高效的数据结构。图中一个顶点可能有到任何其它顶点的连接,访问模式比较难以预测因此提供了较少的优化机会。 例如缓存的问题,为了快速访问需要将哪些顶点保存在内存中?通用缓存算法在图遍历场景中可能没那么高效。 -数据库分片问题:把数据库切分为更小、没有交叉的数据库并保存到独立的硬件。在学术上,最小切割的图划分问题已经得到了很好的理解,但可能是次优的而且由于病态的最坏情况可能导致高度不平衡切割。 +数据库分片问题:把数据库切分为更小、没有交叉的数据库并保存到独立的硬件。在学术上,最小切割的图划分问题已经得到了很好的理解,但可能是次优的,而且由于病态的最坏情况可能导致高度不平衡切割。 在关系型数据库中,数据被建模为记录(行或者元组)和列,表和数据库名称都只是简单的命名空间。大部分数据库都是面向行的,意味着每个记录都是一个连续的内存块,一个表中的所有记录在磁盘上一个接一个地整齐地打包(通常按照某个关键列排序)。这非常高效,因为这是物理存储最优的工作方式。HDD 最昂贵的操作是将磁头移动到磁盘上的另一个扇区,因此最小化此类访问非常重要。 @@ -392,7 +395,7 @@ via: http://alexandrutopliceanu.ro/post/graphql-with-go-and-postgresql 作者:[Alexandru Topliceanu][a] 译者:[ictlyh](https://github.com/ictlyh) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From ecd212234c7ba87d6656ac6c0e4eaaf9ada0de53 Mon Sep 17 00:00:00 2001 From: chenxinlong <237448382@qq.com> Date: Fri, 19 May 2017 23:35:14 +0800 Subject: [PATCH 0122/1407] translated by chenxinlong --- .../tech/20170317 AWS cloud terminology.md | 219 ------------------ .../tech/20170317 AWS cloud terminology.md | 218 +++++++++++++++++ 2 files changed, 218 insertions(+), 219 deletions(-) delete mode 100644 sources/tech/20170317 AWS cloud terminology.md create mode 100644 translated/tech/20170317 AWS cloud terminology.md diff --git a/sources/tech/20170317 AWS cloud terminology.md b/sources/tech/20170317 AWS cloud terminology.md deleted file mode 100644 index 8cdcb0af89..0000000000 --- a/sources/tech/20170317 AWS cloud terminology.md +++ /dev/null @@ -1,219 +0,0 @@ -translating by chenxinlong -AWS cloud terminology -============================================================ - -* * * - - ![AWS Cloud terminology](http://cdn2.kerneltalks.com/wp-content/uploads/2017/03/AWS-Cloud-terminology-150x150.png) - - _Understand AWS cloud terminology of 71 services! Get acquainted with terms used in AWS world to start with your AWS cloud career!_ - -* * * - -AWS i.e. Amazon Web Services is cloud platform providing list of web services on pay per use basis. Its one of the famous cloud platform to date. Due to flexibility, availability, elasticity, scalability and no-maintenance many corporate are moving to cloud.  Since many companies using these services its become necessary that sysadmin or devOps should be aware of AWS. - -This article aims at listing services provided by AWS and explaining terminology used in AWS world. - -As of today, AWS offers total of 71 services which are grouped together in 17 groups as below : - -* * * - - _Compute_ - -Its a cloud computing means virtual server provisioning. This group provides below services. - -1. EC2 : EC2 stands for Elastic Compute Cloud. This service provides you scalable [virtual machines per your requirement.][11] -2. EC2 container service : Its high performance, high scalable which allows running services on EC2 clustered environment -3. Lightsail : This service enables user to launch and manage virtual servers (EC2) very easily. -4. Elastic Beanstalk : This service manages capacity provisioning, load balancing, scaling, health monitoring of your application automatically thus reducing your management load. -5. Lambda : It allows to run your code only when needed without managing servers for it. -6. Batch : It enables users to run computing workloads (batches) in customized managed way. - -* * * - - _Storage_ - -Its a cloud storage i.e. cloud storage facility provided by Amazon. This group includes : - -1. S3 : S3 stands for Simple Storage Service (3 times S). This provides you online storage to store/retrive any data at any time, from anywhere. -2. EFS : EFS stands for Elastic File System. Its a online storage which can be used with EC2 servers. -3. Glacier : Its a low cost/slow performance data storage solution mainly aimed at archives or long term backups. -4. Storage Gateway : Its interface which connects your on-premise applications (hosted outside AWS) with AWS storage. - -* * * - - _Database_ - -AWS also offers to host databases on their Infra so that client can benefit with cutting edge tech Amazon have for faster/efficient/secured data processing. This group includes : - -1. RDS : RDS stands for Relational Database Service. Helps to setup, operate, manage relational database on cloud. -2. DynamoDB : Its noSQL database providing fast processing and high scalability. -3. ElastiCache : Its a way to manage in-memory cache for your web application to run them faster! -4. Redshift : Its a huge (petabyte-size) fully scalable, data warehouse service in cloud. - -* * * - - _Networking & Content Delivery_ - -As AWS provides cloud EC2 server, its corollary that networking will be in picture too. Content delivery is used to serve files to users from their geographically nearest location. This is pretty much famous for speeding up websites now a days. - -1. VPC : VPC stands for Virtual Private Cloud. Its your very own virtual network dedicated to your AWS account. -2. CloudFront : Its content delivery network by AWS. -3. Direct Connect : Its a network way of connecting your datacenter/premises with AWS to increase throughput, reduce network cost and avoid connectivity issues which may arise due to internet-based connectivity. -4. Route 53 : Its a cloud domain name system DNS web service. - -* * * - - _Migration_ - -Its a set of services to help you migrate from on-premises services to AWS. It includes : - -1. Application Discovery Service : A service dedicated to analyse your servers, network, application to help/speed up migration. -2. DMS : DMS stands for Database Migration Service. It is used to migrate your data from on-premises DB to RDS or DB hosted on EC2. -3. Server Migration : Also called as SMS (Server Migration Service) is a agentless service which moves your workloads from on-premises to AWS. -4. Snowball :  Intended to use when you want to transfer huge amount of data in/out of AWS using physical storage appliances (rather than internet/network based transfers) - -* * * - - _Developer Tools_ - -As name suggest, its a group of services helping developers to code easy/better way on cloud. - -1. CodeCommit : Its a secure, scalable, managed source control service to host code repositories. -2. CodeBuild : Code builder on cloud. Executes, tests codes and build software packages for deployments. -3. CodeDeploy : Deployment service to automate application deployments on AWS servers or on-premises. -4. CodePipeline : This deployment service enables coders to visualize their application before release. -5. X-Ray : Analyse applications with event calls. - -* * * - - _Management Tools_ - -Group of services which helps you manage your web services in AWS cloud. - -1. CloudWatch : Monitoring service to monitor your AWS resources or applications. -2. CloudFormation : Infrastructure as a code! Its way of managing AWS relative infra in collective and orderly manner. -3. CloudTrail : Audit & compliance tool for AWS account. -4. Config : AWS resource inventory, configuration history, and configuration change notifications to enable security and governance. -5. OpsWorks : Automation to configure, deploy EC2 or on-premises compute -6. Service Catalog : Create and manage IT service catalogs which are approved to use in your/company account -7. Trusted Advisor : Its AWS AI helping you to have better, money saving AWS infra by inspecting your AWS Infra. -8. Managed Service : Provides ongoing infra management - -* * * - - _Security, Identity & compliance_ - -Important group of AWS services helping you secure your AWS space. - -1. IAM : IAM stands for Identity and Access Management. Controls user access to your AWS resources and services. -2. Inspector : Automated security assessment helping you to secure and compliance your apps on AWS. -3. Certificate Manager : Provision, manage and deploy SSL/TLS certificates for AWS applications. -4. Directory Service : Its Microsoft Active Directory for AWS. -5. WAF & Shield : WAF stands for Web Application Firewall. Monitors and controls access to your content on CloudFront or Load balancer. -6. Compliance Reports : Compliance reporting of your AWS infra space to make sure your apps an dinfra are compliant to your policies. - -* * * - - _Analytics_ - -Data analytics of your AWS space to help you see, plan, act on happenings in your account. - -1. Athena : Its a SQL based query service to analyse S3 stored data. -2. EMR : EMR stands for Elastic Map Reduce. Service for big data processing and analysis. -3. CloudSearch : Search capability of AWS within application and services. -4. Elasticsearch Service : To create a domain and deploy, operate, and scale Elasticsearch clusters in the AWS Cloud -5. Kinesis : Streams large amount of data in real time. -6. Data Pipeline : Helps to move data between different AWS services. -7. QuickSight : Collect, analyse and present insight of business data on AWS. - -* * * - - _Artificial Intelligence_ - -AI in AWS! - -1. Lex : Helps to build conversational interfaces in application using voice and text. -2. Polly : Its a text to speech service. -3. Rekognition : Gives you ability to add image analysis to applications -4. Machine Learning : It has algorithms to learn patterns in your data. - -* * * - - _Internet of Things_ - -This service enables AWS highly available on different devices. - -1. AWS IoT : It lets connected hardware devices to interact with AWS applications. - -* * * - - _Game Development_ - -As name suggest this services aims at Game Development. - -1. Amazon GameLift : This service aims for deplyoing, managing dedicated gaming servers for session based multiplayer games. - -* * * - - _Mobile Services_ - -Group of services mainly aimed at handheld devices - -1. Mobile Hub : Helps you to create mobile app backend features and integrate them to mobile apps. -2. Cognito : Controls mobile user’s authentication and access to AWS on internet connected devices. -3. Device Farm : Mobile app testing service enables you to test apps across android, iOS on real phones hosted by AWS. -4. Mobile Analytics : Measure, track and analyze mobile app data on AWS. -5. Pinpoint : Targeted push notification and mobile engagements. - -* * * - - _Application Services_ - -Its a group of services which can be used with your applications in AWS. - -1. Step Functions : Define and use various functions in your applications -2. SWF : SWF stands for Simple Workflow Service. Its cloud workflow management helps developers to co-ordinate and contribute at different stages of application life cycle. -3. API Gateway : Helps developers to create, manage, host APIs -4. Elastic Transcoder : Helps developers to converts media files to play of various devices. - -* * * - - _Messaging_ - -Notification and messaging services in AWS - -1. SQS : SQS stands for Simple Queue Service. Fully managed messaging queue service to communicate between services and apps in AWS. -2. SNS : SNS stands for Simple Notification Service. Push notification service for AWS users to alert them about their services in AWS space. -3. SES : SES stands for Simple Email Service. Its cost effective email service from AWS for its own customers. - -* * * - - _Business Productivity_ - -Group of services to help boost your business productivity. - -1. WorkDocs : Collaborative file sharing, storing and editing service. -2. WorkMail : Secured business mail, calendar service -3. Amazon Chime : Online business meetings! - -* * * - - _Desktop & App Streaming_ - -Its desktop app streaming over cloud. - -1. WorkSpaces : Fully managed, secured desktop computing service on cloud -2. AppStream 2.0 : Stream desktop applications from cloud. - --------------------------------------------------------------------------------- - -via: http://kerneltalks.com/virtualization/aws-cloud-terminology/ - -作者:[Shrikant Lavhate][a] -译者:[chenxinlong](https://github.com/chenxinlong) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://kerneltalks.com/virtualization/aws-cloud-terminology/ diff --git a/translated/tech/20170317 AWS cloud terminology.md b/translated/tech/20170317 AWS cloud terminology.md new file mode 100644 index 0000000000..70ac2ed820 --- /dev/null +++ b/translated/tech/20170317 AWS cloud terminology.md @@ -0,0 +1,218 @@ +AWS 云服务的相关术语 +============================================================ + +* * * + + ![AWS Cloud terminology](http://cdn2.kerneltalks.com/wp-content/uploads/2017/03/AWS-Cloud-terminology-150x150.png) + + _认识 71 个 AWS 云服务的术语 ! 通过了解 AWS 世界中使用的术语开始你的 AWS 云服务使用生涯 !_ + +* * * + +AWS i.e. 亚马逊 web 服务是一个提供了一系列按使用计费的 web 服务的云平台。 它是迄今为止最为著名的云平台之一。由于其灵活性、有效性、弹性、可测量性和无须维护,所以有一些企业正逐步把他们的业务迁移到云端。 由于许多公司目前在使用这些服务,所以对于系统管理员和运维人员来说应该了解一下 AWS。 + +这篇文章旨在列出这些 AWS 提供的服务并且解释在 AWS 中出现的术语。 + +截止到目前为止(2017 年 3 月),AWS 提供了共计 71 种并分为 17 组服务: + +* * * + + _计算型服务_ + +这是一个提供了虚拟服务器配置功能的服务即所谓的云计算。它提供了包括以下这一系列的服务。 + +1. EC2 : EC2 代表弹性计算云。这种服务提供了可根据个人需求扩展的 [虚拟机][11] +2. EC2 容器服务 : 其高性能,高可扩展性使其可在 EC2 集群环境中运行服务 +3. Lightsail : 该服务使用户非常容易地启动和管理虚拟服务器(EC2)。 +4. Elastic Beanstalk : 该服务能够自动管理你的应用程序的容量配置、负载平衡、扩展以及健康监控从而减少你的管理负载。 +5. Lambda : 它允许你只在你需要的时候运行代码而不用去管理服务器。 +6. Batch : 它使用户能够以自定义的管理方式运行计算工作负载(批处理)。 + +* * * + + _存储型服务_ + +它是一种云存储服务,即由Amazon提供的云存储设施。 该组服务包括: + +1. S3 : S3代表简单存储服务(3次S)。 它给你提供了在线存储服务,你可随时从任何地方存储/检索任何数据。 +2. EFS : EFS 代表弹性文件系统。 它是一个可以和EC2服务器一起使用的在线存储服务。 +3. Glacier : 它是一种低成本/低性能数据存储解决方案,主要针对存档或长期备份。 +4. Storage Gateway : 这种服务的接口会将你的内部应用程序(托管在 AWS 之外)与 AWS 存储连接。 + +* * * + + _数据库_ + +AWS 还提供在其 Infra 上托管数据库,以便客户可以利用亚马逊最先进的技术来获得更快/高效/安全的数据处理。 该组包括: + +1. RDS : RDS 代表关系数据库服务。 有助于在云上设置,操作和管理关系数据库。 +2. DynamoDB : 其 noSQL 数据库提供快速处理和高可扩展性。 +3. ElastiCache : 着是一种为你的 Web 应用程序管理内存缓存以更快运行它们的方案 ! +4. Redshift : 它是一个巨大的(PB 级)的完全可升级的云端数据仓库服务。 + +* * * + + _网络 & 内容分发_ + +由于 AWS 提供云 EC2 服务器,因此网络相关内容也将在出现在这里。 内容分发用于向位于最近位置的用户提供文件。 现如今有许多非常有名的加速网站。 + +1. VPC : VPC 代表虚拟私有云。 它是你自己的虚拟网络,是你的专用 AWS 帐户。 +2. CloudFront : 这是 AWS 的内容分发网络服务。 +3. Direct Connect : 它是将数据中心/场所与 AWS 连接起来的网络方式,以提高吞吐量,降低网络成本,并避免由于基于互联网的连接而导致的连接问题。 +4. Route 53 : 它是一个云域名系统的 DNS Web 服务。 + +* * * + + _迁移_ + +它提供了一系列服务来帮助你实现本地服务到 AWS 的迁移工作。 这包括 : + +1. Application Discovery Service : 专门用于分析您的服务器,网络,应用程序以帮助/加速迁移的服务。 +2. DMS : DMS 指的是数据库迁移服务。 它用于将数据从本地数据库迁移到 EC2 上托管的 RDS 或 DB。 +3. Server Migration : 也称为 SMS(服务器迁移服务)是一种无代理服务,将您的工作负载从本地移动到 AWS。 +4. Snowball :  当你想要使用物理存储设备(而不是基于互联网/基于网络的传输)将大量数据传入/迁出AWS时,你应该使用它。 + +* * * + + _开发者工具_ + +见名知义, 这是一系列帮助开发者简化在云端编码的服务。 + +1. CodeCommit :它是一个安全的,可扩展的,可管理的源代码管理服务,用于托管代码仓库。 +2. CodeBuild : 这是一个云端的代码生成器。主要用于执行,测试代码和构建部署软件包。 +3. CodeDeploy : 这是一个可在 AWS 服务器或本地进行自动化应用程序部署的部署服务。 +4. CodePipeline : 这个部署服务可以使编码人员可以在发布之前将其应用程序可视化。 +5. X-Ray : 它可以使用事件调用分析应用程序。 + +* * * + + _管理工具_ + +这是一组可帮助你管理 AWS 上的Web服务的服务。 + +1. CloudWatch : 监控服务以监控你的 AWS 资源或应用程序。 +2. CloudFormation : 基础设施即代码! 以集体有序的方式管理AWS相对的方式。 +3. CloudTrail : AWS 帐户的审计和合规工具。 +4. Config : AWS 的资源清单,配置历史记录和配置更改通知,以实现安全性和治理。 +5. OpsWorks : 它可以自动化地配置,部署EC2或内部部署计算。 +6. Service Catalog : 创建和管理被批准在你/公司帐户中使用的 IT 服务目录。 +7. Trusted Advisor : 它的 AWS AI 可以通过审查你的 AWS Infra 使你的 AWS Infra 更好,更省钱。 +8. Managed Service : 提供持续的下一步管理。 + +* * * + + _安全性, 特征性和服从性_ + +这是一组很重要的 AWS 服务以确保你的 AWS 空间的安全性。 + +1. IAM : IAM 站在用户的身份和访问管理的立场上来控制用户访问你的 AWS 资源和服务。 +2. Inspector : 自动安全评估可保证你的应用在 AWS 上的安全和稳定性。 +3. Certificate Manager : 为 AWS 应用程序提供,管理和部署SSL / TLS证书。 +4. Directory Service : 相当于 AWS 的 Microsoft Active Directory。 +5. WAF & Shield : WAF 代表 We b应用防火墙。 监控和控制对 CloudFront 或负载均衡器上的内容的访问。 +6. Compliance Reports : AWS 基础设施空间的合规报告,以确保您的应用程序符合您的策略。 + +* * * + + _数据分析_ + +AWS 空间的数据分析服务,以帮助您查看,计划,对帐户中的事件采取行动。 + +1. Athena : 它是一个基于 SQL 查询的服务,用于分析 S3 存储的数据。 +2. EMR : EMR 的全写是 Elastic Map Reduce。 是一个主要用于大数据处理和分析的服务。 +3. CloudSearch : AWS 在应用和服务中的搜索功能。 +4. Elasticsearch Service : 它可以创建一个域并在 AWS Cloud 中部署,操作和扩展 Elasticsearch 集群。 +5. Kinesis : 这种服务可以实现实时的大量流数据处理。 +6. Data Pipeline : 它可以帮助我们在不同的 AWS 服务之间实现数据迁移。 +7. QuickSight : 收集,分析和呈现 AWS 的业务数据。 + +* * * + + _人工智能_ + +AWS 中的 AI! + +1. Lex : 它可以帮助我们在一些使用语音和文本的应用中构建会话界面。 +2. Polly : 这是一个提供文字到语音转换的服务。 +3. Rekognition : 使您能够将图像分析添加到应用程序。 +4. Machine Learning : 它具有学习数据中的模式的算法。 + +* * * + + _物联网_ + +这个服务保证了 AWS 在不同设备上的高可用性。 + +1. AWS IoT : 它使已连接的硬件设备与 AWS 的应用程序能够交互。 + +* * * + + _游戏开发_ + +见名知义,这个服务旨在游戏开发。 + +1. Amazon GameLift : 该服务旨在削减,管理用于会话的多人游戏的专用游戏服务器。 + +* * * + + _移动服务_ + +这是一组主要针对手持设备的服务。 + +1. Mobile Hub : 帮助您创建移动应用后台功能并将其集成到移动应用。 +2. Cognito : 在互联网连接的设备上控制移动用户的身份验证和 AWS 的访问。 +3. Device Farm : 移动应用测试服务使你可以在 Android 上托管的实时手机上跨 Android,iOS 测试应用。 +4. Mobile Analytics : 在AWS上测量,跟踪和分析移动应用数据。 +5. Pinpoint : 有针对性的推送通知和移动互动。 + +* * * + + _应用服务_ + +这是一组可以和你在 AWS 上的应用一起使用的服务。 + +1. Step Functions : 定义和使用应用程序中的各种功能。 +2. SWF : SWF 代表简单的工作流服务。其云工作流程管理可帮助开发人员在应用程序生命周期的不同阶段进行协调和贡献。 +3. API Gateway : 帮助开发人员创建,管理和托管API +4. Elastic Transcoder : 帮助开发人员将媒体文件转换为各种设备的播放。 + +* * * + + _消息_ + +AWS 中的通知和消息服务。 + +1. SQS : SQS 表示简单队列服务。完全管理的消息队列服务,用于在AWS中的服务和应用之间进行通信。 +2. SNS : SNS 代表简单通知服务。 为 AWS 用户推送通知服务,提醒他们有关其在 AWS 空间中的服务。 +3. SES : SES代表简单电子邮件服务。 这是 AWS 为自己的客户提供高性价比的电子邮件服务。 + +* * * + + _企业生产率_ + +一组帮你提高业务生产率的服务。 + +1. WorkDocs : 协同文件共享,存储和编辑服务。 +2. WorkMail : 安全的商务邮件,日程服务。 +3. Amazon Chime : 在线的企业会议! + +* * * + + _桌面和应用程序流式传输_ + +实现桌面应用程序通过云端进行流传输。 + +1. WorkSpaces : 完全管理且安全的云计算服务。 +2. AppStream 2.0 : 来自云端的流式桌面应用。 + +-------------------------------------------------------------------------------- + +via: http://kerneltalks.com/virtualization/aws-cloud-terminology/ + +作者:[Shrikant Lavhate][a] +译者:[chenxinlong](https://github.com/chenxinlong) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://kerneltalks.com/virtualization/aws-cloud-terminology/ From 4b27695be28e2a26ad72f4aadb00873084131df1 Mon Sep 17 00:00:00 2001 From: zhousiyu325 Date: Sat, 20 May 2017 10:17:06 +0800 Subject: [PATCH 0123/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=9120170518=20Maintain?= =?UTF-8?q?ing=20a=20Git=20Repository.mdd?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sources/tech/20170518 Maintaining a Git Repository.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170518 Maintaining a Git Repository.md b/sources/tech/20170518 Maintaining a Git Repository.md index e1e62e5db5..5cb0fc1c00 100644 --- a/sources/tech/20170518 Maintaining a Git Repository.md +++ b/sources/tech/20170518 Maintaining a Git Repository.md @@ -1,3 +1,5 @@ +翻译中 zhousiyu325 + Maintaining a Git Repository ============================================================ From fa6f640c1340e3ebf52202ef8bb109ff359ece55 Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 20 May 2017 12:27:43 +0800 Subject: [PATCH 0124/1407] PRF&PUB:20170508 4 terminal applications with great command-line UIs.md @geekpi https://linux.cn/article-8526-1.html --- ...pplications with great command-line UIs.md | 125 ++++++++++++++++ ...pplications with great command-line UIs.md | 141 ------------------ 2 files changed, 125 insertions(+), 141 deletions(-) create mode 100644 published/20170508 4 terminal applications with great command-line UIs.md delete mode 100644 translated/tech/20170508 4 terminal applications with great command-line UIs.md diff --git a/published/20170508 4 terminal applications with great command-line UIs.md b/published/20170508 4 terminal applications with great command-line UIs.md new file mode 100644 index 0000000000..01c7b8fb2c --- /dev/null +++ b/published/20170508 4 terminal applications with great command-line UIs.md @@ -0,0 +1,125 @@ +4 个拥有绝佳命令行界面的终端程序 +============================================================ + +> 让我们来看几个精心设计的 CLI 程序,以及如何解决一些可发现性问题。 + +![4 awesome command-line tools](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/code_computer_development_programming.png?itok=wMspQJcO "4 awesome command-line tools") + +>图片提供: opensource.com + +在本文中,我会指出命令行界面的可发现性discoverability缺点以及克服这些问题的几种方法。 + +我喜欢命令行。我第一次接触命令行是在 1997 的 DOS 6.2 上。我学习了各种命令的语法,并展示了如何在目录中列出隐藏的文件(`attrib`)。我会每次仔细检查命令中的每个字符。 当我犯了一个错误,我会从头开始重新输入命令。直到有一天,有人向我展示了如何使用向上和向下箭头按键遍历命令行历史,我被震惊了。 + +后来当我接触到 Linux 时,让我感到惊喜的是,上下箭头保留了它们遍历历史记录的能力。我仍然很仔细地打字,但是现在,我了解如何盲打,并且我能打的很快,每分钟可以达到 55 个单词的速度。接着有人向我展示了 tab 补完,再一次改变了我的生活。 + +在 GUI 应用程序中,菜单、工具提示和图标用于向用户展示功能。而命令行缺乏这种能力,但是有办法克服这个问题。在深入解决方案之前,我会来看看几个有问题的 CLI 程序: + +**1、 MySQL** + +首先让我们看看我们所钟爱的 MySQL REPL。我经常发现自己在输入 `SELECT * FROM` 然后按 `Tab` 的习惯。MySQL 会询问我是否想看到所有的 871 种可能性。我的数据库中绝对没有 871 张表。如果我选择 `yes`,它会显示一堆 SQL 关键字、表、函数等。(LCTT 译注:REPL —— Read-Eval-Print Loop,交互式开发环境) + +![MySQL gif](https://opensource.com/sites/default/files/mysql.gif) + +**2、 Python** + +我们来看另一个例子,标准的 Python REPL。我开始输入命令,然后习惯按 `Tab` 键。瞧,插入了一个 `Tab` 字符,考虑到 `Tab` 在 Python 源代码中没有特定作用,这是一个问题。 + +![Python gif](https://opensource.com/sites/default/files/python.gif "Python gif") + +### 好的用户体验 + +让我看下设计良好的 CLI 程序以及它们是如何克服这些可发现性问题的。 + +#### 自动补全: bpython + +[Bpython][15] 是对 Python REPL 的一个很好的替代。当我运行 bpython 并开始输入时,建议会立即出现。我没用通过特殊的键盘绑定触发它,甚至没有按下 `Tab` 键。 + +![bpython gif](https://opensource.com/sites/default/files/bpython.gif "bpython gif") + +当我出于习惯按下 `Tab` 键时,它会用列表中的第一个建议补全。这是给 CLI 设计带来可发现性性的一个很好的例子。 + +bpython 的另一个方面是可以展示模块和函数的文档。当我输入一个函数的名字时,它会显示这个函数附带的签名以及文档字符串。这是一个多么令人难以置信的周到设计啊。 + +#### 上下文感知补全:mycli + +[mycli][16] 是默认的 MySQL 客户端的现代替代品。这个工具对 MySQL 来说就像 bpython 之于标准 Python REPL 一样。mycli 将在你输入时自动补全关键字、表名、列和函数。 + +补全建议是上下文相关的。例如,在 `SELECT * FROM` 之后,只有来自当前数据库的表才会列出,而不是所有可能的关键字。 + +![mycli gif](https://opensource.com/sites/default/files/mycli.gif "mycli gif") + +#### 模糊搜索和在线帮助: pgcli + +如果您正在寻找 PostgreSQL 版本的 mycli,请看看 [pgcli][17]。 与 mycli 一样,它提供了上下文感知的自动补全。菜单中的项目使用模糊搜索缩小范围。模糊搜索允许用户输入整体字符串中的任意子字符串来尝试找到正确的匹配项。 + +![pgcli gif](https://opensource.com/sites/default/files/pgcli.gif "pgcli gif") + +pgcli 和 mycli 在其 CLI 中都实现了这个功能。斜杠命令的文档也作为补全菜单的一部分展示。 + +#### 可发现性: fish + +在传统的 Unix shell(Bash、zsh 等)中,有一种搜索历史记录的方法。此搜索模式由 `Ctrl-R` 触发。当再次调用你上周运行过的命令时,例如 **ssh**或 **docker**,这是一个令人难以置信的有用的工具。 一旦你知道这个功能,你会发现自己经常会使用它。 + +如果这个功能是如此有用,那为什么不每次都搜索呢?这正是 [**fish** shell][18] 所做的。一旦你开始输入命令,**fish** 将开始建议与历史记录类似的命令。然后,你可以按右箭头键接受该建议。 + +### 命令行规矩 + +我已经回顾了一些解决可发现性的问题的创新方法,但也有一些基本的命令行功能应该作为每个 REPL 所实现基础功能的一部分: + +* 确保 REPL 有可通过箭头键调用的历史记录。确保会话之间的历史持续存在。 +* 提供在编辑器中编辑命令的方法。不管你的补全是多么棒,有时用户只需要一个编辑器来制作完美的命令来删除生产环境中所有的表。 +* 使用分页器(`pager`)来管道输出。不要让用户滚动他们的终端。哦,要为分页器设置个合理的默认值。(记得添加选项来处理颜色代码。) +* 提供一种通过 `Ctrl-R` 界面或者 fish 式的自动搜索来搜索历史记录的方法。 + +### 总结 + +在第 2 节中,我将来看看 Python 中使你能够实现这些技术的特定库。同时,请查看其中一些精心设计的命令行应用程序: + +* [bpython][5]或 [ptpython][6]:具有自动补全支持的 Python REPL。 +* [http-prompt][7]:交互式 HTTP 客户端。 +* [mycli][8]:MySQL、MariaDB 和 Percona 的命令行界面,具有自动补全和语法高亮。 +* [pgcli][9]:具有自动补全和语法高亮,是对 [psql][10] 的替代工具。 +* [wharfee][11]:用于管理 Docker 容器的 shell。 + +_了解更多: Amjith Ramanujam 在 5 月 20 日在波特兰俄勒冈州举办的 [PyCon US 2017][12] 上的谈话“[神奇的命令行工具][13]”。_ + +-------------------------------------------------------------------------------- + + +作者简介: + +Amjith Ramanujam - Amjith Ramanujam 是 pgcli 和 mycli 的创始人。人们认为它们很酷,他表示笑纳赞誉。他喜欢用 Python、Javascript 和 C 编程。他喜欢编写简单易懂的代码,它们有时甚至会成功。 + +----------------------- + +via: https://opensource.com/article/17/5/4-terminal-apps + +作者:[Amjith Ramanujam][a] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/amjith +[1]:https://opensource.com/tags/python?src=programming_resource_menu +[2]:https://opensource.com/tags/javascript?src=programming_resource_menu +[3]:https://opensource.com/tags/perl?src=programming_resource_menu +[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu +[5]:http://bpython-interpreter.org/ +[6]:http://github.com/jonathanslenders/ptpython/ +[7]:https://github.com/eliangcs/http-prompt +[8]:http://mycli.net/ +[9]:http://pgcli.com/ +[10]:https://www.postgresql.org/docs/9.2/static/app-psql.html +[11]:http://wharfee.com/ +[12]:https://us.pycon.org/2017/ +[13]:https://us.pycon.org/2017/schedule/presentation/518/ +[14]:https://opensource.com/article/17/5/4-terminal-apps?rate=3HL0zUQ8_dkTrinonNF-V41gZvjlRP40R0RlxTJQ3G4 +[15]:https://bpython-interpreter.org/ +[16]:http://mycli.net/ +[17]:http://pgcli.com/ +[18]:https://fishshell.com/ +[19]:https://opensource.com/user/125521/feed +[20]:https://opensource.com/article/17/5/4-terminal-apps#comments +[21]:https://opensource.com/users/amjith diff --git a/translated/tech/20170508 4 terminal applications with great command-line UIs.md b/translated/tech/20170508 4 terminal applications with great command-line UIs.md deleted file mode 100644 index 822a67ddc7..0000000000 --- a/translated/tech/20170508 4 terminal applications with great command-line UIs.md +++ /dev/null @@ -1,141 +0,0 @@ -4 个拥有漂亮命令行 UI 的终端程序 -============================================================ - -### 我们来看几个精心设计的 CLI 程序,以及如何克服一些可发现的问题。 - -![4 awesome command-line tools](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/code_computer_development_programming.png?itok=wMspQJcO "4 awesome command-line tools") ->图片提供: opensource.com - -在本文中,我会指出命令行界面的可见缺点以及克服这些问题的几种方法。 - -我喜欢命令行。我第一次接触命令行是在 1997 的 DOS 6.2 上。我学习了各种命令的语法,并展示了如何在目录中列出隐藏的文件(**attrib**)。我会每次仔细检查命令中的每个字符。 当我犯了一个错误,我会从头开始重新输入命令。有一天,有人向我展示了如何使用向上和向下箭头按键遍历历史,我被震惊了。 - -编程和开发 - -* [新的 Python 内容][1] - -* [我们最新的 JavaScript 文章][2] - -* [最近的 Perl 帖子][3] - -* [红帽开发者博客][4] - -后来当我被介绍 Linux 时,让我感到惊喜的是,上下箭头保留了它们遍历历史记录的能力。我仍然仔细地打字,但到现在为止,我了解如何输入,并且我能以每分钟 55 个单词的速度做的很好。接着有人向我展示了 tab 键,并再次改变了我的生活。 - -在 GUI 应用程序菜单中,工具提示和图标向用户展示功能。命令行缺乏这种能力,但有办法克服这个问题。在深入解决方案之前,我会来看看几个有问题的 CLI 程序: - -### 1\. MySQL - -首先我们有我们所钟爱的 MySQL REPL。我经常发现自己在输入 **SELECT * FROM** 然后按 **Tab** 的习惯。MySQL 会询问我是否想看到所有的 871 中可能性。我的数据库中绝对没有 871 张表。如果我选择 **yes**,它会显示一堆 SQL 关键字、表、函数等。 - -![MySQL gif](https://opensource.com/sites/default/files/mysql.gif) - -### 2\. Python - -我们来看另一个例子,标准的 Python REPL。我开始输入命令,然后习惯按 **Tab** 键。瞧,插入了一个 **Tab** 字符,考虑到 **Tab** 在 Python 中没有作用,这是一个问题。 - -![Python gif](https://opensource.com/sites/default/files/python.gif "Python gif") - -### 好的 UX - -让我看下设计良好的 CLI 程序以及它们是如何克服这些可见问题的。 - -### 自动补全: bpython - -[Bpython][15] 是对 Python REPL 的一个很好的替代。当我运行 bpython 并开始输入时,建议会立即出现。我没用通过特殊的键盘绑定触发它,甚至没有按下 **Tab** 键。 - -![bpython gif](https://opensource.com/sites/default/files/bpython.gif "bpython gif") - -当我出于习惯按下 **Tab** 键时,它会用列表中的第一个建议补全。这是给 CLI 设计带来可见性的一个很好的例子。 - -bpython 另一方面可以展示模块和函数的文档。当我输入一个函数的名字时,它会显示函数签名以及这个函数附带的文档字符串。这是一个多么令人难以置信的周到设计啊。 - -### 上下文感知补全:mycli - -[Mycli][16]是默认的 MySQL 客户端的现代替代品。这个工具对 MySQL 来说就像 bpython 对标准 Python REPL 做的那样。Mycli 将在你输入时自动补全关键字、表名、列和函数。 - -补全建议是上下文相关的。例如,在 **SELECT * FROM** 之后,只有来自当前数据库的表才会列出,而不是所有可能的关键字。 - -![mycli gif](https://opensource.com/sites/default/files/mycli.gif "mycli gif") - -### 模糊搜索和在线帮助: pgcli - -如果您正在寻找 PostgreSQL 版本的 mycli,请查看 [pgcli][17]。 与 mycli 一样,它提供了上下文感知的自动补全。菜单中的项使用模糊搜索缩小。模糊搜索允许用户输入整体字符串中的任意子字符串来尝试找到正确的匹配项。 - -![pgcli gif](https://opensource.com/sites/default/files/pgcli.gif "pgcli gif") - -pgcli 和 mycli 同时在 CLI 中实现了这个功能。斜杠命令的文档也作为补全菜单的一部分展示。 - -### 可发现性: fish - -在传统的 Unix shell(Bash、zsh 等)中,有一种搜索历史记录的方法。此搜索模式由 **Ctrl-R** 触发。当在再次调用你上周运行的命令时,这是一个令人难以置信的有用的工具,例如 **ssh**或 **docker**。 一旦你知道这个功能,你会发现自己经常使用它。 - -如果这个功能是如此有用,那为什么不每次都搜索呢?这正是 [**fish** shell][18] 所做的。一旦你开始输入命令,**fish** 将开始建议与历史记录类似的命令。然后,你可以按右箭头键接受该建议。 - -### 命令行规矩 - -我已经回顾了一些创新的方法来解决可见的问题,但也有一些命令行的基础知识, 每个人都应该作为基本的 repl 功能的一部分来执行: - -* 确保 REPL 有可通过箭头键调用的历史记录。确保会话之间的历史持续存在。 - -* 提供在编辑器中编辑命令的方法。不管你的补全是多么棒,有时用户只需要一个编辑器来制作完美的命令来删除生产环境中所有的表。 - -* 使用 pager 来管道输出。不要让用户滚动他们的终端。哦,并为 pager 使用合理的默认值。(添加选项来处理颜色代码。) - -* 提供一种通过 **Ctrl-R** 界面或者 **fish** 样式的自动搜索来搜索历史记录的方法。 - -### 总结 - -在第 2 部分中,我将来看看 Python 中使你能够实现这些技术的特定库。同时,请查看其中一些精心设计的命令行应用程序: - -* [bpython][5]或 [ptpython][6]:具有自动补全支持的 Python REPL。 - -* [http-prompt][7]:交互式 HTTP 客户端。 - -* [mycli][8]:MySQL、MariaDB 和 Percona 的命令行界面,具有自动补全和语法高亮。 - -* [pgcli][9]:具有自动补全和语法高亮,是对 [psql][10] 的替代工具。 - -* [wharfee][11]:用于管理 Docker 容器的 shell。 - -_在这了解 Amjith Ramanujam 更多的在 5 月 20 日在波特兰俄勒冈州举办的 [PyCon US 2017][12] 上的谈话“[令人敬畏的命令行工具][13]”。_ - --------------------------------------------------------------------------------- - - -作者简介: - -Amjith Ramanujam - Amjith Ramanujam 是 pgcli 和 mycli 的创始人。人们认为它们很酷,他并不反对。他喜欢用 Python、Javascript 和 C 编程。他喜欢编写简单易懂的代码,它们有时甚至会成功。 - ------------------------ - -via: https://opensource.com/article/17/5/4-terminal-apps - -作者:[Amjith Ramanujam ][a] -译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/amjith -[1]:https://opensource.com/tags/python?src=programming_resource_menu -[2]:https://opensource.com/tags/javascript?src=programming_resource_menu -[3]:https://opensource.com/tags/perl?src=programming_resource_menu -[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu -[5]:http://bpython-interpreter.org/ -[6]:http://github.com/jonathanslenders/ptpython/ -[7]:https://github.com/eliangcs/http-prompt -[8]:http://mycli.net/ -[9]:http://pgcli.com/ -[10]:https://www.postgresql.org/docs/9.2/static/app-psql.html -[11]:http://wharfee.com/ -[12]:https://us.pycon.org/2017/ -[13]:https://us.pycon.org/2017/schedule/presentation/518/ -[14]:https://opensource.com/article/17/5/4-terminal-apps?rate=3HL0zUQ8_dkTrinonNF-V41gZvjlRP40R0RlxTJQ3G4 -[15]:https://bpython-interpreter.org/ -[16]:http://mycli.net/ -[17]:http://pgcli.com/ -[18]:https://fishshell.com/ -[19]:https://opensource.com/user/125521/feed -[20]:https://opensource.com/article/17/5/4-terminal-apps#comments -[21]:https://opensource.com/users/amjith From 38bfe9d6865e723b5872c1a3c87a046d091b8d85 Mon Sep 17 00:00:00 2001 From: ictlyh Date: Sat, 20 May 2017 17:07:01 +0800 Subject: [PATCH 0125/1407] Translated tech/20170308 Our guide to a Golang logs world.md --- ...170308 Our guide to a Golang logs world.md | 333 ------------------ ...170308 Our guide to a Golang logs world.md | 328 +++++++++++++++++ 2 files changed, 328 insertions(+), 333 deletions(-) delete mode 100644 sources/tech/20170308 Our guide to a Golang logs world.md create mode 100644 translated/tech/20170308 Our guide to a Golang logs world.md diff --git a/sources/tech/20170308 Our guide to a Golang logs world.md b/sources/tech/20170308 Our guide to a Golang logs world.md deleted file mode 100644 index 0eeb06089a..0000000000 --- a/sources/tech/20170308 Our guide to a Golang logs world.md +++ /dev/null @@ -1,333 +0,0 @@ -ictlyh translating -Our guide to a Golang logs world -============================================================ - - ![golang logo](https://logmatic.io/wp-content/uploads/2017/03/golang-logo.png) - -Do you ever get tired of solutions that use convoluted languages, that are complex to deploy, and for which building takes forever? Golang is the solution to these very issues, being as fast as C and as simple as Python. - -But how do you monitor your application with Golang logs? There are no exceptions in Golang, only errors. Your first impression might thus be that developing a Golang logging strategy is not going to be such a straightforward affair. The lack of exceptions is not in fact that troublesome, as exceptions have lost their exceptionality in many programming languages: they are often overused to the point of being overlooked. - -We’ll first cover here Golang logging basics before going the extra mile and discuss Golang logs standardization, metadatas significance, and minimization of Golang logging impact on performance. -By then, you’ll be able to track a user’s behavior across your application, quickly identify failing components in your project as well as monitor overall performance and user’s happiness. - -### I. Basic Golang logging - -### 1) Use Golang “log” library - -Golang provides you with a native [logging library][3] simply called “log”. Its logger is perfectly suited to track simple behaviors such as adding a timestamp before an error message by using the available [flags][4]. - -Here is a basic example of how to log an error in Golang: - -``` -package main - -import ( - "log" - "errors" - "fmt" - ) - -func main() { - /* local variable definition */ - ... - - /* function for division which return an error if divide by 0 */ - ret,err = div(a, b) -if err != nil { - log.Fatal(err) - } - fmt.Println(ret) -} -``` - -And here comes what you get if you try to divide by 0: - - ![golang code](https://logmatic.io/wp-content/uploads/2017/03/golang-code.png) - -In order to quickly test a function in Golang you can use the [go playground][5]. - -To make sure your logs are easily accessible at all times, we recommend to write them in a file: - -``` -package main -import ( - "log" - "os" -) -func main() { - //create your file with desired read/write permissions - f, err := os.OpenFile("filename", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) - if err != nil { - log.Fatal(err) - } - //defer to close when you're done with it, not because you think it's idiomatic! - defer f.Close() - //set output of logs to f - log.SetOutput(f) - //test case - log.Println("check to make sure it works") -} -``` - -You can find a complete tutorial for Golang log library [here][6] and find the complete list of available functions within their “log” [library][7]. - -So now you should be all set to log errors and their root causes. - -But logs can also help you piece an activity stream together, identify an error context that needs fixing or investigate how a single request is impacting several layers and API’s in your system. -And to get this enhanced type of vision, you first need to enrich your Golang logs with as much context as possible as well as standardize the format you use across your project. This is when Golang native library reaches its limits. The most widely used libraries are then [glog][8] and [logrus][9]. It must be said though that many good libraries are available. So if you’re already using one that uses JSON format you don’t necessarily have to change library, as we’ll explain just below. - -### II. A consistent format for your Golang logs - -### 1) The structuring advantage of JSON format - -Structuring your Golang logs in one project or across multiples microservices is probably the hardest part of the journey, even though it  _could_  seem trivial once done. Structuring your logs is what makes them especially readable by machines (cf our [collecting logs best practices blogpost][10]). Flexibility and hierarchy are at the very core of the JSON format, so information can be easily parsed and manipulated by humans as well as by machines. - -Here is an example of how to log in JSON format with the [Logrus/Logmatic.io][11] library: - -``` -package main -import ( - log "github.com/Sirupsen/logrus" - "github.com/logmatic/logmatic-go" -) -func main() { - // use JSONFormatter - log.SetFormatter(&logmatic.JSONFormatter{}) - // log an event as usual with logrus - log.WithFields(log.Fields{"string": "foo", "int": 1, "float": 1.1 }).Info("My first ssl event from golang") -} -``` - -Which comes out as: - -``` -{ - "date":"2016-05-09T10:56:00+02:00", - "float":1.1, - "int":1, - "level":"info", - "message":"My first ssl event from golang", - "String":"foo" -} -``` - -### 2) Standardization of Golang logs - -It really is a shame when the same error encountered in different parts of your code is registered differently in logs. Picture for example not being able to determine a web page loading status because of an error on one variable. One developer logged: - -``` -message: 'unknown error: cannot determine loading status from unknown error: missing or invalid arg value client' -``` - -While the other registered: - -``` -unknown error: cannot determine loading status - invalid client -``` - -A good solution to enforce logs standardization is to create an interface between your code and the logging library. This standardization interface would contain pre-defined log messages for all possible behavior you want to add in your logs. Doing so prevent custom log messages that would not match your desired standard format…. And in so doing facilitates log investigation. - - ![interface function](https://logmatic.io/wp-content/uploads/2017/03/functions-interface.png) - -As log formats are centralized it becomes way easier to keep them up to date. If a new type of issue arises it only requires to be added in one interface for every team member to use the exact same message. - -The most basic example would be to add the logger name and id before Golang log messages. Your code would then send “events” to your standardization interface that would in turn transform them into Golang log messages. - -The most basic example would be to add the logger name and the id before the Golang log message. Your code would then send “events” to this interface that would transform them into Golang log messages: - -``` -// The main part, we define all messages right here. -// The Event struct is pretty simple. We maintain an Id to be sure to -// retrieve simply all messages once they are logged -var ( - invalidArgMessage = Event{1, "Invalid arg: %s"} - invalidArgValueMessage = Event{2, "Invalid arg value: %s => %v"} - missingArgMessage = Event{3, "Missing arg: %s"} -) - -// And here we were, all log events that can be used in our app -func (l *Logger)InvalidArg(name string) { - l.entry.Errorf(invalidArgMessage.toString(), name) -} -func (l *Logger)InvalidArgValue(name string, value interface{}) { - l.entry.WithField("arg." + name, value).Errorf(invalidArgValueMessage.toString(), name, value) -} -func (l *Logger)MissingArg(name string) { - l.entry.Errorf(missingArgMessage.toString(), name) -} -``` - -So if we use the previous example of the invalid argument value, we would get similar log messages: - -``` -time="2017-02-24T23:12:31+01:00" level=error msg="LoadPageLogger00003 - Missing arg: client - cannot determine loading status" arg.client= logger.name=LoadPageLogger -``` - -And in JSON format: - -``` -{"arg.client":null,"level":"error","logger.name":"LoadPageLogger","msg":"LoadPageLogger00003 - Missing arg: client - cannot determine loading status", "time":"2017-02-24T23:14:28+01:00"} -``` - -### III. The power of context in Golang logs - -Now that the Golang logs are written in a structured and standardized format, time has come to decide which context and other relevant information should be added to them. Context and metadatas are critical in order to be able to extract insights from your logs such as following a user activity or its workflow. - -For instance the Hostname, appname and session parameters could be added as follows using the JSON format of the logrus library: - -``` -// For metadata, a common pattern is to re-use fields between logging statements by re-using - contextualizedLog := log.WithFields(log.Fields{ - "hostname": "staging-1", - "appname": "foo-app", - "session": "1ce3f6v" - }) -contextualizedLog.Info("Simple event with global metadata") -``` - -Metadatas can be seen as javascript breadcrumbs. To better illustrate how important they are, let’s have a look at the use of metadatas among several Golang microservices. You’ll clearly see how decisive it is to track users on your application. This is because you do not simply need to know that an error occurred, but also on which instance and what pattern created the error. So let’s imagine we have two microservices which are sequentially called. The contextual information is transmitted and stored in the headers: - -``` -func helloMicroService1(w http.ResponseWriter, r *http.Request) { -client := &http.Client{} -// This service is responsible to received all incoming user requests -// So, we are checking if it's a new user session or a another call from -// an existing session -session := r.Header.Get("x-session") -if ( session == "") { -session = generateSessionId() -// log something for the new session -} -// Track Id is unique per request, so in each case we generate one -track := generateTrackId() -// Call your 2nd microservice, add the session/track -reqService2, _ := http.NewRequest("GET", "http://localhost:8082/", nil) -reqService2.Header.Add("x-session", session) -reqService2.Header.Add("x-track", track) -resService2, _ := client.Do(reqService2) -…. -``` - -So when the second service is called: - -``` -func helloMicroService2(w http.ResponseWriter, r *http.Request) { -// Like for the microservice, we check the session and generate a new track -session := r.Header.Get("x-session") -track := generateTrackId() -// This time, we check if a track id is already set in the request, -// if yes, it becomes the parent track -parent := r.Header.Get("x-track") -if (session == "") { -w.Header().Set("x-parent", parent) -} -// Add meta to the response -w.Header().Set("x-session", session) -w.Header().Set("x-track", track) -if (parent == "") { -w.Header().Set("x-parent", track) -} -// Write the response body -w.WriteHeader(http.StatusOK) -io.WriteString(w, fmt.Sprintf(aResponseMessage, 2, session, track, parent)) -} -``` - -Context and information relative to the initial query are now available in the second microservice and a log message in JSON format looks like the following ones: - -In the first micro service: - -``` -{"appname":"go-logging","level":"debug","msg":"hello from ms 1","session":"eUBrVfdw","time":"2017-03-02T15:29:26+01:00","track":"UzWHRihF"} -``` - -Then in the second: - -``` -{"appname":"go-logging","level":"debug","msg":"hello from ms 2","parent":"UzWHRihF","session":"eUBrVfdw","time":"2017-03-02T15:29:26+01:00","track":"DPRHBMuE"} -``` - -In the case of an error occurring in the second micro service, we are now able – thanks to the contextual information hold in the Golang logs – to determine how it was called and what pattern created the error. - -If you wish to dig deeper on Golang tracking possibilities, there are several libraries that offer tracking features such as [Opentracing][12]. This specific library delivers an easy way to add tracing implementations in complex (or simple) architecture. It allows you to track user queries across the different steps of any process as done below: - - ![client transaction](https://logmatic.io/wp-content/uploads/2017/03/client-transaction.png) - -### IV. Performance impact of Golang logging - -### 1) Do not log in Gorountine - -It is tempting to create a new logger per goroutine. But it should not be done. Goroutine is a lightweight thread manager and is used to accomplish a “simple” task. It should not therefore be in charge of logging. It could lead to concurrency issues as using log.New() in each goroutine would duplicate the interface and all loggers would concurrently try to access the same io.Writer. -Moreover libraries usually use a specific goroutine for the log writing to limit the impact on your performances and avoid concurrencial calls to the io.Writer. - -### 2) Work with asynchronous libraries - -If it is true that many Golang logging libraries are available, it’s important to note that most of them are synchronous (pseudo asynchronous in fact). The reason for this being probably that so far no one had any serious impact on their performance due to logging. - -But as Kjell Hedström showed in [his experiment][13] using several threads that created millions of logs, asynchronous Golang logging could lead to 40% performance increase in the worst case scenario. So logging comes at a cost, and can have consequences on your application performance. In case you do not handle such volume of logs, using pseudo asynchronous Golang logging library might be efficient enough. But if you’re dealing with large amounts of logs or are keen on performance, Kjell Hedström asynchronous solution is interesting (despite the fact that you would probably have to develop it a bit as it only contains the minimum required features). - -### 3) Use severity levels to manage your Golang logs volume - -Some logging libraries allow you to enable or disable specific loggers, which can come in handy. You might not need some specific levels of logs once in production for example. Here is an example of how to disable a logger in the glog library where loggers are defined as boolean: - -``` -type Log bool -func (l Log) Println(args ...interface{}) { - fmt.Println(args...) -} -var debug Log = false -if debug { - debug.Println("DEBUGGING") -} -``` - -You can then define those boolean parameters in a configuration file and use them to enable or disable loggers. - -Golang logging can be expensive without a good Golang logging strategy. Developers should resist to the temptation of logging almost everything – even if much is interesting! If the purpose of logging is to gather as much information as possible, it has to be done properly in order to avoid the white noise of logs containing useless elements. - -### V. Centralize Golang logs - - ![centralize go logs](https://logmatic.io/wp-content/uploads/2017/03/source-selector-1024x460-1.png) -If your application is deployed on several servers, the hassle of connecting to each one of them to investigate a phenomenon can be avoided. Log centralization does make a difference. - -Using log shippers such as Nxlog for windows, Rsyslog for linux (as it is installed by default) or Logstash and FluentD is the best way to do so. Log shippers only purpose is to send logs, and so they manage connection failures or other issues you could face very well. - -There is even a [Golang syslog package][14] that takes care of sending Golang logs to the syslog daemon for you. - -### Hope you enjoyed your Golang logs tour - -Thinking about your Golang logging strategy at the beginning of your project is important. Tracking a user is much easier if overall context can be accessed from anywhere in the code. Reading logs from different services when they are not standardized is painful. Planning ahead to spread the same user or request id through several microservices will later on allow you to easily filter the information and follow an activity across your system. - -Whether you’re building a large Golang project or several microservices also impacts your logging strategy. The main components of a large project should have their specific Golang logger named after their functionality. This enables you to instantly spot from which part of the code the logs are coming from. However with microservices or small Golang projects, fewer core components require their own logger. In each case though, the number of loggers should be kept below the number of core functionalities. - -You’re now all set to quantify decisions about performance and user’s happiness with your Golang logs! - - _Is there a specific coding language you want to read about? Let us know on Twitter [][1][@logmatic][2]._ - - --------------------------------------------------------------------------------- - -via: https://logmatic.io/blog/our-guide-to-a-golang-logs-world/ - -作者:[Nils][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://logmatic.io/blog/our-guide-to-a-golang-logs-world/ -[1]:https://twitter.com/logmatic?lang=en -[2]:http://twitter.com/logmatic -[3]:https://golang.org/pkg/log/ -[4]:https://golang.org/pkg/log/#pkg-constants -[5]:https://play.golang.org/ -[6]:https://www.goinggo.net/2013/11/using-log-package-in-go.html -[7]:https://golang.org/pkg/log/ -[8]:https://github.com/google/glog -[9]:https://github.com/sirupsen/logrus -[10]:https://logmatic.io/blog/beyond-application-monitoring-discover-logging-best-practices/ -[11]:https://github.com/logmatic/logmatic-go -[12]:https://github.com/opentracing/opentracing-go -[13]:https://sites.google.com/site/kjellhedstrom2/g2log-efficient-background-io-processign-with-c11/g2log-vs-google-s-glog-performance-comparison -[14]:https://golang.org/pkg/log/syslog/ diff --git a/translated/tech/20170308 Our guide to a Golang logs world.md b/translated/tech/20170308 Our guide to a Golang logs world.md new file mode 100644 index 0000000000..045b7c5e80 --- /dev/null +++ b/translated/tech/20170308 Our guide to a Golang logs world.md @@ -0,0 +1,328 @@ +Go 日志指南 +============================================================ + + ![golang logo](https://logmatic.io/wp-content/uploads/2017/03/golang-logo.png) + +你是否厌烦了那些使用复杂语言编写、难以部署、总是在构建的解决方案?Golang 是解决这些问题的好方法,它和 C 语言一样快,又和 Python 一样简单。 + +但是你如何使用 Golang 日志监控你的应用程序呢?Golang 没有异常,只有错误。因此你的第一印象可能就是开发 Golang 日志策略并不是一件简单的事情。不支持异常事实上并不是什么问题,异常在很多编程语言中已经失去了特殊用处:它们过于被滥用以至于它们的作用都被忽视了。 + +在进一步深入之前,我们首先会介绍 Golang 日志基础并讨论 Golang 日志标准、元数据意义、以及最小化 Golang 日志对性能的影响。通过日志,你可以追踪用户在你应用中的活动,快速识别你项目中失效的组件,并监控总的性能以及用户体验。 + +### I. Golang 日志基础 + +### 1) 使用 Golang "log" 库 + +Golang 给你提供了一个称为 “log” 的原生[日志库][3] 。它的日志器完美适用于追踪简单的活动,例如通过使用可用的[选项][4]在错误信息之前添加一个时间戳。 + +下面是一个 Golang 中如何记录错误日志的简单例子: + +``` +package main + +import ( + "log" + "errors" + "fmt" + ) + +func main() { + /* 定义局部变量 */ + ... + + /* 除法函数,除以 0 的时候会返回错误 */ + ret,err = div(a, b) +if err != nil { + log.Fatal(err) + } + fmt.Println(ret) +} +``` + +如果你尝试除以0,你就会得到类似下面的结果: + + ![golang 代码](https://logmatic.io/wp-content/uploads/2017/03/golang-code.png) + +为了快速测试一个 Golang 函数,你可以使用 [go playground][5]。 + +为了确保你的日志总是能轻易访问,我们建议你把它们写到一个文件: + +``` +package main +import ( + "log" + "os" +) +func main() { + // 按照所需读写权限创建文件 + f, err := os.OpenFile("filename", os.O_WRONLY|os.O_CREATE|os.O_APPEND, 0644) + if err != nil { + log.Fatal(err) + } + // 完成后延迟关闭,而不是你认为这是惯用的! + defer f.Close() + //设置日志输出到 f + log.SetOutput(f) + //测试例 + log.Println("check to make sure it works") +} +``` + +你可以在[这里][6]找到 Golang 日志的完整指南,以及 “log” [库][7]内可用函数的完整列表。 + +现在你就可以记录它们的错误以及根本原因啦。 + +另外,日志也可以帮你将活动流拼接在一起,查找需要修复的错误上下文,或者调查在你的系统中单个请求如何影响其它应用层和 API。 +为了获得更好的日志效果,你首先需要在你的项目中使用尽可能多的上下文丰富你的 Golang 日志,并标准化你使用的格式。这就是 Golang 原生库能达到的极限。使用最广泛的库是 [glog][8] 和 [logrus][9]。必须承认还有很多好的库可以使用。如果你已经在使用支持 JSON 格式的库,你就不需要再换其它库了,后面我们会解释。 + +### II. 你 Golang 日志的统一格式 + +### 1) JSON 格式的结构优势 + +在一个项目或者多个微服务中结构化你的 Golang 日志可能是最困难的事情,但一旦完成,它看起来就微不足道了。结构化你的日志能使机器可读(参考我们 [收集日志的最佳实践博文][10])。灵活性和层级是 JSON 格式的核心,因此信息能够轻易被人类和机器解析以及处理。 + +下面是一个使用 [Logrus/Logmatic.io][11] 如何用 JSON 格式记录日志的例子: + +``` +package main +import ( + log "github.com/Sirupsen/logrus" + "github.com/logmatic/logmatic-go" +) +func main() { + // 使用 JSONFormatter + log.SetFormatter(&logmatic.JSONFormatter{}) + // 使用 logrus 像往常那样记录事件 + log.WithFields(log.Fields{"string": "foo", "int": 1, "float": 1.1 }).Info("My first ssl event from golang") +} +``` + +会输出结果: + +``` +{ + "date":"2016-05-09T10:56:00+02:00", + "float":1.1, + "int":1, + "level":"info", + "message":"My first ssl event from golang", + "String":"foo" +} +``` + +### 2) 标准化 Golang 日志 + +出现在你代码不同部分的同一个错误以不同形式被记录下来是一件可耻的事情。下面是一个由于一个变量错误导致无法确定 web 页面加载状态的例子。一个开发者日志格式是: + +``` +message: 'unknown error: cannot determine loading status from unknown error: missing or invalid arg value client' +``` + +另一个人的格式却是: + +``` +unknown error: cannot determine loading status - invalid client +``` + +强制日志标准化的一个好的解决办法是在你的代码和日志库之间创建一个接口。这个标准化接口会包括所有你想添加到你日志中的可能行为的预定义日志消息。这么做可以防止不符合你想要的标准格式的自定义日志信息。这么做也便于日志调查。 + + ![接口函数](https://logmatic.io/wp-content/uploads/2017/03/functions-interface.png) + +由于日志格式都被统一处理,使它们保持更新也变得更加简单。如果出现了一种新的错误类型,它只需要被添加到一个接口,这样每个组员都会使用完全相同的信息。 + +最长使用的简单例子就是在 Golang 日志信息前面添加日志器名称和 id。你的代码然后就会发送 “事件” 到你的标准化接口,它会继续讲它们转化为 Golang 日志消息。 + +``` +// 主要部分,我们会在这里定义所有消息。 +// Event 结构体很简单。为了当所有信息都被记录时能检索它们, +// 我们维护了一个 Id +var ( + invalidArgMessage = Event{1, "Invalid arg: %s"} + invalidArgValueMessage = Event{2, "Invalid arg value: %s => %v"} + missingArgMessage = Event{3, "Missing arg: %s"} +) + +// 在我们应用程序中可以使用的所有日志事件 +func (l *Logger)InvalidArg(name string) { + l.entry.Errorf(invalidArgMessage.toString(), name) +} +func (l *Logger)InvalidArgValue(name string, value interface{}) { + l.entry.WithField("arg." + name, value).Errorf(invalidArgValueMessage.toString(), name, value) +} +func (l *Logger)MissingArg(name string) { + l.entry.Errorf(missingArgMessage.toString(), name) +} +``` + +因此如果我们使用前面例子中无效的参数值,我们就会得到相似的日志信息: + +``` +time="2017-02-24T23:12:31+01:00" level=error msg="LoadPageLogger00003 - Missing arg: client - cannot determine loading status" arg.client= logger.name=LoadPageLogger +``` + +JSON 格式如下: + +``` +{"arg.client":null,"level":"error","logger.name":"LoadPageLogger","msg":"LoadPageLogger00003 - Missing arg: client - cannot determine loading status", "time":"2017-02-24T23:14:28+01:00"} +``` + +### III. Golang 日志上下文的力量 + +现在 Golang 日志已经按照特定结构和标准格式记录,时间会决定需要添加哪些上下文以及相关信息。为了能从你的日志中抽取信息,例如追踪一个用户活动或者工作流,上下文和元数据的顺序非常重要。 + +例如在 logrus 库中可以按照下面这样使用 JSON 格式添加 Hostname、appname 和 session 参数: + +``` +// 对于元数据,通常做法是通过复用重用日志语句中的字段。 + contextualizedLog := log.WithFields(log.Fields{ + "hostname": "staging-1", + "appname": "foo-app", + "session": "1ce3f6v" + }) +contextualizedLog.Info("Simple event with global metadata") +``` + +元数据可以视为 javascript 片段。为了更好地说明它们有多么重要,让我们看看几个 Golang 微服务中元数据的使用。你会清楚地看到在你的应用程序中跟踪用户的决定性。这是因为你不仅需要知道一个错误发生了,还要知道是哪个实例以及什么模式导致了错误。假设我们有两个按顺序调用的微服务。上下文信息被传输并保存在头部(header): + +``` +func helloMicroService1(w http.ResponseWriter, r *http.Request) { +client := &http.Client{} +// 该服务负责接收所有到来的用户请求 +// 我们会检查是否是一个新的会话还是已有会话的另一次调用 +session := r.Header.Get("x-session") +if ( session == "") { +session = generateSessionId() +// 为新会话记录日志 +} +// 每个请求的 Track Id 都是唯一的,因此我们会为每个会话生成一个 +track := generateTrackId() +// 调用你的第二个微服务,添加 session/track +reqService2, _ := http.NewRequest("GET", "http://localhost:8082/", nil) +reqService2.Header.Add("x-session", session) +reqService2.Header.Add("x-track", track) +resService2, _ := client.Do(reqService2) +…. +``` + +当调用第二个服务时: + +``` +func helloMicroService2(w http.ResponseWriter, r *http.Request) { +// 类似之前的微服务,我们检查会话并生成新的 track +session := r.Header.Get("x-session") +track := generateTrackId() +// 这一次,我们检查请求中是否已经设置了一个 track id, +// 如果是,它变为父 track +parent := r.Header.Get("x-track") +if (session == "") { +w.Header().Set("x-parent", parent) +} +// 为响应添加 meta 信息 +w.Header().Set("x-session", session) +w.Header().Set("x-track", track) +if (parent == "") { +w.Header().Set("x-parent", track) +} +// 填充响应 +w.WriteHeader(http.StatusOK) +io.WriteString(w, fmt.Sprintf(aResponseMessage, 2, session, track, parent)) +} +``` + +现在第二个微服务中已经有和初始查询相关的上下文和信息,一个 JSON 格式的日志消息看起来类似: + +在第一个微服务: + +``` +{"appname":"go-logging","level":"debug","msg":"hello from ms 1","session":"eUBrVfdw","time":"2017-03-02T15:29:26+01:00","track":"UzWHRihF"} +``` + +在第二个微服务: + +``` +{"appname":"go-logging","level":"debug","msg":"hello from ms 2","parent":"UzWHRihF","session":"eUBrVfdw","time":"2017-03-02T15:29:26+01:00","track":"DPRHBMuE"} +``` + +如果在第二个微服务中出现了错误,多亏了 Golang 日志中保存的上下文信息,现在我们就可以确定它是怎样被调用的以及什么模式导致了这个错误。 + +如果你想进一步深挖 Golang 的追踪能力,这里还有一些库提供了追踪功能,例如 [Opentracing][12]。这个库提供了一种简单的方式在复杂(或简单)的架构中添加追踪实现。它通过不同步骤允许你追踪用户的查询,就像下面这样: + + ![客户端事务](https://logmatic.io/wp-content/uploads/2017/03/client-transaction.png) + +### IV. Golang 日志对性能的影响 + +### 1) 不要在 Goroutine 中使用日志 + +在每个 goroutine 中创建一个新的日志器看起来很诱人。但最好别这么做。Goroutine 是一个轻量级线程管理器,它用于完成一个 “简单的” 任务。因此它不应该负责日志。它可能导致并发问题,因为在每个 goroutine 中使用 log.New() 会复用接口,所有日志器会并发尝试访问同一个 io.Writer。 +为了限制对性能的影响以及避免并发调用 io.Writer,库通常使用一个特定的 goroutine 用于日志输出。 + +### 2) 使用异步库 + +尽管有很多可用的 Golang 日志库,要注意它们中的大部分都是同步的(事实上是伪异步)。原因很可能是到现在为止它们中没有一个由于日志对性能有严重影响。 + +但正如 Kjell Hedström 在[他的实验][13]中展示的,使用多个线程创建成千上万日志,在最坏情况下异步 Golang 日志也会有 40% 的性能提升。因此日志是有开销的,也会对你的应用程序性能产生影响。如果你并不需要处理大量的日志,使用伪异步 Golang 日志库可能就足够了。但如果你是处理大量的日志,或者很关注性能,Kjell Hedström 的异步解决方案就很有趣(尽管事实上你可能需要进一步开发,因为它只包括了最小的功能需求)。 + +### 3)使用严重等级管理 Golang 日志 + +一些日志库允许你启用或停用特定日志器,这可能会派上用场。例如在生产环境中你可能不需要一些特定等级的日志。下面是一个如何在 glog 库中停用日志器的例子,其中日志器被定义为布尔值: + +``` +type Log bool +func (l Log) Println(args ...interface{}) { + fmt.Println(args...) +} +var debug Log = false +if debug { + debug.Println("DEBUGGING") +} +``` + +然后你就可以在配置文件中定义这些布尔参数来启用或者停用日志器。 + +没有一个好的 Golang 日志策略,Golang 日志可能开销很大。开发人员应该抵制记录几乎所有事情的诱惑 - 尽管它非常有趣!如果日志的目的是为了获取尽可能多的信息,为了避免包含没用元素的日志的白噪音,必须正确使用日志。 + +### V. 集中 Golang 日志 + + ![集中 go 日志](https://logmatic.io/wp-content/uploads/2017/03/source-selector-1024x460-1.png) +如果你的应用程序是部署在多台服务器上的,可以避免为了调查一个现象需要连接到每一台服务器的麻烦。日志集中确实有用。 + +使用日志装箱工具,例如 windows 中的 Nxlog,linux 中的 Rsyslog(默认安装了的)、Logstash 和 FluentD,是最好的实现方式。日志装箱工具的唯一目的就是发送日志,因此它们管理连接失效以及其它你很可能会遇到的问题。 + +这里甚至有一个 [Golang syslog 软件包][14] 帮你将 Golang 日志发送到 syslog 守护进程。 + +### 希望你享受你的 Golang 日志之旅 + +在你项目一开始就考虑你的 Golang 日志策略非常重要。如果在你代码的任意地方都可以获得所有的上下文,追踪用户就会变得很简单。从不同服务中阅读没有标准化的日志是已经很痛苦的事情。一开始就计划在多个微服务中扩展相同用户或请求 id,后面就会允许你比较容易地过滤信息并在你的系统中跟踪活动。 + +你是构架一个很大的 Golang 项目还是几个微服务也会影响你的日志策略。一个大项目的主要组件应该有按照它们功能命名的特定 Golang 日志器。这使你可以立即判断出日志来自你的哪一部分代码。然而对于微服务或者小的 Golang 项目,较少的核心组件需要它们自己的日志器。但在每种情形中,日志器的数目都应该保持低于核心功能的数目。 + +你现在已经可以使用 Golang 日志量化决定你的性能或者用户满意度啦! + +_如果你有想阅读的特定编程语言,在 Twitter [][1][@logmatic][2] 上告诉我们吧。_ + + +-------------------------------------------------------------------------------- + +via: https://logmatic.io/blog/our-guide-to-a-golang-logs-world/ + +作者:[Nils][a] +译者:[ictlyh](https://github.com/ictlyh) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://logmatic.io/blog/our-guide-to-a-golang-logs-world/ +[1]:https://twitter.com/logmatic?lang=en +[2]:http://twitter.com/logmatic +[3]:https://golang.org/pkg/log/ +[4]:https://golang.org/pkg/log/#pkg-constants +[5]:https://play.golang.org/ +[6]:https://www.goinggo.net/2013/11/using-log-package-in-go.html +[7]:https://golang.org/pkg/log/ +[8]:https://github.com/google/glog +[9]:https://github.com/sirupsen/logrus +[10]:https://logmatic.io/blog/beyond-application-monitoring-discover-logging-best-practices/ +[11]:https://github.com/logmatic/logmatic-go +[12]:https://github.com/opentracing/opentracing-go +[13]:https://sites.google.com/site/kjellhedstrom2/g2log-efficient-background-io-processign-with-c11/g2log-vs-google-s-glog-performance-comparison +[14]:https://golang.org/pkg/log/syslog/ From a8b7d729736d71bd52b144ba51ecb6a2490ed77c Mon Sep 17 00:00:00 2001 From: Flynn Date: Sat, 20 May 2017 17:15:51 +0800 Subject: [PATCH 0126/1407] Translating by ucasFL --- ... libraries for building great command-line user interfaces.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170509 4 Python libraries for building great command-line user interfaces.md b/sources/tech/20170509 4 Python libraries for building great command-line user interfaces.md index b4c4ced5dd..2eaaf2373d 100644 --- a/sources/tech/20170509 4 Python libraries for building great command-line user interfaces.md +++ b/sources/tech/20170509 4 Python libraries for building great command-line user interfaces.md @@ -1,3 +1,4 @@ +ucasFL translating 4 Python libraries for building great command-line user interfaces ============================================================ From 8143fce44eda342d9180e43a9ccad174dc022ce4 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 21 May 2017 00:23:35 +0800 Subject: [PATCH 0127/1407] =?UTF-8?q?PRF:20161223=20Will=20Android=20do=20?= =?UTF-8?q?for=20the=20IoT=20what=20it=20did=20for=C2=A0mobile.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @firstadream 初校 --- ...d do for the IoT what it did for mobile.md | 70 +++++++++++-------- 1 file changed, 39 insertions(+), 31 deletions(-) diff --git a/translated/tech/20161223 Will Android do for the IoT what it did for mobile.md b/translated/tech/20161223 Will Android do for the IoT what it did for mobile.md index 87801ed572..7853125d7e 100644 --- a/translated/tech/20161223 Will Android do for the IoT what it did for mobile.md +++ b/translated/tech/20161223 Will Android do for the IoT what it did for mobile.md @@ -1,17 +1,19 @@ - -安卓IoT能否像在移动终端一样成功? + Android 在物联网方面能否像在移动终端一样成功? ============================================================ - ![](https://cdn-images-1.medium.com/max/1000/1*GF6e6Vd-22PViWT8EDpLNA.jpeg) -Android Things让IoT如虎添翼 +![](https://cdn-images-1.medium.com/max/1000/1*GF6e6Vd-22PViWT8EDpLNA.jpeg) -###我在Android Things上的最初24小时 -正当我在开发一个基于Android的运行在树莓派3的物联网商业项目时,一些令人惊喜的事情发生了。谷歌发布了[Android Things] [1]的第一个预览版本,他们的SDK专门针对(最初)3个SBC(单板计算机) - 树莓派 3,英特尔Edison和恩智浦Pico。说我一直在挣扎似乎有些轻描淡写 - 没有成功的移植树莓派安卓可以参照,我们在理想丰满,但是实践漏洞百出的内测版本上叫苦不迭。其中一个问题,同时也是不可原谅的问题是,它不支持触摸屏,甚至连[Element14][2]官方销售的也不支持。曾经我认为安卓已经支持树莓派,更早时候[commi tto AOSP project from Google][3]提到过Pi曾让所有人兴奋不已。所以当2016年12月12日谷歌发布"Android Things"和其SDK的时候,我马上闭门谢客,全身心地去研究了…… +*Android Things 让 IoT 如虎添翼* + +### 我 在Android Things 上的最初 24 小时 + +正当我在开发一个基于 Android 的运行在树莓派 3 的物联网商业项目时,一些令人惊喜的事情发生了。谷歌发布了[Android Things][1] 的第一个预览版本,他们的 SDK 专门(目前)针对 3 个 SBC(单板计算机) - 树莓派 3、英特尔 Edison 和恩智浦 Pico。说我一直在挣扎似乎有些轻描淡写 - 没有成功的移植树莓派 Android 可以参照,我们在理想丰满,但是实践漏洞百出的内测版本上叫苦不迭。其中一个问题,同时也是不可原谅的问题是,它不支持触摸屏,甚至连 [Element14][2] 官方销售的也不支持。曾经我认为 Android 已经支持树莓派,更早时候 [commi tto AOSP project from Google][3] 提到过树莓派曾让所有人兴奋不已。所以当 2016 年 12 月 12 日谷歌发布 “Android Things” 和其 SDK 的时候,我马上闭门谢客,全身心地去研究了…… ### 问题? -安卓扩展的工作和Pi上做过的一些项目,包括之前提到的,当前正在开发中的Pi项目,使我对谷歌安卓产生了许多问题。未来我会尝试解决它们,但是最重要的问题可以马上解答 - 有完整的Android Studio支持,Pi成为列表上的另一个常规的ADB可寻址设备。好极了。Android Atudio强大的,便利的,纯粹的易用的功能包括布局预览,调试系统,源码检查器,自动化测试等可以真正的应用在IoT硬件上。这些好处怎么说都不过分。到目前为止,我在Pi上的大部分工作都是在python中使用SSH运行在Pi上的编辑器(MC,如果你真的想知道)。这是有效的,毫无疑问硬核Pi / Python头可以指出更好的工作方式,而不是当前这种像极了80年代码农的软件开发模式。我的项目涉及到在控制Pi的手机上编写Android软件,这有点像在伤口狂妄地撒盐 - 我使用Android Studio做“真正的”Android工作,用SSH做剩下的。但是有了"Android Things"之后,一切都结束了。 -所有的示例代码都适用于3个SBC,Pi 只是其中之一。 Build.DEVICE常量在运行时确定,所以你会看到很多如下代码: +关于树莓派上的谷歌 Android 我遇到很多问题,我以前用 Android 做过许多开发,也做过一些树莓派项目,包括之前提到过的一个真正参与的。未来我会尝试解决它们,但是首先最重要的问题得到了解决 - 有完整的 Android Studio 支持,树莓派成为你手里的另一个常规的 ADB 可寻址设备。好极了。Android Studio 强大而便利、十分易用的功能包括布局预览、调试系统、源码检查器、自动化测试等都可以真正的应用在 IoT 硬件上。这些好处怎么说都不过分。到目前为止,我在树莓派上的大部分工作都是通过 SSH 使用运行在树莓派上的编辑器(MC,如果你真的想知道)借助 Python 完成的。这是有效的,毫无疑问铁杆的 Pi/Python 粉丝或许会有更好的工作方式,而不是当前这种像极了 80 年代码农的软件开发模式。我的项目需要在控制树莓派的手机上编写 Android 软件,这真有点痛不欲生 - 我使用 Android Studio 做“真正的” Android 开发,借助 SSH 做剩下的。但是有了“Android Things”之后,一切都结束了。 + +所有的示例代码都适用于这三种 SBC,树莓派只是其中之一。 `Build.DEVICE` 常量可以在运行时确定是哪一个,所以你会看到很多如下代码: ``` public static String getGPIOForButton() { @@ -30,7 +32,7 @@ Android Things让IoT如虎添翼 } ``` -我对GPIO处理有浓厚的兴趣。 由于我只熟悉Pi,我只能假定其他SBC工作方式相同,GPIO只是一组引脚,可以定义为输入/输出,是连接物理外部世界的主要接口。 基于Pi Linux的操作系统发行版通过Python中的读取和写入方法提供了完整和便捷的支持,但对于Android,您必须使用NDK编写C ++驱动程序,并通过JNI在Java中与这些驱动程序对接。 不是那么困难,但需要在你的构建链中维护额外的一些东西。 Pi还为I2C指定了2个引脚,时钟和数据,因此需要额外的工作来处理它们。 I2C是真正酷的总线寻址系统,它通过串行化将许多独立的数据引脚转换成一个。 所以这里的优势是 - Android Things已经帮你完成了所有这一切。 你只需要_read()_和_write()_to /from你需要的任何GPIO引脚,I2C同样容易: +我对 GPIO 处理有浓厚的兴趣。 由于我只熟悉树莓派,我只能假定其他 SBC 工作方式相同,GPIO 只是一组引脚,可以定义为输入/输出,是连接物理外部世界的主要接口。 基于 Linux 的树莓派操作系统通过 Python 中的读取和写入方法提供了完整和便捷的支持,但对于 Android,您必须使用 NDK 编写 C++ 驱动程序,并通过 JNI 在 Java 中与这些驱动程序对接。 不是那么困难,但需要在你的构建链中维护额外的一些东西。 树莓派还为 I2C 指定了 2 个引脚:时钟和数据,因此需要额外的工作来处理它们。I2C 是真正酷的总线寻址系统,它通过串行化将许多独立的数据引脚转换成一个。 所以这里的优势是 - Android Things 已经帮你完成了所有这一切。 你只需要 `read()` 和 `write() ` 你需要的任何 GPIO 引脚,I2C 同样容易: ``` public class HomeActivity extends Activity { @@ -68,46 +70,52 @@ public class HomeActivity extends Activity { } } ``` -### Android Things基于Android的哪个版本? -看起来是Android 7.0,这样很好,因为我们可以继承Android以前的所有版本的文档,优化,安全加固等。它也提出了一个有趣的问题 - 与应用程序必须单独管理不同,未来的平台应如何更新升级?请记住,这些设备可能无法连接到互联网。我们可能不在蜂窝/ WiFi连接的舒适空间,虽然之前这些连接至少可用,即使有时不那么可靠。 -另一个担心是,Android Things仅仅是一个名字不同的分支版本的Android,如何选择它们的共同特性,就像启动Arduino(已经发布的一个更像市场营销而不是操作系统的操作系统)这种简单特性。实际上,通过查看[samples] [4],一些功能可能永不再用 - 比如一个最近的Android创新,甚至使用SVG图形作为资源,而不是传统的基于位图的图形,当然Andorid Things也可以轻松处理。 +### Android Things 基于 Android 的哪个版本? -不可避免地,与Android Things相比,普通的Android会抛出问题。例如,权限问题。因为Android Things为固定硬件设计,用户通常不会在这种设备上安装App,所以在一定程序上减轻了这个问题。另外,在没有图形界面的设备上请求权限通常不是问题,我们可以在安装时开放所有权限给App。 通常,这些设备只有一个应用程序,该应用程序从设备上电的那一刻就开始运行。 +看起来是 Android 7.0,这样很好,因为我们可以继承 Android 所有以前版本的平板设计 UI、优化,安全加固等。它也带来了一个有趣的问题 - 与应用程序必须单独管理不同,未来的平台应如何更新升级?请记住,这些设备可能无法连接到互联网。我们可能不便于连接蜂窝/ WiFi ,即便之前这些连接能用,但是有时不那么可靠。 - ![](https://cdn-images-1.medium.com/max/800/1*pi7HyLT-BVwHQ_Rw3TDSWQ.png) +另一个担心是,Android Things 仅仅是一个名字不同的 Android 分支版本,大部分都是一样的,和已经发布的 Arduino 一样,更像为了市场营销而出现,而不是作为操作系统。不过可以放心,实际上通过[样例][4]可以看到,其中一些样例甚至使用了 SVG 图形作为资源,而不是传统的基于位图的图形(当然也能轻松处理) ——这是一个非常新的 Android 创新。 -### Brillo怎么了? +不可避免地,与 Android Things 相比,普通的 Android 会有些不同。例如,权限问题。因为 Android Things 为固定硬件设计,在构建好之后,用户通常不会在这种设备上安装应用,所以在一定程序上减轻了这个问题,尽管当设备要求权限时是个问题——因为它们没有 UI。解决方案是当应用在安装时给予所有需要的权限。 通常,这些设备只有一个应用,并且该应用从设备上电的那一刻就开始运行。 -Brillo是谷歌以前的IoT操作系统的代号,听起来很像Android的前身。 实际上现在你仍然能看到很多Brillo引用,特别是在GitHub Android Things源码的例子中。 然而,它已经不复存在了。新王已经登基! +![](https://cdn-images-1.medium.com/max/800/1*pi7HyLT-BVwHQ_Rw3TDSWQ.png) -### UI指南? -Google针对Android智能手机和平板电脑应用发布了大量指南,例如屏幕按钮间距等。 当然,你最好在可行的情况下遵循这些,但这已经不是本文应该考虑的范畴了。 缺省情况下什么也没有- 应用程序作者决定一切。 这包括顶部状态栏,底部导航栏 - 绝对一切。 多年来谷歌一直叮咛Android应用程序作者不要去渲染屏幕上的返回按钮,因为平台将提供一个抛出异常,因为对于Android Things,[可能甚至不是一个UI!] [5] +### Brillo 怎么了? -### 多少智能手机上的服务可以期待? -有些,但不是所有。第一个预览版本没有蓝牙支持。没有NFC,两者都对物联网革命有重大贡献。 SBC支持他们,所以我们应该不会等待太久。由于没有通知栏,因此不支持任何通知。没有地图。缺省没有软键盘,你必须自己安装一个。由于没有Play商店,你只能屈尊通过 ADB做这个和许多其他操作。 +Brillo 是谷歌以前的 IoT 操作系统的代号,听起来很像 Android Things 的前身。 实际上现在你仍然能看到很多提及 Brillo 的地方,特别是在 GitHub Android Things 源码的文件夹名字中。 然而,它已经不复存在了。新王已经登基! -当开发Android Things时我试图和Pi使用同一个APK。这引发了一个错误,阻止它安装在除Android Things设备之外的任何设备:库“_com.google.android.things_”不存在。 Kinda有意义,因为只有Android Things设备需要这个,但它似乎是有限的,因为不仅智能手机或平板电脑不会出现,任何模拟器也不会。似乎只能在物理Android Things设备上运行和测试您的Android Things应用程序...直到Google在[G + Google的IoT开发人员社区] [6]组中回答了我的问题,并提供了规避方案。但是,躲过初一,躲不过十五 。 +### UI 指南? -### 让我如何期待Android Thing生态演进? +谷歌针对 Android 智能手机和平板电脑应用发布了大量指南,例如屏幕按钮间距等。 当然,你最好在可行的情况下遵循这些,但这已经不是本文应该考虑的范畴了。 缺省情况下什么也没有 - 应用程序作者决定一切,这包括顶部状态栏,底部导航栏 - 绝对是一切。 多年来谷歌一直在告诉 Android 应用程序的作者们绝不要在屏幕上放置返回按钮,因为平台将提供一个,因为 Android Things [可能甚至没有 UI!] [5] -我期望看到移植更多传统的基于Linux服务器的应用程序,这对Android只有智能手机和平板电脑没有意义。例如,Web服务器突然变得非常有用。一些已经存在,但没有像重量级的Apache,或Nginx。物联网设备可能没有本地UI,但通过浏览器管理它们当然是可行的,因此需要用这种方式呈现Web面板。类似的那些如雷贯耳的通讯应用程序 - 它需要的仅是一个麦克风和扬声器,在理论上对任何视频通话应用程序,如Duo,Skype,FB等都可行。这个演变能走多远目前只能猜测。会有Play商店吗?他们会展示广告吗?我们可以确定他们不会窥探我们,或让黑客控制他们?从消费者的角度来看,物联网应该是具有触摸屏的网络连接设备,因为每个人都已经习惯于通过智能手机工作。 +### 智能手机上会有多少谷歌服务? -我还期望看到硬件的迅速发展 - 特别是更多的SBC并且拥有更低的成本。看看惊人的5美元 树莓派0,不幸的是,由于其有限的CPU和RAM,几乎肯定不能运行Android Things。多久之后像这样的设备才能运行Android Things?这是很明显的,标杆已经设定,任何自重的SBC制造商将瞄准Android Things的兼容性,规模经济也将波及到外围设备,如23美元的触摸屏。没人购买不会播放YouTube的微波炉,你的洗碗机会在eBay上购买更多的粉末商品,因为它注意到你很少使用它…… +有一些,但不是所有。第一个预览版本没有蓝牙支持、没有NFC,这两者都对物联网革命有重大贡献。 SBC 支持它们,所以我们应该不会等待太久。由于没有通知栏,因此不支持任何通知。没有地图。缺省没有软键盘,你必须自己安装一个键盘。由于没有 Play 商店,你只能难受地通过 ADB 做这个和许多其他操作。 -然而,我不认为我们会失去掌控力。了解一点Android架构有助于将其视为一个包罗万象的物联网操作系统。它仍然使用Java,并几乎被其所有的垃圾回收机制导致的时序问题锤击致死。这仅仅是问题最少的部分。真正的实时操作系统依赖于可预测,准确和坚如磐石的时序,或者它不能被描述为“mission critical”。想想医疗应用程序,安全监视器,工业控制器等。使用Android,如果主机操作系统认为它需要,理论上可以在任何时候杀死您的活动/服务。在手机上不是那么糟糕 - 用户可以重新启动应用程序,杀死其他应用程序,或重新启动手机。心脏监视器完全是另一码事。如果前台Activity / Service正在监视一个GPIO引脚,并且信号没有被准确地处理,我们已经失败了。必须要做一些相当根本的改变让Android来支持这一点,到目前为止还没有迹象表明它已经在计划之中了。 +当为 Android Things 开发时,我试图为运行在手机上和树莓派上使用同一个 APK。这引发了一个错误,阻止它安装在除 Android Things 设备之外的任何设备:库 `com.google.android.things` 不存在。 这有点用,因为只有 Android Things 设备需要这个,但它似乎是个限制,因为不仅智能手机或平板电脑上没有,连模拟器上也没有。似乎只能在物理 Android Things 设备上运行和测试您的 Android Things 应用程序……直到谷歌在 [G+ 谷歌的 IoT 开发人员社区][6]组中回答了我的问题,并提供了规避方案。但是,躲过初一,躲不过十五。 -###这24小时 -所以,回到我的项目。 我认为我会接管我已经完成和尽力能为的工作,等待不可避免的路障,并向G+社区寻求帮助。 除了一些在非Android Things上如何运行程序 的问题之外 ,没有其他问题。 它运行得很好! 这个项目也使用了一些奇怪的东西,自定义字体,高精定时器 - 所有这些都在Android Studio中完美地展现。对我而言,可以打满分 - 最后我可以开始给出实际原型,而不只是视频和截图。 +### 可以期待 Android Thing 生态演进到什么程度? + +我期望看到移植更多传统的基于 Linux 服务器的应用程序,将 Android 限制在智能手机和平板电脑上没有意义。例如,Web 服务器突然变得非常有用。已经有一些了,但没有像重量级的 Apache 或 Nginx。物联网设备可以没有本地 UI,但通过浏览器管理它们当然是可行的,因此需要用这种方式呈现 Web 面板。类似的那些如雷贯耳的通讯应用程序 - 它需要的仅是一个麦克风和扬声器,而且在理论上任何视频通话应用程序,如 Duo、Skype、FB 等都可行。这个演变能走多远目前只能猜测。会有 Play 商店吗?它们会展示广告吗?我们能够确保它们不会窥探我们,或被黑客控制它们么?从消费者的角度来看,物联网应该是具有触摸屏的网络连接设备,因为每个人都已经习惯于通过智能手机工作。 + +我还期望看到硬件的迅速发展 - 特别是有更多的 SBC 拥有更低的成本。看看惊人的 5 美元 树莓派 Zero,不幸的是,由于其有限的 CPU 和内存,几乎可以肯定不能运行 Android Things。多久之后像这样的设备才能运行 Android Things?这是很明显的,标杆已经设定,任何有追求的 SBC 制造商将瞄准 Android Things 的兼容性,规模经济也将波及到外围设备,如 23 美元的触摸屏。没人会购买不会播放 YouTube 的微波炉,你的洗碗机会在 eBay 上购买更多的清洁粉,因为它注意到你很少使用它…… + +然而,我不认为我们会过于冲昏头脑。了解一点 Android 架构有助于将其视为一个包罗万象的物联网操作系统。它仍然使用 Java,其垃圾回收机制导致的所有时序问题在过去几乎把它搞死。这仅仅是问题最少的部分。真正的实时操作系统依赖于可预测、准确和坚如磐石的时序,或者它不能被用于“关键任务”。想想医疗应用、安全监视器,工业控制器等。使用 Android,如果宿主操作系统认为它需要,理论上可以在任何时候杀死您的活动/服务。这在手机上没那么糟糕 - 用户可以重新启动应用程序,杀死其他应用程序,或重新启动手机。但心脏监视器就完全是另一码事。如果前台的活动/服务正在监视一个 GPIO 引脚,而这个信号没有被准确地处理,我们就完了。必须要做一些相当根本的改变让 Android 来支持这一点,到目前为止还没有迹象表明它已经在计划之中了。 + +###这 24 小时 + +所以,回到我的项目。 我认为我会接管我已经完成和尽力能为的工作,等待不可避免的路障,并向 G+ 社区寻求帮助。 除了一些在非 Android Things 设备上如何运行程序的问题之外,没有其他问题。 它运行得很好! 这个项目也使用了一些奇怪的东西,如自定义字体、高精定时器 - 所有这些都在 Android Studio 中完美地展现。对我而言,可以打满分 - 至少我能够开始做出实际原型,而不只是视频和截图。 ### 蓝图 -今天的物联网操作系统环境看起来非常零碎。 显然没有市场领导者,尽管炒作之声沸反连天,物联网仍然在草创阶段。 谷歌Android物联网能否像它在移动端那样,现在Android在那里的主导地位非常接近90%? 我相信果真如此,Android Things的推出正是重要的一步。 -记住所有的关于开放和封闭软件的战争,它们主要发生在从不授权的苹果和一直担心免费还不够充分的谷歌之间? 那个老梗又来了,因为让苹果推出一个免费的物联网操作系统的构想就像让他们免费赠送下一代iPhone一样遥不可及。 +今天的物联网操作系统环境看起来非常零碎。 显然没有市场领导者,尽管炒作之声沸反连天,物联网仍然在草创阶段。 谷歌 Android 物联网能否像它在移动端那样取得成功?现在 Android 在移动方面的主导地位非常接近 90%。我相信如果真的如此,Android Things 的推出正是重要的一步。 + +记住所有的关于开放和封闭软件的战争,它们主要发生在从不授权的苹果和一直担心免费还不够充分的谷歌之间。那个老梗又来了,因为让苹果推出一个免费的物联网操作系统的构想就像让他们免费赠送下一代 iPhone 一样遥不可及。 物联网操作系统游戏是开放的,大家机遇共享,不过这个时候,封闭派甚至不会公布它们的开发工具箱…… -转到[Developer Preview] [7]网站,立即获取Android Things SDK的副本。 +转到 [Developer Preview][7]网站,立即获取 Android Things SDK 的副本。 -------------------------------------------------------------------------------- @@ -115,7 +123,7 @@ via: https://medium.com/@carl.whalley/will-android-do-for-iot-what-it-did-for-mo 作者:[Carl Whalley][a] 译者:[firstadream](https://github.com/firstadream) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From f2068784fee8566135d773c1521873e14e0db27a Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 21 May 2017 10:51:53 +0800 Subject: [PATCH 0128/1407] PUB:20170214 How to Install Configure and Secure FTP Server in CentOS 7 Comprehensive Guide.md @geekpi --- ... Server in CentOS 7 Comprehensive Guide.md | 104 +++++++++--------- 1 file changed, 53 insertions(+), 51 deletions(-) rename {translated/tech => published}/20170214 How to Install Configure and Secure FTP Server in CentOS 7 Comprehensive Guide.md (57%) diff --git a/translated/tech/20170214 How to Install Configure and Secure FTP Server in CentOS 7 Comprehensive Guide.md b/published/20170214 How to Install Configure and Secure FTP Server in CentOS 7 Comprehensive Guide.md similarity index 57% rename from translated/tech/20170214 How to Install Configure and Secure FTP Server in CentOS 7 Comprehensive Guide.md rename to published/20170214 How to Install Configure and Secure FTP Server in CentOS 7 Comprehensive Guide.md index c132e630a5..3540f10ae7 100644 --- a/translated/tech/20170214 How to Install Configure and Secure FTP Server in CentOS 7 Comprehensive Guide.md +++ b/published/20170214 How to Install Configure and Secure FTP Server in CentOS 7 Comprehensive Guide.md @@ -1,28 +1,28 @@ -如何在 CentOS 7 中安装、配置 SFTP - [全面指南] +完全指南:如何在 CentOS 7 中安装、配置和安全加固 FTP 服务 ============================================================ FTP(文件传输协议)是一种用于通过网络[在服务器和客户端之间传输文件][1]的传统并广泛使用的标准工具,特别是在不需要身份验证的情况下(允许匿名用户连接到服务器)。我们必须明白,默认情况下 FTP 是不安全的,因为它不加密传输用户凭据和数据。 在本指南中,我们将介绍在 CentOS/RHEL7 和 Fedora 发行版中安装、配置和保护 FTP 服务器( VSFTPD 代表 “Very Secure FTP Daemon”)的步骤。 -请注意,本指南中的所有命令将以 root 身份运行,以防你不使用 root 帐户操作服务器,请使用 [sudo命令][2] 获取 root 权限。 +请注意,本指南中的所有命令将以 root 身份运行,如果你不使用 root 帐户操作服务器,请使用 [sudo命令][2] 获取 root 权限。 ### 步骤 1:安装 FTP 服务器 -1. 安装 vsftpd 服务器很直接,只要在终端运行下面的命令。 +1、 安装 vsftpd 服务器很直接,只要在终端运行下面的命令。 ``` # yum install vsftpd ``` -2. 安装完成后,服务会先被禁用,因此我们需要手动启动,并设置在下次启动时自动启用: +2、 安装完成后,服务先是被禁用的,因此我们需要手动启动,并设置在下次启动时自动启用: ``` # systemctl start vsftpd # systemctl enable vsftpd ``` -3. 接下来,为了允许从外部系统访问 FTP 服务,我们需要打开 FTP 守护进程监听 21 端口: +3、 接下来,为了允许从外部系统访问 FTP 服务,我们需要打开 FTP 守护进程监听的 21 端口: ``` # firewall-cmd --zone=public --permanent --add-port=21/tcp @@ -32,7 +32,7 @@ FTP(文件传输协议)是一种用于通过网络[在服务器和客户端 ### 步骤 2: 配置 FTP 服务器 -4. 现在,我们会进行一些配置来设置并加密我们的 FTP 服务器,让我们先备份一下原始配置文件 /etc/vsftpd/vsftpd.conf: +4、 现在,我们会进行一些配置来设置并加密我们的 FTP 服务器,让我们先备份一下原始配置文件 `/etc/vsftpd/vsftpd.conf`: ``` # cp /etc/vsftpd/vsftpd.conf /etc/vsftpd/vsftpd.conf.orig @@ -41,30 +41,30 @@ FTP(文件传输协议)是一种用于通过网络[在服务器和客户端 接下来,打开上面的文件,并将下面的选项设置相关的值: ``` -anonymous_enable=NO # disable anonymous login -local_enable=YES # permit local logins -write_enable=YES # enable FTP commands which change the filesystem -local_umask=022 # value of umask for file creation for local users -dirmessage_enable=YES # enable showing of messages when users first enter a new directory -xferlog_enable=YES # a log file will be maintained detailing uploads and downloads -connect_from_port_20=YES # use port 20 (ftp-data) on the server machine for PORT style connections -xferlog_std_format=YES # keep standard log file format -listen=NO # prevent vsftpd from running in standalone mode -listen_ipv6=YES # vsftpd will listen on an IPv6 socket instead of an IPv4 one -pam_service_name=vsftpd # name of the PAM service vsftpd will use -userlist_enable=YES # enable vsftpd to load a list of usernames -tcp_wrappers=YES # turn on tcp wrappers +anonymous_enable=NO ### 禁用匿名登录 +local_enable=YES ### 允许本地用户登录 +write_enable=YES ### 允许对文件系统做改动的 FTP 命令 +local_umask=022 ### 本地用户创建文件所用的 umask 值 +dirmessage_enable=YES ### 当用户首次进入一个新目录时显示一个消息 +xferlog_enable=YES ### 用于记录上传、下载细节的日志文件 +connect_from_port_20=YES ### 使用端口 20 (ftp-data)用于 PORT 风格的连接 +xferlog_std_format=YES ### 使用标准的日志格式 +listen=NO ### 不要让 vsftpd 运行在独立模式 +listen_ipv6=YES ### vsftpd 将监听 IPv6 而不是 IPv4 +pam_service_name=vsftpd ### vsftpd 使用的 PAM 服务名 +userlist_enable=YES ### vsftpd 支持载入用户列表 +tcp_wrappers=YES ### 使用 tcp wrappers ``` -5. 现在基于用户列表文件 `/etc/vsftpd.userlist` 来配置 FTP 允许/拒绝用户访问。 +5、 现在基于用户列表文件 `/etc/vsftpd.userlist` 来配置 FTP 来允许/拒绝用户的访问。 -默认情况下,如果设置了 userlist_enable=YES,当 userlist_deny 选项设置为 YES 的时候,`userlist_file=/etc/vsftpd.userlist` 中的用户列表被拒绝登录。 +默认情况下,如果设置了 `userlist_enable=YES`,当 `userlist_deny` 选项设置为 `YES` 的时候,`userlist_file=/etc/vsftpd.userlist` 中列出的用户被拒绝登录。 -然而, userlist_deny=NO 更改了设置,意味着只有在 userlist_file=/etc/vsftpd.userlist 显式指定的用户才允许登录。 +然而, 更改配置为 `userlist_deny=NO`,意味着只有在 `userlist_file=/etc/vsftpd.userlist` 显式指定的用户才允许登录。 ``` -userlist_enable=YES # vsftpd will load a list of usernames, from the filename given by userlist_file -userlist_file=/etc/vsftpd.userlist # stores usernames. +userlist_enable=YES ### vsftpd 将从 userlist_file 给出的文件中载入用户名列表 +userlist_file=/etc/vsftpd.userlist ### 存储用户名的文件 userlist_deny=NO ``` @@ -72,30 +72,30 @@ userlist_deny=NO 接下来,我们将介绍如何将 FTP 用户 chroot 到 FTP 用户的家目录(本地 root)中的两种可能情况,如下所述。 -6. 接下来添加下面的选项来限制 FTP 用户到它们自己的家目录。 +6、 接下来添加下面的选项来限制 FTP 用户到它们自己的家目录。 ``` chroot_local_user=YES allow_writeable_chroot=YES ``` -chroot_local_user=YES 意味着用户可以设置 chroot jail,默认是登录后的家目录。 +`chroot_local_user=YES` 意味着用户可以设置 chroot jail,默认是登录后的家目录。 -同样默认的是,出于安全原因,vsftpd 不会允许 chroot jail 目录可写,然而,我们可以添加 allow_writeable_chroot=YES 来覆盖这个设置。 +同样默认的是,出于安全原因,vsftpd 不会允许 chroot jail 目录可写,然而,我们可以添加 `allow_writeable_chroot=YES` 来覆盖这个设置。 保存并关闭文件。 -### 用 SELinux 加密 FTP 服务器 +### 步骤 3: 用 SELinux 加密 FTP 服务器 -7. 现在,让我们设置下面的 SELinux 布尔值来允许 FTP 能读取用户家目录下的文件。请注意,这最初是使用以下命令完成的: +7、现在,让我们设置下面的 SELinux 布尔值来允许 FTP 能读取用户家目录下的文件。请注意,这原本是使用以下命令完成的: ``` # setsebool -P ftp_home_dir on ``` -然而,`ftp_home_dir` 指令由于这个 bug 报告:[https://bugzilla.redhat.com/show_bug.cgi?id=1097775][3] 默认是禁用的。 +然而,由于这个 bug 报告:[https://bugzilla.redhat.com/show_bug.cgi?id=1097775][3],`ftp_home_dir` 指令默认是禁用的。 -现在,我们会使用 semanage 命令来设置 SELinux 规则来允许 FTP 读取/写入用户的家目录。 +现在,我们会使用 `semanage` 命令来设置 SELinux 规则来允许 FTP 读取/写入用户的家目录。 ``` # semanage boolean -m ftpd_full_access --on @@ -109,21 +109,21 @@ chroot_local_user=YES 意味着用户可以设置 chroot jail,默认是登录 ### 步骤 4: 测试 FTP 服务器 -8. 现在我们会用[ useradd 命令][4]创建一个 FTP 用户来测试 FTP 服务器。 +8、 现在我们会用 [useradd 命令][4]创建一个 FTP 用户来测试 FTP 服务器。 ``` # useradd -m -c “Ravi Saive, CEO” -s /bin/bash ravi # passwd ravi ``` -之后,我们如下使用[ echo 命令][5]添加用户 ravi 到文件 /etc/vsftpd.userlist 中: +之后,我们如下使用 [echo 命令][5]添加用户 ravi 到文件 `/etc/vsftpd.userlist` 中: ``` # echo "ravi" | tee -a /etc/vsftpd.userlist # cat /etc/vsftpd.userlist ``` -9. 现在是时候测试我们上面的设置是否可以工作了。让我们使用匿名登录测试,我们可以从下面的截图看到匿名登录不被允许。 +9、 现在是时候测试我们上面的设置是否可以工作了。让我们使用匿名登录测试,我们可以从下面的截图看到匿名登录没有被允许。 ``` # ftp 192.168.56.10 @@ -134,13 +134,14 @@ Name (192.168.56.10:root) : anonymous Login failed. ftp> ``` + [ ![Test Anonymous FTP Login](http://www.tecmint.com/wp-content/uploads/2017/02/Test-Anonymous-FTP-Login.png) ][6] -测试 FTP 匿名登录 +*测试 FTP 匿名登录* -10. 让我们也测试一下没有列在 /etc/vsftpd.userlist 中的用户是否有权限登录,这不是下面截图中的例子: +10、 让我们也测试一下没有列在 `/etc/vsftpd.userlist` 中的用户是否有权限登录,下面截图是没有列入的情况: ``` # ftp 192.168.56.10 @@ -155,9 +156,9 @@ ftp> ![FTP User Login Failed](http://www.tecmint.com/wp-content/uploads/2017/02/FTP-User-Login-Failed.png) ][7] -FTP 用户登录失败 +*FTP 用户登录失败* -11. 现在最后测试一下列在 /etc/vsftpd.userlis 中的用户是否在登录后真的进入了他/她的家目录: +11、 现在最后测试一下列在 `/etc/vsftpd.userlist` 中的用户是否在登录后真的进入了他/她的家目录: ``` # ftp 192.168.56.10 @@ -171,21 +172,22 @@ Remote system type is UNIX. Using binary mode to transfer files. ftp> ls ``` + [ - ![FTP User Login Successful[](http://www.tecmint.com/wp-content/uploads/2017/02/FTP-User-Login.png) + ![FTP User Login Successful](http://www.tecmint.com/wp-content/uploads/2017/02/FTP-User-Login.png) ][8] -用户成功登录 +*用户成功登录* -警告:使用 `allow_writeable_chroot=YES' 有一定的安全隐患,特别是用户具有上传权限或 shell 访问权限时。 +警告:使用 `allow_writeable_chroot=YES` 有一定的安全隐患,特别是用户具有上传权限或 shell 访问权限时。 -只有当你完全知道你正做什么时才激活此选项。重要的是要注意,这些安全性影响并不是 vsftpd 特定的,它们适用于所有 FTP 守护进程,它们也提供将本地用户置于 chroot jail中。 +只有当你完全知道你正做什么时才激活此选项。重要的是要注意,这些安全性影响并不是 vsftpd 特定的,它们适用于所有提供了将本地用户置于 chroot jail 中的 FTP 守护进程。 因此,我们将在下一节中看到一种更安全的方法来设置不同的不可写本地根目录。 ### 步骤 5: 配置不同的 FTP 家目录 -12. 再次打开 vsftpd 配置文件,并将下面不安全的选项注释掉: +12、 再次打开 vsftpd 配置文件,并将下面不安全的选项注释掉: ``` #allow_writeable_chroot=YES @@ -199,7 +201,7 @@ ftp> ls # chmod a-w /home/ravi/ftp ``` -13. 接下来,在用户存储他/她的文件的本地根目录下创建一个文件夹: +13、 接下来,在用户存储他/她的文件的本地根目录下创建一个文件夹: ``` # mkdir /home/ravi/ftp/files @@ -207,11 +209,11 @@ ftp> ls # chmod 0700 /home/ravi/ftp/files/ ``` -、接着在 vsftpd 配置文件中添加/修改这些选项: +接着在 vsftpd 配置文件中添加/修改这些选项: ``` -user_sub_token=$USER # 在本地根目录下插入用户名 -local_root=/home/$USER/ftp # 定义任何用户的本地根目录 +user_sub_token=$USER ### 在本地根目录下插入用户名 +local_root=/home/$USER/ftp ### 定义任何用户的本地根目录 ``` 保存并关闭文件。再说一次,有新的设置后,让我们重启服务: @@ -220,7 +222,7 @@ local_root=/home/$USER/ftp # 定义任何用户的本地根目录 # systemctl restart vsftpd ``` -14. 现在最后在测试一次查看用户本地根目录就是我们在他的家目录创建的 FTP 目录。 +14、 现在最后在测试一次查看用户本地根目录就是我们在他的家目录创建的 FTP 目录。 ``` # ftp 192.168.56.10 @@ -238,7 +240,7 @@ ftp> ls ![FTP User Home Directory Login Successful](http://www.tecmint.com/wp-content/uploads/2017/02/FTP-User-Home-Directory-Login-Successful.png) ][9] -FTP 用户家目录登录成功 +*FTP 用户家目录登录成功* 就是这样了!在本文中,我们介绍了如何在 CentOS 7 中安装、配置以及加密的 FTP 服务器,使用下面的评论栏给我们回复,或者分享关于这个主题的任何有用信息。 @@ -258,7 +260,7 @@ via: http://www.tecmint.com/install-ftp-server-in-centos-7/ 作者:[Aaron Kili][a] 译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 @@ -273,5 +275,5 @@ via: http://www.tecmint.com/install-ftp-server-in-centos-7/ [7]:http://www.tecmint.com/wp-content/uploads/2017/02/FTP-User-Login-Failed.png [8]:http://www.tecmint.com/wp-content/uploads/2017/02/FTP-User-Login.png [9]:http://www.tecmint.com/wp-content/uploads/2017/02/FTP-User-Home-Directory-Login-Successful.png -[10]:http://www.tecmint.com/install-proftpd-in-centos-7/ +[10]:https://linux.cn/article-8504-1.html [11]:http://www.tecmint.com/secure-vsftpd-using-ssl-tls-on-centos/ From d272a19990daa369569f3c6b584c49d856b63e2d Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:23:37 +0800 Subject: [PATCH 0129/1407] =?UTF-8?q?20170521-1=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...Writing Effective Bash Scripts in Linux.md | 177 ++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 sources/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md diff --git a/sources/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md b/sources/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md new file mode 100644 index 0000000000..add8faf39a --- /dev/null +++ b/sources/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md @@ -0,0 +1,177 @@ +10 Useful Tips for Writing Effective Bash Scripts in Linux +============================================================ + +[Shell scripting][4] is the easiest form of programming you can learn/do in Linux. More so, it is a required skill for [system administration for automating tasks][5], developing new simple utilities/tools just to mention but a few. + +In this article, we will share 10 useful and practical tips for writing effective and reliable bash scripts and they include: + +### 1\. Always Use Comments in Scripts + +This is a recommended practice which is not only applied to shell scripting but all other kinds of programming. Writing comments in a script helps you or some else going through your script understand what the different parts of the script do. + +For starters, comments are defined using the `#` sign. + +``` +#TecMint is the best site for all kind of Linux articles +``` + +### 2\. Make a Script exit When Fails + +Sometimes bash may continue to execute a script even when a certain command fails, thus affecting the rest of the script (may eventually result in logical errors). Use the line below to exit a script when a command fails: + +``` +#let script exit if a command fails +set -o errexit +OR +set -e +``` + +### 3\. Make a Script exit When Bash Uses Undeclared Variable + +Bash may also try to use an undeclared script which could cause a logical error. Therefore use the following line to instruct bash to exit a script when it attempts to use an undeclared variable: + +``` +#let script exit if an unsed variable is used +set -o nounset +OR +set -u +``` + +### 4\. Use Double Quotes to Reference Variables + +Using double quotes while referencing (using a value of a variable) helps to prevent word splitting (regarding whitespace) and unnecessary globbing (recognizing and expanding wildcards). + +Check out the example below: + +``` +#!/bin/bash +#let script exit if a command fails +set -o errexit +#let script exit if an unsed variable is used +set -o nounset +echo "Names without double quotes" +echo +names="Tecmint FOSSMint Linusay" +for name in $names; do +echo "$name" +done +echo +echo "Names with double quotes" +echo +for name in "$names"; do +echo "$name" +done +exit 0 +``` + +Save the file and exit, then run it as follows: + +``` +$ ./names.sh +``` + [![Use Double Quotes in Scripts](https://www.tecmint.com/wp-content/uploads/2017/05/Use-Double-Quotes-in-Scripts.png)][6] + +Use Double Quotes in Scripts + +### 5\. Use functions in Scripts + +Except for very small scripts (with a few lines of code), always remember to use functions to modularize your code and make scripts more readable and reusable. + +The syntax for writing functions is as follows: + +``` +function check_root(){ +command1; +command2; +} +OR +check_root(){ +command1; +command2; +} +``` + +For single line code, use termination characters after each command like this: + +``` +check_root(){ command1; command2; } +``` + +### 6\. Use = instead of == for String Comparisons + +Note that `==` is a synonym for `=`, therefore only use a single `=` for string comparisons, for instance: + +``` +value1=”tecmint.com” +value2=”fossmint.com” +if [ "$value1" = "$value2" ] +``` + +### 7\. Use $(command) instead of legacy ‘command’ for Substitution + +[Command substitution][7] replaces a command with its output. Use `$(command)` instead of backquotes ``command`` for command substitution. + +This is recommended even by [shellcheck tool][8] (shows warnings and suggestions for shell scripts). For example: + +``` +user=`echo “$UID”` +user=$(echo “$UID”) +``` + +### 8\. Use Read-only to Declare Static Variables + +A static variable doesn’t change; its value can not be altered once it’s defined in a script: + +``` +readonly passwd_file=”/etc/passwd” +readonly group_file=”/etc/group” +``` + +### 9\. Use Uppercase Names for ENVIRONMENT Variables and Lowercase for Custom Variables + +All bash environment variables are named with uppercase letters, therefore use lowercase letters to name your custom variables to avoid variable name conflicts: + +``` +#define custom variables using lowercase and use uppercase for env variables +nikto_file=”$HOME/Downloads/nikto-master/program/nikto.pl” +perl “$nikto_file” -h “$1” +``` + +### 10\. Always Perform Debugging for Long Scripts + +If you are writing bash scripts with thousands of lines of code, finding errors may become a nightmare. To easily fix things before executing a script, perform some debugging. Master this tip by reading through the guides provided below: + +1. [How To Enable Shell Script Debugging Mode in Linux][1] + +2. [How to Perform Syntax Checking Debugging Mode in Shell Scripts][2] + +3. [How to Trace Execution of Commands in Shell Script with Shell Tracing][3] + +That’s all! Do you have any other best bash scripting practices to share? If yes, then use the comment form below to do that. + +-------------------------------------------------------------------------------- + +作者简介: + + +Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. + +---------------- + +via: https://www.tecmint.com/useful-tips-for-writing-bash-scripts-in-linux/ + +作者:[ Aaron Kili][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://www.tecmint.com/enable-shell-debug-mode-linux/ +[2]:https://www.tecmint.com/check-syntax-in-shell-script/ +[3]:https://www.tecmint.com/trace-shell-script-execution-in-linux/ +[4]:https://www.tecmint.com/category/bash-shell/ +[5]:https://www.tecmint.com/using-shell-script-to-automate-linux-system-maintenance-tasks/ +[6]:https://www.tecmint.com/wp-content/uploads/2017/05/Use-Double-Quotes-in-Scripts.png +[7]:https://www.tecmint.com/assign-linux-command-output-to-variable/ +[8]:https://www.tecmint.com/shellcheck-shell-script-code-analyzer-for-linux/ From 4fd3af77a27385d1f8b7291aae2fdbb574aed9b4 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:25:59 +0800 Subject: [PATCH 0130/1407] =?UTF-8?q?20170521-2=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...s Linux Server Health Status in Real-Time.md | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 sources/tech/20170518 Linfo – Shows Linux Server Health Status in Real-Time.md diff --git a/sources/tech/20170518 Linfo – Shows Linux Server Health Status in Real-Time.md b/sources/tech/20170518 Linfo – Shows Linux Server Health Status in Real-Time.md new file mode 100644 index 0000000000..3fed80265e --- /dev/null +++ b/sources/tech/20170518 Linfo – Shows Linux Server Health Status in Real-Time.md @@ -0,0 +1,130 @@ +Linfo – Shows Linux Server Health Status in Real-Time +============================================================ + + +Linfo is a free and open source, cross-platform server statistics UI/library which displays a great deal of system information. It is extensible, easy-to-use (via composer) PHP5 library to get extensive system statistics programmatically from your PHP application. It’s a Ncurses CLI view of Web UI, which works in Linux, Windows, *BSD, Darwin/Mac OSX, Solaris, and Minix. + +It displays system info including [CPU type/speed][2]; architecture, mount point usage, hard/optical/flash drives, hardware devices, network devices and stats, uptime/date booted, hostname, memory usage (RAM and swap, if possible), temperatures/voltages/fan speeds and RAID arrays. + +#### Requirements: + +* PHP 5.3 + +* pcre extension + +* Linux – /proc and /sys mounted and readable by PHP and Tested with the 2.6.x/3.x kernels + +### How to Install Linfo Server Stats UI/library in Linux + +First, create a Linfo directory in your Apache or Nginx web root directory, then clone and move repository files into `/var/www/html/linfo` using the [rsync command][3] as shown below: + +``` +$ sudo mkdir -p /var/www/html/linfo +$ git clone git://github.com/jrgp/linfo.git +$ sudo rsync -av linfo/ /var/www/html/linfo/ +``` + +Then rename sample.config.inc.php to config.inc.php. This is the Linfo config file, you can define your own values in it: + +``` +$ sudo mv sample.config.inc.php config.inc.php +``` + +Now open the URL `http://SERVER_IP/linfo` in web browser to see the Web UI as shown in the screenshots below. + +This screenshot shows the Linfo Web UI displaying core system info, hardware components, RAM stats, network devices, drives and file system mount points. + + [![Linux Server Health Information](https://www.tecmint.com/wp-content/uploads/2017/05/Linux-Server-Health-Information.png)][4] + +Linux Server Health Information + +You can add the line below in the config file `config.inc.php` to yield useful error messages for troubleshooting purposes: + +``` +$settings['show_errors'] = true; +``` + +### Running Linfo in Ncurses Mode + +Linfo has a simple ncurses-based interface, which rely on php’s ncurses extension. + +``` +# yum install php-pecl-ncurses [On CentOS/RHEL] +# dnf install php-pecl-ncurses [On Fedora] +$ sudo apt-get install php5-dev libncurses5-dev [On Debian/Ubuntu] +``` + +Now compile the php extension as follows + +``` +$ wget http://pecl.php.net/get/ncurses-1.0.2.tgz +$ tar xzvf ncurses-1.0.2.tgz +$ cd ncurses-1.0.2 +$ phpize # generate configure script +$ ./configure +$ make +$ sudo make install +``` + +Next, if you successfully compiled and installed the php extension, run the commands below. + +``` +$ sudo echo extension=ncurses.so > /etc/php5/cli/conf.d/ncurses.ini +``` + +Verify the ncurses. + +``` +$ php -m | grep ncurses +``` + +Now run the Linfo. + +``` +$ cd /var/www/html/linfo/ +$ ./linfo-curses +``` + [![Linux Server Information](https://www.tecmint.com/wp-content/uploads/2017/05/Linux-Server-Information.png)][5] + +Linux Server Information + +The following features yet to be added in Linfo: + +1. Support for more Unix operating systems (such as Hurd, IRIX, AIX, HP UX, etc) + +2. Support for less known operating systems: Haiku/BeOS + +3. Extra superfluous features/extensions + +4. Support for [htop-like][1] features in ncurses mode + +For more information, visit Linfo Github repository: [https://github.com/jrgp/linfo][6] + +That’s all! From now on, you can view a Linux system’s information from within a web browser using Linfo. Try it out and share with us your thoughts in the comments. Additionally, have you come across any similar useful tools/libraries? If yes, then give us some info about them as well. + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. + +--------------- + +via: https://www.tecmint.com/linfo-shows-linux-server-health-status-in-real-time/ + +作者:[ Aaron Kili ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://www.tecmint.com/install-htop-linux-process-monitoring-for-rhel-centos-fedora/ +[2]:https://www.tecmint.com/corefreq-linux-cpu-monitoring-tool/ +[3]:https://www.tecmint.com/rsync-local-remote-file-synchronization-commands/ +[4]:https://www.tecmint.com/wp-content/uploads/2017/05/Linux-Server-Health-Information.png +[5]:https://www.tecmint.com/wp-content/uploads/2017/05/Linux-Server-Information.png +[6]:https://github.com/jrgp/linfo +[7]:https://www.tecmint.com/author/aaronkili/ +[8]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[9]:https://www.tecmint.com/free-linux-shell-scripting-books/ From 4e86b0623debc748332b3643db81095891e0e2c0 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:27:23 +0800 Subject: [PATCH 0131/1407] =?UTF-8?q?20170521-3=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...to Delete HUGE 100-200GB Files in Linux.md | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 sources/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md diff --git a/sources/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md b/sources/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md new file mode 100644 index 0000000000..1bb5f71375 --- /dev/null +++ b/sources/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md @@ -0,0 +1,87 @@ +How to Delete HUGE (100-200GB) Files in Linux +============================================================ + +by [Aaron Kili][11] | Published: May 11, 2017 | Last Updated: May 11, 2017 + + Download Your Free eBooks NOW - [10 Free Linux eBooks for Administrators][12] | [4 Free Shell Scripting eBooks][13] + +Usually, to [delete/remove a file from Linux terminal][1], we use the rm command (delete files), shred command (securely delete a file), wipe command (securely erase a file) or secure-deletion toolkit (a collection of [secure file deletion tools][2]). + +We can use any of the above utilities to deal with relatively small files. What if we want to delete/remove a huge file/directory say of about 100-200GB. This may not be as easy as it seems, in terms of the time taken to remove the file (I/O scheduling) as well as the amount of RAM consumed while carrying out the operation. + +In this tutorial, we will explain how to efficiently and reliably delete huge files/directories in Linux. + +**Suggested Read:** [5 Ways to Empty or Delete a Large File Content in Linux][3] + +The main aim here is to use a technique that will not slow down the system while removing a huge file, resulting to reasonable I/O. We can achieve this using the ionice command. + +### Deleting HUGE (200GB) Files in Linux Using ionice Command + +ionice is a useful program which sets or gets the I/O scheduling class and priority for another program. If no arguments or just `-p` is given, ionice will query the current I/O scheduling class and priority for that process. + +If we give a command name such as rm command, it will run this command with the given arguments. To specify the [process IDs of running processes][4] for which to get or set the scheduling parameters, run this: + +``` +# ionice -p PID +``` + +To specify the name or number of the scheduling class to use (0 for none, 1 for real time, 2 for best-effort, 3 for idle) the command below. + +This means that rm will belong to idle I/O class and only uses I/O when any other process does not need it: + +``` +---- Deleting Huge Files in Linux ----- +# ionice -c 3 rm /var/logs/syslog +# ionice -c 3 rm -rf /var/log/apache +``` + +If there won’t be much idle time on the system, then we may want to use the best-effort scheduling class and set a low priority like this: + +``` +# ionice -c 2 -n 6 rm /var/logs/syslog +# ionice -c 2 -n 6 rm -rf /var/log/apache +``` + +Note: To delete huge files using a secure method, we may use the shred, wipe and various tools in the secure-deletion toolkit mentioned earlier on, instead of rm command. + +**Suggested Read:** [3 Ways to Permanently and Securely Delete Files/Directories’ in Linux][5] + +For more info, look through the ionice man page: + +``` +# man ionice +``` + +That’s it for now! What other methods do you have in mind for the above purpose? Use the comment section below to share with us. + + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. + +------------------ + +via: https://www.tecmint.com/delete-huge-files-in-linux/ + +作者:[Aaron Kili ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://www.tecmint.com/permanently-and-securely-delete-files-directories-linux/ +[2]:https://www.tecmint.com/permanently-and-securely-delete-files-directories-linux/ +[3]:https://www.tecmint.com/empty-delete-file-content-linux/ +[4]:https://www.tecmint.com/find-linux-processes-memory-ram-cpu-usage/ +[5]:https://www.tecmint.com/permanently-and-securely-delete-files-directories-linux/ +[6]:https://www.tecmint.com/delete-huge-files-in-linux/# +[7]:https://www.tecmint.com/delete-huge-files-in-linux/# +[8]:https://www.tecmint.com/delete-huge-files-in-linux/# +[9]:https://www.tecmint.com/delete-huge-files-in-linux/# +[10]:https://www.tecmint.com/delete-huge-files-in-linux/#comments +[11]:https://www.tecmint.com/author/aaronkili/ +[12]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[13]:https://www.tecmint.com/free-linux-shell-scripting-books/ From 75a128de620115434cdacd5666ff8079e7d76270 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:28:29 +0800 Subject: [PATCH 0132/1407] =?UTF-8?q?20170521-4=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...e to Users Before Linux Server Shutdown.md | 79 +++++++++++++++++++ 1 file changed, 79 insertions(+) create mode 100644 sources/tech/20170515 Show a Custom Message to Users Before Linux Server Shutdown.md diff --git a/sources/tech/20170515 Show a Custom Message to Users Before Linux Server Shutdown.md b/sources/tech/20170515 Show a Custom Message to Users Before Linux Server Shutdown.md new file mode 100644 index 0000000000..690aac80b0 --- /dev/null +++ b/sources/tech/20170515 Show a Custom Message to Users Before Linux Server Shutdown.md @@ -0,0 +1,79 @@ +Show a Custom Message to Users Before Linux Server Shutdown +============================================================ + + +In a previous article, we explained the [difference between shutdown, poweroff, halt and reboot][3] Linux commands, where we uncovered what these mentioned commands actually do when you execute them with various options. + +This article will show you how to send a custom message to all system users before shutting down a Linux server. + +**Suggested Read:** [tuptime – Shows Historical and Statistical Running Time of Linux Systems][4] + +As a system administrator, before you can shut down a server, you may want to send system users a message alerting them that the system is going. By default, the shutdown command broadcasts a message to other system users as shown in the screenshot below: + +``` +# shutdown 13:25 +``` +Linux Shutdown Broadcast Message +``` +Shutdown scheduled for Fri 2017-05-12 13:25:00 EAT, use 'shutdown -c' to cancel. +Broadcast message for root@tecmint (Fri 2017-05-12 13:23:34 EAT): +The system is going down for power-off at Fri 2017-05-12 13:25:00 EAT! +``` + +To send a custom message to other system users before an in line shutdown, run the command below. In this example, the shutdown will happen after two minutes from the time of command execution: + +``` +# shutdown 2 The system is going down for required maintenance. Please save any important work you are doing now! +``` + [![Linux System Shutdown Message](https://www.tecmint.com/wp-content/uploads/2017/05/Linux-System-Shutdown-Message.png)][5] + +Linux System Shutdown Message + +Supposing you have certain critical system operations such as scheduled system backups or updates to be executed at a time the system would be down, you can cancel the shutdown using the `-c` switch as shown below and initiate it at a later time after such operations have been performed: + +``` +# shutdown -c +``` +Linux Shutdown Cancel Message +``` +Shutdown scheduled for Fri 2017-05-12 14:10:22 EAT, use 'shutdown -c' to cancel. +Broadcast message for root@tecmint (Fri 2017-05-14 :10:27 EAT): +The system shutdown has been cancelled at Fri 2017-05-12 14:11:27 EAT! +``` + +Additionally, learn how to [auto execute commands/scripts during reboot or startup][6] using simple and traditional methods in Linux. + +Don’t Miss: + +1. [Managing System Startup Process and Services (SysVinit, Systemd and Upstart)][1] + +2. [11 Cron Scheduling Task Examples in Linux][2] + +Now you know how to send custom messages to all other system users before a system shutdown. Are there any ideas you want to share relating to this topic? Use the comment form below to do that? + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. + +------------------ + +via: https://www.tecmint.com/show-linux-server-shutdown-message/ + +作者:[Aaron Kili ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://www.tecmint.com/linux-boot-process-and-manage-services/ +[2]:https://www.tecmint.com/11-cron-scheduling-task-examples-in-linux/ +[3]:https://www.tecmint.com/shutdown-poweroff-halt-and-reboot-commands-in-linux/ +[4]:https://www.tecmint.com/find-linux-uptime-shutdown-and-reboot-time-with-tuptime/ +[5]:https://www.tecmint.com/wp-content/uploads/2017/05/Linux-System-Shutdown-Message.png +[6]:https://www.tecmint.com/auto-execute-linux-scripts-during-reboot-or-startup/ +[7]:https://www.tecmint.com/author/aaronkili/ +[8]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[9]:https://www.tecmint.com/free-linux-shell-scripting-books/ From ce1203bc5a3ba682376a2e2b5e7dd1c98d474c36 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:29:39 +0800 Subject: [PATCH 0133/1407] =?UTF-8?q?20170521-5=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...to Password Protect a Vim File in Linux.md | 156 ++++++++++++++++++ 1 file changed, 156 insertions(+) create mode 100644 sources/tech/20170509 How to Password Protect a Vim File in Linux.md diff --git a/sources/tech/20170509 How to Password Protect a Vim File in Linux.md b/sources/tech/20170509 How to Password Protect a Vim File in Linux.md new file mode 100644 index 0000000000..3085392c42 --- /dev/null +++ b/sources/tech/20170509 How to Password Protect a Vim File in Linux.md @@ -0,0 +1,156 @@ +How to Password Protect a Vim File in Linux +============================================================ + + Download Your Free eBooks NOW - [10 Free Linux eBooks for Administrators][16] | [4 Free Shell Scripting eBooks][17] + +[Vim][5] is a popular, feature-rich and highly-extensible [text editor for Linux][6], and one of its special features is support for encrypting text files using various crypto methods with a password. + +In this article, we will explain to you one of the simple Vim usage tricks; password protecting a file using Vim in Linux. We will show you how to secure a file at the time of its creation as well as after opening it for modification. + +**Suggested Read:** [10 Reasons Why You Should Use Vim Editor in Linux][7] + +To install the full version of Vim, simply run this command: + +``` +$ sudo apt install vim #Debian/Ubuntu systems +$ sudo yum install vim #RHEL/CentOS systems +$ sudo dnf install vim #Fedora 22+ +``` + +Read Also: [Vim 8.0 Is Released After 10 Years – Install on Linux][8] + +### How to Password Protect a Vim File in Linux + +Vim has a `-x` option which enables you to use encryption when creating files. Once you run the [vim command][9]below, you’ll be prompted for a crypt key: + +``` +$ vim -x file.txt +Warning: Using a weak encryption method; see :help 'cm' +Enter encryption key: ******* +Enter same key again: ******* +``` + +If the crypto key matches after entering it for the second time, you can proceed to modify the file. + + [![Vim File Password Protected](https://www.tecmint.com/wp-content/uploads/2017/05/Vim-File-Password-Protected-File.png)][10] + +Vim File Password Protected + +Once your done, press `[Esc]` and `:wq` to save and close the file. The next time you want to open it for editing, you’ll have to enter the crypto key like this: + +``` +$ vim file.txt +Need encryption key for "file.txt" +Warning: Using a weak encryption method; see :help 'cm' +Enter encryption key: ******* +``` + +In case you enter a wrong password (or no key), you’ll see some junk characters. + + [![Vim Content Encrypted](https://www.tecmint.com/wp-content/uploads/2017/05/Vim-Content-Encrypted.png)][11] + +Vim Content Encrypted + +#### Setting a Strong Encryption Method in Vim + +Note: There is a warning indicating that a weak encryption method has been used to protect the file. Next, we’ll see how to set a strong encryption method in Vim. + + [![Weak Encryption on Vim File](https://www.tecmint.com/wp-content/uploads/2017/05/Weak-Encryption-on-Vim-File.png)][12] + +Weak Encryption on Vim File + +To check the set of cryptmethod(cm), type (scroll down to view all available methods): + +``` +:help 'cm' +``` + +##### Sample Output + +``` + *'cryptmethod'* *'cm'* +'cryptmethod' 'cm' string (default "zip") +global or local to buffer |global-local| +{not in Vi} +Method used for encryption when the buffer is written to a file: +*pkzip* +zip PkZip compatible method. A weak kind of encryption. +Backwards compatible with Vim 7.2 and older. +*blowfish* +blowfish Blowfish method. Medium strong encryption but it has +an implementation flaw. Requires Vim 7.3 or later, +files can NOT be read by Vim 7.2 and older. This adds +a "seed" to the file, every time you write the file +options.txt [Help][RO] +``` + +You can set a new cryptomethod on a Vim file as shown below (we’ll use blowfish2 in this example): + +``` +:setlocal cm=blowfish2 +``` + +Then press `[Enter]` and `:wq` to save the file. + + [![Set Strong Encryption on Vim File](https://www.tecmint.com/wp-content/uploads/2017/05/Set-Strong-Encryption-on-Vim-File.png)][13] + +Set Strong Encryption on Vim File + +Now you should not see the warning message when you open the file again as shown below. + +``` +$ vim file.txt +Need encryption key for "file.txt" +Enter encryption key: ******* +``` + +You can also set a password after opening a Vim text file, use the command`:X` and set a crypto pass like shown above. + +Check out some of our useful articles on Vim editor. + +1. [Learn Useful Vim Editor Trips and Tricks in Linux][1] + +2. [8 Useful Vim Editor Tricks for Every Linux User][2] + +3. [spf13-vim – The Ultimate Distribution for Vim Editor][3] + +4. [How to Use Vim Editor as Bash IDE in Linux][4] + +That’s all! In this article, we explained how to password protect a file via the [Vim text editor in Linux][14]. + +Always remember to appropriately secure text files that could contain secret info such as usernames and passwords, financial account info and so on, using strong encryption and a password. Use the feedback section below to share any thoughts with us. + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. + +------------------ + +via: https://www.tecmint.com/password-protect-vim-file-in-linux/ + +作者:[Aaron Kili ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://www.tecmint.com/learn-vi-and-vim-editor-tips-and-tricks-in-linux/ +[2]:https://www.tecmint.com/how-to-use-vi-and-vim-editor-in-linux/ +[3]:https://www.tecmint.com/spf13-vim-offers-vim-plugins-vim-editor/ +[4]:https://www.tecmint.com/use-vim-as-bash-ide-using-bash-support-in-linux/ +[5]:https://www.tecmint.com/vi-editor-usage/ +[6]:https://www.tecmint.com/best-open-source-linux-text-editors/ +[7]:https://www.tecmint.com/reasons-to-learn-vi-vim-editor-in-linux/ +[8]:https://www.tecmint.com/vim-8-0-install-in-ubuntu-linux-systems/ +[9]:https://www.tecmint.com/linux-command-line-editors/ +[10]:https://www.tecmint.com/wp-content/uploads/2017/05/Vim-File-Password-Protected-File.png +[11]:https://www.tecmint.com/wp-content/uploads/2017/05/Vim-Content-Encrypted.png +[12]:https://www.tecmint.com/wp-content/uploads/2017/05/Weak-Encryption-on-Vim-File.png +[13]:https://www.tecmint.com/wp-content/uploads/2017/05/Set-Strong-Encryption-on-Vim-File.png +[14]:https://www.tecmint.com/vi-editor-usage/ +[15]:https://www.tecmint.com/author/aaronkili/ +[16]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[17]:https://www.tecmint.com/free-linux-shell-scripting-books/ From ab053fb4bf40b0905a35ba6f1c0f54f6f362114b Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:31:17 +0800 Subject: [PATCH 0134/1407] =?UTF-8?q?20170521-6=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... Server Configuration and Policy in Linux.md | 295 ++++++++++++++++++ 1 file changed, 295 insertions(+) create mode 100644 sources/tech/20170509 ssh_scan – Verifies Your SSH Server Configuration and Policy in Linux.md diff --git a/sources/tech/20170509 ssh_scan – Verifies Your SSH Server Configuration and Policy in Linux.md b/sources/tech/20170509 ssh_scan – Verifies Your SSH Server Configuration and Policy in Linux.md new file mode 100644 index 0000000000..b80cc340a0 --- /dev/null +++ b/sources/tech/20170509 ssh_scan – Verifies Your SSH Server Configuration and Policy in Linux.md @@ -0,0 +1,295 @@ +ssh_scan – Verifies Your SSH Server Configuration and Policy in Linux +============================================================ + + +ssh_scan is an easy-to-use prototype SSH configuration and policy scanner for Linux and UNIX servers, inspired by [Mozilla OpenSSH Security Guide][6], which provides a reasonable baseline policy recommendation for SSH configuration parameters such as Ciphers, MACs, and KexAlgos and much more. + +It has some of the following benefits: + +* It has minimal dependencies, ssh_scan only employs native Ruby and BinData to do its work, no heavy dependencies. + +* It’s portable, you can use ssh_scan in another project or for [automation of tasks][1]. + +* It’s easy to use, simply point it at an SSH service and get a JSON report of what it supports and it’s policy status. + +* It’s also configurable, you can create your own custom policies that fit your specific policy requirements. + +**Suggested Read:** [How to Install and Configure OpenSSH Server in Linux][7] + +### How to Install ssh_scan in Linux + +There are three ways you can install ssh_scan and they are: + +To install and run as a gem, type: + +``` +----------- On Debian/Ubuntu ----------- +$ sudo apt-get install ruby gem +$ sudo gem install ssh_scan +----------- On CentOS/RHEL ----------- +# yum install ruby rubygem +# gem install ssh_scan +``` + +To run from a [docker container][8], type: + +``` +# docker pull mozilla/ssh_scan +# docker run -it mozilla/ssh_scan /app/bin/ssh_scan -t github.com +``` + +To install and run from source, type: + +``` +# git clone https://github.com/mozilla/ssh_scan.git +# cd ssh_scan +# gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3 +# curl -sSL https://get.rvm.io | bash -s stable +# rvm install 2.3.1 +# rvm use 2.3.1 +# gem install bundler +# bundle install +# ./bin/ssh_scan +``` + +### How to Use ssh_scan in Linux + +The syntax for using ssh_scan is as follows: + +``` +$ ssh_scan -t ip-address +$ ssh_scan -t server-hostname +``` + +For example to scan SSH configs and policy of server 92.168.43.198, enter: + +``` +$ ssh_scan -t 192.168.43.198 +``` + +Note you can also pass a [IP/Range/Hostname] to the `-t` option as shown in the options below: + +``` +$ ssh_scan -t 192.168.43.198,200,205 +$ ssh_scan -t test.tecmint.lan +``` + +##### Sample Output + +``` +I, [2017-05-09T10:36:17.913644 #7145] INFO -- : You're using the latest version of ssh_scan 0.0.19 +[ +{ +"ssh_scan_version": "0.0.19", +"ip": "192.168.43.198", +"port": 22, +"server_banner": "SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.1", +"ssh_version": 2.0, +"os": "ubuntu", +"os_cpe": "o:canonical:ubuntu:16.04", +"ssh_lib": "openssh", +"ssh_lib_cpe": "a:openssh:openssh:7.2p2", +"cookie": "68b17bcca652eeaf153ed18877770a38", +"key_algorithms": [ +"curve25519-sha256@libssh.org", +"ecdh-sha2-nistp256", +"ecdh-sha2-nistp384", +"ecdh-sha2-nistp521", +"diffie-hellman-group-exchange-sha256", +"diffie-hellman-group14-sha1" +], +"server_host_key_algorithms": [ +"ssh-rsa", +"rsa-sha2-512", +"rsa-sha2-256", +"ecdsa-sha2-nistp256", +"ssh-ed25519" +], +"encryption_algorithms_client_to_server": [ +"chacha20-poly1305@openssh.com", +"aes128-ctr", +"aes192-ctr", +"aes256-ctr", +"aes128-gcm@openssh.com", +"aes256-gcm@openssh.com" +], +"encryption_algorithms_server_to_client": [ +"chacha20-poly1305@openssh.com", +"aes128-ctr", +"aes192-ctr", +"aes256-ctr", +"aes128-gcm@openssh.com", +"aes256-gcm@openssh.com" +], +"mac_algorithms_client_to_server": [ +"umac-64-etm@openssh.com", +"umac-128-etm@openssh.com", +"hmac-sha2-256-etm@openssh.com", +"hmac-sha2-512-etm@openssh.com", +"hmac-sha1-etm@openssh.com", +"umac-64@openssh.com", +"umac-128@openssh.com", +"hmac-sha2-256", +"hmac-sha2-512", +"hmac-sha1" +], +"mac_algorithms_server_to_client": [ +"umac-64-etm@openssh.com", +"umac-128-etm@openssh.com", +"hmac-sha2-256-etm@openssh.com", +"hmac-sha2-512-etm@openssh.com", +"hmac-sha1-etm@openssh.com", +"umac-64@openssh.com", +"umac-128@openssh.com", +"hmac-sha2-256", +"hmac-sha2-512", +"hmac-sha1" +], +"compression_algorithms_client_to_server": [ +"none", +"zlib@openssh.com" +], +"compression_algorithms_server_to_client": [ +"none", +"zlib@openssh.com" +], +"languages_client_to_server": [ +], +"languages_server_to_client": [ +], +"hostname": "tecmint", +"auth_methods": [ +"publickey", +"password" +], +"fingerprints": { +"rsa": { +"known_bad": "false", +"md5": "0e:d0:d7:11:f0:9b:f8:33:9c:ab:26:77:e5:66:9e:f4", +"sha1": "fc:8d:d5:a1:bf:52:48:a6:7e:f9:a6:2f:af:ca:e2:f0:3a:9a:b7:fa", +"sha256": "ff:00:b4:a4:40:05:19:27:7c:33:aa:db:a6:96:32:88:8e:bf:05:a1:81:c0:a4:a8:16:01:01:0b:20:37:81:11" +} +}, +"start_time": "2017-05-09 10:36:17 +0300", +"end_time": "2017-05-09 10:36:18 +0300", +"scan_duration_seconds": 0.221573169, +"duplicate_host_key_ips": [ +], +"compliance": { +"policy": "Mozilla Modern", +"compliant": false, +"recommendations": [ +"Remove these Key Exchange Algos: diffie-hellman-group14-sha1", +"Remove these MAC Algos: umac-64-etm@openssh.com, hmac-sha1-etm@openssh.com, umac-64@openssh.com, hmac-sha1", +"Remove these Authentication Methods: password" +], +"references": [ +"https://wiki.mozilla.org/Security/Guidelines/OpenSSH" +] +} +} +] +``` + +You can use `-p` to specify a different port, `-L` to enable the logger and `-V` to define the verbosity level as shown below: + +``` +$ ssh_scan -t 192.168.43.198 -p 22222 -L ssh-scan.log -V INFO +``` + +Additionally, use a custom policy file (default is Mozilla Modern) with the `-P` or `--policy [FILE]` like so: + +``` +$ ssh_scan -t 192.168.43.198 -L ssh-scan.log -V INFO -P /path/to/custom/policy/file +``` + +Type this to view all ssh_scan usage options and more examples: + +``` +$ ssh_scan -h +``` + +##### Sample Output + +``` +ssh_scan v0.0.17 (https://github.com/mozilla/ssh_scan) +Usage: ssh_scan [options] +-t, --target [IP/Range/Hostname] IP/Ranges/Hostname to scan +-f, --file [FilePath] File Path of the file containing IP/Range/Hostnames to scan +-T, --timeout [seconds] Timeout per connect after which ssh_scan gives up on the host +-L, --logger [Log File Path] Enable logger +-O, --from_json [FilePath] File to read JSON output from +-o, --output [FilePath] File to write JSON output to +-p, --port [PORT] Port (Default: 22) +-P, --policy [FILE] Custom policy file (Default: Mozilla Modern) +--threads [NUMBER] Number of worker threads (Default: 5) +--fingerprint-db [FILE] File location of fingerprint database (Default: ./fingerprints.db) +--suppress-update-status Do not check for updates +-u, --unit-test [FILE] Throw appropriate exit codes based on compliance status +-V [STD_LOGGING_LEVEL], +--verbosity +-v, --version Display just version info +-h, --help Show this message +Examples: +ssh_scan -t 192.168.1.1 +ssh_scan -t server.example.com +ssh_scan -t ::1 +ssh_scan -t ::1 -T 5 +ssh_scan -f hosts.txt +ssh_scan -o output.json +ssh_scan -O output.json -o rescan_output.json +ssh_scan -t 192.168.1.1 -p 22222 +ssh_scan -t 192.168.1.1 -p 22222 -L output.log -V INFO +ssh_scan -t 192.168.1.1 -P custom_policy.yml +ssh_scan -t 192.168.1.1 --unit-test -P custom_policy.yml +``` + +Check out some useful artilces on SSH Server: + +1. [SSH Passwordless Login Using SSH Keygen in 5 Easy Steps][2] + +2. [5 Best Practices to Secure SSH Server][3] + +3. [Restrict SSH User Access to Certain Directory Using Chrooted Jail][4] + +4. [How to Configure Custom SSH Connections to Simplify Remote Access][5] + +For more details visit ssh_scan Github repository: [https://github.com/mozilla/ssh_scan][9] + +In this article, we showed you how to set up and use ssh_scan in Linux. Do you know of any similar tools out there? Let us know via the feedback form below, including any other thoughts concerning this guide. + +SHARE[+][10][0][11][20][12][25][13] [![Ask Anything](https://www.tecmint.com/wp-content/themes/tecmint/images/help.png)][14] + +-------------------------------------------------------------------------------- +作者简介: + +Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. + +------------------ + +via: https://www.tecmint.com/ssh_scan-ssh-configuration-and-policy-scanner-for-linux/ + +作者:[Aaron Kili ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://www.tecmint.com/automating-linux-system-administration-tasks/ +[2]:https://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/ +[3]:https://www.tecmint.com/5-best-practices-to-secure-and-protect-ssh-server/ +[4]:https://www.tecmint.com/restrict-ssh-user-to-directory-using-chrooted-jail/ +[5]:https://www.tecmint.com/configure-custom-ssh-connection-in-linux/ +[6]:https://wiki.mozilla.org/Security/Guidelines/OpenSSH +[7]:https://www.tecmint.com/install-openssh-server-in-linux/ +[8]:https://www.tecmint.com/install-docker-and-learn-containers-in-centos-rhel-7-6/ +[9]:https://github.com/mozilla/ssh_scan +[10]:https://www.tecmint.com/ssh_scan-ssh-configuration-and-policy-scanner-for-linux/# +[11]:https://www.tecmint.com/ssh_scan-ssh-configuration-and-policy-scanner-for-linux/# +[12]:https://www.tecmint.com/ssh_scan-ssh-configuration-and-policy-scanner-for-linux/# +[13]:https://www.tecmint.com/ssh_scan-ssh-configuration-and-policy-scanner-for-linux/# +[14]:https://www.tecmint.com/ssh_scan-ssh-configuration-and-policy-scanner-for-linux/#comments +[15]:https://www.tecmint.com/author/aaronkili/ +[16]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[17]:https://www.tecmint.com/free-linux-shell-scripting-books/ From e0dc4c758e86d4ebdc12cfd7b60698314c0778c6 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:33:02 +0800 Subject: [PATCH 0135/1407] =?UTF-8?q?20170521-7=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... Device into Linux Command Line Interface.md | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 sources/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md diff --git a/sources/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md b/sources/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md new file mode 100644 index 0000000000..766b901c88 --- /dev/null +++ b/sources/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md @@ -0,0 +1,83 @@ +T-UI Launcher – Turns Android Device into Linux Command Line Interface +============================================================ + +Are you a command line guru, or do you simply want to make your Android device unusable for friends and family, then check out T-UI Launcher app. Unix/Linux users will definitely love this. + +T-UI Launcher is a free lightweight Android app with a Linux-like CLI (Command Line Interface) that turns your regular Android device into a complete command line interface. It is a simple, quick and smart launcher for those who love to work with text-based interfaces. + +#### T-UI Launcher Features + +Below are some of its notable features: + +* Shows quick usage guide after the first launch. + +* It’s fast and fully customizable. + +* Offers to autocomplete menu with fast, powerful alias system. + +* Also, provides predictive suggestions and offers a serviceable search function. + +It is free, and you can [download and install][1] it from Google Play Store, then run it on your Android device. + +Once you have installed it, you’ll be shown a quick usage guide when you first launch it. After reading the guide, you can start using it with simple commands as the ones explained below. + + [![T-UI Commandline Help Guide](https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Help.jpg)][2] + +T-UI Commandline Help Guide + +To launch an app, simply type the first few letter in its name and the auto completion functionality will show all the available apps on the screen. Then click on the one you want to open. + +``` +$ Telegram #launch telegram +$ WhatsApp #launch whatsapp +$ Chrome #launch chrome +``` + [![T-UI Commandline Usage](https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Usage.jpg)][3] + +T-UI Commandline Usage + +To view your Android device status (battery charge, wifi, mobile data), type. + +``` +$ status +``` + [![Android Phone Status](https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Status.jpg)][4] + +Android Phone Status + +Other useful commands you can use. + +``` +$ uninstall telegram #uninstall telegram +$ search [google, playstore, youtube, files] #search online apps or for a local file +$ wifi #trun wifi on or off +$ cp Downloads/* Music #copy all files from Download folder to Music +$ mv Downloads/* Music #move all files from Download folder to Music +``` + +That’s all! In this article, we reviewed simple yet useful Android app with a Linux-like CLI (Command Line Interface) that turns your regular Android device into a complete command line interface. Give it a try and share your thoughts with us via the comment section below. + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. + +------------------ + +via: https://www.tecmint.com/t-ui-launcher-turns-android-device-into-linux-cli/ + +作者:[Aaron Kili ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://play.google.com/store/apps/details?id=ohi.andre.consolelauncher +[2]:https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Help.jpg +[3]:https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Usage.jpg +[4]:https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Status.jpg +[5]:https://www.tecmint.com/author/aaronkili/ +[6]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[7]:https://www.tecmint.com/free-linux-shell-scripting-books/ From cc95c7c65136326eb1209e430dc93c8dc3159dac Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:34:04 +0800 Subject: [PATCH 0136/1407] =?UTF-8?q?20170521-7=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...nner to Find Security Issues in WordPress.md | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 sources/tech/20170505 WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress.md diff --git a/sources/tech/20170505 WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress.md b/sources/tech/20170505 WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress.md new file mode 100644 index 0000000000..c99a827a09 --- /dev/null +++ b/sources/tech/20170505 WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress.md @@ -0,0 +1,91 @@ +WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress +============================================================ + +by [Aaron Kili][9] | Published: May 5, 2017 | Last Updated: May 5, 2017 + + Download Your Free eBooks NOW - [10 Free Linux eBooks for Administrators][10] | [4 Free Shell Scripting eBooks][11] + +WordPress is a free and open-source, highly customizable content management system (CMS) that is being used by millions around the world to run blogs and fully functional websites. Because it is the most used CMS out there, there are so many potential WordPress security issues/vulnerabilities to be concerned about. + +However, these security issues can be dealt with, if we follow common WordPress security best practices. In this article, we will show you how to use WPSeku, a WordPress vulnerability scanner in Linux, that can be used to find security holes in your WordPress installation and block potential threats. + +WPSeku is a simple WordPress vulnerability scanner written using Python, it can be used to scan local and remote WordPress installations to find security issues. + +### How to Install WPSeku – WordPress Vulnerability Scanner in Linux + +To install WPSeku in Linux, you need to clone the most recent version of WPSeku from its Github repository as shown. + +``` +$ cd ~ +$ git clone https://github.com/m4ll0k/WPSeku +``` + +Once you have obtained it, move into the WPSeku directory and run it as follows. + +``` +$ cd WPSeku +``` + +Now run the WPSeku using the `-u` option to specify your WordPress installation URL like this. + +``` +$ ./wpseku.py -u http://yourdomain.com +``` + [![WordPress Vulnerability Scanner](https://www.tecmint.com/wp-content/uploads/2017/05/WordPress-Vulnerability-Scanner.png)][1] + +WordPress Vulnerability Scanner + +The command below will search for cross site scripting, local file inclusion, and SQL injection vulnerabilities in your WordPress plugins using the `-p` option, you need to specify the location of plugins in the URL: + +``` +$ ./wpseku.py -u http://yourdomain.com/wp-content/plugins/wp/wp.php?id= -p [x,l,s] +``` + +The following command will execute a brute force password login and password login via XML-RPC using the option `-b`. Also, you can set a username and wordlist using the `--user` and `--wordlist` options respectively as shown below. + +``` +$ ./wpseku.py -u http://yourdomian.com --user username --wordlist wordlist.txt -b [l,x] +``` + +To view all WPSeku usage options, type. + +``` +$ ./wpseku.py --help +``` + [![WPSeku WordPress Vulnerability Scanner Help](https://www.tecmint.com/wp-content/uploads/2017/05/WPSeku-WordPress-Vulnerability-Scanner-Help.png)][2] + +WPSeku WordPress Vulnerability Scanner Help + +WPSeku Github repository: [https://github.com/m4ll0k/WPSeku][3] + +That’s it! In this article, we showed you how to get and use WPSeku for WordPress vulnerability scanning in Linux. WordPress is secure but only if we follow WordPress security best practices. Do you have any thoughts to share? If yes, then use the comment section below. + + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. + +------------------ + +via: https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/ + +作者:[Aaron Kili ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://www.tecmint.com/wp-content/uploads/2017/05/WordPress-Vulnerability-Scanner.png +[2]:https://www.tecmint.com/wp-content/uploads/2017/05/WPSeku-WordPress-Vulnerability-Scanner-Help.png +[3]:https://github.com/m4ll0k/WPSeku +[4]:https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/# +[5]:https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/# +[6]:https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/# +[7]:https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/# +[8]:https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/#comments +[9]:https://www.tecmint.com/author/aaronkili/ +[10]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[11]:https://www.tecmint.com/free-linux-shell-scripting-books/ From 1785a7a6ba2aa9c6b5ce57da08f1e99f275ff2c3 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:35:43 +0800 Subject: [PATCH 0137/1407] =?UTF-8?q?20170521-8=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...Develop Python Applications in Vim Editor.md | 148 ++++++++++++++++++ 1 file changed, 148 insertions(+) create mode 100644 sources/tech/20170426 Python-mode – A Vim Plugin to Develop Python Applications in Vim Editor.md diff --git a/sources/tech/20170426 Python-mode – A Vim Plugin to Develop Python Applications in Vim Editor.md b/sources/tech/20170426 Python-mode – A Vim Plugin to Develop Python Applications in Vim Editor.md new file mode 100644 index 0000000000..a9e18ddbbc --- /dev/null +++ b/sources/tech/20170426 Python-mode – A Vim Plugin to Develop Python Applications in Vim Editor.md @@ -0,0 +1,148 @@ +Python-mode – A Vim Plugin to Develop Python Applications in Vim Editor +============================================================ + + +Python-mode is a vim plugin that enables you to write Python code in [Vim editor][1] in a fast manner by utilizing libraries including pylint, rope, pydoc, pyflakes, pep8, autopep8, pep257 and mccabe for coding features such as static analysis, refactoring, folding, completion, documentation, and more. + +**Suggested Read:** [Bash-Support – A Vim Plugin That Converts Vim Editor to Bash-IDE][2] + +This plugin contains all the features that you can use to develop python applications in Vim editor. + +#### Python-mode Features + +It has the following notable features: + +* Support Python version 2.6+ and 3.2+. + +* Supports syntax highlighting. + +* Offers virtualenv support. + +* Supports python folding. + +* Offers enhanced python indentation. + +* Enables running of python code from within Vim. + +* Enables addition/removal of breakpoints. + +* Supports python motions and operators. + +* Enables code checking (pylint, pyflakes, pylama, …) that can be run simultaneouslyi> + +* Supports autofixing of PEP8 errors. + +* Allows searching in python documentation. + +* Supports code refactoring. + +* Supports strong code completion. + +* Supports going to definition. + +In this tutorial, we will show you how to setup Vim to use Python-mode in Linux to develop Python applications in Vim editor. + +### How to Install Python-mode for Vim in Linux + +Start by installing [Pathogen][3] (makes it super easy to install plugins and runtime files in their own private directories) for easy installation of Python-mode. + +Run the commands below to get the pathogen.vim file and the directories it needs: + +``` +# mkdir -p ~/.vim/autoload ~/.vim/bundle && \ +# curl -LSso ~/.vim/autoload/pathogen.vim https://tpo.pe/pathogen.vim +``` + +Then add the following lines below to your ~/.vimrc file: + +``` +execute pathogen#infect() +syntax on +filetype plugin indent on +``` + +Once you have installed pathogen, and you can now put Python-mode into ~/.vim/bundle as follows. + +``` +# cd ~/.vim/bundle +# git clone https://github.com/klen/python-mode.git +``` + +Then rebuild helptags in vim like this. + +``` +:helptags +``` + +You need to enable filetype-plugin (:help filetype-plugin-on) and filetype-indent (:help filetype-indent-on) to use python-mode. + +### Install Python-mode in Debian and Ubuntu + +Another way you can install python-mode in Debian and Ubuntu systems using PPA as shown. + +``` +$ sudo add-apt-repository https://klen.github.io/python-mode/deb main +$ sudo apt-get update +$ sudo apt-get install vim-python-mode +``` + +If you you encounter the message: “The following signatures couldn’t be verified because the public key is not available”, run the command below: + +``` +$ sudo apt-key adv --keyserver keyserver.ubuntu.com --recv-keys B5DF65307000E266 +``` + +Now enable python-mode using vim-addon-manager like so. + +``` +$ sudo apt install vim-addon-manager +$ vim-addons install python-mode +``` + +### Customizing Python-mode in Linux + +To override the default key bindings, redefine them in the .vimrc files, for instance: + +``` +" Override go-to.definition key shortcut to Ctrl-] +let g:pymode_rope_goto_definition_bind = "" +" Override run current python file key shortcut to Ctrl-Shift-e +let g:pymode_run_bind = "" +" Override view python doc key shortcut to Ctrl-Shift-d +let g:pymode_doc_bind = "" +``` + +Note that python-mode uses python 2 syntax checking by default. You can enable python 3 syntax checking by adding this in your .vimrc. + +``` +let g:pymode_python = 'python3' +``` + +You can find additional configuration options on the Python-mode Github Repository: [https://github.com/python-mode/python-mode][4] + +That’s all for now! In this tutorial, we will show you how to integrate Vim to with Python-mode in Linux. Share your thoughts with us via the feedback form below. + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. + +------------------ + +via: https://www.tecmint.com/python-mode-a-vim-editor-plugin/ + +作者:[Aaron Kili ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://www.tecmint.com/vi-editor-usage/ +[2]:https://www.tecmint.com/use-vim-as-bash-ide-using-bash-support-in-linux/ +[3]:https://github.com/tpope/vim-pathogen +[4]:https://github.com/python-mode/python-mode +[5]:https://www.tecmint.com/author/aaronkili/ +[6]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[7]:https://www.tecmint.com/free-linux-shell-scripting-books/ From ff7d7d5ca54e1a0175510ea1e710fc8b862c5c35 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:39:14 +0800 Subject: [PATCH 0138/1407] =?UTF-8?q?20170521-9=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...yber warfare cell that worries the West.md | 97 +++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 sources/talk/20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md diff --git a/sources/talk/20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md b/sources/talk/20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md new file mode 100644 index 0000000000..e6833eeba0 --- /dev/null +++ b/sources/talk/20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md @@ -0,0 +1,97 @@ +North Korea's Unit 180, the cyber warfare cell that worries the West +============================================================ + + + [![Military drive trucks through Pyongyang at night, set against the city skyline](http://www.abc.net.au/news/image/8545124-3x2-700x467.jpg "Military trucks through Pyongyang")][13] [**PHOTO:** Defectors say Pyongyang's cyberattacks aimed at raising cash are likely organised by the special cell — Unit 180. (Reuters: Damir Sagolj, file)][14] + +North Korea's main spy agency has a special cell called Unit 180 that is likely to have launched some of its most daring and successful cyberattacks, according to defectors, officials and internet security experts. + + + +North Korea has been blamed in recent years for a series of online attacks, mostly on financial networks, in the United States, South Korea and over a dozen other countries. + +Cyber security researchers have also said they found technical evidence that could l[ink North Korea with the global WannaCry "ransomware" cyberattack][15] that infected more than 300,000 computers in 150 countries this month. + +Pyongyang has called the allegation "ridiculous". + +The crux of the allegations against North Korea is its connection to a hacking group called Lazarus that is linked to last year's $US81 million cyber heist at the Bangladesh central bank and the 2014 attack on Sony's Hollywood studio. + +The US Government has blamed North Korea for the Sony hack and some US officials have said prosecutors are building a case against Pyongyang in the Bangladesh Bank theft. + +No conclusive proof has been provided and no criminal charges have yet been filed. North Korea has also denied being behind the Sony and banking attacks. + +North Korea is one of the most closed countries in the world and any details of its clandestine operations are difficult to obtain. + +But experts who study the reclusive country and defectors who have ended up in South Korea or the West have provided some clues. + +### Hackers likely under cover as employees + +Kim Heung-kwang, a former computer science professor in North Korea who defected to the South in 2004 and still has sources inside North Korea, said Pyongyang's cyberattacks aimed at raising cash are likely organised by Unit 180, a part of the Reconnaissance General Bureau (RGB), its main overseas intelligence agency. + +"Unit 180 is engaged in hacking financial institutions (by) breaching and withdrawing money out of bank accounts," Mr Kim said. + + +He has previously said that some of his former students have joined join North Korea's Strategic Cyber Command, its cyber-army. + +> "The hackers go overseas to find somewhere with better internet services than North Korea so as not to leave a trace," Mr Kim added. + +He said it was likely they went under the cover of being employees of trading firms, overseas branches of North Korean companies, or joint ventures in China or South-East Asia. + +James Lewis, a North Korea expert at the Washington-based Centre for Strategic and International Studies, said Pyongyang first used hacking as a tool for espionage and then political harassment against South Korean and US targets. + +"They changed after Sony by using hacking to support criminal activities to generate hard currency for the regime," he said. + +"So far, it's worked as well or better as drugs, counterfeiting, smuggling — all their usual tricks." + +Media player: "Space" to play, "M" to mute, "left" and "right" to seek. + +[**VIDEO:** Have you been hit by ransomware? (ABC News)][16] + +### South Korea purports to have 'considerable evidence' + +The US Department of Defence said in a report submitted to Congress last year that North Korea likely "views cyber as a cost-effective, asymmetric, deniable tool that it can employ with little risk from reprisal attacks, in part because its networks are largely separated from the internet". + +> "It is likely to use internet infrastructure from third-party nations," the report said. + +South Korean officials said they had considerable evidence of North Korea's cyber warfare operations. + + +"North Korea is carrying out cyberattacks through third countries to cover up the origin of the attacks and using their information and communication technology infrastructure," Ahn Chong-ghee, South Korea's Vice-Foreign Minister, told Reuters in written comments. + +Besides the Bangladesh Bank heist, he said Pyongyang was also suspected in attacks on banks in the Philippines, Vietnam and Poland. + +In June last year, police said the North hacked into more than 140,000 computers at 160 South Korean companies and government agencies, planting malicious code as part of a long-term plan to lay the groundwork for a massive cyberattack on its rival. + +North Korea was also suspected of staging cyberattacks against the South Korean nuclear reactor operator in 2014, although it denied any involvement. + +That attack was conducted from a base in China, according to Simon Choi, a senior security researcher at Seoul-based anti-virus company Hauri Inc. + +"They operate there so that regardless of what kind of project they do, they have Chinese IP addresses," said Mr Choi, who has conducted extensive research into North Korea's hacking capabilities. + +-------------------------------------------------------------------------------- + +via: http://www.abc.net.au/news/2017-05-21/north-koreas-unit-180-cyber-warfare-cell-hacking/8545106 + +作者:[www.abc.net.au ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.abc.net.au +[1]:http://www.abc.net.au/news/2017-05-16/wannacry-ransomware-showing-up-in-obscure-places/8527060 +[2]:http://www.abc.net.au/news/2015-08-05/why-we-should-care-about-cyber-crime/6673274 +[3]:http://www.abc.net.au/news/2017-05-15/what-to-do-if-youve-been-hacked/8526118 +[4]:http://www.abc.net.au/news/2017-05-16/researchers-link-wannacry-to-north-korea/8531110 +[5]:http://www.abc.net.au/news/2017-05-18/adylkuzz-cyberattack-could-be-far-worse-than-wannacry:-expert/8537502 +[6]:http://www.google.com/maps/place/Korea,%20Democratic%20People%20S%20Republic%20Of/@40,127,5z +[7]:http://www.abc.net.au/news/2017-05-16/wannacry-ransomware-showing-up-in-obscure-places/8527060 +[8]:http://www.abc.net.au/news/2017-05-16/wannacry-ransomware-showing-up-in-obscure-places/8527060 +[9]:http://www.abc.net.au/news/2015-08-05/why-we-should-care-about-cyber-crime/6673274 +[10]:http://www.abc.net.au/news/2015-08-05/why-we-should-care-about-cyber-crime/6673274 +[11]:http://www.abc.net.au/news/2017-05-15/what-to-do-if-youve-been-hacked/8526118 +[12]:http://www.abc.net.au/news/2017-05-15/what-to-do-if-youve-been-hacked/8526118 +[13]:http://www.abc.net.au/news/2017-05-21/military-trucks-trhough-pyongyang/8545134 +[14]:http://www.abc.net.au/news/2017-05-21/military-trucks-trhough-pyongyang/8545134 +[15]:http://www.abc.net.au/news/2017-05-16/researchers-link-wannacry-to-north-korea/8531110 +[16]:http://www.abc.net.au/news/2017-05-15/have-you-been-hit-by-ransomware/8527854 From 279c68a76febe92b63bc63b17487e941dbfa906e Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:41:45 +0800 Subject: [PATCH 0139/1407] =?UTF-8?q?20170521-10=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...A Hacking Tools. WannaCry Used Just Two.md | 125 ++++++++++++++++++ 1 file changed, 125 insertions(+) create mode 100644 sources/tech/20170519 New SMB Worm Uses Seven NSA Hacking Tools. WannaCry Used Just Two.md diff --git a/sources/tech/20170519 New SMB Worm Uses Seven NSA Hacking Tools. WannaCry Used Just Two.md b/sources/tech/20170519 New SMB Worm Uses Seven NSA Hacking Tools. WannaCry Used Just Two.md new file mode 100644 index 0000000000..1f2bb63db1 --- /dev/null +++ b/sources/tech/20170519 New SMB Worm Uses Seven NSA Hacking Tools. WannaCry Used Just Two.md @@ -0,0 +1,125 @@ +### New SMB Worm Uses Seven NSA Hacking Tools. WannaCry Used Just Two + + +![EternalRocks](https://www.bleepstatic.com/content/posts/2017/05/19/EternalRocks.png) + +Researchers have detected a new worm that is spreading via SMB, but unlike the worm component of the WannaCry ransomware, this one is using seven NSA tools instead of two. + +The worm's existence first came to light on Wednesday, after it infected the SMB honeypot of [Miroslav Stampar][15], member of the Croatian Government CERT, and creator of the sqlmap tool used for detecting and exploiting SQL injection flaws. + +### EternalRocks uses seven NSA tools + +The worm, which Stampar named EternalRocks based on worm executable properties found in one sample, works by using six SMB-centric NSA tools to infect a computer with SMB ports exposed online. These are **ETERNALBLUE**, **ETERNALCHAMPION**, **ETERNALROMANCE**, and **ETERNALSYNERGY**, which are SMB exploits used to compromise vulnerable computers, while **SMBTOUCH** and **ARCHITOUCH** are two NSA tools used for SMB reconnaissance operations. + +Once the worm has obtained this initial foothold, it then uses another NSA tool, **DOUBLEPULSAR**, to propagate to new vulnerable machines. + +![Origina of the EternalRocks name](https://www.bleepstatic.com/images/news/u/986406/Malware/EternalRocks-properties.png) +**Origin of the EternalRocks name** + +[The WannaCry ransomware outbreak][16], which affected over 240,000 victims, also used an SMB worm to infect computers and spread to new victims. + +Unlike EternalRocks, WannaCry's SMB worm used only ETERNALBLUE for the initial compromise, and DOUBLEPULSAR to propagate to new machines. + +### EternalRocks is more complex but less dangerous + +As a worm, EternalRocks is far less dangerous than WannaCry's worm component, as it currently does not deliver any malicious content. This, however, does not mean that EternalRocks is less complex. According to Stampar, it's actually the opposite. + +For starters, EternalRocks is far more sneaky than WannaCry's SMB worm component. Once it infects a victim, the worm uses a two-stage installation process, with a delayed second stage. + +During the first stage, EternalRocks gains a foothold on an infected host, downloads the Tor client, and beacons its C&C server, located on a .onion domain, the Dark Web. + +Only after a predefined period of time — currently 24 hours — does the C&C server respond. The role of this long delay is most probably to bypass sandbox security testing environments and security researchers analyzing the worm, as very few will wait a full day for a response from the C&C server. + + + +### No kill switch domain + +Additionally, EternalRocks also uses files with identical names to the ones used by WannaCry's SMB worm, in another attempt to fool security researchers into misclassifying it. + +But unlike WannaCry, EternalRocks does not include a kill switch domain, the Achille's heel that security researchers used to stop the WannaCry outbreak. + +After the initial dormancy period expires and the C&C server responds, EternalRocks goes into the second stage of its installation process and downloads a second stage malware component in the form of an archive named shadowbrokers.zip. + +The name of this file is pretty self-explanatory, as it contains NSA SMB-centric exploits [leaked by the Shadow Brokers group][17] in April 2017. + +The worm then starts a rapid IP scanning process and attempts to connect to random IP addresses. + +![Content of shadowbrokers.zip](https://www.bleepstatic.com/images/news/u/986406/Malware/EternalRocks-exploits.png) +**The configuration files for NSA tools found in the shadowbrokers.zip archive** + +### EternalRocks could be weaponized in an instant + +Because of its broader exploit arsenal, the lack of a kill switch domain, and because of its initial dormancy, EternalRocks could pose a serious threat to computers with vulnerable SMB ports exposed to the Internet, if its author would ever decide to weaponize the worm with ransomware, a banking trojan, RATs, or anything else. + +At first glance, the worm seems to be an experiment, or a malware author performing tests and fine-tuning a future threat. + +This, however, does not mean EternalRocks is harmless. Computers infected with this worm are controllable via C&C server commands and the worm's owner could leverage this hidden communications channel to send new malware to the computers previously infected by EternalRocks. + +Furthermore, DOUBLEPULSAR, [an NSA implant with backdoor features][18], remains running on PCs infected with EternalRocks. Unfortunately, the worm's author has not taken any measures to protect the DOUBLEPULSAR implant, which runs in a default unprotected state, meaning other threat actors could use it as a backdoor to machines infected by EternalRocks, by  sending their own malware to those PCs. + +IOCs and more info on the worm's infection process are available in a [GitHub repo][19] Stampar set up a few days ago. + +### An SMB free-for-all + +Currently, there are multiple actors scanning for computers running older and unpatched versions of the SMB services. System administrators have already taken notice and started patching vulnerable PCs or disabling the old SMBv1 protocol, slowly reducing the number of vulnerable machines that EternalRocks can infect. + +Furthermore, malware such as [Adylkuzz][20] also shuts down SMB ports, preventing further exploitation from other threats, also contributing to reducing the number of potential targets for EternalRocks and other SMB-hunting malware. Reports from [Forcepoint][21], [Cyphort][22], and [Secdo][23] detail other threats currently targeting computers with SMB ports. + +Nonetheless, the faster system administrators patch their systems the better. "The worm is racing with administrators to infect machines before they patch," Stampar told Bleeping Computer in a private conversation. "Once infected, he can weaponize any time he wants, no matter the late patch." + + _Image credits: Miroslav Stampar, BleepingComputer & [Ana María Lora Macias][13]_ + +-------------------------------------------------------------------------------- + +作者简介: + +Catalin covers various topics such as data breaches, software vulnerabilities, exploits, hacking news, the Dark Web, programming topics, social media, web technology, product launches, and a few more. + +--------------- + +via: https://www.bleepingcomputer.com/news/security/new-smb-worm-uses-seven-nsa-hacking-tools-wannacry-used-just-two/ + +作者:[CATALIN CIMPANU ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.bleepingcomputer.com/author/catalin-cimpanu/ +[1]:https://twitter.com/stamparm +[2]:https://twitter.com/intent/tweet?in_reply_to=865494946974900224 +[3]:https://twitter.com/intent/retweet?tweet_id=865494946974900224 +[4]:https://twitter.com/intent/like?tweet_id=865494946974900224 +[5]:https://twitter.com/stamparm/status/865494946974900224/photo/1 +[6]:https://twitter.com/stamparm +[7]:https://twitter.com/hashtag/EternalRocks?src=hash +[8]:https://t.co/xqoxkNYfM7 +[9]:https://twitter.com/stamparm/status/865494946974900224 +[10]:https://twitter.com/stamparm/status/865494946974900224/photo/1 +[11]:https://support.twitter.com/articles/20175256 +[12]:https://www.bleepingcomputer.com/news/security/new-smb-worm-uses-seven-nsa-hacking-tools-wannacry-used-just-two/#comment_form +[13]:https://thenounproject.com/search/?q=worm&i=24323 +[14]:https://www.bleepingcomputer.com/author/catalin-cimpanu/ +[15]:https://about.me/stamparm +[16]:https://www.bleepingcomputer.com/news/security/wana-decrypt0r-ransomware-using-nsa-exploit-leaked-by-shadow-brokers-is-on-a-rampage/ +[17]:https://www.bleepingcomputer.com/news/security/shadow-brokers-release-new-files-revealing-windows-exploits-swift-attacks/ +[18]:https://www.bleepingcomputer.com/news/security/over-36-000-computers-infected-with-nsas-doublepulsar-malware/ +[19]:https://github.com/stamparm/EternalRocks/ +[20]:https://www.bleepingcomputer.com/news/security/adylkuzz-cryptocurrency-miner-may-have-saved-you-from-the-wannacry-ransomware/ +[21]:https://blogs.forcepoint.com/security-labs/wannacry-multiple-malware-families-using-eternalblue-exploit +[22]:https://www.cyphort.com/eternalblue-exploit-actively-used-deliver-remote-access-trojans/ +[23]:http://blog.secdo.com/multiple-groups-exploiting-eternalblue-weeks-before-wannacry From 52750b9e36bf32c35d91ee400acdd0d10b0ef769 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:43:31 +0800 Subject: [PATCH 0140/1407] recycle --- ...echnology for land rights documentation.md | 77 ------------------- 1 file changed, 77 deletions(-) delete mode 100644 sources/tech/20170109 Open technology for land rights documentation.md diff --git a/sources/tech/20170109 Open technology for land rights documentation.md b/sources/tech/20170109 Open technology for land rights documentation.md deleted file mode 100644 index d9f568cad5..0000000000 --- a/sources/tech/20170109 Open technology for land rights documentation.md +++ /dev/null @@ -1,77 +0,0 @@ -Open technology for land rights documentation -============================================================ - -### One-third of people on the planet don't have documented rights to the land on which they rely. - -[up][3] - ![Open technology for land rights documentation](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/life_tree_clouds.png?itok=dSV0oTDS "Open technology for land rights documentation") -Image by :  - -[Pixabay][4]. Modified by Opensource.com. [CC BY-SA 4.0][5] - -The [Cadasta Foundation][6] creates tech to allow communities to document their land rights. By helping groups document the evidence of their individual and community rights to the land on which they depend, they can eventually obtain legal recognition of their land rights, and in the meantime, enjoy greater security. - -We are motivated by the fact that most of the world does not have documented legal rights to the land on which they live. Technology is only a small part of this larger social issue, but our hope is that tech tools can be part of the solution even in the most remote and low-tech environments. - -### The magnitude of property rights - -Many of us who come from the global north probably take our rights to our land, property, and home for granted. We have titles, deeds, and rental agreements that document and solidly protect our rights. - -But one-third of the people on the planet, from urban shanty towns to forest-dwelling indigenous communities, do not have documented rights to the land on which they rely. In fact, an estimated 70% of the property in emerging economies is undocumented. An estimated 25% of the world’s urban population live in homes to which they have no legal right.  A majority of smallholder farmers around the world farm without the protection of having legal rights to their land documented by government records. - -This is simply because government land and property records in many areas of the world either were never created or are out of date. For example, most rural land records in the state of Telangana, India haven't been updated since the 1940s. In other areas, such as parts of sub-Saharan Africa, there were never any records of land ownership to begin with—people simply farm the land their parents farmed, generation after generation. - -Consider for a moment working land to which you have no secure rights. Would you invest your savings or labor in improving the land, including applying good quality seeds and fertilizer, with the knowledge that you could be displaced any day by a more powerful neighbor or investor? Imagine living in a home that could be bulldozed or usurped by an official any day. Or how could you sell your house, or use it for collateral for a loan, if you don’t have any proof that you own it? - -For a majority of the world's population, these are not rhetorical questions. These are daily realities. - -### How open source matters for land - -Technology is only one part of the solution, but at Cadasta we believe it is a key component. While many governments had modern technology systems put in place to manage land records, often these were expensive to maintain, required highly trained staff, were not transparent, and were otherwise too complicated. Many of these systems, created at great expense by donor governments, are already outdated and no longer accurately reflect existing land and property rights. - -By building open and user-friendly technology for land rights documentation we aim to overcome these problems and create land documentation systems that are flexible and accessible, allowing them to be treated as living documents that are updated continually. - -We routinely train people who have never even used a smartphone before to use our technology to document their land rights in a single afternoon. The resulting data, hosted on an open source platform, is easy to access, update, and analyze. This flexibility means that governments in developing countries, should they adopt our platform, don't need to hire specially trained staff to manage the upkeep of these records. - -We also believe that by contributing to and fostering open communities we can benefit more people, instead of attempting to develop all the technology ourselves. We do this by building a community around our tools as well as contributing to other existing software. - -Over the past two years we've contributed and been involved in [OpenStreetMap][7]through the [Missing Maps Projec][8]t, used [OpenDataKit][9] extensively for data collection, and currently are integrating [Field Papers][10] with our system. Field Papers is technology that allows users to print paper maps, annotate those maps with pen, and then take a picture of those annotations with their phone and upload them to be transcribed. - -We've also released a few Django libraries we hope will be useful to others in other Django applications. These include a policy-based permission system called [django-tutelary][11] and [django-jsonattrs][12], which provides JavaScript Object Notification (JSON)-based attribute management for PostgresSQL. If others use these pieces and contribute bug reports and patches, this can help make Cadasta's work stronger. - -This work is critically important. Land rights are the foundation of stability and prosperity. Communities and countries seeking economic growth and sustainable development must document land rights and ensure land rights are secure for women, men, and communities. - -_Learn more in Kate Chapman's talk at linux.conf.au 2017 ([#lca2017][1]) in Hobart: [Land Matters: Creating Open Technology for Land Rights][2]._ - --------------------------------------------------------------------------------- - -作者简介: - -![](https://opensource.com/sites/default/files/styles/profile_pictures/public/pictures/kate-crop.jpg?itok=JkHxWrIQ) - -Kate Chapman - Kate Chapman is Chief Technology Officer of the Cadasta Foundation, leading the organization’s technology team and strategy. Cadasta develops free and open source software to help communities document their land rights around the world. Chapman is recognized as a leader in the domains of open source geospatial technology and community mapping, and an advocate for open imagery as a public good. - --------------------------------------------------------------------------------- - - -via: https://opensource.com/article/17/1/land-rights-documentation-Cadasta - -作者:[Kate Chapman][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/wonderchook -[1]:https://twitter.com/search?q=%23lca2017&src=typd -[2]:https://linux.conf.au/schedule/presentation/50/ -[3]:https://opensource.com/article/17/1/land-rights-documentation-Cadasta?rate=E8gJkvb1mbBXytsZiKA_ZtBCOvpi41nDSfz4R8tNnoc -[4]:https://pixabay.com/en/tree-field-cornfield-nature-247122/ -[5]:https://creativecommons.org/licenses/by-sa/4.0/ -[6]:http://cadasta.org/ -[7]:http://www.openstreetmap.org/ -[8]:http://www.missingmaps.org/ -[9]:https://opendatakit.org/ -[10]:http://fieldpapers.org/ -[11]:https://github.com/Cadasta/django-tutelary -[12]:https://github.com/Cadasta/django-jsonattrs From 63f0e1d59e6963df8ba5ee86191eec8f128daf3a Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:43:39 +0800 Subject: [PATCH 0141/1407] recycle --- ...ontainer Platform Expands Cloud Options.md | 104 ------------------ 1 file changed, 104 deletions(-) delete mode 100644 sources/tech/20170118 Red Hat's OpenShift Container Platform Expands Cloud Options.md diff --git a/sources/tech/20170118 Red Hat's OpenShift Container Platform Expands Cloud Options.md b/sources/tech/20170118 Red Hat's OpenShift Container Platform Expands Cloud Options.md deleted file mode 100644 index 1c8506e11e..0000000000 --- a/sources/tech/20170118 Red Hat's OpenShift Container Platform Expands Cloud Options.md +++ /dev/null @@ -1,104 +0,0 @@ -Red Hat's OpenShift Container Platform Expands Cloud Options -============================================================ - -Red Hat on Wednesday announced the general availability of Red Hat OpenShift Container Platform 3.4. - - ![Red Hat's OpenShift Container Platform Expands Cloud Options](http://www.linuxinsider.com/ai/465314/red-hat-openshift.jpg) - -This latest version helps organizations better embrace new Linux container technologies that can deliver innovative business applications and services without sacrificing existing IT investments. - -Red Hat OpenShift Container Platform 3.4 provides a platform for innovation without giving up existing mission-critical workloads. It offers dynamic storage provisioning for both traditional and cloud-native applications, as well as multitenant capabilities that can support multiple applications, teams and deployment processes in a hybrid cloud environment. - -Today's enterprises are must balance management of their existing application portfolios with the goal of making it easier for developers to build new applications, observed Brian Gracely, director of product strategy for OpenShift at Red Hat. - -The new release focuses on three complex areas for enterprises: managing storage; isolating resources for multiple groups (multitenancy); and the ability to consistently run applications on multiple cloud environments (public or private). - -"Red Hat OpenShift Container Platform 3.4 builds on the momentum of both the Kubernetes and Docker projects, which are helping developers use containers to modernize existing applications and build new cloud-native microservices," Gracely told LinuxInsider. - -OpenShift Container Platform 3.4 makes storage provisioning easier for developers and operators, and it enhances how the platform can be used to provide multitenant resources to multiple groups within an organization. Additionally, it continues to codify the best practices needed to deploy a consistent container platform across any cloud environment, such as AWS, Azure, GCP, OpenStack or VMware. - -### Pushes Cloud Benefits - -The new platform advances the process of creating and deploying applications by addressing the growing storage needs of applications across the hybrid cloud for enterprises. It allows for coexistence of modern and future-forward workloads on a single, enterprise-ready platform. - -The new OpenShift Container Platform and service gives Red Hat customers an easy way to adopt and use Google Cloud as a public of hybrid cloud environment, noted Charles King, principal analyst at [Pund-IT][1]. - -"It will be a welcome addition in many or most enterprise IT shops, especially those that are active employing or exploring container solutions," he told LinuxInsider. - -"Since Red Hat will act as the service provider of the new offering, customers should also be able to seamlessly integrate OpenShift support with their other Red Hat products and services," King pointed out. - -The new release also provides an enterprise-ready version of Kubernetes 1.4 and the Docker container runtime, which will help customers roll out new services more quickly with the backing of Red Hat Enterprise Linux. - -OpenShift Container Platform 3.4 integrates architectures, processes and services to enable delivery of critical business applications, whether legacy or cloud-native, and containerized workloads. - -### Open Source and Linux Innovation - -Kubernetes is becoming the de facto standard for orchestrating and managing Linux containers. OpenShift is delivering the leading enterprise-ready platform built on Kubernetes, noted Red Hat's Gracely. - -"Kubernetes is one of the fastest-growing open source projects, with contributors from cloud providers, independent software vendors and [individual and business] end-users," he said. "It has become a project that has done an excellent job of considering and addressing the needs of many different groups with many types of application needs." - -Both Red Hat and Google are pushing for innovation. Both companies are among the market's most proactive and innovative supporters of open source and Linux solutions. - -"The pair's collaboration on this new service is a no-brainer that could eventually lead to Red Hat and Google finding or creating further innovative open source offerings," said Pund-IT's King. - -### Features and Benefits - -Among the new capabilities in the latest version of OpenShift Container Platform: - -* Next-level container storage with support for dynamic storage provisioning -- This allows multiple storage types and multitier storage exposure in Kubernetes; -* Container-native storage enabled by Red Hat Gluster Storage -- This now supports dynamic provisioning and push button deployment for stateful and stateless applications; -* Software-defined, highly available and scalable storage solution -- This provides access across on-premises and public cloud environments for more cost efficiency over traditional hardware-based or cloud-only storage services; -* Enhanced multitenancy through more simplified management of projects -- This feature is powered by Kubernetes namespaces in a single Kubernetes cluster. Applications can run fully isolated and share resources on a single Kubernetes cluster in OpenShift Container Platform. - -### More Supplements - -The OpenShift Container Platform upgrade adds the capacity to search for projects and project details, manage project membership, and more via a more streamlined Web console. This capability facilitates working with multiple projects across dispersed teams. - -Another enhancement is the multitenancy feature that provides application development teams with their own cloud-like application environment. It lets them build and deploy customer-facing or internal applications using DevOps processes that are isolated from one another. - -Also available in the new release are new hybrid cloud reference architectures for running Red Hat OpenShift Container Platform on OpenStack, VMware, Amazon Web Services, Google Cloud Engine and Microsoft Azure. These guides help walk a user through deployment across public and private clouds, virtual machines and bare metal. - -"It also drastically simplifies how developers can access storage resources, allowing developers to dynamically provision storage resources/capacity with the click of a button -- effectively self-service for developers. It also allows developers to feel confident that the resources required for their applications will be properly isolated from other resource needs in the platform," said Red Hat's Gracely. - -### Orchestration Backbone - -The foundation for Red Hat OpenShift Container Platform 3.4 is the open source Kubernetes Project community. Kubernetes 1.4 features alpha support for expanded cluster federation APIs. - -It enables multiple clusters federated across a hybrid environment. Red Hat engineers view this feature as a key component to enabling hybrid cloud deployments in the enterprise. - -The latest version of OpenShift is available now via the Red Hat Customer Portal. It offers community innovation as hardened, production-grade features. - -### Ensuring Customer Health - -Red Hat's platform is vital to the success of The Vitality Group's global initiative and reward program, according to CIO Neil Adamson. - -This program is a key component of how the company envisions the future of health, he said. - -"Advanced services for our customers can only be delivered by embracing next-generation technologies, particularly those provided through the open source communities that drive Linux containers, Kubernetes and IoT," said Adamson. - -Red Hat's OpenShift Container Platform provides his company with the best of these communities while still delivering a stable, more secure foundation that help "reap the benefits of open source innovation while lessening the risks often inherent to emerging technologies." - -The latest platform features will further support application development in the cloud. Container solutions are being adopted rapidly for many core IT tasks, including app development projects and processes, according to King, who noted that "being able to seamlessly deploy containers in a widely and easily accessible environment like Google Cloud should simplify development tasks."  - ![](http://www.ectnews.com/images/end-enn.gif) - --------------------------------------------------------------------------------- - -作者简介: - -![](http://www.linuxinsider.com/ai/465314/red-hat-openshift.jpg) - -**Jack M. Germain** has been writing about computer technology since the early days of the Apple II and the PC. He still has his original IBM PC-Jr and a few other legacy DOS and Windows boxes. He left shareware programs behind for the open source world of the Linux desktop. He runs several versions of Windows and Linux OSes and often cannot decide whether to grab his tablet, netbook or Android smartphone instead of using his desktop or laptop gear. You can connect with him on [Google+][2]. - --------------------------------------------------------------------------------- - -via: http://www.linuxinsider.com/story/84239.html?rss=1 - -作者:[Jack M. Germain ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://plus.google.com/116242401898170634809?rel=author -[1]:http://www.pund-it.com/ -[2]:https://plus.google.com/116242401898170634809?rel=author From 46f478d8bed8c6eef207d11cb1eba69589bf06b4 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:43:47 +0800 Subject: [PATCH 0142/1407] recycle --- ...4 Gnome HP Pavilion Nvidia setup review.md | 216 ------------------ 1 file changed, 216 deletions(-) delete mode 100644 sources/tech/20170123 Fedora 24 Gnome HP Pavilion Nvidia setup review.md diff --git a/sources/tech/20170123 Fedora 24 Gnome HP Pavilion Nvidia setup review.md b/sources/tech/20170123 Fedora 24 Gnome HP Pavilion Nvidia setup review.md deleted file mode 100644 index 7ec0c48a1d..0000000000 --- a/sources/tech/20170123 Fedora 24 Gnome HP Pavilion Nvidia setup review.md +++ /dev/null @@ -1,216 +0,0 @@ -# Fedora 24 Gnome & HP Pavilion + Nvidia setup review - -Recently, you may have come across my [Chapeau][1] review. This experiment prompted me to widen my Fedora family testing, and so I decided to try setting up [Fedora 24 Gnome][2] on my [HP][3] machine, a six-year-old laptop with 4 GB of RAM and an aging Nvidia card. Yes, Fedora 25 has since been released and I had it [tested][4] with delight. But we can still enjoy this little article now can we? - -This review should complement - and contrast - my usual crop of testing on the notorious but capable [Lenovo G50][5] machine, purchased in 2015, so we have old versus new, but also the inevitable lack of proper Linux support for the [Realtek][6] network card on the newer box. We will then also check how well Fedora handles the Nvidia stack, test if Nouveau is a valid alternative, and of course, pimp the system to the max, using some of the beauty tricks we have witnessed in the Chapeau review. Should be more than interesting. - - ![Teaser](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-teaser.jpg) - -### Installation - -Nothing special to report here. The system has a much simpler setup than the Lenovo laptop. The new machine comes with UEFI, Secure Boot, 1TB disk with a GPT setup partitioned sixteen different ways, with Windows 10 and some 6-7 Linux distros on it. In comparison, the BIOS-fueled Pavilion only dual boots. Prior to this review, it was running Linux Mint 17.3 [Rosa Xfce][7], but it used to have all sorts of Ubuntu children on it, and I had used it quite extensively for arguably funny [video processing][8] and all sorts of games. The home partition dates back to the early setup, and has remained such since, including a lot of legacy config and many desktop environments. - - ![Live desktop](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-desktop-live.jpg) - -I was able to boot from a USB drive, although I did use the Fedora tool to create the live media. I've never had any problems booting on this host, to the best of my memory, a far cry (not the [game][9], just an expression, hi hi) from the Lenovo experience. There, before a BIOS update, Fedora would [not even run][10], and a large number of distros used to [struggle][11] until very recently. All part of my great disappointment adventure with Linux. - -Anyhow, this procedure went without any fuss. Fedora 24 took control of the bootloader, managing itself and the resident Windows 7 installation. If you're interested in more details on how to dual-boot, you might want to check these: - -[Ubuntu & Windows 7][12] dual-boot guide - -[Xubuntu & Windows 7][13] dual-boot guide - same same but different - -[CentOS 7 & Windows 7][14] dual-boot guide - fairly similar to our Fedora attempt - -[Ubuntu & Windows 8][15] dual-boot guide - this one covers a UEFI setup, too - -### It's pimping time! - -My Fedora [pimping guide][16] has it all. I setup RPM Fusion Free and Non-Free, then installed about 700 MB worth of media codecs, plugins and extra software, including Steam, Skype, GIMP, VLC, Gnome Tweak Tool, Chrome, several other helper utilities, and more. - -On the aesthetics side, I grabbed both Faenza and Moka icons, and configured half a dozen Gnome [extensions][17], including the mandatory [Dash to Dock][18], which really helps transforms this desktop environment into a usable product. - - ![About, with Nouveau](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-about-nouveau.jpg) - - ![Final looks](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-final.jpg) - -What is that green icon on the right side? 'Tis a spoiler of things to be, that is. - -I also had no problems with my smartphones, [Ubuntu Phone][19] or the[iPhone][20]. Both setups worked fine, and this also brings the annoyance with the Apple device on Chapeau 24 into bad spotlight. Rhythmbox would not play from any external media, though. Fail. - - ![Ubuntu Phone](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-ubuntu-phone.jpg) - - ![Media works fine](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-media-works-nice.jpg) - -This is a teaser, implying wossname Nvidia thingie; well here we go. - -### Nvidia setup - -This is a tricky one. First, take a look at my generic [tutorial][21] on this topic. Then, take a look at my recent [Fedora 23][22] [experience][23] on this topic. Unlike Ubuntu, Red Hat distros do not quite like the whole pre-compiled setup. However, just to see whether things have changed in any way, I did use a helper tool called easyLife to setup the drivers. I've talked about this utility and Fedy in an OCS-Mag [article][24], and how you can use them to make your Fedora experience more colorful. Bottom line: good for lots of things, not for drivers, though. - - ![easyLife & Nvidia](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-easylife-nvidia.png) - -Yes, this resulted in a broken system. I had to manually installed the drivers - luckily I had installed the kernel sources and headers, as well as other necessary build tools, gcc and make, beforehand, to prepare for this kind of scenario. Be warned, kids. In the end, the official way is the best. - -### Nouveau vs Nvidia, which is faster? - -I did something you would not really expect. I benchmarked the actual performance of the graphics stack with the Nouveau driver first and then the closed-source blob, using the Unigine Heaven tool. This gives clear results on how the two compare. - - ![Heaven benchmark](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-heaven-benchmark.jpg) - -Remember, this is an ancient laptop, and it does not stack well against modern tools, so you will not be surprised to learn that Heaven reported a staggering 1 FPS for Nouveau, and it took me like 5 minutes before the system actually responded, and I was able to quit the benchmark. - - ![Nouveau benchmark](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-heaven-nouveau.jpg) - -Nvidia gave much better results. To begin with, I was able to use the system while testing, and Heaven responded to mouse clicks and key strokes, all the while reporting a very humble 5-6 FPS, which means it was roughly 500% more efficient than the Nouveau driver. That tells you all you need to know, ladies and gentlemen. - - ![Nvidia installed](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-nvidia-installed.jpg) - - ![About, Nvidia installed](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-about-nvidia.jpg) - - ![Heaven, Nvidia installed, main menu](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-heaven-nvidia-menu.jpg) - - ![Nvidia benchmark 1](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-heaven-nvidia-1.jpg) - - ![Nvidia benchmark 2](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-heaven-nvidia-2.jpg) - - ![Steam works](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-steam-works.jpg) - -Also, Steam would not run at all with Nouveau, so there's that to consider, too. Funny how system requirements creep up over time. I used to play, I mean test [Call of Duty][25], a highly mediocre and arcade-like shooter on this box on the highest settings, but that feat feels like a completely different era. - - ![Nouveau & Steam fail](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-steam-nouveau-fail.png) - -### Hardware compatibility - -Things were quite all right overall. All of the Fn buttons worked fine, and so did the web camera. Power management also did its thing well, dimming the screen and whatnot, but we cannot really judge the battery life, as the cells are six years old now and quite broken. They only lend about 40 minutes of juice in the best case. - - ![Webcam](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-webcam.jpg) - - ![Battery, broken](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-battery-broken.jpg) - -Bluetooth did not work at first, but this is because crucial packages are missing. - - ![Bluetooth does not work out of the box](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-bt-no-work.png) - -You can resolve the issue using dnf: - -dnf install blueman bluez - - ![Bluetooth works now](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-bt-works.png) - -### Suspend & resume - -No issues, even with the Nvidia drivers. The whole sequence was quick and smooth, about 2-3 seconds each direction, into the land of sweet dreams and out of it. I do recall some problems with this in the past, but not any more. Happy sailing. - -### Resource utilization - -We can again compare Nouveau with Nvidia. But first, I had to sort out the swap partition setup manually, as Fedora refused to activate it. This is a big fail, and this happens consistently. Anyhow, the resource utilization with either one driver was almost identical. Both tolled a hefty 1.2 GB of RAM, and CPU ticked at about 2-3%, which is not really surprising, given the age of this machine. I did not see any big noise or heat difference the way we would witness it in the past, which is a testament to the improvements in the open-source driver, even though it fails on some of the advanced graphics logic required from it. But for normal use, non-gaming use, it behaves fairly well. - - ![Resources, Nouveau](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-resources-nouveau.jpg) - -### Problems - -Well, I observed some interesting issues during my testing. SELinux complained about legitimate processes a few times, and this really annoys me. Now to troubleshoot this, all you need to do is expand the alert, check the details, and then vomit. Why would anyone let ordinary users ever see this. Why? - - ![SELinux alerts](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-selinux.png) - - ![SELinux alerts, more](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-selinux-more.png) - -SELinux is preventing totem-video-thu from write access on the directory gstreamer-1.0. - -***** Plugin catchall_labels (83.8 confidence) suggests ***** - -If you want to allow totem-video-thu to have write access on the gstreamer-1.0 directory -Then you need to change the label on gstreamer-1.0 -Do -# semanage fcontext -a -t FILE_TYPE 'gstreamer-1.0' -where FILE_TYPE is one of the following: cache_home_t, gstreamer_home_t, texlive_home_t, thumb_home_t, thumb_tmp_t, thumb_tmpfs_t, tmp_t, tmpfs_t, user_fonts_cache_t, user_home_dir_t, user_tmp_t. -Then execute: -restorecon -v 'gstreamer-1.0' - -I want to execute something else, because hey, let us let developers be in charge of how things should be done. They know [best][26], right! This kind of garbage is what makes zombie apocalypses happen, when you miscode the safety lock on a lab confinement. - -### Other observations - -Exploring the system with gconf-editor and dconf-editor, I found tons of leftover settings from my old Gnome 2, Xfce and Cinnamon setups, and one of the weird things was that Nemo would create, or rather, restore, several desktop icons every time I had it launched, and it did not cooperate with the global settings I configured through the Tweak Tool. In the end, I had to resort to some command line witchcraft: - -gsettings set org.nemo.desktop home-icon-visible false -gsettings set org.nemo.desktop trash-icon-visible false -gsettings set org.nemo.desktop computer-icon-visible false - -### Gallery - -Finally, some sweet screenshots: - - ![Nice desktop 1](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-nice-1.jpg) - - ![Nice desktop 2](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-nice-2.jpg) - - ![Nice desktop 3](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-nice-3.jpg) - - ![Nice desktop 4](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-nice-4.jpg) - - ![Nice desktop 5](http://www.dedoimedo.com/images/computers-years/2016-2/fedora-hp-nice-5.jpg) - -### Conclusion - -This was an interesting ordeal. It took me about four hours to finish the configuration and polish the system, the maniacal Fedora update that always runs in the deep hundreds and sometimes even thousands of packages, the graphics stack setup, and finally, all the gloss and trim needed to have a functional machine. - -All in all, it works well. Fedora proved itself to be an adequate choice for the old HP machine, with decent performance and responsiveness, good hardware compatibility, fine aesthetics and functionality, once the extras are added, and only a small number of issues, some related to my laptop usage legacy. Not bad. Sure, the system could be faster, and Gnome isn't the best choice for olden hardware. But then, for something that was born in 2010, the HP laptop handles this desktop environment with grace, and it looks the part. Just proves that Red Hat makes a lot of sense once you release its essential oils and let the fragrance of extra software and codecs sweep you. It is your time to be enthused about this and commence your own testing. - -Cheers. - --------------------------------------------------------------------------------- - -作者简介: - -My name is Igor Ljubuncic. I'm more or less 38 of age, married with no known offspring. I am currently working as a Principal Engineer with a cloud technology company, a bold new frontier. Until roughly early 2015, I worked as the OS Architect with an engineering computing team in one of the largest IT companies in the world, developing new Linux-based solutions, optimizing the kernel and hacking the living daylights out of Linux. Before that, I was a tech lead of a team designing new, innovative solutions for high-performance computing environments. Some other fancy titles include Systems Expert and System Programmer and such. All of this used to be my hobby, but since 2008, it's a paying job. What can be more satisfying than that? - -From 2004 until 2008, I used to earn my bread by working as a physicist in the medical imaging industry. My work expertise focused on problem solving and algorithm development. To this end, I used Matlab extensively, mainly for signal and image processing. Furthermore, I'm certified in several major engineering methodologies, including MEDIC Six Sigma Green Belt, Design of Experiment, and Statistical Engineering. - -I also happen to write books, including high fantasy and technical work on Linux; mutually inclusive. - -Please see my full list of open-source projects, publications and patents, just scroll down. - -For a complete list of my awards, nominations and IT-related certifications, hop yonder and yonder please. - - -------------- - - -via: http://www.dedoimedo.com/computers/hp-pavilion-fedora-24.html - -作者:[Igor Ljubuncic][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.dedoimedo.com/faq.html - -[1]:http://www.dedoimedo.com/computers/chapeau-24.html -[2]:http://www.dedoimedo.com/computers/fedora-24-gnome.html -[3]:http://www.dedoimedo.com/computers/my-new-new-laptop.html -[4]:http://www.dedoimedo.com/computers/fedora-25-gnome.html -[5]:http://www.dedoimedo.com/computers/lenovo-g50-review.html -[6]:http://www.dedoimedo.com/computers/ubuntu-xerus-realtek-bug.html -[7]:http://www.dedoimedo.com/computers/linux-mint-rosa-xfce.html -[8]:http://www.dedoimedo.com/computers/frankenstein-media.html -[9]:http://www.dedoimedo.com/games/far-cry-4-review.html -[10]:http://www.dedoimedo.com/computers/lenovo-g50-fedora.html -[11]:http://www.dedoimedo.com/computers/lenovo-g50-distros-second-round.html -[12]:http://www.dedoimedo.com/computers/dual-boot-windows-7-ubuntu.html -[13]:http://www.dedoimedo.com/computers/dual-boot-windows-7-xubuntu.html -[14]:http://www.dedoimedo.com/computers/dual-boot-windows-7-centos-7.html -[15]:http://www.dedoimedo.com/computers/dual-boot-windows-8-ubuntu.html -[16]:http://www.dedoimedo.com/computers/fedora-24-pimp.html -[17]:http://www.dedoimedo.com/computers/fedora-23-extensions.html -[18]:http://www.dedoimedo.com/computers/gnome-3-dash.html -[19]:http://www.dedoimedo.com/computers/ubuntu-phone-sep-2016.html -[20]:http://www.dedoimedo.com/computers/iphone-6-after-six-months.html -[21]:http://www.dedoimedo.com/computers/fedora-nvidia-guide.html -[22]:http://www.dedoimedo.com/computers/fedora-23-nvidia.html -[23]:http://www.dedoimedo.com/computers/fedora-23-nvidia-steam.html -[24]:http://www.ocsmag.com/2015/06/22/you-can-leave-your-fedora-on/ -[25]:http://www.dedoimedo.com/games/cod-mw2.html -[26]:http://www.ocsmag.com/2016/10/19/systemd-progress-through-complexity/ From 77adb5ad32bfae9d07d9fcec60f2371700148cf1 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:44:01 +0800 Subject: [PATCH 0143/1407] recycle --- ...urce Trouble Ticket System) on CentOS 7.md | 631 ------------------ 1 file changed, 631 deletions(-) delete mode 100644 sources/tech/20170131 How to install OTRS (OpenSource Trouble Ticket System) on CentOS 7.md diff --git a/sources/tech/20170131 How to install OTRS (OpenSource Trouble Ticket System) on CentOS 7.md b/sources/tech/20170131 How to install OTRS (OpenSource Trouble Ticket System) on CentOS 7.md deleted file mode 100644 index 4a3c3e18a0..0000000000 --- a/sources/tech/20170131 How to install OTRS (OpenSource Trouble Ticket System) on CentOS 7.md +++ /dev/null @@ -1,631 +0,0 @@ -How to install OTRS (OpenSource Trouble Ticket System) on CentOS 7 -============================================================ - -### On this page - -1. [The Environment][1] -2. [Preparation][2] -3. [Install MariaDB on Centos 7][3] -4. [Install EPEL ][4] -5. [Install OTRS][5] -6. [Configure OTRS on CentOS 7][6] - -OTRS (open-source trouble ticket system software) is a sophisticated open source software used by companies to improve their operation related to customer support, help desk, call centers and more. OTRS is written in PERL and provides the following important features: - -* Customers can register and create/interact with a Ticket via the customer portal and by email, phone, and fax with each queue (Attendants/Technicians post box). -* Tickets can be managed by their priority, assignment, transmission and follow-up. A ticket can be split, merged, bulk actions can be applied, and links to each other and notifications can be set. Services can be configurated through the service catalog. -* To increase the team capacity, auto email (automatic answers), text templates and signatures can be configured. The system supports notes and attachments on tickets. -* Others capabilities include: statistics and reports (CSV/PDF), SLA and many other features. - -### The Environment - -This article covers the OTRS 5 installation and basic configuration. This article was writen based on the following enviroment: A Virtual Box VM with CENTOS 7 Minimal, 2GB RAM, 8GB HD and 2 network interfaces (host only and NAT). - -### Preparation - -Assuming that you use a fresh installation of Centos 7 Minimal,  before to install OTRS, run the following command to update the system and install aditional packages:  - -``` -yum update -``` - -Transaction Summary ================================================================================ Install 1 Package Upgrade 39 Packages Total download size: 91 M Is this ok [y/d/N]: **y** - -Install a text editor or use VI. In this article we use VIM, run the following command to install it: - -``` -yum install vim -``` - -To install the WGET package, run the following command: - -``` -yum install wget -``` - -To configure the Centos 7 network, run the following command to open the NMTUI (Network Manager Text User Interface) tool and edit the interfaces and hostname if nescessary: - -``` -nmtui -``` - -[ - ![](https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/OTRS_How_To_Alexandre_Costa.jpg) -][7] - - After setup of network settings and hostname on CentOS 7, run the following command to apply the changes: - -``` -service networks restart -``` - -To verify the network information, run the following command: - -``` -ip addr -``` - -The output looks like this on my system: - -``` -1: lo: mtu 65536 qdisc noqueue state UNKNOWN qlen 1 - link/loopback 00:00:00:00:00:00 brd 00:00:00:00:00:00 - inet 127.0.0.1/8 scope host lo - valid_lft forever preferred_lft forever - inet6 ::1/128 scope host - valid_lft forever preferred_lft forever -2: enp0s3: mtu 1500 qdisc pfifo_fast state UP qlen 1000 - link/ether 08:00:27:67:bc:73 brd ff:ff:ff:ff:ff:ff - inet 10.0.2.15/24 brd 10.0.2.255 scope global dynamic enp0s3 - valid_lft 84631sec preferred_lft 84631sec - inet6 fe80::9e25:c982:1091:90eb/64 scope link - valid_lft forever preferred_lft forever -3: enp0s8: mtu 1500 qdisc pfifo_fast state UP qlen 1000 - link/ether 08:00:27:68:88:f3 brd ff:ff:ff:ff:ff:ff - inet 192.168.56.101/24 brd 192.168.56.255 scope global dynamic enp0s8 - valid_lft 1044sec preferred_lft 1044sec - inet6 fe80::a00:27ff:fe68:88f3/64 scope link - valid_lft forever preferred_lft forever -``` - -Disable SELINUX (Security Enhanced Linux) on Centos 7, edit the following config file: - -``` -vim /etc/selinux/config -``` - -``` -"/etc/selinux/config" 14L, 547C# This file controls the state of SELinux on the system. -# SELINUX= can take one of these three values: -# enforcing - SELinux security policy is enforced. -# permissive - SELinux prints warnings instead of enforcing. -# disabled - No SELinux policy is loaded. -SELINUX=enforcing -# SELINUXTYPE= can take one of three two values: -# targeted - Targeted processes are protected, -# minimum - Modification of targeted policy. Only selected processes are prootected. -# mls - Multi Level Security protection. -SELINUXTYPE=targeted -``` - -Change the value **enforcing** of directive SELINUX to **disabled**, save the file and reboot the server. - -To check the status of SELinux on Centos 7, run the following command: - -``` -getenforce -``` - -The output must be: - -``` -Disabled -``` - -### Install MariaDB on Centos 7 - -To install MariaDB on Centos 7, run the following command: - -``` -yum -y install mariadb-server -``` - -Create the file with the name **zotrs.cnf** in the following directory: - -``` -/etc/my.cnf.d/ -``` - -To create and edit the file, run the following command: - -``` -vim /etc/my.cnf.d/zotrs.cnf -``` - -Fill the file with the following content and save it: - -``` -max_allowed_packet = 20M -query_cache_size = 32M -innodb_log_file_size = 256M -``` - -To start MariaDB, run the following command: - -``` -systemctl start mariadb -``` - -To increase the security of MariaDB, run the following command: - -``` -/usr/bin/mysql_secure_installation -``` - -Setup the options accordind the following output: - -``` -NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB - SERVERS IN PRODUCTION USE! PLEASE READ EACH STEP CAREFULLY! - -In order to log into MariaDB to secure it, we'll need the current -password for the root user. If you've just installed MariaDB, and -you haven't set the root password yet, the password will be blank, -so you should just press enter here. - -Enter current password for root (enter for none): -``` - -``` -OK, successfully used password, moving on... - -Setting the root password ensures that nobody can log into the MariaDB -root user without the proper authorisation. - -Set root password? [Y/n] -``` - -Set the root password: - -``` -New password: -Re-enter new password: -Password updated successfully! -Reloading privilege tables.. - ... Success! - -By default, a MariaDB installation has an anonymous user, allowing anyone -to log into MariaDB without having to have a user account created for -them. This is intended only for testing, and to make the installation -go a bit smoother. You should remove them before moving into a -production environment. - -Remove anonymous users? [Y/n] -``` - -``` - ... Success! - -Normally, root should only be allowed to connect from 'localhost'. This -ensures that someone cannot guess at the root password from the network. - -Disallow root login remotely? [Y/n] -``` - -``` - ... Success! - -By default, MariaDB comes with a database named 'test' that anyone can -access. This is also intended only for testing, and should be removed -before moving into a production environment. - -Remove test database and access to it? [Y/n] -``` - -``` - - Dropping test database... - ... Success! - - Removing privileges on test database... - ... Success! - -Reloading the privilege tables will ensure that all changes made so far -will take effect immediately. - -Reload privilege tables now? [Y/n] -``` - -``` - ... Success! - -Cleaning up... - -All done! If you've completed all of the above steps, your MariaDB -installation should now be secure. - -Thanks for using MariaDB! - -``` - -Setup MariaDB to start up automatically at boot time: - -systemctl enable mariadb.service - -To download OTRS, run the following command: - -``` -wget http://ftp.otrs.org/pub/otrs/RPMS/rhel/7/otrs-5.0.15-01.n oarch.rpm -``` - -### Install EPEL  - -Before we install OTRS, setup the EPEL repositoy on Centos 7\. Run the following command to do so: - -``` -[root@centos7 ~]# yum -y http://mirror.globo.com/epel/7/x86_64/e/epel-r release-7-9.noarch.rpm -``` - -### Install OTRS - -Install OTRS with the following command: - -``` -yum install -nogpgcheck otrs-5.0.15-01.noarch.rpm -``` - -A list of software package will be installed, eg. Apache and all dependencies will be resolved automatically, at to the end of output press Y: - -``` -Transaction Summary -================================================================================ -Install 1 Package (+143 Dependent packages) - -Total size: 148 M -Total download size: 23 M -Installed size: 181 M -Is this ok [y/d/N]: y -``` - -To start Apache (httpd), run the following command: - -``` -systemctl start httpd.service -``` - -To enable Apache (httpd) startup with systemd on Centos7, run the following command: - -``` -systemctl enable httpd.service -``` - -Enable SSL in Apache and configure a SelfSigned Certificate. Install the Mod_SSL module for the Apache HTTP Server, run the following command: - -``` -yum -y install mod_ssl -``` - -To generate a self-signed SSL certificate, go to the following directory: - -``` -cd /etc/pki/tls/certs/ -``` - -And run the following command to generate the key (centos7.key is the name of my certificate, feel free to change it): - -``` -make centos7.key -``` - -``` -umask 77 ; \ /usr/bin/openssl genrsa -aes128 2048 > centos7.key Generating RSA private key, 2048 bit long modulus .+++ .........................................................................................+++ e is 65537 (0x10001) Enter pass phrase: **** - -Verifying - Enter pass phrase:**** -``` - -To generate the server SSL private key with OpenSSL, run the following command: - -``` -openssl rsa -in centos7.key -out centos7.key -``` - -``` -Enter pass phrase for centos7.key: ** **writing RSA key -``` - -Run the following command to create the CSR (Certificate Signing Request) file (centos7.csr is the name of my certificate, feel free to change it): - -``` -make centos7.csr -``` - -Fill the questions acording your needs: - -``` -umask 77 ; \ /usr/bin/openssl req -utf8 -new -key centos7.key -out centos7.csr You are about to be asked to enter information that will be incorporated into your certificate request. What you are about to enter is what is called a Distinguished Name or a DN. There are quite a few fields but you can leave some blank For some fields there will be a default value, If you enter '.', the field will be left blank. ----- - -Country Name (2 letter code) [XX]: - -State or Province Name (full name) []: - -Locality Name (eg, city) [Default City]: - -Organization Name (eg, company) [Default Company Ltd]: - -Organizational Unit Name (eg, section) []: - -Centos7 Common Name (eg, your name or your server's hostname) []: - -Email Address []: - -Please enter the following 'extra' attributes to be sent with your certificate request A challenge password []: **** - -An optional company name []: -``` - -Generate a CSR (Certificate Signing Request) for the server with the OpenSSL tool: - -``` -openssl x509 -in centos7.csr -out centos7.crt -req -signkey centos7.key -``` - -The output is: - -``` -Signature ok subject=/C=BR/ST=SP/L=Campinas/O=Centos7/OU=Centos7/CN=centos7.local Getting Private key -``` - -Before we edit the ssl.conf file, make a copy of the file with the following command: - -``` -cp /etc/httpd/conf.d/ssl.conf /etc/httpd/conf.d/ssl.conf.old -``` - -Then edit the file: - -``` -vim /etc/httpd/conf.d/ssl.conf -``` - -Find the following directives, uncomment each one and edit them like this: - -``` -SSLCertificateKeyFile /etc/pki/tls/certs/centos7.key - -SSLCertificateFile /etc/pki/tls/certs/centos7.csr - -SSLProtocol -All +TLSv1 +TLSv1.1 +TLSv1.2 - -ServerName centos7.local:443 -``` - -Restart Apache with the following command: - -``` -systemctl restart httpd -``` - -To force OTRS to run in https mode, edit the following file: - -``` -vim /etc/httpd/conf/httpd.conf -``` - -At the end of file, uncoment the following directive: - -``` -IncludeOptional conf.d/*.conf -``` - -Edit the file zzz_otrs.conf: - -``` -vim /etc/httpd/conf.d/zzz_otrs.conf -``` - -After the line 26 (before the line module  mod_version.c) add the following directives: - -``` -RewriteEngine On -RewriteCond %{HTTPS} off -RewriteRule (.*) https://%{HTTP_HOST}%{REQUEST_URI} -``` - -Restart Apache: - -``` -[root@centos7 ~]# systemctl restart httpd -``` - -To use extended features in OTRS, we have to install some PERL modules. Run the following command to install them: - -``` -yum -y install "perl(Text::CSV_XS)" "perl(Crypt::Eksblowfish::Bcrypt)" "perl(YAML::XS)" "perl(JSON::XS)" "perl(Encode::HanExtra)" "perl(Mail::IMAPClient)" "perl(ModPerl::Util)" -``` - -The OTRS system has a tool to check the PERL modules, run it like this to verify the system requirements: - -``` -cd /opt/otrs/bin -``` - -and run: - -``` -./otrs.CheckModules.pl -``` - -The output for our configuration must be: - -``` -o Apache::DBI......................ok (v1.12) o Apache2::Reload..................ok (v0.13) o Archive::Tar.....................ok (v1.92) o Archive::Zip.....................ok (v1.30) o Crypt::Eksblowfish::Bcrypt.......ok (v0.009) o Crypt::SSLeay....................ok (v0.64) o Date::Format.....................ok (v2.24) o DBI..............................ok (v1.627) o DBD::mysql.......................ok (v4.023) o DBD::ODBC........................Not installed! (optional - Required to connect to a MS-SQL database.) o DBD::Oracle......................Not installed! (optional - Required to connect to a Oracle database.) o DBD::Pg..........................Not installed! Use: 'yum install "perl(DBD::Pg)"' (optional - Required to connect to a PostgreSQL database.) o Digest::SHA......................ok (v5.85) o Encode::HanExtra.................ok (v0.23) o IO::Socket::SSL..................ok (v1.94) o JSON::XS.........................ok (v3.01) o List::Util::XS...................ok (v1.27) o LWP::UserAgent...................ok (v6.13) o Mail::IMAPClient.................ok (v3.37) o IO::Socket::SSL................ok (v1.94) o ModPerl::Util....................ok (v2.000010) o Net::DNS.........................ok (v0.72) o Net::LDAP........................ok (v0.56) o Template.........................ok (v2.24) o Template::Stash::XS..............ok (undef) o Text::CSV_XS.....................ok (v1.00) o Time::HiRes......................ok (v1.9725) o Time::Piece......................ok (v1.20_01) o XML::LibXML......................ok (v2.0018) o XML::LibXSLT.....................ok (v1.80) o XML::Parser......................ok (v2.41) o YAML::XS.........................ok (v0.54) -``` - -To start the OTRS Daemon with the "otrs" user, run the following command: - -``` -su -c "/opt/otrs/bin/otrs.Daemon.pl start" -s /bin/bash otrs -``` - -To disable the CentOS 7 firewall, run the following command: - -``` -systemctl stop firewalld -``` - -To disable CentOS 7 Firewall to start up automaticaly, run: - -``` -systemctl disable firewalld.service -``` - -Start the OTRS Daemon with: - -``` -su -c "/opt/otrs/bin/otrs.Daemon.pl start" -s /bin/bash otrsCron.sh -``` - -The output of command must be: - -``` -/opt/otrs/bin Cron.sh - start/stop OTRS cronjobs Copyright (C) 2001-2012 OTRS AG, http://otrs.org/ (using /opt/otrs) done -``` - -If you want to check the OTRS Daemon status, run the following command: - -``` -su -c "/opt/otrs/bin/otrs.Daemon.pl status" -s /bin/bash otrsCron.sh -``` - -Configuring OTRS in the crontab. Change the user root to otrs and start to edit the crontab: - -``` -su otrs - -crontab -e -``` - -Fill the crontab with the following content and save it: - -``` -# -- -# Copyright (C) 2001-2016 OTRS AG, http://otrs.com/ -# -- -# This software comes with ABSOLUTELY NO WARRANTY. For details, see -# the enclosed file COPYING for license information (AGPL). If you -# did not receive this file, see http://www.gnu.org/licenses/agpl.txt. -# -- - -# Who gets the cron emails? -MAILTO="root@localhost" -# -- -# Copyright (C) 2001-2016 OTRS AG, http://otrs.com/ -# -- -# This software comes with ABSOLUTELY NO WARRANTY. For details, see -# the enclosed file COPYING for license information (AGPL). If you -# did not receive this file, see http://www.gnu.org/licenses/agpl.txt. -# -- - -# check OTRS daemon status -*/5 * * * * $HOME/bin/otrs.Daemon.pl start >> /dev/null -``` - -### Configure OTRS on CentOS 7 - -Open a web browser and open the URL [https://centos7.local/otrs/installer.pl][8]. Remember, centos7.local is the name of my server, insert your hostname or IP address. The first screen shows the 4 steps to conclude the OTRS installation, press Next.   - -[ - ![OTRS installation screen](https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/OTRS_How_To_Alexandre_Costa.13_.jpg) -][9] - -License: to continue, read and accept the license to continue: - -[ - ![Accept the license and continue](https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/OTRS_How_To_Alexandre_Costa.14_.jpg) -][10]  - -Database Selection: select  the option **MySQL** and in the Install Type, mark the Create a new database for OTRS option and click on the next button: - -[ - ![Select database type mysql](https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/OTRS_How_To_Alexandre_Costa.15_.jpg) -][11] - -Configure MySQL: fill the fields User, Password and Host (remember the data of the MariaDB configuration that we made) and press check database settings: - -[ - ![Insert database login details](https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/OTRS_How_To_Alexandre_Costa.16_.jpg) -][12] - -The OTRS installer will create the database in MariaDB, press next button: - -[ - ![Create OTRS database](https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/OTRS_How_To_Alexandre_Costa.17_.jpg) -][13] - -OTRS database created successfully:  - -[ - ![OTRS Database created](https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/OTRS_How_To_Alexandre_Costa.18_.jpg) -][14] - -Config system settings: fill the fields with your own information and press next: - -[ - ![Set the personal config details](https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/OTRS_How_To_Alexandre_Costa.19_.jpg) -][15] - -OTRS E-mail configuration: fill in the fields acording your e-mail server. In my setup, for outbound email I use SMPTTLS and port 587, for inbound email, I use pop3, you will need an e-mail account. Check mail configuration or skip this step: - -[ - ![Email setup in OTRS](https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/OTRS_How_To_Alexandre_Costa.21_.jpg) -][16] - -To finish, take a note about the user and password to access the OTRS, after login you can change the password: - -[ - ![OTRS Username and password](https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/OTRS_How_To_Alexandre_Costa.23_.jpg) -][17] - -The OTRS url login is [https://centos7.local/otrs/index.pl?][18]. Remember, centos7.local is the name of my server, insert your hostnamen or IP address.: - -[ - ![Login to OTRS](https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/OTRS_How_To_Alexandre_Costa.25_.jpg) -][19] - -Login at the OTRS: - -[ - ![OTRS Admin Login](https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/OTRS_How_To_Alexandre_Costa.27_.jpg) -][20] - -OTRS is installed and ready to be configured with your support rules or business model. - --------------------------------------------------------------------------------- - -via: https://www.howtoforge.com/tutorial/how-to-install-otrs-on-centos-7/ - -作者:[Alexandre Costa][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.howtoforge.com/tutorial/how-to-install-otrs-on-centos-7/ -[1]:https://www.howtoforge.com/tutorial/how-to-install-otrs-on-centos-7/#thenbspenvironment -[2]:https://www.howtoforge.com/tutorial/how-to-install-otrs-on-centos-7/#preparation -[3]:https://www.howtoforge.com/tutorial/how-to-install-otrs-on-centos-7/#install-mariadb-on-centos- -[4]:https://www.howtoforge.com/tutorial/how-to-install-otrs-on-centos-7/#install-epelnbsp -[5]:https://www.howtoforge.com/tutorial/how-to-install-otrs-on-centos-7/#install-otrs -[6]:https://www.howtoforge.com/tutorial/how-to-install-otrs-on-centos-7/#configure-otrs-on-centos- -[7]:https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/big/OTRS_How_To_Alexandre_Costa.jpg -[8]:http://centos7.local/otrs/installer.pl -[9]:https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/big/OTRS_How_To_Alexandre_Costa.13_.jpg -[10]:https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/big/OTRS_How_To_Alexandre_Costa.14_.jpg -[11]:https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/big/OTRS_How_To_Alexandre_Costa.15_.jpg -[12]:https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/big/OTRS_How_To_Alexandre_Costa.16_.jpg -[13]:https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/big/OTRS_How_To_Alexandre_Costa.17_.jpg -[14]:https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/big/OTRS_How_To_Alexandre_Costa.18_.jpg -[15]:https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/big/OTRS_How_To_Alexandre_Costa.19_.jpg -[16]:https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/big/OTRS_How_To_Alexandre_Costa.21_.jpg -[17]:https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/big/OTRS_How_To_Alexandre_Costa.23_.jpg -[18]:https://centos7.local/otrs/index.pl -[19]:https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/big/OTRS_How_To_Alexandre_Costa.25_.jpg -[20]:https://www.howtoforge.com/images/how_to_install_and_configure_otrs_open_source_trouble_ticket_system_software_on_centos_7/big/OTRS_How_To_Alexandre_Costa.27_.jpg From 06d6c2d2a612d184dc93aa2bcb587164a42fa73a Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:44:05 +0800 Subject: [PATCH 0144/1407] recycle --- ...ca deploys open source tools save lives.md | 83 ------------------- 1 file changed, 83 deletions(-) delete mode 100644 sources/tech/20170201 Dedicated engineering team in South Africa deploys open source tools save lives.md diff --git a/sources/tech/20170201 Dedicated engineering team in South Africa deploys open source tools save lives.md b/sources/tech/20170201 Dedicated engineering team in South Africa deploys open source tools save lives.md deleted file mode 100644 index 4745fa66bd..0000000000 --- a/sources/tech/20170201 Dedicated engineering team in South Africa deploys open source tools save lives.md +++ /dev/null @@ -1,83 +0,0 @@ -Dedicated engineering team in South Africa deploys open source tools, save lives -============================================================ - - ![Dedicated engineering team in South Africa deploys open source tools, save lives](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/world_hands_diversity.png?itok=LMT5xbxJ "Dedicated engineering team in South Africa deploys open source tools, save lives") -Image by : opensource.com - -In 2006, a groundbreaking TED talk used statistics to reveal surprising [insights about the developing world][2], including how many people in South Africa have HIV despite free and available anti-retroviral drugs. - -[Gustav Praekelt][3], founder of [Praekelt.org][4], heard this TED talk and began tenaciously calling a local hospital to convince them to start an SMS program that would promote anti-retrovirals. The program that resulted from those calls became [txtAlert][5]—a successful and widely recognized mobile health program that dramatically improves medical appointment adherence and creates a free channel for patients to communicate with the hospital.  - -Today, nearly a decade later, the organization that Gustav founded in 2007, Praekelt.org, continues to harness the power of mobile technology. - -The global nonprofit organization uses open source technologies to deliver essential information and vital services to millions of people around the world, particularly in Africa. We are deeply committed to the idea that our software innovations should be shared with the development community that made delivering our products possible. By participating and giving back to this community we support and sustain the rich ecosystem of tools and products that they have developed to improve the lives of people around the world. - -Praekelt.org is a supporter of the [Principles for Digital Development][6] and in particular [Cause 6][7], which states: - -* Adopt and expand existing open standards. -* Open data and functionalities and expose them in documented Application Programming Interfaces (APIs) where use by a larger community is possible. -* Invest in software as a public good. -* Develop software to be open source by default with the code made available in public repositories and supported through developer communities. - -A great example of this can be found in our original work to make population-scale messaging possible in the majority world. We had and continue to have success with txtAlert in South Africa, but despite considerable interest, replicating this success in other places has been very challenging. The necessary integration work required for each new messaging service provider requires too much customization. - -To solve this, we created [Vumi][8], a software library that provides a single point of integration for messaging communication channel integrations. It abstracts away all of the differences that require the customized integrations and provided a single consistent API to speak to all of them. The result is a dramatic increase in the re-use of both integrations and applications because they were only needing to be written once and could be used widely. - -Vumi provides the means of integrations, and this past year in collaboration with UNICEF we have launched [Junebug][9], an application server that provides APIs to launch Vumi integrations, enabling direct messaging system integrations in both cloud- and on-premise-based scenarios. Junebug now powers national-scale, maternal health programs in South Africa, Nigeria, and Uganda, delivering essential information for expecting women and mothers. It also provides SMS and [Unstructured Supplementary Service Data][10] (USSD) access to vital services, such as national helpdesks and FAQ services. - -These systems have processed over 375 million real-time messages in the last year. - -We are a relatively small engineering team based out of South Africa. We could not fathom developing these services were we not standing on the shoulders of giants. All of the services we provide or build on are available as open source software. - -Our language of choice is [Python][11], which enables us to express our ideas in code succinctly and in a way that is both readable and maintainable. Our messaging systems are built using [Twisted][12], an excellent event-driven network programming framework built using Python. [Molo][13], our web publishing platform, is built using [Django][14], and the wonderful open source [Wagtail CMS][15] is built by our friends at [Torchbox][16]. - -Our three-person site reliability engineering team is able to run over a thousand applications in production by relying on Mesosphere's [Marathon][17] for [Apache Mesos][18]. We have recently released [Marathon Acme][19], which enables automatic SSL/TLS certificate provisioning via [LetsEncrypt][20] for Marathon's load balancer, ensuring our services are secure. - -Our engineering team is distributed, and the workflow enabled by [Git][21] allows us to develop software in a reliable fashion. For example, by using test-driven development we are able to automate our deploys. Using these open source tools and systems we've averaged 21 automated deploys a day over the course of 2016. Developing software in an open environment is easier and more effective. Our work would have been significantly more difficult had there not been such an active and vibrant community on which to build. - -We are excited to be part of these developments in open source technology integration. As a mission-driven organization we are deeply committed to continue [sharing ][22][what we learn][23] and develop. If you are interested in joining our team, [apply here][24]. Our open source repositories have documented OS licenses and contributions guidelines. We welcome any community contributions. Please email us at [dev@praekelt.org][25]. - --------------------------------------------------------------------------------- - -作者简介: - -Simon de Haan - Simon de Haan is the Chief Engineer at Praekelt Foundation and has the rare talent to demystify software systems and platforms for non­​engineers. He was the team lead on Praekelt Foundation’s Vumi platform, an open source messaging platform that allows for interactive conversations over SMS, USSD, Gt​alk and other basic technologies at low cost and at population scale in the majority world. Vumi is the technology that powers various groundbreaking initiatives such as Wikipedia Text, PeaceTXT, - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/17/2/open-source-tools-south-africa - -作者:[Simon de Haan][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/praekelt -[1]:https://opensource.com/article/17/2/open-source-tools-south-africa?rate=XZZ1Mtc79KokPszccwi_HiEkWMJyoJZghkUumJTwIiI -[2]:https://www.ted.com/talks/hans_rosling_shows_the_best_stats_you_ve_ever_seen -[3]:http://www.praekelt.org/ -[4]:http://www.praekelt.org/ -[5]:http://txtalert.praekeltfoundation.org/bookings/about-txtalert/ -[6]:http://digitalprinciples.org/ -[7]:http://digitalprinciples.org/use-open-standards-open-data-open-source-and-open-innovation/ -[8]:https://github.com/praekelt/vumi -[9]:http://junebug.praekelt.org/ -[10]:https://en.wikipedia.org/wiki/Unstructured_Supplementary_Service_Data -[11]:https://www.python.org/ -[12]:https://en.wikipedia.org/wiki/Twisted_(software) -[13]:http://molo.readthedocs.io/ -[14]:http://www.djangoproject.com/ -[15]:https://wagtail.io/ -[16]:https://torchbox.com/work/wagtail/ -[17]:https://mesosphere.github.io/marathon/ -[18]:http://mesos.apache.org/ -[19]:https://github.com/praekeltfoundation/marathon-acme -[20]:https://letsencrypt.org/ -[21]:http://git-scm.org/ -[22]:https://medium.com/@praekeltorg -[23]:https://medium.com/@praekeltorg -[24]:http://www.praekelt.org/careers/ -[25]:https://opensource.com/article/17/2/mail%20to:%20dev@praekelt.org -[26]:https://opensource.com/user/108011/feed -[27]:https://opensource.com/users/praekelt From 80f2df594cc085f1a06138cccdcc642ac85b1252 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:44:10 +0800 Subject: [PATCH 0145/1407] recycle --- ... around video and subtitle embed errors.md | 122 ------------------ 1 file changed, 122 deletions(-) delete mode 100644 sources/tech/20170303 How to work around video and subtitle embed errors.md diff --git a/sources/tech/20170303 How to work around video and subtitle embed errors.md b/sources/tech/20170303 How to work around video and subtitle embed errors.md deleted file mode 100644 index c95ce4b68b..0000000000 --- a/sources/tech/20170303 How to work around video and subtitle embed errors.md +++ /dev/null @@ -1,122 +0,0 @@ -# How to work around video and subtitle embed errors - - -This is going to be a slightly weird tutorial. The background story is as follows. Recently, I created a bunch of [sweet][1] [parody][2] [clips][3] of the [Risitas y las paelleras][4] sketch, famous for its insane laughter by the protagonist, Risitas. As always, I had them uploaded to Youtube, but from the moment I decided on what subtitles to use to the moment when the videos finally became available online, there was a long and twisty journey. - -In this guide, I would like to present several typical issues that you may encounter when creating your own media, mostly with subtitles and the subsequent upload to media sharing portals, specifically Youtube, and how you can work around those. After me. - -### The background story - -My software of choice for video editing is Kdenlive, which I started using when I created the most silly [Frankenstein][5] clip, and it's been my loyal companion ever since. Normally, I render files to WebM container, with VP8 video codec and Vorbis audio codec, because that's what Google likes. Indeed, I had no issues with the roughly 40 different clips I uploaded in the last seven odd years. - - ![Kdenlive, create project](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-errors-kdenlive-create-project.jpg) - - ![Kdenlive, render](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-errors-kdenlive-render.png) - -However, after I completed my Risitas & Linux project, I was in a bit of a predicament. The video file and the subtitle file were still two separate entities, and I needed somehow to put them together. My original article for subtitles work mentions Avidemux and Handbrake, and both these are valid options. - -However, I was not too happy with the output generated by either one of these, and for a variety of reasons, something was ever so slightly off. Avidemux did not handle the video codecs well, whereas Handbrake omitted a couple of lines of subtitle text from the final product, and the font was ugly. Solvable, but not the topic for today. - -Therefore, I decided to use VideoLAN (VLC) to embed subtitles onto the video. There are several ways to do this. You can use the Media > Convert/Save option, but this one does not have everything we need. Instead, you should use Media > Stream, which comes with a more fully fledged wizard, and it also offers an editable summary of the transcoding options, which we DO need - see my [tutorial][6] on subtitles for this please. - -### Errors! - -The process of embedding subtitles is not trivial. You will most likely encounter several problems along the way. This guide should help you work around these so you can focus on your work and not waste time debugging weird software errors. Anyhow, here's a small but probable collection of issues you will face while working with subtitles in VLC. Trial & error, but also nerdy design. - -### No playable streams - -You have probably chosen weird output settings. You might want to double check you have selected the right video and audio codecs. Also, remember that some media players may not have all the codecs. Also, make sure you test on the system you want these clips to play. - - ![No playable streams](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-errors-no-playable-streams.png) - -### Subtitles overlaid twice - -This can happen if you check the box that reads Use a subtitle file in the first step of the streaming media wizard. Just select the file you need and click Stream. Leave the box unchecked. - - ![Select file](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-select.png) - -### No subtitle output is generated - -This can happen for two main reasons. One, you have selected the wrong encapsulation format. Do make sure the subtitles are marked correctly on the profile page when you edit it before proceeding. If the format does not support subtitles, it might not work. - - ![Encapsulation](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-encap.png) - -Two, you may have left the subtitle codec render enabled in the final output. You do not need this. You only need to overlay the subtitles onto the video clip. Please check the generated stream output string and delete an option that reads scodec= before you click the Stream button. - - ![Remove text from output string](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-remove-text.png) - -### Missing codecs + workaround - -This is a common [bug][7] due to how experimental codecs are implemented, and you will most likely see it if you choose the following profile: Video - H.264 + AAC (MP4). The file will be rendered, and if you selected subtitles, they will be overlaid, too, but without any audio. However, we can fix this with a hack. - - ![AAC codec](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-errors-aac-codec.png) - - ![MP4A error](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-errors-mp4a.png) - -One possible hack is to start VLC from command line with the --sout-ffmpeg-strict=-2 option (might work). The other and more sureway workaround is to take the audio-less video but with the subtitles overlayed and re-render it through Kdenlive with the original project video render without subtitles as an audio source. Sounds complicated, so in detail: - -* Move existing clips (containing audio) from video to audio. Delete the rest. -* Alternatively, use rendered WebM file as your audio source. -* Add new clip - the one we created with embedded subtitles AND no audio. -* Place the clip as new video. -* Render as WebM again. - - ![Repeat render](http://www.dedoimedo.com/images/computers-years/2016-2/vlc-subs-errors-kdenlive-repeat-render.jpg) - -Using other types of audio codecs will most likely work (e.g. MP3), and you will have a complete project with video, audio and subtitles. If you're happy that nothing is missing, you can now upload to Youtube. But then ... - -### Youtube video manager & unknown format - -If you're trying to upload a non-WebM clip (say MP4), you might get an unspecified error that your clip does not meet the media format requirements. I was not sure why VLC generated a non-Youtube-compliant file. However, again, the fix is easy. Use Kdenlive to recreate the video, and this should result in a file that has all the right meta fields and whatnot that Youtube likes. Back to my original story and the 40-odd clips created through Kdenlive this way. - -P.S. If your clip has valid audio, then just re-run it through Kdenlive. If it does not, do the video/audio trick from before. Mute clips as necessary. In the end, this is just like overlay, except you're using the video source from one clip and audio from another for the final render. Job done. - -### More reading - -I do not wish to repeat myself or spam unnecessarily with links. I have loads of clips on VLC in the Software & Security section, so you might want to consult those. The earlier mentioned article on VLC & Subtitles has links to about half a dozen related tutorials, covering additional topics like streaming, logging, video rotation, remote file access, and more. I'm sure you can work the search engine like pros. - -### Conclusion - -I hope you find this guide helpful. It covers a lot, and I tried to make it linear and simple and address as many pitfalls entrepreneuring streamers and subtitle lovers may face when working with VLC. It's all about containers and codecs, but also the fact there are virtually no standards in the media world, and when you go from one format to another, sometimes you may encounter corner cases. - -If you do hit an error or three, the tips and tricks here should help you solve at least some of them, including unplayable streams, missing or duplicate subtitles, missing codecs and the wicked Kdenlive workaround, Youtube upload errors, hidden VLC command line options, and a few other extras. Quite a lot for a single piece of text, right. Luckily, all good stuff. Take care, children of the Internet. And if you have any other requests as to what next my future VLC articles should cover, do feel liberated enough to send an email. - -Cheers. - --------------------------------------------------------------------------------- - - - -作者简介: - -My name is Igor Ljubuncic. I'm more or less 38 of age, married with no known offspring. I am currently working as a Principal Engineer with a cloud technology company, a bold new frontier. Until roughly early 2015, I worked as the OS Architect with an engineering computing team in one of the largest IT companies in the world, developing new Linux-based solutions, optimizing the kernel and hacking the living daylights out of Linux. Before that, I was a tech lead of a team designing new, innovative solutions for high-performance computing environments. Some other fancy titles include Systems Expert and System Programmer and such. All of this used to be my hobby, but since 2008, it's a paying job. What can be more satisfying than that? - -From 2004 until 2008, I used to earn my bread by working as a physicist in the medical imaging industry. My work expertise focused on problem solving and algorithm development. To this end, I used Matlab extensively, mainly for signal and image processing. Furthermore, I'm certified in several major engineering methodologies, including MEDIC Six Sigma Green Belt, Design of Experiment, and Statistical Engineering. - -I also happen to write books, including high fantasy and technical work on Linux; mutually inclusive. - -Please see my full list of open-source projects, publications and patents, just scroll down. - -For a complete list of my awards, nominations and IT-related certifications, hop yonder and yonder please. - - -------------- - - -via: http://www.dedoimedo.com/computers/vlc-subtitles-errors.html - -作者:[Igor Ljubuncic][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.dedoimedo.com/faq.html - -[1]:https://www.youtube.com/watch?v=MpDdGOKZ3dg -[2]:https://www.youtube.com/watch?v=KHG6fXEba0A -[3]:https://www.youtube.com/watch?v=TXw5lRi97YY -[4]:https://www.youtube.com/watch?v=cDphUib5iG4 -[5]:http://www.dedoimedo.com/computers/frankenstein-media.html -[6]:http://www.dedoimedo.com/computers/vlc-subtitles.html -[7]:https://trac.videolan.org/vlc/ticket/6184 From b7052083efd08b2d6d8b57b6706f4ca21fd71a2b Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:46:45 +0800 Subject: [PATCH 0146/1407] recycle --- ...w is your community promoting diversity.md | 83 ------------------- 1 file changed, 83 deletions(-) delete mode 100644 sources/talk/20170120 How is your community promoting diversity.md diff --git a/sources/talk/20170120 How is your community promoting diversity.md b/sources/talk/20170120 How is your community promoting diversity.md deleted file mode 100644 index 6b10faead7..0000000000 --- a/sources/talk/20170120 How is your community promoting diversity.md +++ /dev/null @@ -1,83 +0,0 @@ -How is your community promoting diversity? -============================================================ - -> Open source foundation leaders weigh in. - - ![How is your community promoting diversity?](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/world_hands_diversity.png?itok=LMT5xbxJ "How is your community promoting diversity?") -Image by : opensource.com - -Open source software is a great enabler for technology innovation. Diversity unlocks innovation and drives market growth. Open source and diversity seem like the ultimate winning combination, yet ironically open source communities are among the least diverse tech communities. This is especially true when it comes to inherent diversity: traits such as gender, age, ethnicity, and sexual orientation. - -It is hard to get a true picture of the diversity of our communities in all the various dimensions. Gender diversity, by virtue of being noticeably lacking and more straight forward to measure, is the starting point and current yardstick for measuring diversity in tech communities. - -For example, it is estimated that around 25% of all software developers are women, but [only 3% work][5] in free and open software. These figures are consistent with my personal experience working in open source for over 10 years. - -Even when individuals in the community are [doing their best][6] (and I have worked with many who are), it seems to make little difference. And little has changed in the last ten years. However, we are, as a community, starting to have a better understanding of some of the factors that maintain this status quo, things like [unconscious bias][7] or [social graph and privilege][8] problems. - -In order to overcome the gravity of these forces in open source, we need combined efforts that are sustained over the long term and that really work. There is no better example of how diversity can be improved rapidly in a relatively short space of time than the Python community. PyCon 2011 consisted of just 1% women speakers. Yet in 2014, 33% of speakers at PyCon were women. Now Python conferences regularly lay out [their diversity targets and how they intend to meet them][9]. - -What did it take to make that dramatic improvement in women speaker numbers? In her great talk at PyCon 2014, [Outreach Program for Women: Lessons in Collaboration][10], Marina Zhurakhinskaya outlines the key ingredients: - -* The importance of having a Diversity Champion to spearhead the changes over the long term; in the Python community Jessica McKellar was the driving force behind the big improvement in diversity figures -* Specifically marketing to under-represented groups; for example, how GNOME used outreach programs, such as [Outreachy][1], to market to women specifically - -We know diversity issues, while complex are imminently fixable. In this way, open source foundations can play a huge role in the sustaining efforts to promote initiatives. Are other open source communities also putting efforts into diversity? To find out, we asked a few open source foundation leaders: - -### How does your foundation promote diversity in its open source community? - -**Mike Milinkovich, executive director of the Eclipse Foundation:** - -> "The Eclipse Foundation is committed to promoting diversity in its open source community. But that commitment does not mean that we are satisfied with where we are today. We have a long way to go, particularly in the area of gender diversity. That said, some of the tangible steps we've taken in the last couple of years are: (a) we put into place a [Community Code of Conduct][2] that covers all of our activities, (b) we are consciously recruiting women for our conference program committees, (c) we are consciously looking for women speakers for our conferences, including keynotes, and (d) we are supporting community channels to discuss diversity topics. It's been great to see members of our community step up to assume leadership roles on this topic, and we're looking forward to making a lot of progress in 2017." - -**Abby Kearns, executive director for the Cloud Foundry:** - -> "For Cloud Foundry we promote diversity in a variety of ways. For our community, this includes a heavy focus on diversity events at our summit, and on our keynote stage. I'm proud to say we doubled the representation by women and people of color at our last event. For our contributors, this takes on a slightly different meaning and includes diversification across company and role." - - A recent Cloud Foundry Summit featured a [diversity luncheon][11] as well as a [keynote on diversity][12], which highlighted how [gender parity had been achieved][13] by one member company's team. - -**Chris Aniszczyk, COO of the Cloud Native Computing Foundation:** - -> "The Cloud Native Computing Foundation (CNCF) is a very young foundation still, and although we are only one year old as of December 2016, we've had promoting diversity as a goal since our inception. First, every conference hosted by CNCF has [diversity scholarships][3] available, and there are usually special diversity lunches or events at the conference to promote inclusion. We've also sponsored "[contribute your first patch][4]" style events to promote new contributors from all over. These are just some small things we currently do. In the near future, we are discussing launching a Diversity Workgroup within CNCF, and also as we ramp up our certification and training programs, we are discussing offering scholarships for folks from under-representative backgrounds." - -Additionally, Cloud Native Computing Foundation is part of the [Linux Foundation][14] as a formal Collaborative Projects (along with other foundations, including Cloud Foundry Foundation). The Linux Foundation has extensive [Diversity Programs][15] and as an example, recently [partnered with the Girls In Tech][16] not-for-profit to improve diversity in open source. In the future, the CNCF actively plans to participate in these Linux Foundation wide initiatives as they arise. - -For open source to thrive, companies need to foster the right environment for innovation. Diversity is a big part of this. Seeing open source foundations making the conscious decision to take action is encouraging. Dedicated time, money, and resources to diversity is making a difference within communities, and we are slowly but surely starting to see the effects. Going forward, communities can collaborate and learn from each other about what works and makes a real difference. - -If you work in open source, be sure to ask and find out what is being done in your community as a whole to foster and promote diversity. Then commit to supporting these efforts and taking the steps toward making a real difference. It is exciting to think that the next ten years might be a huge improvement over the last 10, and we can start to envision a future of truly diverse open source communities, the ultimate winning combination. - --------------------------------------------------------------------------------- - -作者简介: - -![](https://opensource.com/sites/default/files/styles/profile_pictures/public/pictures/dsc_0182.jpg?itok=c_u-wggj) - -Tracy Miranda - Tracy Miranda is a software developer and founder of Kichwa Coders, a software consultancy specializing in Eclipse tools for scientific and embedded software. Tracy has been using Eclipse since 2003 and is actively involved in the community, particularly the Eclipse Science Working Group. Tracy has a background in electronics system design. She mentors young coders at the festival of code for Young Rewired State. Follow Tracy on Twitter @tracymiranda. - --------------------------------------------------------------------------------- - - -via: https://opensource.com/article/17/1/take-action-diversity-tech - -作者:[ Tracy Miranda][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/tracymiranda -[1]:https://www.gnome.org/outreachy/ -[2]:https://www.eclipse.org/org/documents/Community_Code_of_Conduct.php -[3]:http://events.linuxfoundation.org/events/cloudnativecon-and-kubecon-north-america/attend/scholarship-opportunities -[4]:http://conferences.oreilly.com/oscon/oscon-tx-2016/public/schedule/detail/53257 -[5]:https://www.linux.com/blog/how-bring-more-women-free-and-open-source-software -[6]:https://trishagee.github.io/post/what_can_men_do/ -[7]:https://opensource.com/life/16/3/sxsw-diversity-google-org -[8]:https://opensource.com/life/15/8/5-year-plan-improving-diversity-tech -[9]:http://2016.pyconuk.org/diversity-target/ -[10]:https://www.youtube.com/watch?v=CA8HN20NnII -[11]:https://www.youtube.com/watch?v=LSRrc5B1an0&list=PLhuMOCWn4P9io8gtd6JSlI9--q7Gw3epW&index=48 -[12]:https://www.youtube.com/watch?v=FjF8EK2zQU0&list=PLhuMOCWn4P9io8gtd6JSlI9--q7Gw3epW&index=50 -[13]:https://twitter.com/ab415/status/781036893286854656 -[14]:https://www.linuxfoundation.org/about/diversity -[15]:https://www.linuxfoundation.org/about/diversity -[16]:https://www.linux.com/blog/linux-foundation-partners-girls-tech-increase-diversity-open-source From edc38fd592c677adecc936f521a929df5a35f92a Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:46:49 +0800 Subject: [PATCH 0147/1407] recycle --- ...me a project team leader in open source.md | 64 ------------------- 1 file changed, 64 deletions(-) delete mode 100644 sources/talk/20170210 How I became a project team leader in open source.md diff --git a/sources/talk/20170210 How I became a project team leader in open source.md b/sources/talk/20170210 How I became a project team leader in open source.md deleted file mode 100644 index 1825da6448..0000000000 --- a/sources/talk/20170210 How I became a project team leader in open source.md +++ /dev/null @@ -1,64 +0,0 @@ -How I became a project team leader in open source -============================================================ - ![How I became a project team leader in open source](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/BUSINESS_leadership_brand.png?itok=XSHoZZoG "How I became a project team leader in open source") - -Image by :  - -opensource.com - -> _The only people to whose opinions I listen now with any respect are people much younger than myself. They seem in front of me. Life has revealed to them her latest wonder. _― [Oscar Wilde][1], [The Picture of Dorian Gray][2] - -2017 marks two decades since I was first introduced to the concept of "open source" (though the term wasn't coined until later), and a decade since I made my first open source documentation contribution. Each year since has marked another milestone on that journey: new projects, new toolchains, becoming a core contributor, new languages, and becoming a Program Technical Lead (PTL). - -2017 is also the year I will take a step back, take a deep breath, and consciously give the limelight to others. - -As an idealistic young university undergraduate I hung around with the nerds in the computer science department. I was studying arts and, later, business, but somehow I recognized even then that these were my people. I'm forever grateful to a young man (his name was Michael, as so many people in my story are) who introduced me first to IRC and, gradually, to Linux, Google (the lesser known search engine at the time), HTML, and the wonders of open source. He and I were the first people I knew to use USB storage drives, and oh how we loved explaining what they were to the curious in the campus computer lab. - -After university, I found myself working for a startup in Canberra, Australia. Although the startup eventually failed to... well, start, I learned some valuable skills from another dear friend, David. I already knew I had a passion for writing, but David showed me how I could use that skill to build a career, and gave me the tools I needed to actually make that happen. He is also responsible for my first true language love: [LaTeX][3]. To this day, I can spot a LaTeX document from forty paces, which has prompted many an awkward conversation with the often-unwitting bearer of the document in question. - -In 2007, I began working for Red Hat, in what was then known as Engineering Content Services. It was a heady time. Red Hat was determined to invest in an in-house documentation and translation team, and another man by the name of Michael was determined that this would happen in Brisbane, Australia. It was extraordinary case of right place, right time. I seized the opportunity and, working alongside people I still count among the best and brightest technical writers I know, we set about making that thing happen. - -Working at Red Hat in those early days were some of the craziest and most challenging of my career so far. We grew rapidly, there were always several new hires waiting for us to throw them in the deep end, and we had the determination and tenacity to try new things constantly. _Release early, release often_ became a central tenet of our group, and we came up with some truly revolutionary ways of delivering content, as well as some appallingly bad ones. It was here that I discovered the beauty of data typing, single sourcing, remixing content, and using metadata to drive content curation. We weren't trying to tell stories to our readers, but to give our readers the tools to create their own stories. - -As the Red Hat team matured, so too did my career, and I eventually led a team of writers. Around the same time, I started attending and speaking at tech conferences, spreading the word about these new ways of developing content, and trying to lead developers into looking at documentation in new ways. I had a thirst for sharing this knowledge and passion for technical documentation with the world, and with the Red Hat content team slowing their growth and maturing, I found myself craving the fast pace of days gone by. It was time to find a new project. - -When I joined [Rackspace][4], [OpenStack][5] was starting to really hit its stride. I was on the organizing team for [linux.conf.au][6] in 2013 (ably led by yet another Michael), which became known affectionately as openstack.conf.au due to the sheer amount of OpenStack content that was delivered in that year. Anne Gentle had formed the OpenStack documentation team only a year earlier, and I had been watching with interest. The opportunity to work alongside Anne on such an exciting project was irresistible, so by the time 2013 drew to a close, Michael had hired me, and I had become a Racker and a Stacker. - -In late 2014, as we were preparing the Kilo release, Anne asked if I would be willing to put my name forward as a candidate for documentation PTL. OpenStack works on a democratic system where individuals self-nominate for the lead, and the active contributors to each project vote when there is more than one candidate. The fact that Anne not only asked me to step up, but also thought I was capable of stepping in her footsteps was an incredible honor. In early 2015, I was elected unopposed to lead the documentation team for the Liberty release, and we were off to Vancouver. - -By 2015, I had managed documentation teams sized between three and 13 staff members, across many time zones, for nearly five years. I had a business management degree and an MBA to my name, had run my own business, seen a tech startup fail, and watched a new documentation team flourish. I felt as though I understood what being a manager was all about, and I guess I did, but I realized I didn't know what being a PTL was all about. All of a sudden, I had a team where I couldn't name each individual, couldn't rely on any one person to come to work on any given day, couldn't delegate tasks with any authority, and couldn't compensate team members for good work. Suddenly, the only tool I had in my arsenal to get work done was my own ability to convince people that they should. - -My first release as documentation PTL was basically me stumbling around in the dark and poking at the things I encountered. I relied heavily on the expertise of the existing members of the group, particularly Anne Gentle and Andreas Jaeger (our documentation infrastructure guru), to work out what needed to be done, and I gradually started to document the things I learned along the way. I learned that the key to getting things done in a community was not just to talk and delegate, but to listen and collaborate. I had not only to tell people what to do, but also convince them that it was a good idea, and help them to see the task through, picking up the pieces if they didn't. - -Gradually, and through trial and error, I built the confidence and relationships to get through an OpenStack release successfully with my team and my sanity intact. This wouldn't have happened if the team hadn't been willing to stick by me through the times I was wandering in the woods, and the project would never have gotten off the ground in the first place without the advice and expertise of those that had gone before me. Shoulders of giants, etc. - -Somewhat ironically, technical writers aren't very good at documenting their own team processes, so we've been codifying our practices, conventions, tools, and systems. We still have much work to do on this front, but we have made a good start. As the OpenStack documentation team has matured, we have accrued our fair share of [tech debt][7], so dealing with that has been a consistent ribbon through my tenure, not just by closing old bugs (not that there hasn't been a lot of that), but also by changing our systems to prevent it building up in the first place. - -I am now in my tenth year as an open source contributor, and I have four OpenStack releases under my belt: Liberty, Mitaka, Newton, and Ocata. I have been a PTL for two years, and I have seen a lot of great documentation contributors come and go from our little community. I have made an effort to give those who are interested an opportunity to lead: through specialty teams looking after a book or two, release managers who perform the critical tasks to get each new release out into the wild, and moderators who lead a session at OpenStack Summit planning meetings (and help save my voice which, somewhat notoriously, is always completely gone by the end of Summit week). - -From these humble roles, the team has grown leaders. In these people, I see myself. They are hungry for change, full of ideas and ideals, and ready to implement crazy schemes and see where it takes them. So, this year, I'm going to take that step back, allow someone else to lead this amazing team, and let the team take their own steps forward. I intend to be here, holding on for the ride. I can't wait to see what happens next. - --------------------------------------------------------------------------------- - -作者简介: - -Lana Brindley - Lana Brindley has several university degrees, a few of which are even relevant to her field. She has been playing and working with technology since she discovered the Hitchhikers’ Guide to the Galaxy text adventure game in the 80’s. Eventually, she worked out a way to get paid for her two passions – writing and playing with gadgetry – and has been a technical writer ever since. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/17/2/my-open-source-story-leader - -作者:[Lana Brindley][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/loquacities -[1]:http://www.goodreads.com/author/show/3565.Oscar_Wilde -[2]:http://www.goodreads.com/work/quotes/1858012 -[3]:https://www.latex-project.org/ -[4]:https://www.rackspace.com/en-us -[5]:https://www.openstack.org/ -[6]:https://linux.conf.au/ -[7]:https://en.wikipedia.org/wiki/Technical_debt From 38941304e9459251c2c5abd2449a649bf76c0ed6 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:46:52 +0800 Subject: [PATCH 0148/1407] recycle --- ...Helps You Keep Technology Safe and Easy.md | 66 ------------------- 1 file changed, 66 deletions(-) delete mode 100644 sources/talk/20170209 Poverty Helps You Keep Technology Safe and Easy.md diff --git a/sources/talk/20170209 Poverty Helps You Keep Technology Safe and Easy.md b/sources/talk/20170209 Poverty Helps You Keep Technology Safe and Easy.md deleted file mode 100644 index fd1cbeb2db..0000000000 --- a/sources/talk/20170209 Poverty Helps You Keep Technology Safe and Easy.md +++ /dev/null @@ -1,66 +0,0 @@ -Poverty Helps You Keep Technology Safe and Easy -============================================================ - -> In the technology age, there might be some before unknown advantages to living on the bottom rungs of the economic ladder. The question is, do they outweigh the disadvantages. - -### Roblimo’s Hideaway - - ![Poor Linux](https://i0.wp.com/fossforce.com/wp-content/uploads/2017/02/trailerpark.jpg?resize=525%2C381) - -Earlier this week I saw a ZDNet story titled [Vizio: The spy in your TV][1] by my friend Steven J. Vaughan-Nichols. Scary stuff. I had a vision of my wife and me and a few dozen of our closest friends having a secret orgy in our living room, except our smart TV’s unblinking eye was recording our every thrust and parry (you might say). Zut alors! In this day of Internet everywhere, we all know that what goes online, stays online. Suddenly our orgy wasn’t secret, and my hopes of becoming the next President were dashed. - -Except… lucky me! I’m poor, so I have an oldie-but-goodie dumb TV that doesn’t have a camera. There’s no way  _my_  old Vizio can spy on us. As Mel Brooks didn’t quite say, “[It’s good to be the poverty case][2].” - -Now about that Internet-connected thermostat. I don’t have one. They’re not only expensive (which is why I don’t have one), but according to [this article,][3] they can be hacked to to run ransomware. Oh my! Once again, poverty saves me from a tech problem that can easily afflict my more prosperous neighbors. - -And how about the latest iPhone and the skinniest Mac BookPro. Apple sells the iPhone 7 Plus (gotta have the plussier one) for $769 or more. The MacBook, despite Scottish connotations of thrift, is Apple-priced “From $1299.” That’s a bunch of money, especially since we all know that as soon as you buy an Apple product it is obsolete and you need to get ready to buy a new, fancier one. - -Also, don’t these things explode sometimes? Or catch on fire or something? My [sub-$100 Android phone][4] is safe as houses by comparison. (It has a bigger screen than the biggest-screen iPhone 7, too. Amnazing!) - -Really big safe smartphone for cheap. Check. Simple, old-fashioned, non-networked thermostats that can’t be hacked. TV without the spycams most of the Money-TVs have. Check. - -But wait! There’s more! The [Android phones that got famous for burning up][5] everything in sight were top-dollar models my wife says she wouldn’t want even if we  _could_  afford them. Safety first, right? Frugality’s up there, too. - -Now let’s talk about how I got started with Linux. - -Guess what? It was because I was poor! The PC I had back in the days of yore ran DOS just fine, but couldn’t touch Windows 98 when it came out. Not only that, but Windows was expensive, and I was poor. Luckily, I had time on my hands, so I rooted around on the Internet (at phone modem speed) and eventually lit upon Red Hat Linux, which took forever to download and had an install procedure so complicated that instead of figuring it out I wrote an article about how Linux might be great for home computer use someday in the future, but not at the moment. - -This led to the discovery of several helpful local Linux Users Groups (LUGs) and skilled help getting Linux going on my admittedly creaky PC. And that, you might say, led to my career as an IT writer and editor, including my time at Slashdot, NewsForge, and Linux.com. - -This effectively, albeit temporarily, ended my poverty, but with the help of needy relatives — and later, needy doctors and hospitals — I was able to stay true to my “po’ people” roots. I’m glad I did. You’ve probably seen [this article][6] about hackers remotely shutting down a Jeep Cherokee. Hah! My 1996 Jeep Cherokee is totally immune to this kind of attack. Even my 2013 Kia Soul is  _relatively_  immune, since it lacks remote-start/stop and other deluxe convenience features that make new cars easy to hack. - -And the list goes on… same as [the beat went on][7] for Sonny and Cher. The more conveniences and Internet connections you have, the more vulnerable you are. Home automation? Make you into a giant hacking target. There’s also a (distant) possibility that your automated, uP-controlled home could become self-aware, suddenly say “I can’t do that, Dave,” and refuse to listen to your frantic cries that you aren’t Dave as it dumps you into the Internet-aware garbage disposal. - -The solution? You got it! Stay poor! Own the fewest possible web-connect cameras and microphones. Don’t get a thermostat people in Nigeria can program to turn your temperature up and down on one-minute cycles. No automatic lights. I mean… I MEAN… is it really all that hard to flick a light switch? I know, that’s something a previous generation took for granted the same way they once walked across the room to change TV channels, and didn’t complain about it. - -Computers? I have (not at my own expense) computers on my desk that run Mac OS, Windows, and Linux. Guess which OS causes me the least grief and confusion? You got it.  _The one that cost the least!_ - -So I leave you with this thought: In today’s overly-connected world of overly-complex technology, one of the kindest parting comments you can make to someone you care about is, ** _“Stay poor, my friend!”_ ** - -The following two tabs change content below. - --------------------------------------------------------------------------------- - -作者简介: - -Robin "Roblimo" Miller is a freelance writer and former editor-in-chief at Open Source Technology Group, the company that owned SourceForge, freshmeat, Linux.com, NewsForge, ThinkGeek and Slashdot, and until recently served as a video editor at Slashdot. He also publishes the blog Robin ‘Roblimo’ Miller’s Personal Site. @robinAKAroblimo - --------------------------------------------------------------------------------- - - -via: http://fossforce.com/2017/02/poverty-helps-keep-technology-safe-easy/ - -作者:[Robin "Roblimo" Miller][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.roblimo.com/ -[1]:http://www.zdnet.com/article/vizio-the-spy-in-your-tv/ -[2]:https://www.youtube.com/watch?v=StJS51d1Fzg -[3]:https://www.infosecurity-magazine.com/news/defcon-thermostat-control-hacked/ -[4]:https://www.amazon.com/LG-Stylo-Prepaid-Carrier-Locked/dp/B01FSVN3W2/ref=sr_1_1 -[5]:https://www.cnet.com/news/why-is-samsung-galaxy-note-7-exploding-overheating/ -[6]:https://www.wired.com/2015/07/hackers-remotely-kill-jeep-highway/ -[7]:https://www.youtube.com/watch?v=umrp1tIBY8Q From ed204d1714e3afb41f2f26200983d6ea8ac63bd6 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:46:55 +0800 Subject: [PATCH 0149/1407] recycle --- ...springboard you into an open source job.md | 117 ------------------ 1 file changed, 117 deletions(-) delete mode 100644 sources/talk/20170206 A graduate degree could springboard you into an open source job.md diff --git a/sources/talk/20170206 A graduate degree could springboard you into an open source job.md b/sources/talk/20170206 A graduate degree could springboard you into an open source job.md deleted file mode 100644 index e7942f13d9..0000000000 --- a/sources/talk/20170206 A graduate degree could springboard you into an open source job.md +++ /dev/null @@ -1,117 +0,0 @@ -A graduate degree could springboard you into an open source job -============================================================ - - - ![A graduate degree could springboard you into an open source job](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/rh_003784_02_os.comcareers_os_rh2x.png?itok=4wXjYMBw "A graduate degree could springboard you into an open source job") -Image by :  - -opensource.com - -Tech companies often prefer [hiring those who have open source experience][2] because quite simply open source experience is more valuable. This preference is only growing stronger now that open source software dominates the industry and free and open source hardware is gaining momentum. For example, a [Indeed.com salary analysis][3] shows that jobs with the keywords "Microsoft Windows" have an average salary of $64,000, while jobs with the keyword "Linux" have an average salary of $99,000\. Enough said.  - -There are many good open source jobs available to those with Bachelor's degrees, but if you want to control your destiny, a higher degree will give you the freedom to be paid more for following your interests. - -This was very important to me when deciding what education I would choose, and I think it is true of most other PhDs. However, even if you do not put much stock in intellectual freedom, there is a pretty easy case to be made for "doing it for the Benjamins." - -If you care about economic security, as an undergraduate you should consider graduate school. According to [data from the U.S. Bureau of Labor Statistics'][4] Current Population Survey, your average income is going to go up by over 20% if you get a Master's degree and by about 50% if you get a PhD. Similarly the unemployment rate for those with a Bachelor's degree was about 5%, drops to 3.6% for a Master's degree and is cut in half to 2.5% for those with a PhD. - -Of course, all graduate programs and schools are _not_ equal. Most open source advocates would likely find themselves in some kind of engineering program. This is actually also pretty good news on the money front. [IEEE's Where the Jobs Are 2014][5] report says that engineering unemployment is just 1.9% and down to pre-recession levels. Similarly a [survey][6] by the American Society of Mechanical Engineers (ASME) and the American Society of Civil Engineers (ASCE) found that during the recession (from 2011 to 2013) the average salary for engineers actually rose almost 5%. - -Ironically, many students do not consider graduate school for economic reasons. On its face, grad school appears expensive and working your way through it without shouldering a lot of debt seems impossible. For example, [MIT is $24,000 per term][7], and this does not even include room and board. Even at my more humble university graduate school (Michigan Tech, located in the [snow-blasted][8] upper peninsula of Michigan) will set you back more than [$40,000 a year][9] to be an electrical or computer engineer. Despite these costs, graduate school in technical disciplines almost always has an exceptionally high return on investment. - -Also, I have even more good news: **If you are a solid student, graduate school will be more than free.** - -In general, the best students are offered research assistantships that pay their way through graduate school completely, even at the nation's top schools. PhD and Master's degree students are generally fully funded, including tuition and monthly stipends. You will not get rich, but your ramen noodles will be covered. The real beauty of this path is that in general the research that you are paid for will go directly to your own thesis. - -If you are looking for a graduate degree that will springboard you into an open source job, simply any graduate program will not do. A place to start is with the [top 100 universities][10] to support FOSS. - -There are also many institutions that have a fairly well-developed open source culture. Students at RIT can now [earn a minor in free and open source software][11] and free culture, and at Michigan Tech you can join the [Open Hardware Enterprise][12], which is essentially a student-run business. The Massachusetts Institute of Technology hosts [OpenCourseware][13], an open source approach to educational materials. However, be aware that although an academic pedigree is important it is not the primary concern. This is because in graduate school (and particularly for funding) you are applying to a research group (i.e., a single professor) in addition to applying to the university and program. - -### How to get a job in an open source lab - -While many academics ascribe to open source principles and many schools are supportive of open source overall, the group of hard core open source lab groups is fairly selective. NetworkWorld offers [six examples][14], Wikipedia keeps an incomplete [list][15], and I maintain a list of contributors to open source hardware for science on [Appropedia][16]. There are many more to choose from (for example, anyone who attends the open science conferences, [GOSH][17], etc.). - -I run one of these labs myself, and I hope to offer some insight into the process of acquiring funding for potential graduate students. My group studies solar cells and open hardware. [Solar photovoltaic technology represents one of the fastest growing industries][18] and the [open source hardware movement][19] (particularly [RepRap][20] 3D printers) is exploding. Because my lab, the Michigan Tech Open Sustainability Technology ([MOST][21]) Lab, is on the cutting edge of two popular fields, entrance into the group is extremely competitive. This is generally the case with most other open source research groups, which I am happy to report are increasing in both size and overall density within the academic community. - -There are two routes you can take to getting a job in an open source lab: 1) the direct route and 2) the indirect route. - -First, the direct route. - -### Make personal contact and stand out - -Applying to an open source academic lab usually starts with emailing the professor who runs the lab directly. To start, make sure your email is actually addressed to the professor by name and catches his or her interest in the subject and first line. This is necessary because, in general, professors want students working in their labs who share an interest in their research areas. They do not simply want to hire someone that is looking for a job. There are thousands of students looking for positions, so professors can be fairly picky about their selections. You need to prove your interest. Professors literally get dozens of email applications a week, so you must make sure you stand out. - -### Get good grades and study for the GREs - -In addition, you need to cover all the obvious bases. You are going to be judged first by your numbers. You must maintain high grades and get good GRE scores. Even if you are an awesome person, if you do not have scores and grades high enough to impress, you will not meet the minimum requirements for the graduate program and not even make the list for research assistantships. For my lab, competitive graduate students need to be in the top 10% in grades and test scores (GRE ninetieth percentile scores are above 162 for verbal, 164 for quantitative, and 5 or higher in analytical writing. International students will need TOEFL scores greater than 100 and IELTS scores greater than 7.5). - -You can find less competitive groups, but grades and scores will largely determine your chances, particularly the GRE if you are coming from outside the country. There are simply too many universities throughout the world to allow for the evaluation of the quality of a particular grade in a particular school in a particular class. Thus, and I realize this is absurdly reductionist, the practicalities of graduate school admission mean that the GRE becomes a way of quickly vetting students. Realize, however, that you can study for the GRE to improve your scores. Some international students are known for taking a year off to study and then knocking out perfect scores. You do not need to take it that far because the nature of U.S. funding favors domestic students over international students, but you should study hard for the tests. - -Even if your scores are not perfect, you can raise your chances considerably by proving your research interests. This is where the open source philosophy really pays some dividends. Unlike peers who intern at a proprietary company and can say generally, but not specifically, what they worked on, if you work in open source, a professor can see and vet your contributions to a project directly. Ideal applicants have a history and a portfolio already built up in the areas of the research group or closely related areas. - -### Show and share your work - -To gain entrance to my research group, and those like it, we really want to see your work. This means you should make some sort of personal webpage and load it up with your successful projects. You should have undertaken some major project in the research area you want to join. For my group it might be publishing a paper in a peer-reviewed journal as an undergrad, developing a new [open scientific method][22], or making valuable contributions to a large FOSS project, such as [Debian][23]. The project may be applied; for example, it could be in an applied sustainability project, such as organized [Engineers Without Borders][24] chapters at your school, or open hardware, such as founding a [hackerspace][25]. - -However, not all of your accomplishments need to be huge or need to be academic undergraduate research. If you restored a car, I want to know about it. If you have designed a cool video game, I want to play it. If you made a mod on the RepRap that I 3D print with or were a major developer of FOSS our group uses, I can more or less guarantee you a position if I have one. - -If you are a good student you will be accepted into many graduate programs, but if funding is low you may not be offered a research assistantship immediately. Do not take rejection personally. You might be the perfect student for a whole range of research projects and a professor may really want you, but simply may not have the funding when you apply. Unfortunately, there have been a stream of pretty vicious [cutbacks to academia in the U.S.][26] in recent years, so research assistantships are not as numerous as they once were. You should apply to several programs and to many professors because you never know who is going to have funding that is matched up to your graduate school career. - -This brings us to the second path to getting a good job in an open source graduate lab, the indirect one. - -### Sneak in - -The first step for this approach is ensuring you meet the minimum requirements for the particular graduate school and apply. These requirements tend to be much lower than advertised by an open source lab director. Once you are accepted to a university you can be placed in the teaching assistant (TA) pool. This also is a way to pay for graduate school, although it lacks the benefit of being paid to work on your thesis, which you will have to do on your own time. While you are establishing yourself at the university by getting good grades and being a good TA, you can attempt to volunteer in the open source lab of your choosing. Most professors with capacity in their lab will take on such self-funded students. If there really is no money, often the professor will offer you some form of independent study credits for your work. These can be used to reduce your class load, giving you time to do research. Take these credits, work hard, and prove yourself. - -This gets your foot is in the door. Your chances at pulling a research assistantship will skyrocket at this point. In general professors are always applying for funding that is randomly being awarded. Often professors must fill a research position in a short amount of time when this happens. If you are good and physically there, your chances are much better for winning those funds. Even in the worst-case scenario, in which you are able to work in an open source lab, but funding does not come, again the nature of open source research will help you. Your projects will be more easily accessible by other professors (who may have funding) and all of your research (even if only paid hourly) will be disclosed to the public. This is a major benefit that is lost to all of those working on proprietary or secret military-related projects. If your work is good, access to your technical work can help you land a position at another group, a program, a school (for example, as a Master's student applying to a PhD program elsewhere), or a better higher-paying job. - -**Work hard and share your research aggressively following the open source model and it will pay off.** - -Good luck! - --------------------------------------------------------------------------------- - -译者简介: - -Joshua Pearce - Dr. Joshua Pearce is cross appointed as an Associate Professor in the Materials Science & Engineering and the Electrical & Computer Engineering at Michigan Tech. He currently runs the Michigan Tech in Open Sustainability Technology (MOST) group. He is the author of the Open Source Lab. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/17/1/grad-school-open-source-academic-lab - -作者:[Joshua Pearce][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/jmpearce -[1]:https://opensource.com/article/17/1/grad-school-open-source-academic-lab?rate=aJZB6TNyQIo2EOgqPxN8P9a5aoiYgLhtP9GujsPCJYk -[2]:http://www.wired.com/2014/07/openhatch/ -[3]:http://www.indeed.com/salary?q1=linux&q2=microsoft+windows -[4]:http://www.appropedia.org/MOST_application_process#Undergraduates -[5]:http://spectrum.ieee.org/at-work/tech-careers/where-the-jobs-are-2014 -[6]:https://www.asme.org/career-education/articles/early-career-engineers/engineering-salaries-on-the-rise -[7]:http://web.mit.edu/registrar/reg/costs/ -[8]:http://www.mtu.edu/alumni/favorites/snowfall/ -[9]:http://www.mtu.edu/gradschool/admissions/financial/cost/ -[10]:http://www.portalprogramas.com/en/how-to/best-american-universities-open-source-2014.html -[11]:http://www.rit.edu/news/story.php?id=50590 -[12]:http://www.mtu.edu/enterprise/teams/ -[13]:https://ocw.mit.edu/index.htm -[14]:http://www.networkworld.com/article/3062660/open-source-tools/6-colleges-turning-out-open-source-talent.html -[15]:https://en.wikipedia.org/wiki/Open_Source_Lab -[16]:http://www.appropedia.org/Open-source_Lab#Examples -[17]:http://openhardware.science/ -[18]:https://hbr.org/2016/08/what-if-all-u-s-coal-workers-were-retrained-to-work-in-solar -[19]:http://www.oshwa.org/ -[20]:http://reprap.org/ -[21]:http://www.appropedia.org/MOST -[22]:http://openwetware.org/wiki/Main_Page -[23]:https://www.debian.org/ -[24]:http://www.appropedia.org/Engineers_Without_Borders -[25]:http://www.appropedia.org/Hackerspace -[26]:http://www.cbpp.org/research/state-by-state-fact-sheets-higher-education-cuts-jeopardize-students-and-states-economic -[27]:https://opensource.com/user/26164/feed -[28]:https://opensource.com/article/17/1/grad-school-open-source-academic-lab#comments -[29]:https://opensource.com/users/jmpearce From 4e1f71483366080b1ad29e9735c1e768e452f70b Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:46:59 +0800 Subject: [PATCH 0150/1407] recycle --- ...ii is solving todays higher ed problems.md | 94 ------------------- 1 file changed, 94 deletions(-) delete mode 100644 sources/talk/20170203 How the University of Hawaii is solving todays higher ed problems.md diff --git a/sources/talk/20170203 How the University of Hawaii is solving todays higher ed problems.md b/sources/talk/20170203 How the University of Hawaii is solving todays higher ed problems.md deleted file mode 100644 index e94c16b21f..0000000000 --- a/sources/talk/20170203 How the University of Hawaii is solving todays higher ed problems.md +++ /dev/null @@ -1,94 +0,0 @@ -How the University of Hawaii is solving today's higher ed problems -============================================================ - - ![How the University of Hawaii is solving today's higher ed problems](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/BUS_brainstorm_island_520px.png?itok=KRXqz2-m "How the University of Hawaii is solving today's higher ed problems") ->Image by : opensource.com - -Openness invites greater participation and it takes advantage of the shared energy of collaborators. The strength of openly created educational resources comes paradoxically from the vulnerability of the shared experience of that creation process. - -One of the leaders in Open Educational Resources (OER) is [Billy Meinke][3], educational technologist at the University of Hawaii at Manoa. The University's open creation model uses [Pressbooks][4], which Billy tells me more about in this interview. - -**Don Watkins (DW): How did your work at Creative Commons lead you to the University of Hawaii?** - -**Billy Meinke (BM)**: Well, I've actually _returned_ to The University of Hawaii (UH) after being in the Bay Area for several years. I completed the ETEC educational technology Master's program here and then moved to San Francisco where I worked with [Creative Commons][5] (CC). Being with CC was a rewarding and eye-opening experience, and I'm hopeful that what I learned out there will lend itself to the OER work we are ramping up at the University. - -**DW: What came first: instructional design or OER? Are the two symbiotic?** - -**BM**: To me, OER is just a better flavor of learning content. Instructional designers make lots of decisions about the learning product they want to create, be it a textbook or a course or a piece of media. But will they put an open license on that OER when it's published? Will they use an open source tool to author the content? Will they release it in an open format? An instructional designer can produce effective learning content without doing any of those things, but it won't be as useful to the next person. OERs are different because they are designed for reuse, regardless of pedagogical strategy or learning approach. - -**DW: How long has the University of Hawaii been using OERs? What were the primary motivations?** - -**BM**: The OER effort at UH started in 2014, and this past November I took over management of OER activities at UH Manoa, the University system's flagship campus. - -The UH system has a healthy group of OER advocates throughout, primarily at the community colleges. They've transitioned hundreds of courses to become textbook zero (textbooks at no cost) and have made lots of headway building OER-based courses for two-year students. I've been really impressed with how well they've moved towards OER and how much money they've saved students over the last few semesters. We want to empower faculty to take control of what content they teach with, which we expect will result in their saving students money, at all of our campuses. - -**DW: What are Pressbooks? Why are Pressbooks important to the creation of OERs?** - -**BM**: Members of the faculty do have a choice in terms of what content they teach from, much of the time. Some write their own content, or maintain websites that house a course. Pressbooks is a WordPress-based publishing platform that makes it simpler to manage the content—like a book, with sections and chapters, a table of contents, author and publisher metadata, and the capability of to export the "book" into formats that can be easily read _and_ reused. - -Because most undergraduate courses still rely on a primary textbook, we're opening up a means for faculty to adopt an existing open textbook or to co-author a text with others. Pressbooks is the tool, and we're developing the processes for adapting OER as we go. - -**DW: How can a person get involved in development of Pressbooks?** - -**BM**: Pressbooks has a [GitHub repository][6] where they collaboratively build the supporting software, and I've lurked on it for the last year or so. It can take some getting used to, but the conversations that happen there reveal the direction of the software and give an idea of who is working on what. Pressbooks does offer the free hosting of a limited version of the software (it includes a watermark to encourage folks to upgrade) for those who want to tinker without too much commitment. Also, the software is openly licensed (GPLv2), so anyone can use the code without cost or permission. - -**DW: What other institutions use Pressbooks?** - -**BM**: Some of the more widely known examples are [SUNY's Open Textbook project][7] and the [BCcampus OpenEd project][8]. [Lumen Learning][9] also has its own version of Pressbooks, as does [Open Oregon State][10]. - -We're looking at what all of these folks are doing to see where we can take our use of Pressbooks, and we hope to help pave the way for others who are developing their own OERs. In some cases, Pressbooks is being used to support entire courses and has integrated activities and assessments, which can hook into the Learning Management System (LMS) an institution uses for course delivery. - -Because Pressbooks is powered by WordPress, it actually has quite a bit of flexibility in terms of what it can do, but we're setting up a humble roadmap for now. We'll be doing standalone open textbooks first. - -**DW: How can other colleges and universities replicate your success? What are some first steps?** - -**BM**: Forming a community that includes librarians, instructional designers, and faculty seems to be a healthy approach. The very first step will always be to get a handle on what is happening with OERs currently where you are, who is aware (or knowledgeable) about OERs, and then supporting them. My focus now is on curating the training resources around OERs that our team has developed, and helping the faculty gain the knowledge and skills it needs to begin adapting OERs. We'll be supporting a number of open textbook adoptions and creations this year, and it's my opinion that we should support folks with OERs, but then get out of the way when they're ready to take to the sky. - -**DW: How important is "release early, release often?"** - -**BM**: Even though the saying has been traditionally used to describe open practices for developing software, I think the creators of OER content should work toward embracing it, too. All too often, an open license is placed on a piece of OER as a finishing step, and none of the drafts or working documents are ever shared before the final content is released. Many folks don't consider that there might be much to gain by publishing early, especially when working independently on OER or as part of the small team. Taking a page from Mozilla's Matt Thompson, [working openly][11] makes way for greater participation, agility, momentum, iteration, and leveraging the collective energy of folks who have similar goals to your own. Because my role at UH is to connect and facilitate the adoption and creation of OER, releasing drafts of planning documents and OER as I go makes more sense. - -To take advantage of the collective experience and knowledge that my networks have, I must improve the quality of the work continuously. This may be the most unsettling part of working openly—others can see your flaws and mistakes alongside your successes and wins. But in truth, I don't think many folks go around looking for issues with the work of others. More often, their assessment begins with asking (after watching and lurking) how useful the work of others is to their own work, which isn't always the case. If it seems useful on the surface, they'll take a deeper look, but they'll otherwise move on to find the good work of others that can help them go further with their own project. - -Being able to borrow ideas from and in some cases directly use the planning docs of others can help new OER projects find legs. That's part of my strategy with the UH system as well: sharing what works so that we can carry our OER initiative forward, together. - -**DW: How is the Open Foundation's approach for ****[OERu][1] ****of select, design, develop, deliver, and revise similar to **[**David Wiley's 5Rs**][12]**?** - -**BM**: Well, OERu's development workflow for OER courses is designed to outline the process of creating and revising OER, while Wiley's 5Rs framework is an assessment tool for an OER. You would (as we have) use OERu's workflow to understand how you can contribute to their course development. Wiley's 5Rs is more of a set of questions to ask to understand how open an OER is. - -**DW: Why are these frameworks essential to the development cycle of OERs and do you have your own framework?** - -**BM**: While I don't believe that any framework or guide is a magic bullet or something that will guarantee success in developing OERs, I think that opening up the processes of content development can benefit teams and individuals who are taking on the challenge of adopting or creating OERs. At a minimum, a framework, or a set of them, can give a big-picture view of what it takes to produce OERs from start to finish. With tools like these, they may better understand where they are in their own process, and have an idea of what it will take to reach the end points they have set for their OER work. - --------------------------------------------------------------------------------- - -译者简介: - -Don Watkins - Educator, education technology specialist, entrepreneur, open source advocate. M.A. in Educational Psychology, MSED in Educational Leadership, Linux system administrator, CCNA, virtualization using Virtual Box. Follow me at @Don_Watkins . - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/17/2/interview-education-billy-meinke - -作者:[Don Watkins][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/don-watkins -[1]:https://oeru.org/ -[2]:https://opensource.com/article/17/2/interview-education-billy-meinke?rate=MTzLUGkz2UyQtAenC-MVjynw2M_qBr_X4B-vE-0KCVI -[3]:https://www.linkedin.com/in/billymeinke -[4]:https://pressbooks.com/ -[5]:https://creativecommons.org/ -[6]:https://github.com/pressbooks/pressbooks -[7]:http://textbooks.opensuny.org/ -[8]:https://open.bccampus.ca/ -[9]:http://lumenlearning.com/ -[10]:http://open.oregonstate.edu/textbooks/ -[11]:https://openmatt.org/2011/04/06/how-to-work-open/ -[12]:https://opencontent.org/blog/archives/3221 -[13]:https://opensource.com/user/15542/feed -[14]:https://opensource.com/article/17/2/interview-education-billy-meinke#comments -[15]:https://opensource.com/users/don-watkins From 2f9dfada13f51b26dba991d99aa5031e9b84c09f Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:47:03 +0800 Subject: [PATCH 0151/1407] recycle --- ...0170131 Be the open source supply chain.md | 111 ------------------ 1 file changed, 111 deletions(-) delete mode 100644 sources/talk/20170131 Be the open source supply chain.md diff --git a/sources/talk/20170131 Be the open source supply chain.md b/sources/talk/20170131 Be the open source supply chain.md deleted file mode 100644 index 84a31635d7..0000000000 --- a/sources/talk/20170131 Be the open source supply chain.md +++ /dev/null @@ -1,111 +0,0 @@ -Be the open source supply chain -============================================================ - -### Learn why you should be a supply chain influencer. - - ![Be the open source supply chain](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/OSDC_BUS_ArchitectureOfParticipation_520x292.png?itok=tzfeycyR "Be the open source supply chain") -Image by :  - -opensource.com - -I would bet that whoever is best at managing and influencing the open source supply chain will be best positioned to create the most innovative products. In this article, I’ll explain why you should be a supply chain influencer, and how your organization can be an active participant in your supply chain. - -In my previous article, [Open source and the software supply chain][2], I discussed the basics of supply chain management, and where open source fits in this model. I left readers with this illustration of the model: - - ![supply chain](https://opensource.com/sites/default/files/f1_520_0.png "supply chain") - -The question to ask your employer and team(s) is: How do we best take advantage of this? After all, if Apple can set the stage for its dominance by creating a better hardware supply chain, then surely one can do the same with software supply chains. - -### Evaluating supply chains - -Having worked with developers and product teams in many companies, I learned that the process for selecting components that go into a product is haphazard. Sometimes there is an official bake-off of one or two components against each other, but the developers often choose to work with a product based on "feel". When determining the best components, you must evaluate based on those projects’ longevity, stage of development, and enough other metrics to form the basis of a "build vs. buy" decision. Number of users, interested parties, commercial activity, involvement of development team in support, and so on are a few considerations in the decision-making process. - -Over time, technology and business needs change, and in the world of open source software, even more so. Not only must an engineering and product team be able to select the best component at that time, they must also be able to switch it out for something else when the time comes—for example, when the community managing the old component moves on, or when a new component with better features emerges. - -### What not to do - -When evaluating supply chain components, teams are prone to make a number of mistakes, including these common ones: - -* **Not Invented Here (NIH)**: I can’t tell you how many times engineering teams decided to "fix" shortcomings in existing supply chain components by deciding to write it themselves. I won’t say "never ever do that," but I will warn that if you take on the responsibility of writing an infrastructure component, understand that you’re chucking away all the advantages of the open source supply chain—namely upstream testing and upstream engineering—and deciding to take on those tasks, immediately saddling your team (and your product) with technical debt that will only grow over time. You’re making the choice to be less efficient, and you had better have a compelling reason for doing so. -* **Carrying patches forward**: Any open source-savvy team understands the value of contributing patches to their respective upstream projects. When doing so, contributed code goes through that project’s automated testing procedures, which, when combined with your own team’s existing testing infrastructure, makes for a more hardened end product. Unfortunately, not all teams are open source-savvy. Sometimes these teams are faced with onerous legal requirements that deter them from seeking permission to contribute fixes upstream. In that case, encourage (i.e., nag) your manager to get blanket legal approval for such things, because the alternative is carrying all those changes forward, incurring significant technical debt, and applying patches until the day your project (or you) dies. -* **Think you’re only a user**: Using open source components as part of your software supply chain is only the first step. To reap the rewards of open source supply chains, you must dive in and be an influencer. (More on that shortly.) - -### Effective supply chain management example: Red Hat - -Because of its upstream-first policies, [Red Hat][3] is an example of how both to utilize and influence software supply chains. To understand the Red Hat model, you must view their products through a supply chain perspective. - -Products supported by Red Hat are composed of open source components often vetted by multiple upstream communities, and changes made to these components are pushed to their respective upstream projects, often before they land in a supported product from Red Hat. The work flow look somewhat like: - - ![workflow diagram](https://opensource.com/sites/default/files/f2_520_0.png "workflow diagram") - -There are multiple reasons for this kind of workflow: - -* Testing, testing, testing: By offloading some initial testing, a company like Red Hat benefits from both the upstream community’s testing, as well as the testing done by other ecosystem participants, including competitors. -* Upstream viability: The Red Hat model only works as long as upstream suppliers are viable and self-sustaining. Thus, it’s in Red Hat’s interest to make sure those communities stay healthy. -* Engineering efficiency: Because Red Hat offloads common tasks to upstream communities, their engineers spend more time adding value to products for customers. - -To understand the Red Hat approach to supply chain, let’s look at their approach to product development with OpenStack. - -Curiously, Red Hat’s start with OpenStack was not to create a product or even to announce one; rather, they started pushing engineering resources into strategic projects in OpenStack (starting with Nova, Keystone, and Cinder). This list grew to include several other projects in the OpenStack community. A more traditional product management executive might look at this approach and think, "Why on earth would we contribute so much engineering to something that isn’t established and has no product? Why are we giving our competitors our work for free?" - -Instead, here is the open source supply chain thought process: - -### Step 1 - -Look at growth areas in the business or largest product gaps that need filling. Is there an open source community that fits a strategic gap? Or can we build a new project from scratch to do the same? In this case, Red Hat looked at the OpenStack community and eventually determined that it would fill a gap in the product portfolio. - -### Step 2 - -Gradually turn up the dial on engineering resources. This does a couple of things. First, it helps the engineering team get a sense of the respective projects’ prospects for success. If prospects aren’t not good, the company can stop contributing, with minimal investment spent. Once the project is determined to be worth in the investment, to the company can ensure its engineers will influence current and future development. This helps the project with quality code development, and ensures that the code meets future product requirements and acceptance criteria. Red Hat spent a lot of time slinging code in OpenStack repositories before ever announcing an OpenStack product, much less releasing one. But this was a fraction of the investment that would have been made if the company had developed an IaaS product from scratch. - -### Step 3 - -Once the engineering investments begin, start a product management roadmap and marketing release plan. Once the code reaches a minimum level of quality, fork the upstream repository and start working on product-specific code. Bug fixes are pushed upstream to openstack.org and into product branches. (Remember: Red Hat’s model depends on upstream viability, so it makes no sense not to push fixes upstream.) - -Lather, rinse, repeat. This is how you manage an open source software supply chain. - -### Don't accumulate technical debt - -If needed, Red Hat could decide that it would simply depend on upstream code, supply necessary proprietary product glue, and then release that as a product. This is, in fact, what most companies do with upstream open source code; however, this misses a crucial point I made previously. To develop a really great product, being heavily involved in the development process helps. How can an organization make sure that the code base meets its core product criteria if they’re not involved in the day-to-day architecture discussions? - -To make matters worse, in an effort to protect backwards compatibility and interoperability, many companies fork the upstream code, make changes and don't contribute them upstream, choosing instead to carry them forward internally. That is a big no-no, saddling your engineering team forever with accumulated technical debt that will only grow over time. In that scenario, all the gains made from upstream testing, development and release go away in a whiff of stupidity. - -### Red Hat and OpenShift - -Once you begin to understand Red Hat’s approach to supply chain, which you can see manifested in its approach to OpenStack, you can understand its approach to OpenShift. Red Hat first released OpenShift as a proprietary product that was also open sourced. Everything was homegrown, built by a team that joined Red Hat as part of the [Makara acquisition][4] in 2010. - -The technology initially suffered from NIH—using its own homegrown clustering and container management technologies, in spite of the recent (at the time) release of new projects: Kubernetes, Mesos, and Docker. What Red Hat did next is a testament to the company’s commitment to its open source supply chain model: Between OpenShift versions 2 and 3, developers rewrote it to utilize and take advantage of new developments from the Kubernetes and Docker communities, ditching their NIH approach. By restructuring the project in that way, the company took advantage of economies of scale that resulted from the burgeoning developer communities for both projects. I - -Instead of Red Hat fashioning a complete QC/QA testing environment for the entire OpenShift stack, they could rely on testing infrastructure supplied by the Docker and Kubernetes communities. Thus, Red Hat contributions to both the Docker and Kubernetes code bases would undergo a few rounds of testing before ever reaching the company’s own product branches: - -1. The first round of testing is by the Docker and Kubernetes communities . -2. Further testing is done by ecosystem participants building products on either or both projects. -3. More testing happens on downstream code distributions or products that "embed" both projects. -4. Final testing happens in Red Hat’s own product branch. - -The amount of upstream (from Red Hat) testing done on the code ensures a level of quality that would be much more expensive for the company to do comprehensively and from scratch. This is the trick to open source supply chain management: Don’t just consume upstream code, minimally shimming it into a product. That approach won’t give you any of the advantages offered by open source development practices and direct participation for solving your customers’ problems. - -To get the most benefit from the open source software supply chain, you must **be** the open source software supply chain. - --------------------------------------------------------------------------------- - -作者简介: - -John Mark Walker - John Mark Walker is Director of Product Management at Dell EMC and is responsible for managing the ViPR Controller product as well as the CoprHD open source community. He has led many open source community efforts, including ManageIQ, - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/17/1/be-open-source-supply-chain - -作者:[John Mark Walker][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/johnmark -[1]:https://opensource.com/article/17/1/be-open-source-supply-chain?rate=sz6X6GSpIX1EeYBj4B8PokPU1Wy-ievIcBeHAv0Rv2I -[2]:https://opensource.com/article/16/12/open-source-software-supply-chain -[3]:https://www.redhat.com/en -[4]:https://www.redhat.com/en/about/press-releases/makara -[5]:https://opensource.com/user/11815/feed From d3991ca4d214efb8d982f5e7f62d435dd4eb3f5f Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:47:41 +0800 Subject: [PATCH 0152/1407] recycle --- ...r visual effects in Linux with Kdenlive.md | 155 ------------------ 1 file changed, 155 deletions(-) delete mode 100644 sources/talk/yearbook2015/20151208 10 tools for visual effects in Linux with Kdenlive.md diff --git a/sources/talk/yearbook2015/20151208 10 tools for visual effects in Linux with Kdenlive.md b/sources/talk/yearbook2015/20151208 10 tools for visual effects in Linux with Kdenlive.md deleted file mode 100644 index d82b8cbe4e..0000000000 --- a/sources/talk/yearbook2015/20151208 10 tools for visual effects in Linux with Kdenlive.md +++ /dev/null @@ -1,155 +0,0 @@ -10 tools for visual effects in Linux with Kdenlive -================================================================================ -![](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life-uploads/kdenlivetoolssummary.png) -Image credits : Seth Kenlon. [CC BY-SA 4.0.][1] - -[Kdenlive][2] is one of those applications; you can use it daily for a year and wake up one morning only to realize that you still have only grazed the surface of all of its potential. That's why it's nice every once in a while to sit back and look over some of the lesser-used tricks and tools in Kdenlive. Even though something's not used as often as, say, the Spacer or Razor tools, it still may end up being just the right finishing touch on your latest masterpiece. - -Most of the tools I'll discuss here are not officially part of Kdenlive; they are plugins from the [Frei0r][3] package. These are ubiquitous parts of video processing on Linux and Unix, and they usually get installed along with Kdenlive as distributed by most Linux distributions, so they often seem like part of the application. If your install of Kdenlive does not feature some of the tools mentioned here, make sure that you have Frei0r plugins installed. - -Since many of the tools in this article affect the look of an image, here is the base image, without effects or adjustment: - -![](https://opensource.com/sites/default/files/images/life-uploads/before_0.png) - -Still image grabbed from a video by Footage Firm, Inc. [CC BY-SA 4.0.][1] - -Let's get started. - -### 1. Color effect ### - -![](https://opensource.com/sites/default/files/images/life-uploads/coloreffect.png) - -You can find the **Color Effect** filter in **Add Effect > Misc** context menu. As filters go, it's mostly just a preset; the only controls it has are which filter you want to use. - -![](https://opensource.com/sites/default/files/images/life-uploads/coloreffect_ctl_0.png) - -Normally that's the kind of filter I avoid, but I have to be honest: Sometimes a plug-and-play solution is exactly what you want. This filter has a few different settings, but the two that make it worth while (at least for me) are the Sepia and XPro effects. Admittedly, controls to adjust how sepia tone the sepia effect is would be nice, but no matter what, when you need a quick and familiar color effect, this is the filter to throw onto a clip. It's immediate, it's easy, and if your client asks for that look, this does the trick every time. - -### 2. Colorize ### - -![](https://opensource.com/sites/default/files/images/life-uploads/colorize.png) - -The simplicity of the **Colorize** filter in **Add Effect > Misc** is also its strength. In some editing applications, it takes two filters and some compositing to achieve this simple color-wash effect. It's refreshing that in Kdenlive, it's a matter of one filter with three possible controls (only one of which, strictly speaking, is necessary to achieve the look). - -![](https://opensource.com/sites/default/files/images/life-uploads/colorize_ctl.png) - -Its use is intuitive; use the **Hue** slider to set the color. Use the other controls to adjust the luma of the base image as needed. - -This is not a filter I use every day, but for ad spots, bumpers, dreamy sequences, or titles, it's the easiest and quickest path to a commonly needed look. Get a company's color, use it as the colorize effect, slap a logo over the top of the screen, and you've just created a winning corporate intro. - -### 3. Dynamic Text ### - -![](https://opensource.com/sites/default/files/images/life-uploads/dyntext.png) - -For the assistant editor, the Add Effect > Misc > Dynamic **Text** effect is worth the price of Kdenlive. With one mostly pre-set filter, you can add a running timecode burn-in to your project, which is an absolute must-have safety feature when round-tripping your footage through effects and sound. - -The controls look more complex than they actually are. - -![](https://opensource.com/sites/default/files/images/life-uploads/dyntext_ctl.png) - -The font settings are self-explanatory. Placement of the text is controlled by the Horizontal and Vertical Alignment settings; steer clear of the **Size** setting (it controls the size of the "canvas" upon which you are compositing the burn-in, not the size of the burn-in itself). - -The text itself doesn't have to be timecode. From the dropdown menu, you can choose from a list of useful text, including frame count (useful for VFX, since animators work in frames), source frame rate, source dimensions, and more. - -You are not limited to just one choice. The text field in the control panel will take whatever arbitrary text you put into it, so if you want to burn in more information than just timecode and frame rate (such as **Sc 3 - #timecode# - #meta.media.0.stream.frame_rate#**), then have at it. - -### 4. Luminance ### - -![](https://opensource.com/sites/default/files/images/life-uploads/luminance.png) - -The **Add Effect > Misc > Luminance** filter is a no-options filter. Luminance does one thing and it does it well: It drops the chroma values of all pixels in an image so that they are displayed by their luma values. In simpler terms, it's a grayscale filter. - -The nice thing about this filter is that it's quick, easy, efficient, and effective. This filter combines particularly well with other related filters (meaning that yes, I'm cheating and including three filters for one). - -![](https://opensource.com/sites/default/files/images/life-uploads/luminance_ctl.png) - -Combining, in this order, the **RGB Noise** for emulated grain, **Luminance** for grayscale, and **LumaLiftGainGamma** for levels can render a textured image that suggests the classic look and feel of [Kodax Tri-X][4] film. - -### 5. Mask0mate ### - -![](https://opensource.com/sites/default/files/images/life-uploads/mask0mate.png) -Image by Footage Firm, Inc. - -Better known as a four-point garbage mask, the **Add Effect > Alpha Manipulation > Mask0mate** tool is a quick, no-frills way to ditch parts of your frame that you don't need. There isn't much to say about it; it is what it is. - -![](https://opensource.com/sites/default/files/images/life-uploads/mask0mate_ctl.png) - -The confusing thing about the effect is that it does not imply compositing. You can pull in the edges all you want, but you won't see it unless you add the **Composite** transition to reveal what's underneath the clip (even if that's nothing). Also, use the **Invert** function for the filter to act like you think it should act (without it, the controls will probably feel backward to you). - -### 6. Pr0file ### - -![](https://opensource.com/sites/default/files/images/life-uploads/pr0file.png) - -The **Add Effect > Misc > Pr0file** filter is an analytical tool, not something you would actually leave on a clip for final export (unless, of course, you do). Pr0file consists of two components: the Marker, which dictates what area of the image is being analyzed, and the Graph, which displays information about the marked region. - -Set the marker using the **X, Y, Tilt**, and **Length** controls. The graphical readout of all the relevant color channel information is displayed as a graph, superimposed over your image. - -![](https://opensource.com/sites/default/files/images/life-uploads/pr0file_ctl.jpg) - -The readout displays a profile of the colors within the region marked. The result is a sort of hyper-specific vectorscope (or oscilloscope, as the case may be) that can help you zero in on problem areas during color correction, or compare regions while color matching. - -In other editors, the way to get the same information was simply to temporarily scale your image up to the region you want to analyze, look at your readout, and then hit undo to scale back. Both ways work, but the Pr0file filter does feel a little more elegant. - -### 7. Vectorscope ### - -![](https://opensource.com/sites/default/files/images/life-uploads/vectorscope.jpg) - -Kdenlive features an inbuilt vectorscope, available from the **View** menu in the main menu bar. A vectorscope is not a filter, it's just another view the footage in your Project Monitor, specifically a view of the color saturation in the current frame. If you are color correcting an image and you're not sure what colors you need to boost or counteract, looking at the vectorscope can be a huge help. - -There are several different views available. You can render the vectorscope in traditional green monochrome (like the hardware vectorscopes you'd find in a broadcast control room), or a chromatic view (my personal preference), or subtracted from a color-wheel background, and more. - -The vectorscope reads the entire frame, so unlike the Pr0file filter, you are not just getting a reading of one area in the frame. The result is a consolidated view of what colors are most prominent within a frame. Technically, the same sort of information can be intuited by several trial-and-error passes with color correction, or you can just leave your vectorscope open and watch the colors float along the color wheel and make adjustments accordingly. - -Aside from how you want the vectorscope to look, there are no controls for this tool. It is a readout only. - -### 8. Vertigo ### - -![](https://opensource.com/sites/default/files/images/life-uploads/vertigo.jpg) - -There's no way around it; **Add Effect > Misc > Vertigo** is a gimmicky special effect filter. So unless you're remaking [Fear and Loathing][5] or the movie adaptation of [Dead Island][6], you probably aren't going to use it that much; however, it's one of those high-quality filters that does the exact trick you want when you happen to be looking for it. - -The controls are simple. You can adjust how distorted the image becomes and the rate at which it distorts. The overall effect is probably more drunk or vision-quest than vertigo, but it's good. - -![](https://opensource.com/sites/default/files/images/life-uploads/vertigo_ctl.png) - -### 9. Vignette ### - -![](https://opensource.com/sites/default/files/images/life-uploads/vignette.jpg) - -Another beautiful effect, the **Add Effect > Misc > Vignette** darkens the outer edges of the frame to provide a sort of portrait, soft-focus nouveau look. Combined with the Color Effect or the Luminance faux Tri-X trick, this can be a powerful and emotional look. - -The softness of the border and the aspect ratio of the iris can be adjusted. The **Clear Center Size** attribute controls the size of the clear area, which has the effect of adjusting the intensity of the vignette effect. - -![](https://opensource.com/sites/default/files/images/life-uploads/vignette_ctl.png) - -### 10. Volume ### - -![](https://opensource.com/sites/default/files/images/life-uploads/vol.jpg) - -I don't believe in mixing sound within the video editing application, but I do acknowledge that sometimes it's just necessary for a quick fix or, sometimes, even for a tight production schedule. And that's when the **Audio correction > Volume (Keyframable)** effect comes in handy. - -The control panel is clunky, and no one really wants to adjust volume that way, so the effect is best when used directly in the timeline. To create a volume change, double-click the volume line over the audio clip, and then click and drag to adjust. It's that simple. - -Should you use it? Not really. Sound mixing should be done in a sound mixing application. Will you use it? Absolutely. At some point, you'll get audio that is too loud to play as you edit, or you'll be up against a deadline without a sound engineer in sight. Use it judiciously, watch your levels, and get the show finished. - -### Everything else ### - -This has been 10 (OK, 13 or 14) effects and tools that Kdenlive has quietly lying around to help your edits become great. Obviously there's a lot more to Kdenlive than just these little tricks. Some are obvious, some are cliché, some are obtuse, but they're all in your toolkit. Get to know them, explore your options, and you might be surprised what a few cheap tricks will get you. - --------------------------------------------------------------------------------- - -via: https://opensource.com/life/15/12/10-kdenlive-tools - -作者:[Seth Kenlon][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/seth -[1]:https://creativecommons.org/licenses/by-sa/4.0/ -[2]:https://kdenlive.org/ -[3]:http://frei0r.dyne.org/ -[4]:http://www.kodak.com/global/en/professional/products/films/bw/triX2.jhtml -[5]:https://en.wikipedia.org/wiki/Fear_and_Loathing_in_Las_Vegas_(film) -[6]:https://en.wikipedia.org/wiki/Dead_Island From a30e88b9d5ebdce2a59ab1a786811ee03f8ee27c Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:49:00 +0800 Subject: [PATCH 0153/1407] =?UTF-8?q?20170521-11=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit move --- .../20170303 A Programmes Introduction to Unicode.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sources/{talk => tech}/20170303 A Programmes Introduction to Unicode.md (100%) diff --git a/sources/talk/20170303 A Programmes Introduction to Unicode.md b/sources/tech/20170303 A Programmes Introduction to Unicode.md similarity index 100% rename from sources/talk/20170303 A Programmes Introduction to Unicode.md rename to sources/tech/20170303 A Programmes Introduction to Unicode.md From a97f3426c17f2be40bf41616277b3696325cce00 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:49:02 +0800 Subject: [PATCH 0154/1407] recycle --- .../talk/20170131 Developing open leaders.md | 74 ------------------- 1 file changed, 74 deletions(-) delete mode 100644 sources/talk/20170131 Developing open leaders.md diff --git a/sources/talk/20170131 Developing open leaders.md b/sources/talk/20170131 Developing open leaders.md deleted file mode 100644 index 356e55b6eb..0000000000 --- a/sources/talk/20170131 Developing open leaders.md +++ /dev/null @@ -1,74 +0,0 @@ -Developing open leaders -============================================================ - -> "Off-the-shelf" leadership training can't sufficiently groom tomorrow's organizational leaders. Here's how we're doing it. - - ![Developing open leaders](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/BUSINESS_community2.png?itok=ILQK65F1 "Developing open leaders") -Image by : opensource.com - -At Red Hat, we have a saying: Not everyone needs to be a people manager, but everyone is expected to be a leader. - -For many people, that requires a profound mindset shift in how to think about leaders. Yet in some ways, it's what we all intuitively know about how organizations really work. As Red Hat CEO Jim Whitehurst has pointed out, in any organization, you have the thermometers—people who reflect the organizational "temperature" and sentiment and direction—and then you have the thermostats—people who _set_ those things for the organization. - -Leadership is about maximizing influence and impact. But how do you develop leadership for an open organization? - -In the first installment of this series, I will share the journey, from my perspective, on how we began to build a leadership development system at Red Hat to enable our growth while sustaining the best parts of our unique culture. - -### Nothing 'off the shelf' - -In an open organization, you can't just buy leadership development training "off the shelf" and expect it to resonate with people—or to reflect and reinforce your unique culture. But you also probably won't have the capacity and resources to build a great leadership development system entirely from scratch. - -Early on in our journey at Red Hat, our leadership development efforts focused on understanding our own philosophy and approach, then taking a bit of an open source approach: sifting through the what people had created for conventional organizations, then configuring those ideas in a way that made them feasible for an open organization. - -Looking back, I can also see we spent a lot of energy looking for ways to plug specific capability gaps. - -Many of our people managers were engineers and other subject matter experts who stepped into management roles because that's what our organization needed. Yet the reality was, many had little experience leading a team or group. So we had some big gaps in basic management skills. - -We also had gaps—not just among managers but also among individual contributors—when it came to navigating tough conversations with respect. In a company where passion runs high and people love to engage in open and heated debate, making your voice heard without shouting others down wasn't always easy. - -We couldn't find any end-to-end leadership development systems that would help train people for leading in a culture that favors flatness and meritocracy over hierarchy and seniority. And while we could build some of those things ourselves, we couldn't build everything fast enough to meet our growing organization's needs. - -So when we saw a need for improved goal setting, we introduced some of the best offerings available—like Closing the Execution Gap and the concept of SMART goals (i.e. specific, measurable, attainable, relevant, and time-bound). To make these work for Red Hat, we configured them to pull through themes from our own culture that could be used in tandem to make the concepts resonate and become even more powerful. - -### Considering meritocracy - -In a culture that values meritocracy, being able to influence others is critical. Yet the passionate open communication and debate that we love at Red Hat sometimes created hard feelings between individuals or teams. We introduced [Crucial Conversations][2] to help everyone navigate those heated and impassioned topics, and also to help them recognize that those kinds of conversations provide the greatest opportunity for influence. - -After building that foundation with Crucial Conversations, we introduced [Influencer Training][3] to help entire teams and organizations communicate and gain traction for their ideas across boundaries. - -We also found a lot of value in Marcus Buckingham's strengths-based approach to leadership development, rather than the conventional models that encouraged people to spend their energy shoring up weaknesses. - -Early on, we made a decision to make our leadership offerings available to individual contributors as well as managers, because we saw that these skills were important for everyone in an open organization. - -Looking back, I can see that this gave us the added benefit of developing a shared understanding and language for talking about leadership throughout our organization. It helped us build and sustain a culture where leadership is expected at all levels and in any role. - -At the same time, training was only part of the solution. We also began developing processes that would help entire departments develop important organizational capabilities, such as talent assessment and succession planning. - -Piece by piece, our open leadership system was beginning to take shape. The story of how it came together is pretty remarkable—at least to me!—and over the next few months, I'll share the journey with you. I look forward to hearing about the journeys of other open organizations, too. - -_(An earlier version of this article appeared in _[The Open Organization Leaders Manual][4]_, now available as a free download from Opensource.com.)_ - --------------------------------------------------------------------------------- - -作者简介: - -DeLisa Alexander - DeLisa Alexander | DeLisa is Executive Vice President and Chief People Officer at Red Hat. Under her leadership, this team focuses on acquiring, developing, and retaining talent and enhancing the Red Hat culture and brand. In her nearly 15 years with the company, DeLisa has also worked in the Office of General Counsel, where she wrote Red Hat's first subscription agreement and closed the first deals with its OEMs. - --------------------------------------------------------------------------------- - -via: https://opensource.com/open-organization/17/1/developing-open-leaders - -作者:[DeLisa Alexander][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/delisa -[1]:https://opensource.com/open-organization/17/1/developing-open-leaders?rate=VU560k86SWs0OAchgX-ge2Avg041EOeU8BrlKgxEwqQ -[2]:https://www.vitalsmarts.com/products-solutions/crucial-conversations/ -[3]:https://www.vitalsmarts.com/products-solutions/influencer/ -[4]:https://opensource.com/open-organization/resources/leaders-manual -[5]:https://opensource.com/user/10594/feed -[6]:https://opensource.com/open-organization/17/1/developing-open-leaders#comments -[7]:https://opensource.com/users/delisa From 98484773d4e0181fc8d0866b4ff3f1de87ecbf6b Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:49:05 +0800 Subject: [PATCH 0155/1407] recycle --- ...n choosing community metrics to measure.md | 93 ------------------- 1 file changed, 93 deletions(-) delete mode 100644 sources/talk/20170203 4 questions to answer when choosing community metrics to measure.md diff --git a/sources/talk/20170203 4 questions to answer when choosing community metrics to measure.md b/sources/talk/20170203 4 questions to answer when choosing community metrics to measure.md deleted file mode 100644 index 4d17a44738..0000000000 --- a/sources/talk/20170203 4 questions to answer when choosing community metrics to measure.md +++ /dev/null @@ -1,93 +0,0 @@ -4 questions to answer when choosing community metrics to measure -============================================================ - -> When evaluating a specific metric that you are considering including in your metrics plan, you should answer four questions. - - - ![4 questions to answer when choosing community metrics to measure](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/metrics_lead-steps-measure.png?itok=dj9mvlQw "4 questions to answer when choosing community metrics to measure") -Image by :  - -[Internet Archive Book Images][4]. Modified by Opensource.com. [CC BY-SA 4.0][5] - -Thus far in the [Community Metrics Playbook][6] column, I've discussed the importance of [setting goals][7] to guide the metrics process, outlined the general [types of metrics][8] that are useful for studying your community, and reviewed technical details of [available tools][9]. As you are deciding which metrics to track for your community, having a deeper understanding of each area is important so you not only choose good metrics, but also understand and plan for what to do when the numbers don't line up with expectations. - -When evaluating a specific metric that you are thinking about including in your metrics plan, you should answer four questions: - -* Does it help achieve my goals? -* How accurate is it? -* What is its relationship to other metrics? -* What will I do if the metrics goes "bad"? - -### Goal-appropriate - -This one should be obvious by now from my [previous discussion on goals][10]: Why do you need to know this metric? Does this metric have a relationship to your project's goals? If not, then you should consider ignoring it—or at least placing much less emphasis on it. Metrics that do not help measure your progress toward goals waste time and resources that could be better spent developing better metrics. - -One thing to consider are intermediate metrics. These are metrics that may not have an obvious, direct relationship to your goals. They can be dangerous when considered alone and can lead to undesirable behavior simply to "meet the number," but when combined with and interpreted in the context of other intermediates, can help projects improve. - -### Accuracy - -Accuracy is defined as the quality or state of being correct or precise. Gauging accuracy for metrics that have built-in subjectivity and bias, such as survey questions, is difficult, so for this discussion I'll talk about objective metrics obtained by computers, which are for the most part highly precise and accurate. [Data can't lie][11], so why are we even discussing accuracy of computed metrics? The potential for inaccurate metrics stems from their human interpretation. The classic example here is _number of downloads_. This metric can be measured easily—often as part of a download site's built-in metrics—but will not be accurate if your software is split into multiple packages, or known systemic processes produce artificially inflated (or deflated) numbers, such as automated testing systems that execute repeated downloads. - -As long as you recognize and avoid fixating on absolute correctness, having slightly inaccurate metrics is usually better than no metrics at all. Web analytics are [notorious][12] for being inaccurate gauges of reality due to the underlying technical nature of web servers, browsers, proxies, caching, dynamic addressing, cookies, and other aspects of computing that can muddy the waters of visitor engagement metrics; however, multiple slightly inaccurate web metrics over time can be an accurate indicator that the website refresh you did reduced your repeat visits by 30%. So don't be afraid of the fact that you'll probably never achieve 100% accuracy. - -### Understanding relationships - - ![fresh lemons graph](https://opensource.com/sites/default/files/f1-falkner-02-2017_520.png "fresh lemons graph") - -_Data from: [NHTSA, DOT HS 810 780][1]. [U.S. Department of Agriculture (pdf)][2]_ - -The universe of metrics is full of examples stemming from the statistical phrase "[correlation does not imply causation][13]." When choosing metrics, carefully consider whether the chosen metric might have relationships to other metrics, directly or indirectly. Related metrics often can help diagnose success and failure, and indicate needed changes to your project to drive the improvement you're looking for. - -Truly proving that one metric's behavior causes predictable changes in another requires quite a bit of experimentation and statistical analysis, but you don't have to take it that far. If you suspect a relationship, take note and observe their behavior over time, and if evidence suggests a relationship, then you can do experimentation in your own project to test the hypothesis. - -For example, a typical goal of open source projects is to drive innovation by attracting new developers who bring their diverse experience and backgrounds to the project. A given project notices that when the "average time from contribution to code commit" decreases, the number of new contributors coming to the project increases. If evidence over time maintains this correlation, the project might decide to dedicate more resources to handling contributions. This can have an effect elsewhere—such as an increase in bugs due to lots of new code coming in—so try not to over-rotate while using your new-found knowledge. - -### Planning for failure - -After gauging the accuracy and applicability of a metric, you need to think about and plan for what you will do when things don't go as planned (which will happen). Consider this scenario: You've chosen several quality-related metrics for your project, and there is general agreement that they are accurate and important to the project. The QA team is working hard, yet your chosen metrics continue to suffer. What do you do? You have several choices: - -* Do nothing. -* Make the QA team come in on the weekend to write more tests. -* Work with developers to find the root cause of all the bugs. -* Choose different metrics. - -Which is the correct choice? The answer shouldn't surprise you: _It depends_. You may not need to do anything if the trend is expected, for example if resource constraints are forcing you to trade quality for some other metric. QA might actually need to write more tests if you have known poor coverage. Or you may need to do root cause analysis for a systemic issue in development. The last one is particularly important to include in any plan; your metrics may have become outdated and no longer align with your project's goals, and should be regularly evaluated and eliminated or replaced as needed. - -Rarely will there be a single correct choice—it's more important to outline, for each metric, the potential causes for failure and which questions you need to ask and what you will do in various contexts. It doesn't have to be a lengthy checklist of actions for each possible cause, but you should at least list a handful of potential causes and how to proceed to investigate failure. - -By answering these four questions about your metrics, you will gain a greater understanding of their purpose and efficacy. More importantly, sharing the answers with the rest of the project will give your community members a greater feeling of autonomy and purpose, which can be a much better motivator than simply asking them to meet a set of seemingly arbitrary numbers. - --------------------------------------------------------------------------------- - -译者简介: - -James Falkner - Technology evangelist, teacher, learner, author, dedicated to open source and open computing. I work at Red Hat as a technical evangelist for Red Hat's portfolio of open source products and love what we do and learning from others, and occasionally teaching at conferences. - -Prior to Red Hat I spent 5 years at Liferay growing a large open source community, onboarding new contributors, meeting and engaging with beginners and experts, and championing open source as the de facto choice for businesses large and small. I am based in the Orlando, Florida, USA area. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/17/2/4-questions-answer-when-choosing-community-metrics-measure - -作者:[James Falkner][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/james-falkner -[1]:https://crashstats.nhtsa.dot.gov/Api/Public/ViewPublication/810780 -[2]:http://www.ers.usda.gov/media/320480/wrs0406f_1_.pdf -[3]:https://opensource.com/article/17/2/4-questions-answer-when-choosing-community-metrics-measure?rate=I8iVb2WNG2xAcYFvNaZfoEFTozgl_gQ-Pz8Ra1SveOE -[4]:https://www.flickr.com/photos/internetarchivebookimages/14753212581/in/photolist-otG57a-orWcFN-ovJbD4-orWgoN-otWQTN-otWmY9-otG3wg-otYjFc-otLxay-otWi5N-ovJ8pt-ocuoJr-otG4KZ-ovJ7ok-otWjdj-otY18v-otYqxn-orWptL-otWkzY-otWTnW-otYcHe-otWAx3-octWmY-otWNwd-otL2wq-otYco6-ovHSva-otFSq4-otFPP2-otWmAL-otYtwP-orWAj3-otLjQy-otWDRs-otWoPJ-otG7wR-otWBTQ-otG4b2-otWyD3-orWgCA-otWMzo-otYfHx-otY9oP-otGbrz-orWnwj-orW6gJ-ocuAd8-orW5U1-otWBcu-otFXgr/ -[5]:https://creativecommons.org/licenses/by-sa/4.0/ -[6]:https://opensource.com/tags/community-metrics-playbook -[7]:https://opensource.com/bus/16/8/measuring-community-health -[8]:https://opensource.com/business/16/9/choosing-right-metrics -[9]:https://opensource.com/article/16/11/tools-collecting-analyzing-community-metrics -[10]:https://opensource.com/bus/16/8/measuring-community-health -[11]:http://management.curiouscatblog.net/2007/08/09/data-cant-lie/ -[12]:https://brianclifton.com/pro-lounge-files/accuracy-whitepaper.pdf -[13]:https://en.wikipedia.org/wiki/Correlation_does_not_imply_causation -[14]:https://opensource.com/user/18065/feed -[15]:https://opensource.com/users/james-falkner From ca81bc7c616cc09eefb929d05b2a4686d96c96d5 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:49:08 +0800 Subject: [PATCH 0156/1407] recycle --- ...ur open source project need a president.md | 74 ------------------- 1 file changed, 74 deletions(-) delete mode 100644 sources/talk/20170308 Does your open source project need a president.md diff --git a/sources/talk/20170308 Does your open source project need a president.md b/sources/talk/20170308 Does your open source project need a president.md deleted file mode 100644 index 7b667acc13..0000000000 --- a/sources/talk/20170308 Does your open source project need a president.md +++ /dev/null @@ -1,74 +0,0 @@ -Does your open source project need a president? -============================================================ - - ![Does your open source project need a president?](https://opensource.com/sites/default/files/styles/image-full-size/public/images/government/osdc_transparent_whitehouse_520x292.jpg?itok=IAsYgvi- "Does your open source project need a president?") ->Image by : opensource.com - -Recently I was lucky enough to be invited to attend the [Linux Foundation Open Source Leadership Summit][4]. The event was stacked with many of the people I consider mentors, friends, and definitely leaders in the various open source and free software communities that I participate in. - -I was able to observe the [CNCF][5] Technical Oversight Committee meeting while there, and was impressed at the way they worked toward consensus where possible. It reminded me of the [OpenStack Technical Committee][6] in its make-up of well-spoken technical individuals who care about their users and stand up for the technical excellence of their foundations' activities. - -But it struck me (and several other attendees) that this consensus building has limitations. [Adam Jacob][7] noted that Linus Torvalds had given an interview on stage earlier in the day where he noted that most of his role was to listen closely for a time to differing opinions, but then stop them when it was clear there was no consensus, and select one that he felt was technically excellent, and move on. Linus, being the founder of Linux and the benevolent dictator of the project for its lifetime thus far, has earned this moral authority. - -However, unlike Linux, many of the modern foundation-fostered projects lack an executive branch. The structure we see for governance is centered around ensuring that corporate sponsors have influence. Foundation members pay dues to get various levels of board seats or corporate access to events and data. And this is a good thing, as it keeps people like me paid to work in these communities. - -However, I believe as technical contributors, we sometimes give this too much sway in the actual governance of the community and the projects. These foundation boards know that day to day decision making should be left to those working in the project, and as such allow committees like the [CNCF][8] TOC or the [OpenStack TC][9] full agency over the technical aspects of the member projects. - -I believe these committees operate as a legislative branch. They evaluate conditions and regulate the projects accordingly, allocating budgets for infrastructure and passing edicts to avoid chaos. Since they're not as large as political legislative bodies like the US House of Representatives and Senate, they can usually operate on a consensus basis, and not drive everything to a contentious vote. By and large, these are as nimble as a legislative body can be. - -However, I believe open source projects need an executive to be effective. At some point, we need a single person to listen to the facts, entertain theories, and then decide, and execute a plan. Some projects have natural single leaders like this. Most, however, do not. - -I believe we as engineers aren't generally good at being like Linus. If you've spent any time in the corporate world you've had an executive disagree with you and run you right over. When we get the chance to distribute power evenly, we do it. - -But I think that's a mistake. I think we should strive to have executives. Not just organizers like the [OpenStack PTL][10], but more like the [Debian Project Leader][11]. Empowered people with the responsibility to serve as a visionary and keep the project's decision making relevant and of high quality. This would also give the board somebody to interact with directly so that they do not have to try and convince the whole community to move in a particular direction to wield influence. In this way, I believe we'd end up with a system of checks and balances similar to the US Constitution. - -So here is my suggestion for how a project executive structure could work, assuming there is already a strong technical committee and a well-defined voting electorate that I call the "active technical contributors." - -1. The president is elected by [Condorcet][1] vote of the active technical contributors of a project for a term of 1 year. - -2. The president will have veto power over any proposed change to the project's technical assets. - -3. The technical committee may override the president's veto by a super majority vote. - -4. The president will inform the technical contributors of their plans for the project every 6 months. - -This system only works if the project contributors expect their project president to actively drive the vision of the project. Basically, the culture has to turn to this executive for final decision-making before it comes to a veto. The veto is for times when the community makes poor decisions. And this doesn't replace leaders of individual teams. Think of these like the governors of states in the US. They're running their sub-project inside the parameters set down by the technical committee and the president. - -And in the case of foundations or communities with boards, I believe ultimately a board would serve as the judicial branch, checking the legality of changes made against the by-laws of the group. If there's no board of sorts, a judiciary could be appointed and confirmed, similar to the US Supreme Court or the [Debian CTTE][12]. This would also just be necessary to ensure that the technical arm of a project doesn't get the foundation into legal trouble of any kind, which is already what foundation boards tend to do. - -I'd love to hear your thoughts on this on Twitter, please tweet me [@SpamapS][13] with the hashtag #OpenSourcePresident to get the discussion going. - - _This article was originally published on [FewBar.com][2] as "Free and open source leaders—You need a president" and was republished with permission._ - --------------------------------------------------------------------------------- - -作者简介: - -Clint Byrum - Clint Byrum is a Cloud Architect at IBM (Though his words here are his own, and not those of IBM). He is an active Open Source and Free Software contributor to Debian, Ubuntu, OpenStack, and various other projects spanning the past 20 years. - -------------------------- - -via: https://opensource.com/article/17/3/governance-needs-president - -作者:[ Clint Byrum][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/spamaps -[1]:https://en.wikipedia.org/wiki/Condorcet_method -[2]:http://fewbar.com/2017/02/open-source-governance-needs-presidents/ -[3]:https://opensource.com/article/17/3/governance-needs-president?rate=g5uFkFg_AqVo7JnKqPHoAxKccWzo1XXgn5wj5hILAIk -[4]:http://events.linuxfoundation.org/events/open-source-leadership-summit -[5]:https://www.cncf.io/ -[6]:https://www.openstack.org/foundation/tech-committee/ -[7]:https://twitter.com/adamhjk -[8]:https://www.cncf.io/ -[9]:https://www.openstack.org/foundation/tech-committee/ -[10]:https://docs.openstack.org/project-team-guide/ptl.html -[11]:https://www.debian.org/devel/leader -[12]:https://www.debian.org/devel/tech-ctte -[13]:https://twitter.com/spamaps -[14]:https://opensource.com/user/121156/feed -[15]:https://opensource.com/users/spamaps From 469f5328c9dca45afbb4b7cb0210ef0e4f47a1f1 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:50:56 +0800 Subject: [PATCH 0157/1407] recycle --- ...ovecot Pure-FTPD BIND and ISPConfig 3.1.md | 393 ------------------ 1 file changed, 393 deletions(-) delete mode 100644 sources/tech/20170222 The Perfect Server CentOS 7.3 with Apache Postfix Dovecot Pure-FTPD BIND and ISPConfig 3.1.md diff --git a/sources/tech/20170222 The Perfect Server CentOS 7.3 with Apache Postfix Dovecot Pure-FTPD BIND and ISPConfig 3.1.md b/sources/tech/20170222 The Perfect Server CentOS 7.3 with Apache Postfix Dovecot Pure-FTPD BIND and ISPConfig 3.1.md deleted file mode 100644 index daf5f0819a..0000000000 --- a/sources/tech/20170222 The Perfect Server CentOS 7.3 with Apache Postfix Dovecot Pure-FTPD BIND and ISPConfig 3.1.md +++ /dev/null @@ -1,393 +0,0 @@ -The Perfect Server CentOS 7.3 with Apache, Postfix, Dovecot, Pure-FTPD, BIND and ISPConfig 3.1 -============================================================ - -### This tutorial exists for these OS versions - -* **CentOS 7.3** -* [CentOS 7.2][3] -* [CentOS 7.1][4] -* [CentOS 7][5] - -### On this page - -1. [1 Requirements][6] -2. [2 Preliminary Note][7] -3. [3 Prepare the server][8] -4. [4 Enable Additional Repositories and Install Some Software][9] -5. [5 Quota][10] - 1. [Enabling quota on the / (root) partition][1] - 2. [Enabling quota on a separate /var partition][2] -6. [6 Install Apache, MySQL, phpMyAdmin][11] - -This tutorial shows the installation of ISPConfig 3.1 on a CentOS 7.3 (64Bit) server. ISPConfig is a web hosting control panel that allows you to configure the following services through a web browser: Apache web server, Postfix mail server, MySQL, BIND nameserver, PureFTPd, SpamAssassin, ClamAV, Mailman, and many more. - -### 1 Requirements - -To install such a system you will need the following: - -* A Centos 7.3 minimal server system. This can be a server installed from scratch as described in our [Centos 7.3 minimal server tutorial][12] or a virtual-server or root-server from a hosting company that has a minimal Centos 7.3 setup installed. -* A fast Internet connection. - -### 2 Preliminary Note - -In this tutorial, I use the hostname server1.example.com with the IP address 192.168.1.100 and the gateway 192.168.1.1. These settings might differ for you, so you have to replace them where appropriate. - -Please note that HHVM and XMPP are not supported in ISPConfig for the CentOS platform yet. If you like to manage an XMPP chat server from within ISPConfig or use HHVM (Hip Hop Virtual Machine) in an ISPConfig website, then please use Debian 8 or Ubuntu 16.04 as server OS instead of CentOS 7.3. - -### 3 Prepare the server - -**Set the keyboard layout** - -In case that the keyboard layout of the server does not match your keyboard, you can switch to the right keyboard (in my case "de" for a german keyboard layout, with the localectl command: - -`localectl set-keymap de` - -To get a list of all available keymaps, run: - -`localectl list-keymaps` - -I want to install ISPConfig at the end of this tutorial, ISPConfig ships with the Bastille firewall script that I will use as firewall, therefor I disable the default CentOS firewall now. Of course, you are free to leave the CentOS firewall on and configure it to your needs (but then you shouldn't use any other firewall later on as it will most probably interfere with the CentOS firewall). - -Run... - -``` -yum -y install net-tools -systemctl stop firewalld.service -systemctl disable firewalld.service -``` - -to stop and disable the CentOS firewall. It is ok when you get errors here, this just indicates that the firewall was not installed. - -Then you should check that the firewall has really been disabled. To do so, run the command: - -`iptables -L` - -The output should look like this: - -[root@server1 ~]# iptables -L -Chain INPUT (policy ACCEPT) -target prot opt source destination - -Chain FORWARD (policy ACCEPT) -target prot opt source destination - -Chain OUTPUT (policy ACCEPT) -target prot opt source destination - -Or use the firewall-cmd command: - -firewall-cmd --state - -[root@server1 ~]# firewall-cmd --state -not running -[root@server1 ~]# - -Now I will install the network configuration editor and the shell based editor "nano" that I will use in the next steps to edit the config files: - -yum -y install nano wget NetworkManager-tui - -If you did not configure your network card during the installation, you can do that now. Run... - -nmtui - -... and go to Edit a connection: - -[ - ![](https://www.howtoforge.com/images/perfect_server_centos_7_1_x86_64_apache2_dovecot_ispconfig3/nmtui1.png) -][13] - -Select your network interface: - -[ - ![](https://www.howtoforge.com/images/perfect_server_centos_7_1_x86_64_apache2_dovecot_ispconfig3/nmtui2.png) -][14] - -Then fill in your network details - disable DHCP and fill in a static IP address, a netmask, your gateway, and one or two nameservers, then hit Ok: - -[ - ![](https://www.howtoforge.com/images/perfect_server_centos_7_1_x86_64_apache2_dovecot_ispconfig3/nmtui3.png) -][15] - -Next select OK to confirm the changes that you made in the network settings - -[ - ![](https://www.howtoforge.com/images/perfect_server_centos_7_1_x86_64_apache2_dovecot_ispconfig3/nmtui4.png) -][16] - -and Quit to close the nmtui network configuration tool. - -[ - ![](https://www.howtoforge.com/images/perfect_server_centos_7_1_x86_64_apache2_dovecot_ispconfig3/nmtui5.png) -][17] - -You should run - -ifconfig - -now to check if the installer got your IP address right: - -``` -[root@server1 ~]# ifconfig -ens33: flags=4163 mtu 1500 - inet 192.168.1.100 netmask 255.255.255.0 broadcast 192.168.1.255 - inet6 fe80::20c:29ff:fecd:cc52 prefixlen 64 scopeid 0x20 - - ether 00:0c:29:cd:cc:52 txqueuelen 1000 (Ethernet) - RX packets 55621 bytes 79601094 (75.9 MiB) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 28115 bytes 2608239 (2.4 MiB) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 - -lo: flags=73 mtu 65536 - inet 127.0.0.1 netmask 255.0.0.0 - inet6 ::1 prefixlen 128 scopeid 0x10 - loop txqueuelen 0 (Local Loopback) - RX packets 0 bytes 0 (0.0 B) - RX errors 0 dropped 0 overruns 0 frame 0 - TX packets 0 bytes 0 (0.0 B) - TX errors 0 dropped 0 overruns 0 carrier 0 collisions 0 -``` - -If your network card does not show up there, then it not be enabled on boot, In this case, open the file /etc/sysconfig/network-scripts/ifcfg-eth0 - -nano /etc/sysconfig/network-scripts/ifcfg-ens33 - -and set ONBOOT to yes: - -[...] -ONBOOT=yes -[...] - -and reboot the server. - -Check your /etc/resolv.conf if it lists all nameservers that you've previously configured: - -cat /etc/resolv.conf - -If nameservers are missing, run - -nmtui - -and add the missing nameservers again. - -Now, on to the configuration... - -**Adjusting /etc/hosts and /etc/hostname** - -Next, we will edit /etc/hosts. Make it look like this: - -nano /etc/hosts - -``` -127.0.0.1 localhost localhost.localdomain localhost4 localhost4.localdomain4 -192.168.1.100 server1.example.com server1 - -::1 localhost localhost.localdomain localhost6 localhost6.localdomain6 -``` - -Set the hostname in the /etc/hostname file. The file shall contain the fully qualified domain name (e.g. server1.example.com in my case) and not just the short name like "server1". Open the file with the nano editor: - -nano /etc/hostname - -And set the hostname in the file. - -``` -server1.example.com -``` - -Save the file and exit nano. - -**Disable SELinux** - -SELinux is a security extension of CentOS that should provide extended security. In my opinion you don't need it to configure a secure system, and it usually causes more problems than advantages (think of it after you have done a week of trouble-shooting because some service wasn't working as expected, and then you find out that everything was ok, only SELinux was causing the problem). Therefore I disable it (this is a must if you want to install ISPConfig later on). - -Edit /etc/selinux/config and set SELINUX=disabled: - -nano /etc/selinux/config - -``` -# This file controls the state of SELinux on the system. -# SELINUX= can take one of these three values: -# enforcing - SELinux security policy is enforced. -# permissive - SELinux prints warnings instead of enforcing. -# disabled - No SELinux policy is loaded. -SELINUX=disabled -# SELINUXTYPE= can take one of these two values: -# targeted - Targeted processes are protected, -# mls - Multi Level Security protection. -SELINUXTYPE=targeted -``` - -Afterwards we must reboot the system: - -reboot - -### 4 Enable Additional Repositories and Install Some Software - -First, we import the GPG keys for software packages: - -rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY* - -Then we enable the EPEL repository on our CentOS system as lots of the packages that we are going to install in the course of this tutorial are not available in the official CentOS 7 repository: - -yum -y install epel-release - -yum -y install yum-priorities - -Edit /etc/yum.repos.d/epel.repo... - -nano /etc/yum.repos.d/epel.repo - -... and add the line priority=10 to the [epel] section: - -``` -[epel] -name=Extra Packages for Enterprise Linux 7 - $basearch -#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch -mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch -failovermethod=priority -enabled=1 -priority=10 -gpgcheck=1 -gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7 -[...] -``` - -Then we update our existing packages on the system: - -yum -y update - -Now we install some software packages that are needed later on: - -yum -y groupinstall 'Development Tools' - -### 5 Quota - -(If you have chosen a different partitioning scheme than I did, you must adjust this chapter so that quota applies to the partitions where you need it.) - -To install quota, we run this command: - -yum -y install quota - -Now we check if quota is already enabled for the filesystem where the website (/var/www) and maildir data (var/vmail) is stored. In this example setup, I have one big root partition, so I search for ' / ': - -mount | grep ' / ' - -[root@server1 ~]# mount | grep ' / ' -/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,noquota) -[root@server1 ~]# - -If you have a separate /var partition, then use: - -mount | grep ' /var ' - -instead. If the line contains the word "**noquota**", then proceed with the following steps to enable quota. - -### Enabling quota on the / (root) partition - -Normally you would enable quota in the /etc/fstab file, but if the filesystem is the root filesystem "/", then quota has to be enabled by a boot parameter of the Linux Kernel. - -Edit the grub configuration file: - -nano /etc/default/grub - -search fole the line that starts with GRUB_CMDLINE_LINUX and add rootflags=uquota,gquota to the commandline parameters so that the resulting line looks like this: - -``` -GRUB_CMDLINE_LINUX="crashkernel=auto rd.lvm.lv=centos/root rd.lvm.lv=centos/swap rhgb quiet rootflags=uquota,gquota" -``` - -and apply the changes by running the following command. - -cp /boot/grub2/grub.cfg /boot/grub2/grub.cfg_bak -grub2-mkconfig -o /boot/grub2/grub.cfg - -and reboot the server. - -reboot - -Now check if quota is enabled: - -mount | grep ' / ' - -[root@server1 ~]# mount | grep ' / ' -/dev/mapper/centos-root on / type xfs (rw,relatime,attr2,inode64,usrquota,grpquota) -[root@server1 ~]# - -When quota is active, we can see "**usrquota,grpquota**" in the mount option list. - -### Enabling quota on a separate /var partition - -If you have a separate /var partition, then edit /etc/fstab and add ,uquota,gquota to the / partition (/dev/mapper/centos-var): - -nano /etc/fstab - -``` - -# -# /etc/fstab -# Created by anaconda on Sun Sep 21 16:33:45 2014 -# -# Accessible filesystems, by reference, are maintained under '/dev/disk' -# See man pages fstab(5), findfs(8), mount(8) and/or blkid(8) for more info -# -/dev/mapper/centos-root / xfs defaults 1 1 -/dev/mapper/centos-var /var xfs defaults,uquota,gquota 1 2 -UUID=9ac06939-7e43-4efd-957a-486775edd7b4 /boot xfs defaults 1 3 -/dev/mapper/centos-swap swap swap defaults 0 0 -``` - -Then run - -mount -o remount /var - -quotacheck -avugm -quotaon -avug - -to enable quota. When you get an error that there is no partition with quota enabled, then reboot the server before you proceed. - -### 6 Install Apache, MySQL, phpMyAdmin - -We can install the needed packages with one single command: - -yum -y install ntp httpd mod_ssl mariadb-server php php-mysql php-mbstring phpmyadmin - -To ensure that the server can not be attacked trough the [HTTPOXY][18] vulnerability, we will disable the HTTP_PROXY header in apache globally.  - -Add the apache header rule at the end of the httpd.conf file: - -echo "RequestHeader unset Proxy early" >> /etc/httpd/conf/httpd.conf - -And restart httpd to apply the configuration change. - -service httpd restart - --------------------------------------------------------------------------------- - -via: https://www.howtoforge.com/tutorial/perfect-server-centos-7-3-apache-mysql-php-pureftpd-postfix-dovecot-and-ispconfig/ - -作者:[ Till Brehm][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.howtoforge.com/tutorial/perfect-server-centos-7-3-apache-mysql-php-pureftpd-postfix-dovecot-and-ispconfig/ -[1]:https://www.howtoforge.com/tutorial/perfect-server-centos-7-3-apache-mysql-php-pureftpd-postfix-dovecot-and-ispconfig/#enabling-quota-on-the-root-partition -[2]:https://www.howtoforge.com/tutorial/perfect-server-centos-7-3-apache-mysql-php-pureftpd-postfix-dovecot-and-ispconfig/#enabling-quota-on-a-separate-var-partition -[3]:https://www.howtoforge.com/tutorial/perfect-server-centos-7-2-apache-mysql-php-pureftpd-postfix-dovecot-and-ispconfig/ -[4]:https://www.howtoforge.com/tutorial/perfect-server-centos-7-1-apache-mysql-php-pureftpd-postfix-dovecot-and-ispconfig3/ -[5]:https://www.howtoforge.com/perfect-server-centos-7-apache2-mysql-php-pureftpd-postfix-dovecot-and-ispconfig3 -[6]:https://www.howtoforge.com/tutorial/perfect-server-centos-7-3-apache-mysql-php-pureftpd-postfix-dovecot-and-ispconfig/#-requirements -[7]:https://www.howtoforge.com/tutorial/perfect-server-centos-7-3-apache-mysql-php-pureftpd-postfix-dovecot-and-ispconfig/#-preliminary-note -[8]:https://www.howtoforge.com/tutorial/perfect-server-centos-7-3-apache-mysql-php-pureftpd-postfix-dovecot-and-ispconfig/#nbspprepare-the-server -[9]:https://www.howtoforge.com/tutorial/perfect-server-centos-7-3-apache-mysql-php-pureftpd-postfix-dovecot-and-ispconfig/#nbspenable-additional-repositories-and-install-some-software -[10]:https://www.howtoforge.com/tutorial/perfect-server-centos-7-3-apache-mysql-php-pureftpd-postfix-dovecot-and-ispconfig/#-quota -[11]:https://www.howtoforge.com/tutorial/perfect-server-centos-7-3-apache-mysql-php-pureftpd-postfix-dovecot-and-ispconfig/#-install-apache-mysql-phpmyadmin -[12]:https://www.howtoforge.com/tutorial/centos-7-minimal-server/ -[13]:https://www.howtoforge.com/images/perfect_server_centos_7_1_x86_64_apache2_dovecot_ispconfig3/big/nmtui1.png -[14]:https://www.howtoforge.com/images/perfect_server_centos_7_1_x86_64_apache2_dovecot_ispconfig3/big/nmtui2.png -[15]:https://www.howtoforge.com/images/perfect_server_centos_7_1_x86_64_apache2_dovecot_ispconfig3/big/nmtui3.png -[16]:https://www.howtoforge.com/images/perfect_server_centos_7_1_x86_64_apache2_dovecot_ispconfig3/big/nmtui4.png -[17]:https://www.howtoforge.com/images/perfect_server_centos_7_1_x86_64_apache2_dovecot_ispconfig3/big/nmtui5.png -[18]:https://www.howtoforge.com/tutorial/httpoxy-protect-your-server/ From 51e734d4e47730d8bd45a22d730d6ff5afe6fbb0 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:51:09 +0800 Subject: [PATCH 0158/1407] recycle --- ...itoring a production-ready microservice.md | 265 ------------------ 1 file changed, 265 deletions(-) delete mode 100644 sources/tech/20170302 Monitoring a production-ready microservice.md diff --git a/sources/tech/20170302 Monitoring a production-ready microservice.md b/sources/tech/20170302 Monitoring a production-ready microservice.md deleted file mode 100644 index 7a63a0079c..0000000000 --- a/sources/tech/20170302 Monitoring a production-ready microservice.md +++ /dev/null @@ -1,265 +0,0 @@ -Monitoring a production-ready microservice -============================================================ - -Explore essential components, principles, and key metrics. - - - - ![Container ship](https://d3tdunqjn7n0wj.cloudfront.net/360x240/container-1638068_1400-532657d38c05bb5bd8bd23571f7b3b88.jpg) - - -This is an excerpt from [Production-Ready Microservices][8], by Susan J. Fowler. - - -A production-ready microservice is one that is properly monitored. Proper monitoring is one of the most important parts of building a production-ready microservice and guarantees higher microservice availability. In this chapter, the essential components of microservice monitoring are covered, including which key metrics to monitor, how to log key metrics, building dashboards that display key metrics, how to approach alerting, and on-call best practices. - - - -### Principles of Microservice Monitoring - -The majority of outages in a microservice ecosystem are caused by bad deployments. The second most common cause of outages is the lack of proper  _monitoring_ . It’s easy to see why this is the case. If the state of a microservice is unknown, if key metrics aren’t tracked, then any precipitating failures will remain unknown until an actual outage occurs. By the time a microservice experiences an outage due to lack of monitoring, its availability has already been compromised. During these outages, the time to mitigation and time to repair are prolonged, pulling the availability of the microservice down even further: without easily accessible information about the microservice’s key metrics, developers are often faced with a blank slate, unprepared to quickly resolve the issue. This is why proper monitoring is essential: it provides the development team with all of the relevant information about the microservice. When a microservice is properly monitored, its state is never unknown. - -Monitoring a production-ready microservice has four components. The first is proper  _logging_  of all relevant and important information, which allows developers to understand the state of the microservice at any time in the present or in the past. The second is the use of well-designed  _dashboards_  that accurately reflect the health of the microservice, and are organized in such a way that anyone at the company could view the dashboard and understand the health and status of the microservice without difficulty. The third component is actionable and effective  _alerting_  on all key metrics, a practice that makes it easy for developers to mitigate and resolve problems with the microservice before they cause outages. The final component is the implementation and practice of running a sustainable  _on-call rotation_  responsible for the monitoring of the microservice. With effective logging, dashboards, alerting, and on-call rotation, the microservice’s availability can be protected: failures and errors will be detected, mitigated, and resolved before they bring down any part of the microservice ecosystem. - -###### A Production-Ready Service Is Properly Monitored - -* Its key metrics are identified and monitored at the host, infrastructure, and microservice levels. - -* It has appropriate logging that accurately reflects the past states of the microservice. - -* Its dashboards are easy to interpret, and contain all key metrics. - -* Its alerts are actionable and are defined by signal-providing thresholds. - -* There is a dedicated on-call rotation responsible for monitoring and responding to any incidents and outages. - -* There is a clear, well-defined, and standardized on-call procedure in place for handling incidents and outages. - - -### Key Metrics - -Before we jump into the components of proper monitoring, it’s important to identify precisely  _what_  we want and need to monitor: we want to monitor a microservice, but what does that  _actually_  mean? A microservice isn’t an individual object that we can follow or track, it cannot be isolated and quarantined—it’s far more complicated than that. Deployed across dozens, if not hundreds, of servers, the behavior of a microservice is the sum of its behavior across all of its instantiations, which isn’t the easiest thing to quantify. The key is identifying which properties of a microservice are necessary and sufficient for describing its behavior, and then determining what changes in those properties tell us about the overall status and health of the microservice. We’ll call these properties  _key metrics_ . - -There are two types of key metrics: host and infrastructure metrics, and microservice metrics. Host and infrastructure metrics are those that pertain to the status of the infrastructure and the servers on which the microservice is running, while microservice metrics are metrics that are unique to the individual microservice. In terms of the four-layer model of the microservice ecosystem as described in [Chapter 1,  _Microservices_ ][9], host and infrastructure metrics are metrics belonging to layers 1–3, while microservice metrics are those belonging to layer 4. - -Separating key metrics into these two different types is important both organizationally and technically. Host and infrastructure metrics often affect more than one microservice: for example, if there is a problem with a particular server, and the microservice ecosystem shares the hardware resources among multiple microservices, host-level key metrics will be relevant to every microservice team that has a microservice deployed to that host. Likewise, microservice-specific metrics will rarely be applicable or useful to anyone but the team of developers working on that particular microservice. Teams should monitor both types of key metrics (that is, all metrics relevant to their microservice), and any metrics relevant to multiple microservices should be monitored and shared between the appropriate teams. - -The host and infrastructure metrics that should be monitored for each microservice are the CPU utilized by the microservice on each host, the RAM utilized by the microservice on each host, the available threads, the microservice’s open file descriptors (FD), and the number of database connections that the microservice has to any databases it uses. Monitoring these key metrics should be done in such a way that the status of each metric is accompanied by information about the infrastructure and the microservice. This means that monitoring should be granular enough that developers can know the status of the keys metrics for their microservice on any particular host and across all of the hosts that it runs on. For example, developers should be able to know how much CPU their microservice is using on one particular host  _and_  how much CPU their microservice is using across all hosts it runs on. - -### Monitoring Host-Level Metrics When Resources Are Abstracted - -Some microservice ecosystems may use cluster management applications (like Mesos) in which the resources (CPU, RAM, etc.) are abstracted away from the host level. Host-level metrics won’t be available in the same way to developers in these situations, but all key metrics for the microservice overall should still be monitored by the microservice team. - -Determining the necessary and sufficient key metrics at the microservice level is a bit more complicated because it can depend on the particular language that the microservice is written in. Each language comes with its own special way of processing tasks, for example, and these language-specific features must be monitored closely in the majority of cases. Consider a Python service that utilizes uwsgi workers: the number of uwsgi workers is a necessary key metric for proper monitoring. - -In addition to language-specific key metrics, we also must monitor the availability of the service, the service-level agreement (SLA) of the service, latency (of both the service as a whole and its API endpoints), success of API endpoints, responses and average response times of API endpoints, the services (clients) from which API requests originate (along with which endpoints they send requests to), errors and exceptions (both handled and unhandled), and the health and status of dependencies. - -Importantly, all key metrics should be monitored everywhere that the application is deployed. This means that every stage of the deployment pipeline should be monitored. Staging must be closely monitored in order to catch any problems before a new candidate for production (a new build) is deployed to servers running production traffic. It almost goes without saying that all deployments to production servers should be monitored carefully, both in the canary and production deployment phases. (For more information on deployment pipelines, see [Chapter 3,  _Stability and Reliability_ ][10].) - -Once the key metrics for a microservice have been identified, the next step is to capture the metrics emitted by your service. Capture them, and then log them, graph them, and alert on them. We’ll cover each of these steps in the following sections. - - -###### Summary of Key Metrics - -**Host and infrastructure key metrics:** - -* Threads - -* File descriptors - -* Database connections - -**Microservice key metrics:** - -* Language-specific metrics - -* Availability - -* Latency - -* Endpoint success - -* Endpoint responses - -* Endpoint response times - -* Clients - -* Errors and exceptions - -* Dependencies - -### Logging - - _Logging_  is the first component of production-ready monitoring. It begins and belongs in the codebase of each microservice, nestled deep within the code of each service, capturing all of the information necessary to describe the state of the microservice. In fact, describing the state of the microservice at any given time in the recent past is the ultimate goal of logging. - -One of the benefits of microservice architecture is the freedom it gives developers to deploy new features and code changes frequently, and one of the consequences of this newfound developer freedom and increased development velocity is that the microservice is always changing. In most cases, the service will not be the same service it was 12 hours ago, let alone several days ago, and reproducing any problems will be impossible. When faced with a problem, often the only way to determine the root cause of an incident or outage is to comb through the logs, discover the state of the microservice at the time of the outage, and figure out why the service failed in that state. Logging needs to be such that developers can determine from the logs exactly what went wrong and where things fell apart. - -### Logging Without Microservice Versioning - -Microservice versioning is often discouraged because it can lead to other (client) services pinning to specific versions of a microservice that may not be the best or most updated version of the microservice. Without versioning, determining the state of a microservice when a failure or outage occurred can be difficult, but thorough logging can prevent this from becoming a problem: if the logging is good enough that state of a microservice at the  _time_  of an outage can be sufficiently known and understood, the lack of versioning ceases to be a hindrance to quick and effective mitigation and resolution. - -Determining precisely  _what_  to log is specific to each microservice. The best guidance on determining what needs to be logged is, somewhat unfortunately, necessarily vague: log whatever information is essential to describing the state of the service at a given time. Luckily, we can narrow down which information is necessary by restricting our logging to whatever can be contained in the code of the service. Host-level and infrastructure-level information won’t (and shouldn’t) be logged by the application itself, but by services and tools running the application platform. Some microservice-level key metrics and information, like hashed user IDs and request and response details can and should be located in the microservice’s logs. - -There are, of course, some things that  _should never, ever be logged_ . Logs should never contain identifying information, such as names of customers, Social Security numbers, and other private data. They should never contain information that could present a security risk, such as passwords, access keys, or secrets. In most cases, even seemingly innocuous things like user IDs and usernames should not be logged unless encrypted. - -At times, logging at the individual microservice level will not be enough. As we’ve seen throughout this book, microservices do not live alone, but within complex chains of clients and dependencies within the microservice ecosystem. While developers can try their best to log and monitor everything important and relevant to their service, tracking and logging requests and responses throughout the entire client and dependency chains from end-to-end can illuminate important information about the system that would otherwise go unknown (such as total latency and availability of the stack). To make this information accessible and visible, building a production-ready microservice ecosystem requires tracing each request through the entire stack. - -The reader might have noticed at this point that it appears that a lot of information needs to be logged. Logs are data, and logging is expensive: they are expensive to store, they are expensive to access, and both storing and accessing logs comes with the additional cost associated with making expensive calls over the network. The cost of storing logs may not seem like much for an individual microservice, but if the logging needs of all the microservices within a microservice ecosystem are added together, the cost is rather high. - -###### Warning - -### Logs and Debugging - -Avoid adding debugging logs in code that will be deployed to production—such logs are very costly. If any logs are added specifically for the purpose of debugging, developers should take great care to ensure that any branch or build containing these additional logs does not ever touch production. - -Logging needs to be scalable, it needs to be available, and it needs to be easily accessible  _and_  searchable. To keep the cost of logs down and to ensure scalability and high availability, it’s often necessary to impose per-service logging quotas along with limits and standards on what information can be logged, how many logs each microservice can store, and how long the logs will be stored before being deleted. - - -### Dashboards - -Every microservice must have at least one  _dashboard_  where all key metrics (such as hardware utilization, database connections, availability, latency, responses, and the status of API endpoints) are collected and displayed. A dashboard is a graphical display that is updated in real time to reflect all the most important information about a microservice. Dashboards should be easily accessible, centralized, and standardized across the microservice ecosystem. - -Dashboards should be easy to interpret so that an outsider can quickly determine the health of the microservice: anyone should be able to look at the dashboard and know immediately whether or not the microservice is working correctly. This requires striking a balance between overloading a viewer with information (which would render the dashboard effectively useless) and not displaying enough information (which would also make the dashboard useless): only the necessary minimum of information about key metrics should be displayed. - -A dashboard should also serve as an accurate reflection of the overall quality of monitoring of the entire microservice. Any key metric that is alerted on should be included in the dashboard (we will cover this in the next section): the exclusion of any key metric in the dashboard will reflect poor monitoring of the service, while the inclusion of metrics that are not necessary will reflect a neglect of alerting (and, consequently, monitoring) best practices. - -There are several exceptions to the rule against inclusion of nonkey metrics. In addition to key metrics, information about each phase of the deployment pipeline should be displayed, though not necessarily within the same dashboard. Developers working on microservices that require monitoring a large number of key metrics may opt to set up separate dashboards for each deployment phase (one for staging, one for canary, and one for production) to accurately reflect the health of the microservice at each deployment phase: since different builds will be running on the deployment phases simultaneously, accurately reflecting the health of the microservice in a dashboard might require approaching dashboard design with the goal of reflecting the health of the microservice at a particular deployment phase (treating them almost as different microservices, or at least as different instantiations of a microservice). - -###### Warning - -### Dashboards and Outage Detection - -Even though dashboards can illuminate anomalies and negative trends of a microservice’s key metrics, developers should never need to watch a microservice’s dashboard in order to detect incidents and outages. Doing so is an anti-pattern that leads to deficiencies in alerting and overall monitoring. - -To assist in determining problems introduced by new deployments, it helps to include information about when a deployment occurred in the dashboard. The most effective and useful way to accomplish this is to make sure that deployment times are shown within the graphs of each key metric. Doing so allows developers to quickly check graphs after each deployment to see if any strange patterns emerge in any of the key metrics. - -Well-designed dashboards also give developers an easy, visual way to detect anomalies and determine alerting thresholds. Very slight or gradual changes or disturbances in key metrics run the risk of not being caught by alerting, but a careful look at an accurate dashboard can illuminate anomalies that would otherwise go undetected. Alerting thresholds, which we will cover in the next section, are notoriously difficult to determine, but can be set appropriately when historical data on the dashboard is examined: developers can see normal patterns in key metrics, view spikes in metrics that occurred with outages (or led to outages) in the past, and then set thresholds accordingly. - - - - -### Alerting - -The third component of monitoring a production-ready microservice is real-time  _alerting_ . The detection of failures, as well as the detection of changes within key metrics that could lead to a failure, is accomplished through alerting. To ensure this, all key metrics—host-level metrics, infrastructure metrics, and microservice-specific metrics—should be alerted on, with alerts set at various thresholds. Effective and actionable alerting is essential to preserving the availability of a microservice and preventing downtime. - - - -### Setting up Effective Alerting - -Alerts must be set up for all key metrics. Any change in a key metric at the host level, infrastructure level, or microservice level that could lead to an outage, cause a spike in latency, or somehow harm the availability of the microservice should trigger an alert. Importantly, alerts should also be triggered whenever a key metric is  _not_  seen. - -All alerts should be useful: they should be defined by good, signal-providing thresholds. Three types of thresholds should be set for each key metric, and have both upper and lower bounds:  _normal_ ,  _warning_ , and  _critical_ . Normal thresholds reflect the usual, appropriate upper and lower bounds of each key metric and shouldn’t ever trigger an alert. Warning thresholds on each key metric will trigger alerts when there is a deviation from the norm that could lead to a problem with the microservice; warning thresholds should be set such that they will trigger alerts  _before_  any deviations from the norm cause an outage or otherwise negatively affect the microservice. Critical thresholds should be set based on which upper and lower bounds on key metrics actually cause an outage, cause latency to spike, or otherwise hurt a microservice’s availability. In an ideal world, warning thresholds should trigger alerts that lead to quick detection, mitigation, and resolution before any critical thresholds are reached. In each category, thresholds should be high enough to avoid noise, but low enough to catch any and all real problems with key metrics. - -### Determining Thresholds Early in the Lifecycle of a Microservice - -Thresholds for key metrics can be very difficult to set without historical data. Any thresholds set early in a microservice’s lifecycle run the risk of either being useless or triggering too many alerts. To determine the appropriate thresholds for a new microservice (or even an old one), developers can run load testing on the microservice to gauge where the thresholds should lie. Running "normal" traffic loads through the microservice can determine the normal thresholds, while running larger-than-expected traffic loads can help determine warning and critical thresholds. - -All alerts need to be actionable. Nonactionable alerts are those that are triggered and then resolved (or ignored) by the developer(s) on call for the microservice because they are not important, not relevant, do not signify that anything is wrong with the microservice, or alert on a problem that cannot be resolved by the developer(s). Any alert that cannot be immediately acted on by the on-call developer(s) should be removed from the pool of alerts, reassigned to the relevant on-call rotation, or (if possible) changed so that it becomes actionable. - -Some of the key microservice metrics run the risk of being nonactionable. For example, alerting on the availability of dependencies can easily lead to nonactionable alerts if dependency outages, increases in dependency latency, or dependency downtime do not require any action to be taken by their client(s). If no action needs to be taken, then the thresholds should be set appropriately, or in more extreme cases, no alerts should be set on dependencies at all. However, if any action at all should be taken, even something as small as contacting the dependency’s on-call or development team in order to alert them to the issue and/or coordinate mitigation and resolution, then an alert should be triggered. - - -### Handling Alerts - -Once an alert has been triggered, it needs to be handled quickly and effectively. The root cause of the triggered alert should be mitigated and resolved. To quickly and effectively handle alerts, there are several steps that can be taken. - -The first step is to create step-by-step instructions for each known alert that detail how to triage, mitigate, and resolve each alert. These step-by-step alert instructions should live within an on-call runbook within the centralized documentation of each microservice, making them easily accessible to anyone who is on call for the microservice (more details on runbooks can be found in [Chapter 7,  _Documentation and Understanding_ ][6]). Runbooks are crucial to the monitoring of a microservice: they allow any on-call developer to have step-by-step instructions on how to mitigate and resolve the root causes of each alert. Since each alert is tied to a deviation in a key metric, runbooks can be written so that they address each key metric, known causes of deviations from the norm, and how to go about debugging the problem. - -Two types of on-call runbooks should be created. The first are runbooks for host-level and infrastructure-level alerts that should be shared between the whole engineering organization—these should be written for every key host-level and infrastructure-level metric. The second are on-call runbooks for specific microservices that have step-by-step instructions regarding microservice-specific alerts triggered by changes in key metrics; for example, a spike in latency should trigger an alert, and there should be step-by-step instructions in the on-call runbook that clearly document how to debug, mitigate, and resolve spikes in the microservice’s latency. - -The second step is to identify alerting anti-patterns. If the microservice on-call rotation is overwhelmed by alerts yet the microservice appears to work as expected, then any alerts that are seen more than once but that can be easily mitigated and/or resolved should be automated away. That is, build the mitigation and/or resolution steps into the microservice itself. This holds for every alert, and writing step-by-step instructions for alerts within on-call runbooks allows executing on this strategy to be rather effective. In fact, any alert that, once triggered, requires a simple set of steps to be taken in order to be mitigated and resolved, can be easily automated away. Once this level of production-ready monitoring has been established, a microservice should never experience the same exact problem twice. - -### On-Call Rotations - -In a microservice ecosystem, the development teams themselves are responsible for the availability of their microservices. Where monitoring is concerned, this means that developers need to be on call for their own microservices. The goal of each developer on-call for a microservice needs to be clear: they are to detect, mitigate, and resolve any issue that arises with the microservice during their on call shift before the issue causes an outage for their microservice or impacts the business itself. - -In some larger engineering organizations, site reliability engineers, DevOps, or other operations engineers may take on the responsibility for monitoring and on call, but this requires each microservice to be relatively stable and reliable before the on-call responsibilities can be handed off to another team. In most microservice ecosystems, microservices rarely reach this high level of stability because, as we’ve seen throughout the previous chapters, microservices are constantly changing. In a microservice ecosystem, developers need to bear the responsibility of monitoring the code that they deploy. - -Designing good on-call rotations is crucial and requires the involvement of the entire team. To prevent burnout, on-call rotations should be both brief and shared: no fewer than two developers should ever be on call at one time, and on-call shifts should last no longer than one week and be spaced no more frequently than one month apart. - -The on-call rotations of each microservice should be internally publicized and easily accessible. If a microservice team is experiencing issues with one of their dependencies, they should be able to track down the on-call engineers for the microservice and contact them very quickly. Hosting this information in a centralized place helps to make developers more effective in triaging problems and preventing outages. - -Developing standardized on-call procedures across an engineering organization will go a long way toward building a sustainable microservice ecosystem. Developers should be trained about how to approach their on-call shifts, be made aware of on-call best practices, and be ramped up for joining the on-call rotation very quickly. Standardizing this process and making on-call expectations completely clear to every developer will prevent the burnout, confusion, and frustration that usually accompanies any mention of joining an on-call rotation. - -### Evaluate Your Microservice - -Now that you have a better understanding of monitoring, use the following list of questions to assess the production-readiness of your microservice(s) and microservice ecosystem. The questions are organized by topic, and correspond to the sections within this chapter. - - -### Key Metrics - -* What are this microservice’s key metrics? - -* What are the host and infrastructure metrics? - -* What are the microservice-level metrics? - -* Are all the microservice’s key metrics monitored? - -### Logging - -* What information does this microservice need to log? - -* Does this microservice log all important requests? - -* Does the logging accurately reflect the state of the microservice at any given time? - -* Is this logging solution cost-effective and scalable? - -### Dashboards - -* Does this microservice have a dashboard? - -* Is the dashboard easy to interpret? Are all key metrics displayed on the dashboard? - -* Can I determine whether or not this microservice is working correctly by looking at the dashboard? - -### Alerting - -* Is there an alert for every key metric? - -* Are all alerts defined by good, signal-providing thresholds? - -* Are alert thresholds set appropriately so that alerts will fire before an outage occurs? - -* Are all alerts actionable? - -* Are there step-by-step triage, mitigation, and resolution instructions for each alert in the on-call runbook? - -### On-Call Rotations - -* Is there a dedicated on-call rotation responsible for monitoring this microservice? - -* Is there a minimum of two developers on each on-call shift? - -* Are there standardized on-call procedures across the engineering organization? - - --------------------------------------------------------------------------------- - -作者简介: - -Susan J. Fowler is the author of Production-Ready Microservices. She is currently an engineer at Stripe. Previously, Susan worked on microservice standardization at Uber, developed application platforms and infrastructure at several small startups, and studied particle physics at the University of Pennsylvania. - ----------------------------- - -via: https://www.oreilly.com/learning/monitoring-a-production-ready-microservice - -作者:[Susan Fowler][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.oreilly.com/people/susan_fowler -[1]:http://conferences.oreilly.com/oscon/oscon-tx?intcmp=il-prog-confreg-update-ostx17_new_site_oscon_17_austin_right_rail_cta -[2]:https://pixabay.com/en/container-container-ship-port-1638068/ -[3]:https://www.oreilly.com/learning/monitoring-a-production-ready-microservice?imm_mid=0ee8c5&cmp=em-webops-na-na-newsltr_20170310 -[4]:http://conferences.oreilly.com/oscon/oscon-tx?intcmp=il-prog-confreg-update-ostx17_new_site_oscon_17_austin_right_rail_cta -[5]:http://conferences.oreilly.com/oscon/oscon-tx?intcmp=il-prog-confreg-update-ostx17_new_site_oscon_17_austin_right_rail_cta -[6]:https://www.safaribooksonline.com/library/view/production-ready-microservices/9781491965962/ch07.html?utm_source=oreilly&utm_medium=newsite&utm_campaign=monitoring-production-ready-microservices -[7]:https://www.oreilly.com/people/susan_fowler -[8]:https://www.safaribooksonline.com/library/view/production-ready-microservices/9781491965962/?utm_source=newsite&utm_medium=content&utm_campaign=lgen&utm_content=monitoring-production-ready-microservices -[9]:https://www.safaribooksonline.com/library/view/production-ready-microservices/9781491965962/ch01.html?utm_source=oreilly&utm_medium=newsite&utm_campaign=monitoring-production-ready-microservices -[10]:https://www.safaribooksonline.com/library/view/production-ready-microservices/9781491965962/ch03.html?utm_source=oreilly&utm_medium=newsite&utm_campaign=monitoring-production-ready-microservices From 14dec1bc59d93d7677992b67a5f7207c4ba9bdb5 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 15:51:15 +0800 Subject: [PATCH 0159/1407] recycle --- ...onal spam botnets with a Postfix plugin.md | 544 ------------------ 1 file changed, 544 deletions(-) delete mode 100644 sources/tech/20170208 Blocking of international spam botnets with a Postfix plugin.md diff --git a/sources/tech/20170208 Blocking of international spam botnets with a Postfix plugin.md b/sources/tech/20170208 Blocking of international spam botnets with a Postfix plugin.md deleted file mode 100644 index 068861cbe1..0000000000 --- a/sources/tech/20170208 Blocking of international spam botnets with a Postfix plugin.md +++ /dev/null @@ -1,544 +0,0 @@ -Blocking of international spam botnets with a Postfix plugin -============================================================ - -### On this page - -1. [Introduction][1] -2. [How international botnet works][2] -3. [Defending against botnet spammers][3] -4. [Installation][4] - -This article contains an analysis and solution for blocking of international SPAM botnets and a tutorial to install the anti-spam plugin to postfix firewall - postfwd in the postfix MTA. - -### Introduction - -One of the most important and hardest tasks for every company that provides mail services is staying out of the mail blacklists. - -If a mail domain appears in one of the mail domain blacklists, other mail servers will stop accepting and relaying its e-mails. This will practically ban the domain from the majority of mail providers and prohibits that the provider’s customers can send e-mails. Tere is only one thing that a mail provider can do afterwards: ask the blacklist providers for removal from the list or change the IP addresses and domain names of its mail servers. - -Getting into mail blacklist is very easy when a mail provider does not have a protection against spammers. Only one compromised customer mail account from which a hacker will start sending spam is needed to appear in a blacklist. - -There are several ways of how hackers send spam from compromised mail accounts. In this article, I would like to show you how to completely mitigate international botnet spammers, who are characterized by logging into mail accounts from multiple IP addresses located in multiple countries worldwide. - -### How international botnet works - -Hackers who use an international botnet for spamming operate very efficient and are not easy to track. I started to analyze the behaviour of such an international spam botnet in October of 2016 and implemented a plugin for **postfix firewall** - **postfwd**, which intelligently bans all spammers from international botnets. - -The first step was the analysis of the behavior of an international spam botnet done by tracking of one compromised mail account. I created a simple bash one-liner to select sasl login IP addresses of the compromised mail account from the postfwd login mail logs. - -**Data in the following table are dumped 90 minutes after compromisation of one mail account and contains these attributes:** - -* IP addresses from which hacker logged into account (ip_address) -* Corresponding country codes of IP addresses from GeoIP database (state_code) -* Number of sasl logins which hacker did from one IP address (login_count) - -``` - +-----------------+------------+-------------+ - | ip_address | state_code | login_count | - +-----------------+------------+-------------+ - | 41.63.176.___ | AO | 8 | - | 200.80.227.___ | AR | 41 | - | 120.146.134.___ | AU | 18 | - | 79.132.239.___ | BE | 15 | - | 184.149.27.___ | CA | 1 | - | 24.37.20.___ | CA | 13 | - | 70.28.77.___ | CA | 21 | - | 70.25.65.___ | CA | 23 | - | 72.38.177.___ | CA | 24 | - | 174.114.121.___ | CA | 27 | - | 206.248.139.___ | CA | 4 | - | 64.179.221.___ | CA | 4 | - | 184.151.178.___ | CA | 40 | - | 24.37.22.___ | CA | 51 | - | 209.250.146.___ | CA | 66 | - | 209.197.185.___ | CA | 8 | - | 47.48.223.___ | CA | 8 | - | 70.25.41.___ | CA | 81 | - | 184.71.9.___ | CA | 92 | - | 84.226.27.___ | CH | 5 | - | 59.37.9.___ | CN | 6 | - | 181.143.131.___ | CO | 24 | - | 186.64.177.___ | CR | 6 | - | 77.104.244.___ | CZ | 1 | - | 78.108.109.___ | CZ | 18 | - | 185.19.1.___ | CZ | 58 | - | 95.208.250.___ | DE | 1 | - | 79.215.89.___ | DE | 15 | - | 47.71.223.___ | DE | 23 | - | 31.18.251.___ | DE | 27 | - | 2.164.183.___ | DE | 32 | - | 79.239.97.___ | DE | 32 | - | 80.187.103.___ | DE | 54 | - | 109.84.1.___ | DE | 6 | - | 212.97.234.___ | DK | 49 | - | 190.131.134.___ | EC | 42 | - | 84.77.172.___ | ES | 1 | - | 91.117.105.___ | ES | 10 | - | 185.87.99.___ | ES | 14 | - | 95.16.51.___ | ES | 15 | - | 95.127.182.___ | ES | 16 | - | 195.77.90.___ | ES | 19 | - | 188.86.18.___ | ES | 2 | - | 212.145.210.___ | ES | 38 | - | 148.3.169.___ | ES | 39 | - | 95.16.35.___ | ES | 4 | - | 81.202.61.___ | ES | 45 | - | 88.7.246.___ | ES | 7 | - | 81.36.5.___ | ES | 8 | - | 88.14.192.___ | ES | 8 | - | 212.97.161.___ | ES | 9 | - | 193.248.156.___ | FR | 5 | - | 82.34.32.___ | GB | 1 | - | 86.180.214.___ | GB | 11 | - | 81.108.174.___ | GB | 12 | - | 86.11.209.___ | GB | 13 | - | 86.150.224.___ | GB | 15 | - | 2.102.31.___ | GB | 17 | - | 93.152.88.___ | GB | 18 | - | 86.178.68.___ | GB | 19 | - | 176.248.121.___ | GB | 2 | - | 2.97.227.___ | GB | 2 | - | 62.49.34.___ | GB | 2 | - | 79.64.78.___ | GB | 20 | - | 2.126.140.___ | GB | 22 | - | 87.114.222.___ | GB | 23 | - | 188.29.164.___ | GB | 24 | - | 82.11.14.___ | GB | 26 | - | 81.168.46.___ | GB | 29 | - | 86.136.125.___ | GB | 3 | - | 90.199.85.___ | GB | 3 | - | 86.177.93.___ | GB | 31 | - | 82.32.186.___ | GB | 4 | - | 79.68.153.___ | GB | 46 | - | 151.226.42.___ | GB | 6 | - | 2.123.234.___ | GB | 6 | - | 90.217.211.___ | GB | 6 | - | 212.159.148.___ | GB | 68 | - | 88.111.94.___ | GB | 7 | - | 77.98.186.___ | GB | 9 | - | 41.222.232.___ | GH | 4 | - | 176.63.29.___ | HU | 30 | - | 86.47.237.___ | IE | 10 | - | 37.46.22.___ | IE | 4 | - | 95.83.249.___ | IE | 4 | - | 109.79.69.___ | IE | 6 | - | 79.176.100.___ | IL | 13 | - | 122.175.34.___ | IN | 19 | - | 114.143.5.___ | IN | 26 | - | 115.112.159.___ | IN | 4 | - | 79.62.179.___ | IT | 11 | - | 79.53.217.___ | IT | 19 | - | 188.216.54.___ | IT | 2 | - | 46.44.203.___ | IT | 2 | - | 80.86.57.___ | IT | 2 | - | 5.170.192.___ | IT | 27 | - | 80.23.42.___ | IT | 3 | - | 89.249.177.___ | IT | 3 | - | 93.39.141.___ | IT | 31 | - | 80.183.6.___ | IT | 34 | - | 79.25.107.___ | IT | 35 | - | 81.208.25.___ | IT | 39 | - | 151.57.154.___ | IT | 4 | - | 79.60.239.___ | IT | 42 | - | 79.47.25.___ | IT | 5 | - | 188.216.114.___ | IT | 7 | - | 151.31.139.___ | IT | 8 | - | 46.185.139.___ | JO | 9 | - | 211.180.177.___ | KR | 22 | - | 31.214.125.___ | KW | 2 | - | 89.203.17.___ | KW | 3 | - | 94.187.138.___ | KW | 4 | - | 209.59.110.___ | LC | 18 | - | 41.137.40.___ | MA | 12 | - | 189.211.204.___ | MX | 5 | - | 89.98.64.___ | NL | 6 | - | 195.241.8.___ | NL | 9 | - | 195.1.82.___ | NO | 70 | - | 200.46.9.___ | PA | 30 | - | 111.125.66.___ | PH | 1 | - | 89.174.81.___ | PL | 7 | - | 64.89.12.___ | PR | 24 | - | 82.154.194.___ | PT | 12 | - | 188.48.145.___ | SA | 8 | - | 42.61.41.___ | SG | 25 | - | 87.197.112.___ | SK | 3 | - | 116.58.231.___ | TH | 4 | - | 195.162.90.___ | UA | 5 | - | 108.185.167.___ | US | 1 | - | 108.241.56.___ | US | 1 | - | 198.24.64.___ | US | 1 | - | 199.249.233.___ | US | 1 | - | 204.8.13.___ | US | 1 | - | 206.81.195.___ | US | 1 | - | 208.75.20.___ | US | 1 | - | 24.149.8.___ | US | 1 | - | 24.178.7.___ | US | 1 | - | 38.132.41.___ | US | 1 | - | 63.233.138.___ | US | 1 | - | 68.15.198.___ | US | 1 | - | 72.26.57.___ | US | 1 | - | 72.43.167.___ | US | 1 | - | 74.65.154.___ | US | 1 | - | 74.94.193.___ | US | 1 | - | 75.150.97.___ | US | 1 | - | 96.84.51.___ | US | 1 | - | 96.90.244.___ | US | 1 | - | 98.190.153.___ | US | 1 | - | 12.23.72.___ | US | 10 | - | 50.225.58.___ | US | 10 | - | 64.140.101.___ | US | 10 | - | 66.185.229.___ | US | 10 | - | 70.63.88.___ | US | 10 | - | 96.84.148.___ | US | 10 | - | 107.178.12.___ | US | 11 | - | 170.253.182.___ | US | 11 | - | 206.127.77.___ | US | 11 | - | 216.27.83.___ | US | 11 | - | 72.196.170.___ | US | 11 | - | 74.93.168.___ | US | 11 | - | 108.60.97.___ | US | 12 | - | 205.196.77.___ | US | 12 | - | 63.159.160.___ | US | 12 | - | 204.93.122.___ | US | 13 | - | 206.169.117.___ | US | 13 | - | 208.104.106.___ | US | 13 | - | 65.28.31.___ | US | 13 | - | 66.119.110.___ | US | 13 | - | 67.84.164.___ | US | 13 | - | 69.178.166.___ | US | 13 | - | 71.232.229.___ | US | 13 | - | 96.3.6.___ | US | 13 | - | 205.214.233.___ | US | 14 | - | 38.96.46.___ | US | 14 | - | 67.61.214.___ | US | 14 | - | 173.233.58.___ | US | 141 | - | 64.251.53.___ | US | 15 | - | 73.163.215.___ | US | 15 | - | 24.61.176.___ | US | 16 | - | 67.10.184.___ | US | 16 | - | 173.14.42.___ | US | 17 | - | 173.163.34.___ | US | 17 | - | 104.138.114.___ | US | 18 | - | 23.24.168.___ | US | 18 | - | 50.202.9.___ | US | 19 | - | 96.248.123.___ | US | 19 | - | 98.191.183.___ | US | 19 | - | 108.215.204.___ | US | 2 | - | 50.198.37.___ | US | 2 | - | 69.178.183.___ | US | 2 | - | 74.190.39.___ | US | 2 | - | 76.90.131.___ | US | 2 | - | 96.38.10.___ | US | 2 | - | 96.60.117.___ | US | 2 | - | 96.93.6.___ | US | 2 | - | 74.69.197.___ | US | 21 | - | 98.140.180.___ | US | 21 | - | 50.252.0.___ | US | 22 | - | 69.71.200.___ | US | 22 | - | 71.46.59.___ | US | 22 | - | 74.7.35.___ | US | 22 | - | 12.191.73.___ | US | 23 | - | 208.123.156.___ | US | 23 | - | 65.190.29.___ | US | 23 | - | 67.136.192.___ | US | 23 | - | 70.63.216.___ | US | 23 | - | 96.66.144.___ | US | 23 | - | 173.167.128.___ | US | 24 | - | 64.183.78.___ | US | 24 | - | 68.44.33.___ | US | 24 | - | 23.25.9.___ | US | 25 | - | 24.100.92.___ | US | 25 | - | 107.185.110.___ | US | 26 | - | 208.118.179.___ | US | 26 | - | 216.133.120.___ | US | 26 | - | 75.182.97.___ | US | 26 | - | 107.167.202.___ | US | 27 | - | 66.85.239.___ | US | 27 | - | 71.122.125.___ | US | 28 | - | 74.218.169.___ | US | 28 | - | 76.177.204.___ | US | 28 | - | 216.165.241.___ | US | 29 | - | 24.178.50.___ | US | 29 | - | 63.149.147.___ | US | 29 | - | 174.66.84.___ | US | 3 | - | 184.183.156.___ | US | 3 | - | 50.233.39.___ | US | 3 | - | 70.183.165.___ | US | 3 | - | 71.178.212.___ | US | 3 | - | 72.175.83.___ | US | 3 | - | 74.142.22.___ | US | 3 | - | 98.174.50.___ | US | 3 | - | 98.251.168.___ | US | 3 | - | 206.74.148.___ | US | 30 | - | 24.131.201.___ | US | 30 | - | 50.80.199.___ | US | 30 | - | 69.251.49.___ | US | 30 | - | 108.6.53.___ | US | 31 | - | 74.84.229.___ | US | 31 | - | 172.250.78.___ | US | 32 | - | 173.14.75.___ | US | 32 | - | 216.201.55.___ | US | 33 | - | 40.130.243.___ | US | 33 | - | 164.58.163.___ | US | 34 | - | 70.182.187.___ | US | 35 | - | 184.170.168.___ | US | 37 | - | 198.46.110.___ | US | 37 | - | 24.166.234.___ | US | 37 | - | 65.34.19.___ | US | 37 | - | 75.146.12.___ | US | 37 | - | 107.199.135.___ | US | 38 | - | 206.193.215.___ | US | 38 | - | 50.254.150.___ | US | 38 | - | 69.54.48.___ | US | 38 | - | 172.8.30.___ | US | 4 | - | 24.106.124.___ | US | 4 | - | 65.127.169.___ | US | 4 | - | 71.227.65.___ | US | 4 | - | 71.58.72.___ | US | 4 | - | 74.9.236.___ | US | 4 | - | 12.166.108.___ | US | 40 | - | 174.47.56.___ | US | 40 | - | 66.76.176.___ | US | 40 | - | 76.111.90.___ | US | 41 | - | 96.10.70.___ | US | 41 | - | 97.79.226.___ | US | 41 | - | 174.79.117.___ | US | 42 | - | 70.138.178.___ | US | 42 | - | 64.233.225.___ | US | 43 | - | 97.89.203.___ | US | 43 | - | 12.28.231.___ | US | 44 | - | 64.235.157.___ | US | 45 | - | 76.110.237.___ | US | 45 | - | 71.196.10.___ | US | 46 | - | 173.167.177.___ | US | 49 | - | 24.7.92.___ | US | 49 | - | 68.187.225.___ | US | 49 | - | 184.75.77.___ | US | 5 | - | 208.91.186.___ | US | 5 | - | 71.11.113.___ | US | 5 | - | 75.151.112.___ | US | 5 | - | 98.189.112.___ | US | 5 | - | 69.170.187.___ | US | 51 | - | 97.64.182.___ | US | 51 | - | 24.239.92.___ | US | 52 | - | 72.211.28.___ | US | 53 | - | 66.179.44.___ | US | 54 | - | 66.188.47.___ | US | 55 | - | 64.60.22.___ | US | 56 | - | 73.1.95.___ | US | 56 | - | 75.140.143.___ | US | 58 | - | 24.199.140.___ | US | 59 | - | 216.240.53.___ | US | 6 | - | 216.26.16.___ | US | 6 | - | 50.242.1.___ | US | 6 | - | 65.83.137.___ | US | 6 | - | 68.119.102.___ | US | 6 | - | 68.170.224.___ | US | 6 | - | 74.94.231.___ | US | 6 | - | 96.64.21.___ | US | 6 | - | 71.187.41.___ | US | 60 | - | 184.177.173.___ | US | 61 | - | 75.71.114.___ | US | 61 | - | 75.82.232.___ | US | 61 | - | 97.77.161.___ | US | 63 | - | 50.154.213.___ | US | 65 | - | 96.85.169.___ | US | 67 | - | 100.33.70.___ | US | 68 | - | 98.100.71.___ | US | 68 | - | 24.176.214.___ | US | 69 | - | 74.113.89.___ | US | 69 | - | 204.116.101.___ | US | 7 | - | 216.216.68.___ | US | 7 | - | 65.188.191.___ | US | 7 | - | 69.15.165.___ | US | 7 | - | 74.219.118.___ | US | 7 | - | 173.10.219.___ | US | 71 | - | 97.77.209.___ | US | 72 | - | 173.163.236.___ | US | 73 | - | 162.210.13.___ | US | 79 | - | 12.236.19.___ | US | 8 | - | 208.180.242.___ | US | 8 | - | 24.221.97.___ | US | 8 | - | 40.132.97.___ | US | 8 | - | 50.79.227.___ | US | 8 | - | 64.130.109.___ | US | 8 | - | 66.80.57.___ | US | 8 | - | 74.68.130.___ | US | 8 | - | 74.70.242.___ | US | 8 | - | 96.80.61.___ | US | 81 | - | 74.43.153.___ | US | 83 | - | 208.123.153.___ | US | 85 | - | 75.149.238.___ | US | 87 | - | 96.85.138.___ | US | 89 | - | 208.117.200.___ | US | 9 | - | 208.68.71.___ | US | 9 | - | 50.253.180.___ | US | 9 | - | 50.84.132.___ | US | 9 | - | 63.139.29.___ | US | 9 | - | 70.43.78.___ | US | 9 | - | 74.94.154.___ | US | 9 | - | 50.76.82.___ | US | 94 | - +-----------------+------------+-------------+ -``` - -**In next table we can see the distribution of IP addresses by country:** - -``` - +--------+ - | 214 US | - | 28 GB | - | 17 IT | - | 15 ES | - | 15 CA | - | 8 DE | - | 4 IE | - | 3 KW | - | 3 IN | - | 3 CZ | - | 2 NL | - | 1 UA | - | 1 TH | - | 1 SK | - | 1 SG | - | 1 SA | - | 1 PT | - | 1 PR | - | 1 PL | - | 1 PH | - | 1 PA | - | 1 NO | - | 1 MX | - | 1 MA | - | 1 LC | - | 1 KR | - | 1 JO | - | 1 IL | - | 1 HU | - | 1 GH | - | 1 FR | - | 1 EC | - | 1 DK | - | 1 CR | - | 1 CO | - | 1 CN | - | 1 CH | - | 1 BE | - | 1 AU | - | 1 AR | - | 1 AO | - +--------+ -``` - -Based on these tables can be drawn multiple facts according to which we designed our plugin: - -* Spam was spread from a botnet. This is indicated by logins from huge amount of client IP addresses. -* Spam was spread with a low cadence of messages in order to avoid rate limits. -* Spam was spread from IP addresses from multiple countries (more than 30 countries after few minutes) which indicates an international botnet. - -From these tables were taken out the statistics of IP addresses used, number of logins and countries from which were users logged in: - -* Total number of logins 7531.  -* Total number of IP addresses used 342.  -* Total number of unique countries 41.  - -### Defending against botnet spammers - -The solution to this kind of spam behavior was to make a plugin for the postfix firewall - postfwd. Postfwd is program that can be used to block users by rate limits, by using mail blacklists and by other means. - -We designed and implemented the plugin that counts the number of unique countries from which a user logged in to his account by sasl authentication. Then in the postfwd configuration, you can set limits to the number of countries and after getting above the limit, user gets selected smtp code reply and is blocked from sending emails. - -I am using this plugin in a medium sized internet provider company for 6 months and currently the plugin automatically caught over 50 compromised users without any intervention from administrator's side. Another interesting fact after 6 months of usage is that after finding spammer and sending SMTP code 544 (Host not found - not in DNS) to compromised account (sended directly from postfwd), botnets stopped trying to log into compromised accounts. It looks like the botnet spam application is intelligent and do not want to waste botnet resources. Sending other SMTP codes did not stopped botnet from trying. - -The plugin is available at my company's github - [https://github.com/Vnet-as/postfwd-anti-geoip-spam-plugin][5] - -### Installation - -In this part I will give you a basic tutorial of how to make postfix work with postfwd and how to install the plugin and add a postfwd rule to use it. Installation was tested and done on Debian 8 Jessie. Instructions for parts of this installation are also available on the github project page. - -1\. First install and configure postfix with sasl authentication. There are a lot of great tutorials on installation and configuration of postfix, therefore I will continue right next with postfwd installation.  - -2\. The next thing after you have postfix with sasl authentication installed is to install postfwd. On Debian systems, you can do it with the apt package manager by executing following command (This will also automatically create a user **postfw** and file **/etc/default/postfwd** which we need to update with correct configuration for autostart). - -apt-get install postfwd - -3\. Now we proceed with downloading the git project with our postfwd plugin: - -apt-get install git -git clone https://github.com/Vnet-as/postfwd-anti-geoip-spam-plugin /etc/postfix/postfwd-anti-geoip-spam-plugin -chown -R postfw:postfix /etc/postfix/postfwd-anti-geoip-spam-plugin/ - -4\. If you do not have git or do not want to use git, you can download raw plugin file: - -mkdir /etc/postfix/postfwd-anti-geoip-spam-plugin -wget https://raw.githubusercontent.com/Vnet-as/postfwd-anti-geoip-spam-plugin/master/postfwd-anti-spam.plugin -O /etc/postfix/postfwd-anti-geoip-spam-plugin/postfwd-anti-spam.plugin -chown -R postfw:postfix /etc/postfix/postfwd-anti-geoip-spam-plugin/ - -5. Then update the postfwd default config in the **/etc/default/postfwd** file and add the plugin parameter '**--plugins /etc/postfix/postfwd-anti-geoip-spam-plugin/postfwd-anti-spam.plugin'** to it**:** - -sed -i 's/STARTUP=0/STARTUP=1/' /etc/default/postfwd # Auto-Startup - -sed -i 's/ARGS="--summary=600 --cache=600 --cache-rdomain-only --cache-no-size"/#ARGS="--summary=600 --cache=600 --cache-rdomain-only --cache-no-size"/' /etc/default/postfwd # Comment out old startup parameters - -echo 'ARGS="--summary=600 --cache=600 --cache-rdomain-only --cache-no-size --plugins /etc/postfix/postfwd-anti-geoip-spam-plugin/postfwd-anti-spam.plugin"' >> /etc/default/postfwd # Add new startup parameters - -6\. Now create a basic postfwd configuration file with the anti spam botnet rule: - -cat <<_EOF_ >> /etc/postfix/postfwd.cf -# Anti spam botnet rule -# This example shows how to limit e-mail address defined by sasl_username to be able to login from max. 5 different countries, otherwise they will be blocked to send messages. -id=COUNTRY_LOGIN_COUNT ; \ -sasl_username=~^(.+)$ ; \ -incr_client_country_login_count != 0 ; \ -action=dunno -id=BAN_BOTNET ; \ -sasl_username=~^(.+)$ ; \ -client_uniq_country_login_count > 5 ; \ -action=rate(sasl_username/1/3600/554 Your mail account was compromised. Please change your password immediately after next login.) -_EOF_ - -7\. Update the postfix configuration file **/etc/postfix/main.cf** to use the policy service on the default postfwd port **10040** (or different port according to the configuration in **/etc/default/postfwd**). Your configuration should have following option in the **smtpd_recipient_restrictions** line. Note that the following restriction does not work without other restrictions such as one of **reject_unknown_recipient_domain** or **reject_unauth_destination**. - -echo 'smtpd_recipient_restrictions = check_policy_service inet:127.0.0.1:12525' >> /etc/postfix/main.cf - -8\. Install the dependencies of the plugin:  - -`apt-get install -y libgeo-ip-perl libtime-piece-perl libdbd-mysql-perl libdbd-pg-perl` - -9\. Install MySQL or PostgreSQL database and configure one user which will be used in plugin. - -10\. Update database connection part in plugin to refer to your database backend configuration. This example shows the MySQL configuration for a user testuser and database test. - -``` -# my $driver = "Pg"; -my $driver = "mysql"; -my $database = "test"; -my $host = "127.0.0.1"; -my $port = "3306"; -# my $port = "5432"; -my $dsn = "DBI:$driver:database=$database;host=$host;port=$port"; -my $userid = "testuser"; -my $password = "password"; -``` - -11\. Now restart postfix and postfwd service. - -``` -service postfix restart && service postfwd restart -``` - --------------------------------------------------------------------------------- - -via: https://www.howtoforge.com/tutorial/blocking-of-international-spam-botnets-postfix-plugin/ - -作者:[Ondrej Vasko][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.howtoforge.com/tutorial/blocking-of-international-spam-botnets-postfix-plugin/ -[1]:https://www.howtoforge.com/tutorial/blocking-of-international-spam-botnets-postfix-plugin/#introduction -[2]:https://www.howtoforge.com/tutorial/blocking-of-international-spam-botnets-postfix-plugin/#how-international-botnet-works -[3]:https://www.howtoforge.com/tutorial/blocking-of-international-spam-botnets-postfix-plugin/#defending-against-botnet-spammers -[4]:https://www.howtoforge.com/tutorial/blocking-of-international-spam-botnets-postfix-plugin/#installation -[5]:https://github.com/Vnet-as/postfwd-anti-geoip-spam-plugin From 3634b5c86cb538d2dc0d42586ebc09667865c095 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 21 May 2017 16:00:53 +0800 Subject: [PATCH 0160/1407] =?UTF-8?q?PRF:20170110=20Why=20we=20need=20an?= =?UTF-8?q?=20open=20model=C2=A0to=20design=20and=20evaluate=20public=20po?= =?UTF-8?q?licy.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @geekpi 这篇涉及政治策略,我觉得就不发布到 Linux 中国网站和微信了,考虑单独发布到知乎中。 @oska874 --- ...el to design and evaluate public policy.md | 32 +++++++++---------- 1 file changed, 15 insertions(+), 17 deletions(-) diff --git a/translated/tech/20170110 Why we need an open model to design and evaluate public policy.md b/translated/tech/20170110 Why we need an open model to design and evaluate public policy.md index 600d4a3c23..912be36a14 100644 --- a/translated/tech/20170110 Why we need an open model to design and evaluate public policy.md +++ b/translated/tech/20170110 Why we need an open model to design and evaluate public policy.md @@ -1,43 +1,41 @@ 为何我们需要一个开放模型来设计评估公共政策 ============================================================ -### 想象一个 app 可以让市民测试驱动提出的政策。 +> 想象一个 app 可以让市民来试车提出的政策。 -[up][3] - ![Why we need an open model to design and evaluate public policy](https://opensource.com/sites/default/files/styles/image-full-size/public/images/government/GOV_citizen_participation.jpg?itok=eeLWQgev "Why we need an open model to design and evaluate public policy") -图片提供: +![Why we need an open model to design and evaluate public policy](https://opensource.com/sites/default/files/styles/image-full-size/public/images/government/GOV_citizen_participation.jpg?itok=eeLWQgev "Why we need an open model to design and evaluate public policy") -opensource.com +图片提供:opensource.com -在政治选举之前的几个月中,公众辩论会加剧,并且公民面临大量的政策选择信息。在数据驱动的社会中,新的见解一直在为决策提供信息,对这些信息的深入了解从未如此重要,但公众仍然没有意识到公共政策建模的全部潜力。 +在政治选举之前的几个月中,公众辩论会加剧,并且公民面临大量的各种政策选择的信息。在数据驱动的社会中,新的见解一直在为决策提供信息,对这些信息的深入了解从未如此重要,但公众仍然没有意识到为公共政策建模的全部潜力。 -在“开放政府”的概念不断演变以跟上新技术进步的时代,政府的政策模型和分析可能是新一代的开放知识。 +在“开放政府open government”的概念不断演变以跟上新技术进步的时代,政府的政策模型和分析可能是新一代的开放知识。 政府开源模型 (GOSM) 是指政府开发的模型,其目的是设计和评估政策,免费提供给所有人使用、分发、不受限制地修改。社区可以提高政策建模的质量、可靠性和准确性,创造有利于公众的新的数据驱动程序。 -今天的这代与技术相互作用,就像它的第二大本质,它默认吸收了大量的信息。如果我们可以在使用 GOSM 的虚拟、沉浸式环境中与不同的公共政策进行互动那会如何? +今天的这一代人与技术相互作用,这俨然成为了它的第二种本质,自然而然地吸收了大量的信息。如果我们可以在使用 GOSM 在虚拟、沉浸式环境中与不同的公共政策进行互动那会如何? -想象一下有一个允许公民测试推动政策来确定他们想要生活的未来的程序。他们会本能地学习关键的驱动因素和所需要的东西。不久之后,公众将更深入地了解公共政策的影响,并更加精明地引导有争议的公众辩论。 +想象一下如果有一个程序,允许公民试车提出的政策来确定他们想要生活的未来。他们会本能地学习关键的驱动因素和所需要的东西。不久之后,公众将更深入地了解公共政策的影响,并更加精明地引导有争议性的公众辩论。 为什么我们以前没有更好的使用这些模型?原因在于公共政策建模的神秘面纱。 -在一个如我们所生活的复杂的社会中,量化政策影响是一项艰巨的任务,并被被描述为一种“美好艺术”。此外,大多数政府政策模型都是基于行政和其他私人持有的数据。然而,政策分析师为了指导政策设计而勇于追求,多次以大量武力而获得政治斗争。 +在一个如我们所生活的复杂的社会中,量化政策影响是一项艰巨的任务,并被被描述为一种“美好艺术”。此外,大多数政府政策模型都是基于行政和其他私人持有的数据。然而,政策分析师为了指导政策设计而勇于追求,多次以大量武力而赢得政治斗争的胜利。 -数字是很有说服力的。它们构建可信度并常常被用作引入新政策的理由。公共政策模型的发展赋予政治家和官僚权力,这些政治家和官僚们可能不愿意破坏现状。给予这一点可能并不容易,但 GOSM 为前所未有的公共政策改革提供了机会。 +数字是很有说服力的。它们构建可信度,并常常被用作引入新政策的理由。公共政策模型的发展赋予政治家和官僚权力,这些政治家和官僚们可能不愿意破坏现状。给予这一点可能并不容易,但 GOSM 为前所未有的公共政策改革提供了机会。 -GOSM 将所有人的竞争环境均衡化:政治家、媒体、游说团体、利益相关者和公众。通过向社区开放政策评估的大门, 政府可以利用新的和未发现的能力用来创造、创新在公共领域的效率。但在公共政策设计中,利益相关者和政府之间战略互动有哪些实际影响? +GOSM 将所有人的竞争环境均衡化:政治家、媒体、游说团体、利益相关者和公众。通过向社区开放政策评估的大门, 政府可以在公共领域为创造、创新和效率引入新的和未发现的能力。但在公共政策设计中,利益相关者和政府之间战略互动有哪些实际影响? GOSM 是独一无二的,因为它们主要是设计公共政策的工具,而不一定需要重新分配私人收益。利益相关者和游说团体可能会将 GOSM 与其私人信息一起使用,以获得对经济参与者私人利益的政策环境运作的新见解。 GOSM 可以成为利益相关者在公共辩论中保持权力平衡的武器,并为战略争取最佳利益么? -作为一个可变的公共资源,GOSM 在概念上由纳税人资助,并属于国家。私有实体在不向社会带来利益的情况下从 GOSM 中获得资源是合乎道德的吗?与可能用于更有效的服务提供的程序不同,替代政策建议更有可能由咨询机构使用,并有助于公众辩论。 +作为一个可变的公共资源,GOSM 在概念上由纳税人资助,并属于国家。私有实体在不向社会带来利益的情况下从 GOSM 中获得资源是合乎道德的吗?与可能用于更有效的服务提供的那些程序不同,替代政策建议更有可能由咨询机构使用,并有助于公众辩论。 -开源社区经常使用“ copyleft 许可证” 来确保代码和根据此许可证的任何衍生作品对所有人都开放。当产品价值是代码本身,这需要重新分配才能获得最大利益,它需要重新分发来获得最大的利益。但是,如果代码或 GOSM 重新分发是主要产品附带的,那它会是对现有政策环境的新战略洞察么? +开源社区经常使用 “copyleft 许可证” 来确保代码和在此许可证下的任何衍生作品对所有人都开放。当产品价值是代码本身,这需要重新分配才能获得最大利益,它需要重新分发来获得最大的利益。但是,如果代码或 GOSM 重新分发是主要产品附带的,那它会是对现有政策环境的新战略洞察么? 在私人收集的数据变得越来越多的时候,GOSM 背后的真正价值可能是底层数据,它可以用来改进模型本身。最终,政府是唯一有权实施政策的消费者,利益相关者可以选择在谈判中分享修改后的 GOSM。 -政府在公开发布政策模型时面临的巨大挑战是提高透明度的同时保护隐私。理想情况下,发布 GOSM 将需要以保护建模关键特征的方式保护封闭数据。 +政府在公开发布政策模型时面临的巨大挑战是提高透明度的同时保护隐私。理想情况下,发布 GOSM 将需要以保护建模关键特征的方式保护封闭的数据。 公开发布 GOSM 通过促进市民对民主的更多了解和参与,使公民获得权力,从而改善政策成果和提高公众满意度。在开放的政府乌托邦中,开放的公共政策发展将是政府和社区之间的合作性努力,这里知识、数据和分析可供大家免费使用。 @@ -57,9 +55,9 @@ Audrey Lobo-Pulo - Audrey Lobo-Pulo 博士是 Phoensight 的联合创始人, via: https://opensource.com/article/17/1/government-open-source-models -作者:[Audrey Lobo-Pulo ][a] +作者:[Audrey Lobo-Pulo][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/) 荣誉推出 From 817e3fd441a41bb25eeee5713a1b9a8a281ec612 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 21 May 2017 16:24:46 +0800 Subject: [PATCH 0161/1407] PRF&PUB:20170201 How to capture and stream your gaming session on Linux.md @geekpi --- ...and stream your gaming session on Linux.md | 33 ++++++++----------- 1 file changed, 13 insertions(+), 20 deletions(-) rename {translated/tech => published}/20170201 How to capture and stream your gaming session on Linux.md (66%) diff --git a/translated/tech/20170201 How to capture and stream your gaming session on Linux.md b/published/20170201 How to capture and stream your gaming session on Linux.md similarity index 66% rename from translated/tech/20170201 How to capture and stream your gaming session on Linux.md rename to published/20170201 How to capture and stream your gaming session on Linux.md index 0021e80714..d63ba7feb1 100644 --- a/translated/tech/20170201 How to capture and stream your gaming session on Linux.md +++ b/published/20170201 How to capture and stream your gaming session on Linux.md @@ -1,42 +1,35 @@ -如何在 Linux 中捕获并流式传输你的游戏会话 +如何在 Linux 中捕获并流式传输你的游戏过程 ============================================================ -### 在本页中 - -1. [捕获设置][1] -2. [设置源][2] -3. [过渡][3] -4. [总结][4] - -也许没有许多铁杆玩家使用 Linux,但现在肯定有很多 Linux 用户喜欢玩游戏。如果你是其中之一,并希望向世界展示 Linux 游戏不再是一个笑话,那么你会发现下面这个关于如何捕捉并且/或者流式播放游戏的快速教程。我在这将用一个名为 “[Open Broadcaster Software Studio][5]” 的软件,这可能是我们找到最好的一种。 +也许没有那么多铁杆的游戏玩家使用 Linux,但肯定有很多 Linux 用户喜欢玩游戏。如果你是其中之一,并希望向世界展示 Linux 游戏不再是一个笑话,那么你会喜欢下面这个关于如何捕捉并且/或者以流式播放游戏的快速教程。我在这将用一个名为 “[Open Broadcaster Software Studio][5]” 的软件,这可能是我们所能找到最好的一种。 ### 捕获设置 -在顶层菜单中,我们选择 File → Settings,然后我们选择 “Output” 来设置要生成的文件的选项。这里我们可以设置想要的音频和视频的比特率、新创建的文件的目标路径和文件格式。这上面还提供了粗略的质量设置。 +在顶层菜单中,我们选择 “File” → “Settings”,然后我们选择 “Output” 来设置要生成的文件的选项。这里我们可以设置想要的音频和视频的比特率、新创建的文件的目标路径和文件格式。这上面还提供了粗略的质量设置。 [ ![Select output set in OBS Studio](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_1.png) ][6] -如果我们将顶部的输出模式从 “Simple” 更改为 “Advanced”,我们就能够设置 CPU 负载,使 OBS 能够控制系统。根据所选的质量,CPU 能力和捕获的游戏,存在一个 CPU 负载设置不会导致帧丢失。你可能需要做一些试验才能找到最佳设置,但如果质量设置为低,则不用担心。 +如果我们将顶部的输出模式从 “Simple” 更改为 “Advanced”,我们就能够设置 CPU 负载,以控制 OBS 对系统的影响。根据所选的质量、CPU 能力和捕获的游戏,可以设置一个不会导致丢帧的 CPU 负载设置。你可能需要做一些试验才能找到最佳设置,但如果将质量设置为低,则不用太多设置。 [ ![Change OBS output mode](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_2.png) ][7] -接下来,我们转到设置的 “Video” 部分,我们可以设置我们想要的输出视频分辨率。注意缩小过滤方法,因为它使最终的质量有所不同。 +接下来,我们转到设置的 “Video” 部分,我们可以设置我们想要的输出视频分辨率。注意缩小过滤(downscaling filtering )方式,因为它使最终的质量有所不同。 [ ![Down scaling filter](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_3.png) ][8] -你可能还需要绑定热键以启动、暂停和停止录制。这是特别有用的,因为你可以在录制时看到游戏的屏幕。为此,请在设置中选择 “Hotkeys” 部分,并在相应的框中分配所需的按键。当然,你不必每个框都填写,你只需要填写所需的。 +你可能还需要绑定热键以启动、暂停和停止录制。这特别有用,这样你就可以在录制时看到游戏的屏幕。为此,请在设置中选择 “Hotkeys” 部分,并在相应的框中分配所需的按键。当然,你不必每个框都填写,你只需要填写所需的。 [ ![Configure Hotkeys in OBS](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_4.png) ][9] -如果你对流式传输感兴趣,而不仅仅是录制,请选择 “Stream” 分类的设置,然后你可以选择支持的 30 种流媒体服务,包括Twitch、Facebook Live 和 Youtube,然后选择服务器并输入 流密钥。 +如果你对流式传输感兴趣,而不仅仅是录制,请选择 “Stream” 分类的设置,然后你可以选择支持的 30 种流媒体服务,包括 Twitch、Facebook Live 和 Youtube,然后选择服务器并输入 流密钥。 [ ![Streaming settings](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_5.png) @@ -44,17 +37,17 @@ ### 设置源 -在左下方,你会发现一个名为 “Sources” 的框。我们按下加号好添加一个新的源,它本质上就是我们录制的媒体源。在这你可以设置音频和视频源,但是图像甚至文本也是可以的。 +在左下方,你会发现一个名为 “Sources” 的框。我们按下加号来添加一个新的源,它本质上就是我们录制的媒体源。在这你可以设置音频和视频源,但是图像甚至文本也是可以的。 [ ![OBS Media Source](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_6.png) ][11] -前三个是关于音频源,接下来的两个是图像,JACK 选项用于从乐器捕获的实时音频,媒体源用于添加文件等。这里我们感兴趣的是 “Screen Capture (XSHM)”、“Video Capture Device (V4L2)” 和 “Window Capture (Xcomposite)” 选项。 +前三个是关于音频源,接下来的两个是图像,JACK 选项用于从乐器捕获的实时音频, Media Source 用于添加文件等。这里我们感兴趣的是 “Screen Capture (XSHM)”、“Video Capture Device (V4L2)” 和 “Window Capture (Xcomposite)” 选项。 屏幕捕获选项让你选择要捕获的屏幕(包括活动屏幕),以便记录所有内容。如工作区更改、窗口最小化等。对于标准批量录制来说,这是一个适合的选项,它可在发布之前进行编辑。 -我们来探讨另外两个。Window Capture 将让我们选择一个活动窗口并将其放入捕获监视器。为了将我们的脸放在一个角落,视频捕获设备是有用的,这样人们可以在我们说话时看到我们。当然,每个添加的源都提供了一组选项来供我们实现我们最后要的效果。 +我们来探讨另外两个。Window Capture 将让我们选择一个活动窗口并将其放入捕获监视器。为了将我们的脸放在一个角落,视频捕获设备用于人们可以在我们说话时可以看到我们。当然,每个添加的源都提供了一组选项来供我们实现我们最后要的效果。 [ ![OBS Window Capture](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_7.png) @@ -68,7 +61,7 @@ ### 过渡 -最后,我们假设你正在流式传输游戏会话,并希望能够在游戏视图和自己(或任何其他来源)之间切换。为此,请从右下角切换为“Studio Mode”,并添加一个分配给另一个源的场景。你还可以通过取消选中 “Duplicate scene” 并检查 “Transitions” 旁边的齿轮图标上的 “Duplicate sources” 来切换。 当你想在简短评论中显示你的脸部时,这很有帮助。 +最后,如果你正在流式传输游戏会话时希望能够在游戏视图和自己(或任何其他来源)之间切换。为此,请从右下角切换为“Studio Mode”,并添加一个分配给另一个源的场景。你还可以通过取消选中 “Duplicate scene” 并检查 “Transitions” 旁边的齿轮图标上的 “Duplicate sources” 来切换。 当你想在简短评论中显示你的脸部时,这很有帮助。 [ ![Studio mode](https://www.howtoforge.com/images/how-to-capture-and-stream-your-gaming-session-on-linux/pic_9.png) @@ -84,9 +77,9 @@ OBS Studio 是一个功能强大的免费软件,它工作稳定,使用起来 via: https://www.howtoforge.com/tutorial/how-to-capture-and-stream-your-gaming-session-on-linux/ -作者:[Bill Toulas ][a] +作者:[Bill Toulas][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/) 荣誉推出 From e0fd73751b9b9d00f5aa86d3f6e80f72eb83668b Mon Sep 17 00:00:00 2001 From: Jinwen Zhang Date: Sun, 21 May 2017 17:01:59 +0800 Subject: [PATCH 0162/1407] =?UTF-8?q?wcnnbdk1=20translating=2020170509=20s?= =?UTF-8?q?sh=5Fscan=20=E2=80=93=20Verifies=20Your=20SSH=20Server=20Config?= =?UTF-8?q?uration=20and=20Policy=20in=20Linux.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... Verifies Your SSH Server Configuration and Policy in Linux.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170509 ssh_scan – Verifies Your SSH Server Configuration and Policy in Linux.md b/sources/tech/20170509 ssh_scan – Verifies Your SSH Server Configuration and Policy in Linux.md index b80cc340a0..007bfe1873 100644 --- a/sources/tech/20170509 ssh_scan – Verifies Your SSH Server Configuration and Policy in Linux.md +++ b/sources/tech/20170509 ssh_scan – Verifies Your SSH Server Configuration and Policy in Linux.md @@ -1,3 +1,4 @@ +wcnnbdk1 translating ssh_scan – Verifies Your SSH Server Configuration and Policy in Linux ============================================================ From e1436d5570ff832e3a99c65f78072c208d938ae4 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 21 May 2017 17:04:24 +0800 Subject: [PATCH 0163/1407] PRF&PUB:20170120 5 ways to expand your projects contributor base.md @geekpi @bestony --- ...o expand your projects contributor base.md | 74 ++++++++++++++++++ ...o expand your projects contributor base.md | 75 ------------------- 2 files changed, 74 insertions(+), 75 deletions(-) create mode 100644 published/20170120 5 ways to expand your projects contributor base.md delete mode 100644 translated/talk/20170120 5 ways to expand your projects contributor base.md diff --git a/published/20170120 5 ways to expand your projects contributor base.md b/published/20170120 5 ways to expand your projects contributor base.md new file mode 100644 index 0000000000..3efc0be7bf --- /dev/null +++ b/published/20170120 5 ways to expand your projects contributor base.md @@ -0,0 +1,74 @@ +5 个提升你开源项目贡献者基数的方法 +============================================================ + +![5 ways to expand your project's contributor base](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/BUSINESS_cubestalk.png?itok=MxdS-jA_ "5 ways to expand your project's contributor base") + +图片提供:opensource.com + +许多自由和开源软件项目因解决问题而出现,人们开始为它们做贡献,是因为他们也想修复遇到的问题。当项目的最终用户发现它对他们的需求有用,该项目就开始增长。并且出于分享的目的把人们吸引到同一个项目社区。 + +就像任何事物都是有寿命的,增长既是项目成功的标志也是来源。那么项目领导者和维护者如何激励贡献者基数的增长?这里有五种方法。 + +### 1、 提供好的文档 + +人们经常低估项目[文档][2]的重要性。它是项目贡献者的主要信息来源,它会激励他们努力。信息必须是正确和最新的。它应该包括如何构建该软件、如何提交补丁、编码风格指南等步骤。 + +查看经验丰富的科技作家、编辑 Bob Reselman 的 [7 个创建世界级文档的规则][3]。 + +开发人员文档的一个很好的例子是 [Python 开发人员指南][4]。它包括清晰简洁的步骤,涵盖 Python 开发的各个方面。 + +### 2、 降低进入门槛 + +如果你的项目有[工单或 bug 追踪工具][5],请确保将初级任务标记为一个“小 bug” 或“起点”。新的贡献者可以很容易地通过解决这些问题进入项目。追踪工具也是标记非编程任务(如平面设计、图稿和文档改进)的地方。有许多项目成员不是每天都编码,但是却通过这种方式成为推动力。 + +Fedora 项目维护着一个这样的[易修复和入门级问题的追踪工具][6]。 + +### 3、 为补丁提供常规反馈 + +确认每个补丁,即使它只有一行代码,并给作者反馈。提供反馈有助于吸引潜在的候选人,并指导他们熟悉项目。所有项目都应有一个邮件列表和[聊天功能][7]进行通信。问答可在这些媒介中发生。大多数项目不会在一夜之间成功,但那些繁荣的列表和沟通渠道为增长创造了环境。 + +### 4、 推广你的项目 + +始于解决问题的项目实际上可能对其他开发人员也有用。作为项目的主要贡献者,你的责任是为你的的项目建立文档并推广它。写博客文章,并在社交媒体上分享项目的进展。你可以从简要描述如何成为项目的贡献者开始,并在该描述中提供主要开发者文档的参考连接。此外,请务必提供有关路线图和未来版本的信息。 + +为了你的听众,看看由 Opensource.com 的社区经理 Rikki Endsley 写的[写作提示][8]。 + +### 5、 保持友好 + +友好的对话语调和迅速的回复将加强人们对你的项目的兴趣。最初,这些问题只是为了寻求帮助,但在未来,新的贡献者也可能会提出想法或建议。让他们有信心他们可以成为项目的贡献者。 + +记住你一直在被人评头论足!人们会观察项目开发者是如何在邮件列表或聊天上交谈。这些意味着对新贡献者的欢迎和开放程度。当使用技术时,我们有时会忘记人文关怀,但这对于任何项目的生态系统都很重要。考虑一个情况,项目是很好的,但项目维护者不是很受欢迎。这样的管理员可能会驱使用户远离项目。对于有大量用户基数的项目而言,不被支持的环境可能导致分裂,一部分用户可能决定复刻项目并启动新项目。在开源世界中有这样的先例。 + +另外,拥有不同背景的人对于开源项目的持续增长和源源不断的点子是很重要的。 + +最后,项目负责人有责任维持和帮助项目成长。指导新的贡献者是项目的关键,他们将成为项目和社区未来的领导者。 + +阅读:由红帽的内容战略家 Nicole Engard 写的 [7 种让新的贡献者感到受欢迎的方式][1]。 + +-------------------------------------------------------------------------------- + +作者简介: + +![](https://opensource.com/sites/default/files/styles/profile_pictures/public/pictures/ar1dbnui.jpg?itok=4Xa7f2cM) + +Kushal Das - Kushal Das 是 Python 软件基金会的一名 CPython 核心开发人员和主管。他是一名长期的 FOSS 贡献者和导师,他帮助新人进入贡献世界。他目前在 Red Hat 担任 Fedora 云工程师。他的博客在 https://kushaldas.in 。你也可以在 Twitter @kushaldas 上找到他 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/17/1/expand-project-contributor-base + +作者:[Kushal Das][a] +译者:[geekpi](https://github.com/geekpi) +校对:[Bestony](https://github.com/bestony) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/kushaldas +[1]:https://opensource.com/life/16/5/sumana-harihareswara-maria-naggaga-oscon +[2]:https://opensource.com/tags/documentation +[3]:https://opensource.com/business/16/1/scale-14x-interview-bob-reselman +[4]:https://docs.python.org/devguide/ +[5]:https://opensource.com/tags/bugs-and-issues +[6]:https://fedoraproject.org/easyfix/ +[7]:https://opensource.com/alternatives/slack +[8]:https://opensource.com/business/15/10/what-stephen-king-can-teach-tech-writers diff --git a/translated/talk/20170120 5 ways to expand your projects contributor base.md b/translated/talk/20170120 5 ways to expand your projects contributor base.md deleted file mode 100644 index 269223ab5a..0000000000 --- a/translated/talk/20170120 5 ways to expand your projects contributor base.md +++ /dev/null @@ -1,75 +0,0 @@ -5 个提升你项目贡献者基数的方法 -============================================================ - ![5 ways to expand your project's contributor base](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/BUSINESS_cubestalk.png?itok=MxdS-jA_ "5 ways to expand your project's contributor base") - -图片提供  - -opensource.com - -许多自由和开源软件项目开始解决一个问题时,就有人们开始为它们贡献,因为他们也想修复他们遇到的问题。当项目的最终用户发现它对他们的需求有用,项目就开始增长。这种共同的目的和焦点吸引人们到同一个项目社区。 - -像任何事物都是有寿命的,增长即是标志也是项目成功的来源。那么项目领导者和维护者如何鼓励贡献者基数的增长?这里有五种方法。 - -### 1. 提供好的文档 - -人们经常低估项目[文档][2]的重要性。它是项目贡献者的主要信息来源,它会激励他们努力。信息必须是正确和最新的。它应该包括如何构建软件、如何提交补丁、编码风格指南等步骤。 - -查看经验丰富的科技作家、编辑 Bob Reselman 的[ 7 个创建世界级文档的规则][3]。 - -开发人员文档的一个很好的例子是[ Python 开发人员指南][4]。它包括清晰简洁的步骤,涵盖 Python 开发的各个方面。 - -### 2. 降低进入门槛 - -如果你的项目有[问题或 bug 追踪][5]工具,请确保将初级任务标记为一个“容易 bug ”或“起点”。新的贡献者可以很容易地通过解决这些问题进入项目。追踪器也是标记非编程任务(如平面设计、图稿和文档改进)的地方。有许多项目成员不是每天都编码,但是却通过这种方式成为推动力。 - -Fedora 项目维护一个这样的[易修复和入门级问题的追踪][6]工具。 - -### 3. 为补丁提供常规反馈 - -即使它是一行,也要确认每个补丁,并给作者反馈。提供反馈有助于吸引潜在的候选人,并指导他们熟悉项目。所有项目都应有一个邮件列表和[聊天功能][7]进行通信。问答可在这些媒介中发生。大多数项目不会在一夜之间成功,但那些繁荣的列表和沟通渠道为增长创造了环境。 - -### 4. 推广你的项目 - -开始解决问题的项目实际上可能对其他开发人员也有用。作为项目的主要贡献者,你的责任是写下你的的项目并推广它。写博客文章,并在社交媒体上分享项目的进展。你可以简要描述如何以项目的贡献者来开始,并在该描述中提供主要开发者文档的参考连接。此外,请务必提供有关路线图和未来版本的信息。 - -为了你的听众,获取由 Opensource.com 的社区经理 Rikki Endsley 写的[写作提示][8]。 - -### 5. 保持友好 - -友好的对话语调和迅速的回复将加强人们对你的项目的兴趣。最初,问题只是为了寻求帮助,但在未来,新的贡献者也可能会提出想法或建议。让他们有信心他们可以成为项目的贡献者。 - -记住你一直在被评估!人们会观察任何项目开发者如何在邮件列表或聊天上的交谈。这些意味着对新贡献者的欢迎和开放。当使用技术时,我们有时会忘记人们,但这对于任何项目的生态系统都很重要。考虑一个情况,项目是很好的,但项目维护者不是很受欢迎。该管理员可能会驱使用户远离项目。对于有大量用户基数的项目而言,不被支持的环境可能导致分裂,一部分用户可能决定复刻项目并启动新项目。在开源世界中有这样的成功例子。 - -另外,拥有背景不同的人对于开源项目的持续增长和源源不断的电子是很重要的。 - -最后,项目主人有责任维持和帮助项目成长。指导新的贡献者是项目的关键,他们将成为项目和社区未来的领导者。 - -阅读:由红帽的内容战略家 Nicole Engard 写的_[ 7 种方式让新的贡献者感到受欢迎][1] _。 - --------------------------------------------------------------------------------- - -作者简介: - -![](https://opensource.com/sites/default/files/styles/profile_pictures/public/pictures/ar1dbnui.jpg?itok=4Xa7f2cM) - -Kushal Das - Kushal Das 是 Python 软件基金会的一名 CPython 核心开发人员和主管。他是一名长期的 FOSS 贡献者和导师,他帮助新人进入贡献世界。他目前在 Red Hat 担任 Fedora 云工程师。他的博客在 https://kushaldas.in。你也可以在 Twitter @kushaldas 上找到他 - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/17/1/expand-project-contributor-base - -作者:[Kushal Das][a] -译者:[geekpi](https://github.com/geekpi) -校对:[Bestony](https://github.com/bestony) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/kushaldas -[1]:https://opensource.com/life/16/5/sumana-harihareswara-maria-naggaga-oscon -[2]:https://opensource.com/tags/documentation -[3]:https://opensource.com/business/16/1/scale-14x-interview-bob-reselman -[4]:https://docs.python.org/devguide/ -[5]:https://opensource.com/tags/bugs-and-issues -[6]:https://fedoraproject.org/easyfix/ -[7]:https://opensource.com/alternatives/slack -[8]:https://opensource.com/business/15/10/what-stephen-king-can-teach-tech-writers From cfad0d8e60df6d855e7d9095e59782a6b010a0e5 Mon Sep 17 00:00:00 2001 From: Flynn Date: Sun, 21 May 2017 20:21:10 +0800 Subject: [PATCH 0164/1407] Translated --- ... WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md | 231 ------------------ ... WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md | 230 +++++++++++++++++ 2 files changed, 230 insertions(+), 231 deletions(-) delete mode 100644 sources/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md create mode 100644 translated/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md diff --git a/sources/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md b/sources/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md deleted file mode 100644 index c8e754b9d1..0000000000 --- a/sources/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md +++ /dev/null @@ -1,231 +0,0 @@ -ucasFL translating -WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS -============================================================ - -### Markdown - -By way of a succinct introduction, Markdown is a lightweight plain text formatting syntax created by John Gruber together with Aaron Swartz. Markdown offers individuals “to write using an easy-to-read, easy-to-write plain text format, then convert it to structurally valid XHTML (or HTML)”. Markdown’s syntax consists of easy to remember symbols. It has a gentle learning curve; you can literally learn the Markdown syntax in the time it takes to fry some mushrooms (that’s about 10 minutes). By keeping the syntax as simple as possible, the risk of errors is minimized. Besides being a friendly syntax, it has the virtue of producing clean and valid (X)HTML output. If you have seen my HTML, you would know that’s pretty essential. - -The main goal for the formatting syntax is to make it extremely readable. Users should be able to publish a Markdown-formatted document as plain text. Text written in Markdown has the virtue of being easy to share between computers, smart phones, and individuals. Almost all content management systems support Markdown. It’s popularity as a format for writing for the web has also led to variants being adopted by many services such as GitHub and Stack Exchange. - -Markdown can be composed in any text editor. But I recommend an editor purposely designed for this syntax. The software featured in this roundup allows an author to write professional documents of various formats including blog posts, presentations, reports, email, slides and more. All of the applications are, of course, released under an open source license. Linux, OS X and Windows’ users are catered for. - -* * * - -### Remarkable - - ![Remarkable - cross-platform Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/Remarkable.png?resize=800%2C319&ssl=1) - -Let’s start with Remarkable. An apt name. Remarkable is a reasonably featured Markdown editor – it doesn’t have all the bells and whistles, but there’s nothing critical missing. It has a syntax like Github flavoured markdown. - -With this editor you can write Markdown and view the changes as you make them in the live preview window. You can export your files to PDF (with a TOC) and HTML. There are multiple styles available along with extensive configuration options so you can configure it to your heart’s content. - -Other features include: - -* Syntax highlighting -* GitHub Flavored Markdown support -* MathJax support – render rich documents with advanced formatting -* Keyboard shortcuts - -There are easy installers available for Debian, Ubuntu, Fedora, SUSE and Arch systems. - -Homepage: [https://remarkableapp.github.io/][4] -License: MIT License - -* * * - -### Atom - - ![Atom - cross-platform Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/Atom-Markdown.png?resize=800%2C328&ssl=1) - -Make no bones about it, Atom is a fabulous text editor. Atom consists of over 50 open source packages integrated around a minimal core. With Node.js support, and a full set of features, Atom is my preferred way to edit code. It features in our [Killer Open Source Apps][5], it is that masterly. But as a Markdown editor Atom leaves a lot to be desired – its default packages are bereft of Markdown specific features; for example, it doesn’t render equations, as illustrated in the graphic above. - -But here lies the power of open source and one of the reasons I’m a strong advocate of openness. There are a plethora of packages, some forks, which add the missing functionality. For example, Markdown Preview Plus provides a real-time preview of markdown documents, with math rendering and live reloading. Alternatively, you might try [Markdown Preview Enhanced][6]. If you need an auto-scroll feature, there’s [markdown-scroll-sync][7]. I’m a big fan of [Markdown-Writer][8] and [markdown-pdf][9] the latter converts markdown to PDF, PNG and JPEG on the fly. - -The approach embodies the open source mentality, allowing the user to add extensions to provide only the features needed. Reminds me of Woolworths pick ‘n’ mix sweets. A bit more effort, but the best outcome. - -Homepage: [https://atom.io/][10] -License: MIT License - -* * * - -### Haroopad - - ![Haroopad - - cross-platform Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/Haroopad-1.png?resize=800%2C332&ssl=1) - -Haroopad is an excellent markdown enabled document processor for creating web-friendly documents. Author various formats of documents such as blog articles, slides, presentations, reports, and e-mail. Haroopad runs on Windows, Mac OS X, and Linux. There are Debian/Ubuntu packages, and binaries for Windows and Mac. The application uses node-webkit, CodeMirror, marked, and Twitter Bootstrap. - -Haroo means “A Day” in Korean. - -The feature list is rather impressive; take a look below: - -* Themes, Skins and UI Components - * Over 30 different themes to edit – tomorrow-night-bright and zenburn are recent additions - * Syntax highlighting in fenced code block on editor - * Ruby, Python, PHP, Javascript, C, HTML, CSS - * Based on CodeMirror, a versatile text editor implemented in JavaScript for the browser -* Live Preview themes - * 7 themes based markdown-css -* Syntax Highlighting - * 112 languages & 49 styles based on highlight.js -* Custom Theme - * Style based on CSS (Cascading Style Sheet) -* Presentation Mode – useful for on the spot presentations -* Draw diagrams – flowcharts, and sequence diagrams -* Tasklist -* Enhanced Markdown syntax with TOC, GitHub Flavored Markdown and extensions, mathematical expressions, footnotes, tasklists, and more -* Font Size - * Editor and Viewer font size control using Preference Window & Shortcuts -* Embedding Rich Media Contents - * Video, Audio, 3D, Text, Open Graph and oEmbed - * About 100 major internet services (YouTube, SoundCloud, Flickr …) Support - * Drag & Drop support -* Display Mode - * Default (Editor:Viewer), Reverse (Viewer:Editor), Only Editor, Only Viewer (View > Mode) -* Insert Current Date & Time - * Various Format support (Insert > Date & Time) -* HTML to Markdown - * Drag & Drop your selected text on Web Browser -* Options for markdown parsing -* Outline View -* Vim Key-binding for purists -* Markdown Auto Completion -* Export to PDF, HTML -* Styled HTML copy to clipboard for WYSIWYG editors -* Auto Save & Restore -* Document state information -* Tab or Spaces for Indentation -* Column (Single, Two and Three) Layout View -* Markdown Syntax Help Dialog. -* Import and Export settings -* Support for LaTex mathematical expressions using MathJax -* Export documents to HTML and PDF -* Build extensions for making your own feature -* Effortlessly transform documents into a blog system: WordPress, Evernote and Tumblr, -* Full screen mode – although the mode fails to hide the top menu bar or the bottom toolbar -* Internationalization support: English, Korean, Spanish, Chinese Simplified, German, Vietnamese, Russian, Greek, Portuguese, Japanese, Italian, Indonesian, Turkish, and French - -Homepage: [http://pad.haroopress.com/][11] -License: GNU GPL v3 - -* * * - -### StackEdit - - ![StackEdit - a web based Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/StackEdit.png?resize=800%2C311&ssl=1) - -StackEdit is a full-featured Markdown editor based on PageDown, the Markdown library used by Stack Overflow and the other Stack Exchange sites. Unlike the other editors in this roundup, StackEdit is a web based editor. A Chrome app is also available. - -Features include: - -* Real-time HTML preview with Scroll Link feature to bind editor and preview scrollbars -* Markdown Extra/GitHub Flavored Markdown support and Prettify/Highlight.js syntax highlighting -* LaTeX mathematical expressions using MathJax -* WYSIWYG control buttons -* Configurable layout -* Theming support with different themes available -* A la carte extensions -* Offline editing -* Online synchronization with Google Drive (multi-accounts) and Dropbox -* One click publish on Blogger, Dropbox, Gist, GitHub, Google Drive, SSH server, Tumblr, and WordPress - -Homepage: [https://stackedit.io/][12] -License: Apache License - -* * * - -### MacDown - - ![MacDown - OS X Markdown editor](https://i0.wp.com/www.ossblog.org/wp-content/uploads/2017/02/MacDown.png?resize=800%2C422&ssl=1) - -MacDown is the only editor featured in this roundup which only runs on macOS. Specifically, it requires OS X 10.8 or later. Hoedown is used internally to render Markdown into HTML which gives an edge to its performance. Hoedown is a revived fork of Sundown, it is fully standards compliant with no dependencies, good extension support, and UTF-8 aware. - -MacDown is based on Mou, a proprietary solution designed for web developers. - -It offers good Markdown rendering, syntax highlighting for fenced code blocks with language identifiers rendered by Prism, MathML and LaTeX rendering, GTM task lists, Jekyll front-matter, and optional advanced auto-completion. And above all, it isn’t a resource hog. Want to write Markdown on OS X? MacDown is my open source recommendation for web developers. - -Homepage: [https://macdown.uranusjr.com/][13] -License: MIT License - -* * * - -### ghostwriter - - ![ghostwriter - cross-platform Markdown editor](https://i0.wp.com/www.ossblog.org/wp-content/uploads/2017/02/ghostwriter.png?resize=800%2C310&ssl=1) - -ghostwriter is a cross-platform, aesthetic, distraction-free Markdown editor. It has built-in support for the Sundown processor, but can also auto-detect Pandoc, MultiMarkdown, Discount and cmark processors. It seeks to be an unobtrusive editor. - -ghostwriter has a good feature set which includes syntax highlighting, a full-screen mode, a focus mode, themes, spell checking with Hunspell, a live word count, live HTML preview, and custom CSS style sheets for HTML preview, drag and drop support for images, and internalization support.  A Hemingway mode button disables backspace and delete keys. A new Markdown cheat sheet HUD window is a useful addition. Theme support is pretty basic, but there are some experimental themes available at this [GitHub repository][14]. - -ghostwriter is an under-rated utility. I have come to appreciate the versatility of this application more and more, in part because of its spartan interface helps the writer fully concentrate on curating content.  Recommended. - -ghostwriter is available for Linux and Windows. There is also a portable version available for Windows. - -Homepage: [https://github.com/wereturtle/ghostwriter][15] -License: GNU GPL v3 - -* * * - -### Abricotine - - ![Abricotine - cross-platform Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/Abricotine.png?resize=800%2C316&ssl=1) - -Abricotine is a promising cross-platform open-source markdown editor built for the desktop. It is available for Linux, OS X and Windows. - -The application supports markdown syntax combined with some Github-flavored Markdown enhancements (such as tables). It lets users preview documents directly in the text editor as opposed to a side pane. - -The tool has a reasonable set of features including a spell checker, the ability to save documents as HTML or copy rich text to paste in your email client. You can also display a document table of content in the side pane, display syntax highlighting for code, as well as helpers, anchors and hidden characters. It is at a fairly early stage of development with some basic bugs that need fixing, but it is one to keep an eye on. There are 2 themes, with the ability to add your own. - -Homepage: [http://abricotine.brrd.fr/][16] -License: GNU General Public License v3 or later - -* * * - -### ReText - - ![ReText - Linux Markdown editor](https://i1.wp.com/www.ossblog.org/wp-content/uploads/2017/02/ReText.png?resize=800%2C270&ssl=1) - -ReText is a simple but powerful editor for Markdown and reStructuredText. It gives users the power to control all output formatting. The files it works with are plain text files, however it can export to PDF, HTML and other formats. ReText is officially supported on Linux only. - -Features include: - -* Full screen mode -* Live previews -* Synchronised scrolling (for Markdown) -* Support for math formulas -* Spell checking -* Page breaks -* Export to HTML, ODT and PDF -* Use other markup languages - -Homepage: [https://github.com/retext-project/retext][17] -License: GNU GPL v2 or higher - --------------------------------------------------------------------------------- - -via: https://www.ossblog.org/markdown-editors/ - -作者:[Steve Emms ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.ossblog.org/author/steve/ -[1]:https://www.ossblog.org/author/steve/ -[2]:https://www.ossblog.org/markdown-editors/#comments -[3]:https://www.ossblog.org/category/utilities/ -[4]:https://remarkableapp.github.io/ -[5]:https://www.ossblog.org/top-software/2/ -[6]:https://atom.io/packages/markdown-preview-enhanced -[7]:https://atom.io/packages/markdown-scroll-sync -[8]:https://atom.io/packages/markdown-writer -[9]:https://atom.io/packages/markdown-pdf -[10]:https://atom.io/ -[11]:http://pad.haroopress.com/ -[12]:https://stackedit.io/ -[13]:https://macdown.uranusjr.com/ -[14]:https://github.com/jggouvea/ghostwriter-themes -[15]:https://github.com/wereturtle/ghostwriter -[16]:http://abricotine.brrd.fr/ -[17]:https://github.com/retext-project/retext diff --git a/translated/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md b/translated/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md new file mode 100644 index 0000000000..6e8569a236 --- /dev/null +++ b/translated/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md @@ -0,0 +1,230 @@ +8 个优秀的开源 MARKDOWN 编辑器 +============================================================ + +### Markdown + +首先,对 Markdown 进行一个简单的介绍。Markdown 是由 John Gruber 和 Aaron Swartz 共同创建的一种轻量级纯文本格式语法。Markdown 给用户提供了“易读、易写的纯文本格式来进行写作,然后可以将其转换为有效格式的 XHTML(或 HTML)“。Markdown 语法只包含一些非常容易记住的符号。它具有一条平缓的学习曲线;你可以在炒蘑菇的同时学习 Markdown 语法(大约 10 分钟)。通过使用尽可能简单的语法,错误率达到了最小化。除了拥有友好的语法,它还具有直接输出干净、有效的 (X)HTML 文件的强大功能。如果你看过我的 HTML 文件,你就会知道这个功能是多么的重要。 + +Markdown 格式语法的主要目标是实现最大的可读性。用户能够以纯文本的形式发布一份 Markdown 格式的文件。用 Markdown 进行文本写作的一个优点是易于在计算机、智能手机和个人之间共享。几乎所有的内容管理系统都支持 Markdown 。它作为一种网络写作格式流行起来,产生的变种被许多服务采用,比如 GitHub 和 Stack Exchange 。 + +你可以使用任何文本编辑器来写 Markdown 文件。但我建议使用一个专门为这种语法设计的编辑器。这篇文章中所讨论的软件允许你使用 Markdown 语法来写各种格式的专业文档,包括博客文章、演示文稿、报告、电子邮件以及幻灯片等。另外,所有的应用都是在开源许可证下发布的,在 Linux、OS X 和 Windows 操作系统下均可用。 + +* * * + +### Remarkable + + ![Remarkable - cross-platform Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/Remarkable.png?resize=800%2C319&ssl=1) + +让我们从 Remarkable 开始。Remarkable 是一个包的名字,它是一个相当有特色的 Markdown 编辑器 — 它并不支持 Markdown 的全部功能特性,但该有的功能特性都有。它具有一个和 GitHub Markdown 类似的语法。 + +你可以使用 Remarkable 来写 Markdown 文档,并在实时预览窗口查看更改。你可以把你的文件导出为 PDF 格式(带有目录)和 HTML 格式文件。它有强大的配置选项,从而具有许多样式,因此,你可以把它配置成你最满意的 Markdown 编辑器。 + +其他一些特性: + +* 语法高亮 +* 支持 GitHub 风味的 Markdown +* 支持 MathJax - 通过高级格式呈现丰富文档 +* 键盘快捷键 + +在 Debian、Ubuntu、Fedora、SUSE 和 Arch 系统上均有 Remarkable 的可用的简易安装程序。 + +主页: [https://remarkableapp.github.io/][4] +许可证: MIT 许可 + +* * * + +### Atom + + ![Atom - cross-platform Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/Atom-Markdown.png?resize=800%2C328&ssl=1) + +毫无疑问, Atom 是一个神话般的文本编辑器。超过 50 个开源包集合成一个最小的核,从而构成 Atom 。伴有 Node.js 的支持,以及全套功能特性,Atom 是我最喜欢用来写代码的编辑器。Atom 的特性在[开源应用终结者][5]的文章中有更详细介绍,它是如此的强大。但是作为一个 Markdown 编辑器,Atom 还有许多不足之处,它的默认包不支持 Markdown 的特性。例如,正如上图所展示的,它不支持渲染方程。 + +但是,开源拥有强大的力量,这是我强烈提倡开源的一个重要原因。Atom 上有许多包以及一些复刻,从而添加了缺失的功能特性。比如,Markdown Prview Plus 提供了 Markdown 文件的实时预览,并伴有数学公式渲染和实时重加载。另外,你也可以尝试一下 [Markdown Preview Enhanced][6]。如果你需要自动滚动特性,那么 [markdown-scroll-sync][7] 可以满足你的需求。我是 [Markdown-Writer][8]和 [Markdown-pdf][9]的一个狂热粉丝,后者支持将 Markdown 快速转换为 PDF、PNG 以及 JPEG 文件。 + +这个方式体现了开源的理念:允许用户通过添加扩展来提供所需的特性。这让我想起了 Woolworths 挑选 ‘n’ 混合糖果的故事。虽然需要多付出一些努力,但能收获最好的回报。 + +主页: [https://atom.io/][10] +许可证: MIT 许可 + +* * * + +### Haroopad + + ![Haroopad - - cross-platform Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/Haroopad-1.png?resize=800%2C332&ssl=1) + +Haroopad 是一个优秀的 Markdown 编辑器,是一个创建 web 友好文档的文档处理器。使用 Haroopad 可以创作各种格式的文档,比如博客文章、幻灯片、演示文稿、报告和电子邮件等。Haroopad 在 Windows、Mac OS X 和 Linux 上均可用。它有 Debian/Ubuntu 的软件包,有 Windows 和 Mac 的二进制文件。该应用程序使用 node-webkit、CodeMirror 标记,以及 Twitter 引导。 + +Haroo 在韩语中的意思是“一天”。 + +它的功能列表非常可观。请看下面: + +* 主题、皮肤和 UI 组件 + * 超过 30 中不同的编辑主题 - tomorrow-night-bright 和 zenburn 是近期刚添加的 + * 编辑器中的代码块的语法高亮 + * Ruby、Python、PHP、Javascript、C、HTML 和 CSS 的语法高亮支持 + * 基于 CodeMirror:一个在浏览器中使用 JavaScript 实现的通用文本编辑器 +* 实时预览主题 + * 基于 markdown-css 的 7 个主题 +* 语法高亮 + * 基于 hightlight.js 的 112 种语言以及 49 种样式 +* 定制主题 + * 基于 CSS 的样式(层叠样式表) +* 演示模式 - 对于现场演示非常有用 +* 绘图 - 流程图和序列图 +* 任务列表 +* 通过 TOC 扩展 Markdown 语法,GitHub 风味 Markdown 以及数学表达式、脚注和任务列表等更多的扩展。 +* 字体大小 + * 使用首选窗口和快件键来设置编辑器和预览字体大小 +* 嵌入丰富媒体内容 + * 视频、音频、3D、文本、公开图以及 oEmbed + * 支持大约 100 种主要的网络服务(YouTude、SoundCloud、Flickr 等) + * 支持拖放 +* 显示模式 + * 默认:编辑器|预览器,倒置:预览器|编辑器,仅编辑器,仅预览器(View > Mode) +* 插入当前日期和时间 + * 多种格式支持(Insert > Data & Time) +* HtML 到 Markdown + * 拖放在 Web 浏览器中选择好的文本 +* Markdown 解析选项 +* 离线预览 +* 纯粹主义者的 Vim 键位绑定 +* Markdown 自动补全 +* 导出为 PDF 和 HTML +* HTML 通过 WYSIWYG 编辑器复制到剪切板 +* 自动保存和重新存储 +* 文件状态信息 +* 换行符和空格缩进 +* 列(一、二、三)布局视图 +* Markdown 语法帮助对话框 +* 导入和导出设置 +* 通过 MathJax 支持 LaTex 数学表达式 +* 导出文件为 HTML 和 PDF +* 创建扩展来构建自己的功能 +* 高效地将文件转换进博客系统:WordPress、Evernote 和 Tumblr 等 +* 全屏模式-尽管该模式不能隐藏顶部菜单栏和顶部工具栏 +* 国际化支持:英文、韩文、西班牙文、简体中文、德文、越南文、俄文、希腊文、葡萄牙文、日文、意大利文、印度尼西亚文土耳其文和法文 + +主页 [http://pad.haroopress.com/][11] +许可证: GNU GPL v3 许可 + +* * * + +### StackEdit + + ![StackEdit - a web based Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/StackEdit.png?resize=800%2C311&ssl=1) + +StackEdit 基于 PageDown,是一个功能齐全的 Markdown 编辑器, Mwrkdown 库被 Stack Overflow 和其他一些 Stack 交流网站使用。不同于在这个列表中的其他编辑器,StackEdit 是一个基于 Web 的编辑器。在 Chrome 浏览器上即可使用 StackEdit 。 + +特性包括: + +* 通过绑定滚动连接特性到编辑器和预览滚动条,实现实时预览 HTML +* 支持 Markdown 外加 GitHub 风味 Markdown,Prettify/Highlight.js 语法高亮 +* 通过 MathJax 支持 LaTex 数学表达式 +* WYSIWYG 控制按键 +* 布局配置 +* 不同风格的主题支持 +* la carte 扩展 +* 离线编辑 +* 与 Google 云端硬盘(多帐户)和 Dropbox 在线同步 +* 在 Blogger、Dropbox、Gist、GitHub、Google Drive、SSH服务器、Tumblr 和 WordPress 上一键点击发布 + +主页: [https://stackedit.io/][12] +许可证: Apache 许可 + +* * * + +### MacDown + + ![MacDown - OS X Markdown editor](https://i0.wp.com/www.ossblog.org/wp-content/uploads/2017/02/MacDown.png?resize=800%2C422&ssl=1) + +MacDown 是在这个列表中唯一运行在 macOS 上的全特性编辑器。具体来说,它需要在 OX S 10.8 或更高的版本上才能使用。它在内部使用 Hoedown 将 Markdown 渲染成 HTML,这使得它的特性更加强大。Heodown 是 Sundown 的一个复刻。它完全符合标准,无依赖,具有良好的扩展和 UTF-8 感知 + +MacDown 基于 Mou:专为 Web 开发人员设计的专用解决方案。 + +它提供了良好的 Markdown 渲染,通过 Prism 提供的语言识别渲染实现代码块的语法高亮,MathML 和 LaTex 渲染,GTM 任务列表,Jekyll 前端以及可选的高级自动补全。更重要的是,它占用资源很少。想在 OS X 上写 Markdown?MacDown 是我针对 Web 开发者的开源推荐。 + +主页: [https://macdown.uranusjr.com/][13] +许可证: MIT 许可 + +* * * + +### ghostwriter + + ![ghostwriter - cross-platform Markdown editor](https://i0.wp.com/www.ossblog.org/wp-content/uploads/2017/02/ghostwriter.png?resize=800%2C310&ssl=1) + +ghostwriter 是一个跨平台的、具有美感的、无干扰的 Markdown 编辑器。它有 Sundown 处理器的内建支持,还可以自动检测 pandoc、MultiMarkdown、Discount 和 cmark 处理器。它试图成为一个不显眼的编辑器。 + +ghostwriter 有许多很好的功能设置,包括语法高亮、全屏模式、聚焦模式、主题、通过 Hunspell 进行拼写检查、实时字数统计、实时 HTML 预览、HTML 预览自定义 CSS 样式表、图片拖放支持以及国际化支持。Hemingway 模式按钮可以禁用 `backspace` 键和 `delete` 键。一个新的 `Markdown cheat sheet HUD` 窗口是一个有用的新增功能。主题支持很基本,但在 [GitHub 仓库上][14]也有一些可用的试验性主题。 + +ghostwriter 的功能有限。我越来越欣赏这个应用的通用性,部分原因是其简洁的界面能够让写作者完全集中在策划内容上。这一应用非常值得推荐。 + +ghostwirter 在 Linux 和 Windows 系统上均可用。在 Windows 系统上还有一个便携式的版本可用。 + +主页: [https://github.com/wereturtle/ghostwriter][15] +许可证: GNU GPL v3 许可 + +* * * + +### Abricotine + + ![Abricotine - cross-platform Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/Abricotine.png?resize=800%2C316&ssl=1) + +Abricotine 是一个内置桌面、有前途的跨平台且开源的 Markdown 编辑器。它在 Linux、OS X 和 Windows 上均可用。 + +该应用支持 Markdown 语法以及一些 GitHub 风味的 Markdown 加强(如上表所示)。它允许用户直接在文本编辑器中预览文档,而不是在侧窗栏。 + +该应用有一系列有用的特性,包括拼写检查、以 HTML 格式保存文件或把富文本复制粘贴到邮件客户端。你也可以在侧窗中显示文档表,展示语法高亮代码、以及助手、锚点和隐藏字符等。它目前正处于早期的开发阶段,因此还有一些很基本的 bug 需要修复,但它值得关注。它有两个主题可用,如果有能力,你也可以添加你自己的主题。 + +主页: [http://abricotine.brrd.fr/][16] +许可证: GNU 通用公共许可证 v3 或更高许可 + +* * * + +### ReText + + ![ReText - Linux Markdown editor](https://i1.wp.com/www.ossblog.org/wp-content/uploads/2017/02/ReText.png?resize=800%2C270&ssl=1) + +ReText 是一个简单但强大的 Markdown 和 reStructureText 文本编辑器。用户可以控制输入所有格式。它编辑的文件是纯文本文件,但可以导出为 PDF、HTML 和其他格式的文件。ReText 官方仅支持 Linux 系统。 + +特性包括: + +* 全屏模式 +* 实时预览 +* 同步滚动(针对 Markdown) +* 支持数学公式 +* 拼写检查 +* 分页符 +* 导出为 HTML、ODT 和 PDF 格式 +* 使用其他标记语言 + +主页: [https://github.com/retext-project/retext][17] +许可证: GNU GPL v2 或更高许可 + +-------------------------------------------------------------------------------- + +via: https://www.ossblog.org/markdown-editors/ + +作者:[Steve Emms][a] +译者:[ucasFL](https://github.com/ucasFL) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.ossblog.org/author/steve/ +[1]:https://www.ossblog.org/author/steve/ +[2]:https://www.ossblog.org/markdown-editors/#comments +[3]:https://www.ossblog.org/category/utilities/ +[4]:https://remarkableapp.github.io/ +[5]:https://www.ossblog.org/top-software/2/ +[6]:https://atom.io/packages/markdown-preview-enhanced +[7]:https://atom.io/packages/markdown-scroll-sync +[8]:https://atom.io/packages/markdown-writer +[9]:https://atom.io/packages/markdown-pdf +[10]:https://atom.io/ +[11]:http://pad.haroopress.com/ +[12]:https://stackedit.io/ +[13]:https://macdown.uranusjr.com/ +[14]:https://github.com/jggouvea/ghostwriter-themes +[15]:https://github.com/wereturtle/ghostwriter +[16]:http://abricotine.brrd.fr/ +[17]:https://github.com/retext-project/retext From ae27ddd0085e65859ad1b7dd7bc5245d020d9d2a Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 20:53:53 +0800 Subject: [PATCH 0165/1407] =?UTF-8?q?20170521-11=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...d Graph of Linux Load Average in Terminal.md | 111 ++++++++++++++++++ 1 file changed, 111 insertions(+) create mode 100644 sources/tech/20170506 ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal.md diff --git a/sources/tech/20170506 ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal.md b/sources/tech/20170506 ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal.md new file mode 100644 index 0000000000..341deadae7 --- /dev/null +++ b/sources/tech/20170506 ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal.md @@ -0,0 +1,111 @@ +ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal +============================================================ + + Download Your Free eBooks NOW - [10 Free Linux eBooks for Administrators][12] | [4 Free Shell Scripting eBooks][13] + +ttyload is a lightweight utility which is intended to offer a color-coded graph of load averages over time on Linux and other Unix-like systems. It enables a graphical tracking of system load average in a terminal (“tty“). + +It is known to run on systems such as Linux, IRIX, Solaris, FreeBSD, MacOS X (Darwin) and Isilon OneFS. It is designed to be easy to port to other platforms, but this comes with some hard work. + +Some of its notable features are: it uses fairly standard, but hard-coded, ANSI escape sequences for screen manipulation and colorization. And also comes with (but doesn’t install, or even build by default) a relatively self-contained load bomb, if you want to view how things work on an otherwise unloaded system. + +**Suggested Read:** [GoTTY – Share Your Linux Terminal (TTY) as a Web Application][1] + +In this article, we will show you how to install and use ttyload in Linux to view a color-coded graph of your system load average in a terminal. + +### How to Install ttyload in Linux Systems + +On Debian/Ubuntu based distributions, you can install ttyload from the default system respositores by typing the following [apt-get command][2]. + +``` +$ sudo apt-get install ttyload +``` + +On Other Linux distributions you can install ttyload from the source as shown. + +``` +$ git clone https://github.com/lindes/ttyload.git +$ cd ttyload +$ make +$ ./ttyload +$ sudo make install +``` + +Once installed, you can start it by typing the following command. + +``` +$ ttyload +``` + [![ttyload - Graphical View of Linux Load Average](https://www.tecmint.com/wp-content/uploads/2017/05/ttyload-Graphical-View-of-Linux-Load-Average-.png)][3] + +ttyload – Graphical View of Linux Load Average + +Note: To close the program simply press `[Ctrl+C]` keys. + +You can also define the number of seconds in the interval between refreshes. Default value is 4, and the minimum is 1. + +``` +$ ttyload -i 5 +$ ttyload -i 1 +``` + +To run it in a monochrome mode which turns off ANSI escapes, use the `-m` as follows. + +``` +$ ttyload -m +``` + [![ttyload - Monochrome Mode](https://www.tecmint.com/wp-content/uploads/2017/05/ttyload-monochrome-mode.png)][4] + +ttyload – Monochrome Mode + +To get the ttyload usage info and help, type. + +``` +$ ttyload -h +``` + +Below are some of its important features yet to be added: + +* Support for arbitrary sizing. + +* Make an X front end using the same basic engine, to have “3xload”. + +* Logging-oriented mode. + +For more information, check out the ttyload Homepage: [http://www.daveltd.com/src/util/ttyload/][5] + +Thats all for now! In this article, we showed you how to install and use ttyload in Linux. Write back to us via the comment section below. + + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. + + + +------------------- + +via: https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/ + +作者:[Aaron Kili ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://www.tecmint.com/gotty-share-linux-terminal-in-web-browser/ +[2]:https://www.tecmint.com/useful-basic-commands-of-apt-get-and-apt-cache-for-package-management/ +[3]:https://www.tecmint.com/wp-content/uploads/2017/05/ttyload-Graphical-View-of-Linux-Load-Average-.png +[4]:https://www.tecmint.com/wp-content/uploads/2017/05/ttyload-monochrome-mode.png +[5]:http://www.daveltd.com/src/util/ttyload/ +[6]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/# +[7]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/# +[8]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/# +[9]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/# +[10]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/#comments +[11]:https://www.tecmint.com/author/aaronkili/ +[12]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[13]:https://www.tecmint.com/free-linux-shell-scripting-books/ From f6797467af5b982c0f3ebf2059372134bf0b0385 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 21:00:15 +0800 Subject: [PATCH 0166/1407] =?UTF-8?q?20170521-12=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...x Debugger Part 6 Source-level stepping.md | 282 ++++++++++++++++++ 1 file changed, 282 insertions(+) create mode 100644 sources/tech/20170506 Writing a Linux Debugger Part 6 Source-level stepping.md diff --git a/sources/tech/20170506 Writing a Linux Debugger Part 6 Source-level stepping.md b/sources/tech/20170506 Writing a Linux Debugger Part 6 Source-level stepping.md new file mode 100644 index 0000000000..66bdf51629 --- /dev/null +++ b/sources/tech/20170506 Writing a Linux Debugger Part 6 Source-level stepping.md @@ -0,0 +1,282 @@ +Writing a Linux Debugger Part 6: Source-level stepping +============================================================ + +A couple of posts ago we learned about DWARF information and how it lets us relate the machine code to the high-level source. This time we’ll be putting this knowledge into practice by adding source-level stepping to our debugger. + +* * * + +### Series index + +These links will go live as the rest of the posts are released. + +1. [Setup][1] + +2. [Breakpoints][2] + +3. [Registers and memory][3] + +4. [Elves and dwarves][4] + +5. [Source and signals][5] + +6. [Source-level stepping][6] + +7. Source-level breakpoints + +8. Stack unwinding + +9. Reading variables + +10. Next steps + +* * * + +### Exposing instruction-level stepping + +But we’re getting ahead of ourselves. First let’s expose instruction-level single stepping through the user interface. I decided to split it between a `single_step_instruction` which can be used by other parts of the code, and a `single_step_instruction_with_breakpoint_check` which ensures that any breakpoints are disabled and re-enabled. + +``` +void debugger::single_step_instruction() { + ptrace(PTRACE_SINGLESTEP, m_pid, nullptr, nullptr); + wait_for_signal(); +} + +void debugger::single_step_instruction_with_breakpoint_check() { + //first, check to see if we need to disable and enable a breakpoint + if (m_breakpoints.count(get_pc())) { + step_over_breakpoint(); + } + else { + single_step_instruction(); + } +} +``` + +As usual, another command gets lumped into our `handle_command` function: + +``` +else if(is_prefix(command, "stepi")) { + single_step_instruction_with_breakpoint_check(); + auto line_entry = get_line_entry_from_pc(get_pc()); + print_source(line_entry->file->path, line_entry->line); + } +``` + +With these functions added we can begin to implement our source-level stepping functions. + +* * * + +### Implementing the steps + +We’re going to write very simple versions of these functions, but real debuggers tend to have the concept of a  _thread plan_  which encapsulates all of the stepping information. For example, a debugger might have some complex logic to determine breakpoint sites, then have some callback which determines whether or not the step operation has completed. This is a lot of infrastructure to get in place, so we’ll just take a naive approach. We might end up accidentally stepping over breakpoints, but you can spend some time getting all the details right if you like. + +For `step_out`, we’ll just set a breakpoint at the return address of the function and continue. I don’t want to get into the details of stack unwinding yet – that’ll come in a later part – but it suffices to say for now that the return address is stored 8 bytes after the start of a stack frame. So we’ll just read the frame pointer and read a word of memory at the relevant address: + +``` +void debugger::step_out() { + auto frame_pointer = get_register_value(m_pid, reg::rbp); + auto return_address = read_memory(frame_pointer+8); + + bool should_remove_breakpoint = false; + if (!m_breakpoints.count(return_address)) { + set_breakpoint_at_address(return_address); + should_remove_breakpoint = true; + } + + continue_execution(); + + if (should_remove_breakpoint) { + remove_breakpoint(return_address); + } +} +``` + +`remove_breakpoint` is a little helper function: + +``` +void debugger::remove_breakpoint(std::intptr_t addr) { + if (m_breakpoints.at(addr).is_enabled()) { + m_breakpoints.at(addr).disable(); + } + m_breakpoints.erase(addr); +} +``` + +Next is `step_in`. A simple algorithm is to just keep on stepping over instructions until we get to a new line. + +``` +void debugger::step_in() { + auto line = get_line_entry_from_pc(get_pc())->line; + + while (get_line_entry_from_pc(get_pc())->line == line) { + single_step_instruction_with_breakpoint_check(); + } + + auto line_entry = get_line_entry_from_pc(get_pc()); + print_source(line_entry->file->path, line_entry->line); +} +``` + +`step_over` is the most difficult of the three for us. Conceptually, the solution is to just set a breakpoint at the next source line, but what is the next source line? It might not be the one directly succeeding the current line, as we could be in a loop, or some conditional construct. Real debuggers will often examine what instruction is being executed and work out all of the possible branch targets, then set breakpoints on all of them. I’d rather not implement or integrate an x86 instruction emulator for such a small project, so we’ll need to come up with a simpler solution. A couple of horrible options are to just keep stepping until we’re at a new line in the current function, or to just set a breakpoint at every line in the current function. The former would be ridiculously inefficient if we’re stepping over a function call, as we’d need to single step through every single instruction in that call graph, so I’ll go for the second solution. + +``` +void debugger::step_over() { + auto func = get_function_from_pc(get_pc()); + auto func_entry = at_low_pc(func); + auto func_end = at_high_pc(func); + + auto line = get_line_entry_from_pc(func_entry); + auto start_line = get_line_entry_from_pc(get_pc()); + + std::vector to_delete{}; + + while (line->address < func_end) { + if (line->address != start_line->address && !m_breakpoints.count(line->address)) { + set_breakpoint_at_address(line->address); + to_delete.push_back(line->address); + } + ++line; + } + + auto frame_pointer = get_register_value(m_pid, reg::rbp); + auto return_address = read_memory(frame_pointer+8); + if (!m_breakpoints.count(return_address)) { + set_breakpoint_at_address(return_address); + to_delete.push_back(return_address); + } + + continue_execution(); + + for (auto addr : to_delete) { + remove_breakpoint(addr); + } +} +``` + +This function is a bit more complex, so I’ll break it down a bit. + +``` + auto func = get_function_from_pc(get_pc()); + auto func_entry = at_low_pc(func); + auto func_end = at_high_pc(func); +``` + +`at_low_pc` and `at_high_pc` are functions from `libelfin` which will get us the low and high PC values for the given function DIE. + +``` + auto line = get_line_entry_from_pc(func_entry); + auto start_line = get_line_entry_from_pc(get_pc()); + + std::vector breakpoints_to_remove{}; + + while (line->address < func_end) { + if (line->address != start_line->address && !m_breakpoints.count(line->address)) { + set_breakpoint_at_address(line->address); + breakpoints_to_remove.push_back(line->address); + } + ++line; + } +``` + +We’ll need to remove any breakpoints we set so that they don’t leak out of our step function, so we keep track of them in a `std::vector`. To set all the breakpoints, we loop over the line table entries until we hit one which is outside the range of our function. For each one, we make sure that it’s not the line we are currently on, and that there’s not already a breakpoint set at that location. + +``` + auto frame_pointer = get_register_value(m_pid, reg::rbp); + auto return_address = read_memory(frame_pointer+8); + if (!m_breakpoints.count(return_address)) { + set_breakpoint_at_address(return_address); + to_delete.push_back(return_address); + } +``` + +Here we are setting a breakpoint on the return address of the function, just like in `step_out`. + +``` + continue_execution(); + + for (auto addr : to_delete) { + remove_breakpoint(addr); + } +``` + +Finally, we continue until one of those breakpoints has been hit, then remove all the temporary breakpoints we set. + +It ain’t pretty, but it’ll do for now. + +Of course, we also need to add this new functionality to our UI: + +``` + else if(is_prefix(command, "step")) { + step_in(); + } + else if(is_prefix(command, "next")) { + step_over(); + } + else if(is_prefix(command, "finish")) { + step_out(); + } +``` + +* * * + +### Testing it out + +I tested out my implementation with a simple program which calls a bunch of different functions: + +``` +void a() { + int foo = 1; +} + +void b() { + int foo = 2; + a(); +} + +void c() { + int foo = 3; + b(); +} + +void d() { + int foo = 4; + c(); +} + +void e() { + int foo = 5; + d(); +} + +void f() { + int foo = 6; + e(); +} + +int main() { + f(); +} +``` + +You should be able to set a breakpoint on the address of `main` and then in, over, and out all over the program. Expect things to break if you try to step out of `main` or into some dynamically linked library. + +You can find the code for this post [here][7]. Next time we’ll use our newfound DWARF expertise to implement source-level breakpoints.   + +-------------------------------------------------------------------------------- + +via: https://blog.tartanllama.xyz/c++/2017/05/06/writing-a-linux-debugger-dwarf-step/ + +作者:[TartanLlama ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.twitter.com/TartanLlama +[1]:https://blog.tartanllama.xyz/2017/03/21/writing-a-linux-debugger-setup/ +[2]:https://blog.tartanllama.xyz/c++/2017/03/24/writing-a-linux-debugger-breakpoints/ +[3]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/ +[4]:https://blog.tartanllama.xyz/c++/2017/04/05/writing-a-linux-debugger-elf-dwarf/ +[5]:https://blog.tartanllama.xyz/c++/2017/04/24/writing-a-linux-debugger-source-signal/ +[6]:https://blog.tartanllama.xyz/c++/2017/05/06/writing-a-linux-debugger-dwarf-step/ +[7]:https://github.com/TartanLlama/minidbg/tree/tut_dwarf_step From 329dc9790c9af3ed69a60aa06d4fe24480b617ef Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 21:01:46 +0800 Subject: [PATCH 0167/1407] =?UTF-8?q?20170521-13=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...inux Debugger Part 5 Source and signals.md | 301 ++++++++++++++++++ 1 file changed, 301 insertions(+) create mode 100644 sources/tech/20170424 Writing a Linux Debugger Part 5 Source and signals.md diff --git a/sources/tech/20170424 Writing a Linux Debugger Part 5 Source and signals.md b/sources/tech/20170424 Writing a Linux Debugger Part 5 Source and signals.md new file mode 100644 index 0000000000..3e6f0e3e8a --- /dev/null +++ b/sources/tech/20170424 Writing a Linux Debugger Part 5 Source and signals.md @@ -0,0 +1,301 @@ +Writing a Linux Debugger Part 5: Source and signals +============================================================ + +In the the last part we learned about DWARF information and how it can be used to read variables and associate our high-level source code with the machine code which is being executed. In this part we’ll put this into practice by implementing some DWARF primitives which will be used by the rest of our debugger. We’ll also take this opportunity to get our debugger to print out the current source context when a breakpoint is hit. + +* * * + +### Series index + +These links will go live as the rest of the posts are released. + +1. [Setup][1] + +2. [Breakpoints][2] + +3. [Registers and memory][3] + +4. [Elves and dwarves][4] + +5. [Source and signals][5] + +6. [Source-level stepping][6] + +7. Source-level breakpoints + +8. Stack unwinding + +9. Reading variables + +10. Next steps + +* * * + +### Setting up our DWARF parser + +As I noted way back at the start of this series, we’ll be using [`libelfin`][7] to handle our DWARF information. Hopefully you got this set up in the first post, but if not, do so now, and make sure that you use the `fbreg` branch of my fork. + +Once you have `libelfin` building, it’s time to add it to our debugger. The first step is to parse the ELF executable we’re given and extract the DWARF from it. This is very easy with `libelfin`, just make these changes to `debugger`: + +``` +class debugger { +public: + debugger (std::string prog_name, pid_t pid) + : m_prog_name{std::move(prog_name)}, m_pid{pid} { + auto fd = open(m_prog_name.c_str(), O_RDONLY); + + m_elf = elf::elf{elf::create_mmap_loader(fd)}; + m_dwarf = dwarf::dwarf{dwarf::elf::create_loader(m_elf)}; + } + //... + +private: + //... + dwarf::dwarf m_dwarf; + elf::elf m_elf; +}; +``` + +`open` is used instead of `std::ifstream` because the elf loader needs a UNIX file descriptor to pass to `mmap` so that it can just map the file into memory rather than reading it a bit at a time. + +* * * + +### Debug information primitives + +Next we can implement functions to retrieve line entries and function DIEs from PC values. We’ll start with `get_function_from_pc`: + +``` +dwarf::die debugger::get_function_from_pc(uint64_t pc) { + for (auto &cu : m_dwarf.compilation_units()) { + if (die_pc_range(cu.root()).contains(pc)) { + for (const auto& die : cu.root()) { + if (die.tag == dwarf::DW_TAG::subprogram) { + if (die_pc_range(die).contains(pc)) { + return die; + } + } + } + } + } + + throw std::out_of_range{"Cannot find function"}; +} +``` + +Here I take a naive approach of just iterating through compilation units until I find one which contains the program counter, then iterating through the children until we find the relevant function (`DW_TAG_subprogram`). As mentioned in the last post, you could handle things like member functions and inlining here if you wanted. + +Next is `get_line_entry_from_pc`: + +``` +dwarf::line_table::iterator debugger::get_line_entry_from_pc(uint64_t pc) { + for (auto &cu : m_dwarf.compilation_units()) { + if (die_pc_range(cu.root()).contains(pc)) { + auto < = cu.get_line_table(); + auto it = lt.find_address(pc); + if (it == lt.end()) { + throw std::out_of_range{"Cannot find line entry"}; + } + else { + return it; + } + } + } + + throw std::out_of_range{"Cannot find line entry"}; +} +``` + +Again, we simply find the correct compilation unit, then ask the line table to get us the relevant entry. + +* * * + +### Printing source + +When we hit a breakpoint or step around our code, we’ll want to know where in the source we end up. + +``` +void debugger::print_source(const std::string& file_name, unsigned line, unsigned n_lines_context) { + std::ifstream file {file_name}; + + //Work out a window around the desired line + auto start_line = line <= n_lines_context ? 1 : line - n_lines_context; + auto end_line = line + n_lines_context + (line < n_lines_context ? n_lines_context - line : 0) + 1; + + char c{}; + auto current_line = 1u; + //Skip lines up until start_line + while (current_line != start_line && file.get(c)) { + if (c == '\n') { + ++current_line; + } + } + + //Output cursor if we're at the current line + std::cout << (current_line==line ? "> " : " "); + + //Write lines up until end_line + while (current_line <= end_line && file.get(c)) { + std::cout << c; + if (c == '\n') { + ++current_line; + //Output cursor if we're at the current line + std::cout << (current_line==line ? "> " : " "); + } + } + + //Write newline and make sure that the stream is flushed properly + std::cout << std::endl; +} +``` + +Now that we can print out source, we’ll need to hook this into our debugger. A good place to do this is when the debugger gets a signal from a breakpoint or (eventually) single step. While we’re at this, we might want to add some better signal handling to our debugger. + +* * * + +### Better signal handling + +We want to be able to tell what signal was sent to the process, but we also want to know how it was produced. For example, we want to be able to tell if we just got a `SIGTRAP` because we hit a breakpoint, or if it was because a step completed, or a new thread spawned, etc. Fortunately, `ptrace` comes to our rescue again. One of the possible commands to `ptrace` is `PTRACE_GETSIGINFO`, which will give you information about the last signal which the process was sent. We use it like so: + +``` +siginfo_t debugger::get_signal_info() { + siginfo_t info; + ptrace(PTRACE_GETSIGINFO, m_pid, nullptr, &info); + return info; +} +``` + +This gives us a `siginfo_t` object, which provides the following information: + +``` +siginfo_t { + int si_signo; /* Signal number */ + int si_errno; /* An errno value */ + int si_code; /* Signal code */ + int si_trapno; /* Trap number that caused + hardware-generated signal + (unused on most architectures) */ + pid_t si_pid; /* Sending process ID */ + uid_t si_uid; /* Real user ID of sending process */ + int si_status; /* Exit value or signal */ + clock_t si_utime; /* User time consumed */ + clock_t si_stime; /* System time consumed */ + sigval_t si_value; /* Signal value */ + int si_int; /* POSIX.1b signal */ + void *si_ptr; /* POSIX.1b signal */ + int si_overrun; /* Timer overrun count; + POSIX.1b timers */ + int si_timerid; /* Timer ID; POSIX.1b timers */ + void *si_addr; /* Memory location which caused fault */ + long si_band; /* Band event (was int in + glibc 2.3.2 and earlier) */ + int si_fd; /* File descriptor */ + short si_addr_lsb; /* Least significant bit of address + (since Linux 2.6.32) */ + void *si_lower; /* Lower bound when address violation + occurred (since Linux 3.19) */ + void *si_upper; /* Upper bound when address violation + occurred (since Linux 3.19) */ + int si_pkey; /* Protection key on PTE that caused + fault (since Linux 4.6) */ + void *si_call_addr; /* Address of system call instruction + (since Linux 3.5) */ + int si_syscall; /* Number of attempted system call + (since Linux 3.5) */ + unsigned int si_arch; /* Architecture of attempted system call + (since Linux 3.5) */ +} +``` + +I’ll just be using `si_signo` to work out which signal was sent, and `si_code` to get more information about the signal. The best place to put this code is in our `wait_for_signal` function: + +``` +void debugger::wait_for_signal() { + int wait_status; + auto options = 0; + waitpid(m_pid, &wait_status, options); + + auto siginfo = get_signal_info(); + + switch (siginfo.si_signo) { + case SIGTRAP: + handle_sigtrap(siginfo); + break; + case SIGSEGV: + std::cout << "Yay, segfault. Reason: " << siginfo.si_code << std::endl; + break; + default: + std::cout << "Got signal " << strsignal(siginfo.si_signo) << std::endl; + } +} +``` + +Now to handle `SIGTRAP`s. It suffices to know that `SI_KERNEL` or `TRAP_BRKPT` will be sent when a breakpoint is hit, and `TRAP_TRACE` will be sent on single step completion: + +``` +void debugger::handle_sigtrap(siginfo_t info) { + switch (info.si_code) { + //one of these will be set if a breakpoint was hit + case SI_KERNEL: + case TRAP_BRKPT: + { + set_pc(get_pc()-1); //put the pc back where it should be + std::cout << "Hit breakpoint at address 0x" << std::hex << get_pc() << std::endl; + auto line_entry = get_line_entry_from_pc(get_pc()); + print_source(line_entry->file->path, line_entry->line); + return; + } + //this will be set if the signal was sent by single stepping + case TRAP_TRACE: + return; + default: + std::cout << "Unknown SIGTRAP code " << info.si_code << std::endl; + return; + } +} +``` + +There are a bunch of different signals and flavours of signals which you could handle. See `man sigaction` for more information. + +Since we now correct the program counter when we get the `SIGTRAP`, we can remove this coded from `step_over_breakpoint`, so it now looks like: + +``` +void debugger::step_over_breakpoint() { + if (m_breakpoints.count(get_pc())) { + auto& bp = m_breakpoints[get_pc()]; + if (bp.is_enabled()) { + bp.disable(); + ptrace(PTRACE_SINGLESTEP, m_pid, nullptr, nullptr); + wait_for_signal(); + bp.enable(); + } + } +} +``` + +* * * + +### Testing it out + +Now you should be able to set a breakpoint at some address, run the program and see the source code printed out with the currently executing line marked with a cursor. + +Next time we’ll be adding the ability to set source-level breakpoints. In the meantime, you can get the code for this post [here][8]. + +-------------------------------------------------------------------------------- + +via: https://blog.tartanllama.xyz/c++/2017/04/24/writing-a-linux-debugger-source-signal/ + +作者:[TartanLlama ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.twitter.com/TartanLlama +[1]:https://blog.tartanllama.xyz/2017/03/21/writing-a-linux-debugger-setup/ +[2]:https://blog.tartanllama.xyz/c++/2017/03/24/writing-a-linux-debugger-breakpoints/ +[3]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/ +[4]:https://blog.tartanllama.xyz/c++/2017/04/05/writing-a-linux-debugger-elf-dwarf/ +[5]:https://blog.tartanllama.xyz/c++/2017/04/24/writing-a-linux-debugger-source-signal/ +[6]:https://blog.tartanllama.xyz/c++/2017/05/06/writing-a-linux-debugger-dwarf-step/ +[7]:https://github.com/TartanLlama/libelfin/tree/fbreg +[8]:https://github.com/TartanLlama/minidbg/tree/tut_source From 0a52a04691ef2b01aef73fd09f7d139307513a4e Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 21:04:14 +0800 Subject: [PATCH 0168/1407] =?UTF-8?q?20170521-14=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ux Debugger Part 3 Registers and memory.md | 345 ++++++++++++++++++ 1 file changed, 345 insertions(+) create mode 100644 sources/tech/20170331 Writing a Linux Debugger Part 3 Registers and memory.md diff --git a/sources/tech/20170331 Writing a Linux Debugger Part 3 Registers and memory.md b/sources/tech/20170331 Writing a Linux Debugger Part 3 Registers and memory.md new file mode 100644 index 0000000000..19ddd8b9fa --- /dev/null +++ b/sources/tech/20170331 Writing a Linux Debugger Part 3 Registers and memory.md @@ -0,0 +1,345 @@ +Writing a Linux Debugger Part 3: Registers and memory +============================================================ + +In the last post we added simple address breakpoints to our debugger. This time we’ll be adding the ability to read and write registers and memory, which will allow us to screw around with our program counter, observe state and change the behaviour of our program. + +* * * + +### Series index + +These links will go live as the rest of the posts are released. + +1. [Setup][3] + +2. [Breakpoints][4] + +3. [Registers and memory][5] + +4. [Elves and dwarves][6] + +5. [Source and signals][7] + +6. [Source-level stepping][8] + +7. Source-level breakpoints + +8. Stack unwinding + +9. Reading variables + +10. Next steps + +* * * + +### Registering our registers + +Before we actually read any registers, we need to teach our debugger a bit about our target, which is x86_64\. Alongside sets of general and special purpose registers, x86_64 has floating point and vector registers available. I’ll be omitting the latter two for simplicity, but you can choose to support them if you like. x86_64 also allows you to access some 64 bit registers as 32, 16, or 8 bit registers, but I’ll just be sticking to 64\. Due to these simplifications, for each register we just need its name, its DWARF register number, and where it is stored in the structure returned by `ptrace`. I chose to have a scoped enum for referring to the registers, then I laid out a global register descriptor array with the elements in the same order as in the `ptrace` register structure. + +``` +enum class reg { + rax, rbx, rcx, rdx, + rdi, rsi, rbp, rsp, + r8, r9, r10, r11, + r12, r13, r14, r15, + rip, rflags, cs, + orig_rax, fs_base, + gs_base, + fs, gs, ss, ds, es +}; + +constexpr std::size_t n_registers = 27; + +struct reg_descriptor { + reg r; + int dwarf_r; + std::string name; +}; + +const std::array g_register_descriptors {{ + { reg::r15, 15, "r15" }, + { reg::r14, 14, "r14" }, + { reg::r13, 13, "r13" }, + { reg::r12, 12, "r12" }, + { reg::rbp, 6, "rbp" }, + { reg::rbx, 3, "rbx" }, + { reg::r11, 11, "r11" }, + { reg::r10, 10, "r10" }, + { reg::r9, 9, "r9" }, + { reg::r8, 8, "r8" }, + { reg::rax, 0, "rax" }, + { reg::rcx, 2, "rcx" }, + { reg::rdx, 1, "rdx" }, + { reg::rsi, 4, "rsi" }, + { reg::rdi, 5, "rdi" }, + { reg::orig_rax, -1, "orig_rax" }, + { reg::rip, -1, "rip" }, + { reg::cs, 51, "cs" }, + { reg::rflags, 49, "eflags" }, + { reg::rsp, 7, "rsp" }, + { reg::ss, 52, "ss" }, + { reg::fs_base, 58, "fs_base" }, + { reg::gs_base, 59, "gs_base" }, + { reg::ds, 53, "ds" }, + { reg::es, 50, "es" }, + { reg::fs, 54, "fs" }, + { reg::gs, 55, "gs" }, +}}; +``` + +You can typically find the register data structure in `/usr/include/sys/user.h` if you’d like to look at it yourself, and the DWARF register numbers are taken from the [System V x86_64 ABI][11]. + +Now we can write a bunch of functions to interact with registers. We’d like to be able to read registers, write to them, retrieve a value from a DWARF register number, and lookup registers by name and vice versa. Let’s start with implementing `get_register_value`: + +``` +uint64_t get_register_value(pid_t pid, reg r) { + user_regs_struct regs; + ptrace(PTRACE_GETREGS, pid, nullptr, ®s); + //... +} +``` + +Again, `ptrace` gives us easy access to the data we want. We just construct an instance of `user_regs_struct` and give that to `ptrace` alongside the `PTRACE_GETREGS` request. + +Now we want to read `regs` depending on which register was requested. We could write a big switch statement, but since we’ve laid out our `g_register_descriptors` table in the same order as `user_regs_struct`, we can just search for the index of the register descriptor, and access `user_regs_struct` as an array of `uint64_t`s.[1][9] + +``` + auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors), + [r](auto&& rd) { return rd.r == r; }); + + return *(reinterpret_cast(®s) + (it - begin(g_register_descriptors))); +``` + +The cast to `uint64_t` is safe because `user_regs_struct` is a standard layout type, but I think the pointer arithmetic is technically UB. No current compilers even warn about this and I’m lazy, but if you want to maintain utmost correctness, write a big switch statement. + +`set_register_value` is much the same, we just write to the location and write the registers back at the end: + +``` +void set_register_value(pid_t pid, reg r, uint64_t value) { + user_regs_struct regs; + ptrace(PTRACE_GETREGS, pid, nullptr, ®s); + auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors), + [r](auto&& rd) { return rd.r == r; }); + + *(reinterpret_cast(®s) + (it - begin(g_register_descriptors))) = value; + ptrace(PTRACE_SETREGS, pid, nullptr, ®s); +} +``` + +Next is lookup by DWARF register number. This time I’ll actually check for an error condition just in case we get some weird DWARF information: + +``` +uint64_t get_register_value_from_dwarf_register (pid_t pid, unsigned regnum) { + auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors), + [regnum](auto&& rd) { return rd.dwarf_r == regnum; }); + if (it == end(g_register_descriptors)) { + throw std::out_of_range{"Unknown dwarf register"}; + } + + return get_register_value(pid, it->r); +} +``` + +Nearly finished, now he have register name lookups: + +``` +std::string get_register_name(reg r) { + auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors), + [r](auto&& rd) { return rd.r == r; }); + return it->name; +} + +reg get_register_from_name(const std::string& name) { + auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors), + [name](auto&& rd) { return rd.name == name; }); + return it->r; +} +``` + +And finally we’ll add a simple helper to dump the contents of all registers: + +``` +void debugger::dump_registers() { + for (const auto& rd : g_register_descriptors) { + std::cout << rd.name << " 0x" + << std::setfill('0') << std::setw(16) << std::hex << get_register_value(m_pid, rd.r) << std::endl; + } +} +``` + +As you can see, iostreams has a very concise interface for outputting hex data nicely[2][10]. Feel free to make an I/O manipulator to get rid of this mess if you like. + +This gives us enough support to handle registers easily in the rest of the debugger, so we can now add this to our UI. + +* * * + +### Exposing our registers + +All we need to do here is add a new command to the `handle_command` function. With the following code, users will be able to type `register read rax`, `register write rax 0x42` and so on. + +``` + else if (is_prefix(command, "register")) { + if (is_prefix(args[1], "dump")) { + dump_registers(); + } + else if (is_prefix(args[1], "read")) { + std::cout << get_register_value(m_pid, get_register_from_name(args[2])) << std::endl; + } + else if (is_prefix(args[1], "write")) { + std::string val {args[3], 2}; //assume 0xVAL + set_register_value(m_pid, get_register_from_name(args[2]), std::stol(val, 0, 16)); + } + } +``` + +* * * + +### Where is my mind? + +We’ve already read from and written to memory when setting our breakpoints, so we just need to add a couple of functions to hide the `ptrace` call a bit. + +``` +uint64_t debugger::read_memory(uint64_t address) { + return ptrace(PTRACE_PEEKDATA, m_pid, address, nullptr); +} + +void debugger::write_memory(uint64_t address, uint64_t value) { + ptrace(PTRACE_POKEDATA, m_pid, address, value); +} +``` + +You might want to add support for reading and writing more than a word at a time, which you can do by just incrementing the address each time you want to read another word. You could also use [`process_vm_readv` and `process_vm_writev`][12] or `/proc//mem` instead of `ptrace` if you like. + +Now we’ll add commands for our UI: + +``` + else if(is_prefix(command, "memory")) { + std::string addr {args[2], 2}; //assume 0xADDRESS + + if (is_prefix(args[1], "read")) { + std::cout << std::hex << read_memory(std::stol(addr, 0, 16)) << std::endl; + } + if (is_prefix(args[1], "write")) { + std::string val {args[3], 2}; //assume 0xVAL + write_memory(std::stol(addr, 0, 16), std::stol(val, 0, 16)); + } + } +``` + +* * * + +### Patching `continue_execution` + +Before we test out our changes, we’re now in a position to implement a more sane version of `continue_execution`. Since we can get the program counter, we can check our breakpoint map to see if we’re at a breakpoint. If so, we can disable the breakpoint and step over it before continuing. + +First we’ll add for couple of helper functions for clarity and brevity: + +``` +uint64_t debugger::get_pc() { + return get_register_value(m_pid, reg::rip); +} + +void debugger::set_pc(uint64_t pc) { + set_register_value(m_pid, reg::rip, pc); +} +``` + +Then we can write a function to step over a breakpoint: + +``` +void debugger::step_over_breakpoint() { + // - 1 because execution will go past the breakpoint + auto possible_breakpoint_location = get_pc() - 1; + + if (m_breakpoints.count(possible_breakpoint_location)) { + auto& bp = m_breakpoints[possible_breakpoint_location]; + + if (bp.is_enabled()) { + auto previous_instruction_address = possible_breakpoint_location; + set_pc(previous_instruction_address); + + bp.disable(); + ptrace(PTRACE_SINGLESTEP, m_pid, nullptr, nullptr); + wait_for_signal(); + bp.enable(); + } + } +} +``` + +First we check to see if there’s a breakpoint set for the value of the current PC. If there is, we first put execution back to before the breakpoint, disable it, step over the original instruction, and re-enable the breakpoint. + +`wait_for_signal` will encapsulate our usual `waitpid` pattern: + +``` +void debugger::wait_for_signal() { + int wait_status; + auto options = 0; + waitpid(m_pid, &wait_status, options); +} +``` + +Finally we rewrite `continue_execution` like this: + +``` +void debugger::continue_execution() { + step_over_breakpoint(); + ptrace(PTRACE_CONT, m_pid, nullptr, nullptr); + wait_for_signal(); +} +``` + +* * * + +### Testing it out + +Now that we can read and modify registers, we can have a bit of fun with our hello world program. As a first test, try setting a breakpoint on the call instruction again and continue from it. You should see `Hello world` being printed out. For the fun part, set a breakpoint just after the output call, continue, then write the address of the call argument setup code to the program counter (`rip`) and continue. You should see `Hello world` being printed a second time due to this program counter manipulation. Just in case you aren’t sure where to set the breakpoint, here’s my `objdump` output from the last post again: + +``` +0000000000400936
: + 400936: 55 push rbp + 400937: 48 89 e5 mov rbp,rsp + 40093a: be 35 0a 40 00 mov esi,0x400a35 + 40093f: bf 60 10 60 00 mov edi,0x601060 + 400944: e8 d7 fe ff ff call 400820 <_ZStlsISt11char_traitsIcEERSt13basic_ostreamIcT_ES5_PKc@plt> + 400949: b8 00 00 00 00 mov eax,0x0 + 40094e: 5d pop rbp + 40094f: c3 ret + +``` + +You’ll want to move the program counter back to `0x40093a` so that the `esi` and `edi` registers are set up properly. + +In the next post, we’ll take our first look at DWARF information and add various kinds of single stepping to our debugger. After that, we’ll have a mostly functioning tool which can step through code, set breakpoints wherever we like, modify data and so forth. As always, drop a comment below if you have any questions! + +You can find the code for this post [here][13]. + +* * * + +1. You could also reorder the `reg` enum and cast them to the underlying type to use as indexes, but I wrote it this way in the first place, it works, and I’m too lazy to change it. [↩][1] + +2. Ahahahahahahahahahahahahahahahaha [↩][2] + +-------------------------------------------------------------------------------- + +via: https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/ + +作者:[ TartanLlama ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.twitter.com/TartanLlama +[1]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/#fnref:2 +[2]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/#fnref:1 +[3]:https://blog.tartanllama.xyz/2017/03/21/writing-a-linux-debugger-setup/ +[4]:https://blog.tartanllama.xyz/c++/2017/03/24/writing-a-linux-debugger-breakpoints/ +[5]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/ +[6]:https://blog.tartanllama.xyz/c++/2017/04/05/writing-a-linux-debugger-elf-dwarf/ +[7]:https://blog.tartanllama.xyz/c++/2017/04/24/writing-a-linux-debugger-source-signal/ +[8]:https://blog.tartanllama.xyz/c++/2017/05/06/writing-a-linux-debugger-dwarf-step/ +[9]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/#fn:2 +[10]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/#fn:1 +[11]:https://www.uclibc.org/docs/psABI-x86_64.pdf +[12]:http://man7.org/linux/man-pages/man2/process_vm_readv.2.html +[13]:https://github.com/TartanLlama/minidbg/tree/tut_registers From ce7dfcd878fe291187d9e6d40a305b6a8862c7e9 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 21:05:35 +0800 Subject: [PATCH 0169/1407] =?UTF-8?q?20170521-15=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...Linux Debugger Part 4 Elves and dwarves.md | 328 ++++++++++++++++++ 1 file changed, 328 insertions(+) create mode 100644 sources/tech/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md diff --git a/sources/tech/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md b/sources/tech/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md new file mode 100644 index 0000000000..8ab7c2a397 --- /dev/null +++ b/sources/tech/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md @@ -0,0 +1,328 @@ +Writing a Linux Debugger Part 4: Elves and dwarves +============================================================ + +Up until now you’ve heard whispers of dwarves, of debug information, of a way to understand the source code without just parsing the thing. Today we’ll be going into the details of source-level debug information in preparation for using it in following parts of this tutorial. + +* * * + +### Series index + +These links will go live as the rest of the posts are released. + +1. [Setup][1] + +2. [Breakpoints][2] + +3. [Registers and memory][3] + +4. [Elves and dwarves][4] + +5. [Source and signals][5] + +6. [Source-level stepping][6] + +7. Source-level breakpoints + +8. Stack unwinding + +9. Reading variables + +10. Next steps + +* * * + +### Introduction to ELF and DWARF + +ELF and DWARF are two components which you may not have heard of, but probably use most days. ELF (Executable and Linkable Format) is the most widely used object file format in the Linux world; it specifies a way to store all of the different parts of a binary, like the code, static data, debug information, and strings. It also tells the loader how to take the binary and ready it for execution, which involves noting where different parts of the binary should be placed in memory, which bits need to be fixed up depending on the position of other components ( _relocations_ ) and more. I won’t cover much more of ELF in these posts, but if you’re interested, you can have a look at [this wonderful infographic][7] or [the standard][8]. + +DWARF is the debug information format most commonly used with ELF. It’s not necessarily tied to ELF, but the two were developed in tandem and work very well together. This format allows a compiler to tell a debugger how the original source code relates to the binary which is to be executed. This information is split across different ELF sections, each with its own piece of information to relay. Here are the different sections which are defined, taken from this highly informative if slightly out of date [Introduction to the DWARF Debugging Format][9]: + +* `.debug_abbrev` Abbreviations used in the `.debug_info` section + +* `.debug_aranges` A mapping between memory address and compilation + +* `.debug_frame` Call Frame Information + +* `.debug_info` The core DWARF data containing DWARF Information Entries (DIEs) + +* `.debug_line` Line Number Program + +* `.debug_loc` Location descriptions + +* `.debug_macinfo` Macro descriptions + +* `.debug_pubnames` A lookup table for global objects and functions + +* `.debug_pubtypes` A lookup table for global types + +* `.debug_ranges` Address ranges referenced by DIEs + +* `.debug_str` String table used by `.debug_info` + +* `.debug_types` Type descriptions + +We are most interested in the `.debug_line` and `.debug_info` sections, so lets have a look at some DWARF for a simple program. + +``` +int main() { + long a = 3; + long b = 2; + long c = a + b; + a = 4; +} +``` + +* * * + +### DWARF line table + +If you compile this program with the `-g` option and run the result through `dwarfdump`, you should see something like this for the line number section: + +``` +.debug_line: line number info for a single cu +Source lines (from CU-DIE at .debug_info offset 0x0000000b): + + NS new statement, BB new basic block, ET end of text sequence + PE prologue end, EB epilogue begin + IS=val ISA number, DI=val discriminator value + [lno,col] NS BB ET PE EB IS= DI= uri: "filepath" +0x00400670 [ 1, 0] NS uri: "/home/simon/play/MiniDbg/examples/variable.cpp" +0x00400676 [ 2,10] NS PE +0x0040067e [ 3,10] NS +0x00400686 [ 4,14] NS +0x0040068a [ 4,16] +0x0040068e [ 4,10] +0x00400692 [ 5, 7] NS +0x0040069a [ 6, 1] NS +0x0040069c [ 6, 1] NS ET + +``` + +The first bunch of lines is some information on how to understand the dump – the main line number data starts at the line starting with `0x00400670`. Essentially this maps a code memory address with a line and column number in some file. `NS` means that the address marks the beginning of a new statement, which is often used for setting breakpoints or stepping. `PE`marks the end of the function prologue, which is helpful for setting function entry breakpoints. `ET` marks the end of the translation unit. The information isn’t actually encoded like this; the real encoding is a very space-efficient program of sorts which can be executed to build up this line information. + +So, say we want to set a breakpoint on line 4 of variable.cpp, what do we do? We look for entries corresponding to that file, then we look for a relevant line entry, look up the address which corresponds to it, and set a breakpoint there. In our example, that’s this entry: + +``` +0x00400686 [ 4,14] NS + +``` + +So we want to set a breakpoint at address `0x00400686`. You could do so by hand with the debugger you’ve already written if you want to give it a try. + +The reverse works just as well. If we have a memory location – say, a program counter value – and want to find out where that is in the source, we just find the closest mapped address in the line table information and grab the line from there. + +* * * + +### DWARF debug info + +The `.debug_info` section is the heart of DWARF. It gives us information about the types, functions, variables, hopes, and dreams present in our program. The fundamental unit in this section is the DWARF Information Entry, affectionately known as DIEs. A DIE consists of a tag telling you what kind of source-level entity is being represented, followed by a series of attributes which apply to that entity. Here’s the `.debug_info` section for the simple example program I posted above: + +``` + +.debug_info + +COMPILE_UNIT
: +< 0><0x0000000b> DW_TAG_compile_unit + DW_AT_producer clang version 3.9.1 (tags/RELEASE_391/final) + DW_AT_language DW_LANG_C_plus_plus + DW_AT_name /super/secret/path/MiniDbg/examples/variable.cpp + DW_AT_stmt_list 0x00000000 + DW_AT_comp_dir /super/secret/path/MiniDbg/build + DW_AT_low_pc 0x00400670 + DW_AT_high_pc 0x0040069c + +LOCAL_SYMBOLS: +< 1><0x0000002e> DW_TAG_subprogram + DW_AT_low_pc 0x00400670 + DW_AT_high_pc 0x0040069c + DW_AT_frame_base DW_OP_reg6 + DW_AT_name main + DW_AT_decl_file 0x00000001 /super/secret/path/MiniDbg/examples/variable.cpp + DW_AT_decl_line 0x00000001 + DW_AT_type <0x00000077> + DW_AT_external yes(1) +< 2><0x0000004c> DW_TAG_variable + DW_AT_location DW_OP_fbreg -8 + DW_AT_name a + DW_AT_decl_file 0x00000001 /super/secret/path/MiniDbg/examples/variable.cpp + DW_AT_decl_line 0x00000002 + DW_AT_type <0x0000007e> +< 2><0x0000005a> DW_TAG_variable + DW_AT_location DW_OP_fbreg -16 + DW_AT_name b + DW_AT_decl_file 0x00000001 /super/secret/path/MiniDbg/examples/variable.cpp + DW_AT_decl_line 0x00000003 + DW_AT_type <0x0000007e> +< 2><0x00000068> DW_TAG_variable + DW_AT_location DW_OP_fbreg -24 + DW_AT_name c + DW_AT_decl_file 0x00000001 /super/secret/path/MiniDbg/examples/variable.cpp + DW_AT_decl_line 0x00000004 + DW_AT_type <0x0000007e> +< 1><0x00000077> DW_TAG_base_type + DW_AT_name int + DW_AT_encoding DW_ATE_signed + DW_AT_byte_size 0x00000004 +< 1><0x0000007e> DW_TAG_base_type + DW_AT_name long int + DW_AT_encoding DW_ATE_signed + DW_AT_byte_size 0x00000008 + +``` + +The first DIE represents a compilation unit (CU), which is essentially a source file with all of the `#includes` and such resolved. Here are the attributes annotated with their meaning: + +``` +DW_AT_producer clang version 3.9.1 (tags/RELEASE_391/final) <-- The compiler which produced + this binary +DW_AT_language DW_LANG_C_plus_plus <-- The source language +DW_AT_name /super/secret/path/MiniDbg/examples/variable.cpp <-- The name of the file which + this CU represents +DW_AT_stmt_list 0x00000000 <-- An offset into the line table + which tracks this CU +DW_AT_comp_dir /super/secret/path/MiniDbg/build <-- The compilation directory +DW_AT_low_pc 0x00400670 <-- The start of the code for + this CU +DW_AT_high_pc 0x0040069c <-- The end of the code for + this CU + +``` + +The other DIEs follow a similar scheme, and you can probably intuit what the different attributes mean. + +Now we can try and solve a few practical problems with our new-found knowledge of DWARF. + +### Which function am I in? + +Say we have a program counter value and want to figure out what function we’re in. A simple algorithm for this is: + +``` +for each compile unit: + if the pc is between DW_AT_low_pc and DW_AT_high_pc: + for each function in the compile unit: + if the pc is between DW_AT_low_pc and DW_AT_high_pc: + return function information + +``` + +This will work for many purposes, but things get a bit more difficult in the presence of member functions and inlining. With inlining, for example, once we’ve found the function whose range contains our PC, we’ll need to recurse over the children of that DIE to see if there are any inlined functions which are a better match. I won’t deal with inlining in my code for this debugger, but you can add support for this if you like. + +### How do I set a breakpoint on a function? + +Again, this depends on if you want to support member functions, namespaces and suchlike. For free functions you can just iterate over the functions in different compile units until you find one with the right name. If your compiler is kind enough to fill in the `.debug_pubnames` section, you can do this a lot more efficiently. + +Once the function has been found, you can set a breakpoint on the memory address given by `DW_AT_low_pc`. However, that’ll break at the start of the function prologue, but it’s preferable to break at the start of the user code. Since the line table information can specify the memory address which specifies the prologue end, you could just lookup the value of `DW_AT_low_pc` in the line table, then keep reading until you get to the entry marked as the prologue end. Some compilers won’t output this information though, so another option is to just set a breakpoint on the address given by the second line entry for that function. + +Say we want to set a breakpoint on `main` in our example program. We search for the function called `main`, and get this DIE: + +``` +< 1><0x0000002e> DW_TAG_subprogram + DW_AT_low_pc 0x00400670 + DW_AT_high_pc 0x0040069c + DW_AT_frame_base DW_OP_reg6 + DW_AT_name main + DW_AT_decl_file 0x00000001 /super/secret/path/MiniDbg/examples/variable.cpp + DW_AT_decl_line 0x00000001 + DW_AT_type <0x00000077> + DW_AT_external yes(1) + +``` + +This tells us that the function begins at `0x00400670`. If we look this up in our line table, we get this entry: + +``` +0x00400670 [ 1, 0] NS uri: "/super/secret/path/MiniDbg/examples/variable.cpp" + +``` + +We want to skip the prologue, so we read ahead an entry: + +``` +0x00400676 [ 2,10] NS PE + +``` + +Clang has included the prologue end flag on this entry, so we know to stop here and set a breakpoint on address `0x00400676`. + +### How do I read the contents of a variable? + +Reading variables can be very complex. They are elusive things which can move around throughout a function, sit in registers, be placed in memory, be optimised out, hide in the corner, whatever. Fortunately our simple example is, well, simple. If we want to read the contents of variable `a`, we have a look at its `DW_AT_location` attribute: + +``` +DW_AT_location DW_OP_fbreg -8 + +``` + +This says that the contents are stored at an offset of `-8` from the base of the stack frame. To work out where this base is, we look at the `DW_AT_frame_base` attribute on the containing function. + +``` +DW_AT_frame_base DW_OP_reg6 + +``` + +`reg6` on x86 is the frame pointer register, as specified by the [System V x86_64 ABI][10]. Now we read the contents of the frame pointer, subtract 8 from it, and we’ve found our variable. If we actually want to make sense of the thing, we’ll need to look at its type: + +``` +< 2><0x0000004c> DW_TAG_variable + DW_AT_name a + DW_AT_type <0x0000007e> + +``` + +If we look up this type in the debug information, we get this DIE: + +``` +< 1><0x0000007e> DW_TAG_base_type + DW_AT_name long int + DW_AT_encoding DW_ATE_signed + DW_AT_byte_size 0x00000008 + +``` + +This tells us that the type is a 8 byte (64 bit) signed integer type, so we can go ahead and interpret those bytes as an `int64_t` and display it to the user. + +Of course, types can get waaaaaaay more complex than that, as they have to be able to express things like C++ types, but this gives you a basic idea of how they work. + +Coming back to that frame base for a second, Clang was nice enough to track the frame base with the frame pointer register. Recent versions of GCC tend to prefer `DW_OP_call_frame_cfa`, which involves parsing the `.eh_frame` ELF section, and that’s an entirely different article which I won’t be writing. If you tell GCC to use DWARF 2 instead of more recent versions, it’ll tend to output location lists, which are somewhat easier to read: + +``` +DW_AT_frame_base + low-off : 0x00000000 addr 0x00400696 high-off 0x00000001 addr 0x00400697>DW_OP_breg7+8 + low-off : 0x00000001 addr 0x00400697 high-off 0x00000004 addr 0x0040069a>DW_OP_breg7+16 + low-off : 0x00000004 addr 0x0040069a high-off 0x00000031 addr 0x004006c7>DW_OP_breg6+16 + low-off : 0x00000031 addr 0x004006c7 high-off 0x00000032 addr 0x004006c8>DW_OP_breg7+8 + +``` + +A location list gives different locations depending on where the program counter is. This example says that if the PC is at an offset of `0x0` from `DW_AT_low_pc` then the frame base is an offset of 8 away from the value stored in register 7, if it’s between `0x1` and `0x4` away, then it’s at an offset of 16 away from the same, and so on. + +* * * + +### Take a breath + +That’s a lot of information to get your head round, but the good news is that in the next few posts we’re going to have a library do the hard work for us. It’s still useful to understand the concepts at play, particularly when something goes wrong or when you want to support some DWARF concept which isn’t implemented in whatever DWARF library you use. + +If you want to learn more about DWARF, then you can grab the standard [here][11]. At the time of writing, DWARF 5 has just been released, but DWARF 4 is more commonly supported. + +-------------------------------------------------------------------------------- + +via: https://blog.tartanllama.xyz/c++/2017/04/05/writing-a-linux-debugger-elf-dwarf/ + +作者:[ TartanLlama ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.twitter.com/TartanLlama +[1]:https://blog.tartanllama.xyz/2017/03/21/writing-a-linux-debugger-setup/ +[2]:https://blog.tartanllama.xyz/c++/2017/03/24/writing-a-linux-debugger-breakpoints/ +[3]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/ +[4]:https://blog.tartanllama.xyz/c++/2017/04/05/writing-a-linux-debugger-elf-dwarf/ +[5]:https://blog.tartanllama.xyz/c++/2017/04/24/writing-a-linux-debugger-source-signal/ +[6]:https://blog.tartanllama.xyz/c++/2017/05/06/writing-a-linux-debugger-dwarf-step/ +[7]:https://github.com/corkami/pics/raw/master/binary/elf101/elf101-64.pdf +[8]:http://www.skyfree.org/linux/references/ELF_Format.pdf +[9]:http://www.dwarfstd.org/doc/Debugging%20using%20DWARF-2012.pdf +[10]:https://www.uclibc.org/docs/psABI-x86_64.pdf +[11]:http://dwarfstd.org/Download.php From fe37d4be6d01bfb91b91b7854a5f5e177758b06f Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 21:08:17 +0800 Subject: [PATCH 0170/1407] =?UTF-8?q?20170521-16=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... Accelerating your C++ on GPU with SYCL.md | 356 ++++++++++++++++++ 1 file changed, 356 insertions(+) create mode 100644 sources/tech/20170519 Accelerating your C++ on GPU with SYCL.md diff --git a/sources/tech/20170519 Accelerating your C++ on GPU with SYCL.md b/sources/tech/20170519 Accelerating your C++ on GPU with SYCL.md new file mode 100644 index 0000000000..ec0e646199 --- /dev/null +++ b/sources/tech/20170519 Accelerating your C++ on GPU with SYCL.md @@ -0,0 +1,356 @@ +Accelerating your C++ on GPU with SYCL +============================================================ + + +### WARNING: This is an incomplete draft. There are likely many mistaeks and unfinished sections. + +* * * + + Leveraging the power of graphics cards for compute applications is all the rage right now in fields such as machine learning, computer vision and high-performance computing. Technologies like OpenCL expose this power through a hardware-independent programming model, allowing you to write code which abstracts over different architecture capabilities. The dream of this is “write once, run anywhere”, be it an Intel CPU, AMD discrete GPU, DSP, etc. Unfortunately, for everyday programmers, OpenCL has something of a steep learning curve; a simple Hello World program can be a hundred or so lines of pretty ugly-looking code. However, to ease this pain, the Khronos group have developed a new standard called [SYCL][4], which is a C++ abstraction layer on top of OpenCL. Using SYCL, you can develop these general-purpose GPU (GPGPU) applications in clean, modern C++ without most of the faff associated with OpenCL. Here’s a simple vector multiplication example written in SYCL using the parallel STL implementation: + +``` +#include +#include + +#include +#include +#include + +using namespace std::experimental::parallel; +using namespace sycl::helpers; + +int main() { + constexpr size_t array_size = 1024*512; + std::array a; + std::iota(begin(a),end(a),0); + + { + cl::sycl::buffer b(a.data(), cl::sycl::range<1>(a.size())); + cl::sycl::queue q; + sycl::sycl_execution_policy sycl_policy(q); + transform(sycl_policy, begin(b), end(b), begin(b), + [](int x) { return x*2; }); + } +} +``` + +For comparison, here’s a mostly equivalent version written in OpenCL using the C++ API (don’t spend much time reading this, just note that it looks ugly and is really long): + +``` +#include +#include +#include +#include + +int main(){ + std::vector all_platforms; + cl::Platform::get(&all_platforms); + if(all_platforms.size()==0){ + std::cout<<" No platforms found. Check OpenCL installation!\n"; + exit(1); + } + cl::Platform default_platform=all_platforms[0]; + + std::vector all_devices; + default_platform.getDevices(CL_DEVICE_TYPE_ALL, &all_devices); + if(all_devices.size()==0){ + std::cout<<" No devices found. Check OpenCL installation!\n"; + exit(1); + } + + cl::Device default_device=all_devices[0]; + cl::Context context({default_device}); + + cl::Program::Sources sources; + std::string kernel_code= + " void kernel mul2(global int* A){" + " A[get_global_id(0)]=A[get_global_id(0)]*2;" + " }"; + sources.push_back({kernel_code.c_str(),kernel_code.length()}); + + cl::Program program(context,sources); + if(program.build({default_device})!=CL_SUCCESS){ + std::cout<<" Error building: "<(default_device)<<"\n"; + exit(1); + } + + constexpr size_t array_size = 1024*512; + std::array a; + std::iota(begin(a),end(a),0); + + cl::Buffer buffer_A(context,CL_MEM_READ_WRITE,sizeof(int)*a.size()); + cl::CommandQueue queue(context,default_device); + + if (queue.enqueueWriteBuffer(buffer_A,CL_TRUE,0,sizeof(int)*a.size(),a.data()) != CL_SUCCESS) { + std::cout << "Failed to write memory;n"; + exit(1); + } + + cl::Kernel kernel_add = cl::Kernel(program,"mul2"); + kernel_add.setArg(0,buffer_A); + + if (queue.enqueueNDRangeKernel(kernel_add,cl::NullRange,cl::NDRange(a.size()),cl::NullRange) != CL_SUCCESS) { + std::cout << "Failed to enqueue kernel\n"; + exit(1); + } + + if (queue.finish() != CL_SUCCESS) { + std::cout << "Failed to finish kernel\n"; + exit(1); + } + + if (queue.enqueueReadBuffer(buffer_A,CL_TRUE,0,sizeof(int)*a.size(),a.data()) != CL_SUCCESS) { + std::cout << "Failed to read result\n"; + exit(1); + } +} +``` + +In this post I’ll give an introduction on using SYCL to accelerate your C++ code on the GPU. + +* * * + +### Lightning intro to GPGPU + +Before I get started on how to use SYCL, I’ll give a brief outline of why you might want to run compute jobs on the GPU for those who are unfamiliar. I’ve you’ve already used OpenCL, CUDA or similar, feel free to skip ahead. + +The key difference between a GPU and a CPU is that, rather than having a small number of complex, powerful cores (1-8 for common consumer desktop hardware), a GPU has a huge number of small, simple processing elements. + +![CPU architecture](https://blog.tartanllama.xyz/assets/cpu.png) + +Above is a comically simplified diagram of a CPU with four cores. Each core has a set of registers and is attached to various levels of cache (some might be shared, some not), and then main memory. + +![GPU architecture](https://blog.tartanllama.xyz/assets/gpu.png) + +In the GPU, tiny processing elements are grouped into execution units. Each processing element has a bit of memory attached to it, and each execution unit has some memory shared between its processing elements. After that, there’s some GPU-wide memory, then the same main memory which the CPU uses. The elements within an execution unit execute in  _lockstep_ , where each element executes the same instruction on a different piece of data. + +There are many aspects of GPGPU programming which make it an entirely different beast to everyday CPU programming. For example, transferring data from main memory to the GPU is  _slow_ .  _Really_  slow. Like, kill all your performance and get you fired slow. Therefore, the tradeoff with GPU programming is to make as much of the ridiculously high throughput of your accelerator to hide the latency of shipping the data to and from it. + +There are other issues which might not be immediately apparent, like the cost of branching. Since the processing elements in an execution unit work in lockstep, nested branches which cause them to take different paths (divergent control flow) is a real problem. This is often solved by executing all branches for all elements and masking out the unneeded results. That’s a polynomial explosion in complexity based on the level of nesting, which is A Bad Thing ™. Of course, there are optimizations which can aid this, but the idea stands: simple assumptions and knowledge you bring from the CPU world might cause you big problems in the GPU world. + +Before we get back to SYCL, some short pieces of terminology. The  _host_  is the main CPU running on your machine which executes and the  _device_  is what will be running your OpenCL code. A device could be the same as the host, or it could be some accelerator sitting in your machine, a simulator, whatever. A  _kernel_  is a special function which is the entry point to the code which will run on your device. It will often be supplied with buffers for input and output data which have been set up by the host. + +* * * + +### Back to SYCL + +There are currently two implementations of SYCL available; “triSYCL”, an experimental open source version by Xilinx (mostly used as a testbed for the standard), and “ComputeCpp”, an industry-strength implementation by Codeplay[1][2] (currently in open beta). Only ComputeCpp supports execution of kernels on the GPU, so we’ll be using that in this post. + +Step 1 is to get ComputeCpp up and running on your machine. The main components are a runtime library which implements the SYCL API, and a Clang-based compiler which compiles both your host code and your device code. At the time of writing, Intel CPUs and some AMD GPUs are officially supported on Ubuntu and CentOS. It should be pretty easy to get it working on other Linux distributions (I got it running on my Arch system, for instance). Support for more hardware and operating systems is being worked on, so check the [supported platforms document][5] for an up-to-date list. The dependencies and components are listed [here][6]. You might also want to download the [SDK][7], which contains samples, documentation, build system integration files, and more. I’ll be using the [SYCL Parallel STL][8] in this post, so get that if you want to play along at home. + +Once you’re all set up, we can get GPGPUing! As noted in the introduction, my first sample used the SYCL parallel STL implementation. We’ll now take a look at how to write that code with bare SYCL. + +``` +#include + +#include +#include +#include + +int main() { + const size_t array_size = 1024*512; + std::array in,out; + std::iota(begin(in),end(in),0); + + cl::sycl::queue device_queue; + cl::sycl::range<1> n_items{array_size}; + cl::sycl::buffer in_buffer(in.data(), n_items); + cl::sycl::buffer out_buffer(out.data(), n_items); + + device_queue.submit([&](cl::sycl::handler &cgh) { + constexpr auto sycl_read = cl::sycl::access::mode::read_write; + constexpr auto sycl_write = cl::sycl::access::mode::write; + + auto in_accessor = in_buffer.get_access(cgh); + auto out_accessor = out_buffer.get_access(cgh); + + cgh.parallel_for(n_items, + [=](cl::sycl::id<1> wiID) { + out_accessor[wiID] = in_accessor[wiID]*2; + }); + }); + + device_queue.wait(); +} +``` + +I’ll break this down piece-by-piece. + +``` +#include +``` + +The first thing we do is include the SYCL header file, which will put the SYCL runtime library at our command. + +``` +const size_t array_size = 1024*512; +std::array in,out; +std::iota(begin(in),end(in),0); +``` + +Here we construct a large array of integers and initialize it with the numbers from `0` to `array_size-1` (this is what `std::iota` does). Note that we use `cl::sycl::cl_int` to ensure compatibility. + +``` +cl::sycl::queue device_queue; +``` + +Now we create our command queue. The command queue is where all work (kernels) will be enqueued before being dispatched to the device. There are many ways to customise the queue, such as providing a device to enqueue on or setting up asynchronous error handlers, but the default constructor will do for this example; it looks for a compatible GPU and falls back on the host CPU if it fails. + +``` +cl::sycl::range<1> n_items{array_size}; +``` + +Next we create a range, which describes the shape of the data which the kernel will be executing on. In our simple example, it’s a one-dimensional array, so we use `cl::sycl::range<1>`. If the data was two-dimensional we would use `cl::sycl::range<2>` and so on. Alongside `cl::sycl::range`, there is `cl::sycl::ndrange`, which allows you to specify work group sizes as well as an overall range, but we don’t need that for our example. + +``` +cl::sycl::buffer in_buffer(in.data(), n_items); +cl::sycl::buffer out_buffer(out.data(), n_items); +``` + +In order to control data sharing and transfer between the host and devices, SYCL provides a `buffer` class. We create two SYCL buffers to manage our input and output arrays. + +``` + device_queue.submit([&](cl::sycl::handler &cgh) {/*...*/}); +``` + +After setting up all of our data, we can enqueue our actual work. There are a few ways to do this, but a simple method for setting up a parallel execution is to call the `.submit` function on our queue. To this function we pass a  _command group functor_ [2][3] which will be executed when the runtime schedules that task. A command group handler sets up any last resources needed by the kernel and dispatches it. + +``` +constexpr auto sycl_read = cl::sycl::access::mode::read_write; +constexpr auto sycl_write = cl::sycl::access::mode::write; + +auto in_accessor = in_buffer.get_access(cgh); +auto out_accessor = out_buffer.get_access(cgh); +``` + +In order to control access to our buffers and to tell the runtime how we will be using the data, we need to create  _accessors_ . It should be clear that we are creating one accessor for reading from `in_buffer`, and one accessor for writing to `out_buffer`. + +``` +cgh.parallel_for(n_items, + [=](cl::sycl::id<1> wiID) { + out_accessor[wiID] = in_accessor[wiID]*2; + }); +``` + +Now that we’ve done all the setup, we can actually do some computation on our device. Here we dispatch a kernel on the command group handler `cgh` over our range `n_items`. The actual kernel itself is a lambda which takes a work-item identifier and carries out our computation. In this case, we are reading from `in_accessor` at the index of our work-item identifier, multiplying it by `2`, then storing the result in the relevant place in `out_accessor`. That `` is an unfortunate byproduct of how SYCL needs to work within the confines of standard C++, so we need to give a unique class name to the kernel for the compiler to be able to do its job. + +``` +device_queue.wait(); +``` + +Our last line is kind of like calling `.join()` on a `std::thread`; it waits until the queue has executed all work which has been submitted. After this point, we could now access `out` and expect to see the correct results. Queues will also wait implicitly on destruction, so you could alternatively place it in some inner scope and let the synchronisation happen when the scope ends. + +There are quite a few new concepts at play here, but hopefully you can see the power and expressibility we get using these techniques. However, if you just want to toss some code at your GPU and not worry about the customisation, then you can use the SYCL Parallel STL implementation. + +* * * + +### SYCL Parallel STL + +The SYCL Parallel STL is an implementation of the Parallelism TS which dispatches your algorithm function objects as SYCL kernels. We already saw an example of this at the top of the page, so lets run through it quickly. + +``` +#include +#include + +#include +#include +#include + +using namespace std::experimental::parallel; +using namespace sycl::helpers; + +int main() { + constexpr size_t array_size = 1024*512; + std::array in,out; + std::iota(begin(in),end(in),0); + + { + cl::sycl::buffer in_buffer(in.data(), cl::sycl::range<1>(in.size())); + cl::sycl::buffer out_buffer(out.data(), cl::sycl::range<1>(out.size())); + cl::sycl::queue q; + sycl::sycl_execution_policy sycl_policy(q); + transform(sycl_policy, begin(in_buffer), end(in_buffer), begin(out_buffer), + [](int x) { return x*2; }); + } +} +``` + +``` + constexpr size_t array_size = 1024*512; + std::array in, out; + std::iota(begin(in),end(out),0); +``` + +So far, so similar. Again we’re creating a couple of arrays to hold our input and output data. + +``` +cl::sycl::buffer in_buffer(in.data(), cl::sycl::range<1>(in.size())); +cl::sycl::buffer out_buffer(out.data(), cl::sycl::range<1>(out.size())); +cl::sycl::queue q; +``` + +Here we are creating our buffers and our queue like in the last example. + +``` +sycl::sycl_execution_policy sycl_policy(q); +``` + +Here’s where things get interesting. We create a `sycl_execution_policy` from our queue and give it a name to use for the kernel. This execution policy can then be used like `std::execution::par` or `std::execution::seq`. + +``` +transform(sycl_policy, begin(in_buffer), end(in_buffer), begin(out_buffer), + [](int x) { return x*2; }); +``` + +Now our kernel dispatch looks like a call to `std::transform` with an execution policy provided. That closure we pass in will be compiled for and executed on the device without us having to do any more complex set up. + +Of course, you can do more than just `transform`. At the time of writing, the SYCL Parallel STL supports these algorithms: + +* `sort` + +* `transform` + +* `for_each` + +* `for_each_n` + +* `count_if` + +* `reduce` + +* `inner_product` + +* `transform_reduce` + +* * * + +That covers things for this short introduction. If you want to keep up to date with developments in SYCL, be sure to check out [sycl.tech][9]. Notable recent developments have been porting [Eigen][10] and [Tensorflow][11] to SYCL to bring expressive artificial intelligence programming to OpenCL devices. Personally, I’m excited to see how the high-level programming models can be exploited for automatic optimization of heterogeneous programs, and how they can support even higher-level technologies like [HPX][12] or [SkelCL][13]. + +1. I work for Codeplay, but this post was written in my own time with no suggestion from my employer. [↩][1] + +2. Hey, “functor” is in the spec, don’t @ me. + +-------------------------------------------------------------------------------- + +via: https://blog.tartanllama.xyz/c++/2017/05/19/sycl/ + +作者:[TartanLlama ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.twitter.com/TartanLlama +[1]:https://blog.tartanllama.xyz/c++/2017/05/19/sycl/#fnref:1 +[2]:https://blog.tartanllama.xyz/c++/2017/05/19/sycl/#fn:1 +[3]:https://blog.tartanllama.xyz/c++/2017/05/19/sycl/#fn:2 +[4]:https://www.khronos.org/sycl +[5]:https://www.codeplay.com/products/computesuite/computecpp/reference/platform-support-notes +[6]:https://www.codeplay.com/products/computesuite/computecpp/reference/release-notes/ +[7]:https://github.com/codeplaysoftware/computecpp-sdk +[8]:https://github.com/KhronosGroup/SyclParallelSTL +[9]:http://sycl.tech/ +[10]:https://github.com/ville-k/sycl_starter +[11]:http://deep-beta.co.uk/setting-up-tensorflow-with-opencl-using-sycl/ +[12]:https://github.com/STEllAR-GROUP/hpx +[13]:https://github.com/skelcl/skelcl From da4f695d2cba26dad8583eba8a8fa23ff97b32c3 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 21:14:22 +0800 Subject: [PATCH 0171/1407] =?UTF-8?q?20170521-16=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20170321 Writing A Linux Debugger Setup.md | 274 ++++++++++++++++++ 1 file changed, 274 insertions(+) create mode 100644 sources/tech/20170321 Writing A Linux Debugger Setup.md diff --git a/sources/tech/20170321 Writing A Linux Debugger Setup.md b/sources/tech/20170321 Writing A Linux Debugger Setup.md new file mode 100644 index 0000000000..8d5b3daf36 --- /dev/null +++ b/sources/tech/20170321 Writing A Linux Debugger Setup.md @@ -0,0 +1,274 @@ +Writing A Linux Debugger Setup +============================================================ _on March 21, 2017_ y— layout: post title: “Writing a Linux Debugger Part 1: Setup” category: c++ tags: + +* ### c++ + +Anyone who has written more than a hello world program should have used a debugger at some point (if you haven’t, drop what you’re doing and learn how to use one). However, although these tools are in such widespread use, there aren’t a lot of resources which tell you how they work and how to write one[1][6], especially when compared to other toolchain technologies like compilers. In this post series we’ll learn what makes debuggers tick and write one for debugging Linux programs. + +We’ll support the following features: + +* Launch, halt, and continue execution + +* Set breakpoints on + * Memory addresses + + * Source code lines + + * Function entry + +* Read and write registers and memory + +* Single stepping + * Instruction + + * Step in + + * Step out + + * Step over + +* Print current source location + +* Print backtrace + +* Print values of simple variables + +In the final part I’ll also outline how you could add the following to your debugger: + +* Remote debugging + +* Shared library and dynamic loading support + +* Expression evaluation + +* Multi-threaded debugging support + +I’ll be focusing on C and C++ for this project, but it should work just as well with any language which compiles down to machine code and outputs standard DWARF debug information (if you don’t know what that is yet, don’t worry, this will be covered soon). Additionally, my focus will be on just getting something up and running which works most of the time, so things like robust error handling will be eschewed in favour of simplicity. + +* * * + +### Series index + +These links will go live as the rest of the posts are released. + +1. [Setup][7] + +2. [Breakpoints][8] + +3. [Registers and memory][9] + +4. [Elves and dwarves][10] + +5. [Source and signals][11] + +6. [Source-level stepping][12] + +7. Source-level breakpoints + +8. Stack unwinding + +9. Reading variables + +10. Next steps + +* * * + +### Getting set up + +Before we jump into things, let’s get our environment set up. I’ll be using two dependencies in this tutorial: [Linenoise][13] for handling our command line input, and [libelfin][14] for parsing the debug information. You could use the more traditional libdwarf instead of libelfin, but the interface is nowhere near as nice, and libelfin also provides a mostly complete DWARF expression evaluator, which will save you a lot of time if you want to read variables. Make sure that you use the fbreg branch of my fork of libelfin, as it hacks on some extra support for reading variables on x86. + +Once you’ve either installed these on your system, or got them building as dependencies with whatever build system you prefer, it’s time to get started. I just set them to build along with the rest of my code in my CMake files. + +* * * + +### Launching the executable + +Before we actually debug anything, we’ll need to launch the debugee program. We’ll do this with the classic fork/exec pattern. + +``` +int main(int argc, char* argv[]) { + if (argc < 2) { + std::cerr << "Program name not specified"; + return -1; + } + + auto prog = argv[1]; + + auto pid = fork(); + if (pid == 0) { + //we're in the child process + //execute debugee + + } + else if (pid >= 1) { + //we're in the parent process + //execute debugger + } +``` + +We call `fork` and this causes our program to split into two processes. If we are in the child process, `fork` returns `0`, and if we are in the parent process, it returns the process ID of the child process. + +If we’re in the child process, we want to replace whatever we’re currently executing with the program we want to debug. + +``` + ptrace(PTRACE_TRACEME, 0, nullptr, nullptr); + execl(prog, prog, nullptr); +``` + +Here we have our first encounter with `ptrace`, which is going to become our best friend when writing our debugger. `ptrace` allows us to observe and control the execution of another process by reading registers, reading memory, single stepping and more. The API is very ugly; it’s a single function which you provide with an enumerator value for what you want to do, and then some arguments which will either be used or ignored depending on which value you supply. The signature looks like this: + +``` +long ptrace(enum __ptrace_request request, pid_t pid, + void *addr, void *data); +``` + +`request` is what we would like to do to the traced process; `pid` is the process ID of the traced process; `addr` is a memory address, which is used in some calls to designate an address in the tracee; and `data` is some request-specific resource. The return value often gives error information, so you probably want to check that in your real code; I’m just omitting it for brevity. You can have a look at the man pages for more information. + +The request we send in the above code, `PTRACE_TRACEME`, indicates that this process should allow its parent to trace it. All of the other arguments are ignored, because API design isn’t important /s. + +Next, we call `execl`, which is one of the many `exec` flavours. We execute the given program, passing the name of it as a command-line argument and a `nullptr` to terminate the list. You can pass any other arguments needed to execute your program here if you like. + +After we’ve done this, we’re finished with the child process; we’ll just let it keep running until we’re finished with it. + +* * * + +### Adding our debugger loop + +Now that we’ve launched the child process, we want to be able to interact with it. For this, we’ll create a `debugger` class, give it a loop for listening to user input, and launch that from our parent fork of our `main` function. + +``` +else if (pid >= 1) { + //parent + debugger dbg{prog, pid}; + dbg.run(); +} +``` + +``` +class debugger { +public: + debugger (std::string prog_name, pid_t pid) + : m_prog_name{std::move(prog_name)}, m_pid{pid} {} + + void run(); + +private: + std::string m_prog_name; + pid_t m_pid; +}; +``` + +In our `run` function, we need to wait until the child process has finished launching, then just keep on getting input from linenoise until we get an EOF (ctrl+d). + +``` +void debugger::run() { + int wait_status; + auto options = 0; + waitpid(m_pid, &wait_status, options); + + char* line = nullptr; + while((line = linenoise("minidbg> ")) != nullptr) { + handle_command(line); + linenoiseHistoryAdd(line); + linenoiseFree(line); + } +} +``` + +When the traced process is launched, it will be sent a `SIGTRAP` signal, which is a trace or breakpoint trap. We can wait until this signal is sent using the `waitpid` function. + +After we know the process is ready to be debugged, we listen for user input. The `linenoise`function takes a prompt to display and handles user input by itself. This means we get a nice command line with history and navigation commands without doing much work at all. When we get the input, we give the command to a `handle_command` function which we’ll write shortly, then we add this command to the linenoise history and free the resource. + +* * * + +### Handling input + +Our commands will follow a similar format to gdb and lldb. To continue the program, a user will type `continue` or `cont` or even just `c`. If they want to set a breakpoint on an address, they’ll write `break 0xDEADBEEF`, where `0xDEADBEEF` is the desired address in hexadecimal format. Let’s add support for these commands. + +``` +void debugger::handle_command(const std::string& line) { + auto args = split(line,' '); + auto command = args[0]; + + if (is_prefix(command, "continue")) { + continue_execution(); + } + else { + std::cerr << "Unknown command\n"; + } +} +``` + +`split` and `is_prefix` are a couple of small helper functions: + +``` +std::vector split(const std::string &s, char delimiter) { + std::vector out{}; + std::stringstream ss {s}; + std::string item; + + while (std::getline(ss,item,delimiter)) { + out.push_back(item); + } + + return out; +} + +bool is_prefix(const std::string& s, const std::string& of) { + if (s.size() > of.size()) return false; + return std::equal(s.begin(), s.end(), of.begin()); +} +``` + +We’ll add `continue_execution` to the `debugger` class. + +``` +void debugger::continue_execution() { + ptrace(PTRACE_CONT, m_pid, nullptr, nullptr); + + int wait_status; + auto options = 0; + waitpid(m_pid, &wait_status, options); +} +``` + +For now our `continue_execution` function will just use `ptrace` to tell the process to continue, then `waitpid` until it’s signalled. + +* * * + +### Finishing up + +Now you should be able to compile some C or C++ program, run it through your debugger, see it halting on entry, and be able to continue execution from your debugger. In the next part we’ll learn how to get our debugger to set breakpoints. If you come across any issues, please let me know in the comments! + +You can find the code for this post [here][15]. + +* * * + +1. Here are some pre-existing ones if you want other resources: [1][1] [2][2] [3][3] [4][4] [↩][5] + +-------------------------------------------------------------------------------- + +via: https://blog.tartanllama.xyz/2017/03/21/writing-a-linux-debugger-setup/ + +作者:[TartanLlama ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.twitter.com/TartanLlama +[1]:http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1 +[2]:https://t-a-w.blogspot.co.uk/2007/03/how-to-code-debuggers.html +[3]:https://www.codeproject.com/Articles/43682/Writing-a-basic-Windows-debugger +[4]:http://system.joekain.com/debugger/ +[5]:https://blog.tartanllama.xyz/2017/03/21/writing-a-linux-debugger-setup/#fnref:1 +[6]:https://blog.tartanllama.xyz/2017/03/21/writing-a-linux-debugger-setup/#fn:1 +[7]:https://blog.tartanllama.xyz/2017/03/21/writing-a-linux-debugger-setup/ +[8]:https://blog.tartanllama.xyz/c++/2017/03/24/writing-a-linux-debugger-breakpoints/ +[9]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/ +[10]:https://blog.tartanllama.xyz/c++/2017/04/05/writing-a-linux-debugger-elf-dwarf/ +[11]:https://blog.tartanllama.xyz/c++/2017/04/24/writing-a-linux-debugger-source-signal/ +[12]:https://blog.tartanllama.xyz/c++/2017/05/06/writing-a-linux-debugger-dwarf-step/ +[13]:https://github.com/antirez/linenoise +[14]:https://github.com/TartanLlama/libelfin/tree/fbreg +[15]:https://github.com/TartanLlama/minidbg/tree/tut_setup From c13bff0ba9c7384ffbcda0cbeba93dc9c7d15473 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 21:17:25 +0800 Subject: [PATCH 0172/1407] =?UTF-8?q?20170521-17=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...Mail Services to Samba4 AD DC – Part 11.md | 358 ++++++++++++++++++ 1 file changed, 358 insertions(+) create mode 100644 sources/tech/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md diff --git a/sources/tech/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md b/sources/tech/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md new file mode 100644 index 0000000000..d6db5b482c --- /dev/null +++ b/sources/tech/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md @@ -0,0 +1,358 @@ +How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11 +============================================================ + + + +In this tutorial will learn how to modify iRedMail main daemons which provide mail services, respectively, [Postfix used for mail transfer and Dovecot][4] which delivers mail to accounts mailboxes, in order to integrate them both in [Samba4 Active Directory Domain Controller][5]. + +By integrating iRedMail to a Samba4 AD DC you will benefit from the following features: user authentication, management, and status via Samba AD DC, create mail lists with the help of AD groups and Global LDAP Address Book in Roundcube. + +#### Requirements + +1. [Install iRedMail on CentOS 7 for Samba4 AD Integration][1] + +### Step 1: Prepare iRedMail System for Sama4 AD Integration + +1. On the first step, you need to [assign a static IP address for your machine][6] in case you’re using a dynamic IP address provided by a DHCP server. + +Run [ifconfig command][7] to list your machine network interfaces names and edit the proper network interface with your custom IP settings by issuing [nmtui-edit][8] command against the correct NIC. + +Run nmtui-edit command with root privileges. + +``` +# ifconfig +# nmtui-edit eno16777736 +``` + [![Find Network Interface Name](https://www.tecmint.com/wp-content/uploads/2017/05/Find-Network-Interface-Name.png)][9] + +Find Network Interface Name + +2. Once the network interface is opened for editing, add the proper static IP settings, make sure you add the DNS servers IP addresses of your Samba4 AD DC and the name of your domain in order to query the realm from your machine. Use the below screenshot as a guide. + + [![Configure Network Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Configure-Network-Settings.png)][10] + +Configure Network Settings + +3. After you finish configuring the network interface, restart the network daemon to apply changes and issue a series of ping commands against the domain name and samba4 domain controllers FQDNs. + +``` +# systemctl restart network.service +# cat /etc/resolv.conf # verify DNS resolver configuration if the correct DNS servers IPs are queried for domain resolution +# ping -c2 tecmint.lan # Ping domain name +# ping -c2 adc1 # Ping first AD DC +# ping -c2 adc2 # Ping second AD DC +``` + [![Verify Network DNS Configuration](https://www.tecmint.com/wp-content/uploads/2017/05/Verify-Network-DNS-Configuration.png)][11] + +Verify Network DNS Configuration + +4. Next, sync time with samba domain controller by installing the ntpdate package and query Samba4 machine NTP server by issuing the below commands: + +``` +# yum install ntpdate +# ntpdate -qu tecmint.lan # querry domain NTP servers +# ntpdate tecmint.lan # Sync time with the domain +``` + [![Sync Time with Samba NTP Server](https://www.tecmint.com/wp-content/uploads/2017/05/Sync-Time-with-Samba-NTP-Server.png)][12] + +Sync Time with Samba NTP Server + +5. You might want the local time to be automatically synchronized with samba AD time server. In order to achieve this setting, add a scheduled job to run every hour by issuing [crontab -e command][13] and append the following line: + +``` +0 */1 * * * /usr/sbin/ntpdate tecmint.lan > /var/log/ntpdate.lan 2>&1 +``` + [![Auto Sync Time with Samba NTP](https://www.tecmint.com/wp-content/uploads/2017/05/Auto-Sync-Time-with-Samba-NTP.png)][14] + +Auto Sync Time with Samba NTP + +### Step 2: Prepare Samba4 AD DC for iRedMail Integration + +6. Now, move to a [Windows machine with RSAT tools installed][15] to manage Samba4 Active Directory as described in this tutorial [here][16]. + +Open DNS Manager, go to your domain Forward Lookup Zones and add a new A record, an MX record and a PTR record to point to your iRedMail system IP address. Use the below screenshots as a guide. + +Add A record (replace the name and the IP Address of iRedMail machine accordingly). + + [![Create DNS A Record for iRedMail](https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-A-Record-for-iRedMail.png)][17] + +Create DNS A Record for iRedMail + +Add MX record (leave child domain blank and add a 10 priority for this mail server). + + [![Create DNS MX Record for iRedMail](https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-MX-Record-for-iRedMail.png)][18] + +Create DNS MX Record for iRedMail + +Add PTR record by expanding to Reverse Lookup Zones (replace IP address of iRedMail server accordingly). In case you haven’t configured a reverse zone for your domain controller so far, read the following tutorial: + +1. [Manage Samba4 DNS Group Policy from Windows][2] + + [![Create DNS PTR Record for iRedMail](https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-PTR-Record-for-iRedMail.png)][19] + +Create DNS PTR Record for iRedMail + +7. After you’ve added the basic DNS records which make a mail server to function properly, move to the iRedMail machine, install bind-utils package and query the newly added mail records as suggested on the below excerpt. + +Samba4 AD DC DNS server should respond with the DNS records added in the previous step. + +``` +# yum install bind-utils +# host tecmint.lan +# host mail.tecmint.lan +# host 192.168.1.245 +``` + [![Install Bind and Query Mail Records](https://www.tecmint.com/wp-content/uploads/2017/05/Install-Bind-and-Query-Mail-Records.png)][20] + +Install Bind and Query Mail Records + +From a Windows machine, open a Command Prompt window and issue [nslookup command][21] against the above mail server records. + +8. As a final pre-requirement, create a new user account with minimal privileges in Samba4 AD DC with the name vmail, choose a strong password for this user and make sure the password for this user never expires. + +The vmail user account will be used by iRedMail services to query Samba4 AD DC LDAP database and pull the email accounts. + +To create the vmail account, use ADUC graphical tool from a Windows machine joined to the realm with RSAT tools installed as illustrated on the below screenshots or use samba-tool command line directly from a domain controller as explained on the following topic. + +1. [Manage Samba4 Active Directory from Linux Command Line][3] + +In this guide, we’ll use the first method mentioned above. + + [![Active Directory Users and Computers](https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-Users-and-Computers.png)][22] + +Active Directory Users and Computers + + [![Create New User for iRedMail](https://www.tecmint.com/wp-content/uploads/2017/05/Create-New-User-for-iRedMail.png)][23] + +Create New User for iRedMail + + [![Set Strong Password for User](https://www.tecmint.com/wp-content/uploads/2017/05/Set-Strong-Password-for-User.png)][24] + +Set Strong Password for User + +9. From iRedMail system, test the vmail user ability to query Samba4 AD DC LDAP database by issuing the below command. The returned result should be a total number of objects entries for your domain as illustrated on the below screenshots. + +``` +# ldapsearch -x -h tecmint.lan -D 'vmail@tecmint.lan' -W -b 'cn=users,dc=tecmint,dc=lan' +``` + +Note: Replace the domain name and the LDAP base dn in Samba4 AD (‘cn=users,dc=tecmint,dc=lan‘) accordingly. + + [![Query Samba4 AD DC LDAP](https://www.tecmint.com/wp-content/uploads/2017/05/Query-Samba4-AD-DC-LDAP.png)][25] + +Query Samba4 AD DC LDAP + +### Step 3: Integrate iRedMail Services to Samba4 AD DC + +10. Now it’s time to tamper with iRedMail services (Postfix, Dovecot and Roundcube) in order to query Samba4 Domain Controller for mail accounts. + +The first service to be modified will be the MTA agent, Postfix. Issue the following commands to disable a series of MTA settings, add your domain name to Postfix local domain and mailbox domains and use Dovecot agent to deliver received mails locally to user mailboxes. + +``` +# postconf -e virtual_alias_maps=' ' +# postconf -e sender_bcc_maps=' ' +# postconf -e recipient_bcc_maps= ' ' +# postconf -e relay_domains=' ' +# postconf -e relay_recipient_maps=' ' +# postconf -e sender_dependent_relayhost_maps=' ' +# postconf -e smtpd_sasl_local_domain='tecmint.lan' #Replace with your own domain +# postconf -e virtual_mailbox_domains='tecmint.lan' #Replace with your own domain +# postconf -e transport_maps='hash:/etc/postfix/transport' +# postconf -e smtpd_sender_login_maps='proxy:ldap:/etc/postfix/ad_sender_login_maps.cf' # Check SMTP senders +# postconf -e virtual_mailbox_maps='proxy:ldap:/etc/postfix/ad_virtual_mailbox_maps.cf' # Check local mail accounts +# postconf -e virtual_alias_maps='proxy:ldap:/etc/postfix/ad_virtual_group_maps.cf' # Check local mail lists +# cp /etc/postfix/transport /etc/postfix/transport.backup # Backup transport conf file +# echo "tecmint.lan dovecot" > /etc/postfix/transport # Add your domain with dovecot transport +# cat /etc/postfix/transport # Verify transport file +# postmap hash:/etc/postfix/transport +``` + +11. Next, create Postfix `/etc/postfix/ad_sender_login_maps.cf` configuration file with your favorite text editor and add the below configuration. + +``` +server_host = tecmint.lan +server_port = 389 +version = 3 +bind = yes +start_tls = no +bind_dn = vmail@tecmint.lan +bind_pw = ad_vmail_account_password +search_base = dc=tecmint,dc=lan +scope = sub +query_filter = (&(userPrincipalName=%s)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) +result_attribute= userPrincipalName +debuglevel = 0 +``` + +12. Create `/etc/postfix/ad_virtual_mailbox_maps.cf` with the following configuration. + +``` +server_host = tecmint.lan +server_port = 389 +version = 3 +bind = yes +start_tls = no +bind_dn = vmail@tecmint.lan +bind_pw = ad_vmail_account_password +search_base = dc=tecmint,dc=lan +scope = sub +query_filter = (&(objectclass=person)(userPrincipalName=%s)) +result_attribute= userPrincipalName +result_format = %d/%u/Maildir/ +debuglevel = 0 +``` + +13. Create `/etc/postfix/ad_virtual_group_maps.cf` with the below configuration. + +``` +server_host = tecmint.lan +server_port = 389 +version = 3 +bind = yes +start_tls = no +bind_dn = vmail@tecmint.lan +bind_pw = ad_vmail_account_password +search_base = dc=tecmint,dc=lan +scope = sub +query_filter = (&(objectClass=group)(mail=%s)) +special_result_attribute = member +leaf_result_attribute = mail +result_attribute= userPrincipalName +debuglevel = 0 +``` + +On all three configuration files replace the values from server_host, bind_dn, bind_pw and search_base to reflect your own domain custom settings. + +14. Next, open Postfix main configuration file and search and disable iRedAPD check_policy_service and smtpd_end_of_data_restrictions by adding a comment `#` in front of the following lines. + +``` +# nano /etc/postfix/main.cf +``` + +Comment the following lines: + +``` +#check_policy_service inet:127.0.0.1:7777 +#smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:7777 +``` + +15. Now, verify Postfix binding to Samba AD using an existing domain user and a domain group by issuing a series of queries as presented in the following examples. + +The result should be similar as illustrated on the bellow screenshot. + +``` +# postmap -q tecmint_user@tecmint.lan ldap:/etc/postfix/ad_virtual_mailbox_maps.cf +# postmap -q tecmint_user@tecmint.lan ldap:/etc/postfix/ad_sender_login_maps.cf +# postmap -q linux_users@tecmint.lan ldap:/etc/postfix/ad_virtual_group_maps.cf +``` + [![Verify Postfix Binding to Samba AD](https://www.tecmint.com/wp-content/uploads/2017/05/Verify-Postfix-Binding-to-Samba-AD.png)][26] + +Verify Postfix Binding to Samba AD + +Replace AD user and group accounts accordingly. Also, assure that the AD group you’re using has some AD users members assigned to it. + +16. On the next step modify Dovecot configuration file in order to query Samba4 AD DC. Open file `/etc/dovecot/dovecot-ldap.conf` for editing and add the following lines. + +``` +hosts = tecmint.lan:389 +ldap_version = 3 +auth_bind = yes +dn = vmail@tecmint.lan +dnpass = ad_vmail_password +base = dc=tecmint,dc=lan +scope = subtree +deref = never +user_filter = (&(userPrincipalName=%u)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) +pass_filter = (&(userPrincipalName=%u)(objectClass=person)(!(userAccountControl:1.2.840.113556.1.4.803:=2))) +pass_attrs = userPassword=password +default_pass_scheme = CRYPT +user_attrs = =home=/var/vmail/vmail1/%Ld/%Ln/Maildir/,=mail=maildir:/var/vmail/vmail1/%Ld/%Ln/Maildir/ +``` + +The mailbox of a Samba4 AD account will be stored in /var/vmail/vmail1/your_domain.tld/your_domain_user/Maildir/ location on the Linux system. + +17. Make sure pop3 and imap protocols are enabled in dovecot main configuration file. Verify if quota and acl mail plugins are also enabled by opening file `/etc/dovecot/dovecot.conf` and check if these values are present. + + [![Enable Pop3 and Imap in Dovecot](https://www.tecmint.com/wp-content/uploads/2017/05/Enable-Pop3-Imap-in-Dovecot.png)][27] + +Enable Pop3 and Imap in Dovecot + +18. Optionally, if you want to set a global hard quota to not exceed the maximum of 500 MB of storage for each domain user, add the following line in /etc/dovecot/dovecot.conf file. + +``` +quota_rule = *:storage=500M +``` + +19. Finally, in order to apply all changes made so far, restart and verify the status of Postfix and Dovecot daemons by issuing the below commands with root privileges. + +``` +# systemctl restart postfix dovecot +# systemctl status postfix dovecot +``` + +20. In order to test mail server configuration from the command line using IMAP protocol use telnet or [netcat command][28] as presented in the below example. + +``` +# nc localhost 143 +a1 LOGIN ad_user@your_domain.tld ad_user_password +a2 LIST “” “*” +a3 LOGOUT +``` + [![Test iRedMail Configuration](https://www.tecmint.com/wp-content/uploads/2017/05/Test-iRedMail-Configuration.png)][29] + +Test iRedMail Configuration + +If you can perform an IMAP login from the command line with a Samba4 user account then iRedMail server seems ready to send and receive mail for Active Directory accounts. + +On the next tutorial will discuss how to integrate Roundcube webmail with Samba4 AD DC and enable Global LDAP Address Book, customize Roudcube, access Roundcube web interface from a browser and disable some unneeded iRedMail services. + +-------------------------------------------------------------------------------- + +作者简介: + +I'am a computer addicted guy, a fan of open source and linux based system software, have about 4 years experience with Linux distributions desktop, servers and bash scripting. + + +----- + +via: https://www.tecmint.com/integrate-iredmail-to-samba4-ad-dc-on-centos-7/ + +作者:[ Matei Cezar][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/cezarmatei/ +[1]:https://www.tecmint.com/install-iredmail-on-centos-7-for-samba4-ad-integration/ +[2]:https://www.tecmint.com/manage-samba4-dns-group-policy-from-windows/ +[3]:https://www.tecmint.com/manage-samba4-active-directory-linux-command-line/ +[4]:https://www.tecmint.com/setup-postfix-mail-server-and-dovecot-with-mariadb-in-centos/ +[5]:https://www.tecmint.com/install-samba4-active-directory-ubuntu/ +[6]:https://www.tecmint.com/set-add-static-ip-address-in-linux/ +[7]:https://www.tecmint.com/ifconfig-command-examples/ +[8]:https://www.tecmint.com/configure-network-connections-using-nmcli-tool-in-linux/ +[9]:https://www.tecmint.com/wp-content/uploads/2017/05/Find-Network-Interface-Name.png +[10]:https://www.tecmint.com/wp-content/uploads/2017/05/Configure-Network-Settings.png +[11]:https://www.tecmint.com/wp-content/uploads/2017/05/Verify-Network-DNS-Configuration.png +[12]:https://www.tecmint.com/wp-content/uploads/2017/05/Sync-Time-with-Samba-NTP-Server.png +[13]:https://www.tecmint.com/11-cron-scheduling-task-examples-in-linux/ +[14]:https://www.tecmint.com/wp-content/uploads/2017/05/Auto-Sync-Time-with-Samba-NTP.png +[15]:https://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/ +[16]:https://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/ +[17]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-A-Record-for-iRedMail.png +[18]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-MX-Record-for-iRedMail.png +[19]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-PTR-Record-for-iRedMail.png +[20]:https://www.tecmint.com/wp-content/uploads/2017/05/Install-Bind-and-Query-Mail-Records.png +[21]:https://www.tecmint.com/8-linux-nslookup-commands-to-troubleshoot-dns-domain-name-server/ +[22]:https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-Users-and-Computers.png +[23]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-New-User-for-iRedMail.png +[24]:https://www.tecmint.com/wp-content/uploads/2017/05/Set-Strong-Password-for-User.png +[25]:https://www.tecmint.com/wp-content/uploads/2017/05/Query-Samba4-AD-DC-LDAP.png +[26]:https://www.tecmint.com/wp-content/uploads/2017/05/Verify-Postfix-Binding-to-Samba-AD.png +[27]:https://www.tecmint.com/wp-content/uploads/2017/05/Enable-Pop3-Imap-in-Dovecot.png +[28]:https://www.tecmint.com/check-remote-port-in-linux/ +[29]:https://www.tecmint.com/wp-content/uploads/2017/05/Test-iRedMail-Configuration.png +[30]:https://www.tecmint.com/author/cezarmatei/ +[31]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[32]:https://www.tecmint.com/free-linux-shell-scripting-books/ From 8d5026cd4fc7e29f425ed39b64a3d99c58cebbbb Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 21:18:44 +0800 Subject: [PATCH 0173/1407] =?UTF-8?q?20170521-18=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...l Roundcube with Samba4 AD DC – Part 12.md | 281 ++++++++++++++++++ 1 file changed, 281 insertions(+) create mode 100644 sources/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md diff --git a/sources/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md b/sources/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md new file mode 100644 index 0000000000..e6d69c3a7b --- /dev/null +++ b/sources/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md @@ -0,0 +1,281 @@ +How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12 +============================================================ + +by [Matei Cezar][15] | Published: May 13, 2017 | Last Updated: May 14, 2017 + + Download Your Free eBooks NOW - [10 Free Linux eBooks for Administrators][16] | [4 Free Shell Scripting eBooks][17] + +[Roundcube][3], one of the most used webmail user agent in Linux, offers a modern web interface for end users to interact with all mail services in order to read, compose and send e-mails. Roundcube supports a variety of mail protocols, including the secured ones, such IMAPS, POP3S or submission. + +In this topic we’ll discuss how to configure Roundcube in iRedMail with IMAPS and submission secured ports to retrieve and send emails for Samba4 AD accounts, how to access iRedMail Roundcube web interface from a browser and add a web address alias, how to enable Samba4 AD integration for Global LDAP Address Book and how to disable some unneeded iRedMail services. + +#### Requirements + +1. [How to Install iRedMail on CentOS 7 for Samba4 AD Integration][1] + +2. [Configure iRedMail on CentOS 7 for Samba4 AD Integration][2] + +### Step 1: Declare E-mail Address for Domain Accounts in Samba4 AD DC + +1. In order send and receive mail for Samba4 AD DC domain accounts, you need to edit each user account and explicitly set email filed with the proper e-mail address by opening ADUC tool from a [Windows machine with RSAT tools installed][4] and joined to Samba4 AD as illustrated in the below image. + + [![Add Email Account to Join Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-User-and-Computers.jpg)][5] + +Add Email Account to Join Samba4 AD DC + +2. Similarly, to use mail lists, you need to create groups in ADUC, add the corresponding e-mail address for each group and assign the proper user accounts as members of the group. + +With this setup created as a mail list, all members mailboxes of a Samba4 AD group will receive mail destined for an AD group e-mail address. Use the below screenshots as a guide to declare e-mail filed for a Samba4 group account and add domain users as members of the group. + +Make sure all accounts members added to a group have their e-mail address declared. + + [![Create Group Admin for Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/05/Create-Group-Admin-for-Samba4-AD-DC.png)][6] + +Create Group Admin for Samba4 AD DC + + [![Add Users to Group](https://www.tecmint.com/wp-content/uploads/2017/05/Add-Users-to-Group.png)][7] + +Add Users to Group + +In this example, all mails sent to admins@tecmint.lan e-mail address declared for ‘Domain Admins’ group will be received by each member mailbox of this group. + +3. An alternative method that you can use to declare the e-mail address for a Samba4 AD account is by creating a user or a group with samba-tool command line directly from one of the AD DC console and specify the e-mail address with the `--mail-address` flag. + +Use one of the following command syntax to create a user with e-mail address specified: + +``` +# samba-tool user add --mail-address=user_email@domain.tld --surname=your_surname --given-name=your_given_name your_ad_user +``` + +Create a group with e-mail address specified: + +``` +# samba-tool group add --mail-address=group_email@domain.tld your_ad_group +``` + +To add members to a group: + +``` +# samba-tool group addmembers your_group user1,user2,userX +``` + +To list all available samba-tool command fields for a user or a group use the following syntax: + +``` +# samba-tool user add -h +# samba-tool group add -h +``` + +### Step 3: Secure Roundcube Webmail + +4. Before modifying Roundcube configuration file, first, use [netstat command][8] piped through egrep filter to list the sockets that [Dovecot and Postfix][9] listen to and assure that the properly secured ports (993 for IMAPS and 587 for submission) are active and enabled. + +``` +# netstat -tulpn| egrep 'dovecot|master' +``` + +5. To enforce mail reception and transfer between Roundcube and iRedMail services on secured IMAP and SMTP ports, open Roundcube configuration file located in /var/www/roundcubemail/config/config.inc.php and make sure you change the following lines, for localhost in this case, as shown in the below excerpt: + +``` +// For IMAPS +$config['default_host'] = 'ssl://127.0.0.1'; +$config['default_port'] = 993; +$config['imap_auth_type'] = 'LOGIN'; +// For SMTP +$config['smtp_server'] = 'tls://127.0.0.1'; +$config['smtp_port'] = 587; +$config['smtp_user'] = '%u'; +$config['smtp_pass'] = '%p'; +$config['smtp_auth_type'] = 'LOGIN'; +``` + +This setup is highly recommended in case Roudcube is installed on a remote host than the one that provides mail services (IMAP, POP3 or SMTP daemons). + +6. Next, don’t close the configuration file, search and make the following small changes in order for Roundcube to be visited only via HTTPS protocol, to hide the version number and to automatically append the domain name for accounts who login in the web interface. + +``` +$config['force_https'] = true; +$config['useragent'] = 'Your Webmail'; // Hide version number +$config['username_domain'] = 'domain.tld' +``` + +7. Also, disable the following plugins: managesieve and password by adding a comment `(//)` in front of the line that starts with $config[‘plugins’]. + +Users will change their password from a Windows or Linux machine joined to Samba4 AD DC once they login and authenticate to the domain. A sysadmin will globally manage all sieve rules for domain accounts. + +``` +// $config['plugins'] = array('managesieve', 'password'); +``` + +8. Finally, save and close the configuration file and visit Roundcube Webmail by opening a browser and navigate to iRedMail IP address or FQDN/mail location via HTTPS protocol. + +The first time when you visit Roundcube an alert should appear on the browser due to the Self-Signed Certificate the web server uses. Accept the certificate and login with a Samba AD account credentials. + +``` +https://iredmail-FQDN/mail +``` + [![Roundcube Webmail Login](https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-Webmail-Login.png)][10] + +Roundcube Webmail Login + +### Step 3: Enable Samba AD Contacts in Roundcube + +9. To configure Samba AD Global LDAP Address Book to appear Roundcube Contacts, open Roundcube configuration file again for editing and make the following changes: + +Navigate to the bottom of the file and identify the section that begins with ‘# Global LDAP Address Book with AD’, delete all its content until the end of the file and replace it with the following code block: + +``` +# Global LDAP Address Book with AD. +# +$config['ldap_public']["global_ldap_abook"] = array( +'name' => 'tecmint.lan', +'hosts' => array("tecmint.lan"), +'port' => 389, +'use_tls' => false, +'ldap_version' => '3', +'network_timeout' => 10, +'user_specific' => false, +'base_dn' => "dc=tecmint,dc=lan", +'bind_dn' => "vmail@tecmint.lan", +'bind_pass' => "your_password", +'writable' => false, +'search_fields' => array('mail', 'cn', 'sAMAccountName', 'displayname', 'sn', 'givenName'), +'fieldmap' => array( +'name' => 'cn', +'surname' => 'sn', +'firstname' => 'givenName', +'title' => 'title', +'email' => 'mail:*', +'phone:work' => 'telephoneNumber', +'phone:mobile' => 'mobile', +'department' => 'departmentNumber', +'notes' => 'description', +), +'sort' => 'cn', +'scope' => 'sub', +'filter' => '(&(mail=*)(|(&(objectClass=user)(!(objectClass=computer)))(objectClass=group)))', +'fuzzy_search' => true, +'vlv' => false, +'sizelimit' => '0', +'timelimit' => '0', +'referrals' => false, +); +``` + +On this block of code replace name, hosts, base_dn, bind_dn and bind_pass values accordingly. + +10. After you’ve made all the required changes, save and close the file, login to Roundcube webmail interface and go to Address Book menu. + +Hit on your Global Address Book chosen name and a contact list of all domain accounts (users and groups) with their specified e-mail address should be visible. + + [![Roundcube User Contact List](https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-User-Contact-List.png)][11] + +Roundcube User Contact List + +### Step 4: Add an Alias for Roundcube Webmail Interface + +11. To visit Roundcube at a web address with the following form https://webmail.domain.tld instead of the old address provided by default by iRedMail you need to make the following changes. + +From a joined Windows machine with RSAT tools installed, open DNS Manager and add a new CNAME record for iRedMail FQDN, named webmail, as illustrated in the following image. + + [![DNS Webmail Properties](https://www.tecmint.com/wp-content/uploads/2017/05/DNS-Webmail-Properties.jpg)][12] + +DNS Webmail Properties + +12. Next, on iRedMail machine, open Apache web server SSL configuration file located in /etc/httpd/conf.d/ssl.conf and change DocumentRoot directive to point to /var/www/roundcubemail/ system path. + +file /etc/httpd/conf.d/ssl.conf excerpt: + +``` +DocumentRoot “/var/www/roundcubemail/” +``` + +Restart Apache daemon to apply changes. + +``` +# systemctl restart httpd +``` + +13. Now, point the browser to the following address and Roundcube interface should appear. Accept the Self-Signed Cerificate error to continue to login page. Replace domain.tld from this example with your own domain name. + +``` +https://webmail.domain.tld +``` + +### Step 5: Disable iRedMail Unused Services + +14. Since iRedMail daemons are configured to query Samba4 AD DC LDAP server for account information and other resources, you can safely stop and disable some local services on iRedMail machine, such as LDAP database server and iredpad service by issuing the following commands. + +``` +# systemctl stop slapd iredpad +# systemctl disable slapd iredpad +``` + +15. Also, disable some scheduled tasks performed by iRedMail, such as LDAP database backup and iRedPad tracking records by adding a comment (#) in front of each line from crontab file as illustrated on the below screenshot. + +``` +# crontab -e +``` + [![Disable iRedMail Tasks](https://www.tecmint.com/wp-content/uploads/2017/05/Disable-iRedMail-Tasks.png)][13] + +Disable iRedMail Tasks + +### Step 6: Use Mail Alias in Postfix + +16. To redirect all locally generated mail (destined for postmaster and subsequently redirected to root account) to a specific Samba4 AD account, open Postfix aliases configuration file located in /etc/postfix/aliases and modify root line as follows: + +``` +root: your_AD_email_account@domain.tld +``` + +17. Apply the aliases configuration file so that Postfix can read it in its own format by executing newaliases command and test if the mail gets sent to the proper domain e-email account by issuing the following command. + +``` +# echo “Test mail” | mail -s “This is root’s email” root +``` + +18. After the mail has been sent, login to Roundcube webmail with the domain account you’ve setup for mail redirection and verify the previously sent mail should be received in your account Inbox. + + [![Verify User Mail](https://www.tecmint.com/wp-content/uploads/2017/05/Verify-User-Mail.png)][14] + +Verify User Mail + +That’all! Now, you have a fully working mail server integrated with Samba4 Active Directory. Domain accounts can send and receive mail for their internal domain or for other external domains. + +The configurations used in this tutorial can be successfully applied to integrate an iRedMail server to a Windows Server 2012 R2 or 2016 Active Directory. + +-------------------------------------------------------------------------------- + +作者简介: + +I'am a computer addicted guy, a fan of open source and linux based system software, have about 4 years experience with Linux distributions desktop, servers and bash scripting. + +----------- + + +via: https://www.tecmint.com/integrate-iredmail-roundcube-with-samba4-ad-dc/ + +作者:[ ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/cezarmatei/ +[1]:https://www.tecmint.com/install-iredmail-on-centos-7-for-samba4-ad-integration/ +[2]:https://www.tecmint.com/integrate-iredmail-to-samba4-ad-dc-on-centos-7/ +[3]:https://www.tecmint.com/install-and-configure-roundcube-webmail-for-postfix-mail-server/ +[4]:https://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/ +[5]:https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-User-and-Computers.jpg +[6]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-Group-Admin-for-Samba4-AD-DC.png +[7]:https://www.tecmint.com/wp-content/uploads/2017/05/Add-Users-to-Group.png +[8]:https://www.tecmint.com/20-netstat-commands-for-linux-network-management/ +[9]:https://www.tecmint.com/configure-postfix-and-dovecot-with-virtual-domain-users-in-linux/ +[10]:https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-Webmail-Login.png +[11]:https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-User-Contact-List.png +[12]:https://www.tecmint.com/wp-content/uploads/2017/05/DNS-Webmail-Properties.jpg +[13]:https://www.tecmint.com/wp-content/uploads/2017/05/Disable-iRedMail-Tasks.png +[14]:https://www.tecmint.com/wp-content/uploads/2017/05/Verify-User-Mail.png +[15]:https://www.tecmint.com/author/cezarmatei/ +[16]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[17]:https://www.tecmint.com/free-linux-shell-scripting-books/ From f805ab736f4aeca594c45aa3b676c4488bd74645 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 21:21:44 +0800 Subject: [PATCH 0174/1407] =?UTF-8?q?20170521-19=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...guage is a great choice for development.md | 218 ++++++++++++++++++ 1 file changed, 218 insertions(+) create mode 100644 sources/tech/20170519 5 reasons the D programming language is a great choice for development.md diff --git a/sources/tech/20170519 5 reasons the D programming language is a great choice for development.md b/sources/tech/20170519 5 reasons the D programming language is a great choice for development.md new file mode 100644 index 0000000000..4e0185b64c --- /dev/null +++ b/sources/tech/20170519 5 reasons the D programming language is a great choice for development.md @@ -0,0 +1,218 @@ +5 reasons the D programming language is a great choice for development +============================================================ + +### D's modeling, productivity, readability, and other features make it a good fit for collaborative software development. + + +![Why the D programming language is great for open source development](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/code_development_programming.png?itok=eYK4UXiq "Why the D programming language is great for open source development") +>Image by : opensource.com + +The [D programming language][8] is a statically typed, general purpose programming language with C-like syntax that compiles to native code. It's a good fit in open source software development for many reasons; here are some of them. + +### Modeling power + +It's not uncommon to find yourself in a situation where you have an idea and you want to implement it in code exactly the way you are thinking about it in your mind. However, sometimes you have to compromise the idea to fit the code, instead of modeling the code to fit the idea. D supports several [programming paradigms][9], including functional style, imperative, object oriented, metaprogramming, and concurrent (actor model), all harmoniously integrated. You have the option to choose whichever paradigm is convenient for modeling code to fit your idea. + +Programming and development + +* [New Python content][1] + +* [Our latest JavaScript articles][2] + +* [Recent Perl posts][3] + +* [Red Hat Developers Blog][4] + +By using [templates][10], a feature to generate additional D code and weave it in during compilation, you can describe code as a pattern for the compiler to generate the code. This is especially useful for designing algorithms without tying them to specific types. Platform-agnostic code becomes easy with the generic nature of templates. By combining templates with [conditional compilation][11], cross-platform apps become much easier to implement and are more likely to receive contributions from developers using different operating systems. With this, a single programmer can achieve a lot with less code and limited time. + +[Ranges][12], deeply integrated into D, abstract how container elements (e.g., arrays, associative arrays, linked lists, etc.) are accessed as opposed to an actual implementation. This abstraction enables the design and use of a great number of algorithms over a great number of container types without tying them to a specific data structure. D's [array slicing][13] is an implementation of a range. In the end, you write less code in less time and have lower maintenance costs. + +### Productivity + +Most code contributors to open source software work on a voluntary basis with limited time. D allows you be more productive because you can do more in less time. Templates and ranges in D make programmers more productive as they write generic and reusable code, but those are only a couple of D's strengths in terms of productivity. Another main appeal is that D's compilation speed feels like interpreted languages such as Python, JavaScript, Ruby, and PHP, making D good for quick prototyping. + +D can easily interface with legacy code, alleviating the need to port. It was designed to make [interfacing directly with C code][14] natural: After all, C is the master of legacy, well-written and tested code, libraries, and low-level system calls (especially in Linux). C++ code is also [callable in D][15] to a greater extent. In fact, [Python][16], [Objective-C][17], [Lua][18], and [Fortran][19] are some of the languages that are technically usable in D, and there are a number of third-party efforts pushing D in those areas. This makes the huge number of open source libraries usable in D code, which aligns with conventions of open source software development. + +### Readable and maintainable + +``` +import std.stdio; // import standard I/O module +void main() +{ + writeln("Hello, World!"); +} +``` + +HelloWorld demo in D + +D code is easy to understand by anyone familiar with C-like programming languages. Moreover, D is very readable, even for sophisticated code, which makes bugs easy to spot. Readability is also critical for engaging contributors, which is key to the growth of open source software. + +One simple but very useful [syntactic sugar][20] in D is support for using an underscore to separate numbers, making them more readable. This is especially useful for math: + +``` +int count = 100_000_000; +double price = 20_220.00 + 10.00; +int number = 0x7FFF_FFFF; // in hexadecimal system +``` + +[Ddoc][21], a built-in tool, makes it easy to automatically generate documentation out of code comments without the need for an external tool. Documentation becomes less challenging to write, improve, and update as it goes side by side with the code. + +[Contracts][22] are checks put in place to ensure D code behaves exactly as expected. Just like legal contracts are signed to ensure each party does their part in an agreement, contract programming in D ensures that the implementation of a function, class, etc. always produces the desired results or behaves as expected. Such a feature is practically useful for bug checks, especially in open source software where several people collaborate on a project. Contracts can be a lifesaver for large projects. D's powerful contract programming features are built-in rather than added as an afterthought. Contracts not only add to the convenience of using D but also make writing correct and maintainable code less of a headache. + +### Convenient + +Collaborative development can be challenging, as code is frequently changing and has many moving parts. D alleviates some of these issues, with support for importing modules locally within a scope: + +``` +// returns even numbers +int[] evenNumbers(int[] numbers) +{ + // "filter" and "array" are only accessible locally + import std.algorithm: filter; + import std.array: array; + return numbers.filter!(n => n%2 == 0).array; +} +``` + +The "!" operator used with **filter** is the syntax of a [template argument][5]. + +The function above can be tossed around without breaking code because it does not rely on any globally imported module. Any function implemented like this can be later enhanced without breaking code, which is a good thing for collaborative development. + +[Universal Function Call Syntax][23] (UFCS), is a syntactic sugar in D that allows the call of regular functions, like member functions of an object. A function is defined as: + +``` +void cook(string food, int quantity) +{ + import std.stdio: writeln; + writeln(food, " in quantity of ", quantity); +} +``` + +It can be called in the usual way like: + +``` +string food = "rice"; +int quantity = 3; + +cook(food, quantity); +``` + +With UFCS, this same function can be called as if **cook** is a member function: + +``` +string food = "rice"; +int quantity = 3; + +food.cook(quantity); +``` + +During compilation, the compiler automatically places **food** as the first argument to the function **cook**. UFCS makes it possible to **chain** regular functions—giving your code the natural feel of functional style programming. UFCS is heavily used in D, as it was in the case of the **filter** and **array** functions used in the **evenNumbers** function above. Combining templates, ranges, conditional compilation, and UFCS gives you massive power without sacrificing convenience. + +The **auto** keyword can be used in place of a type. The compiler will statically infer the type during compilation. This saves you from long type names and makes writing D code feel like a dynamically typed language. + +``` +// Nope. Do you? +VeryLongTypeHere variable = new VeryLongTypeHere(); + +// using auto keyword +auto variable = new VeryLongTypeHere(); +auto name = "John Doe"; +auto age = 12; +auto letter = 'e'; +auto anArray = [1, 2.0, 3, 0, 1.5]; // type of double[] +auto dictionary = ["one": 1, "two": 2, "three": 3]; // type of int[string] +auto cook(string food) {...} // auto for a function return type +``` + +D's [foreach][24] loop allows looping over collections and ranges of varying underlining data types: + +``` +foreach(name; ["John", "Yaw", "Paul", "Kofi", "Ama"]) +{ + writeln(name); +} + +foreach(number; [1, 2, 3, 4, 4, 6]) {...} + +foreach(number; 0..10) {...} // 0..10 is the syntax for number range + +class Student {...} +Student[] students = [new Student(), new Student()]; +foreach(student; students) {...} +``` + +Built-in [unit test][25] support in D not only alleviates the need for an external tool, but also makes it convenient for programmers to implement tests in their code. All test cases go inside the customizable **unittest {}** block: + +``` +int[] evenNumbers(int[] numbers) +{ + import std.algorithm: filter; + import std.array: array; + return numbers.filter!(n => n%2 == 0).array; +} + +unittest +{ + assert( evenNumbers([1, 2, 3, 4]) == [2, 4] ); +} +``` + +Using DMD, D's reference compiler, you can compile all tests into the resulting executable by adding the **-unittest** compiler flag. + +[Dub][26], a built-in package manager and build tool for D, makes it easy to use the increasing number of third-party packages (libraries) from the [Dub package registry][27]. Dub takes care of downloading, compiling, and linking those packages during compilation, as well as upgrading to future versions. + +### Choice + +In addition to providing several programming paradigms and features, D offers other choices. It currently has three compilers, all open source. The reference compiler, DMD, comes with its own backend, while the other two, GDC and LDC, use GCC and LLVM backends, respectively. DMD is noted for its fast compilation speeds, while LDC and GDC are noted for generating fast machine code at the cost of a little compilation time. You are free to choose whichever fits your use case. + +Certain parts of D, when used, are [garbage-collected][28] by default. You can also choose manual memory management or even reference counting if you wish. The choice is all yours. + +### And much more + +There a several sugars in D that I haven't covered in this brief discussion. I highly recommend you check out [D's feature overview][29], the hidden treasures in the [standard library][30], and [areas of D usage][31] to see more of what people are doing with it. Many organizations are already [using D in production][32]. Finally, if you are ready to start learning D, check out the book  _[Programming in D][6]_ . + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/17/5/d-open-source-software-development + +作者:[Lawrence Aberba][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/aberba +[1]:https://opensource.com/tags/python?src=programming_resource_menu +[2]:https://opensource.com/tags/javascript?src=programming_resource_menu +[3]:https://opensource.com/tags/perl?src=programming_resource_menu +[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu +[5]:http://ddili.org/ders/d.en/templates.html +[6]:http://ddili.org/ders/d.en/index.html +[7]:https://opensource.com/article/17/5/d-open-source-software-development?rate=2NrC12X6cAUXB18h8bLBYUkDmF2GR1nuiAdeMCFCvh8 +[8]:https://dlang.org/ +[9]:https://en.wikipedia.org/wiki/Programming_paradigm +[10]:http://ddili.org/ders/d.en/templates.html +[11]:https://dlang.org/spec/version.html +[12]:http://ddili.org/ders/d.en/ranges.html +[13]:https://dlang.org/spec/arrays.html#slicing +[14]:https://dlang.org/spec/interfaceToC.html +[15]:https://dlang.org/spec/cpp_interface.html +[16]:https://code.dlang.org/packages/pyd +[17]:https://dlang.org/spec/objc_interface.html +[18]:http://beza1e1.tuxen.de/into_luad.html +[19]:http://www.active-analytics.com/blog/interface-d-with-c-fortran/ +[20]:https://en.wikipedia.org/wiki/Syntactic_sugar +[21]:https://dlang.org/spec/ddoc.html +[22]:http://ddili.org/ders/d.en/contracts.html +[23]:http://ddili.org/ders/d.en/ufcs.html +[24]:http://ddili.org/ders/d.en/foreach.html +[25]:https://dlang.org/spec/unittest.html +[26]:http://code.dlang.org/getting_started +[27]:https://code.dlang.org/ +[28]:https://dlang.org/spec/garbage.html +[29]:https://dlang.org/comparison.html +[30]:https://dlang.org/phobos/index.html +[31]:https://dlang.org/areas-of-d-usage.html +[32]:https://dlang.org/orgs-using-d.html +[33]:https://opensource.com/user/129491/feed +[34]:https://opensource.com/users/aberba From c5a44928b7fe8f43a0d4cada5d7e6bc8d4db56ce Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 21:23:13 +0800 Subject: [PATCH 0175/1407] =?UTF-8?q?20170521-20=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ow to make Vim user-friendly with Cream.md | 75 +++++++++++++++++++ 1 file changed, 75 insertions(+) create mode 100644 sources/tech/20170518 How to make Vim user-friendly with Cream.md diff --git a/sources/tech/20170518 How to make Vim user-friendly with Cream.md b/sources/tech/20170518 How to make Vim user-friendly with Cream.md new file mode 100644 index 0000000000..909294d537 --- /dev/null +++ b/sources/tech/20170518 How to make Vim user-friendly with Cream.md @@ -0,0 +1,75 @@ +How to make Vim user-friendly with Cream +============================================================ + +### The Cream add-on makes the Vim text editor easier to use by putting a more familiar face on its functionality. + + + +![How to make Vim user-friendly with Cream](https://opensource.com/sites/default/files/styles/image-full-size/public/images/education/osdc_edu_rightmix_520.png?itok=SCsog_qv "How to make Vim user-friendly with Cream") +Image by :  + +opensource.com + +About 10 years ago, I split my text editing time between Emacs and Vim. That said, I was and definitely still am an Emacs guy. But while Emacs has always had an edge in my affections, I know that Vim is no slouch. + +So do other people—even those who, like me, are all thumbs technically. Over the years, I've talked to a few new Linux users who wanted to use Vim but were a bit disappointed that it doesn't act like the text editors they've used on other operating systems. + +That disappointment changed to satisfaction when I introduced them to Cream, an add-on for Vim that makes it easier to use. Cream turned each of them into diehard Vim users. + +Let's take a look at Cream and how it makes Vim easier to use. + +### Getting going with Cream + +Before you can install Cream, you'll need Vim and GVim GUI components installed on your computer. I find the easiest way to do that is to use your Linux distribution's package manager. + +Once you have Vim installed, grab [the installer][2] for Cream or, again, turn to your distribution's package manager. + +Once Cream is installed, you can fire it up by selecting the entry from the application menu (for example, **Applications > Cream**) or by typing **cream** into your program launcher. + +![Cream's main window](https://opensource.com/sites/default/files/resize/cream-main-window-520x336.png "Cream&#039;s main window") + +### Using Cream + +If you've used GVim before, you'll notice that Cream doesn't change the editor's look and feel too much. The biggest cosmetic differences are Cream's menu bar and toolbar, which replace the stock GVim menu bar and toolbar with ones that look and group functions like their counterparts in other applications. + +Cream's menus hide a lot of the more techie options—like the ability to specify a compiler and the **Make** command—from the user. As you get more familiar with Vim by using Cream, however, you can make more of those features more easily accessible by selecting an option from the **Settings > Preferences > Behavior** menu. With those options, you could (if you want to) wind up with an editor that behaves as a hybrid of Cream and traditional Vim. + +Cream isn't only driven by its menus. While the editor's functions are only a click or two away, you can also use common keyboard shortcuts to perform actions—for example, **CTRL-O** (to open a file) or **CTRL-C** (to copy text). There's no need to shift between modes or remember Vim's somewhat cryptic commands. + +With Cream running, get to work by opening a file or creating a new one. Then start typing. A couple or three of the people I've introduced to Cream have said that while it retains much of the classic styling of Vim, Cream feels more comfortable to use. + +![Cream add-on for VIM in action](https://opensource.com/sites/default/files/cream-in-action.png "Cream add-on for VIM in action") + +That's not to say Cream dumbs down or waters down Vim. Far from it. You still retain all of Vim's features, along with [a long list of others][3]. Some of the features of Cream that I find useful include: + +* A tabbed interface + +* Syntax highlighting (especially when working with Markdown, LaTeX, and HTML) + +* Auto correction of spelling mistakes + +* Word count + +* Built-in file explorer + +Cream also comes with a number of add-ons that give the editor some additional features. Those features include the ability to encrypt text and to clean up the body of emails, and there's even a typing tutor. To be honest, I haven't found any of the add-ons to be all that useful. Your mileage might vary, though. + +I've heard a few Vi/Vim purists pooh-pooh Cream for "dumbing down _"_  (their words) the editor. Let's be honest: Cream isn't for them. It's for someone who wants to quickly get up and running with Vim while retaining the look and feel of the editors they're used to. In that way, Cream succeeds admirably. It makes Vim a lot more accessible and usable to a wider range of people. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/17/5/stir-bit-cream-make-vim-friendlier + +作者:[ Scott Nesbitt ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/scottnesbitt +[1]:https://opensource.com/article/17/5/stir-bit-cream-make-vim-friendlier?rate=sPQVOnwWoNwyyQX4wV2SZ_7Ly_KXd_Gu9pBu16LRyhU +[2]:http://cream.sourceforge.net/download.html +[3]:http://cream.sourceforge.net/featurelist.html +[4]:https://opensource.com/user/14925/feed +[5]:https://opensource.com/article/17/5/stir-bit-cream-make-vim-friendlier#comments +[6]:https://opensource.com/users/scottnesbitt From 9776008d4675c3caa228a3959239ad71a24ba420 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 21:25:46 +0800 Subject: [PATCH 0176/1407] =?UTF-8?q?20170521-21=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...g the leading static website generators.md | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 sources/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md diff --git a/sources/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md b/sources/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md new file mode 100644 index 0000000000..6f09ffa913 --- /dev/null +++ b/sources/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md @@ -0,0 +1,101 @@ +Hugo vs. Jekyll: Comparing the leading static website generators +============================================================ + +### If you're building a new website, a static site generator may be the right platform for you. + + +![Hugo vs. Jekyll: Comparing the leading static website generators ](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/rh_003784_02_os.comcareers_os_rh2x.png?itok=4wXjYMBw "Hugo vs. Jekyll: Comparing the leading static website generators ") +>Image by : opensource.com + +Unless your spirit animal is Emily Dickinson, when you make a thing, you want to share it with the world. Sharing your work means that you need a website. Of course, you could simply partake in digital sharecropping and use any of the various social media sites to get your work in front of an audience. There sure are plenty to choose from... and not just "conventional" social media sites. With places like Artstation, Flickr, Soundcloud, and Wattpad, there's an outlet for you, whatever your medium. + +And actually, you  _should_  use those sites. It's where the people are, after all. However, none of those places is truly yours. None is a home base that  _you_  control and that you can ensure will be there for people to find regardless of the waxing and waning trends of social media. + +Programming and development + +* [New Python content][1] + +* [Our latest JavaScript articles][2] + +* [Recent Perl posts][3] + +* [Red Hat Developers Blog][4] + +Control. That's the value of having your own place on the web. + +But this article isn't about setting up a domain name and hosting for your website. It's for the step  _after_  that, the actual making of that site. The typical choice for a lot of people would be to use something like [WordPress][6]. It's a one-click install on most hosting providers, and there's a gigantic market of plugins and themes available to choose from, depending on the type of site you're trying to build. But not only is WordPress a bit overkill for most websites, it also gives you a dynamically generated site with a lot of moving parts. If you don't keep all of those pieces up to date, they can pose a significant security risk and your site could get hijacked. + +The alternative would be to have a static website, with nothing dynamically generated on the server side. Just good old HTML and CSS (and perhaps a bit of Javascript for flair). The downside to that option has been that you've been relegated to coding the whole thing by hand yourself. It's doable, but you just want a place to share your work. You shouldn't have to know all the idiosyncrasies of low-level web design (and the monumental headache of cross-browser compatibility) to do that. + +Enter static site generators. You get the speed and security of static HTML pages, but with a workflow that's closer to the convenience of a dynamic site. The two frontrunners in the static site generator world are [Hugo][7] and [Jekyll][8]. (By the way, Paolo Bonzini has a great article on [getting started with Jekyll][9].) But which one is the right choice for you? Hopefully by the end of this article, you'll have a better idea. We're evaluating both static site generators based on how quickly you can get started, availability of themes, editing workflow, and extensibility. + +### Getting started + +Fair warning, both of these tools will require you to work with them from the command line. Most of the commands are straightforward and easy to remember, but let's adjust our expectations accordingly. This is not a point-and-click interface. + +Installation for both Jekyll and Hugo is pretty simple. Jekyll installs as a RubyGem, and Hugo offers a very handy all-in-one binary to get you started quickly. Because of the single install package, Hugo edges ahead here slightly. Although the RubyGems install method for Jekyll is easy in its own right, it  _does_  require that you already have a properly installed and configured Ruby environment on your computer. Outside of the community of designers and developers for the web, most folks don't already have that setup. + +Once installed, though, both Hugo and Jekyll are pretty evenly matched. They both have great documentation and quick-start guides. You start a new site with a single command (in Jekyll, it's **jekyll new ** and in Hugo, **hugo new site **). This sets up a general directory structure and scaffolding for your site. Directory structures and basic configuration are pretty similar. Jekyll uses a **_config.yml** file and Hugo uses **config.toml** (although you  _can_  use YAML or even JSON syntax with Hugo's config if you're more comfortable with either of those). The front matter metadata at the top of each content file uses the same syntax as the config. After that, all page content is written in Markdown. + +I will say that in terms of getting you started with your very first statically generated site, Jekyll has a slight advantage over Hugo because it starts with some basic content and a default theme. You can use these as example templates as you start building your site. Hugo has no example content or even a default theme. That said, example content and default themes are usually the first things I delete when I'm making a new site with any tool, so Hugo actually saves me a step. + +### Themes + +As I mentioned, Hugo doesn't ship with a default theme at all, so that's probably one of the first things you're going to want to set up. Jekyll has a decent default theme, though it's pretty bare bones. You'll probably want to go theme hunting with your Jekyll site, too. + +Both Hugo and Jekyll have a pretty diverse assortment of themes for all manners of website types from single-page ID themes to full-blown multipage sites with blog posts and comments. Despite that, it's not exactly easy to find a theme that suits your needs. In either case, the place to go for themes—[themes.gohugo.io][10] for Hugo and [jekyllthemes.org][11] for Jekyll—is basically a single large page full of theme screenshots. Once you click on a theme, you can get some pretty detailed information about it, but that initial search is pretty rough. Hugo's theme page has some basic tagging built into it, but in general, theme searching and presentation is something I feel both projects really need to work on. + +Theme management is also an interesting topic. In both cases, nearly every theme is a Git repository (often hosted on GitHub) that you clone into your website scaffolding. In Jekyll, there's an additional step of using RubyGems' **bundle** to ensure that the theme is managed with the site. Most themes already come with a **Gemfile**, making this step relatively painless. If the theme doesn't already have a **Gemfile**, it's fairly easy to add. In Hugo there's no bundling step. Just point to the theme from your **config.toml,** and you're good to go. + +I've found that I'm partial to the way that Hugo handles themes. You clone (or create) themes into their own space in a **themes** subdirectory. Not only does it make it relatively easy to switch between themes when you're first starting out, but it also gives you the ability to override any component file of a theme with your own file. This means you can customize a theme to your tastes without messing too much with the source of the original theme, allowing it to stay generic enough for other people to use. Of course, if you have a change that you feel other users of the theme may find worthwhile, you can still edit that source and submit a pull request to the theme maintainer. + +### Workflow + +The workflows for building your site in Jekyll and Hugo are pretty similar once you have your initial configuration set up. Both have a live **serve** command that runs a small, lightweight web server on your computer so you can test your site locally without needing to upload it anywhere. The really nice thing is that whether you're running **jekyll serve** or **hugo serve**, both are configured by default to watch for any changes you make to your site as you work on it. When you look at the locally served version of your site in a browser, it automatically updates with any change you make, regardless of whether that change is to content, configuration, theme, or just an image. It's really quite handy and a great time-saver. + +You write the content for your site in both systems using [Markdown][12] syntax. If you don't happen to be familiar with Markdown, it's a very simplified means of writing in plain text while still allowing for some nice formatting marks. It's very easy to work in and human-readable. And because it's in plain text, your content (and therefore your site) is easily version controlled. It's pretty much the main way I write almost everything these days. + +New content can be added to your site scaffolding by manually creating files in the right place. It just needs to be a Markdown file with the appropriate "front matter" metadata at the top of the file. As with the configuration file, Jekyll uses YAML syntax for front matter, while Hugo will accept TOML, YAML, or JSON (default is TOML). That new page file needs to be placed in the correct directory within your site's scaffolding. In Jekyll, you have separate **_drafts** and **_posts** directories for storing your work in progress and your completed content pages, respectively. In Hugo, there's only a single **content** directory. You specify whether a post is a draft or not within that content file's front matter. + +Now, although it's possible to do all of this manually, Hugo does offer some convenience functions to ensure that your new file is created in the correct spot in the scaffolding and that files are pre-populated with appropriate front matter. It's simply a matter of going to your site's directory in a terminal and typing **hugo new content/** where **** is the new page you want to create. You can even set up templates called **archetypes** that hold customized front matter for pages of different types (like if you have both a blog and a podcast on your website). + +When your site is ready to ship, you can shut down your preview server and issue a command to build the actual pages of the site. In Jekyll, that would be **jekyll build**. In Hugo, it's just **hugo**. Jekyll puts the completed site in the **_site** subdirectory, while Hugo puts them in a subdirectory named **public**. In either case, once you do that, you have a completed static website that you can upload and have hosted nearly anywhere. + +### Extensibility + +Both Hugo and Jekyll give you the ability to customize your site down to the smallest thing. However, in terms of extensibility, Jekyll currently leads in a big way because of its plugin API. Because of this plugin architecture, it's relatively easy to add functionality to your Jekyll-generated site with reasonably short snippets of code available through the Jekyll community or that you write yourself. + +Hugo does not currently have a plugin API at all, so adding that kind of functionality is a bit tougher. There's hope that the ability to write and include plugins will be added in the future, but it doesn't appear that anyone is working on that yet. + +### Conclusion + +By and large, Hugo and Jekyll are pretty similar. It really comes down to determining how you're most comfortable working and what your site needs. If you already have a RubyGems environment set up and you need the extensibility of plugins, then Jekyll is the way to go. However, if you value a simple workflow and a straightforward means of customizing your site, then Hugo would be your top pick. + +I find that I'm more drawn to Hugo's approach, and in building a small handful of sites, I haven't yet had a need for any plugins. Of course, everyone's needs are a little bit different. Which static site generator would you choose for your site? + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/17/5/hugo-vs-jekyll + +作者:[Jason van Gumster ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/jason-van-gumster +[1]:https://opensource.com/tags/python?src=programming_resource_menu +[2]:https://opensource.com/tags/javascript?src=programming_resource_menu +[3]:https://opensource.com/tags/perl?src=programming_resource_menu +[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu +[5]:https://opensource.com/article/17/5/hugo-vs-jekyll?rate=lZDKuqOQ7lVUon-ZKebR5SUCyXDz5oCQ_zoCSBPolOQ +[6]:http://wordpress.org/ +[7]:http://gohugo.io/ +[8]:https://jekyllrb.com/ +[9]:https://opensource.com/article/17/4/getting-started-jekyll +[10]:https://themes.gohugo.io/ +[11]:http://jekyllthemes.org/ +[12]:https://daringfireball.net/projects/markdown/ +[13]:https://opensource.com/user/26430/feed +[14]:https://opensource.com/article/17/5/hugo-vs-jekyll#comments +[15]:https://opensource.com/users/jason-van-gumster From 64b33d7341da4bc4489cf19ce19f743638f70869 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 21:27:41 +0800 Subject: [PATCH 0177/1407] =?UTF-8?q?20170521-22=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...5 How I got started with bash scripting.md | 136 ++++++++++++++++++ 1 file changed, 136 insertions(+) create mode 100644 sources/talk/20170515 How I got started with bash scripting.md diff --git a/sources/talk/20170515 How I got started with bash scripting.md b/sources/talk/20170515 How I got started with bash scripting.md new file mode 100644 index 0000000000..931c3a3ca7 --- /dev/null +++ b/sources/talk/20170515 How I got started with bash scripting.md @@ -0,0 +1,136 @@ +How I got started with bash scripting +============================================================ + +### With a few simple Google searches, a programming novice learned to write code that automates a previously tedious and time-consuming task. + + + +![How Google helped me learn bash scripting](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/computer_happy_sad_developer_programming.png?itok=5E3k_t_r "How Google helped me learn bash scripting") +>Image by : opensource.com + +I wrote a script the other day. For some of you, that sentence sounds like no big deal. For others, and I know you're out there, that sentence is significant. You see, I'm not a programmer. I'm a writer. + +### What I needed to solve + +My problem was fairly simple: I had to juggle files from engineering into our documentation. The files were available in a .zip format from a web URL. I was copying them to my desktop manually, then moving them into a different directory structure to match my documentation needs. A fellow writer gave me this advice:  _"Why don't you just write a script to do this for you?"_ + +Programming and development + +* [New Python content][1] + +* [Our latest JavaScript articles][2] + +* [Recent Perl posts][3] + +* [Red Hat Developers Blog][4] + +​ + +I thought  _"just write a script?!?"_ —as if it was the easiest thing in the world to do. + +### How Google came to the rescue + +My colleague's question got me thinking, and as I thought, I googled. + +**What scripting languages are on Linux?** + +This was my first Google search criteria, and many of you are probably thinking, "She's pretty clueless." Well, I was, but it did set me on a path to solving my problem. The most common result was Bash. Hmm, I've seen Bash. Heck, one of the files I had to document had Bash in it, that ubiquitous line **#!/bin/bash**. I took another look at that file, and I knew what it was doing because I had to document it. + +So that led me to my next Google search request. + +**How to download a zip file from a URL?** + +That was my basic task really. I had a URL with a .zip file containing all the files I needed to include in my documentation, so I asked the All Powerful Google to help me out. That search gem, and a few more, led me to Curl. But here's the best part: Not only did I find Curl, one of the top search hits showed me a Bash script that used Curl to download a .zip file and extract it. That was more than I asked for, but that's when I realized being specific in my Google search requests could give me the information I needed to write this script. So, momentum in my favor, I wrote the simplest of scripts: + +``` +#!/bin/sh + +curl http://rather.long.url | tar -xz -C my_directory --strip-components=1 +``` + +What a moment to see that thing run! But then I realized one gotcha: The URL can change, depending on which set of files I'm trying to access. I had another problem to solve, which led me to my next search. + +**How to pass parameters into a Bash script?** + +I needed to be able to run this script with different URLs and different end directories. Google showed me how to put in **$1**, **$2**, etc., to replace what I typed on the command line with my script. For example: + +``` +bash myscript.sh http://rather.long.url my_directory +``` + +That was much better. Everything was working as I needed it to, I had flexibility, I had a working script, and most of all, I had a short command to type and save myself 30 minutes of copy-paste grunt work. That was a morning well spent. + +Then I realized I had one more problem. You see, my memory is short, and I knew I'd run this script only every couple of months. That left me with two issues: + +* How would I remember what to type for my script (URL first? directory first?)? + +* How would another writer know how to run my script if I got hit by a truck? + +I needed a usage message—something the script would display if I didn't use it correctly. For example: + +``` +usage: bash yaml-fetch.sh <'snapshot_url'> +``` + +Otherwise, run the script. My next search was: + +**How to write "if/then/else" in a Bash script?** + +Fortunately I already knew **if/then/else** existed in programming. I just had to find out how to do that. Along the way, I also learned to print from a Bash script using **echo**. What I ended up with was something like this: + +``` +#!/bin/sh + +URL=$1 +DIRECTORY=$2 + +if [ $# -eq 0 ]; + then + echo "usage: bash yaml-fetch.sh <'snapshot_url'> ". + else + + # make the directory if it doesn't already exist + echo 'create directory' + + mkdir $DIRECTORY + + # fetch and untar the yaml files + echo 'fetch and untar the yaml files' + + curl $URL | tar -xz -C $DIRECTORY --strip-components=1 +fi +``` + +### How Google and scripting rocked my world + +Okay, slight exaggeration there, but this being the 21st century, learning new things (especially somewhat simple things) is a whole lot easier than it used to be. What I learned (besides how to write a short, self-documented Bash script) is that if I have a question, there's a good chance someone else had the same or a similar question before. When I get stumped, I can ask the next question, and the next question. And in the end, not only do I have a script, I have the start of a new skill that I can hold onto and use to simplify other tasks I've been avoiding. + +Don't let that first script (or programming step) get the best of you. It's a skill, like any other, and there's a wealth of information out there to help you along the way. You don't need to read a massive book or take a month-long course. You can do it a simpler way with baby steps and baby scripts that get you started, then build on that skill and your confidence. There will always be a need for folks to write those thousands-of-lines-of-code programs with all the branching and merging and bug-fixing. + +But there is also a strong need for simple scripts and other ways to automate/simplify tasks. And that's where a little script and a little confidence can give you a kickstart. + +-------------------------------------------------------------------------------- + +作者简介: + +Sandra McCann - Sandra McCann is a Linux and open source advocate. She's worked as a software developer, content architect for learning resources, and content creator. Sandra is currently a content creator for Red Hat in Westford, MA focusing on OpenStack and NFV techology. + +---- + +via: https://opensource.com/article/17/5/how-i-learned-bash-scripting + +作者:[ Sandra McCann ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/sandra-mccann +[1]:https://opensource.com/tags/python?src=programming_resource_menu +[2]:https://opensource.com/tags/javascript?src=programming_resource_menu +[3]:https://opensource.com/tags/perl?src=programming_resource_menu +[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu +[5]:https://opensource.com/article/17/5/how-i-learned-bash-scripting?rate=s_R-jmOxcMvs9bi41yRwenl7GINDvbIFYrUMIJ8OBYk +[6]:https://opensource.com/user/39771/feed +[7]:https://opensource.com/article/17/5/how-i-learned-bash-scripting#comments +[8]:https://opensource.com/users/sandra-mccann From aa5cf09637dbbd6824c0b650e839e458cb393190 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 21:48:20 +0800 Subject: [PATCH 0178/1407] =?UTF-8?q?20170521-23=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...s Big Bang One Kernel Countless Distros.md | 94 +++++++++++++++++++ 1 file changed, 94 insertions(+) create mode 100644 sources/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md diff --git a/sources/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md b/sources/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md new file mode 100644 index 0000000000..c36fa8418d --- /dev/null +++ b/sources/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md @@ -0,0 +1,94 @@ +Linux's Big Bang: One Kernel, Countless Distros +============================================================[Print][1][Email][2]By Jonathan Terrasi  +Apr 27, 2017 3:24 PM PT +![linus-torvalds](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2017-linus-torvalds-1.jpg) + +Even if you're a newcomer to Linux, you've probably figured out that it is not a single, monolithic operating system, but a constellation of projects. The different "stars" in this constellation take the form of "distributions," or "distros." Each offers its own take on the Linux model. + +To gain an appreciation of the plethora of options offered by the range of distributions, it helps to understand how Linux started out and subsequently proliferated. With that in mind, here's a brief introduction to Linux's history. + +### Linus Torvalds, Kernel Builder + +Most people with any familiarity with Linux have heard of its creator, Linus Torvalds (pictured above), but not many know why he created it in the first place. In 1991, Torvalds was a university student in Finland studying computers. As an independent personal project, he wanted to create a Unix-like kernel to build a system for his unique hardware. + +The "kernel" is the part of an operating system that mediates between the hardware, via its firmware, and the OS. Essentially, it is the heart of the system. Developing a kernel is no small feat, but Torvalds was eager for the challenge and found he had a rare knack for it. + +As he was new to kernels, he wanted input from others to ensure he was on the right track, so he solicited the experience of veteran tinkerers on Usenet, the foremost among early Internet forums, by publishing the code for his kernel. Contributions flooded in. + +After establishing a process for reviewing forum-submitted patches and selectively integrating them, Torvalds realized he had amassed an informal development team. It quickly became a somewhat formal development team once the project took off. + +### Richard Stallman's Role + +Though Torvalds and his team created the Linux kernel, there would have been no subsequent spread of myriad Linux distributions without the work of Richard Stallman, who had launched the free software movement a decade earlier. + +Frustrated with the lack of transparency in many core Unix programming and system utilities, Stallman had decided to write his own -- and to share the source code freely with anyone who wanted it and also was committed to openness. He created a considerable body of core programs, collectively dubbed the "GNU Project," which he launched in 1983. + +Without them, a kernel would not have been of much use. Early designers of Linux-based OSes readily incorporated the GNU tools into their projects. + +Different teams began to emerge -- each with its own philosophy regarding computing functions and architecture. They combined the Linux kernel, GNU utilities, and their own original software, and "distributed" variants of the Linux operating system. + +### Server Distros + +Each distro has its own design logic and purpose, but to appreciate their nuances it pays to understand the difference between upstream and downstream developers. An "upstream developer" is responsible for actually creating the program and releasing it for individual download, or for including it in other projects. By contrast, a "downstream developer," or "package maintainer," is one who takes each release of the upstream program and tweaks it to fit the use case of a downstream project. + +While most Linux distributions include some original projects, the majority of distribution development is "downstream" work on the Linux kernel, GNU tools, and the vast ecosystem of user programs. + +Many distros make their mark by optimizing for specific use cases. For instance, some projects are designed to run as servers. Distributions tailored for deployment as servers often will shy away from quickly pushing out the latest features from upstream projects in favor of releasing a thoroughly tested, stable base of essential software that system administrators can depend on to run smoothly. + +Development teams for server-focused distros often are large and are staffed with veteran programmers who can provide years of support for each release. + +### Desktop Distros + +There is also a wide array of distributions meant to run as user desktops. In fact, some of the more well-known of these are designed to compete with major commercial OSes by offering a simple installation and intuitive interface. These distributions usually include enormous software repositories containing every user program imaginable, so that users can make their systems their own. + +As usability is key, they are likely to devote a large segment of their staff to creating a signature, distro-specific desktop, or to tweaking existing desktops to fit their design philosophy. User-focused distributions tend to speed up the downstream development timetable a bit to offer their users new features in a timely fashion. + +"Rolling release" projects -- a subset of desktop distributions -- are crafted to be on the bleeding edge. Instead of waiting until all the desired upstream programs reach a certain point of development and then integrating them into a single release, package maintainers for rolling release projects release a new version of each upstream program separately, once they finish tweaking it. + +One advantage to this approach is security, as critical patches will be available faster than non-rolling release distros. Another upside is the immediate availability of new features that users otherwise would have to wait for. The drawback for rolling release distributions is that they require more manual intervention and careful maintenance, as certain upgrades can conflict with others, breaking a system. + +### Embedded Systems + +Yet another class of Linux distros is known as "embedded systems," which are extremely trimmed down (compared to server and desktop distros) to fit particular use cases. + +We often forget that anything that connects to the Internet or is more complex than a simple calculator is a computer, and computers need operating systems. Because Linux is free and highly modular, it's usually the one that hardware manufacturers choose. + +In the vast majority of cases, if you see a smart TV, an Internet-connected camera, or even a car, you're looking at a Linux device. Practically every smartphone that's not an iPhone runs a specialized variety of embedded Linux too. + +### Linux Live + +Finally, there are certain Linux distros that aren't meant to be installed permanently in a computer, but instead reside on a USB stick and allow other computers to boot them up without touching the computer's onboard hard drive. + +These "live" systems can be optimized to perform a number of tasks, ranging from repairing damaged systems, to conducting security evaluations, to browsing the Internet with high security. + +As these live Linux distros usually are meant for tackling very specific problems, they generally include specialized tools like hard drive analysis and recovery programs, network monitoring applications, and encryption tools. They also keep a light footprint so they can be booted up quickly. + +### How Do You Choose? + +This is by no means an exhaustive list of Linux distribution types, but it should give you an idea of the scope and variety of the Linux ecosystem. + +Within each category, there are many choices, so how do you choose the one that might best suit your needs? + +One way is to experiment. It is very common in the Linux community to go back and forth between distros to try them out, or for users to run different ones on different machines, according to their needs. + +In a future post, I'll showcase a few examples of each type of distribution so you can try them for yourself and begin your journey to discovering the one you like best. + +-------------------------------------------------------------------------------- + +作者简介: + +Jonathan Terrasi has been an ECT News Network columnist since 2017. His main interests are computer security (particularly with the Linux desktop), encryption, and analysis of politics and current affairs. He is a full-time freelance writer and musician. His background includes providing technical commentaries and analyses in articles published by the Chicago Committee to Defend the Bill of Rights. + +------ + +via: http://www.linuxinsider.com/story/84489.html?rss=1 + +作者:[ Jonathan Terrasi ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.linuxinsider.com/story/84489.html?rss=1#searchbyline +[1]:http://www.linuxinsider.com/story/84489.html?rss=1# +[2]:http://www.linuxinsider.com/perl/mailit/?id=84489 From 0abbbbe87cbf2a7fa3bad8cf1015b8650029d24a Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 21 May 2017 21:50:50 +0800 Subject: [PATCH 0179/1407] =?UTF-8?q?20170521-24=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0170421 A Window Into the Linux Desktop.md | 101 ++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 sources/talk/20170421 A Window Into the Linux Desktop.md diff --git a/sources/talk/20170421 A Window Into the Linux Desktop.md b/sources/talk/20170421 A Window Into the Linux Desktop.md new file mode 100644 index 0000000000..917d718aa5 --- /dev/null +++ b/sources/talk/20170421 A Window Into the Linux Desktop.md @@ -0,0 +1,101 @@ +A Window Into the Linux Desktop +============================================================ + +![linux-desktop](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2016-linux-1.jpg) + +![](http://www.linuxinsider.com/images/2015/image-credit-adobe-stock_130x15.gif) + +"What can it do that Windows can't?" + +That is the first question many people ask when considering Linux for their desktop. While the open source philosophy that underpins Linux is a good enough draw for some, others want to know just how different its look, feel and functionality can get. To a degree, that depends on whether you choose a desktop environment or a window manager. + +If you want a desktop experience that is lightning fast and uncompromisingly efficient, foregoing the classic desktop environment for a window manager might be for you. + +### What's What + +"Desktop environment" is the technical term for a typical, full-featured desktop -- that is, the complete graphical layout of your system. Besides displaying your programs, the desktop environment includes accoutrements such as app launchers, menu panels and widgets. + +In Microsoft Windows, the desktop environment consists of, among other things, the Start menu, the taskbar of open applications and notification center, all the Windows programs that come bundled with the OS, and the frames enclosing open applications (with a dash, square and X in the upper right corner). + +There are many similarities in Linux. + +The Linux [Gnome][3] desktop environment, for instance, has a slightly different design, but it shares all of the Microsoft Windows basics -- from an app menu to a panel showing open applications, to a notification bar, to the windows framing programs. + +Window program frames rely on a component for drawing them and letting you move and resize them: It's called the "window manager." So, as they all have windows, every desktop environment includes a window manager. + +However, not every window manager is part of a desktop environment. You can run window managers by themselves, and there are reasons to consider doing just that. + +### Out of Your Environment + +For the purpose of this column, references to "window manager" refer to those that can stand alone. If you install a window manager on an existing Linux system, you can log out without shutting down, choose the new window manager on your login screen, and log back in. + +You might not want to do this without researching your window manager first, though, because you will be greeted by a blank screen and sparse status bar that may or may not be clickable. + +There typically is a straightforward way to bring up a terminal in a window manager, because that's how you edit its configuration file. There you will find key- and mouse-bindings to launch programs, at which point you actually can use your new setup. + +In the popular i3 window manager, for instance, you can launch a terminal by hitting the Super (i.e., Windows) key plus Enter -- or press Super plus D to bring up the app launcher. There you can type an app name and hit Enter to open it. All the existing apps can be found that way, and they will open to full screen once selected. + + [![i3 window manager](http://www.linuxinsider.com/article_images/2017/84473_620x388-small.jpg)][4] (Click Image to Enlarge) + +i3 is also a tiling window manager, meaning it ensures that all windows expand to evenly fit the screen, neither overlapping nor wasting space. When a new window pops up, it reduces the existing windows, nudging them aside to make room. Users can toggle to open the next window either vertically or horizontally adjacent. + +### Features Can Be Friends or Foes + +Desktop environments have their advantages, of course. First and foremost, they provide a feature-rich, recognizable interface. Each has its signature style, but overall they provide unobtrusive default settings out of the box, which makes desktop environments ready to use right from the start. + +Another strong point is that desktop environments come with a constellation of programs and media codecs, allowing users to accomplish simple tasks immediately. Further, they include handy features like battery monitors, wireless widgets and system notifications. + +As comprehensive as desktop environments are, the large software base and user experience philosophy unique to each means there are limits on how far they can go. That means they are not always very configurable. With desktop environments that emphasize flashy looks, oftentimes what you see is what you get. + +Many desktop environments are notoriously heavy on system resources, so they're not friendly to lower-end hardware. Because of the visual effects running on them, there are more things that can go wrong, too. I once tried tweaking networking settings that were unrelated to the desktop environment I was running, and the whole thing crashed. When I started a window manager, I was able to change the settings. + +Those prioritizing security may want to avoid desktop environments, since more programs means greater attack surface -- that is, entry points where malicious actors can break in. + +However, if you want to give a desktop environment a try, XFCE is a good place to start, as its smaller software base trims some bloat, leaving less clutter behind if you don't stick with it. + +It's not the prettiest at first sight, but after downloading some GTK theme packs (every desktop environment serves up either these or Qt themes, and XFCE is in the GTK camp) and enabling them in the Appearance section of settings, you easily can touch it up. You can even shop around at this [centralized gallery][5] to find the theme you like best. + +### You Can Save a Lot of Time... if You Take the Time First + +If you'd like to see what you can do outside of a desktop environment, you'll find a window manager allows plenty of room to maneuver. + +More than anything, window managers are about customization. In fact, their customizability has spawned numerous galleries hosting a vibrant community of users whose palette of choice is a window manager. + +The modest resource needs of window managers make them ideal for lower specs, and since most window managers don't come with any programs, they allow users who appreciate modularity to add only those they want. + +Perhaps the most noticeable distinction from desktop environments is that window managers generally focus on efficiency by emphasizing mouse movements and keyboard hotkeys to open programs or launchers. + +Keyboard-driven window managers are especially streamlined, since you can bring up new windows, enter text or more keyboard commands, move them around, and close them again -- all without moving your hands from the home row. Once you acculturate to the design logic, you will be amazed at how quickly you can blaze through your tasks. + +In spite of the freedom they provide, window managers have their drawbacks. Most significantly, they are extremely bare-bones out of the box. Before you can make much use of one, you'll have to spend time reading your window manager's documentation for configuration syntax, and probably some more time getting the hang of said syntax. + +Although you will have some user programs if you switched from a desktop environment (the likeliest scenario), you also will start out missing familiar things like battery indicators and network widgets, and it will take some time to set up new ones. + +If you want to dive into window managers, i3 has [thorough documentation][6] and straightforward configuration syntax. The configuration file doesn't use any programming language -- it simply defines a variable-value pair on each line. Creating a hotkey is as easy as writing "bindsym", the key combination, and the action for that combination to launch. + +While window managers aren't for everyone, they offer a distinctive computing experience, and Linux is one of the few OSes that allows them. No matter which paradigm you ultimately go with, I hope this overview gives you enough information to feel confident about the choice you've made -- or confident enough to venture out of your familiar zone and see what else is available.  + +-------------------------------------------------------------------------------- + +作者简介: + +**Jonathan Terrasi** has been an ECT News Network columnist since 2017\. His main interests are computer security (particularly with the Linux desktop), encryption, and analysis of politics and current affairs. He is a full-time freelance writer and musician. His background includes providing technical commentaries and analyses in articles published by the Chicago Committee to Defend the Bill of Rights. + + +----------- + +via: http://www.linuxinsider.com/story/84473.html?rss=1 + +作者:[ ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: +[1]:http://www.linuxinsider.com/story/84473.html?rss=1# +[2]:http://www.linuxinsider.com/perl/mailit/?id=84473 +[3]:http://en.wikipedia.org/wiki/GNOME +[4]:http://www.linuxinsider.com/article_images/2017/84473_1200x750.jpg +[5]:http://www.xfce-look.org/ +[6]:https://i3wm.org/docs/ From 513e590b46d3ecda1ee73e3240f8b98344e0be1d Mon Sep 17 00:00:00 2001 From: hwlog Date: Sun, 21 May 2017 23:48:59 +0800 Subject: [PATCH 0180/1407] =?UTF-8?q?=E6=9C=9D=E9=B2=9C=E7=9A=84180?= =?UTF-8?q?=E9=83=A8=E9=98=9F=E7=9A=84=E7=BD=91=E7=BB=9C=E6=88=98=E5=8D=95?= =?UTF-8?q?=E5=85=83=E8=AE=A9=E8=A5=BF=E6=96=B9=E5=9B=BD=E5=AE=B6=E5=BF=A7?= =?UTF-8?q?=E8=99=91=E3=80=82?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...a's Unit 180, the cyber warfare cell that worries the West.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/talk/20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md b/sources/talk/20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md index e6833eeba0..bafafb1bc9 100644 --- a/sources/talk/20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md +++ b/sources/talk/20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md @@ -1,3 +1,4 @@ +Translating by hwlog North Korea's Unit 180, the cyber warfare cell that worries the West ============================================================ From 2a1392ea7000dd42405d6ba28d76fb73047ec741 Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 22 May 2017 09:16:06 +0800 Subject: [PATCH 0181/1407] translating --- ... – Turns Android Device into Linux Command Line Interface.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md b/sources/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md index 766b901c88..bba04a096d 100644 --- a/sources/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md +++ b/sources/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md @@ -1,3 +1,5 @@ +translating---geekpi + T-UI Launcher – Turns Android Device into Linux Command Line Interface ============================================================ From 2ce0f86e2b967f4c68c97594dcebadce6917f273 Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 22 May 2017 09:36:45 +0800 Subject: [PATCH 0182/1407] translated --- ... Device into Linux Command Line Interface.md | 85 ------------------- ... Device into Linux Command Line Interface.md | 83 ++++++++++++++++++ 2 files changed, 83 insertions(+), 85 deletions(-) delete mode 100644 sources/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md create mode 100644 translated/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md diff --git a/sources/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md b/sources/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md deleted file mode 100644 index bba04a096d..0000000000 --- a/sources/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md +++ /dev/null @@ -1,85 +0,0 @@ -translating---geekpi - -T-UI Launcher – Turns Android Device into Linux Command Line Interface -============================================================ - -Are you a command line guru, or do you simply want to make your Android device unusable for friends and family, then check out T-UI Launcher app. Unix/Linux users will definitely love this. - -T-UI Launcher is a free lightweight Android app with a Linux-like CLI (Command Line Interface) that turns your regular Android device into a complete command line interface. It is a simple, quick and smart launcher for those who love to work with text-based interfaces. - -#### T-UI Launcher Features - -Below are some of its notable features: - -* Shows quick usage guide after the first launch. - -* It’s fast and fully customizable. - -* Offers to autocomplete menu with fast, powerful alias system. - -* Also, provides predictive suggestions and offers a serviceable search function. - -It is free, and you can [download and install][1] it from Google Play Store, then run it on your Android device. - -Once you have installed it, you’ll be shown a quick usage guide when you first launch it. After reading the guide, you can start using it with simple commands as the ones explained below. - - [![T-UI Commandline Help Guide](https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Help.jpg)][2] - -T-UI Commandline Help Guide - -To launch an app, simply type the first few letter in its name and the auto completion functionality will show all the available apps on the screen. Then click on the one you want to open. - -``` -$ Telegram #launch telegram -$ WhatsApp #launch whatsapp -$ Chrome #launch chrome -``` - [![T-UI Commandline Usage](https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Usage.jpg)][3] - -T-UI Commandline Usage - -To view your Android device status (battery charge, wifi, mobile data), type. - -``` -$ status -``` - [![Android Phone Status](https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Status.jpg)][4] - -Android Phone Status - -Other useful commands you can use. - -``` -$ uninstall telegram #uninstall telegram -$ search [google, playstore, youtube, files] #search online apps or for a local file -$ wifi #trun wifi on or off -$ cp Downloads/* Music #copy all files from Download folder to Music -$ mv Downloads/* Music #move all files from Download folder to Music -``` - -That’s all! In this article, we reviewed simple yet useful Android app with a Linux-like CLI (Command Line Interface) that turns your regular Android device into a complete command line interface. Give it a try and share your thoughts with us via the comment section below. - --------------------------------------------------------------------------------- - -作者简介: - -Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. - ------------------- - -via: https://www.tecmint.com/t-ui-launcher-turns-android-device-into-linux-cli/ - -作者:[Aaron Kili ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.tecmint.com/author/aaronkili/ -[1]:https://play.google.com/store/apps/details?id=ohi.andre.consolelauncher -[2]:https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Help.jpg -[3]:https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Usage.jpg -[4]:https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Status.jpg -[5]:https://www.tecmint.com/author/aaronkili/ -[6]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ -[7]:https://www.tecmint.com/free-linux-shell-scripting-books/ diff --git a/translated/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md b/translated/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md new file mode 100644 index 0000000000..2f926ab730 --- /dev/null +++ b/translated/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md @@ -0,0 +1,83 @@ +T-UI Launcher - 将 Android 设备变成 Linux 命令行界面 +============================================================ + +你是一位命令行大师,还是只是不想让你的朋友和家人使用你的 Android 设备,那就看下 T-UI Launcher 这个程序。Unix/Linux 用户一定会喜欢这个。 + +T-UI Launcher 是一个免费的轻量级 Android 程序,具有类似 Linux 的 CLI(命令行界面),它可将你常规 Android 设备变成一个完整的命令行界面。对于喜欢使用基于文本的界面的人来说,这是一个简单、快速、智能的启动器。 + +#### T-UI Launcher 功能 + +下面是一些重要的功能: + +* 第一次启动后展示快速使用指南。 + +* 快速、完全可定制。 + +* 提供快速自动补全菜单、强大的别名系统。 + +* 此外,提供预测建议,并提供有用的搜索功能。 + +它是免费的,你可以从 Google Play 商店[下载并安装它][1],接着在 Android 设备中运行。 + +安装完成后,第一次启动时你会看到一个快速指南。阅读完成之后,你可以如下面那样使用简单的命令开始使用了。 + + [![T-UI Commandline Help Guide](https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Help.jpg)][2] + +T-UI 命令行帮助指南 + +要启动一个 app,只要输入几个字母,自动补全功能会在屏幕中展示可用的 app。接着点击你想打开的程序。 + +``` +$ Telegram #launch telegram +$ WhatsApp #launch whatsapp +$ Chrome #launch chrome +``` + [![T-UI Commandline Usage](https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Usage.jpg)][3] + +T-UI 命令行使用 + +要浏览你的 Android 设备状态(电池电量、wifi、移动数据),输入: + +``` +$ status +``` + [![Android Phone Status](https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Status.jpg)][4] + +Android 电话状态 + +另外一个你可以使用的有用的命令。 + +``` +$ uninstall telegram #uninstall telegram +$ search [google, playstore, youtube, files] #search online apps or for a local file +$ wifi #trun wifi on or off +$ cp Downloads/* Music #copy all files from Download folder to Music +$ mv Downloads/* Music #move all files from Download folder to Music +``` + +就是这样了!在本篇中,我们展示了一个带有类似 Liux CLI(命令界面)的简单而有用的 Android 程序,它可以将你的常规 Android 设备变成一个完整的命令行界面。尝试一下并在下面的评论栏分享你的想法。 + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux 系统管理员和网络开发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,并坚信分享知识。 + +------------------ + +via: https://www.tecmint.com/t-ui-launcher-turns-android-device-into-linux-cli/ + +作者:[Aaron Kili ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://play.google.com/store/apps/details?id=ohi.andre.consolelauncher +[2]:https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Help.jpg +[3]:https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Usage.jpg +[4]:https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Status.jpg +[5]:https://www.tecmint.com/author/aaronkili/ +[6]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[7]:https://www.tecmint.com/free-linux-shell-scripting-books/ From ad08a824a1ec50109a3f38cd765952453fb3cef6 Mon Sep 17 00:00:00 2001 From: jasminepeng Date: Mon, 22 May 2017 11:22:10 +0800 Subject: [PATCH 0183/1407] =?UTF-8?q?=E6=A0=A1=E5=AF=B9=E5=AE=8C=E6=AF=95?= =?UTF-8?q?=20@zhousiyu325?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 校对完毕 谢谢 --- ...g ways AI is rapidly invading our lives.md | 46 +++++++++---------- 1 file changed, 23 insertions(+), 23 deletions(-) diff --git a/translated/tech/20170322 5 big ways AI is rapidly invading our lives.md b/translated/tech/20170322 5 big ways AI is rapidly invading our lives.md index 17ced968ac..d4a15c8cdc 100644 --- a/translated/tech/20170322 5 big ways AI is rapidly invading our lives.md +++ b/translated/tech/20170322 5 big ways AI is rapidly invading our lives.md @@ -11,63 +11,63 @@ AI 正快速入侵我们生活的五个方面 ### 1. AI 影响你的购买决定 -最近 [VentureBeat][3] 上的一篇文章,[“AI 将如何帮助我们解读千禧一代”][4]吸引了我的注意。我承认我对人工智能没有思考太多,也没有费力尝试解读千禧一代,所以我很好奇,渴望了解更多。事实证明,文章标题有点误导;“如何卖东西给千禧一代”会是一个更准确的标题。 +最近 [VentureBeat][3] 上的一篇文章,[“AI 将如何帮助我们解读千禧一代”][4]吸引了我的注意。我承认我对人工智能没有思考太多,也没有费力尝试解读千禧一代,所以我很好奇,渴望了解更多。事实证明,文章标题有点误导;“如何卖东西给千禧一代”会是一个更准确的标题。 -根据这篇文章,千禧一代是“一个年龄阶段的人群,被人觊觎,以至于来自全世界的市场经理都在争抢他们”。通过分析网络行为 —— 无论是购物、社交媒体或其他活动 - 机器学习可以帮助预测行为模式,这将可以变成有针对性的广告。文章接着解释如何对物联网和社交媒体平台进行挖掘形成数据点。“使用机器学习挖掘社交媒体数据,可以让公司了解千禧一代如何谈论其产品,他们对一个产品类别的看法,他们对竞争对手的广告活动如何响应,还可获得很多数据,用于设计有针对性的广告,"这篇文章解释说。AI 和千禧一代成为营销的未来并不是什么很令人吃惊的事,但是 X 一代和婴儿潮一代,你们也逃不掉呢! +根据这篇文章,千禧一代是“一个年龄阶段的人群,被人觊觎,以至于来自全世界的市场经理都在争抢他们”。通过分析网络行为 —— 无论是购物、社交媒体或其他活动 - 机器学习可以帮助预测行为模式,这将可以变成有针对性的广告。文章接着解释如何对物联网和社交媒体平台进行挖掘形成数据点。“使用机器学习挖掘社交媒体数据,可以让公司了解千禧一代如何谈论其产品,他们对一个产品类别的看法,他们对竞争对手的广告活动如何响应,还可获得很多数据,用于设计有针对性的广告,"这篇文章解释说。AI 和千禧一代成为营销的未来并不是什么很令人吃惊的事,但是 X 一代和婴儿潮一代,你们也逃不掉呢!(LCTT 译注:X 一代指出生于20世纪60年代中期至70年代末的美国人,婴儿潮是指二战结束后,1946年初至1964年底出生的人) -> 人工智能被用来根据行为变化来定位包括城市人在内的整个人群。 +> 人工智能根据行为变化,将包括城市人在内的整个人群设为目标群体。 -例如, [Raconteur上][23]的一篇文章——"AI将怎样改变购买者的行为"解释说,AI 在网上零售行业最大的力量是它能够迅速适应流动的情况下改变客户行为。人工智能创业公司 [Fluid AI][25]首席执行官 Abhinav Aggarwal 表示,他的公司的软件被客户用来预测客户行为,并且系统注意到在暴风雪期间发生了变化。“那些通常会忽略在一天中发送的电子邮件或应用内通知的用户现在正在打开它们,因为他们在家里没有太多的事情可做。一个小时,AI 系统就适应了新的情况,并在工作时间发送更多的促销材料。"他解释说。 +例如, [Raconteur 上][23]的一篇文章 —— “AI 将怎样改变购买者的行为”解释说,AI 在网上零售行业最大的力量是它能够迅速适应改变客户行为的不断变化的形势。人工智能创业公司 [Fluid AI][25]首席执行官 Abhinav Aggarwal 表示,他公司的软件被一个客户用来预测顾客行为,有一次系统注意到在暴风雪期间发生了一个变化。“那些通常会忽略在一天中发送的电子邮件或应用内通知的用户现在正在打开它们,因为他们在家里没有太多的事情可做。一个小时之内,AI 系统就适应了新的情况,并在工作时间开始发送更多的促销材料。”他解释说。 -AI正在改变了我们怎样花钱和为什么花钱,但是AI是怎样改变我们挣钱的方式的呢? +AI 正在改变们怎样花钱和为什么花钱,但是 AI 是怎样改变我们挣钱的方式的呢? ### 2. 人工智能正在改变我们如何工作 -[Fast 公司][5]最近的一篇文章《这就是在 2017 年人工智能如何改变我们的生活》说道,求职者将会从人工智能中受益。作者解释说,除薪酬趋势更新之外,人工智能将被用来给求职者发送相关职位空缺信息。当你应该升职的时候,你就会得到一个升职的机会。 +[Fast 公司][5]最近的一篇文章“2017 年人工智能将如何改变我们的生活”中说道,求职者将会从人工智能中受益。作者解释说,除更新薪酬趋势之外,人工智能将被用来给求职者发送相关职位空缺信息。当你应该升职的时候,你很可能会得到一个升职的机会。 -人造智能也将被公司用来帮助新入职的员工。文章解释说:“许多新员工在头几天内获得了大量信息,其中大部分不会被保留。” 相反,机器人可能会随着时间的推移向一名新员工“滴滴”,因为它变得更加相关。 +人工智能也可以被公司用来帮助新入职的员工。文章解释说:“许多新员工在刚入职的几天内会获得大量信息,其中大部分不会被保留。” 相反,机器人可能会随着时间的推移,当新员工需要相关信息时,再向他一点点“告知信息”。 -[Inc.][7]的一篇文章[《没有偏见的企业:人工智能将如何重塑招聘机制》][8]着眼于人才管理解决方案提供商 [SAP SuccessFactors][9] 是怎样利用人工智能作为一个工作描述偏差检查器”和检查员工赔偿金的偏差。 +[Inc.][7] 有一篇文章[“没有偏见的企业:人工智能将如何重塑招聘机制”][8],观察了人才管理解决方案提供商 [SAP SuccessFactors][9] 是怎样利用人工智能作为一个工作描述“偏见检查器”,以及检查员工赔偿金的偏见。 -[《Deloitte 2017 人力资本趋势报告》][10]显示,AI 正在激励组织进行重组。Fast公司的文章[《AI 是怎样改变公司组织的方式》][11]审查了这篇报告,该文章是基于全球 10,000 多名人力资源和商业领袖的调查结果。这篇文章解释说:"许多公司现在更注重文化和环境的适应性,而不是聘请最有资格的人来做某个具体任务,因为知道个人角色必须随 AI 的实施而发展 。" 为了适应不断变化的技术,组织也从自上而下的结构转向多学科团队,文章说。 +[《Deloitte 2017 人力资本趋势报告》][10]显示,AI 正在激励组织进行重组。Fast 公司的文章[“AI 是怎样改变公司组织的方式”][11]审查了这篇报告,该报告是基于全球 10,000 多名人力资源和商业领袖的调查结果。这篇文章解释说:"许多公司现在更注重文化和环境的适应性,而不是聘请最有资格的人来做某个具体任务,因为知道个人角色必须随 AI 的实施而发展。" 为了适应不断变化的技术,组织也从自上而下的结构转向多学科团队,文章说。 -###3. AI 正在改变教育 +### 3. AI 正在改变教育 > AI 将使所有教育生态系统的利益相关者受益。 -尽管教育的预算正在缩减,但是教室的规模却正在增长。因此利用技术的进步有助于提高教育体系的生产率和效率,并在提高教育质量和负担能力方面发挥作用。根据VentureBeat上的一篇文章[《2017 年人工智能是怎样改变教育》][26],今年我们将看到 AI 对学生们的书面答案进行评分,机器人回答学生的答案,虚拟个人助理辅导学生等等。文章解释说:“AI 将惠及教育生态系统的所有利益相关者。学生将能够通过即时的反馈和指导学习地更好,教师将获得丰富的学习分析和对个性化教学的见解,父母将以更低的成本看到他们的孩子的更好的职业前景,学校能够规模化优质的教育,政府能够向所有人提供可负担得起的教育。" +尽管教育的预算正在缩减,但是教室的规模却正在增长。因此利用技术的进步有助于提高教育体系的生产率和效率,并在提高教育质量和负担能力方面发挥作用。根据VentureBeat 上的一篇文章[“2017 年人工智能将怎样改变教育”][26],今年我们将看到 AI 对学生们的书面答案进行评分,机器人回答学生的问题,虚拟个人助理辅导学生等等。文章解释说:“AI 将惠及教育生态系统的所有利益相关者。学生将能够通过即时的反馈和指导学习地更好,教师将获得丰富的学习分析和对个性化教学的见解,父母将以更低的成本看到他们的孩子的更好的职业前景,学校能够规模化优质的教育,政府能够向所有人提供可负担得起的教育。" ### 4. 人工智能正在重塑医疗保健 -2017 年 2 月[CB Insights][12]的一篇文章挑选了 106 个医疗保健领域的人工智能初创公司,它们中的很多在过去几年中提高了第一次股权融资。这篇文章说:“在24 家成像和诊断公司中,19 家公司自 2015 年 1 月起就首次公开募股。”这份名单上了有那些从事于远程病人监测,药物发现和肿瘤学方面人工智能的公司。 +2017 年 2 月 [CB Insights][12] 的一篇文章挑选了 106 个医疗保健领域的人工智能初创公司,它们中的很多在过去几年中提高了第一次股权融资。这篇文章说:“在 24 家成像和诊断公司中,19 家公司自 2015 年 1 月起就首次公开募股。”这份名单上了有那些从事于远程病人监测,药物发现和肿瘤学方面人工智能的公司。 -3 月 16 日发表在 TechCrunch 上的一篇关于 AI 进步如何重塑医疗保健的文章解释说:"一旦对人类的 DNA 有了更好的理解,就有机会更进一步,并能根据他们特殊的生活习性为他们提供个性化的见解"。这种趋势预示着“个性化遗传学”的新纪元,人们能够通过获得关于自己身体的前所未有的信息来充分控制自己的健康。" +3 月 16 日发表在 TechCrunch 上的一篇关于 AI 进步如何重塑医疗保健的文章解释说:“一旦对人类的 DNA 有了更好的理解,就有机会更进一步,并能根据他们特殊的生活习性为他们提供个性化的见解。这种趋势预示着‘个性化遗传学’的新纪元,人们能够通过获得关于自己身体的前所未有的信息来充分控制自己的健康。” -本文接着解释说,AI 和机器学习降低了研发新药的成本和时间。部分得益于广泛的测试,新药进入市场需要 12年 以上的时间。这篇文章说:“机器学习算法可以让计算机根据先前处理的数据来"学习"如何做出预测,或者选择(在某些情况下,甚至是产品)需要做什么实验。类似的算法还可用于预测特定化合物对人体的副作用,这样可以加快审批速度。"这篇文章指出,2015 年旧金山的一个创业公司 [Atomwise][15] 完成了对两种可以减少一天内 Ebola 感染的新药物。 +本文接着解释说,AI 和机器学习降低了研发新药的成本和时间。部分得益于广泛的测试,新药进入市场需要 12 年以上的时间。这篇文章说:“机器学习算法可以让计算机根据先前处理的数据来‘学习’如何做出预测,或者选择(在某些情况下,甚至是产品)需要做什么实验。类似的算法还可用于预测特定化合物对人体的副作用,这样可以加快审批速度。”这篇文章指出,2015 年旧金山的一个创业公司 [Atomwise][15] 一天内完成了可以减少 Ebola 感染的两种新药物的分析,而不是花费数年时间。 > AI 正在帮助发现、诊断和治疗新疾病。 -另外一个位于伦敦的初创公司 [BenevolentAI][27] 正在利用人工智能寻找科学文献中的模式。这篇文章说:"最近,这家公司找到了两种可能对 Alzheimer 起作用的化合物,引起了很多制药公司的关注。" +另外一个位于伦敦的初创公司 [BenevolentAI][27] 正在利用人工智能寻找科学文献中的模式。这篇文章说:“最近,这家公司找到了两种可能对 Alzheimer 起作用的化合物,引起了很多制药公司的关注。" -除了有助于研发新药,AI正在帮助发现、诊断和治疗新疾病。TechCrunch 上 文章解释说,过去是根据显示的症状诊断疾病,但是现在 AI 正在被用于检测血液中的疾病特征,并利用对数十亿例临床病例分析进行深度学习获得经验来制定治疗计划。这篇文章说:“IBM 的 Watson 正在与纽约的 Memorial Sloan Kettering 合作,消化理解数十年来关于癌症患者和治疗方面的数据,为了向治疗疑难的癌症病例的医生提供和建议治疗方案。” +除了有助于研发新药,AI 正在帮助发现、诊断和治疗新疾病。TechCrunch 上文章解释说,过去是根据显示的症状诊断疾病,但是现在 AI 正在被用于检测血液中的疾病特征,并利用对数十亿例临床病例分析进行深度学习获得经验来制定治疗计划。这篇文章说:“IBM 的 Watson 正在与纽约的 Memorial Sloan Kettering 合作,消化理解数十年来关于癌症患者和治疗方面的数据,为了向治疗疑难的癌症病例的医生提供和建议治疗方案。” -### 5. AI正在改变我们的爱情生活 +### 5. AI 正在改变我们的爱情生活 -有 195 个国家的超过 5000 万活跃用户通过一个在 2012 年推出的约会应用程序 [Tinder][16] 找到潜在的伴侣。在一篇 [Forbes 采访播客][17]中,Tinder 的创始人兼董事长 Sean Rad spoke 与 Steven Bertoni 对人工智能是如何正在改变人们约会进行过讨论。在一篇[关于采访的文章][18]中,Bertoni 引用了 Rad 说的话,他说:"可能有这样一个时刻,这时 Tinder 非常擅长推测你会感兴趣的人,Tinder 在组织一次约会中可能会做很多跑腿的工作,对吧?"所以,这个 app 会向用户推荐一些附近的同伴,并更进一步,协调彼此的时间安排一次约会,而不只是向用户显示一些有可能的同伴。 +有 195 个国家的超过 5000 万活跃用户通过一个在 2012 年推出的约会应用程序 [Tinder][16] 找到潜在的伴侣。在一个 [Forbes 采访播客][17]中,Tinder 的创始人兼董事长 Sean Rad spoke 与 Steven Bertoni 对人工智能是如何正在改变人们约会进行过讨论。在[关于此次采访的文章][18]中,Bertoni 引用了 Rad 说的话,他说:“可能有这样一个时刻,Tinder 很好的推测你会感兴趣的人,在组织约会中还可能会做很多跑腿的工作,对吧?”所以,这个 app 会向用户推荐一些附近的同伴,并更进一步,协调彼此的时间安排一次约会,而不只是向用户显示一些有可能的同伴。 > 我们的后代真的可能会爱上人工智能。 -你爱上了 AI 吗?我们的后代真的可能会爱上人工智能。Raya Bidshahri 发表在 [Singularity Hub][19] 的一篇文章《AI 将如何重新定义爱情》说,几十年的后,我们可能会认为爱情不再受生物学的限制。 +你爱上了 AI 吗?我们的后代真的可能会爱上人工智能。Raya Bidshahri 发表在 [Singularity Hub][19] 的一篇文章“AI 将如何重新定义爱情”说,几十年的后,我们可能会认为爱情不再受生物学的限制。 -Bidshahri 解释说:"我们的技术符合摩尔定律,正在以惊人的速度增长——智能设备正在越来越多地融入我们的生活。",他补充道:"到 2029 年,我们将会有和人类同等智慧的 AI,而到 21 世纪 40 年代,AI 将会比人类聪明无数倍。许多人预测,有一天我们会与强大的机器合并,我们自己可能会变成人工智能。"他认为在这样一个世界上那些是不可避免的,人们将会接受与完全的非生物相爱。 +Bidshahri 解释说:“我们的技术符合摩尔定律,正在以惊人的速度增长 —— 智能设备正在越来越多地融入我们的生活。”,他补充道:“到 2029 年,我们将会有和人类同等智慧的 AI,而到 21 世纪 40 年代,AI 将会比人类聪明无数倍。许多人预测,有一天我们会与强大的机器合并,我们自己可能会变成人工智能。”他认为在这样一个世界上那些是不可避免的,人们将会接受与完全的非生物相爱。 -这听起来有点怪异,但是相比较于未来机器人将统治世界,爱上AI会是一个更乐观的结果。Bidshahri说:"对AI进行编程,让他们能够感受到爱,这将使我们创造出更富有同情心的AI,这可能也是避免很多人忧虑的AI大灾难的关键。" +这听起来有点怪异,但是相比较于未来机器人将统治世界,爱上 AI 会是一个更乐观的结果。Bidshahri 说:"对 AI 进行编程,让他们能够感受到爱,这将使我们创造出更富有同情心的 AI,这可能也是避免很多人忧虑的 AI 大灾难的关键。" -这份 AI 正在入侵我们生活各领域的其中五个方面的清单仅仅只是涉及到了我们身边的人工智能的表面。哪些 AI 创新是让你最兴奋的,或者是让你最烦恼的?大家可以在文章评论区写下你们的感受。 +这份 AI 正在入侵我们生活各领域的清单只是涉及到了我们身边的人工智能的表面。哪些 AI 创新是让你最兴奋的,或者是让你最烦恼的?大家可以在文章评论区写下你们的感受。 -------------------------------------------------------------------------------- -Rikki Endsley - Rikki Endsley 是开源社区 Opensource.com 的管理员。在过去,她曾做过 Red Hat 开源和标准(OSAS)团队社区传播者;自由技术记者;USENIX 协会的社区管理员; linux 权威杂志 ADMIN 和 Ubuntu User 的合作出版者,还是杂志 Sys Admin 和 UnixReview.com 的主编。在 Twitter上关注她:@rikkiends。 +Rikki Endsley - Rikki Endsley 是开源社区 Opensource.com 的管理员。在过去,她曾做过 Red Hat 开源和标准(OSAS)团队社区传播者;自由技术记者;USENIX 协会的社区管理员;linux 权威杂志 ADMIN 和 Ubuntu User 的合作出版者,还是杂志 Sys Admin 和 UnixReview.com 的主编。在 Twitter 上关注她:@rikkiends。 From 4df81c6539160f2057728c36baa3425a01218fb9 Mon Sep 17 00:00:00 2001 From: ch-cn Date: Mon, 22 May 2017 12:23:27 +0800 Subject: [PATCH 0184/1407] ch-cn translating --- .../tech/20170509 How to Password Protect a Vim File in Linux.md | 1 + ...10 Useful Tips for Writing Effective Bash Scripts in Linux.md | 1 + 2 files changed, 2 insertions(+) diff --git a/sources/tech/20170509 How to Password Protect a Vim File in Linux.md b/sources/tech/20170509 How to Password Protect a Vim File in Linux.md index 3085392c42..616d03b89b 100644 --- a/sources/tech/20170509 How to Password Protect a Vim File in Linux.md +++ b/sources/tech/20170509 How to Password Protect a Vim File in Linux.md @@ -1,5 +1,6 @@ How to Password Protect a Vim File in Linux ============================================================ +ch-cn translating  Download Your Free eBooks NOW - [10 Free Linux eBooks for Administrators][16] | [4 Free Shell Scripting eBooks][17] diff --git a/sources/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md b/sources/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md index add8faf39a..6f0cae4f8a 100644 --- a/sources/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md +++ b/sources/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md @@ -1,5 +1,6 @@ 10 Useful Tips for Writing Effective Bash Scripts in Linux ============================================================ +ch-cn translating [Shell scripting][4] is the easiest form of programming you can learn/do in Linux. More so, it is a required skill for [system administration for automating tasks][5], developing new simple utilities/tools just to mention but a few. From 3e889a4efaac8616fba255bf03766a017cdca4ba Mon Sep 17 00:00:00 2001 From: Ezio Date: Mon, 22 May 2017 15:48:00 +0800 Subject: [PATCH 0185/1407] =?UTF-8?q?20170522-1=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...to Kill a Process from the Command Line.md | 203 ++++++++++++++++++ 1 file changed, 203 insertions(+) create mode 100644 sources/tech/20170519 How to Kill a Process from the Command Line.md diff --git a/sources/tech/20170519 How to Kill a Process from the Command Line.md b/sources/tech/20170519 How to Kill a Process from the Command Line.md new file mode 100644 index 0000000000..143129ab48 --- /dev/null +++ b/sources/tech/20170519 How to Kill a Process from the Command Line.md @@ -0,0 +1,203 @@ +How to Kill a Process from the Command Line +============================================================ + +![stop processes](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/stop-processes.jpg?itok=vfNx8VRz "stop processes") +>Linux has all the tools you need to stop running processes at the command line. Jack Wallen has details.[Creative Commons Zero][4] + +Picture this: You’ve launched an application (be it from your favorite desktop menu or from the command line) and you start using that launched app, only to have it lock up on you, stop performing, or unexpectedly die. You try to run the app again, but it turns out the original never truly shut down completely. + +What do you do? You kill the process. But how? Believe it or not, your best bet most often lies within the command line. Thankfully, Linux has every tool necessary to empower you, the user, to kill an errant process. However, before you immediately launch that command to kill the process, you first have to know what the process is. How do you take care of this layered task? It’s actually quite simple...once you know the tools at your disposal. + +Let me introduce you to said tools. + +The steps I’m going to outline will work on almost every Linux distribution, whether it is a desktop or a server. I will be dealing strictly with the command line, so open up your terminal and prepare to type. + +### Locating the process + +The first step in killing the unresponsive process is locating it. There are two commands I use to locate a process:  _top _ and  _ps_ . Top is a tool every administrator should get to know. With  _top_ , you get a full listing of currently running process. From the command line, issue  _top_  to see a list of your running processes (Figure 1). + +### [killa.jpg][5] + +![top](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/killa.jpg?itok=95cUI9Lh "top") + +Figure 1: The top command gives you plenty of information.[Used with permission][1] + +From this list you will see some rather important information. Say, for example, Chrome has become unresponsive. According to our  _top_ display, we can discern there are four instances of chrome running with Process IDs (PID) 3827, 3919, 10764, and 11679\. This information will be important to have with one particular method of killing the process. + +Although  _top_  is incredibly handy, it’s not always the most efficient means of getting the information you need. Let’s say you know the Chrome process is what you need to kill, and you don’t want to have to glance through the real-time information offered by  _top_ . For that, you can make use of the  _ps_ command and filter the output through  _grep_ . The  _ps_  command reports a snapshot of a current process and  _grep _ prints lines matching a pattern. The reason why we filter  _ps_  through  _grep_  is simple: If you issue the  _ps_  command by itself, you will get a snapshot listing of all current processes. We only want the listing associated with Chrome. So this command would look like: + +``` +ps aux | grep chrome +``` + +The  _aux_  options are as follows: + +* a = show processes for all users + +* u = display the process's user/owner + +* x = also show processes not attached to a terminal + +The  _x_  option is important when you’re hunting for information regarding a graphical application. + +When you issue the command above, you’ll be given more information than you need (Figure 2) for the killing of a process, but it is sometimes more efficient than using top. + +### [killb.jpg][6] + +![ps command](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/killb.jpg?itok=vyWIuTva "ps command") + +Figure 2: Locating the necessary information with the ps command.[Used with permission][2] + +### Killing the process + +Now we come to the task of killing the process. We have two pieces of information that will help us kill the errant process: + +* Process name + +* Process ID + +Which you use will determine the command used for termination. There are two commands used to kill a process: + +* kill - Kill a process by ID + +* killall - Kill a process by name + +There are also different signals that can be sent to both kill commands. What signal you send will be determined by what results you want from the kill command. For instance, you can send the HUP (hang up) signal to the kill command, which will effectively restart the process. This is always a wise choice when you need the process to immediately restart (such as in the case of a daemon). You can get a list of all the signals that can be sent to the kill command by issuing kill -l. You’ll find quite a large number of signals (Figure 3). + +### [killc.jpg][7] + +![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/killc.jpg?itok=9ewRHFW2) + +Figure 3: The available kill signals.[Used with permission][3] + +The most common kill signals are: + +| + +Signal Name + + | + +Single Value + + | + +Effect + + | +| + +SIGHUP + + | + +1 + + | + +Hangup + + | +| + +SIGINT + + | + +2 + + | + +Interrupt from keyboard + + | +| + +SIGKILL + + | + +9 + + | + +Kill signal + + | +| + +SIGTERM + + | + +15 + + | + +Termination signal + + | +| + +SIGSTOP + + | + +17, 19, 23 + + | + +Stop the process + + | + +What’s nice about this is that you can use the Signal Value in place of the Signal Name. So you don’t have to memorize all of the names of the various signals.  +So, let’s now use the  _kill _ command to kill our instance of chrome. The structure for this command would be: + +``` +kill SIGNAL PID +``` + +Where SIGNAL is the signal to be sent and PID is the Process ID to be killed. We already know, from our  _ps_  command that the IDs we want to kill are 3827, 3919, 10764, and 11679\. So to send the kill signal, we’d issue the commands: + +``` +kill -9 3827 + +kill -9 3919 + +kill -9 10764 + +kill -9 11679 +``` + +Once we’ve issued the above commands, all of the chrome processes will have been successfully killed. + +Let’s take the easy route! If we already know the process we want to kill is named chrome, we can make use of the  _killall _ command and send the same signal the process like so: + + _killall -9 chrome_ + +The only caveat to the above command is that it may not catch all of the running chrome processes. If, after running the above command, you issue the ps aux|grep chrome command and see remaining processes running, your best bet is to go back to the  _kill _ command and send signal 9 to terminate the process by PID. + +### Ending processes made easy + +As you can see, killing errant processes isn’t nearly as challenging as you might have thought. When I wind up with a stubborn process, I tend to start off with the  _killall _ command as it is the most efficient route to termination. However, when you wind up with a really feisty process, the  _kill _ command is the way to go. + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/learn/intro-to-linux/2017/5/how-kill-process-command-line + +作者:[JACK WALLEN][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.linux.com/users/jlwallen +[1]:https://www.linux.com/licenses/category/used-permission +[2]:https://www.linux.com/licenses/category/used-permission +[3]:https://www.linux.com/licenses/category/used-permission +[4]:https://www.linux.com/licenses/category/creative-commons-zero +[5]:https://www.linux.com/files/images/killajpg +[6]:https://www.linux.com/files/images/killbjpg +[7]:https://www.linux.com/files/images/killcjpg +[8]:https://www.linux.com/files/images/stop-processesjpg From ace5682f7eac01ede65c63f600d7ab4ba9c0cc97 Mon Sep 17 00:00:00 2001 From: Ezio Date: Mon, 22 May 2017 15:49:55 +0800 Subject: [PATCH 0186/1407] =?UTF-8?q?20170522-2=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...516 What Fuchsia could mean for Android.md | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 sources/tech/20170516 What Fuchsia could mean for Android.md diff --git a/sources/tech/20170516 What Fuchsia could mean for Android.md b/sources/tech/20170516 What Fuchsia could mean for Android.md new file mode 100644 index 0000000000..9661f6237c --- /dev/null +++ b/sources/tech/20170516 What Fuchsia could mean for Android.md @@ -0,0 +1,72 @@ +What Fuchsia could mean for Android +============================================================ + +Fuchsia could be next replacement for Android, or Android and Chrome OS. Speculation abounds, and Jack Wallen adds to this speculation some kudos and caveats for Google to consider. + +In this white paper, you’ll learn why legacy IT systems create drag on businesses, and how companies can transform their operations and reap the benefits of hybrid IT by partnering with the right managed services provider. [Download Now][9] + + ![fuchsiahero.jpg](https://tr1.cbsistatic.com/hub/i/r/2017/05/16/d2a51714-2cd0-4fd5-9639-a6f2f8140c2e/resize/770x/10063b88bf93990b65e5d14ee33a0aac/fuchsiahero.jpg) Image: Jack Wallen + +Google has never been one to settle or to do things in a way that is not decidedly "Google". So it should have come as no surprise to anyone that they began working on a project that had many scratching their heads. The project is called [Fuschia][6] and most people that follow Google and Android closely, know of this new platform. + +For those that haven't been following the latest and greatest from Google, Fuschia is a new, real-time, open source operating system that first popped up on the radar in August, 2016\. Back then, Fuchsia was nothing more than a command line. Less than a year has zipped by and the platform already has a rather interesting GUI. + +Much to the chagrin of the Linux faithful, Fuchsia does not use the Linux kernel. This project is all Google and uses a Google-developed microkernel, named "Magenta." Why would they do this? Consider the fact that Google's newest device, the Pixel, runs kernel 3.18 and you have your answer. The 3.18 Linux kernel was released in 2014 (which, in tech terms is ancient). With that in mind, why wouldn't Google want to break out completely on their own to keep their mobile platform as up to date as possible? + +Although it pains me to think that Linux might not be (in some unknown future date) powering the most widely-used ecosystem on the planet, I believe this is the right move for Google, with one major caveat. + +### First, a couple of kudos + +I have to first say, bravo to Google for open sourcing Fuchsia. This was the right move. Android has benefitted from the open source Linux kernel for years, so it only makes sense that Google would open up their latest project. To be perfectly honest, had it not been for open source and the Linux kernel, Android would not have risen nearly as quickly as it did. In fact, I would venture a guess to say that, had it not been for Android being propped up by Linux and open source, the mobile market share would show a very different, apple-shaped, picture at the moment. + +The next bit of bravo comes by way of necessity. Operating systems need to be completely rethought now and then. Android is an amazing platform that serves the mobile world quite well. However, there's only so much evolution one can squeeze out of it; and considering the consuming world is always looking for next big thing, Android (and iOS) can only deliver so many times before they have been wrung dry. Couple that with a sorely out of date kernel and you have a perfect storm ready for the likes of Fuchsia. + +Google has never been one to remain stagnant and this new platform is proof. + +### That darned caveat + +I will preface this by reminding everyone of my open source background. I have been a user of Linux since the late 90s and have covered nearly every aspect of open source to be found. Over the last few years, I've been watching and commenting on the goings on with Ubuntu and their (now) failed attempt at convergence. With that said, here's my concern with Fuchsia. + +My suspicion is that Google's big plan for Fucshia is to create a single operating system for all devices: Smartphones, IoT, Chromebooks. On the surface, that sounds like an idea that would bear significant fruit; but if you examine the struggles Canonical endured with Unity 8/Mir/Convergence, you cringe at the idea of "one platform to rule them all". Of course, this isn't quite the same. I doubt Google is creating a single platform that will allow you to "converge" all of your devices. After all, what benefit would there be to converging IoT with your smartphone? It's not like we need to start exchanging data between a phone and a thermostat. Right? Right??? + +Even so, should that be the plan for Google, I would caution them to look closely at what befell Canonical and Unity 8\. It was an outstanding idea that simply couldn't come to fruition. + +I could be wrong about this. Google might be thinking of Fuchsia as nothing more than a replacement for Android. It is quite possible this was Google needing to replace the outdated Linux kernel and deciding they may as well go "all in". But considering Armadillo (the Fuchsia UI) has been written in the cross-platform [Flutter SDK][7], the idea of crossing the platform boundary starts to fall into the realm of the possible. + +Or, maybe Fuchsia is simply just Google saying "Let's rebuild our smartphone platform with the knowledge we have today and see where it goes." If that's the case, I would imagine the Google mobile OS will be primed for major success. However, there's one elephant in the room that many have yet to address that hearkens back to "one platform to rule them all". Google has been teasing Android apps on Chromebooks for quite some time. Unfortunately, the success with this idea has been moderate (at best). With Microsoft going out of their way to compete with Chromebooks, Google knows they have to expand that ecosystem, or else lose precious ground (such as within the education arena). One way to combat this is with a single OS to drive both smartphones and Chromebooks. It would mean all apps would work on both platforms (which would be a serious boon) and a universality to the ecosystem (again, massive boon). + +### Speculation + +Google is very good at keeping this sort of thing close to the vest; which translates to a lot of speculation on the part of pundits. Generally speaking, at least with Android, Google has always seemed to make the right moves. If they believe Fuchsia is the way to go, then I'm inclined to believe them. However, there are so many uncertainties surrounding this platform that one is left constantly scratching one's head in wonder. + +What do you think? What will Fuchsia become? Speculate with me. + +-------------------------------------------------------------------------------- + +作者简介: + +Jack Wallen is an award-winning writer for TechRepublic and Linux.com. He’s an avid promoter of open source and the voice of The Android Expert. For more news about Jack Wallen, visit his website jackwallen.com. + +------------------- + +via: http://www.techrepublic.com/article/what-fuchsia-could-mean-for-android/ + +作者:[About Jack Wallen ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.techrepublic.com/article/what-fuchsia-could-mean-for-android/#modal-bio +[1]:http://www.techrepublic.com/article/biometric-mobile-payments-will-hit-2b-this-year/ +[2]:http://www.techrepublic.com/article/apple-invests-200m-in-us-manufacturing-to-help-corning-produce-new-state-of-the-art-glass/ +[3]:http://www.techrepublic.com/article/google-will-soon-require-android-for-work-profiles-for-enterprise-users/ +[4]:http://www.techrepublic.com/newsletters/ +[5]:http://www.techrepublic.com/article/what-fuchsia-could-mean-for-android/#postComments +[6]:https://github.com/fuchsia-mirror +[7]:https://flutter.io/ +[8]:http://intent.cbsi.com/redir?tag=medc-content-top-leaderboard&siteId=11&rsid=cbsitechrepublicsite&pagetype=article&sl=en&sc=us&topicguid=09288d3a-8606-11e2-a661-024c619f5c3d&assetguid=714cb8ff-ebf0-4584-a421-e8464aae66cf&assettype=content_article&ftag_cd=LGN3588bd2&devicetype=desktop&viewguid=4c47ca57-283d-4861-a131-09e058b652ac&q=&ctype=docids;promo&cval=33109435;7205&ttag=&ursuid=&bhid=&destUrl=http%3A%2F%2Fwww.techrepublic.com%2Fresource-library%2Fwhitepapers%2Ftaming-it-complexity-with-managed-services-japanese%2F%3Fpromo%3D7205%26ftag%3DLGN3588bd2%26cval%3Dcontent-top-leaderboard +[9]:http://intent.cbsi.com/redir?tag=medc-content-top-leaderboard&siteId=11&rsid=cbsitechrepublicsite&pagetype=article&sl=en&sc=us&topicguid=09288d3a-8606-11e2-a661-024c619f5c3d&assetguid=714cb8ff-ebf0-4584-a421-e8464aae66cf&assettype=content_article&ftag_cd=LGN3588bd2&devicetype=desktop&viewguid=4c47ca57-283d-4861-a131-09e058b652ac&q=&ctype=docids;promo&cval=33109435;7205&ttag=&ursuid=&bhid=&destUrl=http%3A%2F%2Fwww.techrepublic.com%2Fresource-library%2Fwhitepapers%2Ftaming-it-complexity-with-managed-services-japanese%2F%3Fpromo%3D7205%26ftag%3DLGN3588bd2%26cval%3Dcontent-top-leaderboard +[10]:http://www.techrepublic.com/rssfeeds/topic/android/ +[11]:http://www.techrepublic.com/meet-the-team/us/jack-wallen/ +[12]:https://twitter.com/intent/user?screen_name=jlwallen From 3d3a812806b284824d092701b61104a5b9f93eae Mon Sep 17 00:00:00 2001 From: Ezio Date: Mon, 22 May 2017 15:52:25 +0800 Subject: [PATCH 0187/1407] =?UTF-8?q?20170522-3=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ow Microsoft is becoming a Linux vendor.md | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 sources/talk/20170516 How Microsoft is becoming a Linux vendor.md diff --git a/sources/talk/20170516 How Microsoft is becoming a Linux vendor.md b/sources/talk/20170516 How Microsoft is becoming a Linux vendor.md new file mode 100644 index 0000000000..0909b4999b --- /dev/null +++ b/sources/talk/20170516 How Microsoft is becoming a Linux vendor.md @@ -0,0 +1,60 @@ +How Microsoft is becoming a Linux vendor +===================================== + + +>Microsoft is bridging the gap with Linux by baking it into its own products. + +![](http://images.techhive.com/images/article/2017/05/microsoft-100722875-large.jpg) + + +Linux and open source technologies have become too dominant in data centers, cloud and IoT for Microsoft to ignore them. + +On Microsoft’s own cloud, one in three machines run Linux. These are Microsoft customers who are running Linux. Microsoft needs to support the platform they use, or they will go somewhere else.  + +Here's how Microsoft's Linux strategy breaks down on its developer platform (Windows 10), on its cloud (Azure) and datacenter (Windows Server). + +**Linux in Windows**: IT professionals managing Linux machines on public or private cloud need native UNIX tooling. Linux and macOS are the only two platforms that offer such native capabilities. No wonder all you see is MacBooks or a few Linux desktops at events like DockerCon, OpenStack Summit or CoreOS Fest. + +To bridge the gap, Microsoft worked with Canonical to build a Linux subsystem within Windows that offers native Linux tooling. It’s a great compromise, where IT professionals can continue to use Windows 10 desktop while getting to run almost all Linux utilities to manage their Linux machines. + +**Linux in Azure**: What good is a cloud that can’t run fully supported Linux machines? Microsoft has been working with Linux vendors that allow customers to run Linux applications and workloads on Azure. + +Microsoft not only managed to sign deals with all three major Linux vendors Red Hat, SUSE and Canonical, it also worked with countless other companies to offer support for community-based distros like Debian. + +**Linux in Windows Server**: This is the last missing piece of the puzzle. There is a massive ecosystem of Linux containers that are used by customers. There are over 900,000 Docker containers on Docker Hub, which can run only on Linux machines. Microsoft wanted to bring these containers to its own platform. + +At DockerCon, Microsoft announced support for Linux containers on Windows Server bringing all those containers to Linux. + +Things are about to get more interesting, after the success of Bash on Ubuntu on Windows 10, Microsoft is bringing Ubuntu bash to Windows Server. Yes, you heard it right. Windows Server will now have a Linux subsystem. + +Rich Turner, Senior Program Manager at Microsoft told me, “WSL on the server provides admins with a preference for *NIX admin scripting & tools to have a more familiar environment in which to work.” + +Microsoft said in an announcement that It will allow IT professionals “to use the same scripts, tools, procedures and container images they have been using for Linux containers on their Windows Server container host. These containers use our Hyper-V isolation technology combined with your choice of Linux kernel to host the workload while the management scripts and tools on the host use WSL.” + +With all three bases covered, Microsoft has succeeded in creating an environment where its customers don't have to deal with any Linux vendor. + +### What does it mean for Microsoft? + +By baking Linux into its own products, Microsoft has become a Linux vendor. They are part of the Linux Foundation, they are one of the many contributors to the Linux kernel, and they now distribute Linux from their own store.  + +There is only one minor problem. Microsoft doesn’t own any Linux technologies. They are totally dependent on an external vendor, in this case Canonical, for their entire Linux layer. Too risky a proposition, if Canonical gets acquired by a fierce competitor. + +It might make sense for Microsoft to attempt to acquire Canonical and bring the core technologies in house. It makes sense.  + +### What does it mean for Linux vendors + +On the surface, it’s a clear victory for Microsoft as its customers can live within the Windows world. It will also contain the momentum of Linux in a datacenter. It might also affect Linux on the desktop as now IT professionals looking for *NIX tooling don’t have to run Linux desktop, they can do everything from within Windows. + +Is Microsoft's victory a loss for traditional Linux vendors? To some degree, yes. Microsoft has become a direct competitor. But the clear winner here is Linux. + +-------------------------------------------------------------------------------- + +via: http://www.cio.com/article/3197016/linux/how-microsoft-is-becoming-a-linux-vendor.html + +作者:[ Swapnil Bhartiya ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.cio.com/author/Swapnil-Bhartiya/ From 16d82b2ffff55e63439e4cda063db450a0d1e1bf Mon Sep 17 00:00:00 2001 From: Ezio Date: Mon, 22 May 2017 15:54:37 +0800 Subject: [PATCH 0188/1407] =?UTF-8?q?20170522-4=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... learning is coming to the Linux kernel.md | 52 +++++++++++++++++++ 1 file changed, 52 insertions(+) create mode 100644 sources/talk/20170515 Faster machine learning is coming to the Linux kernel.md diff --git a/sources/talk/20170515 Faster machine learning is coming to the Linux kernel.md b/sources/talk/20170515 Faster machine learning is coming to the Linux kernel.md new file mode 100644 index 0000000000..eb60bec78e --- /dev/null +++ b/sources/talk/20170515 Faster machine learning is coming to the Linux kernel.md @@ -0,0 +1,52 @@ +Faster machine learning is coming to the Linux kernel +============================================================ + +### The addition of heterogenous memory management to the Linux kernel will unlock new ways to speed up GPUs, and potentially other kinds of machine learning hardware + + +![Faster machine learning is coming to a Linux kernel near you](http://images.techhive.com/images/article/2015/12/machine_learning-100633721-primary.idge.jpg) +>Credit: Thinkstock + +It's been a long time in the works, but a memory management feature intended to give machine learning or other GPU-powered applications a major performance boost is close to making it into one of the next revisions of the kernel. + +Heterogenous memory management (HMM) allows a device’s driver to mirror the address space for a process under its own memory management. As Red Hat developer Jérôme Glisse [explains][10], this makes it easier for hardware devices like GPUs to directly access the memory of a process without the extra overhead of copying anything. It also doesn't violate the memory protection features afforded by modern OSes. + + +One class of application that stands to benefit most from HMM is GPU-based machine learning. Libraries like OpenCL and CUDA would be able to get a speed boost from HMM. HMM does this in much the same way as [speedups being done to GPU-based machine learning][11], namely by leaving data in place near the GPU, operating directly on it there, and moving it around as little as possible. + +These kinds of speed-ups for CUDA, Nvidia’s library for GPU-based processing, would only benefit operations on Nvidia GPUs, but those GPUs currently constitute the vast majority of the hardware used to accelerate number crunching. However, OpenCL was devised to write code that could target multiple kinds of hardware—CPUs, GPUs, FPGAs, and so on—so HMM could provide much broader benefits as that hardware matures. + + +There are a few obstacles to getting HMM into a usable state in Linux. First is kernel support, which has been under wraps for quite some time. HMM was first proposed as a Linux kernel patchset [back in 2014][12], with Red Hat and Nvidia both involved as key developers. The amount of work involved wasn’t trivial, but the developers believe code could be submitted for potential inclusion within the next couple of kernel releases. + +The second obstacle is video driver support, which Nvidia has been working on separately. According to Glisse’s notes, AMD GPUs are likely to support HMM as well, so this particular optimization won’t be limited to Nvidia GPUs. AMD has been trying to ramp up its presence in the GPU market, potentially by [merging GPU and CPU processing][13] on the same die. However, the software ecosystem still plainly favors Nvidia; there would need to be a few more vendor-neutral projects like HMM, and OpenCL performance on a par with what CUDA can provide, to make real choice possible. + +The third obstacle is hardware support, since HMM requires the presence of a replayable page faults hardware feature to work. Only Nvidia’s Pascal line of high-end GPUs supports this feature. In a way that’s good news, since it means Nvidia will only need to provide driver support for one piece of hardware—requiring less work on its part—to get HMM up and running. + +Once HMM is in place, there will be pressure on public cloud providers with GPU instances to [support the latest-and-greatest generation of GPU][14]. Not just by swapping old-school Nvidia Kepler cards for bleeding-edge Pascal GPUs; as each succeeding generation of GPU pulls further away from the pack, support optimizations like HMM will provide strategic advantages. + +-------------------------------------------------------------------------------- + +via: http://www.infoworld.com/article/3196884/linux/faster-machine-learning-is-coming-to-the-linux-kernel.html + +作者:[Serdar Yegulalp][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.infoworld.com/author/Serdar-Yegulalp/ +[1]:https://twitter.com/intent/tweet?url=http%3A%2F%2Fwww.infoworld.com%2Farticle%2F3196884%2Flinux%2Ffaster-machine-learning-is-coming-to-the-linux-kernel.html&via=infoworld&text=Faster+machine+learning+is+coming+to+the+Linux+kernel +[2]:https://www.facebook.com/sharer/sharer.php?u=http%3A%2F%2Fwww.infoworld.com%2Farticle%2F3196884%2Flinux%2Ffaster-machine-learning-is-coming-to-the-linux-kernel.html +[3]:http://www.linkedin.com/shareArticle?url=http%3A%2F%2Fwww.infoworld.com%2Farticle%2F3196884%2Flinux%2Ffaster-machine-learning-is-coming-to-the-linux-kernel.html&title=Faster+machine+learning+is+coming+to+the+Linux+kernel +[4]:https://plus.google.com/share?url=http%3A%2F%2Fwww.infoworld.com%2Farticle%2F3196884%2Flinux%2Ffaster-machine-learning-is-coming-to-the-linux-kernel.html +[5]:http://reddit.com/submit?url=http%3A%2F%2Fwww.infoworld.com%2Farticle%2F3196884%2Flinux%2Ffaster-machine-learning-is-coming-to-the-linux-kernel.html&title=Faster+machine+learning+is+coming+to+the+Linux+kernel +[6]:http://www.stumbleupon.com/submit?url=http%3A%2F%2Fwww.infoworld.com%2Farticle%2F3196884%2Flinux%2Ffaster-machine-learning-is-coming-to-the-linux-kernel.html +[7]:http://www.infoworld.com/article/3196884/linux/faster-machine-learning-is-coming-to-the-linux-kernel.html#email +[8]:http://www.infoworld.com/article/3152565/linux/5-rock-solid-linux-distros-for-developers.html#tk.ifw-infsb +[9]:http://www.infoworld.com/newsletters/signup.html#tk.ifw-infsb +[10]:https://lkml.org/lkml/2017/4/21/872 +[11]:http://www.infoworld.com/article/3195437/machine-learning-analytics-get-a-boost-from-gpu-data-frame-project.html +[12]:https://lwn.net/Articles/597289/ +[13]:http://www.infoworld.com/article/3099204/hardware/amd-mulls-a-cpugpu-super-chip-in-a-server-reboot.html +[14]:http://www.infoworld.com/article/3126076/artificial-intelligence/aws-machine-learning-vms-go-faster-but-not-forward.html From e606f482a36e552c476d90e68bca0b2d5c8ce4e7 Mon Sep 17 00:00:00 2001 From: Ezio Date: Mon, 22 May 2017 15:58:55 +0800 Subject: [PATCH 0189/1407] =?UTF-8?q?20170522-5=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7 Security Debt is an Engineers Problem.md | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 sources/talk/20170517 Security Debt is an Engineers Problem.md diff --git a/sources/talk/20170517 Security Debt is an Engineers Problem.md b/sources/talk/20170517 Security Debt is an Engineers Problem.md new file mode 100644 index 0000000000..bde898cbff --- /dev/null +++ b/sources/talk/20170517 Security Debt is an Engineers Problem.md @@ -0,0 +1,103 @@ +Security Debt is an Engineer’s Problem +============================================================ + +![](https://cdn.thenewstack.io/media/2017/05/d6fe35b0-11416417-1257170530979237-7594665410266720452-o_2_orig-1024x641.jpg) + +![](https://cdn.thenewstack.io/media/2017/05/ea8298a9-keziah-slide1-300x165.png) +>Keziah Plattner of AirBnBSecurity. + +Just like organizations can build up technical debt, so too can they also build up something called “security debt,” if they don’t plan accordingly, attendees learned at the [WomenWhoCode Connect ][5]event at Twitter headquarters in San Francisco last month. + +Security has got to be integral to every step of the software development process, stressed [Mary Ann Davidson][6], Oracle’s Chief Security Officer, in a keynote talk with about security for developers with [Zassmin Montes de Oca][7] of [WomenWhoCode][8]. + +In the past, security used to be ignored by pretty much everyone, except banks. But security is more critical than it has ever been because there are so many access points. We’ve entered the era of [Internet of Things][9], where thieves can just hack your fridge to see that you’re not home. + +Davidson is in charge of assurance at Oracle, “making sure we build security into everything we build, whether it’s an on-premise product, whether it’s a cloud service, even devices we have that support group builds at customer sites and reports data back to us, helping us do diagnostics — every single one of those things has to have security engineered into it.” + +![](https://cdn.thenewstack.io/media/2017/05/8d5dc451-keziah-talking-225x300.jpg) + +Plattner talking to a capacity crowd at #WWCConnect + +AirBnB’s [Keziah Plattner][10] echoed that sentiment in her breakout session. “Most developers don’t see security as their job,” she said, “but this has to change.” + +She shared four basic security principles for engineers. First, security debt is expensive. There’s a lot of talk about [technical debt ][11]and she thinks security debt should be included in those conversations. + +“This historical attitude is ‘We’ll think about security later,’” Plattner said. As companies grab the low-hanging fruit of software efficiency and growth, they ignore security, but an initial insecure design can cause problems for years to come. + +It’s very hard to add security to an existing vulnerable system, she said. Even when you know where the security holes are and have budgeted the time and resources to make the changes, it’s time-consuming and difficult to re-engineer a secure system. + +So it’s key, she said, to build security into your design from the start. Think of security as part of the technical debt to avoid. And cover all possibilities. + +Most importantly, according to Plattner, is the difficulty in getting to people to change their behavior. No one will change voluntarily, she said, even when you point out that the new behavior is more secure. We all nodded. + +Davidson said engineers need to start thinking about how their code could be attacked, and design from that perspective. She said she only has two rules. The first is never trust any unvalidated data and rule two is see rule one. + +“People do this all the time. They say ‘My client sent me the data so it will be fine.’ Nooooooooo,” she said, to laughs. + +The second key to security, Plattner said, is “never trust users.” + +Davidson put it another way: “My job is to be a professional paranoid.” She worries all the time about how someone might breach her systems even inadvertently. This is not academic, there has been recent denial of service attacks through IoT devices. + +### Little Bobby Tables + +If part of your security plan is trusting users to do the right thing, your system is inherently insecure regardless of whatever other security measures you have in place, said Plattner. + +It’s important to properly sanitize all user input, she explained, showing the [XKCD cartoon][12] where a mom wiped out an entire school database because her son’s middle name was “DropTable Students.” + +So sanitize all user input. Check. + +She showed an example of JavaScript developers using Eval on open source. “A good ground rule is ‘Never use eval(),’” she cautioned. The [eval() ][13]function evaluates JavaScript code. “You’re opening your system to random users if you do.” + +Davidson cautioned that her paranoia extends to including security testing your example code in documentation. “Because we all know no one ever copies sample code,” she said to laughter. She underscored the point that any code should be subject to security checks. + +![](https://cdn.thenewstack.io/media/2017/05/87efe589-keziah-path-300x122.png) + +Make it easy + +Plattner’s suggestion three: Make security easy. Take the path of least resistance, she suggested. + +Externally, make users opt out of security instead of opting in, or, better yet, make it mandatory. Changing people’s behavior is the hardest problem in tech, she said. Once users get used to using your product in a non-secure way, getting them to change in the future is extremely difficult. + +Internal to your company, she suggested make tools that standardize security so it’s not something individual developers need to think about. For example, encrypting data as a service so engineers can just call the service to encrypt or decrypt data. + +Make sure that your company is focused on good security hygiene, she said. Switch to good security habits across the company. + +You’re only secure as your weakest link, so it’s important that each individual also has good personal security hygiene as well as having good corporate security hygiene. + +At Oracle, they’ve got this covered. Davidson said she got tired of explaining security to engineers who graduated college with absolutely no security training, so she wrote the first coding standards at Oracle. There are now hundreds of pages with lots of contributors, and there are classes that are mandatory. They have metrics for compliance to security requirements and measure it. The classes are not just for engineers, but for doc writers as well. “It’s a cultural thing,” she said. + +And what discussion about security would be secure without a mention of passwords? While everyone should be using a good password manager, Plattner said, but they should be mandatory for work, along with two-factor authentication. + +Basic password principles should be a part of every engineer’s waking life, she said. What matters most in passwords is their length and entropy — making the collection of keystrokes as random as possible. A robust password entropy checker is invaluable for this. She recommends [zxcvbn][14], the Dropbox open-source entropy checker. + +Another trick is to use something intentionally slow like [bcrypt][15] when authenticating user input, said Plattner. The slowness doesn’t bother most legit users but irritates hackers who try to force password attempts. + +All of this adds up to job security for anyone wanting to get into the security side of technology, said Davidson. We’re putting more code more places, she said, and that creates systemic risk. “I don’t think anybody is not going to have a job in security as long as we keep doing interesting things in technology.” + +-------------------------------------------------------------------------------- + +via: https://thenewstack.io/security-engineers-problem/ + +作者:[TC Currie][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://thenewstack.io/author/tc/ +[1]:http://twitter.com/share?url=https://thenewstack.io/security-engineers-problem/&text=Security+Debt+is+an+Engineer%E2%80%99s+Problem+ +[2]:http://www.facebook.com/sharer.php?u=https://thenewstack.io/security-engineers-problem/ +[3]:http://www.linkedin.com/shareArticle?mini=true&url=https://thenewstack.io/security-engineers-problem/ +[4]:https://thenewstack.io/security-engineers-problem/#disqus_thread +[5]:http://connect2017.womenwhocode.com/ +[6]:https://www.linkedin.com/in/mary-ann-davidson-235ba/ +[7]:https://www.linkedin.com/in/zassmin/ +[8]:https://www.womenwhocode.com/ +[9]:https://www.thenewstack.io/tag/Internet-of-Things +[10]:https://twitter.com/ittskeziah +[11]:https://martinfowler.com/bliki/TechnicalDebt.html +[12]:https://xkcd.com/327/ +[13]:https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/eval +[14]:https://blogs.dropbox.com/tech/2012/04/zxcvbn-realistic-password-strength-estimation/ +[15]:https://en.wikipedia.org/wiki/Bcrypt +[16]:https://thenewstack.io/author/tc/ From d06b50474878039c66522986b38ee177f6ea0552 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 22 May 2017 16:38:14 +0800 Subject: [PATCH 0190/1407] =?UTF-8?q?PRF&PUB:20170505=20T-UI=20Launcher=20?= =?UTF-8?q?=E2=80=93=20Turns=20Android=20Device=20into=20Linux=20Command?= =?UTF-8?q?=20Line=20Interface.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @geekpi --- ... Device into Linux Command Line Interface.md | 51 +++++++++---------- 1 file changed, 25 insertions(+), 26 deletions(-) rename {translated/tech => published}/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md (54%) diff --git a/translated/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md b/published/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md similarity index 54% rename from translated/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md rename to published/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md index 2f926ab730..31f0871390 100644 --- a/translated/tech/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md +++ b/published/20170505 T-UI Launcher – Turns Android Device into Linux Command Line Interface.md @@ -1,61 +1,60 @@ -T-UI Launcher - 将 Android 设备变成 Linux 命令行界面 +T-UI Launcher:将你的 Android 设备变成 Linux 命令行界面 ============================================================ -你是一位命令行大师,还是只是不想让你的朋友和家人使用你的 Android 设备,那就看下 T-UI Launcher 这个程序。Unix/Linux 用户一定会喜欢这个。 +不管你是一位命令行大师,还是只是不想让你的朋友和家人使用你的 Android 设备,那就看下 T-UI Launcher 这个程序。Unix/Linux 用户一定会喜欢这个。 -T-UI Launcher 是一个免费的轻量级 Android 程序,具有类似 Linux 的 CLI(命令行界面),它可将你常规 Android 设备变成一个完整的命令行界面。对于喜欢使用基于文本的界面的人来说,这是一个简单、快速、智能的启动器。 +T-UI Launcher 是一个免费的轻量级 Android 程序,具有类似 Linux 的命令行界面,它可将你的普通 Android 设备变成一个完整的命令行界面。对于喜欢使用基于文本的界面的人来说,这是一个简单、快速、智能的启动器。 #### T-UI Launcher 功能 下面是一些重要的功能: * 第一次启动后展示快速使用指南。 - -* 快速、完全可定制。 - -* 提供快速自动补全菜单、强大的别名系统。 - +* 快速且可完全定制。 +* 提供自动补全菜单及快速、强大的别名系统。 * 此外,提供预测建议,并提供有用的搜索功能。 它是免费的,你可以从 Google Play 商店[下载并安装它][1],接着在 Android 设备中运行。 安装完成后,第一次启动时你会看到一个快速指南。阅读完成之后,你可以如下面那样使用简单的命令开始使用了。 - [![T-UI Commandline Help Guide](https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Help.jpg)][2] +[![T-UI Commandline Help Guide](https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Help.jpg)][2] -T-UI 命令行帮助指南 +*T-UI 命令行帮助指南* 要启动一个 app,只要输入几个字母,自动补全功能会在屏幕中展示可用的 app。接着点击你想打开的程序。 ``` -$ Telegram #launch telegram -$ WhatsApp #launch whatsapp -$ Chrome #launch chrome +$ Telegram ### 启动 telegram +$ WhatsApp ### 启动 whatsapp +$ Chrome ### 启动 chrome ``` - [![T-UI Commandline Usage](https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Usage.jpg)][3] -T-UI 命令行使用 +[![T-UI Commandline Usage](https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Usage.jpg)][3] + +*T-UI 命令行使用* 要浏览你的 Android 设备状态(电池电量、wifi、移动数据),输入: ``` $ status ``` - [![Android Phone Status](https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Status.jpg)][4] -Android 电话状态 +[![Android Phone Status](https://www.tecmint.com/wp-content/uploads/2017/05/T-UI-Commandline-Status.jpg)][4] -另外一个你可以使用的有用的命令。 +*Android 电话状态* + +其它的有用命令。 ``` -$ uninstall telegram #uninstall telegram -$ search [google, playstore, youtube, files] #search online apps or for a local file -$ wifi #trun wifi on or off -$ cp Downloads/* Music #copy all files from Download folder to Music -$ mv Downloads/* Music #move all files from Download folder to Music +$ uninstall telegram ### 卸载 telegram +$ search [google, playstore, youtube, files] ### 搜索在线应用或本地文件 +$ wifi ### 打开或关闭 WIFI +$ cp Downloads/* Music ### 从 Download 文件夹复制所有文件到 Music 文件夹 +$ mv Downloads/* Music ### 从 Download 文件夹移动所有文件到 Music 文件夹 ``` -就是这样了!在本篇中,我们展示了一个带有类似 Liux CLI(命令界面)的简单而有用的 Android 程序,它可以将你的常规 Android 设备变成一个完整的命令行界面。尝试一下并在下面的评论栏分享你的想法。 +就是这样了!在本篇中,我们展示了一个带有类似 Linux CLI(命令界面)的简单而有用的 Android 程序,它可以将你的常规 Android 设备变成一个完整的命令行界面。尝试一下并在下面的评论栏分享你的想法。 -------------------------------------------------------------------------------- @@ -67,9 +66,9 @@ Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux 系统管理员和 via: https://www.tecmint.com/t-ui-launcher-turns-android-device-into-linux-cli/ -作者:[Aaron Kili ][a] +作者:[Aaron Kili][a] 译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 05efa1f4682c2e43a87d9a8d8311b11e3f5c9d17 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 22 May 2017 23:03:14 +0800 Subject: [PATCH 0191/1407] PRF:20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md @ucasFL --- ... WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md | 110 ++++++++---------- 1 file changed, 48 insertions(+), 62 deletions(-) diff --git a/translated/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md b/translated/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md index 6e8569a236..a5285708b8 100644 --- a/translated/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md +++ b/translated/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md @@ -1,28 +1,27 @@ -8 个优秀的开源 MARKDOWN 编辑器 +8 个优秀的开源 Markdown 编辑器 ============================================================ ### Markdown -首先,对 Markdown 进行一个简单的介绍。Markdown 是由 John Gruber 和 Aaron Swartz 共同创建的一种轻量级纯文本格式语法。Markdown 给用户提供了“易读、易写的纯文本格式来进行写作,然后可以将其转换为有效格式的 XHTML(或 HTML)“。Markdown 语法只包含一些非常容易记住的符号。它具有一条平缓的学习曲线;你可以在炒蘑菇的同时学习 Markdown 语法(大约 10 分钟)。通过使用尽可能简单的语法,错误率达到了最小化。除了拥有友好的语法,它还具有直接输出干净、有效的 (X)HTML 文件的强大功能。如果你看过我的 HTML 文件,你就会知道这个功能是多么的重要。 +首先,对 Markdown 进行一个简单的介绍。Markdown 是由 John Gruber 和 Aaron Swartz 共同创建的一种轻量级纯文本格式语法。Markdown 可以让用户“以易读、易写的纯文本格式来进行写作,然后可以将其转换为有效格式的 XHTML(或 HTML)“。Markdown 语法只包含一些非常容易记住的符号。其学习曲线平缓;你可以在炒蘑菇的同时一点点学习 Markdown 语法(大约 10 分钟)。通过使用尽可能简单的语法,错误率达到了最小化。除了拥有友好的语法,它还具有直接输出干净、有效的(X)HTML 文件的强大功能。如果你看过我的 HTML 文件,你就会知道这个功能是多么的重要。 -Markdown 格式语法的主要目标是实现最大的可读性。用户能够以纯文本的形式发布一份 Markdown 格式的文件。用 Markdown 进行文本写作的一个优点是易于在计算机、智能手机和个人之间共享。几乎所有的内容管理系统都支持 Markdown 。它作为一种网络写作格式流行起来,产生的变种被许多服务采用,比如 GitHub 和 Stack Exchange 。 +Markdown 格式语法的主要目标是实现最大的可读性。用户能够以纯文本的形式发布一份 Markdown 格式的文件。用 Markdown 进行文本写作的一个优点是易于在计算机、智能手机和个人之间共享。几乎所有的内容管理系统都支持 Markdown 。它作为一种网络写作格式流行起来,其产生一些被许多服务采用的变种,比如 GitHub 和 Stack Exchange 。 你可以使用任何文本编辑器来写 Markdown 文件。但我建议使用一个专门为这种语法设计的编辑器。这篇文章中所讨论的软件允许你使用 Markdown 语法来写各种格式的专业文档,包括博客文章、演示文稿、报告、电子邮件以及幻灯片等。另外,所有的应用都是在开源许可证下发布的,在 Linux、OS X 和 Windows 操作系统下均可用。 -* * * ### Remarkable - ![Remarkable - cross-platform Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/Remarkable.png?resize=800%2C319&ssl=1) +![Remarkable - cross-platform Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/Remarkable.png?resize=800%2C319&ssl=1) -让我们从 Remarkable 开始。Remarkable 是一个包的名字,它是一个相当有特色的 Markdown 编辑器 — 它并不支持 Markdown 的全部功能特性,但该有的功能特性都有。它具有一个和 GitHub Markdown 类似的语法。 +让我们从 Remarkable 开始。Remarkable 是一个 apt 软件包的名字,它是一个相当有特色的 Markdown 编辑器 — 它并不支持 Markdown 的全部功能特性,但该有的功能特性都有。它使用和 GitHub Markdown 类似的语法。 你可以使用 Remarkable 来写 Markdown 文档,并在实时预览窗口查看更改。你可以把你的文件导出为 PDF 格式(带有目录)和 HTML 格式文件。它有强大的配置选项,从而具有许多样式,因此,你可以把它配置成你最满意的 Markdown 编辑器。 其他一些特性: * 语法高亮 -* 支持 GitHub 风味的 Markdown +* 支持 [GitHub 风味的 Markdown](https://linux.cn/article-8399-1.html) * 支持 MathJax - 通过高级格式呈现丰富文档 * 键盘快捷键 @@ -31,70 +30,66 @@ Markdown 格式语法的主要目标是实现最大的可读性。用户能够 主页: [https://remarkableapp.github.io/][4] 许可证: MIT 许可 -* * * - ### Atom - ![Atom - cross-platform Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/Atom-Markdown.png?resize=800%2C328&ssl=1) +![Atom - cross-platform Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/Atom-Markdown.png?resize=800%2C328&ssl=1) -毫无疑问, Atom 是一个神话般的文本编辑器。超过 50 个开源包集合成一个最小的核,从而构成 Atom 。伴有 Node.js 的支持,以及全套功能特性,Atom 是我最喜欢用来写代码的编辑器。Atom 的特性在[开源应用终结者][5]的文章中有更详细介绍,它是如此的强大。但是作为一个 Markdown 编辑器,Atom 还有许多不足之处,它的默认包不支持 Markdown 的特性。例如,正如上图所展示的,它不支持渲染方程。 +毫无疑问, Atom 是一个神话般的文本编辑器。超过 50 个开源包集合在一个微小的内核上,从而构成 Atom 。伴有 Node.js 的支持,以及全套功能特性,Atom 是我最喜欢用来写代码的编辑器。Atom 的特性在[杀手级开源应用][5]的文章中有更详细介绍,它是如此的强大。但是作为一个 Markdown 编辑器,Atom 还有许多不足之处,它的默认包不支持 Markdown 的特性。例如,正如上图所展示的,它不支持等价渲染。 -但是,开源拥有强大的力量,这是我强烈提倡开源的一个重要原因。Atom 上有许多包以及一些复刻,从而添加了缺失的功能特性。比如,Markdown Prview Plus 提供了 Markdown 文件的实时预览,并伴有数学公式渲染和实时重加载。另外,你也可以尝试一下 [Markdown Preview Enhanced][6]。如果你需要自动滚动特性,那么 [markdown-scroll-sync][7] 可以满足你的需求。我是 [Markdown-Writer][8]和 [Markdown-pdf][9]的一个狂热粉丝,后者支持将 Markdown 快速转换为 PDF、PNG 以及 JPEG 文件。 +但是,开源拥有强大的力量,这是我强烈提倡开源的一个重要原因。Atom 上有许多包以及一些复刻,从而添加了缺失的功能特性。比如,Markdown Preview Plus 提供了 Markdown 文件的实时预览,并伴有数学公式渲染和实时重加载。另外,你也可以尝试一下 [Markdown Preview Enhanced][6]。如果你需要自动滚动特性,那么 [markdown-scroll-sync][7] 可以满足你的需求。我是 [Markdown-Writer][8]和 [Markdown-pdf][9]的忠实拥趸,后者支持将 Markdown 快速转换为 PDF、PNG 以及 JPEG 文件。 -这个方式体现了开源的理念:允许用户通过添加扩展来提供所需的特性。这让我想起了 Woolworths 挑选 ‘n’ 混合糖果的故事。虽然需要多付出一些努力,但能收获最好的回报。 +这个方式体现了开源的理念:允许用户通过添加扩展来提供所需的特性。这让我想起了 Woolworths 的 n 种杂拌糖果的故事。虽然需要多付出一些努力,但能收获最好的回报。 主页: [https://atom.io/][10] 许可证: MIT 许可 -* * * - ### Haroopad - ![Haroopad - - cross-platform Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/Haroopad-1.png?resize=800%2C332&ssl=1) +![Haroopad - - cross-platform Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/Haroopad-1.png?resize=800%2C332&ssl=1) -Haroopad 是一个优秀的 Markdown 编辑器,是一个创建 web 友好文档的文档处理器。使用 Haroopad 可以创作各种格式的文档,比如博客文章、幻灯片、演示文稿、报告和电子邮件等。Haroopad 在 Windows、Mac OS X 和 Linux 上均可用。它有 Debian/Ubuntu 的软件包,有 Windows 和 Mac 的二进制文件。该应用程序使用 node-webkit、CodeMirror 标记,以及 Twitter 引导。 +Haroopad 是一个优秀的 Markdown 编辑器,是一个用于创建适宜 Web 的文档的处理器。使用 Haroopad 可以创作各种格式的文档,比如博客文章、幻灯片、演示文稿、报告和电子邮件等。Haroopad 在 Windows、Mac OS X 和 Linux 上均可用。它有 Debian/Ubuntu 的软件包,也有 Windows 和 Mac 的二进制文件。该应用程序使用 node-webkit、CodeMirror,marked,以及 Twitter 的 Bootstrap 。 Haroo 在韩语中的意思是“一天”。 它的功能列表非常可观。请看下面: * 主题、皮肤和 UI 组件 - * 超过 30 中不同的编辑主题 - tomorrow-night-bright 和 zenburn 是近期刚添加的 + * 超过 30 种不同的编辑主题 - tomorrow-night-bright 和 zenburn 是近期刚添加的 * 编辑器中的代码块的语法高亮 * Ruby、Python、PHP、Javascript、C、HTML 和 CSS 的语法高亮支持 - * 基于 CodeMirror:一个在浏览器中使用 JavaScript 实现的通用文本编辑器 + * 基于 CodeMirror,这是一个在浏览器中使用 JavaScript 实现的通用文本编辑器 * 实时预览主题 * 基于 markdown-css 的 7 个主题 * 语法高亮 * 基于 hightlight.js 的 112 种语言以及 49 种样式 * 定制主题 - * 基于 CSS 的样式(层叠样式表) + * 基于 CSS (层叠样式表)的样式 * 演示模式 - 对于现场演示非常有用 * 绘图 - 流程图和序列图 * 任务列表 -* 通过 TOC 扩展 Markdown 语法,GitHub 风味 Markdown 以及数学表达式、脚注和任务列表等更多的扩展。 +* 扩展 Markdown 语法,支持 TOC(目录)、 GitHub 风味 Markdown 以及数学表达式、脚注和任务列表等 * 字体大小 - * 使用首选窗口和快件键来设置编辑器和预览字体大小 -* 嵌入丰富媒体内容 - * 视频、音频、3D、文本、公开图以及 oEmbed + * 使用首选窗口和快捷键来设置编辑器和预览字体大小 +* 嵌入富媒体内容 + * 视频、音频、3D、文本、开放图形以及 oEmbed * 支持大约 100 种主要的网络服务(YouTude、SoundCloud、Flickr 等) * 支持拖放 * 显示模式 - * 默认:编辑器|预览器,倒置:预览器|编辑器,仅编辑器,仅预览器(View > Mode) + * 默认:编辑器|预览器,倒置:预览器|编辑器,仅编辑器,仅预览器(View -> Mode) * 插入当前日期和时间 - * 多种格式支持(Insert > Data & Time) + * 多种格式支持(Insert -> Data & Time) * HtML 到 Markdown - * 拖放在 Web 浏览器中选择好的文本 + * 拖放你在 Web 浏览器中选择好的文本 * Markdown 解析选项 -* 离线预览 +* 大纲预览 * 纯粹主义者的 Vim 键位绑定 * Markdown 自动补全 * 导出为 PDF 和 HTML -* HTML 通过 WYSIWYG 编辑器复制到剪切板 -* 自动保存和重新存储 +* 带有样式的 HTML 复制到剪切板可用于所见即所得编辑器 +* 自动保存和恢复 * 文件状态信息 -* 换行符和空格缩进 -* 列(一、二、三)布局视图 +* 换行符或空格缩进 +* (一、二、三)列布局视图 * Markdown 语法帮助对话框 * 导入和导出设置 * 通过 MathJax 支持 LaTex 数学表达式 @@ -107,54 +102,49 @@ Haroo 在韩语中的意思是“一天”。 主页 [http://pad.haroopress.com/][11] 许可证: GNU GPL v3 许可 -* * * - ### StackEdit - ![StackEdit - a web based Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/StackEdit.png?resize=800%2C311&ssl=1) +![StackEdit - a web based Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/StackEdit.png?resize=800%2C311&ssl=1) -StackEdit 基于 PageDown,是一个功能齐全的 Markdown 编辑器, Mwrkdown 库被 Stack Overflow 和其他一些 Stack 交流网站使用。不同于在这个列表中的其他编辑器,StackEdit 是一个基于 Web 的编辑器。在 Chrome 浏览器上即可使用 StackEdit 。 +StackEdit 是一个功能齐全的 Markdown 编辑器,基于 PageDown(该 Markdown 库被 Stack Overflow 和其他一些 Stack 交流网站使用)。不同于在这个列表中的其他编辑器,StackEdit 是一个基于 Web 的编辑器。在 Chrome 浏览器上即可使用 StackEdit 。 特性包括: -* 通过绑定滚动连接特性到编辑器和预览滚动条,实现实时预览 HTML -* 支持 Markdown 外加 GitHub 风味 Markdown,Prettify/Highlight.js 语法高亮 +* 实时预览 HTML,并通过绑定滚动连接特性来将编辑器和预览的滚动条相绑定 +* 支持 Markdown Extra 和 GitHub 风味 Markdown,Prettify/Highlight.js 语法高亮 * 通过 MathJax 支持 LaTex 数学表达式 -* WYSIWYG 控制按键 +* 所见即所得的控制按键 * 布局配置 * 不同风格的主题支持 * la carte 扩展 * 离线编辑 -* 与 Google 云端硬盘(多帐户)和 Dropbox 在线同步 -* 在 Blogger、Dropbox、Gist、GitHub、Google Drive、SSH服务器、Tumblr 和 WordPress 上一键点击发布 +* 可以与 Google 云端硬盘(多帐户)和 Dropbox 在线同步 +* 一键发布到 Blogger、Dropbox、Gist、GitHub、Google Drive、SSH 服务器、Tumblr 和 WordPress 主页: [https://stackedit.io/][12] 许可证: Apache 许可 -* * * - ### MacDown - ![MacDown - OS X Markdown editor](https://i0.wp.com/www.ossblog.org/wp-content/uploads/2017/02/MacDown.png?resize=800%2C422&ssl=1) +![MacDown - OS X Markdown editor](https://i0.wp.com/www.ossblog.org/wp-content/uploads/2017/02/MacDown.png?resize=800%2C422&ssl=1) -MacDown 是在这个列表中唯一运行在 macOS 上的全特性编辑器。具体来说,它需要在 OX S 10.8 或更高的版本上才能使用。它在内部使用 Hoedown 将 Markdown 渲染成 HTML,这使得它的特性更加强大。Heodown 是 Sundown 的一个复刻。它完全符合标准,无依赖,具有良好的扩展和 UTF-8 感知 +MacDown 是在这个列表中唯一一个只运行在 macOS 上的全特性编辑器。具体来说,它需要在 OX S 10.8 或更高的版本上才能使用。它在内部使用 Hoedown 将 Markdown 渲染成 HTML,这使得它的特性更加强大。Heodown 是 Sundown 的一个复活复刻。它完全符合标准,无依赖,具有良好的扩展支持和 UTF-8 感知。 -MacDown 基于 Mou:专为 Web 开发人员设计的专用解决方案。 +MacDown 基于 Mou,这是专为 Web 开发人员设计的专用解决方案。 -它提供了良好的 Markdown 渲染,通过 Prism 提供的语言识别渲染实现代码块的语法高亮,MathML 和 LaTex 渲染,GTM 任务列表,Jekyll 前端以及可选的高级自动补全。更重要的是,它占用资源很少。想在 OS X 上写 Markdown?MacDown 是我针对 Web 开发者的开源推荐。 +它提供了良好的 Markdown 渲染,通过 Prism 提供的语言识别渲染实现代码块级的语法高亮,MathML 和 LaTex 渲染,GTM 任务列表,Jekyll 前端以及可选的高级自动补全。更重要的是,它占用资源很少。想在 OS X 上写 Markdown?MacDown 是我针对 Web 开发者的开源推荐。 主页: [https://macdown.uranusjr.com/][13] 许可证: MIT 许可 -* * * ### ghostwriter - ![ghostwriter - cross-platform Markdown editor](https://i0.wp.com/www.ossblog.org/wp-content/uploads/2017/02/ghostwriter.png?resize=800%2C310&ssl=1) +![ghostwriter - cross-platform Markdown editor](https://i0.wp.com/www.ossblog.org/wp-content/uploads/2017/02/ghostwriter.png?resize=800%2C310&ssl=1) -ghostwriter 是一个跨平台的、具有美感的、无干扰的 Markdown 编辑器。它有 Sundown 处理器的内建支持,还可以自动检测 pandoc、MultiMarkdown、Discount 和 cmark 处理器。它试图成为一个不显眼的编辑器。 +ghostwriter 是一个跨平台的、具有美感的、无干扰的 Markdown 编辑器。它内建了 Sundown 处理器支持,还可以自动检测 pandoc、MultiMarkdown、Discount 和 cmark 处理器。它试图成为一个朴实的编辑器。 -ghostwriter 有许多很好的功能设置,包括语法高亮、全屏模式、聚焦模式、主题、通过 Hunspell 进行拼写检查、实时字数统计、实时 HTML 预览、HTML 预览自定义 CSS 样式表、图片拖放支持以及国际化支持。Hemingway 模式按钮可以禁用 `backspace` 键和 `delete` 键。一个新的 `Markdown cheat sheet HUD` 窗口是一个有用的新增功能。主题支持很基本,但在 [GitHub 仓库上][14]也有一些可用的试验性主题。 +ghostwriter 有许多很好的功能设置,包括语法高亮、全屏模式、聚焦模式、主题、通过 Hunspell 进行拼写检查、实时字数统计、实时 HTML 预览、HTML 预览自定义 CSS 样式表、图片拖放支持以及国际化支持。Hemingway 模式按钮可以禁用退格键和删除键。一个新的 “Markdown cheat sheet” HUD 窗口是一个有用的新增功能。主题支持很基本,但在 [GitHub 仓库上][14]也有一些可用的试验性主题。 ghostwriter 的功能有限。我越来越欣赏这个应用的通用性,部分原因是其简洁的界面能够让写作者完全集中在策划内容上。这一应用非常值得推荐。 @@ -163,28 +153,24 @@ ghostwirter 在 Linux 和 Windows 系统上均可用。在 Windows 系统上还 主页: [https://github.com/wereturtle/ghostwriter][15] 许可证: GNU GPL v3 许可 -* * * - ### Abricotine - ![Abricotine - cross-platform Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/Abricotine.png?resize=800%2C316&ssl=1) +![Abricotine - cross-platform Markdown editor](https://i2.wp.com/www.ossblog.org/wp-content/uploads/2017/02/Abricotine.png?resize=800%2C316&ssl=1) -Abricotine 是一个内置桌面、有前途的跨平台且开源的 Markdown 编辑器。它在 Linux、OS X 和 Windows 上均可用。 +Abricotine 是一个为桌面构建的、旨在跨平台且开源的 Markdown 编辑器。它在 Linux、OS X 和 Windows 上均可用。 -该应用支持 Markdown 语法以及一些 GitHub 风味的 Markdown 加强(如上表所示)。它允许用户直接在文本编辑器中预览文档,而不是在侧窗栏。 +该应用支持 Markdown 语法以及一些 GitHub 风味的 Markdown 增强(比如表格)。它允许用户直接在文本编辑器中预览文档,而不是在侧窗栏。 -该应用有一系列有用的特性,包括拼写检查、以 HTML 格式保存文件或把富文本复制粘贴到邮件客户端。你也可以在侧窗中显示文档表,展示语法高亮代码、以及助手、锚点和隐藏字符等。它目前正处于早期的开发阶段,因此还有一些很基本的 bug 需要修复,但它值得关注。它有两个主题可用,如果有能力,你也可以添加你自己的主题。 +该应用有一系列有用的特性,包括拼写检查、以 HTML 格式保存文件或把富文本复制粘贴到邮件客户端。你也可以在侧窗中显示文档目录,展示语法高亮代码、以及助手、锚点和隐藏字符等。它目前正处于早期的开发阶段,因此还有一些很基本的 bug 需要修复,但它值得关注。它有两个主题可用,如果有能力,你也可以添加你自己的主题。 主页: [http://abricotine.brrd.fr/][16] 许可证: GNU 通用公共许可证 v3 或更高许可 -* * * - ### ReText - ![ReText - Linux Markdown editor](https://i1.wp.com/www.ossblog.org/wp-content/uploads/2017/02/ReText.png?resize=800%2C270&ssl=1) +![ReText - Linux Markdown editor](https://i1.wp.com/www.ossblog.org/wp-content/uploads/2017/02/ReText.png?resize=800%2C270&ssl=1) -ReText 是一个简单但强大的 Markdown 和 reStructureText 文本编辑器。用户可以控制输入所有格式。它编辑的文件是纯文本文件,但可以导出为 PDF、HTML 和其他格式的文件。ReText 官方仅支持 Linux 系统。 +ReText 是一个简单而强大的 Markdown 和 reStructureText 文本编辑器。用户可以控制所有输出的格式。它编辑的文件是纯文本文件,但可以导出为 PDF、HTML 和其他格式的文件。ReText 官方仅支持 Linux 系统。 特性包括: @@ -206,7 +192,7 @@ via: https://www.ossblog.org/markdown-editors/ 作者:[Steve Emms][a] 译者:[ucasFL](https://github.com/ucasFL) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From a8b1ac130f02c1483d8ce561e1550b3409319193 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 22 May 2017 23:03:43 +0800 Subject: [PATCH 0192/1407] PUB:20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md @ucasFL https://linux.cn/article-8531-1.html --- ...70212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md (100%) diff --git a/translated/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md b/published/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md similarity index 100% rename from translated/tech/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md rename to published/20170212 WRITE MARKDOWN WITH 8 EXCEPTIONAL OPEN SOURCE EDITORS.md From a4d6737223b9083e41bae9f7d36316b64f31766e Mon Sep 17 00:00:00 2001 From: hwlog Date: Tue, 23 May 2017 00:47:44 +0800 Subject: [PATCH 0193/1407] Update 20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md --- ...yber warfare cell that worries the West.md | 94 +++++++------------ 1 file changed, 32 insertions(+), 62 deletions(-) diff --git a/sources/talk/20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md b/sources/talk/20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md index e6833eeba0..c0ae39228f 100644 --- a/sources/talk/20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md +++ b/sources/talk/20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md @@ -1,72 +1,42 @@ -North Korea's Unit 180, the cyber warfare cell that worries the West +朝鲜180局的网络战部门让西方国家忧虑。 ============================================================ + [![在夜色的映衬下,部队的军车通过平壤市区,](http://www.abc.net.au/news/image/8545124-3x2-700x467.jpg "Military trucks through Pyongyang")][13] [**PHOTO:** 脱北者说, 平壤的网络战攻击目的在于一个叫做“180局”的部门来筹集资金。(Reuters: Damir Sagolj, file)][14] + 据叛逃者,官方和网络安全专家称,朝鲜的情报机关有一个叫做180局的特殊部门, 这个部门已经发起过多起勇敢且成功的网络战。 +近几年朝鲜被美国,韩国,和周边几个国家指责对多数的金融网络发起过一系列在线袭击。 +网络安全技术人员称他们找到了这个月感染了150多个国家30多万台计算机的全球想哭勒索病毒"ransomware"和朝鲜网络战有关联的技术证据。 +平壤称该指控是“荒谬的”。 +对朝鲜的关键指控是指朝鲜与一个叫做拉撒路的黑客组织有联系,这个组织是在去年在孟加拉国中央银行网络抢劫8000万美元并在2014年攻击了索尼的好莱坞工作室的网路。 +美国政府指责朝鲜对索尼公司的黑客袭击,同时美国政府对平壤在孟加拉国银行的盗窃行为提起公诉并要求立案。 +由于没有确凿的证据,没有犯罪指控并不能够立案。朝鲜之后也否认了Sony公司和银行的袭击与其有关。 +朝鲜是世界上最封闭的国家之一,它秘密行动的一些细节很难获得。 +但研究这个封闭的国家和流落到韩国和一些西方国家的的叛逃者已经给出了或多或少的提示。 +### 黑客们喜欢用雇员来作为掩护 +金恒光,朝鲜前计算机教授,2004叛逃到韩国,他仍然有着韩国内部的消息,他说平壤的网络战目的在于通过侦察总局下属的一个叫做180局来筹集资金,这个局主要是负责海外的情报机构。 +金教授称,“180局负责入侵金融机构通过漏洞从银行账户提取资金”。 +他之前也说过,他以前的一些学生已经加入了朝鲜的网络战略司令部-朝鲜的网络部队。 - [![Military drive trucks through Pyongyang at night, set against the city skyline](http://www.abc.net.au/news/image/8545124-3x2-700x467.jpg "Military trucks through Pyongyang")][13] [**PHOTO:** Defectors say Pyongyang's cyberattacks aimed at raising cash are likely organised by the special cell — Unit 180. (Reuters: Damir Sagolj, file)][14] +>"黑客们到海外寻找比朝鲜更好的互联网服务的地方,以免留下痕迹," 金教授补充说。 +他说他们经常用贸易公司,朝鲜的海外分公司和在中国和东南亚合资企业的雇员来作为掩护 +位于华盛顿的战略与国际研究中心的叫做James Lewis的朝鲜专家称,平壤首先用黑客作为间谍活动的工具然后对韩国和美国的目的进行政治干扰。 +索尼公司事件之后,他们改变方法,通过用黑客来支持犯罪活动来形成国内坚挺的货币经济政策。 +“目前为止,网上毒品,假冒伪劣,走私,都是他们惯用的伎俩”。 +Media player: 空格键播放,“M”键静音,“左击”和“右击”查看。 -North Korea's main spy agency has a special cell called Unit 180 that is likely to have launched some of its most daring and successful cyberattacks, according to defectors, officials and internet security experts. +[**VIDEO:** 你遇到过勒索病毒吗? (ABC News)][16] +### 韩国声称拥有大量的“证据” +美国国防部称在去年提交给国会的一个报告中显示,朝鲜可能有作为有效成本的,不对称的,可拒绝的工具,它能够应付来自报复性袭击很小的风险,因为它的“网络”大部分是和因特网分离的。 +> 报告中说," 它可能从第三方国家使用互联网基础设施"。 +韩国政府称,他们拥有朝鲜网络战行动的大量证据。 +“朝鲜进行网络战通过第三方国家来掩护网络袭击的来源,并且使用他们的信息和通讯技术设施”,Ahn Chong-ghee,韩国外交部副部长,在书面评论中告诉路透社。 +除了孟加拉银行抢劫案,他说平壤也被怀疑与菲律宾,越南和波兰的银行袭击有关。 +去年六月,警察称朝鲜袭击了160个韩国公司和政府机构,入侵了大约14万台计算机,暗中在他的对手的计算机中植入恶意代码作为长期计划的一部分来进行大规模网络攻击。 +朝鲜也被怀疑在2014年对韩国核反应堆操作系统进行阶段性网络攻击,尽管朝鲜否认与其无关。 +根据在一个韩国首尔的杀毒软件厂商“hauri”的高级安全研究员Simon Choi的说法,网络袭击是来自于他在中国的一个基地。 +Choi先生,一个有着对朝鲜的黑客能力进行了广泛的研究的人称,“他们在那里行动以至于不论他们做什么样的计划,他们拥有中国的ip地址”。 -North Korea has been blamed in recent years for a series of online attacks, mostly on financial networks, in the United States, South Korea and over a dozen other countries. - -Cyber security researchers have also said they found technical evidence that could l[ink North Korea with the global WannaCry "ransomware" cyberattack][15] that infected more than 300,000 computers in 150 countries this month. - -Pyongyang has called the allegation "ridiculous". - -The crux of the allegations against North Korea is its connection to a hacking group called Lazarus that is linked to last year's $US81 million cyber heist at the Bangladesh central bank and the 2014 attack on Sony's Hollywood studio. - -The US Government has blamed North Korea for the Sony hack and some US officials have said prosecutors are building a case against Pyongyang in the Bangladesh Bank theft. - -No conclusive proof has been provided and no criminal charges have yet been filed. North Korea has also denied being behind the Sony and banking attacks. - -North Korea is one of the most closed countries in the world and any details of its clandestine operations are difficult to obtain. - -But experts who study the reclusive country and defectors who have ended up in South Korea or the West have provided some clues. - -### Hackers likely under cover as employees - -Kim Heung-kwang, a former computer science professor in North Korea who defected to the South in 2004 and still has sources inside North Korea, said Pyongyang's cyberattacks aimed at raising cash are likely organised by Unit 180, a part of the Reconnaissance General Bureau (RGB), its main overseas intelligence agency. - -"Unit 180 is engaged in hacking financial institutions (by) breaching and withdrawing money out of bank accounts," Mr Kim said. - - -He has previously said that some of his former students have joined join North Korea's Strategic Cyber Command, its cyber-army. - -> "The hackers go overseas to find somewhere with better internet services than North Korea so as not to leave a trace," Mr Kim added. - -He said it was likely they went under the cover of being employees of trading firms, overseas branches of North Korean companies, or joint ventures in China or South-East Asia. - -James Lewis, a North Korea expert at the Washington-based Centre for Strategic and International Studies, said Pyongyang first used hacking as a tool for espionage and then political harassment against South Korean and US targets. - -"They changed after Sony by using hacking to support criminal activities to generate hard currency for the regime," he said. - -"So far, it's worked as well or better as drugs, counterfeiting, smuggling — all their usual tricks." - -Media player: "Space" to play, "M" to mute, "left" and "right" to seek. - -[**VIDEO:** Have you been hit by ransomware? (ABC News)][16] - -### South Korea purports to have 'considerable evidence' - -The US Department of Defence said in a report submitted to Congress last year that North Korea likely "views cyber as a cost-effective, asymmetric, deniable tool that it can employ with little risk from reprisal attacks, in part because its networks are largely separated from the internet". - -> "It is likely to use internet infrastructure from third-party nations," the report said. - -South Korean officials said they had considerable evidence of North Korea's cyber warfare operations. - - -"North Korea is carrying out cyberattacks through third countries to cover up the origin of the attacks and using their information and communication technology infrastructure," Ahn Chong-ghee, South Korea's Vice-Foreign Minister, told Reuters in written comments. - -Besides the Bangladesh Bank heist, he said Pyongyang was also suspected in attacks on banks in the Philippines, Vietnam and Poland. - -In June last year, police said the North hacked into more than 140,000 computers at 160 South Korean companies and government agencies, planting malicious code as part of a long-term plan to lay the groundwork for a massive cyberattack on its rival. - -North Korea was also suspected of staging cyberattacks against the South Korean nuclear reactor operator in 2014, although it denied any involvement. - -That attack was conducted from a base in China, according to Simon Choi, a senior security researcher at Seoul-based anti-virus company Hauri Inc. - -"They operate there so that regardless of what kind of project they do, they have Chinese IP addresses," said Mr Choi, who has conducted extensive research into North Korea's hacking capabilities. -------------------------------------------------------------------------------- From 5c11f0550fa9906b6f133056bb45be83ce315d64 Mon Sep 17 00:00:00 2001 From: hwlog Date: Tue, 23 May 2017 00:57:25 +0800 Subject: [PATCH 0194/1407] Update 20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md --- ...'s Unit 180, the cyber warfare cell that worries the West.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/talk/20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md b/sources/talk/20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md index c0ae39228f..5cc3a5357f 100644 --- a/sources/talk/20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md +++ b/sources/talk/20170521 North Korea's Unit 180, the cyber warfare cell that worries the West.md @@ -43,7 +43,7 @@ Choi先生,一个有着对朝鲜的黑客能力进行了广泛的研究的人 via: http://www.abc.net.au/news/2017-05-21/north-koreas-unit-180-cyber-warfare-cell-hacking/8545106 作者:[www.abc.net.au ][a] -译者:[译者ID](https://github.com/译者ID) +译者:[译者ID](https://github.com/hwlog) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From ec7a5a7aa68cf63ec2aa0319d0d05eabb8be013d Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 23 May 2017 03:37:55 +0800 Subject: [PATCH 0195/1407] PUB:20170322 5 big ways AI is rapidly invading our lives.md @zhousiyu325 @jasminepeng --- ...g ways AI is rapidly invading our lives.md | 36 +++++++++---------- 1 file changed, 18 insertions(+), 18 deletions(-) rename {translated/tech => published}/20170322 5 big ways AI is rapidly invading our lives.md (56%) diff --git a/translated/tech/20170322 5 big ways AI is rapidly invading our lives.md b/published/20170322 5 big ways AI is rapidly invading our lives.md similarity index 56% rename from translated/tech/20170322 5 big ways AI is rapidly invading our lives.md rename to published/20170322 5 big ways AI is rapidly invading our lives.md index d4a15c8cdc..682c85c494 100644 --- a/translated/tech/20170322 5 big ways AI is rapidly invading our lives.md +++ b/published/20170322 5 big ways AI is rapidly invading our lives.md @@ -1,31 +1,31 @@ - AI 正快速入侵我们生活的五个方面 ============================================================ > 让我们来看看我们已经被人工智能包围的五个真实存在的方面。 - ![5 big ways AI is rapidly invading our lives](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/brain-think-ai-intelligence-ccby.png?itok=-EK6Vpz1 "5 big ways AI is rapidly invading our lives") +![5 big ways AI is rapidly invading our lives](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/brain-think-ai-intelligence-ccby.png?itok=-EK6Vpz1 "5 big ways AI is rapidly invading our lives") + > 图片来源: opensource.com -开源项目[正在帮助推动][2]人工智能进步,而且随着技术的成熟,我们将听到更多关于 AI 如何影响我们生活的消息。你有没有考虑过 AI 是如何改变你周围的世界的?让我们来看看我们日益人为增强的世界,以及 AI 对未来影响的大胆预测。 +开源项目[正在助推][2]人工智能(AI)进步,而且随着技术的成熟,我们将听到更多关于 AI 如何影响我们生活的消息。你有没有考虑过 AI 是如何改变你周围的世界的?让我们来看看我们日益被我们所改变的世界,以及大胆预测一下 AI 对未来影响。 ### 1. AI 影响你的购买决定 -最近 [VentureBeat][3] 上的一篇文章,[“AI 将如何帮助我们解读千禧一代”][4]吸引了我的注意。我承认我对人工智能没有思考太多,也没有费力尝试解读千禧一代,所以我很好奇,渴望了解更多。事实证明,文章标题有点误导;“如何卖东西给千禧一代”会是一个更准确的标题。 +最近 [VentureBeat][3] 上的一篇文章,[“AI 将如何帮助我们解读千禧一代”][4]吸引了我的注意。我承认我对人工智能没有思考太多,也没有费力尝试解读千禧一代,所以我很好奇,希望了解更多。事实证明,文章标题有点误导人,“如何卖东西给千禧一代”或许会是一个更准确的标题。 -根据这篇文章,千禧一代是“一个年龄阶段的人群,被人觊觎,以至于来自全世界的市场经理都在争抢他们”。通过分析网络行为 —— 无论是购物、社交媒体或其他活动 - 机器学习可以帮助预测行为模式,这将可以变成有针对性的广告。文章接着解释如何对物联网和社交媒体平台进行挖掘形成数据点。“使用机器学习挖掘社交媒体数据,可以让公司了解千禧一代如何谈论其产品,他们对一个产品类别的看法,他们对竞争对手的广告活动如何响应,还可获得很多数据,用于设计有针对性的广告,"这篇文章解释说。AI 和千禧一代成为营销的未来并不是什么很令人吃惊的事,但是 X 一代和婴儿潮一代,你们也逃不掉呢!(LCTT 译注:X 一代指出生于20世纪60年代中期至70年代末的美国人,婴儿潮是指二战结束后,1946年初至1964年底出生的人) +根据这篇文章,千禧一代是“一个令人垂涎的年龄阶段的人群,全世界的市场经理都在争抢他们”。通过分析网络行为 —— 无论是购物、社交媒体或其他活动 - 机器学习可以帮助预测行为模式,这将可以变成有针对性的广告。文章接着解释如何对物联网和社交媒体平台进行挖掘形成数据点。“使用机器学习挖掘社交媒体数据,可以让公司了解千禧一代如何谈论其产品,他们对一个产品类别的看法,他们对竞争对手的广告活动如何响应,还可获得很多数据,用于设计有针对性的广告,"这篇文章解释说。AI 和千禧一代成为营销的未来并不是什么很令人吃惊的事,但是 X 一代和婴儿潮一代,你们也逃不掉呢!(LCTT 译注:X 一代指出生于 20 世纪 60 年代中期至 70 年代末的美国人,婴儿潮是指二战结束后,1946 年初至 1964 年底出生的人) > 人工智能根据行为变化,将包括城市人在内的整个人群设为目标群体。 -例如, [Raconteur 上][23]的一篇文章 —— “AI 将怎样改变购买者的行为”解释说,AI 在网上零售行业最大的力量是它能够迅速适应改变客户行为的不断变化的形势。人工智能创业公司 [Fluid AI][25]首席执行官 Abhinav Aggarwal 表示,他公司的软件被一个客户用来预测顾客行为,有一次系统注意到在暴风雪期间发生了一个变化。“那些通常会忽略在一天中发送的电子邮件或应用内通知的用户现在正在打开它们,因为他们在家里没有太多的事情可做。一个小时之内,AI 系统就适应了新的情况,并在工作时间开始发送更多的促销材料。”他解释说。 +例如, [Raconteur 上][23]的一篇文章 —— “AI 将怎样改变购买者的行为”中解释说,AI 在网上零售行业最大的力量是它能够迅速适应客户行为不断变化的形势。人工智能创业公司 [Fluid AI][25] 首席执行官 Abhinav Aggarwal 表示,他公司的软件被一个客户用来预测顾客行为,有一次系统注意到在暴风雪期间发生了一个变化。“那些通常会忽略在一天中发送的电子邮件或应用内通知的用户现在正在打开它们,因为他们在家里没有太多的事情可做。一个小时之内,AI 系统就适应了新的情况,并在工作时间开始发送更多的促销材料。”他解释说。 -AI 正在改变们怎样花钱和为什么花钱,但是 AI 是怎样改变我们挣钱的方式的呢? +AI 正在改变我们怎样花钱和为什么花钱,但是 AI 是怎样改变我们挣钱的方式的呢? ### 2. 人工智能正在改变我们如何工作 [Fast 公司][5]最近的一篇文章“2017 年人工智能将如何改变我们的生活”中说道,求职者将会从人工智能中受益。作者解释说,除更新薪酬趋势之外,人工智能将被用来给求职者发送相关职位空缺信息。当你应该升职的时候,你很可能会得到一个升职的机会。 -人工智能也可以被公司用来帮助新入职的员工。文章解释说:“许多新员工在刚入职的几天内会获得大量信息,其中大部分不会被保留。” 相反,机器人可能会随着时间的推移,当新员工需要相关信息时,再向他一点点“告知信息”。 +人工智能也可以被公司用来帮助新入职的员工。文章解释说:“许多新员工在刚入职的几天内会获得大量信息,其中大部分都留不下来。” 相反,机器人可能会随着时间的推移,当新员工需要相关信息时,再向他一点点“告知信息”。 [Inc.][7] 有一篇文章[“没有偏见的企业:人工智能将如何重塑招聘机制”][8],观察了人才管理解决方案提供商 [SAP SuccessFactors][9] 是怎样利用人工智能作为一个工作描述“偏见检查器”,以及检查员工赔偿金的偏见。 @@ -35,33 +35,33 @@ AI 正在改变们怎样花钱和为什么花钱,但是 AI 是怎样改变我 > AI 将使所有教育生态系统的利益相关者受益。 -尽管教育的预算正在缩减,但是教室的规模却正在增长。因此利用技术的进步有助于提高教育体系的生产率和效率,并在提高教育质量和负担能力方面发挥作用。根据VentureBeat 上的一篇文章[“2017 年人工智能将怎样改变教育”][26],今年我们将看到 AI 对学生们的书面答案进行评分,机器人回答学生的问题,虚拟个人助理辅导学生等等。文章解释说:“AI 将惠及教育生态系统的所有利益相关者。学生将能够通过即时的反馈和指导学习地更好,教师将获得丰富的学习分析和对个性化教学的见解,父母将以更低的成本看到他们的孩子的更好的职业前景,学校能够规模化优质的教育,政府能够向所有人提供可负担得起的教育。" +尽管教育预算正在缩减,但是教室的规模却正在增长。因此利用技术的进步有助于提高教育体系的生产率和效率,并在提高教育质量和负担能力方面发挥作用。根据 VentureBeat 上的一篇文章[“2017 年人工智能将怎样改变教育”][26],今年我们将看到 AI 对学生们的书面答案进行评分,机器人回答学生的问题,虚拟个人助理辅导学生等等。文章解释说:“AI 将惠及教育生态系统的所有利益相关者。学生将能够通过即时的反馈和指导学习地更好,教师将获得丰富的学习分析和对个性化教学的见解,父母将以更低的成本看到他们的孩子的更好的职业前景,学校能够规模化优质的教育,政府能够向所有人提供可负担得起的教育。" ### 4. 人工智能正在重塑医疗保健 -2017 年 2 月 [CB Insights][12] 的一篇文章挑选了 106 个医疗保健领域的人工智能初创公司,它们中的很多在过去几年中提高了第一次股权融资。这篇文章说:“在 24 家成像和诊断公司中,19 家公司自 2015 年 1 月起就首次公开募股。”这份名单上了有那些从事于远程病人监测,药物发现和肿瘤学方面人工智能的公司。 +2017 年 2 月 [CB Insights][12] 的一篇文章挑选了 106 个医疗保健领域的人工智能初创公司,它们中的很多在过去几年中提高了第一次股权融资。这篇文章说:“在 24 家成像和诊断公司中,19 家公司自 2015 年 1 月起就首次公开募股。”这份名单上有那些从事于远程病人监测,药物发现和肿瘤学方面人工智能的公司。” -3 月 16 日发表在 TechCrunch 上的一篇关于 AI 进步如何重塑医疗保健的文章解释说:“一旦对人类的 DNA 有了更好的理解,就有机会更进一步,并能根据他们特殊的生活习性为他们提供个性化的见解。这种趋势预示着‘个性化遗传学’的新纪元,人们能够通过获得关于自己身体的前所未有的信息来充分控制自己的健康。” +3 月 16 日发表在 TechCrunch 上的一篇关于 AI 进步如何重塑医疗保健的文章解释说:“一旦对人类的 DNA 有了更好的理解,就有机会更进一步,并能根据他们特殊的生活习性为他们提供个性化的见解。这种趋势预示着‘个性化遗传学’的新纪元,人们能够通过获得关于自己身体的前所未有的信息来充分控制自己的健康。” -本文接着解释说,AI 和机器学习降低了研发新药的成本和时间。部分得益于广泛的测试,新药进入市场需要 12 年以上的时间。这篇文章说:“机器学习算法可以让计算机根据先前处理的数据来‘学习’如何做出预测,或者选择(在某些情况下,甚至是产品)需要做什么实验。类似的算法还可用于预测特定化合物对人体的副作用,这样可以加快审批速度。”这篇文章指出,2015 年旧金山的一个创业公司 [Atomwise][15] 一天内完成了可以减少 Ebola 感染的两种新药物的分析,而不是花费数年时间。 +本文接着解释说,AI 和机器学习降低了研发新药的成本和时间。部分得益于广泛的测试,新药进入市场需要 12 年以上的时间。这篇文章说:“机器学习算法可以让计算机根据先前处理的数据来‘学习’如何做出预测,或者选择(在某些情况下,甚至是产品)需要做什么实验。类似的算法还可用于预测特定化合物对人体的副作用,这样可以加快审批速度。”这篇文章指出,2015 年旧金山的一个创业公司 [Atomwise][15] 一天内完成了可以减少埃博拉感染的两种新药物的分析,而不是花费数年时间。 > AI 正在帮助发现、诊断和治疗新疾病。 另外一个位于伦敦的初创公司 [BenevolentAI][27] 正在利用人工智能寻找科学文献中的模式。这篇文章说:“最近,这家公司找到了两种可能对 Alzheimer 起作用的化合物,引起了很多制药公司的关注。" -除了有助于研发新药,AI 正在帮助发现、诊断和治疗新疾病。TechCrunch 上文章解释说,过去是根据显示的症状诊断疾病,但是现在 AI 正在被用于检测血液中的疾病特征,并利用对数十亿例临床病例分析进行深度学习获得经验来制定治疗计划。这篇文章说:“IBM 的 Watson 正在与纽约的 Memorial Sloan Kettering 合作,消化理解数十年来关于癌症患者和治疗方面的数据,为了向治疗疑难的癌症病例的医生提供和建议治疗方案。” +除了有助于研发新药,AI 正在帮助发现、诊断和治疗新疾病。TechCrunch 上的文章解释说,过去是根据显示的症状诊断疾病,但是现在 AI 正在被用于检测血液中的疾病特征,并利用对数十亿例临床病例分析进行深度学习获得经验来制定治疗计划。这篇文章说:“IBM 的 Watson 正在与纽约的 Memorial Sloan Kettering 合作,消化理解数十年来关于癌症患者和治疗方面的数据,为了向治疗疑难的癌症病例的医生提供和建议治疗方案。” ### 5. AI 正在改变我们的爱情生活 -有 195 个国家的超过 5000 万活跃用户通过一个在 2012 年推出的约会应用程序 [Tinder][16] 找到潜在的伴侣。在一个 [Forbes 采访播客][17]中,Tinder 的创始人兼董事长 Sean Rad spoke 与 Steven Bertoni 对人工智能是如何正在改变人们约会进行过讨论。在[关于此次采访的文章][18]中,Bertoni 引用了 Rad 说的话,他说:“可能有这样一个时刻,Tinder 很好的推测你会感兴趣的人,在组织约会中还可能会做很多跑腿的工作,对吧?”所以,这个 app 会向用户推荐一些附近的同伴,并更进一步,协调彼此的时间安排一次约会,而不只是向用户显示一些有可能的同伴。 +有 195 个国家的超过 5000 万活跃用户通过一个在 2012 年推出的约会应用程序 [Tinder][16] 找到潜在的伴侣。在一个 [Forbes 采访播客][17]中,Tinder 的创始人兼董事长 Sean Rad spoke 与 Steven Bertoni 对人工智能是如何正在改变人们约会进行过讨论。在[关于此次采访的文章][18]中,Bertoni 引用了 Rad 说的话,他说:“可能有这样一个时刻,Tinder 可以很好的推测你会感兴趣的人,在组织约会中还可能会做很多跑腿的工作”,所以,这个 app 会向用户推荐一些附近的同伴,并更进一步,协调彼此的时间安排一次约会,而不只是向用户显示一些有可能的同伴。 > 我们的后代真的可能会爱上人工智能。 你爱上了 AI 吗?我们的后代真的可能会爱上人工智能。Raya Bidshahri 发表在 [Singularity Hub][19] 的一篇文章“AI 将如何重新定义爱情”说,几十年的后,我们可能会认为爱情不再受生物学的限制。 -Bidshahri 解释说:“我们的技术符合摩尔定律,正在以惊人的速度增长 —— 智能设备正在越来越多地融入我们的生活。”,他补充道:“到 2029 年,我们将会有和人类同等智慧的 AI,而到 21 世纪 40 年代,AI 将会比人类聪明无数倍。许多人预测,有一天我们会与强大的机器合并,我们自己可能会变成人工智能。”他认为在这样一个世界上那些是不可避免的,人们将会接受与完全的非生物相爱。 +Bidshahri 解释说:“我们的技术符合摩尔定律,正在以惊人的速度增长 —— 智能设备正在越来越多地融入我们的生活。”,他补充道:“到 2029 年,我们将会有和人类同等智慧的 AI,而到 21 世纪 40 年代,AI 将会比人类聪明无数倍。许多人预测,有一天我们会与强大的机器合并,我们自己可能会变成人工智能。”他认为在这样一个世界上那些是不可避免的,人们将会接受与完全的非生物相爱。 -这听起来有点怪异,但是相比较于未来机器人将统治世界,爱上 AI 会是一个更乐观的结果。Bidshahri 说:"对 AI 进行编程,让他们能够感受到爱,这将使我们创造出更富有同情心的 AI,这可能也是避免很多人忧虑的 AI 大灾难的关键。" +这听起来有点怪异,但是相比较于未来机器人将统治世界,爱上 AI 会是一个更乐观的结果。Bidshahri 说:“对 AI 进行编程,让他们能够感受到爱,这将使我们创造出更富有同情心的 AI,这可能也是避免很多人忧虑的 AI 大灾难的关键。” 这份 AI 正在入侵我们生活各领域的清单只是涉及到了我们身边的人工智能的表面。哪些 AI 创新是让你最兴奋的,或者是让你最烦恼的?大家可以在文章评论区写下你们的感受。 @@ -69,11 +69,11 @@ Bidshahri 解释说:“我们的技术符合摩尔定律,正在以惊人的 Rikki Endsley - Rikki Endsley 是开源社区 Opensource.com 的管理员。在过去,她曾做过 Red Hat 开源和标准(OSAS)团队社区传播者;自由技术记者;USENIX 协会的社区管理员;linux 权威杂志 ADMIN 和 Ubuntu User 的合作出版者,还是杂志 Sys Admin 和 UnixReview.com 的主编。在 Twitter 上关注她:@rikkiends。 - +---- via: https://opensource.com/article/17/3/5-big-ways-ai-rapidly-invading-our-lives -作者:[Rikki Endsley ][a] +作者:[Rikki Endsley][a] 译者:[zhousiyu325](https://github.com/zhousiyu325) 校对:[jasminepeng](https://github.com/jasminepeng) From 9af72c7aa0230350d30c385063ec4921bb546ec2 Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 23 May 2017 08:55:38 +0800 Subject: [PATCH 0196/1407] translating --- .../20170511 How to Delete HUGE 100-200GB Files in Linux.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md b/sources/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md index 1bb5f71375..58bdccbd30 100644 --- a/sources/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md +++ b/sources/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md @@ -1,3 +1,5 @@ +translating---geekpi + How to Delete HUGE (100-200GB) Files in Linux ============================================================ From a1bf6e491f84e0e558819bc65b7b11ae1034068e Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 23 May 2017 09:34:05 +0800 Subject: [PATCH 0197/1407] translated --- ...to Delete HUGE 100-200GB Files in Linux.md | 89 ------------------- ...to Delete HUGE 100-200GB Files in Linux.md | 86 ++++++++++++++++++ 2 files changed, 86 insertions(+), 89 deletions(-) delete mode 100644 sources/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md create mode 100644 translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md diff --git a/sources/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md b/sources/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md deleted file mode 100644 index 58bdccbd30..0000000000 --- a/sources/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md +++ /dev/null @@ -1,89 +0,0 @@ -translating---geekpi - -How to Delete HUGE (100-200GB) Files in Linux -============================================================ - -by [Aaron Kili][11] | Published: May 11, 2017 | Last Updated: May 11, 2017 - - Download Your Free eBooks NOW - [10 Free Linux eBooks for Administrators][12] | [4 Free Shell Scripting eBooks][13] - -Usually, to [delete/remove a file from Linux terminal][1], we use the rm command (delete files), shred command (securely delete a file), wipe command (securely erase a file) or secure-deletion toolkit (a collection of [secure file deletion tools][2]). - -We can use any of the above utilities to deal with relatively small files. What if we want to delete/remove a huge file/directory say of about 100-200GB. This may not be as easy as it seems, in terms of the time taken to remove the file (I/O scheduling) as well as the amount of RAM consumed while carrying out the operation. - -In this tutorial, we will explain how to efficiently and reliably delete huge files/directories in Linux. - -**Suggested Read:** [5 Ways to Empty or Delete a Large File Content in Linux][3] - -The main aim here is to use a technique that will not slow down the system while removing a huge file, resulting to reasonable I/O. We can achieve this using the ionice command. - -### Deleting HUGE (200GB) Files in Linux Using ionice Command - -ionice is a useful program which sets or gets the I/O scheduling class and priority for another program. If no arguments or just `-p` is given, ionice will query the current I/O scheduling class and priority for that process. - -If we give a command name such as rm command, it will run this command with the given arguments. To specify the [process IDs of running processes][4] for which to get or set the scheduling parameters, run this: - -``` -# ionice -p PID -``` - -To specify the name or number of the scheduling class to use (0 for none, 1 for real time, 2 for best-effort, 3 for idle) the command below. - -This means that rm will belong to idle I/O class and only uses I/O when any other process does not need it: - -``` ----- Deleting Huge Files in Linux ----- -# ionice -c 3 rm /var/logs/syslog -# ionice -c 3 rm -rf /var/log/apache -``` - -If there won’t be much idle time on the system, then we may want to use the best-effort scheduling class and set a low priority like this: - -``` -# ionice -c 2 -n 6 rm /var/logs/syslog -# ionice -c 2 -n 6 rm -rf /var/log/apache -``` - -Note: To delete huge files using a secure method, we may use the shred, wipe and various tools in the secure-deletion toolkit mentioned earlier on, instead of rm command. - -**Suggested Read:** [3 Ways to Permanently and Securely Delete Files/Directories’ in Linux][5] - -For more info, look through the ionice man page: - -``` -# man ionice -``` - -That’s it for now! What other methods do you have in mind for the above purpose? Use the comment section below to share with us. - - --------------------------------------------------------------------------------- - -作者简介: - -Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. - ------------------- - -via: https://www.tecmint.com/delete-huge-files-in-linux/ - -作者:[Aaron Kili ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.tecmint.com/author/aaronkili/ -[1]:https://www.tecmint.com/permanently-and-securely-delete-files-directories-linux/ -[2]:https://www.tecmint.com/permanently-and-securely-delete-files-directories-linux/ -[3]:https://www.tecmint.com/empty-delete-file-content-linux/ -[4]:https://www.tecmint.com/find-linux-processes-memory-ram-cpu-usage/ -[5]:https://www.tecmint.com/permanently-and-securely-delete-files-directories-linux/ -[6]:https://www.tecmint.com/delete-huge-files-in-linux/# -[7]:https://www.tecmint.com/delete-huge-files-in-linux/# -[8]:https://www.tecmint.com/delete-huge-files-in-linux/# -[9]:https://www.tecmint.com/delete-huge-files-in-linux/# -[10]:https://www.tecmint.com/delete-huge-files-in-linux/#comments -[11]:https://www.tecmint.com/author/aaronkili/ -[12]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ -[13]:https://www.tecmint.com/free-linux-shell-scripting-books/ diff --git a/translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md b/translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md new file mode 100644 index 0000000000..1ac853080a --- /dev/null +++ b/translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md @@ -0,0 +1,86 @@ +如何在 Linux 中删除大(100-200GB)文件 +============================================================ + +作者:[Aaron Kili][11] | 发布日期: May 11, 2017 | 最后更新:May 11, 2017 + +立即下载你的免费电子书 - [10 本为管理员的免费 Linux 电子书][12] | [4 本免费 Shell 脚本电子书][13] + +通常,要[在 Linux 终端删除一个文件][1],我们使用 rm 命令(删除文件)、shred 命令(安全删除文件)、wipe 命令(安全擦除文件)或者 secure-deletion 工具包(一个[安全文件删除工具][2]集合)。 + +我们可以使用下面任意的工具来处理相对较小的文件。如果我们想要删除大的文件/文件夹,比如大概 100-200GB。这个方法在删除文件(I/O 调度)所花费的时间以及 RAM 占用量方面看起来可能并不容易。 + +在本教程中,我们会解释如何在 Linux 中有效率并可靠地删除大文件/文件夹。 + +**建议阅读:** [5 个在 Linux 中清空或者删除大文件的方法][3] + +主要的目标是使用一种不会在删除大文件时拖慢系统的技术,并有合理的 I/O 占用。我么可以用 ionice 命令实现这个目标。 + +### 在 Linux 中使用 ionice 命令删除大(200GB)文件 + +ionice 是一个可以为另一个程序设置或获取 I/O 调度级别和优先级的有用程序。如果没有给出参数或者只有 `-p`,那么 ionice 将会查询该进程的当前的 I/O 调度级别以及优先级。 + +如果我们给出命令名称,如 rm 命令,它将使用给定的参数运行此命令。要指定要获取或设置调度参数的[进程的进程 ID],运行这个: + +``` +# ionice -p PID +``` + +要指定名字或者调度的数字,使用(0 表示无、1 表示实时、2 表示尽力、3 表示空闲)下面的命令。 + +这意味这 rm 会属于空闲 I/O 级别,并且只在其他进程不使用的时候使用 I/O: + +``` +---- Deleting Huge Files in Linux ----- +# ionice -c 3 rm /var/logs/syslog +# ionice -c 3 rm -rf /var/log/apache +``` + +如果系统中没有很多空闲时间,那么我们希望使用尽力调度级别,并且使用低优先级: + +``` +# ionice -c 2 -n 6 rm /var/logs/syslog +# ionice -c 2 -n 6 rm -rf /var/log/apache +``` + +注意:要使用安全的方法删除大文件,我们可以使用先前提到的 shred、wipe 以及 secure-deletion 工具包中的不同工具,而不是 rm 命令。 + +**建议阅读:**[3 个在 Linux 中永久/安全删除文件/文件夹的方法][5] + +要获取更多信息,查阅 ionice 的手册页: + +``` +# man ionice +``` + +就是这样了!你脑海里还有其他的方法么?在评论栏中与我们分享。 + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux 系统管理员和网络开发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,并坚信分享知识。 + +------------------ + +via: https://www.tecmint.com/delete-huge-files-in-linux/ + +作者:[Aaron Kili ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://www.tecmint.com/permanently-and-securely-delete-files-directories-linux/ +[2]:https://www.tecmint.com/permanently-and-securely-delete-files-directories-linux/ +[3]:https://www.tecmint.com/empty-delete-file-content-linux/ +[4]:https://www.tecmint.com/find-linux-processes-memory-ram-cpu-usage/ +[5]:https://www.tecmint.com/permanently-and-securely-delete-files-directories-linux/ +[6]:https://www.tecmint.com/delete-huge-files-in-linux/# +[7]:https://www.tecmint.com/delete-huge-files-in-linux/# +[8]:https://www.tecmint.com/delete-huge-files-in-linux/# +[9]:https://www.tecmint.com/delete-huge-files-in-linux/# +[10]:https://www.tecmint.com/delete-huge-files-in-linux/#comments +[11]:https://www.tecmint.com/author/aaronkili/ +[12]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[13]:https://www.tecmint.com/free-linux-shell-scripting-books/ From a0835d707da8224cc0efaa8f003566056b365849 Mon Sep 17 00:00:00 2001 From: hwlog Date: Tue, 23 May 2017 11:03:09 +0800 Subject: [PATCH 0198/1407] Create North Korea's Unit 180, the cyber warfare cell that worries the West --- ...e cyber warfare cell that worries the West | 72 +++++++++++++++++++ 1 file changed, 72 insertions(+) create mode 100644 translated/talk/North Korea's Unit 180, the cyber warfare cell that worries the West diff --git a/translated/talk/North Korea's Unit 180, the cyber warfare cell that worries the West b/translated/talk/North Korea's Unit 180, the cyber warfare cell that worries the West new file mode 100644 index 0000000000..9569f58a21 --- /dev/null +++ b/translated/talk/North Korea's Unit 180, the cyber warfare cell that worries the West @@ -0,0 +1,72 @@ + +朝鲜180局的网络战部门让西方国家忧虑。 + +Translated by hwlog +North Korea's Unit 180, the cyber warfare cell that worries the West + +============================================================ + [![在夜色的映衬下,部队的军车通过平壤市区,](http://www.abc.net.au/news/image/8545124-3x2-700x467.jpg "Military trucks through Pyongyang")][13] [**PHOTO:** 脱北者说, 平壤的网络战攻击目的在于一个叫做“180局”的部门来筹集资金。(Reuters: Damir Sagolj, file)][14] + 据叛逃者,官方和网络安全专家称,朝鲜的情报机关有一个叫做180局的特殊部门, 这个部门已经发起过多起勇敢且成功的网络战。 +近几年朝鲜被美国,韩国,和周边几个国家指责对多数的金融网络发起过一系列在线袭击。 +网络安全技术人员称他们找到了这个月感染了150多个国家30多万台计算机的全球想哭勒索病毒"ransomware"和朝鲜网络战有关联的技术证据。 +平壤称该指控是“荒谬的”。 +对朝鲜的关键指控是指朝鲜与一个叫做拉撒路的黑客组织有联系,这个组织是在去年在孟加拉国中央银行网络抢劫8000万美元并在2014年攻击了索尼的好莱坞工作室的网路。 +美国政府指责朝鲜对索尼公司的黑客袭击,同时美国政府对平壤在孟加拉国银行的盗窃行为提起公诉并要求立案。 +由于没有确凿的证据,没有犯罪指控并不能够立案。朝鲜之后也否认了Sony公司和银行的袭击与其有关。 +朝鲜是世界上最封闭的国家之一,它秘密行动的一些细节很难获得。 +但研究这个封闭的国家和流落到韩国和一些西方国家的的叛逃者已经给出了或多或少的提示。 + +### 黑客们喜欢用雇员来作为掩护 +金恒光,朝鲜前计算机教授,2004叛逃到韩国,他仍然有着韩国内部的消息,他说平壤的网络战目的在于通过侦察总局下属的一个叫做180局来筹集资金,这个局主要是负责海外的情报机构。 +金教授称,“180局负责入侵金融机构通过漏洞从银行账户提取资金”。 +他之前也说过,他以前的一些学生已经加入了朝鲜的网络战略司令部-朝鲜的网络部队。 + +>"黑客们到海外寻找比朝鲜更好的互联网服务的地方,以免留下痕迹," 金教授补充说。 +他说他们经常用贸易公司,朝鲜的海外分公司和在中国和东南亚合资企业的雇员来作为掩护 +位于华盛顿的战略与国际研究中心的叫做James Lewis的朝鲜专家称,平壤首先用黑客作为间谍活动的工具然后对韩国和美国的目的进行政治干扰。 +索尼公司事件之后,他们改变方法,通过用黑客来支持犯罪活动来形成国内坚挺的货币经济政策。 +“目前为止,网上毒品,假冒伪劣,走私,都是他们惯用的伎俩”。 +Media player: 空格键播放,“M”键静音,“左击”和“右击”查看。 + +[**VIDEO:** 你遇到过勒索病毒吗? (ABC News)][16] + +### 韩国声称拥有大量的“证据” +美国国防部称在去年提交给国会的一个报告中显示,朝鲜可能有作为有效成本的,不对称的,可拒绝的工具,它能够应付来自报复性袭击很小的风险,因为它的“网络”大部分是和因特网分离的。 + +> 报告中说," 它可能从第三方国家使用互联网基础设施"。 +韩国政府称,他们拥有朝鲜网络战行动的大量证据。 +“朝鲜进行网络战通过第三方国家来掩护网络袭击的来源,并且使用他们的信息和通讯技术设施”,Ahn Chong-ghee,韩国外交部副部长,在书面评论中告诉路透社。 +除了孟加拉银行抢劫案,他说平壤也被怀疑与菲律宾,越南和波兰的银行袭击有关。 +去年六月,警察称朝鲜袭击了160个韩国公司和政府机构,入侵了大约14万台计算机,暗中在他的对手的计算机中植入恶意代码作为长期计划的一部分来进行大规模网络攻击。 +朝鲜也被怀疑在2014年对韩国核反应堆操作系统进行阶段性网络攻击,尽管朝鲜否认与其无关。 +根据在一个韩国首尔的杀毒软件厂商“hauri”的高级安全研究员Simon Choi的说法,网络袭击是来自于他在中国的一个基地。 +Choi先生,一个有着对朝鲜的黑客能力进行了广泛的研究的人称,“他们在那里行动以至于不论他们做什么样的计划,他们拥有中国的ip地址”。 + + +-------------------------------------------------------------------------------- + +via: http://www.abc.net.au/news/2017-05-21/north-koreas-unit-180-cyber-warfare-cell-hacking/8545106 + +作者:[www.abc.net.au ][a] +译者:[译者ID](https://github.com/hwlog) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.abc.net.au +[1]:http://www.abc.net.au/news/2017-05-16/wannacry-ransomware-showing-up-in-obscure-places/8527060 +[2]:http://www.abc.net.au/news/2015-08-05/why-we-should-care-about-cyber-crime/6673274 +[3]:http://www.abc.net.au/news/2017-05-15/what-to-do-if-youve-been-hacked/8526118 +[4]:http://www.abc.net.au/news/2017-05-16/researchers-link-wannacry-to-north-korea/8531110 +[5]:http://www.abc.net.au/news/2017-05-18/adylkuzz-cyberattack-could-be-far-worse-than-wannacry:-expert/8537502 +[6]:http://www.google.com/maps/place/Korea,%20Democratic%20People%20S%20Republic%20Of/@40,127,5z +[7]:http://www.abc.net.au/news/2017-05-16/wannacry-ransomware-showing-up-in-obscure-places/8527060 +[8]:http://www.abc.net.au/news/2017-05-16/wannacry-ransomware-showing-up-in-obscure-places/8527060 +[9]:http://www.abc.net.au/news/2015-08-05/why-we-should-care-about-cyber-crime/6673274 +[10]:http://www.abc.net.au/news/2015-08-05/why-we-should-care-about-cyber-crime/6673274 +[11]:http://www.abc.net.au/news/2017-05-15/what-to-do-if-youve-been-hacked/8526118 +[12]:http://www.abc.net.au/news/2017-05-15/what-to-do-if-youve-been-hacked/8526118 +[13]:http://www.abc.net.au/news/2017-05-21/military-trucks-trhough-pyongyang/8545134 +[14]:http://www.abc.net.au/news/2017-05-21/military-trucks-trhough-pyongyang/8545134 +[15]:http://www.abc.net.au/news/2017-05-16/researchers-link-wannacry-to-north-korea/8531110 +[16]:http://www.abc.net.au/news/2017-05-15/have-you-been-hit-by-ransomware/8527854 From 29d0b3d482989b2029d7280fe3797fa0ec8ed884 Mon Sep 17 00:00:00 2001 From: hwlog Date: Tue, 23 May 2017 11:04:01 +0800 Subject: [PATCH 0199/1407] Rename North Korea's Unit 180, the cyber warfare cell that worries the West to 20170523North Korea's Unit 180, the cyber warfare cell that worries the West --- ...orea's Unit 180, the cyber warfare cell that worries the West} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename translated/talk/{North Korea's Unit 180, the cyber warfare cell that worries the West => 20170523North Korea's Unit 180, the cyber warfare cell that worries the West} (100%) diff --git a/translated/talk/North Korea's Unit 180, the cyber warfare cell that worries the West b/translated/talk/20170523North Korea's Unit 180, the cyber warfare cell that worries the West similarity index 100% rename from translated/talk/North Korea's Unit 180, the cyber warfare cell that worries the West rename to translated/talk/20170523North Korea's Unit 180, the cyber warfare cell that worries the West From b23ce2ed8f126665d3a02324910e22b4c74d9b08 Mon Sep 17 00:00:00 2001 From: hwlog Date: Tue, 23 May 2017 11:05:02 +0800 Subject: [PATCH 0200/1407] =?UTF-8?q?hwlog=E7=BF=BB=E8=AF=91=E5=AE=8C?= =?UTF-8?q?=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...orea's Unit 180, the cyber warfare cell that worries the West | 1 - 1 file changed, 1 deletion(-) diff --git a/translated/talk/20170523North Korea's Unit 180, the cyber warfare cell that worries the West b/translated/talk/20170523North Korea's Unit 180, the cyber warfare cell that worries the West index 9569f58a21..64e14f979e 100644 --- a/translated/talk/20170523North Korea's Unit 180, the cyber warfare cell that worries the West +++ b/translated/talk/20170523North Korea's Unit 180, the cyber warfare cell that worries the West @@ -1,4 +1,3 @@ - 朝鲜180局的网络战部门让西方国家忧虑。 Translated by hwlog From 21fdae41b8ad675e0db6769802e90faf571cb99a Mon Sep 17 00:00:00 2001 From: ictlyh Date: Tue, 23 May 2017 13:40:39 +0800 Subject: [PATCH 0201/1407] Translating tech/Writing a Linux Debugger part3-6 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Delete tech/Writing a Linux Debugger Part1(已翻译) --- ...20170321 Writing A Linux Debugger Setup.md | 274 ------------------ ...ux Debugger Part 3 Registers and memory.md | 1 + ...Linux Debugger Part 4 Elves and dwarves.md | 1 + ...inux Debugger Part 5 Source and signals.md | 1 + ...x Debugger Part 6 Source-level stepping.md | 1 + 5 files changed, 4 insertions(+), 274 deletions(-) delete mode 100644 sources/tech/20170321 Writing A Linux Debugger Setup.md diff --git a/sources/tech/20170321 Writing A Linux Debugger Setup.md b/sources/tech/20170321 Writing A Linux Debugger Setup.md deleted file mode 100644 index 8d5b3daf36..0000000000 --- a/sources/tech/20170321 Writing A Linux Debugger Setup.md +++ /dev/null @@ -1,274 +0,0 @@ -Writing A Linux Debugger Setup -============================================================ _on March 21, 2017_ y— layout: post title: “Writing a Linux Debugger Part 1: Setup” category: c++ tags: - -* ### c++ - -Anyone who has written more than a hello world program should have used a debugger at some point (if you haven’t, drop what you’re doing and learn how to use one). However, although these tools are in such widespread use, there aren’t a lot of resources which tell you how they work and how to write one[1][6], especially when compared to other toolchain technologies like compilers. In this post series we’ll learn what makes debuggers tick and write one for debugging Linux programs. - -We’ll support the following features: - -* Launch, halt, and continue execution - -* Set breakpoints on - * Memory addresses - - * Source code lines - - * Function entry - -* Read and write registers and memory - -* Single stepping - * Instruction - - * Step in - - * Step out - - * Step over - -* Print current source location - -* Print backtrace - -* Print values of simple variables - -In the final part I’ll also outline how you could add the following to your debugger: - -* Remote debugging - -* Shared library and dynamic loading support - -* Expression evaluation - -* Multi-threaded debugging support - -I’ll be focusing on C and C++ for this project, but it should work just as well with any language which compiles down to machine code and outputs standard DWARF debug information (if you don’t know what that is yet, don’t worry, this will be covered soon). Additionally, my focus will be on just getting something up and running which works most of the time, so things like robust error handling will be eschewed in favour of simplicity. - -* * * - -### Series index - -These links will go live as the rest of the posts are released. - -1. [Setup][7] - -2. [Breakpoints][8] - -3. [Registers and memory][9] - -4. [Elves and dwarves][10] - -5. [Source and signals][11] - -6. [Source-level stepping][12] - -7. Source-level breakpoints - -8. Stack unwinding - -9. Reading variables - -10. Next steps - -* * * - -### Getting set up - -Before we jump into things, let’s get our environment set up. I’ll be using two dependencies in this tutorial: [Linenoise][13] for handling our command line input, and [libelfin][14] for parsing the debug information. You could use the more traditional libdwarf instead of libelfin, but the interface is nowhere near as nice, and libelfin also provides a mostly complete DWARF expression evaluator, which will save you a lot of time if you want to read variables. Make sure that you use the fbreg branch of my fork of libelfin, as it hacks on some extra support for reading variables on x86. - -Once you’ve either installed these on your system, or got them building as dependencies with whatever build system you prefer, it’s time to get started. I just set them to build along with the rest of my code in my CMake files. - -* * * - -### Launching the executable - -Before we actually debug anything, we’ll need to launch the debugee program. We’ll do this with the classic fork/exec pattern. - -``` -int main(int argc, char* argv[]) { - if (argc < 2) { - std::cerr << "Program name not specified"; - return -1; - } - - auto prog = argv[1]; - - auto pid = fork(); - if (pid == 0) { - //we're in the child process - //execute debugee - - } - else if (pid >= 1) { - //we're in the parent process - //execute debugger - } -``` - -We call `fork` and this causes our program to split into two processes. If we are in the child process, `fork` returns `0`, and if we are in the parent process, it returns the process ID of the child process. - -If we’re in the child process, we want to replace whatever we’re currently executing with the program we want to debug. - -``` - ptrace(PTRACE_TRACEME, 0, nullptr, nullptr); - execl(prog, prog, nullptr); -``` - -Here we have our first encounter with `ptrace`, which is going to become our best friend when writing our debugger. `ptrace` allows us to observe and control the execution of another process by reading registers, reading memory, single stepping and more. The API is very ugly; it’s a single function which you provide with an enumerator value for what you want to do, and then some arguments which will either be used or ignored depending on which value you supply. The signature looks like this: - -``` -long ptrace(enum __ptrace_request request, pid_t pid, - void *addr, void *data); -``` - -`request` is what we would like to do to the traced process; `pid` is the process ID of the traced process; `addr` is a memory address, which is used in some calls to designate an address in the tracee; and `data` is some request-specific resource. The return value often gives error information, so you probably want to check that in your real code; I’m just omitting it for brevity. You can have a look at the man pages for more information. - -The request we send in the above code, `PTRACE_TRACEME`, indicates that this process should allow its parent to trace it. All of the other arguments are ignored, because API design isn’t important /s. - -Next, we call `execl`, which is one of the many `exec` flavours. We execute the given program, passing the name of it as a command-line argument and a `nullptr` to terminate the list. You can pass any other arguments needed to execute your program here if you like. - -After we’ve done this, we’re finished with the child process; we’ll just let it keep running until we’re finished with it. - -* * * - -### Adding our debugger loop - -Now that we’ve launched the child process, we want to be able to interact with it. For this, we’ll create a `debugger` class, give it a loop for listening to user input, and launch that from our parent fork of our `main` function. - -``` -else if (pid >= 1) { - //parent - debugger dbg{prog, pid}; - dbg.run(); -} -``` - -``` -class debugger { -public: - debugger (std::string prog_name, pid_t pid) - : m_prog_name{std::move(prog_name)}, m_pid{pid} {} - - void run(); - -private: - std::string m_prog_name; - pid_t m_pid; -}; -``` - -In our `run` function, we need to wait until the child process has finished launching, then just keep on getting input from linenoise until we get an EOF (ctrl+d). - -``` -void debugger::run() { - int wait_status; - auto options = 0; - waitpid(m_pid, &wait_status, options); - - char* line = nullptr; - while((line = linenoise("minidbg> ")) != nullptr) { - handle_command(line); - linenoiseHistoryAdd(line); - linenoiseFree(line); - } -} -``` - -When the traced process is launched, it will be sent a `SIGTRAP` signal, which is a trace or breakpoint trap. We can wait until this signal is sent using the `waitpid` function. - -After we know the process is ready to be debugged, we listen for user input. The `linenoise`function takes a prompt to display and handles user input by itself. This means we get a nice command line with history and navigation commands without doing much work at all. When we get the input, we give the command to a `handle_command` function which we’ll write shortly, then we add this command to the linenoise history and free the resource. - -* * * - -### Handling input - -Our commands will follow a similar format to gdb and lldb. To continue the program, a user will type `continue` or `cont` or even just `c`. If they want to set a breakpoint on an address, they’ll write `break 0xDEADBEEF`, where `0xDEADBEEF` is the desired address in hexadecimal format. Let’s add support for these commands. - -``` -void debugger::handle_command(const std::string& line) { - auto args = split(line,' '); - auto command = args[0]; - - if (is_prefix(command, "continue")) { - continue_execution(); - } - else { - std::cerr << "Unknown command\n"; - } -} -``` - -`split` and `is_prefix` are a couple of small helper functions: - -``` -std::vector split(const std::string &s, char delimiter) { - std::vector out{}; - std::stringstream ss {s}; - std::string item; - - while (std::getline(ss,item,delimiter)) { - out.push_back(item); - } - - return out; -} - -bool is_prefix(const std::string& s, const std::string& of) { - if (s.size() > of.size()) return false; - return std::equal(s.begin(), s.end(), of.begin()); -} -``` - -We’ll add `continue_execution` to the `debugger` class. - -``` -void debugger::continue_execution() { - ptrace(PTRACE_CONT, m_pid, nullptr, nullptr); - - int wait_status; - auto options = 0; - waitpid(m_pid, &wait_status, options); -} -``` - -For now our `continue_execution` function will just use `ptrace` to tell the process to continue, then `waitpid` until it’s signalled. - -* * * - -### Finishing up - -Now you should be able to compile some C or C++ program, run it through your debugger, see it halting on entry, and be able to continue execution from your debugger. In the next part we’ll learn how to get our debugger to set breakpoints. If you come across any issues, please let me know in the comments! - -You can find the code for this post [here][15]. - -* * * - -1. Here are some pre-existing ones if you want other resources: [1][1] [2][2] [3][3] [4][4] [↩][5] - --------------------------------------------------------------------------------- - -via: https://blog.tartanllama.xyz/2017/03/21/writing-a-linux-debugger-setup/ - -作者:[TartanLlama ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.twitter.com/TartanLlama -[1]:http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1 -[2]:https://t-a-w.blogspot.co.uk/2007/03/how-to-code-debuggers.html -[3]:https://www.codeproject.com/Articles/43682/Writing-a-basic-Windows-debugger -[4]:http://system.joekain.com/debugger/ -[5]:https://blog.tartanllama.xyz/2017/03/21/writing-a-linux-debugger-setup/#fnref:1 -[6]:https://blog.tartanllama.xyz/2017/03/21/writing-a-linux-debugger-setup/#fn:1 -[7]:https://blog.tartanllama.xyz/2017/03/21/writing-a-linux-debugger-setup/ -[8]:https://blog.tartanllama.xyz/c++/2017/03/24/writing-a-linux-debugger-breakpoints/ -[9]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/ -[10]:https://blog.tartanllama.xyz/c++/2017/04/05/writing-a-linux-debugger-elf-dwarf/ -[11]:https://blog.tartanllama.xyz/c++/2017/04/24/writing-a-linux-debugger-source-signal/ -[12]:https://blog.tartanllama.xyz/c++/2017/05/06/writing-a-linux-debugger-dwarf-step/ -[13]:https://github.com/antirez/linenoise -[14]:https://github.com/TartanLlama/libelfin/tree/fbreg -[15]:https://github.com/TartanLlama/minidbg/tree/tut_setup diff --git a/sources/tech/20170331 Writing a Linux Debugger Part 3 Registers and memory.md b/sources/tech/20170331 Writing a Linux Debugger Part 3 Registers and memory.md index 19ddd8b9fa..dce6fa9cf5 100644 --- a/sources/tech/20170331 Writing a Linux Debugger Part 3 Registers and memory.md +++ b/sources/tech/20170331 Writing a Linux Debugger Part 3 Registers and memory.md @@ -1,3 +1,4 @@ +ictlyh Translating Writing a Linux Debugger Part 3: Registers and memory ============================================================ diff --git a/sources/tech/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md b/sources/tech/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md index 8ab7c2a397..ae3ae71618 100644 --- a/sources/tech/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md +++ b/sources/tech/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md @@ -1,3 +1,4 @@ +ictlyh Translating Writing a Linux Debugger Part 4: Elves and dwarves ============================================================ diff --git a/sources/tech/20170424 Writing a Linux Debugger Part 5 Source and signals.md b/sources/tech/20170424 Writing a Linux Debugger Part 5 Source and signals.md index 3e6f0e3e8a..027709225b 100644 --- a/sources/tech/20170424 Writing a Linux Debugger Part 5 Source and signals.md +++ b/sources/tech/20170424 Writing a Linux Debugger Part 5 Source and signals.md @@ -1,3 +1,4 @@ +ictlyh Translating Writing a Linux Debugger Part 5: Source and signals ============================================================ diff --git a/sources/tech/20170506 Writing a Linux Debugger Part 6 Source-level stepping.md b/sources/tech/20170506 Writing a Linux Debugger Part 6 Source-level stepping.md index 66bdf51629..7bc19ba829 100644 --- a/sources/tech/20170506 Writing a Linux Debugger Part 6 Source-level stepping.md +++ b/sources/tech/20170506 Writing a Linux Debugger Part 6 Source-level stepping.md @@ -1,3 +1,4 @@ +ictlyh Translating Writing a Linux Debugger Part 6: Source-level stepping ============================================================ From 1acaa11437efe0821fca94f9b7d2d0f8508796aa Mon Sep 17 00:00:00 2001 From: Flynn Date: Tue, 23 May 2017 19:35:24 +0800 Subject: [PATCH 0202/1407] Translating by ucasFL --- ...0518 Linfo – Shows Linux Server Health Status in Real-Time.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170518 Linfo – Shows Linux Server Health Status in Real-Time.md b/sources/tech/20170518 Linfo – Shows Linux Server Health Status in Real-Time.md index 3fed80265e..6aa915ed97 100644 --- a/sources/tech/20170518 Linfo – Shows Linux Server Health Status in Real-Time.md +++ b/sources/tech/20170518 Linfo – Shows Linux Server Health Status in Real-Time.md @@ -1,3 +1,4 @@ +ucasFL translating Linfo – Shows Linux Server Health Status in Real-Time ============================================================ From bfb4b4c33c5a23870a5ca5e306fefba0a67ec124 Mon Sep 17 00:00:00 2001 From: Flynn Date: Tue, 23 May 2017 20:32:07 +0800 Subject: [PATCH 0203/1407] Translated --- ...s Linux Server Health Status in Real-Time.md | 131 ------------------ 1 file changed, 131 deletions(-) delete mode 100644 sources/tech/20170518 Linfo – Shows Linux Server Health Status in Real-Time.md diff --git a/sources/tech/20170518 Linfo – Shows Linux Server Health Status in Real-Time.md b/sources/tech/20170518 Linfo – Shows Linux Server Health Status in Real-Time.md deleted file mode 100644 index 6aa915ed97..0000000000 --- a/sources/tech/20170518 Linfo – Shows Linux Server Health Status in Real-Time.md +++ /dev/null @@ -1,131 +0,0 @@ -ucasFL translating -Linfo – Shows Linux Server Health Status in Real-Time -============================================================ - - -Linfo is a free and open source, cross-platform server statistics UI/library which displays a great deal of system information. It is extensible, easy-to-use (via composer) PHP5 library to get extensive system statistics programmatically from your PHP application. It’s a Ncurses CLI view of Web UI, which works in Linux, Windows, *BSD, Darwin/Mac OSX, Solaris, and Minix. - -It displays system info including [CPU type/speed][2]; architecture, mount point usage, hard/optical/flash drives, hardware devices, network devices and stats, uptime/date booted, hostname, memory usage (RAM and swap, if possible), temperatures/voltages/fan speeds and RAID arrays. - -#### Requirements: - -* PHP 5.3 - -* pcre extension - -* Linux – /proc and /sys mounted and readable by PHP and Tested with the 2.6.x/3.x kernels - -### How to Install Linfo Server Stats UI/library in Linux - -First, create a Linfo directory in your Apache or Nginx web root directory, then clone and move repository files into `/var/www/html/linfo` using the [rsync command][3] as shown below: - -``` -$ sudo mkdir -p /var/www/html/linfo -$ git clone git://github.com/jrgp/linfo.git -$ sudo rsync -av linfo/ /var/www/html/linfo/ -``` - -Then rename sample.config.inc.php to config.inc.php. This is the Linfo config file, you can define your own values in it: - -``` -$ sudo mv sample.config.inc.php config.inc.php -``` - -Now open the URL `http://SERVER_IP/linfo` in web browser to see the Web UI as shown in the screenshots below. - -This screenshot shows the Linfo Web UI displaying core system info, hardware components, RAM stats, network devices, drives and file system mount points. - - [![Linux Server Health Information](https://www.tecmint.com/wp-content/uploads/2017/05/Linux-Server-Health-Information.png)][4] - -Linux Server Health Information - -You can add the line below in the config file `config.inc.php` to yield useful error messages for troubleshooting purposes: - -``` -$settings['show_errors'] = true; -``` - -### Running Linfo in Ncurses Mode - -Linfo has a simple ncurses-based interface, which rely on php’s ncurses extension. - -``` -# yum install php-pecl-ncurses [On CentOS/RHEL] -# dnf install php-pecl-ncurses [On Fedora] -$ sudo apt-get install php5-dev libncurses5-dev [On Debian/Ubuntu] -``` - -Now compile the php extension as follows - -``` -$ wget http://pecl.php.net/get/ncurses-1.0.2.tgz -$ tar xzvf ncurses-1.0.2.tgz -$ cd ncurses-1.0.2 -$ phpize # generate configure script -$ ./configure -$ make -$ sudo make install -``` - -Next, if you successfully compiled and installed the php extension, run the commands below. - -``` -$ sudo echo extension=ncurses.so > /etc/php5/cli/conf.d/ncurses.ini -``` - -Verify the ncurses. - -``` -$ php -m | grep ncurses -``` - -Now run the Linfo. - -``` -$ cd /var/www/html/linfo/ -$ ./linfo-curses -``` - [![Linux Server Information](https://www.tecmint.com/wp-content/uploads/2017/05/Linux-Server-Information.png)][5] - -Linux Server Information - -The following features yet to be added in Linfo: - -1. Support for more Unix operating systems (such as Hurd, IRIX, AIX, HP UX, etc) - -2. Support for less known operating systems: Haiku/BeOS - -3. Extra superfluous features/extensions - -4. Support for [htop-like][1] features in ncurses mode - -For more information, visit Linfo Github repository: [https://github.com/jrgp/linfo][6] - -That’s all! From now on, you can view a Linux system’s information from within a web browser using Linfo. Try it out and share with us your thoughts in the comments. Additionally, have you come across any similar useful tools/libraries? If yes, then give us some info about them as well. - --------------------------------------------------------------------------------- - -作者简介: - -Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. - ---------------- - -via: https://www.tecmint.com/linfo-shows-linux-server-health-status-in-real-time/ - -作者:[ Aaron Kili ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.tecmint.com/author/aaronkili/ -[1]:https://www.tecmint.com/install-htop-linux-process-monitoring-for-rhel-centos-fedora/ -[2]:https://www.tecmint.com/corefreq-linux-cpu-monitoring-tool/ -[3]:https://www.tecmint.com/rsync-local-remote-file-synchronization-commands/ -[4]:https://www.tecmint.com/wp-content/uploads/2017/05/Linux-Server-Health-Information.png -[5]:https://www.tecmint.com/wp-content/uploads/2017/05/Linux-Server-Information.png -[6]:https://github.com/jrgp/linfo -[7]:https://www.tecmint.com/author/aaronkili/ -[8]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ -[9]:https://www.tecmint.com/free-linux-shell-scripting-books/ From f8cb8120252a260f43763a7a6634bf5244b1a88d Mon Sep 17 00:00:00 2001 From: Flynn Date: Tue, 23 May 2017 20:32:23 +0800 Subject: [PATCH 0204/1407] Translated --- ...s Linux Server Health Status in Real-Time.md | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 translated/tech/20170518 Linfo – Shows Linux Server Health Status in Real-Time.md diff --git a/translated/tech/20170518 Linfo – Shows Linux Server Health Status in Real-Time.md b/translated/tech/20170518 Linfo – Shows Linux Server Health Status in Real-Time.md new file mode 100644 index 0000000000..077086073e --- /dev/null +++ b/translated/tech/20170518 Linfo – Shows Linux Server Health Status in Real-Time.md @@ -0,0 +1,131 @@ +Linfo — 实时显示你的 Linux 服务器运行状况 +============================================================ + + +Linfo 是一个免费且开源的跨平台服务器统计 UI/库,它可以显示大量的系统信息。Linfo 是可扩展的,通过 `composer`,很容易使用 PHP5 库以程序化方式获取来自 PHP 应用的扩展系统统计。它是 `Web UI` 的一个 `Ncurses CLI view`,在 Linux、Windows、BSD、Darwin/Mac OSX、Solaris 和 Minix 系统上均可用。 + +Linfo 显示的系统信息包括 [CPU 类型/速度][2]、服务器的体系结构、挂载点使用量、硬盘/光纤/flash 驱动器、硬件设备、网络设备和统计信息、运行时间/启动日期、主机名、内存使用量(RAM 和 swap)、温度/电压/风扇速度和 RAID 阵列等。 + +#### 环境要求: + +* PHP 5.3 + +* pcre 扩展 + +* Linux – /proc 和 /sys 已挂载且可对 `PHP` 可读,已经在 2.6.x/3.x 内核中测试过 + +### 如何在 Linux 中安装服务器统计 UI/库 Info + +首先,在 `Apache` 或 `Nginx` 的 Web 根目录下创建一个 `Linfo` 目录,然后,克隆仓库文件并使用下面展示的 [rsync 命令][3]将其移动到目录 `/var/www/html/linfo` 下: + +``` +$ sudo mkdir -p /var/www/html/linfo +$ git clone git://github.com/jrgp/linfo.git +$ sudo rsync -av linfo/ /var/www/html/linfo/ +``` + +接下来,将 `sample.config.inc.php` 重命名为 `config.inc.php`。这是 Linfo 的配置文件,你可以在里面定义你想要的值: + +``` +$ sudo mv sample.config.inc.php config.inc.php +``` + +现在,在 Web 浏览器中打开链接 `http://SERVER_IP/linfo` 来查看这个 Web UI,正如下面的截图所展示的。 + +从截图中可以看到, Linfo 显示了系统内核信息、硬件组成、RAM 统计、网络设备、驱动器以及文件系统挂载点。 + + [![Linux Server Health Information](https://www.tecmint.com/wp-content/uploads/2017/05/Linux-Server-Health-Information.png)][4] + +*Linux 服务器运行信息* + +你可以将下面一行内容加入配置文件 `config.inc.php` 中,从而可以产生错误信息,以便进行故障排查。 + +``` +$settings['show_errors'] = true; +``` + +### 以 Ncurses 模式运行 Linfo + +Linfo 有一个基于 `ncurses` 的简单界面,它依赖于 `php` 的 `ncurses` 扩展。 + +``` +# yum install php-pecl-ncurses [在 CentOS/RHEL 上] +# dnf install php-pecl-ncurses [在 Fedora 上] +$ sudo apt-get install php5-dev libncurses5-dev [在 Debian/Ubuntu 上] +``` + +现在,像下面这样编译这个 `php` 扩展: + +``` +$ wget http://pecl.php.net/get/ncurses-1.0.2.tgz +$ tar xzvf ncurses-1.0.2.tgz +$ cd ncurses-1.0.2 +$ phpize # generate configure script +$ ./configure +$ make +$ sudo make install +``` + +接下来,如果编译成功并安装好了该 `php` 扩展,运行下面的命令: + +``` +$ sudo echo extension=ncurses.so > /etc/php5/cli/conf.d/ncurses.ini +``` + +验证 ncurse: + +``` +$ php -m | grep ncurses +``` + +Now run the Linfo. +现在,运行 Info: + +``` +$ cd /var/www/html/linfo/ +$ ./linfo-curses +``` + [![Linux Server Information](https://www.tecmint.com/wp-content/uploads/2017/05/Linux-Server-Information.png)][5] + +*Linux 服务器信息* + +Info 中尚未加入下面这些功能: + +1. 支持更多 Unix 操作系统(比如 Hurd、IRIX、AIX 和 HP UX 等) + +2. 支持不太出名的操作系统 Haiku/BeOS + +3. 额外功能/扩展 + +5. 在 ncurses 模式中支持 [htop-like][1] 特性 + +如果想了解更多信息,请访问 Info 的 GitHub 仓库: [https://github.com/jrgp/linfo][6] + +这就是本文的全部内容了。从现在起,你可以使用 Info 在 Web 浏览器中查看 Linux 系统的信息。尝试一下,并在评论中和我们分享你的想法。另外,你是否还知道与之类似的有用工具/库?如果有,请给我们提供一些相关信息。 + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Kili 是 Linux 和 F.O.S.S 爱好者,将来的 Linux 系统管理员和网络开发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,并坚信分享知识 + +--------------- + +via: https://www.tecmint.com/linfo-shows-linux-server-health-status-in-real-time/ + +作者:[ Aaron Kili][a] +译者:[ucasFL](https://github.com/ucasFL) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://www.tecmint.com/install-htop-linux-process-monitoring-for-rhel-centos-fedora/ +[2]:https://www.tecmint.com/corefreq-linux-cpu-monitoring-tool/ +[3]:https://www.tecmint.com/rsync-local-remote-file-synchronization-commands/ +[4]:https://www.tecmint.com/wp-content/uploads/2017/05/Linux-Server-Health-Information.png +[5]:https://www.tecmint.com/wp-content/uploads/2017/05/Linux-Server-Information.png +[6]:https://github.com/jrgp/linfo +[7]:https://www.tecmint.com/author/aaronkili/ +[8]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[9]:https://www.tecmint.com/free-linux-shell-scripting-books/ From 329e1e3584f827bc7ba03802df1be99609fd232d Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 23 May 2017 20:50:15 +0800 Subject: [PATCH 0205/1407] PRF:20170523 North Korea's Unit 180, the cyber warfare cell that worries the West.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @hwlog 翻译的不错,可见用心了。另外就是要注意文件名。 --- ...yber warfare cell that worries the West.md | 95 +++++++++++++++++++ ...e cyber warfare cell that worries the West | 71 -------------- 2 files changed, 95 insertions(+), 71 deletions(-) create mode 100644 translated/talk/20170523 North Korea's Unit 180, the cyber warfare cell that worries the West.md delete mode 100644 translated/talk/20170523North Korea's Unit 180, the cyber warfare cell that worries the West diff --git a/translated/talk/20170523 North Korea's Unit 180, the cyber warfare cell that worries the West.md b/translated/talk/20170523 North Korea's Unit 180, the cyber warfare cell that worries the West.md new file mode 100644 index 0000000000..b6b75bfe2c --- /dev/null +++ b/translated/talk/20170523 North Korea's Unit 180, the cyber warfare cell that worries the West.md @@ -0,0 +1,95 @@ +朝鲜 180 局的网络战部门让西方国家忧虑 +============================================================ + +本文译自澳大利亚广播公司相关文章,不代表本站及译者、编辑的态度。 + + [![在夜色的映衬下,部队的军车通过平壤市区](http://www.abc.net.au/news/image/8545124-3x2-700x467.jpg "Military trucks through Pyongyang")][13] + +*[PHOTO:脱北者说, 平壤的网络战攻击目的旨在为一个叫做“180局”的部门来筹集资金。(路透社:Damir Sagolj, file)][14]* + +> 据脱北者、官方和网络安全专家的消息,朝鲜的情报机关有一个叫做 180 局的特殊部门, 这个部门已经发起过多起胆大且成功的网络战。 + +近几年,朝鲜被指责在美国、韩国,及其周边的几个国家对金融网络发起多起在线袭击。 + +网络安全研究人员称他们找到了这个月全球性感染了 150 多个国家 30 多万台计算机的[“想哭”勒索病毒和朝鲜网络战有关联的技术证据][15]。 + +平壤称该指控是“荒谬的”。 + +对朝鲜的关键指控是指朝鲜与一个叫做拉撒路(Lazarus)的黑客组织有联系,这个组织是在去年在孟加拉国中央银行网络抢劫了 8100 万美元,并在 2014 年攻击了索尼的好莱坞工作室的网络。 + +美国政府指责朝鲜对索尼公司的黑客袭击,同时美国政府对平壤在孟加拉国银行的盗窃行为提起公诉并要求立案。 + +由于没有确凿的证据、没有犯罪指控并不能够立案。朝鲜之后也否认了索尼公司和该银行的袭击与其有关。 + +朝鲜是世界上最封闭的国家之一,它秘密行动的一些细节很难获得。 + +但研究这个封闭国家的专家和流落到韩国和一些西方国家的的脱北者已经给出了或多或少的提示。 + +### 黑客们喜欢以雇员身份来作为掩护 + +金恒光,一位朝鲜前计算机教授,2004 叛逃到韩国,他仍然有着韩国内部的消息来源,他说平壤的网络战目的在于通过侦察总局(RGB)下属的一个叫做 180 局来筹集资金,这个局主要是负责海外的情报机构。 + +金教授称,“180 局负责入侵金融机构通过漏洞从银行账户提取资金”。 + +他之前也说过,他以前的一些学生已经加入了朝鲜的网络战略司令部,即朝鲜的网络部队。 + +>“黑客们到海外寻找比朝鲜更好的互联网服务的地方,以免留下痕迹,” 金教授补充说。 + +他说他们经常用贸易公司、朝鲜的海外分公司和在中国和东南亚合资企业的雇员来作为掩护。 + +位于华盛顿的战略与国际研究中心的一位名为 James Lewis 的朝鲜专家称,平壤首先把黑客攻击作为间谍活动的工具,然后对韩国和美国的目的进行政治干扰。 + +他说,“索尼公司事件之后,他们改变方法,通过用黑客来支持犯罪活动来形成国内坚挺的货币经济政策。” + +“目前为止,网上毒品,假冒伪劣,走私,都是他们惯用的伎俩”。 + + +[**VIDEO:** 你遇到过勒索病毒吗? (ABC News)][16] : https://dn-linuxcn.qbox.me/static/video/CNb_Ransomware_1505_512k.mp4 + +### 韩国声称拥有“大量的证据” + +美国国防部称在去年提交给国会的一个报告中显示,朝鲜将网络视为有成本效益的、不对称的、可否认的工具,它能够应付来自报复性袭击的很小风险,因为它的“网络”大部分是和因特网分离的。 + +> 报告中说," 它可能从第三方国家使用互联网基础设施"。 + +韩国政府称,他们拥有朝鲜网络战行动的大量证据。 + +“朝鲜进行网络战通过第三方国家来掩护网络袭击的来源,并且使用他们的信息和通讯技术设施”,韩国外交部副部长安总基在书面评论中告诉路透社。 + +除了孟加拉银行抢劫案,他说怀疑平壤也与菲律宾、越南和波兰的银行袭击有关。 + +去年六月,警察称朝鲜袭击了 160 个韩国公司和政府机构,入侵了大约 14 万台计算机,暗中在它的对手的计算机中植入恶意代码,为进行大规模网络攻击的长期计划而准备。 + +朝鲜也被怀疑在 2014 年对韩国核反应堆操作系统进行阶段性网络攻击,尽管朝鲜否认与其无关。 + +根据在一个韩国首尔的杀毒软件厂商 hauri 的高级安全研究员 Simon Choi 的说法,网络袭击是来自于朝鲜在中国的一个基地。 + +Choi 先生,是一位对朝鲜的黑客能力有广泛的研究的人,他称,“他们在那里行动,不管他们究竟在做什么,他们拥有中国的 IP 地址”。 + +-------------------------------------------------------------------------------- + +via: http://www.abc.net.au/news/2017-05-21/north-koreas-unit-180-cyber-warfare-cell-hacking/8545106 + +作者:[www.abc.net.au][a] +译者:[hwlog](https://github.com/hwlog) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.abc.net.au +[1]:http://www.abc.net.au/news/2017-05-16/wannacry-ransomware-showing-up-in-obscure-places/8527060 +[2]:http://www.abc.net.au/news/2015-08-05/why-we-should-care-about-cyber-crime/6673274 +[3]:http://www.abc.net.au/news/2017-05-15/what-to-do-if-youve-been-hacked/8526118 +[4]:http://www.abc.net.au/news/2017-05-16/researchers-link-wannacry-to-north-korea/8531110 +[5]:http://www.abc.net.au/news/2017-05-18/adylkuzz-cyberattack-could-be-far-worse-than-wannacry:-expert/8537502 +[6]:http://www.google.com/maps/place/Korea,%20Democratic%20People%20S%20Republic%20Of/@40,127,5z +[7]:http://www.abc.net.au/news/2017-05-16/wannacry-ransomware-showing-up-in-obscure-places/8527060 +[8]:http://www.abc.net.au/news/2017-05-16/wannacry-ransomware-showing-up-in-obscure-places/8527060 +[9]:http://www.abc.net.au/news/2015-08-05/why-we-should-care-about-cyber-crime/6673274 +[10]:http://www.abc.net.au/news/2015-08-05/why-we-should-care-about-cyber-crime/6673274 +[11]:http://www.abc.net.au/news/2017-05-15/what-to-do-if-youve-been-hacked/8526118 +[12]:http://www.abc.net.au/news/2017-05-15/what-to-do-if-youve-been-hacked/8526118 +[13]:http://www.abc.net.au/news/2017-05-21/military-trucks-trhough-pyongyang/8545134 +[14]:http://www.abc.net.au/news/2017-05-21/military-trucks-trhough-pyongyang/8545134 +[15]:http://www.abc.net.au/news/2017-05-16/researchers-link-wannacry-to-north-korea/8531110 +[16]:http://www.abc.net.au/news/2017-05-15/have-you-been-hit-by-ransomware/8527854 diff --git a/translated/talk/20170523North Korea's Unit 180, the cyber warfare cell that worries the West b/translated/talk/20170523North Korea's Unit 180, the cyber warfare cell that worries the West deleted file mode 100644 index 64e14f979e..0000000000 --- a/translated/talk/20170523North Korea's Unit 180, the cyber warfare cell that worries the West +++ /dev/null @@ -1,71 +0,0 @@ -朝鲜180局的网络战部门让西方国家忧虑。 - -Translated by hwlog -North Korea's Unit 180, the cyber warfare cell that worries the West - -============================================================ - [![在夜色的映衬下,部队的军车通过平壤市区,](http://www.abc.net.au/news/image/8545124-3x2-700x467.jpg "Military trucks through Pyongyang")][13] [**PHOTO:** 脱北者说, 平壤的网络战攻击目的在于一个叫做“180局”的部门来筹集资金。(Reuters: Damir Sagolj, file)][14] - 据叛逃者,官方和网络安全专家称,朝鲜的情报机关有一个叫做180局的特殊部门, 这个部门已经发起过多起勇敢且成功的网络战。 -近几年朝鲜被美国,韩国,和周边几个国家指责对多数的金融网络发起过一系列在线袭击。 -网络安全技术人员称他们找到了这个月感染了150多个国家30多万台计算机的全球想哭勒索病毒"ransomware"和朝鲜网络战有关联的技术证据。 -平壤称该指控是“荒谬的”。 -对朝鲜的关键指控是指朝鲜与一个叫做拉撒路的黑客组织有联系,这个组织是在去年在孟加拉国中央银行网络抢劫8000万美元并在2014年攻击了索尼的好莱坞工作室的网路。 -美国政府指责朝鲜对索尼公司的黑客袭击,同时美国政府对平壤在孟加拉国银行的盗窃行为提起公诉并要求立案。 -由于没有确凿的证据,没有犯罪指控并不能够立案。朝鲜之后也否认了Sony公司和银行的袭击与其有关。 -朝鲜是世界上最封闭的国家之一,它秘密行动的一些细节很难获得。 -但研究这个封闭的国家和流落到韩国和一些西方国家的的叛逃者已经给出了或多或少的提示。 - -### 黑客们喜欢用雇员来作为掩护 -金恒光,朝鲜前计算机教授,2004叛逃到韩国,他仍然有着韩国内部的消息,他说平壤的网络战目的在于通过侦察总局下属的一个叫做180局来筹集资金,这个局主要是负责海外的情报机构。 -金教授称,“180局负责入侵金融机构通过漏洞从银行账户提取资金”。 -他之前也说过,他以前的一些学生已经加入了朝鲜的网络战略司令部-朝鲜的网络部队。 - ->"黑客们到海外寻找比朝鲜更好的互联网服务的地方,以免留下痕迹," 金教授补充说。 -他说他们经常用贸易公司,朝鲜的海外分公司和在中国和东南亚合资企业的雇员来作为掩护 -位于华盛顿的战略与国际研究中心的叫做James Lewis的朝鲜专家称,平壤首先用黑客作为间谍活动的工具然后对韩国和美国的目的进行政治干扰。 -索尼公司事件之后,他们改变方法,通过用黑客来支持犯罪活动来形成国内坚挺的货币经济政策。 -“目前为止,网上毒品,假冒伪劣,走私,都是他们惯用的伎俩”。 -Media player: 空格键播放,“M”键静音,“左击”和“右击”查看。 - -[**VIDEO:** 你遇到过勒索病毒吗? (ABC News)][16] - -### 韩国声称拥有大量的“证据” -美国国防部称在去年提交给国会的一个报告中显示,朝鲜可能有作为有效成本的,不对称的,可拒绝的工具,它能够应付来自报复性袭击很小的风险,因为它的“网络”大部分是和因特网分离的。 - -> 报告中说," 它可能从第三方国家使用互联网基础设施"。 -韩国政府称,他们拥有朝鲜网络战行动的大量证据。 -“朝鲜进行网络战通过第三方国家来掩护网络袭击的来源,并且使用他们的信息和通讯技术设施”,Ahn Chong-ghee,韩国外交部副部长,在书面评论中告诉路透社。 -除了孟加拉银行抢劫案,他说平壤也被怀疑与菲律宾,越南和波兰的银行袭击有关。 -去年六月,警察称朝鲜袭击了160个韩国公司和政府机构,入侵了大约14万台计算机,暗中在他的对手的计算机中植入恶意代码作为长期计划的一部分来进行大规模网络攻击。 -朝鲜也被怀疑在2014年对韩国核反应堆操作系统进行阶段性网络攻击,尽管朝鲜否认与其无关。 -根据在一个韩国首尔的杀毒软件厂商“hauri”的高级安全研究员Simon Choi的说法,网络袭击是来自于他在中国的一个基地。 -Choi先生,一个有着对朝鲜的黑客能力进行了广泛的研究的人称,“他们在那里行动以至于不论他们做什么样的计划,他们拥有中国的ip地址”。 - - --------------------------------------------------------------------------------- - -via: http://www.abc.net.au/news/2017-05-21/north-koreas-unit-180-cyber-warfare-cell-hacking/8545106 - -作者:[www.abc.net.au ][a] -译者:[译者ID](https://github.com/hwlog) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.abc.net.au -[1]:http://www.abc.net.au/news/2017-05-16/wannacry-ransomware-showing-up-in-obscure-places/8527060 -[2]:http://www.abc.net.au/news/2015-08-05/why-we-should-care-about-cyber-crime/6673274 -[3]:http://www.abc.net.au/news/2017-05-15/what-to-do-if-youve-been-hacked/8526118 -[4]:http://www.abc.net.au/news/2017-05-16/researchers-link-wannacry-to-north-korea/8531110 -[5]:http://www.abc.net.au/news/2017-05-18/adylkuzz-cyberattack-could-be-far-worse-than-wannacry:-expert/8537502 -[6]:http://www.google.com/maps/place/Korea,%20Democratic%20People%20S%20Republic%20Of/@40,127,5z -[7]:http://www.abc.net.au/news/2017-05-16/wannacry-ransomware-showing-up-in-obscure-places/8527060 -[8]:http://www.abc.net.au/news/2017-05-16/wannacry-ransomware-showing-up-in-obscure-places/8527060 -[9]:http://www.abc.net.au/news/2015-08-05/why-we-should-care-about-cyber-crime/6673274 -[10]:http://www.abc.net.au/news/2015-08-05/why-we-should-care-about-cyber-crime/6673274 -[11]:http://www.abc.net.au/news/2017-05-15/what-to-do-if-youve-been-hacked/8526118 -[12]:http://www.abc.net.au/news/2017-05-15/what-to-do-if-youve-been-hacked/8526118 -[13]:http://www.abc.net.au/news/2017-05-21/military-trucks-trhough-pyongyang/8545134 -[14]:http://www.abc.net.au/news/2017-05-21/military-trucks-trhough-pyongyang/8545134 -[15]:http://www.abc.net.au/news/2017-05-16/researchers-link-wannacry-to-north-korea/8531110 -[16]:http://www.abc.net.au/news/2017-05-15/have-you-been-hit-by-ransomware/8527854 From 4a562f77c3c1f4afeb1ed1bae021e5244de3096f Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 23 May 2017 20:50:52 +0800 Subject: [PATCH 0206/1407] PUB:20170523 North Korea's Unit 180, the cyber warfare cell that worries the West.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit https://linux.cn/article-8536-1.html 明早可访问~ --- ...ea's Unit 180, the cyber warfare cell that worries the West.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/talk => published}/20170523 North Korea's Unit 180, the cyber warfare cell that worries the West.md (100%) diff --git a/translated/talk/20170523 North Korea's Unit 180, the cyber warfare cell that worries the West.md b/published/20170523 North Korea's Unit 180, the cyber warfare cell that worries the West.md similarity index 100% rename from translated/talk/20170523 North Korea's Unit 180, the cyber warfare cell that worries the West.md rename to published/20170523 North Korea's Unit 180, the cyber warfare cell that worries the West.md From 7d2afb66154aa6ab0ceeff079b235332365e55b1 Mon Sep 17 00:00:00 2001 From: chenxinlong <237448382@qq.com> Date: Tue, 23 May 2017 21:05:49 +0800 Subject: [PATCH 0207/1407] translating by chenxinlong --- sources/tech/20170303 A Programmes Introduction to Unicode.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sources/tech/20170303 A Programmes Introduction to Unicode.md b/sources/tech/20170303 A Programmes Introduction to Unicode.md index 0e4bd2b1b7..4724955c87 100644 --- a/sources/tech/20170303 A Programmes Introduction to Unicode.md +++ b/sources/tech/20170303 A Programmes Introduction to Unicode.md @@ -1,3 +1,4 @@ +translating by chenxinlong [A Programmer’s Introduction to Unicode][18] ============================================================ @@ -223,7 +224,7 @@ You can contact me at nathaniel dot reed at gmail dot com, or follow me on Twitt via: http://reedbeta.com/blog/programmers-intro-to-unicode/?imm_mid=0ee8ca&cmp=em-prog-na-na-newsltr_20170311 作者:[ Nathan][a] -译者:[译者ID](https://github.com/译者ID) +译者:[译者ID](https://github.com/chenxinlong) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 711114cb5960f261be4afdfbe1c6ed7a504c561c Mon Sep 17 00:00:00 2001 From: hwlog Date: Tue, 23 May 2017 22:11:22 +0800 Subject: [PATCH 0208/1407] Update 20170519 How to Kill a Process from the Command Line.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 翻译完成 --- ...to Kill a Process from the Command Line.md | 83 +++++++++---------- 1 file changed, 41 insertions(+), 42 deletions(-) diff --git a/sources/tech/20170519 How to Kill a Process from the Command Line.md b/sources/tech/20170519 How to Kill a Process from the Command Line.md index 143129ab48..45bf3ffd0a 100644 --- a/sources/tech/20170519 How to Kill a Process from the Command Line.md +++ b/sources/tech/20170519 How to Kill a Process from the Command Line.md @@ -2,87 +2,86 @@ How to Kill a Process from the Command Line ============================================================ ![stop processes](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/stop-processes.jpg?itok=vfNx8VRz "stop processes") ->Linux has all the tools you need to stop running processes at the command line. Jack Wallen has details.[Creative Commons Zero][4] +>linux的命令行有你需要的用来停止正在运行的进程的所有工具。Jack Wallen透露出细节。[Creative Commons Zero][4] -Picture this: You’ve launched an application (be it from your favorite desktop menu or from the command line) and you start using that launched app, only to have it lock up on you, stop performing, or unexpectedly die. You try to run the app again, but it turns out the original never truly shut down completely. +想像一下: 你打开了一个程序 (可能来自于你的桌面菜单或者命令行) ,然后开始使用这个app, 没想到程序会锁死, 停止运行, 或者以外死机. 你尝试再次运行app, 但是结果是不能够完全真正的关机。 -What do you do? You kill the process. But how? Believe it or not, your best bet most often lies within the command line. Thankfully, Linux has every tool necessary to empower you, the user, to kill an errant process. However, before you immediately launch that command to kill the process, you first have to know what the process is. How do you take care of this layered task? It’s actually quite simple...once you know the tools at your disposal. +你该怎么办? 你要结束进程. 但该如何做? 信或者不信,最好的解决方法大都在命令行里. 值得庆幸的是, Linux有每个必要的工具来供用户杀死错误的进程,然而, 你在执行杀死进程的命令之前, 你首先必须知道进程是什么. 该如何处理这层的任务? 一旦你能够掌握这个工具,它实际是十分简单的... -Let me introduce you to said tools. +让我来介绍给你这些工具. +我来概述的步骤是每个linux发行版都能用的,不论是桌面版还是服务器版。 +我讲严格使用命令行,打开你的终端开始输入命令吧。 -The steps I’m going to outline will work on almost every Linux distribution, whether it is a desktop or a server. I will be dealing strictly with the command line, so open up your terminal and prepare to type. +### 定位进程 -### Locating the process +杀死一个没有响应的进程的第一个步骤是定位这个进程。我用来定位进程的命令有两个:top和ps命令。top是每个系统管理员都知道的工具,用top命令,你能够get到所有当前正在运行的进程有那些。在命令行里,输入top命令能够就看到你正在运行的程序进程(图1) -The first step in killing the unresponsive process is locating it. There are two commands I use to locate a process:  _top _ and  _ps_ . Top is a tool every administrator should get to know. With  _top_ , you get a full listing of currently running process. From the command line, issue  _top_  to see a list of your running processes (Figure 1). ### [killa.jpg][5] ![top](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/killa.jpg?itok=95cUI9Lh "top") -Figure 1: The top command gives you plenty of information.[Used with permission][1] +图1: top命令给出你许多的信息.[通过权限使用][1] -From this list you will see some rather important information. Say, for example, Chrome has become unresponsive. According to our  _top_ display, we can discern there are four instances of chrome running with Process IDs (PID) 3827, 3919, 10764, and 11679\. This information will be important to have with one particular method of killing the process. +从显示的列表中你能够看到相当重要的信息,举个例子,Chrome浏览器反映迟钝,依据我们的top命令显示,我们能够辨别的有四个Chrome浏览器的进程在运行,进程的pid号分别是3827,3919,10764,和11679.这个信息是重要的,可以用一个特殊的方法来结束进程。 -Although  _top_  is incredibly handy, it’s not always the most efficient means of getting the information you need. Let’s say you know the Chrome process is what you need to kill, and you don’t want to have to glance through the real-time information offered by  _top_ . For that, you can make use of the  _ps_ command and filter the output through  _grep_ . The  _ps_  command reports a snapshot of a current process and  _grep _ prints lines matching a pattern. The reason why we filter  _ps_  through  _grep_  is simple: If you issue the  _ps_  command by itself, you will get a snapshot listing of all current processes. We only want the listing associated with Chrome. So this command would look like: +尽管top命令很是方便, 但也不是得到你所要信息最有效的方法。 你知道你要杀死的Chrome进程是那个,并且你也不想看top命令所显示的实时信息。 鉴于此, 你能够使用ps命令然后用grep命令来过滤出输出结果。这个ps命令能够显示出当前进程的快照,然后用grep命令输出匹配的样式。我们通过grep命令过滤ps命令的输出的理由很简单:如果你只输入ps命令,你将会得到当前所有进程的快照列表,而我们需要的是列出Chrome浏览器进程相关的。所以这个命令是这个样子: ``` ps aux | grep chrome ``` -The  _aux_  options are as follows: +The  _aux_  options are as follows: #辅助选项如下所示 -* a = show processes for all users +* a = show processes for all users #a = 显示所有用户的进程 -* u = display the process's user/owner +* u = display the process's user/owner #u = 显示进程的用户和拥有者 -* x = also show processes not attached to a terminal +* x = also show processes not attached to a terminal #x = 显示进程不依附于终端 -The  _x_  option is important when you’re hunting for information regarding a graphical application. - -When you issue the command above, you’ll be given more information than you need (Figure 2) for the killing of a process, but it is sometimes more efficient than using top. +当你在图形化程序上搜寻信息的时候,这个x参数是很重要的。 +当你输入以上命令的时候,你将会得到比图2更多的结束一个进程的信息,而且它有事用起来比top命令更有效。 ### [killb.jpg][6] ![ps command](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/killb.jpg?itok=vyWIuTva "ps command") -Figure 2: Locating the necessary information with the ps command.[Used with permission][2] +图2: 用ps命令来定位所需的内容信息。[通过权限使用][2] -### Killing the process +### 结束进程 -Now we come to the task of killing the process. We have two pieces of information that will help us kill the errant process: +现在我们开始结束进程的任务。我们有两种信息来帮我们杀死错误的进程。 -* Process name +* Process name #进程的名字 -* Process ID +* Process ID #进程的ID -Which you use will determine the command used for termination. There are two commands used to kill a process: +你用哪一个将会决定终端命令如何使用,通常有两个命令来结束进程: -* kill - Kill a process by ID +* kill - Kill a process by ID #通过ID来结束进程 -* killall - Kill a process by name +* killall - Kill a process by name #通过进程名字来结束进程 -There are also different signals that can be sent to both kill commands. What signal you send will be determined by what results you want from the kill command. For instance, you can send the HUP (hang up) signal to the kill command, which will effectively restart the process. This is always a wise choice when you need the process to immediately restart (such as in the case of a daemon). You can get a list of all the signals that can be sent to the kill command by issuing kill -l. You’ll find quite a large number of signals (Figure 3). +有两个不同的信号能够发送给两个结束进程的命令。你发送的信号决定着你想要从结束进程命令中得到的结果。举个例子,你可以发送HUP(挂起)信号给结束进程的命令,命令实际上将会重启这个进程。当你需要立即重启一个进程(比如就守护进程来说),这是一个明智的选择。你通过输入kill -l可以得到所有信号的列表。,你将会发现大量的信号。(图3) ### [killc.jpg][7] ![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/killc.jpg?itok=9ewRHFW2) -Figure 3: The available kill signals.[Used with permission][3] +图3: 可用的结束进程信号.[通过权限使用][3] -The most common kill signals are: +最经常使用的结束进程的信号是:T | -Signal Name +Signal Name | -Single Value - +Single Value | -Effect +Effect | | @@ -151,14 +150,14 @@ Stop the process | -What’s nice about this is that you can use the Signal Value in place of the Signal Name. So you don’t have to memorize all of the names of the various signals.  -So, let’s now use the  _kill _ command to kill our instance of chrome. The structure for this command would be: +好的是,你能用信号值来代替信号名字。所以你没有必要来记住所有各种各样的信号名字。 +所以,让我们现在用kill命令来杀死Chrome浏览器的进程。这个命令的结构是: ``` kill SIGNAL PID ``` -Where SIGNAL is the signal to be sent and PID is the Process ID to be killed. We already know, from our  _ps_  command that the IDs we want to kill are 3827, 3919, 10764, and 11679\. So to send the kill signal, we’d issue the commands: +信号被发送到那里,进程的ID就会被结束。我们已经知道,来自我们的ps命令显示我们想要结束的进程ID号是3827, 3919, 10764, and 11679\。所以要发送结束进程信号,我们输入以下命令: ``` kill -9 3827 @@ -170,24 +169,24 @@ kill -9 10764 kill -9 11679 ``` -Once we’ve issued the above commands, all of the chrome processes will have been successfully killed. +一旦我们输入了以上命令,Chrome浏览器的所有进程将会成功被杀死。 -Let’s take the easy route! If we already know the process we want to kill is named chrome, we can make use of the  _killall _ command and send the same signal the process like so: +我们有更简单的方法! 如果我们已经知道我们想要杀死的那个进程的名字,我们能够利用killall命令发送同样的信号,像这样: _killall -9 chrome_ -The only caveat to the above command is that it may not catch all of the running chrome processes. If, after running the above command, you issue the ps aux|grep chrome command and see remaining processes running, your best bet is to go back to the  _kill _ command and send signal 9 to terminate the process by PID. +附带说明的是,上边这个命令可能不能捕捉到所有正在运行的Chrome进程。如果,运行了上边这个命令之后,你输入ps aux|grep chrome 命令过滤一下,看到剩下正在运行的Chrome进程有那些,最好的办法还是回到KIll命令通过进程的ID来发送信号值9来结束这个进程。 -### Ending processes made easy +### 结束进程变得容易 -As you can see, killing errant processes isn’t nearly as challenging as you might have thought. When I wind up with a stubborn process, I tend to start off with the  _killall _ command as it is the most efficient route to termination. However, when you wind up with a really feisty process, the  _kill _ command is the way to go. +正如你看到的,杀死错误的进程并没有你原本想的那样有挑战性。当我让一个顽固的进程结束的时候,我趋向于用killall命令来作为有效的方法来终止,然而,当我让一个真正的活跃的进程结束的时候,kill命令是一个好的方法。 --------------------------------------------------------------------------------- +------------------------------------------------------------------------------- via: https://www.linux.com/learn/intro-to-linux/2017/5/how-kill-process-command-line 作者:[JACK WALLEN][a] -译者:[译者ID](https://github.com/译者ID) +译者:[hwlog](https://github.com/hwlog) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 305fb146e10fa4ed39856dadf4638c39a1070735 Mon Sep 17 00:00:00 2001 From: hwlog Date: Tue, 23 May 2017 22:33:22 +0800 Subject: [PATCH 0209/1407] translating by hwlog --- .../tech/20170519 How to Kill a Process from the Command Line.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170519 How to Kill a Process from the Command Line.md b/sources/tech/20170519 How to Kill a Process from the Command Line.md index 143129ab48..eec244ec6d 100644 --- a/sources/tech/20170519 How to Kill a Process from the Command Line.md +++ b/sources/tech/20170519 How to Kill a Process from the Command Line.md @@ -1,3 +1,4 @@ +translating How to Kill a Process from the Command Line ============================================================ From 6ba15a07a227690990ba7f944307c16fbc04c9cd Mon Sep 17 00:00:00 2001 From: hwlog Date: Tue, 23 May 2017 22:44:01 +0800 Subject: [PATCH 0210/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=AE=8C=E6=88=90?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...to Kill a Process from the Command Line.md | 202 ++++++++++++++++++ 1 file changed, 202 insertions(+) create mode 100644 translated/tech/20170519 How to Kill a Process from the Command Line.md diff --git a/translated/tech/20170519 How to Kill a Process from the Command Line.md b/translated/tech/20170519 How to Kill a Process from the Command Line.md new file mode 100644 index 0000000000..32821203f1 --- /dev/null +++ b/translated/tech/20170519 How to Kill a Process from the Command Line.md @@ -0,0 +1,202 @@ +怎样在命令行下杀死一个进程 +============================================================ + +![stop processes](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/stop-processes.jpg?itok=vfNx8VRz "stop processes") +>linux的命令行有你需要的用来停止正在运行的进程的所有工具。Jack Wallen透露出细节。[Creative Commons Zero][4] + +想像一下: 你打开了一个程序 (可能来自于你的桌面菜单或者命令行) ,然后开始使用这个app, 没想到程序会锁死, 停止运行, 或者以外死机. 你尝试再次运行app, 但是结果是不能够完全真正的关机。 + +你该怎么办? 你要结束进程. 但该如何做? 信或者不信,最好的解决方法大都在命令行里. 值得庆幸的是, Linux有每个必要的工具来供用户杀死错误的进程,然而, 你在执行杀死进程的命令之前, 你首先必须知道进程是什么. 该如何处理这层的任务? 一旦你能够掌握这个工具,它实际是十分简单的... + +让我来介绍给你这些工具. +我来概述的步骤是每个linux发行版都能用的,不论是桌面版还是服务器版。 +我讲严格使用命令行,打开你的终端开始输入命令吧。 + +### 定位进程 + +杀死一个没有响应的进程的第一个步骤是定位这个进程。我用来定位进程的命令有两个:top和ps命令。top是每个系统管理员都知道的工具,用top命令,你能够get到所有当前正在运行的进程有那些。在命令行里,输入top命令能够就看到你正在运行的程序进程(图1) + + +### [killa.jpg][5] + +![top](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/killa.jpg?itok=95cUI9Lh "top") + +图1: top命令给出你许多的信息.[通过权限使用][1] + +从显示的列表中你能够看到相当重要的信息,举个例子,Chrome浏览器反映迟钝,依据我们的top命令显示,我们能够辨别的有四个Chrome浏览器的进程在运行,进程的pid号分别是3827,3919,10764,和11679.这个信息是重要的,可以用一个特殊的方法来结束进程。 + +尽管top命令很是方便, 但也不是得到你所要信息最有效的方法。 你知道你要杀死的Chrome进程是那个,并且你也不想看top命令所显示的实时信息。 鉴于此, 你能够使用ps命令然后用grep命令来过滤出输出结果。这个ps命令能够显示出当前进程的快照,然后用grep命令输出匹配的样式。我们通过grep命令过滤ps命令的输出的理由很简单:如果你只输入ps命令,你将会得到当前所有进程的快照列表,而我们需要的是列出Chrome浏览器进程相关的。所以这个命令是这个样子: + +``` +ps aux | grep chrome +``` + +The  _aux_  options are as follows: #辅助选项如下所示 + +* a = show processes for all users #a = 显示所有用户的进程 + +* u = display the process's user/owner #u = 显示进程的用户和拥有者 + +* x = also show processes not attached to a terminal #x = 显示进程不依附于终端 + +当你在图形化程序上搜寻信息的时候,这个x参数是很重要的。 + +当你输入以上命令的时候,你将会得到比图2更多的结束一个进程的信息,而且它有事用起来比top命令更有效。 +### [killb.jpg][6] + +![ps command](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/killb.jpg?itok=vyWIuTva "ps command") + +图2: 用ps命令来定位所需的内容信息。[通过权限使用][2] + +### 结束进程 + +现在我们开始结束进程的任务。我们有两种信息来帮我们杀死错误的进程。 + +* Process name #进程的名字 + +* Process ID #进程的ID + +你用哪一个将会决定终端命令如何使用,通常有两个命令来结束进程: + +* kill - Kill a process by ID #通过ID来结束进程 + +* killall - Kill a process by name #通过进程名字来结束进程 + +有两个不同的信号能够发送给两个结束进程的命令。你发送的信号决定着你想要从结束进程命令中得到的结果。举个例子,你可以发送HUP(挂起)信号给结束进程的命令,命令实际上将会重启这个进程。当你需要立即重启一个进程(比如就守护进程来说),这是一个明智的选择。你通过输入kill -l可以得到所有信号的列表。,你将会发现大量的信号。(图3) + +### [killc.jpg][7] + +![](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/killc.jpg?itok=9ewRHFW2) + +图3: 可用的结束进程信号.[通过权限使用][3] + +最经常使用的结束进程的信号是:T + +| + +Signal Name + + | + +Single Value + | + +Effect + + | +| + +SIGHUP + + | + +1 + + | + +Hangup + + | +| + +SIGINT + + | + +2 + + | + +Interrupt from keyboard + + | +| + +SIGKILL + + | + +9 + + | + +Kill signal + + | +| + +SIGTERM + + | + +15 + + | + +Termination signal + + | +| + +SIGSTOP + + | + +17, 19, 23 + + | + +Stop the process + + | + +好的是,你能用信号值来代替信号名字。所以你没有必要来记住所有各种各样的信号名字。 +所以,让我们现在用kill命令来杀死Chrome浏览器的进程。这个命令的结构是: + +``` +kill SIGNAL PID +``` + +信号被发送到那里,进程的ID就会被结束。我们已经知道,来自我们的ps命令显示我们想要结束的进程ID号是3827, 3919, 10764, and 11679\。所以要发送结束进程信号,我们输入以下命令: + +``` +kill -9 3827 + +kill -9 3919 + +kill -9 10764 + +kill -9 11679 +``` + +一旦我们输入了以上命令,Chrome浏览器的所有进程将会成功被杀死。 + +我们有更简单的方法! 如果我们已经知道我们想要杀死的那个进程的名字,我们能够利用killall命令发送同样的信号,像这样: + + _killall -9 chrome_ + +附带说明的是,上边这个命令可能不能捕捉到所有正在运行的Chrome进程。如果,运行了上边这个命令之后,你输入ps aux|grep chrome 命令过滤一下,看到剩下正在运行的Chrome进程有那些,最好的办法还是回到KIll命令通过进程的ID来发送信号值9来结束这个进程。 + +### 结束进程变得容易 + +正如你看到的,杀死错误的进程并没有你原本想的那样有挑战性。当我让一个顽固的进程结束的时候,我趋向于用killall命令来作为有效的方法来终止,然而,当我让一个真正的活跃的进程结束的时候,kill命令是一个好的方法。 + +------------------------------------------------------------------------------- + +via: https://www.linux.com/learn/intro-to-linux/2017/5/how-kill-process-command-line + +作者:[JACK WALLEN][a] +译者:[hwlog](https://github.com/hwlog) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.linux.com/users/jlwallen +[1]:https://www.linux.com/licenses/category/used-permission +[2]:https://www.linux.com/licenses/category/used-permission +[3]:https://www.linux.com/licenses/category/used-permission +[4]:https://www.linux.com/licenses/category/creative-commons-zero +[5]:https://www.linux.com/files/images/killajpg +[6]:https://www.linux.com/files/images/killbjpg +[7]:https://www.linux.com/files/images/killcjpg +[8]:https://www.linux.com/files/images/stop-processesjpg From de8a3bba8d68bdb24c157e38ba0e16a52b77d03c Mon Sep 17 00:00:00 2001 From: hwlog Date: Tue, 23 May 2017 22:48:36 +0800 Subject: [PATCH 0211/1407] translated --- .../20170519 How to Kill a Process from the Command Line.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/tech/20170519 How to Kill a Process from the Command Line.md b/sources/tech/20170519 How to Kill a Process from the Command Line.md index 45bf3ffd0a..ce3169fc51 100644 --- a/sources/tech/20170519 How to Kill a Process from the Command Line.md +++ b/sources/tech/20170519 How to Kill a Process from the Command Line.md @@ -1,4 +1,4 @@ -How to Kill a Process from the Command Line +怎样在命令行杀死一个进程 ============================================================ ![stop processes](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/stop-processes.jpg?itok=vfNx8VRz "stop processes") From 9502b15931557df3be3f3ccab507b3b80788c22d Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 24 May 2017 08:53:47 +0800 Subject: [PATCH 0212/1407] translating --- ...ow a Custom Message to Users Before Linux Server Shutdown.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170515 Show a Custom Message to Users Before Linux Server Shutdown.md b/sources/tech/20170515 Show a Custom Message to Users Before Linux Server Shutdown.md index 690aac80b0..a16789617e 100644 --- a/sources/tech/20170515 Show a Custom Message to Users Before Linux Server Shutdown.md +++ b/sources/tech/20170515 Show a Custom Message to Users Before Linux Server Shutdown.md @@ -1,3 +1,5 @@ +translating---geekpi + Show a Custom Message to Users Before Linux Server Shutdown ============================================================ From f569746d4b24b044d36e94e1fb4dc435e1377302 Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 24 May 2017 09:17:10 +0800 Subject: [PATCH 0213/1407] translated --- ...e to Users Before Linux Server Shutdown.md | 81 ------------------- ...e to Users Before Linux Server Shutdown.md | 79 ++++++++++++++++++ 2 files changed, 79 insertions(+), 81 deletions(-) delete mode 100644 sources/tech/20170515 Show a Custom Message to Users Before Linux Server Shutdown.md create mode 100644 translated/tech/20170515 Show a Custom Message to Users Before Linux Server Shutdown.md diff --git a/sources/tech/20170515 Show a Custom Message to Users Before Linux Server Shutdown.md b/sources/tech/20170515 Show a Custom Message to Users Before Linux Server Shutdown.md deleted file mode 100644 index a16789617e..0000000000 --- a/sources/tech/20170515 Show a Custom Message to Users Before Linux Server Shutdown.md +++ /dev/null @@ -1,81 +0,0 @@ -translating---geekpi - -Show a Custom Message to Users Before Linux Server Shutdown -============================================================ - - -In a previous article, we explained the [difference between shutdown, poweroff, halt and reboot][3] Linux commands, where we uncovered what these mentioned commands actually do when you execute them with various options. - -This article will show you how to send a custom message to all system users before shutting down a Linux server. - -**Suggested Read:** [tuptime – Shows Historical and Statistical Running Time of Linux Systems][4] - -As a system administrator, before you can shut down a server, you may want to send system users a message alerting them that the system is going. By default, the shutdown command broadcasts a message to other system users as shown in the screenshot below: - -``` -# shutdown 13:25 -``` -Linux Shutdown Broadcast Message -``` -Shutdown scheduled for Fri 2017-05-12 13:25:00 EAT, use 'shutdown -c' to cancel. -Broadcast message for root@tecmint (Fri 2017-05-12 13:23:34 EAT): -The system is going down for power-off at Fri 2017-05-12 13:25:00 EAT! -``` - -To send a custom message to other system users before an in line shutdown, run the command below. In this example, the shutdown will happen after two minutes from the time of command execution: - -``` -# shutdown 2 The system is going down for required maintenance. Please save any important work you are doing now! -``` - [![Linux System Shutdown Message](https://www.tecmint.com/wp-content/uploads/2017/05/Linux-System-Shutdown-Message.png)][5] - -Linux System Shutdown Message - -Supposing you have certain critical system operations such as scheduled system backups or updates to be executed at a time the system would be down, you can cancel the shutdown using the `-c` switch as shown below and initiate it at a later time after such operations have been performed: - -``` -# shutdown -c -``` -Linux Shutdown Cancel Message -``` -Shutdown scheduled for Fri 2017-05-12 14:10:22 EAT, use 'shutdown -c' to cancel. -Broadcast message for root@tecmint (Fri 2017-05-14 :10:27 EAT): -The system shutdown has been cancelled at Fri 2017-05-12 14:11:27 EAT! -``` - -Additionally, learn how to [auto execute commands/scripts during reboot or startup][6] using simple and traditional methods in Linux. - -Don’t Miss: - -1. [Managing System Startup Process and Services (SysVinit, Systemd and Upstart)][1] - -2. [11 Cron Scheduling Task Examples in Linux][2] - -Now you know how to send custom messages to all other system users before a system shutdown. Are there any ideas you want to share relating to this topic? Use the comment form below to do that? - --------------------------------------------------------------------------------- - -作者简介: - -Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. - ------------------- - -via: https://www.tecmint.com/show-linux-server-shutdown-message/ - -作者:[Aaron Kili ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.tecmint.com/author/aaronkili/ -[1]:https://www.tecmint.com/linux-boot-process-and-manage-services/ -[2]:https://www.tecmint.com/11-cron-scheduling-task-examples-in-linux/ -[3]:https://www.tecmint.com/shutdown-poweroff-halt-and-reboot-commands-in-linux/ -[4]:https://www.tecmint.com/find-linux-uptime-shutdown-and-reboot-time-with-tuptime/ -[5]:https://www.tecmint.com/wp-content/uploads/2017/05/Linux-System-Shutdown-Message.png -[6]:https://www.tecmint.com/auto-execute-linux-scripts-during-reboot-or-startup/ -[7]:https://www.tecmint.com/author/aaronkili/ -[8]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ -[9]:https://www.tecmint.com/free-linux-shell-scripting-books/ diff --git a/translated/tech/20170515 Show a Custom Message to Users Before Linux Server Shutdown.md b/translated/tech/20170515 Show a Custom Message to Users Before Linux Server Shutdown.md new file mode 100644 index 0000000000..fc65f547e0 --- /dev/null +++ b/translated/tech/20170515 Show a Custom Message to Users Before Linux Server Shutdown.md @@ -0,0 +1,79 @@ +在 Linux 服务器关机前向用户显示一条自定义消息 +============================================================ + + +在先前的文章中,我们解释了 Linux 中[ shutdown、poweroff、halt、reboot 命令的不同之处][3],并揭示了在用不同的选项执行这些命令时它们实际做了什么。 + +本篇将会向你展示如何在系统关机时向所有的系统用户发送一条自定义的消息。 + +**建议阅读:**[tuptime - 显示 Linux 系统的历史和统计运行时间][4] + +作为一名系统管理员,在你关闭服务器之前,你也许想要发送一条消息来警告他们系统将要关闭。默认上,shutdown 命令会如下所示给其他系统用户广播这条信息: + +``` +# shutdown 13:25 +``` +Linux Shutdown Broadcast Message +``` +Shutdown scheduled for Fri 2017-05-12 13:25:00 EAT, use 'shutdown -c' to cancel. +Broadcast message for root@tecmint (Fri 2017-05-12 13:23:34 EAT): +The system is going down for power-off at Fri 2017-05-12 13:25:00 EAT! +``` + +要在 shutdown 那行发送一条自定义的消息给其他系统用户,运行下面的命令。在本例中,关闭会在命令执行后的两分钟之后发生。 + +``` +# shutdown 2 The system is going down for required maintenance. Please save any important work you are doing now! +``` + [![Linux System Shutdown Message](https://www.tecmint.com/wp-content/uploads/2017/05/Linux-System-Shutdown-Message.png)][5] + +Linux 系统关闭消息 + +假设你有一些关键的系统操作,如计划系统备份或更新会在系统关闭的时候进行,如下所示,你可以使用 `-c` 选项取消关机,并在执行玩这些操作后继续执行: + +``` +# shutdown -c +``` +Linux Shutdown Cancel Message +``` +Shutdown scheduled for Fri 2017-05-12 14:10:22 EAT, use 'shutdown -c' to cancel. +Broadcast message for root@tecmint (Fri 2017-05-14 :10:27 EAT): +The system shutdown has been cancelled at Fri 2017-05-12 14:11:27 EAT! +``` + +另外,学习如何在 Linux 中使用简单和传统的方法[在重启或者开机时自动执行命令/脚本][6]。 + +不要错过: + +1. [关系系统启动进程和服务(SysVinit、Systemd 和 Upstart)][1] + +2. [11 个 Linux 中 cron 计划任务示例][2] + +现在你知道了如何在系统关闭前向其他系统用户发送自定义消息了。你有其他关于这个主题想要分享的想法么?何不使用下面的评论栏? + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Kili 是一个 Linux 和 F.O.S.S 爱好者、Linux 系统管理员、网络开发人员,现在也是 TecMint 的内容创作者,他喜欢和电脑一起工作,坚信共享知识。 + +------------------ + +via: https://www.tecmint.com/show-linux-server-shutdown-message/ + +作者:[Aaron Kili ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://www.tecmint.com/linux-boot-process-and-manage-services/ +[2]:https://www.tecmint.com/11-cron-scheduling-task-examples-in-linux/ +[3]:https://www.tecmint.com/shutdown-poweroff-halt-and-reboot-commands-in-linux/ +[4]:https://www.tecmint.com/find-linux-uptime-shutdown-and-reboot-time-with-tuptime/ +[5]:https://www.tecmint.com/wp-content/uploads/2017/05/Linux-System-Shutdown-Message.png +[6]:https://www.tecmint.com/auto-execute-linux-scripts-during-reboot-or-startup/ +[7]:https://www.tecmint.com/author/aaronkili/ +[8]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[9]:https://www.tecmint.com/free-linux-shell-scripting-books/ From 1120cdc40fc342de24fbc76ece1e7514e9765384 Mon Sep 17 00:00:00 2001 From: Flynn Date: Wed, 24 May 2017 10:51:49 +0800 Subject: [PATCH 0214/1407] Translating by ucasFL --- .../tech/20170518 How to make Vim user-friendly with Cream.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170518 How to make Vim user-friendly with Cream.md b/sources/tech/20170518 How to make Vim user-friendly with Cream.md index 909294d537..fbf46a76d0 100644 --- a/sources/tech/20170518 How to make Vim user-friendly with Cream.md +++ b/sources/tech/20170518 How to make Vim user-friendly with Cream.md @@ -1,3 +1,4 @@ +ucasFL translating How to make Vim user-friendly with Cream ============================================================ From 1b3740a3b28db67eb54a310b4c567ee46584fc32 Mon Sep 17 00:00:00 2001 From: jasminepeng Date: Wed, 24 May 2017 17:19:41 +0800 Subject: [PATCH 0215/1407] =?UTF-8?q?=E6=A0=A1=E5=AF=B9=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 校对中 --- .../20170511 How to Delete HUGE 100-200GB Files in Linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md b/translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md index 1ac853080a..c99655a95e 100644 --- a/translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md +++ b/translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md @@ -66,7 +66,7 @@ via: https://www.tecmint.com/delete-huge-files-in-linux/ 作者:[Aaron Kili ][a] 译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) +校对:[jasminepeng](https://github.com/jasminepeng) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 987841774279a1301c9ba83e1583418885fc22ad Mon Sep 17 00:00:00 2001 From: ch-cn Date: Wed, 24 May 2017 17:28:25 +0800 Subject: [PATCH 0216/1407] translated --- ...to Password Protect a Vim File in Linux.md | 157 ------------------ ...to Password Protect a Vim File in Linux.md | 155 +++++++++++++++++ 2 files changed, 155 insertions(+), 157 deletions(-) delete mode 100644 sources/tech/20170509 How to Password Protect a Vim File in Linux.md create mode 100644 translated/tech/20170509 How to Password Protect a Vim File in Linux.md diff --git a/sources/tech/20170509 How to Password Protect a Vim File in Linux.md b/sources/tech/20170509 How to Password Protect a Vim File in Linux.md deleted file mode 100644 index 616d03b89b..0000000000 --- a/sources/tech/20170509 How to Password Protect a Vim File in Linux.md +++ /dev/null @@ -1,157 +0,0 @@ -How to Password Protect a Vim File in Linux -============================================================ -ch-cn translating - - Download Your Free eBooks NOW - [10 Free Linux eBooks for Administrators][16] | [4 Free Shell Scripting eBooks][17] - -[Vim][5] is a popular, feature-rich and highly-extensible [text editor for Linux][6], and one of its special features is support for encrypting text files using various crypto methods with a password. - -In this article, we will explain to you one of the simple Vim usage tricks; password protecting a file using Vim in Linux. We will show you how to secure a file at the time of its creation as well as after opening it for modification. - -**Suggested Read:** [10 Reasons Why You Should Use Vim Editor in Linux][7] - -To install the full version of Vim, simply run this command: - -``` -$ sudo apt install vim #Debian/Ubuntu systems -$ sudo yum install vim #RHEL/CentOS systems -$ sudo dnf install vim #Fedora 22+ -``` - -Read Also: [Vim 8.0 Is Released After 10 Years – Install on Linux][8] - -### How to Password Protect a Vim File in Linux - -Vim has a `-x` option which enables you to use encryption when creating files. Once you run the [vim command][9]below, you’ll be prompted for a crypt key: - -``` -$ vim -x file.txt -Warning: Using a weak encryption method; see :help 'cm' -Enter encryption key: ******* -Enter same key again: ******* -``` - -If the crypto key matches after entering it for the second time, you can proceed to modify the file. - - [![Vim File Password Protected](https://www.tecmint.com/wp-content/uploads/2017/05/Vim-File-Password-Protected-File.png)][10] - -Vim File Password Protected - -Once your done, press `[Esc]` and `:wq` to save and close the file. The next time you want to open it for editing, you’ll have to enter the crypto key like this: - -``` -$ vim file.txt -Need encryption key for "file.txt" -Warning: Using a weak encryption method; see :help 'cm' -Enter encryption key: ******* -``` - -In case you enter a wrong password (or no key), you’ll see some junk characters. - - [![Vim Content Encrypted](https://www.tecmint.com/wp-content/uploads/2017/05/Vim-Content-Encrypted.png)][11] - -Vim Content Encrypted - -#### Setting a Strong Encryption Method in Vim - -Note: There is a warning indicating that a weak encryption method has been used to protect the file. Next, we’ll see how to set a strong encryption method in Vim. - - [![Weak Encryption on Vim File](https://www.tecmint.com/wp-content/uploads/2017/05/Weak-Encryption-on-Vim-File.png)][12] - -Weak Encryption on Vim File - -To check the set of cryptmethod(cm), type (scroll down to view all available methods): - -``` -:help 'cm' -``` - -##### Sample Output - -``` - *'cryptmethod'* *'cm'* -'cryptmethod' 'cm' string (default "zip") -global or local to buffer |global-local| -{not in Vi} -Method used for encryption when the buffer is written to a file: -*pkzip* -zip PkZip compatible method. A weak kind of encryption. -Backwards compatible with Vim 7.2 and older. -*blowfish* -blowfish Blowfish method. Medium strong encryption but it has -an implementation flaw. Requires Vim 7.3 or later, -files can NOT be read by Vim 7.2 and older. This adds -a "seed" to the file, every time you write the file -options.txt [Help][RO] -``` - -You can set a new cryptomethod on a Vim file as shown below (we’ll use blowfish2 in this example): - -``` -:setlocal cm=blowfish2 -``` - -Then press `[Enter]` and `:wq` to save the file. - - [![Set Strong Encryption on Vim File](https://www.tecmint.com/wp-content/uploads/2017/05/Set-Strong-Encryption-on-Vim-File.png)][13] - -Set Strong Encryption on Vim File - -Now you should not see the warning message when you open the file again as shown below. - -``` -$ vim file.txt -Need encryption key for "file.txt" -Enter encryption key: ******* -``` - -You can also set a password after opening a Vim text file, use the command`:X` and set a crypto pass like shown above. - -Check out some of our useful articles on Vim editor. - -1. [Learn Useful Vim Editor Trips and Tricks in Linux][1] - -2. [8 Useful Vim Editor Tricks for Every Linux User][2] - -3. [spf13-vim – The Ultimate Distribution for Vim Editor][3] - -4. [How to Use Vim Editor as Bash IDE in Linux][4] - -That’s all! In this article, we explained how to password protect a file via the [Vim text editor in Linux][14]. - -Always remember to appropriately secure text files that could contain secret info such as usernames and passwords, financial account info and so on, using strong encryption and a password. Use the feedback section below to share any thoughts with us. - --------------------------------------------------------------------------------- - -作者简介: - -Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. - ------------------- - -via: https://www.tecmint.com/password-protect-vim-file-in-linux/ - -作者:[Aaron Kili ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.tecmint.com/author/aaronkili/ -[1]:https://www.tecmint.com/learn-vi-and-vim-editor-tips-and-tricks-in-linux/ -[2]:https://www.tecmint.com/how-to-use-vi-and-vim-editor-in-linux/ -[3]:https://www.tecmint.com/spf13-vim-offers-vim-plugins-vim-editor/ -[4]:https://www.tecmint.com/use-vim-as-bash-ide-using-bash-support-in-linux/ -[5]:https://www.tecmint.com/vi-editor-usage/ -[6]:https://www.tecmint.com/best-open-source-linux-text-editors/ -[7]:https://www.tecmint.com/reasons-to-learn-vi-vim-editor-in-linux/ -[8]:https://www.tecmint.com/vim-8-0-install-in-ubuntu-linux-systems/ -[9]:https://www.tecmint.com/linux-command-line-editors/ -[10]:https://www.tecmint.com/wp-content/uploads/2017/05/Vim-File-Password-Protected-File.png -[11]:https://www.tecmint.com/wp-content/uploads/2017/05/Vim-Content-Encrypted.png -[12]:https://www.tecmint.com/wp-content/uploads/2017/05/Weak-Encryption-on-Vim-File.png -[13]:https://www.tecmint.com/wp-content/uploads/2017/05/Set-Strong-Encryption-on-Vim-File.png -[14]:https://www.tecmint.com/vi-editor-usage/ -[15]:https://www.tecmint.com/author/aaronkili/ -[16]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ -[17]:https://www.tecmint.com/free-linux-shell-scripting-books/ diff --git a/translated/tech/20170509 How to Password Protect a Vim File in Linux.md b/translated/tech/20170509 How to Password Protect a Vim File in Linux.md new file mode 100644 index 0000000000..21ae3a5113 --- /dev/null +++ b/translated/tech/20170509 How to Password Protect a Vim File in Linux.md @@ -0,0 +1,155 @@ +怎样在 Linux 中对 Vim 文件进行密码保护 +============================================================ + + 现在下载你的免费电子书籍 - [给管理员的 10 本免费的 Linux 电子书籍][16] | [4 本免费的 Shell 脚本电子书籍][17] + +[Vim][5] 是一种流行的、功能丰富的和高度可扩展的 [Linux 文本编辑器][6],它的重要功能之一便是支持用各种带密码的加密方法来加密文本文件。 + +本文中,我们将向你介绍一种简单的 Vim 使用技巧;在 Linux 中使用 Vim 对文件进行密码保护。我们将向你展示如何让一个文件在它创建的时侯以及为了修改目的而被打开了之后获得安全防护。 + +**建议阅读:** [你应该在 Linux 中使用 Vim 编辑器的 10 个原因][7] + +要安装 Vim 完整版,只需运行这些命令: + +``` +$ sudo apt install vim #Debian/Ubuntu 系统 +$ sudo yum install vim #RHEL/CentOS 系统 +$ sudo dnf install vim #Fedora 22+ +``` +参阅: [十年后 Vim 8.0 发布了– 在 Linux 上安装][8] + +### 怎样在 Linux 中对 Vim 文件进行密码保护 + +Vim 有个 `-x` 选项,这个选项能让你在创建文件时用它来加密。一旦你运行下面的 [vim 命令][9],你会被提示输入一个密钥: + +``` +$ vim -x file.txt +警告:正在使用弱加密方法;参见 :help 'cm' +输入加密密钥:******* +再次输入相同密钥:******* +``` + +如果第二次输入的密钥无误,你就能进去修改此文件了。 + + [![Vim File Password Protected](https://www.tecmint.com/wp-content/uploads/2017/05/Vim-File-Password-Protected-File.png)][10] + +被密码保护的 Vim 文件 + +等你修改好之后,摁 `[Esc]` 和键入 `:wq` 来保存及关闭文件。下次你想打开它编辑一下,你就必须像这样去输入密钥: + +``` +$ vim file.txt +需要 "file.txt" 的加密密钥 +警告:正在使用弱加密方法;参见 :help 'cm' +输入密钥:******* +``` + +假设你输了一个错误的密码(或者没输密码),你会看到一些垃圾字符。 + + [![Vim Content Encrypted](https://www.tecmint.com/wp-content/uploads/2017/05/Vim-Content-Encrypted.png)][11] + +Vim 中的加密内容 + +#### 在 Vim 中设置一种强加密方法 + +注意:有条告警信息暗示一种弱加密方法已被用于保护文件。那么接下来,我们来看看怎么在 Vim 中设置一种强加密方法。 + + [![Weak Encryption on Vim File](https://www.tecmint.com/wp-content/uploads/2017/05/Weak-Encryption-on-Vim-File.png)][12] + +Vim 中文件弱加密 + +为了查看 crytmethod(cm) 集,键入(向下滚动可查看所有可用的方法): + +``` +:help 'cm' +``` + +##### 输出样例 + +``` + *'cryptmethod'* *'cm'* +'cryptmethod' 'cm' string (默认 "zip") +global or local to buffer |global-local| +{not in Vi} +当缓冲区写进文件中所用的方法: +*pkzip* +zip PkZip 兼容法。 一种弱加密方法。 +与 Vim 7.2 及更老版本后向兼容。 +*blowfish* +blowfish 河豚法。 中级强度加密方法但有实现上 +的瑕疵。需要 Vim 7.3 及以上版本,用它加密的文件不 +能被 Vim 7.2 及更老版本读取。它会添加一个 “种子”, +每次你对这个文件写操作时…… +options.txt [帮助][只读] +``` + +你可以像如下所示的那样给一个 Vim 文件设置个新的 cryptomethod(加密方法)(本例中我们用 blowfish2 加密方法) + +``` +:setlocal cm=blowfish2 +``` + +然后键入 `[Enter]` 和 `:wq` 保存下文件。 + + [![Set Strong Encryption on Vim File](https://www.tecmint.com/wp-content/uploads/2017/05/Set-Strong-Encryption-on-Vim-File.png)][13] + +对 Vim 文件设置强加密 + +现在你再打开下示的文件时应该就看不到那条警告信息了。 + +``` +$ vim file.txt +需要 "file.txt" 的加密密钥 +输入加密密钥:******* +``` + +你也可以在打开 Vim 文件之后来设置密码,用 `:X` 命令就能像上面所示的那样去设置一个密码关卡。 + +可以看看我们其他的关于 Vim 编辑器的有用的文章。 + +1. [在 Linux 中学习有用的 Vim 编辑器的旅行与技巧][1] + +2. [给每个 Linux 用户的 8 种有用的 Vim 编辑器技巧][2] + +3. [spf13-vim – Vim 编辑器的顶级发行版][3] + +4. [怎样在 Linux 种把 Vim 编辑当作 Bash IDE 来用][4] + +本文到这里就结束了!文章中我们介绍了怎么通过 Linux 下的 Vim 文本编辑器来给一个文件做加密防护。 + +永远记住要用强加密方式及密码来适当的保护那些可能包含了诸如用户名及密码、财务账户信息等等机密信息的文本文件。 + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Kili 是一个 Linux 和 F.O.S.S(Free and Open-Source Software,自由及开放源代码软件)爱好者,未来的 Linux 系统管理员、web 开发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,且崇尚分享知识。 + +------------------ + +via: https://www.tecmint.com/password-protect-vim-file-in-linux/ + +作者:[Aaron Kili ][a] +译者:[ch-cn](https://github.com/ch-cn) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://www.tecmint.com/learn-vi-and-vim-editor-tips-and-tricks-in-linux/ +[2]:https://www.tecmint.com/how-to-use-vi-and-vim-editor-in-linux/ +[3]:https://www.tecmint.com/spf13-vim-offers-vim-plugins-vim-editor/ +[4]:https://www.tecmint.com/use-vim-as-bash-ide-using-bash-support-in-linux/ +[5]:https://www.tecmint.com/vi-editor-usage/ +[6]:https://www.tecmint.com/best-open-source-linux-text-editors/ +[7]:https://www.tecmint.com/reasons-to-learn-vi-vim-editor-in-linux/ +[8]:https://www.tecmint.com/vim-8-0-install-in-ubuntu-linux-systems/ +[9]:https://www.tecmint.com/linux-command-line-editors/ +[10]:https://www.tecmint.com/wp-content/uploads/2017/05/Vim-File-Password-Protected-File.png +[11]:https://www.tecmint.com/wp-content/uploads/2017/05/Vim-Content-Encrypted.png +[12]:https://www.tecmint.com/wp-content/uploads/2017/05/Weak-Encryption-on-Vim-File.png +[13]:https://www.tecmint.com/wp-content/uploads/2017/05/Set-Strong-Encryption-on-Vim-File.png +[14]:https://www.tecmint.com/vi-editor-usage/ +[15]:https://www.tecmint.com/author/aaronkili/ +[16]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[17]:https://www.tecmint.com/free-linux-shell-scripting-books/ From 9ba77d3ec3c489342be4cc89a63cbf32d785d4c9 Mon Sep 17 00:00:00 2001 From: jasminepeng Date: Wed, 24 May 2017 17:31:50 +0800 Subject: [PATCH 0217/1407] =?UTF-8?q?=E6=A0=A1=E5=AF=B9=E5=AE=8C=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 校对完毕,谢谢。 --- ...0511 How to Delete HUGE 100-200GB Files in Linux.md | 10 +++------- 1 file changed, 3 insertions(+), 7 deletions(-) diff --git a/translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md b/translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md index c99655a95e..545688500f 100644 --- a/translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md +++ b/translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md @@ -1,19 +1,15 @@ 如何在 Linux 中删除大(100-200GB)文件 ============================================================ -作者:[Aaron Kili][11] | 发布日期: May 11, 2017 | 最后更新:May 11, 2017 - -立即下载你的免费电子书 - [10 本为管理员的免费 Linux 电子书][12] | [4 本免费 Shell 脚本电子书][13] - 通常,要[在 Linux 终端删除一个文件][1],我们使用 rm 命令(删除文件)、shred 命令(安全删除文件)、wipe 命令(安全擦除文件)或者 secure-deletion 工具包(一个[安全文件删除工具][2]集合)。 -我们可以使用下面任意的工具来处理相对较小的文件。如果我们想要删除大的文件/文件夹,比如大概 100-200GB。这个方法在删除文件(I/O 调度)所花费的时间以及 RAM 占用量方面看起来可能并不容易。 +我们可以使用上面任意的工具来处理相对较小的文件。如果我们想要删除大的文件/文件夹,比如大概 100-200GB。这个方法在删除文件(I/O 调度)所花费的时间以及 RAM 占用量方面看起来可能并不容易。 在本教程中,我们会解释如何在 Linux 中有效率并可靠地删除大文件/文件夹。 -**建议阅读:** [5 个在 Linux 中清空或者删除大文件的方法][3] +**建议阅读:** [5 个在 Linux 中清空或者删除大文件内容的方法][3] -主要的目标是使用一种不会在删除大文件时拖慢系统的技术,并有合理的 I/O 占用。我么可以用 ionice 命令实现这个目标。 +主要的目标是使用一种不会在删除大文件时拖慢系统的技术,并有合理的 I/O 占用。我们可以用 **ionice 命令**实现这个目标。 ### 在 Linux 中使用 ionice 命令删除大(200GB)文件 From 559dde6cc1850f351608d1959945d4850ade559a Mon Sep 17 00:00:00 2001 From: jasminepeng Date: Wed, 24 May 2017 17:34:42 +0800 Subject: [PATCH 0218/1407] =?UTF-8?q?=E6=A0=A1=E5=AF=B9=E5=AE=8C=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 校对完毕 --- .../20170511 How to Delete HUGE 100-200GB Files in Linux.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md b/translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md index 545688500f..d6b7d2ed09 100644 --- a/translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md +++ b/translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md @@ -15,7 +15,7 @@ ionice 是一个可以为另一个程序设置或获取 I/O 调度级别和优先级的有用程序。如果没有给出参数或者只有 `-p`,那么 ionice 将会查询该进程的当前的 I/O 调度级别以及优先级。 -如果我们给出命令名称,如 rm 命令,它将使用给定的参数运行此命令。要指定要获取或设置调度参数的[进程的进程 ID],运行这个: +如果我们给出命令名称,如 rm 命令,它将使用给定的参数运行此命令。要指定要获取或设置调度参数的[进程的进程 ID][4],运行这个: ``` # ionice -p PID From 9954a42082ade80bf0b31259503dbf3e47558919 Mon Sep 17 00:00:00 2001 From: Flynn Date: Wed, 24 May 2017 20:46:19 +0800 Subject: [PATCH 0219/1407] Translated --- ...ow to make Vim user-friendly with Cream.md | 76 ------------------- ...ow to make Vim user-friendly with Cream.md | 72 ++++++++++++++++++ 2 files changed, 72 insertions(+), 76 deletions(-) delete mode 100644 sources/tech/20170518 How to make Vim user-friendly with Cream.md create mode 100644 translated/tech/20170518 How to make Vim user-friendly with Cream.md diff --git a/sources/tech/20170518 How to make Vim user-friendly with Cream.md b/sources/tech/20170518 How to make Vim user-friendly with Cream.md deleted file mode 100644 index fbf46a76d0..0000000000 --- a/sources/tech/20170518 How to make Vim user-friendly with Cream.md +++ /dev/null @@ -1,76 +0,0 @@ -ucasFL translating -How to make Vim user-friendly with Cream -============================================================ - -### The Cream add-on makes the Vim text editor easier to use by putting a more familiar face on its functionality. - - - -![How to make Vim user-friendly with Cream](https://opensource.com/sites/default/files/styles/image-full-size/public/images/education/osdc_edu_rightmix_520.png?itok=SCsog_qv "How to make Vim user-friendly with Cream") -Image by :  - -opensource.com - -About 10 years ago, I split my text editing time between Emacs and Vim. That said, I was and definitely still am an Emacs guy. But while Emacs has always had an edge in my affections, I know that Vim is no slouch. - -So do other people—even those who, like me, are all thumbs technically. Over the years, I've talked to a few new Linux users who wanted to use Vim but were a bit disappointed that it doesn't act like the text editors they've used on other operating systems. - -That disappointment changed to satisfaction when I introduced them to Cream, an add-on for Vim that makes it easier to use. Cream turned each of them into diehard Vim users. - -Let's take a look at Cream and how it makes Vim easier to use. - -### Getting going with Cream - -Before you can install Cream, you'll need Vim and GVim GUI components installed on your computer. I find the easiest way to do that is to use your Linux distribution's package manager. - -Once you have Vim installed, grab [the installer][2] for Cream or, again, turn to your distribution's package manager. - -Once Cream is installed, you can fire it up by selecting the entry from the application menu (for example, **Applications > Cream**) or by typing **cream** into your program launcher. - -![Cream's main window](https://opensource.com/sites/default/files/resize/cream-main-window-520x336.png "Cream&#039;s main window") - -### Using Cream - -If you've used GVim before, you'll notice that Cream doesn't change the editor's look and feel too much. The biggest cosmetic differences are Cream's menu bar and toolbar, which replace the stock GVim menu bar and toolbar with ones that look and group functions like their counterparts in other applications. - -Cream's menus hide a lot of the more techie options—like the ability to specify a compiler and the **Make** command—from the user. As you get more familiar with Vim by using Cream, however, you can make more of those features more easily accessible by selecting an option from the **Settings > Preferences > Behavior** menu. With those options, you could (if you want to) wind up with an editor that behaves as a hybrid of Cream and traditional Vim. - -Cream isn't only driven by its menus. While the editor's functions are only a click or two away, you can also use common keyboard shortcuts to perform actions—for example, **CTRL-O** (to open a file) or **CTRL-C** (to copy text). There's no need to shift between modes or remember Vim's somewhat cryptic commands. - -With Cream running, get to work by opening a file or creating a new one. Then start typing. A couple or three of the people I've introduced to Cream have said that while it retains much of the classic styling of Vim, Cream feels more comfortable to use. - -![Cream add-on for VIM in action](https://opensource.com/sites/default/files/cream-in-action.png "Cream add-on for VIM in action") - -That's not to say Cream dumbs down or waters down Vim. Far from it. You still retain all of Vim's features, along with [a long list of others][3]. Some of the features of Cream that I find useful include: - -* A tabbed interface - -* Syntax highlighting (especially when working with Markdown, LaTeX, and HTML) - -* Auto correction of spelling mistakes - -* Word count - -* Built-in file explorer - -Cream also comes with a number of add-ons that give the editor some additional features. Those features include the ability to encrypt text and to clean up the body of emails, and there's even a typing tutor. To be honest, I haven't found any of the add-ons to be all that useful. Your mileage might vary, though. - -I've heard a few Vi/Vim purists pooh-pooh Cream for "dumbing down _"_  (their words) the editor. Let's be honest: Cream isn't for them. It's for someone who wants to quickly get up and running with Vim while retaining the look and feel of the editors they're used to. In that way, Cream succeeds admirably. It makes Vim a lot more accessible and usable to a wider range of people. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/17/5/stir-bit-cream-make-vim-friendlier - -作者:[ Scott Nesbitt ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/scottnesbitt -[1]:https://opensource.com/article/17/5/stir-bit-cream-make-vim-friendlier?rate=sPQVOnwWoNwyyQX4wV2SZ_7Ly_KXd_Gu9pBu16LRyhU -[2]:http://cream.sourceforge.net/download.html -[3]:http://cream.sourceforge.net/featurelist.html -[4]:https://opensource.com/user/14925/feed -[5]:https://opensource.com/article/17/5/stir-bit-cream-make-vim-friendlier#comments -[6]:https://opensource.com/users/scottnesbitt diff --git a/translated/tech/20170518 How to make Vim user-friendly with Cream.md b/translated/tech/20170518 How to make Vim user-friendly with Cream.md new file mode 100644 index 0000000000..2abb26e158 --- /dev/null +++ b/translated/tech/20170518 How to make Vim user-friendly with Cream.md @@ -0,0 +1,72 @@ +如何使用 Cream 提高 Vim 的用户友好性 +============================================================ + +### Cream 附加包通过把一个更加熟悉的"面孔"置于 Vim 文本编辑器之上,同时保留 Vim 的功能,使其更加容易使用 + + + +![How to make Vim user-friendly with Cream](https://opensource.com/sites/default/files/styles/image-full-size/public/images/education/osdc_edu_rightmix_520.png?itok=SCsog_qv "How to make Vim user-friendly with Cream") +图片来自 :  + +opensource.com + +大约 10 年前,我既使用 Emacs 进行文本编辑,也使用 Vim 进行文本编辑。说到底,我的确是一个热衷于 Emacs 的家伙。尽管 Emacs 在我的心里占据了很重要的地位,但我知道, Vim 也不赖。 + +一些人,或者像我一样的人,在技术方面可能都会有些笨手笨脚的。多年来,我已经和很多下面这样的 Linux 新手交谈过,他们想使用 Vim,但是却失望的发现, Vim 编辑器和他们在其它操作系统上使用过的编辑器似乎不一样。 + +但是,当我把 Cream 介绍给他们以后,他们的失望就变成了满意。Cream 是 Vim 的一个附加包,它使得 Vim 更加容易使用。Cream 让这些 Linux 新手变成了 Vim 的坚决拥护者和忠心用户。 + +让我们来看一看 Cream 是什么以及它是如何让 Vim 变得更加容易使用的。 + +### Cream 安装 + +在安装 Cream 之前,你需要先在你的电脑上安装好 Vim 和 GVim 的 GUI 组件。我发现最容易完成这件事的方法是使用 Linux 版本的包管理器。 + +安装好 Vim 以后,便可[下载 Cream 的安装程序][2],或者你也可以再次使用 Linux 发行版的包管理器进行安装。 + +安装好 Cream 以后,你可以通过从应用菜单选择输入(比如,**Applications**->**Cream**)或者在程序启动器中输入 **Cream**,从而启动 Cream 。 + +![Cream's main window](https://opensource.com/sites/default/files/resize/cream-main-window-520x336.png "Cream&#039;s main window") + +### Cream 使用 + +如果你之前已经使用过 Gvim,那么你会注意到, Cream 几乎没改变编辑器的外观和感觉。最大的不同是 Cream 的菜单栏和工具栏,它们取代了 Gvim 陈旧的菜单栏和工具栏,新的菜单栏和工具栏的外观和群组功能看起来和其它编辑器的一样。 + +Cream 的菜单栏隐藏了更多的技术选项,比如指定一个编译器的能力,以及来自用户的 `make` 命令的能力。当你通过使用 Cream 更加熟悉 Vim 以后,你只需要从 `Setting->Preferences->Behavior` 选择选项,就可以更容易的访问这些特性。有了这些选项,你可以(如果你想)体验到一个包含了 Cream 和传统 Vim 二者优点的强大编辑器。 + +Cream 并不是仅由菜单驱动。尽管编辑器的功能仅有单击或双击两种方式,但是你也可以使用常见的键盘快捷键来执行操作,比如 `CTRL-O`(打开一个文件),`CTRL-C`(复制文本)。你不需要在几种模式之间切换,也不需要记住一些很难记住的命令。 + +Cream 开始运行以后,打开一个文件,或者新建一个文件,然后就可以开始输入了。几个我向他们介绍过 Cream 的人说,虽然 Cream 保留了 Vim 的许多典型风格,但是 Cream 使用起来更加舒服。 + +![Cream add-on for VIM in action](https://opensource.com/sites/default/files/cream-in-action.png "Cream add-on for VIM in action") + +并不是说 Cream 是 Vim 的简化版,或者说 Cream “离” Vim 很远。事实上, Cream 保留了 Vim 的全部特性,同时,它还有一系列其他有用的特性。我发现的 Cream 的一些有用的特性包括: + +* 一个标签式界面 +* 语法高亮(特别是针对 Markdown、LaTeX 和 HTML) +* 自动修正拼写错误 +* 字数统计 +* 内建文件浏览器 + + +Cream 也有许多附加包,可以给编辑器增加一些新的特性。这些特性包括文本加密、清理电子邮件内容,甚至还有一个使用教程。老实说,我还没有发现哪一个附加包是真正有用的,不过你的里程可能会有所不同。 + +我曾听过一些 Vi/Vim 的狂热分子谴责 Cream “简化”(它们的话)了 Vi/Vim 编辑器的功能。的确,Cream 并不是为他们设计的。它是为那些想快速使用 Vim ,同时保留他们曾经使用过的编辑器的外观和感觉的人准备的。在这种情况下, Cream 是值得赞赏的,它使得 Vim 更加容易使用,更加广泛的被人们使用。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/17/5/stir-bit-cream-make-vim-friendlier + +作者:[ Scott Nesbitt][a] +译者:[ucasFL](https://github.com/ucasFL) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/scottnesbitt +[1]:https://opensource.com/article/17/5/stir-bit-cream-make-vim-friendlier?rate=sPQVOnwWoNwyyQX4wV2SZ_7Ly_KXd_Gu9pBu16LRyhU +[2]:http://cream.sourceforge.net/download.html +[3]:http://cream.sourceforge.net/featurelist.html +[4]:https://opensource.com/user/14925/feed +[5]:https://opensource.com/article/17/5/stir-bit-cream-make-vim-friendlier#comments +[6]:https://opensource.com/users/scottnesbitt From 30a19384f0fda04c8502673045e3616172917d29 Mon Sep 17 00:00:00 2001 From: Flynn Date: Wed, 24 May 2017 21:06:26 +0800 Subject: [PATCH 0220/1407] Translating by ucasFL --- ... A Vim Plugin to Develop Python Applications in Vim Editor.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170426 Python-mode – A Vim Plugin to Develop Python Applications in Vim Editor.md b/sources/tech/20170426 Python-mode – A Vim Plugin to Develop Python Applications in Vim Editor.md index a9e18ddbbc..56df13f461 100644 --- a/sources/tech/20170426 Python-mode – A Vim Plugin to Develop Python Applications in Vim Editor.md +++ b/sources/tech/20170426 Python-mode – A Vim Plugin to Develop Python Applications in Vim Editor.md @@ -1,3 +1,5 @@ +ucasFL translating + Python-mode – A Vim Plugin to Develop Python Applications in Vim Editor ============================================================ From 1e7eac0d6285be03cb44c14f81aec144d22e85d3 Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 25 May 2017 09:00:16 +0800 Subject: [PATCH 0221/1407] translating --- ...Shows a Color-coded Graph of Linux Load Average in Terminal.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170506 ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal.md b/sources/tech/20170506 ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal.md index 341deadae7..521ae2ec64 100644 --- a/sources/tech/20170506 ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal.md +++ b/sources/tech/20170506 ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal.md @@ -1,3 +1,5 @@ +translating---geekpi + ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal ============================================================ From add92f3734c6b72569784f6d9096830e1fb2e115 Mon Sep 17 00:00:00 2001 From: jasminepeng Date: Thu, 25 May 2017 09:12:24 +0800 Subject: [PATCH 0222/1407] =?UTF-8?q?=E6=A0=A1=E5=AF=B9=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 校对中 --- .../tech/20170518 How to make Vim user-friendly with Cream.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translated/tech/20170518 How to make Vim user-friendly with Cream.md b/translated/tech/20170518 How to make Vim user-friendly with Cream.md index 2abb26e158..49fdaf20f8 100644 --- a/translated/tech/20170518 How to make Vim user-friendly with Cream.md +++ b/translated/tech/20170518 How to make Vim user-friendly with Cream.md @@ -59,7 +59,7 @@ via: https://opensource.com/article/17/5/stir-bit-cream-make-vim-friendlier 作者:[ Scott Nesbitt][a] 译者:[ucasFL](https://github.com/ucasFL) -校对:[校对者ID](https://github.com/校对者ID) +校对:[jasminepeng](https://github.com/jasminepeng) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 42f5f2cfb0b7b4b1bd308f84fbef59a48b26d845 Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 25 May 2017 09:35:29 +0800 Subject: [PATCH 0223/1407] translated --- ...d Graph of Linux Load Average in Terminal.md | 113 ------------------ ...d Graph of Linux Load Average in Terminal.md | 109 +++++++++++++++++ 2 files changed, 109 insertions(+), 113 deletions(-) delete mode 100644 sources/tech/20170506 ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal.md create mode 100644 translated/tech/20170506 ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal.md diff --git a/sources/tech/20170506 ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal.md b/sources/tech/20170506 ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal.md deleted file mode 100644 index 521ae2ec64..0000000000 --- a/sources/tech/20170506 ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal.md +++ /dev/null @@ -1,113 +0,0 @@ -translating---geekpi - -ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal -============================================================ - - Download Your Free eBooks NOW - [10 Free Linux eBooks for Administrators][12] | [4 Free Shell Scripting eBooks][13] - -ttyload is a lightweight utility which is intended to offer a color-coded graph of load averages over time on Linux and other Unix-like systems. It enables a graphical tracking of system load average in a terminal (“tty“). - -It is known to run on systems such as Linux, IRIX, Solaris, FreeBSD, MacOS X (Darwin) and Isilon OneFS. It is designed to be easy to port to other platforms, but this comes with some hard work. - -Some of its notable features are: it uses fairly standard, but hard-coded, ANSI escape sequences for screen manipulation and colorization. And also comes with (but doesn’t install, or even build by default) a relatively self-contained load bomb, if you want to view how things work on an otherwise unloaded system. - -**Suggested Read:** [GoTTY – Share Your Linux Terminal (TTY) as a Web Application][1] - -In this article, we will show you how to install and use ttyload in Linux to view a color-coded graph of your system load average in a terminal. - -### How to Install ttyload in Linux Systems - -On Debian/Ubuntu based distributions, you can install ttyload from the default system respositores by typing the following [apt-get command][2]. - -``` -$ sudo apt-get install ttyload -``` - -On Other Linux distributions you can install ttyload from the source as shown. - -``` -$ git clone https://github.com/lindes/ttyload.git -$ cd ttyload -$ make -$ ./ttyload -$ sudo make install -``` - -Once installed, you can start it by typing the following command. - -``` -$ ttyload -``` - [![ttyload - Graphical View of Linux Load Average](https://www.tecmint.com/wp-content/uploads/2017/05/ttyload-Graphical-View-of-Linux-Load-Average-.png)][3] - -ttyload – Graphical View of Linux Load Average - -Note: To close the program simply press `[Ctrl+C]` keys. - -You can also define the number of seconds in the interval between refreshes. Default value is 4, and the minimum is 1. - -``` -$ ttyload -i 5 -$ ttyload -i 1 -``` - -To run it in a monochrome mode which turns off ANSI escapes, use the `-m` as follows. - -``` -$ ttyload -m -``` - [![ttyload - Monochrome Mode](https://www.tecmint.com/wp-content/uploads/2017/05/ttyload-monochrome-mode.png)][4] - -ttyload – Monochrome Mode - -To get the ttyload usage info and help, type. - -``` -$ ttyload -h -``` - -Below are some of its important features yet to be added: - -* Support for arbitrary sizing. - -* Make an X front end using the same basic engine, to have “3xload”. - -* Logging-oriented mode. - -For more information, check out the ttyload Homepage: [http://www.daveltd.com/src/util/ttyload/][5] - -Thats all for now! In this article, we showed you how to install and use ttyload in Linux. Write back to us via the comment section below. - - --------------------------------------------------------------------------------- - -作者简介: - -Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. - - - -------------------- - -via: https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/ - -作者:[Aaron Kili ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.tecmint.com/author/aaronkili/ -[1]:https://www.tecmint.com/gotty-share-linux-terminal-in-web-browser/ -[2]:https://www.tecmint.com/useful-basic-commands-of-apt-get-and-apt-cache-for-package-management/ -[3]:https://www.tecmint.com/wp-content/uploads/2017/05/ttyload-Graphical-View-of-Linux-Load-Average-.png -[4]:https://www.tecmint.com/wp-content/uploads/2017/05/ttyload-monochrome-mode.png -[5]:http://www.daveltd.com/src/util/ttyload/ -[6]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/# -[7]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/# -[8]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/# -[9]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/# -[10]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/#comments -[11]:https://www.tecmint.com/author/aaronkili/ -[12]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ -[13]:https://www.tecmint.com/free-linux-shell-scripting-books/ diff --git a/translated/tech/20170506 ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal.md b/translated/tech/20170506 ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal.md new file mode 100644 index 0000000000..957ddcf44d --- /dev/null +++ b/translated/tech/20170506 ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal.md @@ -0,0 +1,109 @@ +ttyload - 在终端中用彩色显示 Linux 的平均负载 +============================================================ + +立即下载你的免费电子书 - [10 本给管理员的免费 Linux 电子书][12] | [4 本免费的 Shell 脚本电子书][13] + +ttyload 是一个轻量级的实用程序,它为 Linux 和其他类 Unix 系统上提供随着时间变化的彩色平均负载。它实现了在终端中图形跟踪系统的平均负载(“tty”)。 + +它已知可以在诸如 Linux、IRIX、Solaris、FreeBSD、MacOS X (Darwin) 和 Isilon OneFS 等系统上运行。它被设计为可以容易地移植到其他平台,但这也带来了一些艰苦的工作。 + +它的一些值得注意功能是:它使用相当标准但硬编码的 ANSI 转义序列进行屏幕操作和着色。如果你想要在一个没有负载的系统中查看工作的情况,也可以使用(默认不会安装,甚至不会构建)一个相对独立的负载炸弹。 + +**建议阅读:**[GoTTY - 将你的 Linux 终端(TTY)作为 Web 程序共享][1] + +在本篇中,我们会向你展示如何在 Linux 安装及使用 ttyload,以在终端中用彩色图形查看系统的平均负载。 + +### 如何在 Linux 中安装 ttyload + +在基于 Debian/Ubuntu 的发行版中,你可以输入下面的[ apt 命令][2]来从默认的系统仓库中安装 ttyload。 + +``` +$ sudo apt-get install ttyload +``` + +在其他发型版中,你可以如下从 ttyload 的源码安装。 + +``` +$ git clone https://github.com/lindes/ttyload.git +$ cd ttyload +$ make +$ ./ttyload +$ sudo make install +``` + +安装完成后,你可以输入下面的命令启动。 + +``` +$ ttyload +``` + [![ttyload - Graphical View of Linux Load Average](https://www.tecmint.com/wp-content/uploads/2017/05/ttyload-Graphical-View-of-Linux-Load-Average-.png)][3] + +ttyload - 图形浏览 Linux 的平均负载 + +注意:要关闭程序,只需按下 `[Ctrl+C]` 键。 + +你也可以定义两次刷新之间间隔的秒数。默认是 4 秒,最小是 1 秒。 + +``` +$ ttyload -i 5 +$ ttyload -i 1 +``` + +要以单色模式运行,即它会关闭 ANSI 转义,如下使用 `-m`: + +``` +$ ttyload -m +``` + [![ttyload - Monochrome Mode](https://www.tecmint.com/wp-content/uploads/2017/05/ttyload-monochrome-mode.png)][4] + +ttyload – 单色模式 + +要获取 ttyload 的使用信息以及帮助,输入: + +``` +$ ttyload -h +``` + +下面是一些尚未添加的重要功能: + +* 支持任意大小调整。 + +* 使用相同的基本引擎制作 X 前端,具有 “3xload”。 + +* 面向日志的模式。 + +要获得更多信息,访问 ttyload 的主页:[http://www.daveltd.com/src/util/ttyload/][5] + +就是这样了!在本文中,我们向你展示了如何在 Linux 中安装及使用 ttyload。通过下面的评论栏给我们回馈。 + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Kili 是一个 Linux 和 F.O.S.S 的爱好者,即将推出的 Linux SysAdmin 网络开发人员,目前也是 TecMint 的内容创作者,他喜欢和电脑一起工作,并且坚信共享知识。 + + +------------------- + +via: https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/ + +作者:[Aaron Kili ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://www.tecmint.com/gotty-share-linux-terminal-in-web-browser/ +[2]:https://www.tecmint.com/useful-basic-commands-of-apt-get-and-apt-cache-for-package-management/ +[3]:https://www.tecmint.com/wp-content/uploads/2017/05/ttyload-Graphical-View-of-Linux-Load-Average-.png +[4]:https://www.tecmint.com/wp-content/uploads/2017/05/ttyload-monochrome-mode.png +[5]:http://www.daveltd.com/src/util/ttyload/ +[6]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/# +[7]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/# +[8]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/# +[9]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/# +[10]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/#comments +[11]:https://www.tecmint.com/author/aaronkili/ +[12]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[13]:https://www.tecmint.com/free-linux-shell-scripting-books/ From 2bbf9558b62b198658daaa54e2c7624a213b362d Mon Sep 17 00:00:00 2001 From: zhousiyu325 Date: Thu, 25 May 2017 10:53:22 +0800 Subject: [PATCH 0224/1407] translated 20170518 Maintaining a Git Repository.md --- .../20170518 Maintaining a Git Repository.md | 246 ------------------ .../20170518 Maintaining a Git Repository.md | 227 ++++++++++++++++ 2 files changed, 227 insertions(+), 246 deletions(-) delete mode 100644 sources/tech/20170518 Maintaining a Git Repository.md create mode 100644 translated/tech/20170518 Maintaining a Git Repository.md diff --git a/sources/tech/20170518 Maintaining a Git Repository.md b/sources/tech/20170518 Maintaining a Git Repository.md deleted file mode 100644 index 5cb0fc1c00..0000000000 --- a/sources/tech/20170518 Maintaining a Git Repository.md +++ /dev/null @@ -1,246 +0,0 @@ -翻译中 zhousiyu325 - -Maintaining a Git Repository -============================================================ - -Maintenance of your Git repository typically involves reducing a repository's size.  If you imported from another version control system, you may need to clean up unnecessary files after the import.  This page focuses on removing large files from a Git repo and contains the following topics: - -* [Understanding file removal from Git history][1] - -* [Using the BFG to rewrite history][2] - -* [Alternatively, using git filter-branch to rewrite history][3] - -* [Garbage collecting dead data][4] - -Be very careful... - -The procedure and tools on this page use advanced techniques that involve destructive operations.  Make sure you read carefully and **backup your repository** before starting. The easiest way to create a backup is to clone your repository using the [--mirror][5] flag, and zip the whole clone. With the backup, if you accidentally corrupt a key element of your repo during maintenance, you can recover. - -Keep in mind that maintenance can be disruptive to repository users. It is a good idea to communicate repository maintenance with your team or repository followers. Make sure everyone has checked in their code and have agreed to cease development during maintenance. - -### Understanding file removal from Git history - -Recall that cloning a repository clones the entire history — including every version of every source code file.  If a user commits a huge file, such as a JAR, every clone thereafter includes this file. Even if a user ends up removing the file from the project with a subsequent commit, the file still exists in the repository history.  To remove this file from your repository you must: - -* remove the file from your project's  _current_  file-tree - -* remove the file from repository history -  _rewriting_  Git history, deleting the file from **all** commits containing it - -* remove all [reflog][6] history that refers to the  _old_  commit history - -* repack the repository, garbage-collecting the now-unused data using [git gc][7] - -Git 'gc' (garbage collection) will remove all data from the repository that is not actually used, or in some way referenced, by any of your branches or tags. In order for that to be useful, we need to rewrite all Git repository history that contained the unwanted file, so that it no longer references it - git gc will then be able to discard the now-unused data. - -Rewriting repository history is a tricky business, because every commit depends on it's parents, so any small change will change the commit id of every subsequent commit. There are two automated tools for doing this: - -1. [the BFG Repo Cleaner][8] - fast, simple, easy to use. Require Java 6 or above. - -2. [git filter-branch][9] - powerful, tricky to configure, slow on big repositories. Part of the core Git suite. - -Remember, after you rewrite the history, whether you use the BFG or filter-branch, you will need to remove `reflog` entries that point to old history, and finally run the garbage collector to purge the old data.  - -### Using the BFG to rewrite history - -[The BFG][11] is specifically designed for removing unwanted data like big files or passwords from Git repos, so it has a simple flag that will remove any large historical (not-in-your-current-commit) files: '--strip-blobs-bigger-than' - - -``` -$ java -jar bfg.jar --strip-blobs-bigger-than 100M -``` - -Any files over 100MB in size (that aren't in your  _latest_  commit - because [your latest content is protected][12] by the BFG) will be removed from your Git repository's history. If you'd like to specify files by name, you can do that too: - - -``` -$ java -jar bfg.jar --delete-files *.mp4 -``` - -The BFG is [10-1000x][13] faster than git filter-branch, and generally much easier to use - check the full [usage instructions][14] and [examples][15] for more details. - -### Alternatively, using git filter-branch to rewrite history - -The `filter-branch` command rewrites a Git repo's revision history, just like the BFG, but the process is slower and more manual. If you don't know  _where_  the big file is, your first step will be to find it: - -### Manually reviewing large files in your repository - -[Antony Stubbs][16] has written a BASH script that does this very well. The script examines the contents of your packfile and lists out the large files.  Before you begin removing files, do the following to obtain and install this script: - -1. [Download the script][10] to your local system. - -2. Put it in a well known location accessible to your Git repository. - -3. Make the script an  executable: - - - ``` - $ chmod 777 git_find_big.sh - ``` - -4. Clone the repository to your local system. - -5. Change directory to your repository root. - -6. Run the Git garbage collector manually. - - - ``` - git gc --auto - ``` - -7. Find out the size of the .git folder. - - - ``` - $ du -hs .git/objects - ``` - - ``` - 45M .git/objects - ``` - - Note this size down for later reference. - -8. List the big files in your repo by running the `git_find_big.sh` script. - - - ``` - $ git_find_big.sh - ``` - - ``` - All sizes are in kB's. The pack column is the size of the object, compressed, inside the pack file. - ``` - - ``` - size pack SHA                                       location - ``` - - ``` - 592   580   e3117f48bc305dd1f5ae0df3419a0ce2d9617336 media/img/emojis.jar - ``` - - ``` - 550   169   b594a7f59ba7ba9daebb20447a87ea4357874f43 media/js/aui/aui-dependencies.jar - ``` - - ``` - 518   514   22f7f9a84905aaec019dae9ea1279a9450277130 media/images/screenshots/issue-tracker-wiki.jar - ``` - - ``` - 337   92   1fd8ac97c9fecf74ba6246eacef8288e89b4bff5 media/js/lib/bundle.js - ``` - - ``` - 240   239   e0c26d9959bd583e5ef32b6206fc8abe5fea8624 media/img/featuretour/heroshot.png - ``` - - The big files are all JAR files.  The pack size column is the most relevant.  The `aui-dependencies.jar` compacts to 169KB  but the `emojis.jar` compacts only to 580\.  The `emojis.jar` is a candidate for removal. - -### Running filter-branch - -You can pass this command a filter for rewriting the Git index.  For example, a filter can remove a file from every indexed commit.  The syntax for this is the following: - -`git filter-branch --index-filter 'git rm --cached --ignore-unmatch  _pathname_ ' commitHASH` - -The `--index-filter` option modifies a repo's staging (or index). The `--cached` option removes a file from the index not the disk.  This is faster as you don't have to checkout each revision before running the filter.  The -`-ignore-unmatch` option in `git rm` prevents the command from failing if the  _pathname_  it is trying to remove isn't there.  By specifying a commit HASH, you remove the `pathname` from every commit starting with the HASH on up.  To remove from the start, leave this off or you can specify HEAD.   - -If all your large files are in different branches, you'll need to delete each file by name. If all the files are within a single branch,  you can delete the branch itself. - -### Option 1: Delete files by name - -Use the following procedure to remove large files: - -1. Run the following command to remove the first large file you identified: - - - ``` - git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD - ``` - -2. Repeat Step 1 for each remaining large file. - -3. Update the references in your repository. `filter-branch` creates backups of your original refs namespaced under `refs/original/`. Once you're confident that you deleted the correct files, you can run the following command to delete the backed up refs, allowing the large objects to be garbage collected: - - - ``` - $ git for-each-ref --format="%(refname)" refs/original/ | xargs -n 1 git update-ref -d - ``` - -### Option 2: Delete just the branch - -If all your large files are on a single branch,  you can just delete the branch. Deleting the branch automatically removes all the references. - -1. Delete the branch. - - - ``` - $ git branch -D PROJ567bugfix - ``` - -2. Prune all of the reflog references from the branch on back. - - - ``` - $ git reflog expire --expire=now PROJ567bugfix - ``` - -### Garbage collecting dead data - -1. Prune all of the reflog references from now on back (unless you're explicitly only operating on one branch). - - - ``` - $ git reflog expire --expire=now --all - ``` - -2. Repack the repository by running the garbage collector and pruning old objects. - - - ``` - $ git gc --prune=now - ``` - -3. Push all your changes back to the Bitbucket repository. - - - ``` - $ git push --all --force - ``` - -4. Make sure all your tags are current too: - - - ``` - $ git push --tags --force - ``` - --------------------------------------------------------------------------------- - -via: https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html - -作者:[atlassian.com][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html -[1]:https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html#MaintainingaGitRepository-UnderstandingfileremovalfromGithistory -[2]:https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html#MaintainingaGitRepository-UsingtheBFGtorewritehistory -[3]:https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html#MaintainingaGitRepository-Alternatively,usinggitfilter-branchtorewritehistory -[4]:https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html#MaintainingaGitRepository-Garbagecollectingdeaddata -[5]:http://stackoverflow.com/questions/3959924/whats-the-difference-between-git-clone-mirror-and-git-clone-bare -[6]:http://git-scm.com/docs/git-reflog -[7]:http://git-scm.com/docs/git-gc -[8]:http://rtyley.github.io/bfg-repo-cleaner/ -[9]:http://git-scm.com/docs/git-filter-branch -[10]:https://confluence.atlassian.com/bitbucket/files/321848291/321979854/1/1360604134990/git_find_big.sh -[11]:http://rtyley.github.io/bfg-repo-cleaner/ -[12]:http://rtyley.github.io/bfg-repo-cleaner/#protected-commits -[13]:https://www.youtube.com/watch?v=Ir4IHzPhJuI -[14]:http://rtyley.github.io/bfg-repo-cleaner/#usage -[15]:http://rtyley.github.io/bfg-repo-cleaner/#examples -[16]:https://stubbisms.wordpress.com/2009/07/10/git-script-to-show-largest-pack-objects-and-trim-your-waist-line/ diff --git a/translated/tech/20170518 Maintaining a Git Repository.md b/translated/tech/20170518 Maintaining a Git Repository.md new file mode 100644 index 0000000000..c86da78795 --- /dev/null +++ b/translated/tech/20170518 Maintaining a Git Repository.md @@ -0,0 +1,227 @@ +维护一个Git仓库 +============================================================ + +维护Git仓库通常包括减少仓库的大小。如果你从另外一个版本控制系统导入了一个仓库,你可能需要在导入后清除掉不必要的文件。本文着重于从一个Git仓库中删除大文件,并且包含下列主题: + +* [理解从Git的历史记录中删除文件][1] + +* [使用BFG重写历史记录][2] + +* [可选,使用git filter-branch重写历史记录][3] + +* [垃圾回收][4] + +请格外小心..... + +本文中的步骤和工具使用的高级技术涉及破坏性操作。确保您在开始之前仔细读过**备份你的仓库**,创建一个备份的方式是使用[--mirror][5]标志对你的仓库克隆,然后对整个克隆的文件进行打包压缩。如果在维护期间意外损坏了您的仓库的关键元素,那么你可以通过备份的仓库来恢复。 + +请记住,仓库维护对仓库的用户可能会是毁灭性的。与你的团队或者仓库的关注者进行沟通会是一个不错的主意。确保每个人都已经检查了他们的代码,并且同意在仓库维护期间停止开发。 + +### 理解从Git的历史记录中删除文件 + +回想一下,克隆存储库会克隆整个历史记录——包括每个源代码文件的所有版本。如果一个用户提交了一个较大的文件,比如一个JAR,则随后的每次克隆都会包含这个文件。即使用户最终在后面的某次提交中删除了这个文件,但是这个文件仍然存在于这个仓库的历史记录中。要想完全的从你的仓库中删除这个文件,你必须: + +* 从你的项目的*当前的*文件树中删除该文件; + +* 从仓库的历史记录中删除文件——*重写*Git历史记录,从包含该文件的*所有的*提交中删除这个文件; + +* 删除指向*旧的*提交历史记录的所有[reflog][6]历史记录; + +* 重新整理仓库,使用[git gc][7]对现在没有使用的数据进行垃圾回收。 + +Git的'gc'(垃圾回收)通过任何一个你的分支或者标签来删除仓库中所有的实际没用的或者用某种方式引用的数据。为了使其有用,我们需要重写包含不需要的文件的所有Git仓库历史记录,仓库将不再引用它——git gc将会丢弃所有没用的数据。 + +重写存储库历史是一个棘手的事情,因为每次提交都依赖它的父提交,所以任何一个很小的改变都会改变它的每一个子拼音的提交ID。有两个自动化的工具可以做到这: + +1. [BFG Repo Cleaner][8] 快速、简单且易于使用,需要Java 6或者更高版本的运行环境。 + +2. [git filter-branch][9] 功能强大、配置麻烦,用于大于仓库时速度较慢,是核心Git套件的一部分。 + +切记,当你重写历史记录后,无论你是使用BFG还是使用filter-branch,你都需要删除撒向指向旧的历史记录的`reflog`条目,最后运行垃圾回收器来删除旧的数据。 + +### 使用BFG重写历史记录 + +[BFG][11]是为将像大文件或者密码这些不想要的数据从Git仓库中删除而专门设计的,所以它有一一个简单的标志用来删除那些大的历史文件(不是当前提交的文件):`'--strip-blobs-bigger-than'` + +``` +$ java -jar bfg.jar --strip-blobs-than 100M + +``` +大小超过100MB的任何文件(不在你*最近的*提交中——因为BFG[默认会保护你的最新提交的内容][12])将会从你的Git仓库的历史记录中删除。如果你想用名字来指明具体的文件,你也可以这样做: + +``` +$ java -jar bfg.jar --delete-files *.mp4 + +``` + +BFG的速度要比git filter-branch快[10-1000x][13],而且通常更容易使用——查看完整的[使用说明][14]和[示例][15]获取更多细节。 + +### 或者,使用git filter-branch来重写历史记录 + +`filter-branch`命令可以对Git仓库的历史记录重写,就像BFG一样,但是过程更慢和更手动化。如果你不知道这些大文件在_哪里_,那么你第一步就需要找到它们: + +### 手动查看你Git仓库中的大文件 + +[Antony Stubbs][16]写了一个可以很好地完成这个功能的BASH脚本。该脚本可以检查你的包文件的内容并列出大文件。在你开始删除文件之前,请执行以下操作获取并安装此脚本: + +1\. [下载脚本][10]到你的本地的系统。 + +2\. 将它放在一个可以访问你的Git仓库的易于找到的位置。 + +3\. 让脚本成为可执行文件: + +``` + $ chmod 777 git_find_big.sh + +``` +4\. 克隆仓库到你本地系统。 + +5\. 改变当前目录到你的仓库根目录。 + +6\. 手动运行Git垃圾回收器: + +``` + git gc --auto +``` + +7\. 找出.git文件夹的大小 + +``` +$ du -hs .git/objects +``` +``` +45M .git/objects +``` +注意文件大小,以便随后参考。 + +8\. 运行`git_find_big.sh`脚本来列出你的仓库中的大文件。 + +``` +$ git_find_big.sh + +``` +所有文件大小都用kb表示,pack列是在pack文件内压缩后的大小。 + +``` +size pack SHA                                       location +``` +``` +592   580   e3117f48bc305dd1f5ae0df3419a0ce2d9617336 media/img/emojis.jar +``` +``` +550   169   b594a7f59ba7ba9daebb20447a87ea4357874f43 media/js/aui/aui-dependencies.jar +``` + +``` +518   514   22f7f9a84905aaec019dae9ea1279a9450277130 media/images/screenshots/issue-tracker-wiki.jar +``` +``` +337   92   1fd8ac97c9fecf74ba6246eacef8288e89b4bff5 media/js/lib/bundle.js +``` +``` +240   239   e0c26d9959bd583e5ef32b6206fc8abe5fea8624 media/img/featuretour/heroshot.png +``` +大文件都是JAR文件,包的大小列是最相关的。`aui-dependencies.jar` 被压缩到169kb,但是`emojis.jar`只压缩到500kb。`emojis.jar`就是一个待删除的对象。 + + +### 运行filter-branch + + +你可以给这个命令传递一个用于重写Git索引的过滤器。例如,一个过滤器可以可以将每个检索的提交删除。这个用法如下: + +``` +git filter-branch --index-filter 'git rm --cached --ignore-unmatch  _pathname_ ' commitHASH + +``` +`--index-filter`选项可以修改仓库的索引,`--cached ` 选项从不是磁盘的索引中删除文件。这样会更快,因为你不需要在运行这个过滤器前检查每个修订版。`git rm`中的`ignore-unmatch`选项可以防止当 _pathname_ 正在尝试不在那的文件的时候这个命令失败。通过明确一个提交HASH值,你可以从每个以这个HASH值开始的提交中删除`pathname`。为了从开始处删除,你可以省略这个或者明确HEAD。 + +如果所有你的大文件在不同的分支,你将需要通过名字来删除每个文件。如果所有大文件在一个单独的分支,你可以直接删除这个分支本身。 + +### 选项1:通过文件名删除文件 + +使用下面的步骤来删除大文件: + +1\. 使用下面的命令来删除你找到的第一个大文件: + +``` +git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD + +``` + +2\. 对于剩下的每个大文件,重复步骤1。 + +3\. 在你的仓库里更新引用。 `filter-branch`会为你原先的引用创建一个以`refs/original/`命名的备份。一旦你确信已经删除了正确的文件,你可以运行下面的命令来删除备份文件,同时可以让垃圾回收器回收大的对象: + +``` + git filter-branch --index-filter 'git rm --cached --ignore-unmatch filename' HEAD + +``` + +### 选项2:直接删除分支 + +如果你所有的大文件都在一个单独的分支上,你可以直接删除这个分支。删除这个分支会自动删除所有的引用。 + +1\. 删除分支。 + +``` + $ git branch -D PROJ567bugfix + +``` + +2\. 从后面的分支中删除所有的reflog引用。 + + +### 对不用的数据垃圾回收 + +1\. 删除从现在到后面的所有reflog引用(除非你明确地只在一个分支上操作)。 + +``` +$ git reflog expire --expire=now --all + +``` + +2\. 通过运行垃圾回收器和删除旧的对象重新打包仓库。 + +``` + $ git gc --prune=now + +``` + +3\. 把你所有的修改推送回Bitbucket仓库。 + +``` +$ git push --all --force +``` + +4\. 确保你所有的tags也是当前最新的: + +``` + $ git push --tags --force + +``` + +via: https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html + +作者:[atlassian.com][a] +译者:[zhousiyu325](https://github.com/zhousiyu325) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html +[1]:https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html#MaintainingaGitRepository-UnderstandingfileremovalfromGithistory +[2]:https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html#MaintainingaGitRepository-UsingtheBFGtorewritehistory +[3]:https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html#MaintainingaGitRepository-Alternatively,usinggitfilter-branchtorewritehistory +[4]:https://confluence.atlassian.com/bitbucket/maintaining-a-git-repository-321848291.html#MaintainingaGitRepository-Garbagecollectingdeaddata +[5]:http://stackoverflow.com/questions/3959924/whats-the-difference-between-git-clone-mirror-and-git-clone-bare +[6]:http://git-scm.com/docs/git-reflog +[7]:http://git-scm.com/docs/git-gc +[8]:http://rtyley.github.io/bfg-repo-cleaner/ +[9]:http://git-scm.com/docs/git-filter-branch +[10]:https://confluence.atlassian.com/bitbucket/files/321848291/321979854/1/1360604134990/git_find_big.sh +[11]:http://rtyley.github.io/bfg-repo-cleaner/ +[12]:http://rtyley.github.io/bfg-repo-cleaner/#protected-commits +[13]:https://www.youtube.com/watch?v=Ir4IHzPhJuI +[14]:http://rtyley.github.io/bfg-repo-cleaner/#usage +[15]:http://rtyley.github.io/bfg-repo-cleaner/#examples +[16]:https://stubbisms.wordpress.com/2009/07/10/git-script-to-show-largest-pack-objects-and-trim-your-waist-line/ \ No newline at end of file From 8c32f45343e4511830bc42ceff45eddc7f32127b Mon Sep 17 00:00:00 2001 From: zhousiyu325 Date: Thu, 25 May 2017 11:02:30 +0800 Subject: [PATCH 0225/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=9120170519=2010=20Use?= =?UTF-8?q?ful=20Tips=20for=20Writing=20Effective=20Bash=20Scripts=20in=20?= =?UTF-8?q?Linux.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...10 Useful Tips for Writing Effective Bash Scripts in Linux.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md b/sources/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md index 6f0cae4f8a..e4ddd0b92e 100644 --- a/sources/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md +++ b/sources/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md @@ -1,3 +1,4 @@ +zhousiyu325翻译 10 Useful Tips for Writing Effective Bash Scripts in Linux ============================================================ ch-cn translating From 6cc1f6004ecde00f336c875dd1229876cabdb65b Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 25 May 2017 11:55:21 +0800 Subject: [PATCH 0226/1407] PUB:20170511 How to Delete HUGE 100-200GB Files in Linux.md @geekpi @jasminepeng --- .../20170511 How to Delete HUGE 100-200GB Files in Linux.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170511 How to Delete HUGE 100-200GB Files in Linux.md (100%) diff --git a/translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md b/published/20170511 How to Delete HUGE 100-200GB Files in Linux.md similarity index 100% rename from translated/tech/20170511 How to Delete HUGE 100-200GB Files in Linux.md rename to published/20170511 How to Delete HUGE 100-200GB Files in Linux.md From 8eb184278b382fdc1a3aaf681ed57b5b598a288f Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 25 May 2017 13:09:17 +0800 Subject: [PATCH 0227/1407] PUB:20170111 The difference between development and deployment.md @geekpi @bestony --- ...ence between development and deployment.md | 59 +++++++++++++++++++ ...ence between development and deployment.md | 58 ------------------ 2 files changed, 59 insertions(+), 58 deletions(-) create mode 100644 published/20170111 The difference between development and deployment.md delete mode 100644 translated/talk/20170111 The difference between development and deployment.md diff --git a/published/20170111 The difference between development and deployment.md b/published/20170111 The difference between development and deployment.md new file mode 100644 index 0000000000..043217c594 --- /dev/null +++ b/published/20170111 The difference between development and deployment.md @@ -0,0 +1,59 @@ +一位老极客的眼中的开发和部署 +============================================================ + +![The difference between development and deployment](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/BUS_OpenSourceExperience_520x292_cm.png?itok=APna2N9Y "The difference between development and deployment") + +图片提供 : opensource.com + +多年前,我曾是一名 Smalltalk 程序员,这种经验让我以一种不同的视角来观察编程的世界,例如,需要花时间来适应源代码应该存储在文本文件中的这种做法。 + +我们作为程序员通常会区分“开发”和“部署”,特别是我们在开发的地方所使用的工具不同于我们在之后部署软件时的地点和工具时。而在 Smalltalk 世界里,没有这样的区别。 + +Smalltalk 构建于虚拟机包含了你的开发环境(IDE、调试器、文本编辑器、版本控制等)的思路之上,如果你需要修改任何一处代码,你得修改内存中运行副本。如果需要的话,你可以为运行中的机器做个快照;如果你想分发你的代码,你可以发送一个运行中的机器的镜像副本(包括 IDE、调试器、文本编辑器、版本控制等)给用户。这就是上世纪 90 年代软件开发的方式(对我们中的一些人来说)。 + +如今,部署环境与开发环境有了很大的不同。起初,你不要期望那里(指部署环境)有任何开发工具。一旦部署,就没有版本控制、没有调试、没有开发环境。有的是记录和监视,这些在我们的开发环境中都没有,而有一个“构建管道”,它将我们的软件从开发形式转换为部署形式。作为一个例证,Docker 容器则试图重新找回上世纪 90 年代 Smalltalk 程序员部署体验的那种简单性,而避免同样的开发体验。 + +我想如果 Smalltalk 世界是我唯一的编程方面的体验,让我无法区分开发和部署环境,我可能会偶尔回顾一下它。但是在我成为一名 Smalltalk 程序员之前,我还是一位 APL 程序员,这也是一个可修改的虚拟机镜像的世界,其中开发和部署是无法区分的。因此,我相信,在当前的时代,人们编辑单独的源代码文件,然后运行构建管道以创建在编辑代码时尚不存在的部署作品,然后将这些作品部署给用户。我们已经以某种方式将这种反模式的软件开发制度化,而不断发展的软件环境的需求正在迫使我们找回到上世纪 90 年代的更有效的技术方法。因此才会有 Docker 的成功,所以,我需要提出我的建议。 + +我有两个建议:我们在运行时系统中实现(并使用)版本控制,以及,我们通过更改运行中的系统来开发软件,而不是用新的运行系统替换它们。这两个想法是相关的。为了安全地更改正在运行的系统,我们需要一些版本控制功能来支持“撤消”功能。也许公平地说,我只提出了一个建议。让我举例来说明。 + +让我们开始假设一个静态网站。你要修改一些 HTML 文件。你应该如何工作?如果你像大多数开发者一样,你会有两个,也许三个网站 - 一个用于开发,一个用于 QA(或者预发布),一个用于生产。你将直接编辑开发实例中的文件。准备就绪后,你将把你的修改“部署”到预发布实例。在用户验收测试之后,你将再次部署,这次是生产环境。 + +使用 Occam 的 Razor,让我们可以避免不必要地创建实例。我们需要多少台机器?我们可以使用一台电脑。我们需要多少台 web 服务器?我们可以使用具有多个虚拟主机的单台 web 服务器。如果不使用多个虚拟主机的话,我们可以只使用单个虚拟主机吗?那么我们就需要多个目录,并需要使用 URL 的顶级路径来区分不同的版本,而不是虚拟主机名。但是为什么我们需要多个目录?因为 web 服务器将从文件系统中提供静态文件。我们的问题是,目录有三个不同的版本,我们的解决方案是创建目录的三个不同的副本。这不是正是 Subversion 和 Git 这样的版本控制系统解决的问题吗?制作目录的多个副本以存储多个版本的策略回到了版本控制 CVS 之前的日子。为什么不使用比如说一个空的的 Git 仓库来存储文件呢?要这样做,web 服务器将需要能够从 git 仓库读取文件(参见 [mod_git] [3])。 + +这将是一个支持版本控制的运行时系统。 + +使用这样的 web 服务器,使用的版本可以由 cookie 来标识。这样,任何人都可以推送到仓库,用户将继续看到他们发起会话时所分配的版本。版本控制系统有不可改变的提交; 一旦会话开始,开发人员可以在不影响正在运行的用户的情况下快速推送更改。开发人员可以重置其会话以跟踪他们的新提交,因此开发人员或测试人员就可能如普通用户一样查看在同台服务器上同一个 URL 上正在开发或正在测试的版本。作为偶然的副作用,A/B 测试仅仅是将不同的用户分配给不同的提交的情况。所有用于管理多个版本的 git 设施都可以在运行环境中发挥作用。当然,git reset 为我们提供了前面提到的“撤销”功能。 + +为什么不是每个人都这样做? + +一种可能性是,诸如版本控制系统的工具没有被设计为在生产环境中使用。例如,给某人推送到测试分支而不是生产分支的许可是不可能的。对这个方案最常见的反对是,如果发现了一个漏洞,你会想要将某些提交标记为不可访问。这将是另一种更细粒度的权限的情况;开发人员将具有对所有提交的读取权限,但外部用户不会。我们可能需要对现有工具进行一些额外的改造以支持这种模式,但是这些功能很容易理解,并已被设计到其他软件中。例如,Linux (或 PostgreSQL)实现了对不同用户的细粒度权限的想法。 + +随着云环境变得越来越普及,这些想法变得更加相关:云总是在运行。例如,我们可以看到,AWS 中等价的 “文件系统”(S3)实现了版本控制,所以你可能有一个不同的想法,使用一台 web 服务器提供来自 S3 的资源文件,并根据会话信息选择不同版本的资源文件。重要的并不是哪个实现是最好的,而是支持这种运行时版本控制的愿景。 + +部署的软件环境应该是“版本感知”的原则,应该扩展到除了服务静态文件的 web 服务器之外的其他工具。在将来的文章中,我将介绍版本库,数据库和应用程序服务器的方法。 + +_在 linux.conf.au 中了解更多 Robert Lefkowitz 2017 年 ([#lca2017][1])在 Hobart:[保持 Linux 伟大][2]的主题。_ + +-------------------------------------------------------------------------------- + +作者简介: + +![](https://opensource.com/sites/default/files/styles/profile_pictures/public/pictures/robert_lefkowitz.jpg?itok=CFoX-OUI) + +Robert M. Lefkowitz - Robert(即 r0ml)是一个喜欢复杂编程语言的编程语言爱好者。 他是一个提高清晰度、提高可靠性和最大限度地简化的编程技术收藏家。他通过让计算机更加容易获得来使它普及化。他经常演讲中世纪晚期和早期文艺复兴对编程艺术的影响。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/17/1/difference-between-development-deployment + +作者:[Robert M. Lefkowitz][a] +译者:[geekpi](https://github.com/geekpi) +校对:[Bestony](https://github.com/Bestony) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/r0ml +[1]:https://twitter.com/search?q=%23lca2017&src=typd +[2]:https://www.linux.conf.au/schedule/presentation/107/ +[3]:https://github.com/r0ml/mod_git diff --git a/translated/talk/20170111 The difference between development and deployment.md b/translated/talk/20170111 The difference between development and deployment.md deleted file mode 100644 index fe68b606f0..0000000000 --- a/translated/talk/20170111 The difference between development and deployment.md +++ /dev/null @@ -1,58 +0,0 @@ -开发和部署的不同 -============================================================ -![The difference between development and deployment](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/BUS_OpenSourceExperience_520x292_cm.png?itok=APna2N9Y "The difference between development and deployment") - -图片提供 : opensource.com - -多年前,我是一名 Smalltalk 程序员,这种经验给让我在观察编程世界时有不同的想法。例如,花时间来适应源代码应该存储在文本文件中的想法。 - -我们作为程序员通常区分“开发”和“部署”,特别是我们在一个地方开发使用的工具不同于我们之后部署软件时的地点和工具。在 Smalltalk 世界里,没有这样的区别。 - -Smalltalk 构建在包含了你的开发环境(IDE、调试器、文本编辑器、版本控制等)的虚拟机的想法之上,如果你不得不修改任何一处代码,你要修改内存中运行副本。如果你可以为运行中的机器打个快照,如果你想做的话,如果你想分发你的代码,你可以发送一个运行中的机器的镜像(包括IDE、调试器、文本编辑器、版本控制等)的副本到用户。这就是 90 年代软件开发的工作原理(对我们中的一些人来说)。 - -如今部署环境与开发环境有了很大的不同。对于初学者,你不要期望那里有任何开发工具。一旦部署,就没有版本控制、没有调试、没有开发环境。有的是记录和监视,这些在我们的开发环境中没有,并且有一个“构建管道”,它将我们的软件从我们开发形式转换为部署形式。例如,Docker 容器试图重新抓住 1990 年代 Smalltalk 程序员部署经验的一些简单性,而不希望对开发体验做同样的事情。 - -我想如果 Smalltalk 世界是我唯一的编程隐喻体验,无法区分开发和部署环境,我可能偶尔回顾一下它。但在我是一名 Smalltalk 程序员之前,我是一位 APL 程序员,这也是一个可以修改虚拟机镜像的世界,其中开发和部署是无法区分的。因此,我相信,在当前的世界,人们编辑单独的源代码文件,然后运行构建管道以创建在编辑代码时不存在的部署工作,然后将这些作品部署到用户。我们已经以某种方式将这种反模式软件开发制度化,并且不断发展的软件环境的需求正在迫使我们找到回到 20 世纪 90 年代更有效的技术的方法。因此会有 Docker 的成功。因此,我需要提出建议。 - -我有两个建议:我们在运行时系统中实现(和使用)版本控制,我们通过更改运行系统来开发软件,而不是用新的运行系统替换它们。这两个想法是相关的。为了安全地更改正在运行的系统,我们需要一些版本控制功能来支持“撤消”功能。也许公平地说,我只提出一个建议。让我举例来说明。 - -让我们开始想象一个静态网站。你要修改一些 HTML 文件。你应该如何工作?如果你像大多数开发者一样,你会有两个,也许三个网站 - 一个用于开发,一个用于QA(或者预发布),一个用于生产。你将直接编辑开发实例中的文件。准备就绪后,你将“部署”你的修改到预发布实例。在用户验收测试之后,你将再次部署,这次是生产环境。 - -使用 Occam 的 Razor,让我们避免不必要地创建实例。我们需要多少台机器?我们可以使用一台电脑。我们需要多少台网络服务器?我们可以使用具有多个虚拟主机的单台 web 服务器,而不是多个虚拟主机,我们可以使用单台虚拟主机吗?然后,我们需要多个目录,并需要使用 URL 的顶级路径来区分不同的版本,而不是虚拟主机名。但是为什么我们需要多个目录?因为 web 服务器将从文件系统中提供静态文件。我们的问题是,目录有三个不同的版本,我们的解决方案是创建目录的三个不同的副本。这不是像 Subversion 和 Git 这样的版本控制系统解决的问题?制作目录的多个副本以存储多个版本的策略回到了 CVS 之前的日子。为什么不使用,也就是一个空的的 Git 仓库来存储文件?因为要这样做,web 服务器将需要能够从 git 仓库读取文件(参见[mod_git] [3])。 - -这将是一个支持版本控制的运行时系统。 - -使用这样的 web 服务器,使用的版本可以由 cookie 来标识。这样,任何人都可以推送到仓库,用户将继续看到他们发起会话时分配的版本。版本控制系统有不可改变的提交; 一旦会话开始,开发人员可以在不影响正在运行的用户的情况下快速推送更改。开发人员可以重置其会话以跟踪他们的新提交,因此开发人员或测试人员就可能如普通用户一样查看在同台服务器上同一个URL上正在开发或正在测试的版本。作为偶然的副作用,A/B 测试仅仅是将不同的用户分配给不同的提交的情况。所有用于管理多个版本的 git 设施都在运行环境中发挥作用。当然,git reset 为我们提供了前面提到的“撤销”功能。 - -为什么不是每个人都这样做? - -一种可能性是,诸如版本控制系统的工具不被设计为在生产环境中使用。例如,给某人许可推送到测试分支而不是生产分支是不可能的。对这个方案最常见的反对是,如果发现了一个漏洞,你会想要将某些提交标记为不可访问。这将是另一种更细粒度的权限的情况;开发人员将具有对所有提交的读取权限,但外部用户不会。我们可能需要对现有工具进行一些额外的工作以支持这种模式,但是这些功能很容易理解,并已被设计到其他软件中。例如,Linux (或 PostgreSQL)实现了对不同用户的细粒度权限的想法。 - -随着云环境变得越来越普及,这些想法变得更加相关:云总是在运行。例如,我们可以看到,AWS 中等价的 “文件系统”(S3)实现了版本控制,所以你可能有一个不同的想法,使用一台 web 服务器提供来自 S3 的资产,并使用会话信息选择不同版本的资产。重要的想法并不是实现是最好的,而是支持运行时版本控制的愿景。 - -部署的软件环境应该是“版本感知”的原则,扩展到除了服务静态资产的web服务器之外的其他工具。在将来的文章中,我将介绍版本库,数据库和应用程序服务器的方法。 - -_在 linux.conf.au 中了解更多 Robert Lefkowitz 2017 年 ([#lca2017][1])在 Hobart:[保持 Linux 伟大][2]的主题。_ - --------------------------------------------------------------------------------- - -作者简介: - -![](https://opensource.com/sites/default/files/styles/profile_pictures/public/pictures/robert_lefkowitz.jpg?itok=CFoX-OUI) - -Robert M. Lefkowitz - Robert(a / k / a r0ml)是一个喜欢复杂编程语言的编程语言爱好者。 他是一个提高清晰度、提高可靠性和最大限度地简化编程技术的收藏家。他通过让计算机更加容易获得来使它普及化。他经常演讲中世纪晚期和早期文艺复兴对编程艺术的影响。 - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/17/1/difference-between-development-deployment - -作者:[Robert M. Lefkowitz][a] -译者:[geekpi](https://github.com/geekpi) -校对:[Bestony](https://github.com/Bestony) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/r0ml -[1]:https://twitter.com/search?q=%23lca2017&src=typd -[2]:https://www.linux.conf.au/schedule/presentation/107/ -[3]:https://github.com/r0ml/mod_git From d2ec83609bf7b83d185e58e051aa6120476d8ea1 Mon Sep 17 00:00:00 2001 From: jasminepeng Date: Thu, 25 May 2017 14:55:09 +0800 Subject: [PATCH 0228/1407] =?UTF-8?q?=E6=A0=A1=E5=AF=B9=E5=AE=8C=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 校对完毕 谢谢 --- ...ow to make Vim user-friendly with Cream.md | 23 ++++++++----------- 1 file changed, 10 insertions(+), 13 deletions(-) diff --git a/translated/tech/20170518 How to make Vim user-friendly with Cream.md b/translated/tech/20170518 How to make Vim user-friendly with Cream.md index 49fdaf20f8..00206321b7 100644 --- a/translated/tech/20170518 How to make Vim user-friendly with Cream.md +++ b/translated/tech/20170518 How to make Vim user-friendly with Cream.md @@ -1,34 +1,30 @@ 如何使用 Cream 提高 Vim 的用户友好性 ============================================================ -### Cream 附加包通过把一个更加熟悉的"面孔"置于 Vim 文本编辑器之上,同时保留 Vim 的功能,使其更加容易使用 - - +### Cream 附加包通过把一个更加熟悉的“面孔”置于 Vim 文本编辑器之上,同时保留 Vim 的功能,使其更加容易使用 ![How to make Vim user-friendly with Cream](https://opensource.com/sites/default/files/styles/image-full-size/public/images/education/osdc_edu_rightmix_520.png?itok=SCsog_qv "How to make Vim user-friendly with Cream") -图片来自 :  - -opensource.com +图片来自 : opensource.com 大约 10 年前,我既使用 Emacs 进行文本编辑,也使用 Vim 进行文本编辑。说到底,我的确是一个热衷于 Emacs 的家伙。尽管 Emacs 在我的心里占据了很重要的地位,但我知道, Vim 也不赖。 -一些人,或者像我一样的人,在技术方面可能都会有些笨手笨脚的。多年来,我已经和很多下面这样的 Linux 新手交谈过,他们想使用 Vim,但是却失望的发现, Vim 编辑器和他们在其它操作系统上使用过的编辑器似乎不一样。 +一些人,或者像我一样的人,在技术方面有些笨手笨脚。多年来,我和一些 Linux 新手交流,了解到他们想使用 Vim,但是却失望的发现, Vim 编辑器和他们在其它操作系统上使用过的编辑器不一样。 但是,当我把 Cream 介绍给他们以后,他们的失望就变成了满意。Cream 是 Vim 的一个附加包,它使得 Vim 更加容易使用。Cream 让这些 Linux 新手变成了 Vim 的坚决拥护者和忠心用户。 让我们来看一看 Cream 是什么以及它是如何让 Vim 变得更加容易使用的。 -### Cream 安装 +### Cream 的安装 在安装 Cream 之前,你需要先在你的电脑上安装好 Vim 和 GVim 的 GUI 组件。我发现最容易完成这件事的方法是使用 Linux 版本的包管理器。 安装好 Vim 以后,便可[下载 Cream 的安装程序][2],或者你也可以再次使用 Linux 发行版的包管理器进行安装。 -安装好 Cream 以后,你可以通过从应用菜单选择输入(比如,**Applications**->**Cream**)或者在程序启动器中输入 **Cream**,从而启动 Cream 。 +安装好 Cream 以后,你可以从应用菜单选择它(比如,**Applications**->**Cream**)或者在程序启动器中输入 **Cream**,从而启动 Cream 。 ![Cream's main window](https://opensource.com/sites/default/files/resize/cream-main-window-520x336.png "Cream&#039;s main window") -### Cream 使用 +### Cream 的使用 如果你之前已经使用过 Gvim,那么你会注意到, Cream 几乎没改变编辑器的外观和感觉。最大的不同是 Cream 的菜单栏和工具栏,它们取代了 Gvim 陈旧的菜单栏和工具栏,新的菜单栏和工具栏的外观和群组功能看起来和其它编辑器的一样。 @@ -40,7 +36,7 @@ Cream 开始运行以后,打开一个文件,或者新建一个文件,然 ![Cream add-on for VIM in action](https://opensource.com/sites/default/files/cream-in-action.png "Cream add-on for VIM in action") -并不是说 Cream 是 Vim 的简化版,或者说 Cream “离” Vim 很远。事实上, Cream 保留了 Vim 的全部特性,同时,它还有一系列其他有用的特性。我发现的 Cream 的一些有用的特性包括: +并不是说 Cream 是 Vim 的简化版,远远不是。事实上, Cream 保留了 Vim 的全部特性,同时,它还有[一系列其他有用的特性][7]。我发现的 Cream 的一些有用的特性包括: * 一个标签式界面 * 语法高亮(特别是针对 Markdown、LaTeX 和 HTML) @@ -49,9 +45,9 @@ Cream 开始运行以后,打开一个文件,或者新建一个文件,然 * 内建文件浏览器 -Cream 也有许多附加包,可以给编辑器增加一些新的特性。这些特性包括文本加密、清理电子邮件内容,甚至还有一个使用教程。老实说,我还没有发现哪一个附加包是真正有用的,不过你的里程可能会有所不同。 +Cream 也有许多附加包,可以给编辑器增加一些新的特性。这些特性包括文本加密、清理电子邮件内容,甚至还有一个使用教程。老实说,我还没有发现哪一个附加包是真正有用的,不过你的感受可能会有所不同。 -我曾听过一些 Vi/Vim 的狂热分子谴责 Cream “简化”(它们的话)了 Vi/Vim 编辑器的功能。的确,Cream 并不是为他们设计的。它是为那些想快速使用 Vim ,同时保留他们曾经使用过的编辑器的外观和感觉的人准备的。在这种情况下, Cream 是值得赞赏的,它使得 Vim 更加容易使用,更加广泛的被人们使用。 +我曾听过一些 Vi/Vim 的狂热分子谴责 Cream “降低”(他们的话)了 Vi/Vim 编辑器的水准。的确,Cream 并不是为他们设计的。它是为那些想快速使用 Vim ,同时保留他们曾经使用过的编辑器的外观和感觉的人准备的。在这种情况下, Cream 是值得赞赏的,它使得 Vim 更加容易使用,更加广泛的被人们使用。 -------------------------------------------------------------------------------- @@ -70,3 +66,4 @@ via: https://opensource.com/article/17/5/stir-bit-cream-make-vim-friendlier [4]:https://opensource.com/user/14925/feed [5]:https://opensource.com/article/17/5/stir-bit-cream-make-vim-friendlier#comments [6]:https://opensource.com/users/scottnesbitt +[7]:http://cream.sourceforge.net/featurelist.html From 303a1cff4a5e16eb3b9d6e8243e36a6a0b374503 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 25 May 2017 16:11:48 +0800 Subject: [PATCH 0229/1407] PUB:20170518 How to make Vim user-friendly with Cream.md @ucasFL @jasminepeng --- ...How to make Vim user-friendly with Cream.md | 18 +++++++++--------- 1 file changed, 9 insertions(+), 9 deletions(-) rename {translated/tech => published}/20170518 How to make Vim user-friendly with Cream.md (70%) diff --git a/translated/tech/20170518 How to make Vim user-friendly with Cream.md b/published/20170518 How to make Vim user-friendly with Cream.md similarity index 70% rename from translated/tech/20170518 How to make Vim user-friendly with Cream.md rename to published/20170518 How to make Vim user-friendly with Cream.md index 00206321b7..66e289d214 100644 --- a/translated/tech/20170518 How to make Vim user-friendly with Cream.md +++ b/published/20170518 How to make Vim user-friendly with Cream.md @@ -1,9 +1,10 @@ 如何使用 Cream 提高 Vim 的用户友好性 ============================================================ -### Cream 附加包通过把一个更加熟悉的“面孔”置于 Vim 文本编辑器之上,同时保留 Vim 的功能,使其更加容易使用 +> Cream 附加包通过把一个更加熟悉的“面孔”置于 Vim 文本编辑器之上,同时保留 Vim 的功能,使其更加容易使用 ![How to make Vim user-friendly with Cream](https://opensource.com/sites/default/files/styles/image-full-size/public/images/education/osdc_edu_rightmix_520.png?itok=SCsog_qv "How to make Vim user-friendly with Cream") + 图片来自 : opensource.com 大约 10 年前,我既使用 Emacs 进行文本编辑,也使用 Vim 进行文本编辑。说到底,我的确是一个热衷于 Emacs 的家伙。尽管 Emacs 在我的心里占据了很重要的地位,但我知道, Vim 也不赖。 @@ -20,15 +21,15 @@ 安装好 Vim 以后,便可[下载 Cream 的安装程序][2],或者你也可以再次使用 Linux 发行版的包管理器进行安装。 -安装好 Cream 以后,你可以从应用菜单选择它(比如,**Applications**->**Cream**)或者在程序启动器中输入 **Cream**,从而启动 Cream 。 +安装好 Cream 以后,你可以从应用菜单选择它(比如,**Applications**->**Cream**)或者在程序启动器中输入 `Cream`,从而启动 Cream 。 -![Cream's main window](https://opensource.com/sites/default/files/resize/cream-main-window-520x336.png "Cream&#039;s main window") +![Cream’s main window](https://opensource.com/sites/default/files/resize/cream-main-window-520x336.png "Cream’s main window") ### Cream 的使用 -如果你之前已经使用过 Gvim,那么你会注意到, Cream 几乎没改变编辑器的外观和感觉。最大的不同是 Cream 的菜单栏和工具栏,它们取代了 Gvim 陈旧的菜单栏和工具栏,新的菜单栏和工具栏的外观和群组功能看起来和其它编辑器的一样。 +如果你之前已经使用过 Gvim,那么你会注意到, Cream 几乎没改变该编辑器的外观和感觉。最大的不同是 Cream 的菜单栏和工具栏,它们取代了 Gvim 陈旧的菜单栏和工具栏,新的菜单栏和工具栏的外观和功能分组看起来和其它编辑器的一样。 -Cream 的菜单栏隐藏了更多的技术选项,比如指定一个编译器的能力,以及来自用户的 `make` 命令的能力。当你通过使用 Cream 更加熟悉 Vim 以后,你只需要从 `Setting->Preferences->Behavior` 选择选项,就可以更容易的访问这些特性。有了这些选项,你可以(如果你想)体验到一个包含了 Cream 和传统 Vim 二者优点的强大编辑器。 +Cream 的菜单栏对用户隐藏了更多的技术选项,比如指定一个编译器的能力,以及运行 `make` 命令的能力。当你通过使用 Cream 更加熟悉 Vim 以后,你只需要从 **Setting**->**Preferences**->**Behavior** 选择选项,就可以更容易地访问这些特性。有了这些选项,你可以(如果你想)体验到一个兼有 Cream 和传统 Vim 二者优点的强大编辑器。 Cream 并不是仅由菜单驱动。尽管编辑器的功能仅有单击或双击两种方式,但是你也可以使用常见的键盘快捷键来执行操作,比如 `CTRL-O`(打开一个文件),`CTRL-C`(复制文本)。你不需要在几种模式之间切换,也不需要记住一些很难记住的命令。 @@ -44,16 +45,15 @@ Cream 开始运行以后,打开一个文件,或者新建一个文件,然 * 字数统计 * 内建文件浏览器 +Cream 本身也有许多附加包,可以给编辑器增加一些新的特性。这些特性包括文本加密、清理电子邮件内容,甚至还有一个使用教程。老实说,我还没有发现哪一个附加包是真正有用的,不过你的感受可能会有所不同。 -Cream 也有许多附加包,可以给编辑器增加一些新的特性。这些特性包括文本加密、清理电子邮件内容,甚至还有一个使用教程。老实说,我还没有发现哪一个附加包是真正有用的,不过你的感受可能会有所不同。 - -我曾听过一些 Vi/Vim 的狂热分子谴责 Cream “降低”(他们的话)了 Vi/Vim 编辑器的水准。的确,Cream 并不是为他们设计的。它是为那些想快速使用 Vim ,同时保留他们曾经使用过的编辑器的外观和感觉的人准备的。在这种情况下, Cream 是值得赞赏的,它使得 Vim 更加容易使用,更加广泛的被人们使用。 +我曾听过一些 Vi/Vim 的狂热分子谴责 Cream “降低”(这是他们的原话)了 Vi/Vim 编辑器的水准。的确,Cream 并不是为他们设计的。它是为那些想快速使用 Vim ,同时保留他们曾经使用过的编辑器的外观和感觉的人准备的。在这种情况下, Cream 是值得赞赏的,它使得 Vim 更加容易使用,更加广泛的被人们使用。 -------------------------------------------------------------------------------- via: https://opensource.com/article/17/5/stir-bit-cream-make-vim-friendlier -作者:[ Scott Nesbitt][a] +作者:[Scott Nesbitt][a] 译者:[ucasFL](https://github.com/ucasFL) 校对:[jasminepeng](https://github.com/jasminepeng) From b5e3cf9d4e4e0ba0b816eda713ce475830649732 Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 26 May 2017 09:10:58 +0800 Subject: [PATCH 0230/1407] translating --- ... Vulnerability Scanner to Find Security Issues in WordPress.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170505 WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress.md b/sources/tech/20170505 WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress.md index c99a827a09..eaec79176f 100644 --- a/sources/tech/20170505 WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress.md +++ b/sources/tech/20170505 WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress.md @@ -1,3 +1,5 @@ +translating---geekpi + WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress ============================================================ From 54940a904340cdbd44b9ccdaddce51324a7b60ae Mon Sep 17 00:00:00 2001 From: Ezio Date: Fri, 26 May 2017 09:33:39 +0800 Subject: [PATCH 0231/1407] =?UTF-8?q?20170526-1=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...d with iRedMail for Samba4 AD – Part 13.md | 177 ++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 sources/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md diff --git a/sources/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md b/sources/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md new file mode 100644 index 0000000000..ee45584608 --- /dev/null +++ b/sources/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md @@ -0,0 +1,177 @@ +How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13 +============================================================ + + +This tutorial will guide you on how to configure Mozilla Thunderbird client with an iRedMail server in order to send and receive mail via IMAPS and SMTP submission protocols, how to setup contacts database with Samba AD LDAP server and how to configure other related mail features, such as enabling Thunderbird contacts via LDAP database offline replica. + +The process of installing and configuring Mozilla Thunderbird client described here is valid for Thunderbird clients installed on Windows or Linux operating systems. + +#### Requirements + +1. [How to Configure and Integrate iRedMail Services to Samba4 AD DC][1] + +2. [Integrate iRedMail Roundcube with Samba4 AD DC][2] + +### Step 1: Configure Thunderbird for iRedMail Server + +1. After installing Thunderbird mail client, hit on the launcher or shortcut to open the program and on the first screen check E-mail System Integration and click on Skip Integration button to continue. + + [![Thunderbird System Integration](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-System-Integration.png)][3] + +Thunderbird System Integration + +2. On the welcome screen hit on Skip this and use my existing mail button and add your name, your Samba account e-mail address and password, check Remember password field and hit on Continue button to start your mail account setup. + +After Thunderbird client tries to identify the correct IMAP settings provided by iRedMail server hit on Manual config button to manually setup Thunderbird. + + [![Thunderbird Mail Account Setup](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Mail-Account-Setup.png)][4] + +Thunderbird Mail Account Setup + +3. After the Mail Account Setup window expands, manually edit IMAP and SMTP settings by adding your proper iRedMail server FQDN, add secured ports for both mail services (993 for IMAPS and 587 for submission), select the proper SSL communication channel for each port and authentication and hit Done to complete the setup. Use the below image as a guide. + + [![Thunderbird iRedMail Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-iRedMail-Settings.png)][5] + +Thunderbird iRedMail Settings + +4. A new Security Exception window should appear on your screen due to the Self-Signed Certificates your iRedMail server enforces. Check on Permanently store this exception and hit on Confirm Security Exception button to add this security exception and the Thunderbird client should be successfully configured. + + [![Thunderbird Security Exception](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Security-Exception.png)][6] + +Thunderbird Security Exception + +You will see all received mail for your domain account and you should be able to send or receive mail to and from your domain or other domain accounts. + + [![Domain Mails Inbox](https://www.tecmint.com/wp-content/uploads/2017/05/Domain-Mails-Inbox.png)][7] + +Domain Mails Inbox + +### Step 2: Setup Thunderbird Contacts Database with Samba AD LDAP + +5. In order for Thunderbird clients to query Samba AD LDAP database for contacts, hit on Settings menu by right clicking on your account from the left plane and navigate to Composition & Addressing → Addressing → Use a different LDAP server → Edit Directories button as illustrated on the below images. + + [![Thunderbird Samba AD LDAP Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Settings.png)][8] + +Thunderbird Samba AD LDAP Settings + + [![Thunderbird Composition & Addressing Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Composition-Addressing-Settings.png)][9] + +Thunderbird Composition & Addressing Settings + +6. The LDAP Directory Servers windows should open by now. Hit on Add button and fill Directory Server Properties windows with the following content: + +On General tab add descriptive name for this object, add the name of your domain or the FQDN of a Samba domain controller, the base DN of your domain in the form dc=your_domain,dc=tld, LDAP port number 389 and the vmail Bind DN account used to query the Samba AD LDAP database in the form vmail@your_domain.tld. + +Use the below screenshot as a guide. + + [![Directory Server Properties](https://www.tecmint.com/wp-content/uploads/2017/05/Directory-Server-Properties.png)][10] + +Directory Server Properties + +7. On the next step, move to Advanced tab from Directory Server Properties, and add the following content in Search filter filed: + +``` +(&(mail=*)(|(&(objectClass=user)(!(objectClass=computer)))(objectClass=group))) +``` + [![Add Search Filter](https://www.tecmint.com/wp-content/uploads/2017/05/Add-Search-Filter.png)][11] + +Add Search Filter + +Leave the rest of the settings as default and hit on OK button to apply changes and again on OK button to close LDAP Directory Servers window and OK button again on Account Settings to close the window. + + [![Select LDAP Directory Server](https://www.tecmint.com/wp-content/uploads/2017/05/Select-LDAP-Directory-Server.png)][12] + +Select LDAP Directory Server + +8. To test if Thunderbird client can query Samba AD LDAP database for contacts, hit on the upper Address Book icon, select the name of the LDAP database created earlier. + +Add the password for the Bind DN account configured to interrogate the AD LDAP server (vmail@your_domain.tld), check Use Password Manager to remember the password and hit OK button to reflect changes and close the window. + + [![Thunderbird Samba AD LDAP Testing](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Testing.png)][13] + +Thunderbird Samba AD LDAP Testing + +9. Search for a Samba AD contact by using the upper search filed and suppling a domain account name. Be aware that Samba AD accounts with no e-mail address declared in their AD E-mail field will not be listed in Thunderbird Address Book searches. + + [![Search Samba AD Mail Contacts](https://www.tecmint.com/wp-content/uploads/2017/05/Search-Samba-AD-Mail-Contacts.png)][14] + +Search Samba AD Mail Contacts + +10. To search for a contact while composing an e-mail, click on View → Contacts Sidebar or press F9 key to open Contacts panel. + + [![Search Mail Contacts in Thunderbird](https://www.tecmint.com/wp-content/uploads/2017/05/Search-Mail-Contact-in-Thunderbird.png)][15] + +Search Mail Contacts in Thunderbird + +11. Select the proper Address Book and you should be able to search and add an e-mail address for your recipient. When sending the first mail, a new security alert window should appear. Hit on Confirm Security Exception and the mail should be sent to your recipient e-mail address. + + [![Send Mail in Thunderbird](https://www.tecmint.com/wp-content/uploads/2017/05/Send-Mail-in-Thunderbird.jpg)][16] + +Send Mail in Thunderbird + +12. In case you want to search contacts through Samba LDAP database only for a specific AD Organizational Unit, edit the Address Book for your Directory Server name from the left plane, hit on Properties and add the custom Samba AD OU as illustrated on the below example. + +``` +ou=your_specific_ou,dc=your_domain,dc=tld +``` + [![Search Contacts in Samba LDAP Database](https://www.tecmint.com/wp-content/uploads/2017/05/Search-Contacts-in-Samba-LDAP-Database.png)][17] + +Search Contacts in Samba LDAP Database + +### Step 3: Setup LDAP Offline Replica + +13. To configure Samba AD LDAP offline replica for Thunderbird hit on Address Book button, select your LDAP Address Book, open Directory Server Properties -> General tab and change the port number to 3268. + +Then switch to Offline tab and hit on Download Now button to start replicate Samba AD LDAP database locally. + + [![Setup LDAP Offline Replica in Thunderbird](https://www.tecmint.com/wp-content/uploads/2017/05/Setup-LDAP-Offline-Replica-in-Thunderbird.png)][18] + +Setup LDAP Offline Replica in Thunderbird + + [![Download LDAP Database for Offline](https://www.tecmint.com/wp-content/uploads/2017/05/Download-Samba-LDAP-Database-Offline.png)][19] + +Download LDAP Database for Offline + +When the process of synchronizing contacts finishes you will be informed with the message Replication succeeded. Hit OK and close all windows. In case Samba domain controller cannot be reached you can still search for LDAP contacts by working in offline mode. + +-------------------------------------------------------------------------------- + +作者简介: + +I'am a computer addicted guy, a fan of open source and linux based system software, have about 4 years experience with Linux distributions desktop, servers and bash scripting. + + + +-------------- + +via: 网址 + +作者:[Matei Cezar ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/cezarmatei/ +[1]:https://www.tecmint.com/integrate-iredmail-to-samba4-ad-dc-on-centos-7/ +[2]:https://www.tecmint.com/integrate-iredmail-roundcube-with-samba4-ad-dc/ +[3]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-System-Integration.png +[4]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Mail-Account-Setup.png +[5]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-iRedMail-Settings.png +[6]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Security-Exception.png +[7]:https://www.tecmint.com/wp-content/uploads/2017/05/Domain-Mails-Inbox.png +[8]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Settings.png +[9]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Composition-Addressing-Settings.png +[10]:https://www.tecmint.com/wp-content/uploads/2017/05/Directory-Server-Properties.png +[11]:https://www.tecmint.com/wp-content/uploads/2017/05/Add-Search-Filter.png +[12]:https://www.tecmint.com/wp-content/uploads/2017/05/Select-LDAP-Directory-Server.png +[13]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Testing.png +[14]:https://www.tecmint.com/wp-content/uploads/2017/05/Search-Samba-AD-Mail-Contacts.png +[15]:https://www.tecmint.com/wp-content/uploads/2017/05/Search-Mail-Contact-in-Thunderbird.png +[16]:https://www.tecmint.com/wp-content/uploads/2017/05/Send-Mail-in-Thunderbird.jpg +[17]:https://www.tecmint.com/wp-content/uploads/2017/05/Search-Contacts-in-Samba-LDAP-Database.png +[18]:https://www.tecmint.com/wp-content/uploads/2017/05/Setup-LDAP-Offline-Replica-in-Thunderbird.png +[19]:https://www.tecmint.com/wp-content/uploads/2017/05/Download-Samba-LDAP-Database-Offline.png +[20]:https://www.tecmint.com/author/cezarmatei/ +[21]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[22]:https://www.tecmint.com/free-linux-shell-scripting-books/ From cdef1fa1ed3ad95de1512011f7075611982dd4d4 Mon Sep 17 00:00:00 2001 From: Ezio Date: Fri, 26 May 2017 09:36:56 +0800 Subject: [PATCH 0232/1407] =?UTF-8?q?20170526-2=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...introduction to Linux's EXT4 filesystem.md | 301 ++++++++++++++++++ 1 file changed, 301 insertions(+) create mode 100644 sources/tech/20170525 An introduction to Linux's EXT4 filesystem.md diff --git a/sources/tech/20170525 An introduction to Linux's EXT4 filesystem.md b/sources/tech/20170525 An introduction to Linux's EXT4 filesystem.md new file mode 100644 index 0000000000..64f1dd213a --- /dev/null +++ b/sources/tech/20170525 An introduction to Linux's EXT4 filesystem.md @@ -0,0 +1,301 @@ +An introduction to Linux's EXT4 filesystem +============================================================ + +### Take a walk through EXT4's history, features, and optimal use, and learn how it differs from previous iterations of the EXT filesystem. + + +![An introduction to the EXT4 filesystem](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/hard_drives.png?itok=yZWyaSO6 "An introduction to the EXT4 filesystem") +>Image credits : [WIlliam][8][ Warby][9]. Modified by [Jason Baker][10]. Creative Commons [BY-SA 2.0][11]. + +In previous articles about Linux filesystems, I wrote [an introduction to Linux filesystems][12] and about some higher-level concepts such as [everything is a file][13]. I want to go into more detail about the specifics of the EXT filesystems, but first, let's answer the question, "What is a filesystem?" A filesystem is all of the following: + +1. **Data storage: **The primary function of any filesystem is to be a structured place to store and retrieve data. + +2. **Namespace: **A naming and organizational methodology that provides rules for naming and structuring data. + +3. **Security model: **A scheme for defining access rights. + +4. **API: **System function calls to manipulate filesystem objects like directories and files. + +5. **Implementation: **The software to implement the above. + +This article concentrates on the first item in the list and explores the metadata structures that provide the logical framework for data storage in an EXT filesystem. + +### EXT filesystem history + +Although written for Linux, the EXT filesystem has its roots in the Minix operating system and the Minix filesystem, which predate Linux by about five years, being first released in 1987\. Understanding the EXT4 filesystem is much easier if we look at the history and technical evolution of the EXT filesystem family from its Minix roots. + +### Minix + +When writing the original Linux kernel, Linus Torvalds needed a filesystem but didn't want to write one then. So he simply included the [Minix filesystem][14], which had been written by [Andrew S. Tanenbaum][15] and was a part of Tanenbaum's Minix operating system. [Minix][16] was a Unix-like operating system written for educational purposes. Its code was freely available and appropriately licensed to allow Torvalds to include it in his first version of Linux. + +Minix has the following structures, most of which are located in the partition where the filesystem is generated: + +* A [**boot sector**][6] in the first sector of the hard drive on which it is installed. The boot block includes a very small boot record and a partition table. + +* The first block in each partition is a **superblock **that contains the metadata that defines the other filesystem structures and locates them on the physical disk assigned to the partition. + +* An **inode bitmap block**, which determines which inodes are used and which are free. + +* The **inodes**, which have their own space on the disk. Each inode contains information about one file, including the locations of the data blocks, i.e., zones belonging to the file. + +* A **zone bitmap** to keep track of the used and free data zones. + +* A **data zone**, in which the data is actually stored. + +For both types of bitmaps, one bit represents one specific data zone or one specific inode. If the bit is zero, the zone or inode is free and available for use, but if the bit is one, the data zone or inode is in use. + +What is an [inode][17]? Short for index-node, an inode is a 256-byte block on the disk and stores data about the file. This includes the file's size; the user IDs of the file's user and group owners; the file mode (i.e., the access permissions); and three timestamps specifying the time and date that: the file was last accessed, last modified, and the data in the inode was last modified. + +The inode also contains data that points to the location of the file's data on the hard drive. In Minix and the EXT1-3 filesystems, this is a list of data zones or blocks. The Minix filesystem inodes supported nine data blocks, seven direct and two indirect. If you'd like to learn more, there is an excellent PDF with a detailed description of the [Minix filesystem structure][18] and a quick overview of the [inode pointer structure][19] on Wikipedia. + +### EXT + +The original [EXT filesystem][20] (Extended) was written by [Rémy Card][21] and released with Linux in 1992 to overcome some size limitations of the Minix filesystem. The primary structural changes were to the metadata of the filesystem, which was based on the Unix filesystem (UFS), which is also known as the Berkeley Fast File System (FFS). I found very little published information about the EXT filesystem that can be verified, apparently because it had significant problems and was quickly superseded by the EXT2 filesystem. + +### EXT2 + +The [EXT2 filesystem][22] was quite successful. It was used in Linux distributions for many years, and it was the first filesystem I encountered when I started using Red Hat Linux 5.0 back in about 1997\. The EXT2 filesystem has essentially the same metadata structures as the EXT filesystem, however EXT2 is more forward-looking, in that a lot of disk space is left between the metadata structures for future use. + +Like Minix, EXT2 has a [boot sector][23] in the first sector of the hard drive on which it is installed, which includes a very small boot record and a partition table. Then there is some reserved space after the boot sector, which spans the space between the boot record and the first partition on the hard drive that is usually on the next cylinder boundary. [GRUB2][24]—and possibly GRUB1—uses this space for part of its boot code. + +The space in each EXT2 partition is divided into cylinder groups that allow for more granular management of the data space. In my experience, the group size usually amounts to about 8MB. Figure 1, below, shows the basic structure of a cylinder group. The data allocation unit in a cylinder is the block, which is usually 4K in size. + +![cylindergroup-01_1.png](https://opensource.com/sites/default/files/images/life-uploads/cylindergroup-01_1.png) + +Figure 1: The structure of a cylinder group in the EXT filesystems + +The first block in the cylinder group is a superblock, which contains the metadata that defines the other filesystem structures and locates them on the physical disk. Some of the additional groups in the partition will have backup superblocks, but not all. A damaged superblock can be replaced by using a disk utility such as **dd** to copy the contents of a backup superblock to the primary superblock. It does not happen often, but once, many years ago, I had a damaged superblock, and I was able to restore its contents using one of the backup superblocks. Fortunately, I had been foresighted and used the **dumpe2fs** command to dump the descriptor information of the partitions on my system. + +Following is the partial output from the **dumpe2fs** command. It shows the metadata contained in the superblock, as well as data about each of the first two cylinder groups in the filesystem. + +``` +# dumpe2fs /dev/sda1 +Filesystem volume name: boot +Last mounted on: /boot +Filesystem UUID: 79fc5ed8-5bbc-4dfe-8359-b7b36be6eed3 +Filesystem magic number: 0xEF53 +Filesystem revision #: 1 (dynamic) +Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir nlink extra_isize +Filesystem flags: signed_directory_hash +Default mount options: user_xattr acl +Filesystem state: clean +Errors behavior: Continue +Filesystem OS type: Linux +Inode count: 122160 +Block count: 488192 +Reserved block count: 24409 +Free blocks: 376512 +Free inodes: 121690 +First block: 0 +Block size: 4096 +Fragment size: 4096 +Group descriptor size: 64 +Reserved GDT blocks: 238 +Blocks per group: 32768 +Fragments per group: 32768 +Inodes per group: 8144 +Inode blocks per group: 509 +Flex block group size: 16 +Filesystem created: Tue Feb 7 09:33:34 2017 +Last mount time: Sat Apr 29 21:42:01 2017 +Last write time: Sat Apr 29 21:42:01 2017 +Mount count: 25 +Maximum mount count: -1 +Last checked: Tue Feb 7 09:33:34 2017 +Check interval: 0 () +Lifetime writes: 594 MB +Reserved blocks uid: 0 (user root) +Reserved blocks gid: 0 (group root) +First inode: 11 +Inode size: 256 +Required extra isize: 32 +Desired extra isize: 32 +Journal inode: 8 +Default directory hash: half_md4 +Directory Hash Seed: c780bac9-d4bf-4f35-b695-0fe35e8d2d60 +Journal backup: inode blocks +Journal features: journal_64bit +Journal size: 32M +Journal length: 8192 +Journal sequence: 0x00000213 +Journal start: 0 + +Group 0: (Blocks 0-32767) + Primary superblock at 0, Group descriptors at 1-1 + Reserved GDT blocks at 2-239 + Block bitmap at 240 (+240) + Inode bitmap at 255 (+255) + Inode table at 270-778 (+270) + 24839 free blocks, 7676 free inodes, 16 directories + Free blocks: 7929-32767 + Free inodes: 440, 470-8144 +Group 1: (Blocks 32768-65535) + Backup superblock at 32768, Group descriptors at 32769-32769 + Reserved GDT blocks at 32770-33007 + Block bitmap at 241 (bg #0 + 241) + Inode bitmap at 256 (bg #0 + 256) + Inode table at 779-1287 (bg #0 + 779) + 8668 free blocks, 8142 free inodes, 2 directories + Free blocks: 33008-33283, 33332-33791, 33974-33975, 34023-34092, 34094-34104, 34526-34687, 34706-34723, 34817-35374, 35421-35844, 35935-36355, 36357-36863, 38912-39935, 39940-40570, 42620-42623, 42655, 42674-42687, 42721-42751, 42798-42815, 42847, 42875-42879, 42918-42943, 42975, 43000-43007, 43519, 43559-44031, 44042-44543, 44545-45055, 45116-45567, 45601-45631, 45658-45663, 45689-45695, 45736-45759, 45802-45823, 45857-45887, 45919, 45950-45951, 45972-45983, 46014-46015, 46057-46079, 46112-46591, 46921-47103, 49152-49395, 50027-50355, 52237-52255, 52285-52287, 52323-52351, 52383, 52450-52479, 52518-52543, 52584-52607, 52652-52671, 52734-52735, 52743-53247 + Free inodes: 8147-16288 +Group 2: (Blocks 65536-98303) + Block bitmap at 242 (bg #0 + 242) + Inode bitmap at 257 (bg #0 + 257) + Inode table at 1288-1796 (bg #0 + 1288) + 6326 free blocks, 8144 free inodes, 0 directories + Free blocks: 67042-67583, 72201-72994, 80185-80349, 81191-81919, 90112-94207 + Free inodes: 16289-24432 +Group 3: (Blocks 98304-131071) + + +``` + +Each cylinder group has its own inode bitmap that is used to determine which inodes are used and which are free within that group. The inodes have their own space in each group. Each inode contains information about one file, including the locations of the data blocks belonging to the file. The block bitmap keeps track of the used and free data blocks within the filesystem. Notice that there is a great deal of data about the filesystem in the output shown above. On very large filesystems the group data can run to hundreds of pages in length. The group metadata includes a listing of all of the free data blocks in the group. + +The EXT filesystem implemented data-allocation strategies that ensured minimal file fragmentation. Reducing fragmentation improved filesystem performance. Those strategies are described below, in the section on EXT4. + +The biggest problem with the EXT2 filesystem, which I encountered on some occasions, was that it could take many hours to recover after a crash because the **fsck** (file system check) program took a very long time to locate and correct any inconsistencies in the filesystem. It once took over 28 hours on one of my computers to fully recover a disk upon reboot after a crash—and that was when disks were measured in the low hundreds of megabytes in size. + +### EXT3 + +The [EXT3 filesystem][25] had the singular objective of overcoming the massive amounts of time that the **fsck** program required to fully recover a disk structure damaged by an improper shutdown that occurred during a file-update operation. The only addition to the EXT filesystem was the [journal][26], which records in advance the changes that will be performed to the filesystem. The rest of the disk structure is the same as it was in EXT2. + +Instead of writing data to the disk's data areas directly, as in previous versions, the journal in EXT3 writes file data, along with its metadata, to a specified area on the disk. Once the data is safely on the hard drive, it can be merged in or appended to the target file with almost zero chance of losing data. As this data is committed to the data area of the disk, the journal is updated so that the filesystem will remain in a consistent state in the event of a system failure before all the data in the journal is committed. On the next boot, the filesystem will be checked for inconsistencies, and data remaining in the journal will then be committed to the data areas of the disk to complete the updates to the target file. + +Journaling does reduce data-write performance, however there are three options available for the journal that allow the user to choose between performance and data integrity and safety. My personal preference is on the side of safety because my environments do not require heavy disk-write activity. + +The journaling function reduces the time required to check the hard drive for inconsistencies after a failure from hours (or even days) to mere minutes, at the most. I have had many issues over the years that have crashed my systems. The details could fill another article, but suffice it to say that most were self-inflicted, like kicking out a power plug. Fortunately, the EXT journaling filesystems have reduced that bootup recovery time to two or three minutes. In addition, I have never had a problem with lost data since I started using EXT3 with journaling. + +The journaling feature of EXT3 can be turned off and it then functions as an EXT2 filesystem. The journal itself still exists, empty and unused. Simply remount the partition with the mount command using the type parameter to specify EXT2\. You may be able to do this from the command line, depending upon which filesystem you are working with, but you can change the type specifier in the **/etc/fstab** file and then reboot. I strongly recommend against mounting an EXT3 filesystem as EXT2 because of the additional potential for lost data and extended recovery times. + +An existing EXT2 filesystem can be upgraded to EXT3 with the addition of a journal using the following command. + +``` +tune2fs -j /dev/sda1 +``` + +Where **/dev/sda1** is the drive and partition identifier. Be sure to change the file type specifier in **/etc/fstab** and remount the partition or reboot the system to have the change take effect. + +### EXT4 + +The [EXT4 filesystem][27] primarily improves performance, reliability, and capacity. To improve reliability, metadata and journal checksums were added. To meet various mission-critical requirements, the filesystem timestamps were improved with the addition of intervals down to nanoseconds. The addition of two high-order bits in the timestamp field defers the [Year 2038 problem][28] until 2446—for EXT4 filesystems, at least. + +In EXT4, data allocation was changed from fixed blocks to extents. An extent is described by its starting and ending place on the hard drive. This makes it possible to describe very long, physically contiguous files in a single inode pointer entry, which can significantly reduce the number of pointers required to describe the location of all the data in larger files. Other allocation strategies have been implemented in EXT4 to further reduce fragmentation. + +EXT4 reduces fragmentation by scattering newly created files across the disk so that they are not bunched up in one location at the beginning of the disk, as many early PC filesystems did. The file-allocation algorithms attempt to spread the files as evenly as possible among the cylinder groups and, when fragmentation is necessary, to keep the discontinuous file extents as close as possible to others in the same file to minimize head seek and rotational latency as much as possible. Additional strategies are used to pre-allocate extra disk space when a new file is created or when an existing file is extended. This helps to ensure that extending the file will not automatically result in its becoming fragmented. New files are never allocated immediately after existing files, which also prevents fragmentation of the existing files. + +Aside from the actual location of the data on the disk, EXT4 uses functional strategies, such as delayed allocation, to allow the filesystem to collect all the data being written to the disk before allocating space to it. This can improve the likelihood that the data space will be contiguous. + +Older EXT filesystems, such as EXT2 and EXT3, can be mounted as EXT4 to make some minor performance gains. Unfortunately, this requires turning off some of the important new features of EXT4, so I recommend against this. + +EXT4 has been the default filesystem for Fedora since Fedora 14\. An EXT3 filesystem can be upgraded to EXT4 using the [procedure ][29]described in the Fedora documentation, however its performance will still suffer due to residual EXT3 metadata structures. The best method for upgrading to EXT4 from EXT3 is to back up all the data on the target filesystem partition, use the **mkfs** command to write an empty EXT4 filesystem to the partition, and then restore all the data from the backup. + +### Inode + +The inode, described previously, is a key component of the metadata in EXT filesystems. Figure 2 shows the relationship between the inode and the data stored on the hard drive. This diagram is the directory and inode for a single file which, in this case, may be highly fragmented. The EXT filesystems work actively to reduce fragmentation, so it is very unlikely you will ever see a file with this many indirect data blocks or extents. In fact, as you will see below, fragmentation is extremely low in EXT filesystems, so most inodes will use only one or two direct data pointers and none of the indirect pointers. + +![inodesanddataallocation-01_0.png](https://opensource.com/sites/default/files/images/life-uploads/inodesanddataallocation-01_0.png) + +Figure 2: The inode stores information about each file and enables the EXT filesystem to locate all data belonging to it. + +The inode does not contain the name of the file. Access to a file is via the directory entry, which itself is the name of the file and contains a pointer to the inode. The value of that pointer is the inode number. Each inode in a filesystem has a unique ID number, but inodes in other filesystems on the same computer (and even the same hard drive) can have the same inode number. This has implications for [links][30], and this discussion is beyond the scope of this article. + +The inode contains the metadata about the file, including its type and permissions as well as its size. The inode also contains space for 15 pointers that describe the location and length of data blocks or extents in the data portion of the cylinder group. Twelve of the pointers provide direct access to the data extents and should be sufficient to handle most files. However, for files that have significant fragmentation, it becomes necessary to have some additional capabilities in the form of indirect nodes. Technically these are not really inodes, so I use the term "node" here for convenience. + +An indirect node is a normal data block in the filesystem that is used only for describing data and not for storage of metadata, thus more than 15 entries can be supported. For example, a block size of 4K can support 512 4-byte indirect nodes, allowing **12 (direct) + 512 (indirect) = 524** extents for a single file. Double and triple indirect node support is also supported, but most of us are unlikely to encounter files requiring that many extents. + +### Data fragmentation + +For many older PC filesystems, such as FAT (and all its variants) and NTFS, fragmentation has been a significant problem resulting in degraded disk performance. Defragmentation became an industry in itself with different brands of defragmentation software that ranged from very effective to only marginally so. + +Linux's extended filesystems use data-allocation strategies that help to minimize fragmentation of files on the hard drive and reduce the effects of fragmentation when it does occur. You can use the **fsck** command on EXT filesystems to check the total filesystem fragmentation. The following example checks the home directory of my main workstation, which was only 1.5% fragmented. Be sure to use the **-n** parameter, because it prevents **fsck** from taking any action on the scanned filesystem. + +``` +fsck -fn /dev/mapper/vg_01-home +``` + +I once performed some theoretical calculations to determine whether disk defragmentation might result in any noticeable performance improvement. While I did make some assumptions, the disk performance data I used were from a new 300GB, Western Digital hard drive with a 2.0ms track-to-track seek time. The number of files in this example was the actual number that existed in the filesystem on the day I did the calculation. I did assume that a fairly large amount of the fragmented files (20%) would be touched each day. + +| **Total files** | **271,794** | +| % fragmentation | 5.00% | +| Discontinuities | 13,590 | +|   |   | +| % fragmented files touched per day | 20% (assume) | +| Number of additional seeks | 2,718 | +| Average seek time | 10.90 ms | +| Total additional seek time per day | 29.63 sec | +|   | 0.49 min | +|   |   | +| Track-to-track seek time | 2.00 ms | +| Total additional seek time per day | 5.44 sec | +|   | 0.091 min | + +Table 1: The theoretical effects of fragmentation on disk performance + +I have done two calculations for the total additional seek time per day, one based on the track-to-track seek time, which is the more likely scenario for most files due to the EXT file allocation strategies, and one for the average seek time, which I assumed would make a fair worst-case scenario. + +As you can see from Table 1, the impact of fragmentation on a modern EXT filesystem with a hard drive of even modest performance would be minimal and negligible for the vast majority of applications. You can plug the numbers from your environment into your own similar spreadsheet to see what you might expect in the way of performance impact. This type of calculation most likely will not represent actual performance, but it can provide a bit of insight into fragmentation and its theoretical impact on a system. + +Most of my partitions are around 1.5% or 1.6% fragmented; I do have one that is 3.3% fragmented but that is a large, 128GB filesystem with fewer than 100 very large ISO image files; I've had to expand the partition several times over the years as it got too full. + +That is not to say that some application environments don't require greater assurance of even less fragmentation. The EXT filesystem can be tuned with care by a knowledgeable admin who can adjust the parameters to compensate for specific workload types. This can be done when the filesystem is created or later using the **tune2fs** command. The results of each tuning change should be tested, meticulously recorded, and analyzed to ensure optimum performance for the target environment. In the worst case, where performance cannot be improved to desired levels, other filesystem types are available that may be more suitable for a particular workload. And remember that it is common to mix filesystem types on a single host system to match the load placed on each filesystem. + +Due to the low amount of fragmentation on most EXT filesystems, it is not necessary to defragment. In any event, there is no safe defragmentation tool for EXT filesystems. There are a few tools that allow you to check the fragmentation of an individual file or the fragmentation of the remaining free space in a filesystem. There is one tool, **e4defrag**, which will defragment a file, directory, or filesystem as much as the remaining free space will allow. As its name implies, it only works on files in an EXT4 filesystem, and it does have some limitations. + +If it becomes necessary to perform a complete defragmentation on an EXT filesystem, there is only one method that will work reliably. You must move all the files from the filesystem to be defragmented, ensuring that they are deleted after being safely copied to another location. If possible, you could then increase the size of the filesystem to help reduce future fragmentation. Then copy the files back onto the target filesystem. Even this does not guarantee that all the files will be completely defragmented. + +### Conclusions + +The EXT filesystems have been the default for many Linux distributions for more than 20 years. They offer stability, high capacity, reliability, and performance while requiring minimal maintenance. I have tried other filesystems but always return to EXT. Every place I have worked with Linux has used the EXT filesystems and found them suitable for all the mainstream loads used on them. Without a doubt, the EXT4 filesystem should be used for most Linux systems unless there is a compelling reason to use another filesystem. + +-------------------------------------------------------------------------------- + +作者简介: + +David Both - David Both is a Linux and Open Source advocate who resides in Raleigh, North Carolina. He has been in the IT industry for over forty years and taught OS/2 for IBM where he worked for over 20 years. While at IBM, he wrote the first training course for the original IBM PC in 1981. He has taught RHCE classes for Red Hat and has worked at MCI Worldcom, Cisco, and the State of North Carolina. He has been working with Linux and Open Source Software for almost 20 years. + +------------------- + +via: 网址 + +作者:[David Both ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/dboth +[1]:https://opensource.com/resources/what-is-linux?src=linux_resource_menu +[2]:https://opensource.com/resources/what-are-linux-containers?src=linux_resource_menu +[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=7016000000127cYAAQ +[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?src=linux_resource_menu&intcmp=7016000000127cYAAQ +[5]:https://opensource.com/tags/linux?src=linux_resource_menu +[6]:https://en.wikipedia.org/wiki/Boot_sector +[7]:https://opensource.com/article/17/5/introduction-ext4-filesystem?rate=B4QU3W_JYmEKsIKZf5yqMpztt7CRF6uzC0wfNBidEbs +[8]:https://www.flickr.com/photos/wwarby/11644168395 +[9]:https://www.flickr.com/photos/wwarby/11644168395 +[10]:https://opensource.com/users/jason-baker +[11]:https://creativecommons.org/licenses/by/2.0/ +[12]:https://opensource.com/life/16/10/introduction-linux-filesystems +[13]:https://opensource.com/life/15/9/everything-is-a-file +[14]:https://en.wikipedia.org/wiki/MINIX_file_system +[15]:https://en.wikipedia.org/wiki/Andrew_S._Tanenbaum +[16]:https://en.wikipedia.org/wiki/MINIX +[17]:https://en.wikipedia.org/wiki/Inode +[18]:http://ohm.hgesser.de/sp-ss2012/Intro-MinixFS.pdf +[19]:https://en.wikipedia.org/wiki/Inode_pointer_structure +[20]:https://en.wikipedia.org/wiki/Extended_file_system +[21]:https://en.wikipedia.org/wiki/R%C3%A9my_Card +[22]:https://en.wikipedia.org/wiki/Ext2 +[23]:https://en.wikipedia.org/wiki/Boot_sector +[24]:https://opensource.com/article/17/2/linux-boot-and-startup +[25]:https://en.wikipedia.org/wiki/Ext3 +[26]:https://en.wikipedia.org/wiki/Journaling_file_system +[27]:https://en.wikipedia.org/wiki/Ext4 +[28]:https://en.wikipedia.org/wiki/Year_2038_problem +[29]:https://docs.fedoraproject.org/en-US/Fedora/14/html/Storage_Administration_Guide/ext4converting.html +[30]:https://en.wikipedia.org/wiki/Hard_link +[31]:https://opensource.com/user/14106/feed +[32]:https://opensource.com/article/17/5/introduction-ext4-filesystem#comments +[33]:https://opensource.com/users/dboth From c2a933597b012bd30f288df407e1d5664f6d2c07 Mon Sep 17 00:00:00 2001 From: Ezio Date: Fri, 26 May 2017 09:38:38 +0800 Subject: [PATCH 0233/1407] =?UTF-8?q?20170526-3=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... a systems management library for Linux.md | 196 ++++++++++++++++++ 1 file changed, 196 insertions(+) create mode 100644 sources/tech/20170523 An introduction to Libral, a systems management library for Linux.md diff --git a/sources/tech/20170523 An introduction to Libral, a systems management library for Linux.md b/sources/tech/20170523 An introduction to Libral, a systems management library for Linux.md new file mode 100644 index 0000000000..f9e5a3957a --- /dev/null +++ b/sources/tech/20170523 An introduction to Libral, a systems management library for Linux.md @@ -0,0 +1,196 @@ +An introduction to Libral, a systems management library for Linux +============================================================ + +### Libral provides a uniform management API across system resources and serves as a solid foundation for scripting management tasks and building configuration-management systems. + + +![An introduction to Libral, a systems management library for Linux](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/yearbook-haff-rx-linux-file-lead_0.png?itok=48iDNoH8 "An introduction to Libral, a systems management library for Linux") +>Image by : [Internet Archive Book Images][10]. Modified by Opensource.com. CC BY-SA 4.0 + +Linux, in keeping with Unix traditions, doesn't have a comprehensive systems management API. Instead, management is done through a variety of special-purpose tools and APIs, all with their own conventions and idiosyncrasies. That makes scripting even simple systems-management tasks difficult and brittle. + +For example, changing the login shell of the "app" user is done by running **usermod -s /sbin/nologin app**. This works great until it is attempted on a system that does not have an app user. To fix the ensuing failure, the enterprising script writer might now resort to: + +``` +    grep -q app /etc/passwd \ +      && usermod -s /sbin/nologin app \ +      || useradd ... -s /sbin/nologin app +``` + +So that the change in the login shell is performed when the app user is present on the system, and the user is created if it is not present yet. Unfortunately, this approach to scripting systems-management tasks is not sustainable: For each kind of resource, a different set of tools and their idiosyncrasies must be taken into account; inconsistent and often incomplete error reporting makes error handling difficult; and it is easy to trip over small bugs caused by the ad hoc nature of the tools involved. + +In fact, the above example is not correct: **grep** doesn't look for the **app** user, it simply looks for any line in **/etc/passwd** that contains the string **app**, something that might work most of the time, but can fail—usually at the worst possible moment. + + + +Clearly, management tools that make it hard to perform simple tasks from scripts are, at best, a difficult basis for larger management systems. Recognizing this, existing configuration-management systems, such as Puppet, Chef, or Ansible, have gone to great lengths to build their own internal APIs around the management of basic operating system resources. These resource abstractions are internal APIs, and closely tied to the needs of their respective tools. This causes not only a colossal duplication of effort, but also creates a strong barrier to entry for new and innovative management tools. + +One area where this barrier to entry becomes evident is in building VM or container images: In the course of building such images, it is often necessary to either answer simple questions about them or make simple changes to them. But since the tools for this all require special treatment, these questions and changes face exactly the problems that somebody trying to script them faces. As a consequence, image building must rely on either ad hoc scripts or using (and installing) a quite substantial configuration-management system. + +[Libral][11] establishes a solid foundation for management tools and tasks by providing a common management API across system resources and by making it available through a command line tool, **ralsh**, that enables users to query and to modify system resources in a uniform way, with predictable error reporting. In the above example, checking whether the app user exists is done with **ralsh -aq user app**; checking whether the package **foo** is installed is done with **ralsh -aq package foo**; and, in general, checking whether a resource of type **TYPE** with name **NAME** is present is done with **ralsh -aq TYPE NAME**. Similarly, to create or change an existing user, one runs: + +``` +    ralsh user app home=/srv/app shell=/sbin/nologin +``` + +and to create or change an entry in **/etc/hosts**, one runs: + +``` + ralsh hostmyhost.example.com ip=10.0.0.1 \ + host_aliases=myhost,apphost +``` + +In this manner, the user of ralsh is isolated from the fact that these two commands work quite differently internally: The first one needs to use the proper invocation of **useradd** or **usermod**, whereas the second needs to edit the file **/etc/hosts**. For the user, though, they both appear to take the same shape: "Make sure that this resource is in the state that I need." + +### Where to get Libral and how to use it + +Libral is available from [this git repo][12]. Its core is written in C++, and instructions for building it can be found [in the repo][13]. That is only necessary if you actually want to contribute to Libral's C++ core. The Libral site also contains a [prebuilt tarball][14] that can be used on any Linux machine that uses **glibc 2.12** or later. The contents of that tarball can be used both to explore ralsh further and to develop new providers, which give Libral the capability to manage new kinds of resources. + +After downloading and unpacking the tarball, the **ralsh** command can be found in **ral/bin**. Running it without arguments will list all resource types that Libral knows about. Passing the **--help **option prints output that contains more example of how to use **ralsh**. + +### Relationship to configuration-management systems + +Well-known configuration-management systems, such as Puppet, Chef, or Ansible, address some of the same problems that Libral addresses. What sets Libral apart from them is mostly in the things that these systems do and Libral doesn't. Configuration-management systems are built to deal with the variety and complexity of managing many different things across large numbers of nodes. Libral, on the other hand, aims at providing a low-level systems management API that is well-defined, independent of any particular tool, and usable with a wide variety of programming languages. + +By removing the application logic that the large configuration-management systems contain, Libral is much more versatile in how it can be used, from the simple scripting tasks mentioned in the introduction, to serving as the building blocks for complex management applications. Focusing on these basics also allows it to be very small, currently less than 2.5 MB, an important consideration for resource-constrained environments, including containers and small devices. + +### The Libral API + +The design of the Libral API is guided by the experience of implementing large configuration-management systems over the last decade; while it is not directly tied to any of them, it takes them into account and makes choices to overcome their shortcomings. + +There are four important principles that the API design rests on: + +* Desired state  + +* Bidirectionality  + +* Lightweight abstractions + +* Ease of extension + +Basing a management API on desired state, i.e., the idea that the user expresses what the system should look like after an operation rather than how to get into that state, is hardly controversial at this point. Bidirectionality makes it possible to use the same API and, more importantly, the same resource abstractions to read existing state and to enforce changes to it. Lightweight abstractions ensure that it is easy to learn the API and make use of it quickly; past attempts at such management APIs have unduly burdened the user with learning a modeling framework, an important factor in their lack of adoption. + +Finally, it has to be easy to extend Libral's management capabilities so that users can teach Libral how to manage new kinds of resources. This is important both because of the sheer amount of resources that one might want to manage (and that Libral will manage in due time), as well as because even a fully built-out Libral will always fall short of a user's custom management needs. + +Currently, the main way to interact with the Libral API is through the **ralsh **command line tool. It exposes the underlying C++ API, which is still in flux, and is mainly geared at simple scripting tasks. The project also provides language bindings for CRuby, with others to follow. + +In the future, Libral will also provide a daemon with a remote API, so that it can serve as the basis for management systems that do not need to install additional agents on managed nodes. This, coupled with the ability to tailor the management capabilities of Libral, makes it possible to tightly control which aspects of a system can be managed and which ones are protected from any interference. + +For example, a Libral installation that is restricted to managing users and services will be guaranteed to not interfere with the packages installed on a node. Controlling what gets managed in this manner is currently not possible with any of the existing configuration-management systems; in particular, systems that require arbitrary SSH access to a managed node also expose that system to unwanted accidental or malicious interference. + +The basis of the Libral API is formed by two very simple operations: **get** to retrieve the current state of resources, and **set** to enforce the state of current resources. Idealizing a little from the actual implementation, they can be thought of as: + +``` + provider.get(names) -> List[resource] + provider.set(List[update]) -> List[change] +``` + +The **provider** is the object that knows how to manage a certain kind of resource, like a user, a service, or a package, and the Libral API provides ways to look up the provider for a certain kind of resource. + +The **get** operation receives a list of resource names, e.g., usernames, and needs to produce a list of resources, which are essentially hashes listing the attributes of each resource. This list must contain resources with the provided names, but might contain more, so that a naive **get** implementation can simply ignore the names and list all the resources it knows about. + +The **set** operation is used to enforce desired state and receives a list of updates. Each update contains **update.is**, a resource representing the current state, and **update.should**, a resource representing the desired state. Calling the **set** method will make sure that the resources mentioned in the update list will be in the state indicated in **update.should** and produces a list of the changes made to each resource. + +With **ralsh**, the current state of the **root** user can be retrieved with the command **ralsh user root**; by default, the command produces human-readable output, reminiscent of Puppet, but **ralsh** also supports a **--json** flag to make it produce JSON output for consumption by +scripts. The human-readable output is: + +``` + # ralsh user root + user::useradd { 'root': + ensure => 'present', + comment => 'root', + gid => '0', + groups => ['root'], + home => '/root', + shell => '/bin/bash', + uid => '0', + } +``` + +Similarly, the user can be changed with: + +``` + # ralsh user root comment='The superuser' + user::useradd { 'root': + ensure => 'present', + comment => 'The superuser', + gid => '0', + groups => ['root'], + home => '/root', + shell => '/bin/bash', + uid => '0', + } + comment(root->The superuser) +``` + +The output of ralsh lists both the new state of the root user, with the changed comment attribute, and what changes were made (solely to the **comment** attribute in this case). Running the same command a second time will produce much the same output, but without any change indication, as none will be needed. + +### Writing providers + +It is crucially important that writing new providers for ralsh is easy and requires a minimum amount of effort. For this reason, ralsh offers a number of calling conventions that make it possible to trade the complexity of implementing a provider against the power of what the provider can do. Providers can either be external scripts that adhere to a specific calling convention or be implemented in C++ and built into Libral. Currently, there are three calling conventions: + +* The [simple][6] calling convention is geared towards writing shell scripts that serve as providers + +* The [JSON][7] calling convention is meant for writing providers in scripting languages like Ruby or Python + +* The [internal C++ API][8] can be used to implement providers natively + +It is highly recommended to start provider development using the **simple** or the **JSON** calling convention. The file [simple.prov][15] on GitHub contains a skeleton for a simple shell provider, and it should be easy to adapt it for one's own provider. The file [python.prov][16] contains the skeleton of a JSON provider written in Python. + +One problem with using higher-level scripting languages for providers is that the runtimes, including all supporting libraries, for these languages need to be present on the system on which Libral will run. In some cases, that is not an obstacle; for example, a provider that does package management based on **yum** can expect that Python is present on the system, as **yum** is written in it. + +In many other cases though, there's no logical choice for a language beyond Bourne shell (or Bash) that can be expected to be installed on all managed systems. Often, provider writers need a more powerful scripting environment than just that. Unfortunately, bundling a full Ruby or Python interpreter with its runtime would increase Libral's size beyond what can reasonably be +used in resource-constrained environments. On the other hand, the canonical choices of Lua or Javascript as small embeddable scripting languages are not suitable for this context as they are both not familiar to most provider writers, and require quite a bit of work to expose commonly needed facilities for systems management. + +Libral bundles a version of [mruby][17], a small, embeddable version of Ruby, to give provider writers a stable foundation, and a powerful programming language for their implementation. mruby is a full implementation of the Ruby language, albeit with a much reduced standard library. The mruby bundled with Libral contains the parts of Ruby's standard library most important for scripting management tasks, which will be enhanced further over time based on the needs of provider writers. Libral's mruby also bundles an API adpater that makes writing providers to the json convention more comfortable, as it contains simple utilities (like [Augeas][18] for modifying structured files) and conveniences around parsing and outputting JSON. The file [mruby.prov][19] contains a skeleton example of a json provider written in mruby. + +### Future work + +The most important next steps for Libral are to make it more widely usable—the [precompiled tarball][20] is a great way to get started and sufficient to develop providers, but Libral also needs to be packaged and made available in mainstream distributions. In a similar vein, the utility of Libral strongly depends on the set of providers it ships with and those need to be expanded to cover a core set of management functionality. The Libral site contains [a todo list][21] showing the providers that are most urgently needed. + +There are also several ways in which the availability of Libral for different uses can be improved: from writing bindings for additional languages, for example, Python or Go, to making the use of **ralsh** in shell scripts even easier by offering, besides the existing human-readable output and JSON output, an output format that is easy to process in shell scripts. Use of Libral for larger-scale management can also be improved by adding the remote API discussed above, and by better supporting bulk installation of Libral via transports like SSH—that mostly requires providing prebuilt tarballs for more architectures and scripts that can select the right one based on the discovered architecture of the target system. + +There are many more ways in which Libral, its API, and its capabilities could evolve; one intriguing possibility is adding notification capabilities to the API so that Libral can report changes to system resources as they happen outside of its purview. The challenge for Libral will be to continue to be a small, lightweight and well-defined tool while covering an ever increasing set of uses and management capabilities—a challenge and a journey that I encourage every reader to become a part of. + +If any of this has made you curious, I would love to hear from you, be it in the form of a pull request, an enhancement request, or just a report of your experience trying out **ralsh**. + +-------------------------------------------------------------------------------- + +作者简介: + +David Lutterkort - David is a software engineer at Puppet, where he’s worked on projects such as Direct Puppet and Razor, the best provisioning tool, ever. He was one of the earliest contributors to Puppet and is the main author of Augeas, a configuration editing tool. + +------------------------ + +via: https://opensource.com/article/17/5/intro-libral-systems-management-library-linux + +作者:[David Lutterkort][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/david-lutterkort +[1]:https://opensource.com/resources/what-is-linux?src=linux_resource_menu +[2]:https://opensource.com/resources/what-are-linux-containers?src=linux_resource_menu +[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=7016000000127cYAAQ +[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?src=linux_resource_menu&intcmp=7016000000127cYAAQ +[5]:https://opensource.com/tags/linux?src=linux_resource_menu +[6]:https://github.com/puppetlabs/libral/blob/master/doc/invoke-simple.md +[7]:https://github.com/puppetlabs/libral/blob/master/doc/invoke-json.md +[8]:https://github.com/puppetlabs/libral/blob/master/doc/invoke-native.md +[9]:https://opensource.com/article/17/5/intro-libral-systems-management-library-linux?rate=PqOZGb7A0LUlHQRwkzl23iaJZ2ZUy6gKcc6HOzaRL58 +[10]:https://www.flickr.com/photos/internetarchivebookimages/14803082483/in/photolist-oy6EG4-pZR3NZ-i6r3NW-e1tJSX-boBtf7-oeYc7U-o6jFKK-9jNtc3-idt2G9-i7NG1m-ouKjXe-owqviF-92xFBg-ow9e4s-gVVXJN-i1K8Pw-4jybMo-i1rsBr-ouo58Y-ouPRzz-8cGJHK-85Evdk-cru4Ly-rcDWiP-gnaC5B-pAFsuf-hRFPcZ-odvBMz-hRCE7b-mZN3Kt-odHU5a-73dpPp-hUaaAi-owvUMK-otbp7Q-ouySkB-hYAgmJ-owo4UZ-giHgqu-giHpNc-idd9uQ-osAhcf-7vxk63-7vwN65-fQejmk-pTcLgA-otZcmj-fj1aSX-hRzHQk-oyeZfR +[11]:https://github.com/puppetlabs/libral +[12]:https://github.com/puppetlabs/libral +[13]:https://github.com/puppetlabs/libral#building-and-installation +[14]:http://download.augeas.net/libral/ralsh-latest.tgz +[15]:https://github.com/puppetlabs/libral/blob/master/examples/providers/simple.prov +[16]:https://github.com/puppetlabs/libral/blob/master/examples/providers/python.prov +[17]:http://mruby.org/ +[18]:http://augeas.net/ +[19]:https://github.com/puppetlabs/libral/blob/master/examples/providers/mruby.prov +[20]:http://download.augeas.net/libral/ralsh-latest.tgz +[21]:https://github.com/puppetlabs/libral#todo-list +[22]:https://opensource.com/user/140051/feed +[23]:https://opensource.com/users/david-lutterkort From 14ed867ee5490441d124e37f22277d9d9b05285d Mon Sep 17 00:00:00 2001 From: Ezio Date: Fri, 26 May 2017 09:39:29 +0800 Subject: [PATCH 0234/1407] =?UTF-8?q?20170526-1=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...nfigure Thunderbird with iRedMail for Samba4 AD – Part 13.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md b/sources/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md index ee45584608..2cf0bee964 100644 --- a/sources/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md +++ b/sources/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md @@ -144,7 +144,7 @@ I'am a computer addicted guy, a fan of open source and linux based system softwa -------------- -via: 网址 +via: https://www.tecmint.com/configure-thunderbird-with-iredmail-for-samba4-ad-ldap/ 作者:[Matei Cezar ][a] 译者:[译者ID](https://github.com/译者ID) From 123c0a9199877f633d34364cd666c8b112563a24 Mon Sep 17 00:00:00 2001 From: Ezio Date: Fri, 26 May 2017 09:39:48 +0800 Subject: [PATCH 0235/1407] =?UTF-8?q?20170526-2=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tech/20170525 An introduction to Linux's EXT4 filesystem.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/tech/20170525 An introduction to Linux's EXT4 filesystem.md b/sources/tech/20170525 An introduction to Linux's EXT4 filesystem.md index 64f1dd213a..d35168fcba 100644 --- a/sources/tech/20170525 An introduction to Linux's EXT4 filesystem.md +++ b/sources/tech/20170525 An introduction to Linux's EXT4 filesystem.md @@ -257,7 +257,7 @@ David Both - David Both is a Linux and Open Source advocate who resides in Ralei ------------------- -via: 网址 +via: https://opensource.com/article/17/5/introduction-ext4-filesystem 作者:[David Both ][a] 译者:[译者ID](https://github.com/译者ID) From c8ab6c885ff2294fcc705972ce2db9861b902acc Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 26 May 2017 09:40:48 +0800 Subject: [PATCH 0236/1407] translated --- ...nner to Find Security Issues in WordPress.md | 93 ------------------- ...nner to Find Security Issues in WordPress.md | 91 ++++++++++++++++++ 2 files changed, 91 insertions(+), 93 deletions(-) delete mode 100644 sources/tech/20170505 WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress.md create mode 100644 translated/tech/20170505 WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress.md diff --git a/sources/tech/20170505 WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress.md b/sources/tech/20170505 WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress.md deleted file mode 100644 index eaec79176f..0000000000 --- a/sources/tech/20170505 WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress.md +++ /dev/null @@ -1,93 +0,0 @@ -translating---geekpi - -WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress -============================================================ - -by [Aaron Kili][9] | Published: May 5, 2017 | Last Updated: May 5, 2017 - - Download Your Free eBooks NOW - [10 Free Linux eBooks for Administrators][10] | [4 Free Shell Scripting eBooks][11] - -WordPress is a free and open-source, highly customizable content management system (CMS) that is being used by millions around the world to run blogs and fully functional websites. Because it is the most used CMS out there, there are so many potential WordPress security issues/vulnerabilities to be concerned about. - -However, these security issues can be dealt with, if we follow common WordPress security best practices. In this article, we will show you how to use WPSeku, a WordPress vulnerability scanner in Linux, that can be used to find security holes in your WordPress installation and block potential threats. - -WPSeku is a simple WordPress vulnerability scanner written using Python, it can be used to scan local and remote WordPress installations to find security issues. - -### How to Install WPSeku – WordPress Vulnerability Scanner in Linux - -To install WPSeku in Linux, you need to clone the most recent version of WPSeku from its Github repository as shown. - -``` -$ cd ~ -$ git clone https://github.com/m4ll0k/WPSeku -``` - -Once you have obtained it, move into the WPSeku directory and run it as follows. - -``` -$ cd WPSeku -``` - -Now run the WPSeku using the `-u` option to specify your WordPress installation URL like this. - -``` -$ ./wpseku.py -u http://yourdomain.com -``` - [![WordPress Vulnerability Scanner](https://www.tecmint.com/wp-content/uploads/2017/05/WordPress-Vulnerability-Scanner.png)][1] - -WordPress Vulnerability Scanner - -The command below will search for cross site scripting, local file inclusion, and SQL injection vulnerabilities in your WordPress plugins using the `-p` option, you need to specify the location of plugins in the URL: - -``` -$ ./wpseku.py -u http://yourdomain.com/wp-content/plugins/wp/wp.php?id= -p [x,l,s] -``` - -The following command will execute a brute force password login and password login via XML-RPC using the option `-b`. Also, you can set a username and wordlist using the `--user` and `--wordlist` options respectively as shown below. - -``` -$ ./wpseku.py -u http://yourdomian.com --user username --wordlist wordlist.txt -b [l,x] -``` - -To view all WPSeku usage options, type. - -``` -$ ./wpseku.py --help -``` - [![WPSeku WordPress Vulnerability Scanner Help](https://www.tecmint.com/wp-content/uploads/2017/05/WPSeku-WordPress-Vulnerability-Scanner-Help.png)][2] - -WPSeku WordPress Vulnerability Scanner Help - -WPSeku Github repository: [https://github.com/m4ll0k/WPSeku][3] - -That’s it! In this article, we showed you how to get and use WPSeku for WordPress vulnerability scanning in Linux. WordPress is secure but only if we follow WordPress security best practices. Do you have any thoughts to share? If yes, then use the comment section below. - - --------------------------------------------------------------------------------- - -作者简介: - -Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. - ------------------- - -via: https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/ - -作者:[Aaron Kili ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.tecmint.com/author/aaronkili/ -[1]:https://www.tecmint.com/wp-content/uploads/2017/05/WordPress-Vulnerability-Scanner.png -[2]:https://www.tecmint.com/wp-content/uploads/2017/05/WPSeku-WordPress-Vulnerability-Scanner-Help.png -[3]:https://github.com/m4ll0k/WPSeku -[4]:https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/# -[5]:https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/# -[6]:https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/# -[7]:https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/# -[8]:https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/#comments -[9]:https://www.tecmint.com/author/aaronkili/ -[10]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ -[11]:https://www.tecmint.com/free-linux-shell-scripting-books/ diff --git a/translated/tech/20170505 WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress.md b/translated/tech/20170505 WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress.md new file mode 100644 index 0000000000..ddfc1d8eaf --- /dev/null +++ b/translated/tech/20170505 WPSeku – A Vulnerability Scanner to Find Security Issues in WordPress.md @@ -0,0 +1,91 @@ +WPSeku - 一个找出 WordPress 安全问题的漏洞扫描器 +============================================================ + +by [Aaron Kili][9] | Published: May 5, 2017 | Last Updated: May 5, 2017 + +立即下载你的免费电子书 - [10 本给管理员的免费 Linux 电子书][10] | [4 本免费的 Shell 脚本电子书][11] + +WordPress 是一个免费开源、高度可自定义的内容管理系统(CMS),它被全世界数以百万计的人来运行博客和完整的网站。因为它是被用的最多的 CMS,因此有许多潜在的 WordPress 安全问题/漏洞需要考虑。 + +然而,如果我们遵循通常的 WordPress 最佳实践,这些安全问题可以被处理。在本篇中,我们会向你展示如何使用 WPSeku,一个 Linux 中的 WordPress 漏洞扫描器,它可以被用来找出你的 WordPress 安装的安全漏洞,并阻止潜在的威胁。 + +WPSeku 是一个用 Python 写的简单 WordPress 漏洞扫描器,它可以被用来扫描本地以及远程的 WordPress 安装来找出安全问题。 + +### 如何安装 WPSeku - Linux 中的 WordPress 漏洞扫描器 + +要在 Linux 中安装 WPSeku,你需要如下从 Github clone 最新版本的 WPSeku。 + +``` +$ cd ~ +$ git clone https://github.com/m4ll0k/WPSeku +``` + +完成之后,进入 WPSeku 目录,并如下运行。 + +``` +$ cd WPSeku +``` + +使用 `-u` 选项指定 WordPress 的安装 URL,如下运行 WPSeku: + +``` +$ ./wpseku.py -u http://yourdomain.com +``` + [![WordPress Vulnerability Scanner](https://www.tecmint.com/wp-content/uploads/2017/05/WordPress-Vulnerability-Scanner.png)][1] + +WordPress 漏洞扫描器 + +以下命令使用 `-p` 选项搜索 WordPress 插件中的跨站脚本、本地文件夹入和 SQL 注入漏洞,你需要在 URL 中指定插件的位置: + +``` +$ ./wpseku.py -u http://yourdomain.com/wp-content/plugins/wp/wp.php?id= -p [x,l,s] +``` + +以下命令将使用 `-b` 选项通过 XML-RPC 执行暴力密码登录。另外,你可以使用 `--user` 和 `--wordlist` 选项分别设置用户名和单词列表,如下所示。 + +``` +$ ./wpseku.py -u http://yourdomian.com --user username --wordlist wordlist.txt -b [l,x] +``` + +要浏览所有 WPSeku 使用选项,输入: + +``` +$ ./wpseku.py --help +``` + [![WPSeku WordPress Vulnerability Scanner Help](https://www.tecmint.com/wp-content/uploads/2017/05/WPSeku-WordPress-Vulnerability-Scanner-Help.png)][2] + +WPSeku WordPress 漏洞扫描帮助 + +WPSeku Github 仓库:[https://github.com/m4ll0k/WPSeku][3] + +就是这样了!在本篇中,我们向你展示了如何在 Linux 中获取并使用 WPSeku 用于 WordPress 漏洞扫描。WordPress 是安全的,但仅在如果我们遵循 WordPress 安全最佳实践的情况下。你有要分享的想法么?如果有,请在评论区留言。 + + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Kili 是一个 Linux 及 F.O.S.S 热衷者,即将成为 Linux 系统管理员、web 开发者,目前是 TecMint 的内容创作者,他喜欢用电脑工作,并坚信分享知识。 + +------------------ + +via: https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/ + +作者:[Aaron Kili ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://www.tecmint.com/wp-content/uploads/2017/05/WordPress-Vulnerability-Scanner.png +[2]:https://www.tecmint.com/wp-content/uploads/2017/05/WPSeku-WordPress-Vulnerability-Scanner-Help.png +[3]:https://github.com/m4ll0k/WPSeku +[4]:https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/# +[5]:https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/# +[6]:https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/# +[7]:https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/# +[8]:https://www.tecmint.com/wpseku-wordpress-vulnerability-security-scanner/#comments +[9]:https://www.tecmint.com/author/aaronkili/ +[10]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[11]:https://www.tecmint.com/free-linux-shell-scripting-books/ From 026bec432e93806c535e24fd8fd782b2b7c07d34 Mon Sep 17 00:00:00 2001 From: Ezio Date: Fri, 26 May 2017 09:43:05 +0800 Subject: [PATCH 0237/1407] =?UTF-8?q?20170526-4=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...04 A beginner s guide to Linux syscalls.md | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 sources/tech/20170504 A beginner s guide to Linux syscalls.md diff --git a/sources/tech/20170504 A beginner s guide to Linux syscalls.md b/sources/tech/20170504 A beginner s guide to Linux syscalls.md new file mode 100644 index 0000000000..4cdea16ab8 --- /dev/null +++ b/sources/tech/20170504 A beginner s guide to Linux syscalls.md @@ -0,0 +1,58 @@ +A beginner's guide to Linux syscalls +============================================================ + +![A beginner's guide to Linux syscalls](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/rh_003499_01_linux11x_cc.png?itok=ZivAkk-L "A beginner's guide to Linux syscalls") +>Image by : opensource.com + +Over the last couple of years, I've been doing a lot of work with containers. Early on I saw a fascinating talk by [Julien Friedman][7] where he wrote a bare-bones container in a few lines of Go. It gave me that "a-ha" moment where I grasped that containers are nothing more than Linux processes with a restricted view of the machine they're running on. + +Building this restricted view involved quite a few calls in [Golang's syscall package][8]. Initially, I just took that at face value, but after a while, I wanted to peel away the next layer of the onion to see what these syscalls are all about and how they work. I'll share what I learned in my talk at OSCON. + + +As the name suggests, [syscalls][9] are system calls, and they're the way that you can make requests from user space into the Linux kernel. The kernel does some work for you, like creating a process, then hands control back to user space. + +There is a common mechanism for making all system calls transition into the kernel, which is handled by the **libc **library. Userspace code sets up some registers including an ID of the system call it wants to make and any parameters it needs to pass to the system call. It triggers a "trap" to transition control to the kernel. + +That's how userspace code makes requests of the kernel, but Linux also has pseudo filesystems that allow the kernel to communicate information to user space. The contents look like ordinary directories and files. + +The **/proc** directory is a great example. Look inside, and you'll find all sorts of interesting information about the processes running on a machine. In some cases, like **cgroups **(control groups), user space can configure parameters by writing into files under these pseudo filesystems. + +It's particularly interesting when you're using containers because the host's **/proc** holds information about all the containerized processes. This includes environment variables, which are also stored in the **/proc**pseudo-filesystem, meaning that your host machine has access to the environment for all your running containers. This potentially has security consequences if you're passing secrets like certificates or database passwords into your containers through environment variables. + +Many programmers working on normal applications may not feel that they're using syscalls very often. In practice, they are, because even everyday activities like making files or changing directories involve syscalls on Linux. + +You don't have to be a systems programmer to have fun with syscalls! + + _If you’d like to learn more, Liz will be presenting _ [_A Beginner's Guide To Syscalls_][10] _at OSCON 2017 in Austin, Texas. If you’re interested in attending the conference, use this discount code _ [when you register][11] _:_  **PCOS** _._ + +-------------------------------------------------------------------------------- + +作者简介: + +Liz Rice - Liz Rice is the Technology Evangelist with container security specialists Aqua Security. Prior to that she co-founded Microscaling Systems and developed their real-time scaling engine, and the popular image metadata site MicroBadger.com. She has a wealth of software development, team, and product management experience from working on network protocols and distributed systems, and in digital technology sectors such as VOD, music, and VoIP. + +---------- + + +via: https://opensource.com/article/17/5/beginners-guide-syscalls + +作者:[Liz Rice ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/lizrice +[1]:https://opensource.com/resources/what-is-linux?src=linux_resource_menu +[2]:https://opensource.com/resources/what-are-linux-containers?src=linux_resource_menu +[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=7016000000127cYAAQ +[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?src=linux_resource_menu&intcmp=7016000000127cYAAQ +[5]:https://opensource.com/tags/linux?src=linux_resource_menu +[6]:https://opensource.com/article/17/5/beginners-guide-syscalls?rate=BT-vq0qMILAvJVxPFqug17N1RfhoAb_vkwNqRZFAqLQ +[7]:https://twitter.com/doctor_julz +[8]:https://golang.org/pkg/syscall/ +[9]:http://man7.org/linux/man-pages/man2/syscalls.2.html +[10]:https://conferences.oreilly.com/oscon/oscon-tx/public/schedule/detail/56840 +[11]:http://www.oreilly.com/pub/cpc/44407?sc_cid=701600000012BzSAAU%20target=%22_blank%22 +[12]:https://opensource.com/user/129431/feed +[13]:https://opensource.com/users/lizrice From dc4e45a0bb4b1ee2a3936a89704194347458246a Mon Sep 17 00:00:00 2001 From: Ezio Date: Fri, 26 May 2017 09:43:45 +0800 Subject: [PATCH 0238/1407] =?UTF-8?q?20170526-3=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...roduction to Libral a systems management library for Linux.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sources/tech/{20170523 An introduction to Libral, a systems management library for Linux.md => 20170523 An introduction to Libral a systems management library for Linux.md} (100%) diff --git a/sources/tech/20170523 An introduction to Libral, a systems management library for Linux.md b/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md similarity index 100% rename from sources/tech/20170523 An introduction to Libral, a systems management library for Linux.md rename to sources/tech/20170523 An introduction to Libral a systems management library for Linux.md From 8b4ae54aad1b1caa2a862ed7ca45e3e520ddf062 Mon Sep 17 00:00:00 2001 From: Ezio Date: Fri, 26 May 2017 09:44:03 +0800 Subject: [PATCH 0239/1407] =?UTF-8?q?20170526-2=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ....md => 20170525 An introduction to Linux s EXT4 filesystem.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename sources/tech/{20170525 An introduction to Linux's EXT4 filesystem.md => 20170525 An introduction to Linux s EXT4 filesystem.md} (100%) diff --git a/sources/tech/20170525 An introduction to Linux's EXT4 filesystem.md b/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md similarity index 100% rename from sources/tech/20170525 An introduction to Linux's EXT4 filesystem.md rename to sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md From d7f94709be34421e40d8d54022029b144f9f5bc2 Mon Sep 17 00:00:00 2001 From: Ezio Date: Fri, 26 May 2017 09:46:36 +0800 Subject: [PATCH 0240/1407] =?UTF-8?q?20170526-5=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...vices for hosting open source libraries.md | 108 ++++++++++++++++++ 1 file changed, 108 insertions(+) create mode 100644 sources/tech/20170426 Top 4 CDN services for hosting open source libraries.md diff --git a/sources/tech/20170426 Top 4 CDN services for hosting open source libraries.md b/sources/tech/20170426 Top 4 CDN services for hosting open source libraries.md new file mode 100644 index 0000000000..1f7cc2d7b4 --- /dev/null +++ b/sources/tech/20170426 Top 4 CDN services for hosting open source libraries.md @@ -0,0 +1,108 @@ +Top 4 CDN services for hosting open source libraries +============================================================ + +### Content delivery networks accelerate your website's images, CSS files, JS files, and other static content. + + +![Top 4 CDN services for hosting open source libraries](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/file_system.jpg?itok=s2b60oIB "Top 4 CDN services for hosting open source libraries") +>Image credits : [Open Clip Art Library][3], which released it explicitly into the **[public domain][1]** ([see here][4]). Modified by Jen Wike Huger. + +A CDN, or content delivery network, is a network of strategically placed servers located around the world used for the purpose of delivering files faster to users. A traditional CDN will allow you to accelerate your website's images, CSS files, JS files, and any other piece of static content. This allows website owners to accelerate all of their own content as well as provide them with additional features and configuration options. These premium services typically require payment based on the amount of bandwidth a project uses. + +However, if your project doesn't justify the cost of implementing a traditional CDN, the use of an open source CDN may be more suitable. Typically, these types of CDNs allow you to link to popular web-based libraries (CSS/JS frameworks, for example), which are then delivered to your web visitors from the free CDN's servers. Although CDN services for open source libraries do not allow you to upload your own content to their servers, they can help you accelerate libraries globally and improve your website's redundancy. + +CDNs host projects on a vast network of servers, so website maintainers need to modify their asset links in the website's HTML code to reflect the open source CDN's URL followed by the path to the resource. Depending upon whether you're linking to a JavaScript or CSS library, the links you'll include will live in either a + + + + - - -``` - -10\. 保存文件,进入你的web 浏览器目录,然后打开那个网页。你会看到两个按钮,它们可以打开和关闭灯泡。基于同样的想法,你还可以使用bootstrap和CSS来创建一个更加漂亮的web界面。 - -### 在这个网页上观察温度 - -1\. 新建一个temperature.php的文件: - -``` -sudo nano temperature.php -``` - -2\. 在文件中加入下面的代码,用你自己的设备ID替换10-000802292522: - -``` - -``` - -3\. 打开你刚刚创建的HTML文件,并创建一个新的带有 **id** “screen”的 `
`标签 -``` -
-``` - -4\. 在这个标签后或者这个文档的尾部下面的代码: - -``` - -``` - -其中,`#screen`是标签`
`的`id`,你想在它里面显示温度。它会每隔1000毫秒加载一次`temperature.php`文件。 - -我使用了bootstrap框架来制作一个漂亮的面板来显示温度,你还可以加入多个icons和 glyphicons让网页更有吸引力。 - -这只是一个控制继电器板并显示温度的基础的系统,你可以通过创建基于定时和从恒温器读数等基于事件触发来进一步地对系统进行开发。 - --------------------------------------------------------------------------------- - - -作者简介: - -Abdul Hannan Mustajab: 我17岁,生活在印度。我正在追求科学,数学和计算机科学方面的教育。我在spunkytechnology.com上发表关于我的项目的博客。我一直在对使用不同的微控制器和电路板的基于物联网的AI进行研究。 - - -via: https://opensource.com/article/17/3/operate-relays-control-gpio-pins-raspberry-pi - -作者:[ Abdul Hannan Mustajab][a] -译者:[译者ID](https://github.com/zhousiyu325) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/mustajabhannan -[1]:http://www.php.net/system -[2]:http://www.php.net/system -[3]:http://www.php.net/system -[4]:http://www.php.net/system -[5]:http://www.php.net/system -[6]:http://www.php.net/file -[7]:http://www.php.net/explode -[8]:http://www.php.net/number_format -[9]:https://opensource.com/article/17/3/operate-relays-control-gpio-pins-raspberry-pi?rate=RX8QqLzmUb_wEeLw0Ee0UYdp1ehVokKZ-JbbJK_Cn5M -[10]:https://opensource.com/user/123336/feed -[11]:https://opensource.com/users/mustajabhannan - - From 32bc3d55bcc453c30926f037f988811cb3c4521a Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 14 Jun 2017 09:05:35 +0800 Subject: [PATCH 0426/1407] translated --- ...o get started with open source hardware.md | 99 ------------------- ...o get started with open source hardware.md | 99 +++++++++++++++++++ 2 files changed, 99 insertions(+), 99 deletions(-) delete mode 100644 sources/tech/20170508 8 ways to get started with open source hardware.md create mode 100644 translated/tech/20170508 8 ways to get started with open source hardware.md diff --git a/sources/tech/20170508 8 ways to get started with open source hardware.md b/sources/tech/20170508 8 ways to get started with open source hardware.md deleted file mode 100644 index a3dfd676c1..0000000000 --- a/sources/tech/20170508 8 ways to get started with open source hardware.md +++ /dev/null @@ -1,99 +0,0 @@ -translating---geekpi - -8 ways to get started with open source hardware -============================================================ - -### Making your own hardware is easier and less expensive than ever. Here's what you need to design, build, and test your first board. - - -![8 ways to get started with open source hardware](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/hardware_hammer_sign.jpg?itok=vh76LBib "8 ways to get started with open source hardware") ->Image by : Thomas Hawk on [Flickr][11]. [CC BY-NC 2.0][12]. Modified by Opensource.com - -Alan Kay, famed computer scientist, once said, "People who are really serious about software should make their own hardware." I'd argue that's as true today as it was in 1982 when he said it. However, what's changed between then and now is that hardware has gotten faster, smaller, and most importantly: cheaper. it's now possible to buy a full computer for $5. - -With big companies driving down prices for their own products, it's grown a manufacturing ecosystem capable of producing production-grade hardware that's cheap enough and accessible enough that it is now within reach of normal individuals. This accessibility and affordability are helping drive things like crowdfunding and the maker movement, but they're also giving way to more individuals being able to participate in open source through open source hardware. - -Explore open hardware - -* [What is open hardware?][1] - -* [What is Raspberry Pi?][2] - -* [What is an Arduino?][3] - -* [Our latest open hardware articles][4] - -There's some pretty big differences in what is or isn't open source hardware, but the Open Source Hardware Association (OSHWA) has a definition that most folks agree with, and if you're familiar with open source software this shouldn't sound too weird: - -> "Open source hardware (OSHW) is a term for tangible artifacts—machines, devices, or other physical things—whose design has been released to the public in such a way that anyone can make, modify, distribute, and use those things." - -There's lots of open source hardware around; you may not have noticed the boards you already use may, in fact, be open hardware. From the humble but ever versatile [Arduino][13] and all the way up through full computers like the [BeagleBone][14] family and the [C.H.I.P.][15] computer, there are lots of examples of open hardware around, and more designs are being made all the time. - -Hardware can be complicated, and sometimes non-obvious to beginners why a design needs something. But open source hardware gives you the ability to not only see working examples, but also the ability to change those designs or strike off and replicate the pieces you need in your own designs, and it might be as simple as copy and paste. - -### How can I get started? - -Let's start off by pointing out that hardware is hard, it's complicated, sometimes esoteric, and the tools you may be using are not always the most user-friendly. It's also more than likely, as anyone who's played around with a microcontroller long enough can attest: you are going to fry something and let the magic smoke out at some point. It's ok, we've all done it, some of us repeatedly because we didn't learn the lesson the first 100 times we did something, but don't let this discourage you: Lessons are learned when things go wrong, and you usually get an interesting story to tell later. - -### Modeling - -The first thing to do is to start modeling what you want to do with an existing board, jumper wires, a breadboard, and whatever devices you want to hook up. In many cases, the simplest thing to play with is just adding more LEDs to a board and getting them to blink in novel ways. This is a great way to prototype something, and it's a fairly common thing to do. It won't look pretty, and you may find that you wire something wrong, but these are prototypes—you just want to prove things work. When things don't work, always double check everything, and don't be afraid to ask for help—sometimes a second pair of eyes will find your oddball ground short. - -### Design - -When you've figured out what you want to build, it's time to start taking your idea from jumper wires and breadboards to an actual design. This is where things can get a bit daunting, but start small—in fact, it's worth starting really small just to get used to the tooling and process, so why not make a printed circuit board that has a LED and a battery on it? Seriously, this might sound overly simplistic but there's a lot of new ground to cover here. - -1. **Find an electronic design automation (EDA) tool to use.** There are some good open source software options out there, but they aren't always the most user-friendly. [Fritzing][5], [gEDA][6], and [KiCad ][7]are all open source in ascending order of approachability. There are also some options if you want to try more commercial offerings; Eagle has a free version available with some restrictions and a lot of open source hardware designs are done in it. - -1. **Design your board in your EDA tool.** Depending on the tool you choose, this could be fairly quick, or it could be quite the exercise in learning how things work. This is one of the reasons I suggest starting small; a circuit with an LEDaan be as simple as a battery, a resistor, and an LED. The schematic capture is pretty simple, and the layout can be small and very simple. - -1. **Export your design for manufacturing.** This goes hand-in-hand with the next thing on the list, but it can also be a confusing process if you haven't done it before. There's a lot of knobs and dials to twist and adjust when you do the export, and things need to be exported in certain ways to make it easier on board houses to actually figure out what you want them to make. - -1. **Find a board house.** There are lots of board houses out there that can make your design, and some are more friendly and helpful than others. One place that's particularly awesome to work with is [OSH Park][8], these guys are very friendly and supportive of open source hardware. They also have a very solid process for confirming that what you are sending them is what will get built, so they are worth checking out. There are lots of other options though; take a look at [PCB Shopper][9], which lets you compare pricing, turnaround times, etc. of a number of solid PCB manufacturers. - -1. **Wait.** This might be the hardest part of building your own board, as it takes time to make something digital into a physical product. Plan on two weeks from when you hit "go" to getting your boards back. This is a great time to work on your next project, ensure or acquire all the parts for your current build, or generally try not to worry. On your first board it's hard—you really want it now, but be patient. - -1. **Solder up and bring up.** Once you've got your board, it's time to make it up and then test it. If you've gone with the LED option to start, it should be fairly easy to debug, and you'll have something that works. If you went more complex, be methodical and patient; sometimes things don't work and you'll need all your debugging skills to track things down. - -1. **Last, if you are doing open source hardware, release it.** We are talking about open source hardware, so make sure you include a license, but release it, share it, put it somewhere people can see what you've done. You may even want to write a blog post and submit it to someplace like Hackaday. - -1. **Above all, have fun.** Frankly if you are doing something and you aren't having fun, you should stop doing it. Open source hardware can be a lot of fun, though sometimes hard and complicated. Not everything may work; heck, I've had designs where half the board wasn't working or where I (accidentally) caused 12 shorts between power and ground. Were those boards bunked boards: yup. Did I learn something in the process: A LOT, and I won't make those same mistakes again. I'll make new ones, sure, but not THOSE. (I'd point and glare at those boards and their mistakes, but they wouldn't feel bad for me glaring at them, sadly). - -There's a lot of open source hardware out there and lots of good examples to look at, copy, and derive from and lots of information to help make building hardware easier. That's what open source hardware is: A community of people making things and sharing them so that everyone can make their own things and build the hardware that they want—not the hardware they can get. - --------------------------------------------------------------------------------- - - - -作者简介: - -John 'Warthog9' Hawley - John works for VMware in the Open Source Program Office on upstream open source projects. In a previous life he's worked on the MinnowBoard open source hardware project, led the system administration team on kernel.org, and built desktop clusters before they were cool. For fun he's built multiple star ship bridges, a replica of K-9 from a popular British TV show, done in flight computer vision processing from UAVs, designed and built a pile of his own hardware. - -------------------------------------- - -via: https://opensource.com/article/17/5/8-ways-get-started-open-source-hardware - -作者:[John 'Warthog9' Hawley ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/article/17/5/8-ways-get-started-open-source-hardware -[1]:https://opensource.com/resources/what-open-hardware?src=open_hardware_resources_menu -[2]:https://opensource.com/resources/what-raspberry-pi?src=open_hardware_resources_menu -[3]:https://opensource.com/resources/what-arduino?src=open_hardware_resources_menu -[4]:https://opensource.com/tags/hardware?src=open_hardware_resources_menu -[5]:http://fritzing.org/home/ -[6]:http://www.geda-project.org/ -[7]:http://kicad-pcb.org/ -[8]:https://oshpark.com/ -[9]:http://pcbshopper.com/ -[10]:https://opensource.com/article/17/5/8-ways-get-started-open-source-hardware?rate=jPBGDIa2vBXW6kb837X8JWdjI2V47hZ4KecI8-GJBjQ -[11]:https://www.flickr.com/photos/thomashawk/3048157616/in/photolist-5DmB4E-BzrZ4-5aUXCN-nvBWYa-qbkwAq-fEFeDm-fuZxgC-dufA8D-oi8Npd-b6FiBp-7ChGA3-aSn7xK-7NXMyh-a9bQQr-5NG9W7-agCY7E-4QD9zm-7HLTtj-4uCiHy-bYUUtG -[12]:https://creativecommons.org/licenses/by-nc/2.0/ -[13]:https://opensource.com/node/20751 -[14]:https://opensource.com/node/35211 -[15]:https://opensource.com/node/24891 -[16]:https://opensource.com/user/130046/feed -[17]:https://opensource.com/users/warthog9 diff --git a/translated/tech/20170508 8 ways to get started with open source hardware.md b/translated/tech/20170508 8 ways to get started with open source hardware.md new file mode 100644 index 0000000000..235f1a8a61 --- /dev/null +++ b/translated/tech/20170508 8 ways to get started with open source hardware.md @@ -0,0 +1,99 @@ +8 种方式开始使用开源硬件 +============================================================ + +### 制造自己的硬件比以往任何时候都更容易,更便宜。以下是你需要设计,构建和测试你的第一块电路板。 + + +![8 ways to get started with open source hardware](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/hardware_hammer_sign.jpg?itok=vh76LBib "8 ways to get started with open source hardware") +>图片提供: Thomas Hawk on [Flickr][11]. [CC BY-NC 2.0][12]. 由 Opensource.com 修改 + +著名的计算机科学家 Alan Kay 曾经说过:“认真对待软件的人应该制造它们自己的硬件。” 我认为今天就如 1982 年他所说的一样真实。然而,现在和那时之间的变化是硬件变得越来越快,越来越小,最重要的是:更便宜。 现在可以用 5 美元购买一台完整的电脑。 + +随着大公司降低自己产品的价格,它发展了一个能够生产生产级硬件的制造业生态系统,它的成本足够便宜,并且达到了普通人都可以接受的程度。这种可用性以及可负担性正在帮助推动诸如众筹和制造商运动之类的事情,但他们也让更多的个人能够通过开源硬件参与开源。 + +探索开放硬件 + +* [什么是开放硬件?][1] + +* [什么是树莓派?][2] + +* [什么是 Arduino?][3] + +* [我们最新的开放硬件文章][4] + +什么是或者不是开源硬件有很多区别,但是开源硬件联盟(OSHWA)定义了一个大多数人同意的定义,如果你熟悉开源软件,这不会听上去太奇怪: + + +> “开源硬件(OSHW)是有形人工机器、设备或者其他物理东西的术语-其设计像公众发布,任何人可以制造、修改、分发并使用那些。” + +周围已经有很多开源硬件了。你可能没有注意到你在使用的主板可能实际上是开放的硬件。从[低调]但通用的[Arduino][13],一直到像 [BeagleBone][14] family 和 [C.H.I.P.][15] 计算机这样的完整功能的电脑,这有很多开放硬件的例子,还有更多的在设计中。 + +硬件可能很复杂,对初学者而言为什么设计需要这些有时不太明显。但开源硬件使你不仅可以看到工作示例,还可以更改这些设计,或者在你自己的设计中复制所需的部分,就如复制和粘贴一样简单。 + +### 我该如何开始? + +我们先要指出硬件很难,它很复杂,有时是深奥的,你可能用到的工具并不总是最人性化的。任何一个玩微处理器的时间足够长的人都可以证明有一种可能:你会烧坏一些东西,看到神奇的烟雾在某个时刻冒出来。没关系,我们都做过,有些人还会反复做,因为我们在做一件事情的前 100 次时都不会得到教训,但不让让这阻碍你:当做错事情时,你会学到教训,而且你将来还会有有趣的故事告诉别人。 + +### 建模 + +首先要做的是开始使用现有的电路板,跳线、面包板以及你要连接的任何设备来建模你想要做的事情。在许多情况下,最简单的事情就是在板上添加更多的 LED,并以新颖的方式让它们闪烁。这是一个很好的出原型的方式,也是一个很常见的事情。它看上去不漂亮,你可能会发现你的线接错了,但这些都是原型 - 你只是想证明硬件可以工作。当硬件不工作时,一定要仔细检查一切,不要害怕寻求帮助 - 有时第二双眼睛会发现你奇怪的接地短路。 + +### 设计 + +当你弄清楚你想要构建的硬件,现在是时候把你的想法从跳线和面包板变成实际的设计了。这时事情会变得让人气馁,但是从小的开始,事情上,可以从熟悉加工和流程这样非常小的开始,所以为什么不制作一块带有 LED 和电池的印刷电路板?认真地说,这可能听起来过于简单,但在这里有很多新的基础要了解。 + +1. **找到一个电子设计自动化(EDA)工具来使用。** 这有很多好的开源软件可以选择,但是它们并不总是用户友好的。[Fritzing][5]、[gEDA][6] 还有 [KiCad ][7] 都是开源的,并以可用性升序排序。如果你想要尝试更多的商业软件,那么还有一些其他的选择。Eagle 有受限的免费版本使用,有许多的开源硬件是用它设计的。 + +2. **在 EDA 工具中设计你的电路板。** 依据你选择的工具,这可能会非常快,或者可能是学习如何设计的很好的练习。这是我建议从小的硬件开始的原因之一。一个带 LDED 的电路可以如一块电池、一个电阻、一个 LED 一样简单。电路图非常简单,并且布局也会非常小、非常简单。 + +3. **为制造导出设计。** 这与列表中的下一件事情紧密相连,但如果你以前没有这样做,这也可能是一个令人困惑的过程。当你在导出时,你会有很多细节需要调整,并且需要以某种方式导出以便电路板工厂能确切知道你要做的。 + +4. **找到一个电路板工厂。** 有许多电路板工厂可以制作你的设计,并且一些比其他更加友好及有帮助。一个特别棒的地方是 [OSH Park][8],这些人非常友好并支持开源硬件。他们也有一个非常扎实的流程来确认你发送给它的就是会被制造的,所以他们值得一试。还有很多其他选择; 看看 [PCB Shopper][9],它可以让你比较不同实体 PCB 商家的价格、周转时间等等。 + +5. **等待。** 这或许是在制造你自己的电路板中最难的一部分了,因为它会花费时间将数字部分变成物理产品。计划好两周时间来拿到你的电路板。这是你继续下个项目的绝好时间,确保或获取你当前制造的所有部分,或者通常上尝试不要担心。你的第一块电路板是艰难的 - 你现在非常想要,但是保持耐心。 + +6. **修补并提升。** 一旦拿到你的板子,是时候上电测试了。如果你是以 LED 电路开始,那么它很容易调试,并且你会得到一些可以工作的东西。如果你有更复杂的电路,那么需要有条理并且有耐心。有时候电路不会工作,并且你需要用你的调试技能来追踪问题。 + +7. **最后,如果你做的是开源硬件,那就发布它。*** 我们谈论的是开源硬件,因此确保包含了一个许可,但是发布它、共享它,把它放在人们可以看见你所做的地方。你或许会想写一篇博客并提交到如 Hackaday 上面。 + +8. **最重要的是,玩得开心。** 坦白说,如果你在说一些事但是你不开心,你应该停止这样做。开源硬件可以很有趣,虽然有时是困难而且复杂的。但是不是一切都会正常。见鬼,我已经设计了一半的电路不工作,或者我(意外地)在电源和接地之间造成了 12 次短路。这些电路板是双层板:是的。我在这个过程中学到了一些东西:非常多,并且我不会再犯同样的错误。我会做出新的板子,但不是这些。(我会支持并盯着这些板子和它们的错误,悲伤的是,它们不会在我盯着它们时感到难受)。 + +build the hardware that they want—not the hardware they can get. +现在有许多的开源硬件,以及从中可以查看、复制、衍生,并且有很多信息使制造硬件变得简单。这就是开源硬件:一个社区的人们制造它们,共享它们,这样每个人可以制作他们自己的东西并构建他们想要的硬件 - 而不是他们可以得到的硬件。 + +-------------------------------------------------------------------------------- + + + +作者简介: + +John 'Warthog9' Hawley - John 在 VMWare 的开源项目办公室为上游开源项目工作。在以前的生活中,他曾在 MinnowBoard 开源硬件项目上工作,领导了 kernel.org 上的系统管理团队,并在桌面集群变得很酷之前构建了它们。为了乐趣,他构建了多个明星项目,一个受欢迎的英国电视节目 K-9 的复制品,在无人机的飞行计算机视觉处理中完成,设计并制作了一堆自己的硬件。 + +------------------------------------- + +via: https://opensource.com/article/17/5/8-ways-get-started-open-source-hardware + +作者:[John 'Warthog9' Hawley ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/article/17/5/8-ways-get-started-open-source-hardware +[1]:https://opensource.com/resources/what-open-hardware?src=open_hardware_resources_menu +[2]:https://opensource.com/resources/what-raspberry-pi?src=open_hardware_resources_menu +[3]:https://opensource.com/resources/what-arduino?src=open_hardware_resources_menu +[4]:https://opensource.com/tags/hardware?src=open_hardware_resources_menu +[5]:http://fritzing.org/home/ +[6]:http://www.geda-project.org/ +[7]:http://kicad-pcb.org/ +[8]:https://oshpark.com/ +[9]:http://pcbshopper.com/ +[10]:https://opensource.com/article/17/5/8-ways-get-started-open-source-hardware?rate=jPBGDIa2vBXW6kb837X8JWdjI2V47hZ4KecI8-GJBjQ +[11]:https://www.flickr.com/photos/thomashawk/3048157616/in/photolist-5DmB4E-BzrZ4-5aUXCN-nvBWYa-qbkwAq-fEFeDm-fuZxgC-dufA8D-oi8Npd-b6FiBp-7ChGA3-aSn7xK-7NXMyh-a9bQQr-5NG9W7-agCY7E-4QD9zm-7HLTtj-4uCiHy-bYUUtG +[12]:https://creativecommons.org/licenses/by-nc/2.0/ +[13]:https://opensource.com/node/20751 +[14]:https://opensource.com/node/35211 +[15]:https://opensource.com/node/24891 +[16]:https://opensource.com/user/130046/feed +[17]:https://opensource.com/users/warthog9 From aa1f80a18e9f414952c1933215e2f5e477bde9bc Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 14 Jun 2017 09:09:42 +0800 Subject: [PATCH 0427/1407] translating --- .../talk/20170516 How Microsoft is becoming a Linux vendor.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/talk/20170516 How Microsoft is becoming a Linux vendor.md b/sources/talk/20170516 How Microsoft is becoming a Linux vendor.md index 0909b4999b..14fb36fb92 100644 --- a/sources/talk/20170516 How Microsoft is becoming a Linux vendor.md +++ b/sources/talk/20170516 How Microsoft is becoming a Linux vendor.md @@ -1,3 +1,5 @@ +transalting---geekpi + How Microsoft is becoming a Linux vendor ===================================== From 6b416a74163a57fba838d89710054a473d424013 Mon Sep 17 00:00:00 2001 From: ictlyh Date: Wed, 14 Jun 2017 14:07:48 +0800 Subject: [PATCH 0428/1407] Translating 2 posts --- .../20170117 The Age of the Unikernel- 10 Projects to Know.md | 1 + sources/tech/20170403 Introduction to functional programming.md | 1 + 2 files changed, 2 insertions(+) diff --git a/sources/tech/20170117 The Age of the Unikernel- 10 Projects to Know.md b/sources/tech/20170117 The Age of the Unikernel- 10 Projects to Know.md index 45cf389712..d385d1b97d 100644 --- a/sources/tech/20170117 The Age of the Unikernel- 10 Projects to Know.md +++ b/sources/tech/20170117 The Age of the Unikernel- 10 Projects to Know.md @@ -1,3 +1,4 @@ +ictlyh Translating The Age of the Unikernel: 10 Projects to Know ============================================================ diff --git a/sources/tech/20170403 Introduction to functional programming.md b/sources/tech/20170403 Introduction to functional programming.md index ea2543e388..34cbae17f9 100644 --- a/sources/tech/20170403 Introduction to functional programming.md +++ b/sources/tech/20170403 Introduction to functional programming.md @@ -1,3 +1,4 @@ +ictlyh Translating Introduction to functional programming ============================================================ From 19bd58a9ebdb531bad2fbbbeb1e3397e0a628b2a Mon Sep 17 00:00:00 2001 From: ictlyh Date: Wed, 14 Jun 2017 16:28:42 +0800 Subject: [PATCH 0429/1407] =?UTF-8?q?Translated=20tech/20170308=20Many=20S?= =?UTF-8?q?QL=20Performance=20Problems=20Stem=20from=20=20Unnecessary,=20M?= =?UTF-8?q?andatory=C2=A0Work.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... Stem from Unnecessary, Mandatory Work.md | 396 ------------------ ... Stem from Unnecessary, Mandatory Work.md | 394 +++++++++++++++++ 2 files changed, 394 insertions(+), 396 deletions(-) delete mode 100644 sources/tech/20170308 Many SQL Performance Problems Stem from Unnecessary, Mandatory Work.md create mode 100644 translated/tech/20170308 Many SQL Performance Problems Stem from Unnecessary, Mandatory Work.md diff --git a/sources/tech/20170308 Many SQL Performance Problems Stem from Unnecessary, Mandatory Work.md b/sources/tech/20170308 Many SQL Performance Problems Stem from Unnecessary, Mandatory Work.md deleted file mode 100644 index 2e37bfb37d..0000000000 --- a/sources/tech/20170308 Many SQL Performance Problems Stem from Unnecessary, Mandatory Work.md +++ /dev/null @@ -1,396 +0,0 @@ -ictlyh Translating - -Many SQL Performance Problems Stem from “Unnecessary, Mandatory Work” -============================================================  - -Probably the most impactful thing you could learn about when writing efficient SQL is [indexing][1]. A very close runner-up, however, is the fact that a lot of SQL clients demand tons of **“unnecessary, mandatory work”** from the database. - -Repeat this after me: - -> Unnecessary, Mandatory Work - -What is **“unnecessary, mandatory work”**? It’s two things (duh): - -### Unnecessary - -Let’s assume your client application needs this information here: - -[ - ![](https://lukaseder.files.wordpress.com/2017/03/title-rating.png?w=662) -][2] - -Nothing out of the ordinary. We run a movie database ([e.g. the Sakila database][3]) and we want to display the title and rating of each film to the user. - -This is the query that would produce the above result: - - - `SELECT title, rating` - `FROM film` - -However, our application (or our ORM) runs this query instead: - -`SELECT *` -`FROM film` - -What are we getting? Guess what. We’re getting tons of useless information: - -[ - ![](https://lukaseder.files.wordpress.com/2017/03/useless-information.png?w=662&h=131) -][4] - -There’s even some complex JSON all the way to the right, which is loaded: - -* From the disk -* Into the caches -* Over the wire -* Into the client memory -* And then discarded - -Yes, we discard most of this information. The work that was performed to retrieve it was completely unnecessary. Right? Agreed. - -### Mandatory - -That’s the worse part. While optimisers have become quite smart these days, this work is mandatory for the database. There’s no way the database can  _know_  that the client application actually didn’t need 95% of the data. And that’s just a simple example. Imagine if we joined more tables… - -So what, you think? Databases are fast? Let me offer you some insight you may not have thought of, before: - -### Memory consumption - -Sure, the individual execution time doesn’t really change much. Perhaps, it’ll be 1.5x slower, but we can handle that right? For the sake of convenience? Sometimes that’s true. But if you’re sacrificing performance for convenience  _every time_ , things add up. We’re no longer talking about performance (speed of individual queries), but throughput (system response time), and that’s when stuff gets really hairy and tough to fix. When you stop being able to scale. - -Let’s look at execution plans, Oracle this time: - -``` --------------------------------------------------- -| Id | Operation | Name | Rows | Bytes | --------------------------------------------------- -| 0 | SELECT STATEMENT | | 1000 | 166K| -| 1 | TABLE ACCESS FULL| FILM | 1000 | 166K| --------------------------------------------------- -``` - -Versus - -``` --------------------------------------------------- -| Id | Operation | Name | Rows | Bytes | --------------------------------------------------- -| 0 | SELECT STATEMENT | | 1000 | 20000 | -| 1 | TABLE ACCESS FULL| FILM | 1000 | 20000 | --------------------------------------------------- -``` - -We’re using 8x as much memory in the database when doing `SELECT *`rather than `SELECT film, rating`. That’s not really surprising though, is it? We knew that. Yet we accepted it in many many of our queries where we simply didn’t need all that data. We generated **needless, mandatory work** for the database, and it does sum up. We’re using 8x too much memory (the number will differ, of course). - -Now, all the other steps (disk I/O, wire transfer, client memory consumption) are also affected in the same way, but I’m skipping those. Instead, I’d like to look at… - -### Index usage - -Most databases these days have figured out the concept of [ _covering indexes_ ][5]. A covering index is not a special index per se. But it can turn into a “special index” for a given query, either “accidentally,” or by design. - -Check out this query: - - `SELECT` `*` - `FROM` `actor` - `WHERE` `last_name` `LIKE` `'A%'` - -There’s no extraordinary thing to be seen in the execution plan. It’s a simple query. Index range scan, table access, done: - -``` -------------------------------------------------------------------- -| Id | Operation | Name | Rows | -------------------------------------------------------------------- -| 0 | SELECT STATEMENT | | 8 | -| 1 | TABLE ACCESS BY INDEX ROWID| ACTOR | 8 | -|* 2 | INDEX RANGE SCAN | IDX_ACTOR_LAST_NAME | 8 | -------------------------------------------------------------------- -``` - -Is it a good plan, though? Well, if what we really needed was this, then it’s not: - -[ - ![](https://lukaseder.files.wordpress.com/2017/03/first-name-last-name.png?w=662) -][6] - -Sure, we’re wasting memory etc. But check out this alternative query: - -| 123 | `SELECT` `first_name, last_name``FROM` `actor``WHERE` `last_name` `LIKE` `'A%'` | - -Its plan is this: - -``` ----------------------------------------------------- -| Id | Operation | Name | Rows | ----------------------------------------------------- -| 0 | SELECT STATEMENT | | 8 | -|* 1 | INDEX RANGE SCAN| IDX_ACTOR_NAMES | 8 | ----------------------------------------------------- -``` - -We could now eliminate the table access entirely, because there’s an index that covers all the needs of our query… a covering index. Does it matter? Absolutely! This approach can speed up some of your queries by an order of magnitude (or slow them down by an order of magnitude when your index stops being covering after a change). - -You cannot always profit from covering indexes. Indexes come with their own cost and you shouldn’t add too many of them, but in cases like these, it’s a no-brainer. Let’s run a benchmark: - -``` -SET SERVEROUTPUT ON -DECLARE - v_ts TIMESTAMP; - v_repeat CONSTANT NUMBER := 100000; -BEGIN - v_ts := SYSTIMESTAMP; - - FOR i IN 1..v_repeat LOOP - FOR rec IN ( - -- Worst query: Memory overhead AND table access - SELECT * - FROM actor - WHERE last_name LIKE 'A%' - ) LOOP - NULL; - END LOOP; - END LOOP; - - dbms_output.put_line('Statement 1 : ' || (SYSTIMESTAMP - v_ts)); - v_ts := SYSTIMESTAMP; - - FOR i IN 1..v_repeat LOOP - FOR rec IN ( - -- Better query: Still table access - SELECT /*+INDEX(actor(last_name))*/ - first_name, last_name - FROM actor - WHERE last_name LIKE 'A%' - ) LOOP - NULL; - END LOOP; - END LOOP; - - dbms_output.put_line('Statement 2 : ' || (SYSTIMESTAMP - v_ts)); - v_ts := SYSTIMESTAMP; - - FOR i IN 1..v_repeat LOOP - FOR rec IN ( - -- Best query: Covering index - SELECT /*+INDEX(actor(last_name, first_name))*/ - first_name, last_name - FROM actor - WHERE last_name LIKE 'A%' - ) LOOP - NULL; - END LOOP; - END LOOP; - - dbms_output.put_line('Statement 3 : ' || (SYSTIMESTAMP - v_ts)); -END; -/ -``` - - -The result is: - -``` -Statement 1 : +000000000 00:00:02.479000000 -Statement 2 : +000000000 00:00:02.261000000 -Statement 3 : +000000000 00:00:01.857000000 -``` - -Note, the actor table only has 4 columns, so the difference between statements 1 and 2 is not too impressive, but still significant. Note also I’m using Oracle’s hints to force the optimiser to pick one or the other index for the query. Statement 3 clearly wins in this case. It’s a  _much_  better query, and that’s just an extremely simple query. - -Again, when we write `SELECT *`, we create **needless, mandatory work** for the database, which it cannot optimise. It won’t pick the covering index because that index has a bit more overhead than the `LAST_NAME`index that it did pick, and after all, it had to go to the table anyway to fetch the useless `LAST_UPDATE` column, for instance. - -But things get worse with `SELECT *`. Consider… - -### SQL transformations - -Optimisers work so well, because they transform your SQL queries ([watch my recent talk at Voxxed Days Zurich about how this works][7]). For instance, there’s a SQL transformation called “`JOIN` elimination”, and it is really powerful. Consider this auxiliary view, which we wrote because we grew so incredibly tired of joining all these tables all the time: - -``` -CREATE VIEW v_customer AS -SELECT - c.first_name, c.last_name, - a.address, ci.city, co.country -FROM customer c -JOIN address a USING (address_id) -JOIN city ci USING (city_id) -JOIN country co USING (country_id) -``` - -This view just connects all the “to-one” relationships between a `CUSTOMER` and their different `ADDRESS` parts. Thanks, normalisation. - -Now, after a while working with this view, imagine, we’ve become so accustomed to this view, we forgot all about the underlying tables. And now, we’re running this query: - -``` -SELECT * -FROM v_customer -``` - -We’re getting quite some impressive plan: - -``` ----------------------------------------------------------------- -| Id | Operation | Name | Rows | Bytes | Cost | ----------------------------------------------------------------- -| 0 | SELECT STATEMENT | | 599 | 47920 | 14 | -|* 1 | HASH JOIN | | 599 | 47920 | 14 | -| 2 | TABLE ACCESS FULL | COUNTRY | 109 | 1526 | 2 | -|* 3 | HASH JOIN | | 599 | 39534 | 11 | -| 4 | TABLE ACCESS FULL | CITY | 600 | 10800 | 3 | -|* 5 | HASH JOIN | | 599 | 28752 | 8 | -| 6 | TABLE ACCESS FULL| CUSTOMER | 599 | 11381 | 4 | -| 7 | TABLE ACCESS FULL| ADDRESS | 603 | 17487 | 3 | ----------------------------------------------------------------- -``` - -Well, of course. We run all these joins and full table scans, because that’s what we told the database to do. Fetch all this data. - -Now, again, imagine, what we really wanted on one particular screen was this: - -[ - ![](https://lukaseder.files.wordpress.com/2017/03/first-name-last-name-customers.png?w=662) -][8] - -Yeah, duh, right? By now you get my point. But imagine, we’ve learned from the previous mistakes and we’re now actually running the following, better query: - -``` -SELECT first_name, last_name -FROM v_customer -``` - - -Now, check this out! - -``` ------------------------------------------------------------------- -| Id | Operation | Name | Rows | Bytes | Cost | ------------------------------------------------------------------- -| 0 | SELECT STATEMENT | | 599 | 16173 | 4 | -| 1 | NESTED LOOPS | | 599 | 16173 | 4 | -| 2 | TABLE ACCESS FULL| CUSTOMER | 599 | 11381 | 4 | -|* 3 | INDEX UNIQUE SCAN| SYS_C007120 | 1 | 8 | 0 | ------------------------------------------------------------------- -``` - -That’s a  _drastic_  improvement in the execution plan. Our joins were eliminated, because the optimiser could prove they were **needless**, so once it can prove this (and you don’t make the work **mandatory** by selecting *), it can remove the work and simply not do it. Why is that the case? - -Each `CUSTOMER.ADDRESS_ID` foreign key guarantees that there is  _exactly one_  `ADDRESS.ADDRESS_ID` primary key value, so the `JOIN` operation is guaranteed to be a to-one join which does not add rows nor remove rows. If we don’t even select rows or query rows, well, we don’t need to actually load the rows at all. Removing the `JOIN` provably won’t change the outcome of the query. - -Databases do these things all the time. You can try this on most databases: - -``` --- Oracle -SELECT CASE WHEN EXISTS ( - SELECT 1 / 0 FROM dual -) THEN 1 ELSE 0 END -FROM dual - --- More reasonable SQL dialects, e.g. PostgreSQL -SELECT EXISTS (SELECT 1 / 0) -``` - -In this case, you might expect an arithmetic exception to be raised, as when you run this query: - -``` -SELECT 1 / 0 FROM dual -``` - - -yielding - -``` -ORA-01476: divisor is equal to zero -``` - -But it doesn’t happen. The optimiser (or even the parser) can prove that any `SELECT` column expression in a `EXISTS (SELECT ..)` predicate will not change the outcome of a query, so there’s no need to evaluate it. Huh! - -### Meanwhile… - -One of most ORM’s most unfortunate problems is the fact that they make writing `SELECT *` queries so easy to write. In fact, HQL / JPQL for instance, proceeded to making it the default. You can even omit the `SELECT` clause entirely, because after all, you’re going to be fetching the entire entity, as declared, right? - -For instance: - -`FROM` `v_customer` - -[Vlad Mihalcea for instance, a Hibernate expert and Hibernate Developer advocate][9] recommends you use queries almost every time you’re sure you don’t want to persist any modifications after fetching. ORMs make it easy to solve the object graph persistence problem. Note: Persistence. The idea of actually modifying the object graph and persisting the modifications is inherent. - -But if you don’t intend to do that, why bother fetching the entity? Why not write a query? Let’s be very clear: From a performance perspective, writing a query tailored to the exact use-case you’re solving is  _always_  going to outperform any other option. You may not care because your data set is small and it doesn’t matter. Fine. But eventually, you’ll need to scale and re-designing your applications to favour a query language over imperative entity graph traversal will be quite hard. You’ll have other things to do. - -### Counting for existence - -Some of the worst wastes of resources is when people run `COUNT(*)`queries when they simply want to check for existence. E.g. - -> Did this user have any orders at all? - -And we’ll run: - -``` -SELECT count(*) -FROM orders -WHERE user_id = :user_id -``` - -Easy. If `COUNT = 0`: No orders. Otherwise: Yes, orders. - -The performance will not be horrible, because we probably have an index on the `ORDERS.USER_ID` column. But what do you think will be the performance of the above compared to this alternative here: - -``` --- Oracle -SELECT CASE WHEN EXISTS ( - SELECT * - FROM orders - WHERE user_id = :user_id -) THEN 1 ELSE 0 END -FROM dual - --- Reasonable SQL dialects, like PostgreSQL -SELECT EXISTS ( - SELECT * - FROM orders - WHERE user_id = :user_id -) -``` - -It doesn’t take a rocket scientist to figure out that an actual existence predicate can stop looking for additional rows as soon as it found  _one_ . So, if the answer is “no orders”, then the speed will be comparable. If, however, the answer is “yes, orders”, then the answer might be  _drastically_  faster in the case where we do not calculate the exact count. - -Because we  _don’t care_  about the exact count. Yet, we told the database to calculate it (**needless**), and the database doesn’t know we’re discarding all results bigger than 1 (**mandatory**). - -Of course, things get much worse if you call `list.size()` on a JPA-backed collection to do the same… - -[I’ve blogged about this recently, and benchmarked the alternatives on different databases. Do check it out.][10] - -### Conclusion - -This article stated the “obvious”. Don’t tell the database to perform **needless, mandatory work**. - -It’s **needless** because given your requirements, you  _knew_  that some specific piece of work did not need to be done. Yet, you tell the database to do it. - -It’s **mandatory** because the database has no way to prove it’s **needless**. This information is contained only in the client, which is inaccessible to the server. So, the database has to do it. - -This article talked about `SELECT *`, mostly, because that’s such an easy target. But this isn’t about databases only. This is about any distributed algorithm where a client instructs a server to perform **needless, mandatory work**. How many N+1 problems does your average AngularJS application have, where the UI loops over service result A, calling service B many times, instead of batching all calls to B into a single call? It’s a recurrent pattern. - -The solution is always the same. The more information you give to the entity executing your command, the faster it can (in principle) execute such command. Write a better query. Every time. Your entire system will thank you for it. - -### If you liked this article… - -… do also check out my recent talk at Voxxed Days Zurich, where I show some hyperbolic examples of why SQL will beat Java at data processing algorithms every time: - --------------------------------------------------------------------------------- - -via: https://blog.jooq.org/2017/03/08/many-sql-performance-problems-stem-from-unnecessary-mandatory-work - -作者:[ jooq][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://blog.jooq.org/ -[1]:http://use-the-index-luke.com/ -[2]:https://lukaseder.files.wordpress.com/2017/03/title-rating.png -[3]:https://github.com/jOOQ/jOOQ/tree/master/jOOQ-examples/Sakila -[4]:https://lukaseder.files.wordpress.com/2017/03/useless-information.png -[5]:https://blog.jooq.org/2015/04/28/do-not-think-that-one-second-is-fast-for-query-execution/ -[6]:https://lukaseder.files.wordpress.com/2017/03/first-name-last-name.png -[7]:https://www.youtube.com/watch?v=wTPGW1PNy_Y -[8]:https://lukaseder.files.wordpress.com/2017/03/first-name-last-name-customers.png -[9]:https://vladmihalcea.com/2016/09/13/the-best-way-to-handle-the-lazyinitializationexception/ -[10]:https://blog.jooq.org/2016/09/14/avoid-using-count-in-sql-when-you-could-use-exists/ diff --git a/translated/tech/20170308 Many SQL Performance Problems Stem from Unnecessary, Mandatory Work.md b/translated/tech/20170308 Many SQL Performance Problems Stem from Unnecessary, Mandatory Work.md new file mode 100644 index 0000000000..19d0013557 --- /dev/null +++ b/translated/tech/20170308 Many SQL Performance Problems Stem from Unnecessary, Mandatory Work.md @@ -0,0 +1,394 @@ +许多 SQL 性能问题来自于“不必要的强制性工作” +============================================================  + +在编写高效 SQL 时,你可能遇到的最有影响力的事情就是[索引][1]。但是,一个很重要的事实就是很多 SQL 客户端要求数据库做很多**“不必要的强制性工作”**。 + +跟我再重复一遍: + +> 不必要的强制性工作 + +什么是**“不必要的强制性工作”**?包括两个方面: + +### 不必要 + +假设你的客户端应用程序需要这些信息: + +[ + ![](https://lukaseder.files.wordpress.com/2017/03/title-rating.png?w=662) +][2] + +没什么特别的。我们运行着一个电影数据库([例如 Sakila 数据库][3]),我们想要给用户显示每部电影的名称和评分。 + +这是能产生上面结果的查询: + + + `SELECT title, rating` + `FROM film` + +然而,我们的应用程序(或者我们的 ORM(LCTT 译注:Object-relational mapping,对象关系映射))运行的查询却是: + +`SELECT *` +`FROM film` + +我们得到什么?猜一下。我们得到很多无用的信息: + +[ + ![](https://lukaseder.files.wordpress.com/2017/03/useless-information.png?w=662&h=131) +][4] + +甚至从头到尾有复杂的 JSON 数据,加载过程包括: + +* 从磁盘 +* 加载到缓存 +* 通过总线 +* 进入客户端内存 +* 然后被丢弃 + +是的,我们丢弃了其中大部分的信息。检索它所做的工作完全就是不必要的。对吧?是的。 + +### 强制性 + +这是最严重的部分。现今随着优化器变得相当聪明,对于数据库来说这些工作都是强制性的。数据库没有办法_知道_客户端应用程序实际上不需要其中 95% 的数据。这只是一个简单的例子。想象一下如果我们连接更多的表... + +你想想那会怎样呢?数据库会快吗?让我给你一些之前你可能没有想到的见解: + +### 内存消耗 + +当然,单独的执行时间不会变化很大。可能是慢 1.5 倍,但我们可以忍受,是吧?为方便起见?有时候确实如此。但是如果你_每次_都为了方便而牺牲性能,事情就大了。我们不在讨论性能(单个查询的速度),而是吞吐量(系统响应时间),这就是事情变得困难而难以解决的时候。你无法再进行扩展。 + +让我们来看看执行计划,这是 Oracle的: + +``` +-------------------------------------------------- +| Id | Operation | Name | Rows | Bytes | +-------------------------------------------------- +| 0 | SELECT STATEMENT | | 1000 | 166K| +| 1 | TABLE ACCESS FULL| FILM | 1000 | 166K| +-------------------------------------------------- +``` + +对比 + +``` +-------------------------------------------------- +| Id | Operation | Name | Rows | Bytes | +-------------------------------------------------- +| 0 | SELECT STATEMENT | | 1000 | 20000 | +| 1 | TABLE ACCESS FULL| FILM | 1000 | 20000 | +-------------------------------------------------- +``` + +当执行 `SELECT *` 而不是 `SELECT film, rating` 的时候,数据库中我们使用了 8 倍的内存。这并不奇怪,对吧?我们早就知道了。在很多很多我们并不需要其中全部数据的查询中,我们仍然接受了。我们为数据库产生了**不必要的强制性工作**,后果累加了起来。我们使用了 8 倍的内存(当然,数值可能有些不同)。 + +现在,所有其它步骤(磁盘 I/O、总线传输、客户端内存消耗)也受到相同的影响,我这里就跳过了。另外,我还想看看... + +### 索引使用 + +如今大部分数据库都有[涵盖索引][5](LCTT 译注:covering index,包括了你查询所需列、甚至更多列的索引,可以直接从索引中获取所有需要的数据,而无需访问物理表)的概念。涵盖索引并不是特殊的索引。但对于一个特定的查询,它可以“意外地”或人为地转变为一个“特殊索引”。 + +看看这个查询: + + `SELECT` `*` + `FROM` `actor` + `WHERE` `last_name` `LIKE` `'A%'` + +执行计划中没有什么特别之处。它只是个简单的查询。索引范围扫描、表访问,就结束了: + +``` +------------------------------------------------------------------- +| Id | Operation | Name | Rows | +------------------------------------------------------------------- +| 0 | SELECT STATEMENT | | 8 | +| 1 | TABLE ACCESS BY INDEX ROWID| ACTOR | 8 | +|* 2 | INDEX RANGE SCAN | IDX_ACTOR_LAST_NAME | 8 | +------------------------------------------------------------------- +``` + +这是个好计划吗?如果我们想要的就是这些,那么它就不是: + +[ + ![](https://lukaseder.files.wordpress.com/2017/03/first-name-last-name.png?w=662) +][6] + +当然,我们浪费了内存等等。再来看看这个查询: + +| 123 | `SELECT` `first_name, last_name``FROM` `actor``WHERE` `last_name` `LIKE` `'A%'` | + +它的计划是: + +``` +---------------------------------------------------- +| Id | Operation | Name | Rows | +---------------------------------------------------- +| 0 | SELECT STATEMENT | | 8 | +|* 1 | INDEX RANGE SCAN| IDX_ACTOR_NAMES | 8 | +---------------------------------------------------- +``` + +现在我们可以完全消除表访问,因为有一个索引涵盖了我们查询需要的所有东西...一个涵盖索引。这很重要吗?当然!这种方法可以将你的一些查询加速一个数量级(如果更改后你的索引不在涵盖,可能会降低一个数量级)。 + +你不能总是从涵盖索引中获利。索引有它们自己的成本,你不应该添加太多索引,例如像这种情况,就是不明智的。让我们来做个测试: + +``` +SET SERVEROUTPUT ON +DECLARE + v_ts TIMESTAMP; + v_repeat CONSTANT NUMBER := 100000; +BEGIN + v_ts := SYSTIMESTAMP; + + FOR i IN 1..v_repeat LOOP + FOR rec IN ( + -- Worst query: Memory overhead AND table access + SELECT * + FROM actor + WHERE last_name LIKE 'A%' + ) LOOP + NULL; + END LOOP; + END LOOP; + + dbms_output.put_line('Statement 1 : ' || (SYSTIMESTAMP - v_ts)); + v_ts := SYSTIMESTAMP; + + FOR i IN 1..v_repeat LOOP + FOR rec IN ( + -- Better query: Still table access + SELECT /*+INDEX(actor(last_name))*/ + first_name, last_name + FROM actor + WHERE last_name LIKE 'A%' + ) LOOP + NULL; + END LOOP; + END LOOP; + + dbms_output.put_line('Statement 2 : ' || (SYSTIMESTAMP - v_ts)); + v_ts := SYSTIMESTAMP; + + FOR i IN 1..v_repeat LOOP + FOR rec IN ( + -- Best query: Covering index + SELECT /*+INDEX(actor(last_name, first_name))*/ + first_name, last_name + FROM actor + WHERE last_name LIKE 'A%' + ) LOOP + NULL; + END LOOP; + END LOOP; + + dbms_output.put_line('Statement 3 : ' || (SYSTIMESTAMP - v_ts)); +END; +/ +``` + + +结果是: + +``` +Statement 1 : +000000000 00:00:02.479000000 +Statement 2 : +000000000 00:00:02.261000000 +Statement 3 : +000000000 00:00:01.857000000 +``` + +注意,表 actor 只有 4 列,因此语句 1 和 2 的差别并不是太令人印象深刻,但仍然很重要。还要注意我使用了 Oracle 的提示强制优化器为查询选择一个或其它索引。在这种情况下语句 3 明显胜利。这是一个好_很多_的查询,也是一个十分简单的查询。 + +当我们写 `SELECT *` 语句时,我们为数据库带来了**不必要的强制性工作**,这是无法优化的。它不会使用涵盖索引,因为比起它使用的 `LAST_NAME` 索引,涵盖索引开销更多一点,不管怎样,它都要访问表以获取无用的 `LAST_UPDATE` 列。 + +使用 `SELECT *` 会变得更糟。考虑... + +### SQL 转换 + +优化器工作的很好,因为它们转换了你的 SQL 查询([看我最近在 Voxxed Days Zurich 关于这方面的演讲][7])。例如,其中有一个称为“`连接`消除”的转换,它真的很强大。考虑这个辅助视图,我们写了这个视图,因为我们变得难以置信地厌倦总是连接所有这些表: + +``` +CREATE VIEW v_customer AS +SELECT + c.first_name, c.last_name, + a.address, ci.city, co.country +FROM customer c +JOIN address a USING (address_id) +JOIN city ci USING (city_id) +JOIN country co USING (country_id) +``` + +这个视图仅仅是把 `CUSTOMER` 和他们不同的 `ADDRESS` 部分所有“对一”关系连接起来。谢天谢地,它很工整。 + +现在,使用这个视图一段时间之后,想象我们非常习惯这个视图,我们都忘了所有它底层的表。然后,我们运行了这个查询: + +``` +SELECT * +FROM v_customer +``` + +我们得到了一个相当令人印象深刻的计划: + +``` +---------------------------------------------------------------- +| Id | Operation | Name | Rows | Bytes | Cost | +---------------------------------------------------------------- +| 0 | SELECT STATEMENT | | 599 | 47920 | 14 | +|* 1 | HASH JOIN | | 599 | 47920 | 14 | +| 2 | TABLE ACCESS FULL | COUNTRY | 109 | 1526 | 2 | +|* 3 | HASH JOIN | | 599 | 39534 | 11 | +| 4 | TABLE ACCESS FULL | CITY | 600 | 10800 | 3 | +|* 5 | HASH JOIN | | 599 | 28752 | 8 | +| 6 | TABLE ACCESS FULL| CUSTOMER | 599 | 11381 | 4 | +| 7 | TABLE ACCESS FULL| ADDRESS | 603 | 17487 | 3 | +---------------------------------------------------------------- +``` + +当然是这样。我们运行所有这些连接以及全表扫描,因为这就是我们让数据库去做的。获取所有的数据。 + +现在,再一次想象,对于一个特定场景,我们真正想要的是: + +[ + ![](https://lukaseder.files.wordpress.com/2017/03/first-name-last-name-customers.png?w=662) +][8] + +是啊,对吧?现在你应该知道我的意图了。但想像一下,我们确实从前面的错误中学到了东西,现在我们实际上运行下面一个比较好的查询: + +``` +SELECT first_name, last_name +FROM v_customer +``` + + +再来看看结果! + +``` +------------------------------------------------------------------ +| Id | Operation | Name | Rows | Bytes | Cost | +------------------------------------------------------------------ +| 0 | SELECT STATEMENT | | 599 | 16173 | 4 | +| 1 | NESTED LOOPS | | 599 | 16173 | 4 | +| 2 | TABLE ACCESS FULL| CUSTOMER | 599 | 11381 | 4 | +|* 3 | INDEX UNIQUE SCAN| SYS_C007120 | 1 | 8 | 0 | +------------------------------------------------------------------ +``` + +这是执行计划一个_极大的_进步。我们的连接被消除了,因为优化器可以证明它们是**不必要的**,因此一旦它可以证明这点(而且你不会使用 select * 使其成为**强制性**工作),它就可以移除这些工作并不执行它。为什么会发生这种情况? + +每个 `CUSTOMER.ADDRESS_ID` 外键保证了_有且只有一个_`ADDRESS.ADDRESS_ID` 主键值,因此可以保证 `JOIN` 操作是对一连接,它不会产生或者删除行。如果我们甚至不选择行或者查询行,当然,我们就不需要真正地去加载行。可证明地移除 `JOIN` 并不会改变查询的结果。 + +数据库总是会做这些事情。你可以在大部分数据库上尝试它: + +``` +-- Oracle +SELECT CASE WHEN EXISTS ( + SELECT 1 / 0 FROM dual +) THEN 1 ELSE 0 END +FROM dual + +-- 更合理的 SQL 语句,例如 PostgreSQL +SELECT EXISTS (SELECT 1 / 0) +``` + +在这种情况下,你可能预料会抛出算术异常,当你运行这个查询时: + +``` +SELECT 1 / 0 FROM dual +``` + + +产生了 + +``` +ORA-01476: divisor is equal to zero +``` + +但它没有发生。优化器(甚至解析器)可以证明 `EXISTS (SELECT ..)` 谓词内的任何 `SELECT` 列表达式不会改变查询的结果,因此也就没有必要计算它的值。呵! + +### 同时... + +大部分 ORM 的最不幸问题就是事实上他们很随意就写出了 `SELECT *` 查询。事实上,例如 HQL / JPQL,设置默认使用它。你甚至可以完全抛弃 `SELECT` 从句,因为毕竟你想要获取所有实体,正如声明的那样,对吧? + +例如: + +`FROM` `v_customer` + +例如[Vlad Mihalcea][9](一个 Hibernate 专家和 Hibernate 开发倡导者)建议你每次确定不想要在获取后进行任何更改时再使用查询。ORM 使解决对象图持久化问题变得简单。注意:持久化。真正修改对象图并持久化修改的想法是固有的。 + +但如果你不想那样做,为什么要抓取实体呢?为什么不写一个查询?让我们清楚一点:从性能角度,针对你正在解决的用例写一个查询_总是_会胜过其它选项。你可以不会在意,因为你的数据集很小,没关系。可以。但最终,你需要扩展然后重新设计你的应用程序以便在强制实体图遍历之上支持查询语言,这会很困难。你也需要做其它事情。 + +### 计算出现次数 + +资源浪费最严重的情况是在只是想要检验存在性时运行 `COUNT(*)` 查询。例如: + +> 这个用户有没有订单? + +我们会运行: + +``` +SELECT count(*) +FROM orders +WHERE user_id = :user_id +``` + +很简单。如果 `COUNT = 0`:没有订单。否则:是的,有订单。 + +性能可能不会很差,因为我们可能有一个 `ORDERS.USER_ID` 列上的索引。但是和下面的这个相比你认为上面的性能是怎样呢: + +``` +-- Oracle +SELECT CASE WHEN EXISTS ( + SELECT * + FROM orders + WHERE user_id = :user_id +) THEN 1 ELSE 0 END +FROM dual + +-- 更合理的 SQL 语句,例如 PostgreSQL +SELECT EXISTS ( + SELECT * + FROM orders + WHERE user_id = :user_id +) +``` + +它不需要火箭科学家来确定,一旦它找到一个,实际存在谓词就可以马上停止寻找额外的行。因此,如果答案是“没有订单”,速度将会是差不多。但如果结果是“是的,有订单”,那么结果在我们不计算具体次数的情况下就会_大幅_加快。 + +因为我们_不在乎_具体的次数。我们告诉数据库去计算它(**不必要的**),数据库不知道我们会丢弃所有大于 1 的结果(**强制性**)。 + +当然,如果你在 JPA 支持的集合上调用 `list.size()` 做同样的事情,情况会变得更糟! + +[近期我有关于该情况的博客以及在不同数据库上的测试。去看看吧。][10] + +### 总结 + +这篇文章的立场很“明显”。别让数据库做**不必要的强制性工作**。 + +它**不必要**,因为对于你给定的需求,你_知道_一些特定的工作不需要完成。但是,你告诉数据库去做。 + +它**强制性**,因为数据库无法证明它是**不必要的**。这些信息只包含在客户端中,对于服务器来说无法访问。因此,数据库需要去做。 + +这篇文章大部分在介绍 `SELECT *`,因为这是一个很简单的目标。但是这并不仅限于数据库。这关于客户端要求服务器完成**不必要的强制性工作**的任何分布式算法。你 AngularJS 应用程序平均有多少个 N+1 问题,UI 在服务结果 A 上循环,多次调用服务 B,而不是把所有对 B 的调用打包为一个调用?这是一个复发的模式。 + +解决方法总是相同。你给执行你命令的实体越多信息,(理论上)它能更快执行这样的命令。每次都写一个好的查询。你的整个系统都会为此感谢你的。 + +### 如果你喜欢这篇文章... + +再看看近期我在 Voxxed Days Zurich 的演讲,其中我展示了一些在数据处理算法上为什么 SQL 总是会胜过 Java 的双曲线例子 + +-------------------------------------------------------------------------------- + +via: https://blog.jooq.org/2017/03/08/many-sql-performance-problems-stem-from-unnecessary-mandatory-work + +作者:[ jooq][a] +译者:[ictlyh](https://github.com/ictlyh) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://blog.jooq.org/ +[1]:http://use-the-index-luke.com/ +[2]:https://lukaseder.files.wordpress.com/2017/03/title-rating.png +[3]:https://github.com/jOOQ/jOOQ/tree/master/jOOQ-examples/Sakila +[4]:https://lukaseder.files.wordpress.com/2017/03/useless-information.png +[5]:https://blog.jooq.org/2015/04/28/do-not-think-that-one-second-is-fast-for-query-execution/ +[6]:https://lukaseder.files.wordpress.com/2017/03/first-name-last-name.png +[7]:https://www.youtube.com/watch?v=wTPGW1PNy_Y +[8]:https://lukaseder.files.wordpress.com/2017/03/first-name-last-name-customers.png +[9]:https://vladmihalcea.com/2016/09/13/the-best-way-to-handle-the-lazyinitializationexception/ +[10]:https://blog.jooq.org/2016/09/14/avoid-using-count-in-sql-when-you-could-use-exists/ From c04c780fb5c138b55af798d26909a2223367e1ce Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 14 Jun 2017 18:28:36 +0800 Subject: [PATCH 0430/1407] PRF:20170118 10 reasons to use Cinnamon as your Linux desktop environment.md @geekpi --- ...namon as your Linux desktop environment.md | 64 ++++++++----------- 1 file changed, 27 insertions(+), 37 deletions(-) diff --git a/translated/tech/20170118 10 reasons to use Cinnamon as your Linux desktop environment.md b/translated/tech/20170118 10 reasons to use Cinnamon as your Linux desktop environment.md index f29ad59ccc..330ef3aab7 100644 --- a/translated/tech/20170118 10 reasons to use Cinnamon as your Linux desktop environment.md +++ b/translated/tech/20170118 10 reasons to use Cinnamon as your Linux desktop environment.md @@ -1,60 +1,50 @@ 10 个使用 Cinnamon 作为 Linux 桌面环境的理由 ============================================================ -### Cinnamon 是一个让人回忆起提供灵活性、速度以及一系列功能的 GNOME 2 的 Linux 桌面环境 +> Cinnamon 是一个让人怀旧 GNOME 2 的 Linux 桌面环境,它灵活、快速,并提供了种种的功能。 - ![10 reasons to use Cinnamon as your Linux desktop environment](https://opensource.com/sites/default/files/styles/image-full-size/public/cinnamon.jpg?itok=rPZvjqGr "10 reasons to use Cinnamon as your Linux desktop environment") -图片版权:  +![10 reasons to use Cinnamon as your Linux desktop environment](https://opensource.com/sites/default/files/styles/image-full-size/public/cinnamon.jpg?itok=rPZvjqGr "10 reasons to use Cinnamon as your Linux desktop environment") -[Sam Mugraby][1], Photos8.com. [CC BY 2.0][2]. +最近我安装了 Fedora 25,我觉得当前的 [KDE][3] Plasma 版本并不稳定。在我决定尝试其它的桌面之前一天崩溃了好几次。在我安装了几个其它的桌面,并每个尝试了几个小时后,我最终决定在 Plasma 打上补丁并且稳定之前就使用 Cinnamon 了。以下是我所发现的。 -最近我安装了 Fedora 25,我发现当前的 [KDE][3] Plasma 版本对我并不稳定。在我决定尝试其他不同之前一天崩溃了几次。在安装了不同桌面,并每个尝试了几个小时后,我最终决定使用 Cinnamon 直到 Plasma 打上补丁并且稳定了。这些是我发现的。 +### Cinnamon 简介 -### 介绍 Cinnamon +在 2011,带有新的 GNOME Shell 的 GNOME 3 发布了,新的界面马上引来了或正或反的反馈。许多用户以及开发者非常喜欢原先的 GNOME 界面,因此有多个组织复刻了它,其中一个结果就是 Cinnamon。 -在 2011,带有新的 GNOME Shell 的 GNOME 3 发布了,新的界面马上产生了正面和负面的反馈。许多用户以及开发者非常喜欢原先的 GNOME 界面,因此多个组 fork 了它,其中一个 fork 就是 Cinnamon。 +开发 GNOME 3 的 GNOME shell 背后的原因之一是许多原先的 GNOME 用户界面组件不再活跃开发了。这同样也是 Cinnamon 以及其他 GNOME 复刻项目的问题。 Linux Mint 项目是 Cinnamon 的一个首要推动者,因为 GNOME 是 Mint 的官方桌面环境。Mint 开发者已经将 Cinnamon 推进到了不需要 GNOME 本身的地步,Cinnamon 已经是一个完全独立的桌面环境,它保留了许多用户喜欢的 GNOME 界面的功能。 -为 GNOME 3 开发 GNOME shell 背后的原因之一是原先的许多 GNOME 用户界面组件不再被积极开发了。这同样也是 Cinnamon 以及其他 fork GNOME 项目的问题。 Linux Mint 是 Cinnamon 其中一个首要推动者,因为 GNOME 是 Mint 官方桌面环境。Mint 开发者已经继续在 GNOME 自身不再需要的地方开发,并且 Cinnamon 是一个完全独立的桌面环境,它保留了许多用户喜欢的 GNOME 界面的功能。 +![cinnamon-desktop-environment.jpg](https://opensource.com/sites/default/files/images/life-uploads/cinnamon-desktop-environment.jpg) - ![cinnamon-desktop-environment.jpg](https://opensource.com/sites/default/files/images/life-uploads/cinnamon-desktop-environment.jpg) - -图 1:打开系统设置的默认 Cinnamon 桌面。 +*图 1:打开系统设置工具的默认 Cinnamon 桌面。* Cinnamon 3.2 是当前发布版本。除了 Mint,Cinnamon 还在许多发行版中可用,包括 Fedora、Arch、Gentoo、Debian 和 OpenSUSE 等。 ### 使用 Cinnamon 的理由 -这是我的使用 Cinnamon 的 10 个重要理由 +这是我的使用 Cinnamon 的 10 个重要理由: -1. **集成。** 桌面的选择不取决于是否有很长一段时间内为它编写的程序的可用性。我使用的所有应用程序,不管它是在哪个桌面下写的,它都将在任何其他桌面上运行正常,Cinnamon 也不例外。要运行那些为 KDE、GNOME 或其他桌面编写的程序所需要的库都有,并且使它们与 Cinnamon 无缝集成。 +1. **集成。** 桌面的选择并不取决于在较长时间内是否有为它写的应用。我使用过的所有应用程序,不管它是在哪个桌面下写的,它都可以在任何其它桌面上运行正常,Cinnamon 也不例外。要运行那些为 KDE、GNOME 或其他桌面编写的程序所需要的库都有,可以在 Cinnamon 上面顺滑地使用这些程序。 +2. **外观。** 让我们面对它,外观是很重要的。Cinnamon 有一个明快的、干净的外观,它使用了易于阅读的字体以及颜色的组合。桌面没有不必要的阻碍,你可以使用“系统设置” => “桌面” 菜单配置显示在桌面上的的图标。这个菜单还允许你指定是否在主监视器、次监视器或者所有监视器上显示桌面图标。 +3. **桌面组件。** 桌面组件是一些小型的、可以添加到桌面的单一用途的程序。只有一些是可用的,但是你可以从 CPU 或者磁盘监视器、天气应用、便利贴、桌面相簿、时间和日期等之中选择。我喜欢时间和日期桌面组件,因为它比 Cinnamon 面板中的小程序易于阅读。 +4. **速度。** Cinnamon 快速又敏捷。程序加载和显示很快。桌面自身在登录时加载也很快,虽然这只是我的主观体验,并没有基于时间测试。 +5. **配置。 ** Cinnamon 不如 KDE Plasma 那样可配置,但是也要比我第一次尝试它的时候有更多的配置。Cinnamon 控制中心提供了许多桌面配置选项的集中访问。它有一个主窗口,可以从它启动特定功能的配置窗口。可以很容易地在 “系统设置” 的 “主题” 的可用外观中选择新的外观。你可以选择窗口边框、图标、控件、鼠标指针和桌面基本方案。其它选择还包括字体和背景。我发现这些配置工具中有许多是我遇到的最好的。它有适量的桌面主题,从而能够显著改变桌面的外观,而不会像 KDE 那样面临选择困难。 +6. **Cinnamon 面板。** Cinnamon 面板,即工具栏,最初的配置非常简单。它包含用于启动程序的菜单、基本的系统托盘和应用程序选择器。这个面板易于配置,并且添加新的程序启动器只需要定位你想要添加到主菜单的程序,右键单击程序图标,然后选择“添加到面板”。你还可以将启动器图标添加到桌面本身,以及 Cinnamon 的 “收藏” 的启动栏中。你还可以进入面板的**编辑**模式并重新排列图标。 +7. **灵活性。** 有时可能很难找到最小化或者隐藏的正在运行的程序,如果有许多正在运行的应用程序,则在工具栏的程序选择器上查找它可能会有挑战性。 在某种程度上,这是因为程序并不总是有序地排在选择器中使其易于查找,所以我最喜欢的功能之一就是可以拖动正在运行的程序的按钮并将其重新排列在选择器上。这可以使查找和显示属于程序的窗口更容易,因为现在它们现在在我放的位置上。 -2. **外观。** 让我们面对它,外观是很重要的。Cinnamon 有一个明快的、干净的外观,这使得容易阅读字体以及颜色的组合。桌面没有不必要的阻碍,你可以使用 **System Settings => Desktop** 菜单配置显示的图标。这个菜单还允许你指定是否在主监视器、次监视器或者所有监视器上显示桌面图标。 + Cinnamon 桌面还有一个非常好的弹出菜单,你可以右键单击访问。此菜单有一些常用任务,例如访问桌面设置、添加桌面组件以及其他与桌面相关的任务。 -3. **desklet。** desklet 是指小型,可以添加到桌面的单一用途的程序。只有一些是可用的,但是你可以选择从 CPU 或者磁盘监视器、天气应用、便利贴、桌面相簿、时间和日期等中选择。我喜欢时间和日期 desklet,因为它比 Cinnamon 面板中的小程序易于阅读。 - -4. **速度。** Cinnamon 快速又敏捷。程序加载和显示很多。桌面自身在登录时很快加载,虽然这只是我的主观体验,并没有基于时间测试。 - -5 **配置。 ** Cinnamon 不如 KDE Plasma 那样可配置,但是在第一次尝试的时候,它比我原先想的要可配置得多。Cinnamon 控制中心提供了许多桌面配置选项的几种访问。它有一个主窗口,可以从它启动特定功能配置窗口。可以很容易地在 “System Settings” 的 “Themes” 的可用外观中选择新的外观。你可以选择窗口边框、图标、控件、指针和桌面基本方案。其他选择包括字体和背景。我发现这些配置工具中有许多是我遇到的最好的。它有适量的桌面主题, 从而能够显著改变桌面的外观, 而不会像 KDE 那样在大量的选择前混淆。 - -6. *Cinnamon 面板。* Cinnamon 面板, 即工具栏,最初的配置非常简单。它包含用于启动程序、基本系统托盘和应用程序选择器的菜单。这个面板易于配置并且添加新的程序启动器只需要定位你想要添加到主菜单的程序。右键单击程序图标, 然后选择 "Add to panel"。你还可以将启动器图标添加到桌面本身, 以及 Cinnamon 的 “Favorites” 的启动栏中。你还可以进入面板的**编辑**模式并重新排列图标。 - -7. **灵活性。** 有时可能很难找到最小化或者隐藏的正在运行的程序,如果有许多正在运行的应用程序, 则在工具栏的程序选择器上查找它可能会有挑战性。在某种程度上,这是因为程序并不总是有序地在选择器中使其易于查找。所以我最喜欢的功能之一就是可以拖动正在运行的程序的按钮并将其重新排列在选择器上。这可以使查找和显示属于程序的窗口更容易,因为现在它们现在在我放的位置上。 - -    Cinnamon 桌面还有一个非常好的弹出菜单,你可以右键单击访问。此菜单有一些常用任务,例如访问桌面设置、添加 desklet 以及其他与桌面相关的任务。 - -    其他菜单项之一是 “Create New Document”,它使用位于 ~/Templates 目录中的文档模板,并列出它们中的每一个。只需点击要使用的模板,使用这个模板的文档就会使用默认的 office 程序创建。在我的情况下,那就是 LibreOffice。 - -8. **多****工作空间****。** Cinnamon 像其他桌面环境一样提供了多个桌面。Cinnamon 称它为 “workspace”。工作空间选择器位于 Cinnamon 面板中并展示每个工作空间的窗口概览。窗口可以在工作空间之间移动并分配给它们。我确实发现工作区选择器有时候会缓慢地赶上窗口位置的显示,所以我切换工作区选择器来显示工作区的数量,而不是在工作区中遮蔽窗口。 - -9. **Nemo。** 大部分桌面为了不同目的使用它们自己偏好的默认程序,Cinnamon 也不例外。我偏好的桌面文件管理器是 Krusader,但是 Cinnamon 默认使用 Nemo,因此在测试中我就用它了。我发现我很喜欢 Nemo。它有一个美丽干净的界面,我喜欢并经常使用的大部分功能。它易于使用,同时对我的需求也足够灵活。虽然 Nemo 是 Nautilus 的 fork,但是我发现 Nemo 更好地被集成进了 Cinnamon 环境。Nautilus 界面看上去没有与 Cinnamon 很好集成,与 Cinnamon 不太和谐。 - -10. *稳定性。*  Cinnamon 非常稳定且可用。 + 其它菜单项之一是 “创建新文档”,它使用位于 `~/Templates` 目录中的文档模板,并列出它们中的每一个。只需点击要使用的模板,使用这个模板的文档就会使用默认的 Office 程序创建。在我的情况下,那就是 LibreOffice。 +8. **多工作空间。** Cinnamon 像其他桌面环境一样提供了多个桌面。Cinnamon 称它为“工作区”。工作区选择器位于 Cinnamon 面板中并展示每个工作区的窗口概览。窗口可以在工作区之间移动或指定到所有工作区。我确实发现工作区选择器有时候会比窗口位置的显示慢一些,所以我将工作区选择器切换为显示工作区编号,而不是在工作区中显示窗口概览。 +9. **Nemo。** 大部分桌面因种种目而使用它们自己偏好的默认程序,Cinnamon 也不例外。我偏好的桌面文件管理器是 Krusader,但是 Cinnamon 默认使用 Nemo,因此在测试中我就用它了。我发现我很喜欢 Nemo。它有一个美丽干净的界面,我喜欢大部分功能并经常使用。它易于使用,同时对我的需求也足够灵活。虽然 Nemo 是 Nautilus 的复刻,但是我发现 Nemo 更好地被集成进了 Cinnamon 环境。Nautilus 界面看上去没有与 Cinnamon 很好集成,与 Cinnamon 不太和谐。 +10. **稳定性。**  Cinnamon 非常稳定且可用。 ### 总结 -Cinnamon 是 GNOME 3 桌面的 fork,它看上去像一个从来没有的 GNOME 桌面。它的发展似乎是 Cinnamon 开发者思考的合乎逻辑的改进被拿来提升和扩展 GNOME 的同时保留了它的独特性以及被非常喜欢的特性。它不再是 GNOME 3 - 它是不同的并且是更好的。Cinnamon 看上去很棒,并且对我而言也工作得很好,并且从 KDE 这个我仍旧非常喜欢的环境切换过来也很顺畅。我花费了几天时间学习 Cinnamon 的不同将怎样使我的桌面体验更好,并且我非常高兴了解这个很棒的桌面。 +Cinnamon 是 GNOME 3 桌面的复刻,它看上去像一个前所未有的 GNOME 桌面。它的发展看起来是符合逻辑的改进, Cinnamon 开发者认为需要在提升和扩展 GNOME 的同时保留它的独特性以及被大家非常喜欢的特性。它不再是 GNOME 3 - 它是不同的并且是更好的。Cinnamon 看上去很棒,并且对我而言也工作得很好,并且从 KDE 这个我仍旧非常喜欢的环境切换过来也很顺畅。我花费了几天时间学习 Cinnamon 的差异如何使我的桌面体验更好,并且我非常高兴了解这个很棒的桌面。 -虽然我喜欢 Cinnamon,但我仍然喜欢体验其他的环境,我目前正切换到 LXDE 桌面,并已经用了几个星期。在我使用一段时间时候,我会分享我的 LXDE 体验。 +虽然我喜欢 Cinnamon,但我仍然喜欢体验其它的环境,我目前正切换到 LXDE 桌面,并已经用了几个星期。在我使用一段时间时候,我会分享我的 LXDE 体验。 + +(题图: [Sam Mugraby][1],Photos8.com. [CC BY 2.0][2]) -------------------------------------------------------------------------------- @@ -68,9 +58,9 @@ David Both 是一个 Linux 和开源倡导者,他居住在北卡罗莱纳州 via: https://opensource.com/article/17/1/cinnamon-desktop-environment -作者:[David Both ][a] +作者:[David Both][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/) 荣誉推出 From 2e505054b1f6b190cd3f16545e50c5608e0e3c35 Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 14 Jun 2017 18:29:34 +0800 Subject: [PATCH 0431/1407] PUB:20170118 10 reasons to use Cinnamon as your Linux desktop environment.md @geekpi --- ...0 reasons to use Cinnamon as your Linux desktop environment.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170118 10 reasons to use Cinnamon as your Linux desktop environment.md (100%) diff --git a/translated/tech/20170118 10 reasons to use Cinnamon as your Linux desktop environment.md b/published/20170118 10 reasons to use Cinnamon as your Linux desktop environment.md similarity index 100% rename from translated/tech/20170118 10 reasons to use Cinnamon as your Linux desktop environment.md rename to published/20170118 10 reasons to use Cinnamon as your Linux desktop environment.md From 7d1cc9cf6d71cf2f89743f272a06e09e4775fdfd Mon Sep 17 00:00:00 2001 From: xllc <392137944@qq.com> Date: Wed, 14 Jun 2017 22:30:11 +0800 Subject: [PATCH 0432/1407] translated by xllc --- ...5 How I got started with bash scripting.md | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 translated/talk/20170515 How I got started with bash scripting.md diff --git a/translated/talk/20170515 How I got started with bash scripting.md b/translated/talk/20170515 How I got started with bash scripting.md new file mode 100644 index 0000000000..ceffb642a2 --- /dev/null +++ b/translated/talk/20170515 How I got started with bash scripting.md @@ -0,0 +1,123 @@ +我是如何开始编写 bash 脚本的? +============================================================ + +### 通过一些简单的 Google 搜索,即使编程入门者也可以尝试编写代码实现将以往枯燥和冗长的任务自动化。 + + + +![How Google helped me learn bash scripting](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/computer_happy_sad_developer_programming.png?itok=5E3k_t_r "How Google helped me learn bash scripting") +>图片来自 : opensource.com + +我前几天写了一个脚本。对于一些人来说,这句话听起来没什么了不起的。而对于另一些人来说,这句话意义重大。要知道,我不是一个程序员,而是一个作家。 + +### 我需要解决什么? + +我的问题相当简单:我需要将工程文件进行分类。这些文件可以从一个网站 URL 以 .zip 的格式下载。当我正手工将它们拷贝到我的电脑桌面,并移动到一个已按照我文件分类的需要进行了结构化的目录时,一位作家同事给我提了建议:_“你为什么不就写个脚本来完成这件事呢?”_ + +我心想:_“就写个脚本?”_——说得好像这是世界上最容易做的事情一样。 + +### Google 是如何解救我的? + +同事的问题促使我思考,并且经过思考后,我进行了 Google 搜索。 + +**Linux 上使用的是什么脚本编程语言?** + +这是我第一个 Google 搜索的准则。也许很多人心里会想:“她太笨了!”是的,我很笨。不过,这的确使我走上了一条解决问题的道路。最常见的搜索结果是 Bash 。嗯,我见过 Bash 。呃,我要分类的文件中有一个就有 Bash 在里面,那无处不在的 **#!/bin/bash** 。我重新看了下那个文件,我知道它的用途,因为我需要将它分类。 + +这引导我进行了下一个 Google 搜索 + +**如何从一个 URL 下载 zip 文件?** + +那确实是我的基本任务。我有一个附带着 .zip 文件的 URL ,它包含有所有我需要分类的文件,所以我寻求万能的 Google 的帮助。搜索到的精华内容和其它一些结果引导我使用 Curl 。但最重要的是:我不仅找到了 Curl ,其中一条置顶的搜索结果还展示了一个使用 Curl 去下载并解压 .zip 文件的 Bash 脚本。这超出了我本来想寻求的答案,但那也使我意识到在 Google 搜索具体的请求可以得到我写这个脚本需要的信息。所以,在收获的推动下,我写了最简单的脚本: + +``` +#!/bin/sh + +curl http://rather.long.url | tar -xz -C my_directory --strip-components=1 +``` + +我迫不及待地运行看看。但我发现一个问题: URL 是会变的,根据我要访问的文件的分组不同而不同。我有新的问题需要解决,这使我进行了下一轮搜索。 + +**参数如何传递给 Bash 脚本?** + +我需要以不同的 URL 和不同的最终目录来运行此脚本。 Google 向我展示了如何使用 **$1**、**$2** 等等来替换我在命令行中运行脚本时输入的内容。比如: +``` +bash myscript.sh http://rather.long.url my_directory +``` + +这就好多了。一切如我所愿,灵活,实用。最重要的是我只要输入一条简短的命令就可以节省 30 分钟无聊的复制、粘贴工作。这个早上的时间花得值得。 + +然后我发现还有一个问题:我很健忘,并且我知道我几个月才运行一次这个脚本。这留给我两个疑问: + +* 我要如何记得运行脚本时输入什么 ( URL 先?还是目录先?)? + +* 如果我被货车撞了,其它作家如何知道该怎样运行我的脚本? + +我需要一个使用说明 —— 如果我使用不正确,则脚本会提示。比如: + +``` +usage: bash yaml-fetch.sh <'snapshot_url'> +``` + +否则,则直接运行脚本。我的下一个搜索是: + +**如何在 Bash 脚本里使用“if/then/else”?** + +幸运的是,我已经知道编程中 **if/then/else** 的存在。我只要找出如何使用它的方法。在这个过程中,我也学到了如何在 Bash 脚本里使用 **echo** 打印。我的最终成果如下: + +``` +#!/bin/sh + +URL=$1 +DIRECTORY=$2 + +if [ $# -eq 0 ]; + then + echo "usage: bash yaml-fetch.sh <'snapshot_url'> ". + else + +     # 如果目录不存在则创建它 + echo 'create directory' + + mkdir $DIRECTORY + + # 下载并解压 yaml 文件 + echo 'fetch and untar the yaml files' + + curl $URL | tar -xz -C $DIRECTORY --strip-components=1 +fi +``` + +### Google 和脚本编程如何震撼我的世界? + +好吧,这稍微有点夸大,不过现在是 21 世纪,学习新东西(特别是稍微简单的东西)比以前简单多了。我所学到的(除了如何写一个简短的、自动分类的 Bash 脚本)是如果我有疑问,那么有很大可能性是其它人在之前也有过相同的疑问。当我困惑的时候,我可以问下一个问题,再下一个问题。最后,我不仅拥有了脚本,还拥有了坚持和习惯于简化其它任务的新技能,这是我之前所没有的。 + +别止步于第一个脚本(或者编程的第一步)。这是一个无异于其它的技能,丰富的信息可以在这一路上帮助你。你无需阅读大量的书或参加一个月的课程。你可以像婴儿学步那样简单地开始写脚本,然后掌握技能并建立自信。人们总有写成千上万行代码,包含分支、合并、修复错误的程序的需要。 + +但是,通过简单的脚本或其它方式来自动化、简单化任务的需求也一样强烈。这就是一个小脚本和小自信能够让你启程。 + +-------------------------------------------------------------------------------- + +作者简介: + +桑德拉麦肯:桑德拉麦肯是一位 Linux 和开源技术的倡导者。她是一位软件开发者、学习资源内容架构师、内容创作者。桑德拉目前是位于韦斯特福德马萨诸塞州的红帽公司的内容创作者,专注于 OpenStack 和 NFV 技术。 + +---- + +via: https://opensource.com/article/17/5/how-i-learned-bash-scripting + +作者:[ Sandra McCann ][a] +译者:[xllc](https://github.com/xllc) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/sandra-mccann +[1]:https://opensource.com/tags/python?src=programming_resource_menu +[2]:https://opensource.com/tags/javascript?src=programming_resource_menu +[3]:https://opensource.com/tags/perl?src=programming_resource_menu +[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu +[5]:https://opensource.com/article/17/5/how-i-learned-bash-scripting?rate=s_R-jmOxcMvs9bi41yRwenl7GINDvbIFYrUMIJ8OBYk +[6]:https://opensource.com/user/39771/feed +[7]:https://opensource.com/article/17/5/how-i-learned-bash-scripting#comments +[8]:https://opensource.com/users/sandra-mccann From 618f5ca9d1c2ddd6813e7a024c75ea1aa20448d5 Mon Sep 17 00:00:00 2001 From: xllc <392137944@qq.com> Date: Wed, 14 Jun 2017 22:31:03 +0800 Subject: [PATCH 0433/1407] Delete 20170515 How I got started with bash scripting.md --- ...5 How I got started with bash scripting.md | 138 ------------------ 1 file changed, 138 deletions(-) delete mode 100644 sources/talk/20170515 How I got started with bash scripting.md diff --git a/sources/talk/20170515 How I got started with bash scripting.md b/sources/talk/20170515 How I got started with bash scripting.md deleted file mode 100644 index 67c10ae521..0000000000 --- a/sources/talk/20170515 How I got started with bash scripting.md +++ /dev/null @@ -1,138 +0,0 @@ -【xllc翻译中】 - -How I got started with bash scripting -============================================================ - -### With a few simple Google searches, a programming novice learned to write code that automates a previously tedious and time-consuming task. - - - -![How Google helped me learn bash scripting](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/computer_happy_sad_developer_programming.png?itok=5E3k_t_r "How Google helped me learn bash scripting") ->Image by : opensource.com - -I wrote a script the other day. For some of you, that sentence sounds like no big deal. For others, and I know you're out there, that sentence is significant. You see, I'm not a programmer. I'm a writer. - -### What I needed to solve - -My problem was fairly simple: I had to juggle files from engineering into our documentation. The files were available in a .zip format from a web URL. I was copying them to my desktop manually, then moving them into a different directory structure to match my documentation needs. A fellow writer gave me this advice:  _"Why don't you just write a script to do this for you?"_ - -Programming and development - -* [New Python content][1] - -* [Our latest JavaScript articles][2] - -* [Recent Perl posts][3] - -* [Red Hat Developers Blog][4] - -​ - -I thought  _"just write a script?!?"_ —as if it was the easiest thing in the world to do. - -### How Google came to the rescue - -My colleague's question got me thinking, and as I thought, I googled. - -**What scripting languages are on Linux?** - -This was my first Google search criteria, and many of you are probably thinking, "She's pretty clueless." Well, I was, but it did set me on a path to solving my problem. The most common result was Bash. Hmm, I've seen Bash. Heck, one of the files I had to document had Bash in it, that ubiquitous line **#!/bin/bash**. I took another look at that file, and I knew what it was doing because I had to document it. - -So that led me to my next Google search request. - -**How to download a zip file from a URL?** - -That was my basic task really. I had a URL with a .zip file containing all the files I needed to include in my documentation, so I asked the All Powerful Google to help me out. That search gem, and a few more, led me to Curl. But here's the best part: Not only did I find Curl, one of the top search hits showed me a Bash script that used Curl to download a .zip file and extract it. That was more than I asked for, but that's when I realized being specific in my Google search requests could give me the information I needed to write this script. So, momentum in my favor, I wrote the simplest of scripts: - -``` -#!/bin/sh - -curl http://rather.long.url | tar -xz -C my_directory --strip-components=1 -``` - -What a moment to see that thing run! But then I realized one gotcha: The URL can change, depending on which set of files I'm trying to access. I had another problem to solve, which led me to my next search. - -**How to pass parameters into a Bash script?** - -I needed to be able to run this script with different URLs and different end directories. Google showed me how to put in **$1**, **$2**, etc., to replace what I typed on the command line with my script. For example: - -``` -bash myscript.sh http://rather.long.url my_directory -``` - -That was much better. Everything was working as I needed it to, I had flexibility, I had a working script, and most of all, I had a short command to type and save myself 30 minutes of copy-paste grunt work. That was a morning well spent. - -Then I realized I had one more problem. You see, my memory is short, and I knew I'd run this script only every couple of months. That left me with two issues: - -* How would I remember what to type for my script (URL first? directory first?)? - -* How would another writer know how to run my script if I got hit by a truck? - -I needed a usage message—something the script would display if I didn't use it correctly. For example: - -``` -usage: bash yaml-fetch.sh <'snapshot_url'> -``` - -Otherwise, run the script. My next search was: - -**How to write "if/then/else" in a Bash script?** - -Fortunately I already knew **if/then/else** existed in programming. I just had to find out how to do that. Along the way, I also learned to print from a Bash script using **echo**. What I ended up with was something like this: - -``` -#!/bin/sh - -URL=$1 -DIRECTORY=$2 - -if [ $# -eq 0 ]; - then - echo "usage: bash yaml-fetch.sh <'snapshot_url'> ". - else - - # make the directory if it doesn't already exist - echo 'create directory' - - mkdir $DIRECTORY - - # fetch and untar the yaml files - echo 'fetch and untar the yaml files' - - curl $URL | tar -xz -C $DIRECTORY --strip-components=1 -fi -``` - -### How Google and scripting rocked my world - -Okay, slight exaggeration there, but this being the 21st century, learning new things (especially somewhat simple things) is a whole lot easier than it used to be. What I learned (besides how to write a short, self-documented Bash script) is that if I have a question, there's a good chance someone else had the same or a similar question before. When I get stumped, I can ask the next question, and the next question. And in the end, not only do I have a script, I have the start of a new skill that I can hold onto and use to simplify other tasks I've been avoiding. - -Don't let that first script (or programming step) get the best of you. It's a skill, like any other, and there's a wealth of information out there to help you along the way. You don't need to read a massive book or take a month-long course. You can do it a simpler way with baby steps and baby scripts that get you started, then build on that skill and your confidence. There will always be a need for folks to write those thousands-of-lines-of-code programs with all the branching and merging and bug-fixing. - -But there is also a strong need for simple scripts and other ways to automate/simplify tasks. And that's where a little script and a little confidence can give you a kickstart. - --------------------------------------------------------------------------------- - -作者简介: - -Sandra McCann - Sandra McCann is a Linux and open source advocate. She's worked as a software developer, content architect for learning resources, and content creator. Sandra is currently a content creator for Red Hat in Westford, MA focusing on OpenStack and NFV techology. - ----- - -via: https://opensource.com/article/17/5/how-i-learned-bash-scripting - -作者:[ Sandra McCann ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/sandra-mccann -[1]:https://opensource.com/tags/python?src=programming_resource_menu -[2]:https://opensource.com/tags/javascript?src=programming_resource_menu -[3]:https://opensource.com/tags/perl?src=programming_resource_menu -[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu -[5]:https://opensource.com/article/17/5/how-i-learned-bash-scripting?rate=s_R-jmOxcMvs9bi41yRwenl7GINDvbIFYrUMIJ8OBYk -[6]:https://opensource.com/user/39771/feed -[7]:https://opensource.com/article/17/5/how-i-learned-bash-scripting#comments -[8]:https://opensource.com/users/sandra-mccann From b95e22f886fbe9189c8d46e5b2e6012e7b478750 Mon Sep 17 00:00:00 2001 From: chenxinlong <237448382@qq.com> Date: Wed, 14 Jun 2017 22:47:58 +0800 Subject: [PATCH 0434/1407] keep updating --- ...20170525 An introduction to Linux s EXT4 filesystem.md | 8 ++++---- 1 file changed, 4 insertions(+), 4 deletions(-) diff --git a/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md b/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md index e281660fa5..916943c3e1 100644 --- a/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md +++ b/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md @@ -62,11 +62,11 @@ Minix 有以下这些结构,其中的大部分位于生成文件系统的分 ![cylindergroup-01_1.png](https://opensource.com/sites/default/files/images/life-uploads/cylindergroup-01_1.png) -Figure 1: The structure of a cylinder group in the EXT filesystems +Figure 1: EXT 文件系统中的柱面组的结构 -The first block in the cylinder group is a superblock, which contains the metadata that defines the other filesystem structures and locates them on the physical disk. Some of the additional groups in the partition will have backup superblocks, but not all. A damaged superblock can be replaced by using a disk utility such as **dd** to copy the contents of a backup superblock to the primary superblock. It does not happen often, but once, many years ago, I had a damaged superblock, and I was able to restore its contents using one of the backup superblocks. Fortunately, I had been foresighted and used the **dumpe2fs** command to dump the descriptor information of the partitions on my system. +柱面组中的第一个块是一个超级块,它包含了一个定义了其他文件系统的结构并将其定位于物理硬盘的具体分区上的元数据。分区中有一些柱面组还会有备用超级块,但并不是所有的柱面组都有。我们还可以使用例如 **dd** 等磁盘工具来拷贝备用超级块的内容到主超级块上以达到更换损坏超级块的目的。虽然这种情况不会经常发生,但是在几年前我的一个超级块损坏了,我就是用这种方法来修复的。幸好,我很有先见之明地使用了 **dumpe2fs** 命令来备份了我的分区描述符信息到我的系统上。 -Following is the partial output from the **dumpe2fs** command. It shows the metadata contained in the superblock, as well as data about each of the first two cylinder groups in the filesystem. +以下是 **dumpe2fs** 命令的一部分输出。这部分输出主要是超级块上包含的一些元数据,同时也是文件系统上的前两个柱面组的数据。 ``` # dumpe2fs /dev/sda1 @@ -150,7 +150,7 @@ Group 3: (Blocks 98304-131071) ``` -Each cylinder group has its own inode bitmap that is used to determine which inodes are used and which are free within that group. The inodes have their own space in each group. Each inode contains information about one file, including the locations of the data blocks belonging to the file. The block bitmap keeps track of the used and free data blocks within the filesystem. Notice that there is a great deal of data about the filesystem in the output shown above. On very large filesystems the group data can run to hundreds of pages in length. The group metadata includes a listing of all of the free data blocks in the group. +每一个柱面组都有自己的 inode 位图用于判定该柱面组中的哪些 inode 是使用中的而哪些又是未被使用的。每一个柱面组的 inode 都有它们自己的空间。每一个 inode 都包含了对应的文件的相关信息,包括其位于该文件的数据块中的位置。The block bitmap keeps track of the used and free data blocks within the filesystem. Notice that there is a great deal of data about the filesystem in the output shown above. On very large filesystems the group data can run to hundreds of pages in length. The group metadata includes a listing of all of the free data blocks in the group. The EXT filesystem implemented data-allocation strategies that ensured minimal file fragmentation. Reducing fragmentation improved filesystem performance. Those strategies are described below, in the section on EXT4. From 213e72df71cd7c8be264b8a81c9950771023a55f Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 15 Jun 2017 05:25:47 +0800 Subject: [PATCH 0435/1407] =?UTF-8?q?PRF:20170308=20Many=20SQL=20Performan?= =?UTF-8?q?ce=20Problems=20Stem=20from=20=20Unnecessary,=20Mandatory=C2=A0?= =?UTF-8?q?Work.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @ictlyh 翻译的很好~ --- ... Stem from Unnecessary, Mandatory Work.md | 107 ++++++++++-------- 1 file changed, 57 insertions(+), 50 deletions(-) diff --git a/translated/tech/20170308 Many SQL Performance Problems Stem from Unnecessary, Mandatory Work.md b/translated/tech/20170308 Many SQL Performance Problems Stem from Unnecessary, Mandatory Work.md index 19d0013557..70148a5af7 100644 --- a/translated/tech/20170308 Many SQL Performance Problems Stem from Unnecessary, Mandatory Work.md +++ b/translated/tech/20170308 Many SQL Performance Problems Stem from Unnecessary, Mandatory Work.md @@ -1,15 +1,15 @@ 许多 SQL 性能问题来自于“不必要的强制性工作” -============================================================  +===================================== -在编写高效 SQL 时,你可能遇到的最有影响力的事情就是[索引][1]。但是,一个很重要的事实就是很多 SQL 客户端要求数据库做很多**“不必要的强制性工作”**。 +在编写高效 SQL 时,你可能遇到的最有影响的事情就是[索引][1]。但是,一个很重要的事实就是很多 SQL 客户端要求数据库做很多**“不必要的强制性工作”**。 跟我再重复一遍: > 不必要的强制性工作 -什么是**“不必要的强制性工作”**?包括两个方面: +什么是**“不必要的强制性工作”**?这个意思包括两个方面: -### 不必要 +### 不必要的 假设你的客户端应用程序需要这些信息: @@ -17,18 +17,21 @@ ![](https://lukaseder.files.wordpress.com/2017/03/title-rating.png?w=662) ][2] -没什么特别的。我们运行着一个电影数据库([例如 Sakila 数据库][3]),我们想要给用户显示每部电影的名称和评分。 +这没什么特别的。我们运行着一个电影数据库([例如 Sakila 数据库][3]),我们想要给用户显示每部电影的名称和评分。 -这是能产生上面结果的查询: +这是能产生上面结果的查询: +``` +SELECT title, rating +FROM film +``` - `SELECT title, rating` - `FROM film` +然而,我们的应用程序(或者我们的 ORM(LCTT 译注:Object-Relational Mapping,对象关系映射))运行的查询却是: -然而,我们的应用程序(或者我们的 ORM(LCTT 译注:Object-relational mapping,对象关系映射))运行的查询却是: - -`SELECT *` -`FROM film` +``` +SELECT * +FROM film +``` 我们得到什么?猜一下。我们得到很多无用的信息: @@ -36,7 +39,7 @@ ![](https://lukaseder.files.wordpress.com/2017/03/useless-information.png?w=662&h=131) ][4] -甚至从头到尾有复杂的 JSON 数据,加载过程包括: +甚至一些复杂的 JSON 数据全程在下列环节中加载: * 从磁盘 * 加载到缓存 @@ -44,19 +47,19 @@ * 进入客户端内存 * 然后被丢弃 -是的,我们丢弃了其中大部分的信息。检索它所做的工作完全就是不必要的。对吧?是的。 +是的,我们丢弃了其中大部分的信息。检索它所做的工作完全就是不必要的。对吧?没错。 ### 强制性 -这是最严重的部分。现今随着优化器变得相当聪明,对于数据库来说这些工作都是强制性的。数据库没有办法_知道_客户端应用程序实际上不需要其中 95% 的数据。这只是一个简单的例子。想象一下如果我们连接更多的表... +这是最糟糕的部分。现今随着优化器变得越来越聪明,这些工作对于数据库来说都是强制执行的。数据库没有办法_知道_客户端应用程序实际上不需要其中 95% 的数据。这只是一个简单的例子。想象一下如果我们连接更多的表... -你想想那会怎样呢?数据库会快吗?让我给你一些之前你可能没有想到的见解: +你想想那会怎样呢?数据库还快吗?让我们来看看一些之前你可能没有想到的地方: ### 内存消耗 -当然,单独的执行时间不会变化很大。可能是慢 1.5 倍,但我们可以忍受,是吧?为方便起见?有时候确实如此。但是如果你_每次_都为了方便而牺牲性能,事情就大了。我们不在讨论性能(单个查询的速度),而是吞吐量(系统响应时间),这就是事情变得困难而难以解决的时候。你无法再进行扩展。 +当然,单次执行时间不会变化很大。可能是慢 1.5 倍,但我们可以忍受,是吧?为方便起见,有时候确实如此。但是如果你_每次_都为了方便而牺牲性能,这事情就大了。我们不说性能问题(单个查询的速度),而是关注在吞吐量上时(系统响应时间),事情就变得困难而难以解决。你就会受阻于规模的扩大。 -让我们来看看执行计划,这是 Oracle的: +让我们来看看执行计划,这是 Oracle 的: ``` -------------------------------------------------- @@ -67,7 +70,7 @@ -------------------------------------------------- ``` -对比 +对比一下: ``` -------------------------------------------------- @@ -78,9 +81,9 @@ -------------------------------------------------- ``` -当执行 `SELECT *` 而不是 `SELECT film, rating` 的时候,数据库中我们使用了 8 倍的内存。这并不奇怪,对吧?我们早就知道了。在很多很多我们并不需要其中全部数据的查询中,我们仍然接受了。我们为数据库产生了**不必要的强制性工作**,后果累加了起来。我们使用了 8 倍的内存(当然,数值可能有些不同)。 +当执行 `SELECT *` 而不是 `SELECT film, rating` 的时候,我们在数据库中使用了 8 倍之多的内存。这并不奇怪,对吧?我们早就知道了。在很多我们并不需要其中全部数据的查询中我们都是这样做的。我们为数据库产生了**不必要的强制性工作**,其后果累加了起来,就是我们使用了多达 8 倍的内存(当然,数值可能有些不同)。 -现在,所有其它步骤(磁盘 I/O、总线传输、客户端内存消耗)也受到相同的影响,我这里就跳过了。另外,我还想看看... +而现在,所有其它的步骤(比如,磁盘 I/O、总线传输、客户端内存消耗)也受到相同的影响,我这里就跳过了。另外,我还想看看... ### 索引使用 @@ -88,9 +91,11 @@ 看看这个查询: - `SELECT` `*` - `FROM` `actor` - `WHERE` `last_name` `LIKE` `'A%'` +``` +SELECT * +FROM actor +WHERE last_name LIKE 'A%' +``` 执行计划中没有什么特别之处。它只是个简单的查询。索引范围扫描、表访问,就结束了: @@ -104,15 +109,19 @@ ------------------------------------------------------------------- ``` -这是个好计划吗?如果我们想要的就是这些,那么它就不是: +这是个好计划吗?如果我们只是想要这些,那么它就不是: [ ![](https://lukaseder.files.wordpress.com/2017/03/first-name-last-name.png?w=662) ][6] -当然,我们浪费了内存等等。再来看看这个查询: +当然,我们浪费了内存之类的。再来看看这个查询: -| 123 | `SELECT` `first_name, last_name``FROM` `actor``WHERE` `last_name` `LIKE` `'A%'` | +``` +SELECT first_name, last_name +FROM actor +WHERE last_name LIKE 'A%' +``` 它的计划是: @@ -125,9 +134,9 @@ ---------------------------------------------------- ``` -现在我们可以完全消除表访问,因为有一个索引涵盖了我们查询需要的所有东西...一个涵盖索引。这很重要吗?当然!这种方法可以将你的一些查询加速一个数量级(如果更改后你的索引不在涵盖,可能会降低一个数量级)。 +现在我们可以完全消除表访问,因为有一个索引涵盖了我们查询需要的所有东西……一个涵盖索引。这很重要吗?当然!这种方法可以将你的某些查询加速一个数量级(如果在某个更改后你的索引不再涵盖,可能会降低一个数量级)。 -你不能总是从涵盖索引中获利。索引有它们自己的成本,你不应该添加太多索引,例如像这种情况,就是不明智的。让我们来做个测试: +你不能总是从涵盖索引中获利。索引也有它们自己的成本,你不应该添加太多索引,例如像这种情况就是不明智的。让我们来做个测试: ``` SET SERVEROUTPUT ON @@ -192,15 +201,15 @@ Statement 2 : +000000000 00:00:02.261000000 Statement 3 : +000000000 00:00:01.857000000 ``` -注意,表 actor 只有 4 列,因此语句 1 和 2 的差别并不是太令人印象深刻,但仍然很重要。还要注意我使用了 Oracle 的提示强制优化器为查询选择一个或其它索引。在这种情况下语句 3 明显胜利。这是一个好_很多_的查询,也是一个十分简单的查询。 +注意,表 actor 只有 4 列,因此语句 1 和 2 的差别并不是太令人印象深刻,但仍然很重要。还要注意我使用了 Oracle 的提示来强制优化器为查询选择一个或其它索引。在这种情况下语句 3 明显胜利。这是一个好_很多_的查询,也是一个十分简单的查询。 -当我们写 `SELECT *` 语句时,我们为数据库带来了**不必要的强制性工作**,这是无法优化的。它不会使用涵盖索引,因为比起它使用的 `LAST_NAME` 索引,涵盖索引开销更多一点,不管怎样,它都要访问表以获取无用的 `LAST_UPDATE` 列。 +当我们写 `SELECT *` 语句时,我们为数据库带来了**不必要的强制性工作**,这是无法优化的。它不会使用涵盖索引,因为比起它所使用的 `LAST_NAME` 索引,涵盖索引开销更多一点,不管怎样,它都要访问表以获取无用的 `LAST_UPDATE` 列。 -使用 `SELECT *` 会变得更糟。考虑... +使用 `SELECT *` 会变得更糟。考虑一下…… ### SQL 转换 -优化器工作的很好,因为它们转换了你的 SQL 查询([看我最近在 Voxxed Days Zurich 关于这方面的演讲][7])。例如,其中有一个称为“`连接`消除”的转换,它真的很强大。考虑这个辅助视图,我们写了这个视图,因为我们变得难以置信地厌倦总是连接所有这些表: +优化器工作的很好,因为它们转换了你的 SQL 查询([看我最近在 Voxxed Days Zurich 关于这方面的演讲][7])。例如,其中有一个称为“表连接消除”的转换,它真的很强大。看看这个辅助视图,我们写了这个视图是因为我们非常讨厌总是连接所有这些表: ``` CREATE VIEW v_customer AS @@ -239,9 +248,9 @@ FROM v_customer ---------------------------------------------------------------- ``` -当然是这样。我们运行所有这些连接以及全表扫描,因为这就是我们让数据库去做的。获取所有的数据。 +当然是这样。我们运行了所有这些表连接以及全表扫描,因为这就是我们让数据库去做的:获取所有的数据。 -现在,再一次想象,对于一个特定场景,我们真正想要的是: +现在,再一次想一下,对于一个特定场景,我们真正想要的是: [ ![](https://lukaseder.files.wordpress.com/2017/03/first-name-last-name-customers.png?w=662) @@ -254,7 +263,6 @@ SELECT first_name, last_name FROM v_customer ``` - 再来看看结果! ``` @@ -268,9 +276,9 @@ FROM v_customer ------------------------------------------------------------------ ``` -这是执行计划一个_极大的_进步。我们的连接被消除了,因为优化器可以证明它们是**不必要的**,因此一旦它可以证明这点(而且你不会使用 select * 使其成为**强制性**工作),它就可以移除这些工作并不执行它。为什么会发生这种情况? +这是执行计划一个_极大的_进步。我们的表连接被消除了,因为优化器可以证明它们是**不必要的**,因此一旦它可以证明这点(而且你不会因使用 `select *` 而使其成为**强制性**工作),它就可以移除这些工作并不执行它。为什么会发生这种情况? -每个 `CUSTOMER.ADDRESS_ID` 外键保证了_有且只有一个_`ADDRESS.ADDRESS_ID` 主键值,因此可以保证 `JOIN` 操作是对一连接,它不会产生或者删除行。如果我们甚至不选择行或者查询行,当然,我们就不需要真正地去加载行。可证明地移除 `JOIN` 并不会改变查询的结果。 +每个 `CUSTOMER.ADDRESS_ID` 外键保证了_有且只有一个_ `ADDRESS.ADDRESS_ID` 主键值,因此可以保证 `JOIN` 操作是对一连接,它不会产生或者删除行。如果我们甚至不选择行或查询行,当然我们就不需要真正地去加载行。可以证实地移除 `JOIN` 并不会改变查询的结果。 数据库总是会做这些事情。你可以在大部分数据库上尝试它: @@ -285,32 +293,31 @@ FROM dual SELECT EXISTS (SELECT 1 / 0) ``` -在这种情况下,你可能预料会抛出算术异常,当你运行这个查询时: +在这种情况下,当你运行这个查询时你可能预料到会抛出算术异常: ``` SELECT 1 / 0 FROM dual ``` - -产生了 +产生了: ``` ORA-01476: divisor is equal to zero ``` -但它没有发生。优化器(甚至解析器)可以证明 `EXISTS (SELECT ..)` 谓词内的任何 `SELECT` 列表达式不会改变查询的结果,因此也就没有必要计算它的值。呵! +但它并没有发生。优化器(甚至解析器)可以证明 `EXISTS (SELECT ..)` 谓词内的任何 `SELECT` 列表达式不会改变查询的结果,因此也就没有必要计算它的值。呵! -### 同时... +### 同时…… -大部分 ORM 的最不幸问题就是事实上他们很随意就写出了 `SELECT *` 查询。事实上,例如 HQL / JPQL,设置默认使用它。你甚至可以完全抛弃 `SELECT` 从句,因为毕竟你想要获取所有实体,正如声明的那样,对吧? +大部分 ORM 最不幸问题就是事实上他们很随意就写出了 `SELECT *` 查询。事实上,例如 HQL / JPQL,就设置默认使用它。你甚至可以完全抛弃 `SELECT` 从句,因为毕竟你想要获取所有实体,正如声明的那样,对吧? 例如: `FROM` `v_customer` -例如[Vlad Mihalcea][9](一个 Hibernate 专家和 Hibernate 开发倡导者)建议你每次确定不想要在获取后进行任何更改时再使用查询。ORM 使解决对象图持久化问题变得简单。注意:持久化。真正修改对象图并持久化修改的想法是固有的。 +例如 [Vlad Mihalcea][9](一个 Hibernate 专家和 Hibernate 开发倡导者)建议你每次确定不想要在获取后进行任何更改时再使用查询。ORM 使解决对象图持久化问题变得简单。注意:持久化。真正修改对象图并持久化修改的想法是固有的。 -但如果你不想那样做,为什么要抓取实体呢?为什么不写一个查询?让我们清楚一点:从性能角度,针对你正在解决的用例写一个查询_总是_会胜过其它选项。你可以不会在意,因为你的数据集很小,没关系。可以。但最终,你需要扩展然后重新设计你的应用程序以便在强制实体图遍历之上支持查询语言,这会很困难。你也需要做其它事情。 +但如果你不想那样做,为什么要抓取实体呢?为什么不写一个查询?让我们清楚一点:从性能角度,针对你正在解决的用例写一个查询_总是_会胜过其它选项。你可以不会在意,因为你的数据集很小,没关系。可以。但最终,你需要扩展并重新设计你的应用程序以便在强制实体图遍历之上支持查询语言,就会变得很困难。你也需要做其它事情。 ### 计算出现次数 @@ -349,7 +356,7 @@ SELECT EXISTS ( 它不需要火箭科学家来确定,一旦它找到一个,实际存在谓词就可以马上停止寻找额外的行。因此,如果答案是“没有订单”,速度将会是差不多。但如果结果是“是的,有订单”,那么结果在我们不计算具体次数的情况下就会_大幅_加快。 -因为我们_不在乎_具体的次数。我们告诉数据库去计算它(**不必要的**),数据库不知道我们会丢弃所有大于 1 的结果(**强制性**)。 +因为我们_不在乎_具体的次数。我们告诉数据库去计算它(**不必要的**),而数据库也不知道我们会丢弃所有大于 1 的结果(**强制性**)。 当然,如果你在 JPA 支持的集合上调用 `list.size()` 做同样的事情,情况会变得更糟! @@ -363,7 +370,7 @@ SELECT EXISTS ( 它**强制性**,因为数据库无法证明它是**不必要的**。这些信息只包含在客户端中,对于服务器来说无法访问。因此,数据库需要去做。 -这篇文章大部分在介绍 `SELECT *`,因为这是一个很简单的目标。但是这并不仅限于数据库。这关于客户端要求服务器完成**不必要的强制性工作**的任何分布式算法。你 AngularJS 应用程序平均有多少个 N+1 问题,UI 在服务结果 A 上循环,多次调用服务 B,而不是把所有对 B 的调用打包为一个调用?这是一个复发的模式。 +这篇文章大部分在介绍 `SELECT *`,因为这是一个很简单的目标。但是这并不仅限于数据库。这关系到客户端要求服务器完成**不必要的强制性工作**的任何分布式算法。你的 AngularJS 应用程序平均有多少个 N+1 问题,UI 在服务结果 A 上循环,多次调用服务 B,而不是把所有对 B 的调用打包为一个调用?这是一个复发的模式。 解决方法总是相同。你给执行你命令的实体越多信息,(理论上)它能更快执行这样的命令。每次都写一个好的查询。你的整个系统都会为此感谢你的。 @@ -375,9 +382,9 @@ SELECT EXISTS ( via: https://blog.jooq.org/2017/03/08/many-sql-performance-problems-stem-from-unnecessary-mandatory-work -作者:[ jooq][a] +作者:[jooq][a] 译者:[ictlyh](https://github.com/ictlyh) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 9280c127da167bb7bc7c05bd8541d200a72ccfe3 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 15 Jun 2017 05:26:00 +0800 Subject: [PATCH 0436/1407] =?UTF-8?q?PUB:20170308=20Many=20SQL=20Performan?= =?UTF-8?q?ce=20Problems=20Stem=20from=20=20Unnecessary,=20Mandatory=C2=A0?= =?UTF-8?q?Work.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @ictlyh --- ...Performance Problems Stem from Unnecessary, Mandatory Work.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170308 Many SQL Performance Problems Stem from Unnecessary, Mandatory Work.md (100%) diff --git a/translated/tech/20170308 Many SQL Performance Problems Stem from Unnecessary, Mandatory Work.md b/published/20170308 Many SQL Performance Problems Stem from Unnecessary, Mandatory Work.md similarity index 100% rename from translated/tech/20170308 Many SQL Performance Problems Stem from Unnecessary, Mandatory Work.md rename to published/20170308 Many SQL Performance Problems Stem from Unnecessary, Mandatory Work.md From c6cac18ebfa71a42fb98ab99f1265cdcc59fe6c3 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 15 Jun 2017 06:12:00 +0800 Subject: [PATCH 0437/1407] PRF:20170519 5 reasons the D programming language is a great choice for development.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @ucasFL 翻译的不错,不过对于 range,应该还没有正式定名吧,所以我觉得保留原文比较好? --- ...guage is a great choice for development.md | 47 ++++++++++--------- 1 file changed, 24 insertions(+), 23 deletions(-) diff --git a/translated/tech/20170519 5 reasons the D programming language is a great choice for development.md b/translated/tech/20170519 5 reasons the D programming language is a great choice for development.md index aa8d99d311..05ebfb5d75 100644 --- a/translated/tech/20170519 5 reasons the D programming language is a great choice for development.md +++ b/translated/tech/20170519 5 reasons the D programming language is a great choice for development.md @@ -1,27 +1,26 @@ D 编程语言是用于开发的绝佳语言的 5 个理由 ============================================================ -### D 语言的模块化、开发效率、可读性以及其它一些特性使其非常适合用于协同软件的开发。 +> D 语言的模块化、开发效率、可读性以及其它一些特性使其非常适合用于协同软件的开发。 ![Why the D programming language is great for open source development](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/code_development_programming.png?itok=eYK4UXiq "Why the D programming language is great for open source development") ->图片来自: opensource.com [D 编程语言][8]是一种静态类型的通用编程语言,它具有和 C 语言类似的语法,能够编译为本地代码。许多理由使得它很适合用于开源软件开发,下面讲到的是其中一些理由。 ### 模块化能力 -在大多数情况下,当你有一个好的想法,你可以完全按照你的内心所想的方式通过代码来实现它。然而,有的时候,你不得不向你的想法妥协,从而来适应代码,而不是通过模块化代码来适应想法。 D 语言支持多种[编程范式][9],包括函数式风格、命令式、面向对象、元编程、并发(演员模式)和并行集成。你可以选择任何一种方便的编程范式来模块化代码,从而适应你的想法。 +在大多数情况下,当你有一个好的想法,你可以完全按照你的内心所想的方式通过代码来实现它。然而,有的时候,你不得让你的想法向代码妥协,而不是通过模块化代码来适应想法。D 语言支持多种[编程范式][9],包括函数式风格、命令式、面向对象、元编程、并发(演员模式),这些全都和谐共存。你可以选择任何一种方便的编程范式来将你的想法转换为代码。 -通过使用[模板][10],可以生成额外的 D 代码并在编译的过程中把它编排进去,你可以把这些代码描述成编译器生成代码的一种模式。这是一种非常有用的设计算法,无需把它们绑定到任何特定的类型。平台无关的代码很容易加入到自然的模板中。通过将模板与[条件编译][11]结合,跨平台的应用变得更加容易实现,也更容易接受来自使用不同操作系统的开发者的贡献。有了这一点,一个程序员可以通过很少的代码,利用有限的时间实现很多东西。 +通过使用[模板][10],可以生成额外的 D 代码并在编译的过程中把它编排进去,你可以把这些代码描述成编译器生成代码的一种模式。这是一种非常有用的设计算法,无需把它们绑定到任何特定的类型。由于模版的通用性,就很容易生成平台无关的代码。通过将模板与[条件编译][11]结合,跨平台的应用变得更加容易实现,也更容易接受来自使用不同操作系统的开发者的贡献。有了这一点,一个程序员可以通过很少的代码,利用有限的时间实现很多东西。 -[排列][12] 已经深度集成到了 D 语言中,抽象出当和一个实际执行冲突时如何访问容器元素(比如数组、关联数组和链表等)。这个抽象使得可以在许多容器类型中设计和使用大量的算法,而无需绑定到特定的数据结构。D 的[数组切片][13]是排列的一个实现。在最后,你可以用很少的时间写很少的代码,并且只需要很低的维护成本。 +[range][12] 已经深度集成到了 D 语言中,相对于具体实现,它抽象出容器元素(比如数组、关联数组和链表等)是如何访问的。这个抽象使得可以在许多容器类型中设计和使用大量的算法,而无需绑定到特定的数据结构。D 的[数组切片][13]是 range 的一个实现。最终,你可以用很少的时间写很少的代码,并且只需要很低的维护成本。 ### 开发效率 -大多数开源软件的代码贡献者都是基于有限的时间志愿工作的。 D 语言能够极大的提高开发效率,因为你可以用更少的时间完成更多的事情。D 的模板和排列使得程序员在开发通用代码和可复用代码时效率更高,但这些仅仅是 D 开发效率高的其中几个优势。另外一个主要的吸引力是, D 的编译速度看起来感觉就像解释型语言,比如 Python、JavaScript、Ruby 和 PHP,它使得 D 能够快速成型。 +大多数开源软件的代码贡献者都是基于有限的时间志愿工作的。 D 语言能够极大的提高开发效率,因为你可以用更少的时间完成更多的事情。D 的模板和 range 使得程序员在开发通用代码和可复用代码时效率更高,但这些仅仅是 D 开发效率高的其中几个优势。另外一个主要的吸引力是, D 的编译速度看起来感觉就像解释型语言一样,比如 Python、JavaScript、Ruby 和 PHP,它使得 D 能够快速成型。 -D 可以很容易的与旧的代码进行对接,减少了端口的需要。它的设计目的是自然地[与 C 代码进行对接][14],毕竟, C 语言是遗留代码、精心编写和测试代码、库以及低级系统调用(特别是 Linux 系统)的主人。C++ 代码在[ D 中也是可调用的][15],从而进行更大的扩展。事实上,[Python][16]、[Objective-C][17]、[Lua][18] 和 [Fortran][19] 这些语言在技术层面上也是可以在 D 中使用的,还有许多第三方努力在把 D 语言推向这些领域。这使得大量的开源库在 D 中均可使用,这符合开源软件开发的惯例。 +D 可以很容易的与旧的代码进行对接,减少了移植的需要。它的设计目的是[与 C 代码进行自然地对接][14],毕竟, C 语言大量用在遗留代码、精心编写而测试过的代码、库以及低级系统调用(特别是 Linux 系统)上。C++ 代码在[ D 中也是可调用的][15],从而进行更大的扩展。事实上,[Python][16]、[Objective-C][17]、[Lua][18] 和 [Fortran][19] 这些语言在技术层面上都是可以在 D 中使用的,有许多第三方正在努力在把 D 语言推向这些领域。这使得大量的开源库在 D 中均可使用,这符合开源软件开发的惯例。 ### 可读性和可维护性 @@ -35,23 +34,23 @@ void main() *D 语言的 Hello, World 演示* -对于熟悉 C 语言的人来说, D 代码很容易理解。另外, D 代码的可读性很强,即使是复杂的代码,这使得很容易发现错误。可读性对于吸引贡献者来说也是很重要的,这是开源软件成长的关键。 +对于熟悉 C 语言的人来说, D 代码很容易理解。另外, D 代码的可读性很强,即使是复杂的代码。这使得很容易发现错误。可读性对于吸引贡献者来说也是很重要的,这是开源软件成长的关键。 -在 D 中一个非常简单但很有用的[语法][20]是支持使用下滑线分隔数字,这使得数字的可读性更高。这在数学上很有用: +在 D 中一个非常简单但很有用的[语法糖][20]是支持使用下滑线分隔数字,这使得数字的可读性更高。这在数学上很有用: ``` int count = 100_000_000; double price = 20_220.00 + 10.00; -int number = 0x7FFF_FFFF; // in hexadecimal system +int number = 0x7FFF_FFFF; // 16 进制系统 ``` -[Ddoc][21] 是一个内建的工具,它能够很容易的自动根据代码注释生成文档,而不需要使用额外的工具。文档写作、改进和更新变得更加简单,不具挑战性,因为它伴随代码同时生成。 +[ddoc][21] 是一个内建的工具,它能够很容易的自动根据代码注释生成文档,而不需要使用额外的工具。文档写作、改进和更新变得更加简单,不具挑战性,因为它伴随代码同时生成。 -[契约][22] 能够进行检查,从而确保 D 代码的行为能够像期望的那样。就像法律契约签订是为了确保每一方在协议中做自己该做的事情,在 D 语言中的契约式编程,能够确保实现的每一个函数、类等能够像期望的那样产生期望的结果和行为。这样一个特性对于错误检查非常实用,特别是在开源软件中,当多个人合作一个项目的时候。契约是大项目的救星。D 语言强大的契约式编程特性是内建的,而不是后期添加的。契约不仅使得使用 D 语言更加方便,也减少了正确写作和维护困难的头痛。 +[Contract][22] 能够检查代码的实现,从而确保 D 代码的行为能够像期望的那样。就像法律契约的签订是为了确保每一方在协议中做自己该做的事情,在 D 语言中的契约式编程,能够确保实现的每一个函数、类等如期望的那样产生预期的结果和行为。这样一个特性对于错误检查非常实用,特别是在开源软件中,当多个人合作一个项目的时候。契约是大项目的救星。D 语言强大的契约式编程特性是内建的,而不是后期添加的。契约不仅使得使用 D 语言更加方便,也减少了正确写作和维护困难的头痛。 ### 方便 -协同开发是具有挑战性的,因为代码经常发生变化,并且有许多移动部分。D 语言通过支持在本地范围内导入模块,从而缓解了一些问题: +协同开发是具有挑战性的,因为代码经常发生变化,并且有许多移动部分。D 语言通过支持在本地范围内导入模块,从而缓解了那些问题: ``` // 返回偶数 @@ -64,11 +63,11 @@ int[] evenNumbers(int[] numbers) } ``` -*通过**过滤**使用 "!"运算符是[模板参数][5]的一个语法* +*对 filter 使用 `!` 运算符是[模板参数][5]的一个语法* 上面的函数可以在不破坏代码的情况下调用,因为它不依赖任何全局导入模块。像这样实现的函数都可以在后期无需破坏代码的情况下增强,这是协同开发的好东西。 -[通用函数调用语法][23]是 D 语言中的一个特殊语法,它允许像调用一个对象的成员函数那样调用正则函数。一个函数的定义如下: +[通用函数调用语法(UFCS)][23]是 D 语言中的一个语法糖,它允许像调用一个对象的成员函数那样调用常规函数。一个函数的定义如下: ``` void cook(string food, int quantity) @@ -87,7 +86,7 @@ int quantity = 3; cook(food, quantity); ``` -通过 UFCS,这个函数也可以像下面这样调用,看起来好像 **cook** 是一个成员函数: +通过 UFCS,这个函数也可以像下面这样调用,看起来好像 `cook` 是一个成员函数: ``` string food = "rice"; @@ -96,7 +95,7 @@ int quantity = 3; food.cook(quantity); ``` -在编译过程中,编译器会自动把 **food** 作为 **cook** 函数的第一个参数。UFCS 使得它能够连接正则函数,给你的代码产生一种函数风格编程的自然感觉。UFCS 在 D 语言中被大量使用,就像在上面的 **evenNumbers** 函数中使用的**过滤**和**数组**功能那样。结合模板、排列、条件编译和 UFCS 能够在不牺牲方便性的前提下给予你强大的力量。 +在编译过程中,编译器会自动把 `food` 作为 `cook` 函数的第一个参数。UFCS 使得它能够链起来常规函数,给你的代码产生一种函数风格编程的自然感觉。UFCS 在 D 语言中被大量使用,就像在上面的 `evenNumbers` 函数中使用的 `filter` 和 `array` 函数那样。结合模板、range、条件编译和 UFCS 能够在不牺牲方便性的前提下给予你强大的力量。 `auto` 关键词可以用来代替任何类型。编译器在编译过程中会静态推断类型。这样可以省去输入很长的类型名字,让你感觉写 D 代码就像是在写动态类型语言。 @@ -114,7 +113,7 @@ auto dictionary = ["one": 1, "two": 2, "three": 3]; // type of int[string] auto cook(string food) {...} // auto for a function return type ``` -D 的[foreach][24] 循环允许遍历集合和所有不同的强调数据类型: +D 的[foreach][24] 循环允许遍历各种不同的底层数据类型的集合和 range: ``` foreach(name; ["John", "Yaw", "Paul", "Kofi", "Ama"]) @@ -131,7 +130,7 @@ Student[] students = [new Student(), new Student()]; foreach(student; students) {...} ``` -D 语言中内建的[单元测试][25]不仅免除了使用外部工具的需要,也方便了程序员在自己的代码中执行测试。所有的测试用例都位于定制的 `unittest{}` 块中: +D 语言中内建的[单元测试][25]不仅免除了使用外部工具的需要,也方便了程序员在自己的代码中执行测试。所有的测试用例都位于可定制的 `unittest{}` 块中: ``` int[] evenNumbers(int[] numbers) @@ -149,17 +148,19 @@ unittest 使用 D 语言的标准编译器 DMD,你可以通过增加 `-unittest` 编译器标志把所有的测试编译进可执行结果中。 -[Dub][26] 是 D 语言的一个内建包管理器和构建工具,使用它可以很容易的添加来自 [Dub package registry][27] 的第三方库。Dub 可以在编译过程中下载、编译和链接这些包,同时也会升级到新版本。 +[Dub][26] 是 D 语言的一个内建包管理器和构建工具,使用它可以很容易的添加来自 [Dub package registry][27] 的第三方库。Dub 可以在编译过程中下载、编译和链接这些包,同时也会升级到新版本。 ### 选择 除了提供多种编程范例和功能特性外,D 还提供其他的选择。它目前有三个可用的开源编译器。官方编译器 DMD 使用它自己的后端,另外两个编译器 GDC 和 LDC,分别使用 GCC 和 LLVM 后端。DMD 以编译速度块而著称,而 LDC 和 GDC 则以在很短的编译时间内生成快速生成机器代码而著称。你可以自由选择其中一个以适应你的使用情况。 -默认情况下, D 语言是采用[垃圾收集][28]的内存分配方式的。你也可以选择手动进行内存管理,如果你想的话,甚至可以进行引用计数。一切选择都是你的。 +默认情况下,D 语言是采用[垃圾收集][28]的内存分配方式的。你也可以选择手动进行内存管理,如果你想的话,甚至可以进行引用计数。一切选择都是你的。 ### 更多 -在这个简要的讨论中,还有许多 D 语言好的特性没有涉及到。我强烈推荐阅读 [D 语言的特性概述][29],隐藏在[标准库][30]中的宝藏,以及[ D 的使用区域][31],从而进一步了解人们用它来干什么。许多阻止已经[使用 D 语言来进行开发][32]。最后,如果你打算开始学习 D 语言,那么请看这本书 *[D 语言编程][6]*。 +在这个简要的讨论中,还有许多 D 语言好的特性没有涉及到。我强烈推荐阅读 [D 语言的特性概述][29],这是隐藏在[标准库][30]中的宝藏,以及 [D 语言的使用区域][31],从而进一步了解人们用它来干什么。许多组织已经[使用 D 语言来进行开发][32]。最后,如果你打算开始学习 D 语言,那么请看这本书 *[D 语言编程][6]*。 + +(题图:opensource.com) -------------------------------------------------------------------------------- @@ -167,7 +168,7 @@ via: https://opensource.com/article/17/5/d-open-source-software-development 作者:[Lawrence Aberba][a] 译者:[ucasFL](https://github.com/ucasFL) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From e5043770bd77afedf8a3dd817457bd9147b1d979 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 15 Jun 2017 06:12:42 +0800 Subject: [PATCH 0438/1407] PUB:20170519 5 reasons the D programming language is a great choice for development.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @ucasFL 明天发布 --- ...he D programming language is a great choice for development.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170519 5 reasons the D programming language is a great choice for development.md (100%) diff --git a/translated/tech/20170519 5 reasons the D programming language is a great choice for development.md b/published/20170519 5 reasons the D programming language is a great choice for development.md similarity index 100% rename from translated/tech/20170519 5 reasons the D programming language is a great choice for development.md rename to published/20170519 5 reasons the D programming language is a great choice for development.md From e0a2f673851efcc749b583c71261e039f82f648b Mon Sep 17 00:00:00 2001 From: xllc <392137944@qq.com> Date: Thu, 15 Jun 2017 08:50:34 +0800 Subject: [PATCH 0439/1407] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=20(#5697)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * translated by xllc * Delete 20170515 How I got started with bash scripting.md --- ...5 How I got started with bash scripting.md | 138 ------------------ ...5 How I got started with bash scripting.md | 123 ++++++++++++++++ 2 files changed, 123 insertions(+), 138 deletions(-) delete mode 100644 sources/talk/20170515 How I got started with bash scripting.md create mode 100644 translated/talk/20170515 How I got started with bash scripting.md diff --git a/sources/talk/20170515 How I got started with bash scripting.md b/sources/talk/20170515 How I got started with bash scripting.md deleted file mode 100644 index 67c10ae521..0000000000 --- a/sources/talk/20170515 How I got started with bash scripting.md +++ /dev/null @@ -1,138 +0,0 @@ -【xllc翻译中】 - -How I got started with bash scripting -============================================================ - -### With a few simple Google searches, a programming novice learned to write code that automates a previously tedious and time-consuming task. - - - -![How Google helped me learn bash scripting](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/computer_happy_sad_developer_programming.png?itok=5E3k_t_r "How Google helped me learn bash scripting") ->Image by : opensource.com - -I wrote a script the other day. For some of you, that sentence sounds like no big deal. For others, and I know you're out there, that sentence is significant. You see, I'm not a programmer. I'm a writer. - -### What I needed to solve - -My problem was fairly simple: I had to juggle files from engineering into our documentation. The files were available in a .zip format from a web URL. I was copying them to my desktop manually, then moving them into a different directory structure to match my documentation needs. A fellow writer gave me this advice:  _"Why don't you just write a script to do this for you?"_ - -Programming and development - -* [New Python content][1] - -* [Our latest JavaScript articles][2] - -* [Recent Perl posts][3] - -* [Red Hat Developers Blog][4] - -​ - -I thought  _"just write a script?!?"_ —as if it was the easiest thing in the world to do. - -### How Google came to the rescue - -My colleague's question got me thinking, and as I thought, I googled. - -**What scripting languages are on Linux?** - -This was my first Google search criteria, and many of you are probably thinking, "She's pretty clueless." Well, I was, but it did set me on a path to solving my problem. The most common result was Bash. Hmm, I've seen Bash. Heck, one of the files I had to document had Bash in it, that ubiquitous line **#!/bin/bash**. I took another look at that file, and I knew what it was doing because I had to document it. - -So that led me to my next Google search request. - -**How to download a zip file from a URL?** - -That was my basic task really. I had a URL with a .zip file containing all the files I needed to include in my documentation, so I asked the All Powerful Google to help me out. That search gem, and a few more, led me to Curl. But here's the best part: Not only did I find Curl, one of the top search hits showed me a Bash script that used Curl to download a .zip file and extract it. That was more than I asked for, but that's when I realized being specific in my Google search requests could give me the information I needed to write this script. So, momentum in my favor, I wrote the simplest of scripts: - -``` -#!/bin/sh - -curl http://rather.long.url | tar -xz -C my_directory --strip-components=1 -``` - -What a moment to see that thing run! But then I realized one gotcha: The URL can change, depending on which set of files I'm trying to access. I had another problem to solve, which led me to my next search. - -**How to pass parameters into a Bash script?** - -I needed to be able to run this script with different URLs and different end directories. Google showed me how to put in **$1**, **$2**, etc., to replace what I typed on the command line with my script. For example: - -``` -bash myscript.sh http://rather.long.url my_directory -``` - -That was much better. Everything was working as I needed it to, I had flexibility, I had a working script, and most of all, I had a short command to type and save myself 30 minutes of copy-paste grunt work. That was a morning well spent. - -Then I realized I had one more problem. You see, my memory is short, and I knew I'd run this script only every couple of months. That left me with two issues: - -* How would I remember what to type for my script (URL first? directory first?)? - -* How would another writer know how to run my script if I got hit by a truck? - -I needed a usage message—something the script would display if I didn't use it correctly. For example: - -``` -usage: bash yaml-fetch.sh <'snapshot_url'> -``` - -Otherwise, run the script. My next search was: - -**How to write "if/then/else" in a Bash script?** - -Fortunately I already knew **if/then/else** existed in programming. I just had to find out how to do that. Along the way, I also learned to print from a Bash script using **echo**. What I ended up with was something like this: - -``` -#!/bin/sh - -URL=$1 -DIRECTORY=$2 - -if [ $# -eq 0 ]; - then - echo "usage: bash yaml-fetch.sh <'snapshot_url'> ". - else - - # make the directory if it doesn't already exist - echo 'create directory' - - mkdir $DIRECTORY - - # fetch and untar the yaml files - echo 'fetch and untar the yaml files' - - curl $URL | tar -xz -C $DIRECTORY --strip-components=1 -fi -``` - -### How Google and scripting rocked my world - -Okay, slight exaggeration there, but this being the 21st century, learning new things (especially somewhat simple things) is a whole lot easier than it used to be. What I learned (besides how to write a short, self-documented Bash script) is that if I have a question, there's a good chance someone else had the same or a similar question before. When I get stumped, I can ask the next question, and the next question. And in the end, not only do I have a script, I have the start of a new skill that I can hold onto and use to simplify other tasks I've been avoiding. - -Don't let that first script (or programming step) get the best of you. It's a skill, like any other, and there's a wealth of information out there to help you along the way. You don't need to read a massive book or take a month-long course. You can do it a simpler way with baby steps and baby scripts that get you started, then build on that skill and your confidence. There will always be a need for folks to write those thousands-of-lines-of-code programs with all the branching and merging and bug-fixing. - -But there is also a strong need for simple scripts and other ways to automate/simplify tasks. And that's where a little script and a little confidence can give you a kickstart. - --------------------------------------------------------------------------------- - -作者简介: - -Sandra McCann - Sandra McCann is a Linux and open source advocate. She's worked as a software developer, content architect for learning resources, and content creator. Sandra is currently a content creator for Red Hat in Westford, MA focusing on OpenStack and NFV techology. - ----- - -via: https://opensource.com/article/17/5/how-i-learned-bash-scripting - -作者:[ Sandra McCann ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/sandra-mccann -[1]:https://opensource.com/tags/python?src=programming_resource_menu -[2]:https://opensource.com/tags/javascript?src=programming_resource_menu -[3]:https://opensource.com/tags/perl?src=programming_resource_menu -[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu -[5]:https://opensource.com/article/17/5/how-i-learned-bash-scripting?rate=s_R-jmOxcMvs9bi41yRwenl7GINDvbIFYrUMIJ8OBYk -[6]:https://opensource.com/user/39771/feed -[7]:https://opensource.com/article/17/5/how-i-learned-bash-scripting#comments -[8]:https://opensource.com/users/sandra-mccann diff --git a/translated/talk/20170515 How I got started with bash scripting.md b/translated/talk/20170515 How I got started with bash scripting.md new file mode 100644 index 0000000000..ceffb642a2 --- /dev/null +++ b/translated/talk/20170515 How I got started with bash scripting.md @@ -0,0 +1,123 @@ +我是如何开始编写 bash 脚本的? +============================================================ + +### 通过一些简单的 Google 搜索,即使编程入门者也可以尝试编写代码实现将以往枯燥和冗长的任务自动化。 + + + +![How Google helped me learn bash scripting](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/computer_happy_sad_developer_programming.png?itok=5E3k_t_r "How Google helped me learn bash scripting") +>图片来自 : opensource.com + +我前几天写了一个脚本。对于一些人来说,这句话听起来没什么了不起的。而对于另一些人来说,这句话意义重大。要知道,我不是一个程序员,而是一个作家。 + +### 我需要解决什么? + +我的问题相当简单:我需要将工程文件进行分类。这些文件可以从一个网站 URL 以 .zip 的格式下载。当我正手工将它们拷贝到我的电脑桌面,并移动到一个已按照我文件分类的需要进行了结构化的目录时,一位作家同事给我提了建议:_“你为什么不就写个脚本来完成这件事呢?”_ + +我心想:_“就写个脚本?”_——说得好像这是世界上最容易做的事情一样。 + +### Google 是如何解救我的? + +同事的问题促使我思考,并且经过思考后,我进行了 Google 搜索。 + +**Linux 上使用的是什么脚本编程语言?** + +这是我第一个 Google 搜索的准则。也许很多人心里会想:“她太笨了!”是的,我很笨。不过,这的确使我走上了一条解决问题的道路。最常见的搜索结果是 Bash 。嗯,我见过 Bash 。呃,我要分类的文件中有一个就有 Bash 在里面,那无处不在的 **#!/bin/bash** 。我重新看了下那个文件,我知道它的用途,因为我需要将它分类。 + +这引导我进行了下一个 Google 搜索 + +**如何从一个 URL 下载 zip 文件?** + +那确实是我的基本任务。我有一个附带着 .zip 文件的 URL ,它包含有所有我需要分类的文件,所以我寻求万能的 Google 的帮助。搜索到的精华内容和其它一些结果引导我使用 Curl 。但最重要的是:我不仅找到了 Curl ,其中一条置顶的搜索结果还展示了一个使用 Curl 去下载并解压 .zip 文件的 Bash 脚本。这超出了我本来想寻求的答案,但那也使我意识到在 Google 搜索具体的请求可以得到我写这个脚本需要的信息。所以,在收获的推动下,我写了最简单的脚本: + +``` +#!/bin/sh + +curl http://rather.long.url | tar -xz -C my_directory --strip-components=1 +``` + +我迫不及待地运行看看。但我发现一个问题: URL 是会变的,根据我要访问的文件的分组不同而不同。我有新的问题需要解决,这使我进行了下一轮搜索。 + +**参数如何传递给 Bash 脚本?** + +我需要以不同的 URL 和不同的最终目录来运行此脚本。 Google 向我展示了如何使用 **$1**、**$2** 等等来替换我在命令行中运行脚本时输入的内容。比如: +``` +bash myscript.sh http://rather.long.url my_directory +``` + +这就好多了。一切如我所愿,灵活,实用。最重要的是我只要输入一条简短的命令就可以节省 30 分钟无聊的复制、粘贴工作。这个早上的时间花得值得。 + +然后我发现还有一个问题:我很健忘,并且我知道我几个月才运行一次这个脚本。这留给我两个疑问: + +* 我要如何记得运行脚本时输入什么 ( URL 先?还是目录先?)? + +* 如果我被货车撞了,其它作家如何知道该怎样运行我的脚本? + +我需要一个使用说明 —— 如果我使用不正确,则脚本会提示。比如: + +``` +usage: bash yaml-fetch.sh <'snapshot_url'> +``` + +否则,则直接运行脚本。我的下一个搜索是: + +**如何在 Bash 脚本里使用“if/then/else”?** + +幸运的是,我已经知道编程中 **if/then/else** 的存在。我只要找出如何使用它的方法。在这个过程中,我也学到了如何在 Bash 脚本里使用 **echo** 打印。我的最终成果如下: + +``` +#!/bin/sh + +URL=$1 +DIRECTORY=$2 + +if [ $# -eq 0 ]; + then + echo "usage: bash yaml-fetch.sh <'snapshot_url'> ". + else + +     # 如果目录不存在则创建它 + echo 'create directory' + + mkdir $DIRECTORY + + # 下载并解压 yaml 文件 + echo 'fetch and untar the yaml files' + + curl $URL | tar -xz -C $DIRECTORY --strip-components=1 +fi +``` + +### Google 和脚本编程如何震撼我的世界? + +好吧,这稍微有点夸大,不过现在是 21 世纪,学习新东西(特别是稍微简单的东西)比以前简单多了。我所学到的(除了如何写一个简短的、自动分类的 Bash 脚本)是如果我有疑问,那么有很大可能性是其它人在之前也有过相同的疑问。当我困惑的时候,我可以问下一个问题,再下一个问题。最后,我不仅拥有了脚本,还拥有了坚持和习惯于简化其它任务的新技能,这是我之前所没有的。 + +别止步于第一个脚本(或者编程的第一步)。这是一个无异于其它的技能,丰富的信息可以在这一路上帮助你。你无需阅读大量的书或参加一个月的课程。你可以像婴儿学步那样简单地开始写脚本,然后掌握技能并建立自信。人们总有写成千上万行代码,包含分支、合并、修复错误的程序的需要。 + +但是,通过简单的脚本或其它方式来自动化、简单化任务的需求也一样强烈。这就是一个小脚本和小自信能够让你启程。 + +-------------------------------------------------------------------------------- + +作者简介: + +桑德拉麦肯:桑德拉麦肯是一位 Linux 和开源技术的倡导者。她是一位软件开发者、学习资源内容架构师、内容创作者。桑德拉目前是位于韦斯特福德马萨诸塞州的红帽公司的内容创作者,专注于 OpenStack 和 NFV 技术。 + +---- + +via: https://opensource.com/article/17/5/how-i-learned-bash-scripting + +作者:[ Sandra McCann ][a] +译者:[xllc](https://github.com/xllc) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/sandra-mccann +[1]:https://opensource.com/tags/python?src=programming_resource_menu +[2]:https://opensource.com/tags/javascript?src=programming_resource_menu +[3]:https://opensource.com/tags/perl?src=programming_resource_menu +[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu +[5]:https://opensource.com/article/17/5/how-i-learned-bash-scripting?rate=s_R-jmOxcMvs9bi41yRwenl7GINDvbIFYrUMIJ8OBYk +[6]:https://opensource.com/user/39771/feed +[7]:https://opensource.com/article/17/5/how-i-learned-bash-scripting#comments +[8]:https://opensource.com/users/sandra-mccann From 93299563caf84bfc6751d1df7afd23982ff7143e Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 15 Jun 2017 09:16:14 +0800 Subject: [PATCH 0440/1407] translated --- ...ow Microsoft is becoming a Linux vendor.md | 62 ------------------- ...ow Microsoft is becoming a Linux vendor.md | 60 ++++++++++++++++++ 2 files changed, 60 insertions(+), 62 deletions(-) delete mode 100644 sources/talk/20170516 How Microsoft is becoming a Linux vendor.md create mode 100644 translated/talk/20170516 How Microsoft is becoming a Linux vendor.md diff --git a/sources/talk/20170516 How Microsoft is becoming a Linux vendor.md b/sources/talk/20170516 How Microsoft is becoming a Linux vendor.md deleted file mode 100644 index 14fb36fb92..0000000000 --- a/sources/talk/20170516 How Microsoft is becoming a Linux vendor.md +++ /dev/null @@ -1,62 +0,0 @@ -transalting---geekpi - -How Microsoft is becoming a Linux vendor -===================================== - - ->Microsoft is bridging the gap with Linux by baking it into its own products. - -![](http://images.techhive.com/images/article/2017/05/microsoft-100722875-large.jpg) - - -Linux and open source technologies have become too dominant in data centers, cloud and IoT for Microsoft to ignore them. - -On Microsoft’s own cloud, one in three machines run Linux. These are Microsoft customers who are running Linux. Microsoft needs to support the platform they use, or they will go somewhere else.  - -Here's how Microsoft's Linux strategy breaks down on its developer platform (Windows 10), on its cloud (Azure) and datacenter (Windows Server). - -**Linux in Windows**: IT professionals managing Linux machines on public or private cloud need native UNIX tooling. Linux and macOS are the only two platforms that offer such native capabilities. No wonder all you see is MacBooks or a few Linux desktops at events like DockerCon, OpenStack Summit or CoreOS Fest. - -To bridge the gap, Microsoft worked with Canonical to build a Linux subsystem within Windows that offers native Linux tooling. It’s a great compromise, where IT professionals can continue to use Windows 10 desktop while getting to run almost all Linux utilities to manage their Linux machines. - -**Linux in Azure**: What good is a cloud that can’t run fully supported Linux machines? Microsoft has been working with Linux vendors that allow customers to run Linux applications and workloads on Azure. - -Microsoft not only managed to sign deals with all three major Linux vendors Red Hat, SUSE and Canonical, it also worked with countless other companies to offer support for community-based distros like Debian. - -**Linux in Windows Server**: This is the last missing piece of the puzzle. There is a massive ecosystem of Linux containers that are used by customers. There are over 900,000 Docker containers on Docker Hub, which can run only on Linux machines. Microsoft wanted to bring these containers to its own platform. - -At DockerCon, Microsoft announced support for Linux containers on Windows Server bringing all those containers to Linux. - -Things are about to get more interesting, after the success of Bash on Ubuntu on Windows 10, Microsoft is bringing Ubuntu bash to Windows Server. Yes, you heard it right. Windows Server will now have a Linux subsystem. - -Rich Turner, Senior Program Manager at Microsoft told me, “WSL on the server provides admins with a preference for *NIX admin scripting & tools to have a more familiar environment in which to work.” - -Microsoft said in an announcement that It will allow IT professionals “to use the same scripts, tools, procedures and container images they have been using for Linux containers on their Windows Server container host. These containers use our Hyper-V isolation technology combined with your choice of Linux kernel to host the workload while the management scripts and tools on the host use WSL.” - -With all three bases covered, Microsoft has succeeded in creating an environment where its customers don't have to deal with any Linux vendor. - -### What does it mean for Microsoft? - -By baking Linux into its own products, Microsoft has become a Linux vendor. They are part of the Linux Foundation, they are one of the many contributors to the Linux kernel, and they now distribute Linux from their own store.  - -There is only one minor problem. Microsoft doesn’t own any Linux technologies. They are totally dependent on an external vendor, in this case Canonical, for their entire Linux layer. Too risky a proposition, if Canonical gets acquired by a fierce competitor. - -It might make sense for Microsoft to attempt to acquire Canonical and bring the core technologies in house. It makes sense.  - -### What does it mean for Linux vendors - -On the surface, it’s a clear victory for Microsoft as its customers can live within the Windows world. It will also contain the momentum of Linux in a datacenter. It might also affect Linux on the desktop as now IT professionals looking for *NIX tooling don’t have to run Linux desktop, they can do everything from within Windows. - -Is Microsoft's victory a loss for traditional Linux vendors? To some degree, yes. Microsoft has become a direct competitor. But the clear winner here is Linux. - --------------------------------------------------------------------------------- - -via: http://www.cio.com/article/3197016/linux/how-microsoft-is-becoming-a-linux-vendor.html - -作者:[ Swapnil Bhartiya ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.cio.com/author/Swapnil-Bhartiya/ diff --git a/translated/talk/20170516 How Microsoft is becoming a Linux vendor.md b/translated/talk/20170516 How Microsoft is becoming a Linux vendor.md new file mode 100644 index 0000000000..999cc72c63 --- /dev/null +++ b/translated/talk/20170516 How Microsoft is becoming a Linux vendor.md @@ -0,0 +1,60 @@ +微软如何正在成为一个 Linux 供应商 +===================================== + + +>微软通过将 Linux 融入自己的产品中来弥合与 Linux 的差距。 + +![](http://images.techhive.com/images/article/2017/05/microsoft-100722875-large.jpg) + + +Linux 以及开源技术在数据中心、云以及 IoT 中变得如此主流以至于微软无法忽视他们。 + +在微软自己的云中,三分之一的机器运行着 Linux。这些是运行 Linux 的微软客户。微软需要支持他们使用的平台,否则他们将到别处去了。 + +以下就是微软如何在它的开发者平台 (Windows 10)、云 (Azure) 以及数据中心 (Windows Server) 打破 Linux 策略的。 + +**Windows 中的 Linux:** IT 专家管理公共或者私有 Linux 机器需要原生的 UNIX 工具。Linux 以及 macOS 是仅有的二个提供原生能力的平台。难怪你在各种会议如 DockerCon、OpenStack Summit 或者 CoreOS Fest 看到的都是 MacBook 或者少量的 Linux 桌面。 + +为了弥补差距,微软与 Canonical 协作在 Windows 内部构建了一个 Linux 子系统,它提供了原生的 Linux 工具。这是一个很棒的妥协,这样 IT 专家可以继续使用 Windows 10 桌面的同时能够使用大多数 Linux 工具来管理他们的 Linux 机器。 + +**Azure 中的 Linux:** 不能完整支持 Linux 的云有什么好呢?微软一直以来与 Linux 供应商合作来使客户能够在 Azure 中运行 Linux 程序以及负载。 + +微软不仅与三家主要的 Linux 供应商 Red Hat、SUSE 和 Canonical 签署了协议,还与无数的其他公司合作,为 Debian提 供了基于社区的发行版的支持。 + +**Windows Server 中的 Linux:** 这是剩下的最后一块披萨。客户使用的 Linux 容器是一个巨大的生态系统。Docker Hub 上有超过 90 万个 Docker 容器,它们只能在 Linux 机器上运行。微软希望把这些容器带到自己的平台上。 + +在 DockerCon 中,微软宣布在 Windows Server 中支持 Linux 容器,将这些容器都带到 Linux 中。 + +事情正变得更加有趣,在 Windows 10 上的 Bash 成功之后,微软正将 Ubuntu bash 带到 Windows Server 中。是的,你听的没错。Windows Server 将会有一个 Linux 子系统。 + +微软的高级项目经理 Rich Turne 告诉我:“服务器上的 WSL 为管理员提供了 *UNIX 管理脚本和工具的偏好,以便有更熟悉的工作环境。” + +微软在一个通告中称它将允许 IT 专家 “使用他们在 Windows Server 容器主机上为 Linux 容器使用的相同的脚本,工具,流程和容器镜像。这些容器使用我们的 Hyper-V 隔离技术结合你选择的 Linux 内核来托管负载,而主机上的管理脚本以及工具使用 WSL。” + +在覆盖了上面三个情况后,微软已经成功地创建了一个客户不必选择任何 Linux 供应商的环境。 + +### 它对微软意味着什么? + +通过将 Linux 融入它自己的产品,微软已经成为了一个 Linux 供应商。它们是 Linux 基金会的一部分,它们是众多 Linux 贡献者之一,并且它们现在在自己的商店中分发 Linux。 + +还有一个小问题。微软没有拥有任何 Linux 技术。它们完全依赖于外部的厂家,目前 Canonical 是完全的 Linux 层厂商。如果 Canonical 被强力的竞争对手收购,那会是一个很大的风险。 + +或许对微软而言尝试收购 Canonical 是有意义的,并且会将核心技术收入囊中。这是有道理的。 + +### 这对 Linux 供应商意味着什么 + +表面上,很显然这对微软是个胜利,因为它的客户可以在 Windows 世界中存留。它还将包含 Linux 在数据中心中的势头。它或许还会影响 Linux 桌面,由于现在 IT 专家不必为了寻找 *NIX 工具使用 Linux 桌面了,它们可以在 Windows 中做任何事。 + +微软的成功是传统 Linux 厂家的失败么?某种程度上来说,是的,微软已经成为了一个直接竞争者。但是这里明显的赢家是 Linux。 + +-------------------------------------------------------------------------------- + +via: http://www.cio.com/article/3197016/linux/how-microsoft-is-becoming-a-linux-vendor.html + +作者:[ Swapnil Bhartiya ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.cio.com/author/Swapnil-Bhartiya/ From ccd80cf7355da64a8bb8ce03ed7271fb2887fe10 Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 15 Jun 2017 09:20:34 +0800 Subject: [PATCH 0441/1407] translating --- ... Top 8 systems operations and engineering trends for 2017.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170105 Top 8 systems operations and engineering trends for 2017.md b/sources/tech/20170105 Top 8 systems operations and engineering trends for 2017.md index 4bf221c5a4..26b9da37e4 100644 --- a/sources/tech/20170105 Top 8 systems operations and engineering trends for 2017.md +++ b/sources/tech/20170105 Top 8 systems operations and engineering trends for 2017.md @@ -1,3 +1,5 @@ +translating---geekpi + Top 8 systems operations and engineering trends for 2017 ================= From c4e7b3941b226c00af2606a78cf0217540f957b1 Mon Sep 17 00:00:00 2001 From: ChunYu Wang Date: Thu, 15 Jun 2017 13:09:58 +0800 Subject: [PATCH 0442/1407] Take translation work Take translation work of 20170220 An introduction to the Linux boot and startup processes.md --- ...0 An introduction to the Linux boot and startup processes.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170220 An introduction to the Linux boot and startup processes.md b/sources/tech/20170220 An introduction to the Linux boot and startup processes.md index e6d064f3cd..ba1cd9463e 100644 --- a/sources/tech/20170220 An introduction to the Linux boot and startup processes.md +++ b/sources/tech/20170220 An introduction to the Linux boot and startup processes.md @@ -1,3 +1,5 @@ +Translating by CherryMill + An introduction to the Linux boot and startup processes ============================================================ From 6410a3c7c84a8115fd47e1651333b6787581737e Mon Sep 17 00:00:00 2001 From: xiaow6 Date: Thu, 15 Jun 2017 15:12:54 +0800 Subject: [PATCH 0443/1407] translating by xiaow6 --- ...20161006 Go Serverless with Apex and Composes MongoDB.md | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/sources/tech/20161006 Go Serverless with Apex and Composes MongoDB.md b/sources/tech/20161006 Go Serverless with Apex and Composes MongoDB.md index 2365341b66..7df4c4523c 100644 --- a/sources/tech/20161006 Go Serverless with Apex and Composes MongoDB.md +++ b/sources/tech/20161006 Go Serverless with Apex and Composes MongoDB.md @@ -1,3 +1,5 @@ +translating by xiaow6 + # Go Serverless with Apex and Compose's MongoDB _Apex is tooling that wraps the development and deployment experience for AWS Lambda functions. It provides a local command line tool which can create security contexts, deploy functions, and even tail cloud logs. While AWS's Lambda service treats each function as an independent unit, Apex provides a framework which treats a set of functions as a project. Plus, it even extends the service to languages beyond just Java, Javascript, and Python such as Go._ @@ -182,10 +184,10 @@ via: https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongo 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 [a]:https://www.compose.com/articles/author/hays-hutton/ -[1]:https://twitter.com/share?text=Go%20Serverless%20with%20Apex%20and%20Compose%27s%20MongoDB&url=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/&via=composeio +[1]:https://twitter.com/share?text=Go%20Serverless%20with%20Apex%20and%20Compose%27s%20MongoDB&url=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/&via=composeio [2]:https://www.facebook.com/sharer/sharer.php?u=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/ [3]:https://plus.google.com/share?url=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/ -[4]:http://news.ycombinator.com/submitlink?u=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/&t=Go%20Serverless%20with%20Apex%20and%20Compose%27s%20MongoDB +[4]:http://news.ycombinator.com/submitlink?u=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/&t=Go%20Serverless%20with%20Apex%20and%20Compose%27s%20MongoDB [5]:https://www.compose.com/articles/rss/ [6]:https://unsplash.com/@esaiastann [7]:https://www.compose.com/articles From 1b2ed16fb2d4a53c524f4e2f477846d96d9e6f94 Mon Sep 17 00:00:00 2001 From: xllc <392137944@qq.com> Date: Thu, 15 Jun 2017 22:13:18 +0800 Subject: [PATCH 0444/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E7=94=B3=E8=AF=B7?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tech/20170201 Performance made easy with Linux containers.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170201 Performance made easy with Linux containers.md b/sources/tech/20170201 Performance made easy with Linux containers.md index 4a55487cc4..1d748459c7 100644 --- a/sources/tech/20170201 Performance made easy with Linux containers.md +++ b/sources/tech/20170201 Performance made easy with Linux containers.md @@ -1,3 +1,4 @@ +translating by xllc Performance made easy with Linux containers ============================================================ From 2fe6d2d13629160d4da017fb48d5ee8e19def16f Mon Sep 17 00:00:00 2001 From: xllc <392137944@qq.com> Date: Thu, 15 Jun 2017 22:14:25 +0800 Subject: [PATCH 0445/1407] Update 20170201 Performance made easy with Linux containers.md --- .../tech/20170201 Performance made easy with Linux containers.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170201 Performance made easy with Linux containers.md b/sources/tech/20170201 Performance made easy with Linux containers.md index 1d748459c7..ae79ffcd65 100644 --- a/sources/tech/20170201 Performance made easy with Linux containers.md +++ b/sources/tech/20170201 Performance made easy with Linux containers.md @@ -1,4 +1,5 @@ translating by xllc + Performance made easy with Linux containers ============================================================ From 29d793381dcac696b036d8b4afdf961267c361eb Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 16 Jun 2017 02:02:54 +0800 Subject: [PATCH 0446/1407] PRF&PUB:20170516 How Microsoft is becoming a Linux vendor.md @geekpi --- ...ow Microsoft is becoming a Linux vendor.md | 58 ++++++++++++++++++ ...ow Microsoft is becoming a Linux vendor.md | 60 ------------------- 2 files changed, 58 insertions(+), 60 deletions(-) create mode 100644 published/20170516 How Microsoft is becoming a Linux vendor.md delete mode 100644 translated/talk/20170516 How Microsoft is becoming a Linux vendor.md diff --git a/published/20170516 How Microsoft is becoming a Linux vendor.md b/published/20170516 How Microsoft is becoming a Linux vendor.md new file mode 100644 index 0000000000..294cb8c6b4 --- /dev/null +++ b/published/20170516 How Microsoft is becoming a Linux vendor.md @@ -0,0 +1,58 @@ +微软正在成为一个 Linux 供应商 +===================================== + +> 微软通过将 Linux 融入自己的产品中来弥合与 Linux 的裂隙。 + +![](http://images.techhive.com/images/article/2017/05/microsoft-100722875-large.jpg) + +Linux 以及开源技术在数据中心、云以及 IoT 中变得如此主流,以至于微软无法忽视他们。 + +在微软自己的云中,三分之一的机器运行着 Linux。这些是运行 Linux 的微软客户。微软需要支持他们使用的平台,否则他们将到别处去了。 + +以下就是微软如何将 Linux 战略落实到它的开发者平台 (Windows 10)、云 (Azure) 以及数据中心 (Windows Server) 上的。 + +**Windows 中的 Linux:** IT 专家管理公共或者私有 Linux 机器需要原生的 UNIX 工具。Linux 以及 macOS 是仅有的二个提供原生能力的平台。这也难怪你在各种会议如 DockerCon、OpenStack Summit 或者 CoreOS Fest 看到的都是 MacBook 或者少量的 Linux 桌面。 + +为了弥补这之间的裂隙,微软与 Canonical 协作在 Windows 内部构建了一个 Linux 子系统,它提供了原生的 Linux 工具。这是一个很棒的妥协,这样 IT 专家可以在继续使用 Windows 10 桌面的同时能够使用大多数 Linux 工具来管理他们的 Linux 机器。 + +**Azure 中的 Linux:** 不能完整支持 Linux 的云有什么好的呢?微软一直以来与 Linux 供应商合作来使客户能够在 Azure 中运行 Linux 程序以及任务。 + +微软不仅与三家主要的 Linux 供应商 Red Hat、SUSE 和 Canonical 签署了协议,还与无数的其他公司合作,为 Debian 这样的基于社区的发行版提供了支持。 + +**Windows Server 中的 Linux:** 这是剩下的最后一块拼图。客户使用的 Linux 容器是一个巨大的生态系统。Docker Hub 上有超过 90 万个 Docker 容器,它们只能在 Linux 机器上运行。微软希望把这些容器带到自己的平台上。 + +在 DockerCon 中,微软宣布在 Windows Server 中支持 Linux 容器,将这些容器都带到 Windows 中。 + +事情正变得更加有趣,在 Windows 10 上的 Bash on Ubuntu 成功之后,微软正将 Ubuntu bash 带到 Windows Server 中。是的,你听的没错。Windows Server 也将会有一个 Linux 子系统。 + +微软的高级项目经理 Rich Turne 告诉我:“服务器上的 WSL 为管理员提供了偏好的 *NIX 管理脚本和工具,以便让他们可以在更熟悉的工作环境工作。” + +微软在一个通告中称它将允许 IT 专家 “可以在 Windows Server 容器主机上使用在 Linux 容器上所用的相同的脚本、工具、流程和容器镜像。这些容器使用我们的 Hyper-V 隔离技术结合你选择的 Linux 内核来托管负载,而主机上的管理脚本以及工具使用 WSL。” + +在覆盖了上面三个情况后,微软已经成功地创建了一个客户不必选择任何 Linux 供应商的环境。 + +### 它对微软意味着什么? + +通过将 Linux 融入它自己的产品,微软已经成为了一个 Linux 供应商。它是 Linux 基金会的一份子,它是众多 Linux 贡献者之一,并且它现在在自己的商店中分发 Linux。 + +只有一个小问题。微软没有拥有任何 Linux 技术。它完全依赖于外部的厂家,目前 Canonical 为其提供了完全的 Linux 层。如果 Canonical 被强力的竞争对手收购,那会是一个很大的风险。 + +或许对微软而言尝试收购 Canonical 是有意义的,并且会将核心技术收入囊中。这是有道理的。 + +### 这对 Linux 供应商意味着什么 + +表面上,很显然这对微软是个胜利,因为它的客户可以留存在 Windows 世界中。它还将包含 Linux 在数据中心中的发展势头。它或许还会影响 Linux 桌面,由于现在 IT 专家不必为了寻找 *NIX 工具使用 Linux 桌面了,它们可以在 Windows 中做任何事。 + +微软的成功是传统 Linux 厂家的失败么?某种程度上来说,是的,微软已经成为了一个直接竞争者。但是这里明显的赢家是 Linux。 + +-------------------------------------------------------------------------------- + +via: http://www.cio.com/article/3197016/linux/how-microsoft-is-becoming-a-linux-vendor.html + +作者:[Swapnil Bhartiya][a] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.cio.com/author/Swapnil-Bhartiya/ diff --git a/translated/talk/20170516 How Microsoft is becoming a Linux vendor.md b/translated/talk/20170516 How Microsoft is becoming a Linux vendor.md deleted file mode 100644 index 999cc72c63..0000000000 --- a/translated/talk/20170516 How Microsoft is becoming a Linux vendor.md +++ /dev/null @@ -1,60 +0,0 @@ -微软如何正在成为一个 Linux 供应商 -===================================== - - ->微软通过将 Linux 融入自己的产品中来弥合与 Linux 的差距。 - -![](http://images.techhive.com/images/article/2017/05/microsoft-100722875-large.jpg) - - -Linux 以及开源技术在数据中心、云以及 IoT 中变得如此主流以至于微软无法忽视他们。 - -在微软自己的云中,三分之一的机器运行着 Linux。这些是运行 Linux 的微软客户。微软需要支持他们使用的平台,否则他们将到别处去了。 - -以下就是微软如何在它的开发者平台 (Windows 10)、云 (Azure) 以及数据中心 (Windows Server) 打破 Linux 策略的。 - -**Windows 中的 Linux:** IT 专家管理公共或者私有 Linux 机器需要原生的 UNIX 工具。Linux 以及 macOS 是仅有的二个提供原生能力的平台。难怪你在各种会议如 DockerCon、OpenStack Summit 或者 CoreOS Fest 看到的都是 MacBook 或者少量的 Linux 桌面。 - -为了弥补差距,微软与 Canonical 协作在 Windows 内部构建了一个 Linux 子系统,它提供了原生的 Linux 工具。这是一个很棒的妥协,这样 IT 专家可以继续使用 Windows 10 桌面的同时能够使用大多数 Linux 工具来管理他们的 Linux 机器。 - -**Azure 中的 Linux:** 不能完整支持 Linux 的云有什么好呢?微软一直以来与 Linux 供应商合作来使客户能够在 Azure 中运行 Linux 程序以及负载。 - -微软不仅与三家主要的 Linux 供应商 Red Hat、SUSE 和 Canonical 签署了协议,还与无数的其他公司合作,为 Debian提 供了基于社区的发行版的支持。 - -**Windows Server 中的 Linux:** 这是剩下的最后一块披萨。客户使用的 Linux 容器是一个巨大的生态系统。Docker Hub 上有超过 90 万个 Docker 容器,它们只能在 Linux 机器上运行。微软希望把这些容器带到自己的平台上。 - -在 DockerCon 中,微软宣布在 Windows Server 中支持 Linux 容器,将这些容器都带到 Linux 中。 - -事情正变得更加有趣,在 Windows 10 上的 Bash 成功之后,微软正将 Ubuntu bash 带到 Windows Server 中。是的,你听的没错。Windows Server 将会有一个 Linux 子系统。 - -微软的高级项目经理 Rich Turne 告诉我:“服务器上的 WSL 为管理员提供了 *UNIX 管理脚本和工具的偏好,以便有更熟悉的工作环境。” - -微软在一个通告中称它将允许 IT 专家 “使用他们在 Windows Server 容器主机上为 Linux 容器使用的相同的脚本,工具,流程和容器镜像。这些容器使用我们的 Hyper-V 隔离技术结合你选择的 Linux 内核来托管负载,而主机上的管理脚本以及工具使用 WSL。” - -在覆盖了上面三个情况后,微软已经成功地创建了一个客户不必选择任何 Linux 供应商的环境。 - -### 它对微软意味着什么? - -通过将 Linux 融入它自己的产品,微软已经成为了一个 Linux 供应商。它们是 Linux 基金会的一部分,它们是众多 Linux 贡献者之一,并且它们现在在自己的商店中分发 Linux。 - -还有一个小问题。微软没有拥有任何 Linux 技术。它们完全依赖于外部的厂家,目前 Canonical 是完全的 Linux 层厂商。如果 Canonical 被强力的竞争对手收购,那会是一个很大的风险。 - -或许对微软而言尝试收购 Canonical 是有意义的,并且会将核心技术收入囊中。这是有道理的。 - -### 这对 Linux 供应商意味着什么 - -表面上,很显然这对微软是个胜利,因为它的客户可以在 Windows 世界中存留。它还将包含 Linux 在数据中心中的势头。它或许还会影响 Linux 桌面,由于现在 IT 专家不必为了寻找 *NIX 工具使用 Linux 桌面了,它们可以在 Windows 中做任何事。 - -微软的成功是传统 Linux 厂家的失败么?某种程度上来说,是的,微软已经成为了一个直接竞争者。但是这里明显的赢家是 Linux。 - --------------------------------------------------------------------------------- - -via: http://www.cio.com/article/3197016/linux/how-microsoft-is-becoming-a-linux-vendor.html - -作者:[ Swapnil Bhartiya ][a] -译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.cio.com/author/Swapnil-Bhartiya/ From 7dbc024a4a50386cf12aad404df2a934c6f881a1 Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 16 Jun 2017 08:56:47 +0800 Subject: [PATCH 0447/1407] translating --- ...rations and engineering trends for 2017.md | 80 ------------------- ...rations and engineering trends for 2017.md | 79 ++++++++++++++++++ 2 files changed, 79 insertions(+), 80 deletions(-) delete mode 100644 sources/tech/20170105 Top 8 systems operations and engineering trends for 2017.md create mode 100644 translated/tech/20170105 Top 8 systems operations and engineering trends for 2017.md diff --git a/sources/tech/20170105 Top 8 systems operations and engineering trends for 2017.md b/sources/tech/20170105 Top 8 systems operations and engineering trends for 2017.md deleted file mode 100644 index 26b9da37e4..0000000000 --- a/sources/tech/20170105 Top 8 systems operations and engineering trends for 2017.md +++ /dev/null @@ -1,80 +0,0 @@ -translating---geekpi - -Top 8 systems operations and engineering trends for 2017 -================= - -Forecasting trends is tricky, especially in the fast-moving world of systems operations and engineering. This year, at our Velocity Conference, we have talked about distributed systems, SRE, containerization, serverless architectures, burnout, and many other topics related to the human and technological challenges of delivering software. Here are some of the trends we see for the next year: - -### 1\. Distributed Systems - -We think this is important enough that we [re-focused the entire Velocity conference on it][1]. - - - -### 2\. Site Reliability Engineering - -[Site Reliability Engineering][3]—is it just ops? [Or is it DevOps by another name][4]? Google's profile for an ops professional calls for heavy doses of systems and software engineering. Spread further into the industry by Xooglers at companies like Dropbox, [hiring for SRE positions][5] continues to increase, particularly for web-facing companies with large data centers. In some contexts, the role of SREs becomes more about helping developers operate their own services. - -### 3\. Containerization - -Companies will continue to containerize their software delivery. Docker Inc. itself has positioned Docker as a tool for "[incremental revolution][6]," and containerizing legacy applications has become a common use case in the enterprise. What's the future of Docker? As engineers continue to adopt orchestration tools like Kubernetes and Mesos, the higher level of abstraction may make more room for other flavors of containers (like rkt, Garden, etc.). - -### 4\. Unikernels - -Are unikernels the next step after containerization? Are they unfit for production? Some tout the security and performance benefits of unikernels. Keep an eye out for how unikernels evolve in 2017, [particularly with an eye to what Docker Inc. does][7] in this area (having acquired Unikernel Systems this year). - -### 5\. Serverless - -Serverless architectures treat functions as the basic unit of computation. Some find the term misleading (and reminiscent of "noops"), and prefer to refer to this trend as Functions-as-a-Service. Developers and architects are experimenting with the technology more and more, and expect to see more applications being written in this paradigm. For more on what serverless/FaaS means for operations, check out the free ebook on [Serverless Ops][8] by Michael Hausenblas. - -### 6\. Cloud-Native application development - -Like DevOps, this term has been used and abused by marketers for a long while, but the Cloud Native Computing Foundation makes a strong case for these new sets of tools (often Google-inspired) that take advantage not just of the cloud, but in particular the strengths and opportunities provided by distributed systems—in short, microservices, containerization, and dynamic orchestration. - -### 7\. Monitoring - -As the industry has evolved from Nagios-style monitoring, to streaming metrics and visualizations, we've become great at producing loads of systems data. Interpretation is the next challenge. As such, we are seeing vendors offering machine learning-powered monitoring services, and, more generally, IT operations learning techniques for machine learning systems data. Similarly, as our infrastructure becomes more dynamic and distributed, monitoring becomes less and less about checking the health of individual resources and more about tracing flows between services. As such, distributed tracing has emerged. - -### 8\. DevOps Security - -With DevOpsSec increasing in popularity, [security is quickly becoming a team-wide concern][9]. The classic challenge of DevOps of achieving both velocity and reliability is especially pronounced when companies with security and compliance concerns are feeling the pinch to compete on speed. - -### Tell us about your work - -As an IT operations professional—whether you use the term sysadmin, DevOps, SRE, DBA, etc.—[you’re invited to share your insights][10] to help us learn about the demographics, work environments, tools, and compensation of practitioners in our growing field. All responses are reported in aggregate to assure your anonymity. The survey will require approximately 5–10 minutes to complete. Once we've closed the survey and analyzed the results, we'll share our findings with you. [Take the survey][11]. - --------------------------------------------------------------------------------- - -作者简介: - -![](https://d3tdunqjn7n0wj.cloudfront.net/1440x1440/courtney-nash-crop-a9cb0b44a4262f20524d171195d6d485.jpg) - -Courtney Nash chairs multiple conferences for O'Reilly Media and is the strategic content director focused on areas of modern web operations, high performance applications, and security. An erstwhile academic neuroscientist, she is still fascinated by the brain and how it informs our interactions with and expectations of technology. She's spent 17 years working in the technology industry in a wide variety of roles, ever since moving to Seattle to work at a burgeoning online bookstore. Outside work, Courtney can be found biking, hiking, skiing, ... - -![](https://d3tdunqjn7n0wj.cloudfront.net/1440x1440/brian_anderson-ae207faed42e8b7a2e73b7f82573c8ea.jpg) - -Brian Anderson, Infrastructure and Operations Editor at O’Reilly Media, covers topics essential to the delivery of software — from traditional system administration, to cloud computing, web performance, Docker, and DevOps. He has been working in online education and serving the needs of working learners for more than ten years. - --------------------------------------------------------------------------------- - -via: https://www.oreilly.com/ideas/top-8-systems-operations-and-engineering-trends-for-2017 - -作者:[Courtney Nash][a],[Brian Anderson][b] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.oreilly.com/people/3f5d7-courtneyw-nash -[b]:https://www.oreilly.com/people/brian_anderson -[1]:https://www.oreilly.com/ideas/velocity-a-new-direction -[2]:https://www.oreilly.com/ideas/top-8-systems-operations-and-engineering-trends-for-2017?imm_mid=0ec113&cmp=em-webops-na-na-newsltr_20170106 -[3]:https://www.oreilly.com/ideas/what-is-sre-site-reliability-engineering -[4]:http://conferences.oreilly.com/velocity/devops-web-performance-ny/public/content/devops-sre-ama-video -[5]:https://www.glassdoor.com/Salaries/site-reliability-engineer-salary-SRCH_KO0,25.htm -[6]:http://blog.scottlowe.org/2016/06/21/dockercon-2016-day-2-keynote/ -[7]:http://www.infoworld.com/article/3024410/application-virtualization/docker-kicks-off-unikernel-revolution.html -[8]:http://www.oreilly.com/webops-perf/free/serverless-ops.csp?intcmp=il-webops-free-lp-na_new_site_top_8_systems_operations_and_engineering_trends_for_2017_body_text_cta -[9]:https://www.oreilly.com/learning/devopssec-securing-software-through-continuous-delivery -[10]:http://www.oreilly.com/webops-perf/2016-ops-survey.html -[11]:http://www.oreilly.com/webops-perf/2016-ops-survey.html diff --git a/translated/tech/20170105 Top 8 systems operations and engineering trends for 2017.md b/translated/tech/20170105 Top 8 systems operations and engineering trends for 2017.md new file mode 100644 index 0000000000..35629ef781 --- /dev/null +++ b/translated/tech/20170105 Top 8 systems operations and engineering trends for 2017.md @@ -0,0 +1,79 @@ +2017 年 8 大系统运维和工程趋势 +================= + +预测趋势是棘手的,尤其是在快速发展的系统运维和工程领域。今年,在我们的 Velocity 大会上,我们讨论了分布式系统、SRE、容器化、无服务架构,人员倦怠以及与提供软件相关的人力与技术挑战等诸多问题。以下是我们认为的明年的趋势: + +### 1\. 分布式系统 + +我们认为这个很重要,我们[在整个 Velocity 会议上重新关注了它][1]。 + + + +### 2\. 站点可靠性工程 + +[站点可靠性工程][3]-它只是运维么?[或者它是 DevOps 的另外一个名称][4]?这是 Google 对那些要求做大量系统及软件工程的运维专业人士的称呼。它由在像 Dropbox 的前 Google 人向业内推广,[招聘 SRE 的职位][5]正不断增加,特别是有大型数据中心的面向网络的公司。在某些情况下,SRE 的作用更多地是帮助开发人员操作自己的服务。 + +### 3\. 同期话 + +公司将继续容器化它们的软件交付。Docker 公司本身已经将 Docker 定位为“[增量革命][6]”的工具,容器化遗留应用已成为企业的常见案例。Docker 的未来是什么?随着工程师继续采用诸如 Kubernetes 和 Mesos 之类的编排工具,更高层次的抽象可能为其他容器(如 rkt、Garden 等)提供更多空间。 + + +### 4\. Unikernels + +unikernels 是容器化之后的下一步么?它们对产品不合适么?有些人吹捧 unikernels 的安全和性能好处。关注一下 unikernels 在 2017 是如何进化的,[特别要关注下 Dokcer 公司在这个领域做的][7]。(今年它已经收购了 Unikernel Systems) + +### 5\. Serverless + +无服务架构视功能为基础的计算单元。有些人认为这个术语是误导性的(让人想起 “noops”),并且更倾向于把这个趋势称为“功能即服务”。开发人员和架构师正在越来越多地尝试这个技术,并期望看到有越来越多的程序用这个范式编写。更多关于 serverless/FaaS 对运维的意义,请查看 Michael Hausenblas 的 [Serverless 运维][8]免费电子书。 + +### 6\. 原生云程序开发 + +就像 DevOps,这个术语已经被市场人员使用并滥用很久了,但是云计算基金会为这些新工具(通常是谷歌发起的)做了一个很好的例子,这些工具不仅利用了云,而且特别还在于分布式系统(简称微服务,容器化和动态编排)提供的优势和机会。 + +### 7\. 监控 + +随着行业从 Nagios 风格的监控发展到流量指标和可视化,我们在生产大量的系统数据方面变得非常出色。诠释是下一个挑战。因此,我们看到供应商提供机器学习功能的监控服务,以及更一般的是利用机器学习系统数据的 IT 运维学习。同样,随着我们的基础设施变得更加动态和分布式,监控越来越少地检查个人资源的健康状况,更多的是关于在服务之间追踪流量。因此,分布式跟踪已经出现。 + +### 8\. DevOps 安全 + +随着 DevOps 安全的普及,[安全性正在迅速成为团队范围的关注][9]。当有安全和合规顾虑的公司感觉到需要在速度上竞争时, devops 实现速度和可靠性的经典挑战尤其明显。 + +### 告诉我们关于你的工作 + +作为一名 IT 运维专业人员 - 你是否使用系统管理的术语如 DevOps、SRE、DBA 等等。- [你被受邀分享你的见解][10]来帮助我们在增长的领域中了解关于人口统计、工作环境、工具以及从业人员薪酬。所有反馈都会以归集形式报告从而保证你的匿名。调查大约需要 5-10 分钟完成。在关闭调查并分析结果后,我们会与你分享发现。[参加调查][11] + +-------------------------------------------------------------------------------- + +作者简介: + +![](https://d3tdunqjn7n0wj.cloudfront.net/1440x1440/courtney-nash-crop-a9cb0b44a4262f20524d171195d6d485.jpg) + +Courtney Nash 主持 O'Reilly Media 的多个会议,并且是专注于现代网络运维,高性能程序和安全性的战略内容总监。一位前学术神经科学家,她仍然对大脑着迷,以及它如何告诉我们与技术互动和对技术的期望。自从移居西雅图,在一家蓬勃发展的在线书店工作之后,她花了 17 年的时间从事技术行业的各种工作。在外面,你可以看到 Courtney 在骑自行车、徒步旅行、滑雪。。。 + +![](https://d3tdunqjn7n0wj.cloudfront.net/1440x1440/brian_anderson-ae207faed42e8b7a2e73b7f82573c8ea.jpg) + +O'Reilly Media 的基础架构和运维编辑 Brian Anderson 介绍了从传统系统管理到云计算、Web 性能、Docker 和 DevOps 等软件交付的重要内容。他一直从事在线教育,服务于学习者的需求超过十多年。 + +-------------------------------------------------------------------------------- + +via: https://www.oreilly.com/ideas/top-8-systems-operations-and-engineering-trends-for-2017 + +作者:[Courtney Nash][a],[Brian Anderson][b] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.oreilly.com/people/3f5d7-courtneyw-nash +[b]:https://www.oreilly.com/people/brian_anderson +[1]:https://www.oreilly.com/ideas/velocity-a-new-direction +[2]:https://www.oreilly.com/ideas/top-8-systems-operations-and-engineering-trends-for-2017?imm_mid=0ec113&cmp=em-webops-na-na-newsltr_20170106 +[3]:https://www.oreilly.com/ideas/what-is-sre-site-reliability-engineering +[4]:http://conferences.oreilly.com/velocity/devops-web-performance-ny/public/content/devops-sre-ama-video +[5]:https://www.glassdoor.com/Salaries/site-reliability-engineer-salary-SRCH_KO0,25.htm +[6]:http://blog.scottlowe.org/2016/06/21/dockercon-2016-day-2-keynote/ +[7]:http://www.infoworld.com/article/3024410/application-virtualization/docker-kicks-off-unikernel-revolution.html +[8]:http://www.oreilly.com/webops-perf/free/serverless-ops.csp?intcmp=il-webops-free-lp-na_new_site_top_8_systems_operations_and_engineering_trends_for_2017_body_text_cta +[9]:https://www.oreilly.com/learning/devopssec-securing-software-through-continuous-delivery +[10]:http://www.oreilly.com/webops-perf/2016-ops-survey.html +[11]:http://www.oreilly.com/webops-perf/2016-ops-survey.html From 3fd3249666c51e8042ca1b07e3d53c62a8c44a3a Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 16 Jun 2017 09:02:42 +0800 Subject: [PATCH 0448/1407] translating --- ...nfigure Thunderbird with iRedMail for Samba4 AD – Part 13.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md b/sources/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md index 2cf0bee964..0bdc4d2fee 100644 --- a/sources/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md +++ b/sources/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md @@ -1,3 +1,5 @@ +translating---geekpi + How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13 ============================================================ From d6ed847a4f02b067b85726b82336ffc4dc38454b Mon Sep 17 00:00:00 2001 From: ch-cn Date: Fri, 16 Jun 2017 11:52:21 +0800 Subject: [PATCH 0449/1407] translated --- ...Writing Effective Bash Scripts in Linux.md | 179 ------------------ ...Writing Effective Bash Scripts in Linux.md | 177 +++++++++++++++++ 2 files changed, 177 insertions(+), 179 deletions(-) delete mode 100644 sources/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md create mode 100644 translated/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md diff --git a/sources/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md b/sources/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md deleted file mode 100644 index e54e47c77e..0000000000 --- a/sources/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md +++ /dev/null @@ -1,179 +0,0 @@ -ictlyh Translating -10 Useful Tips for Writing Effective Bash Scripts in Linux -============================================================ -ch-cn translating - -[Shell scripting][4] is the easiest form of programming you can learn/do in Linux. More so, it is a required skill for [system administration for automating tasks][5], developing new simple utilities/tools just to mention but a few. - -In this article, we will share 10 useful and practical tips for writing effective and reliable bash scripts and they include: - -### 1\. Always Use Comments in Scripts - -This is a recommended practice which is not only applied to shell scripting but all other kinds of programming. Writing comments in a script helps you or some else going through your script understand what the different parts of the script do. - -For starters, comments are defined using the `#` sign. - -``` -#TecMint is the best site for all kind of Linux articles -``` - -### 2\. Make a Script exit When Fails - -Sometimes bash may continue to execute a script even when a certain command fails, thus affecting the rest of the script (may eventually result in logical errors). Use the line below to exit a script when a command fails: - -``` -#let script exit if a command fails -set -o errexit -OR -set -e -``` - -### 3\. Make a Script exit When Bash Uses Undeclared Variable - -Bash may also try to use an undeclared script which could cause a logical error. Therefore use the following line to instruct bash to exit a script when it attempts to use an undeclared variable: - -``` -#let script exit if an unsed variable is used -set -o nounset -OR -set -u -``` - -### 4\. Use Double Quotes to Reference Variables - -Using double quotes while referencing (using a value of a variable) helps to prevent word splitting (regarding whitespace) and unnecessary globbing (recognizing and expanding wildcards). - -Check out the example below: - -``` -#!/bin/bash -#let script exit if a command fails -set -o errexit -#let script exit if an unsed variable is used -set -o nounset -echo "Names without double quotes" -echo -names="Tecmint FOSSMint Linusay" -for name in $names; do -echo "$name" -done -echo -echo "Names with double quotes" -echo -for name in "$names"; do -echo "$name" -done -exit 0 -``` - -Save the file and exit, then run it as follows: - -``` -$ ./names.sh -``` - [![Use Double Quotes in Scripts](https://www.tecmint.com/wp-content/uploads/2017/05/Use-Double-Quotes-in-Scripts.png)][6] - -Use Double Quotes in Scripts - -### 5\. Use functions in Scripts - -Except for very small scripts (with a few lines of code), always remember to use functions to modularize your code and make scripts more readable and reusable. - -The syntax for writing functions is as follows: - -``` -function check_root(){ -command1; -command2; -} -OR -check_root(){ -command1; -command2; -} -``` - -For single line code, use termination characters after each command like this: - -``` -check_root(){ command1; command2; } -``` - -### 6\. Use = instead of == for String Comparisons - -Note that `==` is a synonym for `=`, therefore only use a single `=` for string comparisons, for instance: - -``` -value1=”tecmint.com” -value2=”fossmint.com” -if [ "$value1" = "$value2" ] -``` - -### 7\. Use $(command) instead of legacy ‘command’ for Substitution - -[Command substitution][7] replaces a command with its output. Use `$(command)` instead of backquotes ``command`` for command substitution. - -This is recommended even by [shellcheck tool][8] (shows warnings and suggestions for shell scripts). For example: - -``` -user=`echo “$UID”` -user=$(echo “$UID”) -``` - -### 8\. Use Read-only to Declare Static Variables - -A static variable doesn’t change; its value can not be altered once it’s defined in a script: - -``` -readonly passwd_file=”/etc/passwd” -readonly group_file=”/etc/group” -``` - -### 9\. Use Uppercase Names for ENVIRONMENT Variables and Lowercase for Custom Variables - -All bash environment variables are named with uppercase letters, therefore use lowercase letters to name your custom variables to avoid variable name conflicts: - -``` -#define custom variables using lowercase and use uppercase for env variables -nikto_file=”$HOME/Downloads/nikto-master/program/nikto.pl” -perl “$nikto_file” -h “$1” -``` - -### 10\. Always Perform Debugging for Long Scripts - -If you are writing bash scripts with thousands of lines of code, finding errors may become a nightmare. To easily fix things before executing a script, perform some debugging. Master this tip by reading through the guides provided below: - -1. [How To Enable Shell Script Debugging Mode in Linux][1] - -2. [How to Perform Syntax Checking Debugging Mode in Shell Scripts][2] - -3. [How to Trace Execution of Commands in Shell Script with Shell Tracing][3] - -That’s all! Do you have any other best bash scripting practices to share? If yes, then use the comment form below to do that. - --------------------------------------------------------------------------------- - -作者简介: - - -Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. - ----------------- - -via: https://www.tecmint.com/useful-tips-for-writing-bash-scripts-in-linux/ - -作者:[ Aaron Kili][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.tecmint.com/author/aaronkili/ -[1]:https://www.tecmint.com/enable-shell-debug-mode-linux/ -[2]:https://www.tecmint.com/check-syntax-in-shell-script/ -[3]:https://www.tecmint.com/trace-shell-script-execution-in-linux/ -[4]:https://www.tecmint.com/category/bash-shell/ -[5]:https://www.tecmint.com/using-shell-script-to-automate-linux-system-maintenance-tasks/ -[6]:https://www.tecmint.com/wp-content/uploads/2017/05/Use-Double-Quotes-in-Scripts.png -[7]:https://www.tecmint.com/assign-linux-command-output-to-variable/ -[8]:https://www.tecmint.com/shellcheck-shell-script-code-analyzer-for-linux/ diff --git a/translated/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md b/translated/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md new file mode 100644 index 0000000000..efca8c5e31 --- /dev/null +++ b/translated/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md @@ -0,0 +1,177 @@ +Linux 中编写有效的 Bash 脚本的 10 个有用技巧 +============================================================ + +[Shell 脚本编程][4] 是你在 Linux 下学习或练习编程的最简单的方式。尤其对 [系统管理员要处理着自动化任务][5],且要开发新的简单的实用程序或工具等(这里只是仅举几例)更是必备技能。 + +本文中,我们将分享 10 个写出高效可靠的 bash 脚本的实用技巧,它们包括: + +### 1\. 脚本中常用注释 + +这是不仅可应用于 shell 脚本程序中也可用在其他所有类型的编程中的一种推荐做法。在脚本中作注释能帮你或别人翻阅你的脚本了解脚本的不同部分所做的工作。 + +对于刚入门的人来说,注释用 `#` 号来定义。 + +``` +#TecMint 是浏览各类 Linux 文章的最佳站点 +``` + +### 2\. 当运行失败时使脚本退出 + +有时即使某些命令运行失败,bash 可能继续去执行脚本,这样就影响到脚本的其余部分(会最终导致逻辑错误)。用下面的行的方式在遇到命令失败时来退出脚本执行: + +``` +#如果命令运行失败让脚本退出执行 +set -o errexit +或 +set -e +``` + +### 3\. 当 Bash 用未声明变量时使脚本退出 + +Bash 也会尝试用会引起逻辑错误的未声明的脚本。因此用下面行的方式去通知 bash 当它尝试去用一个未声明变量时就退出脚本执行: + +``` +#若有用未设置的变量即让脚本退出执行 +set -o nounset +或 +set -u +``` + +### 4\. 使用双引号来引用变量 + +当引用时(使用一个变量的值)用双引号有助于防止单词分割开(由于空白)和不必要的匹配(识别和扩展通配符) + +看看下面的例子: + +``` +#!/bin/bash +#若命令失败让脚本退出 +set -o errexit +#若未设置的变量被使用让脚本退出 +set -o nounset +echo "Names without double quotes" +echo +names="Tecmint FOSSMint Linusay" +for name in $names; do +echo "$name" +done +echo +echo "Names with double quotes" +echo +for name in "$names"; do +echo "$name" +done +exit 0 +``` + +保存文件并退出,接着如下运行一下: + +``` +$ ./names.sh +``` + [![Use Double Quotes in Scripts](https://www.tecmint.com/wp-content/uploads/2017/05/Use-Double-Quotes-in-Scripts.png)][6] + +在脚本中用双引号 + +### 5\. 在脚本中使用函数 + +除了非常小的脚本(只有几行代码),总是记得用函数来使代码模块化且使得脚本更可读和可重用。 + +写函数的语法如下所示: + +``` +function check_root(){ +command1; +command2; +} +或 +check_root(){ +command1; +command2; +} +``` + +写成单行代码,每个命令后要用终止符号: + +``` +check_root(){ command1; command2; } +``` + +### 6\. 字符串比较时用 = 替换 == + +注意 `==` 是 `=` 的同义词,因此仅用个单 `=` 来做字符串比较,例如: + +``` +value1=”tecmint.com” +value2=”fossmint.com” +if [ "$value1" = "$value2" ] +``` + +### 7\. 用 $(command) 替换老旧的 ‘command’ 来做代用 + +[Command substitution(命令代换)][7] 是用这个命令的输出结果取代命令本身。用 `$(command)` 而不是引号 ``command`` 来做命令代换。 + +这种做法也是 [shellcheck tool][8] (可针对 shell 脚本显示警告和建议)所建议的。例如: + +``` +user=`echo “$UID”` +user=$(echo “$UID”) +``` + +### 8\. 用 Read-only 来声明静态变量 + +静态变量不会改变;它的值一旦在脚本中定义后不能被修改: + +``` +readonly passwd_file=”/etc/passwd” +readonly group_file=”/etc/group” +``` + +### 9\. 环境变量用大写字母命名且自定义变量用小写 + +所有的 bash 环境变量用大写字母去命名,因此用小写字母来命名你的自定义变量以避免变量名冲突: + +``` +#定义自定义变量用小写且环境变量用大写 +nikto_file=”$HOME/Downloads/nikto-master/program/nikto.pl” +perl “$nikto_file” -h “$1” +``` + +### 10\. 总是对长脚本进行调试 + +如果你在写有数千行代码的 bash 脚本,排错可能变成噩梦。为了在脚本执行前易于修正一些错误,要进行一些调试。通过阅读下面给出的指南来掌握此技巧: + +1. [如何在 Linux 中启用 Shell 脚本调试模式][1] + +2. [如何在 Shell 脚本中执行语法检查调试模式][2] + +3. [如何在 Shell 脚本中用 Shell Tracing 来跟踪命令的执行情况][3] + +本文到这就结束了,你是否有一些其他更好的 bash 脚本编程经验想要分享?若是的话,在下面评论框分享出来吧。 + +-------------------------------------------------------------------------------- + +作者简介: + + +Aaron Kili 是一个 Linux 和 F.O.S.S(Free and Open-Source Software,自由及开放源代码软件)爱好者,未来的 Linux 系统管理员、Web 开发人员,目前是 TecMint 的内容创作者,他喜欢用电脑工作,且崇尚分享知识。 + +---------------- + +via: https://www.tecmint.com/useful-tips-for-writing-bash-scripts-in-linux/ + +作者:[ Aaron Kili][a] +译者:[ch-cn](https://github.com/ch-cn) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://www.tecmint.com/enable-shell-debug-mode-linux/ +[2]:https://www.tecmint.com/check-syntax-in-shell-script/ +[3]:https://www.tecmint.com/trace-shell-script-execution-in-linux/ +[4]:https://www.tecmint.com/category/bash-shell/ +[5]:https://www.tecmint.com/using-shell-script-to-automate-linux-system-maintenance-tasks/ +[6]:https://www.tecmint.com/wp-content/uploads/2017/05/Use-Double-Quotes-in-Scripts.png +[7]:https://www.tecmint.com/assign-linux-command-output-to-variable/ +[8]:https://www.tecmint.com/shellcheck-shell-script-code-analyzer-for-linux/ From 5c9a9e5dd54ed5dd3c5a851b99965c888128a9c1 Mon Sep 17 00:00:00 2001 From: zhousiyu325 Date: Sat, 17 Jun 2017 08:36:42 +0800 Subject: [PATCH 0450/1407] translate 20170113 Tips for non-native English speakers working on open source projects.md --- ...n-native English speakers working on open source projects.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/talk/20170113 Tips for non-native English speakers working on open source projects.md b/sources/talk/20170113 Tips for non-native English speakers working on open source projects.md index 3e98f70801..72de5d5e73 100644 --- a/sources/talk/20170113 Tips for non-native English speakers working on open source projects.md +++ b/sources/talk/20170113 Tips for non-native English speakers working on open source projects.md @@ -1,3 +1,5 @@ +translated by zhousiyu325 + Tips for non-native English speakers working on open source projects ============================================================ ![Tips for non-native English speakers working on open source projects](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/world_hands_diversity.png?itok=LMT5xbxJ "Tips for non-native English speakers working on open source projects") From 1595f7abf532305b097f7e74f990886a820228a1 Mon Sep 17 00:00:00 2001 From: KS Date: Sat, 17 Jun 2017 11:09:35 +0800 Subject: [PATCH 0451/1407] Delete 20160831 Apache Spark Scale - A 60 TB production use case.md --- ...rk Scale - A 60 TB production use case.md | 133 ------------------ 1 file changed, 133 deletions(-) delete mode 100644 sources/tech/20160831 Apache Spark Scale - A 60 TB production use case.md diff --git a/sources/tech/20160831 Apache Spark Scale - A 60 TB production use case.md b/sources/tech/20160831 Apache Spark Scale - A 60 TB production use case.md deleted file mode 100644 index 7e0268a00f..0000000000 --- a/sources/tech/20160831 Apache Spark Scale - A 60 TB production use case.md +++ /dev/null @@ -1,133 +0,0 @@ -wyangsun translating - -Apache Spark @Scale: A 60 TB+ production use case -=========== - -Facebook often uses analytics for data-driven decision making. Over the past few years, user and product growth has pushed our analytics engines to operate on data sets in the tens of terabytes for a single query. Some of our batch analytics is executed through the venerable [Hive][1] platform (contributed to Apache Hive by Facebook in 2009) and [Corona][2], our custom MapReduce implementation. Facebook has also continued to grow its Presto footprint for ANSI-SQL queries against several internal data stores, including Hive. We support other types of analytics such as graph processing and machine learning ([Apache Giraph][3]) and streaming (e.g., [Puma][4], [Swift][5], and [Stylus][6]). - -While the sum of Facebook's offerings covers a broad spectrum of the analytics space, we continually interact with the open source community in order to share our experiences and also learn from others. [Apache Spark][7] was started by Matei Zaharia at UC-Berkeley's AMPLab in 2009 and was later contributed to Apache in 2013. It is currently one of the fastest-growing data processing platforms, due to its ability to support streaming, batch, imperative (RDD), declarative (SQL), graph, and machine learning use cases all within the same API and underlying compute engine. Spark can efficiently leverage larger amounts of memory, optimize code across entire pipelines, and reuse JVMs across tasks for better performance. Recently, we felt Spark had matured to the point where we could compare it with Hive for a number of batch-processing use cases. In the remainder of this article, we describe our experiences and lessons learned while scaling Spark to replace one of our Hive workload - -### Use case: Feature preparation for entity ranking - -Real-time entity ranking is used in a variety of ways at Facebook. For some of these online serving platforms raw feature values are generated offline with Hive and data loaded into its real-time affinity query system. The old Hive-based infrastructure built years ago was computationally resource intensive and challenging to maintain because the pipeline was sharded into hundreds of smaller Hive jobs. In order to enable fresher feature data and improve manageability, we took one of the existing pipelines and tried to migrate it to Spark. - -### Previous Hive implementation - -The Hive-based pipeline was composed of three logical stages where each stage corresponded to hundreds of smaller Hive jobs sharded by entity_id, since running large Hive jobs for each stage was less reliable and limited by the maximum number of tasks per job. - - -![](https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xaf1/t39.2365-6/14050196_257613611304247_245043082_n.jpg) - -The three logical steps can be summarized as follows: - -1. Filter out non-production features and noise. -2. Aggregate on each (entity_id, target_id) pair. -3. Shard the table into N number of shards and pipe each shard through a custom binary to generate a custom index file for online querying. - -The Hive-based pipeline building the index took roughly three days to complete. It was also challenging to manage, because the pipeline contained hundreds of sharded jobs that made monitoring difficult. There was no easy way to gauge the overall progress of the pipeline or calculate an ETA. When considering the aforementioned limitations of the existing Hive pipeline, we decided to attempt to build a faster and more manageable pipeline with Spark. - -### Spark implementation - -Debugging at full scale can be slow, challenging, and resource intensive. We started off by converting the most resource intensive part of the Hive-based pipeline: stage two. We started with a sample of 50 GB of compressed input, then gradually scaled up to 300 GB, 1 TB, and then 20 TB. At each size increment, we resolved performance and stability issues, but experimenting with 20 TB is where we found our largest opportunity for improvement. - -While running on 20 TB of input, we discovered that we were generating too many output files (each sized around 100 MB) due to the large number of tasks. Three out of 10 hours of job runtime were spent moving files from the staging directory to the final directory in HDFS. Initially, we considered two options: Either improve batch renaming in HDFS to support our use case, or configure Spark to generate fewer output files (difficult due to the large number of tasks — 70,000 — in this stage). We stepped back from the problem and considered a third alternative. Since the tmp_table2 table we generate in step two of the pipeline is temporary and used only to store the pipeline's intermediate output, we were essentially compressing, serializing, and replicating three copies for a single read workload with terabytes of data. Instead, we went a step further: Remove the two temporary tables and combine all three Hive stages into a single Spark job that reads 60 TB of compressed data and performs a 90 TB shuffle and sort. The final Spark job is as follows: - - -![](https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xfp1/t39.2365-6/14146896_1073876729364007_1912864323_n.jpg) - -### How did we scale Spark for this job? - -Of course, running a single Spark job for such a large pipeline didn't work on the first try, or even on the 10th try. As far as we know, this is the largest real-world Spark job attempted in terms of shuffle data size (Databrick's Petabyte sort was on synthetic data). It took numerous improvements and optimizations to the core Spark infrastructure and our application to get this job to run. The upside of this effort is that many of these improvements are applicable to other large-scale workloads for Spark, and we were able to contribute all our work back into the open source Apache Spark project — see the JIRAs for additional details. Below, we highlight the major improvements that enabled one of the entity ranking pipelines to be deployed into production. - -### Reliability fixes - -#### Dealing with frequent node reboots - -In order to reliably execute long-running jobs, we want the system to be fault-tolerant and recover from failures (mainly due to machine reboots that can occur due to normal maintenance or software errors). Although Spark is designed to tolerate machine reboots, we found various bugs/issues that needed to be addressed before it was robust enough to handle common failures. - -- Make PipedRDD robust to fetch failure (SPARK-13793): The previous implementation of PipedRDD was not robust enough to fetch failures that occur due to node reboots, and the job would fail whenever there was a fetch failure. We made change in the PipedRDD to handle fetch failure gracefully so the job can recover from these types of fetch failure. -- Configurable max number of fetch failures (SPARK-13369): With long-running jobs such as this one, probability of fetch failure due to a machine reboot increases significantly. The maximum allowed fetch failures per stage was hard-coded in Spark, and, as a result, the job used to fail when the max number was reached. We made a change to make it configurable and increased it from four to 20 for this use case, which made the job more robust against fetch failure. -- Less disruptive cluster restart: Long-running jobs should be able to survive a cluster restart so we don't waste all the processing completed so far. Spark's restartable shuffle service feature lets us preserve the shuffle files after node restart. On top of that, we implemented a feature in Spark driver to be able to pause scheduling of tasks so the jobs don't fail due to excessive task failure due to cluster restart. - -#### Other reliability fixes - -- Unresponsive driver (SPARK-13279): Spark driver was stuck due to O(N^2) operations while adding tasks, resulting in the job being stuck and killed eventually. We fixed the issue by removing the unnecessary O(N^2) operations. -- Excessive driver speculation: We discovered that the Spark driver was spending a lot of time in speculation when managing a large number of tasks. In the short term, we disabled speculation for this job. We are currently working on a change in the Spark driver to reduce speculation time in the long term. -- TimSort issue due to integer overflow for large buffer (SPARK-13850): We found that Spark's unsafe memory operation had a bug that leads to memory corruption in TimSort. Thanks to Databricks folks for fixing this issue, which enabled us to operate on large in-memory buffer. -- Tune the shuffle service to handle large number of connections: During the shuffle phase, we saw many executors timing out while trying to connect to the shuffle service. Increasing the number of Netty server threads (spark.shuffle.io.serverThreads) and backlog (spark.shuffle.io.backLog) resolved the issue. -- Fix Spark executor OOM (SPARK-13958) (deal maker): It was challenging to pack more than four reduce tasks per host at first. Spark executors were running out of memory because there was bug in the sorter that caused a pointer array to grow indefinitely. We fixed the issue by forcing the data to be spilled to disk when there is no more memory available for the pointer array to grow. As a result, now we can run 24 tasks/host without running out of memory. - -### Performance improvements - -After implementing the reliability improvements above, we were able to reliably run the Spark job. At this point, we shifted our efforts on performance-related projects to get the most out of Spark. We used Spark's metrics and several profilers to find some of the performance bottlenecks. - -#### Tools we used to find performance bottleneck - -- Spark UI Metrics: Spark UI provides great insight into where time is being spent in a particular phase. Each task's execution time is split into sub-phases that make it easier to find the bottleneck in the job. -- Jstack: Spark UI also provides an on-demand jstack function on an executor process that can be used to find hotspots in the code. -- Spark Linux Perf/Flame Graph support: Although the two tools above are very handy, they do not provide an aggregated view of CPU profiling for the job running across hundreds of machines at the same time. On a per-job basis, we added support for enabling Perf profiling (via libperfagent for Java symbols) and can customize the duration/frequency of sampling. The profiling samples are aggregated and displayed as a Flame Graph across the executors using our internal metrics collection framework. - -### Performance optimizations - -- Fix memory leak in the sorter (SPARK-14363) (30 percent speed-up): We found an issue when tasks were releasing all memory pages but the pointer array was not being released. As a result, large chunks of memory were unused and caused frequent spilling and executor OOMs. Our change now releases memory properly and enabled large sorts to run efficiently. We noticed a 30 percent CPU improvement after this change. -- Snappy optimization (SPARK-14277) (10 percent speed-up): A JNI method — (Snappy.ArrayCopy) — was being called for each row being read/written. We raised this issue, and the Snappy behavior was changed to use the non-JNI based System.ArrayCopy instead. This change alone provided around 10 percent CPU improvement. -- Reduce shuffle write latency (SPARK-5581) (up to 50 percent speed-up): On the map side, when writing shuffle data to disk, the map task was opening and closing the same file for each partition. We made a fix to avoid unnecessary open/close and observed a CPU improvement of up to 50 percent for jobs writing a very high number of shuffle partitions. -- Fix duplicate task run issue due to fetch failure (SPARK-14649): The Spark driver was resubmitting already running tasks when a fetch failure occurred, which led to poor performance. We fixed the issue by avoiding rerunning the running tasks, and we saw the job was more stable when fetch failures occurred. -- Configurable buffer size for PipedRDD (SPARK-14542) (10 percent speed-up): While using a PipedRDD, we found out that the default buffer size for transferring the data from the sorter to the piped process was too small and our job was spending more than 10 percent of time in copying the data. We made the buffer size configurable to avoid this bottleneck. -- Cache index files for shuffle fetch speed-up (SPARK-15074): We observed that the shuffle service often becomes the bottleneck, and the reducers spend 10 percent to 15 percent of time waiting to fetch map data. Digging deeper into the issue, we found out that the shuffle service is opening/closing the shuffle index file for each shuffle fetch. We made a change to cache the index information so that we can avoid file open/close and reuse the index information for subsequent fetches. This change reduced the total shuffle fetch time by 50 percent. -- Reduce update frequency of shuffle bytes written metrics (SPARK-15569) (up to 20 percent speed-up): Using the Spark Linux Perf integration, we found that around 20 percent of the CPU time was being spent probing and updating the shuffle bytes written metrics. -- Configurable initial buffer size for Sorter (SPARK-15958) (up to 5 percent speed-up): The default initial buffer size for the Sorter is too small (4 KB), and we found that it is very small for large workloads — and as a result we waste a significant amount of time expending the buffer and copying the contents. We made a change to make the buffer size configurable, and with large buffer size of 64 MB we could avoid significant data copying, making the job around 5 percent faster. -- Configuring number of tasks: Since our input size is 60 T and each HDFS block size is 256 M, we were spawning more than 250,000 tasks for the job. Although we were able to run the Spark job with such a high number of tasks, we found that there is significant performance degradation when the number of tasks is too high. We introduced a configuration parameter to make the map input size configurable, so we can reduce that number by 8x by setting the input split size to 2 GB. - -After all these reliability and performance improvements, we are pleased to report that we built and deployed a faster and more manageable pipeline for one of our entity ranking systems, and we provided the ability for other similar jobs to run in Spark. - -### Spark pipeline vs. Hive pipeline performance comparison - -We used the following performance metrics to compare the Spark pipeline against the Hive pipeline. Please note that these numbers aren't a direct comparison of Spark to Hive at the query or job level, but rather a comparison of building an optimized pipeline with a flexible compute engine (e.g., Spark) instead of a compute engine that operates only at the query/job level (e.g., Hive). - -CPU time: This is the CPU usage from the perspective of the OS. For example, if you have a job that is running only one process on a 32-core machine using 50 percent of all CPU for 10 seconds, then your CPU time would be 32 * 0.5 * 10 = 160 CPU seconds. - -![](https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xpt1/t39.2365-6/14146892_595234533986285_2004398348_n.jpg) - -CPU reservation time: This is the CPU reservation from the perspective of the resource management framework. For example, if we reserve a 32-core machine for 10 seconds to run the job, the CPU reservation time is 32 * 10 = 320 CPU seconds. The ratio of CPU time to CPU reservation time reflects how well are we utilizing the reserved CPU resources on the cluster. When accurate, the reservation time provides a better comparison between execution engines when running the same workloads when compared with CPU time. For example, if a process requires 1 CPU second to run but must reserve 100 CPU seconds, it is less efficient by this metric than a process that requires 10 CPU seconds but reserves only 10 CPU seconds to do the same amount of work. We also compute the memory reservation time but do not include it here, since the numbers were similar to the CPU reservation time due to running experiments on the same hardware, and that in both the Spark and Hive cases we do not cache data in memory. Spark has the ability to cache data in memory, but due to our cluster memory limitations we decided to work out-of-core, similar to Hive. - -![](https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xfa1/t39.2365-6/14129680_325754934432503_513809233_n.jpg) - -Latency: End-to-end elapsed time of the job. - -![](https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xap1/t39.2365-6/14129681_178723715883876_1030939470_n.jpg) - -### Conclusion and future work - -Facebook uses performant and scalable analytics to assist in product development. Apache Spark offers the unique ability to unify various analytics use cases into a single API and efficient compute engine. We challenged Spark to replace a pipeline that decomposed to hundreds of Hive jobs into a single Spark job. Through a series of performance and reliability improvements, we were able to scale Spark to handle one of our entity ranking data processing use cases in production. In this particular use case, we showed that Spark could reliably shuffle and sort 90 TB+ intermediate data and run 250,000 tasks in a single job. The Spark-based pipeline produced significant performance improvements (4.5-6x CPU, 3-4x resource reservation, and ~5x latency) compared with the old Hive-based pipeline, and it has been running in production for several months. - -While this post details our most challenging use case for Spark, a growing number of customer teams have deployed Spark workloads into production. Performance, maintainability, and flexibility are the strengths that continue to drive more use cases to Spark. Facebook is excited to be a part of the Spark open source community and will work together to develop Spark toward its full potential. - - - - - - - - --------------------------------------------------------------------------------- - -via: https://code.facebook.com/posts/1671373793181703/apache-spark-scale-a-60-tb-production-use-case/?utm_source=dbweekly&utm_medium=email - -作者:[Sital Kedia][a] [王硕杰][b] [Avery Ching][c] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: https://www.facebook.com/sitalkedia -[b]: https://www.facebook.com/shuojiew -[c]: https://code.facebook.com/posts/1671373793181703/apache-spark-scale-a-60-tb-production-use-case/?utm_source=dbweekly&utm_medium=email# -[1]: https://code.facebook.com/posts/370832626374903/even-faster-data-at-the-speed-of-presto-orc/ -[2]: https://www.facebook.com/notes/facebook-engineering/under-the-hood-scheduling-mapreduce-jobs-more-efficiently-with-corona/10151142560538920/ -[3]: https://code.facebook.com/posts/509727595776839/scaling-apache-giraph-to-a-trillion-edges/ -[4]: https://research.facebook.com/publications/realtime-data-processing-at-facebook/ -[5]: https://research.facebook.com/publications/realtime-data-processing-at-facebook/ -[6]: https://research.facebook.com/publications/realtime-data-processing-at-facebook/ -[7]: http://spark.apache.org/ - From b705424efb86e1e21094d3248e4e8b4cb5d65d64 Mon Sep 17 00:00:00 2001 From: KS Date: Sat, 17 Jun 2017 11:11:18 +0800 Subject: [PATCH 0452/1407] Create 20160831 Apache Spark Scale - A 60 TB production use case.md --- ...ark Scale - A 60 TB production use case.md | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 translated/tech/20160831 Apache Spark Scale - A 60 TB production use case.md diff --git a/translated/tech/20160831 Apache Spark Scale - A 60 TB production use case.md b/translated/tech/20160831 Apache Spark Scale - A 60 TB production use case.md new file mode 100644 index 0000000000..a1b160dce1 --- /dev/null +++ b/translated/tech/20160831 Apache Spark Scale - A 60 TB production use case.md @@ -0,0 +1,120 @@ +Apache Spark 一个60TB+规模的产品使用案例 +=========== +Facebook 经常使用数据驱动的分析方法来做决策。在过去的几年,用户和产品的增长已经推动了我们的分析工程师在数十兆兆字节数据集上执行单独的查询。我们的一些批量分析执行在可敬的 [Hive][1] 平台(在2009年 Facebook 贡献了 Apache Hive)和 [Corona][2],我们的客户 MapReduce 实现。Facebook还针对几个内部数据存储(包括Hive)继续增加其对Presto ANSI-SQL 语句的封装。我们支持其他分析类型,比如图片处理和机器学习([Apache Giraph][3])和流(例如,[Puma][4],[Swift][5] 和 [Stylus][6])。 + +同时 Facebook 的所有产品涵盖了广泛的分析领域,为了共享我们的经验也为了从其他人学习,我们与开源社区继续相互影响。[Apache Spark][7] 于2009年在加州大学伯克利分校的 AMPLab 由Matei Zaharia 发起,后来在2013年贡献给 Apache。它是目前增长最快的数据处理平台之一,由于它能支持流,批,命令式(RDD),声明式(SQL),图形和机器学习用例,所有这些内置在相同的API和底层计算引擎。Spark 可以有效地利用更大量的内存,优化整个流程中的代码,并跨任务重用 JVM 以获得更好的性能。最近我们感觉 Spark 已经成熟,我们可以把他与 Hive 比较,做一些批量处理用例。文章其余的部分,我们讲述了扩展 Spark 来替代我们一个 Hive 工作量时的经验和学习到的教训。 + +### 用例:实体排名功能准备 + +在 Facebook 以多种方式使用实时实体排名。对于一些在线服务平台原始特性数值由 Hive 线下生成,然后将数据加载到实时关联查询系统。几年前建立的基于 Hive 的老式基础设施在计算上是资源密集型的并且很难维护,因为流程被划分成数百个较小的 Hive 工作。为了可以使用更加新的功能数据和提供可管理性,我们拿一个现有的流水线然后试着将其迁移至 Spark。 + +### 以前的 Hive 实现 + +基于 Hive 的管道由三个逻辑阶段组成,每个阶段对应由 entity_id 划分的数百个较小的 Hive 作业,因为每个阶段运行大型 Hive 作业不太可靠,并受到每个作业的最大任务数量的限制。 + +![](https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xaf1/t39.2365-6/14050196_257613611304247_245043082_n.jpg) + +这三个逻辑阶段可以被总结如下: + +1. 过滤出非产品功能和噪点。 +2. 在每个(entity_id,target_id)对上聚合。 +3. 将表格分割成N个分片,并通过自定义二进制文件管理每个分片,以生成用于在线查询的自定义索引文件。 + +基于 Hive 的流程建立索引大概要三天完成。它也难于管理,因为流程包含上百个分片的工作,使监控也变得困难。没有好的方法估算流程进度或计算剩余时间。当考虑 Hive 流程的上述限制,我们决定建立一个更快更易于管理的 Spark 流程 + +### Spark 实现 + +全面的调试会很慢,有挑战,资源密集。我们转换基于 Hive 流程资源最密集的部分开始:第二步。我们以一个50GB的压缩输入例子开始,然后逐渐扩展到300GB,1TB,然后到20TB。在每次规模增长,我们解决了性能和稳定性问题,但是实验到20TB,我们发现最大的改善机会。 + +运行在20TB的输入时,我们发现,由于大量的任务我们生成了太多输出文件(每个大小在100MB左右)。在10小时的作业运行时中,有三分之一是将文件从阶段目录移动到HDFS中的最终目录。起初,我们考虑两个选项:要么改善 HDFS 中的批量重命名来支持我们的用例,或者配置 Spark 生成更少的输出文件(很难,由于在这一步有大量的任务 — 70,000 )。我们退出这个问题,考虑第三种方案。由于我们在流程的第二步中生成的tmp_table2表是临时的,仅用于存储管道的中间输出,所以我们基本上压缩,序列化和复制三个副本,以便将单个读取TB级数据的工作负载。相反,我们更进一步:移除两个临时表并整合 Hive 过程的所有三部分到一个单独的 Spark 工作,读取60TB的压缩数据然后处理90TB的重新分配和排序。最终 Spark 工作如下: + +![](https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xfp1/t39.2365-6/14146896_1073876729364007_1912864323_n.jpg) + +### 为此工作我们如何规划 Spark? + +当然,为如此大的流程运行一个单独的 Spark 任务,第一次尝试没有成功,甚至是第十次尝试。据我们所知,最大的 Spark 工作真实是在重新分配数据大小上(Databrick 的 Petabyte 排序是在合成数据上)。核心 Spark 基础架构和我们的应用程序进行了许多改进和优化使这个工作运行。这种努力的优势在于,许多这些改进适用于 Spark 的其他大型工作量,我们将所有工作捐献给开源 Apache Spark 项目 - 有关其他详细信息,请参阅JIRA。下面,我们强调的是实体排行流程之一部署到生产环境的重大改进。 + +### 可靠性修复 + +#### 处理频繁的节点重启 + +为了可靠地执行长时间运行的作业,我们希望系统容错并从故障中恢复(主要是由于机器重启,可能是平时的维护或软件错误的原因)。虽然 Spark 设计为容忍机器重启,我们发现在处理常见故障之前有各种错误/问题需要定位。 + +- 使 PipedRDD 稳健的获取失败(SPARK-13793):PipedRDD 以前的实现不够强大,无法获取由于节点重启而导致的故障,并且只要出现提取失败,该作业就会失败。我们在 PipedRDD 中进行了更改,优雅的处理提取失败,因此该作业可以从这些提取到的失败中恢复。 +- 可配置的最大获取失败次数(SPARK-13369):使用这种长时间运行的作业,由于机器重启引起的提取失败概率显着增加。在Spark中每个阶段的最大允许获取失败是硬编码的,因此,当达到最大数量时该作业将失败。我们做了一个改变,使它可配置并且在这个用例将其从4增长到20,通过获取失败使作业更稳健。 +- 减少集群重启混乱:长耗时作业应该可以在集群重启时生存,所以我们不用浪费所有完成的处理。Spark 的可重新启动的分配服务功能使我们可以在节点重新启动后保留分配文件。最重要的是,我们在Spark驱动程序中实现了一项功能,可以暂停执行任务调度,所以由于过重的任务失败导致的集群重启,作业不会失败。 + +#### 其他的可靠性修复 + +- 响应迟钝的驱动程序(SPARK-13279):在添加任务时,由于O(N ^ 2)操作,Spark驱动程序被卡住,导致该作业最终被卡住和死亡。 我们通过删除不必要的O(N ^ 2)操作来修复问题。 +- 过多的驱动推测:我们发现,Spark 驱动程序在管理大量任务时花费了大量的时间推测。 在短期内,我们禁止这个作业的推测。在长期,我们正在努力改变Spark驱动程序,以减少推测时间。 +- 由于大型缓冲区的整数溢出导致的 TimSort 问题(SPARK-13850):我们发现 Spark 的不安全内存操作有一个漏洞,导致 TimSort 中的内存损坏。 感谢 Databricks 的人解决了这个问题,这使我们能够在大内存缓冲区中运行。 +- 调整分配服务来处理大量连接:在分配阶段,我们看到许多执行程序在尝试连接分配服务时超时。 增加Netty服务器线程(spark.重排.io.serverThreads)和积压(spark.重排.io.backLog)的数量解决了这个问题。 +- 修复 Spark 执行程序 OOM(SPARK-13958)(交易制造商):首先在每个主机上打包超过四个聚合任务是很困难的。Spark 执行程序内存溢出,因为排序程序中存在导致无限期增长的指针数组的漏洞。当指针数组不再有可用的内存增长时,我们通过强制将数据溢出到磁盘来修复问题。因此,现在我们可以运行24个任务/主机,而不会内存溢出。 + +### 性能改进 + +在实施上述可靠性改进后,我们能够可靠地运行 Spark 工作。基于这一点,我们将精力转向与性能相关的项目,以充分发挥 Spark 的作用。我们使用 Spark 的指标和几个分析器来查找一些性能瓶颈。 + +#### 我们用来查找性能平静的工具 + +- Spark UI Metrics:Spark UI 可以很好地了解在特定阶段花费的时间。每个任务的执行时间被分为子阶段,以便更容易地找到作业中的瓶颈。 +- Jstack:Spark UI还在执行程序进程上提供了一个被需要的jstack函数,可用于中查找热点代码。 +- Spark Linux Perf / Flame Graph 支持:尽管上述两个工具非常方便,但它们并不提供同时在数百台机器上运行的作业的 CPU 分析的聚合视图。在每个作业的基础上,我们添加了支持 Perf 分析(通过libperfagent的Java符号),并可以自定义采样的持续时间/频率。使用我们的内部指标收集框架,将概要分析样本聚合并显示为使用Flame Graph的执行程序。 + +### 性能优化 + +- 修复分拣机中的内存泄漏(SPARK-14363)(加速30%):我们发现了一个问题,当任务释放所有内存页时指针数组却未被释放。 因此,大量的内存未被使用,并导致频繁的溢出和程序 OOM。 我们现在进行了改变,正确地释放内存,并能够大量分类使运行更有效。 我们注意到,这一变化后 CPU 改善了30%。 +- Snappy优化(SPARK-14277)(10%加速):JNI方法 -(Snappy.ArrayCopy)- 在每一行被读取/写入时都会被调用。 我们提出了这个问题,Snappy 的行为被改为使用非 JNI 的 System.ArrayCopy 代替。 这一改变节约了大约10%的CPU。 +- 减少重新分配写入延迟(SPARK-5581)(高达50%的速度提升):在映射方面,将重新分配数据写入磁盘时,映射任务为每个分区打开并关闭相同的文件。 我们做了一个修复,以避免不必要的打开/关闭,并观察到高达50%的CPU改进写作大量的重新分配分区的工作。 +- 解决由于获取失败导致的重复任务运行问题(SPARK-14649):当获取失败发生时,Spark驱动程序重新提交已运行的任务,导致性能下降。 我们通过避免重新运行运行的任务来解决问题,我们看到当提取失败发生时工作更加稳定。 +- PipedRDD的可配置缓冲区大小(SPARK-14542)(10%速度提升):在使用PipedRDD时,我们发现将数据从分类器传输到管道过程的默认缓冲区大小太小,我们的作业要花费超过10%的时间复制数据。 我们使缓冲区大小可配置,以避免这个瓶颈。 +- 用于重排提取加速的缓存索引文件(SPARK-15074):我们观察到重排服务经常成为瓶颈,减少器花费10%至15%的时间等待获取地图数据。深入了解问题,我们发现,随机播放服务是为每个重排提取打开/关闭随机索引文件。我们进行了更改以缓存索引信息,以便我们可以避免文件打开/关闭,并重新使用索引信息以便后续提取。这个变化将总重排时间减少了50%。 +- 降低重排字节写入指标的更新频率(SPARK-15569)(高达20%的加速):使用 Spark Linux Perf 集成,我们发现大约20%的CPU时间正在花费探测和更新写入的重排字节指标。 +- 分拣机可配置的初始缓冲区大小(SPARK-15958)(高达5%的加速):分拣机的默认初始缓冲区大小太小(4 KB),我们发现它对于大型工作负载非常小 - 所以我们浪费了大量的时间消耗缓冲区并复制内容。我们做了一个更改,使缓冲区大小可配置,并且缓冲区大小为64 MB,我们可以避免重复的数据复制,使作业的速度提高约5%。 +- 配置任务数量:由于我们的输入大小为60T,每个 HDFS 块大小为256M,因此我们为该作业产生了超过250,000个任务。尽管我们能够以如此多的任务来运行Spark工作,但是我们发现,当任务数量过高时,性能会下降。我们引入了一个配置参数,使地图输入大小可配置,因此我们可以通过将输入分割大小设置为2 GB来将该数量减少8倍。 + +在所有这些可靠性和性能改进之后,我们很高兴地报告,我们为我们的实体排名系统之一构建和部署了一个更快更易于管理的流程,并且我们提供了在Spark中运行其他类似作业的能力。 + +### Spark 流程与 Hive 流程性能对比 + +我们使用以下性能指标来比较Spark流程与Hive流程。请注意,这些数字并不是Spark与Hive在查询或作业级别的直接比较,而是将优化流程与灵活的计算引擎(例如Spark)进行比较,而不是仅在查询/作业级别(如Hive)。 + +CPU 时间:这是从系统角度看 CPU 使用。例如,你在一个32核机器上使用50%的 CPU 10秒运行一个单进程任务,然后你的 CPU 时间应该是32 * 0.5 * 10 = 160 CPU 秒。 + +![](https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xpt1/t39.2365-6/14146892_595234533986285_2004398348_n.jpg) + +CPU预留时间:这是从资源管理框架的角度来看CPU预留。例如,如果我们保留32位机器10秒钟来运行作业,则CPU预留时间为32 * 10 = 320 CPU秒。CPU时间与CPU预留时间的比率反映了我们如何在集群上利用预留的CPU资源。当准确时,与CPU时间相比,预留时间在运行相同工作负载时,可以更好地比较执行引擎。例如,如果一个进程需要1个CPU的时间才能运行,但是必须保留100个CPU秒,则该指标的效率要低于需要10个CPU秒的进程,但是只能执行10个CPU秒钟来执行相同的工作量。我们还计算内存预留时间,但不包括在这里,因为数字类似于CPU预留时间,因为在同一硬件上运行实验,而在 Spark 和 Hive 的情况下,我们不会将数据缓存在内存中。Spark有能力在内存中缓存数据,但是由于我们的集群内存限制,我们决定核心工作与Hive类似。 + +![](https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xfa1/t39.2365-6/14129680_325754934432503_513809233_n.jpg) + +等待时间:端到端的工作流失时间。 + +![](https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xap1/t39.2365-6/14129681_178723715883876_1030939470_n.jpg) + +### 结论和未来工作 + +Facebook的性能和可扩展的分析在产品开发给予了协助。Apache Spark 提供了将各种分析用例统一为单一API和高效计算引擎的独特功能。我们挑战了Spark,来将一个分解成数百个Hive作业的流程替换成一个Spark工作。通过一系列的性能和可靠性改进之后,我们可以将Spark扩大到处理我们在生产中的实体排名数据处理用例之一。 在这个特殊用例中,我们展示了Spark可以可靠地重排和排序90 TB +中间数据,并在一个工作中运行了25万个任务。 与旧的基于Hive的流程相比,基于Spark的流程产生了显着的性能改进(4.5-6倍CPU,3-4倍资源预留和〜5倍的延迟),并且已经投入使用了几个月。 + +虽然本文详细介绍了我们 Spark 最具挑战性的用例,但越来越多的客户团队已将Spark工作负载部署到生产中。 性能,可维护性和灵活性是继续推动更多用例到Spark的优势。 Facebook很高兴成为Spark开源社区的一部分,并将共同开发Spark充分发挥潜力。 + +-------------------------------------------------------------------------------- + +via: https://code.facebook.com/posts/1671373793181703/apache-spark-scale-a-60-tb-production-use-case/?utm_source=dbweekly&utm_medium=email + +作者:[Sital Kedia][a] [王硕杰][b] [Avery Ching][c] +译者:[wyangsun](https://github.com/wyangsun) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://www.facebook.com/sitalkedia +[b]: https://www.facebook.com/shuojiew +[c]: https://code.facebook.com/posts/1671373793181703/apache-spark-scale-a-60-tb-production-use-case/?utm_source=dbweekly&utm_medium=email# +[1]: https://code.facebook.com/posts/370832626374903/even-faster-data-at-the-speed-of-presto-orc/ +[2]: https://www.facebook.com/notes/facebook-engineering/under-the-hood-scheduling-mapreduce-jobs-more-efficiently-with-corona/10151142560538920/ +[3]: https://code.facebook.com/posts/509727595776839/scaling-apache-giraph-to-a-trillion-edges/ +[4]: https://research.facebook.com/publications/realtime-data-processing-at-facebook/ +[5]: https://research.facebook.com/publications/realtime-data-processing-at-facebook/ +[6]: https://research.facebook.com/publications/realtime-data-processing-at-facebook/ +[7]: http://spark.apache.org/ From 73f61e8d7b3e971586d015714a3e5de4c077dc9d Mon Sep 17 00:00:00 2001 From: zhousiyu325 Date: Sat, 17 Jun 2017 11:15:34 +0800 Subject: [PATCH 0453/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=AE=8C20170113?= =?UTF-8?q?=20Tips=20for=20non-native=20English=20speakers=20working=20on?= =?UTF-8?q?=20open=20source=20projects.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...peakers working on open source projects.md | 91 ------------------- ...peakers working on open source projects.md | 86 ++++++++++++++++++ 2 files changed, 86 insertions(+), 91 deletions(-) delete mode 100644 sources/talk/20170113 Tips for non-native English speakers working on open source projects.md create mode 100644 translated/talk/20170113 Tips for non-native English speakers working on open source projects.md diff --git a/sources/talk/20170113 Tips for non-native English speakers working on open source projects.md b/sources/talk/20170113 Tips for non-native English speakers working on open source projects.md deleted file mode 100644 index 72de5d5e73..0000000000 --- a/sources/talk/20170113 Tips for non-native English speakers working on open source projects.md +++ /dev/null @@ -1,91 +0,0 @@ -translated by zhousiyu325 - -Tips for non-native English speakers working on open source projects -============================================================ - ![Tips for non-native English speakers working on open source projects](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/world_hands_diversity.png?itok=LMT5xbxJ "Tips for non-native English speakers working on open source projects") -Image by :  - -opensource.com - -The primary language of most open source projects is English, but open source users and contributors span the globe. Non-native speakers face many communication and cultural challenges when participating in the ecosystem. - -In this article, we will share challenges, how to overcome them, and best practices for easing onboarding of non-native speakers, as non-native English speakers and contributors to OpenStack. We are based in Japan, Brazil, and China, and work daily with the huge OpenStack community that is spread around the world. - -The official language of OpenStack is English, which means we communicate daily as non-native speakers. - -### Challenges - -Non-native English speakers face specific communication challenges when starting out in open source communities: they are related to limited language skills and cultural disparity. - -### Language skills - -Let's focus on the specific language skills behind reading, writing, listening, and speaking. - -Reading: This is the easiest but also the most important skill. It is the easiest because if you can't understand what is written you have the opportunity to read it again, or as many times as needed. If you encounter an uncommon phrase, expression, or abbreviation, you can use a dictionary or translator. On the other hand, it is the most important skill because for most open source projects the main means of communication are mailing lists and IRC. - -Writing: English grammar is an issue especially for languages that structure sentences differently. This may pose a problem for communication in writing emails and communicating via IRC channels. For some, writing long and beautiful sentences is difficult, and the reliance on simpler sentences is prevalent because these are easy to write and convey understanding. - -Listening: This is more problematic than reading and writing for non-native speakers. Normally, conversation between native English speakers is very fast, which makes following the discussions for those still learning difficult and limits their participation in those discussions. Furthermore, trying to understand the variety of accents in a globally spread community adds to the complexity. Interestingly, American pronunciation is often easier to understand than others. - -Speaking: Speaking is more difficult than listening because the participant's vocabulary may a bit limited. Furthermore, English's phonemes and grammar are often very different from a non-native speaker's mother language, making an interaction even more difficult to understand. - -### Cultural differences - -Each culture has different norms when interacting with other people in the open source community. For example, the Japanese tend not to say yes or no clearly as a way to respect others and to avoid fighting each other. This is often very different from other cultures and may cause misunderstanding of what was expressed. - -In Chinese culture, people prefer to just say yes, instead of saying no or trying to negotiate. In a globally distributed community as OpenStack, this often leads to the lack of confidence when expressing opinions. Furthermore, Chinese people like to list the facts first and give the thesis at the end, and this can cause confusion for people from other cultures because it is not what they expect. - -A Brazilian, for instance, may find that discussions are driven in a similar way; however, some cultures are very short and direct in responses, which may sound a bit rude. - -### Overcoming obstacles - -Challenges related to language skills are easier to overcome than cultural ones. Cultural differences need to be respected, while English skills can always be improved. - -In order to brush up on your language skills, be in contact with the language as much as you can. Do not think about your limitations. Just do your best and you will improve eventually. - -Read as much as you can, because this will help you gather vocabulary. Communicating through chat and mailing lists daily helps, too. Some tools, such as real-time dictionaries and translators, are very useful with these platforms. - -Talking to others or yourself helps you become comfortable speaking out more frequently. Having one-on-one conversations to express your ideas is easier than discussing in larger groups. - -### Onboarding newcomers - -A few initiatives from both newcomers and native speakers may positively affect the onboarding process. - -### Newcomers - -Speak and write your opinion, and ask your questions; this participation is always a good opportunity to exercise your English. Do not be afraid. - -For meetings, make sure you prepare yourself in advance so you will be comfortable with the subject and more confident about the opinions you are expressing. - -Make friends who are English speakers and talk more to practice your English skills. - -Writing blogs and technical articles in English are also great ideas. - -### Tips for native English speakers - -Please speak slowly and use simple words and sentences. Don't make fun of non-native English speakers if you find something wrong about the English they used. Try to encourage newcomers to express their opinions, and make them comfortable enough to do so. - -_This article was co-written by Masayuki Igawa, Dong Ma, and Samuel de Medeiros Queiroz. Learn more in their talk at linux.conf.au 2017 ([#lca2017][1]) in Hobart: [Non-native English speakers in Open Source communities: A True Story.][2]_ - --------------------------------------------------------------------------------- - -作者简介: - -![](https://opensource.com/sites/default/files/styles/profile_pictures/public/pictures/myface_s.jpg?itok=-dy9_LQd) - -Masayuki Igawa - Masayuki Igawa is a software engineer for over 15 years on a wide range of software projects, and developing open source software related to Linux kernel and virtualization. He's been an active technical contributor to OpenStack since 2013. He is a core member of some OpenStack QA projects such as Tempest, subunit2sql, openstack-health and stackviz. He currently works for HPE's Upstream OpenStack team to make OpenStack better for everyone. He has previously been a speaker at OpenStack Summits, - --------------------------------------------------------------------------------- - - -via: https://opensource.com/article/17/1/non-native-speakers-take-open-source-communities - -作者:[Masayuki Igawa][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/masayukig -[1]:https://twitter.com/search?q=%23lca2017&src=typd -[2]:https://linux.conf.au/schedule/presentation/70/ diff --git a/translated/talk/20170113 Tips for non-native English speakers working on open source projects.md b/translated/talk/20170113 Tips for non-native English speakers working on open source projects.md new file mode 100644 index 0000000000..60fe9c939e --- /dev/null +++ b/translated/talk/20170113 Tips for non-native English speakers working on open source projects.md @@ -0,0 +1,86 @@ + +给英语非母语的人从事开源项目的若干建议 +==================================================== + ![Tips for non-native English speakers working on open source projects](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/world_hands_diversity.png?itok=LMT5xbxJ "Tips for non-native English speakers working on open source projects") + + 图片来源: opensource.com + +大多数的开源项目的主要语言都是英语,但是开源项目的用户和贡献者却遍布全球。英语非母语的人在参与这个生态系统时会面临许多沟通和文化上的挑战。 + +在这篇文章中,作为不以英语为母语而且是 OpenStack 的贡献者的我们将会分享一些挑战——如何去克服它们,还有一些好的方案,它们能够减轻不以英语为母语且刚开始学习的人的焦虑。我们的总部在日本、巴西和中国,每天都会与世界各地的大型 OpenStack 社区合作。 + +OpenStack 的官方语言是英语,这意味着我们是作为非英语为母语的人士来进行交流。 + +### 挑战 + +非英语为母语的人士在开源社区工作时会面临具体沟通挑战:它们与有限的语言技能和文化差异有关。 + +### 语言技能 + +让我们来关注在阅读、写作、听力和口语背后的具体语言技能。 + +阅读:这是最简单也是最重要的技能。最简单是因为:如果你不明白写了什么,你有机会再次阅读它,或者需要多次阅读。如果你遇到了一个不常见的短语、表达式或者缩写,你可以使用一个词典或者翻译器。在另一方面,它是最重要的技能是因为:对大多数开源项目而言,主要的交流方式都是邮件列表和 IRC。 + +写作:英语语法是一个问题,尤其是对句子结构不同的语言。这可能会在用电子邮件进行通信和通过 IRC 频道进行通信时产生问题。对一些人来说,写出又长又漂亮的句子比较困难,而对简单句子的依赖是普遍的,因为这些很容易写和表达理解。 + +听力:这对非英语为母语的人来说比阅读和写作更加困难。通常,英语为母语的人之间的对话是在非常快的,这就使得那些仍然在学习的人很难理解他们的讨论,同时也限制了他们参与到讨论当中。此外,试图理解一个遍布全球的社区的各种口音也增加了复杂性。有意思的是,美国人的发音往往比其他的容易理解。 + +口语:口语比听力更加的困难,因为参与者的词汇量可能会比较有限。而且,英语的音素和语法通常与那些母语不是英语的人的母语相差很大,这就使得互动更加的难以理解。 + +### 文化差异 + +在开源社区与其他人交流时,每种文化都有它自己不同的规范。例如,日本人通常不会明确的说好的或者不,他们认为这是尊重别人的一种方式,可以避免彼此间的争论。这通常与其他的文化大不一样,可能会对所表达的内容造成误解。 + +在中国文化中,人们倾向于只是说好的,代替说不或者试图商讨。在一个像 OpenStack 这样的分布于全球的社区里,这通常会导致在表达意见时缺乏自信。另外,中国人喜欢首先列出事实,然后在后面给出结论。而这会对来自其他文化中的人造成困惑,因为这不是他们所期望的。 + +例如,巴西人可能会认为讨论是以类似的方式推动的;然而,其他文化反应会很直接和简短,这听起来可能会有点粗鲁。 + +### 克服障碍 + +语言技能方面的挑战要比文化差异方面的挑战容易克服。文化差异需要被受到尊重,然而英语技能却总是可以被改善的。 + +为了刷新你的语言技能,你应该尽可能多地与语言接触。不要想你的局限,只管尽自己所能,你终将会得到改善。 + +尽可能多的阅读,因为这有助于你积累词汇。通过日常的聊天和邮件列表进行交流也很有帮助。一些工具,如实时字典和翻译器,对这些平台非常有用。 + +与别人或者你自己交谈可以帮助你更自如地频繁地说话。进行一对一的对话来表达你的想法比在更大的群体中讨论更容易。 + +### 准新手 + +来自新手和母语者的一些举措可能会对学习过程产生积极的影响。 + +### 新手 + +说出和写下你的意见,并且提出你的问题;参与其中总是一个练习你的英语的很好的机会。不要害怕。 + +对于会议,确保你提前准备过,这样你将会对会议主题比较熟悉,而且会对自己要表达的意见更加的自信。 + +与英语为母语的人结交朋友,多和他们讨论来提高你的英语技能。 + +用英语写博客和技术文章也是不错的主意。 + +### 给英语为母语的人士的建议 + +请说话慢一点儿,同时使用一些简单的单词和句子。如果你发现了非英语为母语的人使用英语中的一些错误请不要嘲笑他们,尝试鼓励新来的人表达自己的意见,让他们非常舒适地表达意见。 + +*这篇文章由 Masayuki Igawa、Dong Ma 和 Samuel de Medeiros Queiroz 共同协作完成,可以在 Hobart 的 linux.conf.au 2017([#lca2017][1]):[Non-native English speakers in Open Source communities: A True Story.][2]中了解更多* + +------------------------------------------- + +作者简介: + +![](https://opensource.com/sites/default/files/styles/profile_pictures/public/pictures/myface_s.jpg?itok=-dy9_LQd) + +Masayuki Igawa:Masayuki Igawa 是一名拥有 15 年大量软件项目经验的软件工程师,目前正在开发与 Linux 内核和虚拟化相关开源软件。自 2013 年起,他就一直是一名活跃的 OpenStack 项目贡献者。他是像 Tempest 和 subunit2sql 这样一些 OpenStack QA 项目的核心成员。他目前就职于 HPE 的 Upstream OpenStack 团队,该团队目的是使 OpenStack 更适合所有人。他以前曾在 OpenStack 峰会上发表演讲。 + +via: https://opensource.com/article/17/1/non-native-speakers-take-open-source-communities + +作者:[Masayuki Igawa][a] +译者:[zhousiyu325](https://github.com/zhousiyu325) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/masayukig +[1]:https://twitter.com/search?q=%23lca2017&src=typd +[2]:https://linux.conf.au/schedule/presentation/70/ \ No newline at end of file From 5d27fb8eec6ef60d891b93d64914d414b274a0af Mon Sep 17 00:00:00 2001 From: chenxinlong <237448382@qq.com> Date: Sat, 17 Jun 2017 11:43:07 +0800 Subject: [PATCH 0454/1407] keep updating --- ...5 An introduction to Linux s EXT4 filesystem.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md b/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md index 916943c3e1..2f56c1ad7c 100644 --- a/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md +++ b/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md @@ -150,17 +150,17 @@ Group 3: (Blocks 98304-131071) ``` -每一个柱面组都有自己的 inode 位图用于判定该柱面组中的哪些 inode 是使用中的而哪些又是未被使用的。每一个柱面组的 inode 都有它们自己的空间。每一个 inode 都包含了对应的文件的相关信息,包括其位于该文件的数据块中的位置。The block bitmap keeps track of the used and free data blocks within the filesystem. Notice that there is a great deal of data about the filesystem in the output shown above. On very large filesystems the group data can run to hundreds of pages in length. The group metadata includes a listing of all of the free data blocks in the group. +每一个柱面组都有自己的 inode 位图用于判定该柱面组中的哪些 inode 是使用中的而哪些又是未被使用的。每一个柱面组的 inode 都有它们自己的空间。每一个 inode 都包含了对应的文件的相关信息,包括其位于该文件的数据块中的位置。这个块位图纪录了文件系统中的使用中和非使用中的数据块。请注意,在上面的输出中有大量关于文件系统的数据。在非常大的文件系统上,组数据可以运行到数百页的长度。 组元数据包括组中所有空闲数据块的列表。 -The EXT filesystem implemented data-allocation strategies that ensured minimal file fragmentation. Reducing fragmentation improved filesystem performance. Those strategies are described below, in the section on EXT4. +EXT 文件系统实现了数据分配策略以确保产生最少的文件碎片。减少文件碎片可以提高文件系统的性能。这些策略会在下面的 EXT4 中描述到。 -The biggest problem with the EXT2 filesystem, which I encountered on some occasions, was that it could take many hours to recover after a crash because the **fsck** (file system check) program took a very long time to locate and correct any inconsistencies in the filesystem. It once took over 28 hours on one of my computers to fully recover a disk upon reboot after a crash—and that was when disks were measured in the low hundreds of megabytes in size. +我所遇见的关于 EXT2 文件系统最大的问题是 **fsck** (文件系统检查) 程序这一环节占用了很长一段时间来定位和校准文件系统中的所有不一致性导致其共花费了数个小时来修复一个崩溃。有一次我的其中一台电脑共花费了 28 个小时在一次崩溃后重新启动时恢复磁盘上,并且是在磁盘被检测量在几百兆字节大小的情况下。 ### EXT3 -The [EXT3 filesystem][25] had the singular objective of overcoming the massive amounts of time that the **fsck** program required to fully recover a disk structure damaged by an improper shutdown that occurred during a file-update operation. The only addition to the EXT filesystem was the [journal][26], which records in advance the changes that will be performed to the filesystem. The rest of the disk structure is the same as it was in EXT2. +[EXT3 文件系统][25] 具有克服 **fsck** 程序需要完全恢复在文件更新操作期间发生的不正确关机损坏的磁盘结构所需的大量时间的单一目标。EXT 文件系统的唯一新增是 [日志][26],它将提前记录将对文件系统执行的更改。 磁盘结构的其余部分与 EXT2 中的相同。 -Instead of writing data to the disk's data areas directly, as in previous versions, the journal in EXT3 writes file data, along with its metadata, to a specified area on the disk. Once the data is safely on the hard drive, it can be merged in or appended to the target file with almost zero chance of losing data. As this data is committed to the data area of the disk, the journal is updated so that the filesystem will remain in a consistent state in the event of a system failure before all the data in the journal is committed. On the next boot, the filesystem will be checked for inconsistencies, and data remaining in the journal will then be committed to the data areas of the disk to complete the updates to the target file. +作为一个先前的版本,除了直接写入数据到磁盘的数据区域外,EXT3 的日志在写入元数据时同时也写入文件数据到磁盘上的一个指定数据区域。一旦这些数据安全地到达硬盘,它就可以几乎零丢失率地被合并或者被追加到目标文件。当这些数据被提交到磁盘上的数据区域上,这些日志就会随即更新,这样在系统发生故障之前,文件系统将保持一致状态,才能提交日志中的所有数据。在下次启动时,将检查文件系统的不一致性,然后将日志中保留的数据提交到磁盘的数据区,以完成对目标文件的更新。 Journaling does reduce data-write performance, however there are three options available for the journal that allow the user to choose between performance and data integrity and safety. My personal preference is on the side of safety because my environments do not require heavy disk-write activity. @@ -244,9 +244,9 @@ Due to the low amount of fragmentation on most EXT filesystems, it is not necess If it becomes necessary to perform a complete defragmentation on an EXT filesystem, there is only one method that will work reliably. You must move all the files from the filesystem to be defragmented, ensuring that they are deleted after being safely copied to another location. If possible, you could then increase the size of the filesystem to help reduce future fragmentation. Then copy the files back onto the target filesystem. Even this does not guarantee that all the files will be completely defragmented. -### Conclusions +### 总结 -The EXT filesystems have been the default for many Linux distributions for more than 20 years. They offer stability, high capacity, reliability, and performance while requiring minimal maintenance. I have tried other filesystems but always return to EXT. Every place I have worked with Linux has used the EXT filesystems and found them suitable for all the mainstream loads used on them. Without a doubt, the EXT4 filesystem should be used for most Linux systems unless there is a compelling reason to use another filesystem. +EXT 文件系统在一些 Linux 发行版本上作为默认文件系统已经超过二十多年了。它们用最少的维护代价提供了稳定性、高可用性、可靠性和其他各种表现。我尝试过一些其它的文件系统但最终都还是回归到 EXT。每一个我在工作中使用到 Linux 的地方都使用到了 EXT 文件系统,同时发现了它们适用于任何主流的负载。毫无疑问,EXT4 文件系统应该被用于大部分的 Linux 文件系统上,除非我们有明显的使用其它文件系统的理由。 -------------------------------------------------------------------------------- From c25c4a1d4f6786cde4038fa33f46a475f91dd68e Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 17 Jun 2017 12:23:49 +0800 Subject: [PATCH 0455/1407] PRF&PUB:24 - The history of Android.md @alim0x --- .../24 - The history of Android.md | 56 ++++++++++--------- 1 file changed, 31 insertions(+), 25 deletions(-) rename {translated/talk => published}/The history of Android/24 - The history of Android.md (79%) diff --git a/translated/talk/The history of Android/24 - The history of Android.md b/published/The history of Android/24 - The history of Android.md similarity index 79% rename from translated/talk/The history of Android/24 - The history of Android.md rename to published/The history of Android/24 - The history of Android.md index 71d1736a12..12705513bc 100644 --- a/translated/talk/The history of Android/24 - The history of Android.md +++ b/published/The history of Android/24 - The history of Android.md @@ -1,44 +1,51 @@ -安卓编年史 +安卓编年史(23):Android 4.3,果冻豆——早早支持可穿戴设备 ================================================================================ + ![漂亮的新 Google Play Music 应用,从电子风格转向完美契合 Play 商店的风格。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/Goooogleplaymusic.jpg) -漂亮的新 Google Play Music 应用,从电子风格转向完美契合 Play 商店的风格。 -Ron Amadeo 供图 + +*漂亮的新 Google Play Music 应用,从电子风格转向完美契合 Play 商店的风格。 +[Ron Amadeo 供图]* 在 I/O 大会推出的另一个应用更新是 Google Music 应用。音乐应用经过了完全的重新设计,最终摆脱了蜂巢中引入的蓝底蓝色调的设计。Play Music 的设计和几个月前发布的 Play 商店一致,有着响应式的白色卡片布局。Music 同时还是最早采用新抽屉导航样式的主要应用之一。谷歌还随新应用发布了 Google Play Music All Access,每月 10 美元的包月音乐订阅服务。Google Music 现在拥有订阅计划,音乐购买,以及云端音乐存储空间。这个版本还引入了“Instant Mix”,谷歌会在云端给相似的歌曲计算出一份歌单。 ![一个展示对 Google Play Games 支持的游戏。上面是 Play 商店游戏特性描述,登陆游戏触发的权限对话框,Play Games 通知,以及成就界面。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/gooooogleplaygames.jpg) -一个展示对 Google Play Games 支持的游戏。上面是 Play 商店游戏特性描述,登陆游戏触发的权限对话框,Play Games 通知,以及成就界面。 -Ron Amadeo 供图 -谷歌还引入了“Google Play Games”,一个后端服务,开发者可以将其附加到游戏中。这项服务简单说就是安卓版的 Xbox Live 或苹果的 Game Center。开发者可以给游戏添加 Play Games 支持,这样就能通过使用谷歌的后端服务,更简单地集成成就,多人游戏,游戏匹配,用户账户以及云端存档到游戏中。 +*一个展示对 Google Play Games 支持的游戏。上面是 Play 商店游戏特性描述,登陆游戏触发的权限对话框,Play Games 通知,以及成就界面。 +[Ron Amadeo 供图]* + +谷歌还引入了 “Google Play Games”,一个后端服务,开发者可以将其附加到游戏中。这项服务简单说就是安卓版的 Xbox Live 或苹果的 Game Center。开发者可以给游戏添加 Play Games 支持,这样就能通过使用谷歌的后端服务,更简单地将成就、多人游戏、游戏配对、用户账户以及云端存档集成到游戏中。 Play Games 是谷歌在游戏方面推进的开始。就像单独的 GPS 设备,翻盖手机,以及 MP3 播放器,智能手机的生产者希望游戏设备能够变成智能手机的一个功能点。当你有部智能手机的时候你为什么还有买个任天堂 DS 或 PS Vita 呢?一个易于使用的多人游戏服务是这项计划的重要部分,我们仍能看到这个决定最后的成果。在今天,坊间都在传言谷歌和苹果有关于客厅游戏设备的计划。 ![Google Keep,谷歌自 Google Notebook 以来第一个笔记服务。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/goooglekeep.jpg) -Google Keep,谷歌自 Google Notebook 以来第一个笔记服务。 -Ron Amadeo 供图 + +*Google Keep,谷歌自 Google Notebook 以来第一个笔记服务。 +[Ron Amadeo 供图]* 毫无疑问一些产品为了赶上 Google I/O 大会的发布准时开发完成了,[但是三个半小时内的主题][1]已经够多了,一些产品在大会的发布上忽略了。Google I/O 大会的三天后一切都清楚了,谷歌带来了 Google Keep,一个用于安卓和在线的笔记应用。Keep 看起来很简单,就是一个用上了响应式 Google-Now 风格设计的笔记应用。用户可以改变卡片的尺寸,从多栏布局改为单列视图。笔记可以由文本,清单,自动转文本的语音或者图片组成。笔记卡片可以拖动并在主界面重新组织,你甚至可以给笔记换个颜色。 ![Gmail 4.5,换上了新的导航抽屉设计,去掉了几个按钮并将操作栏合并到了抽屉里。](http://cdn.arstechnica.net/wp-content/uploads/2014/05/gmail.png) -Gmail 4.5,换上了新的导航抽屉设计,去掉了几个按钮并将操作栏合并到了抽屉里。 -Ron Amadeo 供图 -在 I/O 大会之后,没有哪些应用不在谷歌的周期外更新里。2013 年 6 月,谷歌发布了新版设计的 Gmail。最显眼的变化就是一个月前 Google I/O 大会引入的新导航抽屉界面。最吸引眼球的变化是用上了 Google+ 资料图片来取代复选框。虽然复选框看起来被去掉了,它们其实还在那,点击邮件左边的图片就是了。 +*Gmail 4.5,换上了新的导航抽屉设计,去掉了几个按钮并将操作栏合并到了抽屉里。 +[Ron Amadeo 供图]* + +在 I/O 大会之后,没有哪些应用没出现在谷歌的周期外更新里。2013 年 6 月,谷歌发布了新版设计的 Gmail。最显眼的变化就是一个月前 Google I/O 大会引入的新导航抽屉界面。最吸引眼球的变化是用上了 Google+ 资料图片来取代复选框。虽然复选框看起来被去掉了,它们其实还在那,点击邮件左边的图片就是了。 ![新谷歌地图,换上了全白的 Google-Now 风格主题。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/newmaps11.png) -新谷歌地图,换上了全白的 Google-Now 风格主题。 -Ron Amadeo 供图 + +*新谷歌地图,换上了全白的 Google-Now 风格主题。 +[Ron Amadeo 供图]* 一个月后,谷歌在 Play 商店发布了全新的谷歌地图。这是谷歌地图自冰淇淋三明治以来第一个经过细致地重新设计的版本。新版本完全适配了 Google Now 白色卡片审美,还大大减少了屏幕上显示的元素。新版谷歌地图似乎设计时有意使地图总是显示在屏幕上,你很难找到除了设置页面之外还能完全覆盖地图显示的选项。 -这个版本的谷歌地图看起来活在它自己的小小设计世界中。白色的搜索栏“浮动”在地图之上,地图显示部分在它旁边和上面都有。这和传统的操作栏设计有所不同。一般在应用左上角的导航抽屉,在这里是在左下角。这里的主界面没有向上按钮,应用图标,也没有浮动按钮。 +这个版本的谷歌地图看起来活在它自己的小小设计世界中。白色的搜索栏“浮动”在地图之上,地图显示部分在它旁边和上面都有。这和传统的操作栏设计有所不同。一般在应用左上角的导航抽屉,在这里是在左下角。这里的主界面没有向上按钮、应用图标,也没有浮动按钮。 ![新谷歌地图轻量化了许多,在一屏内能够显示更多的信息。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/newmaps21.png) -新谷歌地图轻量化了许多,在一屏内能够显示更多的信息。 -Ron Amadeo 供图 -左边的图片显示的是点击了搜索栏后的效果(带键盘,这里关闭了)。过去谷歌在空搜索栏下面显示一个空页面,但在地图中,谷歌利用这些空间链接到新的“本地”页面。搜索结果页显示一般信息的结果,比如餐馆,加油站,以及景点。在结果页的底部是个列表,显示你的搜索历史和手动缓存部分地图的选项。 +*新谷歌地图轻量化了许多,在一屏内能够显示更多的信息。 +[Ron Amadeo 供图]* + +左边的图片显示的是点击了搜索栏后的效果(带键盘,这里关闭了)。过去谷歌在空搜索栏下面显示一个空页面,但在地图中,谷歌利用这些空间链接到新的“本地”页面。搜索结果页显示一般信息的结果,比如餐馆、加油站,以及景点。在结果页的底部是个列表,显示你的搜索历史和手动缓存部分地图的选项。 右侧图片显示的是地点页面。上面地图 7.0 的截图里显示的地图不是略缩图,它是完整的地图视图。在新版的谷歌地图中,地点作为卡片浮动显示在主地图之上,地图重新居中显示该地点。向上滑动可以让卡片覆盖地图,向下滑动可以显示带有底部一小条结果的完整地图。如果该地点是搜索结果列表中的一个,左右滑动可以在结果之间切换。 @@ -46,12 +53,13 @@ Ron Amadeo 供图 ### Android 4.3,果冻豆——早早支持可穿戴设备 ### -如果谷歌没有在安卓 4.3 和安卓 4.2 之间通过 Play 商店发布更新的话,安卓 4.3 会是个不可思议的更新。如果新版 Play 商店,Gmail,地图,书籍,音乐,Hangouts 环聊,以及 Play Games 打包作为新版安卓的一部分,它将会作为有史以来最大的发布受到欢呼。虽然谷歌没必要延后新功能的发布。有了 Play 服务框架,只剩很少的部分需要系统更新,2013 年 7 月底谷歌发布了看似无关紧要的“安卓 4.3”。 +如果谷歌没有在安卓 4.3 和安卓 4.2 之间通过 Play 商店发布更新的话,安卓 4.3 会是个不可思议的更新。如果新版 Play 商店、Gmail、地图、书籍、音乐、Hangouts 环聊,以及 Play Games 打包作为新版安卓的一部分,它将会作为有史以来最大的发布受到欢呼。虽然谷歌没必要延后新功能的发布。有了 Play 服务框架,只剩很少的部分需要系统更新,2013 年 7 月底谷歌发布了看似无关紧要的“安卓 4.3”。 ![安卓 4.3 通知访问权限界面的可穿戴设备选项。 ](http://cdn.arstechnica.net/wp-content/uploads/2014/03/2014-03-28-12.231.jpg) -安卓 4.3 通知访问权限界面的可穿戴设备选项。 -Ron Amadeo 供图 + +*安卓 4.3 通知访问权限界面的可穿戴设备选项。 +[Ron Amadeo 供图]* 谷歌也毫无疑问地认为 4.3 的重要性不高,将新版也叫做“果冻豆”(第三个叫果冻豆的版本了)。安卓 4.3 的新功能列表像是谷歌无法通过 Play 商店或谷歌 Play 服务更新的部分的细目清单,大部分包含了为开发者作出的底层架构改动。 @@ -65,15 +73,13 @@ Ron Amadeo 供图 ![Ron Amadeo](http://cdn.arstechnica.net/wp-content//uploads/authors/ron-amadeo-sq.jpg) -[Ron Amadeo][a] / Ron是Ars Technica的评论编缉,专注于安卓系统和谷歌产品。他总是在追寻新鲜事物,还喜欢拆解事物看看它们到底是怎么运作的。 - -[@RonAmadeo][t] +[Ron Amadeo][a] / Ron是Ars Technica的评论编缉,专注于安卓系统和谷歌产品。他总是在追寻新鲜事物,还喜欢拆解事物看看它们到底是怎么运作的。[@RonAmadeo][t] -------------------------------------------------------------------------------- -via: http://arstechnica.com/gadgets/2014/06/building-android-a-40000-word-history-of-googles-mobile-os/24/ +via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/24/ -译者:[alim0x](https://github.com/alim0x) 校对:[校对者ID](https://github.com/校对者ID) +译者:[alim0x](https://github.com/alim0x) 校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出 From 534419a4f9070a5531044ae2928257e199fee12c Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 17 Jun 2017 14:25:57 +0800 Subject: [PATCH 0456/1407] PRF&PUB:25 - The history of Android.md @alim0x --- .../25 - The history of Android.md | 42 ++++++++++--------- 1 file changed, 22 insertions(+), 20 deletions(-) rename {translated/talk => published}/The history of Android/25 - The history of Android.md (73%) diff --git a/translated/talk/The history of Android/25 - The history of Android.md b/published/The history of Android/25 - The history of Android.md similarity index 73% rename from translated/talk/The history of Android/25 - The history of Android.md rename to published/The history of Android/25 - The history of Android.md index 01b93c71a9..3acbda05dd 100644 --- a/translated/talk/The history of Android/25 - The history of Android.md +++ b/published/The history of Android/25 - The history of Android.md @@ -1,48 +1,52 @@ -安卓编年史 +安卓编年史(24):Android 4.4,奇巧——更完美,更少的内存占用 ================================================================================ ![LG 制造的 Nexus 5,奇巧(KitKat)的首发设备。 ](http://cdn.arstechnica.net/wp-content/uploads/2014/03/nexus56.jpg) -LG 制造的 Nexus 5,奇巧(KitKat)的首发设备。 -Android 4.4,奇巧——更完美;更少的内存占用 +*LG 制造的 Nexus 5,奇巧(KitKat)的首发设备。* + +### Android 4.4,奇巧——更完美,更少的内存占用 谷歌安卓 4.4 的发布确实很讨巧。谷歌和[雀巢公司合作][1],新版系统的代号是“奇巧(KitKat)”,并且它是在 2013 年 10 月 31 日发布的,也就是万圣节。雀巢公司推出了限量版带安卓机器人的奇巧巧克力,它的包装也帮助新版系统推广,消费者有机会赢取一台 Nexus 7。 -一部新的 Nexus 设备也随奇巧一同发布,就是 Nexus 5。新旗舰拥有迄今最大的显示屏:一块五英寸,1920x1080 分辨率的 LCD 显示屏。除了更大尺寸的屏幕,LG——Nexus 5 的制造商——还将 Nexus 5 的机器大小控制得和 Galaxy Nexus 或 Nexus 4 差不多。 +一部新的 Nexus 设备也随奇巧一同发布,就是 Nexus 5。新旗舰拥有迄今最大的显示屏:一块五英寸、1920x1080 分辨率的 LCD 显示屏。除了更大尺寸的屏幕,Nexus 5 的制造商 LG 还将 Nexus 5 的机器大小控制得和 Galaxy Nexus 或 Nexus 4 差不多。 Nexus 5 相对同时期的高端手机配置算是标准了,拥有 2.3Ghz 骁龙 800 处理器和 2GB 内存。手机再次在 Play 商店销售无锁版,相同配置的大多数手机价格都在 600 到 700 美元之间,但 Nexus 5 的售价仅为 350 美元。 -奇巧最重要的改进之一你并不能看到:显著减少的内存占用。对奇巧而言,谷歌齐心协力开始了降低系统和预装应用内存占用的努力,称作“Project Svelte”。经过了无数的优化工作和通过一个“低内存模式”(禁用图形开销大的特效),安卓现在可以在 340MB 内存下运行。低内存需求是件了不起的事,因为在发展中国家的设备——智能手机增长最快的市场——许多设备的内存仅有 512MB。冰淇淋三明治更高级的 UI 显著提高了对安卓设备的系统配置要求,这使得很多低端设备——甚至是新发布的低端设备——的安卓版本停留在姜饼。奇巧更低的配置需求意味着这些廉价设备能够跟上脚步。有了奇巧,谷歌希望完全消灭姜饼(写下本文时姜饼的市场占有率还在 20% 左右)。为了防止更低的系统需求还不够有效,甚至有报道称谷歌将[不再授权][2]谷歌应用给姜饼设备。 +奇巧最重要的改进之一你并不能看到:显著减少的内存占用。对奇巧而言,谷歌齐心协力开始了降低系统和预装应用内存占用的努力,称作“Project Svelte”。经过了无数的优化工作和通过一个“低内存模式”(禁用图形开销大的特效),安卓现在可以在 340MB 内存下运行。低内存需求是件了不起的事,因为在发展中国家的设备——智能手机增长最快的市场——许多设备的内存仅有 512MB。冰淇淋三明治更高级的 UI 显著提高了对安卓设备的系统配置要求,这使得很多低端设备——甚至是新发布的低端设备——的安卓版本停留在姜饼。奇巧更低的配置需求意味着这些廉价设备能够跟上脚步。有了奇巧,谷歌希望完全消灭姜饼(写下本文时姜饼的市场占有率还在 20% 左右)。只是降低系统需求还不够,甚至有报道称谷歌将[不再授权][2]谷歌应用给姜饼设备。 除了给低端设备带来更现代版本的系统,Project Svelte 更低的内存需求同样对可穿戴设备也是个好消息。Google Glass [宣布][3]它会切换到这个更精简的系统,[Android Wear][4] 同样也运行在奇巧之上。安卓 4.4 带来的更低的内存需求以及 4.3 中的通知消息 API 和低功耗蓝牙支持给了可穿戴计算漂亮的支持。 奇巧的亮点还有无数精心打磨过的核心系统界面,它们无法通过 Play 商店升级。系统界面,拨号盘,时钟还有设置都能看到升级。 ![奇巧在 Google Now 启动器下的透明系统栏。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/1homescreenz.png) -奇巧在 Google Now 启动器下的透明系统栏。 -Ron Amadeo 供图 + +*奇巧在 Google Now 启动器下的透明系统栏。 +[Ron Amadeo 供图]* 奇巧不仅去掉了讨人厌的锁屏左右屏的线框——它还默认完全禁用了锁屏小部件!谷歌明显感觉到了多屏锁屏和锁屏主屏对新用户来说有点复杂,所以锁屏小部件现在需要从设置里启用。锁屏和时钟里不平衡的时间字体换成了一个对称的字重,看起来好看多了。 在奇巧中,应用拥有将系统栏和状态栏透明的能力,显著地改变了系统的外观。系统栏和状态栏现在混合到壁纸和启用透明栏的应用中去了。这些栏还能通过新功能“沉浸”模式完全被应用隐藏。 -奇巧是“电子”科幻风格棺材上的最后一颗钉子,几乎完全移除了系统的蓝色痕迹。状态栏图标由蓝色变成中性的白色。主屏的状态栏和系统栏并不是完全透明的;它们有深色的渐变,这样在使用浅色壁纸的时候白色的图标还能轻易地识别出来。 +奇巧是“电子”科幻风格的棺材上的最后一颗钉子,几乎完全移除了系统的蓝色痕迹。状态栏图标由蓝色变成中性的白色。主屏的状态栏和系统栏并不是完全透明的;它们有深色的渐变,这样在使用浅色壁纸的时候白色的图标还能轻易地识别出来。 ![Google Now 和文件夹的调整。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/nowfolders.png) -Google Now 和文件夹的调整。 -Ron Amadeo 供图 -在 Nexus 5 上随奇巧到来的主屏实际上由 Nexus 5 独占了几个月,但现在任何 Nexus 设备都能拥有它了。新的主屏叫做“Google Now Launcher”,它实际上是[谷歌搜索应用][5]。是的,谷歌搜索从一个简单的搜索框成长到了整个主屏幕,并且在奇巧中,它涉及了壁纸,图标,应用抽屉,小部件,主屏设置,Google Now,当然,还有搜索框。由于搜索现在运行在整个主屏幕,任何时候只要打开了主屏并且屏幕是点亮的,就可以通过说“OK Google”激活语音命令。在搜索栏有引导用户说出“OK Google”的文本,在几次使用后这个介绍会隐去。 +*Google Now 和文件夹的调整。 +[Ron Amadeo 供图]* -Google Now 的集成度现在更高了。除了通常的系统栏上滑激活,Google Now 还占据了最左侧的主屏。新版还引入了一些设计上的调整。谷歌的 logo 移到了搜索栏内,整个顶部区域更紧凑了。显示更多卡片的设计被去除了,新添加的一组底部按钮指向备忘录,自定义选项,以及一个更多操作按钮,里面由设置,反馈,以及帮助。因为 Google Now 是主屏幕的一部分,所以它也拥有透明 的系统栏和状态栏。 +在 Nexus 5 上随奇巧到来的主屏实际上由 Nexus 5 独占了几个月,但现在任何 Nexus 设备都能拥有它了。新的主屏叫做“Google Now Launcher”,它实际上是[谷歌搜索应用][5]。是的,谷歌搜索从一个简单的搜索框成长到了整个主屏幕,并且在奇巧中,它涉及了壁纸、图标、应用抽屉、小部件、主屏设置、Google Now,当然,还有搜索框。由于搜索现在运行在整个主屏幕,任何时候只要打开了主屏并且屏幕是点亮的,就可以通过说“OK Google”激活语音命令。在搜索栏有引导用户说出“OK Google”的文本,在几次使用后这个介绍会隐去。 + +Google Now 的集成度现在更高了。除了通常的系统栏上滑激活,Google Now 还占据了最左侧的主屏。新版还引入了一些设计上的调整。谷歌的 logo 移到了搜索栏内,整个顶部区域更紧凑了。显示更多卡片的设计被去除了,新添加的一组底部按钮指向备忘录、自定义选项,以及一个更多操作按钮,里面有设置、反馈,以及帮助。因为 Google Now 是主屏幕的一部分,所以它也拥有透明 的系统栏和状态栏。 透明以及让系统的特定部分“更明亮”是奇巧的设计主题。黑色调通过透明化从状态栏和系统栏移除了,文件夹的黑色背景也换为了白色。 ![新的,更加干净的应用列表,以及完整的应用阵容。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/apps.png) -新的,更加清爽的应用列表,以及完整的应用阵容。 -Ron Amadeo 供图 -奇巧的图标阵容相对 4.3 有显著的变化。更戏剧化地说,这是一场大屠杀,谷歌从 4.3 的配置中移除了七个图标。谷歌 Hangouts 现在能够处理短信,所以信息应用被去除了。Hangouts 同时还接手了 Google Messenger 的职责,所以它的图标也不见了。Google Currents 不再作为默认应用预装,因为它不久后就会被终结——和它一起的还有 Google Play Magazines(Play 杂志),取代它们的是 Google Play Newsstand(Play 报刊亭)。谷歌地图被打回一个图标,这意味着本地和导航的快捷方式被去掉了。难以理解的 Movie Studio 也被去除了——谷歌肯定已经意识到了没人想在手机上剪辑电影。有了主屏的“OK Google”关键词检测,语音搜索图标的呈现就显得多余了,因而将其移除。令人沮丧的是,没人用的新闻和天气应用还在。 +*新的,更加清爽的应用列表,以及完整的应用阵容。 +[Ron Amadeo 供图]* + +奇巧的图标阵容相对 4.3 有显著的变化。更戏剧化地说,这是一场大屠杀,谷歌从 4.3 的配置中移除了七个图标。谷歌 Hangouts 现在能够处理短信,所以“信息”应用被去除了。Hangouts 同时还接手了 Google Messenger 的职责,所以它的图标也不见了。Google Currents 不再作为默认应用预装,因为它不久后就会被终结——和它一起的还有 Google Play Magazines(Play 杂志),取代它们的是 Google Play Newsstand(Play 报刊亭)。谷歌地图被打回一个图标,这意味着本地和导航的快捷方式被去掉了。难以理解的 Movie Studio 也被去除了——谷歌肯定已经意识到了没人想在手机上剪辑电影。有了主屏的“OK Google”关键词检测,语音搜索图标的呈现就显得多余了,因而将其移除。令人沮丧的是,没人用的新闻和天气应用还在。 有个新应用“Photos(相片)”——实际上是 Google+ 的一部分——接手了图片管理的工作。在 Nexus 5 上,相册和 Google+ 相片十分相似,但在 Google Play 版设备上更新版的奇巧中,相册已经完全被 Google+ 相片所取代。Play Games 是谷歌的后端多用户游戏服务——谷歌版的 Xbox Live 或苹果的 Game Center。Google Drive,已经在 Play 商店存在数年的应用,终于成为了内置应用。谷歌 2012 年 6 月收购的 Quickoffice 也进入了内置应用阵容。Drive 可以打开 Google 文档,Quickoffice 可以打开微软 Office 文档。如果细细追究起来,在大多数奇巧中包含了两个文档编辑应用和两个相片编辑应用。 @@ -50,15 +54,13 @@ Ron Amadeo 供图 ![Ron Amadeo](http://cdn.arstechnica.net/wp-content//uploads/authors/ron-amadeo-sq.jpg) -[Ron Amadeo][a] / Ron是Ars Technica的评论编缉,专注于安卓系统和谷歌产品。他总是在追寻新鲜事物,还喜欢拆解事物看看它们到底是怎么运作的。 - -[@RonAmadeo][t] +[Ron Amadeo][a] / Ron是Ars Technica的评论编缉,专注于安卓系统和谷歌产品。他总是在追寻新鲜事物,还喜欢拆解事物看看它们到底是怎么运作的。[@RonAmadeo][t] -------------------------------------------------------------------------------- -via: http://arstechnica.com/gadgets/2014/06/building-android-a-40000-word-history-of-googles-mobile-os/25/ +via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/25/ -译者:[alim0x](https://github.com/alim0x) 校对:[校对者ID](https://github.com/校对者ID) +译者:[alim0x](https://github.com/alim0x) 校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出 From 65f8a4df083a6dfc3e18d03e3c9f13dc2c51c5c4 Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 17 Jun 2017 14:56:50 +0800 Subject: [PATCH 0457/1407] PRF:20170515 How I got started with bash scripting.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @xllc 翻译的很好! --- ...5 How I got started with bash scripting.md | 42 +++++++++---------- 1 file changed, 20 insertions(+), 22 deletions(-) diff --git a/translated/talk/20170515 How I got started with bash scripting.md b/translated/talk/20170515 How I got started with bash scripting.md index ceffb642a2..2a87262852 100644 --- a/translated/talk/20170515 How I got started with bash scripting.md +++ b/translated/talk/20170515 How I got started with bash scripting.md @@ -1,18 +1,16 @@ -我是如何开始编写 bash 脚本的? +我是如何开始踏上 bash 脚本编程之路的? ============================================================ -### 通过一些简单的 Google 搜索,即使编程入门者也可以尝试编写代码实现将以往枯燥和冗长的任务自动化。 - - +> 通过一些简单的 Google 搜索,即使是编程入门者也可以尝试编写代码将以往枯燥和冗长的任务自动化。 ![How Google helped me learn bash scripting](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/computer_happy_sad_developer_programming.png?itok=5E3k_t_r "How Google helped me learn bash scripting") ->图片来自 : opensource.com + 我前几天写了一个脚本。对于一些人来说,这句话听起来没什么了不起的。而对于另一些人来说,这句话意义重大。要知道,我不是一个程序员,而是一个作家。 ### 我需要解决什么? -我的问题相当简单:我需要将工程文件进行分类。这些文件可以从一个网站 URL 以 .zip 的格式下载。当我正手工将它们拷贝到我的电脑桌面,并移动到一个已按照我文件分类的需要进行了结构化的目录时,一位作家同事给我提了建议:_“你为什么不就写个脚本来完成这件事呢?”_ +我的问题相当简单:我需要将工程文件进行分类。这些文件可以从一个网站 URL 以 .zip 的格式下载。当我正手工将它们拷贝到我的电脑桌面,并移动到一个已按照我文件分类的需要进行了结构化的目录时,一位作家同事给我提了建议:_“不就是写个脚本的事吗?”_ 我心想:_“就写个脚本?”_——说得好像这是世界上最容易做的事情一样。 @@ -22,13 +20,13 @@ **Linux 上使用的是什么脚本编程语言?** -这是我第一个 Google 搜索的准则。也许很多人心里会想:“她太笨了!”是的,我很笨。不过,这的确使我走上了一条解决问题的道路。最常见的搜索结果是 Bash 。嗯,我见过 Bash 。呃,我要分类的文件中有一个就有 Bash 在里面,那无处不在的 **#!/bin/bash** 。我重新看了下那个文件,我知道它的用途,因为我需要将它分类。 +这是我第一个 Google 搜索的准则。也许很多人心里会想:“她太笨了!”是的,我很笨。不过,这的确使我走上了一条解决问题的道路。最常见的搜索结果是 Bash 。嗯,我听说过 Bash 。呃,我要分类的文件中有一个里面就有 Bash,那无处不在的 `#!/bin/bash` 。我重新看了下那个文件,我知道它的用途,因为我需要将它分类。 -这引导我进行了下一个 Google 搜索 +这引导我进行了下一个 Google 搜索。 **如何从一个 URL 下载 zip 文件?** -那确实是我的基本任务。我有一个附带着 .zip 文件的 URL ,它包含有所有我需要分类的文件,所以我寻求万能的 Google 的帮助。搜索到的精华内容和其它一些结果引导我使用 Curl 。但最重要的是:我不仅找到了 Curl ,其中一条置顶的搜索结果还展示了一个使用 Curl 去下载并解压 .zip 文件的 Bash 脚本。这超出了我本来想寻求的答案,但那也使我意识到在 Google 搜索具体的请求可以得到我写这个脚本需要的信息。所以,在收获的推动下,我写了最简单的脚本: +那确实是我的基本任务。我有一个带有 .zip 文件的 URL ,它包含有所有我需要分类的文件,所以我寻求万能的 Google 的帮助。搜索到的精华内容和其它一些结果引导我使用 Curl 。但最重要的是:我不仅找到了 Curl ,其中一条置顶的搜索结果还展示了一个使用 Curl 去下载并解压 .zip 文件的 Bash 脚本。这超出了我本来想寻求的答案,但那也使我意识到在 Google 搜索具体的请求可以得到我写这个脚本需要的信息。所以,在这个收获的推动下,我写了最简单的脚本: ``` #!/bin/sh @@ -40,7 +38,8 @@ curl http://rather.long.url | tar -xz -C my_directory --strip-components=1 **参数如何传递给 Bash 脚本?** -我需要以不同的 URL 和不同的最终目录来运行此脚本。 Google 向我展示了如何使用 **$1**、**$2** 等等来替换我在命令行中运行脚本时输入的内容。比如: +我需要以不同的 URL 和不同的最终目录来运行此脚本。 Google 向我展示了如何使用 `$1`、`$2` 等等来替换我在命令行中运行脚本时输入的内容。比如: + ``` bash myscript.sh http://rather.long.url my_directory ``` @@ -49,8 +48,7 @@ bash myscript.sh http://rather.long.url my_directory 然后我发现还有一个问题:我很健忘,并且我知道我几个月才运行一次这个脚本。这留给我两个疑问: -* 我要如何记得运行脚本时输入什么 ( URL 先?还是目录先?)? - +* 我要如何记得运行脚本时输入什么(URL 先,还是目录先)? * 如果我被货车撞了,其它作家如何知道该怎样运行我的脚本? 我需要一个使用说明 —— 如果我使用不正确,则脚本会提示。比如: @@ -61,9 +59,9 @@ usage: bash yaml-fetch.sh <'snapshot_url'> 否则,则直接运行脚本。我的下一个搜索是: -**如何在 Bash 脚本里使用“if/then/else”?** +**如何在 Bash 脚本里使用 “if/then/else”?** -幸运的是,我已经知道编程中 **if/then/else** 的存在。我只要找出如何使用它的方法。在这个过程中,我也学到了如何在 Bash 脚本里使用 **echo** 打印。我的最终成果如下: +幸运的是,我已经知道编程中 `if/then/else` 的存在。我只要找出如何使用它的方法。在这个过程中,我也学到了如何在 Bash 脚本里使用 `echo` 打印。我的最终成果如下: ``` #!/bin/sh @@ -76,7 +74,7 @@ if [ $# -eq 0 ]; echo "usage: bash yaml-fetch.sh <'snapshot_url'> ". else -     # 如果目录不存在则创建它 +# 如果目录不存在则创建它 echo 'create directory' mkdir $DIRECTORY @@ -88,27 +86,27 @@ if [ $# -eq 0 ]; fi ``` -### Google 和脚本编程如何震撼我的世界? +### Google 和脚本编程如何颠覆我的世界? -好吧,这稍微有点夸大,不过现在是 21 世纪,学习新东西(特别是稍微简单的东西)比以前简单多了。我所学到的(除了如何写一个简短的、自动分类的 Bash 脚本)是如果我有疑问,那么有很大可能性是其它人在之前也有过相同的疑问。当我困惑的时候,我可以问下一个问题,再下一个问题。最后,我不仅拥有了脚本,还拥有了坚持和习惯于简化其它任务的新技能,这是我之前所没有的。 +好吧,这稍微有点夸大,不过现在是 21 世纪,学习新东西(特别是稍微简单的东西)比以前简单多了。我所学到的(除了如何写一个简短的、自动分类的 Bash 脚本之外)是如果我有疑问,那么有很大可能性是其它人在之前也有过相同的疑问。当我困惑时,我可以问下一个问题,再下一个问题。最后,我不仅拥有了脚本,还拥有了可以一直拥有并可以简化其它任务的新技能,这是我之前所没有的。 -别止步于第一个脚本(或者编程的第一步)。这是一个无异于其它的技能,丰富的信息可以在这一路上帮助你。你无需阅读大量的书或参加一个月的课程。你可以像婴儿学步那样简单地开始写脚本,然后掌握技能并建立自信。人们总有写成千上万行代码,包含分支、合并、修复错误的程序的需要。 +别止步于第一个脚本(或者编程的第一步)。这是一个技能,和其它的技能并无不同,有大量的信息可以在这一路上帮助你。你无需阅读大量的书或参加一个月的课程。你可以像婴儿学步那样简单地开始写脚本,然后掌握技能并建立自信。人们总有写成千上万行代码的需求,并对它进行分支、合并、修复错误。但是,通过简单的脚本或其它方式来自动化、简单化任务的需求也一样强烈。这样的一个小脚本和小小的自信就能够让你启程脚本编程之路。 -但是,通过简单的脚本或其它方式来自动化、简单化任务的需求也一样强烈。这就是一个小脚本和小自信能够让你启程。 +(题图: opensource.com) -------------------------------------------------------------------------------- 作者简介: -桑德拉麦肯:桑德拉麦肯是一位 Linux 和开源技术的倡导者。她是一位软件开发者、学习资源内容架构师、内容创作者。桑德拉目前是位于韦斯特福德马萨诸塞州的红帽公司的内容创作者,专注于 OpenStack 和 NFV 技术。 +Sandra McCann 是一位 Linux 和开源技术的倡导者。她是一位软件开发者、学习资源内容架构师、内容创作者。Sandra McCann 目前是位于韦斯特福德马萨诸塞州的红帽公司的内容创作者,专注于 OpenStack 和 NFV 技术。 ---- via: https://opensource.com/article/17/5/how-i-learned-bash-scripting -作者:[ Sandra McCann ][a] +作者:[Sandra McCann][a] 译者:[xllc](https://github.com/xllc) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 5131f9ff0eaa309cb471f84c69dcad749f3c1fae Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 17 Jun 2017 14:57:02 +0800 Subject: [PATCH 0458/1407] PUB:20170515 How I got started with bash scripting.md @xllc --- .../20170515 How I got started with bash scripting.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/talk => published}/20170515 How I got started with bash scripting.md (100%) diff --git a/translated/talk/20170515 How I got started with bash scripting.md b/published/20170515 How I got started with bash scripting.md similarity index 100% rename from translated/talk/20170515 How I got started with bash scripting.md rename to published/20170515 How I got started with bash scripting.md From f375d33bc5947581fe4aa57d9c122f038fe74f18 Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 17 Jun 2017 19:23:08 +0800 Subject: [PATCH 0459/1407] PRF&PUB:20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md @ch-cn --- ...Writing Effective Bash Scripts in Linux.md | 86 ++++++++++--------- 1 file changed, 45 insertions(+), 41 deletions(-) rename {translated/tech => published}/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md (64%) diff --git a/translated/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md b/published/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md similarity index 64% rename from translated/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md rename to published/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md index efca8c5e31..e1d21a520e 100644 --- a/translated/tech/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md +++ b/published/20170519 10 Useful Tips for Writing Effective Bash Scripts in Linux.md @@ -1,66 +1,71 @@ -Linux 中编写有效的 Bash 脚本的 10 个有用技巧 +Linux 中高效编写 Bash 脚本的 10 个技巧 ============================================================ [Shell 脚本编程][4] 是你在 Linux 下学习或练习编程的最简单的方式。尤其对 [系统管理员要处理着自动化任务][5],且要开发新的简单的实用程序或工具等(这里只是仅举几例)更是必备技能。 本文中,我们将分享 10 个写出高效可靠的 bash 脚本的实用技巧,它们包括: -### 1\. 脚本中常用注释 +### 1、 脚本中多写注释 -这是不仅可应用于 shell 脚本程序中也可用在其他所有类型的编程中的一种推荐做法。在脚本中作注释能帮你或别人翻阅你的脚本了解脚本的不同部分所做的工作。 +这是不仅可应用于 shell 脚本程序中,也可用在其他所有类型的编程中的一种推荐做法。在脚本中作注释能帮你或别人翻阅你的脚本时了解脚本的不同部分所做的工作。 对于刚入门的人来说,注释用 `#` 号来定义。 ``` -#TecMint 是浏览各类 Linux 文章的最佳站点 +# TecMint 是浏览各类 Linux 文章的最佳站点 ``` -### 2\. 当运行失败时使脚本退出 +### 2、 当运行失败时使脚本退出 有时即使某些命令运行失败,bash 可能继续去执行脚本,这样就影响到脚本的其余部分(会最终导致逻辑错误)。用下面的行的方式在遇到命令失败时来退出脚本执行: ``` -#如果命令运行失败让脚本退出执行 +# 如果命令运行失败让脚本退出执行 set -o errexit -或 +# 或 set -e ``` -### 3\. 当 Bash 用未声明变量时使脚本退出 +### 3、 当 Bash 用未声明变量时使脚本退出 -Bash 也会尝试用会引起逻辑错误的未声明的脚本。因此用下面行的方式去通知 bash 当它尝试去用一个未声明变量时就退出脚本执行: +Bash 也可能会使用能导致起逻辑错误的未声明的变量。因此用下面行的方式去通知 bash 当它尝试去用一个未声明变量时就退出脚本执行: ``` -#若有用未设置的变量即让脚本退出执行 +# 若有用未设置的变量即让脚本退出执行 set -o nounset -或 +# 或 set -u ``` -### 4\. 使用双引号来引用变量 +### 4、 使用双引号来引用变量 -当引用时(使用一个变量的值)用双引号有助于防止单词分割开(由于空白)和不必要的匹配(识别和扩展通配符) +当引用时(使用一个变量的值)用双引号有助于防止由于空格导致单词分割开和由于识别和扩展了通配符而导致的不必要匹配。 看看下面的例子: ``` #!/bin/bash -#若命令失败让脚本退出 +# 若命令失败让脚本退出 set -o errexit -#若未设置的变量被使用让脚本退出 +# 若未设置的变量被使用让脚本退出 set -o nounset echo "Names without double quotes" echo + names="Tecmint FOSSMint Linusay" + for name in $names; do -echo "$name" + echo "$name" done + echo echo "Names with double quotes" echo + for name in "$names"; do -echo "$name" + echo "$name" done + exit 0 ``` @@ -69,11 +74,12 @@ exit 0 ``` $ ./names.sh ``` - [![Use Double Quotes in Scripts](https://www.tecmint.com/wp-content/uploads/2017/05/Use-Double-Quotes-in-Scripts.png)][6] -在脚本中用双引号 +[![Use Double Quotes in Scripts](https://www.tecmint.com/wp-content/uploads/2017/05/Use-Double-Quotes-in-Scripts.png)][6] -### 5\. 在脚本中使用函数 +*在脚本中用双引号* + +### 5、 在脚本中使用函数 除了非常小的脚本(只有几行代码),总是记得用函数来使代码模块化且使得脚本更可读和可重用。 @@ -81,23 +87,23 @@ $ ./names.sh ``` function check_root(){ -command1; -command2; + command1; + command2; } -或 +# 或 check_root(){ -command1; -command2; + command1; + command2; } ``` -写成单行代码,每个命令后要用终止符号: +写成单行代码时,每个命令后要用终止符号: ``` check_root(){ command1; command2; } ``` -### 6\. 字符串比较时用 = 替换 == +### 6、 字符串比较时用 `=` 而不是 `==` 注意 `==` 是 `=` 的同义词,因此仅用个单 `=` 来做字符串比较,例如: @@ -107,9 +113,9 @@ value2=”fossmint.com” if [ "$value1" = "$value2" ] ``` -### 7\. 用 $(command) 替换老旧的 ‘command’ 来做代用 +### 7、 用 `$(command)` 而不是老旧的 \`command` 来做代换 -[Command substitution(命令代换)][7] 是用这个命令的输出结果取代命令本身。用 `$(command)` 而不是引号 ``command`` 来做命令代换。 +[命令代换][7] 是用这个命令的输出结果取代命令本身。用 `$(command)` 而不是引号 \`command` 来做命令代换。 这种做法也是 [shellcheck tool][8] (可针对 shell 脚本显示警告和建议)所建议的。例如: @@ -118,7 +124,7 @@ user=`echo “$UID”` user=$(echo “$UID”) ``` -### 8\. 用 Read-only 来声明静态变量 +### 8、 用 `readonly` 来声明静态变量 静态变量不会改变;它的值一旦在脚本中定义后不能被修改: @@ -127,25 +133,23 @@ readonly passwd_file=”/etc/passwd” readonly group_file=”/etc/group” ``` -### 9\. 环境变量用大写字母命名且自定义变量用小写 +### 9、 环境变量用大写字母命名,而自定义变量用小写 所有的 bash 环境变量用大写字母去命名,因此用小写字母来命名你的自定义变量以避免变量名冲突: ``` -#定义自定义变量用小写且环境变量用大写 +# 定义自定义变量用小写,而环境变量用大写 nikto_file=”$HOME/Downloads/nikto-master/program/nikto.pl” perl “$nikto_file” -h “$1” ``` -### 10\. 总是对长脚本进行调试 +### 10、 总是对长脚本进行调试 如果你在写有数千行代码的 bash 脚本,排错可能变成噩梦。为了在脚本执行前易于修正一些错误,要进行一些调试。通过阅读下面给出的指南来掌握此技巧: 1. [如何在 Linux 中启用 Shell 脚本调试模式][1] - 2. [如何在 Shell 脚本中执行语法检查调试模式][2] - -3. [如何在 Shell 脚本中用 Shell Tracing 来跟踪命令的执行情况][3] +3. [如何在 Shell 脚本中跟踪调试命令的执行][3] 本文到这就结束了,你是否有一些其他更好的 bash 脚本编程经验想要分享?若是的话,在下面评论框分享出来吧。 @@ -160,16 +164,16 @@ Aaron Kili 是一个 Linux 和 F.O.S.S(Free and Open-Source Software,自由 via: https://www.tecmint.com/useful-tips-for-writing-bash-scripts-in-linux/ -作者:[ Aaron Kili][a] +作者:[Aaron Kili][a] 译者:[ch-cn](https://github.com/ch-cn) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 [a]:https://www.tecmint.com/author/aaronkili/ -[1]:https://www.tecmint.com/enable-shell-debug-mode-linux/ -[2]:https://www.tecmint.com/check-syntax-in-shell-script/ -[3]:https://www.tecmint.com/trace-shell-script-execution-in-linux/ +[1]:https://linux.cn/article-8028-1.html +[2]:https://linux.cn/article-8045-1.html +[3]:https://linux.cn/article-8120-1.html [4]:https://www.tecmint.com/category/bash-shell/ [5]:https://www.tecmint.com/using-shell-script-to-automate-linux-system-maintenance-tasks/ [6]:https://www.tecmint.com/wp-content/uploads/2017/05/Use-Double-Quotes-in-Scripts.png From 6a036d4e093f2145515cf3c78317fdc0f162a0be Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 18 Jun 2017 07:08:53 +0800 Subject: [PATCH 0460/1407] PRF:20170113 Tips for non-native English speakers working on open source projects.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @zhousiyu325 翻译的很好! --- ...peakers working on open source projects.md | 45 ++++++++++--------- 1 file changed, 24 insertions(+), 21 deletions(-) diff --git a/translated/talk/20170113 Tips for non-native English speakers working on open source projects.md b/translated/talk/20170113 Tips for non-native English speakers working on open source projects.md index 60fe9c939e..137e94c839 100644 --- a/translated/talk/20170113 Tips for non-native English speakers working on open source projects.md +++ b/translated/talk/20170113 Tips for non-native English speakers working on open source projects.md @@ -1,13 +1,12 @@ - -给英语非母语的人从事开源项目的若干建议 +给非英语母语的人从事开源项目的若干建议 ==================================================== - ![Tips for non-native English speakers working on open source projects](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/world_hands_diversity.png?itok=LMT5xbxJ "Tips for non-native English speakers working on open source projects") + +![Tips for non-native English speakers working on open source projects](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/world_hands_diversity.png?itok=LMT5xbxJ "Tips for non-native English speakers working on open source projects") - 图片来源: opensource.com -大多数的开源项目的主要语言都是英语,但是开源项目的用户和贡献者却遍布全球。英语非母语的人在参与这个生态系统时会面临许多沟通和文化上的挑战。 +大多数的开源项目的主要语言都是英语,但是开源项目的用户和贡献者却遍布全球。非英语母语的人在参与这个生态系统时会面临许多沟通和文化上的挑战。 -在这篇文章中,作为不以英语为母语而且是 OpenStack 的贡献者的我们将会分享一些挑战——如何去克服它们,还有一些好的方案,它们能够减轻不以英语为母语且刚开始学习的人的焦虑。我们的总部在日本、巴西和中国,每天都会与世界各地的大型 OpenStack 社区合作。 +在这篇文章中,作为不以英语为母语的 OpenStack 的贡献者的我们将会分享一些所面临挑战——如何去克服它们,还有一些好的方案,它们能够减轻不以英语为母语且刚开始从事的人的焦虑。我们的总部在日本、巴西和中国,每天都会与世界各地的大型 OpenStack 社区合作。 OpenStack 的官方语言是英语,这意味着我们是作为非英语为母语的人士来进行交流。 @@ -15,41 +14,41 @@ OpenStack 的官方语言是英语,这意味着我们是作为非英语为母 非英语为母语的人士在开源社区工作时会面临具体沟通挑战:它们与有限的语言技能和文化差异有关。 -### 语言技能 +#### 语言技能 让我们来关注在阅读、写作、听力和口语背后的具体语言技能。 -阅读:这是最简单也是最重要的技能。最简单是因为:如果你不明白写了什么,你有机会再次阅读它,或者需要多次阅读。如果你遇到了一个不常见的短语、表达式或者缩写,你可以使用一个词典或者翻译器。在另一方面,它是最重要的技能是因为:对大多数开源项目而言,主要的交流方式都是邮件列表和 IRC。 +**阅读**:这是最简单也是最重要的技能。最简单是因为:如果你不明白写了什么,你有机会再次阅读它,或者需要的话可以多次阅读。如果你遇到了一个不常见的短语、表达式或者缩写,你可以使用一个词典或者翻译器。在另一方面,它是最重要的技能是因为:对大多数开源项目而言,主要的交流方式都是邮件列表和 IRC。 -写作:英语语法是一个问题,尤其是对句子结构不同的语言。这可能会在用电子邮件进行通信和通过 IRC 频道进行通信时产生问题。对一些人来说,写出又长又漂亮的句子比较困难,而对简单句子的依赖是普遍的,因为这些很容易写和表达理解。 +**写作**:英语语法是一个问题,尤其是对句子结构不同的语言而言。这可能会在用电子邮件进行通信和通过 IRC 频道进行通信时产生问题。对一些人来说,写出又长又漂亮的句子比较困难,而普遍依赖于简单句子,这是因为这些易于书写和理解。 -听力:这对非英语为母语的人来说比阅读和写作更加困难。通常,英语为母语的人之间的对话是在非常快的,这就使得那些仍然在学习的人很难理解他们的讨论,同时也限制了他们参与到讨论当中。此外,试图理解一个遍布全球的社区的各种口音也增加了复杂性。有意思的是,美国人的发音往往比其他的容易理解。 +**听力**:这对非英语为母语的人来说比阅读和写作更加困难。通常,英语为母语的人之间的对话在非常快的,这就使得那些仍然处于刚从事阶段的人很难理解他们的讨论,同时也限制了他们参与到讨论当中。此外,试图理解一个遍布全球的社区的各种口音也增加了复杂性。有意思的是,美国人的发音往往比其他的容易理解。 -口语:口语比听力更加的困难,因为参与者的词汇量可能会比较有限。而且,英语的音素和语法通常与那些母语不是英语的人的母语相差很大,这就使得互动更加的难以理解。 +**口语**:口语比听力更加的困难,因为参与者的词汇量可能会比较有限。而且,英语的音素和语法通常与那些母语不是英语的人的母语相差很大,这就使得互动更加的难以理解。 -### 文化差异 +#### 文化差异 在开源社区与其他人交流时,每种文化都有它自己不同的规范。例如,日本人通常不会明确的说好的或者不,他们认为这是尊重别人的一种方式,可以避免彼此间的争论。这通常与其他的文化大不一样,可能会对所表达的内容造成误解。 -在中国文化中,人们倾向于只是说好的,代替说不或者试图商讨。在一个像 OpenStack 这样的分布于全球的社区里,这通常会导致在表达意见时缺乏自信。另外,中国人喜欢首先列出事实,然后在后面给出结论。而这会对来自其他文化中的人造成困惑,因为这不是他们所期望的。 +在中国文化中,人们倾向于只是说好的,而不是说不,或者试图商讨。在一个像 OpenStack 这样的分布于全球的社区里,这通常会导致在表达意见时缺乏自信。另外,中国人喜欢首先列出事实,然后在后面给出结论,而这会对来自其他文化中的人造成困惑,因为这不是他们所期望的。 -例如,巴西人可能会认为讨论是以类似的方式推动的;然而,其他文化反应会很直接和简短,这听起来可能会有点粗鲁。 +例如,巴西人可能会认为讨论是以类似的方式进行的;然而,其他文化的反应会很直接和简短,这听起来可能会有点粗鲁。 ### 克服障碍 语言技能方面的挑战要比文化差异方面的挑战容易克服。文化差异需要被受到尊重,然而英语技能却总是可以被改善的。 -为了刷新你的语言技能,你应该尽可能多地与语言接触。不要想你的局限,只管尽自己所能,你终将会得到改善。 +为了刷新你的语言技能,你应该尽可能多地接触该语言。不要担心你的局限,只管尽自己所能,你终将会得到改善。 尽可能多的阅读,因为这有助于你积累词汇。通过日常的聊天和邮件列表进行交流也很有帮助。一些工具,如实时字典和翻译器,对这些平台非常有用。 与别人或者你自己交谈可以帮助你更自如地频繁地说话。进行一对一的对话来表达你的想法比在更大的群体中讨论更容易。 -### 准新手 +### 新手的融入 来自新手和母语者的一些举措可能会对学习过程产生积极的影响。 -### 新手 +#### 新手 说出和写下你的意见,并且提出你的问题;参与其中总是一个练习你的英语的很好的机会。不要害怕。 @@ -59,11 +58,13 @@ OpenStack 的官方语言是英语,这意味着我们是作为非英语为母 用英语写博客和技术文章也是不错的主意。 -### 给英语为母语的人士的建议 +#### 给英语为母语的人士的建议 请说话慢一点儿,同时使用一些简单的单词和句子。如果你发现了非英语为母语的人使用英语中的一些错误请不要嘲笑他们,尝试鼓励新来的人表达自己的意见,让他们非常舒适地表达意见。 -*这篇文章由 Masayuki Igawa、Dong Ma 和 Samuel de Medeiros Queiroz 共同协作完成,可以在 Hobart 的 linux.conf.au 2017([#lca2017][1]):[Non-native English speakers in Open Source communities: A True Story.][2]中了解更多* +*这篇文章由 Masayuki Igawa、Dong Ma 和 Samuel de Medeiros Queiroz 共同协作完成,可以在 Hobart 的 linux.conf.au 2017([#lca2017][1]):[开源社区中的非英语母语者:一个真实的故事][2]中了解更多* + +( 题图:opensource.com) ------------------------------------------- @@ -71,13 +72,15 @@ OpenStack 的官方语言是英语,这意味着我们是作为非英语为母 ![](https://opensource.com/sites/default/files/styles/profile_pictures/public/pictures/myface_s.jpg?itok=-dy9_LQd) -Masayuki Igawa:Masayuki Igawa 是一名拥有 15 年大量软件项目经验的软件工程师,目前正在开发与 Linux 内核和虚拟化相关开源软件。自 2013 年起,他就一直是一名活跃的 OpenStack 项目贡献者。他是像 Tempest 和 subunit2sql 这样一些 OpenStack QA 项目的核心成员。他目前就职于 HPE 的 Upstream OpenStack 团队,该团队目的是使 OpenStack 更适合所有人。他以前曾在 OpenStack 峰会上发表演讲。 +Masayuki Igawa 是一名拥有 15 年大量软件项目经验的软件工程师,目前正在开发与 Linux 内核和虚拟化相关开源软件。自 2013 年起,他就一直是一名活跃的 OpenStack 项目贡献者。他是像 Tempest 和 subunit2sql 这样一些 OpenStack QA 项目的核心成员。他目前就职于 HPE 的 Upstream OpenStack 团队,该团队目的是使 OpenStack 更适合所有人。他以前曾在 OpenStack 峰会上发表演讲。 + +--- via: https://opensource.com/article/17/1/non-native-speakers-take-open-source-communities 作者:[Masayuki Igawa][a] 译者:[zhousiyu325](https://github.com/zhousiyu325) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From d6bf75718bc8c93233d23252dc3787c4289d6345 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 18 Jun 2017 07:09:07 +0800 Subject: [PATCH 0461/1407] PUB:20170113 Tips for non-native English speakers working on open source projects.md @zhousiyu325 --- ...non-native English speakers working on open source projects.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/talk => published}/20170113 Tips for non-native English speakers working on open source projects.md (100%) diff --git a/translated/talk/20170113 Tips for non-native English speakers working on open source projects.md b/published/20170113 Tips for non-native English speakers working on open source projects.md similarity index 100% rename from translated/talk/20170113 Tips for non-native English speakers working on open source projects.md rename to published/20170113 Tips for non-native English speakers working on open source projects.md From 522b60d70e996e8d4638cadba823b661afacead6 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 18 Jun 2017 07:41:24 +0800 Subject: [PATCH 0462/1407] PRF&PUB:20161027 Network management with LXD.md @geekpi --- .../20161027 Network management with LXD.md | 57 +++++++++---------- 1 file changed, 28 insertions(+), 29 deletions(-) rename {translated/tech => published}/20161027 Network management with LXD.md (64%) diff --git a/translated/tech/20161027 Network management with LXD.md b/published/20161027 Network management with LXD.md similarity index 64% rename from translated/tech/20161027 Network management with LXD.md rename to published/20161027 Network management with LXD.md index f7659fa10e..cbbcc04096 100644 --- a/translated/tech/20161027 Network management with LXD.md +++ b/published/20161027 Network management with LXD.md @@ -1,21 +1,22 @@ -# 使用 LXD (2.3+) 管理网络 +在 LXD 2.3 及以上版本中管理网络 +=========== - ![LXD logo](https://linuxcontainers.org/static/img/containers.png) +![LXD logo](https://linuxcontainers.org/static/img/containers.png) ### 介绍 -当 LXD 2.0 随着 Ubuntu 16.04 一起发布时,LXD 联网就简单了。你可以使用 “lxdbr0” 桥接,配置 “lxd init”,为你的容器提供你自己或者使用一个已存在的物理接口。 +当 LXD 2.0 随着 Ubuntu 16.04 一起发布时,LXD 联网就简单了。要么你可以使用 `lxd init` 来配置,为你的容器自己提供一个 “lxdbr0” 网桥,要么使用一个已存在的物理接口。 -虽然这确实有效,但是有点混乱,因为大部分的桥接配置发生在 Ubuntu 包的 LXD 之外。那些脚本只能支持一个桥接,并且没有通过 API 暴露,这使得远程配置有点痛苦。 +虽然这确实有效,但是有点混乱,因为大部分的桥接配置发生在 Ubuntu 打包的 LXD 之外。那些脚本只能支持一个桥接,并且没有通过 API 暴露,这使得远程配置有点痛苦。 -直到 LXD 2.3,LXD 终于发展了自己的网络管理 API 和命令行工具来匹配。这篇文章是对这些新功能概述的尝试。 +直到 LXD 2.3,LXD 终于发展了自己的网络管理 API ,并有相应的命令行工具。这篇文章试图来简述这些新的功能。 ### 基础联网 -在初始情况下,LXD 2.3 没有定义任何网络。“lxd init” 会为你设置一个,并且默认将所有新的容器连接到它,但是让我们亲手尝试看下究竟发生了些什么。 +在初始情况下,LXD 2.3 没有定义任何网络。`lxd init` 会为你设置一个,并且默认情况下将所有新的容器连接到它,但是让我们亲手尝试看下究竟发生了些什么。 -要创建一个新的带有随机 IPv4 和 IP6 以及启用 NAT 的网络,只需要运行: +要创建一个新的带有随机 IPv4 和 IP6 子网,并启用 NAT 的网络,只需要运行: ``` stgraber@castiana:~$ lxc network create testbr0 @@ -58,7 +59,7 @@ type: bridge usedby: [] ``` -如果你的容器没有使用,那么创建的网络对你也没什么用。要将你新创建的网络连接到所有容器,你可以这么做: +如果你的容器没有使用它,那么创建的网络对你也没什么用。要将你新创建的网络连接到所有容器,你可以这么做: ``` @@ -71,17 +72,17 @@ stgraber@castiana:~$ lxc network attach-profile testbr0 default eth0 stgraber@castiana:~$ lxc network attach my-container default eth0 ``` -现在,假设你已经在机器中安装了 openvswitch,并且要将这个桥接转换成 OVS 桥接,只需合适地更改驱动: +现在,假设你已经在机器中安装了 openvswitch,并且要将这个网桥转换成 OVS 网桥,只需更改为正确的驱动: ``` stgraber@castiana:~$ lxc network set testbr0 bridge.driver openvswitch ``` -如果你想要一次性做一系列修改。“lxc network edit” 可以让你在编辑器中交互编辑网络配置。 +如果你想要一次性做一系列修改。`lxc network edit` 可以让你在编辑器中交互编辑网络配置。 ### 静态租约及端口安全 -使用 LXD 管理 DHCP 服务器的一个好处是可以使得管理 DHCP 租约很简单。你所需要的是一个容器特定的 nic 设备以及正确的属性设置。 +使用 LXD 管理 DHCP 服务器的一个好处是可以使得管理 DHCP 租约很简单。你所需要的是一个容器特定的网卡设备以及正确的属性设置。 ``` root@yak:~# lxc init ubuntu:16.04 c1 @@ -97,7 +98,7 @@ root@yak:~# lxc list c1 +------+---------+-------------------+------+------------+-----------+ ``` -IPv6 也是相同的方法,但是换成 “ipv6.address” 属性。 +IPv6 也是相同的方法,但是换成 `ipv6.address` 属性。 相似地,如果你想要阻止你的容器更改它的 MAC 地址或者为其他 MAC 地址转发流量(比如嵌套),你可以用下面的命令启用端口安全: @@ -107,13 +108,13 @@ root@yak:~# lxc config device set c1 eth0 security.mac_filtering true ### DNS -LXD 在桥接中运行了一个 DNS 服务器。除了设置网桥的 DNS 域( “dns.domain” 网络属性)之外,还支持 3 种不同的操作模式(“dns.mode”): +LXD 在网桥上运行 DNS 服务器。除了设置网桥的 DNS 域( `dns.domain` 网络属性)之外,还支持 3 种不同的操作模式(`dns.mode`): -* “managed” 为每个容器都会有一条 DNS 记录,匹配它的名字以及已知的 IP 地址。容器无法通过 DHCP 改变这条记录。 -* “dynamic” 允许容器通过 DHCP 在 DNS 中自己注册。因此,在 DHCP 协商期间容器发送的任何主机名都会在 DNS 中终止。 -* “none” 针对那些没有任何本地 DNS 记录的递归 DNS 服务器。 +* `managed` :每个容器都会有一条 DNS 记录,匹配它的名字以及已知的 IP 地址。容器无法通过 DHCP 改变这条记录。 +* `dynamic` :允许容器通过 DHCP 在 DNS 中自行注册。因此,在 DHCP 协商期间容器发送的任何主机名最终都出现在 DNS 中。 +* `none` : 针对那些没有任何本地 DNS 记录的递归 DNS 服务器。 -默认的模式是 “managed”,并且典型的是最安全以及最方便的,因为它为容器提供了 DNS 记录,但是不允许它们通过 DHCP 发送虚假主机名嗅探其他的记录。 +默认的模式是 `managed`,并且典型的是最安全以及最方便的,因为它为容器提供了 DNS 记录,但是不允许它们通过 DHCP 发送虚假主机名嗅探其他的记录。 ### 使用隧道 @@ -138,7 +139,7 @@ Network testbr0 created root@djanet:~# lxc network attach-profile testbr0 default eth0 ``` -现在你可以在任何一台主机上启动容器,并看它们从相同的地址池中获取 IP,通过隧道直接互相交流。 +现在你可以在任何一台主机上启动容器,并看到它们从同一个地址池中获取 IP,通过隧道直接互相通讯。 如先前所述,这个使用了组播,它通常在跨越路由器时无法很好工作。在这些情况下,你可以用单播模式使用 VXLAN 或者 GRE 隧道。 @@ -178,19 +179,17 @@ root@nuturo:~# lxc network set testbr0 tunnel.edfu.protocol vxlan ### 总结 -LXD 可以容易地定义简单的单主机网络定义到数千个容器的非常复杂的跨主机网络。它也使为一些容器定义一个新网络或者给容器添加第二个设备,并连接到隔离的私有网络变得很简单。 +LXD 使得从简单的单主机网络到数千个容器的非常复杂的跨主机网络的定义变得更加容易。它也使为一些容器定义一个新网络或者给容器添加第二个设备,并连接到隔离的私有网络变得很简单。 -虽然这篇文章介绍了支持的大部分功能,但仍有很有可以微调 LXD 网络体验的窍门。 +虽然这篇文章介绍了支持的大部分功能,但仍有一些可以微调 LXD 网络体验的窍门。可以在这里找到完整的列表:[https://github.com/lxc/lxd/blob/master/doc/configuration.md][2] 。 -可以在这里找到完整的列表:[https://github.com/lxc/lxd/blob/master/doc/configuration.md][2] +### 额外信息 -# 额外信息 - -LXD 主站:[https://linuxcontainers.org/lxd][3] -Github 地址: [https://github.com/lxc/lxd][4] -邮件列表支持:[https://lists.linuxcontainers.org][5] -IRC 频道:#lxcontainers on irc.freenode.net -在线尝试 LXD:[https://linuxcontainers.org/lxd/try-it][6] +- LXD 主站:[https://linuxcontainers.org/lxd][3] +- Github 地址: [https://github.com/lxc/lxd][4] +- 邮件列表支持:[https://lists.linuxcontainers.org][5] +- IRC 频道:#lxcontainers on irc.freenode.net +- 在线尝试 LXD:[https://linuxcontainers.org/lxd/try-it][6] -------------------------------------------------------------------------------- @@ -198,7 +197,7 @@ via: https://www.stgraber.org/2016/10/27/network-management-with-lxd-2-3/ 作者:[Stéphane Graber][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/) 荣誉推出 From 23a9699f7a58291d930a01d9c81c7fd2fe0afcb5 Mon Sep 17 00:00:00 2001 From: yangmingming Date: Sun, 18 Jun 2017 11:45:22 +0800 Subject: [PATCH 0463/1407] yangmingming translating --- .../20170215 How to take screenshots on Linux using Scrot.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170215 How to take screenshots on Linux using Scrot.md b/sources/tech/20170215 How to take screenshots on Linux using Scrot.md index bc388bef11..5076375e06 100644 --- a/sources/tech/20170215 How to take screenshots on Linux using Scrot.md +++ b/sources/tech/20170215 How to take screenshots on Linux using Scrot.md @@ -1,3 +1,4 @@ +yangmingming translating How to take screenshots on Linux using Scrot ============================================================ From fc5324bd97c0c401b4ddfb77da8bbc7c95286ad9 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 19 Jun 2017 05:38:01 +0800 Subject: [PATCH 0464/1407] PRF:20170105 Top 8 systems operations and engineering trends for 2017.md @geekpi --- ...rations and engineering trends for 2017.md | 51 +++++++++---------- 1 file changed, 23 insertions(+), 28 deletions(-) diff --git a/translated/tech/20170105 Top 8 systems operations and engineering trends for 2017.md b/translated/tech/20170105 Top 8 systems operations and engineering trends for 2017.md index 35629ef781..27e54acc25 100644 --- a/translated/tech/20170105 Top 8 systems operations and engineering trends for 2017.md +++ b/translated/tech/20170105 Top 8 systems operations and engineering trends for 2017.md @@ -1,56 +1,51 @@ -2017 年 8 大系统运维和工程趋势 +2017 年的八大系统运维和工程发展趋势 ================= -预测趋势是棘手的,尤其是在快速发展的系统运维和工程领域。今年,在我们的 Velocity 大会上,我们讨论了分布式系统、SRE、容器化、无服务架构,人员倦怠以及与提供软件相关的人力与技术挑战等诸多问题。以下是我们认为的明年的趋势: +![](https://d3tdunqjn7n0wj.cloudfront.net/720x480/operations-circle-binoculars-crop-84d7249dda092338c1a6f3b562203b3d.jpg) -### 1\. 分布式系统 +预测趋势是棘手的,尤其是在快速发展的系统运维和工程领域。2016 年,在我们的 Velocity 大会上,我们讨论了分布式系统、SRE、容器化、无服务架构,人员倦怠以及与提供软件相关的人力与技术挑战等诸多问题。以下是我们认为的下一年的趋势: -我们认为这个很重要,我们[在整个 Velocity 会议上重新关注了它][1]。 +### 1、 分布式系统 +我们认为这个很重要,我们[在整个 Velocity 会议上再次关注了它][1]。 +### 2、 站点可靠性工程(SRE) -### 2\. 站点可靠性工程 +[站点可靠性工程(Site Reliability Engineering)][3](SRE)-它只是运维么?[或者它是 DevOps 的另外一个名称吗][4]?这是 Google 对那些需要做大量系统及软件工程的运维专业人士的称呼。它由在像 Dropbox 公司的前 Google 人向业内推广,[招聘 SRE 的职位][5]正不断增加,特别是有大型数据中心的面向网络的公司。在某些情况下,SRE 的作用更多地是帮助开发人员运营自己的服务。 -[站点可靠性工程][3]-它只是运维么?[或者它是 DevOps 的另外一个名称][4]?这是 Google 对那些要求做大量系统及软件工程的运维专业人士的称呼。它由在像 Dropbox 的前 Google 人向业内推广,[招聘 SRE 的职位][5]正不断增加,特别是有大型数据中心的面向网络的公司。在某些情况下,SRE 的作用更多地是帮助开发人员操作自己的服务。 +### 3、 容器化 -### 3\. 同期话 +公司将继续容器化它们的软件交付。Docker 公司本身已经将 Docker 定位为“[增量革命][6]”的工具,对遗留应用进行容器化已成为企业的常见案例。Docker 的未来是什么?随着工程师继续采用诸如 Kubernetes 和 Mesos 之类的编排工具,更高层次的抽象可能为其他容器(如 rkt、Garden 等)提供更多空间。 -公司将继续容器化它们的软件交付。Docker 公司本身已经将 Docker 定位为“[增量革命][6]”的工具,容器化遗留应用已成为企业的常见案例。Docker 的未来是什么?随着工程师继续采用诸如 Kubernetes 和 Mesos 之类的编排工具,更高层次的抽象可能为其他容器(如 rkt、Garden 等)提供更多空间。 +### 4、 Unikernels +unikernels 是容器化之后的下一步么?它们不合适产品环境么?有些人吹捧 unikernels 的安全和性能好处。关注一下 unikernels 在 2017 是如何进化的,[特别要关注下 Dokcer 公司在这个领域做的][7]。(今年它已经收购了 Unikernel Systems) -### 4\. Unikernels +### 5、 无服务架构(Serverless) -unikernels 是容器化之后的下一步么?它们对产品不合适么?有些人吹捧 unikernels 的安全和性能好处。关注一下 unikernels 在 2017 是如何进化的,[特别要关注下 Dokcer 公司在这个领域做的][7]。(今年它已经收购了 Unikernel Systems) +无服务架构视功能为基础的计算单元。有些人认为这个术语是误导性的(让人想起 “noops”),并且更倾向于把这个趋势称为“功能即服务(Functions-as-a-Service)”(FaaS)。开发人员和架构师正在越来越多地尝试这个技术,并期望看到有越来越多的程序用这个范式编写。更多关于 serverless/FaaS 对运维的意义,请查看 Michael Hausenblas 的 [Serverless 运维][8]免费电子书。 -### 5\. Serverless +### 6、 原生云程序开发 -无服务架构视功能为基础的计算单元。有些人认为这个术语是误导性的(让人想起 “noops”),并且更倾向于把这个趋势称为“功能即服务”。开发人员和架构师正在越来越多地尝试这个技术,并期望看到有越来越多的程序用这个范式编写。更多关于 serverless/FaaS 对运维的意义,请查看 Michael Hausenblas 的 [Serverless 运维][8]免费电子书。 +就像 DevOps,这个术语已经被市场人员使用并滥用很久了,但是云计算基金会(Cloud Native Computing Foundation)(CNCF)为这些新工具(通常是谷歌发起的)做了一个很好的例子,这些工具不仅利用了云,而且特别还在于分布式系统(即微服务,容器化和动态编排)所提供的优势和机会。 -### 6\. 原生云程序开发 +### 7、 监控 -就像 DevOps,这个术语已经被市场人员使用并滥用很久了,但是云计算基金会为这些新工具(通常是谷歌发起的)做了一个很好的例子,这些工具不仅利用了云,而且特别还在于分布式系统(简称微服务,容器化和动态编排)提供的优势和机会。 +随着行业从 Nagios 风格的监控发展到流化指标和可视化,我们在生产越来越多的系统数据,而如何理解它们则是下一个挑战,因此,我们看到供应商开始提供具有机器学习功能的监控服务,以及更普遍的是 IT 运营人员开始去研究让机器学习分析系统数据的技术。同样,随着我们的基础设施变得更加动态和分布式,监控越来越少地检查某个资源的健康状况,更多的是在服务之间追踪流量。因此,分布式跟踪已经出现。 -### 7\. 监控 +### 8、 DevOps 安全 -随着行业从 Nagios 风格的监控发展到流量指标和可视化,我们在生产大量的系统数据方面变得非常出色。诠释是下一个挑战。因此,我们看到供应商提供机器学习功能的监控服务,以及更一般的是利用机器学习系统数据的 IT 运维学习。同样,随着我们的基础设施变得更加动态和分布式,监控越来越少地检查个人资源的健康状况,更多的是关于在服务之间追踪流量。因此,分布式跟踪已经出现。 - -### 8\. DevOps 安全 - -随着 DevOps 安全的普及,[安全性正在迅速成为团队范围的关注][9]。当有安全和合规顾虑的公司感觉到需要在速度上竞争时, devops 实现速度和可靠性的经典挑战尤其明显。 +随着 DevOps 安全的普及,[安全性正在迅速成为团队范围的关注][9]。当重视安全和合规方面的公司在速度的竞争上感到了压力时,要同时满足速度和可靠性的 DevOps 所面对的经典挑战尤其明显。 ### 告诉我们关于你的工作 -作为一名 IT 运维专业人员 - 你是否使用系统管理的术语如 DevOps、SRE、DBA 等等。- [你被受邀分享你的见解][10]来帮助我们在增长的领域中了解关于人口统计、工作环境、工具以及从业人员薪酬。所有反馈都会以归集形式报告从而保证你的匿名。调查大约需要 5-10 分钟完成。在关闭调查并分析结果后,我们会与你分享发现。[参加调查][11] +作为一名 IT 运维专业人员 - 你是否使用系统管理的术语如 DevOps、SRE、DBA 等等。- [欢迎你来分享你的见解][10]。 -------------------------------------------------------------------------------- 作者简介: -![](https://d3tdunqjn7n0wj.cloudfront.net/1440x1440/courtney-nash-crop-a9cb0b44a4262f20524d171195d6d485.jpg) - -Courtney Nash 主持 O'Reilly Media 的多个会议,并且是专注于现代网络运维,高性能程序和安全性的战略内容总监。一位前学术神经科学家,她仍然对大脑着迷,以及它如何告诉我们与技术互动和对技术的期望。自从移居西雅图,在一家蓬勃发展的在线书店工作之后,她花了 17 年的时间从事技术行业的各种工作。在外面,你可以看到 Courtney 在骑自行车、徒步旅行、滑雪。。。 - -![](https://d3tdunqjn7n0wj.cloudfront.net/1440x1440/brian_anderson-ae207faed42e8b7a2e73b7f82573c8ea.jpg) +Courtney Nash 主持 O'Reilly Media 的多个会议,是专注于现代网络运维、高性能程序和安全性的战略内容总监。一位前学术神经科学家,她仍然对大脑着迷,以及它如何告诉我们与技术互动和对技术的期望。自从移居西雅图,在一家蓬勃发展的在线书店工作之后,她花了 17 年的时间从事技术行业的各种工作。在外面,你可以看到 Courtney 在骑自行车、徒步旅行、滑雪。。。 O'Reilly Media 的基础架构和运维编辑 Brian Anderson 介绍了从传统系统管理到云计算、Web 性能、Docker 和 DevOps 等软件交付的重要内容。他一直从事在线教育,服务于学习者的需求超过十多年。 @@ -58,9 +53,9 @@ O'Reilly Media 的基础架构和运维编辑 Brian Anderson 介绍了从传统 via: https://www.oreilly.com/ideas/top-8-systems-operations-and-engineering-trends-for-2017 -作者:[Courtney Nash][a],[Brian Anderson][b] +作者:[Courtney Nash][a], [Brian Anderson][b] 译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 8527b277a0c06d788b4740dc36a33a5f48359844 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 19 Jun 2017 05:38:14 +0800 Subject: [PATCH 0465/1407] PUB:20170105 Top 8 systems operations and engineering trends for 2017.md @geekpi --- ...05 Top 8 systems operations and engineering trends for 2017.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170105 Top 8 systems operations and engineering trends for 2017.md (100%) diff --git a/translated/tech/20170105 Top 8 systems operations and engineering trends for 2017.md b/published/20170105 Top 8 systems operations and engineering trends for 2017.md similarity index 100% rename from translated/tech/20170105 Top 8 systems operations and engineering trends for 2017.md rename to published/20170105 Top 8 systems operations and engineering trends for 2017.md From b366422d61d438f0570ade07962f90d4205c69fd Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 19 Jun 2017 08:51:09 +0800 Subject: [PATCH 0466/1407] translated --- ...d with iRedMail for Samba4 AD – Part 13.md | 179 ------------------ ...d with iRedMail for Samba4 AD – Part 13.md | 179 ++++++++++++++++++ 2 files changed, 179 insertions(+), 179 deletions(-) delete mode 100644 sources/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md create mode 100644 translated/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md diff --git a/sources/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md b/sources/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md deleted file mode 100644 index 0bdc4d2fee..0000000000 --- a/sources/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md +++ /dev/null @@ -1,179 +0,0 @@ -translating---geekpi - -How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13 -============================================================ - - -This tutorial will guide you on how to configure Mozilla Thunderbird client with an iRedMail server in order to send and receive mail via IMAPS and SMTP submission protocols, how to setup contacts database with Samba AD LDAP server and how to configure other related mail features, such as enabling Thunderbird contacts via LDAP database offline replica. - -The process of installing and configuring Mozilla Thunderbird client described here is valid for Thunderbird clients installed on Windows or Linux operating systems. - -#### Requirements - -1. [How to Configure and Integrate iRedMail Services to Samba4 AD DC][1] - -2. [Integrate iRedMail Roundcube with Samba4 AD DC][2] - -### Step 1: Configure Thunderbird for iRedMail Server - -1. After installing Thunderbird mail client, hit on the launcher or shortcut to open the program and on the first screen check E-mail System Integration and click on Skip Integration button to continue. - - [![Thunderbird System Integration](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-System-Integration.png)][3] - -Thunderbird System Integration - -2. On the welcome screen hit on Skip this and use my existing mail button and add your name, your Samba account e-mail address and password, check Remember password field and hit on Continue button to start your mail account setup. - -After Thunderbird client tries to identify the correct IMAP settings provided by iRedMail server hit on Manual config button to manually setup Thunderbird. - - [![Thunderbird Mail Account Setup](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Mail-Account-Setup.png)][4] - -Thunderbird Mail Account Setup - -3. After the Mail Account Setup window expands, manually edit IMAP and SMTP settings by adding your proper iRedMail server FQDN, add secured ports for both mail services (993 for IMAPS and 587 for submission), select the proper SSL communication channel for each port and authentication and hit Done to complete the setup. Use the below image as a guide. - - [![Thunderbird iRedMail Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-iRedMail-Settings.png)][5] - -Thunderbird iRedMail Settings - -4. A new Security Exception window should appear on your screen due to the Self-Signed Certificates your iRedMail server enforces. Check on Permanently store this exception and hit on Confirm Security Exception button to add this security exception and the Thunderbird client should be successfully configured. - - [![Thunderbird Security Exception](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Security-Exception.png)][6] - -Thunderbird Security Exception - -You will see all received mail for your domain account and you should be able to send or receive mail to and from your domain or other domain accounts. - - [![Domain Mails Inbox](https://www.tecmint.com/wp-content/uploads/2017/05/Domain-Mails-Inbox.png)][7] - -Domain Mails Inbox - -### Step 2: Setup Thunderbird Contacts Database with Samba AD LDAP - -5. In order for Thunderbird clients to query Samba AD LDAP database for contacts, hit on Settings menu by right clicking on your account from the left plane and navigate to Composition & Addressing → Addressing → Use a different LDAP server → Edit Directories button as illustrated on the below images. - - [![Thunderbird Samba AD LDAP Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Settings.png)][8] - -Thunderbird Samba AD LDAP Settings - - [![Thunderbird Composition & Addressing Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Composition-Addressing-Settings.png)][9] - -Thunderbird Composition & Addressing Settings - -6. The LDAP Directory Servers windows should open by now. Hit on Add button and fill Directory Server Properties windows with the following content: - -On General tab add descriptive name for this object, add the name of your domain or the FQDN of a Samba domain controller, the base DN of your domain in the form dc=your_domain,dc=tld, LDAP port number 389 and the vmail Bind DN account used to query the Samba AD LDAP database in the form vmail@your_domain.tld. - -Use the below screenshot as a guide. - - [![Directory Server Properties](https://www.tecmint.com/wp-content/uploads/2017/05/Directory-Server-Properties.png)][10] - -Directory Server Properties - -7. On the next step, move to Advanced tab from Directory Server Properties, and add the following content in Search filter filed: - -``` -(&(mail=*)(|(&(objectClass=user)(!(objectClass=computer)))(objectClass=group))) -``` - [![Add Search Filter](https://www.tecmint.com/wp-content/uploads/2017/05/Add-Search-Filter.png)][11] - -Add Search Filter - -Leave the rest of the settings as default and hit on OK button to apply changes and again on OK button to close LDAP Directory Servers window and OK button again on Account Settings to close the window. - - [![Select LDAP Directory Server](https://www.tecmint.com/wp-content/uploads/2017/05/Select-LDAP-Directory-Server.png)][12] - -Select LDAP Directory Server - -8. To test if Thunderbird client can query Samba AD LDAP database for contacts, hit on the upper Address Book icon, select the name of the LDAP database created earlier. - -Add the password for the Bind DN account configured to interrogate the AD LDAP server (vmail@your_domain.tld), check Use Password Manager to remember the password and hit OK button to reflect changes and close the window. - - [![Thunderbird Samba AD LDAP Testing](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Testing.png)][13] - -Thunderbird Samba AD LDAP Testing - -9. Search for a Samba AD contact by using the upper search filed and suppling a domain account name. Be aware that Samba AD accounts with no e-mail address declared in their AD E-mail field will not be listed in Thunderbird Address Book searches. - - [![Search Samba AD Mail Contacts](https://www.tecmint.com/wp-content/uploads/2017/05/Search-Samba-AD-Mail-Contacts.png)][14] - -Search Samba AD Mail Contacts - -10. To search for a contact while composing an e-mail, click on View → Contacts Sidebar or press F9 key to open Contacts panel. - - [![Search Mail Contacts in Thunderbird](https://www.tecmint.com/wp-content/uploads/2017/05/Search-Mail-Contact-in-Thunderbird.png)][15] - -Search Mail Contacts in Thunderbird - -11. Select the proper Address Book and you should be able to search and add an e-mail address for your recipient. When sending the first mail, a new security alert window should appear. Hit on Confirm Security Exception and the mail should be sent to your recipient e-mail address. - - [![Send Mail in Thunderbird](https://www.tecmint.com/wp-content/uploads/2017/05/Send-Mail-in-Thunderbird.jpg)][16] - -Send Mail in Thunderbird - -12. In case you want to search contacts through Samba LDAP database only for a specific AD Organizational Unit, edit the Address Book for your Directory Server name from the left plane, hit on Properties and add the custom Samba AD OU as illustrated on the below example. - -``` -ou=your_specific_ou,dc=your_domain,dc=tld -``` - [![Search Contacts in Samba LDAP Database](https://www.tecmint.com/wp-content/uploads/2017/05/Search-Contacts-in-Samba-LDAP-Database.png)][17] - -Search Contacts in Samba LDAP Database - -### Step 3: Setup LDAP Offline Replica - -13. To configure Samba AD LDAP offline replica for Thunderbird hit on Address Book button, select your LDAP Address Book, open Directory Server Properties -> General tab and change the port number to 3268. - -Then switch to Offline tab and hit on Download Now button to start replicate Samba AD LDAP database locally. - - [![Setup LDAP Offline Replica in Thunderbird](https://www.tecmint.com/wp-content/uploads/2017/05/Setup-LDAP-Offline-Replica-in-Thunderbird.png)][18] - -Setup LDAP Offline Replica in Thunderbird - - [![Download LDAP Database for Offline](https://www.tecmint.com/wp-content/uploads/2017/05/Download-Samba-LDAP-Database-Offline.png)][19] - -Download LDAP Database for Offline - -When the process of synchronizing contacts finishes you will be informed with the message Replication succeeded. Hit OK and close all windows. In case Samba domain controller cannot be reached you can still search for LDAP contacts by working in offline mode. - --------------------------------------------------------------------------------- - -作者简介: - -I'am a computer addicted guy, a fan of open source and linux based system software, have about 4 years experience with Linux distributions desktop, servers and bash scripting. - - - --------------- - -via: https://www.tecmint.com/configure-thunderbird-with-iredmail-for-samba4-ad-ldap/ - -作者:[Matei Cezar ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.tecmint.com/author/cezarmatei/ -[1]:https://www.tecmint.com/integrate-iredmail-to-samba4-ad-dc-on-centos-7/ -[2]:https://www.tecmint.com/integrate-iredmail-roundcube-with-samba4-ad-dc/ -[3]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-System-Integration.png -[4]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Mail-Account-Setup.png -[5]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-iRedMail-Settings.png -[6]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Security-Exception.png -[7]:https://www.tecmint.com/wp-content/uploads/2017/05/Domain-Mails-Inbox.png -[8]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Settings.png -[9]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Composition-Addressing-Settings.png -[10]:https://www.tecmint.com/wp-content/uploads/2017/05/Directory-Server-Properties.png -[11]:https://www.tecmint.com/wp-content/uploads/2017/05/Add-Search-Filter.png -[12]:https://www.tecmint.com/wp-content/uploads/2017/05/Select-LDAP-Directory-Server.png -[13]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Testing.png -[14]:https://www.tecmint.com/wp-content/uploads/2017/05/Search-Samba-AD-Mail-Contacts.png -[15]:https://www.tecmint.com/wp-content/uploads/2017/05/Search-Mail-Contact-in-Thunderbird.png -[16]:https://www.tecmint.com/wp-content/uploads/2017/05/Send-Mail-in-Thunderbird.jpg -[17]:https://www.tecmint.com/wp-content/uploads/2017/05/Search-Contacts-in-Samba-LDAP-Database.png -[18]:https://www.tecmint.com/wp-content/uploads/2017/05/Setup-LDAP-Offline-Replica-in-Thunderbird.png -[19]:https://www.tecmint.com/wp-content/uploads/2017/05/Download-Samba-LDAP-Database-Offline.png -[20]:https://www.tecmint.com/author/cezarmatei/ -[21]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ -[22]:https://www.tecmint.com/free-linux-shell-scripting-books/ diff --git a/translated/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md b/translated/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md new file mode 100644 index 0000000000..49521d3666 --- /dev/null +++ b/translated/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md @@ -0,0 +1,179 @@ +如何在 Samba4 AD 中使用 iRedMail 配置 Thunderbird - 第 13 部分 +============================================================ + + +本教程将指导你如何使用 iRedMail 服务器配置 Mozilla Thunderbird 客户端,以便通过 IMAPS 和 SMTP 提交协议发送和接收邮件,如何使用 Samba AD LDAP 服务器设置联系人数据库以及如何配置其他相关的邮件功能,例如通过 LDAP 数据库离线副本启用 Thunderbird 联系人。 + +安装和配置 Mozilla Thunderbird 客户端的过程适用于安装在 Windows 或 Linux 操作系统上的 Thunderbird 客户端。 + +#### 要求 + +1. [如何配置和集成 iRedMail 服务到 Samba4 AD DC][1] + +2. [将 iRedMail Roundcube 与 Samba4 AD DC 集成][2] + + +### 第一步:为 iRedMail 服务器配置 Thunderbird + +1. 在安装完成 Thunderbird 邮件客户端之后,点击启动器或者快捷方式打开程序,并在首屏检查 E-mail 系统集成,然后点击跳过集成按钮继续。 + + [![Thunderbird System Integration](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-System-Integration.png)][3] + +Thunderbird 系统集成 + +2. 在欢迎界面点击跳过并使用我已存在的邮件按钮添加你的名字、你的 Samba 帐户邮件地址以及密码,检查记住密码区域并点击继续按钮启动你的邮箱帐户设置。 + +在 Thunderbird 客户端尝试识别由 iRedMail 服务器提供的正确的IMAP设置后,点击手动配置按钮手动设置 Thunderbird。 + + [![Thunderbird Mail Account Setup](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Mail-Account-Setup.png)][4] + +Thunderbird 邮箱帐户设置 + +3. 邮件帐户设置窗口展开后,通过添加正确的 iRedMail 服务器 FQDN 来手动编辑 IMAP 和 SMTP 设置,为邮件服务添加安全端口(IMAPS 为 993,发送为 587),为每个端口选择合适的 SSL 通信通道并验证然后点击完成完成设置。使用以下图片作为指导。 + + [![Thunderbird iRedMail Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-iRedMail-Settings.png)][5] + +Thunderbird iRedMail 设置 + +4. 由于你的 iRedMail 服务器使用自签名证书,屏幕上应会显示一个新的“安全异常”窗口。点击永久存储此异常并按确认安全异常按钮添加此安全性异常,Thunderbird 客户端应该就被成功配置了。 + + [![Thunderbird Security Exception](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Security-Exception.png)][6] + +Thunderbird 安全异常 + +你会看到你的域帐号的所有已收文件,并且你能够从你的域或者其他域发送或者接收文件。 + + [![Domain Mails Inbox](https://www.tecmint.com/wp-content/uploads/2017/05/Domain-Mails-Inbox.png)][7] + +域邮箱收件箱 + +### 第二步:使用 Samba AD LDAP 设置 Thunderbird 联系人数据库 + +5. 为了让 Thunderbird 客户端查询 Samba AD LDAP 数据库中的联系人,点击“设置”菜单,在左边面板右键单击您的帐户,如下图片所示找到 “Composition & Addressing → Addressing → Use a different LDAP server → Edit Directories” + + [![Thunderbird Samba AD LDAP Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Settings.png)][8] + +Thunderbird Samba AD LDAP 设置 + + [![Thunderbird Composition & Addressing Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Composition-Addressing-Settings.png)][9] + +Thunderbird Composition & Addressing 设置 + +6. LDAP 目录服务器窗口应该带开了,点击添加按钮并将下面的内容填写到目录服务器属性窗口中: + +在 “常规” 选项卡上添加此对象的描述性名称,添加你的域的名称或 Samba 域控制器的 FQDN,你的域的基本 DN 形式是 “dc=你的域,dc=tld”,LDAP 端口号 389,vmail 绑定 DN 帐户用于以 vmail@your_domain.tld 的形式查询 Samba AD LDAP 数据库。 + +使用下面的截图作为指导 + + [![Directory Server Properties](https://www.tecmint.com/wp-content/uploads/2017/05/Directory-Server-Properties.png)][10] + +目录服务器属性 + +7. 在下一步中,从目录服务器属性进入高级选项卡,并在搜索过滤栏添加下面的内容: + +``` +(&(mail=*)(|(&(objectClass=user)(!(objectClass=computer)))(objectClass=group))) +``` + [![Add Search Filter](https://www.tecmint.com/wp-content/uploads/2017/05/Add-Search-Filter.png)][11] + +添加搜索过滤 + +让其他的设置保持默认,并点击 OK 按钮来应用更改,再次点击 OK 按钮关闭 LDAP 目录服务器窗口,在账户设置界面点击 OK 关闭窗口。 + + [![Select LDAP Directory Server](https://www.tecmint.com/wp-content/uploads/2017/05/Select-LDAP-Directory-Server.png)][12] + +选择 LDAP 目录服务器 + +8. 要测试 Thunderbird 是否能够向 Samba AD LDAP 数据库请求联系人,点击上方的地址簿图标,选择之前创建的 LDAP 数据库名。 + +添加绑定 DN 帐户密码来查询 AD LDAP 服务器,勾选使用密码管理器记住密码,然后点击确定按钮保存更改并关闭窗口。 + + [![Thunderbird Samba AD LDAP Testing](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Testing.png)][13] + +Thunderbird Samba AD LDAP 测试 + +9. 使用上面的搜索框搜索 Samba AD 联系人,并提供一个域名帐户名。注意没有在 AD E-mail 字段声明的邮件地址的 Samba AD 帐户不会在 Thunderbird 地址簿搜索中列出。 + + [![Search Samba AD Mail Contacts](https://www.tecmint.com/wp-content/uploads/2017/05/Search-Samba-AD-Mail-Contacts.png)][14] + +搜索 Samba AD 邮件联系人 + +10. 要在编写电子邮件时搜索联系人,请单击视图→联系人侧边栏或按 F9 键打开 “联系人” 面板。 + + [![Search Mail Contacts in Thunderbird](https://www.tecmint.com/wp-content/uploads/2017/05/Search-Mail-Contact-in-Thunderbird.png)][15] + +在 Thunderbird 中搜索联系人 + +11. 选择合适的地址簿,你应该能够搜索并添加收件人的电子邮件地址。发送第一封邮件时,会出现一个新的安全警报窗口。点击确认安全例外,邮件应该就能发送到收件人地址中了。 + + [![Send Mail in Thunderbird](https://www.tecmint.com/wp-content/uploads/2017/05/Send-Mail-in-Thunderbird.jpg)][16] + +在 Thunderbird 发送邮件 + +12. 如果你想通过仅针对特定 AD 组织单位的 Samba LDAP 数据库搜索联系人,请从左边面板编辑你的目录服务器名称的地址簿,点击属性并添加自定义的 Samba AD OU,如下所示。 + +``` +ou=your_specific_ou,dc=your_domain,dc=tld +``` + [![Search Contacts in Samba LDAP Database](https://www.tecmint.com/wp-content/uploads/2017/05/Search-Contacts-in-Samba-LDAP-Database.png)][17] + + Samba LDAP 数据库中搜索联系人 + +### 第三步:设置 LDAP 离线副本 + +13. 要为 Thunderbird 配置 Samba AD LDAP 离线副本,请点击“地址簿”按钮,选择你的 LDAP 通讯录,打开“目录服务器属性” -> “常规” 选项卡,将端口号更改为 3268。 + +接着切换到离线选项卡并点击“现在下载”按钮开始在本地复制 Samba AD LDAP 数据库。 + + [![Setup LDAP Offline Replica in Thunderbird](https://www.tecmint.com/wp-content/uploads/2017/05/Setup-LDAP-Offline-Replica-in-Thunderbird.png)][18] + +在 Thunderbird 设置 LDAP 离线副本 + + [![Download LDAP Database for Offline](https://www.tecmint.com/wp-content/uploads/2017/05/Download-Samba-LDAP-Database-Offline.png)][19] + +为离线下载 LDAP 数据库 + + +当同步联系人完成后,你将收到消息复制成功通知。点击 OK 并关闭所有窗口。在无法访问 Samba 域控制器的情况下,你仍然可以通过离线方式进行搜索。 + +-------------------------------------------------------------------------------- + +作者简介: + +我是一个电脑上瘾的家伙,开源和基于 linux 的系统软件的粉丝,在 Linux 发行版桌面、服务器和 bash 脚本方面拥有大约4年的经验。 + + + +-------------- + +via: https://www.tecmint.com/configure-thunderbird-with-iredmail-for-samba4-ad-ldap/ + +作者:[Matei Cezar ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/cezarmatei/ +[1]:https://www.tecmint.com/integrate-iredmail-to-samba4-ad-dc-on-centos-7/ +[2]:https://www.tecmint.com/integrate-iredmail-roundcube-with-samba4-ad-dc/ +[3]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-System-Integration.png +[4]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Mail-Account-Setup.png +[5]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-iRedMail-Settings.png +[6]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Security-Exception.png +[7]:https://www.tecmint.com/wp-content/uploads/2017/05/Domain-Mails-Inbox.png +[8]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Settings.png +[9]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Composition-Addressing-Settings.png +[10]:https://www.tecmint.com/wp-content/uploads/2017/05/Directory-Server-Properties.png +[11]:https://www.tecmint.com/wp-content/uploads/2017/05/Add-Search-Filter.png +[12]:https://www.tecmint.com/wp-content/uploads/2017/05/Select-LDAP-Directory-Server.png +[13]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Testing.png +[14]:https://www.tecmint.com/wp-content/uploads/2017/05/Search-Samba-AD-Mail-Contacts.png +[15]:https://www.tecmint.com/wp-content/uploads/2017/05/Search-Mail-Contact-in-Thunderbird.png +[16]:https://www.tecmint.com/wp-content/uploads/2017/05/Send-Mail-in-Thunderbird.jpg +[17]:https://www.tecmint.com/wp-content/uploads/2017/05/Search-Contacts-in-Samba-LDAP-Database.png +[18]:https://www.tecmint.com/wp-content/uploads/2017/05/Setup-LDAP-Offline-Replica-in-Thunderbird.png +[19]:https://www.tecmint.com/wp-content/uploads/2017/05/Download-Samba-LDAP-Database-Offline.png +[20]:https://www.tecmint.com/author/cezarmatei/ +[21]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[22]:https://www.tecmint.com/free-linux-shell-scripting-books/ From 53d5ab8b1633e8a639bdc0a51c62977baecd68ac Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 19 Jun 2017 08:54:08 +0800 Subject: [PATCH 0467/1407] translating --- ... Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md b/sources/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md index e6d69c3a7b..330fe13ee5 100644 --- a/sources/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md +++ b/sources/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md @@ -1,3 +1,5 @@ +translating---geekpi + How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12 ============================================================ From aa0f64cca12822c56ec4d95b233222ebfd602dec Mon Sep 17 00:00:00 2001 From: alim0x Date: Mon, 19 Jun 2017 11:05:27 +0800 Subject: [PATCH 0468/1407] [translated]What is open source --- sources/talk/20160808 What is open source.md | 123 ------------------ .../talk/20160808 What is open source.md | 121 +++++++++++++++++ 2 files changed, 121 insertions(+), 123 deletions(-) delete mode 100644 sources/talk/20160808 What is open source.md create mode 100644 translated/talk/20160808 What is open source.md diff --git a/sources/talk/20160808 What is open source.md b/sources/talk/20160808 What is open source.md deleted file mode 100644 index b75b0b723f..0000000000 --- a/sources/talk/20160808 What is open source.md +++ /dev/null @@ -1,123 +0,0 @@ -alim0x translating - -What is open source -=========================== - -The term "open source" refers to something people can modify and share because its design is publicly accessible. - -The term originated in the context of software development to designate a specific approach to creating computer programs. Today, however, "open source" designates a broader set of values—what we call "[the open source way][1]." Open source projects, products, or initiatives embrace and celebrate principles of open exchange, collaborative participation, rapid prototyping, transparency, meritocracy, and community-oriented development. - -### What is open source software? - -Open source software is software with source code that anyone can inspect, modify, and enhance. - -"Source code" is the part of software that most computer users don't ever see; it's the code computer programmers can manipulate to change how a piece of software—a "program" or "application"—works. Programmers who have access to a computer program's source code can improve that program by adding features to it or fixing parts that don't always work correctly. - -### What's the difference between open source software and other types of software? - -Some software has source code that only the person, team, or organization who created it—and maintains exclusive control over it—can modify. People call this kind of software "proprietary" or "closed source" software. - -Only the original authors of proprietary software can legally copy, inspect, and alter that software. And in order to use proprietary software, computer users must agree (usually by signing a license displayed the first time they run this software) that they will not do anything with the software that the software's authors have not expressly permitted. Microsoft Office and Adobe Photoshop are examples of proprietary software. - -Open source software is different. Its authors [make its source code available][2] to others who would like to view that code, copy it, learn from it, alter it, or share it. [LibreOffice][3] and the [GNU Image Manipulation Program][4] are examples of open source software. - -As they do with proprietary software, users must accept the terms of a [license][5] when they use open source software—but the legal terms of open source licenses differ dramatically from those of proprietary licenses. - -Open source licenses affect the way people can [use, study, modify, and distribute][6] software. In general, open source licenses grant computer users [permission to use open source software for any purpose they wish][7]. Some open source licenses—what some people call "copyleft" licenses—stipulate that anyone who releases a modified open source program must also release the source code for that program alongside it. Moreover, [some open source licenses][8] stipulate that anyone who alters and shares a program with others must also share that program's source code without charging a licensing fee for it. - -By design, open source software licenses promote collaboration and sharing because they permit other people to make modifications to source code and incorporate those changes into their own projects. They encourage computer programmers to access, view, and modify open source software whenever they like, as long as they let others do the same when they share their work. - -### Is open source software only important to computer programmers? - -No. Open source technology and open source thinking both benefit programmers and non-programmers. - -Because early inventors built much of the Internet itself on open source technologies—like [the Linux operating system][9] and the[ Apache Web server][10] application—anyone using the Internet today benefits from open source software. - -Every time computer users view web pages, check email, chat with friends, stream music online, or play multiplayer video games, their computers, mobile phones, or gaming consoles connect to a global network of computers using open source software to route and transmit their data to the "local" devices they have in front of them. The computers that do all this important work are typically located in faraway places that users don't actually see or can't physically access—which is why some people call these computers "remote computers." - -More and more, people rely on remote computers when performing tasks they might otherwise perform on their local devices. For example, they may use online word processing, email management, and image editing software that they don't install and run on their personal computers. Instead, they simply access these programs on remote computers by using a Web browser or mobile phone application. When they do this, they're engaged in "remote computing." - -Some people call remote computing "cloud computing," because it involves activities (like storing files, sharing photos, or watching videos) that incorporate not only local devices but also a global network of remote computers that form an "atmosphere" around them. - -Cloud computing is an increasingly important aspect of everyday life with Internet-connected devices. Some cloud computing applications, like Google Apps, are proprietary. Others, like ownCloud and Nextcloud, are open source. - -Cloud computing applications run "on top" of additional software that helps them operate smoothly and efficiently, so people will often say that software running "underneath" cloud computing applications acts as a "platform" for those applications. Cloud computing platforms can be open source or closed source. OpenStack is an example of an open source cloud computing platform. - -### Why do people prefer using open source software? - -People prefer open source software to proprietary software for a number of reasons, including: - -Control. Many people prefer open source software because they [have more control][11] over that kind of software. They can examine the code to make sure it's not doing anything they don't want it to do, and they can change parts of it they don't like. Users who aren't programmers also benefit from open source software, because they can use this software for any purpose they wish—not merely the way someone else thinks they should. - -Training. Other people like open source software because it helps them [become better programmers][12]. Because open source code is publicly accessible, students can easily study it as they learn to make better software. Students can also share their work with others, inviting comment and critique, as they develop their skills. When people discover mistakes in programs' source code, they can share those mistakes with others to help them avoid making those same mistakes themselves. - -Security. Some people prefer open source software because they consider it more [secure][13] and stable than proprietary software. Because anyone can view and modify open source software, someone might spot and correct errors or omissions that a program's original authors might have missed. And because so many programmers can work on a piece of open source software without asking for permission from original authors, they can fix, update, and upgrade open source software more [quickly][14] than they can proprietary software. - -Stability. Many users prefer open source software to proprietary software for important, long-term projects. Because programmers [publicly distribute][15] the source code for open source software, users relying on that software for critical tasks can be sure their tools won't disappear or fall into disrepair if their original creators stop working on them. Additionally, open source software tends to both incorporate and operate according to open standards. - -### Doesn't "open source" just mean something is free of charge? - -No. This is a [common misconception][16] about what "open source" implies, and the concept's implications are [not only economic][17]. - -Open source software programmers can charge money for the open source software they create or to which they contribute. But in some cases, because an open source license might require them to release their source code when they sell software to others, some programmers find that charging users money for software services and support (rather than for the software itself) is more lucrative. This way, their software remains free of charge, and they [make money helping others][18] install, use, and troubleshoot it. - -While some open source software may be free of charge, skill in programming and troubleshooting open source software can be [quite valuable][19]. Many employers specifically seek to [hire programmers with experience][20] working on open source software. - -### What is open source "beyond software"? - -At Opensource.com, we like to say that we're interested in the ways open source values and principles apply to the world beyond software. We like to think of open source as not only a way to develop and license computer software, but also an attitude. - -Approaching all aspects of life "[the open source way][21]" means expressing a willingness to share, collaborating with others in ways that are transparent (so that others can watch and join too), embracing failure as a means of improving, and expecting—even encouraging—everyone else to do the same. - -It also means committing to playing an active role in improving the world, which is possible only when [everyone has access][22] to the way that world is designed. - -The world is full of "source code"—[blueprints][23], [recipes][24], [rules][25]—that guide and shape the way we think and act in it. We believe this underlying code (whatever its form) should be open, accessible, and shared—so many people can have a hand in altering it for the better. - -Here, we tell stories about the impact of open source values on all areas of life—[science][26], [education][27], [government][28], [manufacturing][29], health, law, and [organizational dynamics][30]. We're a community committed to telling others how the open source way is the best way, because a love of open source is just like anything else: it's better when it's shared. - -Where can I learn more about open source? - -We've compiled several resources designed to help you learn more about [open source. We recommend you read our open source FAQs, how-to guides, and tutorials][31] to get started. - --------------------------------------------------------------------------------- - -via: https://opensource.com/resources/what-open-source - -作者:[opensource.com][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: opensource.com -[1]:https://opensource.com/open-source-way -[2]:https://opensource.com/business/13/5/open-source-your-code -[3]:https://www.libreoffice.org/ -[4]:http://www.gimp.org/ -[5]:https://opensource.com/law/13/1/which-open-source-software-license-should-i-use -[6]:https://opensource.com/law/10/10/license-compliance-not-problem-open-source-users -[7]:https://opensource.org/docs/osd -[8]:https://opensource.com/law/13/5/does-your-code-need-license -[9]:https://opensource.com/resources/what-is-linux -[10]:http://httpd.apache.org/ -[11]:https://opensource.com/life/13/5/tumblr-open-publishing -[12]:https://opensource.com/life/13/6/learning-program-open-source-way -[13]:https://opensource.com/government/10/9/scap-computer-security-rest-us -[14]:https://opensource.com/government/13/2/bug-fix-day -[15]:https://opensource.com/life/12/9/should-we-develop-open-source-openly -[16]:https://opensource.com/education/12/7/clearing-open-source-misconceptions -[17]:https://opensource.com/open-organization/16/5/appreciating-full-power-open -[18]:https://opensource.com/business/14/7/making-your-product-free-and-open-source-crazy-talk -[19]:https://opensource.com/business/16/2/add-open-source-to-your-resume -[20]:https://opensource.com/business/16/5/2016-open-source-jobs-report -[21]:https://opensource.com/open-source-way -[22]:https://opensource.com/resources/what-open-access -[23]:https://opensource.com/life/11/6/architecture-open-source-applications-learn-those-you -[24]:https://opensource.com/life/12/6/open-source-like-sharing-recipe -[25]:https://opensource.com/life/12/4/day-my-mind-became-open-sourced -[26]:https://opensource.com/resources/open-science -[27]:https://opensource.com/resources/what-open-education -[28]:https://opensource.com/resources/open-government -[29]:https://opensource.com/resources/what-open-hardware -[30]:https://opensource.com/resources/what-open-organization -[31]:https://opensource.com/resources diff --git a/translated/talk/20160808 What is open source.md b/translated/talk/20160808 What is open source.md new file mode 100644 index 0000000000..b0e2072d8c --- /dev/null +++ b/translated/talk/20160808 What is open source.md @@ -0,0 +1,121 @@ +什么是开源 +=========================== + +“开源”这个词,指的是事物设计为可以公开访问的,因此人们可以修改并分享。 + +这个词最初是起源于软件开发中,指的是一种开发软件的特殊形式。但到了今天,“开源”已经泛指一组概念——就是我们称之为的“[开源的方式][1]”。这些概念包括开源项目、产品,或是自发倡导和欢迎开放变化、协作参与、快速原型、透明、精英领导以及面向社区开发的原则。 + +### 什么是开源软件? + +开源软件的源代码任何人都可以审查、修改和增强。 + +“源代码”是软件中大部分计算机用户都没见过的部分,程序员可以修改代码来改变一个软件(“程序”或“应用”)如何工作。程序员如果可以接触到计算机程序源代码,就可以通过添加功能或修复问题的方式来改进这个软件。 + +### 开源软件和其它类型的软件有什么不同? + +一些软件只有创建它的人、团队、组织才能修改,并且控制维护工作。人们称这种软件是“专有”或“闭源”软件。 + +只有专有软件的最初作者可以合法地复制、审查,以及修改这个软件。为了使用专有软件,计算机用户必须同意(通常是在软件第一次运行的时候签署一份显示的许可)他们不会对软件做软件作者没有表态允许的事情。微软 Office 和 Adobe Photoshop 就是专有软件的例子。 + +开源软件不一样。它的作者[让源代码对其他人提供][2],需要的人都可以查看代码、复制、学习、修改或分享。[LibreOffice][3] 和 [GIMP][4] 是开源软件的例子。 + +就像专有软件那样,用户在使用开源软件时必须接受一份[许可][5]的条款——但开源许可的法律条款和专有软件的许可截然不同。 + +开源许可影响人们[使用、学习、修改以及分发][6]的方式。总的来说,开源许可赋予计算机用户以[权限来按他们想要的目的来使用开源软件][7]。一些开源许可(人们称之为“copyleft”)规定任何发布了修改过的开源软件的人,同时还要一同发布它的源代码。此外,[一些开源许可][8]规定任何修改和分享一个程序给其他人的人,还要分享这个程序的源代码,而且不能收取许可费用。 + +开源软件许可有意地提升了协作和分享,因为它们允许其他人对对代码作出修改并将改动包含到他们自己的项目中。开源许可鼓励开发者随时访问、查看、修改开源软件,前提是开发者在分享成果的时候允许其他人也能够做相同的事情。 + +### 开源软件只是对开发者很重要? + +不。开源技术和开源思想对开发者和非开发者都有益。 + +因为早期的创造者基于开源技术构建了互联网本身的大部分——比如 [Linux 操作系统][9]和 [Apache Web 服务器][10]应用——任何今天使用互联网的人都受益于开源软件。 + +每当计算机用户浏览网页、检查邮件、和朋友聊天、在线流媒体音乐、玩多人游戏的时候,他们的电脑、手机或游戏主机都会连接到一个全球计算机网络,使用开源软件来路由并将他们的数据传输到面前的“本地”设备上。完成这些重要工作的计算机通常位于很远的地方,用户不会实际看到或物理接触到它们——所以有些人称之为“远端计算机”。 + +越来越多的人开始依赖于远端计算机,在可以在本地完成的任务在线完成。举个例子,人们可能会使用在线文字处理、电子邮件管理、图片编辑工具,而在本地的个人电脑并没有安装运行相应的软件。人们轻松地使用浏览器或手机应用访问这些程序。当他们这么做的时候,他们参与到了“远端计算”中。 + +一些人将远端计算称为“云计算”,因为它涉及的活动(像是存储文件、分享照片、观看视频)不仅包含本地设备,还有一个远端计算机全球网络,像是围绕在周围的大气。 + +云计算是日常生活一个越来越重要的概念,离不开连接互联网的设备。一些云计算应用,像是 Google 应用,是专有的。其它的,像 OwnCloud 和 NextCould 是开源的。 + +云计算应用运行在一些额外的软件“之上”,这些软件帮助它们流畅高效地操作,所以人们经常说那个软件运行在云计算应用“之下”,为那些应用扮演一个“平台”。云计算平台可以是开源或闭源的。OpenStack 是一个开源云计算平台的例子。 + +### 为什么人们更倾向于使用开源软件? + +人们相对于专有软件更倾向于开源软件有很多原因,包括: + +可控。很多人青睐开源软件因为相对其它类型软件他们可以[拥有更多的可控][11]。他们可以检查代码来保证它没有做任何不希望它做的事情,并且可以改变不喜欢的部分。不是开发者的用户也可以从开源软件获益,因为他们可以以任何目的使用这个软件——而不仅仅是某些人认为他们应该有的目的。 + +训练。其他人喜欢开源软件是因为它可以帮助他们[成为更好的开发者][12]。因为开源代码可以公开访问,学生可以在学习创建更好的软件时可以轻松地从中学习。学生还可以在提升技能的时候分享他们的成果给别人,获得评价和批评。当人们发现程序源代码中的错误的时候,可以将这个错误分享给其他人,帮助他们避免犯同样的错误。 + +安全。一些人倾向开源软件是因为他们认为它比专有软件更[安全][13]和稳定。因为任何人都可以查看和修改开源软件,就有人可能会注意到并修正原作者遗漏的错误或疏忽。并且因为这么多的开发者可以在同一开源软件上工作,而不用事先联系获取原作者的授权,相比专有软件,他们可以更[快速][14]地修复、更新和升级开源软件。 + +稳定。许多用户在重要,长期的项目中相较专有软件更加青睐开源软件。因为开发者[公开分发][15]开源软件的源代码,如果最初的开发者停止开发了,关键任务依赖该软件的用户可以确保他们的工具不会消失,或是陷入无法修复的状态。另外,开源软件趋向于同时包含和按照开放标准进行操作。 + +### “开源”不是只是意味着某样东西是免费的吗? + +不。这是个“开源”实践中的[常见误解][16],“开源”概念的含义[不只是指经济方面的][17]。 + +开源软件开发者可以为他们创建或贡献的开源软件收取费用。但在一些情况下,由于开源许可可能会要求他们在将软件卖给他人的时候发布源代码,一些开发者发现向用户收取软件服务和支持(而不是软件本身)的费用会更加合算。通过这种方式,他们的软件仍然保持免费,而他们[从帮助他人][18]安装、使用、解决问题中赚取费用。 + +尽管一些开源软件可能是免费的,但开源软件的编程和解决问题的技能可能[十分有价值][19]。许多雇主特别寻求[雇佣在开源软件方面有工作经验的开发者][20]。 + +### 什么是“在软件之外”的开源? + +在 Opensource.com,我们想说我们对于开源价值和原则应用到软件之外领域的方式很有兴趣。我们更愿意不仅将开源视为一种计算机软件开发和许可的方式,也把它视作一种态度。 + +实现“[开源方式][21]”的生活的各个方面,意味着表达一种分享的意愿,通过透明的方式和他人协作(这样其他人也可以关注和加入),拥抱失败,将它作为一种改进的手段,以及期待(甚至鼓励)所有人都可以这么做。 + +这也意味着在让世界变得更好的过程中扮演一个积极的角色,这只有在[每个人都可以接触][22]到设计世界的途径时才有可能。 + +这个世界充满了“源代码”——[蓝图][23]、[食谱][24]、[规则][25]——它们引导和塑造我们思考和行动的方式。我们相信这些深层代码(无论是什么形式)应该是开放、可接触、分享的——这样人们可以参与其中并让它变得更好。 + +在这里,我们诉说开源价值对生活所有领域的影响的故事——[科学][26]、[教育][27]、[政府][28]、[工业][29]、健康、法律,以及[组织动态][30]。我们是一个社区,告诉他人开源的方式如何成为最好的方式,因为对开源的爱和其它一样:当它被分享的时候它会变得更好。 + +在哪里能够获得关于开源的更多信息? + +我们编辑了一些资源来帮助你学到更多关于[开源的内容。我们推荐你从阅读我们的开源问答、指南、教程][31]开始。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/resources/what-open-source + +作者:[opensource.com][a] +译者:[alim0x](https://github.com/alim0x) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: opensource.com +[1]:https://opensource.com/open-source-way +[2]:https://opensource.com/business/13/5/open-source-your-code +[3]:https://www.libreoffice.org/ +[4]:http://www.gimp.org/ +[5]:https://opensource.com/law/13/1/which-open-source-software-license-should-i-use +[6]:https://opensource.com/law/10/10/license-compliance-not-problem-open-source-users +[7]:https://opensource.org/docs/osd +[8]:https://opensource.com/law/13/5/does-your-code-need-license +[9]:https://opensource.com/resources/what-is-linux +[10]:http://httpd.apache.org/ +[11]:https://opensource.com/life/13/5/tumblr-open-publishing +[12]:https://opensource.com/life/13/6/learning-program-open-source-way +[13]:https://opensource.com/government/10/9/scap-computer-security-rest-us +[14]:https://opensource.com/government/13/2/bug-fix-day +[15]:https://opensource.com/life/12/9/should-we-develop-open-source-openly +[16]:https://opensource.com/education/12/7/clearing-open-source-misconceptions +[17]:https://opensource.com/open-organization/16/5/appreciating-full-power-open +[18]:https://opensource.com/business/14/7/making-your-product-free-and-open-source-crazy-talk +[19]:https://opensource.com/business/16/2/add-open-source-to-your-resume +[20]:https://opensource.com/business/16/5/2016-open-source-jobs-report +[21]:https://opensource.com/open-source-way +[22]:https://opensource.com/resources/what-open-access +[23]:https://opensource.com/life/11/6/architecture-open-source-applications-learn-those-you +[24]:https://opensource.com/life/12/6/open-source-like-sharing-recipe +[25]:https://opensource.com/life/12/4/day-my-mind-became-open-sourced +[26]:https://opensource.com/resources/open-science +[27]:https://opensource.com/resources/what-open-education +[28]:https://opensource.com/resources/open-government +[29]:https://opensource.com/resources/what-open-hardware +[30]:https://opensource.com/resources/what-open-organization +[31]:https://opensource.com/resources From 8ab962eab707016ce9dfd457fbca4904235db0a6 Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 20 Jun 2017 09:02:22 +0800 Subject: [PATCH 0469/1407] translated --- ...l Roundcube with Samba4 AD DC – Part 12.md | 283 ----------------- ...l Roundcube with Samba4 AD DC – Part 12.md | 285 ++++++++++++++++++ 2 files changed, 285 insertions(+), 283 deletions(-) delete mode 100644 sources/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md create mode 100644 translated/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md diff --git a/sources/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md b/sources/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md deleted file mode 100644 index 330fe13ee5..0000000000 --- a/sources/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md +++ /dev/null @@ -1,283 +0,0 @@ -translating---geekpi - -How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12 -============================================================ - -by [Matei Cezar][15] | Published: May 13, 2017 | Last Updated: May 14, 2017 - - Download Your Free eBooks NOW - [10 Free Linux eBooks for Administrators][16] | [4 Free Shell Scripting eBooks][17] - -[Roundcube][3], one of the most used webmail user agent in Linux, offers a modern web interface for end users to interact with all mail services in order to read, compose and send e-mails. Roundcube supports a variety of mail protocols, including the secured ones, such IMAPS, POP3S or submission. - -In this topic we’ll discuss how to configure Roundcube in iRedMail with IMAPS and submission secured ports to retrieve and send emails for Samba4 AD accounts, how to access iRedMail Roundcube web interface from a browser and add a web address alias, how to enable Samba4 AD integration for Global LDAP Address Book and how to disable some unneeded iRedMail services. - -#### Requirements - -1. [How to Install iRedMail on CentOS 7 for Samba4 AD Integration][1] - -2. [Configure iRedMail on CentOS 7 for Samba4 AD Integration][2] - -### Step 1: Declare E-mail Address for Domain Accounts in Samba4 AD DC - -1. In order send and receive mail for Samba4 AD DC domain accounts, you need to edit each user account and explicitly set email filed with the proper e-mail address by opening ADUC tool from a [Windows machine with RSAT tools installed][4] and joined to Samba4 AD as illustrated in the below image. - - [![Add Email Account to Join Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-User-and-Computers.jpg)][5] - -Add Email Account to Join Samba4 AD DC - -2. Similarly, to use mail lists, you need to create groups in ADUC, add the corresponding e-mail address for each group and assign the proper user accounts as members of the group. - -With this setup created as a mail list, all members mailboxes of a Samba4 AD group will receive mail destined for an AD group e-mail address. Use the below screenshots as a guide to declare e-mail filed for a Samba4 group account and add domain users as members of the group. - -Make sure all accounts members added to a group have their e-mail address declared. - - [![Create Group Admin for Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/05/Create-Group-Admin-for-Samba4-AD-DC.png)][6] - -Create Group Admin for Samba4 AD DC - - [![Add Users to Group](https://www.tecmint.com/wp-content/uploads/2017/05/Add-Users-to-Group.png)][7] - -Add Users to Group - -In this example, all mails sent to admins@tecmint.lan e-mail address declared for ‘Domain Admins’ group will be received by each member mailbox of this group. - -3. An alternative method that you can use to declare the e-mail address for a Samba4 AD account is by creating a user or a group with samba-tool command line directly from one of the AD DC console and specify the e-mail address with the `--mail-address` flag. - -Use one of the following command syntax to create a user with e-mail address specified: - -``` -# samba-tool user add --mail-address=user_email@domain.tld --surname=your_surname --given-name=your_given_name your_ad_user -``` - -Create a group with e-mail address specified: - -``` -# samba-tool group add --mail-address=group_email@domain.tld your_ad_group -``` - -To add members to a group: - -``` -# samba-tool group addmembers your_group user1,user2,userX -``` - -To list all available samba-tool command fields for a user or a group use the following syntax: - -``` -# samba-tool user add -h -# samba-tool group add -h -``` - -### Step 3: Secure Roundcube Webmail - -4. Before modifying Roundcube configuration file, first, use [netstat command][8] piped through egrep filter to list the sockets that [Dovecot and Postfix][9] listen to and assure that the properly secured ports (993 for IMAPS and 587 for submission) are active and enabled. - -``` -# netstat -tulpn| egrep 'dovecot|master' -``` - -5. To enforce mail reception and transfer between Roundcube and iRedMail services on secured IMAP and SMTP ports, open Roundcube configuration file located in /var/www/roundcubemail/config/config.inc.php and make sure you change the following lines, for localhost in this case, as shown in the below excerpt: - -``` -// For IMAPS -$config['default_host'] = 'ssl://127.0.0.1'; -$config['default_port'] = 993; -$config['imap_auth_type'] = 'LOGIN'; -// For SMTP -$config['smtp_server'] = 'tls://127.0.0.1'; -$config['smtp_port'] = 587; -$config['smtp_user'] = '%u'; -$config['smtp_pass'] = '%p'; -$config['smtp_auth_type'] = 'LOGIN'; -``` - -This setup is highly recommended in case Roudcube is installed on a remote host than the one that provides mail services (IMAP, POP3 or SMTP daemons). - -6. Next, don’t close the configuration file, search and make the following small changes in order for Roundcube to be visited only via HTTPS protocol, to hide the version number and to automatically append the domain name for accounts who login in the web interface. - -``` -$config['force_https'] = true; -$config['useragent'] = 'Your Webmail'; // Hide version number -$config['username_domain'] = 'domain.tld' -``` - -7. Also, disable the following plugins: managesieve and password by adding a comment `(//)` in front of the line that starts with $config[‘plugins’]. - -Users will change their password from a Windows or Linux machine joined to Samba4 AD DC once they login and authenticate to the domain. A sysadmin will globally manage all sieve rules for domain accounts. - -``` -// $config['plugins'] = array('managesieve', 'password'); -``` - -8. Finally, save and close the configuration file and visit Roundcube Webmail by opening a browser and navigate to iRedMail IP address or FQDN/mail location via HTTPS protocol. - -The first time when you visit Roundcube an alert should appear on the browser due to the Self-Signed Certificate the web server uses. Accept the certificate and login with a Samba AD account credentials. - -``` -https://iredmail-FQDN/mail -``` - [![Roundcube Webmail Login](https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-Webmail-Login.png)][10] - -Roundcube Webmail Login - -### Step 3: Enable Samba AD Contacts in Roundcube - -9. To configure Samba AD Global LDAP Address Book to appear Roundcube Contacts, open Roundcube configuration file again for editing and make the following changes: - -Navigate to the bottom of the file and identify the section that begins with ‘# Global LDAP Address Book with AD’, delete all its content until the end of the file and replace it with the following code block: - -``` -# Global LDAP Address Book with AD. -# -$config['ldap_public']["global_ldap_abook"] = array( -'name' => 'tecmint.lan', -'hosts' => array("tecmint.lan"), -'port' => 389, -'use_tls' => false, -'ldap_version' => '3', -'network_timeout' => 10, -'user_specific' => false, -'base_dn' => "dc=tecmint,dc=lan", -'bind_dn' => "vmail@tecmint.lan", -'bind_pass' => "your_password", -'writable' => false, -'search_fields' => array('mail', 'cn', 'sAMAccountName', 'displayname', 'sn', 'givenName'), -'fieldmap' => array( -'name' => 'cn', -'surname' => 'sn', -'firstname' => 'givenName', -'title' => 'title', -'email' => 'mail:*', -'phone:work' => 'telephoneNumber', -'phone:mobile' => 'mobile', -'department' => 'departmentNumber', -'notes' => 'description', -), -'sort' => 'cn', -'scope' => 'sub', -'filter' => '(&(mail=*)(|(&(objectClass=user)(!(objectClass=computer)))(objectClass=group)))', -'fuzzy_search' => true, -'vlv' => false, -'sizelimit' => '0', -'timelimit' => '0', -'referrals' => false, -); -``` - -On this block of code replace name, hosts, base_dn, bind_dn and bind_pass values accordingly. - -10. After you’ve made all the required changes, save and close the file, login to Roundcube webmail interface and go to Address Book menu. - -Hit on your Global Address Book chosen name and a contact list of all domain accounts (users and groups) with their specified e-mail address should be visible. - - [![Roundcube User Contact List](https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-User-Contact-List.png)][11] - -Roundcube User Contact List - -### Step 4: Add an Alias for Roundcube Webmail Interface - -11. To visit Roundcube at a web address with the following form https://webmail.domain.tld instead of the old address provided by default by iRedMail you need to make the following changes. - -From a joined Windows machine with RSAT tools installed, open DNS Manager and add a new CNAME record for iRedMail FQDN, named webmail, as illustrated in the following image. - - [![DNS Webmail Properties](https://www.tecmint.com/wp-content/uploads/2017/05/DNS-Webmail-Properties.jpg)][12] - -DNS Webmail Properties - -12. Next, on iRedMail machine, open Apache web server SSL configuration file located in /etc/httpd/conf.d/ssl.conf and change DocumentRoot directive to point to /var/www/roundcubemail/ system path. - -file /etc/httpd/conf.d/ssl.conf excerpt: - -``` -DocumentRoot “/var/www/roundcubemail/” -``` - -Restart Apache daemon to apply changes. - -``` -# systemctl restart httpd -``` - -13. Now, point the browser to the following address and Roundcube interface should appear. Accept the Self-Signed Cerificate error to continue to login page. Replace domain.tld from this example with your own domain name. - -``` -https://webmail.domain.tld -``` - -### Step 5: Disable iRedMail Unused Services - -14. Since iRedMail daemons are configured to query Samba4 AD DC LDAP server for account information and other resources, you can safely stop and disable some local services on iRedMail machine, such as LDAP database server and iredpad service by issuing the following commands. - -``` -# systemctl stop slapd iredpad -# systemctl disable slapd iredpad -``` - -15. Also, disable some scheduled tasks performed by iRedMail, such as LDAP database backup and iRedPad tracking records by adding a comment (#) in front of each line from crontab file as illustrated on the below screenshot. - -``` -# crontab -e -``` - [![Disable iRedMail Tasks](https://www.tecmint.com/wp-content/uploads/2017/05/Disable-iRedMail-Tasks.png)][13] - -Disable iRedMail Tasks - -### Step 6: Use Mail Alias in Postfix - -16. To redirect all locally generated mail (destined for postmaster and subsequently redirected to root account) to a specific Samba4 AD account, open Postfix aliases configuration file located in /etc/postfix/aliases and modify root line as follows: - -``` -root: your_AD_email_account@domain.tld -``` - -17. Apply the aliases configuration file so that Postfix can read it in its own format by executing newaliases command and test if the mail gets sent to the proper domain e-email account by issuing the following command. - -``` -# echo “Test mail” | mail -s “This is root’s email” root -``` - -18. After the mail has been sent, login to Roundcube webmail with the domain account you’ve setup for mail redirection and verify the previously sent mail should be received in your account Inbox. - - [![Verify User Mail](https://www.tecmint.com/wp-content/uploads/2017/05/Verify-User-Mail.png)][14] - -Verify User Mail - -That’all! Now, you have a fully working mail server integrated with Samba4 Active Directory. Domain accounts can send and receive mail for their internal domain or for other external domains. - -The configurations used in this tutorial can be successfully applied to integrate an iRedMail server to a Windows Server 2012 R2 or 2016 Active Directory. - --------------------------------------------------------------------------------- - -作者简介: - -I'am a computer addicted guy, a fan of open source and linux based system software, have about 4 years experience with Linux distributions desktop, servers and bash scripting. - ------------ - - -via: https://www.tecmint.com/integrate-iredmail-roundcube-with-samba4-ad-dc/ - -作者:[ ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.tecmint.com/author/cezarmatei/ -[1]:https://www.tecmint.com/install-iredmail-on-centos-7-for-samba4-ad-integration/ -[2]:https://www.tecmint.com/integrate-iredmail-to-samba4-ad-dc-on-centos-7/ -[3]:https://www.tecmint.com/install-and-configure-roundcube-webmail-for-postfix-mail-server/ -[4]:https://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/ -[5]:https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-User-and-Computers.jpg -[6]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-Group-Admin-for-Samba4-AD-DC.png -[7]:https://www.tecmint.com/wp-content/uploads/2017/05/Add-Users-to-Group.png -[8]:https://www.tecmint.com/20-netstat-commands-for-linux-network-management/ -[9]:https://www.tecmint.com/configure-postfix-and-dovecot-with-virtual-domain-users-in-linux/ -[10]:https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-Webmail-Login.png -[11]:https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-User-Contact-List.png -[12]:https://www.tecmint.com/wp-content/uploads/2017/05/DNS-Webmail-Properties.jpg -[13]:https://www.tecmint.com/wp-content/uploads/2017/05/Disable-iRedMail-Tasks.png -[14]:https://www.tecmint.com/wp-content/uploads/2017/05/Verify-User-Mail.png -[15]:https://www.tecmint.com/author/cezarmatei/ -[16]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ -[17]:https://www.tecmint.com/free-linux-shell-scripting-books/ diff --git a/translated/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md b/translated/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md new file mode 100644 index 0000000000..f53025621d --- /dev/null +++ b/translated/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md @@ -0,0 +1,285 @@ +如何在 Samba4 AD 中集成 iRedMail Roundcube - 第 12 部分 +============================================================ + +by [Matei Cezar][15] | 发布日期: 2017-05-13 | 更新日期: 2017-05-14 + + Download Your Free eBooks NOW - [10 Free Linux eBooks for Administrators][16] | [4 Free Shell Scripting eBooks][17] +现在下载你的免费电子书 - [10 本给管理员的免费电子书][16] | [4 本免费的 shell 脚本电子书][17] + +[Roundcube][3] 是 Linux 中最常用的 Webmail 用户代理之一,它为终端用户提供了一个现代化的 Web 界面,它可以与所有邮件服务进行交互,以便阅读、撰写和发送电子邮件。Roundcube 支持各种邮件协议,包括安全的邮件协议,如IMAPS,POP3S 或者 submission。 + +在本文中,我们将讨论如何在 iRedMail 中使用 IMAPS 以及 submission 安全端口配置 Roundcube,以检索和发送 Samba4 AD 帐户的电子邮件、如何从浏览器访问 iRedMail Roundcube Web 界面,并添加网址别名、如何启用 Samba4 AD 集成全局 LDAP 地址簿以及如何禁用某些不需要的 iRedMail 服务。 + +#### 要求 + +1. [如何在 CentOS 7 上安装 iRedMail,用于Samba4 AD集成][1] + +2. [在 CentOS 7 上配置 iRedMail,用于 Samba4 AD 集成][2] + +### 第一步:在 Samba4 AD DC 中声明域帐户的电子邮件地址 + +1. 为了发送和接收 Samba4 AD DC 域账户的邮件,您需要编辑每个用户帐户,如下所示,通过从[安装了 RSAT 工具的 Windows 机器][4]并且已经加入 Samba4 AD 中打开 ADUC 工具显式地在邮箱字段填写正确的地址。 + + [![Add Email Account to Join Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-User-and-Computers.jpg)][5] + +添加邮箱帐户来加入 Samba4 AD DC + +2. 相似地,要使用邮件列表,你需要在 ADUC 中创建组,为每个组添加相应的电子邮件地址,并分配合适的用户帐户作为每个组的成员。 + +这步创建了一个邮件列表,所有 Samba4 AD 组成员的邮箱都会收到给这个 AD 组邮箱地址的邮件。使用下面的截图作为指导为 Samba4 组声明电子邮件字段,并为组添加域成员。 + +确保所有的域账户成员都添加到了声明了邮件地址的组中。 + + [![Create Group Admin for Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/05/Create-Group-Admin-for-Samba4-AD-DC.png)][6] + +为 Samba4 AD DC 创建组管理员 + + [![Add Users to Group](https://www.tecmint.com/wp-content/uploads/2017/05/Add-Users-to-Group.png)][7] + +将用户添加到组 + +在本例中,发送给 admins@tecmint.lan 的所有邮件地址将被该组的每个成员邮箱接收,它是 “Domain Admins” 组声明的电子邮件地址。 + +3. 你可以声明 Samba4 AD 帐户的电子邮件地址的另一种方法是直接从其中一个 AD DC 控制台使用 samba-tool 命令行创建一个用户或组,并使用 `--mail-address` 标志指定邮件地址。 + +使用下面其中一个命令创建一个指定邮件地址的用户: + +``` +# samba-tool user add --mail-address=user_email@domain.tld --surname=your_surname --given-name=your_given_name your_ad_user +``` + +创建一个指定邮件地址的组: + +``` +# samba-tool group add --mail-address=group_email@domain.tld your_ad_group +``` + +将成员添加到组中: + +``` +# samba-tool group addmembers your_group user1,user2,userX +``` + +使用下面的语法列出 samba-tool 中有关用户或者组的命令字段: + +``` +# samba-tool user add -h +# samba-tool group add -h +``` + +### 第二步:安全 Roundcube Webmail + +4. 开始修改 Roundcube 配置文件之前,首先使用[ netstat 命令][8]管道输出给 egrep 过滤器来列出[ Dovecot 和 Postfix ][9]监听的套接字,并确保安全端口(IMAPS 是 993,submission 是 587 )是活跃的并且已启用。 + +``` +# netstat -tulpn| egrep 'dovecot|master' +``` + +5. 要强制邮件的接收和发送在使用安全的 IMAP 和 SMTP 端口的 Roundcube 以及 iRedMail 服务之间,打开位于 /var/www/roundcubemail/config/config.inc.php 的 Roundcube 配置文件并确保你修改过了下面的行,本例中是 localhost,如下片段所示: + + +``` +// For IMAPS +$config['default_host'] = 'ssl://127.0.0.1'; +$config['default_port'] = 993; +$config['imap_auth_type'] = 'LOGIN'; +// For SMTP +$config['smtp_server'] = 'tls://127.0.0.1'; +$config['smtp_port'] = 587; +$config['smtp_user'] = '%u'; +$config['smtp_pass'] = '%p'; +$config['smtp_auth_type'] = 'LOGIN'; +``` + +这步强烈建议在远程主机中安装 Roudcube,而不是提供了邮件服务的主机中(IMAP、POP3 或者 SMTP 守护进程)。 + +6. 接下来,不要关闭配置文件,搜索并做如下小的修改以便 Roundcube 能够通过 HTTPS 协议访问、隐藏版本号以及自动为登录 Web 界面的帐户追加域名。 + +``` +$config['force_https'] = true; +$config['useragent'] = 'Your Webmail'; // Hide version number +$config['username_domain'] = 'domain.tld' +``` + +7. 同样,禁用下面的插件:managesieve 和 password,通过在以 $config[‘plugins’] 开头的行前添加注释 `(//)`。 + +一旦登录并验证了域,用户将从连接到 Samba4 AD DC 的 Windows 或 Linux 机器上更改密码。系统管理员将全局管理域帐户的所有筛选规则。 + +``` +// $config['plugins'] = array('managesieve', 'password'); +``` + +8. 最后,保存并关闭配置文件,并打开浏览器访问 Roundcube Webmail,通过 HTTPS 协议进入 iRedMail IP 地址或者 FQDN/mail 位置。 + +由于浏览器使用的是自签名证书,所以你首次访问 Roundcube 会在浏览器上看到一个警告。接受证书并用 Samba AD 帐户凭证登录。 + +``` +https://iredmail-FQDN/mail +``` + [![Roundcube Webmail Login](https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-Webmail-Login.png)][10] + +Roundcube Webmail 登录 + +### 第三步:在 Roundcube 中启用 Samba AD 联系人 + +9. 要配置 Samba AD 全局 LDAP 地址簿以在 Roundcube 联系人中显示,再次打开 Roundcube 配置文件,并做如下修改: + +到达文件的底部,并辨认以 “# Global LDAP Address Book with AD” 开头的部分,删除到文件底部的所有内容,并替换成如下代码段: + +``` +# Global LDAP Address Book with AD. +# +$config['ldap_public']["global_ldap_abook"] = array( +'name' => 'tecmint.lan', +'hosts' => array("tecmint.lan"), +'port' => 389, +'use_tls' => false, +'ldap_version' => '3', +'network_timeout' => 10, +'user_specific' => false, +'base_dn' => "dc=tecmint,dc=lan", +'bind_dn' => "vmail@tecmint.lan", +'bind_pass' => "your_password", +'writable' => false, +'search_fields' => array('mail', 'cn', 'sAMAccountName', 'displayname', 'sn', 'givenName'), +'fieldmap' => array( +'name' => 'cn', +'surname' => 'sn', +'firstname' => 'givenName', +'title' => 'title', +'email' => 'mail:*', +'phone:work' => 'telephoneNumber', +'phone:mobile' => 'mobile', +'department' => 'departmentNumber', +'notes' => 'description', +), +'sort' => 'cn', +'scope' => 'sub', +'filter' => '(&(mail=*)(|(&(objectClass=user)(!(objectClass=computer)))(objectClass=group)))', +'fuzzy_search' => true, +'vlv' => false, +'sizelimit' => '0', +'timelimit' => '0', +'referrals' => false, +); +``` + +在这段代码中替换相应的 name、hosts、base_dn、bind_dn 和 bind_pass 的值。 + +10. 做了所需修改后,保存并关闭文件,登录 Roundcube webmail 界面,并进入地址簿菜单。 + +所有域名帐户(用户和组)与其指定的电子邮件地址的联系人列表都将被显示在全局地址簿上。 + + [![Roundcube User Contact List](https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-User-Contact-List.png)][11] + +Roundcube 用户联系人列表 + +### 第四步:为 Roundcube Webmail 界面添加一个别名 + +11. 要从 https://webmail.domain.tld 访问 Roundcube 而不是从 iRedMail 默认提供的旧地址,你需要进行以下更改。 + +在已安装 RSAT 工具的已加入的 Windows 机器上打开 DNS 管理器,并如下所示,添加一条 iRedMail FQDN、named webmail 的 CNAME 记录。 + + [![DNS Webmail Properties](https://www.tecmint.com/wp-content/uploads/2017/05/DNS-Webmail-Properties.jpg)][12] + +DNS Webmail 属性 + +12. 接下来,在 iRedMail 机器中,打开位于 /etc/httpd/conf.d/ssl.conf 的 Apache Web 服务器的 SSL 配置文件,将 DocumentRoot 指向 /var/www/roundcubemail/。 + +修改 /etc/httpd/conf.d/ssl.conf 片段: + + +``` +DocumentRoot “/var/www/roundcubemail/” +``` + +重启 Apache 使更改生效。 + +``` +# systemctl restart httpd +``` + +13. 现在打开下面的地址,Roundcube 界面应该会显示出来。接受自签名证书错误以进入登录页面。用你自己的域名替换例子中的 domain.tld。 + +``` +https://webmail.domain.tld +``` + +### 第五步:禁用 iRedMail 未使用的服务 + +14. 由于 iRedMail 守护进程配置为查询 Samba4 AD DC LDAP 服务器的帐户信息和其他资源,因此可以通过使用以下命令来安全地停止和禁用 iRedMail 机器上的某些本地服务,例如 LDAP 数据库服务器和 iredpad 服务。 + + +``` +# systemctl stop slapd iredpad +# systemctl disable slapd iredpad +``` + +15. 另外,如下图所示,通过在 crontab 文件中的每行之前添加注释(#),禁用 iRedMail 执行的某些计划任务,例如 LDAP 数据库备份和 iRedPad 跟踪记录。 + +``` +# crontab -e +``` + [![Disable iRedMail Tasks](https://www.tecmint.com/wp-content/uploads/2017/05/Disable-iRedMail-Tasks.png)][13] + +禁用 iRedMail 任务 + +### 第六步:在 Postfix 中使用邮件别名 + +16. 要将所有本地生成的邮件(发往 postmaster 并随后重定向到 root 帐户)重定向到特定的 Samba4 AD 帐户,请打开位于 /etc/postfix/aliases 中的 Postfix 别名配置文件,并修改root行,如下所示: + +``` +root: your_AD_email_account@domain.tld +``` + +17. 应用别名配置文件,以便 Postfix 可以通过执行 newaliases 命令以其自己的格式读取它,并测试邮件是否通过发出以下命令发送到正确的域电子邮件帐户。 + +``` +# echo “Test mail” | mail -s “This is root’s email” root +``` + +18. 邮件发送完毕后,请使用你为邮件重定向设置的域帐户登录 Roundcube webmail,并验证先前发送的邮件应该在你的帐户收件箱中。 + + [![Verify User Mail](https://www.tecmint.com/wp-content/uploads/2017/05/Verify-User-Mail.png)][14] + +验证用户邮件 + +就是这样了!现在你已经有了一个完全工作的与 Samba4 AD 集成的邮件服务器了。域帐户可以用它们的内部或者其他外部域发送和接收邮件了。 + +本教程中使用的配置可以成功将 iRedMail 服务器集成到 Windows Server 2012 R2 或 2016 AD 中。 + +-------------------------------------------------------------------------------- + +作者简介: + +我是一个电脑上瘾的家伙,开源和基于 linux 的系统软件的粉丝,在 Linux 发行版桌面、服务器和 bash 脚本方面拥有大约4年的经验。 + +----------- + + +via: https://www.tecmint.com/integrate-iredmail-roundcube-with-samba4-ad-dc/ + +作者:[ ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/cezarmatei/ +[1]:https://www.tecmint.com/install-iredmail-on-centos-7-for-samba4-ad-integration/ +[2]:https://www.tecmint.com/integrate-iredmail-to-samba4-ad-dc-on-centos-7/ +[3]:https://www.tecmint.com/install-and-configure-roundcube-webmail-for-postfix-mail-server/ +[4]:https://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/ +[5]:https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-User-and-Computers.jpg +[6]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-Group-Admin-for-Samba4-AD-DC.png +[7]:https://www.tecmint.com/wp-content/uploads/2017/05/Add-Users-to-Group.png +[8]:https://www.tecmint.com/20-netstat-commands-for-linux-network-management/ +[9]:https://www.tecmint.com/configure-postfix-and-dovecot-with-virtual-domain-users-in-linux/ +[10]:https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-Webmail-Login.png +[11]:https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-User-Contact-List.png +[12]:https://www.tecmint.com/wp-content/uploads/2017/05/DNS-Webmail-Properties.jpg +[13]:https://www.tecmint.com/wp-content/uploads/2017/05/Disable-iRedMail-Tasks.png +[14]:https://www.tecmint.com/wp-content/uploads/2017/05/Verify-User-Mail.png +[15]:https://www.tecmint.com/author/cezarmatei/ +[16]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[17]:https://www.tecmint.com/free-linux-shell-scripting-books/ From 3715681c7742b672145820cfa2a60e85237265d2 Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 20 Jun 2017 09:10:15 +0800 Subject: [PATCH 0470/1407] translating --- ...and Integrate iRedMail Services to Samba4 AD DC – Part 11.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md b/sources/tech/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md index d6db5b482c..40db1735f0 100644 --- a/sources/tech/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md +++ b/sources/tech/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md @@ -1,3 +1,5 @@ +translating---geekpi + How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11 ============================================================ From 6a12a1a64e54f77b83226fa244f8f11cb42050ab Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 20 Jun 2017 09:22:58 +0800 Subject: [PATCH 0471/1407] translating --- .../tech/20170209 The benefits of tracking issues publicly.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170209 The benefits of tracking issues publicly.md b/sources/tech/20170209 The benefits of tracking issues publicly.md index 40d190cfb9..56b66b5daf 100644 --- a/sources/tech/20170209 The benefits of tracking issues publicly.md +++ b/sources/tech/20170209 The benefits of tracking issues publicly.md @@ -1,3 +1,5 @@ +translating-----geekpi + The benefits of tracking issues publicly ============================================================ From 7513635a702be84b1d7974f6fc35f7bf70f05839 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 20 Jun 2017 14:28:56 +0800 Subject: [PATCH 0472/1407] PRF&PUB:20160808 What is open source.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @alim0x 翻译的很好~ --- .../20160808 What is open source.md | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) rename {translated/talk => published}/20160808 What is open source.md (52%) diff --git a/translated/talk/20160808 What is open source.md b/published/20160808 What is open source.md similarity index 52% rename from translated/talk/20160808 What is open source.md rename to published/20160808 What is open source.md index b0e2072d8c..0f3bdcefea 100644 --- a/translated/talk/20160808 What is open source.md +++ b/published/20160808 What is open source.md @@ -1,29 +1,31 @@ -什么是开源 +什么是开源? =========================== -“开源”这个词,指的是事物设计为可以公开访问的,因此人们可以修改并分享。 +![](https://opensource.com/sites/default/files/styles/image-full-size/public/images/resources/OSDC_Resource_Main_Page.png?itok=HP4NenAL) -这个词最初是起源于软件开发中,指的是一种开发软件的特殊形式。但到了今天,“开源”已经泛指一组概念——就是我们称之为的“[开源的方式][1]”。这些概念包括开源项目、产品,或是自发倡导和欢迎开放变化、协作参与、快速原型、透明、精英领导以及面向社区开发的原则。 +“开源open source”这个词,指的是事物规划为可以公开访问的,因此人们可以修改并分享。 + +这个词最初是起源于软件开发中,指的是一种开发软件的特殊形式。但到了今天,“开源”已经泛指一组概念——就是我们称之为的“[开源的方式][1]”。这些概念包括开源项目、产品,或是自发倡导并欢迎开放变化、协作参与、快速原型、公开透明、精英体制以及面向社区开发的原则。 ### 什么是开源软件? 开源软件的源代码任何人都可以审查、修改和增强。 -“源代码”是软件中大部分计算机用户都没见过的部分,程序员可以修改代码来改变一个软件(“程序”或“应用”)如何工作。程序员如果可以接触到计算机程序源代码,就可以通过添加功能或修复问题的方式来改进这个软件。 +“源代码source code”是软件中大部分计算机用户都没见过的部分,程序员可以修改代码来改变一个软件(“程序”或“应用”)工作的方式。程序员如果可以接触到计算机程序源代码,就可以通过添加功能或修复问题来改进这个软件。 ### 开源软件和其它类型的软件有什么不同? -一些软件只有创建它的人、团队、组织才能修改,并且控制维护工作。人们称这种软件是“专有”或“闭源”软件。 +有些软件只有创建它的人、团队、组织才能修改,并且控制维护工作。人们称这种软件是“专有proprietary”或“闭源closed source”软件。 -只有专有软件的最初作者可以合法地复制、审查,以及修改这个软件。为了使用专有软件,计算机用户必须同意(通常是在软件第一次运行的时候签署一份显示的许可)他们不会对软件做软件作者没有表态允许的事情。微软 Office 和 Adobe Photoshop 就是专有软件的例子。 +专有软件只有原作者可以合法地复制、审查,以及修改这个软件。为了使用专有软件,计算机用户必须同意(通常是在软件第一次运行的时候签署一份显示的许可)他们不会对软件做软件作者没有表态允许的事情。微软 Office 和 Adobe Photoshop 就是专有软件的例子。 -开源软件不一样。它的作者[让源代码对其他人提供][2],需要的人都可以查看代码、复制、学习、修改或分享。[LibreOffice][3] 和 [GIMP][4] 是开源软件的例子。 +开源软件不一样。它的作者[让源代码对其他人提供][2],需要的人都可以查看、复制、学习、修改或分享代码。[LibreOffice][3] 和 [GIMP][4] 是开源软件的例子。 -就像专有软件那样,用户在使用开源软件时必须接受一份[许可][5]的条款——但开源许可的法律条款和专有软件的许可截然不同。 +就像专有软件那样,用户在使用开源软件时必须接受一份[许可证][5]的条款——但开源许可的法律条款和专有软件的许可截然不同。 -开源许可影响人们[使用、学习、修改以及分发][6]的方式。总的来说,开源许可赋予计算机用户以[权限来按他们想要的目的来使用开源软件][7]。一些开源许可(人们称之为“copyleft”)规定任何发布了修改过的开源软件的人,同时还要一同发布它的源代码。此外,[一些开源许可][8]规定任何修改和分享一个程序给其他人的人,还要分享这个程序的源代码,而且不能收取许可费用。 +开源许可证影响人们[使用、学习、修改以及分发][6]的方式。总的来说,开源许可证赋予计算机用户[按他们想要的目的来使用开源软件的许可][7]。一些开源许可证(人们称之为左版copyleft”)规定任何发布了修改过的开源软件的人,同时还要一同发布它的源代码。此外,[另一些开源许可][8]规定任何修改和分享一个程序给其他人的人,还要分享这个程序的源代码,而且不能收取许可费用。 -开源软件许可有意地提升了协作和分享,因为它们允许其他人对对代码作出修改并将改动包含到他们自己的项目中。开源许可鼓励开发者随时访问、查看、修改开源软件,前提是开发者在分享成果的时候允许其他人也能够做相同的事情。 +开源软件许可证有意地提升了协作和分享,因为它们允许其他人对代码作出修改并将改动包含到他们自己的项目中。开源许可证鼓励开发者随时访问、查看、修改开源软件,前提是开发者在分享成果的时候允许其他人也能够做相同的事情。 ### 开源软件只是对开发者很重要? @@ -31,13 +33,13 @@ 因为早期的创造者基于开源技术构建了互联网本身的大部分——比如 [Linux 操作系统][9]和 [Apache Web 服务器][10]应用——任何今天使用互联网的人都受益于开源软件。 -每当计算机用户浏览网页、检查邮件、和朋友聊天、在线流媒体音乐、玩多人游戏的时候,他们的电脑、手机或游戏主机都会连接到一个全球计算机网络,使用开源软件来路由并将他们的数据传输到面前的“本地”设备上。完成这些重要工作的计算机通常位于很远的地方,用户不会实际看到或物理接触到它们——所以有些人称之为“远端计算机”。 +每当计算机用户浏览网页、检查邮件、和朋友聊天、在线收听流媒体音乐、玩多人游戏的时候,他们的电脑、手机或游戏主机都会连接到一个全球性的计算机网络,使用开源软件来路由并将他们的数据传输到面前的“本地”设备上。完成这些重要工作的计算机通常位于很远的地方,用户不会实际看到或物理接触到它们——所以有些人称之为“远程计算机”。 -越来越多的人开始依赖于远端计算机,在可以在本地完成的任务在线完成。举个例子,人们可能会使用在线文字处理、电子邮件管理、图片编辑工具,而在本地的个人电脑并没有安装运行相应的软件。人们轻松地使用浏览器或手机应用访问这些程序。当他们这么做的时候,他们参与到了“远端计算”中。 +越来越多的人开始依赖于远程计算机,在可以在本地完成的任务在线完成。举个例子,人们可能会使用在线文字处理、电子邮件管理、图片编辑工具,而在本地的个人电脑并没有安装运行相应的软件。人们轻松地使用浏览器或手机应用访问这些程序。当他们这么做的时候,他们参与到了“远程计算”中。 -一些人将远端计算称为“云计算”,因为它涉及的活动(像是存储文件、分享照片、观看视频)不仅包含本地设备,还有一个远端计算机全球网络,像是围绕在周围的大气。 +一些人将远程计算称为“云计算”,因为它涉及的活动(像是存储文件、分享照片、观看视频)不仅包含本地设备,还有一个远程计算机全球网络,像是围绕在周围的大气。 -云计算是日常生活一个越来越重要的概念,离不开连接互联网的设备。一些云计算应用,像是 Google 应用,是专有的。其它的,像 OwnCloud 和 NextCould 是开源的。 +云计算是日常生活一个越来越重要的概念,离不开连接互联网的设备。一些云计算应用,比如 Google 应用,是专有的。其它的,像 OwnCloud 和 NextCould 是开源的。 云计算应用运行在一些额外的软件“之上”,这些软件帮助它们流畅高效地操作,所以人们经常说那个软件运行在云计算应用“之下”,为那些应用扮演一个“平台”。云计算平台可以是开源或闭源的。OpenStack 是一个开源云计算平台的例子。 @@ -45,19 +47,19 @@ 人们相对于专有软件更倾向于开源软件有很多原因,包括: -可控。很多人青睐开源软件因为相对其它类型软件他们可以[拥有更多的可控][11]。他们可以检查代码来保证它没有做任何不希望它做的事情,并且可以改变不喜欢的部分。不是开发者的用户也可以从开源软件获益,因为他们可以以任何目的使用这个软件——而不仅仅是某些人认为他们应该有的目的。 +**可控**。很多人青睐开源软件因为相对其它类型软件他们可以[拥有更多的可控][11]。他们可以检查代码来保证它没有做任何不希望它做的事情,并且可以改变不喜欢的部分。不是开发者的用户也可以从开源软件获益,因为他们可以以任何目的使用这个软件——而不仅仅是某些人认为他们应该有的目的。 -训练。其他人喜欢开源软件是因为它可以帮助他们[成为更好的开发者][12]。因为开源代码可以公开访问,学生可以在学习创建更好的软件时可以轻松地从中学习。学生还可以在提升技能的时候分享他们的成果给别人,获得评价和批评。当人们发现程序源代码中的错误的时候,可以将这个错误分享给其他人,帮助他们避免犯同样的错误。 +**训练**。其他人喜欢开源软件是因为它可以帮助他们[成为更好的开发者][12]。因为开源代码可以公开访问,学生可以在学习创建更好的软件时轻松地从中学习。学生还可以在提升技能的时候分享他们的成果给别人,获得评价和批评。当人们发现程序源代码中的错误的时候,可以将这个错误分享给其他人,帮助他们避免犯同样的错误。 -安全。一些人倾向开源软件是因为他们认为它比专有软件更[安全][13]和稳定。因为任何人都可以查看和修改开源软件,就有人可能会注意到并修正原作者遗漏的错误或疏忽。并且因为这么多的开发者可以在同一开源软件上工作,而不用事先联系获取原作者的授权,相比专有软件,他们可以更[快速][14]地修复、更新和升级开源软件。 +**安全**。一些人倾向开源软件是因为他们认为它比专有软件更[安全][13]和稳定。因为任何人都可以查看和修改开源软件,就会有人可能会注意到并修正原作者遗漏的错误或疏忽。并且因为这么多的开发者可以在同一开源软件上工作,而不用事先联系获取原作者的授权,相比专有软件,他们可以更[快速][14]地修复、更新和升级开源软件。 -稳定。许多用户在重要,长期的项目中相较专有软件更加青睐开源软件。因为开发者[公开分发][15]开源软件的源代码,如果最初的开发者停止开发了,关键任务依赖该软件的用户可以确保他们的工具不会消失,或是陷入无法修复的状态。另外,开源软件趋向于同时包含和按照开放标准进行操作。 +**稳定**。许多用户在重要、长期的项目中相较专有软件更加青睐开源软件。因为开发者[公开分发][15]开源软件的源代码,如果最初的开发者停止开发了,关键任务依赖该软件的用户可以确保他们的工具不会消失,或是陷入无法修复的状态。另外,开源软件趋向于同时包含和按照开放标准进行操作。 ### “开源”不是只是意味着某样东西是免费的吗? 不。这是个“开源”实践中的[常见误解][16],“开源”概念的含义[不只是指经济方面的][17]。 -开源软件开发者可以为他们创建或贡献的开源软件收取费用。但在一些情况下,由于开源许可可能会要求他们在将软件卖给他人的时候发布源代码,一些开发者发现向用户收取软件服务和支持(而不是软件本身)的费用会更加合算。通过这种方式,他们的软件仍然保持免费,而他们[从帮助他人][18]安装、使用、解决问题中赚取费用。 +开源软件开发者可以为他们创建或贡献的开源软件收取费用。但在一些情况下,由于开源许可证可能会要求他们在将软件卖给他人的时候发布源代码,一些开发者发现向用户收取软件服务和支持(而不是软件本身)的费用会更加合算。通过这种方式,他们的软件仍然保持免费,而他们[从帮助他人][18]安装、使用、解决问题中赚取费用。 尽管一些开源软件可能是免费的,但开源软件的编程和解决问题的技能可能[十分有价值][19]。许多雇主特别寻求[雇佣在开源软件方面有工作经验的开发者][20]。 @@ -67,7 +69,7 @@ 实现“[开源方式][21]”的生活的各个方面,意味着表达一种分享的意愿,通过透明的方式和他人协作(这样其他人也可以关注和加入),拥抱失败,将它作为一种改进的手段,以及期待(甚至鼓励)所有人都可以这么做。 -这也意味着在让世界变得更好的过程中扮演一个积极的角色,这只有在[每个人都可以接触][22]到设计世界的途径时才有可能。 +这也意味着在让世界变得更好的过程中扮演一个积极的角色,这只有在[每个人都可以接触][22]到对世界进行规划的途径时才有可能。 这个世界充满了“源代码”——[蓝图][23]、[食谱][24]、[规则][25]——它们引导和塑造我们思考和行动的方式。我们相信这些深层代码(无论是什么形式)应该是开放、可接触、分享的——这样人们可以参与其中并让它变得更好。 @@ -75,7 +77,7 @@ 在哪里能够获得关于开源的更多信息? -我们编辑了一些资源来帮助你学到更多关于[开源的内容。我们推荐你从阅读我们的开源问答、指南、教程][31]开始。 +我们编辑了一些资源来帮助你学到更多关于开源的内容。我们推荐你从阅读我们的[开源问答、指南、教程][31]开始。 -------------------------------------------------------------------------------- @@ -83,7 +85,7 @@ via: https://opensource.com/resources/what-open-source 作者:[opensource.com][a] 译者:[alim0x](https://github.com/alim0x) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 09063e01003297dca670d08354e53fdfd3bc55cc Mon Sep 17 00:00:00 2001 From: jasminepeng Date: Tue, 20 Jun 2017 15:26:21 +0800 Subject: [PATCH 0473/1407] =?UTF-8?q?=E6=A0=A1=E5=AF=B9=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 校对中 --- .../20170324 Writing a Linux Debugger Part 2 Breakpoints.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translated/tech/20170324 Writing a Linux Debugger Part 2 Breakpoints.md b/translated/tech/20170324 Writing a Linux Debugger Part 2 Breakpoints.md index 1adcc247a8..15e0f248aa 100644 --- a/translated/tech/20170324 Writing a Linux Debugger Part 2 Breakpoints.md +++ b/translated/tech/20170324 Writing a Linux Debugger Part 2 Breakpoints.md @@ -193,7 +193,7 @@ via: http://blog.tartanllama.xyz/c++/2017/03/24/writing-a-linux-debugger-breakpo 作者:[Simon Brand ][a] 译者:[ictlyh](https://github.com/ictlyh) -校对:[校对者ID](https://github.com/校对者ID) +校对:[jasminepeng](https://github.com/jasminepeng) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From d47fd08cb244690157a5f09b8994bee180d51ece Mon Sep 17 00:00:00 2001 From: jasminepeng Date: Tue, 20 Jun 2017 16:55:27 +0800 Subject: [PATCH 0474/1407] =?UTF-8?q?=E6=A0=A1=E5=AF=B9=E5=AE=8C=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 校对完毕 谢谢。 --- ...ing a Linux Debugger Part 2 Breakpoints.md | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) diff --git a/translated/tech/20170324 Writing a Linux Debugger Part 2 Breakpoints.md b/translated/tech/20170324 Writing a Linux Debugger Part 2 Breakpoints.md index 15e0f248aa..326e7c05d4 100644 --- a/translated/tech/20170324 Writing a Linux Debugger Part 2 Breakpoints.md +++ b/translated/tech/20170324 Writing a Linux Debugger Part 2 Breakpoints.md @@ -1,7 +1,7 @@ 开发 Linux 调试器第二部分:断点 ============================================================ -在该系列的第一部分,我们写了一个小的进程启动器作为我们调试器的基础。在这篇博客中,我们会学习断点如何在 x86 Linux 上工作以及给我们工具添加设置断点的能力。 +在该系列的第一部分,我们写了一个小的进程启动器,作为我们调试器的基础。在这篇博客中,我们会学习在 x86 Linux 上断点如何工作以及给我们工具添加设置断点的能力。 * * * @@ -13,19 +13,18 @@ 2. [断点][3] 3. 寄存器和内存 4. Elves 和 dwarves -5. 逐步、源码和信号 -6. 使用 DWARF 调试信息逐步执行 -7. 源码层断点 -8. 调用栈 -9. 读取变量 -10. 下一步 +5. 源码和信号 +6. 源码层逐步执行 +7. 源码层断点 +8. 调用栈 +9. 读取变量 +10.之后步骤 -译者注:ELF([Executable and Linkable Format](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format "Executable and Linkable Format") 可执行文件格式),DWARF(一种广泛使用的调试数据格式,参考 [WIKI](https://en.wikipedia.org/wiki/DWARF "DWARF WIKI")) * * * ### 断点如何形成? -有两种类型的断点:硬件和软件。硬件断点通常涉及设置和体系结构相关的寄存器来为你产生断点,而软件断点则涉及修改正在执行的代码。在这篇文章中我们只会关注软件断点,因为它们比较简单,而且足够完成你想要的功能。在 x86 机器上任一时刻你最多只能有 4 个硬件断点,但是它们能使你通过读取或者写入给定地址生效,而不是只有当执行到那里的时候。 +有两种类型的断点:硬件和软件。硬件断点通常涉及设置和体系结构相关的寄存器来为你产生断点,而软件断点则涉及修改正在执行的代码。在这篇文章中我们只会关注软件断点,因为它们比较简单,而且可以设置任意多断点。在 x86 机器上任一时刻你最多只能有 4 个硬件断点,但是它们能使你通过读取或者写入给定地址生效,而不是只有当执行到那里的时候。 我前面说软件断点是通过修改正在执行的代码实现的,那么问题就来了: @@ -35,11 +34,11 @@ 第一个问题的答案显然是 `ptrace`。我们之前已经用它来启动我们的程序以便跟踪和继续它的执行,但我们也可以用它来读或者写内存。 -当执行到断点时,我们的更改要让处理器暂停并给程序发送信号。在 x86 机器上这是通过 `int 3` 重写该地址上的指令实现的。x86 机器有个`interrupt vector table`(中断向量表),操作系统能用它来为多种事件注册处理程序,例如页故障、保护故障和无效操作码。它就像是注册错误处理回调函数,但是在硬件层面的。当处理器执行 `int 3` 指令时,控制权就被传递给断点中断处理器,对于 Linux 来说,就是给进程发送 `SIGTRAP` 信号。你可以在下图中看到这个进程,我们用 `0xcc`-`int 3` 的指令编码 - 覆盖了 `mov` 指令的第一个字节。 +当执行到断点时,我们的更改要让处理器暂停并给程序发送信号。在 x86 机器上这是通过 `int 3` 重写该地址上的指令实现的。x86 机器有个`interrupt vector table`(中断向量表),操作系统能用它来为多种事件注册处理程序,例如页故障、保护故障和无效操作码。它就像是注册错误处理回调函数,但是在硬件层面的。当处理器执行 `int 3` 指令时,控制权就被传递给断点中断处理器,对于 Linux 来说,就是给进程发送 `SIGTRAP` 信号。你可以在下图中看到这个进程,我们用 `0xcc` 覆盖了 `mov` 指令的第一个字节,它是 `init 3` 的指令代码。 ![断点](http://blog.tartanllama.xyz/assets/breakpoint.png) -最后一个谜题是调试器如何被告知中断的。如果你回顾前面的文章,我们可以用 `waitpid` 来监听被发送给被调试程序的信号。这里我们也可以这样做:设置断点、继续执行程序、调用 `waitpid` 然后等待直到发生 `SIGTRAP`。然后就可以通过打印已运行到的源码位置、或改变有图形用户界面的调试器中关注的代码行从而将这个断点传达给用户。 +最后一个谜题是调试器如何被告知中断的。如果你回顾前面的文章,我们可以用 `waitpid` 来监听被发送给被调试程序的信号。这里我们也可以这样做:设置断点、继续执行程序、调用 `waitpid` 然后等待直到发生 `SIGTRAP`。然后就可以通过打印已运行到的源码位置、或改变有图形用户界面的调试器中关注的代码行,将这个断点传达给用户。 * * * @@ -153,13 +152,13 @@ void debugger::handle_command(const std::string& line) { ### 从断点继续执行 -如果你尝试这样做,你可能会发现如果你从断点处继续执行,不会发生任何事情。这是因为断点仍然在内存中,因此一直被命中。简单的解决办法就是停用这个断点、运行到下一步、再次启用这个断点、然后继续执行。不幸的是我们还需要更改程序计数器指回断点前面,我们会将这部分内容留到下一篇博客学习了如何操作寄存器之后。 +如果你尝试这样做,你可能会发现,如果你从断点处继续执行,不会发生任何事情。这是因为断点仍然在内存中,因此一直被命中。简单的解决办法就是停用这个断点、运行到下一步、再次启用这个断点、然后继续执行。不过我们还需要更改程序计数器,指回到断点前面,这部分内容会留到下一篇关于操作寄存器的文章中介绍。 * * * ### 测试它 -当然,如果你不知道要设置的地址,设置断点并非很有帮助。后面我们会学习如何在函数名或者代码行设置断点,但现在我们可以通过手动实现。 +当然,如果你不知道要设置的地址,在某些地址设置断点并非很有用。后面我们会学习如何在函数名或者代码行设置断点,但现在我们可以通过手动实现。 测试你调试器的简单方法是写一个 hello world 程序,这个程序输出到 `std::err`(为了避免缓存),并在调用输出操作符的地方设置断点。如果你继续执行被调试的程序,执行很可能会停止而不会输出任何东西。然后你可以重启调试器并在调用之后设置一个断点,现在你应该看到成功地输出了消息。 From 550366c2eb2f9d31fc555e18e9fa568362633a4b Mon Sep 17 00:00:00 2001 From: jasminepeng Date: Tue, 20 Jun 2017 16:57:27 +0800 Subject: [PATCH 0475/1407] =?UTF-8?q?=E6=A0=A1=E5=AF=B9=E5=AE=8C=E6=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 校对完毕 --- .../20170324 Writing a Linux Debugger Part 2 Breakpoints.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translated/tech/20170324 Writing a Linux Debugger Part 2 Breakpoints.md b/translated/tech/20170324 Writing a Linux Debugger Part 2 Breakpoints.md index 326e7c05d4..a66feefe31 100644 --- a/translated/tech/20170324 Writing a Linux Debugger Part 2 Breakpoints.md +++ b/translated/tech/20170324 Writing a Linux Debugger Part 2 Breakpoints.md @@ -5,7 +5,7 @@ * * * -###系列文章索引 +### 系列文章索引 随着后面文章的发布,这些链接会逐渐生效。 From 7d78e50e96c66f411cce2417dbacf855175ac944 Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 21 Jun 2017 09:06:59 +0800 Subject: [PATCH 0476/1407] translating --- ...he benefits of tracking issues publicly.md | 84 ------------------- ...he benefits of tracking issues publicly.md | 82 ++++++++++++++++++ 2 files changed, 82 insertions(+), 84 deletions(-) delete mode 100644 sources/tech/20170209 The benefits of tracking issues publicly.md create mode 100644 translated/tech/20170209 The benefits of tracking issues publicly.md diff --git a/sources/tech/20170209 The benefits of tracking issues publicly.md b/sources/tech/20170209 The benefits of tracking issues publicly.md deleted file mode 100644 index 56b66b5daf..0000000000 --- a/sources/tech/20170209 The benefits of tracking issues publicly.md +++ /dev/null @@ -1,84 +0,0 @@ -translating-----geekpi - -The benefits of tracking issues publicly -============================================================ - -### In open organizations, tracking to-do items online can turn customers into colleagues. - -Posted 09 Feb 2017[Chad Whitacre][20][Feed][19]11[up][5] - ![The benefits of tracking issues publicly](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/OSDC_bees_network.png?itok=Ims9tFQS "The benefits of tracking issues publicly") -Image by : opensource.com - -A public issue tracker is a vital communication tool for an open organization, because there's no better way to be [transparent and inclusive][6] than to conduct your work in public channels. So let's explore some best practices for using an issue tracker in an open organization. - -Before we start, though, let's define what we mean by "issue tracker." Simply put, an issue tracker is **a shared to-do list**. Think of scribbling a quick list of errands to run: buy bread, mail package, drop off library books. As you drive around town, it feels good to cross each item off your list. Now scale that up to the work you have to do in your organization, and add in a healthy dose of software-enabled collaboration. You've got an issue tracker! - -Whether you use GitHub, or another option, such as Bitbucket, GitLab, or Trello, an issue tracker is the right tool for the task of coordinating with your colleagues. It is also crucial for converting outsiders  _into_  colleagues, one of the hallmarks of an open organization. How does that work? I'm glad you asked! - -### Best practices for using an issue tracker - -The following best practices for using a public issue tracker to convert outsiders into colleagues are based on our experience at [Gratipay][7] over the past five years. We help companies and others pay for open source, and we love collaborating with our community using our issue trackers. Here's what we've learned. - -**0\. Prioritize privacy.** It may seem like an odd place to start, talking about privacy in a post about public issue trackers. But we must remember that [openness is not an end in itself][8], and that any genuine and true openness is only ever built on a solid foundation of safety and consent. Never post information publicly that customers or other third parties have given you privately, unless you explicitly ask them and they explicitly agree to it. Adopt a policy and train your people. [Here is Gratipay's policy][9] for reference. Okay! Now that we're clear on that, let's proceed. - -**1\. Default to deciding in public.** If you make decisions in private, you're losing out on the benefits of running an open organization, such as surfacing diverse ideas, recruiting motivated talent, and realizing greater accountability. Even if your full-time employees are the only ones using your public issue tracker at first, do it anyway. Avoid the temptation to treat your public issue tracker as a second-class citizen. If you have a conversation in the office, post a summary on the public issue tracker, and give your community time to respond before finalizing the decision. This is the first step towards using your issue tracker to unlock the power of open for your organization: if it's not in the issue tracker, it didn't happen! - -**2\. Cross-link to other tools.** It's no secret that many of us love IRC and Slack. Or perhaps your organization already uses Trello, but you'd like to start using GitHub as well. No problem! It's easy to drop a link to a Trello card in a GitHub issue, and vice versa. Cross-linking ensures that an outsider who stumbles upon one or the other will be able to discover the additional context they need to fully understand the issue. For chat services, you may need to configure public logging in order to maintain the connection (privacy note: when you do so, be sure to advertise the fact in your channel description). That said, you should treat conversations in private Slack or other private channels just as if they were face-to-face conversations in the office. In other words, be sure to summarize the conversation on the public issue tracker. See above: whether offline or online, if it's not in the issue tracker, it didn't happen! - -**3\. Drive conversations to your tracker.** Social media is great for getting lots of feedback quickly, and especially for discovering problems, but it's not the place to solve them. Issue trackers make room for deeper conversations and root-cause analysis. More importantly, they are optimized for getting stuff done rather than for infinite scrolling. Clicking that "Close" button when an issue is resolved feels really good! Now that you have a public issue tracker as your primary venue for work, you can start inviting outsiders that engage with you on social media to pursue the conversation further in the tracker. Something as simple as, "Thanks for the feedback! Sounds similar to (link to public issue)?" can go a long way towards communicating to outsiders that your organization has nothing to hide, and welcomes their engagement. - -**4\. Set up a "meta" tracker.** Starting out, it's natural that your issue tracker will be focused on your  _product_ . When you're ready to take open to the next level, consider setting up an issue tracker about your  _organization_  itself. At Gratipay, we're willing to discuss just about any aspect of our organization, from [our budget][10] to [our legal structure][11] to [our name][12], in a public issue tracker we call "Inside Gratipay." Yes, this can get a little chaotic at times—renaming the organization was a particularly fierce [bikeshed][13]!—but for us the benefits in terms of community engagement are worth it. - -**5\. Use your meta tracker for onboarding.** Once you have a meta issue tracker, a new onboarding process suggests itself: invite potential colleagues to create their own onboarding ticket. If they've never used your particular issue tracker before, it will be a great chance for them to learn. Registering an account and filing an issue should be pretty easy (if it's not, consider switching tools!). This will create an early success event for your new colleague, as well as the beginnings of a sense of shared ownership and having a place within the organization. There are no dumb questions, of course, but this is  _especially_  true in someone's onboarding ticket. This is your new colleague's place to ask any and all questions as they familiarize themselves with how your organization works. Of course, you'll want to make sure that you respond quickly to their questions, to keep them engaged and help them integrate into your organization. This is also a great way to document the access permissions to various systems that you end up granting to this person. Crucially, this can start to happen [before they're even hired][14]. - -**6\. Radar projects.** Most issue trackers include some way to organize and prioritize tasks. GitHub, for example, has [milestones][15] and [projects][16]. These are generally intended to align work priorities across members of your organization. At Gratipay, we've found it helpful to also use these tools to allow collaborators to own and organize their individual work priorities. We've found this to offer a different value than assigning issues to particular individuals (another facility issue trackers generally provide). I may care about an issue that someone else is actively working on, or I may be potentially interested in starting something but happy to let someone else claim it first. Having my own project space to organize my view of the organization's work is a powerful way to communicate with my colleagues about "what's on my radar." - -More Open Organization Resources - -* [Download the Open Organization Leaders Manual][1] -* [Download the Open Organization Field Guide][2] -* [What is an Open Organization?][3] -* [What is an Open Decision?][4] - -**7\. Use bots to automate tasks.** Eventually, you may find that certain tasks keep popping up again and again. That's a sign that automation can streamline your workflow. At Gratipay, we [built][17] a [bot][18] to help us with certain recurring tasks. Admittedly, this is a somewhat advanced use case. If you reach this point, you will be far along in using a public issue tracker to open up your organization! - -Those are some of the practices that we've found most helpful at Gratipay in using our issue tracker to "engage participative communities both inside and out," as Jim Whitehurst puts it. That said, we are always learning. Leave a comment if you've got an experience of your own to share! - --------------------------------------------------------------------------------- - - -作者简介: - -Chad Whitacre - I'm the founder of Gratipay, an open organization with a mission to cultivate an economy of gratitude, generosity, and love. We offer pay-what-you-want payments and take-what-you-want payouts for open organizations—and we're funded on our own platform. Offline, I live outside Pittsburgh, PA, USA, and online, I live on GitHub. - --------------------------------------------------------------------------------- - -via: https://opensource.com/open-organization/17/2/tracking-issues-publicly - -作者:[Chad Whitacre][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/whit537 -[1]:https://opensource.com/open-organization/resources/leaders-manual?src=too_resource_menu -[2]:https://opensource.com/open-organization/resources/field-guide?src=too_resource_menu -[3]:https://opensource.com/open-organization/resources/open-org-definition?src=too_resource_menu -[4]:https://opensource.com/open-organization/resources/open-decision-framework?src=too_resource_menu -[5]:https://opensource.com/open-organization/17/2/tracking-issues-publicly?rate=S5mrFkcwQzkErQQMkHYyaaMxF5j5xtZBHW91EPluD1A -[6]:https://opensource.com/open-organization/resources/open-org-definition -[7]:https://gratipay.com/ -[8]:https://opensource.com/open-organization/16/9/openness-means-to-what-end -[9]:http://inside.gratipay.com/howto/seek-consent -[10]:https://github.com/gratipay/inside.gratipay.com/issues/928 -[11]:https://github.com/gratipay/inside.gratipay.com/issues/72 -[12]:https://github.com/gratipay/inside.gratipay.com/issues/73 -[13]:http://bikeshed.com/ -[14]:https://opensource.com/open-organization/16/5/employees-let-them-hire-themselves -[15]:https://help.github.com/articles/creating-and-editing-milestones-for-issues-and-pull-requests/ -[16]:https://help.github.com/articles/about-projects/ -[17]:https://github.com/gratipay/bot -[18]:https://github.com/gratipay-bot -[19]:https://opensource.com/user/73891/feed -[20]:https://opensource.com/users/whit537 diff --git a/translated/tech/20170209 The benefits of tracking issues publicly.md b/translated/tech/20170209 The benefits of tracking issues publicly.md new file mode 100644 index 0000000000..f28ce1f446 --- /dev/null +++ b/translated/tech/20170209 The benefits of tracking issues publicly.md @@ -0,0 +1,82 @@ +公开追踪问题的好处 +============================================================ + +### 在公共组织中,在线追踪问题可以将客户变成同事 + +Posted 09 Feb 2017[Chad Whitacre][20][Feed][19]11[up][5] + ![The benefits of tracking issues publicly](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/OSDC_bees_network.png?itok=Ims9tFQS "The benefits of tracking issues publicly") +图片提供: opensource.com + +一个公开的问题追踪器是开放组织的重要沟通工具,相对在公开渠道中开展渠道,没有比[透明和包容][6]更好的方法了。因此,让我们来探讨在开放组织中使用问题跟踪器的一些最佳实践。 + +在开始之前,我们先来定义“问题追踪器”的含义。简单地说,问题跟踪器是**一个共享的待办事项列表**。想象一下胡乱写一张待办事项列表:购买面包、邮件打包、归还图书馆书籍。当你在城里开车时,把列表上的每一项划掉都感觉很好。现在,将它扩展到你需要在组织中需要完成的工作,并增加软件协作健康度。这样你就有一个问题追踪器了! + +无论你使用的是 GitHub 还是其他的,如 Bitbucket、GitLab 或 Trello,问题跟踪器都是与你的同事进行协调的正确工具。这对将外部人员_变成_同事是至关重要的,这是开放组织的特征之一。这是如何工作的?我很高兴你问了这个问题。 + +### 使用问题追踪器的最佳实践 + +使用公共问题跟踪器将外部人员转换为同事的最佳实践是基于过去五年来我们在 [Gratipay][7] 的经验。我们帮助公司和其他为开源支付,我们喜欢使用我们的问题跟踪器与我们的社区合作。这就是我们学到的。 + +**0\. 隐私优先。** 在文章中谈论公共问题追踪器的隐私看上去是一个奇怪的开始。但是我们必须记住,[开放本身并不是目的][8],任何真诚和真正的开放是建立在安全和同意的坚实基础之上的。不要公开发布客户或其他第三方私下给你的信息,除非你明确提出要求并且他们明确同意。采纳一个政策并训练你的人。[这是 Gratipay 的政策][9]供你参考。好的!现在我们明白了,让我们继续吧。 + +**1\. 默认公开决定。** 如果你私下做决定,你就会失去运行一个开放组织的好处,比如表达多样化的想法、招募有活力的人才、实现更大的责任感。即使你的全职员工是最初使用你的公共问题跟踪器的唯一员工,那也要这么做。 避免将你的公共问题追踪者视为二等公民。如果你在办公室进行对话,请在公共问题跟踪器上发布摘要,并在完成决定之前让你的社区回复。这是使用问题跟踪器解锁你组织开放权力的第一步:如果它不在问题追踪器中,那就不会发生! + +**2\. 关联其他工具。** 我们许多人都喜欢 IRC 和 Slack,这并不是什么秘密。或者你的组织已经使用 Trello,但是你也想开始使用 GitHub。这没问题!在 GitHub issue 中放入 Trello 卡片的链接很容易,反之亦然。交叉关联保证了被一个或者另一个问题困住的外部人员能够发现额外的帮助它们充分理解这个问题的上下文。对于聊天服务,你可能需要配置公共日志记录才能维护连接(隐私注意事项:当你这么做时,请务必在你的频道描述中宣传该事实)。也就是说,你应该在私人 Slack 或其他私人渠道中对话,就像在办公室里面对面的对话一样。换句话说,一定要总结公众问题跟踪器上的对话。看看上面说的:无论离线或在线,如果不在问题跟踪器中,那就没有发生! + +**3\. 将谈话导向追踪器中。** 社交媒体很快就能获得很多反馈,尤其是发现问题,但这不是解决问题的地方。问题跟踪器为深入的对话和根本原因分析留出空间。更重要的是,它们是为了完成任务而优化的,而不是无限拖延。当问题解决后点击“关闭”按钮的感觉真的很好!现在将公共问题跟踪器作为你的主要工作场所,你可以开始邀请在社交媒体上与你接触的外部人员在追踪器中进一步地讨论。简单的如,“感谢您的反馈!听起来类似(链接到公共问题)?” ,这可以在很大程度上向外界传达你的组织没有隐藏的内容,并欢迎他们的参与。 + +**4\. 设置一个“元”追踪器。** 在一开始,你的问题追踪器很自然聚焦在_产品_上。当你准备好开放到一个新的水平,考虑设置一个关于你的_组织_本身的问题跟踪。在 Gratipay,我们愿意一个公共的问题追踪器其中,称之为 “Inside Gratipay”,讨论我们组织的任何方面,从[我们的预算][10]到[我们的法律结构][11]到[我们的名字][12]。 是的,这有时有点混乱 - 重命名组织是一个特别激烈的[争议话题][13]!但对我们来说,在社区参与方面的好处是值得的。 + +**5\. 使用你的元追踪器入门。** 一旦你有一个元问题追踪器,新的入门过程就表明了自己:邀请潜在的同事创建自己的入门券。如果他们以前从未使用过你的特定问题追踪器,那么这将是他们学习的极好机会。注册帐号并提交问题应该很简单(如果不是,请考虑切换工具!)。这将为你的新同事创造一个早期的成功事件,以及开始共享所有权,并在组织内部拥有一席之地。当然,没有愚蠢的问题,但是这_尤其_在某人的入门券上这是真的。这是你的新同事熟悉组织工作方式时询问任何问题的地方。当然,你需要确保快速回复他们的问题,让他们参与并帮助他们融入你的组织。这也是一个很好的方法来记录你最终授予这个人的各种系统的访问权限。至关重要的是,这可以开始[在雇佣他们之前][14]。 + +**6\. 雷达项目。** 大多数问题跟踪器包括一些组织和优先排序任务的方法。例如,GitHub 有[里程碑][15]和[项目][16]。这些通常旨在使组织成员的工作重点相一致。在 Gratipay,我们发现使用这些工具可以帮助协作者拥有并组织各自的工作重点。我们发现这一点提供了不同于将问题分配给特定个人(另外的问题跟踪器通常提供的)的价值。 我可能会关心别人正在积极工作的问题,或者我可能有兴趣开始某些事情,但很高兴让别人先要申报。拥有自己的项目空间来组织我对组织工作的看法是与我的同事沟通“我的雷达上有什么”的强大方式。 + +更多开放组织资源 + +* [下载开放组织领导人手册][1] +* [下载开放组织领域指导][2] +* [什么是开放组织?][3] +* [什么是开放决定?][4] + +**7\. 使用机器人自动化任务。** 最终,你可能会发现某些任务会一再出现。这表明自动化可以简化你的工作流程。在 Gratipay,我们[构建][17]了一个[机器人][18]帮助我们完成一些重复的任务。诚然,这是一个有点高级的用法。如果你达到了这一点,你能完全使用公共问题追踪器来开放你的组织! + +这些是我们在 Gratipay 内使用我们的问题跟踪器如 Jim Whitehurst 所说那样 “吸引社区内外参与” 的一些最有用的做法。也就是说,我们一直在学习。如果你有自己的经验分享,请发表评论! + +-------------------------------------------------------------------------------- + + +作者简介: + +Chad Whitacre - 我是 Gratipay 的创始人,Gratipay 是一个开放组织,致力于培育一个感恩,慷慨和爱的经济。我们为开放组织提供支付你想的支付以及拿你想拿的补偿 - 我们在自己的平台上资助。在线下,我居住在美国宾夕法尼亚州匹兹堡,在线上,我活跃在 GitHub。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/open-organization/17/2/tracking-issues-publicly + +作者:[Chad Whitacre][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/whit537 +[1]:https://opensource.com/open-organization/resources/leaders-manual?src=too_resource_menu +[2]:https://opensource.com/open-organization/resources/field-guide?src=too_resource_menu +[3]:https://opensource.com/open-organization/resources/open-org-definition?src=too_resource_menu +[4]:https://opensource.com/open-organization/resources/open-decision-framework?src=too_resource_menu +[5]:https://opensource.com/open-organization/17/2/tracking-issues-publicly?rate=S5mrFkcwQzkErQQMkHYyaaMxF5j5xtZBHW91EPluD1A +[6]:https://opensource.com/open-organization/resources/open-org-definition +[7]:https://gratipay.com/ +[8]:https://opensource.com/open-organization/16/9/openness-means-to-what-end +[9]:http://inside.gratipay.com/howto/seek-consent +[10]:https://github.com/gratipay/inside.gratipay.com/issues/928 +[11]:https://github.com/gratipay/inside.gratipay.com/issues/72 +[12]:https://github.com/gratipay/inside.gratipay.com/issues/73 +[13]:http://bikeshed.com/ +[14]:https://opensource.com/open-organization/16/5/employees-let-them-hire-themselves +[15]:https://help.github.com/articles/creating-and-editing-milestones-for-issues-and-pull-requests/ +[16]:https://help.github.com/articles/about-projects/ +[17]:https://github.com/gratipay/bot +[18]:https://github.com/gratipay-bot +[19]:https://opensource.com/user/73891/feed +[20]:https://opensource.com/users/whit537 From 33febac5fb0173a190029030d82cf34550f33f70 Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 21 Jun 2017 09:11:29 +0800 Subject: [PATCH 0477/1407] translating --- .../20170427 Linux s Big Bang One Kernel Countless Distros.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md b/sources/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md index c36fa8418d..8f2b45d0de 100644 --- a/sources/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md +++ b/sources/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md @@ -1,3 +1,5 @@ +translating---geekpi + Linux's Big Bang: One Kernel, Countless Distros ============================================================[Print][1][Email][2]By Jonathan Terrasi  Apr 27, 2017 3:24 PM PT From 9f440982bddd0a7b7c06ff5822e8b061d279e0d5 Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 21 Jun 2017 10:15:00 +0800 Subject: [PATCH 0478/1407] PUB:20170321 Writing a Linux Debugger Part 1 Setup.md @ictlyh @jasminepeng --- ...1 Writing a Linux Debugger Part 1 Setup.md | 53 ++++++++++--------- 1 file changed, 27 insertions(+), 26 deletions(-) rename {translated/tech => published}/20170321 Writing a Linux Debugger Part 1 Setup.md (68%) diff --git a/translated/tech/20170321 Writing a Linux Debugger Part 1 Setup.md b/published/20170321 Writing a Linux Debugger Part 1 Setup.md similarity index 68% rename from translated/tech/20170321 Writing a Linux Debugger Part 1 Setup.md rename to published/20170321 Writing a Linux Debugger Part 1 Setup.md index 92a4ebd51b..20bf26849a 100644 --- a/translated/tech/20170321 Writing a Linux Debugger Part 1 Setup.md +++ b/published/20170321 Writing a Linux Debugger Part 1 Setup.md @@ -1,7 +1,17 @@ -开发 Linux 调试器第一部分:启动 +开发一个 Linux 调试器(一):准备环境 ============================================================ -任何写过比 hello world 复杂点程序的人都应该使用过调试器(如果你还没有,那就停下手头的工作先学习一下吧)。但是,尽管这些工具已经得到了广泛的使用,却并没有太多的资源告诉你它们的工作原理以及如何开发[1][1],尤其是和其它类似编译器等工具链技术相比的时候。 +任何写过比 hello world 复杂一些的程序的人都应该使用过调试器(如果你还没有,那就停下手头的工作先学习一下吧)。但是,尽管这些工具已经得到了广泛的使用,却并没有太多的资源告诉你它们的工作原理以及如何开发,尤其是和其它那些比如编译器等工具链技术相比而言。 + +> 此处有一些其它的资源可以参考: + +> - http://eli.thegreenplace.net/2011/01/23/how-debuggers-work-part-1 + +> - https://t-a-w.blogspot.co.uk/2007/03/how-to-code-debuggers.html + +> - https://www.codeproject.com/Articles/43682/Writing-a-basic-Windows-debugger + +> - http://system.joekain.com/debugger/ 我们将会支持以下功能: @@ -29,13 +39,11 @@ 在本项目中我会将重点放在 C 和 C++,但对于那些将源码编译为机器码并输出标准 DWARE 调试信息的语言也应该能起作用(如果你还不知道这些东西是什么,别担心,马上就会介绍到啦)。另外,我只关注如何将程序运行起来并在大部分情况下能正常工作,为了简便,会避开类似健壮错误处理方面的东西。 -* * * - ### 系列文章索引 随着后面文章的发布,这些链接会逐渐生效。 -1. [启动][2] +1. [准备环境][2] 2. [断点][3] 3. 寄存器和内存 4. Elves 和 dwarves @@ -46,20 +54,17 @@ 9. 读取变量 10. 之后步骤 -LCTT 译注:ELF([Executable and Linkable Format](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format "Executable and Linkable Format") 可执行文件格式),DWARF(一种广泛使用的调试数据格式,参考 [WIKI](https://en.wikipedia.org/wiki/DWARF "DWARF WIKI")) -* * * +LCTT 译注:ELF —— 可执行文件格式[Executable and Linkable Format](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format "Executable and Linkable Format");DWARF(一种广泛使用的调试数据格式,参考 [WIKI](https://en.wikipedia.org/wiki/DWARF "DWARF WIKI"))。 ### 准备环境 -在我们正式开始之前,我们首先要设置环境。在这篇文章中我会依赖两个工具:[Linenoise][4] 用于处理命令行输入,[libelfin][5] 用于解析调试信息。你也可以使用更传统的 libdwarf 而不是 libelin,但是界面没有那么友好,另外 libelfin 还提供大部分完整的 DWARF 表达式求值程序,当你想读取变量的值时这能帮你节省很多时间。确认你使用的是我 libelfin 仓库中的 fbreg 分支,因为它提供 x86 上读取变量的额外支持。 +在我们正式开始之前,我们首先要设置环境。在这篇文章中我会依赖两个工具:[Linenoise][4] 用于处理命令行输入,[libelfin][5] 用于解析调试信息。你也可以使用更传统的 libdwarf 而不是 libelfin,但是界面没有那么友好,另外 libelfin 还提供了基本完整的 DWARF 表达式求值器,当你想读取变量的值时这能帮你节省很多时间。确认你使用的是 libelfin 我的 fbreg 分支,因为它提供 x86 上读取变量的额外支持。 一旦你在系统上安装或者使用你喜欢的编译系统编译好了这些依赖工具,就可以开始啦。我在 CMake 文件中把它们设置为和我其余的代码一起编译。 -* * * - ### 启动可执行程序 -在真正调试任何程序之前,我们需要启动被调试的程序。我们会使用经典的 fork/exec 模式。 +在真正调试任何程序之前,我们需要启动被调试的程序。我们会使用经典的 `fork`/`exec` 模式。 ``` int main(int argc, char* argv[]) { @@ -82,7 +87,7 @@ int main(int argc, char* argv[]) { } ``` -我们调用 `fort` 把我们的程序分成两个进程。如果我们是在子进程,`fork` 返回 0,如果我们是在父进程,它会返回子进程的进程 ID。 +我们调用 `fork` 把我们的程序分成两个进程。如果我们是在子进程,`fork` 返回 0,如果我们是在父进程,它会返回子进程的进程 ID。 如果我们是在子进程,我们要用希望调试的程序替换正在执行的程序。 @@ -91,22 +96,20 @@ int main(int argc, char* argv[]) { execl(prog.c_str(), prog.c_str(), nullptr); ``` -这里我们第一次遇到了 `ptrace`,它会在我们编写调试器的时候经常遇到。`ptrace` 通过读取寄存器、内存、逐步调试等让我们观察和控制另一个进程的执行。API 非常简单;你需要给这个简单函数提供一个枚举值用于你想要进行的操作,然后是一些取决于你提供的值可能会被使用也可能会被忽略的参数。函数签名看起来类似: +这里我们第一次遇到了 `ptrace`,它会在我们编写调试器的时候经常遇到。`ptrace` 通过读取寄存器、内存、逐步调试等让我们观察和控制另一个进程的执行。其 API 非常简单;你需要给这个简单函数提供一个枚举值指定你想要进行的操作,然后是一些取决于你所提供的值可能会被使用也可能会被忽略的参数。函数原型看起来类似: ``` long ptrace(enum __ptrace_request request, pid_t pid, void *addr, void *data); ``` -`request` 是我们想对被跟踪进程进行的操作;`pid` 是被跟踪进程的进程 ID;`addr` 是一个内存地址,用于在一些调用中指定被跟踪程序的地址;`data` 是和 `request` 相应的资源。返回值通常是一些错误信息,因此在你实际的代码中你也许应该检查返回值;为了简洁我这里就省略了。你可以查看 man 手册获取更多(关于 ptrace)的信息。 +`request` 是我们想对被跟踪进程进行的操作;`pid` 是被跟踪进程的进程 ID;`addr` 是一个内存地址,用于在一些调用中指定被跟踪程序的地址;`data` 是 `request` 相应的资源。返回值通常是一些错误信息,因此在你实际的代码中你也许应该检查返回值;为了简洁我这里就省略了。你可以查看 man 手册获取更多(关于 ptrace)的信息。 -上面代码中我们发送的请求 `PTRACE_TRACEME` 表示这个进程应该允许父进程跟踪它。所有其它参数都会被忽略,因为 API 设计并不是很重要 +上面代码中我们发送的请求 `PTRACE_TRACEME` 表示这个进程应该允许父进程跟踪它。所有其它参数都会被忽略,因为 API 设计并不是很重要,哈哈。 -下一步,我们会调用 `execl`,这是很多类似的 `exec` 函数之一。我们执行指定的程序,通过命令行参数传递它的名称,然后用一个 `nullptr` 终止列表。如果你愿意,你还可以传递其它执行你的程序所需的参数。 +下一步,我们会调用 `execl`,这是很多诸多的 `exec` 函数格式之一。我们执行指定的程序,通过命令行参数传递它的名称,然后用一个 `nullptr` 终止列表。如果你愿意,你还可以传递其它执行你的程序所需的参数。 -在完成这些后,我们就会结束子进程的执行;在我们结束它之前它会一直执行。 - -* * * +在完成这些后,我们就会和子进程一起结束;在我们结束它之前它会一直执行。 ### 添加调试循环 @@ -134,7 +137,7 @@ private: }; ``` -在 `run` 函数中,我们需要等待,直到子进程完成启动,然后一直从 linenoise 获取输入直到收到 EOF(ctrl+d)。 +在 `run` 函数中,我们需要等待,直到子进程完成启动,然后一直从 `linenoise` 获取输入直到收到 `EOF`(`CTRL+D`)。 ``` void debugger::run() { @@ -151,15 +154,13 @@ void debugger::run() { } ``` -当被跟踪的进程启动时,会发送一个 `SIGTRAP` 信号给它,这是一个跟踪或者断点中断。我们可以使用 `waitpid` 函数等待直到这个信号被发送。 +当被跟踪的进程启动时,会发送一个 `SIGTRAP` 信号给它,这是一个跟踪或者断点中断。我们可以使用 `waitpid` 函数等待这个信号发送。 -当我们知道进程可以被调试之后,我们监听用户输入。`linenoise` 函数它自己会用一个窗口显示和处理用户输入。这意味着我们不需要做太多的工作就会有一个有历史记录和导航命令的命令行。当我们获取到输入时,我们把命令发给我们写的小程序 `handle_command`,然后我们把这个命令添加到 linenoise 历史并释放资源。 - -* * * +当我们知道进程可以被调试之后,我们监听用户输入。`linenoise` 函数它自己会用一个窗口显示和处理用户输入。这意味着我们不需要做太多的工作就会有一个支持历史记录和导航命令的命令行。当我们获取到输入时,我们把命令发给我们写的小程序 `handle_command`,然后我们把这个命令添加到 `linenoise` 历史并释放资源。 ### 处理输入 -我们的命令和 gdb 以及 lldb 有类似的格式。要继续执行程序,用户需要输入 `continue` 或 `cont` 甚至只需 `c`。如果他们想在一个地址中设置断点,他们会输入 `break 0xDEADBEEF`,其中 `0xDEADBEEF` 就是所需地址的 16 进制格式。让我们来增加对这些命令的支持吧。 +我们的命令类似 gdb 以及 lldb 的格式。要继续执行程序,用户需要输入 `continue` 或 `cont` 甚至只需 `c`。如果他们想在一个地址中设置断点,他们会输入 `break 0xDEADBEEF`,其中 `0xDEADBEEF` 就是所需地址的 16 进制格式。让我们来增加对这些命令的支持吧。 ``` void debugger::handle_command(const std::string& line) { @@ -222,7 +223,7 @@ void debugger::continue_execution() { via: http://blog.tartanllama.xyz/c++/2017/03/21/writing-a-linux-debugger-setup/ -作者:[Simon Brand ][a] +作者:[Simon Brand][a] 译者:[ictlyh](https://github.com/ictlyh) 校对:[jasminepeng](https://github.com/jasminepeng) From d5a96a39062ec29d9f2df61144a3e71ed86451c8 Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 22 Jun 2017 09:29:33 +0800 Subject: [PATCH 0479/1407] translated --- ...s Big Bang One Kernel Countless Distros.md | 96 ------------------- ...s Big Bang One Kernel Countless Distros.md | 96 +++++++++++++++++++ 2 files changed, 96 insertions(+), 96 deletions(-) delete mode 100644 sources/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md create mode 100644 translated/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md diff --git a/sources/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md b/sources/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md deleted file mode 100644 index 8f2b45d0de..0000000000 --- a/sources/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md +++ /dev/null @@ -1,96 +0,0 @@ -translating---geekpi - -Linux's Big Bang: One Kernel, Countless Distros -============================================================[Print][1][Email][2]By Jonathan Terrasi  -Apr 27, 2017 3:24 PM PT -![linus-torvalds](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2017-linus-torvalds-1.jpg) - -Even if you're a newcomer to Linux, you've probably figured out that it is not a single, monolithic operating system, but a constellation of projects. The different "stars" in this constellation take the form of "distributions," or "distros." Each offers its own take on the Linux model. - -To gain an appreciation of the plethora of options offered by the range of distributions, it helps to understand how Linux started out and subsequently proliferated. With that in mind, here's a brief introduction to Linux's history. - -### Linus Torvalds, Kernel Builder - -Most people with any familiarity with Linux have heard of its creator, Linus Torvalds (pictured above), but not many know why he created it in the first place. In 1991, Torvalds was a university student in Finland studying computers. As an independent personal project, he wanted to create a Unix-like kernel to build a system for his unique hardware. - -The "kernel" is the part of an operating system that mediates between the hardware, via its firmware, and the OS. Essentially, it is the heart of the system. Developing a kernel is no small feat, but Torvalds was eager for the challenge and found he had a rare knack for it. - -As he was new to kernels, he wanted input from others to ensure he was on the right track, so he solicited the experience of veteran tinkerers on Usenet, the foremost among early Internet forums, by publishing the code for his kernel. Contributions flooded in. - -After establishing a process for reviewing forum-submitted patches and selectively integrating them, Torvalds realized he had amassed an informal development team. It quickly became a somewhat formal development team once the project took off. - -### Richard Stallman's Role - -Though Torvalds and his team created the Linux kernel, there would have been no subsequent spread of myriad Linux distributions without the work of Richard Stallman, who had launched the free software movement a decade earlier. - -Frustrated with the lack of transparency in many core Unix programming and system utilities, Stallman had decided to write his own -- and to share the source code freely with anyone who wanted it and also was committed to openness. He created a considerable body of core programs, collectively dubbed the "GNU Project," which he launched in 1983. - -Without them, a kernel would not have been of much use. Early designers of Linux-based OSes readily incorporated the GNU tools into their projects. - -Different teams began to emerge -- each with its own philosophy regarding computing functions and architecture. They combined the Linux kernel, GNU utilities, and their own original software, and "distributed" variants of the Linux operating system. - -### Server Distros - -Each distro has its own design logic and purpose, but to appreciate their nuances it pays to understand the difference between upstream and downstream developers. An "upstream developer" is responsible for actually creating the program and releasing it for individual download, or for including it in other projects. By contrast, a "downstream developer," or "package maintainer," is one who takes each release of the upstream program and tweaks it to fit the use case of a downstream project. - -While most Linux distributions include some original projects, the majority of distribution development is "downstream" work on the Linux kernel, GNU tools, and the vast ecosystem of user programs. - -Many distros make their mark by optimizing for specific use cases. For instance, some projects are designed to run as servers. Distributions tailored for deployment as servers often will shy away from quickly pushing out the latest features from upstream projects in favor of releasing a thoroughly tested, stable base of essential software that system administrators can depend on to run smoothly. - -Development teams for server-focused distros often are large and are staffed with veteran programmers who can provide years of support for each release. - -### Desktop Distros - -There is also a wide array of distributions meant to run as user desktops. In fact, some of the more well-known of these are designed to compete with major commercial OSes by offering a simple installation and intuitive interface. These distributions usually include enormous software repositories containing every user program imaginable, so that users can make their systems their own. - -As usability is key, they are likely to devote a large segment of their staff to creating a signature, distro-specific desktop, or to tweaking existing desktops to fit their design philosophy. User-focused distributions tend to speed up the downstream development timetable a bit to offer their users new features in a timely fashion. - -"Rolling release" projects -- a subset of desktop distributions -- are crafted to be on the bleeding edge. Instead of waiting until all the desired upstream programs reach a certain point of development and then integrating them into a single release, package maintainers for rolling release projects release a new version of each upstream program separately, once they finish tweaking it. - -One advantage to this approach is security, as critical patches will be available faster than non-rolling release distros. Another upside is the immediate availability of new features that users otherwise would have to wait for. The drawback for rolling release distributions is that they require more manual intervention and careful maintenance, as certain upgrades can conflict with others, breaking a system. - -### Embedded Systems - -Yet another class of Linux distros is known as "embedded systems," which are extremely trimmed down (compared to server and desktop distros) to fit particular use cases. - -We often forget that anything that connects to the Internet or is more complex than a simple calculator is a computer, and computers need operating systems. Because Linux is free and highly modular, it's usually the one that hardware manufacturers choose. - -In the vast majority of cases, if you see a smart TV, an Internet-connected camera, or even a car, you're looking at a Linux device. Practically every smartphone that's not an iPhone runs a specialized variety of embedded Linux too. - -### Linux Live - -Finally, there are certain Linux distros that aren't meant to be installed permanently in a computer, but instead reside on a USB stick and allow other computers to boot them up without touching the computer's onboard hard drive. - -These "live" systems can be optimized to perform a number of tasks, ranging from repairing damaged systems, to conducting security evaluations, to browsing the Internet with high security. - -As these live Linux distros usually are meant for tackling very specific problems, they generally include specialized tools like hard drive analysis and recovery programs, network monitoring applications, and encryption tools. They also keep a light footprint so they can be booted up quickly. - -### How Do You Choose? - -This is by no means an exhaustive list of Linux distribution types, but it should give you an idea of the scope and variety of the Linux ecosystem. - -Within each category, there are many choices, so how do you choose the one that might best suit your needs? - -One way is to experiment. It is very common in the Linux community to go back and forth between distros to try them out, or for users to run different ones on different machines, according to their needs. - -In a future post, I'll showcase a few examples of each type of distribution so you can try them for yourself and begin your journey to discovering the one you like best. - --------------------------------------------------------------------------------- - -作者简介: - -Jonathan Terrasi has been an ECT News Network columnist since 2017. His main interests are computer security (particularly with the Linux desktop), encryption, and analysis of politics and current affairs. He is a full-time freelance writer and musician. His background includes providing technical commentaries and analyses in articles published by the Chicago Committee to Defend the Bill of Rights. - ------- - -via: http://www.linuxinsider.com/story/84489.html?rss=1 - -作者:[ Jonathan Terrasi ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.linuxinsider.com/story/84489.html?rss=1#searchbyline -[1]:http://www.linuxinsider.com/story/84489.html?rss=1# -[2]:http://www.linuxinsider.com/perl/mailit/?id=84489 diff --git a/translated/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md b/translated/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md new file mode 100644 index 0000000000..999c388c0a --- /dev/null +++ b/translated/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md @@ -0,0 +1,96 @@ +Linux 大爆炸:一个内核,无数发行版 +============================================================ +[Print][1][Email][2]By Jonathan Terrasi  Apr 27, 2017 3:24 PM PT + +![linus-torvalds](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2017-linus-torvalds-1.jpg) + +即使你是 Linux 新人,或许你已经知道它不是一个单一的整体操作系统,而是一群项目。这个星座中不同的“星”组成了“发行版”。每个都提供了自己的 Linux 模式。 + +要欣赏这一系列发行版提供的多种选择,这有助于了解 Linux 如何开始并随后激增的。考虑到这一点,这里简要介绍一下 Linux 的历史。 + +### Linus Torvalds,内核构建者 + +大多数熟悉 Linux 的人都已经听说过它的创建者,Linus Torvalds (上图中的人), 但是并不知道他最初为何创建它。在 1991 年,Torvalds 是一名在芬兰学习计算机的大学生。作为一个独立的个人项目,他希望为他的独特硬件创建一个类 Unix 内核。 + +“内核”是通过其固件和操作系统在硬件之间进行协调的操作系统的一部分。本质上,它是系统的核心。开发内核不是一个小工程,但是 Torvalds 渴望挑战,并且发现他自己有这个罕见的技能。 + +由于他刚接触内核,他希望得到其他人的投入来确保他在正确的轨道上,因此他通过在早期的互联网论坛 Usenet 发布他的内核代码并征求了老牌的老手的经验。贡献者涌入了。 + +在建立了一个检查论坛提交补丁以及选择性地集成它们的流程后,Torvalds 意识到他聚集了一个非正式的团队。在项目发展之后,它很快成为了一个有点正式的开发团队。 + +### Richard Stallman 的角色 + +虽然 Torvalds 以及他的团建创造了 Linux 内核,但是没有 Richard Stallman 的工作也不会有随后 Linux 众多发行版的传播,他在十年之前启动了一个自由软件运动。 + +受到许多核心 Unix 编程和系统程序缺乏透明度的阻挠,Stallman 决定自己编写,与任何想要它的人自由共享源代码,并且开放提交。他创造了许多核心项目的主体,并在 1983 年发布,统称为 “GNU 项目”。 + +没有它们,内核不会有那么多的使用。基于 Linux 操作系统的早期设计人员将 GNU 工具轻松地并入他们的项目中。 + +不同的团队开始出现 - 每个团队都有自己的计算功能和架构理念。它们结合了 Linux 内核、GNU 实用程序和他们自己的原始软件以及 Linux 操作系统的“发行”变体。 + +### 服务器发行版 + +每个发行版有它自己的设计逻辑和目的,但是要了解它们的细微差别,需要了解上游和下游开发人员之间的区别。“上游开发人员”负责实际创建项目并发布以供个人下载或将其包含在其他项目中。相比之下,“下游开发人员”或“软件包维护人员”是指每个发布上游程序的人员,并进行调整以适应下游项目的使用情况。 + +虽然大多数 Linux 发行版包含一些原始项目,但大部分发行版是“下游”的 Linux 内核、GNU 工具和庞大的用户程序生态系统。 + +许多发行通过优化特定使用场景来标记它们的特征。例如, 某些项目被设计作为服务器运行。为部署服务器而量身定制的发行版通常会避开上游项目中快速推出最新的功能, 而倾向于发布一个经过彻底测试的、基础的基本软件, 这些系统管理员可以依靠它来顺利运行。 + +针对服务器的开发团队经常很大,并且有富有经验的程序员可以为每个版本提供多年的支持。 + +### 桌面发行版 + +也有很多的发行版针对桌面用户。事实上,一些知名的发行版通过提供简单的安装以及直观的界面来与商业的操作系统竞争。这些发行版通常包含了大量的软件仓库,它包含了用户可以想到的每个软件,这样用户可以制作它们自己的系统。 + +由于可用性是关键,他们可能会投入部门大量的员工来创建一个签名、发行版特定的桌面,或调整现有的桌面以适应其设计理念。以用户为中心的发行版往往会加快下游开发时间表,有助于及时为用户提供新功能。 + +“滚动发布”项目 - 桌面发行版的子集 - 被设计成紧跟潮流。滚动发布项目的包维护人员在完成调整后会分别发布每个上游程序的新版本,而不是等待所需的上游程序达到某一特定的开发点,然后将其集成到单个版本中,。 + +这种方法的一个优点是安全性,因为关键补丁将比非滚动发行版更快。另一个好处是新功能立即可用,不然用户将不得不等待。滚动发布的缺点是需要更多的人工干预和仔细维护,因为某些升级可能会与其他升级相冲突从而破坏系统。 + +### 嵌入式系统 + +另外一个 Linux 发行版类别是“嵌入式系统”,它被极限地裁剪(相对与服务器和桌面发行版)来适应特定的使用情况。 + +我们经常忘记任何连接到因特网的东西,或者比一个简单的计算器复杂的东西,都是计算机,计算机需要操作系统。因为 Linux 是自由的并且高度模块化,它通常是硬件厂商的选择。 + + +在大多数情况下,如果你看见一台智能电视、一台连接互联网的照相机、甚至是一辆车,你看到的都是 Linux 设备。特别是每部不是 iPhone 的智能手机运行着不同的嵌入式 Linux。 + +### Linux Live + +最后,有一些 Linux 发行版并不着永久性地安装在计算机中,而是驻留在 USB 记忆棒上,并允许其他计算机启动它们,而无需计算机硬盘。 + +这些 “live” 系统可以被优化来执行一些任务。从修复损坏的系统到进行安全评估到高度安全浏览因特网。 + +由于这些 live Linux 发行版通常针对解决特定的问题,因此它们通常包含特定的工具,像磁盘分析和恢复程序、网络监控程序和加密工具。它们还占用很小的空间,因此它们可以快速启动。 + +### 你如何选择? + +这绝不是 Linux 发行版类型的全面列表,但那是它应该让你了解一个范围以及 Linux 生态系统的多样化了。 + +在每个类别下都有许多选择,因此你会如何选择一个最能符合你需求的版本呢? + +一种方式是试验。在 Linux 社区中,来回尝试不同的发行版,或者用户根据他们的需求在不同的机器上运行不同的发行版很常见。 + +在将来的文章中,我会展示每种类型发行版的几个例子,以便你可以自己尝试,并开始探索最喜欢的发行版的旅程。 + +-------------------------------------------------------------------------------- + +作者简介: + +自 2017 年以来 Jonathan Terrasi 一直是 ECT 新闻网的专栏作家。他的主要兴趣是计算机安全(特别是 Linux 桌面),加密和分析政治和时事。他是全职自由作家和音乐家。他的背景包括在芝加哥委员会发表的保卫人权法案文章中提供技术评论和分析。 + +------ + +via: http://www.linuxinsider.com/story/84489.html?rss=1 + +作者:[ Jonathan Terrasi ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.linuxinsider.com/story/84489.html?rss=1#searchbyline +[1]:http://www.linuxinsider.com/story/84489.html?rss=1# +[2]:http://www.linuxinsider.com/perl/mailit/?id=84489 From b1cc85c511e383ddd1ca083a9dee17e597292451 Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 22 Jun 2017 09:46:29 +0800 Subject: [PATCH 0480/1407] translating --- sources/talk/20170314 One Year Using Go.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/talk/20170314 One Year Using Go.md b/sources/talk/20170314 One Year Using Go.md index 37c9a5353d..9c98323094 100644 --- a/sources/talk/20170314 One Year Using Go.md +++ b/sources/talk/20170314 One Year Using Go.md @@ -1,3 +1,5 @@ +translating----geekpi + [One Year Using Go][18] ============================================================ From 68e433b86754536e9b6dca26485c832bb0263bdb Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 22 Jun 2017 10:17:25 +0800 Subject: [PATCH 0481/1407] PRF:20170509 Much ado about communication.md @geekpi @jasminepeng --- .../20170509 Much ado about communication.md | 50 +++++++++---------- 1 file changed, 25 insertions(+), 25 deletions(-) diff --git a/translated/tech/20170509 Much ado about communication.md b/translated/tech/20170509 Much ado about communication.md index 2f8623f1f2..ae267902d2 100644 --- a/translated/tech/20170509 Much ado about communication.md +++ b/translated/tech/20170509 Much ado about communication.md @@ -1,79 +1,79 @@ -关于沟通的很多纷扰 +关于开源项目如何选择沟通渠道的思考 ============================================================ -### 开源项目的首要挑战是找出最佳的贡献者协作方式 - +> 开源项目的首要挑战是找出最佳的贡献者协作方式 ![Much ado about communication](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/rh_003601_05_mech_osyearbook2016_business_cc.png?itok=xZestz1h "Much ado about communication") ->图片提供: Opensource.com -开源项目要面对的首要挑战之一是如何在贡献者之间沟通。这里有很多的选择:论坛、聊天频道、问题列表、邮件列表、pull request 等等。我们该选择哪个合适的来使用,我们又该如何做呢? +开源项目要面对的首要挑战之一是如何在贡献者之间沟通。这里有很多的选择:论坛、聊天频道、工单(issue)、邮件列表、拉取请求(pull request)等等。我们该选择哪个合适的来使用,我们又该如何做呢? -令人遗憾的是,项目往往不愿做出约束性的决定,而是选择“上述所有”。这就导致了一个支离破碎的社区:有些人使用 Slack/Mattermost/IRC,而有些人使用论坛,有些使用邮件列表,有些使用问题列表,很少有人能够读到所有这些途径的内容。 +令人遗憾的是,项目本身往往不愿做出约束性的决定,而是选择“上述所有”。这就导致了一个支离破碎的社区:有些人使用 Slack/Mattermost/IRC,而有些人使用论坛,有些使用邮件列表,有些则存在于工单之中,很少有人能够读到所有这些途径的内容。 -在我[帮助建立内部和外部社区][2]的组织中,这是一个常见的问题。我们会选择哪个渠道,以及出于什么目的?另外,何时可以对它们之一说不呢? +在我[帮助其建立内外部社区][2]的组织中,这是一个常见的问题。我们会选择哪个渠道,以及出于什么目的?另外,何时可以对它们之一说不呢? 这就是我想在此处深度探讨的。 ### 结构化和非结构化 -我并不是个聪明人。因此,我倾向于将问题分成小的部分,这样我可以更好地理解它们。类似地,我倾向于将一个情景中不同困难的选择变成更小的题目,来更好地理解它们的目的。我在沟通渠道的选择上也使用这种方法。 +我并不是个聪明人。因此,我倾向于将问题分成小的部分,这样我可以更好地理解它们。类似地,我倾向于将一个情景中各种选择拆解成更小的部分,来更好地理解它们的目的。我在沟通渠道的选择上也使用这种方法。 我认为有两大沟通渠道的分类:结构化和非结构化。 -结构化渠道在每个单独的沟通单位中都有非常具体的重点。例子如:GitHub / GitLab /Jira 的 issue(问题)。一个问题是与 bug 或功能有关的一个非常具体的信息。在帖子发布之后的的讨论中,通常非常集中在该特定主题上并会有一个结果(比如 bugfix 或者一个功能的最终计划)。结果通常都反映在状态(例如 “FIXED”、“WONTFIX” 或 “INVALID”)中。这意味着你可以了解沟通的开始和结束,而无需阅读中间的内容。 +结构化渠道在每个单独的沟通单元中都有非常具体的重点。例子如:GitHub / GitLab /Jira 的工单(issue)。一个工单是与 bug 或功能有关的一个非常具体的信息。在初始的工单帖子发布之后引发的系列讨论中,通常非常集中在该特定话题上,并会有一个结果(比如 bugfix 或者一个功能的最终计划)。结果通常都反映在状态(例如 “FIXED”、“WONTFIX” 或 “INVALID”)中。这意味着你可以了解沟通的始末,而无需阅读中间的内容。 -类似的,pull/merge 请求也是结构化的。它们集中在特定类型(通常是代码)的贡献上。在最初的 pull/merge 请求后,讨论会非常集中在一个结果上:让贡献符合要求,且合并入代码库中。 +类似的,拉取/合并请求也是结构化的。它们集中在特定类型(通常是代码)的贡献上。在最初的拉取/合并请求后,讨论会非常集中在一个结果上:让贡献符合要求,且合并入代码库中。 另一个例子是 StackOverflow/AskBot 这类的问答帖子。这些帖子以一个问题开始,接着被编辑以及回复来提供对这个问题的精确答案。 -通过这些结构化机制,通常几乎不会偏离本来结构。你不会在问题列表,pull request 或问答主题上看到有人问别人他们的孩子/猫/狗/家人在做什么。偏离主题是社区上不可接受的,这是结构化媒体的力量的一部分:它是集中和(通常)高效的。 +通过这些结构化机制,通常几乎不会偏离其本来结构。你不会在工单、拉取请求或问答话题上看到有人问别人他们的孩子/猫/狗/家人在做什么。偏离话题在社区是不可接受的,这是结构化媒体的力量的一部分:它是集中和(通常)高效的。 -反之,非结构化媒体包括聊天频道和论坛。在这些环境中,通常会有一个主题(例如频道或分论坛的主题),但是会话与特定结果或结论的关系要小得多,而且通常情况下可能会更普遍。例如,在开发者邮件列表中,你会看到一系列讨论,包括一般问题、新功能的想法、架构挑战以及与社区自身运营相关的讨论。每一个讨论都必须让参与者保持对话的焦点、主题和工作效率。你可以想象,情况往往不是这样的, 这种讨论可能会偏离一个富有成效的结果。 +反之,非结构化媒体包括聊天频道和论坛。在这些环境中,通常会有一个主题(例如频道或分论坛的主题),但是其中的会话与特定结果或结论的关系要小得多,而且通常情况下可能会更普遍。例如,在开发者邮件列表中,你会看到一系列讨论,包括一般问题、新功能的想法、架构争论以及与社区自身运营相关的讨论。每一个讨论都希望让参与者保持对话的焦点、主题和工作效率。但你可以想象,情况往往不是这样的, 这种讨论可能会偏离一个富有成效的结果。 ### 记录的影响 -除了结构化和非结构化沟通的微妙不同外,记录了什么以及如何可以它们也扮演了一个很大的角色。 +除了结构化和非结构化沟通的微妙不同外,所记录的内容以及它们如何搜索的所带来的影响也很重要。 -典型的,所有的结构化渠道都是记录的。人们可以参考以前的 bug,来自 StackOverflow 的问题可以被反复地重用。你可以搜索一些东西,即使有很多讨论,通常问题、pull request 或者提问都会被更新以反映最终结论。 +典型的,所有的结构化渠道都是记录的。人们可以参考以前的 bug,来自 StackOverflow 的问题可以被反复地重新利用。你可以搜索一些东西,即使有很多讨论、常见问题、拉取请求或者提问,都会被更新以反映最终结论。 -这是一个重点:我们希望能够快速、轻松地挖掘旧问题/提问/ pull request 等,并链接到它们、引用它们。这里的一个关键部分是我们把这个内容转换成可以引用的材料,从而可以用来教育和告知人们以前的知识。随着社区的发展,我们的结构化沟通成为一种知识全集,可以通过以往的经验来告知未来。 +这是一个重点:我们希望能够快速、轻松地挖掘旧问题/提问/拉取请求等,并链接到它们、引用它们。这里的一个关键部分是我们把这个内容转换成可以引用的材料,从而可以用来教育和告知人们以前的知识。随着社区的发展,我们的结构化沟通成为一种知识库,可以通过以往的经验来告知未来。 -这使得非结构化沟通变得越来越糟。一方面,论坛的搜索通常都简单高效,但是它们当然充满了非结构化的对话,所以你正在寻找的东西可能被埋在讨论之中。例如,许多社区使用论坛作为支持工具。虽然这是一个更强大的平台,但是问题在于,一个问题的答案可能是在 16 楼或者 340 楼中有响应。随着越来越多的信息来源(比如 Twitter)的轰炸,我们越来越不耐烦地阅读大量的材料,这对于非结构化媒体来说可能是一个问题。 +而非结构化沟通变得越来越糟。一方面,论坛的搜索通常都简单高效,但是它们当然充满了非结构化的对话,所以你正在寻找的东西可能被埋在讨论之中。例如,许多社区使用论坛作为支持工具。虽然这是一个更强大的平台,但是问题在于,一个问题的答案可能是在 16 楼或者 340 楼中有回复。随着越来越多的信息来源(比如 Twitter)的轰炸,我们越来越不耐烦地阅读大量的材料,这对于非结构化媒体来说可能是一个问题。 -一个专门的有趣案例是实时聊天。历史上,IRC 很多年来为实时聊天铺平了道路,对于大多数 IRC 用户而言很少有(如果有)记录这些讨论的念头。的确,一些项目(比如 Ubuntu)记录了 IRC 日志,但是这通常不是有用的资源。如我的伙伴 Atwood 有一次跟我说的:“如果你不得不在聊天中搜索一些东西时,你已经输了。” +一个有趣的特定案例是实时聊天。历史上,很多年来,IRC 为实时聊天铺平了道路,对于大多数 IRC 用户而言很少有(如果有的话)记录这些讨论的念头。的确,一些项目(比如 Ubuntu)记录了 IRC 日志,但是这通常不是有用的资源。如我的伙伴 Atwood 有一次跟我说的:“如果你不得不在聊天中搜索一些东西时,你已经输了。” -虽然 IRC 在记录上有限制,但是 Slack 和 Mattermost 会好点。交流会被归档,但是问题仍旧存在:你为什么会想在海量的聊天信息中找出一个人提出的观点呢?其他的渠道能更好地引用先前的讨论。 +虽然 IRC 在记录上有所不足,而 Slack 和 Mattermost 会好点。交流会被归档,但是问题仍旧存在:你为什么会想在海量的聊天信息中找出一个人提出的观点呢?其他的渠道能更好地引用先前的讨论。 -不过,这的确创造了一个有趣的机会。聊天相比其他媒体的一个一贯的好处是能体现这是个怎样的人。结构化的渠道,甚至非结构化的渠道,如论坛和邮件列表,很少鼓励袖手旁观的社交讨论。但聊天是的。聊天时你会问:“你周末怎么样?”、 “你见过这个游戏吗?”还有“你下周会看 Testament,Sepultura 和 Prong 吗?” (好吧,也许最后一个只是我。) +不过,这的确创造了一个有趣的机会。聊天相比其他媒体有个一贯的好处是能体现这是个怎样的人。结构化的渠道,甚至非结构化的渠道,如论坛和邮件列表,很少鼓励闲聊。但聊天是的,聊天时你会问:“你周末怎么样?”、 “你见过这个游戏吗?”还有“你下周会看 Testament,Sepultura 和 Prong 吗?” (好吧,也许问最后一个问题的只有我。) 因此,虽然实时聊天相比前面的那些方式也许更低效一些,但是它的确增进了人们的关系。 -### 选择你的毒药 +### 你想喝点什么 因此,回到我们最初的对于开源社区的提问:我们要选择哪个? 虽然这个答案对于不同的项目会不同,但我想在两个层面思考。 -首先,你应该通常优先考虑结构化沟通。这是完成有形工作的地方:bug / issue、pull request、问答讨论等等。如果你资源有限,那么专注在这些渠道上,你可以用较少的时间和金钱支出,获得社区的高效产出。 +首先,你通常应该优先考虑结构化沟通。这是完成有形工作的地方:问题/工单、拉取请求、问答讨论等等。如果你资源有限,那么专注在这些渠道上,你可以用较少的时间和金钱支出,获得社区的高效产出。 再者,如果你热衷于建立一个可以专注于工程、宣传、翻译、文档等方面的更广泛的社区,那么探究是否引入非结构化渠道就有意义了。 社区不仅仅是为了完成工作,也是为了建立关系和友谊,在工作中相互支持,帮助人们在社区中发展壮大。非结构化通信是一个有用的工具。 -当然,我只是在一个大的话题上浅谈即止。 不过我希望在如何评估和选择沟通渠道的价值方面,为大家提供了一些清晰的想法。记住,少即是多:不要被引诱推迟决定并提供所有的渠道。否则你会得到一个支离破碎社区,就像一个空荡荡的餐厅一样。 +当然,我只是在一个大的话题上浅谈辄止。 不过我希望在如何评估和选择沟通渠道的价值方面,为大家提供了一些辨析。记住,少即是多:不要被拥有所有的渠道的妄想而诱惑,否则你会得到一个支离破碎社区,就像一个空荡荡的餐厅一样。 -愿力量与你同在,请让我知道你进行的如何。你可以通过我的[网站][3]和邮箱 [jono@jonobacon.com][4] 联系到我。 +愿原力与你同在,请让我知道你进行的如何。你可以通过我的[网站][3]和邮箱 [jono@jonobacon.com][4] 联系到我。 + +(题图: Opensource.com) -------------------------------------------------------------------------------- 作者简介: -Jono Bacon - Jono Bacon 是一名领先的社区管理者、演讲者、作者和播客。他是 Jono Bacon Consulting 的创始人,提供社区策略/执行、开发者工作流程和其他服务。他以前曾担任 GitHub、Canonical、XPRIZE、OpenAdvantage 的社区总监,并为很多组织曾经提供建议和咨询。 +Jono Bacon 是一名领先的社区管理者、演讲者、作者和播客。他是 Jono Bacon Consulting 的创始人,提供社区策略/执行、开发者工作流程和其他服务。他以前曾担任 GitHub、Canonical、XPRIZE、OpenAdvantage 的社区总监,并为很多组织曾经提供建议和咨询。 -------------------- via: https://opensource.com/article/17/5/much-ado-about-communication -作者:[ Jono Bacon][a] +作者:[Jono Bacon][a] 译者:[geekpi](https://github.com/geekpi) 校对:[jasminepeng](https://github.com/jasminepeng) From 22ae86091f9f7754fd7f49ae154efa7cdd7ecddf Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 22 Jun 2017 10:17:46 +0800 Subject: [PATCH 0482/1407] PUB:20170509 Much ado about communication.md @geekpi @jasminepeng --- .../tech => published}/20170509 Much ado about communication.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170509 Much ado about communication.md (100%) diff --git a/translated/tech/20170509 Much ado about communication.md b/published/20170509 Much ado about communication.md similarity index 100% rename from translated/tech/20170509 Much ado about communication.md rename to published/20170509 Much ado about communication.md From 74e62fe418f1b812b97d5338cb110e26998bd685 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 22 Jun 2017 18:41:39 +0800 Subject: [PATCH 0483/1407] PRF&PUB:20170427 Linux s Big Bang One Kernel Countless Distros.md @geekpi --- ...s Big Bang One Kernel Countless Distros.md | 95 ++++++++++++++++++ ...s Big Bang One Kernel Countless Distros.md | 96 ------------------- 2 files changed, 95 insertions(+), 96 deletions(-) create mode 100644 published/20170427 Linux s Big Bang One Kernel Countless Distros.md delete mode 100644 translated/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md diff --git a/published/20170427 Linux s Big Bang One Kernel Countless Distros.md b/published/20170427 Linux s Big Bang One Kernel Countless Distros.md new file mode 100644 index 0000000000..ed4f165b1d --- /dev/null +++ b/published/20170427 Linux s Big Bang One Kernel Countless Distros.md @@ -0,0 +1,95 @@ +Linux 大爆炸:一个内核,无数发行版 +============================================================ + + +![linus-torvalds](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2017-linus-torvalds-1.jpg) + +即使你是一个 Linux 新人,你可能也已经知道它不是一个单一的、整体的操作系统,而是一群项目。这个星座中不同的“星”组成了“发行版”。每个都提供了自己的 Linux 模式。 + +感谢这一系列发行版所提供的多种选择,这有助于了解 Linux 如何开始并随后激增的。因此,这里会简要介绍一下 Linux 的历史。 + +### Linus Torvalds,内核构建者 + +大多数熟悉 Linux 的人都已经听说过它的创建者 Linus Torvalds (上图中的人),但是并不知道他最初为何创建它。在 1991 年,Torvalds 还是一名在芬兰学习计算机的大学生。作为一个独立的个人项目,他希望为他的独特硬件创建一个类 Unix 内核。 + +“内核”是操作系统的一部分,它介乎于操作系统和硬件之间,通过其固件进行协调。本质上,它是系统的核心。开发内核不是一个小工程,但是 Torvalds 渴望挑战,并且发现他自己有这个罕见的技能。 + +由于他刚接触内核,他希望得到其他人的帮助来确保他走在正确的轨道上,因此他通过在早期的互联网论坛 Usenet 发布他的内核代码,并征求了老牌的老手的经验。然后贡献者就涌来了。 + +在建立了一个对论坛提交的补丁进行审查以及选择性地集成它们的流程后,Torvalds 意识到他聚集起了一个非正式的团队。在项目发展之后,它很快成为了一个比较正式的开发团队。 + +### Richard Stallman 的角色 + +虽然 Torvalds 以及他的团建创造了 Linux 内核,但是没有 Richard Stallman 的工作也不会有随后 Linux 众多发行版的传播,Richard 在十年之前发起了一个自由软件运动。 + +受到许多核心 Unix 程序和系统功能缺乏透明度的阻挠,Stallman 决定自己编写一个,与任何想要它的人自由共享源代码,并且开放提交。他创造了许多核心程序的主体,并在 1983 年发布,统称为 “GNU 项目”。 + +没有它们,内核不会有那么多的用量。基于 Linux 的操作系统的早期设计人员很乐意将 GNU 工具集成到他们的项目中。 + +不同的团队开始出现 - 每个团队都有自己的计算功能和架构的理念。他们将 Linux 内核、GNU 实用程序和他们自己的原始软件结合在一起,然而“发行”了 Linux 操作系统的变体。 + +### 服务器发行版 + +每个发行版有它自己的设计逻辑和目的,但是要了解它们的细微差别,需要了解上游和下游开发人员之间的区别。“上游开发人员”负责实际创建项目并发布,以供个人下载或将其包含在其他项目中。相比之下,“下游开发人员”或“软件包维护人员”是指每个发布上游程序的人员,他们对每个上游程序的版本进行调整以适应下游项目的使用情况。 + +虽然大多数 Linux 发行版包含一些(自己的)原生项目,但大部分发行版开发主要是对 Linux 内核、GNU 工具和庞大的用户程序生态系统的“下游”工作。 + +许多发行通过优化特定使用场景来彰显它们的特征。例如,某些项目被设计作为服务器运行。为部署服务器而量身定制的发行版通常会避开上游项目中快速推出的最新功能,而倾向于发布一个经过彻底测试的、基础的基本软件,系统管理员可以依靠它来顺利运行。 + +针对服务器的发行版的的开发团队经常很大,并且有富有经验的程序员可以为每个版本提供多年的支持。 + +### 桌面发行版 + +也有很多的发行版针对桌面用户。事实上,一些知名的发行版通过提供简单的安装以及直观的界面来与商业的操作系统竞争。这些发行版通常包含了大量的软件仓库,它包含了用户可以想到的每个软件,这样用户可以定制它们自己的系统。 + +由于可用性是关键,他们可能会投入部门大量的员工来创建一个特征鲜明的、发行版特定的桌面,或调整已有的桌面以适应其设计理念。以用户为中心的发行版往往会加快其下游开发时间表,有助于及时为用户提供新功能。 + +“滚动发布”项目,这是一种桌面发行版的子集,其被设计成紧跟潮流。滚动发布项目的包维护人员在为每个上游程序完成调整后分别发布其新版本,而不是等待所需的上游程序的开发达到某一特定的节点,然后将其集成到单个版本中。 + +这种方法的一个优点是安全性,因为其关键补丁的发布将比非滚动发行版更快。另一个好处是新功能立即可用,不然用户需要等待才行。滚动发布的缺点是需要更多的人工干预和仔细维护,因为某些升级可能会与其他升级相冲突从而破坏系统。 + +### 嵌入式系统 + +另外一个 Linux 发行版类别是“嵌入式系统”,它被极致裁剪(相对与服务器和桌面发行版)来适应特定的使用情况。 + +我们经常会忘记那些连接到因特网的任何东西,或者比一个简单的计算器复杂的东西,都是计算机。而计算机需要操作系统。因为 Linux 是自由的并且高度模块化,所以它通常是硬件厂商的选择。 + +在大多数情况下,如果你看见一台智能电视、一台连接互联网的照相机、甚至是一辆车,你看到的都是 Linux 设备。特别是每部非 iPhone 的智能手机都运行着不同的嵌入式 Linux。 + +### Linux 现场版 + +最后,有一些 Linux 发行版并不需要永久性地安装在计算机中,而是驻留在 USB 记忆棒上,并允许在其它的计算机上启动它们,而无需计算机硬盘。 + +这些 “现场版(live)” 的系统可以被优化来执行一些任务。从修复损坏的系统到进行安全评估到高度安全地浏览因特网。 + +由于这些 现场版 Linux 发行版通常针对解决特定的问题,因此它们一般都包含特定的工具,像磁盘分析和恢复程序、网络监控程序和加密工具。它们还占用很小的空间,因此它们可以快速启动。 + +### 你如何选择? + +这绝不是 Linux 发行版类型的全面列表,但它应该可以让你大致了解 Linux 生态系统的范围和多样化了。 + +在每个类别下都有许多选择,因此你会如何选择一个最能符合你需求的版本呢? + +一种方式是试验。在 Linux 社区中,来回尝试不同的发行版,或者为用户根据他们的需求在不同的机器上运行不同的发行版,这都很常见。 + +在将来的文章中,我会展示每种类型发行版的几个例子,以便你可以自己尝试,并开始探索最喜欢的发行版的旅程。 + +-------------------------------------------------------------------------------- + +作者简介: + +自 2017 年以来 Jonathan Terrasi 一直是 ECT 新闻网的专栏作家。他的主要兴趣是计算机安全(特别是 Linux 桌面),加密和分析政治和时事。他是全职自由作家和音乐家。他的背景包括在芝加哥委员会发表的保卫人权法案文章中提供技术评论和分析。 + +------ + +via: http://www.linuxinsider.com/story/84489.html + +作者:[Jonathan Terrasi][a] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.linuxinsider.com/story/84489.html?rss=1#searchbyline +[1]:http://www.linuxinsider.com/story/84489.html?rss=1# +[2]:http://www.linuxinsider.com/perl/mailit/?id=84489 diff --git a/translated/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md b/translated/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md deleted file mode 100644 index 999c388c0a..0000000000 --- a/translated/tech/20170427 Linux s Big Bang One Kernel Countless Distros.md +++ /dev/null @@ -1,96 +0,0 @@ -Linux 大爆炸:一个内核,无数发行版 -============================================================ -[Print][1][Email][2]By Jonathan Terrasi  Apr 27, 2017 3:24 PM PT - -![linus-torvalds](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2017-linus-torvalds-1.jpg) - -即使你是 Linux 新人,或许你已经知道它不是一个单一的整体操作系统,而是一群项目。这个星座中不同的“星”组成了“发行版”。每个都提供了自己的 Linux 模式。 - -要欣赏这一系列发行版提供的多种选择,这有助于了解 Linux 如何开始并随后激增的。考虑到这一点,这里简要介绍一下 Linux 的历史。 - -### Linus Torvalds,内核构建者 - -大多数熟悉 Linux 的人都已经听说过它的创建者,Linus Torvalds (上图中的人), 但是并不知道他最初为何创建它。在 1991 年,Torvalds 是一名在芬兰学习计算机的大学生。作为一个独立的个人项目,他希望为他的独特硬件创建一个类 Unix 内核。 - -“内核”是通过其固件和操作系统在硬件之间进行协调的操作系统的一部分。本质上,它是系统的核心。开发内核不是一个小工程,但是 Torvalds 渴望挑战,并且发现他自己有这个罕见的技能。 - -由于他刚接触内核,他希望得到其他人的投入来确保他在正确的轨道上,因此他通过在早期的互联网论坛 Usenet 发布他的内核代码并征求了老牌的老手的经验。贡献者涌入了。 - -在建立了一个检查论坛提交补丁以及选择性地集成它们的流程后,Torvalds 意识到他聚集了一个非正式的团队。在项目发展之后,它很快成为了一个有点正式的开发团队。 - -### Richard Stallman 的角色 - -虽然 Torvalds 以及他的团建创造了 Linux 内核,但是没有 Richard Stallman 的工作也不会有随后 Linux 众多发行版的传播,他在十年之前启动了一个自由软件运动。 - -受到许多核心 Unix 编程和系统程序缺乏透明度的阻挠,Stallman 决定自己编写,与任何想要它的人自由共享源代码,并且开放提交。他创造了许多核心项目的主体,并在 1983 年发布,统称为 “GNU 项目”。 - -没有它们,内核不会有那么多的使用。基于 Linux 操作系统的早期设计人员将 GNU 工具轻松地并入他们的项目中。 - -不同的团队开始出现 - 每个团队都有自己的计算功能和架构理念。它们结合了 Linux 内核、GNU 实用程序和他们自己的原始软件以及 Linux 操作系统的“发行”变体。 - -### 服务器发行版 - -每个发行版有它自己的设计逻辑和目的,但是要了解它们的细微差别,需要了解上游和下游开发人员之间的区别。“上游开发人员”负责实际创建项目并发布以供个人下载或将其包含在其他项目中。相比之下,“下游开发人员”或“软件包维护人员”是指每个发布上游程序的人员,并进行调整以适应下游项目的使用情况。 - -虽然大多数 Linux 发行版包含一些原始项目,但大部分发行版是“下游”的 Linux 内核、GNU 工具和庞大的用户程序生态系统。 - -许多发行通过优化特定使用场景来标记它们的特征。例如, 某些项目被设计作为服务器运行。为部署服务器而量身定制的发行版通常会避开上游项目中快速推出最新的功能, 而倾向于发布一个经过彻底测试的、基础的基本软件, 这些系统管理员可以依靠它来顺利运行。 - -针对服务器的开发团队经常很大,并且有富有经验的程序员可以为每个版本提供多年的支持。 - -### 桌面发行版 - -也有很多的发行版针对桌面用户。事实上,一些知名的发行版通过提供简单的安装以及直观的界面来与商业的操作系统竞争。这些发行版通常包含了大量的软件仓库,它包含了用户可以想到的每个软件,这样用户可以制作它们自己的系统。 - -由于可用性是关键,他们可能会投入部门大量的员工来创建一个签名、发行版特定的桌面,或调整现有的桌面以适应其设计理念。以用户为中心的发行版往往会加快下游开发时间表,有助于及时为用户提供新功能。 - -“滚动发布”项目 - 桌面发行版的子集 - 被设计成紧跟潮流。滚动发布项目的包维护人员在完成调整后会分别发布每个上游程序的新版本,而不是等待所需的上游程序达到某一特定的开发点,然后将其集成到单个版本中,。 - -这种方法的一个优点是安全性,因为关键补丁将比非滚动发行版更快。另一个好处是新功能立即可用,不然用户将不得不等待。滚动发布的缺点是需要更多的人工干预和仔细维护,因为某些升级可能会与其他升级相冲突从而破坏系统。 - -### 嵌入式系统 - -另外一个 Linux 发行版类别是“嵌入式系统”,它被极限地裁剪(相对与服务器和桌面发行版)来适应特定的使用情况。 - -我们经常忘记任何连接到因特网的东西,或者比一个简单的计算器复杂的东西,都是计算机,计算机需要操作系统。因为 Linux 是自由的并且高度模块化,它通常是硬件厂商的选择。 - - -在大多数情况下,如果你看见一台智能电视、一台连接互联网的照相机、甚至是一辆车,你看到的都是 Linux 设备。特别是每部不是 iPhone 的智能手机运行着不同的嵌入式 Linux。 - -### Linux Live - -最后,有一些 Linux 发行版并不着永久性地安装在计算机中,而是驻留在 USB 记忆棒上,并允许其他计算机启动它们,而无需计算机硬盘。 - -这些 “live” 系统可以被优化来执行一些任务。从修复损坏的系统到进行安全评估到高度安全浏览因特网。 - -由于这些 live Linux 发行版通常针对解决特定的问题,因此它们通常包含特定的工具,像磁盘分析和恢复程序、网络监控程序和加密工具。它们还占用很小的空间,因此它们可以快速启动。 - -### 你如何选择? - -这绝不是 Linux 发行版类型的全面列表,但那是它应该让你了解一个范围以及 Linux 生态系统的多样化了。 - -在每个类别下都有许多选择,因此你会如何选择一个最能符合你需求的版本呢? - -一种方式是试验。在 Linux 社区中,来回尝试不同的发行版,或者用户根据他们的需求在不同的机器上运行不同的发行版很常见。 - -在将来的文章中,我会展示每种类型发行版的几个例子,以便你可以自己尝试,并开始探索最喜欢的发行版的旅程。 - --------------------------------------------------------------------------------- - -作者简介: - -自 2017 年以来 Jonathan Terrasi 一直是 ECT 新闻网的专栏作家。他的主要兴趣是计算机安全(特别是 Linux 桌面),加密和分析政治和时事。他是全职自由作家和音乐家。他的背景包括在芝加哥委员会发表的保卫人权法案文章中提供技术评论和分析。 - ------- - -via: http://www.linuxinsider.com/story/84489.html?rss=1 - -作者:[ Jonathan Terrasi ][a] -译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.linuxinsider.com/story/84489.html?rss=1#searchbyline -[1]:http://www.linuxinsider.com/story/84489.html?rss=1# -[2]:http://www.linuxinsider.com/perl/mailit/?id=84489 From 5b20c09511c06d875c15a358561b84acb9d255f3 Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 23 Jun 2017 08:48:24 +0800 Subject: [PATCH 0484/1407] translated --- sources/talk/20170314 One Year Using Go.md | 113 ------------------ translated/talk/20170314 One Year Using Go.md | 110 +++++++++++++++++ 2 files changed, 110 insertions(+), 113 deletions(-) delete mode 100644 sources/talk/20170314 One Year Using Go.md create mode 100644 translated/talk/20170314 One Year Using Go.md diff --git a/sources/talk/20170314 One Year Using Go.md b/sources/talk/20170314 One Year Using Go.md deleted file mode 100644 index 9c98323094..0000000000 --- a/sources/talk/20170314 One Year Using Go.md +++ /dev/null @@ -1,113 +0,0 @@ -translating----geekpi - -[One Year Using Go][18] -============================================================ - - ![](https://bugfender.com/wp-content/uploads/2017/03/one-year-using-go-social-1.jpg) - -Our ventures into [Go][5] all started as an internal experiment at [Mobile Jazz][6]. As the company name hints, we develop mobile apps. - -After releasing an app into the wild, we soon realised we were missing a tool to check what was actually happening to users and how they were interacting with the app – something that would have been very handy in the case of any issues or bugs being reported. - -There were a couple of tools around which claimed to help developers in this area, but none of them quite hit the mark, so we decided to build our own. We started by creating a basic set of scripts that quickly evolved into a fully-fledged tool known today as [Bugfender][7]! - -As this was initially an experiment, we decided to try out a new trending technology. A love of learning and continual education is a key aspect of Mobile Jazz’s core values, so we decided to build it using Go; a relatively new programming language developed by Google. It’s a new player in the game and there have been many respected developers saying great things about it. - -One year later and the experiment has turned into a startup, we’ve got an incredible tool that’s already helping thousands of developers all over the world. Our servers are processing over 200GB of data everyday incoming from more than 7 million devices. - -After using Go for a year, we’d like to share some of our thoughts and experiences from taking our small experiment to a production server handling millions and millions of logs. - -### Go Ecosystem - -No one in the company had any previous experience using Go. Bugfender was our first dive into the language. - -Learning the basics was pretty straight forward. Our previous experiences with C/C++/Java/Objective-C/PHP enabled us to learn Go quickly and get developing in days. There were, of course, a few new and unusual things to learn, including GOPATH and how to deal with packages, but that was expected. - -Within a few days, we realized that even being a simplified language by design, Go was extremely powerful. It was able to do everything a modern programming language should: being able to work with JSON, communicate between servers and even access databases with no problems (and with just a few lines of code at that). - -When building a server, you should first decide if you’re going to use any third party libraries or frameworks. For Bugfender, we decided to use: - -### Martini - -[Martini][8] is a powerful web framework for Go. At the time we started the experiment, it was a great solution and to this day, we haven’t experienced any problems with it. However if we were to start this experiment again today, we would choose a different framework as Martini is no longer maintained. - -We’ve further experimented with [Iris][9] (our current favorite) and [Gin][10]. Gin is the successor to Martini and migrating to this will enable us to reuse our existing code. - -In the past year, we’ve realized that Go’s standard libraries are really powerful and that you don’t really need to rely on a heavy web framework to build a server. It is better to use high-performance libraries that specialize in specific tasks. - -~~Iris is our current ~~favourite~~ and in the future, we’ll re-write our servers to use it instead of Martini/Gin, but it’s not a priority right now.~~ - -**Edit:** After some discussions about Iris in differents places, we realized that Iris might not be the best option. If we ever decide to re-write our web components, we might look into other options, we are open to suggestions. - -### Gorm - -Some people are fans of ORM and others are not. We decided to use ORM and more specifically, [GORM][11]. Our implementation was for the web frontend only, keeping it optimized with hand-written SQL for the log ingestion API. In the beginning, we were really happy, but as time progresses, we’ve started to find problems and we are soon going to remove it completely from our code and use a lower level approach using a standard SQL library with [sqlx][12]. - -One of the main problems with GORM is Go’s ecosystem. As a new language, there have been many new versions since we started developing the product. Some changes in these new releases are not backwards compatible and so, to use the newest library versions we are frequently rewriting existing code and checking hacks we may have created to solve version issues. - -These two libraries are the main building blocks of almost any web server, so it’s important to make a good choice because it can be difficult to change later and will affect your server performance. - -### Third-Party Services - -Another important area to consider when creating a real world product is the availability of libraries, third-party services and tools. Here, Go is still lacking maturity, most companies don’t yet provide a Go library, so you may need to rely on libraries written by other people where quality isn’t always guaranteed. - -For example, there are great libraries for using [Redis][13] and [ElasticSearch][14], but libraries for other services such as Mixpanel or Stripe are not so good. - -Our recommendation before using Go is to check beforehand if there’s a good library available for any specific products you may need. - -We’ve also experienced a lot of problems with Go’s package management system. The way it handles versions is far from optimal and over the past year, we have run into various problems getting different versions of the same library between different team members. Recently, however, this problem has been almost solved thanks to the new Go feature that supports vendor packages, alongside the [gopkg.in][15] service. - -### Developer Tools - - ![](https://bugfender.com/wp-content/uploads/2017/03/go-ide.jpg) - -As Go is a relatively new language, you might find the developer tools available are not so great when compared to other established languages like Java. When we started Bugfender it was really hard to use any IDE, none seemed to support Go. But in this last year, this has improved a lot with the introduction of [IntelliJ][16] and [Visual Studio Code Go][17] plugins. - -Finally looking at other Go tools, the debugger is not-so-great and the profiler is even worse, so debugging your code or trying to optimize it can be hard at times. - -### Heading for Production - -This is definitely one of the best things about Go, if you want to deploy something to production you just need to build your binary and send it to the server, no dependencies, no need to install extra software, you only need to be able to run a binary file in your server. - -If you’re used to dealing with other languages where you require a package manager or need to be careful with a language interpreter you may use, Go is a pleasure to work with. - -We are also really happy with Go’s stability as the servers never seem to crash. We faced a problem some time ago sending big amounts of data to Go Routines but since then we’ve rarely seen any crashes. Note: if you need to send a lot of data to a Go Routine, you’ll need to be careful as you can have a heap overflow. - -If you’re interested in performance, we cannot compare to other languages as we have started with Go from scratch, but given the amount of data we process, we feel it’s performance is very good, we definitely wouldn’t be able to process the same number of requests using PHP so easily. - -### Conclusions - -Over the year we’ve had our ups and downs regarding Go. At the beginning we were excited, but after the experiment converted to a real product we started unveiling problems. We’ve thought several times about a complete rewrite in Java, but here we are, still working with Go, and in this past year the ecosystem has had some great improvements that simplified our work. - -If you want to build your product using Go, you can be sure it will work, but you need to be really careful with one thing: the availability of developers to hire. There are only a few senior Go developers in Silicon Valley, and finding one elsewhere can be a very difficult task. - - --------------------------------------------------------------------------------- - -via: https://bugfender.com/one-year-using-go - -作者:[ALEIX VENTAYOL][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://bugfender.com/author/aleixventayol -[1]:https://bugfender.com/#facebook -[2]:https://bugfender.com/#twitter -[3]:https://bugfender.com/#google_plus -[4]:https://www.addtoany.com/share#url=https%3A%2F%2Fbugfender.com%2Fone-year-using-go&title=One%20Year%20Using%20Go -[5]:https://golang.org/ -[6]:http://mobilejazz.com/ -[7]:https://www.bugfender.com/ -[8]:https://github.com/go-martini/martini -[9]:https://github.com/kataras/iris -[10]:https://github.com/gin-gonic/gin -[11]:https://github.com/jinzhu/gorm -[12]:https://github.com/jmoiron/sqlx -[13]:https://github.com/go-redis/redis -[14]:https://github.com/olivere/elastic -[15]:http://labix.org/gopkg.in -[16]:https://plugins.jetbrains.com/plugin/5047-go -[17]:https://github.com/Microsoft/vscode-go -[18]:https://bugfender.com/one-year-using-go diff --git a/translated/talk/20170314 One Year Using Go.md b/translated/talk/20170314 One Year Using Go.md new file mode 100644 index 0000000000..18e90116e2 --- /dev/null +++ b/translated/talk/20170314 One Year Using Go.md @@ -0,0 +1,110 @@ +[Go 使用一周年][18] +============================================================ + + ![](https://bugfender.com/wp-content/uploads/2017/03/one-year-using-go-social-1.jpg) + +我们在 [Mobile Jazz][6] 的一个内部项目开始使用 [Go][5]。如公司名暗示的那样,我们开发移动应用。 + +在发布一个应用给公众后,我们很快意识到我们缺失一个工具来检查用户实际发生的情况以及他们是如何与应用交互的 - 如果有任何问题后者 bug 报告,这将会相当方便。 + +现在有几款工具声称能在这个方面帮助开发者,但是没有一个能完全满足要求,因此我们决定自己构建。我们开始创建一组基础的脚本,如今它很快进化成了完整的工具,称为 [Bugfender][7]! + +由于这最初是一个实验,我们决定使用一种新的趋势技术。对学习以及持续教育的热爱是 Mobile Jazz 的核心价值的重要方面之一,因此我们决定使用 Go 构建。这是一个由 Google 开发的相对新的编程语言。它是游戏中的新玩家,已经有许多受尊敬的开发者对它称赞。 + +一年后,实验变成了一个启动项目,我们拥有了一个已经帮助了来自全世界的数以千计的开发者的令人难以置信的工具。我们的服务器每天处理来自 700 万台设备的超过 200GB 的数据。 + +在使用 Go 一年之后,我们想要分享我们将一个小的实验变成处理百万日志的生产服务器的一些想法和经验。 + +### Go 生态系统 + +公司中没有人有使用 Go 的经验。Bugfender 是我们第一次深入这个语言。 + +学习基本相当直接。我们之前在 C/C++/Java/Objective-C/PHP 的经验让我们学习 Go 相当快,并且在几天内就开始开发。当然会有一些新的还有不常见的东西需要学习,包括 GOPATH 还有如何处理包,但这在预期内。 + +几天之内,我们意识到即使是一个简化设计的语言,Go 是非常强大的。它能够做任何现代编程语言应该能做的事:能够处理 JSON、服务器之间通讯甚至访问数据库也没问题(并且只需要几行代码)。 + +在构建一个服务器时,你应该首先决定是否使用任何第三方库或者框架。对于 Bugfender,我们决定使用: + +### Martini + +[Martini][8] 是一个强大的 Go web 框架。我们开始这个实验时,它是一个很棒的解决方案,至今也是,我们还没遇到任何问题。然而如果我们如今再次开始这个实验,我们会选择一个不同的框架,因为 Martini 不在被维护了。 + +我们还试验了 [Iris][9](我们目前的最爱)还有 [Gin][10]。Gin 是 Martini 继任者,并且迁移到这上能让我们重用已有的代码。 + +在过去的一年中,我们意识到 Go 的标准库是非常强大的,你不必依靠一个臃肿的 web 框架来构建一个服务器。最好在特定任务上使用专门的高性能库。 + +~~Iris 是我们目前 ~~最喜欢的~~ 并且将来我们将使用它重写服务来替代 Martini/Gin,但这目前并不优先。 + +**编辑:** 在不同地方讨论 Iris 之后,我们意识到 Iris 或许不是最好的选择。如果我们决定重写我们的 web 组件,我们或许会研究其他的选择,我们对提议开放。 + +### Gorm + +一些人是 ORM 的粉丝,一些人不是。我们决定使用 ORM,更确切地说是 [GORM][11]。我们的实现只针对 web 前端,对于日志提取 API 仍然保持使用手写优化的 SQL。在一开始,我们确实很高兴,但是随着时间的推移,我们开始发现问题,并且我们很快将它从代码中完全移除,并且使用 [sqlx][12] 这个标准 SQL 库。 + +GORM 的一个主要问题是 Go 的生态系统。作为一个新语言,自我们开始开发产品以来已经有很多新版本。在这些新版本中的一些改变并不向后兼容,因此要使用最新库版本,我们要经常重新已有代码并检查我们为解决版本问题做的 hack。 + +这两个库是大多数 web 服务的主要组件,因此做一个好的选择很重要,因为将来更改会很困难,并且会影响你服务器的性能。 + +### 第三方服务 + +在创建一个真实世界产品的另外一个重要方面是考虑库、第三方服务和工具的可用性。在这方面,Go 还缺乏成熟度,大多数公司还没有提供 Go 库,因此你或许需要依赖其他人写的质量不能总是保证的库。 + +比如,对于使用 [Redis][13] 和 [ElasticSearch][14] 有很好的库,但是对于其他服务比如 Mixpanel 或者 Stripe 还没有好的。 + +我们建议在使用 Go 之前事先检查对于你需要的产品是否有好的库可用。 + +我们在 Go 的包管理系统上也遇到了很多问题。它处理版本的方式远没有达到最好,并且在过去的一年中,我们在不同的团队成员之间获取到同一个库的不同版本上遇到了很多问题。然而,最近要归功于 Go 新支持的 vendor 包特性,除了 [gopkg.in][15] 服务外,这个问题基本被解决了。 + +### 开发者工具 + + ![](https://bugfender.com/wp-content/uploads/2017/03/go-ide.jpg) + +由于 Go 是一门相对新的语言,你或许发现相比其他成熟的语言像 Java,它可用的开发工具并不很好。当我们开始 Bugfender 时,使用任何 IDE 都很困难,似乎没有 IDE 支持 Go。但是在过去的一年中,随着 [IntelliJ][16] 和 [Visual Studio Code Go][17] 插件的引入,这一切提高了很多。 + +最后看下其他的 Go 工具,调试器并不很好并且分析器甚至更糟,因此有时调试你的代码或者尝试优化它会很困难。 + +### 前往生产 + +这确实是 Go 最好的东西之一,如果你想要部署一些东西到生产环境中,你只需要构建你的二进制并发送到服务器中,没有依赖,不需要安装额外的软件,你只需要能在服务器中运行进制文件。 + +如果你习惯于处理那些需要包管理器或者需要小心你使用的语言解释器的语言,用 Go 工作会很高兴。 + +我们对 Go 的稳定性也很满意,因为服务器似乎从没有崩溃过。我们在发送大量数据给 Go Routines 时遇到过一个问题,但是我们几乎没见到任何崩溃。注意:如果你需要发送大量数据给 Go Routine,你需要小心堆溢出。 + +如果你对性能感兴趣,我们不能与其他语言比较,因为我们从零开始使用 Go,但是对于我们处理的数据量,我们感觉性能是非常好的,我们绝对不能如此轻松地使用 PHP 处理同等数量的请求。 + +### 总结 + +在过去的一年中,我们对 Go 有起起伏伏。最初我们是兴奋的,但是在实验变成真实的产品后我们开始揭露问题。我们几次考虑过用 Java 完全重写,但是目前为止,仍旧使用的是 Go,并且过去的一年中,生态已经有了很大的提升,这简化了我们的工作。 + +如果你想要使用 Go 构建你的产品,你可以保证这可以工作,但是你确实需要小心一件事:可以雇佣的开发者。硅谷中只有很少的高级 Go 开发者,并且在其他地方寻找也是一件非常困难的任务。 + +-------------------------------------------------------------------------------- + +via: https://bugfender.com/one-year-using-go + +作者:[ALEIX VENTAYOL][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://bugfender.com/author/aleixventayol +[1]:https://bugfender.com/#facebook +[2]:https://bugfender.com/#twitter +[3]:https://bugfender.com/#google_plus +[4]:https://www.addtoany.com/share#url=https%3A%2F%2Fbugfender.com%2Fone-year-using-go&title=One%20Year%20Using%20Go +[5]:https://golang.org/ +[6]:http://mobilejazz.com/ +[7]:https://www.bugfender.com/ +[8]:https://github.com/go-martini/martini +[9]:https://github.com/kataras/iris +[10]:https://github.com/gin-gonic/gin +[11]:https://github.com/jinzhu/gorm +[12]:https://github.com/jmoiron/sqlx +[13]:https://github.com/go-redis/redis +[14]:https://github.com/olivere/elastic +[15]:http://labix.org/gopkg.in +[16]:https://plugins.jetbrains.com/plugin/5047-go +[17]:https://github.com/Microsoft/vscode-go +[18]:https://bugfender.com/one-year-using-go From 0a225ace1011b3b74afb38c0f31870bbe7dbb938 Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 23 Jun 2017 08:53:05 +0800 Subject: [PATCH 0485/1407] translating --- ...21 7 ways to discuss legal matters with an open community.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/talk/20170321 7 ways to discuss legal matters with an open community.md b/sources/talk/20170321 7 ways to discuss legal matters with an open community.md index ad3f493882..5a0f4abbbd 100644 --- a/sources/talk/20170321 7 ways to discuss legal matters with an open community.md +++ b/sources/talk/20170321 7 ways to discuss legal matters with an open community.md @@ -1,3 +1,5 @@ +translating------geekpi + 7 ways to discuss legal matters with an open community ============================================================ From 6b83f5e5b2a3903fa7895dc44973b3e67c09dfed Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 23 Jun 2017 09:59:06 +0800 Subject: [PATCH 0486/1407] PRF:20160831 Apache Spark Scale - A 60 TB production use case.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @wyangsun 辛苦了! --- ...ark Scale - A 60 TB production use case.md | 110 +++++++++--------- 1 file changed, 56 insertions(+), 54 deletions(-) diff --git a/translated/tech/20160831 Apache Spark Scale - A 60 TB production use case.md b/translated/tech/20160831 Apache Spark Scale - A 60 TB production use case.md index a1b160dce1..b8c619e841 100644 --- a/translated/tech/20160831 Apache Spark Scale - A 60 TB production use case.md +++ b/translated/tech/20160831 Apache Spark Scale - A 60 TB production use case.md @@ -1,110 +1,112 @@ -Apache Spark 一个60TB+规模的产品使用案例 +Apache Spark 大规模应用:一个 60TB+ 规模的产品使用案例 =========== -Facebook 经常使用数据驱动的分析方法来做决策。在过去的几年,用户和产品的增长已经推动了我们的分析工程师在数十兆兆字节数据集上执行单独的查询。我们的一些批量分析执行在可敬的 [Hive][1] 平台(在2009年 Facebook 贡献了 Apache Hive)和 [Corona][2],我们的客户 MapReduce 实现。Facebook还针对几个内部数据存储(包括Hive)继续增加其对Presto ANSI-SQL 语句的封装。我们支持其他分析类型,比如图片处理和机器学习([Apache Giraph][3])和流(例如,[Puma][4],[Swift][5] 和 [Stylus][6])。 -同时 Facebook 的所有产品涵盖了广泛的分析领域,为了共享我们的经验也为了从其他人学习,我们与开源社区继续相互影响。[Apache Spark][7] 于2009年在加州大学伯克利分校的 AMPLab 由Matei Zaharia 发起,后来在2013年贡献给 Apache。它是目前增长最快的数据处理平台之一,由于它能支持流,批,命令式(RDD),声明式(SQL),图形和机器学习用例,所有这些内置在相同的API和底层计算引擎。Spark 可以有效地利用更大量的内存,优化整个流程中的代码,并跨任务重用 JVM 以获得更好的性能。最近我们感觉 Spark 已经成熟,我们可以把他与 Hive 比较,做一些批量处理用例。文章其余的部分,我们讲述了扩展 Spark 来替代我们一个 Hive 工作量时的经验和学习到的教训。 +Facebook 经常使用数据驱动的分析方法来做决策。在过去的几年,用户和产品的增长已经需要我们的分析工程师一次查询就要操作数十 TB 大小的数据集。我们的一些批量分析执行在古老的 [Hive][1] 平台( Apache Hive 由 Facebook 贡献于 2009 年)和 [Corona][2] 上——这是我们定制的 MapReduce 实现。Facebook 还不断增加其对 Presto 的用量,用于对几个包括 Hive 在内的内部数据存储的 ANSI-SQL 查询。我们也支持其他分析类型,比如图数据库处理(graph processing)和机器学习([Apache Giraph][3])和流(例如:[Puma][4]、[Swift][5] 和 [Stylus][6])。 -### 用例:实体排名功能准备 +同时 Facebook 的各种产品涵盖了广泛的分析领域,我们与开源社区不断保持沟通,以便共享我们的经验并从其他人那里学习。[Apache Spark][7] 于 2009 年在加州大学伯克利分校的 AMPLab 由 Matei Zaharia 发起,后来在2013 年贡献给 Apache。它是目前增长最快的数据处理平台之一,由于它能支持流、批量、命令式(RDD)、声明式(SQL)、图数据库和机器学习等用例,而且所有这些都内置在相同的 API 和底层计算引擎中。Spark 可以有效地利用更大量级的内存,优化整个流水线(pipeline)中的代码,并跨任务重用 JVM 以获得更好的性能。最近我们感觉 Spark 已经成熟,我们可以在一些批量处理用例方面把它与 Hive 相比较。在这篇文章其余的部分,我们讲述了在扩展 Spark 来替代我们一个 Hive 工作任务时的所得到经验和学习到的教训。 -在 Facebook 以多种方式使用实时实体排名。对于一些在线服务平台原始特性数值由 Hive 线下生成,然后将数据加载到实时关联查询系统。几年前建立的基于 Hive 的老式基础设施在计算上是资源密集型的并且很难维护,因为流程被划分成数百个较小的 Hive 工作。为了可以使用更加新的功能数据和提供可管理性,我们拿一个现有的流水线然后试着将其迁移至 Spark。 +### 用例:实体排名的特征准备 + +Facebook 会以多种方式做实时的实体(entity)排名。对于一些在线服务平台,原始特征值是由 Hive 线下生成的,然后将数据加载到实时关联查询系统。我们在几年前建立的基于 Hive 的老式基础设施属于计算资源密集型,且很难维护,因为其流水线被划分成数百个较小的 Hive 任务。为了可以使用更加新的特征数据和提升可管理性,我们拿一个现有的流水线试着将其迁移至 Spark。 ### 以前的 Hive 实现 -基于 Hive 的管道由三个逻辑阶段组成,每个阶段对应由 entity_id 划分的数百个较小的 Hive 作业,因为每个阶段运行大型 Hive 作业不太可靠,并受到每个作业的最大任务数量的限制。 +基于 Hive 的流水线由三个逻辑阶段(stage)组成,每个阶段对应由 entity_id 划分的数百个较小的 Hive 作业,因为在每个阶段运行大型 Hive 作业(job)不太可靠,并受到每个作业的最大任务(task)数量的限制。 -![](https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xaf1/t39.2365-6/14050196_257613611304247_245043082_n.jpg) +![](https://scontent-ort2-1.xx.fbcdn.net/v/t39.2365-6/14050196_257613611304247_245043082_n.jpg?oh=4dceed87af2b5ece78651a11ac2a0d7a&oe=59E87E32) -这三个逻辑阶段可以被总结如下: +这三个逻辑阶段可以总结如下: -1. 过滤出非产品功能和噪点。 -2. 在每个(entity_id,target_id)对上聚合。 -3. 将表格分割成N个分片,并通过自定义二进制文件管理每个分片,以生成用于在线查询的自定义索引文件。 +1. 过滤出非产品的特征和噪点。 +2. 在每个(entity\_id, target\_id)对上进行聚合。 +3. 将表格分割成 N 个分片,并通过自定义二进制文件管理每个分片,以生成用于在线查询的自定义索引文件。 -基于 Hive 的流程建立索引大概要三天完成。它也难于管理,因为流程包含上百个分片的工作,使监控也变得困难。没有好的方法估算流程进度或计算剩余时间。当考虑 Hive 流程的上述限制,我们决定建立一个更快更易于管理的 Spark 流程 +基于 Hive 的流水线建立该索引大概要三天完成。它也难于管理,因为该流水线包含上百个分片的作业,使监控也变得困难。同时也没有好的方法来估算流水线进度或计算剩余时间。考虑到 Hive 流水线的上述限制,我们决定建立一个更快、更易于管理的 Spark 流水线。 ### Spark 实现 -全面的调试会很慢,有挑战,资源密集。我们转换基于 Hive 流程资源最密集的部分开始:第二步。我们以一个50GB的压缩输入例子开始,然后逐渐扩展到300GB,1TB,然后到20TB。在每次规模增长,我们解决了性能和稳定性问题,但是实验到20TB,我们发现最大的改善机会。 +全量的调试会很慢,有挑战,而且是资源密集型的。我们从转换基于 Hive 流水线的最资源密集型的第二阶段开始。我们以一个 50GB 的压缩输入例子开始,然后逐渐扩展到 300GB、1TB,然后到 20TB。在每次规模增长时,我们都解决了性能和稳定性问题,但是实验到 20TB 时,我们发现了最大的改善机会。 -运行在20TB的输入时,我们发现,由于大量的任务我们生成了太多输出文件(每个大小在100MB左右)。在10小时的作业运行时中,有三分之一是将文件从阶段目录移动到HDFS中的最终目录。起初,我们考虑两个选项:要么改善 HDFS 中的批量重命名来支持我们的用例,或者配置 Spark 生成更少的输出文件(很难,由于在这一步有大量的任务 — 70,000 )。我们退出这个问题,考虑第三种方案。由于我们在流程的第二步中生成的tmp_table2表是临时的,仅用于存储管道的中间输出,所以我们基本上压缩,序列化和复制三个副本,以便将单个读取TB级数据的工作负载。相反,我们更进一步:移除两个临时表并整合 Hive 过程的所有三部分到一个单独的 Spark 工作,读取60TB的压缩数据然后处理90TB的重新分配和排序。最终 Spark 工作如下: +运行 20TB 的输入时,我们发现,由于大量的任务导致我们生成了太多输出文件(每个大小在 100MB 左右)。在 10 小时的作业运行时中,有三分之一是用在将文件从阶段目录移动到 HDFS 中的最终目录。起初,我们考虑两个方案:要么改善 HDFS 中的批量重命名来支持我们的用例,或者配置 Spark 生成更少的输出文件(这很难,由于在这一步有大量的任务 — 70000 个)。我们退一步来看这个问题,考虑第三种方案。由于我们在流水线的第二步中生成的 tmp_table2 表是临时的,仅用于存储流水线的中间输出,所以对于 TB 级数据的单一读取作业任务,我们基本上是在压缩、序列化和复制三个副本。相反,我们更进一步:移除两个临时表并整合 Hive 过程的所有三个部分到一个单独的 Spark 作业,读取 60TB 的压缩数据然后对 90TB 的数据执行重排(shuffle)和排序(sort)。最终的 Spark 作业如下: -![](https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xfp1/t39.2365-6/14146896_1073876729364007_1912864323_n.jpg) +![](https://scontent-ort2-1.xx.fbcdn.net/v/t39.2365-6/14146896_1073876729364007_1912864323_n.jpg?oh=77200f03e6713b6adc91033230dcd588&oe=59E17E46) -### 为此工作我们如何规划 Spark? +### 对于我们的作业如何规划 Spark? -当然,为如此大的流程运行一个单独的 Spark 任务,第一次尝试没有成功,甚至是第十次尝试。据我们所知,最大的 Spark 工作真实是在重新分配数据大小上(Databrick 的 Petabyte 排序是在合成数据上)。核心 Spark 基础架构和我们的应用程序进行了许多改进和优化使这个工作运行。这种努力的优势在于,许多这些改进适用于 Spark 的其他大型工作量,我们将所有工作捐献给开源 Apache Spark 项目 - 有关其他详细信息,请参阅JIRA。下面,我们强调的是实体排行流程之一部署到生产环境的重大改进。 +当然,为如此大的流水线运行一个单独的 Spark 任务,第一次尝试没有成功,甚至是第十次尝试也没有。据我们所知,从重排(shuffle)的数据大小来说,这是现实世界最大的 Spark 作业([Databrick 的 PB 级排序](https://databricks.com/blog/2014/10/10/spark-petabyte-sort.html)是以合成数据来说)。我们对核心 Spark 基础架构和我们的应用程序进行了许多改进和优化使这个作业得以运行。这种努力的优势在于,许多这些改进适用于 Spark 的其他大型作业任务,我们将所有的工作回馈给开源 Apache Spark 项目 - 有关详细信息请参阅 JIRA。下面,我们将重点讲述将实体排名流水线之一部署到生产环境所做的重大改进。 ### 可靠性修复 #### 处理频繁的节点重启 -为了可靠地执行长时间运行的作业,我们希望系统容错并从故障中恢复(主要是由于机器重启,可能是平时的维护或软件错误的原因)。虽然 Spark 设计为容忍机器重启,我们发现在处理常见故障之前有各种错误/问题需要定位。 +为了可靠地执行长时间运行作业,我们希望系统能够容错并可以从故障中恢复(主要是由于平时的维护或软件错误导致的机器重启所引发的)。虽然 Spark 设计为可以容忍机器重启,但我们发现它在足够强健到可以处理常见故障之前还有各种错误/问题需要解决。 -- 使 PipedRDD 稳健的获取失败(SPARK-13793):PipedRDD 以前的实现不够强大,无法获取由于节点重启而导致的故障,并且只要出现提取失败,该作业就会失败。我们在 PipedRDD 中进行了更改,优雅的处理提取失败,因此该作业可以从这些提取到的失败中恢复。 -- 可配置的最大获取失败次数(SPARK-13369):使用这种长时间运行的作业,由于机器重启引起的提取失败概率显着增加。在Spark中每个阶段的最大允许获取失败是硬编码的,因此,当达到最大数量时该作业将失败。我们做了一个改变,使它可配置并且在这个用例将其从4增长到20,通过获取失败使作业更稳健。 -- 减少集群重启混乱:长耗时作业应该可以在集群重启时生存,所以我们不用浪费所有完成的处理。Spark 的可重新启动的分配服务功能使我们可以在节点重新启动后保留分配文件。最重要的是,我们在Spark驱动程序中实现了一项功能,可以暂停执行任务调度,所以由于过重的任务失败导致的集群重启,作业不会失败。 +- **使 PipedRDD 稳健的获取(fetch)失败**(SPARK-13793):PipedRDD 以前的实现不够强大,无法处理由于节点重启而导致的获取失败,并且只要出现获取失败,该作业就会失败。我们在 PipedRDD 中进行了更改,优雅的处理获取失败,使该作业可以从这种类型的获取失败中恢复。 +- **可配置的最大获取失败次数**(SPARK-13369):对于这种长时间运行的作业,由于机器重启而引起的获取失败概率显着增加。在 Spark 中每个阶段的最大允许的获取失败次数是硬编码的,因此,当达到最大数量时该作业将失败。我们做了一个改变,使它是可配置的,并且在这个用例中将其从 4 增长到 20,从而使作业更稳健。 +- **减少集群重启混乱**:长时间运行作业应该可以在集群重启后存留,所以我们不用等着处理完成。Spark 的可重启的重排(shuffle)服务功能可以使我们在节点重启后保留重排(shuffle)文件。最重要的是,我们在 Spark 驱动程序中实现了一项功能,可以暂停执行任务调度,所以不会由于集群重启而导致的过多的任务失败,从而导致作业失败。 #### 其他的可靠性修复 -- 响应迟钝的驱动程序(SPARK-13279):在添加任务时,由于O(N ^ 2)操作,Spark驱动程序被卡住,导致该作业最终被卡住和死亡。 我们通过删除不必要的O(N ^ 2)操作来修复问题。 -- 过多的驱动推测:我们发现,Spark 驱动程序在管理大量任务时花费了大量的时间推测。 在短期内,我们禁止这个作业的推测。在长期,我们正在努力改变Spark驱动程序,以减少推测时间。 -- 由于大型缓冲区的整数溢出导致的 TimSort 问题(SPARK-13850):我们发现 Spark 的不安全内存操作有一个漏洞,导致 TimSort 中的内存损坏。 感谢 Databricks 的人解决了这个问题,这使我们能够在大内存缓冲区中运行。 -- 调整分配服务来处理大量连接:在分配阶段,我们看到许多执行程序在尝试连接分配服务时超时。 增加Netty服务器线程(spark.重排.io.serverThreads)和积压(spark.重排.io.backLog)的数量解决了这个问题。 -- 修复 Spark 执行程序 OOM(SPARK-13958)(交易制造商):首先在每个主机上打包超过四个聚合任务是很困难的。Spark 执行程序内存溢出,因为排序程序中存在导致无限期增长的指针数组的漏洞。当指针数组不再有可用的内存增长时,我们通过强制将数据溢出到磁盘来修复问题。因此,现在我们可以运行24个任务/主机,而不会内存溢出。 +- **响应迟钝的驱动程序**(SPARK-13279):在添加任务时,由于 O(N ^ 2) 复杂度的操作,Spark 驱动程序被卡住,导致该作业最终被卡住和死亡。 我们通过删除不必要的 O(N ^ 2) 操作来修复问题。 +- **过多的驱动推测(speculation)**:我们发现,Spark 驱动程序在管理大量任务时花费了大量的时间推测。 在短期内,我们禁止这个作业的推测。在长期,我们正在努力改变 Spark 驱动程序,以减少推测时间。 +- **由于大型缓冲区的整数溢出导致的 TimSort 问题**(SPARK-13850):我们发现 Spark 的不安全内存操作有一个漏洞,导致 TimSort 中的内存损坏。 感谢 Databricks 的人解决了这个问题,这使我们能够在大内存缓冲区中运行。 +- **调整重排(shuffle)服务来处理大量连接**:在重排阶段,我们看到许多执行程序在尝试连接重排服务时超时。 增加 Netty 服务器的线程(spark.shuffle.io.serverThreads)和积压(spark.shuffle.io.backLog)的数量解决了这个问题。 +- **修复 Spark 执行程序 OOM**(SPARK-13958)(deal maker):首先在每个主机上打包超过四个聚合(reduce)任务是很困难的。Spark 执行程序会内存溢出,因为排序程序(sorter)中存在导致无限增长的指针数组的漏洞。当不再有可用的内存用于指针数组增长时,我们通过强制将数据溢出到磁盘来修复问题。因此,现在我们可以每主机运行 24 个任务,而不会内存溢出。 ### 性能改进 -在实施上述可靠性改进后,我们能够可靠地运行 Spark 工作。基于这一点,我们将精力转向与性能相关的项目,以充分发挥 Spark 的作用。我们使用 Spark 的指标和几个分析器来查找一些性能瓶颈。 +在实施上述可靠性改进后,我们能够可靠地运行 Spark 作业了。基于这一点,我们将精力转向与性能相关的项目,以充分发挥 Spark 的作用。我们使用 Spark 的指标和几个分析器来查找一些性能瓶颈。 -#### 我们用来查找性能平静的工具 +#### 我们用来查找性能瓶颈的工具 -- Spark UI Metrics:Spark UI 可以很好地了解在特定阶段花费的时间。每个任务的执行时间被分为子阶段,以便更容易地找到作业中的瓶颈。 -- Jstack:Spark UI还在执行程序进程上提供了一个被需要的jstack函数,可用于中查找热点代码。 -- Spark Linux Perf / Flame Graph 支持:尽管上述两个工具非常方便,但它们并不提供同时在数百台机器上运行的作业的 CPU 分析的聚合视图。在每个作业的基础上,我们添加了支持 Perf 分析(通过libperfagent的Java符号),并可以自定义采样的持续时间/频率。使用我们的内部指标收集框架,将概要分析样本聚合并显示为使用Flame Graph的执行程序。 +- **Spark UI 指标**:Spark UI 可以很好地了解在特定阶段所花费的时间。每个任务的执行时间被分为子阶段,以便更容易地找到作业中的瓶颈。 +- **Jstack**:Spark UI 还在执行程序进程上提供了一个按需分配的 jstack 函数,可用于中查找热点代码。 +- **Spark 的 Linux Perf / 火焰图(Flame Graph)支持**:尽管上述两个工具非常方便,但它们并不提供同时在数百台机器上运行的作业的 CPU 分析的聚合视图。在每个作业的基础上,我们添加了支持 Perf 分析(通过 libperfagent 的 Java 符号),并可以自定义采样的持续时间/频率。使用我们的内部指标收集框架,将分析样本聚合并显示为整个执行程序的火焰图。 -### 性能优化 +#### 性能优化 -- 修复分拣机中的内存泄漏(SPARK-14363)(加速30%):我们发现了一个问题,当任务释放所有内存页时指针数组却未被释放。 因此,大量的内存未被使用,并导致频繁的溢出和程序 OOM。 我们现在进行了改变,正确地释放内存,并能够大量分类使运行更有效。 我们注意到,这一变化后 CPU 改善了30%。 -- Snappy优化(SPARK-14277)(10%加速):JNI方法 -(Snappy.ArrayCopy)- 在每一行被读取/写入时都会被调用。 我们提出了这个问题,Snappy 的行为被改为使用非 JNI 的 System.ArrayCopy 代替。 这一改变节约了大约10%的CPU。 -- 减少重新分配写入延迟(SPARK-5581)(高达50%的速度提升):在映射方面,将重新分配数据写入磁盘时,映射任务为每个分区打开并关闭相同的文件。 我们做了一个修复,以避免不必要的打开/关闭,并观察到高达50%的CPU改进写作大量的重新分配分区的工作。 -- 解决由于获取失败导致的重复任务运行问题(SPARK-14649):当获取失败发生时,Spark驱动程序重新提交已运行的任务,导致性能下降。 我们通过避免重新运行运行的任务来解决问题,我们看到当提取失败发生时工作更加稳定。 -- PipedRDD的可配置缓冲区大小(SPARK-14542)(10%速度提升):在使用PipedRDD时,我们发现将数据从分类器传输到管道过程的默认缓冲区大小太小,我们的作业要花费超过10%的时间复制数据。 我们使缓冲区大小可配置,以避免这个瓶颈。 -- 用于重排提取加速的缓存索引文件(SPARK-15074):我们观察到重排服务经常成为瓶颈,减少器花费10%至15%的时间等待获取地图数据。深入了解问题,我们发现,随机播放服务是为每个重排提取打开/关闭随机索引文件。我们进行了更改以缓存索引信息,以便我们可以避免文件打开/关闭,并重新使用索引信息以便后续提取。这个变化将总重排时间减少了50%。 -- 降低重排字节写入指标的更新频率(SPARK-15569)(高达20%的加速):使用 Spark Linux Perf 集成,我们发现大约20%的CPU时间正在花费探测和更新写入的重排字节指标。 -- 分拣机可配置的初始缓冲区大小(SPARK-15958)(高达5%的加速):分拣机的默认初始缓冲区大小太小(4 KB),我们发现它对于大型工作负载非常小 - 所以我们浪费了大量的时间消耗缓冲区并复制内容。我们做了一个更改,使缓冲区大小可配置,并且缓冲区大小为64 MB,我们可以避免重复的数据复制,使作业的速度提高约5%。 -- 配置任务数量:由于我们的输入大小为60T,每个 HDFS 块大小为256M,因此我们为该作业产生了超过250,000个任务。尽管我们能够以如此多的任务来运行Spark工作,但是我们发现,当任务数量过高时,性能会下降。我们引入了一个配置参数,使地图输入大小可配置,因此我们可以通过将输入分割大小设置为2 GB来将该数量减少8倍。 +- **修复排序程序(sorter)中的内存泄漏**(SPARK-14363)(30% 速度提升):我们发现了一个问题,当任务释放所有内存页时指针数组却未被释放。 因此,大量的内存未被使用,并导致频繁的溢出和执行程序 OOM。 我们现在进行了改变,正确地释放内存,并使大的分类运行更有效。 我们注意到,这一变化后 CPU 改善了 30%。 +- **Snappy 优化**(SPARK-14277)(10% 速度提升):有个 JNI 方法(Snappy.ArrayCopy)在每一行被读取/写入时都会被调用。 我们发现了这个问题,Snappy 的行为被改为使用非 JNI 的 System.ArrayCopy 代替。 这一改变节约了大约 10% 的 CPU。 +- **减少重排的写入延迟**(SPARK-5581)(高达 50% 的速度提升):在映射(map)方面,当将重排数据写入磁盘时,映射任务为每个分区打开并关闭相同的文件。 我们做了一个修复,以避免不必要的打开/关闭,对于大量写入重排分区的作业来说,我们观察到高达 50% 的 CPU 提升。 +- **解决由于获取失败导致的重复任务运行问题**(SPARK-14649):当获取失败发生时,Spark 驱动程序会重新提交已运行的任务,导致性能下降。 我们通过避免重新运行运行的任务来解决这个问题,我们看到当获取失败发生时该作业会更加稳定。 +- **可配置 PipedRDD 的缓冲区大小**(SPARK-14542)(10% 速度提升):在使用 PipedRDD 时,我们发现将数据从分类程序传输到管道进程的默认缓冲区的大小太小,我们的作业要花费超过 10% 的时间复制数据。我们使缓冲区大小可配置,以避免这个瓶颈。 +- **缓存索引文件以加速重排获取**(SPARK-15074):我们观察到重排服务经常成为瓶颈,减少程序(reducer)花费 10% 至 15% 的时间等待获取映射(map)数据。通过深入了解问题,我们发现,重排服务为每个重排获取打开/关闭重排索引文件。我们进行了更改以缓存索引信息,以便我们可以避免文件打开/关闭,并重新使用该索引信息以便后续获取。这个变化将总的重排时间减少了 50%。 +- **降低重排字节写入指标的更新频率**(SPARK-15569)(高达 20% 的速度提升):使用 Spark 的 Linux Perf 集成,我们发现大约 20% 的 CPU 时间正在花费探测和更新写入的重排字节写入指标上。 +- **可配置排序程序(sorter)的初始缓冲区大小**(SPARK-15958)(高达 5% 的速度提升):排序程序(sorter)的默认初始缓冲区大小太小(4 KB),我们发现它对于大型工作负载而言非常小 - 所以我们在缓冲区耗尽和内容复制上浪费了大量的时间。我们做了一个更改,使缓冲区大小可配置,并且缓冲区大小为 64 MB,我们可以避免大量的数据复制,使作业的速度提高约 5%。 +- **配置任务数量**:由于我们的输入大小为 60T,每个 HDFS 块大小为 256M,因此我们为该作业产生了超过 250,000 个任务。尽管我们能够以如此多的任务来运行 Spark 作业,但是我们发现,当任务数量过高时,性能会下降。我们引入了一个配置参数,使映射(map)输入大小可配置,因此我们可以通过将输入分割大小设置为 2 GB 来将该数量减少 8 倍。 -在所有这些可靠性和性能改进之后,我们很高兴地报告,我们为我们的实体排名系统之一构建和部署了一个更快更易于管理的流程,并且我们提供了在Spark中运行其他类似作业的能力。 +在所有这些可靠性和性能改进之后,我们很高兴地报告,我们为我们的实体排名系统之一构建和部署了一个更快、更易于管理的流水线,并且我们提供了在 Spark 中运行其他类似作业的能力。 -### Spark 流程与 Hive 流程性能对比 +### Spark 流水线与 Hive 流水线性能对比 -我们使用以下性能指标来比较Spark流程与Hive流程。请注意,这些数字并不是Spark与Hive在查询或作业级别的直接比较,而是将优化流程与灵活的计算引擎(例如Spark)进行比较,而不是仅在查询/作业级别(如Hive)。 +我们使用以下性能指标来比较 Spark 流水线与 Hive 流水线。请注意,这些数字并不是在查询或作业级别的直接比较 Spark 与 Hive ,而是比较使用灵活的计算引擎(例如 Spark)构建优化的流水线,而不是比较仅在查询/作业级别(如 Hive)操作的计算引擎。 -CPU 时间:这是从系统角度看 CPU 使用。例如,你在一个32核机器上使用50%的 CPU 10秒运行一个单进程任务,然后你的 CPU 时间应该是32 * 0.5 * 10 = 160 CPU 秒。 +CPU 时间:这是从系统角度看 CPU 使用。例如,你在一个 32 核机器上使用 50% 的 CPU 10 秒运行一个单进程任务,然后你的 CPU 时间应该是 32 * 0.5 * 10 = 160 CPU 秒。 -![](https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xpt1/t39.2365-6/14146892_595234533986285_2004398348_n.jpg) +![](https://scontent-ort2-1.xx.fbcdn.net/v/t39.2365-6/14146892_595234533986285_2004398348_n.jpg?oh=42b2bcc2b5b0d2b2f3141ee5639a62f2&oe=59DC7E21) -CPU预留时间:这是从资源管理框架的角度来看CPU预留。例如,如果我们保留32位机器10秒钟来运行作业,则CPU预留时间为32 * 10 = 320 CPU秒。CPU时间与CPU预留时间的比率反映了我们如何在集群上利用预留的CPU资源。当准确时,与CPU时间相比,预留时间在运行相同工作负载时,可以更好地比较执行引擎。例如,如果一个进程需要1个CPU的时间才能运行,但是必须保留100个CPU秒,则该指标的效率要低于需要10个CPU秒的进程,但是只能执行10个CPU秒钟来执行相同的工作量。我们还计算内存预留时间,但不包括在这里,因为数字类似于CPU预留时间,因为在同一硬件上运行实验,而在 Spark 和 Hive 的情况下,我们不会将数据缓存在内存中。Spark有能力在内存中缓存数据,但是由于我们的集群内存限制,我们决定核心工作与Hive类似。 +CPU 预留时间:这是从资源管理框架的角度来看 CPU 预留。例如,如果我们保留 32 位机器 10 秒钟来运行作业,则CPU 预留时间为 32 * 10 = 320 CPU 秒。CPU 时间与 CPU 预留时间的比率反映了我们如何在集群上利用预留的CPU 资源。当准确时,与 CPU 时间相比,预留时间在运行相同工作负载时可以更好地比较执行引擎。例如,如果一个进程需要 1 个 CPU 的时间才能运行,但是必须保留 100 个 CPU 秒,则该指标的效率要低于需要 10 个 CPU 秒而仅保留 10 个 CPU 秒来执行相同的工作量的进程。我们还计算内存预留时间,但不包括在这里,因为其数字类似于 CPU 预留时间,因为在同一硬件上运行实验,而在 Spark 和 Hive 的情况下,我们不会将数据缓存在内存中。Spark 有能力在内存中缓存数据,但是由于我们的集群内存限制,我们决定类似与 Hive 一样工作在核心外部。 -![](https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xfa1/t39.2365-6/14129680_325754934432503_513809233_n.jpg) +![](https://scontent-ort2-1.xx.fbcdn.net/v/t39.2365-6/14129680_325754934432503_513809233_n.jpg?oh=c2c26e6ef20724eef32771c5953d386a&oe=59D61914) 等待时间:端到端的工作流失时间。 -![](https://fbcdn-dragon-a.akamaihd.net/hphotos-ak-xap1/t39.2365-6/14129681_178723715883876_1030939470_n.jpg) +![](https://scontent-ort2-1.xx.fbcdn.net/v/t39.2365-6/14129681_178723715883876_1030939470_n.jpg?oh=9bc18e548bbd23ee675e15ac03ea8600&oe=599C4F25) ### 结论和未来工作 -Facebook的性能和可扩展的分析在产品开发给予了协助。Apache Spark 提供了将各种分析用例统一为单一API和高效计算引擎的独特功能。我们挑战了Spark,来将一个分解成数百个Hive作业的流程替换成一个Spark工作。通过一系列的性能和可靠性改进之后,我们可以将Spark扩大到处理我们在生产中的实体排名数据处理用例之一。 在这个特殊用例中,我们展示了Spark可以可靠地重排和排序90 TB +中间数据,并在一个工作中运行了25万个任务。 与旧的基于Hive的流程相比,基于Spark的流程产生了显着的性能改进(4.5-6倍CPU,3-4倍资源预留和〜5倍的延迟),并且已经投入使用了几个月。 +Facebook 的性能和可扩展的分析在产品开发中给予了协助。Apache Spark 提供了将各种分析用例统一为单一 API 和高效计算引擎的独特功能。我们挑战了 Spark,来将一个分解成数百个 Hive 作业的流水线替换成一个 Spark 作业。通过一系列的性能和可靠性改进之后,我们可以将 Spark 扩大到处理我们在生产中的实体排名数据处理用例之一。 在这个特殊用例中,我们展示了 Spark 可以可靠地重排和排序 90 TB+ 的中间数据,并在一个单一作业中运行了 25 万个任务。 与旧的基于 Hive 的流水线相比,基于 Spark 的流水线产生了显着的性能改进(4.5-6 倍 CPU,3-4 倍资源预留和大约 5 倍的延迟),并且已经投入使用了几个月。 -虽然本文详细介绍了我们 Spark 最具挑战性的用例,但越来越多的客户团队已将Spark工作负载部署到生产中。 性能,可维护性和灵活性是继续推动更多用例到Spark的优势。 Facebook很高兴成为Spark开源社区的一部分,并将共同开发Spark充分发挥潜力。 +虽然本文详细介绍了我们 Spark 最具挑战性的用例,越来越多的客户团队已将 Spark 工作负载部署到生产中。 性能 +、可维护性和灵活性是继续推动更多用例到 Spark 的优势。 Facebook 很高兴成为 Spark 开源社区的一部分,并将共同开发 Spark 充分发挥其潜力。 -------------------------------------------------------------------------------- -via: https://code.facebook.com/posts/1671373793181703/apache-spark-scale-a-60-tb-production-use-case/?utm_source=dbweekly&utm_medium=email +via: https://code.facebook.com/posts/1671373793181703/apache-spark-scale-a-60-tb-production-use-case/ -作者:[Sital Kedia][a] [王硕杰][b] [Avery Ching][c] +作者:[Sital Kedia][a], [王硕杰][b], [Avery Ching][c] 译者:[wyangsun](https://github.com/wyangsun) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出 From 0109669bcbf875bc0075bef1697449bdffa445a8 Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 23 Jun 2017 09:59:25 +0800 Subject: [PATCH 0487/1407] PUB:20160831 Apache Spark Scale - A 60 TB production use case.md @wyangsun --- .../20160831 Apache Spark Scale - A 60 TB production use case.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20160831 Apache Spark Scale - A 60 TB production use case.md (100%) diff --git a/translated/tech/20160831 Apache Spark Scale - A 60 TB production use case.md b/published/20160831 Apache Spark Scale - A 60 TB production use case.md similarity index 100% rename from translated/tech/20160831 Apache Spark Scale - A 60 TB production use case.md rename to published/20160831 Apache Spark Scale - A 60 TB production use case.md From 4ff83ef02f0b2c1da5f9cfe0a4362569fa8bdfe1 Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 23 Jun 2017 09:59:37 +0800 Subject: [PATCH 0488/1407] =?UTF-8?q?=E5=A2=9E=E8=A1=A5=E5=AD=97=E5=85=B8?= =?UTF-8?q?=E8=AF=8D=E6=B1=87?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- Dict.md | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/Dict.md b/Dict.md index 23207f3f93..0d5dbafb0d 100644 --- a/Dict.md +++ b/Dict.md @@ -76,13 +76,20 @@ #### H #### ### 1. Home Directory:家目录 #### I #### +### 1. issue:工单 +> 有翻译做“问题”的,但是应该译作“工单”,尤其是用于 GitHub 中。 #### J #### #### K #### #### L #### -### 1. LTS(Long Term Support):长期支持 +### 1. live CD:现场版 CD +> 通常不翻译,但是如果翻译,可以译作“现场版”。 +### 2. live patch: 实时补丁/热补丁 +> 指 Linux 内核的 live patch 支持。 + +### 2. LTS(Long Term Support):长期支持 >该缩写词多见于操作系统发行版或者软件发行版名称中,表明该版本属于长期支持版。 #### M #### From 15b791866e29a1186593b1fe0165bebe98e7d6fa Mon Sep 17 00:00:00 2001 From: kylecao Date: Fri, 23 Jun 2017 11:17:54 +0800 Subject: [PATCH 0489/1407] Delete 20170531 Understand Linux Load Averages and Monitor Performance of Linux.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 翻译完成 删除原文件 --- ...erages and Monitor Performance of Linux.md | 210 ------------------ 1 file changed, 210 deletions(-) delete mode 100644 sources/tech/20170531 Understand Linux Load Averages and Monitor Performance of Linux.md diff --git a/sources/tech/20170531 Understand Linux Load Averages and Monitor Performance of Linux.md b/sources/tech/20170531 Understand Linux Load Averages and Monitor Performance of Linux.md deleted file mode 100644 index 515f15908a..0000000000 --- a/sources/tech/20170531 Understand Linux Load Averages and Monitor Performance of Linux.md +++ /dev/null @@ -1,210 +0,0 @@ -Translating by kylecao - -Understand Linux Load Averages and Monitor Performance of Linux -============================================================ - - - -In this article, we will explain one of the critical Linux system administration tasks – performance monitoring in regards to system/CPU load and load averages. - -Before we move any further, let’s understand these two important phrases in all Unix-like systems: - -* System load/CPU Load – is a measurement of CPU over or under-utilization in a Linux system; the number of processes which are being executed by the CPU or in waiting state. - -* Load average – is the average system load calculated over a given period of time of 1, 5 and 15 minutes. - -In Linux, the load-average is technically believed to be a running average of processes in it’s (kernel) execution queue tagged as running or uninterruptible. - -Note that: - -* All if not most systems powered by Linux or other Unix-like systems will possibly show the load average values somewhere for a user. - -* A downright idle Linux system may have a load average of zero, excluding the idle process. - -* Nearly all Unix-like systems count only processes in the running or waiting states. But this is not the case with Linux, it includes processes in uninterruptible sleep states; those waiting for other system resources like disk I/O etc. - -### How to Monitor Linux System Load Average - -There are numerous ways of monitoring system load average including uptime which shows how long the system has been running, number of users together with load averages: - -``` -$ uptime -07:13:53 up 8 days, 19 min, 1 user, load average: 1.98, 2.15, 2.21 -``` - -The numbers are read from left to right, and the output above means that: - -* load average over the last 1 minute is 1.98 - -* load average over the last 5 minutes is 2.15 - -* load average over the last 15 minutes is 2.21 - -High load averages imply that a system is overloaded; many processes are waiting for CPU time. - -We will uncover this in the next section in relation to number of CPU cores. Additionally, we can as well use other well known tools such as [top][5] and [glances][6] which display a real-time state of a running Linux system, plus many other tools: - -#### Top Command - -``` -$ top -``` -Display Running Linux Processes -``` -top - 12:51:42 up 2:11, 1 user, load average: 1.22, 1.12, 1.26 -Tasks: 243 total, 1 running, 242 sleeping, 0 stopped, 0 zombie -%Cpu(s): 17.4 us, 2.9 sy, 0.3 ni, 74.8 id, 4.6 wa, 0.0 hi, 0.0 si, 0.0 st -KiB Mem : 8069036 total, 388060 free, 4381184 used, 3299792 buff/cache -KiB Swap: 3906556 total, 3901876 free, 4680 used. 2807464 avail Mem -PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND -6265 tecmint 20 0 1244348 170680 83616 S 13.3 2.1 6:47.72 Headset -2301 tecmint 9 -11 640332 13344 9932 S 6.7 0.2 2:18.96 pulseaudio -2459 tecmint 20 0 1707692 315628 62992 S 6.7 3.9 6:55.45 cinnamon -2957 tecmint 20 0 2644644 1.035g 137968 S 6.7 13.5 50:11.13 firefox -3208 tecmint 20 0 507060 52136 33152 S 6.7 0.6 0:04.34 gnome-terminal- -3272 tecmint 20 0 1521380 391324 178348 S 6.7 4.8 6:21.01 chrome -6220 tecmint 20 0 1595392 106964 76836 S 6.7 1.3 3:31.94 Headset -1 root 20 0 120056 6204 3964 S 0.0 0.1 0:01.83 systemd -2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd -3 root 20 0 0 0 0 S 0.0 0.0 0:00.10 ksoftirqd/0 -5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H -.... -``` - -#### Glances Tool - -``` -$ glances -``` -Glances – Linux System Monitoring Tool -``` -TecMint (LinuxMint 18 64bit / Linux 4.4.0-21-generic) Uptime: 2:16:06 -CPU 16.4% nice: 0.1% LOAD 4-core MEM 60.5% active: 4.90G SWAP 0.1% -user: 10.2% irq: 0.0% 1 min: 1.20 total: 7.70G inactive: 2.07G total: 3.73G -system: 3.4% iowait: 2.7% 5 min: 1.16 used: 4.66G buffers: 242M used: 4.57M -idle: 83.6% steal: 0.0% 15 min: 1.24 free: 3.04G cached: 2.58G free: 3.72G -NETWORK Rx/s Tx/s TASKS 253 (883 thr), 1 run, 252 slp, 0 oth sorted automatically by cpu_percent, flat view -enp1s0 525Kb 31Kb -lo 2Kb 2Kb CPU% MEM% VIRT RES PID USER NI S TIME+ IOR/s IOW/s Command -wlp2s0 0b 0b 14.6 13.3 2.53G 1.03G 2957 tecmint 0 S 51:49.10 0 40K /usr/lib/firefox/firefox -7.4 2.2 1.16G 176M 6265 tecmint 0 S 7:08.18 0 0 /usr/lib/Headset/Headset --type=renderer --no-sandbox --primordial-pipe-token=879B36514C6BEDB183D3E4142774D1DF --lan -DISK I/O R/s W/s 4.9 3.9 1.63G 310M 2459 tecmint 0 R 7:12.18 0 0 cinnamon --replace -ram0 0 0 4.2 0.2 625M 13.0M 2301 tecmint -11 S 2:29.72 0 0 /usr/bin/pulseaudio --start --log-target=syslog -ram1 0 0 4.2 1.3 1.52G 105M 6220 tecmint 0 S 3:42.64 0 0 /usr/lib/Headset/Headset -ram10 0 0 2.9 0.8 409M 66.7M 6240 tecmint 0 S 2:40.44 0 0 /usr/lib/Headset/Headset --type=gpu-process --no-sandbox --supports-dual-gpus=false --gpu-driver-bug-workarounds=7,2 -ram11 0 0 2.9 1.8 531M 142M 1690 root 0 S 6:03.79 0 0 /usr/lib/xorg/Xorg :0 -audit 0 -auth /var/lib/mdm/:0.Xauth -nolisten tcp vt8 -ram12 0 0 2.6 0.3 79.3M 23.8M 9651 tecmint 0 R 0:00.71 0 0 /usr/bin/python3 /usr/bin/glances -ram13 0 0 1.6 4.8 1.45G 382M 3272 tecmint 0 S 6:25.30 0 4K /opt/google/chrome/chrome -... -``` - -The load averages shown by these tools is read /proc/loadavg file, which you can view using the [cat command][7] as below: - -``` -$ cat /proc/loadavg -2.48 1.69 1.42 5/889 10570 -``` - -To monitor load averages in graph format, check out: [ttyload – Shows a Color-coded Graph of Linux Load Average in Terminal][8] - -On desktop machines, there are graphical user interface tools that we can use to view system load averages. - -### Understanding System Average Load in Relation Number of CPUs - -We can’t possibly explain system load or system performance without shedding light on the impact of the number of CPU cores on performance. - -#### Multi-processor Vs Multi-core - -* Multi-processor – is where two or more physical CPU’s are integrated into a single computer system. - -* Multi-core processor – is a single physical CPU which has at least two or more separate cores (or what we can also refer to as processing units) that work in parallel. Meaning a dual-core has 2 two processing units, a quad-core has 4 processing units and so on. - -Furthermore, there is also a processor technology which was first introduced by Intel to improve parallel computing, referred to as hyper threading. - -Under hyper threading, a single physical CPU core appears as two logical CPUs core to an operating system (but in reality, there is one physical hardware component). - -Note that a single CPU core can only carry out one task at a time, thus technologies such as multiple CPUs/processors, multi-core CPUs and hyper-threading were brought to life. - -With more than one CPU, several programs can be executed simultaneously. Present-day Intel CPUs use a combination of both multiple cores and hyper-threading technology. - -To find the number of processing units available on a system, we may use the [nproc or lscpu commands][9] as follows: - -``` -$ nproc -4 -OR -lscpu -``` - -Another way to find the number of processing units using [grep command][10] as shown. - -``` -$ grep 'model name' /proc/cpuinfo | wc -l -4 -``` - -Now, to further understand system load, we will take a few assumptions. Let’s say we have load averages below: - -``` -23:16:49 up 10:49, 5 user, load average: 1.00, 0.40, 3.35 -``` - -###### On a single core system this would mean: - -* The CPU was fully (100%) utilized on average; 1 processes was running on the CPU (1.00) over the last 1 minute. - -* The CPU was idle by 60% on average; no processes were waiting for CPU time (0.40) over the last 5 minutes. - -* The CPU was overloaded by 235% on average; 2.35 processes were waiting for CPU time (3.35) over the last 15 minutes. - -###### On a dual-core system this would mean: - -* The one CPU was 100% idle on average, one CPU was being used; no processes were waiting for CPU time(1.00) over the last 1 minute. - -* The CPUs were idle by 160% on average; no processes were waiting for CPU time. (0.40) over the last 5 minutes. - -* The CPUs were overloaded by 135% on average; 1.35 processes were waiting for CPU time. (3.35) over the last 15 minutes. - -You might also like: - -1. [20 Command Line Tools to Monitor Linux Performance – Part 1][1] - -2. [13 Linux Performance Monitoring Tools – Part 2][2] - -3. [Perf- A Performance Monitoring and Analysis Tool for Linux][3] - -4. [Nmon: Analyze and Monitor Linux System Performance][4] - -In conclusion, if you are a system administrator then high load averages are real to worry about. When they are high, above the number of CPU cores, it signifies high demand for the CPUs, and low load averages below the number of CPU cores tells us that CPUs are underutilized. - --------------------------------------------------------------------------------- -作者简介: - -Aaron Kili is a Linux and F.O.S.S enthusiast, an upcoming Linux SysAdmin, web developer, and currently a content creator for TecMint who loves working with computers and strongly believes in sharing knowledge. - - - ------ - -via: https://www.tecmint.com/understand-linux-load-averages-and-monitor-performance/ - -作者:[Aaron Kili ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.tecmint.com/author/aaronkili/ -[1]:https://www.tecmint.com/command-line-tools-to-monitor-linux-performance/ -[2]:https://www.tecmint.com/linux-performance-monitoring-tools/ -[3]:https://www.tecmint.com/perf-performance-monitoring-and-analysis-tool-for-linux/ -[4]:https://www.tecmint.com/nmon-analyze-and-monitor-linux-system-performance/ -[5]:https://www.tecmint.com/12-top-command-examples-in-linux/ -[6]:https://www.tecmint.com/glances-an-advanced-real-time-system-monitoring-tool-for-linux/ -[7]:https://www.tecmint.com/13-basic-cat-command-examples-in-linux/ -[8]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/ -[9]:https://www.tecmint.com/check-linux-cpu-information/ -[10]:https://www.tecmint.com/12-practical-examples-of-linux-grep-command/ -[11]:https://www.tecmint.com/author/aaronkili/ -[12]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ -[13]:https://www.tecmint.com/free-linux-shell-scripting-books/ From 8d4be49f8f66552e2a29c12a6ada5d0c83c85d8d Mon Sep 17 00:00:00 2001 From: kylecao Date: Fri, 23 Jun 2017 11:25:49 +0800 Subject: [PATCH 0490/1407] Create 20170531 Understand Linux Load Averages and Monitor Performance of Linux.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 翻译完成 上传 --- ...erages and Monitor Performance of Linux.md | 207 ++++++++++++++++++ 1 file changed, 207 insertions(+) create mode 100644 translated/tech/20170531 Understand Linux Load Averages and Monitor Performance of Linux.md diff --git a/translated/tech/20170531 Understand Linux Load Averages and Monitor Performance of Linux.md b/translated/tech/20170531 Understand Linux Load Averages and Monitor Performance of Linux.md new file mode 100644 index 0000000000..f3ff059ec7 --- /dev/null +++ b/translated/tech/20170531 Understand Linux Load Averages and Monitor Performance of Linux.md @@ -0,0 +1,207 @@ +理解Linux平均负载和性能监控 +============================================================ + + +在本文中,我们将解释Linux系统中最关键的管理任务之一——关于系统/CPU的负载和平均负载的性能监控。 + +首先来看类UNIX系统中两个重要的表述: + +* 系统负载/CPU负载 – 衡量Linux系统的CPU过载或利用率低;处于运算状态或等待状态的CPU核心数。 + +* 平均负载 – 通过固定周期如1,5,15分钟计算出的平均系统负载。 + +Linux中,平均负载一般指在内核运行队列中被标记为运行或不可打断状态的平均进程数。 + +注意: + +* 多数Linux或类Unix系统会为用户展示平均负载的值。 + +* 完全空闲的Linux系统平均负载为0,不包括空闲进程。 + +* 绝大多数类Unix系统只统计运行和等待状态的进程。但是在Linux中,平均负载包括不可打断的睡眠状态进程;等待其它系统资源如磁盘I/O的进程等。 + +### 如何监测Linux系统平均负载 + +有诸多方式监测系统平均负载,如uptime,展示系统运行时间,用户数量及平均负载: + +``` +$ uptime +07:13:53 up 8 days, 19 min, 1 user, load average: 1.98, 2.15, 2.21 +``` + +平均负载的数字从左到右的含义依次为: + +* 最近1分钟的平均负载为 1.98 + +* 最近5分钟的平均负载为 2.15 + +* 最近15分钟的平均负载为 2.21 + +高平均负载意味着系统是过载的;许多进程在等待CPU时间。 + +下一节将介绍平均负载和CPU核数的关系。此外,常用的工具[top][5] 和 [glances][6] 可以实时显示Linux系统的运行状态: + +#### Top命令 + +``` +$ top +``` +显示运行中的Linux进程 +``` +top - 12:51:42 up 2:11, 1 user, load average: 1.22, 1.12, 1.26 +Tasks: 243 total, 1 running, 242 sleeping, 0 stopped, 0 zombie +%Cpu(s): 17.4 us, 2.9 sy, 0.3 ni, 74.8 id, 4.6 wa, 0.0 hi, 0.0 si, 0.0 st +KiB Mem : 8069036 total, 388060 free, 4381184 used, 3299792 buff/cache +KiB Swap: 3906556 total, 3901876 free, 4680 used. 2807464 avail Mem +PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND +6265 tecmint 20 0 1244348 170680 83616 S 13.3 2.1 6:47.72 Headset +2301 tecmint 9 -11 640332 13344 9932 S 6.7 0.2 2:18.96 pulseaudio +2459 tecmint 20 0 1707692 315628 62992 S 6.7 3.9 6:55.45 cinnamon +2957 tecmint 20 0 2644644 1.035g 137968 S 6.7 13.5 50:11.13 firefox +3208 tecmint 20 0 507060 52136 33152 S 6.7 0.6 0:04.34 gnome-terminal- +3272 tecmint 20 0 1521380 391324 178348 S 6.7 4.8 6:21.01 chrome +6220 tecmint 20 0 1595392 106964 76836 S 6.7 1.3 3:31.94 Headset +1 root 20 0 120056 6204 3964 S 0.0 0.1 0:01.83 systemd +2 root 20 0 0 0 0 S 0.0 0.0 0:00.00 kthreadd +3 root 20 0 0 0 0 S 0.0 0.0 0:00.10 ksoftirqd/0 +5 root 0 -20 0 0 0 S 0.0 0.0 0:00.00 kworker/0:0H +.... +``` + +#### Glances工具 + +``` +$ glances +``` +Glances – Linux系统监测工具 +``` +TecMint (LinuxMint 18 64bit / Linux 4.4.0-21-generic) Uptime: 2:16:06 +CPU 16.4% nice: 0.1% LOAD 4-core MEM 60.5% active: 4.90G SWAP 0.1% +user: 10.2% irq: 0.0% 1 min: 1.20 total: 7.70G inactive: 2.07G total: 3.73G +system: 3.4% iowait: 2.7% 5 min: 1.16 used: 4.66G buffers: 242M used: 4.57M +idle: 83.6% steal: 0.0% 15 min: 1.24 free: 3.04G cached: 2.58G free: 3.72G +NETWORK Rx/s Tx/s TASKS 253 (883 thr), 1 run, 252 slp, 0 oth sorted automatically by cpu_percent, flat view +enp1s0 525Kb 31Kb +lo 2Kb 2Kb CPU% MEM% VIRT RES PID USER NI S TIME+ IOR/s IOW/s Command +wlp2s0 0b 0b 14.6 13.3 2.53G 1.03G 2957 tecmint 0 S 51:49.10 0 40K /usr/lib/firefox/firefox +7.4 2.2 1.16G 176M 6265 tecmint 0 S 7:08.18 0 0 /usr/lib/Headset/Headset --type=renderer --no-sandbox --primordial-pipe-token=879B36514C6BEDB183D3E4142774D1DF --lan +DISK I/O R/s W/s 4.9 3.9 1.63G 310M 2459 tecmint 0 R 7:12.18 0 0 cinnamon --replace +ram0 0 0 4.2 0.2 625M 13.0M 2301 tecmint -11 S 2:29.72 0 0 /usr/bin/pulseaudio --start --log-target=syslog +ram1 0 0 4.2 1.3 1.52G 105M 6220 tecmint 0 S 3:42.64 0 0 /usr/lib/Headset/Headset +ram10 0 0 2.9 0.8 409M 66.7M 6240 tecmint 0 S 2:40.44 0 0 /usr/lib/Headset/Headset --type=gpu-process --no-sandbox --supports-dual-gpus=false --gpu-driver-bug-workarounds=7,2 +ram11 0 0 2.9 1.8 531M 142M 1690 root 0 S 6:03.79 0 0 /usr/lib/xorg/Xorg :0 -audit 0 -auth /var/lib/mdm/:0.Xauth -nolisten tcp vt8 +ram12 0 0 2.6 0.3 79.3M 23.8M 9651 tecmint 0 R 0:00.71 0 0 /usr/bin/python3 /usr/bin/glances +ram13 0 0 1.6 4.8 1.45G 382M 3272 tecmint 0 S 6:25.30 0 4K /opt/google/chrome/chrome +... +``` + +这些工具中的平均负载是从/proc/loadavg文件中读取的,可以直接使用[cat 命令][7]查看: + +``` +$ cat /proc/loadavg +2.48 1.69 1.42 5/889 10570 +``` + +想要图形样式监测平均负载,请戳:[ttyload – 终端中颜色编码图形显示Linux平均负载][8] + +在PC中,可以使用用户图形接口工具查看系统平均负载。 + +### 理解系统平均负载和CPU核心数的关系 + +考虑了CPU核心数的影响,才能解释系统负载。 + +#### 多处理器 Vs 多核处理器 + +* 多处理器 – 一个计算机系统中集成两个或多个物理CPU + +* 多核处理器 – 单个物理CPU有两个或多个单独的核并行工作(也叫处理单元)。双核意味着有两个处理单元,4核有4个处理单元,以此类推。 + +此外,Intel引入了超线程技术用来提高并行计算能力。 + +通过超线程技术,在操作系统中,单物理CPU表现的和双逻辑CPU一样。(实际在硬件上只有一个CPU)。 + +单CPU核同一时间只能执行一个任务,于是产生了多CPU/处理器,多核CPU,以及多线程技术。 + +多CPU时,多个程序可以同时执行。如今的Intel CPU使用了多核心和超线程技术。 + +可以使用 [nproc or lscpu 命令][9]查看系统中的处理器单元数量。 + +``` +$ nproc +4 +或者 +lscpu +``` + +也可以使用 [grep 命令][10]  + +``` +$ grep 'model name' /proc/cpuinfo | wc -l +4 +``` + +为了进一步理解系统负载,需要做一些假设。假设系统负载如下: + +``` +23:16:49 up 10:49, 5 user, load average: 1.00, 0.40, 3.35 +``` + +######单核系统中意味着: + +* CPU被充分利用(100%);最近的1分钟平均有1个进程在运行。 + +* CPU有60%处于空闲状态;在最近的5分钟平均没有进程等待CPU时间。 + +* CPU平均过载了235%;最近的15分钟平均有2.35个进程在等待CPU时间。 + +###### 双核系统中意味着: + +* 有一个CPU处于完全空闲状态,另一个CPU被使用;最近的1分钟平均没有进程等待CPU时间。 + +* CPU平均160%处于空闲状态;最近的5分钟平均没有进程等待CPU时间。 + +* CPU平均过载了135%;最近的15分钟平均有1.35个进程等到CPU时间。 + +也许你还会喜欢: + +1. [20 Command Line Tools to Monitor Linux Performance – Part 1][1] + +2. [13 Linux Performance Monitoring Tools – Part 2][2] + +3. [Perf- A Performance Monitoring and Analysis Tool for Linux][3] + +4. [Nmon: Analyze and Monitor Linux System Performance][4] + +总而言之,如果你是系统管理员,你应该关注高平均负载。平均负载高于CPU核心数意味着需要增加CPU,反之则意味着CPU未被充分利用。 + +-------------------------------------------------------------------------------- +作者简介: + +Aaron Kili是Linux和自由软件的热心者,热衷于分享知识,现在是TecMint网站的内容创作者,不久之后将成为Linux系统管理员,web开发者。 + + + +----- + +via: https://www.tecmint.com/understand-linux-load-averages-and-monitor-performance/ + +作者:[Aaron Kili ][a] +译者:[kylecao](https://github.com/kylecao) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/aaronkili/ +[1]:https://www.tecmint.com/command-line-tools-to-monitor-linux-performance/ +[2]:https://www.tecmint.com/linux-performance-monitoring-tools/ +[3]:https://www.tecmint.com/perf-performance-monitoring-and-analysis-tool-for-linux/ +[4]:https://www.tecmint.com/nmon-analyze-and-monitor-linux-system-performance/ +[5]:https://www.tecmint.com/12-top-command-examples-in-linux/ +[6]:https://www.tecmint.com/glances-an-advanced-real-time-system-monitoring-tool-for-linux/ +[7]:https://www.tecmint.com/13-basic-cat-command-examples-in-linux/ +[8]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/ +[9]:https://www.tecmint.com/check-linux-cpu-information/ +[10]:https://www.tecmint.com/12-practical-examples-of-linux-grep-command/ +[11]:https://www.tecmint.com/author/aaronkili/ +[12]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[13]:https://www.tecmint.com/free-linux-shell-scripting-books/ From b7c5e71b27060a28b80452d16d0f3595de4049ca Mon Sep 17 00:00:00 2001 From: GHLandy Date: Fri, 23 Jun 2017 12:26:55 +0800 Subject: [PATCH 0491/1407] [Translating] 20170202 A look at 6 iconic open source brands.md --- .../tech/20170202 A look at 6 iconic open source brands.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sources/tech/20170202 A look at 6 iconic open source brands.md b/sources/tech/20170202 A look at 6 iconic open source brands.md index b692824636..92295c571e 100644 --- a/sources/tech/20170202 A look at 6 iconic open source brands.md +++ b/sources/tech/20170202 A look at 6 iconic open source brands.md @@ -1,4 +1,6 @@ -A look at 6 iconic open source brands +GHLandy Translating + +简览 6 大形象的开源商标 ============================================================ ![A look at 6 iconic open source brands](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/BUSINESS_brandbalance.png?itok=opwotgEh "A look at 6 iconic open source brands") From ae72478728580a2751f27260c9bbf568cf8fd71b Mon Sep 17 00:00:00 2001 From: kylecao Date: Fri, 23 Jun 2017 15:40:45 +0800 Subject: [PATCH 0492/1407] Update 20170312 OpenGL Go Tutorial Part 1.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 翻译申请 --- sources/tech/20170312 OpenGL Go Tutorial Part 1.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170312 OpenGL Go Tutorial Part 1.md b/sources/tech/20170312 OpenGL Go Tutorial Part 1.md index 56adf60616..1f5c8d4b89 100644 --- a/sources/tech/20170312 OpenGL Go Tutorial Part 1.md +++ b/sources/tech/20170312 OpenGL Go Tutorial Part 1.md @@ -1,3 +1,4 @@ +translating by kylecao OpenGL & Go Tutorial Part 1: Hello, OpenGL ============================================================ From 82d9c177b1d3839b7031077d2a2517886a47229b Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 23 Jun 2017 19:38:24 +0800 Subject: [PATCH 0493/1407] PRF:20170531 Understand Linux Load Averages and Monitor Performance of Linux.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @kylecao 恭喜你完成了首篇翻译,翻译的不错,就是要注意格式,请参照我的校对。 --- ...erages and Monitor Performance of Linux.md | 124 ++++++++---------- 1 file changed, 56 insertions(+), 68 deletions(-) diff --git a/translated/tech/20170531 Understand Linux Load Averages and Monitor Performance of Linux.md b/translated/tech/20170531 Understand Linux Load Averages and Monitor Performance of Linux.md index f3ff059ec7..b52162fafa 100644 --- a/translated/tech/20170531 Understand Linux Load Averages and Monitor Performance of Linux.md +++ b/translated/tech/20170531 Understand Linux Load Averages and Monitor Performance of Linux.md @@ -1,28 +1,24 @@ -理解Linux平均负载和性能监控 +理解 Linux 的平均负载和性能监控 ============================================================ +在本文中,我们将解释 Linux 系统中最关键的管理任务之一——关于系统 / CPU 的负载(load)和平均负载(Load average)的性能监控。 -在本文中,我们将解释Linux系统中最关键的管理任务之一——关于系统/CPU的负载和平均负载的性能监控。 +首先来看所有的类 UNIX 系统中两个重要的表述: -首先来看类UNIX系统中两个重要的表述: +* 系统负载 / CPU 负载 – 衡量 Linux 系统的 CPU 过载或利用率低的指标,即处于运算状态或等待状态的 CPU 核心数。 +* 平均负载 – 通过固定的时间周期如 1、5、15 分钟计算出的平均的系统负载。 -* 系统负载/CPU负载 – 衡量Linux系统的CPU过载或利用率低;处于运算状态或等待状态的CPU核心数。 - -* 平均负载 – 通过固定周期如1,5,15分钟计算出的平均系统负载。 - -Linux中,平均负载一般指在内核运行队列中被标记为运行或不可打断状态的平均进程数。 +Linux 中,平均负载一般指在内核运行队列中被标记为运行或不可打断状态的进程的平均数。 注意: -* 多数Linux或类Unix系统会为用户展示平均负载的值。 +* 几乎没有 Linux 或类 Unix 系统不为用户展示平均负载的值。 +* 完全空闲的 Linux 系统平均负载为 0,不包括空闲进程。 +* 绝大多数类 Unix 系统只统计运行和等待状态的进程。但是在 Linux 中,平均负载也包括处于不可打断的睡眠状态的进程——它们是在等待其它系统资源如磁盘 I/O 等的进程。 -* 完全空闲的Linux系统平均负载为0,不包括空闲进程。 +### 如何监测 Linux 系统平均负载 -* 绝大多数类Unix系统只统计运行和等待状态的进程。但是在Linux中,平均负载包括不可打断的睡眠状态进程;等待其它系统资源如磁盘I/O的进程等。 - -### 如何监测Linux系统平均负载 - -有诸多方式监测系统平均负载,如uptime,展示系统运行时间,用户数量及平均负载: +有诸多方式监测系统平均负载,如 `uptime`,它会展示系统运行时间、用户数量及平均负载: ``` $ uptime @@ -31,22 +27,22 @@ $ uptime 平均负载的数字从左到右的含义依次为: -* 最近1分钟的平均负载为 1.98 +* 最近 1 分钟的平均负载为 1.98 +* 最近 5 分钟的平均负载为 2.15 +* 最近 15 分钟的平均负载为 2.21 -* 最近5分钟的平均负载为 2.15 +高平均负载意味着系统是过载的:许多进程在等待 CPU 时间。 -* 最近15分钟的平均负载为 2.21 - -高平均负载意味着系统是过载的;许多进程在等待CPU时间。 - -下一节将介绍平均负载和CPU核数的关系。此外,常用的工具[top][5] 和 [glances][6] 可以实时显示Linux系统的运行状态: +下一节将介绍平均负载和 CPU 核数的关系。此外,常用的工具 [top][5] 和 [glances][6] 可以实时显示 Linux 系统的运行状态: #### Top命令 ``` $ top ``` -显示运行中的Linux进程 + +显示运行中的Linux进程: + ``` top - 12:51:42 up 2:11, 1 user, load average: 1.22, 1.12, 1.26 Tasks: 243 total, 1 running, 242 sleeping, 0 stopped, 0 zombie @@ -68,12 +64,14 @@ PID USER PR NI VIRT RES SHR S %CPU %MEM TIME+ COMMAND .... ``` -#### Glances工具 +#### Glances 工具 ``` $ glances ``` -Glances – Linux系统监测工具 + +Glances – Linux系统监测工具: + ``` TecMint (LinuxMint 18 64bit / Linux 4.4.0-21-generic) Uptime: 2:16:06 CPU 16.4% nice: 0.1% LOAD 4-core MEM 60.5% active: 4.90G SWAP 0.1% @@ -95,45 +93,44 @@ ram13 0 0 1.6 4.8 1.45G 382M 3272 tecmint 0 S 6:25. ... ``` -这些工具中的平均负载是从/proc/loadavg文件中读取的,可以直接使用[cat 命令][7]查看: +这些工具中的平均负载是从 `/proc/loadavg` 文件中读取的,也可以直接使用 [cat 命令][7]查看: ``` $ cat /proc/loadavg 2.48 1.69 1.42 5/889 10570 ``` -想要图形样式监测平均负载,请戳:[ttyload – 终端中颜色编码图形显示Linux平均负载][8] +想要图形样式监测平均负载,请戳:[ttyload – 终端中颜色编码图形显示 Linux 平均负载][8]。 -在PC中,可以使用用户图形接口工具查看系统平均负载。 +在桌面计算机中,可以使用图形用户接口工具查看系统平均负载。 -### 理解系统平均负载和CPU核心数的关系 +### 理解系统平均负载和 CPU 核心数的关系 -考虑了CPU核心数的影响,才能解释系统负载。 +考虑了 CPU 核心数的影响,才能解释系统负载。 #### 多处理器 Vs 多核处理器 -* 多处理器 – 一个计算机系统中集成两个或多个物理CPU +* 多处理器 – 一个计算机系统中集成两个或多个物理 CPU +* 多核处理器 – 单个物理 CPU 有两个或多个单独的核并行工作(也叫处理单元)。双核意味着有两个处理单元,4 核有 4 个处理单元,以此类推。 -* 多核处理器 – 单个物理CPU有两个或多个单独的核并行工作(也叫处理单元)。双核意味着有两个处理单元,4核有4个处理单元,以此类推。 +此外,Intel 引入了超线程技术用来提高并行计算能力。 -此外,Intel引入了超线程技术用来提高并行计算能力。 +通过超线程技术,在操作系统中,单个物理 CPU 表现的和两个逻辑 CPU 一样。(实际在硬件上只有一个 CPU)。 -通过超线程技术,在操作系统中,单物理CPU表现的和双逻辑CPU一样。(实际在硬件上只有一个CPU)。 +注意,单个 CPU 核同一时间只能执行一个任务,于是产生了多 CPU/处理器、多核 CPU,以及多线程技术。 -单CPU核同一时间只能执行一个任务,于是产生了多CPU/处理器,多核CPU,以及多线程技术。 +多 CPU 时,多个程序可以同时执行。如今的 Intel CPU 使用了多核心和超线程技术。 -多CPU时,多个程序可以同时执行。如今的Intel CPU使用了多核心和超线程技术。 - -可以使用 [nproc or lscpu 命令][9]查看系统中的处理器单元数量。 +可以使用 [nproc 或 lscpu 命令][9]查看系统中的处理器单元数量。 ``` $ nproc 4 -或者 +# 或者 lscpu ``` -也可以使用 [grep 命令][10]  +也可以使用 [grep 命令][10]: ``` $ grep 'model name' /proc/cpuinfo | wc -l @@ -146,48 +143,39 @@ $ grep 'model name' /proc/cpuinfo | wc -l 23:16:49 up 10:49, 5 user, load average: 1.00, 0.40, 3.35 ``` -######单核系统中意味着: +**在单核系统中意味着:** -* CPU被充分利用(100%);最近的1分钟平均有1个进程在运行。 +* CPU 被充分利用(100%);最近的 1 分钟有 1 个进程在运行。 +* CPU 有 60% 处于空闲状态;在最近的 5 分钟没有进程等待 CPU 时间。 +* CPU 平均过载了 235%;最近的 15 分钟平均有 2.35 个进程在等待 CPU 时间。 -* CPU有60%处于空闲状态;在最近的5分钟平均没有进程等待CPU时间。 +**在双核系统中意味着:** -* CPU平均过载了235%;最近的15分钟平均有2.35个进程在等待CPU时间。 - -###### 双核系统中意味着: - -* 有一个CPU处于完全空闲状态,另一个CPU被使用;最近的1分钟平均没有进程等待CPU时间。 - -* CPU平均160%处于空闲状态;最近的5分钟平均没有进程等待CPU时间。 - -* CPU平均过载了135%;最近的15分钟平均有1.35个进程等到CPU时间。 +* 有一个 CPU 处于完全空闲状态,另一个 CPU 被使用;最近的 1 分钟没有进程等待 CPU 时间。 +* CPU 平均 160% 处于空闲状态;最近的 5 分钟没有进程等待 CPU 时间。 +* CPU 平均过载了 135%;最近的 15 分钟有 1.35 个进程等待 CPU 时间。 也许你还会喜欢: -1. [20 Command Line Tools to Monitor Linux Performance – Part 1][1] +1. [20 个监控系统性能的命令行工具(一)][1] +2. [13 个 Linux 性能监控工具(二)][2] +3. [Perf:一个 Linux 上的性能监控分析工具][3] +4. [使用 Nmon 监控 Linux 的系统性能][4] -2. [13 Linux Performance Monitoring Tools – Part 2][2] - -3. [Perf- A Performance Monitoring and Analysis Tool for Linux][3] - -4. [Nmon: Analyze and Monitor Linux System Performance][4] - -总而言之,如果你是系统管理员,你应该关注高平均负载。平均负载高于CPU核心数意味着需要增加CPU,反之则意味着CPU未被充分利用。 +总而言之,如果你是系统管理员,你应该关注高的平均负载。平均负载高于 CPU 核心数意味着需要增加 CPU,反之则意味着 CPU 未被充分利用。 -------------------------------------------------------------------------------- 作者简介: -Aaron Kili是Linux和自由软件的热心者,热衷于分享知识,现在是TecMint网站的内容创作者,不久之后将成为Linux系统管理员,web开发者。 - - +Aaron Kili 是 Linux 和自由软件的热心者,热衷于分享知识,现在是 TecMint 网站的内容创作者,不久之后将成为 Linux 系统管理员,web 开发者。 ----- via: https://www.tecmint.com/understand-linux-load-averages-and-monitor-performance/ -作者:[Aaron Kili ][a] +作者:[Aaron Kili][a] 译者:[kylecao](https://github.com/kylecao) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 @@ -195,11 +183,11 @@ via: https://www.tecmint.com/understand-linux-load-averages-and-monitor-performa [1]:https://www.tecmint.com/command-line-tools-to-monitor-linux-performance/ [2]:https://www.tecmint.com/linux-performance-monitoring-tools/ [3]:https://www.tecmint.com/perf-performance-monitoring-and-analysis-tool-for-linux/ -[4]:https://www.tecmint.com/nmon-analyze-and-monitor-linux-system-performance/ +[4]:https://linux.cn/article-6886-1.html [5]:https://www.tecmint.com/12-top-command-examples-in-linux/ -[6]:https://www.tecmint.com/glances-an-advanced-real-time-system-monitoring-tool-for-linux/ +[6]:https://linux.cn/article-6882-1.html [7]:https://www.tecmint.com/13-basic-cat-command-examples-in-linux/ -[8]:https://www.tecmint.com/ttyload-shows-color-coded-graph-of-linux-load-average/ +[8]:https://linux.cn/article-8553-1.html [9]:https://www.tecmint.com/check-linux-cpu-information/ [10]:https://www.tecmint.com/12-practical-examples-of-linux-grep-command/ [11]:https://www.tecmint.com/author/aaronkili/ From abaf0d22623d5322fa2eaf0f0e75d42554ad72d9 Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 23 Jun 2017 19:38:52 +0800 Subject: [PATCH 0494/1407] PUB:20170531 Understand Linux Load Averages and Monitor Performance of Linux.md @kylecao https://linux.cn/article-8632-1.html --- ...rstand Linux Load Averages and Monitor Performance of Linux.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170531 Understand Linux Load Averages and Monitor Performance of Linux.md (100%) diff --git a/translated/tech/20170531 Understand Linux Load Averages and Monitor Performance of Linux.md b/published/20170531 Understand Linux Load Averages and Monitor Performance of Linux.md similarity index 100% rename from translated/tech/20170531 Understand Linux Load Averages and Monitor Performance of Linux.md rename to published/20170531 Understand Linux Load Averages and Monitor Performance of Linux.md From 4427ae5cf8e5fec823f9a0e480408e4227a4b3fd Mon Sep 17 00:00:00 2001 From: ypingcn <1344632698@qq.com> Date: Fri, 23 Jun 2017 20:13:54 +0800 Subject: [PATCH 0495/1407] Delete:20170518 Hugo vs. Jekyll Comparing the leading static website generators.md --- ...g the leading static website generators.md | 103 ------------------ 1 file changed, 103 deletions(-) delete mode 100644 sources/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md diff --git a/sources/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md b/sources/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md deleted file mode 100644 index c5fbc4f34f..0000000000 --- a/sources/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md +++ /dev/null @@ -1,103 +0,0 @@ -translating by ypingcn - -Hugo vs. Jekyll: Comparing the leading static website generators -============================================================ - -### If you're building a new website, a static site generator may be the right platform for you. - - -![Hugo vs. Jekyll: Comparing the leading static website generators ](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/rh_003784_02_os.comcareers_os_rh2x.png?itok=4wXjYMBw "Hugo vs. Jekyll: Comparing the leading static website generators ") ->Image by : opensource.com - -Unless your spirit animal is Emily Dickinson, when you make a thing, you want to share it with the world. Sharing your work means that you need a website. Of course, you could simply partake in digital sharecropping and use any of the various social media sites to get your work in front of an audience. There sure are plenty to choose from... and not just "conventional" social media sites. With places like Artstation, Flickr, Soundcloud, and Wattpad, there's an outlet for you, whatever your medium. - -And actually, you  _should_  use those sites. It's where the people are, after all. However, none of those places is truly yours. None is a home base that  _you_  control and that you can ensure will be there for people to find regardless of the waxing and waning trends of social media. - -Programming and development - -* [New Python content][1] - -* [Our latest JavaScript articles][2] - -* [Recent Perl posts][3] - -* [Red Hat Developers Blog][4] - -Control. That's the value of having your own place on the web. - -But this article isn't about setting up a domain name and hosting for your website. It's for the step  _after_  that, the actual making of that site. The typical choice for a lot of people would be to use something like [WordPress][6]. It's a one-click install on most hosting providers, and there's a gigantic market of plugins and themes available to choose from, depending on the type of site you're trying to build. But not only is WordPress a bit overkill for most websites, it also gives you a dynamically generated site with a lot of moving parts. If you don't keep all of those pieces up to date, they can pose a significant security risk and your site could get hijacked. - -The alternative would be to have a static website, with nothing dynamically generated on the server side. Just good old HTML and CSS (and perhaps a bit of Javascript for flair). The downside to that option has been that you've been relegated to coding the whole thing by hand yourself. It's doable, but you just want a place to share your work. You shouldn't have to know all the idiosyncrasies of low-level web design (and the monumental headache of cross-browser compatibility) to do that. - -Enter static site generators. You get the speed and security of static HTML pages, but with a workflow that's closer to the convenience of a dynamic site. The two frontrunners in the static site generator world are [Hugo][7] and [Jekyll][8]. (By the way, Paolo Bonzini has a great article on [getting started with Jekyll][9].) But which one is the right choice for you? Hopefully by the end of this article, you'll have a better idea. We're evaluating both static site generators based on how quickly you can get started, availability of themes, editing workflow, and extensibility. - -### Getting started - -Fair warning, both of these tools will require you to work with them from the command line. Most of the commands are straightforward and easy to remember, but let's adjust our expectations accordingly. This is not a point-and-click interface. - -Installation for both Jekyll and Hugo is pretty simple. Jekyll installs as a RubyGem, and Hugo offers a very handy all-in-one binary to get you started quickly. Because of the single install package, Hugo edges ahead here slightly. Although the RubyGems install method for Jekyll is easy in its own right, it  _does_  require that you already have a properly installed and configured Ruby environment on your computer. Outside of the community of designers and developers for the web, most folks don't already have that setup. - -Once installed, though, both Hugo and Jekyll are pretty evenly matched. They both have great documentation and quick-start guides. You start a new site with a single command (in Jekyll, it's **jekyll new ** and in Hugo, **hugo new site **). This sets up a general directory structure and scaffolding for your site. Directory structures and basic configuration are pretty similar. Jekyll uses a **_config.yml** file and Hugo uses **config.toml** (although you  _can_  use YAML or even JSON syntax with Hugo's config if you're more comfortable with either of those). The front matter metadata at the top of each content file uses the same syntax as the config. After that, all page content is written in Markdown. - -I will say that in terms of getting you started with your very first statically generated site, Jekyll has a slight advantage over Hugo because it starts with some basic content and a default theme. You can use these as example templates as you start building your site. Hugo has no example content or even a default theme. That said, example content and default themes are usually the first things I delete when I'm making a new site with any tool, so Hugo actually saves me a step. - -### Themes - -As I mentioned, Hugo doesn't ship with a default theme at all, so that's probably one of the first things you're going to want to set up. Jekyll has a decent default theme, though it's pretty bare bones. You'll probably want to go theme hunting with your Jekyll site, too. - -Both Hugo and Jekyll have a pretty diverse assortment of themes for all manners of website types from single-page ID themes to full-blown multipage sites with blog posts and comments. Despite that, it's not exactly easy to find a theme that suits your needs. In either case, the place to go for themes—[themes.gohugo.io][10] for Hugo and [jekyllthemes.org][11] for Jekyll—is basically a single large page full of theme screenshots. Once you click on a theme, you can get some pretty detailed information about it, but that initial search is pretty rough. Hugo's theme page has some basic tagging built into it, but in general, theme searching and presentation is something I feel both projects really need to work on. - -Theme management is also an interesting topic. In both cases, nearly every theme is a Git repository (often hosted on GitHub) that you clone into your website scaffolding. In Jekyll, there's an additional step of using RubyGems' **bundle** to ensure that the theme is managed with the site. Most themes already come with a **Gemfile**, making this step relatively painless. If the theme doesn't already have a **Gemfile**, it's fairly easy to add. In Hugo there's no bundling step. Just point to the theme from your **config.toml,** and you're good to go. - -I've found that I'm partial to the way that Hugo handles themes. You clone (or create) themes into their own space in a **themes** subdirectory. Not only does it make it relatively easy to switch between themes when you're first starting out, but it also gives you the ability to override any component file of a theme with your own file. This means you can customize a theme to your tastes without messing too much with the source of the original theme, allowing it to stay generic enough for other people to use. Of course, if you have a change that you feel other users of the theme may find worthwhile, you can still edit that source and submit a pull request to the theme maintainer. - -### Workflow - -The workflows for building your site in Jekyll and Hugo are pretty similar once you have your initial configuration set up. Both have a live **serve** command that runs a small, lightweight web server on your computer so you can test your site locally without needing to upload it anywhere. The really nice thing is that whether you're running **jekyll serve** or **hugo serve**, both are configured by default to watch for any changes you make to your site as you work on it. When you look at the locally served version of your site in a browser, it automatically updates with any change you make, regardless of whether that change is to content, configuration, theme, or just an image. It's really quite handy and a great time-saver. - -You write the content for your site in both systems using [Markdown][12] syntax. If you don't happen to be familiar with Markdown, it's a very simplified means of writing in plain text while still allowing for some nice formatting marks. It's very easy to work in and human-readable. And because it's in plain text, your content (and therefore your site) is easily version controlled. It's pretty much the main way I write almost everything these days. - -New content can be added to your site scaffolding by manually creating files in the right place. It just needs to be a Markdown file with the appropriate "front matter" metadata at the top of the file. As with the configuration file, Jekyll uses YAML syntax for front matter, while Hugo will accept TOML, YAML, or JSON (default is TOML). That new page file needs to be placed in the correct directory within your site's scaffolding. In Jekyll, you have separate **_drafts** and **_posts** directories for storing your work in progress and your completed content pages, respectively. In Hugo, there's only a single **content** directory. You specify whether a post is a draft or not within that content file's front matter. - -Now, although it's possible to do all of this manually, Hugo does offer some convenience functions to ensure that your new file is created in the correct spot in the scaffolding and that files are pre-populated with appropriate front matter. It's simply a matter of going to your site's directory in a terminal and typing **hugo new content/** where **** is the new page you want to create. You can even set up templates called **archetypes** that hold customized front matter for pages of different types (like if you have both a blog and a podcast on your website). - -When your site is ready to ship, you can shut down your preview server and issue a command to build the actual pages of the site. In Jekyll, that would be **jekyll build**. In Hugo, it's just **hugo**. Jekyll puts the completed site in the **_site** subdirectory, while Hugo puts them in a subdirectory named **public**. In either case, once you do that, you have a completed static website that you can upload and have hosted nearly anywhere. - -### Extensibility - -Both Hugo and Jekyll give you the ability to customize your site down to the smallest thing. However, in terms of extensibility, Jekyll currently leads in a big way because of its plugin API. Because of this plugin architecture, it's relatively easy to add functionality to your Jekyll-generated site with reasonably short snippets of code available through the Jekyll community or that you write yourself. - -Hugo does not currently have a plugin API at all, so adding that kind of functionality is a bit tougher. There's hope that the ability to write and include plugins will be added in the future, but it doesn't appear that anyone is working on that yet. - -### Conclusion - -By and large, Hugo and Jekyll are pretty similar. It really comes down to determining how you're most comfortable working and what your site needs. If you already have a RubyGems environment set up and you need the extensibility of plugins, then Jekyll is the way to go. However, if you value a simple workflow and a straightforward means of customizing your site, then Hugo would be your top pick. - -I find that I'm more drawn to Hugo's approach, and in building a small handful of sites, I haven't yet had a need for any plugins. Of course, everyone's needs are a little bit different. Which static site generator would you choose for your site? - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/17/5/hugo-vs-jekyll - -作者:[Jason van Gumster ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/jason-van-gumster -[1]:https://opensource.com/tags/python?src=programming_resource_menu -[2]:https://opensource.com/tags/javascript?src=programming_resource_menu -[3]:https://opensource.com/tags/perl?src=programming_resource_menu -[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu -[5]:https://opensource.com/article/17/5/hugo-vs-jekyll?rate=lZDKuqOQ7lVUon-ZKebR5SUCyXDz5oCQ_zoCSBPolOQ -[6]:http://wordpress.org/ -[7]:http://gohugo.io/ -[8]:https://jekyllrb.com/ -[9]:https://opensource.com/article/17/4/getting-started-jekyll -[10]:https://themes.gohugo.io/ -[11]:http://jekyllthemes.org/ -[12]:https://daringfireball.net/projects/markdown/ -[13]:https://opensource.com/user/26430/feed -[14]:https://opensource.com/article/17/5/hugo-vs-jekyll#comments -[15]:https://opensource.com/users/jason-van-gumster From 43b053ac0547280bd561eb54383b17cb06a5cd3d Mon Sep 17 00:00:00 2001 From: ypingcn <1344632698@qq.com> Date: Fri, 23 Jun 2017 20:16:21 +0800 Subject: [PATCH 0496/1407] Translated:20170518 Hugo vs. Jekyll Comparing the leading static website generators.md --- ...g the leading static website generators.md | 91 +++++++++++++++++++ 1 file changed, 91 insertions(+) create mode 100644 translated/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md diff --git a/translated/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md b/translated/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md new file mode 100644 index 0000000000..3f05a743f5 --- /dev/null +++ b/translated/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md @@ -0,0 +1,91 @@ +Hugo vs. Jekyll :两大领先的静态页面生成器之间的比较 +============================================================ + +### 如果你正在建一个新网页,一个静态页面生成器或许是个正确的选择。 + +![Hugo vs. Jekyll: Comparing the leading static website generators ](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/rh_003784_02_os.comcareers_os_rh2x.png?itok=4wXjYMBw "Hugo vs. Jekyll: Comparing the leading static website generators ") +>图片提供 : opensource.com + +除非你是像狄更生那样深居简出的人,当做了点事情后,你就会想要与这个世界分享。分享你的作品意味着需要一个网页。当然,你可以简单地参与数字时代的收益分成(digital sharecropping),使用任何不同的社交网站来将你的作品呈现在观众面前。还有很多选项可以选择,不仅仅是传统的社交网站。例如 Artstation、Flickr、Soundcloud、Wattpad,不管你的媒介是什么,总有属于你的网站。 + +实际上,你_应该_使用这些网站,毕竟,人们都在这些网站上。然而,没有一个地方是真正属于你的。没有一个网站是你能保证不管社交趋势如何,人们都能在该网站上找到你的作品的。 + +控制权,是拥有一个在网上属于自己的地方的价值。 + +但是这篇文章不打算介绍注册域名和托管你的网站。要介绍的是_后续_的步骤,真正地制作网页。对于很多人来说,典型的选择是使用像 [WordPress][6] 那一类的软件。在大多数域名托管商上,只需一次点击即可安装,然后就会有海量的插件和主题可供选择。插件和主题的选择取决于你想要制作的网页的类型。但是WordPress不仅对于大部分网页来说有点过犹不及,还给了你一个有许多活动部件的动态页面。如果你没有保证这些部件是最新的,这些部件可以造成重大安全隐患,你的页面因此被劫持。 + +替代方法是拥有一个静态网页,在服务端没有任何动态内容生成。原先的 HTML 和 CSS (或许还有点 Javascript 也挺好)。这选项不好的一面是以后你要亲自动手编写所有的代码。这是可行的,但你只是想要个地方来展示你的作品。你没必要知道底层网页设计的特性(和重要的但却令人头疼的跨浏览器兼容性)。 + +使用静态页面生成器。你得到了静态 HTML 页面的速度与安全,但是是以有着接近于动态页面的便利性的工作流程完成的。在静态页面生成器世界的两大先驱是 [Hugo][7] 和 [Jekyll][8] ,(顺道说下,Paolo Bonzini 的文章 《[getting started with Jekyll][9]》 写得不错)但是哪一个才是你的正确选择?希望阅读完这篇文章,你将会有个更好的想法。我们将基于易上手性、主题可用性、编辑方式和拓展性这几点评估这两个静态页面生成器。 + +### 开始 + +公平地提醒一下,这两个都需要你在命令行下使用他们。大部分命令都很直接和易于记忆,但是让我们相应地调整下我们的期望吧,这不是点击几下鼠标就能做事的界面。 + +Jekyll 和 Hugo 的安装都相当的简单。 Jekyll 以 RubyGem 的方式安装,Hugo 提供了一个方便的多用途二进制文件让你迅速上手。因为简单的安装包,Hugo 微弱领先。虽然 Jekyll 的 RubyGems 安装方式本身就很简单,但是它_确实_需要你已经在你的电脑上正确安装并且配置好 Ruby 环境。除了社区设计者和网页开发者,大部分的使用者并没有提前安装好。 + +虽说是这样,但是一旦安装好,Hugo 和 Jekyll 都很好用。它们都有良好的文档和快速开始文档。你用一个简单命令新建一个页面(在 Jekyll 里是 ** jekyll new ** ,在 Hugo 里是 ** hugo new site ** 译者注: 指代你网页的名称)。这一步新建了一个通用目录结构和你网站的大致内容。目录结构和基本的配置都十分相似。Jekyll 使用一个**_config.yml** 文件,Hugo 使用**config.toml**(虽然你_能_在 Hugo 的配置里使用 YMAL 或者 JSON 语法,如果觉得其中一个使用起来更舒服的话)。每个内容文件的前置配置(front matter)元数据使用相同的配置语法。然后,所有的内容都是用 Markdown 写的。 + +我想说就帮助你开始第一个静态网页这一点来说,Jekyll 稍微领先于 Hugo ,因为它能以一些基本的内容和一个默认主题开始着手使用。当在建设网页时,你能使用这些内容作为一个样板。Hugo 没有样例内容,甚至没有一个默认主题。这就是说,样例内容和默认主题是我在用任何工具建设网站时第一个删除的内容,因此Hugo 事实上帮我节省了这一步。 + +### 主题 + +正如我所提到的,Hugo 根本没有默认主题,所以主题可能是你打算最先设置的。Jekyll 有一个得体的默认主题,虽然它只是个骨架。你或许也会想去为你的 Jekyll 页面找一个主题。 + +Hugo 和 Jekyll 都有多种多样的各类主题,网页样式从单页面的主题到带博客发布评论的完善多页面主题都有,一应俱全。尽管如此,想找到满足你需求的主题事实上并不简单。无论使用哪个,主题网站——Hugo 的 [themes.gohugo.io][10] 和 Jekyll 的 [jekyllthemes.org][11] ,基本上都是一个充满主题截图的巨大网站。一旦你点击主题,你能得到关于主题的一些十分详细的信息,但是初始搜索相当困难。Hugo 的主题站有一些基本的标签分类,但是大体上在我看来,主题搜索和展示都是这两个项目需要继续努力的。 + +主题管理也是一个有趣的主题。在两个项目中,几乎每一个主题是一个 Git 仓库(经常是托管在 Github 上),你需要克隆(clone)下来到你的网页建设地。在 Jekyll 里,有使用 RubyGems 的**bundle** 的额外一步来确保主题是由网站管理的。大部分主题都有一个 **Gemfile**,使得这一步骤轻松不少。如果主题没有一个**Gemfile**,添加也相当简单。在 Hugo 里没有捆绑这一操作,只要在**config.toml** 指向你的主题即可。 + +我发现我偏爱 Hugo 的主题处理。你克隆(clone)(或者新建)主题到它们自己的**themes** 子文件夹里。这不仅使得当你开始时能轻松地切换主题,而且也能让你用自己的文件重写主题里的任何组件。这意味着你能根据自己的品味自定义主题,不用混合太多的原始主题,使得这主题对于其他人也是通用的。当然如果有一个你觉得其他用户会觉得值得的改变,你仍然可以编辑源文件,提交一个PR( pull request) 给主题维护者。 + +### 工作流程 + +一旦你设置好初始的配置,Jekyll 和 Hugo 的网站建设流程都很相似。两者都有一个实时的 **serve** 命令,能在你的电脑上运行一个小型、轻量网页服务器,所以你能在在本地测试你的网站而不用上传到哪里。很棒的是无论你是运行着**jekyll serve** 还是**hugo serve**,都默认配置为当你工作时,监视任何你对网站的所有修改。当你在浏览器里看本地版的网站时,它会根据你的修改自动更新,不管你改的是内容、配置、主题、还仅仅是一张图片。这确实很方便和节约时间。 + +在两个系统中都是用 [Markdown][12] 写你的网站内容。如果碰巧你不熟悉 Markdown,(我来解释下)它是种很简单的纯文本编写方式,还能有一些很好用的格式化符号。它很容易使用而且可阅读。而且因为是纯文本,你的内容(其实是你的网站)很容易控制版本。这是我最近写几乎所有东西的主要方式。 + +新内容能通过在正确的地方手动创建文件添加到网站里。新文件只需要是有恰当前置配置(front matter)元数据的Markdown 文件即可。至于配置文件,Jekyll对于前置配置使用 YAML 语法,Hugo 接受 TOML、YAML或者JSON(默认是TOML)。新文件需要放置在正确的文件夹内。在 Jekyll 里你需要把你编写中的文件和完成了的内容页分别放在 **_drafts** 和 **_posts** 目录中。在 Hugo 中只有单独一个 **content** 目录。你根据文件的前置配置判断这是否是一个草稿。 + +现在,虽然可以手动完成所有这些事情,但是 Hugo 提供了一些方便的函数确保你的新文件创建在正确的文件里,那些文件也用恰当的前置配置预先配置好了。 +简单地在终端中进入你网站的目录,输入 **hugo new content/** , **** 代表着你想新建的新页面。你甚至设置些包含为不同页面自定义的前置配置、叫** 原型 **的模版(例如在你的网页上同时有博客和播客)。 + +当你的网页弄好后,你能关闭你的预览服务器和用一个命令来建立你网站的真正页面。在 Jekyll 里是**jekyll build**,Hugo 就仅仅是 **hugo**,Jekyll 把完成好的页面放在 **_site** 的子目录中。然而 Hugo 把这些文件放在名为 **public** 的子目录中。不管哪种情况,一旦你这样做了,你就有一个完整的静态网站,你能上传并把它托管在几乎任何地方。 + +### 可拓展性 + +Hugo 和 Jekyll 都能让你自定义你自己的网站上甚至最小的一个点。然而就可拓展性而言,现在 Jekyll 远远领先因其插件 API。因为这种插件结构,很容易为你 Jekyll 生成的网站添加功能,通过Jekyll 社区或者你自己写的相当短的代码片段就能完成。 + +Hugo 现在根本没有插件 API,所以添加功能有点难。希望以后支持编写并包含插件。但是现在看不出有人在做这一点。 + +### 结论 + +大体上讲,Hugo 和 Jekyll 十分相似。归根结底由你工作体验和你的网站需求决定。如果你已经设置好了 RubyGems 环境而且你需要插件的可拓展性,Jekyll 是你的选择。然而,如果你看重一个简单的工作流程,一个直接自定义网站的方式,那你首选 Hugo。 + +我发现我更喜欢 Hugo 的方法,而且在建一个小型网站,我不需要任何插件。当然,每个人的需求都不同。你会为你的网站选择哪一个静态页面生成器? + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/17/5/hugo-vs-jekyll + +作者:[Jason van Gumster ][a] +译者:[译者ID](https://ypingcn.github.io/wiki/lctt) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: https://opensource.com/users/jason-van-gumster +[1]: https://opensource.com/tags/python?src=programming_resource_menu +[2]: https://opensource.com/tags/javascript?src=programming_resource_menu +[3]: https://opensource.com/tags/perl?src=programming_resource_menu +[4]: https://developers.redhat.com/?intcmp=7016000000127cYAAQ&amp;amp;amp;src=programming_resource_menu +[5]: https://opensource.com/article/17/5/hugo-vs-jekyll?rate=lZDKuqOQ7lVUon-ZKebR5SUCyXDz5oCQ_zoCSBPolOQ +[6]: http://wordpress.org/ +[7]: http://gohugo.io/ +[8]: https://jekyllrb.com/ +[9]: https://opensource.com/article/17/4/getting-started-jekyll +[10]: https://themes.gohugo.io/ +[11]: http://jekyllthemes.org/ +[12]: https://daringfireball.net/projects/markdown/ +[13]: https://opensource.com/user/26430/feed +[14]: https://opensource.com/article/17/5/hugo-vs-jekyll#comments +[15]: https://opensource.com/users/jason-van-gumster From 4b8136abbc3de6925f8351c86395fafe500b782a Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 24 Jun 2017 10:53:22 +0800 Subject: [PATCH 0497/1407] PRF:20170518 Hugo vs. Jekyll Comparing the leading static website generators.md @ypingcn --- ...g the leading static website generators.md | 51 ++++++++++--------- 1 file changed, 26 insertions(+), 25 deletions(-) diff --git a/translated/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md b/translated/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md index 3f05a743f5..bb6a22fb0b 100644 --- a/translated/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md +++ b/translated/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md @@ -1,59 +1,58 @@ -Hugo vs. Jekyll :两大领先的静态页面生成器之间的比较 +Hugo 对比 Jekyll :两大领先的静态页面生成器之间的比较 ============================================================ -### 如果你正在建一个新网页,一个静态页面生成器或许是个正确的选择。 +> 如果你正在建一个新的网站,静态页面生成器或许是个正确的选择。 ![Hugo vs. Jekyll: Comparing the leading static website generators ](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/rh_003784_02_os.comcareers_os_rh2x.png?itok=4wXjYMBw "Hugo vs. Jekyll: Comparing the leading static website generators ") ->图片提供 : opensource.com -除非你是像狄更生那样深居简出的人,当做了点事情后,你就会想要与这个世界分享。分享你的作品意味着需要一个网页。当然,你可以简单地参与数字时代的收益分成(digital sharecropping),使用任何不同的社交网站来将你的作品呈现在观众面前。还有很多选项可以选择,不仅仅是传统的社交网站。例如 Artstation、Flickr、Soundcloud、Wattpad,不管你的媒介是什么,总有属于你的网站。 + +除非你是像艾米莉·狄金森那样深居简出的人,否则,当做了点事情后,你就会想要与这个世界分享。分享你的作品意味着需要一个网站。当然,你可以只是享受数字时代的便利,使用任何不同的社交网站来将你的作品呈现在观众面前。还有很多选择,不仅仅是传统的社交网站,例如 Artstation、Flickr、Soundcloud、Wattpad,不管你的媒介是什么,总有一款属于你的网站。 实际上,你_应该_使用这些网站,毕竟,人们都在这些网站上。然而,没有一个地方是真正属于你的。没有一个网站是你能保证不管社交趋势如何,人们都能在该网站上找到你的作品的。 -控制权,是拥有一个在网上属于自己的地方的价值。 +控制权,这是拥有一个在网上属于自己的地方的意义。 -但是这篇文章不打算介绍注册域名和托管你的网站。要介绍的是_后续_的步骤,真正地制作网页。对于很多人来说,典型的选择是使用像 [WordPress][6] 那一类的软件。在大多数域名托管商上,只需一次点击即可安装,然后就会有海量的插件和主题可供选择。插件和主题的选择取决于你想要制作的网页的类型。但是WordPress不仅对于大部分网页来说有点过犹不及,还给了你一个有许多活动部件的动态页面。如果你没有保证这些部件是最新的,这些部件可以造成重大安全隐患,你的页面因此被劫持。 +但是这篇文章不打算介绍注册域名和托管你的网站。要介绍的是_后续_的步骤,真正地制作网页。对于很多人来说,典型的选择是使用像 [WordPress][6] 那一类的软件。在大多数主机托管商上,只需一次点击即可安装,然后就会有海量的插件和主题可供选择。插件和主题的选择取决于你想要制作的网页的类型。但是 WordPress 不仅对于大部分网站来说有点过犹不及,还给了你一个有许多活动部件的动态页面。如果你没有保持这些部件最新,这些部件可能造成重大安全隐患,你的页面因此被劫持。 -替代方法是拥有一个静态网页,在服务端没有任何动态内容生成。原先的 HTML 和 CSS (或许还有点 Javascript 也挺好)。这选项不好的一面是以后你要亲自动手编写所有的代码。这是可行的,但你只是想要个地方来展示你的作品。你没必要知道底层网页设计的特性(和重要的但却令人头疼的跨浏览器兼容性)。 +替代方法是拥有一个静态网页,在服务端没有任何动态内容生成。只有一些原先的 HTML 和 CSS (或许还有点 Javascript 也挺好)。这种选择的不好的一面是以后你要亲自动手编写所有的代码。虽然可行,但你只是想要个地方来展示你的作品而已,你并不想知道底层网页设计的特性(和重要的但却令人头疼的跨浏览器兼容性)。 -使用静态页面生成器。你得到了静态 HTML 页面的速度与安全,但是是以有着接近于动态页面的便利性的工作流程完成的。在静态页面生成器世界的两大先驱是 [Hugo][7] 和 [Jekyll][8] ,(顺道说下,Paolo Bonzini 的文章 《[getting started with Jekyll][9]》 写得不错)但是哪一个才是你的正确选择?希望阅读完这篇文章,你将会有个更好的想法。我们将基于易上手性、主题可用性、编辑方式和拓展性这几点评估这两个静态页面生成器。 +使用静态页面生成器。你得到了静态 HTML 页面的速度与安全,但是是以有着接近于动态页面的便利性的工作流程完成的。在静态页面生成器世界的两大先驱是 [Hugo][7] 和 [Jekyll][8] ,(顺道说下,Paolo Bonzini 的文章 《[Jekyll 起步][9]》 写得不错)但是哪一个才是你的正确选择?希望阅读完这篇文章,你会更加了解。我们将基于易上手性、主题可用性、编辑方式和拓展性这几点评估这两个静态页面生成器。 ### 开始 公平地提醒一下,这两个都需要你在命令行下使用他们。大部分命令都很直接和易于记忆,但是让我们相应地调整下我们的期望吧,这不是点击几下鼠标就能做事的界面。 -Jekyll 和 Hugo 的安装都相当的简单。 Jekyll 以 RubyGem 的方式安装,Hugo 提供了一个方便的多用途二进制文件让你迅速上手。因为简单的安装包,Hugo 微弱领先。虽然 Jekyll 的 RubyGems 安装方式本身就很简单,但是它_确实_需要你已经在你的电脑上正确安装并且配置好 Ruby 环境。除了社区设计者和网页开发者,大部分的使用者并没有提前安装好。 +Jekyll 和 Hugo 的安装都相当的简单。 Jekyll 以 RubyGem 的方式安装,Hugo 提供了一个方便的集成的二进制文件让你迅速上手。因为安装包单一,Hugo 以微弱优势领先。虽然 Jekyll 的 RubyGems 安装方式本身就很简单,但是它_确实_需要你已经在你的电脑上正确安装并且配置好 Ruby 环境。除了社区设计者和网页开发者,大部分的使用者并没有提前安装好。 -虽说是这样,但是一旦安装好,Hugo 和 Jekyll 都很好用。它们都有良好的文档和快速开始文档。你用一个简单命令新建一个页面(在 Jekyll 里是 ** jekyll new ** ,在 Hugo 里是 ** hugo new site ** 译者注: 指代你网页的名称)。这一步新建了一个通用目录结构和你网站的大致内容。目录结构和基本的配置都十分相似。Jekyll 使用一个**_config.yml** 文件,Hugo 使用**config.toml**(虽然你_能_在 Hugo 的配置里使用 YMAL 或者 JSON 语法,如果觉得其中一个使用起来更舒服的话)。每个内容文件的前置配置(front matter)元数据使用相同的配置语法。然后,所有的内容都是用 Markdown 写的。 +虽说是这样,但是一旦安装好,Hugo 和 Jekyll 都很好用。它们都有良好的文档和快速开始指南。你用一个简单命令新建一个页面(在 Jekyll 里是 `jekyll new ` ,在 Hugo 里是 `hugo new site `,译者注:`` 指代你网页的名称)。这一步新建了一个通用目录结构和你网站的大致内容。目录结构和基本的配置都十分相似。Jekyll 使用一个 `_config.yml` 文件,Hugo 使用 `config.toml`(虽然你_能_在 Hugo 的配置里使用 YMAL 或者 JSON 语法,如果觉得其中一个使用起来更舒服的话)。每个内容文件的前置配置(front matter)元数据使用相同的配置语法。然后,所有的内容都是用 Markdown 写的。 -我想说就帮助你开始第一个静态网页这一点来说,Jekyll 稍微领先于 Hugo ,因为它能以一些基本的内容和一个默认主题开始着手使用。当在建设网页时,你能使用这些内容作为一个样板。Hugo 没有样例内容,甚至没有一个默认主题。这就是说,样例内容和默认主题是我在用任何工具建设网站时第一个删除的内容,因此Hugo 事实上帮我节省了这一步。 +我想说就帮助你开始第一个静态网页这一点来说,Jekyll 稍微领先于 Hugo ,因为它能以一些基本的内容和一个默认主题开始着手使用。当在建设网页时,你能使用这些内容作为一个样板。Hugo 没有样例内容,甚至没有一个默认主题。即便如此,样例内容和默认主题是我在用任何工具建设网站时第一个删除的内容,因此 Hugo 事实上帮我节省了这一步。 ### 主题 正如我所提到的,Hugo 根本没有默认主题,所以主题可能是你打算最先设置的。Jekyll 有一个得体的默认主题,虽然它只是个骨架。你或许也会想去为你的 Jekyll 页面找一个主题。 -Hugo 和 Jekyll 都有多种多样的各类主题,网页样式从单页面的主题到带博客发布评论的完善多页面主题都有,一应俱全。尽管如此,想找到满足你需求的主题事实上并不简单。无论使用哪个,主题网站——Hugo 的 [themes.gohugo.io][10] 和 Jekyll 的 [jekyllthemes.org][11] ,基本上都是一个充满主题截图的巨大网站。一旦你点击主题,你能得到关于主题的一些十分详细的信息,但是初始搜索相当困难。Hugo 的主题站有一些基本的标签分类,但是大体上在我看来,主题搜索和展示都是这两个项目需要继续努力的。 +Hugo 和 Jekyll 都有多种多样的各类主题,网页样式从单页面的主题到带有博客和评论的完善的多页面主题都有,一应俱全。尽管如此,想找到满足你需求的主题事实上并不简单。无论使用哪个,主题网站——Hugo 的 [themes.gohugo.io][10] 和 Jekyll 的 [jekyllthemes.org][11] ,基本上都是一个充满主题截图的巨大页面。一旦你点击主题,你能得到关于该主题的一些十分详细的信息,但是对于初步搜索相当困难。Hugo 的主题站有一些基本的标签分类,但是大体上在我看来,主题搜索和展示都是这两个项目需要继续努力的。 -主题管理也是一个有趣的主题。在两个项目中,几乎每一个主题是一个 Git 仓库(经常是托管在 Github 上),你需要克隆(clone)下来到你的网页建设地。在 Jekyll 里,有使用 RubyGems 的**bundle** 的额外一步来确保主题是由网站管理的。大部分主题都有一个 **Gemfile**,使得这一步骤轻松不少。如果主题没有一个**Gemfile**,添加也相当简单。在 Hugo 里没有捆绑这一操作,只要在**config.toml** 指向你的主题即可。 +主题管理也是一个有趣的主题。在两个项目中,几乎每一个主题都是一个 Git 仓库(经常是托管在 Github 上),你需要克隆(clone)下来到你的网页建设地。在 Jekyll 里,有额外的使用 RubyGems 的 bundle 的步骤来确保主题是由网站管理的。大部分主题都有一个 Gemfile,使得这一步骤轻松不少。如果主题没有一个 Gemfile,添加也相当简单。在 Hugo 里没有捆绑这一操作,只要在 `config.toml` 指向你的主题即可。 -我发现我偏爱 Hugo 的主题处理。你克隆(clone)(或者新建)主题到它们自己的**themes** 子文件夹里。这不仅使得当你开始时能轻松地切换主题,而且也能让你用自己的文件重写主题里的任何组件。这意味着你能根据自己的品味自定义主题,不用混合太多的原始主题,使得这主题对于其他人也是通用的。当然如果有一个你觉得其他用户会觉得值得的改变,你仍然可以编辑源文件,提交一个PR( pull request) 给主题维护者。 +我发现我偏爱 Hugo 的主题处理。你可以克隆(clone)(或者新建)主题到 `themes` 里它们自己的子文件夹里。这不仅使得当你开始时能轻松地切换主题,而且也能让你用自己的文件替换主题里的任何组件。这意味着你能根据自己的品味自定义主题,而不用弄乱原始主题,使得这主题也可以通用于其他人。当然如果有一个你觉得其他用户会觉得值得的改变,你仍然可以编辑源文件,提交一个 PR(拉取请求,pull request)给主题维护者。 ### 工作流程 -一旦你设置好初始的配置,Jekyll 和 Hugo 的网站建设流程都很相似。两者都有一个实时的 **serve** 命令,能在你的电脑上运行一个小型、轻量网页服务器,所以你能在在本地测试你的网站而不用上传到哪里。很棒的是无论你是运行着**jekyll serve** 还是**hugo serve**,都默认配置为当你工作时,监视任何你对网站的所有修改。当你在浏览器里看本地版的网站时,它会根据你的修改自动更新,不管你改的是内容、配置、主题、还仅仅是一张图片。这确实很方便和节约时间。 +一旦你设置好初始的配置,Jekyll 和 Hugo 的网站建设流程都很相似。两者都有一个实时的 `serve` 命令,能在你的电脑上运行一个小型、轻量级的网页服务器,所以你能在在本地测试你的网站而不用上传到哪里。很棒的是无论你是运行着 `jekyll serve` 还是 `hugo serve`,都默认配置为当你为之开发时,监视你对网站的任何修改。当你在浏览器里看本地版的网站时,它会根据你的修改自动更新,不管你改的是内容、配置、主题、还仅仅是一张图片。这确实很方便和节约时间。 -在两个系统中都是用 [Markdown][12] 写你的网站内容。如果碰巧你不熟悉 Markdown,(我来解释下)它是种很简单的纯文本编写方式,还能有一些很好用的格式化符号。它很容易使用而且可阅读。而且因为是纯文本,你的内容(其实是你的网站)很容易控制版本。这是我最近写几乎所有东西的主要方式。 +在两个系统中都是用 [Markdown][12] 写你的网站内容。如果碰巧你不熟悉 Markdown,(我来解释下,)它是种很简单的纯文本编写方式,还能有一些很好用的格式化符号。它很容易使用而且可阅读。而且因为是纯文本,你的内容(其实是你的网站)很容易进行版本控制。这是我最近写几乎所有东西的主要方式。 -新内容能通过在正确的地方手动创建文件添加到网站里。新文件只需要是有恰当前置配置(front matter)元数据的Markdown 文件即可。至于配置文件,Jekyll对于前置配置使用 YAML 语法,Hugo 接受 TOML、YAML或者JSON(默认是TOML)。新文件需要放置在正确的文件夹内。在 Jekyll 里你需要把你编写中的文件和完成了的内容页分别放在 **_drafts** 和 **_posts** 目录中。在 Hugo 中只有单独一个 **content** 目录。你根据文件的前置配置判断这是否是一个草稿。 +新内容能通过在正确的地方手动创建文件添加到网站里。新的文件只需要是有恰当的前置配置(front matter)元数据的 Markdown 文件即可。至于配置文件,Jekyll 对于前置配置使用 YAML 语法,Hugo 接受 TOML、YAML 或者 JSON(默认是 TOML)。新文件需要放置在正确的文件夹内,在 Jekyll 里你需要把你编写中的文件和已经完成了的内容页分别放在 `_drafts` 和 `_posts` 目录中。在 Hugo 中只有单独一个 `content` 目录。你可以根据文件的前置配置判断这是否是一个草稿。 -现在,虽然可以手动完成所有这些事情,但是 Hugo 提供了一些方便的函数确保你的新文件创建在正确的文件里,那些文件也用恰当的前置配置预先配置好了。 -简单地在终端中进入你网站的目录,输入 **hugo new content/** , **** 代表着你想新建的新页面。你甚至设置些包含为不同页面自定义的前置配置、叫** 原型 **的模版(例如在你的网页上同时有博客和播客)。 +现在,虽然可以手动完成所有这些事情,但是 Hugo 提供了一些方便的功能确保你的新文件创建在正确的文件里,那些文件也用恰当的前置配置预先配置好了。简单地在终端中进入你网站的目录,输入 `hugo new content/` , `` 代表着你想新建的新页面。你甚至可以设置些包含为不同页面自定义的前置配置、叫**原型**的模版(例如在你的网页上同时有博客和播客)。 -当你的网页弄好后,你能关闭你的预览服务器和用一个命令来建立你网站的真正页面。在 Jekyll 里是**jekyll build**,Hugo 就仅仅是 **hugo**,Jekyll 把完成好的页面放在 **_site** 的子目录中。然而 Hugo 把这些文件放在名为 **public** 的子目录中。不管哪种情况,一旦你这样做了,你就有一个完整的静态网站,你能上传并把它托管在几乎任何地方。 +当你的网页弄好后,你能关闭你的预览服务器,并用一个命令来建立你网站的真正页面。在 Jekyll 里是 `jekyll build`,Hugo 就仅仅是 `hugo`,Jekyll 把完成好的页面放在 `_site` 的子目录中。然而 Hugo 把这些文件放在名为 `public` 的子目录中。不管哪种情况,一旦你完成后,你就有了一个完整的静态网站,你能上传并把它托管在几乎任何地方。 ### 可拓展性 -Hugo 和 Jekyll 都能让你自定义你自己的网站上甚至最小的一个点。然而就可拓展性而言,现在 Jekyll 远远领先因其插件 API。因为这种插件结构,很容易为你 Jekyll 生成的网站添加功能,通过Jekyll 社区或者你自己写的相当短的代码片段就能完成。 +Hugo 和 Jekyll 都能让你自定义你自己的网站上哪怕最小的一个点。然而就可拓展性而言,现在 Jekyll 因其插件 API 而远远领先。因为这种插件结构,很容易为你用 Jekyll 生成的网站添加功能,通过 Jekyll 社区或者你自己写的相当短的代码片段就能完成。 Hugo 现在根本没有插件 API,所以添加功能有点难。希望以后支持编写并包含插件。但是现在看不出有人在做这一点。 @@ -61,15 +60,17 @@ Hugo 现在根本没有插件 API,所以添加功能有点难。希望以后 大体上讲,Hugo 和 Jekyll 十分相似。归根结底由你工作体验和你的网站需求决定。如果你已经设置好了 RubyGems 环境而且你需要插件的可拓展性,Jekyll 是你的选择。然而,如果你看重一个简单的工作流程,一个直接自定义网站的方式,那你首选 Hugo。 -我发现我更喜欢 Hugo 的方法,而且在建一个小型网站,我不需要任何插件。当然,每个人的需求都不同。你会为你的网站选择哪一个静态页面生成器? +我发现我更喜欢 Hugo 的方法,而且在建设一个小型网站,我不需要任何插件。当然,每个人的需求都不同。你会为你的网站选择哪一个静态页面生成器? + +(题图:opensource.com) -------------------------------------------------------------------------------- via: https://opensource.com/article/17/5/hugo-vs-jekyll -作者:[Jason van Gumster ][a] -译者:[译者ID](https://ypingcn.github.io/wiki/lctt) -校对:[校对者ID](https://github.com/校对者ID) +作者:[Jason van Gumster][a] +译者:[ypingcn](https://ypingcn.github.io/wiki/lctt) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 253ae1dc54d51b0f937df3a93d3e4a115f95cb5b Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 24 Jun 2017 10:53:43 +0800 Subject: [PATCH 0498/1407] PUB:20170518 Hugo vs. Jekyll Comparing the leading static website generators.md @ypingcn https://linux.cn/article-8633-1.html --- ... vs. Jekyll Comparing the leading static website generators.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md (100%) diff --git a/translated/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md b/published/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md similarity index 100% rename from translated/tech/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md rename to published/20170518 Hugo vs. Jekyll Comparing the leading static website generators.md From 8f2034554e6ee9f1c8c2f176583e756585ef448e Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 24 Jun 2017 16:29:16 +0800 Subject: [PATCH 0499/1407] PRF&PUB:26 - The history of Android.md @alim0x --- .../26 - The history of Android.md | 66 ++++++++----------- 1 file changed, 27 insertions(+), 39 deletions(-) rename {translated/talk => published}/The history of Android/26 - The history of Android.md (59%) diff --git a/translated/talk/The history of Android/26 - The history of Android.md b/published/The history of Android/26 - The history of Android.md similarity index 59% rename from translated/talk/The history of Android/26 - The history of Android.md rename to published/The history of Android/26 - The history of Android.md index 2abd7a9a70..6acb7e1048 100644 --- a/translated/talk/The history of Android/26 - The history of Android.md +++ b/published/The history of Android/26 - The history of Android.md @@ -1,79 +1,67 @@ -安卓编年史 +安卓编年史(25):Android 4.4,奇巧——更完美,更少的内存占用(2) ================================================================================ + ![新的“添加到主屏幕”界面无疑受到了蜂巢的启发。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/homesetupthrowback.png) -新的“添加到主屏幕”界面无疑受到了蜂巢的启发。 -Ron Amadeo 供图 + +*新的“添加到主屏幕”界面无疑受到了蜂巢的启发。 +[Ron Amadeo 供图]* 奇巧的主屏幕配置界面漂亮地对蜂巢进行了复古。在有巨大的 10 英寸屏幕的蜂巢平板上(上方右侧图片),长按主屏背景会向你展现一个所有主屏幕的缩放视图。可以从下面的小部件抽屉里将它们拖放到任意主屏上——这很方便。在将蜂巢的界面带到手机上时,从安卓 4.0 直到 4.3,谷歌都跳过了这个设计,把它留给了大屏幕设备,在手机上长按后只显示一个选项列表(中间的图片)。 但在奇巧上,谷歌最终给出了解决方案。在长按后,4.4 呈现一个略微缩放的视图——你可以看到当前主屏以及它左右侧的屏幕。点击“小部件”按钮会打开一个小部件略缩图的完整列表,但是长按一个小部件后,你会回到缩放视图,并且你可以在主屏页面之间滚动,将图标放在你想要的位置。将图标或者小部件拖动过最右侧的主屏页面,你可以创建一个新的主屏页面。 ![联系人和去掉所有蓝色痕迹的键盘。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/RIP33B5E5.png) -联系人和去掉所有蓝色痕迹的键盘。 -Ron Amadeo 供图 -奇巧是电子风格设计的完结。在系统的大多数部分,剩下的蓝色高亮都被换成了灰色。在联系人应用中,头部和联系人列表字母分割线的蓝色都移除掉了。图片的位置换了一侧,底栏变成了浅灰色以和顶部相称。几乎将蓝色渗透进每个应用的键盘,现在是灰底灰色灰高亮。这可不是件坏事。应用应该允许有它们自己的配色方案——在键盘上强迫存在潜在的颜色冲突可不是个好设计。 +*联系人和去掉所有蓝色痕迹的键盘。 +[Ron Amadeo 供图]* + +奇巧是电子风格设计的完结。在系统的大多数地方,剩下的蓝色高亮都被换成了灰色。在联系人应用中,头部和联系人列表字母分割线的蓝色都移除掉了。图片的位置换了一侧,底栏变成了浅灰色以和顶部相称。几乎将蓝色渗透进每个应用的键盘,现在是灰底、灰色、灰高亮。这可不是件坏事。应用应该允许有它们自己的配色方案——在键盘上强迫存在潜在的颜色冲突可不是个好设计。 ![前三张是奇巧的拨号盘,最后一张是 4.3 的。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/phone.png) -前三张是奇巧的拨号盘,最后一张是 4.3 的。 -Ron Amadeo 供图 + +*前三张是奇巧的拨号盘,最后一张是 4.3 的。 +[Ron Amadeo 供图]* 谷歌完全重制了奇巧中的拨号,创造了一个疯狂的设计,改变了用户对手机的思考方式。实际上新版拨号中的数字都被尽可能地隐藏了——在首屏上甚至没有拨号盘。打电话的主要界面现在是个搜索栏!如果你想给你的联系人打电话,只要在搜索栏输入他的名字;如果你想给一个公司打电话,只要输入公司的名字,拨号会通过谷歌地图庞大的数据库找到号码。它工作得令人难以置信的好,这是只有谷歌才能完成的事情。 如果搜索不是你的菜的话,应用还会智能地显示通话记录列表,最常联系人,还有指向所有联系人的链接。底部的链接指向你的通话记录,传统的拨号盘,以及常规的更多操作按钮,包含一个设置页面。 ![Office 相关:新的内置应用 Google Drive,以及打印支持。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/googledrive-and-printing.png) -Office 相关:新的内置应用 Google Drive,以及打印支持。 -Ron Amadeo 供图 -在奇巧中 Google Drive 终于作为内置应用包含了进来,令人惊奇的是这居然用了这么长时间。Drive 允许用户创建和编辑 Google Docs 表格和文档,用相机扫描文档并作为 PDF 上传,或者查看(不能编辑)演示文稿。Drive 的设计十分现代,侧面拥有滑出式导航抽屉,并且是 Google Now 风格卡片式设计。 +*Office 相关:新的内置应用 Google Drive,以及打印支持。 +[Ron Amadeo 供图]* + +在奇巧中 Google Drive 终于作为内置应用包含了进来,令人惊奇的是这居然等了这么长时间。Drive 允许用户创建和编辑 Google Docs 表格和文档,用相机扫描文档并作为 PDF 上传,或者查看(不能编辑)演示文稿。Drive 的设计十分现代,侧面拥有滑出式导航抽屉,并且是 Google Now 风格卡片式设计。 为了有更多的移动办公乐趣,奇巧包含了系统级打印框架。在设置的底部有“打印”设置界面,任何打印机 OEM 厂商都可以为它写个插件。谷歌云打印自然是首批支持者之一。只要你的打印机和云打印相连接,无论是本地或通过一台装有 Chrome 浏览器的电脑,你都可以借助网络进行打印。应用同样也需要支持打印框架。点击 Google Drive 里的“i”按钮会显示文档信息,并且给你打印的选项。就像桌面系统那样,会弹出一个设置对话框,有打印份数,纸张尺寸,以及页面选择等选项。 ![Google+ 应用的“相片”部分,它取代了相册。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/that-is-one-dead-gallery.png) -Google+ 应用的“相片”部分,它取代了相册。 -Ron Amadeo 供图 + +*Google+ 应用的“相片”部分,它取代了相册。 +[Ron Amadeo 供图]* Google+ 相片和相册最初都在 Nexus 5 上随附,但在 Google Play 设备稍晚版本的奇巧上,相册被砍掉了,Google+ 完全接手了相片管理。新应用的主题从深色变成了浅色,Google+ 相片还带来了现代的导航抽屉设计。 -安卓一直以来都有即时上传功能,它会自动备份所有图片到谷歌的云存储,开始是 Picasa 后来是 Google+。G+ 相片相比相册最大的好处是它可以管理那些云端存储的图片。图片右下角的云图标指示备份状态,它会从右到左地填满来指示正在上传。G+ 相片带来了它自己的照片编辑器,还有许多其它的 Google+ 图片功能,比如高亮,自动美化,当然,还有分享到 Google+。 +安卓一直以来都有即时上传功能,它会自动备份所有图片到谷歌的云存储,开始是 Picasa 后来是 Google+。G+ 相片相比相册最大的好处是它可以管理那些云端存储的图片。图片右下角的云图标指示备份状态,它会从右到左地填满来指示上传状态。G+ 相片带来了它自己的照片编辑器,还有许多其它的 Google+ 图片功能,比如高亮,自动美化,当然,还有分享到 Google+。 ![时钟应用的调整,添加了一个闹钟页面并修改了时间输入框。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/clocks.png) -时钟应用的调整,添加了一个闹钟页面并修改了时间输入框。 -Ron Amadeo 供图 + +*时钟应用的调整,添加了一个闹钟页面并修改了时间输入框。 +[Ron Amadeo 供图]* 谷歌将 4.2 引入的优秀时间选择器换成了一个奇怪的时钟界面,操作起来比旧界面更慢了也更不精确了。首先是个可以选择小时的单指针时钟,然后显示的是另一个选择分钟的单指针时钟。选择的时候要转动分针或点击数字,这让用用户很难选择不是整五分钟的时间增量。不像之前的时间选择器需要选择一个时间段,这里默认时间段是 AM(重复一下,这样设置的时候容易不小心偏差 12 小时)。 -### 今日安卓无处不在 ### - -![](http://cdn.arstechnica.net/wp-content/uploads/2014/05/android-everywhere2.png) -图片来自 Google/Sony/Motorola/Ron Amadeo - -一开始从一家搜索引擎公司的古怪的黑莓复制品,一步一步到如今科技界巨头之一在世界上最流行的系统。安卓已经成为谷歌的实际消费者操作系统,它驱动着手机,平板,Google Glass,Google TV,甚至更多。[它的一部分][1]甚至还用到了 Chromecast 中。在未来,谷歌还会将 [Android Wear][2] 带到手表和可穿戴设备上,[开放汽车联盟][3] 要将安卓带到汽车上。不久后会谷歌再次承诺对客厅的计划,带上 [Android TV][4]。这个系统对谷歌是如此重要的支柱,原本应该覆盖全公司产品的大会活动,比如 Google I/O,俨然成为了安卓发布派对。 - -![上排:谷歌 Play 内容商店。下排:谷歌 Play 应用。](http://cdn.arstechnica.net/wp-content/uploads/2014/03/2014-03-30-03.08.jpg) -上排:谷歌 Play 内容商店。下排:谷歌 Play 应用。 -Ron Amadeo 供图 - -移动产业曾经的的丑小鸭脱胎换骨,它的用户界面还[赢得了设计奖项][5]。像 Google Now 一样的设计风格影响了整个公司的产品,甚至连像搜索,Google+,Youtube,以及地图这样的桌面站点都加入了卡片式设计中。设计也在不断地演进。谷歌下一步[统一设计][6]的计划不仅是面对安卓,也包括了所有的产品。谷歌的目标是让你不管在安卓,还是桌面浏览器,或是一个手表上,使用像 Gmail 这样的服务时都能有一样的体验。 - -谷歌将很多安卓的组件转移到 Play 商店,这样版本发布就越来越不重要了。谷歌决定了解决运营商和 OEM 厂商更新问题的最佳途径,就是完全绕开这些绊脚石。从这里开始,在一个安卓更新里除了核心底层变动外就没什么内容了——但是更多的 API 被加入了谷歌 Play 服务。如果你只看版本更新的话,相对安卓高峰期 2.5 个月的发布周期来说开发已经放缓了。但实际情况是谷歌现在可以持续将改进推送到 Play 商店,从周期发布变成了永无止境,有些微妙的更新流。 - -每天 150 万台设备激活,安卓除了增长就是增长。在未来,安卓会是手机和平板到汽车和手表的领军者,奇巧更低的系统配置要求也会让发展中国家的手机价格更低。结果呢?越来越多的人会来到线上。对那里的大多数人来说,安卓不止是他们的手机,也是他们首要的计算设备。随着安卓为谷歌领导掌管众多领域,从一个小收购而来的系统逐渐成长为了谷歌最重要的产品。 - ---------- -![Ron Amadeo](http://cdn.arstechnica.net/wp-content//uploads/authors/ron-amadeo-sq.jpg) +![Ron Amadeo](https://cdn.arstechnica.net/wp-content/uploads/2016/05/r.amadeo-45843.jpg) -[Ron Amadeo][a] / Ron是Ars Technica的评论编缉,专注于安卓系统和谷歌产品。他总是在追寻新鲜事物,还喜欢拆解事物看看它们到底是怎么运作的。 - -[@RonAmadeo][t] +[Ron Amadeo][a] / Ron 是 Ars Technica 的评论编缉,专注于安卓系统和谷歌产品。他总是在追寻新鲜事物,还喜欢拆解事物看看它们到底是怎么运作的。[@RonAmadeo][t] -------------------------------------------------------------------------------- -via: http://arstechnica.com/gadgets/2014/06/building-android-a-40000-word-history-of-googles-mobile-os/26/ +via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/26/ -译者:[alim0x](https://github.com/alim0x) 校对:[校对者ID](https://github.com/校对者ID) +译者:[alim0x](https://github.com/alim0x) 校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](http://linux.cn/) 荣誉推出 From 465667c284d79ce806c9038e5115969f8c9cf7c7 Mon Sep 17 00:00:00 2001 From: chenxinlong <237448382@qq.com> Date: Sat, 24 Jun 2017 18:56:26 +0800 Subject: [PATCH 0500/1407] add content --- ...introduction to Linux s EXT4 filesystem.md | 40 +++++++++---------- 1 file changed, 20 insertions(+), 20 deletions(-) diff --git a/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md b/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md index 2f56c1ad7c..850c109e7e 100644 --- a/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md +++ b/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md @@ -160,55 +160,55 @@ EXT 文件系统实现了数据分配策略以确保产生最少的文件碎片 [EXT3 文件系统][25] 具有克服 **fsck** 程序需要完全恢复在文件更新操作期间发生的不正确关机损坏的磁盘结构所需的大量时间的单一目标。EXT 文件系统的唯一新增是 [日志][26],它将提前记录将对文件系统执行的更改。 磁盘结构的其余部分与 EXT2 中的相同。 -作为一个先前的版本,除了直接写入数据到磁盘的数据区域外,EXT3 的日志在写入元数据时同时也写入文件数据到磁盘上的一个指定数据区域。一旦这些数据安全地到达硬盘,它就可以几乎零丢失率地被合并或者被追加到目标文件。当这些数据被提交到磁盘上的数据区域上,这些日志就会随即更新,这样在系统发生故障之前,文件系统将保持一致状态,才能提交日志中的所有数据。在下次启动时,将检查文件系统的不一致性,然后将日志中保留的数据提交到磁盘的数据区,以完成对目标文件的更新。 +作为一个先前的版本,除了直接写入数据到磁盘的数据区域外,EXT3 的日志在写入元数据时同时会也写入文件数据到磁盘上的一个指定数据区域。一旦这些数据安全地到达硬盘,它就可以几乎零丢失率地被合并或者被追加到目标文件。当这些数据被提交到磁盘上的数据区域上,这些日志就会随即更新,这样在系统发生故障之前,文件系统将保持一致状态,才能提交日志中的所有数据。在下次启动时,将检查文件系统的不一致性,然后将日志中保留的数据提交到磁盘的数据区,以完成对目标文件的更新。 -Journaling does reduce data-write performance, however there are three options available for the journal that allow the user to choose between performance and data integrity and safety. My personal preference is on the side of safety because my environments do not require heavy disk-write activity. +日记功能确实降低了数据写入性能,但是有三个可用于日志的选项,允许用户在性能和数据完整性和安全性之间进行选择。 我的个人更偏向于选择安全性,因为我的环境不需要大量的磁盘写入活动。 -The journaling function reduces the time required to check the hard drive for inconsistencies after a failure from hours (or even days) to mere minutes, at the most. I have had many issues over the years that have crashed my systems. The details could fill another article, but suffice it to say that most were self-inflicted, like kicking out a power plug. Fortunately, the EXT journaling filesystems have reduced that bootup recovery time to two or three minutes. In addition, I have never had a problem with lost data since I started using EXT3 with journaling. +日志功能减少了在从几小时(甚至几天)到几分钟之间的失败后检查硬盘驱动器所需的时间。 多年来,我遇到了很多问题导致了我的系统崩溃。 要详细说的话恐怕还得再写一篇文章,但这足以说明大多数是我自己造成的,就比如不小心踢掉一个电源插头。 幸运的是,EXT日志文件系统将启动恢复时间缩短到两三分钟。 此外,自从我开始使用带日志记录的EXT3,我从来没有遇到丢失数据的问题。 -The journaling feature of EXT3 can be turned off and it then functions as an EXT2 filesystem. The journal itself still exists, empty and unused. Simply remount the partition with the mount command using the type parameter to specify EXT2\. You may be able to do this from the command line, depending upon which filesystem you are working with, but you can change the type specifier in the **/etc/fstab** file and then reboot. I strongly recommend against mounting an EXT3 filesystem as EXT2 because of the additional potential for lost data and extended recovery times. +EXT3 的日志功能可以关闭,然后作为 EXT2 文件系统。 该日志本身仍然是存在的,只是状态为空且未使用。 只需使用类型参数使用 mount 命令来 remount 到分区即可指定EXT2 \。 你可以从命令行执行此操作,但是具体还是取决于你正在使用的文件系统,但你可以更改 **/ etc / fstab** 文件中的类型说明符,然后重新启动。 我强烈建议不要将 EXT3文件系统安装为 EXT2 ,因为这会具有丢失数据和增加恢复时间的潜在可能性。 -An existing EXT2 filesystem can be upgraded to EXT3 with the addition of a journal using the following command. +EXT2 文件系统可以使用如下命令来通过日志升级到 EXT3 。 ``` tune2fs -j /dev/sda1 ``` -Where **/dev/sda1** is the drive and partition identifier. Be sure to change the file type specifier in **/etc/fstab** and remount the partition or reboot the system to have the change take effect. + **/dev/sda1** 表示驱动和分区的标识符。同时要注意修改 **/etc/fstab** 中的文件类型标识符并 remount 分区或者重启系统以确保修改生效。 ### EXT4 -The [EXT4 filesystem][27] primarily improves performance, reliability, and capacity. To improve reliability, metadata and journal checksums were added. To meet various mission-critical requirements, the filesystem timestamps were improved with the addition of intervals down to nanoseconds. The addition of two high-order bits in the timestamp field defers the [Year 2038 problem][28] until 2446—for EXT4 filesystems, at least. +[EXT4 filesystem][27]主要提高了性能、可靠性和容量。位了提高可靠性,它新增了元数据和日志校验和。同时位了满足各种关键任务要求,文件系统新增了纳秒级别的时间戳。在时间戳字段中添加两个高位来延迟时间戳的 [2038 年的问题][28] ,在 EXT4 文件系统至少可达到 2446 年。 -In EXT4, data allocation was changed from fixed blocks to extents. An extent is described by its starting and ending place on the hard drive. This makes it possible to describe very long, physically contiguous files in a single inode pointer entry, which can significantly reduce the number of pointers required to describe the location of all the data in larger files. Other allocation strategies have been implemented in EXT4 to further reduce fragmentation. +在 EXT4 中,数据分配从固定块更改为盘区,盘区由硬盘驱动器上的开始和结束位置来描述。这使得可以在单个 inode 指针条目中描述非常长的物理连续的文件,这可以显着减少描述大文件中所有数据的位置所需的指针数。 EXT4 中已经实施了其他分配策略,以进一步减少碎片化。 -EXT4 reduces fragmentation by scattering newly created files across the disk so that they are not bunched up in one location at the beginning of the disk, as many early PC filesystems did. The file-allocation algorithms attempt to spread the files as evenly as possible among the cylinder groups and, when fragmentation is necessary, to keep the discontinuous file extents as close as possible to others in the same file to minimize head seek and rotational latency as much as possible. Additional strategies are used to pre-allocate extra disk space when a new file is created or when an existing file is extended. This helps to ensure that extending the file will not automatically result in its becoming fragmented. New files are never allocated immediately after existing files, which also prevents fragmentation of the existing files. +EXT4 通过将新创建的文件分散在磁盘上,从而使其不会全部聚集在磁盘起始位置,就像早期的PC文件系统一样,减少了碎片。文件分配算法尝试在柱面组中尽可能均匀地扩展文件,并且当需要分段时,要使不连续文件扩展区尽可能靠近同一文件中的其他文件,以尽可能减少头部搜索和旋转等待时间尽可能的当创建新文件或扩展现有文件时,使用其他策略来预分配额外的磁盘空间。这有助于确保扩展文件不会自动导致其分段。新文件不会在现有文件之后立即分配,这也可以防止现有文件的碎片化。 -Aside from the actual location of the data on the disk, EXT4 uses functional strategies, such as delayed allocation, to allow the filesystem to collect all the data being written to the disk before allocating space to it. This can improve the likelihood that the data space will be contiguous. +除了磁盘上数据的实际位置外,EXT4 使用诸如延迟分配的功能策略,以允许文件系统在分配空间之前收集正在写入磁盘的所有数据。这可以提高数据空间将是连续的可能性。 -Older EXT filesystems, such as EXT2 and EXT3, can be mounted as EXT4 to make some minor performance gains. Unfortunately, this requires turning off some of the important new features of EXT4, so I recommend against this. +较旧的EXT文件系统(如 EXT2 和 EXT3)可以作为 EXT4 进行 mount ,以使其性能获得较小的提升。不幸的是,这需要关闭 EXT4 的一些重要的新功能,所以我建议不要这样做。 -EXT4 has been the default filesystem for Fedora since Fedora 14\. An EXT3 filesystem can be upgraded to EXT4 using the [procedure ][29]described in the Fedora documentation, however its performance will still suffer due to residual EXT3 metadata structures. The best method for upgrading to EXT4 from EXT3 is to back up all the data on the target filesystem partition, use the **mkfs** command to write an empty EXT4 filesystem to the partition, and then restore all the data from the backup. +自 Fedora 14 以来,EXT4 一直是 Fedora 的默认文件系统。我们可以使用 Fedora 文档中描述的 [procedure ][29] 将EXT3文件系统升级到EXT4,但是由于之前仍然存留d的 EXT3 元数据结构,它的性能仍将受到影响。从 EXT3 升级到 EXT4 的最佳方法是备份目标文件系统分区上的所有数据,使用 **mkfs** 命令将空EXT4文件系统写入分区,然后从备份中恢复所有数据。 ### Inode -The inode, described previously, is a key component of the metadata in EXT filesystems. Figure 2 shows the relationship between the inode and the data stored on the hard drive. This diagram is the directory and inode for a single file which, in this case, may be highly fragmented. The EXT filesystems work actively to reduce fragmentation, so it is very unlikely you will ever see a file with this many indirect data blocks or extents. In fact, as you will see below, fragmentation is extremely low in EXT filesystems, so most inodes will use only one or two direct data pointers and none of the indirect pointers. +以前描述的 inode 是EXT文件系统中的元数据的关键组件。 图 2 显示了 inode 和存储在硬盘驱动器上的数据之间的关系。 该图是单个文件的目录和 inode,在这种情况下,可能会产生高度碎片。 EXT 文件系统可以积极地减少碎片,所以不太可能会看到有这么多间接数据块或扩展盘的文件。 实际上,如下所示,EXT文件系统中的碎片非常低,所以大多数 inode 只使用一个或两个直接数据指针,也不使用间接指针。 ![inodesanddataallocation-01_0.png](https://opensource.com/sites/default/files/images/life-uploads/inodesanddataallocation-01_0.png) -Figure 2: The inode stores information about each file and enables the EXT filesystem to locate all data belonging to it. +图 2 :inode 存储有关每个文件的信息,并使 EXT 文件系统能够查找属于它的所有数据。 -The inode does not contain the name of the file. Access to a file is via the directory entry, which itself is the name of the file and contains a pointer to the inode. The value of that pointer is the inode number. Each inode in a filesystem has a unique ID number, but inodes in other filesystems on the same computer (and even the same hard drive) can have the same inode number. This has implications for [links][30], and this discussion is beyond the scope of this article. +inode 不包含文件的名称。通过目录条目访问文件,目录条目本身是文件的名称,并包含指向 inode 的指针。该指针的值是 inode 号。文件系统中的每个 inode 都具有唯一的 ID 号,但同一台计算机上的其他文件系统(甚至相同的硬盘驱动器)中的 inode 可以具有相同的 inode 号。这对[links][30] 存在影响,但是这个讨论超出了本文的范围。 -The inode contains the metadata about the file, including its type and permissions as well as its size. The inode also contains space for 15 pointers that describe the location and length of data blocks or extents in the data portion of the cylinder group. Twelve of the pointers provide direct access to the data extents and should be sufficient to handle most files. However, for files that have significant fragmentation, it becomes necessary to have some additional capabilities in the form of indirect nodes. Technically these are not really inodes, so I use the term "node" here for convenience. +inod e包含有关该文件的元数据,包括其类型和权限以及其大小。 inode 还包含 15 个指针的空格,用于描述柱面组数据部分中数据块或扩展区的位置和长度。十二个指针提供对数据扩展区的直接访问,并且应该足以处理大多数文件。然而,对于具有重大分段的文件,有必要以间接节点的形式具有一些附加功能。从技术上讲,这些不是真正的节点,所以我在这里使用这个术语“节点”来方便。 -An indirect node is a normal data block in the filesystem that is used only for describing data and not for storage of metadata, thus more than 15 entries can be supported. For example, a block size of 4K can support 512 4-byte indirect nodes, allowing **12 (direct) + 512 (indirect) = 524** extents for a single file. Double and triple indirect node support is also supported, but most of us are unlikely to encounter files requiring that many extents. +间接节点是文件系统中的正常数据块,它仅用于描述数据而不用于存储元数据,因此可以支持超过 15 个条目。例如,4K 的块大小可以支持 512 个 4 字节间接节点,允许单个文件的 **12(直接)+ 512(间接)= 524** 范围。还支持双重和三重间接节点支持,但我们大多数人不太可能遇到需要许多扩展的文件。 -### Data fragmentation +### 数据碎片 -For many older PC filesystems, such as FAT (and all its variants) and NTFS, fragmentation has been a significant problem resulting in degraded disk performance. Defragmentation became an industry in itself with different brands of defragmentation software that ranged from very effective to only marginally so. +对于许多较旧的 PC 文件系统,如 FAT(及其所有变体)和 NTFS,碎片一直是导致磁盘性能下降的重大问题。 碎片整理对于其本身和一些专门的整理软件来说已经称为了一项专门的工程,其效果范围从非常有效到仅仅是微乎其微。 -Linux's extended filesystems use data-allocation strategies that help to minimize fragmentation of files on the hard drive and reduce the effects of fragmentation when it does occur. You can use the **fsck** command on EXT filesystems to check the total filesystem fragmentation. The following example checks the home directory of my main workstation, which was only 1.5% fragmented. Be sure to use the **-n** parameter, because it prevents **fsck** from taking any action on the scanned filesystem. +Linux 的扩展文件系统使用数据分配策略,有助于最小化硬盘驱动器上的文件碎片,并在发生碎片时减少碎片的影响。 你可以使用 EXT 文件系统上的 **fsck** 命令检查文件系统的整体碎片。 以下示例检查主工作站的主目录,只有 1.5% 的碎片。 确保使用 **- n** 参数,因为它会阻止 **fsck** 对扫描文件系统采取的任何操作。 ``` fsck -fn /dev/mapper/vg_01-home From 5caa9f505de87fc2929cb2d0287c2408062677a3 Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 24 Jun 2017 21:55:54 +0800 Subject: [PATCH 0501/1407] PUB:20170314 One Year Using Go.md @geekpi --- published/20170314 One Year Using Go.md | 110 ++++++++++++++++++ translated/talk/20170314 One Year Using Go.md | 110 ------------------ 2 files changed, 110 insertions(+), 110 deletions(-) create mode 100644 published/20170314 One Year Using Go.md delete mode 100644 translated/talk/20170314 One Year Using Go.md diff --git a/published/20170314 One Year Using Go.md b/published/20170314 One Year Using Go.md new file mode 100644 index 0000000000..6ddebb7f76 --- /dev/null +++ b/published/20170314 One Year Using Go.md @@ -0,0 +1,110 @@ +使用 Go 一年的体验 +============================================================ + +![](https://bugfender.com/wp-content/uploads/2017/03/one-year-using-go-social-1.jpg) + +我们公司 [Mobile Jazz][6] 从一个内部试验性项目开始使用 [Go][5]。如公司名暗示的那样,我们是开发移动应用的。 + +在发布一个应用给公众后,我们很快意识到我们缺失一个工具来检查用户实际发生的情况以及他们是如何与应用交互的 - 如果有任何问题或者 bug 的报告,这将会相当方便。 + +现在有几款工具声称能在这个方面帮助开发者,但是没有一个能完全满足要求,因此我们决定自己构建一个。我们开始创建一组基础的脚本,如今它很快进化成了完整的工具,称为 [Bugfender][7]! + +由于这最初是一个实验,我们决定使用一种新的趋势技术。对学习以及持续教育的热爱是 Mobile Jazz 的核心价值的之一,因此我们决定使用 Go 构建。这是一个由 Google 开发的相对较新的编程语言。它是编程世界的的新玩家,已经有许多受尊敬的开发者对它赞不绝口。 + +一年后,这个实验变成了一个初创项目,我们拥有了一个已经帮助了来自全世界的数以千计的开发者的令人难以置信的工具。我们的服务器每天处理来自 700 万台设备的超过 200GB 的数据。 + +在使用 Go 一年之后,我们想要分享我们将一个小小的实验变成处理百万日志的生产服务器的一些想法和经验。 + +### Go 生态系统 + +公司中没有人有使用 Go 的经验。Bugfender 是我们第一次深入这个语言。 + +学习基本上相当直接的。我们之前在 C/C++/Java/Objective-C/PHP 的经验让我们学习 Go 相当快,并且在几天内就开始开发了。当然会有一些新的和不常见的东西需要学习,包括 GOPATH 还有如何处理包,但这在我们的预期之内。 + +几天之内,我们意识到即使是一个以简化为设计目的的语言,Go 也是非常强大的。它能够做任何现代编程语言应该能做的事:能够处理 JSON、服务器之间通讯甚至访问数据库也没问题(并且只需要几行代码)。 + +在构建一个服务器时,你应该首先决定是否使用任何第三方库或者框架。对于 Bugfender,我们决定使用: + +#### Martini + +[Martini][8] 是一个强大的 Go 的 web 框架。我们开始这个实验时,它是一个很棒的解决方案,至今也是,我们还没遇到任何问题。然而如果我们今天再次开始这个实验的话,我们会选择一个不同的框架,因为 Martini 不在维护了。 + +我们还试验了 [Iris][9](我们目前的最爱)还有 [Gin][10]。Gin 是 Martini 继任者,并且迁移到这上能让我们重用已有的代码。 + +在过去的一年中,我们意识到 Go 的标准库是非常强大的,你不必依靠一个臃肿的 web 框架来构建一个服务器。最好在特定任务上使用专门的高性能库。 + +~~Iris 是我们目前最喜欢的,并且将来我们将使用它重写服务来替代 Martini/Gin,但这目前并不是优先的。~~ + +**修改:** 在讨论了 Iris 的各个方面之后,我们意识到 Iris 或许不是最好的选择。如果我们决定重写我们的 web 组件,我们或许会研究其他的选择,我们欢迎你的建议。 + +#### Gorm + +有些人喜欢 ORM,而有些人则不喜欢。我们决定使用 ORM,更确切地说是 [GORM][11]。我们的实现只针对 web 前端,对于日志提取 API 仍然继续使用手工优化的 SQL。在一开始,我们确实很喜欢它,但是随着时间的推移,我们开始发现问题,并且我们很快将它从代码中完全移除,并且使用 [sqlx][12] 这个标准 SQL 库。 + +GORM 的一个主要问题是 Go 的生态系统。作为一个新语言,自我们开始开发产品以来 Go 已经有很多新版本。在这些新版本中的一些改变并不向后兼容,因此要使用最新的库版本,我们要经常重写已有代码并检查我们为解决版本问题所做的 hack。 + +上述这两个库是大多数 web 服务的主要组件,因此做一个好的选择很重要,因为将来更改会很困难,并且会影响你服务器的性能。 + +### 第三方服务 + +在创建一个实际使用的产品的另外一个重要方面是考虑库、第三方服务和工具的可用性。在这方面,Go 还缺乏成熟度,大多数公司还没有提供 Go 库,因此你或许需要依赖其他人写的不能一直保证质量的库。 + +比如,对于使用 [Redis][13] 和 [ElasticSearch][14] 有很好的库,但是对于其他服务比如 Mixpanel 或者 Stripe 还没有好的。 + +我们建议在使用 Go 之前事先检查对于你需要的产品是否有好的库可用。 + +我们在 Go 的包管理系统上也遇到了很多问题。它处理版本的方式远没有达到最好,并且在过去的一年中,我们在不同的团队成员之间使用同一个库的不同版本上遇到了很多问题。然而,最近要归功于 Go 新支持的 vendor 包特性,除了 [gopkg.in][15] 服务外,这个问题基本被解决了。 + +### 开发者工具 + +![](https://bugfender.com/wp-content/uploads/2017/03/go-ide.jpg) + +由于 Go 是一门相对新的语言,你或许发现相比其他成熟的语言像 Java,它可用的开发工具并不很好。当我们开始 Bugfender 时,使用任何 IDE 都很困难,似乎没有 IDE 支持 Go。但是在过去的一年中,随着 [IntelliJ][16] 和 [Visual Studio Code Go][17] 插件的引入,这一切改善了很多。 + +最后看下其他的 Go 工具,调试器并不很好,而分析器甚至更糟,因此有时调试你的代码或者尝试优化它会很困难。 + +### 前往生产 + +这确实是 Go 最好的东西之一,如果你想要部署一些东西到生产环境中,你只需要构建你的二进制并发送到服务器中,没有依赖,不需要安装额外的软件,你只需要能在服务器中运行二进制文件就行。 + +如果你习惯于处理那些需要包管理器或者需要小心你使用的语言解释器的语言,用 Go 工作会感到很高兴。 + +我们对 Go 的稳定性也很满意,因为服务器似乎从没有崩溃过。我们在发送大量数据给 Go Routines 时遇到过一个问题,但是我们几乎没见到任何崩溃。注意:如果你需要发送大量数据给 Go Routine,你需要小心堆溢出。 + +如果你对性能感兴趣,我们没法与其他语言相比较,因为我们从零开始使用 Go,但是对于我们处理的数据量,我们感觉性能是非常好的,我们绝对不能如此轻松地使用 PHP 处理同等数量的请求。 + +### 总结 + +在过去的一年中,我们对 Go 的感觉起起伏伏。最初我们是兴奋的,但是在实验变成真实的产品后我们开始发现问题。我们几次考虑过用 Java 完全重写,但是目前为止,仍旧使用的是 Go,并且过去的一年中, Go 生态已经有了很大的提升,这简化了我们的工作。 + +如果你想要使用 Go 构建你的产品,你可以保证它可以工作,但是你确实需要小心一件事:可以雇佣的开发者。硅谷中只有很少的高级 Go 开发者,并且在其他地方寻找也是一件非常困难的任务。 + +-------------------------------------------------------------------------------- + +via: https://bugfender.com/one-year-using-go + +作者:[ALEIX VENTAYOL][a] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://bugfender.com/author/aleixventayol +[1]:https://bugfender.com/#facebook +[2]:https://bugfender.com/#twitter +[3]:https://bugfender.com/#google_plus +[4]:https://www.addtoany.com/share#url=https%3A%2F%2Fbugfender.com%2Fone-year-using-go&title=One%20Year%20Using%20Go +[5]:https://golang.org/ +[6]:http://mobilejazz.com/ +[7]:https://www.bugfender.com/ +[8]:https://github.com/go-martini/martini +[9]:https://github.com/kataras/iris +[10]:https://github.com/gin-gonic/gin +[11]:https://github.com/jinzhu/gorm +[12]:https://github.com/jmoiron/sqlx +[13]:https://github.com/go-redis/redis +[14]:https://github.com/olivere/elastic +[15]:http://labix.org/gopkg.in +[16]:https://plugins.jetbrains.com/plugin/5047-go +[17]:https://github.com/Microsoft/vscode-go +[18]:https://bugfender.com/one-year-using-go diff --git a/translated/talk/20170314 One Year Using Go.md b/translated/talk/20170314 One Year Using Go.md deleted file mode 100644 index 18e90116e2..0000000000 --- a/translated/talk/20170314 One Year Using Go.md +++ /dev/null @@ -1,110 +0,0 @@ -[Go 使用一周年][18] -============================================================ - - ![](https://bugfender.com/wp-content/uploads/2017/03/one-year-using-go-social-1.jpg) - -我们在 [Mobile Jazz][6] 的一个内部项目开始使用 [Go][5]。如公司名暗示的那样,我们开发移动应用。 - -在发布一个应用给公众后,我们很快意识到我们缺失一个工具来检查用户实际发生的情况以及他们是如何与应用交互的 - 如果有任何问题后者 bug 报告,这将会相当方便。 - -现在有几款工具声称能在这个方面帮助开发者,但是没有一个能完全满足要求,因此我们决定自己构建。我们开始创建一组基础的脚本,如今它很快进化成了完整的工具,称为 [Bugfender][7]! - -由于这最初是一个实验,我们决定使用一种新的趋势技术。对学习以及持续教育的热爱是 Mobile Jazz 的核心价值的重要方面之一,因此我们决定使用 Go 构建。这是一个由 Google 开发的相对新的编程语言。它是游戏中的新玩家,已经有许多受尊敬的开发者对它称赞。 - -一年后,实验变成了一个启动项目,我们拥有了一个已经帮助了来自全世界的数以千计的开发者的令人难以置信的工具。我们的服务器每天处理来自 700 万台设备的超过 200GB 的数据。 - -在使用 Go 一年之后,我们想要分享我们将一个小的实验变成处理百万日志的生产服务器的一些想法和经验。 - -### Go 生态系统 - -公司中没有人有使用 Go 的经验。Bugfender 是我们第一次深入这个语言。 - -学习基本相当直接。我们之前在 C/C++/Java/Objective-C/PHP 的经验让我们学习 Go 相当快,并且在几天内就开始开发。当然会有一些新的还有不常见的东西需要学习,包括 GOPATH 还有如何处理包,但这在预期内。 - -几天之内,我们意识到即使是一个简化设计的语言,Go 是非常强大的。它能够做任何现代编程语言应该能做的事:能够处理 JSON、服务器之间通讯甚至访问数据库也没问题(并且只需要几行代码)。 - -在构建一个服务器时,你应该首先决定是否使用任何第三方库或者框架。对于 Bugfender,我们决定使用: - -### Martini - -[Martini][8] 是一个强大的 Go web 框架。我们开始这个实验时,它是一个很棒的解决方案,至今也是,我们还没遇到任何问题。然而如果我们如今再次开始这个实验,我们会选择一个不同的框架,因为 Martini 不在被维护了。 - -我们还试验了 [Iris][9](我们目前的最爱)还有 [Gin][10]。Gin 是 Martini 继任者,并且迁移到这上能让我们重用已有的代码。 - -在过去的一年中,我们意识到 Go 的标准库是非常强大的,你不必依靠一个臃肿的 web 框架来构建一个服务器。最好在特定任务上使用专门的高性能库。 - -~~Iris 是我们目前 ~~最喜欢的~~ 并且将来我们将使用它重写服务来替代 Martini/Gin,但这目前并不优先。 - -**编辑:** 在不同地方讨论 Iris 之后,我们意识到 Iris 或许不是最好的选择。如果我们决定重写我们的 web 组件,我们或许会研究其他的选择,我们对提议开放。 - -### Gorm - -一些人是 ORM 的粉丝,一些人不是。我们决定使用 ORM,更确切地说是 [GORM][11]。我们的实现只针对 web 前端,对于日志提取 API 仍然保持使用手写优化的 SQL。在一开始,我们确实很高兴,但是随着时间的推移,我们开始发现问题,并且我们很快将它从代码中完全移除,并且使用 [sqlx][12] 这个标准 SQL 库。 - -GORM 的一个主要问题是 Go 的生态系统。作为一个新语言,自我们开始开发产品以来已经有很多新版本。在这些新版本中的一些改变并不向后兼容,因此要使用最新库版本,我们要经常重新已有代码并检查我们为解决版本问题做的 hack。 - -这两个库是大多数 web 服务的主要组件,因此做一个好的选择很重要,因为将来更改会很困难,并且会影响你服务器的性能。 - -### 第三方服务 - -在创建一个真实世界产品的另外一个重要方面是考虑库、第三方服务和工具的可用性。在这方面,Go 还缺乏成熟度,大多数公司还没有提供 Go 库,因此你或许需要依赖其他人写的质量不能总是保证的库。 - -比如,对于使用 [Redis][13] 和 [ElasticSearch][14] 有很好的库,但是对于其他服务比如 Mixpanel 或者 Stripe 还没有好的。 - -我们建议在使用 Go 之前事先检查对于你需要的产品是否有好的库可用。 - -我们在 Go 的包管理系统上也遇到了很多问题。它处理版本的方式远没有达到最好,并且在过去的一年中,我们在不同的团队成员之间获取到同一个库的不同版本上遇到了很多问题。然而,最近要归功于 Go 新支持的 vendor 包特性,除了 [gopkg.in][15] 服务外,这个问题基本被解决了。 - -### 开发者工具 - - ![](https://bugfender.com/wp-content/uploads/2017/03/go-ide.jpg) - -由于 Go 是一门相对新的语言,你或许发现相比其他成熟的语言像 Java,它可用的开发工具并不很好。当我们开始 Bugfender 时,使用任何 IDE 都很困难,似乎没有 IDE 支持 Go。但是在过去的一年中,随着 [IntelliJ][16] 和 [Visual Studio Code Go][17] 插件的引入,这一切提高了很多。 - -最后看下其他的 Go 工具,调试器并不很好并且分析器甚至更糟,因此有时调试你的代码或者尝试优化它会很困难。 - -### 前往生产 - -这确实是 Go 最好的东西之一,如果你想要部署一些东西到生产环境中,你只需要构建你的二进制并发送到服务器中,没有依赖,不需要安装额外的软件,你只需要能在服务器中运行进制文件。 - -如果你习惯于处理那些需要包管理器或者需要小心你使用的语言解释器的语言,用 Go 工作会很高兴。 - -我们对 Go 的稳定性也很满意,因为服务器似乎从没有崩溃过。我们在发送大量数据给 Go Routines 时遇到过一个问题,但是我们几乎没见到任何崩溃。注意:如果你需要发送大量数据给 Go Routine,你需要小心堆溢出。 - -如果你对性能感兴趣,我们不能与其他语言比较,因为我们从零开始使用 Go,但是对于我们处理的数据量,我们感觉性能是非常好的,我们绝对不能如此轻松地使用 PHP 处理同等数量的请求。 - -### 总结 - -在过去的一年中,我们对 Go 有起起伏伏。最初我们是兴奋的,但是在实验变成真实的产品后我们开始揭露问题。我们几次考虑过用 Java 完全重写,但是目前为止,仍旧使用的是 Go,并且过去的一年中,生态已经有了很大的提升,这简化了我们的工作。 - -如果你想要使用 Go 构建你的产品,你可以保证这可以工作,但是你确实需要小心一件事:可以雇佣的开发者。硅谷中只有很少的高级 Go 开发者,并且在其他地方寻找也是一件非常困难的任务。 - --------------------------------------------------------------------------------- - -via: https://bugfender.com/one-year-using-go - -作者:[ALEIX VENTAYOL][a] -译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://bugfender.com/author/aleixventayol -[1]:https://bugfender.com/#facebook -[2]:https://bugfender.com/#twitter -[3]:https://bugfender.com/#google_plus -[4]:https://www.addtoany.com/share#url=https%3A%2F%2Fbugfender.com%2Fone-year-using-go&title=One%20Year%20Using%20Go -[5]:https://golang.org/ -[6]:http://mobilejazz.com/ -[7]:https://www.bugfender.com/ -[8]:https://github.com/go-martini/martini -[9]:https://github.com/kataras/iris -[10]:https://github.com/gin-gonic/gin -[11]:https://github.com/jinzhu/gorm -[12]:https://github.com/jmoiron/sqlx -[13]:https://github.com/go-redis/redis -[14]:https://github.com/olivere/elastic -[15]:http://labix.org/gopkg.in -[16]:https://plugins.jetbrains.com/plugin/5047-go -[17]:https://github.com/Microsoft/vscode-go -[18]:https://bugfender.com/one-year-using-go From 810864d3a93348133e5bd3ed7288d3a4bd0e353a Mon Sep 17 00:00:00 2001 From: chenxinlong <237448382@qq.com> Date: Sat, 24 Jun 2017 23:16:21 +0800 Subject: [PATCH 0502/1407] finished translating --- ...n introduction to Linux s EXT4 filesystem.md | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md b/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md index 850c109e7e..3bbd63ff73 100644 --- a/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md +++ b/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md @@ -214,9 +214,10 @@ Linux 的扩展文件系统使用数据分配策略,有助于最小化硬盘 fsck -fn /dev/mapper/vg_01-home ``` -I once performed some theoretical calculations to determine whether disk defragmentation might result in any noticeable performance improvement. While I did make some assumptions, the disk performance data I used were from a new 300GB, Western Digital hard drive with a 2.0ms track-to-track seek time. The number of files in this example was the actual number that existed in the filesystem on the day I did the calculation. I did assume that a fairly large amount of the fragmented files (20%) would be touched each day. +我曾经进行过一些理论计算,以确定磁盘碎片整理是否会导致任何明显的性能提升。 虽然我做了一些假设,我使用的磁盘性能数据来自一个新的 300GB 的西部数字硬盘驱动器,具有 2.0ms 的追踪到追踪时间。 此示例中的文件数是在计算当天文件系统中存在的实际数。 我假设有相当大量的碎片文件(约 20%)每天都会被触动。 | **Total files** | **271,794** | +|--|--| | % fragmentation | 5.00% | | Discontinuities | 13,590 | |   |   | @@ -230,19 +231,19 @@ I once performed some theoretical calculations to determine whether disk defragm | Total additional seek time per day | 5.44 sec | |   | 0.091 min | -Table 1: The theoretical effects of fragmentation on disk performance +表 1: 碎片对磁盘性能的理论影响 -I have done two calculations for the total additional seek time per day, one based on the track-to-track seek time, which is the more likely scenario for most files due to the EXT file allocation strategies, and one for the average seek time, which I assumed would make a fair worst-case scenario. +我对每天的全部追加寻道时间进行了两次计算,一次是单磁道寻道时间,这是由于EXT文件分配策略而导致大多数文件的可能性更大的情况,一个是平均搜索时间,我认为这将是一个公平的最坏情况。 -As you can see from Table 1, the impact of fragmentation on a modern EXT filesystem with a hard drive of even modest performance would be minimal and negligible for the vast majority of applications. You can plug the numbers from your environment into your own similar spreadsheet to see what you might expect in the way of performance impact. This type of calculation most likely will not represent actual performance, but it can provide a bit of insight into fragmentation and its theoretical impact on a system. +从表 1 可以看出,对绝大多数应用程序而言,碎片化对具有甚至适度性能的硬盘驱动器的现代EXT文件系统的影响将是微乎其微的。您可以将您的环境中的数字插入到您自己的类似电子表格中,以了解你对性能影响的期望。这种类型的计算不一定能够代表实际的性能,但它可以提供一些洞察碎片化及其对系统的理论影响。 -Most of my partitions are around 1.5% or 1.6% fragmented; I do have one that is 3.3% fragmented but that is a large, 128GB filesystem with fewer than 100 very large ISO image files; I've had to expand the partition several times over the years as it got too full. +我的大部分分区的碎片率都在 1.5% 左右或 1.6%,我有一个分区有 3.3% 的碎片,但是这是一个大的 128GB 文件系统,具有少于100 个非常大的 ISO 映像文件; 多年来,我不得不扩张分区,因为它已经太满了。 -That is not to say that some application environments don't require greater assurance of even less fragmentation. The EXT filesystem can be tuned with care by a knowledgeable admin who can adjust the parameters to compensate for specific workload types. This can be done when the filesystem is created or later using the **tune2fs** command. The results of each tuning change should be tested, meticulously recorded, and analyzed to ensure optimum performance for the target environment. In the worst case, where performance cannot be improved to desired levels, other filesystem types are available that may be more suitable for a particular workload. And remember that it is common to mix filesystem types on a single host system to match the load placed on each filesystem. +这并不是说一些应用的环境不需要更多的保证,甚至更少的碎片。 EXT 文件系统可以由有经验和知识的管理员小心调整,管理员可以调整参数以抵消特定的工作负载类型。这个工作可以在文件系统创建的时候或稍后使用 **tune2fs** 命令时完成。每一次调整变化的结果应进行测试,精心的记录和分析,以确保目标环境的最佳性能。在最坏的情况下,如果性能不能提高到期望的水平,则其他文件系统类型可能更适合特定的工作负载。并记住,在单个主机系统上使用混合文件系统类型以匹配放在每个文件系统上的负载是常见的。 -Due to the low amount of fragmentation on most EXT filesystems, it is not necessary to defragment. In any event, there is no safe defragmentation tool for EXT filesystems. There are a few tools that allow you to check the fragmentation of an individual file or the fragmentation of the remaining free space in a filesystem. There is one tool, **e4defrag**, which will defragment a file, directory, or filesystem as much as the remaining free space will allow. As its name implies, it only works on files in an EXT4 filesystem, and it does have some limitations. +由于大多数 EXT 文件系统的碎片数量较少,因此无需进行碎片整理。在任何情况下,EXT 文件系统都没有安全的碎片整理工具。有几个工具允许你检查单个文件的碎片或文件系统中剩余可用空间的碎片。有一个工具,**e4defrag**,它将对剩余可用空间允许的文件,目录或文件系统进行碎片整理。顾名思义,它只适用于 EXT4 文件系统中的文件,并且它还有一其它的些限制。 -If it becomes necessary to perform a complete defragmentation on an EXT filesystem, there is only one method that will work reliably. You must move all the files from the filesystem to be defragmented, ensuring that they are deleted after being safely copied to another location. If possible, you could then increase the size of the filesystem to help reduce future fragmentation. Then copy the files back onto the target filesystem. Even this does not guarantee that all the files will be completely defragmented. +如果有必要在 EXT 文件系统上执行完整的碎片整理,则只有一种方法能够可靠地工作。你必须将文件系统中的所有要进行碎片整理的文件在确保在安全复制到其他位置后将其删除。如果可能,你可以增加文件系统的大小,以帮助减少将来的碎片。然后将文件复制回目标文件系统。但是其实即使这样也不能保证所有文件都被完全碎片整理。 ### 总结 From 527b9ec0155272a708bdc1f25300fbda4aca6194 Mon Sep 17 00:00:00 2001 From: chenxinlong <237448382@qq.com> Date: Sat, 24 Jun 2017 23:19:50 +0800 Subject: [PATCH 0503/1407] move to translated --- ...introduction to Linux s EXT4 filesystem.md | 301 ------------------ 1 file changed, 301 deletions(-) delete mode 100644 sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md diff --git a/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md b/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md deleted file mode 100644 index 3bbd63ff73..0000000000 --- a/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md +++ /dev/null @@ -1,301 +0,0 @@ -Linux 的 EXT4 文件系统简介 -============================================================ - -### 让我们大概地从 EXT4 的历史、特性以及最佳实践这几个方面来学习它和之前的所有的 EXT 文件系统有何不同。 - -![An introduction to the EXT4 filesystem](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/hard_drives.png?itok=yZWyaSO6 "An introduction to the EXT4 filesystem") ->图片来自 : [WIlliam][8][ Warby][9]. 由 [Jason Baker][10] 编辑. Creative Commons [BY-SA 2.0][11]. - -在之前关于 Linux 文件系统的文章里,我写过一篇 [an introduction to Linux filesystems][12] 和一些更高级的概念例如 [everything is a file][13]. 我想要更深入地了解 EXT 文件系统的特性的详细内容,但是首先让我们来回答一个问题,“什么样才算是一个文件系统 ?” 一个文件系统应该涵盖以下所有点: - -1. **数据存储:** 对于任何一个文件系统来说,一个最主要的功能就是能够被当作一个容器结构来存储和恢复数据。 - -2. **命名空间:** 命名空间是一个提供了命名规则和数据结构的用于命名与组织的方法学。 - -3. **安全模型:** 一个用于定义访问权限的策略。 - -4. **API:** 指的是调用了操作这个系统的对象的系统方法,这些对象诸如目录和文件。 - -5. **实现:** 能够实现以上几点的软件。 - -本文内容的讨论主要集中于上述几点中的第一项并探索为一个 EXT 文件系统的数据存储提供逻辑框架的元数据结构。 - -### EXT 文件系统历史 - -虽然 EXT 文件系统是为 Linux 编写的,但其真正起源于 Minix 操作系统和 Minix 文件系统,而 Minix 最早发布于 1987,早于 Linux 5 年。如果我们从 EXT 文件系统大家族的 Minix 起源来观察其历史与技术发展那么理解 EXT4 文件系统就会简单得多。 - -### Minix - -当 Linux Torvalds 在写最初的 Linux 内核的时候,他需要一个文件系统但是他又不想自己写一个。于是他简单地把 [Minix 文件系统][14] 加了进去,这个 Minix 文件系统是由 [Andrew S. Tanenbaum][15] 写的同时也是 Tanenbaum 的 Minix 操作系统的一部分。[Minix][16] 是一个类 Unix 风格的操作系统,最初编写它的原因是用于教育。Minx 的代码是自由可用的且经过适当的许可的,所以 Torvalds 可以把它用 Linux 的最初版本里。 - -Minix 有以下这些结构,其中的大部分位于生成文件系统的分区中: - -* [**boot 扇区**][6] 是硬盘驱动安装后的第一个扇区。这个 boot 块包含了一个非常小的 boot 记录和一个分区表。 - -* 每一个分区的第一个块都是一个包含了元数据的 **superblock** ,这些元数据定义了其他文件系统的结构并将其定位于物理硬盘的具体分区上。 - -* 一个 **inode 位图块** 决定了哪些 inode 是在使用中的,哪一些是未使用的。 - -* **inode** 在硬盘上有它们自己的空间。每一个 inode 都包含了一个文件的信息包括其所处的数据块的位置,也就是该文件所处的区域。 - -* 一个 **区位图** 用于保持追踪数据区域的使用和未使用情况。 - -* 一个 **数据区**, 这里是数据存储的地方。 - -对上述了两种位图类型来说,一个 bit 表示一个制定的数据区或者一个指定的 inode. 如果这个 bit 是 0 则表示这个数据区或者这个 inode 是可以使用的,如果是 1 则表示正在使用中。 - -那么,[inode][17] 又是什么呢 ? 就是 index-node (索引节点)的简写。 inode 是位于磁盘上的一个 256 字节的块,用于存储和该 inode 对应的文件的相关数据。这些数据包含了文件的大小、文件的所有者和所属组的用户的 ID、文件模式(即访问权限)以及三个时间戳用于指定:该文件最后的访问时间、该文件的最后修改时间和该 inode 中的数据的最后修改时间。 - -同时,这个 inode 还包含了指向了其所对应的文件的数据在硬盘中的位置。在 Minix 和 EXT1-3 文件系统中,inode 表示的是一系列的的数据区和块。Minix 文件系统的 inode 支持 9 个数据块包括 7 个直接数据块和 2 个间接数据块。如果你想要更深入的了解,这里有一个优秀的 PDF 详细地描述了 [Minix 文件系统街头][18] 。同时你也可以在维基百科上对 [inode 指针结构][19] 做一个快速的浏览。 - -### EXT - -原生的 [EXT 文件系统][20] (指经过扩展的) 是由 [Rémy Card][21] 编写并于 1992 年与 Linux 一同发行。主要是为了克服 Minix 文件系统中的一些文件大小限制的问题。其中,最主要的结构变化就是文件系统中的元数据。它基于 Unix 文件系统 (UFS),也被称为伯克利快速文件系统(FFS)。我发现只有很少一部分关于 EXT 文件系统的发行信息是可以被验证的,显然这是因为其存在着严重的问题并且它很快地被 EXT2 文件系统取代了。 - -### EXT2 - -[EXT2 文件系统][22] 就相当地成功,它在 Linux 发行版中存活了多年。它是我在 1997 年开始使用 Red Hat Linux 时认识的第一个文件系统。实际上,EXT2 文件系统有着和 EXT 文件系统基本相同的元数据结构。然而 EXT2 更高瞻远瞩,因为其元数据结构之间留有很多磁盘空间供将来使用。 - -和 Minix 类似,EXT2 也有一个[boot 扇区][23] ,它是硬盘驱动安装后的第一个扇区。它包含了少量的 boot 记录和一个分区表。接着 boot 扇区之后是一些保留的空间,它跨越引导记录和通常位于下一个柱面的硬盘驱动器上的第一个分区之间的空间。 [GRUB2] [24] - 也可能是GRUB1 - 将此空间用于其部分启动代码。 - -每个 EXT2 分区中的空间分为各柱面组,它允许更精细地管理数据空间。 根据我的经验,每一组大小通常约为8MB。 下面的图1显示了一个柱面组的基本结构。 柱面中的数据分配单元是块,通常大小为4K。 - -![cylindergroup-01_1.png](https://opensource.com/sites/default/files/images/life-uploads/cylindergroup-01_1.png) - -Figure 1: EXT 文件系统中的柱面组的结构 - -柱面组中的第一个块是一个超级块,它包含了一个定义了其他文件系统的结构并将其定位于物理硬盘的具体分区上的元数据。分区中有一些柱面组还会有备用超级块,但并不是所有的柱面组都有。我们还可以使用例如 **dd** 等磁盘工具来拷贝备用超级块的内容到主超级块上以达到更换损坏超级块的目的。虽然这种情况不会经常发生,但是在几年前我的一个超级块损坏了,我就是用这种方法来修复的。幸好,我很有先见之明地使用了 **dumpe2fs** 命令来备份了我的分区描述符信息到我的系统上。 - -以下是 **dumpe2fs** 命令的一部分输出。这部分输出主要是超级块上包含的一些元数据,同时也是文件系统上的前两个柱面组的数据。 - -``` -# dumpe2fs /dev/sda1 -Filesystem volume name: boot -Last mounted on: /boot -Filesystem UUID: 79fc5ed8-5bbc-4dfe-8359-b7b36be6eed3 -Filesystem magic number: 0xEF53 -Filesystem revision #: 1 (dynamic) -Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir nlink extra_isize -Filesystem flags: signed_directory_hash -Default mount options: user_xattr acl -Filesystem state: clean -Errors behavior: Continue -Filesystem OS type: Linux -Inode count: 122160 -Block count: 488192 -Reserved block count: 24409 -Free blocks: 376512 -Free inodes: 121690 -First block: 0 -Block size: 4096 -Fragment size: 4096 -Group descriptor size: 64 -Reserved GDT blocks: 238 -Blocks per group: 32768 -Fragments per group: 32768 -Inodes per group: 8144 -Inode blocks per group: 509 -Flex block group size: 16 -Filesystem created: Tue Feb 7 09:33:34 2017 -Last mount time: Sat Apr 29 21:42:01 2017 -Last write time: Sat Apr 29 21:42:01 2017 -Mount count: 25 -Maximum mount count: -1 -Last checked: Tue Feb 7 09:33:34 2017 -Check interval: 0 () -Lifetime writes: 594 MB -Reserved blocks uid: 0 (user root) -Reserved blocks gid: 0 (group root) -First inode: 11 -Inode size: 256 -Required extra isize: 32 -Desired extra isize: 32 -Journal inode: 8 -Default directory hash: half_md4 -Directory Hash Seed: c780bac9-d4bf-4f35-b695-0fe35e8d2d60 -Journal backup: inode blocks -Journal features: journal_64bit -Journal size: 32M -Journal length: 8192 -Journal sequence: 0x00000213 -Journal start: 0 - -Group 0: (Blocks 0-32767) - Primary superblock at 0, Group descriptors at 1-1 - Reserved GDT blocks at 2-239 - Block bitmap at 240 (+240) - Inode bitmap at 255 (+255) - Inode table at 270-778 (+270) - 24839 free blocks, 7676 free inodes, 16 directories - Free blocks: 7929-32767 - Free inodes: 440, 470-8144 -Group 1: (Blocks 32768-65535) - Backup superblock at 32768, Group descriptors at 32769-32769 - Reserved GDT blocks at 32770-33007 - Block bitmap at 241 (bg #0 + 241) - Inode bitmap at 256 (bg #0 + 256) - Inode table at 779-1287 (bg #0 + 779) - 8668 free blocks, 8142 free inodes, 2 directories - Free blocks: 33008-33283, 33332-33791, 33974-33975, 34023-34092, 34094-34104, 34526-34687, 34706-34723, 34817-35374, 35421-35844, 35935-36355, 36357-36863, 38912-39935, 39940-40570, 42620-42623, 42655, 42674-42687, 42721-42751, 42798-42815, 42847, 42875-42879, 42918-42943, 42975, 43000-43007, 43519, 43559-44031, 44042-44543, 44545-45055, 45116-45567, 45601-45631, 45658-45663, 45689-45695, 45736-45759, 45802-45823, 45857-45887, 45919, 45950-45951, 45972-45983, 46014-46015, 46057-46079, 46112-46591, 46921-47103, 49152-49395, 50027-50355, 52237-52255, 52285-52287, 52323-52351, 52383, 52450-52479, 52518-52543, 52584-52607, 52652-52671, 52734-52735, 52743-53247 - Free inodes: 8147-16288 -Group 2: (Blocks 65536-98303) - Block bitmap at 242 (bg #0 + 242) - Inode bitmap at 257 (bg #0 + 257) - Inode table at 1288-1796 (bg #0 + 1288) - 6326 free blocks, 8144 free inodes, 0 directories - Free blocks: 67042-67583, 72201-72994, 80185-80349, 81191-81919, 90112-94207 - Free inodes: 16289-24432 -Group 3: (Blocks 98304-131071) - - -``` - -每一个柱面组都有自己的 inode 位图用于判定该柱面组中的哪些 inode 是使用中的而哪些又是未被使用的。每一个柱面组的 inode 都有它们自己的空间。每一个 inode 都包含了对应的文件的相关信息,包括其位于该文件的数据块中的位置。这个块位图纪录了文件系统中的使用中和非使用中的数据块。请注意,在上面的输出中有大量关于文件系统的数据。在非常大的文件系统上,组数据可以运行到数百页的长度。 组元数据包括组中所有空闲数据块的列表。 - -EXT 文件系统实现了数据分配策略以确保产生最少的文件碎片。减少文件碎片可以提高文件系统的性能。这些策略会在下面的 EXT4 中描述到。 - -我所遇见的关于 EXT2 文件系统最大的问题是 **fsck** (文件系统检查) 程序这一环节占用了很长一段时间来定位和校准文件系统中的所有不一致性导致其共花费了数个小时来修复一个崩溃。有一次我的其中一台电脑共花费了 28 个小时在一次崩溃后重新启动时恢复磁盘上,并且是在磁盘被检测量在几百兆字节大小的情况下。 - -### EXT3 - -[EXT3 文件系统][25] 具有克服 **fsck** 程序需要完全恢复在文件更新操作期间发生的不正确关机损坏的磁盘结构所需的大量时间的单一目标。EXT 文件系统的唯一新增是 [日志][26],它将提前记录将对文件系统执行的更改。 磁盘结构的其余部分与 EXT2 中的相同。 - -作为一个先前的版本,除了直接写入数据到磁盘的数据区域外,EXT3 的日志在写入元数据时同时会也写入文件数据到磁盘上的一个指定数据区域。一旦这些数据安全地到达硬盘,它就可以几乎零丢失率地被合并或者被追加到目标文件。当这些数据被提交到磁盘上的数据区域上,这些日志就会随即更新,这样在系统发生故障之前,文件系统将保持一致状态,才能提交日志中的所有数据。在下次启动时,将检查文件系统的不一致性,然后将日志中保留的数据提交到磁盘的数据区,以完成对目标文件的更新。 - -日记功能确实降低了数据写入性能,但是有三个可用于日志的选项,允许用户在性能和数据完整性和安全性之间进行选择。 我的个人更偏向于选择安全性,因为我的环境不需要大量的磁盘写入活动。 - -日志功能减少了在从几小时(甚至几天)到几分钟之间的失败后检查硬盘驱动器所需的时间。 多年来,我遇到了很多问题导致了我的系统崩溃。 要详细说的话恐怕还得再写一篇文章,但这足以说明大多数是我自己造成的,就比如不小心踢掉一个电源插头。 幸运的是,EXT日志文件系统将启动恢复时间缩短到两三分钟。 此外,自从我开始使用带日志记录的EXT3,我从来没有遇到丢失数据的问题。 - -EXT3 的日志功能可以关闭,然后作为 EXT2 文件系统。 该日志本身仍然是存在的,只是状态为空且未使用。 只需使用类型参数使用 mount 命令来 remount 到分区即可指定EXT2 \。 你可以从命令行执行此操作,但是具体还是取决于你正在使用的文件系统,但你可以更改 **/ etc / fstab** 文件中的类型说明符,然后重新启动。 我强烈建议不要将 EXT3文件系统安装为 EXT2 ,因为这会具有丢失数据和增加恢复时间的潜在可能性。 - -EXT2 文件系统可以使用如下命令来通过日志升级到 EXT3 。 - -``` -tune2fs -j /dev/sda1 -``` - - **/dev/sda1** 表示驱动和分区的标识符。同时要注意修改 **/etc/fstab** 中的文件类型标识符并 remount 分区或者重启系统以确保修改生效。 - -### EXT4 - -[EXT4 filesystem][27]主要提高了性能、可靠性和容量。位了提高可靠性,它新增了元数据和日志校验和。同时位了满足各种关键任务要求,文件系统新增了纳秒级别的时间戳。在时间戳字段中添加两个高位来延迟时间戳的 [2038 年的问题][28] ,在 EXT4 文件系统至少可达到 2446 年。 - -在 EXT4 中,数据分配从固定块更改为盘区,盘区由硬盘驱动器上的开始和结束位置来描述。这使得可以在单个 inode 指针条目中描述非常长的物理连续的文件,这可以显着减少描述大文件中所有数据的位置所需的指针数。 EXT4 中已经实施了其他分配策略,以进一步减少碎片化。 - -EXT4 通过将新创建的文件分散在磁盘上,从而使其不会全部聚集在磁盘起始位置,就像早期的PC文件系统一样,减少了碎片。文件分配算法尝试在柱面组中尽可能均匀地扩展文件,并且当需要分段时,要使不连续文件扩展区尽可能靠近同一文件中的其他文件,以尽可能减少头部搜索和旋转等待时间尽可能的当创建新文件或扩展现有文件时,使用其他策略来预分配额外的磁盘空间。这有助于确保扩展文件不会自动导致其分段。新文件不会在现有文件之后立即分配,这也可以防止现有文件的碎片化。 - -除了磁盘上数据的实际位置外,EXT4 使用诸如延迟分配的功能策略,以允许文件系统在分配空间之前收集正在写入磁盘的所有数据。这可以提高数据空间将是连续的可能性。 - -较旧的EXT文件系统(如 EXT2 和 EXT3)可以作为 EXT4 进行 mount ,以使其性能获得较小的提升。不幸的是,这需要关闭 EXT4 的一些重要的新功能,所以我建议不要这样做。 - -自 Fedora 14 以来,EXT4 一直是 Fedora 的默认文件系统。我们可以使用 Fedora 文档中描述的 [procedure ][29] 将EXT3文件系统升级到EXT4,但是由于之前仍然存留d的 EXT3 元数据结构,它的性能仍将受到影响。从 EXT3 升级到 EXT4 的最佳方法是备份目标文件系统分区上的所有数据,使用 **mkfs** 命令将空EXT4文件系统写入分区,然后从备份中恢复所有数据。 - -### Inode - -以前描述的 inode 是EXT文件系统中的元数据的关键组件。 图 2 显示了 inode 和存储在硬盘驱动器上的数据之间的关系。 该图是单个文件的目录和 inode,在这种情况下,可能会产生高度碎片。 EXT 文件系统可以积极地减少碎片,所以不太可能会看到有这么多间接数据块或扩展盘的文件。 实际上,如下所示,EXT文件系统中的碎片非常低,所以大多数 inode 只使用一个或两个直接数据指针,也不使用间接指针。 - -![inodesanddataallocation-01_0.png](https://opensource.com/sites/default/files/images/life-uploads/inodesanddataallocation-01_0.png) - -图 2 :inode 存储有关每个文件的信息,并使 EXT 文件系统能够查找属于它的所有数据。 - -inode 不包含文件的名称。通过目录条目访问文件,目录条目本身是文件的名称,并包含指向 inode 的指针。该指针的值是 inode 号。文件系统中的每个 inode 都具有唯一的 ID 号,但同一台计算机上的其他文件系统(甚至相同的硬盘驱动器)中的 inode 可以具有相同的 inode 号。这对[links][30] 存在影响,但是这个讨论超出了本文的范围。 - -inod e包含有关该文件的元数据,包括其类型和权限以及其大小。 inode 还包含 15 个指针的空格,用于描述柱面组数据部分中数据块或扩展区的位置和长度。十二个指针提供对数据扩展区的直接访问,并且应该足以处理大多数文件。然而,对于具有重大分段的文件,有必要以间接节点的形式具有一些附加功能。从技术上讲,这些不是真正的节点,所以我在这里使用这个术语“节点”来方便。 - -间接节点是文件系统中的正常数据块,它仅用于描述数据而不用于存储元数据,因此可以支持超过 15 个条目。例如,4K 的块大小可以支持 512 个 4 字节间接节点,允许单个文件的 **12(直接)+ 512(间接)= 524** 范围。还支持双重和三重间接节点支持,但我们大多数人不太可能遇到需要许多扩展的文件。 - -### 数据碎片 - -对于许多较旧的 PC 文件系统,如 FAT(及其所有变体)和 NTFS,碎片一直是导致磁盘性能下降的重大问题。 碎片整理对于其本身和一些专门的整理软件来说已经称为了一项专门的工程,其效果范围从非常有效到仅仅是微乎其微。 - -Linux 的扩展文件系统使用数据分配策略,有助于最小化硬盘驱动器上的文件碎片,并在发生碎片时减少碎片的影响。 你可以使用 EXT 文件系统上的 **fsck** 命令检查文件系统的整体碎片。 以下示例检查主工作站的主目录,只有 1.5% 的碎片。 确保使用 **- n** 参数,因为它会阻止 **fsck** 对扫描文件系统采取的任何操作。 - -``` -fsck -fn /dev/mapper/vg_01-home -``` - -我曾经进行过一些理论计算,以确定磁盘碎片整理是否会导致任何明显的性能提升。 虽然我做了一些假设,我使用的磁盘性能数据来自一个新的 300GB 的西部数字硬盘驱动器,具有 2.0ms 的追踪到追踪时间。 此示例中的文件数是在计算当天文件系统中存在的实际数。 我假设有相当大量的碎片文件(约 20%)每天都会被触动。 - -| **Total files** | **271,794** | -|--|--| -| % fragmentation | 5.00% | -| Discontinuities | 13,590 | -|   |   | -| % fragmented files touched per day | 20% (assume) | -| Number of additional seeks | 2,718 | -| Average seek time | 10.90 ms | -| Total additional seek time per day | 29.63 sec | -|   | 0.49 min | -|   |   | -| Track-to-track seek time | 2.00 ms | -| Total additional seek time per day | 5.44 sec | -|   | 0.091 min | - -表 1: 碎片对磁盘性能的理论影响 - -我对每天的全部追加寻道时间进行了两次计算,一次是单磁道寻道时间,这是由于EXT文件分配策略而导致大多数文件的可能性更大的情况,一个是平均搜索时间,我认为这将是一个公平的最坏情况。 - -从表 1 可以看出,对绝大多数应用程序而言,碎片化对具有甚至适度性能的硬盘驱动器的现代EXT文件系统的影响将是微乎其微的。您可以将您的环境中的数字插入到您自己的类似电子表格中,以了解你对性能影响的期望。这种类型的计算不一定能够代表实际的性能,但它可以提供一些洞察碎片化及其对系统的理论影响。 - -我的大部分分区的碎片率都在 1.5% 左右或 1.6%,我有一个分区有 3.3% 的碎片,但是这是一个大的 128GB 文件系统,具有少于100 个非常大的 ISO 映像文件; 多年来,我不得不扩张分区,因为它已经太满了。 - -这并不是说一些应用的环境不需要更多的保证,甚至更少的碎片。 EXT 文件系统可以由有经验和知识的管理员小心调整,管理员可以调整参数以抵消特定的工作负载类型。这个工作可以在文件系统创建的时候或稍后使用 **tune2fs** 命令时完成。每一次调整变化的结果应进行测试,精心的记录和分析,以确保目标环境的最佳性能。在最坏的情况下,如果性能不能提高到期望的水平,则其他文件系统类型可能更适合特定的工作负载。并记住,在单个主机系统上使用混合文件系统类型以匹配放在每个文件系统上的负载是常见的。 - -由于大多数 EXT 文件系统的碎片数量较少,因此无需进行碎片整理。在任何情况下,EXT 文件系统都没有安全的碎片整理工具。有几个工具允许你检查单个文件的碎片或文件系统中剩余可用空间的碎片。有一个工具,**e4defrag**,它将对剩余可用空间允许的文件,目录或文件系统进行碎片整理。顾名思义,它只适用于 EXT4 文件系统中的文件,并且它还有一其它的些限制。 - -如果有必要在 EXT 文件系统上执行完整的碎片整理,则只有一种方法能够可靠地工作。你必须将文件系统中的所有要进行碎片整理的文件在确保在安全复制到其他位置后将其删除。如果可能,你可以增加文件系统的大小,以帮助减少将来的碎片。然后将文件复制回目标文件系统。但是其实即使这样也不能保证所有文件都被完全碎片整理。 - -### 总结 - -EXT 文件系统在一些 Linux 发行版本上作为默认文件系统已经超过二十多年了。它们用最少的维护代价提供了稳定性、高可用性、可靠性和其他各种表现。我尝试过一些其它的文件系统但最终都还是回归到 EXT。每一个我在工作中使用到 Linux 的地方都使用到了 EXT 文件系统,同时发现了它们适用于任何主流的负载。毫无疑问,EXT4 文件系统应该被用于大部分的 Linux 文件系统上,除非我们有明显的使用其它文件系统的理由。 - --------------------------------------------------------------------------------- - -作者简介: - -David Both - David Both 是一名 Linux 于开源的贡献者,目前居住在北卡罗莱纳州的罗利。他从事 IT 行业有 40 余年并在 IBM 中从事 OS/2 培训约 20 余年。在 IBM 就职期间,他在 1981 年为最早的 IBM PC 写了一个培训课程。他已经为红帽教授了 RHCE 课程,曾在 MCI Worldcom,思科和北卡罗来纳州工作。 他使用 Linux 和开源软件工作了近 20 年。 - -------------------- - -via: https://opensource.com/article/17/5/introduction-ext4-filesystem - -作者:[David Both ][a] -译者:[chenxinlong](https://github.com/chenxinlong) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/dboth -[1]:https://opensource.com/resources/what-is-linux?src=linux_resource_menu -[2]:https://opensource.com/resources/what-are-linux-containers?src=linux_resource_menu -[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=7016000000127cYAAQ -[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?src=linux_resource_menu&intcmp=7016000000127cYAAQ -[5]:https://opensource.com/tags/linux?src=linux_resource_menu -[6]:https://en.wikipedia.org/wiki/Boot_sector -[7]:https://opensource.com/article/17/5/introduction-ext4-filesystem?rate=B4QU3W_JYmEKsIKZf5yqMpztt7CRF6uzC0wfNBidEbs -[8]:https://www.flickr.com/photos/wwarby/11644168395 -[9]:https://www.flickr.com/photos/wwarby/11644168395 -[10]:https://opensource.com/users/jason-baker -[11]:https://creativecommons.org/licenses/by/2.0/ -[12]:https://opensource.com/life/16/10/introduction-linux-filesystems -[13]:https://opensource.com/life/15/9/everything-is-a-file -[14]:https://en.wikipedia.org/wiki/MINIX_file_system -[15]:https://en.wikipedia.org/wiki/Andrew_S._Tanenbaum -[16]:https://en.wikipedia.org/wiki/MINIX -[17]:https://en.wikipedia.org/wiki/Inode -[18]:http://ohm.hgesser.de/sp-ss2012/Intro-MinixFS.pdf -[19]:https://en.wikipedia.org/wiki/Inode_pointer_structure -[20]:https://en.wikipedia.org/wiki/Extended_file_system -[21]:https://en.wikipedia.org/wiki/R%C3%A9my_Card -[22]:https://en.wikipedia.org/wiki/Ext2 -[23]:https://en.wikipedia.org/wiki/Boot_sector -[24]:https://opensource.com/article/17/2/linux-boot-and-startup -[25]:https://en.wikipedia.org/wiki/Ext3 -[26]:https://en.wikipedia.org/wiki/Journaling_file_system -[27]:https://en.wikipedia.org/wiki/Ext4 -[28]:https://en.wikipedia.org/wiki/Year_2038_problem -[29]:https://docs.fedoraproject.org/en-US/Fedora/14/html/Storage_Administration_Guide/ext4converting.html -[30]:https://en.wikipedia.org/wiki/Hard_link -[31]:https://opensource.com/user/14106/feed -[32]:https://opensource.com/article/17/5/introduction-ext4-filesystem#comments -[33]:https://opensource.com/users/dboth From 1c788ae11f1d11efbffe320e22a783b8c4a23bde Mon Sep 17 00:00:00 2001 From: chenxinlong <237448382@qq.com> Date: Sat, 24 Jun 2017 23:22:33 +0800 Subject: [PATCH 0504/1407] mv to translated --- ...introduction to Linux s EXT4 filesystem.md | 301 ++++++++++++++++++ 1 file changed, 301 insertions(+) create mode 100644 translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md diff --git a/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md b/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md new file mode 100644 index 0000000000..3bbd63ff73 --- /dev/null +++ b/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md @@ -0,0 +1,301 @@ +Linux 的 EXT4 文件系统简介 +============================================================ + +### 让我们大概地从 EXT4 的历史、特性以及最佳实践这几个方面来学习它和之前的所有的 EXT 文件系统有何不同。 + +![An introduction to the EXT4 filesystem](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/hard_drives.png?itok=yZWyaSO6 "An introduction to the EXT4 filesystem") +>图片来自 : [WIlliam][8][ Warby][9]. 由 [Jason Baker][10] 编辑. Creative Commons [BY-SA 2.0][11]. + +在之前关于 Linux 文件系统的文章里,我写过一篇 [an introduction to Linux filesystems][12] 和一些更高级的概念例如 [everything is a file][13]. 我想要更深入地了解 EXT 文件系统的特性的详细内容,但是首先让我们来回答一个问题,“什么样才算是一个文件系统 ?” 一个文件系统应该涵盖以下所有点: + +1. **数据存储:** 对于任何一个文件系统来说,一个最主要的功能就是能够被当作一个容器结构来存储和恢复数据。 + +2. **命名空间:** 命名空间是一个提供了命名规则和数据结构的用于命名与组织的方法学。 + +3. **安全模型:** 一个用于定义访问权限的策略。 + +4. **API:** 指的是调用了操作这个系统的对象的系统方法,这些对象诸如目录和文件。 + +5. **实现:** 能够实现以上几点的软件。 + +本文内容的讨论主要集中于上述几点中的第一项并探索为一个 EXT 文件系统的数据存储提供逻辑框架的元数据结构。 + +### EXT 文件系统历史 + +虽然 EXT 文件系统是为 Linux 编写的,但其真正起源于 Minix 操作系统和 Minix 文件系统,而 Minix 最早发布于 1987,早于 Linux 5 年。如果我们从 EXT 文件系统大家族的 Minix 起源来观察其历史与技术发展那么理解 EXT4 文件系统就会简单得多。 + +### Minix + +当 Linux Torvalds 在写最初的 Linux 内核的时候,他需要一个文件系统但是他又不想自己写一个。于是他简单地把 [Minix 文件系统][14] 加了进去,这个 Minix 文件系统是由 [Andrew S. Tanenbaum][15] 写的同时也是 Tanenbaum 的 Minix 操作系统的一部分。[Minix][16] 是一个类 Unix 风格的操作系统,最初编写它的原因是用于教育。Minx 的代码是自由可用的且经过适当的许可的,所以 Torvalds 可以把它用 Linux 的最初版本里。 + +Minix 有以下这些结构,其中的大部分位于生成文件系统的分区中: + +* [**boot 扇区**][6] 是硬盘驱动安装后的第一个扇区。这个 boot 块包含了一个非常小的 boot 记录和一个分区表。 + +* 每一个分区的第一个块都是一个包含了元数据的 **superblock** ,这些元数据定义了其他文件系统的结构并将其定位于物理硬盘的具体分区上。 + +* 一个 **inode 位图块** 决定了哪些 inode 是在使用中的,哪一些是未使用的。 + +* **inode** 在硬盘上有它们自己的空间。每一个 inode 都包含了一个文件的信息包括其所处的数据块的位置,也就是该文件所处的区域。 + +* 一个 **区位图** 用于保持追踪数据区域的使用和未使用情况。 + +* 一个 **数据区**, 这里是数据存储的地方。 + +对上述了两种位图类型来说,一个 bit 表示一个制定的数据区或者一个指定的 inode. 如果这个 bit 是 0 则表示这个数据区或者这个 inode 是可以使用的,如果是 1 则表示正在使用中。 + +那么,[inode][17] 又是什么呢 ? 就是 index-node (索引节点)的简写。 inode 是位于磁盘上的一个 256 字节的块,用于存储和该 inode 对应的文件的相关数据。这些数据包含了文件的大小、文件的所有者和所属组的用户的 ID、文件模式(即访问权限)以及三个时间戳用于指定:该文件最后的访问时间、该文件的最后修改时间和该 inode 中的数据的最后修改时间。 + +同时,这个 inode 还包含了指向了其所对应的文件的数据在硬盘中的位置。在 Minix 和 EXT1-3 文件系统中,inode 表示的是一系列的的数据区和块。Minix 文件系统的 inode 支持 9 个数据块包括 7 个直接数据块和 2 个间接数据块。如果你想要更深入的了解,这里有一个优秀的 PDF 详细地描述了 [Minix 文件系统街头][18] 。同时你也可以在维基百科上对 [inode 指针结构][19] 做一个快速的浏览。 + +### EXT + +原生的 [EXT 文件系统][20] (指经过扩展的) 是由 [Rémy Card][21] 编写并于 1992 年与 Linux 一同发行。主要是为了克服 Minix 文件系统中的一些文件大小限制的问题。其中,最主要的结构变化就是文件系统中的元数据。它基于 Unix 文件系统 (UFS),也被称为伯克利快速文件系统(FFS)。我发现只有很少一部分关于 EXT 文件系统的发行信息是可以被验证的,显然这是因为其存在着严重的问题并且它很快地被 EXT2 文件系统取代了。 + +### EXT2 + +[EXT2 文件系统][22] 就相当地成功,它在 Linux 发行版中存活了多年。它是我在 1997 年开始使用 Red Hat Linux 时认识的第一个文件系统。实际上,EXT2 文件系统有着和 EXT 文件系统基本相同的元数据结构。然而 EXT2 更高瞻远瞩,因为其元数据结构之间留有很多磁盘空间供将来使用。 + +和 Minix 类似,EXT2 也有一个[boot 扇区][23] ,它是硬盘驱动安装后的第一个扇区。它包含了少量的 boot 记录和一个分区表。接着 boot 扇区之后是一些保留的空间,它跨越引导记录和通常位于下一个柱面的硬盘驱动器上的第一个分区之间的空间。 [GRUB2] [24] - 也可能是GRUB1 - 将此空间用于其部分启动代码。 + +每个 EXT2 分区中的空间分为各柱面组,它允许更精细地管理数据空间。 根据我的经验,每一组大小通常约为8MB。 下面的图1显示了一个柱面组的基本结构。 柱面中的数据分配单元是块,通常大小为4K。 + +![cylindergroup-01_1.png](https://opensource.com/sites/default/files/images/life-uploads/cylindergroup-01_1.png) + +Figure 1: EXT 文件系统中的柱面组的结构 + +柱面组中的第一个块是一个超级块,它包含了一个定义了其他文件系统的结构并将其定位于物理硬盘的具体分区上的元数据。分区中有一些柱面组还会有备用超级块,但并不是所有的柱面组都有。我们还可以使用例如 **dd** 等磁盘工具来拷贝备用超级块的内容到主超级块上以达到更换损坏超级块的目的。虽然这种情况不会经常发生,但是在几年前我的一个超级块损坏了,我就是用这种方法来修复的。幸好,我很有先见之明地使用了 **dumpe2fs** 命令来备份了我的分区描述符信息到我的系统上。 + +以下是 **dumpe2fs** 命令的一部分输出。这部分输出主要是超级块上包含的一些元数据,同时也是文件系统上的前两个柱面组的数据。 + +``` +# dumpe2fs /dev/sda1 +Filesystem volume name: boot +Last mounted on: /boot +Filesystem UUID: 79fc5ed8-5bbc-4dfe-8359-b7b36be6eed3 +Filesystem magic number: 0xEF53 +Filesystem revision #: 1 (dynamic) +Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir nlink extra_isize +Filesystem flags: signed_directory_hash +Default mount options: user_xattr acl +Filesystem state: clean +Errors behavior: Continue +Filesystem OS type: Linux +Inode count: 122160 +Block count: 488192 +Reserved block count: 24409 +Free blocks: 376512 +Free inodes: 121690 +First block: 0 +Block size: 4096 +Fragment size: 4096 +Group descriptor size: 64 +Reserved GDT blocks: 238 +Blocks per group: 32768 +Fragments per group: 32768 +Inodes per group: 8144 +Inode blocks per group: 509 +Flex block group size: 16 +Filesystem created: Tue Feb 7 09:33:34 2017 +Last mount time: Sat Apr 29 21:42:01 2017 +Last write time: Sat Apr 29 21:42:01 2017 +Mount count: 25 +Maximum mount count: -1 +Last checked: Tue Feb 7 09:33:34 2017 +Check interval: 0 () +Lifetime writes: 594 MB +Reserved blocks uid: 0 (user root) +Reserved blocks gid: 0 (group root) +First inode: 11 +Inode size: 256 +Required extra isize: 32 +Desired extra isize: 32 +Journal inode: 8 +Default directory hash: half_md4 +Directory Hash Seed: c780bac9-d4bf-4f35-b695-0fe35e8d2d60 +Journal backup: inode blocks +Journal features: journal_64bit +Journal size: 32M +Journal length: 8192 +Journal sequence: 0x00000213 +Journal start: 0 + +Group 0: (Blocks 0-32767) + Primary superblock at 0, Group descriptors at 1-1 + Reserved GDT blocks at 2-239 + Block bitmap at 240 (+240) + Inode bitmap at 255 (+255) + Inode table at 270-778 (+270) + 24839 free blocks, 7676 free inodes, 16 directories + Free blocks: 7929-32767 + Free inodes: 440, 470-8144 +Group 1: (Blocks 32768-65535) + Backup superblock at 32768, Group descriptors at 32769-32769 + Reserved GDT blocks at 32770-33007 + Block bitmap at 241 (bg #0 + 241) + Inode bitmap at 256 (bg #0 + 256) + Inode table at 779-1287 (bg #0 + 779) + 8668 free blocks, 8142 free inodes, 2 directories + Free blocks: 33008-33283, 33332-33791, 33974-33975, 34023-34092, 34094-34104, 34526-34687, 34706-34723, 34817-35374, 35421-35844, 35935-36355, 36357-36863, 38912-39935, 39940-40570, 42620-42623, 42655, 42674-42687, 42721-42751, 42798-42815, 42847, 42875-42879, 42918-42943, 42975, 43000-43007, 43519, 43559-44031, 44042-44543, 44545-45055, 45116-45567, 45601-45631, 45658-45663, 45689-45695, 45736-45759, 45802-45823, 45857-45887, 45919, 45950-45951, 45972-45983, 46014-46015, 46057-46079, 46112-46591, 46921-47103, 49152-49395, 50027-50355, 52237-52255, 52285-52287, 52323-52351, 52383, 52450-52479, 52518-52543, 52584-52607, 52652-52671, 52734-52735, 52743-53247 + Free inodes: 8147-16288 +Group 2: (Blocks 65536-98303) + Block bitmap at 242 (bg #0 + 242) + Inode bitmap at 257 (bg #0 + 257) + Inode table at 1288-1796 (bg #0 + 1288) + 6326 free blocks, 8144 free inodes, 0 directories + Free blocks: 67042-67583, 72201-72994, 80185-80349, 81191-81919, 90112-94207 + Free inodes: 16289-24432 +Group 3: (Blocks 98304-131071) + + +``` + +每一个柱面组都有自己的 inode 位图用于判定该柱面组中的哪些 inode 是使用中的而哪些又是未被使用的。每一个柱面组的 inode 都有它们自己的空间。每一个 inode 都包含了对应的文件的相关信息,包括其位于该文件的数据块中的位置。这个块位图纪录了文件系统中的使用中和非使用中的数据块。请注意,在上面的输出中有大量关于文件系统的数据。在非常大的文件系统上,组数据可以运行到数百页的长度。 组元数据包括组中所有空闲数据块的列表。 + +EXT 文件系统实现了数据分配策略以确保产生最少的文件碎片。减少文件碎片可以提高文件系统的性能。这些策略会在下面的 EXT4 中描述到。 + +我所遇见的关于 EXT2 文件系统最大的问题是 **fsck** (文件系统检查) 程序这一环节占用了很长一段时间来定位和校准文件系统中的所有不一致性导致其共花费了数个小时来修复一个崩溃。有一次我的其中一台电脑共花费了 28 个小时在一次崩溃后重新启动时恢复磁盘上,并且是在磁盘被检测量在几百兆字节大小的情况下。 + +### EXT3 + +[EXT3 文件系统][25] 具有克服 **fsck** 程序需要完全恢复在文件更新操作期间发生的不正确关机损坏的磁盘结构所需的大量时间的单一目标。EXT 文件系统的唯一新增是 [日志][26],它将提前记录将对文件系统执行的更改。 磁盘结构的其余部分与 EXT2 中的相同。 + +作为一个先前的版本,除了直接写入数据到磁盘的数据区域外,EXT3 的日志在写入元数据时同时会也写入文件数据到磁盘上的一个指定数据区域。一旦这些数据安全地到达硬盘,它就可以几乎零丢失率地被合并或者被追加到目标文件。当这些数据被提交到磁盘上的数据区域上,这些日志就会随即更新,这样在系统发生故障之前,文件系统将保持一致状态,才能提交日志中的所有数据。在下次启动时,将检查文件系统的不一致性,然后将日志中保留的数据提交到磁盘的数据区,以完成对目标文件的更新。 + +日记功能确实降低了数据写入性能,但是有三个可用于日志的选项,允许用户在性能和数据完整性和安全性之间进行选择。 我的个人更偏向于选择安全性,因为我的环境不需要大量的磁盘写入活动。 + +日志功能减少了在从几小时(甚至几天)到几分钟之间的失败后检查硬盘驱动器所需的时间。 多年来,我遇到了很多问题导致了我的系统崩溃。 要详细说的话恐怕还得再写一篇文章,但这足以说明大多数是我自己造成的,就比如不小心踢掉一个电源插头。 幸运的是,EXT日志文件系统将启动恢复时间缩短到两三分钟。 此外,自从我开始使用带日志记录的EXT3,我从来没有遇到丢失数据的问题。 + +EXT3 的日志功能可以关闭,然后作为 EXT2 文件系统。 该日志本身仍然是存在的,只是状态为空且未使用。 只需使用类型参数使用 mount 命令来 remount 到分区即可指定EXT2 \。 你可以从命令行执行此操作,但是具体还是取决于你正在使用的文件系统,但你可以更改 **/ etc / fstab** 文件中的类型说明符,然后重新启动。 我强烈建议不要将 EXT3文件系统安装为 EXT2 ,因为这会具有丢失数据和增加恢复时间的潜在可能性。 + +EXT2 文件系统可以使用如下命令来通过日志升级到 EXT3 。 + +``` +tune2fs -j /dev/sda1 +``` + + **/dev/sda1** 表示驱动和分区的标识符。同时要注意修改 **/etc/fstab** 中的文件类型标识符并 remount 分区或者重启系统以确保修改生效。 + +### EXT4 + +[EXT4 filesystem][27]主要提高了性能、可靠性和容量。位了提高可靠性,它新增了元数据和日志校验和。同时位了满足各种关键任务要求,文件系统新增了纳秒级别的时间戳。在时间戳字段中添加两个高位来延迟时间戳的 [2038 年的问题][28] ,在 EXT4 文件系统至少可达到 2446 年。 + +在 EXT4 中,数据分配从固定块更改为盘区,盘区由硬盘驱动器上的开始和结束位置来描述。这使得可以在单个 inode 指针条目中描述非常长的物理连续的文件,这可以显着减少描述大文件中所有数据的位置所需的指针数。 EXT4 中已经实施了其他分配策略,以进一步减少碎片化。 + +EXT4 通过将新创建的文件分散在磁盘上,从而使其不会全部聚集在磁盘起始位置,就像早期的PC文件系统一样,减少了碎片。文件分配算法尝试在柱面组中尽可能均匀地扩展文件,并且当需要分段时,要使不连续文件扩展区尽可能靠近同一文件中的其他文件,以尽可能减少头部搜索和旋转等待时间尽可能的当创建新文件或扩展现有文件时,使用其他策略来预分配额外的磁盘空间。这有助于确保扩展文件不会自动导致其分段。新文件不会在现有文件之后立即分配,这也可以防止现有文件的碎片化。 + +除了磁盘上数据的实际位置外,EXT4 使用诸如延迟分配的功能策略,以允许文件系统在分配空间之前收集正在写入磁盘的所有数据。这可以提高数据空间将是连续的可能性。 + +较旧的EXT文件系统(如 EXT2 和 EXT3)可以作为 EXT4 进行 mount ,以使其性能获得较小的提升。不幸的是,这需要关闭 EXT4 的一些重要的新功能,所以我建议不要这样做。 + +自 Fedora 14 以来,EXT4 一直是 Fedora 的默认文件系统。我们可以使用 Fedora 文档中描述的 [procedure ][29] 将EXT3文件系统升级到EXT4,但是由于之前仍然存留d的 EXT3 元数据结构,它的性能仍将受到影响。从 EXT3 升级到 EXT4 的最佳方法是备份目标文件系统分区上的所有数据,使用 **mkfs** 命令将空EXT4文件系统写入分区,然后从备份中恢复所有数据。 + +### Inode + +以前描述的 inode 是EXT文件系统中的元数据的关键组件。 图 2 显示了 inode 和存储在硬盘驱动器上的数据之间的关系。 该图是单个文件的目录和 inode,在这种情况下,可能会产生高度碎片。 EXT 文件系统可以积极地减少碎片,所以不太可能会看到有这么多间接数据块或扩展盘的文件。 实际上,如下所示,EXT文件系统中的碎片非常低,所以大多数 inode 只使用一个或两个直接数据指针,也不使用间接指针。 + +![inodesanddataallocation-01_0.png](https://opensource.com/sites/default/files/images/life-uploads/inodesanddataallocation-01_0.png) + +图 2 :inode 存储有关每个文件的信息,并使 EXT 文件系统能够查找属于它的所有数据。 + +inode 不包含文件的名称。通过目录条目访问文件,目录条目本身是文件的名称,并包含指向 inode 的指针。该指针的值是 inode 号。文件系统中的每个 inode 都具有唯一的 ID 号,但同一台计算机上的其他文件系统(甚至相同的硬盘驱动器)中的 inode 可以具有相同的 inode 号。这对[links][30] 存在影响,但是这个讨论超出了本文的范围。 + +inod e包含有关该文件的元数据,包括其类型和权限以及其大小。 inode 还包含 15 个指针的空格,用于描述柱面组数据部分中数据块或扩展区的位置和长度。十二个指针提供对数据扩展区的直接访问,并且应该足以处理大多数文件。然而,对于具有重大分段的文件,有必要以间接节点的形式具有一些附加功能。从技术上讲,这些不是真正的节点,所以我在这里使用这个术语“节点”来方便。 + +间接节点是文件系统中的正常数据块,它仅用于描述数据而不用于存储元数据,因此可以支持超过 15 个条目。例如,4K 的块大小可以支持 512 个 4 字节间接节点,允许单个文件的 **12(直接)+ 512(间接)= 524** 范围。还支持双重和三重间接节点支持,但我们大多数人不太可能遇到需要许多扩展的文件。 + +### 数据碎片 + +对于许多较旧的 PC 文件系统,如 FAT(及其所有变体)和 NTFS,碎片一直是导致磁盘性能下降的重大问题。 碎片整理对于其本身和一些专门的整理软件来说已经称为了一项专门的工程,其效果范围从非常有效到仅仅是微乎其微。 + +Linux 的扩展文件系统使用数据分配策略,有助于最小化硬盘驱动器上的文件碎片,并在发生碎片时减少碎片的影响。 你可以使用 EXT 文件系统上的 **fsck** 命令检查文件系统的整体碎片。 以下示例检查主工作站的主目录,只有 1.5% 的碎片。 确保使用 **- n** 参数,因为它会阻止 **fsck** 对扫描文件系统采取的任何操作。 + +``` +fsck -fn /dev/mapper/vg_01-home +``` + +我曾经进行过一些理论计算,以确定磁盘碎片整理是否会导致任何明显的性能提升。 虽然我做了一些假设,我使用的磁盘性能数据来自一个新的 300GB 的西部数字硬盘驱动器,具有 2.0ms 的追踪到追踪时间。 此示例中的文件数是在计算当天文件系统中存在的实际数。 我假设有相当大量的碎片文件(约 20%)每天都会被触动。 + +| **Total files** | **271,794** | +|--|--| +| % fragmentation | 5.00% | +| Discontinuities | 13,590 | +|   |   | +| % fragmented files touched per day | 20% (assume) | +| Number of additional seeks | 2,718 | +| Average seek time | 10.90 ms | +| Total additional seek time per day | 29.63 sec | +|   | 0.49 min | +|   |   | +| Track-to-track seek time | 2.00 ms | +| Total additional seek time per day | 5.44 sec | +|   | 0.091 min | + +表 1: 碎片对磁盘性能的理论影响 + +我对每天的全部追加寻道时间进行了两次计算,一次是单磁道寻道时间,这是由于EXT文件分配策略而导致大多数文件的可能性更大的情况,一个是平均搜索时间,我认为这将是一个公平的最坏情况。 + +从表 1 可以看出,对绝大多数应用程序而言,碎片化对具有甚至适度性能的硬盘驱动器的现代EXT文件系统的影响将是微乎其微的。您可以将您的环境中的数字插入到您自己的类似电子表格中,以了解你对性能影响的期望。这种类型的计算不一定能够代表实际的性能,但它可以提供一些洞察碎片化及其对系统的理论影响。 + +我的大部分分区的碎片率都在 1.5% 左右或 1.6%,我有一个分区有 3.3% 的碎片,但是这是一个大的 128GB 文件系统,具有少于100 个非常大的 ISO 映像文件; 多年来,我不得不扩张分区,因为它已经太满了。 + +这并不是说一些应用的环境不需要更多的保证,甚至更少的碎片。 EXT 文件系统可以由有经验和知识的管理员小心调整,管理员可以调整参数以抵消特定的工作负载类型。这个工作可以在文件系统创建的时候或稍后使用 **tune2fs** 命令时完成。每一次调整变化的结果应进行测试,精心的记录和分析,以确保目标环境的最佳性能。在最坏的情况下,如果性能不能提高到期望的水平,则其他文件系统类型可能更适合特定的工作负载。并记住,在单个主机系统上使用混合文件系统类型以匹配放在每个文件系统上的负载是常见的。 + +由于大多数 EXT 文件系统的碎片数量较少,因此无需进行碎片整理。在任何情况下,EXT 文件系统都没有安全的碎片整理工具。有几个工具允许你检查单个文件的碎片或文件系统中剩余可用空间的碎片。有一个工具,**e4defrag**,它将对剩余可用空间允许的文件,目录或文件系统进行碎片整理。顾名思义,它只适用于 EXT4 文件系统中的文件,并且它还有一其它的些限制。 + +如果有必要在 EXT 文件系统上执行完整的碎片整理,则只有一种方法能够可靠地工作。你必须将文件系统中的所有要进行碎片整理的文件在确保在安全复制到其他位置后将其删除。如果可能,你可以增加文件系统的大小,以帮助减少将来的碎片。然后将文件复制回目标文件系统。但是其实即使这样也不能保证所有文件都被完全碎片整理。 + +### 总结 + +EXT 文件系统在一些 Linux 发行版本上作为默认文件系统已经超过二十多年了。它们用最少的维护代价提供了稳定性、高可用性、可靠性和其他各种表现。我尝试过一些其它的文件系统但最终都还是回归到 EXT。每一个我在工作中使用到 Linux 的地方都使用到了 EXT 文件系统,同时发现了它们适用于任何主流的负载。毫无疑问,EXT4 文件系统应该被用于大部分的 Linux 文件系统上,除非我们有明显的使用其它文件系统的理由。 + +-------------------------------------------------------------------------------- + +作者简介: + +David Both - David Both 是一名 Linux 于开源的贡献者,目前居住在北卡罗莱纳州的罗利。他从事 IT 行业有 40 余年并在 IBM 中从事 OS/2 培训约 20 余年。在 IBM 就职期间,他在 1981 年为最早的 IBM PC 写了一个培训课程。他已经为红帽教授了 RHCE 课程,曾在 MCI Worldcom,思科和北卡罗来纳州工作。 他使用 Linux 和开源软件工作了近 20 年。 + +------------------- + +via: https://opensource.com/article/17/5/introduction-ext4-filesystem + +作者:[David Both ][a] +译者:[chenxinlong](https://github.com/chenxinlong) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/dboth +[1]:https://opensource.com/resources/what-is-linux?src=linux_resource_menu +[2]:https://opensource.com/resources/what-are-linux-containers?src=linux_resource_menu +[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=7016000000127cYAAQ +[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?src=linux_resource_menu&intcmp=7016000000127cYAAQ +[5]:https://opensource.com/tags/linux?src=linux_resource_menu +[6]:https://en.wikipedia.org/wiki/Boot_sector +[7]:https://opensource.com/article/17/5/introduction-ext4-filesystem?rate=B4QU3W_JYmEKsIKZf5yqMpztt7CRF6uzC0wfNBidEbs +[8]:https://www.flickr.com/photos/wwarby/11644168395 +[9]:https://www.flickr.com/photos/wwarby/11644168395 +[10]:https://opensource.com/users/jason-baker +[11]:https://creativecommons.org/licenses/by/2.0/ +[12]:https://opensource.com/life/16/10/introduction-linux-filesystems +[13]:https://opensource.com/life/15/9/everything-is-a-file +[14]:https://en.wikipedia.org/wiki/MINIX_file_system +[15]:https://en.wikipedia.org/wiki/Andrew_S._Tanenbaum +[16]:https://en.wikipedia.org/wiki/MINIX +[17]:https://en.wikipedia.org/wiki/Inode +[18]:http://ohm.hgesser.de/sp-ss2012/Intro-MinixFS.pdf +[19]:https://en.wikipedia.org/wiki/Inode_pointer_structure +[20]:https://en.wikipedia.org/wiki/Extended_file_system +[21]:https://en.wikipedia.org/wiki/R%C3%A9my_Card +[22]:https://en.wikipedia.org/wiki/Ext2 +[23]:https://en.wikipedia.org/wiki/Boot_sector +[24]:https://opensource.com/article/17/2/linux-boot-and-startup +[25]:https://en.wikipedia.org/wiki/Ext3 +[26]:https://en.wikipedia.org/wiki/Journaling_file_system +[27]:https://en.wikipedia.org/wiki/Ext4 +[28]:https://en.wikipedia.org/wiki/Year_2038_problem +[29]:https://docs.fedoraproject.org/en-US/Fedora/14/html/Storage_Administration_Guide/ext4converting.html +[30]:https://en.wikipedia.org/wiki/Hard_link +[31]:https://opensource.com/user/14106/feed +[32]:https://opensource.com/article/17/5/introduction-ext4-filesystem#comments +[33]:https://opensource.com/users/dboth From ec3c7e37214d358f159a444d11f4634a07c9463c Mon Sep 17 00:00:00 2001 From: cinlen_0x05 <237448382@qq.com> Date: Sat, 24 Jun 2017 23:30:20 +0800 Subject: [PATCH 0505/1407] remove the bullet symbol --- ...introduction to Linux s EXT4 filesystem.md | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) diff --git a/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md b/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md index 3bbd63ff73..25e27d187e 100644 --- a/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md +++ b/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md @@ -1,7 +1,7 @@ Linux 的 EXT4 文件系统简介 ============================================================ -### 让我们大概地从 EXT4 的历史、特性以及最佳实践这几个方面来学习它和之前的所有的 EXT 文件系统有何不同。 +### 让我们大概地从 EXT4 的历史、特性以及最佳实践这几个方面来学习它和之前的所有的 EXT 文件系统有何不同。 ![An introduction to the EXT4 filesystem](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/hard_drives.png?itok=yZWyaSO6 "An introduction to the EXT4 filesystem") >图片来自 : [WIlliam][8][ Warby][9]. 由 [Jason Baker][10] 编辑. Creative Commons [BY-SA 2.0][11]. @@ -10,7 +10,7 @@ Linux 的 EXT4 文件系统简介 1. **数据存储:** 对于任何一个文件系统来说,一个最主要的功能就是能够被当作一个容器结构来存储和恢复数据。 -2. **命名空间:** 命名空间是一个提供了命名规则和数据结构的用于命名与组织的方法学。 +2. **命名空间:** 命名空间是一个提供了命名规则和数据结构的用于命名与组织的方法学。 3. **安全模型:** 一个用于定义访问权限的策略。 @@ -18,7 +18,7 @@ Linux 的 EXT4 文件系统简介 5. **实现:** 能够实现以上几点的软件。 -本文内容的讨论主要集中于上述几点中的第一项并探索为一个 EXT 文件系统的数据存储提供逻辑框架的元数据结构。 +本文内容的讨论主要集中于上述几点中的第一项并探索为一个 EXT 文件系统的数据存储提供逻辑框架的元数据结构。 ### EXT 文件系统历史 @@ -32,9 +32,9 @@ Minix 有以下这些结构,其中的大部分位于生成文件系统的分 * [**boot 扇区**][6] 是硬盘驱动安装后的第一个扇区。这个 boot 块包含了一个非常小的 boot 记录和一个分区表。 -* 每一个分区的第一个块都是一个包含了元数据的 **superblock** ,这些元数据定义了其他文件系统的结构并将其定位于物理硬盘的具体分区上。 +* 每一个分区的第一个块都是一个包含了元数据的 **superblock** ,这些元数据定义了其他文件系统的结构并将其定位于物理硬盘的具体分区上。 -* 一个 **inode 位图块** 决定了哪些 inode 是在使用中的,哪一些是未使用的。 +* 一个 **inode 位图块** 决定了哪些 inode 是在使用中的,哪一些是未使用的。 * **inode** 在硬盘上有它们自己的空间。每一个 inode 都包含了一个文件的信息包括其所处的数据块的位置,也就是该文件所处的区域。 @@ -44,19 +44,19 @@ Minix 有以下这些结构,其中的大部分位于生成文件系统的分 对上述了两种位图类型来说,一个 bit 表示一个制定的数据区或者一个指定的 inode. 如果这个 bit 是 0 则表示这个数据区或者这个 inode 是可以使用的,如果是 1 则表示正在使用中。 -那么,[inode][17] 又是什么呢 ? 就是 index-node (索引节点)的简写。 inode 是位于磁盘上的一个 256 字节的块,用于存储和该 inode 对应的文件的相关数据。这些数据包含了文件的大小、文件的所有者和所属组的用户的 ID、文件模式(即访问权限)以及三个时间戳用于指定:该文件最后的访问时间、该文件的最后修改时间和该 inode 中的数据的最后修改时间。 +那么,[inode][17] 又是什么呢 ? 就是 index-node (索引节点)的简写。 inode 是位于磁盘上的一个 256 字节的块,用于存储和该 inode 对应的文件的相关数据。这些数据包含了文件的大小、文件的所有者和所属组的用户的 ID、文件模式(即访问权限)以及三个时间戳用于指定:该文件最后的访问时间、该文件的最后修改时间和该 inode 中的数据的最后修改时间。 同时,这个 inode 还包含了指向了其所对应的文件的数据在硬盘中的位置。在 Minix 和 EXT1-3 文件系统中,inode 表示的是一系列的的数据区和块。Minix 文件系统的 inode 支持 9 个数据块包括 7 个直接数据块和 2 个间接数据块。如果你想要更深入的了解,这里有一个优秀的 PDF 详细地描述了 [Minix 文件系统街头][18] 。同时你也可以在维基百科上对 [inode 指针结构][19] 做一个快速的浏览。 ### EXT -原生的 [EXT 文件系统][20] (指经过扩展的) 是由 [Rémy Card][21] 编写并于 1992 年与 Linux 一同发行。主要是为了克服 Minix 文件系统中的一些文件大小限制的问题。其中,最主要的结构变化就是文件系统中的元数据。它基于 Unix 文件系统 (UFS),也被称为伯克利快速文件系统(FFS)。我发现只有很少一部分关于 EXT 文件系统的发行信息是可以被验证的,显然这是因为其存在着严重的问题并且它很快地被 EXT2 文件系统取代了。 +原生的 [EXT 文件系统][20] (指经过扩展的) 是由 [Rémy Card][21] 编写并于 1992 年与 Linux 一同发行。主要是为了克服 Minix 文件系统中的一些文件大小限制的问题。其中,最主要的结构变化就是文件系统中的元数据。它基于 Unix 文件系统 (UFS),也被称为伯克利快速文件系统(FFS)。我发现只有很少一部分关于 EXT 文件系统的发行信息是可以被验证的,显然这是因为其存在着严重的问题并且它很快地被 EXT2 文件系统取代了。 ### EXT2 [EXT2 文件系统][22] 就相当地成功,它在 Linux 发行版中存活了多年。它是我在 1997 年开始使用 Red Hat Linux 时认识的第一个文件系统。实际上,EXT2 文件系统有着和 EXT 文件系统基本相同的元数据结构。然而 EXT2 更高瞻远瞩,因为其元数据结构之间留有很多磁盘空间供将来使用。 -和 Minix 类似,EXT2 也有一个[boot 扇区][23] ,它是硬盘驱动安装后的第一个扇区。它包含了少量的 boot 记录和一个分区表。接着 boot 扇区之后是一些保留的空间,它跨越引导记录和通常位于下一个柱面的硬盘驱动器上的第一个分区之间的空间。 [GRUB2] [24] - 也可能是GRUB1 - 将此空间用于其部分启动代码。 +和 Minix 类似,EXT2 也有一个[boot 扇区][23] ,它是硬盘驱动安装后的第一个扇区。它包含了少量的 boot 记录和一个分区表。接着 boot 扇区之后是一些保留的空间,它跨越引导记录和通常位于下一个柱面的硬盘驱动器上的第一个分区之间的空间。 [GRUB2] [24] - 也可能是GRUB1 - 将此空间用于其部分启动代码。 每个 EXT2 分区中的空间分为各柱面组,它允许更精细地管理数据空间。 根据我的经验,每一组大小通常约为8MB。 下面的图1显示了一个柱面组的基本结构。 柱面中的数据分配单元是块,通常大小为4K。 @@ -150,21 +150,21 @@ Group 3: (Blocks 98304-131071) ``` -每一个柱面组都有自己的 inode 位图用于判定该柱面组中的哪些 inode 是使用中的而哪些又是未被使用的。每一个柱面组的 inode 都有它们自己的空间。每一个 inode 都包含了对应的文件的相关信息,包括其位于该文件的数据块中的位置。这个块位图纪录了文件系统中的使用中和非使用中的数据块。请注意,在上面的输出中有大量关于文件系统的数据。在非常大的文件系统上,组数据可以运行到数百页的长度。 组元数据包括组中所有空闲数据块的列表。 +每一个柱面组都有自己的 inode 位图用于判定该柱面组中的哪些 inode 是使用中的而哪些又是未被使用的。每一个柱面组的 inode 都有它们自己的空间。每一个 inode 都包含了对应的文件的相关信息,包括其位于该文件的数据块中的位置。这个块位图纪录了文件系统中的使用中和非使用中的数据块。请注意,在上面的输出中有大量关于文件系统的数据。在非常大的文件系统上,组数据可以运行到数百页的长度。 组元数据包括组中所有空闲数据块的列表。 EXT 文件系统实现了数据分配策略以确保产生最少的文件碎片。减少文件碎片可以提高文件系统的性能。这些策略会在下面的 EXT4 中描述到。 -我所遇见的关于 EXT2 文件系统最大的问题是 **fsck** (文件系统检查) 程序这一环节占用了很长一段时间来定位和校准文件系统中的所有不一致性导致其共花费了数个小时来修复一个崩溃。有一次我的其中一台电脑共花费了 28 个小时在一次崩溃后重新启动时恢复磁盘上,并且是在磁盘被检测量在几百兆字节大小的情况下。 +我所遇见的关于 EXT2 文件系统最大的问题是 **fsck** (文件系统检查) 程序这一环节占用了很长一段时间来定位和校准文件系统中的所有不一致性导致其共花费了数个小时来修复一个崩溃。有一次我的其中一台电脑共花费了 28 个小时在一次崩溃后重新启动时恢复磁盘上,并且是在磁盘被检测量在几百兆字节大小的情况下。 ### EXT3 [EXT3 文件系统][25] 具有克服 **fsck** 程序需要完全恢复在文件更新操作期间发生的不正确关机损坏的磁盘结构所需的大量时间的单一目标。EXT 文件系统的唯一新增是 [日志][26],它将提前记录将对文件系统执行的更改。 磁盘结构的其余部分与 EXT2 中的相同。 -作为一个先前的版本,除了直接写入数据到磁盘的数据区域外,EXT3 的日志在写入元数据时同时会也写入文件数据到磁盘上的一个指定数据区域。一旦这些数据安全地到达硬盘,它就可以几乎零丢失率地被合并或者被追加到目标文件。当这些数据被提交到磁盘上的数据区域上,这些日志就会随即更新,这样在系统发生故障之前,文件系统将保持一致状态,才能提交日志中的所有数据。在下次启动时,将检查文件系统的不一致性,然后将日志中保留的数据提交到磁盘的数据区,以完成对目标文件的更新。 +作为一个先前的版本,除了直接写入数据到磁盘的数据区域外,EXT3 的日志在写入元数据时同时会也写入文件数据到磁盘上的一个指定数据区域。一旦这些数据安全地到达硬盘,它就可以几乎零丢失率地被合并或者被追加到目标文件。当这些数据被提交到磁盘上的数据区域上,这些日志就会随即更新,这样在系统发生故障之前,文件系统将保持一致状态,才能提交日志中的所有数据。在下次启动时,将检查文件系统的不一致性,然后将日志中保留的数据提交到磁盘的数据区,以完成对目标文件的更新。 日记功能确实降低了数据写入性能,但是有三个可用于日志的选项,允许用户在性能和数据完整性和安全性之间进行选择。 我的个人更偏向于选择安全性,因为我的环境不需要大量的磁盘写入活动。 -日志功能减少了在从几小时(甚至几天)到几分钟之间的失败后检查硬盘驱动器所需的时间。 多年来,我遇到了很多问题导致了我的系统崩溃。 要详细说的话恐怕还得再写一篇文章,但这足以说明大多数是我自己造成的,就比如不小心踢掉一个电源插头。 幸运的是,EXT日志文件系统将启动恢复时间缩短到两三分钟。 此外,自从我开始使用带日志记录的EXT3,我从来没有遇到丢失数据的问题。 +日志功能减少了在从几小时(甚至几天)到几分钟之间的失败后检查硬盘驱动器所需的时间。 多年来,我遇到了很多问题导致了我的系统崩溃。要详细说的话恐怕还得再写一篇文章,但这足以说明大多数是我自己造成的,就比如不小心踢掉一个电源插头。 幸运的是,EXT日志文件系统将启动恢复时间缩短到两三分钟。 此外,自从我开始使用带日志记录的EXT3,我从来没有遇到丢失数据的问题。 EXT3 的日志功能可以关闭,然后作为 EXT2 文件系统。 该日志本身仍然是存在的,只是状态为空且未使用。 只需使用类型参数使用 mount 命令来 remount 到分区即可指定EXT2 \。 你可以从命令行执行此操作,但是具体还是取决于你正在使用的文件系统,但你可以更改 **/ etc / fstab** 文件中的类型说明符,然后重新启动。 我强烈建议不要将 EXT3文件系统安装为 EXT2 ,因为这会具有丢失数据和增加恢复时间的潜在可能性。 @@ -174,15 +174,15 @@ EXT2 文件系统可以使用如下命令来通过日志升级到 EXT3 。 tune2fs -j /dev/sda1 ``` - **/dev/sda1** 表示驱动和分区的标识符。同时要注意修改 **/etc/fstab** 中的文件类型标识符并 remount 分区或者重启系统以确保修改生效。 + **/dev/sda1** 表示驱动和分区的标识符。同时要注意修改 **/etc/fstab** 中的文件类型标识符并 remount 分区或者重启系统以确保修改生效。 ### EXT4 -[EXT4 filesystem][27]主要提高了性能、可靠性和容量。位了提高可靠性,它新增了元数据和日志校验和。同时位了满足各种关键任务要求,文件系统新增了纳秒级别的时间戳。在时间戳字段中添加两个高位来延迟时间戳的 [2038 年的问题][28] ,在 EXT4 文件系统至少可达到 2446 年。 +[EXT4 filesystem][27]主要提高了性能、可靠性和容量。位了提高可靠性,它新增了元数据和日志校验和。同时位了满足各种关键任务要求,文件系统新增了纳秒级别的时间戳。在时间戳字段中添加两个高位来延迟时间戳的 [2038 年的问题][28] ,在 EXT4 文件系统至少可达到 2446 年。 在 EXT4 中,数据分配从固定块更改为盘区,盘区由硬盘驱动器上的开始和结束位置来描述。这使得可以在单个 inode 指针条目中描述非常长的物理连续的文件,这可以显着减少描述大文件中所有数据的位置所需的指针数。 EXT4 中已经实施了其他分配策略,以进一步减少碎片化。 -EXT4 通过将新创建的文件分散在磁盘上,从而使其不会全部聚集在磁盘起始位置,就像早期的PC文件系统一样,减少了碎片。文件分配算法尝试在柱面组中尽可能均匀地扩展文件,并且当需要分段时,要使不连续文件扩展区尽可能靠近同一文件中的其他文件,以尽可能减少头部搜索和旋转等待时间尽可能的当创建新文件或扩展现有文件时,使用其他策略来预分配额外的磁盘空间。这有助于确保扩展文件不会自动导致其分段。新文件不会在现有文件之后立即分配,这也可以防止现有文件的碎片化。 +EXT4 通过将新创建的文件分散在磁盘上,从而使其不会全部聚集在磁盘起始位置,就像早期的PC文件系统一样,减少了碎片。文件分配算法尝试在柱面组中尽可能均匀地扩展文件,并且当需要分段时,要使不连续文件扩展区尽可能靠近同一文件中的其他文件,以尽可能减少头部搜索和旋转等待时间尽可能的当创建新文件或扩展现有文件时,使用其他策略来预分配额外的磁盘空间。这有助于确保扩展文件不会自动导致其分段。新文件不会在现有文件之后立即分配,这也可以防止现有文件的碎片化。 除了磁盘上数据的实际位置外,EXT4 使用诸如延迟分配的功能策略,以允许文件系统在分配空间之前收集正在写入磁盘的所有数据。这可以提高数据空间将是连续的可能性。 @@ -206,7 +206,7 @@ inod e包含有关该文件的元数据,包括其类型和权限以及其大 ### 数据碎片 -对于许多较旧的 PC 文件系统,如 FAT(及其所有变体)和 NTFS,碎片一直是导致磁盘性能下降的重大问题。 碎片整理对于其本身和一些专门的整理软件来说已经称为了一项专门的工程,其效果范围从非常有效到仅仅是微乎其微。 +对于许多较旧的 PC 文件系统,如 FAT(及其所有变体)和 NTFS,碎片一直是导致磁盘性能下降的重大问题。 碎片整理对于其本身和一些专门的整理软件来说已经称为了一项专门的工程,其效果范围从非常有效到仅仅是微乎其微。 Linux 的扩展文件系统使用数据分配策略,有助于最小化硬盘驱动器上的文件碎片,并在发生碎片时减少碎片的影响。 你可以使用 EXT 文件系统上的 **fsck** 命令检查文件系统的整体碎片。 以下示例检查主工作站的主目录,只有 1.5% 的碎片。 确保使用 **- n** 参数,因为它会阻止 **fsck** 对扫描文件系统采取的任何操作。 @@ -241,13 +241,13 @@ fsck -fn /dev/mapper/vg_01-home 这并不是说一些应用的环境不需要更多的保证,甚至更少的碎片。 EXT 文件系统可以由有经验和知识的管理员小心调整,管理员可以调整参数以抵消特定的工作负载类型。这个工作可以在文件系统创建的时候或稍后使用 **tune2fs** 命令时完成。每一次调整变化的结果应进行测试,精心的记录和分析,以确保目标环境的最佳性能。在最坏的情况下,如果性能不能提高到期望的水平,则其他文件系统类型可能更适合特定的工作负载。并记住,在单个主机系统上使用混合文件系统类型以匹配放在每个文件系统上的负载是常见的。 -由于大多数 EXT 文件系统的碎片数量较少,因此无需进行碎片整理。在任何情况下,EXT 文件系统都没有安全的碎片整理工具。有几个工具允许你检查单个文件的碎片或文件系统中剩余可用空间的碎片。有一个工具,**e4defrag**,它将对剩余可用空间允许的文件,目录或文件系统进行碎片整理。顾名思义,它只适用于 EXT4 文件系统中的文件,并且它还有一其它的些限制。 +由于大多数 EXT 文件系统的碎片数量较少,因此无需进行碎片整理。在任何情况下,EXT 文件系统都没有安全的碎片整理工具。有几个工具允许你检查单个文件的碎片或文件系统中剩余可用空间的碎片。有一个工具,**e4defrag**,它将对剩余可用空间允许的文件,目录或文件系统进行碎片整理。顾名思义,它只适用于 EXT4 文件系统中的文件,并且它还有一其它的些限制。 -如果有必要在 EXT 文件系统上执行完整的碎片整理,则只有一种方法能够可靠地工作。你必须将文件系统中的所有要进行碎片整理的文件在确保在安全复制到其他位置后将其删除。如果可能,你可以增加文件系统的大小,以帮助减少将来的碎片。然后将文件复制回目标文件系统。但是其实即使这样也不能保证所有文件都被完全碎片整理。 +如果有必要在 EXT 文件系统上执行完整的碎片整理,则只有一种方法能够可靠地工作。你必须将文件系统中的所有要进行碎片整理的文件在确保在安全复制到其他位置后将其删除。如果可能,你可以增加文件系统的大小,以帮助减少将来的碎片。然后将文件复制回目标文件系统。但是其实即使这样也不能保证所有文件都被完全碎片整理。 ### 总结 -EXT 文件系统在一些 Linux 发行版本上作为默认文件系统已经超过二十多年了。它们用最少的维护代价提供了稳定性、高可用性、可靠性和其他各种表现。我尝试过一些其它的文件系统但最终都还是回归到 EXT。每一个我在工作中使用到 Linux 的地方都使用到了 EXT 文件系统,同时发现了它们适用于任何主流的负载。毫无疑问,EXT4 文件系统应该被用于大部分的 Linux 文件系统上,除非我们有明显的使用其它文件系统的理由。 +EXT 文件系统在一些 Linux 发行版本上作为默认文件系统已经超过二十多年了。它们用最少的维护代价提供了稳定性、高可用性、可靠性和其他各种表现。我尝试过一些其它的文件系统但最终都还是回归到 EXT。每一个我在工作中使用到 Linux 的地方都使用到了 EXT 文件系统,同时发现了它们适用于任何主流的负载。毫无疑问,EXT4 文件系统应该被用于大部分的 Linux 文件系统上,除非我们有明显的使用其它文件系统的理由。 -------------------------------------------------------------------------------- From 5c1d4d4d3a3181375913a0fe8686b8eaa2dc7841 Mon Sep 17 00:00:00 2001 From: cinlen_0x05 <237448382@qq.com> Date: Sun, 25 Jun 2017 10:01:06 +0800 Subject: [PATCH 0506/1407] translated (#5726) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit * 取消翻译,此篇其他平台已经有译文了 * translating by chenxinlong * deleted article removed by origin * translating * translating * keep translating * keep updating * keep updating * keep updating * keep updating * add content * finished translating * move to translated * mv to translated * remove the bullet symbol --- ...introduction to Linux s EXT4 filesystem.md | 302 ------------------ ...introduction to Linux s EXT4 filesystem.md | 301 +++++++++++++++++ 2 files changed, 301 insertions(+), 302 deletions(-) delete mode 100644 sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md create mode 100644 translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md diff --git a/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md b/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md deleted file mode 100644 index ecb2084da7..0000000000 --- a/sources/tech/20170525 An introduction to Linux s EXT4 filesystem.md +++ /dev/null @@ -1,302 +0,0 @@ -Translating by chenxinlong -An introduction to Linux's EXT4 filesystem -============================================================ - -### Take a walk through EXT4's history, features, and optimal use, and learn how it differs from previous iterations of the EXT filesystem. - - -![An introduction to the EXT4 filesystem](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/hard_drives.png?itok=yZWyaSO6 "An introduction to the EXT4 filesystem") ->Image credits : [WIlliam][8][ Warby][9]. Modified by [Jason Baker][10]. Creative Commons [BY-SA 2.0][11]. - -In previous articles about Linux filesystems, I wrote [an introduction to Linux filesystems][12] and about some higher-level concepts such as [everything is a file][13]. I want to go into more detail about the specifics of the EXT filesystems, but first, let's answer the question, "What is a filesystem?" A filesystem is all of the following: - -1. **Data storage: **The primary function of any filesystem is to be a structured place to store and retrieve data. - -2. **Namespace: **A naming and organizational methodology that provides rules for naming and structuring data. - -3. **Security model: **A scheme for defining access rights. - -4. **API: **System function calls to manipulate filesystem objects like directories and files. - -5. **Implementation: **The software to implement the above. - -This article concentrates on the first item in the list and explores the metadata structures that provide the logical framework for data storage in an EXT filesystem. - -### EXT filesystem history - -Although written for Linux, the EXT filesystem has its roots in the Minix operating system and the Minix filesystem, which predate Linux by about five years, being first released in 1987\. Understanding the EXT4 filesystem is much easier if we look at the history and technical evolution of the EXT filesystem family from its Minix roots. - -### Minix - -When writing the original Linux kernel, Linus Torvalds needed a filesystem but didn't want to write one then. So he simply included the [Minix filesystem][14], which had been written by [Andrew S. Tanenbaum][15] and was a part of Tanenbaum's Minix operating system. [Minix][16] was a Unix-like operating system written for educational purposes. Its code was freely available and appropriately licensed to allow Torvalds to include it in his first version of Linux. - -Minix has the following structures, most of which are located in the partition where the filesystem is generated: - -* A [**boot sector**][6] in the first sector of the hard drive on which it is installed. The boot block includes a very small boot record and a partition table. - -* The first block in each partition is a **superblock **that contains the metadata that defines the other filesystem structures and locates them on the physical disk assigned to the partition. - -* An **inode bitmap block**, which determines which inodes are used and which are free. - -* The **inodes**, which have their own space on the disk. Each inode contains information about one file, including the locations of the data blocks, i.e., zones belonging to the file. - -* A **zone bitmap** to keep track of the used and free data zones. - -* A **data zone**, in which the data is actually stored. - -For both types of bitmaps, one bit represents one specific data zone or one specific inode. If the bit is zero, the zone or inode is free and available for use, but if the bit is one, the data zone or inode is in use. - -What is an [inode][17]? Short for index-node, an inode is a 256-byte block on the disk and stores data about the file. This includes the file's size; the user IDs of the file's user and group owners; the file mode (i.e., the access permissions); and three timestamps specifying the time and date that: the file was last accessed, last modified, and the data in the inode was last modified. - -The inode also contains data that points to the location of the file's data on the hard drive. In Minix and the EXT1-3 filesystems, this is a list of data zones or blocks. The Minix filesystem inodes supported nine data blocks, seven direct and two indirect. If you'd like to learn more, there is an excellent PDF with a detailed description of the [Minix filesystem structure][18] and a quick overview of the [inode pointer structure][19] on Wikipedia. - -### EXT - -The original [EXT filesystem][20] (Extended) was written by [Rémy Card][21] and released with Linux in 1992 to overcome some size limitations of the Minix filesystem. The primary structural changes were to the metadata of the filesystem, which was based on the Unix filesystem (UFS), which is also known as the Berkeley Fast File System (FFS). I found very little published information about the EXT filesystem that can be verified, apparently because it had significant problems and was quickly superseded by the EXT2 filesystem. - -### EXT2 - -The [EXT2 filesystem][22] was quite successful. It was used in Linux distributions for many years, and it was the first filesystem I encountered when I started using Red Hat Linux 5.0 back in about 1997\. The EXT2 filesystem has essentially the same metadata structures as the EXT filesystem, however EXT2 is more forward-looking, in that a lot of disk space is left between the metadata structures for future use. - -Like Minix, EXT2 has a [boot sector][23] in the first sector of the hard drive on which it is installed, which includes a very small boot record and a partition table. Then there is some reserved space after the boot sector, which spans the space between the boot record and the first partition on the hard drive that is usually on the next cylinder boundary. [GRUB2][24]—and possibly GRUB1—uses this space for part of its boot code. - -The space in each EXT2 partition is divided into cylinder groups that allow for more granular management of the data space. In my experience, the group size usually amounts to about 8MB. Figure 1, below, shows the basic structure of a cylinder group. The data allocation unit in a cylinder is the block, which is usually 4K in size. - -![cylindergroup-01_1.png](https://opensource.com/sites/default/files/images/life-uploads/cylindergroup-01_1.png) - -Figure 1: The structure of a cylinder group in the EXT filesystems - -The first block in the cylinder group is a superblock, which contains the metadata that defines the other filesystem structures and locates them on the physical disk. Some of the additional groups in the partition will have backup superblocks, but not all. A damaged superblock can be replaced by using a disk utility such as **dd** to copy the contents of a backup superblock to the primary superblock. It does not happen often, but once, many years ago, I had a damaged superblock, and I was able to restore its contents using one of the backup superblocks. Fortunately, I had been foresighted and used the **dumpe2fs** command to dump the descriptor information of the partitions on my system. - -Following is the partial output from the **dumpe2fs** command. It shows the metadata contained in the superblock, as well as data about each of the first two cylinder groups in the filesystem. - -``` -# dumpe2fs /dev/sda1 -Filesystem volume name: boot -Last mounted on: /boot -Filesystem UUID: 79fc5ed8-5bbc-4dfe-8359-b7b36be6eed3 -Filesystem magic number: 0xEF53 -Filesystem revision #: 1 (dynamic) -Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir nlink extra_isize -Filesystem flags: signed_directory_hash -Default mount options: user_xattr acl -Filesystem state: clean -Errors behavior: Continue -Filesystem OS type: Linux -Inode count: 122160 -Block count: 488192 -Reserved block count: 24409 -Free blocks: 376512 -Free inodes: 121690 -First block: 0 -Block size: 4096 -Fragment size: 4096 -Group descriptor size: 64 -Reserved GDT blocks: 238 -Blocks per group: 32768 -Fragments per group: 32768 -Inodes per group: 8144 -Inode blocks per group: 509 -Flex block group size: 16 -Filesystem created: Tue Feb 7 09:33:34 2017 -Last mount time: Sat Apr 29 21:42:01 2017 -Last write time: Sat Apr 29 21:42:01 2017 -Mount count: 25 -Maximum mount count: -1 -Last checked: Tue Feb 7 09:33:34 2017 -Check interval: 0 () -Lifetime writes: 594 MB -Reserved blocks uid: 0 (user root) -Reserved blocks gid: 0 (group root) -First inode: 11 -Inode size: 256 -Required extra isize: 32 -Desired extra isize: 32 -Journal inode: 8 -Default directory hash: half_md4 -Directory Hash Seed: c780bac9-d4bf-4f35-b695-0fe35e8d2d60 -Journal backup: inode blocks -Journal features: journal_64bit -Journal size: 32M -Journal length: 8192 -Journal sequence: 0x00000213 -Journal start: 0 - -Group 0: (Blocks 0-32767) - Primary superblock at 0, Group descriptors at 1-1 - Reserved GDT blocks at 2-239 - Block bitmap at 240 (+240) - Inode bitmap at 255 (+255) - Inode table at 270-778 (+270) - 24839 free blocks, 7676 free inodes, 16 directories - Free blocks: 7929-32767 - Free inodes: 440, 470-8144 -Group 1: (Blocks 32768-65535) - Backup superblock at 32768, Group descriptors at 32769-32769 - Reserved GDT blocks at 32770-33007 - Block bitmap at 241 (bg #0 + 241) - Inode bitmap at 256 (bg #0 + 256) - Inode table at 779-1287 (bg #0 + 779) - 8668 free blocks, 8142 free inodes, 2 directories - Free blocks: 33008-33283, 33332-33791, 33974-33975, 34023-34092, 34094-34104, 34526-34687, 34706-34723, 34817-35374, 35421-35844, 35935-36355, 36357-36863, 38912-39935, 39940-40570, 42620-42623, 42655, 42674-42687, 42721-42751, 42798-42815, 42847, 42875-42879, 42918-42943, 42975, 43000-43007, 43519, 43559-44031, 44042-44543, 44545-45055, 45116-45567, 45601-45631, 45658-45663, 45689-45695, 45736-45759, 45802-45823, 45857-45887, 45919, 45950-45951, 45972-45983, 46014-46015, 46057-46079, 46112-46591, 46921-47103, 49152-49395, 50027-50355, 52237-52255, 52285-52287, 52323-52351, 52383, 52450-52479, 52518-52543, 52584-52607, 52652-52671, 52734-52735, 52743-53247 - Free inodes: 8147-16288 -Group 2: (Blocks 65536-98303) - Block bitmap at 242 (bg #0 + 242) - Inode bitmap at 257 (bg #0 + 257) - Inode table at 1288-1796 (bg #0 + 1288) - 6326 free blocks, 8144 free inodes, 0 directories - Free blocks: 67042-67583, 72201-72994, 80185-80349, 81191-81919, 90112-94207 - Free inodes: 16289-24432 -Group 3: (Blocks 98304-131071) - - -``` - -Each cylinder group has its own inode bitmap that is used to determine which inodes are used and which are free within that group. The inodes have their own space in each group. Each inode contains information about one file, including the locations of the data blocks belonging to the file. The block bitmap keeps track of the used and free data blocks within the filesystem. Notice that there is a great deal of data about the filesystem in the output shown above. On very large filesystems the group data can run to hundreds of pages in length. The group metadata includes a listing of all of the free data blocks in the group. - -The EXT filesystem implemented data-allocation strategies that ensured minimal file fragmentation. Reducing fragmentation improved filesystem performance. Those strategies are described below, in the section on EXT4. - -The biggest problem with the EXT2 filesystem, which I encountered on some occasions, was that it could take many hours to recover after a crash because the **fsck** (file system check) program took a very long time to locate and correct any inconsistencies in the filesystem. It once took over 28 hours on one of my computers to fully recover a disk upon reboot after a crash—and that was when disks were measured in the low hundreds of megabytes in size. - -### EXT3 - -The [EXT3 filesystem][25] had the singular objective of overcoming the massive amounts of time that the **fsck** program required to fully recover a disk structure damaged by an improper shutdown that occurred during a file-update operation. The only addition to the EXT filesystem was the [journal][26], which records in advance the changes that will be performed to the filesystem. The rest of the disk structure is the same as it was in EXT2. - -Instead of writing data to the disk's data areas directly, as in previous versions, the journal in EXT3 writes file data, along with its metadata, to a specified area on the disk. Once the data is safely on the hard drive, it can be merged in or appended to the target file with almost zero chance of losing data. As this data is committed to the data area of the disk, the journal is updated so that the filesystem will remain in a consistent state in the event of a system failure before all the data in the journal is committed. On the next boot, the filesystem will be checked for inconsistencies, and data remaining in the journal will then be committed to the data areas of the disk to complete the updates to the target file. - -Journaling does reduce data-write performance, however there are three options available for the journal that allow the user to choose between performance and data integrity and safety. My personal preference is on the side of safety because my environments do not require heavy disk-write activity. - -The journaling function reduces the time required to check the hard drive for inconsistencies after a failure from hours (or even days) to mere minutes, at the most. I have had many issues over the years that have crashed my systems. The details could fill another article, but suffice it to say that most were self-inflicted, like kicking out a power plug. Fortunately, the EXT journaling filesystems have reduced that bootup recovery time to two or three minutes. In addition, I have never had a problem with lost data since I started using EXT3 with journaling. - -The journaling feature of EXT3 can be turned off and it then functions as an EXT2 filesystem. The journal itself still exists, empty and unused. Simply remount the partition with the mount command using the type parameter to specify EXT2\. You may be able to do this from the command line, depending upon which filesystem you are working with, but you can change the type specifier in the **/etc/fstab** file and then reboot. I strongly recommend against mounting an EXT3 filesystem as EXT2 because of the additional potential for lost data and extended recovery times. - -An existing EXT2 filesystem can be upgraded to EXT3 with the addition of a journal using the following command. - -``` -tune2fs -j /dev/sda1 -``` - -Where **/dev/sda1** is the drive and partition identifier. Be sure to change the file type specifier in **/etc/fstab** and remount the partition or reboot the system to have the change take effect. - -### EXT4 - -The [EXT4 filesystem][27] primarily improves performance, reliability, and capacity. To improve reliability, metadata and journal checksums were added. To meet various mission-critical requirements, the filesystem timestamps were improved with the addition of intervals down to nanoseconds. The addition of two high-order bits in the timestamp field defers the [Year 2038 problem][28] until 2446—for EXT4 filesystems, at least. - -In EXT4, data allocation was changed from fixed blocks to extents. An extent is described by its starting and ending place on the hard drive. This makes it possible to describe very long, physically contiguous files in a single inode pointer entry, which can significantly reduce the number of pointers required to describe the location of all the data in larger files. Other allocation strategies have been implemented in EXT4 to further reduce fragmentation. - -EXT4 reduces fragmentation by scattering newly created files across the disk so that they are not bunched up in one location at the beginning of the disk, as many early PC filesystems did. The file-allocation algorithms attempt to spread the files as evenly as possible among the cylinder groups and, when fragmentation is necessary, to keep the discontinuous file extents as close as possible to others in the same file to minimize head seek and rotational latency as much as possible. Additional strategies are used to pre-allocate extra disk space when a new file is created or when an existing file is extended. This helps to ensure that extending the file will not automatically result in its becoming fragmented. New files are never allocated immediately after existing files, which also prevents fragmentation of the existing files. - -Aside from the actual location of the data on the disk, EXT4 uses functional strategies, such as delayed allocation, to allow the filesystem to collect all the data being written to the disk before allocating space to it. This can improve the likelihood that the data space will be contiguous. - -Older EXT filesystems, such as EXT2 and EXT3, can be mounted as EXT4 to make some minor performance gains. Unfortunately, this requires turning off some of the important new features of EXT4, so I recommend against this. - -EXT4 has been the default filesystem for Fedora since Fedora 14\. An EXT3 filesystem can be upgraded to EXT4 using the [procedure ][29]described in the Fedora documentation, however its performance will still suffer due to residual EXT3 metadata structures. The best method for upgrading to EXT4 from EXT3 is to back up all the data on the target filesystem partition, use the **mkfs** command to write an empty EXT4 filesystem to the partition, and then restore all the data from the backup. - -### Inode - -The inode, described previously, is a key component of the metadata in EXT filesystems. Figure 2 shows the relationship between the inode and the data stored on the hard drive. This diagram is the directory and inode for a single file which, in this case, may be highly fragmented. The EXT filesystems work actively to reduce fragmentation, so it is very unlikely you will ever see a file with this many indirect data blocks or extents. In fact, as you will see below, fragmentation is extremely low in EXT filesystems, so most inodes will use only one or two direct data pointers and none of the indirect pointers. - -![inodesanddataallocation-01_0.png](https://opensource.com/sites/default/files/images/life-uploads/inodesanddataallocation-01_0.png) - -Figure 2: The inode stores information about each file and enables the EXT filesystem to locate all data belonging to it. - -The inode does not contain the name of the file. Access to a file is via the directory entry, which itself is the name of the file and contains a pointer to the inode. The value of that pointer is the inode number. Each inode in a filesystem has a unique ID number, but inodes in other filesystems on the same computer (and even the same hard drive) can have the same inode number. This has implications for [links][30], and this discussion is beyond the scope of this article. - -The inode contains the metadata about the file, including its type and permissions as well as its size. The inode also contains space for 15 pointers that describe the location and length of data blocks or extents in the data portion of the cylinder group. Twelve of the pointers provide direct access to the data extents and should be sufficient to handle most files. However, for files that have significant fragmentation, it becomes necessary to have some additional capabilities in the form of indirect nodes. Technically these are not really inodes, so I use the term "node" here for convenience. - -An indirect node is a normal data block in the filesystem that is used only for describing data and not for storage of metadata, thus more than 15 entries can be supported. For example, a block size of 4K can support 512 4-byte indirect nodes, allowing **12 (direct) + 512 (indirect) = 524** extents for a single file. Double and triple indirect node support is also supported, but most of us are unlikely to encounter files requiring that many extents. - -### Data fragmentation - -For many older PC filesystems, such as FAT (and all its variants) and NTFS, fragmentation has been a significant problem resulting in degraded disk performance. Defragmentation became an industry in itself with different brands of defragmentation software that ranged from very effective to only marginally so. - -Linux's extended filesystems use data-allocation strategies that help to minimize fragmentation of files on the hard drive and reduce the effects of fragmentation when it does occur. You can use the **fsck** command on EXT filesystems to check the total filesystem fragmentation. The following example checks the home directory of my main workstation, which was only 1.5% fragmented. Be sure to use the **-n** parameter, because it prevents **fsck** from taking any action on the scanned filesystem. - -``` -fsck -fn /dev/mapper/vg_01-home -``` - -I once performed some theoretical calculations to determine whether disk defragmentation might result in any noticeable performance improvement. While I did make some assumptions, the disk performance data I used were from a new 300GB, Western Digital hard drive with a 2.0ms track-to-track seek time. The number of files in this example was the actual number that existed in the filesystem on the day I did the calculation. I did assume that a fairly large amount of the fragmented files (20%) would be touched each day. - -| **Total files** | **271,794** | -| % fragmentation | 5.00% | -| Discontinuities | 13,590 | -|   |   | -| % fragmented files touched per day | 20% (assume) | -| Number of additional seeks | 2,718 | -| Average seek time | 10.90 ms | -| Total additional seek time per day | 29.63 sec | -|   | 0.49 min | -|   |   | -| Track-to-track seek time | 2.00 ms | -| Total additional seek time per day | 5.44 sec | -|   | 0.091 min | - -Table 1: The theoretical effects of fragmentation on disk performance - -I have done two calculations for the total additional seek time per day, one based on the track-to-track seek time, which is the more likely scenario for most files due to the EXT file allocation strategies, and one for the average seek time, which I assumed would make a fair worst-case scenario. - -As you can see from Table 1, the impact of fragmentation on a modern EXT filesystem with a hard drive of even modest performance would be minimal and negligible for the vast majority of applications. You can plug the numbers from your environment into your own similar spreadsheet to see what you might expect in the way of performance impact. This type of calculation most likely will not represent actual performance, but it can provide a bit of insight into fragmentation and its theoretical impact on a system. - -Most of my partitions are around 1.5% or 1.6% fragmented; I do have one that is 3.3% fragmented but that is a large, 128GB filesystem with fewer than 100 very large ISO image files; I've had to expand the partition several times over the years as it got too full. - -That is not to say that some application environments don't require greater assurance of even less fragmentation. The EXT filesystem can be tuned with care by a knowledgeable admin who can adjust the parameters to compensate for specific workload types. This can be done when the filesystem is created or later using the **tune2fs** command. The results of each tuning change should be tested, meticulously recorded, and analyzed to ensure optimum performance for the target environment. In the worst case, where performance cannot be improved to desired levels, other filesystem types are available that may be more suitable for a particular workload. And remember that it is common to mix filesystem types on a single host system to match the load placed on each filesystem. - -Due to the low amount of fragmentation on most EXT filesystems, it is not necessary to defragment. In any event, there is no safe defragmentation tool for EXT filesystems. There are a few tools that allow you to check the fragmentation of an individual file or the fragmentation of the remaining free space in a filesystem. There is one tool, **e4defrag**, which will defragment a file, directory, or filesystem as much as the remaining free space will allow. As its name implies, it only works on files in an EXT4 filesystem, and it does have some limitations. - -If it becomes necessary to perform a complete defragmentation on an EXT filesystem, there is only one method that will work reliably. You must move all the files from the filesystem to be defragmented, ensuring that they are deleted after being safely copied to another location. If possible, you could then increase the size of the filesystem to help reduce future fragmentation. Then copy the files back onto the target filesystem. Even this does not guarantee that all the files will be completely defragmented. - -### Conclusions - -The EXT filesystems have been the default for many Linux distributions for more than 20 years. They offer stability, high capacity, reliability, and performance while requiring minimal maintenance. I have tried other filesystems but always return to EXT. Every place I have worked with Linux has used the EXT filesystems and found them suitable for all the mainstream loads used on them. Without a doubt, the EXT4 filesystem should be used for most Linux systems unless there is a compelling reason to use another filesystem. - --------------------------------------------------------------------------------- - -作者简介: - -David Both - David Both is a Linux and Open Source advocate who resides in Raleigh, North Carolina. He has been in the IT industry for over forty years and taught OS/2 for IBM where he worked for over 20 years. While at IBM, he wrote the first training course for the original IBM PC in 1981. He has taught RHCE classes for Red Hat and has worked at MCI Worldcom, Cisco, and the State of North Carolina. He has been working with Linux and Open Source Software for almost 20 years. - -------------------- - -via: https://opensource.com/article/17/5/introduction-ext4-filesystem - -作者:[David Both ][a] -译者:[译者ID](https://github.com/chenxinlong) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/dboth -[1]:https://opensource.com/resources/what-is-linux?src=linux_resource_menu -[2]:https://opensource.com/resources/what-are-linux-containers?src=linux_resource_menu -[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=7016000000127cYAAQ -[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?src=linux_resource_menu&intcmp=7016000000127cYAAQ -[5]:https://opensource.com/tags/linux?src=linux_resource_menu -[6]:https://en.wikipedia.org/wiki/Boot_sector -[7]:https://opensource.com/article/17/5/introduction-ext4-filesystem?rate=B4QU3W_JYmEKsIKZf5yqMpztt7CRF6uzC0wfNBidEbs -[8]:https://www.flickr.com/photos/wwarby/11644168395 -[9]:https://www.flickr.com/photos/wwarby/11644168395 -[10]:https://opensource.com/users/jason-baker -[11]:https://creativecommons.org/licenses/by/2.0/ -[12]:https://opensource.com/life/16/10/introduction-linux-filesystems -[13]:https://opensource.com/life/15/9/everything-is-a-file -[14]:https://en.wikipedia.org/wiki/MINIX_file_system -[15]:https://en.wikipedia.org/wiki/Andrew_S._Tanenbaum -[16]:https://en.wikipedia.org/wiki/MINIX -[17]:https://en.wikipedia.org/wiki/Inode -[18]:http://ohm.hgesser.de/sp-ss2012/Intro-MinixFS.pdf -[19]:https://en.wikipedia.org/wiki/Inode_pointer_structure -[20]:https://en.wikipedia.org/wiki/Extended_file_system -[21]:https://en.wikipedia.org/wiki/R%C3%A9my_Card -[22]:https://en.wikipedia.org/wiki/Ext2 -[23]:https://en.wikipedia.org/wiki/Boot_sector -[24]:https://opensource.com/article/17/2/linux-boot-and-startup -[25]:https://en.wikipedia.org/wiki/Ext3 -[26]:https://en.wikipedia.org/wiki/Journaling_file_system -[27]:https://en.wikipedia.org/wiki/Ext4 -[28]:https://en.wikipedia.org/wiki/Year_2038_problem -[29]:https://docs.fedoraproject.org/en-US/Fedora/14/html/Storage_Administration_Guide/ext4converting.html -[30]:https://en.wikipedia.org/wiki/Hard_link -[31]:https://opensource.com/user/14106/feed -[32]:https://opensource.com/article/17/5/introduction-ext4-filesystem#comments -[33]:https://opensource.com/users/dboth diff --git a/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md b/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md new file mode 100644 index 0000000000..25e27d187e --- /dev/null +++ b/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md @@ -0,0 +1,301 @@ +Linux 的 EXT4 文件系统简介 +============================================================ + +### 让我们大概地从 EXT4 的历史、特性以及最佳实践这几个方面来学习它和之前的所有的 EXT 文件系统有何不同。 + +![An introduction to the EXT4 filesystem](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/hard_drives.png?itok=yZWyaSO6 "An introduction to the EXT4 filesystem") +>图片来自 : [WIlliam][8][ Warby][9]. 由 [Jason Baker][10] 编辑. Creative Commons [BY-SA 2.0][11]. + +在之前关于 Linux 文件系统的文章里,我写过一篇 [an introduction to Linux filesystems][12] 和一些更高级的概念例如 [everything is a file][13]. 我想要更深入地了解 EXT 文件系统的特性的详细内容,但是首先让我们来回答一个问题,“什么样才算是一个文件系统 ?” 一个文件系统应该涵盖以下所有点: + +1. **数据存储:** 对于任何一个文件系统来说,一个最主要的功能就是能够被当作一个容器结构来存储和恢复数据。 + +2. **命名空间:** 命名空间是一个提供了命名规则和数据结构的用于命名与组织的方法学。 + +3. **安全模型:** 一个用于定义访问权限的策略。 + +4. **API:** 指的是调用了操作这个系统的对象的系统方法,这些对象诸如目录和文件。 + +5. **实现:** 能够实现以上几点的软件。 + +本文内容的讨论主要集中于上述几点中的第一项并探索为一个 EXT 文件系统的数据存储提供逻辑框架的元数据结构。 + +### EXT 文件系统历史 + +虽然 EXT 文件系统是为 Linux 编写的,但其真正起源于 Minix 操作系统和 Minix 文件系统,而 Minix 最早发布于 1987,早于 Linux 5 年。如果我们从 EXT 文件系统大家族的 Minix 起源来观察其历史与技术发展那么理解 EXT4 文件系统就会简单得多。 + +### Minix + +当 Linux Torvalds 在写最初的 Linux 内核的时候,他需要一个文件系统但是他又不想自己写一个。于是他简单地把 [Minix 文件系统][14] 加了进去,这个 Minix 文件系统是由 [Andrew S. Tanenbaum][15] 写的同时也是 Tanenbaum 的 Minix 操作系统的一部分。[Minix][16] 是一个类 Unix 风格的操作系统,最初编写它的原因是用于教育。Minx 的代码是自由可用的且经过适当的许可的,所以 Torvalds 可以把它用 Linux 的最初版本里。 + +Minix 有以下这些结构,其中的大部分位于生成文件系统的分区中: + +* [**boot 扇区**][6] 是硬盘驱动安装后的第一个扇区。这个 boot 块包含了一个非常小的 boot 记录和一个分区表。 + +* 每一个分区的第一个块都是一个包含了元数据的 **superblock** ,这些元数据定义了其他文件系统的结构并将其定位于物理硬盘的具体分区上。 + +* 一个 **inode 位图块** 决定了哪些 inode 是在使用中的,哪一些是未使用的。 + +* **inode** 在硬盘上有它们自己的空间。每一个 inode 都包含了一个文件的信息包括其所处的数据块的位置,也就是该文件所处的区域。 + +* 一个 **区位图** 用于保持追踪数据区域的使用和未使用情况。 + +* 一个 **数据区**, 这里是数据存储的地方。 + +对上述了两种位图类型来说,一个 bit 表示一个制定的数据区或者一个指定的 inode. 如果这个 bit 是 0 则表示这个数据区或者这个 inode 是可以使用的,如果是 1 则表示正在使用中。 + +那么,[inode][17] 又是什么呢 ? 就是 index-node (索引节点)的简写。 inode 是位于磁盘上的一个 256 字节的块,用于存储和该 inode 对应的文件的相关数据。这些数据包含了文件的大小、文件的所有者和所属组的用户的 ID、文件模式(即访问权限)以及三个时间戳用于指定:该文件最后的访问时间、该文件的最后修改时间和该 inode 中的数据的最后修改时间。 + +同时,这个 inode 还包含了指向了其所对应的文件的数据在硬盘中的位置。在 Minix 和 EXT1-3 文件系统中,inode 表示的是一系列的的数据区和块。Minix 文件系统的 inode 支持 9 个数据块包括 7 个直接数据块和 2 个间接数据块。如果你想要更深入的了解,这里有一个优秀的 PDF 详细地描述了 [Minix 文件系统街头][18] 。同时你也可以在维基百科上对 [inode 指针结构][19] 做一个快速的浏览。 + +### EXT + +原生的 [EXT 文件系统][20] (指经过扩展的) 是由 [Rémy Card][21] 编写并于 1992 年与 Linux 一同发行。主要是为了克服 Minix 文件系统中的一些文件大小限制的问题。其中,最主要的结构变化就是文件系统中的元数据。它基于 Unix 文件系统 (UFS),也被称为伯克利快速文件系统(FFS)。我发现只有很少一部分关于 EXT 文件系统的发行信息是可以被验证的,显然这是因为其存在着严重的问题并且它很快地被 EXT2 文件系统取代了。 + +### EXT2 + +[EXT2 文件系统][22] 就相当地成功,它在 Linux 发行版中存活了多年。它是我在 1997 年开始使用 Red Hat Linux 时认识的第一个文件系统。实际上,EXT2 文件系统有着和 EXT 文件系统基本相同的元数据结构。然而 EXT2 更高瞻远瞩,因为其元数据结构之间留有很多磁盘空间供将来使用。 + +和 Minix 类似,EXT2 也有一个[boot 扇区][23] ,它是硬盘驱动安装后的第一个扇区。它包含了少量的 boot 记录和一个分区表。接着 boot 扇区之后是一些保留的空间,它跨越引导记录和通常位于下一个柱面的硬盘驱动器上的第一个分区之间的空间。 [GRUB2] [24] - 也可能是GRUB1 - 将此空间用于其部分启动代码。 + +每个 EXT2 分区中的空间分为各柱面组,它允许更精细地管理数据空间。 根据我的经验,每一组大小通常约为8MB。 下面的图1显示了一个柱面组的基本结构。 柱面中的数据分配单元是块,通常大小为4K。 + +![cylindergroup-01_1.png](https://opensource.com/sites/default/files/images/life-uploads/cylindergroup-01_1.png) + +Figure 1: EXT 文件系统中的柱面组的结构 + +柱面组中的第一个块是一个超级块,它包含了一个定义了其他文件系统的结构并将其定位于物理硬盘的具体分区上的元数据。分区中有一些柱面组还会有备用超级块,但并不是所有的柱面组都有。我们还可以使用例如 **dd** 等磁盘工具来拷贝备用超级块的内容到主超级块上以达到更换损坏超级块的目的。虽然这种情况不会经常发生,但是在几年前我的一个超级块损坏了,我就是用这种方法来修复的。幸好,我很有先见之明地使用了 **dumpe2fs** 命令来备份了我的分区描述符信息到我的系统上。 + +以下是 **dumpe2fs** 命令的一部分输出。这部分输出主要是超级块上包含的一些元数据,同时也是文件系统上的前两个柱面组的数据。 + +``` +# dumpe2fs /dev/sda1 +Filesystem volume name: boot +Last mounted on: /boot +Filesystem UUID: 79fc5ed8-5bbc-4dfe-8359-b7b36be6eed3 +Filesystem magic number: 0xEF53 +Filesystem revision #: 1 (dynamic) +Filesystem features: has_journal ext_attr resize_inode dir_index filetype needs_recovery extent 64bit flex_bg sparse_super large_file huge_file dir nlink extra_isize +Filesystem flags: signed_directory_hash +Default mount options: user_xattr acl +Filesystem state: clean +Errors behavior: Continue +Filesystem OS type: Linux +Inode count: 122160 +Block count: 488192 +Reserved block count: 24409 +Free blocks: 376512 +Free inodes: 121690 +First block: 0 +Block size: 4096 +Fragment size: 4096 +Group descriptor size: 64 +Reserved GDT blocks: 238 +Blocks per group: 32768 +Fragments per group: 32768 +Inodes per group: 8144 +Inode blocks per group: 509 +Flex block group size: 16 +Filesystem created: Tue Feb 7 09:33:34 2017 +Last mount time: Sat Apr 29 21:42:01 2017 +Last write time: Sat Apr 29 21:42:01 2017 +Mount count: 25 +Maximum mount count: -1 +Last checked: Tue Feb 7 09:33:34 2017 +Check interval: 0 () +Lifetime writes: 594 MB +Reserved blocks uid: 0 (user root) +Reserved blocks gid: 0 (group root) +First inode: 11 +Inode size: 256 +Required extra isize: 32 +Desired extra isize: 32 +Journal inode: 8 +Default directory hash: half_md4 +Directory Hash Seed: c780bac9-d4bf-4f35-b695-0fe35e8d2d60 +Journal backup: inode blocks +Journal features: journal_64bit +Journal size: 32M +Journal length: 8192 +Journal sequence: 0x00000213 +Journal start: 0 + +Group 0: (Blocks 0-32767) + Primary superblock at 0, Group descriptors at 1-1 + Reserved GDT blocks at 2-239 + Block bitmap at 240 (+240) + Inode bitmap at 255 (+255) + Inode table at 270-778 (+270) + 24839 free blocks, 7676 free inodes, 16 directories + Free blocks: 7929-32767 + Free inodes: 440, 470-8144 +Group 1: (Blocks 32768-65535) + Backup superblock at 32768, Group descriptors at 32769-32769 + Reserved GDT blocks at 32770-33007 + Block bitmap at 241 (bg #0 + 241) + Inode bitmap at 256 (bg #0 + 256) + Inode table at 779-1287 (bg #0 + 779) + 8668 free blocks, 8142 free inodes, 2 directories + Free blocks: 33008-33283, 33332-33791, 33974-33975, 34023-34092, 34094-34104, 34526-34687, 34706-34723, 34817-35374, 35421-35844, 35935-36355, 36357-36863, 38912-39935, 39940-40570, 42620-42623, 42655, 42674-42687, 42721-42751, 42798-42815, 42847, 42875-42879, 42918-42943, 42975, 43000-43007, 43519, 43559-44031, 44042-44543, 44545-45055, 45116-45567, 45601-45631, 45658-45663, 45689-45695, 45736-45759, 45802-45823, 45857-45887, 45919, 45950-45951, 45972-45983, 46014-46015, 46057-46079, 46112-46591, 46921-47103, 49152-49395, 50027-50355, 52237-52255, 52285-52287, 52323-52351, 52383, 52450-52479, 52518-52543, 52584-52607, 52652-52671, 52734-52735, 52743-53247 + Free inodes: 8147-16288 +Group 2: (Blocks 65536-98303) + Block bitmap at 242 (bg #0 + 242) + Inode bitmap at 257 (bg #0 + 257) + Inode table at 1288-1796 (bg #0 + 1288) + 6326 free blocks, 8144 free inodes, 0 directories + Free blocks: 67042-67583, 72201-72994, 80185-80349, 81191-81919, 90112-94207 + Free inodes: 16289-24432 +Group 3: (Blocks 98304-131071) + + +``` + +每一个柱面组都有自己的 inode 位图用于判定该柱面组中的哪些 inode 是使用中的而哪些又是未被使用的。每一个柱面组的 inode 都有它们自己的空间。每一个 inode 都包含了对应的文件的相关信息,包括其位于该文件的数据块中的位置。这个块位图纪录了文件系统中的使用中和非使用中的数据块。请注意,在上面的输出中有大量关于文件系统的数据。在非常大的文件系统上,组数据可以运行到数百页的长度。 组元数据包括组中所有空闲数据块的列表。 + +EXT 文件系统实现了数据分配策略以确保产生最少的文件碎片。减少文件碎片可以提高文件系统的性能。这些策略会在下面的 EXT4 中描述到。 + +我所遇见的关于 EXT2 文件系统最大的问题是 **fsck** (文件系统检查) 程序这一环节占用了很长一段时间来定位和校准文件系统中的所有不一致性导致其共花费了数个小时来修复一个崩溃。有一次我的其中一台电脑共花费了 28 个小时在一次崩溃后重新启动时恢复磁盘上,并且是在磁盘被检测量在几百兆字节大小的情况下。 + +### EXT3 + +[EXT3 文件系统][25] 具有克服 **fsck** 程序需要完全恢复在文件更新操作期间发生的不正确关机损坏的磁盘结构所需的大量时间的单一目标。EXT 文件系统的唯一新增是 [日志][26],它将提前记录将对文件系统执行的更改。 磁盘结构的其余部分与 EXT2 中的相同。 + +作为一个先前的版本,除了直接写入数据到磁盘的数据区域外,EXT3 的日志在写入元数据时同时会也写入文件数据到磁盘上的一个指定数据区域。一旦这些数据安全地到达硬盘,它就可以几乎零丢失率地被合并或者被追加到目标文件。当这些数据被提交到磁盘上的数据区域上,这些日志就会随即更新,这样在系统发生故障之前,文件系统将保持一致状态,才能提交日志中的所有数据。在下次启动时,将检查文件系统的不一致性,然后将日志中保留的数据提交到磁盘的数据区,以完成对目标文件的更新。 + +日记功能确实降低了数据写入性能,但是有三个可用于日志的选项,允许用户在性能和数据完整性和安全性之间进行选择。 我的个人更偏向于选择安全性,因为我的环境不需要大量的磁盘写入活动。 + +日志功能减少了在从几小时(甚至几天)到几分钟之间的失败后检查硬盘驱动器所需的时间。 多年来,我遇到了很多问题导致了我的系统崩溃。要详细说的话恐怕还得再写一篇文章,但这足以说明大多数是我自己造成的,就比如不小心踢掉一个电源插头。 幸运的是,EXT日志文件系统将启动恢复时间缩短到两三分钟。 此外,自从我开始使用带日志记录的EXT3,我从来没有遇到丢失数据的问题。 + +EXT3 的日志功能可以关闭,然后作为 EXT2 文件系统。 该日志本身仍然是存在的,只是状态为空且未使用。 只需使用类型参数使用 mount 命令来 remount 到分区即可指定EXT2 \。 你可以从命令行执行此操作,但是具体还是取决于你正在使用的文件系统,但你可以更改 **/ etc / fstab** 文件中的类型说明符,然后重新启动。 我强烈建议不要将 EXT3文件系统安装为 EXT2 ,因为这会具有丢失数据和增加恢复时间的潜在可能性。 + +EXT2 文件系统可以使用如下命令来通过日志升级到 EXT3 。 + +``` +tune2fs -j /dev/sda1 +``` + + **/dev/sda1** 表示驱动和分区的标识符。同时要注意修改 **/etc/fstab** 中的文件类型标识符并 remount 分区或者重启系统以确保修改生效。 + +### EXT4 + +[EXT4 filesystem][27]主要提高了性能、可靠性和容量。位了提高可靠性,它新增了元数据和日志校验和。同时位了满足各种关键任务要求,文件系统新增了纳秒级别的时间戳。在时间戳字段中添加两个高位来延迟时间戳的 [2038 年的问题][28] ,在 EXT4 文件系统至少可达到 2446 年。 + +在 EXT4 中,数据分配从固定块更改为盘区,盘区由硬盘驱动器上的开始和结束位置来描述。这使得可以在单个 inode 指针条目中描述非常长的物理连续的文件,这可以显着减少描述大文件中所有数据的位置所需的指针数。 EXT4 中已经实施了其他分配策略,以进一步减少碎片化。 + +EXT4 通过将新创建的文件分散在磁盘上,从而使其不会全部聚集在磁盘起始位置,就像早期的PC文件系统一样,减少了碎片。文件分配算法尝试在柱面组中尽可能均匀地扩展文件,并且当需要分段时,要使不连续文件扩展区尽可能靠近同一文件中的其他文件,以尽可能减少头部搜索和旋转等待时间尽可能的当创建新文件或扩展现有文件时,使用其他策略来预分配额外的磁盘空间。这有助于确保扩展文件不会自动导致其分段。新文件不会在现有文件之后立即分配,这也可以防止现有文件的碎片化。 + +除了磁盘上数据的实际位置外,EXT4 使用诸如延迟分配的功能策略,以允许文件系统在分配空间之前收集正在写入磁盘的所有数据。这可以提高数据空间将是连续的可能性。 + +较旧的EXT文件系统(如 EXT2 和 EXT3)可以作为 EXT4 进行 mount ,以使其性能获得较小的提升。不幸的是,这需要关闭 EXT4 的一些重要的新功能,所以我建议不要这样做。 + +自 Fedora 14 以来,EXT4 一直是 Fedora 的默认文件系统。我们可以使用 Fedora 文档中描述的 [procedure ][29] 将EXT3文件系统升级到EXT4,但是由于之前仍然存留d的 EXT3 元数据结构,它的性能仍将受到影响。从 EXT3 升级到 EXT4 的最佳方法是备份目标文件系统分区上的所有数据,使用 **mkfs** 命令将空EXT4文件系统写入分区,然后从备份中恢复所有数据。 + +### Inode + +以前描述的 inode 是EXT文件系统中的元数据的关键组件。 图 2 显示了 inode 和存储在硬盘驱动器上的数据之间的关系。 该图是单个文件的目录和 inode,在这种情况下,可能会产生高度碎片。 EXT 文件系统可以积极地减少碎片,所以不太可能会看到有这么多间接数据块或扩展盘的文件。 实际上,如下所示,EXT文件系统中的碎片非常低,所以大多数 inode 只使用一个或两个直接数据指针,也不使用间接指针。 + +![inodesanddataallocation-01_0.png](https://opensource.com/sites/default/files/images/life-uploads/inodesanddataallocation-01_0.png) + +图 2 :inode 存储有关每个文件的信息,并使 EXT 文件系统能够查找属于它的所有数据。 + +inode 不包含文件的名称。通过目录条目访问文件,目录条目本身是文件的名称,并包含指向 inode 的指针。该指针的值是 inode 号。文件系统中的每个 inode 都具有唯一的 ID 号,但同一台计算机上的其他文件系统(甚至相同的硬盘驱动器)中的 inode 可以具有相同的 inode 号。这对[links][30] 存在影响,但是这个讨论超出了本文的范围。 + +inod e包含有关该文件的元数据,包括其类型和权限以及其大小。 inode 还包含 15 个指针的空格,用于描述柱面组数据部分中数据块或扩展区的位置和长度。十二个指针提供对数据扩展区的直接访问,并且应该足以处理大多数文件。然而,对于具有重大分段的文件,有必要以间接节点的形式具有一些附加功能。从技术上讲,这些不是真正的节点,所以我在这里使用这个术语“节点”来方便。 + +间接节点是文件系统中的正常数据块,它仅用于描述数据而不用于存储元数据,因此可以支持超过 15 个条目。例如,4K 的块大小可以支持 512 个 4 字节间接节点,允许单个文件的 **12(直接)+ 512(间接)= 524** 范围。还支持双重和三重间接节点支持,但我们大多数人不太可能遇到需要许多扩展的文件。 + +### 数据碎片 + +对于许多较旧的 PC 文件系统,如 FAT(及其所有变体)和 NTFS,碎片一直是导致磁盘性能下降的重大问题。 碎片整理对于其本身和一些专门的整理软件来说已经称为了一项专门的工程,其效果范围从非常有效到仅仅是微乎其微。 + +Linux 的扩展文件系统使用数据分配策略,有助于最小化硬盘驱动器上的文件碎片,并在发生碎片时减少碎片的影响。 你可以使用 EXT 文件系统上的 **fsck** 命令检查文件系统的整体碎片。 以下示例检查主工作站的主目录,只有 1.5% 的碎片。 确保使用 **- n** 参数,因为它会阻止 **fsck** 对扫描文件系统采取的任何操作。 + +``` +fsck -fn /dev/mapper/vg_01-home +``` + +我曾经进行过一些理论计算,以确定磁盘碎片整理是否会导致任何明显的性能提升。 虽然我做了一些假设,我使用的磁盘性能数据来自一个新的 300GB 的西部数字硬盘驱动器,具有 2.0ms 的追踪到追踪时间。 此示例中的文件数是在计算当天文件系统中存在的实际数。 我假设有相当大量的碎片文件(约 20%)每天都会被触动。 + +| **Total files** | **271,794** | +|--|--| +| % fragmentation | 5.00% | +| Discontinuities | 13,590 | +|   |   | +| % fragmented files touched per day | 20% (assume) | +| Number of additional seeks | 2,718 | +| Average seek time | 10.90 ms | +| Total additional seek time per day | 29.63 sec | +|   | 0.49 min | +|   |   | +| Track-to-track seek time | 2.00 ms | +| Total additional seek time per day | 5.44 sec | +|   | 0.091 min | + +表 1: 碎片对磁盘性能的理论影响 + +我对每天的全部追加寻道时间进行了两次计算,一次是单磁道寻道时间,这是由于EXT文件分配策略而导致大多数文件的可能性更大的情况,一个是平均搜索时间,我认为这将是一个公平的最坏情况。 + +从表 1 可以看出,对绝大多数应用程序而言,碎片化对具有甚至适度性能的硬盘驱动器的现代EXT文件系统的影响将是微乎其微的。您可以将您的环境中的数字插入到您自己的类似电子表格中,以了解你对性能影响的期望。这种类型的计算不一定能够代表实际的性能,但它可以提供一些洞察碎片化及其对系统的理论影响。 + +我的大部分分区的碎片率都在 1.5% 左右或 1.6%,我有一个分区有 3.3% 的碎片,但是这是一个大的 128GB 文件系统,具有少于100 个非常大的 ISO 映像文件; 多年来,我不得不扩张分区,因为它已经太满了。 + +这并不是说一些应用的环境不需要更多的保证,甚至更少的碎片。 EXT 文件系统可以由有经验和知识的管理员小心调整,管理员可以调整参数以抵消特定的工作负载类型。这个工作可以在文件系统创建的时候或稍后使用 **tune2fs** 命令时完成。每一次调整变化的结果应进行测试,精心的记录和分析,以确保目标环境的最佳性能。在最坏的情况下,如果性能不能提高到期望的水平,则其他文件系统类型可能更适合特定的工作负载。并记住,在单个主机系统上使用混合文件系统类型以匹配放在每个文件系统上的负载是常见的。 + +由于大多数 EXT 文件系统的碎片数量较少,因此无需进行碎片整理。在任何情况下,EXT 文件系统都没有安全的碎片整理工具。有几个工具允许你检查单个文件的碎片或文件系统中剩余可用空间的碎片。有一个工具,**e4defrag**,它将对剩余可用空间允许的文件,目录或文件系统进行碎片整理。顾名思义,它只适用于 EXT4 文件系统中的文件,并且它还有一其它的些限制。 + +如果有必要在 EXT 文件系统上执行完整的碎片整理,则只有一种方法能够可靠地工作。你必须将文件系统中的所有要进行碎片整理的文件在确保在安全复制到其他位置后将其删除。如果可能,你可以增加文件系统的大小,以帮助减少将来的碎片。然后将文件复制回目标文件系统。但是其实即使这样也不能保证所有文件都被完全碎片整理。 + +### 总结 + +EXT 文件系统在一些 Linux 发行版本上作为默认文件系统已经超过二十多年了。它们用最少的维护代价提供了稳定性、高可用性、可靠性和其他各种表现。我尝试过一些其它的文件系统但最终都还是回归到 EXT。每一个我在工作中使用到 Linux 的地方都使用到了 EXT 文件系统,同时发现了它们适用于任何主流的负载。毫无疑问,EXT4 文件系统应该被用于大部分的 Linux 文件系统上,除非我们有明显的使用其它文件系统的理由。 + +-------------------------------------------------------------------------------- + +作者简介: + +David Both - David Both 是一名 Linux 于开源的贡献者,目前居住在北卡罗莱纳州的罗利。他从事 IT 行业有 40 余年并在 IBM 中从事 OS/2 培训约 20 余年。在 IBM 就职期间,他在 1981 年为最早的 IBM PC 写了一个培训课程。他已经为红帽教授了 RHCE 课程,曾在 MCI Worldcom,思科和北卡罗来纳州工作。 他使用 Linux 和开源软件工作了近 20 年。 + +------------------- + +via: https://opensource.com/article/17/5/introduction-ext4-filesystem + +作者:[David Both ][a] +译者:[chenxinlong](https://github.com/chenxinlong) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/dboth +[1]:https://opensource.com/resources/what-is-linux?src=linux_resource_menu +[2]:https://opensource.com/resources/what-are-linux-containers?src=linux_resource_menu +[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=7016000000127cYAAQ +[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?src=linux_resource_menu&intcmp=7016000000127cYAAQ +[5]:https://opensource.com/tags/linux?src=linux_resource_menu +[6]:https://en.wikipedia.org/wiki/Boot_sector +[7]:https://opensource.com/article/17/5/introduction-ext4-filesystem?rate=B4QU3W_JYmEKsIKZf5yqMpztt7CRF6uzC0wfNBidEbs +[8]:https://www.flickr.com/photos/wwarby/11644168395 +[9]:https://www.flickr.com/photos/wwarby/11644168395 +[10]:https://opensource.com/users/jason-baker +[11]:https://creativecommons.org/licenses/by/2.0/ +[12]:https://opensource.com/life/16/10/introduction-linux-filesystems +[13]:https://opensource.com/life/15/9/everything-is-a-file +[14]:https://en.wikipedia.org/wiki/MINIX_file_system +[15]:https://en.wikipedia.org/wiki/Andrew_S._Tanenbaum +[16]:https://en.wikipedia.org/wiki/MINIX +[17]:https://en.wikipedia.org/wiki/Inode +[18]:http://ohm.hgesser.de/sp-ss2012/Intro-MinixFS.pdf +[19]:https://en.wikipedia.org/wiki/Inode_pointer_structure +[20]:https://en.wikipedia.org/wiki/Extended_file_system +[21]:https://en.wikipedia.org/wiki/R%C3%A9my_Card +[22]:https://en.wikipedia.org/wiki/Ext2 +[23]:https://en.wikipedia.org/wiki/Boot_sector +[24]:https://opensource.com/article/17/2/linux-boot-and-startup +[25]:https://en.wikipedia.org/wiki/Ext3 +[26]:https://en.wikipedia.org/wiki/Journaling_file_system +[27]:https://en.wikipedia.org/wiki/Ext4 +[28]:https://en.wikipedia.org/wiki/Year_2038_problem +[29]:https://docs.fedoraproject.org/en-US/Fedora/14/html/Storage_Administration_Guide/ext4converting.html +[30]:https://en.wikipedia.org/wiki/Hard_link +[31]:https://opensource.com/user/14106/feed +[32]:https://opensource.com/article/17/5/introduction-ext4-filesystem#comments +[33]:https://opensource.com/users/dboth From 22d6d5d67d36541c6160052a4e4a6990978a1a6d Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 25 Jun 2017 10:03:45 +0800 Subject: [PATCH 0507/1407] =?UTF-8?q?20170625-1=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... guide to links in the Linux filesystem.md | 311 ++++++++++++++++++ 1 file changed, 311 insertions(+) create mode 100644 sources/tech/20170622 A users guide to links in the Linux filesystem.md diff --git a/sources/tech/20170622 A users guide to links in the Linux filesystem.md b/sources/tech/20170622 A users guide to links in the Linux filesystem.md new file mode 100644 index 0000000000..488557c2e7 --- /dev/null +++ b/sources/tech/20170622 A users guide to links in the Linux filesystem.md @@ -0,0 +1,311 @@ +A user's guide to links in the Linux filesystem +============================================================ + +### Learn how to use links, which make tasks easier by providing access to files from multiple locations in the Linux filesystem directory tree. + + +![A user's guide to links in the Linux filesystem](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/links.png?itok=AumNmse7 "A user's guide to links in the Linux filesystem") +Image by : [Paul Lewin][8]. Modified by Opensource.com. [CC BY-SA 2.0][9] + +In articles I have written about various aspects of Linux filesystems for Opensource.com, including [An introduction to Linux's EXT4 filesystem][10]; [Managing devices in Linux][11]; [An introduction to Linux filesystems][12]; and [A Linux user's guide to Logical Volume Management][13], I have briefly mentioned an interesting feature of Linux filesystems that can make some tasks easier by providing access to files from multiple locations in the filesystem directory tree. + +There are two types of Linux filesystem links: hard and soft. The difference between the two types of links is significant, but both types are used to solve similar problems. They both provide multiple directory entries (or references) to a single file, but they do it quite differently. Links are powerful and add flexibility to Linux filesystems because [everything is a file][14]. + +More Linux resources + +* [What is Linux?][1] + +* [What are Linux containers?][2] + +* [Download Now: Linux commands cheat sheet][3] + +* [Advanced Linux commands cheat sheet][4] + +* [Our latest Linux articles][5] + +I have found, for instance, that some programs required a particular version of a library. When a library upgrade replaced the old version, the program would crash with an error specifying the name of the old, now-missing library. Usually, the only change in the library name was the version number. Acting on a hunch, I simply added a link to the new library but named the link after the old library name. I tried the program again and it worked perfectly. And, okay, the program was a game, and everyone knows the lengths that gamers will go to in order to keep their games running. + +In fact, almost all applications are linked to libraries using a generic name with only a major version number in the link name, while the link points to the actual library file that also has a minor version number. In other instances, required files have been moved from one directory to another to comply with the Linux file specification, and there are links in the old directories for backwards compatibility with those programs that have not yet caught up with the new locations. If you do a long listing of the **/lib64** directory, you can find many examples of both. + +``` +lrwxrwxrwx. 1 root root 36 Dec 8 2016 cracklib_dict.hwm -> ../../usr/share/cracklib/pw_dict.hwm +lrwxrwxrwx. 1 root root 36 Dec 8 2016 cracklib_dict.pwd -> ../../usr/share/cracklib/pw_dict.pwd +lrwxrwxrwx. 1 root root 36 Dec 8 2016 cracklib_dict.pwi -> ../../usr/share/cracklib/pw_dict.pwi +lrwxrwxrwx. 1 root root 27 Jun 9 2016 libaccountsservice.so.0 -> libaccountsservice.so.0.0.0 +-rwxr-xr-x. 1 root root 288456 Jun 9 2016 libaccountsservice.so.0.0.0 +lrwxrwxrwx 1 root root 15 May 17 11:47 libacl.so.1 -> libacl.so.1.1.0 +-rwxr-xr-x 1 root root 36472 May 17 11:47 libacl.so.1.1.0 +lrwxrwxrwx. 1 root root 15 Feb 4 2016 libaio.so.1 -> libaio.so.1.0.1 +-rwxr-xr-x. 1 root root 6224 Feb 4 2016 libaio.so.1.0.0 +-rwxr-xr-x. 1 root root 6224 Feb 4 2016 libaio.so.1.0.1 +lrwxrwxrwx. 1 root root 30 Jan 16 16:39 libakonadi-calendar.so.4 -> libakonadi-calendar.so.4.14.26 +-rwxr-xr-x. 1 root root 816160 Jan 16 16:39 libakonadi-calendar.so.4.14.26 +lrwxrwxrwx. 1 root root 29 Jan 16 16:39 libakonadi-contact.so.4 -> libakonadi-contact.so.4.14.26 +``` + +A few of the links in the **/lib64** directory + +The long listing of the **/lib64** directory above shows that the first character in the filemode is the letter "l," which means that each is a soft or symbolic link. + +### Hard links + +In [An introduction to Linux's EXT4 filesystem][15], I discussed the fact that each file has one inode that contains information about that file, including the location of the data belonging to that file. [Figure 2][16] in that article shows a single directory entry that points to the inode. Every file must have at least one directory entry that points to the inode that describes the file. The directory entry is a hard link, thus every file has at least one hard link. + +In Figure 1 below, multiple directory entries point to a single inode. These are all hard links. I have abbreviated the locations of three of the directory entries using the tilde (**~**) convention for the home directory, so that **~** is equivalent to **/home/user** in this example. Note that the fourth directory entry is in a completely different directory, **/home/shared**, which might be a location for sharing files between users of the computer. + +![fig1directory_entries.png](https://opensource.com/sites/default/files/images/life/fig1directory_entries.png) +Figure 1 + +Hard links are limited to files contained within a single filesystem. "Filesystem" is used here in the sense of a partition or logical volume (LV) that is mounted on a specified mount point, in this case **/home**. This is because inode numbers are unique only within each filesystem, and a different filesystem, for example, **/var**or **/opt**, will have inodes with the same number as the inode for our file. + +Because all the hard links point to the single inode that contains the metadata about the file, all of these attributes are part of the file, such as ownerships, permissions, and the total number of hard links to the inode, and cannot be different for each hard link. It is one file with one set of attributes. The only attribute that can be different is the file name, which is not contained in the inode. Hard links to a single **file/inode** located in the same directory must have different names, due to the fact that there can be no duplicate file names within a single directory. + +The number of hard links for a file is displayed with the **ls -l** command. If you want to display the actual inode numbers, the command **ls -li** does that. + +### Symbolic (soft) links + +The difference between a hard link and a soft link, also known as a symbolic link (or symlink), is that, while hard links point directly to the inode belonging to the file, soft links point to a directory entry, i.e., one of the hard links. Because soft links point to a hard link for the file and not the inode, they are not dependent upon the inode number and can work across filesystems, spanning partitions and LVs. + +The downside to this is: If the hard link to which the symlink points is deleted or renamed, the symlink is broken. The symlink is still there, but it points to a hard link that no longer exists. Fortunately, the **ls** command highlights broken links with flashing white text on a red background in a long listing. + +### Lab project: experimenting with links + +I think the easiest way to understand the use of and differences between hard and soft links is with a lab project that you can do. This project should be done in an empty directory as a  _non-root user_ . I created the **~/temp** directory for this project, and you should, too. It creates a safe place to do the project and provides a new, empty directory to work in so that only files associated with this project will be located there. + +### **Initial setup** + +First, create the temporary directory in which you will perform the tasks needed for this project. Ensure that the present working directory (PWD) is your home directory, then enter the following command. + +``` +mkdir temp +``` + +Change into **~/temp** to make it the PWD with this command. + +``` +cd temp +``` + +To get started, we need to create a file we can link to. The following command does that and provides some content as well. + +``` +du -h > main.file.txt +``` + +Use the **ls -l** long list to verify that the file was created correctly. It should look similar to my results. Note that the file size is only 7 bytes, but yours may vary by a byte or two. + +``` +[dboth@david temp]$ ls -l +total 4 +-rw-rw-r-- 1 dboth dboth 7 Jun 13 07:34 main.file.txt +``` + +Notice the number "1" following the file mode in the listing. That number represents the number of hard links that exist for the file. For now, it should be 1 because we have not created any additional links to our test file. + +### **Experimenting with hard links** + +Hard links create a new directory entry pointing to the same inode, so when hard links are added to a file, you will see the number of links increase. Ensure that the PWD is still **~/temp**. Create a hard link to the file **main.file.txt**, then do another long list of the directory. + +``` +[dboth@david temp]$ ln main.file.txt link1.file.txt +[dboth@david temp]$ ls -l +total 8 +-rw-rw-r-- 2 dboth dboth 7 Jun 13 07:34 link1.file.txt +-rw-rw-r-- 2 dboth dboth 7 Jun 13 07:34 main.file.txt +``` + +Notice that both files have two links and are exactly the same size. The date stamp is also the same. This is really one file with one inode and two links, i.e., directory entries to it. Create a second hard link to this file and list the directory contents. You can create the link to either of the existing ones: **link1.file.txt** or **main.file.txt**. + +``` +[dboth@david temp]$ ln link1.file.txt link2.file.txt ; ls -l +total 16 +-rw-rw-r-- 3 dboth dboth 7 Jun 13 07:34 link1.file.txt +-rw-rw-r-- 3 dboth dboth 7 Jun 13 07:34 link2.file.txt +-rw-rw-r-- 3 dboth dboth 7 Jun 13 07:34 main.file.txt +``` + +Notice that each new hard link in this directory must have a different name because two files—really directory entries—cannot have the same name within the same directory. Try to create another link with a target name the same as one of the existing ones. + +``` +[dboth@david temp]$ ln main.file.txt link2.file.txt +ln: failed to create hard link 'link2.file.txt': File exists +``` + +Clearly that does not work, because **link2.file.txt** already exists. So far, we have created only hard links in the same directory. So, create a link in your home directory, the parent of the temp directory in which we have been working so far. + +``` +[dboth@david temp]$ ln main.file.txt ../main.file.txt ; ls -l ../main* +-rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 main.file.txt +``` + +The **ls** command in the above listing shows that the **main.file.txt** file does exist in the home directory with the same name as the file in the temp directory. Of course, these are not different files; they are the same file with multiple links—directory entries—to the same inode. To help illustrate the next point, add a file that is not a link. + +``` +[dboth@david temp]$ touch unlinked.file ; ls -l +total 12 +-rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 link1.file.txt +-rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 link2.file.txt +-rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 main.file.txt +-rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file +``` + +Look at the inode number of the hard links and that of the new file using the **-i**option to the **ls** command. + +``` +[dboth@david temp]$ ls -li +total 12 +657024 -rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 link1.file.txt +657024 -rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 link2.file.txt +657024 -rw-rw-r-- 4 dboth dboth 7 Jun 13 07:34 main.file.txt +657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file +``` + +Notice the number **657024** to the left of the file mode in the example above. That is the inode number, and all three file links point to the same inode. You can use the **-i** option to view the inode number for the link we created in the home directory as well, and that will also show the same value. The inode number of the file that has only one link is different from the others. Note that the inode numbers will be different on your system. + +Let's change the size of one of the hard-linked files. + +``` +[dboth@david temp]$ df -h > link2.file.txt ; ls -li +total 12 +657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 link1.file.txt +657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 link2.file.txt +657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 main.file.txt +657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file +``` + +The file size of all the hard-linked files is now larger than before. That is because there is really only one file that is linked to by multiple directory entries. + +I know this next experiment will work on my computer because my **/tmp**directory is on a separate LV. If you have a separate LV or a filesystem on a different partition (if you're not using LVs), determine whether or not you have access to that LV or partition. If you don't, you can try to insert a USB memory stick and mount it. If one of those options works for you, you can do this experiment. + +Try to create a link to one of the files in your **~/temp** directory in **/tmp** (or wherever your different filesystem directory is located). + +``` +[dboth@david temp]$ ln link2.file.txt /tmp/link3.file.txt +ln: failed to create hard link '/tmp/link3.file.txt' => 'link2.file.txt': +Invalid cross-device link +``` + +Why does this error occur? The reason is each separate mountable filesystem has its own set of inode numbers. Simply referring to a file by an inode number across the entire Linux directory structure can result in confusion because the same inode number can exist in each mounted filesystem. + +There may be a time when you will want to locate all the hard links that belong to a single inode. You can find the inode number using the **ls -li** command. Then you can use the **find** command to locate all links with that inode number. + +``` +[dboth@david temp]$ find . -inum 657024 +./main.file.txt +./link1.file.txt +./link2.file.txt +``` + +Note that the **find** command did not find all four of the hard links to this inode because we started at the current directory of **~/temp**. The **find** command only finds files in the PWD and its subdirectories. To find all the links, we can use the following command, which specifies your home directory as the starting place for the search. + +``` +[dboth@david temp]$ find ~ -samefile main.file.txt +/home/dboth/temp/main.file.txt +/home/dboth/temp/link1.file.txt +/home/dboth/temp/link2.file.txt +/home/dboth/main.file.txt +``` + +You may see error messages if you do not have permissions as a non-root user. This command also uses the **-samefile** option instead of specifying the inode number. This works the same as using the inode number and can be easier if you know the name of one of the hard links. + +### **Experimenting with soft links** + +As you have just seen, creating hard links is not possible across filesystem boundaries; that is, from a filesystem on one LV or partition to a filesystem on another. Soft links are a means to answer that problem with hard links. Although they can accomplish the same end, they are very different, and knowing these differences is important. + +Let's start by creating a symlink in our **~/temp** directory to start our exploration. + +``` +[dboth@david temp]$ ln -s link2.file.txt link3.file.txt ; ls -li +total 12 +657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 link1.file.txt +657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 link2.file.txt +658270 lrwxrwxrwx 1 dboth dboth 14 Jun 14 15:21 link3.file.txt -> +link2.file.txt +657024 -rw-rw-r-- 4 dboth dboth 1157 Jun 14 14:14 main.file.txt +657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file +``` + +The hard links, those that have the inode number **657024**, are unchanged, and the number of hard links shown for each has not changed. The newly created symlink has a different inode, number **658270**. The soft link named **link3.file.txt**points to **link2.file.txt**. Use the **cat** command to display the contents of **link3.file.txt**. The file mode information for the symlink starts with the letter "**l**" which indicates that this file is actually a symbolic link. + +The size of the symlink **link3.file.txt** is only 14 bytes in the example above. That is the size of the text **link3.file.txt -> link2.file.txt**, which is the actual content of the directory entry. The directory entry **link3.file.txt** does not point to an inode; it points to another directory entry, which makes it useful for creating links that span file system boundaries. So, let's create that link we tried before from the **/tmp** directory. + +``` +[dboth@david temp]$ ln -s /home/dboth/temp/link2.file.txt +/tmp/link3.file.txt ; ls -l /tmp/link* +lrwxrwxrwx 1 dboth dboth 31 Jun 14 21:53 /tmp/link3.file.txt -> +/home/dboth/temp/link2.file.txt +``` + +### **Deleting links** + +There are some other things that you should consider when you need to delete links or the files to which they point. + +First, let's delete the link **main.file.txt**. Remember that every directory entry that points to an inode is simply a hard link. + +``` +[dboth@david temp]$ rm main.file.txt ; ls -li +total 8 +657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14:14 link1.file.txt +657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14:14 link2.file.txt +658270 lrwxrwxrwx 1 dboth dboth 14 Jun 14 15:21 link3.file.txt -> +link2.file.txt +657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file +``` + +The link **main.file.txt** was the first link created when the file was created. Deleting it now still leaves the original file and its data on the hard drive along with all the remaining hard links. To delete the file and its data, you would have to delete all the remaining hard links. + +Now delete the **link2.file.txt** hard link. + +``` +[dboth@david temp]$ rm link2.file.txt ; ls -li +total 8 +657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14:14 link1.file.txt +658270 lrwxrwxrwx 1 dboth dboth 14 Jun 14 15:21 link3.file.txt -> +link2.file.txt +657024 -rw-rw-r-- 3 dboth dboth 1157 Jun 14 14:14 main.file.txt +657863 -rw-rw-r-- 1 dboth dboth 0 Jun 14 08:18 unlinked.file +``` + +Notice what happens to the soft link. Deleting the hard link to which the soft link points leaves a broken link. On my system, the broken link is highlighted in colors and the target hard link is flashing. If the broken link needs to be fixed, you can create another hard link in the same directory with the same name as the old one, so long as not all the hard links have been deleted. You could also recreate the link itself, with the link maintaining the same name but pointing to one of the remaining hard links. Of course, if the soft link is no longer needed, it can be deleted with the **rm** command. + +The **unlink** command can also be used to delete files and links. It is very simple and has no options, as the **rm** command does. It does, however, more accurately reflect the underlying process of deletion, in that it removes the link—the directory entry—to the file being deleted. + +### Final thoughts + +I worked with both types of links for a long time before I began to understand their capabilities and idiosyncrasies. It took writing a lab project for a Linux class I taught to fully appreciate how links work. This article is a simplification of what I taught in that class, and I hope it speeds your learning curve. + +-------------------------------------------------------------------------------- + +作者简介: + +David Both - David Both is a Linux and Open Source advocate who resides in Raleigh, North Carolina. He has been in the IT industry for over forty years and taught OS/2 for IBM where he worked for over 20 years. While at IBM, he wrote the first training course for the original IBM PC in 1981. He has taught RHCE classes for Red Hat and has worked at MCI Worldcom, Cisco, and the State of North Carolina. He has been working with Linux and Open Source Software for almost 20 years. + +--------------------------------- + +via: https://opensource.com/article/17/6/linking-linux-filesystem + +作者:[David Both ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/dboth +[1]:https://opensource.com/resources/what-is-linux?src=linux_resource_menu +[2]:https://opensource.com/resources/what-are-linux-containers?src=linux_resource_menu +[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=7016000000127cYAAQ +[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?src=linux_resource_menu&intcmp=7016000000127cYAAQ +[5]:https://opensource.com/tags/linux?src=linux_resource_menu +[6]:https://opensource.com/article/17/6/linking-linux-filesystem?rate=YebHxA-zgNopDQKKOyX3_r25hGvnZms_33sYBUq-SMM +[7]:https://opensource.com/user/14106/feed +[8]:https://www.flickr.com/photos/digypho/7905320090 +[9]:https://creativecommons.org/licenses/by/2.0/ +[10]:https://opensource.com/article/17/5/introduction-ext4-filesystem +[11]:https://opensource.com/article/16/11/managing-devices-linux +[12]:https://opensource.com/life/16/10/introduction-linux-filesystems +[13]:https://opensource.com/business/16/9/linux-users-guide-lvm +[14]:https://opensource.com/life/15/9/everything-is-a-file +[15]:https://opensource.com/article/17/5/introduction-ext4-filesystem +[16]:https://opensource.com/article/17/5/introduction-ext4-filesystem#fig2 +[17]:https://opensource.com/users/dboth +[18]:https://opensource.com/article/17/6/linking-linux-filesystem#comments From 36a4294cc897728245289939e441813fda7eabd6 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 25 Jun 2017 10:09:00 +0800 Subject: [PATCH 0508/1407] =?UTF-8?q?20170625-2=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...Linux Still Surprises and Motivates Him.md | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 sources/talk/20170622 Linus Torvalds Explains How Linux Still Surprises and Motivates Him.md diff --git a/sources/talk/20170622 Linus Torvalds Explains How Linux Still Surprises and Motivates Him.md b/sources/talk/20170622 Linus Torvalds Explains How Linux Still Surprises and Motivates Him.md new file mode 100644 index 0000000000..6d2013d845 --- /dev/null +++ b/sources/talk/20170622 Linus Torvalds Explains How Linux Still Surprises and Motivates Him.md @@ -0,0 +1,58 @@ +Linus Torvalds Explains How Linux Still Surprises and Motivates Him +============================================================ + +![Linus Torvalds](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/linus-torvalds-lc3.jpg?itok=lzZupevU "Linus Torvalds") +Linux Torvalds spoke with Dirk Hohndel in one of their famous “fireside chats” this week at LinuxCon China.[The Linux Foundation][1] + +Linus Torvalds took to the stage in China for the first time Monday at [LinuxCon + ContainerCon + CloudOpen China in Beijing][3]. In front of a crowd of nearly 2,000, Torvalds spoke with VMware Head of Open Source Dirk Hohndel in one of their famous “fireside chats” about what motivates and surprises him and how aspiring open source developers can get started. Here are some highlights of their talk. + +**What’s surprising about Linux development** + +“What I find interesting is code that I thought was stable continually gets improved. There are things we haven’t touched for many years, then someone comes along and improves them or makes bug reports in something I thought no one used. We have new hardware, new features that are developed, but after 25 years, we still have old, very basic things that people care about and still improve.” + +**What motivates him** + +“I really like what I’m doing. I like waking up and having a job that is technically interesting and challenging without being too stressful so I can do it for long stretches; something where I feel I am making a real difference and doing something meaningful not just for me.” + +“I occasionally have taken breaks from my job. The 2-3 weeks I worked on Git to get that started for example. But every time I take a longer break, I get bored. When I go diving for a week, I look forward to getting back. I never had the feeling that I need to take a longer break.” + +**The future of Linux leadership** + +“Our processes have not only worked for 25 years, we still have a very strong maintainer group. We complain that we don’t have enough maintainers – which is true, we only have tens of top maintainers who do the daily work of merging stuff. That’s a strong team for an open source project. And as these maintainers get older and fatter, we have new people coming in. It takes years to go from a new developer to a top maintainer, so I don’t feel that we should necessarily worry about the process and Linux for the next 20 years.” + +**Will Linux be replaced** + +“Maybe some new aggressive project will come along and show they can do what we do better, but I don’t worry about that. There have been lots of very successful forks of Linux. What makes people not think of them as forks is that they are harmonious. If someone says they want to do this and change everything and make the kernel so much better, my feeling is do it, prove yourself. I may think it’s a bad idea, but you can prove me wrong.” + +**Thoughts on Git** + +“I’m very surprised about how widely Git has spread. I’m pleased obviously, and it validates my notion of doing distributed development. At the same time, looking at most source control versions, it tends to be a huge slog and difficult to introduce a new software control version. I expected it to be limited mostly to the kernel -- as it’s tailored to what we do.” + +“For the first 3 to 4 years, the complaint about Git was it was so different and hard to use. About 5 years ago something changed. Enough projects and developers had started using Git that it wasn’t different anymore; it was what people were used to. They started taking advantage of the development model and the feeling of security that using Git meant nothing would be corrupted or lost.” + +“In certain circles, Git is more well known than Linux. Linux is often hidden – on an Android phone you’re running Linux, but you don’t think about it. With Git, you know you are using Git.” + +**Forking Linux** + +“When I sat down and wrote Git, a prime principle was that you should be able to fork and go off on your own and do something on your own. If you have forks that are friendly -- the type that prove me wrong and do something interesting that improves the kernel -- in that situation, someone can come back and say they actually improved the kernel and there are no bad feelings. I’ll take your improved code and merge it back. That’s why you should encourage forks. You also want to make it easy to take back the good ones.” + +**How to get started as an open source developer** + +“For me, I was always self-motivated and knew what I wanted to do. I was never told what I should look at doing. I’m not sure my example is the right thing for people to follow. There are a ton of open source projects and, if you are a beginning programmer, find something you’re interested in that you can follow for more than just a few weeks. Get to know the code so well that you get to the point where you are an expert on a code piece. It doesn’t need to be the whole project. No one is an expert on the whole kernel, but you can know an area well.   + +If you can be part of a community and set up patches, it’s not just about the coding, but about the social aspect of open source. You make connections and improve yourself as a programmer. You are basically showing off – I made these improvements, I’m capable of going far in my community or job. You’ll have to spend a certain amount of time to learn a project, but there’s a huge upside -- not just from a career aspect, but having an amazing project in your life.” + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/blog/event/lc3-china/20176/6/linus-torvalds-explains-how-linux-still-surprises-and-motivates-him + +作者:[ THE LINUX FOUNDATION][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.linux.com/users/lfadmin +[1]:https://www.linux.com/licenses/category/linux-foundation +[2]:https://www.linux.com/files/images/linus-torvalds-lc3jpg +[3]:https://www.lfasiallc.com/linuxcon-containercon-cloudopen-china From 088e8b0435ad0625fc5482b94bd65e85cba32a28 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 25 Jun 2017 10:10:53 +0800 Subject: [PATCH 0509/1407] =?UTF-8?q?20170625-3=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...te to open source when you have no time.md | 95 +++++++++++++++++++ 1 file changed, 95 insertions(+) create mode 100644 sources/tech/20170622 8 ways to contribute to open source when you have no time.md diff --git a/sources/tech/20170622 8 ways to contribute to open source when you have no time.md b/sources/tech/20170622 8 ways to contribute to open source when you have no time.md new file mode 100644 index 0000000000..a5b52f6da9 --- /dev/null +++ b/sources/tech/20170622 8 ways to contribute to open source when you have no time.md @@ -0,0 +1,95 @@ +8 ways to contribute to open source when you have no time +============================================================ + +### Find the time in your busy life to give back to the projects you care about. + +![8 ways to contribute to open source when you have no time](https://opensource.com/sites/default/files/styles/image-full-size/public/images/law/LAW-patent_reform_520x292_10136657_1012_dc.png?itok=zLMswcrw "8 ways to contribute to open source when you have no time") +Image by : opensource.com + +One of the [most common reasons][3] people give for not contributing (or not contributing more) to open source is a lack of time. I get it; life is challenging, and there are so many priorities vying for your limited attention. So how can you find the time in your busy life to contribute to the open source projects you care about? + +In the interest of full disclosure, I should warn you that I was late getting this article to the editors because I couldn't find the time to work on it. Take my advice at your own risk. + +### Figure out what you care about + +The first step in contributing is to figure out what exactly you're making time for. Do you have a project of your own that you want to work on? Is there a specific project that you use that you want to help with? Do you just want to do  _something_ ? Figuring out what you're making time for will help you decide where in your life's priorities it belongs. + +### Find alternate ways to contribute + +Writing a new feature can take many hours of design, coding, and testing. It's not always easy to work on that for a few minutes, step away, and then pick up where you left off. If you never get more than 30 minutes of uninterrupted effort, you might find yourself pretty frustrated if you try to take on a big task. + +But there are other ways to contribute that might satisfy your need to give back within the time you have available. Some of them can be done in quick spurts from a smartphone, which means you can take the time you used to spend avoiding people on your commute and put it toward your open source contributions. Here's a list of some things that can be done in small chunks: + +* **Bug triage:** Do all of the bug reports have the information necessary to diagnose and resolve them? Are they properly filed (to the right area, with the right severity, etc.)? + +* **Mailing list support:** Are users or other contributors asking questions on the mailing list? Maybe you can help. + +* **Documentation patches:** Documentation can often (but not always) be worked on in smaller chunks than code. Maybe there are a few places you can fill in. Or maybe it's time to run through the docs and make sure they're still accurate. + +* **Marketing:** Talk about your project or community on social media. Write a quick blog post. Vote and comment on news aggregators. + +### Talk to your boss + +You might think you can't work on open source projects during the workday, but have you  _asked_ ? Particularly if the project somehow relates to your day job, you might be able to sell your boss on letting you make contributions while at work. Note that there may be some intellectual property issues (e.g., who owns the rights to the code you contribute during working hours), so do your research first and get the conditions in writing. + +### Set deadlines + +The best time management advice I ever received can be summarized with two rules: + +1. If it's going to get done, it has to have a deadline + +2. It's okay to change a deadline + +This article had a deadline. There's no particular time sensitivity to it, but a deadline meant that I defined when I wanted to get it done and gave the editors a sense of when it might be submitted. And yes, as I said above, I missed the deadline. You know what happened? I set a new deadline (second time's a charm!). + +If something  _is_  time-sensitive, set the deadline well ahead to give yourself some space if you need to push it back a time or two. + +### Put it on your calendar + +If you use a calendar to schedule the rest of your life, scheduling some time to work on your open source project may be the only way to get it done. How much time you schedule is up to you, but even if you block off only one hour once a week as open source time, that still gives you an hour a week of open source time. + +And here's a secret: It's okay to cancel on yourself sometimes if you need the time to do something else—or do nothing at all. + +### Reclaim unused time + +Are you bored on your commute? Are you having trouble falling asleep at night? Maybe you can use that time to contribute. Now I happen to think the "work 169 hours a week at full tilt" lifestyle is a terrible, terrible thing. That said, some nights you just can't fall asleep. Instead of lying in bed, seeing what your Twitter friends on the other side of the world are up to (which I do), maybe you can work on that contribution you've been meaning to get around to. Just don't make a habit out of forgoing sleep. + +### Stop + +Sometimes the best way to contribute is to not contribute for a little bit. You're a busy person and no matter how awesome you are, you can't avoid your physiological and psychological needs. They will catch up to you. Taking a little time to refresh yourself might improve your productivity enough that you get stuff done faster, and suddenly there's time for you to make those open source contributions you've been meaning to get around to. + +### Say "no" + +I am bad at this. So very bad. But none of us can do everything we'd like to do. Sometimes the best thing you can do to contribute is to stop contributing in the same way you have been—or not contribute at all (see above). + +Several years ago, I led the Fedora documentation team. The team's tradition was that the leader would offer to step aside at the end of each release. I had done that a time or two and nobody stepped up, so I remained in the role. But after my second or third release, I made it clear that I would not be continuing as the team lead. I still enjoyed the work, but I was working full time, in graduate school half time, and my wife was pregnant with our first child. There was no way I could consistently give the level of effort that was required, so I stepped aside. I continued to contribute, but in a less-demanding capacity. + +If you're getting to the point where you struggle to find the time to meet your obligations (self-imposed or not), then perhaps it's time to reconsider your role. This can be especially hard with a project that you founded or have made a considerable investment in. But sometimes you have to—for your own good and that of the project. + +### What else? + +How do you find time to make your contributions? Let us know in the comments. + +-------------------------------------------------------------------------------- + +作者简介: + +Ben Cotton - Ben Cotton is a meteorologist by training and a high-performance computing engineer by trade. Ben works as a technical evangelist at Cycle Computing. He is a Fedora user and contributor, co-founded a local open source meetup group, and is a member of the Open Source Initiative and a supporter of Software Freedom Conservancy. Find him on Twitter (@FunnelFiasco) or at + + +---------- + +via: https://opensource.com/article/17/6/find-time-contribute + +作者:[Ben Cotton ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/bcotton +[1]:https://opensource.com/article/17/6/find-time-contribute?rate=qWRgPXlhEZchh_vXEplj6jLXd7P0QCwzxZFWYkqawCc +[2]:https://opensource.com/user/30131/feed +[3]:http://naramore.net/blog/why-people-don-t-contribute-to-os-projects-and-what-we-can-do-about-it +[4]:https://opensource.com/users/bcotton +[5]:https://opensource.com/article/17/6/find-time-contribute#comments From 7512f734da479b29e33740390ca08ceb92935350 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 25 Jun 2017 10:12:21 +0800 Subject: [PATCH 0510/1407] =?UTF-8?q?20170625-4=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...oduction to creating documents in LaTeX.md | 149 ++++++++++++++++++ 1 file changed, 149 insertions(+) create mode 100644 sources/tech/20170623 A introduction to creating documents in LaTeX.md diff --git a/sources/tech/20170623 A introduction to creating documents in LaTeX.md b/sources/tech/20170623 A introduction to creating documents in LaTeX.md new file mode 100644 index 0000000000..498c0f45ce --- /dev/null +++ b/sources/tech/20170623 A introduction to creating documents in LaTeX.md @@ -0,0 +1,149 @@ +A introduction to creating documents in LaTeX +============================================================ + +### Learn to typeset documents in the LaTeX text markup language. + +![A introduction to creating documents in LaTeX](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/idea_innovation_kid_education.png?itok=jpetC9wJ "A introduction to creating documents in LaTeX") +Image by : opensource.com + +LaTeX (pronounced  _lay-tech_ ) is a method of creating documents using plain text, stylized using markup tags, similar to HTML/CSS or Markdown. LaTeX is most commonly used to create documents for academia, such as academic journals. In LaTeX, the author doesn't stylize the document directly, like in a word processor such as Microsoft Word, LibreOffice Writer, or Apple Pages; instead they write code in plain text that must be compiled to produce a PDF document. + +### [intro.png][1] + +![computer screen with LaTeX markup language](https://opensource.com/sites/default/files/u128651/intro.png "computer screen with LaTeX markup language") + +### How to get started + +To write in LaTeX, you'll need to install a LaTeX editor. I use a piece of free and open source software (FOSS) popular with academics called [TexStudio][8], which runs on Windows, Unix/Linux, BSD, and Mac OS X. You'll also need to install a distribution of the **Tex** typesetting system. I am writing on MacOS, so I use a distribution called [MacTex or BasicTex][9]. For Windows you can use [MiKTex][10], and Linux users should be able to find it in their repository. + +Once you have downloaded TexStudio and a distribution of LaTeX, you should be ready to start typesetting your documents. + +### Create your first document + +In this short tutorial, we'll create a simple article with a headline, a subhead, and two paragraphs. + +After you launch TexStudio, save your new document. (I called mine **helloworld.tex**, since I'm writing this tutorial in the Hello, World! tradition from programming.) Next, you need to add some boilerplate code at the top of your **.tex** file that specifies the type and size of your document. This is similar to the boilerplate code used in HTML5 documents. + +My code (below) sets the page size to A4 and the text size to 12pt. You can put this code into TexStudio and edit it with your own page size, font size, name, title, and other details: + +``` +\documentclass[a4paper,12pt]{article} +\begin{document} +\title{Hello World! My first LaTeX document} +\author{Aaron Cocker} +\date{\today} +\maketitle + +content will go here + +\end{document} +``` + +Next, click on the large green arrow to compile the document. That's the middle button in the screenshot below. + +### [compile.png][2] + +![compile button in TexStudio](https://opensource.com/sites/default/files/u128651/compile.png "compile button in TexStudio") + +If there are any errors, they'll appear in the dialog box at the bottom. + +After you compile the document, you can see what it will look like by viewing a PDF within the program as a sort of WYSIWYG preview. Remember it must be recompiled whenever you make a change to the code, as you would when programming in C++, for example. + +To view your document, click on **Tools > Commands > View PDF**, as shown in the screenshot below. + +### [view_as_pdf.png][3] + +![Menu to view a PDF](https://opensource.com/sites/default/files/u128651/view_as_pdf.png "Menu to view a PDF") + +The PDF output will be shown on the right, like this: + +### [pdf_output.png][4] + +![Viewing the LaTeX code as PDF](https://opensource.com/sites/default/files/u128651/pdf_output.png "Viewing the LaTeX code as PDF") + +Now you can add a paragraph. First give it a subhead by using the **\section{}**command. Type the subhead title between the curly braces of the command; I called my subhead **Introduction**. + +``` +\section{Introduction} +``` + +Now that you have labeled the paragraph with its subhead, it's time to write the paragraph. For this example, I used the Lipsum [lorem ipsum generator][11]. To create the paragraph, type the **\paragraph{}** command, then add your text  _underneath_ ,  _NOT within_ , the curly braces, inserted between **\maketitle** and **\end{document}**. + +This is what my paragraph code looks like: + +``` +\section{Introduction} + +\paragraph{} +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras lorem nisi, tincidunt tempus sem nec, elementum feugiat ipsum. Nulla in diam libero. Nunc tristique ex a nibh egestas sollicitudin. + +\paragraph{} +Mauris efficitur vitae ex id egestas. Vestibulum ligula felis, pulvinar a posuere id, luctus vitae leo. Sed ac imperdiet orci, non elementum leo. Nullam molestie congue placerat. Phasellus tempor et libero maximus commodo. +``` + +Your document is now finished, so you can export and save it as a PDF file by using **Save As** (just as you would with most programs). + +Here's what my finished document and the corresponding code look like: + +### [finished_document.png][5] + +![The finished document with code and the PDF output side-by-side](https://opensource.com/sites/default/files/u128651/finished_document.png "The finished document with code and the PDF output side-by-side") + +All my code from this tutorial is available below: + +``` +\documentclass[a4paper,12pt]{article} +\begin{document} +\title{Hello World! My first LaTeX document} +\author{Aaron Cocker} +\date{\today} +\maketitle + +\section{Introduction} + +\paragraph{} +Lorem ipsum dolor sit amet, consectetur adipiscing elit. Cras lorem nisi, tincidunt tempus sem nec, elementum feugiat ipsum. Nulla in diam libero. Nunc tristique ex a nibh egestas sollicitudin. + +\paragraph{} +Mauris efficitur vitae ex id egestas. Vestibulum ligula felis, pulvinar a posuere id, luctus vitae leo. Sed ac imperdiet orci, non elementum leo. Nullam molestie congue placerat. Phasellus tempor et libero maximus commodo. + +\end{document} +``` + +### Learn more + +Among the thousands of excellent resources on writing in LaTeX are the guides produced by most universities, which are indexable and can be found on Google search. [Princeton University][12] offers a good extended tutorial, and for a deeper dive, the Princeton guide's creator, Donald Knuth, offers [The TexBook][13], the ultimate guide to LaTeX. + +-------------------------------------------------------------------------------- + +作者简介: + +Aaron Cocker - BSc Computing student attending university in the UK. I am an aspiring Data Scientist. My favourite language is Python. Feel free to contact me at aaron@aaroncocker.org.uk or visit my personal website: https://aaroncocker.org.uk + + +--------------- + +via: https://opensource.com/article/17/6/introduction-latex + +作者:[ Aaron Cocker][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/aaroncocker +[1]:https://opensource.com/file/356521 +[2]:https://opensource.com/file/356526 +[3]:https://opensource.com/file/356541 +[4]:https://opensource.com/file/356536 +[5]:https://opensource.com/file/356531 +[6]:https://opensource.com/article/17/6/introduction-latex?rate=n5CmhY55ZhQRMjd6n5-f2p9f7iGg0nAWh_Bi6jqMMyc +[7]:https://opensource.com/user/123226/feed +[8]:http://www.texstudio.org/ +[9]:https://www.tug.org/mactex/morepackages.html +[10]:https://miktex.org/download +[11]:http://www.lipsum.com/feed/html +[12]:https://www.cs.princeton.edu/courses/archive/spr10/cos433/Latex/latex-guide.pdf +[13]:http://www.ctex.org/documents/shredder/src/texbook.pdf +[14]:https://opensource.com/users/aaroncocker +[15]:https://opensource.com/article/17/6/introduction-latex#comments From 7ac8060f4160d71316e533b2fa210f4ea8a9aa2e Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 25 Jun 2017 10:13:37 +0800 Subject: [PATCH 0511/1407] =?UTF-8?q?20170625-5=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...o avoid when learning to code in Python.md | 225 ++++++++++++++++++ 1 file changed, 225 insertions(+) create mode 100644 sources/tech/20170623 3 mistakes to avoid when learning to code in Python.md diff --git a/sources/tech/20170623 3 mistakes to avoid when learning to code in Python.md b/sources/tech/20170623 3 mistakes to avoid when learning to code in Python.md new file mode 100644 index 0000000000..3588fa07fd --- /dev/null +++ b/sources/tech/20170623 3 mistakes to avoid when learning to code in Python.md @@ -0,0 +1,225 @@ +3 mistakes to avoid when learning to code in Python +============================================================ + +### These errors created big problems that took hours to solve. + +![3 mistakes to avoid when learning to code in Python](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/blocks_building.png?itok=q0_Wo8Tr "3 mistakes to avoid when learning to code in Python") +Image by : opensource.com + +It's never easy to admit when you do things wrong, but making errors is part of any learning process, from learning to walk to learning a new programming language, such as Python. + +Here's a list of three things I got wrong when I was learning Python, presented so that newer Python programmers can avoid making the same mistakes. These are errors that either I got away with for a long time or that that created big problems that took hours to solve. + +Take heed young coders, some of these mistakes are afternoon wasters! + +### 1\. Mutable data types as default arguments in function definitions + +It makes sense right? You have a little function that, let's say, searches for links on a current page and optionally appends it to another supplied list. + +``` +def search_for_links(page, add_to=[]): +    new_links = page.search_for_links() +    add_to.extend(new_links) +    return add_to +``` + +On the face of it, this looks like perfectly normal Python, and indeed it is. It works. But there are issues with it. If we supply a list for the **add_to** parameter, it works as expected. If, however, we let it use the default, something interesting happens. + +Try the following code: + +``` +def fn(var1, var2=[]): +    var2.append(var1) +    print var2 + +fn(3) +fn(4) +fn(5) +``` + +You may expect that we would see: + +**[3] +[4] +[5]** + +But we actually see this: + +**[3] +[3, 4] +[3, 4, 5]** + +Why? Well, you see, the same list is used each time. In Python, when we write the function like this, the list is instantiated as part of the function's definition. It is not instantiated each time the function is run. This means that the function keeps using the exact same list object again and again, unless of course we supply another one: + +``` +fn(3, [4]) +``` + +**[4, 3]** + +Just as expected. The correct way to achieve the desired result is: + +``` +def fn(var1, var2=None): +    if not var2: +        var2 = [] +    var2.append(var1) +``` + +Or, in our first example: + +``` +def search_for_links(page, add_to=None): +    if not add_to: +        add_to = [] +    new_links = page.search_for_links() +    add_to.extend(new_links) +    return add_to +``` + +This moves the instantiation from module load time so that it happens every time the function runs. Note that for immutable data types, like [**tuples**][7], [**strings**][8], or [**ints**][9], this is not necessary. That means it is perfectly fine to do something like: + +``` +def func(message="my message"): +    print message +``` + +### 2\. Mutable data types as class variables + +Hot on the heels of the last error is one that is very similar. Consider the following: + +``` +class URLCatcher(object): +    urls = [] + +    def add_url(self, url): +        self.urls.append(url) +``` + +This code looks perfectly normal. We have an object with a storage of URLs. When we call the **add_url** method, it adds a given URL to the store. Perfect right? Let's see it in action: + +``` +a = URLCatcher() +a.add_url('http://www.google.') +b = URLCatcher() +b.add_url('http://www.bbc.co.') +``` + +**b.urls +['[http://www.google.com][2]', '[http://www.bbc.co.uk][3]']** + +**a.urls +['[http://www.google.com][4]', '[http://www.bbc.co.uk][5]']** + +Wait, what?! We didn't expect that. We instantiated two separate objects, **a** and **b**. **A** was given one URL and **b** the other. How is it that both objects have both URLs? + +Turns out it's kinda the same problem as in the first example. The URLs list is instantiated when the class definition is created. All instances of that class use the same list. Now, there are some cases where this is advantageous, but the majority of the time you don't want to do this. You want each object to have a separate store. To do that, we would modify the code like: + +``` +class URLCatcher(object): +    def __init__(self): +        self.urls = [] + +    def add_url(self, url): +        self.urls.append(url) +``` + +Now the URLs list is instantiated when the object is created. When we instantiate two separate objects, they will be using two separate lists. + +### 3\. Mutable assignment errors + +This one confused me for a while. Let's change gears a little and use another mutable datatype, the [**dict**][10]. + +``` +a = {'1': "one", '2': 'two'} +``` + +Now let's assume we want to take that **dict** and use it someplace else, leaving the original intact. + +``` +b = a + +b['3'] = 'three' +``` + +Simple eh? + +Now let's look at our original dict, **a**, the one we didn't want to modify: + +``` +{'1': "one", '2': 'two', '3': 'three'} +``` + +Whoa, hold on a minute. What does **b** look like then? + +``` +{'1': "one", '2': 'two', '3': 'three'} +``` + +Wait what? But… let's step back and see what happens with our other immutable types, a **tuple** for instance: + +``` +c = (2, 3) +d = c +d = (4, 5) +``` + +Now **c** is: +**(2, 3)** + +While **d** is: +**(4, 5)** + +That functions as expected. So what happened in our example? When using mutable types, we get something that behaves a little more like a pointer from C. When we said **b = a** in the code above, what we really meant was: **b** is now also a reference to **a**. They both point to the same object in Python's memory. Sound familiar? That's because it's similar to the previous problems. In fact, this post should really have been called, "The Trouble with Mutables." + +Does the same thing happen with lists? Yes. So how do we get around it? Well, we have to be very careful. If we really need to copy a list for processing, we can do so like: + +``` +b = a[:] +``` + +This will go through and copy a reference to each item in the list and place it in a new list. But be warned: If any objects in the list are mutable, we will again get references to those, rather than complete copies. + +Imagine having a list on a piece of paper. In the original example, Person A and Person B are looking at the same piece of paper. If someone changes that list, both people will see the same changes. When we copy the references, each person now has their own list. But let's suppose that this list contains places to search for food. If "fridge" is first on the list, even when it is copied, both entries in both lists point to the same fridge. So if the fridge is modified by Person A, by say eating a large gateaux, Person B will also see that the gateaux is missing. There is no easy way around this. It is just something that you need to remember and code in a way that will not cause an issue. + +Dicts function in the same way, and you can create this expensive copy by doing: + +``` +b = a.copy() +``` + +Again, this will only create a new dictionary pointing to the same entries that were present in the original. Thus, if we have two lists that are identical and we modify a mutable object that is pointed to by a key from dict 'a', the dict object present in dict 'b' will also see those changes. + +The trouble with mutable data types is that they are powerful. None of the above are real problems; they are things to keep in mind to prevent issues. The expensive copy operations presented as solutions in the third item are unnecessary 99% of the time. Your program can and probably should be modified so that those copies are not even required in the first place. + + _Happy coding! And feel free to ask questions in the comments._ + +-------------------------------------------------------------------------------- + +作者简介: + +Pete Savage - Peter is a passionate Open Source enthusiast who has been promoting and using Open Source products for the last 10 years. He has volunteered in many different areas, starting in the Ubuntu community, before moving off into the realms of audio production and later into writing. Career wise he spent much of his early years managing and building datacenters as a sysadmin, before ending up working for Red Hat as a Principal Quailty Engineer for the CloudForms product. He occasionally pops out a + +----------------- + +via: https://opensource.com/article/17/6/3-things-i-did-wrong-learning-python + +作者:[Pete Savage ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/psav +[1]:https://opensource.com/article/17/6/3-things-i-did-wrong-learning-python?rate=SfClhaQ6tQsJdKM8-YTNG00w53fsncvsNWafwuJbtqs +[2]:http://www.google.com/ +[3]:http://www.bbc.co.uk/ +[4]:http://www.google.com/ +[5]:http://www.bbc.co.uk/ +[6]:https://opensource.com/user/36026/feed +[7]:https://docs.python.org/2/library/functions.html?highlight=tuple#tuple +[8]:https://docs.python.org/2/library/string.html +[9]:https://docs.python.org/2/library/functions.html#int +[10]:https://docs.python.org/2/library/stdtypes.html?highlight=dict#dict +[11]:https://opensource.com/users/psav +[12]:https://opensource.com/article/17/6/3-things-i-did-wrong-learning-python#comments From a2c8e0ecba5b279d8b37c86e74695b315e679d6d Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 25 Jun 2017 10:15:51 +0800 Subject: [PATCH 0512/1407] =?UTF-8?q?20170625-6=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit LC3 --- ...dump for examining Linux Kernel crashes.md | 313 ++++++++++++++++++ 1 file changed, 313 insertions(+) create mode 100644 sources/tech/20170621 Using Kdump for examining Linux Kernel crashes.md diff --git a/sources/tech/20170621 Using Kdump for examining Linux Kernel crashes.md b/sources/tech/20170621 Using Kdump for examining Linux Kernel crashes.md new file mode 100644 index 0000000000..d22db18362 --- /dev/null +++ b/sources/tech/20170621 Using Kdump for examining Linux Kernel crashes.md @@ -0,0 +1,313 @@ +Using Kdump for examining Linux Kernel crashes +============================================================ + +### Let's examine the basics of kdump usage and look at the internals of kdump/kexec kernel implementation. + +![Using Kdump for examining Linux Kernel crashes](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/linux_boot.png?itok=pSGmf8Ca "Using Kdump for examining Linux Kernel crashes") +Image by :  + +[Penguin][13], [Boot][14]. Modified by Opensource.com. [CC BY-SA 4.0][15]. + +[Kdump][16] is a way to acquire a crashed Linux kernel dump, but finding documents that explain its usage and internals can be challenging. In this article, I'll examine the basics of kdump usage and look at the internals of kdump/kexec kernel implementation. + +[Kexec][17] is a Linux kernel-to-kernel boot loader that helps to boot the second kernel from the context of first kernel. Kexec shuts down the first kernel, bypasses the BIOS or firmware stage, and jumps to second kernel. Thus, reboots become faster in absence of the BIOS stage. + +Kdump can be used with the kexec application—for example, when the second kernel is booted when the first kernel panics, the second kernel is used to copy the memory dump of first kernel, which can be analyzed with tools such as gdb and crash to determine the panic reasons. (In this article, I'll use the terms  _first kernel_  for the currently running kernel,  _second kernel_  for the kernel run using kexec, and  _capture kernel_  for kernel run when current kernel panics.) + +More Linux resources + +* [What is Linux?][1] + +* [What are Linux containers?][2] + +* [Download Now: Linux commands cheat sheet][3] + +* [Advanced Linux commands cheat sheet][4] + +* [Our latest Linux articles][5] + +The kexec mechanism has components in the kernel as well as in user space. The kernel provides few system calls for kexec reboot functionality. A user space tool called kexec-tools uses those calls and provides an executable to load and boot the second kernel. Sometimes a distribution also adds wrappers on top of kexec-tools, which helps capture and save the dump for various dump target configurations. In this article, I will use the name  _distro-kexec-tools_  to avoid confusion between upstream kexec-tools and distro-specific kexec-tools code. My example will use the Fedora Linux distribution. + +### Fedora kexec-tools + +**dnf install kexec-tools** installs fedora-kexec-tools on Fedora machines. The kdump service can be started by executing **systemctl start kdump** after installation of fedora-kexec-tools. When this service starts, it creates a root file system (initramfs) that contains resources to mount the target for saving vmcore, and a command to copy/dump vmcore to the target. This service then loads the kernel and initramfs at the suitable location within the crash kernel region so that they can be executed upon kernel panic. + +Fedora wrapper provides two user configuration files: + +1. **/etc/kdump.conf** specifies configuration parameters whose modification requires rebuild of the initramfs. For example, if you change the dump target from a local disk to an NFS-mounted disk, you will need NFS-related kernel modules to be loaded by the capture kernel. + +2. **/etc/sysconfig/kdump** specifies configuration parameters whose modification do not require rebuild of the initramfs. For example, you do not need to rebuild the initramfs if you only need to modify command-line arguments passed to the capture kernel. + +If the kernel panics after the kdump service starts, then the capture kernel is executed, which further executes the vmcore save process from initramfs and reboots to a stable kernel afterward. + +### kexec-tools + +Compilation of kexec-tools source code provides an executable called **kexec**. The same executable can be used to load and execute a second kernel or to load a capture kernel, which can be executed upon kernel panic. + +A typical command to load a second kernel: + +``` +# kexec -l kernel.img --initrd=initramfs-image.img –reuse-cmdline +``` + +**--reuse-command** line says to use the same command line as that of first kernel. Pass initramfs using **--initrd**. **-l** says that you are loading the second kernel, which can be executed by the kexec application itself (**kexec -e**). A kernel loaded using **-l** cannot be executed at kernel panic. You must pass **-p**instead of **-l** to load the capture kernel that can be executed upon kernel panic. + +A typical command to load a capture kernel: + +``` +# kexec -p kernel.img --initrd=initramfs-image.img –reuse-cmdline +``` + +**echo c > /pros/sysrq-trigger** can be used to crash the kernel for test purposes. See **man kexec** for detail about options provided by kexec-tools. Before moving to the next section, which focuses on internal implementation, watch this kexec_dump demo: + + ** 此处有iframe,请手动处理 ** + +### Kdump: End-to-end flow + +Figure 1 shows a flow diagram. Crashkernel memory must be reserved for the capture kernel during booting of the first kernel. You can pass **crashkernel=Y@X** in the kernel command line, where **@X** is optional. **crashkernel=256M** works with most of the x86_64 systems; however, selecting a right amount of memory for the crash kernel is dependent on many factors, such as kernel size and initramfs, as well as runtime memory requirement of modules and applications included in initramfs. See the [kernel-parameters documentation][18] for more ways to pass crash kernel arguments. + +![pratyush_f1.png](https://opensource.com/sites/default/files/images/life/pratyush_f1.png) + +You can pass kernel and initramfs images to a **kexec** executable as shown in the typical command of section (**kexec-tools**). The capture kernel can be the same as the first kernel or can be different. Typically, keep it the same. Initramfs can be optional; for example, when the kernel is compiled with **CONFIG_INITRAMFS_SOURCE**, you do not need it. Typically, you keep a different capture initramfs from the first initramfs, because automating a copy of vmcore in capture initramfs is better. When **kexec** is executed, it also loads **elfcorehdr** data and the purgatory executable. **elfcorehdr** has information about the system RAM memory organization, and purgatory is a binary that executes before the capture kernel executes and verifies that the second stage binary/data have the correct SHA. Purgatory can be made optional as well. + +When the first kernel panics, it does a minimal necessary exit process and switches to purgatory if it exists. Purgatory verifies SHA256 of loaded binaries and, if those are correct, then it passes control to the capture kernel. The capture kernel creates vmcore per the system RAM information received from **elfcorehdr**. Thus, you will see a dump of the first kernel in /proc/vmcore after the capture kernel boots. Depending on the initramfs you have used, you can now analyze the dump, copy it to any disk, or there can be an automated copy followed by reboot to a stable kernel. + +### Kernel system calls + +The kernel provides two system calls—**kexec_load()** and **kexec_file_load()**, which can be used to load the second kernel when **kexec -l** is executed. It also provides an extra flag for the **reboot()** system call, which can be used to boot into second kernel using **kexec -e**. + +**kexec_load()**: The **kexec_load()** system call loads a new kernel that can be executed later by **reboot()**. Its prototype is defined as follows: + +``` +long kexec_load(unsigned long entry, unsigned long nr_segments, +struct kexec_segment *segments, unsigned long flags); +``` + +User space needs to pass segments for different components, such as kernel, initramfs, etc. Thus, the **kexec** executable helps in preparing these segments. The structure of **kexec_segment** looks like as follows: + +``` +struct kexec_segment { + void *buf; + /* Buffer in user space */ + size_t bufsz; + /* Buffer length in user space */ + void *mem; + /* Physical address of kernel */ + size_t memsz; + /* Physical address length */ +}; +``` + +When **reboot()** is called with **LINUX_REBOOT_CMD_KEXEC**, it boots into a kernel loaded by **kexec_load()**. If a flag **KEXEC_ON_CRASH** is passed to **kexec_load()**, then the loaded kernel will not be executed with **reboot(LINUX_REBOOT_CMD_KEXEC)**; rather, that will be executed on kernel panic. **CONFIG_KEXEC** must be defined to use kexec and **CONFIG_CRASH_DUMP** should be defined for kdump. + +**kexec_file_load()**: As a user you pass only two arguments (i.e., kernel and initramfs) to the **kexec** executable. **kexec** then reads data from sysfs or other kernel information source and creates all segments. So, **kexec_file_load()**gives you simplification in user space, where you pass only file descriptors of kernel and initramfs. The rest of the all segment preparation is done by the kernel itself. **CONFIG_KEXEC_FILE** should be enabled to use this system call. Its prototype looks like: + +``` +long kexec_file_load(int kernel_fd, int initrd_fd, unsigned long +cmdline_len, const char __user * cmdline_ptr, unsigned long +flags); +``` + +Notice that **kexec_file_load()** also accepts the command line, whereas **kexec_load()** did not. The kernel has different architecture-specific ways to accept the command line. Therefore, **kexec-tools** passes the command-line through one of the segments (like in **dtb** or **ELF boot notes**, etc.) in case of **kexec_load()**. + +Currently, **kexec_file_load()** is supported for x86 and PowerPC only. + +### What happens when the kernel crashes + +When the first kernel panics, before control is passed to the purgatory or capture kernel it does the following: + +* prepares CPU registers (see **crash_setup_regs()** in kernel code); + +* updates vmcoreinfo note (see **crash_save_vmcoreinfo()**); + +* shuts down non-crashing CPUs and saves the prepared registers (see **machine_crash_shutdown()** and **crash_save_cpu()**); + +* you also might need to disable the interrupt controller here; + +* and at the end, it performs the kexec reboot (see **machine_kexec()**), which loads/flushes kexec segments to memory and passes control to the execution of entry segment. Entry segment could be purgatory or start address of next kernel. + +### ELF program headers + +Most of the dump cores involved in kdump are in ELF format. Thus, understanding ELF Program headers is important, especially if you want to find issues with vmcore preparation. Each ELF file has a program header that: + +* is read by the system loader, + +* describes how the program should be loaded into memory, + +* and one can use **Objdump -p elf_file** to look into program headers. + +An example of ELF program headers of a vmcore: + +``` +# objdump -p vmcore +vmcore: +file format elf64-littleaarch64 +Program Header: +NOTE off 0x0000000000010000 vaddr 0x0000000000000000 paddr 0x0000000000000000 align 2**0 filesz +0x00000000000013e8 memsz 0x00000000000013e8 flags --- +LOAD off 0x0000000000020000 vaddr 0xffff000008080000 paddr 0x0000004000280000 align 2**0 filesz +0x0000000001460000 memsz 0x0000000001460000 flags rwx +LOAD off 0x0000000001480000 vaddr 0xffff800000200000 paddr 0x0000004000200000 align 2**0 filesz +0x000000007fc00000 memsz 0x000000007fc00000 flags rwx +LOAD off 0x0000000081080000 vaddr 0xffff8000ffe00000 paddr 0x00000040ffe00000 align 2**0 filesz +0x00000002fa7a0000 memsz 0x00000002fa7a0000 flags rwx +LOAD off 0x000000037b820000 vaddr 0xffff8003fa9e0000 paddr 0x00000043fa9e0000 align 2**0 filesz +0x0000000004fc0000 memsz 0x0000000004fc0000 flags rwx +LOAD off 0x00000003807e0000 vaddr 0xffff8003ff9b0000 paddr 0x00000043ff9b0000 align 2**0 filesz +0x0000000000010000 memsz 0x0000000000010000 flags rwx +LOAD off 0x00000003807f0000 vaddr 0xffff8003ff9f0000 paddr 0x00000043ff9f0000 align 2**0 filesz +0x0000000000610000 memsz 0x0000000000610000 flags rwx +``` + +In this example, there is one note section and the rest are load sections. The note section has information about CPU notes and load sections have information about copied system RAM components. + +Vmcore starts with **elfcorehdr**, which has the same structure as that of a an ELF program header. See the representation of **elfcorehdr** in Figure 2: + +![pratyush_f2.png](https://opensource.com/sites/default/files/images/life/pratyush_f2.png) + +**kexec-tools** reads /sys/devices/system/cpu/cpu%d/crash_notes and prepares headers for **CPU PT_NOTE**. Similarly, it reads **/sys/kernel/vmcoreinfo** and prepares headers for **vmcoreinfo PT_NOTE**, and reads system RAM values from **/proc/iomem** and prepares memory **PT_LOAD** headers. When the capture kernel receives **elfcorehdr**, it appends data from addresses mentioned in the header and prepares vmcore. + +### Crash notes + +Crash notes is a per-CPU area for storing CPU states in case of a system crash; it has information about current PID and CPU registers. + +### vmcoreinfo + +This note section has various kernel debug information, such as struct size, symbol values, page size, etc. Values are parsed by capture kernel and embedded into **/proc/vmcore**. **vmcoreinfo** is used mainly by the **makedumpfile** application. **include/linux/kexec.h** in the Linux kernel has macros to define a new **vmcoreinfo**. Some of the example macros are like these: + +* **VMCOREINFO_PAGESIZE()** + +* **VMCOREINFO_SYMBOL()** + +* **VMCOREINFO_SIZE()** + +* **VMCOREINFO_STRUCT_SIZE()** + +### makedumpfile + +Much information (such as free pages) in a vmcore is not useful. Makedumpfile is an application that excludes unnecessary pages, such as: + +* pages filled with zeroes, + +* cache pages without private flag (non-private cache); + +* cache pages with private flag (private cache); + +* user process data pages; + +* free pages. + +Additionally, makedumpfile compresses **/proc/vmcore** data while copying. It can also erase sensitive symbol information from dump; however, it first needs kernel's debug information to do that. This debug information comes from either **VMLINUX** or **vmcoreinfo**, and its output either can be in ELF format or kdump-compressed format. + +Typical usage: + +``` +# makedumpfile -l --message-level 1 -d 31 /proc/vmcore makedumpfilecore +``` + +See **man makedumpfile** for detail. + +### Debugging kdump issues + +Issues that new kdump users might have: + +### _Kexec -p kernel_image_  did not succeed + +* Check whether crash memory is allocated. + +* **cat /sys/kernel/kexec_crash_size** should have no zero value. + +* **cat /proc/iomem | grep "Crash kernel"** should have an allocated range. + +* If not allocated, then pass the proper **crashkernel=** argument in the command line. + +* If nothing shows up, then pass **-d** in the **kexec** command and share the debug output with the kexec-tools mailing list. + +### Do not see anything on console after last message from first kernel (such as "bye") + +* Check whether **kexec -l kernel_image** followed by **kexec -e** works. + +* Might be missing architecture- or machine-specific options. + +* Might have purgatory SHA verification failed. If your architecture does not support a console in purgatory, then it is difficult to debug. + +* Might have second kernel crashed early. + +* Pass **earlycon**/**earlyprintk** option for your system to the second kernel command line. + +* Share **dmesg** log of both the first and capture kernel with kexec-tools mailing list. + +### Resources + +#### fedora-kexec-tools + +* Repository: **git://pkgs.fedoraproject.org/kexec-tools** + +* Mailing list: [kexec@lists.fedoraproject.org][7] + +* Description: Specs file and scripts to provide user-friendly command/services so that **kexec-tools** can be automated in different user scenarios. + +#### kexec-tools + +* Repository: git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git + +* Mailing list: [kexec@lists.infradead.org][8] + +* Description: Uses kernel system calls and provides a user command **kexec**. + +#### Linux kernel + +* Repository: **git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git** + +* Mailing list: [kexec@lists.infradead.org][9] + +* Description: Implements **kexec_load()**, **kexec_file_load()**, and **reboot()**system call and architecture-specific code, such as **machine_kexec()** and **machine_crash_shutdown()**, etc. + +#### Makedumpfile + +* Repository: **git://git.code.sf.net/p/makedumpfile/code** + +* Mailing list: [kexec@lists.infradead.org][10] + +* Description: Compresses and filters unnecessary component from the dumpfile. + + _Learn more in Pratyush Anand's [KDUMP: Usage and Internals][11] talk at LinuxCon ContainerCon CloudOpen China on June 20, 2017._ + +-------------------------------------------------------------------------------- + + +作者简介: + +Pratyush Anand - Pratyush is working with Red Hat as a Linux Kernel Generalist. Primarily, he takes care of several kexec/kdump issues being faced by Red Hat product and upstream. He also handles other kernel debugging/tracing/performance issues around Red Hat supported ARM64 platforms. Apart from Linux Kernel, he has also contributed in upstream kexec-tools and makedumpfile project. He is an open source enthusiast and delivers volunteer lectures in educational institutes for the promotion of FOSS. + +------- + + +via: https://opensource.com/article/17/6/kdump-usage-and-internals + +作者:[Pratyush Anand ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/pratyushanand +[1]:https://opensource.com/resources/what-is-linux?src=linux_resource_menu +[2]:https://opensource.com/resources/what-are-linux-containers?src=linux_resource_menu +[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=7016000000127cYAAQ +[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?src=linux_resource_menu&intcmp=7016000000127cYAAQ +[5]:https://opensource.com/tags/linux?src=linux_resource_menu +[6]:https://opensource.com/article/17/6/kdump-usage-and-internals?rate=7i_-TnAGi8Q9GR7fhULKlQUNJw8KWgzadgMY9TDuiAY +[7]:mailto:kexec@lists.fedoraproject.org +[8]:mailto:kexec@lists.infradead.org +[9]:mailto:kexec@lists.infradead.org +[10]:mailto:kexec@lists.infradead.org +[11]:http://sched.co/AVB4 +[12]:https://opensource.com/user/143191/feed +[13]:https://pixabay.com/en/penguins-emperor-antarctic-life-429136/ +[14]:https://pixabay.com/en/shoe-boots-home-boots-house-1519804/ +[15]:https://creativecommons.org/licenses/by-sa/4.0/ +[16]:https://www.kernel.org/doc/Documentation/kdump/kdump.txt +[17]:https://linux.die.net/man/8/kexec +[18]:https://github.com/torvalds/linux/blob/master/Documentation/admin-guide/kernel-parameters.txt +[19]:https://opensource.com/users/pratyushanand From 79a5070e167183b227c813fce2f46afa386693c9 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 25 Jun 2017 10:17:16 +0800 Subject: [PATCH 0513/1407] =?UTF-8?q?20170625-7=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ecting and mapping Twitter data using R.md | 178 ++++++++++++++++++ 1 file changed, 178 insertions(+) create mode 100644 sources/tech/20170620 A beginners guide to collecting and mapping Twitter data using R.md diff --git a/sources/tech/20170620 A beginners guide to collecting and mapping Twitter data using R.md b/sources/tech/20170620 A beginners guide to collecting and mapping Twitter data using R.md new file mode 100644 index 0000000000..ec00ced6f3 --- /dev/null +++ b/sources/tech/20170620 A beginners guide to collecting and mapping Twitter data using R.md @@ -0,0 +1,178 @@ +A beginner's guide to collecting and mapping Twitter data using R +============================================================ + +### Learn to use R's twitteR and leaflet packages, which allow you to map the location of tweets on any topic. + +![A beginner's guide to collecting and mapping Twitter data using R](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/cloud-globe.png?itok=H4f-RAz_ "A beginner's guide to collecting and mapping Twitter data using R") +Image by :  + +[Jason Baker][14]. [CC BY-SA 4.0][15]. Source: [Cloud][16], [Globe][17]. Both [CC0][18]. + +When I started learning R, I also needed to learn how to collect Twitter data and map it for research purposes. Despite the wealth of information on the internet about this topic, I found it difficult to understand what was involved in collecting and mapping Twitter data. Not only was I was a novice to R, but I was also unfamiliar with the technical terms in the various tutorials. Despite these barriers, I was successful! In this tutorial, I will break down how to collect Twitter data and display it on a map in a way that even novice coders can understand. + +Programming and development + +* [New Python content][1] + +* [Our latest JavaScript articles][2] + +* [Recent Perl posts][3] + +* [Red Hat Developers Blog][4] + +### Create the app + +If you don't have a Twitter account, the first thing you need to do is to [create one][19]. After that, go to [apps.twitter.com][20] to create an app that allows you to collect Twitter data. Don't worry, creating the app is extremely easy. The app you create will connect to the Twitter application program interface (API). Think of an API as an electronic personal assistant of sorts. You will be using the API to ask another program to do something for you. In this case, you will be connecting to the Twitter API and asking it to collect data. Just make sure you don't ask too much, because there is a [limit][21] on how many times you can request Twitter data. + +There are two APIs that you can use to collect tweets. If you want to do a one-time collection of tweets, then you'll use the **REST API**. If you want to do a continuous collection of tweets for a specific time period, you'll use the **streaming API**. In this tutorial, I'll focus on using the REST API. + +After you create your app, go to the **Keys and Access Tokens** tab. You will need the Consumer Key (API key), Consumer Secret (API secret), Access Token, and Access Token Secret to access your app in R. + +### Collect the Twitter data + +The next step is to open R and get ready to write code. For beginners, I recommend using [RStudio][22], the integrated development environment (IDE) for R. I find using RStudio helpful when I am troubleshooting or testing code. R has a package to access the REST API called **[twitteR][8]**. + +Open RStudio and create a new RScript. Once you have done this, you will need to install and load the **twitteR** package: + +``` +install.packages("twitteR") +#installs TwitteR +library (twitteR) +#loads TwitteR +``` + +Once you've installed and loaded the **twitteR** package, you will need to enter the your app's API information from the section above: + +``` +api_key <- "" + #in the quotes, put your API key +api_secret <- "" + #in the quotes, put your API secret token +token <- "" + #in the quotes, put your token +token_secret <- "" + #in the quotes, put your token secret +``` + +Next, connect to Twitter to access the API: + +``` +setup_twitter_oauth(api_key, api_secret, token, token_secret) +``` + +Let's try doing a Twitter search about community gardens and farmers markets: + +``` +tweets <- searchTwitter("community garden OR #communitygarden OR farmers market OR #farmersmarket", n = 200, lang = "en") +``` + +This code simply says to search for the first 200 tweets **(n = 200)** in English **(lang = "en")**, which contain the terms **community garden** or **farmers market**or any hashtag mentioning these terms. + +After you have done your Twitter search, save your results in a data frame: + +``` +tweets.df <-twListToDF(tweets) +``` + +To create a map with your tweets, you will need to export what you collected into a **.csv** file: + +``` +write.csv(tweets.df, "C:\Users\YourName\Documents\ApptoMap\tweets.csv") + #an example of a file extension of the folder in which you want to save the .csv file. +``` + +Make sure you save your **R** code before running it and moving on to the next step. + +### Create the map + +Now that you have data, you can display it in a map. For this tutorial, we will make a basic app using the R package **[Leaflet][9]**, a popular JavaScript library for making interactive maps. Leaflet uses the [**magrittr**][23] pipe operator (**%>%**), which makes it easier to write code because the syntax is more natural. It might seem strange at first, but it does cut down on the amount of work you have to do when writing code. + +For the sake of clarity, open a new R script in RStudio and install these packages: + +``` +install.packages("leaflet") +install.packages("maps") +library(leaflet) +library(maps) +``` + +Now you need a way for Leaflet to access your data: + +``` +read.csv("C:\Users\YourName\Documents\ApptoMap\tweets.csv", stringsAsFactors = FALSE) +``` + +**stringAsFactors = FALSE** means to keep the information as it is and not convert it into factors. (For information about factors, read the article ["stringsAsFactors: An unauthorized biography"][24], by Roger Peng.) + +It's time to make your Leaflet map. You are going to use the **OpenStreetMap**base map for your map: + +``` +m <- leaflet(mymap) %>% addTiles() +``` + +Let's add circles to the base map. For **lng** and **lat**, enter the name of the columns that contain the latitude and longitude of your tweets followed by **~**. The **~longitude** and **~latitude** refer to the name of the columns in your **.csv** file: + +``` +m %>% addCircles(lng = ~longitude, lat = ~latitude, popup = mymap$type, weight = 8, radius = 40, color = "#fb3004", stroke = TRUE, fillOpacity = 0.8) +``` + +Run your code. A web browser should pop up and display your map. Here is a map of the tweets that I collected in the previous section: + +### [leafletmap.jpg][6] + +![Map of tweets by location](https://opensource.com/sites/default/files/leafletmap.jpg "Map of tweets by location") + +Map of tweets by location, Leaflet and OpenStreetMap, [CC-BY-SA][5] + + + +Although you might be surprised with the small number of tweets on the map, typically only 1% of tweets are geocoded. I collected a total of 366 tweets, but only 10 (around 3% of total tweets) were geocoded. If you are having trouble getting geocoded tweets, change your search terms to see if you get a better result. + +### Wrapping up + +For beginners, putting all the pieces together to create a Leaflet map from Twitter data can be overwhelming. This tutorial is based on my experiences doing this task, and I hope it makes the learning process easier for you. + + _Dorris Scott will present this topic in a workshop, [From App to Map: Collecting and Mapping Social Media Data using R][10], at the [We Rise][11] Women in Tech Conference ([#WeRiseTech][12]) June 23-24 in Atlanta._ + +-------------------------------------------------------------------------------- + +作者简介: + +Dorris Scott - Dorris Scott is a PhD student in geography at the University of Georgia. Her research emphases are in Geographic Information Systems (GIS), geographic data science, visualization, and public health. Her dissertation is on combining traditional and non-traditional data about Veteran’s Affairs hospitals in a GIS interface to help patients make more informed decisions regarding their healthcare. + + +----------------- +via: https://opensource.com/article/17/6/collecting-and-mapping-twitter-data-using-r + +作者:[Dorris Scott ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/dorrisscott +[1]:https://opensource.com/tags/python?src=programming_resource_menu +[2]:https://opensource.com/tags/javascript?src=programming_resource_menu +[3]:https://opensource.com/tags/perl?src=programming_resource_menu +[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu +[5]:https://creativecommons.org/licenses/by-sa/2.0/ +[6]:https://opensource.com/file/356071 +[7]:https://opensource.com/article/17/6/collecting-and-mapping-twitter-data-using-r?rate=Rnu6Lf0Eqvepznw75VioNPWIaJQH39pZETBfu2ZI3P0 +[8]:https://cran.r-project.org/web/packages/twitteR/twitteR.pdf +[9]:https://rstudio.github.io/leaflet +[10]:https://werise.tech/sessions/2017/4/16/from-app-to-map-collecting-and-mapping-social-media-data-using-r?rq=social%20mapping +[11]:https://werise.tech/ +[12]:https://twitter.com/search?q=%23WeRiseTech&src=typd +[13]:https://opensource.com/user/145006/feed +[14]:https://opensource.com/users/jason-baker +[15]:https://creativecommons.org/licenses/by-sa/4.0/ +[16]:https://pixabay.com/en/clouds-sky-cloud-dark-clouds-1473311/ +[17]:https://pixabay.com/en/globe-planet-earth-world-1015311/ +[18]:https://creativecommons.org/publicdomain/zero/1.0/ +[19]:https://twitter.com/signup +[20]:https://apps.twitter.com/ +[21]:https://dev.twitter.com/rest/public/rate-limiting +[22]:https://www.rstudio.com/ +[23]:https://github.com/smbache/magrittr +[24]:http://simplystatistics.org/2015/07/24/stringsasfactors-an-unauthorized-biography/ +[25]:https://opensource.com/users/dorrisscott From 244ad74a9a251fc9ce22d63b881f096c5c125b99 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 25 Jun 2017 10:36:50 +0800 Subject: [PATCH 0514/1407] =?UTF-8?q?20170625-8=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20170617 Top 8 IDEs for Raspberry Pi.md | 241 ++++++++++++++++++ 1 file changed, 241 insertions(+) create mode 100644 sources/tech/20170617 Top 8 IDEs for Raspberry Pi.md diff --git a/sources/tech/20170617 Top 8 IDEs for Raspberry Pi.md b/sources/tech/20170617 Top 8 IDEs for Raspberry Pi.md new file mode 100644 index 0000000000..8091a1e04a --- /dev/null +++ b/sources/tech/20170617 Top 8 IDEs for Raspberry Pi.md @@ -0,0 +1,241 @@ +Top 8 IDEs for Raspberry Pi +============================================================ + + + _![](https://i2.wp.com/opensourceforu.com/wp-content/uploads/2017/05/LEGO_brick_robot_05.jpg?resize=700%2C479)_ + + _The Raspberry Pi, a tiny single-board computer, has revolutionised the way in which computer science is being taught in schools. It has also turned out to be a boon for software developers. Currently, it has gained popularity much beyond its target market and is being used in robotics projects._ + +Raspberry Pi, a small development board minicomputer that runs the Linux operating system, was developed in the United Kingdom by the Raspberry Pi Foundation to promote the teaching of basic computer science in schools in the UK and in developing countries. Raspberry Pi has USB sockets, which support various peripheral plug-and-play devices like the keyboard, the mouse, the printer, etc. It contains ports like HDMI (High Definition Multimedia Interface) to provide users with video output. Its credit-card-like size makes it extremely portable and affordable. It requires just a 5V micro-USB power supply, similar to the one used to charge a mobile phone. + +Over the years, the Raspberry Pi Foundation has released a few different versions of the Pi board. The first version was Raspberry Pi 1 Model B, which was followed by a simple and cheap Model A. In 2014, the Foundation released a significant and improved version of the board —Raspberry Pi 1 Model B+. In 2015, the Foundation revolutionised the design of the board by releasing a small form factor edition costing US$ 5 (about ` 323) called Raspberry Pi Zero. + +In February 2016, Raspberry Pi 3 Model B was launched, which is currently the main product available. In 2017, the Foundation released the updated model of Raspberry Pi Zero named Raspberry Pi Zero W (W = wireless). + +In the near future, a model that has improved technical specifications will arrive, offering a robust platform for embedded systems enthusiasts, researchers, hobbyists and engineers to use it in multi-functional ways to develop real-time applications. + + [![](https://i0.wp.com/opensourceforu.com/wp-content/uploads/2017/05/Figure-1-8.jpg?resize=350%2C198)][3] + +Figure 1: Raspberry Pi + +**Raspberry Pi as an efficient programming device** + +After getting the Pi powered up and the LXDE WM up and running, the user gets a full-fledged Linux box running a Debian based operating system, i.e., Raspbian. The Raspbian operating system comes with tons of free and open source utilities for users, covering programming, gaming, applications and even education. + +The official programming language of Raspberry Pi is Python, which comes preloaded with the Raspbian operating system. The combination of Raspberry Pi and IDLE3, a Python integrated development environment, enables programmers to develop all sorts of Python based programs. + +In addition to Python, various other languages are supported by Raspberry Pi. A number of IDEs (integrated development environments) that are free and open source are also available. These allow programmers, developers and application engineers to develop programs and applications on Pi. + + [![](https://i2.wp.com/opensourceforu.com/wp-content/uploads/2017/05/Figure-2-6.jpg?resize=350%2C230)][4] + +Figure 2: The BlueJ GUI interface + + [![](https://i2.wp.com/opensourceforu.com/wp-content/uploads/2017/05/Figure-3-3.jpg?resize=350%2C288)][5] + +Figure 3: The Geany IDE GUI interface + +**Best IDEs for Raspberry Pi** + +As a programmer and developer, the first thing you require is an IDE, which is regarded as a comprehensive software suite that integrates the basic tools that developers and programmers require to write, compile and test their software. An IDE contains a code editor, a compiler or interpreter and a debugger, which the developer can access via a graphical user interface (GUI). One of the main aims of an IDE is to reduce the configuration necessary to piece together multiple development utilities, and provide the same set of capabilities as a cohesive unit. + +An IDE’s user interface is similar to that of a word processor, for which tools in the toolbar support colour-coding, formatting of source code, error diagnostics, reporting and intelligent code completion. IDEs are designed to integrate with third-party version control libraries like GitHub or Apache Subversion. Some IDEs are dedicated to a particular programming language, allowing a feature set that matches the programming language, while some support multiple languages. + +Raspberry Pi has a wide range of IDEs that provide programmers with good interfaces to develop source code, applications and system programs. + +Let’s explore the top IDEs for Raspberry Pi. + + [![](https://i2.wp.com/opensourceforu.com/wp-content/uploads/2017/05/Figure-4-3.jpg?resize=350%2C216)][6] + +Figure 4: The Adafruit WebIDE GUI interface + +**BlueJ** + +BlueJ is an IDE that is dedicated to the Java Programming Language and was mainly developed for educational purposes. It also supports short software development projects. Michael Kolling and John Rosenburg at Monash University, Australia, started BlueJ development in 2000 as a powerful successor to the Blue system, and BlueJ became free and open source in March 2009. + +BlueJ provides an efficient way for learning object-oriented programming concepts and the GUI provides a class structure for applications like UML diagram. Every OOPS based concept, like class, objects and function calling, can be represented via interaction based design. + + _**Features**_ + +* _Simple and interactive interface:_  The user interface is simple and easy to learn as compared to other professional interfaces like NetBeans or Eclipse. Developers can focus mainly on programming rather than the environment. + +* _Portable:_  BlueJ supports multiple platforms like Windows, Linux and Mac OS X, and can even run without any installation. + +* _New innovations:_  BlueJ IDE is filled with innovations in terms of the object bench, code pad and scope colouring, which makes development fun even for newbies. + +* _Strong technical support:_  BlueJ has a hard-core functioning team that responds to queries and offers solutions to all sorts of developer problems within 24 hours. + +**Latest version:** 4.0.1 + +**Geany IDE** + +Geany IDE is regarded as a very lightweight GUI based text editor that uses Scintilla and GTK+ with IDE environment support. The unique thing about Geany is that it is designed to be independent of a special desktop environment and requires only a few dependencies on other packages. It only requires GTK2 runtime libraries for execution. Geany IDE supports tons of programming languages like C, C++, C#, Java, HTML, PHP, Python, Perl, Ruby, Erlang and even LaTeX. + + _**Features**_ + +* Auto-completion of code and simple code navigation. + +* Efficient syntax highlighting and code folding. + +* Supports embedded terminal emulator, and is highly extensible and feature-rich since lots of plugins are available for free download. + +* Simple project management and supports multiple file types, which include C, Java, PHP, HTML, Python, Perl, and many more. + +* Highly customised interface for adding or removing options, bars and windows. + +**Latest version:** 1.30.1 + + [![](https://i2.wp.com/opensourceforu.com/wp-content/uploads/2017/05/Figure-5-2.jpg?resize=350%2C252)][7] + +Figure 5: The AlgoIDE GUI interface + + [![](https://i1.wp.com/opensourceforu.com/wp-content/uploads/2017/05/Figure-6-1.jpg?resize=350%2C378)][8] + +Figure 6: The Ninja IDE GUI interface + +**Adafruit WebIDE** + +Adafruit WebIDE provides a Web based interface for Raspberry Pi users to perform programming functions, and allows developers to compile the source code of various languages like Python, Ruby, JavaScript and many others. + +Adafruit IDE allows developers to put the code in a GIT repository, which can be accessed anywhere via GitHub. + + _**Features**_ + +* Can be accessed via Web browser on ports 8080 or 80. + +* Supports the easy compilation and running of source code. + +* Bundled with a debugger and visualiser for proper tracking, the navigation of code and to test source code. + +**AlgoIDE** + +AlgoIDE is a combination of a scripting language and an IDE environment, designed to function together to take programming to the next paradigm. It incorporates a powerful debugger, real-time scope explorer and executes the code, step by step. It is basically designed for all age groups to design programs and do extensive research on algorithms. +It supports various types of languages like C, C++, Python, Java, Smalltalk, Objective C, ActionScript, and many more. + + _**Features**_ + +* Automatic indentation and completion of source code. + +* Effective syntax highlighting and error management. + +* Contains a debugger, scope explorer and dynamic help system. + +* Supports GUI and traditional Logo programming language Turtle for the development of source code. + +**Latest version:** 2016-12-08 (when it was last updated) + +**Ninja IDE** + +Ninja IDE (Not Just Another IDE), which was designed by Diego Sarmentero, Horacio Duranm Gabriel Acosta, Pedro Mourelle and Jose Rostango, is written purely in Python and supports multiple platforms like Linux, Mac OS X and Windows, for execution. It is regarded as a cross-platform IDE software, especially designed to build Python based applications. + +Ninja IDE is very lightweight and performs various functions like file handling, code locating, going to lines, tabs, automatic indentation of code and editor zoom. Apart from Python, several other languages are supported by this IDE. + + _**Features**_ + +* _An efficient code editor:_  Ninja-IDE is regarded as the most efficient code editor as it performs various functions like code completion and code indentation, and functions as an assistant. + +* _Errors and PEP8 finder:_  It highlights static and PEP8 errors in the file. + +* _Code locator:_  With this feature, quick and direct access to a file can be made. The user can just make use of the ‘CTRL+K’ shortcut to type anything, and the IDE will locate the specific text. + +* Its unique project management features and tons of plugins make Ninja-IDE highly extensible. + +**Latest version:** 2.3 + + [![](https://i1.wp.com/opensourceforu.com/wp-content/uploads/2017/05/Figure-7.jpg?resize=350%2C306)][9] + +Figure 7: The Lazarus IDE GUI interface + +**Lazarus IDE** + +Lazarus IDE was developed by Cliff Baeseman, Shane Miller and Michael A. Hess in February 1999\. It is regarded as a cross-platform GUI based IDE for rapid application development, and it uses the Free Pascal Compiler. It inherits three primary features—compilation speed, execution speed and cross-compilation. Applications can be cross-compiled from Windows to other operating systems like Linux, Mac OS X, etc. + +This IDE consists of the Lazarus component library, which provides varied facilities to developers in the form of a single and unified interface with different platform-specific implementations. It supports the principle of ‘Write once and compile anywhere’. + + _**Features**_ + +* Powerful and fast enough to handle any sort of source code, and supports performance testing. + +* Easy to use GUI, which supports drag-and-drop components. Additional components can be added to the IDE through Lazarus package files. + +* Makes use of Free Pascal, which is highly enhanced with new features and is even used in Android app development. + +* Highly extensible, open source and supports various frameworks to compile additional languages. + +**Latest version:** 1.6.4 + +**Codeblock IDE** + +Codeblock IDE was written in C++ using wxWidgets as a GUI toolkit and was released in 2005\. It is a free, open source and cross-platform IDE supporting multiple compilers like GCC, Clang and Visual C++. + +Codeblock IDE is highly intelligent and performs various functions like Syntax highlighting, code folding, code completion and indentation, and has a number of external plugins for varied customisations. It can run on Windows, Mac OS X and Linux operating systems. + + _**Features**_ + +* Supports multiple compilers like GCC, Visual C++, Borland C++, Watcom, Intel C++ and many more. Basically designed for C++, but today supports many languages. + +* Intelligent debugger, which allows users to debug programs via access to the local function symbol and argument display, user defined watches, call stack, custom memory dump, thread switching and GNU debugger interface. + +* Supports varied features for migrating code from Dev-C++, Visual C++ and others. + +* Makes use of custom-built systems and stores information in XML extension files. + +**Latest version:** 16.01 + + [![](https://i2.wp.com/opensourceforu.com/wp-content/uploads/2017/05/Figure-8.jpg?resize=350%2C289)][10] + +Figure 8: Codeblock IDE interface + + [![](https://i1.wp.com/opensourceforu.com/wp-content/uploads/2017/05/Figure-9.jpg?resize=350%2C236)][11] + +Figure 9: Greenfoot IDE interface + +**Greenfoot IDE** + +Greenfoot IDE was designed by Michael Kolling at the University of Kent. It is a cross-platform Java based IDE basically designed for educational purposes for high schools and undergraduate students. The Greenfoot IDE features project management, automatic code completion and syntax highlighting, and has an easy GUI interface. + +Greenfoot IDE programming consists of sub-classing of two main classes — World and Actor. World represents the class where the main execution occurs. Actors are objects that exist and act in World. + + _**Features**_ + +* Simple and easy-to-use GUI, which is more interactive than BlueJ and other IDEs. + +* Easy to use even for newbies and beginners. + +* Highly powerful in executing Java code. + +* Supports GNOME/KDE/X11 graphical environments. + +* Other features include project management, auto-completion, syntax highlighting and auto-correction of errors. + +**Latest version:** 3.1.0 + +-------------------------------------------------------------------------------- + +作者简介: + +Anand Nayyar + +The author is assistant professor in Department of Computer Applications & IT at KCL Institute of Management and Technology, Jalandhar, Punjab. He loves to work on Open Source technologies, embedded systems, cloud computing, wireless sensor networks and simulators. He can be reached at anand_nayyar@yahoo.co.in. + +-------------------- + +via: http://opensourceforu.com/2017/06/top-ides-raspberry-pi/ + +作者:[Anand Nayyar ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://opensourceforu.com/author/anand-nayyar/ +[1]:http://opensourceforu.com/2017/06/top-ides-raspberry-pi/#disqus_thread +[2]:http://opensourceforu.com/author/anand-nayyar/ +[3]:http://opensourceforu.com/wp-content/uploads/2017/05/Figure-1-8.jpg +[4]:http://opensourceforu.com/wp-content/uploads/2017/05/Figure-2-6.jpg +[5]:http://opensourceforu.com/wp-content/uploads/2017/05/Figure-3-3.jpg +[6]:http://opensourceforu.com/wp-content/uploads/2017/05/Figure-4-3.jpg +[7]:http://opensourceforu.com/wp-content/uploads/2017/05/Figure-5-2.jpg +[8]:http://opensourceforu.com/wp-content/uploads/2017/05/Figure-6-1.jpg +[9]:http://opensourceforu.com/wp-content/uploads/2017/05/Figure-7.jpg +[10]:http://opensourceforu.com/wp-content/uploads/2017/05/Figure-8.jpg +[11]:http://opensourceforu.com/wp-content/uploads/2017/05/Figure-9.jpg From 8b073322b3b0e65f06e9fca94d6c4711240be361 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 25 Jun 2017 10:40:16 +0800 Subject: [PATCH 0515/1407] =?UTF-8?q?20170625-9=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7 What all you need to know about HTML5.md | 272 ++++++++++++++++++ 1 file changed, 272 insertions(+) create mode 100644 sources/tech/20170617 What all you need to know about HTML5.md diff --git a/sources/tech/20170617 What all you need to know about HTML5.md b/sources/tech/20170617 What all you need to know about HTML5.md new file mode 100644 index 0000000000..b5adee5fb2 --- /dev/null +++ b/sources/tech/20170617 What all you need to know about HTML5.md @@ -0,0 +1,272 @@ +What all you need to know about HTML5 +============================================================ + + + _![](https://i0.wp.com/opensourceforu.com/wp-content/uploads/2017/05/handwritten-html5-peter-booth-e-plus-getty-images-56a6faec5f9b58b7d0e5d1cf.jpg?resize=700%2C467)_ + + _HTML5, the fifth and current version of the HTML standard, is a markup language used to structure and present content on the World Wide Web. This article will help readers get acquainted with it._ + +HTML5 has evolved through the cooperation between the W3C and the Web Hypertext Application Technology Working Group. It is a higher version of HTML, and its many new elements make your pages more semantic and dynamic. It was developed to provide a greater Web experience for everyone. HTML5 offers great features that make the Web more dynamic and interactive. + +The new features of HTML5 are: + +* New sets of tags such as
and
+ +* element for 2D drawing + +* Local storage + +* New form controls like calendar, date and time + +* New media functionality + +* Geo-location + +HTML5 is not an official standard as yet; hence, not all browsers support it or some of its features. One of the most important reasons behind developing HTML5 was to prevent users from having to download and install multiple plugins like Silverlight and Flash. + +**New tags and elements** + +**Semantic elements:** Figure 1 displays a few useful semantic elements. +**Form elements:** The form elements present in HTML5 are shown in Figure 2. +**Graphic elements:** The graphic elements in HTML5 can be seen in Figure 3. +**Media elements:** The new media elements in HTML5 are listed in Figure 4. + + [![](https://i0.wp.com/opensourceforu.com/wp-content/uploads/2017/05/Figure-1-7.jpg?resize=350%2C277)][3] + +Figure 1: Semantic elements + + [![](https://i1.wp.com/opensourceforu.com/wp-content/uploads/2017/05/Figure-2-5.jpg?resize=350%2C108)][4] + +Figure 2: Form elements + +**Advanced features of HTML5** + +**Geo-location** + +It is an HTML5 API that is used to get the geographical location of a website’s user, who has to first permit the site to fetch his or her location. This usually happens via a button and/or browser popup. All the latest versions of Chrome, Firefox, IE, Safari and Opera can use the geo-location feature of HTML5. + +Some uses of geo-location are: + +* Public transportation websites + +* Taxi and other transportation websites + +* To calculate shipping costs on an e-commerce site + +* Travel agency websites + +* Real estate websites + +* Movie theatre websites can find movies playing nearby + +* Online gaming + +* For sites to feature local headlines and weather on their front page + +* Job postings can automatically include commute times + +**How it works:** Geo-location works by scanning common sources of location information, which include the following: + +* Global Positioning System (GPS), which is the most accurate + +* Network signals—IP address, RFID, Wi-Fi and Bluetooth MAC addresses + +* GSM/CDMA cell IDs + +* User inputs + +The API offers a very handy function to detect geo-location support in browsers: + +| `if` `(navigator.geolocation) {``//` `do` `stuff``}` | + +The  _getCurrentPosition_  API is the main method for using geo-location. It retrieves the current geographic location of the user’s device. The location is described as a set of geographic coordinates along with the heading and speed. The location information is returned as a position object. + +The syntax is: + +`getCurrentPosition(showLocation, ErrorHandler, options);` + +* _showLocation:_  This defines the callback method that retrieves location information. + +* _ErrorHandler(Optional):_  This defines the callback method that is invoked when an error occurs in processing the asynchronous call. + +* _options (Optional):_  This defines a set of options for retrieving the location information. + + [![](https://i0.wp.com/opensourceforu.com/wp-content/uploads/2017/05/Figure-3-2.jpg?resize=350%2C72)][5] + +Figure 3: Graphic elements + + [![](https://i0.wp.com/opensourceforu.com/wp-content/uploads/2017/05/Figure-4-2.jpg?resize=350%2C144)][6] + +Figure 4: Media elements + +Figure 5 incorporates the set of properties returned by a position object. + +We can present location information to the user in two ways—geodetic and civil: + +1\. The geodetic way of describing a position refers directly to the latitude and longitude. +2\. The civic representation of location data is readable and easily understood by humans. + +As shown in Table 1, each attribute/parameter has both a geodetic representation and a civic representation. + + [![](https://i0.wp.com/opensourceforu.com/wp-content/uploads/2017/05/table-1.jpg?resize=350%2C132)][7] + +**Web storage** + +In HTML, to store user data on a local machine, we were using JavaScript cookies. To avoid that, HTML5 has introduced Web storage, with which websites themselves store user data on a local machine. + +The advantages of Web storage, as compared to cookies, are: + +* More secure + +* Faster + +* Stores a larger amount of data + +* The stored data is not sent with every server request. It is only included when asked for. This is a big advantage of HTML5 Web storage over cookies. + +There are two types of Web storage objects: + +1) Local – this stores data with no expiration date. +2) Session – this stores data for one session only. + +**How it works:** The  _localStorage_  and  _sessionStorage_  objects create a  _key = value pair._ + +An example is: _ key=“Name”,_   _value=“Palak”_ + +These are stored as strings but can be converted, if required, by using JavaScript functions like  _parseInt()_  and  _parseFloat()_ . + +Given below is the syntax for using Web storage objects: + + `Storing a Value:``• localStorage.setItem(“key1”, “value1”);``• localStorage[“key1”] = “value1”;``Getting a Value:``• alert(localStorage.getItem(“key1”));``• alert(localStorage[“key1”]);``Remove a Value:``• removeItem(“key1”);``Remove All Values:``• localStorage.``clear``();` + + [![](https://i0.wp.com/opensourceforu.com/wp-content/uploads/2017/05/Figure5-1.jpg?resize=350%2C202)][8] + +Figure 5: Position object properties + +**Application Cache (AppCache)** + +Using HTML5 Apache, we can make a Web application work offline without an Internet connection. All browsers, besides IE, can use  _AppCache_  (at this point in time). + +The advantages of Application Cache are: + +* Enables browsing Web pages offline + +* Pages load faster + +* Results in less load for servers + +The  _cache manifest_  file is a simple text file that lists the resources the browser should cache for offline access. The  _manifest_  attribute can be included on the document’s HTML tag, as follows: + +```...``<``/html``>` + +It should be on all the pages that you want to cache. + +The application pages that are cached will remain unless: + +1\. The user clears them out. +2\. The manifest has been modified. +3\. The cache is updated. + +**Video** + +Until HTML5 was launched, there was no uniform standard for showing video on Web pages. Most of the videos were shown through different plugins like Flash. But HTML5 specifies a standard way to show the video on a Web page by using a video element. + +Currently, it supports three video formats for the video element, as shown in Table 2. + + [![](https://i0.wp.com/opensourceforu.com/wp-content/uploads/2017/05/table-2.jpg?resize=350%2C115)][9] +The example given below shows the use of this video element: + ```````
-### Step 3 — Environment configuration +### 第三步-配置环境: -Here I’m going to install JAVA8, Git and the Android SDK that are required by Jenkins to pull, compile and run android projects. +这里我打算安装 Java8,Git,和 Android SDK #### SDKMAN!: -This marvelous command line tool allows you install many popular SDK (eg. Gradle, Groovy, Grails, Kotlin, Scala…), list candidates and switch among different versions in parallel in a really easy and handy way. +有许多超级厉害的命令行工具让你可以安装各种流行的 SDK(软件开发包)比如说,Gradle,Groovy, Grails, Kotlin, Scala...),这样在各个版本中进行选择就容易,顺手多了. [SDKMAN! the Software Development Kit Manager SDKMAN! is a tool for managing parallel versions of multiple Software Development Kits on most Unix based systems. It…sdkman.io][4][][5] -They have added recently support for JAVA8 so I preferred to install Java using it instead of using the popular webupd8 repository, so it is up to you to choose whether to install SDKMAN! or not but I’m pretty sure it is a tool that you will use in the near future. +社区最近又增加了对 JAVA8 的支持,所以我不太喜欢烂大街的 webupd8 库,而是更倾向于安装 Java .在你安装开始前,务必要想清你要不要安装 SDKMAN,话说回来,最好还是装上,因为我们以后应该会用到. -Installation of SDKMAN! is as easy as executing the following line: +执行以下命令即可安装 SDKMAN ``` $ curl -s "https://get.sdkman.io" | bash @@ -59,20 +58,22 @@ $ curl -s "https://get.sdkman.io" | bash #### Oracle JAVA8: -As we have previously installed SDKMAN! now installing JAVA8 is as easy as: +因为我们已经安装了 SDKMAN,所以安装 JAVA8 就相当简单了 ``` $ sdk install java ``` Or using the webupd8 repository: +或者使用 webupd8 这个源 [Install Oracle Java 8 In Ubuntu Or Linux Mint Via PPA Repository [JDK8] Oracle Java 8 is now stable. Below you'll find instructions on how to install it in Ubuntu or Debian via a PPA…www.webupd8.org][6][][7] +Oracle Java 8 不太稳定,在文章底部你可以找到相关指导,教你如何在 Ubuntu 或者 Debian 下通过 PPA 安装. #### Git: -Installing git is straight forward, no more comments needed: +安装git的命令也非常直观,就不废话了 ``` $ sudo apt install git @@ -81,18 +82,18 @@ $ sudo apt install git #### Android SDK: -At the bottom of this page: +这下面这篇文章的底部 [Download Android Studio and SDK Tools | Android Studio Download the official Android IDE and developer tools to build apps for Android phones, tablets, wearables, TVs, and…developer.android.com][8][][9] -you can find “_Get just the command line tools_”, copy the link e.g: +你可以找到 "Get just the command line tools" 等字样,复制这个链接.比如: ``` https://dl.google.com/android/repository/tools_r25.2.3-linux.zip ``` -Then download and unzip it at /opt/android-sdk-linux +下载,然后解压到 /opt/android-sdk-linux 下 ``` $ cd /opt @@ -106,27 +107,27 @@ $ sudo wget https://dl.google.com/android/repository/tools_r25.2.3-linux.zip $ sudo unzip tools_r25.2.3-linux.zip -d android-sdk-linux ``` -As we have used root user to create de directory we need to fix folder permissions to make it readable and writable by our main user: +我们限定了目录权限为 root,所以想要一般情况下使用,还是要重新授权. ``` $ sudo chown -R YOUR_USERNAME:YOUR_USERNAME android-sdk-linux/ ``` -Let’s set the SDK environmental variables editing the /.bashrc file: +然后,在 /.bashr 文件下 增加 SDK 的环境变量 ``` $ cd $ nano .bashrc ``` -Then add at the bottom (but before SDKMAN! config line) these lines: +在底部写入这些行:(注意,但要在 SDKMAN 配置文件前) ``` export ANDROID_HOME="/opt/android-sdk-linux" export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH" ``` -Close the terminal and open a new one to verify that variables have been properly exported: +关闭此终端,再打开一个看看环境变量是否生效 ``` $ echo $ANDROID_HOME @@ -139,31 +140,31 @@ $ android ![](https://cdn-images-1.medium.com/max/1000/1*Q4o_LpfC5A3evFUwd62MOQ.png) -Running Android SDK Manager GUI +运行 Android SDK Manager 的图形交互界面 -### Step 4 — Jenkins server: +### Step 4 _ Jenkins 服务器 -Here I’m going to describe how to install the server, configure it, create a Jenkins Job to pull, build and test an Android project and how to get to the console output. +这里,我要讲讲怎么安装,配置服务器,并创建可拉取的 Jenkin Jobs, -#### Jenkins installation: +#### 安装 Jenkins -Jenkins server is available at: +你可以在下面的链接找到 Jenkins server 相关信息 [Jenkins Jenkins is an open source automation serverjenkins.io][12][][13] -There are many ways to run Jenkins, executing a .war file, as a linux service, as a Docker container, etc…. +我们有许多办法运行 Jenkins,比如说Linux服务器下就可以运行 .war 文件,作为 Docker 容器.等等..... -My first thought was to run it using a Docker container but then I realized that it was a nightmare to properly configure code folders, android-sdk folder visibility and USB visibility of physical devices plug to run Android Tests. +我起初是想把它当做 Docker 容器运行,但是后来我意识到在实体机上配置代码文件夹,android-sdk文件夹和 USB 设备的可见性简直是一场噩梦. -For ease of use I finally decided to use it as service adding the Stable repository key to install and get updates with apt +少操点心,我最终决定给它增加 Stable 源当一个服务器用,自动安装,自动更新. ``` $ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add - ``` -Edit the sources.list file and add: +编辑 source.list,写入这一行 ``` $ sudo nano /etc/apt/sources.list @@ -174,30 +175,30 @@ $ sudo nano /etc/apt/sources.list deb https://pkg.jenkins.io/debian-stable binary/ ``` -Then install it: +然后安装 ``` sudo apt-get update sudo apt-get install jenkins ``` -Add user _jenkins_ to your username group to allow it to read and write the Android SDK folder +在用户组里面增加 _jenkins_ ,允许其读写 Android SDK 文件夹 ``` $ sudo usermod -a -G YOUR_USERNAME jenkins ``` -Jenkins service will always start at boot time and will be available at [http://localhost:8080][15] +Jenkins 服务在开机引导时就会被加载到内存,对外默认开放本机 8080 端口 -Just after installation due to security reasons this screen is shown, just follow the instructions to finally get your Jenkins instance up and running. +安装完毕会有一些安全预警信息,没什么好讲的,跟着引导程序走,人家说啥你做啥就行了.引导结束,你的 Jenkins就会运行了. ![](https://cdn-images-1.medium.com/max/1000/1*gN6-ncU7mRdQWL3wmlS_5g.png) -Unlocking a successfully installed Jenkins server +启用安装成功的 Jenkins 服务器. -#### Jenkins Configuration: +#### Jenkins 配置 -After unlocking Jenkins installation you are prompted to install plugins, click “Select plugins to Install” browse and select the following ones to be installed in addition to suggested plugins: +启用成功后,会有提示程序提示你安装插件,单击 "Select plugins to Install"就可以开始浏览所有插件,然后选择你要安装的插件就OK了. * JUnit @@ -222,109 +223,111 @@ This plugin requires that you have an HTTP URL reachable from GitHub, which mean ![](https://cdn-images-1.medium.com/max/1000/1*xvG06qRSCvfw5OQgQleG0A.png) -Installing Jenkins plugins +安装 Jenkins 插件 -Create the admin user and complete installation. +创建管理员用户,并完成安装 -To finish configuration we have to configure ANDROID_HOME and JAVA_HOME environmental variables: +配置环境变量 ANDROID_HOME,JAVA_HOME -Go to Manage Jenkins > Configure System +点击 Manage Jenkins,接着 Configure System Scroll down and at Global properties section check the Environment variables box and add _ANDROID_HOME_ and _JAVA_HOME_ +滚动文件至底部,在全局属性模块中复核环境变量,并增加 _ANDROID_HOMOE_,和_JAVA_HOME_变量 ![](https://cdn-images-1.medium.com/max/1000/1*rpgkUsqWhkHk4xOKCGPcvw.png) -Adding global environmental variables common to all Jenkins jobs +给所有 Jenkins 工作(jobs)增加全局变量. -#### Creating a “Jenkins Job” +#### 创建 Jenkins Job + +一个 Jenkins Job 定义了一系列不间断的操作.如果你跟随本篇引导的话,那么你可以使用我已经在 GitHub 上为你准备了一个 Android 练习项目,你可以使用这个来试试手.它只是一个复合模块的 app,包括多个方面,比如单元测试,Android测试,和 JaCoCo,SonarQube插件. -A Jenkins Job describes a series of steps that are executed consecutively. I have prepared a “Hello Jenkins” Android project in GitHub that you can use to test your Jenkins configuration as you follow this tutorial. It is just a hello world multi-module app with Unit tests, Android tests and includes JaCoCo and SonarQube plugins. [pamartineza/helloJenkins helloJenkins - Hello Jenkins project for CI configuration testgithub.com][24][][25] -First create a new _Freestyle project Job _and give it a name eg. “_Hello_Android_” (Don’t use spaces in Jenkins Job names to avoid future compatibility problems with SonarQube) +首先创建一个新的 Job 项目,取名为 _Hello_Android_.不要使用空格,这样可以避免与 SonarQube 不兼容的问题. ![](https://cdn-images-1.medium.com/max/1000/1*ITE7xIrbsrChWv45PSlPPw.png) -Creating a Freestyle Jenkins Job +创建一个 Freestyle Jenkins Job -Then let’s configure it, I’m going to add screenshots of every section: +接下来就是配置了,我给每一块都增加了截屏 -General: +概况 -This section is not very interesting for our goals, here you can change the name of the Job, add a description and if using a GitHub project add the project URL, (without *.git, the url of the web not the repo) +这部分比较繁琐,你可以在这里变更 Job 的名字,增加简介.如果你使用 GitHub 项目,你还可以写下项目的 URL(不要 *.git,是 web 的 url,不是 repo) ![](https://cdn-images-1.medium.com/max/1000/1*7QF2pfgM73FVIWTfQhcbEA.png) -Project Url Configuration +项目 Url 配置 -Source Code Management: +源代码管理 -Here is where we have to chose our CVS as Git and add the repository url (this time include *.git) and select the branch to pull. As this is a public GitHub repository you don’t need to add credentials but otherwise you will have to add your user and password. +这时候我们就要选择我们的 CVS 作为 Git,并且增加源的 url(这次就要包括 *.git)然后选择分支拉取.因为这是一个公开的 GitHub 库,我们就不需要提交证书了,否则的话就要设置账号和密码 -I recommend you that instead of using your actual GitHub user with full permissions create a new GitHub user with read-only privileges of your private repos to be used exclusively by your Jenkins Jobs. +相比于使用自己的公用仓库我更倾向于创建一个只读的私人仓库专门配给 Jenkins Job 使用 -In addition if you have enabled Two-Factor authentication Jenkins won’t be able to pull code and again having this exclusively created for Jenkins user will be the solution to pull code from private repos. +另外,如果你已经使用了 Two-Factor 认证,Jenkins 就无法拉取代码.所以为 Jenkins 专门开启一个库很有必要,这样可以直接从私人库中拉取代码 ![](https://cdn-images-1.medium.com/max/1000/1*wkzdL70XrCzIpXDsHPA2Pg.png) -Repository configuration +配置仓库 -Build Triggers: +构建 (build) 触发器 -Builds can be triggered manually, remotely, periodically, after another Job build, when changes are detected, etc… +你可以手动开始构建,也可以远程,周期性地,或者在另一个 Job 构建完成之后开始构建,只要这些改变可以被检测到. + +最好的情况肯定是一旦你更改了某些地方,就会立刻触发构建事件,Github为此提供了名叫 webhooks 的回调函数 -Ideally the optimal situation is to just trigger a build when a change has been pushed to the repository, GitHub provides a system called Webhooks [Webhooks | GitHub Developer Guide Webhooks allow you to build or set up integrations which subscribe to certain events on GitHub.com. When one of those…developer.github.com][26][][27] -that we can configure to send events to the CI server and then trigger the build, but this obviously requires our CI sever to be online and reachable by GitHub servers. +这样,我们就可以发送这些事件到 CI 服务器,然后触发构建.显然,我们的 CI 服务器必须要联网,并且可以与 GitHub 服务器通信. + +你的 CI 服务器为了安全只限于内网使用,那么解决办法就只有集中周期性的提交.我就是只有工作时才打开 CI,我把它设置为每十五分钟上交一次.集中时间可以通过 CRON 语法设置,如果你不熟悉,请点击案例文件的右侧的帮助按钮. -Your CI is going to be probably isolated in a private network for security reasons then the only solution is to poll GitHub periodically. In my personal case I just turn on the CI when I’m working, in the following screenshot I have configured it to poll Github every 15 minutes. Polling times are defined with CRON syntax, if you are not familiar with it, press the help button on the right to get an extensive documentation with examples. ![](https://cdn-images-1.medium.com/max/1000/1*eONz8DAwJ9PW7uc8VQw7wQ.png) -Repository polling configuration +源的集中配置 -Build Environment: +构建环境 -Here I recommend to configure the build _stuck_ timeout to avoid Jenkins blocking memory and CPU if any unexpected error happens. Here also you can Inject environmental variables, passwords, etc… +这里我推荐设置超时模块避免 Jenkings 禁用内存和 CPU ,毕竟有时候有意外发生.当然,你还可以设置环境变量和密码等等. ![](https://cdn-images-1.medium.com/max/1000/1*Y6FgbIQq8pMk6D72Sr9KdQ.png) -Build stuck time out +构建超时 Build: -Here is where the magic happens! Add a _Build Step _that _Invokes Gradle Script _select the Gradle Wrapper (Android projects are shipped with a Gradle Wrapper by default, don’t forget to check it into Git) and let’s define which tasks are going to be executed: - -1. clean: Deletes all build outputs of previous builds, this ensures nothing is cached and the freshness of this build. -2. assembleDebug: Generates the debug .apk -3. test: executes JUnit tests in all modules -4. connectedDebugAndroidTest: executes Android Tests on actual android devices connected to the CI. (It is also possible to run Android Test against an Android Emulator installing the Android Emulator Jenkins plugin, but it doesn’t support all emulator versions and its configuration is not trivial at all) +神奇的事情发生了,使用 Gradle 脚本,增加 Build 步骤,选择 Gradle Wrapper (默认情况下,Gradle Wrapper 配置了 Android 项目,不要忘记在 Git 上检查一下)然后选择你要执行的任务 +1. clean: 清除所有历史输出,这样可以刷新缓存 +2. asseembleDebug: 生成调试 .apk 文件 (Android application 文件) +3. test:在所有模块上执行 JUnit 测试文件 +4. connectteDebugAndroidTest:在实体机上执行安卓测试单元,连接到 CI (也可以使用安装了 Jenkins 插件的安卓模拟器,但是它不支持所有型号,而且相当麻烦) ![](https://cdn-images-1.medium.com/max/1000/1*D0HDPOUYCWzsWKiLv4LrBA.png) -Gradle tasks definition +配置 Gradle -Post-build Actions: +我们将要增加 JUnit 测试报告.JUnit插件需要这一步,再搜集由 JUnit 测试结果生成的 XML 文件,这样我们就能即时知道测试结果的变化. -Here we are going to add _Publish JUnit test result report _this step is provided by the JUnit plugin and collects the .XML reports generated with the outcome of the JUnit tests that will generate a fancy chart with the evolution of tests results in time. -The path for debug flavor tests results in our app module is: +这我们 app 模块中,测试运行结果的路径是: app/build/test-results/debug/*.xml -In multi-module projects the path for test results in other “pure” java modules is: +在其他 "纯净模式" 下,综合模块的测试结果在这里: */build/test-results/*.xml @@ -332,58 +335,58 @@ In multi-module projects the path for test results in other “pure” java modu ![](https://cdn-images-1.medium.com/max/1000/1*ZQtamiQ_8PzAFBd-pMfvdg.png) -Also add _Record JaCoCo coverage report _that will create a chart to show the evolution of the code coverage +还要增加记录报告,表明将要创建一张显示代码作用域的表单. ![](https://cdn-images-1.medium.com/max/1000/1*wKaFykDl0qg-c79QwRTR2w.png) -#### Executing a Jenkins Job +#### 运行 Jenkins Job -Our Job will execute every 15 minutes if new changes have been pushed to the repository but it can also be triggered manually if you don’t want to wait until next polling or you just want to verify any change in the configuration straight forward. Click _Build Now_ and then current build will be shown in the _Build History _, click on it to see the details. +只要有任何改变提交到仓库,它们就会在十五分钟之内被执行,但是如果你不想等的话,或者你只是想验证一下配置的改变,你也可以手动运行.单击构建按钮,这样你就可以在构建历史中找到它,接着单击就可以了. ![](https://cdn-images-1.medium.com/max/1000/1*vKi-BGQ2blimaoTl7PTXtQ.png) -Manual Job execution - -The most interesting part here is the console output, you can see how Jenkins pulls the code and starts executing the Gradle tasks we have previously defined e.g _clean._ +手动执行 Job +最有趣的部分是控制台输出 (console output) 你可以看到 Jenkins 是如何开始执行我们的 Gradle 项目 ![](https://cdn-images-1.medium.com/max/1000/1*dbtmlSr2owrj_CQfGXjdsw.png) -Beginning of console output +控制台输出的开始 -If everything is OK console output will finish as follows (any repository connectivity problem, failing JUnit or Android test failure would make the build to fail) +你要是做的正确的话,控制台将会有如下输出 (任何源连接问题,测试单元的失败都将导致构建不可用) ![](https://cdn-images-1.medium.com/max/1000/1*WpOH-aHuuNRDYmY710ecLQ.png) -Yeehaa! build Sucsessful and test results with coverage collected +哈哈哈哈,构建成功,测试结果符合预期 -### Step 5 — SonarQube +### 第五步-SonarQube -In this section I will describe how to install and configure SonarQube and its companion MySQL database using Docker containers. +这部分我会讲讲如何安装,配置 SonarQube 和使用 Docker 作为容器的 MySQL 数据库 [Continuous Code Quality | SonarQube The leading open source platform for continuous code qualitywww.sonarqube.org][28][][29] -SonarQube is a code static analysis tool that helps developers to write cleaner code, detect bugs, learn good practices and it also keeps track of code coverage, tests results, technical debt, etc… all SonarQube detected issues can be imported easily to be fixed into Android Studio/IntelliJ with a plugin: +SonarQube 是个代码静态分析工具,它可以帮助开发者写出干净,优雅的代码.它还可以跟踪代码规模,测试结果,功能需求等等.SonarQube检测到的问题可以使用插件十分容易的导入到 Android Studion/IntelliJ 中去. [JetBrains Plugin Repository :: SonarQube Community Plugin Edit descriptionplugins.jetbrains.com][30][][31] -#### Installing Docker: +#### 安装 Docker -Installation of Docker is pretty straightforward following official Docker documentation: +安装 Docker 十分容易,按照下面的教程即可 [Install Docker on Ubuntu Instructions for installing Docker on Ubuntudocs.docker.com][32][][33] -#### Creating Containers: +#### 生成容器 (Containers) MySQL: -Let’s create a MySQL 5.7.17 server container called _mysqlserver, _that will allways start at boot time, with a local volume in your user folder, a password and exposed at localhost:3306 _(replace YOUR_USER and YOUR_MYSQL_PASSWORD with your values)_ + +我们先搭建一个 MySQL5.7.17服务器容器,命名为 _mysqlserver.在你的家目录下建立一个本地文件夹,使用如下命令让服务在开机引导时候就被加载.把命令中的 YOUR_USER 和 YOUR_MYSQL_PASSWORD 替换为你自己账号密码. ``` $ docker run --name mysqlserver --restart=always -v /home/YOUR_USER/mysqlVolume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=YOUR_MYSQL_PASSWORD -p 3306:3306 -d mysql:5.7.17 @@ -391,94 +394,92 @@ $ docker run --name mysqlserver --restart=always -v /home/YOUR_USER/mysqlVolume: phpMyAdmin: -To manage the MySQL server I’m used to phpMyAdmin then nothing more easy than creating another container called _phpmyadmin _linked to our _mysqlserver _container, that also starts at boot time, exposed at localhost:9090 and using the last version available. + +想要优雅简单地管理 MySQL服务器,我强烈推荐phpMyAdmin.你只要建立个容器,命名为 _phpmyadin,然后指向你的 mysqlserver容器,这样也会在开机引导时加载,你可以在 localhost:9090 找到它. ``` $ docker run --name phpmyadmin --restart=always --link mysqlserver:db -p 9090:80 -d phpmyadmin/phpmyadmin ``` -Using the phpMyAdmin interface at localhost:9090 login as _root and YOUR_MYSQL_PASSWORD _andcreate a database called _sonar_ with _utf8_general_ci _collation. Also create a new user _sonar_ with password _YOUR_SONAR_PASSWORD _and give it all privileges on the _sonar_ database. +你可以在 localhost:9090 用你的 mysql 密码,以 root 身份登录,然后你需要创建一个数据库,_sonar_with_uft8_general_ci SonarQube: -Now we are ready to create our SonarQube container called _sonarqube _that starts at boot time, linked to our db, exposed at localhost:9000 and using the 5.6.4 (LTS) version. +现在我们已经创建好了我们的 SonarQube 容器,就叫 sonarqube,它会自启动,自动连接我们的数据库,你可以在 localhost:9090 使用 5.6.4(长期技术支持)版本 ``` $ docker run --name sonarqube --restart=always --link mysqlserver:db -p 9000:9000 -p 9092:9092 -e "SONARQUBE_JDBC_URL=jdbc:mysql://db:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance" -e "SONARQUBE_JDBC_USER=sonar" -e "SONARQUBE_JDBC_PASSWORD=YOUR_SONAR_PASSWORD" -d sonarqube:5.6.4 ``` -#### SonarQube Configuration: +#### 配置 SonarQube -If everything is OK browsing to localhost:9000 will lead you to this page: +如果你配置成功,你将在 localhost:9000 看到如下页面 ![](https://cdn-images-1.medium.com/max/1000/1*tcgww8PENXdyrLS3K95ZEw.png) -Now let’s configure necessary plugins and Quality Profiles: +好了,让我们来配置必要的插件和基本的配置文件 -1. Login at the top right corner (Default administrator login is admin/admin) -2. Go to Administration > System > Update Center > Updates Only +1. 在页面的右上角可以登录(默认的管理员账号和密码是 admin/admin) +2. 进入到管理员 (Administration),然后点击 System,接下来是 Updata Center,最后是 Updates Only * Update Java plugin if necessary -3\. Now switch to Available and install the following plugins: +3. 现在启用,并安装以下插件 * Android (provides Android lint rules) * Checkstyle * Findbugs * XML -4\. Scroll back to the top and press restart button to complete the installation +4. 返回顶部,点击重启按钮完成整个安装. -#### SonarQube Profiles: +#### SonarQube 配置文件 -The plugins that we have installed define profiles that are sets of rules used to evaluate the code quality of a project. +我们刚刚安装的插件可以定义配置文件,这里有一套规则去衡量项目的代码质量 -Only 1 profile can be applied to a project at a time but we can make profiles have a parent and therefore inherit rules, so to be able to have all rules evaluated against our project we can create a new custom profile and chain all profiles. +同一时间只有一个项目只能使用一个配置文件.但是我们可以抽象配置文件,让配置的实例集成这些规则(借用 OOP 概念),所以想在一个项目中灵活地使用配置,我们可以创建个性化配置,约束所有的配置. -Let’s do it, go to Quality Profiles > Create and give it a name e.g. CustomAndroidProfile +就这么干,点击 Quality Profiles ,跳转到 Create ,然后命名,比如 CustomAndroidProfile -Add Android Lint as parent, then switch to the Android Lint profile and add FindBugs Security Minimal as parent, continue this chain until you get this inheritance schema and set the CustomAndroidProfile as the default one: +将 Android Lint 作为父级,然后选择 Android Lint 配置,增加 FindBugs Security Minial 作为上一级,当你得到父级继承,并且设置 CustomAndroidProfile 作为默认主题的时候,你就完成了. ![](https://cdn-images-1.medium.com/max/1000/1*w2CvH8uAOUcvajzjsOoCgQ.png) -#### Executing the SonarQube Analysis: +#### 运行 Sonarqube 分析器 -Now that our SonarQube is properly configured we just have to add a new Gradle task, _sonarqube_, to our Jenkins job, that will be executed in last place: +现在我们的 SonarQube 已经正式配置完毕,我们需要添加一个 Gradle 任务,_sonarqube_到我们的 Jenkins Job.我们在最后执行. ![](https://cdn-images-1.medium.com/max/1000/1*EDAjalNzmdU-ptjhWzuCcQ.png) - - -Execute again the Jenkins job and once it has finished let’s see our sonarQube dashboard at localhost:9000 : +再次运行 Jenkins Job,一旦运行完毕,我们可以在 localhost:9090 中找到我们的 sonarQube 控制面板 ![](https://cdn-images-1.medium.com/max/1000/1*n7dKdPXyUPj1AZe6ujL3vw.png) -Dashboard with Analysis result +分析结果的显示 -If we press the project name we can navigate different dashboards, with tons of info, the most important one is probably _Issues.  -_In the next screenshot I’m showing the detail of a _major _issue that flags an empty constructor method. Here personally what gives me the most important value of using Sonarqube is the explanation shown at the screen bottom when you click on the period … , this is an invaluable way of learning tips and tricks of programming. +长按项目名称我们可以进入到相应的显示界面,最重要的可能就是问题界面了 +我将展示一个空构造方法下的主要问题细节.就我个人而言,使用 SonarQube 最大的好处就是可以显示分析结果.这是一个学习编程十分有用的技能. ![](https://cdn-images-1.medium.com/max/1000/1*KKM9T2qHzanraAetghYCqg.png) -Getting the explanation of the issue -### Step 6 — Extra: configuring other Android apps +### 第六步 小贴士:配置其他 Android apps -Configuring an Android app to get coverage and sonarqube results is just having the JaCoCo and SonarQube plugins applied. Again you can find more details at my demo app HelloJenkins: +想要配置 Android app 得到 sonarqube 结果,只要安装 JaCoCo和Sonarqube 插件就可以了.你也可以在我的示例中得到更多信息 [pamartineza/helloJenkins helloJenkins - Hello Jenkins project for CI configuration testgithub.com][34][][35] -### The end! +### 最后 -Yes, you have finally reached the end of this long article! I hope you found it useful. If you find any error or you have any doubt please don’t hesitate to make any comment, I’ll do my best to try to help and if you liked it please share it! +啊,你终于走到头了,希望你觉得本文有点用处.你要是发现了任何错误,有任何疑问,别迟疑,赶紧评论.我拼了老命也要帮你.哦,忘了提醒,好东西要和朋友分享. -------------------------------------------------------------------------------- @@ -493,7 +494,7 @@ Entrepreneur & CEO at GreenLionSoft · Android Lead @MadridMBC & @Shoptimix · A via: https://medium.com/@pamartineza/how-to-set-up-a-continuous-integration-server-for-android-development-ubuntu-jenkins-sonarqube-43c1ed6b08d3#.x6jhcpg98 作者:[Pablo A. Martínez][a] -译者:[译者ID](https://github.com/译者ID) +译者:[Taylor1024](https://github.com/Taylor1024) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From c5fd0d04429167877ca8b66f8230923ab639ca9b Mon Sep 17 00:00:00 2001 From: "Dream.I have a dream" <1192877628@qq.com> Date: Mon, 3 Jul 2017 21:26:55 +0800 Subject: [PATCH 0603/1407] finished --- ...egration server for Android development.md | 537 ++++++++++++++++++ 1 file changed, 537 insertions(+) create mode 100644 translated/tech/20161228 How to set up a Continuous Integration server for Android development.md diff --git a/translated/tech/20161228 How to set up a Continuous Integration server for Android development.md b/translated/tech/20161228 How to set up a Continuous Integration server for Android development.md new file mode 100644 index 0000000000..3c975d05a2 --- /dev/null +++ b/translated/tech/20161228 How to set up a Continuous Integration server for Android development.md @@ -0,0 +1,537 @@ +如何在安卓开发中搭建一个连续集成服务器 +============================================================ + +我最近买了新 MacBook Pro 作为我的安卓开发主力,我的老式的 MacBookPro(2011发布,16GB 500G的固态硬盘,内核是i5,主频4GHz,64位),我也没卖,我打算用它搭建一个连续集成服务器. + +写这篇文章我主要想总结一下安装步骤,好给自己以后作参考,当然,这篇文章也是给同行看的,只要他们感兴趣.好了,现在开始: + +* 1.让 Ubuntu 成功运行 SDK (Software Development Kit) +* 2.安装 Jenkins CI ,将其作为服务器.这样,我们可以拉取,编译,运行 已经上传到 Github 的 Android 项目 +* 3.安装 Docker.我们使用 Docker 来运行 +* 4.Android app 配置需求 + +### 第一步-安装 Ubuntu: + +我个人比较倾向于使用 Ubuntu 作为持续集成中的 SO,怎么说呢,谁让 Ubuntu 的社区热情呢!你问什么都有人回答,这样可轻松不少.我推荐大家用 LTS (长期技术支持)的最新版.已经有很多教程教大家怎么安装了,我就不废话了,贴个下载链接就行了. + +[Install Ubuntu Desktop 16.04 LTS][1] + +有人可能很奇怪:用什么桌面版,服务器版多好.额,这个嘛,萝卜青菜,各有所爱.我倒不在乎 UI 占用的那点运算资源.相反,用那一点资源换来可用性,我觉得挺值的. + +### 第二步-远程管理: + +#### SSH 服务器 + +Ubuntu 桌面版默认安装配置并没有 ssh 服务器,所以你想用的话就只好自己安装. + +``` +$ sudo apt-get install openssh-server +``` + +#### 虚拟远程桌面 + +可能你的持续集成服务器在你的路由器后面,而不是你的工作环境后面,甚至还可能远离你数里.你可以用不同的远程桌面解决,不得不说,IMHO NoMachine在这方面表现的最好,它只需要你的 ssh 证书就可以工作了(显然你要先把它安装在 CI 和你的机器中 + +[NoMachine - Free Remote Access For Everybody +Free remote access and desktop sharing software. Access your computer to work on files and transfer documents, watch…www.nomachine.com][2][][3] + + +### 第三步-配置环境: + +这里我打算安装 Java8,Git,和 Android SDK + +#### SDKMAN!: + +有许多超级厉害的命令行工具让你可以安装各种流行的 SDK(软件开发包)比如说,Gradle,Groovy, Grails, Kotlin, Scala...),这样在各个版本中进行选择就容易,顺手多了. + +[SDKMAN! the Software Development Kit Manager +SDKMAN! is a tool for managing parallel versions of multiple Software Development Kits on most Unix based systems. It…sdkman.io][4][][5] + +社区最近又增加了对 JAVA8 的支持,所以我不太喜欢烂大街的 webupd8 库,而是更倾向于安装 Java .在你安装开始前,务必要想清你要不要安装 SDKMAN,话说回来,最好还是装上,因为我们以后应该会用到. + +执行以下命令即可安装 SDKMAN + +``` +$ curl -s "https://get.sdkman.io" | bash +``` + + +#### Oracle JAVA8: + +因为我们已经安装了 SDKMAN,所以安装 JAVA8 就相当简单了 + +``` +$ sdk install java +``` + +Or using the webupd8 repository: +或者使用 webupd8 这个源 + +[Install Oracle Java 8 In Ubuntu Or Linux Mint Via PPA Repository [JDK8] +Oracle Java 8 is now stable. Below you'll find instructions on how to install it in Ubuntu or Debian via a PPA…www.webupd8.org][6][][7] +Oracle Java 8 不太稳定,在文章底部你可以找到相关指导,教你如何在 Ubuntu 或者 Debian 下通过 PPA 安装. + +#### Git: + +安装git的命令也非常直观,就不废话了 + +``` +$ sudo apt install git +``` + + +#### Android SDK: + +这下面这篇文章的底部 + +[Download Android Studio and SDK Tools | Android Studio +Download the official Android IDE and developer tools to build apps for Android phones, tablets, wearables, TVs, and…developer.android.com][8][][9] + +你可以找到 "Get just the command line tools" 等字样,复制这个链接.比如: + +``` +https://dl.google.com/android/repository/tools_r25.2.3-linux.zip +``` + +下载,然后解压到 /opt/android-sdk-linux 下 + +``` +$ cd /opt +``` + +``` +$ sudo wget https://dl.google.com/android/repository/tools_r25.2.3-linux.zip +``` + +``` +$ sudo unzip tools_r25.2.3-linux.zip -d android-sdk-linux +``` + +我们限定了目录权限为 root,所以想要一般情况下使用,还是要重新授权. + +``` +$ sudo chown -R YOUR_USERNAME:YOUR_USERNAME android-sdk-linux/ +``` + +然后,在 /.bashr 文件下 增加 SDK 的环境变量 + +``` +$ cd +$ nano .bashrc +``` + +在底部写入这些行:(注意,但要在 SDKMAN 配置文件前) + +``` +export ANDROID_HOME="/opt/android-sdk-linux" +export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH" +``` + +关闭此终端,再打开一个看看环境变量是否生效 + +``` +$ echo $ANDROID_HOME +/opt/android-sdk-linux +``` + +``` +$ android +``` + + ![](https://cdn-images-1.medium.com/max/1000/1*Q4o_LpfC5A3evFUwd62MOQ.png) + +运行 Android SDK Manager 的图形交互界面 + + +### Step 4 _ Jenkins 服务器 + +这里,我要讲讲怎么安装,配置服务器,并创建可拉取的 Jenkin Jobs, + +#### 安装 Jenkins + +你可以在下面的链接找到 Jenkins server 相关信息 + +[Jenkins +Jenkins is an open source automation serverjenkins.io][12][][13] + +我们有许多办法运行 Jenkins,比如说Linux服务器下就可以运行 .war 文件,作为 Docker 容器.等等..... + +我起初是想把它当做 Docker 容器运行,但是后来我意识到在实体机上配置代码文件夹,android-sdk文件夹和 USB 设备的可见性简直是一场噩梦. + +少操点心,我最终决定给它增加 Stable 源当一个服务器用,自动安装,自动更新. + +``` +$ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add - +``` + +编辑 source.list,写入这一行 + +``` +$ sudo nano /etc/apt/sources.list +``` + +``` +#Jenkin Stable +deb https://pkg.jenkins.io/debian-stable binary/ +``` + +然后安装 + +``` +sudo apt-get update +sudo apt-get install jenkins +``` + +在用户组里面增加 _jenkins_ ,允许其读写 Android SDK 文件夹 + +``` +$ sudo usermod -a -G YOUR_USERNAME jenkins +``` + +Jenkins 服务在开机引导时就会被加载到内存,对外默认开放本机 8080 端口 + +安装完毕会有一些安全预警信息,没什么好讲的,跟着引导程序走,人家说啥你做啥就行了.引导结束,你的 Jenkins就会运行了. + + ![](https://cdn-images-1.medium.com/max/1000/1*gN6-ncU7mRdQWL3wmlS_5g.png) + +启用安装成功的 Jenkins 服务器. + +#### Jenkins 配置 + +启用成功后,会有提示程序提示你安装插件,单击 "Select plugins to Install"就可以开始浏览所有插件,然后选择你要安装的插件就OK了. + +* JUnit + +[JUnit Plugin - Jenkins - Jenkins Wiki +The JUnit plugin provides a publisher that consumes XML test reports generated during the builds and provides some…wiki.jenkins-ci.org][16][][17] + +* JaCoCo + +[JaCoCo Plugin - Jenkins - Jenkins Wiki +In order to get the coverage data published to Jenkins, you need to add a JaCoCo publisher and configure it so it will…wiki.jenkins-ci.org][18][][19] + +* EnvInject + +[EnvInject Plugin - Jenkins - Jenkins Wiki +Only previous environment variables are available for polling Some plugins provide polling mechanisms (such as SCM…wiki.jenkins-ci.org][20][][21] + +* GitHub plugins + +[GitHub Plugin - Jenkins - Jenkins Wiki +This plugin requires that you have an HTTP URL reachable from GitHub, which means it's reachable from the whole…wiki.jenkins-ci.org][22][][23] + + + ![](https://cdn-images-1.medium.com/max/1000/1*xvG06qRSCvfw5OQgQleG0A.png) + +安装 Jenkins 插件 + +创建管理员用户,并完成安装 + +配置环境变量 ANDROID_HOME,JAVA_HOME + +点击 Manage Jenkins,接着 Configure System + +Scroll down and at Global properties section check the Environment variables box and add _ANDROID_HOME_ and _JAVA_HOME_ +滚动文件至底部,在全局属性模块中复核环境变量,并增加 _ANDROID_HOMOE_,和_JAVA_HOME_变量 + + + ![](https://cdn-images-1.medium.com/max/1000/1*rpgkUsqWhkHk4xOKCGPcvw.png) + +给所有 Jenkins 工作(jobs)增加全局变量. + +#### 创建 Jenkins Job + +一个 Jenkins Job 定义了一系列不间断的操作.如果你跟随本篇引导的话,那么你可以使用我已经在 GitHub 上为你准备了一个 Android 练习项目,你可以使用这个来试试手.它只是一个复合模块的 app,包括多个方面,比如单元测试,Android测试,和 JaCoCo,SonarQube插件. + + +[pamartineza/helloJenkins +helloJenkins - Hello Jenkins project for CI configuration testgithub.com][24][][25] + +首先创建一个新的 Job 项目,取名为 _Hello_Android_.不要使用空格,这样可以避免与 SonarQube 不兼容的问题. + + + ![](https://cdn-images-1.medium.com/max/1000/1*ITE7xIrbsrChWv45PSlPPw.png) + +创建一个 Freestyle Jenkins Job + +接下来就是配置了,我给每一块都增加了截屏 + +概况 + +这部分比较繁琐,你可以在这里变更 Job 的名字,增加简介.如果你使用 GitHub 项目,你还可以写下项目的 URL(不要 *.git,是 web 的 url,不是 repo) + + + ![](https://cdn-images-1.medium.com/max/1000/1*7QF2pfgM73FVIWTfQhcbEA.png) + +项目 Url 配置 + +源代码管理 + +这时候我们就要选择我们的 CVS 作为 Git,并且增加源的 url(这次就要包括 *.git)然后选择分支拉取.因为这是一个公开的 GitHub 库,我们就不需要提交证书了,否则的话就要设置账号和密码 + +相比于使用自己的公用仓库我更倾向于创建一个只读的私人仓库专门配给 Jenkins Job 使用 + +另外,如果你已经使用了 Two-Factor 认证,Jenkins 就无法拉取代码.所以为 Jenkins 专门开启一个库很有必要,这样可以直接从私人库中拉取代码 + + + ![](https://cdn-images-1.medium.com/max/1000/1*wkzdL70XrCzIpXDsHPA2Pg.png) + +配置仓库 + +构建 (build) 触发器 + +你可以手动开始构建,也可以远程,周期性地,或者在另一个 Job 构建完成之后开始构建,只要这些改变可以被检测到. + +最好的情况肯定是一旦你更改了某些地方,就会立刻触发构建事件,Github为此提供了名叫 webhooks 的回调函数 + + +[Webhooks | GitHub Developer Guide +Webhooks allow you to build or set up integrations which subscribe to certain events on GitHub.com. When one of those…developer.github.com][26][][27] + +这样,我们就可以发送这些事件到 CI 服务器,然后触发构建.显然,我们的 CI 服务器必须要联网,并且可以与 GitHub 服务器通信. + +你的 CI 服务器为了安全只限于内网使用,那么解决办法就只有集中周期性的提交.我就是只有工作时才打开 CI,我把它设置为每十五分钟上交一次.集中时间可以通过 CRON 语法设置,如果你不熟悉,请点击案例文件的右侧的帮助按钮. + + + + ![](https://cdn-images-1.medium.com/max/1000/1*eONz8DAwJ9PW7uc8VQw7wQ.png) + +源的集中配置 + +构建环境 + +这里我推荐设置超时模块避免 Jenkings 禁用内存和 CPU ,毕竟有时候有意外发生.当然,你还可以设置环境变量和密码等等. + + + ![](https://cdn-images-1.medium.com/max/1000/1*Y6FgbIQq8pMk6D72Sr9KdQ.png) + +构建超时 + +Build: + +神奇的事情发生了,使用 Gradle 脚本,增加 Build 步骤,选择 Gradle Wrapper (默认情况下,Gradle Wrapper 配置了 Android 项目,不要忘记在 Git 上检查一下)然后选择你要执行的任务 + +1. clean: 清除所有历史输出,这样可以刷新缓存 +2. asseembleDebug: 生成调试 .apk 文件 (Android application 文件) +3. test:在所有模块上执行 JUnit 测试文件 +4. connectteDebugAndroidTest:在实体机上执行安卓测试单元,连接到 CI (也可以使用安装了 Jenkins 插件的安卓模拟器,但是它不支持所有型号,而且相当麻烦) + + ![](https://cdn-images-1.medium.com/max/1000/1*D0HDPOUYCWzsWKiLv4LrBA.png) + +配置 Gradle + +我们将要增加 JUnit 测试报告.JUnit插件需要这一步,再搜集由 JUnit 测试结果生成的 XML 文件,这样我们就能即时知道测试结果的变化. + + +这我们 app 模块中,测试运行结果的路径是: + +app/build/test-results/debug/*.xml + +在其他 "纯净模式" 下,综合模块的测试结果在这里: + +*/build/test-results/*.xml + + + ![](https://cdn-images-1.medium.com/max/1000/1*ZQtamiQ_8PzAFBd-pMfvdg.png) + + +还要增加记录报告,表明将要创建一张显示代码作用域的表单. + + ![](https://cdn-images-1.medium.com/max/1000/1*wKaFykDl0qg-c79QwRTR2w.png) + + +#### 运行 Jenkins Job + +只要有任何改变提交到仓库,它们就会在十五分钟之内被执行,但是如果你不想等的话,或者你只是想验证一下配置的改变,你也可以手动运行.单击构建按钮,这样你就可以在构建历史中找到它,接着单击就可以了. + + + ![](https://cdn-images-1.medium.com/max/1000/1*vKi-BGQ2blimaoTl7PTXtQ.png) + +手动执行 Job + +最有趣的部分是控制台输出 (console output) 你可以看到 Jenkins 是如何开始执行我们的 Gradle 项目 + + ![](https://cdn-images-1.medium.com/max/1000/1*dbtmlSr2owrj_CQfGXjdsw.png) + +控制台输出的开始 + +你要是做的正确的话,控制台将会有如下输出 (任何源连接问题,测试单元的失败都将导致构建不可用) + + + ![](https://cdn-images-1.medium.com/max/1000/1*WpOH-aHuuNRDYmY710ecLQ.png) + +哈哈哈哈,构建成功,测试结果符合预期 + +### 第五步-SonarQube + +这部分我会讲讲如何安装,配置 SonarQube 和使用 Docker 作为容器的 MySQL 数据库 + +[Continuous Code Quality | SonarQube +The leading open source platform for continuous code qualitywww.sonarqube.org][28][][29] + +SonarQube 是个代码静态分析工具,它可以帮助开发者写出干净,优雅的代码.它还可以跟踪代码规模,测试结果,功能需求等等.SonarQube检测到的问题可以使用插件十分容易的导入到 Android Studion/IntelliJ 中去. + +[JetBrains Plugin Repository :: SonarQube Community Plugin +Edit descriptionplugins.jetbrains.com][30][][31] + + +#### 安装 Docker + +安装 Docker 十分容易,按照下面的教程即可 + +[Install Docker on Ubuntu +Instructions for installing Docker on Ubuntudocs.docker.com][32][][33] + +#### 生成容器 (Containers) + +MySQL: + +我们先搭建一个 MySQL5.7.17服务器容器,命名为 _mysqlserver.在你的家目录下建立一个本地文件夹,使用如下命令让服务在开机引导时候就被加载.把命令中的 YOUR_USER 和 YOUR_MYSQL_PASSWORD 替换为你自己账号密码. + +``` +$ docker run --name mysqlserver --restart=always -v /home/YOUR_USER/mysqlVolume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=YOUR_MYSQL_PASSWORD -p 3306:3306 -d mysql:5.7.17 +``` + + +phpMyAdmin: + +想要优雅简单地管理 MySQL服务器,我强烈推荐phpMyAdmin.你只要建立个容器,命名为 _phpmyadin,然后指向你的 mysqlserver容器,这样也会在开机引导时加载,你可以在 localhost:9090 找到它. + +``` +$ docker run --name phpmyadmin --restart=always --link mysqlserver:db -p 9090:80 -d phpmyadmin/phpmyadmin +``` + +你可以在 localhost:9090 用你的 mysql 密码,以 root 身份登录,然后你需要创建一个数据库,_sonar_with_uft8_general_ci + + +SonarQube: +现在我们已经创建好了我们的 SonarQube 容器,就叫 sonarqube,它会自启动,自动连接我们的数据库,你可以在 localhost:9090 使用 5.6.4(长期技术支持)版本 + +``` +$ docker run --name sonarqube --restart=always --link mysqlserver:db -p 9000:9000 -p 9092:9092 -e "SONARQUBE_JDBC_URL=jdbc:mysql://db:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance" -e "SONARQUBE_JDBC_USER=sonar" -e "SONARQUBE_JDBC_PASSWORD=YOUR_SONAR_PASSWORD" -d sonarqube:5.6.4 +``` + + +#### 配置 SonarQube + +如果你配置成功,你将在 localhost:9000 看到如下页面 + + + ![](https://cdn-images-1.medium.com/max/1000/1*tcgww8PENXdyrLS3K95ZEw.png) + +好了,让我们来配置必要的插件和基本的配置文件 + +1. 在页面的右上角可以登录(默认的管理员账号和密码是 admin/admin) +2. 进入到管理员 (Administration),然后点击 System,接下来是 Updata Center,最后是 Updates Only + +* Update Java plugin if necessary + +3. 现在启用,并安装以下插件 + +* Android (provides Android lint rules) +* Checkstyle +* Findbugs +* XML + +4. 返回顶部,点击重启按钮完成整个安装. + + +#### SonarQube 配置文件 + +我们刚刚安装的插件可以定义配置文件,这里有一套规则去衡量项目的代码质量 + +同一时间只有一个项目只能使用一个配置文件.但是我们可以抽象配置文件,让配置的实例集成这些规则(借用 OOP 概念),所以想在一个项目中灵活地使用配置,我们可以创建个性化配置,约束所有的配置. + +就这么干,点击 Quality Profiles ,跳转到 Create ,然后命名,比如 CustomAndroidProfile + +将 Android Lint 作为父级,然后选择 Android Lint 配置,增加 FindBugs Security Minial 作为上一级,当你得到父级继承,并且设置 CustomAndroidProfile 作为默认主题的时候,你就完成了. + + + ![](https://cdn-images-1.medium.com/max/1000/1*w2CvH8uAOUcvajzjsOoCgQ.png) + + +#### 运行 Sonarqube 分析器 + +现在我们的 SonarQube 已经正式配置完毕,我们需要添加一个 Gradle 任务,_sonarqube_到我们的 Jenkins Job.我们在最后执行. + + ![](https://cdn-images-1.medium.com/max/1000/1*EDAjalNzmdU-ptjhWzuCcQ.png) + +再次运行 Jenkins Job,一旦运行完毕,我们可以在 localhost:9090 中找到我们的 sonarQube 控制面板 + + + ![](https://cdn-images-1.medium.com/max/1000/1*n7dKdPXyUPj1AZe6ujL3vw.png) + +分析结果的显示 + +长按项目名称我们可以进入到相应的显示界面,最重要的可能就是问题界面了 +我将展示一个空构造方法下的主要问题细节.就我个人而言,使用 SonarQube 最大的好处就是可以显示分析结果.这是一个学习编程十分有用的技能. + + + ![](https://cdn-images-1.medium.com/max/1000/1*KKM9T2qHzanraAetghYCqg.png) + + +### 第六步 小贴士:配置其他 Android apps + +想要配置 Android app 得到 sonarqube 结果,只要安装 JaCoCo和Sonarqube 插件就可以了.你也可以在我的示例中得到更多信息 + +[pamartineza/helloJenkins +helloJenkins - Hello Jenkins project for CI configuration testgithub.com][34][][35] + +### 最后 + +啊,你终于走到头了,希望你觉得本文有点用处.你要是发现了任何错误,有任何疑问,别迟疑,赶紧评论.我拼了老命也要帮你.哦,忘了提醒,好东西要和朋友分享. + +-------------------------------------------------------------------------------- + +作者简介: + +![](https://cdn-images-1.medium.com/fit/c/60/60/0*DQl4jAoi2wXr6S3p.jpg) + +Entrepreneur & CEO at GreenLionSoft · Android Lead @MadridMBC & @Shoptimix · Android, OpenSource and OpenData promoter · Runner · Traveller + +-------------------------------------------------------------------------------- + +via: https://medium.com/@pamartineza/how-to-set-up-a-continuous-integration-server-for-android-development-ubuntu-jenkins-sonarqube-43c1ed6b08d3#.x6jhcpg98 + +作者:[Pablo A. Martínez][a] +译者:[Taylor1024](https://github.com/Taylor1024) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://medium.com/@pamartineza +[1]:https://www.ubuntu.com/download/desktop +[2]:https://www.nomachine.com/download +[3]:https://www.nomachine.com/download +[4]:http://sdkman.io/ +[5]:http://sdkman.io/ +[6]:http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html +[7]:http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html +[8]:https://developer.android.com/studio/index.html +[9]:https://developer.android.com/studio/index.html +[10]:https://dl.google.com/android/repository/tools_r25.2.3-linux.zip +[11]:https://dl.google.com/android/repository/tools_r25.2.3-linux.zip +[12]:https://jenkins.io/ +[13]:https://jenkins.io/ +[14]:https://pkg.jenkins.io/debian-stable/jenkins.io.key +[15]:http://localhost:8080/ +[16]:https://wiki.jenkins-ci.org/display/JENKINS/JUnit+Plugin +[17]:https://wiki.jenkins-ci.org/display/JENKINS/JUnit+Plugin +[18]:https://wiki.jenkins-ci.org/display/JENKINS/JaCoCo+Plugin +[19]:https://wiki.jenkins-ci.org/display/JENKINS/JaCoCo+Plugin +[20]:https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin +[21]:https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin +[22]:https://wiki.jenkins-ci.org/display/JENKINS/GitHub+Plugin +[23]:https://wiki.jenkins-ci.org/display/JENKINS/GitHub+Plugin +[24]:https://github.com/pamartineza/helloJenkins +[25]:https://github.com/pamartineza/helloJenkins +[26]:https://developer.github.com/webhooks/ +[27]:https://developer.github.com/webhooks/ +[28]:https://www.sonarqube.org/ +[29]:https://www.sonarqube.org/ +[30]:https://plugins.jetbrains.com/idea/plugin/7238-sonarqube-community-plugin +[31]:https://plugins.jetbrains.com/idea/plugin/7238-sonarqube-community-plugin +[32]:https://docs.docker.com/engine/installation/linux/ubuntulinux/ +[33]:https://docs.docker.com/engine/installation/linux/ubuntulinux/ +[34]:https://github.com/pamartineza/helloJenkins +[35]:https://github.com/pamartineza/helloJenkins From 32ae9ead8ba84a1deaca33a7181f3af83652e5f8 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 3 Jul 2017 22:46:12 +0800 Subject: [PATCH 0604/1407] =?UTF-8?q?=E8=A1=A5=E5=AE=8C=20PR?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @Taylor1024 --- ...egration server for Android development.md | 537 ------------------ 1 file changed, 537 deletions(-) delete mode 100644 sources/tech/20161228 How to set up a Continuous Integration server for Android development.md diff --git a/sources/tech/20161228 How to set up a Continuous Integration server for Android development.md b/sources/tech/20161228 How to set up a Continuous Integration server for Android development.md deleted file mode 100644 index 3c975d05a2..0000000000 --- a/sources/tech/20161228 How to set up a Continuous Integration server for Android development.md +++ /dev/null @@ -1,537 +0,0 @@ -如何在安卓开发中搭建一个连续集成服务器 -============================================================ - -我最近买了新 MacBook Pro 作为我的安卓开发主力,我的老式的 MacBookPro(2011发布,16GB 500G的固态硬盘,内核是i5,主频4GHz,64位),我也没卖,我打算用它搭建一个连续集成服务器. - -写这篇文章我主要想总结一下安装步骤,好给自己以后作参考,当然,这篇文章也是给同行看的,只要他们感兴趣.好了,现在开始: - -* 1.让 Ubuntu 成功运行 SDK (Software Development Kit) -* 2.安装 Jenkins CI ,将其作为服务器.这样,我们可以拉取,编译,运行 已经上传到 Github 的 Android 项目 -* 3.安装 Docker.我们使用 Docker 来运行 -* 4.Android app 配置需求 - -### 第一步-安装 Ubuntu: - -我个人比较倾向于使用 Ubuntu 作为持续集成中的 SO,怎么说呢,谁让 Ubuntu 的社区热情呢!你问什么都有人回答,这样可轻松不少.我推荐大家用 LTS (长期技术支持)的最新版.已经有很多教程教大家怎么安装了,我就不废话了,贴个下载链接就行了. - -[Install Ubuntu Desktop 16.04 LTS][1] - -有人可能很奇怪:用什么桌面版,服务器版多好.额,这个嘛,萝卜青菜,各有所爱.我倒不在乎 UI 占用的那点运算资源.相反,用那一点资源换来可用性,我觉得挺值的. - -### 第二步-远程管理: - -#### SSH 服务器 - -Ubuntu 桌面版默认安装配置并没有 ssh 服务器,所以你想用的话就只好自己安装. - -``` -$ sudo apt-get install openssh-server -``` - -#### 虚拟远程桌面 - -可能你的持续集成服务器在你的路由器后面,而不是你的工作环境后面,甚至还可能远离你数里.你可以用不同的远程桌面解决,不得不说,IMHO NoMachine在这方面表现的最好,它只需要你的 ssh 证书就可以工作了(显然你要先把它安装在 CI 和你的机器中 - -[NoMachine - Free Remote Access For Everybody -Free remote access and desktop sharing software. Access your computer to work on files and transfer documents, watch…www.nomachine.com][2][][3] - - -### 第三步-配置环境: - -这里我打算安装 Java8,Git,和 Android SDK - -#### SDKMAN!: - -有许多超级厉害的命令行工具让你可以安装各种流行的 SDK(软件开发包)比如说,Gradle,Groovy, Grails, Kotlin, Scala...),这样在各个版本中进行选择就容易,顺手多了. - -[SDKMAN! the Software Development Kit Manager -SDKMAN! is a tool for managing parallel versions of multiple Software Development Kits on most Unix based systems. It…sdkman.io][4][][5] - -社区最近又增加了对 JAVA8 的支持,所以我不太喜欢烂大街的 webupd8 库,而是更倾向于安装 Java .在你安装开始前,务必要想清你要不要安装 SDKMAN,话说回来,最好还是装上,因为我们以后应该会用到. - -执行以下命令即可安装 SDKMAN - -``` -$ curl -s "https://get.sdkman.io" | bash -``` - - -#### Oracle JAVA8: - -因为我们已经安装了 SDKMAN,所以安装 JAVA8 就相当简单了 - -``` -$ sdk install java -``` - -Or using the webupd8 repository: -或者使用 webupd8 这个源 - -[Install Oracle Java 8 In Ubuntu Or Linux Mint Via PPA Repository [JDK8] -Oracle Java 8 is now stable. Below you'll find instructions on how to install it in Ubuntu or Debian via a PPA…www.webupd8.org][6][][7] -Oracle Java 8 不太稳定,在文章底部你可以找到相关指导,教你如何在 Ubuntu 或者 Debian 下通过 PPA 安装. - -#### Git: - -安装git的命令也非常直观,就不废话了 - -``` -$ sudo apt install git -``` - - -#### Android SDK: - -这下面这篇文章的底部 - -[Download Android Studio and SDK Tools | Android Studio -Download the official Android IDE and developer tools to build apps for Android phones, tablets, wearables, TVs, and…developer.android.com][8][][9] - -你可以找到 "Get just the command line tools" 等字样,复制这个链接.比如: - -``` -https://dl.google.com/android/repository/tools_r25.2.3-linux.zip -``` - -下载,然后解压到 /opt/android-sdk-linux 下 - -``` -$ cd /opt -``` - -``` -$ sudo wget https://dl.google.com/android/repository/tools_r25.2.3-linux.zip -``` - -``` -$ sudo unzip tools_r25.2.3-linux.zip -d android-sdk-linux -``` - -我们限定了目录权限为 root,所以想要一般情况下使用,还是要重新授权. - -``` -$ sudo chown -R YOUR_USERNAME:YOUR_USERNAME android-sdk-linux/ -``` - -然后,在 /.bashr 文件下 增加 SDK 的环境变量 - -``` -$ cd -$ nano .bashrc -``` - -在底部写入这些行:(注意,但要在 SDKMAN 配置文件前) - -``` -export ANDROID_HOME="/opt/android-sdk-linux" -export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH" -``` - -关闭此终端,再打开一个看看环境变量是否生效 - -``` -$ echo $ANDROID_HOME -/opt/android-sdk-linux -``` - -``` -$ android -``` - - ![](https://cdn-images-1.medium.com/max/1000/1*Q4o_LpfC5A3evFUwd62MOQ.png) - -运行 Android SDK Manager 的图形交互界面 - - -### Step 4 _ Jenkins 服务器 - -这里,我要讲讲怎么安装,配置服务器,并创建可拉取的 Jenkin Jobs, - -#### 安装 Jenkins - -你可以在下面的链接找到 Jenkins server 相关信息 - -[Jenkins -Jenkins is an open source automation serverjenkins.io][12][][13] - -我们有许多办法运行 Jenkins,比如说Linux服务器下就可以运行 .war 文件,作为 Docker 容器.等等..... - -我起初是想把它当做 Docker 容器运行,但是后来我意识到在实体机上配置代码文件夹,android-sdk文件夹和 USB 设备的可见性简直是一场噩梦. - -少操点心,我最终决定给它增加 Stable 源当一个服务器用,自动安装,自动更新. - -``` -$ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add - -``` - -编辑 source.list,写入这一行 - -``` -$ sudo nano /etc/apt/sources.list -``` - -``` -#Jenkin Stable -deb https://pkg.jenkins.io/debian-stable binary/ -``` - -然后安装 - -``` -sudo apt-get update -sudo apt-get install jenkins -``` - -在用户组里面增加 _jenkins_ ,允许其读写 Android SDK 文件夹 - -``` -$ sudo usermod -a -G YOUR_USERNAME jenkins -``` - -Jenkins 服务在开机引导时就会被加载到内存,对外默认开放本机 8080 端口 - -安装完毕会有一些安全预警信息,没什么好讲的,跟着引导程序走,人家说啥你做啥就行了.引导结束,你的 Jenkins就会运行了. - - ![](https://cdn-images-1.medium.com/max/1000/1*gN6-ncU7mRdQWL3wmlS_5g.png) - -启用安装成功的 Jenkins 服务器. - -#### Jenkins 配置 - -启用成功后,会有提示程序提示你安装插件,单击 "Select plugins to Install"就可以开始浏览所有插件,然后选择你要安装的插件就OK了. - -* JUnit - -[JUnit Plugin - Jenkins - Jenkins Wiki -The JUnit plugin provides a publisher that consumes XML test reports generated during the builds and provides some…wiki.jenkins-ci.org][16][][17] - -* JaCoCo - -[JaCoCo Plugin - Jenkins - Jenkins Wiki -In order to get the coverage data published to Jenkins, you need to add a JaCoCo publisher and configure it so it will…wiki.jenkins-ci.org][18][][19] - -* EnvInject - -[EnvInject Plugin - Jenkins - Jenkins Wiki -Only previous environment variables are available for polling Some plugins provide polling mechanisms (such as SCM…wiki.jenkins-ci.org][20][][21] - -* GitHub plugins - -[GitHub Plugin - Jenkins - Jenkins Wiki -This plugin requires that you have an HTTP URL reachable from GitHub, which means it's reachable from the whole…wiki.jenkins-ci.org][22][][23] - - - ![](https://cdn-images-1.medium.com/max/1000/1*xvG06qRSCvfw5OQgQleG0A.png) - -安装 Jenkins 插件 - -创建管理员用户,并完成安装 - -配置环境变量 ANDROID_HOME,JAVA_HOME - -点击 Manage Jenkins,接着 Configure System - -Scroll down and at Global properties section check the Environment variables box and add _ANDROID_HOME_ and _JAVA_HOME_ -滚动文件至底部,在全局属性模块中复核环境变量,并增加 _ANDROID_HOMOE_,和_JAVA_HOME_变量 - - - ![](https://cdn-images-1.medium.com/max/1000/1*rpgkUsqWhkHk4xOKCGPcvw.png) - -给所有 Jenkins 工作(jobs)增加全局变量. - -#### 创建 Jenkins Job - -一个 Jenkins Job 定义了一系列不间断的操作.如果你跟随本篇引导的话,那么你可以使用我已经在 GitHub 上为你准备了一个 Android 练习项目,你可以使用这个来试试手.它只是一个复合模块的 app,包括多个方面,比如单元测试,Android测试,和 JaCoCo,SonarQube插件. - - -[pamartineza/helloJenkins -helloJenkins - Hello Jenkins project for CI configuration testgithub.com][24][][25] - -首先创建一个新的 Job 项目,取名为 _Hello_Android_.不要使用空格,这样可以避免与 SonarQube 不兼容的问题. - - - ![](https://cdn-images-1.medium.com/max/1000/1*ITE7xIrbsrChWv45PSlPPw.png) - -创建一个 Freestyle Jenkins Job - -接下来就是配置了,我给每一块都增加了截屏 - -概况 - -这部分比较繁琐,你可以在这里变更 Job 的名字,增加简介.如果你使用 GitHub 项目,你还可以写下项目的 URL(不要 *.git,是 web 的 url,不是 repo) - - - ![](https://cdn-images-1.medium.com/max/1000/1*7QF2pfgM73FVIWTfQhcbEA.png) - -项目 Url 配置 - -源代码管理 - -这时候我们就要选择我们的 CVS 作为 Git,并且增加源的 url(这次就要包括 *.git)然后选择分支拉取.因为这是一个公开的 GitHub 库,我们就不需要提交证书了,否则的话就要设置账号和密码 - -相比于使用自己的公用仓库我更倾向于创建一个只读的私人仓库专门配给 Jenkins Job 使用 - -另外,如果你已经使用了 Two-Factor 认证,Jenkins 就无法拉取代码.所以为 Jenkins 专门开启一个库很有必要,这样可以直接从私人库中拉取代码 - - - ![](https://cdn-images-1.medium.com/max/1000/1*wkzdL70XrCzIpXDsHPA2Pg.png) - -配置仓库 - -构建 (build) 触发器 - -你可以手动开始构建,也可以远程,周期性地,或者在另一个 Job 构建完成之后开始构建,只要这些改变可以被检测到. - -最好的情况肯定是一旦你更改了某些地方,就会立刻触发构建事件,Github为此提供了名叫 webhooks 的回调函数 - - -[Webhooks | GitHub Developer Guide -Webhooks allow you to build or set up integrations which subscribe to certain events on GitHub.com. When one of those…developer.github.com][26][][27] - -这样,我们就可以发送这些事件到 CI 服务器,然后触发构建.显然,我们的 CI 服务器必须要联网,并且可以与 GitHub 服务器通信. - -你的 CI 服务器为了安全只限于内网使用,那么解决办法就只有集中周期性的提交.我就是只有工作时才打开 CI,我把它设置为每十五分钟上交一次.集中时间可以通过 CRON 语法设置,如果你不熟悉,请点击案例文件的右侧的帮助按钮. - - - - ![](https://cdn-images-1.medium.com/max/1000/1*eONz8DAwJ9PW7uc8VQw7wQ.png) - -源的集中配置 - -构建环境 - -这里我推荐设置超时模块避免 Jenkings 禁用内存和 CPU ,毕竟有时候有意外发生.当然,你还可以设置环境变量和密码等等. - - - ![](https://cdn-images-1.medium.com/max/1000/1*Y6FgbIQq8pMk6D72Sr9KdQ.png) - -构建超时 - -Build: - -神奇的事情发生了,使用 Gradle 脚本,增加 Build 步骤,选择 Gradle Wrapper (默认情况下,Gradle Wrapper 配置了 Android 项目,不要忘记在 Git 上检查一下)然后选择你要执行的任务 - -1. clean: 清除所有历史输出,这样可以刷新缓存 -2. asseembleDebug: 生成调试 .apk 文件 (Android application 文件) -3. test:在所有模块上执行 JUnit 测试文件 -4. connectteDebugAndroidTest:在实体机上执行安卓测试单元,连接到 CI (也可以使用安装了 Jenkins 插件的安卓模拟器,但是它不支持所有型号,而且相当麻烦) - - ![](https://cdn-images-1.medium.com/max/1000/1*D0HDPOUYCWzsWKiLv4LrBA.png) - -配置 Gradle - -我们将要增加 JUnit 测试报告.JUnit插件需要这一步,再搜集由 JUnit 测试结果生成的 XML 文件,这样我们就能即时知道测试结果的变化. - - -这我们 app 模块中,测试运行结果的路径是: - -app/build/test-results/debug/*.xml - -在其他 "纯净模式" 下,综合模块的测试结果在这里: - -*/build/test-results/*.xml - - - ![](https://cdn-images-1.medium.com/max/1000/1*ZQtamiQ_8PzAFBd-pMfvdg.png) - - -还要增加记录报告,表明将要创建一张显示代码作用域的表单. - - ![](https://cdn-images-1.medium.com/max/1000/1*wKaFykDl0qg-c79QwRTR2w.png) - - -#### 运行 Jenkins Job - -只要有任何改变提交到仓库,它们就会在十五分钟之内被执行,但是如果你不想等的话,或者你只是想验证一下配置的改变,你也可以手动运行.单击构建按钮,这样你就可以在构建历史中找到它,接着单击就可以了. - - - ![](https://cdn-images-1.medium.com/max/1000/1*vKi-BGQ2blimaoTl7PTXtQ.png) - -手动执行 Job - -最有趣的部分是控制台输出 (console output) 你可以看到 Jenkins 是如何开始执行我们的 Gradle 项目 - - ![](https://cdn-images-1.medium.com/max/1000/1*dbtmlSr2owrj_CQfGXjdsw.png) - -控制台输出的开始 - -你要是做的正确的话,控制台将会有如下输出 (任何源连接问题,测试单元的失败都将导致构建不可用) - - - ![](https://cdn-images-1.medium.com/max/1000/1*WpOH-aHuuNRDYmY710ecLQ.png) - -哈哈哈哈,构建成功,测试结果符合预期 - -### 第五步-SonarQube - -这部分我会讲讲如何安装,配置 SonarQube 和使用 Docker 作为容器的 MySQL 数据库 - -[Continuous Code Quality | SonarQube -The leading open source platform for continuous code qualitywww.sonarqube.org][28][][29] - -SonarQube 是个代码静态分析工具,它可以帮助开发者写出干净,优雅的代码.它还可以跟踪代码规模,测试结果,功能需求等等.SonarQube检测到的问题可以使用插件十分容易的导入到 Android Studion/IntelliJ 中去. - -[JetBrains Plugin Repository :: SonarQube Community Plugin -Edit descriptionplugins.jetbrains.com][30][][31] - - -#### 安装 Docker - -安装 Docker 十分容易,按照下面的教程即可 - -[Install Docker on Ubuntu -Instructions for installing Docker on Ubuntudocs.docker.com][32][][33] - -#### 生成容器 (Containers) - -MySQL: - -我们先搭建一个 MySQL5.7.17服务器容器,命名为 _mysqlserver.在你的家目录下建立一个本地文件夹,使用如下命令让服务在开机引导时候就被加载.把命令中的 YOUR_USER 和 YOUR_MYSQL_PASSWORD 替换为你自己账号密码. - -``` -$ docker run --name mysqlserver --restart=always -v /home/YOUR_USER/mysqlVolume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=YOUR_MYSQL_PASSWORD -p 3306:3306 -d mysql:5.7.17 -``` - - -phpMyAdmin: - -想要优雅简单地管理 MySQL服务器,我强烈推荐phpMyAdmin.你只要建立个容器,命名为 _phpmyadin,然后指向你的 mysqlserver容器,这样也会在开机引导时加载,你可以在 localhost:9090 找到它. - -``` -$ docker run --name phpmyadmin --restart=always --link mysqlserver:db -p 9090:80 -d phpmyadmin/phpmyadmin -``` - -你可以在 localhost:9090 用你的 mysql 密码,以 root 身份登录,然后你需要创建一个数据库,_sonar_with_uft8_general_ci - - -SonarQube: -现在我们已经创建好了我们的 SonarQube 容器,就叫 sonarqube,它会自启动,自动连接我们的数据库,你可以在 localhost:9090 使用 5.6.4(长期技术支持)版本 - -``` -$ docker run --name sonarqube --restart=always --link mysqlserver:db -p 9000:9000 -p 9092:9092 -e "SONARQUBE_JDBC_URL=jdbc:mysql://db:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance" -e "SONARQUBE_JDBC_USER=sonar" -e "SONARQUBE_JDBC_PASSWORD=YOUR_SONAR_PASSWORD" -d sonarqube:5.6.4 -``` - - -#### 配置 SonarQube - -如果你配置成功,你将在 localhost:9000 看到如下页面 - - - ![](https://cdn-images-1.medium.com/max/1000/1*tcgww8PENXdyrLS3K95ZEw.png) - -好了,让我们来配置必要的插件和基本的配置文件 - -1. 在页面的右上角可以登录(默认的管理员账号和密码是 admin/admin) -2. 进入到管理员 (Administration),然后点击 System,接下来是 Updata Center,最后是 Updates Only - -* Update Java plugin if necessary - -3. 现在启用,并安装以下插件 - -* Android (provides Android lint rules) -* Checkstyle -* Findbugs -* XML - -4. 返回顶部,点击重启按钮完成整个安装. - - -#### SonarQube 配置文件 - -我们刚刚安装的插件可以定义配置文件,这里有一套规则去衡量项目的代码质量 - -同一时间只有一个项目只能使用一个配置文件.但是我们可以抽象配置文件,让配置的实例集成这些规则(借用 OOP 概念),所以想在一个项目中灵活地使用配置,我们可以创建个性化配置,约束所有的配置. - -就这么干,点击 Quality Profiles ,跳转到 Create ,然后命名,比如 CustomAndroidProfile - -将 Android Lint 作为父级,然后选择 Android Lint 配置,增加 FindBugs Security Minial 作为上一级,当你得到父级继承,并且设置 CustomAndroidProfile 作为默认主题的时候,你就完成了. - - - ![](https://cdn-images-1.medium.com/max/1000/1*w2CvH8uAOUcvajzjsOoCgQ.png) - - -#### 运行 Sonarqube 分析器 - -现在我们的 SonarQube 已经正式配置完毕,我们需要添加一个 Gradle 任务,_sonarqube_到我们的 Jenkins Job.我们在最后执行. - - ![](https://cdn-images-1.medium.com/max/1000/1*EDAjalNzmdU-ptjhWzuCcQ.png) - -再次运行 Jenkins Job,一旦运行完毕,我们可以在 localhost:9090 中找到我们的 sonarQube 控制面板 - - - ![](https://cdn-images-1.medium.com/max/1000/1*n7dKdPXyUPj1AZe6ujL3vw.png) - -分析结果的显示 - -长按项目名称我们可以进入到相应的显示界面,最重要的可能就是问题界面了 -我将展示一个空构造方法下的主要问题细节.就我个人而言,使用 SonarQube 最大的好处就是可以显示分析结果.这是一个学习编程十分有用的技能. - - - ![](https://cdn-images-1.medium.com/max/1000/1*KKM9T2qHzanraAetghYCqg.png) - - -### 第六步 小贴士:配置其他 Android apps - -想要配置 Android app 得到 sonarqube 结果,只要安装 JaCoCo和Sonarqube 插件就可以了.你也可以在我的示例中得到更多信息 - -[pamartineza/helloJenkins -helloJenkins - Hello Jenkins project for CI configuration testgithub.com][34][][35] - -### 最后 - -啊,你终于走到头了,希望你觉得本文有点用处.你要是发现了任何错误,有任何疑问,别迟疑,赶紧评论.我拼了老命也要帮你.哦,忘了提醒,好东西要和朋友分享. - --------------------------------------------------------------------------------- - -作者简介: - -![](https://cdn-images-1.medium.com/fit/c/60/60/0*DQl4jAoi2wXr6S3p.jpg) - -Entrepreneur & CEO at GreenLionSoft · Android Lead @MadridMBC & @Shoptimix · Android, OpenSource and OpenData promoter · Runner · Traveller - --------------------------------------------------------------------------------- - -via: https://medium.com/@pamartineza/how-to-set-up-a-continuous-integration-server-for-android-development-ubuntu-jenkins-sonarqube-43c1ed6b08d3#.x6jhcpg98 - -作者:[Pablo A. Martínez][a] -译者:[Taylor1024](https://github.com/Taylor1024) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://medium.com/@pamartineza -[1]:https://www.ubuntu.com/download/desktop -[2]:https://www.nomachine.com/download -[3]:https://www.nomachine.com/download -[4]:http://sdkman.io/ -[5]:http://sdkman.io/ -[6]:http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html -[7]:http://www.webupd8.org/2012/09/install-oracle-java-8-in-ubuntu-via-ppa.html -[8]:https://developer.android.com/studio/index.html -[9]:https://developer.android.com/studio/index.html -[10]:https://dl.google.com/android/repository/tools_r25.2.3-linux.zip -[11]:https://dl.google.com/android/repository/tools_r25.2.3-linux.zip -[12]:https://jenkins.io/ -[13]:https://jenkins.io/ -[14]:https://pkg.jenkins.io/debian-stable/jenkins.io.key -[15]:http://localhost:8080/ -[16]:https://wiki.jenkins-ci.org/display/JENKINS/JUnit+Plugin -[17]:https://wiki.jenkins-ci.org/display/JENKINS/JUnit+Plugin -[18]:https://wiki.jenkins-ci.org/display/JENKINS/JaCoCo+Plugin -[19]:https://wiki.jenkins-ci.org/display/JENKINS/JaCoCo+Plugin -[20]:https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin -[21]:https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin -[22]:https://wiki.jenkins-ci.org/display/JENKINS/GitHub+Plugin -[23]:https://wiki.jenkins-ci.org/display/JENKINS/GitHub+Plugin -[24]:https://github.com/pamartineza/helloJenkins -[25]:https://github.com/pamartineza/helloJenkins -[26]:https://developer.github.com/webhooks/ -[27]:https://developer.github.com/webhooks/ -[28]:https://www.sonarqube.org/ -[29]:https://www.sonarqube.org/ -[30]:https://plugins.jetbrains.com/idea/plugin/7238-sonarqube-community-plugin -[31]:https://plugins.jetbrains.com/idea/plugin/7238-sonarqube-community-plugin -[32]:https://docs.docker.com/engine/installation/linux/ubuntulinux/ -[33]:https://docs.docker.com/engine/installation/linux/ubuntulinux/ -[34]:https://github.com/pamartineza/helloJenkins -[35]:https://github.com/pamartineza/helloJenkins From cb570f2b8cb10d42d77f1dda8c0b777a1124ccf3 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 3 Jul 2017 23:14:29 +0800 Subject: [PATCH 0605/1407] PUB:20170331 Writing a Linux Debugger Part 3 Registers and memory.md @ictlyh @jasminepeng --- ...ux Debugger Part 3 Registers and memory.md | 50 +++++-------------- 1 file changed, 12 insertions(+), 38 deletions(-) rename {translated/tech => published}/20170331 Writing a Linux Debugger Part 3 Registers and memory.md (81%) diff --git a/translated/tech/20170331 Writing a Linux Debugger Part 3 Registers and memory.md b/published/20170331 Writing a Linux Debugger Part 3 Registers and memory.md similarity index 81% rename from translated/tech/20170331 Writing a Linux Debugger Part 3 Registers and memory.md rename to published/20170331 Writing a Linux Debugger Part 3 Registers and memory.md index 3fcf15ab9c..3b04faf841 100644 --- a/translated/tech/20170331 Writing a Linux Debugger Part 3 Registers and memory.md +++ b/published/20170331 Writing a Linux Debugger Part 3 Registers and memory.md @@ -1,39 +1,26 @@ -开发 Linux 调试器(三):寄存器和内存 +开发一个 Linux 调试器(三):寄存器和内存 ============================================================ 上一篇博文中我们给调试器添加了一个简单的地址断点。这次,我们将添加读写寄存器和内存的功能,这将使我们能够使用我们的程序计数器、观察状态和改变程序的行为。 -* * * - ### 系列文章索引 随着后面文章的发布,这些链接会逐渐生效。 -1.  [准备环境][3] - +1. [准备环境][3] 2. [断点][4] - 3. [寄存器和内存][5] - 4. [Elves 和 dwarves][6] - 5. [源码和信号][7] - 6. [源码级逐步执行][8] - 7. 源码级断点 - 8. 调用栈展开 - 9. 读取变量 - 10. 下一步 -* * * - ### 注册我们的寄存器 -在我们真正读取任何寄存器之前,我们需要告诉调试器一些关于我们的目标,也就是 x86_64 的信息。除了多组通用和专用目的寄存器,x86_64 还提供浮点和向量寄存器。为了简化,我将跳过后两种寄存器,但是你如果喜欢的话也可以选择支持它们。x86_64 也允许你像访问 32、16 或者 8 位寄存器那样访问一些 64 位寄存器,但我只会介绍 64 位寄存器。由于这些简化,对于每个寄存器我们只需要它的名称,它的 DWARF 寄存器编号以及 `ptrace` 返回结构体中的存储地址。我使用范围枚举引用这些寄存器,然后我列出了一个全局寄存器描述符数组,其中元素顺序和 `ptrace` 中寄存器结构体相同。 +在我们真正读取任何寄存器之前,我们需要告诉调试器一些关于我们的目标平台的信息,这里是 x86_64 平台。除了多组通用和专用目的寄存器,x86_64 还提供浮点和向量寄存器。为了简化,我将跳过后两种寄存器,但是你如果喜欢的话也可以选择支持它们。x86_64 也允许你像访问 32、16 或者 8 位寄存器那样访问一些 64 位寄存器,但我只会介绍 64 位寄存器。由于这些简化,对于每个寄存器我们只需要它的名称、它的 DWARF 寄存器编号以及 `ptrace` 返回结构体中的存储地址。我使用范围枚举引用这些寄存器,然后我列出了一个全局寄存器描述符数组,其中元素顺序和 `ptrace` 中寄存器结构体相同。 ``` enum class reg { @@ -88,7 +75,7 @@ const std::array g_register_descriptors {{ 如果你想自己看看的话,你通常可以在 `/usr/include/sys/user.h` 找到寄存器数据结构,另外 DWARF 寄存器编号取自 [System V x86_64 ABI][11]。 -现在我们可以编写一堆函数来和寄存器交互。我们想要读取寄存器、写入数据、根据 DWARF 寄存器编号获取值,以及通过名称查找寄存器,反之类似。让我们先从实现 `get_register_value` 开始: +现在我们可以编写一堆函数来和寄存器交互。我们希望可以读取寄存器、写入数据、根据 DWARF 寄存器编号获取值,以及通过名称查找寄存器,反之类似。让我们先从实现 `get_register_value` 开始: ``` uint64_t get_register_value(pid_t pid, reg r) { @@ -100,7 +87,7 @@ uint64_t get_register_value(pid_t pid, reg r) { `ptrace` 使得我们可以轻易获得我们想要的数据。我们只需要构造一个 `user_regs_struct` 实例并把它和 `PTRACE_GETREGS` 请求传递给 `ptrace`。 -现在取决于被请求的寄存器,我们想要读取 `regs`。我们可以写一个很大的 switch 语句,但由于我们 `g_register_descriptors` 表的布局顺序和 `user_regs_struct` 相同,我们只需要搜索寄存器描述符的索引,然后作为 `uint64_t` 数组访问 `user_regs_struct`。[1][9] +现在根据要请求的寄存器,我们要读取 `regs`。我们可以写一个很大的 switch 语句,但由于我们 `g_register_descriptors` 表的布局顺序和 `user_regs_struct` 相同,我们只需要搜索寄存器描述符的索引,然后作为 `uint64_t` 数组访问 `user_regs_struct` 就行。(你也可以重新排序 `reg` 枚举变量,然后使用索引把它们转换为底层类型,但第一次我就使用这种方式编写,它能正常工作,我也就懒得改它了。) ``` auto it = std::find_if(begin(g_register_descriptors), end(g_register_descriptors), @@ -109,9 +96,9 @@ uint64_t get_register_value(pid_t pid, reg r) { return *(reinterpret_cast(®s) + (it - begin(g_register_descriptors))); ``` -到 `uint64_t` 的转换是安全的,因为 `user_regs_struct` 是一个标准布局类型,但我认为指针算术技术上是未定义的行为(undefined behavior)。当前没有编译器会对此产生警告,我也懒得修改,但是如果你想保持最严格的正确性,那就写一个大的 switch 语句。 +到 `uint64_t` 的转换是安全的,因为 `user_regs_struct` 是一个标准布局类型,但我认为指针算术技术上是未定义的行为undefined behavior。当前没有编译器会对此产生警告,我也懒得修改,但是如果你想保持最严格的正确性,那就写一个大的 switch 语句。 -`set_register_value` 非常类似,我们只是写入到地址并在最后写回寄存器: +`set_register_value` 非常类似,我们只是写入该位置并在最后写回寄存器: ``` void set_register_value(pid_t pid, reg r, uint64_t value) { @@ -166,12 +153,10 @@ void debugger::dump_registers() { } ``` -正如你看到的,iostreams 有非常精确的接口用于美观地输出十六进制数据[2][10]。如果你喜欢你也可以通过 I/O 操纵器来摆脱这种混乱。 +正如你看到的,iostreams 有非常精确的接口用于美观地输出十六进制数据(啊哈哈哈哈哈哈)。如果你喜欢你也可以通过 I/O 操纵器来摆脱这种混乱。 这些已经足够支持我们在调试器接下来的部分轻松地处理寄存器,所以我们现在可以把这些添加到我们的用户界面。 -* * * - ### 显示我们的寄存器 这里我们要做的就是给 `handle_command` 函数添加一个命令。通过下面的代码,用户可以输入 `register read rax`、 `register write rax 0x42` 以及类似的语句。 @@ -191,7 +176,6 @@ void debugger::dump_registers() { } ``` -* * * ### 接下来做什么? @@ -225,13 +209,11 @@ void debugger::write_memory(uint64_t address, uint64_t value) { } ``` -* * * - ### 给  `continue_execution` 打补丁 在我们测试我们的更改之前,我们现在可以实现一个更健全的 `continue_execution` 版本。由于我们可以获取程序计数器,我们可以检查我们的断点映射来判断我们是否处于一个断点。如果是的话,我们可以停用断点并在继续之前跳过它。 -为了清晰和简洁,首先我们要添加一些帮助函数: +为了清晰和简洁起见,首先我们要添加一些帮助函数: ``` uint64_t debugger::get_pc() { @@ -288,11 +270,9 @@ void debugger::continue_execution() { } ``` -* * * - ### 测试效果 -现在我们可以读取和修改寄存器了,我们可以对我们的 hello world 程序做一些有意思的更改。类似第一次测试,再次尝试在 call 指令处设置断点然后从那里继续执行。你可以看到输出了 `Hello world`。现在是有趣的部分,在输出调用后设一个断点、继续、将 call 参数设置代码的地址写入程序计数器(`rip`) 并继续。由于程序计数器操纵,你应该再次看到输出了 `Hello world`。为了以防你不确定在哪里设置断点,下面是我上一篇博文中的 `objdump` 输出: +现在我们可以读取和修改寄存器了,我们可以对我们的 hello world 程序做一些有意思的更改。类似第一次测试,再次尝试在 `call` 指令处设置断点然后从那里继续执行。你可以看到输出了 `Hello world`。现在是有趣的部分,在输出调用后设一个断点、继续、将 `call` 参数设置代码的地址写入程序计数器(`rip`)并继续。由于程序计数器操纵,你应该再次看到输出了 `Hello world`。为了以防你不确定在哪里设置断点,下面是我上一篇博文中的 `objdump` 输出: ``` @@ -313,18 +293,12 @@ void debugger::continue_execution() { 在下一篇博客中,我们会第一次接触到 DWARF 信息并给我们的调试器添加一系列逐步调试的功能。之后,我们会有一个功能工具,它能逐步执行代码、在想要的地方设置断点、修改数据以及其它。一如以往,如果你有任何问题请留下你的评论! 你可以在[这里][13]找到这篇博文的代码。 - -* * * - -1. 你也可以重新排序 `reg` 枚举变量,然后使用索引把它们转换为底层类型,但第一次我就使用这种方式编写,它能正常工作,我也就懒得改它了。 [↩][1] - -2. Ahahahahahahahahahahahahahahahaha [↩][2] - + -------------------------------------------------------------------------------- via: https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/ -作者:[ TartanLlama ][a] +作者:[Simon Brand][a] 译者:[ictlyh](https://github.com/ictlyh) 校对:[jasminepeng](https://github.com/jasminepeng) From d79fe3522bdb9ae9588f442d4bc91180c775ee61 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 3 Jul 2017 23:43:19 +0800 Subject: [PATCH 0606/1407] PRF&PUB:20170620 Debian armhf VM on arm64 server.md @geekpi --- ...0170620 Debian armhf VM on arm64 server.md | 38 +++++++++---------- 1 file changed, 18 insertions(+), 20 deletions(-) rename {translated/tech => published}/20170620 Debian armhf VM on arm64 server.md (51%) diff --git a/translated/tech/20170620 Debian armhf VM on arm64 server.md b/published/20170620 Debian armhf VM on arm64 server.md similarity index 51% rename from translated/tech/20170620 Debian armhf VM on arm64 server.md rename to published/20170620 Debian armhf VM on arm64 server.md index 4ce4ed5310..b5a300770e 100644 --- a/translated/tech/20170620 Debian armhf VM on arm64 server.md +++ b/published/20170620 Debian armhf VM on arm64 server.md @@ -1,27 +1,25 @@ -# arm64 服务器中的 Debian armhf 虚拟机 +arm64 服务器中的 Debian armhf 虚拟机 +============= - -在 Collabora,我们所做的许多工作之一就是为客户构建包括 32 位和 64 位 ARM 系统在内的各种架构的 [Debian][1] 衍生版。就像 Debian 做的那样,我们的 [OBS][2] 系统建立在原生系统而不是仿真器上。 +在 Collabora 公司,我们所做的许多工作之一就是为客户构建包括 32 位和 64 位 ARM 系统在内的各种架构的 [Debian][1] 衍生版。就像 Debian 做的那样,我们的 [OBS][2] 系统建立在原生系统而不是仿真器上。 幸运的是随着几年前 ARM 服务器系统的出现,为这些系统原生构建不再像以前那么痛苦了。对于 32 位的 ARM,我们一直依赖 [Calxeda][3] 刀片服务器,然而不幸的是 Calxeda 在不久前淘汰,硬件开始显露其年龄(尽管幸运的是 Debian Stretch 还支持它,因此至少软件还是新的)。 -在 64 位 ARM 方面,我们运行在基于 Gigabyte MP30-AR1 的服务器上,该服务器可以运行 32 位的 ARM 代码(与之相反,比如基于 ThunderX 的服务器只能运行 64 位代码)。像这样在它们之上运行 armhf 虚拟机作为从构建服务器似乎是一个很好的选择,但是设置起来可能会需要更多东西的介入。 +在 64 位 ARM 方面,我们运行在基于 Gigabyte MP30-AR1 的服务器上,该服务器可以运行 32 位的 ARM 代码(与之相反,比如基于 ThunderX 的服务器只能运行 64 位代码)。像这样在它们之上运行 armhf 虚拟机作为从构建服务器(build slaves)似乎是一个很好的选择,但是设置起来可能会需要更多东西的介入。 第一个陷阱是 Debian 中没有标准的 bootloader 或者 boot 固件来启动 qemu 仿真的 “virt” 设备(我不想使用真实机器的仿真)。这也意味着在启动时客户机内没有任何东西会加载内核,也不会从客户机网络引导,这意味着需要直接的内核引导。 -第二个陷进是当前的 Debian Stretch armhf 内核并不支持 qemu 虚拟机暴露的通用 PCI 主机控制器,这意味着客户机中不会出现存储器和网络。希望这会被尽快解决([Debian bug 864726][4]),并会出现在 Stretch 更新中,那在之前需要使用 bug 报告中附带的补丁的自定义内核,但在这篇文章中我不想进一步说。 +第二个陷阱是当前的 Debian Stretch 的 armhf 内核并不支持 qemu 虚拟机所提供的通用 PCI 主机控制器,这意味着客户机中不会出现存储器和网络。希望这会被尽快解决([Debian bug 864726][4]),并出现在 Stretch 更新中,那在之前需要使用 bug 报告中附带的补丁的自定义内核,但在这篇文章中我不想进一步说。 -高兴的假设我们有一个可用的内核,剩下的挑战是很好地管理直接内核加载。或者更具体地说,如何确保主机通过标准 apt 工具来启动客户机安装的内核,而不必在客户机/主机之间复制内核,这本质上归结于客户机暴露 /boot 给主机。我们选择的方案是使用 qemu 的 9pfs 支持从主机共享一个文件夹,并将其用作客户机的 /boot。对于 9p 文件夹,似乎需要 “mapped” 安全模式,因为 “none” 模式对 dpkg 有问题([Debian bug 864718] [5])。 +高兴的假设我们有一个可用的内核,剩下的挑战是很好地管理直接内核加载。或者更具体地说,如何确保主机启动客户机通过标准 apt 工具安装的内核,而不必在客户机/主机之间复制内核,这本质上归结于客户机将 `/boot` 暴露给主机。我们选择的方案是使用 qemu 的 9pfs 支持来从主机共享一个文件夹,并将其用作客户机的 `/boot`。对于 9p 文件夹,似乎需要 “mapped” 安全模式,因为 “none” 模式对 dpkg 有问题([Debian bug 864718] [5])。 由于我们使用 libvirt 作为我们的虚拟机管理器,剩下的事情就是如何将它们组合到一起。 -第一步是安装系统,基本和平常一样。可以直接引导进入由普通的 Stretch armhf netboot 安装程序提供的 vmlinuz 和 initrd.gz(下载到如 /tmp 中)。 整体设置是直接的,会有一些小的调整: +第一步是安装系统,基本和平常一样。可以直接引导进入由普通的 Stretch armhf netboot 安装程序提供的 `vmlinuz` 和 `initrd.gz`(下载到如 `/tmp` 中)。 设置整体来说很直接,会有一些小的调整: -* /srv/armhf-vm-boot 设置为 9p 共享文件夹(这个应该存在,并且由 libvirt-qemu 拥有),这之后会被用于共享 /boot。 - -* 用 root= 后面加上 VM 中的 root 分区,根据你的使用调整。 - -* 镜像文件使用 virtio 总线,这似乎不是默认的。 +* `/srv/armhf-vm-boot` 设置为 9p 共享文件夹(这个应该存在,并且由 libvirt-qemu 拥有),这之后会被用于共享 `/boot`。 +* 内核参数中在 `root=` 后面加上 VM 中的 root 分区,根据你的情况调整。 +* 镜像文件使用 virtio 总线,这似乎不是默认的。 除了这些调整,最后的示例命令与 virt-install 手册页中的相似。 @@ -32,19 +30,19 @@ virt-install --name armhf-vm --arch armv7l --memory 512 \ --boot=kernel=/tmp/vmlinuz,initrd=/tmp/initrd.gz,kernel_args="console=ttyAMA0,root=/dev/vda1" ``` -按照通常的方式运行安装。到最后安装程序可能会提示它不知道如何安装引导程序,这个没什么问题。只要在结束安装/重启之前,切换到 shell 并以某种方式将目标系统中的 /boot/vmlinuz 和 /boot/initrd.img 复制到主机中(比如 chroot 进入 /target 并在已安装的系统中使用 scp)。 这是必需的,因为安装程序不支持 9p,但是要启动系统,需要 initramfs 以及能够能够挂载根文件系统的模块,这由已安装的 initramfs 提供。这些完成后,安装就可以完成了。 +按照通常的方式运行安装。到最后安装程序可能会提示它不知道如何安装引导程序,这个没什么问题。只要在结束安装和重启之前,切换到 shell 并以某种方式将目标系统中的 `/boot/vmlinuz` 和 `/boot/initrd.img` 复制到主机中(比如 chroot 进入 `/target` 并在已安装的系统中使用 scp)。 这是必需的,因为安装程序不支持 9p,但是要启动系统,需要 initramfs 以及能够挂载根文件系统的模块,这由已安装的 initramfs 提供。这些完成后,安装就可以完成了。 接下来,引导已安装的系统。调整 libvirt 配置(比如使用 virsh 编辑并调整 xml)来使用从安装程序复制过来的内核以及 initramfs,而不只是使用它提供的。再次启动虚拟机,它应该就能愉快地进入安装的 Debian 系统中了。 -要在客户机完成,/boot 应该移动到共享的 9pfs 中,/boot 的新 fatab 条目看上去应该这样: +要在客户机这一侧完成,`/boot` 应该移动到共享的 9pfs 中,`/boot` 的新 fstab 条目看上去应该这样: ``` virtio-boot /boot 9p trans=virtio,version=9p2000.L,x-systemd.automount 0 0 ``` -有了这一步,这只是将 /boot 中的文件进入新的文件系统,并且客户机完成了(确保 vmlinuz/initrd.img 保持符号链接)。内核可以如常升级,并对主机可见。 +有了这一步,这只是将 `/boot` 中的文件混到新的文件系统里面,并且客户机完事了(确保 `vmlinuz`/`initrd.img` 保持符号链接)。内核可以如常升级,并对主机可见。 -这时对于主机端,有另外一个问题需要跨过,由于客户机使用 9p 映射安全模式,客户机的符号链接对主机而言将是普通的包含链接目标的文件。为了解决这个问题,我们在客户机启动前使用 libvirt qemu 的 hook 支持来设置合适的符号链接。作为一个例子,下面是我们最终使用的脚本(/etc/libvirt/hooks/qemu): +这时对于主机端,有另外一个问题需要跨过,由于客户机使用 9p 映射安全模式,客户机的符号链接对主机而言将是普通的包含链接目标的文件。为了解决这个问题,我们在客户机启动前使用 libvirt qemu 的 hook 支持来设置合适的符号链接。作为一个例子,下面是我们最终使用的脚本(`/etc/libvirt/hooks/qemu`): ``` vm=$1 @@ -63,17 +61,17 @@ ln -sf $(basename $(cat ${bootdir}/vmlinuz)) ${bootdir}/virtio-vmlinuz ln -sf $(basename $(cat ${bootdir}/initrd.img)) ${bootdir}/virtio-initrd.img ``` -有了这个,我们可以简单地定义 libvirt 使用 /srv/${vm}-boot/virtio-{vmlinuz,initrd.img} 作为机器的内核/initramfs,并且当 VM 启动时,它会自动获取客户机安装的最新内核/initramfs。 +有了这个,我们可以简单地定义 libvirt 使用 `/srv/${vm}-boot/virtio-{vmlinuz,initrd.img}` 作为机器的内核 / `initramfs`,并且当 VM 启动时,它会自动获取客户机安装的最新内核 / `initramfs`。 -只有最后一个边缘情况存在,当从 VM libvirt 重启会让 qemu 处理它而不是重启 qemu。这不幸如果发生的话,这意味着重启不会加载新内核。所以现在我们通过配置 libvirt 来解决这个问题,从而在重启时停止虚拟机。由于我们通常只在升级内核(安装)时重启 VM,虽然这有点乏味,但这避免了重启加载的是旧内核/initramfs 而不是预期的。 +只有最后一个边缘情况了,当从 VM libvirt 重启会让 qemu 处理它而不是重启 qemu。如果这不幸发生的话,意味着重启不会加载新内核。所以现在我们通过配置 libvirt 来解决这个问题,从而在重启时停止虚拟机。由于我们通常只在升级内核(安装)时重启 VM,虽然这有点乏味,但这避免了重启加载的是旧内核 / `initramfs` 而不是预期的。 -------------------------------------------------------------------------------- via: https://www.collabora.com/news-and-blog/blog/2017/06/20/debian-armhf-vm-on-arm64-server/ -作者:[ Sjoerd Simons][a] +作者:[Sjoerd Simons][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/) 荣誉推出 From db84abeca40b45f245e97c3a22d760d77533a871 Mon Sep 17 00:00:00 2001 From: XYenChi <466530436@qq.com> Date: Tue, 4 Jul 2017 08:04:09 +0800 Subject: [PATCH 0607/1407] translated --- ...puppy The hidden costs of free software.md | 64 ------------------- ...puppy The hidden costs of free software.md | 64 +++++++++++++++++++ 2 files changed, 64 insertions(+), 64 deletions(-) delete mode 100644 sources/talk/20170213 Free as in puppy The hidden costs of free software.md create mode 100644 translated/20170213 Free as in puppy The hidden costs of free software.md diff --git a/sources/talk/20170213 Free as in puppy The hidden costs of free software.md b/sources/talk/20170213 Free as in puppy The hidden costs of free software.md deleted file mode 100644 index e3c066d6f2..0000000000 --- a/sources/talk/20170213 Free as in puppy The hidden costs of free software.md +++ /dev/null @@ -1,64 +0,0 @@ -Free as in puppy: The hidden costs of free software -============================================================ - - ![Free as in puppy: The hidden costs of free software](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/osdc_whitehurst_money.png?itok=Xqow4bzq "Free as in puppy: The hidden costs of free software") -Image by : opensource.com - -We're used to hearing of software being described as "free as in freedom" and "free as in beer." But there's another kind of "free" that doesn't get talked about as much: "free as in puppy." This concept is based around the idea that when someone gives you a free puppy, that puppy isn't really free. There's a lot of work and expenses that go into its daily care. The business term is "total cost of ownership," or TCO, and it applies to anything, not just open source software and puppies. - -So if the free puppy problem applies to everything, how is it important to open source software specifically? There are a few ways. First, if you're already paying for software, then you've set the expectation that it has costs. Software that's free up front but costs money later seems like a major imposition. Secondly, if it happens on an organization's first open source adoption project, it can put the organization off of adopting open source software in the future. Lastly and counterintuitively, showing that open source software has a cost may make it an easier "sell." If it's truly no cost, it seems too good to be true. - -The following sections represent common areas for software costs to sneak in. This is by no means a comprehensive list. - -### Setup costs - -To begin using software, you must first have the software. - -* **Software:** Just because it's open source doesn't necessarily mean it's _gratis_. -* **Hardware:** Consider the requirements of the software. If you don't have the hardware that (this could be server hardware or client hardware) you need to use the software, you'll need to buy it. -* **Training:** Software is rarely completely intuitive. The choice is to get training or figure it out on your own. -* **Implementation** Getting all of the pieces in the same room is only the start. Now, it's time to put the puzzle together. - - * **Installation and configuration:** At a minimum this will take some staff time. If it's a big project, you may need to pay a systems integrator or some other vendor to do this. - * **Data import:** If you're replacing an existing system, there is data to move into a new home. In a happy world where everything complies with the same standard, this is not a problem. In many cases, though, it may be necessary to write some scripts to extract and reload data. - * **Interfaces with other systems:** Speaking of writing scripts, does this software tie in nicely with other software you use (for example, your directory service or your payroll software)? - * **Customization:** If the software doesn't meet all of your needs out of the box, it may need to be customized. You can do that, but it still requires effort and maybe some materials. -* **Business changes:** This new software will probably change how your organization does something—hopefully for the better. However, the shift isn't free. For example, productivity may dip initially as staff get used to the new software. - -### Operational costs - -Getting the software installed is the easy part. Now you have to use it. - -* **More training:** What, did you think we were done with this? Over time, new people will probably join your organization and they will also need to learn how to use the software, or a new release will come out that adds additional functionality. -* **Maintenance:** - - * **Subscription:** Some software provides updates via a paid subscription. - * **Patches:** Depending on the nature of the software, there may be some effort in applying patches. This includes both testing and deployment. - * **Development:** Did you make any customizations yourself? Now you have to maintain those forever. -* **Support:** Someone has to fix it when it goes wrong, and whether that's a vendor or your own team, there's a real cost. -* **Good citizenship:** This one isn't a requirement, but if you're using open source software, it would be nice if you gave back somehow. This might be code contributions, providing support on the mailing list, sponsoring the annual conference, etc. -* **Business benefits:** Okay, so this isn't a cost, but it can offset some of the costs. What does using this software mean for your organization? If it enables you to manufacture widgets with 25% less waste, then that's valuable. To provide another example, maybe it helps you increase repeat contributions to your nonprofit by 30%. - -Even with a list like this, it takes a lot of imagination to come up with all of the costs. Getting the values right requires some experience and a lot of good guessing, but just going through the process helps make it more clear. Much like with a puppy, if you know what you're getting yourself into up front, it can be a rewarding experience. - --------------------------------------------------------------------------------- - -作者简介: - -Ben Cotton - Ben Cotton is a meteorologist by training and a high-performance computing engineer by trade. Ben works as a technical evangelist at Cycle Computing. He is a Fedora user and contributor, co-founded a local open source meetup group, and is a member of the Open Source Initiative and a supporter of Software Freedom Conservancy. Find him on Twitter (@FunnelFiasco) - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/17/2/hidden-costs-free-software - -作者:[Ben Cotton ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/bcotton -[1]:https://opensource.com/article/17/2/hidden-costs-free-software?rate=gXfsYPWiIQNslwJ3zOAje71pTMRhp25Eo0HTdLWOKv4 -[2]:https://opensource.com/user/30131/feed -[3]:https://opensource.com/article/17/2/hidden-costs-free-software#comments -[4]:https://opensource.com/users/bcotton diff --git a/translated/20170213 Free as in puppy The hidden costs of free software.md b/translated/20170213 Free as in puppy The hidden costs of free software.md new file mode 100644 index 0000000000..64c3f8cb1f --- /dev/null +++ b/translated/20170213 Free as in puppy The hidden costs of free software.md @@ -0,0 +1,64 @@ +幼犬式免费:免费软件中的无形消费 +============================================================ + + ![幼犬式免费:免费软件中的无形消费](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/osdc_whitehurst_money.png?itok=Xqow4bzq "幼犬式免费: 免费软件中的无形消费") +Image by : opensource.com + +我们习惯于软件被描述为“自由式免费”和“啤酒式免费”。但还有另一种不常被提起的“免费”——“幼犬式免费”。这个概念来自于当别人送你一只免费的小狗,但那只小狗不是真的免费。日常照顾它需要花费大量精力与金钱。商业术语是“所有权的总花费”,或 TCO (总体拥有成本),这适用于所有场景,不仅仅是开源软件和小狗。 + +既然免费小狗问题适用于所有事,那么它是如何对于开源软件特别重要的呢?有一些解释。首先,如果你已经购买了软件,就会因为消费对它设定期望值。软件起初免费后来收费似乎是主要的无理要求。其次,如果这发生在一个组织首次采用开源项目的时候,就会阻碍该组织下一次采用开源项目。最终且违反直觉的是,表明开源软件需要消费可能使得它更轻易“卖出”,如果它真的免费,未免也太好了一点。 + +接下来的部分是软件消费渐显的共同之处。这绝不是一个详尽的列表。 + +### 起始消费 + +开始使用软件之前,你必须首先拥有这个软件。 + +* **软件:** 只因为它开源不一定意味着它是_免费的_. +* **硬件:** 考虑到软件的需求。如果你没有使用软件所需的硬件(可能是服务器硬件或者客户端硬件),你得买 +* **培训:** 很少有软件完全直白如话的。在于你是选择培训还是自己弄清楚。 +* **实战** 把所有零部件放在一起只是开始,现在,是时候把所有难题放在一起了。 + + * **安装和配置:** 至少这将花费一些员工的工作时间。如果这是一个大项目,你可能需要花钱请一个系统整合者或者其他供应商来做这件事。 + * **数据导入:** 如果要取代现成的系统,存在数据搬家的问题。皆大欢喜的是所有都是相同标准编译的,这样就没什么问题。然而在很多情况,需要写一些脚本来提取和重载数据。 + * **其他系统的接口:** 说到写脚本,这个软件能和你使用的其他软件(例如,词典服务或者工资单软件)很好联系起来吗? + * **定制:** 如果原本的软件不能满足你所有的需求,那它可能需要定制。你可以做到,但是仍需要努力或者是一些原材料。 +* **营业额变化:** 当你的组织希望有所改善时,新软件也会变化。然而这种转换不是免费的。例如,生产效率刚开始可能会下降因为员工还在适应新软件。 + +### 经营成本 + +安装软件是简单部分,现在你得使用它。 + +* **更多培训:** 什么, 你认为我们已经做好这了? 过段时间,你的组织会加入信任,他们需要学习如何使用这个软件,或者说是添加了额外功能的新发行版软件出版了。 +* **维护:** + + * **会员费:** 有些软件通过收取会员费来提供更新。 + * **补丁:**取决于软件的天性,打补丁需要费很多功夫。包括测试和调度。 + * **发展:**你自己做所有定制吗?现在你得永远保持这样了。、 +* **支持:** 当它坏了得有人来修,无论是供应商还是自己的团队,确实需要一笔花费。 +* **好身份:** 这个不是必需品,但如果你在使用开源软件,无论如何给一些回馈是非常好的。比如代码贡献、在邮件列表提供支持、赞助年度会议等等。 +* **商业利益:** 好吧,这不是一个付费项,而且它抵消了一些费用。使用软件对你的组织意味着什么呢?如果它使得量产产品减少了 25% 的浪费,这就是价值。再换个例子,它可能帮助你减少 30% 不盈利部分。 + +这样例子数不胜数,确实需要一定想象力来想出所有的花费。算出正确的价值需要一些实验和大量的的优质客户,但只是经历过程的话会使得它更加清晰。就好像一只小狗狗,如果预先知道自己会付出多少,这可能会是一个有价值的实验。 + +-------------------------------------------------------------------------------- + +作者简介: + +Ben Cotton - Ben Cotton 是一个培训过的气象学家和一个职业的高效计算机工程师。 Ben 在 Cycle Computing 做技术传教士.他是 Fedora 用户和贡献者, 合作创办当地的一个开源集会,是一名开源倡议者和软件自由机构的支持者。他的推特 (@FunnelFiasco) + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/17/2/hidden-costs-free-software + +作者:[Ben Cotton ][a] +译者:[XYenChi](https://github.com/XYenChi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/bcotton +[1]:https://opensource.com/article/17/2/hidden-costs-free-software?rate=gXfsYPWiIQNslwJ3zOAje71pTMRhp25Eo0HTdLWOKv4 +[2]:https://opensource.com/user/30131/feed +[3]:https://opensource.com/article/17/2/hidden-costs-free-software#comments +[4]:https://opensource.com/users/bcotton From a73305746f5e05caaaf1e60d0fdb6fb7737e94f0 Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 4 Jul 2017 08:49:23 +0800 Subject: [PATCH 0608/1407] translated --- ...How-to Ubuntu 17.04 GNOME and Chrome OS.md | 87 ------------------- ...How-to Ubuntu 17.04 GNOME and Chrome OS.md | 85 ++++++++++++++++++ 2 files changed, 85 insertions(+), 87 deletions(-) delete mode 100644 sources/tech/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md create mode 100644 translated/tech/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md diff --git a/sources/tech/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md b/sources/tech/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md deleted file mode 100644 index ef96a3d536..0000000000 --- a/sources/tech/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md +++ /dev/null @@ -1,87 +0,0 @@ -translating---geekpi - -Chromebook Dual Boot How-to: Ubuntu 17.04 GNOME and Chrome OS -============================================================ - - -### This tutorial uses the famous Crouton installer - - -Last year when I got my Acer Chromebook 11 (C740), I wrote a tutorial to teach you guys how to [remove Google Chrome OS and install a GNU/Linux distribution][1] of your choice, but things got boring. - -So after a few months, I reinstalled Chrome OS using a recovery image that Google provides on their website for this sort of things, which I wrote on a USB flash drive and booted from my Chromebook. Recently, I got bored again, and so I decided to install Ubuntu on my Acer Chromebook 11 (C740) using Crouton. - -Why? Because of a friend who came one day at a meeting we had with his laptop, a Dell Chromebook 13, on which he ran Ubuntu Linux alongside Chrome OS. It was really cool to see him switch so easily between the two operating systems with a simple keyboard shortcut that it made me wanna do the same. - -There are a lot of tutorials out there explaining how to install various releases of Ubuntu, Debian or  Kali Linux (these are the GNU/Linux distros currently supported by the Crouton installer), but I wanted to run the latest Ubuntu release, Ubuntu 17.04 (Zesty Zapus) in this case, with the GNOME 3.24 desktop environment. - -How to enable Developer Mode and download Crouton - -When I asked my friend which Ubuntu version is he running on his Chromebook, the answer was Ubuntu 14.04 LTS (Trusty Tahr), which I have to admit that it disappointed me. Immediately when I got home, I got my Chromebook and tried to see if I could run Ubuntu 17.04, with the GNOME desktop environment. - -The first thing I did was to put my Chromebook in Developer Mode. To do that, you'll have to shut down your Chromebook without closing the lid, then hold the ESC, Refresh and Power buttons at the same time for a few seconds until you enter recovery mode, which will wipe all the data on your Chromebook. - -It will take a few minutes to enter Developer Mode so be patient. When it's ready, you'll have to log in with your Google account and set various things like wallpaper or your avatar the way it was before. Now that you are in Developer Mode, access this tutorial on your Chromebook and [download Crouton][2], which will be saved in the Downloads folder. - -How to install Ubuntu 17.04 with GNOME 3.24 using Crouton - -Now, open Google Chrome and press CTRL+ALT+T to open the Chrome OS' terminal emulator, which is called crosh. At the command-line prompt, type the "shell" command (without quotes) and press Enter to access the Linux shell. Let's see what Crouton can do for us now. - -There are two commands (listed below) that you can run to see which GNU/Linux distributions and desktop environments Crouton supports, and we can tell you that it's possible to install Debian 7 "Wheezy", Debian 8 "Jessie", Debian 9 "Stretch" and Debian Sid, Kali Linux Rolling, as well as Ubuntu 12.04 LTS, Ubuntu 14.04 LTS, and Ubuntu 16.04 LTS. - -`sh -e /Downloads/crouton -r list -  _will list supported distros_ -sh -e /Downloads/crouton -t list -  _will list supported desktops_` - -Crouton will also list a bunch of older releases of Debian, Kali and Ubuntu, which are upstream end-of-life (all of them being marked with an exclamation mark after their name) and which you should not install because of security risks, as well as two unsupported versions of Ubuntu, namely Ubuntu 16.10 and Ubuntu 17.04. - -The developers of Crouton say that these "unsupported" Ubuntu release may work with some effort, but I took my chance and installed Ubuntu 17.04 (Zesty Zapus) with the GNOME 3.24 desktop environment (without any extra apps) using the following command. I put the "-e" parameter to encrypt the installation. - -`sh -e /Downloads/crouton -e -r zesty -t gnome` - -It will take a few minutes for everything to be downloaded and installed in the chrooted environment that Crouton will create inside your Chromebook so, again, be patient. When it's done, you'll know it, and you'll be able to start Ubuntu 17.04 with GNOME by running the following command at the shell prompt. - -`sudo startgnome` - -And voila! I'm running Ubuntu 17.04 (Zesty Zapus) with the GNOME 3.24 desktop environment on my old Acer Chromebook 11 (C740), which Google is yet to support with Android apps. The best part is that I can easily switch between Chrome OS and Ubuntu 17.04 using the CTRL+ALT+Shift+Back/Forward keyboard shortcuts. - -As an ending note, I would like to bring to your attention that because your Chromebook is now always in Developer Mode, you will always see a warning screen saying "OS verification is OFF - Press SPACE to re-enable" when the battery dies or you shut down and turn on the device, so press CTRL+D when you see that screen to boot. Have fun! - -[Ubuntu 17.04][9] -[GNOME 3.24][10] -[Chromebook][11] -[Acer Chrombook 11][12] -[Linux][13] - -### Ubuntu 17.04 on Acer Chrombook 11 (4 Images) - - [![Ubuntu 17.04 with GNOME 3.24 running on Acer Chromebook 11 (C740)](http://i1-news.softpedia-static.com/images/fitted/620x/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-2.jpg)][18] [![GNOME 3.24 desktop - System menu](http://i1-news.softpedia-static.com/images/newsrsz/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-3.jpg)][14] [![GNOME 3.24 desktop - Calendar applet](http://i1-news.softpedia-static.com/images/newsrsz/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-4.jpg)][15] [![GNOME 3.24 desktop - Overview mode](http://i1-news.softpedia-static.com/images/newsrsz/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-5.jpg)][16] - --------------------------------------------------------------------------------- - -via: http://news.softpedia.com/news/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml - -作者:[ Marius Nestor ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://news.softpedia.com/editors/browse/marius-nestor -[1]:http://news.softpedia.com/news/here-s-how-to-install-any-linux-operating-system-on-your-chromebook-506212.shtml -[2]:https://goo.gl/fd3zc -[3]:http://news.softpedia.com/editors/browse/marius-nestor -[4]:http://news.softpedia.com/news/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml# -[5]:https://share.flipboard.com/bookmarklet/popout?v=2&title=Chromebook+Dual+Boot+How-to%3A+Ubuntu+17.04+GNOME+and+Chrome+OS&url=http%3A%2F%2Fnews.softpedia.com%2Fnews%2Fhow-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml&t=1498358928&utm_campaign=widgets&utm_medium=web&utm_source=flipit&utm_content=news.softpedia.com -[6]:http://news.softpedia.com/news/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml# -[7]:http://twitter.com/intent/tweet?related=softpedia&via=mariusnestor&text=Chromebook+Dual+Boot+How-to%3A+Ubuntu+17.04+GNOME+and+Chrome+OS&url=http%3A%2F%2Fnews.softpedia.com%2Fnews%2Fhow-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml -[8]:https://plus.google.com/share?url=http://news.softpedia.com/news/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml -[9]:http://news.softpedia.com/newsTag/Ubuntu%2017.04 -[10]:http://news.softpedia.com/newsTag/GNOME%203.24 -[11]:http://news.softpedia.com/newsTag/Chromebook -[12]:http://news.softpedia.com/newsTag/Acer%20Chrombook%2011 -[13]:http://news.softpedia.com/newsTag/Linux -[14]:http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-3.jpg -[15]:http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-4.jpg -[16]:http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-5.jpg -[17]:https://twitter.com/intent/follow?screen_name=mariusnestor -[18]:http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-2.jpg diff --git a/translated/tech/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md b/translated/tech/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md new file mode 100644 index 0000000000..3c1fe4c790 --- /dev/null +++ b/translated/tech/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md @@ -0,0 +1,85 @@ +Chromebook 如何双启动:Ubuntu 17.04 GNOME 和 Chrome OS +============================================================ + + +### 本教程使用著名的 Crouton 安装器 + + +在去年我拿到我的 Acer Chromebook 11 (C740) 时,我写了一篇教程教你们如何[如何移除 Google Chrome OS 并根据你的选择安装一个 GNU/Linux 发行版][1],但是事情变得乏味了。 + +因此几个月之后,我使用了 Google 在网站上提供的恢复镜像重新安装了 Chrome OS,我写入了 USB 并从 Chromebook 启动。最近,我又感到发威了,因此我决定使用 Crouton 在我的 Acer Chromebook 11 (C740) 上安装 Ubuntu。 + +为什么?因为在一次会议中来的一位朋友带了他的笔记本,一台 Dell Chromebook 13, 在上面他运行了 Ubuntu Linux 还有 Chrome OS。看他用快捷键在两个操作系统之间切换很酷,这让我也想这么做。 + +现在有很多教程解释如何安装不同的发行版 Ubuntu、Debian 或者 Kali Linux(这些是当前 Crouton 安装器支持的 GNU/Linux 发行版),但是我想要运行最新的 Ubuntu,此处是 Ubuntu 17.04 (Zesty Zapus),它有 GNOME 3.24 桌面环境。 + +如何启用开发者模式并下载 Crouton + +当我询问我的朋友他在他的 Chromebook 上运行的是什么 Ubuntu 时,回答是 Ubuntu 14.04 LTS (Trusty Tahr),我不得不承认这让我有点失望。我回家后立刻拿出我的 Chromebook 并尝试看看我是否能运行带有桌面环境的 Ubuntu 17.04。 + +我做的第一件事情是将我的 Chromebook 变成开发者模式。为此,你需要关闭你的 Chromebook 并不关闭翻盖,接着同时按住 ESC、Refresh 和 Power 键几秒直到进入恢复模式,这会擦除 Chromebook 上的所有数据。 + +进入开发者模式会花费你分钟,所以耐心点。当准备完成后,你需要登录你的 Google 账户,并设置不同的东西,比如壁纸或者头像之类。现在你进入开发者模式了,在你的 Chromebook 中访问这篇教程并[下载 Crouton][2],它会保存在下载文件夹中。 + +如何使用 Crouton 安装带有 GNOME 3.24 的 Ubuntu 17.04 + +现在打开 Google Chrome 并按下 CTRL+ALT+T 打开 Chrome OS 的终端模拟器,它叫做 crosh。在命令提示符中,输入 “shell” 命令(没有引号),按下回车进入 Linux shell。让我们看看 Crouton 能为我们做什么。 + +这有两个命令(下面列出的),你可以运行它们查看 Crouton 支持的 GNU/Linux 发行版和桌面环境,并且我可以告诉你这有可能安装 Debian 7 “Wheezy”、Debian 8 “Jessie”、Debian 9 “Stretch” 和 Debian Sid、Kali Linux 滚动版还有 Ubuntu 12.04 LTS、Ubuntu 14.04 LTS 和 Ubuntu 16.04 LTS。 + +`sh -e /Downloads/crouton -r list -  _会列出支持发行版_ +sh -e /Downloads/crouton -t list -  _会列出支持的桌面_` + +Crouton 也会列出一系列 Debian、Kali 和 Ubuntu 旧的发行版,它们在上游中止支持了(这些的名字后面都被标记了感叹号),并且因为安全风险你不应该安装它们,还有两个不支持的 Ubuntu 版本,Ubuntu 16.10 和 Ubuntu 17.04。 + +Crouton 开发者说这些“不支持”的 Ubuntu 版本用一些方法可能也可以使用,但是我试了一下并使用下面的命令安装了带有 GNOME 3.24 桌面环境(没有额外的程序)的 Ubuntu 17.04 (Zesty Zapus)。我使用 “-e” 参数来加密安装。 + +`sh -e /Downloads/crouton -e -r zesty -t gnome` + +将所有的都下载下来并安装在 Crouton 在你的 Chromebook 中创建的 chroot 环境中会花费一些时间,因此再说一次,请耐心。当一切完成后,你会知道,并且你能通过在 shell 中运行下面的命令启动 Ubuntu 17.04。 + +`sudo startgnome` + +瞧!我在我的旧 Acer Chromebook 11 (C740) 上运行着带有 GNOME 3.24 桌面环境的 Ubuntu 17.04 (Zesty Zapus),这笔记本 Google 还尚未支持 Android 程序。最棒的部分是我能够使用 CTRL+ALT+Shift+向后/向前键盘快捷键快速在 Chrome OS 和 Ubuntu 17.04 之间切换。 + +作为结尾笔记,我想提醒你注意,由于 Chromebook 现在始终处于开发人员模式,所以当电池电量耗尽、打开或关闭设备时,你会一直看到一个警告,显示 “OS verification is OFF - Press SPACE to re-enable”,当你看到它时,请按 CTRL+D。玩得开心! + +[Ubuntu 17.04][9] +[GNOME 3.24][10] +[Chromebook][11] +[Acer Chrombook 11][12] +[Linux][13] + +### Acer Chrombook 11 上的 Ubuntu 17.04 (4 张图片) + + [![Ubuntu 17.04 with GNOME 3.24 running on Acer Chromebook 11 (C740)](http://i1-news.softpedia-static.com/images/fitted/620x/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-2.jpg)][18] [![GNOME 3.24 desktop - System menu](http://i1-news.softpedia-static.com/images/newsrsz/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-3.jpg)][14] [![GNOME 3.24 desktop - Calendar applet](http://i1-news.softpedia-static.com/images/newsrsz/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-4.jpg)][15] [![GNOME 3.24 desktop - Overview mode](http://i1-news.softpedia-static.com/images/newsrsz/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-5.jpg)][16] + +-------------------------------------------------------------------------------- + +via: http://news.softpedia.com/news/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml + +作者:[ Marius Nestor ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://news.softpedia.com/editors/browse/marius-nestor +[1]:http://news.softpedia.com/news/here-s-how-to-install-any-linux-operating-system-on-your-chromebook-506212.shtml +[2]:https://goo.gl/fd3zc +[3]:http://news.softpedia.com/editors/browse/marius-nestor +[4]:http://news.softpedia.com/news/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml# +[5]:https://share.flipboard.com/bookmarklet/popout?v=2&title=Chromebook+Dual+Boot+How-to%3A+Ubuntu+17.04+GNOME+and+Chrome+OS&url=http%3A%2F%2Fnews.softpedia.com%2Fnews%2Fhow-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml&t=1498358928&utm_campaign=widgets&utm_medium=web&utm_source=flipit&utm_content=news.softpedia.com +[6]:http://news.softpedia.com/news/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml# +[7]:http://twitter.com/intent/tweet?related=softpedia&via=mariusnestor&text=Chromebook+Dual+Boot+How-to%3A+Ubuntu+17.04+GNOME+and+Chrome+OS&url=http%3A%2F%2Fnews.softpedia.com%2Fnews%2Fhow-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml +[8]:https://plus.google.com/share?url=http://news.softpedia.com/news/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml +[9]:http://news.softpedia.com/newsTag/Ubuntu%2017.04 +[10]:http://news.softpedia.com/newsTag/GNOME%203.24 +[11]:http://news.softpedia.com/newsTag/Chromebook +[12]:http://news.softpedia.com/newsTag/Acer%20Chrombook%2011 +[13]:http://news.softpedia.com/newsTag/Linux +[14]:http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-3.jpg +[15]:http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-4.jpg +[16]:http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-5.jpg +[17]:https://twitter.com/intent/follow?screen_name=mariusnestor +[18]:http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-2.jpg From 1dd700d4b630055cdbaa22e558f1e47954bd966d Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 4 Jul 2017 09:17:33 +0800 Subject: [PATCH 0609/1407] translating --- ...70609 Python 3.6 - install latest version into Linux Mint.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170609 Python 3.6 - install latest version into Linux Mint.md b/sources/tech/20170609 Python 3.6 - install latest version into Linux Mint.md index f17be7cd2e..dbe0b12482 100644 --- a/sources/tech/20170609 Python 3.6 - install latest version into Linux Mint.md +++ b/sources/tech/20170609 Python 3.6 - install latest version into Linux Mint.md @@ -1,3 +1,5 @@ +translating---geekpi + Python 3.6 - install latest version into Linux Mint ============================================================ From 55b6287b884ba6731e836e160dd6409b78c1df2b Mon Sep 17 00:00:00 2001 From: GHLandy Date: Tue, 4 Jul 2017 11:54:59 +0800 Subject: [PATCH 0610/1407] [Translating] 20170529 LFCS sed Command.md --- sources/tech/20170529 LFCS sed Command.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170529 LFCS sed Command.md b/sources/tech/20170529 LFCS sed Command.md index acd63d5b12..e281cb09f5 100644 --- a/sources/tech/20170529 LFCS sed Command.md +++ b/sources/tech/20170529 LFCS sed Command.md @@ -1,3 +1,5 @@ +GHLandy Translating + LFCS sed Command ===================== From 605863f3975f7d070f9a3385ca89f3c49fd64208 Mon Sep 17 00:00:00 2001 From: Ezio Date: Tue, 4 Jul 2017 13:23:54 +0800 Subject: [PATCH 0611/1407] =?UTF-8?q?=E7=A7=BB=E5=8A=A8?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20170213 Free as in puppy The hidden costs of free software.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename translated/{ => talk}/20170213 Free as in puppy The hidden costs of free software.md (100%) diff --git a/translated/20170213 Free as in puppy The hidden costs of free software.md b/translated/talk/20170213 Free as in puppy The hidden costs of free software.md similarity index 100% rename from translated/20170213 Free as in puppy The hidden costs of free software.md rename to translated/talk/20170213 Free as in puppy The hidden costs of free software.md From a2b83532791a0613b904fab77942c5422de05c41 Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 5 Jul 2017 08:49:52 +0800 Subject: [PATCH 0612/1407] translated --- ... install latest version into Linux Mint.md | 26 ++++++++----------- 1 file changed, 11 insertions(+), 15 deletions(-) rename {sources => translated}/tech/20170609 Python 3.6 - install latest version into Linux Mint.md (55%) diff --git a/sources/tech/20170609 Python 3.6 - install latest version into Linux Mint.md b/translated/tech/20170609 Python 3.6 - install latest version into Linux Mint.md similarity index 55% rename from sources/tech/20170609 Python 3.6 - install latest version into Linux Mint.md rename to translated/tech/20170609 Python 3.6 - install latest version into Linux Mint.md index dbe0b12482..45529479ba 100644 --- a/sources/tech/20170609 Python 3.6 - install latest version into Linux Mint.md +++ b/translated/tech/20170609 Python 3.6 - install latest version into Linux Mint.md @@ -1,50 +1,46 @@ -translating---geekpi - -Python 3.6 - install latest version into Linux Mint +Python 3.6 - 安装最新的版本到 Linux Mint 中 ============================================================ ![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/1496865727_python-logo.png) -**Python** is one of the most popular programming languages for [Linux][3]. It is written many different tools and libraries. In addition, Python is popular among developers because it is very easy and quick programming, and it's actually simple to master. [][1]If you have installed the operating system [Linux mint][4], you are learning the programming language **Python** and want to work with the latest version, then this article is for you. -Now I have installed [Linux Mint 18][5].1 and the default installed version 2.7 and 3.5\. You can check this with commands +**Python** 是 [Linux][3] 中一种最流行的编程语言。它被写成了不同的工具和库。除此之外,Python 在开发者之间很流行因为它非常简单,并且实际很容易掌握。[][1]如果你安装了[Linux mint][4] 系统,另外你正在学习 **Python** 并想要使用最新的版本,那么这篇文章就是为你而写的。现在我已经安装了 [Linux Mint 18][5]。默认安装的版本是 2.7 和 3.5。你可以用这个命令检查: ``` TerminalShekin@mylinuxmintpc~$python -V python2 -V python3 -V ``` -**Installation latest Python 3.6 version into Linux Mint**: +**安装最新的 Python 3.6 到 Linux 中**: ``` TerminalShekin@mylinuxmintpc~$sudo add-apt-repository ppa:jonathonf/python-3.6 sudo apt update sudo apt install python3.6 ``` -Check the version of the installed Python 3.6 +检查已安装的 Python 3.6 版本 ``` TerminalShekin@mylinuxmintpc~$python3.6 -V ``` -**Please note** that the old version is still here, it still available by the name of **python3**and the new can now be loaded with the command **python3.6**. If you want to use this version instead of the 3.5 to run all the programs, there is a utility **update-alternatives**. But if you try to get a list of possibilities, we get the error: - [![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871711_linux_mint_001.png)][6] This is normal, you need to first setup what files for that answer, because the maintainers did not care about it : +**请注意**旧版本仍然还在,它仍然可以通过 **python3** 可用,新的版本可以通过命令 **python3.6**。如果你想要使用这个版本而不是 3.5 运行所有的程序,这有个工具叫 **update-alternatives**。但是如果你尝试获取可能的列表,我们会得到错误: + [![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871711_linux_mint_001.png)][6] 这是正常的,你首先需要为那个问题设置文件,因为维护者并不关心这个: ``` TerminalShekin@mylinuxmintpc~$sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1 sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2 ``` -Now look again: +现在再次查看: ``` TerminalShekin@mylinuxmintpc~$update-alternatives --list python3 ``` - [![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871720_linux_mint_002.png)][7] Now we can choose the required version and switch as needed. For settings use the config command: + [![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871720_linux_mint_002.png)][7] 现在我们选择需要的版本并按需切换。对于设置使用配置命令: ``` TerminalShekin@mylinuxmintpc~$sudo update-alternatives --config python3 ``` - [![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871722_linux_mint_003.png)][8] In the prompt you need to specify the program number you want to use by default. -Be careful with a selection of versions, not to touch the python (python2), just use python3, as I said, Python 2.7 written in a variety of system tools, and if you try to run them the wrong version of the interpreter, then nothing happens.May the Force be with you, -Good Luck!!! + [![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871722_linux_mint_003.png)][8] 在提示符中,你需要指定默认使用的编号。小心选择一个版本,不要按到 python(python2),只使用 python3,如我所说,Python 2.7 写了不同的系统工具,如果你尝试用错误的解释器版本运行,那么什么都不会发生。愿原力与你同在,好运!!! + [python.org][9] -------------------------------------------------------------------------------- @@ -52,7 +48,7 @@ Good Luck!!! via: https://mintguide.org/other/794-python-3-6-install-latest-version-into-linux-mint.html 作者:[ Shekin][a] -译者:[译者ID](https://github.com/译者ID) +译者:[geekpi](https://github.com/geekpi) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From cd971edc2f51e19cb16148ea96700842217ccc62 Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 5 Jul 2017 08:54:30 +0800 Subject: [PATCH 0613/1407] translating --- .../tech/20170629 4 cool facts you should know about FreeDOS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170629 4 cool facts you should know about FreeDOS.md b/sources/tech/20170629 4 cool facts you should know about FreeDOS.md index 049ca57925..4a630da33c 100644 --- a/sources/tech/20170629 4 cool facts you should know about FreeDOS.md +++ b/sources/tech/20170629 4 cool facts you should know about FreeDOS.md @@ -1,3 +1,5 @@ +translating---geekpi + 4 cool facts you should know about FreeDOS ============================================================ From eceeba19cfed6319e02c9928e3beab3aaba41809 Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 5 Jul 2017 13:07:07 +0800 Subject: [PATCH 0614/1407] PRF&PUB:20170609 Python 3.6 - install latest version into Linux Mint.md @geekpi --- ... install latest version into Linux Mint.md | 81 +++++++++++++++++++ ... install latest version into Linux Mint.md | 66 --------------- 2 files changed, 81 insertions(+), 66 deletions(-) create mode 100644 published/20170609 Python 3.6 - install latest version into Linux Mint.md delete mode 100644 translated/tech/20170609 Python 3.6 - install latest version into Linux Mint.md diff --git a/published/20170609 Python 3.6 - install latest version into Linux Mint.md b/published/20170609 Python 3.6 - install latest version into Linux Mint.md new file mode 100644 index 0000000000..411aadccba --- /dev/null +++ b/published/20170609 Python 3.6 - install latest version into Linux Mint.md @@ -0,0 +1,81 @@ +Linux 上如何安装并切换最新版本的 Python 3.6 +============================================================ + +![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/1496865727_python-logo.png) + +**Python** 是 [Linux][3] 中一种最流行的编程语言。它被写成了各种工具和库。除此之外,Python 在开发者之间很流行因为它非常简单,并且实际很容易掌握。如果你安装了 [Linux mint][4] 系统,正在学习 **Python** 并想要使用最新的版本的话,那么这篇文章就是为你而写的。现在我已经安装好了 [Linux Mint 18][5]。默认安装的版本是 2.7 和 3.5。你可以用这个命令检查: + +``` +$ python -V +$ python2 -V +$ python3 -V +``` + +**安装最新的 Python 3.6 到 Linux 中**: + +``` +$ sudo add-apt-repository ppa:jonathonf/python-3.6 +$ sudo apt update +$ sudo apt install python3.6 +``` + +检查已安装的 Python 3.6 版本 + +``` +$ python3.6 -V +``` + +**请注意**旧版本仍然还在,它仍然可以通过 `python3` 可用,新的版本可以通过命令 `python3.6`。如果你想要默认使用这个版本而不是 3.5 运行所有的程序,这有个工具叫 `update-alternatives`。但是如果你尝试获取可能的列表,我们会得到错误: + +[![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871711_linux_mint_001.png)][6] + +这是正常的,你首先需要为那个问题设置文件,因为维护者没有设置这个: + +``` +$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1 +$ sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2 +``` + +现在再次查看: + +``` +$ update-alternatives --list python3 +``` + +[![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871720_linux_mint_002.png)][7] + +现在我们选择需要的版本并按需切换。对于设置使用配置命令: + +``` +$ sudo update-alternatives --config python3 +``` + +[![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871722_linux_mint_003.png)][8] + +在提示符中,你需要指定默认使用的编号。 + +> 选择版本时要小心,不要去动 python(python2),只使用我说的 python3,Python 2.7 编写了各种系统工具,如果你尝试用错误的解释器版本运行它们,可能就不会工作。 + +愿原力与你同在,好运!!! + +-------------------------------------------------------------------------------- + +via: https://mintguide.org/other/794-python-3-6-install-latest-version-into-linux-mint.html + +作者:[Shekin][a] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://mintguide.org/user/Shekin/ +[1]:http://www.codeweavers.com/?ad=708 +[2]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly93d3cucHl0aG9uLm9yZw%3D%3D +[3]:https://mintguide.org/ +[4]:https://mintguide.org/ +[5]:https://mintguide.org/ +[6]:https://mintguide.org/uploads/posts/2017-06/1496871711_linux_mint_001.png +[7]:https://mintguide.org/uploads/posts/2017-06/1496871720_linux_mint_002.png +[8]:https://mintguide.org/uploads/posts/2017-06/1496871722_linux_mint_003.png +[9]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly93d3cucHl0aG9uLm9yZw%3D%3D +[10]:https://mintguide.org/other/ diff --git a/translated/tech/20170609 Python 3.6 - install latest version into Linux Mint.md b/translated/tech/20170609 Python 3.6 - install latest version into Linux Mint.md deleted file mode 100644 index 45529479ba..0000000000 --- a/translated/tech/20170609 Python 3.6 - install latest version into Linux Mint.md +++ /dev/null @@ -1,66 +0,0 @@ -Python 3.6 - 安装最新的版本到 Linux Mint 中 -============================================================ - - -![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/1496865727_python-logo.png) -**Python** 是 [Linux][3] 中一种最流行的编程语言。它被写成了不同的工具和库。除此之外,Python 在开发者之间很流行因为它非常简单,并且实际很容易掌握。[][1]如果你安装了[Linux mint][4] 系统,另外你正在学习 **Python** 并想要使用最新的版本,那么这篇文章就是为你而写的。现在我已经安装了 [Linux Mint 18][5]。默认安装的版本是 2.7 和 3.5。你可以用这个命令检查: - -``` -TerminalShekin@mylinuxmintpc~$python -V -python2 -V -python3 -V -``` -**安装最新的 Python 3.6 到 Linux 中**: - -``` -TerminalShekin@mylinuxmintpc~$sudo add-apt-repository ppa:jonathonf/python-3.6 -sudo apt update -sudo apt install python3.6 -``` -检查已安装的 Python 3.6 版本 - -``` -TerminalShekin@mylinuxmintpc~$python3.6 -V -``` -**请注意**旧版本仍然还在,它仍然可以通过 **python3** 可用,新的版本可以通过命令 **python3.6**。如果你想要使用这个版本而不是 3.5 运行所有的程序,这有个工具叫 **update-alternatives**。但是如果你尝试获取可能的列表,我们会得到错误: - [![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871711_linux_mint_001.png)][6] 这是正常的,你首先需要为那个问题设置文件,因为维护者并不关心这个: - -``` -TerminalShekin@mylinuxmintpc~$sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.5 1 -sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.6 2 -``` -现在再次查看: - -``` -TerminalShekin@mylinuxmintpc~$update-alternatives --list python3 -``` - [![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871720_linux_mint_002.png)][7] 现在我们选择需要的版本并按需切换。对于设置使用配置命令: - -``` -TerminalShekin@mylinuxmintpc~$sudo update-alternatives --config python3 -``` - [![Python 3.6 - install latest version into Linux Mint](https://mintguide.org/uploads/posts/2017-06/thumbs/1496871722_linux_mint_003.png)][8] 在提示符中,你需要指定默认使用的编号。小心选择一个版本,不要按到 python(python2),只使用 python3,如我所说,Python 2.7 写了不同的系统工具,如果你尝试用错误的解释器版本运行,那么什么都不会发生。愿原力与你同在,好运!!! - -[python.org][9] - --------------------------------------------------------------------------------- - -via: https://mintguide.org/other/794-python-3-6-install-latest-version-into-linux-mint.html - -作者:[ Shekin][a] -译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://mintguide.org/user/Shekin/ -[1]:http://www.codeweavers.com/?ad=708 -[2]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly93d3cucHl0aG9uLm9yZw%3D%3D -[3]:https://mintguide.org/ -[4]:https://mintguide.org/ -[5]:https://mintguide.org/ -[6]:https://mintguide.org/uploads/posts/2017-06/1496871711_linux_mint_001.png -[7]:https://mintguide.org/uploads/posts/2017-06/1496871720_linux_mint_002.png -[8]:https://mintguide.org/uploads/posts/2017-06/1496871722_linux_mint_003.png -[9]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly93d3cucHl0aG9uLm9yZw%3D%3D -[10]:https://mintguide.org/other/ From 85ed8d8c449f98fb294d5ca7f86aadd24d436390 Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 5 Jul 2017 13:26:05 +0800 Subject: [PATCH 0615/1407] PRF&PUB:20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md @geekpi --- ...How-to Ubuntu 17.04 GNOME and Chrome OS.md | 60 ++++++++++--------- 1 file changed, 32 insertions(+), 28 deletions(-) rename {translated/tech => published}/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md (58%) diff --git a/translated/tech/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md b/published/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md similarity index 58% rename from translated/tech/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md rename to published/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md index 3c1fe4c790..f3b5ba45af 100644 --- a/translated/tech/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md +++ b/published/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md @@ -2,65 +2,69 @@ Chromebook 如何双启动:Ubuntu 17.04 GNOME 和 Chrome OS ============================================================ -### 本教程使用著名的 Crouton 安装器 +> 本教程使用著名的 Crouton 安装器 +![Ubuntu 17.04 with GNOME 3.24 running on Acer Chromebook 11 (C740)](http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-2.jpg) -在去年我拿到我的 Acer Chromebook 11 (C740) 时,我写了一篇教程教你们如何[如何移除 Google Chrome OS 并根据你的选择安装一个 GNU/Linux 发行版][1],但是事情变得乏味了。 +在去年我拿到我的 Acer Chromebook 11 (C740) 时,我写了一篇教程教你们如何[如何移除 Google Chrome OS 并根据你的选择安装一个 GNU/Linux 发行版][1],但是很快我觉得没意思了。 -因此几个月之后,我使用了 Google 在网站上提供的恢复镜像重新安装了 Chrome OS,我写入了 USB 并从 Chromebook 启动。最近,我又感到发威了,因此我决定使用 Crouton 在我的 Acer Chromebook 11 (C740) 上安装 Ubuntu。 +因此几个月之后,我使用了 Google 在网站上提供的恢复镜像重新安装了 Chrome OS,我写入了 USB 并从 Chromebook 启动。最近,我又感到无聊了,因此我决定使用 Crouton 在我的 Acer Chromebook 11 (C740) 上安装 Ubuntu。 -为什么?因为在一次会议中来的一位朋友带了他的笔记本,一台 Dell Chromebook 13, 在上面他运行了 Ubuntu Linux 还有 Chrome OS。看他用快捷键在两个操作系统之间切换很酷,这让我也想这么做。 +为什么?因为在一次会议中来的一位朋友带了他的笔记本,一台 Dell Chromebook 13,在上面他运行了 Ubuntu Linux 还有 Chrome OS。看他用快捷键在两个操作系统之间切换很酷,这让我也想这么做。 -现在有很多教程解释如何安装不同的发行版 Ubuntu、Debian 或者 Kali Linux(这些是当前 Crouton 安装器支持的 GNU/Linux 发行版),但是我想要运行最新的 Ubuntu,此处是 Ubuntu 17.04 (Zesty Zapus),它有 GNOME 3.24 桌面环境。 +现在有很多教程解释如何安装不同的发行版 Ubuntu、Debian 或者 Kali Linux(这些是当前 Crouton 安装器支持的 GNU/Linux 发行版),但是我想要运行最新的 Ubuntu,当前是 Ubuntu 17.04 (Zesty Zapus),它有 GNOME 3.24 桌面环境。 -如何启用开发者模式并下载 Crouton +### 如何启用开发者模式并下载 Crouton 当我询问我的朋友他在他的 Chromebook 上运行的是什么 Ubuntu 时,回答是 Ubuntu 14.04 LTS (Trusty Tahr),我不得不承认这让我有点失望。我回家后立刻拿出我的 Chromebook 并尝试看看我是否能运行带有桌面环境的 Ubuntu 17.04。 -我做的第一件事情是将我的 Chromebook 变成开发者模式。为此,你需要关闭你的 Chromebook 并不关闭翻盖,接着同时按住 ESC、Refresh 和 Power 键几秒直到进入恢复模式,这会擦除 Chromebook 上的所有数据。 +我做的第一件事情是将我的 Chromebook 变成开发者模式。为此,你需要关闭你的 Chromebook 但不关闭翻盖,接着同时按住 `ESC`、`Refresh` 和 `Power` 键几秒直到进入恢复模式,这会擦除 Chromebook 上的所有数据。 -进入开发者模式会花费你分钟,所以耐心点。当准备完成后,你需要登录你的 Google 账户,并设置不同的东西,比如壁纸或者头像之类。现在你进入开发者模式了,在你的 Chromebook 中访问这篇教程并[下载 Crouton][2],它会保存在下载文件夹中。 +进入开发者模式会花费你几分钟,所以耐心点。当准备完成后,你需要登录你的 Google 账户,并设置各种东西,比如壁纸或者头像之类。现在你进入开发者模式了,在你的 Chromebook 中访问这篇教程并[下载 Crouton][2],它会保存在下载文件夹中。 -如何使用 Crouton 安装带有 GNOME 3.24 的 Ubuntu 17.04 +### 如何使用 Crouton 安装带有 GNOME 3.24 的 Ubuntu 17.04 -现在打开 Google Chrome 并按下 CTRL+ALT+T 打开 Chrome OS 的终端模拟器,它叫做 crosh。在命令提示符中,输入 “shell” 命令(没有引号),按下回车进入 Linux shell。让我们看看 Crouton 能为我们做什么。 +现在打开 Google Chrome 并按下 `CTRL+ALT+T` 打开 Chrome OS 的终端模拟器,它叫做 crosh。在命令提示符中,输入 `shell` 命令,按下回车进入 Linux shell。让我们看看 Crouton 能为我们做什么。 -这有两个命令(下面列出的),你可以运行它们查看 Crouton 支持的 GNU/Linux 发行版和桌面环境,并且我可以告诉你这有可能安装 Debian 7 “Wheezy”、Debian 8 “Jessie”、Debian 9 “Stretch” 和 Debian Sid、Kali Linux 滚动版还有 Ubuntu 12.04 LTS、Ubuntu 14.04 LTS 和 Ubuntu 16.04 LTS。 +这有两个命令(下面列出的),你可以运行它们查看 Crouton 支持的 GNU/Linux 发行版和桌面环境,并且我可以告诉你这可以安装 Debian 7 “Wheezy”、Debian 8 “Jessie”、Debian 9 “Stretch” 和 Debian Sid、Kali Linux 滚动版还有 Ubuntu 12.04 LTS、Ubuntu 14.04 LTS 和 Ubuntu 16.04 LTS 等等。 -`sh -e /Downloads/crouton -r list -  _会列出支持发行版_ -sh -e /Downloads/crouton -t list -  _会列出支持的桌面_` +``` +sh -e /Downloads/crouton -r list -  ### 会列出支持的发行版 +sh -e /Downloads/crouton -t list -  ### 会列出支持的桌面 +``` -Crouton 也会列出一系列 Debian、Kali 和 Ubuntu 旧的发行版,它们在上游中止支持了(这些的名字后面都被标记了感叹号),并且因为安全风险你不应该安装它们,还有两个不支持的 Ubuntu 版本,Ubuntu 16.10 和 Ubuntu 17.04。 +Crouton 也会列出一系列 Debian、Kali 和 Ubuntu 的旧发行版,但它们在上游被中止支持了(这些的名字后面都被标记了感叹号),并且因为安全风险你不应该安装它们,还有两个尚未支持的 Ubuntu 版本,Ubuntu 16.10 和 Ubuntu 17.04。 -Crouton 开发者说这些“不支持”的 Ubuntu 版本用一些方法可能也可以使用,但是我试了一下并使用下面的命令安装了带有 GNOME 3.24 桌面环境(没有额外的程序)的 Ubuntu 17.04 (Zesty Zapus)。我使用 “-e” 参数来加密安装。 +Crouton 开发者说这些“不支持”的 Ubuntu 版本用一些方法可能也可以使用,但是我试了一下并使用下面的命令安装了带有 GNOME 3.24 桌面环境(没有额外的应用)的 Ubuntu 17.04 (Zesty Zapus)。我使用 `-e` 参数来加密安装。 -`sh -e /Downloads/crouton -e -r zesty -t gnome` +``` +sh -e /Downloads/crouton -e -r zesty -t gnome +``` 将所有的都下载下来并安装在 Crouton 在你的 Chromebook 中创建的 chroot 环境中会花费一些时间,因此再说一次,请耐心。当一切完成后,你会知道,并且你能通过在 shell 中运行下面的命令启动 Ubuntu 17.04。 -`sudo startgnome` +``` +sudo startgnome +``` -瞧!我在我的旧 Acer Chromebook 11 (C740) 上运行着带有 GNOME 3.24 桌面环境的 Ubuntu 17.04 (Zesty Zapus),这笔记本 Google 还尚未支持 Android 程序。最棒的部分是我能够使用 CTRL+ALT+Shift+向后/向前键盘快捷键快速在 Chrome OS 和 Ubuntu 17.04 之间切换。 +瞧!我在我的旧 Acer Chromebook 11 (C740) 上运行着带有 GNOME 3.24 桌面环境的 Ubuntu 17.04 (Zesty Zapus),这笔记本 Google 还尚未支持 Android 程序。最棒的部分是我能够使用 `CTRL+ALT+Shift`+`Back`/`Forward` 键盘快捷键快速在 Chrome OS 和 Ubuntu 17.04 之间切换。 -作为结尾笔记,我想提醒你注意,由于 Chromebook 现在始终处于开发人员模式,所以当电池电量耗尽、打开或关闭设备时,你会一直看到一个警告,显示 “OS verification is OFF - Press SPACE to re-enable”,当你看到它时,请按 CTRL+D。玩得开心! +![GNOME 3.24 desktop - System menu](http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-3.jpg) -[Ubuntu 17.04][9] -[GNOME 3.24][10] -[Chromebook][11] -[Acer Chrombook 11][12] -[Linux][13] +作为这篇笔记的结尾,我想提醒你注意,由于 Chromebook 现在始终处于开发人员模式,所以当电池电量耗尽、打开或关闭设备时,你会一直看到一个警告,显示 “OS verification is OFF - Press SPACE to re-enable”,当你看到它时,请按 `CTRL+D`。玩得开心! -### Acer Chrombook 11 上的 Ubuntu 17.04 (4 张图片) +![GNOME 3.24 desktop - Calendar applet](http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-4.jpg) + +![GNOME 3.24 desktop - Overview mode](http://i1-news.softpedia-static.com/images/news2/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-5.jpg) - [![Ubuntu 17.04 with GNOME 3.24 running on Acer Chromebook 11 (C740)](http://i1-news.softpedia-static.com/images/fitted/620x/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-2.jpg)][18] [![GNOME 3.24 desktop - System menu](http://i1-news.softpedia-static.com/images/newsrsz/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-3.jpg)][14] [![GNOME 3.24 desktop - Calendar applet](http://i1-news.softpedia-static.com/images/newsrsz/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-4.jpg)][15] [![GNOME 3.24 desktop - Overview mode](http://i1-news.softpedia-static.com/images/newsrsz/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624-5.jpg)][16] -------------------------------------------------------------------------------- via: http://news.softpedia.com/news/how-to-install-ubuntu-17-04-with-gnome-on-your-chromebook-alongside-chrome-os-516624.shtml -作者:[ Marius Nestor ][a] +作者:[Marius Nestor][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/) 荣誉推出 From 1ffbbb6f4ffc855167b5a65bf55a0848e47cb01f Mon Sep 17 00:00:00 2001 From: runningwater Date: Wed, 5 Jul 2017 14:37:41 +0800 Subject: [PATCH 0616/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20170622 A users guide to links in the Linux filesystem.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sources/tech/20170622 A users guide to links in the Linux filesystem.md b/sources/tech/20170622 A users guide to links in the Linux filesystem.md index 488557c2e7..c2503313a2 100644 --- a/sources/tech/20170622 A users guide to links in the Linux filesystem.md +++ b/sources/tech/20170622 A users guide to links in the Linux filesystem.md @@ -1,3 +1,4 @@ +(翻译中 by runningwater) A user's guide to links in the Linux filesystem ============================================================ @@ -285,7 +286,7 @@ David Both - David Both is a Linux and Open Source advocate who resides in Ralei via: https://opensource.com/article/17/6/linking-linux-filesystem 作者:[David Both ][a] -译者:[译者ID](https://github.com/译者ID) +译者:[runningwater](https://github.com/runningwater) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From c06602c26c5593656d3ebe717187268cd25cd893 Mon Sep 17 00:00:00 2001 From: toutoudnf Date: Wed, 5 Jul 2017 19:33:10 +0800 Subject: [PATCH 0617/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sources/tech/20170310 A public cloud migration in 22 days.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170310 A public cloud migration in 22 days.md b/sources/tech/20170310 A public cloud migration in 22 days.md index 5029bba8b5..a69a75cc93 100644 --- a/sources/tech/20170310 A public cloud migration in 22 days.md +++ b/sources/tech/20170310 A public cloud migration in 22 days.md @@ -1,3 +1,4 @@ +【toutoudnf 翻译中】 A public cloud migration in 22 days ============================================================ From 87ff82dd6b26f16f4e6ed6e68a3c7b4234b63f43 Mon Sep 17 00:00:00 2001 From: sanfusu Date: Wed, 5 Jul 2017 19:37:25 +0800 Subject: [PATCH 0618/1407] Translating by sanfusu --- sources/tech/20160325 Network automation with Ansible.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20160325 Network automation with Ansible.md b/sources/tech/20160325 Network automation with Ansible.md index 0f543a3c18..40037679f5 100644 --- a/sources/tech/20160325 Network automation with Ansible.md +++ b/sources/tech/20160325 Network automation with Ansible.md @@ -1,3 +1,5 @@ +Translating by sanfusu + Network automation with Ansible ================ From 9a5eb81488ce82d65eba7297d5847c19af347aa0 Mon Sep 17 00:00:00 2001 From: Jinwen Zhang Date: Thu, 6 Jul 2017 00:31:48 +0800 Subject: [PATCH 0619/1407] wcnnbdk1 translated 20170621 How To kill An Inactive OR Idle SSH Sessions.md --- ...o kill An Inactive OR Idle SSH Sessions.md | 124 ------------------ ...o kill An Inactive OR Idle SSH Sessions.md | 123 +++++++++++++++++ 2 files changed, 123 insertions(+), 124 deletions(-) delete mode 100644 sources/tech/20170621 How To kill An Inactive OR Idle SSH Sessions.md create mode 100644 translated/tech/20170621 How To kill An Inactive OR Idle SSH Sessions.md diff --git a/sources/tech/20170621 How To kill An Inactive OR Idle SSH Sessions.md b/sources/tech/20170621 How To kill An Inactive OR Idle SSH Sessions.md deleted file mode 100644 index 8409b66ac0..0000000000 --- a/sources/tech/20170621 How To kill An Inactive OR Idle SSH Sessions.md +++ /dev/null @@ -1,124 +0,0 @@ -wcnnbdk1 translating -How To kill An Inactive OR Idle SSH Sessions -============================================================ - -BY [MAGESH MARUTHAMUTHU][1] · PUBLISHED : JUNE 21, 2017 || LAST UPDATED: JUNE 21, 2017 - -Let’s imagine that you are working in server through ssh, for some reason your session get disconnected like, internet issue or power failure or your Local PC get rebooted, etc,. - -You may or mayn’t login to the server again to work but you have left the previous ssh session with out closing. - -How to Kill an inactive ssh sessions ? Identify the Inactive or Idle ssh sessions with help of `w` command, then get the idle session PID by issuing `pstree` command, finally kill the sessions using `kill` command. - -Suggested Read : [SSH Related Articles][2] - -Suggested Read : [Mosh (Mobile Shell) – Best Alternative for SSH to Connect Remote System][3] - -#### How to Identify Inactive or Idle SSH Sessions - -Login to the system and check how many user’s are currently logged in by issuing `w` command. If you identified your own session then note the Inactive or Idle ssh sessions to kill. - -In my scenario, I can see two users are currently logged in, one is my new ssh session which am currently running `w` command and another one for my idle session. - -``` -# w - 10:36:39 up 26 days, 20:29, 2 users, load average: 0.00, 0.02, 0.00 -USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT -root pts/0 219.91.219.14 10:34 28.00s 0.00s 0.00s -bash -root pts/2 219.91.219.14 10:36 0.00s 0.00s 0.00s w -``` - -#### How to Get a SSH Session PID - -To kill idle ssh session, we need a parent `PID` of the idle session. To get a parent pid, run the `pstree` command to see a tree diagram of all the processes. - -You also get the similar kind of output like below. The pstree command output is much bigger so, i removed many things from the file for better understanding. - -``` -# pstree -p -init(1)-+-abrtd(2131) - |-acpid(1958) - |-httpd(32413)-+-httpd(32442) - | - |-mingetty(2198) - |-mysqld_safe(24298)---mysqld(24376)-+-{mysqld}(24378) - | - |-php(32456)-+-php(32457) - | - |-sshd(2023)-+-sshd(10132)---bash(10136) - | `-sshd(10199)---bash(10208)---pstree(10226) - |-udevd(774)-+-udevd(2191) - `-udevd(27282) -``` - -From the above output, you can see the tree of sshd processes and branch’s. The main sshd process is `sshd(2023)` and two branch’s, `sshd(10132)` and `sshd(10199)`. - -As i told in the beginning of the article, one is my new session `sshd(10199)` because it shows the `pstree` command which is currently running by me, so the idle session is another one `sshd(10132)`. - -Suggested Read : [How to Access Secure Shell (SSH) Servers Through Standard Web Browsers][4] - -Suggested Read : [PSSH – Execute Commands on Multiple Linux Servers in Parallel][5] - -#### How to kill Idle SSH Sessions - -We got all the information about idle session. Now, i’m going to kill the idle session, using the `kill` command. Make sure you have replace your PID instead of us. - -``` - -# kill -9 10132 -``` - -#### Recheck whether the idle session get killed or not - -Again use `w` command to recheck whether the idle session get killed or not. Yes, it’s not there because i can see only one session which is owned by me. - -``` -# w - 10:40:18 up 26 days, 20:33, 1 user, load average: 0.11, 0.04, 0.01 -USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT -root pts/2 219.91.219.14 10:36 0.00s 0.00s 0.00s w -``` - -Suggested Read : [rtop – A Nifty Tool to Monitor Remote Server Over SSH][6] - -Suggested Read : [DSH – Run/Execute Shell Commands On Multiple Linux Servers At Once][7] - -#### Recheck with pstree Command - -Recheck once again with `pstree` command to double confirm it. Yes, only one ssh session is live which is owned by me. - -``` -# pstree -p -init(1)-+-abrtd(2131) - |-acpid(1958) - | - |-httpd(32413)-+-httpd(32442) - | - |-mingetty(2198) - |-mysqld_safe(24298)---mysqld(24376)-+-{mysqld}(24378) - | - |-php(32456)-+-php(32457) - | - |-sshd(2023)---sshd(10199)---bash(10208)---pstree(10431) - |-udevd(774)-+-udevd(2191) - `-udevd(27282) -``` - --------------------------------------------------------------------------------- - -via: http://www.2daygeek.com/kill-inactive-idle-ssh-sessions/ - -作者:[ Magesh Maruthamuthu][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.2daygeek.com/author/magesh/ -[1]:http://www.2daygeek.com/author/magesh/ -[2]:http://www.2daygeek.com/category/ssh-tutorials/ -[3]:http://www.2daygeek.com/install-mosh-shell-ssh-client-in-linux-to-connect-remote-system/ -[4]:http://www.2daygeek.com/shellinabox-web-based-ssh-terminal-to-access-remote-linux-servers/ -[5]:http://www.2daygeek.com/pssh-parallel-ssh-run-execute-commands-on-multiple-linux-servers/ -[6]:http://www.2daygeek.com/rtop-monitor-remote-linux-server-over-ssh/ -[7]:http://www.2daygeek.com/dsh-run-execute-shell-commands-on-multiple-linux-servers-at-once/ diff --git a/translated/tech/20170621 How To kill An Inactive OR Idle SSH Sessions.md b/translated/tech/20170621 How To kill An Inactive OR Idle SSH Sessions.md new file mode 100644 index 0000000000..385ca06b25 --- /dev/null +++ b/translated/tech/20170621 How To kill An Inactive OR Idle SSH Sessions.md @@ -0,0 +1,123 @@ +如何关闭一个不活动的或者是空闲的 SSH 会话 +============================================================ + +作者 [MAGESH MARUTHAMUTHU][1] . 发布时间:2017年6月21日 || 最后更新:2017年6月21日 + +让我们来想像一下,当你通过 ssh 在服务器上工作时,由于网络、电源或者是本地 PC 重启等原因导致你断开你的连接会话。 + +你可能会再次登录服务器继续工作也可能不会但是你始终会留下之前没有关闭的 ssh 会话。 + +如何关闭一个不活动的 ssh 会话?首先使用 `w` 命令来识别出不活动或者是空闲的 ssh 会话,接着使用 `pstree` 命令来获取空闲会话的 PID,最后就是使用 `kill` 命令来关闭会话了。 + +建议阅读:[SSH 相关文章][2] + +建议阅读:[Mosh(Mobile Shell)- 最好的SSH 远程连接替代选项][3] + +#### 如何识别不活动的或者是空闲的 SSH 会话 + +登录系统通过 `w` 命令来查看当前有多少用户登录着。如果你识别出了自己的会话连接就可以记下其它不活动或者是空闲的 ssh 会话去关闭。 + +在我当前的例子中,能看见两个用户登录着,其中一个是我当前在执行 `w` 命令的 ssh 会话另一个就是之前的空闲会话了。 + +``` +# w + 10:36:39 up 26 days, 20:29, 2 users, load average: 0.00, 0.02, 0.00 +USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT +root pts/0 219.91.219.14 10:34 28.00s 0.00s 0.00s -bash +root pts/2 219.91.219.14 10:36 0.00s 0.00s 0.00s w +``` + +#### 如何获取 SSH 会话的 PID + +为了关闭空闲的 ssh 会话,我们需要空闲会话进程的父进程的 `PID`。(这里介绍另一个工具 pkill,使用 pkill -t pts/0 -kill 就可以关闭会话, debian8下可用,有些版本似乎需要更改-kill的位置)我们可以执行 `pstree` 命令来查看包括了所有进程的树状图,以便获取父进程的 pid。 + +你会获得与下方示例中相似的输出。pstree 命令的输出会比这个大得多,为了更好的理解我删去了许多不相关的内容。 + +``` +# pstree -p +init(1)-+-abrtd(2131) + |-acpid(1958) + |-httpd(32413)-+-httpd(32442) + | + |-mingetty(2198) + |-mysqld_safe(24298)---mysqld(24376)-+-{mysqld}(24378) + | + |-php(32456)-+-php(32457) + | + |-sshd(2023)-+-sshd(10132)---bash(10136) + | `-sshd(10199)---bash(10208)---pstree(10226) + |-udevd(774)-+-udevd(2191) + `-udevd(27282) +``` + +从上方的输出中,你可以看到 sshd 进程与分支的树形图。sshd 的主进程是 `sshd(2023)`,另两个分支分别为 `sshd(10132)` 和 `sshd(10199)`。 + +跟我在文章开始讲的相同,其中一个是我新的会话连接 `sshd(10199)` 它展示了我正在执行的 `pstree` 命令,因此空闲会话是另一个进程为 `sshd(10132)`。 + +建议阅读:[如何通过标准的网页浏览器来接入 Secure Shell (SSH) 服务器][4] + +建议阅读:[PSSH - 在多台 Linux 服务器上并行的执行命令][5] + +#### 如何关闭空闲 SSH 会话 + +我们已经获得了有关空闲会话的所有信息。那么,就让我们来使用 `kill` 命令来关闭空闲会话。请确认你将下方的 PID 替换成了你服务器上的空闲会话 PID。 + +``` + +# kill -9 10132 +``` + +#### 再次查看空闲会话是否已经被关闭 + +再次使用 `w` 命令来查看空闲会话是否已经被关闭。没错,只有那个我自己的当前会话还在,因此那个空闲会话已经被关闭了。 + +``` +# w + 10:40:18 up 26 days, 20:33, 1 user, load average: 0.11, 0.04, 0.01 +USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT +root pts/2 219.91.219.14 10:36 0.00s 0.00s 0.00s w +``` + +建议阅读:[rtop - 一个好用的通过 SSH 来监控远程服务器的工具][6] + +建议阅读:[DSH - 同时在多台 Linux 服务器上执行命令][7] + +#### 再次使用 pstree 命令检查 + +再次使用 `pstree` 命令确认。是的,只有那个我自己的 ssh 会话还在。 + +``` +# pstree -p +init(1)-+-abrtd(2131) + |-acpid(1958) + | + |-httpd(32413)-+-httpd(32442) + | + |-mingetty(2198) + |-mysqld_safe(24298)---mysqld(24376)-+-{mysqld}(24378) + | + |-php(32456)-+-php(32457) + | + |-sshd(2023)---sshd(10199)---bash(10208)---pstree(10431) + |-udevd(774)-+-udevd(2191) + `-udevd(27282) +``` + +-------------------------------------------------------------------------------- + +via: http://www.2daygeek.com/kill-inactive-idle-ssh-sessions/ + +作者:[ Magesh Maruthamuthu][a] +译者:[wcnnbdk1](https://github.com/wcnnbdk1) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.2daygeek.com/author/magesh/ +[1]:http://www.2daygeek.com/author/magesh/ +[2]:http://www.2daygeek.com/category/ssh-tutorials/ +[3]:http://www.2daygeek.com/install-mosh-shell-ssh-client-in-linux-to-connect-remote-system/ +[4]:http://www.2daygeek.com/shellinabox-web-based-ssh-terminal-to-access-remote-linux-servers/ +[5]:http://www.2daygeek.com/pssh-parallel-ssh-run-execute-commands-on-multiple-linux-servers/ +[6]:http://www.2daygeek.com/rtop-monitor-remote-linux-server-over-ssh/ +[7]:http://www.2daygeek.com/dsh-run-execute-shell-commands-on-multiple-linux-servers-at-once/ From 59162e6f6cf444f5fc4c6ffccfe69bac26bf3641 Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 6 Jul 2017 08:56:57 +0800 Subject: [PATCH 0620/1407] translated --- ...ool facts you should know about FreeDOS.md | 72 ------------------- ...ool facts you should know about FreeDOS.md | 70 ++++++++++++++++++ 2 files changed, 70 insertions(+), 72 deletions(-) delete mode 100644 sources/tech/20170629 4 cool facts you should know about FreeDOS.md create mode 100644 translated/tech/20170629 4 cool facts you should know about FreeDOS.md diff --git a/sources/tech/20170629 4 cool facts you should know about FreeDOS.md b/sources/tech/20170629 4 cool facts you should know about FreeDOS.md deleted file mode 100644 index 4a630da33c..0000000000 --- a/sources/tech/20170629 4 cool facts you should know about FreeDOS.md +++ /dev/null @@ -1,72 +0,0 @@ -translating---geekpi - -4 cool facts you should know about FreeDOS -============================================================ - -### 23 years later, FreeDOS is in active development and edges out MS-DOS's lifespan by a few years. - - -![4 cool facts you should know about FreeDOS ](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/wings_freedos_game.jpg?itok=3O_GB-7o "4 cool facts you should know about FreeDOS ") ->Image credits : FreeDOS - -In the early 1990s, I was a DOS "power user." I used DOS for everything and even wrote my own tools to extend the DOS command line. Sure, we had Microsoft Windows, but if you remember what computing looked like at the time, Windows 3.1 was not that great. I preferred working in DOS. - -You might understand that I was a little confused and upset in 1994 when Microsoft announced (via interviews in tech magazines) that the next version of Windows would do away with MS-DOS. I thought, "If Windows 3.2 or 4.0 looks anything like Windows 3.1, I want nothing to do with that." I looked around for options and decided that if DOS was going to continue, someone would have to create a DOS that everyone could use when MS-DOS went away. - -So it was on June 29, 1994, that I wrote a message to a Usenet discussion group, announcing a new "free DOS" project: - -> A few months ago, I posted articles relating to starting a public domain version of DOS. The general support for this at the time was strong, and many people agreed with the statement, "start writing!" -> -> So, I have... -> -> Announcing the first effort to produce a PD-DOS. I have written up a "manifest" describing the goals of such a project and an outline of the work, as well as a "task list" that shows exactly what needs to be written. I'll post those here, and let discussion follow. - -Today, it's 23 years later, and [FreeDOS][3] is still going strong! - -We continue to make new releases with new functionality and features. Our FreeDOS 1.2 distribution, released on December 25, 2016, is a testament to how many people enjoy using and working on FreeDOS. As I look back over our history, there's a short list of cool facts about FreeDOS you should know: - -### Software development right out of the box - -With the original DOS, it was difficult to do any coding. DOS provided a simple BASIC interpreter, and some people could do neat things with DEBUG, but you couldn’t really do much programming in DOS. With FreeDOS, there are a bunch of different tools to do software development: compilers, assemblers, debuggers, interpreters, and scripting. After you install FreeDOS, you can immediately start writing code in C, Assembly, Pascal, Perl, and several other languages. - -### Browse the web - -DOS is an old system and the original didn't support networking out of the box. Typically, you had to install device drivers for your hardware to connect to a network, which was usually a simple network like IPX. Few systems supported TCP/IP. - -With FreeDOS, not only do we include a TCP/IP networking stack, we include tools and programs that let you browse the web. Use Dillo for a graphical web browser experience, or Lynx to view the web as formatted plain text. If you just want to grab the HTML code and manipulate it yourself, use Wget or Curl. - -### Play great DOS games - -We know that many people install FreeDOS today to play the classic DOS games, run legacy business applications, or do embedded development. A lot of those people use FreeDOS just to play games, and that’s cool with us. Just because a game is old doesn’t mean it's boring. DOS had a lot of great games! Install your favorite classic game and have fun. - -Because so many people use FreeDOS to play games, we now include a variety of DOS games. The FreeDOS 1.2 distribution includes first-person shooters like FreeDOOM, arcade shooters like Kiloblaster, flight simulators like Vertigo, and others. We aimed to include something for everyone. - -### FreeDOS has now been around longer than MS-DOS - -Microsoft released MS-DOS 1.0 in August 1981\. And thirteen years later, Microsoft effectively deprecated MS-DOS with the release of Windows 95 in August 1995, although MS-DOS was still around in some form until September 2000\. In total, MS-DOS was a thing for nineteen years. - -We announced FreeDOS in June 1994 and made our first Alpha release in September that same year. So FreeDOS has been around for 23 years, edging out Microsoft’s MS-DOS by a few years. Truly, we've been working on FreeDOS for longer than MS-DOS was a thing. FreeDOS has staying power. - -Another important way that FreeDOS is different from other versions of DOS is that  _it is still being developed_ . We have an active developer community and are always looking for new people to help out. Join the community and help build the next version of FreeDOS. - --------------------------------------------------------------------------------- - -作者简介: - -Jim Hall - I am the founder and coordinator of the FreeDOS Project. I also serve as a director on the GNOME Foundation Board of Directors. At work, I am the Chief Information Officer for Ramsey County, Minnesota. In my spare time, I contribute to usability in open source software, and mentor usability testing in GNOME via Outreachy (formerly the GNOME Outreach Program for Women). - --------- - -via: https://opensource.com/article/17/6/freedos-still-cool-today - -作者:[Jim Hall][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/jim-hall -[1]:https://opensource.com/article/17/6/freedos-still-cool-today?rate=_5nJLfJhQp2bzfmjkORKyU-H0g8T3mzl7gPCymnb_y0 -[2]:https://opensource.com/user/126046/feed -[3]:https://opensource.com/article/17/6/www.freedos.org -[4]:https://opensource.com/users/jim-hall diff --git a/translated/tech/20170629 4 cool facts you should know about FreeDOS.md b/translated/tech/20170629 4 cool facts you should know about FreeDOS.md new file mode 100644 index 0000000000..134fb0075d --- /dev/null +++ b/translated/tech/20170629 4 cool facts you should know about FreeDOS.md @@ -0,0 +1,70 @@ +你应该知道的 4 个很酷的关于 FreeDOS 的事实 +============================================================ + +### 23 年后,FreeDOS 正在积极开发,并将 MS-DOS 的声明延长了几年 + + +![4 cool facts you should know about FreeDOS ](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/wings_freedos_game.jpg?itok=3O_GB-7o "4 cool facts you should know about FreeDOS ") +>图片版权: FreeDOS + +在 90 年代早期,我是一位 DOS 的 “资深用户”。我用 DOS 做任何事,甚至写我自己的工具来扩展 DOS 命令行。当然,我们有 Microsoft Windows,但是如果你还记得当时的计算机,Windows 3.1 并不是那么好。我更喜欢在 DOS 中工作。 + +你可能会明白,在 1994 年,当微软(通过科技杂志的采访)宣布下一个版本的 Windows 将会取消 MS-DOS 时,我感到有些困惑和不安。我想:“如果 Windows 3.2 或 4.0 看起来像 Windows 3.1,我不想用它了。” 我四处选择,并决定如果 DOS 会继续下去,那么会有人创建一个 DOS,在 MS-DOS 消失的时候,每个人都可以使用。 + +因此在 1994 年 6 月 29 日,我在 Usenet 讨论组谢了一个信息,宣布了新的 “free DOS” 项目: + +> 几个月前,我发表了一篇关于启动公共版本 DOS 的文章。当时对此的普遍支持是很强的,并且很多人同意这个声明,“开始写!” +> +> 所以,我已经。。。 +> +> 宣布首次尝试制作 PD-DOS。我写了一份描述这样一个项目的目标和工作纲要的“清单”,以及一份“任务清单”,展示了需要写些什么。我会在这里发贴,让我们进行讨论。 + +今天,已经 23 年之后了,[FreeDOS][3] 还变得更强大! + +我们继续发布有新功能和特性的版本。我们的 FreeDOS 1.2 发布于 2016 年 12 月 25 日,这证明很多人喜欢使用和并在 FreeDOS 上工作。当我回顾我们的历史,有一个你应该知道的关于 FreeDOS 的很酷的事实列表: + +### 可以立即开始的软件开发 + +在原始的 DOS 中,很难做任何编程。DOS 提供了一个简单的 BASIC 解释器,一些用户可以用 DEBUG 做漂亮的事,但是你不能在 DOS 中做真正编程的事情。在 FreeDOS 中,有许多不同的工具做软件开发:编译期、汇编器、调试器、解释器和编写脚本。在你安装 FreeDOS 之后,你可以立即用 C、汇编、Pascal、Perl 和几种其他语言编写代码。 + +### 浏览 web + +DOS 是一个老旧的系统,并且原始不支持网络开箱即用。通常,你必须安装硬件的设备驱动程序才能连接到网络,通常是像 IPX 这样的简单网络。很少的系统支持 TCP/IP。 + +在 FreeDOS 中,我们不仅包含了 TCP/IP 网络栈,我们还包含了让你浏览 web 的工具和程序。使用 Dillo 作为图形 web 浏览体验,或则使用 Lynx 以纯文本形式浏览 web。如果你只想要抓取 HTML 代码并自己操作,使用 Wget 或者 Curl。 + +### 玩很棒的 DOS 游戏 + +我们知道很多的人安装 FreeDOS 来玩经典的 DOS 游戏,运行古老的商业程序或者嵌入式开发。使用 FreeDOS 的许多人只是拿来玩游戏,这对我们很酷。只是因为一个游戏很老并不意味着它很无趣。DOS 与许多很棒的游戏!安装你最喜欢的经典游戏,玩得开心。 + +因为有如此多的人使用 FreeDOS 来玩游戏,我们现在包含了不同的 DOS 游戏。FreeDOS 1.2 包含了第一人称射击游戏像 FreeDOOM、街机射击像 Kiloblaster、飞行模拟器像 Vertigo 等等。我们目标是为每人包含一些东西。 + +### FreeDOS 现在已经比 MS-DOS 更长了 + +微软在 1981 年 8 月发布了 MS-DOS 1.0。13 年之后,微软在 1995 年 8 月发布 Windows 95 后抛弃了 MS-DOS,虽然 MS-DOS 直到 2000 年 8 月一直存在。MS-DOS 总体上是存在 19 年的东西。 + +我们在 1994 年 6 月宣布了 FreeDOS,并且在同年的 9 月发布了第一个 Alpha 版本。因此 FreeDOS 已经大约有 23 年了,比微软的 MS-DOS 多了几年。确实我们在 FreeDOS 工作的时间比 MS-DOS 更长了。FreeDOS 还会继续保持强大。 + +FreeDOS 与其他 DOS 另外一个重要的不同是_它仍在开发中_。我们有一个积极的开发者社区,并一直在寻找新人来帮助。加入社区并帮助构造新的 FreeDOS 版本。 + +-------------------------------------------------------------------------------- + +作者简介: + +Jim Hall - 我是 FreeDOS 项目的创始人和协调者。我还担任 GNOME 基金董事会董事。在工作中,我是明尼苏达州拉姆齐县的首席信息官。在业余时间,我致力于开源软件的可用性,并通过 Outreachy(之前针对妇女的 GNOME Outreach 项目)指导 GNOME 中的可用性测试。 + +-------- + +via: https://opensource.com/article/17/6/freedos-still-cool-today + +作者:[Jim Hall][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/jim-hall +[1]:https://opensource.com/article/17/6/freedos-still-cool-today?rate=_5nJLfJhQp2bzfmjkORKyU-H0g8T3mzl7gPCymnb_y0 +[2]:https://opensource.com/user/126046/feed +[3]:https://opensource.com/article/17/6/www.freedos.org +[4]:https://opensource.com/users/jim-hall From e7d92448289e17c44249b250d15b45740d252f4c Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 6 Jul 2017 09:01:08 +0800 Subject: [PATCH 0621/1407] translating --- ...2 Ring is a Privacy-Focused Open-Source Skype Alternative.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md b/sources/tech/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md index 117471b3e1..c8d73a3db4 100644 --- a/sources/tech/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md +++ b/sources/tech/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md @@ -1,3 +1,5 @@ +translating----geekpi + Ring is a Privacy-Focused, Open-Source Skype Alternative ============================================================ From 59106f0d30a97ef9ed141c898bda05d95e063b06 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 6 Jul 2017 09:06:10 +0800 Subject: [PATCH 0622/1407] PRF&PUB:20170621 How To kill An Inactive OR Idle SSH Sessions.md @wcnnbdk1 --- ...o kill An Inactive OR Idle SSH Sessions.md | 46 +++++++++---------- 1 file changed, 21 insertions(+), 25 deletions(-) rename {translated/tech => published}/20170621 How To kill An Inactive OR Idle SSH Sessions.md (65%) diff --git a/translated/tech/20170621 How To kill An Inactive OR Idle SSH Sessions.md b/published/20170621 How To kill An Inactive OR Idle SSH Sessions.md similarity index 65% rename from translated/tech/20170621 How To kill An Inactive OR Idle SSH Sessions.md rename to published/20170621 How To kill An Inactive OR Idle SSH Sessions.md index 385ca06b25..493bd7ad05 100644 --- a/translated/tech/20170621 How To kill An Inactive OR Idle SSH Sessions.md +++ b/published/20170621 How To kill An Inactive OR Idle SSH Sessions.md @@ -1,19 +1,15 @@ -如何关闭一个不活动的或者是空闲的 SSH 会话 +如何关闭一个不活动的或者空闲的 SSH 会话 ============================================================ -作者 [MAGESH MARUTHAMUTHU][1] . 发布时间:2017年6月21日 || 最后更新:2017年6月21日 +让我们来假设一下,当你通过 ssh 在服务器上工作时,由于网络、电源或者是本地 PC 重启等原因会导致你的会话连接断开。 -让我们来想像一下,当你通过 ssh 在服务器上工作时,由于网络、电源或者是本地 PC 重启等原因导致你断开你的连接会话。 - -你可能会再次登录服务器继续工作也可能不会但是你始终会留下之前没有关闭的 ssh 会话。 +你可能会再次登录服务器继续工作也可能不会,但是你始终会留下之前没有关闭的 ssh 会话。 如何关闭一个不活动的 ssh 会话?首先使用 `w` 命令来识别出不活动或者是空闲的 ssh 会话,接着使用 `pstree` 命令来获取空闲会话的 PID,最后就是使用 `kill` 命令来关闭会话了。 -建议阅读:[SSH 相关文章][2] - 建议阅读:[Mosh(Mobile Shell)- 最好的SSH 远程连接替代选项][3] -#### 如何识别不活动的或者是空闲的 SSH 会话 +### 如何识别不活动的或者是空闲的 SSH 会话 登录系统通过 `w` 命令来查看当前有多少用户登录着。如果你识别出了自己的会话连接就可以记下其它不活动或者是空闲的 ssh 会话去关闭。 @@ -27,11 +23,11 @@ root pts/0 219.91.219.14 10:34 28.00s 0.00s 0.00s -bash root pts/2 219.91.219.14 10:36 0.00s 0.00s 0.00s w ``` -#### 如何获取 SSH 会话的 PID +### 如何获取 SSH 会话的 PID -为了关闭空闲的 ssh 会话,我们需要空闲会话进程的父进程的 `PID`。(这里介绍另一个工具 pkill,使用 pkill -t pts/0 -kill 就可以关闭会话, debian8下可用,有些版本似乎需要更改-kill的位置)我们可以执行 `pstree` 命令来查看包括了所有进程的树状图,以便获取父进程的 pid。 +为了关闭空闲的 ssh 会话,我们需要空闲会话进程的父进程的 PID。我们可以执行 `pstree` 命令来查看包括了所有进程的树状图,以便获取父进程的 pid。 -你会获得与下方示例中相似的输出。pstree 命令的输出会比这个大得多,为了更好的理解我删去了许多不相关的内容。 +你会获得与下方示例中相似的输出。`pstree` 命令的输出会比这个多得多,为了更好的理解我删去了许多不相关的内容。 ``` # pstree -p @@ -50,15 +46,14 @@ init(1)-+-abrtd(2131) `-udevd(27282) ``` -从上方的输出中,你可以看到 sshd 进程与分支的树形图。sshd 的主进程是 `sshd(2023)`,另两个分支分别为 `sshd(10132)` 和 `sshd(10199)`。 +从上方的输出中,你可以看到 `sshd` 进程与分支的树形图。`sshd` 的主进程是 `sshd(2023)`,另两个分支分别为 `sshd(10132)` 和 `sshd(10199)`。 跟我在文章开始讲的相同,其中一个是我新的会话连接 `sshd(10199)` 它展示了我正在执行的 `pstree` 命令,因此空闲会话是另一个进程为 `sshd(10132)`。 -建议阅读:[如何通过标准的网页浏览器来接入 Secure Shell (SSH) 服务器][4] +- 建议阅读:[如何通过标准的网页浏览器来接入 Secure Shell (SSH) 服务器][4] +- 建议阅读:[PSSH - 在多台 Linux 服务器上并行的执行命令][5] -建议阅读:[PSSH - 在多台 Linux 服务器上并行的执行命令][5] - -#### 如何关闭空闲 SSH 会话 +### 如何关闭空闲 SSH 会话 我们已经获得了有关空闲会话的所有信息。那么,就让我们来使用 `kill` 命令来关闭空闲会话。请确认你将下方的 PID 替换成了你服务器上的空闲会话 PID。 @@ -67,7 +62,9 @@ init(1)-+-abrtd(2131) # kill -9 10132 ``` -#### 再次查看空闲会话是否已经被关闭 +(LCTT 译注:这里介绍另一个工具 `pkill`,使用 `pkill -t pts/0 -kill` 就可以关闭会话, debian 8 下可用,有些版本似乎需要更改 `-kill` 的位置) + +### 再次查看空闲会话是否已经被关闭 再次使用 `w` 命令来查看空闲会话是否已经被关闭。没错,只有那个我自己的当前会话还在,因此那个空闲会话已经被关闭了。 @@ -78,11 +75,10 @@ USER TTY FROM LOGIN@ IDLE JCPU PCPU WHAT root pts/2 219.91.219.14 10:36 0.00s 0.00s 0.00s w ``` -建议阅读:[rtop - 一个好用的通过 SSH 来监控远程服务器的工具][6] +- 建议阅读:[rtop - 一个好用的通过 SSH 来监控远程服务器的工具][6] +- 建议阅读:[DSH - 同时在多台 Linux 服务器上执行命令][7] -建议阅读:[DSH - 同时在多台 Linux 服务器上执行命令][7] - -#### 再次使用 pstree 命令检查 +### 再次使用 pstree 命令检查 再次使用 `pstree` 命令确认。是的,只有那个我自己的 ssh 会话还在。 @@ -107,17 +103,17 @@ init(1)-+-abrtd(2131) via: http://www.2daygeek.com/kill-inactive-idle-ssh-sessions/ -作者:[ Magesh Maruthamuthu][a] +作者:[Magesh Maruthamuthu][a] 译者:[wcnnbdk1](https://github.com/wcnnbdk1) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 [a]:http://www.2daygeek.com/author/magesh/ [1]:http://www.2daygeek.com/author/magesh/ [2]:http://www.2daygeek.com/category/ssh-tutorials/ -[3]:http://www.2daygeek.com/install-mosh-shell-ssh-client-in-linux-to-connect-remote-system/ +[3]:https://linux.cn/article-6262-1.html [4]:http://www.2daygeek.com/shellinabox-web-based-ssh-terminal-to-access-remote-linux-servers/ [5]:http://www.2daygeek.com/pssh-parallel-ssh-run-execute-commands-on-multiple-linux-servers/ -[6]:http://www.2daygeek.com/rtop-monitor-remote-linux-server-over-ssh/ +[6]:https://linux.cn/article-8199-1.html [7]:http://www.2daygeek.com/dsh-run-execute-shell-commands-on-multiple-linux-servers-at-once/ From 69c48c8439b249a1e0c7bcaf0147faf64b904815 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 6 Jul 2017 09:37:40 +0800 Subject: [PATCH 0623/1407] PRF&PUB:20170629 4 cool facts you should know about FreeDOS.md @geekpi --- ...ool facts you should know about FreeDOS.md | 42 +++++++++---------- 1 file changed, 21 insertions(+), 21 deletions(-) rename {translated/tech => published}/20170629 4 cool facts you should know about FreeDOS.md (54%) diff --git a/translated/tech/20170629 4 cool facts you should know about FreeDOS.md b/published/20170629 4 cool facts you should know about FreeDOS.md similarity index 54% rename from translated/tech/20170629 4 cool facts you should know about FreeDOS.md rename to published/20170629 4 cool facts you should know about FreeDOS.md index 134fb0075d..8263f70bac 100644 --- a/translated/tech/20170629 4 cool facts you should know about FreeDOS.md +++ b/published/20170629 4 cool facts you should know about FreeDOS.md @@ -1,51 +1,51 @@ -你应该知道的 4 个很酷的关于 FreeDOS 的事实 +FreeDOS: 已经积极开发了 23 年的 DOS ============================================================ -### 23 年后,FreeDOS 正在积极开发,并将 MS-DOS 的声明延长了几年 - +> 23 年后,FreeDOS 仍在积极开发,并将 MS-DOS 的生命延长了几年 ![4 cool facts you should know about FreeDOS ](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/wings_freedos_game.jpg?itok=3O_GB-7o "4 cool facts you should know about FreeDOS ") ->图片版权: FreeDOS -在 90 年代早期,我是一位 DOS 的 “资深用户”。我用 DOS 做任何事,甚至写我自己的工具来扩展 DOS 命令行。当然,我们有 Microsoft Windows,但是如果你还记得当时的计算机,Windows 3.1 并不是那么好。我更喜欢在 DOS 中工作。 +在 90 年代早期,我是一位 DOS 的 “资深用户”。我用 DOS 做任何事,甚至写我自己的工具来扩展 DOS 命令行。当然,我们有 Microsoft Windows,但是如果你还记得当时的计算机,Windows 3.1 并不是那么好,我更喜欢在 DOS 中工作。 -你可能会明白,在 1994 年,当微软(通过科技杂志的采访)宣布下一个版本的 Windows 将会取消 MS-DOS 时,我感到有些困惑和不安。我想:“如果 Windows 3.2 或 4.0 看起来像 Windows 3.1,我不想用它了。” 我四处选择,并决定如果 DOS 会继续下去,那么会有人创建一个 DOS,在 MS-DOS 消失的时候,每个人都可以使用。 +你可能会理解,在 1994 年,当微软(在科技杂志的采访中)宣布下一个版本的 Windows 将会取消 MS-DOS 时,我感到有些困惑和不安。我想:“如果 Windows 3.2 或 4.0 看起来像 Windows 3.1 一样,我不想用它了。” 我四处选择,并决定如果 DOS 要继续下去的话,那么需要有人创建一个 DOS,在 MS-DOS 消失的时候,让每个人都可以使用它。 -因此在 1994 年 6 月 29 日,我在 Usenet 讨论组谢了一个信息,宣布了新的 “free DOS” 项目: +因此在 1994 年 6 月 29 日,我在 Usenet 讨论组写了一个信息,宣布了新的 “free DOS” 项目: -> 几个月前,我发表了一篇关于启动公共版本 DOS 的文章。当时对此的普遍支持是很强的,并且很多人同意这个声明,“开始写!” +> 几个月前,我发表了一篇关于启动公共领域版本的 DOS 的文章。当时对此的普遍支持是很强烈的,并且很多人同意这个声明,“开始编写!” > -> 所以,我已经。。。 +> 所以,我要…… > -> 宣布首次尝试制作 PD-DOS。我写了一份描述这样一个项目的目标和工作纲要的“清单”,以及一份“任务清单”,展示了需要写些什么。我会在这里发贴,让我们进行讨论。 +> 宣布首次尝试制作 PD-DOS。我写了一份描述这样一个项目的目标和工作纲要的“清单”,以及一份“任务清单”,展示了需要编写些什么。我会在这里发贴,让我们进行讨论。 -今天,已经 23 年之后了,[FreeDOS][3] 还变得更强大! +今天,已经是 23 年之后了,[FreeDOS][3] 仍在变得更强大! -我们继续发布有新功能和特性的版本。我们的 FreeDOS 1.2 发布于 2016 年 12 月 25 日,这证明很多人喜欢使用和并在 FreeDOS 上工作。当我回顾我们的历史,有一个你应该知道的关于 FreeDOS 的很酷的事实列表: +我们继续发布有新功能和特性的版本。我们的 FreeDOS 1.2 发布于 2016 年 12 月 25 日,这证明很多人喜欢使用和在 FreeDOS 上工作。当我回顾我们的历史,有一个你应该知道的关于 FreeDOS 的很酷的事实列表: ### 可以立即开始的软件开发 -在原始的 DOS 中,很难做任何编程。DOS 提供了一个简单的 BASIC 解释器,一些用户可以用 DEBUG 做漂亮的事,但是你不能在 DOS 中做真正编程的事情。在 FreeDOS 中,有许多不同的工具做软件开发:编译期、汇编器、调试器、解释器和编写脚本。在你安装 FreeDOS 之后,你可以立即用 C、汇编、Pascal、Perl 和几种其他语言编写代码。 +在原始的 DOS 中,很难做任何编程。DOS 提供了一个简单的 BASIC 解释器,一些用户可以用 DEBUG 做些精巧的事情,但是你不能在 DOS 中做真正编程的事情。在 FreeDOS 中,有许多不同的工具做软件开发:编译器、汇编器、调试器、解释器和编写脚本。在你安装 FreeDOS 之后,你可以立即用 C、汇编、Pascal、Perl 和几种其他语言编写代码。 ### 浏览 web -DOS 是一个老旧的系统,并且原始不支持网络开箱即用。通常,你必须安装硬件的设备驱动程序才能连接到网络,通常是像 IPX 这样的简单网络。很少的系统支持 TCP/IP。 +DOS 是一个老式系统,并且原本不支持开箱即用的网络。通常,你必须安装硬件的设备驱动程序才能连接到网络,一般是像 IPX 这样的简单网络。只有很少的系统会支持 TCP/IP。 在 FreeDOS 中,我们不仅包含了 TCP/IP 网络栈,我们还包含了让你浏览 web 的工具和程序。使用 Dillo 作为图形 web 浏览体验,或则使用 Lynx 以纯文本形式浏览 web。如果你只想要抓取 HTML 代码并自己操作,使用 Wget 或者 Curl。 ### 玩很棒的 DOS 游戏 -我们知道很多的人安装 FreeDOS 来玩经典的 DOS 游戏,运行古老的商业程序或者嵌入式开发。使用 FreeDOS 的许多人只是拿来玩游戏,这对我们很酷。只是因为一个游戏很老并不意味着它很无趣。DOS 与许多很棒的游戏!安装你最喜欢的经典游戏,玩得开心。 +我们知道很多的人安装 FreeDOS 来玩经典的 DOS 游戏,运行古老的商业程序或者做嵌入式开发。使用 FreeDOS 的许多人只是拿来玩游戏,那对我们来说是件很酷的事,因为一个游戏很老并不意味着它很无趣。DOS 有许多很棒的游戏!安装你最喜欢的经典游戏,你会玩得很开心。 -因为有如此多的人使用 FreeDOS 来玩游戏,我们现在包含了不同的 DOS 游戏。FreeDOS 1.2 包含了第一人称射击游戏像 FreeDOOM、街机射击像 Kiloblaster、飞行模拟器像 Vertigo 等等。我们目标是为每人包含一些东西。 +因为有如此多的人使用 FreeDOS 来玩游戏,我们现在包含了不同的 DOS 游戏。FreeDOS 1.2 包含了第一人称射击游戏像 FreeDOOM、街机射击像 Kiloblaster、飞行模拟器像 Vertigo 等等。我们目标是为每人提供一些东西。 -### FreeDOS 现在已经比 MS-DOS 更长了 +### FreeDOS 现在已经比 MS-DOS 活的更久了 -微软在 1981 年 8 月发布了 MS-DOS 1.0。13 年之后,微软在 1995 年 8 月发布 Windows 95 后抛弃了 MS-DOS,虽然 MS-DOS 直到 2000 年 8 月一直存在。MS-DOS 总体上是存在 19 年的东西。 +微软在 1981 年 8 月发布了 MS-DOS 1.0。13 年之后,微软在 1995 年 8 月发布 Windows 95 后抛弃了 MS-DOS,虽然 MS-DOS 直到 2000 年 9 月之前一直存在。总的来说,MS-DOS 是一件已经存在了 19 年的东西。 -我们在 1994 年 6 月宣布了 FreeDOS,并且在同年的 9 月发布了第一个 Alpha 版本。因此 FreeDOS 已经大约有 23 年了,比微软的 MS-DOS 多了几年。确实我们在 FreeDOS 工作的时间比 MS-DOS 更长了。FreeDOS 还会继续保持强大。 +我们在 1994 年 6 月宣布了 FreeDOS,并且在同年的 9 月发布了第一个 Alpha 版本。因此 FreeDOS 已经大约有 23 年了,比微软的 MS-DOS 还多了几年。确实我们在 FreeDOS 上努力的时间已经比 MS-DOS 更长了。而 FreeDOS 还将继续保持强大。 -FreeDOS 与其他 DOS 另外一个重要的不同是_它仍在开发中_。我们有一个积极的开发者社区,并一直在寻找新人来帮助。加入社区并帮助构造新的 FreeDOS 版本。 +FreeDOS 与其他 DOS 另外一个重要的不同是_它仍在开发中_。我们有一个积极的开发者社区,并一直在寻找新人来帮助。请加入社区并帮助构造新的 FreeDOS 版本吧。 + +(题图: FreeDOS) -------------------------------------------------------------------------------- @@ -59,7 +59,7 @@ via: https://opensource.com/article/17/6/freedos-still-cool-today 作者:[Jim Hall][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/) 荣誉推出 From a37350a431e766bfa6a16e90116487b543894dbe Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 6 Jul 2017 11:35:23 +0800 Subject: [PATCH 0624/1407] =?UTF-8?q?PRF&PUB:20170510=20How=20to=20Configu?= =?UTF-8?q?re=20and=20Integrate=20iRedMail=20Services=20to=20Samba4=20AD?= =?UTF-8?q?=20DC=20=E2=80=93=20Part=2011.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @geekpi --- ...Mail Services to Samba4 AD DC – Part 11.md | 144 +++++++++--------- 1 file changed, 72 insertions(+), 72 deletions(-) rename {translated/tech => published}/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md (62%) diff --git a/translated/tech/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md b/published/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md similarity index 62% rename from translated/tech/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md rename to published/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md index 049e87ae53..ccb78fc077 100644 --- a/translated/tech/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md +++ b/published/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md @@ -1,39 +1,39 @@ -如何配置并集成 iRedMail 服务到 Samba4 AD DC 中 - 第 11 部分 -============================================================ +Samba 系列(十一):如何配置并集成 iRedMail 服务到 Samba4 AD DC 中 +========================================================= +在本教程中,将学习如何修改提供邮件服务的 iRedMail 主要守护进程,相应地,[Postfix 用于邮件传输,Dovecot 将邮件传送到帐户邮箱][4],以便将它们集成到 [Samba4 AD 域控制器][5]中。 -在本教程中,将学习如何修改 iRedMail 的主要守护进程,相应地,[Postfix 用于邮件传输,Dovecot][4] 将邮件传送到帐户邮箱,以便将它们集成到[ Samba4 AD 域控制器][5]中。 +将 iRedMail 集成到 Samba4 AD DC 中,你将得到以下好处:通过 Samba AD DC 得到用户身份验证、管理和状态,在 AD 组和 Roundcube 中的全局 LDAP 地址簿的帮助下创建邮件列表。 -将 iRedMail 集成到 Samba4 AD DC 中,你将得到以下好处:用户身份验证、管理和通过 Samba AD DC 的状态、在 Roundcube 中的 AD 组和全局 LDAP 地址簿的帮助下创建邮件列表。 - -#### 要求 +### 要求 1. [在 CentOS 7 中为 Samba4 AD 集成安装 iRedMail][1] ### 第一步:准备 iRedMail 系统用于 Samba4 AD 集成 -1. 在第一步中,你需要[为你的机器分配一个静态的 IP 地址][6]以防你使用的是由 DHCP 服务器提供的动态 IP 地址。 +1、 在第一步中,你需要[为你的机器分配一个静态的 IP 地址][6]以防你使用的是由 DHCP 服务器提供的动态 IP 地址。 -运行[ ifconfig 命令][7]列出你的机器网络接口名,并对正确的网卡发出 [nmtui-edit][8] 命令,使用自定义 IP 设置编辑正确的网络接口。 +运行 [ifconfig 命令][7]列出你的机器网络接口名,并对正确的网卡发出 [nmtui-edit][8] 命令,使用自定义 IP 设置编辑正确的网络接口。 - root 权限运行 nmtui-edit 命令。 +root 权限运行 nmtui-edit 命令。 ``` # ifconfig # nmtui-edit eno16777736 ``` - [![Find Network Interface Name](https://www.tecmint.com/wp-content/uploads/2017/05/Find-Network-Interface-Name.png)][9] -找出网络接口名 +[![Find Network Interface Name](https://www.tecmint.com/wp-content/uploads/2017/05/Find-Network-Interface-Name.png)][9] -2. 在打开要编辑的网络接口后,添加正确的静态 IP 设置,确保添加了 Samba4 AD DC 的 DNS 服务器 IP 地址以及你的域的名字,以便从机器查询 realm。使用以下截图作为指导。 +*找出网络接口名* + +2、 在打开要编辑的网络接口后,添加正确的静态 IP 设置,确保添加了 Samba4 AD DC 的 DNS 服务器 IP 地址以及你的域的名字,以便从机器查询 realm。使用以下截图作为指导。 [![Configure Network Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Configure-Network-Settings.png)][10] -配置网络设置 +*配置网络设置* -3. 在你完成配置网络接口后,重启网络进程使更改生效,并对域名以及 samba 4 域控制器的 FQDN 使用 ping 命令测试。 +3、 在你完成配置网络接口后,重启网络进程使更改生效,并对域名以及 samba 4 域控制器的 FQDN 使用 ping 命令测试。 ``` # systemctl restart network.service @@ -44,31 +44,33 @@ ``` [![Verify Network DNS Configuration](https://www.tecmint.com/wp-content/uploads/2017/05/Verify-Network-DNS-Configuration.png)][11] -验证网络 DNS 配置 +*验证网络 DNS 配置* -4. 接下来,用下面的命令安装 ntpdate 包,与域控制器同步时间,并请求 samba4 机器的 NTP 服务器: +4、 接下来,用下面的命令安装 `ntpdate` 包,与域控制器同步时间,并请求 samba4 机器的 NTP 服务器: ``` # yum install ntpdate # ntpdate -qu tecmint.lan # querry domain NTP servers # ntpdate tecmint.lan # Sync time with the domain ``` - [![Sync Time with Samba NTP Server](https://www.tecmint.com/wp-content/uploads/2017/05/Sync-Time-with-Samba-NTP-Server.png)][12] -与 Samba NTP 服务器同步时间 +[![Sync Time with Samba NTP Server](https://www.tecmint.com/wp-content/uploads/2017/05/Sync-Time-with-Samba-NTP-Server.png)][12] -5. 你或许想要本地时间自动与 samba AD 时间服务器同步。为了实现这个设置,通过运行 [crontab -e 命令][13]并追加下面的行添加一条计划任务。 +*与 Samba NTP 服务器同步时间* + +5、 你或许想要本地时间自动与 samba AD 时间服务器同步。为了实现这个设置,通过运行 [crontab -e 命令][13]并追加下面的行添加一条计划任务。 ``` 0 */1 * * * /usr/sbin/ntpdate tecmint.lan > /var/log/ntpdate.lan 2>&1 ``` - [![Auto Sync Time with Samba NTP](https://www.tecmint.com/wp-content/uploads/2017/05/Auto-Sync-Time-with-Samba-NTP.png)][14] -自动与 Samba NTP 同步时间 +[![Auto Sync Time with Samba NTP](https://www.tecmint.com/wp-content/uploads/2017/05/Auto-Sync-Time-with-Samba-NTP.png)][14] + +*自动与 Samba NTP 同步时间* ### 第二步:为 iRedMail 集成准备 Samba4 AD DC -6. 现在,如[这篇][16]教程所述进入一台[安装了 RSAT 工具的 Windows 机器][15]管理 Samba4 AD。 +6、 现在,如[这篇][16]教程所述进入一台[安装了 RSAT 工具的 Windows 机器][15]管理 Samba4 AD。 打开 DNS 管理器,转到你的域转发查找区并添加新的 A 记录、MX记录还有 PTR 记录指向你的 iRedMail 系统的 IP 地址。使用以下截图作为指导。 @@ -76,23 +78,21 @@ [![Create DNS A Record for iRedMail](https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-A-Record-for-iRedMail.png)][17] -为 iRedMail 创建 DNS A 记录 +*为 iRedMail 创建 DNS A 记录* 添加 MX 记录(将子域留空,优先级为 10)。 [![Create DNS MX Record for iRedMail](https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-MX-Record-for-iRedMail.png)][18] -为 iRedMail 创建 DNS MX 记录 +*为 iRedMail 创建 DNS MX 记录* -在反向查找区域(相应地替换 iRedMail 服务器的 IP 地址)添加 PTR 记录。如果你尚未为域控制器配置反向区域,请阅读以下教程: - -1. [从 Windows 管理 Samba4 DNS 组策略][2] +在反向查找区域(相应地替换 iRedMail 服务器的 IP 地址)添加 PTR 记录。如果你尚未为域控制器配置反向区域,请阅读以下教程:[从 Windows 管理 Samba4 DNS 组策略][2] [![Create DNS PTR Record for iRedMail](https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-PTR-Record-for-iRedMail.png)][19] -为 iRedMail 创建 DNS PTR 记录 +*为 iRedMail 创建 DNS PTR 记录* -7.添加了使邮件服务器正常运行的基本 DNS 记录后,请进入 iRedMail 机器,安装 bind-utils 软件包,并按如下建议查询新添加的邮件记录。 +7、添加了使邮件服务器正常运行的基本 DNS 记录后,请进入 iRedMail 机器,安装 bind-utils 软件包,并按如下建议查询新添加的邮件记录。 Samba4 AD DC DNS 应该会响应之前添加的 DNS 记录。 @@ -102,49 +102,48 @@ Samba4 AD DC DNS 应该会响应之前添加的 DNS 记录。 # host mail.tecmint.lan # host 192.168.1.245 ``` - [![Install Bind and Query Mail Records](https://www.tecmint.com/wp-content/uploads/2017/05/Install-Bind-and-Query-Mail-Records.png)][20] -安装 Bind 并查询邮件记录 +[![Install Bind and Query Mail Records](https://www.tecmint.com/wp-content/uploads/2017/05/Install-Bind-and-Query-Mail-Records.png)][20] -在一台 Windows 机器上,打开命令行窗口并使用[ nslookup 命令][21]查询上面的邮件服务器记录。 +*安装 Bind 并查询邮件记录* -8. 作为最后一个先决要求,在 Samba4 AD DC 中创建一个具有最小权限的新用户帐户,并使用名称 vmail, 为此用户选择一个强密码, 并确保该用户的密码永不过期。 +在一台 Windows 机器上,打开命令行窗口并使用 [nslookup 命令][21]查询上面的邮件服务器记录。 + +8、 作为最后一个先决要求,在 Samba4 AD DC 中创建一个具有最小权限的新用户帐户,并使用名称 vmail, 为此用户选择一个强密码, 并确保该用户的密码永不过期。 vmail 帐户将被 iRedMail 服务用来查询 Samba4 AD DC LDAP 数据库并拉取电子邮件帐户。 -要创建 vmail 账户,如截图所示,使用加入了已安装 RSAT 工具域的 Windows 机器上的 ADUC 图形化工具,或者按照先前主题中那样用 samba-tool 命令行直接在域控制器中运行。 - -1. [在 Linux 命令行中管理 Samba4 AD][3] +要创建 vmail 账户,如截图所示,使用加入了已安装 RSAT 工具域的 Windows 机器上的 ADUC 图形化工具,或者按照先前主题中那样用 [samba-tool 命令行][3]直接在域控制器中运行。 在本指导中,我们会使用上面提到的第一种方法。 [![Active Directory Users and Computers](https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-Users-and-Computers.png)][22] -AD 用户和计算机 +*AD 用户和计算机* [![Create New User for iRedMail](https://www.tecmint.com/wp-content/uploads/2017/05/Create-New-User-for-iRedMail.png)][23] -为 iRedMail 创建新的用户 +*为 iRedMail 创建新的用户* [![Set Strong Password for User](https://www.tecmint.com/wp-content/uploads/2017/05/Set-Strong-Password-for-User.png)][24] -为用户设置强密码 +*为用户设置强密码* -9. 在 iRedMail 系统中,用下面的命令测试 vmail 用户能够查询 Samba4 AD DC LDAP 数据库。返回的结果应该是你的域的对象总数, 如下截图所示。 +9、 在 iRedMail 系统中,用下面的命令测试 vmail 用户能够查询 Samba4 AD DC LDAP 数据库。返回的结果应该是你的域的对象总数, 如下截图所示。 ``` # ldapsearch -x -h tecmint.lan -D 'vmail@tecmint.lan' -W -b 'cn=users,dc=tecmint,dc=lan' ``` -注意:相应地替换域名以及 Samba4 AD 的 LDAP dn (‘cn=users,dc=tecmint,dc=lan‘)。 +注意:相应地替换域名以及 Samba4 AD 的 LDAP dn (`cn=users,dc=tecmint,dc=lan`)。 [![Query Samba4 AD DC LDAP](https://www.tecmint.com/wp-content/uploads/2017/05/Query-Samba4-AD-DC-LDAP.png)][25] -查询 Samba4 AD DC LDAP +*查询 Samba4 AD DC LDAP* ### 第三步:将 iRedMail 服务集成到 Samba4 AD DC 中 -10. 现在是时候修改 iRedMail 服务(Postfix、Dovecot 和 Roundcube)以便为邮箱帐户查询 Samba4 域控制器。 +10、 现在是时候修改 iRedMail 服务(Postfix、Dovecot 和 Roundcube)以便为邮箱帐户查询 Samba4 域控制器。 第一个要修改的服务是 MTA 代理,Postfix。执行以下命令禁用一系列的 MTA 设置,添加你的域名到 Postfix 本地域以及邮箱域中,并使用 Dovecot 代理发送已接收的邮件到用户邮箱中。 @@ -167,7 +166,7 @@ AD 用户和计算机 # postmap hash:/etc/postfix/transport ``` -11. 接下来,用你最喜欢的文本编辑器创建 Postfix `/etc/postfix/ad_sender_login_maps.cf` 配置文件,并添加下面的配置。 +11、 接下来,用你最喜欢的文本编辑器创建 Postfix 的 `/etc/postfix/ad_sender_login_maps.cf` 配置文件,并添加下面的配置。 ``` server_host = tecmint.lan @@ -184,7 +183,7 @@ result_attribute= userPrincipalName debuglevel = 0 ``` -12. 使用下面的配置创建 `/etc/postfix/ad_virtual_mailbox_maps.cf`。 +12、 使用下面的配置创建 `/etc/postfix/ad_virtual_mailbox_maps.cf`。 ``` server_host = tecmint.lan @@ -202,7 +201,7 @@ result_format = %d/%u/Maildir/ debuglevel = 0 ``` -13. 使用下面的配置创建 `/etc/postfix/ad_virtual_group_maps.cf`。 +13、 使用下面的配置创建 `/etc/postfix/ad_virtual_group_maps.cf`。 ``` server_host = tecmint.lan @@ -221,9 +220,9 @@ result_attribute= userPrincipalName debuglevel = 0 ``` -替换上面三个配置文件中的 server_host、bind_dn、bind_pw 和 search_base 以反应你自己域的设置。 +替换上面三个配置文件中的 `server_host`、`bind_dn`、`bind_pw` 和 `search_base` 以反应你自己域的设置。 -14. 接下来,打开 Postfix 主配置文件,通过在下面的行前添加 `#`,搜索并禁用 iRedAPD 的 check_policy_service 和 smtpd_end_of_data_restrictions。 +14、 接下来,打开 Postfix 主配置文件,通过在下面的行前添加 `#` 注释,搜索并禁用 iRedAPD 的 `check_policy_service` 和 `smtpd_end_of_data_restrictions`。 ``` # nano /etc/postfix/main.cf @@ -236,7 +235,7 @@ debuglevel = 0 #smtpd_end_of_data_restrictions = check_policy_service inet:127.0.0.1:7777 ``` -15. 现在,通过执行一系列查询,验证 Postfix 是否使用现有的域用户和域组绑定到 Samba AD,如以下示例所示。 +15、 现在,通过执行一系列查询,验证 Postfix 是否使用现有的域用户和域组绑定到 Samba AD,如以下示例所示。 结果应与下面的截图类似。 @@ -245,13 +244,14 @@ debuglevel = 0 # postmap -q tecmint_user@tecmint.lan ldap:/etc/postfix/ad_sender_login_maps.cf # postmap -q linux_users@tecmint.lan ldap:/etc/postfix/ad_virtual_group_maps.cf ``` - [![Verify Postfix Binding to Samba AD](https://www.tecmint.com/wp-content/uploads/2017/05/Verify-Postfix-Binding-to-Samba-AD.png)][26] -验证 Postfix 绑定到了 Samba AD +[![Verify Postfix Binding to Samba AD](https://www.tecmint.com/wp-content/uploads/2017/05/Verify-Postfix-Binding-to-Samba-AD.png)][26] + +*验证 Postfix 绑定到了 Samba AD* 相应替换 AD 用户及组帐户。同样,确保你使用的 AD 组已被分配了一些成员。 -16. 在下一步中修改 Dovecot 配置文件以查询 Samba4 AD DC。打开 `/etc/dovecot/dovecot-ldap.conf` 文件并添加下面的行。 +16、 在下一步中修改 Dovecot 配置文件以查询 Samba4 AD DC。打开 `/etc/dovecot/dovecot-ldap.conf` 文件并添加下面的行。 ``` hosts = tecmint.lan:389 @@ -269,28 +269,28 @@ default_pass_scheme = CRYPT user_attrs = =home=/var/vmail/vmail1/%Ld/%Ln/Maildir/,=mail=maildir:/var/vmail/vmail1/%Ld/%Ln/Maildir/ ``` -Samba4 AD 帐户的邮箱将会存储在 /var/vmail/vmail1/your_domain.tld/your_domain_user/Maildir/ 中。 +Samba4 AD 帐户的邮箱将会存储在 `/var/vmail/vmail1/your_domain.tld/your_domain_user/Maildir/` 中。 -17. 确保 dovecot 的主配置文件中启用了 pop3 和 imap 协议。打开 `/etc/dovecot/dovecot.conf` 验证是否启用了 quota 和 acl 邮件插件,并检查这些值是否存在。 +17、 确保 dovecot 的主配置文件中启用了 pop3 和 imap 协议。打开 `/etc/dovecot/dovecot.conf` 验证是否启用了 `quota` 和 `acl` 邮件插件,并检查这些值是否存在。 [![Enable Pop3 and Imap in Dovecot](https://www.tecmint.com/wp-content/uploads/2017/05/Enable-Pop3-Imap-in-Dovecot.png)][27] -在 Dovecot 中启用 POP3 和 IMAP +*在 Dovecot 中启用 POP3 和 IMAP* -18. 可选地,如果要将全局硬配额设置为每个域用户的最大不超过 500 MB 存储,请在 /etc/dovecot/dovecot.conf 文件中添加以下行。 +18、 可选地,如果要将全局硬配额设置为每个域用户的最大不超过 500 MB 存储,请在 `/etc/dovecot/dovecot.conf` 文件中添加以下行。 ``` quota_rule = *:storage=500M ``` -19. 最后,为了使目前这些更改生效,用 root 权限执行下面的命令重启并验证 Postfix 和 Dovecot 守护进程的状态。 +19、 最后,为了使目前这些更改生效,用 root 权限执行下面的命令重启并验证 Postfix 和 Dovecot 守护进程的状态。 ``` # systemctl restart postfix dovecot # systemctl status postfix dovecot ``` -20. 为了使用 IMAP 协议从命令行测试邮件服务器配置,请使用 telnet 或[ netcat 命令][28],如下所示。 +20、 为了使用 IMAP 协议从命令行测试邮件服务器配置,请使用 telnet 或 [netcat 命令][28],如下所示。 ``` # nc localhost 143 @@ -298,9 +298,10 @@ a1 LOGIN ad_user@your_domain.tld ad_user_password a2 LIST “” “*” a3 LOGOUT ``` - [![Test iRedMail Configuration](https://www.tecmint.com/wp-content/uploads/2017/05/Test-iRedMail-Configuration.png)][29] -测试 iRedMail 配置 +[![Test iRedMail Configuration](https://www.tecmint.com/wp-content/uploads/2017/05/Test-iRedMail-Configuration.png)][29] + +*测试 iRedMail 配置* 如果你可以使用 Samba4 用户帐户从命令行执行 IMAP 登录,那么 iRedMail 服务器似乎已经准备好发送和接收 AD 帐户的邮件。 @@ -312,34 +313,33 @@ a3 LOGOUT 我是一个电脑上瘾的家伙,开源和基于 linux 的系统软件的粉丝,在 Linux 发行版桌面、服务器和 bash 脚本方面拥有大约4年的经验。 - ----- via: https://www.tecmint.com/integrate-iredmail-to-samba4-ad-dc-on-centos-7/ -作者:[ Matei Cezar][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) +作者:[Matei Cezar][a] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 [a]:https://www.tecmint.com/author/cezarmatei/ -[1]:https://www.tecmint.com/install-iredmail-on-centos-7-for-samba4-ad-integration/ -[2]:https://www.tecmint.com/manage-samba4-dns-group-policy-from-windows/ -[3]:https://www.tecmint.com/manage-samba4-active-directory-linux-command-line/ +[1]:https://linux.cn/article-8567-1.html +[2]:https://linux.cn/article-8258-1.html +[3]:https://linux.cn/article-8070-1.html [4]:https://www.tecmint.com/setup-postfix-mail-server-and-dovecot-with-mariadb-in-centos/ -[5]:https://www.tecmint.com/install-samba4-active-directory-ubuntu/ -[6]:https://www.tecmint.com/set-add-static-ip-address-in-linux/ +[5]:https://linux.cn/article-8065-1.html +[6]:https://linux.cn/article-3977-1.html [7]:https://www.tecmint.com/ifconfig-command-examples/ -[8]:https://www.tecmint.com/configure-network-connections-using-nmcli-tool-in-linux/ +[8]:https://linux.cn/article-5410-1.html [9]:https://www.tecmint.com/wp-content/uploads/2017/05/Find-Network-Interface-Name.png [10]:https://www.tecmint.com/wp-content/uploads/2017/05/Configure-Network-Settings.png [11]:https://www.tecmint.com/wp-content/uploads/2017/05/Verify-Network-DNS-Configuration.png [12]:https://www.tecmint.com/wp-content/uploads/2017/05/Sync-Time-with-Samba-NTP-Server.png [13]:https://www.tecmint.com/11-cron-scheduling-task-examples-in-linux/ [14]:https://www.tecmint.com/wp-content/uploads/2017/05/Auto-Sync-Time-with-Samba-NTP.png -[15]:https://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/ -[16]:https://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/ +[15]:https://linux.cn/article-8097-1.html +[16]:https://linux.cn/article-8097-1.html [17]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-A-Record-for-iRedMail.png [18]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-MX-Record-for-iRedMail.png [19]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-DNS-PTR-Record-for-iRedMail.png From 6bf3e4dcbf824bd920a8d570c136505f80e76ada Mon Sep 17 00:00:00 2001 From: WangYue <815420852@qq.com> Date: Thu, 6 Jul 2017 14:17:54 +0800 Subject: [PATCH 0625/1407] =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=8E=9F=E6=96=872?= =?UTF-8?q?0170426=20How=20to=20get=20started=20learning=20to=20program.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 删除原文20170426 How to get started learning to program.md --- ... How to get started learning to program.md | 133 ------------------ 1 file changed, 133 deletions(-) delete mode 100644 sources/talk/20170426 How to get started learning to program.md diff --git a/sources/talk/20170426 How to get started learning to program.md b/sources/talk/20170426 How to get started learning to program.md deleted file mode 100644 index 942f18f1dd..0000000000 --- a/sources/talk/20170426 How to get started learning to program.md +++ /dev/null @@ -1,133 +0,0 @@ -===================================== -翻译中 WangYueScream -====================================== - - -How to get started learning to program -============================================================ - -### Ever wondered, "How can I learn to program?" We provide guidance to help you find the approach that best suits your needs and situation. - - -![Know thyself](https://opensource.com/sites/default/files/styles/image-full-size/public/u23316/roman-know-thyself-osdc-lead.png?itok=oWuH8hRr "Know thyself") ->Image by : Artist unknown. Public domain, [via Wikimedia Commons][20]. Modified by Opensource.com. - -There's a lot of buzz lately about learning to program. Not only is there a [shortage of people][21] compared with the open and pending positions in software development, programming is also a career with one of the [highest salaries][22] and [highest job satisfaction rates][23]. No wonder so many people are looking to break into the industry! - -But how, exactly, do you do that? "**How can I learn to program?**" is a common question. Although I don't have all the answers, hopefully this article will provide guidance to help you find the approach that best suits your needs and situation. - - - -### What's your learning style? - -Before you start your learning process, consider not only your options, but also yourself. The ancient Greeks had a saying, [γνῶθι σεαυτόν][24] (gnothi seauton), meaning "know thyself". Undertaking a large learning program is difficult. Self awareness is necessary to make sure you are making the choices that will lead to the highest chance of success. Be honest with yourself when you answer the following questions: - -* **What is your preferred learning style?** How do you learn best? Is it by reading? Hearing a lecture? Mostly hands-on experimentation? Choose the style that is most effective for you. Don't choose a style because it's popular or because someone else said it worked for them. - -* **What are your needs and requirements?** Why are you looking into learning how to program? Is it because you wish to change jobs? If so, how quickly do you need to do that? Keep in mind, these are  _needs_ , not  _wants_ . You may  _want_  a new job next week, but  _need_  one within a year to help support your growing family. This sort of timing will matter when selecting a path. - -* **What are your available resources?** Sure, going back to college and earning a computer science degree might be nice, but you must be realistic with yourself. Your life must accommodate your learning. Can you afford—both in time and money—to set aside several months to participate in a bootcamp? Do you even live in an area that provides learning opportunities, such as meetups or college courses? The resources available to you will have a large impact on how you proceed in your learning. Research these before diving in. - -### Picking a language - -As you start your path and consider your options, remember that despite what many will say, the choice of which programming language you use to start learning simply does  _not_  matter. Yes, some languages are more popular than others. For instance, right now JavaScript, Java, PHP, and Python are among the [most popular languages][25] according to one study. But what is popular today may be passé next year, so don't get too hung up on choice of language. The underlying principles of methods, classes, functions, conditionals, control flow, and other programming concepts will remain more or less the same regardless of the language you use. Only the grammar and community best practices will change. Therefore you can learn to program just as well in [Perl][26] as you can in [Swift][27] or [Rust][28]. As a programmer, you will work with and in many different languages over the course of your career. Don't feel you're "stuck" with the first one you learn. - -### Test the waters - -Unless you already have dabbled a bit and know for sure that programming is something you'd like to spend the rest of your life doing, I advise you to dip a toe into the waters before diving in headfirst. This work is not for everyone. Before going all-in on a learning program, take a little time to try out one of the smaller, cheaper options to get a sense of whether you'll enjoy the work enough to spend 40 hours a week doing it. If you don't enjoy this work, it's unlikely you'll even finish the program. If you do finish your learning program despite that, you may be miserable in your subsequent job. Life is too short to spend a third of it doing something you don't enjoy. - -Thankfully, there is a lot more to software development than simply programming. It's incredibly helpful to be familiar with programming concepts and to understand how software comes together, but you don't need to be a programmer to get a well-paying job in software development. Additional vital roles in the process are technical writer, project manager, product manager, quality assurance, designer, user experience, ops/sysadmin, and data scientist, among others. Many different roles and people are required to launch software successfully. Don't feel that learning to program requires you to become a programmer. Explore your options and choose what's best for you. - -### Learning resources - -What are your options for learning resources? As you've probably already discovered, those options are many and varied, although not all of them may be available in your area. - -* **Bootcamps**: Bootcamps such as [App Academy][5] and [Bloc][6] have become popular in recent years. Often charging a fee of $10K USD or more, bootcamps advertise that they can train a student to become an employable programmer in a matter of weeks. Before enrolling in a coding bootcamp, research the program to make sure it delivers on its promises and is able to place its students in well-paying, long-term positions after graduation. The money is one cost, whereas the time is another—these typically are full-time programs that require the student to set aside any other obligations for several weeks in a row. These two costs often put bootcamps outside the budget of many prospective programmers. - -* **Community college/vocational training center**: Community colleges often are overlooked by people investigating their options for learning to program, and that's a shame. The education you can receive at a community college or vocational training center can be as effective as other options, at a fraction of the cost. - -* **State/local training programs**: Many regions recognize the economic benefits of boosting technology investments in their area and have developed training programs to create well-educated and -prepared workforces. Training program examples include [Code Oregon][7] and [Minneapolis TechHire][8]. Check to see whether your state, province, or municipality offers such a program. - -* **Online training**: Many companies and organizations offer online technology training programs. Some, such as [Linux Foundation][9], are dedicated to training people to be successful with open source technologies. Others, like [O'Reilly Media][10], [Lynda.com][11], and [Coursera][12] provide training in many aspects of software development. [Codecademy][13] provides an online introduction to programming concepts. The costs of each program will vary, but most of them will allow you to learn on your schedule. - -* **MOOCs**: MOOCs—Massive Open Online Courses—have really picked up steam in the past few years. World-class universities, such as [Harvard][14], [Stanford][15], [MIT][16], and others have been recording their courses and making them available online for free. The self-directed nature of the courses may not be a good fit for everyone, but the material available makes this a valuable learning option. - -* **Books**: Many people love self-directed learning using books. It's quite economical and provides ready reference material after the initial learning phase. Although you can order and access books through online services like [Safari][17] and [Amazon][18], don't forget to check your local public library as well. - -### Support network - -Whichever learning resources you choose, the process will be more successful with a support network. Sharing your experiences and challenges with others can help keep you motivated, while providing a safe place to ask questions that you might not feel confident enough to ask elsewhere yet. Many towns have local user groups that gather to discuss and learn about software technologies. Often you can find these listed at [Meetup.com][29]. Special interest groups, such as [Women Who Code][30] and [Code2040][31], frequently hold meetings and hackathons in most urban areas and are a great way to meet and build a support network while you're learning. Some software conferences host "hack days" where you can meet experienced software developers and get help with concepts on which you're stuck. For instance, every year [PyCon][32] features several days of the conference for people to gather and work together. Some projects, such as [BeeWare][33], use these sprint days to assist new programmers to learn and contribute to the project. - -Your support network doesn't have to come from a formal meetup. A small study group can be as effective at keeping you motivated to stay with your learning program and can be as easy to form as posting an invitation on your favorite social network. This is particularly useful if you live in an area that doesn't currently have a large community of software developers to support several meetups and user groups. - -### Steps for getting started - -In summary, to give yourself the best chance of success should you decide to learn to program, follow these steps: - -1. Gather your list of requirements/needs and resources - -2. Research the options available to you in your area - -3. Discard the options that do not meet your requirements and resources - -4. Select the option(s) that best suit your requirements, resources, and learning style - -5. Find a support network - -Remember, though: Your learning process will never be complete. The software industry moves quickly, with new technologies and advances popping up nearly every day. Once you learn to program, you must commit to spending time to learn about these new advances. You cannot rely on your job to provide you this training. Only you are responsible for your own career development, so if you wish to stay up-to-date and employable, you must stay abreast of the latest technologies in the industry. - -Good luck! - --------------------------------------------------------------------------------- - -作者简介: - -VM (Vicky) Brasseur - VM (aka Vicky) is a manager of technical people, projects, processes, products and p^Hbusinesses. In her more than 18 years in the tech industry she has been an analyst, programmer, product manager, software engineering manager, and director of software engineering. Currently she is a Senior Engineering Manager in service of an upstream open source development team at Hewlett Packard Enterprise. VM blogs at anonymoushash.vmbrasseur.com and tweets at @vmbrasseur. - --------- - -via: https://opensource.com/article/17/4/how-get-started-learning-program - -作者:[VM (Vicky) Brasseur ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/vmbrasseur -[1]:https://opensource.com/tags/python?src=programming_resource_menu -[2]:https://opensource.com/tags/javascript?src=programming_resource_menu -[3]:https://opensource.com/tags/perl?src=programming_resource_menu -[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu -[5]:https://www.appacademy.io/ -[6]:https://www.bloc.io/ -[7]:http://codeoregon.org/ -[8]:http://www.minneapolismn.gov/cped/metp/TechHire#start -[9]:https://training.linuxfoundation.org/ -[10]:http://shop.oreilly.com/category/learning-path.do -[11]:https://www.lynda.com/ -[12]:https://www.coursera.org/ -[13]:https://www.codecademy.com/ -[14]:https://www.edx.org/school/harvardx -[15]:http://online.stanford.edu/courses -[16]:https://ocw.mit.edu/index.htm -[17]:https://www.safaribooksonline.com/ -[18]:https://amazon.com/ -[19]:https://opensource.com/article/17/4/how-get-started-learning-program?rate=txl_aE6F2oOUSgQDveWFtrPWIbA1ULFwfOp017zV35M -[20]:https://commons.wikimedia.org/wiki/File:Roman-mosaic-know-thyself.jpg -[21]:http://www.techrepublic.com/article/report-40-of-employers-worldwide-face-talent-shortages-driven-by-it/ -[22]:http://web.archive.org/web/20170328065655/http://www.businessinsider.com/highest-paying-jobs-in-america-2017-3/#-25 -[23]:https://stackoverflow.com/insights/survey/2017/#career-satisfaction -[24]:https://en.wikipedia.org/wiki/Know_thyself -[25]:https://stackoverflow.com/insights/survey/2017/#most-popular-technologies -[26]:https://learn.perl.org/tutorials/ -[27]:http://shop.oreilly.com/product/0636920045946.do -[28]:https://doc.rust-lang.org/book/ -[29]:https://www.meetup.com/ -[30]:https://www.womenwhocode.com/ -[31]:http://www.code2040.org/ -[32]:https://us.pycon.org/ -[33]:http://pybee.org/ -[34]:https://opensource.com/user/10683/feed -[35]:https://opensource.com/article/17/4/how-get-started-learning-program#comments -[36]:https://opensource.com/users/vmbrasseur From 715a7e860388e8679489457746fa0fdf44127cd3 Mon Sep 17 00:00:00 2001 From: WangYue <815420852@qq.com> Date: Thu, 6 Jul 2017 14:21:40 +0800 Subject: [PATCH 0626/1407] =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AF=91=E6=96=872?= =?UTF-8?q?0170426=20How=20to=20get=20started=20learning=20to=20program.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 添加译文20170426 How to get started learning to program.md --- ... How to get started learning to program.md | 177 ++++++++++++++++++ 1 file changed, 177 insertions(+) create mode 100644 translated/talk/20170426 How to get started learning to program.md diff --git a/translated/talk/20170426 How to get started learning to program.md b/translated/talk/20170426 How to get started learning to program.md new file mode 100644 index 0000000000..45fc37e662 --- /dev/null +++ b/translated/talk/20170426 How to get started learning to program.md @@ -0,0 +1,177 @@ + +如何开始学习编程? +====================================================== + +### 编程初学者可能都思考过这个问题,“我该怎么学编程?”这里我们提供些相关的参考指导来帮助你找到最适合自己学习情况和学习需要的方法。 + + +![Know thyself](https://opensource.com/sites/default/files/styles/image-full-size/public/u23316/roman-know-thyself-osdc-lead.png?itok=oWuH8hRr "Know thyself") + + +>图片来源 : Opensource.com 修改自 [维基共享][20]里的某不知名艺术家的作品 + + +最近有很多关于学习编程的争论。不仅仅是因为与软件开发公司公开的待应聘的职位数量相比较[符合招聘要求的人远远无法满足缺口][21],编程也是[工资最高][22]和[工作满足感最强][23]的众多职业之一。也难怪越来越多的人都想进入这个行业。 + + +但是你要怎么做才能正确地入行呢?“**我应该怎么学习编程?**”是初学者常见的一个问题。尽管我没有这些问题的全部答案,但是我希望这篇文章能够给你提供相关指导来帮助你找到最适合你的需求和自身情况发展的解决办法。 + + +### 你的学习方式是什么? + +Before you start your learning process, consider not only your options, but also yourself. The ancient Greeks had a saying, [γνῶθι σεαυτόν][24] (gnothi seauton), meaning "know thyself". Undertaking a large learning program is difficult. Self awareness is necessary to make sure you are making the choices that will lead to the highest chance of success. Be honest with yourself when you answer the following questions: + + +在你开始学习编程之前,你需要考虑的不仅仅是你的方向选择,还要更多的考虑下你自己。古罗马人有句谚语,[γνῶθι σεαυτόν][24](gnothi seauton),意思是“认识你自己”。进行一个大型的编程学习难度不小。足够的自我认识是非常有必要的,这能够确保你做出的选择通向成功的机会非常大。你需要思考并诚实地回答接下来的这些问题: + + +* **你最喜欢什么样的学习方式?**怎么做你才能学到最好?是通过阅读的方式吗?还是听讲座?还是主要通过动手实践?你需要选择对你最有效的方法。不要仅仅因为这种学习方法流行或者有其他人说过这种方法对他们很有用就选择了这种方法。 + + +* **你的需要和要求是什么?**你为什么想学习如何编程?是因为你只是想换一份工作吗?如果是这样的话,你需要多次时间才能完成呢?你要牢记,这些是_需要的_ ,不是_想要的_ 。你可能_想要_下周就换份新工作,但是_需要_ 有人在接下来的一年里帮忙供养你的正在成长的家庭。当你在人生的道路上面临方向的抉择时,时间的安排特别重要。 + + +* **你能获取的参考资料有哪些?**当然,重返大学并获得一份计算机科学专业的学位证书可能也不错,但是你必须对你自己实事求是面对现实。你的生活必须和你学习相适应。你能承受花费几个月的时间和不菲的费用去参加集训吗?你是否生活在一个提供学习机会的地方,比如提供技术性的聚会或者大学课程?你能获取到的参考资料会对你的学习过程产生巨大的影响。在打算学编程换工作前先调查好这些。 + + +### 选择一门编程语言 + + +当你打算开始你的编程学习之路和考虑你的选择的时候,请记住不管其他人说什么,选择哪门编程语言来开始你的编程学习 _关系不大_。是的,是有些编程语言比其他的更流行。比如,根据一份调查研究,目前 JavaScript,Java,PHP, 和 Python 处于 [最受欢迎最流行的编程][25] 中的前排。但是现在正流行的编程语言有可能过几年就过时了,所以不用太纠结编程语言的选择。像那些方法,类,函数,条件,控制流程和其他的编程的概念思想等等,不管你选的哪门编程语言,他们的底层原理基本保持一致。只有语法和社区的实例会变。因此你能够用 [Perl][26] 学习编程,也可以用 [Swift][27] 或者 [Rust][28]。作为一个程序员,你会在你的职业生涯里用很多不同的编程语言来工作。不要认为你被困在了编程语言的选择上。 + + + +### Test the waters + +### 市场测试 + + +除非你已经涉足过这个行业或者确信你愿意花费你生命的剩余时光来编程,我建议你最好还是潜水之前先用脚趾头来试试水温之类的来判断这水适不适合潜水。这种工作不是每个人都能做的。在把全部希望都压在学习编程之前,你可以先尝试花费少量时间金钱来学习一小部分知识点来了解自己是否会享受这种每周起码花费 40 个小时来编码工作的生活。如果你不喜欢这种工作,你不太可能完成编程项目的学习。即便你完成结束了编程的学习阶段,你也会在你以后的编程工作中感到无比痛苦。人生苦短就不要花费你人生三分之一的时间来做你不喜欢的事了。  + + +谢天谢地,软件开发不仅仅需要编程。熟悉编程概念和理解软件是怎么和他们结合在一起的是非常有用的,但是你不需要成为一个程序员也能在软件开发行业中找到一份报酬不菲的工作。在软件开发过程中,额外的重要角色有技术文档撰写人、项目经理、产品经理、测试人员、设计人员、用户体验设计者、运维/系统管理员和数据科学家等。软件成功的启动需要很多角色的人之间相互配合。不要觉得学习了编程就要求你成为一个程序员。你需要探索你的选择并确定哪个选择才是最适合你的。 + + +### 参考的学习资料 + + +你对学习参考资料的选择是什么?可能正如你已经发现的那样,可供选择的参考资料非常多,尽管在你的那片区域不是所有的资料都能够获得。 + + +* **训练营**:最近这几年像 [App Academy][5] 和 [Bloc][6] 这样的训练营越来越流行。训练营通常收费 $10K或者更多,他们宣称在几周内就能够把一个学生培训成一个称职的程序员。在参加编程集训营前,你需要研究下你将要学习的项目能确保正如它所承诺的那样,学生学完毕业后能够找到一个高薪的长期供职的职位。一方面花费了数目不小的钱财,而且时间也花费了不少—通常这些都是典型的全日制课程并且要求学生在接下来的连续几周里把其他的事先放在一边专心课程学习。然而时间金钱这两项不菲的消耗通常会使很多未来的程序员无法参加训练营。 + + +* **社区学院/职业培训中心**:社区学院常常被那些研究自己对学习编程的选择的人所忽视,不得不说这些人该为自己对社区学院的忽视感到羞愧。你在社区学院或者职业培训中心能够接受到的教育是和你选择其他方式学习编程的学习效果一样有效,而且费用也不高。 + + +* **国家/地方的培训项目**:许多地区都认识到在他们的地区增加技术投资的经济效益,并且已经制定了培训计划来培养受过良好教育和准备好的劳动力。培训项目的案例包括了[Code Oregon][7] 和 [Minneapolis TechHire][8]。检查下你的州、省或自治区是否提供这样的项目。 + + +* **在线训练**:许多公司和组织都提供在线技术培训项目。比如,[Linux Foundation][9]致力于通过开源技术使人们获得成功。其他的像[O'Reilly Media][10], [Lynda.com][11], 和 [Coursera][12]在软件开发涉及的许多方面提供培训。[Codecademy][13]提供对编程概念的在线介绍。每个项目的成本会有所不同,但大多数项目会允许你在你的日程安排中学习。 + + +* **MOOCs**:在过去的几年里,moocs-大规模开放在线课程的发展势头已经很好了。像 [Harvard][14], [Stanford][15], [MIT][16] 和其他的一些世界一流大学他们一直在记录他们的课程,并免费提供在线课程。课程的自我指导性质可能并不适合所有人,但可利用的材料使这成为一个有价值的学习选择。 + + +* **专业书籍**:许多人喜欢用书自学。这是相当经济的,在初步学习阶段后提供了现成的参考资料。尽管你可以通过在线服务订购和访问图书像[Safari][17] 和 [Amazon][18],但是也不要忘了检查你本地的公共图书馆。 + + +### 网络支持 + + +无论你选择哪一种学习资源,有网络支持都将获得更大的成功。与他人分享你的经历和挑战可以帮助你保持动力,同时为你提供一个安全的地方去问那些你可能还没有足够自信到其他地方去问的问题。许多城镇都有当地的用户群聚在一起讨论和学习软件技术。通常你可以在 [Meetup.com][29] 这里找到。专门的兴趣小组,比如 [Women Who Code][30] 和 [Code2040][31],在大多数城市地区,经常举行会议和黑客马拉松活动,这是在你学习的时候,一个很好的方式来结识并建立一个支持网络。一些软件会议举办“黑客日”,在那里你可以遇到有经验的软件开发人员,他们能够帮助你解决你所困扰的一些问题。例如,每年的[PyCon][32]会议都会提供几天的时间来让人们聚集在一起工作、研讨。一些项目,比如[BeeWare][33],使用这些短暂的时间来帮助新程序员学习和对这些项目做贡献。 + + +你的网络支持不需要来自正式的聚会。一个小的学习小组可以有效地保持你的学习积极性,并且可以像在你最喜欢的社交网络上发布邀请一样容易形成。如果你生活在一个没有大量软件开发人员的社区来支持几个meetups和用户组,那么这一点特别有用。 + + +### 开始学习编程的几个步骤 + +In summary, to give yourself the best chance of success should you decide to learn to program, follow these steps: + +1. Gather your list of requirements/needs and resources + +2. Research the options available to you in your area + +3. Discard the options that do not meet your requirements and resources + +4. Select the option(s) that best suit your requirements, resources, and learning style + +5. Find a support network + +简单的来说,既然你决定学习编程,可以参考这几个方法给自己一个尽可能成功的机会: + +1. 将你的需要/需求和参考学习资料列出清单并进行收集 + +2. 搜寻在你的当地那里能够可用的选择 + +3. 放弃不能符合你的需求和参考学习资料的选择 + +4. 选择最符合你需求的和最适合你的学习参考资源 + +5. 找到一个能够得到支持的网络 + + +务必牢记:你的学习过程永远不会结束。高速发展的软件产业,会导致新技术和新进展几乎每天都会出现。一旦你学会了编程,你就必须花时间去学习适应这些新的进步。你不能依靠你的工作来为你提供这种培训。只有你自己负责自己的职业发展,所以如果你想保持最新的技术和工作能力,你必须紧跟行业最新的技术。 + + +祝你好运! + +-------------------------------------------------------------------------------- + +作者简介: + + +VM (Vicky) Brasseur - VM (aka Vicky) 是一个技术人员,也是项目、工作进程、产品和企业的经理。在她的长达 18 年的科技行业里,她曾是一名分析师、程序员、产品经理、软件工程经理和软件工程总监。目前,她是惠普企业上游开源开发团队的高级工程经理。她的博客是 anonymoushash.vmbrasseur.com,推特是 @vmbrasseur。  + + + + + +-------- + +via: https://opensource.com/article/17/4/how-get-started-learning-program + +作者:[VM (Vicky) Brasseur ][a] +译者:[WangYueScream](https://github.com/WangYueScream) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/vmbrasseur +[1]:https://opensource.com/tags/python?src=programming_resource_menu +[2]:https://opensource.com/tags/javascript?src=programming_resource_menu +[3]:https://opensource.com/tags/perl?src=programming_resource_menu +[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu +[5]:https://www.appacademy.io/ +[6]:https://www.bloc.io/ +[7]:http://codeoregon.org/ +[8]:http://www.minneapolismn.gov/cped/metp/TechHire#start +[9]:https://training.linuxfoundation.org/ +[10]:http://shop.oreilly.com/category/learning-path.do +[11]:https://www.lynda.com/ +[12]:https://www.coursera.org/ +[13]:https://www.codecademy.com/ +[14]:https://www.edx.org/school/harvardx +[15]:http://online.stanford.edu/courses +[16]:https://ocw.mit.edu/index.htm +[17]:https://www.safaribooksonline.com/ +[18]:https://amazon.com/ +[19]:https://opensource.com/article/17/4/how-get-started-learning-program?rate=txl_aE6F2oOUSgQDveWFtrPWIbA1ULFwfOp017zV35M +[20]:https://commons.wikimedia.org/wiki/File:Roman-mosaic-know-thyself.jpg +[21]:http://www.techrepublic.com/article/report-40-of-employers-worldwide-face-talent-shortages-driven-by-it/ +[22]:http://web.archive.org/web/20170328065655/http://www.businessinsider.com/highest-paying-jobs-in-america-2017-3/#-25 +[23]:https://stackoverflow.com/insights/survey/2017/#career-satisfaction +[24]:https://en.wikipedia.org/wiki/Know_thyself +[25]:https://stackoverflow.com/insights/survey/2017/#most-popular-technologies +[26]:https://learn.perl.org/tutorials/ +[27]:http://shop.oreilly.com/product/0636920045946.do +[28]:https://doc.rust-lang.org/book/ +[29]:https://www.meetup.com/ +[30]:https://www.womenwhocode.com/ +[31]:http://www.code2040.org/ +[32]:https://us.pycon.org/ +[33]:http://pybee.org/ +[34]:https://opensource.com/user/10683/feed +[35]:https://opensource.com/article/17/4/how-get-started-learning-program#comments +[36]:https://opensource.com/users/vmbrasseur From 0f6dd46c01b9d11a378833f8d3f808ca43bb7b48 Mon Sep 17 00:00:00 2001 From: xiaow6 Date: Thu, 6 Jul 2017 17:03:54 +0800 Subject: [PATCH 0627/1407] translated by xiaow6 --- ...rverless with Apex and Composes MongoDB.md | 203 ------------------ ...rverless with Apex and Composes MongoDB.md | 201 +++++++++++++++++ 2 files changed, 201 insertions(+), 203 deletions(-) delete mode 100644 sources/tech/20161006 Go Serverless with Apex and Composes MongoDB.md create mode 100644 translated/tech/20161006 Go Serverless with Apex and Composes MongoDB.md diff --git a/sources/tech/20161006 Go Serverless with Apex and Composes MongoDB.md b/sources/tech/20161006 Go Serverless with Apex and Composes MongoDB.md deleted file mode 100644 index 7df4c4523c..0000000000 --- a/sources/tech/20161006 Go Serverless with Apex and Composes MongoDB.md +++ /dev/null @@ -1,203 +0,0 @@ -translating by xiaow6 - -# Go Serverless with Apex and Compose's MongoDB - -_Apex is tooling that wraps the development and deployment experience for AWS Lambda functions. It provides a local command line tool which can create security contexts, deploy functions, and even tail cloud logs. While AWS's Lambda service treats each function as an independent unit, Apex provides a framework which treats a set of functions as a project. Plus, it even extends the service to languages beyond just Java, Javascript, and Python such as Go._ - -Two years ago the creator of Express, the almost de facto web framework for NodeJS, said [goodbye][12] to the Node community and turned his attention to Go, the backend services language from Google, and Lambdas, the Functions as a Service offering from AWS. While one developer's actions don't make a trend, it is interesting to look at the project he has been working on named [Apex][13] because it may portend some changes in how a good portion of the web will be delivered in the future. - -##### What is a Lambda? - -Currently, if one doesn't run their own hardware they pay to run some kind of virtual server in the cloud. On it they deploy a complete stack such as Node, Express, and a custom application. Or if they have gone further with something like a Heroku or Bluemix, then they deploy their full application to some preconfigured container that already has Node setup and they just deploy the application's code. - -The next step up the abstraction ladder is to deploy just the functions themselves to the cloud without even a full application. These functions can then be triggered by a variety of external events. For example, AWS's API Gateway service can proxy HTTP requests as events to these functions and the Function as a Service provider will execute the mapped function on demand. - -###### Getting Started with Apex - -Apex is a command line tool which wraps the AWS CLI (Command Line Interface). So, the first step to getting started with Apex is to ensure that you have the command line tools from AWS installed and configured (see [AWS CLI Getting Started][14] or [Apex documentation][15]). - -Next install Apex: - -`curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh` - -Then create a directory for your new project and run: - -`apex init` - - ![apexInit](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620758/nzjk1pi1rce1yarbp6xl.png) - -This sets up some of the necessary security policies and even appends the project name to the functions since the Lambda namespace is flat. It also creates some config and the functions directory with a default "Hello World" style function in Javascript. - - ![tree](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620765/bbsb8h6nkc9nx2qs0foa.png) - -One of the nice things about Apex/Lambdas is that creating a function is really straightforward. Create a new directory with the name of your function and then in that create the program. To use Go, you could create a directory named `simpleGo` then in that create a small `main` program: - - ![tree2](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620769/lthziblpv8iod2muyqwn.png) - -``` -// serverless/functions/simpleGo/main.go -package main - -import ( - "encoding/json" - "github.com/apex/go-apex" - "log" -) - -type helloEvent struct { - Hello string `json:"hello"` -} - -func main() { - apex.HandleFunc(func(event json.RawMessage, ctx *apex.Context) (interface{}, error) { - var h helloEvent - if err := json.Unmarshal(event, &h); err != nil { - return nil, err - } - log.Print("event.hello:", h.Hello) - return h, nil - }) -} -``` - -Apex uses a NodeJS shim, since Node is a supported runtime of Lambda, to call the binary which is created from the above program. It passes the `event` into the binary's STDIN and takes the `value` returned from the binary's STDOUT. It logs via STDERR. The `apex.HandleFunc` manages all of the piping for you. Really it is a very simple solution in the Unix tradition. You can even test it from the command line locally with a `go run main.go`: - - ![goRun](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620784/ddb0vkcef50pnjgfdqn7.png) - -Deploying to the cloud is trivial with Apex: - - ![apexDeploy](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620790/x6l8qg2vticpxhzi7kl3.png) - -Notice that it namespaced your function, managed versioning, and even had a place for some `env` things which we could have used for multiple development environments like `staging` and `production`. - -Executing on the cloud is trivial too with `apex invoke`: - - ![apexInvoke](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620796/jccxskukvy5utgegy2hr.png) - -And we can even tail some logs: - - ![apexLog](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620802/ym3z6w8ojmrq7pucr5bp.png) - -Those are results from AWS CloudWatch. They are available in the AWS UI but when developing it is much faster to follow them like this in another terminal. - -##### What's Inside? - -It is instructive to see inside the artifact that is actually deployed. Apex packages up the shim and everything needed for the function to run. Plus, it goes ahead and configures things like the entry point and security roles: - - ![lambdaConfig](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620812/zz6qwocvuhhl4lq6bf4p.png) - -The Lambda service actually accepts a zip archive with all of the dependencies which it deploys to the servers that execute the function. We can use `apex build ` to create an archive locally which we can then unzip to explore: - - ![apexBuild](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620818/ybidaj2i2ijurjbcqrx2.png) - -The `_apex_index.js handle` function is the original entry point. It sets up some environment variables and then calls into `index.js`.  -The `index.js` spawns a child process of the `main` Go binary and wires everything together. - -##### Go Further with `mgo` - -The Golang driver for MongoDB is called `mgo`. Using Apex to create a function that connects to Compose's MongoDB is almost as straightforward as the `simpleGo`function which we have been reviewing. Here we'll create a new function by adding a directory called `mgoGo` and creating another `main.go`: - -``` -// serverless/functions/mgoGo/main.go - -package main - -import ( - "crypto/tls" - "encoding/json" - "github.com/apex/go-apex" - "gopkg.in/mgo.v2" - "log" - "net" -) - -type person struct { - Name string `json:"name"` - Email string `json:"email"` -} - -func main() { - apex.HandleFunc(func(event json.RawMessage, ctx *apex.Context) (interface{}, error) { - tlsConfig := &tls.Config{} - tlsConfig.InsecureSkipVerify = true - - //connect URL: - // "mongodb://:@:,:/ - dialInfo, err := mgo.ParseURL("mongodb://apex:mountain@aws-us-west-2-portal.0.dblayer.com:15188, aws-us-west-2-portal.1.dblayer.com:15188/signups") - dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) { - conn, err := tls.Dial("tcp", addr.String(), tlsConfig) - return conn, err - } - session, err := mgo.DialWithInfo(dialInfo) - if err != nil { - log.Fatal("uh oh. bad Dial.") - panic(err) - } - defer session.Close() - log.Print("Connected!") - - var p person - if err := json.Unmarshal(event, &p); err != nil { - log.Fatal(err) - } - - c := session.DB("signups").C("people") - err = c.Insert(&p) - if err != nil { - log.Fatal(err) - } - - log.Print("Created: ", p.Name," - ", p.Email) - return p, nil - }) -} -``` - -Post deploy. We can invoke with the correct kind of event to mimic calling an API: - - ![apexMgo](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620829/jeprb3r6qrgjkzblkhho.png) - -The net result is to `insert` into [MongoDB on Compose][16]: - - ![composeDeploy](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620833/vdy8hjiwxpe02evgqwcm.png) - -##### So Much More... - -While we have covered a lot of ground so far with Apex there are many more things to explore. There is integration with [Terraform][17]. You could deliver a polyglot language project with Javascript, Java, Python and Go if you so desired. You could configure multiple environments for things like development, staging, and production. You could tweak the runtime resources by sizing memory and timeouts which effects pricing. And you could hook functions up to the API Gateway to deliver an HTTP API or use something like SNS (Simple Notification Service) to build pipelines of functions in the cloud. - -Like most things, Apex and Lambdas aren't perfect for every scenario. Functions with high IO waits defeat the purpose of paying for compute time. But, adding a tool to your toolbox that requires no infrastructure management on your part at all makes good sense. - --------------------------------------------------------------------------------- - -作者简介: - -Hays Hutton writes code and then writes about it. Love this article? Head over to [Hays Hutton’s author page][a] and keep reading. - --------------------------------------------------------------------------------- - -via: https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/ - -作者:[Hays Hutton][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.compose.com/articles/author/hays-hutton/ -[1]:https://twitter.com/share?text=Go%20Serverless%20with%20Apex%20and%20Compose%27s%20MongoDB&url=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/&via=composeio -[2]:https://www.facebook.com/sharer/sharer.php?u=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/ -[3]:https://plus.google.com/share?url=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/ -[4]:http://news.ycombinator.com/submitlink?u=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/&t=Go%20Serverless%20with%20Apex%20and%20Compose%27s%20MongoDB -[5]:https://www.compose.com/articles/rss/ -[6]:https://unsplash.com/@esaiastann -[7]:https://www.compose.com/articles -[8]:https://www.compose.com/articles/tag/go/ -[9]:https://www.compose.com/articles/tag/mgo/ -[10]:https://www.compose.com/articles/tag/mongodb/ -[11]:https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/#search -[12]:https://medium.com/@tjholowaychuk/farewell-node-js-4ba9e7f3e52b#.dc9vkeybx -[13]:http://apex.run/ -[14]:http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html -[15]:http://apex.run/ -[16]:https://www.compose.com/articles/composes-new-primetime-mongodb/ -[17]:https://www.terraform.io/ diff --git a/translated/tech/20161006 Go Serverless with Apex and Composes MongoDB.md b/translated/tech/20161006 Go Serverless with Apex and Composes MongoDB.md new file mode 100644 index 0000000000..35e3341ff7 --- /dev/null +++ b/translated/tech/20161006 Go Serverless with Apex and Composes MongoDB.md @@ -0,0 +1,201 @@ + +# 使用 Apex 和 Compose's MongoDB 开发 serverless + +_Apex 是一个将开发和部署 AWS Lambda 函数的过程打包了的工具。它提供了一个本地命令行工具来创建安全上下文,部署函数,甚至追踪云端日志。由于 AWS Lambda 服务将函数看成独立的单元,Apex 提供了一个框架层将一系列函数作为一个项目。另外,它将服务拓展到不仅仅是 Java,Javascript 和 Ptyhon,更例如Go语言。_ + +两年前 Express (基本上是 NodeJS 实际的网络框架层)的作者,离开了 Node 社区,而将其注意力转向 Go,谷歌创造的后端服务语言,以及 Lambda, 由 AWS 提供的函数即服务。尽管一个开发者的行为无法引领一股潮流,但是来看看他正在做的名叫 [Apex][13] 项目会很有趣,因为它可能预示着未来很大一部分网络开发的改变。 +##### 什么是 Lambda? + +如今,人们如果不能运行自己的硬件,他们会选择付费使用一些云端的虚拟服务器。在云上,他们 +部署一个完整的协议栈如 Node,Express, 和一个自定义应用。或者如果他们探索了更远,使用了诸如 Heroku 或者 Bluemix 之类的新玩意,也可能在某些已经预配置好 Node 的容器中仅仅通过部署应用代码来部署他们完整的应用。 + +在这个抽象阶梯上的下一步是来单独部署函数到云端而不是一个完整的应用。这些函数之后可以被一大堆外部事件触发。例如,AWS 的 API 网关服务可以将代理 HTTP 请求作为触发函数的事件,而函数即服务供应方根据要求执行匹配的函数。 + +###### 从 Apex 开始 + +Apex 是一个将 AWS 命令行接口封装起来的命令行工具。因此,开始使用 Apex 的第一步就是确保你已经安装和配置了的从 AWS 获取的命令行工具(详情请查看 [AWS CLI Getting Started][14]或者 [Apex documentation][15])。 + +接下来,安装 Apex: + +`curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh` + +然后为你的新项目创建一个目录并运行: + +`apex init` + + ![apexInit](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620758/nzjk1pi1rce1yarbp6xl.png) + +这步会配置好一些必须的安全策略,并且将项目名字赋在函数名后,因为 Lambda 使用扁平化的命名空间。同时它也会创建一些配置文件 拥有一个 “Hello World" 风格的 Javascript 函数的functions 目录。 + + ![tree](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620765/bbsb8h6nkc9nx2qs0foa.png) + +Apex/Lambda 一个非常友好的特性是创建函数非常直观。创建一个以你函数名为名的新目录,然后在其中创建项目。如果想要使用 Go 语言,你可以创建一个叫 `simpleGo` 的目录然后在其中创建一个小型的 `main` 函数: +``` +// serverless/functions/simpleGo/main.go +package main + +import ( + "encoding/json" + "github.com/apex/go-apex" + "log" +) + +type helloEvent struct { + Hello string `json:"hello"` +} + +func main() { + apex.HandleFunc(func(event json.RawMessage, ctx *apex.Context) (interface{}, error) { + var h helloEvent + if err := json.Unmarshal(event, &h); err != nil { + return nil, err + } + log.Print("event.hello:", h.Hello) + return h, nil + }) +} +``` + +Node 是 Lambda 支持的运行环境,Apex 使用 NodeJS shim 来调用由上述程序产生的二进制文件。它将 `event` 传入二进制文件的 STDIN,将从二进制返回的 STDOUT 作为`value`。通过 STDERR 来显示 log。`apex.HandleFunc` 用来为你管理所有的管道。事实上在 Unix 惯例里这是一个非常简单的解决方案。你甚至可以通过在本地命令行执行 `go run main.go` 来测试它。 + + ![goRun](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620784/ddb0vkcef50pnjgfdqn7.png) + + +通过 Apex 向云端部署稍显琐碎:![apexDeploy](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620790/x6l8qg2vticpxhzi7kl3.png) + + + 注意,这将会对你的函数指定命名空间,控制版本,甚至为其他多开发环境如 `staging` 和 `production`配置`env`。 + +通过 `apex invoke` 在云端执行也比较琐碎: + +![apexInvoke](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620796/jccxskukvy5utgegy2hr.png) + + +当然我们也可以追踪一些日志: ![apexLog](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620802/ym3z6w8ojmrq7pucr5bp.png) + +这些是从 AWS CloudWatch 返回的结果。它们都在 AWS 的 UI 中可见,但是当在另一个终端参照此结果来署它会更快。 + +##### 窥探内部的秘密 + + +来看看它内部到底部署了什么很具有指导性。Apex 将 shim 和所有需要用来运行函数的东西打包起来。另外,它会提前做好配置如入口与安全条例: + + ![lambdaConfig](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620812/zz6qwocvuhhl4lq6bf4p.png) + +Lambda 服务实际上接受一个包含所有依赖的 zip 压缩包,它会被部署到服务器来执行指定的函数。我们可以使用 `apex build ` 在本地创建一个压缩包用来在以后解压以探索。 + + ![apexBuild](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620818/ybidaj2i2ijurjbcqrx2.png) + + +这里的 `_apex_index.js handle` 函数是原始的入口。它会配置好一些环境变量然后进入 `index.js`。 + +而 `index.js` 孕育一个 `main` Go 的二进制文件的子进程并且将所有关联联结在一起。 + + + +##### 使用 `mgo` 继续深入 + + +`mgo` 是 Go 语言的 MongoDB 驱动。使用 Apex 来创建一个函数来连接到 Compose 的 MongoDB 就如同我们已经学习过的 `simpleGo` 函数一样直观。这里我们会通过增加一个 `mgoGo` 目录和另一个 `main.go` 来创建一个新函数。 + +``` +// serverless/functions/mgoGo/main.go + +package main + +import ( + "crypto/tls" + "encoding/json" + "github.com/apex/go-apex" + "gopkg.in/mgo.v2" + "log" + "net" +) + +type person struct { + Name string `json:"name"` + Email string `json:"email"` +} + +func main() { + apex.HandleFunc(func(event json.RawMessage, ctx *apex.Context) (interface{}, error) { + tlsConfig := &tls.Config{} + tlsConfig.InsecureSkipVerify = true + + //connect URL: + // "mongodb://:@:,:/ + dialInfo, err := mgo.ParseURL("mongodb://apex:mountain@aws-us-west-2-portal.0.dblayer.com:15188, aws-us-west-2-portal.1.dblayer.com:15188/signups") + dialInfo.DialServer = func(addr *mgo.ServerAddr) (net.Conn, error) { + conn, err := tls.Dial("tcp", addr.String(), tlsConfig) + return conn, err + } + session, err := mgo.DialWithInfo(dialInfo) + if err != nil { + log.Fatal("uh oh. bad Dial.") + panic(err) + } + defer session.Close() + log.Print("Connected!") + + var p person + if err := json.Unmarshal(event, &p); err != nil { + log.Fatal(err) + } + + c := session.DB("signups").C("people") + err = c.Insert(&p) + if err != nil { + log.Fatal(err) + } + + log.Print("Created: ", p.Name," - ", p.Email) + return p, nil + }) +} +``` + + + 发布部署,我们可以通过使用正确类型的事件来模拟调用了一个 API:![apexMgo](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620829/jeprb3r6qrgjkzblkhho.png) + + 最终结果是 `insert` 到在 [Compose 之上 的MongoDB][16] 中。![composeDeploy](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620833/vdy8hjiwxpe02evgqwcm.png) + +##### 还有更多…… + +尽管目前我们已经涉及了 Apex 的方方面面,但是仍然有很多值得我们去探索的东西。它还和 [Terraform][17] 进行了整合。如果你真的希望,你可以发布一个多语言项目包括 Javascript,Java, Python 以及 Go。你也可以为开发、策划以及量产配置多种环境。你可以调整运行资源如调整存储大小和运行时间来调整成本。而且你可以把函数勾连到 API 网关上来传输一个 HTTP API 或者使用一些类似 SNS (简单通知服务)来为云端的函数创建管道。 + +和大多数事物一样,Apex 和 Lambda 并不是在所有场景下都完美。 但是,在你的工具箱中增加一个完全不需要你来管理底层建设的工具完全没有坏处。 + +-------------------------------------------------------------------------------- + +作者简介: + +Hays Hutton 喜欢写代码并写一些与其相关的东西。喜欢这篇文章?请前往[Hays Hutton’s author page][a] 继续阅读其他文章。 + +-------------------------------------------------------------------------------- + +via: https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/ + +作者:[Hays Hutton][a] +译者:[xiaow6](https://github.com/xiaow6) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.compose.com/articles/author/hays-hutton/ +[1]:https://twitter.com/share?text=Go%20Serverless%20with%20Apex%20and%20Compose%27s%20MongoDB&url=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/&via=composeio +[2]:https://www.facebook.com/sharer/sharer.php?u=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/ +[3]:https://plus.google.com/share?url=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/ +[4]:http://news.ycombinator.com/submitlink?u=https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/&t=Go%20Serverless%20with%20Apex%20and%20Compose%27s%20MongoDB +[5]:https://www.compose.com/articles/rss/ +[6]:https://unsplash.com/@esaiastann +[7]:https://www.compose.com/articles +[8]:https://www.compose.com/articles/tag/go/ +[9]:https://www.compose.com/articles/tag/mgo/ +[10]:https://www.compose.com/articles/tag/mongodb/ +[11]:https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongodb/#search +[12]:https://medium.com/@tjholowaychuk/farewell-node-js-4ba9e7f3e52b#.dc9vkeybx +[13]:http://apex.run/ +[14]:http://docs.aws.amazon.com/cli/latest/userguide/cli-chap-getting-started.html +[15]:http://apex.run/ +[16]:https://www.compose.com/articles/composes-new-primetime-mongodb/ +[17]:https://www.terraform.io/ From c3a8e6d40cf89a1fffa82e54b327056ef0775232 Mon Sep 17 00:00:00 2001 From: Zhipeng Li Date: Thu, 6 Jul 2017 19:54:55 +0800 Subject: [PATCH 0628/1407] Update 20170629 Kubernetes Why does it matter.md --- sources/tech/20170629 Kubernetes Why does it matter.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170629 Kubernetes Why does it matter.md b/sources/tech/20170629 Kubernetes Why does it matter.md index 9407576aa5..1c4ba9105a 100644 --- a/sources/tech/20170629 Kubernetes Why does it matter.md +++ b/sources/tech/20170629 Kubernetes Why does it matter.md @@ -1,3 +1,4 @@ +Translating by Zhipeng-li Kubernetes: Why does it matter? ============================================================ From 96bd08c946a4705cea56642108966317d7531f43 Mon Sep 17 00:00:00 2001 From: XYenChi <466530436@qq.com> Date: Thu, 6 Jul 2017 20:02:00 +0800 Subject: [PATCH 0629/1407] Update 20170126 A 5-step plan to encourage your team to make changes on your project.md A 5-step plan to encourage your team to make changes on your project --- ...lan to encourage your team to make changes on your project.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/talk/20170126 A 5-step plan to encourage your team to make changes on your project.md b/sources/talk/20170126 A 5-step plan to encourage your team to make changes on your project.md index 746c36edc7..013680a401 100644 --- a/sources/talk/20170126 A 5-step plan to encourage your team to make changes on your project.md +++ b/sources/talk/20170126 A 5-step plan to encourage your team to make changes on your project.md @@ -1,3 +1,4 @@ +translating by XYenChi A 5-step plan to encourage your team to make changes on your project ============================================================ From 3686950b220ee56d19719162871720d7beb77ee7 Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 7 Jul 2017 08:59:09 +0800 Subject: [PATCH 0630/1407] translated --- ...y-Focused Open-Source Skype Alternative.md | 90 ------------------- ...y-Focused Open-Source Skype Alternative.md | 83 +++++++++++++++++ 2 files changed, 83 insertions(+), 90 deletions(-) delete mode 100644 sources/tech/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md create mode 100644 translated/tech/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md diff --git a/sources/tech/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md b/sources/tech/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md deleted file mode 100644 index c8d73a3db4..0000000000 --- a/sources/tech/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md +++ /dev/null @@ -1,90 +0,0 @@ -translating----geekpi - -Ring is a Privacy-Focused, Open-Source Skype Alternative -============================================================ - - -[![](https://mintguide.org/uploads/posts/2017-06/thumbs/1498158697_screenshot-at-2017-06-22-12-08-39.png)][13] - -**If you’re sick of Skype for [Linux][2]’s lack of progress, or rankled by the imminent[][1][ retirement of the older (but superior) Qt Skype client,][3] there’s a GNU alternative in town called Ring.** - -Hi, User. It seems that you are using **AdBlock** or similar. MintGuide develops and exists through advertising revenue. - -
**Add us to the exceptions**. -We do not use Intrusive advertising!
- -GNU Ring is a cross-platform, privacy-minded communication app that is fast gaining a following in FOSS and security-conscious circles. - -Like an **open-source alternative to Skype **sans the baggage that [Microsoft][7]’s VoIP client comes saddled with, Ring is not only able to do most of what Skype can do, but does it in a secure, reassuringly private way: - -* Voice calls - -* Conference calls - -* Video calls - -* Instant messaging - -All of these features work across devices, too. It doesn’t matter if your mates are using Ring for [Windows][8], or Ring for Android. So long as they’re on Ring you can, well, ring ’em! - -Ring works over a distributed peer network. This means it doesn’t rely on one big centralized server that stores all your details, call history and account info. Instead, the service uses distributed hash tables to establish communication. - -The [][4][Ring website][9] touts end-to-end encryption with authentification (sic), manages identity with X.509 certificates, and is based on RSA/AES/DTLS/SRTP technologies - -### Download Ring for [Linux][10] - -You can [][5][download Ring for Linux][11] from the project website or follow along with the installation instructions listed to add the official Ring repo on Ubuntu. There are two versions of the client available: a KDE version and a GNOME version. - -If you’re running Ubuntu with Unity, or GNOME Shell, then opt for the GNOME version. - -If you’re at all confused about installing it there’s a [][6][step-by-step tutorial][12] on the project website. - -The official website also has handy links to apps for Windows, macOS, and Android. - -#### Getting Set Up with Ring on Ubuntu - -Once you have installed the Ring Linux client you’re almost good to go: you just to get set up with a Ring ID before you can make or take calls. - -Getting set up with Ring is different to Skype, Telegram and WhatsApp do it. You’re **not**tied to a specific mobile number or an email address. - -Instead, Ring will ask you to enter a username (you can enter anything) and then assigned you a lengthy identification number. It’s this identification number you will need to send to other Ring users so they can call you. - -To **make your first call with Ring** you need to enter a contact’s Ring ID in the search bar of the main app, then click on the phone icon button to trigger the call. - -Everything else should be relatively straightforward. You can install Ring on other devices and authenticate them with your account so that you never miss a call (if you install it on Android you can scan a Qr code for faster set-up). - -Details and configurations for Ring are stored in the ‘dring.yml’ file stashed in your home folder’s config directory. - -### How Well Does Ring Work? - -The “sucky” part of this post is telling you how well Ring works: I don’t know because I don’t know anyone else who uses Ring. As such I haven’t had a chance to actually use it. - -I did try to Google for Ring reviews but this was a nightmare because the app name is so ubiquitous (I am now very well informed about the Ring video doorbell, though). - - _**If you already use Ring, or you’re able to persuade at least one person you know to try it out, do come back to share a word or two about the connection quality and performance. **_ - --------------------------------------------------------------------------------- - -via: https://mintguide.org/internet/795-ring-is-a-privacy-focused-open-source-skype-alternative.html - -作者:[fabiomorales9999][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://mintguide.org/user/fabiomorales9999/ -[1]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cDovL3d3dy5vbWd1YnVudHUuY28udWsvMjAxNy8wNi9za3lwZS00LTMtbGludXgtc3RvcC13b3JraW5nLWp1bHktMjAxNw%3D%3D -[2]:https://mintguide.org/ -[3]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cDovL3d3dy5vbWd1YnVudHUuY28udWsvMjAxNy8wNi9za3lwZS00LTMtbGludXgtc3RvcC13b3JraW5nLWp1bHktMjAxNw%3D%3D -[4]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4 -[5]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4L2VuL2Rvd25sb2FkL2dudS1saW51eA%3D%3D -[6]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4L2VuL3R1dG9yaWFscy9nbnUtbGludXgjUmluZ0lE -[7]:https://mintguide.org/tools/537-crossover-run-any-windows-programs-on-linux-mint.html -[8]:https://mintguide.org/tools/537-crossover-run-any-windows-programs-on-linux-mint.html -[9]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4 -[10]:https://mintguide.org/ -[11]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4L2VuL2Rvd25sb2FkL2dudS1saW51eA%3D%3D -[12]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4L2VuL3R1dG9yaWFscy9nbnUtbGludXgjUmluZ0lE -[13]:https://mintguide.org/uploads/posts/2017-06/1498158697_screenshot-at-2017-06-22-12-08-39.png -[14]:https://mintguide.org/internet/ diff --git a/translated/tech/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md b/translated/tech/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md new file mode 100644 index 0000000000..01ada9ad61 --- /dev/null +++ b/translated/tech/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md @@ -0,0 +1,83 @@ +Ring 是一个专注隐私,开源的 Skype 替代品 +============================================================ + + +[![](https://mintguide.org/uploads/posts/2017-06/thumbs/1498158697_screenshot-at-2017-06-22-12-08-39.png)][13] + +**如果你对 Linux 上的 Skype 进度不满意,或者对即将[][1][退出的旧的(但是优秀的)Qt Skype 客户端][3]感到不快,这有一个 GNU 替代品叫 Ring。** + +GNU Ring 是一个跨平台、注意隐私的交流程序,它很快得到了 FOSS 以及安全圈子的注意。 + +就像一个** Skype 的开源替代品**,没有[微软][7] VoIP 带来的那些东西,Ring 不仅能够做大多数 Skype 能够做的,还能以安全、让人放心的私人方式做到: + +* 语音电话 + +* 电话会议 + +* 视频电话 + +* 即时通信 + +所有这些功能也可以跨设备运行。你同伴使用的是使用[Windows][8] 版 Ring 或者 Android 版 Ring 都不重要。只要他们在 Ring 上,你就能联系他们! + +Ring 通过分布式对等网络工作。这意味着它不依赖于一个大型集中式服务器来存储你所有详细信息、通话记录和帐户信息。相反,该服务使用分布式哈希表建立通信。 + +[][4][Ring 网站][9]使用端到端加密的认证(sic)、使用 X.509 证书管理身份、并且基于 RSA/AES/DTLS/SRTP 技术。 + +### 下载 [Linux][10] 版 Ring + +你可以从项目网站或者按照下面的安装指导在 Ubuntu 上添加 Ring 的官方仓库来[下载 Linux 版 Ring][11]。这里有两个版本的客户端:KDE 版本和 GNOME 版本。 + +如果你运行的 Ubuntu 带有 Unity 或者 GNOME Shell,就选择 GNOME 版本。 + +如果你对安装感到疑惑,项目网站上有一个一个[][6][手把手的教程][12]。 + +官方网站上还有直接的 Windows、macOS 和 Android 版链接。 + +#### 在 Ubuntu 上设置 Ring + +当你安装完 Linux 版客户端后,你就能够使用了:在开始打电话前,你只需注册一个 Ring ID。 + +Ring 的注册不同于 Skype、Telegram 和 WhatsApp 那样。你**不必**绑定一个手机号或者邮箱。 + +取而代之的是 Ring 会要求你输入一个用户名(你可以任意输入),接着会分配你一个冗长的身份号码。你需要给其他 Ring 用户发送这个身份号码,那么他们可以给你打电话。 + +要**在 Ring 中打第一通电话**,你需要主程序的搜索栏输入联系人的 Ring ID,接着点击电话按钮拨打电话。 + +其他事情应该相对直接。你可以在其他设备上安装 Ring 并用你的帐户验证,这样你就不会错过任何一个电话(如果你在 Android 设备上安装,你可以扫描二维码来快速设置)。 + +Ring 的细节以及配置存储你家目录下的配置文件夹内的 ‘dring.yml’ 中。 + +### Ring 怎么样? + +这篇文章“垃圾”的部分是告诉你 Ring 怎么样:我不知道因为我不认识任何使用 Ring 的人。因此我没有机会真正使用它。 + +我尝试 Google 来查找 Ring 的评测,但是这是一个噩梦,因为程序的名字太普遍了(虽然我现在非常了解 Ring 视频门铃)。 + +_**如果你已经使用 Ring 或者你能够劝说至少一个你认识的人使用,那么记得回来分享一下关于连接质量和性能。**_ + +-------------------------------------------------------------------------------- + +via: https://mintguide.org/internet/795-ring-is-a-privacy-focused-open-source-skype-alternative.html + +作者:[fabiomorales9999][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://mintguide.org/user/fabiomorales9999/ +[1]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cDovL3d3dy5vbWd1YnVudHUuY28udWsvMjAxNy8wNi9za3lwZS00LTMtbGludXgtc3RvcC13b3JraW5nLWp1bHktMjAxNw%3D%3D +[2]:https://mintguide.org/ +[3]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cDovL3d3dy5vbWd1YnVudHUuY28udWsvMjAxNy8wNi9za3lwZS00LTMtbGludXgtc3RvcC13b3JraW5nLWp1bHktMjAxNw%3D%3D +[4]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4 +[5]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4L2VuL2Rvd25sb2FkL2dudS1saW51eA%3D%3D +[6]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4L2VuL3R1dG9yaWFscy9nbnUtbGludXgjUmluZ0lE +[7]:https://mintguide.org/tools/537-crossover-run-any-windows-programs-on-linux-mint.html +[8]:https://mintguide.org/tools/537-crossover-run-any-windows-programs-on-linux-mint.html +[9]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4 +[10]:https://mintguide.org/ +[11]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4L2VuL2Rvd25sb2FkL2dudS1saW51eA%3D%3D +[12]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4L2VuL3R1dG9yaWFscy9nbnUtbGludXgjUmluZ0lE +[13]:https://mintguide.org/uploads/posts/2017-06/1498158697_screenshot-at-2017-06-22-12-08-39.png +[14]:https://mintguide.org/internet/ From ec3183ff833928e107543cec68ff20a0ae2a9013 Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 7 Jul 2017 09:01:00 +0800 Subject: [PATCH 0631/1407] translating --- .../20170627 How to turn a Raspberry Pi into an eBook server.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170627 How to turn a Raspberry Pi into an eBook server.md b/sources/tech/20170627 How to turn a Raspberry Pi into an eBook server.md index bab2a2e536..7f0355226a 100644 --- a/sources/tech/20170627 How to turn a Raspberry Pi into an eBook server.md +++ b/sources/tech/20170627 How to turn a Raspberry Pi into an eBook server.md @@ -1,3 +1,5 @@ +translating---geekpi + How to turn a Raspberry Pi into an eBook server ============================================================ From 90d3d5bff88ca50ed7fb1af5d870d97546819674 Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 7 Jul 2017 11:32:19 +0800 Subject: [PATCH 0632/1407] PRF&PUB:20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @geekpi @oska874 这个网站的外链是需要解析成原地址的,此外源档中也有一些无用代码。 --- ...y-Focused Open-Source Skype Alternative.md | 36 +++++++++---------- 1 file changed, 16 insertions(+), 20 deletions(-) rename {translated/tech => published}/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md (64%) diff --git a/translated/tech/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md b/published/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md similarity index 64% rename from translated/tech/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md rename to published/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md index 01ada9ad61..a7e4e7c381 100644 --- a/translated/tech/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md +++ b/published/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md @@ -1,36 +1,32 @@ -Ring 是一个专注隐私,开源的 Skype 替代品 +Ring :一个专注隐私,开源的 Skype 替代品 ============================================================ +![](https://mintguide.org/uploads/posts/2017-06/thumbs/1498158697_screenshot-at-2017-06-22-12-08-39.png) -[![](https://mintguide.org/uploads/posts/2017-06/thumbs/1498158697_screenshot-at-2017-06-22-12-08-39.png)][13] +**如果你对 Linux 上的 Skype 进度不满意,或者对即将[换代的、旧的(但是优秀的)Qt Skype 客户端][3]感到不快,这有一个 GNU 替代品叫 Ring。** -**如果你对 Linux 上的 Skype 进度不满意,或者对即将[][1][退出的旧的(但是优秀的)Qt Skype 客户端][3]感到不快,这有一个 GNU 替代品叫 Ring。** +GNU Ring 是一个跨平台、关注隐私的交流程序,它很快得到了 FOSS 以及安全圈的注意。 -GNU Ring 是一个跨平台、注意隐私的交流程序,它很快得到了 FOSS 以及安全圈子的注意。 - -就像一个** Skype 的开源替代品**,没有[微软][7] VoIP 带来的那些东西,Ring 不仅能够做大多数 Skype 能够做的,还能以安全、让人放心的私人方式做到: +就像一个 **Skype 的开源替代品**,不用背负微软 VoIP 客户端的那些东西,Ring 不仅能够做大多数 Skype 能够做的,还能以安全、让人放心的私密方式做到: * 语音电话 - * 电话会议 - * 视频电话 - * 即时通信 -所有这些功能也可以跨设备运行。你同伴使用的是使用[Windows][8] 版 Ring 或者 Android 版 Ring 都不重要。只要他们在 Ring 上,你就能联系他们! +所有这些功能也可以跨设备运行。你同伴使用的是使用 Windows 版 Ring 或者 Android 版 Ring 都不重要。只要他们在 Ring 上,你就能联系他们! -Ring 通过分布式对等网络工作。这意味着它不依赖于一个大型集中式服务器来存储你所有详细信息、通话记录和帐户信息。相反,该服务使用分布式哈希表建立通信。 +Ring 通过分布式对等网络工作。这意味着它不用依赖于一个大型集中式服务器以存储你所有详细信息、通话记录和帐户信息。相反,该服务使用分布式哈希表建立通信。 -[][4][Ring 网站][9]使用端到端加密的认证(sic)、使用 X.509 证书管理身份、并且基于 RSA/AES/DTLS/SRTP 技术。 +[Ring 网站][9]使用端到端加密的认证(sic)、使用 X.509 证书管理身份、并且基于 RSA/AES/DTLS/SRTP 技术。 -### 下载 [Linux][10] 版 Ring +### 下载 Linux 版 Ring 你可以从项目网站或者按照下面的安装指导在 Ubuntu 上添加 Ring 的官方仓库来[下载 Linux 版 Ring][11]。这里有两个版本的客户端:KDE 版本和 GNOME 版本。 如果你运行的 Ubuntu 带有 Unity 或者 GNOME Shell,就选择 GNOME 版本。 -如果你对安装感到疑惑,项目网站上有一个一个[][6][手把手的教程][12]。 +如果你对安装感到疑惑,项目网站上有一个一个[手把手的教程][12]。 官方网站上还有直接的 Windows、macOS 和 Android 版链接。 @@ -46,7 +42,7 @@ Ring 的注册不同于 Skype、Telegram 和 WhatsApp 那样。你**不必**绑 其他事情应该相对直接。你可以在其他设备上安装 Ring 并用你的帐户验证,这样你就不会错过任何一个电话(如果你在 Android 设备上安装,你可以扫描二维码来快速设置)。 -Ring 的细节以及配置存储你家目录下的配置文件夹内的 ‘dring.yml’ 中。 +Ring 的细节以及配置存储你家目录下的配置文件夹内的 `dring.yml` 中。 ### Ring 怎么样? @@ -62,22 +58,22 @@ via: https://mintguide.org/internet/795-ring-is-a-privacy-focused-open-source-sk 作者:[fabiomorales9999][a] 译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 [a]:https://mintguide.org/user/fabiomorales9999/ [1]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cDovL3d3dy5vbWd1YnVudHUuY28udWsvMjAxNy8wNi9za3lwZS00LTMtbGludXgtc3RvcC13b3JraW5nLWp1bHktMjAxNw%3D%3D [2]:https://mintguide.org/ -[3]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cDovL3d3dy5vbWd1YnVudHUuY28udWsvMjAxNy8wNi9za3lwZS00LTMtbGludXgtc3RvcC13b3JraW5nLWp1bHktMjAxNw%3D%3D +[3]:https://linux.cn/article-7606-1.html [4]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4 [5]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4L2VuL2Rvd25sb2FkL2dudS1saW51eA%3D%3D [6]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4L2VuL3R1dG9yaWFscy9nbnUtbGludXgjUmluZ0lE [7]:https://mintguide.org/tools/537-crossover-run-any-windows-programs-on-linux-mint.html [8]:https://mintguide.org/tools/537-crossover-run-any-windows-programs-on-linux-mint.html -[9]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4 +[9]:https://ring.cx/ [10]:https://mintguide.org/ -[11]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4L2VuL2Rvd25sb2FkL2dudS1saW51eA%3D%3D -[12]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly9yaW5nLmN4L2VuL3R1dG9yaWFscy9nbnUtbGludXgjUmluZ0lE +[11]:https://ring.cx/en/download/gnu-linux +[12]:https://ring.cx/en/tutorials/gnu-linux#RingID [13]:https://mintguide.org/uploads/posts/2017-06/1498158697_screenshot-at-2017-06-22-12-08-39.png [14]:https://mintguide.org/internet/ From 5b9b4bca82028c4fd5f7f1da6f55c00c5eba8e66 Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 7 Jul 2017 15:31:32 +0800 Subject: [PATCH 0633/1407] PRF&PUB:20170402 Why do developers who could work anywhere flock to the worlds most expensive cities.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @xiaow6 翻译的很好 --- ...ock to the worlds most expensive cities.md | 57 +++++++++++++++++ ...ock to the worlds most expensive cities.md | 63 ------------------- 2 files changed, 57 insertions(+), 63 deletions(-) create mode 100644 published/20170402 Why do developers who could work anywhere flock to the worlds most expensive cities.md delete mode 100644 translated/talk/20170402 Why do developers who could work anywhere flock to the worlds most expensive cities.md diff --git a/published/20170402 Why do developers who could work anywhere flock to the worlds most expensive cities.md b/published/20170402 Why do developers who could work anywhere flock to the worlds most expensive cities.md new file mode 100644 index 0000000000..66bdb5161f --- /dev/null +++ b/published/20170402 Why do developers who could work anywhere flock to the worlds most expensive cities.md @@ -0,0 +1,57 @@ +为什么可以在任何地方工作的开发者们要聚集到世界上最昂贵的城市? +============================================================ + +![](https://tctechcrunch2011.files.wordpress.com/2017/04/img_20170401_1835042.jpg?w=977) + +政治家和经济学家都在[哀嚎][10]某几个阿尔法地区——旧金山、洛杉矶、纽约、波士顿、多伦多、伦敦、巴黎——在吸引了所有最好的工作的同时变得令人却步的昂贵,降低了经济流动性而增大了贫富差异。为什么那些最好的工作不能搬到其它地区呢? + +当然,很多工作都不能搬走。工作在纽约或者伦敦(当然,在英国脱欧毁灭伦敦的银行体系之前)普通的金融从业人员如果告诉他们的老板他们想要以后在清迈工作,将会在办公室里受到嘲笑而且不再受欢迎。 + +但是这对(大部分)软件领域不适用。大部分 web/app 开发者如果这样要求的话可能会被拒绝;但是它们至少不会被嘲笑或者被炒。优秀开发者往往供不应求,而且我们处在 Skype 和 Slack 的时代,软件开发完全可以不依赖物质世界的交互。 + +(这一切对作家来说更加正确,真的;事实上我是在波纳佩发表的这篇文章。但是作家并不像软件开发者一样具有足够的影响力。) + +有些人会告诉你远程协助的团队天生比本地团队效率和生产力低下一些,或者那些“不经意的灵感碰撞”是如此重要以致于每一位员工每天都必须强制到一个地方来人为的制造这样的碰撞。这些人错了,有这种问题的团队只是讨论次数不够多——数量级不过几次、十几次或者几十次,而不是成百上千——也不够专注。 + +我知道:在 [HappyFunCorp][11] 时,我们广泛的与远程团队工作,而且长期雇佣远程开发者,而结果难以置信的好。我在我旧金山的家中与斯德哥尔摩、圣保罗、上海、布鲁克林、新德里的开发者交流和合作的一天,完全没有任何不寻常。 + +在这一点上,不管它是不是个好主意,但我有点跑题了。供求关系指出那些拥有足够技能的开发者可以成为被称为“数字流浪者”的人,如果他们愿意的话。但是许多可以做到的人却不愿意。最近,我在雷克雅维克的一栋通过 Airbnb 共享的房子和一伙不断变化的临时远程工作团队度过了一段时间,我按照东海岸的时间来跟上他们的工作,也把早上和周末的时光都花费在探索冰岛了——但是最后几乎所有人都回到了湾区生活。 + +从经济层面来说,当然,这太疯狂了。搬到东南亚工作光在房租一项上每月就会为我们省下几千美金。 为什么那些可以在哥斯达黎加挣着旧金山的工资,或者在柏林赚着纽约水平薪资的人们,选择不这样做?为什么那些据说冷静固执的工程师在财政方面如此荒谬? + +当然这里有社交和文化原因。清迈很不错,但没有大都会博物馆或者蒸汽朋克化装舞会,也没有 15 分钟脚程可以到的 50 家美食餐厅。柏林也很可爱,但没法提供风筝冲浪或者山脉远足和加州气候。当然也无法保证拥有无数和你一样分享同样价值观和母语的人们。 + +但是我觉得原因除了这些还有很多。我相信相比贫富之间的差异,还有一个更基础的经济分水岭存在。我认为我们在目睹世界上可以实现超凡成就的“极端斯坦(Extremistan)”城市和无法成就伟大但可以工作和赚钱的“平均斯坦(Mediocristan)”城市之间正在生成巨大的裂缝。(这些名词是从伟大的纳西姆·塔勒布那里偷来的) + +(LCTT 译者注:[平均斯坦与极端斯坦的概念是美国学者纳西姆·塔勒布首先提出来的。他发现在我们所处的世界上,有些事物表现出相当的平均性,大部分个体都靠近均值,离均值越远则个体数量越稀少,与均值的偏离达到一定程度的个体数量将趋近于零。有些事物则表现出相当的极端性,均值这个概念在这个领域没有太多的意义,剧烈偏离均值的个体大量存在,而且偏离程度大得惊人。他把前者称为平均斯坦,把后者称为极端斯坦。][15]) + +艺术行业有着悠久历史的“极端斯坦”城市。这也解释了为什么有抱负的作家纷纷搬到纽约城,而那些已经在国际上大获成功的导演和演员仍然在不断被吸引到洛杉矶,如同飞蛾扑火。现在,这对技术行业同样适用。即使你不曾想试着(帮助)构造一些非凡的事物 —— 如今创业神话如此恢弘,很难想象有工程师完全没有梦想过它 —— _伟大事物发生的地方_正在以美好的前景如梦如幻的吸引着人们。 + +但是关于这一切有趣的是,理论上讲,它会改变;因为 —— 直到最近 —— 分布式的、分散管理的团队实际上可以获得超凡的成就。 情况对这些团队很不利,因为风投的目光趋于短浅。但是没有任何法律指出独角兽公司只能诞生在加州和某些屈指可数的次级地域上;而且似乎,不管结果好坏,极端斯坦正在扩散。如果这样的扩散最终可以矛盾地导致米申地区的房租变_便宜_那就太棒了! + +-------------------------------------------------------------------------------- + +via: https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/ + +作者:[Jon Evans][a] +译者:[xiaow6](https://github.com/xiaow6) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://techcrunch.com/author/jon-evans/ +[1]:https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/#comments +[2]:https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/# +[3]:http://twitter.com/share?via=techcrunch&url=http://tcrn.ch/2owXJ0C&text=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F&hashtags= +[4]:https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Ftechcrunch.com%2F2017%2F04%2F02%2Fwhy-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities%2F&title=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F +[5]:https://plus.google.com/share?url=https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/ +[6]:http://www.reddit.com/submit?url=https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/&title=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F +[7]:http://www.stumbleupon.com/badge/?url=https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/ +[8]:mailto:?subject=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities?&body=Article:%20https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/ +[9]:https://share.flipboard.com/bookmarklet/popout?v=2&title=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F&url=https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/ +[10]:https://mobile.twitter.com/Noahpinion/status/846054187288866 +[11]:http://happyfuncorp.com/ +[12]:https://twitter.com/rezendi +[13]:https://techcrunch.com/author/jon-evans/ +[14]:https://techcrunch.com/2017/04/01/discussing-the-limits-of-artificial-intelligence/ +[15]:http://blog.sina.com.cn/s/blog_5ba3d8610100q3b1.html diff --git a/translated/talk/20170402 Why do developers who could work anywhere flock to the worlds most expensive cities.md b/translated/talk/20170402 Why do developers who could work anywhere flock to the worlds most expensive cities.md deleted file mode 100644 index 7ee343da04..0000000000 --- a/translated/talk/20170402 Why do developers who could work anywhere flock to the worlds most expensive cities.md +++ /dev/null @@ -1,63 +0,0 @@ - - - -为什么可以在任何地方工作的开发者要聚集到世界上最昂贵的城市? -============================================================ - - - - - - ![](https://tctechcrunch2011.files.wordpress.com/2017/04/img_20170401_1835042.jpg?w=977) - -政治家和经济学家都在[哀嚎][10]某几个阿尔法地区——三番,洛杉矶,纽约,波士顿,多伦多,伦敦,巴黎——在吸引了所有最好的工作的同时变得令人退却的昂贵,减少了经济变动性而增大了贫富差异。但是为什么那些最好的工作不能搬到其他地区呢? - -当然,很多都不能。工作在纽约或者伦敦(当然,在英国脱欧毁灭伦敦的银行体系之前)普通的金融从业人员如果告诉他们的老板他们想要以后都在清迈工作,将会在办公室里受到嘲笑而且不再受欢迎。 - -但是这对(大部分)软件领域不适用。大部分 web/app 开发者如果这样要求的话可能会被拒绝;但是它们至少不会被嘲笑或者被炒。优秀开发者往往供不应求,而且处在 Skype 和 Slack 的时代,软件开发完全可以不依赖物质世界的交互。 - -(这一切对作家来说更加正确,真的;事实上我是在波纳配发表的这篇文章。但是作家并不像软件开发者一样具有足够的影响力。) - -有些人会告诉你远程协助的团队天生比本地团队效率和生产力低下一些,或者那些“不经意的灵感碰撞”是如此重要以致于每一位员工每天都必须强制到一个地方来人为的制造这样的碰撞。这些人错了,只要团队的讨论次数不够多——数量级不过一把、一打或者许多,而不是成百上千——也不够专注。 - -我应该知道:在 [HappyFunCorp][11] 时,我们广泛的与远程团队工作,而且长期雇佣远程开发者,而结果难以置信的好。我在我三番的家中与斯德哥尔摩,圣保罗,上海,布鲁克林,新德里的开发者交流和合作的一天,完全没有任何不寻常。 - -目前为止,不管是不是个好主意,但我有点跑题了。供求关系指出那些拥有足够技能的开发者可以成为被称为“数字流浪者”的人,如果他们愿意的话。但是许多可以做到的却不愿意。最近,我在雷克雅维克的一栋通过 Airbnb 共享的房子和一伙不断变化的临时远程工作团队度过了一段时间,我保持着东海岸时间来跟上他们的工作,也把早上和周末的时光都花费在探索冰岛了——但是最后几乎所有人都回到了湾区生活。 - -从经济层面来说,当然,这太疯狂了。搬到东南亚工作光在房租一项上每月就会为我们省下几千美金。 为什么那些可以在哥斯达黎加挣着三番工资,或者在柏林赚着纽约水平薪资的人们,选择不这样做?为什么那些据说冷静固执的工程师在财政方面如此荒谬? - -当然这里有社交和文化原因。清迈很不错,但没有大都会博物馆或者蒸汽朋克化装舞会,也没有 15 分钟脚程可以到的 50 家美食餐厅。柏林也很可爱,但没法提供风筝冲浪或者山脉远足和加州气候。当然也无法保证拥有无数和你一样分享同样价值观和母语的人们。 - -但是我觉得原因除了这些还有很多。我相信相比贫富之间的差异,还有一个更基础的经济分水岭存在。我认为我们在目睹世界上可以实现超凡成就的极端斯坦城市和无法成就伟大但可以工作和赚钱的平均斯坦城市之间正在生成巨大的裂缝。(名词是从伟大的纳西姆·塔勒布那里偷来的) -(译者注:[平均斯坦与极端斯坦的概念是美国学者纳西姆·塔勒布首先提出来的。他发现在我们所处的世界上,有些事物表现出相当的平均性,大部分个体都靠近均值,离均值越远则个体数量越稀少,与均值的偏离达到一定程度的个体数量将趋近于零。有些事物则表现出相当的极端性,均值这个概念在这个领域没有太多的意义,剧烈偏离均值的个体大量存在,而且偏离程度大得惊人。他把前者称为平均斯坦,把后者称为极端斯坦。][15]) - -艺术行业有着悠久历史的极端斯坦城市。这也解释了为什么有抱负的作家纷纷搬到纽约城,而那些已经在国际上大获成功的导演和演员仍然在不断被吸引到洛杉矶,如同飞蛾扑火。现在,这对技术行业同样适用。即使你不曾想试着(帮助)构造一些非凡的事物—— 如今创业神话如此恢弘,很难想象有工程师完全没有梦想过它—— _伟大事物发生的地方_正在以美好的前景如梦如幻的吸引着人们。 - -但是关于这一切有趣的是,理论上讲,它会改变;因为——直到最近——分布式的,分散管理的团队实际上可以获得超凡的成就。 情况对这些团队很不利,因为风投的目光趋于短浅。但是没有任何法律指出独角兽公司只能诞生在加州和某些屈指可数的次级领土;而且似乎,不管结果好坏,极端斯坦正在扩散。如果这样的扩散最终可以矛盾的导致米申地区的房租变 _便宜_那就太棒了! - --------------------------------------------------------------------------------- - -via: https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/ - -作者:[ Jon Evans ][a] -译者:[xiaow6](https://github.com/xiaow6) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://techcrunch.com/author/jon-evans/ -[1]:https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/#comments -[2]:https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/# -[3]:http://twitter.com/share?via=techcrunch&url=http://tcrn.ch/2owXJ0C&text=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F&hashtags= -[4]:https://www.linkedin.com/shareArticle?mini=true&url=https%3A%2F%2Ftechcrunch.com%2F2017%2F04%2F02%2Fwhy-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities%2F&title=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F -[5]:https://plus.google.com/share?url=https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/ -[6]:http://www.reddit.com/submit?url=https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/&title=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F -[7]:http://www.stumbleupon.com/badge/?url=https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/ -[8]:mailto:?subject=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities?&body=Article:%20https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/ -[9]:https://share.flipboard.com/bookmarklet/popout?v=2&title=Why%20do%20developers%20who%20could%20work%20anywhere%20flock%20to%20the%20world%E2%80%99s%20most%20expensive%C2%A0cities%3F&url=https://techcrunch.com/2017/04/02/why-do-developers-who-could-work-anywhere-flock-to-the-worlds-most-expensive-cities/ -[10]:https://mobile.twitter.com/Noahpinion/status/846054187288866 -[11]:http://happyfuncorp.com/ -[12]:https://twitter.com/rezendi -[13]:https://techcrunch.com/author/jon-evans/ -[14]:https://techcrunch.com/2017/04/01/discussing-the-limits-of-artificial-intelligence/ -[15]:http://blog.sina.com.cn/s/blog_5ba3d8610100q3b1.html From 7e14e505c793c0601dc227d8e4fa4edc1228b08e Mon Sep 17 00:00:00 2001 From: WangYue <815420852@qq.com> Date: Sat, 8 Jul 2017 12:17:01 +0800 Subject: [PATCH 0634/1407] =?UTF-8?q?=E7=94=B3=E8=AF=B7=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=2020170113=203=20open=20source=20music=20players.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 申请翻译 20170113 3 open source music players.md --- sources/tech/20170113 3 open source music players.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170113 3 open source music players.md b/sources/tech/20170113 3 open source music players.md index 336c6b1e71..6b96ed1ec0 100644 --- a/sources/tech/20170113 3 open source music players.md +++ b/sources/tech/20170113 3 open source music players.md @@ -1,3 +1,5 @@ +翻译中 by  WangYueScream +=========================================================== 3 open source music players: Aqualung, Lollypop, and GogglesMM ============================================================ ![3 open source music players: Aqualung, Lollypop, and GogglesMM](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/music-birds-recording-520.png?itok=wvh1g4Lw "3 open source music players: Aqualung, Lollypop, and GogglesMM") From f3f074e19dafc52635ddd196836bc3d8944585c5 Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 8 Jul 2017 12:58:07 +0800 Subject: [PATCH 0635/1407] PRF&PUB:20170309 The impact GitHub is having on your software career.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @SysTick 翻译的不错! --- ...itHub is having on your software career.md | 80 +++++++++++++++++++ ...itHub is having on your software career.md | 74 ----------------- 2 files changed, 80 insertions(+), 74 deletions(-) create mode 100644 published/20170309 The impact GitHub is having on your software career.md delete mode 100644 translated/talk/20170309 The impact GitHub is having on your software career.md diff --git a/published/20170309 The impact GitHub is having on your software career.md b/published/20170309 The impact GitHub is having on your software career.md new file mode 100644 index 0000000000..6f6f9b80a6 --- /dev/null +++ b/published/20170309 The impact GitHub is having on your software career.md @@ -0,0 +1,80 @@ +GitHub 对软件开发业造成的冲击 +============================================================ + +![The impact GitHub is having on your software career](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/github-universe.jpg?itok=HCU81VX8 "The impact GitHub is having on your software career") + +在未来的 12 到 24 个月内(也就是说,在 2018 年,或者是 2019 年),人们雇佣软件开发者的方式将会发生彻底的改变。 + +2004 至 2014 期间,我曾经就职于红帽,这是世界上最大的开源软件公司。还记得 2004 年七月的一天,我第一次来到这家公司,我的老板 Marty Messer 就跟我说,“所有你在这里所做的工作都会被开源,在未来,你将不需要任何的简历,因为所有的人都可以 Google 到你。” + +供职于红帽的一个独特的好处是,在这种开源的工作期间,我们有机会建立自己的个人品牌和树立自己的声誉。我们可以通过邮件列表和 bug 追踪器与其它的软件工程师进行沟通,而且提交到 mercurial、subversion 和 CVS 仓库的源代码都会被开源,并且可以通过 google 找到。 + +(写本文时)马上就到 2017 年了,我们将生活在一个处处充满开源的世界。 + +以下两点会让你对这个新时代有一个真正意义上的了解: + +1. 微软在过去的一段很长的时间里都在坚持闭源,甚至是排斥开源。但是现在也从心底里开始拥抱开源了。它们成立了 .NET 基金会(红帽也是其中的一个成员),并且也加入了 Linux 基金会。 .NET 项目现在是以一个开源项目的形式在开发着。 +2. Github 已经成为了一个独特的社交网络,并将问题追踪器和分布式源码版本控制融入其中。 + +对于那些从闭源走过来的软件开发者来说,他们可能还不知道发生了什么。对于他们来说 ,开源就意味着“将业余时间的所有工作成果都免费开放”。 + +对于我们这些在过去十年创造了一家十亿美元的开源软件公司的人来说,参与开源以后就没有什么空闲的时间可言了。当然,为开源事业献身的好处也是很明显的,所得到的名誉是你自己的,并不隶属于某个公司。GitHub 是一个社交网络,在这个地方,你可以创建你的提交、你可以在你所专长的领域为一些全球性的组织做出贡献,你临时做的一些工作并不附属于所任职的公司。 + +聪明的人会利用这种工作环境。他们会贡献他们的补丁、工单(issue)、评论给他们平时在工作中使用的语言和框架,比如 TypeScript、 .NET 和 Redux 。 + +他们也拥抱开源,并会尽可能多的开源他们的创新成果。甚至会提交他们的贡献给私有仓库。 + +GitHub 对平等居功至伟。比如说,你也许很难在澳大利亚得到一份来自印度的工作,但是,在 GitHub 上,却没有什么可以阻止你在印度跟澳大利亚的工作伙伴一起工作。 + +在过去十年里,想从红帽获得一个工作机会的方式很简单。你只需要在一些某些小的方面,与红帽的软件工程师在开源的项目上协作,然后当他们觉得你在某些方面做出了很多有价值的贡献,而且成为一个很好的工作伙伴时,那么你就可以申请一个红帽的工作机会了,或许他们会邀请你。 + +现在,在不同的技术领域,开源给了我们所有人同样的机会,随着开源在世界的各处都流行开来,这样的事情将会在不同的地方盛行开来。 + +在[最近一个访谈][3]中,Linux 和 git 的发明者 Linux Torvalds(在 GitHub 上有 49K 粉丝,0 关注),这么说, + +> “你提交了很多小补丁,而在某个时候项目的维护者开始信任你,在那一刻,你跟一般人不同的是,你不仅仅是提交了一些补丁,而是真正成为了这个组织里被信任的一部分。” + +实际上你的名声存在于那个你被信任的网络。我们都知道,当你离开一家公司以后,你的人脉和名声可能会削弱,有的甚至会丢失。就好像,你在一个小村庄里生活了很长的一段时间,这里所有的人都会知道你。然而,当你离开这个村庄,来到一个新的地方,这个地方可能没人听说过你,更糟糕的是,没有人认识任何知道你的人。 + +你已经失去了一度和二度连接关系,甚至有可能会失去这三度连接关系(LCTT 译注:指六度连接理论)。除非你通过在会议或其他大型活动中演讲来建立自己的品牌,否则你通过在公司内部提交代码建立起来的信任早晚都会过去的,但是,如果你在 GitHub 上完成你的工作,这些东西依然全部都在,对这个信任网络的连接仍然可见。 + +首先会发生的事情就是,一些弱势群体可能会利用这个。包括像学生、新毕业生、移民者--他们可能会利用这个“去往”澳大利亚。 + +这将会改变目前的现状。以前的一些开发人员可能会有过人际网络突然中断的情况,开源的一个原则是精英——最好的创意、最多的提交、最多的测试,和最快的落实执行,等等。 + +它并不完美,当然也没有什么事情是完美的,不能和伙伴一起工作,在人们对你的印象方面也会大打折扣。红帽公司会开除那些不能和团队和谐相处的人,而在 GitHub 工作的这些员工,他们主要是和其它的贡献者之间的交流。 + +GitHub 不仅仅是一个代码仓库或是一个原始提交成员的列表,因为有些人总是用稻草人论点描述它。它是一个社交网络。我会这样说: + +> GitHub 有多少代码并不重要,重要的是有多少关于你代码的讨论。 + +GitHub 可以说是伴你而走的名声,并且在以后的 12 到 24 个月中,很多开发者使用它,而另外的一些依然并不使用,这将会形成一个很明显的差异。就像有电子邮件和没有电子邮件的区别(现在每个人都有电子邮件了),或者是有移动电话和没有移动电话的区别(现在每个人都有移动电话了),最终,绝大多数的人都会为开源工作,这将会是与别人的竞争中的一个差异化的优势。 + +但是现在,开发者的职业生涯已经被 GitHub 打乱了。 + +(题图: GitHub) + + +-------------------------------------------------------------------------------- + +作者简介: + +Josh Wulf - 我是 Just Digital People 的传奇招聘者,前红帽员工,CoderDojo 导师, Magikcraft.io 创始人之一,The JDP Internship 出品人——这是世界第一的软件开发真人秀,世界上最好的科技播客主持人,也是一位父亲。一直致力于昆士兰州的“硅经济”。 + +----------------------- + +via: https://medium.com/@sitapati/the-impact-github-is-having-on-your-software-career-right-now-6ce536ec0b50 + +作者:[Josh Wulf][a] +译者:[SysTick](https://github.com/SysTick) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/sitapati +[1]:https://medium.com/@sitapati/the-impact-github-is-having-on-your-software-career-right-now-6ce536ec0b50#.dl79wpyww +[2]:https://opensource.com/article/17/3/impact-github-software-career?rate=2gi7BrUHIADt4TWXO2noerSjzw18mLVZx56jwnExHqk +[3]:http://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_harder_says_linus_torvalds/ +[4]:https://opensource.com/user/118851/feed +[5]:https://opensource.com/article/17/3/impact-github-software-career#comments +[6]:https://opensource.com/users/sitapati diff --git a/translated/talk/20170309 The impact GitHub is having on your software career.md b/translated/talk/20170309 The impact GitHub is having on your software career.md deleted file mode 100644 index 08106d7077..0000000000 --- a/translated/talk/20170309 The impact GitHub is having on your software career.md +++ /dev/null @@ -1,74 +0,0 @@ -GitHub对软件开发行业造成的冲击 -============================================================ - - ![The impact GitHub is having on your software career](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/github-universe.jpg?itok=HCU81VX8 "The impact GitHub is having on your software career") ->Image credits : From GitHub - -在未来的12到24个月内(也就是说,在2018年,或者是2019年),人们雇佣软件开发者的方式将会发生彻底的改变。 - -2004 至 2014期间,我曾经就职于红帽,这是世界上最大的开源软件公司。还记得2004年七月的一天,我第一次来到这家公司,我的老板 Marty Messer 就跟我说,“所有你在这里所做的工作都会被开源,在未来,你将不需要任何的履历,因为所有的人都可以 Google 到你。” - -供职于红帽的一个独特的好处是,在这种开源的工作期间,我们有机会建立自己的个人品牌和树立自己的声誉。我们可以通过邮件列表(mailling lists)和bug跟踪器(bug tracker)与其它的软件经理进行沟通,而且提交到 mercurial, subversion, 和CVS (并行版本控制系统)仓库的源代码都会被开源,并且通过google索引。 - -马上就到2017年了,我们将生活在一个处处充满开源的世界。 - -以下两点会让你对这个新时代有一个真正意义上的了解: - -1. Microsoft(微软)在过去的一段很长的时间里都在坚持闭源,甚至是排斥开源。但是现在也从心底里开始拥抱开源了。它们成立了 .NET 基金会(红帽也是其中的一个成员),并且也加入了 Linux基金会。 .NET项目现在是以一个开源的形式在维护。 -2. Github 已经成为了一个独特的社交网络,解决了包括各种问题跟踪和源码的版本控制。 - -大多数的软件开发都是从闭源走过来的,他们可能还不知道发生了什么。对于他们来说 ,开源就意味着“将业余时间的所有努力成果都免费。” - -对于我们这些在过去十年创造了一家十亿美元的开源软件公司的人来说,参与开源的以后就没有什么空闲的时间可言了。当然,为开源事业献身的好处也是很明显的,所得到的名誉是你自己的,并且会在各家公司之间传播。GitHub 是一个社交网络,在这个地方,你可以创建你的提交(commits)、你可以在你所专长的领域为一些全球性的组织做出贡献。临时做一些与工作无关的事情。 - -聪明的人会利用这种工作环境。他们会贡献他们的补丁(patches)、事件(issues)、评论(comments)给他们平时在工作中使用的语言和框架。包括TypeScript, .NET, 和Redux。他们也拥抱开源,并会尽可能多的开源他们的创新成果。甚至会提交他们的贡献给私人资料库。 - -GitHub 是一个很好的平衡器。比如说,你也许很难在澳大利亚得到一份来至印度的工作,但是,在GitHub上,却也没有什么可以阻止你在印度跟澳大利亚的工作伙伴一起工作。 - -在过去十年里,想从红帽获得一个工作机会的方式很简单。你只需要在一些小的方面,在红帽的软件经理开源的项目上做出一点你自己的贡献,直到他们觉得你在某些方面做出了很多有价值的贡献,而且也是一个很好的工作伙伴,那么你就可以得到一个红帽的工作机会了。(也许他们会邀请你) - -现在,在不同的技术领域,开源给了我们所有人同样的机会,随着开源在世界的各处都流行开来,这样的事情将会在不同的地方盛行开来。 - -在[a recent interview][3]中,Linux 和 git的发明者Linux Torvalds(49K 粉丝,0 关注),这么说,“当你提交了很多小补丁,直到项目的维护者接受了你的补丁,从这一点说,你跟一般人不同的是,你不仅仅是提交了一些补丁,而是真正成为了这个组织里被信任的一部分。” - -实际上你的名誉存在于那个你被信任的网络。我们都知道,当你离开一家公司以后,你的人脉和名誉可能会削弱,有的甚至 会丢失。就好像,你在一个小村庄里生活了很长的一段时间,这里所有的人都会知道你。然而,当你离开这个村庄,来到一个新的地方,这个地方可能没人听说过你,更糟糕的是,没有人知道任何知道你的人。 - -你曾经失去了第一次和第二次与世界连接的机会,甚至有可能会失去这第三个与世界交流的机会。除非你通过在会议或其他大型活动中演讲来建立自己的品牌,否则你通过在公司内部提交代码建立起来的信任早晚都会过去的,但是,如果你在GitHub上完成你的工作,这些东西依然全部都在,仍然可见,因为他连接到可信任的网络。 - -首先会发生的事情就是,一些弱势群体可能会利用这个。包括像学生,新毕业生、移民者--他们可能会利用这个“去往”澳大利亚。 - -这将会改变目前的现状。以前的一些开发人员可能会有过网络突然中断的情况,开源的一个原则是精英-最好的创意,最多的提交,最多的测试,和最快的落实执行,等等。 - -它并不完美,当然也没有什么事情是完美的,不能和伙伴一起工作,在人们对你的印象方面也会大打折扣。很多公司都会开除那些不能和团队和谐相处的人,而在GitHub工作的这些员工,他们主要是和其它的贡献者之间的交流。 - -GitHub不仅仅是一个代码仓库或是一个原始提交成员的列表,因为有些人总是用稻草人论点描述它。它是一个社交网络。我会这样说:GitHub有多少代码并不重要,重要的是有多少关于你代码的讨论。 - -GitHub 可以说是你的一个便捷的荣誉,并且在以后的12到24个月中,很多开发者使用它,而另外的一些依然并不使用,这将会形成一个很明显的差异。就像有电子邮件和没有电子邮件的区别(现在每个人都有电子邮件了),或者是有移动电话和没有移动电话的区别(现在每个人都有移动电话了),最终,绝大多数的人都会为开源工作,这将会是与别人的竞争中的一个差异化的优势。 - -但是现在,开发者的源码仓库已经被GitHub打乱了。 - -_[This article][1]首发于 Medium.com .转载请标明出处_ - --------------------------------------------------------------------------------- - -作者简介: - -Josh Wulf - About me: I'm a Legendary Recruiter at Just Digital People; a Red Hat alumnus; a CoderDojo mentor; a founder of Magikcraft.io; the producer of The JDP Internship — The World's #1 Software Development Reality Show; - ------------------------ - -via: https://opensource.com/article/17/3/impact-github-software-career - -作者:[Josh Wulf ][a] -译者:[SysTick](https://github.com/SysTick) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/sitapati -[1]:https://medium.com/@sitapati/the-impact-github-is-having-on-your-software-career-right-now-6ce536ec0b50#.dl79wpyww -[2]:https://opensource.com/article/17/3/impact-github-software-career?rate=2gi7BrUHIADt4TWXO2noerSjzw18mLVZx56jwnExHqk -[3]:http://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_harder_says_linus_torvalds/ -[4]:https://opensource.com/user/118851/feed -[5]:https://opensource.com/article/17/3/impact-github-software-career#comments -[6]:https://opensource.com/users/sitapati From 5e6863b787c6fee704eff4f610934a25be9eddab Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 9 Jul 2017 05:14:01 +0800 Subject: [PATCH 0636/1407] =?UTF-8?q?PRF&PUB:20170513=20How=20to=20Integra?= =?UTF-8?q?te=20iRedMail=20Roundcube=20with=20Samba4=20AD=20DC=20=E2=80=93?= =?UTF-8?q?=20Part=2012.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @geekpi --- ...l Roundcube with Samba4 AD DC – Part 12.md | 82 +++++++++---------- 1 file changed, 37 insertions(+), 45 deletions(-) rename {translated/tech => published}/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md (63%) diff --git a/translated/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md b/published/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md similarity index 63% rename from translated/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md rename to published/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md index f53025621d..b7d343fbd1 100644 --- a/translated/tech/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md +++ b/published/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md @@ -1,30 +1,24 @@ -如何在 Samba4 AD 中集成 iRedMail Roundcube - 第 12 部分 +Samba 系列(十二):如何在 Samba4 AD 中集成 iRedMail Roundcube ============================================================ -by [Matei Cezar][15] | 发布日期: 2017-05-13 | 更新日期: 2017-05-14 - - Download Your Free eBooks NOW - [10 Free Linux eBooks for Administrators][16] | [4 Free Shell Scripting eBooks][17] -现在下载你的免费电子书 - [10 本给管理员的免费电子书][16] | [4 本免费的 shell 脚本电子书][17] - -[Roundcube][3] 是 Linux 中最常用的 Webmail 用户代理之一,它为终端用户提供了一个现代化的 Web 界面,它可以与所有邮件服务进行交互,以便阅读、撰写和发送电子邮件。Roundcube 支持各种邮件协议,包括安全的邮件协议,如IMAPS,POP3S 或者 submission。 +[Roundcube][3] 是 Linux 中最常用的 Webmail 用户代理之一,它为终端用户提供了一个现代化的 Web 界面,它可以与所有邮件服务进行交互,以便阅读、撰写和发送电子邮件。Roundcube 支持各种邮件协议,包括安全的邮件协议,如IMAPS、POP3S 或者 submission。 在本文中,我们将讨论如何在 iRedMail 中使用 IMAPS 以及 submission 安全端口配置 Roundcube,以检索和发送 Samba4 AD 帐户的电子邮件、如何从浏览器访问 iRedMail Roundcube Web 界面,并添加网址别名、如何启用 Samba4 AD 集成全局 LDAP 地址簿以及如何禁用某些不需要的 iRedMail 服务。 -#### 要求 +### 要求 1. [如何在 CentOS 7 上安装 iRedMail,用于Samba4 AD集成][1] - 2. [在 CentOS 7 上配置 iRedMail,用于 Samba4 AD 集成][2] ### 第一步:在 Samba4 AD DC 中声明域帐户的电子邮件地址 -1. 为了发送和接收 Samba4 AD DC 域账户的邮件,您需要编辑每个用户帐户,如下所示,通过从[安装了 RSAT 工具的 Windows 机器][4]并且已经加入 Samba4 AD 中打开 ADUC 工具显式地在邮箱字段填写正确的地址。 +1、 为了发送和接收 Samba4 AD DC 域账户的邮件,您需要编辑每个用户帐户,如下所示,通过从[安装了 RSAT 工具的 Windows 机器][4]并且已经加入 Samba4 AD 中打开 ADUC 工具显式地在邮箱字段填写正确的地址。 [![Add Email Account to Join Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-User-and-Computers.jpg)][5] -添加邮箱帐户来加入 Samba4 AD DC +*添加邮箱帐户来加入 Samba4 AD DC* -2. 相似地,要使用邮件列表,你需要在 ADUC 中创建组,为每个组添加相应的电子邮件地址,并分配合适的用户帐户作为每个组的成员。 +2、 相似地,要使用邮件列表,你需要在 ADUC 中创建组,为每个组添加相应的电子邮件地址,并分配合适的用户帐户作为每个组的成员。 这步创建了一个邮件列表,所有 Samba4 AD 组成员的邮箱都会收到给这个 AD 组邮箱地址的邮件。使用下面的截图作为指导为 Samba4 组声明电子邮件字段,并为组添加域成员。 @@ -32,15 +26,15 @@ by [Matei Cezar][15] | 发布日期: 2017-05-13 | 更新日期: 2017-05-14 [![Create Group Admin for Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/05/Create-Group-Admin-for-Samba4-AD-DC.png)][6] -为 Samba4 AD DC 创建组管理员 +*为 Samba4 AD DC 创建组管理员* [![Add Users to Group](https://www.tecmint.com/wp-content/uploads/2017/05/Add-Users-to-Group.png)][7] -将用户添加到组 +*将用户添加到组* 在本例中,发送给 admins@tecmint.lan 的所有邮件地址将被该组的每个成员邮箱接收,它是 “Domain Admins” 组声明的电子邮件地址。 -3. 你可以声明 Samba4 AD 帐户的电子邮件地址的另一种方法是直接从其中一个 AD DC 控制台使用 samba-tool 命令行创建一个用户或组,并使用 `--mail-address` 标志指定邮件地址。 +3、 你可以声明 Samba4 AD 帐户的电子邮件地址的另一种方法是直接从其中一个 AD DC 控制台使用 samba-tool 命令行创建一个用户或组,并使用 `--mail-address` 标志指定邮件地址。 使用下面其中一个命令创建一个指定邮件地址的用户: @@ -69,14 +63,13 @@ by [Matei Cezar][15] | 发布日期: 2017-05-13 | 更新日期: 2017-05-14 ### 第二步:安全 Roundcube Webmail -4. 开始修改 Roundcube 配置文件之前,首先使用[ netstat 命令][8]管道输出给 egrep 过滤器来列出[ Dovecot 和 Postfix ][9]监听的套接字,并确保安全端口(IMAPS 是 993,submission 是 587 )是活跃的并且已启用。 +4、 开始修改 Roundcube 配置文件之前,首先使用 [netstat 命令][8]管道输出给 egrep 过滤器来列出 [Dovecot 和 Postfix][9] 监听的套接字,并确保安全端口(IMAPS 是 993,submission 是 587 )是活跃的并且已启用。 ``` # netstat -tulpn| egrep 'dovecot|master' ``` -5. 要强制邮件的接收和发送在使用安全的 IMAP 和 SMTP 端口的 Roundcube 以及 iRedMail 服务之间,打开位于 /var/www/roundcubemail/config/config.inc.php 的 Roundcube 配置文件并确保你修改过了下面的行,本例中是 localhost,如下片段所示: - +5、 要强制邮件的接收和发送在使用安全的 IMAP 和 SMTP 端口的 Roundcube 以及 iRedMail 服务之间,打开位于 `/var/www/roundcubemail/config/config.inc.php` 的 Roundcube 配置文件并确保你修改过了下面的行,本例中是 `localhost`,如下片段所示: ``` // For IMAPS @@ -93,7 +86,7 @@ $config['smtp_auth_type'] = 'LOGIN'; 这步强烈建议在远程主机中安装 Roudcube,而不是提供了邮件服务的主机中(IMAP、POP3 或者 SMTP 守护进程)。 -6. 接下来,不要关闭配置文件,搜索并做如下小的修改以便 Roundcube 能够通过 HTTPS 协议访问、隐藏版本号以及自动为登录 Web 界面的帐户追加域名。 +6、 接下来,不要关闭配置文件,搜索并做如下小的修改以便 Roundcube 能够通过 HTTPS 协议访问、隐藏版本号以及自动为登录 Web 界面的帐户追加域名。 ``` $config['force_https'] = true; @@ -101,7 +94,7 @@ $config['useragent'] = 'Your Webmail'; // Hide version number $config['username_domain'] = 'domain.tld' ``` -7. 同样,禁用下面的插件:managesieve 和 password,通过在以 $config[‘plugins’] 开头的行前添加注释 `(//)`。 +7、 同样,禁用下面的插件:managesieve 和 password,通过在以 `$config[‘plugins’]` 开头的行前添加注释 `//`。 一旦登录并验证了域,用户将从连接到 Samba4 AD DC 的 Windows 或 Linux 机器上更改密码。系统管理员将全局管理域帐户的所有筛选规则。 @@ -109,7 +102,7 @@ $config['username_domain'] = 'domain.tld' // $config['plugins'] = array('managesieve', 'password'); ``` -8. 最后,保存并关闭配置文件,并打开浏览器访问 Roundcube Webmail,通过 HTTPS 协议进入 iRedMail IP 地址或者 FQDN/mail 位置。 +8、 最后,保存并关闭配置文件,并打开浏览器访问 Roundcube Webmail,通过 HTTPS 协议进入 iRedMail IP 地址或者 FQDN/mail 位置。 由于浏览器使用的是自签名证书,所以你首次访问 Roundcube 会在浏览器上看到一个警告。接受证书并用 Samba AD 帐户凭证登录。 @@ -118,13 +111,13 @@ https://iredmail-FQDN/mail ``` [![Roundcube Webmail Login](https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-Webmail-Login.png)][10] -Roundcube Webmail 登录 +*Roundcube Webmail 登录* ### 第三步:在 Roundcube 中启用 Samba AD 联系人 -9. 要配置 Samba AD 全局 LDAP 地址簿以在 Roundcube 联系人中显示,再次打开 Roundcube 配置文件,并做如下修改: +9、 要配置 Samba AD 全局 LDAP 地址簿以在 Roundcube 联系人中显示,再次打开 Roundcube 配置文件,并做如下修改: -到达文件的底部,并辨认以 “# Global LDAP Address Book with AD” 开头的部分,删除到文件底部的所有内容,并替换成如下代码段: +到达文件的底部,并辨认以 `# Global LDAP Address Book with AD` 开头的部分,删除到文件底部的所有内容,并替换成如下代码段: ``` # Global LDAP Address Book with AD. @@ -164,29 +157,29 @@ $config['ldap_public']["global_ldap_abook"] = array( ); ``` -在这段代码中替换相应的 name、hosts、base_dn、bind_dn 和 bind_pass 的值。 +在这段代码中替换相应的 `name`、`hosts`、`base_dn`、`bind_dn` 和 `bind_pass` 的值。 -10. 做了所需修改后,保存并关闭文件,登录 Roundcube webmail 界面,并进入地址簿菜单。 +10、 做了所需修改后,保存并关闭文件,登录 Roundcube webmail 界面,并进入地址簿菜单。 所有域名帐户(用户和组)与其指定的电子邮件地址的联系人列表都将被显示在全局地址簿上。 [![Roundcube User Contact List](https://www.tecmint.com/wp-content/uploads/2017/05/Roundcube-User-Contact-List.png)][11] -Roundcube 用户联系人列表 +*Roundcube 用户联系人列表* ### 第四步:为 Roundcube Webmail 界面添加一个别名 -11. 要从 https://webmail.domain.tld 访问 Roundcube 而不是从 iRedMail 默认提供的旧地址,你需要进行以下更改。 +11、 要从 https://webmail.domain.tld 访问 Roundcube 而不是从 iRedMail 默认提供的旧地址,你需要进行以下更改。 在已安装 RSAT 工具的已加入的 Windows 机器上打开 DNS 管理器,并如下所示,添加一条 iRedMail FQDN、named webmail 的 CNAME 记录。 [![DNS Webmail Properties](https://www.tecmint.com/wp-content/uploads/2017/05/DNS-Webmail-Properties.jpg)][12] -DNS Webmail 属性 +*DNS Webmail 属性* -12. 接下来,在 iRedMail 机器中,打开位于 /etc/httpd/conf.d/ssl.conf 的 Apache Web 服务器的 SSL 配置文件,将 DocumentRoot 指向 /var/www/roundcubemail/。 +12、 接下来,在 iRedMail 机器中,打开位于 `/etc/httpd/conf.d/ssl.conf` 的 Apache Web 服务器的 SSL 配置文件,将 `DocumentRoot` 指向 `/var/www/roundcubemail/`。 -修改 /etc/httpd/conf.d/ssl.conf 片段: +修改 `/etc/httpd/conf.d/ssl.conf` 片段: ``` @@ -199,7 +192,7 @@ DocumentRoot “/var/www/roundcubemail/” # systemctl restart httpd ``` -13. 现在打开下面的地址,Roundcube 界面应该会显示出来。接受自签名证书错误以进入登录页面。用你自己的域名替换例子中的 domain.tld。 +13、 现在打开下面的地址,Roundcube 界面应该会显示出来。接受自签名证书错误以进入登录页面。用你自己的域名替换例子中的 domain.tld。 ``` https://webmail.domain.tld @@ -207,42 +200,41 @@ https://webmail.domain.tld ### 第五步:禁用 iRedMail 未使用的服务 -14. 由于 iRedMail 守护进程配置为查询 Samba4 AD DC LDAP 服务器的帐户信息和其他资源,因此可以通过使用以下命令来安全地停止和禁用 iRedMail 机器上的某些本地服务,例如 LDAP 数据库服务器和 iredpad 服务。 - +14、 由于 iRedMail 守护进程配置为查询 Samba4 AD DC LDAP 服务器的帐户信息和其他资源,因此可以通过使用以下命令来安全地停止和禁用 iRedMail 机器上的某些本地服务,例如 LDAP 数据库服务器和 iredpad 服务。 ``` # systemctl stop slapd iredpad # systemctl disable slapd iredpad ``` -15. 另外,如下图所示,通过在 crontab 文件中的每行之前添加注释(#),禁用 iRedMail 执行的某些计划任务,例如 LDAP 数据库备份和 iRedPad 跟踪记录。 +15、 另外,如下图所示,通过在 crontab 文件中的每行之前添加注释 `#`,禁用 iRedMail 执行的某些计划任务,例如 LDAP 数据库备份和 iRedPad 跟踪记录。 ``` # crontab -e ``` [![Disable iRedMail Tasks](https://www.tecmint.com/wp-content/uploads/2017/05/Disable-iRedMail-Tasks.png)][13] -禁用 iRedMail 任务 +*禁用 iRedMail 任务* ### 第六步:在 Postfix 中使用邮件别名 -16. 要将所有本地生成的邮件(发往 postmaster 并随后重定向到 root 帐户)重定向到特定的 Samba4 AD 帐户,请打开位于 /etc/postfix/aliases 中的 Postfix 别名配置文件,并修改root行,如下所示: +16、 要将所有本地生成的邮件(发往 postmaster 并随后重定向到 root 帐户)重定向到特定的 Samba4 AD 帐户,请打开位于 `/etc/postfix/aliases` 中的 Postfix 别名配置文件,并修改 `root` 行,如下所示: ``` root: your_AD_email_account@domain.tld ``` -17. 应用别名配置文件,以便 Postfix 可以通过执行 newaliases 命令以其自己的格式读取它,并测试邮件是否通过发出以下命令发送到正确的域电子邮件帐户。 +17、 应用别名配置文件,以便 Postfix 可以通过执行 `newaliases` 命令以其自己的格式读取它,并测试邮件是否通过发出以下命令发送到正确的域电子邮件帐户。 ``` # echo “Test mail” | mail -s “This is root’s email” root ``` -18. 邮件发送完毕后,请使用你为邮件重定向设置的域帐户登录 Roundcube webmail,并验证先前发送的邮件应该在你的帐户收件箱中。 +18、 邮件发送完毕后,请使用你为邮件重定向设置的域帐户登录 Roundcube webmail,并验证先前发送的邮件应该在你的帐户收件箱中。 [![Verify User Mail](https://www.tecmint.com/wp-content/uploads/2017/05/Verify-User-Mail.png)][14] -验证用户邮件 +*验证用户邮件* 就是这样了!现在你已经有了一个完全工作的与 Samba4 AD 集成的邮件服务器了。域帐户可以用它们的内部或者其他外部域发送和接收邮件了。 @@ -259,17 +251,17 @@ root: your_AD_email_account@domain.tld via: https://www.tecmint.com/integrate-iredmail-roundcube-with-samba4-ad-dc/ -作者:[ ][a] +作者:[Matei Cezar][a] 译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 [a]:https://www.tecmint.com/author/cezarmatei/ -[1]:https://www.tecmint.com/install-iredmail-on-centos-7-for-samba4-ad-integration/ -[2]:https://www.tecmint.com/integrate-iredmail-to-samba4-ad-dc-on-centos-7/ +[1]:https://linux.cn/article-8567-1.html +[2]:https://linux.cn/article-8673-1.html [3]:https://www.tecmint.com/install-and-configure-roundcube-webmail-for-postfix-mail-server/ -[4]:https://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/ +[4]:https://linux.cn/article-8097-1.html [5]:https://www.tecmint.com/wp-content/uploads/2017/05/Active-Directory-User-and-Computers.jpg [6]:https://www.tecmint.com/wp-content/uploads/2017/05/Create-Group-Admin-for-Samba4-AD-DC.png [7]:https://www.tecmint.com/wp-content/uploads/2017/05/Add-Users-to-Group.png From fa7ca2ff6026170721e26de15e401a3b149d223b Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 9 Jul 2017 05:44:53 +0800 Subject: [PATCH 0637/1407] PRF:20170525 An introduction to Linux s EXT4 filesystem.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 部分 --- ...introduction to Linux s EXT4 filesystem.md | 82 ++++++++----------- 1 file changed, 36 insertions(+), 46 deletions(-) diff --git a/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md b/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md index 25e27d187e..62e6933e26 100644 --- a/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md +++ b/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md @@ -1,24 +1,18 @@ Linux 的 EXT4 文件系统简介 ============================================================ -### 让我们大概地从 EXT4 的历史、特性以及最佳实践这几个方面来学习它和之前的所有的 EXT 文件系统有何不同。 +> 让我们大概地从 EXT4 的历史、特性以及最佳实践这几个方面来学习它和之前的几代 EXT 文件系统有何不同。 -![An introduction to the EXT4 filesystem](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/hard_drives.png?itok=yZWyaSO6 "An introduction to the EXT4 filesystem") ->图片来自 : [WIlliam][8][ Warby][9]. 由 [Jason Baker][10] 编辑. Creative Commons [BY-SA 2.0][11]. -在之前关于 Linux 文件系统的文章里,我写过一篇 [an introduction to Linux filesystems][12] 和一些更高级的概念例如 [everything is a file][13]. 我想要更深入地了解 EXT 文件系统的特性的详细内容,但是首先让我们来回答一个问题,“什么样才算是一个文件系统 ?” 一个文件系统应该涵盖以下所有点: +在之前关于 Linux 文件系统的文章里,我写过一篇 [Linux 文件系统介绍][12] 和一些更高级的概念例如 [一切都是文件][13]。 我想要更深入地了解 EXT 文件系统的特性的详细内容,但是首先让我们来回答一个问题,“什么样才算是一个文件系统 ?” 一个文件系统应该涵盖以下所有特点: -1. **数据存储:** 对于任何一个文件系统来说,一个最主要的功能就是能够被当作一个容器结构来存储和恢复数据。 +1. **数据存储:** 对于任何一个文件系统来说,一个最主要的功能就是能够被当作一个容器结构来存储和取得数据。 +2. **命名空间:** 命名空间是一个提供了命名规则和数据结构的用于命名与组织的方法学。 +3. **安全模型:** 一个用于定义访问权限的策略。 +4. **API:** 调用操作这个系统的对象的系统方法,这些对象诸如目录和文件。 +5. **实现:** 能够实现以上几点的软件。 -2. **命名空间:** 命名空间是一个提供了命名规则和数据结构的用于命名与组织的方法学。 - -3. **安全模型:** 一个用于定义访问权限的策略。 - -4. **API:** 指的是调用了操作这个系统的对象的系统方法,这些对象诸如目录和文件。 - -5. **实现:** 能够实现以上几点的软件。 - -本文内容的讨论主要集中于上述几点中的第一项并探索为一个 EXT 文件系统的数据存储提供逻辑框架的元数据结构。 +本文内容的讨论主要集中于上述几点中的第一项,并探索为一个 EXT 文件系统的数据存储提供逻辑框架的元数据结构。 ### EXT 文件系统历史 @@ -26,47 +20,42 @@ Linux 的 EXT4 文件系统简介 ### Minix -当 Linux Torvalds 在写最初的 Linux 内核的时候,他需要一个文件系统但是他又不想自己写一个。于是他简单地把 [Minix 文件系统][14] 加了进去,这个 Minix 文件系统是由 [Andrew S. Tanenbaum][15] 写的同时也是 Tanenbaum 的 Minix 操作系统的一部分。[Minix][16] 是一个类 Unix 风格的操作系统,最初编写它的原因是用于教育。Minx 的代码是自由可用的且经过适当的许可的,所以 Torvalds 可以把它用 Linux 的最初版本里。 +当 Linux Torvalds 在写最初的 Linux 内核的时候,他需要一个文件系统但是他又不想自己写一个。于是他简单地把 [Minix 文件系统][14] 加了进去,这个 Minix 文件系统是由 [Andrew S. Tanenbaum][15] 写的,同时它也是 Tanenbaum 的 Minix 操作系统的一部分。[Minix][16] 是一个类 Unix 风格的操作系统,最初编写它的原因是用于教育用途。Minix 的代码是自由可用的并有适当的许可协议,所以 Torvalds 可以把它用 Linux 的最初版本里。 Minix 有以下这些结构,其中的大部分位于生成文件系统的分区中: -* [**boot 扇区**][6] 是硬盘驱动安装后的第一个扇区。这个 boot 块包含了一个非常小的 boot 记录和一个分区表。 - -* 每一个分区的第一个块都是一个包含了元数据的 **superblock** ,这些元数据定义了其他文件系统的结构并将其定位于物理硬盘的具体分区上。 - -* 一个 **inode 位图块** 决定了哪些 inode 是在使用中的,哪一些是未使用的。 - -* **inode** 在硬盘上有它们自己的空间。每一个 inode 都包含了一个文件的信息包括其所处的数据块的位置,也就是该文件所处的区域。 - +* [**引导扇区**][6] 是硬盘安装后的第一个扇区。这个引导块包含了一个非常小的引导记录和一个分区表。 +* 每一个分区的第一个块都是一个包含了元数据的**超级块(superblock)** ,这些元数据定义了其他文件系统的结构并将其定位于物理硬盘的具体分区上。 +* 一个 **inode 位图块** 决定了哪些 inode 是在使用中的,哪一些是未使用的。 +* **inode** 在硬盘上有它们自己的空间。每一个 inode 都包含了一个文件的信息,包括其所处的数据块的位置,也就是该文件所处的区域。 * 一个 **区位图** 用于保持追踪数据区域的使用和未使用情况。 - * 一个 **数据区**, 这里是数据存储的地方。 -对上述了两种位图类型来说,一个 bit 表示一个制定的数据区或者一个指定的 inode. 如果这个 bit 是 0 则表示这个数据区或者这个 inode 是可以使用的,如果是 1 则表示正在使用中。 +对上述了两种位图类型来说,一个位(bit)表示一个指定的数据区或者一个指定的 inode。 如果这个位是 0 则表示这个数据区或者这个 inode 是可用的,如果是 1 则表示正在使用中。 -那么,[inode][17] 又是什么呢 ? 就是 index-node (索引节点)的简写。 inode 是位于磁盘上的一个 256 字节的块,用于存储和该 inode 对应的文件的相关数据。这些数据包含了文件的大小、文件的所有者和所属组的用户的 ID、文件模式(即访问权限)以及三个时间戳用于指定:该文件最后的访问时间、该文件的最后修改时间和该 inode 中的数据的最后修改时间。 +那么,[inode][17] 又是什么呢 ? 就是 index-node (索引节点)的简写。 inode 是位于磁盘上的一个 256 字节的块,用于存储和该 inode 对应的文件的相关数据。这些数据包含了文件的大小、文件的所有者和所属组的用户 ID、文件模式(即访问权限)以及三个时间戳用于指定:该文件最后的访问时间、该文件的最后修改时间和该 inode 中的数据的最后修改时间。 -同时,这个 inode 还包含了指向了其所对应的文件的数据在硬盘中的位置。在 Minix 和 EXT1-3 文件系统中,inode 表示的是一系列的的数据区和块。Minix 文件系统的 inode 支持 9 个数据块包括 7 个直接数据块和 2 个间接数据块。如果你想要更深入的了解,这里有一个优秀的 PDF 详细地描述了 [Minix 文件系统街头][18] 。同时你也可以在维基百科上对 [inode 指针结构][19] 做一个快速的浏览。 +同时,这个 inode 还包含了指向了其所对应的文件的数据在硬盘中的位置。在 Minix 和 EXT 1-3 文件系统中,这是一个数据区和块的列表。Minix 文件系统的 inode 支持 9 个数据块,包括 7 个直接数据块和 2 个间接数据块。如果你想要更深入的了解,这里有一个优秀的 PDF 详细地描述了 [Minix 文件系统结构][18] 。同时你也可以在维基百科上对 [inode 指针结构][19] 做一个快速了解。 ### EXT -原生的 [EXT 文件系统][20] (指经过扩展的) 是由 [Rémy Card][21] 编写并于 1992 年与 Linux 一同发行。主要是为了克服 Minix 文件系统中的一些文件大小限制的问题。其中,最主要的结构变化就是文件系统中的元数据。它基于 Unix 文件系统 (UFS),也被称为伯克利快速文件系统(FFS)。我发现只有很少一部分关于 EXT 文件系统的发行信息是可以被验证的,显然这是因为其存在着严重的问题并且它很快地被 EXT2 文件系统取代了。 +原生的 [EXT 文件系统][20] (意即扩展的(extended)) 是由 [Rémy Card][21] 编写并于 1992 年与 Linux 一同发行。主要是为了克服 Minix 文件系统中的一些文件大小限制的问题。其中,最主要的结构变化就是文件系统中的元数据。它基于 Unix 文件系统 (UFS),其也被称为伯克利快速文件系统(FFS)。我发现只有很少一部分关于 EXT 文件系统的发行信息是可以被确证的,显然这是因为其存在着严重的问题,并且它很快地被 EXT2 文件系统取代了。 ### EXT2 -[EXT2 文件系统][22] 就相当地成功,它在 Linux 发行版中存活了多年。它是我在 1997 年开始使用 Red Hat Linux 时认识的第一个文件系统。实际上,EXT2 文件系统有着和 EXT 文件系统基本相同的元数据结构。然而 EXT2 更高瞻远瞩,因为其元数据结构之间留有很多磁盘空间供将来使用。 +[EXT2 文件系统][22] 就相当地成功,它在 Linux 发行版中存活了多年。它是我在 1997 年开始使用 Red Hat Linux 5.0 时接触的第一个文件系统。实际上,EXT2 文件系统有着和 EXT 文件系统基本相同的元数据结构。然而 EXT2 更高瞻远瞩,因为其元数据结构之间留有很多磁盘空间供将来使用。 -和 Minix 类似,EXT2 也有一个[boot 扇区][23] ,它是硬盘驱动安装后的第一个扇区。它包含了少量的 boot 记录和一个分区表。接着 boot 扇区之后是一些保留的空间,它跨越引导记录和通常位于下一个柱面的硬盘驱动器上的第一个分区之间的空间。 [GRUB2] [24] - 也可能是GRUB1 - 将此空间用于其部分启动代码。 +和 Minix 类似,EXT2 也有一个[引导扇区][23] ,它是硬盘安装后的第一个扇区。它包含了非常小的引导记录和一个分区表。接着引导扇区之后是一些保留的空间,它填充了引导记录和硬盘驱动器上的第一个分区(通常位于下一个柱面的)之间的空间。[GRUB2][24] - 也可能是 GRUB1 - 将此空间用于其部分引导代码。 -每个 EXT2 分区中的空间分为各柱面组,它允许更精细地管理数据空间。 根据我的经验,每一组大小通常约为8MB。 下面的图1显示了一个柱面组的基本结构。 柱面中的数据分配单元是块,通常大小为4K。 +每个 EXT2 分区中的空间被分为柱面组,它允许更精细地管理数据空间。 根据我的经验,每一组大小通常约为 8MB。 下面的图 1 显示了一个柱面组的基本结构。 柱面中的数据分配单元是块,通常大小为 4K。 ![cylindergroup-01_1.png](https://opensource.com/sites/default/files/images/life-uploads/cylindergroup-01_1.png) -Figure 1: EXT 文件系统中的柱面组的结构 +*图 1: EXT 文件系统中的柱面组的结构* -柱面组中的第一个块是一个超级块,它包含了一个定义了其他文件系统的结构并将其定位于物理硬盘的具体分区上的元数据。分区中有一些柱面组还会有备用超级块,但并不是所有的柱面组都有。我们还可以使用例如 **dd** 等磁盘工具来拷贝备用超级块的内容到主超级块上以达到更换损坏超级块的目的。虽然这种情况不会经常发生,但是在几年前我的一个超级块损坏了,我就是用这种方法来修复的。幸好,我很有先见之明地使用了 **dumpe2fs** 命令来备份了我的分区描述符信息到我的系统上。 +柱面组中的第一个块是一个超级块(superblock),它包含了一个元数据,定义了其它文件系统的结构并将其定位于物理硬盘的具体分区上。分区中有一些柱面组还会有备用超级块,但并不是所有的柱面组都有。我们还可以使用例如 `dd` 等磁盘工具来拷贝备用超级块的内容到主超级块上,以达到修复损坏的超级块的目的。虽然这种情况不会经常发生,但是在几年前我的一个超级块损坏了,我就是用这种方法来修复的。幸好,我很有先见之明地使用了 `dumpe2fs` 命令来备份了我的分区描述符信息到我的系统上。 -以下是 **dumpe2fs** 命令的一部分输出。这部分输出主要是超级块上包含的一些元数据,同时也是文件系统上的前两个柱面组的数据。 +以下是 `dumpe2fs` 命令的一部分输出。这部分输出主要是超级块上包含的一些元数据,同时也是文件系统上的前两个柱面组的数据。 ``` # dumpe2fs /dev/sda1 @@ -147,26 +136,26 @@ Group 2: (Blocks 65536-98303) Free inodes: 16289-24432 Group 3: (Blocks 98304-131071) - +<截断> ``` -每一个柱面组都有自己的 inode 位图用于判定该柱面组中的哪些 inode 是使用中的而哪些又是未被使用的。每一个柱面组的 inode 都有它们自己的空间。每一个 inode 都包含了对应的文件的相关信息,包括其位于该文件的数据块中的位置。这个块位图纪录了文件系统中的使用中和非使用中的数据块。请注意,在上面的输出中有大量关于文件系统的数据。在非常大的文件系统上,组数据可以运行到数百页的长度。 组元数据包括组中所有空闲数据块的列表。 +每一个柱面组都有自己的 inode 位图,用于判定该柱面组中的哪些 inode 是使用中的而哪些又是未被使用的。每一个柱面组的 inode 都有它们自己的空间。每一个 inode 都包含了对应的文件的相关信息,包括其位于该文件的数据块中的位置。这个块位图纪录了文件系统中的使用中和非使用中的数据块。请注意,在上面的输出中有大量关于文件系统的数据。在非常大的文件系统上,组数据可以运行到数百页的长度。 组元数据包括组中所有空闲数据块的列表。 EXT 文件系统实现了数据分配策略以确保产生最少的文件碎片。减少文件碎片可以提高文件系统的性能。这些策略会在下面的 EXT4 中描述到。 -我所遇见的关于 EXT2 文件系统最大的问题是 **fsck** (文件系统检查) 程序这一环节占用了很长一段时间来定位和校准文件系统中的所有不一致性导致其共花费了数个小时来修复一个崩溃。有一次我的其中一台电脑共花费了 28 个小时在一次崩溃后重新启动时恢复磁盘上,并且是在磁盘被检测量在几百兆字节大小的情况下。 +我所遇见的关于 EXT2 文件系统最大的问题是 `fsck` (文件系统检查) 程序这一环节占用了很长一段时间来定位和校准文件系统中的所有的不一致性,从而导致一次系统崩溃(crash)后其会花费了数个小时来修复。有一次我的其中一台电脑在崩溃后重新启动时共花费了 28 个小时恢复磁盘,并且是在磁盘被检测量只有几百兆字节大小的情况下。 ### EXT3 -[EXT3 文件系统][25] 具有克服 **fsck** 程序需要完全恢复在文件更新操作期间发生的不正确关机损坏的磁盘结构所需的大量时间的单一目标。EXT 文件系统的唯一新增是 [日志][26],它将提前记录将对文件系统执行的更改。 磁盘结构的其余部分与 EXT2 中的相同。 +[EXT3 文件系统][25] 应一个目标而生,就是克服 `fsck` 程序需要完全恢复在文件更新操作期间发生的不正确关机而损坏的磁盘结构所需的大量时间。它对 EXT 文件系统的唯一新增功能是 [日志][26],它将提前记录将对文件系统执行的更改。 EXT3 的磁盘结构的其余部分与 EXT2 中的相同。 -作为一个先前的版本,除了直接写入数据到磁盘的数据区域外,EXT3 的日志在写入元数据时同时会也写入文件数据到磁盘上的一个指定数据区域。一旦这些数据安全地到达硬盘,它就可以几乎零丢失率地被合并或者被追加到目标文件。当这些数据被提交到磁盘上的数据区域上,这些日志就会随即更新,这样在系统发生故障之前,文件系统将保持一致状态,才能提交日志中的所有数据。在下次启动时,将检查文件系统的不一致性,然后将日志中保留的数据提交到磁盘的数据区,以完成对目标文件的更新。 +除了直接写入数据到磁盘的数据区域外,同先前的版本一样,EXT3 写入文件数据的日志随同元数据写入到磁盘上的一个指定数据区域。一旦这些数据安全地到达硬盘,它就可以几乎零丢失率地被合并或者被追加到目标文件。当这些数据被提交到磁盘上的数据区域上,这些日志就会随即更新,这样在日志中的所有数据提交之前,系统发生故障时文件系统将保持一致状态。在下次启动时,将检查文件系统的不一致性,然后将日志中保留的数据提交到磁盘的数据区,以完成对目标文件的更新。 -日记功能确实降低了数据写入性能,但是有三个可用于日志的选项,允许用户在性能和数据完整性和安全性之间进行选择。 我的个人更偏向于选择安全性,因为我的环境不需要大量的磁盘写入活动。 +日志功能确实降低了数据写入性能,但是有三个可用于日志的选项,允许用户在性能和数据完整性和安全性之间进行选择。 我的个人更偏向于选择安全性,因为我的环境不需要大量的磁盘写入活动。 -日志功能减少了在从几小时(甚至几天)到几分钟之间的失败后检查硬盘驱动器所需的时间。 多年来,我遇到了很多问题导致了我的系统崩溃。要详细说的话恐怕还得再写一篇文章,但这足以说明大多数是我自己造成的,就比如不小心踢掉一个电源插头。 幸运的是,EXT日志文件系统将启动恢复时间缩短到两三分钟。 此外,自从我开始使用带日志记录的EXT3,我从来没有遇到丢失数据的问题。 +日志功能将失败后检查硬盘驱动器所需的时间从减少了从几小时(甚至几天)减少到几分钟。 多年来,我遇到了很多导致了我的系统崩溃的问题。要详细说的话恐怕还得再写一篇文章,但这需要说明的是大多数是我自己造成的,就比如不小心踢掉一个电源插头。 幸运的是,EXT 日志文件系统将启动恢复时间缩短到两三分钟。 此外,自从我开始使用带日志记录的 EXT3,我从来没有遇到丢失数据的问题。 -EXT3 的日志功能可以关闭,然后作为 EXT2 文件系统。 该日志本身仍然是存在的,只是状态为空且未使用。 只需使用类型参数使用 mount 命令来 remount 到分区即可指定EXT2 \。 你可以从命令行执行此操作,但是具体还是取决于你正在使用的文件系统,但你可以更改 **/ etc / fstab** 文件中的类型说明符,然后重新启动。 我强烈建议不要将 EXT3文件系统安装为 EXT2 ,因为这会具有丢失数据和增加恢复时间的潜在可能性。 +EXT3 的日志功能可以关闭,然后其功能就等同于 EXT2 文件系统了。 该日志本身仍然是存在的,只是状态为空且未使用。 只需 `mount` 命令使用文件系统类型参数来重新挂载即可指定为 EXT2。 你可以从命令行执行此操作,但是具体还是取决于你正在使用的文件系统,但你可以更改 `/etc/fstab` 文件中的类型说明符,然后重新启动。 我强烈建议不要将 EXT3 文件系统安装为 EXT2 ,因为这会具有丢失数据和增加恢复时间的潜在可能性。 EXT2 文件系统可以使用如下命令来通过日志升级到 EXT3 。 @@ -174,15 +163,15 @@ EXT2 文件系统可以使用如下命令来通过日志升级到 EXT3 。 tune2fs -j /dev/sda1 ``` - **/dev/sda1** 表示驱动和分区的标识符。同时要注意修改 **/etc/fstab** 中的文件类型标识符并 remount 分区或者重启系统以确保修改生效。 +`/dev/sda1` 表示驱动器和分区的标识符。同时要注意修改 `/etc/fstab` 中的文件系统类型标识符并重新挂载分区或者重启系统以确保修改生效。 ### EXT4 -[EXT4 filesystem][27]主要提高了性能、可靠性和容量。位了提高可靠性,它新增了元数据和日志校验和。同时位了满足各种关键任务要求,文件系统新增了纳秒级别的时间戳。在时间戳字段中添加两个高位来延迟时间戳的 [2038 年的问题][28] ,在 EXT4 文件系统至少可达到 2446 年。 +[EXT4 文件系统][27]主要提高了性能、可靠性和容量。为了提高可靠性,它新增了元数据和日志校验和。同时为了满足各种关键任务要求,文件系统新增了纳秒级别的时间戳。在时间戳字段中添加两个高位来延缓时间戳的 [2038 年的问题][28] ,这样 EXT4 文件系统至少可达到 2446 年。 -在 EXT4 中,数据分配从固定块更改为盘区,盘区由硬盘驱动器上的开始和结束位置来描述。这使得可以在单个 inode 指针条目中描述非常长的物理连续的文件,这可以显着减少描述大文件中所有数据的位置所需的指针数。 EXT4 中已经实施了其他分配策略,以进一步减少碎片化。 +在 EXT4 中,数据分配从固定块更改为盘区(extent),盘区由硬盘驱动器上的开始和结束位置来描述。这使得可以在单个 inode 指针条目中描述非常长的物理上连续的文件,这可以显著减少描述大文件中所有数据的位置所需的指针数。 其它在 EXT4 中已经实施的分配策略可以进一步减少碎片化。 -EXT4 通过将新创建的文件分散在磁盘上,从而使其不会全部聚集在磁盘起始位置,就像早期的PC文件系统一样,减少了碎片。文件分配算法尝试在柱面组中尽可能均匀地扩展文件,并且当需要分段时,要使不连续文件扩展区尽可能靠近同一文件中的其他文件,以尽可能减少头部搜索和旋转等待时间尽可能的当创建新文件或扩展现有文件时,使用其他策略来预分配额外的磁盘空间。这有助于确保扩展文件不会自动导致其分段。新文件不会在现有文件之后立即分配,这也可以防止现有文件的碎片化。 +EXT4 通过将新创建的文件分散在磁盘上,从而使其不会像早期的 PC 文件系统一样全部聚集在磁盘起始位置,从而减少了碎片。文件分配算法尝试在柱面组中尽可能均匀地散布文件,并且当文件需要分段存储时,要使不连续的文件盘区尽可能靠近同一文件中的其他部分,以尽可能减少磁头搜索和电机旋转等待时间。当创建新文件或扩展现有文件时,使用其它策略来预先分配额外的磁盘空间。这有助于确保扩展文件时不会自动导致其分段。新文件不会在现有文件之后立即分配空间,这也可以防止现有文件的碎片化。 除了磁盘上数据的实际位置外,EXT4 使用诸如延迟分配的功能策略,以允许文件系统在分配空间之前收集正在写入磁盘的所有数据。这可以提高数据空间将是连续的可能性。 @@ -249,6 +238,7 @@ fsck -fn /dev/mapper/vg_01-home EXT 文件系统在一些 Linux 发行版本上作为默认文件系统已经超过二十多年了。它们用最少的维护代价提供了稳定性、高可用性、可靠性和其他各种表现。我尝试过一些其它的文件系统但最终都还是回归到 EXT。每一个我在工作中使用到 Linux 的地方都使用到了 EXT 文件系统,同时发现了它们适用于任何主流的负载。毫无疑问,EXT4 文件系统应该被用于大部分的 Linux 文件系统上,除非我们有明显的使用其它文件系统的理由。 + -------------------------------------------------------------------------------- 作者简介: From d97cafe9c218fa4e11da7e2799c80b2d81de1a92 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 9 Jul 2017 07:36:20 +0800 Subject: [PATCH 0638/1407] PRF&PUB:20170213 Free as in puppy The hidden costs of free software.md @XYenChi --- ...puppy The hidden costs of free software.md | 63 ++++++++++++++++++ ...puppy The hidden costs of free software.md | 64 ------------------- 2 files changed, 63 insertions(+), 64 deletions(-) create mode 100644 published/20170213 Free as in puppy The hidden costs of free software.md delete mode 100644 translated/talk/20170213 Free as in puppy The hidden costs of free software.md diff --git a/published/20170213 Free as in puppy The hidden costs of free software.md b/published/20170213 Free as in puppy The hidden costs of free software.md new file mode 100644 index 0000000000..9cd1e31368 --- /dev/null +++ b/published/20170213 Free as in puppy The hidden costs of free software.md @@ -0,0 +1,63 @@ +幼犬式免费:免费软件中的无形消费 +============================================================ + + ![幼犬式免费:免费软件中的无形消费](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/osdc_whitehurst_money.png?itok=Xqow4bzq "幼犬式免费: 免费软件中的无形消费") + +Image by : opensource.com + +我们习惯于软件被描述为“自由式免费free as in freedom”和“啤酒式免费free as in beer”。但还有另一种不常被提起的“免费”——“幼犬式免费free as in puppy”。这个概念来自于当别人送你一只免费的小狗,但那只小狗不是真的免费。日常照顾它需要花费大量精力与金钱。商业术语是“总体拥有成本”,即 TCO ,这适用于所有场景,不仅仅是开源软件和小狗。 + +既然免费小狗问题适用于所有事,那么它是如何对于开源软件特别重要的呢?有一些解释。首先,如果你已经购买了软件,就会因为消费对它设定期望值。软件起初免费后来需要花钱似乎是很无理的要求。其次,如果这发生在一个组织首次采用开源项目的时候,就会阻碍该组织下一次采用开源项目。最终且违反直觉的是,看起来开源软件需要花钱可能使得它更轻易“卖出”,如果它真的免费,未免也太好了一点。 + +接下来的部分是软件消费渐显的共同之处。这绝不是一个详尽的列表。 + +### 起始消费 + +开始使用软件之前,你必须首先拥有这个软件。 + +* **软件:** 因为它是开源的不一定意味着它是_免费的_。 +* **硬件:** 考虑到软件的需求。如果你没有使用软件所需的硬件(可能是服务器硬件或者客户端硬件),你得买。 +* **培训:** 很少有软件完全直白如话的。在于你是选择培训还是自己去弄清楚。 +* **实战:** 把所有零部件放在一起只是开始,现在,是时候把所有东西拼在一起了。 + * **安装和配置:** 至少这将花费一些员工的工作时间。如果这是一个大项目,你可能需要花钱请一个系统整合服务商或者其他供应商来做这件事。 + * **数据导入:** 如果要取代现成的系统,存在数据搬家的问题。皆大欢喜的是所有都是相同标准编译的,这样就没什么问题。然而在很多情况,需要写一些脚本来提取和重载数据。 + * **其他系统的接口:** 说到写脚本,这个软件能和你使用的其他软件(例如,目录服务或者工资软件)很好联系起来吗? + * **定制:** 如果原本的软件不能满足你所有的需求,那它可能需要定制。你可以做到,但是仍需要努力或者是一些原材料。 +* **商业变化:** 当你的组织希望有所提升时,新软件也可能会变化。然而这种转换不是免费的。例如,生产效率刚开始可能会下降因为员工还在适应新软件。 + +### 经营成本 + +安装软件是简单部分,现在你得使用它。 + +* **更多培训:** 什么,你认为我们已经做好了? 过段时间,你的组织会加入新人,他们需要学习如何使用这个软件,或者说是添加了额外功能的新版本软件发布了。 +* **维护:** + * **订阅费:** 有些软件通过收取订阅费来提供更新。 + * **补丁:**取决于软件的自身,打补丁需要费很多功夫。包括测试和部署。 + * **开发:**你自己做所有定制吗?现在你必须维护下去了。 +* **支持:** 当它坏了得有人来修,无论是供应商还是自己的团队,确实需要一笔花费。 +* **良好的做法:** 这个不是必需品,但如果你在使用开源软件,无论如何给一些回馈是非常好的。比如代码贡献、在邮件列表提供支持、赞助年度会议等等。 +* **商业利益:** 好吧,这不是一个付费项,而且它抵消了一些费用。使用软件对你的组织意味着什么呢?如果它使得量产产品减少了 25% 的浪费,这就是价值。再换个例子,它可能帮助你减少 30% 不盈利部分。 + +这样例子数不胜数,确实需要一定想象力来想出所有的花费。算出正确的价值需要一些实验和大量的的优质客户,但是这样分析一遍的话会使得它更加清晰。就好像一只小狗狗,如果预先知道自己会付出多少,这可能会是一个有价值的实验。 + +-------------------------------------------------------------------------------- + +作者简介: + +Ben Cotton - Ben Cotton 是一个培训过的气象学家和一个职业的高效计算机工程师。 Ben 在 Cycle Computing 做技术传教士。他是 Fedora 用户和贡献者,合作创办当地的一个开源集会,是一名开源倡议者和软件自由机构的支持者。他的推特 (@FunnelFiasco) + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/17/2/hidden-costs-free-software + +作者:[Ben Cotton][a] +译者:[XYenChi](https://github.com/XYenChi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/bcotton +[1]:https://opensource.com/article/17/2/hidden-costs-free-software?rate=gXfsYPWiIQNslwJ3zOAje71pTMRhp25Eo0HTdLWOKv4 +[2]:https://opensource.com/user/30131/feed +[3]:https://opensource.com/article/17/2/hidden-costs-free-software#comments +[4]:https://opensource.com/users/bcotton diff --git a/translated/talk/20170213 Free as in puppy The hidden costs of free software.md b/translated/talk/20170213 Free as in puppy The hidden costs of free software.md deleted file mode 100644 index 64c3f8cb1f..0000000000 --- a/translated/talk/20170213 Free as in puppy The hidden costs of free software.md +++ /dev/null @@ -1,64 +0,0 @@ -幼犬式免费:免费软件中的无形消费 -============================================================ - - ![幼犬式免费:免费软件中的无形消费](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/osdc_whitehurst_money.png?itok=Xqow4bzq "幼犬式免费: 免费软件中的无形消费") -Image by : opensource.com - -我们习惯于软件被描述为“自由式免费”和“啤酒式免费”。但还有另一种不常被提起的“免费”——“幼犬式免费”。这个概念来自于当别人送你一只免费的小狗,但那只小狗不是真的免费。日常照顾它需要花费大量精力与金钱。商业术语是“所有权的总花费”,或 TCO (总体拥有成本),这适用于所有场景,不仅仅是开源软件和小狗。 - -既然免费小狗问题适用于所有事,那么它是如何对于开源软件特别重要的呢?有一些解释。首先,如果你已经购买了软件,就会因为消费对它设定期望值。软件起初免费后来收费似乎是主要的无理要求。其次,如果这发生在一个组织首次采用开源项目的时候,就会阻碍该组织下一次采用开源项目。最终且违反直觉的是,表明开源软件需要消费可能使得它更轻易“卖出”,如果它真的免费,未免也太好了一点。 - -接下来的部分是软件消费渐显的共同之处。这绝不是一个详尽的列表。 - -### 起始消费 - -开始使用软件之前,你必须首先拥有这个软件。 - -* **软件:** 只因为它开源不一定意味着它是_免费的_. -* **硬件:** 考虑到软件的需求。如果你没有使用软件所需的硬件(可能是服务器硬件或者客户端硬件),你得买 -* **培训:** 很少有软件完全直白如话的。在于你是选择培训还是自己弄清楚。 -* **实战** 把所有零部件放在一起只是开始,现在,是时候把所有难题放在一起了。 - - * **安装和配置:** 至少这将花费一些员工的工作时间。如果这是一个大项目,你可能需要花钱请一个系统整合者或者其他供应商来做这件事。 - * **数据导入:** 如果要取代现成的系统,存在数据搬家的问题。皆大欢喜的是所有都是相同标准编译的,这样就没什么问题。然而在很多情况,需要写一些脚本来提取和重载数据。 - * **其他系统的接口:** 说到写脚本,这个软件能和你使用的其他软件(例如,词典服务或者工资单软件)很好联系起来吗? - * **定制:** 如果原本的软件不能满足你所有的需求,那它可能需要定制。你可以做到,但是仍需要努力或者是一些原材料。 -* **营业额变化:** 当你的组织希望有所改善时,新软件也会变化。然而这种转换不是免费的。例如,生产效率刚开始可能会下降因为员工还在适应新软件。 - -### 经营成本 - -安装软件是简单部分,现在你得使用它。 - -* **更多培训:** 什么, 你认为我们已经做好这了? 过段时间,你的组织会加入信任,他们需要学习如何使用这个软件,或者说是添加了额外功能的新发行版软件出版了。 -* **维护:** - - * **会员费:** 有些软件通过收取会员费来提供更新。 - * **补丁:**取决于软件的天性,打补丁需要费很多功夫。包括测试和调度。 - * **发展:**你自己做所有定制吗?现在你得永远保持这样了。、 -* **支持:** 当它坏了得有人来修,无论是供应商还是自己的团队,确实需要一笔花费。 -* **好身份:** 这个不是必需品,但如果你在使用开源软件,无论如何给一些回馈是非常好的。比如代码贡献、在邮件列表提供支持、赞助年度会议等等。 -* **商业利益:** 好吧,这不是一个付费项,而且它抵消了一些费用。使用软件对你的组织意味着什么呢?如果它使得量产产品减少了 25% 的浪费,这就是价值。再换个例子,它可能帮助你减少 30% 不盈利部分。 - -这样例子数不胜数,确实需要一定想象力来想出所有的花费。算出正确的价值需要一些实验和大量的的优质客户,但只是经历过程的话会使得它更加清晰。就好像一只小狗狗,如果预先知道自己会付出多少,这可能会是一个有价值的实验。 - --------------------------------------------------------------------------------- - -作者简介: - -Ben Cotton - Ben Cotton 是一个培训过的气象学家和一个职业的高效计算机工程师。 Ben 在 Cycle Computing 做技术传教士.他是 Fedora 用户和贡献者, 合作创办当地的一个开源集会,是一名开源倡议者和软件自由机构的支持者。他的推特 (@FunnelFiasco) - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/17/2/hidden-costs-free-software - -作者:[Ben Cotton ][a] -译者:[XYenChi](https://github.com/XYenChi) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/bcotton -[1]:https://opensource.com/article/17/2/hidden-costs-free-software?rate=gXfsYPWiIQNslwJ3zOAje71pTMRhp25Eo0HTdLWOKv4 -[2]:https://opensource.com/user/30131/feed -[3]:https://opensource.com/article/17/2/hidden-costs-free-software#comments -[4]:https://opensource.com/users/bcotton From 195a106bcbe3f9950bc0dc85caaf859cfbd91046 Mon Sep 17 00:00:00 2001 From: geekpi Date: Sun, 9 Jul 2017 19:27:02 +0800 Subject: [PATCH 0639/1407] translated --- ...urn a Raspberry Pi into an eBook server.md | 117 ------------------ ...urn a Raspberry Pi into an eBook server.md | 114 +++++++++++++++++ 2 files changed, 114 insertions(+), 117 deletions(-) delete mode 100644 sources/tech/20170627 How to turn a Raspberry Pi into an eBook server.md create mode 100644 translated/tech/20170627 How to turn a Raspberry Pi into an eBook server.md diff --git a/sources/tech/20170627 How to turn a Raspberry Pi into an eBook server.md b/sources/tech/20170627 How to turn a Raspberry Pi into an eBook server.md deleted file mode 100644 index 7f0355226a..0000000000 --- a/sources/tech/20170627 How to turn a Raspberry Pi into an eBook server.md +++ /dev/null @@ -1,117 +0,0 @@ -translating---geekpi - -How to turn a Raspberry Pi into an eBook server -============================================================ - -### The Calibre eBook management software makes it easy to set up an eBook server on a Raspberry Pi 3, even in low-connectivity areas. - - -![How to turn a Raspberry Pi into an eBook server](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/idea_innovation_mobile_phone.png?itok=Ep49JfKU "How to turn a Raspberry Pi into an eBook server") -Image by :  - -opensource.com - -Recently [Calibre 3.0 was released][12] which enables users to read books in the browser! Note that Raspbian's repositories have not yet been updated yet (as of this writing). - -eBooks are a great way for teachers, librarians, and others to share books, classroom materials, or other documents with students—provided you have ready and reliable access to broadband. But even if you have low or no connectivity, there's an easy solution: Create an eBook server with the open source Calibre eBook management software running on a Raspberry Pi 3\. Here's how I did it—and you can, too. - -First I downloaded the latest [Raspbian Pixel image][13] and installed it on a new 8GB microSD card. Then I inserted the microSD; connected a keyboard, mouse, and an old LCD TV with an HDMI cable; and booted the Pi. After [adjusting the resolution][14] of the Pixel environment on my monitor and connecting to the local network, I was ready to begin. I opened a terminal and entered **sudo apt-get update** to get the latest updates for the operating system. - -### [1updateos.png][1] - -![Updating Raspbian Pixel](https://opensource.com/sites/default/files/u128651/1updateos.png "Updating Raspbian Pixel") - -Next, I installed the [Calibre][15] software by entering **sudo apt-get install calibre** in a terminal. - -### [2install_calibre.png][2] - -![Installing Calibre](https://opensource.com/sites/default/files/u128651/2install_calibre.png "Installing Calibre") - -I launched Calibre from the command line (note that it can be launched from the GUI also). The Calibre interface is very intuitive. The first time you launch, you see the **Welcome to Calibre** wizard. I changed the default Calibre Library to **CalibreLibrary** (one word), because it's easier when launching the content server. - -After choosing the location for my Calibre content, I was ready to begin downloading books. - -### [3calibre-interface.png][3] - -![Calibre's interface](https://opensource.com/sites/default/files/u128651/3calibre-interface.png "Calibre's interface") - -I selected the **Get Books** option from the menu, and it was very easy to enter my search terms and select the eBook provider I was interested in. I was looking for [non-DRM][16] material, so I chose [Project Gutenberg][17] as my source. (Calibre's disclaimer notes that eBook transactions are between you and the individual content providers.) I entered "Mark Twain" in the author field and got 10 results. - -### [4books.png][4] - -![Searching for e-books](https://opensource.com/sites/default/files/u128651/4books.png "Searching for e-books") - -I selected  _Adventures of Huckleberry Finn_ . On the next screen, I could choose between the **MOBI** and **EPUB** eBook formats. I chose EPUB, and the book downloaded very quickly. - -### [5ebook-formats.png][5] - -![Choosing the e-book format](https://opensource.com/sites/default/files/u128651/5ebook-formats.png "Choosing the e-book format") - -You can also add books to the library from other content providers, not in Calibre's list. For example, a teacher could share open educational resources in eBook format with students through this content server.  To load the content, use the "Add Books" menu option at the far left of the interface - -Depending on the size of your library, you may also need to increase the size of your microSD card. - -![start_the_server.png](https://opensource.com/sites/default/files/images/life-uploads/start_the_server.png) - -After you have added content to your eBook server, you are ready to share it with the rest of your network. Get the IP address of your Raspberry Pi by entering **ifconfig** into the terminal. I was using the wireless network, so I used the result for **wlan0** in the example below. Navigate to the far right of the interface and expand the menu. Then, navigate to "Connect and Share" and start the server. - -### [6ipconfig.png][6] - -![Identifying the IP address with ipconfig](https://opensource.com/sites/default/files/u128651/6ipconfig.png "Identifying the IP address with ipconfig") - -My next step was connecting my client computer to the Raspberry Pi to access the eBooks I'd added. I opened a browser on my client device and navigated to the Raspberry Pi's IP address with the port **:8080** appended. In my case, that was **[http://192.168.1.10:8080][10]** (adapt that format to your Pi's IP address). - -You'll see this home page in your browser: - -### [7calibre-home.png][7] - -![Calibre's client homepage](https://opensource.com/sites/default/files/u128651/7calibre-home.png "Calibre's client homepage") - -I tested and easily connected to the server with an iPhone and Linux and MacOS computers. - -You can explore the options on this home page, or click on **All Books** to display all the content on your eBook server. - -### [8browsing-books.png][8] - -![Browsing e-books](https://opensource.com/sites/default/files/u128651/8browsing-books.png "Browsing e-books") - -From here, you can download the books to your device and read them offline. - -Have you ever set up an eBook server? Or are you thinking about setting up one yourself? Share your advice or questions in the comments. - --------------------------------------------------------------------------------- - -作者简介: - -Don Watkins - Educator, education technology specialist, entrepreneur, open source advocate. M.A. in Educational Psychology, MSED in Educational Leadership, Linux system administrator, CCNA, virtualization using Virtual Box. Follow me at @Don_Watkins . - ------------------ - -via: https://opensource.com/article/17/6/raspberrypi-ebook-server - -作者:[Don Watkins ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/don-watkins -[1]:https://opensource.com/file/356446 -[2]:https://opensource.com/file/356451 -[3]:https://opensource.com/file/356456 -[4]:https://opensource.com/file/356461 -[5]:https://opensource.com/file/356466 -[6]:https://opensource.com/file/356471 -[7]:https://opensource.com/file/356476 -[8]:https://opensource.com/file/356481 -[9]:https://opensource.com/article/17/6/raspberrypi-ebook-server?rate=60Tv_hObNU1MQs2f3G6kNoT4qLyxJ03S1q75p2UEOYg -[10]:http://192.168.1.10:8080/ -[11]:https://opensource.com/user/15542/feed -[12]:https://the-digital-reader.com/2017/06/19/calibre-3-0-released/ -[13]:https://www.raspberrypi.org/downloads/raspbian/ -[14]:https://www.raspberrypi.org/forums/viewtopic.php?t=5851 -[15]:https://calibre-ebook.com/ -[16]:https://en.wikipedia.org/wiki/Digital_rights_management -[17]:https://www.gutenberg.org/ -[18]:https://opensource.com/users/don-watkins -[19]:https://opensource.com/article/17/6/raspberrypi-ebook-server#comments diff --git a/translated/tech/20170627 How to turn a Raspberry Pi into an eBook server.md b/translated/tech/20170627 How to turn a Raspberry Pi into an eBook server.md new file mode 100644 index 0000000000..972ba4ba91 --- /dev/null +++ b/translated/tech/20170627 How to turn a Raspberry Pi into an eBook server.md @@ -0,0 +1,114 @@ +如何将树莓派变成电子书服务器 +============================================================ + +### Calibre 电子书管理软件可以轻松地在树莓派 3 上设置电子书服务器,即使在连接较慢区域也是如此。 + +![How to turn a Raspberry Pi into an eBook server](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/idea_innovation_mobile_phone.png?itok=Ep49JfKU "How to turn a Raspberry Pi into an eBook server") +图片提供:  + +opensource.com + +最近[Calibre 3.0 发布了][12],它让用户能够在浏览器中阅读!注意 Raspbian 的仓库还没有更新(截至写作时)。 + +电子书是教师、图书馆员和其他人与学生共享书籍、课堂资料或其他文件的好方法,只需要你有可靠的带宽接入即可。但是,即使你的连接速度较慢或无法连接,还有一个简单的解决方案:使用在树莓派 3 上运行的开源 Calibre 电子书管理软件创建电子书服务器。这是我所做的,你也可以。 + +首先我下载了最新的[ Raspbian Pixel 镜像][13],并安装在一个新的 8GB microSD 卡上。然后我插入 microSD,连接到一块键盘,鼠标并用一根 HDMI 线连接到一台旧的 LCD 电视,然后启动了 Pi。在我的显示器上[调整了 Pixel 环境分辨率][14]并连接到本地网络之后,我准备开始了。我打开一个终端,并输入 **sudo apt-get update** 以获取操作系统的最新更新。 + +### [1updateos.png][1] + +![Updating Raspbian Pixel](https://opensource.com/sites/default/files/u128651/1updateos.png "Updating Raspbian Pixel") + +接下来,我在终端中输入 **sudo apt-get install calibre** 来安装 [Calibre][15]。 + +### [2install_calibre.png][2] + +![Installing Calibre](https://opensource.com/sites/default/files/u128651/2install_calibre.png "Installing Calibre") + +我从命令行启动了 Calibre(注意它也可以从 GUI 启动)。Calibre 的界面非常直观。第一次启动时,你会看到 **Welcome to Calibre** 的向导。我将默认 Calibre Library 更改为 **CalibreLibrary**(一个字),因为这启动内容服务器时更容易。 + +在选择完我的 Calibre 内容位置后,我准备好开始下载书了。 + +### [3calibre-interface.png][3] + +![Calibre's interface](https://opensource.com/sites/default/files/u128651/3calibre-interface.png "Calibre's interface") + +我从菜单中选择了 **Get Books** 选项,在这很容易输入我的搜索字词,并选择我感兴趣的电子书提供者。我正在寻找[非 DRM ][16]的材料,所以我选择 [Project Gutenberg][17] 作为我的源。(Caliber 的免责声明指出,电子书交易是在你和个人内容提供商之间。)我在作者字段中输入 “Mark Twain”,并得到10个结果。 + +### [4books.png][4] + +![Searching for e-books](https://opensource.com/sites/default/files/u128651/4books.png "Searching for e-books") + +我选择了 _Adventures of Huckleberry Finn_ 这本书。在下一页面上,我可以选择 **MOBI** 和 **EPUB** 这两种电子书格式。我选择了 EPUB,这本书下载得很快。 + +### [5ebook-formats.png][5] + +![Choosing the e-book format](https://opensource.com/sites/default/files/u128651/5ebook-formats.png "Choosing the e-book format") + +你也可以从其他内容提供商向库中添加图书,而不是在 Calibre 的列表中添加图书。例如,老师可以通过该内容服务器与学生分享电子书格式的开放教育资源。要加载内容,请使用界面最左侧的 “Add Books” 选项。 + +根据你图书库的大小,你也许需要增加 microSD 卡的大小。 + +![start_the_server.png](https://opensource.com/sites/default/files/images/life-uploads/start_the_server.png) + +将内容添加到电子书服务器后,即可与网络中的其他人共享内容。通过在终端中输入 **ifconfig ** 获取你的树莓派 IP 地址。我正在使用无线网络,所以我在下面的例子中使用了 **wlan0** 中的结果。点击界面的最右侧并展开菜单。然后点击 “Connect and Share” 并启动服务器。 + +### [6ipconfig.png][6] + +![Identifying the IP address with ipconfig](https://opensource.com/sites/default/files/u128651/6ipconfig.png "Identifying the IP address with ipconfig") + +我下一步是通过我的电脑客户端连接到树莓派访问我添加的电子书。我在客户端上打开一个浏览器并输入树莓的地址,后面加上 **:8080** 端口。在我这里是 **[http://192.168.1.10:8080][10]** (根据你 Pi 的地址来适配)。 + +你会在浏览器中看到主页: + +### [7calibre-home.png][7] + +![Calibre's client homepage](https://opensource.com/sites/default/files/u128651/7calibre-home.png "Calibre's client homepage") + +我已经测试,并能用 iPhone、Linux、MacOS 计算机轻易连接到服务器。 + +你可以在这个主页总探索选项,或者点击 **All Books** 显示服务器上的所有内容。 + +### [8browsing-books.png][8] + +![Browsing e-books](https://opensource.com/sites/default/files/u128651/8browsing-books.png "Browsing e-books") + +从这里,你可以下载书到你的设备并离线阅读了。 + +你还没有设置一台电子书服务器么?或者你考虑自己设置一台么?在评论中分享你的建议或者问题。 + +-------------------------------------------------------------------------------- + +作者简介: + +Don Watkins - 教育家、教育技术专家、企业家、开源倡导者。教育心理学硕士、教育领导硕士、Linux 系统管理员、CCNA、使用 Virtual Box 虚拟化。关注我 @Don_Watkins。 + +----------------- + +via: https://opensource.com/article/17/6/raspberrypi-ebook-server + +作者:[Don Watkins ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/don-watkins +[1]:https://opensource.com/file/356446 +[2]:https://opensource.com/file/356451 +[3]:https://opensource.com/file/356456 +[4]:https://opensource.com/file/356461 +[5]:https://opensource.com/file/356466 +[6]:https://opensource.com/file/356471 +[7]:https://opensource.com/file/356476 +[8]:https://opensource.com/file/356481 +[9]:https://opensource.com/article/17/6/raspberrypi-ebook-server?rate=60Tv_hObNU1MQs2f3G6kNoT4qLyxJ03S1q75p2UEOYg +[10]:http://192.168.1.10:8080/ +[11]:https://opensource.com/user/15542/feed +[12]:https://the-digital-reader.com/2017/06/19/calibre-3-0-released/ +[13]:https://www.raspberrypi.org/downloads/raspbian/ +[14]:https://www.raspberrypi.org/forums/viewtopic.php?t=5851 +[15]:https://calibre-ebook.com/ +[16]:https://en.wikipedia.org/wiki/Digital_rights_management +[17]:https://www.gutenberg.org/ +[18]:https://opensource.com/users/don-watkins +[19]:https://opensource.com/article/17/6/raspberrypi-ebook-server#comments From a2b56ef53042d011c8e583fd5956e05e2eda4d28 Mon Sep 17 00:00:00 2001 From: cycoe Date: Sun, 9 Jul 2017 22:12:40 +0800 Subject: [PATCH 0640/1407] translated by cycoe --- ...talling Fedora 26 Beta on a MacBook Air.md | 90 ------------------- ...talling Fedora 26 Beta on a MacBook Air.md | 89 ++++++++++++++++++ 2 files changed, 89 insertions(+), 90 deletions(-) delete mode 100644 sources/tech/20170617 Installing Fedora 26 Beta on a MacBook Air.md create mode 100644 translated/tech/20170617 Installing Fedora 26 Beta on a MacBook Air.md diff --git a/sources/tech/20170617 Installing Fedora 26 Beta on a MacBook Air.md b/sources/tech/20170617 Installing Fedora 26 Beta on a MacBook Air.md deleted file mode 100644 index 63cb2ef09d..0000000000 --- a/sources/tech/20170617 Installing Fedora 26 Beta on a MacBook Air.md +++ /dev/null @@ -1,90 +0,0 @@ -Translating by cycoe - -Installing Fedora 26 Beta on a MacBook Air -====================== - - -Since Fedora 26 Beta came out a few days ago, I decided it was a great time to throw it on my 13" MacBook Air. - -This MacBook Air is a model number A1466 EMC 2925 which looks like a 2015ish model, 8gb mem, 2.2GHz i7, 512gb ssd. - -First thing I did was download the beta. You can grab it from the [GetFedora][1] website. Once you have it downloaded, install it to a usb flash drive. From Linux, you can do this easily with the dd command. - -Plug your USB drive into your computer and tail /var/log/syslog (or /var/log/messages) to see what flies by. You can also do a 'df -h' to show the storage devices to find the correct /dev/sdX. - -In this example, we'll assume the USB flash drive is /dev/sdc - -Code: -``` -dd if=/home/rob/Downloads/Fedora-Workstation-Live-x86_64-26_Beta-1.4.iso of=/dev/sdc bs=8M status=progress oflag=direct -``` - -That may take a bit.. let it finish out. - -Next, I shut down the macbook, counted to 5 and powered it back on. After hitting the power on button I held down the 'option' button to give me boot options. The image below shows what my choices were: - -![macbook-air-fedora.jpg](https://www.linux.org/attachments/macbook-air-fedora-jpg.2763/) - -Click the arrow under 'fedora' and proceed with the install. - -After going through the installation I noticed that I had no wifi. Luckily I had a thunderbolt-to-ethernet dongle since this laptop doesn't actually have an ethernet port. I hopped on google and found some great instructions from [this page][2]. - -To set up wifi, -Update your kernel - -Code: -``` -sudo dnf update kernel -``` - -(then reboot) - -Install rpmfusion repo - -Code: -``` -su -c 'dnf install -y http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm' -``` - -Install akmods and kernel-devel packages - -Code: -``` -sudo dnf install -y akmods "kernel-devel-uname-r == $(uname -r)" -``` - -Install the broadcom-wl package from rpmfusion - -Code: -``` -sudo dnf install -y broadcom-wl -``` - -Rebuild kernel extensions - -Code: -``` -sudo akmods -``` - -Then, reboot and hop on your wifi! - -Messing around a little bit with it so far, I'm very impressed! All of the function keys work that I care about (screen brightness, keyboard backlight, volume). - -Then, in July when the non-beta is released, I'll just dnf my way to it! - -Thanks Fedora! - --------------------------------------------------------------------------------- - -via: https://www.linux.org/threads/installing-fedora-26-beta-on-a-macbook-air.12464/ - -作者:[Rob ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.linux.org/members/rob.1/ -[1]:https://getfedora.org/en/workstation/prerelease/ -[2]:https://gist.github.com/jamespamplin/7a803fd5be61d4f93e0c5dcdea3f99ee diff --git a/translated/tech/20170617 Installing Fedora 26 Beta on a MacBook Air.md b/translated/tech/20170617 Installing Fedora 26 Beta on a MacBook Air.md new file mode 100644 index 0000000000..95f7c6a574 --- /dev/null +++ b/translated/tech/20170617 Installing Fedora 26 Beta on a MacBook Air.md @@ -0,0 +1,89 @@ +Translated by cycoe + +在 MacBook Air 上安装 Fedora 26 测试版 +====================== + + +距离 Fedora 26 测试版发布已有几天,我认为是时候把它安装在我的 13 寸 MacBook Air 上了。 + +这代 MacBook Air 的型号为 A1466 EMC 2925,拥有 8gb 内存,2.2GHz i7 处理器,512gb ssd,以及与 2015ish 相似的外观。 + +首先我下载了 beta 版镜像,你能够从 [GetFedora][1] 网站获取。一旦你下载完成,就可将它安装在 USB 闪存驱动器上。在 Linux 上,你可以用 `dd` 命令方便的完成这个操作。 + +将 USB 驱动器插入到你的电脑上,并使用 `tail` 命令读取 `/var/log/syslog` 或 `/var/log/messages` 文件的最后几行。你也可以使用 `df -h` 命令查看存储设备从而找到正确的 /dev/sdX。 + +在下面的例子中,我们假设 USB 闪存驱动器为 /dev/sdc + +代码: +``` +dd if=/home/rob/Downloads/Fedora-Workstation-Live-x86_64-26_Beta-1.4.iso of=/dev/sdc bs=8M status=progress oflag=direct +``` + +这将花费一点点时间... 让我们耐心等待。 + +接下来,我关掉 MacBook,等待 5 s 后将它重新启动。在按下电源键后,我按住 'option' 键来呼出启动选项。我的选择如下图: + +![macbook-air-fedora.jpg](https://www.linux.org/attachments/macbook-air-fedora-jpg.2763/) + +点击 'fedora' 下面的箭头进入安装过程。 + +在进入安装过程后我注意到我没有 wifi 网络。幸运的是我有个雷电口转以太网的转接器,因为这个笔记本实际上没有以太网接口。我寄希望于谷歌并于 [此处][2] 找到了一些很棒的指导。 + +设置 wifi 前先更新内核 + +代码: +``` +sudo dnf update kernel +``` + +(然后重启) + +安装 rpmfusion 仓库 + +代码: +``` +su -c 'dnf install -y http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm' +``` + +安装 akmods 和 kernel-devel 包 + +代码: +``` +sudo dnf install -y akmods "kernel-devel-uname-r == $(uname -r)" +``` + +从 rpmfusion 仓库安装 broadcom-wl 包 + +代码: +``` +sudo dnf install -y broadcom-wl +``` + +重构内核扩展 + +代码: +``` +sudo akmods +``` + +然后重启连接你的 wifi! + +到目前为止我们已经解决,这使我印象非常深刻!所有我关心的功能键都能够正常工作,如屏幕亮度、键盘背光、音量。 + +接下来,等 7 月份发布非测试版时,我将马上使用 dnf 升级! + +感谢你,Fedora! + +-------------------------------------------------------------------------------- + +via: https://www.linux.org/threads/installing-fedora-26-beta-on-a-macbook-air.12464/ + +作者:[Rob ][a] +译者:[cycoe](https://github.com/cycoe) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.linux.org/members/rob.1/ +[1]:https://getfedora.org/en/workstation/prerelease/ +[2]:https://gist.github.com/jamespamplin/7a803fd5be61d4f93e0c5dcdea3f99ee From 2e932b9c22c0a8b9f879948ce0a7c09f932b3ab7 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 9 Jul 2017 23:49:38 +0800 Subject: [PATCH 0641/1407] PRF&PUB:28 - The history of Android.md @alim0x --- .../28 - The history of Android.md | 80 +++++++------------ 1 file changed, 28 insertions(+), 52 deletions(-) rename {translated/talk => published}/The history of Android/28 - The history of Android.md (76%) diff --git a/translated/talk/The history of Android/28 - The history of Android.md b/published/The history of Android/28 - The history of Android.md similarity index 76% rename from translated/talk/The history of Android/28 - The history of Android.md rename to published/The history of Android/28 - The history of Android.md index 7dc1bef410..a5926fec19 100644 --- a/translated/talk/The history of Android/28 - The history of Android.md +++ b/published/The history of Android/28 - The history of Android.md @@ -1,11 +1,9 @@ -安卓编年史 +安卓编年史(28):Android 5.0 Lollipop——有史以来最重要的安卓版本(2) ================================================================================ ->让我们跟着安卓从 0.5 版本到 7 的无尽迭代来看看它的发展历史。 - #### ART——为未来提供了一个平台的安卓运行时 -安卓里没有多少组件的血统能追溯到 1.0 时代,但在 2014 年 Dalvik 这个驱动安卓应用的运行时是它们中的一员。Dalvik 最初是为单核,低端性能设备设计的,而且存储和内存占用的优先级要高于性能表现。在过去的几年里,谷歌给 Dalvik 扩充了越来越多的更新,比如 JIT 支持,并发垃圾回收,以及多进程支持。但是随着多核手机的出现,它们比 T-Mobile G1 快上很多倍,而这些功能升级扩充只能帮安卓到这里了。 +安卓里没有多少组件的血统能追溯到 1.0 时代,但在 2014 年, Dalvik 这个驱动安卓应用的运行时是它们中的一员。Dalvik 最初是为单核、低端性能设备设计的,而且存储和内存占用的优先级要高于性能表现。在过去的几年里,谷歌给 Dalvik 扩充了越来越多的更新,比如 JIT 支持、并发垃圾回收,以及多进程支持。但是随着多核手机的出现,它们比 T-Mobile G1 快上很多倍,而这些功能升级扩充只能帮安卓到这里了。 解决方案就是用 ART 这个安卓运行时替换 Dalvik,这是一个完全为现代智能手机硬件重写的应用引擎。ART 更强调性能表现和用户界面流畅度。ART 带来了一个从 JIT(Just-in-time,即时)编译到 AOT(Ahead-of-time,提前)编译的转变。JIT 会在每次应用运行的时候即时编译,节省存储空间,因为编译后的代码从不写入存储,但它消耗更多的 CPU 和内存资源。AOT 会将编译后的代码保存到存储,让应用启动的时候更快并减少内存使用。ART 会在设备上将编译代码作为安装的一部分进行,而不分发预编译的代码,这样编译器可以进行一些针对特定设备的优化。ART 还带来了 64 位支持,扩大了内存寻址范围,由 64 位指令集带来更佳的性能表现(特别是在媒体和加密应用上)。 @@ -14,74 +12,52 @@ #### 一个系统层级的界面刷新 -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/systemui150-1-150x150.jpg) - ][1] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/lock-1-150x150.jpg) - ][2] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/recent-apps-150x150.jpg) - ][3] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/recent2-150x150.jpg) - ][4] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/notification-1-150x150.jpg) - ][5] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/headsup-1-150x150.jpg) - ][6] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/panels-150x150.jpg) - ][7] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/noticontrols-150x150.jpg) - ][8] +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/systemui150-1-150x150.jpg) Material Design 带来了一个几乎对安卓所有界面的完全翻新。首先,整个核心系统界面改变了。安卓得到了一个全新的按钮集合,看起来有点像是 PlayStation 的手柄:三角形,圆形以及正方形按钮,分别代表后退,主屏幕,和最近应用。得益于全新的图标集,状态栏也是焕然一新。 +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/lock-1-150x150.jpg) + 最近应用获得了大翻新。从一个小略缩图纵向列表变成了一个巨大的,几乎全屏的略缩图串联列表。它还获得了一个新名字(也没那么守旧),“概览(Overview)”。这明显是受到了前面版本的 Chrome 标签页切换器效果的启发。 +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/recent-apps-150x150.jpg) + 顺带一说,在这个安卓版本里 Chrome 的标签页切换器效果消失了。作为一种将 Web 应用与本地应用同等对待的尝试,Chrome 标签合并到了概览列表。是的:最近“应用”列表现在显示的是最近打开的应用,加上最近打开的网站。在棒棒糖中,最近应用列表还采取了一种“以文档为中心”的方法,意味着应用可以在最近应用列表中显示多个项目。比如你在 Google Docs 中打开了两个文档,它们都会显示在最近应用中,让你可以在它们之间轻松切换,而不用到应用的文件列表去来回切换。 +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/recent2-150x150.jpg) + 通知面板是全新的。谷歌给通知面板带来了“卡片”主题,将每个项目归整到它自己的矩形中。单个通知条目从黑色背景变成了白色背景,有了更佳的排版和圆形图标。这些新通知来到了锁屏上,将它从一个最没用的中间屏变成了很有用的屏幕,用于展示“这里是你不在的时候发生的事情”。 -全屏的通知,比如来电以及闹钟,都被抛弃了,取而代之的是在屏幕顶部弹出一个“抬头”通知。抬头通知也对“高优先级”应用可用,最初这是为即时消息设计的。但是否是高优先级的通知这取决于开发者的决定,在开发者意识到这可以让他们的通知更显眼之后,所有人都开始使用它。之后版本的安卓通过给用户提供“高优先级”的设置解决了这个问题。 +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/notification-1-150x150.jpg) + +全屏的通知,比如来电以及闹钟,都被抛弃了,取而代之的是在屏幕顶部弹出一个“抬头(HUD)”通知。抬头通知也对“高优先级”应用可用,最初这是为即时消息设计的。但是否是高优先级的通知这取决于开发者的决定,在开发者意识到这可以让他们的通知更显眼之后,所有人都开始使用它。之后版本的安卓通过给用户提供“高优先级”的设置解决了这个问题。 + +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/headsup-1-150x150.jpg) 谷歌还给棒棒糖添加了一个单独的,但很相似的“优先”通知系统。“优先”通知是一个介于完全静音和“提醒一切消息”之间的模式,允许用户将特定的联系人和应用标记为重要。优先模式只会为这些重要的人发出提醒。在界面上来看,它采用了音量控制附加通知优先级控制以及设置中心添加一项优先通知新设置的形式。当你处在优先模式的时候,状态栏会有一颗星形标识。 +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/panels-150x150.jpg) + 快速设置获得了一系列的大改善。控制项现在是一块在通知_上面_的面板,所以它可以通过“两次下拉”手势来打开它。第一次下拉会打开通知面板,第二次下拉手势会缩小通知面板并打开快速设置。快速设置的布局变了,抛弃了平铺排列,转为一个单独面板上的一系列浮动按钮。顶部是十分方便的亮度调节条,之后是连接,自动旋转,手电筒,GPS,以及 Chromecast 的按钮。 +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/noticontrols-150x150.jpg) + 快速设置现在还有了实际的内嵌面板。它可以在主界面显示无线网络接入点,蓝牙设备,以及移动数据使用量。 - -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/4-150x150.jpg) - ][9] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/gmail2-150x150.jpg) - ][10] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/fit-150x150.jpg) - ][11] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/messages-1-150x150.jpg) - ][12] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/googl1-150x150.jpg) - ][13] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/2-150x150.jpg) - ][14] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/reminers-150x150.png) - ][15] +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/4-150x150.jpg) Material Design 革新给了几乎每个应用一个新图标,并带来了一个更明亮,白色背景的应用抽屉。默认应用阵容也有了很大的变化。和这些新应用问声好吧:通讯录,谷歌文档,Fit,信息,照片,Play 报亭,以及谷歌幻灯片。和这些死去的应用说再见吧:相册,G+ 照片,People,Play 杂志,电子邮件,以及 Quickoffice。 +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/gmail2-150x150.jpg) + 这些新应用中很多来自 Google Drive,从一个单独的大应用分割成每个产品一个应用。现在我们有了云端硬盘,文档,表格,以及幻灯片,都来自于云端硬盘团队。云端硬盘同时也要对 Quickoffice 的死亡负责,云端硬盘团队令它元气大伤。在“谷歌从来没法做好决定”分类下:通讯录从“People”改回了“Contacts”,短信应用在运营商的要求下叫回了“Messenger”。(那些运营商_不_喜欢谷歌环聊插手短信的职能。)我们有项真正的新服务:谷歌健身,一个健康追踪应用,可以在安卓手机和安卓手表上工作。Play 杂志也有了新的设计,添加了网站内容,所以它改名叫“Play 报亭”。 +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/fit-150x150.jpg) +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/messages-1-150x150.jpg) +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/googl1-150x150.jpg) +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/2-150x150.jpg) +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/reminers-150x150.png) + 还有更多的谷歌专有应用接管 AOSP 的例子。 * “G+ 照片”变成了“谷歌照片”,并取代了 AOSP 的相册成为默认照片应用,而相册也就随之消亡了。改名成“谷歌照片”是为照片应用[退出 Google+][16]并成为独立服务做准备。谷歌照片的发布在棒棒糖发布之后六个月——暂时应用只像是 Google+ 应用换了个图标和界面设计。 @@ -94,7 +70,7 @@ via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-histor 作者:[RON AMADEO][a] 译者:[alim0x](https://github.com/alim0x) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From b1230092ad76ee0636d731c1898238df8d0777b2 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 10 Jul 2017 00:26:41 +0800 Subject: [PATCH 0642/1407] PRF&PUB:20170215 Using Scripting Languages in IoT Challenges and Approaches.md @xiaow6 --- ...guages in IoT Challenges and Approaches.md | 66 +++++++++++++++++ ...guages in IoT Challenges and Approaches.md | 70 ------------------- 2 files changed, 66 insertions(+), 70 deletions(-) create mode 100644 published/20170215 Using Scripting Languages in IoT Challenges and Approaches.md delete mode 100644 translated/tech/20170215 Using Scripting Languages in IoT Challenges and Approaches.md diff --git a/published/20170215 Using Scripting Languages in IoT Challenges and Approaches.md b/published/20170215 Using Scripting Languages in IoT Challenges and Approaches.md new file mode 100644 index 0000000000..f1852837e0 --- /dev/null +++ b/published/20170215 Using Scripting Languages in IoT Challenges and Approaches.md @@ -0,0 +1,66 @@ +在物联网中使用脚本语言面临的挑战与对策 +============================================================ + + +![Scripting IoT](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/scripting-languages-iot.jpg?itok=d6uog0Ss "Scripting IoT") + +> 在即将到来的嵌入式 Linux 会议 + OpenIoT 峰会中,Paul Sokolovsky 将会讨论在嵌入式开发中使用脚本语言的一些挑战。 + +脚本语言(又称作超高级语言Very High-Level Languages或 VHLLs ),例如 Python、 PHP 以及 JavaScript 常用在桌面、服务器和网页开发中。它们强大的内置功能能够让你花费少量的时间和精力来开发小型却有用的应用,Paul Sokolovsky,Linaro 公司物联网工程师如是说。然而,目前在物联网中使用超高级语言深度开发嵌入式应用相对来说有些别扭。 + +在即将到来的[嵌入式 Linux 会议][6] + [OpenIoT 峰会][7]中,Sokolovsky 会讨论在嵌入式开发中使用 VHLLs 的挑战并且基于 MicroPython 的例子与 JerryScript + Zephyr.js 项目比较不同的对策。 我们与Sokolovsky 进行了一番交谈来获得更多信息。 + +**Linux.com:您可以给我们的读者一些 VHLLs 的背景知识吗?** + +Paul Sokolovsky: 超高级语言成为计算机科学和信息技术风景中的一部分已经几十年了。也许第一个流行的脚本语言是 Unix shell(sh),尽管由于较小的特征集,它很少被认为是一种超高级语言,而是一种特定领域语言。所以第一个真正破纪录的 VHLLs 是 Perl(1987)和 Tcl(1988),很快紧跟着出现了 Python(1991),Ruby(1995),PHP(1995),JavaScript(1995)以及许多其它语言。 + +不同 VHLLs 之间的区别特性包括:它们的解析本能(从使用者的角度来看,也许是因为其中复杂的编译器作祟),内置可用的强大的数据类型如任意大小的列表和映射,可观的标准库,以及允许用户访问甚至更大的第三方库的外部模块系统。所有的这些特性都与相对容易使用的感觉(更少的输入,不需要构建等)和简单的学习曲线相耦合。 + +**Linux.com: 使用这些语言做开发有哪些优势?** + +Sokolovsky: 优势的根源来自于以上描述的这些特性。一个新手可以非常轻松的开始使用脚本语言并且快速的学习它。很多 VHLLs 提供了一个强大的交互模式,所以你不需要去读那些厚厚的使用手册来开始使用脚本语言,而是直接去探索和体验它们。强大的内置功能允许你去开发小而有用的应用(脚本),而仅仅使用很少的时间和精力(这就是“脚本语言”名字的来源)。如果要转向开发大型应用,广泛的第三方库和可以轻而易举使用的模块系统使得开发变得流畅和高产。 + +**Linux.com: 在嵌入式平台上使用脚本开发和在其他平台开发有什么区别?** + +Sokolovsky: 鉴于之前我们讨论过的 VHLLs 振奋人心的能力,有一个创意——为什么我们不能享受使用 VHLLs 为嵌入式设备做开发而具有所有(或者至少一部分)优势呢?这里我提到的“嵌入式设备”不仅仅是拥有 8-32 MB RAM 的小型 Linux 系统,还有运行在微控制器(MCU)上有几千字节内存的深度嵌入式系统。少量(有些时候几乎没有)的相关资源肯定使这个创意的实现变得更加复杂。 另一个问题是设备访问和交互。嵌入式设备通常没有显示屏和键盘,但是幸运的是解决这个问题的答案已经存在几十年了,这里要感谢 Unix,它提供了使用串口(UART)来搭建一个终端连接的方法。当然,在主机端,有些用户喜欢使用图形集成开发环境(IDE)来隐藏串口通信细节。 + +所以,由于嵌入式设备所有的这些不同特性,这个创意就是提供一个尽可能熟悉的工作环境。但熟悉只是其中一方面,另一方面,为了适应甚至最小的设备,工作环境需要尽可能的缩小。要想解决这些矛盾需要嵌入式 VHLLs 的操作可以高度配置,来适应不同的项目和硬件的需求。 + +**Linux.com:只有在物联网中使用这些语言才会遇到的挑战有哪些?比如说你如何处理内存限制?** + +Sokolovsky: 当然,解释程序本身几乎不怎么消耗硬件资源。但是在当今世界,最珍贵的资源是人类的时间。不管你是一个研发工程师、一个仅仅有几个小时的周末创客、一个被 bug 和安全问题淹没的支持工程师,或者一个计划开发新产品的产品经理——你手头上大概都没有什么多余时间。因此需要将 VHLLs 的生产力提供到嵌入式工程师手上。 + +当前的工艺水平使得这些需求变得可行。公正的来讲,甚至于微处理器单元(MCU)平均 都有 16-32 KB RAM , 128-256 KB ROM。这仅仅足够搭载一个核心解释程序,一个标准库类型的规范子集,一些硬件驱动,以及一个很小但是依旧有用的应用程序。假如你的硬件配置稍微越过了中间线,其能力得到了快速的增长——这实际上是由于一个从 1970 年代就闻名的技巧:使用自定义的字节码和精码(pcode)相比原始机器代码能够让你获得更大的代码/特性密度。 + +在这条道路上有很多挑战,RAM 不够用是主要的一个。我是在一个 16 GB RAM 的笔记本上写下的这些话(但不断切换的话依然会很卡),而刚才提到的 16KB 比它小一百万倍!不过,通过小心的选择算法和编程技巧,在这样小的 RAM 下仍有可能通过脚本语言来执行简单程序,而相当复杂的程序可能需要 128-256K。 + +有很多的技术挑战需要解决(它们已经被成功的解决了),这里没有足够的篇幅来涵盖它们。不过,我在 OpenIoT 峰会上的演讲会涵盖使用两种嵌入式脚本语言的经验和成就:MicroPython(Python3 的子集)和 Zephyr.js(JavaScript/Node.js 的子集),都运行在 Linux 基金会的 Zephyr 实时操作系统上,它被寄希望于在 IoT 工业界取得和 Linux 在移动互联网和服务器方面一样的成就。(相关 PPT 会为无法参加 OpenIoT 会议的朋友在会议后放出。) + +**Linux.com: 你能给我们一些 VHLLs 最适用的应用的例子吗?以及一些它们不适用的例子?** + +Sokolovsky:以上是很多关于 VHLLs 的光明前景,公正的来说:在嵌入式开发中,这里有很多一厢情愿的幻想(或者说希望其是能够自我实现的预言)。在嵌入式开发中 VHLLs 现在可以提供的是:快速成型,以及教育/创客市场上所必须的易学性和易用性。有一些先行者在其它领域使用 VHLLs,但是就目前来看,它需要在基础构造和工具开发上投入更多。重要的是,这样的投入应遵循开源原则并分享,否则会逐渐损害到 VHLLs 能够节省使用者时间和精力的优势。 + +谨记这些,嵌入式 VHLLs 是发育完全(“逐渐变的完整”)的语言,能够适应各种类型的应用,但是要受制于硬件。例如,假如一个微处理器的规格低于之前提到的阈值,如一个老旧的 8-bit 微处理器,那么只有同样古老而优秀的 C 语言能够为你所用。另外一个限制是当你真的想要充分利用硬件时—— C 语言或者汇编程序才是正确的选择。但是,这里有一个惊喜——嵌入式 VHLLs 的开发者也想到了这一点,例如 MicroPython 允许你将 Python 和汇编程序在同一个应用中结合起来。 + +嵌入式 VHLLs 的优势是其可配置性和可(重复)编程性,外加灵活的连接性支持。这恰恰是 IoT 和智能设备最需要的,很多 IoT 应用使用起来也不需要太复杂。考虑一下,例如,一个可以贴在任何地方用来完成各种任务的智能按钮。但是,如果你需要调整双击的时间时怎么办?使用脚本语言,你可以做到。也许你完全不会考虑三连击,但是现在在某些情况下四连击都可能是有用的。使用脚本语言,你可以轻易修改它。 + +(题图:来自 Pixabay,基于 CC0 协议) + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/news/event/elcna/2017/2/using-scripting-languages-iot-challenges-and-approaches + +作者:[AMBER ANKERHOLZ][a] +译者:[xiaow6](https://github.com/xiaow6) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.linux.com/users/aankerholz +[1]:https://www.linux.com/licenses/category/used-permission +[2]:https://www.linux.com/licenses/category/creative-commons-zero +[3]:https://www.linux.com/files/images/paul-sokolovsky-2014-09-21jpg +[4]:https://www.linux.com/files/images/scripting-languages-iotjpg +[5]:http://events.linuxfoundation.org/events/embedded-linux-conference/program/schedule?utm_source=linux&utm_campaign=elc17&utm_medium=blog&utm_content=video-blog +[6]:http://events.linuxfoundation.org/events/embedded-linux-conference +[7]:https://events.linuxfoundation.org/events/openiot-summit/program/schedule diff --git a/translated/tech/20170215 Using Scripting Languages in IoT Challenges and Approaches.md b/translated/tech/20170215 Using Scripting Languages in IoT Challenges and Approaches.md deleted file mode 100644 index e55ffd9cb3..0000000000 --- a/translated/tech/20170215 Using Scripting Languages in IoT Challenges and Approaches.md +++ /dev/null @@ -1,70 +0,0 @@ - -在物联网中使用脚本语言的挑战与途径 -============================================================ - - - ![Scripting IoT](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/scripting-languages-iot.jpg?itok=d6uog0Ss "Scripting IoT") - -在即将到来的嵌入式 Linux 会议 + OpenIoT 峰会中,Paul Sokolovsky 将会讨论在嵌入式开发中使用脚本语言的一些挑战。来自Pixabay,基于CC0协议。 - -脚本语言(又称作超高级语言或 VHLLs ),例如 Python, PHP, 以及 JavaScript 都常常在桌面、服务器和网页开发中被使用。而且,它们强大的内置功能能够让你花费少量的时间和精力来开发小型却有用的应用,Paul Sokolovsky,Linaro 公司物联网工程师如是说。然而,目前在物联网中使用超高级语言深度开发嵌入式应用相对来说有些别扭。 - - ![Paul Sokolovsky](https://www.linux.com/sites/lcom/files/styles/floated_images/public/paul-sokolovsky-2014-09-21.jpg?itok=nUlGjxf3 "Paul Sokolovsky") -Paul Sokolovsky,Linaro 公司物联网工程师。[图片已获授权][1] - -在即将到来的[嵌入式 Linux 会议][6] + [OpenIoT 峰会][7]中,Sokolovsky 会讨论在嵌入式开发中使用 VHLLs 的挑战并且比较不同的实现途径,基于 MicroPython 的例子与 JerryScript + Zephyr.js 项目。 我们与Sokolovsky进行了一番交谈来获得更多信息。 - -**Linux.com:您可以给我们的读者一些 VHLLs 的背景知识吗?** - -Paul Sokolovsky: 超高级语言成为计算机科学和信息技术风景中的一部分已经几十年了。也许第一个流行的脚本语言是 Unix shell(sh),尽管由于较小的特征集,它很少被认为是一种超高级语言,而是一种特定领域语言。所以第一个真正破纪录的 VHLLs 是 Perl(1987)和 Tcl(1988),很快紧跟着出现了 Python(1991),Ruby(1995),PHP(1995),JavaScript(1995)以及许多其它语言。 - -不同 VHLLs 之间的区别特性包括:它们的解析本能(从使用者的角度来看,也许是因为其中复杂的编译器作祟),内置可用的强大的数据类型如任意大小的列表和映射,大小合适的标准库,以及允许用户访问甚至更大的第三方库的外部的模块系统。所有的这些特性都与相对容易使用的感觉(更少的打字,没有构建时间等)和简单的学习曲线相耦合。 - -**Linux.com: 使用这些语言做开发有哪些优势?** - -Sokolovsky: 优势的根源来自于以上描述的这些特性。一个新手可以非常轻松的开始使用脚本语言并且快速的学习它。很多 VHLLs 提供了一个强大的交互模式,所以你不需要去读那些厚厚的使用手册来开始使用脚本语言,而是直接去探索和体验它们。强大的内置功能允许你去开发小而有用的应用——脚本——仅仅使用很少的时间和精力(这就是“脚本语言”名字的来源)。如果要转向开发大型应用,广泛的第三方库和轻而易举被使用的模块系统使得开发变得流畅和高产。 - -**Linux.com: 在嵌入式平台上使用脚本开发和在其他平台开发有什么区别?** - -Sokolovsky: 鉴于之前我们讨论过的 VHLLs 振奋人心的能力,有一个创意——为什么我们不能享受使用 VHLLs 为嵌入式设备做开发具有的所有(或者至少一部分)优势呢?这里我提到的“嵌入式设备”不仅仅是拥有 8-32 MB RAM 的小型 Linux 系统,还有运行在微控制器(MCUs)上有几千字节内存的深度嵌入式系统。少量(有些时候几乎没有)的相关资源肯定使这个创意的实现变得更加复杂。 另一个问题是设备访问和交互。嵌入式设备通常没有显示屏和键盘,但是幸运的是解决这个问题的答案已经存在几十年了,这里要感谢Unix,提供了使用串口(UART)来搭建一个终端连接的方法。当然,在主机端,有些用户喜欢使用图形集成开发环境(IDE)来隐藏串口通信细节。 - -所以,由于嵌入式设备所有的这些不同特性,这个创意就是提供一个尽可能熟悉的工作环境。但熟悉只是其中一方面,另一方面,为了适应甚至最小的设备,工作环境需要尽可能的缩小。要想解决这些冲突需要嵌入式 VHLLs 的操作能够被高度配置,来适应不同的项目和硬件的需求。 - -**Linux.com:只有在物联网中使用这些语言才会遇到的挑战有哪些?比如说你如何处理内存限制?** - -Sokolovsky: 当然,解释程序本身几乎不怎么消耗硬件资源。但是在当今世界,最珍贵的资源是人类的时间。不管你是一个研发工程师,一个仅仅有几个小时周末的制造者,一个让 bug 和安全问题淹没的支持工程师,或者一个计划开发新产品的产品经理——你手头上大概都没有什么多余时间。因此需要将 VHLLs 的生产力提供到嵌入式工程师手上。 - -当前的工艺水平使得这些需求变得可行。公正的来讲,甚至于微处理器单元(MCUs)平均 RAM 都有 16-32 KB,ROM 128-256 KB。这仅仅足够搭载一个核心解释程序,一个标准库类型的规范子集,一些硬件驱动,以及一个很小——但是依旧有用——的应用程序。假如你的硬件配置稍微越过了中间线,其容量得以快速的增长——这实际上是由于一个从 1970 年代就闻名的技巧:使用自定义的字节码和精码相比原始机器代码能够让你获得更大的代码/特性密度。 - -在这条道路上有很多挑战,RAM 不够用是主要的一个。我是在一个 16 GB RAM 的笔记本上写下的这些话(但不断切换的话依然会很卡),而刚才提到的 16KB 比它小一百万倍!不过,通过小心的选择算法和编程技巧,在这样小的 RAM 下仍有可能通过脚本语言来执行简单程序,而相当复杂的程序可能需要128-256K。 - -有很多的技术挑战需要讲解(它们已经被成功的讲解了),这里没有足够的篇幅来涵盖它们。不过,我在 OpenIoT 峰会上的演讲会涵盖使用两种嵌入式脚本语言的经验和成就:MicroPython(Python3 的子集)和 Zephyr.js(JavaScript/Node.js 的子集),都运行在 Linux 基金会的 Zephyr 实时操作系统上,它被寄希望于为 IoT 工业界做出 Linux 为手机和服务器工业做出的贡献。(相关 PPT 会为无法参加 OpenIoT 会议的朋友在会议后放出。) - -**Linux.com: 你能给我们一些 VHLLs 最适用的应用的例子吗?以及一些它们不适用的例子?** - -Sokolovsky:以上是很多关于 VHLLs 的光明前景,公正的来说:在嵌入式开发中,这里有很多一厢情愿的幻想(或者说希望其是能够自我实现的预言)。在嵌入式开发中 VHLLs 现在可以提供的是:快速成型,以及教育/制造市场所必须的易学性和易用性。有一些先行者在其它领域使用 VHLLs,但是就目前来看,它需要在基础构造和工具开发上投入更多。这样的投入在开源和公开分享原则下被指引是非常重要的,否则会逐渐损害到 VHLLs 能够节省使用者时间和精力的优势。 - -谨记这些,嵌入式 VHLLs 是发育完全(“逐渐变的完整”)的语言,能够适应各种类型的应用,但是要屈服于硬件限制。例如,假如一个微处理器的规格低于之前提到的阈值,如一个老旧的 8-bit 微处理器,那么只有同样古老而优秀的 C 语言能够为你所用。另外一个限制是当你真的想要充分利用硬件时—— C 语言或者汇编程序才是正确的选择。但是,这里有一个惊喜——嵌入式 VHLLs 的开发者也想到了这一点,例如 MicroPython 允许你将 Python 和汇编程序在同一个应用中结合起来。 - -嵌入式 VHLLs 突出的的是其可配置性和可(重复)编程性,外加灵活的连接性支持。这恰恰是 IoT 和智能设备最需要的,很多 IoT 应用使用起来也不需要太复杂。考虑一下,例如,一个可以贴在任何地方用来完成任何任务的智能按钮。但是,如果你需要调整双击的时间时怎么办?使用脚本语言,你可以做到。也许你完全不会考虑三连击,但是现在在某些情况下四连击都可能是有用的。使用脚本语言,你可以轻易修改它。 - -_嵌入式 Linux 会议 + OpenIoT 北美峰会于 2017 年 2 月 21 - 23 号在美国俄勒冈州波特兰市举办。请[查阅][5]关于 Linux 内核、嵌入式开发和嵌入式系统,以及开放物联网最新事物相关的130个相关会议。_ - --------------------------------------------------------------------------------- - -via: https://www.linux.com/news/event/elcna/2017/2/using-scripting-languages-iot-challenges-and-approaches - -作者:[AMBER ANKERHOLZ][a] -译者:[xiaow6](https://github.com/xiaow6) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.linux.com/users/aankerholz -[1]:https://www.linux.com/licenses/category/used-permission -[2]:https://www.linux.com/licenses/category/creative-commons-zero -[3]:https://www.linux.com/files/images/paul-sokolovsky-2014-09-21jpg -[4]:https://www.linux.com/files/images/scripting-languages-iotjpg -[5]:http://events.linuxfoundation.org/events/embedded-linux-conference/program/schedule?utm_source=linux&utm_campaign=elc17&utm_medium=blog&utm_content=video-blog -[6]:http://events.linuxfoundation.org/events/embedded-linux-conference -[7]:https://events.linuxfoundation.org/events/openiot-summit/program/schedule From 2412692fb0893e881ba4b7a50bf11f8ff54361ba Mon Sep 17 00:00:00 2001 From: stevenzdg988 Date: Mon, 10 Jul 2017 10:44:20 +0800 Subject: [PATCH 0643/1407] stevenzdg988 translating --- sources/tech/20170529 Ubuntu GamePack.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170529 Ubuntu GamePack.md b/sources/tech/20170529 Ubuntu GamePack.md index 3dbbd3ef17..0d515d3b3f 100644 --- a/sources/tech/20170529 Ubuntu GamePack.md +++ b/sources/tech/20170529 Ubuntu GamePack.md @@ -1,3 +1,5 @@ +"stevenzdg988 translating" + Ubuntu GamePack =============== From ba1365b589a4b919db0e594f1e6929b5dff74153 Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 10 Jul 2017 13:13:12 +0800 Subject: [PATCH 0644/1407] translating --- ... Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md b/sources/tech/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md index 68867a87cd..136dd2c66f 100644 --- a/sources/tech/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md +++ b/sources/tech/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md @@ -1,3 +1,5 @@ +translating----geekpi + How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 [ 19/June/2017 ] ============================================================ From 6a17ac6d29f952ab88582d3719afc40abbf2d1f2 Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 10 Jul 2017 15:04:16 +0800 Subject: [PATCH 0645/1407] translated --- ...k Clash Vulnerability CVE-2017-1000364 .md | 66 +++++++++---------- 1 file changed, 32 insertions(+), 34 deletions(-) rename {sources => translated}/tech/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md (73%) diff --git a/sources/tech/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md b/translated/tech/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md similarity index 73% rename from sources/tech/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md rename to translated/tech/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md index 136dd2c66f..61ee08ca50 100644 --- a/sources/tech/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md +++ b/translated/tech/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md @@ -1,24 +1,22 @@ -translating----geekpi - -How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 [ 19/June/2017 ] +如何修补和保护 Linux 内核堆栈冲突漏洞 CVE-2017-1000364 [ 2017.6.19 ] ============================================================ - [![](https://www.cyberciti.biz/media/new/category/old/linux-logo.png)][12] Avery serious security problem has been found in the Linux kernel called “The Stack Clash.” It can be exploited by attackers to corrupt memory and execute arbitrary code. An attacker could leverage this with another vulnerability to execute arbitrary code and gain administrative/root account privileges. How do I fix this problem on Linux? + [![](https://www.cyberciti.biz/media/new/category/old/linux-logo.png)][12] 在 Linux 内核中发现了一个名为 “Stack Clash” 的严重安全问题,攻击者可能会利用它来破坏内存并执行任意代码。攻击者可以利用另一个漏洞来执行任意代码并获得管理/root 帐户权限。在 Linux 中该如何解决这个问题? [![the-stack-clash-on-linux-openbsd-netbsd-freebsd-solaris](https://www.cyberciti.biz/media/new/faq/2017/06/the-stack-clash-on-linux-openbsd-netbsd-freebsd-solaris.jpeg)][22] -The Qualys Research Labs discovered various problems in the dynamic linker of the GNU C Library (CVE-2017-1000366) which allow local privilege escalation by clashing the stack including Linux kernel. This bug affects Linux, OpenBSD, NetBSD, FreeBSD and Solaris, on i386 and amd64\. It can be exploited by attackers to corrupt memory and execute arbitrary code. +Qualys 研究实验室在 GNU C Library(CVE-2017-1000366)的动态链接器中发现了许多问题,它们通过与 Linux 内核的堆栈冲突来允许本地特权升级。这个 bug 在 i386 和 amd64 上影响 Linux、OpenBSD、NetBSD、FreeBSD 和 Solaris。攻击者可以利用它来破坏内存并执行任意代码。 -### What is CVE-2017-1000364 bug? +### 什么是 CVE-2017-1000364 bug? -[From RHN][13]: +[来自 RHN][13]: -> A flaw was found in the way memory was being allocated on the stack for user space binaries. If heap (or different memory region) and stack memory regions were adjacent to each other, an attacker could use this flaw to jump over the stack guard gap, cause controlled memory corruption on process stack or the adjacent memory region, and thus increase their privileges on the system. This is a kernel-side mitigation which increases the stack guard gap size from one page to 1 MiB to make successful exploitation of this issue more difficult. +> 在用户空间二进制文件的堆栈中分配内存的方式发现了一个缺陷。如果堆(或不同的内存区域)和堆栈内存区域彼此相邻,则攻击者可以使用此缺陷跳过堆栈保护区域,从而导致进程堆栈或相邻内存区域受到控制的内存损坏,从而增加其系统权限。有一个在内核中减轻这个漏洞的方法,将堆栈保护区域大小从一页增加到 1 MiB,从而使成功利用这个功能变得困难。 [As per the original research post][14]: -> Each program running on a computer uses a special memory region called the stack. This memory region is special because it grows automatically when the program needs more stack memory. But if it grows too much and gets too close to another memory region, the program may confuse the stack with the other memory region. An attacker can exploit this confusion to overwrite the stack with the other memory region, or the other way around. +> 计算机上运行的每个程序都使用一个称为堆栈的特殊内存区域。这个内存区域是特别的,因为当程序需要更多的堆栈内存时,它会自动增长。但是,如果它增长太多,并且与另一个内存区域太接近,程序可能会将堆栈与其他内存区域混淆。攻击者可以利用这种混乱来覆盖其他内存区域的堆栈,或者反过来。 -### A list of affected Linux distros +### 收到影响的 Linux 发行版 1. Red Hat Enterprise Linux Server 5.x @@ -78,26 +76,26 @@ The Qualys Research Labs discovered various problems in the dynamic linker of th 29. SUSE Linux Enterprise Server for Raspberry Pi 12 SP2 -### Do I need to reboot my box? +### 我需要重启我的电脑么? -Yes, as most services depends upon the dynamic linker of the GNU C Library and kernel itself needs to be reloaded in memory. +是的,由于大多数服务依赖于 GNU C Library 的动态连接器,并且内核自身需要在内存中重新加载。 -### How do I fix CVE-2017-1000364 on Linux? +### 我该如何在 Linux 中修复 CVE-2017-1000364? -Type the commands as per your Linux distro. You need to reboot the box. Before you apply patch, note down your current kernel version: +根据你的 Linux 发行版输入命令。你需要重启电脑。在应用补丁之前,记下你当前内核的版本: `$ uname -a $ uname -mrs` -Sample outputs: +示例输出: ``` Linux 4.4.0-78-generic x86_64 ``` -### Debian or Ubuntu Linux +### Debian 或者 Ubuntu Linux -Type the following [apt command][15]/[apt-get command][16] to apply updates: +输入下面的[ apt 命令][15]/[apt-get 命令][16]来应用更新: `$ sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade` -Sample outputs: +示例输出: ``` Reading package lists... Done @@ -184,24 +182,24 @@ Setting up linux-headers-4.9.0-3-amd64 (4.9.30-2+deb9u1) ... Processing triggers for libc-bin (2.24-11+deb9u1) ... ``` -Reboot your server/desktop using [reboot command][17]: +使用[ reboot 命令][17]重启桌面/服务器: `$ sudo reboot` ### Oracle/RHEL/CentOS/Scientific Linux -Type the following [yum command][18]: +输入下面的[ yum 命令][18]: `$ sudo yum update $ sudo reboot` ### Fedora Linux -Type the following dnf command: +输入下面的 dnf 命令: `$ sudo dnf update $ sudo reboot` -### Suse Enterprise Linux or Opensuse Linux +### Suse Enterprise Linux 或者 Opensuse Linux -Type the following zypper command: +输入下面的 zypper 命令: `$ sudo zypper patch $ sudo reboot` @@ -225,43 +223,43 @@ $ sudo reboot` `$ sudo zypper in -t patch SUSE-SLE-Module-Public-Cloud-12-2017-996=1 $ sudo reboot` -### Verification +### 验证 -You need to make sure your version number changed after issuing [reboot command][19] +你需要确认你的版本号在 [reboot 命令][19]之后改变了。 `$ uname -a $ uname -r $ uname -mrs` -Sample outputs: +示例输出: ``` Linux 4.4.0-81-generic x86_64 ``` -### A note about OpenBSD users +### 给 OpenBSD 用户的注意事项 -See [this page][20] for more info. +见[此页][20]获取更多信息。 -### A note about Oracle Solaris +### 给 Oracle Solaris 的注意事项 -[See this page][21] for more info. +[见此页][20]获取更多信息。 -### References: +### 参考 -* [The Stack Clash][4] +* [堆栈冲突][4] -------------------------------------------------------------------------------- 作者简介: Vivek Gite -The author is the creator of nixCraft and a seasoned sysadmin and a trainer for the Linux operating system/Unix shell scripting. He has worked with global clients and in various industries, including IT, education, defense and space research, and the nonprofit sector. Follow him on [Twitter][1], [Facebook][2], [Google+][3]. +作者是 nixCraft 的创始人,对于 Linux 操作系统/Unix shell脚本有经验丰富的系统管理员和培训师。他曾与全球客户及各行各业,包括IT、教育、国防和空间研究以及非营利部门合作。在 [Twitter][1]、[Facebook] [2]、[Google +] [3] 上关注他。 -------------------------------------------------------------------------------- via: https://www.cyberciti.biz/faq/howto-patch-linux-kernel-stack-clash-vulnerability-cve-2017-1000364/ 作者:[Vivek Gite ][a] -译者:[译者ID](https://github.com/译者ID) +译者:[geekpi](https://github.com/geekpi) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From e99708443795a3059dc0a3f6cfba6cf9adc6c91a Mon Sep 17 00:00:00 2001 From: datastruct Date: Mon, 10 Jul 2017 15:21:18 +0800 Subject: [PATCH 0646/1407] Update 20170529 Ubuntu GamePack.md --- sources/tech/20170529 Ubuntu GamePack.md | 30 +++++++++++++----------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/sources/tech/20170529 Ubuntu GamePack.md b/sources/tech/20170529 Ubuntu GamePack.md index 0d515d3b3f..72ab18b83b 100644 --- a/sources/tech/20170529 Ubuntu GamePack.md +++ b/sources/tech/20170529 Ubuntu GamePack.md @@ -6,26 +6,28 @@ Ubuntu GamePack A lot of people who like to use their Linux system for gaming. There seems to be no shortage of gaming systems which can supply access to games. UALinux is a Ukrainian company which promotes the use of GNU/Linux. UALinux has created a Ubuntu version to fill the gap for gaming. The Operating System (OS) is called Ubuntu GamePack and is based off of Ubuntu 16.04. +很大一部分 Linux爱好者喜欢用他们的系统玩游戏。现在看起来能够可以支持游戏的游戏系统很短缺。UALinux是一家推广使用GNU/Linux的乌克兰公司。UALinux开发了一个Ubuntu版本填补了这一空白。这个操作系统(OS)命名为Ubuntu GamePack 基于Ubuntu 16.04. + **Contents** - +** 内容 ** The list of games would be quite extensive but the company claims there is access to over 22,381 games. - +游戏现在已经相当广泛,但是游戏公司已经宣称可以访问超过22,381款游戏。 The GamePack includes Lutris and Steam to allow you access to the specific gaming services the distributer provides. - +GamePack 包括 Lutris 和 Steam两部分,允许您访问分发商提供的定制游戏服务。 For Windows-based games there is PlayOnLinux, WINE and CrossOver so the games will run on Linux. - +对于基于Windows的游戏,有PlayOnLinux,WINE和CrossOver转换到Linux上运行。 For DOS games you can run the games in DosBox which is a DOS emulator for Linux. - +对于DOS游戏,您可以在DosBox中运行游戏,这是一个Linux的DOS模拟器 Sparky APTus Gamer is also installed to allow access to numerous gaming console emulators. The emulators include: - -* AdvanceMENU – front-end for AdvanceMAME, AdvanceMESS, MAME, MESS, xmame, Raine and other emulators - -* Atari800 - emulator for Atari 8-bit systems, XE Game System and Atari 5200 SuperSystem - -* DeSmuME - Nintendo DS emulator - -* Desura - digital distribution platform for Windows, Linux and X systems - OnLine installer - +Sparky APTus Gamer被安装应用允许访问众多游戏控制模拟器。 模拟器包括: +*   AdvanceMENU – front-end for AdvanceMAME, AdvanceMESS, MAME, MESS, xmame, Raine and other emulators +*  AdvanceMENU - 前端包括 AdvanceMAME, AdvanceMESS, MAME, MESS, xmame, Raine 以及其他的模拟器 +*   Atari800 - emulator for Atari 8-bit systems, XE Game System and Atari 5200 SuperSystem +*  Atari800 - Atari 8位系统的模拟器,XE游戏系统和Atari 5200 超级系统 +*   DeSmuME - Nintendo DS emulator +*   DeSmuME - Nintendo DS 模拟器 +*   Desura - digital distribution platform for Windows, Linux and X systems - OnLine installer +*   Desura - * DOSBox - DOS emulator for BeOS, Linux, Mac X, OS2, and Windows * DOSEMU - DOS Emulator for Linux From 11b7110d87289874d5a6b11defce6b44eebf1408 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 10 Jul 2017 16:59:34 +0800 Subject: [PATCH 0647/1407] PRF&PUB:20170627 How to turn a Raspberry Pi into an eBook server.md @geekpi --- ...urn a Raspberry Pi into an eBook server.md | 40 +++++-------------- 1 file changed, 11 insertions(+), 29 deletions(-) rename {translated/tech => published}/20170627 How to turn a Raspberry Pi into an eBook server.md (75%) diff --git a/translated/tech/20170627 How to turn a Raspberry Pi into an eBook server.md b/published/20170627 How to turn a Raspberry Pi into an eBook server.md similarity index 75% rename from translated/tech/20170627 How to turn a Raspberry Pi into an eBook server.md rename to published/20170627 How to turn a Raspberry Pi into an eBook server.md index 972ba4ba91..72308d7906 100644 --- a/translated/tech/20170627 How to turn a Raspberry Pi into an eBook server.md +++ b/published/20170627 How to turn a Raspberry Pi into an eBook server.md @@ -1,46 +1,34 @@ 如何将树莓派变成电子书服务器 ============================================================ -### Calibre 电子书管理软件可以轻松地在树莓派 3 上设置电子书服务器,即使在连接较慢区域也是如此。 +> Calibre 电子书管理软件可以轻松地在树莓派 3 上设置电子书服务器,即使在连接较慢区域也是如此。 ![How to turn a Raspberry Pi into an eBook server](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/idea_innovation_mobile_phone.png?itok=Ep49JfKU "How to turn a Raspberry Pi into an eBook server") -图片提供:  -opensource.com - -最近[Calibre 3.0 发布了][12],它让用户能够在浏览器中阅读!注意 Raspbian 的仓库还没有更新(截至写作时)。 +最近 [Calibre 3.0 发布了][12],它让用户能够在浏览器中阅读电子书!注意 Raspbian 的仓库还没有更新它(截至写作时)。 电子书是教师、图书馆员和其他人与学生共享书籍、课堂资料或其他文件的好方法,只需要你有可靠的带宽接入即可。但是,即使你的连接速度较慢或无法连接,还有一个简单的解决方案:使用在树莓派 3 上运行的开源 Calibre 电子书管理软件创建电子书服务器。这是我所做的,你也可以。 -首先我下载了最新的[ Raspbian Pixel 镜像][13],并安装在一个新的 8GB microSD 卡上。然后我插入 microSD,连接到一块键盘,鼠标并用一根 HDMI 线连接到一台旧的 LCD 电视,然后启动了 Pi。在我的显示器上[调整了 Pixel 环境分辨率][14]并连接到本地网络之后,我准备开始了。我打开一个终端,并输入 **sudo apt-get update** 以获取操作系统的最新更新。 - -### [1updateos.png][1] +首先我下载了最新的 [Raspbian Pixel 镜像][13],并安装在一个新的 8GB microSD 卡上。然后我插入 microSD,连接了键盘、鼠标并用一根 HDMI 线连接到一台旧的 LCD 电视,然后启动了 Pi。在我的显示器上[调整了 Pixel 环境分辨率][14]并连接到本地网络之后,我准备开始了。我打开一个终端,并输入 `sudo apt-get update` 以获取操作系统的最新更新。 ![Updating Raspbian Pixel](https://opensource.com/sites/default/files/u128651/1updateos.png "Updating Raspbian Pixel") -接下来,我在终端中输入 **sudo apt-get install calibre** 来安装 [Calibre][15]。 - -### [2install_calibre.png][2] +接下来,我在终端中输入 `sudo apt-get install calibre` 来安装 [Calibre][15]。 ![Installing Calibre](https://opensource.com/sites/default/files/u128651/2install_calibre.png "Installing Calibre") -我从命令行启动了 Calibre(注意它也可以从 GUI 启动)。Calibre 的界面非常直观。第一次启动时,你会看到 **Welcome to Calibre** 的向导。我将默认 Calibre Library 更改为 **CalibreLibrary**(一个字),因为这启动内容服务器时更容易。 +我从命令行启动了 Calibre(注意它也可以从 GUI 启动)。Calibre 的界面非常直观。第一次启动时,你会看到 **Welcome to Calibre** 的向导。我将默认 “Calibre Library” 更改为 “CalibreLibrary”(一个词),因为这启动内容服务器时更容易。 在选择完我的 Calibre 内容位置后,我准备好开始下载书了。 -### [3calibre-interface.png][3] - ![Calibre's interface](https://opensource.com/sites/default/files/u128651/3calibre-interface.png "Calibre's interface") -我从菜单中选择了 **Get Books** 选项,在这很容易输入我的搜索字词,并选择我感兴趣的电子书提供者。我正在寻找[非 DRM ][16]的材料,所以我选择 [Project Gutenberg][17] 作为我的源。(Caliber 的免责声明指出,电子书交易是在你和个人内容提供商之间。)我在作者字段中输入 “Mark Twain”,并得到10个结果。 - -### [4books.png][4] +我从菜单中选择了 **Get Books** 选项,在这很容易输入我的搜索字词,并选择我感兴趣的电子书提供者。我正在寻找[非 DRM][16] 的材料,所以我选择 [Project Gutenberg][17] 作为我的源。(Caliber 的免责声明指出,电子书交易是在你和个人内容提供商之间。)我在作者字段中输入 “Mark Twain”,并得到10个结果。 ![Searching for e-books](https://opensource.com/sites/default/files/u128651/4books.png "Searching for e-books") 我选择了 _Adventures of Huckleberry Finn_ 这本书。在下一页面上,我可以选择 **MOBI** 和 **EPUB** 这两种电子书格式。我选择了 EPUB,这本书下载得很快。 - -### [5ebook-formats.png][5] + ![Choosing the e-book format](https://opensource.com/sites/default/files/u128651/5ebook-formats.png "Choosing the e-book format") @@ -50,26 +38,20 @@ opensource.com ![start_the_server.png](https://opensource.com/sites/default/files/images/life-uploads/start_the_server.png) -将内容添加到电子书服务器后,即可与网络中的其他人共享内容。通过在终端中输入 **ifconfig ** 获取你的树莓派 IP 地址。我正在使用无线网络,所以我在下面的例子中使用了 **wlan0** 中的结果。点击界面的最右侧并展开菜单。然后点击 “Connect and Share” 并启动服务器。 - -### [6ipconfig.png][6] +将内容添加到电子书服务器后,即可与网络中的其他人共享内容。通过在终端中输入 `ifconfig` 获取你的树莓派 IP 地址。我正在使用无线网络,所以我在下面的例子中使用了 **wlan0** 中的结果。点击界面的最右侧并展开菜单。然后点击 “Connect and Share” 并启动服务器。 ![Identifying the IP address with ipconfig](https://opensource.com/sites/default/files/u128651/6ipconfig.png "Identifying the IP address with ipconfig") -我下一步是通过我的电脑客户端连接到树莓派访问我添加的电子书。我在客户端上打开一个浏览器并输入树莓的地址,后面加上 **:8080** 端口。在我这里是 **[http://192.168.1.10:8080][10]** (根据你 Pi 的地址来适配)。 +我下一步是通过我的电脑客户端连接到树莓派访问我添加的电子书。我在客户端上打开一个浏览器并输入树莓的地址,后面加上 **:8080** 端口。在我这里是 **http://192.168.1.10:8080** (根据你 Pi 的地址来适配)。 你会在浏览器中看到主页: -### [7calibre-home.png][7] - ![Calibre's client homepage](https://opensource.com/sites/default/files/u128651/7calibre-home.png "Calibre's client homepage") 我已经测试,并能用 iPhone、Linux、MacOS 计算机轻易连接到服务器。 你可以在这个主页总探索选项,或者点击 **All Books** 显示服务器上的所有内容。 -### [8browsing-books.png][8] - ![Browsing e-books](https://opensource.com/sites/default/files/u128651/8browsing-books.png "Browsing e-books") 从这里,你可以下载书到你的设备并离线阅读了。 @@ -86,9 +68,9 @@ Don Watkins - 教育家、教育技术专家、企业家、开源倡导者。教 via: https://opensource.com/article/17/6/raspberrypi-ebook-server -作者:[Don Watkins ][a] +作者:[Don Watkins][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/) 荣誉推出 From 311bdde1c18ff5ea1719b5dd8b2b2ee54a5dd248 Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 10 Jul 2017 20:45:59 +0800 Subject: [PATCH 0648/1407] translating --- sources/tech/20170619 Is IoT the Future of Linux.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170619 Is IoT the Future of Linux.md b/sources/tech/20170619 Is IoT the Future of Linux.md index 15bac22e49..32f58162db 100644 --- a/sources/tech/20170619 Is IoT the Future of Linux.md +++ b/sources/tech/20170619 Is IoT the Future of Linux.md @@ -1,3 +1,5 @@ +translating---geekpi + Is IoT the Future of Linux? ============================================================ From 0511c92f0a0f014c82d5001af3fd34c3eb6b032a Mon Sep 17 00:00:00 2001 From: datastruct Date: Mon, 10 Jul 2017 22:05:10 +0800 Subject: [PATCH 0649/1407] Update 20170529 Ubuntu GamePack.md --- sources/tech/20170529 Ubuntu GamePack.md | 61 +++++++++++++++++++++--- 1 file changed, 54 insertions(+), 7 deletions(-) diff --git a/sources/tech/20170529 Ubuntu GamePack.md b/sources/tech/20170529 Ubuntu GamePack.md index 72ab18b83b..df4cef864a 100644 --- a/sources/tech/20170529 Ubuntu GamePack.md +++ b/sources/tech/20170529 Ubuntu GamePack.md @@ -6,54 +6,101 @@ Ubuntu GamePack A lot of people who like to use their Linux system for gaming. There seems to be no shortage of gaming systems which can supply access to games. UALinux is a Ukrainian company which promotes the use of GNU/Linux. UALinux has created a Ubuntu version to fill the gap for gaming. The Operating System (OS) is called Ubuntu GamePack and is based off of Ubuntu 16.04. -很大一部分 Linux爱好者喜欢用他们的系统玩游戏。现在看起来能够可以支持游戏的游戏系统很短缺。UALinux是一家推广使用GNU/Linux的乌克兰公司。UALinux开发了一个Ubuntu版本填补了这一空白。这个操作系统(OS)命名为Ubuntu GamePack 基于Ubuntu 16.04. + +很大一部分 Linux 爱好者喜欢用他们的系统玩游戏。现在看起来能够可以支持游戏的游戏系统很短缺。UALinux 是一家推广使用 GNU/Linux 的乌克兰公司。UALinux 开发了一个 Ubuntu 版本填补了这一空白。把这个基于 Ubuntu 16.04 的操作系统(OS)命名为 Ubuntu GamePack . **Contents** + ** 内容 ** + The list of games would be quite extensive but the company claims there is access to over 22,381 games. + 游戏现在已经相当广泛,但是游戏公司已经宣称可以访问超过22,381款游戏。 + The GamePack includes Lutris and Steam to allow you access to the specific gaming services the distributer provides. -GamePack 包括 Lutris 和 Steam两部分,允许您访问分发商提供的定制游戏服务。 + +GamePack 包括 Lutris 和 Steam 两部分,允许您访问分发商提供的定制游戏服务。 + For Windows-based games there is PlayOnLinux, WINE and CrossOver so the games will run on Linux. -对于基于Windows的游戏,有PlayOnLinux,WINE和CrossOver转换到Linux上运行。 + +对于基于 Windows 的游戏,有 PlayOnLinux,WINE 和 CrossOver 转换到 Linux 上运行。 + For DOS games you can run the games in DosBox which is a DOS emulator for Linux. -对于DOS游戏,您可以在DosBox中运行游戏,这是一个Linux的DOS模拟器 + +对于 DOS 游戏,您可以在 DosBox 中运行游戏,这是一个 Linux 的 DOS 模拟器 + Sparky APTus Gamer is also installed to allow access to numerous gaming console emulators. The emulators include: -Sparky APTus Gamer被安装应用允许访问众多游戏控制模拟器。 模拟器包括: + +Sparky APTus Gamer 被安装应用允许访问众多游戏控制模拟器。 模拟器包括: + *   AdvanceMENU – front-end for AdvanceMAME, AdvanceMESS, MAME, MESS, xmame, Raine and other emulators + *  AdvanceMENU - 前端包括 AdvanceMAME, AdvanceMESS, MAME, MESS, xmame, Raine 以及其他的模拟器 + *   Atari800 - emulator for Atari 8-bit systems, XE Game System and Atari 5200 SuperSystem -*  Atari800 - Atari 8位系统的模拟器,XE游戏系统和Atari 5200 超级系统 + +*  Atari800 - Atari 8位系统的模拟器,XE 游戏系统和 Atari 5200 超级系统 + *   DeSmuME - Nintendo DS emulator + *   DeSmuME - Nintendo DS 模拟器 + *   Desura - digital distribution platform for Windows, Linux and X systems - OnLine installer -*   Desura - + +*   Desura - 为Windows数字化分发平台,Linux 和 x 系统 - 在线安装 + * DOSBox - DOS emulator for BeOS, Linux, Mac X, OS2, and Windows +* DOSBox - 为系统 BeOS, Linux, Mac X, OS2, 和 Windows 定制的 DOS 模拟器 + * DOSEMU - DOS Emulator for Linux +* DOSEMU - 为 Linux 系统定制的 DOS 模拟器 + * ePSXe - enhanced PSX emulator +* ePSXe - 增强的 PSX 模拟器(仿真器) + * FCEUX - Nintendo Entertainment System (NES), Famicom and Famicom Disk System (FDS) emulator +* FCEUX - 任天堂娱乐系统(NES),费米康和费米康磁盘系统(FDS)模拟器(仿真器) + * FS-UAE - Cross-platform Amiga emulator +* FS-UAE - 跨平台多媒体(Amiga)模拟器 + * GNOME Video Arcade - Simple MAME frontend +* GNOME Video Arcade - 简化 MAME 前端 + * Hatari - Atari ST, STE, TT and Falcon emulator for Linux and other systems +* Hatari - 用于Linux和其他系统的Atari ST,STE,TT和 Falcon 模拟器(仿真器) + * Higan - Emulator for Nintendos SNES, NES, Gameboy, Gameboy Color and Gameboy Advance +* Higan - 任天堂 SNES,NES,Gameboy,Gameboy Color 和 Gameboy Advance 的模拟器 + * Kega_Fusion - Sega SG/SC/SF, Master System, Game Gear, Genesis/Megadrive, SVP, Pico, SegaCD/MegaCD emulator +* Kega_Fusion - 世嘉 SG / SC / SF,主系统,游戏机,创世纪 / 麦加驱动,SVP,Pico,SegaCD / MegaCD 模拟器(仿真器) + * MAME - Hardware emulator which faithfully reproduces the behavior of many arcade machines +* MAME - 不折不扣地复制许多街机行为硬件模拟器(仿真器) + * Mednafen - Atari Lynx, GameBoy, NES, SNES, PC-FX, Sega, Sony PlayStation and other systems +* Mednafen - Atari Lynx,GameBoy,NES,SNES,PC-FX,世嘉,索尼游戏站等系统 + * MESS - Emulator for various consoles and computing systems +* MESS - 各种控制台和计算系统的模拟器(仿真器) + * Nestopia - Nintendo Entertainment System/Famicom emulator +* Nestopia - 任天堂娱乐系统/费米康模拟器 + * PCSX - Sony PlayStation emulator * PlayOnLinux - Front-end for Wine From 7fdc41c40df706983dc9cdca8bbd516a97bb8295 Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 11 Jul 2017 09:10:17 +0800 Subject: [PATCH 0650/1407] translated --- .../20170619 Is IoT the Future of Linux.md | 86 ------------------- .../20170619 Is IoT the Future of Linux.md | 84 ++++++++++++++++++ 2 files changed, 84 insertions(+), 86 deletions(-) delete mode 100644 sources/tech/20170619 Is IoT the Future of Linux.md create mode 100644 translated/tech/20170619 Is IoT the Future of Linux.md diff --git a/sources/tech/20170619 Is IoT the Future of Linux.md b/sources/tech/20170619 Is IoT the Future of Linux.md deleted file mode 100644 index 32f58162db..0000000000 --- a/sources/tech/20170619 Is IoT the Future of Linux.md +++ /dev/null @@ -1,86 +0,0 @@ -translating---geekpi - -Is IoT the Future of Linux? -============================================================ - -_Linux will certainly play a key role in the Internet of Things, but it likely will share the spotlight._ - - -With [Canonical refocusing][8] on becoming profitable and new technologies, some among us have found ourselves pondering where Linux is headed in the future and whether or not IoT (Internet of Things) is the future of Linux? This article aims to address both issues head on. - -### Mycroft runs Linux - -Unknown to most of the non-tech savvy world, there is in fact a few different IoT projects out there that aren't the over-commercialized ones we keep seeing ads for on the Web. The most successful among there has to be the [Mycroft][9] project. - -Part of what makes Mycroft interesting is that you're not required to get it as stand alone hardware. This means you can actually download it to a Raspberry Pi or even your own PC. This is an element of freedom not found in more commonly known commercialized alternatives from other players in the IoT device space. Another interesting fact about the Mycroft project is that it was initially funded with crowd funding. So from its inception, it was truly a community inspired project. - -So what about its skills, the term used to describe recipes for its abilities? As it stands now, I've heard some mixed reviews. By taking a look into the listed skills available on Github, the overall list seems to be fairly impressive. Digging deeper, it's easy to see that many of the skills are geekier than those found with proprietary IoT devices. - -It's also worth noting that there's a distinctive difference between an official skill for IoT devices and those developed by community members. The official skills list for Mycroft is actually pretty weak. Let's face it, as cool as it is to have Linux running an IoT device, it's mind-blowing to me that there are no official email checking skills listed on the [Mycroft Github][10] page. Okay, there is one for Gmail in the community skills section...and it's listed with a question mark as it's apparently not verified as working (or not). - -### Google Home – It's a Linux puzzle wrapped in a riddle - -So what about Google's IoT offering, Google Home. Surely this runs on Linux, right? Well, in a very broad sense...sort of. It turns out that Google Home is [based on the Chromecast][11]. And the Chromecast? Well, it's based on Google TV. Are we at the Linux part yet? Not exactly. - -Apparently the Chromecast is basically running a [stripped down version of Android][12]. And as most of us know, Android does indeed utilize a customized version of the Linux kernel. - -It's at this point, I feel like we need to ask ourselves – is Google the best representative for Linux IoT that we can come up with? I'd argue no, as I feel like they're willing to make privacy compromises we wouldn't see in a pure Linux IoT environment. But that's just my personal belief. - -Assuming we're willing to give Google Home the benefit of the doubt and assuming that there is some Linux worth recognizing under the hood, how does it compare to the pure open source experience found with Mycroft? - -Currently, Google is crushing it. First of all, you can indeed install the "brains" of Google Home (called Google Assistant) to a Raspberry Pi if you wish to. This is made available through the [Google Assistant SDK][13]. - -The SDK is you guessed it...available to be installed on Linux. After installing portaudio, various libs and a pip install of google-assistant-sdk, you're ready to start talking to your Pi much like you would a Google Home device. - -Getting back to the actual Google Home device itself, you might be wondering about its available skills? Out of the box, it provides music playback with Google Play Music, Pandora, Spotify, and iHeart Radio, among other streaming music services. Not only does Google Home have more "conversation" skills available than Mycroft, it works with services like Netflix and home brands such as Philips, Nest and [IFTTT][14] for various smart home tasks. Did I mention it can also schedule stuff on Google Calendar or order pizza? - -Comparatively, Mycroft is better for the DIY developer who is looking to create their own skills where Google Home is ready to roll now, not someday. - -### Amazon Echo can run on Linux - -I'll be first to admit that I have no idea if the Amazon Echo itself runs on some element of Linux or not. That said, I do know you can install the brains behind the Echo onto a Linux powered Raspberry Pi! When it was [first released for the Pi][15], it was a bit of a let down since you had to press a button to activate the Echo's listening mode. - -Flash forward to now, Echo for the Pi now supports a programmable "hot word" to activate it. This means you can run a Pi installed with Linux that operates in a similar manner to an official Amazon Echo. Then again, if you buy an Echo Dot, you could just skip the extra work and save the geeky stuff for a Mycroft install on a Pi instead. - -Just like Mycroft and Google Home, the Amazon Echo being available on a Pi is important as it makes the IoT technology available to anyone – not just those who opt for the official hardware. And because Amazon has had more time to develop the technology, the Echo is arguably ahead of the competition with programmable skills and overall progress. - -So even though Google Home does a far better job answering questions with better answers, the Echo supports more third party IoT devices and some believe has a more natural voice than Google Home. Personally, I think the voices on both devices sound good. But that's just my opinion. - -### IoT is Linux at its best - -Assuming for a minute we continue to see these IoT devices that are compatible with Linux or projects like Mycroft that are genuinely partners with the community using Linux, one thing is for sure – Linux continues to be a part of the equation. - -I would argue that not using a free/open source platform like Linux is just foolish. After all, these devices will often times be connected to other IoT automation components. This means security needs to be a real consideration. Running IoT with Linux under the hood means that we're able as a community to ensure that security is job one, instead of hoping the manufacturer does this for us. - -Need an example as to why this is important? Look to any consumer router not running open source firmware. What happens when the manufacturer stops supporting that device – security risks crop up. - -Is IoT the future of Linux? In my opinion, I think it is...but not in its entirety. I think that for many it will be a stepping ground. But in the end, I think that there will be so much proprietary "stuff" piled on top of the Linux portion that only pure projects like Mycroft will remain Linux only. - -So what say you? Do you think that open source projects like Mycroft are proper competition with Google and Amazon offerings now? Perhaps instead, you feel that there are other Linux based offerings better suited for the job? Whatever it may be, hit the Comments and let's talk about it. - --------------------------------------------------------------------------------- - -via: http://www.datamation.com/open-source/is-iot-the-future-of-linux.html - -作者:[Matt Hartley ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.datamation.com/author/Matt-Hartley-3080.html -[1]:http://www.datamation.com/feedback/http://www.datamation.com/open-source/is-iot-the-future-of-linux.html -[2]:http://www.datamation.com/author/Matt-Hartley-3080.html -[3]:http://www.datamation.com/e-mail/http://www.datamation.com/open-source/is-iot-the-future-of-linux.html -[4]:http://www.datamation.com/print/http://www.datamation.com/open-source/is-iot-the-future-of-linux.html -[5]:http://www.datamation.com/open-source/is-iot-the-future-of-linux.html#comment_form -[6]:http://www.datamation.com/open-source/is-iot-the-future-of-linux.html# -[7]:http://www.datamation.com/author/Matt-Hartley-3080.html -[8]:https://insights.ubuntu.com/2017/04/05/growing-ubuntu-for-cloud-and-iot-rather-than-phone-and-convergence/ -[9]:https://mycroft.ai/ -[10]:https://github.com/MycroftAI/mycroft-skills -[11]:https://www.theverge.com/circuitbreaker/2016/5/31/11822032/google-home-chromecast-android -[12]:https://www.extremetech.com/computing/162463-chromecast-hacked-its-based-on-google-tv-and-android-not-chrome-os -[13]:https://developers.google.com/assistant/sdk/ -[14]:https://ifttt.com/google_assistant -[15]:https://www.raspberrypi.org/blog/amazon-echo-homebrew-version/ diff --git a/translated/tech/20170619 Is IoT the Future of Linux.md b/translated/tech/20170619 Is IoT the Future of Linux.md new file mode 100644 index 0000000000..94936d9cb6 --- /dev/null +++ b/translated/tech/20170619 Is IoT the Future of Linux.md @@ -0,0 +1,84 @@ +物联网是 Linux 的未来么? +============================================================ + + +_Linux 将会在物联网中扮演一个关键角色,但是它可能会分享焦点。_ + +随着[ Canonical 重新聚焦在][8]赢利和新技术,我们中的一些人发现我们正在思考 Linux 未来将走向何方,IoT(物联网)是否是 Linux 的未来? 本文旨在解决这两个问题。 + +### Mycroft 运行于 Linux + +对于大多数非技术世界的人来说,实际上有几个不同的 IoT 项目,它们不是我们不断在网络上看到广告的过度商业化的项目。其中最成功的就是 [Mycroft][9] 项目。 + +使得 Mycroft 有趣的部分原因是你不需要在专门的硬件上得到它。这意味着你可以将其下载到 Raspberry Pi 或甚至您自己的 PC 上。这是其他玩家在物联网领域其他更常见的商业化替代品中不常见到的自由元素。Mycroft 项目的另一个有趣的事实是,它最初是众筹的。所以从一开始它就是真正的社区驱动的项目。 + +那么它的技能,这个用来描述它能力的术语怎么样?目前,我听到一些褒贬不一的评论。通过查看 Github 上列出的技能,整体列表似乎相当令人印象深刻。更深层次挖掘的话,很容易看出,许多技能比使用专有的 IoT 设备的技能要好。 + +值得注意的是,物联网设备的官方技能与社区成员开发的功能之间存在明显的区别。Mycroft 的官方技能列表其实很薄弱。让我们面对它,就像 Linux 运行物联网设备一样酷,对我来说,没有官方的邮件检查技能列在 [Mycroft Github][10] 页面上是令人兴奋的。好吧,在社区技能部分有一个 Gmail,它带有一个问号,因为它显然没有验证可以工作(或不工作)。 + +### Google Home - 这是一个包含在谜语中的 Linux 谜题 + +那么 Google 的物联网产品 Google Home 呢?当然这运行在 Linux上,对吧?是的,在广泛意义上。。。事实证明,Google Home [基于 Chromecast][11]。那 Chromecast 呢?它是基于 Google TV。我们还在 Linux 的部分么?不完全是。 + +显然,Chromecast 基本上是运行[ Android 的精简版][12]。而且我们大多数人都知道,Android 确实使用了 Linux 内核的定制版本。 + +在这一点上,我觉得我们需要问自己 - Google 是我们可以想出的最好的 Linux 物联网代表吗?我不会反对,因为我觉得他们愿意在一个纯粹的 Linux 物联网环境中做出我们不会看到的隐私妥协。 但这只是我个人的信仰。 + +假设我们愿意让 Google Home 获得怀疑的好处,假设有一些 Linux 值得认可,那么与 Mycroft 的纯粹的开源体验相比呢? + +目前,谷歌正在打破它。首先,如果你愿意,你可以安装 Google Home(称为 Google Assistant)的“大脑”到树莓派上。这可以通过 [Google Assistant SDK][13] 获得。 + +如你猜的那样,这个 SDK 可以在 Linux 上安装。安装完 portaudio、各种库并且 pip 安装 google-assistant-sdk 之后,你可以开始用派进行通话了,就像 Google Home 设备一样。 + +回到实际 Google Home 设备本身,你可能会想知道它的可用技能?开箱即用,它提供与 Google Play 音乐、Pandora、Spotify 和 iHeart Radio 以及其他流式音乐服务的音乐播放。Google Home 不仅拥有比 Mycroft 更多的“交流”技能,它还适用于像 Netflix 这样的服务和诸如 Philips、Nest和 [IFTTT][14] 等各种智能家居任务的家庭品牌。我有提到它还可以安排 Google 日历或者订购披萨么? + +相比之下,Mycroft 对于想要创造自己的技能的 DIY 开发者来说更好,Google Home 现在可以开始使用,而不是某一天。 + +### Amazon Echo 可以运行于 Linux + +我首先要承认的是我不知道 Amazon Echo 本身是否运行在 Linux 的某些元素上。也就是说,我知道你可以将 Echo 背后的大脑安装到 Linux 驱动的树莓派上!当[第一次发布派上的版本时][15],有点让人失望的是,你不得不按一个按钮来激活 Echo 的聆听模式。 + +很快进行到现在,派上的 Echo 现在支持可编程的“热词”来激活它。这意味着你可以运行一个安装了 Linux 的派,其操作方式与官方 Amazon Echo 相似。在说一次,如果你买了 Echo Dot,你可以跳过额外的工作来代替在安装了 Mycroft 的派上保存极客的东西。 + +就像 Mycroft 和 Google Home 一样,Amazon Echo 可以在派上使用很重要,因为它使任何人都可以使用物联网技术 - 而不仅仅是那些选择官方硬件的人。而且由于亚马逊已经有更多的时间来开发这项技术,因此,可以说 Echo 是超前于可编程技能竞争以及整体进度的。 + +所以即使 Google Home 在问题回答上更好,但是 Echo 支持更多的第三方物联网设备,有些人认为它比 Google Home 有更自然的声音。就个人而言,我认为两台设备的声音听起来都不错。但这只是我的意见。 + +### 物联网是 Linux 最好的 + +假设我们将继续看到这些与 Linux 兼容的物联网设备或者像 Mycroft 这样真正用 Linux 与社区的项目,有一点是可以肯定的,Linux 仍然是等式的一部分。 + +我认为不使用像 Linux 这样的自由/开放源代码平台是愚蠢的。毕竟,这些设备往往会连接到其他物联网自动化组件。这意味着安全性是一个真正的考虑。在 Linux 下运行物联网意味着我们可以作为一个社区确保安全是好的,而不是希望制造商为我们做到这一点。 + +需要一个例子说明为什么这很重要?看看那些不运行开源固件的路由器。当制造商停止支持该设备时会发生什么 - 安全风险开始出现。 + +物联网是 Linux 的未来吗?在我看来,我认为这是。。。但不是全部。我认为对许多人来说,这是前进的道路。但是最后,我认为在 Linux 之上将会有许多专有的“东西”,只有像 Mycroft 这样纯粹的项目才能保持 Linux。 + +那么你会说什么?你认为像 Mycroft 这样的开源项目现在与 Google 和 Amazon 的产品在正常竞争么?反之,你觉得还有其他基于 Linux 的产品更适合这项工作么?无论是什么,点击评论,让我们来谈谈。 + +-------------------------------------------------------------------------------- + +via: http://www.datamation.com/open-source/is-iot-the-future-of-linux.html + +作者:[Matt Hartley ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.datamation.com/author/Matt-Hartley-3080.html +[1]:http://www.datamation.com/feedback/http://www.datamation.com/open-source/is-iot-the-future-of-linux.html +[2]:http://www.datamation.com/author/Matt-Hartley-3080.html +[3]:http://www.datamation.com/e-mail/http://www.datamation.com/open-source/is-iot-the-future-of-linux.html +[4]:http://www.datamation.com/print/http://www.datamation.com/open-source/is-iot-the-future-of-linux.html +[5]:http://www.datamation.com/open-source/is-iot-the-future-of-linux.html#comment_form +[6]:http://www.datamation.com/open-source/is-iot-the-future-of-linux.html# +[7]:http://www.datamation.com/author/Matt-Hartley-3080.html +[8]:https://insights.ubuntu.com/2017/04/05/growing-ubuntu-for-cloud-and-iot-rather-than-phone-and-convergence/ +[9]:https://mycroft.ai/ +[10]:https://github.com/MycroftAI/mycroft-skills +[11]:https://www.theverge.com/circuitbreaker/2016/5/31/11822032/google-home-chromecast-android +[12]:https://www.extremetech.com/computing/162463-chromecast-hacked-its-based-on-google-tv-and-android-not-chrome-os +[13]:https://developers.google.com/assistant/sdk/ +[14]:https://ifttt.com/google_assistant +[15]:https://www.raspberrypi.org/blog/amazon-echo-homebrew-version/ From 5b7febdd757d1b064e0b4e0910d43adff4dbd6ee Mon Sep 17 00:00:00 2001 From: datastruct Date: Tue, 11 Jul 2017 09:43:29 +0800 Subject: [PATCH 0651/1407] Update 20170529 Ubuntu GamePack.md --- sources/tech/20170529 Ubuntu GamePack.md | 117 +++++++++++++++++++---- 1 file changed, 99 insertions(+), 18 deletions(-) diff --git a/sources/tech/20170529 Ubuntu GamePack.md b/sources/tech/20170529 Ubuntu GamePack.md index df4cef864a..cbaca4a1df 100644 --- a/sources/tech/20170529 Ubuntu GamePack.md +++ b/sources/tech/20170529 Ubuntu GamePack.md @@ -1,5 +1,3 @@ -"stevenzdg988 translating" - Ubuntu GamePack =============== @@ -103,139 +101,222 @@ Sparky APTus Gamer 被安装应用允许访问众多游戏控制模拟器。 模 * PCSX - Sony PlayStation emulator -* PlayOnLinux - Front-end for Wine +*   PCSX - 索尼游戏平台模拟器(仿真器) +  +*   PlayOnLinux - Front-end for Wine +*   PlayOnLinux - 前端生成 +  * PPSSPP - PPSSPP is an open source PSP emulator available for Windows, MacOS, Linux and Android +* PPSSPP - PPSSPP 是适用于 Windows,MacOS,Linux 和 Android 的开源 PSP 仿真器 + * Steam - launcher for the Steam software distribution service - OnLine installer +* Steam - Steam 软件分发服务的启动器 - 在线安装程序 + * Stella - Atari 2600 Emulator for SDL and the X Window System +* Stella -用于 SDL 和 X Window 系统的 Atari 2600 仿真器 + * VisualBoyAdvance - Full featured Game Boy Advance emulator +* VisualBoyAdvance - 全功能 Game Boy Advance 模拟器 + * Virtual Jaguar - Cross-platform emulator for Atari's infamous Jaguar console +* Virtual Jaguar - 用于 Atari infamous Jaguar 控制台的跨平台模拟器 + * Wine - Windows implementation +*   Wine - 窗口实现 +  * Winetricks - a POSIX shell script 'package manager' for WINE to install some Windows software easily +*   Winetricks - POSIX shell脚本的软件包管理器,能够很容易为 WINE 安装 Windows软件 + * Yabause - Sega Saturn emulator +*   Yabause - 世嘉土星32位游戏机模拟器(仿真器) +  * ZSNES - Emulator for the Super Nintendo Entertainment System +* ZSNES - 超级任天堂娱乐系统模拟器 + The GamePack also includes Oracle Java and Adobe Flash which is needed by quite a few games. +GamePack还包括被相当多的游戏平台所必须的 Oracle java 和 Adobe Flash。 + If this seems to be an OS you are interested in then read on to find out how to download it. +如果这是一个你感兴趣的操作系统,请继续阅读,看看如何下载它。 + **Download** +  +**下载** + The main place to download the OS is from UALinux. The link from UALinux is [https://ualinux.com/en/download/category/25-ubuntu-gamepack][1]. Since the link is from a foreign country it is a slow download. Another option is to download the OS from a Torrent file. If you do not have a Torrent program you may want to download ‘Transmission’. Once you have a Torrent program go to [https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-январь-2017-pc-vkn99.html][2]. The Torrent will allow you to download both the 64-bit and 32-bit ISO files. +下载此操作系统镜像的主要是来自 UALinux 。其下载链接是: [https://ualinux.com/en/download/category/25-ubuntu-gamepack][1]。 +由于此链接来自国外,所以下载速度很慢。另一种选择是利用种子文件下载此操作系统。如果没有你想要下载的“传输”种子下载程序。你可以通过[https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-январь-2017-pc-vkn99.html][2] +此链接获得。这个种子文件下载可以下载 64 位和 32 位 的 ISO 镜像文件。 The file sizes vary depending on the architecture you need. The 64-bit OS ISO file is 2.27 GB, while the 32-bit OS ISO file is 2.13 GB. +文件大小取决于您需要的架构。64 位操作系统 ISO 镜像文件大小是 2.27 GB,而 32 位的操作系统 ISO 镜像文件大小是 2.13 GB. +   Once downloaded you can use the ISO file to create a bootable DVD to install the GamePack or you can use a program like ‘USB Image Writer’ to place the ISO on a USB stick to install it. +  +如果下载了你所用的 ISO 镜像文件,你可以利 ISO 文件创建一个可启动的 DVD 安装 Gamepack 或者你可以使用 ‘USB Image Writer’把 ISO 写入到优盘,并利用此优盘安装系统。 The requirements are the same as Ubuntu 16.04: - +  +硬件需求和 Ubuntu 16.04 保持一致: +  * 2 GHz dual core processor or better -* 2 GB system memory +*   2 GHz 双核处理器或者更高 +*   2 GB system memory + +*   2 GB 系统内存 +  * 25 GB of free hard drive space -* Either a DVD drive or a USB port for the installer media +*   25 GB 的磁盘空间 +*   Either a DVD drive or a USB port for the installer media + +*   具有 DVD 驱动器或者具备 USB 端口,以便于安装 +  * Internet access is required for online gaming systems such as Steam +*   在线游戏系统(如Steam)需要互联网接入。 + It goes without saying that for gaming you definitely want to have a system with more than these ‘minimum’ requirements. More memory would be a definite plus as well as a decent video card with a fair amount of Video RAM. +不用说,对于游戏玩家来说,肯定希望拥有比这些“最低配置”要求更高的系统配置。更多的内存将是一个有把握的选择,也应该有一款正版的显存大一点的显卡。 + Once you have a system and the specific ISO file for the system, 32- or 64-bit OS, then you are ready to install the Operating System. -**Installation** +您如果有了硬件系统和系统的特定 32位 或者 64 位 ISO 文件,那么接下来就可以安装操作系统了。 +**Installation** +  +**安装过程** + Once you have the ISO file on a media from which you can boot your system you are ready to continue. +在媒体上利用 ISO 镜像文件启动了系统,您就可以准备进行下一步了。 + Boot from the Ubuntu GamePack media and you should see a screen similar to Figure 1. +从 Ubuntu Gamepack 介质启动,你会看到一个类似图1的屏幕。 + ![Figure 01.png](https://www.linux.org/attachments/figure-01-png.671/) **FIGURE 1** +**图 1** Once everything is loaded the installer can proceed with the installation. Figure 2 shows the next screen which allows you to specify your language and whether you want to install or try the GamePack. If you wish, you can click ‘Try Ubuntu’ to simply load it into memory and try it out without making changes to your drive. +一旦加载完毕,安装程序就可以继续安装了。图2显示下一屏,可以定制语言,接下来是安装或者体验 Gamepack。如果你愿意,你可以点击 “Try Ubuntu” 在不改变驱动器的情况下把它加载到内存中运行。 + ![Figure 02.png](https://www.linux.org/attachments/figure-02-png.672/) **FIGURE 2** +**图 2** Once you are ready to continue select ‘Install Ubuntu’. - +  +接下来继续选择 ‘Install Ubuntu’ 进行安装了。 +  The next screen, Figure 3, allows you to specify whether to download any updates for Ubuntu while installing it. You can also choose to install Third Party software for Graphics, WiFi, Flash, MP3 and other updates. -Once you have made your selections, press ‘Continue’. +下一个屏幕,如图3所示,你可以在安装 Ubuntu 时指定是否下载 Ubuntu 的任何更新。您还可以选择安装第三方的软件,如:Graphics, WiFi, Flash, MP3 和其他更新。 +Once you have made your selections, press ‘Continue’. +  +当定制好你的系统后,就可以点击“Continue”  +  ![Figure 03.png](https://www.linux.org/attachments/figure-03-png.673/) **FIGURE 3** +**图 3** Next, you must specify how the drive will be configured for use as shown in Figure 4\. If you plan on using the whole drive, then it may be easier to leave the settings as they are and click ‘Install Now’. +接下来,您必须指定驱动器将如何配置为使用,如图4所示。如果您计划使用整个驱动器,那么可以更容易地设置,选择此驱动器即可,然后单击“Install Now”。 + ![Figure 04.png](https://www.linux.org/attachments/figure-04-png.674/) **FIGURE 4** +**图 4** As shown in Figure 5 you will be prompted to verify your selection for configuring the hard drive. If you approve the changes then click ‘Continue’. - +  +接下来在图5中可以根据提示确认所选择硬件配置。如果同意以上的更改,请单击“Continue”。  +  ![Figure 05.png](https://www.linux.org/attachments/figure-05-png.675/) **FIGURE 5** +**图 5** Next you will be prompted to choose your Time Zone as shown in Figure 6\. Click ‘Continue’ once you have set your Time Zone. - +接下来,如图6所示,你将按照提示选择时区,选择完毕后点击“Continue”。 ![Figure 06.png](https://www.linux.org/attachments/figure-06-png.676/) **FIGURE 6** +**图 6** A window will appear, Figure 7, to allow you to set the default keyboard layout. Choose the correct layout and press ‘Continue’. - +接下来,如图7所示,需要您设置默认的键盘布局。选择适合您的正确的布局后并按“Continue”。 ![Figure 07.png](https://www.linux.org/attachments/figure-07-png.677/) **FIGURE 7** +**图 7** The last configuration screen is for you to set up a User account as shown in Figure 8\. Type in your name, computer name, User name, password and select if you need to type the password to log onto the system. You can also set to encrypt the Home Folder for this User. +最后一个配置屏幕是为您设置一个用户帐户,如图8所示。键入您的姓名、计算机名、用户名、密码和选择您需要键入密码登录系统的方式。您还可以为该用户设置加密主目录。 ![Figure 08.png](https://www.linux.org/attachments/figure-08-png.678/) **FIGURE 8** +**图 8** The installation should proceed now by setting up the drive as specified. Files will be copied from the boot media to the hard drive as shown in Figure 9\. Once everything is copied to the drive and set up you will be prompted to remove the Boot Media to allow the system to restart. +安装将按定制进行设置驱动器。安装文件将从引导媒体复制到硬盘驱动器,如图9所示。所有内容复制到驱动器并设置,您将被提示移除引导媒体并允许重新启动系统。 ![Figure 09.png](https://www.linux.org/attachments/figure-09-png.679/) **FIGURE 9** +**图 9** After the restart, if you selected to require the User to log in, then you will be given a screen like Figure 10\. Here you enter the password you specified for the User and log onto Ubuntu GamePack. +重新启动后,您需要选择用户登录,会得到类似于图10的屏幕\\。输入指定的用户密码登录到 Ubuntu Gamepack。 ![Figure 10.png](https://www.linux.org/attachments/figure-10-png.680/) **FIGURE 10** +**图 10** After you log onto Ubuntu GamePack you should probably try to perform any software upgrades which may be necessary. Open a Terminal and enter the following two commands: +当你登录到 Ubuntu Gamepack 你应该尝试执行可能需要的任何软件升级。打开一个终端并输入以下两个命令: - _sudo apt-get update -sudo apt-get upgrade_ +sudo apt-get update && sudo apt-get upgrade Any updates which are not installed should be installed to bring the GamePack system up-to-date. - +更新会安装 GamePack 系统定制的软件更新。 Now, simply look through the menu and find the games you wish to play. Open the emulators or any of the game services like Steam. - +现在,只要看看菜单,找到你想玩的游戏就行了。打开模拟器或任何游戏服务如 Steam 。 Hope you enjoy the GamePack and have fun! - +希望你喜欢 Gamepack 并且玩得高兴! -------------------------------------------------------------------------------- via: https://www.linux.org/threads/ubuntu-gamepack.4559/ 作者:[Jarret B ][a] -译者:[译者ID](https://github.com/译者ID) +译者:[stevenzdg988](https://github.com/stevenzdg988) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 0bbadc990fcda7ab53f393ec6fb0ac15f5d4bb70 Mon Sep 17 00:00:00 2001 From: datastruct Date: Tue, 11 Jul 2017 09:45:41 +0800 Subject: [PATCH 0652/1407] Update 20170529 Ubuntu GamePack.md --- sources/tech/20170529 Ubuntu GamePack.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) diff --git a/sources/tech/20170529 Ubuntu GamePack.md b/sources/tech/20170529 Ubuntu GamePack.md index cbaca4a1df..9607f442a9 100644 --- a/sources/tech/20170529 Ubuntu GamePack.md +++ b/sources/tech/20170529 Ubuntu GamePack.md @@ -263,20 +263,25 @@ As shown in Figure 5 you will be prompted to verify your selection for configuri **图 5** Next you will be prompted to choose your Time Zone as shown in Figure 6\. Click ‘Continue’ once you have set your Time Zone. + 接下来,如图6所示,你将按照提示选择时区,选择完毕后点击“Continue”。 + ![Figure 06.png](https://www.linux.org/attachments/figure-06-png.676/) **FIGURE 6** **图 6** A window will appear, Figure 7, to allow you to set the default keyboard layout. Choose the correct layout and press ‘Continue’. + 接下来,如图7所示,需要您设置默认的键盘布局。选择适合您的正确的布局后并按“Continue”。 + ![Figure 07.png](https://www.linux.org/attachments/figure-07-png.677/) **FIGURE 7** **图 7** The last configuration screen is for you to set up a User account as shown in Figure 8\. Type in your name, computer name, User name, password and select if you need to type the password to log onto the system. You can also set to encrypt the Home Folder for this User. + 最后一个配置屏幕是为您设置一个用户帐户,如图8所示。键入您的姓名、计算机名、用户名、密码和选择您需要键入密码登录系统的方式。您还可以为该用户设置加密主目录。 ![Figure 08.png](https://www.linux.org/attachments/figure-08-png.678/) @@ -285,6 +290,7 @@ The last configuration screen is for you to set up a User account as shown in Fi **图 8** The installation should proceed now by setting up the drive as specified. Files will be copied from the boot media to the hard drive as shown in Figure 9\. Once everything is copied to the drive and set up you will be prompted to remove the Boot Media to allow the system to restart. + 安装将按定制进行设置驱动器。安装文件将从引导媒体复制到硬盘驱动器,如图9所示。所有内容复制到驱动器并设置,您将被提示移除引导媒体并允许重新启动系统。 ![Figure 09.png](https://www.linux.org/attachments/figure-09-png.679/) @@ -293,6 +299,7 @@ The installation should proceed now by setting up the drive as specified. Files **图 9** After the restart, if you selected to require the User to log in, then you will be given a screen like Figure 10\. Here you enter the password you specified for the User and log onto Ubuntu GamePack. + 重新启动后,您需要选择用户登录,会得到类似于图10的屏幕\\。输入指定的用户密码登录到 Ubuntu Gamepack。 ![Figure 10.png](https://www.linux.org/attachments/figure-10-png.680/) @@ -301,15 +308,21 @@ After the restart, if you selected to require the User to log in, then you will **图 10** After you log onto Ubuntu GamePack you should probably try to perform any software upgrades which may be necessary. Open a Terminal and enter the following two commands: + 当你登录到 Ubuntu Gamepack 你应该尝试执行可能需要的任何软件升级。打开一个终端并输入以下两个命令: sudo apt-get update && sudo apt-get upgrade Any updates which are not installed should be installed to bring the GamePack system up-to-date. + 更新会安装 GamePack 系统定制的软件更新。 + Now, simply look through the menu and find the games you wish to play. Open the emulators or any of the game services like Steam. + 现在,只要看看菜单,找到你想玩的游戏就行了。打开模拟器或任何游戏服务如 Steam 。 + Hope you enjoy the GamePack and have fun! + 希望你喜欢 Gamepack 并且玩得高兴! -------------------------------------------------------------------------------- From 87526c46121bad91e7bf29d0220b6a9ceda5f8e8 Mon Sep 17 00:00:00 2001 From: stevenzdg988 Date: Tue, 11 Jul 2017 09:51:29 +0800 Subject: [PATCH 0653/1407] translated --- {sources/tech => translated}/20170529 Ubuntu GamePack.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {sources/tech => translated}/20170529 Ubuntu GamePack.md (100%) diff --git a/sources/tech/20170529 Ubuntu GamePack.md b/translated/20170529 Ubuntu GamePack.md similarity index 100% rename from sources/tech/20170529 Ubuntu GamePack.md rename to translated/20170529 Ubuntu GamePack.md From 5d9fb1844a05890995e408905243ecd92da30dde Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 11 Jul 2017 13:29:40 +0800 Subject: [PATCH 0654/1407] translating --- ...8 ways to contribute to open source when you have no time.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170622 8 ways to contribute to open source when you have no time.md b/sources/tech/20170622 8 ways to contribute to open source when you have no time.md index a5b52f6da9..ca41524d02 100644 --- a/sources/tech/20170622 8 ways to contribute to open source when you have no time.md +++ b/sources/tech/20170622 8 ways to contribute to open source when you have no time.md @@ -1,3 +1,5 @@ +translating----geekpi + 8 ways to contribute to open source when you have no time ============================================================ From d22489b14eddc8cb10c9c73fdc8b7f59e7f64fbf Mon Sep 17 00:00:00 2001 From: datastruct Date: Tue, 11 Jul 2017 15:03:15 +0800 Subject: [PATCH 0655/1407] Update 20170529 Ubuntu GamePack.md --- translated/20170529 Ubuntu GamePack.md | 11 +++++++++++ 1 file changed, 11 insertions(+) diff --git a/translated/20170529 Ubuntu GamePack.md b/translated/20170529 Ubuntu GamePack.md index 9607f442a9..fbda39385c 100644 --- a/translated/20170529 Ubuntu GamePack.md +++ b/translated/20170529 Ubuntu GamePack.md @@ -161,6 +161,7 @@ The main place to download the OS is from UALinux. The link from UALinux is [ht 下载此操作系统镜像的主要是来自 UALinux 。其下载链接是: [https://ualinux.com/en/download/category/25-ubuntu-gamepack][1]。 由于此链接来自国外,所以下载速度很慢。另一种选择是利用种子文件下载此操作系统。如果没有你想要下载的“传输”种子下载程序。你可以通过[https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-январь-2017-pc-vkn99.html][2] 此链接获得。这个种子文件下载可以下载 64 位和 32 位 的 ISO 镜像文件。 + The file sizes vary depending on the architecture you need. The 64-bit OS ISO file is 2.27 GB, while the 32-bit OS ISO file is 2.13 GB. 文件大小取决于您需要的架构。64 位操作系统 ISO 镜像文件大小是 2.27 GB,而 32 位的操作系统 ISO 镜像文件大小是 2.13 GB. @@ -216,6 +217,7 @@ Boot from the Ubuntu GamePack media and you should see a screen similar to Figur ![Figure 01.png](https://www.linux.org/attachments/figure-01-png.671/) **FIGURE 1** + **图 1** Once everything is loaded the installer can proceed with the installation. Figure 2 shows the next screen which allows you to specify your language and whether you want to install or try the GamePack. If you wish, you can click ‘Try Ubuntu’ to simply load it into memory and try it out without making changes to your drive. @@ -225,6 +227,7 @@ Once everything is loaded the installer can proceed with the installation. Figur ![Figure 02.png](https://www.linux.org/attachments/figure-02-png.672/) **FIGURE 2** + **图 2** Once you are ready to continue select ‘Install Ubuntu’. @@ -242,6 +245,7 @@ Once you have made your selections, press ‘Continue’. ![Figure 03.png](https://www.linux.org/attachments/figure-03-png.673/) **FIGURE 3** + **图 3** Next, you must specify how the drive will be configured for use as shown in Figure 4\. If you plan on using the whole drive, then it may be easier to leave the settings as they are and click ‘Install Now’. @@ -251,6 +255,7 @@ Next, you must specify how the drive will be configured for use as shown in Figu ![Figure 04.png](https://www.linux.org/attachments/figure-04-png.674/) **FIGURE 4** + **图 4** As shown in Figure 5 you will be prompted to verify your selection for configuring the hard drive. If you approve the changes then click ‘Continue’. @@ -260,6 +265,7 @@ As shown in Figure 5 you will be prompted to verify your selection for configuri ![Figure 05.png](https://www.linux.org/attachments/figure-05-png.675/) **FIGURE 5** + **图 5** Next you will be prompted to choose your Time Zone as shown in Figure 6\. Click ‘Continue’ once you have set your Time Zone. @@ -269,6 +275,7 @@ Next you will be prompted to choose your Time Zone as shown in Figure 6\. Click ![Figure 06.png](https://www.linux.org/attachments/figure-06-png.676/) **FIGURE 6** + **图 6** A window will appear, Figure 7, to allow you to set the default keyboard layout. Choose the correct layout and press ‘Continue’. @@ -278,6 +285,7 @@ A window will appear, Figure 7, to allow you to set the default keyboard layout. ![Figure 07.png](https://www.linux.org/attachments/figure-07-png.677/) **FIGURE 7** + **图 7** The last configuration screen is for you to set up a User account as shown in Figure 8\. Type in your name, computer name, User name, password and select if you need to type the password to log onto the system. You can also set to encrypt the Home Folder for this User. @@ -287,6 +295,7 @@ The last configuration screen is for you to set up a User account as shown in Fi ![Figure 08.png](https://www.linux.org/attachments/figure-08-png.678/) **FIGURE 8** + **图 8** The installation should proceed now by setting up the drive as specified. Files will be copied from the boot media to the hard drive as shown in Figure 9\. Once everything is copied to the drive and set up you will be prompted to remove the Boot Media to allow the system to restart. @@ -296,6 +305,7 @@ The installation should proceed now by setting up the drive as specified. Files ![Figure 09.png](https://www.linux.org/attachments/figure-09-png.679/) **FIGURE 9** + **图 9** After the restart, if you selected to require the User to log in, then you will be given a screen like Figure 10\. Here you enter the password you specified for the User and log onto Ubuntu GamePack. @@ -305,6 +315,7 @@ After the restart, if you selected to require the User to log in, then you will ![Figure 10.png](https://www.linux.org/attachments/figure-10-png.680/) **FIGURE 10** + **图 10** After you log onto Ubuntu GamePack you should probably try to perform any software upgrades which may be necessary. Open a Terminal and enter the following two commands: From d4f21127ab473736f30ce9d67b0e0d8bb87fc4ce Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 11 Jul 2017 15:45:46 +0800 Subject: [PATCH 0656/1407] PRF:20170525 An introduction to Linux s EXT4 filesystem.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @chenxinlong 翻译的很好,这么专业而有价值的文档确实是很难翻译好,我校对都花了好几天。 --- ...introduction to Linux s EXT4 filesystem.md | 117 +++++++++--------- 1 file changed, 58 insertions(+), 59 deletions(-) diff --git a/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md b/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md index 62e6933e26..0483716080 100644 --- a/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md +++ b/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md @@ -1,16 +1,15 @@ -Linux 的 EXT4 文件系统简介 +Linux 的 EXT4 文件系统的历史、特性以及最佳实践 ============================================================ > 让我们大概地从 EXT4 的历史、特性以及最佳实践这几个方面来学习它和之前的几代 EXT 文件系统有何不同。 +在之前关于 Linux 文件系统的文章里,我写过一篇 [Linux 文件系统介绍][12] 和一些更高级的概念例如 [一切都是文件][13]。现在我想要更深入地了解 EXT 文件系统的特性的详细内容,但是首先让我们来回答一个问题,“什么样才算是一个文件系统 ?” 一个文件系统应该涵盖以下所有特点: -在之前关于 Linux 文件系统的文章里,我写过一篇 [Linux 文件系统介绍][12] 和一些更高级的概念例如 [一切都是文件][13]。 我想要更深入地了解 EXT 文件系统的特性的详细内容,但是首先让我们来回答一个问题,“什么样才算是一个文件系统 ?” 一个文件系统应该涵盖以下所有特点: - -1. **数据存储:** 对于任何一个文件系统来说,一个最主要的功能就是能够被当作一个容器结构来存储和取得数据。 -2. **命名空间:** 命名空间是一个提供了命名规则和数据结构的用于命名与组织的方法学。 -3. **安全模型:** 一个用于定义访问权限的策略。 -4. **API:** 调用操作这个系统的对象的系统方法,这些对象诸如目录和文件。 -5. **实现:** 能够实现以上几点的软件。 +1. **数据存储:** 对于任何一个文件系统来说,一个最主要的功能就是能够被当作一个结构化的容器来存储和获取数据。 +2. **命名空间:** 命名空间是一个提供了用于命名与组织数据的命名规则和数据结构的方法学。 +3. **安全模型:** 一个用于定义访问权限的策略。 +4. **API:** 操作这个系统的对象的系统功能调用,这些对象诸如目录和文件。 +5. **实现:** 能够实现以上几点的软件。 本文内容的讨论主要集中于上述几点中的第一项,并探索为一个 EXT 文件系统的数据存储提供逻辑框架的元数据结构。 @@ -25,17 +24,17 @@ Linux 的 EXT4 文件系统简介 Minix 有以下这些结构,其中的大部分位于生成文件系统的分区中: * [**引导扇区**][6] 是硬盘安装后的第一个扇区。这个引导块包含了一个非常小的引导记录和一个分区表。 -* 每一个分区的第一个块都是一个包含了元数据的**超级块(superblock)** ,这些元数据定义了其他文件系统的结构并将其定位于物理硬盘的具体分区上。 +* 每一个分区的第一个块都是一个包含了元数据的**超级块(superblock)** ,这些元数据定义了其他的文件系统结构并将其定位于物理硬盘的具体分区上。 * 一个 **inode 位图块** 决定了哪些 inode 是在使用中的,哪一些是未使用的。 * **inode** 在硬盘上有它们自己的空间。每一个 inode 都包含了一个文件的信息,包括其所处的数据块的位置,也就是该文件所处的区域。 -* 一个 **区位图** 用于保持追踪数据区域的使用和未使用情况。 -* 一个 **数据区**, 这里是数据存储的地方。 +* 一个 **区位图** 用于保持追踪数据区域的使用和未使用情况。 +* 一个 **数据区**, 这里是数据存储的地方。 -对上述了两种位图类型来说,一个位(bit)表示一个指定的数据区或者一个指定的 inode。 如果这个位是 0 则表示这个数据区或者这个 inode 是可用的,如果是 1 则表示正在使用中。 +对上述了两种位图类型来说,一个位(bit)表示一个指定的数据区或者一个指定的 inode。 如果这个位是 0 则表示这个数据区或者这个 inode 是未使用的,如果是 1 则表示正在使用中。 那么,[inode][17] 又是什么呢 ? 就是 index-node (索引节点)的简写。 inode 是位于磁盘上的一个 256 字节的块,用于存储和该 inode 对应的文件的相关数据。这些数据包含了文件的大小、文件的所有者和所属组的用户 ID、文件模式(即访问权限)以及三个时间戳用于指定:该文件最后的访问时间、该文件的最后修改时间和该 inode 中的数据的最后修改时间。 -同时,这个 inode 还包含了指向了其所对应的文件的数据在硬盘中的位置。在 Minix 和 EXT 1-3 文件系统中,这是一个数据区和块的列表。Minix 文件系统的 inode 支持 9 个数据块,包括 7 个直接数据块和 2 个间接数据块。如果你想要更深入的了解,这里有一个优秀的 PDF 详细地描述了 [Minix 文件系统结构][18] 。同时你也可以在维基百科上对 [inode 指针结构][19] 做一个快速了解。 +同时,这个 inode 还包含了位置数据,指向了其所对应的文件数据在硬盘中的位置。在 Minix 和 EXT 1-3 文件系统中,这是一个数据区和块的列表。Minix 文件系统的 inode 支持 9 个数据块,包括 7 个直接数据块和 2 个间接数据块。如果你想要更深入的了解,这里有一个优秀的 PDF 详细地描述了 [Minix 文件系统结构][18] 。同时你也可以在维基百科上对 [inode 指针结构][19] 做一个快速了解。 ### EXT @@ -43,17 +42,17 @@ Minix 有以下这些结构,其中的大部分位于生成文件系统的分 ### EXT2 -[EXT2 文件系统][22] 就相当地成功,它在 Linux 发行版中存活了多年。它是我在 1997 年开始使用 Red Hat Linux 5.0 时接触的第一个文件系统。实际上,EXT2 文件系统有着和 EXT 文件系统基本相同的元数据结构。然而 EXT2 更高瞻远瞩,因为其元数据结构之间留有很多磁盘空间供将来使用。 +[EXT2 文件系统][22] 就相当地成功,它在 Linux 发行版中存活了多年。它是我在 1997 年开始使用 Red Hat Linux 5.0 时接触的第一个文件系统。实际上,EXT2 文件系统有着和 EXT 文件系统基本相同的元数据结构。然而 EXT2 更高瞻远瞩,因为其元数据结构之间留有很多供将来使用的磁盘空间。 -和 Minix 类似,EXT2 也有一个[引导扇区][23] ,它是硬盘安装后的第一个扇区。它包含了非常小的引导记录和一个分区表。接着引导扇区之后是一些保留的空间,它填充了引导记录和硬盘驱动器上的第一个分区(通常位于下一个柱面的)之间的空间。[GRUB2][24] - 也可能是 GRUB1 - 将此空间用于其部分引导代码。 +和 Minix 类似,EXT2 也有一个[引导扇区][23] ,它是硬盘安装后的第一个扇区。它包含了非常小的引导记录和一个分区表。接着引导扇区之后是一些保留的空间,它填充了引导记录和硬盘驱动器上的第一个分区(通常位于下一个柱面)之间的空间。[GRUB2][24] - 也可能是 GRUB1 - 将此空间用于其部分引导代码。 -每个 EXT2 分区中的空间被分为柱面组,它允许更精细地管理数据空间。 根据我的经验,每一组大小通常约为 8MB。 下面的图 1 显示了一个柱面组的基本结构。 柱面中的数据分配单元是块,通常大小为 4K。 +每个 EXT2 分区中的空间被分为柱面组(cylinder group),它允许更精细地管理数据空间。 根据我的经验,每一组大小通常约为 8MB。 下面的图 1 显示了一个柱面组的基本结构。 柱面中的数据分配单元是块,通常大小为 4K。 ![cylindergroup-01_1.png](https://opensource.com/sites/default/files/images/life-uploads/cylindergroup-01_1.png) *图 1: EXT 文件系统中的柱面组的结构* -柱面组中的第一个块是一个超级块(superblock),它包含了一个元数据,定义了其它文件系统的结构并将其定位于物理硬盘的具体分区上。分区中有一些柱面组还会有备用超级块,但并不是所有的柱面组都有。我们还可以使用例如 `dd` 等磁盘工具来拷贝备用超级块的内容到主超级块上,以达到修复损坏的超级块的目的。虽然这种情况不会经常发生,但是在几年前我的一个超级块损坏了,我就是用这种方法来修复的。幸好,我很有先见之明地使用了 `dumpe2fs` 命令来备份了我的分区描述符信息到我的系统上。 +柱面组中的第一个块是一个超级块(superblock),它包含了元数据,定义了其它文件系统的结构并将其定位于物理硬盘的具体分区上。分区中有一些柱面组还会有备用超级块,但并不是所有的柱面组都有。我们可以使用例如 `dd` 等磁盘工具来拷贝备用超级块的内容到主超级块上,以达到修复损坏的超级块的目的。虽然这种情况不会经常发生,但是在几年前我的一个超级块损坏了,我就是用这种方法来修复的。幸好,我很有先见之明地使用了 `dumpe2fs` 命令来备份了我的系统上的分区描述符信息。 以下是 `dumpe2fs` 命令的一部分输出。这部分输出主要是超级块上包含的一些元数据,同时也是文件系统上的前两个柱面组的数据。 @@ -139,23 +138,23 @@ Group 3: (Blocks 98304-131071) <截断> ``` -每一个柱面组都有自己的 inode 位图,用于判定该柱面组中的哪些 inode 是使用中的而哪些又是未被使用的。每一个柱面组的 inode 都有它们自己的空间。每一个 inode 都包含了对应的文件的相关信息,包括其位于该文件的数据块中的位置。这个块位图纪录了文件系统中的使用中和非使用中的数据块。请注意,在上面的输出中有大量关于文件系统的数据。在非常大的文件系统上,组数据可以运行到数百页的长度。 组元数据包括组中所有空闲数据块的列表。 +每一个柱面组都有自己的 inode 位图,用于判定该柱面组中的哪些 inode 是使用中的而哪些又是未被使用的。每一个柱面组的 inode 都有它们自己的空间。每一个 inode 都包含了一个文件的相关信息,包括属于该文件的数据块的位置。而块位图纪录了文件系统中的使用中和非使用中的数据块。请注意,在上面的输出中有大量关于文件系统的数据。在非常大的文件系统上,柱面组的数据可以多达数百页的长度。柱面组的元数据包括组中所有空闲数据块的列表。 EXT 文件系统实现了数据分配策略以确保产生最少的文件碎片。减少文件碎片可以提高文件系统的性能。这些策略会在下面的 EXT4 中描述到。 -我所遇见的关于 EXT2 文件系统最大的问题是 `fsck` (文件系统检查) 程序这一环节占用了很长一段时间来定位和校准文件系统中的所有的不一致性,从而导致一次系统崩溃(crash)后其会花费了数个小时来修复。有一次我的其中一台电脑在崩溃后重新启动时共花费了 28 个小时恢复磁盘,并且是在磁盘被检测量只有几百兆字节大小的情况下。 +我所遇见的关于 EXT2 文件系统最大的问题是 `fsck` (文件系统检查) 程序这一环节占用了很长一段时间来定位和校准文件系统中的所有的不一致性,从而导致在系统崩溃(crash)后其会花费了数个小时来修复。有一次我的其中一台电脑在崩溃后重新启动时共花费了 28 个小时恢复磁盘,而且并且是在磁盘被检测量只有几百兆字节大小的情况下。 ### EXT3 -[EXT3 文件系统][25] 应一个目标而生,就是克服 `fsck` 程序需要完全恢复在文件更新操作期间发生的不正确关机而损坏的磁盘结构所需的大量时间。它对 EXT 文件系统的唯一新增功能是 [日志][26],它将提前记录将对文件系统执行的更改。 EXT3 的磁盘结构的其余部分与 EXT2 中的相同。 +[EXT3 文件系统][25]是应一个目标而生的,就是克服 `fsck` 程序需要完全恢复在文件更新操作期间发生的不正确关机而损坏的磁盘结构所需的大量时间。它对 EXT 文件系统的唯一新增功能就是 [日志][26],它将提前记录将对文件系统执行的更改。 EXT3 的磁盘结构的其余部分与 EXT2 中的相同。 -除了直接写入数据到磁盘的数据区域外,同先前的版本一样,EXT3 写入文件数据的日志随同元数据写入到磁盘上的一个指定数据区域。一旦这些数据安全地到达硬盘,它就可以几乎零丢失率地被合并或者被追加到目标文件。当这些数据被提交到磁盘上的数据区域上,这些日志就会随即更新,这样在日志中的所有数据提交之前,系统发生故障时文件系统将保持一致状态。在下次启动时,将检查文件系统的不一致性,然后将日志中保留的数据提交到磁盘的数据区,以完成对目标文件的更新。 +除了同先前的版本一样直接写入数据到磁盘的数据区域外,EXT3 上的日志会将文件数据随同元数据写入到磁盘上的一个指定数据区域。一旦这些(日志)数据安全地到达硬盘,它就可以几乎零丢失率地被合并或被追加到目标文件上。当这些数据被提交到磁盘上的数据区域上,这些日志就会随即更新,这样在日志中的所有数据提交之前,系统发生故障时文件系统将保持一致状态。在下次启动时,将检查文件系统的不一致性,然后将仍保留在日志中的数据提交到磁盘的数据区,以完成对目标文件的更新。 -日志功能确实降低了数据写入性能,但是有三个可用于日志的选项,允许用户在性能和数据完整性和安全性之间进行选择。 我的个人更偏向于选择安全性,因为我的环境不需要大量的磁盘写入活动。 +日志功能确实降低了数据写入性能,但是有三个可用于日志的选项,允许用户在性能和数据完整性、安全性之间进行选择。 我的个人更偏向于选择安全性,因为我的环境不需要大量的磁盘写入活动。 -日志功能将失败后检查硬盘驱动器所需的时间从减少了从几小时(甚至几天)减少到几分钟。 多年来,我遇到了很多导致了我的系统崩溃的问题。要详细说的话恐怕还得再写一篇文章,但这需要说明的是大多数是我自己造成的,就比如不小心踢掉一个电源插头。 幸运的是,EXT 日志文件系统将启动恢复时间缩短到两三分钟。 此外,自从我开始使用带日志记录的 EXT3,我从来没有遇到丢失数据的问题。 +日志功能将失败后检查硬盘驱动器所需的时间从几小时(甚至几天)减少到了几分钟。 多年来,我遇到了很多导致我的系统崩溃的问题。要详细说的话恐怕还得再写一篇文章,但这里需要说明的是大多数是我自己造成的,就比如不小心踢掉电源插头。 幸运的是,EXT 日志文件系统将启动恢复时间缩短到两三分钟。此外,自从我开始使用带日志记录的 EXT3,我从来没有遇到丢失数据的问题。 -EXT3 的日志功能可以关闭,然后其功能就等同于 EXT2 文件系统了。 该日志本身仍然是存在的,只是状态为空且未使用。 只需 `mount` 命令使用文件系统类型参数来重新挂载即可指定为 EXT2。 你可以从命令行执行此操作,但是具体还是取决于你正在使用的文件系统,但你可以更改 `/etc/fstab` 文件中的类型说明符,然后重新启动。 我强烈建议不要将 EXT3 文件系统安装为 EXT2 ,因为这会具有丢失数据和增加恢复时间的潜在可能性。 +EXT3 的日志功能可以关闭,然后其功能就等同于 EXT2 文件系统了。 该日志本身仍然是存在的,只是状态为空且未使用。 只需在 `mount` 命令中使用文件系统类型参数来重新挂载即可指定为 EXT2。 你可以从命令行执行此操作,但是具体还是取决于你正在使用的文件系统,不过你也可以更改 `/etc/fstab` 文件中的类型说明符,然后重新启动。 我强烈建议不要将 EXT3 文件系统挂载为 EXT2 ,因为这会有丢失数据和增加恢复时间的潜在可能性。 EXT2 文件系统可以使用如下命令来通过日志升级到 EXT3 。 @@ -163,80 +162,80 @@ EXT2 文件系统可以使用如下命令来通过日志升级到 EXT3 。 tune2fs -j /dev/sda1 ``` -`/dev/sda1` 表示驱动器和分区的标识符。同时要注意修改 `/etc/fstab` 中的文件系统类型标识符并重新挂载分区或者重启系统以确保修改生效。 +`/dev/sda1` 表示驱动器和分区的标识符。同时要注意修改 `/etc/fstab` 中的文件系统类型标识符并重新挂载分区,或者重启系统以确保修改生效。 ### EXT4 -[EXT4 文件系统][27]主要提高了性能、可靠性和容量。为了提高可靠性,它新增了元数据和日志校验和。同时为了满足各种关键任务要求,文件系统新增了纳秒级别的时间戳。在时间戳字段中添加两个高位来延缓时间戳的 [2038 年的问题][28] ,这样 EXT4 文件系统至少可达到 2446 年。 +[EXT4 文件系统][27]主要提高了性能、可靠性和容量。为了提高可靠性,它新增了元数据和日志校验和。同时为了满足各种关键任务要求,文件系统新增了纳秒级别的时间戳,并在时间戳字段中添加了两个高位来延缓时间戳的 [2038 年问题][28] ,这样 EXT4 文件系统至少可用到 2446 年。 -在 EXT4 中,数据分配从固定块更改为盘区(extent),盘区由硬盘驱动器上的开始和结束位置来描述。这使得可以在单个 inode 指针条目中描述非常长的物理上连续的文件,这可以显著减少描述大文件中所有数据的位置所需的指针数。 其它在 EXT4 中已经实施的分配策略可以进一步减少碎片化。 +在 EXT4 中,数据分配从固定块改为扩展盘区(extent)方式,扩展盘区由硬盘驱动器上的开始和结束位置来描述。这使得可以在单个 inode 指针条目中描述非常长的物理上连续的文件,这可以显著减少描述大文件中所有数据的位置所需的指针数。其它在 EXT4 中已经实施的分配策略可以进一步减少碎片化。 -EXT4 通过将新创建的文件分散在磁盘上,从而使其不会像早期的 PC 文件系统一样全部聚集在磁盘起始位置,从而减少了碎片。文件分配算法尝试在柱面组中尽可能均匀地散布文件,并且当文件需要分段存储时,要使不连续的文件盘区尽可能靠近同一文件中的其他部分,以尽可能减少磁头搜索和电机旋转等待时间。当创建新文件或扩展现有文件时,使用其它策略来预先分配额外的磁盘空间。这有助于确保扩展文件时不会自动导致其分段。新文件不会在现有文件之后立即分配空间,这也可以防止现有文件的碎片化。 +EXT4 通过将新创建的文件散布在磁盘上,使其不会像早期的 PC 文件系统一样全部聚集在磁盘起始位置,从而减少了碎片。文件分配算法尝试在柱面组中尽可能均匀地散布文件,并且当文件(由于太大)需要分段存储时,使不连续的文件扩展盘区尽可能靠近同一文件中的其他部分,以尽可能减少磁头寻道和电机旋转等待时间。当创建新文件或扩展现有文件时,使用其它策略来预先分配额外的磁盘空间。这有助于确保扩展文件时不会自动导致其分段。新文件不会紧挨这现有文件立即分配空间,这也可以防止现有文件的碎片化。 -除了磁盘上数据的实际位置外,EXT4 使用诸如延迟分配的功能策略,以允许文件系统在分配空间之前收集正在写入磁盘的所有数据。这可以提高数据空间将是连续的可能性。 +除了磁盘上数据的实际位置外,EXT4 使用诸如延迟分配的功能策略,以允许文件系统在分配空间之前收集到所有正在写入磁盘的数据,这可以提高数据空间连续的可能性。 -较旧的EXT文件系统(如 EXT2 和 EXT3)可以作为 EXT4 进行 mount ,以使其性能获得较小的提升。不幸的是,这需要关闭 EXT4 的一些重要的新功能,所以我建议不要这样做。 +较旧的 EXT 文件系统(如 EXT2 和 EXT3)可以作为 EXT4 进行 `mount` ,以使其性能获得较小的提升。但不幸的是,这需要关闭 EXT4 的一些重要的新功能,所以我建议不要这样做。 -自 Fedora 14 以来,EXT4 一直是 Fedora 的默认文件系统。我们可以使用 Fedora 文档中描述的 [procedure ][29] 将EXT3文件系统升级到EXT4,但是由于之前仍然存留d的 EXT3 元数据结构,它的性能仍将受到影响。从 EXT3 升级到 EXT4 的最佳方法是备份目标文件系统分区上的所有数据,使用 **mkfs** 命令将空EXT4文件系统写入分区,然后从备份中恢复所有数据。 +自 Fedora 14 以来,EXT4 一直是 Fedora 的默认文件系统。我们可以使用 Fedora 文档中描述的 [流程][29] 将 EXT3 文件系统升级到 EXT4,但是由于仍然存留的之前的 EXT3 元数据结构,它的性能仍将受到影响。从 EXT3 升级到 EXT4 的最佳方法是备份目标文件系统分区上的所有数据,使用 `mkfs` 命令将空 EXT4 文件系统写入分区,然后从备份中恢复所有数据。 ### Inode -以前描述的 inode 是EXT文件系统中的元数据的关键组件。 图 2 显示了 inode 和存储在硬盘驱动器上的数据之间的关系。 该图是单个文件的目录和 inode,在这种情况下,可能会产生高度碎片。 EXT 文件系统可以积极地减少碎片,所以不太可能会看到有这么多间接数据块或扩展盘的文件。 实际上,如下所示,EXT文件系统中的碎片非常低,所以大多数 inode 只使用一个或两个直接数据指针,也不使用间接指针。 +之前介绍过的 inode 是 EXT 文件系统中的元数据的关键组件。 图 2 显示了 inode 和存储在硬盘驱动器上的数据之间的关系。 该图是单个文件的目录和 inode,在这种情况下,可能会产生高度碎片化。 EXT 文件系统可以主动地减少碎片,所以不太可能会看到有这么多间接数据块或扩展盘区的文件。 实际上,你在下面将会看到,EXT 文件系统中的碎片非常低,所以大多数 inode 只使用一个或两个直接数据指针,而不使用间接指针。 ![inodesanddataallocation-01_0.png](https://opensource.com/sites/default/files/images/life-uploads/inodesanddataallocation-01_0.png) -图 2 :inode 存储有关每个文件的信息,并使 EXT 文件系统能够查找属于它的所有数据。 +*图 2 :inode 存储有关每个文件的信息,并使 EXT 文件系统能够查找属于它的所有数据。* -inode 不包含文件的名称。通过目录条目访问文件,目录条目本身是文件的名称,并包含指向 inode 的指针。该指针的值是 inode 号。文件系统中的每个 inode 都具有唯一的 ID 号,但同一台计算机上的其他文件系统(甚至相同的硬盘驱动器)中的 inode 可以具有相同的 inode 号。这对[links][30] 存在影响,但是这个讨论超出了本文的范围。 +inode 不包含文件的名称。通过目录项访问文件,目录项本身就是文件的名称,并包含指向 inode 的指针。该指针的值是 inode 号。文件系统中的每个 inode 都具有唯一的 ID 号,但同一台计算机上的其它文件系统(甚至是相同的硬盘驱动器)中的 inode 可以具有相同的 inode 号。这对 [硬链接][30] 存在影响,但是这个讨论超出了本文的范围。 -inod e包含有关该文件的元数据,包括其类型和权限以及其大小。 inode 还包含 15 个指针的空格,用于描述柱面组数据部分中数据块或扩展区的位置和长度。十二个指针提供对数据扩展区的直接访问,并且应该足以处理大多数文件。然而,对于具有重大分段的文件,有必要以间接节点的形式具有一些附加功能。从技术上讲,这些不是真正的节点,所以我在这里使用这个术语“节点”来方便。 +inode 包含有关该文件的元数据,包括其类型和权限以及其大小。 inode 还包含 15 个指针的空位,用于描述柱面组数据部分中数据块或扩展盘区的位置和长度。12 个指针提供对数据扩展盘区的直接访问,应该足以满足大多数文件的需求。然而,对于具有明显分段的文件,需要以间接节点(node)的形式提供一些额外的容量——从技术上讲,这些不是真正的“inode”,所以为了方便起见我在这里使用这个术语“节点(node)”。 -间接节点是文件系统中的正常数据块,它仅用于描述数据而不用于存储元数据,因此可以支持超过 15 个条目。例如,4K 的块大小可以支持 512 个 4 字节间接节点,允许单个文件的 **12(直接)+ 512(间接)= 524** 范围。还支持双重和三重间接节点支持,但我们大多数人不太可能遇到需要许多扩展的文件。 +间接节点是文件系统中的正常数据块,它仅用于描述数据而不用于存储元数据,因此可以支持超过 15 个条目。例如,4K 的块大小可以支持 512 个 4 字节的间接节点,允许单个文件有 **12(直接)+ 512(间接)= 524** 个扩展盘区。还支持双重和三重间接节点,但我们大多数人不太可能遇到需要那么多扩展盘区的文件。 ### 数据碎片 -对于许多较旧的 PC 文件系统,如 FAT(及其所有变体)和 NTFS,碎片一直是导致磁盘性能下降的重大问题。 碎片整理对于其本身和一些专门的整理软件来说已经称为了一项专门的工程,其效果范围从非常有效到仅仅是微乎其微。 +对于许多较旧的 PC 文件系统,如 FAT(及其所有变体)和 NTFS,碎片一直是导致磁盘性能下降的重大问题。 碎片整理本身就成为一个行业,有各种品牌的整理软件,其效果范围从非常有效到仅仅是微乎其微。 -Linux 的扩展文件系统使用数据分配策略,有助于最小化硬盘驱动器上的文件碎片,并在发生碎片时减少碎片的影响。 你可以使用 EXT 文件系统上的 **fsck** 命令检查文件系统的整体碎片。 以下示例检查主工作站的主目录,只有 1.5% 的碎片。 确保使用 **- n** 参数,因为它会阻止 **fsck** 对扫描文件系统采取的任何操作。 +Linux 的扩展文件系统使用数据分配策略,有助于最小化硬盘驱动器上的文件碎片,并在发生碎片时减少碎片的影响。 你可以使用 EXT 文件系统上的 `fsck` 命令检查整个文件系统的碎片。 以下示例检查我的主工作站的家目录,只有 1.5% 的碎片。 确保使用 `-n` 参数,因为它会防止 `fsck` 对扫描的文件系统采取任何操作。 ``` fsck -fn /dev/mapper/vg_01-home ``` -我曾经进行过一些理论计算,以确定磁盘碎片整理是否会导致任何明显的性能提升。 虽然我做了一些假设,我使用的磁盘性能数据来自一个新的 300GB 的西部数字硬盘驱动器,具有 2.0ms 的追踪到追踪时间。 此示例中的文件数是在计算当天文件系统中存在的实际数。 我假设有相当大量的碎片文件(约 20%)每天都会被触动。 +我曾经进行过一些理论计算,以确定磁盘碎片整理是否会产生任何明显的性能提升。 我做了一些假设条件,我使用的磁盘性能数据来自一个新的 300GB 的西部数字硬盘驱动器,具有 2.0ms 的轨到轨寻道时间。 此示例中的文件数是我在计算的当天的文件系统中存在的实际数。 我假设每天有相当大量的碎片化文件(约 20%)会被用到。 -| **Total files** | **271,794** | -|--|--| -| % fragmentation | 5.00% | -| Discontinuities | 13,590 | +| **全部文件** | **271,794** | +|---|---| +| 碎片率 % | 5.00% | +| 不连续数 | 13,590 | |   |   | -| % fragmented files touched per day | 20% (assume) | -| Number of additional seeks | 2,718 | -| Average seek time | 10.90 ms | -| Total additional seek time per day | 29.63 sec | +| % 每天用到的碎片化文件 | 20% (假设) | +| 额外寻道次数 | 2,718 | +| 平均寻道时间 | 10.90 ms | +| 每天全部的额外寻道时间 | 29.63 sec | |   | 0.49 min | |   |   | -| Track-to-track seek time | 2.00 ms | -| Total additional seek time per day | 5.44 sec | +| 轨到轨寻道时间 | 2.00 ms | +| 每天全部的额外寻道时间 | 5.44 sec | |   | 0.091 min | -表 1: 碎片对磁盘性能的理论影响 +*表 1: 碎片对磁盘性能的理论影响* -我对每天的全部追加寻道时间进行了两次计算,一次是单磁道寻道时间,这是由于EXT文件分配策略而导致大多数文件的可能性更大的情况,一个是平均搜索时间,我认为这将是一个公平的最坏情况。 +我对每天的全部的额外寻道时间进行了两次计算,一次是轨到轨寻道时间,这是由于 EXT 文件分配策略而导致大多数文件最可能的情况,一个是平均寻道时间,我假设这是一个合理的最坏情况。 -从表 1 可以看出,对绝大多数应用程序而言,碎片化对具有甚至适度性能的硬盘驱动器的现代EXT文件系统的影响将是微乎其微的。您可以将您的环境中的数字插入到您自己的类似电子表格中,以了解你对性能影响的期望。这种类型的计算不一定能够代表实际的性能,但它可以提供一些洞察碎片化及其对系统的理论影响。 +从表 1 可以看出,对绝大多数应用程序而言,碎片化甚至对性能适中的硬盘驱动器上的现代 EXT 文件系统的影响是微乎其微的。您可以将您的环境中的数字插入到您自己的类似电子表格中,以了解你对性能影响的期望。这种类型的计算不一定能够代表实际的性能,但它可以提供一些对碎片化及其对系统的理论影响的洞察。 -我的大部分分区的碎片率都在 1.5% 左右或 1.6%,我有一个分区有 3.3% 的碎片,但是这是一个大的 128GB 文件系统,具有少于100 个非常大的 ISO 映像文件; 多年来,我不得不扩张分区,因为它已经太满了。 +我的大部分分区的碎片率都在 1.5% 左右或 1.6%,我有一个分区有 3.3% 的碎片,但是这是一个大约 128GB 文件系统,具有不到 100 个非常大的 ISO 映像文件;多年来,我扩展过该分区几次,因为它已经太满了。 -这并不是说一些应用的环境不需要更多的保证,甚至更少的碎片。 EXT 文件系统可以由有经验和知识的管理员小心调整,管理员可以调整参数以抵消特定的工作负载类型。这个工作可以在文件系统创建的时候或稍后使用 **tune2fs** 命令时完成。每一次调整变化的结果应进行测试,精心的记录和分析,以确保目标环境的最佳性能。在最坏的情况下,如果性能不能提高到期望的水平,则其他文件系统类型可能更适合特定的工作负载。并记住,在单个主机系统上使用混合文件系统类型以匹配放在每个文件系统上的负载是常见的。 +这并不是说一些应用的环境并不需要更少的碎片的环境。 EXT 文件系统可以由有经验和知识的管理员小心调整,管理员可以针对特定的工作负载类型调整参数。这个工作可以在文件系统创建的时候或稍后使用 `tune2fs` 命令时完成。每一次调整变化的结果应进行测试,精心的记录和分析,以确保目标环境的最佳性能。在最坏的情况下,如果性能不能提高到期望的水平,则其他文件系统类型可能更适合特定的工作负载。并记住,在单个主机系统上混用文件系统类型以匹配每个文件系统上的不同负载是常见的。 -由于大多数 EXT 文件系统的碎片数量较少,因此无需进行碎片整理。在任何情况下,EXT 文件系统都没有安全的碎片整理工具。有几个工具允许你检查单个文件的碎片或文件系统中剩余可用空间的碎片。有一个工具,**e4defrag**,它将对剩余可用空间允许的文件,目录或文件系统进行碎片整理。顾名思义,它只适用于 EXT4 文件系统中的文件,并且它还有一其它的些限制。 +由于大多数 EXT 文件系统的碎片数量较少,因此无需进行碎片整理。目前,EXT 文件系统没有安全的碎片整理工具。有几个工具允许你检查单个文件的碎片程度或文件系统中剩余可用空间的碎片程度。有一个工具,`e4defrag`,它可以对允许使用的剩余可用空间、目录或文件系统进行碎片整理。顾名思义,它只适用于 EXT4 文件系统中的文件,并且它还有一其它的些限制。 -如果有必要在 EXT 文件系统上执行完整的碎片整理,则只有一种方法能够可靠地工作。你必须将文件系统中的所有要进行碎片整理的文件在确保在安全复制到其他位置后将其删除。如果可能,你可以增加文件系统的大小,以帮助减少将来的碎片。然后将文件复制回目标文件系统。但是其实即使这样也不能保证所有文件都被完全碎片整理。 +如果有必要在 EXT 文件系统上执行完整的碎片整理,则只有一种方法能够可靠地工作。你必须将文件系统中的所有要进行碎片整理的文件移动从而进行碎片整理,并在确保安全复制到其他位置后将其删除。如果可能,你可以增加文件系统的大小,以帮助减少将来的碎片。然后将文件复制回目标文件系统。但是其实即使这样也不能保证所有文件都被完全去碎片化。 ### 总结 -EXT 文件系统在一些 Linux 发行版本上作为默认文件系统已经超过二十多年了。它们用最少的维护代价提供了稳定性、高可用性、可靠性和其他各种表现。我尝试过一些其它的文件系统但最终都还是回归到 EXT。每一个我在工作中使用到 Linux 的地方都使用到了 EXT 文件系统,同时发现了它们适用于任何主流的负载。毫无疑问,EXT4 文件系统应该被用于大部分的 Linux 文件系统上,除非我们有明显的使用其它文件系统的理由。 +EXT 文件系统在一些 Linux 发行版本上作为默认文件系统已经超过二十多年了。它们用最少的维护代价提供了稳定性、高可用性、可靠性和性能。我尝试过一些其它的文件系统但最终都还是回归到 EXT。每一个我在工作中使用到 Linux 的地方都使用到了 EXT 文件系统,同时我发现了它们适用于任何主流负载。毫无疑问,EXT4 文件系统应该被用于大部分的 Linux 文件系统上,除非我们有明显需要使用其它文件系统的理由。 -------------------------------------------------------------------------------- @@ -249,9 +248,9 @@ David Both - David Both 是一名 Linux 于开源的贡献者,目前居住在 via: https://opensource.com/article/17/5/introduction-ext4-filesystem -作者:[David Both ][a] +作者:[David Both][a] 译者:[chenxinlong](https://github.com/chenxinlong) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From eee390b26c85d5b314376f925eab1d14872de746 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 11 Jul 2017 15:46:05 +0800 Subject: [PATCH 0657/1407] PUB:20170525 An introduction to Linux s EXT4 filesystem.md @chenxinlong https://linux.cn/article-8685-1.html --- .../20170525 An introduction to Linux s EXT4 filesystem.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170525 An introduction to Linux s EXT4 filesystem.md (100%) diff --git a/translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md b/published/20170525 An introduction to Linux s EXT4 filesystem.md similarity index 100% rename from translated/tech/20170525 An introduction to Linux s EXT4 filesystem.md rename to published/20170525 An introduction to Linux s EXT4 filesystem.md From 88dd6d54833e19ac4a219c00893b302932e620c5 Mon Sep 17 00:00:00 2001 From: stevenzdg988 Date: Tue, 11 Jul 2017 16:33:33 +0800 Subject: [PATCH 0658/1407] stevenzdg988 translating --- translated/tech/20170529 Ubuntu GamePack.md | 339 ++++++++++++++++++++ 1 file changed, 339 insertions(+) create mode 100644 translated/tech/20170529 Ubuntu GamePack.md diff --git a/translated/tech/20170529 Ubuntu GamePack.md b/translated/tech/20170529 Ubuntu GamePack.md new file mode 100644 index 0000000000..9607f442a9 --- /dev/null +++ b/translated/tech/20170529 Ubuntu GamePack.md @@ -0,0 +1,339 @@ +Ubuntu GamePack +=============== + + +A lot of people who like to use their Linux system for gaming. There seems to be no shortage of gaming systems which can supply access to games. UALinux is a Ukrainian company which promotes the use of GNU/Linux. UALinux has created a Ubuntu version to fill the gap for gaming. The Operating System (OS) is called Ubuntu GamePack and is based off of Ubuntu 16.04. + + +很大一部分 Linux 爱好者喜欢用他们的系统玩游戏。现在看起来能够可以支持游戏的游戏系统很短缺。UALinux 是一家推广使用 GNU/Linux 的乌克兰公司。UALinux 开发了一个 Ubuntu 版本填补了这一空白。把这个基于 Ubuntu 16.04 的操作系统(OS)命名为 Ubuntu GamePack . + +**Contents** + +** 内容 ** + +The list of games would be quite extensive but the company claims there is access to over 22,381 games. + +游戏现在已经相当广泛,但是游戏公司已经宣称可以访问超过22,381款游戏。 + +The GamePack includes Lutris and Steam to allow you access to the specific gaming services the distributer provides. + +GamePack 包括 Lutris 和 Steam 两部分,允许您访问分发商提供的定制游戏服务。 + +For Windows-based games there is PlayOnLinux, WINE and CrossOver so the games will run on Linux. + +对于基于 Windows 的游戏,有 PlayOnLinux,WINE 和 CrossOver 转换到 Linux 上运行。 + +For DOS games you can run the games in DosBox which is a DOS emulator for Linux. + +对于 DOS 游戏,您可以在 DosBox 中运行游戏,这是一个 Linux 的 DOS 模拟器 + +Sparky APTus Gamer is also installed to allow access to numerous gaming console emulators. The emulators include: + +Sparky APTus Gamer 被安装应用允许访问众多游戏控制模拟器。 模拟器包括: + +*   AdvanceMENU – front-end for AdvanceMAME, AdvanceMESS, MAME, MESS, xmame, Raine and other emulators + +*  AdvanceMENU - 前端包括 AdvanceMAME, AdvanceMESS, MAME, MESS, xmame, Raine 以及其他的模拟器 + +*   Atari800 - emulator for Atari 8-bit systems, XE Game System and Atari 5200 SuperSystem + +*  Atari800 - Atari 8位系统的模拟器,XE 游戏系统和 Atari 5200 超级系统 + +*   DeSmuME - Nintendo DS emulator + +*   DeSmuME - Nintendo DS 模拟器 + +*   Desura - digital distribution platform for Windows, Linux and X systems - OnLine installer + +*   Desura - 为Windows数字化分发平台,Linux 和 x 系统 - 在线安装 + +* DOSBox - DOS emulator for BeOS, Linux, Mac X, OS2, and Windows + +* DOSBox - 为系统 BeOS, Linux, Mac X, OS2, 和 Windows 定制的 DOS 模拟器 + +* DOSEMU - DOS Emulator for Linux + +* DOSEMU - 为 Linux 系统定制的 DOS 模拟器 + +* ePSXe - enhanced PSX emulator + +* ePSXe - 增强的 PSX 模拟器(仿真器) + +* FCEUX - Nintendo Entertainment System (NES), Famicom and Famicom Disk System (FDS) emulator + +* FCEUX - 任天堂娱乐系统(NES),费米康和费米康磁盘系统(FDS)模拟器(仿真器) + +* FS-UAE - Cross-platform Amiga emulator + +* FS-UAE - 跨平台多媒体(Amiga)模拟器 + +* GNOME Video Arcade - Simple MAME frontend + +* GNOME Video Arcade - 简化 MAME 前端 + +* Hatari - Atari ST, STE, TT and Falcon emulator for Linux and other systems + +* Hatari - 用于Linux和其他系统的Atari ST,STE,TT和 Falcon 模拟器(仿真器) + +* Higan - Emulator for Nintendos SNES, NES, Gameboy, Gameboy Color and Gameboy Advance + +* Higan - 任天堂 SNES,NES,Gameboy,Gameboy Color 和 Gameboy Advance 的模拟器 + +* Kega_Fusion - Sega SG/SC/SF, Master System, Game Gear, Genesis/Megadrive, SVP, Pico, SegaCD/MegaCD emulator + +* Kega_Fusion - 世嘉 SG / SC / SF,主系统,游戏机,创世纪 / 麦加驱动,SVP,Pico,SegaCD / MegaCD 模拟器(仿真器) + +* MAME - Hardware emulator which faithfully reproduces the behavior of many arcade machines + +* MAME - 不折不扣地复制许多街机行为硬件模拟器(仿真器) + +* Mednafen - Atari Lynx, GameBoy, NES, SNES, PC-FX, Sega, Sony PlayStation and other systems + +* Mednafen - Atari Lynx,GameBoy,NES,SNES,PC-FX,世嘉,索尼游戏站等系统 + +* MESS - Emulator for various consoles and computing systems + +* MESS - 各种控制台和计算系统的模拟器(仿真器) + +* Nestopia - Nintendo Entertainment System/Famicom emulator + +* Nestopia - 任天堂娱乐系统/费米康模拟器 + +* PCSX - Sony PlayStation emulator + +*   PCSX - 索尼游戏平台模拟器(仿真器) +  +*   PlayOnLinux - Front-end for Wine + +*   PlayOnLinux - 前端生成 +  +* PPSSPP - PPSSPP is an open source PSP emulator available for Windows, MacOS, Linux and Android + +* PPSSPP - PPSSPP 是适用于 Windows,MacOS,Linux 和 Android 的开源 PSP 仿真器 + +* Steam - launcher for the Steam software distribution service - OnLine installer + +* Steam - Steam 软件分发服务的启动器 - 在线安装程序 + +* Stella - Atari 2600 Emulator for SDL and the X Window System + +* Stella -用于 SDL 和 X Window 系统的 Atari 2600 仿真器 + +* VisualBoyAdvance - Full featured Game Boy Advance emulator + +* VisualBoyAdvance - 全功能 Game Boy Advance 模拟器 + +* Virtual Jaguar - Cross-platform emulator for Atari's infamous Jaguar console + +* Virtual Jaguar - 用于 Atari infamous Jaguar 控制台的跨平台模拟器 + +* Wine - Windows implementation + +*   Wine - 窗口实现 +  +* Winetricks - a POSIX shell script 'package manager' for WINE to install some Windows software easily + +*   Winetricks - POSIX shell脚本的软件包管理器,能够很容易为 WINE 安装 Windows软件 + +* Yabause - Sega Saturn emulator + +*   Yabause - 世嘉土星32位游戏机模拟器(仿真器) +  +* ZSNES - Emulator for the Super Nintendo Entertainment System + +* ZSNES - 超级任天堂娱乐系统模拟器 + +The GamePack also includes Oracle Java and Adobe Flash which is needed by quite a few games. + +GamePack还包括被相当多的游戏平台所必须的 Oracle java 和 Adobe Flash。 + +If this seems to be an OS you are interested in then read on to find out how to download it. + +如果这是一个你感兴趣的操作系统,请继续阅读,看看如何下载它。 + +**Download** +  +**下载** + + +The main place to download the OS is from UALinux. The link from UALinux is [https://ualinux.com/en/download/category/25-ubuntu-gamepack][1]. Since the link is from a foreign country it is a slow download. Another option is to download the OS from a Torrent file. If you do not have a Torrent program you may want to download ‘Transmission’. Once you have a Torrent program go to [https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-январь-2017-pc-vkn99.html][2]. The Torrent will allow you to download both the 64-bit and 32-bit ISO files. + +下载此操作系统镜像的主要是来自 UALinux 。其下载链接是: [https://ualinux.com/en/download/category/25-ubuntu-gamepack][1]。 +由于此链接来自国外,所以下载速度很慢。另一种选择是利用种子文件下载此操作系统。如果没有你想要下载的“传输”种子下载程序。你可以通过[https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-январь-2017-pc-vkn99.html][2] +此链接获得。这个种子文件下载可以下载 64 位和 32 位 的 ISO 镜像文件。 +The file sizes vary depending on the architecture you need. The 64-bit OS ISO file is 2.27 GB, while the 32-bit OS ISO file is 2.13 GB. + +文件大小取决于您需要的架构。64 位操作系统 ISO 镜像文件大小是 2.27 GB,而 32 位的操作系统 ISO 镜像文件大小是 2.13 GB. +   +Once downloaded you can use the ISO file to create a bootable DVD to install the GamePack or you can use a program like ‘USB Image Writer’ to place the ISO on a USB stick to install it. +  +如果下载了你所用的 ISO 镜像文件,你可以利 ISO 文件创建一个可启动的 DVD 安装 Gamepack 或者你可以使用 ‘USB Image Writer’把 ISO 写入到优盘,并利用此优盘安装系统。 + +The requirements are the same as Ubuntu 16.04: +  +硬件需求和 Ubuntu 16.04 保持一致: +  +* 2 GHz dual core processor or better + +*   2 GHz 双核处理器或者更高 + +*   2 GB system memory + +*   2 GB 系统内存 +  +* 25 GB of free hard drive space + +*   25 GB 的磁盘空间 + +*   Either a DVD drive or a USB port for the installer media + +*   具有 DVD 驱动器或者具备 USB 端口,以便于安装 +  +* Internet access is required for online gaming systems such as Steam + +*   在线游戏系统(如Steam)需要互联网接入。 + +It goes without saying that for gaming you definitely want to have a system with more than these ‘minimum’ requirements. More memory would be a definite plus as well as a decent video card with a fair amount of Video RAM. + +不用说,对于游戏玩家来说,肯定希望拥有比这些“最低配置”要求更高的系统配置。更多的内存将是一个有把握的选择,也应该有一款正版的显存大一点的显卡。 + +Once you have a system and the specific ISO file for the system, 32- or 64-bit OS, then you are ready to install the Operating System. + +您如果有了硬件系统和系统的特定 32位 或者 64 位 ISO 文件,那么接下来就可以安装操作系统了。 + +**Installation** +  +**安装过程** + +Once you have the ISO file on a media from which you can boot your system you are ready to continue. + +在媒体上利用 ISO 镜像文件启动了系统,您就可以准备进行下一步了。 + +Boot from the Ubuntu GamePack media and you should see a screen similar to Figure 1. + +从 Ubuntu Gamepack 介质启动,你会看到一个类似图1的屏幕。 + +![Figure 01.png](https://www.linux.org/attachments/figure-01-png.671/) + +**FIGURE 1** +**图 1** + +Once everything is loaded the installer can proceed with the installation. Figure 2 shows the next screen which allows you to specify your language and whether you want to install or try the GamePack. If you wish, you can click ‘Try Ubuntu’ to simply load it into memory and try it out without making changes to your drive. + +一旦加载完毕,安装程序就可以继续安装了。图2显示下一屏,可以定制语言,接下来是安装或者体验 Gamepack。如果你愿意,你可以点击 “Try Ubuntu” 在不改变驱动器的情况下把它加载到内存中运行。 + +![Figure 02.png](https://www.linux.org/attachments/figure-02-png.672/) + +**FIGURE 2** +**图 2** + +Once you are ready to continue select ‘Install Ubuntu’. +  +接下来继续选择 ‘Install Ubuntu’ 进行安装了。 +  +The next screen, Figure 3, allows you to specify whether to download any updates for Ubuntu while installing it. You can also choose to install Third Party software for Graphics, WiFi, Flash, MP3 and other updates. + +下一个屏幕,如图3所示,你可以在安装 Ubuntu 时指定是否下载 Ubuntu 的任何更新。您还可以选择安装第三方的软件,如:Graphics, WiFi, Flash, MP3 和其他更新。 + +Once you have made your selections, press ‘Continue’. +  +当定制好你的系统后,就可以点击“Continue”  +  +![Figure 03.png](https://www.linux.org/attachments/figure-03-png.673/) + +**FIGURE 3** +**图 3** + +Next, you must specify how the drive will be configured for use as shown in Figure 4\. If you plan on using the whole drive, then it may be easier to leave the settings as they are and click ‘Install Now’. + +接下来,您必须指定驱动器将如何配置为使用,如图4所示。如果您计划使用整个驱动器,那么可以更容易地设置,选择此驱动器即可,然后单击“Install Now”。 + +![Figure 04.png](https://www.linux.org/attachments/figure-04-png.674/) + +**FIGURE 4** +**图 4** + +As shown in Figure 5 you will be prompted to verify your selection for configuring the hard drive. If you approve the changes then click ‘Continue’. +  +接下来在图5中可以根据提示确认所选择硬件配置。如果同意以上的更改,请单击“Continue”。  +  +![Figure 05.png](https://www.linux.org/attachments/figure-05-png.675/) + +**FIGURE 5** +**图 5** + +Next you will be prompted to choose your Time Zone as shown in Figure 6\. Click ‘Continue’ once you have set your Time Zone. + +接下来,如图6所示,你将按照提示选择时区,选择完毕后点击“Continue”。 + +![Figure 06.png](https://www.linux.org/attachments/figure-06-png.676/) + +**FIGURE 6** +**图 6** + +A window will appear, Figure 7, to allow you to set the default keyboard layout. Choose the correct layout and press ‘Continue’. + +接下来,如图7所示,需要您设置默认的键盘布局。选择适合您的正确的布局后并按“Continue”。 + +![Figure 07.png](https://www.linux.org/attachments/figure-07-png.677/) + +**FIGURE 7** +**图 7** + +The last configuration screen is for you to set up a User account as shown in Figure 8\. Type in your name, computer name, User name, password and select if you need to type the password to log onto the system. You can also set to encrypt the Home Folder for this User. + +最后一个配置屏幕是为您设置一个用户帐户,如图8所示。键入您的姓名、计算机名、用户名、密码和选择您需要键入密码登录系统的方式。您还可以为该用户设置加密主目录。 + +![Figure 08.png](https://www.linux.org/attachments/figure-08-png.678/) + +**FIGURE 8** +**图 8** + +The installation should proceed now by setting up the drive as specified. Files will be copied from the boot media to the hard drive as shown in Figure 9\. Once everything is copied to the drive and set up you will be prompted to remove the Boot Media to allow the system to restart. + +安装将按定制进行设置驱动器。安装文件将从引导媒体复制到硬盘驱动器,如图9所示。所有内容复制到驱动器并设置,您将被提示移除引导媒体并允许重新启动系统。 + +![Figure 09.png](https://www.linux.org/attachments/figure-09-png.679/) + +**FIGURE 9** +**图 9** + +After the restart, if you selected to require the User to log in, then you will be given a screen like Figure 10\. Here you enter the password you specified for the User and log onto Ubuntu GamePack. + +重新启动后,您需要选择用户登录,会得到类似于图10的屏幕\\。输入指定的用户密码登录到 Ubuntu Gamepack。 + +![Figure 10.png](https://www.linux.org/attachments/figure-10-png.680/) + +**FIGURE 10** +**图 10** + +After you log onto Ubuntu GamePack you should probably try to perform any software upgrades which may be necessary. Open a Terminal and enter the following two commands: + +当你登录到 Ubuntu Gamepack 你应该尝试执行可能需要的任何软件升级。打开一个终端并输入以下两个命令: + +sudo apt-get update && sudo apt-get upgrade + +Any updates which are not installed should be installed to bring the GamePack system up-to-date. + +更新会安装 GamePack 系统定制的软件更新。 + +Now, simply look through the menu and find the games you wish to play. Open the emulators or any of the game services like Steam. + +现在,只要看看菜单,找到你想玩的游戏就行了。打开模拟器或任何游戏服务如 Steam 。 + +Hope you enjoy the GamePack and have fun! + +希望你喜欢 Gamepack 并且玩得高兴! +-------------------------------------------------------------------------------- + +via: https://www.linux.org/threads/ubuntu-gamepack.4559/ + +作者:[Jarret B ][a] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.linux.org/members/jarret-b.29858/ +[1]:https://ualinux.com/en/download/category/25-ubuntu-gamepack +[2]:https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-%D1%8F%D0%BD%D0%B2%D0%B0%D1%80%D1%8C-2017-pc-vkn99.html From f66b5b3087d44d02dbdc3543a86ec3a49322c3e6 Mon Sep 17 00:00:00 2001 From: VicYu Date: Tue, 11 Jul 2017 17:12:52 +0800 Subject: [PATCH 0659/1407] Delete 20170529 Ubuntu GamePack.md --- translated/20170529 Ubuntu GamePack.md | 350 ------------------------- 1 file changed, 350 deletions(-) delete mode 100644 translated/20170529 Ubuntu GamePack.md diff --git a/translated/20170529 Ubuntu GamePack.md b/translated/20170529 Ubuntu GamePack.md deleted file mode 100644 index fbda39385c..0000000000 --- a/translated/20170529 Ubuntu GamePack.md +++ /dev/null @@ -1,350 +0,0 @@ -Ubuntu GamePack -=============== - - -A lot of people who like to use their Linux system for gaming. There seems to be no shortage of gaming systems which can supply access to games. UALinux is a Ukrainian company which promotes the use of GNU/Linux. UALinux has created a Ubuntu version to fill the gap for gaming. The Operating System (OS) is called Ubuntu GamePack and is based off of Ubuntu 16.04. - - -很大一部分 Linux 爱好者喜欢用他们的系统玩游戏。现在看起来能够可以支持游戏的游戏系统很短缺。UALinux 是一家推广使用 GNU/Linux 的乌克兰公司。UALinux 开发了一个 Ubuntu 版本填补了这一空白。把这个基于 Ubuntu 16.04 的操作系统(OS)命名为 Ubuntu GamePack . - -**Contents** - -** 内容 ** - -The list of games would be quite extensive but the company claims there is access to over 22,381 games. - -游戏现在已经相当广泛,但是游戏公司已经宣称可以访问超过22,381款游戏。 - -The GamePack includes Lutris and Steam to allow you access to the specific gaming services the distributer provides. - -GamePack 包括 Lutris 和 Steam 两部分,允许您访问分发商提供的定制游戏服务。 - -For Windows-based games there is PlayOnLinux, WINE and CrossOver so the games will run on Linux. - -对于基于 Windows 的游戏,有 PlayOnLinux,WINE 和 CrossOver 转换到 Linux 上运行。 - -For DOS games you can run the games in DosBox which is a DOS emulator for Linux. - -对于 DOS 游戏,您可以在 DosBox 中运行游戏,这是一个 Linux 的 DOS 模拟器 - -Sparky APTus Gamer is also installed to allow access to numerous gaming console emulators. The emulators include: - -Sparky APTus Gamer 被安装应用允许访问众多游戏控制模拟器。 模拟器包括: - -*   AdvanceMENU – front-end for AdvanceMAME, AdvanceMESS, MAME, MESS, xmame, Raine and other emulators - -*  AdvanceMENU - 前端包括 AdvanceMAME, AdvanceMESS, MAME, MESS, xmame, Raine 以及其他的模拟器 - -*   Atari800 - emulator for Atari 8-bit systems, XE Game System and Atari 5200 SuperSystem - -*  Atari800 - Atari 8位系统的模拟器,XE 游戏系统和 Atari 5200 超级系统 - -*   DeSmuME - Nintendo DS emulator - -*   DeSmuME - Nintendo DS 模拟器 - -*   Desura - digital distribution platform for Windows, Linux and X systems - OnLine installer - -*   Desura - 为Windows数字化分发平台,Linux 和 x 系统 - 在线安装 - -* DOSBox - DOS emulator for BeOS, Linux, Mac X, OS2, and Windows - -* DOSBox - 为系统 BeOS, Linux, Mac X, OS2, 和 Windows 定制的 DOS 模拟器 - -* DOSEMU - DOS Emulator for Linux - -* DOSEMU - 为 Linux 系统定制的 DOS 模拟器 - -* ePSXe - enhanced PSX emulator - -* ePSXe - 增强的 PSX 模拟器(仿真器) - -* FCEUX - Nintendo Entertainment System (NES), Famicom and Famicom Disk System (FDS) emulator - -* FCEUX - 任天堂娱乐系统(NES),费米康和费米康磁盘系统(FDS)模拟器(仿真器) - -* FS-UAE - Cross-platform Amiga emulator - -* FS-UAE - 跨平台多媒体(Amiga)模拟器 - -* GNOME Video Arcade - Simple MAME frontend - -* GNOME Video Arcade - 简化 MAME 前端 - -* Hatari - Atari ST, STE, TT and Falcon emulator for Linux and other systems - -* Hatari - 用于Linux和其他系统的Atari ST,STE,TT和 Falcon 模拟器(仿真器) - -* Higan - Emulator for Nintendos SNES, NES, Gameboy, Gameboy Color and Gameboy Advance - -* Higan - 任天堂 SNES,NES,Gameboy,Gameboy Color 和 Gameboy Advance 的模拟器 - -* Kega_Fusion - Sega SG/SC/SF, Master System, Game Gear, Genesis/Megadrive, SVP, Pico, SegaCD/MegaCD emulator - -* Kega_Fusion - 世嘉 SG / SC / SF,主系统,游戏机,创世纪 / 麦加驱动,SVP,Pico,SegaCD / MegaCD 模拟器(仿真器) - -* MAME - Hardware emulator which faithfully reproduces the behavior of many arcade machines - -* MAME - 不折不扣地复制许多街机行为硬件模拟器(仿真器) - -* Mednafen - Atari Lynx, GameBoy, NES, SNES, PC-FX, Sega, Sony PlayStation and other systems - -* Mednafen - Atari Lynx,GameBoy,NES,SNES,PC-FX,世嘉,索尼游戏站等系统 - -* MESS - Emulator for various consoles and computing systems - -* MESS - 各种控制台和计算系统的模拟器(仿真器) - -* Nestopia - Nintendo Entertainment System/Famicom emulator - -* Nestopia - 任天堂娱乐系统/费米康模拟器 - -* PCSX - Sony PlayStation emulator - -*   PCSX - 索尼游戏平台模拟器(仿真器) -  -*   PlayOnLinux - Front-end for Wine - -*   PlayOnLinux - 前端生成 -  -* PPSSPP - PPSSPP is an open source PSP emulator available for Windows, MacOS, Linux and Android - -* PPSSPP - PPSSPP 是适用于 Windows,MacOS,Linux 和 Android 的开源 PSP 仿真器 - -* Steam - launcher for the Steam software distribution service - OnLine installer - -* Steam - Steam 软件分发服务的启动器 - 在线安装程序 - -* Stella - Atari 2600 Emulator for SDL and the X Window System - -* Stella -用于 SDL 和 X Window 系统的 Atari 2600 仿真器 - -* VisualBoyAdvance - Full featured Game Boy Advance emulator - -* VisualBoyAdvance - 全功能 Game Boy Advance 模拟器 - -* Virtual Jaguar - Cross-platform emulator for Atari's infamous Jaguar console - -* Virtual Jaguar - 用于 Atari infamous Jaguar 控制台的跨平台模拟器 - -* Wine - Windows implementation - -*   Wine - 窗口实现 -  -* Winetricks - a POSIX shell script 'package manager' for WINE to install some Windows software easily - -*   Winetricks - POSIX shell脚本的软件包管理器,能够很容易为 WINE 安装 Windows软件 - -* Yabause - Sega Saturn emulator - -*   Yabause - 世嘉土星32位游戏机模拟器(仿真器) -  -* ZSNES - Emulator for the Super Nintendo Entertainment System - -* ZSNES - 超级任天堂娱乐系统模拟器 - -The GamePack also includes Oracle Java and Adobe Flash which is needed by quite a few games. - -GamePack还包括被相当多的游戏平台所必须的 Oracle java 和 Adobe Flash。 - -If this seems to be an OS you are interested in then read on to find out how to download it. - -如果这是一个你感兴趣的操作系统,请继续阅读,看看如何下载它。 - -**Download** -  -**下载** - - -The main place to download the OS is from UALinux. The link from UALinux is [https://ualinux.com/en/download/category/25-ubuntu-gamepack][1]. Since the link is from a foreign country it is a slow download. Another option is to download the OS from a Torrent file. If you do not have a Torrent program you may want to download ‘Transmission’. Once you have a Torrent program go to [https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-январь-2017-pc-vkn99.html][2]. The Torrent will allow you to download both the 64-bit and 32-bit ISO files. - -下载此操作系统镜像的主要是来自 UALinux 。其下载链接是: [https://ualinux.com/en/download/category/25-ubuntu-gamepack][1]。 -由于此链接来自国外,所以下载速度很慢。另一种选择是利用种子文件下载此操作系统。如果没有你想要下载的“传输”种子下载程序。你可以通过[https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-январь-2017-pc-vkn99.html][2] -此链接获得。这个种子文件下载可以下载 64 位和 32 位 的 ISO 镜像文件。 - -The file sizes vary depending on the architecture you need. The 64-bit OS ISO file is 2.27 GB, while the 32-bit OS ISO file is 2.13 GB. - -文件大小取决于您需要的架构。64 位操作系统 ISO 镜像文件大小是 2.27 GB,而 32 位的操作系统 ISO 镜像文件大小是 2.13 GB. -   -Once downloaded you can use the ISO file to create a bootable DVD to install the GamePack or you can use a program like ‘USB Image Writer’ to place the ISO on a USB stick to install it. -  -如果下载了你所用的 ISO 镜像文件,你可以利 ISO 文件创建一个可启动的 DVD 安装 Gamepack 或者你可以使用 ‘USB Image Writer’把 ISO 写入到优盘,并利用此优盘安装系统。 - -The requirements are the same as Ubuntu 16.04: -  -硬件需求和 Ubuntu 16.04 保持一致: -  -* 2 GHz dual core processor or better - -*   2 GHz 双核处理器或者更高 - -*   2 GB system memory - -*   2 GB 系统内存 -  -* 25 GB of free hard drive space - -*   25 GB 的磁盘空间 - -*   Either a DVD drive or a USB port for the installer media - -*   具有 DVD 驱动器或者具备 USB 端口,以便于安装 -  -* Internet access is required for online gaming systems such as Steam - -*   在线游戏系统(如Steam)需要互联网接入。 - -It goes without saying that for gaming you definitely want to have a system with more than these ‘minimum’ requirements. More memory would be a definite plus as well as a decent video card with a fair amount of Video RAM. - -不用说,对于游戏玩家来说,肯定希望拥有比这些“最低配置”要求更高的系统配置。更多的内存将是一个有把握的选择,也应该有一款正版的显存大一点的显卡。 - -Once you have a system and the specific ISO file for the system, 32- or 64-bit OS, then you are ready to install the Operating System. - -您如果有了硬件系统和系统的特定 32位 或者 64 位 ISO 文件,那么接下来就可以安装操作系统了。 - -**Installation** -  -**安装过程** - -Once you have the ISO file on a media from which you can boot your system you are ready to continue. - -在媒体上利用 ISO 镜像文件启动了系统,您就可以准备进行下一步了。 - -Boot from the Ubuntu GamePack media and you should see a screen similar to Figure 1. - -从 Ubuntu Gamepack 介质启动,你会看到一个类似图1的屏幕。 - -![Figure 01.png](https://www.linux.org/attachments/figure-01-png.671/) - -**FIGURE 1** - -**图 1** - -Once everything is loaded the installer can proceed with the installation. Figure 2 shows the next screen which allows you to specify your language and whether you want to install or try the GamePack. If you wish, you can click ‘Try Ubuntu’ to simply load it into memory and try it out without making changes to your drive. - -一旦加载完毕,安装程序就可以继续安装了。图2显示下一屏,可以定制语言,接下来是安装或者体验 Gamepack。如果你愿意,你可以点击 “Try Ubuntu” 在不改变驱动器的情况下把它加载到内存中运行。 - -![Figure 02.png](https://www.linux.org/attachments/figure-02-png.672/) - -**FIGURE 2** - -**图 2** - -Once you are ready to continue select ‘Install Ubuntu’. -  -接下来继续选择 ‘Install Ubuntu’ 进行安装了。 -  -The next screen, Figure 3, allows you to specify whether to download any updates for Ubuntu while installing it. You can also choose to install Third Party software for Graphics, WiFi, Flash, MP3 and other updates. - -下一个屏幕,如图3所示,你可以在安装 Ubuntu 时指定是否下载 Ubuntu 的任何更新。您还可以选择安装第三方的软件,如:Graphics, WiFi, Flash, MP3 和其他更新。 - -Once you have made your selections, press ‘Continue’. -  -当定制好你的系统后,就可以点击“Continue”  -  -![Figure 03.png](https://www.linux.org/attachments/figure-03-png.673/) - -**FIGURE 3** - -**图 3** - -Next, you must specify how the drive will be configured for use as shown in Figure 4\. If you plan on using the whole drive, then it may be easier to leave the settings as they are and click ‘Install Now’. - -接下来,您必须指定驱动器将如何配置为使用,如图4所示。如果您计划使用整个驱动器,那么可以更容易地设置,选择此驱动器即可,然后单击“Install Now”。 - -![Figure 04.png](https://www.linux.org/attachments/figure-04-png.674/) - -**FIGURE 4** - -**图 4** - -As shown in Figure 5 you will be prompted to verify your selection for configuring the hard drive. If you approve the changes then click ‘Continue’. -  -接下来在图5中可以根据提示确认所选择硬件配置。如果同意以上的更改,请单击“Continue”。  -  -![Figure 05.png](https://www.linux.org/attachments/figure-05-png.675/) - -**FIGURE 5** - -**图 5** - -Next you will be prompted to choose your Time Zone as shown in Figure 6\. Click ‘Continue’ once you have set your Time Zone. - -接下来,如图6所示,你将按照提示选择时区,选择完毕后点击“Continue”。 - -![Figure 06.png](https://www.linux.org/attachments/figure-06-png.676/) - -**FIGURE 6** - -**图 6** - -A window will appear, Figure 7, to allow you to set the default keyboard layout. Choose the correct layout and press ‘Continue’. - -接下来,如图7所示,需要您设置默认的键盘布局。选择适合您的正确的布局后并按“Continue”。 - -![Figure 07.png](https://www.linux.org/attachments/figure-07-png.677/) - -**FIGURE 7** - -**图 7** - -The last configuration screen is for you to set up a User account as shown in Figure 8\. Type in your name, computer name, User name, password and select if you need to type the password to log onto the system. You can also set to encrypt the Home Folder for this User. - -最后一个配置屏幕是为您设置一个用户帐户,如图8所示。键入您的姓名、计算机名、用户名、密码和选择您需要键入密码登录系统的方式。您还可以为该用户设置加密主目录。 - -![Figure 08.png](https://www.linux.org/attachments/figure-08-png.678/) - -**FIGURE 8** - -**图 8** - -The installation should proceed now by setting up the drive as specified. Files will be copied from the boot media to the hard drive as shown in Figure 9\. Once everything is copied to the drive and set up you will be prompted to remove the Boot Media to allow the system to restart. - -安装将按定制进行设置驱动器。安装文件将从引导媒体复制到硬盘驱动器,如图9所示。所有内容复制到驱动器并设置,您将被提示移除引导媒体并允许重新启动系统。 - -![Figure 09.png](https://www.linux.org/attachments/figure-09-png.679/) - -**FIGURE 9** - -**图 9** - -After the restart, if you selected to require the User to log in, then you will be given a screen like Figure 10\. Here you enter the password you specified for the User and log onto Ubuntu GamePack. - -重新启动后,您需要选择用户登录,会得到类似于图10的屏幕\\。输入指定的用户密码登录到 Ubuntu Gamepack。 - -![Figure 10.png](https://www.linux.org/attachments/figure-10-png.680/) - -**FIGURE 10** - -**图 10** - -After you log onto Ubuntu GamePack you should probably try to perform any software upgrades which may be necessary. Open a Terminal and enter the following two commands: - -当你登录到 Ubuntu Gamepack 你应该尝试执行可能需要的任何软件升级。打开一个终端并输入以下两个命令: - -sudo apt-get update && sudo apt-get upgrade - -Any updates which are not installed should be installed to bring the GamePack system up-to-date. - -更新会安装 GamePack 系统定制的软件更新。 - -Now, simply look through the menu and find the games you wish to play. Open the emulators or any of the game services like Steam. - -现在,只要看看菜单,找到你想玩的游戏就行了。打开模拟器或任何游戏服务如 Steam 。 - -Hope you enjoy the GamePack and have fun! - -希望你喜欢 Gamepack 并且玩得高兴! --------------------------------------------------------------------------------- - -via: https://www.linux.org/threads/ubuntu-gamepack.4559/ - -作者:[Jarret B ][a] -译者:[stevenzdg988](https://github.com/stevenzdg988) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.linux.org/members/jarret-b.29858/ -[1]:https://ualinux.com/en/download/category/25-ubuntu-gamepack -[2]:https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-%D1%8F%D0%BD%D0%B2%D0%B0%D1%80%D1%8C-2017-pc-vkn99.html From 4e37bb7ce8bc2dab2b86a0e457afabb6b9c3b6d5 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 11 Jul 2017 18:14:35 +0800 Subject: [PATCH 0660/1407] PRF:20170529 Ubuntu GamePack.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @stevenzdg988 辛苦了。有几点小小建议: 1、翻译后不用留原来的英文 2、应该移动到 translated “对应”的子目录,即 tech 等 3、翻译后要通读一遍,这样你可以自己找到一些错误和前后不一致的地方 4、对于个别古怪和不熟悉的词汇,可以通过翻译软件和搜索引擎搜索一下,或许会有发现 最后,非常感谢你的贡献,加油! --- translated/tech/20170529 Ubuntu GamePack.md | 314 +++++--------------- 1 file changed, 70 insertions(+), 244 deletions(-) diff --git a/translated/tech/20170529 Ubuntu GamePack.md b/translated/tech/20170529 Ubuntu GamePack.md index 9607f442a9..2c700a567a 100644 --- a/translated/tech/20170529 Ubuntu GamePack.md +++ b/translated/tech/20170529 Ubuntu GamePack.md @@ -1,336 +1,162 @@ -Ubuntu GamePack +游戏版 Linux :Ubuntu GamePack =============== +很多 Linux 爱好者喜欢用他们的 Linux 系统玩游戏,看起来似乎并不需要一个可以玩游戏的操作系统。UALinux 是一家推广使用 GNU/Linux 的乌克兰公司。UALinux 开发了一个 Ubuntu 版本填补了这一空白,并把这个基于 Ubuntu 16.04 的操作系统(OS)命名为 Ubuntu GamePack . -A lot of people who like to use their Linux system for gaming. There seems to be no shortage of gaming systems which can supply access to games. UALinux is a Ukrainian company which promotes the use of GNU/Linux. UALinux has created a Ubuntu version to fill the gap for gaming. The Operating System (OS) is called Ubuntu GamePack and is based off of Ubuntu 16.04. +### 内容 +(Linux 上的)游戏现在已经相当丰富,而游戏公司宣称可以访问超过 22,381 款游戏。 -很大一部分 Linux 爱好者喜欢用他们的系统玩游戏。现在看起来能够可以支持游戏的游戏系统很短缺。UALinux 是一家推广使用 GNU/Linux 的乌克兰公司。UALinux 开发了一个 Ubuntu 版本填补了这一空白。把这个基于 Ubuntu 16.04 的操作系统(OS)命名为 Ubuntu GamePack . +这个 GamePack 包括 Lutris 和 Steam 两部分,允许您访问发行版厂商提供的特定游戏服务。 -**Contents** - -** 内容 ** - -The list of games would be quite extensive but the company claims there is access to over 22,381 games. - -游戏现在已经相当广泛,但是游戏公司已经宣称可以访问超过22,381款游戏。 - -The GamePack includes Lutris and Steam to allow you access to the specific gaming services the distributer provides. - -GamePack 包括 Lutris 和 Steam 两部分,允许您访问分发商提供的定制游戏服务。 - -For Windows-based games there is PlayOnLinux, WINE and CrossOver so the games will run on Linux. - -对于基于 Windows 的游戏,有 PlayOnLinux,WINE 和 CrossOver 转换到 Linux 上运行。 - -For DOS games you can run the games in DosBox which is a DOS emulator for Linux. +对于基于 Windows 的游戏,可以用 PlayOnLinux,WINE 和 CrossOver 转换到 Linux 上运行。 对于 DOS 游戏,您可以在 DosBox 中运行游戏,这是一个 Linux 的 DOS 模拟器 -Sparky APTus Gamer is also installed to allow access to numerous gaming console emulators. The emulators include: - -Sparky APTus Gamer 被安装应用允许访问众多游戏控制模拟器。 模拟器包括: - -*   AdvanceMENU – front-end for AdvanceMAME, AdvanceMESS, MAME, MESS, xmame, Raine and other emulators - -*  AdvanceMENU - 前端包括 AdvanceMAME, AdvanceMESS, MAME, MESS, xmame, Raine 以及其他的模拟器 - -*   Atari800 - emulator for Atari 8-bit systems, XE Game System and Atari 5200 SuperSystem - -*  Atari800 - Atari 8位系统的模拟器,XE 游戏系统和 Atari 5200 超级系统 - -*   DeSmuME - Nintendo DS emulator - -*   DeSmuME - Nintendo DS 模拟器 - -*   Desura - digital distribution platform for Windows, Linux and X systems - OnLine installer - -*   Desura - 为Windows数字化分发平台,Linux 和 x 系统 - 在线安装 - -* DOSBox - DOS emulator for BeOS, Linux, Mac X, OS2, and Windows - -* DOSBox - 为系统 BeOS, Linux, Mac X, OS2, 和 Windows 定制的 DOS 模拟器 - -* DOSEMU - DOS Emulator for Linux - -* DOSEMU - 为 Linux 系统定制的 DOS 模拟器 - -* ePSXe - enhanced PSX emulator - -* ePSXe - 增强的 PSX 模拟器(仿真器) - -* FCEUX - Nintendo Entertainment System (NES), Famicom and Famicom Disk System (FDS) emulator - -* FCEUX - 任天堂娱乐系统(NES),费米康和费米康磁盘系统(FDS)模拟器(仿真器) - -* FS-UAE - Cross-platform Amiga emulator - -* FS-UAE - 跨平台多媒体(Amiga)模拟器 - -* GNOME Video Arcade - Simple MAME frontend - -* GNOME Video Arcade - 简化 MAME 前端 - -* Hatari - Atari ST, STE, TT and Falcon emulator for Linux and other systems - -* Hatari - 用于Linux和其他系统的Atari ST,STE,TT和 Falcon 模拟器(仿真器) - -* Higan - Emulator for Nintendos SNES, NES, Gameboy, Gameboy Color and Gameboy Advance - -* Higan - 任天堂 SNES,NES,Gameboy,Gameboy Color 和 Gameboy Advance 的模拟器 - -* Kega_Fusion - Sega SG/SC/SF, Master System, Game Gear, Genesis/Megadrive, SVP, Pico, SegaCD/MegaCD emulator - -* Kega_Fusion - 世嘉 SG / SC / SF,主系统,游戏机,创世纪 / 麦加驱动,SVP,Pico,SegaCD / MegaCD 模拟器(仿真器) - -* MAME - Hardware emulator which faithfully reproduces the behavior of many arcade machines - -* MAME - 不折不扣地复制许多街机行为硬件模拟器(仿真器) - -* Mednafen - Atari Lynx, GameBoy, NES, SNES, PC-FX, Sega, Sony PlayStation and other systems - -* Mednafen - Atari Lynx,GameBoy,NES,SNES,PC-FX,世嘉,索尼游戏站等系统 - -* MESS - Emulator for various consoles and computing systems - -* MESS - 各种控制台和计算系统的模拟器(仿真器) - -* Nestopia - Nintendo Entertainment System/Famicom emulator - -* Nestopia - 任天堂娱乐系统/费米康模拟器 - -* PCSX - Sony PlayStation emulator - -*   PCSX - 索尼游戏平台模拟器(仿真器) -  -*   PlayOnLinux - Front-end for Wine - -*   PlayOnLinux - 前端生成 -  -* PPSSPP - PPSSPP is an open source PSP emulator available for Windows, MacOS, Linux and Android - -* PPSSPP - PPSSPP 是适用于 Windows,MacOS,Linux 和 Android 的开源 PSP 仿真器 - -* Steam - launcher for the Steam software distribution service - OnLine installer +也安装了 Sparky APTus Gamer ,可以访问众多主机游戏模拟器。 模拟器包括: +*  AdvanceMENU - AdvanceMAME、 AdvanceMESS、 MAME、 MESS、 xmame、 Raine 以及其他的模拟器的前端 +*  Atari800 - Atari 8 位系统、XE 游戏系统和 Atari 5200 超级系统的模拟器 +*   DeSmuME - 任天堂 DS 模拟器 +*   Desura - 支持 Windows、Linux 和 X 系统的数字化分发平台 - 在线安装器 +* DOSBox - 支持 BeOS、Linux、Mac X、OS2 和 Windows 的 DOS 模拟器 +* DOSEMU - 支持 Linux 的 DOS 模拟器 +* ePSXe - 增强的 PSX 模拟器 +* FCEUX - 任天堂娱乐系统(NES)、红白机(Famicom)和红白机磁盘系统(FDS)模拟器(仿真器) +* FS-UAE - 跨平台的 Amiga 模拟器 +* GNOME Video Arcade - 简化的 MAME 前端 +* Hatari - 支持 Linux 和其他系统的 Atari ST、STE、TT 和 Falcon 模拟器(仿真器) +* Higan - 任天堂 SNES、NES、Gameboy、Gameboy Color 和 Gameboy Advance 的模拟器 +* Kega_Fusion - 世嘉 SG/SC/SF,主系统、Master System、 Game Gear、 Genesis/Megadrive、 SVP、 Pico、 SegaCD/MegaCD 模拟器 +* MAME - 忠实重现了许多街机效果的硬件模拟器 +* Mednafen - Atari Lynx、GameBoy、NES、SNES、PC-FX、世嘉,索尼游戏站等系统 +* MESS - 各种主机和计算机游戏的模拟器 +* Nestopia - 任天堂娱乐系统/红白机模拟器 +*   PCSX - 索尼游戏站模拟器 +*   PlayOnLinux - Wine 前端 +* PPSSPP - PPSSPP 是支持 Windows、MacOS、Linux 和 Android 的开源 PSP 仿真器 * Steam - Steam 软件分发服务的启动器 - 在线安装程序 - -* Stella - Atari 2600 Emulator for SDL and the X Window System - * Stella -用于 SDL 和 X Window 系统的 Atari 2600 仿真器 - -* VisualBoyAdvance - Full featured Game Boy Advance emulator - -* VisualBoyAdvance - 全功能 Game Boy Advance 模拟器 - -* Virtual Jaguar - Cross-platform emulator for Atari's infamous Jaguar console - -* Virtual Jaguar - 用于 Atari infamous Jaguar 控制台的跨平台模拟器 - -* Wine - Windows implementation - -*   Wine - 窗口实现 -  -* Winetricks - a POSIX shell script 'package manager' for WINE to install some Windows software easily - -*   Winetricks - POSIX shell脚本的软件包管理器,能够很容易为 WINE 安装 Windows软件 - -* Yabause - Sega Saturn emulator - -*   Yabause - 世嘉土星32位游戏机模拟器(仿真器) -  -* ZSNES - Emulator for the Super Nintendo Entertainment System - +* VisualBoyAdvance - 全功能 Game Boy Advance 的模拟器 +* Virtual Jaguar - 用于 Atari 的 infamous Jaguar 主机游戏的跨平台模拟器 +*   Wine - Windows 二进制在 Linux 中运行 +*   Winetricks - 一个用于 WINE 的 POSIX shell 脚本的软件包管理器,能够很容易安装一些 Windows软件 +*   Yabause - 世嘉土星32位游戏机模拟器 * ZSNES - 超级任天堂娱乐系统模拟器 -The GamePack also includes Oracle Java and Adobe Flash which is needed by quite a few games. - -GamePack还包括被相当多的游戏平台所必须的 Oracle java 和 Adobe Flash。 - -If this seems to be an OS you are interested in then read on to find out how to download it. +GamePack 还包括被一些游戏所必须的 Oracle java 和 Adobe Flash。 如果这是一个你感兴趣的操作系统,请继续阅读,看看如何下载它。 -**Download** -  -**下载** +### 下载 +下载此操作系统镜像的主要地方是 UALinux 。其下载链接是: [https://ualinux.com/en/download/category/25-ubuntu-gamepack][1]。由于此链接来自国外,所以下载速度很慢。另一种选择是利用种子文件下载此操作系统。如果你没有种子下载程序,你可以下载“Transmission”。有了种子下载程序后,你可以通过 [https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-январь-2017-pc-vkn99.html][2]下载。这个种子文件下载可以下载 64 位和 32 位 的 ISO 镜像文件。 -The main place to download the OS is from UALinux. The link from UALinux is [https://ualinux.com/en/download/category/25-ubuntu-gamepack][1]. Since the link is from a foreign country it is a slow download. Another option is to download the OS from a Torrent file. If you do not have a Torrent program you may want to download ‘Transmission’. Once you have a Torrent program go to [https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-январь-2017-pc-vkn99.html][2]. The Torrent will allow you to download both the 64-bit and 32-bit ISO files. - -下载此操作系统镜像的主要是来自 UALinux 。其下载链接是: [https://ualinux.com/en/download/category/25-ubuntu-gamepack][1]。 -由于此链接来自国外,所以下载速度很慢。另一种选择是利用种子文件下载此操作系统。如果没有你想要下载的“传输”种子下载程序。你可以通过[https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-январь-2017-pc-vkn99.html][2] -此链接获得。这个种子文件下载可以下载 64 位和 32 位 的 ISO 镜像文件。 -The file sizes vary depending on the architecture you need. The 64-bit OS ISO file is 2.27 GB, while the 32-bit OS ISO file is 2.13 GB. - -文件大小取决于您需要的架构。64 位操作系统 ISO 镜像文件大小是 2.27 GB,而 32 位的操作系统 ISO 镜像文件大小是 2.13 GB. +(下载的)文件大小取决于您需要的架构。64 位操作系统 ISO 镜像文件大小是 2.27 GB,而 32 位的操作系统 ISO 镜像文件大小是 2.13 GB。   -Once downloaded you can use the ISO file to create a bootable DVD to install the GamePack or you can use a program like ‘USB Image Writer’ to place the ISO on a USB stick to install it. -  -如果下载了你所用的 ISO 镜像文件,你可以利 ISO 文件创建一个可启动的 DVD 安装 Gamepack 或者你可以使用 ‘USB Image Writer’把 ISO 写入到优盘,并利用此优盘安装系统。 - -The requirements are the same as Ubuntu 16.04: +如果下载了你所用的 ISO 镜像文件,你可以利 ISO 文件创建一个可启动的 DVD 安装 GamePack ,或者你可以使用 “USB Image Writer”把 ISO 写入到优盘,并利用此优盘安装系统。   硬件需求和 Ubuntu 16.04 保持一致:   -* 2 GHz dual core processor or better - *   2 GHz 双核处理器或者更高 - -*   2 GB system memory - *   2 GB 系统内存 -  -* 25 GB of free hard drive space - *   25 GB 的磁盘空间 +*   用于安装介质的 DVD 驱动器或者 USB 端口 +*   在线游戏系统(如 Steam)需要互联网接入。 -*   Either a DVD drive or a USB port for the installer media - -*   具有 DVD 驱动器或者具备 USB 端口,以便于安装 -  -* Internet access is required for online gaming systems such as Steam - -*   在线游戏系统(如Steam)需要互联网接入。 - -It goes without saying that for gaming you definitely want to have a system with more than these ‘minimum’ requirements. More memory would be a definite plus as well as a decent video card with a fair amount of Video RAM. - -不用说,对于游戏玩家来说,肯定希望拥有比这些“最低配置”要求更高的系统配置。更多的内存将是一个有把握的选择,也应该有一款正版的显存大一点的显卡。 - -Once you have a system and the specific ISO file for the system, 32- or 64-bit OS, then you are ready to install the Operating System. +不用说,对于游戏玩家来说,肯定希望拥有比这些“最低配置”要求更高的系统配置。更多的内存将是一个有把握的选择,也应该有一款显存大一点的正统显卡。 您如果有了硬件系统和系统的特定 32位 或者 64 位 ISO 文件,那么接下来就可以安装操作系统了。 - -**Installation**   -**安装过程** - -Once you have the ISO file on a media from which you can boot your system you are ready to continue. +###安装过程 -在媒体上利用 ISO 镜像文件启动了系统,您就可以准备进行下一步了。 +当你用安装介质的 ISO 镜像文件启动了系统,您就可以准备进行下一步了。 -Boot from the Ubuntu GamePack media and you should see a screen similar to Figure 1. - -从 Ubuntu Gamepack 介质启动,你会看到一个类似图1的屏幕。 +从 Ubuntu Gamepack 介质启动,你会看到一个类似图 1 的屏幕。 ![Figure 01.png](https://www.linux.org/attachments/figure-01-png.671/) -**FIGURE 1** -**图 1** +*图 1* -Once everything is loaded the installer can proceed with the installation. Figure 2 shows the next screen which allows you to specify your language and whether you want to install or try the GamePack. If you wish, you can click ‘Try Ubuntu’ to simply load it into memory and try it out without making changes to your drive. - -一旦加载完毕,安装程序就可以继续安装了。图2显示下一屏,可以定制语言,接下来是安装或者体验 Gamepack。如果你愿意,你可以点击 “Try Ubuntu” 在不改变驱动器的情况下把它加载到内存中运行。 +一旦加载完毕,安装程序就可以继续安装了。图 2 显示下一屏,可以定制语言,接下来是安装或者体验 Gamepack。如果你愿意,你可以点击 “Try Ubuntu” 在不改变硬盘内容的情况下把它加载到内存中来试试它。 ![Figure 02.png](https://www.linux.org/attachments/figure-02-png.672/) -**FIGURE 2** -**图 2** +*图 2* -Once you are ready to continue select ‘Install Ubuntu’. -  接下来继续选择 ‘Install Ubuntu’ 进行安装了。 -  -The next screen, Figure 3, allows you to specify whether to download any updates for Ubuntu while installing it. You can also choose to install Third Party software for Graphics, WiFi, Flash, MP3 and other updates. -下一个屏幕,如图3所示,你可以在安装 Ubuntu 时指定是否下载 Ubuntu 的任何更新。您还可以选择安装第三方的软件,如:Graphics, WiFi, Flash, MP3 和其他更新。 - -Once you have made your selections, press ‘Continue’. +下一个屏幕,如图 3 所示,你可以在安装 Ubuntu 时指定是否下载 Ubuntu 的任何更新。您还可以选择安装第三方的软件,如:图形、WiFi、Flash、 MP3 和其他更新。   当定制好你的系统后,就可以点击“Continue”    ![Figure 03.png](https://www.linux.org/attachments/figure-03-png.673/) -**FIGURE 3** -**图 3** +*图 3* -Next, you must specify how the drive will be configured for use as shown in Figure 4\. If you plan on using the whole drive, then it may be easier to leave the settings as they are and click ‘Install Now’. - -接下来,您必须指定驱动器将如何配置为使用,如图4所示。如果您计划使用整个驱动器,那么可以更容易地设置,选择此驱动器即可,然后单击“Install Now”。 +接下来,您必须指定驱动器将如何配置使用,如图 4 所示。如果您计划使用整个驱动器,那么可以更容易地设置,选择此驱动器即可,然后单击“Install Now”。 ![Figure 04.png](https://www.linux.org/attachments/figure-04-png.674/) -**FIGURE 4** -**图 4** +*图 4* -As shown in Figure 5 you will be prompted to verify your selection for configuring the hard drive. If you approve the changes then click ‘Continue’. -  -接下来在图5中可以根据提示确认所选择硬件配置。如果同意以上的更改,请单击“Continue”。  +接下来在图 5 中可以根据提示确认所选择硬件配置。如果同意以上的更改,请单击“Continue”。    ![Figure 05.png](https://www.linux.org/attachments/figure-05-png.675/) -**FIGURE 5** -**图 5** +*图 5* -Next you will be prompted to choose your Time Zone as shown in Figure 6\. Click ‘Continue’ once you have set your Time Zone. - -接下来,如图6所示,你将按照提示选择时区,选择完毕后点击“Continue”。 +接下来,如图 6 所示,你将按照提示选择时区,选择完毕后点击“Continue”。 ![Figure 06.png](https://www.linux.org/attachments/figure-06-png.676/) -**FIGURE 6** -**图 6** +*图 6* -A window will appear, Figure 7, to allow you to set the default keyboard layout. Choose the correct layout and press ‘Continue’. - -接下来,如图7所示,需要您设置默认的键盘布局。选择适合您的正确的布局后并按“Continue”。 +接下来,如图 7 所示一个窗口,需要您设置默认的键盘布局。选择适合您的正确的布局后并按“Continue”。 ![Figure 07.png](https://www.linux.org/attachments/figure-07-png.677/) -**FIGURE 7** -**图 7** +*图 7* -The last configuration screen is for you to set up a User account as shown in Figure 8\. Type in your name, computer name, User name, password and select if you need to type the password to log onto the system. You can also set to encrypt the Home Folder for this User. - -最后一个配置屏幕是为您设置一个用户帐户,如图8所示。键入您的姓名、计算机名、用户名、密码和选择您需要键入密码登录系统的方式。您还可以为该用户设置加密主目录。 +最后一个配置屏幕是为您设置一个用户帐户,如图 8 所示。键入您的姓名、计算机名、用户名、密码并选择您需要键入密码登录系统的方式。您还可以为该用户设置加密主目录。 ![Figure 08.png](https://www.linux.org/attachments/figure-08-png.678/) -**FIGURE 8** -**图 8** +*图 8* -The installation should proceed now by setting up the drive as specified. Files will be copied from the boot media to the hard drive as shown in Figure 9\. Once everything is copied to the drive and set up you will be prompted to remove the Boot Media to allow the system to restart. - -安装将按定制进行设置驱动器。安装文件将从引导媒体复制到硬盘驱动器,如图9所示。所有内容复制到驱动器并设置,您将被提示移除引导媒体并允许重新启动系统。 +安装将按指定来设置驱动器。安装文件将从引导媒体复制到硬盘驱动器,如图 9 所示。所有内容复制到硬盘并设置好,您将被提示移除引导介质并允许重新启动系统。 ![Figure 09.png](https://www.linux.org/attachments/figure-09-png.679/) -**FIGURE 9** -**图 9** +*图 9* -After the restart, if you selected to require the User to log in, then you will be given a screen like Figure 10\. Here you enter the password you specified for the User and log onto Ubuntu GamePack. - -重新启动后,您需要选择用户登录,会得到类似于图10的屏幕\\。输入指定的用户密码登录到 Ubuntu Gamepack。 +重新启动后,您需要选择要求用户登录,会得到类似于图 10 的屏幕。输入指定的用户密码登录到 Ubuntu Gamepack。 ![Figure 10.png](https://www.linux.org/attachments/figure-10-png.680/) -**FIGURE 10** -**图 10** +*图 10* -After you log onto Ubuntu GamePack you should probably try to perform any software upgrades which may be necessary. Open a Terminal and enter the following two commands: - -当你登录到 Ubuntu Gamepack 你应该尝试执行可能需要的任何软件升级。打开一个终端并输入以下两个命令: +当你登录到 Ubuntu Gamepack 你应该尝试执行可能需要的软件升级。打开一个终端并输入以下两个命令: +``` sudo apt-get update && sudo apt-get upgrade +``` Any updates which are not installed should be installed to bring the GamePack system up-to-date. -更新会安装 GamePack 系统定制的软件更新。 +任何没有安装的更新都应该安装,以便 GamePack 系统保持更新。 -Now, simply look through the menu and find the games you wish to play. Open the emulators or any of the game services like Steam. - -现在,只要看看菜单,找到你想玩的游戏就行了。打开模拟器或任何游戏服务如 Steam 。 - -Hope you enjoy the GamePack and have fun! +现在,只要看看菜单,找到你想玩的游戏就行了,打开模拟器或其它像 Steam 的游戏服务 。 希望你喜欢 Gamepack 并且玩得高兴! + -------------------------------------------------------------------------------- via: https://www.linux.org/threads/ubuntu-gamepack.4559/ -作者:[Jarret B ][a] +作者:[Jarret B][a] 译者:[stevenzdg988](https://github.com/stevenzdg988) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From a79f28e3f3f3c457dc5ceb9eae5919e6c27b3550 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 11 Jul 2017 18:24:23 +0800 Subject: [PATCH 0661/1407] PUB:20170529 Ubuntu GamePack.md @stevenzdg988 https://linux.cn/article-8686-1.html --- {translated/tech => published}/20170529 Ubuntu GamePack.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170529 Ubuntu GamePack.md (100%) diff --git a/translated/tech/20170529 Ubuntu GamePack.md b/published/20170529 Ubuntu GamePack.md similarity index 100% rename from translated/tech/20170529 Ubuntu GamePack.md rename to published/20170529 Ubuntu GamePack.md From 69dbeb2f3b5392e331afe9fe313e6bfc4b3b92be Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 11 Jul 2017 22:37:54 +0800 Subject: [PATCH 0662/1407] PRF&PUB:20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md @geekpi --- ...k Clash Vulnerability CVE-2017-1000364 .md | 131 +++++++++--------- 1 file changed, 69 insertions(+), 62 deletions(-) rename {translated/tech => published}/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md (83%) diff --git a/translated/tech/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md b/published/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md similarity index 83% rename from translated/tech/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md rename to published/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md index 61ee08ca50..5c93e5c8d0 100644 --- a/translated/tech/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md +++ b/published/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md @@ -1,79 +1,54 @@ -如何修补和保护 Linux 内核堆栈冲突漏洞 CVE-2017-1000364 [ 2017.6.19 ] +如何修补和保护 Linux 内核堆栈冲突漏洞 CVE-2017-1000364 ============================================================ - [![](https://www.cyberciti.biz/media/new/category/old/linux-logo.png)][12] 在 Linux 内核中发现了一个名为 “Stack Clash” 的严重安全问题,攻击者可能会利用它来破坏内存并执行任意代码。攻击者可以利用另一个漏洞来执行任意代码并获得管理/root 帐户权限。在 Linux 中该如何解决这个问题? +在 Linux 内核中发现了一个名为 “Stack Clash” 的严重安全问题,攻击者能够利用它来破坏内存数据并执行任意代码。攻击者可以利用这个及另一个漏洞来执行任意代码并获得管理帐户(root)权限。 + +在 Linux 中该如何解决这个问题? [![the-stack-clash-on-linux-openbsd-netbsd-freebsd-solaris](https://www.cyberciti.biz/media/new/faq/2017/06/the-stack-clash-on-linux-openbsd-netbsd-freebsd-solaris.jpeg)][22] -Qualys 研究实验室在 GNU C Library(CVE-2017-1000366)的动态链接器中发现了许多问题,它们通过与 Linux 内核的堆栈冲突来允许本地特权升级。这个 bug 在 i386 和 amd64 上影响 Linux、OpenBSD、NetBSD、FreeBSD 和 Solaris。攻击者可以利用它来破坏内存并执行任意代码。 + +Qualys 研究实验室在 GNU C Library(CVE-2017-1000366)的动态链接器中发现了许多问题,它们通过与 Linux 内核内的堆栈冲突来允许本地特权升级。这个 bug 影响到了 i386 和 amd64 上的 Linux、OpenBSD、NetBSD、FreeBSD 和 Solaris。攻击者可以利用它来破坏内存数据并执行任意代码。 ### 什么是 CVE-2017-1000364 bug? -[来自 RHN][13]: +[来自 RHN][13]: -> 在用户空间二进制文件的堆栈中分配内存的方式发现了一个缺陷。如果堆(或不同的内存区域)和堆栈内存区域彼此相邻,则攻击者可以使用此缺陷跳过堆栈保护区域,从而导致进程堆栈或相邻内存区域受到控制的内存损坏,从而增加其系统权限。有一个在内核中减轻这个漏洞的方法,将堆栈保护区域大小从一页增加到 1 MiB,从而使成功利用这个功能变得困难。 +> 在用户空间二进制文件的堆栈中分配内存的方式发现了一个缺陷。如果堆(或不同的内存区域)和堆栈内存区域彼此相邻,则攻击者可以使用此缺陷跳过堆栈保护区域,从而导致进程堆栈或相邻内存区域的受控内存损坏,从而增加其系统权限。有一个在内核中减轻这个漏洞的方法,将堆栈保护区域大小从一页增加到 1 MiB,从而使成功利用这个功能变得困难。 -[As per the original research post][14]: +[据原研究文章][14]: > 计算机上运行的每个程序都使用一个称为堆栈的特殊内存区域。这个内存区域是特别的,因为当程序需要更多的堆栈内存时,它会自动增长。但是,如果它增长太多,并且与另一个内存区域太接近,程序可能会将堆栈与其他内存区域混淆。攻击者可以利用这种混乱来覆盖其他内存区域的堆栈,或者反过来。 -### 收到影响的 Linux 发行版 +### 受到影响的 Linux 发行版 1. Red Hat Enterprise Linux Server 5.x - 2. Red Hat Enterprise Linux Server 6.x - 3. Red Hat Enterprise Linux Server 7.x - 4. CentOS Linux Server 5.x - 5. CentOS Linux Server 6.x - 6. CentOS Linux Server 7.x - 7. Oracle Enterprise Linux Server 5.x - 8. Oracle Enterprise Linux Server 6.x - 9. Oracle Enterprise Linux Server 7.x - 10. Ubuntu 17.10 - 11. Ubuntu 17.04 - 12. Ubuntu 16.10 - 13. Ubuntu 16.04 LTS - 14. Ubuntu 12.04 ESM (Precise Pangolin) - 15. Debian 9 stretch - 16. Debian 8 jessie - 17. Debian 7 wheezy - 18. Debian unstable - 19. SUSE Linux Enterprise Desktop 12 SP2 - 20. SUSE Linux Enterprise High Availability 12 SP2 - 21. SUSE Linux Enterprise Live Patching 12 - 22. SUSE Linux Enterprise Module for Public Cloud 12 - 23. SUSE Linux Enterprise Build System Kit 12 SP2 - 24. SUSE Openstack Cloud Magnum Orchestration 7 - 25. SUSE Linux Enterprise Server 11 SP3-LTSS - 26. SUSE Linux Enterprise Server 11 SP4 - 27. SUSE Linux Enterprise Server 12 SP1-LTSS - 28. SUSE Linux Enterprise Server 12 SP2 - 29. SUSE Linux Enterprise Server for Raspberry Pi 12 SP2 ### 我需要重启我的电脑么? @@ -82,9 +57,13 @@ Qualys 研究实验室在 GNU C Library(CVE-2017-1000366)的动态链接器 ### 我该如何在 Linux 中修复 CVE-2017-1000364? -根据你的 Linux 发行版输入命令。你需要重启电脑。在应用补丁之前,记下你当前内核的版本: -`$ uname -a -$ uname -mrs` +根据你的 Linux 发行版来输入命令。你需要重启电脑。在应用补丁之前,记下你当前内核的版本: + +``` +$ uname -a +$ uname -mrs +``` + 示例输出: ``` @@ -93,8 +72,12 @@ Linux 4.4.0-78-generic x86_64 ### Debian 或者 Ubuntu Linux -输入下面的[ apt 命令][15]/[apt-get 命令][16]来应用更新: -`$ sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade` +输入下面的 [apt 命令][15] / [apt-get 命令][16]来应用更新: + +``` +$ sudo apt-get update && sudo apt-get upgrade && sudo apt-get dist-upgrade +``` + 示例输出: ``` @@ -182,53 +165,77 @@ Setting up linux-headers-4.9.0-3-amd64 (4.9.30-2+deb9u1) ... Processing triggers for libc-bin (2.24-11+deb9u1) ... ``` -使用[ reboot 命令][17]重启桌面/服务器: -`$ sudo reboot` +使用 [reboot 命令][17]重启桌面/服务器: + +``` +$ sudo reboot +``` ### Oracle/RHEL/CentOS/Scientific Linux -输入下面的[ yum 命令][18]: -`$ sudo yum update -$ sudo reboot` +输入下面的 [yum 命令][18]: + +``` +$ sudo yum update +$ sudo reboot +``` ### Fedora Linux 输入下面的 dnf 命令: -`$ sudo dnf update -$ sudo reboot` + +``` +$ sudo dnf update +$ sudo reboot +``` ### Suse Enterprise Linux 或者 Opensuse Linux 输入下面的 zypper 命令: -`$ sudo zypper patch -$ sudo reboot` + +``` +$ sudo zypper patch +$ sudo reboot +``` ### SUSE OpenStack Cloud 6 -`$ sudo zypper in -t patch SUSE-OpenStack-Cloud-6-2017-996=1 -$ sudo reboot` +``` +$ sudo zypper in -t patch SUSE-OpenStack-Cloud-6-2017-996=1 +$ sudo reboot +``` ### SUSE Linux Enterprise Server for SAP 12-SP1 -`$ sudo zypper in -t patch SUSE-SLE-SAP-12-SP1-2017-996=1 -$ sudo reboot` +``` +$ sudo zypper in -t patch SUSE-SLE-SAP-12-SP1-2017-996=1 +$ sudo reboot +``` ### SUSE Linux Enterprise Server 12-SP1-LTSS -`$ sudo zypper in -t patch SUSE-SLE-SERVER-12-SP1-2017-996=1 -$ sudo reboot` +``` +$ sudo zypper in -t patch SUSE-SLE-SERVER-12-SP1-2017-996=1 +$ sudo reboot +``` ### SUSE Linux Enterprise Module for Public Cloud 12 -`$ sudo zypper in -t patch SUSE-SLE-Module-Public-Cloud-12-2017-996=1 -$ sudo reboot` +``` +$ sudo zypper in -t patch SUSE-SLE-Module-Public-Cloud-12-2017-996=1 +$ sudo reboot +``` ### 验证 你需要确认你的版本号在 [reboot 命令][19]之后改变了。 -`$ uname -a + +``` +$ uname -a $ uname -r -$ uname -mrs` +$ uname -mrs +``` + 示例输出: ``` @@ -252,15 +259,15 @@ Linux 4.4.0-81-generic x86_64 Vivek Gite -作者是 nixCraft 的创始人,对于 Linux 操作系统/Unix shell脚本有经验丰富的系统管理员和培训师。他曾与全球客户及各行各业,包括IT、教育、国防和空间研究以及非营利部门合作。在 [Twitter][1]、[Facebook] [2]、[Google +] [3] 上关注他。 +作者是 nixCraft 的创始人,对于 Linux 操作系统/Unix shell脚本有经验丰富的系统管理员和培训师。他曾与全球客户及各行各业,包括 IT、教育、国防和空间研究以及非营利部门合作。在 [Twitter][1]、[Facebook] [2]、[Google +] [3] 上关注他。 -------------------------------------------------------------------------------- via: https://www.cyberciti.biz/faq/howto-patch-linux-kernel-stack-clash-vulnerability-cve-2017-1000364/ -作者:[Vivek Gite ][a] +作者:[Vivek Gite][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/) 荣誉推出 From 2308be3847f9e343f49cbb53e03863d9502cb163 Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 12 Jul 2017 09:04:05 +0800 Subject: [PATCH 0663/1407] translated --- ...te to open source when you have no time.md | 97 ------------------- ...te to open source when you have no time.md | 95 ++++++++++++++++++ 2 files changed, 95 insertions(+), 97 deletions(-) delete mode 100644 sources/tech/20170622 8 ways to contribute to open source when you have no time.md create mode 100644 translated/tech/20170622 8 ways to contribute to open source when you have no time.md diff --git a/sources/tech/20170622 8 ways to contribute to open source when you have no time.md b/sources/tech/20170622 8 ways to contribute to open source when you have no time.md deleted file mode 100644 index ca41524d02..0000000000 --- a/sources/tech/20170622 8 ways to contribute to open source when you have no time.md +++ /dev/null @@ -1,97 +0,0 @@ -translating----geekpi - -8 ways to contribute to open source when you have no time -============================================================ - -### Find the time in your busy life to give back to the projects you care about. - -![8 ways to contribute to open source when you have no time](https://opensource.com/sites/default/files/styles/image-full-size/public/images/law/LAW-patent_reform_520x292_10136657_1012_dc.png?itok=zLMswcrw "8 ways to contribute to open source when you have no time") -Image by : opensource.com - -One of the [most common reasons][3] people give for not contributing (or not contributing more) to open source is a lack of time. I get it; life is challenging, and there are so many priorities vying for your limited attention. So how can you find the time in your busy life to contribute to the open source projects you care about? - -In the interest of full disclosure, I should warn you that I was late getting this article to the editors because I couldn't find the time to work on it. Take my advice at your own risk. - -### Figure out what you care about - -The first step in contributing is to figure out what exactly you're making time for. Do you have a project of your own that you want to work on? Is there a specific project that you use that you want to help with? Do you just want to do  _something_ ? Figuring out what you're making time for will help you decide where in your life's priorities it belongs. - -### Find alternate ways to contribute - -Writing a new feature can take many hours of design, coding, and testing. It's not always easy to work on that for a few minutes, step away, and then pick up where you left off. If you never get more than 30 minutes of uninterrupted effort, you might find yourself pretty frustrated if you try to take on a big task. - -But there are other ways to contribute that might satisfy your need to give back within the time you have available. Some of them can be done in quick spurts from a smartphone, which means you can take the time you used to spend avoiding people on your commute and put it toward your open source contributions. Here's a list of some things that can be done in small chunks: - -* **Bug triage:** Do all of the bug reports have the information necessary to diagnose and resolve them? Are they properly filed (to the right area, with the right severity, etc.)? - -* **Mailing list support:** Are users or other contributors asking questions on the mailing list? Maybe you can help. - -* **Documentation patches:** Documentation can often (but not always) be worked on in smaller chunks than code. Maybe there are a few places you can fill in. Or maybe it's time to run through the docs and make sure they're still accurate. - -* **Marketing:** Talk about your project or community on social media. Write a quick blog post. Vote and comment on news aggregators. - -### Talk to your boss - -You might think you can't work on open source projects during the workday, but have you  _asked_ ? Particularly if the project somehow relates to your day job, you might be able to sell your boss on letting you make contributions while at work. Note that there may be some intellectual property issues (e.g., who owns the rights to the code you contribute during working hours), so do your research first and get the conditions in writing. - -### Set deadlines - -The best time management advice I ever received can be summarized with two rules: - -1. If it's going to get done, it has to have a deadline - -2. It's okay to change a deadline - -This article had a deadline. There's no particular time sensitivity to it, but a deadline meant that I defined when I wanted to get it done and gave the editors a sense of when it might be submitted. And yes, as I said above, I missed the deadline. You know what happened? I set a new deadline (second time's a charm!). - -If something  _is_  time-sensitive, set the deadline well ahead to give yourself some space if you need to push it back a time or two. - -### Put it on your calendar - -If you use a calendar to schedule the rest of your life, scheduling some time to work on your open source project may be the only way to get it done. How much time you schedule is up to you, but even if you block off only one hour once a week as open source time, that still gives you an hour a week of open source time. - -And here's a secret: It's okay to cancel on yourself sometimes if you need the time to do something else—or do nothing at all. - -### Reclaim unused time - -Are you bored on your commute? Are you having trouble falling asleep at night? Maybe you can use that time to contribute. Now I happen to think the "work 169 hours a week at full tilt" lifestyle is a terrible, terrible thing. That said, some nights you just can't fall asleep. Instead of lying in bed, seeing what your Twitter friends on the other side of the world are up to (which I do), maybe you can work on that contribution you've been meaning to get around to. Just don't make a habit out of forgoing sleep. - -### Stop - -Sometimes the best way to contribute is to not contribute for a little bit. You're a busy person and no matter how awesome you are, you can't avoid your physiological and psychological needs. They will catch up to you. Taking a little time to refresh yourself might improve your productivity enough that you get stuff done faster, and suddenly there's time for you to make those open source contributions you've been meaning to get around to. - -### Say "no" - -I am bad at this. So very bad. But none of us can do everything we'd like to do. Sometimes the best thing you can do to contribute is to stop contributing in the same way you have been—or not contribute at all (see above). - -Several years ago, I led the Fedora documentation team. The team's tradition was that the leader would offer to step aside at the end of each release. I had done that a time or two and nobody stepped up, so I remained in the role. But after my second or third release, I made it clear that I would not be continuing as the team lead. I still enjoyed the work, but I was working full time, in graduate school half time, and my wife was pregnant with our first child. There was no way I could consistently give the level of effort that was required, so I stepped aside. I continued to contribute, but in a less-demanding capacity. - -If you're getting to the point where you struggle to find the time to meet your obligations (self-imposed or not), then perhaps it's time to reconsider your role. This can be especially hard with a project that you founded or have made a considerable investment in. But sometimes you have to—for your own good and that of the project. - -### What else? - -How do you find time to make your contributions? Let us know in the comments. - --------------------------------------------------------------------------------- - -作者简介: - -Ben Cotton - Ben Cotton is a meteorologist by training and a high-performance computing engineer by trade. Ben works as a technical evangelist at Cycle Computing. He is a Fedora user and contributor, co-founded a local open source meetup group, and is a member of the Open Source Initiative and a supporter of Software Freedom Conservancy. Find him on Twitter (@FunnelFiasco) or at - - ----------- - -via: https://opensource.com/article/17/6/find-time-contribute - -作者:[Ben Cotton ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/bcotton -[1]:https://opensource.com/article/17/6/find-time-contribute?rate=qWRgPXlhEZchh_vXEplj6jLXd7P0QCwzxZFWYkqawCc -[2]:https://opensource.com/user/30131/feed -[3]:http://naramore.net/blog/why-people-don-t-contribute-to-os-projects-and-what-we-can-do-about-it -[4]:https://opensource.com/users/bcotton -[5]:https://opensource.com/article/17/6/find-time-contribute#comments diff --git a/translated/tech/20170622 8 ways to contribute to open source when you have no time.md b/translated/tech/20170622 8 ways to contribute to open source when you have no time.md new file mode 100644 index 0000000000..8f67d79394 --- /dev/null +++ b/translated/tech/20170622 8 ways to contribute to open source when you have no time.md @@ -0,0 +1,95 @@ +当没有时间的时候,8种为开源做贡献的方式 +============================================================ + +### 在忙碌的生活中抽出时间回馈给你关心的项目。 + +![8 ways to contribute to open source when you have no time](https://opensource.com/sites/default/files/styles/image-full-size/public/images/law/LAW-patent_reform_520x292_10136657_1012_dc.png?itok=zLMswcrw "8 ways to contribute to open source when you have no time") +图片提供: opensource.com + +人们不给开源做贡献(或不贡献更多)的[常见原因][3]之一是缺乏时间。我了解生活是有挑战性的,有这么多的优先的事情争夺你有限的注意力。那么,如何才能在忙碌的生活中为你关心的开源项目抽出时间呢? + +为了充分说明,我应该警告你,我推迟了将这篇文章给编辑,因为我抽不出时间在这上面。请自行承担风险。 + +### 找出你关心的 + +贡献的第一步是弄清楚你正在做些什么。你有想要贡献的项目吗?有没有一个你想要帮助的具体项目?你只想做_一些_事情吗?弄清楚你正在做的事情将帮助你决定你的生活中的优先事项。 + +### 找出其他的方法贡献 + +编写新功能可能需要数小时的设计、编码和测试。离开之后在几分钟之内从原来的地方重新开始并不容易。如果你没有大于 30 分钟的无中断工作并且你承担的是一个大的任务,你或许会感到沮丧。 + +但还有其他方式可以帮助满足你在空闲的时间内回馈。其中一些可以通过智能手机快速完成,这意味着人们避免在通勤上浪费时间,并将其用于开源贡献。以下是可以在小块时间中完成的一些事情列表: + +* **Bug 分类:** 所有的 bug 报告都有必要的信息来诊断和解决它们么?它们是否妥善提交(给正确的范围,正确的严重程度等)了么? + +* **邮件列表支持:** 用户或其他贡献者在邮件列表中提出问题?也许你可以帮忙。 + +* **文档修补:** 文档可以经常(但不总是)比代码用更小块的时间来处理。也许有几个地方你可以填写,或者也许是时候浏览一下文档,并确保它们仍然准确。 + +* **营销:** 在社交媒体上谈论你的项目或者社区。写一篇快速入门博文。投票并评论新闻聚合。 + +### 与你的老板交谈 + +你可能会认为在工作日你不能在开源项目上工作,但是你有_问过么_? 特别是如果这个项目以某种方式与你的日常工作相关,那你可能可以卖掉你的老板,让你可在工作时做出贡献。请注意,可能存在一些知识产权问题(例如,谁拥有你在工作时间内提供的代码的权利),因此首先做你的研究并以书面形式获得授权。 + +### 设置最后期限 + +我得到的最佳时间管理建议可以归纳为两个规则: + +1. 如果要完成,它必须有一个截止日期 + +2. 可以更改最后期限 + +这篇文章有一个最后期限。它没有特别的时间敏感性,但最后期限意味着我定义了什么时候想完成它,并给编辑者一个什么时候可以提交的感觉。是的,如上所述,我错过了最后期限。你知道发生了什么事么?我设定了一个新的期限(第二次是个魅力!)。 + +如果有些事_是_时间敏感的,如果你需要返工一两次,设置最后期限可以给你一些空间。 + +### 将它放到你的日程上 + +如果你使用日历安排你的生活,那用它安排一些时间来开展你的开源项目,可能是完成此项工作的唯一方法。你计划多少时间取决于你自己,但即使你每周只用一小时作为开源时间,这仍会给你每周一小时的开源时间。 + +这有一个秘密:有时候,如果你需要时间去做别的事情,或者什么都不做,那么可以自己取消它。 + +### 开拓未使用的时间 + +你在通勤中感到无聊吗?你晚上睡觉困难么?也许你可以利用这个时间来贡献。现在我认为“每周完全投入工作 169 个小时”的生活方式是一件非常可怕的事情。也就是说,有些夜晚你不能入睡。也许你已经意识到了可以做贡献,而不是躺在床上看看你的 Twitter 上的朋友在世界的另一边做了什么(如我做的)。就是不要养成放弃睡眠的习惯。 + +### 停止 + +有时,贡献最好的方式是一点不贡献。你是一个忙碌的人,不管你是多么的棒,你不能避免你的生理和心理需要。它们会找上你。花点时间来休息,这可以提高你的生产力,使你的工作更快,突然间你就有时间去做那些你一直想做的开源贡献了。 + +### 说“不” + +我不擅长这个,所以这很糟糕。但是没有人能做任何想做的事情。有时候,你可以做的最好的事情是停止贡献,就像以前一样,或者没有贡献(参见上文)。 + +几年前,我领导了 Fedora 文档团队。团队的传统是,在每次发布结束时, 领导会主动提出靠边站。我已经做了一两次,没有人加强,所以我保持着这个角色。但是在我的第二或第三次发布之后,我明确表示,我不会继续担任团队领导。我还是很喜欢这份工作,但我正在全职工作,在研究生一半时,我的妻子怀了我们的第一个孩子。我没有办法做到始终如一的努力,所以我退出领导了。我继续做出贡献,但是在要求较低的能力的位置中。 + +如果你正在努力抽出时间来满足你的义务(自我强加或者不是),那么也许现在是重新考虑你的角色了。你建立的可能是一个特别困难的项目或者考虑让投资进入。但有时你不得不这么做-为了你自己好以及项目本身。 + +### 其他还有什么? + +你如何找到时间作出贡献? 让我们在评论中知道。 + +-------------------------------------------------------------------------------- + +作者简介: + +Ben Cotton - Ben Cotton 是一个培训过的气象学家和一个职业的高效计算机工程师。 Ben 在 Cycle Computing 做技术传教士。他是 Fedora 用户和贡献者,合作创办当地的一个开源集会,是一名开源倡议者和软件自由机构的支持者。他的推特 (@FunnelFiasco) + + +---------- + +via: https://opensource.com/article/17/6/find-time-contribute + +作者:[Ben Cotton ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/bcotton +[1]:https://opensource.com/article/17/6/find-time-contribute?rate=qWRgPXlhEZchh_vXEplj6jLXd7P0QCwzxZFWYkqawCc +[2]:https://opensource.com/user/30131/feed +[3]:http://naramore.net/blog/why-people-don-t-contribute-to-os-projects-and-what-we-can-do-about-it +[4]:https://opensource.com/users/bcotton +[5]:https://opensource.com/article/17/6/find-time-contribute#comments From 358a186fac0a9698d5f57a07fffcfe2389bb778c Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 12 Jul 2017 09:43:51 +0800 Subject: [PATCH 0664/1407] translating --- sources/tech/20170209 Inside Real-Time Linux.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170209 Inside Real-Time Linux.md b/sources/tech/20170209 Inside Real-Time Linux.md index ddfe0812a5..b983d30c42 100644 --- a/sources/tech/20170209 Inside Real-Time Linux.md +++ b/sources/tech/20170209 Inside Real-Time Linux.md @@ -1,3 +1,5 @@ +translating---geekpi + Inside Real-Time Linux ============================================================ From 99a9f7a7a2bc0188bc15e972fed40ae3d4767dcf Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 13 Jul 2017 08:41:21 +0800 Subject: [PATCH 0665/1407] translated --- .../tech/20170209 Inside Real-Time Linux.md | 79 ------------------- .../tech/20170209 Inside Real-Time Linux.md | 77 ++++++++++++++++++ 2 files changed, 77 insertions(+), 79 deletions(-) delete mode 100644 sources/tech/20170209 Inside Real-Time Linux.md create mode 100644 translated/tech/20170209 Inside Real-Time Linux.md diff --git a/sources/tech/20170209 Inside Real-Time Linux.md b/sources/tech/20170209 Inside Real-Time Linux.md deleted file mode 100644 index b983d30c42..0000000000 --- a/sources/tech/20170209 Inside Real-Time Linux.md +++ /dev/null @@ -1,79 +0,0 @@ -translating---geekpi - -Inside Real-Time Linux -============================================================ - - - ![Jan Altenberg](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/jan-altenberg-elc.png?itok=mgQeKpEK "Jan Altenberg") - -Real-time Linux has come a long way in the past decade. Jan Altenberg of Linutronix provides an overview of the topic and offers new RTL performance benchmarks in this video from ELC Europe.[The Linux Foundation][1] - -Real-time Linux (RTL), a form of mainline Linux enabled with PREEMPT_RT, has come a long way in the past decade. Some 80 percent of the deterministic [PREEMPT_RT][3] patch is now available in the mainline kernel itself. Yet, backers of the strongest alternative to the single-kernel RTL on Linux -- the dual-kernel Xenomai -- continue to claim a vast superiority in reduced latency. In an [Embedded Linux Conference Europe][4] presentation in October, Jan Altenberg rebutted these claims while offering an overview of the real-time topic. - -Altenberg, of German embedded development firm [Linutronix][5], does not deny that dual-kernel approaches such as Xenomai and RTAI offer lower latency. However, he reveals new Linutronix benchmarks that purport to show that the differences are not as great as claimed, especially in real-world scenarios. Less controversially, he argues that RTL is much easier to develop for and maintain. - -Before we delve into the eternal Xenomai vs. RTL debate, note that in October 2015, the [Open Source Automation Development Lab][6] (OSADL) [handed control][7] of the RTL project over to The Linux Foundation, which hosts Linux.com. In addition, Linutronix is a key contributor to the RTL project and hosts its x86 maintainer. - -The advance of RTL is one of several reasons Linux has [stolen market share][8] from real-time operating systems (RTOSes) over the past decade. RTOSes appear more frequently on microcontrollers than applications processors, and it's easier to do real-time on single-purpose devices that lack advanced userland OSes such as Linux. - -Altenberg began his presentation by clearing up some common misconceptions about real-time (or realtime) deterministic kernel schemes. “Real-time is not about fast execution or performance,” Altenberg told his ELCE audience. “It’s basically about determinism and timing guarantees. Real-time gives you a guarantee that something will execute within a given time frame. You don’t want to be as fast as possible, but as fast as specified.” - -Developers tend to use real-time when a tardy response to a given execution time leads to a serious error condition, especially when it could lead to people getting hurt. That’s why real-time is still largely driven by the factory automation industry and is increasingly showing up in cars, trains, and planes. It’s not always a life-and-death situation, however -- financial services companies use RTL for high-frequency trading. - -Requirements for real-time include deterministic timing behavior, preemption, priority inheritance, and priority ceiling, said Altenberg. “The most important requirement is that a high-priority task always needs to be able to preempt a low-priority task.” - -Altenberg strongly recommended against using the term “soft real-time” to describe lightweight real-time solutions. “You can be deterministic or not, but there’s nothing in between.” - -### Dual-kernel Real-time - -Dual-kernel schemes like Xenomai and RTAI deploy a microkernel running in parallel with a separate Linux kernel, while single kernel schemes like RTL make Linux itself capable of real-time. “With dual-kernel, Linux can get some runtime when priority real-time applications aren’t running on the microkernel,” said Altenberg. “The problem is that someone needs to maintain the microkernel and support it on new hardware. This is a huge effort, and the development communities are not very big. Also, because Linux is not running directly on the hardware, you need a hardware abstraction layer (HAL). With two things to maintain, you’re usually a step behind mainline Linux development.” - -The challenge with RTL, and the reason it has taken so long to emerge, is that “to make Linux real-time you have to basically touch every file in the kernel,” said Altenberg. Yet, most of that work is already done and baked into mainline, and developers don’t need to maintain a microkernel or HAL. - -Altenberg went on to explain the differences between the RTAI and Xenomai. “With RTAI, you write a kernel module that is scheduled by a microkernel. It’s like kernel development -- really hard to get into it and hard to debug.” - -RTAI development can be further complicated because industrial customers often want to include closed source code along with GPL kernel code. “You have to decide which parts you can put into userland and which you put into the kernel with real-time approaches,” said Altenberg. - -RTAI also supports fewer hardware platforms than RTL, especially beyond x86\. The dual-kernel Xenomai, which has eclipsed RTAI as the dominant dual-kernel approach, has wider OS support than RTAI. More importantly, it offers “a proper solution for doing real-time in userspace,” said Altenberg. “To do this, they implemented the concept of skins -- an emulation layer for the APIs of different RTOSes, such as POSIX. This lets you reuse a subset of existing code from some RTOSes.” - -With Xenomai, however, you still need to maintain a separate microkernel and HAL. Limited development tools are another problem. “As with RTAI, you can’t use the standard C library,” said Altenberg. “You need special tools and libraries. Even for POSIX, you must link to the POSIX skin, which is much more complicated.” With either platform, he added, it’s hard to scale the microkernels beyond 8 to 16 CPUs to the big server clusters used in financial services. - -### Sleeping Spinlocks - -The dominant single-kernel solution is RTL, based on PREEMPT.RT, which was primarily developed by Thomas Gleixner and Ingo Molnár more than a decade ago. PREEMPT.RT reworks the kernel’s “spinlock” locking primitives to maximize the preemptible sections inside the Linux kernel. (PREEMPT.RT was originally called the Sleeping Spinlocks Patch.) - -Instead of running interrupt handlers in hard interrupt context, PREEMPT.RT runs them in kernel threads. “When an interrupt arrives, you don’t run the interrupt handler code,” said Altenberg. “You just wake up the corresponding kernel thread, which runs the handler. This has two advantages: The kernel thread becomes interruptible, and it shows up in the process list with a PID. So you can put a low priority on non-important interrupts and a higher priority on important userland tasks.” - -Because about 80 percent of PREEMPT.RT is already in mainline, any Linux developer can take advantage of PREEMPT.RT-originated kernel components such as timers, interrupt handlers, tracing infrastructure, and priority inheritance. “When they made Linux real-time, everything became preemptible, so we found a lot of race conditions and locking problems,” said Altenberg. “We fixed these and pushed them back into mainline to improve the stability of Linux in general.” - -Because RTL is primarily mainline Linux, “PREEMPT.RT is widely accepted and has a huge community,” said Altenberg. “If you write a real-time application, you don’t need to know much about PREEMPT.RT. You don’t need any special libraries or APIs, just a standard C library, a Linux driver, and POSIX app.” - -You still need to run a patch to use PREEMPT.RT, which is updated in every second Linux version. However, within two years, the remaining 20 percent of PREEMPT.RT should make it into Linux, so you “won’t need a patch.” - -Finally, Altenberg revealed the results of his Xenomai vs. RTL latency tests. “There are a lot of papers that claim that Xenomai and RTAI are way faster on latency than PREEMPT.RT,” said Altenberg. “But I figured out that most of the time PREEMPT.RT was poorly configured. So we brought in both a Xenomai expert and a PREEMPT.RT expert, and let them configure their own platforms.” - -While Xenomai performed better on most tests, and offered far less jitter, the differences were not as great as the 300 to 400 percent latency superiority claimed by some Xenomai boosters, said Altenberg. When tests were performed on userspace tasks -- which Altenberg says is the most real-world, and therefore the most important, test -- the worst-case reaction was about 90 to 95 microseconds for both Xenomai and RTL/PREEMPT.RT, he claimed. - -When they isolated a single CPU in the dual Cortex-A9 system for handling the interrupt in question, which Altenberg says is fairly common, PREEMPT.RT performed slightly better, coming in around 80 microseconds. (For more details, check out the video about 33 minutes in.) - -Altenberg acknowledges that his 12-hour test is the bare minimum, compared to OSADL’s two- to three-year tests, and that it is “not a mathematical proof.” In any case, he suggests that RTL deserves a handicap considering its easier development process. “In my opinion, it’s not fair to compare a full-featured Linux system with a microkernel,” he concluded. - --------------------------------------------------------------------------------- - -via: https://www.linux.com/news/event/open-source-summit-na/2017/2/inside-real-time-linux - -作者:[ERIC BROWN][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.linux.com/users/ericstephenbrown -[1]:https://www.linux.com/licenses/category/linux-foundation -[2]:https://www.linux.com/files/images/jan-altenberg-elcpng -[3]:https://www.linux.com/blog/intro-real-time-linux-embedded-developers -[4]:http://events.linuxfoundation.org/events/archive/2016/embedded-linux-conference-europe -[5]:https://linutronix.de/ -[6]:http://archive.linuxgizmos.com/celebrating-the-open-source-automation-development-labs-first-birthday/ -[7]:http://linuxgizmos.com/real-time-linux-shacks-up-with-the-linux-foundation/ -[8]:https://www.linux.com/news/embedded-linux-keeps-growing-amid-iot-disruption-says-study diff --git a/translated/tech/20170209 Inside Real-Time Linux.md b/translated/tech/20170209 Inside Real-Time Linux.md new file mode 100644 index 0000000000..400a48eb29 --- /dev/null +++ b/translated/tech/20170209 Inside Real-Time Linux.md @@ -0,0 +1,77 @@ +深入实时 Linux +============================================================ + + + ![Jan Altenberg](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/jan-altenberg-elc.png?itok=mgQeKpEK "Jan Altenberg") + +实时 Linux 在过去十年中已经走了很长的路。Linutronix 的 Jan Altenberg 提供了对该主题做了概述,并在 ELC Europe 的视频中提供了新的 RTL 性能基准。[Linux基金会] [1] + +实时 Linux(RTL)是一种启用 PREEMPT_RT 的主线 Linux,在过去十年中已经走了很长的路。大约 80% 的确定性 [PREEMPT_RT][3] 补丁现在可用于主线内核本身。然而, Linux 上单内核 RTL 的最强大的替代品-双内核 Xenomai-继续声称在减少延迟上有巨大的优势。在 10 月的 [欧洲嵌入式 Linux 会议][4]的演示中,Jan Altenberg 反驳了这些声明,同时对实时主题做了论述。 + +德国嵌入式开发公司 [Linutronix][5] 的 Altenberg 并不否认 Xenomai 和 RTAI 等双核方法提供较低的延迟。然而,他揭示了新的 Linutronix 基准,旨在表明差异不如所声称的那样大,特别是在现实世界中。更少争议地,他认为 RTL 更易于开发和维护。 + +在我们深入永恒的 Xenomai 对 RTL 的辩论之前,请注意,2015 年 10 月,RTL 项目的[开源自动化开发实验室][6](OSADL)[将控制权][7]转移给了管理 Linux.com 的 Linux 基金会。此外,Linutronix 是 RTL 项目的主要贡献者,并承担了 x86 的维护者。 + +RTL 的进步是过去十年中 Linux 从实时操作系统(RTOS)中[获得市场占有率][8]的几个原因之一。实时操作系统在微控制器上比应用处理器上更频繁出现,并且在缺乏高级用户级操作系统(如Linux)的单用途设备上实现实时很简单。 + +Altenberg 通过清除关于实时确定性内核方案的一些常见的误解开始他的演讲。Altenberg 告诉他的 ELCE 观众:“实时不是快速执行或性能,这基本上是决定论和定时保证。实时为你提供保证,某些内容将在给定的时间内执行。你不想要尽可能快,但是要尽块指定。” + +在给定的执行时间内的迟缓的反应会导致严重后果,特别是当它可能导致人们受到伤害时,开发人员往往会使用实时的方式。这就是为什么实时性仍然在很大程度上受到工厂自动化行业的驱动,并且越来越多地出现在汽车、火车和飞机上。然而,并不总是生死攸关的情况 - 金融服务公司使用 RTL 进行高频交易。 + +Altenberg 说:“实时需求包括确定性定时表现、抢占、优先级继承和优先级上限。最重要的要求是高优先级任务总是需要能够抢占低优先级的任务。” + +Altenberg 强烈建议不要使用术语“软实时”来描述轻量级实时解决方案。“你可以是确定性的或者不是,但两者之间什么也没有。” + +### 双内核实时 + +像 Xenomai 和 RTAI 这样的双内核方案部署了一个与单独的 Linux 内核并行运行的微内核,而像 RTL 这样的单内核方案使得 Linux 本身能够实时运行。Altenberg 说:“使用双内核,当优先级实时程序不在微内核上运行时,Linux 可以获得一些运行时间。 “问题是有人需要维护微内核并在新的硬件上支持它。这需要巨大的努力,并且它的开发社区不是很大。另外,由于 Linux 不直接在硬件上运行,所以你需要一个硬件抽象层(HAL)。有两件事要维护,你通常会落后主流内核一步。” + +Altenberg说:“RTL 的挑战以及花了这么久才出现的原因是,要使 Linux 实时,你基本要修改每个内核文件。” 然而,大部分工作已经完成并合并到主线,开发人员不需要维护一个微内核或 HAL。 + +Altenberg 继续解释了 RTAI 和 Xenomai 之间的差异。“使用 RTAI,你将编写一个由微内核调度的内核模块。这就像内核开发 - 真的很难深入,很难调试。” + +RTAI 的开发可能会更加复杂,因为工业用户通常希望包括封闭的源代码以及 GPL 内核代码。 Altenberg 说:“你必须决定哪些部分可以进入用户态,哪些部分可以通过实时的方式进入内核。” + +RTAI 还支持比 RTL 更少的硬件平台,特别是 x86 之外。双核内核 Xenomai 将 RTAI 作为主要的双内核方式,比 RTAI 具有更大的操作系统支持。更重要的是,Altenberg说:“它提供了“在用户空间中进行实时的合适解决方案。要做到这一点,他们实现了皮肤的概念 - 一个用于不同 RTOS 的 API 的仿真层,比如 POSIX。这使你可以重用一些 RTOS 中的现有代码的子集。” + +然而,使用 Xenomai,你仍然需要维护一个单独的微内核和 HAL。有限的开发工具是另一个问题。Altenberg说:“与 RTAI 一样,你不能使用标准的 C 库。你需要专门的工具和库。即使对于 POSIX 来说,你也必须链接到 POSIX 层,这更复杂。” 他补充说,任何一个平台,很难将超过 8 到 16 个 CPU 的微内核扩展到金融服务中使用的大型服务器集群。 + +### 睡眠自旋锁 + +主要的单内核解决方案是基于 PREEMPT.RT 的 RTL,它主要由 Thomas Gleixner 和 IngoMolnár 在十多年前开发。PREEMPT.RT 重新生成内核的 “spinlock” 锁定原语,以最大化 Linux 内核中的可抢占部分。(PREEMPT.RT 最初称为睡眠自旋锁补丁。) + +PREEMPT.RT 不是在硬中断环境中运行中断处理程序,而是在内核线程中运行它们。Altenberg 说:“当一个中断到达时,你不会运行中断处理程序代码。你只是唤醒相应的内核线程,它运行处理程序。这有两个优点:内核线程可以中断,并且它会显示在具有 PID 的进程列表中。所以你可以把低优先级的放在不重要的中断上,高优先级的放在重要的用户态任务上。” + +由于大约 80% 的 PREEMPT.RT 已经在主线上,任何 Linux 开发人员都可以使用 PREEMPT.RT 发起的内核组件,如定时器、中断处理程序、跟踪基础架构和优先级继承。Altenberg说:“当他们制作实时 Linux 时,一切都变得可以抢占,所以我们发现了很多竞争条件和锁定问题。我们修复了这些,并把它们推送到主线,以提高 Linux 的稳定性。” + +因为 RTL 主要在 Linux 主线上,Altenberg 说:“PREEMPT.RT 被广泛接受,拥有庞大的社区。如果你编写一个实时应用程序,你不需要知道很多关于 PREEMPT.RT 的知识。你不需要任何特殊的库或 API,只需要标准的 C 库、Linux 驱动程序和 POSIX 程序。” + +你仍然需要运行一个补丁来使用 PREEMPT.RT,它每隔两个 Linux 版本更新。然而,在两年内,剩下的 20% 的 PREEMPT.RT 应该会进入 Linux,所以你就“不再需要补丁”了。 + +最后,Altenberg 透露了他的 Xenomai 对 RTL 延迟测试的结果。Altenberg说:“有很多论文声称 Xenomai 和 RTAI 的延迟比 PREEMPT.RT 更小。但是我认为大部分时候是 PREEMPT.RT 配置不好。所以我们带来了一个 Xenomai 专家和一个 PREEMPT.RT 专家,让他们配置自己的平台。” + +Altenberg 称,虽然 Xenomai 在大多数测试中表现更好,并且有更少的抖动,但是差异不如一些 Xenomai 加速器称的高出 300% 至 400% 的延迟优势。当用户空间任务执行测试时,Altenberg 说这是最现实的、最重要的是测试,最糟糕的情况下 Xenomai和 RTL/PREEMPT.RT 都是 90 到 95 微秒的反应时间。 + +当他们在双 Cortex-A9 系统中隔离单个 CPU 来处理中断时,Altenberg 表示这相当普遍,PREEMPT.RT 执行得更好,大约80微秒。(有关详细信息,请查看大约 33 分钟的视频。) + +Altenberg 承认与 OSADL 的两到三年测试相比,他的 12 小时测试是最低标准,而且它不是一个“数学证明”。无论如何,考虑到 RTL 更简单的开发流程,它都值得一试。他总结说:“在我看来,将完整功能的 Linux 系统与微内核进行比较是不公平的。” + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/news/event/open-source-summit-na/2017/2/inside-real-time-linux + +作者:[ERIC BROWN][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.linux.com/users/ericstephenbrown +[1]:https://www.linux.com/licenses/category/linux-foundation +[2]:https://www.linux.com/files/images/jan-altenberg-elcpng +[3]:https://www.linux.com/blog/intro-real-time-linux-embedded-developers +[4]:http://events.linuxfoundation.org/events/archive/2016/embedded-linux-conference-europe +[5]:https://linutronix.de/ +[6]:http://archive.linuxgizmos.com/celebrating-the-open-source-automation-development-labs-first-birthday/ +[7]:http://linuxgizmos.com/real-time-linux-shacks-up-with-the-linux-foundation/ +[8]:https://www.linux.com/news/embedded-linux-keeps-growing-amid-iot-disruption-says-study From f1db839edaedf23a455d90f4521fe141857bca0b Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 13 Jul 2017 08:45:32 +0800 Subject: [PATCH 0666/1407] translating --- ...0616 Do you have what it takes to be a software developer.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/talk/20170616 Do you have what it takes to be a software developer.md b/sources/talk/20170616 Do you have what it takes to be a software developer.md index d93eade2f7..f97a5c6df5 100644 --- a/sources/talk/20170616 Do you have what it takes to be a software developer.md +++ b/sources/talk/20170616 Do you have what it takes to be a software developer.md @@ -1,3 +1,5 @@ +translating---geekpi + # Do you have what it takes to be a software developer? ![](https://www.linuxcareer.com/images/software_developer_skills.jpg) From a41bad73164c293458e8f5560e3ded3843ce2943 Mon Sep 17 00:00:00 2001 From: stevenzdg988 Date: Thu, 13 Jul 2017 11:06:11 +0800 Subject: [PATCH 0667/1407] stevenzdg988 translted --- translated/tech/20170529 Ubuntu GamePack.md | 339 ++++++++++++++++++++ 1 file changed, 339 insertions(+) create mode 100644 translated/tech/20170529 Ubuntu GamePack.md diff --git a/translated/tech/20170529 Ubuntu GamePack.md b/translated/tech/20170529 Ubuntu GamePack.md new file mode 100644 index 0000000000..9607f442a9 --- /dev/null +++ b/translated/tech/20170529 Ubuntu GamePack.md @@ -0,0 +1,339 @@ +Ubuntu GamePack +=============== + + +A lot of people who like to use their Linux system for gaming. There seems to be no shortage of gaming systems which can supply access to games. UALinux is a Ukrainian company which promotes the use of GNU/Linux. UALinux has created a Ubuntu version to fill the gap for gaming. The Operating System (OS) is called Ubuntu GamePack and is based off of Ubuntu 16.04. + + +很大一部分 Linux 爱好者喜欢用他们的系统玩游戏。现在看起来能够可以支持游戏的游戏系统很短缺。UALinux 是一家推广使用 GNU/Linux 的乌克兰公司。UALinux 开发了一个 Ubuntu 版本填补了这一空白。把这个基于 Ubuntu 16.04 的操作系统(OS)命名为 Ubuntu GamePack . + +**Contents** + +** 内容 ** + +The list of games would be quite extensive but the company claims there is access to over 22,381 games. + +游戏现在已经相当广泛,但是游戏公司已经宣称可以访问超过22,381款游戏。 + +The GamePack includes Lutris and Steam to allow you access to the specific gaming services the distributer provides. + +GamePack 包括 Lutris 和 Steam 两部分,允许您访问分发商提供的定制游戏服务。 + +For Windows-based games there is PlayOnLinux, WINE and CrossOver so the games will run on Linux. + +对于基于 Windows 的游戏,有 PlayOnLinux,WINE 和 CrossOver 转换到 Linux 上运行。 + +For DOS games you can run the games in DosBox which is a DOS emulator for Linux. + +对于 DOS 游戏,您可以在 DosBox 中运行游戏,这是一个 Linux 的 DOS 模拟器 + +Sparky APTus Gamer is also installed to allow access to numerous gaming console emulators. The emulators include: + +Sparky APTus Gamer 被安装应用允许访问众多游戏控制模拟器。 模拟器包括: + +*   AdvanceMENU – front-end for AdvanceMAME, AdvanceMESS, MAME, MESS, xmame, Raine and other emulators + +*  AdvanceMENU - 前端包括 AdvanceMAME, AdvanceMESS, MAME, MESS, xmame, Raine 以及其他的模拟器 + +*   Atari800 - emulator for Atari 8-bit systems, XE Game System and Atari 5200 SuperSystem + +*  Atari800 - Atari 8位系统的模拟器,XE 游戏系统和 Atari 5200 超级系统 + +*   DeSmuME - Nintendo DS emulator + +*   DeSmuME - Nintendo DS 模拟器 + +*   Desura - digital distribution platform for Windows, Linux and X systems - OnLine installer + +*   Desura - 为Windows数字化分发平台,Linux 和 x 系统 - 在线安装 + +* DOSBox - DOS emulator for BeOS, Linux, Mac X, OS2, and Windows + +* DOSBox - 为系统 BeOS, Linux, Mac X, OS2, 和 Windows 定制的 DOS 模拟器 + +* DOSEMU - DOS Emulator for Linux + +* DOSEMU - 为 Linux 系统定制的 DOS 模拟器 + +* ePSXe - enhanced PSX emulator + +* ePSXe - 增强的 PSX 模拟器(仿真器) + +* FCEUX - Nintendo Entertainment System (NES), Famicom and Famicom Disk System (FDS) emulator + +* FCEUX - 任天堂娱乐系统(NES),费米康和费米康磁盘系统(FDS)模拟器(仿真器) + +* FS-UAE - Cross-platform Amiga emulator + +* FS-UAE - 跨平台多媒体(Amiga)模拟器 + +* GNOME Video Arcade - Simple MAME frontend + +* GNOME Video Arcade - 简化 MAME 前端 + +* Hatari - Atari ST, STE, TT and Falcon emulator for Linux and other systems + +* Hatari - 用于Linux和其他系统的Atari ST,STE,TT和 Falcon 模拟器(仿真器) + +* Higan - Emulator for Nintendos SNES, NES, Gameboy, Gameboy Color and Gameboy Advance + +* Higan - 任天堂 SNES,NES,Gameboy,Gameboy Color 和 Gameboy Advance 的模拟器 + +* Kega_Fusion - Sega SG/SC/SF, Master System, Game Gear, Genesis/Megadrive, SVP, Pico, SegaCD/MegaCD emulator + +* Kega_Fusion - 世嘉 SG / SC / SF,主系统,游戏机,创世纪 / 麦加驱动,SVP,Pico,SegaCD / MegaCD 模拟器(仿真器) + +* MAME - Hardware emulator which faithfully reproduces the behavior of many arcade machines + +* MAME - 不折不扣地复制许多街机行为硬件模拟器(仿真器) + +* Mednafen - Atari Lynx, GameBoy, NES, SNES, PC-FX, Sega, Sony PlayStation and other systems + +* Mednafen - Atari Lynx,GameBoy,NES,SNES,PC-FX,世嘉,索尼游戏站等系统 + +* MESS - Emulator for various consoles and computing systems + +* MESS - 各种控制台和计算系统的模拟器(仿真器) + +* Nestopia - Nintendo Entertainment System/Famicom emulator + +* Nestopia - 任天堂娱乐系统/费米康模拟器 + +* PCSX - Sony PlayStation emulator + +*   PCSX - 索尼游戏平台模拟器(仿真器) +  +*   PlayOnLinux - Front-end for Wine + +*   PlayOnLinux - 前端生成 +  +* PPSSPP - PPSSPP is an open source PSP emulator available for Windows, MacOS, Linux and Android + +* PPSSPP - PPSSPP 是适用于 Windows,MacOS,Linux 和 Android 的开源 PSP 仿真器 + +* Steam - launcher for the Steam software distribution service - OnLine installer + +* Steam - Steam 软件分发服务的启动器 - 在线安装程序 + +* Stella - Atari 2600 Emulator for SDL and the X Window System + +* Stella -用于 SDL 和 X Window 系统的 Atari 2600 仿真器 + +* VisualBoyAdvance - Full featured Game Boy Advance emulator + +* VisualBoyAdvance - 全功能 Game Boy Advance 模拟器 + +* Virtual Jaguar - Cross-platform emulator for Atari's infamous Jaguar console + +* Virtual Jaguar - 用于 Atari infamous Jaguar 控制台的跨平台模拟器 + +* Wine - Windows implementation + +*   Wine - 窗口实现 +  +* Winetricks - a POSIX shell script 'package manager' for WINE to install some Windows software easily + +*   Winetricks - POSIX shell脚本的软件包管理器,能够很容易为 WINE 安装 Windows软件 + +* Yabause - Sega Saturn emulator + +*   Yabause - 世嘉土星32位游戏机模拟器(仿真器) +  +* ZSNES - Emulator for the Super Nintendo Entertainment System + +* ZSNES - 超级任天堂娱乐系统模拟器 + +The GamePack also includes Oracle Java and Adobe Flash which is needed by quite a few games. + +GamePack还包括被相当多的游戏平台所必须的 Oracle java 和 Adobe Flash。 + +If this seems to be an OS you are interested in then read on to find out how to download it. + +如果这是一个你感兴趣的操作系统,请继续阅读,看看如何下载它。 + +**Download** +  +**下载** + + +The main place to download the OS is from UALinux. The link from UALinux is [https://ualinux.com/en/download/category/25-ubuntu-gamepack][1]. Since the link is from a foreign country it is a slow download. Another option is to download the OS from a Torrent file. If you do not have a Torrent program you may want to download ‘Transmission’. Once you have a Torrent program go to [https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-январь-2017-pc-vkn99.html][2]. The Torrent will allow you to download both the 64-bit and 32-bit ISO files. + +下载此操作系统镜像的主要是来自 UALinux 。其下载链接是: [https://ualinux.com/en/download/category/25-ubuntu-gamepack][1]。 +由于此链接来自国外,所以下载速度很慢。另一种选择是利用种子文件下载此操作系统。如果没有你想要下载的“传输”种子下载程序。你可以通过[https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-январь-2017-pc-vkn99.html][2] +此链接获得。这个种子文件下载可以下载 64 位和 32 位 的 ISO 镜像文件。 +The file sizes vary depending on the architecture you need. The 64-bit OS ISO file is 2.27 GB, while the 32-bit OS ISO file is 2.13 GB. + +文件大小取决于您需要的架构。64 位操作系统 ISO 镜像文件大小是 2.27 GB,而 32 位的操作系统 ISO 镜像文件大小是 2.13 GB. +   +Once downloaded you can use the ISO file to create a bootable DVD to install the GamePack or you can use a program like ‘USB Image Writer’ to place the ISO on a USB stick to install it. +  +如果下载了你所用的 ISO 镜像文件,你可以利 ISO 文件创建一个可启动的 DVD 安装 Gamepack 或者你可以使用 ‘USB Image Writer’把 ISO 写入到优盘,并利用此优盘安装系统。 + +The requirements are the same as Ubuntu 16.04: +  +硬件需求和 Ubuntu 16.04 保持一致: +  +* 2 GHz dual core processor or better + +*   2 GHz 双核处理器或者更高 + +*   2 GB system memory + +*   2 GB 系统内存 +  +* 25 GB of free hard drive space + +*   25 GB 的磁盘空间 + +*   Either a DVD drive or a USB port for the installer media + +*   具有 DVD 驱动器或者具备 USB 端口,以便于安装 +  +* Internet access is required for online gaming systems such as Steam + +*   在线游戏系统(如Steam)需要互联网接入。 + +It goes without saying that for gaming you definitely want to have a system with more than these ‘minimum’ requirements. More memory would be a definite plus as well as a decent video card with a fair amount of Video RAM. + +不用说,对于游戏玩家来说,肯定希望拥有比这些“最低配置”要求更高的系统配置。更多的内存将是一个有把握的选择,也应该有一款正版的显存大一点的显卡。 + +Once you have a system and the specific ISO file for the system, 32- or 64-bit OS, then you are ready to install the Operating System. + +您如果有了硬件系统和系统的特定 32位 或者 64 位 ISO 文件,那么接下来就可以安装操作系统了。 + +**Installation** +  +**安装过程** + +Once you have the ISO file on a media from which you can boot your system you are ready to continue. + +在媒体上利用 ISO 镜像文件启动了系统,您就可以准备进行下一步了。 + +Boot from the Ubuntu GamePack media and you should see a screen similar to Figure 1. + +从 Ubuntu Gamepack 介质启动,你会看到一个类似图1的屏幕。 + +![Figure 01.png](https://www.linux.org/attachments/figure-01-png.671/) + +**FIGURE 1** +**图 1** + +Once everything is loaded the installer can proceed with the installation. Figure 2 shows the next screen which allows you to specify your language and whether you want to install or try the GamePack. If you wish, you can click ‘Try Ubuntu’ to simply load it into memory and try it out without making changes to your drive. + +一旦加载完毕,安装程序就可以继续安装了。图2显示下一屏,可以定制语言,接下来是安装或者体验 Gamepack。如果你愿意,你可以点击 “Try Ubuntu” 在不改变驱动器的情况下把它加载到内存中运行。 + +![Figure 02.png](https://www.linux.org/attachments/figure-02-png.672/) + +**FIGURE 2** +**图 2** + +Once you are ready to continue select ‘Install Ubuntu’. +  +接下来继续选择 ‘Install Ubuntu’ 进行安装了。 +  +The next screen, Figure 3, allows you to specify whether to download any updates for Ubuntu while installing it. You can also choose to install Third Party software for Graphics, WiFi, Flash, MP3 and other updates. + +下一个屏幕,如图3所示,你可以在安装 Ubuntu 时指定是否下载 Ubuntu 的任何更新。您还可以选择安装第三方的软件,如:Graphics, WiFi, Flash, MP3 和其他更新。 + +Once you have made your selections, press ‘Continue’. +  +当定制好你的系统后,就可以点击“Continue”  +  +![Figure 03.png](https://www.linux.org/attachments/figure-03-png.673/) + +**FIGURE 3** +**图 3** + +Next, you must specify how the drive will be configured for use as shown in Figure 4\. If you plan on using the whole drive, then it may be easier to leave the settings as they are and click ‘Install Now’. + +接下来,您必须指定驱动器将如何配置为使用,如图4所示。如果您计划使用整个驱动器,那么可以更容易地设置,选择此驱动器即可,然后单击“Install Now”。 + +![Figure 04.png](https://www.linux.org/attachments/figure-04-png.674/) + +**FIGURE 4** +**图 4** + +As shown in Figure 5 you will be prompted to verify your selection for configuring the hard drive. If you approve the changes then click ‘Continue’. +  +接下来在图5中可以根据提示确认所选择硬件配置。如果同意以上的更改,请单击“Continue”。  +  +![Figure 05.png](https://www.linux.org/attachments/figure-05-png.675/) + +**FIGURE 5** +**图 5** + +Next you will be prompted to choose your Time Zone as shown in Figure 6\. Click ‘Continue’ once you have set your Time Zone. + +接下来,如图6所示,你将按照提示选择时区,选择完毕后点击“Continue”。 + +![Figure 06.png](https://www.linux.org/attachments/figure-06-png.676/) + +**FIGURE 6** +**图 6** + +A window will appear, Figure 7, to allow you to set the default keyboard layout. Choose the correct layout and press ‘Continue’. + +接下来,如图7所示,需要您设置默认的键盘布局。选择适合您的正确的布局后并按“Continue”。 + +![Figure 07.png](https://www.linux.org/attachments/figure-07-png.677/) + +**FIGURE 7** +**图 7** + +The last configuration screen is for you to set up a User account as shown in Figure 8\. Type in your name, computer name, User name, password and select if you need to type the password to log onto the system. You can also set to encrypt the Home Folder for this User. + +最后一个配置屏幕是为您设置一个用户帐户,如图8所示。键入您的姓名、计算机名、用户名、密码和选择您需要键入密码登录系统的方式。您还可以为该用户设置加密主目录。 + +![Figure 08.png](https://www.linux.org/attachments/figure-08-png.678/) + +**FIGURE 8** +**图 8** + +The installation should proceed now by setting up the drive as specified. Files will be copied from the boot media to the hard drive as shown in Figure 9\. Once everything is copied to the drive and set up you will be prompted to remove the Boot Media to allow the system to restart. + +安装将按定制进行设置驱动器。安装文件将从引导媒体复制到硬盘驱动器,如图9所示。所有内容复制到驱动器并设置,您将被提示移除引导媒体并允许重新启动系统。 + +![Figure 09.png](https://www.linux.org/attachments/figure-09-png.679/) + +**FIGURE 9** +**图 9** + +After the restart, if you selected to require the User to log in, then you will be given a screen like Figure 10\. Here you enter the password you specified for the User and log onto Ubuntu GamePack. + +重新启动后,您需要选择用户登录,会得到类似于图10的屏幕\\。输入指定的用户密码登录到 Ubuntu Gamepack。 + +![Figure 10.png](https://www.linux.org/attachments/figure-10-png.680/) + +**FIGURE 10** +**图 10** + +After you log onto Ubuntu GamePack you should probably try to perform any software upgrades which may be necessary. Open a Terminal and enter the following two commands: + +当你登录到 Ubuntu Gamepack 你应该尝试执行可能需要的任何软件升级。打开一个终端并输入以下两个命令: + +sudo apt-get update && sudo apt-get upgrade + +Any updates which are not installed should be installed to bring the GamePack system up-to-date. + +更新会安装 GamePack 系统定制的软件更新。 + +Now, simply look through the menu and find the games you wish to play. Open the emulators or any of the game services like Steam. + +现在,只要看看菜单,找到你想玩的游戏就行了。打开模拟器或任何游戏服务如 Steam 。 + +Hope you enjoy the GamePack and have fun! + +希望你喜欢 Gamepack 并且玩得高兴! +-------------------------------------------------------------------------------- + +via: https://www.linux.org/threads/ubuntu-gamepack.4559/ + +作者:[Jarret B ][a] +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.linux.org/members/jarret-b.29858/ +[1]:https://ualinux.com/en/download/category/25-ubuntu-gamepack +[2]:https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-%D1%8F%D0%BD%D0%B2%D0%B0%D1%80%D1%8C-2017-pc-vkn99.html From b7a82d50fa1c4c1a5c1ef60a747f5ba053410bf5 Mon Sep 17 00:00:00 2001 From: WangYue <815420852@qq.com> Date: Thu, 13 Jul 2017 14:32:20 +0800 Subject: [PATCH 0668/1407] =?UTF-8?q?=E5=8E=9F=E8=AF=91=E6=96=87=E6=A0=BC?= =?UTF-8?q?=E5=BC=8F=E6=9C=89=E9=97=AE=E9=A2=98=E5=B7=B2=E7=BB=8F=E6=9B=B4?= =?UTF-8?q?=E6=AD=A320170426=20How=20to=20get=20started=20learning=20to=20?= =?UTF-8?q?program.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 原译文格式有问题已经更正20170426 How to get started learning to program.md --- ... How to get started learning to program.md | 313 +++++++++--------- 1 file changed, 151 insertions(+), 162 deletions(-) diff --git a/translated/talk/20170426 How to get started learning to program.md b/translated/talk/20170426 How to get started learning to program.md index 45fc37e662..989e1c82ca 100644 --- a/translated/talk/20170426 How to get started learning to program.md +++ b/translated/talk/20170426 How to get started learning to program.md @@ -1,177 +1,166 @@ - -如何开始学习编程? -====================================================== - -### 编程初学者可能都思考过这个问题,“我该怎么学编程?”这里我们提供些相关的参考指导来帮助你找到最适合自己学习情况和学习需要的方法。 - - -![Know thyself](https://opensource.com/sites/default/files/styles/image-full-size/public/u23316/roman-know-thyself-osdc-lead.png?itok=oWuH8hRr "Know thyself") - + +如何开始学习编程? +====================================================== + +### 编程初学者可能都思考过这个问题,“我该怎么学编程?”这里我们提供些相关的参考指导来帮助你找到最适合自己学习情况和学习需要的方法。 + + +![Know thyself](https://opensource.com/sites/default/files/styles/image-full-size/public/u23316/roman-know-thyself-osdc-lead.png?itok=oWuH8hRr "Know thyself") + >图片来源 : Opensource.com 修改自 [维基共享][20]里的某不知名艺术家的作品 - - -最近有很多关于学习编程的争论。不仅仅是因为与软件开发公司公开的待应聘的职位数量相比较[符合招聘要求的人远远无法满足缺口][21],编程也是[工资最高][22]和[工作满足感最强][23]的众多职业之一。也难怪越来越多的人都想进入这个行业。 - - -但是你要怎么做才能正确地入行呢?“**我应该怎么学习编程?**”是初学者常见的一个问题。尽管我没有这些问题的全部答案,但是我希望这篇文章能够给你提供相关指导来帮助你找到最适合你的需求和自身情况发展的解决办法。 - - -### 你的学习方式是什么? - -Before you start your learning process, consider not only your options, but also yourself. The ancient Greeks had a saying, [γνῶθι σεαυτόν][24] (gnothi seauton), meaning "know thyself". Undertaking a large learning program is difficult. Self awareness is necessary to make sure you are making the choices that will lead to the highest chance of success. Be honest with yourself when you answer the following questions: - - -在你开始学习编程之前,你需要考虑的不仅仅是你的方向选择,还要更多的考虑下你自己。古罗马人有句谚语,[γνῶθι σεαυτόν][24](gnothi seauton),意思是“认识你自己”。进行一个大型的编程学习难度不小。足够的自我认识是非常有必要的,这能够确保你做出的选择通向成功的机会非常大。你需要思考并诚实地回答接下来的这些问题: - - -* **你最喜欢什么样的学习方式?**怎么做你才能学到最好?是通过阅读的方式吗?还是听讲座?还是主要通过动手实践?你需要选择对你最有效的方法。不要仅仅因为这种学习方法流行或者有其他人说过这种方法对他们很有用就选择了这种方法。 -* **你的需要和要求是什么?**你为什么想学习如何编程?是因为你只是想换一份工作吗?如果是这样的话,你需要多次时间才能完成呢?你要牢记,这些是_需要的_ ,不是_想要的_ 。你可能_想要_下周就换份新工作,但是_需要_ 有人在接下来的一年里帮忙供养你的正在成长的家庭。当你在人生的道路上面临方向的抉择时,时间的安排特别重要。 +最近有很多关于学习编程的争论。不仅仅是因为与软件开发公司公开的待应聘的职位数量相比较[符合招聘要求的人远远无法满足缺口][21],编程也是[工资最高][22]和[工作满足感最强][23]的众多职业之一。也难怪越来越多的人都想进入这个行业。 + + +但是你要怎么做才能正确地入行呢?“**我应该怎么学习编程?**”是初学者常见的一个问题。尽管我没有这些问题的全部答案,但是我希望这篇文章能够给你提供相关指导来帮助你找到最适合你的需求和自身情况发展的解决办法。 + + +### 你的学习方式是什么? + + + + +在你开始学习编程之前,你需要考虑的不仅仅是你的方向选择,还要更多的考虑下你自己。古罗马人有句谚语,[γνῶθι σεαυτόν][24](gnothi seauton),意思是“认识你自己”。进行一个大型的编程学习难度不小。足够的自我认识是非常有必要的,这能够确保你做出的选择通向成功的机会非常大。你需要思考并诚实地回答接下来的这些问题: + + +* **你最喜欢什么样的学习方式?**怎么做你才能学到最好?是通过阅读的方式吗?还是听讲座?还是主要通过动手实践?你需要选择对你最有效的方法。不要仅仅因为这种学习方法流行或者有其他人说过这种方法对他们很有用就选择了这种方法。 + + +* **你的需要和要求是什么?**你为什么想学习如何编程?是因为你只是想换一份工作吗?如果是这样的话,你需要多次时间才能完成呢?你要牢记,这些是_需要的_ ,不是_想要的_ 。你可能_想要_下周就换份新工作,但是_需要_ 有人在接下来的一年里帮忙供养你的正在成长的家庭。当你在人生的道路上面临方向的抉择时,时间的安排特别重要。 * **你能获取的参考资料有哪些?**当然,重返大学并获得一份计算机科学专业的学位证书可能也不错,但是你必须对你自己实事求是面对现实。你的生活必须和你学习相适应。你能承受花费几个月的时间和不菲的费用去参加集训吗?你是否生活在一个提供学习机会的地方,比如提供技术性的聚会或者大学课程?你能获取到的参考资料会对你的学习过程产生巨大的影响。在打算学编程换工作前先调查好这些。 - - -### 选择一门编程语言 - - -当你打算开始你的编程学习之路和考虑你的选择的时候,请记住不管其他人说什么,选择哪门编程语言来开始你的编程学习 _关系不大_。是的,是有些编程语言比其他的更流行。比如,根据一份调查研究,目前 JavaScript,Java,PHP, 和 Python 处于 [最受欢迎最流行的编程][25] 中的前排。但是现在正流行的编程语言有可能过几年就过时了,所以不用太纠结编程语言的选择。像那些方法,类,函数,条件,控制流程和其他的编程的概念思想等等,不管你选的哪门编程语言,他们的底层原理基本保持一致。只有语法和社区的实例会变。因此你能够用 [Perl][26] 学习编程,也可以用 [Swift][27] 或者 [Rust][28]。作为一个程序员,你会在你的职业生涯里用很多不同的编程语言来工作。不要认为你被困在了编程语言的选择上。 - - - -### Test the waters - -### 市场测试 - - -除非你已经涉足过这个行业或者确信你愿意花费你生命的剩余时光来编程,我建议你最好还是潜水之前先用脚趾头来试试水温之类的来判断这水适不适合潜水。这种工作不是每个人都能做的。在把全部希望都压在学习编程之前,你可以先尝试花费少量时间金钱来学习一小部分知识点来了解自己是否会享受这种每周起码花费 40 个小时来编码工作的生活。如果你不喜欢这种工作,你不太可能完成编程项目的学习。即便你完成结束了编程的学习阶段,你也会在你以后的编程工作中感到无比痛苦。人生苦短就不要花费你人生三分之一的时间来做你不喜欢的事了。  - - -谢天谢地,软件开发不仅仅需要编程。熟悉编程概念和理解软件是怎么和他们结合在一起的是非常有用的,但是你不需要成为一个程序员也能在软件开发行业中找到一份报酬不菲的工作。在软件开发过程中,额外的重要角色有技术文档撰写人、项目经理、产品经理、测试人员、设计人员、用户体验设计者、运维/系统管理员和数据科学家等。软件成功的启动需要很多角色的人之间相互配合。不要觉得学习了编程就要求你成为一个程序员。你需要探索你的选择并确定哪个选择才是最适合你的。 - - -### 参考的学习资料 - - -你对学习参考资料的选择是什么?可能正如你已经发现的那样,可供选择的参考资料非常多,尽管在你的那片区域不是所有的资料都能够获得。 -* **训练营**:最近这几年像 [App Academy][5] 和 [Bloc][6] 这样的训练营越来越流行。训练营通常收费 $10K或者更多,他们宣称在几周内就能够把一个学生培训成一个称职的程序员。在参加编程集训营前,你需要研究下你将要学习的项目能确保正如它所承诺的那样,学生学完毕业后能够找到一个高薪的长期供职的职位。一方面花费了数目不小的钱财,而且时间也花费了不少—通常这些都是典型的全日制课程并且要求学生在接下来的连续几周里把其他的事先放在一边专心课程学习。然而时间金钱这两项不菲的消耗通常会使很多未来的程序员无法参加训练营。 - - -* **社区学院/职业培训中心**:社区学院常常被那些研究自己对学习编程的选择的人所忽视,不得不说这些人该为自己对社区学院的忽视感到羞愧。你在社区学院或者职业培训中心能够接受到的教育是和你选择其他方式学习编程的学习效果一样有效,而且费用也不高。 - - -* **国家/地方的培训项目**:许多地区都认识到在他们的地区增加技术投资的经济效益,并且已经制定了培训计划来培养受过良好教育和准备好的劳动力。培训项目的案例包括了[Code Oregon][7] 和 [Minneapolis TechHire][8]。检查下你的州、省或自治区是否提供这样的项目。 +### 选择一门编程语言 -* **在线训练**:许多公司和组织都提供在线技术培训项目。比如,[Linux Foundation][9]致力于通过开源技术使人们获得成功。其他的像[O'Reilly Media][10], [Lynda.com][11], 和 [Coursera][12]在软件开发涉及的许多方面提供培训。[Codecademy][13]提供对编程概念的在线介绍。每个项目的成本会有所不同,但大多数项目会允许你在你的日程安排中学习。 +当你打算开始你的编程学习之路和考虑你的选择的时候,请记住不管其他人说什么,选择哪门编程语言来开始你的编程学习 _关系不大_。是的,是有些编程语言比其他的更流行。比如,根据一份调查研究,目前 JavaScript,Java,PHP, 和 Python 处于 [最受欢迎最流行的编程][25] 中的前排。但是现在正流行的编程语言有可能过几年就过时了,所以不用太纠结编程语言的选择。像那些方法,类,函数,条件,控制流程和其他的编程的概念思想等等,不管你选的哪门编程语言,他们的底层原理基本保持一致。只有语法和社区的实例会变。因此你能够用 [Perl][26] 学习编程,也可以用 [Swift][27] 或者 [Rust][28]。作为一个程序员,你会在你的职业生涯里用很多不同的编程语言来工作。不要认为你被困在了编程语言的选择上。 -* **MOOCs**:在过去的几年里,moocs-大规模开放在线课程的发展势头已经很好了。像 [Harvard][14], [Stanford][15], [MIT][16] 和其他的一些世界一流大学他们一直在记录他们的课程,并免费提供在线课程。课程的自我指导性质可能并不适合所有人,但可利用的材料使这成为一个有价值的学习选择。 -* **专业书籍**:许多人喜欢用书自学。这是相当经济的,在初步学习阶段后提供了现成的参考资料。尽管你可以通过在线服务订购和访问图书像[Safari][17] 和 [Amazon][18],但是也不要忘了检查你本地的公共图书馆。 - - -### 网络支持 - - -无论你选择哪一种学习资源,有网络支持都将获得更大的成功。与他人分享你的经历和挑战可以帮助你保持动力,同时为你提供一个安全的地方去问那些你可能还没有足够自信到其他地方去问的问题。许多城镇都有当地的用户群聚在一起讨论和学习软件技术。通常你可以在 [Meetup.com][29] 这里找到。专门的兴趣小组,比如 [Women Who Code][30] 和 [Code2040][31],在大多数城市地区,经常举行会议和黑客马拉松活动,这是在你学习的时候,一个很好的方式来结识并建立一个支持网络。一些软件会议举办“黑客日”,在那里你可以遇到有经验的软件开发人员,他们能够帮助你解决你所困扰的一些问题。例如,每年的[PyCon][32]会议都会提供几天的时间来让人们聚集在一起工作、研讨。一些项目,比如[BeeWare][33],使用这些短暂的时间来帮助新程序员学习和对这些项目做贡献。 - - -你的网络支持不需要来自正式的聚会。一个小的学习小组可以有效地保持你的学习积极性,并且可以像在你最喜欢的社交网络上发布邀请一样容易形成。如果你生活在一个没有大量软件开发人员的社区来支持几个meetups和用户组,那么这一点特别有用。 - - -### 开始学习编程的几个步骤 - -In summary, to give yourself the best chance of success should you decide to learn to program, follow these steps: - -1. Gather your list of requirements/needs and resources - -2. Research the options available to you in your area - -3. Discard the options that do not meet your requirements and resources - -4. Select the option(s) that best suit your requirements, resources, and learning style - -5. Find a support network - -简单的来说,既然你决定学习编程,可以参考这几个方法给自己一个尽可能成功的机会: - -1. 将你的需要/需求和参考学习资料列出清单并进行收集 - -2. 搜寻在你的当地那里能够可用的选择 - -3. 放弃不能符合你的需求和参考学习资料的选择 - -4. 选择最符合你需求的和最适合你的学习参考资源 - -5. 找到一个能够得到支持的网络 - - -务必牢记:你的学习过程永远不会结束。高速发展的软件产业,会导致新技术和新进展几乎每天都会出现。一旦你学会了编程,你就必须花时间去学习适应这些新的进步。你不能依靠你的工作来为你提供这种培训。只有你自己负责自己的职业发展,所以如果你想保持最新的技术和工作能力,你必须紧跟行业最新的技术。 - - -祝你好运! - --------------------------------------------------------------------------------- - -作者简介: - - -VM (Vicky) Brasseur - VM (aka Vicky) 是一个技术人员,也是项目、工作进程、产品和企业的经理。在她的长达 18 年的科技行业里,她曾是一名分析师、程序员、产品经理、软件工程经理和软件工程总监。目前,她是惠普企业上游开源开发团队的高级工程经理。她的博客是 anonymoushash.vmbrasseur.com,推特是 @vmbrasseur。  - - - - - --------- - -via: https://opensource.com/article/17/4/how-get-started-learning-program - -作者:[VM (Vicky) Brasseur ][a] -译者:[WangYueScream](https://github.com/WangYueScream) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/vmbrasseur -[1]:https://opensource.com/tags/python?src=programming_resource_menu -[2]:https://opensource.com/tags/javascript?src=programming_resource_menu -[3]:https://opensource.com/tags/perl?src=programming_resource_menu -[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu -[5]:https://www.appacademy.io/ -[6]:https://www.bloc.io/ -[7]:http://codeoregon.org/ -[8]:http://www.minneapolismn.gov/cped/metp/TechHire#start -[9]:https://training.linuxfoundation.org/ -[10]:http://shop.oreilly.com/category/learning-path.do -[11]:https://www.lynda.com/ -[12]:https://www.coursera.org/ -[13]:https://www.codecademy.com/ -[14]:https://www.edx.org/school/harvardx -[15]:http://online.stanford.edu/courses -[16]:https://ocw.mit.edu/index.htm -[17]:https://www.safaribooksonline.com/ -[18]:https://amazon.com/ -[19]:https://opensource.com/article/17/4/how-get-started-learning-program?rate=txl_aE6F2oOUSgQDveWFtrPWIbA1ULFwfOp017zV35M -[20]:https://commons.wikimedia.org/wiki/File:Roman-mosaic-know-thyself.jpg -[21]:http://www.techrepublic.com/article/report-40-of-employers-worldwide-face-talent-shortages-driven-by-it/ -[22]:http://web.archive.org/web/20170328065655/http://www.businessinsider.com/highest-paying-jobs-in-america-2017-3/#-25 -[23]:https://stackoverflow.com/insights/survey/2017/#career-satisfaction -[24]:https://en.wikipedia.org/wiki/Know_thyself -[25]:https://stackoverflow.com/insights/survey/2017/#most-popular-technologies -[26]:https://learn.perl.org/tutorials/ -[27]:http://shop.oreilly.com/product/0636920045946.do -[28]:https://doc.rust-lang.org/book/ -[29]:https://www.meetup.com/ -[30]:https://www.womenwhocode.com/ -[31]:http://www.code2040.org/ -[32]:https://us.pycon.org/ -[33]:http://pybee.org/ -[34]:https://opensource.com/user/10683/feed -[35]:https://opensource.com/article/17/4/how-get-started-learning-program#comments -[36]:https://opensource.com/users/vmbrasseur +### 市场测试 + + +除非你已经涉足过这个行业或者确信你愿意花费你生命的剩余时光来编程,我建议你最好还是潜水之前先用脚趾头来试试水温之类的来判断这水适不适合潜水。这种工作不是每个人都能做的。在把全部希望都压在学习编程之前,你可以先尝试花费少量时间金钱来学习一小部分知识点来了解自己是否会享受这种每周起码花费 40 个小时来编码工作的生活。如果你不喜欢这种工作,你不太可能完成编程项目的学习。即便你完成结束了编程的学习阶段,你也会在你以后的编程工作中感到无比痛苦。人生苦短就不要花费你人生三分之一的时间来做你不喜欢的事了。  + + +谢天谢地,软件开发不仅仅需要编程。熟悉编程概念和理解软件是怎么和他们结合在一起的是非常有用的,但是你不需要成为一个程序员也能在软件开发行业中找到一份报酬不菲的工作。在软件开发过程中,额外的重要角色有技术文档撰写人、项目经理、产品经理、测试人员、设计人员、用户体验设计者、运维/系统管理员和数据科学家等。软件成功的启动需要很多角色的人之间相互配合。不要觉得学习了编程就要求你成为一个程序员。你需要探索你的选择并确定哪个选择才是最适合你的。 + + +### 参考的学习资料 + + +你对学习参考资料的选择是什么?可能正如你已经发现的那样,可供选择的参考资料非常多,尽管在你的那片区域不是所有的资料都能够获得。 + + +* **训练营**:最近这几年像 [App Academy][5] 和 [Bloc][6] 这样的训练营越来越流行。训练营通常收费 $10K或者更多,他们宣称在几周内就能够把一个学生培训成一个称职的程序员。在参加编程集训营前,你需要研究下你将要学习的项目能确保正如它所承诺的那样,学生学完毕业后能够找到一个高薪的长期供职的职位。一方面花费了数目不小的钱财,而且时间也花费了不少—通常这些都是典型的全日制课程并且要求学生在接下来的连续几周里把其他的事先放在一边专心课程学习。然而时间金钱这两项不菲的消耗通常会使很多未来的程序员无法参加训练营。 + + +* **社区学院/职业培训中心**:社区学院常常被那些研究自己对学习编程的选择的人所忽视,不得不说这些人该为自己对社区学院的忽视感到羞愧。你在社区学院或者职业培训中心能够接受到的教育是和你选择其他方式学习编程的学习效果一样有效,而且费用也不高。 + + +* **国家/地方的培训项目**:许多地区都认识到在他们的地区增加技术投资的经济效益,并且已经制定了培训计划来培养受过良好教育和准备好的劳动力。培训项目的案例包括了[Code Oregon][7] 和 [Minneapolis TechHire][8]。检查下你的州、省或自治区是否提供这样的项目。 + + +* **在线训练**:许多公司和组织都提供在线技术培训项目。比如,[Linux Foundation][9]致力于通过开源技术使人们获得成功。其他的像[O'Reilly Media][10], [Lynda.com][11], 和 [Coursera][12]在软件开发涉及的许多方面提供培训。[Codecademy][13]提供对编程概念的在线介绍。每个项目的成本会有所不同,但大多数项目会允许你在你的日程安排中学习。 + + +* **MOOCs**:在过去的几年里,moocs-大规模开放在线课程的发展势头已经很好了。像 [Harvard][14], [Stanford][15], [MIT][16] 和其他的一些世界一流大学他们一直在记录他们的课程,并免费提供在线课程。课程的自我指导性质可能并不适合所有人,但可利用的材料使这成为一个有价值的学习选择。 + + +* **专业书籍**:许多人喜欢用书自学。这是相当经济的,在初步学习阶段后提供了现成的参考资料。尽管你可以通过在线服务订购和访问图书像[Safari][17] 和 [Amazon][18],但是也不要忘了检查你本地的公共图书馆。 + + +### 网络支持 + + +无论你选择哪一种学习资源,有网络支持都将获得更大的成功。与他人分享你的经历和挑战可以帮助你保持动力,同时为你提供一个安全的地方去问那些你可能还没有足够自信到其他地方去问的问题。许多城镇都有当地的用户群聚在一起讨论和学习软件技术。通常你可以在 [Meetup.com][29] 这里找到。专门的兴趣小组,比如 [Women Who Code][30] 和 [Code2040][31],在大多数城市地区,经常举行会议和黑客马拉松活动,这是在你学习的时候,一个很好的方式来结识并建立一个支持网络。一些软件会议举办“黑客日”,在那里你可以遇到有经验的软件开发人员,他们能够帮助你解决你所困扰的一些问题。例如,每年的[PyCon][32]会议都会提供几天的时间来让人们聚集在一起工作、研讨。一些项目,比如[BeeWare][33],使用这些短暂的时间来帮助新程序员学习和对这些项目做贡献。 + + +你的网络支持不需要来自正式的聚会。一个小的学习小组可以有效地保持你的学习积极性,并且可以像在你最喜欢的社交网络上发布邀请一样容易形成。如果你生活在一个没有大量软件开发人员的社区来支持几个meetups和用户组,那么这一点特别有用。 + + +### 开始学习编程的几个步骤 + + + +简单的来说,既然你决定学习编程,可以参考这几个方法给自己一个尽可能成功的机会: + +1. 将你的需要/需求和参考学习资料列出清单并进行收集 + +2. 搜寻在你的当地那里能够可用的选择 + +3. 放弃不能符合你的需求和参考学习资料的选择 + +4. 选择最符合你需求的和最适合你的学习参考资源 + +5. 找到一个能够得到支持的网络 + + +务必牢记:你的学习过程永远不会结束。高速发展的软件产业,会导致新技术和新进展几乎每天都会出现。一旦你学会了编程,你就必须花时间去学习适应这些新的进步。你不能依靠你的工作来为你提供这种培训。只有你自己负责自己的职业发展,所以如果你想保持最新的技术和工作能力,你必须紧跟行业最新的技术。 + + +祝你好运! + +-------------------------------------------------------------------------------- + +作者简介: + + +VM (Vicky) Brasseur - VM (aka Vicky) 是一个技术人员,也是项目、工作进程、产品和企业的经理。在她的长达 18 年的科技行业里,她曾是一名分析师、程序员、产品经理、软件工程经理和软件工程总监。目前,她是惠普企业上游开源开发团队的高级工程经理。她的博客是 anonymoushash.vmbrasseur.com,推特是 @vmbrasseur。  + + + + + +-------- + +via: https://opensource.com/article/17/4/how-get-started-learning-program + +作者:[VM (Vicky) Brasseur ][a] +译者:[WangYueScream](https://github.com/WangYueScream) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/vmbrasseur +[1]:https://opensource.com/tags/python?src=programming_resource_menu +[2]:https://opensource.com/tags/javascript?src=programming_resource_menu +[3]:https://opensource.com/tags/perl?src=programming_resource_menu +[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu +[5]:https://www.appacademy.io/ +[6]:https://www.bloc.io/ +[7]:http://codeoregon.org/ +[8]:http://www.minneapolismn.gov/cped/metp/TechHire#start +[9]:https://training.linuxfoundation.org/ +[10]:http://shop.oreilly.com/category/learning-path.do +[11]:https://www.lynda.com/ +[12]:https://www.coursera.org/ +[13]:https://www.codecademy.com/ +[14]:https://www.edx.org/school/harvardx +[15]:http://online.stanford.edu/courses +[16]:https://ocw.mit.edu/index.htm +[17]:https://www.safaribooksonline.com/ +[18]:https://amazon.com/ +[19]:https://opensource.com/article/17/4/how-get-started-learning-program?rate=txl_aE6F2oOUSgQDveWFtrPWIbA1ULFwfOp017zV35M +[20]:https://commons.wikimedia.org/wiki/File:Roman-mosaic-know-thyself.jpg +[21]:http://www.techrepublic.com/article/report-40-of-employers-worldwide-face-talent-shortages-driven-by-it/ +[22]:http://web.archive.org/web/20170328065655/http://www.businessinsider.com/highest-paying-jobs-in-america-2017-3/#-25 +[23]:https://stackoverflow.com/insights/survey/2017/#career-satisfaction +[24]:https://en.wikipedia.org/wiki/Know_thyself +[25]:https://stackoverflow.com/insights/survey/2017/#most-popular-technologies +[26]:https://learn.perl.org/tutorials/ +[27]:http://shop.oreilly.com/product/0636920045946.do +[28]:https://doc.rust-lang.org/book/ +[29]:https://www.meetup.com/ +[30]:https://www.womenwhocode.com/ +[31]:http://www.code2040.org/ +[32]:https://us.pycon.org/ +[33]:http://pybee.org/ +[34]:https://opensource.com/user/10683/feed +[35]:https://opensource.com/article/17/4/how-get-started-learning-program#comments +[36]:https://opensource.com/users/vmbrasseur From 83a5f70b7d9016f9bc8f606ab0fa50d915153f31 Mon Sep 17 00:00:00 2001 From: stevenzdg988 Date: Thu, 13 Jul 2017 16:10:39 +0800 Subject: [PATCH 0669/1407] Translating by stevenzdg988 --- ...oduction to Libral a systems management library for Linux.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md b/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md index f9e5a3957a..a25ef275e9 100644 --- a/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md +++ b/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md @@ -1,3 +1,5 @@ +Translating by stevenzdg988. + An introduction to Libral, a systems management library for Linux ============================================================ From a7daa93ddb41fbc274a2361681d3cd32cf1299ca Mon Sep 17 00:00:00 2001 From: stevenzdg988 Date: Thu, 13 Jul 2017 16:15:13 +0800 Subject: [PATCH 0670/1407] Translating by stevenzdg988 --- translated/tech/20170529 Ubuntu GamePack.md | 339 -------------------- 1 file changed, 339 deletions(-) delete mode 100644 translated/tech/20170529 Ubuntu GamePack.md diff --git a/translated/tech/20170529 Ubuntu GamePack.md b/translated/tech/20170529 Ubuntu GamePack.md deleted file mode 100644 index 9607f442a9..0000000000 --- a/translated/tech/20170529 Ubuntu GamePack.md +++ /dev/null @@ -1,339 +0,0 @@ -Ubuntu GamePack -=============== - - -A lot of people who like to use their Linux system for gaming. There seems to be no shortage of gaming systems which can supply access to games. UALinux is a Ukrainian company which promotes the use of GNU/Linux. UALinux has created a Ubuntu version to fill the gap for gaming. The Operating System (OS) is called Ubuntu GamePack and is based off of Ubuntu 16.04. - - -很大一部分 Linux 爱好者喜欢用他们的系统玩游戏。现在看起来能够可以支持游戏的游戏系统很短缺。UALinux 是一家推广使用 GNU/Linux 的乌克兰公司。UALinux 开发了一个 Ubuntu 版本填补了这一空白。把这个基于 Ubuntu 16.04 的操作系统(OS)命名为 Ubuntu GamePack . - -**Contents** - -** 内容 ** - -The list of games would be quite extensive but the company claims there is access to over 22,381 games. - -游戏现在已经相当广泛,但是游戏公司已经宣称可以访问超过22,381款游戏。 - -The GamePack includes Lutris and Steam to allow you access to the specific gaming services the distributer provides. - -GamePack 包括 Lutris 和 Steam 两部分,允许您访问分发商提供的定制游戏服务。 - -For Windows-based games there is PlayOnLinux, WINE and CrossOver so the games will run on Linux. - -对于基于 Windows 的游戏,有 PlayOnLinux,WINE 和 CrossOver 转换到 Linux 上运行。 - -For DOS games you can run the games in DosBox which is a DOS emulator for Linux. - -对于 DOS 游戏,您可以在 DosBox 中运行游戏,这是一个 Linux 的 DOS 模拟器 - -Sparky APTus Gamer is also installed to allow access to numerous gaming console emulators. The emulators include: - -Sparky APTus Gamer 被安装应用允许访问众多游戏控制模拟器。 模拟器包括: - -*   AdvanceMENU – front-end for AdvanceMAME, AdvanceMESS, MAME, MESS, xmame, Raine and other emulators - -*  AdvanceMENU - 前端包括 AdvanceMAME, AdvanceMESS, MAME, MESS, xmame, Raine 以及其他的模拟器 - -*   Atari800 - emulator for Atari 8-bit systems, XE Game System and Atari 5200 SuperSystem - -*  Atari800 - Atari 8位系统的模拟器,XE 游戏系统和 Atari 5200 超级系统 - -*   DeSmuME - Nintendo DS emulator - -*   DeSmuME - Nintendo DS 模拟器 - -*   Desura - digital distribution platform for Windows, Linux and X systems - OnLine installer - -*   Desura - 为Windows数字化分发平台,Linux 和 x 系统 - 在线安装 - -* DOSBox - DOS emulator for BeOS, Linux, Mac X, OS2, and Windows - -* DOSBox - 为系统 BeOS, Linux, Mac X, OS2, 和 Windows 定制的 DOS 模拟器 - -* DOSEMU - DOS Emulator for Linux - -* DOSEMU - 为 Linux 系统定制的 DOS 模拟器 - -* ePSXe - enhanced PSX emulator - -* ePSXe - 增强的 PSX 模拟器(仿真器) - -* FCEUX - Nintendo Entertainment System (NES), Famicom and Famicom Disk System (FDS) emulator - -* FCEUX - 任天堂娱乐系统(NES),费米康和费米康磁盘系统(FDS)模拟器(仿真器) - -* FS-UAE - Cross-platform Amiga emulator - -* FS-UAE - 跨平台多媒体(Amiga)模拟器 - -* GNOME Video Arcade - Simple MAME frontend - -* GNOME Video Arcade - 简化 MAME 前端 - -* Hatari - Atari ST, STE, TT and Falcon emulator for Linux and other systems - -* Hatari - 用于Linux和其他系统的Atari ST,STE,TT和 Falcon 模拟器(仿真器) - -* Higan - Emulator for Nintendos SNES, NES, Gameboy, Gameboy Color and Gameboy Advance - -* Higan - 任天堂 SNES,NES,Gameboy,Gameboy Color 和 Gameboy Advance 的模拟器 - -* Kega_Fusion - Sega SG/SC/SF, Master System, Game Gear, Genesis/Megadrive, SVP, Pico, SegaCD/MegaCD emulator - -* Kega_Fusion - 世嘉 SG / SC / SF,主系统,游戏机,创世纪 / 麦加驱动,SVP,Pico,SegaCD / MegaCD 模拟器(仿真器) - -* MAME - Hardware emulator which faithfully reproduces the behavior of many arcade machines - -* MAME - 不折不扣地复制许多街机行为硬件模拟器(仿真器) - -* Mednafen - Atari Lynx, GameBoy, NES, SNES, PC-FX, Sega, Sony PlayStation and other systems - -* Mednafen - Atari Lynx,GameBoy,NES,SNES,PC-FX,世嘉,索尼游戏站等系统 - -* MESS - Emulator for various consoles and computing systems - -* MESS - 各种控制台和计算系统的模拟器(仿真器) - -* Nestopia - Nintendo Entertainment System/Famicom emulator - -* Nestopia - 任天堂娱乐系统/费米康模拟器 - -* PCSX - Sony PlayStation emulator - -*   PCSX - 索尼游戏平台模拟器(仿真器) -  -*   PlayOnLinux - Front-end for Wine - -*   PlayOnLinux - 前端生成 -  -* PPSSPP - PPSSPP is an open source PSP emulator available for Windows, MacOS, Linux and Android - -* PPSSPP - PPSSPP 是适用于 Windows,MacOS,Linux 和 Android 的开源 PSP 仿真器 - -* Steam - launcher for the Steam software distribution service - OnLine installer - -* Steam - Steam 软件分发服务的启动器 - 在线安装程序 - -* Stella - Atari 2600 Emulator for SDL and the X Window System - -* Stella -用于 SDL 和 X Window 系统的 Atari 2600 仿真器 - -* VisualBoyAdvance - Full featured Game Boy Advance emulator - -* VisualBoyAdvance - 全功能 Game Boy Advance 模拟器 - -* Virtual Jaguar - Cross-platform emulator for Atari's infamous Jaguar console - -* Virtual Jaguar - 用于 Atari infamous Jaguar 控制台的跨平台模拟器 - -* Wine - Windows implementation - -*   Wine - 窗口实现 -  -* Winetricks - a POSIX shell script 'package manager' for WINE to install some Windows software easily - -*   Winetricks - POSIX shell脚本的软件包管理器,能够很容易为 WINE 安装 Windows软件 - -* Yabause - Sega Saturn emulator - -*   Yabause - 世嘉土星32位游戏机模拟器(仿真器) -  -* ZSNES - Emulator for the Super Nintendo Entertainment System - -* ZSNES - 超级任天堂娱乐系统模拟器 - -The GamePack also includes Oracle Java and Adobe Flash which is needed by quite a few games. - -GamePack还包括被相当多的游戏平台所必须的 Oracle java 和 Adobe Flash。 - -If this seems to be an OS you are interested in then read on to find out how to download it. - -如果这是一个你感兴趣的操作系统,请继续阅读,看看如何下载它。 - -**Download** -  -**下载** - - -The main place to download the OS is from UALinux. The link from UALinux is [https://ualinux.com/en/download/category/25-ubuntu-gamepack][1]. Since the link is from a foreign country it is a slow download. Another option is to download the OS from a Torrent file. If you do not have a Torrent program you may want to download ‘Transmission’. Once you have a Torrent program go to [https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-январь-2017-pc-vkn99.html][2]. The Torrent will allow you to download both the 64-bit and 32-bit ISO files. - -下载此操作系统镜像的主要是来自 UALinux 。其下载链接是: [https://ualinux.com/en/download/category/25-ubuntu-gamepack][1]。 -由于此链接来自国外,所以下载速度很慢。另一种选择是利用种子文件下载此操作系统。如果没有你想要下载的“传输”种子下载程序。你可以通过[https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-январь-2017-pc-vkn99.html][2] -此链接获得。这个种子文件下载可以下载 64 位和 32 位 的 ISO 镜像文件。 -The file sizes vary depending on the architecture you need. The 64-bit OS ISO file is 2.27 GB, while the 32-bit OS ISO file is 2.13 GB. - -文件大小取决于您需要的架构。64 位操作系统 ISO 镜像文件大小是 2.27 GB,而 32 位的操作系统 ISO 镜像文件大小是 2.13 GB. -   -Once downloaded you can use the ISO file to create a bootable DVD to install the GamePack or you can use a program like ‘USB Image Writer’ to place the ISO on a USB stick to install it. -  -如果下载了你所用的 ISO 镜像文件,你可以利 ISO 文件创建一个可启动的 DVD 安装 Gamepack 或者你可以使用 ‘USB Image Writer’把 ISO 写入到优盘,并利用此优盘安装系统。 - -The requirements are the same as Ubuntu 16.04: -  -硬件需求和 Ubuntu 16.04 保持一致: -  -* 2 GHz dual core processor or better - -*   2 GHz 双核处理器或者更高 - -*   2 GB system memory - -*   2 GB 系统内存 -  -* 25 GB of free hard drive space - -*   25 GB 的磁盘空间 - -*   Either a DVD drive or a USB port for the installer media - -*   具有 DVD 驱动器或者具备 USB 端口,以便于安装 -  -* Internet access is required for online gaming systems such as Steam - -*   在线游戏系统(如Steam)需要互联网接入。 - -It goes without saying that for gaming you definitely want to have a system with more than these ‘minimum’ requirements. More memory would be a definite plus as well as a decent video card with a fair amount of Video RAM. - -不用说,对于游戏玩家来说,肯定希望拥有比这些“最低配置”要求更高的系统配置。更多的内存将是一个有把握的选择,也应该有一款正版的显存大一点的显卡。 - -Once you have a system and the specific ISO file for the system, 32- or 64-bit OS, then you are ready to install the Operating System. - -您如果有了硬件系统和系统的特定 32位 或者 64 位 ISO 文件,那么接下来就可以安装操作系统了。 - -**Installation** -  -**安装过程** - -Once you have the ISO file on a media from which you can boot your system you are ready to continue. - -在媒体上利用 ISO 镜像文件启动了系统,您就可以准备进行下一步了。 - -Boot from the Ubuntu GamePack media and you should see a screen similar to Figure 1. - -从 Ubuntu Gamepack 介质启动,你会看到一个类似图1的屏幕。 - -![Figure 01.png](https://www.linux.org/attachments/figure-01-png.671/) - -**FIGURE 1** -**图 1** - -Once everything is loaded the installer can proceed with the installation. Figure 2 shows the next screen which allows you to specify your language and whether you want to install or try the GamePack. If you wish, you can click ‘Try Ubuntu’ to simply load it into memory and try it out without making changes to your drive. - -一旦加载完毕,安装程序就可以继续安装了。图2显示下一屏,可以定制语言,接下来是安装或者体验 Gamepack。如果你愿意,你可以点击 “Try Ubuntu” 在不改变驱动器的情况下把它加载到内存中运行。 - -![Figure 02.png](https://www.linux.org/attachments/figure-02-png.672/) - -**FIGURE 2** -**图 2** - -Once you are ready to continue select ‘Install Ubuntu’. -  -接下来继续选择 ‘Install Ubuntu’ 进行安装了。 -  -The next screen, Figure 3, allows you to specify whether to download any updates for Ubuntu while installing it. You can also choose to install Third Party software for Graphics, WiFi, Flash, MP3 and other updates. - -下一个屏幕,如图3所示,你可以在安装 Ubuntu 时指定是否下载 Ubuntu 的任何更新。您还可以选择安装第三方的软件,如:Graphics, WiFi, Flash, MP3 和其他更新。 - -Once you have made your selections, press ‘Continue’. -  -当定制好你的系统后,就可以点击“Continue”  -  -![Figure 03.png](https://www.linux.org/attachments/figure-03-png.673/) - -**FIGURE 3** -**图 3** - -Next, you must specify how the drive will be configured for use as shown in Figure 4\. If you plan on using the whole drive, then it may be easier to leave the settings as they are and click ‘Install Now’. - -接下来,您必须指定驱动器将如何配置为使用,如图4所示。如果您计划使用整个驱动器,那么可以更容易地设置,选择此驱动器即可,然后单击“Install Now”。 - -![Figure 04.png](https://www.linux.org/attachments/figure-04-png.674/) - -**FIGURE 4** -**图 4** - -As shown in Figure 5 you will be prompted to verify your selection for configuring the hard drive. If you approve the changes then click ‘Continue’. -  -接下来在图5中可以根据提示确认所选择硬件配置。如果同意以上的更改,请单击“Continue”。  -  -![Figure 05.png](https://www.linux.org/attachments/figure-05-png.675/) - -**FIGURE 5** -**图 5** - -Next you will be prompted to choose your Time Zone as shown in Figure 6\. Click ‘Continue’ once you have set your Time Zone. - -接下来,如图6所示,你将按照提示选择时区,选择完毕后点击“Continue”。 - -![Figure 06.png](https://www.linux.org/attachments/figure-06-png.676/) - -**FIGURE 6** -**图 6** - -A window will appear, Figure 7, to allow you to set the default keyboard layout. Choose the correct layout and press ‘Continue’. - -接下来,如图7所示,需要您设置默认的键盘布局。选择适合您的正确的布局后并按“Continue”。 - -![Figure 07.png](https://www.linux.org/attachments/figure-07-png.677/) - -**FIGURE 7** -**图 7** - -The last configuration screen is for you to set up a User account as shown in Figure 8\. Type in your name, computer name, User name, password and select if you need to type the password to log onto the system. You can also set to encrypt the Home Folder for this User. - -最后一个配置屏幕是为您设置一个用户帐户,如图8所示。键入您的姓名、计算机名、用户名、密码和选择您需要键入密码登录系统的方式。您还可以为该用户设置加密主目录。 - -![Figure 08.png](https://www.linux.org/attachments/figure-08-png.678/) - -**FIGURE 8** -**图 8** - -The installation should proceed now by setting up the drive as specified. Files will be copied from the boot media to the hard drive as shown in Figure 9\. Once everything is copied to the drive and set up you will be prompted to remove the Boot Media to allow the system to restart. - -安装将按定制进行设置驱动器。安装文件将从引导媒体复制到硬盘驱动器,如图9所示。所有内容复制到驱动器并设置,您将被提示移除引导媒体并允许重新启动系统。 - -![Figure 09.png](https://www.linux.org/attachments/figure-09-png.679/) - -**FIGURE 9** -**图 9** - -After the restart, if you selected to require the User to log in, then you will be given a screen like Figure 10\. Here you enter the password you specified for the User and log onto Ubuntu GamePack. - -重新启动后,您需要选择用户登录,会得到类似于图10的屏幕\\。输入指定的用户密码登录到 Ubuntu Gamepack。 - -![Figure 10.png](https://www.linux.org/attachments/figure-10-png.680/) - -**FIGURE 10** -**图 10** - -After you log onto Ubuntu GamePack you should probably try to perform any software upgrades which may be necessary. Open a Terminal and enter the following two commands: - -当你登录到 Ubuntu Gamepack 你应该尝试执行可能需要的任何软件升级。打开一个终端并输入以下两个命令: - -sudo apt-get update && sudo apt-get upgrade - -Any updates which are not installed should be installed to bring the GamePack system up-to-date. - -更新会安装 GamePack 系统定制的软件更新。 - -Now, simply look through the menu and find the games you wish to play. Open the emulators or any of the game services like Steam. - -现在,只要看看菜单,找到你想玩的游戏就行了。打开模拟器或任何游戏服务如 Steam 。 - -Hope you enjoy the GamePack and have fun! - -希望你喜欢 Gamepack 并且玩得高兴! --------------------------------------------------------------------------------- - -via: https://www.linux.org/threads/ubuntu-gamepack.4559/ - -作者:[Jarret B ][a] -译者:[stevenzdg988](https://github.com/stevenzdg988) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.linux.org/members/jarret-b.29858/ -[1]:https://ualinux.com/en/download/category/25-ubuntu-gamepack -[2]:https://zooqle.com/ubuntu-gamepack-16-04-i386-amd64-%D1%8F%D0%BD%D0%B2%D0%B0%D1%80%D1%8C-2017-pc-vkn99.html From df03381966e7b8e8b70321f3f66972a04769ab91 Mon Sep 17 00:00:00 2001 From: stevenzdg988 Date: Thu, 13 Jul 2017 22:20:35 +0800 Subject: [PATCH 0671/1407] stevenzdg988 translating --- ...ral a systems management library for Linux.md | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md b/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md index a25ef275e9..a588baa3cb 100644 --- a/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md +++ b/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md @@ -1,18 +1,28 @@ Translating by stevenzdg988. An introduction to Libral, a systems management library for Linux + +Libral,开源的 Linux 系统管理库入门 + ============================================================ ### Libral provides a uniform management API across system resources and serves as a solid foundation for scripting management tasks and building configuration-management systems. +Libral 提供相同管理标准并通过系统提供的 API 接口,提供可靠地脚本管理任务的服务并且增加实时配置管理系统。 ![An introduction to Libral, a systems management library for Linux](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/yearbook-haff-rx-linux-file-lead_0.png?itok=48iDNoH8 "An introduction to Libral, a systems management library for Linux") >Image by : [Internet Archive Book Images][10]. Modified by Opensource.com. CC BY-SA 4.0 +图像:[Internet Archive Book Images][10].修改:Opensource.com. CC BY-SA 4.0 + Linux, in keeping with Unix traditions, doesn't have a comprehensive systems management API. Instead, management is done through a variety of special-purpose tools and APIs, all with their own conventions and idiosyncrasies. That makes scripting even simple systems-management tasks difficult and brittle. +Linux,保持了 Unix 的传统,但是没有一个综合管理系统的 API接口。相反,管理操作是通过多种特定的工具和 API 按照约定和特有的风格来实现的。这就使得编写一个极其简单的系统管理任务脚本将变得很困难很脆弱。 + For example, changing the login shell of the "app" user is done by running **usermod -s /sbin/nologin app**. This works great until it is attempted on a system that does not have an app user. To fix the ensuing failure, the enterprising script writer might now resort to: +举个例子来说,改变 “app” 登录的命令行方式的用户可以运行 "usermod -s /sbin/nologin app"。这个命令运行能够试图探测出这个系统没有这个 app 用户。为了修复接下来产生的错误,有事业心的脚本编写者可能凭借下面的脚本来解决: + ```     grep -q app /etc/passwd \       && usermod -s /sbin/nologin app \ @@ -21,12 +31,16 @@ For example, changing the login shell of the "app" user is done by running **us So that the change in the login shell is performed when the app user is present on the system, and the user is created if it is not present yet. Unfortunately, this approach to scripting systems-management tasks is not sustainable: For each kind of resource, a different set of tools and their idiosyncrasies must be taken into account; inconsistent and often incomplete error reporting makes error handling difficult; and it is easy to trip over small bugs caused by the ad hoc nature of the tools involved. +因此,当“app”用户在系统中存在时更改登录命令行的方式就被执行了,当此用户不存在时,此用户就被创建个。不幸的是,这种利用编写系统管理任务脚本的途径是不能被接受的:对于每一种资源来说,都必须有不同的设置工具和其特有的风格必须合并到一个用户账户;不一致和经常性的不完备的错误报告将会使错误的处理变得困难;再者会因为工具所具有的本质特性引起的故障而导致执行失败。 + In fact, the above example is not correct: **grep** doesn't look for the **app** user, it simply looks for any line in **/etc/passwd** that contains the string **app**, something that might work most of the time, but can fail—usually at the worst possible moment. - +实际上,以上所举的例子是不正确的:“grep” 不能用在查找 “app”用户的,它只能简单的查找文件“/etc/passwd”的一些行中是否有字符串“app”,在很多时候,会在最关键的时刻经常出错。 Clearly, management tools that make it hard to perform simple tasks from scripts are, at best, a difficult basis for larger management systems. Recognizing this, existing configuration-management systems, such as Puppet, Chef, or Ansible, have gone to great lengths to build their own internal APIs around the management of basic operating system resources. These resource abstractions are internal APIs, and closely tied to the needs of their respective tools. This causes not only a colossal duplication of effort, but also creates a strong barrier to entry for new and innovative management tools. + + One area where this barrier to entry becomes evident is in building VM or container images: In the course of building such images, it is often necessary to either answer simple questions about them or make simple changes to them. But since the tools for this all require special treatment, these questions and changes face exactly the problems that somebody trying to script them faces. As a consequence, image building must rely on either ad hoc scripts or using (and installing) a quite substantial configuration-management system. [Libral][11] establishes a solid foundation for management tools and tasks by providing a common management API across system resources and by making it available through a command line tool, **ralsh**, that enables users to query and to modify system resources in a uniform way, with predictable error reporting. In the above example, checking whether the app user exists is done with **ralsh -aq user app**; checking whether the package **foo** is installed is done with **ralsh -aq package foo**; and, in general, checking whether a resource of type **TYPE** with name **NAME** is present is done with **ralsh -aq TYPE NAME**. Similarly, to create or change an existing user, one runs: From 24380aeeacd5aec82f5f3b31524425f59a30ec5b Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 13 Jul 2017 22:30:23 +0800 Subject: [PATCH 0672/1407] PRF&PUB:20170617 Installing Fedora 26 Beta on a MacBook Air.md @cycoe --- ...talling Fedora 26 Beta on a MacBook Air.md | 42 ++++++++----------- 1 file changed, 17 insertions(+), 25 deletions(-) rename {translated/tech => published}/20170617 Installing Fedora 26 Beta on a MacBook Air.md (66%) diff --git a/translated/tech/20170617 Installing Fedora 26 Beta on a MacBook Air.md b/published/20170617 Installing Fedora 26 Beta on a MacBook Air.md similarity index 66% rename from translated/tech/20170617 Installing Fedora 26 Beta on a MacBook Air.md rename to published/20170617 Installing Fedora 26 Beta on a MacBook Air.md index 95f7c6a574..7cac5d7915 100644 --- a/translated/tech/20170617 Installing Fedora 26 Beta on a MacBook Air.md +++ b/published/20170617 Installing Fedora 26 Beta on a MacBook Air.md @@ -1,67 +1,59 @@ -Translated by cycoe - -在 MacBook Air 上安装 Fedora 26 测试版 +在 MacBook Air 上安装 Fedora 26 ====================== +(写本文时)距离 Fedora 26 测试版发布已有几天,我认为是时候把它安装在我的 13 寸 MacBook Air 上了。 -距离 Fedora 26 测试版发布已有几天,我认为是时候把它安装在我的 13 寸 MacBook Air 上了。 - -这代 MacBook Air 的型号为 A1466 EMC 2925,拥有 8gb 内存,2.2GHz i7 处理器,512gb ssd,以及与 2015ish 相似的外观。 +我这个 MacBook Air 的型号为 A1466 EMC 2925,拥有 8gb 内存,2.2GHz i7 处理器,512gb SSD,以及与 2015 款相似的外观。 首先我下载了 beta 版镜像,你能够从 [GetFedora][1] 网站获取。一旦你下载完成,就可将它安装在 USB 闪存驱动器上。在 Linux 上,你可以用 `dd` 命令方便的完成这个操作。 将 USB 驱动器插入到你的电脑上,并使用 `tail` 命令读取 `/var/log/syslog` 或 `/var/log/messages` 文件的最后几行。你也可以使用 `df -h` 命令查看存储设备从而找到正确的 /dev/sdX。 -在下面的例子中,我们假设 USB 闪存驱动器为 /dev/sdc +在下面的例子中,我们假设 USB 闪存驱动器为 `/dev/sdc`: + -代码: ``` dd if=/home/rob/Downloads/Fedora-Workstation-Live-x86_64-26_Beta-1.4.iso of=/dev/sdc bs=8M status=progress oflag=direct ``` -这将花费一点点时间... 让我们耐心等待。 +这将花费一点点时间……让我们耐心等待。 -接下来,我关掉 MacBook,等待 5 s 后将它重新启动。在按下电源键后,我按住 'option' 键来呼出启动选项。我的选择如下图: +接下来,我关掉 MacBook,等待 5 秒后将它重新启动。在按下电源键后,我按住 “option” 键来呼出启动选项。我的选择如下图: ![macbook-air-fedora.jpg](https://www.linux.org/attachments/macbook-air-fedora-jpg.2763/) -点击 'fedora' 下面的箭头进入安装过程。 +点击 “fedora” 下面的箭头进入安装过程。 -在进入安装过程后我注意到我没有 wifi 网络。幸运的是我有个雷电口转以太网的转接器,因为这个笔记本实际上没有以太网接口。我寄希望于谷歌并于 [此处][2] 找到了一些很棒的指导。 +在进入安装过程后我注意到我没有 wifi 网络。幸运的是我有个雷电口转以太网的转接器,因为这个笔记本实际上没有以太网接口。我寄希望于谷歌搜索,并于 [此处][2] 找到了一些很棒的指导。 -设置 wifi 前先更新内核 +设置 wifi 前先更新内核: -代码: ``` sudo dnf update kernel ``` (然后重启) -安装 rpmfusion 仓库 +安装 rpmfusion 仓库: -代码: ``` su -c 'dnf install -y http://download1.rpmfusion.org/nonfree/fedora/rpmfusion-nonfree-release-$(rpm -E %fedora).noarch.rpm' ``` -安装 akmods 和 kernel-devel 包 +安装 akmods 和 kernel-devel 包: -代码: ``` sudo dnf install -y akmods "kernel-devel-uname-r == $(uname -r)" ``` -从 rpmfusion 仓库安装 broadcom-wl 包 +从 rpmfusion 仓库安装 broadcom-wl 包: -代码: ``` sudo dnf install -y broadcom-wl ``` -重构内核扩展 +重构内核扩展: -代码: ``` sudo akmods ``` @@ -70,7 +62,7 @@ sudo akmods 到目前为止我们已经解决,这使我印象非常深刻!所有我关心的功能键都能够正常工作,如屏幕亮度、键盘背光、音量。 -接下来,等 7 月份发布非测试版时,我将马上使用 dnf 升级! +接下来,等 7 月份发布非测试版时,我将马上使用 dnf 升级!(LCTT 译注:Fedora 26 正式版已经发布) 感谢你,Fedora! @@ -78,9 +70,9 @@ sudo akmods via: https://www.linux.org/threads/installing-fedora-26-beta-on-a-macbook-air.12464/ -作者:[Rob ][a] +作者:[Rob][a] 译者:[cycoe](https://github.com/cycoe) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From eefd25b7b8e51083c74a089f6baa11a1a6475e12 Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 14 Jul 2017 08:46:12 +0800 Subject: [PATCH 0673/1407] translated --- ...hat it takes to be a software developer.md | 25 ++++++-------- ...hat it takes to be a software developer.md | 34 +++++++++++++++++++ 2 files changed, 44 insertions(+), 15 deletions(-) create mode 100644 translated/talk/20170616 Do you have what it takes to be a software developer.md diff --git a/sources/talk/20170616 Do you have what it takes to be a software developer.md b/sources/talk/20170616 Do you have what it takes to be a software developer.md index f97a5c6df5..3dec6cc692 100644 --- a/sources/talk/20170616 Do you have what it takes to be a software developer.md +++ b/sources/talk/20170616 Do you have what it takes to be a software developer.md @@ -1,35 +1,30 @@ -translating---geekpi - -# Do you have what it takes to be a software developer? +# 成为一名软件开发者需要些什么? ![](https://www.linuxcareer.com/images/software_developer_skills.jpg) -The application space is the place to be. A lot of work has been done in the low-level Linux arena, and it continues, but the growth over the last few years has been in the application space. With that being the case, which language are developers utilizing to build these apps? In short, it depends, which I know does not come as a huge surprise. But, with the data that we have, we are able to determine which languages are leading the way.  +应用程序是在应用领域。底层的 Linux 做了很多工作,而且还在继续,但是在过去几年里,应用程序领域开始增长。在这种情况下,开发人员使用哪种语言构建这些应用程序?简而言之,要看情况,我所了解的并不是一个巨大的惊喜。但是,随着我们逐渐拥有的数据,我们可以确定哪些语言领先。 -The language that finds itself on the top of the mountain is Java. Being around open source software for over 15 years, this was not always the case. Early on, we did not see a lot of interest in Java developers, but boy has that changed. It is the definitive leader in the application space currently. While the numbers have not grown in the last six quarters, the sheer overall number is impressive. On average, companies are asking for Java skills in over 1 in 3 job postings focused on FLOSS. Quite a feat for a language that did not register on the radar years ago. And, based on its heavy use with Android, it would not be a surprise to see this number increase in the future.  +发现自己在领先的语言是 Java。它已经围绕开源软件15年以上,但情况并不总是如此。在早期,我们没有看到很多对 java 开发者的兴趣,但这个男孩已经改变了。它是目前应用领域的权威领导者。虽然数字在过去六个季度没有增长,但整体数量却令人印象深刻。平均而言,在 FLOSS 上公司发布的职位中有超过 1/3 的职位要求 Java 技能。这对几年前没有在榜单上出现的语言而言是一个壮举。而且,由于它与 Android 的大量使用,未来这个数字增加也并不奇怪。 -Another language that is used prominently in the application space is C++. While its numbers can't quite compete with that of Java, it still commands a large marketshare in this arena. Whereas Java is asked for in 1 of 3 postings, C++ is required in 1 of 4\. Much like that of Java, its numbers have remained relatively stable over the last six quarters. C++ has always been heavily utilized, and even though Java has superseded it, it remains a highly relevant language. +在应用程序领域中使用的另一种语言是 C++。虽然它的数量不能与 Java 竞争,但它仍然在这个领域占据了很大的市场份额。而且 3 个招聘中有一个要求 Java,C++ 是 4 个中有一个要求。与 Java 类似,其数字在过去六个季度中保持相对稳定。C++一直被大量使用,即使 Java 已经取代它,它仍然是一种高度相关的语言。 +进入到网络应用领域,多年来一直在改变领导者。在早期,大多数 Web 程序明确选择使用 PHP 开发。正如之前关于脚本的文章所讨论的,这几年来已经发生了变化。在过去几年中,PHP 的使用似乎有所恶化。在过去一年半的时间里,已经急剧下降了 30% 以上。这是一个令人震惊的数字,只有时间才能确定趋势是否持续。 -Moving toward the web application space, there has been a changing of the guard over the years. Early on, the clear choice was to develop most web applications utilizing PHP. As was discussed in the previous article on scripting, this has changed over the years. There appears to have been some deterioration in the usage of PHP in the last couple of years. In the last year and a half alone, there has been a precipitous decline of over 30%. That is an alarming number, and only time will tell if the trend continues.  +最初打破 PHP 领导的最初是 Ruby on Rails。多年来,我看到公司和开发商进行了这一转型。Ruby on Rails 经历了一段时间,在这个时期它是这个领域的首选语言。然而,从我们收集的数字来看,它的光泽似乎已经失去了一点优势。虽然没有像 PHP 这样的衰退,但其数量一直保持相对平稳,所以它曾经经历的增长似乎停滞不前。 -Claiming some of PHP's thunder initially was that of Ruby on Rails. For a number of years, I watched companies and developers make that transition. Ruby on Rails went through a period of time where it was “the” language of choice in this space. However, from the numbers we have gathered, it appears that its luster has lost a little of its edge. While it is not experiencing any kind of decline like that of PHP, its numbers have been remained relatively flat, so the growth that it once experienced appears to have stagnated. +目前在网络应用程序领域的王者似乎是 Javascript。它获得了最大的总数。虽然它的数量保持平坦,这很像 Ruby on Rails,但它已经吸引了更多的观众。平均来说,过去六个季度,公司在分析的 10,000 份工作清单中有 1,500 份需要 Javascript 技能。这比 PHP 或 Ruby on Rails 多了 70%。 +随着 PHP 的衰落以及 Ruby on Rails 和 Javascript 停滞不前,有什么在 Web 程序领域增长的么?这个群体的突出者似乎是 Golang。它在 2007 年由 Google 内的几位开发人员创建,似乎这种语言开始获得更广泛的受众群体。虽然与其他三个讨论的总体数字相比,总体看起来比去年同期增长了 50%。如果这种趋势继续下去,那将是非常有趣的。在我看来,我预计我们会继续以牺牲其他三个的群体来获得 Golang 的增长。 -The king of the hill, at the moment, in the web application space appears to be Javascript. It garners the largest overall numbers. While its numbers have remained flat, much like Ruby on Rails, it has amassed a larger audience. On average over the last six quarters, companies are requiring Javascript skills in 1,500 of the 10,000 job listings analyzed. That is nearly 70% more than either PHP or Ruby on Rails.  - -With PHP in decline and Ruby on Rails and Javascript stagnate, is anyone in the web application space growing? The outlier in this group seems to be Golang. Created by a couple of developers inside Google in 2007, it appears that this language is starting to gain a wider audience. While the overall numbers pale in comparison to the other three discussed, it has seen a 50% increase in the last year and a half. It will be very interesting to watch if this trend continues. In my opinion, I expect that we will continue to see gains in Golang at the expense of the other three. - - -As always, we will monitor each of these languages moving forward to watch trends in the marketplace. And, a keen eye will be kept on any new entrants that enter the radar. It is an exciting and dynamic area of development; one that will provide results that are ever-changing over time. +如往常一样,我们会监测这些语言的各种前进方向,以观察市场趋势。而且,榜单的任何新进入者都会被密切关注。这是一个令人兴奋和动态的发展领域。一个会提供随时间不断变化的结果。 -------------------------------------------------------------------------------- via: https://www.linuxcareer.com/do-you-have-what-it-takes-to-be-a-software-developer 作者:[Brent Marinaccio ][a] -译者:[译者ID](https://github.com/译者ID) +译者:[geekpi](https://github.com/geekpi) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 diff --git a/translated/talk/20170616 Do you have what it takes to be a software developer.md b/translated/talk/20170616 Do you have what it takes to be a software developer.md new file mode 100644 index 0000000000..3dec6cc692 --- /dev/null +++ b/translated/talk/20170616 Do you have what it takes to be a software developer.md @@ -0,0 +1,34 @@ +# 成为一名软件开发者需要些什么? + +![](https://www.linuxcareer.com/images/software_developer_skills.jpg) + +应用程序是在应用领域。底层的 Linux 做了很多工作,而且还在继续,但是在过去几年里,应用程序领域开始增长。在这种情况下,开发人员使用哪种语言构建这些应用程序?简而言之,要看情况,我所了解的并不是一个巨大的惊喜。但是,随着我们逐渐拥有的数据,我们可以确定哪些语言领先。 + +发现自己在领先的语言是 Java。它已经围绕开源软件15年以上,但情况并不总是如此。在早期,我们没有看到很多对 java 开发者的兴趣,但这个男孩已经改变了。它是目前应用领域的权威领导者。虽然数字在过去六个季度没有增长,但整体数量却令人印象深刻。平均而言,在 FLOSS 上公司发布的职位中有超过 1/3 的职位要求 Java 技能。这对几年前没有在榜单上出现的语言而言是一个壮举。而且,由于它与 Android 的大量使用,未来这个数字增加也并不奇怪。 + +在应用程序领域中使用的另一种语言是 C++。虽然它的数量不能与 Java 竞争,但它仍然在这个领域占据了很大的市场份额。而且 3 个招聘中有一个要求 Java,C++ 是 4 个中有一个要求。与 Java 类似,其数字在过去六个季度中保持相对稳定。C++一直被大量使用,即使 Java 已经取代它,它仍然是一种高度相关的语言。 + + +进入到网络应用领域,多年来一直在改变领导者。在早期,大多数 Web 程序明确选择使用 PHP 开发。正如之前关于脚本的文章所讨论的,这几年来已经发生了变化。在过去几年中,PHP 的使用似乎有所恶化。在过去一年半的时间里,已经急剧下降了 30% 以上。这是一个令人震惊的数字,只有时间才能确定趋势是否持续。 + +最初打破 PHP 领导的最初是 Ruby on Rails。多年来,我看到公司和开发商进行了这一转型。Ruby on Rails 经历了一段时间,在这个时期它是这个领域的首选语言。然而,从我们收集的数字来看,它的光泽似乎已经失去了一点优势。虽然没有像 PHP 这样的衰退,但其数量一直保持相对平稳,所以它曾经经历的增长似乎停滞不前。 + +目前在网络应用程序领域的王者似乎是 Javascript。它获得了最大的总数。虽然它的数量保持平坦,这很像 Ruby on Rails,但它已经吸引了更多的观众。平均来说,过去六个季度,公司在分析的 10,000 份工作清单中有 1,500 份需要 Javascript 技能。这比 PHP 或 Ruby on Rails 多了 70%。 + +随着 PHP 的衰落以及 Ruby on Rails 和 Javascript 停滞不前,有什么在 Web 程序领域增长的么?这个群体的突出者似乎是 Golang。它在 2007 年由 Google 内的几位开发人员创建,似乎这种语言开始获得更广泛的受众群体。虽然与其他三个讨论的总体数字相比,总体看起来比去年同期增长了 50%。如果这种趋势继续下去,那将是非常有趣的。在我看来,我预计我们会继续以牺牲其他三个的群体来获得 Golang 的增长。 + +如往常一样,我们会监测这些语言的各种前进方向,以观察市场趋势。而且,榜单的任何新进入者都会被密切关注。这是一个令人兴奋和动态的发展领域。一个会提供随时间不断变化的结果。 + +-------------------------------------------------------------------------------- + +via: https://www.linuxcareer.com/do-you-have-what-it-takes-to-be-a-software-developer + +作者:[Brent Marinaccio ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.linuxcareer.com/do-you-have-what-it-takes-to-be-a-software-developer +[1]:https://www.linuxcareer.com/skills-watch +[2]:https://www.linuxcareer.com/do-you-have-what-it-takes-to-be-a-software-developer# From 818bf146ffd99c14f0e353b5fd7c5ddc7d2aa93b Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 14 Jul 2017 08:47:19 +0800 Subject: [PATCH 0674/1407] translated --- ...hat it takes to be a software developer.md | 34 ------------------- 1 file changed, 34 deletions(-) delete mode 100644 sources/talk/20170616 Do you have what it takes to be a software developer.md diff --git a/sources/talk/20170616 Do you have what it takes to be a software developer.md b/sources/talk/20170616 Do you have what it takes to be a software developer.md deleted file mode 100644 index 3dec6cc692..0000000000 --- a/sources/talk/20170616 Do you have what it takes to be a software developer.md +++ /dev/null @@ -1,34 +0,0 @@ -# 成为一名软件开发者需要些什么? - -![](https://www.linuxcareer.com/images/software_developer_skills.jpg) - -应用程序是在应用领域。底层的 Linux 做了很多工作,而且还在继续,但是在过去几年里,应用程序领域开始增长。在这种情况下,开发人员使用哪种语言构建这些应用程序?简而言之,要看情况,我所了解的并不是一个巨大的惊喜。但是,随着我们逐渐拥有的数据,我们可以确定哪些语言领先。 - -发现自己在领先的语言是 Java。它已经围绕开源软件15年以上,但情况并不总是如此。在早期,我们没有看到很多对 java 开发者的兴趣,但这个男孩已经改变了。它是目前应用领域的权威领导者。虽然数字在过去六个季度没有增长,但整体数量却令人印象深刻。平均而言,在 FLOSS 上公司发布的职位中有超过 1/3 的职位要求 Java 技能。这对几年前没有在榜单上出现的语言而言是一个壮举。而且,由于它与 Android 的大量使用,未来这个数字增加也并不奇怪。 - -在应用程序领域中使用的另一种语言是 C++。虽然它的数量不能与 Java 竞争,但它仍然在这个领域占据了很大的市场份额。而且 3 个招聘中有一个要求 Java,C++ 是 4 个中有一个要求。与 Java 类似,其数字在过去六个季度中保持相对稳定。C++一直被大量使用,即使 Java 已经取代它,它仍然是一种高度相关的语言。 - - -进入到网络应用领域,多年来一直在改变领导者。在早期,大多数 Web 程序明确选择使用 PHP 开发。正如之前关于脚本的文章所讨论的,这几年来已经发生了变化。在过去几年中,PHP 的使用似乎有所恶化。在过去一年半的时间里,已经急剧下降了 30% 以上。这是一个令人震惊的数字,只有时间才能确定趋势是否持续。 - -最初打破 PHP 领导的最初是 Ruby on Rails。多年来,我看到公司和开发商进行了这一转型。Ruby on Rails 经历了一段时间,在这个时期它是这个领域的首选语言。然而,从我们收集的数字来看,它的光泽似乎已经失去了一点优势。虽然没有像 PHP 这样的衰退,但其数量一直保持相对平稳,所以它曾经经历的增长似乎停滞不前。 - -目前在网络应用程序领域的王者似乎是 Javascript。它获得了最大的总数。虽然它的数量保持平坦,这很像 Ruby on Rails,但它已经吸引了更多的观众。平均来说,过去六个季度,公司在分析的 10,000 份工作清单中有 1,500 份需要 Javascript 技能。这比 PHP 或 Ruby on Rails 多了 70%。 - -随着 PHP 的衰落以及 Ruby on Rails 和 Javascript 停滞不前,有什么在 Web 程序领域增长的么?这个群体的突出者似乎是 Golang。它在 2007 年由 Google 内的几位开发人员创建,似乎这种语言开始获得更广泛的受众群体。虽然与其他三个讨论的总体数字相比,总体看起来比去年同期增长了 50%。如果这种趋势继续下去,那将是非常有趣的。在我看来,我预计我们会继续以牺牲其他三个的群体来获得 Golang 的增长。 - -如往常一样,我们会监测这些语言的各种前进方向,以观察市场趋势。而且,榜单的任何新进入者都会被密切关注。这是一个令人兴奋和动态的发展领域。一个会提供随时间不断变化的结果。 - --------------------------------------------------------------------------------- - -via: https://www.linuxcareer.com/do-you-have-what-it-takes-to-be-a-software-developer - -作者:[Brent Marinaccio ][a] -译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.linuxcareer.com/do-you-have-what-it-takes-to-be-a-software-developer -[1]:https://www.linuxcareer.com/skills-watch -[2]:https://www.linuxcareer.com/do-you-have-what-it-takes-to-be-a-software-developer# From eb62969af7aaf2b757543256bfb8529dc49dc73e Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 14 Jul 2017 08:52:04 +0800 Subject: [PATCH 0675/1407] translating --- ...shit. Shut up and get the work done – says Linus Torvalds.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/talk/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md b/sources/talk/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md index 422a2872d9..f8c8033476 100644 --- a/sources/talk/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md +++ b/sources/talk/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md @@ -1,3 +1,5 @@ +translating----geekpi + Talk of tech innovation is bullsh*t. Shut up and get the work done – says Linus Torvalds ============================================================ From b64ee14802a600875a08117b5a0020df1217ac77 Mon Sep 17 00:00:00 2001 From: stevenzdg988 Date: Fri, 14 Jul 2017 09:25:04 +0800 Subject: [PATCH 0676/1407] stevenzdg988 translating --- ...to Libral a systems management library for Linux.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md b/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md index a588baa3cb..e79a7cf217 100644 --- a/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md +++ b/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md @@ -39,12 +39,17 @@ In fact, the above example is not correct: **grep** doesn't look for the **ap Clearly, management tools that make it hard to perform simple tasks from scripts are, at best, a difficult basis for larger management systems. Recognizing this, existing configuration-management systems, such as Puppet, Chef, or Ansible, have gone to great lengths to build their own internal APIs around the management of basic operating system resources. These resource abstractions are internal APIs, and closely tied to the needs of their respective tools. This causes not only a colossal duplication of effort, but also creates a strong barrier to entry for new and innovative management tools. - +很显然,管理工具很难从脚本执行简单的任务,在最好的情况下,对于一个较大的基础管理系统是困难的。认识到这一点,退出配置管理系统,比如 Puppet,Chef,及 Ansible,围绕基本操作系统资源管理竭尽全力的建立其内部的 API 就是明智的。这些资源由各自需要的密切相关的工具抽象成内部的 API。这不仅导致大量的重复性工作,也为尝试一个新的和创新管理工具设置了强大的障碍。 One area where this barrier to entry becomes evident is in building VM or container images: In the course of building such images, it is often necessary to either answer simple questions about them or make simple changes to them. But since the tools for this all require special treatment, these questions and changes face exactly the problems that somebody trying to script them faces. As a consequence, image building must rely on either ad hoc scripts or using (and installing) a quite substantial configuration-management system. +突破创建虚拟机(VM)或者图像容器这一领域就变得非常清晰:比如在创建图像的过程中,要么回答关于其的简单问题要么对其进行简单的更改是非常必要的。但是要使工具完成所有的任务需要特殊的处理,这些问题和变化将遇到一些人试图利用脚本精确解决的问题。因此,图像构建要么依靠特定的脚本要么使用(安装)一个相当强大的配置管理系统。 + [Libral][11] establishes a solid foundation for management tools and tasks by providing a common management API across system resources and by making it available through a command line tool, **ralsh**, that enables users to query and to modify system resources in a uniform way, with predictable error reporting. In the above example, checking whether the app user exists is done with **ralsh -aq user app**; checking whether the package **foo** is installed is done with **ralsh -aq package foo**; and, in general, checking whether a resource of type **TYPE** with name **NAME** is present is done with **ralsh -aq TYPE NAME**. Similarly, to create or change an existing user, one runs: +Libral 将为管理工具和任务提供一个可靠的保证,通过系统资源提供通常管理的 API ,通过命令行工具是制作成为可能,"ralsh",允许用户按照相同的方法查询和修改系统资源,能够有可预见的错误报告。通过以上的举例,通过命令“ralsh -aq user app"检查“app”用户是否存在;通过”ralsh -aq package foo"检查“foo”包文件是否已经被安装;一般情况下,通过命令“ralsh -aq TYPE NAME"检查”NAME“是否是”TYPE“资源类型。类似的,创建和更改存在的用户,可以运行: + + ```     ralsh user app home=/srv/app shell=/sbin/nologin ``` @@ -58,6 +63,9 @@ and to create or change an entry in **/etc/hosts**, one runs: In this manner, the user of ralsh is isolated from the fact that these two commands work quite differently internally: The first one needs to use the proper invocation of **useradd** or **usermod**, whereas the second needs to edit the file **/etc/hosts**. For the user, though, they both appear to take the same shape: "Make sure that this resource is in the state that I need." + + + ### Where to get Libral and how to use it Libral is available from [this git repo][12]. Its core is written in C++, and instructions for building it can be found [in the repo][13]. That is only necessary if you actually want to contribute to Libral's C++ core. The Libral site also contains a [prebuilt tarball][14] that can be used on any Linux machine that uses **glibc 2.12** or later. The contents of that tarball can be used both to explore ralsh further and to develop new providers, which give Libral the capability to manage new kinds of resources. From 52d7411f2a9d3452354923176a514ac35da12b97 Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 14 Jul 2017 15:29:03 +0800 Subject: [PATCH 0677/1407] PRF:20170622 8 ways to contribute to open source when you have no time.md @geekpi --- ...te to open source when you have no time.md | 45 +++++++++---------- 1 file changed, 21 insertions(+), 24 deletions(-) diff --git a/translated/tech/20170622 8 ways to contribute to open source when you have no time.md b/translated/tech/20170622 8 ways to contribute to open source when you have no time.md index 8f67d79394..e6b52f07af 100644 --- a/translated/tech/20170622 8 ways to contribute to open source when you have no time.md +++ b/translated/tech/20170622 8 ways to contribute to open source when you have no time.md @@ -1,48 +1,43 @@ -当没有时间的时候,8种为开源做贡献的方式 +在你没有时间的时候,8 种为开源做贡献的方式 ============================================================ -### 在忙碌的生活中抽出时间回馈给你关心的项目。 +> 在忙碌的生活中抽出时间回馈给你关心的项目。 ![8 ways to contribute to open source when you have no time](https://opensource.com/sites/default/files/styles/image-full-size/public/images/law/LAW-patent_reform_520x292_10136657_1012_dc.png?itok=zLMswcrw "8 ways to contribute to open source when you have no time") -图片提供: opensource.com -人们不给开源做贡献(或不贡献更多)的[常见原因][3]之一是缺乏时间。我了解生活是有挑战性的,有这么多的优先的事情争夺你有限的注意力。那么,如何才能在忙碌的生活中为你关心的开源项目抽出时间呢? +人们不给开源做贡献(或不能做更多贡献)的[最常见的原因][3]之一是缺乏时间。我了解生活是有挑战性的,有这么多的优先的事情争夺你有限的注意力。那么,如何才能在忙碌的生活中为你关心的开源项目抽出时间呢? -为了充分说明,我应该警告你,我推迟了将这篇文章给编辑,因为我抽不出时间在这上面。请自行承担风险。 +为了充分披露,我需要提醒你,我延误了把这篇文章给编辑的时间,因为我抽不出时间写它,所以是否接受我的建议,请自行承担风险。 ### 找出你关心的 -贡献的第一步是弄清楚你正在做些什么。你有想要贡献的项目吗?有没有一个你想要帮助的具体项目?你只想做_一些_事情吗?弄清楚你正在做的事情将帮助你决定你的生活中的优先事项。 +贡献的第一步是弄清楚你正在做些什么。你有一个想要贡献的自己的项目吗?有没有一个你想要帮助的具体项目?或者你只是想做_某个事情_?弄清楚你正在做的事情将帮助你决定你的生活中的优先事项。 ### 找出其他的方法贡献 -编写新功能可能需要数小时的设计、编码和测试。离开之后在几分钟之内从原来的地方重新开始并不容易。如果你没有大于 30 分钟的无中断工作并且你承担的是一个大的任务,你或许会感到沮丧。 +编写新功能可能需要数小时的设计、编码和测试。这对于那种只有几分钟时间就得离开,然后从原来的地方重新开始的情况下并不容易。如果你没有办法进行长于 30 分钟的无中断工作,当你试着完成一个大的任务时,你或许会感到沮丧。 -但还有其他方式可以帮助满足你在空闲的时间内回馈。其中一些可以通过智能手机快速完成,这意味着人们避免在通勤上浪费时间,并将其用于开源贡献。以下是可以在小块时间中完成的一些事情列表: - -* **Bug 分类:** 所有的 bug 报告都有必要的信息来诊断和解决它们么?它们是否妥善提交(给正确的范围,正确的严重程度等)了么? +但还有其它的或许可以满足你的需求的贡献方式,可以让你利用起来空闲的时间。其中一些可以通过智能手机快速完成,这意味着人们避免在通勤上浪费时间,并将其用于开源贡献。以下是可以在小块时间中完成的一些事情列表: +* **Bug 分类:** 所有的 bug 报告都有必要的信息来诊断和解决它们么?它们是否妥善提交(给出正确的范围,正确的严重程度等)了么? * **邮件列表支持:** 用户或其他贡献者在邮件列表中提出问题?也许你可以帮忙。 - -* **文档修补:** 文档可以经常(但不总是)比代码用更小块的时间来处理。也许有几个地方你可以填写,或者也许是时候浏览一下文档,并确保它们仍然准确。 - -* **营销:** 在社交媒体上谈论你的项目或者社区。写一篇快速入门博文。投票并评论新闻聚合。 +* **文档修补:** 文档可以经常(但不总是)比代码用更小块的时间来处理。也许有几个地方你可以补充,或者也许是时候浏览一下文档,并确保它们仍然准确。 +* **营销:** 在社交媒体上谈论你的项目或者社区。写一篇快速入门博文。在新闻聚合里投票和评论。 ### 与你的老板交谈 -你可能会认为在工作日你不能在开源项目上工作,但是你有_问过么_? 特别是如果这个项目以某种方式与你的日常工作相关,那你可能可以卖掉你的老板,让你可在工作时做出贡献。请注意,可能存在一些知识产权问题(例如,谁拥有你在工作时间内提供的代码的权利),因此首先做你的研究并以书面形式获得授权。 +你可能会认为在上班时间里你不能在开源项目上工作,但是你有_问过么_? 特别是如果这个项目以某种方式与你的日常工作相关,那你或许可以和你的老板沟通,让你可在工作时做出贡献。请注意,这可能存在一些知识产权问题(例如,谁拥有你在工作时间内提供的代码的权利),因此首先做你的研究并以书面形式获得授权。 ### 设置最后期限 -我得到的最佳时间管理建议可以归纳为两个规则: +我所学到的最佳时间管理建议可以归纳为两个规则: 1. 如果要完成,它必须有一个截止日期 - 2. 可以更改最后期限 -这篇文章有一个最后期限。它没有特别的时间敏感性,但最后期限意味着我定义了什么时候想完成它,并给编辑者一个什么时候可以提交的感觉。是的,如上所述,我错过了最后期限。你知道发生了什么事么?我设定了一个新的期限(第二次是个魅力!)。 +这篇文章有一个最后期限。它没有特别的时间敏感性,但最后期限意味着我定义了什么时候想完成它,并给编辑一个什么时候可以提交的感觉。是的,如上所述,我错过了最后期限。你知道发生了什么事么?我设定了一个新的期限(二手才棒!)。 -如果有些事_是_时间敏感的,如果你需要返工一两次,设置最后期限可以给你一些空间。 +如果有些事_是_时间敏感的,在你需要返工一两次时,设置最后期限可以给你一些空间。 ### 将它放到你的日程上 @@ -56,20 +51,22 @@ ### 停止 -有时,贡献最好的方式是一点不贡献。你是一个忙碌的人,不管你是多么的棒,你不能避免你的生理和心理需要。它们会找上你。花点时间来休息,这可以提高你的生产力,使你的工作更快,突然间你就有时间去做那些你一直想做的开源贡献了。 +有时,贡献最好的方式是一点不贡献。你是一个忙碌的人,不管你是多么的棒,你不能避免你的生理和心理需要,它们会找上你。花点时间来休息,这可以提高你的生产力,使你的工作更快,突然间你就有时间去做那些你一直想做的开源贡献了。 ### 说“不” 我不擅长这个,所以这很糟糕。但是没有人能做任何想做的事情。有时候,你可以做的最好的事情是停止贡献,就像以前一样,或者没有贡献(参见上文)。 -几年前,我领导了 Fedora 文档团队。团队的传统是,在每次发布结束时, 领导会主动提出靠边站。我已经做了一两次,没有人加强,所以我保持着这个角色。但是在我的第二或第三次发布之后,我明确表示,我不会继续担任团队领导。我还是很喜欢这份工作,但我正在全职工作,在研究生一半时,我的妻子怀了我们的第一个孩子。我没有办法做到始终如一的努力,所以我退出领导了。我继续做出贡献,但是在要求较低的能力的位置中。 +几年前,我领导了 Fedora 文档团队。团队的传统是,在每次发布结束时, 领导会主动提出靠边站。我已经做了一两次,没有人加强其作用替代我,所以我保持着这个角色。但是在我的第二或第三次发布之后,我明确表示,我不会继续担任团队领导。我还是很喜欢这份工作,但我正在全职工作,在研究生读到一半时,我的妻子怀了我们的第一个孩子。我没有办法做到始终如一的努力,所以我退出领导了。我继续做出贡献,但是在要求较低的能力的位置中。 -如果你正在努力抽出时间来满足你的义务(自我强加或者不是),那么也许现在是重新考虑你的角色了。你建立的可能是一个特别困难的项目或者考虑让投资进入。但有时你不得不这么做-为了你自己好以及项目本身。 +如果你正在努力抽出时间来满足你的义务(自我强加的或者不是),那么也许现在是重新考虑你的角色了。你建立的可能是一个特别困难的项目或者考虑让投资进入。但有时你不得不这么做-为了你自己好以及项目本身。 ### 其他还有什么? 你如何找到时间作出贡献? 让我们在评论中知道。 +(题图: opensource.com) + -------------------------------------------------------------------------------- 作者简介: @@ -81,9 +78,9 @@ Ben Cotton - Ben Cotton 是一个培训过的气象学家和一个职业的高 via: https://opensource.com/article/17/6/find-time-contribute -作者:[Ben Cotton ][a] +作者:[Ben Cotton][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/) 荣誉推出 From ccfa4477a014f4d6a572ca9591907a0e2cda1f90 Mon Sep 17 00:00:00 2001 From: stevenzdg988 Date: Fri, 14 Jul 2017 16:21:11 +0800 Subject: [PATCH 0678/1407] stevenzdg988 translating --- ... a systems management library for Linux.md | 48 ++++++++++++++++++- 1 file changed, 46 insertions(+), 2 deletions(-) diff --git a/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md b/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md index e79a7cf217..7ceb8c8b9d 100644 --- a/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md +++ b/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md @@ -2,7 +2,7 @@ Translating by stevenzdg988. An introduction to Libral, a systems management library for Linux -Libral,开源的 Linux 系统管理库入门 +Libral,开源的 Linux 系统管理库 ============================================================ @@ -56,6 +56,9 @@ Libral 将为管理工具和任务提供一个可靠的保证,通过系统资 and to create or change an entry in **/etc/hosts**, one runs: +接下来创建和修改入口文件 “/etc/hosts",可以运行命令: + + ``` ralsh hostmyhost.example.com ip=10.0.0.1 \ host_aliases=myhost,apphost @@ -63,41 +66,82 @@ and to create or change an entry in **/etc/hosts**, one runs: In this manner, the user of ralsh is isolated from the fact that these two commands work quite differently internally: The first one needs to use the proper invocation of **useradd** or **usermod**, whereas the second needs to edit the file **/etc/hosts**. For the user, though, they both appear to take the same shape: "Make sure that this resource is in the state that I need." - +以这种方式运行,用户的 ”ralsh“ 在内部运行是完全不同的,事实上是分离开执行的:第一步需要适当的调用命令”useradd“或者”usermod“,然而第二步需要在”/etc/hosts"文件中进行编辑。对于用户来说,他们似乎都采取同样的模型:“确保资源就是我所所需要的。” ### Where to get Libral and how to use it +怎样获取和使用 Libral 呢? + + Libral is available from [this git repo][12]. Its core is written in C++, and instructions for building it can be found [in the repo][13]. That is only necessary if you actually want to contribute to Libral's C++ core. The Libral site also contains a [prebuilt tarball][14] that can be used on any Linux machine that uses **glibc 2.12** or later. The contents of that tarball can be used both to explore ralsh further and to develop new providers, which give Libral the capability to manage new kinds of resources. +Libral可以在[this git repo][12]找到并下载。核心是由C++编写的,创建他的说明可以在[in the repo][13]查找到。如果你真的想要为Libral 的 C++ 核心做贡献的话是很有必要的。Libral 的网站上包含了一个[prebuilt tarball][14],可以在任何 Linux 机器上使用“glibc 2.12”或者更高版本。可以使该“tarball”的内容链接进一步探究 ralsh 和开发新的供应商,这样做就使得 Libral 具备了管理新类型资源的能力。 + + After downloading and unpacking the tarball, the **ralsh** command can be found in **ral/bin**. Running it without arguments will list all resource types that Libral knows about. Passing the **--help **option prints output that contains more example of how to use **ralsh**. +下载完毕后解压“tarball”,“ralsh”命令就会生成在目录“ral/bin”下。运行这个不需要任何参数的命令就会将 Libral 所知道所有资源类型列举出来。利用“--help“选项打印输出关于”ralsh“更多的实例。 + + ### Relationship to configuration-management systems +如何配置管理系统 + + Well-known configuration-management systems, such as Puppet, Chef, or Ansible, address some of the same problems that Libral addresses. What sets Libral apart from them is mostly in the things that these systems do and Libral doesn't. Configuration-management systems are built to deal with the variety and complexity of managing many different things across large numbers of nodes. Libral, on the other hand, aims at providing a low-level systems management API that is well-defined, independent of any particular tool, and usable with a wide variety of programming languages. +众所周知配置管理系统,如 Puppet,Chef,及 Ansible,地址等相同的问题是 Libral 的地址。这就是为什么一般将 Libral 与其他设置分离开的原因,即让系统去执行。配置管理系统被创建处理多样复杂的通过管理大量的节点的多事务管理行为。Libral,在另一方面, +旨在提供一个低级别的定义明确的系统管理 API 独立于任何特定的工具,可用各种各样的编程语言进行设计。 + By removing the application logic that the large configuration-management systems contain, Libral is much more versatile in how it can be used, from the simple scripting tasks mentioned in the introduction, to serving as the building blocks for complex management applications. Focusing on these basics also allows it to be very small, currently less than 2.5 MB, an important consideration for resource-constrained environments, including containers and small devices. +通过消除大量的配置管理系统中包含的应用程序逻辑,Libral在怎样使用方面是非常万能的,从简单的脚本任务介绍中提到的,为构建复杂的管理应用程序块服务。专注与这些基础之外,还允许它很小,目前小于 2.5 MB,一个重要的考虑就是资源严重受限的环境包括容器和小型设备。 + ### The Libral API +Libral API + The design of the Libral API is guided by the experience of implementing large configuration-management systems over the last decade; while it is not directly tied to any of them, it takes them into account and makes choices to overcome their shortcomings. +在过去的十年里,Libral API 设计指导下实施配置管理上的经验,虽然不是解绑定到其中任何一个应用上,但需要考虑这些问题,做出选择克服他们的缺点。 + + There are four important principles that the API design rests on: +四个重要的 API 设计原则 + * Desired state  +期望的声明 + * Bidirectionality  +双向性 + * Lightweight abstractions +轻量级的抽象 + * Ease of extension +平行程式扩展 + Basing a management API on desired state, i.e., the idea that the user expresses what the system should look like after an operation rather than how to get into that state, is hardly controversial at this point. Bidirectionality makes it possible to use the same API and, more importantly, the same resource abstractions to read existing state and to enforce changes to it. Lightweight abstractions ensure that it is easy to learn the API and make use of it quickly; past attempts at such management APIs have unduly burdened the user with learning a modeling framework, an important factor in their lack of adoption. +给予期望状态管理API,举个例子来说,这个理解应该是当用户在一个操作执行后希望系统看起来是什么表达方式,而不是怎么进入这个状态,在这一点上很难引起争议。双向性使得使用相同的 API 成为可能,更重要的是,相同的资源抽象成读取已经存在的和强制改变它。轻量级的抽象行为确保能容易的学习和快速的使用API;过去尝试管理 API 的方式已经过度的加重了学习框架建模的使用者的负担了,一个重要的因素是他们的接受力缺乏。 + + Finally, it has to be easy to extend Libral's management capabilities so that users can teach Libral how to manage new kinds of resources. This is important both because of the sheer amount of resources that one might want to manage (and that Libral will manage in due time), as well as because even a fully built-out Libral will always fall short of a user's custom management needs. +终于,它必须易于扩展 Libral 的管理功能,这样用户可以让 Libral 如何管理新类型的资源。这很重要,因为绝对数量的资源,一种情况可能需要管理(Libral 将在适当时间进行管理),再者,因为既是一个完全成熟的 Libral 也总是存在达不到用户自定义的管理需求。 + + Currently, the main way to interact with the Libral API is through the **ralsh **command line tool. It exposes the underlying C++ API, which is still in flux, and is mainly geared at simple scripting tasks. The project also provides language bindings for CRuby, with others to follow. + + + In the future, Libral will also provide a daemon with a remote API, so that it can serve as the basis for management systems that do not need to install additional agents on managed nodes. This, coupled with the ability to tailor the management capabilities of Libral, makes it possible to tightly control which aspects of a system can be managed and which ones are protected from any interference. For example, a Libral installation that is restricted to managing users and services will be guaranteed to not interfere with the packages installed on a node. Controlling what gets managed in this manner is currently not possible with any of the existing configuration-management systems; in particular, systems that require arbitrary SSH access to a managed node also expose that system to unwanted accidental or malicious interference. From f20f1bb0016746218e7093fd62089438911b84a2 Mon Sep 17 00:00:00 2001 From: feng lv Date: Fri, 14 Jul 2017 17:03:40 +0800 Subject: [PATCH 0679/1407] ucasFL translating --- .../20170330 Study Ruby Programming with Open-Source Books.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170330 Study Ruby Programming with Open-Source Books.md b/sources/tech/20170330 Study Ruby Programming with Open-Source Books.md index 20ac5cf826..1a70fec73a 100644 --- a/sources/tech/20170330 Study Ruby Programming with Open-Source Books.md +++ b/sources/tech/20170330 Study Ruby Programming with Open-Source Books.md @@ -1,3 +1,5 @@ +ucasFL translating + STUDY RUBY PROGRAMMING WITH OPEN-SOURCE BOOKS ============================================================ From dee92affceeee3e1f4c928a2fccdfd1e66ce11ea Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 15 Jul 2017 00:21:01 +0800 Subject: [PATCH 0680/1407] PUB:20170622 8 ways to contribute to open source when you have no time.md @geekpi --- ...te to open source when you have no time.md | 34 +++++++++---------- 1 file changed, 17 insertions(+), 17 deletions(-) rename {translated/tech => published}/20170622 8 ways to contribute to open source when you have no time.md (60%) diff --git a/translated/tech/20170622 8 ways to contribute to open source when you have no time.md b/published/20170622 8 ways to contribute to open source when you have no time.md similarity index 60% rename from translated/tech/20170622 8 ways to contribute to open source when you have no time.md rename to published/20170622 8 ways to contribute to open source when you have no time.md index e6b52f07af..920a2b60b1 100644 --- a/translated/tech/20170622 8 ways to contribute to open source when you have no time.md +++ b/published/20170622 8 ways to contribute to open source when you have no time.md @@ -1,32 +1,32 @@ -在你没有时间的时候,8 种为开源做贡献的方式 +8 种在你没有时间的时候为开源做贡献的方式 ============================================================ > 在忙碌的生活中抽出时间回馈给你关心的项目。 ![8 ways to contribute to open source when you have no time](https://opensource.com/sites/default/files/styles/image-full-size/public/images/law/LAW-patent_reform_520x292_10136657_1012_dc.png?itok=zLMswcrw "8 ways to contribute to open source when you have no time") -人们不给开源做贡献(或不能做更多贡献)的[最常见的原因][3]之一是缺乏时间。我了解生活是有挑战性的,有这么多的优先的事情争夺你有限的注意力。那么,如何才能在忙碌的生活中为你关心的开源项目抽出时间呢? +人们不给开源做贡献(或不能做更多贡献)的[最常见的原因][3]之一是缺乏时间。人艰不拆,有这么多的优先的事情争夺你有限的注意力。那么,如何才能在忙碌的生活中为你关心的开源项目抽出时间呢? 为了充分披露,我需要提醒你,我延误了把这篇文章给编辑的时间,因为我抽不出时间写它,所以是否接受我的建议,请自行承担风险。 -### 找出你关心的 +### 找出你所关心的 -贡献的第一步是弄清楚你正在做些什么。你有一个想要贡献的自己的项目吗?有没有一个你想要帮助的具体项目?或者你只是想做_某个事情_?弄清楚你正在做的事情将帮助你决定你的生活中的优先事项。 +贡献的第一步是弄清楚你正在做些什么。你有一个你自己的为之努力的项目吗?有没有一个你想要帮助的具体项目?或者你只是想做_某个事情_?弄清楚你正在做的事情将帮助你决定你的生活中的优先事项。 ### 找出其他的方法贡献 -编写新功能可能需要数小时的设计、编码和测试。这对于那种只有几分钟时间就得离开,然后从原来的地方重新开始的情况下并不容易。如果你没有办法进行长于 30 分钟的无中断工作,当你试着完成一个大的任务时,你或许会感到沮丧。 +编写新功能可能需要数小时的设计、编码和测试。这对于那种只有几分钟时间就得离开,然后再从原来的地方重新开始的情况下并不容易。如果你没有办法进行长于 30 分钟的无中断工作,当你试着完成一个大的任务时,你或许会感到沮丧。 -但还有其它的或许可以满足你的需求的贡献方式,可以让你利用起来空闲的时间。其中一些可以通过智能手机快速完成,这意味着人们避免在通勤上浪费时间,并将其用于开源贡献。以下是可以在小块时间中完成的一些事情列表: +但还有或许可以满足你的需求的其它贡献方式,可以让你利用起来空闲的时间。其中一些可以通过智能手机快速完成,这意味着人们可以避免在通勤上浪费时间,并将其用于开源贡献。以下是可以在小块时间中完成的一些事情列表: * **Bug 分类:** 所有的 bug 报告都有必要的信息来诊断和解决它们么?它们是否妥善提交(给出正确的范围,正确的严重程度等)了么? -* **邮件列表支持:** 用户或其他贡献者在邮件列表中提出问题?也许你可以帮忙。 -* **文档修补:** 文档可以经常(但不总是)比代码用更小块的时间来处理。也许有几个地方你可以补充,或者也许是时候浏览一下文档,并确保它们仍然准确。 +* **邮件列表支持:** 用户或其他贡献者在邮件列表中提出了问题?也许你可以帮忙。 +* **文档修补:** 文档经常(但不总是)可以比代码用更小块的时间来处理。也许有几个地方你可以补充一下,或者也许是时候浏览一下文档并确保它们仍然准确了。 * **营销:** 在社交媒体上谈论你的项目或者社区。写一篇快速入门博文。在新闻聚合里投票和评论。 ### 与你的老板交谈 -你可能会认为在上班时间里你不能在开源项目上工作,但是你有_问过么_? 特别是如果这个项目以某种方式与你的日常工作相关,那你或许可以和你的老板沟通,让你可在工作时做出贡献。请注意,这可能存在一些知识产权问题(例如,谁拥有你在工作时间内提供的代码的权利),因此首先做你的研究并以书面形式获得授权。 +你可能会认为在上班时间里你不能在开源项目上工作,但是你有_问过么_? 特别是如果这个项目以某种方式与你的日常工作相关,那你或许可以和你的老板谈谈,让你可在工作时做出贡献。请注意,这可能存在一些知识产权问题(例如,谁拥有你在工作时间内提供的代码的权利),因此首先做一下研究并以书面形式获得授权。 ### 设置最后期限 @@ -35,31 +35,31 @@ 1. 如果要完成,它必须有一个截止日期 2. 可以更改最后期限 -这篇文章有一个最后期限。它没有特别的时间敏感性,但最后期限意味着我定义了什么时候想完成它,并给编辑一个什么时候可以提交的感觉。是的,如上所述,我错过了最后期限。你知道发生了什么事么?我设定了一个新的期限(二手才棒!)。 +这篇文章有一个最后期限。它没有特别的时间敏感性,但最后期限意味着我定义了什么时候想完成它,并给编辑一个什么时候可以提交的感觉。是的,如上所述,我错过了最后期限。但你知道发生了什么事么?我设定了一个新的期限(二手才最棒!)。 -如果有些事_是_时间敏感的,在你需要返工一两次时,设置最后期限可以给你一些空间。 +如果有些事_是_时间敏感的,在你需要返工一两次时,设置最后期限也可以给你一些空间。 ### 将它放到你的日程上 如果你使用日历安排你的生活,那用它安排一些时间来开展你的开源项目,可能是完成此项工作的唯一方法。你计划多少时间取决于你自己,但即使你每周只用一小时作为开源时间,这仍会给你每周一小时的开源时间。 -这有一个秘密:有时候,如果你需要时间去做别的事情,或者什么都不做,那么可以自己取消它。 +这有一个秘密:有时候,如果你需要时间去做别的事情,或者什么都不想做,那么可以自己取消它。 ### 开拓未使用的时间 -你在通勤中感到无聊吗?你晚上睡觉困难么?也许你可以利用这个时间来贡献。现在我认为“每周完全投入工作 169 个小时”的生活方式是一件非常可怕的事情。也就是说,有些夜晚你不能入睡。也许你已经意识到了可以做贡献,而不是躺在床上看看你的 Twitter 上的朋友在世界的另一边做了什么(如我做的)。就是不要养成放弃睡眠的习惯。 +你在通勤中感到无聊吗?你晚上睡觉困难么?也许你可以利用这个时间来贡献。现在我认为“每周完全投入工作 169 个小时”的生活方式是一件非常可怕的事情。也就是说,有些夜晚你不能入睡。也许你已经意识到了可以做贡献,而不是躺在床上看看你的 Twitter 上的朋友在世界的另一边做了什么(如我做的)。但是不要养成放弃睡眠的习惯。 ### 停止 -有时,贡献最好的方式是一点不贡献。你是一个忙碌的人,不管你是多么的棒,你不能避免你的生理和心理需要,它们会找上你。花点时间来休息,这可以提高你的生产力,使你的工作更快,突然间你就有时间去做那些你一直想做的开源贡献了。 +有时,贡献最好的方式是一点不贡献。你是一个忙碌的人,不管你是多么的棒,你不能避开你的生理和心理的需要,它们会找上你。花点时间来休息,这也许可以提高你的生产力,使你的工作更快,突然间你就有时间去做那些你一直想做的开源贡献了。 ### 说“不” -我不擅长这个,所以这很糟糕。但是没有人能做任何想做的事情。有时候,你可以做的最好的事情是停止贡献,就像以前一样,或者没有贡献(参见上文)。 +我不擅长这个,所以我做的并不好。但是没有人能做到任何想做的事情。有时候,你可以做的最好的事情是停止贡献,就像以前一样,或者没有贡献(参见上文)。 -几年前,我领导了 Fedora 文档团队。团队的传统是,在每次发布结束时, 领导会主动提出靠边站。我已经做了一两次,没有人加强其作用替代我,所以我保持着这个角色。但是在我的第二或第三次发布之后,我明确表示,我不会继续担任团队领导。我还是很喜欢这份工作,但我正在全职工作,在研究生读到一半时,我的妻子怀了我们的第一个孩子。我没有办法做到始终如一的努力,所以我退出领导了。我继续做出贡献,但是在要求较低的能力的位置中。 +几年前,我领导了 Fedora 文档团队。团队的传统是,在每次发布结束时, 领导会主动提出下台。我已经做了一两次,没有人想要替代我,所以我继续保持着这个角色。但是在我的第二或第三次发布之后,我明确表示,我不会继续担任团队领导了。我还是很喜欢这份工作,但我有一份全职的工作,而且在研究生读到一半时,我的妻子怀了我们的第一个孩子。我没有办法做到始终如一的努力,所以我退出领导了。我继续做出贡献,但是在要求较低的能力的位置中。 -如果你正在努力抽出时间来满足你的义务(自我强加的或者不是),那么也许现在是重新考虑你的角色了。你建立的可能是一个特别困难的项目或者考虑让投资进入。但有时你不得不这么做-为了你自己好以及项目本身。 +如果你正在努力抽出时间来满足你的义务(自我强加的或者不是),那么也许现在是重新考虑你的角色了。这对于你自己创建的或者已经大量投资的项目来说很困难,但有时你不得不这么做——为了你自己好以及项目本身。 ### 其他还有什么? From fd063e005a784c1dfd169fdf6554598be32fa3f6 Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 15 Jul 2017 09:14:11 +0800 Subject: [PATCH 0681/1407] PRF&PUB:20170426 How to get started learning to program.md @WangYueScream --- ... How to get started learning to program.md | 92 +++++-------------- 1 file changed, 22 insertions(+), 70 deletions(-) rename {translated/talk => published}/20170426 How to get started learning to program.md (52%) diff --git a/translated/talk/20170426 How to get started learning to program.md b/published/20170426 How to get started learning to program.md similarity index 52% rename from translated/talk/20170426 How to get started learning to program.md rename to published/20170426 How to get started learning to program.md index 989e1c82ca..4398dc76a2 100644 --- a/translated/talk/20170426 How to get started learning to program.md +++ b/published/20170426 How to get started learning to program.md @@ -1,110 +1,66 @@ - 如何开始学习编程? ====================================================== -### 编程初学者可能都思考过这个问题,“我该怎么学编程?”这里我们提供些相关的参考指导来帮助你找到最适合自己学习情况和学习需要的方法。 - +> 编程初学者可能都思考过这个问题,“我该怎么学编程?”这里我们提供些相关的参考指导来帮助你找到最适合自己学习情况和学习需要的方法。 ![Know thyself](https://opensource.com/sites/default/files/styles/image-full-size/public/u23316/roman-know-thyself-osdc-lead.png?itok=oWuH8hRr "Know thyself") ->图片来源 : Opensource.com 修改自 [维基共享][20]里的某不知名艺术家的作品 - - 最近有很多关于学习编程的争论。不仅仅是因为与软件开发公司公开的待应聘的职位数量相比较[符合招聘要求的人远远无法满足缺口][21],编程也是[工资最高][22]和[工作满足感最强][23]的众多职业之一。也难怪越来越多的人都想进入这个行业。 - 但是你要怎么做才能正确地入行呢?“**我应该怎么学习编程?**”是初学者常见的一个问题。尽管我没有这些问题的全部答案,但是我希望这篇文章能够给你提供相关指导来帮助你找到最适合你的需求和自身情况发展的解决办法。 - ### 你的学习方式是什么? +在你开始学习编程之前,你需要考虑的不仅仅是你的方向选择,还要更多的考虑下你自己。古罗马人有句谚语,[γνῶθι σεαυτόν][24](gnothi seauton),意思是“认识你自己”。投入到一个大型的编程学习过程中难度不小。足够的自我认识是非常有必要的,这能够确保你做出的选择通向成功的机会非常大。你需要思考并诚实地回答接下来的这些问题: - - -在你开始学习编程之前,你需要考虑的不仅仅是你的方向选择,还要更多的考虑下你自己。古罗马人有句谚语,[γνῶθι σεαυτόν][24](gnothi seauton),意思是“认识你自己”。进行一个大型的编程学习难度不小。足够的自我认识是非常有必要的,这能够确保你做出的选择通向成功的机会非常大。你需要思考并诚实地回答接下来的这些问题: - - -* **你最喜欢什么样的学习方式?**怎么做你才能学到最好?是通过阅读的方式吗?还是听讲座?还是主要通过动手实践?你需要选择对你最有效的方法。不要仅仅因为这种学习方法流行或者有其他人说过这种方法对他们很有用就选择了这种方法。 - - -* **你的需要和要求是什么?**你为什么想学习如何编程?是因为你只是想换一份工作吗?如果是这样的话,你需要多次时间才能完成呢?你要牢记,这些是_需要的_ ,不是_想要的_ 。你可能_想要_下周就换份新工作,但是_需要_ 有人在接下来的一年里帮忙供养你的正在成长的家庭。当你在人生的道路上面临方向的抉择时,时间的安排特别重要。 - - -* **你能获取的参考资料有哪些?**当然,重返大学并获得一份计算机科学专业的学位证书可能也不错,但是你必须对你自己实事求是面对现实。你的生活必须和你学习相适应。你能承受花费几个月的时间和不菲的费用去参加集训吗?你是否生活在一个提供学习机会的地方,比如提供技术性的聚会或者大学课程?你能获取到的参考资料会对你的学习过程产生巨大的影响。在打算学编程换工作前先调查好这些。 - +* **你最喜欢什么样的学习方式?**怎么做你才能学到最好?是通过阅读的方式吗?还是听讲座?还是主要通过动手实践?你需要选择对你最有效的方法。不要仅仅因为这种学习方法流行或者有其他人说过这种方法对他们很有用就选择了这种方法。 +* **你的需要和要求是什么?**你为什么想学习如何编程?是因为你只是想换一份工作吗?如果是这样的话,你需要多次时间才能完成呢?你要牢记,这些是_需要的_ ,不是_想要的_ 。你可能_想要_下周就换份新工作,但是_需要_在接下来的一年里供养你正在成长的家庭。当你在人生的道路上面临方向的抉择时,时间的安排特别重要。 +* **你能获取的参考资料有哪些?**当然,重返大学并获得一份计算机科学专业的学位证书可能也不错,但是你必须对你自己实事求是面对现实。你的生活必须和你学习相适应。你能承受花费几个月的时间和不菲的费用去参加集训吗?你是否生活在一个可以提供学习机会的地方,比如提供技术性的聚会或者大学课程?你能获取到的参考资料会对你的学习过程产生巨大的影响。在打算学编程换工作前先调查好这些。 ### 选择一门编程语言 +当你打算开始你的编程学习之路和考虑你的选择的时候,请记住不管其他人说什么,选择哪门编程语言来开始你的编程学习_关系不大_。是的,是有些编程语言比其他的更流行。比如,根据一份调查研究,目前 JavaScript,Java,PHP, 和 Python 处于 [最受欢迎最流行的编程][25] 中的前排。但是现在正流行的编程语言有可能过几年就过时了,所以不用太纠结编程语言的选择。像那些方法,类,函数,条件,控制流程和其他的编程的概念思想等等,不管你选的哪门编程语言,它们的底层原理基本是一致的。只有语法和社区的最佳实践会变。因此你能够用 [Perl][26] 学习编程,也可以用 [Swift][27] 或者 [Rust][28]。作为一个程序员,你会在你的职业生涯里用很多不同的编程语言来工作。不要认为你被困在了编程语言的选择上。 -当你打算开始你的编程学习之路和考虑你的选择的时候,请记住不管其他人说什么,选择哪门编程语言来开始你的编程学习 _关系不大_。是的,是有些编程语言比其他的更流行。比如,根据一份调查研究,目前 JavaScript,Java,PHP, 和 Python 处于 [最受欢迎最流行的编程][25] 中的前排。但是现在正流行的编程语言有可能过几年就过时了,所以不用太纠结编程语言的选择。像那些方法,类,函数,条件,控制流程和其他的编程的概念思想等等,不管你选的哪门编程语言,他们的底层原理基本保持一致。只有语法和社区的实例会变。因此你能够用 [Perl][26] 学习编程,也可以用 [Swift][27] 或者 [Rust][28]。作为一个程序员,你会在你的职业生涯里用很多不同的编程语言来工作。不要认为你被困在了编程语言的选择上。 +### 试水 +除非你已经涉足过这个行业或者确信你愿意花费你生命的剩余时光来编程,我建议你最好还是下水之前先用脚趾头来试试水温之类的来判断这水适不适合。这种工作不是每个人都能做的。在把全部希望都压在学习编程之前,你可以先尝试花费少量时间金钱来学习一小部分知识点来了解自己是否会享受这种每周起码花费 40 个小时来编码工作的生活。如果你不喜欢这种工作,你不太可能完成编程项目的学习。即便你完成结束了编程的学习阶段,你也会在你以后的编程工作中感到无比痛苦。人生苦短就不要花费你人生三分之一的时间来做你不喜欢的事了。  - - -### 市场测试 - - -除非你已经涉足过这个行业或者确信你愿意花费你生命的剩余时光来编程,我建议你最好还是潜水之前先用脚趾头来试试水温之类的来判断这水适不适合潜水。这种工作不是每个人都能做的。在把全部希望都压在学习编程之前,你可以先尝试花费少量时间金钱来学习一小部分知识点来了解自己是否会享受这种每周起码花费 40 个小时来编码工作的生活。如果你不喜欢这种工作,你不太可能完成编程项目的学习。即便你完成结束了编程的学习阶段,你也会在你以后的编程工作中感到无比痛苦。人生苦短就不要花费你人生三分之一的时间来做你不喜欢的事了。  - - -谢天谢地,软件开发不仅仅需要编程。熟悉编程概念和理解软件是怎么和他们结合在一起的是非常有用的,但是你不需要成为一个程序员也能在软件开发行业中找到一份报酬不菲的工作。在软件开发过程中,额外的重要角色有技术文档撰写人、项目经理、产品经理、测试人员、设计人员、用户体验设计者、运维/系统管理员和数据科学家等。软件成功的启动需要很多角色的人之间相互配合。不要觉得学习了编程就要求你成为一个程序员。你需要探索你的选择并确定哪个选择才是最适合你的。 - +谢天谢地,软件开发不仅仅需要编程。熟悉编程概念和理解软件是怎么和他们结合在一起的是非常有用的,但是你不需要成为一个程序员也能在软件开发行业中找到一份报酬不菲的工作。在软件开发过程中,另外的重要角色有技术文档撰写人、项目经理、产品经理、测试人员、设计人员、用户体验设计者、运维/系统管理员和数据科学家等。软件成功的启动需要很多角色之间相互配合。不要觉得学习了编程就要求你成为一个程序员。你需要探索你的选择并确定哪个选择才是最适合你的。 ### 参考的学习资料 - 你对学习参考资料的选择是什么?可能正如你已经发现的那样,可供选择的参考资料非常多,尽管在你的那片区域不是所有的资料都能够获得。 - -* **训练营**:最近这几年像 [App Academy][5] 和 [Bloc][6] 这样的训练营越来越流行。训练营通常收费 $10K或者更多,他们宣称在几周内就能够把一个学生培训成一个称职的程序员。在参加编程集训营前,你需要研究下你将要学习的项目能确保正如它所承诺的那样,学生学完毕业后能够找到一个高薪的长期供职的职位。一方面花费了数目不小的钱财,而且时间也花费了不少—通常这些都是典型的全日制课程并且要求学生在接下来的连续几周里把其他的事先放在一边专心课程学习。然而时间金钱这两项不菲的消耗通常会使很多未来的程序员无法参加训练营。 - - -* **社区学院/职业培训中心**:社区学院常常被那些研究自己对学习编程的选择的人所忽视,不得不说这些人该为自己对社区学院的忽视感到羞愧。你在社区学院或者职业培训中心能够接受到的教育是和你选择其他方式学习编程的学习效果一样有效,而且费用也不高。 - - -* **国家/地方的培训项目**:许多地区都认识到在他们的地区增加技术投资的经济效益,并且已经制定了培训计划来培养受过良好教育和准备好的劳动力。培训项目的案例包括了[Code Oregon][7] 和 [Minneapolis TechHire][8]。检查下你的州、省或自治区是否提供这样的项目。 - - -* **在线训练**:许多公司和组织都提供在线技术培训项目。比如,[Linux Foundation][9]致力于通过开源技术使人们获得成功。其他的像[O'Reilly Media][10], [Lynda.com][11], 和 [Coursera][12]在软件开发涉及的许多方面提供培训。[Codecademy][13]提供对编程概念的在线介绍。每个项目的成本会有所不同,但大多数项目会允许你在你的日程安排中学习。 - - -* **MOOCs**:在过去的几年里,moocs-大规模开放在线课程的发展势头已经很好了。像 [Harvard][14], [Stanford][15], [MIT][16] 和其他的一些世界一流大学他们一直在记录他们的课程,并免费提供在线课程。课程的自我指导性质可能并不适合所有人,但可利用的材料使这成为一个有价值的学习选择。 - - -* **专业书籍**:许多人喜欢用书自学。这是相当经济的,在初步学习阶段后提供了现成的参考资料。尽管你可以通过在线服务订购和访问图书像[Safari][17] 和 [Amazon][18],但是也不要忘了检查你本地的公共图书馆。 - +* **训练营**:最近这几年像 [App Academy][5] 和 [Bloc][6] 这样的训练营越来越流行。训练营通常收费 $10K 或者更多,他们宣称在几周内就能够把一个学生培训成一个称职的程序员。在参加编程集训营前,你需要研究下你将要学习的项目能确保正如它所承诺的那样,在学生学完毕业后能够找到一个高薪的长期供职的职位。一方面花费了数目不小的钱财,而且时间也花费了不少——通常这些都是典型的全日制课程并且要求学生在接下来的连续几周里把其它的事先放在一边专心课程学习。然而时间金钱这两项不菲的消耗通常会使很多未来的程序员无法参加训练营。 +* **社区学院/职业培训中心**:社区学院常常被那些调研自己学习编程的方式的人所忽视,不得不说这些人该为自己对社区学院的忽视感到羞愧。你在社区学院或者职业培训中心能够接受到的教育是和你选择其他方式学习编程的学习效果一样有效,而且费用也不高。 +* **国家/地方的培训项目**:许多地区都认识到在他们的地区增加技术投资的经济效益,并且已经制定了培训计划来培养受过良好教育和准备好的劳动力。培训项目的案例包括了 [Code Oregon][7] 和 [Minneapolis TechHire][8]。检查下你的州、省或自治区是否提供这样的项目。 +* **在线训练**:许多公司和组织都提供在线技术培训项目。比如,[Linux 基金会][9]致力于通过开源技术使人们获得成功。其他的像 [O'Reilly Media][10]、[Lynda.com][11] 和 [Coursera][12] 在软件开发涉及的许多方面提供培训。[Codecademy][13] 提供对编程概念的在线介绍。每个项目的成本会有所不同,但大多数项目会允许你在你的日程安排中学习。 +* **MOOC**:在过去的几年里,大规模开放在线课程的发展势头已经很好了。像 [哈佛][14]、[斯坦福][15]、[MIT][16] 和其他的一些世界一流大学他们一直在记录他们的课程,并免费提供在线课程。课程的自我指导性质可能并不适合所有人,但可利用的材料使这成为一个有价值的学习选择。 +* **专业书籍**:许多人喜欢用书自学。这是相当经济的,在初步学习阶段后提供了现成的参考资料。尽管你可以通过像 [Safari][17] 和 [Amazon][18] 这样的在线服务订购和访问图书,但是也不要忘了检查你本地的公共图书馆。 ### 网络支持 +无论你选择哪一种学习资源,有网络支持都将获得更大的成功。与他人分享你的经历和挑战可以帮助你保持动力,同时为你提供一个放心的地方去问那些你可能还没有足够自信到其他地方去问的问题。许多城镇都有当地的用户群聚在一起讨论和学习软件技术。通常你可以在 [Meetup.com][29] 这里找到。专门的兴趣小组,比如 [Women Who Code][30] 和 [Code2040][31],在大多数城市地区经常举行会议和黑客马拉松活动,这是在你学习的时候结识并建立一个支持网络的很好的方式。一些软件会议举办“黑客日”,在那里你可以遇到有经验的软件开发人员,他们能够帮助你解决你所困扰的一些问题。例如,每年的 [PyCon][32] 会议都会提供几天的时间来让人们聚集在一起工作、研讨。一些项目,比如 [BeeWare][33],使用这些短暂的时间来帮助新程序员学习和对这些项目做贡献。 -无论你选择哪一种学习资源,有网络支持都将获得更大的成功。与他人分享你的经历和挑战可以帮助你保持动力,同时为你提供一个安全的地方去问那些你可能还没有足够自信到其他地方去问的问题。许多城镇都有当地的用户群聚在一起讨论和学习软件技术。通常你可以在 [Meetup.com][29] 这里找到。专门的兴趣小组,比如 [Women Who Code][30] 和 [Code2040][31],在大多数城市地区,经常举行会议和黑客马拉松活动,这是在你学习的时候,一个很好的方式来结识并建立一个支持网络。一些软件会议举办“黑客日”,在那里你可以遇到有经验的软件开发人员,他们能够帮助你解决你所困扰的一些问题。例如,每年的[PyCon][32]会议都会提供几天的时间来让人们聚集在一起工作、研讨。一些项目,比如[BeeWare][33],使用这些短暂的时间来帮助新程序员学习和对这些项目做贡献。 - - -你的网络支持不需要来自正式的聚会。一个小的学习小组可以有效地保持你的学习积极性,并且可以像在你最喜欢的社交网络上发布邀请一样容易形成。如果你生活在一个没有大量软件开发人员的社区来支持几个meetups和用户组,那么这一点特别有用。 - +你的网络支持不需要来自正式的聚会。一个小的学习小组可以有效地保持你的学习积极性,并且可以像在你最喜欢的社交网络上发布邀请一样容易形成。如果你生活在一个没有大量软件开发人员社区所支持的聚会和用户组的地区,那么这一点特别有用。 ### 开始学习编程的几个步骤 - - 简单的来说,既然你决定学习编程,可以参考这几个方法给自己一个尽可能成功的机会: 1. 将你的需要/需求和参考学习资料列出清单并进行收集 - 2. 搜寻在你的当地那里能够可用的选择 - 3. 放弃不能符合你的需求和参考学习资料的选择 - 4. 选择最符合你需求的和最适合你的学习参考资源 - 5. 找到一个能够得到支持的网络 - 务必牢记:你的学习过程永远不会结束。高速发展的软件产业,会导致新技术和新进展几乎每天都会出现。一旦你学会了编程,你就必须花时间去学习适应这些新的进步。你不能依靠你的工作来为你提供这种培训。只有你自己负责自己的职业发展,所以如果你想保持最新的技术和工作能力,你必须紧跟行业最新的技术。 -祝你好运! +祝你好运! + +(题图 : Opensource.com 修改自 [维基共享][20]里的某不知名艺术家的作品 ) -------------------------------------------------------------------------------- @@ -113,17 +69,13 @@ VM (Vicky) Brasseur - VM (aka Vicky) 是一个技术人员,也是项目、工作进程、产品和企业的经理。在她的长达 18 年的科技行业里,她曾是一名分析师、程序员、产品经理、软件工程经理和软件工程总监。目前,她是惠普企业上游开源开发团队的高级工程经理。她的博客是 anonymoushash.vmbrasseur.com,推特是 @vmbrasseur。  - - - - -------- via: https://opensource.com/article/17/4/how-get-started-learning-program -作者:[VM (Vicky) Brasseur ][a] +作者:[VM (Vicky) Brasseur][a] 译者:[WangYueScream](https://github.com/WangYueScream) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From c9f86b2ef8c7cb45235b99752a8047634f5cfb8e Mon Sep 17 00:00:00 2001 From: stevenzdg988 Date: Sat, 15 Jul 2017 16:44:29 +0800 Subject: [PATCH 0682/1407] translated by stevenzdg988 --- ... a systems management library for Linux.md | 73 +++++++++++++++++-- 1 file changed, 67 insertions(+), 6 deletions(-) rename {sources => translated}/tech/20170523 An introduction to Libral a systems management library for Linux.md (77%) diff --git a/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md b/translated/tech/20170523 An introduction to Libral a systems management library for Linux.md similarity index 77% rename from sources/tech/20170523 An introduction to Libral a systems management library for Linux.md rename to translated/tech/20170523 An introduction to Libral a systems management library for Linux.md index 7ceb8c8b9d..905fe2168d 100644 --- a/sources/tech/20170523 An introduction to Libral a systems management library for Linux.md +++ b/translated/tech/20170523 An introduction to Libral a systems management library for Linux.md @@ -91,8 +91,7 @@ After downloading and unpacking the tarball, the **ralsh** command can be foun Well-known configuration-management systems, such as Puppet, Chef, or Ansible, address some of the same problems that Libral addresses. What sets Libral apart from them is mostly in the things that these systems do and Libral doesn't. Configuration-management systems are built to deal with the variety and complexity of managing many different things across large numbers of nodes. Libral, on the other hand, aims at providing a low-level systems management API that is well-defined, independent of any particular tool, and usable with a wide variety of programming languages. -众所周知配置管理系统,如 Puppet,Chef,及 Ansible,地址等相同的问题是 Libral 的地址。这就是为什么一般将 Libral 与其他设置分离开的原因,即让系统去执行。配置管理系统被创建处理多样复杂的通过管理大量的节点的多事务管理行为。Libral,在另一方面, -旨在提供一个低级别的定义明确的系统管理 API 独立于任何特定的工具,可用各种各样的编程语言进行设计。 +众所周知配置管理系统,如 Puppet,Chef,及 Ansible,地址等相同的问题是 Libral 的地址。这就是为什么一般将 Libral 与其他设置分离开的原因,即让系统去执行。配置管理系统被创建处理多样复杂的通过管理大量的节点的多事务管理行为。Libral,在另一方面,旨在提供一个低级别的定义明确的系统管理 API 独立于任何特定的工具,可用各种各样的编程语言进行设计。 By removing the application logic that the large configuration-management systems contain, Libral is much more versatile in how it can be used, from the simple scripting tasks mentioned in the introduction, to serving as the building blocks for complex management applications. Focusing on these basics also allows it to be very small, currently less than 2.5 MB, an important consideration for resource-constrained environments, including containers and small devices. @@ -139,15 +138,24 @@ Finally, it has to be easy to extend Libral's management capabilities so that us Currently, the main way to interact with the Libral API is through the **ralsh **command line tool. It exposes the underlying C++ API, which is still in flux, and is mainly geared at simple scripting tasks. The project also provides language bindings for CRuby, with others to follow. - +目前与 Libral API 进行交互的主要方式是通过“ralsh”命令行工具。它公开了底层的 C++ API ,不过人处在不断的演变当中,主要的还是为面向简单的脚本任务做准备。该项目提供了为 CRuby提供语言绑定并且会有更多的参加者共同参与。 In the future, Libral will also provide a daemon with a remote API, so that it can serve as the basis for management systems that do not need to install additional agents on managed nodes. This, coupled with the ability to tailor the management capabilities of Libral, makes it possible to tightly control which aspects of a system can be managed and which ones are protected from any interference. +未来,Libral 还将提供一个可远程支持的虚拟光驱 API ,因此它可以成为一个管理系统的基本服务,在此基础上管理节点不需要安装额外的代理。这一点,共轭能力能够更加适合 Libral 的管理功能,使其在更加紧密的控制系统方面和对来自任何干扰的保护成为一种可能。 + + For example, a Libral installation that is restricted to managing users and services will be guaranteed to not interfere with the packages installed on a node. Controlling what gets managed in this manner is currently not possible with any of the existing configuration-management systems; in particular, systems that require arbitrary SSH access to a managed node also expose that system to unwanted accidental or malicious interference. +举个例子来说,Libral 仅限于管理用户和服务的安装将受到保护,在一个节点上进行包安装的时候不会受到干扰。获得以这种方式的管理控制在当前是不可能与现有的配置管理系统共存的;尤其当系统需要通过任意的 SSH 访问一个托管的节点并同时显示对系统有害的信息或者是恶意干扰。 + + The basis of the Libral API is formed by two very simple operations: **get** to retrieve the current state of resources, and **set** to enforce the state of current resources. Idealizing a little from the actual implementation, they can be thought of as: +Libral API 的基础是由两个非常简单的操作构成的:“get” 用来检索当前资源的状态,“set” 用来强制当前资源的状态。理想化的实现当前安装启用状态,可能要通过以下步骤: + + ``` provider.get(names) -> List[resource] provider.set(List[update]) -> List[change] @@ -155,12 +163,23 @@ The basis of the Libral API is formed by two very simple operations: **get** t The **provider** is the object that knows how to manage a certain kind of resource, like a user, a service, or a package, and the Libral API provides ways to look up the provider for a certain kind of resource. +“provider" 是要了解怎样管理一种资源的对象,就像用户,服务,包文件,Libral API 提供了一种查找资源的方法。 + + The **get** operation receives a list of resource names, e.g., usernames, and needs to produce a list of resources, which are essentially hashes listing the attributes of each resource. This list must contain resources with the provided names, but might contain more, so that a naive **get** implementation can simply ignore the names and list all the resources it knows about. +”get“ 操作能够接收资源名称列表,举例子来说,用户名,需要产生一个资源列表,本质来说是利用散列的方式列出每种资源的属性。这个列表必须包含提供名称的资源,但是可能包含更多内容,因此”get“ 的启用可以忽略名称列出所有它知道的资源。 + + The **set** operation is used to enforce desired state and receives a list of updates. Each update contains **update.is**, a resource representing the current state, and **update.should**, a resource representing the desired state. Calling the **set** method will make sure that the resources mentioned in the update list will be in the state indicated in **update.should** and produces a list of the changes made to each resource. -With **ralsh**, the current state of the **root** user can be retrieved with the command **ralsh user root**; by default, the command produces human-readable output, reminiscent of Puppet, but **ralsh** also supports a **--json** flag to make it produce JSON output for consumption by -scripts. The human-readable output is: +”set“ 操作被用来强制要求的状态,接收列表的更新。每次更新包含”update.is",表示当前状态的资源,“update.should" 表示被要求状态的资源。调用”set“方法将会确认更新列表中提到的资源,将会在”update.should"中显示状态,产生一个对每个资源进行更改的列表。 + + +With **ralsh**, the current state of the **root** user can be retrieved with the command **ralsh user root**; by default, the command produces human-readable output, reminiscent of Puppet, but **ralsh** also supports a **--json** flag to make it produce JSON output for consumption by scripts. The human-readable output is: + +在 “ralsh”下,利用“ralsh user root"能够重新获得“root”用户的当前状态;默认情况下,这个命令会产生一个用户可读的输出,就像木偶一样,但是”ralsh“支持”--json“选项,将利用脚本消耗产生 JSON 输出。用户可读输出是: + ``` # ralsh user root @@ -177,6 +196,8 @@ scripts. The human-readable output is: Similarly, the user can be changed with: +用户将被修改成类似于下面的形式: + ``` # ralsh user root comment='The superuser' user::useradd { 'root': @@ -193,47 +214,87 @@ Similarly, the user can be changed with: The output of ralsh lists both the new state of the root user, with the changed comment attribute, and what changes were made (solely to the **comment** attribute in this case). Running the same command a second time will produce much the same output, but without any change indication, as none will be needed. + +”ralsh“的输出列出了”root“用户两种新状态,被改变的属性注释,以及修改了什么内容(在这种情形下单独的”注释”属性)。运行相同的命令一秒钟的时间将产生同样的输出,但是没有任何修改的迹象,也没有需求。 + ### Writing providers +编写程序管理器 + It is crucially important that writing new providers for ralsh is easy and requires a minimum amount of effort. For this reason, ralsh offers a number of calling conventions that make it possible to trade the complexity of implementing a provider against the power of what the provider can do. Providers can either be external scripts that adhere to a specific calling convention or be implemented in C++ and built into Libral. Currently, there are three calling conventions: +为“ralsh”编写新的管理器是很容易的,也是花费不了多少努力,但是这一步骤是至关重要的。正因为如此,“ralsh”提供了大量的调用约定,依靠其效能实现交换复杂的执行成为可能。管理器可以使用遵循特定调用约定的外部脚本也可以是执行 C++ 并构建Libral。到目前为止,有三种调用约定: + + * The [simple][6] calling convention is geared towards writing shell scripts that serve as providers +[simple][16]调用约定是针对编写 shell 脚本服务于管理器。 + * The [JSON][7] calling convention is meant for writing providers in scripting languages like Ruby or Python +[JSON][7]调用约定意味着可以利用 Ruby 或者 Python 脚本语言编写管理器。 + * The [internal C++ API][8] can be used to implement providers natively +[internal C++ API[]8] 可以被用来执行本机的管理器。 + + It is highly recommended to start provider development using the **simple** or the **JSON** calling convention. The file [simple.prov][15] on GitHub contains a skeleton for a simple shell provider, and it should be easy to adapt it for one's own provider. The file [python.prov][16] contains the skeleton of a JSON provider written in Python. +强烈建议开始管理其开发使用“simple” 或者“JSON” 调用约定。[simple.prov][15]文件在GitHub上包含了一个简单的 shell 管理器框架,应该很容易的被自己的管理器兼容。[python.prov][16]文件包含了利用 Python编写的 JSON 管理器框架。 + One problem with using higher-level scripting languages for providers is that the runtimes, including all supporting libraries, for these languages need to be present on the system on which Libral will run. In some cases, that is not an obstacle; for example, a provider that does package management based on **yum** can expect that Python is present on the system, as **yum** is written in it. +利用高版本脚本语言编写的管理器存在一个运行时间的问题,包含所有的支持库,这些脚本语言需要在当前的系统上运行 Libral。在某些情况下,这不是一个障碍;举例子来说,基于“yum” 的包管理的管理器需要 Python 被安装在当前的系统上,而“yum”是用 Python 开发的一样。 + In many other cases though, there's no logical choice for a language beyond Bourne shell (or Bash) that can be expected to be installed on all managed systems. Often, provider writers need a more powerful scripting environment than just that. Unfortunately, bundling a full Ruby or Python interpreter with its runtime would increase Libral's size beyond what can reasonably be used in resource-constrained environments. On the other hand, the canonical choices of Lua or Javascript as small embeddable scripting languages are not suitable for this context as they are both not familiar to most provider writers, and require quite a bit of work to expose commonly needed facilities for systems management. +然而在很多时候,无法选择一种超过 Bourne shell (或者 Bash)的设计语言能够按照预期安装到所有的管理系统上。通常,管理器的编写者需要一个更加强大的脚本编译环境是更实际一些的。然而事与愿违,绑定一个完整的 Ruby 或 Python作为解释器来运行将会增加 Libral 的空间超出了实际使用环境对资源的限制。另一方面,Lua 或者 JavaScript 可嵌入的脚本编辑语言的选择规范与其上下文是不匹配的,因为大多数的管理器的编写者不熟悉他们,通常情况下需要做大量的工作对需要生产环境系统管理工具进行发布。 + Libral bundles a version of [mruby][17], a small, embeddable version of Ruby, to give provider writers a stable foundation, and a powerful programming language for their implementation. mruby is a full implementation of the Ruby language, albeit with a much reduced standard library. The mruby bundled with Libral contains the parts of Ruby's standard library most important for scripting management tasks, which will be enhanced further over time based on the needs of provider writers. Libral's mruby also bundles an API adpater that makes writing providers to the json convention more comfortable, as it contains simple utilities (like [Augeas][18] for modifying structured files) and conveniences around parsing and outputting JSON. The file [mruby.prov][19] contains a skeleton example of a json provider written in mruby. +Libral 绑定了一个[mruby][17]版本,一个小的,嵌入在 Ruby 的版本,提供给管理器的编写者一个具有稳定的基础以及功能强大的可实现的程序设计语言。Mruby 就是一款可实现的 Ruby 语言,尽管减少了大量的标准库支持。绑定了 Libral 的 Mruby 包含了 Ruby 的标准库的大多数重要的脚本编辑管理任务,随着时间的推移将来在管理器编写者基础性的需求上将得到加强。Libral 的 Mruby 绑定了 API 适配器使编写管理器更适合 JSON 约定,因为它包含了简单的工具(如编译修改结构体文件的[Augeas][18])和围绕语法和输出JSON的约定。[mruby.prov][19]文件包含了利用 Mruby 编写的 JSON 管理器框架实例。 + + ### Future work +展望 + The most important next steps for Libral are to make it more widely usable—the [precompiled tarball][20] is a great way to get started and sufficient to develop providers, but Libral also needs to be packaged and made available in mainstream distributions. In a similar vein, the utility of Libral strongly depends on the set of providers it ships with and those need to be expanded to cover a core set of management functionality. The Libral site contains [a todo list][21] showing the providers that are most urgently needed. + +Libral 最关键的是下一步要使其增加广泛的可用性-从[precompiled tarball][20]开始并充分的开发管理器是一个极好的方法,但是 Libral 需要打包并且能够在主流的分布上提高可用性。同样的,Libral 强大的功用取决于管理器的集合附带及需要被扩展覆盖的一组核心管理功能。Libral 的网站上包含了 [a todo list][21]并且列出了管理器的最迫切需求。 + + There are also several ways in which the availability of Libral for different uses can be improved: from writing bindings for additional languages, for example, Python or Go, to making the use of **ralsh** in shell scripts even easier by offering, besides the existing human-readable output and JSON output, an output format that is easy to process in shell scripts. Use of Libral for larger-scale management can also be improved by adding the remote API discussed above, and by better supporting bulk installation of Libral via transports like SSH—that mostly requires providing prebuilt tarballs for more architectures and scripts that can select the right one based on the discovered architecture of the target system. +现在有多种方法来让不同的用户能够提高 Libral的可用性:编写绑定附加程序语言,举例来说,Python 或者 Go,提供条件使“ralsh” 更容易在 shell 脚本中使用,除了现有的可读输出和 JSON 输出之外,可以很轻松的在 shell 脚本中格式化输出。Libral 运用大规模的管理能够在增加远程 API 协商而得到改良,Libral 利用像 SSh 这样的传输工具实现了更好的支持批量安装,大多数情况下需要提供更多的框架和脚本的预先构建包才能选择一款基于创新的目标框架系统。 + + There are many more ways in which Libral, its API, and its capabilities could evolve; one intriguing possibility is adding notification capabilities to the API so that Libral can report changes to system resources as they happen outside of its purview. The challenge for Libral will be to continue to be a small, lightweight and well-defined tool while covering an ever increasing set of uses and management capabilities—a challenge and a journey that I encourage every reader to become a part of. +Libral 有很多方式方法,如 API ,它的性能在不断地进化发展;一个有趣的可能性是为 API 增加性能的显示,这样做可以向系统报告资源在超出它的范围发生的变化。Libral 面临的挑战将一直持续下去的是小型化,轻量级和良好定义的工具,来替代曾经增加的使用和管理性能-我希望每一个读者都能成为这个挑战和旅行的一部分。 + + If any of this has made you curious, I would love to hear from you, be it in the form of a pull request, an enhancement request, or just a report of your experience trying out **ralsh**. +如果这让你很好奇,我很想听听你的想法,可以使推拉请求的方式,可以是增强请求方式,亦或者报告你对“ralsh”测试的经验体验。 + -------------------------------------------------------------------------------- 作者简介: David Lutterkort - David is a software engineer at Puppet, where he’s worked on projects such as Direct Puppet and Razor, the best provisioning tool, ever. He was one of the earliest contributors to Puppet and is the main author of Augeas, a configuration editing tool. +David Lutterkort - 戴维是一个 Puppet 的软件工程师,他曾经参与的项目有 Direct Puppet 和 Razor,最好的工具提供。他是 Puppet 最早的编著者之一,也是 Augeas 的主要作者,一个编辑工具配置专家。 + ------------------------ via: https://opensource.com/article/17/5/intro-libral-systems-management-library-linux 作者:[David Lutterkort][a] -译者:[译者ID](https://github.com/译者ID) +译者:[译者:stevenzdg988](https://github.com/stevenzdg988) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From f8ec5914d6277a6f663977cbdc937a6e2a2af7cf Mon Sep 17 00:00:00 2001 From: chenxinlong <237448382@qq.com> Date: Sat, 15 Jul 2017 18:47:06 +0800 Subject: [PATCH 0683/1407] translated --- ...To Create Or Extend Swap Space In Linux.md | 211 ------------------ ...To Create Or Extend Swap Space In Linux.md | 211 ++++++++++++++++++ 2 files changed, 211 insertions(+), 211 deletions(-) delete mode 100644 sources/tech/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md create mode 100644 translated/tech/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md diff --git a/sources/tech/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md b/sources/tech/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md deleted file mode 100644 index a1ff5a7166..0000000000 --- a/sources/tech/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md +++ /dev/null @@ -1,211 +0,0 @@ -translating by chenxinlong -3 Easy Ways To Create Or Extend Swap Space In Linux -============================================================ - -Users can create swap space during installation of any Linux operating system and its necessary too. If you forget to create or later if you want increase, you can at any point of time. - -Sometimes it is necessary to add more swap space when you upgrade the RAM after installation, say for example, if you upgrade the RAM in your system from 1GB to 2GB then you have to upgrade swap too (From 2GB to 4GB) since it’s uses double amount of physical RAM. - -Swap is space on a disk that is reserved to be used as virtual memory when the amount of physical memory (RAM-random access memory) is full. If the system needs more memory resources when the RAM is full, inactive pages in memory are moved to the swap space which can help system to run the applications some more time but it should not be considered a replacement for more RAM. - -It’s recommended to create a dedicated swap partition but if you don’t have a free partition then use a swap file, or a combination of swap partitions and swap files. Swap space is generally recommended for user at least 4 GB, also users can create a swap space depends upon their requirement and environment. - -I have found most of the VM’s and Cloud servers comes without swap partition, so in such cases we can create, extend or increase swap space using below three methods. - -#### How to check current swap size - -Lets first check the size of existing swap space partition using **[free][1]** & `swapon` command. - -``` -$ free -h - total used free shared buff/cache available -Mem: 2.0G 1.3G 139M 45M 483M 426M -Swap: 2.0G 655M 1.4G - -$ swapon --show -NAME TYPE SIZE USED PRIO -/dev/sda5 partition 2G 655.2M -1 -``` - -The above output clearly shows `2GB` is current swap space. - -#### Method-1 : Create the swap file using fallocate - -fallocate program is a best way to create a file of a preallocated size instantly. - -The following command will create 1GB of `/swapfile`. - -``` -$ sudo fallocate -l 1G /swapfile -``` - -Check whether its created correct size of file or not. - -``` -$ ls -lh /swapfile --rw-r--r-- 1 root root 1.0G Jun 7 09:49 /swapfile -``` - -Change the file permission to `600` to only accessible by root user. - -``` -$ sudo chmod 600 /swapfile -``` - -Convert the file as swap area by running below command. - -``` -$ sudo mkswap /swapfile -Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes) -no label, UUID=cda50e0e-41f3-49c7-af61-b8cb4a33a464 -``` - -Enable the swap file by running below command. - -``` -$ sudo swapon /swapfile -``` - -Add newely created swap file into fstab file, so that swap space partition available even after the reboot. - -``` -$ vi /etc/fstab - -/swapfile swap swap defaults 0 0 -``` - -Check newly created swap file. - -``` -$ swapon --show -NAME TYPE SIZE USED PRIO -/dev/sda5 partition 2G 657.8M -1 -/swapfile file 1024M 0B -2 -``` - -Yes i can see the new `1GB swapfile`. Reboot the system to use the new swap file. - -#### Method-2 : Create the swap file using dd command - -dd command is another utility which help us to create a file of a preallocated size instantly. - -The following dd command will create 1GB of `/swapfile1`. - -``` -$ sudo dd if=/dev/zero of=/swapfile1 bs=1G count=1 -1+0 records in -1+0 records out -1073741824 bytes (1.1 GB, 1.0 GiB) copied, 16.6154 s, 64.6 MB/s -``` - -**Details :** - -* **if=/dev/zero** is a input file, /dev/zero is a special file in Unix-like operating systems that provides as many null characters (ASCII NUL, 0x00) as are read from it. - -* **of=/swapfile1** is an output file - -* **bs=1G :** Read and write up to 1GB bytes at a time - -* **count=1 :** Copy only 1 BLOCKS input blocks. - -Check whether its created correct size of file or not. - -``` -$ ls -lh /swapfile1 --rw-r--r-- 1 root root 1.0G Jun 7 09:58 /swapfile1 -``` - -Change the file permission to `600` to only accessible by root user. - -``` -$ sudo chmod 600 /swapfile1 -``` - -Convert the file as a swap file by running below command. - -``` -$ sudo mkswap /swapfile1 -Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes) -no label, UUID=96def6d7-b2da-4954-aa72-aa32316ec993 -``` - -Enable the swap file by running below command. - -``` -$ sudo swapon /swapfile1 -``` - -Add newely created swap file into fstab file, so that swap space partition available even after the reboot. - -``` -$ vi /etc/fstab - -/swapfile1 swap swap defaults 0 0 -``` - -Check newly created swap file. - -``` -$ swapon --show -NAME TYPE SIZE USED PRIO -/dev/sda5 partition 2G 1.3G -1 -/swapfile file 1024M 0B -2 -/swapfile1 file 1024M 0B -3 -``` - -Yes i can see the new `1GB swapfile1`. Reboot the system to use the new swap file. - -#### Method-3 : Create the swap file using Hard drive partition - -Hard drive partition is recommended method to create a swap space. - -If you have an additional hard disk create the new partition using fdisk command. Let us assume that we have created the partition called /dev/sda4. - -Use mkswap command to convert the partition as swap area. - -``` -$ sudo mkswap /dev/sda4 -``` - -Enable the swap file by running below command. - -``` -$ sudo swapon /dev/sda4 -``` - -Add newely created swap file into fstab file, so that swap space partition available even after the reboot. - -``` -$ vi /etc/fstab - -/dev/sda4 swap swap defaults 0 0 -``` - -Check newly created swap file. - -``` -$ swapon --show -NAME TYPE SIZE USED PRIO -/dev/sda5 partition 2G 1.3G -1 -/swapfile file 1024M 0B -2 -/swapfile1 file 1024M 0B -3 -/dev/sda4 partition 1G 0B -4 -``` - -Yes i can see the new `1GB /dev/sda4` swap partition. Reboot the system to use the new swap partition. - - - --------------------------------------------------------------------------------- - -via: http://www.2daygeek.com/add-extend-increase-swap-space-memory-file-partition-linux/ - -作者:[2DAYGEEK ][a] -译者:[chenxinlong](https://github.com/chenxinlong) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.2daygeek.com/author/2daygeek/ -[1]:http://www.2daygeek.com/free-command-to-check-memory-usage-statistics-in-linux/ -[2]:http://www.2daygeek.com/author/2daygeek/ diff --git a/translated/tech/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md b/translated/tech/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md new file mode 100644 index 0000000000..3f0f7aef9b --- /dev/null +++ b/translated/tech/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md @@ -0,0 +1,211 @@ +三种在 Linux 上创建或扩展交换分区的简单方法 +============================================================ + +用户可以在任何 Linux 操作系统的安装过程中或者是其它必要的时候创建交换空间。如果你在安装 Linux 的时候忘记了创建或是你想要再增加交换分区的空间,你随时都可以再创建或增加。 + +有时候在你安装后摇升级 RAM 的时候需要增加一点交换分区的空间,比如你要将你的系统的 RAM 从 1GB 升级到 2GB 你,那么你就不得不将你的交换分区空间也升级一下(从 2GB 到 4GB),这是因为它使用了双倍的物理 RAM 。 + +Swap 是当物理内存(RAM 随机存取存储器)的数量已满时,被保留用作虚拟内存的磁盘上的空间。 如果系统在 RAM 满载时需要更多的内存资源,内存中的非活动页面将被移动到交换空间,这样可以帮助系统运行应用程序更多的时间,但不应该把它当做 RAM 的扩展。 + +建议你创建一个专用的交换分区,但是如果你没有可用的分区,那么可以使用交换文件,或交换分区和交换文件的组合。 交换空间通常建议用户至少 4 GB,用户也可以根据自己的要求和环境创建交换空间。 + +我发现大部分 VM 和 云服务器都没有交换分区,所以在这种情况下,我们可以使用以下三种方法创建,扩展或增加交换空间。 + +#### 如何检测当前交换分区大小 + +通过 **[free][1]** & `swapon` 命令来检测当前的交换分区空间的大小。  + +``` +$ free -h + total used free shared buff/cache available +Mem: 2.0G 1.3G 139M 45M 483M 426M +Swap: 2.0G 655M 1.4G + +$ swapon --show +NAME TYPE SIZE USED PRIO +/dev/sda5 partition 2G 655.2M -1 +``` + +上面的输出显示了当前的交换分区空间是 `2GB` 。 + +#### 方法 1 : 通过 fallocate 命令创建 swap 文件 + +fallocate 程序是立即创建预分配大小的文件的最佳方法。 + +下面这个命令会创建一个 1GB 大小的 `/swapfile`. + +``` +$ sudo fallocate -l 1G /swapfile +``` + +检查一下创建的文件的大小是否正确。 + +``` +$ ls -lh /swapfile +-rw-r--r-- 1 root root 1.0G Jun 7 09:49 /swapfile +``` + +将该文件的权限设置为 `600` 这样只有 root 用户可以访问这个文件。 + +``` +$ sudo chmod 600 /swapfile +``` + +通过运行以下的命令来将此文件转换为 swap 文件。 + +``` +$ sudo mkswap /swapfile +Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes) +no label, UUID=cda50e0e-41f3-49c7-af61-b8cb4a33a464 +``` + +通过运行以下的命令来使 swap 文件生效。 + +``` +$ sudo swapon /swapfile +``` + +将新创建的 swap 文件添加到 fstab 文件中,这样交换分区空间的修改即使在重启后也可以生效。 + +``` +$ vi /etc/fstab + +/swapfile swap swap defaults 0 0 +``` + +检查一下新创建的 swap 文件。 + +``` +$ swapon --show +NAME TYPE SIZE USED PRIO +/dev/sda5 partition 2G 657.8M -1 +/swapfile file 1024M 0B -2 +``` + +现在我可以看到一个新的  `1GB swapfile1`。重启系统以使新的 swap 文件生效。 + +#### 方法 2 : 通过 dd 命令来创建 swap 文件 + +dd 命令是另一个实用程序,可以帮助我们立即创建预分配大小的文件。 + +以下 dd 命令将创建 1GB 的 `/swapfile1`。 + +``` +$ sudo dd if=/dev/zero of=/swapfile1 bs=1G count=1 +1+0 records in +1+0 records out +1073741824 bytes (1.1 GB, 1.0 GiB) copied, 16.6154 s, 64.6 MB/s +``` + +**详解 :** + +* **if=/dev/zero** 是输入文件,/dev/zero 是类 Unix 操作系统中的一个特殊文件,它提供从它读取的尽可能多的空字符(ASCII NUL,0x00)。 + + +* **of=/swapfile1** 设置输出文件 + +* **bs=1G :** 一次性读写的大小为 1GB + +* **count=1 :** 仅复制一个 BLOCKS 输入块 + +检查一下创建的文件的大小是否正确。 + +``` +$ ls -lh /swapfile1 +-rw-r--r-- 1 root root 1.0G Jun 7 09:58 /swapfile1 +``` + +将该文件的权限设置为 `600` 这样只有 root 用户可以访问这个文件。 + +``` +$ sudo chmod 600 /swapfile1 +``` + +通过运行以下的命令来将此文件转换为 swap 文件。 + +``` +$ sudo mkswap /swapfile1 +Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes) +no label, UUID=96def6d7-b2da-4954-aa72-aa32316ec993 +``` + +通过运行以下的命令来使 swap 文件生效。 + +``` +$ sudo swapon /swapfile1 +``` + +将新创建的 swap 文件添加到 fstab 文件中,这样交换分区空间的修改即使在重启后也可以生效。 + +``` +$ vi /etc/fstab + +/swapfile1 swap swap defaults 0 0 +``` + +检查新创建的 swap 文件。 + +``` +$ swapon --show +NAME TYPE SIZE USED PRIO +/dev/sda5 partition 2G 1.3G -1 +/swapfile file 1024M 0B -2 +/swapfile1 file 1024M 0B -3 +``` + +现在我可以看到一个新的  `1GB swapfile1`。重启系统以使新的 swap 文件生效。 + +#### 方法 3 : 通过硬盘分区来创建 swap 文件 + +我们也推荐使用通过硬盘分区的方式来创建交换分区。 + +如果你已经在你的另一个硬盘上通过 fdisk 命令创建了一个新的分区,假设我们已经创建了一个叫做 /dev/sda4 的分区。 + +使用 mkswap 命令来将这个分区转换成交换分区。 + +``` +$ sudo mkswap /dev/sda4 +``` + +通过运行以下命令来使 swap 文件生效。 + +``` +$ sudo swapon /dev/sda4 +``` + +把新增的 swap 文件添加到 fstab 文件中,这样即使是重启了系统交换分区的修改也能生效。 + +``` +$ vi /etc/fstab + +/dev/sda4 swap swap defaults 0 0 +``` + +检查新创建的 swap 文件。 + +``` +$ swapon --show +NAME TYPE SIZE USED PRIO +/dev/sda5 partition 2G 1.3G -1 +/swapfile file 1024M 0B -2 +/swapfile1 file 1024M 0B -3 +/dev/sda4 partition 1G 0B -4 +``` + +我可以看到新的交换分区 `1GB /dev/sda4`。重启系统就可以使用新的交换分区了。 + + + +-------------------------------------------------------------------------------- + +via: http://www.2daygeek.com/add-extend-increase-swap-space-memory-file-partition-linux/ + +作者:[2DAYGEEK ][a] +译者:[chenxinlong](https://github.com/chenxinlong) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.2daygeek.com/author/2daygeek/ +[1]:http://www.2daygeek.com/free-command-to-check-memory-usage-statistics-in-linux/ +[2]:http://www.2daygeek.com/author/2daygeek/ From 564847d048c3c1082e557f737dd602d1e15ffa2a Mon Sep 17 00:00:00 2001 From: cycoe Date: Sat, 15 Jul 2017 19:09:28 +0800 Subject: [PATCH 0684/1407] translating by cycoe --- ...18 open source translation tools to localize your project.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170626 18 open source translation tools to localize your project.md b/sources/tech/20170626 18 open source translation tools to localize your project.md index 81cdebdcc8..14d4831067 100644 --- a/sources/tech/20170626 18 open source translation tools to localize your project.md +++ b/sources/tech/20170626 18 open source translation tools to localize your project.md @@ -1,3 +1,5 @@ +translating by cycoe + 18 open source translation tools to localize your project ============================================================ From 854e3f17216b5dc3fe4176537ead592bc2c839ca Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 16 Jul 2017 09:24:01 +0800 Subject: [PATCH 0685/1407] PRF&PUB:29 - The (updated) history of Android.md @alim0x --- .../29 - The (updated) history of Android.md | 130 +++--------------- 1 file changed, 18 insertions(+), 112 deletions(-) rename {translated/talk => published}/The history of Android/29 - The (updated) history of Android.md (78%) diff --git a/translated/talk/The history of Android/29 - The (updated) history of Android.md b/published/The history of Android/29 - The (updated) history of Android.md similarity index 78% rename from translated/talk/The history of Android/29 - The (updated) history of Android.md rename to published/The history of Android/29 - The (updated) history of Android.md index be378ae6d4..ba713b5a50 100644 --- a/translated/talk/The history of Android/29 - The (updated) history of Android.md +++ b/published/The history of Android/29 - The (updated) history of Android.md @@ -1,40 +1,16 @@ -安卓编年史 +安卓编年史(29):Android 5.0 Lollipop——有史以来最重要的安卓版本(3) ============================================================ -### 让我们跟着安卓从 0.5 版本到 7 的无尽迭代来看看它的发展历史。 - - 毫不夸张地说,谷歌搜索在棒棒糖中无处不在。“持续开启语音识别”这项特性让用户可以在任何界面随时说出“OK Google”,即时是在息屏状态也没有问题。谷歌应用依然是谷歌的首要主屏,这项特性是自奇巧时引入的。现在搜索栏也会显示在新的最近应用界面。 Google Now 依然是最左侧的主屏,但现在 Material Design 对它进行了大翻新,给了它一个色彩大胆的头部以及重新设计的排版。 -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/play-store-1-150x150.jpg) - ][1] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/play2-150x150.jpg) - ][2] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/6-150x150.jpg) - ][3] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/5-150x150.jpg) - ][4] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/12-2-150x150.jpg) - ][5] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/14-1-150x150.jpg) - ][6] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/19-1-150x150.jpg) - ][7] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/13-2-150x150.jpg) - ][8] +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/play-store-1-1440x707.jpg) Play 商店遵从了和其它棒棒糖应用相似的轨迹。它在视觉上焕然疑一新,大胆的色彩,新排版,还有一个全新的布局。通常这里不会有什么新增功能,就只是给一切换件新马甲。 +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/play2-1440x707.jpg) + Play 商店的导航面板现在真的可以用于导航了,每个分类有各自的入口。棒棒糖也不再在操作栏放“更多”按钮了,取而代之的是一个独立的操作按钮(通常是搜索),并且去掉了导航栏中多余的选项。这给了用户一个单独的地方来查找项目,而不用在两个菜单中寻找搜索的地方。 棒棒糖还给了应用让状态栏透明的能力。这让操作栏的颜色可以渗透到状态栏,让它只比周围的界面暗一点点。一些界面甚至在顶部使用了全幅英雄图片,同时显示到了状态栏上。 @@ -43,47 +19,11 @@ Play 商店的导航面板现在真的可以用于导航了,每个分类有各 ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/2-1-980x481.jpg) ][38] - 谷歌日历完全重写了,获得了很多新设计,也失去了很多特性。你不再能够双指缩放来调整时间视图,月份视图也从手机上消失了,周视图从七天退化成了五天的视图。在用户抱怨之后,谷歌将会花费接下来几个版本的时间来重新添加回这里面的一些特性。“谷歌日历”还加强了“谷歌”部分,去除了直接在应用内添加第三方账户的能力。非谷歌账户现在需要从 Gamil 来添加。 尽管如此,它看起来还是很棒。在一些视图上,月份开头带有头图,就像是真实的纸质日历。带有地点的事件会附带显示来自那个地点的照片。举个例子,我的“去往旧金山”会显示金门大桥。谷歌日历还会从 Gamil 获取事件并在你的日历中显示。 -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/7-150x150.jpg) - ][9] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/8-150x150.jpg) - ][10] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/12-150x150.jpg) - ][11] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/13-150x150.jpg) - ][12] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/3-1-150x150.jpg) - ][13] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/14-150x150.jpg) - ][14] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/6-2-150x150.jpg) - ][15] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/5-3-150x150.jpg) - ][16] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/7-2-150x150.jpg) - ][17] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/9-1-150x150.jpg) - ][18] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/10-1-150x150.jpg) - ][19] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/28-1-150x150.jpg) - ][20] +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/9-1-1440x2560.jpg) 其它应用都可以套用基本相同的描述:功能上没有太多新鲜的,但新设计换掉了奇巧中的灰色以大胆,明亮的色彩。环聊获得了收取 Google Voice 信息的能力,时钟应用的背景颜色会随着每天时间的变化而改变。 @@ -99,70 +39,36 @@ Play 商店的导航面板现在真的可以用于导航了,每个分类有各 #### 开机设置获得面向未来的新设计 -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/25-1-150x150.jpg) - ][21] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/26-150x150.jpg) - ][22] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2014/10/setup2-150x150.jpg) - ][23] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2014/10/setup3-150x150.jpg) - ][24] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2014/10/setup4-150x150.jpg) - ][25] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2014/10/setup5-150x150.jpg) - ][26] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2014/10/setup6-150x150.png) - ][27] +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/25-1-1440x707.jpg) 开机设置经过了大翻新,它不止是为了跟上 Material Design 指南,还是“面向未来”的,这样不管未来谷歌采用什么新的登录和验证方案,它都能够适应。记住,写“安卓编年史”的部分原因就是一些旧版安卓已经不再能工作了。这些年来,谷歌已经为用户升级了更佳加密的验证方案以及二次验证,但添加这些新的登录要求破坏了旧客户端的兼容性。很多安卓特性要求访问谷歌云设施,所以你没法登录的话,像安卓 1.0 的 Gmail 这样的就没法工作了。 +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/26-1440x1454.jpg) + 在棒棒糖中,开机设置工作的前几个界面和之前的很像。你可以看到“欢迎使用安卓界面”以及一些设置数据和 Wi-Fi 连接的选项。但在这个界面之后就有了变化。一旦棒棒糖连接到了互联网,它会连接到谷歌的服务器来“检查更新”。这并不是检查系统或应用的更新,是在检查即将执行的设置工作的更新。安卓下载了最新版本的设置,_然后_它会要求你登录你的谷歌账户。 在今天登录进棒棒糖和奇巧的时候这个好处很明显。有可以可升级的设置流程,“2014”的棒棒糖系统可以适应 2016 的改进,像是谷歌新的“[触碰登录][39]”双重认证。奇巧在这就卡住了,但幸运的是它有个“浏览器登录”可以解决双重认证的问题。 +![](https://cdn.arstechnica.net/wp-content/uploads/2014/10/setup3.jpg) + 棒棒糖的开机设置对将你的谷歌账户和密码放在单独的页面持极端立场。[谷歌讨厌密码][40]并提供了一些[实验性的方式][40]来不用单独页面登录到谷歌。如果你的账户设置为不使用密码,棒棒糖可以跳过密码页面。如果你设置了双重认证,设置页面就会进入到“输入双因素码”的设置流程。每个登录部分都是在单独的一个页面,所以设置流程是模块化的。页面可以随要求添加或移除。 +![](https://cdn.arstechnica.net/wp-content/uploads/2014/10/setup5.jpg) + 开机设置还给了用户对应用还原的控制。安卓在这之前也提供了一些数据还原,但那是无法理解的,因为它仅仅只是在没有任何用户输入的情况下选择你的一台设备并开始恢复。开机设置流程中的一个新界面让用户可以看到在云端的设备配置集合,并选择合适的那个。你还可以选择要从那个备份还原的应用。备份有应用,你的主屏布局,以及一些小设置如 Wi-Fi 热点。它不是完全的应用数据备份。 #### 设置 - -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/29-1-150x150.jpg) - ][28] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/settings-1-150x150.jpg) - ][29] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/2014-11-11-16.45.47-150x150.png) - ][30] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/battery-150x150.jpg) - ][31] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/user1-150x150.jpg) - ][32] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/users2-150x150.jpg) - ][33] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/30-1-150x150.jpg) - ][34] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/31-150x150.jpg) - ][35] +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/settings-1-1440x848.jpg) 设置从暗色主题切换到了亮色。除了新外观,它还有方便的搜索功能。每个界面用户都能访问放大镜,让他们可以更容易地找到难找的选项。 +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/2014-11-11-16.45.47-1440x2560.png) + 这里有一些和伏特计划有关的额设置。“网络限制”允许用户将一个 Wi-Fi 连接标记为计费的,让任务调度器处理后台处理时避免使用它。同时作为伏特计划的一部分,添加了一个“节电模式”。它会限制后台任务并限制 CPU 性能,给你更长的续航但更慢的设备。 +![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/user1.jpg) + 多用户支持已经出现在安卓平板中有一段时间了,但棒棒糖终于将它带到了安卓手机上。设置界面添加了一个新的“用户”页面,让你添加额外的账户或设置一个“访客”账户。访客账户是临时的——它们可以一次点击轻松删除。它不会像正常账户那样尝试下载关联到你账户的每个应用,因为它注定要在不久后被删除。 -------------------------------------------------------------------------------- @@ -177,7 +83,7 @@ via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-histor 作者:[RON AMADEO][a] 译者:[alim0x](https://github.com/alim0x) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 32bab026480038dd87ac516e687062acdc1fe465 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 16 Jul 2017 09:49:45 +0800 Subject: [PATCH 0686/1407] PRF&PUB:30 - The (updated) history of Android.md @alim0x --- .../30 - The (updated) history of Android.md | 154 ++++-------------- 1 file changed, 28 insertions(+), 126 deletions(-) rename {translated/talk => published}/The history of Android/30 - The (updated) history of Android.md (71%) diff --git a/translated/talk/The history of Android/30 - The (updated) history of Android.md b/published/The history of Android/30 - The (updated) history of Android.md similarity index 71% rename from translated/talk/The history of Android/30 - The (updated) history of Android.md rename to published/The history of Android/30 - The (updated) history of Android.md index c9408033a5..1afd263b78 100644 --- a/translated/talk/The history of Android/30 - The (updated) history of Android.md +++ b/published/The history of Android/30 - The (updated) history of Android.md @@ -1,160 +1,62 @@ -安卓编年史 +安卓编年史(30):Android TV 和 Android Auto ============================================================ -> 让我们跟着安卓从 0.5 版本到 7 的无尽迭代来看看它的发展历史。 - ### Android TV - -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/IMG_0002-22-150x150.jpg) - ][2] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/device-2014-10-31-172334-150x150.png) - ][3] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/play-store-2-150x150.png) - ][4] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/search-2-150x150.png) - ][5] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/search-1-150x150.png) - ][6] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/device-2014-10-31-150246-150x150.png) - ][7] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/device-2014-10-31-1548581-150x150.png) - ][8] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/device-2014-10-31-170651-150x150.png) - ][9] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/device-2014-10-31-174128-150x150.png) - ][10] +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/IMG_0002-22-1440x545.jpg) 2014 年 11 月谷歌公布了安卓 TV,安卓继续进行它带着一块屏幕征服一切的征程。这家公司里的一个部门之前在蜂巢时代尝试过用谷歌 TV 掌控客厅,但这次完全是来自安卓团队的新点子。安卓 TV 使用安卓 5.0 棒棒糖,并给了它一个为室内最大屏幕设计的 Material Design 界面。首发硬件谷歌选择了华硕来代工“Nexus Player”,这是一个配置不足但够用的机顶盒。 安卓 TV 专注于三样东西:视频,音乐,以及游戏。你可以用一个小遥控器控制电视,它只有四向方向键以及四个按钮,后退、主页、麦克风以及播放/暂停。至于游戏,华硕克隆了一个 Xbox 360 手柄,给了玩家一堆按键和一对摇杆。 +![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/device-2014-10-31-172334.png) + 安卓 TV 的界面很简单。大幅的媒体略缩图占据了屏幕,可以横向滚动,这些媒体中有 Youtube、Google Play、Netflix、Hulu 以及其它来源。这些略缩图实际上是来自不同媒体源的“推荐”项目,它不是简单地将一个应用的内容填满屏幕。在那下面你可以直接访问应用和设置。 +![](https://cdn.arstechnica.net/wp-content/uploads/2014/11/search-2.png) + 语音界面很赞。你可以告诉安卓 TV 播放任意你想要的内容,而不用通过图形界面去寻找。你还能在内容里获得更聪明的搜索结果,比如“显示和 Harrison Ford 有关的电影”。每个应用都可以给索引服务提供内容,而不是简单的应用集合。所有的这些应用都在 Play 商店有一个 TV 版本。开发者对安卓 TV 的特别支持还包括谷歌 cast 协议,允许用户从他们的手机和平板向电视投射视频和音乐。 ### Android 5.1 Lollipop -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/lock1-150x150.jpg) - ][11] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/2015-03-14-17.33.58-150x150.png) - ][12] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/quick-150x150.jpg) - ][13] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/new-quick-panels-150x150.jpg) - ][14] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/volumepress-150x150.jpg) - ][15] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/volumetouch-150x150.jpg) - ][16] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/volumebell-150x150.jpg) - ][17] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/interrupts1-150x150.jpg) - ][18] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/heads-up1-150x150.jpg) - ][19] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/screen-pin-2-150x150.jpg) - ][20] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/screen-pin-150x150.jpg) - ][21] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/gif1-150x150.gif) - ][22] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/Untitled-1-150x150.gif) - ][23] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/51-150x150.jpg) - ][24] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/scrollbar-150x150.jpg) - ][25] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/simcard-150x150.jpg) - ][26] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/sip-150x150.jpg) - ][27] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/status-screen-150x150.jpg) - ][28] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/time-picker-150x150.jpg) - ][29] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/icons-150x150.jpg) - ][30] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/play-store-150x150.jpg) - ][31] - 安卓 5.1 在 2015 年 3 月发布,这是安卓最小的更新。它的目的主要是[修复 Nexus 6 上的加密性能问题][43],还添加了设备保护和一些小的界面调整。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/lock1.jpg) + +![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/2015-03-14-17.33.58.png) + 设备保护是唯一的新增界面,采用的是在开机设置显示新警告的形式。这个特性在设备被偷了之后“保护你的设备不被再次利用”。一旦设置了锁屏,设备保护就开始介入,并且会在擦除设备的时候被触发。如果你以机主正常的方式擦除设备——解锁手机并从设置选择“重置”——什么都不会发生。但如果你通过开发者工具擦除,设备会在下次开机设置的时候要求你“验证之前同步的谷歌账户”。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/screen-pin-2.jpg) + +![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/time-picker.jpg) + 这个想法是基于开发者是会知道之前登录的谷歌帐号凭证的,但小偷就不知道了,他们会卡在设置这一步。在现实中这引发了[一个猫鼠游戏][44],人们寻找漏洞来绕过设备保护,而谷歌知道了这个 bug 并修补它。OEM 定制也引入了一些有趣的 bug 来绕过设备保护。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/03/icons.jpg) + 还有很多特别微小的界面改动,我们没法一一列在上面的图中。除了上面的图片描述之外没什么可说的了。 ### Android Auto -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/Android_Auto_The_right_information_for_the_road_ahead_-_YouTube_-_Google_Chrome_2016-10-29_19-49-56-150x150.jpg) - ][32] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/Android-Auto-150x150.jpg) - ][33] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-09-105548-150x150.png) - ][34] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-09-091514-150x150.png) - ][35] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-10-194221-150x150.png) - ][36] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-09-110323-150x150.png) - ][37] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-10-113659-150x150.png) - ][38] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-09-105654-150x150.png) - ][39] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-09-1117341-150x150.jpg) - ][40] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/IMG_3594-150x150.jpg) - ][41] +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/Android_Auto_The_right_information_for_the_road_ahead_-_YouTube_-_Google_Chrome_2016-10-29_19-49-56-1440x810.jpg) + +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/Android-Auto-1440x882.jpg) 同样是在 2015 年 3 月,谷歌发布了“安卓 Auto”,一个基于安卓界面的全新车载娱乐信息系统。安卓 Auto 是谷歌面对苹果的 CarPlay 交出的答卷,它们很多地方都很相似。安卓 Auto 不完全是个操作系统——它是一个运行在你手机上的“投射”界面,使用车载显示屏作为一块外置显示器。运行安卓 Auto 意味着拥有一款兼容的汽车,在手机上(安卓 5.0 及以上版本)安装了安卓 Auto 应用,并用 USB 线将手机连接到汽车。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-09-105548.png) + 安卓 Auto 给你已有的车载系统带来了谷歌的 Material Design 界面,给这个[通常挣扎于]设计好软件的平台带来了顶级的软件设计。安卓 Auto 是个对安卓界面的完全重新设计,以遵循世界各地对车载系统无数的规定。它没有通常充满应用图标的“主屏”,安卓的导航栏也变为了一个常驻的应用启动器(几乎像是个标签页式的界面)。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-10-113659.png) + 算下来特性实际上只有四部分,导航栏从左到右是:谷歌地图,一个拨号/联系人界面,“主屏”部分混合了 Google Now 和一个通知面板,还有一个音乐页面。最后一个按钮是一个“OEM”页面,让你可以退出安卓 Auto,返回到自带的车载系统(这也是为了放置汽车制造商的定制特性)。安卓 Auto 还带有谷歌的语音命令系统,以一个麦克风按钮的形式显示在屏幕右上角。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-09-091514.png) + +![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/screendump-2015-07-09-110323.png) + 安卓 Auto 的应用没有多少。它只允许两个类别的应用:音乐和信息应用。车载信息娱乐系统的规定意味着自定义界面不是个好选择。信息应用没有界面,并且可以接入语音系统,音乐应用也不会太多地改变界面,仅仅只是调整一下谷歌默认的“音乐应用”模板的颜色和图标。但实际上重要的是音乐和消息的送达,在不让驾驶员太多分心的情况下,一般的应用就没法使用了。 安卓 Auto 在它的最初发布之后就没看到多少更新了,但已经逐渐有很多汽车制造商支持了。到了 2017 年,将会有[超过 100][46] 款支持的汽车型号。 @@ -172,7 +74,7 @@ via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-histor 作者:[RON AMADEO][a] 译者:[alim0x](https://github.com/alim0x) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From afd090fe497e998cc8602a0ba844cebcce8168ec Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 16 Jul 2017 10:19:16 +0800 Subject: [PATCH 0687/1407] PRF&PUB:20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md @chenxinlong --- ...To Create Or Extend Swap Space In Linux.md | 71 +++++++++---------- 1 file changed, 33 insertions(+), 38 deletions(-) rename {translated/tech => published}/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md (59%) diff --git a/translated/tech/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md b/published/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md similarity index 59% rename from translated/tech/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md rename to published/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md index 3f0f7aef9b..ec2f90da34 100644 --- a/translated/tech/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md +++ b/published/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md @@ -3,17 +3,17 @@ 用户可以在任何 Linux 操作系统的安装过程中或者是其它必要的时候创建交换空间。如果你在安装 Linux 的时候忘记了创建或是你想要再增加交换分区的空间,你随时都可以再创建或增加。 -有时候在你安装后摇升级 RAM 的时候需要增加一点交换分区的空间,比如你要将你的系统的 RAM 从 1GB 升级到 2GB 你,那么你就不得不将你的交换分区空间也升级一下(从 2GB 到 4GB),这是因为它使用了双倍的物理 RAM 。 +有时候在你安装后摇升级 RAM 的时候需要增加一点交换分区的空间,比如你要将你的系统的 RAM 从 1GB 升级到 2GB 你,那么你就不得不将你的交换分区空间也升级一下(从 2GB 到 4GB),这是因为它使用的容量是物理 RAM 的双倍容量。(LCTT 译注:其实这里是个误区,交换分区不一定非得是双倍的物理内存容量,只是惯例如此。事实上,如果你的物理内存足够的话,你完全可以不用交换分区——在这里的情形下,或许你增加了物理内存,就没必要增加交换分区大小了。) -Swap 是当物理内存(RAM 随机存取存储器)的数量已满时,被保留用作虚拟内存的磁盘上的空间。 如果系统在 RAM 满载时需要更多的内存资源,内存中的非活动页面将被移动到交换空间,这样可以帮助系统运行应用程序更多的时间,但不应该把它当做 RAM 的扩展。 +交换空间是当物理内存(RAM 随机存取存储器)的用量已满时,被保留用作虚拟内存的磁盘上的空间。 如果系统在 RAM 满载时需要更多的内存资源,内存中的非活动页面将被移动到交换空间,这样可以帮助系统运行应用程序更多的时间,但不应该把它当做 RAM 的扩展。 建议你创建一个专用的交换分区,但是如果你没有可用的分区,那么可以使用交换文件,或交换分区和交换文件的组合。 交换空间通常建议用户至少 4 GB,用户也可以根据自己的要求和环境创建交换空间。 我发现大部分 VM 和 云服务器都没有交换分区,所以在这种情况下,我们可以使用以下三种方法创建,扩展或增加交换空间。 -#### 如何检测当前交换分区大小 +### 如何检测当前交换分区大小 -通过 **[free][1]** & `swapon` 命令来检测当前的交换分区空间的大小。  +通过 [free][1] & `swapon` 命令来检测当前的交换分区空间的大小。  ``` $ free -h @@ -28,11 +28,11 @@ NAME TYPE SIZE USED PRIO 上面的输出显示了当前的交换分区空间是 `2GB` 。 -#### 方法 1 : 通过 fallocate 命令创建 swap 文件 +### 方法 1 : 通过 fallocate 命令创建交换文件 -fallocate 程序是立即创建预分配大小的文件的最佳方法。 +`fallocate` 程序是立即创建预分配大小的文件的最佳方法。 -下面这个命令会创建一个 1GB 大小的 `/swapfile`. +下面这个命令会创建一个 1GB 大小的 `/swapfile`。 ``` $ sudo fallocate -l 1G /swapfile @@ -51,7 +51,7 @@ $ ls -lh /swapfile $ sudo chmod 600 /swapfile ``` -通过运行以下的命令来将此文件转换为 swap 文件。 +通过运行以下的命令来将此文件转换为交换文件。 ``` $ sudo mkswap /swapfile @@ -59,13 +59,13 @@ Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes) no label, UUID=cda50e0e-41f3-49c7-af61-b8cb4a33a464 ``` -通过运行以下的命令来使 swap 文件生效。 +通过运行以下的命令来使交换文件生效。 ``` $ sudo swapon /swapfile ``` -将新创建的 swap 文件添加到 fstab 文件中,这样交换分区空间的修改即使在重启后也可以生效。 +将新创建的交换文件添加到 `fstab` 文件中,这样交换分区空间的修改即使在重启后也可以生效。 ``` $ vi /etc/fstab @@ -73,7 +73,7 @@ $ vi /etc/fstab /swapfile swap swap defaults 0 0 ``` -检查一下新创建的 swap 文件。 +检查一下新创建的交换文件。 ``` $ swapon --show @@ -82,11 +82,11 @@ NAME TYPE SIZE USED PRIO /swapfile file 1024M 0B -2 ``` -现在我可以看到一个新的  `1GB swapfile1`。重启系统以使新的 swap 文件生效。 +现在我可以看到一个新的  1GB 的 `/swapfile1` 文件了。重启系统以使新的交换文件生效。 -#### 方法 2 : 通过 dd 命令来创建 swap 文件 +### 方法 2 : 通过 dd 命令来创建交换文件 -dd 命令是另一个实用程序,可以帮助我们立即创建预分配大小的文件。 +`dd` 命令是另一个实用程序,可以帮助我们立即创建预分配大小的文件。 以下 dd 命令将创建 1GB 的 `/swapfile1`。 @@ -97,16 +97,12 @@ $ sudo dd if=/dev/zero of=/swapfile1 bs=1G count=1 1073741824 bytes (1.1 GB, 1.0 GiB) copied, 16.6154 s, 64.6 MB/s ``` -**详解 :** +**详解:** -* **if=/dev/zero** 是输入文件,/dev/zero 是类 Unix 操作系统中的一个特殊文件,它提供从它读取的尽可能多的空字符(ASCII NUL,0x00)。 - - -* **of=/swapfile1** 设置输出文件 - -* **bs=1G :** 一次性读写的大小为 1GB - -* **count=1 :** 仅复制一个 BLOCKS 输入块 +* `if=/dev/zero` 是输入文件,`/dev/zero` 是类 Unix 操作系统中的一个特殊文件,它提供从它读取的尽可能多的空字符(ASCII NUL,0x00)。 +* `of=/swapfile1` 设置输出文件。 +* `bs=1G` 一次性读写的大小为 1GB +* `count=1` 仅复制一个输入块 检查一下创建的文件的大小是否正确。 @@ -121,7 +117,7 @@ $ ls -lh /swapfile1 $ sudo chmod 600 /swapfile1 ``` -通过运行以下的命令来将此文件转换为 swap 文件。 +通过运行以下的命令来将此文件转换为交换文件。 ``` $ sudo mkswap /swapfile1 @@ -129,13 +125,13 @@ Setting up swapspace version 1, size = 1024 MiB (1073737728 bytes) no label, UUID=96def6d7-b2da-4954-aa72-aa32316ec993 ``` -通过运行以下的命令来使 swap 文件生效。 +通过运行以下的命令来使交换文件生效。 ``` $ sudo swapon /swapfile1 ``` -将新创建的 swap 文件添加到 fstab 文件中,这样交换分区空间的修改即使在重启后也可以生效。 +将新创建的交换文件添加到 `fstab` 文件中,这样交换分区空间的修改即使在重启后也可以生效。 ``` $ vi /etc/fstab @@ -143,7 +139,7 @@ $ vi /etc/fstab /swapfile1 swap swap defaults 0 0 ``` -检查新创建的 swap 文件。 +检查新创建的交换文件。 ``` $ swapon --show @@ -153,27 +149,27 @@ NAME TYPE SIZE USED PRIO /swapfile1 file 1024M 0B -3 ``` -现在我可以看到一个新的  `1GB swapfile1`。重启系统以使新的 swap 文件生效。 +现在我可以看到一个新的  1GB 的 `/swapfile1` 了。重启系统以使新的交换文件生效。 -#### 方法 3 : 通过硬盘分区来创建 swap 文件 +### 方法 3 : 通过硬盘分区来创建交换文件 我们也推荐使用通过硬盘分区的方式来创建交换分区。 -如果你已经在你的另一个硬盘上通过 fdisk 命令创建了一个新的分区,假设我们已经创建了一个叫做 /dev/sda4 的分区。 +如果你已经在你的另一个硬盘上通过 `fdisk` 命令创建了一个新的分区,假设我们已经创建了一个叫做 `/dev/sda4` 的分区。 -使用 mkswap 命令来将这个分区转换成交换分区。 +使用 `mkswap` 命令来将这个分区转换成交换分区。 ``` $ sudo mkswap /dev/sda4 ``` -通过运行以下命令来使 swap 文件生效。 +通过运行以下命令来使交换文件生效。 ``` $ sudo swapon /dev/sda4 ``` -把新增的 swap 文件添加到 fstab 文件中,这样即使是重启了系统交换分区的修改也能生效。 +把新增的交换文件添加到 `fstab` 文件中,这样即使是重启了系统交换分区的修改也能生效。 ``` $ vi /etc/fstab @@ -181,7 +177,7 @@ $ vi /etc/fstab /dev/sda4 swap swap defaults 0 0 ``` -检查新创建的 swap 文件。 +检查新创建的交换文件。 ``` $ swapon --show @@ -192,17 +188,16 @@ NAME TYPE SIZE USED PRIO /dev/sda4 partition 1G 0B -4 ``` -我可以看到新的交换分区 `1GB /dev/sda4`。重启系统就可以使用新的交换分区了。 - +我可以看到新的交换分区 1GB 的 `/dev/sda4`。重启系统就可以使用新的交换分区了。 -------------------------------------------------------------------------------- via: http://www.2daygeek.com/add-extend-increase-swap-space-memory-file-partition-linux/ -作者:[2DAYGEEK ][a] +作者:[2DAYGEEK][a] 译者:[chenxinlong](https://github.com/chenxinlong) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From df9c7f054dc71fb835602e8b1728c0df0a62c94f Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 16 Jul 2017 10:34:45 +0800 Subject: [PATCH 0688/1407] =?UTF-8?q?PRF&PUB:20170524=20How=20to=20Configu?= =?UTF-8?q?re=20Thunderbird=20with=20iRedMail=20for=20Samba4=20AD=20?= =?UTF-8?q?=E2=80=93=20Part=2013.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @geekpi @oska874 这个系列终于告一段落了 --- ...d with iRedMail for Samba4 AD – Part 13.md | 82 +++++++++---------- 1 file changed, 40 insertions(+), 42 deletions(-) rename {translated/tech => published}/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md (64%) diff --git a/translated/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md b/published/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md similarity index 64% rename from translated/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md rename to published/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md index 49521d3666..d28e7ad034 100644 --- a/translated/tech/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md +++ b/published/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md @@ -1,4 +1,4 @@ -如何在 Samba4 AD 中使用 iRedMail 配置 Thunderbird - 第 13 部分 +Samba 系列(十三):如何在 Samba4 AD 中使用 iRedMail 配置 Thunderbird ============================================================ @@ -8,131 +8,130 @@ #### 要求 -1. [如何配置和集成 iRedMail 服务到 Samba4 AD DC][1] - -2. [将 iRedMail Roundcube 与 Samba4 AD DC 集成][2] +1. [如何在 CentOS 7 上安装 iRedMail 集成到 Samba4 AD][0] +2. [如何配置和集成 iRedMail 服务到 Samba4 AD DC][1] +3. [将 iRedMail Roundcube 与 Samba4 AD DC 集成][2] ### 第一步:为 iRedMail 服务器配置 Thunderbird -1. 在安装完成 Thunderbird 邮件客户端之后,点击启动器或者快捷方式打开程序,并在首屏检查 E-mail 系统集成,然后点击跳过集成按钮继续。 +1、 在安装完成 Thunderbird 邮件客户端之后,点击启动器或者快捷方式打开程序,并在首屏检查 E-mail 系统集成,然后点击跳过集成按钮继续。 [![Thunderbird System Integration](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-System-Integration.png)][3] -Thunderbird 系统集成 +*Thunderbird 系统集成* -2. 在欢迎界面点击跳过并使用我已存在的邮件按钮添加你的名字、你的 Samba 帐户邮件地址以及密码,检查记住密码区域并点击继续按钮启动你的邮箱帐户设置。 +2、 在欢迎界面点击跳过并使用我已存在的邮件按钮添加你的名字、你的 Samba 帐户邮件地址以及密码,检查记住密码区域并点击继续按钮启动你的邮箱帐户设置。 在 Thunderbird 客户端尝试识别由 iRedMail 服务器提供的正确的IMAP设置后,点击手动配置按钮手动设置 Thunderbird。 [![Thunderbird Mail Account Setup](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Mail-Account-Setup.png)][4] -Thunderbird 邮箱帐户设置 +*Thunderbird 邮箱帐户设置* -3. 邮件帐户设置窗口展开后,通过添加正确的 iRedMail 服务器 FQDN 来手动编辑 IMAP 和 SMTP 设置,为邮件服务添加安全端口(IMAPS 为 993,发送为 587),为每个端口选择合适的 SSL 通信通道并验证然后点击完成完成设置。使用以下图片作为指导。 +3、 邮件帐户设置窗口展开后,通过添加正确的 iRedMail 服务器 FQDN 来手动编辑 IMAP 和 SMTP 设置,为邮件服务添加安全端口(IMAPS 为 993,发送为 587),为每个端口选择合适的 SSL 通信通道并验证然后点击完成完成设置。使用以下图片作为指导。 [![Thunderbird iRedMail Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-iRedMail-Settings.png)][5] -Thunderbird iRedMail 设置 +*Thunderbird iRedMail 设置* -4. 由于你的 iRedMail 服务器使用自签名证书,屏幕上应会显示一个新的“安全异常”窗口。点击永久存储此异常并按确认安全异常按钮添加此安全性异常,Thunderbird 客户端应该就被成功配置了。 +4、 由于你的 iRedMail 服务器使用自签名证书,屏幕上应会显示一个新的“安全异常”窗口。点击永久存储此异常并按确认安全异常按钮添加此安全性异常,Thunderbird 客户端应该就被成功配置了。 [![Thunderbird Security Exception](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Security-Exception.png)][6] -Thunderbird 安全异常 +*Thunderbird 安全异常* 你会看到你的域帐号的所有已收文件,并且你能够从你的域或者其他域发送或者接收文件。 [![Domain Mails Inbox](https://www.tecmint.com/wp-content/uploads/2017/05/Domain-Mails-Inbox.png)][7] -域邮箱收件箱 +*域邮箱收件箱* ### 第二步:使用 Samba AD LDAP 设置 Thunderbird 联系人数据库 -5. 为了让 Thunderbird 客户端查询 Samba AD LDAP 数据库中的联系人,点击“设置”菜单,在左边面板右键单击您的帐户,如下图片所示找到 “Composition & Addressing → Addressing → Use a different LDAP server → Edit Directories” +5、 为了让 Thunderbird 客户端查询 Samba AD LDAP 数据库中的联系人,点击“设置”菜单,在左边面板右键单击您的帐户,如下图片所示找到 “Composition & Addressing → Addressing → Use a different LDAP server → Edit Directories” [![Thunderbird Samba AD LDAP Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Settings.png)][8] -Thunderbird Samba AD LDAP 设置 +*Thunderbird Samba AD LDAP 设置* [![Thunderbird Composition & Addressing Settings](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Composition-Addressing-Settings.png)][9] -Thunderbird Composition & Addressing 设置 +*Thunderbird Composition & Addressing 设置* -6. LDAP 目录服务器窗口应该带开了,点击添加按钮并将下面的内容填写到目录服务器属性窗口中: +6、 LDAP 目录服务器窗口应该带开了,点击添加按钮并将下面的内容填写到目录服务器属性窗口中: 在 “常规” 选项卡上添加此对象的描述性名称,添加你的域的名称或 Samba 域控制器的 FQDN,你的域的基本 DN 形式是 “dc=你的域,dc=tld”,LDAP 端口号 389,vmail 绑定 DN 帐户用于以 vmail@your_domain.tld 的形式查询 Samba AD LDAP 数据库。 -使用下面的截图作为指导 +使用下面的截图作为指导: [![Directory Server Properties](https://www.tecmint.com/wp-content/uploads/2017/05/Directory-Server-Properties.png)][10] -目录服务器属性 +*目录服务器属性* -7. 在下一步中,从目录服务器属性进入高级选项卡,并在搜索过滤栏添加下面的内容: +7、 在下一步中,从目录服务器属性进入高级选项卡,并在搜索过滤栏添加下面的内容: ``` (&(mail=*)(|(&(objectClass=user)(!(objectClass=computer)))(objectClass=group))) ``` [![Add Search Filter](https://www.tecmint.com/wp-content/uploads/2017/05/Add-Search-Filter.png)][11] -添加搜索过滤 +*添加搜索过滤* 让其他的设置保持默认,并点击 OK 按钮来应用更改,再次点击 OK 按钮关闭 LDAP 目录服务器窗口,在账户设置界面点击 OK 关闭窗口。 [![Select LDAP Directory Server](https://www.tecmint.com/wp-content/uploads/2017/05/Select-LDAP-Directory-Server.png)][12] -选择 LDAP 目录服务器 +*选择 LDAP 目录服务器* -8. 要测试 Thunderbird 是否能够向 Samba AD LDAP 数据库请求联系人,点击上方的地址簿图标,选择之前创建的 LDAP 数据库名。 +8、 要测试 Thunderbird 是否能够向 Samba AD LDAP 数据库请求联系人,点击上方的地址簿图标,选择之前创建的 LDAP 数据库名。 添加绑定 DN 帐户密码来查询 AD LDAP 服务器,勾选使用密码管理器记住密码,然后点击确定按钮保存更改并关闭窗口。 [![Thunderbird Samba AD LDAP Testing](https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Samba-AD-LDAP-Testing.png)][13] -Thunderbird Samba AD LDAP 测试 +*Thunderbird Samba AD LDAP 测试* -9. 使用上面的搜索框搜索 Samba AD 联系人,并提供一个域名帐户名。注意没有在 AD E-mail 字段声明的邮件地址的 Samba AD 帐户不会在 Thunderbird 地址簿搜索中列出。 +9、 使用上面的搜索框搜索 Samba AD 联系人,并提供一个域名帐户名。注意没有在 AD E-mail 字段声明的邮件地址的 Samba AD 帐户不会在 Thunderbird 地址簿搜索中列出。 [![Search Samba AD Mail Contacts](https://www.tecmint.com/wp-content/uploads/2017/05/Search-Samba-AD-Mail-Contacts.png)][14] -搜索 Samba AD 邮件联系人 +*搜索 Samba AD 邮件联系人* -10. 要在编写电子邮件时搜索联系人,请单击视图→联系人侧边栏或按 F9 键打开 “联系人” 面板。 +10、 要在编写电子邮件时搜索联系人,请单击视图→联系人侧边栏或按 F9 键打开 “联系人” 面板。 [![Search Mail Contacts in Thunderbird](https://www.tecmint.com/wp-content/uploads/2017/05/Search-Mail-Contact-in-Thunderbird.png)][15] -在 Thunderbird 中搜索联系人 +*在 Thunderbird 中搜索联系人* -11. 选择合适的地址簿,你应该能够搜索并添加收件人的电子邮件地址。发送第一封邮件时,会出现一个新的安全警报窗口。点击确认安全例外,邮件应该就能发送到收件人地址中了。 +11、 选择合适的地址簿,你应该能够搜索并添加收件人的电子邮件地址。发送第一封邮件时,会出现一个新的安全警报窗口。点击确认安全例外,邮件应该就能发送到收件人地址中了。 [![Send Mail in Thunderbird](https://www.tecmint.com/wp-content/uploads/2017/05/Send-Mail-in-Thunderbird.jpg)][16] -在 Thunderbird 发送邮件 +*在 Thunderbird 发送邮件* -12. 如果你想通过仅针对特定 AD 组织单位的 Samba LDAP 数据库搜索联系人,请从左边面板编辑你的目录服务器名称的地址簿,点击属性并添加自定义的 Samba AD OU,如下所示。 +12、 如果你想通过仅针对特定 AD 组织单位的 Samba LDAP 数据库搜索联系人,请从左边面板编辑你的目录服务器名称的地址簿,点击属性并添加自定义的 Samba AD OU,如下所示。 ``` ou=your_specific_ou,dc=your_domain,dc=tld ``` [![Search Contacts in Samba LDAP Database](https://www.tecmint.com/wp-content/uploads/2017/05/Search-Contacts-in-Samba-LDAP-Database.png)][17] - Samba LDAP 数据库中搜索联系人 +*Samba LDAP 数据库中搜索联系人* ### 第三步:设置 LDAP 离线副本 -13. 要为 Thunderbird 配置 Samba AD LDAP 离线副本,请点击“地址簿”按钮,选择你的 LDAP 通讯录,打开“目录服务器属性” -> “常规” 选项卡,将端口号更改为 3268。 +13、 要为 Thunderbird 配置 Samba AD LDAP 离线副本,请点击“地址簿”按钮,选择你的 LDAP 通讯录,打开“目录服务器属性” -> “常规” 选项卡,将端口号更改为 3268。 接着切换到离线选项卡并点击“现在下载”按钮开始在本地复制 Samba AD LDAP 数据库。 [![Setup LDAP Offline Replica in Thunderbird](https://www.tecmint.com/wp-content/uploads/2017/05/Setup-LDAP-Offline-Replica-in-Thunderbird.png)][18] -在 Thunderbird 设置 LDAP 离线副本 +*在 Thunderbird 设置 LDAP 离线副本* [![Download LDAP Database for Offline](https://www.tecmint.com/wp-content/uploads/2017/05/Download-Samba-LDAP-Database-Offline.png)][19] -为离线下载 LDAP 数据库 - +*为离线下载 LDAP 数据库* 当同步联系人完成后,你将收到消息复制成功通知。点击 OK 并关闭所有窗口。在无法访问 Samba 域控制器的情况下,你仍然可以通过离线方式进行搜索。 @@ -142,21 +141,20 @@ ou=your_specific_ou,dc=your_domain,dc=tld 我是一个电脑上瘾的家伙,开源和基于 linux 的系统软件的粉丝,在 Linux 发行版桌面、服务器和 bash 脚本方面拥有大约4年的经验。 - - -------------- via: https://www.tecmint.com/configure-thunderbird-with-iredmail-for-samba4-ad-ldap/ -作者:[Matei Cezar ][a] +作者:[Matei Cezar][a] 译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 [a]:https://www.tecmint.com/author/cezarmatei/ -[1]:https://www.tecmint.com/integrate-iredmail-to-samba4-ad-dc-on-centos-7/ -[2]:https://www.tecmint.com/integrate-iredmail-roundcube-with-samba4-ad-dc/ +[0]:https://linux.cn/article-8567-1.html +[1]:https://linux.cn/article-8673-1.html +[2]:https://linux.cn/article-8678-1.html [3]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-System-Integration.png [4]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-Mail-Account-Setup.png [5]:https://www.tecmint.com/wp-content/uploads/2017/05/Thunderbird-iRedMail-Settings.png From e836b5584e02562e60eb0759d67f77d4b255abdb Mon Sep 17 00:00:00 2001 From: cinlen_0x05 <237448382@qq.com> Date: Sun, 16 Jul 2017 16:19:29 +0800 Subject: [PATCH 0689/1407] translating by chenxinlong (#5806) --- ... An introduction to functional programming in JavaScript.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sources/tech/20170627 An introduction to functional programming in JavaScript.md b/sources/tech/20170627 An introduction to functional programming in JavaScript.md index 729d28f977..01bd8cad48 100644 --- a/sources/tech/20170627 An introduction to functional programming in JavaScript.md +++ b/sources/tech/20170627 An introduction to functional programming in JavaScript.md @@ -1,3 +1,4 @@ +translating by chenxinlong An introduction to functional programming in JavaScript ============================================================ @@ -719,7 +720,7 @@ Matt Banz - Matt graduated from the University of Utah with a degree in mathemat via: https://opensource.com/article/17/6/functional-javascript 作者:[Matt Banz ][a] -译者:[译者ID](https://github.com/译者ID) +译者:[chenxinlong](https://github.com/chenxinlong) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From c64c1506d7157fdb827874cc9d7080e5615af92a Mon Sep 17 00:00:00 2001 From: mec2cod Date: Sun, 16 Jul 2017 16:19:56 +0800 Subject: [PATCH 0690/1407] translate 20170617 What all you need to know about HTML5.md (#5805) --- sources/tech/20170617 What all you need to know about HTML5.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170617 What all you need to know about HTML5.md b/sources/tech/20170617 What all you need to know about HTML5.md index b5adee5fb2..beeeb0542d 100644 --- a/sources/tech/20170617 What all you need to know about HTML5.md +++ b/sources/tech/20170617 What all you need to know about HTML5.md @@ -1,3 +1,4 @@ +translated by zhousiyu325 What all you need to know about HTML5 ============================================================ From 54d59f3057dd61dcbde4e556dec252e5d4e54a17 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 16:24:48 +0800 Subject: [PATCH 0691/1407] =?UTF-8?q?20170716-1=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20170702 Beyond public key encryption.md | 167 ++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 sources/talk/20170702 Beyond public key encryption.md diff --git a/sources/talk/20170702 Beyond public key encryption.md b/sources/talk/20170702 Beyond public key encryption.md new file mode 100644 index 0000000000..0bd43698d9 --- /dev/null +++ b/sources/talk/20170702 Beyond public key encryption.md @@ -0,0 +1,167 @@ +Beyond public key encryption +============================================================ + +One of the saddest and most fascinating things about applied cryptography is  _how  +![6689264031_4c7516b3e1_z](https://matthewdgreen.files.wordpress.com/2017/07/6689264031_4c7516b3e1_z.jpg?w=300&h=200) +little cryptography we actually use. _ This is not to say that cryptography isn’t widely used in industry — it is. Rather, what I mean is that cryptographic researchers have developed so many useful technologies, and yet industry on a day to day basis barely uses any of them. In fact, with a few minor exceptions, the vast majority of the cryptography we use was settled by the early-2000s.* + +Most people don’t sweat this, but as a cryptographer who works on the boundary of research and deployed cryptography it makes me unhappy. So while I can’t solve the problem entirely, what I  _can_  do is talk about some of these newer technologies. And over the course of this summer that’s what I intend to do: talk. Specifically, in the next few weeks I’m going to write a series of posts that describe some of the advanced cryptography that we  _don’t_  generally see used. + +Today I’m going to start with a very simple question: what lies beyond public key cryptography? Specifically, I’m going to talk about a handful of technologies that were developed in the past 20 years, each of which allows us to go beyond the traditional notion of public keys. + +This is a wonky post, but it won’t be mathematically-intense. For actual definitions of the schemes, I’ll provide links to the original papers, and references to cover some of the background. The point here is to explain what these new schemes do — and how they can be useful in practice. + +### Identity Based Cryptography + +In the mid-1980s, a cryptographer named Adi Shamir proposed a [radical new idea.][3]The idea, put simply, was  _to get rid of public keys_ . + +To understand where Shamir was coming from, it helps to understand a bit about public key encryption. You see, prior to the invention of public key crypto, all cryptography involved secret keys. Dealing with such keys was a huge drag. Before you could communicate securely, you needed to exchange a secret with your partner. This process was fraught with difficulty and didn’t scale well. + +Public key encryption (beginning with [Diffie-Hellman][4] and Shamir’s [RSA][5]cryptosystem) hugely revolutionized cryptography by dramatically simplifying this key distribution process. Rather than sharing secret keys, users could now transmit their  _public_  key to other parties. This public key allowed the recipient to encrypt to you (or verify your signature) but it could not be used to perform the corresponding decryption (or signature generation) operations. That part would be done with a secret key you kept to yourself. + +While the use of public keys improved many aspects of using cryptography, it also gave rise to a set of new challenges. In practice, it turns out that having public keys is only half the battle — people still need to use distribute them securely. + +For example, imagine that I want to send you a PGP-encrypted email. Before I can do this, I need to obtain a copy of your public key. How do I get this? Obviously we could meet in person and exchange that key on physical media — but nobody wants to do this. It would much more desirable to obtain your public key electronically. In practice this means either  _(1)_  we have to exchange public keys by email, or  _(2)_  I have to obtain your key from a third piece of infrastructure, such as a [website][6] or [key server][7]. And now we come to the  problem: if that email or key server is  _untrustworthy _ (or simply allows anyone to [upload a key in y][8][our name][9]),I might end up downloading a malicious party’s key by accident. When I send a message to “you”, I’d actually be encrypting it to Mallory. + +![f64f315ec47f0b041e3d881177039414](https://matthewdgreen.files.wordpress.com/2017/07/f64f315ec47f0b041e3d881177039414.jpg?w=190&h=100) +Mallory. + +Solving this problem — of exchanging public keys and verifying their provenance — has motivated a  _huge_ amount of practical cryptographic engineering, including the entire [web PKI.][10] In most cases, these systems work well. But Shamir wasn’t satisfied. What if, he asked, we could do it better? More specifically, he asked:  _could we replace those pesky public keys with something better?_ + +Shamir’s idea was exciting. What he proposed was a new form of public key cryptography in which the user’s “public key” could simply be their  _identity_ . This identity could be a name (e.g., “Matt Green”) or something more precise like an email address. Actually, it didn’t realy matter. What did matter was that the public key would be some arbitrary string — and  _not_  a big meaningless jumble of characters like “7cN5K4pspQy3ExZV43F6pQ6nEKiQVg6sBkYPg1FG56Not”. + +Of course, using an arbitrary string as a public key raises a big problem. Meaningful identities sound great — but I don’t own them. If my public key is “Matt Green”, how do I get the corresponding private key? And if _I_  can get out that private key, what stops  _some other Matt Green_  from doing the same, and thus reading my messages? And ok, now that I think about this, what stops some random person who  _isn’t_  named Matt Green from obtaining it? Yikes. We’re headed straight into [Zooko’s triangle][11]. + +Shamir’s idea thus requires a bit more finesse. Rather than expecting identities to be global, he proposed a special server called a “key generation authority” that would be responsible for generating the private keys. At setup time, this authority would generate a single  _master public key (MPK), _ which it would publish to the world. If you wanted to encrypt a message to “Matt Green” (or verify my signature), then you could do so using my identity and the single MPK of an authority we’d both agree to use. To  _decrypt _ that message (or sign one), I would have to visit the same key authority and ask for a copy of my secret key. The key authority would compute my key based on a  _master secret key (MSK)_ , which it would keep very secret. + +With all algorithms and players specified, whole system looks like this: + +![IBE](https://matthewdgreen.files.wordpress.com/2017/07/ibe1.png?w=700) +Overview of an Identity-Based Encryption (IBE) system. The Setup algorithm of the Key Generation Authority generates the master public key (MPK) and master secret key (MSK). The authority can use the Extract algorithm to derive the secret key corresponding to a specific ID. The encryptor (left) encrypts using only the identity and MPK. The recipient requests the secret key for her identity, and then uses it to decrypt. (Icons by [Eugen Belyakoff][1]) + +This design has some important advantages — and more than a few obvious drawbacks. On the plus side, it removes the need for any key exchange  _at all_  with the person you’re sending the message to. Once you’ve chosen a master key authority (and downloaded its MPK), you can encrypt to anyone in the entire world. Even cooler: at the time you encrypt,  _your recipient doesn’t even need to have contacted the key authority yet_ . She can obtain her secret key  _after_  I send her a message. + +Of course, this “feature” is also a bug. Because the key authority generates all the secret keys, it has an awful lot of power. A dishonest authority could easily generate your secret key and decrypt your messages. The polite way to say this is that standard IBE systems effectively “bake in” [key escrow][12].** + +### Putting the “E” in IBE + +All of these ideas and more were laid out by Shamir in his 1984 paper. There was just one small problem: Shamir could only figure out half the problem. + +Specifically, Shamir’s proposed a scheme for  _identity-based signature_  (IBS) — a signature scheme where the public verification key is an identity, but the signing key is generated by the key authority. Try as he might, he could not find a solution to the problem of building identity-based _ encryption _ (IBE). This was left as an open problem.*** + +It would take more than 16 years before someone answered Shamir’s challenge. Surprisingly, when the answer came it came not once  _but three times_ . + +The first, and probably most famous realization of IBE was developed by Dan Boneh and Matthew Franklin much later — in 2001\. The timing of Boneh and Franklin’s discovery makes a great deal of sense. The Boneh-Franklin scheme relies fundamentally on elliptic curves that support an efficient “[bilinear map][13]” (or “pairing”).**** The [algorithms][14] needed to compute such pairings were not known when Shamir wrote his paper, and weren’t employed  _constructively_  — that is, as a useful thing rather than [an attack][15] — until about [2000][16]. The same can be said about a second scheme called [Sakai-Kasahara][17], which would be independently discovered around the same time. + + _(For a brief tutorial on the Boneh-Franklin IBE scheme, see [this page][2].)_ + +The third realization of IBE was not as efficient as the others, but was much more surprising. [This scheme][18] was developed by Clifford Cocks, a senior cryptologist at Britain’s GCHQ. It’s noteworthy for two reasons. First, Cocks’ IBE scheme does not require bilinear pairings at all — it is based in the much older RSA setting, which means  _in principle _ it spent all those years just waiting to be found. Second, Cocks himself had recently become known for something even more surprising: [discovering the RSA cryptosystem,][19] nearly five years before RSA did. To bookend that accomplishment with a second major advance in public key cryptography was a pretty impressive accomplishment. + +In the years since 2001, a number of additional IBE constructions have been developed, using all sorts of cryptographic settings. Nonetheless, Boneh and Franklin’s early construction remains among the simplest and most efficient. + +Even if you’re not interested in IBE for its own sake, it turns out that this primitive is really useful to cryptographers for many things beyond simple encryption. In fact, it’s more helpful to think of IBE as a way of “pluralizing” a single public/secret master keypair into billions of related keypairs. This makes it useful for applications as diverse as blocking [chosen ciphertext attacks,][20] [forward-secure public key encryption][21], and short [signature schemes][22]. + +Attribute Based Encryption + +Of course, if you leave cryptographers alone with a tool like IBE, the first thing they’re going to do is find a way to ~~make things more complicated~~ improve on it. + +One of the biggest such improvements is due to [Sahai and Waters][23]. It’s called Attribute-Based Encryption, or ABE. + +The origin of this idea was not actually to encrypt with attributes. Instead Sahai and Waters were attempting to develop an  _Identity-Based_  encryption scheme that could encrypt using biometrics. To understand the problem, imagine I decide to use a biometric like your [iris scan][24] as the “identity” to encrypt you a ciphertext. Later on you’ll ask the authority for a decryption key that corresponds to your own iris scan — and if everything matches up and you’ll be able to decrypt. + +The problem is that this will almost never work. + +The issue here is that biometric readings (like iris scans or fingerprint templates) are inherently error-prone. This means every scan will typically be very  _close_ , but often there will be a few bits that disagree. With standard IBE + +![iris](https://matthewdgreen.files.wordpress.com/2017/07/iris.jpg?w=300&h=223) +Tell me this isn’t giving you nightmares. + +this is  _fatal_ : if the encryption identity differs from your key identity by even a single bit, decryption will not work. You’re out of luck. + +Sahai and Waters decided that the solution to this problem was to develop a form of IBE with a “threshold gate”. In this setting, each bit of the identity is represented as a different “attribute”. Think of each of these as components you’d encrypt under — something like “bit 5 of your iris scan is a 1” and “bit 23 of your iris scan is a 0”. The encrypting party lists all of these bits and encrypts under each one. The decryption key generated by the authority embeds a similar list of bit values. The scheme is defined so that decryption will work if and only if the number of matching attributes (between your key and the ciphertext) exceeds some pre-defined threshold:  _e.g.,_  any 2024 out of 2048 bits must be identical in order to decrypt. + +The beautiful thing about this idea is not fuzzy IBE. It’s that once you have a threshold gate and a concept of “attributes”, you can more interesting things. The [main observation][25] is that a threshold gate can be used to implement the boolean AND and OR gates, like so: + +![gates](https://matthewdgreen.files.wordpress.com/2017/07/gates.png?w=700) + +Even better, you can  _stack_  these gates on top of one another to assign a fairly complex boolean formula — which will itself determine what conditions your ciphertext can be decrypted under. For example, switching to a more realistic set of attributes, you could encrypt a medical record so that either a pediatrician in a hospital could read it,  _or_  an insurance adjuster could. All you’d need is to make sure people received keys that correctly described  _their_  attributes (which are just arbitrary strings, like identities). + +![ABEFormula](https://matthewdgreen.files.wordpress.com/2017/07/abeformula.png?w=700) +A simple “ciphertext policy”, in which the ciphertext can be decrypted if and only if a key matches an appropriate set of attributes. In this case, the key satisfies the formula and thus the ciphertext decrypts. The remaining key attributes are ignored. + +The other direction can be implemented as well. It’s possible to encrypt a ciphertext under a long list of attributes, such as creation time, file name, and even GPS coordinates indicating where the file was created. You can then have the authority hand out keys that correspond to a very precise slice of your dataset — for example, “this key decrypts any radiology file encrypted in Chicago between November 3rd and December 12th that is tagged with ‘pediatrics’ or ‘oncology'”. + +### Functional Encryption + +Once you have a related of primitives like IBE and ABE, the researchers’ instinct is to both extend and generalize. Why stop at simple boolean formulae? Can we make keys (or ciphertexts) that embed  _arbitrary computer programs? _ The answer, it turns out, is yes — though not terribly efficiently. A set of [recent][26] [works][27] show that it is possible to build ABE that works over arbitrary polynomial-size circuits, using various lattice-based assumptions. So there is certainly a lot of potential here. + +This potential has inspired researchers to generalize all of the above ideas into a single class of encryption called “[functional encryption][28]“. Functional encryption is more conceptual than concrete — it’s just a way to look at all of these systems as instances of a specific class. The basic idea is to represent the decryption procedure as an algorithm that computes an arbitary function  _F_  over (1) the plaintext inside of a ciphertext, and (2) the data embedded in the key. This function has the following profile: + + _output = F(key data, plaintext data)_ + +In this model  _IBE_  can be expressed by having the encryption algorithm encrypt _ (identity, plaintext) _ and defining the function  _F _ such that, if “ _key input == identity”, it _ outputs the plaintext, and outputs an empty string otherwise. Similarly, ABE can be expressed by a slightly more complex function. Following this paradigm, once can envision all sorts of interesting functions that might be computed by different functions and realized by future schemes. + +But those will have to wait for another time. We’ve gone far enough for today. + +### So what’s the point of all this? + +For me, the point is just to show that cryptography can do some pretty amazing things. We rarely see this on a day-to-day basis when it comes to industry and “applied” cryptography, but it’s all there waiting to be used. + +Perhaps the perfect application is out there. Maybe you’ll find it. + + _Notes:_ + +* An earlier version of this post said “mid-1990s”. In comments below, Tom Ristenpart takes issue with that and makes the excellent point that many important developments post-date that. So I’ve moved the date forward about five years, and I’m thinking about how to say this in a nicer way. + +** There is also an intermediate form of encryption known as “[certificateless encryption][29]“. Proposed by Al-Riyami and Paterson, this idea uses a  _combination_  of standard public key encryption and IBE. The basic idea is to encrypt each message using  _both_  a traditional public key (generated by the recipient) and an IBE identity. The recipient must then obtain a copy of the secret key from the IBE authority to decrypt. The advantages here are twofold: (1) the IBE key authority can’t decrypt the message by itself, since it does not have the corresponding secret key, which solves the “escrow” problem. And (2) the sender does not need to verify that the public key really belongs to the sender (e.g., by checking a certificate), since the IBE portion prevents imposters from decrypting the resulting message. Unfortunately this system is more like traditional public key cryptography than IBE, and does not have the neat usability features of IBE. + +*** A part of the challenge of developing IBE is the need to make a system that is secure against “collusion” between different key holders. For example, imagine a very simple system that has only 2-bit identities. This gives four possible identities: “00”, “01”, “10”, “11”. If I give you a key for the identity “01” and I give Bob a key for “10”, we need to ensure that you two cannot collude to produce a key for identities “00” and “11”. Many earlier proposed solutions have tried to solve this problem by gluing together standard public encryption keys in various ways (e.g., by having a separate public key for each bit of the identity and giving out the secret keys as a single “key”). However these systems tend to fail catastrophically when just a few users collude (or their keys are stolen). Solving the collusion problem is fundamentally what separates real IBE from its faux cousins. + +**** A full description of Boneh and Franklin’s scheme can be found [here][30], or in the [original paper][31]. Some code is [here][32] and [here][33] and [here][34]. I won’t spend more time on it, except to note that the scheme is very efficient. It was patented and implemented by [Voltage Security][35], now part of HPE. + +-------------------------------------------------------------------------------- + +via: https://github.com/LCTT/TranslateProject/tree/master/sources/tech + +作者:[Matthew Green][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://blog.cryptographyengineering.com/author/matthewdgreen/ +[1]:https://thenounproject.com/eugen.belyakoff/ +[2]:https://blog.cryptographyengineering.com/boneh-franklin-ibe/ +[3]:https://discovery.csc.ncsu.edu/Courses/csc774-S08/reading-assignments/shamir84.pdf +[4]:https://en.wikipedia.org/wiki/Diffie%E2%80%93Hellman_key_exchange +[5]:https://en.wikipedia.org/wiki/RSA_(cryptosystem) +[6]:https://keybase.io/ +[7]:https://pgp.mit.edu/ +[8]:https://motherboard.vice.com/en_us/article/bmvdwd/wave-of-spoofed-encryption-keys-shows-weakness-in-pgp +[9]:https://motherboard.vice.com/en_us/article/bmvdwd/wave-of-spoofed-encryption-keys-shows-weakness-in-pgp +[10]:https://en.wikipedia.org/wiki/Certificate_authority +[11]:https://en.wikipedia.org/wiki/Zooko%27s_triangle +[12]:https://en.wikipedia.org/wiki/Key_escrow +[13]:http://people.csail.mit.edu/alinush/6.857-spring-2015/papers/bilinear-maps.pdf +[14]:https://crypto.stanford.edu/miller/ +[15]:http://ieeexplore.ieee.org/document/259647/ +[16]:https://pdfs.semanticscholar.org/845e/96c20e5a5ff3b03f4caf72c3cb817a7fa542.pdf +[17]:https://en.wikipedia.org/wiki/Sakai%E2%80%93Kasahara_scheme +[18]:https://pdfs.semanticscholar.org/8289/821325781e2f0ce83cfbfc1b62c44be799ee.pdf +[19]:https://cryptome.org/jya/ellisdoc.htm +[20]:https://www.cs.umd.edu/~jkatz/papers/id-cca.pdf +[21]:https://eprint.iacr.org/2003/083.pdf +[22]:https://en.wikipedia.org/wiki/Boneh%E2%80%93Lynn%E2%80%93Shacham +[23]:https://eprint.iacr.org/2004/086.pdf +[24]:https://en.wikipedia.org/wiki/Iris_recognition +[25]:https://eprint.iacr.org/2006/309.pdf +[26]:https://eprint.iacr.org/2013/337.pdf +[27]:https://arxiv.org/abs/1210.5287 +[28]:https://eprint.iacr.org/2010/543.pdf +[29]:http://eprint.iacr.org/2003/126.pdf +[30]:https://en.wikipedia.org/wiki/Boneh%E2%80%93Franklin_scheme +[31]:https://crypto.stanford.edu/~dabo/papers/bfibe.pdf +[32]:http://go-search.org/view?id=github.com%2Fvanadium%2Fgo.lib%2Fibe +[33]:https://github.com/relic-toolkit/relic +[34]:https://github.com/JHUISI/charm +[35]:https://www.voltage.com/ From a9e5c2b60c88ff0cbb95824314f6e2a4f0c25336 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 16:27:49 +0800 Subject: [PATCH 0692/1407] =?UTF-8?q?20170716-2=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ebugger Part 7 Source-level breakpoints.md | 362 ++++++++++++++++++ 1 file changed, 362 insertions(+) create mode 100644 sources/tech/20170619 Writing a Linux Debugger Part 7 Source-level breakpoints.md diff --git a/sources/tech/20170619 Writing a Linux Debugger Part 7 Source-level breakpoints.md b/sources/tech/20170619 Writing a Linux Debugger Part 7 Source-level breakpoints.md new file mode 100644 index 0000000000..f50e377897 --- /dev/null +++ b/sources/tech/20170619 Writing a Linux Debugger Part 7 Source-level breakpoints.md @@ -0,0 +1,362 @@ +Writing a Linux Debugger Part 7: Source-level breakpoints +============================================================ + +Setting breakpoints on memory addresses is all well and good, but it doesn’t provide the most user-friendly tool. We’d like to be able to set breakpoints on source lines and function entry addresses as well, so that we can debug at the same abstraction level as our code. + +This post will add source-level breakpoints to our debugger. With all of the support we already have available to us, this is a lot easier than it may first sound. We’ll also add a command to get the type and address of a symbol, which can be useful for locating code or data and understanding linking concepts. + +* * * + +### Series index + +These links will go live as the rest of the posts are released. + +1. [Setup][1] + +2. [Breakpoints][2] + +3. [Registers and memory][3] + +4. [Elves and dwarves][4] + +5. [Source and signals][5] + +6. [Source-level stepping][6] + +7. [Source-level breakpoints][7] + +8. [Stack unwinding][8] + +9. Reading variables + +10. Next steps + +* * * + +### Breakpoints + +### DWARF + +The [Elves and dwarves][9] post described how DWARF debug information works and how it can be used to map the machine code back to the high-level source. Recall that DWARF contains the address ranges of functions and a line table which lets you translate code positions between abstraction levels. We’ll be using these capabilities to implement our breakpoints. + +### Function entry + +Setting breakpoints on function names can be complex if you want to take overloading, member functions and such into account, but we’re going to iterate through all of the compilation units and search for functions with names which match what we’re looking for. The DWARF information will look something like this: + +``` +< 0><0x0000000b> DW_TAG_compile_unit + DW_AT_producer clang version 3.9.1 (tags/RELEASE_391/final) + DW_AT_language DW_LANG_C_plus_plus + DW_AT_name /super/secret/path/MiniDbg/examples/variable.cpp + DW_AT_stmt_list 0x00000000 + DW_AT_comp_dir /super/secret/path/MiniDbg/build + DW_AT_low_pc 0x00400670 + DW_AT_high_pc 0x0040069c + +LOCAL_SYMBOLS: +< 1><0x0000002e> DW_TAG_subprogram + DW_AT_low_pc 0x00400670 + DW_AT_high_pc 0x0040069c + DW_AT_name foo + ... +... +<14><0x000000b0> DW_TAG_subprogram + DW_AT_low_pc 0x00400700 + DW_AT_high_pc 0x004007a0 + DW_AT_name bar + ... + +``` + +We want to match against `DW_AT_name` and use `DW_AT_low_pc`(the start address of the function) to set our breakpoint. + +``` +void debugger::set_breakpoint_at_function(const std::string& name) { + for (const auto& cu : m_dwarf.compilation_units()) { + for (const auto& die : cu.root()) { + if (die.has(dwarf::DW_AT::name) && at_name(die) == name) { + auto low_pc = at_low_pc(die); + auto entry = get_line_entry_from_pc(low_pc); + ++entry; //skip prologue + set_breakpoint_at_address(entry->address); + } + } + } +} +``` + +The only bit of that code which looks a bit weird is the `++entry`. The problem is that the `DW_AT_low_pc` for a function doesn’t point at the start of the user code for that function, it points to the start of the prologue. The compiler will usually output a prologue and epilogue for a function which carries out saving and restoring registers, manipulating the stack pointer and suchlike. This isn’t very useful for us, so we increment the line entry by one to get the first line of the user code instead of the prologue. The DWARF line table actually has some functionality to mark an entry as the first line after the function prologue, but not all compilers output this, so I’ve taken the naive approach. + +### Source line + +To set a breakpoint on a high-level source line, we translate this line number into an address by looking it up in the DWARF. We’ll iterate through the compilation units looking for one whose name matches the given file, then look for the entry which corresponds to the given line. + +The DWARF will look something like this: + +``` +.debug_line: line number info for a single cu +Source lines (from CU-DIE at .debug_info offset 0x0000000b): + +NS new statement, BB new basic block, ET end of text sequence +PE prologue end, EB epilogue begin +IS=val ISA number, DI=val discriminator value + [lno,col] NS BB ET PE EB IS= DI= uri: "filepath" +0x004004a7 [ 1, 0] NS uri: "/super/secret/path/a.hpp" +0x004004ab [ 2, 0] NS +0x004004b2 [ 3, 0] NS +0x004004b9 [ 4, 0] NS +0x004004c1 [ 5, 0] NS +0x004004c3 [ 1, 0] NS uri: "/super/secret/path/b.hpp" +0x004004c7 [ 2, 0] NS +0x004004ce [ 3, 0] NS +0x004004d5 [ 4, 0] NS +0x004004dd [ 5, 0] NS +0x004004df [ 4, 0] NS uri: "/super/secret/path/ab.cpp" +0x004004e3 [ 5, 0] NS +0x004004e8 [ 6, 0] NS +0x004004ed [ 7, 0] NS +0x004004f4 [ 7, 0] NS ET + +``` + +So if we want to set a breakpoint on line 5 of `ab.cpp`, we look up the entry which corresponds to that line (`0x004004e3`) and set a breakpoint there. + +``` +void debugger::set_breakpoint_at_source_line(const std::string& file, unsigned line) { + for (const auto& cu : m_dwarf.compilation_units()) { + if (is_suffix(file, at_name(cu.root()))) { + const auto& lt = cu.get_line_table(); + + for (const auto& entry : lt) { + if (entry.is_stmt && entry.line == line) { + set_breakpoint_at_address(entry.address); + return; + } + } + } + } +} +``` + +My `is_suffix` hack is there so you can type `c.cpp` for `a/b/c.cpp`. Of course you should actually use a sensible path handling library or something; I’m lazy. The `entry.is_stmt` is checking that the line table entry is marked as the beginning of a statement, which is set by the compiler on the address it thinks is the best target for a breakpoint. + +* * * + +### Symbol lookup + +When we get down to the level of object files, symbols are king. Functions are named with symbols, global variables are named with symbols, you get a symbol, we get a symbol, everyone gets a symbol. In a given object file, some symbols might reference other object files or shared libraries, where the linker will patch things up to create an executable program from the symbol reference spaghetti. + +Symbols can be looked up in the aptly-named symbol table, which is stored in ELF sections in the binary. Fortunately, `libelfin` has a fairly nice interface for doing this, so we don’t need to deal with all of the ELF nonsense ourselves. To give you an idea of what we’re dealing with, here is a dump of the `.symtab` section of a binary, produced with `readelf`: + +``` +Num: Value Size Type Bind Vis Ndx Name + 0: 0000000000000000 0 NOTYPE LOCAL DEFAULT UND + 1: 0000000000400238 0 SECTION LOCAL DEFAULT 1 + 2: 0000000000400254 0 SECTION LOCAL DEFAULT 2 + 3: 0000000000400278 0 SECTION LOCAL DEFAULT 3 + 4: 00000000004002c8 0 SECTION LOCAL DEFAULT 4 + 5: 0000000000400430 0 SECTION LOCAL DEFAULT 5 + 6: 00000000004004e4 0 SECTION LOCAL DEFAULT 6 + 7: 0000000000400508 0 SECTION LOCAL DEFAULT 7 + 8: 0000000000400528 0 SECTION LOCAL DEFAULT 8 + 9: 0000000000400558 0 SECTION LOCAL DEFAULT 9 +10: 0000000000400570 0 SECTION LOCAL DEFAULT 10 +11: 0000000000400714 0 SECTION LOCAL DEFAULT 11 +12: 0000000000400720 0 SECTION LOCAL DEFAULT 12 +13: 0000000000400724 0 SECTION LOCAL DEFAULT 13 +14: 0000000000400750 0 SECTION LOCAL DEFAULT 14 +15: 0000000000600e18 0 SECTION LOCAL DEFAULT 15 +16: 0000000000600e20 0 SECTION LOCAL DEFAULT 16 +17: 0000000000600e28 0 SECTION LOCAL DEFAULT 17 +18: 0000000000600e30 0 SECTION LOCAL DEFAULT 18 +19: 0000000000600ff0 0 SECTION LOCAL DEFAULT 19 +20: 0000000000601000 0 SECTION LOCAL DEFAULT 20 +21: 0000000000601018 0 SECTION LOCAL DEFAULT 21 +22: 0000000000601028 0 SECTION LOCAL DEFAULT 22 +23: 0000000000000000 0 SECTION LOCAL DEFAULT 23 +24: 0000000000000000 0 SECTION LOCAL DEFAULT 24 +25: 0000000000000000 0 SECTION LOCAL DEFAULT 25 +26: 0000000000000000 0 SECTION LOCAL DEFAULT 26 +27: 0000000000000000 0 SECTION LOCAL DEFAULT 27 +28: 0000000000000000 0 SECTION LOCAL DEFAULT 28 +29: 0000000000000000 0 SECTION LOCAL DEFAULT 29 +30: 0000000000000000 0 SECTION LOCAL DEFAULT 30 +31: 0000000000000000 0 FILE LOCAL DEFAULT ABS init.c +32: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c +33: 0000000000600e28 0 OBJECT LOCAL DEFAULT 17 __JCR_LIST__ +34: 00000000004005a0 0 FUNC LOCAL DEFAULT 10 deregister_tm_clones +35: 00000000004005e0 0 FUNC LOCAL DEFAULT 10 register_tm_clones +36: 0000000000400620 0 FUNC LOCAL DEFAULT 10 __do_global_dtors_aux +37: 0000000000601028 1 OBJECT LOCAL DEFAULT 22 completed.6917 +38: 0000000000600e20 0 OBJECT LOCAL DEFAULT 16 __do_global_dtors_aux_fin +39: 0000000000400640 0 FUNC LOCAL DEFAULT 10 frame_dummy +40: 0000000000600e18 0 OBJECT LOCAL DEFAULT 15 __frame_dummy_init_array_ +41: 0000000000000000 0 FILE LOCAL DEFAULT ABS /super/secret/path/MiniDbg/ +42: 0000000000000000 0 FILE LOCAL DEFAULT ABS crtstuff.c +43: 0000000000400818 0 OBJECT LOCAL DEFAULT 14 __FRAME_END__ +44: 0000000000600e28 0 OBJECT LOCAL DEFAULT 17 __JCR_END__ +45: 0000000000000000 0 FILE LOCAL DEFAULT ABS +46: 0000000000400724 0 NOTYPE LOCAL DEFAULT 13 __GNU_EH_FRAME_HDR +47: 0000000000601000 0 OBJECT LOCAL DEFAULT 20 _GLOBAL_OFFSET_TABLE_ +48: 0000000000601028 0 OBJECT LOCAL DEFAULT 21 __TMC_END__ +49: 0000000000601020 0 OBJECT LOCAL DEFAULT 21 __dso_handle +50: 0000000000600e20 0 NOTYPE LOCAL DEFAULT 15 __init_array_end +51: 0000000000600e18 0 NOTYPE LOCAL DEFAULT 15 __init_array_start +52: 0000000000600e30 0 OBJECT LOCAL DEFAULT 18 _DYNAMIC +53: 0000000000601018 0 NOTYPE WEAK DEFAULT 21 data_start +54: 0000000000400710 2 FUNC GLOBAL DEFAULT 10 __libc_csu_fini +55: 0000000000400570 43 FUNC GLOBAL DEFAULT 10 _start +56: 0000000000000000 0 NOTYPE WEAK DEFAULT UND __gmon_start__ +57: 0000000000400714 0 FUNC GLOBAL DEFAULT 11 _fini +58: 0000000000000000 0 FUNC GLOBAL DEFAULT UND __libc_start_main@@GLIBC_ +59: 0000000000400720 4 OBJECT GLOBAL DEFAULT 12 _IO_stdin_used +60: 0000000000601018 0 NOTYPE GLOBAL DEFAULT 21 __data_start +61: 00000000004006a0 101 FUNC GLOBAL DEFAULT 10 __libc_csu_init +62: 0000000000601028 0 NOTYPE GLOBAL DEFAULT 22 __bss_start +63: 0000000000601030 0 NOTYPE GLOBAL DEFAULT 22 _end +64: 0000000000601028 0 NOTYPE GLOBAL DEFAULT 21 _edata +65: 0000000000400670 44 FUNC GLOBAL DEFAULT 10 main +66: 0000000000400558 0 FUNC GLOBAL DEFAULT 9 _init + +``` + +You can see lots of symbols for sections in the object file, symbols which are used by the implementation for setting up the environment, and at the end you can see the symbol for `main`. + +We’re interested in the type, name, and value (address) of the symbol. We’ll have a `symbol_type` enum for the type and use a `std::string` for the name and `std::uintptr_t` for the address: + +``` +enum class symbol_type { + notype, // No type (e.g., absolute symbol) + object, // Data object + func, // Function entry point + section, // Symbol is associated with a section + file, // Source file associated with the +}; // object file + +std::string to_string (symbol_type st) { + switch (st) { + case symbol_type::notype: return "notype"; + case symbol_type::object: return "object"; + case symbol_type::func: return "func"; + case symbol_type::section: return "section"; + case symbol_type::file: return "file"; + } +} + +struct symbol { + symbol_type type; + std::string name; + std::uintptr_t addr; +}; +``` + +We’ll need to map between the symbol type we get from `libelfin` and our enum since we don’t want the dependency poisoning this interface. Fortunately I picked the same names for everything, so this is dead easy: + +``` +symbol_type to_symbol_type(elf::stt sym) { + switch (sym) { + case elf::stt::notype: return symbol_type::notype; + case elf::stt::object: return symbol_type::object; + case elf::stt::func: return symbol_type::func; + case elf::stt::section: return symbol_type::section; + case elf::stt::file: return symbol_type::file; + default: return symbol_type::notype; + } +}; +``` + +Lastly we want to look up the symbol. For illustrative purposes I loop through the sections of the ELF looking for symbol tables, then collect any symbols I find in them into a `std::vector`. A smarter implementation would build up a map from names to symbols so that you only have to look at all the data once. + +``` +std::vector debugger::lookup_symbol(const std::string& name) { + std::vector syms; + + for (auto &sec : m_elf.sections()) { + if (sec.get_hdr().type != elf::sht::symtab && sec.get_hdr().type != elf::sht::dynsym) + continue; + + for (auto sym : sec.as_symtab()) { + if (sym.get_name() == name) { + auto &d = sym.get_data(); + syms.push_back(symbol{to_symbol_type(d.type()), sym.get_name(), d.value}); + } + } + } + + return syms; +} +``` + +* * * + +### Adding commands + +As always, we need to add some more commands to expose the functionality to users. For breakpoints I’ve gone for a GDB-style interface, where the kind of breakpoint is inferred from the argument you pass rather than requiring explicit switches: + +* `0x` -> address breakpoint + +* `:` -> line number breakpoint + +* `` -> function name breakpoint + +``` + else if(is_prefix(command, "break")) { + if (args[1][0] == '0' && args[1][1] == 'x') { + std::string addr {args[1], 2}; + set_breakpoint_at_address(std::stol(addr, 0, 16)); + } + else if (args[1].find(':') != std::string::npos) { + auto file_and_line = split(args[1], ':'); + set_breakpoint_at_source_line(file_and_line[0], std::stoi(file_and_line[1])); + } + else { + set_breakpoint_at_function(args[1]); + } + } +``` + +For symbols we’ll lookup the symbol and print out any matches we find: + +``` +else if(is_prefix(command, "symbol")) { + auto syms = lookup_symbol(args[1]); + for (auto&& s : syms) { + std::cout << s.name << ' ' << to_string(s.type) << " 0x" << std::hex << s.addr << std::endl; + } +} +``` + +* * * + +### Testing it out + +Fire up your debugger on a simple binary, play around with setting source-level breakpoints. Setting a breakpoint on some `foo` and seeing my debugger stop on it was one of the most rewarding moments of this project for me. + +Symbol lookup can be tested by adding some functions or global variables to your program and looking up the names of them. Note that if you’re compiling C++ code you’ll need to take [name mangling][10] into account as well. + +That’s all for this post. Next time I’ll show how to add stack unwinding support to the debugger. + +You can find the code for this post [here][11]. + +-------------------------------------------------------------------------------- + +via: https://blog.tartanllama.xyz/c++/2017/06/19/writing-a-linux-debugger-source-break/ + +作者:[Simon Brand ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://twitter.com/TartanLlama +[1]:https://blog.tartanllama.xyz/c++/2017/03/21/writing-a-linux-debugger-setup/ +[2]:https://blog.tartanllama.xyz/c++/2017/03/24/writing-a-linux-debugger-breakpoints/ +[3]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/ +[4]:https://blog.tartanllama.xyz/c++/2017/04/05/writing-a-linux-debugger-elf-dwarf/ +[5]:https://blog.tartanllama.xyz/c++/2017/04/24/writing-a-linux-debugger-source-signal/ +[6]:https://blog.tartanllama.xyz/c++/2017/05/06/writing-a-linux-debugger-dwarf-step/ +[7]:https://blog.tartanllama.xyz/c++/2017/06/19/writing-a-linux-debugger-source-break/ +[8]:https://blog.tartanllama.xyz/c++/2017/06/24/writing-a-linux-debugger-unwinding/ +[9]:https://blog.tartanllama.xyz/c++/2017/04/05/writing-a-linux-debugger-elf-dwarf/ +[10]:https://en.wikipedia.org/wiki/Name_mangling#C.2B.2B +[11]:https://github.com/TartanLlama/minidbg/tree/tut_source_break From d979881a4d44b4e103a38af61482144404bb6ece Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 16:29:20 +0800 Subject: [PATCH 0693/1407] =?UTF-8?q?20170716-3=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...a Linux Debugger Part 8 Stack unwinding.md | 195 ++++++++++++++++++ 1 file changed, 195 insertions(+) create mode 100644 sources/tech/20170624 Writing a Linux Debugger Part 8 Stack unwinding.md diff --git a/sources/tech/20170624 Writing a Linux Debugger Part 8 Stack unwinding.md b/sources/tech/20170624 Writing a Linux Debugger Part 8 Stack unwinding.md new file mode 100644 index 0000000000..5196548f3a --- /dev/null +++ b/sources/tech/20170624 Writing a Linux Debugger Part 8 Stack unwinding.md @@ -0,0 +1,195 @@ +Writing a Linux Debugger Part 8: Stack unwinding +============================================================ + +Sometimes the most important information you need to know about what your current program state is how it got there. This is typically provided with a `backtrace` command, which gives you the chain of function calls which have lead to the the program is right now. This post will show you how to implement stack unwinding on x86_64 to generate such a backtrace. + +* * * + +### Series index + +These links will go live as the rest of the posts are released. + +1. [Setup][1] + +2. [Breakpoints][2] + +3. [Registers and memory][3] + +4. [Elves and dwarves][4] + +5. [Source and signals][5] + +6. [Source-level stepping][6] + +7. [Source-level breakpoints][7] + +8. [Stack unwinding][8] + +9. Reading variables + +10. Next steps + +* * * + +Take the following program as an example: + +``` +void a() { + //stopped here +} + +void b() { + a(); +} + +void c() { + a(); +} + +int main() { + b(); + c(); +} +``` + +If the debugger is stopped at the `//stopped here` line, there are two ways which it could have got there: `main->b->a` or `main->c->a`. If we set a breakpoint there with LLDB, continue, and ask for a backtrace, then we get the following: + +``` +* frame #0: 0x00000000004004da a.out`a() + 4 at bt.cpp:3 + frame #1: 0x00000000004004e6 a.out`b() + 9 at bt.cpp:6 + frame #2: 0x00000000004004fe a.out`main + 9 at bt.cpp:14 + frame #3: 0x00007ffff7a2e830 libc.so.6`__libc_start_main + 240 at libc-start.c:291 + frame #4: 0x0000000000400409 a.out`_start + 41 + +``` + +This says that we are currently in function `a`, which we got to from function `b`, which we got to from `main` and so on. Those final two frames are just how the compiler has bootstrapped the `main` function. + +The question now is how we implement this on x86_64\. The most robust way to do this is to parse the `.eh_frame` section of the ELF file and work out how to unwind the stack from there, but this is a pain. You could use `libunwind` or something similar to do it for you, but that’s boring. Instead, we’ll assume that the compiler has laid out the stack in a certain way and we’ll just walk it manually. In order to do this, we first need to understand how the stack is laid out. + +``` + High + | ... | + +---------+ + +24| Arg 1 | + +---------+ + +16| Arg 2 | + +---------+ + + 8| Return | + +---------+ +EBP+--> |Saved EBP| + +---------+ + - 8| Var 1 | + +---------+ +ESP+--> | Var 2 | + +---------+ + | ... | + Low + +``` + +As you can see, the frame pointer for the last stack frame is stored at the start of current stack frame, creating a linked list of frame pointers. The stack is unwound by following this linked list. We can find out which function the next frame in the list belongs to by looking up the return address in the DWARF info. Some compilers will omit tracking the frame base with the `EBP`, since this can be represented as an offset from `ESP` and it frees up an extra register. Passing `-fno-omit-frame-pointer` to GCC or Clang should force it to follow the convention we’re relying on, even when optimisations are enabled. + +We’ll do all our work in a `print_backtrace` function: + +``` +void debugger::print_backtrace() { +``` + +Something to decide early is what format to print out the frame information in. I used a little lambda to push this out the way: + +``` + auto output_frame = [frame_number = 0] (auto&& func) mutable { + std::cout << "frame #" << frame_number++ << ": 0x" << dwarf::at_low_pc(func) + << ' ' << dwarf::at_name(func) << std::endl; + }; +``` + +The first frame to print out will be the one which is currently being executed. We can get the information for this frame by looking up the current program counter in the DWARF: + +``` + auto current_func = get_function_from_pc(get_pc()); + output_frame(current_func); +``` + +Next we need to get the frame pointer and return address for the current function. The frame pointer is stored in the `rbp` register, and the return address is 8 bytes up the stack from the frame pointer. + +``` + auto frame_pointer = get_register_value(m_pid, reg::rbp); + auto return_address = read_memory(frame_pointer+8); +``` + +Now we have all the information we need to unwind the stack. I’m just going to keep unwinding until the debugger hits `main`, but you could also choose to stop when the frame pointer is `0x0`, which will get you the functions which your implementation called before `main` as well. We’ll to grab the frame pointer and return address from each frame and print out the information as we go. + +``` + while (dwarf::at_name(current_func) != "main") { + current_func = get_function_from_pc(return_address); + output_frame(current_func); + frame_pointer = read_memory(frame_pointer); + return_address = read_memory(frame_pointer+8); + } +} +``` + +That’s it! The whole function is here for your convenience: + +``` +void debugger::print_backtrace() { + auto output_frame = [frame_number = 0] (auto&& func) mutable { + std::cout << "frame #" << frame_number++ << ": 0x" << dwarf::at_low_pc(func) + << ' ' << dwarf::at_name(func) << std::endl; + }; + + auto current_func = get_function_from_pc(get_pc()); + output_frame(current_func); + + auto frame_pointer = get_register_value(m_pid, reg::rbp); + auto return_address = read_memory(frame_pointer+8); + + while (dwarf::at_name(current_func) != "main") { + current_func = get_function_from_pc(return_address); + output_frame(current_func); + frame_pointer = read_memory(frame_pointer); + return_address = read_memory(frame_pointer+8); + } +} +``` + +### Adding commands + +Of course, we have to expose this command to the user. + +``` + else if(is_prefix(command, "backtrace")) { + print_backtrace(); + } +``` + +### Testing it out + +A good way to test this functionality is by writing a test program with a bunch of small functions which call each other. Set a few breakpoints, jump around the code a bit, and make sure that your backtrace is accurate. + +* * * + +We’ve come a long way from a program which can merely spawn and attach to other programs. The penultimate post in this series will finish up the implementation of the debugger by supporting the reading and writing of variables. Until then you can find the code for this post [here][9]. + +-------------------------------------------------------------------------------- + +via: https://blog.tartanllama.xyz/c++/2017/06/24/writing-a-linux-debugger-unwinding/ + +作者:[Simon Brand][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://twitter.com/TartanLlama +[1]:https://blog.tartanllama.xyz/c++/2017/03/21/writing-a-linux-debugger-setup/ +[2]:https://blog.tartanllama.xyz/c++/2017/03/24/writing-a-linux-debugger-breakpoints/ +[3]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/ +[4]:https://blog.tartanllama.xyz/c++/2017/04/05/writing-a-linux-debugger-elf-dwarf/ +[5]:https://blog.tartanllama.xyz/c++/2017/04/24/writing-a-linux-debugger-source-signal/ +[6]:https://blog.tartanllama.xyz/c++/2017/05/06/writing-a-linux-debugger-dwarf-step/ +[7]:https://blog.tartanllama.xyz/c++/2017/06/19/writing-a-linux-debugger-source-break/ +[8]:https://blog.tartanllama.xyz/c++/2017/06/24/writing-a-linux-debugger-unwinding/ +[9]:https://github.com/TartanLlama/minidbg/tree/tut_unwind From aa1277d63f873ef4835a909ae744685e6a0e0fa5 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 16:31:23 +0800 Subject: [PATCH 0694/1407] =?UTF-8?q?20170716-4=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...y submits links to the Internet Archive.md | 57 +++++++++++++++++++ 1 file changed, 57 insertions(+) create mode 100644 sources/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md diff --git a/sources/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md b/sources/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md new file mode 100644 index 0000000000..d90c70efc3 --- /dev/null +++ b/sources/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md @@ -0,0 +1,57 @@ +LinkArchiver automatically submits links to the Internet Archive +============================================================ + +### Links shared on Twitter can be preserved in perpetuity with no effort on the user's part. + + +![LinkArchiver automatically submits links to the Internet Archive](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/internet_archive_building_sanfran.jpg?itok=pm9eVwbC "LinkArchiver automatically submits links to the Internet Archive") +Image credits :  + +Internet Archive HQ by Beatrice Murch; CC BY ([on Flickr][3]) + +The internet is forever, except when it isn't. "Link rot"—where once-valid links to websites become broken over time as pages move or sites go offline—is a real problem for people who try to do research online. The [Internet Archive ][4]helps solve this problem by making submitted content available in the "Wayback Machine." + +The difficulty, of course, is getting people to remember to submit links for archival. + +This is where Parker Higgins's new Twitter bot comes in. The [@LinkArchiver][5] account automatically submits links from accounts it follows to the Internet Archive. If a Twitter user follows [@LinkArchiver][6], it will follow back and continue to add links even if the user unfollows the bot. This means links shared on Twitter can be preserved in perpetuity with no effort on the user's part. + +The low-effort aspect is very appealing to Higgins. "I'm most excited by how passive the whole set-up is," he told Opensource.com. "If you rely on people to pick and choose what is  _important_  to archive, you miss a lot of the most important stuff. By just grabbing a copy of every link as it's posted, this bot should help ensure we don't end up missing that context." + +After initially developing the bot, Higgins contacted the Internet Archive. His concerns that the automation would cause problems were quickly dispelled. "It's effectively a rounding error in terms of the traffic they handle," he says, though he did give API requests a custom user-agent string at their request. The scalability concerns are on the Twitter side: The service limits an account's number of followers and the rate of new followers. This constrains the abilities on a single instance of LinkArchiver. + +Fortunately, LinkArchiver is available on [GitHub][7] under the AGPLv3 license. + +With a small server and a Twitter account, anyone can run this bot. Higgins envisions people running LinkArchiver instances that focus on a particular interest or social circle. "One thing that occurs to me is that you could turn off the follow-back behavior and curate the following list to a specific group or interest. For example, one bot could follow a group of friends or classmates, or major media outlets, or every U.S. Senator and Representative and archive the links they tweet." + +This is not Higgins's first foray into Twitter bots: [@securethenews][8], [@pomological][9], and the ever-popular [@choochoobot][10] are among his previous work. These bots are all write-only. LinkArchiver is the first interactive bot he has developed, which required learning several new skills. This effort was done as part of Higgins' participation in [Recurse Center][11], a 12-week retreat of sorts for programmers. + +Higgins encourages pull requests and additional instances of LinkArchiver bots. + +-------------------------------------------------------------------------------- + +作者简介: + +Ben Cotton - Ben Cotton is a meteorologist by training and a high-performance computing engineer by trade. Ben works as a technical evangelist at Cycle Computing. He is a Fedora user and contributor, co-founded a local open source meetup group, and is a member of the Open Source Initiative and a supporter of Software Freedom Conservancy. + +via: https://opensource.com/article/17/7/linkarchiver-automatically-submits-links-internet-archive + +作者:[Ben Cotton ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/bcotton +[1]:https://opensource.com/article/17/7/linkarchiver-automatically-submits-links-internet-archive?rate=Z9DDX962B5JWk6LID_iia3S7H9s7ZMF8cGTVlNLvCs8 +[2]:https://opensource.com/user/30131/feed +[3]:https://www.flickr.com/photos/blmurch/5079018246/ +[4]:https://archive.org/ +[5]:https://twitter.com/linkarchiver +[6]:https://twitter.com/linkarchiver +[7]:https://github.com/thisisparker/linkarchiver +[8]:https://twitter.com/securethenews +[9]:https://twitter.com/pomological +[10]:https://twitter.com/choochoobot +[11]:https://www.recurse.com/ +[12]:https://opensource.com/users/bcotton +[13]:https://opensource.com/users/bcotton From 913e0c89aae6854d04b1b4099ffdc3f64cdd2249 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 16:33:15 +0800 Subject: [PATCH 0695/1407] =?UTF-8?q?20170716-5=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...w I introduced my organization to Linux.md | 123 ++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 sources/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md diff --git a/sources/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md b/sources/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md new file mode 100644 index 0000000000..f50aa8c411 --- /dev/null +++ b/sources/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md @@ -0,0 +1,123 @@ +Linux to the rescue: How I introduced my organization to Linux +============================================================ + +### After a very public early failure, a large university's IT team finds switching its web registration system to Linux nearly triples user capacity. + + +![Linux to the rescue: How I introduced my organization to Linux](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/OSDC_Penguin_Image_520x292_12324207_0714_mm_v1a.png?itok=WfAkwbFy "Linux to the rescue: How I introduced my organization to Linux") +Image by :  + +Opensource.com + +In 1998, I managed the server administration group for the new web team at the University of Minnesota. The U of M is a very large institution, with over 60,000 students across all system campuses. Until then, the university managed its student records on an aging mainframe system. But that was all about to change. + +The mainframe was not Y2K compliant, so we were working to set up a new student records system delivered by PeopleSoft. The new system was a big deal to the university in many ways, not only for modernizing our records system but also for offering new features. Yet it lacked one key feature: You couldn't register for classes from your web browser. + +That may seem like a major oversight by today's standards, but in the late 1990s, the World Wide Web was still pretty new. Amazon was only a few years old. eBay had just reached its first birthday. Google had recently gone live. Wikipedia didn't exist yet. In context, it's not that surprising that in 1998 PeopleSoft didn't support registering for courses via the web. But as a pioneering university that originated the Gopher network and created a functional web interface to the previous mainframe system, we believed web registration was a critical feature for the new student records system. + +More Linux resources + +* [What is Linux?][1] + +* [What are Linux containers?][2] + +* [Download Now: Linux commands cheat sheet][3] + +* [Advanced Linux commands cheat sheet][4] + +* [Our latest Linux articles][5] + +Our job on the web team was to build that missing web registration frontend to PeopleSoft. + +Fortunately, we didn't have to do it alone. We contracted with IBM, and over the next year, we worked together to build the new web registration system. IBM donated hardware and software to run the new web system: Three SP computer nodes running the latest versions of AIX, IBM Java, and IBM WebSphere, with a separate IBM load balancer dividing traffic between the three nodes. + +![AIX network diagram](https://opensource.com/sites/default/files/resize/diagram-aix_0-700x363.png "AIX network diagram") + +After more than a year of development and testing, we finally went live! Unfortunately, it was an immediate failure. + +### Too much load + +Throughout development, we were unable to realistically simulate the load of many students accessing the new system at once. But it was not from lack of trying. The university had a custom web load test software package, and IBM supplemented it with its own tool. But the web was still pretty new, and we didn't realize the web load testing tools just weren't up to the job yet. + +After months of load testing with both tools, we had tuned the new web registration system for an expected load of 240 concurrent users. + +Unfortunately, our actual usage was almost twice that. On day one, as soon as the system came online, over 400 students simultaneously signed into the new web registration system. Overwhelmed by the unexpected load, the three web servers crashed. We found ourselves constantly restarting the web servers as the high web traffic continued to crush them. As soon as we restarted one web server, the next would go down. And so on, for the entire month-long registration period. + +Without a reliable way to register for classes on the web, students had to sign up for classes the old-fashioned way: by going to the registrar's office. Lines to register went down the hallway and out the door. It wasn't long before the bad news hit the local news, with headlines such as "Computer failure forces students to register in person." + +![Negative headlines about web registration crashes](https://opensource.com/sites/default/files/resize/headlines-700x522.jpg "Negative headlines about web registration crashes") + +Having faced a very public defeat, we did our best to improve things for the next registration cycle, only six months away. We worked frantically to increase the capacity of the web system. Despite many code fixes and configuration tweaks, we were unable to boost the system to sufficiently support more users. Try as we might, we faced certain failure at the next registration cycle. + +And as feared, the web system again failed dramatically at our next registration. The servers crashed again and again under the immense load. This time, the news headlines included such gems as: "Web registration system is worthless." + +With another six months before our next go-live, we felt trapped. No one could figure out why the system was constantly crashing under load. We knew it would fail again at the next registration period. We had to do something, anything, to improve the system. But what to do? Every option was on the table. + +### What if we changed platforms? + +IBM had recently embraced Linux, releasing Linux versions of its Java and WebSphere products. All products were certified for RHEL (Red Hat Enterprise Linux), which several of us were already running on our desktop systems. We realized we now had the ecosystem to run the web registration system on Linux, as a supported platform. But would it perform any better on Linux than AIX? + +After setting up a test server and running initial load tests, we were stunned to see one Linux server easily supporting what three AIX servers could not. A single Linux server running the same web registration code with the same IBM Java and IBM WebSphere sustained over 200 users. + +We shared our findings with the registrar and the CIO, who approved our plan to migrate the web registration system to Linux. It was our first time running Linux in the University of Minnesota enterprise, but we had nothing to lose. The AIX system would fail again, anyway. Linux was a long shot, but it was our only hope. + +We immediately ramped up new Linux servers for production. Colleagues in another team diverted several Intel servers to our effort, where we installed RHEL and the IBM components. We performed countless series of load tests on the new system, looking for weak points, only to find the Linux servers running smoothly. + +After a restless two months, we finally went live. And it was a resounding success! The web registration system performed flawlessly on Linux, despite heavy usage. At our peak during that registration period, the Linux servers managed over 600 concurrent users, with barely a blip. Linux had rescued web registration at the University of Minnesota. + +### Lessons for success + +As I look back on that massive rescue operation, I find several themes you can use to introduce Linux in your own organization: + +1. **Solve a problem, don't stroke an ego.** + +When we proposed running Linux in the enterprise, we weren't doing it because we thought Linux was cool. Sure, we were Linux fans and we already ran Linux on the desktop and at home, but we were there to solve a problem. Our registrar and other stakeholders appreciated that Linux was a solution to a problem, not just something we wanted to do because Linux was cool. + +1. **Change as little as possible.** + +Our success hinged on the fact that IBM had finally released versions of its Java and WebSphere products for Linux. This allowed us to minimize changes to the system as we migrated from AIX to Linux. Comparing the AIX configuration to the Linux configuration, only the hardware and operating system changed. Every other component on the system remained the same. It was this "known" quantity that instilled confidence in making the change. + +![AIX cost diagram](https://opensource.com/sites/default/files/resize/cost-diagram-aix-700x363.png "AIX cost diagram") + +![Linux cost diagram](https://opensource.com/sites/default/files/resize/cost-diagram-linux-700x363.png "Linux cost diagram") + +1. **Be honest about the risks and benefits.** + +Our problem was obvious: Web registration had failed in our previous two registration cycles and would likely fail again. When we presented our idea to our stakeholders, proposing that we replace the AIX web servers with Linux, we were open about the expected risks and benefits. The bottom line was if we changed nothing, we would fail. If we tried Linux, we might fail or we might not. We shared our findings from our initial load tests, which demonstrated that Linux was more likely to succeed than fail. + +But even if Linux failed, we could easily put the old AIX servers back into production. That "fallback" preparation reassured the registrar that we had appropriately measured the benefits and the risks and were prepared in case things went wrong. + +1. **Communicate broadly.** + +In making our pitch to migrate to Linux, we cast a wide net. We wrote an executive white paper that clearly communicated what we planned to do and why we thought it would work. The key to this white paper's success was its brevity. Executives do not want to read a "novel" about a technical idea, nor do they want to get mired in the technical details. We intentionally wrote the white paper for the executive level, describing our proposal in broad strokes. + +As we replaced the system with Linux, we provided regular updates to inform our stakeholders about our progress to build the new Linux system. After we finally went live on the Linux web registration system, we posted daily updates, reporting how many students had registered for classes on the new system, and if we saw any problems. + +Even though it's been nearly two decades since our early failure with AIX and very successful experiment with Linux, all of these lessons still apply. Sure, Linux did the heavy lifting here, but our overall success was due to bringing people together in the spirit of solving a common problem. And that's a lesson that I think you can apply to pretty much any situation you face. + +-------------------------------------------------------------------------------- + +作者简介: + +Jim Hall - I am the founder and coordinator of the FreeDOS Project. I also serve as a director on the GNOME Foundation Board of Directors. At work, I am the Chief Information Officer for Ramsey County, Minnesota. In my spare time, I contribute to usability in open source software, and mentor usability testing in GNOME via Outreachy (formerly the GNOME Outreach Program for Women). + + +via: https://opensource.com/article/17/7/how-introduced-organization-linux + +作者:[ Jim Hall ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/jim-hall +[1]:https://opensource.com/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[6]:https://opensource.com/article/17/7/how-introduced-organization-linux?rate=G1WfZzJPTN4w4fVviJ7iFru6ZBDBBTKkT8QRxSh727g +[7]:https://opensource.com/user/126046/feed +[8]:https://opensource.com/users/jim-hall +[9]:https://opensource.com/users/jim-hall +[10]:https://opensource.com/article/17/7/how-introduced-organization-linux#comments From 622ce77452d199e0af635e1df3896984cb8ad98b Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 16:35:32 +0800 Subject: [PATCH 0696/1407] =?UTF-8?q?20170716-6=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... a man page Faster than a Google search.md | 157 ++++++++++++++++++ 1 file changed, 157 insertions(+) create mode 100644 sources/tech/20170712 How to use a man page Faster than a Google search.md diff --git a/sources/tech/20170712 How to use a man page Faster than a Google search.md b/sources/tech/20170712 How to use a man page Faster than a Google search.md new file mode 100644 index 0000000000..184734e0c6 --- /dev/null +++ b/sources/tech/20170712 How to use a man page Faster than a Google search.md @@ -0,0 +1,157 @@ +How to use a man page: Faster than a Google search +============================================================ + +### Linux manual pages are easier to use than you think and hold a wealth of information. + + +![How to use a man page: Faster than a Google search](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/yearbook-haff-rx-linux-file-lead_0.png?itok=48iDNoH8 "How to use a man page: Faster than a Google search") +Image by :  + +[Internet Archive Book Images][8]. Modified by Opensource.com. CC BY-SA 4.0 + +It's easy to get into the habit of googling anything you want to know about a command or operation in Linux, but I'd argue there's something even better: a living and breathing, complete reference, the **man pages**, which is short for manual pages. + +The history of man pages predates Linux, all the way back to the early days of Unix. [According to Wikipedia][9], Dennis Ritchie and Ken Thompson wrote the first man pages in 1971, well before the days of personal computers, around the time when many calculators in use were the size of toaster ovens. Man pages also have a reputation of being terse and, in a way, have a language of their own. Just like Unix and Linux, the man pages have not been static, and they continue to be developed and maintained just like the kernel. + +Man pages are divided into sections referenced by numbers: + +1. General user commands + +2. System calls + +3. Library functions + +4. Special files and drivers + +5. File formats + +6. Games and screensavers + +7. Miscellanea + +8. System administration commands and daemons + +Even so, users generally don't need to know the section where a particular command lies to find what they need. + +The files are formatted in a way that may look odd to many users today. Originally, they were written in in an old form of markup called **troff** because they were designed to be printed through a PostScript printer, so they included formatting for headers and other layout aspects. In Linux, [**groff** ][10]is used instead. + +In my Fedora, the man pages are located in **/usr/share/man** with subdirectories (like **man1** for Section 1 commands) as well as additional subdirectories for translations of the man pages. + +If you look up the man page for the command **man**, you'll see the file **man.1.gz**, which is the man pages compressed with the **gzip** utility. To access a man page, type a command such as: + +``` +man man +``` + +for example, to show the man page for **man**. This uncompresses the man page, interprets the formatting commands, and displays the results with [**less**][11], so navigation is the same as when you use **less**. + +All man pages should have the following subsections: **Name**, **Synopsis**, **Description**, **Examples**, and **See** **Also**. Many have additional sections, like **Options**, **Exit** **Status**, **Environment**, **Bugs**, **Files**, **Author**, **Reporting** **Bugs**, **History**, and **Copyright**. + +### Breaking down a man page + +To explain how to interpret a typical man page, let's use the [man page for **ls**][12] as an example. Under **Name**, we see + +``` +ls - list directory contents +``` + +which tells us what **ls** means in the simplest terms. + +Under **Synopsis**, we begin to see the terseness: + +``` +ls [OPTION]... [FILE]… +``` + +Any element that occurs inside brackets is optional. The above command means you can legitimately type **ls** and nothing else. The ellipsis after each element indicates that you can include as many options as you want (as long as they're compatible with each other) and as many files as you want. You can specify a directory name, and you can also use ***** as a wildcard. For example: + +``` +ls Documents/*.txt +``` + +Under **Description**, we see a more verbose description of what the command does, followed by a list of the available options for the command. The first option for **ls** is + +``` +-a, --all +        do not ignore entries starting with . +``` + +If we want to use this option, we can either type the short form syntax, **-a**, or the long form **--all**. Not all options have two forms (e.g., **--author**), and even when they do, they aren't always so obviously related (e.g., -**F, --classify**). When you want to use multiple options, you can either type the short forms with spaces in between or type them with a single hyphen and no spaces (as long as they do not require further sub-options). Therefore, + +``` +ls -a -d -l +``` + +and + +``` +ls -adl +``` + +are equivalent. + +The command **tar** is somewhat unique, presumably due to its long history, in that it doesn't require a hyphen at all for the short form. Therefore, + +``` +tar -cvf filearchive.tar thisdirectory/ +``` + +and + +``` +tar cvf filearchive.tar thisdirectory/ +``` + +are both legitimate. + +On the **ls** man page, after **Description** are **Author**, **Reporting Bugs**, **Copyright**, and **See Also**. + +The **See Also** section will often suggest related man pages, so it is generally worth a glance. After all, there is much more to man pages than just commands. + +More Linux resources + +* [What is Linux?][1] + +* [What are Linux containers?][2] + +* [Download Now: Linux commands cheat sheet][3] + +* [Advanced Linux commands cheat sheet][4] + +* [Our latest Linux articles][5] + +Certain commands that are specific to Bash and not system commands, like **alias**, **cd**, and a number of others, are listed together in a single **BASH_BUILTINS** man page. While the documentation for these is even more terse and compact, overall it contains similar information. + +I find that man pages offer a lot of good, usable information, especially when I need a command I haven't used recently, and I need to brush up on the options and requirements. This is one place where the man pages' much-maligned terseness is actually very beneficial. + +-------------------------------------------------------------------------------- + +作者简介: + +Greg Pittman - Greg is a retired neurologist in Louisville, Kentucky, with a long-standing interest in computers and programming, beginning with Fortran IV in the 1960s. When Linux and open source software came along, it kindled a commitment to learning more, and eventually contributing. He is a member of the Scribus Team. + + +via: https://opensource.com/article/17/7/using-man-pages + +作者:[ Greg Pittman ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/greg-p +[1]:https://opensource.com/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[6]:https://opensource.com/article/17/7/using-man-pages?rate=W0QImEyJK1b4qSGof6I3agtPeTpPQXkaSekp_bI_Rno +[7]:https://opensource.com/user/30666/feed +[8]:https://www.flickr.com/photos/internetarchivebookimages/14803082483/in/photolist-oy6EG4-pZR3NZ-i6r3NW-e1tJSX-boBtf7-oeYc7U-o6jFKK-9jNtc3-idt2G9-i7NG1m-ouKjXe-owqviF-92xFBg-ow9e4s-gVVXJN-i1K8Pw-4jybMo-i1rsBr-ouo58Y-ouPRzz-8cGJHK-85Evdk-cru4Ly-rcDWiP-gnaC5B-pAFsuf-hRFPcZ-odvBMz-hRCE7b-mZN3Kt-odHU5a-73dpPp-hUaaAi-owvUMK-otbp7Q-ouySkB-hYAgmJ-owo4UZ-giHgqu-giHpNc-idd9uQ-osAhcf-7vxk63-7vwN65-fQejmk-pTcLgA-otZcmj-fj1aSX-hRzHQk-oyeZfR +[9]:https://en.wikipedia.org/wiki/Man_page +[10]:https://en.wikipedia.org/wiki/Groff_(software) +[11]:https://en.wikipedia.org/wiki/Less_(Unix) +[12]:http://linuxcommand.org/man_pages/ls1.html +[13]:https://opensource.com/users/greg-p +[14]:https://opensource.com/users/greg-p +[15]:https://opensource.com/article/17/7/using-man-pages#comments From 6e6009de8204f0a8fb131b54fcdc1c1e360e9d57 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 16:36:40 +0800 Subject: [PATCH 0697/1407] =?UTF-8?q?20170716-7=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...damentals of graph databases with Neo4j.md | 85 +++++++++++++++++++ 1 file changed, 85 insertions(+) create mode 100644 sources/tech/20170713 Fundamentals of graph databases with Neo4j.md diff --git a/sources/tech/20170713 Fundamentals of graph databases with Neo4j.md b/sources/tech/20170713 Fundamentals of graph databases with Neo4j.md new file mode 100644 index 0000000000..d804e34b67 --- /dev/null +++ b/sources/tech/20170713 Fundamentals of graph databases with Neo4j.md @@ -0,0 +1,85 @@ +Fundamentals of graph databases with Neo4j +============================================================ + +### In the first of a three-part series, learn the basics of graph databases, which power some of the largest data pools on the planet. + + +![Fundamentals of graph databases with Neo4j](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/grasshopper_graph_lead.jpg?itok=X5QPAGYh "Fundamentals of graph databases with Neo4j") +Image credits :  + +Modified by Jen Wike Huger, CC BY-SA + +For very large collections of diverse, unstructured information, graph databases have emerged as a technology to help collect, manage, and search large sets of data. In this three-part series, we'll explore graph databases, using [Neo4j][9], an open source graph database. + +In this article, I'll show you the basics of graph databases, bringing you up to speed on the conceptual model. In the second, I'll show you how to spin up a Neo4j database and populate it with some data using the built-in browser tools. And, in the third and final article in the series, we'll explore a couple of programming libraries for using Neo4j in your development work. + +Grasping the conceptual model for graph databases is useful, so we'll start there. A graph database has only two kinds of data stored in it:  _nodes_  and  _edges_ . + +* **Nodes are entities:** things such as people, invoices, movies, books, or other concrete things. These are somewhat equivalent to a record or row in a relational database. + +* **Edges name relationships:** the concepts, events, or things that connect nodes. In relational databases, these relationships are ordinarily stored in the database rows with a linking field. In graph databases, they are themselves useful, searchable objects in their own right. + +Both nodes and edges can possess searchable  _properties_ . For instance, if your nodes represented people, they might own properties like name, gender, date of birth, height, and so forth. Edge properties might describe when a relationship between two people was established, the circumstances of meeting, or the nature of the relationship. + +Here's a diagram to help you visualize this: + +### [article_1_image_1.jpg][5] + +![Graph database image 1](https://opensource.com/sites/default/files/u128651/article_1_image_1.jpg "Graph database image 1") + +In this diagram, you learn that Jane Doe has a new husband, John; a daughter (from her prior relationship) Mary Smith; and friends Robert and Rhonda Roe. The Roes have a son, Ryan, who is dating Mary Smith. + +See how it works? Each node represents a person, standing alone, in isolation from other nodes. Everything you need to find about  _that_  person can be stored in the node's properties. Edges describe the relationships between the people, with as much detail as you need for the application. + +Relationships are one-way and cannot be undirected, but that's no problem. Since the database can traverse both directions with the same speed, and direction can be ignored, you only need to define this relationship once. If your application requires directional relationships, you're free to use them, but if bidirectionality is implied, it's not required. + +Programming and development + +* [New Python content][1] + +* [Our latest JavaScript articles][2] + +* [Recent Perl posts][3] + +* [Red Hat Developers Blog][4] + +Another thing to notice is that graph databases are, by nature, schema-less. This differs from a relational database, where each row has a set list of fields, and adding new fields is a major investment in development and upgrades. + +Each node can possess a  _label_ ; this label is all the "typing" you need for most applications and is the analog of the table name in a typical relational database. A label lets you differentiate between different node types. If you need to add a new label or property, change your application to start using it! + +With graph databases, you can simply start using the new properties and labels, and nodes will acquire them as they are created or edited. There's no need to convert things; just start using them in your code. In the example here, you can see that we know Jane's and Mary's favorite colors and Mary's date of birth, but not anyone else's. The system doesn't need to know about that; users can add that information at will as nodes are accessed in the normal course of the application's usage. + +As a developer, this is a useful thing. Instead of having to handle the database schema changes, you can just add the new label or property to forms that deal with the nodes and start using it. For nodes that don't have the property, nothing is displayed. You'd have to code the form with either type of database, but you drop a lot of the backend work that you'd need to do with a relational database. + +Let's add some new information: + +### [article_1_image_2.jpg][6] + +![Graph database image 2, defining a new type of node](https://opensource.com/sites/default/files/u128651/article_1_image_2.jpg "Graph database image 2, defining a new type of node") + +Here is a new type of node, representing a location, and some relevant relationships. Now we see that John Doe was born in Petaluma, Calif., while his wife, Jane, was born in Grand Prairie, Texas. They both now live in Cypress, Texas, because Jane works in nearby Houston. The lack of city relationships with Ryan Roe isn't any big deal to the database, we just  _don't know_  that information yet. The database could easily acquire new data and add it, creating new nodes and relationships as needed, as application users entered more data. + +Understanding nodes and edges should be enough to get you started with graph databases. If you're like me, you're already thinking about how an application you work on might be restructured in a graph. In the next article in this series, I'll show you how to install Neo4j, insert data, and do some basic searching. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/17/7/fundamentals-graph-databases-neo4j + +作者:[Ruth Holloway ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/druthb +[1]:https://opensource.com/tags/python?src=programming_resource_menu1 +[2]:https://opensource.com/tags/javascript?src=programming_resource_menu2 +[3]:https://opensource.com/tags/perl?src=programming_resource_menu3 +[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu4 +[5]:https://opensource.com/file/363056 +[6]:https://opensource.com/file/363061 +[7]:https://opensource.com/article/17/7/fundamentals-graph-databases-neo4j?rate=QlLa3Y_1alHoy77MX2w69IZN5nYBJZrkZ0b2F_0wH_A +[8]:https://opensource.com/user/36051/feed +[9]:https://neo4j.com/ +[10]:https://opensource.com/users/druthb +[11]:https://opensource.com/users/druthb From f10c20b99270e249ee8018f1ec70785501b6ad83 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 16:38:32 +0800 Subject: [PATCH 0698/1407] =?UTF-8?q?20170716-8=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70710 How Linux containers have evolved.md | 350 ++++++++++++++++++ 1 file changed, 350 insertions(+) create mode 100644 sources/tech/20170710 How Linux containers have evolved.md diff --git a/sources/tech/20170710 How Linux containers have evolved.md b/sources/tech/20170710 How Linux containers have evolved.md new file mode 100644 index 0000000000..159c7ed47d --- /dev/null +++ b/sources/tech/20170710 How Linux containers have evolved.md @@ -0,0 +1,350 @@ +How Linux containers have evolved +============================================================ + +### Containers have come a long way in the past few years. We walk through the timeline. + + +![How Linux containers have evolved](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/containers_2015-3-osdc-lead.png?itok=yOKCc8ze "How Linux containers have evolved") +Image credits :  + +[Daniel Ramirez][11]. [CC BY-SA 4.0][12] + +In the past few years, containers have become a hot topic among not just developers, but also enterprises. This growing interest has caused an increased need for security improvements and hardening, and preparing for scaleability and interoperability. This has necessitated a lot of engineering, and here's the story of how much of that engineering has happened at an enterprise level at Red Hat. + +When I first met up with representatives from Docker Inc. (Docker.io) in the fall of 2013, we were looking at how to make Red Hat Enterprise Linux (RHEL) use Docker containers. (Part of the Docker project has since been rebranded as  _Moby_ .) We had several problems getting this technology into RHEL. The first big hurdle was getting a supported Copy On Write (COW) file system to handle container image layering. Red Hat ended up contributing a few COW implementations, including [Device Mapper][13], [btrfs][14], and the first version of [OverlayFS][15]. For RHEL, we defaulted to Device Mapper, although we are getting a lot closer on OverlayFS support. + +Linux Containers + +* [What are Linux containers?][1] + +* [What is Docker?][2] + +* [What is Kubernetes?][3] + +* [An introduction to container terminology][4] + +The next major hurdle was on the tooling to launch the container. At that time, upstream docker was using [LXC][16]tools for launching containers, and we did not want to support LXC tools set in RHEL. Prior to working with upstream docker, I had been working with the [libvirt][17] team on a tool called [virt-sandbox][18], which used **libvirt-lxc** for launching containers. + +At the time, some people at Red Hat thought swapping out the LXC tools and adding a bridge so the Docker daemon would communicate with libvirt using **libvirt-lxc** to launch containers was a good idea. There were serious concerns with this approach. Consider the following example of starting a container with the Docker client (**docker-cli**) and the layers of calls before the container process (**pid1OfContainer**) is started: + +**docker-cli → docker-daemon → libvirt-lxc → pid1OfContainer** + +I did not like the idea of having two daemons between your tool to launch containers and the final running container. + +My team worked hard with the upstream docker developers on a native [Go programming language][19] implementation of the container runtime, called [libcontainer][20]. This library eventually got released as the initial implementation of the [OCI Runtime Specification][21]along with runc. + +**docker- ****cli**** → docker-daemon @ pid1OfContainer** + +Although most people mistakenly think that when they execute a container, the container process is a child of the **docker-cli**, they actually have executed a client/server operation and the container process is running as a child of a totally separate environment. This client/server operation can lead to instability and potential security concerns, and it blocks useful features. For example, [systemd][22] has a feature called socket activation, where you can set up a daemon to run only when a process connects to a socket. This means your system uses less memory and only has services executing when they are needed. The way socket activation works is systemd listens at a TCP socket, and when a packet arrives for the socket, systemd activates the service that normally listens on the socket. Once the service is activated, systemd hands the socket to the newly started daemon. Moving this daemon into a Docker-based container causes issues. The unit file would start the container using the Docker CLI and there was no easy way for systemd to pass the connected socket to the Docker daemon through the Docker CLI. + +Problems like this made us realize that we needed alternate ways to run containers. + +### The container orchestration problem + +The upstream docker project made using containers easy, and it continues to be a great tool for learning about Linux containers. You can quickly experience launching a container by running a simple command like **docker run -ti fedora sh** and instantly you are in a container. + +The real power of containers comes about when you start to run many containers simultaneously and hook them together into a more powerful application. The problem with setting up a multi-container application is the complexity quickly grows and wiring it up using simple Docker commands falls apart. How do you manage the placement or orchestration of container applications across a cluster of nodes with limited resources? How does one manage their lifecycle, and so on? + +At the first DockerCon, at least seven different companies/open source projects showed how you could orchestrate containers. Red Hat's [OpenShift][23] had a project called [geard][24], loosely based on OpenShift v2 containers (called "gears"), which we were demonstrating. Red Hat decided that we needed to re-look at orchestration and maybe partner with others in the open source community. + +Google was demonstrating [Kubernetes][25] container orchestration based on all of the knowledge Google had developed in orchestrating their own internal architecture. OpenShift decided to drop our Gear project and start working with Google on Kubernetes. Kubernetes is now one of the largest community projects on GitHub. + +#### Kubernetes + +Kubernetes was developed to use Google's [lmctfy][26] container runtime. Lmctfy was ported to work with Docker during the summer of 2014\. Kubernetes runs a daemon on each node in the Kubernetes cluster called a [kubelet][27]. This means the original Kubernetes with Docker 1.8 workflow looked something like: + +**kubelet → dockerdaemon @ PID1** + +Back to the two-daemon system. + +But it gets worse. With every release of Docker, Kubernetes broke.Docker 1.10 Switched the backing store causing a rebuilding of all images.Docker 1.11 started using **runc** to launch containers: + +**kubelet → dockerdaemon @ runc @PID1** + +Docker 1.12 added a container daemon to launch containers. Its main purpose was to satisfy Docker Swarm (a Kubernetes competitor): + +**kubelet → dockerdaemon → containerd @runc @ pid1** + +As was stated previously,  _every_  Docker release has broken Kubernetes functionality, which is why Kubernetes and OpenShift require us to ship older versions of Docker for their workloads. + +Now we have a three-daemon system, where if anything goes wrong on any of the daemons, the entire house of cards falls apart. + +### Toward container standardization + +### CoreOS, rkt, and the alternate runtime + +Due to the issues with the Docker runtime, several organizations were looking at alternative runtimes. One such organization was CoreOS. CoreOS had offered an alternative container runtime to upstream docker, called  _rkt_  (rocket). They also introduced a standard container specification called  _appc_  (App Container). Basically, they wanted to get everyone to use a standard specification for how you store applications in a container image bundle. + +This threw up red flags. When I first started working on containers with upstream docker, my biggest fear is that we would end up with multiple specifications. I did not want an RPM vs. Debian-like war to affect the next 20 years of shipping Linux software. One good outcome from the appc introduction was that it convinced upstream docker to work with the open source community to create a standards body called the [Open Container Initiative][28] (OCI). + +The OCI has been working on two specifications: + +**[OCI Runtime Specification][6]**: The OCI Runtime Specification "aims to specify the configuration, execution environment, and lifecycle of a container." It defines what a container looks like on disk, the JSON file that describes the application(s) that will run within the container, and how to spawn and execute the container. Upstream docker contributed the libcontainer work and built runc as a default implementation of the OCI Runtime Specification. + +**[OCI Image Format Specification][7]**: The Image Format Specification is based mainly on the upstream docker image format and defines the actual container image bundle that sits at container registries. This specification allows application developers to standardize on a single format for their applications. Some of the ideas described in appc, although it still exists, have been added to the OCI Image Format Specification. Both of these OCI specifications are nearing 1.0 release. Upstream docker has agreed to support the OCI Image Specification once it is finalized. Rkt now supports running OCI images as well as traditional upstream docker images. + +The Open Container Initiative, by providing a place for the industry to standardize around the container image and the runtime, has helped free up innovation in the areas of tooling and orchestration. + +### Abstracting the runtime interface + +One of the innovations taking advantage of this standardization is in the area of Kubernetes orchestration. As a big supporter of the Kubernetes effort, CoreOS submitted a bunch of patches to Kubernetes to add support for communicating and running containers via rkt in addition to the upstream docker engine. Google and upstream Kubernetes saw that adding these patches and possibly adding new container runtime interfaces in the future was going to complicate the Kubernetes code too much. The upstream Kubernetes team decided to implement an API protocol specification called the Container Runtime Interface (CRI). Then they would rework Kubernetes to call into CRI rather than to the Docker engine, so anyone who wants to build a container runtime interface could just implement the server side of the CRI and they could support Kubernetes. Upstream Kubernetes created a large test suite for CRI developers to test against to prove they could service Kubernetes. There is an ongoing effort to remove all of Docker-engine calls from Kubernetes and put them behind a shim called the docker-shim. + +### Innovations in container tooling + +### Container registry innovations with skopeo + +A few years ago, we were working with the Project Atomic team on the [atomic CLI][29] . We wanted the ability to examine a container image when it sat on a container registry. At that time, the only way to look at the JSON data associated with a container image at a container registry was to pull the image to the local server and then you could use **docker inspect** to read the JSON files. These images can be huge, up to multiple gigabytes. Because we wanted to allow users to examine the images and decide not to pull them, we wanted to add a new **--remote** interface to **docker inspect**. Upstream docker rejected the pull request, telling us that they did not want to complicate the Docker CLI, and that we could easily build our own tooling to do the same. + +My team, led by [Antonio Murdaca][30], ran with the idea and created [skopeo][31]. Antonio did not stop at just pulling the JSON file associated with the image—he decided to implement the entire protocol for pulling and pushing container images from container registries to/from the local host. + +Skopeo is now used heavily within the atomic CLI for things such as checking for new updates for containers and inside of [atomic scan][32]. Atomic also uses skopeo for pulling and pushing images, instead of using the upstream docker daemon. + +### Containers/image + +We had been talking to CoreOS about potentially using skopeo with rkt, and they said that they did not want to **exec** out to a helper application, but would consider using the library that skopeo used. We decided to split skopeo apart into a library and executable and created **[image][8]**. + +The [containers/image][33] library and skopeo are used in several other upstream projects and cloud infrastructure tools. Skopeo and containers/image have evolved to support multiple storage backends in addition to Docker, and it has the ability to move container images between container registries and many cool features. A [nice thing about skopeo][34]is it does not require any daemons to do its job. The breakout of containers/image library has also allowed us to add enhancements such as [container image signing][35]. + +### Innovations in image handling and scanning + +I mentioned the **atomic** CLI command earlier in this article. We built this tool to add features to containers that did not fit in with the Docker CLI, and things that we did not feel we could get into the upstream docker. We also wanted to allow flexibility to support additional container runtimes, tools, and storage as they developed. Skopeo is an example of this. + +One feature we wanted to add to atomic was **atomic mount**. Basically we wanted to take content that was stored in the Docker image store (upstream docker calls this a graph driver), and mount the image somewhere, so that tools could examine the image. Currently if you use upstream docker, the only way to look at an image is to start the container. If you have untrusted content, executing code inside of the container to look at the image could be dangerous. The second problem with examining an image by starting it is that the tools to examine the container are probably not in the container image. + +Most container image scanners seem to have the following pattern: They connect to the Docker socket, do a **docker save** to create a tarball, then explode the tarball on disk, and finally examine the contents. This is a slow operation. + +With **atomic mount**, we wanted to go into the Docker graph driver and mount the image. If the Docker daemon was using device mapper, we would mount the device. If it was using overlay, we would mount the overlay. This is an incredibly quick operation and satisfies our needs. You can now do: + +``` +# atomic mount fedora /mnt +# cd /mnt +``` + +And start examining the content. When you are done, do a: + +``` +# atomic umount /mnt +``` + +We use this feature inside of **atomic scan**, which allows you to have some of the fastest container scanners around. + +#### **Issues with tool coordination** + +One big problem is that **atomic mount** is doing this under the covers. The Docker daemon does not know that another process is using the image. This could cause problems (for example, if you mounted the Fedora image above and then someone went and executed **docker rmi fedora**, the Docker daemon would fail weirdly when trying to remove the Fedora image saying it was busy). The Docker daemon could get into a weird state. + +### Containers storage + +To solve this issue, we started looking at pulling the graph driver code out of the upstream docker daemon into its own repository. The Docker daemon did all of its locking in memory for the graph driver. We wanted to move this locking into the file system so that we could have multiple distinct processes able to manipulate the container storage at the same time, without having to go through a single daemon process. + +We created a project called [container/storage][36], which can do all of the COW features required for running, building, and storing containers, without requiring one process to control and monitor it (i.e., no daemon required). Now skopeo and other tools and projects can take advantage of the storage. Other open source projects have begun to use containers/storage, and at some point we would like to merge this project back into the upstream docker project. + +### Undock and let's innovate + +If you think about what happens when Kubernetes runs a container on a node with the Docker daemon, first Kubernetes executes a command like: + +``` +kubelet run nginx –image=nginx +``` + +This command tells the kubelet to run the NGINX application on the node. The kubelet calls into the CRI and asks it to start the NGINX application. At this point, the container runtime that implemented the CRI must do the following steps: + +1. Check local storage for a container named **nginx**. If not local, the container runtime will search for a standardized container image at a container registry. + +2. If the image is not in local storage, download it from the container registry to the local system. + +3. Explode the the download container image on top of container storage—usually a COW storage—and mount it up. + +4. Execute the container using a standardized container runtime. + +Let's look at the features described above: + +1. OCI Image Format Specification defines the standard image format for images stored at container registries. + +2. Containers/image is the library that implements all features needed to pull a container image from a container registry to a container host. + +3. Containers/storage provides a library to exploding OCI Image Formats onto COW storage and allows you to work with the image. + +4. OCI Runtime Specification and **runc** provide tools for executing the containers (the same tool that the Docker daemon uses for running containers). + +This means we can use these tools to implement the ability to use containers without requiring a big container daemon. + +In a moderate- to large-scale DevOps-based CI/CD environment, efficiency, speed, and security are important. And as long as your tools conform to the OCI specifications, then a developer or an operator should be using the best tools for automation through the CI/CD pipeline and into production. Most of the container tooling is hidden beneath orchestration or higher-up container platform technology. We envision a time in which runtime or image bundle tool selection perhaps becomes an installation option of the container platform. + +### System (standalone) containers + +On Project Atomic we introduced the **atomic host**, a new way of building an operating system in which the software can be "atomicly" updated and most of the applications that run on it will be run as containers. Our goal with this platform is to prove that most software can be shipped in the future in OCI Image Format, and use standard protocols to get images from container registries and install them on your system. Providing software as container images allows you to update the host operating system at a different pace than the applications that run on it. The traditional RPM/yum/DNF way of distributing packages locks the applications to the live cycle of the host operating systems. + +One problem we see with shipping most of the infrastructure as containers is that sometimes you must run an application before the container runtime daemon is executing. Let's look at our Kubernetes example running with the Docker daemon: Kubernetes requires a network to be set up so that it can put its pods/containers into isolated networks. The default daemon we use for this currently is **[flanneld][9]**, which must be running before the Docker daemon is started in order to hand the Docker daemon the network interfaces to run the Kubernetes pods. Also, flanneld uses [**etcd**][37] for its data store. This daemon is required to be run before flanneld is started. + +If we want to ship etcd and flanneld as container images, we have a chicken and egg situation. We need the container runtime daemon to start the containerized applications, but these applications need to be running before the container runtime daemon is started. I have seen several hacky setups to try to handle this situation, but none of them are clean. Also, the Docker daemon currently has no decent way to configure the priority order that containers start. I have seen suggestions on this, but they all look like the old SysVInit way of starting services (and we know the complexities that caused). + +### systemd + +One reason for replacing SysVInit with systemd was to handle the priority and ordering of starting services, so why not take advantage of this technology? In Project Atomic, we decided that we wanted to run containers on the host without requiring a container runtime daemon, especially for early boot. We enhanced the atomic CLI to allow you to install container images. If you execute** atomic install --system etcd**, it uses skopeo to go out to a container registries and pulls down the etcd OCI Image. Then it explodes (or expands) the image onto an OSTree backing store. Because we are running etcd in production, we treat the image as read-only. Next the **atomic** command grabs the systemd unit file template from the container image and creates a unit file on disk to start the image. The unit file actually uses **runc** to start the container on the host (although **runc** is not necessary). + +Similar things happen if you execute **atomic install --system flanneld**, except this time the flanneld unit file specifies that it needs etcd unit running before it starts. + +When the system boots up, systemd ensures that etcd is running before flanneld, and that the container runtime is not started until after flanneld is started. This allows you to move the Docker daemon and Kubernetes into system containers. This means you can boot up an atomic host or a traditional rpm-based operating system that runs the entire container orchestration stack as containers. This is powerful because we know customers want to continue to patch their container hosts independently of these components. Furthermore, it keeps the host's operating system footprint to a minimum. + +There even has been discussion about putting traditional applications into containers that can run either as standalone/system containers or as an orchestrated container. Consider an Apache container that you could install with the **atomic install --system httpd** command. This container image would be started the same way you start an rpm-based httpd service (**systemctl start httpd** except httpd will be started in a container). The storage could be local, meaning /var/www from the host gets mounted into the container, and the container listens on the local network at port 80\. This shows that you could run traditional workloads on a host inside of a container without requiring a container runtime daemon. + +### Building container images + +From my perspective, one of the saddest things about container innovation over the past four years has been the lack of innovation on mechanisms to build container images. A container image is nothing more than a tarball of tarballs and some JSON files. The base image of a container is a rootfs along with an JSON file describing the base image. Then as you add layers, the difference between the layers gets tar’d up along with changes to the JSON file. These layers and the base file get tar'd up together to form the container image. + +Almost everyone is building with the **docker build** and the Dockerfile format. Upstream docker stopped accepting pull requests to modify or improve Dockerfile format and builds a couple of years ago. The Dockerfile played an important part in the evolution of containers. Developers or administrators/operators could build containers in a simple and straightforward manner; however, in my opinion, the Dockerfile is really just a poor man’s bash script and creates several problems that have never been solved. For example: + +* To build a container image, Dockerfile requires a Docker daemon to be running. + * No one has built standard tooling to create the OCI image outside of executing Docker commands. + + * Even tools such as **ansible-containers** and OpenShift S2I (Source2Image) use **docker-engine** under the covers. + +* Each line in a Dockerfile creates a new image, which helps in the development process of creating the container because the tooling is smart enough to know that the lines in the Dockerfile have not changed, so the existing images can be used and the lines do not need to be reprocessed. This can lead to a  _huge_  number of layers. + * Because of these, several people have requested mechanisms to squash the images eliminating the layers. I think upstream docker finally has accepted something to satisfy the need. + +* To pull content from secured sites to put into your container image, often you need some form of secrets. For example you need access to the RHEL certificates and subscriptions in order to add RHEL content to an image. + * These secrets can end up in layers stored in the image. And the developer needs to jump through hoops to remove the secrets. + + * To allow volumes to be mounted in during Docker build, we have added a **-v** volume switch to the projectatomic/docker package that we ship, but upstream docker has not accepted these patches. + +* Build artifacts end up inside of the container image. So although Dockerfiles are great for getting started or building containers on a laptop while trying to understand the image you may want to build, they really are not an effective or efficient means to build images in a high-scaled enterprise environment. And behind an automated container platform, you shouldn't care if you are using a more efficient means to build OCI-compliant images. + +### Undock with Buildah + +At DevConf.cz 2017, I asked [Nalin Dahyabhai][38] on my team to look at building what I called **containers-coreutils**, basically, to use the containers/storage and containers/image libraries and build a series of command-line tools that could mimic the syntax of the Dockerfile. Nalin decided to call it [buildah][39], making fun of my Boston accent. With a few buildah primitives, you can build a container image: + +* One of the main concepts of security is to keep the amount of content inside of an OS image as small as possible to eliminate unwanted tools. The idea is that a hacker might need tools to break through an application, and if the tools such as **gcc**, **make**, **dnf** are not present, the attacker can be stopped or confined. + +* Because these images are being pulled and pushed over the internet, shrinking the size of the container is always a good idea. + +* How Docker build works is commands to install software or compile software have to be in the **uildroot** of the container. + +* Executing the **run** command requires all of the executables to be inside of the container image. Just using **dnf** inside of the container image requires that the entire Python stack be present, even if you never use Python in the application. + +* **ctr=$(buildah from fedora)**: + * Uses containers/image to pull the Fedora image from a container registry. + + * Returns a container ID (**ctr**). + +* **mnt=$(buildah mount $ctr)**: + * Mounts up the newly created container image (**$ctr**). + + * Returns the path to the mount point. + + * You can now use this mount point to write content. + +* **dnf install httpd –installroot=$mnt**: + * You can use commands on the host to redirect content into the container, which means you can keep your secrets on the host, you don't have to put them inside of the container, and your build tools can be kept on the host. + + * You don't need **dnf** inside of the container or the Python stack unless your application is going to use it. + +* **cp foobar $mnt/dir**: + * You can use any command available in bash to populate the container. + +* **buildah commit $ctr**: + * You can create a layer whenever you decide. You control the layers rather than the tool. + +* **buildah config --env container=oci --entrypoint /usr/bin/httpd $ctr**: + * All of the commands available inside of Dockerfile can be specified. + +* **buildah run $ctr dnf -y install httpd**: + * Buildah **run** is supported, but instead of relying on a container runtime daemon, buildah executes **runc** to run the command inside of a locked down container. + +* **buildah build-using-dockerfile -f Dockerfile .**: + + We want to move tools like **ansible-containers** and OpenShift S2I to use **buildah**rather than requiring a container runtime daemon. + + Another big issue with building in the same container runtime that is used to run containers in production is that you end up with the lowest common denominator when it comes to security. Building containers tends to require a lot more privileges than running containers. For example, we allow the **mknod** capability by default. The **mknod** capability allows processes to create device nodes. Some package installs attempt to create device nodes, yet in production almost no applications do. Removing the **mknod** capability from your containers in production would make your systems more secure. + + Another example is that we default container images to read/write because the install process means writing packages to **/usr**. Yet in production, I argue that you really should run all of your containers in read-only mode. Only allow the containers to write to **tmpfs** or directories that have been volume mounted into the container. By splitting the running of containers from the building, we could change the defaults and make for a much more secure environment. + + * And yes, buildah can build a container image using a Dockerfile. + +### CRI-O a runtime abstraction for Kubernetes + +Kubernetes added an API to plug in any runtime for the pods called Container Runtime Interface (CRI). I am not a big fan of having lots of daemons running on my system, but we have added another. My team led by [Mrunal Patel][40] started working on [CRI-O][41] daemon in late 2016\. This is a Container Runtime Interface daemon for running OCI-based applications. Theoretically, in the future we could compile in the CRI-O code directly into the kubelet to eliminate the second daemon. + +Unlike other container runtimes, CRI-O's only purpose in life is satisfying Kubernetes' needs. Remember the steps described above for what Kubernetes need to run a container. + +Kubernetes sends a message to the kubelet that it wants it to run the NGINX server: + +1. The kubelet calls out to the CRI-O to tell it to run NGINX. + +2. CRI-O answers the CRI request. + +3. CRI-O finds an OCI Image at a container registry. + +4. CRI-O uses containers/image to pull the image from the registry to the host. + +5. CRI-O unpacks the image onto local storage using containers/storage. + +6. CRI-O launches a OCI Runtime Specification, usually **runc**, and starts the container. As I stated previously, the Docker daemon launches its containers using **runc**, in exactly the same way. + +7. If desired, the kubelet could also launch the container using an alternate runtime, such as Clear Containers **runv**. + +CRI-O is intended to be a stable platform for running Kubernetes, and we will not ship a new version of CRI-O unless it passes the entire Kubernetes test suite. All pull requests that go to [https://github.com/Kubernetes-incubator/cri-o][42] run against the entire Kubernetes test suite. You can not get a pull request into CRI-O without passing the tests. CRI-O is fully open, and we have had contributors from several different companies, including Intel, SUSE, IBM, Google, Hyper.sh. As long as a majority of maintainers agree to a patch to CRI-O, it will get accepted, even if the patch is not something that Red Hat wants. + +### Conclusion + +I hope this deep dive helps you understand how Linux containers have evolved. At one point, Linux containers were an every-vendor-for-themselves situation. Docker helped focus on a de facto standard for image creation and simplifying the tools used to work with containers. The Open Container Initiative now means that the industry is working around a core image format and runtime, which fosters innovation around making tooling more efficient for automation, more secure, highly scalable, and easier to use. Containers allow us to examine installing software in new and novel ways—whether they are traditional applications running on a host, or orchestrated micro-services running in the cloud. In many ways, this is just the beginning. + +-------------------------------------------------------------------------------- + +作者简介: + +Daniel J Walsh - Daniel Walsh has worked in the computer security field for almost 30 years. Dan joined Red Hat in August 2001. + +via: https://opensource.com/article/17/7/how-linux-containers-evolved + +作者:[ Daniel J Walsh (Red Hat)][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/rhatdan +[1]:https://opensource.com/resources/what-are-linux-containers?utm_campaign=containers&intcmp=70160000000h1s6AAA +[2]:https://opensource.com/resources/what-docker?utm_campaign=containers&intcmp=70160000000h1s6AAA +[3]:https://opensource.com/resources/what-is-kubernetes?utm_campaign=containers&intcmp=70160000000h1s6AAA +[4]:https://developers.redhat.com/blog/2016/01/13/a-practical-introduction-to-docker-container-terminology/utm_campaign=containers&intcmp=70160000000h1s6AAA +[5]:https://opensource.com/article/17/7/how-linux-containers-evolved?rate=k1UcW7wzh6axaB_z8ScE-U8cux6fLXXgW_vboB5tIwk +[6]:https://github.com/opencontainers/runtime-spec/blob/master/spec.md +[7]:https://github.com/opencontainers/image-spec/blob/master/spec.md +[8]:https://github.com/containers/imagehttps://github.com/containers/image +[9]:https://github.com/coreos/flannel +[10]:https://opensource.com/user/16673/feed +[11]:https://www.flickr.com/photos/danramarch/ +[12]:https://creativecommons.org/licenses/by-sa/4.0/ +[13]:https://access.redhat.com/documentation/en-US/Red_Hat_Enterprise_Linux/6/html/Logical_Volume_Manager_Administration/device_mapper.html +[14]:https://btrfs.wiki.kernel.org/index.php/Main_Page +[15]:https://www.kernel.org/doc/Documentation/filesystems/overlayfs.txt +[16]:https://linuxcontainers.org/ +[17]:https://libvirt.org/ +[18]:http://sandbox.libvirt.org/ +[19]:https://opensource.com/article/17/6/getting-started-go +[20]:https://github.com/opencontainers/runc/tree/master/libcontainer +[21]:https://github.com/opencontainers/runtime-spec +[22]:https://opensource.com/business/15/10/lisa15-interview-alison-chaiken-mentor-graphics +[23]:https://www.openshift.com/ +[24]:https://openshift.github.io/geard/ +[25]:https://opensource.com/resources/what-is-kubernetes +[26]:https://github.com/google/lmctfy +[27]:https://kubernetes.io/docs/admin/kubelet/ +[28]:https://www.opencontainers.org/ +[29]:https://github.com/projectatomic/atomic +[30]:https://twitter.com/runc0m +[31]:https://github.com/projectatomic/skopeohttps://github.com/projectatomic/skopeo +[32]:https://developers.redhat.com/blog/2016/05/02/introducing-atomic-scan-container-vulnerability-detection/ +[33]:https://github.com/containers/image +[34]:http://rhelblog.redhat.com/2017/05/11/skopeo-copy-to-the-rescue/ +[35]:https://access.redhat.com/articles/2750891 +[36]:https://github.com/containers/storage +[37]:https://github.com/coreos/etcd +[38]:https://twitter.com/nalind +[39]:https://github.com/projectatomic/buildah +[40]:https://twitter.com/mrunalp +[41]:https://github.com/Kubernetes-incubator/cri-o +[42]:https://github.com/Kubernetes-incubator/cri-o +[43]:https://opensource.com/users/rhatdan +[44]:https://opensource.com/users/rhatdan +[45]:https://opensource.com/article/17/7/how-linux-containers-evolved#comments From a511f01714ed8f5f970bd0e13f2f8656c8e2c0f9 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 16:40:03 +0800 Subject: [PATCH 0699/1407] =?UTF-8?q?20170716-9=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...unctional testing Gtk applications in C.md | 293 ++++++++++++++++++ 1 file changed, 293 insertions(+) create mode 100644 sources/tech/20170711 Functional testing Gtk applications in C.md diff --git a/sources/tech/20170711 Functional testing Gtk applications in C.md b/sources/tech/20170711 Functional testing Gtk applications in C.md new file mode 100644 index 0000000000..f2b211372f --- /dev/null +++ b/sources/tech/20170711 Functional testing Gtk applications in C.md @@ -0,0 +1,293 @@ +Functional testing Gtk+ applications in C +============================================================ + +### Learn how to test your application's function with this simple tutorial. + + +![Functional testing Gtk+ applications in C ](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/cube_innovation_block_collaboration.png?itok=CbG3Mpqi "Functional testing Gtk+ applications in C ") +Image by :  + +opensource.com + +Automated tests are required to ensure your program's quality and that it works as expected. Unit tests examine only certain parts of your algorithm, but don't look at how each component fits together. That's where functional testing, sometimes referred as integration testing, comes in. + +A functional test basically interacts with your user interface, whether through a website or a desktop application. To show you how that works, let's look at how to test a Gtk+ application. For simplicity, in this tutorial let's use the [Tictactoe][6] example from the Gtk+ 2.0 tutorial. + +### Basic setup + +For every functional test, you usually define some global variables, such as "user interaction delay" or "timeout until a failure is indicated" (i.e., when an event doesn't occur until the specified time and the application is doomed). + +``` +#define TTT_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(f) ((TttFunctionalTestUtilIdleCondition)(f)) +#define TTT_FUNCTIONAL_TEST_UTIL_REACTION_TIME (125000) +#define TTT_FUNCTIONAL_TEST_UTIL_REACTION_TIME_LONG (500000) +typedef gboolean (*TttFunctionalTestUtilIdleCondition)(gpointer data); +struct timespec ttt_functional_test_util_default_timeout = { +  20, +  0, +}; +``` + +Now we can implement our dead-time functions. Here, we'll use the **usleep** function in order to get the desired delay. + +``` +void +ttt_functional_test_util_reaction_time() +{ +  usleep(TTT_FUNCTIONAL_TEST_UTIL_REACTION_TIME); +} + +void +ttt_functional_test_util_reaction_time_long() +{ +  usleep(TTT_FUNCTIONAL_TEST_UTIL_REACTION_TIME_LONG); +} +``` + +The timeout function delays execution until a state of a control is applied. It is useful for actions that are applied asynchronously, and that is why it delays for a longer period of time. + +``` +void +ttt_functional_test_util_idle_condition_and_timeout( +     TttFunctionalTestUtilIdleCondition idle_condition, +     struct timespec *timeout, +     pointer data) +{ +  struct timespec start_time, current_time; + +  clock_gettime(CLOCK_MONOTONIC, +                &start_time); + +  while(TTT_FUNCTIONAL_TEST_UTIL_IDLE_CONDITION(idle_condition)(data)){ +    ttt_functional_test_util_reaction_time(); + +    clock_gettime(CLOCK_MONOTONIC, +                  ¤t_time); + +    if(start_time.tv_sec + timeout->tv_sec < current_time.tv_sec){ +      break; +    } +  } + +  ttt_functional_test_util_reaction_time(); +} +``` + +### Interacting with the graphical user interface + +In order to simulate user interaction, the [**Gdk library**][7] provides the functions we need. To do our work here, we need only these three functions: + +* gdk_display_warp_pointer() + +* gdk_test_simulate_button() + +* gdk_test_simulate_key() + +For instance, to test a button click, we do the following: + +``` +gboolean +ttt_functional_test_util_button_click(GtkButton *button) +{ +  GtkWidget *widget; + +  GdkWindow *window; + +  gint x, y; +  gint origin_x, origin_y; + +  if(button == NULL || +     !GTK_IS_BUTTON(button)){ +    return(FALSE); +  } + +  widget = button; + +  if(!GTK_WIDGET_REALIZED(widget)){ +    ttt_functional_test_util_reaction_time_long(); +  } + +  /* retrieve window and pointer position */ +  gdk_threads_enter(); + +  window = gtk_widget_get_window(widget); + +  x = widget->allocation.x + widget->allocation.width / 2.0; +  y = widget->allocation.y + widget->allocation.height / 2.0; + +  gdk_window_get_origin(window, &origin_x, &origin_y); + +  gdk_display_warp_pointer(gtk_widget_get_display(widget), +                           gtk_widget_get_screen(widget), +                           origin_x + x, origin_y + y); + +  gdk_threads_leave(); + +  /* click the button */ +  ttt_functional_test_util_reaction_time(); + +  gdk_test_simulate_button(window, +                           x, +                           y, +                           1, +                           GDK_BUTTON1_MASK, +                           GDK_BUTTON_PRESS); + +  ttt_functional_test_util_reaction_time(); + +  gdk_test_simulate_button(window, +                           x, +                           y, +                           1, +                           GDK_BUTTON1_MASK, +                           GDK_BUTTON_RELEASE); + +  ttt_functional_test_util_reaction_time(); + +  ttt_functional_test_util_reaction_time_long(); + +  return(TRUE); +} +``` + +We want to ensure the button has an active state, so we provide an idle-condition function: + +``` +gboolean +ttt_functional_test_util_idle_test_toggle_active( +     GtkToggleButton **toggle_button) +{ +  gboolean do_idle; + +  do_idle = TRUE; + +  gdk_threads_enter(); + +  if(*toggle_button != NULL && +     GTK_IS_TOGGLE_BUTTON(*toggle_button) && +     gtk_toggle_button_get_active(*toggle_button)){ +    do_idle = FALSE; +  } + +  gdk_threads_leave(); + +  return(do_idle); +} +``` + +### The test scenario + +Since the Tictactoe program is very simple, we just need to ensure that a [**GtkToggleButton**][8] was clicked. The functional test can proceed once it asserts the button entered the active state. To click the buttons, we use the handy **util** function provided above. + +For illustration, let's assume player A wins immediately by filling the very first row, because player B is not paying attention and just filled the second row: + +``` +GtkWindow *window; +Tictactoe *ttt; + +void* +ttt_functional_test_gtk_main(void *) +{ +  gtk_main(); + +  pthread_exit(NULL); +} + +void +ttt_functional_test_dumb_player_b() +{ +  GtkButton *buttons[3][3]; + +  guint i; + +  /* to avoid race-conditions copy the buttons */ +  gdk_threads_enter(); + +  memcpy(buttons, ttt->buttons, 9 * sizeof(GtkButton *)); + +  gdk_threads_leave(); + +  /* TEST 1 - the dumb player B */ +  for(i = 0; i < 3; i++){ +    /* assert player A clicks the button successfully */ +    if(!ttt_functional_test_util_button_click(buttons[0][i])){ +      exit(-1); +    } + +    functional_test_util_idle_condition_and_timeout( +         ttt_functional_test_util_idle_test_toggle_active, +         ttt_functional_test_util_default_timeout, +         &buttons[0][i]); + +    /* assert player B clicks the button successfully */ +    if(!ttt_functional_test_util_button_click(buttons[1][i])){ +      exit(-1); +    } + +    functional_test_util_idle_condition_and_timeout( +         ttt_functional_test_util_idle_test_toggle_active, +         ttt_functional_test_util_default_timeout, +         &buttons[1][i]); +  } +} + +int +main(int argc, char **argv) +{ +  pthread_t thread; + +  gtk_init(&argc, &argv); + +  /* start the tictactoe application */ +  window = gtk_window_new(GTK_WINDOW_TOPLEVEL); + +  ttt = tictactoe_new(); +  gtk_container_add(window, ttt); + +  gtk_widget_show_all(window); + +  /* start the Gtk+ dispatcher */ +  pthread_create(&thread, NULL, +                 ttt_functional_test_gtk_main, NULL); + +  /* launch test routines */ +  ttt_functional_test_dumb_player_b(); + +  /* terminate the application */ +  gdk_threads_enter(); + +  gtk_main_quit(); + +  gdk_threads_leave(); + +  return(0); +} +``` + +-------------------------------------------------------------------------------- + +作者简介: + +Joël Krähemann - Free software enthusiast with a strong knowledge about the C programming language. I don't fear any code complexity as long it is written in a simple manner. As developer of Advanced Gtk+ Sequencer I know how challenging multi-threaded applications can be and with it we have a great basis for future demands.my personal website + + +via: https://opensource.com/article/17/7/functional-testing + +作者:[Joël Krähemann][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/joel2001k +[1]:http://www.opengroup.org/onlinepubs/009695399/functions/memcpy.html +[2]:http://www.opengroup.org/onlinepubs/009695399/functions/exit.html +[3]:http://www.opengroup.org/onlinepubs/009695399/functions/exit.html +[4]:https://opensource.com/article/17/7/functional-testing?rate=BxwmcarRgeZ4CW_9EkWQKKS2LxDGFqMMiUtt9z-ofhY +[5]:https://opensource.com/user/127961/feed +[6]:https://developer.gnome.org/gtk-tutorial/stable/ +[7]:https://developer.gnome.org/gdk3/stable/ +[8]:https://developer.gnome.org/gtk3/stable/GtkToggleButton.html +[9]:https://opensource.com/users/joel2001k +[10]:https://opensource.com/users/joel2001k +[11]:https://opensource.com/article/17/7/functional-testing#comments From 9c59f17692a81a8f93e6e6643cf9fbc5dd528a6d Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 16:41:29 +0800 Subject: [PATCH 0700/1407] =?UTF-8?q?20170716-10=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ght image viewers for the Linux desktop.md | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 sources/tech/20170711 4 lightweight image viewers for the Linux desktop.md diff --git a/sources/tech/20170711 4 lightweight image viewers for the Linux desktop.md b/sources/tech/20170711 4 lightweight image viewers for the Linux desktop.md new file mode 100644 index 0000000000..9195d06aaa --- /dev/null +++ b/sources/tech/20170711 4 lightweight image viewers for the Linux desktop.md @@ -0,0 +1,144 @@ +4 lightweight image viewers for the Linux desktop +============================================================ + +### When you need more than a basic image viewer but less than a full image editor, check out these apps. + + +![4 lightweight image viewers for the Linux desktop](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/lightbulb-idea-think-yearbook-lead.png?itok=56ovNk8n "4 lightweight image viewers for the Linux desktop") +Image by :  + +[Internet Archive Book Images][17]. Modified by Opensource.com. CC BY-SA 4.0 + +Like most people, you probably have more than a few photos and other images on your computer. And, like most people, you probably like to take a peek at those images and photos every so often. + +Firing up an editor like [GIMP][18] or [Pinta][19] is overkill for simply viewing images. + +More Linux resources + +* [What is Linux?][1] + +* [What are Linux containers?][2] + +* [Download Now: Linux commands cheat sheet][3] + +* [Advanced Linux commands cheat sheet][4] + +* [Our latest Linux articles][5] + +On the other hand, the basic image viewer included with most Linux desktop environments might not be enough for your needs. If you want something with a few more features, but still want it to be lightweight, then take a closer look at these four image viewers for the Linux desktop, plus a handful of bonus options if they don't meet your needs. + +### Feh + +[Feh][20] is an old favorite from the days when I computed on older, slower hardware. It's simple, unadorned, and does what it's designed to do very well. + +You drive Feh from the command line: just point it at an image or a folder containing images and away you go. Feh loads quickly, and you can scroll through a set of images with a mouse click or by using the left and right arrow keys on your keyboard. What could be simpler? + +Feh might be light, but it offers some options. You can, for example, control whether Feh's window has a border, set the minimum and maximum sizes of the images you want to view, and tell Feh at which image in a folder you want to start viewing. + +### [feh.png][6] + +![Feh](https://opensource.com/sites/default/files/u128651/feh.png "Feh") + +Feh in action + +### Ristretto + +If you've used Xfce as a desktop environment, you'll be familiar with [Ristretto][21]. It's small, simple, and very useful. + +How simple? You open a folder containing images, click on one of the thumbnails on the left, and move through the images by clicking the navigation keys at the top of the window. Ristretto even has a slideshow feature. + +Ristretto can do a bit more, too. You can use it to save a copy of an image you're viewing, set that image as your desktop wallpaper, and even open it in another application, for example, if you need to touch it up. + +### [ristretto.png][7] + +![Ristretto](https://opensource.com/sites/default/files/u128651/ristretto.png "Ristretto") + +Viewing photos in Ristretto + +### Mirage + +On the surface, [Mirage][22] is kind of plain and nondescript. It does the same things just about every decent image viewer does: opens image files, scales them to the width of the window, and lets you scroll through a collection of images using your keyboard. It even runs slideshows. + +Still, Mirage will surprise anyone who needs a little more from their image viewer. In addition to its core features, Mirage lets you resize and crop images, take screenshots, rename an image file, and even generate 150-pixel-wide thumbnails of the images in a folder. + +If that wasn't enough, Mirage can display [SVG files][23]. You can even drive it [from the command line][24]. + +### [mirage.png][8] + +![Mirage](https://opensource.com/sites/default/files/u128651/mirage.png "Mirage") + +Taking Mirage for a spin + +### Nomacs + +[Nomacs][25] is easily the heaviest of the image viewers described in this article. Its perceived bulk belies Nomacs' speed. It's quick and easy to use. + +Nomacs does more than display images. You can also view and edit an image's [metadata][26], add notes to an image, and do some basic editing—including cropping, resizing, and converting the image to grayscale. Nomacs can even take screenshots. + +One interesting feature is that you can run two instances of the application on your desktop and synchronize an image across those instances. The [Nomacs documentation][27]recommends this when you need to compare two images. You can even synchronize an image across a local area network. I haven't tried synchronizing across a network, but please share your experiences if you have. + +### [nomacs.png][9] + +![Nomacs](https://opensource.com/sites/default/files/u128651/nomacs.png "Nomacs") + +A photo and its metadata in Nomacs + +### A few other viewers worth looking at + +If these four image viewers don't suit your needs, here are some others that might interest you. + +**[Viewnior][11]** bills itself as a "fast and simple image viewer for GNU/Linux," and it fits that bill nicely. Its interface is clean and uncluttered, and Viewnior can even do some basic image manipulation. + +If the command line is more your thing, then **display** might be the viewer for you. Both the **[ImageMagick][12]** and **[GraphicsMagick][13]** image manipulation packages have an application named display, and both versions have basic and advanced options for viewing images. + +**[Geeqie][14]** is one of the lighter and faster image viewers out there. Don't let its simplicity fool you, though. It packs features, like metadata editing and viewing camera RAW image formats, that other viewers lack. + +**[Shotwell][15]** is the photo manager for the GNOME desktop. While it does more than just view images, Shotwell is quite speedy and does a great job of displaying photos and other graphics. + + _Do you have a favorite lightweight image viewer for the Linux desktop? Feel free to share your preferences by leaving a comment._ + +-------------------------------------------------------------------------------- + +作者简介: + +cott Nesbitt - I'm a long-time user of free/open source software, and write various things for both fun and profit. I don't take myself too seriously. You can find me at these fine establishments on the web: Twitter, Mastodon, GitHub. + +via: https://opensource.com/article/17/7/4-lightweight-image-viewers-linux-desktop + +作者:[ Scott Nesbitt][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/scottnesbitt +[1]:https://opensource.com/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[6]:https://opensource.com/file/361216 +[7]:https://opensource.com/file/361231 +[8]:https://opensource.com/file/361221 +[9]:https://opensource.com/file/361226 +[10]:https://opensource.com/article/17/7/4-lightweight-image-viewers-linux-desktop?rate=UcKbaJQJAbLScWVu8qm9bqii7JMsIswjfcBHt3aRnEU +[11]:http://siyanpanayotov.com/project/viewnior/ +[12]:https://www.imagemagick.org/script/display.php +[13]:http://www.graphicsmagick.org/display.html +[14]:http://geeqie.org/ +[15]:https://wiki.gnome.org/Apps/Shotwell +[16]:https://opensource.com/user/14925/feed +[17]:https://www.flickr.com/photos/internetarchivebookimages/14758810172/in/photolist-oubL5m-ocu2ck-odJwF4-oeq1na-odgZbe-odcugD-w7KHtd-owgcWd-oucGPe-oud585-rgBDNf-obLoQH-oePNvs-osVgEq-othPLM-obHcKo-wQR3KN-oumGqG-odnCyR-owgLg3-x2Zeyq-hMMxbq-oeRzu1-oeY49i-odumMM-xH4oJo-odrT31-oduJr8-odX8B3-obKG8S-of1hTN-ovhHWY-ow7Scj-ovfm7B-ouu1Hj-ods7Sg-qwgw5G-oeYz5D-oeXqFZ-orx8d5-hKPN4Q-ouNKch-our8E1-odvGSH-oweGTn-ouJNQQ-ormX8L-od9XZ1-roZJPJ-ot7Wf4 +[18]:https://www.gimp.org/ +[19]:https://pinta-project.com/pintaproject/pinta/ +[20]:https://feh.finalrewind.org/ +[21]:https://docs.xfce.org/apps/ristretto/start +[22]:http://mirageiv.sourceforge.net/ +[23]:https://en.wikipedia.org/wiki/Scalable_Vector_Graphics +[24]:http://mirageiv.sourceforge.net/docs-advanced.html#cli +[25]:http://nomacs.org/ +[26]:https://iptc.org/standards/photo-metadata/photo-metadata/ +[27]:http://nomacs.org/synchronization/ +[28]:https://opensource.com/users/scottnesbitt +[29]:https://opensource.com/users/scottnesbitt +[30]:https://opensource.com/article/17/7/4-lightweight-image-viewers-linux-desktop#comments From 0f3081bafd048a1ecfdbd9de9afd44a054685033 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 16:45:25 +0800 Subject: [PATCH 0701/1407] =?UTF-8?q?20170716-12=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...7 The changing face of the hybrid cloud.md | 92 +++++++++++++++++++ 1 file changed, 92 insertions(+) create mode 100644 sources/tech/20170707 The changing face of the hybrid cloud.md diff --git a/sources/tech/20170707 The changing face of the hybrid cloud.md b/sources/tech/20170707 The changing face of the hybrid cloud.md new file mode 100644 index 0000000000..6207037ad1 --- /dev/null +++ b/sources/tech/20170707 The changing face of the hybrid cloud.md @@ -0,0 +1,92 @@ +The changing face of the hybrid cloud +============================================================ + +### Terms and concepts around cloud computing are still new, but evolving. + + +![The changing face of the hybrid cloud](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/bus-cloud.png?itok=bdROR1aE "The changing face of the hybrid cloud") +Image credits :  + +[Flickr user: theaucitron][9] (CC BY-SA 2.0) + +Depending upon the event you use to start the clock, cloud computing is only a little more than 10 years old. Some terms and concepts around cloud computing that we take for granted today are newer still. The National Institute of Standards and Technology (NIST) document that defined now-familiar cloud terminology—such as Infrastructure-as-a-Service (IaaS)—was only published in 2011, although it widely circulated in draft form for a while before that. + +Among other definitions in that document was one for  _hybrid cloud_ . Looking at how that term has shifted during the intervening years is instructive. Cloud-based infrastructures have moved beyond a relatively simplistic taxonomy. Also, it highlights how priorities familiar to adopters of open source software—such as flexibility, portability, and choice—have made their way to the hybrid cloud. + +Explore the open source cloud + +* [What is the cloud?][1] + +* [What is OpenStack?][2] + +* [What is Kubernetes?][3] + +* [Why the operating system matters for containers][4] + +* [Keeping Linux containers safe and secure][5] + +NIST's original hybrid cloud definition was primarily focused on cloud bursting, the idea that you might use on-premise infrastructure to handle a base computing load, but that you could "burst" out to a public cloud if your usage spiked. Closely related were efforts to provide API compatibility between private clouds and public cloud providers and even to create spot markets to purchase capacity wherever it was cheapest. + +Implicit in all this was the idea of the cloud as a sort of standardized compute utility with clear analogs to the electrical grid, a concept probably most popularized by author Nick Carr in his book  [_The Big Switch_][10] . It made for a good story but, even early on, the [limitations of the analogy became evident][11]. Computing isn't a commodity in the manner of electricity. One need look no further than the proliferation of new features by all of the major public cloud providers—as well as in open source cloud software such as OpenStack—to see that many users aren't simply looking for generic computing cycles at the lowest price. + +The cloud bursting idea also largely ignored the reality that computing is usually associated with data and you can't just move large quantities of data around instantaneously without incurring big bandwidth bills and having to worry about the length of time those transfers take. Dave McCrory coined the term  _data gravity_  to describe this limitation. + +Given this rather negative picture I've painted, why are we talking about hybrid clouds so much today? + +As I've discussed, hybrid clouds were initially thought of mostly in the context of cloud bursting. And cloud bursting perhaps most emphasized rapid, even real-time, shifts of workloads from one cloud to another; however, hybrid clouds also implied application and data portability. Indeed, as [I wrote in a CNET post][12] back in 2011: "I think we do ourselves a disservice by obsessing too much with 'automagical' workload shifting—when what we really care about is the ability to just move from one place to another if a vendor isn't meeting our requirements or is trying to lock us in." + +Since then, thinking about portability across clouds has evolved even further. + +Linux always has been a key component of cloud portability because it can run on everything from bare-metal to on-premise virtualized infrastructures, and from private clouds to public clouds. Linux provides a well-established, reliable platform with a stable API contract against which applications can be written. + +The widespread adoption of containers has further enhanced the ability of Linux to provide application portability across clouds. By providing an image that also contains an application's dependencies, a container provides portability and consistency as applications move from development, to testing, and finally to production. + +Linux containers can be applied in many different ways to problems where ultimate portability, configurability, and isolation are needed. This is true whether running on-premise, in a public cloud, or a hybrid of the two. + +Container tools use an image-based deployment model. This makes sharing an application or set of services with all of their dependencies across multiple environments easy. + +Specifications developed under the auspices of the Open Container Initiative (OCI) work together to define the contents of a container image and those dependencies, environments, arguments, and so forth necessary for the image to be run properly. As a result of these standardization efforts, the OCI has opened the door for many other tooling efforts that can now depend on stable runtime and image specs. + +At the same time, distributed storage can provide data portability across clouds using open source technologies such as Gluster and Ceph. Physical constraints will always impose limits on how quickly and easily data can be moved from one location to another; however, as organizations deploy and use different types of infrastructure, they increasingly desire open, software-defined storage platforms that scales across physical, virtual, and cloud resources. + +This is especially the case as data storage requirements grow rapidly, because of trends in predictive analytics, internet-of-things, and real-time monitoring. In [one 2016 study][13], 98% of IT decision makers said a more agile storage solution could benefit their organization. In the same study, they listed inadequate storage infrastructure as one of the greatest frustrations that their organizations experience. + +And it's really this idea of providing appropriate portability and consistency across a heterogeneous set of computing capabilities and resources that embodies what hybrid cloud has become. Hybrid cloud is not so much about using a private cloud and a public cloud in concert for the same applications. It's about using a set of services of many types, some of which are probably built and operated by your IT department, and some of which are probably sourced externally. + +They'll probably be a mix of Software-as-a-Service applications, such as email and customer relationship management. Container platforms, orchestrated by open source software such as Kubernetes, are increasingly popular for developing new applications. Your organization likely is using one of the big public cloud providers for  _something_ . And you're almost certain to be operating some of your own infrastructure, whether it's a private cloud or more traditional on-premise infrastructure. + +This is the face of today's hybrid cloud, which really can be summed up as choice—choice to select the most appropriate types of infrastructure and services, and choice to move applications and data from one location to another when you want to. + + **_Also read: [Multi-cloud vs. hybrid cloud: What's the difference?][6]_** + +-------------------------------------------------------------------------------- + +作者简介: + +Gordon Haff is Red Hat’s cloud evangelist, is a frequent and highly acclaimed speaker at customer and industry events, and helps develop strategy across Red Hat’s full portfolio of cloud solutions. He is the author of Computing Next: How the Cloud Opens the Future in addition to numerous other publications. Prior to Red Hat, Gordon wrote hundreds of research notes, was frequently quoted in publications like The New York Times on a wide range of IT topics, and advised clients on product and marketing strategies. Earlier in his career, he was responsible for bringing a wide range of computer systems, from minicomputers to large UNIX servers, to market while at Data General. Gordon has engineering degrees from MIT and Dartmouth and an MBA from Cornell’s Johnson School. + + +via: https://opensource.com/article/17/7/hybrid-cloud + +作者:[ Gordon Haff (Red Hat) ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/ghaff +[1]:https://opensource.com/resources/cloud?src=cloud_resource_menu1 +[2]:https://opensource.com/resources/what-is-openstack?src=cloud_resource_menu2 +[3]:https://opensource.com/resources/what-is-kubernetes?src=cloud_resource_menu3 +[4]:https://opensource.com/16/12/yearbook-why-operating-system-matters?src=cloud_resource_menu4 +[5]:https://opensource.com/business/16/10/interview-andy-cathrow-anchore?src=cloud_resource_menu5 +[6]:https://enterprisersproject.com/article/2017/7/multi-cloud-vs-hybrid-cloud-whats-difference +[7]:https://opensource.com/article/17/7/hybrid-cloud?rate=ztmV2D_utD03cID1u41Al08w0XFm6rXXwCJdTwqI4iw +[8]:https://opensource.com/user/21220/feed +[9]:https://www.flickr.com/photos/theaucitron/5810163712/in/photolist-5p9nh3-6EkSKG-6EgGEF-9hYBcr-abCSpq-9zbjDz-4PVqwm-9RqBfq-abA2T4-4nXfwv-9RQkdN-dmjSdA-84o2ER-abA2Wp-ehyhPC-7oFYrc-4nvqBz-csMQXb-nRegFf-ntS23C-nXRyaB-6Xw3Mq-cRMaCq-b6wkkP-7u8sVQ-yqcg-6fTmk7-bzm3vU-6Xw3vL-6EkzCQ-d3W8PG-5MoveP-oMWsyY-jtMME6-XEMwS-2SeRXT-d2hjzJ-p2ZZVZ-7oFYoX-84r6Mo-cCizvm-gnnsg5-77YfPx-iDjqK-8gszbW-6MUZEZ-dhtwtk-gmpTob-6TBJ8p-mWQaAC/ +[10]:http://www.nicholascarr.com/?page_id=21 +[11]:https://www.cnet.com/news/there-is-no-big-switch-for-cloud-computing/ +[12]:https://www.cnet.com/news/cloudbursting-or-just-portable-clouds/ +[13]:https://www.redhat.com/en/technologies/storage/vansonbourne +[14]:https://opensource.com/users/ghaff +[15]:https://opensource.com/users/ghaff From 9feb4154e1f63b8bbaa33ac7ba03d1a21b068af7 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 16:47:34 +0800 Subject: [PATCH 0702/1407] =?UTF-8?q?20170716-13=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20170707 Bash prompt tips and tricks.md | 155 ++++++++++++++++++ 1 file changed, 155 insertions(+) create mode 100644 sources/tech/20170707 Bash prompt tips and tricks.md diff --git a/sources/tech/20170707 Bash prompt tips and tricks.md b/sources/tech/20170707 Bash prompt tips and tricks.md new file mode 100644 index 0000000000..3fff0d6356 --- /dev/null +++ b/sources/tech/20170707 Bash prompt tips and tricks.md @@ -0,0 +1,155 @@ +Bash prompt tips and tricks +============================================================ + +### Here are a few hidden treasures you can use to customize your Bash prompt. + +![Bash prompt tips and tricks](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/osdc_terminals.png?itok=QmkPW7P1 "Bash prompt tips and tricks") +Image by :  + +[ajmexico][8]. Modified by [Jason Baker][9]. [CC BY-SA 2.0][10]. + +Anyone who has started a terminal in Linux is familiar with the default Bash prompt: + +``` +[user@$host ~]$ +``` + +But did you know is that this is completely customizable and can contain some very useful information? Here are a few hidden treasures you can use to customize your Bash prompt. + +### How is the Bash prompt set? + +The Bash prompt is set by the environment variable **PS1** (Prompt String 1), which is used for interactive shell prompts. There is also a **PS2** variable, which is used when more input is required to complete a Bash command. + +``` +[dneary@dhcp-41-137 ~]$ export PS1="[Linux Rulez]$ " +[Linux Rulez] export PS2="... " +[Linux Rulez] if true; then +... echo "Success!" +... fi +Success! +``` + +### Where is the value of PS1 set? + +PS1 is a regular environment variable. + +The system default value is set in **/etc/bashrc**. On my system, the default prompt is set with this line: + +``` +[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ " +``` + +This tests whether the value of PS1 is **\s-\v$** (the system default value), and if it is, it sets PS1 to the value **[\u@\h \W]\\$**. + +If you want to see a custom prompt, however, you should not be editing **/etc/bashrc**. You should instead add it to **.bashrc** in your **Home** directory. + +### What do \u, \h, \W, \s, and \v mean? + +More Linux resources + +* [What is Linux?][1] + +* [What are Linux containers?][2] + +* [Download Now: Linux commands cheat sheet][3] + +* [Advanced Linux commands cheat sheet][4] + +* [Our latest Linux articles][5] + +In the **PROMPTING** section of **man bash**, you can find a description of all the special characters in **PS1** and **PS2**. The following are the default options: + +* **\u**: Username + +* **\h**: Short hostname + +* **\W**: Basename of the current working directory (**~** for home, the end of the current directory elsewhere) + +* **\s**: Shell name (**bash** or **sh**, depending on how the shell is called) + +* **\v**: The shell's version + +### What other special strings can I use in the prompts? + +There are a number of special strings that can be useful. + +* **\d**: Expands to the date in the format "Tue Jun 27" + +* **\D{fmt}**: Allows custom date formats—see **man strftime** for the available options + +* **\D{%c}**: Gives the date and time in the current locale + +* **\n**: Include a new line (see multi-line prompts below) + +* **\w**: The full path of the current working directory + +* **\H**: The full hostname for the current machine + +* **\!**: History number—you can run any previous command with its history number by using the shell history event designator **!** followed by the number for the specific command you are interested in. (Using Linux history is yet another tutorial...) + +There are many other special characters—you can see the full list in the **PROMPTING**section of the **Bash man page**. + +### Multi-line prompts + +If you use longer prompts (say if you include **\H** or **\w** or a full **date-time**), you may want to break things over two lines. Here is an example of a multi-line prompt, with the date, time, and current working directory on one line, and **username @hostname** on the second line: + +``` +PS1="\D{%c} \w\n[\u@\H]$ " +``` + +### Are there any other interesting things I can do? + +One thing people occasionally do is create colorful prompts. While I find them annoying and distracting, you may like them. For example, to change the date-time above to display in red text, the directory in cyan, and your username on a yellow background, you could try this: + +``` +PS1="\[\e[31m\]\D{%c}\[\e[0m\] +    \[\e[36m\]\w\[\e[0m\]\n[\[\e[1;43m\]\u\[\e[0m\]@\H]$ " +``` + +To dissect this: + +* **\[..\]** declares some non-printed characters + +* **\e[..** is an escape character. What follows is a special escape sequence to change the color (or other characteristic) in the terminal + +* **31m** is red text (**41m** would be a red background) + +* **36m** is cyan text + +* **1;43m** declares a yellow background (**1;33m** would be yellow text) + +* **\[\e[0m\]** at the end resets the colors to the terminal defaults + +You can find more colors and tips in the [Bash prompt HOWTO][11]. You can even make text inverted or blinking! Why on earth anyone would want to do this, I don't know. But you can! + +What are your favorite Bash prompt customizations? And which ones have you seen that drive you crazy? Let me know in the comments. + +-------------------------------------------------------------------------------- + +作者简介: + +Dave Neary - Dave Neary is a member of the Open Source and Standards team at Red Hat, helping make Open Source projects important to Red Hat be successful. Dave has been around the free and open source software world, wearing many different hats, since sending his first patch to the GIMP in 1999. + +via: https://opensource.com/article/17/7/bash-prompt-tips-and-tricks + +作者:[Dave Neary ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/dneary +[1]:https://opensource.com/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[6]:https://opensource.com/article/17/7/bash-prompt-tips-and-tricks?rate=7o5TkSbm_tDUEANDpxTZJU3LgEg0EK-j4xPuNL79m3M +[7]:https://opensource.com/user/16681/feed +[8]:https://www.flickr.com/photos/15587432@N02/3281139507/ +[9]:https://opensource.com/users/jason-baker +[10]:https://creativecommons.org/licenses/by/2.0/ +[11]:http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html +[12]:https://opensource.com/users/dneary +[13]:https://opensource.com/users/dneary +[14]:https://opensource.com/article/17/7/bash-prompt-tips-and-tricks#comments From 967034575a701d4d70e475c0540fed788d0ffa8b Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 16:49:21 +0800 Subject: [PATCH 0703/1407] =?UTF-8?q?20170716-14=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ing required Node-RED on a Raspberry Pi.md | 103 ++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 sources/tech/20170705 No coding required Node-RED on a Raspberry Pi.md diff --git a/sources/tech/20170705 No coding required Node-RED on a Raspberry Pi.md b/sources/tech/20170705 No coding required Node-RED on a Raspberry Pi.md new file mode 100644 index 0000000000..bad66b2cbc --- /dev/null +++ b/sources/tech/20170705 No coding required Node-RED on a Raspberry Pi.md @@ -0,0 +1,103 @@ +No coding required: Node-RED on a Raspberry Pi +============================================================ + +### Check out this tutorial to see how easy it is to set up hardware flows with Node-RED's drag-and-drop interface. + + +![No coding required: Node-RED on a Raspberry Pi](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/hardware_hammer_sign.jpg?itok=vh76LBib "No coding required: Node-RED on a Raspberry Pi") +Image by :  + +Thomas Hawk on [Flickr][12]. [CC BY-NC 2.0][13]. Modified by Opensource.com + +Node-RED is a programming tool that lets you quickly connect hardware devices using a browser-based editor. It comes with a wide range of nodes that can be used to build flows in a drag-and-drop manner, significantly reducing your development time. [Node-RED][14] is installed with Raspian Jessie for Raspberry Pi, and there is also an option to download Node-RED separately. + +More on Raspberry Pi + +* [Our latest on Raspberry Pi][1] + +* [What is Raspberry Pi?][2] + +* [Getting started with Raspberry Pi][3] + +* [Send us your Raspberry Pi projects and tutorials][4] + +To show you how it works, we'll build a simple tool using Node-RED to communicate with a cellular modem connected to a Raspberry Pi. With cellular modems, you can send/receive data from your Raspberry Pi over a cellular network. You can use one of the 3G/4G USB dongles commonly available through cellular network providers, or you can connect a development board with a 3G or 4G wireless modem. + +Whether you're connecting with a USB dongle or a development board, the connection interface to the Raspberry Pi is through a USB port. In this tutorial, I'm connecting a [SIM900][15] development board to Raspberry Pi through a USB-to-serial converter cable. + +### [node_red1.png][5] + +![Connecting SIM900 to Raspberry Pi through a USB-to-serial converter cable](https://opensource.com/sites/default/files/u128651/node_red1.png "Connecting SIM900 to Raspberry Pi through a USB-to-serial converter cable") + +The first step is to check that the SIM900 development board is connected to the Raspberry Pi. + +### [node_red2a.png][6] + +![Checking that the SIM900 development board is connected](https://opensource.com/sites/default/files/u128651/node_red2a.png "Checking that the SIM900 development board is connected") + +The USB-to-serial adapter shows up here as one of the USB devices connected to the Raspberry Pi. + +Next, check the USB port number the SIM900 board is connected to. + +### [node_red3a.png][7] + +![Checking the SIM900 board's USB port number](https://opensource.com/sites/default/files/u128651/node_red3a.png "Checking the SIM900 board's USB port number") + +In the last line above, you can see that the SIM900 board (connected through the USB-to-serial converter) is connected to **ttyUSB0** on the Raspberry Pi. Now we're ready to start using Node-RED. + +Launch Node-RED on the Raspberry Pi. + +### [node_red4a.png][8] + +![​​​​Launching Node-RED in Raspberry Pi](https://opensource.com/sites/default/files/u128651/node_red4a.png "​​​​Launching Node-RED in Raspberry Pi") + +Download this [sample flow][16] and import it into Node-RED. Note that the flow file is a JSON representation of the graphical UI. + +The imported flow should look like this in Node-RED: + +### [node_red5.png][9] + +![The imported flow in Node-RED](https://opensource.com/sites/default/files/u128651/node_red5.png "The imported flow in Node-RED") + +Injection nodes set up [AT commands][17] required to query the modem. The **Add Newline**function node appends **\r\n** to the AT commands passed from the injection nodes. Output from **Add Newline** is then wired to the **Serial Out** node, which writes data to the serial port. The AT command response from the modem is read through the **Serial In** node, which outputs the response to the **Debug **window. Make sure the serial port number and port speed are configured in both the **Serial In** and **Serial Out** nodes. + +Node-RED is an easy-to-use programming tool that can be used to quickly integrate and test hardware devices. As you can see from this tutorial, connecting and testing a cellular mode with Raspberry Pi using Node-RED required no coding at all. + +For more information about Node-RED and other ways it can be used, visit [the project's website][18]. + +-------------------------------------------------------------------------------- + +作者简介: + +Surya G - My interest is in software development for IOT projects especially those that uses cellular modems. + + +via: https://opensource.com/article/17/7/nodered-raspberrypi-hardware + +作者:[ Surya G ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/gssm2m +[1]:https://opensource.com/tags/raspberry-pi?src=raspberry_pi_resource_menu1 +[2]:https://opensource.com/resources/what-raspberry-pi?src=raspberry_pi_resource_menu2 +[3]:https://opensource.com/article/16/12/getting-started-raspberry-pi?src=raspberry_pi_resource_menu3 +[4]:https://opensource.com/article/17/2/raspberry-pi-submit-your-article?src=raspberry_pi_resource_menu4 +[5]:https://opensource.com/file/359036 +[6]:https://opensource.com/file/359086 +[7]:https://opensource.com/file/359091 +[8]:https://opensource.com/file/359716 +[9]:https://opensource.com/file/359056 +[10]:https://opensource.com/article/17/7/nodered-raspberrypi-hardware?rate=NjMvod1gAOI2Tf9t0YLr-4tbe_K1XWfHWNjVkTkPuzU +[11]:https://opensource.com/user/137861/feed +[12]:https://www.flickr.com/photos/thomashawk/3048157616/in/photolist-5DmB4E-BzrZ4-5aUXCN-nvBWYa-qbkwAq-fEFeDm-fuZxgC-dufA8D-oi8Npd-b6FiBp-7ChGA3-aSn7xK-7NXMyh-a9bQQr-5NG9W7-agCY7E-4QD9zm-7HLTtj-4uCiHy-bYUUtG +[13]:https://creativecommons.org/licenses/by-nc/2.0/ +[14]:https://nodered.org/ +[15]:http://m2msupport.net/m2msupport/simcom-sim900-gprs-2g-module/ +[16]:http://m2msupport.net/m2msupport/wp-content/themes/admired/Node-RED/modem_commands +[17]:http://m2msupport.net/m2msupport/software-and-at-commands-for-m2m-modules/ +[18]:https://nodered.org/ +[19]:https://opensource.com/users/gssm2m +[20]:https://opensource.com/users/gssm2m From ed5ff9a0e7536b183250a8df361053a79de98d33 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 16:51:37 +0800 Subject: [PATCH 0704/1407] =?UTF-8?q?20170716-15=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70705 Two great uses for the cp command.md | 205 ++++++++++++++++++ 1 file changed, 205 insertions(+) create mode 100644 sources/tech/20170705 Two great uses for the cp command.md diff --git a/sources/tech/20170705 Two great uses for the cp command.md b/sources/tech/20170705 Two great uses for the cp command.md new file mode 100644 index 0000000000..ade899d29b --- /dev/null +++ b/sources/tech/20170705 Two great uses for the cp command.md @@ -0,0 +1,205 @@ +Two great uses for the cp command +============================================================ + +### Linux's copy command makes quick work of making specialized backups. + + +![Two great uses for the cp command](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/car-penguin-drive-linux-yellow.png?itok=ueZE5mph "Two great uses for the cp command") +Image by :  + +Internet Archive [Book][10] [Images][11]. Modified by Opensource.com. CC BY-SA 4.0 + +The point-and-click graphical user interface available on Linux is a wonderful thing... but if your favorite interactive development environment consists of the terminal window, Bash, Vim, and your favorite language compiler, then, like me, you use the terminal  _a lot_ . + +But even people who generally avoid the terminal can benefit by being more aware of the riches that its environment offers. A case in point – the **cp** command. [According to Wikipedia][12], the **cp** (or copy) command was part of Version 1 of [Unix][13]. Along with a select group of other commands—**ls**, **mv**, **cd**, **pwd**, **mkdir**, **vi**, **sh**, **sed**, and **awk** come to mind—**cp** was one of my first few steps in System V Unix back in 1984\. The most common use of **cp** is to make a copy of a file, as in: + +``` +cp sourcefile destfile +``` + +More Linux resources + +* [What is Linux?][1] + +* [What are Linux containers?][2] + +* [Download Now: Linux commands cheat sheet][3] + +* [Advanced Linux commands cheat sheet][4] + +* [Our latest Linux articles][5] + +issued at the command prompt in a terminal session. The above command copies the file named **sourcefile** to the file named **destfile**. If **destfile** doesn't exist before the command is issued, it's created; if it does exist, it's overwritten. + +I don't know how many times I've used this command (maybe I don't want to know), but I do know that I often use it when I'm writing and testing code and I have a working version of something that I want to retain as-is before I move on. So, I have probably typed something like this: + +``` +cp test1.py test1.bak +``` + +at a command prompt at least a zillion times over the past 30+ years. Alternatively, I might have decided to move on to version 2 of my test program, in which case I may have typed: + +``` +cp test1.py test2.py +``` + +to accomplish the first step of that move. + +This is such a common and simple thing to do that I have rarely ever looked at the reference documentation for **cp**. But, while backing up my Pictures folder (using the Files application in my GUI environment), I started thinking, "I wonder if there is an option to have **cp** copy over only new files or those that have changed?" And sure enough, there is! + +### Great use #1: Updating a second copy of a folder + +Let's say I have a folder on my computer that contains a collection of files. Furthermore, let's say that from time to time I put a new file into that collection. Finally, let's say that from time to time I might edit one of those files in some way. An example of such a collection might be the photos I download from my cellphone or my music files. + +Assuming that this collection of files has some enduring value to me, I might occasionally want to make a copy of it—a kind of "snapshot" of it—to preserve it on some other media. Of course, there are many utility programs that exist for doing backups, but maybe I want to have this exact structure duplicated on a removable device that I generally store offline or even connect to another computer. + +The **cp** command offers a dead-easy way to do this. Here's an example. + +In my **Pictures** folder, I have a sub-folder called **Misc**. For illustrative purposes, I'm going to make a copy of it on a USB memory stick. Here we go! + +``` +me@desktop:~/Pictures$ cp -r Misc /media/clh/4388-D5FE +me@desktop:~/Pictures$ +``` + +The above lines are copied as-is from my terminal window. For those who might not be fully comfortable with that environment, it's worth noting that **me @mydesktop:~/Pictures$** is the command prompt provided by the terminal before every command is entered and executed. It identifies the user (**me**), the computer (**mydesktop**), and the current working directory, in this case, **~/Pictures**, which is shorthand for **/home/me/Pictures**, that is, the **Pictures** folder in my home directory. + +The command I've entered and executed, **cp -r Misc /media/clh/4388-D5FE**, copies the folder **Misc** and all its contents (the **-r**, or "recursive," option indicates the contents as well as the folder or file itself) into the folder **/media/clh/4388-D5FE**, which is where my USB stick is mounted. + +Executing the command returned me to the original prompt. Like with most commands inherited from Unix, if the command executes without detecting any kind of anomalous result, it won't print out a message like "execution succeeded" before terminating. People who would like more feedback can use the **-v** option to make execution "verbose." + +Below is an image of my new copy of **Misc** on the USB drive. There are nine JPEG files in the directory. + +### [cp1_file_structure.png][6] + +![Image of the new copy of Misc on the USB drive](https://opensource.com/sites/default/files/u128651/cp1_file_structure.png "Image of the new copy of Misc on the USB drive") + +Suppose I add a few new files to the master copy of the directory **~/Pictures/Misc**, so now it looks like this: + +### [cp2_new_files.png][7] + +![New files added to the master directory](https://opensource.com/sites/default/files/u128651/cp2_new_files.png "New files added to the master directory") + +Now I want to copy over only the new files to my memory stick. For this I'll use the "update" and "verbose" options to **cp**: + +``` +me@desktop:~/Pictures$ cp -r -u -v Misc /media/clh/4388-D5FE +'Misc/asunder.png' -> '/media/clh/4388-D5FE/Misc/asunder.png' +'Misc/editing tags guayadeque.png' -> '/media/clh/4388-D5FE/Misc/editing tags guayadeque.png' +'Misc/misc on usb.png' -> '/media/clh/4388-D5FE/Misc/misc on usb.png' +me@desktop:~/Pictures$ +``` + +The first line above shows the **cp** command and its options (**-r** for "recursive", **-u** for "update," and **-v** for "verbose"). The next three lines show the files that are copied across. The last line shows the command prompt again. + +Generally speaking, options such as **-r** can also be given in a more verbose fashion, such as **--recursive**. In brief form, they can also be combined, such as **-ruv**. + +### Great use #2 – Making versioned backups + +Returning to my initial example of making periodic backups of working versions of code in development, another really useful **cp** option I discovered while learning about update is backup. + +Suppose I'm setting out to write a really useful Python program. Being a fan of iterative development, I might do so by getting a simple version of the program working first, then successively adding more functionality to it until it does the job. Let's say my first version just prints the string "hello world" using the Python print command. This is a one-line program that looks like this: + +``` +print 'hello world' +``` + +and I've put that string in the file **test1.py**. I can run it from the command line as follows: + +``` +me@desktop:~/Test$ python test1.py +hello world +me@desktop:~/Test$ +``` + +Now that the program is working, I want to make a backup of it before adding the next component. I decide to use the backup option with numbering, as follows: + +``` +clh@vancouver:~/Test$ cp --force --backup=numbered test1.py test1.py +clh@vancouver:~/Test$ ls +test1.py  test1.py.~1~ +clh@vancouver:~/Test$ +``` + +So, what does this all mean? + +First, the **--backup=numbered** option says, "I want to do a backup, and I want successive backups to be numbered." So the first backup will be number 1, the second 2, and so on. + +Second, note that the source file and destination file are the same. Normally, if we try to use the **cp** command to copy a file onto itself, we will receive a message like: + +``` +cp: 'test1.py' and 'test1.py' are the same file +``` + +In the special case where we are doing a backup and we want the same source and destination, we use the **--force** option. + +Third, I used the **ls** (or "list") command to show that we now have a file called **test1.py**, which is the original, and another called **test1.py.~1~**, which is the backup file. + +Suppose now that the second bit of functionality I want to add to the program is another print statement that prints the string "Kilroy was here." Now the program in file **test1.py**looks like this: + +``` +print 'hello world' +print 'Kilroy was here' +``` + +See how simple Python programming is? Anyway, if I again execute the backup step, here's what happens: + +``` +clh@vancouver:~/Test$ cp --force --backup=numbered test1.py test1.py +clh@vancouver:~/Test$ ls +test1.py test1.py.~1~ test1.py.~2~ +clh@vancouver:~/Test$ +``` + +Now we have two backup files: **test1.py.~1~**, which contains the original one-line program, and **test1.py.~2~**, which contains the two-line program, and I can move on to adding and testing some more functionality. + +This is such a useful thing to me that I am considering making a shell function to make it simpler. + +### Three points to wrap this up + +First, the Linux manual pages, installed by default on most desktop and server distros, provide details and occasionally useful examples of commands like **cp**. At the terminal, enter the command: + +``` +man cp +``` + +Such explanations can be dense and obscure to users just trying to learn how to use a command in the first place. For those inclined to persevere nevertheless, I suggest creating a test directory and files and trying the command and options out there. + +Second, if a tutorial is of greater interest, the search string "linux shell tutorial" typed into your favorite search engine brings up a lot of interesting and useful resources. + +Third, if you're wondering, "Why bother when the GUI typically offers the same functionality with point-and-click ease?" I have two responses. The first is that "point-and-click" isn't always that easy, especially when it disrupts another workflow and requires a lot of points and a lot of clicks to make it work. The second is that repetitive tasks can often be easily streamlined through the use of shell scripts, shell functions, and shell aliases. + +Are you using the **cp** command in new or interesting ways? Let us know about them in the comments. + +-------------------------------------------------------------------------------- + +作者简介: + +Chris Hermansen - Engaged in computing since graduating from the University of British Columbia in 1978, I have been a full-time Linux user since 2005 and a full-time Solaris, SunOS and UNIX System V user before that. On the technical side of things, I have spent a great deal of my career doing data analysis; especially spatial data analysis. I have a substantial amount of programming experience in relation to data analysis, using awk, Python, PostgreSQL, PostGIS and lately Groovy. + + +via: https://opensource.com/article/17/7/two-great-uses-cp-command + +作者:[ Chris Hermansen ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/clhermansen +[1]:https://opensource.com/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[6]:https://opensource.com/file/360601 +[7]:https://opensource.com/file/360606 +[8]:https://opensource.com/article/17/7/two-great-uses-cp-command?rate=87TiE9faHZRes_f4Gj3yQZXhZ-x7XovYhnhjrk3SdiM +[9]:https://opensource.com/user/37806/feed +[10]:https://www.flickr.com/photos/internetarchivebookimages/14746482994/in/photolist-ot6zCN-odgbDq-orm48o-otifuv-otdyWa-ouDjnZ-otGT2L-odYVqY-otmff7-otGamG-otnmSg-rxnhoq-orTmKf-otUn6k-otBg1e-Gm6FEf-x4Fh64-otUcGR-wcXsxg-tLTN9R-otrWYV-otnyUE-iaaBKz-ovcPPi-ovokCg-ov4pwM-x8Tdf1-hT5mYr-otb75b-8Zk6XR-vtefQ7-vtehjQ-xhhN9r-vdXhWm-xFBgtQ-vdXdJU-vvTH6R-uyG5rH-vuZChC-xhhGii-vvU5Uv-vvTNpB-vvxqsV-xyN2Ai-vdXcFw-vdXuNC-wBMhes-xxYmxu-vdXxwS-vvU8Zt +[11]:https://www.flickr.com/photos/internetarchivebookimages/14774719031/in/photolist-ovAie2-otPK99-xtDX7p-tmxqWf-ow3i43-odd68o-xUPaxW-yHCtWi-wZVsrD-DExW5g-BrzB7b-CmMpC9-oy4hyF-x3UDWA-ow1m4A-x1ij7w-tBdz9a-tQMoRm-wn3tdw-oegTJz-owgrs2-rtpeX1-vNN6g9-owemNT-x3o3pX-wiJyEs-CGCC4W-owg22q-oeT71w-w6PRMn-Ds8gyR-x2Aodm-owoJQm-owtGp9-qVxppC-xM3Gw7-owgV5J-ou9WEs-wihHtF-CRmosE-uk9vB3-wiKdW6-oeGKq3-oeFS4f-x5AZtd-w6PNuv-xgkofr-wZx1gJ-EaYPED-oxCbFP +[12]:https://en.wikipedia.org/wiki/Cp_(Unix) +[13]:https://en.wikipedia.org/wiki/Unix +[14]:https://opensource.com/users/clhermansen +[15]:https://opensource.com/users/clhermansen +[16]:https://opensource.com/article/17/7/two-great-uses-cp-command#comments From 0b3deee0891da02a41efe203e900e888d3c90af9 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 16:53:27 +0800 Subject: [PATCH 0705/1407] =?UTF-8?q?20170716-16=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... problem with software before standards.md | 134 ++++++++++++++++++ 1 file changed, 134 insertions(+) create mode 100644 sources/talk/20170704 The problem with software before standards.md diff --git a/sources/talk/20170704 The problem with software before standards.md b/sources/talk/20170704 The problem with software before standards.md new file mode 100644 index 0000000000..8ba151d9d8 --- /dev/null +++ b/sources/talk/20170704 The problem with software before standards.md @@ -0,0 +1,134 @@ +The problem with software before standards +============================================================ + +### Open source projects need to get serious about including standards in their deliverables. + + +![The problem with software before standards](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/suitcase_container_bag.png?itok=eiZigBYU "The problem with software before standards") +Image by :  + +opensource.com + +By any measure, the rise of open source software as an alternative to the old, proprietary ways has been remarkable. Today, there are tens of millions of libraries hosted at GitHub alone, and the number of major projects is growing rapidly. As of this writing, the [Apache Software Foundation][4] hosts over [300 projects][5], while the [Linux Foundation][6] supports over 60. Meanwhile, the more narrowly focused [OpenStack Foundation][7] boasts 60,000 members living in more than 180 countries. + +So, what could possibly be wrong with this picture? + +What's missing is enough awareness that, while open source software can meet the great majority of user demands, standing alone it can't meet all of them. Worse yet, too many members of the open source community (business leads as well as developers) have no interest in making use of the most appropriate tools available to close the gap. + +Let's start by identifying the problem that needs to be solved, and then see how that problem used to be solved in the past. + +The problem is that there are often many projects trying to solve the same small piece of a larger problem. Customers want to be able to have a choice among competing products and to easily switch among products if they're not satisfied. That's not possible right now, and until this problem is solved, it will hold back open source adoption. + +It's also not a new problem or a problem without traditional solutions. Over the course of a century and a half, user expectations of broad choice and freedom to switch vendors were satisfied through the development of standards. In the physical world, you can choose between myriad vendors of screws, light bulbs, tires, extension cords, and even of the proper shape wine glass for the pour of your choice, because standards provide the physical specifications for each of these goods. In the world of health and safety, our well-being relies on thousands of standards developed by the private sector that ensure proper results while maximizing competition. + +When information and communications technology (ICT) came along, the same approach was taken with the formation of major organizations such as the International Telecommunication Union (ITU), International Electrotechnical Commission (IEC), and the Standards Association of the Institute of Electrical and Electronics Engineers (IEEE-SA). Close to 1,000 consortia followed to develop, promote, or test compliance with ICT standards. + +While not all ICT standards resulted in seamless interoperability, the technology world we live in today exists courtesy of the tens of thousands of essential standards that fulfill that promise, as implemented in computers, mobile devices, Wi-Fi routers, and indeed everything else that runs on electricity. + +The point here is that, over a very long time, a system evolved that could meet customers' desires to have broad product offerings, avoid vendor lock-in, and enjoy services on a global basis. + +Now let's look at how open software is evolving. + +The good news is that great software is being created. The bad news is that in many key areas, like cloud computing and network virtualization, no single foundation is developing the entire stack. Instead, discrete projects develop individual layers, or parts of layers, and then rely on real-time, goodwill-based collaboration up and down the stack among peer projects. When this process works well, the results are good but have the potential to create lock-in the same way that traditional, proprietary products could. When the process works badly, it can result in much wasted time and effort for vendors and community members, as well as disappointed customer expectations. + +The clear way to provide a solution is to create standards that allow customers to avoid lock-in, along with encouraging the availability of multiple solutions competing through value-added features and services. But, with rare exceptions, that's not what's happening in the world of open source. + +The main reason behind this is the prevailing opinion in the open source community is that standards are limiting, irrelevant, and unnecessary. Within a single, well-integrated stack, that may be the case. But for customers that want freedom of choice and ongoing, robust competition, the result could be a return to the bad old days of being locked into a technology, albeit with multiple vendors offering similarly integrated stacks. + +A good description of the problem can be found in a June 14, 2017, article written by Yaron Haviv, "[We'll Be Enslaved to Proprietary Clouds Unless We Collaborate][8]": + +> _Cross-project integration is not exactly prevalent in today's open source ecosystem, and it's a problem. Open source projects that enable large-scale collaboration and are built on a layered and modular architecture—such as Linux_ — _have proven their success time and again. But the Linux ideology stands in stark contrast to the general state of much of today's open source community._ +> +> _Case in point: big data ecosystems, where numerous overlapping implementations rarely share components or use common APIs and layers. They also tend to lack standard wire protocols, and each processing framework (think Spark, Presto, and Flink) has its own data source API._ +> +> _This lack of collaboration is causing angst. Without it, projects are not interchangeable, resulting in negative repercussions for customers by essentially locking them in and slowing down the evolution of projects because each one has to start from scratch and re-invent the wheel._ + +Haviv proposes two ways to resolve the situation: + +* Closer collaboration among projects, leading to consolidation, the elimination of overlaps between multiple projects, and tighter integration within a stack; + +* The development of APIs to make switching easier. + +Both these approaches make sense. But unless something changes, we'll see only the first, and that's where the prospect for lock-in is found. The result would be where the industry found itself in the WinTel world of the past or throughout Apple's history, where competing product choice is sacrificed in exchange for tight integration. + +The same thing can, and likely will, happen in the new open source world if open source projects continue to ignore the need for standards so that competition can exist within layers, and even between stacks. Where things stand today, there's almost no chance of that happening. + +The reason is that while some projects pay lip service to develop software first and standards later, there is no real interest in following through with the standards. The main reason is that most business people and developers don't know much about standards. Unfortunately, that's all too understandable and likely to get worse. The reasons are several: + +* Universities dedicate almost no training time to standards; + +* Companies that used to have staffs of standards professionals have disbanded those departments and now deploy engineers with far less training to participate in standards organizations; + +* There is little career value in establishing expertise in representing an employer in standards work; + +* Engineers participating in standards activities may be required to further the strategic interests of their employer at the cost of what they believe to be the best technical solution; + +* There is little to no communication between open source developers and standards professionals within many companies; + +* Many software engineers view standards as being in direct conflict with the "four freedoms" underlying the FOSS definition. + +Now let's look at what's going on in the world of open source: + +* It would be difficult for any software engineer today to not know about open source; + +* It's a tool engineers are comfortable with and often use on a daily basis; + +* Much of the sexiest, most cutting-edge work is being done in open source projects; + +* Developers with expertise in hot open source areas are much sought after and command substantial compensation premiums; + +* Developers enjoy unprecedented autonomy in developing software within well-respected projects; + +* Virtually all of the major ICT companies participate in multiple open source projects, often with a combined cost (dues plus dedicated employees) of over $1 million per year per company at the highest membership level. + +When viewed in a vacuum, this comparison would seem to indicate that standards are headed for the ash heap of history in ICT. But the reality is more nuanced. It also ignores the reality that open source development can be a more delicate flower than many might assume. The reasons include the following: + +* Major supporters of projects can decommit (and sometimes have done so), leading to the failure of a project; + +* Personality and cultural conflicts within communities can lead to disruptions; + +* The ability of key projects to more tightly integrate remains to be seen; + +* Proprietary game playing has sometimes undercut, and in some cases caused the failure of, highly funded open source projects; + +* Over time, individual companies may decide that their open source strategies have failed to bring the rewards they anticipated; + +* A few well-publicized failures of key open source projects could lead vendors to back off from investing in new projects and persuade customers to be wary of committing to open source solutions. + +Curiously enough, the collaborative entities that are addressing these issues most aggressively are standards organizations, in part because they feel (rightly) threatened by the rise of open source collaboration. Their responses include upgrading their intellectual property rights policies to allow all types of collaboration to occur under the same umbrella, including development of open source tools, inclusion of open source code in standards, and development of open source reference implementations of standards, among other types of work projects. + +The result is that standards organizations are retooling themselves to provide an approach-neutral venue for the development of complete solutions. Those solutions can incorporate whatever type of collaborative work product, or hybrid work product, the marketplace may need. As this process continues, it is likely that vendors will begin to pursue some initiatives within standards organizations that might otherwise have made their way to open source foundations. + +For all these reasons, it's crucial that open source projects get serious about including standards in their deliverables or otherwise partner with appropriate standards-developers to jointly provide complete solutions. The result will not only be greater product choice and less customer lock-in, but far greater confidence by customers in open source solutions, and therefore far greater demand for and use of open source products and services. + +If that doesn't happen it will be a great shame, because the open source cause has the most to lose. It's up to the projects now to decide whether to give the market what it wants and needs or reconcile themselves to a future of decreasing influence, rather than continuing success. + + _This was originally published on ConsortiumInfo.org's [Standards Blog][2] and is republished with permission._ + +-------------------------------------------------------------------------------- + +作者简介: + +Andy Updegrove - Andy helps CEOs, management teams, and their investors build successful organizations. Regionally, he’s been a pioneer in providing business-minded legal counsel and strategic advice to high-tech companies since 1979. On the global stage, he’s represented, and usually helped launch, more than 135 worldwide standard setting, open source, promotional and advocacy consortia, including some of the largest and most influential standard setting organizations in the world. + + +via: https://opensource.com/article/17/7/software-standards + +作者:[ Andy Updegrove][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/andrewupdegrove +[1]:https://opensource.com/article/17/7/software-standards?rate=kKK6oD-vGSEdDMj7OHpBMSqASMqbz3ii94q1Kj12lCI +[2]:http://www.consortiuminfo.org/standardsblog/article.php?story=20170616133415179 +[3]:https://opensource.com/user/16796/feed +[4]:https://www.apache.org/ +[5]:https://projects.apache.org/ +[6]:https://www.linuxfoundation.org/ +[7]:https://www.linuxfoundation.org/projects/directory +[8]:https://www.enterprisetech.com/2017/06/14/well-enslaved-proprietary-clouds-unless-collaborate/ +[9]:https://opensource.com/users/andrewupdegrove +[10]:https://opensource.com/users/andrewupdegrove +[11]:https://opensource.com/article/17/7/software-standards#comments From 71ad535a7ba84963ad0ff84b5c4e9afdd2a62692 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 16:55:18 +0800 Subject: [PATCH 0706/1407] =?UTF-8?q?20170716-17=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...beer with Linux python and raspberry pi.md | 192 ++++++++++++++++++ 1 file changed, 192 insertions(+) create mode 100644 sources/tech/20170703 Brewing beer with Linux python and raspberry pi.md diff --git a/sources/tech/20170703 Brewing beer with Linux python and raspberry pi.md b/sources/tech/20170703 Brewing beer with Linux python and raspberry pi.md new file mode 100644 index 0000000000..bea84931c7 --- /dev/null +++ b/sources/tech/20170703 Brewing beer with Linux python and raspberry pi.md @@ -0,0 +1,192 @@ +Brewing beer with Linux, Python, and Raspberry Pi +============================================================ + +### A handy how-to for building a homemade homebrew setup with Python and the Raspberry Pi. + + +![Brewing beer with Linux, Python, and Raspberry Pi](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/beer-drink-sample-sampler.png?itok=20jJLB8V "Brewing beer with Linux, Python, and Raspberry Pi") +Image by :  + +[Quinn Dombrowski][21]. Modified by Opensource.com. [CC BY-SA 4.0][22]. + +I started brewing my own beer more than 10 years ago. Like most homebrewers, I started in my kitchen making extract-based brews. This required the least equipment and still resulted in really tasty beer. Eventually I stepped up to all-grain brewing using a big cooler for my mash tun. For several years I was brewing 5 gallons at a time, but brewing 10 gallons takes the same amount of time and effort (and only requires slightly larger equipment), so a few years ago I stepped it up. After moving up to 10 gallons, I stumbled across [StrangeBrew Elsinore][23] and realized what I  _really_  needed to do was convert my whole system to be all-electric, and run it with a [Raspberry Pi][24]. + +There is a ton of great information available for building your own all-electric homebrew system, and most brewers start out at [TheElectricBrewery.com][25]. Just putting together the control panel can get pretty complicated, although the simplest approach is outlined well there. Of course you can also take [a less expensive approach][26] and still end up with the same result—a boil kettle and hot liquor tank powered by heating elements and managed by a PID controller. I think that's a little too boring though (and it also means you don't get neat graphs of your brew process). + +More on Raspberry Pi + +* [Our latest on Raspberry Pi][1] + +* [What is Raspberry Pi?][2] + +* [Getting started with Raspberry Pi][3] + +* [Send us your Raspberry Pi projects and tutorials][4] + +### Hardware supplies + +Before I talked myself out of the project, I decided to start buying parts. My basic design was a Hot Liquor Tank (HLT) and boil kettle with 5500w heating elements in them, plus a mash tun with a false bottom. I would use a pump to recirculate the mash through a 50' stainless coil in the HLT (a ["heat exchanger recirculating mash system", known as HERMS][27]). I would need a second pump to circulate the water in the HLT, and to help with transferring water to the mash tun. All of the electrical components would be controlled with a Raspberry Pi. + +Building my electric brew system and automating as much of it as possible meant I was going to need the following: + +* HLT with a 5500w electric heating element + +* HERMS coil (50' 1/2" stainless steel) in the HLT + +* boil kettle with a 5500w electric heating element + +* multiple solid-state relays to switch the heaters on and off + +* 2 high-temp food-grade pumps + +* relays for switching the pumps on and off + +* fittings and high-temp silicon tubing + +* stainless ball valves + +* 1-wire temperature probes + +* lots of wire + +* electrical box to hold everything + +### [aedo-f1.png][11] + +![Brew system](https://opensource.com/sites/default/files/aedo-f1.png "Brew system") + +Brew system (photo by Christopher Aedo. [CC BY-SA 4.0)][5] + +The details of building out the electrical side of the system are really well covered by [The Electric Brewery][28], so I won't repeat their detailed information. You can read through and follow their suggestions while planning to replace the PID controllers with a Raspberry Pi. + +One important thing to note is the solid-state relay (SSR) signal voltage. Many tutorials suggest using SSRs that need a 12-volt signal to close the circuit. The Raspberry Pi GPIO pins will only output 3v, however. Be sure to purchase relays that will trigger on 3 volts. + +### [aedo-f2.png][12] + +![Inkbird SSR](https://opensource.com/sites/default/files/aedo-f2.png "Inkbird SSR") + +Inkbird SSR (photo by Christopher Aedo. [CC BY-SA 4.0)][6] + +To run your brew system, your Pi must do two key things: sense temperature from a few different places, and turn relays on and off to control the heating elements. The Raspberry Pi easily is able to handle these tasks. + +There are a few different ways to connect temp sensors to a Pi, but I've found the most convenient approach is to use the [1-Wire bus][29]. This allows for multiple sensors to share the same wire (actually three wires), which makes it a convenient way to instrument multiple components in your brew system. If you look for waterproof DS18B20 temperature sensors online, you'll find lots of options available. I used [Hilitchi DS18B20 Waterproof Temperature Sensors][30] for my project. + +To control the heating elements, the Raspberry Pi includes several General Purpose IO (GPIO) pins that are software addressable. This allows you to send 3.3v to a relay by simply putting a **1** or a **0** in a file. The  _Raspberry Pi—Driving a Relay using GPIO_  tutorial was the most helpful for me when I was first learning how all this worked. The GPIO controls multiple solid-state relays, turning on and off the heating elements as directed by the brewing software. + +I first started working on the box to hold all the components. Because this would all be on a rolling cart, I wanted it to be relatively portable rather than permanently mounted. If I had a spot (for example, inside a garage, utility room, or basement), I would have used a larger electrical box mounted on the wall. Instead I found a decent-size [waterproof project box][31] that I expected I could shoehorn everything into. In the end, it turned out to be a little bit of a tight fit, but it worked out. In the bottom left corner is the Pi with a breakout board for connecting the GPIO to the 1-Wire temperature probes and the [solid state relays][32]. + +To keep the 240v SSRs cool, I cut holes in the case and stacked [copper shims][33] with CPU cooling grease between them and heat sinks mounted on the outside of the box. It worked out well and there haven't been any cooling issues inside the box. On the cover I put two switches for 120v outlets, plus two 240v LEDs to show which heating element was energized. I used dryer plugs and outlets for all connections so disconnecting a kettle from everything is easy. Everything worked right on the first try, too. (Sketching a wiring diagram first definitely pays off.) + +The pictures are from the "proof-of-concept" version—the final production system should have two more SSRs so that both legs of the 240v circuit would be switched. The other thing I would like to switch via software is the pumps. Right now they're controlled via physical switches on the front of the box, but they could easily be controlled with relays. + +### [aedo-f3.png][13] + +![Control box](https://opensource.com/sites/default/files/aedo-f3.png "Control box") + +Control box (photo by Christopher Aedo. [CC BY-SA 4.0)][7] + +The only other thing I needed that was a little tricky to find was a compression fitting for the temperature probes. The probes were mounted in T fittings before the valve on the lowest bulkhead in both the HLT and the mash tun. As long as the liquid is flowing past the temp sensor, it's going to be accurate. I thought about adding a thermowell into the kettles as well, but realized that's not going to be useful for me based on my brewing process. Anyway, I purchased [1/4" compression fittings][34] and they worked out perfectly. + +### Software + +Once the hardware was sorted out, I had time to play with the software. I ran the latest [Raspbian distribution][35] on the Pi; nothing special was required on the operating-system side. + +I started with [Strangebrew Elsinore][36] brewing software, which I had discovered when a friend asked whether I had heard of [Hosehead][37], a Raspberry Pi-based brewing controller. I thought Hosehead looked great, but rather than buying a brewing controller, I wanted the challenge of building my own. + +Setting up Strangebrew Elsinore was straightforward—the [documentation][38] was thorough and I did not encounter any problems. Even though Strangebrew Elsinore was working fine, Java seemed to be taxing my first-generation Pi sometimes, and it crashed on me more than once. I also was sad to see development stall and there did not seem to be a big community of additional contributors (although there were—and still are—plenty of people using it). + +### CraftBeerPi + +Then I stumbled across [CraftBeerPI][39], which is written in Python and supported by a development community of active contributors. The original author (and current maintainer) Manuel Fritsch is great about handling contributions and giving feedback on issues that folks open. Cloning [the repo][40] and getting started only took me a few minutes. The README also has a good example of connecting DS1820 temp sensors, along with notes on interfacing hardware to a Pi or a [C.H.I.P. computer][41]. + +On startup, CraftBeerPi walks users through a configuration process that discovers the temperature probes available and lets you specify which GPIO pins are managing which pieces of equipment. + +### [aedo-f4.png][14] + +![CraftBeerPi](https://opensource.com/sites/default/files/images/life/aedo-f4.png "CraftBeerPi") + +CraftBeerPi (photo by Christopher Aedo. [CC BY-SA 4.0)][8] + +Running a brew with this system is easy. I can count on it holding temperatures reliably, and I can input steps for a multi-temp step mash. Using CraftBeerPi has made my brew days a little bit boring, but I'm happy to trade off the "excitement" of traditional manually managed propane burners for the efficiency and consistency of this system. + +CraftBeerPI's user-friendliness inspired me to set up another controller to run a "fermentation chamber." In my case, that was a second-hand refrigerator I found for US$ 50 plus a $25 heater) on the inside. CraftBeerPI easily can control the cooling and heating elements, and you can set up multiple temperature steps. For instance, this graph shows the fermentation temperatures for a session IPA I made recently. The fermentation chamber held the fermenting wort at 67F for four days, then ramped up one degree every 12 hours until it was at 72F. That temp was held for a two-day diacetyl rest. After that it was set to drop down to 65F for five days, during which time I "dry hopped" the beer. Finally, the beer was cold-crashed down to 38F. CraftBeerPI made adding each step and letting the software manage the fermentation easy. + +### [aedo-f5.png][15] + +![SIPA fermentation profile](https://opensource.com/sites/default/files/aedo-f5.png "SIPA fermentation profile") + +SIPA fermentation profile (photo by Christopher Aedo. [CC BY-SA 4.0)][9] + +I have also been experimenting with the [TILT hydrometer][42] to monitor the gravity of the fermenting beer via a Bluetooth-connected floating sensor. There are integration plans for this to get it working with CraftBeerPI, but for now it logs the gravity to a Google spreadsheet. Once this hydrometer can talk to the fermentation controller, setting automated fermentation profiles that take action directly based on the yeast activity would be easy—rather than banking on primary fermentation completing in four days, you can set the temperature ramp to kick off after the gravity is stable for 24 hours. + +As with any project like this, imaging and planning improvements and additional components is easy. Still, I'm happy with where things stand today. I've brewed a lot of beer with this setup and am hitting the expected mash efficiency every time, and the beer has been consistently tasty. My most important customer—me!—is pleased with what I've been putting on tap in my kitchen. + +### [aedo-f6.png][16] + +![Homebrew on tap](https://opensource.com/sites/default/files/aedo-f6.png "Homebrew on tap") + +Homebrew on tap (photo by Christopher Aedo. [CC BY-SA 4.0)][10] + + _This article is based on Christopher's OpenWest talk, [Brewing Beer with Linux, Python and a RaspberryPi][18]. [OpenWest][19] will be held July 12-15, 2017 in Salt Lake City, Utah._ + +-------------------------------------------------------------------------------- + +作者简介: + +Christopher Aedo - Christopher Aedo has been working with and contributing to open source software since his college days. Most recently he can be found leading an amazing team of upstream developers at IBM who are also developer advocates. When he’s not at work or speaking at a conference, he’s probably using a RaspberryPi to brew and ferment a tasty homebrew in Portland OR. + + +via: https://opensource.com/article/17/7/brewing-beer-python-and-raspberry-pi + +作者:[ Christopher Aedo][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/docaedo +[1]:https://opensource.com/tags/raspberry-pi?src=raspberry_pi_resource_menu1 +[2]:https://opensource.com/resources/what-raspberry-pi?src=raspberry_pi_resource_menu2 +[3]:https://opensource.com/article/16/12/getting-started-raspberry-pi?src=raspberry_pi_resource_menu3 +[4]:https://opensource.com/article/17/2/raspberry-pi-submit-your-article?src=raspberry_pi_resource_menu4 +[5]:https://creativecommons.org/licenses/by-sa/4.0/ +[6]:https://creativecommons.org/licenses/by-sa/4.0/ +[7]:https://creativecommons.org/licenses/by-sa/4.0/ +[8]:https://creativecommons.org/licenses/by-sa/4.0/ +[9]:https://creativecommons.org/licenses/by-sa/4.0/ +[10]:https://creativecommons.org/licenses/by-sa/4.0/ +[11]:https://opensource.com/file/358661 +[12]:https://opensource.com/file/358666 +[13]:https://opensource.com/file/358676 +[14]:https://opensource.com/file/359061 +[15]:https://opensource.com/file/358681 +[16]:https://opensource.com/file/359071 +[17]:https://opensource.com/article/17/7/brewing-beer-python-and-raspberry-pi?rate=fbKzT1V9gqGsmNCTuQIashC1xaHT5P_2LUaeTn6Kz1Y +[18]:https://www.openwest.org/custom/description.php?id=139 +[19]:https://www.openwest.org/ +[20]:https://opensource.com/user/145976/feed +[21]:https://www.flickr.com/photos/quinndombrowski/ +[22]:https://creativecommons.org/licenses/by-sa/4.0/ +[23]:https://github.com/DougEdey/SB_Elsinore_Server +[24]:https://opensource.com/tags/raspberry-pi +[25]:http://www.theelectricbrewery.com/ +[26]:http://www.instructables.com/id/Electric-Brewery-Control-Panel-on-the-Cheap/ +[27]:https://byo.com/hops/item/1325-rims-and-herms-brewing-advanced-homebrewing +[28]:http://theelectricbrewery.com/ +[29]:https://en.wikipedia.org/wiki/1-Wire +[30]:https://smile.amazon.com/gp/product/B018KFX5X0/ +[31]:http://amzn.to/2hupFCr +[32]:http://amzn.to/2hL8JDS +[33]:http://amzn.to/2i4DYwy +[34]:https://www.brewershardware.com/CF1412.html +[35]:https://www.raspberrypi.org/downloads/raspbian/ +[36]:https://github.com/DougEdey/SB_Elsinore_Server +[37]:https://brewtronix.com/ +[38]:http://dougedey.github.io/SB_Elsinore_Server/ +[39]:http://www.craftbeerpi.com/ +[40]:https://github.com/manuel83/craftbeerpi +[41]:https://www.nextthing.co/pages/chip +[42]:https://tilthydrometer.com/ +[43]:https://opensource.com/users/docaedo +[44]:https://opensource.com/users/docaedo +[45]:https://opensource.com/article/17/7/brewing-beer-python-and-raspberry-pi#comments From b3de5820088c035b392b0e2e8ad767393ccf0e4e Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 17:00:07 +0800 Subject: [PATCH 0707/1407] =?UTF-8?q?20170716-18=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ou OpenStack 6 new guides and tutorials.md | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 sources/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md diff --git a/sources/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md b/sources/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md new file mode 100644 index 0000000000..9948fd1207 --- /dev/null +++ b/sources/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md @@ -0,0 +1,68 @@ +This is how you OpenStack: 6 new guides and tutorials +============================================================ + +### Want to learn more about the ins and outs of OpenStack? These free resources could be just what you need. + + +![OpenStack guides and tutorials](https://opensource.com/sites/default/files/styles/image-full-size/public/images/education/edu_rcos.png?itok=wLMIaigd "OpenStack guides and tutorials") +Image by :  + +opensource.com + +Cloud infrastructure is a hugely in-demand skill. And if you're looking for an open source solution for your cloud infrastructure needs, chances are [OpenStack][12] is in that mix. + +OpenStack is a huge collection of projects, providing solutions and integrations for nearly every part of the cloud stack. While this large scope makes it a powerful tool, it also means that it can be hard to keep up and learn about the full suite of projects, how to use them, how to customize them, and how to contribute code back to them. + +Fortunately, there are a lot of options to help you. In addition to the [official project documentation][13], printed books, and certification and training programs, there are also a ton of great community-created resources. Every month here on Opensource.com, we take a look for recently published guides and tutorials across blogs and other websites, and bring them to you in one place. Let's dive into what we found this time around. + +* First up in this month's batch, we have a guide from Antony Messerli on how to[ set up an OpenStack cloud][1] with Ansible. Messerli walks us through the configuration on his lab environment and the playbooks necessary to get OpenStack up and running on his cluster, as well as the basics of adding images, setting up the network, and more. It's a good read if you're considering Ansible to set up a small local OpenStack test environment. + +* Next, have you ever wondered how Neutron networking works in OpenStack? How does what's happening in the application correspond to the underlying code? Arie Bregman provides an OpenStack Neutron code deep dive in [this post][2]; you'll definitely want to be familiar with general networking principles and at least a little bit of the OpenStack code base in order to follow along. + +* Gerrit is the open source code review project used by OpenStack in order to manage incoming patches and allow for feedback and testing before merging changes into the main OpenStack code base. For those used to a different code review system (or none at all), Gerrit can be a little confusing to follow, though it has great dashboard features so you can see just the information that's important to you. Dougal Matthews walks us through his Gerrit dashboard setup in [this article][3], which might just help you create your own. + +* The [videos][4] from last month's OpenStack Summit in Boston have become available, and whether you were able to attend last month's event or not, they contain a treasure trove of topics both technical and non-technical. Not sure where to start? How about [this presentation][5] from Julio Villarreal Pelegrino on how to plan for, build, and operate a successful OpenStack cloud at scale. + +* Security should be at the top of concerns for any cloud administrator. But where do you get started? Naveen Joy posted a great [checklist][6] of ten security questions for locking down your OpenStack network; you can check it out in addition to the [video][7]from his talk on the same topic last month. + +* The internal messaging services in OpenStack are managed in a common library that lives inside of the Oslo project called, not surprisingly, Oslo.Messenging. Learn the basics of what this library is and what it offers in this [two][8] [part][9] blog post. + +* * * + +Want more? Be sure to check out our complete set of [OpenStack guides, howtos, and tutorials][14] from over three years of community-generated content to help you learn to be an effective OpenStack developer or administrator. + +Know of a great tutorial, guide, or how-to that we should have included? Share it in the comments below + +-------------------------------------------------------------------------------- + +作者简介: + +Jason Baker - Jason is passionate about using technology to make the world more open, from software development to bringing sunlight to local governments. Linux desktop enthusiast. Map/geospatial nerd. Raspberry Pi tinkerer. Data analysis and visualization geek. Occasional coder. Cloud nativist. Follow him on Twitter. + + +via: https://opensource.com/article/17/6/openstack-guides-and-tutorials + +作者:[ Jason Baker (Red Hat)][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/jason-baker +[1]:https://www.reversengineered.com/2016/05/09/setting-up-an-openstack-cloud-using-ansible/ +[2]:http://abregman.com/2017/05/29/openstack-neutron-service-code-deep-dive/ +[3]:http://www.dougalmatthews.com/2017/May/19/how-i-gerrit/ +[4]:https://www.openstack.org/videos/ +[5]:http://www.juliosblog.com/dont-fail-at-scale-how-to-plan-for-build-and-operate-a-successful-openstack-cloud-video-openstack-summit2017/ +[6]:https://blogs.cisco.com/cloud/securing-openstack-networking +[7]:https://www.openstack.org/videos/boston-2017/securing-openstack-networking +[8]:https://pigdogweb.wordpress.com/2017/05/22/intro-to-oslo-messaging/ +[9]:https://pigdogweb.wordpress.com/2017/06/02/oslo-messaging-the-cloud-is-calling/ +[10]:https://opensource.com/article/17/6/openstack-guides-and-tutorials?rate=tRBp5wgAE1d3YHJSwcHWnfgXyJlqJedMImQFqJiW-tE +[11]:https://opensource.com/user/19894/feed +[12]:https://opensource.com/resources/what-is-openstack +[13]:http://docs.openstack.org/ +[14]:https://opensource.com/resources/openstack-tutorials +[15]:https://opensource.com/users/jason-baker +[16]:https://opensource.com/users/jason-baker +[17]:https://opensource.com/article/17/6/openstack-guides-and-tutorials#comments From 876f881563dce43287cc5fd65013f6adc69d0193 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 17:03:43 +0800 Subject: [PATCH 0708/1407] =?UTF-8?q?20170716-19=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... RUNNING WITH ACTIVE PROCESSES ON LINUX.md | 146 ++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 sources/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md diff --git a/sources/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md b/sources/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md new file mode 100644 index 0000000000..c39d8e4176 --- /dev/null +++ b/sources/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md @@ -0,0 +1,146 @@ +HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX +============================================================ + +A quick guide for recovering deleted files which still have running processes on your Linux system using Terminal. + +In many cases, deleted files are applicable to recover even if the file has an active process and currently used by a single or multiple users. On Linux system every currently running process gets ID and it will be stated as a process identifier “PID” and all stacked up in /proc directory. This exactly what we need to recover deleted files which still running and it has a PID. So, here’s how we are going to do that. + +Let’s say you have opened a compressed file and later on you have deleted this file. For the demonstration purpose, the compressed file is called “opengapps.zip” that would be the file we will open and deleted afterward. + +### CALCULATE THE MD5 HASH OF THE ORIGINAL FILE + +We will calculate the MD5 for this file before deleting it. So, we could compare the original MD5 hash to the MD5 hash of the recovered file. This process will guarantee that the integrity of the compressed file we have recovered is the same and it’s not corrupted. + +``` +md5sum opengapps.zip >> md5-opengapps.txt +``` + +To display the content of the text file + +``` +cat md5-opengapps.txt +``` + +``` +Terminal Output +86489b68b40d144f0e00a0ea8407f7c0 opengapps.zip +``` + +After checking the MD5 hash for the compressed file. We will keep the compressed file opened and we will delete it. Afterward, we will start with the recovering process of that file with the following steps: + +``` +rm opengapps.zip +``` + +### THE RECOVERING PROCESS FOR A DELETED FILE + +As we have mentioned earlier the running processes are available in the /proc directory. We can search for that process we need inside that directory with the following command: + +Since we already know that the filename includes .zip file extension we could search using .zip extension. It will limit the output result and display the required process. + +``` +ps -axu | grep .zip +``` + +``` +Terminal Output +m 13119 0.8 1.0 121788 30788 ? Sl 06:17 0:00 file-roller /home/m/Downloads/Compressed/opengapps.zip +m 13164 0.0 0.0 5108 832 pts/20 S+ 06:18 0:00 grep --color=auto .zip +``` + +Then we will navigate to the directory which includes the process with PID **13119** and open /fd directory. + +``` +cd /proc/13119/fd +``` + +/fd (file descriptor) directory includes multiple files including the file we need to recover. That file is connected with a hard link to the original one we kept running in the background. All files inside /fd directory comes with numbers for the “file name”. So, to identify which one of these files is linked to the original one, we will list the /fd directory contents with long listing format option. + +``` +ls -l +``` + +``` +Terminal Output +total 0 +lr-x------ 1 m m 64 Jul 14 06:17 0 -> /dev/null +lrwx------ 1 m m 64 Jul 14 06:17 1 -> socket:[26161] +lrwx------ 1 m m 64 Jul 14 06:17 10 -> anon_inode:[eventfd] +lr-x------ 1 m m 64 Jul 14 06:17 11 -> anon_inode:inotify +lrwx------ 1 m m 64 Jul 14 06:17 12 -> socket:[5752671] +lr-x------ 1 m m 64 Jul 14 06:17 13 -> /home/m/Downloads/Compressed/opengapps.zip (deleted) +lrwx------ 1 m m 64 Jul 14 06:17 2 -> socket:[26161] +lrwx------ 1 m m 64 Jul 14 06:17 3 -> anon_inode:[eventfd] +lrwx------ 1 m m 64 Jul 14 06:17 4 -> anon_inode:[eventfd] +lrwx------ 1 m m 64 Jul 14 06:17 5 -> socket:[5751361] +lrwx------ 1 m m 64 Jul 14 06:17 6 -> anon_inode:[eventfd] +lrwx------ 1 m m 64 Jul 14 06:17 7 -> anon_inode:[eventfd] +lrwx------ 1 m m 64 Jul 14 06:17 8 -> socket:[5751363] +lrwx------ 1 m m 64 Jul 14 06:17 9 -> socket:[5751365] +``` + +As you can see in the terminal output, that the original file “opengapps.zip” has been deleted and it is still linked to a file name **13** with the process PID **13119**. However, we still can recover it by copying the file linked to it to a safe location. + +``` +cp 13 /home/m/Downloads/Compressed +``` + +After the file has been copied. we will return the directory which includes the recovered file and rename it with the following command. + +``` +mv 13 opengapps-recovered.zip +``` + +### CALCULATE THE MD5 HASH OF THE RECOVERED FILE + +Since we had recovered the file. let’s check the integrity of the file, just to make sure the file is not corrupted and it’s as same as the original one. Earlier we have saved the MD5 hash for the original file. + +``` +md5sum opengapps-recovered.zip >> md5-opengapps.txt +``` + +This command will check MD5 hash for the file and it will overwrite the text file to include the MD5 hash for the new recovered file to easily compare both MD5 hashes. + +Time to display the contents of the text file to compare both MD5 hashes of the original file and recovered file. + +``` +cat md5-opengapps.txt +``` + +``` +Terminal Output +86489b68b40d144f0e00a0ea8407f7c0 opengapps.zip +86489b68b40d144f0e00a0ea8407f7c0 opengapps-recovered.zip +``` + +The MD5 hash for the recovered file is the same. So, we successfully recovered the file we had deleted earlier and it has been recovered with the same file integrity and works fine. + + [![](http://www.linuxnov.com/wp-content/uploads/2017/07/Recovering-a-deleted-file-using-terminal-LinuxNov.png)][5] + +**Note:** in some cases, some files are not visible with **ps -axu** command. So, try to check the application running that file to recover the file from it running process. + +Let’s say we have a video with .avi extension running using Totem media player. All you need to check the PID of the Totem application and go through the same instructions mentioned in this example. + +To find out the PID of a running application use the following command followed by the application name. + +``` +pidof application name +``` +Support Us By Sharing + +-------------------------------------------------------------------------------- + +via: http://www.linuxnov.com/recover-deleted-files-still-running-active-processes-linux/ + +作者:[mhnassif ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.linuxnov.com/author/mhnassif/ +[1]:http://www.linuxnov.com/author/mhnassif/ +[2]:http://www.linuxnov.com/category/how-to/ +[3]:http://www.linuxnov.com/category/shell-cli/ +[4]:http://www.linuxnov.com/recover-deleted-files-still-running-active-processes-linux/#comments +[5]:http://www.linuxnov.com/wp-content/uploads/2017/07/Recovering-a-deleted-file-using-terminal-LinuxNov.png From 408307b312a453afa03e809e0506e784746fda04 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 17:08:33 +0800 Subject: [PATCH 0709/1407] =?UTF-8?q?20170716-19=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ORWARDING MOUNT A SOCKS SERVER WITH SSH.md | 164 ++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 sources/tech/20170715 DYNAMIC PORT FORWARDING MOUNT A SOCKS SERVER WITH SSH.md diff --git a/sources/tech/20170715 DYNAMIC PORT FORWARDING MOUNT A SOCKS SERVER WITH SSH.md b/sources/tech/20170715 DYNAMIC PORT FORWARDING MOUNT A SOCKS SERVER WITH SSH.md new file mode 100644 index 0000000000..6ecca0c15a --- /dev/null +++ b/sources/tech/20170715 DYNAMIC PORT FORWARDING MOUNT A SOCKS SERVER WITH SSH.md @@ -0,0 +1,164 @@ +DYNAMIC PORT FORWARDING / MOUNT A SOCKS SERVER WITH SSH +================= + +In the previous entry, [Creating TCP / IP (port forwarding) tunnels with SSH: The 8 scenarios possible using OpenSSH][17], we saw all the possibilities we have at our disposal for  _port forwarding_ … but for static port forwarding. That is, we only saw cases where we wanted to access only a port of another system by chan- ging it through the SSH connection. + +However, in that entry we left in the forefront the dynamic forwarding of ports and several, eral readers missed it, so that this entry will try to complement it (thanks to those who suggest this). + +When we talk about doing  _dynamic port forwarding_  with SSH, what we are talking about is exactly converting SSH into a [SOCKS][2] server. And what is a SOCKS server? + +Do you know what a[web proxy is for][3]? Probably yes, many companies use one. It is a system directly connected to the Internet that allows clients of an [intranet][4] without Internet access to navigate the web if they configure their browsers to make their requests through the proxy ( [although there are also transparent proxies][5] ). A web proxy, besides allowing the output to the Internet, will also cache pages, images, etc. Already downloaded by some client so you do not have to download them for another client. In addition, it allows to filter the contents and to monitor the activity of the users. However, its basic function is to forward HTTP and HTTPS traffic. + +A SOCKS server would give a service similar to the intranet of a company that provides a proxy server but is not limited to HTTP / HTTPS, but allows to forward any TCP / IP traffic (with SOCKS 5 also UDP). + +For example, imagine that we want to use our mail using POP3 or ICMP and SMTP with Thunderbird from an intranet without direct Internet access. If we only have a web proxy available, the only simple one we would use would be to use some webmail (although if it is a webmail we could also use the [Thunderbird Webmail extension][6]). We could also take advantage of the proxy by [tunneling over HTTP][7]. But the simplest thing would be that the network had a SOCKS server available that would allow us to use POP3, ICMP and SMTP through it without any inconvenience. + +Although there is a lot of software to configure very specialized SOCKS servers, setting up one with OpenSSH could be as simple as: + +> ``` +> Clientessh $ ssh -D 1080 user @ servidorssh +> ``` + +Or we could improve it a bit with: + +> ``` +> Clientessh $ ssh -fN -D 0.0.0.0:1080 user @ servidorssh +> ``` + +Where: + +* The option `-D`is similar to the options `-L`and `-R`static port forwarding. Like these, with this we can make the client listen only the local requests or those arriving from other nodes, depending on which address we associate the request: + + > ``` + > -D [bind_address:] port + > ``` + + While in static port forwarding we saw that we could do reverse port forwarding with the option `-R`, with dynamic forwarding is not possible. We can only create the SOCKS server on the SSH client side, not on the SSH server side. + +* 1080 is the typical port for SOCKS servers, just as 8080 is typical for web proxy servers. + +* The option `-N`prevents a remote shell interactive session from actually being launched. It is useful when we only do the `ssh`to establish this tunnel. + +* The option `-f`causes `ssh`it to stay in the background and disassociates itself from the current shell, so that the process becomes a daemon. It does not work without the option `-N`(or without specifying a command), otherwise an interactive shell would be incompatible with the process being in the background. + +Using [PuTTY][8] is also very simple to redirect ports. The equivalent of a ” `ssh -D 0.0.0.0:1080`” would be to use this configuration: + +![PuTTY SOCKS](https://wesharethis.com/wp-content/uploads/2017/07/putty_socks.png) + +For an application to access another network through a SOCKS server, it is convenient (although not necessary) that the application specifically supports it, just as browsers support using a proxy server. Browsers, such as Firefox or Internet Explorer, are examples of applications prepared to use a SOCKS server to access another network: + +![Firefox SOCKS](https://wesharethis.com/wp-content/uploads/2017/07/firefox_socks.png) + +![Internet Explorer SOCKS](https://wesharethis.com/wp-content/uploads/2017/07/internetexplorer_socks.png) + +Note: Capture has been obtained using [IEs 4 Linux][1] : Highly recommended if you need Internet Explorer and use Linux! + +However, it is not precisely the browsers that most often require a SOCKS server, since they usually are better arranged with the proxy server. + +But for example, the Thunderbird also allows and that is useful: + +![Thunderbird SOCKS](https://wesharethis.com/wp-content/uploads/2017/07/thunderbird_socks.png) + +Another example: the [Spotify][9] client also supports SOCKS: + +![Spotify SOCKS](https://wesharethis.com/wp-content/uploads/2017/07/spotify_socks.png) + +Something to keep in mind is name resolution. Sometimes we will find that in the current network we can not resolve the names of the systems that we want to access on the other side of the SOCKS server. SOCKS 5 also allows us to tunnel DNS requests (as is UDP allows us to SOCKS 5) and send them to the other end: It is possible to specify if we want to resolve locally or remotely (or maybe test both). Applications that support this also have to take this into account. For example, Firefox has the parameter network.proxy.socks_remote_dns (in it `about:config`) that allows us to specify that it is resolved remotely. By default it is resolved locally. + +Thunderbird also supports the parameter `network.proxy.socks_remote_dns`, but since we do not have an address bar to place `about:config`, we can change it, as we read in [MozillaZine: about: config][10], in Tools → Options → Advanced → General → Config Editor (button). + +Applications that do not specifically support SOCKS can be “socksified”. This will work well with many applications that use TCP / IP without problems, but not with all. “Socksifier” consists of loading an additional library that detects requests to the TCP / IP stack and modifying them to redirect them through the SOCKS server, so that the communication goes through without the application being specifically programmed with SOCKS support . + +There are “Socksifiers” for Windows and for [Linux.][18] + +For Windows we have for example the SocksCap, a closed but free product for non-commercial use that I have used very satisfactorily for a long time. SocksCap was made by a company called Permeo which was the company that created SOCKS reference technology. Permeo was bought by [Blue Coat][11] and it [discontinued the SocksCap][12]. You can still find the file very well `sc32r240.exe`on the Internet. Also for Windows, and free code, there is the [FreeCap][13], of appearance and use very, very similar to the SocksCap. However, it works much worse and has been maintenance-free for years. It seems that its author has preferred to dedicate his efforts to a new product this time of payment, the [WideCap][14]. + +This is the aspect of the SocksCap when we have “socksified” several applications. These applications will access the network through the SOCKS server when we launch them from here: + +![SocksCap](https://wesharethis.com/wp-content/uploads/2017/07/sockscap.png) + +In the configuration dialog we will see that if we choose the protocol SOCKS 5, we can choose where the names have to be resolved, locally or remotely: + +![SocksCap settings](https://wesharethis.com/wp-content/uploads/2017/07/sockscap_settings.png) + +On Linux, as always, we have many alternatives to a single remote command. In Debian / Ubuntu, the output of the command: + +> ``` +> $ Apt-cache search socks +> ``` + +Will show us many of them + +The best known to me are the [tsocks][15] and the [proxychains][16]. They work in much the same way: Just launch the application that we want to “socksify” with them and that’s it. An example using `proxychains`y `wget`: + +> ``` +> $ Proxychains wget http://www.google.com +> ProxyChains-3.1 (http://proxychains.sf.net) +> --19: 13: 20-- http://www.google.com/ +> Resolving www.google.com ... +> DNS-request | Www.google.com +> | S-chain | - <- - 10.23.37.3:1080-<><>-4.2.2.2:53-<><>-OK +> | DNS-response | Www.google.com is 72.14.221.147 +> 72.14.221.147 +> Connecting to www.google.com | 72.14.221.147 |: 80 ... +> | S-chain | - <- - 10.23.37.3:1080-<><>-72.14.221.147:80-<><>-OK +> Connected. +> HTTP request sent, awaiting response ... 200 OK +> Length: unspecified [text / html] +> Saving to: `index.html ' +> +> [<=>] 6,016 24.0K / s in 0.2s +> +> 19:13:21 (24.0 KB / s) - `index.html 'saved [6016] +> ``` + +For this to work, you must specify the proxy server that we want to use in `/etc/proxychains.conf`: + +> ``` +> [ProxyList] +> Socks5 clientessh 1080 +> ``` + +We can also tell you that DNS requests are made remotely: + +> ``` +> # Proxy DNS requests - no leak for DNS data +> Proxy_dns +> ``` + +Also, in the previous output, we have seen several informative messages of the same `proxychains`, not `wget`in lines marked with strings `|DNS-request|`, `|S-chain|`or `|DNS-response|`. If we do not want to see them, we can also adjust it in the configuration: + +> ``` +> # Quiet mode (no output from library) +> Quiet_mode +> ``` + +-------------------------------------------------------------------------------- + +via: https://wesharethis.com/2017/07/15/dynamic-port-forwarding-mount-socks-server-ssh/ + +作者:[Ahmad][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://wesharethis.com/author/ahmad/ +[1]:https://wesharethis.com/goto/http://www.tatanka.com.br/ies4linux/page/Main_Page +[2]:https://wesharethis.com/goto/http://en.wikipedia.org/wiki/SOCKS +[3]:https://wesharethis.com/goto/http://en.wikipedia.org/wiki/Proxy_server +[4]:https://wesharethis.com/goto/http://en.wikipedia.org/wiki/Intranet +[5]:https://wesharethis.com/goto/http://en.wikipedia.org/wiki/Proxy_server#Transparent_and_non-transparent_proxy_server +[6]:https://wesharethis.com/goto/http://webmail.mozdev.org/ +[7]:https://wesharethis.com/goto/http://en.wikipedia.org/wiki/HTTP_tunnel_(software) +[8]:https://wesharethis.com/goto/http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html +[9]:https://wesharethis.com/goto/https://www.spotify.com/int/download/linux/ +[10]:https://wesharethis.com/goto/http://kb.mozillazine.org/About:config +[11]:https://wesharethis.com/goto/http://www.bluecoat.com/ +[12]:https://wesharethis.com/goto/http://www.bluecoat.com/products/sockscap +[13]:https://wesharethis.com/goto/http://www.freecap.ru/eng/ +[14]:https://wesharethis.com/goto/http://widecap.ru/en/support/ +[15]:https://wesharethis.com/goto/http://tsocks.sourceforge.net/ +[16]:https://wesharethis.com/goto/http://proxychains.sourceforge.net/ +[17]:https://wesharethis.com/2017/07/14/creating-tcp-ip-port-forwarding-tunnels-ssh-8-possible-scenarios-using-openssh/ +[18]:https://wesharethis.com/2017/07/10/linux-swap-partition/ From ac1805eaec250d8c519000ca66a163ca603ff595 Mon Sep 17 00:00:00 2001 From: Ezio Date: Sun, 16 Jul 2017 17:10:05 +0800 Subject: [PATCH 0710/1407] =?UTF-8?q?20170716-20=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ylas Mail A Free Email Client For Linux.md | 43 +++++++++++++++++++ 1 file changed, 43 insertions(+) create mode 100644 sources/tech/20170716 Nylas Mail A Free Email Client For Linux.md diff --git a/sources/tech/20170716 Nylas Mail A Free Email Client For Linux.md b/sources/tech/20170716 Nylas Mail A Free Email Client For Linux.md new file mode 100644 index 0000000000..6f1b568478 --- /dev/null +++ b/sources/tech/20170716 Nylas Mail A Free Email Client For Linux.md @@ -0,0 +1,43 @@ +# [Nylas Mail A Free Email Client For Linux][7] + + + + [![Nylas Mail An Amazing Free Email Client For Linux](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-mail-review_orig.jpg)][1] ​So questions are being asked whether Ubuntu should still ship with a default email client. Personally, I have not used [Thunderbird][9] in a really long time. I wanna believe this is not the first time the question has been asked but this time I believe there is a really good chance that it is gonna get cut. This is because everyday users tend to resort to web-based clients such as Gmail or Outlook for their email needs. And for the power user on Linux, there are quite a few options available to choose from. [Geary][10], Empathy, Evolution, and Thunderbird itself have served many users quite well for sometime now, but I found something worth checking out: it is called Nylas Mail.​Previously known as [Nylas N1][11] client, [Nylas Mail][12] was introduced early this year in January and along with it came a free version; **Nylas Mail** Basic along with the previously available paid version. Also, back in January, the client was available for only Mac but it is now available for Linux and Windows users. + +### Why Nylas? + +​A lot of people have chosen Nylas Mail for a variety of reasons. Let us take a look at some of the common themes that run around. + +**Simplicity**- Nylas Mail client manages elegance and simplicity. Built in electron, the app is very pretty and easy going. The design also ensures setting up your emails in Nylas is pretty easy and straightforward. [![Nylas mail an awesome email client for linux](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/nylas-mail-an-awesome-email-client-for-linux.jpg?1499814843)][2] ​**Compatibility** - Nylas Mail is compatible with all email providers. It is compatible with Gmail, Yahoo, Exchange and IMAP accounts so you are covered wherever you get your mail. [![nylas compatible with gmail facebook imap](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/nylas-compatible-with-gmail-facebook-imap.jpg?1499814928)][3] **​Powerful features** - Nylas ships with a ton of features. There is a full-screen mode, offline support, multiple layout formats, multiple accounts, unified inboxes, reminders, snoozing, signatures and send later. Some of these features come with the Nylas Mail Basic. [![nylas email client powerful features](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/nylas-email-client-powerful-features.jpg?1499814992)][4] **​Hybrid backend** - Previously, Nylas sort of synced a copy of your mail into a server using the Nylas cloud and this was like mehn for many people. Fortunately, with the latest version, Nylas now employs a hybrid backend that connects directly to your email providers such as Gmail or Outlook. The cloud sync, although is still available, is only used when you use advanced subscription tools such as snoozing and tracking. The downside is that it is one or the other. Want some pro features, you require cloud sync, you don’t want cloud sync, you miss out on those features. [![nylas email hybrid backend](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/editor/nylas-email-hybrid-backend.jpg?1499815041)][5] **​Open-source and a free edition** - Nylas mail is available as an open source project. This means you can take the code and build it up yourself. You can even setup your own server to sidestep the issue. [![nylas open source and free email client](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/nylas-open-source-and-free-email-client.jpg?1499815091)][6] **Cross-platform** - Nylas is a cross-platform app available on Linux, Windows and Mac OS X. So regardless of which desktop operating system you prefer, you can rest assured that Nylas has you covered. And the experience is the same all across. + +### What needs some work? + +So far so good with Nylas email clients but there are a few gripes. First is the paid option which was introduced back in 2016\. The introduction of the free version kind of deals with this issue but the fact that some of the features are only available for the costly price of about $9/month is off-putting for most people including me. Also, not many people like to keep copies of their mail on a server somewhere. Of course, you can set up your own server but who needs the hassle. Lastly, for an app that runs in the background, it can be quite the memory hog. I hope it is not due to the fact that it is written mainly in electron and I want to believe this is going to get better with updates and improvements + +### Conclusion + +**​Nylas Mail** hits a very sweet spot for me in terms of features and function and I believe you definitely should check it out. As an email client, it is pretty effective and I'm really liking Nylas Mail and will definitely keep it around. Maybe you should too. Kudos to the developers for the good work being done. Do you have another app you want us to take a look at? Point it out in the comments below and share your thoughts and comments as well. | + +-------------------------------------------------------------------------------- + +via: http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux + +作者:[http://www.linuxandubuntu.com ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux +[1]:http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux +[2]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-mail-an-awesome-email-client-for-linux_orig.jpg +[3]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-compatible-with-gmail-facebook-imap_orig.jpg +[4]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-email-client-powerful-features_orig.jpg +[5]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-email-hybrid-backend_orig.jpg +[6]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-open-source-and-free-email-client_orig.jpg +[7]:http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux +[8]:http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux#comments +[9]:http://www.linuxandubuntu.com/home/thunderbird-release-with-several-bug-fixes +[10]:http://www.linuxandubuntu.com/home/geany-a-lightweight-ide-or-code-editor-for-programmers +[11]:http://www.linuxandubuntu.com/home/nylas-n1-a-premium-email-client-for-linux +[12]:https://www.nylas.com/nylas-mail/ From 111ac0304639b91fcefee2ce3ad5e448b7444ae8 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 16 Jul 2017 21:18:46 +0800 Subject: [PATCH 0711/1407] PRF:20161228 How to set up a Continuous Integration server for Android development.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @Taylor1024 翻译时文风可以轻松,但是首先要忠实于原文,要将原文的意思表达出来,不能遗漏关键信息。 --- ...egration server for Android development.md | 382 ++++++++---------- 1 file changed, 161 insertions(+), 221 deletions(-) diff --git a/translated/tech/20161228 How to set up a Continuous Integration server for Android development.md b/translated/tech/20161228 How to set up a Continuous Integration server for Android development.md index 3c975d05a2..a4e494ee0f 100644 --- a/translated/tech/20161228 How to set up a Continuous Integration server for Android development.md +++ b/translated/tech/20161228 How to set up a Continuous Integration server for Android development.md @@ -1,170 +1,155 @@ -如何在安卓开发中搭建一个连续集成服务器 +如何为安卓开发搭建一个持续集成(CI)服务器 ============================================================ -我最近买了新 MacBook Pro 作为我的安卓开发主力,我的老式的 MacBookPro(2011发布,16GB 500G的固态硬盘,内核是i5,主频4GHz,64位),我也没卖,我打算用它搭建一个连续集成服务器. +我最近买了新 MacBook Pro 作为我的主要的安卓开发机,我的老式的 MacBookPro(13 寸,2011 年后期发布,16GB 内存, 500G 的固态硬盘,内核是 i5,主频 2.4GHz,64 位),我也没卖,我清理了它,并把他变成了一个 MacOS 和Ubuntu 双引导的持续集成(CI)服务器。 -写这篇文章我主要想总结一下安装步骤,好给自己以后作参考,当然,这篇文章也是给同行看的,只要他们感兴趣.好了,现在开始: +写这篇文章我主要想总结一下安装步骤,好给自己以后作参考,当然,这篇文章也是给同行看的,只要他们感兴趣。好了,现在开始: -* 1.让 Ubuntu 成功运行 SDK (Software Development Kit) -* 2.安装 Jenkins CI ,将其作为服务器.这样,我们可以拉取,编译,运行 已经上传到 Github 的 Android 项目 -* 3.安装 Docker.我们使用 Docker 来运行 -* 4.Android app 配置需求 +1. 配置一个新的 Ubuntu ,以便运行 Android SDK。 +2. 安装 Jenkins CI 服务来拉取、编译、运行测试托管在 Github 的多模块 Android 项目。 +3. 安装 Docker 并在容器中运行 MySQL 服务器和 SonarQube。来运行由 Jenkins 触发的静态代码分析。 +4. Android app 配置需求。 ### 第一步-安装 Ubuntu: -我个人比较倾向于使用 Ubuntu 作为持续集成中的 SO,怎么说呢,谁让 Ubuntu 的社区热情呢!你问什么都有人回答,这样可轻松不少.我推荐大家用 LTS (长期技术支持)的最新版.已经有很多教程教大家怎么安装了,我就不废话了,贴个下载链接就行了. +我将使用 Ubuntu 作为持续集成的 SO,因为 Ubuntu 有一个强大的社区,它可以解决你遇到的任何问题,而且我个人推荐总是使用 LTS 版本,当前是 16.04 LTS。已经有很多教程教大家在各种硬件上怎么安装了,我就不废话了,贴个下载链接就行了。 -[Install Ubuntu Desktop 16.04 LTS][1] +- [下载 Ubuntu Desktop 16.04 LTS][1] -有人可能很奇怪:用什么桌面版,服务器版多好.额,这个嘛,萝卜青菜,各有所爱.我倒不在乎 UI 占用的那点运算资源.相反,用那一点资源换来可用性,我觉得挺值的. +有人可能很奇怪:用什么桌面版,服务器版多好。额,这个嘛,萝卜青菜,各有所爱。我倒不在乎 UI 占用的那点运算资源。相反,用那一点资源换来生产力的提升我觉得挺值的。 ### 第二步-远程管理: #### SSH 服务器 -Ubuntu 桌面版默认安装配置并没有 ssh 服务器,所以你想用的话就只好自己安装. +Ubuntu 桌面版默认安装并没有 ssh 服务器,所以你想远程通过命令行管理的话就只好自己安装。 ``` $ sudo apt-get install openssh-server ``` -#### 虚拟远程桌面 +#### NoMachine 远程桌面 -可能你的持续集成服务器在你的路由器后面,而不是你的工作环境后面,甚至还可能远离你数里.你可以用不同的远程桌面解决,不得不说,IMHO NoMachine在这方面表现的最好,它只需要你的 ssh 证书就可以工作了(显然你要先把它安装在 CI 和你的机器中 - -[NoMachine - Free Remote Access For Everybody -Free remote access and desktop sharing software. Access your computer to work on files and transfer documents, watch…www.nomachine.com][2][][3] +可能你的持续集成服务器没有挨着你,而是在你的路由器后面,或者其它屋子,甚至还可能远离你数里。我试过各种远程桌面方案,不得不说,IMHO NoMachine 在这方面表现的最好,它只需要你的 ssh 证书就可以工作了(显然你要先把它安装在 CI 和你的机器中)。 +- [NoMachine - 任何人都能用的免费的远程访问工具][3] ### 第三步-配置环境: -这里我打算安装 Java8,Git,和 Android SDK +这里我打算安装 Java8,Git,和 Android SDK,Jenkins 需要它们来拉取、编译和运行 android 项目。 -#### SDKMAN!: +#### SDKMAN! -有许多超级厉害的命令行工具让你可以安装各种流行的 SDK(软件开发包)比如说,Gradle,Groovy, Grails, Kotlin, Scala...),这样在各个版本中进行选择就容易,顺手多了. +这个超级厉害的命令行工具让你可以安装各种流行的 SDK(比如说,Gradle、Groovy、Grails、Kotlin、 Scala……),并可以以容易方便的方式列出它们和在各个并行版本中切换。 -[SDKMAN! the Software Development Kit Manager -SDKMAN! is a tool for managing parallel versions of multiple Software Development Kits on most Unix based systems. It…sdkman.io][4][][5] +- [SDKMAN! - SDK 管理器][5] -社区最近又增加了对 JAVA8 的支持,所以我不太喜欢烂大街的 webupd8 库,而是更倾向于安装 Java .在你安装开始前,务必要想清你要不要安装 SDKMAN,话说回来,最好还是装上,因为我们以后应该会用到. +它们最近又增加了对 JAVA8 的支持,所以我使用它来安装 Java,而是用流行的 webupd8 仓库。所以在你安装开始前,务必要想清你要不要安装 SDKMAN,话说回来,最好还是装上,因为我们以后应该会用到。 -执行以下命令即可安装 SDKMAN +安装 SDKMAN! 很容易,执行以下命令即可: ``` $ curl -s "https://get.sdkman.io" | bash ``` +#### Oracle JAVA8 -#### Oracle JAVA8: - -因为我们已经安装了 SDKMAN,所以安装 JAVA8 就相当简单了 +因为我们已经安装了 SDKMAN! ,所以安装 JAVA8 就相当简单了: ``` $ sdk install java ``` -Or using the webupd8 repository: -或者使用 webupd8 这个源 +或者使用 webupd8 这个仓库: -[Install Oracle Java 8 In Ubuntu Or Linux Mint Via PPA Repository [JDK8] -Oracle Java 8 is now stable. Below you'll find instructions on how to install it in Ubuntu or Debian via a PPA…www.webupd8.org][6][][7] -Oracle Java 8 不太稳定,在文章底部你可以找到相关指导,教你如何在 Ubuntu 或者 Debian 下通过 PPA 安装. +- [在 Ubuntu 或 Linux Mint 上通过 PPA 仓库安装 Oracle Java 8 [JDK8]][6] #### Git: -安装git的命令也非常直观,就不废话了 +安装git的命令也非常直观,就不废话了。 ``` $ sudo apt install git ``` - -#### Android SDK: +#### Android SDK 这下面这篇文章的底部 -[Download Android Studio and SDK Tools | Android Studio -Download the official Android IDE and developer tools to build apps for Android phones, tablets, wearables, TVs, and…developer.android.com][8][][9] +- [下载 Android Studio 和 SDK Tools | Android Studio][8] -你可以找到 "Get just the command line tools" 等字样,复制这个链接.比如: +你可以找到 “Get just the command line tools” 等字样,复制这个链接。比如: ``` https://dl.google.com/android/repository/tools_r25.2.3-linux.zip ``` -下载,然后解压到 /opt/android-sdk-linux 下 +下载,然后解压到 `/opt/android-sdk-linux` 下: ``` $ cd /opt -``` - -``` $ sudo wget https://dl.google.com/android/repository/tools_r25.2.3-linux.zip -``` - -``` $ sudo unzip tools_r25.2.3-linux.zip -d android-sdk-linux ``` -我们限定了目录权限为 root,所以想要一般情况下使用,还是要重新授权. +我们使用 root 用户创建了该目录,所以我们需要重新授权来使我们的主要用户对它可读可写。 ``` $ sudo chown -R YOUR_USERNAME:YOUR_USERNAME android-sdk-linux/ ``` -然后,在 /.bashr 文件下 增加 SDK 的环境变量 +然后,在 `~/.bashrc` 文件下设置 SDK 的环境变量 ``` $ cd $ nano .bashrc ``` -在底部写入这些行:(注意,但要在 SDKMAN 配置文件前) +在文件底部写入这些行(注意,但要在 SDKMAN! 配置文件前): ``` export ANDROID_HOME="/opt/android-sdk-linux" export PATH="$ANDROID_HOME/tools:$ANDROID_HOME/platform-tools:$PATH" ``` -关闭此终端,再打开一个看看环境变量是否生效 +关闭此终端,再打开一个新的终端看看环境变量是否正确生效: ``` $ echo $ANDROID_HOME /opt/android-sdk-linux ``` +然后我们启动图形界面的 Android SDK 管理器,并安装你所需的平台和依赖: ``` $ android ``` ![](https://cdn-images-1.medium.com/max/1000/1*Q4o_LpfC5A3evFUwd62MOQ.png) -运行 Android SDK Manager 的图形交互界面 +*运行 Android SDK Manager 的图形交互界面* -### Step 4 _ Jenkins 服务器 +### 第四步-Jenkins 服务器 -这里,我要讲讲怎么安装,配置服务器,并创建可拉取的 Jenkin Jobs, +这里,我要讲讲怎么安装、配置该服务器,并创建 Jenkin 任务来拉取、构建和测试 Android 项目,并怎样获取控制台输出。 #### 安装 Jenkins -你可以在下面的链接找到 Jenkins server 相关信息 +你可以在下面的链接找到 Jenkins 服务器相关信息: -[Jenkins -Jenkins is an open source automation serverjenkins.io][12][][13] +- [Jenkins][12] -我们有许多办法运行 Jenkins,比如说Linux服务器下就可以运行 .war 文件,作为 Docker 容器.等等..... +我们有许多办法运行 Jenkins,比如说运行 .war 文件,作为 Linux 服务,作为 Docker 容器等等。 -我起初是想把它当做 Docker 容器运行,但是后来我意识到在实体机上配置代码文件夹,android-sdk文件夹和 USB 设备的可见性简直是一场噩梦. +我起初是想把它当做 Docker 容器运行,但是后来我意识到正确地配置代码文件夹、android-sdk 文件夹的可见性,和插到运行的 Android 测试机上的物理设备的 USB 可见性简直是一场噩梦。 -少操点心,我最终决定给它增加 Stable 源当一个服务器用,自动安装,自动更新. +少操点心,我最终决定以服务的方式,增加 Stable 仓库的 key 来通过 apt 安装和更新。 ``` $ wget -q -O - https://pkg.jenkins.io/debian-stable/jenkins.io.key | sudo apt-key add - ``` -编辑 source.list,写入这一行 +编辑 `source.list`,写入这一行: ``` $ sudo nano /etc/apt/sources.list @@ -175,311 +160,265 @@ $ sudo nano /etc/apt/sources.list deb https://pkg.jenkins.io/debian-stable binary/ ``` -然后安装 +然后安装: ``` sudo apt-get update sudo apt-get install jenkins ``` -在用户组里面增加 _jenkins_ ,允许其读写 Android SDK 文件夹 +在你的用户组里面增加 `jenkins` ,允许其读写 Android SDK 文件夹。 ``` -$ sudo usermod -a -G YOUR_USERNAME jenkins +$ sudo usermod -a -G 你的用户组 jenkins ``` -Jenkins 服务在开机引导时就会被加载到内存,对外默认开放本机 8080 端口 +Jenkins 服务在开机引导时就会被启动,并可通过 http://localhost:8080 访问: -安装完毕会有一些安全预警信息,没什么好讲的,跟着引导程序走,人家说啥你做啥就行了.引导结束,你的 Jenkins就会运行了. +安装完毕会有一些安全预警信息,跟着引导程序走,你的 Jenkins 就会运行了。 ![](https://cdn-images-1.medium.com/max/1000/1*gN6-ncU7mRdQWL3wmlS_5g.png) -启用安装成功的 Jenkins 服务器. +*启用安装成功的 Jenkins 服务器。* #### Jenkins 配置 -启用成功后,会有提示程序提示你安装插件,单击 "Select plugins to Install"就可以开始浏览所有插件,然后选择你要安装的插件就OK了. +启用成功后,会有提示程序提示你安装插件,单击 “Select plugins to Install” 就可以开始浏览所有插件,然后选择你要安装的插件就 OK 了 。 -* JUnit +* [JUnit 插件][16] +* [JaCoCo 插件][18] +* [EnvInject 插件][20] +* [GitHub 插件][22] -[JUnit Plugin - Jenkins - Jenkins Wiki -The JUnit plugin provides a publisher that consumes XML test reports generated during the builds and provides some…wiki.jenkins-ci.org][16][][17] - -* JaCoCo - -[JaCoCo Plugin - Jenkins - Jenkins Wiki -In order to get the coverage data published to Jenkins, you need to add a JaCoCo publisher and configure it so it will…wiki.jenkins-ci.org][18][][19] - -* EnvInject - -[EnvInject Plugin - Jenkins - Jenkins Wiki -Only previous environment variables are available for polling Some plugins provide polling mechanisms (such as SCM…wiki.jenkins-ci.org][20][][21] - -* GitHub plugins - -[GitHub Plugin - Jenkins - Jenkins Wiki -This plugin requires that you have an HTTP URL reachable from GitHub, which means it's reachable from the whole…wiki.jenkins-ci.org][22][][23] - - - ![](https://cdn-images-1.medium.com/max/1000/1*xvG06qRSCvfw5OQgQleG0A.png) +![](https://cdn-images-1.medium.com/max/1000/1*xvG06qRSCvfw5OQgQleG0A.png) -安装 Jenkins 插件 +*安装 Jenkins 插件* -创建管理员用户,并完成安装 +创建管理员用户,并完成安装。 -配置环境变量 ANDROID_HOME,JAVA_HOME +要完成安全需要配置环境变量 `ANDROID_HOME`,`JAVA_HOME`。 -点击 Manage Jenkins,接着 Configure System +点击 Manage Jenkins,接着 Configure System。 -Scroll down and at Global properties section check the Environment variables box and add _ANDROID_HOME_ and _JAVA_HOME_ -滚动文件至底部,在全局属性模块中复核环境变量,并增加 _ANDROID_HOMOE_,和_JAVA_HOME_变量 +滚动文件至底部,在全局属性模块中找到环境变量,并增加 `ANDROID_HOMOE`,和 `JAVA_HOME` 变量。 ![](https://cdn-images-1.medium.com/max/1000/1*rpgkUsqWhkHk4xOKCGPcvw.png) -给所有 Jenkins 工作(jobs)增加全局变量. +*给所有 Jenkins 任务增加全局变量* -#### 创建 Jenkins Job +#### 创建 Jenkins 任务 -一个 Jenkins Job 定义了一系列不间断的操作.如果你跟随本篇引导的话,那么你可以使用我已经在 GitHub 上为你准备了一个 Android 练习项目,你可以使用这个来试试手.它只是一个复合模块的 app,包括多个方面,比如单元测试,Android测试,和 JaCoCo,SonarQube插件. +一个 Jenkins 任务定义了一系列不间断的操作。如果你跟随本篇引导的话,那么你可以使用我已经在 GitHub 上为你准备了一个 Android 练习项目,你可以使用这个来试试手。它只是一个多模块的 app,带有单元测试、Android 测试,包括 JaCoCo、SonarQube 插件。 +- [pamartineza/helloJenkins][24] -[pamartineza/helloJenkins -helloJenkins - Hello Jenkins project for CI configuration testgithub.com][24][][25] +首先创建一个新的 Freestyle 任务项目,取名为 `Hello_Android`。不要在名字中使用空格,这样可以避免与 SonarQube 不兼容的问题。 -首先创建一个新的 Job 项目,取名为 _Hello_Android_.不要使用空格,这样可以避免与 SonarQube 不兼容的问题. +![](https://cdn-images-1.medium.com/max/1000/1*ITE7xIrbsrChWv45PSlPPw.png) +*创建一个 Freestyle Jenkins 任务* - ![](https://cdn-images-1.medium.com/max/1000/1*ITE7xIrbsrChWv45PSlPPw.png) +接下来就是配置了,我给每一部分都做了截屏。 -创建一个 Freestyle Jenkins Job +**概况** -接下来就是配置了,我给每一块都增加了截屏 +这部分比较繁琐,你可以在这里变更任务的名字、增加简介。如果你使用 GitHub 项目,你还可以写下项目的 URL(不要 *.git,这是 url 的部分,不是仓库的)。 -概况 +![](https://cdn-images-1.medium.com/max/1000/1*7QF2pfgM73FVIWTfQhcbEA.png) -这部分比较繁琐,你可以在这里变更 Job 的名字,增加简介.如果你使用 GitHub 项目,你还可以写下项目的 URL(不要 *.git,是 web 的 url,不是 repo) +*项目 Url 配置* +**源代码管理** - ![](https://cdn-images-1.medium.com/max/1000/1*7QF2pfgM73FVIWTfQhcbEA.png) +这时候我们就要选择我们的 CVS 作为 Git,并且增加仓库的 url(这次就要包括 *.git)然后选择分支拉取。因为这是一个公开的 GitHub 仓库,我们就不需要提交证书了,否则的话就要设置账号和密码。 -项目 Url 配置 - -源代码管理 - -这时候我们就要选择我们的 CVS 作为 Git,并且增加源的 url(这次就要包括 *.git)然后选择分支拉取.因为这是一个公开的 GitHub 库,我们就不需要提交证书了,否则的话就要设置账号和密码 - -相比于使用自己的公用仓库我更倾向于创建一个只读的私人仓库专门配给 Jenkins Job 使用 - -另外,如果你已经使用了 Two-Factor 认证,Jenkins 就无法拉取代码.所以为 Jenkins 专门开启一个库很有必要,这样可以直接从私人库中拉取代码 +相比于使用你的带有完全权限的公开仓库,我更倾向于为你的私有库创建一个新的只读用户来专门配给 Jenkins 任务使用。 +另外,如果你已经使用了双因子认证,Jenkins 就无法拉取代码,所以为 Jenkins 专门创建一个用户可以直接从私有库中拉取代码。 ![](https://cdn-images-1.medium.com/max/1000/1*wkzdL70XrCzIpXDsHPA2Pg.png) -配置仓库 +*配置仓库* -构建 (build) 触发器 +**构建触发器** -你可以手动开始构建,也可以远程,周期性地,或者在另一个 Job 构建完成之后开始构建,只要这些改变可以被检测到. +你可以手动开始构建,也可以远程地、周期性地、或者在另一个任务构建完成之后开始构建,只要这些改变可以被检测到。 -最好的情况肯定是一旦你更改了某些地方,就会立刻触发构建事件,Github为此提供了名叫 webhooks 的回调函数 +最好的情况肯定是一旦你更改了某些地方,就会立刻触发构建事件,Github 为此提供了一个名叫 webhooks 的系统。 +- [Webhooks | GitHub 开发者指南][26] -[Webhooks | GitHub Developer Guide -Webhooks allow you to build or set up integrations which subscribe to certain events on GitHub.com. When one of those…developer.github.com][26][][27] +这样,我们就可以配置来发送这些事件到 CI 服务器,然后触发构建。显然,我们的 CI 服务器必须要联网,并且可以与 GitHub 服务器通信。 -这样,我们就可以发送这些事件到 CI 服务器,然后触发构建.显然,我们的 CI 服务器必须要联网,并且可以与 GitHub 服务器通信. +你的 CI 服务器也许为了安全只限于内网使用,那么解决办法就只有集中周期性的提交。我就是只有工作时才打开 CI,我把它设置为每十五分钟轮询一次。轮询时间可以通过 CRON 语法设置,如果你不熟悉,请点击右侧的帮助按钮获取带有例子的丰富文档。 -你的 CI 服务器为了安全只限于内网使用,那么解决办法就只有集中周期性的提交.我就是只有工作时才打开 CI,我把它设置为每十五分钟上交一次.集中时间可以通过 CRON 语法设置,如果你不熟悉,请点击案例文件的右侧的帮助按钮. +![](https://cdn-images-1.medium.com/max/1000/1*eONz8DAwJ9PW7uc8VQw7wQ.png) +*仓库轮询配置* +**构建环境** - ![](https://cdn-images-1.medium.com/max/1000/1*eONz8DAwJ9PW7uc8VQw7wQ.png) +这里我推荐设置构建超时来避免 Jenkings 占用内存和 CPU ,毕竟有时候有意外发生。当然,你还可以插入环境变量和密码等等。 -源的集中配置 +![](https://cdn-images-1.medium.com/max/1000/1*Y6FgbIQq8pMk6D72Sr9KdQ.png) -构建环境 +*构建超时* -这里我推荐设置超时模块避免 Jenkings 禁用内存和 CPU ,毕竟有时候有意外发生.当然,你还可以设置环境变量和密码等等. +**构建** +现在是见证魔法的时刻了,增加一个 Build 步骤,引入 Gradle 脚本,选择 Gradle Wrapper (默认情况下,Android 项目带有 Gradle Wrapper,不要忘记把它检入到 Git ),然后定义你要执行哪些任务: - ![](https://cdn-images-1.medium.com/max/1000/1*Y6FgbIQq8pMk6D72Sr9KdQ.png) +1. clean:清除之前构建的所有历史输出,这样可以确保没有东西缓存,从头构建。 +2. asseembleDebug: 生成调试 .apk 文件。 +3. test:在所有模块上执行 JUnit 测试。 +4. connectedDebugAndroidTest:在连接到 CI 的实体机上执行安卓测试单元(也可以使用安装了安卓模拟器的 Jenkins 插件,但是它不支持所有型号,而且相当麻烦)。 -构建超时 +![](https://cdn-images-1.medium.com/max/1000/1*D0HDPOUYCWzsWKiLv4LrBA.png) -Build: +*配置 Gradle* -神奇的事情发生了,使用 Gradle 脚本,增加 Build 步骤,选择 Gradle Wrapper (默认情况下,Gradle Wrapper 配置了 Android 项目,不要忘记在 Git 上检查一下)然后选择你要执行的任务 +**构建后操作** -1. clean: 清除所有历史输出,这样可以刷新缓存 -2. asseembleDebug: 生成调试 .apk 文件 (Android application 文件) -3. test:在所有模块上执行 JUnit 测试文件 -4. connectteDebugAndroidTest:在实体机上执行安卓测试单元,连接到 CI (也可以使用安装了 Jenkins 插件的安卓模拟器,但是它不支持所有型号,而且相当麻烦) +我们将要增加“发布 JUnit 测试报告”,这一步由 JUnit 插件提供,其搜集由 JUnit 测试结果生成的 XML 文件,它会生成漂亮的图表来按时间展示测试结果。 - ![](https://cdn-images-1.medium.com/max/1000/1*D0HDPOUYCWzsWKiLv4LrBA.png) +我们 app 模块中,测试运行结果的路径是: `app/build/test-results/debug/*.xml`。 -配置 Gradle +在多模块项目中,其它的“纯” Java 模块中测试结果在这里:`*/build/test-results/*.xml`。 -我们将要增加 JUnit 测试报告.JUnit插件需要这一步,再搜集由 JUnit 测试结果生成的 XML 文件,这样我们就能即时知道测试结果的变化. +![](https://cdn-images-1.medium.com/max/1000/1*ZQtamiQ_8PzAFBd-pMfvdg.png) +还要增加“记录 JaCoCo 覆盖率报告”,它要创建一张显示代码覆盖率的图表。 -这我们 app 模块中,测试运行结果的路径是: +![](https://cdn-images-1.medium.com/max/1000/1*wKaFykDl0qg-c79QwRTR2w.png) -app/build/test-results/debug/*.xml +#### 运行 Jenkins 任务 -在其他 "纯净模式" 下,综合模块的测试结果在这里: +只要有任何改变提交到仓库,我们的测试任务将每十五分钟执行一次,但是如果你不想等的话,或者你只是想验证一下配置的改变,你也可以手动运行。单击“现在构建”按钮,当前的构建将出现在构建历史中,点击它可以查看细节。 -*/build/test-results/*.xml - - - ![](https://cdn-images-1.medium.com/max/1000/1*ZQtamiQ_8PzAFBd-pMfvdg.png) - - -还要增加记录报告,表明将要创建一张显示代码作用域的表单. - - ![](https://cdn-images-1.medium.com/max/1000/1*wKaFykDl0qg-c79QwRTR2w.png) - - -#### 运行 Jenkins Job - -只要有任何改变提交到仓库,它们就会在十五分钟之内被执行,但是如果你不想等的话,或者你只是想验证一下配置的改变,你也可以手动运行.单击构建按钮,这样你就可以在构建历史中找到它,接着单击就可以了. - - - ![](https://cdn-images-1.medium.com/max/1000/1*vKi-BGQ2blimaoTl7PTXtQ.png) +![](https://cdn-images-1.medium.com/max/1000/1*vKi-BGQ2blimaoTl7PTXtQ.png) -手动执行 Job +*手动执行任务* -最有趣的部分是控制台输出 (console output) 你可以看到 Jenkins 是如何开始执行我们的 Gradle 项目 +最有趣的部分是控制台输出,你可以看到 Jenkins 是如何拉取代码并执行我们之前定义的 Gradle 项目,例如 clean。 - ![](https://cdn-images-1.medium.com/max/1000/1*dbtmlSr2owrj_CQfGXjdsw.png) +![](https://cdn-images-1.medium.com/max/1000/1*dbtmlSr2owrj_CQfGXjdsw.png) -控制台输出的开始 +*控制台输出的开始部分* -你要是做的正确的话,控制台将会有如下输出 (任何源连接问题,测试单元的失败都将导致构建不可用) +如果一切都正常的话,控制台将会有如下输出 (任何仓库连接问题,单元测试或 Android 测试的失败都将导致构建失败)。 +![](https://cdn-images-1.medium.com/max/1000/1*WpOH-aHuuNRDYmY710ecLQ.png) - ![](https://cdn-images-1.medium.com/max/1000/1*WpOH-aHuuNRDYmY710ecLQ.png) - -哈哈哈哈,构建成功,测试结果符合预期 +*哈哈哈哈,构建成功,测试结果符合预期* ### 第五步-SonarQube -这部分我会讲讲如何安装,配置 SonarQube 和使用 Docker 作为容器的 MySQL 数据库 +这部分我会讲讲如何安装、配置 SonarQube ,并配以使用 Docker 作为容器的 MySQL 数据库。 -[Continuous Code Quality | SonarQube -The leading open source platform for continuous code qualitywww.sonarqube.org][28][][29] +- [Continuous Code Quality | SonarQube][28] -SonarQube 是个代码静态分析工具,它可以帮助开发者写出干净,优雅的代码.它还可以跟踪代码规模,测试结果,功能需求等等.SonarQube检测到的问题可以使用插件十分容易的导入到 Android Studion/IntelliJ 中去. - -[JetBrains Plugin Repository :: SonarQube Community Plugin -Edit descriptionplugins.jetbrains.com][30][][31] +SonarQube 是个代码静态分析工具,它可以帮助开发者写出干净的代码、检测错误和学习最佳体验。它还可以跟踪代码覆盖、测试结果、功能需求等等。SonarQube 检测到的问题可以使用插件十分容易的导入到 Android Studion/IntelliJ 中去。 +- [JetBrains Plugin Repository :: SonarQube Community Plugin][30] #### 安装 Docker -安装 Docker 十分容易,按照下面的教程即可 +安装 Docker 十分容易,按照下面的教程即可: -[Install Docker on Ubuntu -Instructions for installing Docker on Ubuntudocs.docker.com][32][][33] +- [在 Ubuntu 上安装 Docker][32] -#### 生成容器 (Containers) +#### 生成容器 -MySQL: +**MySQL** -我们先搭建一个 MySQL5.7.17服务器容器,命名为 _mysqlserver.在你的家目录下建立一个本地文件夹,使用如下命令让服务在开机引导时候就被加载.把命令中的 YOUR_USER 和 YOUR_MYSQL_PASSWORD 替换为你自己账号密码. +我们先搭建一个 MySQL5.7.17 服务器容器,命名为 `mysqlserver`,它将在开机引导时启动,带有一个在你的家目录下的本地卷,带有密码,服务暴露在 localhost:3306 上(把命令中的 `YOUR_USER` 和 `YOUR_MYSQL_PASSWORD` 替换为你自己账号密码)。 ``` $ docker run --name mysqlserver --restart=always -v /home/YOUR_USER/mysqlVolume:/var/lib/mysql -e MYSQL_ROOT_PASSWORD=YOUR_MYSQL_PASSWORD -p 3306:3306 -d mysql:5.7.17 ``` +**phpMyAdmin** -phpMyAdmin: - -想要优雅简单地管理 MySQL服务器,我强烈推荐phpMyAdmin.你只要建立个容器,命名为 _phpmyadin,然后指向你的 mysqlserver容器,这样也会在开机引导时加载,你可以在 localhost:9090 找到它. +想要优雅简单地管理 MySQL服务器,我强烈推荐 phpMyAdmin。你只要建立个容器,命名为 `phpmyadmin`,然后链接到我们的 `mysqlserver` 容器,它会在开机引导时启动,它暴露在 localhost:9090。使用最新的版本。 ``` $ docker run --name phpmyadmin --restart=always --link mysqlserver:db -p 9090:80 -d phpmyadmin/phpmyadmin ``` -你可以在 localhost:9090 用你的 mysql 密码,以 root 身份登录,然后你需要创建一个数据库,_sonar_with_uft8_general_ci +你可以用你的 mysql 密码 `YOUR_MYSQL_PASSWORD` ,以 root 身份登录 localhost:9090 的 phpMyAdmin 界面,并创建一个数据库 sonar,使用`uft8_general_ci` 字符集。此外,也创建一个 sonar 的新用户,密码 `YOUR_SONAR_PASSWORD`,并给它 sonar 数据库的权限。 +**SonarQube** -SonarQube: -现在我们已经创建好了我们的 SonarQube 容器,就叫 sonarqube,它会自启动,自动连接我们的数据库,你可以在 localhost:9090 使用 5.6.4(长期技术支持)版本 +现在我们已经创建好了我们的 SonarQube 容器,就叫 `sonarqube`,它会在机器引导时启动,自动链接搭配我们的数据库,服务暴露在 localhost:9090,使用 5.6.4 版本。 ``` $ docker run --name sonarqube --restart=always --link mysqlserver:db -p 9000:9000 -p 9092:9092 -e "SONARQUBE_JDBC_URL=jdbc:mysql://db:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance" -e "SONARQUBE_JDBC_USER=sonar" -e "SONARQUBE_JDBC_PASSWORD=YOUR_SONAR_PASSWORD" -d sonarqube:5.6.4 ``` - #### 配置 SonarQube -如果你配置成功,你将在 localhost:9000 看到如下页面 +如果一起都正常,你将在 localhost:9000 看到如下页面: +![](https://cdn-images-1.medium.com/max/1000/1*tcgww8PENXdyrLS3K95ZEw.png) - ![](https://cdn-images-1.medium.com/max/1000/1*tcgww8PENXdyrLS3K95ZEw.png) - -好了,让我们来配置必要的插件和基本的配置文件 - -1. 在页面的右上角可以登录(默认的管理员账号和密码是 admin/admin) -2. 进入到管理员 (Administration),然后点击 System,接下来是 Updata Center,最后是 Updates Only - -* Update Java plugin if necessary +好了,让我们来配置必要的插件和基本的配置文件: +1. 在页面的右上角可以登录(默认的管理员账号和密码是 admin/admin)。 +2. 进入到 Administration,然后点击 System,接下来是 Updata Center,最后是 Updates Only。 + * 如果需要的话,更新 Java 插件。 3. 现在启用,并安装以下插件 - -* Android (provides Android lint rules) -* Checkstyle -* Findbugs -* XML - -4. 返回顶部,点击重启按钮完成整个安装. - + * Android (提供 Android lint 规则) + * Checkstyle + * Findbugs + * XML +4. 返回顶部,点击重启按钮完成整个安装。 #### SonarQube 配置文件 -我们刚刚安装的插件可以定义配置文件,这里有一套规则去衡量项目的代码质量 +我们刚刚安装的插件可以定义配置文件,可以用一套规则去衡量项目的代码质量。 -同一时间只有一个项目只能使用一个配置文件.但是我们可以抽象配置文件,让配置的实例集成这些规则(借用 OOP 概念),所以想在一个项目中灵活地使用配置,我们可以创建个性化配置,约束所有的配置. +同一时间一个项目只能使用一个配置文件。但是我们可以定义父配置文件并继承规则,所以要对我们的项目执行所有的规则,我们可以创建定制的配置文件并链状串联所有配置文件。 -就这么干,点击 Quality Profiles ,跳转到 Create ,然后命名,比如 CustomAndroidProfile +就这么干,点击 Quality Profiles ,跳转到 Create ,然后命名,比如 CustomAndroidProfile。 -将 Android Lint 作为父级,然后选择 Android Lint 配置,增加 FindBugs Security Minial 作为上一级,当你得到父级继承,并且设置 CustomAndroidProfile 作为默认主题的时候,你就完成了. +将 Android Lint 作为父级,然后选择 Android Lint 配置,增加 FindBugs Security Minial 作为上一级,继续此步骤,直到你完成父级继承方案,并且设置 CustomAndroidProfile 作为默认。 +![](https://cdn-images-1.medium.com/max/1000/1*w2CvH8uAOUcvajzjsOoCgQ.png) - ![](https://cdn-images-1.medium.com/max/1000/1*w2CvH8uAOUcvajzjsOoCgQ.png) - +*继承链* #### 运行 Sonarqube 分析器 -现在我们的 SonarQube 已经正式配置完毕,我们需要添加一个 Gradle 任务,_sonarqube_到我们的 Jenkins Job.我们在最后执行. +现在我们的 SonarQube 已经正式配置完毕,我们需要添加一个 Gradle 任务 `sonarqube` 到我们的 Jenkins 任务。我们在最后执行。 - ![](https://cdn-images-1.medium.com/max/1000/1*EDAjalNzmdU-ptjhWzuCcQ.png) +![](https://cdn-images-1.medium.com/max/1000/1*EDAjalNzmdU-ptjhWzuCcQ.png) -再次运行 Jenkins Job,一旦运行完毕,我们可以在 localhost:9090 中找到我们的 sonarQube 控制面板 +再次运行 Jenkins 任务,一旦运行完毕,我们可以在 localhost:9090 中看到我们的 sonarQube 控制面板。 +![](https://cdn-images-1.medium.com/max/1000/1*n7dKdPXyUPj1AZe6ujL3vw.png) - ![](https://cdn-images-1.medium.com/max/1000/1*n7dKdPXyUPj1AZe6ujL3vw.png) +*分析结果的显示* -分析结果的显示 +点击项目名称我们可以进入到不同的显示界面,最重要的可能就是问题界面了。 -长按项目名称我们可以进入到相应的显示界面,最重要的可能就是问题界面了 -我将展示一个空构造方法下的主要问题细节.就我个人而言,使用 SonarQube 最大的好处就是可以显示分析结果.这是一个学习编程十分有用的技能. +在下一屏,我将展示一个主要问题,它是一个空构造器方法。就我个人而言,使用 SonarQube 最大的好处就是当我点击“...”时可以在屏幕底部显示解释。这是一个学习编程十分有用的技能。 +![](https://cdn-images-1.medium.com/max/1000/1*KKM9T2qHzanraAetghYCqg.png) - ![](https://cdn-images-1.medium.com/max/1000/1*KKM9T2qHzanraAetghYCqg.png) +### 第六步 附加:配置其他 Android 应用 +想要配置 Android 应用得到覆盖率和 sonarqube 的结果,只要安装 JaCoCo 和 Sonarqube 插件就可以了。你也可以在我的示例中得到更多信息 -### 第六步 小贴士:配置其他 Android apps +- [pamartineza/helloJenkins][34] -想要配置 Android app 得到 sonarqube 结果,只要安装 JaCoCo和Sonarqube 插件就可以了.你也可以在我的示例中得到更多信息 +你也可以看看我在云上测试的文章: -[pamartineza/helloJenkins -helloJenkins - Hello Jenkins project for CI configuration testgithub.com][34][][35] +- [使用 Jenkins CI 服务器在云设备上运行 Android 测试][36] ### 最后 -啊,你终于走到头了,希望你觉得本文有点用处.你要是发现了任何错误,有任何疑问,别迟疑,赶紧评论.我拼了老命也要帮你.哦,忘了提醒,好东西要和朋友分享. +啊,你终于走到头了,希望你觉得本文有点用处。你要是发现了任何错误,有任何疑问,别迟疑,赶紧评论。我拼了老命也要帮你。哦,忘了提醒,好东西要和朋友分享。 -------------------------------------------------------------------------------- @@ -495,7 +434,7 @@ via: https://medium.com/@pamartineza/how-to-set-up-a-continuous-integration-serv 作者:[Pablo A. Martínez][a] 译者:[Taylor1024](https://github.com/Taylor1024) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 @@ -535,3 +474,4 @@ via: https://medium.com/@pamartineza/how-to-set-up-a-continuous-integration-serv [33]:https://docs.docker.com/engine/installation/linux/ubuntulinux/ [34]:https://github.com/pamartineza/helloJenkins [35]:https://github.com/pamartineza/helloJenkins +[36]:https://pamartinezandres.com/running-android-tests-on-cloud-devices-using-a-jenkins-ci-server-firebase-test-lab-amazon-device-b67cb4b16c40 \ No newline at end of file From c3bf7ecf7fb9d8cc3f16468394442820a38828c3 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 16 Jul 2017 21:19:17 +0800 Subject: [PATCH 0712/1407] PUB:20161228 How to set up a Continuous Integration server for Android development.md @Taylor1024 --- ... up a Continuous Integration server for Android development.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20161228 How to set up a Continuous Integration server for Android development.md (100%) diff --git a/translated/tech/20161228 How to set up a Continuous Integration server for Android development.md b/published/20161228 How to set up a Continuous Integration server for Android development.md similarity index 100% rename from translated/tech/20161228 How to set up a Continuous Integration server for Android development.md rename to published/20161228 How to set up a Continuous Integration server for Android development.md From a7eb8a549867c7d22ad81329ee5620a44c4aa73e Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 17 Jul 2017 08:52:09 +0800 Subject: [PATCH 0713/1407] translated --- ...get the work done – says Linus Torvalds.md | 56 ------------------- ...get the work done – says Linus Torvalds.md | 54 ++++++++++++++++++ 2 files changed, 54 insertions(+), 56 deletions(-) delete mode 100644 sources/talk/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md create mode 100644 translated/talk/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md diff --git a/sources/talk/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md b/sources/talk/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md deleted file mode 100644 index f8c8033476..0000000000 --- a/sources/talk/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md +++ /dev/null @@ -1,56 +0,0 @@ -translating----geekpi - -Talk of tech innovation is bullsh*t. Shut up and get the work done – says Linus Torvalds -============================================================ - -> A top life tip, there, from the Linux kernel chieftain - - ![Linus Torvalds at Open Source Leadership Summit](https://regmedia.co.uk/2017/02/15/linus_torvalds.jpg?x=648&y=348&crop=1) - -**OSLS** Linus Torvalds believes the technology industry's celebration of innovation is smug, self-congratulatory, and self-serving. - -The term of art he used was more blunt: "The innovation the industry talks about so much is bullshit," he said. "Anybody can innovate. Don't do this big 'think different'... screw that. It's meaningless. Ninety-nine per cent of it is get the work done." - -In a deferential interview at the [Open Source Leadership Summit][5] in California on Wednesday, conducted by Jim Zemlin, executive director of the Linux Foundation, Torvalds discussed how he has managed the development of the Linux kernel and his attitude toward work. - -"All that hype is not where the real work is," said Torvalds. "The real work is in the details." - -Torvalds said he subscribes to the view that successful projects are 99 per cent perspiration, and one per cent innovation. - -As the creator and benevolent dictator of the [open-source Linux kernel][6], not to mention the inventor of the Git distributed version control system, Torvalds has demonstrated that his approach produces results. It's difficult to overstate the impact that Linux has had on the technology industry. Linux is the dominant operating system for servers. Almost all high-performance computing runs on Linux. And the majority of mobile devices and embedded devices rely on Linux under the hood. - -The Linux kernel is perhaps the most successful collaborative technology project of the PC era. Kernel contributors, totaling more than 13,500 since 2005, are adding about 10,000 lines of code, removing 8,000, and modifying between 1,500 and 1,800 daily, according to Zemlin. And this has been going on – though not at the current pace – for more than two and a half decades. - -"We've been doing this for 25 years and one of the constant issues we've had is people stepping on each other's toes," said Torvalds. "So for all of that history what we've done is organize the code, organize the flow of code, [and] organize our maintainership so the pain point – which is people disagreeing about a piece of code – basically goes away." - -The project is structured so people can work independently, Torvalds explained. "We've been able to really modularize the code and development model so we can do a lot in parallel," he said. - -Technology plays an obvious role but process is at least as important, according to Torvalds. - -"It's a social project," said Torvalds. "It's about technology and the technology is what makes people able to agree on issues, because ... there's usually a fairly clear right and wrong." - -But now that Torvalds isn't personally reviewing every change as he did 20 years ago, he relies on a social network of contributors. "It's the social network and the trust," he said. "...and we have a very strong network. That's why we can have a thousand people involved in every release." - -The emphasis on trust explains the difficulty of becoming involved in kernel development, because people can't sign on, submit code, and disappear. "You shoot off a lot of small patches until the point where the maintainers trust you, and at that point you become more than just a guy who sends patches, you become part of the network of trust," said Torvalds. - -Ten years ago, Torvalds said he told other kernel contributors that he wanted to have an eight-week release schedule, instead of a release cycle that could drag on for years. The kernel developers managed to reduce their release cycle to around two and half months. And since then, development has continued without much fuss. - -"It's almost boring how well our process works," Torvalds said. "All the really stressful times for me have been about process. They haven't been about code. When code doesn't work, that can actually be exciting ... Process problems are a pain in the ass. You never, ever want to have process problems ... That's when people start getting really angry at each other." ® - --------------------------------------------------------------------------------- - -via: http://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_harder_says_linus_torvalds/ - -作者:[Thomas Claburn][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.theregister.co.uk/Author/3190 -[1]:https://www.reddit.com/submit?url=https://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_harder_says_linus_torvalds/&title=Talk%20of%20tech%20innovation%20is%20bullsh%2At.%20Shut%20up%20and%20get%20the%20work%20done%20%E2%80%93%20says%20Linus%20Torvalds -[2]:https://twitter.com/share?text=Talk%20of%20tech%20innovation%20is%20bullsh%2At.%20Shut%20up%20and%20get%20the%20work%20done%20%E2%80%93%20says%20Linus%20Torvalds&url=https://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_harder_says_linus_torvalds/&via=theregister -[3]:https://www.linkedin.com/shareArticle?mini=true&url=https://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_harder_says_linus_torvalds/&title=Talk%20of%20tech%20innovation%20is%20bullsh%2At.%20Shut%20up%20and%20get%20the%20work%20done%20%E2%80%93%20says%20Linus%20Torvalds&summary=A%20top%20life%20tip%2C%20there%2C%20from%20the%20Linux%20kernel%20chieftain -[4]:http://www.theregister.co.uk/Author/3190 -[5]:https://www.theregister.co.uk/2017/02/14/the_government_is_coming_for_your_code/ -[6]:https://www.kernel.org/ diff --git a/translated/talk/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md b/translated/talk/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md new file mode 100644 index 0000000000..9eb5d482ca --- /dev/null +++ b/translated/talk/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md @@ -0,0 +1,54 @@ +Linus Torvalds 说 - 谈技术创新是愚蠢的。闭上嘴把事情做好 +============================================================ + +> 来自 Linux 内核首领的最佳生活提示 + + ![Linus Torvalds at Open Source Leadership Summit](https://regmedia.co.uk/2017/02/15/linus_torvalds.jpg?x=648&y=348&crop=1) + +**OSLS** Linus Torvalds 认为,技术行业的创新庆祝活动是骄人的,自我的祝贺和自我服务的。 + +他所使用的艺术术语更为直率:“行业的创新如此之多都是胡说。” 他说:“任何人都可以创新,不要做这种‘不同思考’,这是无意义的,它们有百分之九十九是完成工作。” + +周三在加利福尼亚州的[开源领袖峰会] [5]中,Linux 基金会执行总监 Jim Zemlin 采访了 Linus,讨论了他如何管理 Linux 内核的开发和他对工作的态度。 + +Torvalds 说:“所有的炒作都不是真正的工作,真正的工作是细节。” + +Torvalds 表示赞成这样一个观点,即成功的项目是 99% 的汗水,百分之一的创新。 + +作为[开源 Linux 内核][6]的创造者和仁慈的独裁者,不用提还是 Git 分布式版本控制系统的发明者,Torvalds 已经证明他的方法产生了结果。很难夸大 Linux 对技术行业的影响。Linux 是服务器的主要操作系统。几乎所有的高性能计算都运行在 Linux 上。而大多数移动设备和嵌入式设备都依赖于 Linux。 + +Linux 内核可能是 PC 时代最成功的技术协作项目。根据 Zemlin 的说法,内核贡献者自 2005 年以来总共增加了 13,500 多个,其中每天大约增加 10,000 行代码,移除 8000 行代码,修改 1,500 到 1,800 行代码。而且这一直在继续 - 虽然不是一直以目前的速度 - 但这已经超过了二十五年。 + +Torvalds 说:“我们已经这样做了 25 年,而且我们遇到的一个常见问题是人们站在在对方的脚趾上。所以对于所有这些历史,我们所做的是组织代码,组织代码流,[以及]组织我们的维护在痛点上 - 人们对一段代码的不一致 - 基本上消失了。” + +Torvalds 解释说,该项目的结构使人们能够独立工作。他说:“我们已经能够真正模块化代码和开发模式,所以我们可以并行做很多事情。” + +Torvalds 说,技术起着明显的作用,但流程至少是同样重要的。 + +Torvalds说:“这是一个社会项目。这是关于技术,技术是让人们能够就问题达成一致的东西,因为...它通常有非常明确的对和错。” + +但是现在 Torvalds 并没有像 20 年前一样对每一个变化进行审查,而是依靠贡献者的社交网络。他说:“这是社交网络和信任,并且我们有一个非常强大的网络,这就是为什么我们可以有一千人参与到每个版本。” + +对信任的重视解释了参与内核开发的困难,因为人们无法登录,提交代码然后消失。Torvalds 说:“你要提交很多小的补丁直到维护者信任你,在这一点上,你不仅仅是一个提交补丁的人,而是成为信任网络的一部分。” + +十年前,Torvalds 表示,他告诉其他内核贡献者,他希望有一个八周的发布时间表,而不是可能拖延几年的发布周期。内核开发人员设法将其发布周期减少到大约两个半月。从那时起,发展一直没有太大的惊喜。 + +Torvalds 说:“说我们的流程有多好几乎是无聊的。对于我来说,所有真正紧张的时刻都是关于流程的,它们不有关代码,当代码不起作用时,这实际上是令人兴奋的...流程问题是很痛苦的。你永远不会想有流程问题...当人们开始对彼此生气时。” + +-------------------------------------------------------------------------------- + +via: http://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_harder_says_linus_torvalds/ + +作者:[Thomas Claburn][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.theregister.co.uk/Author/3190 +[1]:https://www.reddit.com/submit?url=https://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_harder_says_linus_torvalds/&title=Talk%20of%20tech%20innovation%20is%20bullsh%2At.%20Shut%20up%20and%20get%20the%20work%20done%20%E2%80%93%20says%20Linus%20Torvalds +[2]:https://twitter.com/share?text=Talk%20of%20tech%20innovation%20is%20bullsh%2At.%20Shut%20up%20and%20get%20the%20work%20done%20%E2%80%93%20says%20Linus%20Torvalds&url=https://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_harder_says_linus_torvalds/&via=theregister +[3]:https://www.linkedin.com/shareArticle?mini=true&url=https://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_harder_says_linus_torvalds/&title=Talk%20of%20tech%20innovation%20is%20bullsh%2At.%20Shut%20up%20and%20get%20the%20work%20done%20%E2%80%93%20says%20Linus%20Torvalds&summary=A%20top%20life%20tip%2C%20there%2C%20from%20the%20Linux%20kernel%20chieftain +[4]:http://www.theregister.co.uk/Author/3190 +[5]:https://www.theregister.co.uk/2017/02/14/the_government_is_coming_for_your_code/ +[6]:https://www.kernel.org/ From d8a9086688ae08f86f9b5dbe987a42bd2bc35a9f Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 17 Jul 2017 08:53:39 +0800 Subject: [PATCH 0714/1407] translating --- ...hiver automatically submits links to the Internet Archive.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md b/sources/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md index d90c70efc3..b7aaea1dd6 100644 --- a/sources/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md +++ b/sources/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md @@ -1,3 +1,5 @@ +translating---geekpi + LinkArchiver automatically submits links to the Internet Archive ============================================================ From fc2eaf64a4455606270f4a2ea163be640e1d2226 Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 18 Jul 2017 08:38:07 +0800 Subject: [PATCH 0715/1407] translated --- ...y submits links to the Internet Archive.md | 59 ------------------- ...y submits links to the Internet Archive.md | 58 ++++++++++++++++++ 2 files changed, 58 insertions(+), 59 deletions(-) delete mode 100644 sources/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md create mode 100644 translated/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md diff --git a/sources/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md b/sources/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md deleted file mode 100644 index b7aaea1dd6..0000000000 --- a/sources/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md +++ /dev/null @@ -1,59 +0,0 @@ -translating---geekpi - -LinkArchiver automatically submits links to the Internet Archive -============================================================ - -### Links shared on Twitter can be preserved in perpetuity with no effort on the user's part. - - -![LinkArchiver automatically submits links to the Internet Archive](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/internet_archive_building_sanfran.jpg?itok=pm9eVwbC "LinkArchiver automatically submits links to the Internet Archive") -Image credits :  - -Internet Archive HQ by Beatrice Murch; CC BY ([on Flickr][3]) - -The internet is forever, except when it isn't. "Link rot"—where once-valid links to websites become broken over time as pages move or sites go offline—is a real problem for people who try to do research online. The [Internet Archive ][4]helps solve this problem by making submitted content available in the "Wayback Machine." - -The difficulty, of course, is getting people to remember to submit links for archival. - -This is where Parker Higgins's new Twitter bot comes in. The [@LinkArchiver][5] account automatically submits links from accounts it follows to the Internet Archive. If a Twitter user follows [@LinkArchiver][6], it will follow back and continue to add links even if the user unfollows the bot. This means links shared on Twitter can be preserved in perpetuity with no effort on the user's part. - -The low-effort aspect is very appealing to Higgins. "I'm most excited by how passive the whole set-up is," he told Opensource.com. "If you rely on people to pick and choose what is  _important_  to archive, you miss a lot of the most important stuff. By just grabbing a copy of every link as it's posted, this bot should help ensure we don't end up missing that context." - -After initially developing the bot, Higgins contacted the Internet Archive. His concerns that the automation would cause problems were quickly dispelled. "It's effectively a rounding error in terms of the traffic they handle," he says, though he did give API requests a custom user-agent string at their request. The scalability concerns are on the Twitter side: The service limits an account's number of followers and the rate of new followers. This constrains the abilities on a single instance of LinkArchiver. - -Fortunately, LinkArchiver is available on [GitHub][7] under the AGPLv3 license. - -With a small server and a Twitter account, anyone can run this bot. Higgins envisions people running LinkArchiver instances that focus on a particular interest or social circle. "One thing that occurs to me is that you could turn off the follow-back behavior and curate the following list to a specific group or interest. For example, one bot could follow a group of friends or classmates, or major media outlets, or every U.S. Senator and Representative and archive the links they tweet." - -This is not Higgins's first foray into Twitter bots: [@securethenews][8], [@pomological][9], and the ever-popular [@choochoobot][10] are among his previous work. These bots are all write-only. LinkArchiver is the first interactive bot he has developed, which required learning several new skills. This effort was done as part of Higgins' participation in [Recurse Center][11], a 12-week retreat of sorts for programmers. - -Higgins encourages pull requests and additional instances of LinkArchiver bots. - --------------------------------------------------------------------------------- - -作者简介: - -Ben Cotton - Ben Cotton is a meteorologist by training and a high-performance computing engineer by trade. Ben works as a technical evangelist at Cycle Computing. He is a Fedora user and contributor, co-founded a local open source meetup group, and is a member of the Open Source Initiative and a supporter of Software Freedom Conservancy. - -via: https://opensource.com/article/17/7/linkarchiver-automatically-submits-links-internet-archive - -作者:[Ben Cotton ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/bcotton -[1]:https://opensource.com/article/17/7/linkarchiver-automatically-submits-links-internet-archive?rate=Z9DDX962B5JWk6LID_iia3S7H9s7ZMF8cGTVlNLvCs8 -[2]:https://opensource.com/user/30131/feed -[3]:https://www.flickr.com/photos/blmurch/5079018246/ -[4]:https://archive.org/ -[5]:https://twitter.com/linkarchiver -[6]:https://twitter.com/linkarchiver -[7]:https://github.com/thisisparker/linkarchiver -[8]:https://twitter.com/securethenews -[9]:https://twitter.com/pomological -[10]:https://twitter.com/choochoobot -[11]:https://www.recurse.com/ -[12]:https://opensource.com/users/bcotton -[13]:https://opensource.com/users/bcotton diff --git a/translated/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md b/translated/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md new file mode 100644 index 0000000000..7062df901a --- /dev/null +++ b/translated/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md @@ -0,0 +1,58 @@ +LinkArchiver 自动提交链接到 Internet Archive 中 +============================================================ + +### 在 Twitter 上分享的链接可以永久保存,用户不用担心。 + + +![LinkArchiver automatically submits links to the Internet Archive](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/internet_archive_building_sanfran.jpg?itok=pm9eVwbC "LinkArchiver automatically submits links to the Internet Archive") +图片版权:  + +Beatrice Murch 拍摄的 Inernet Archive 总部; CC BY ([on Flickr][3]) + +互联网是永远的,当发生下面的情况的就不是了。 “链接腐烂” - 当页面移动或者站点脱机,随着时间的流逝,到网站的有效链接就会断开 - 对于尝试在线研究的人来说,这是一个真正的问题。[Internet Archive][4]通过在“时光机”中提供提交的内容来帮助解决这个问题。 + +当然,困难的是让人们记得提交档案链接。 + +这就是 Parker Higgins 的新 Twitter 机器切入的地方。[@LinkArchiver][5] 会自动提交关注了 Internet Archive 的帐户提交的链接。如果一个 Twitter 用户关注了 [@LinkArchiver][6],它会回关,即使用户取消关注机器人,它也会继续添加链接。这意味着在 Twitter 上共享的链接可以永久保存,用户不用担心。 + +无需留意方面对 Higgins 非常有吸引力。他对 Opensource.com 说:“我对整个装置的被动程度非常激动。如果你依靠人们选择什么是_重要的_来存档,你会错过很多最重要的东西,只要抓住每个发表链接的副本,这个机器人应该有助于确保我们不会错过上下文。” + +在最初开发机器人之后,Higgins 联系了 Internet Archive。他对自动化造成问题的担忧很快被消除。尽管他在请求时给 API 请求一个自定义的用户代理字符串,但是他说:“他们处理的流量实际上是个舍入错误。”扩展性的问题在 Twitter 方面:服务限制了帐户的关注者数量和新关注者的比例。这限制了 LinkArchiver 的单个实例的能力。 + +幸运的是,LinkArchiver 以 AGPLv3 授权在 [GitHub][7] 上发布。 + +有了一台小的服务器和一个 Twitter 账号, 任何人都可以运行这个机器人。Higgins 设想人们运行一个关注特定的兴趣或社交圈子的 LinkArchiver 的实例。“发生在我身上的一件事是, 你可以关闭回关行为, 并关注特定的组或者兴趣。例如, 机器人可以关注一群朋友或同学, 或主要媒体, 或每一个美国参议员和代表, 并存档他们发表的 tweet。” + +这不是 Higgins 第一次写 Twitter 机器人:[@securethenews][8]、[@pomological][9]以及受欢迎的 [@choochoobot][10] 是他之前的作品。这些机器人都是只写的。 LinkArchiver 是他开发的第一个互动机器人,这需要学习几种新技能。这是 Higgins 参与[ Recurse Center][11] 的一部分,这是为程序员进行的为期 12 周的活动。 + +Higgins 鼓励 pull request 以及其他的 LinkArchiver 机器人实例。 + +-------------------------------------------------------------------------------- + +作者简介: + +Ben Cotton - Ben Cotton 是一个受训过的气象学家和一名高性能计算机工程师。Ben 在 Cycle Computing 做技术传教士。他是 Fedora 用户和贡献者,合作创办当地的一个开源集会,是一名开源倡议者和软件自由机构的支持者。他的推特 (@FunnelFiasco) + + +via: https://opensource.com/article/17/7/linkarchiver-automatically-submits-links-internet-archive + +作者:[Ben Cotton ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/bcotton +[1]:https://opensource.com/article/17/7/linkarchiver-automatically-submits-links-internet-archive?rate=Z9DDX962B5JWk6LID_iia3S7H9s7ZMF8cGTVlNLvCs8 +[2]:https://opensource.com/user/30131/feed +[3]:https://www.flickr.com/photos/blmurch/5079018246/ +[4]:https://archive.org/ +[5]:https://twitter.com/linkarchiver +[6]:https://twitter.com/linkarchiver +[7]:https://github.com/thisisparker/linkarchiver +[8]:https://twitter.com/securethenews +[9]:https://twitter.com/pomological +[10]:https://twitter.com/choochoobot +[11]:https://www.recurse.com/ +[12]:https://opensource.com/users/bcotton +[13]:https://opensource.com/users/bcotton From 80376dbfa6f66919417e69b3aee644ce69fd6225 Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 18 Jul 2017 08:40:33 +0800 Subject: [PATCH 0716/1407] translating --- .../20170705 No coding required Node-RED on a Raspberry Pi.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170705 No coding required Node-RED on a Raspberry Pi.md b/sources/tech/20170705 No coding required Node-RED on a Raspberry Pi.md index bad66b2cbc..28eb430978 100644 --- a/sources/tech/20170705 No coding required Node-RED on a Raspberry Pi.md +++ b/sources/tech/20170705 No coding required Node-RED on a Raspberry Pi.md @@ -1,3 +1,5 @@ +translating---geekpi + No coding required: Node-RED on a Raspberry Pi ============================================================ From 57e49864567aab887946347189e67608772ad926 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 18 Jul 2017 12:14:45 +0800 Subject: [PATCH 0717/1407] PRF:20170523 An introduction to Libral a systems management library for Linux.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 部分 --- ... a systems management library for Linux.md | 119 +++++------------- 1 file changed, 31 insertions(+), 88 deletions(-) diff --git a/translated/tech/20170523 An introduction to Libral a systems management library for Linux.md b/translated/tech/20170523 An introduction to Libral a systems management library for Linux.md index 905fe2168d..2cc45b63ae 100644 --- a/translated/tech/20170523 An introduction to Libral a systems management library for Linux.md +++ b/translated/tech/20170523 An introduction to Libral a systems management library for Linux.md @@ -1,82 +1,49 @@ -Translating by stevenzdg988. - -An introduction to Libral, a systems management library for Linux - -Libral,开源的 Linux 系统管理库 - +Libral 简介:开源的 Linux 系统管理库 ============================================================ -### Libral provides a uniform management API across system resources and serves as a solid foundation for scripting management tasks and building configuration-management systems. - -Libral 提供相同管理标准并通过系统提供的 API 接口,提供可靠地脚本管理任务的服务并且增加实时配置管理系统。 +> Libral 对系统资源和服务提供了一个统一的管理 API ,其可以作为脚本管理任务和配置管理系统的构建的坚实基础。 ![An introduction to Libral, a systems management library for Linux](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/yearbook-haff-rx-linux-file-lead_0.png?itok=48iDNoH8 "An introduction to Libral, a systems management library for Linux") ->Image by : [Internet Archive Book Images][10]. Modified by Opensource.com. CC BY-SA 4.0 -图像:[Internet Archive Book Images][10].修改:Opensource.com. CC BY-SA 4.0 +作为继承了 Unix 的传统的 Linux 操作系统,其并没有一个综合的系统管理 API 接口,相反,管理操作是通过多种特定用途的工具和 API 来实现的,其每一个都有自己约定和特有的风格。这就使得编写一个极其简单的系统管理任务脚本将变得很困难很脆弱。 -Linux, in keeping with Unix traditions, doesn't have a comprehensive systems management API. Instead, management is done through a variety of special-purpose tools and APIs, all with their own conventions and idiosyncrasies. That makes scripting even simple systems-management tasks difficult and brittle. - -Linux,保持了 Unix 的传统,但是没有一个综合管理系统的 API接口。相反,管理操作是通过多种特定的工具和 API 按照约定和特有的风格来实现的。这就使得编写一个极其简单的系统管理任务脚本将变得很困难很脆弱。 - -For example, changing the login shell of the "app" user is done by running **usermod -s /sbin/nologin app**. This works great until it is attempted on a system that does not have an app user. To fix the ensuing failure, the enterprising script writer might now resort to: - -举个例子来说,改变 “app” 登录的命令行方式的用户可以运行 "usermod -s /sbin/nologin app"。这个命令运行能够试图探测出这个系统没有这个 app 用户。为了修复接下来产生的错误,有事业心的脚本编写者可能凭借下面的脚本来解决: +举个例子来说,改变 “app” 用户的登录 shell 要运行 `usermod -s /sbin/nologin app`。这个命令运行的很好,除了系统上没有 “app” 用户的情况之外。为了修复这个例外错误,具有创新精神的脚本编写者也许要这样写: ``` -    grep -q app /etc/passwd \ -      && usermod -s /sbin/nologin app \ -      || useradd ... -s /sbin/nologin app +grep -q app /etc/passwd \ +  && usermod -s /sbin/nologin app \ +  || useradd ... -s /sbin/nologin app ``` -So that the change in the login shell is performed when the app user is present on the system, and the user is created if it is not present yet. Unfortunately, this approach to scripting systems-management tasks is not sustainable: For each kind of resource, a different set of tools and their idiosyncrasies must be taken into account; inconsistent and often incomplete error reporting makes error handling difficult; and it is easy to trip over small bugs caused by the ad hoc nature of the tools involved. +因此,当 “app” 用户存在于系统中时,会执行更改登录 shell 的操作;而当此用户不存在时,此用户就会被创建。不幸的是,这种利用编写系统管理任务脚本的途径是不适合的:对于每一种资源来说,就会有一套不同的工具,而且必须考虑其不同的使用惯例;不一致和经常性的不完备的错误报告将会使错误的处理变得困难;再者会因为工具所具有的本质特性引起的故障而导致执行失败。 -因此,当“app”用户在系统中存在时更改登录命令行的方式就被执行了,当此用户不存在时,此用户就被创建个。不幸的是,这种利用编写系统管理任务脚本的途径是不能被接受的:对于每一种资源来说,都必须有不同的设置工具和其特有的风格必须合并到一个用户账户;不一致和经常性的不完备的错误报告将会使错误的处理变得困难;再者会因为工具所具有的本质特性引起的故障而导致执行失败。 +实际上,以上所举的例子是不正确的:`grep` 并不是用来查找 “app” 用户的,它只能简单的查找文件 `/etc/passwd` 的一些行中是否有字符串 “app”,在大多数情况下它或许可以工作,但是也可能会在最关键的时刻出错。 -In fact, the above example is not correct: **grep** doesn't look for the **app** user, it simply looks for any line in **/etc/passwd** that contains the string **app**, something that might work most of the time, but can fail—usually at the worst possible moment. +很显然,管理工具不是执行简单的任务的脚本,充其量其也难以构成一个较大的管理系统。认识到这一点,现有的配置管理系统,比如 Puppet、Chef,及 Ansible,围绕基本的操作系统资源的管理竭尽全力的建立其内部 API 就是明智之举。这些资源由各自需要的密切相关的工具抽象成内部的 API。这不仅导致大量的重复性工作,也为尝试一个新的和创新管理工具设置了强大的障碍。 -实际上,以上所举的例子是不正确的:“grep” 不能用在查找 “app”用户的,它只能简单的查找文件“/etc/passwd”的一些行中是否有字符串“app”,在很多时候,会在最关键的时刻经常出错。 +在创建虚拟机或者容器镜像这一领域,这种障碍就变得非常明显:比如在创建镜像的过程中,就需要要么回答关于它们的简单问题,要么对其进行简单的更改。但是要使工具完成所有的任务就需要特殊的处理,这些问题和变化正好是一些人试图利用脚本解决的问题。因此,镜像构建要么依靠特定的脚本,要么需要使用(和安装)一个相当强大的配置管理系统。 -Clearly, management tools that make it hard to perform simple tasks from scripts are, at best, a difficult basis for larger management systems. Recognizing this, existing configuration-management systems, such as Puppet, Chef, or Ansible, have gone to great lengths to build their own internal APIs around the management of basic operating system resources. These resource abstractions are internal APIs, and closely tied to the needs of their respective tools. This causes not only a colossal duplication of effort, but also creates a strong barrier to entry for new and innovative management tools. - -很显然,管理工具很难从脚本执行简单的任务,在最好的情况下,对于一个较大的基础管理系统是困难的。认识到这一点,退出配置管理系统,比如 Puppet,Chef,及 Ansible,围绕基本操作系统资源管理竭尽全力的建立其内部的 API 就是明智的。这些资源由各自需要的密切相关的工具抽象成内部的 API。这不仅导致大量的重复性工作,也为尝试一个新的和创新管理工具设置了强大的障碍。 - -One area where this barrier to entry becomes evident is in building VM or container images: In the course of building such images, it is often necessary to either answer simple questions about them or make simple changes to them. But since the tools for this all require special treatment, these questions and changes face exactly the problems that somebody trying to script them faces. As a consequence, image building must rely on either ad hoc scripts or using (and installing) a quite substantial configuration-management system. - -突破创建虚拟机(VM)或者图像容器这一领域就变得非常清晰:比如在创建图像的过程中,要么回答关于其的简单问题要么对其进行简单的更改是非常必要的。但是要使工具完成所有的任务需要特殊的处理,这些问题和变化将遇到一些人试图利用脚本精确解决的问题。因此,图像构建要么依靠特定的脚本要么使用(安装)一个相当强大的配置管理系统。 - -[Libral][11] establishes a solid foundation for management tools and tasks by providing a common management API across system resources and by making it available through a command line tool, **ralsh**, that enables users to query and to modify system resources in a uniform way, with predictable error reporting. In the above example, checking whether the app user exists is done with **ralsh -aq user app**; checking whether the package **foo** is installed is done with **ralsh -aq package foo**; and, in general, checking whether a resource of type **TYPE** with name **NAME** is present is done with **ralsh -aq TYPE NAME**. Similarly, to create or change an existing user, one runs: - -Libral 将为管理工具和任务提供一个可靠的保证,通过系统资源提供通常管理的 API ,通过命令行工具是制作成为可能,"ralsh",允许用户按照相同的方法查询和修改系统资源,能够有可预见的错误报告。通过以上的举例,通过命令“ralsh -aq user app"检查“app”用户是否存在;通过”ralsh -aq package foo"检查“foo”包文件是否已经被安装;一般情况下,通过命令“ralsh -aq TYPE NAME"检查”NAME“是否是”TYPE“资源类型。类似的,创建和更改存在的用户,可以运行: +[Libral][11] 将为管理工具和任务提供一个可靠的保证,通过对系统资源提供一个公用的管理 API,并使其可以通过命令行工具 `ralsh` 使用,它允许用户按照相同的方法查询和修改系统资源,能够有可预见的错误报告。对以上的举例来说,可以通过命令 `ralsh -aq user app` 检查 “app” 用户是否存在;通过 `ralsh -aq package foo` 检查 “foo” 软件包是否已经被安装;一般情况下,通过命令 `ralsh -aq TYPE NAME` 检查 ”NAME“ 是否是 ”TYPE“ 资源类型。类似的,创建或更改存在的用户,可以运行: ``` -    ralsh user app home=/srv/app shell=/sbin/nologin +ralsh user app home=/srv/app shell=/sbin/nologin ``` -and to create or change an entry in **/etc/hosts**, one runs: - -接下来创建和修改入口文件 “/etc/hosts",可以运行命令: +接下来在文件 `/etc/hosts` 创建和修改条目,可以运行命令: ``` - ralsh hostmyhost.example.com ip=10.0.0.1 \ - host_aliases=myhost,apphost +ralsh hostmyhost.example.com ip=10.0.0.1 \ + host_aliases=myhost,apphost ``` -In this manner, the user of ralsh is isolated from the fact that these two commands work quite differently internally: The first one needs to use the proper invocation of **useradd** or **usermod**, whereas the second needs to edit the file **/etc/hosts**. For the user, though, they both appear to take the same shape: "Make sure that this resource is in the state that I need." - -以这种方式运行,用户的 ”ralsh“ 在内部运行是完全不同的,事实上是分离开执行的:第一步需要适当的调用命令”useradd“或者”usermod“,然而第二步需要在”/etc/hosts"文件中进行编辑。对于用户来说,他们似乎都采取同样的模型:“确保资源就是我所所需要的。” +以这种方式运行,“ralsh” 的用户事实上完全与那两个命令的内部运行工作机制相隔离:第一个需要适当的调用命令 `useradd` 或者 `usermod`,而第二个需要在 `/etc/hosts` 文件中进行编辑。而对于该用户来说,他们似乎都采取同样的模型:“确保资源处于我所需要的状态。” -### Where to get Libral and how to use it +### 怎样获取和使用 Libral 呢? -怎样获取和使用 Libral 呢? - - -Libral is available from [this git repo][12]. Its core is written in C++, and instructions for building it can be found [in the repo][13]. That is only necessary if you actually want to contribute to Libral's C++ core. The Libral site also contains a [prebuilt tarball][14] that can be used on any Linux machine that uses **glibc 2.12** or later. The contents of that tarball can be used both to explore ralsh further and to develop new providers, which give Libral the capability to manage new kinds of resources. - -Libral可以在[this git repo][12]找到并下载。核心是由C++编写的,创建他的说明可以在[in the repo][13]查找到。如果你真的想要为Libral 的 C++ 核心做贡献的话是很有必要的。Libral 的网站上包含了一个[prebuilt tarball][14],可以在任何 Linux 机器上使用“glibc 2.12”或者更高版本。可以使该“tarball”的内容链接进一步探究 ralsh 和开发新的供应商,这样做就使得 Libral 具备了管理新类型资源的能力。 +Libral 可以在[这个 git 仓库][12]找到并下载。其核心是由 C++ 编写的,构建它的说明可以[在该仓库中][13]找到,不过只是在你想要为 Libral 的 C++ 核心做贡献的时候才需要看它。Libral 的网站上包含了一个 [预构建的 tarball][14],可以用在任何使用 “glibc 2.12” 或者更高版本的 Linux 机器上。可以使用该 “tarball” 的内容进一步探究 ralsh 和开发新的提供者(provider),它使得 Libral 具备了管理新类型资源的能力。 After downloading and unpacking the tarball, the **ralsh** command can be found in **ral/bin**. Running it without arguments will list all resource types that Libral knows about. Passing the **--help **option prints output that contains more example of how to use **ralsh**. @@ -84,51 +51,26 @@ After downloading and unpacking the tarball, the **ralsh** command can be foun 下载完毕后解压“tarball”,“ralsh”命令就会生成在目录“ral/bin”下。运行这个不需要任何参数的命令就会将 Libral 所知道所有资源类型列举出来。利用“--help“选项打印输出关于”ralsh“更多的实例。 -### Relationship to configuration-management systems +### 与配置管理系统的关系 -如何配置管理系统 +知名的配置管理系统,如 Puppet、Chef 及 Ansible,解决了一些 Libral 所解决的同样的问题。将 Libral 与它们的区别是是它们所做大部分工作和 Libral 不同。配置管理系统被构建来处理跨大量节点的管理各种事物的多样复杂性。而另一方面 Libral 旨在提供一个定义明确的低级别的系统管理 API ,独立于任何特定的工具,可用于各种各样的编程语言。 +通过消除大型配置管理系统中包含的应用程序逻辑,Libral 在如何使用方面是非常万能的,从介绍里提及的简单的脚本任务,到作为构建复杂的管理应用的构建块。专注与这些基础层面也使其保持很小,目前不到 2.5 MB,这对于资源严重受限的环境,如容器和小型设备来说是一个重要考虑因素。 -Well-known configuration-management systems, such as Puppet, Chef, or Ansible, address some of the same problems that Libral addresses. What sets Libral apart from them is mostly in the things that these systems do and Libral doesn't. Configuration-management systems are built to deal with the variety and complexity of managing many different things across large numbers of nodes. Libral, on the other hand, aims at providing a low-level systems management API that is well-defined, independent of any particular tool, and usable with a wide variety of programming languages. +### Libral API -众所周知配置管理系统,如 Puppet,Chef,及 Ansible,地址等相同的问题是 Libral 的地址。这就是为什么一般将 Libral 与其他设置分离开的原因,即让系统去执行。配置管理系统被创建处理多样复杂的通过管理大量的节点的多事务管理行为。Libral,在另一方面,旨在提供一个低级别的定义明确的系统管理 API 独立于任何特定的工具,可用各种各样的编程语言进行设计。 +在过去的十年里,Libral API 的设计是由实现配置管理系统的经验所指导的,虽然它并没有直接绑定到它们其中任何一个应用上,但它考虑这些问题,做出选择克服它们的缺点。 -By removing the application logic that the large configuration-management systems contain, Libral is much more versatile in how it can be used, from the simple scripting tasks mentioned in the introduction, to serving as the building blocks for complex management applications. Focusing on these basics also allows it to be very small, currently less than 2.5 MB, an important consideration for resource-constrained environments, including containers and small devices. +在 API 设计中四个重要的原则: -通过消除大量的配置管理系统中包含的应用程序逻辑,Libral在怎样使用方面是非常万能的,从简单的脚本任务介绍中提到的,为构建复杂的管理应用程序块服务。专注与这些基础之外,还允许它很小,目前小于 2.5 MB,一个重要的考虑就是资源严重受限的环境包括容器和小型设备。 - -### The Libral API - -Libral API - -The design of the Libral API is guided by the experience of implementing large configuration-management systems over the last decade; while it is not directly tied to any of them, it takes them into account and makes choices to overcome their shortcomings. - -在过去的十年里,Libral API 设计指导下实施配置管理上的经验,虽然不是解绑定到其中任何一个应用上,但需要考虑这些问题,做出选择克服他们的缺点。 - - -There are four important principles that the API design rests on: - -四个重要的 API 设计原则 - -* Desired state  - -期望的声明 - -* Bidirectionality  - -双向性 - -* Lightweight abstractions - -轻量级的抽象 - -* Ease of extension - -平行程式扩展 +* 期望的状态 +* 双向性 +* 轻量级抽象 +* 易于扩展 Basing a management API on desired state, i.e., the idea that the user expresses what the system should look like after an operation rather than how to get into that state, is hardly controversial at this point. Bidirectionality makes it possible to use the same API and, more importantly, the same resource abstractions to read existing state and to enforce changes to it. Lightweight abstractions ensure that it is easy to learn the API and make use of it quickly; past attempts at such management APIs have unduly burdened the user with learning a modeling framework, an important factor in their lack of adoption. -给予期望状态管理API,举个例子来说,这个理解应该是当用户在一个操作执行后希望系统看起来是什么表达方式,而不是怎么进入这个状态,在这一点上很难引起争议。双向性使得使用相同的 API 成为可能,更重要的是,相同的资源抽象成读取已经存在的和强制改变它。轻量级的抽象行为确保能容易的学习和快速的使用API;过去尝试管理 API 的方式已经过度的加重了学习框架建模的使用者的负担了,一个重要的因素是他们的接受力缺乏。 +基于期望的状态的管理 API,举个例子来说,这个理解应该是当用户在一个操作执行后希望系统看起来是什么表达方式,而不是怎么进入这个状态,在这一点上很难引起争议。双向性使得使用相同的 API 成为可能,更重要的是,相同的资源抽象成读取已经存在的和强制改变它。轻量级的抽象行为确保能容易的学习和快速的使用API;过去尝试管理 API 的方式已经过度的加重了学习框架建模的使用者的负担了,一个重要的因素是他们的接受力缺乏。 Finally, it has to be easy to extend Libral's management capabilities so that users can teach Libral how to manage new kinds of resources. This is important both because of the sheer amount of resources that one might want to manage (and that Libral will manage in due time), as well as because even a fully built-out Libral will always fall short of a user's custom management needs. @@ -281,6 +223,7 @@ If any of this has made you curious, I would love to hear from you, be it in the 如果这让你很好奇,我很想听听你的想法,可以使推拉请求的方式,可以是增强请求方式,亦或者报告你对“ralsh”测试的经验体验。 +(题图:[Internet Archive Book Images][10],修改:Opensource.com. CC BY-SA 4.0) -------------------------------------------------------------------------------- 作者简介: From b8319c38dee145f4a3d5c441eb53dc0dd5fb1aef Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 18 Jul 2017 12:53:01 +0800 Subject: [PATCH 0718/1407] PRF&PUB:20170209 Inside Real-Time Linux.md @geekpi --- .../20170209 Inside Real-Time Linux.md | 38 +++++++++---------- 1 file changed, 19 insertions(+), 19 deletions(-) rename {translated/tech => published}/20170209 Inside Real-Time Linux.md (65%) diff --git a/translated/tech/20170209 Inside Real-Time Linux.md b/published/20170209 Inside Real-Time Linux.md similarity index 65% rename from translated/tech/20170209 Inside Real-Time Linux.md rename to published/20170209 Inside Real-Time Linux.md index 400a48eb29..4e178d0a94 100644 --- a/translated/tech/20170209 Inside Real-Time Linux.md +++ b/published/20170209 Inside Real-Time Linux.md @@ -4,55 +4,55 @@ ![Jan Altenberg](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/jan-altenberg-elc.png?itok=mgQeKpEK "Jan Altenberg") -实时 Linux 在过去十年中已经走了很长的路。Linutronix 的 Jan Altenberg 提供了对该主题做了概述,并在 ELC Europe 的视频中提供了新的 RTL 性能基准。[Linux基金会] [1] +> 实时 Linux 在过去十年中已经走了很长的路。Linutronix 的 Jan Altenberg 提供了对该主题做了概述,并在 ELC Europe 的视频中提供了新的 RTL 性能基准。 -实时 Linux(RTL)是一种启用 PREEMPT_RT 的主线 Linux,在过去十年中已经走了很长的路。大约 80% 的确定性 [PREEMPT_RT][3] 补丁现在可用于主线内核本身。然而, Linux 上单内核 RTL 的最强大的替代品-双内核 Xenomai-继续声称在减少延迟上有巨大的优势。在 10 月的 [欧洲嵌入式 Linux 会议][4]的演示中,Jan Altenberg 反驳了这些声明,同时对实时主题做了论述。 +实时 Linux(RTL)是一种启用 PREEMPT_RT 的主线 Linux,在过去十年中已经走了很长的路。大约 80% 的确定性的 [PREEMPT_RT][3] 补丁现在可用于主线内核本身。然而,Linux 上单内核 RTL 的最强大的替代品——双内核 Xenomai——继续声称在减少延迟上有巨大的优势。在去年 10 月的 [欧洲嵌入式 Linux 会议][4]的演讲中,Jan Altenberg 反驳了这些声明,同时对实时主题做了论述。 -德国嵌入式开发公司 [Linutronix][5] 的 Altenberg 并不否认 Xenomai 和 RTAI 等双核方法提供较低的延迟。然而,他揭示了新的 Linutronix 基准,旨在表明差异不如所声称的那样大,特别是在现实世界中。更少争议地,他认为 RTL 更易于开发和维护。 +德国嵌入式开发公司 [Linutronix][5] 的 Altenberg 并不否认 Xenomai 和 RTAI 等双核方法提供较低的延迟。然而,他揭示了新的 Linutronix 基准,旨在表明差异不如所声称的那样大,特别是在实际使用中。争议较少的是,他认为 RTL 更易于开发和维护。 -在我们深入永恒的 Xenomai 对 RTL 的辩论之前,请注意,2015 年 10 月,RTL 项目的[开源自动化开发实验室][6](OSADL)[将控制权][7]转移给了管理 Linux.com 的 Linux 基金会。此外,Linutronix 是 RTL 项目的主要贡献者,并承担了 x86 的维护者。 +在我们深入永恒的 Xenomai 与 RTL 的辩论之前,请注意,2015 年 10 月,[开源自动化开发实验室][6](OSADL)将 RTL 项目的[控制权][7]转移给了管理 Linux.com 的 Linux 基金会。此外,Linutronix 是 RTL 项目的主要贡献者,并承担了 x86 的维护者。 -RTL 的进步是过去十年中 Linux 从实时操作系统(RTOS)中[获得市场占有率][8]的几个原因之一。实时操作系统在微控制器上比应用处理器上更频繁出现,并且在缺乏高级用户级操作系统(如Linux)的单用途设备上实现实时很简单。 +RTL 的进步是过去十年中 Linux 从实时操作系统(RTOS)中[获得市场占有率][8]的几个原因之一。实时操作系统在微控制器上比应用处理器上更频繁出现,并且在缺乏高级用户级操作系统(如 Linux)的单用途设备上实现实时很简单。 -Altenberg 通过清除关于实时确定性内核方案的一些常见的误解开始他的演讲。Altenberg 告诉他的 ELCE 观众:“实时不是快速执行或性能,这基本上是决定论和定时保证。实时为你提供保证,某些内容将在给定的时间内执行。你不想要尽可能快,但是要尽块指定。” +Altenberg 通过清除关于实时确定性的内核方案的一些常见的误解开始他的演讲。Altenberg 告诉他的 ELCE 观众:“实时不是快速执行,这基本上是决定论和定时保证。实时为你提供保证某些内容将在给定的时间内执行。你不想要尽可能快,但是要尽快指定。” -在给定的执行时间内的迟缓的反应会导致严重后果,特别是当它可能导致人们受到伤害时,开发人员往往会使用实时的方式。这就是为什么实时性仍然在很大程度上受到工厂自动化行业的驱动,并且越来越多地出现在汽车、火车和飞机上。然而,并不总是生死攸关的情况 - 金融服务公司使用 RTL 进行高频交易。 +在给定的执行时间内的迟缓的反应会导致严重后果,特别是当它可能导致人们受到伤害时,开发人员往往会使用实时的方式。这就是为什么实时性仍然在很大程度上受到工厂自动化行业的推动,并且越来越多地出现在汽车、火车和飞机上。然而,并不总是生死攸关的情况 - 金融服务公司使用 RTL 进行高频交易。 -Altenberg 说:“实时需求包括确定性定时表现、抢占、优先级继承和优先级上限。最重要的要求是高优先级任务总是需要能够抢占低优先级的任务。” +Altenberg 说:“实时需求包括确定性的定时行为、抢占、优先级继承和优先级上限。最重要的要求是高优先级任务总是需要能够抢占低优先级的任务。” Altenberg 强烈建议不要使用术语“软实时”来描述轻量级实时解决方案。“你可以是确定性的或者不是,但两者之间什么也没有。” ### 双内核实时 -像 Xenomai 和 RTAI 这样的双内核方案部署了一个与单独的 Linux 内核并行运行的微内核,而像 RTL 这样的单内核方案使得 Linux 本身能够实时运行。Altenberg 说:“使用双内核,当优先级实时程序不在微内核上运行时,Linux 可以获得一些运行时间。 “问题是有人需要维护微内核并在新的硬件上支持它。这需要巨大的努力,并且它的开发社区不是很大。另外,由于 Linux 不直接在硬件上运行,所以你需要一个硬件抽象层(HAL)。有两件事要维护,你通常会落后主流内核一步。” +像 Xenomai 和 RTAI 这样的双内核方案部署了一个与单独的 Linux 内核并行运行的微内核,而像 RTL 这样的单内核方案使得 Linux 本身能够实时运行。Altenberg 说:“使用双内核,当优先级实时程序不在微内核上运行时,Linux 可以获得一些运行时间。 “问题是人们需要维护微内核并在新的硬件上支持它。这需要巨大的努力,并且它的开发社区不是很大。另外,由于 Linux 不直接在硬件上运行,所以你需要一个硬件抽象层(HAL)。有两件事要维护,你通常会落后主流内核一步。” -Altenberg说:“RTL 的挑战以及花了这么久才出现的原因是,要使 Linux 实时,你基本要修改每个内核文件。” 然而,大部分工作已经完成并合并到主线,开发人员不需要维护一个微内核或 HAL。 +Altenberg说:“RTL 的挑战以及花了这么久才出现的原因是,要使 Linux 实时,你基本要修改每个内核文件。” 然而,大部分工作已经完成并合并到主线,开发人员并不需要维护一个微内核或 HAL。 Altenberg 继续解释了 RTAI 和 Xenomai 之间的差异。“使用 RTAI,你将编写一个由微内核调度的内核模块。这就像内核开发 - 真的很难深入,很难调试。” RTAI 的开发可能会更加复杂,因为工业用户通常希望包括封闭的源代码以及 GPL 内核代码。 Altenberg 说:“你必须决定哪些部分可以进入用户态,哪些部分可以通过实时的方式进入内核。” -RTAI 还支持比 RTL 更少的硬件平台,特别是 x86 之外。双核内核 Xenomai 将 RTAI 作为主要的双内核方式,比 RTAI 具有更大的操作系统支持。更重要的是,Altenberg说:“它提供了“在用户空间中进行实时的合适解决方案。要做到这一点,他们实现了皮肤的概念 - 一个用于不同 RTOS 的 API 的仿真层,比如 POSIX。这使你可以重用一些 RTOS 中的现有代码的子集。” +RTAI 与 RTL 想必支持更少的硬件平台,特别是 x86 之外。双内核 Xenomai 将 RTAI 作为主要的双内核方式,比 RTAI 具有更大的操作系统支持。更重要的是,Altenberg 说:“它提供了“在用户空间中进行实时的合适解决方案。要做到这一点,他们实现了皮肤的概念 - 一个用于不同 RTOS 的 API 的仿真层,比如 POSIX。这使你可以重用一些 RTOS 中的现有代码的子集。” 然而,使用 Xenomai,你仍然需要维护一个单独的微内核和 HAL。有限的开发工具是另一个问题。Altenberg说:“与 RTAI 一样,你不能使用标准的 C 库。你需要专门的工具和库。即使对于 POSIX 来说,你也必须链接到 POSIX 层,这更复杂。” 他补充说,任何一个平台,很难将超过 8 到 16 个 CPU 的微内核扩展到金融服务中使用的大型服务器集群。 ### 睡眠自旋锁 -主要的单内核解决方案是基于 PREEMPT.RT 的 RTL,它主要由 Thomas Gleixner 和 IngoMolnár 在十多年前开发。PREEMPT.RT 重新生成内核的 “spinlock” 锁定原语,以最大化 Linux 内核中的可抢占部分。(PREEMPT.RT 最初称为睡眠自旋锁补丁。) +主要的单内核解决方案是基于 PREEMPT.RT 的 RTL,它主要由 Thomas Gleixner 和 IngoMolnár 在十多年前开发。PREEMPT.RT 重新生成内核的 “spinlock” 锁定原语,以最大化 Linux 内核中的可抢占部分。(PREEMPT.RT 最初称为睡眠自旋锁补丁) -PREEMPT.RT 不是在硬中断环境中运行中断处理程序,而是在内核线程中运行它们。Altenberg 说:“当一个中断到达时,你不会运行中断处理程序代码。你只是唤醒相应的内核线程,它运行处理程序。这有两个优点:内核线程可以中断,并且它会显示在具有 PID 的进程列表中。所以你可以把低优先级的放在不重要的中断上,高优先级的放在重要的用户态任务上。” +PREEMPT.RT 不是在硬中断环境中运行中断处理程序,而是在内核线程中运行它们。Altenberg 说:“当一个中断到达时,你不会运行中断处理程序代码。你只是唤醒相应的内核线程,它运行处理程序。这有两个优点:内核线程可以中断,并且它会显示在进程列表中,有自己的 PID。所以你可以把低优先级的放在不重要的中断上,高优先级的放在重要的用户态任务上。” -由于大约 80% 的 PREEMPT.RT 已经在主线上,任何 Linux 开发人员都可以使用 PREEMPT.RT 发起的内核组件,如定时器、中断处理程序、跟踪基础架构和优先级继承。Altenberg说:“当他们制作实时 Linux 时,一切都变得可以抢占,所以我们发现了很多竞争条件和锁定问题。我们修复了这些,并把它们推送到主线,以提高 Linux 的稳定性。” +由于大约 80% 的 PREEMPT.RT 已经在主线上,任何 Linux 开发人员都可以使用面向 PREEMPT.RT 的内核组件,如定时器、中断处理程序、跟踪基础架构和优先级继承。Altenberg说:“当他们制作实时 Linux 时,一切都变得可以抢占,所以我们发现了很多竞争条件和锁定问题。我们修复了这些,并把它们推送到主线,以提高 Linux 的稳定性。” 因为 RTL 主要在 Linux 主线上,Altenberg 说:“PREEMPT.RT 被广泛接受,拥有庞大的社区。如果你编写一个实时应用程序,你不需要知道很多关于 PREEMPT.RT 的知识。你不需要任何特殊的库或 API,只需要标准的 C 库、Linux 驱动程序和 POSIX 程序。” -你仍然需要运行一个补丁来使用 PREEMPT.RT,它每隔两个 Linux 版本更新。然而,在两年内,剩下的 20% 的 PREEMPT.RT 应该会进入 Linux,所以你就“不再需要补丁”了。 +你仍然需要运行一个补丁来使用 PREEMPT.RT,它每隔两个 Linux 版本更新一次。然而,在两年内,剩下的 20% 的 PREEMPT.RT 应该会进入 Linux,所以你就“不再需要补丁”了。 -最后,Altenberg 透露了他的 Xenomai 对 RTL 延迟测试的结果。Altenberg说:“有很多论文声称 Xenomai 和 RTAI 的延迟比 PREEMPT.RT 更小。但是我认为大部分时候是 PREEMPT.RT 配置不好。所以我们带来了一个 Xenomai 专家和一个 PREEMPT.RT 专家,让他们配置自己的平台。” +最后,Altenberg 透露了他的 Xenomai 对 RTL 延迟测试的结果。Altenberg说:“有很多论文声称 Xenomai 和 RTAI 的延迟比 PREEMPT.RT 更小。但是我认为大部分时候是 PREEMPT.RT 配置不好的问题。所以我们带来了一个 Xenomai 专家和一个 PREEMPT.RT 专家,让他们配置自己的平台。” -Altenberg 称,虽然 Xenomai 在大多数测试中表现更好,并且有更少的抖动,但是差异不如一些 Xenomai 加速器称的高出 300% 至 400% 的延迟优势。当用户空间任务执行测试时,Altenberg 说这是最现实的、最重要的是测试,最糟糕的情况下 Xenomai和 RTL/PREEMPT.RT 都是 90 到 95 微秒的反应时间。 +Altenberg 称,虽然 Xenomai 在大多数测试中表现更好,并且有更少的性能抖动,但是差异不如一些 Xenomai 拥护者声称的高达 300% 至 400% 的延迟优势。当用户空间任务执行测试时,Altenberg 说这是最现实的、最重要的是测试,最糟糕的情况下 Xenomai和 RTL/PREEMPT.RT 都是 90 到 95 微秒的反应时间。 -当他们在双 Cortex-A9 系统中隔离单个 CPU 来处理中断时,Altenberg 表示这相当普遍,PREEMPT.RT 执行得更好,大约80微秒。(有关详细信息,请查看大约 33 分钟的视频。) +当他们在双 Cortex-A9 系统中隔离单个 CPU 来处理中断时,Altenberg 表示这相当普遍,PREEMPT.RT 执行得更好,大约80微秒。(有关详细信息,请查看大约第 33 分钟的视频。) Altenberg 承认与 OSADL 的两到三年测试相比,他的 12 小时测试是最低标准,而且它不是一个“数学证明”。无论如何,考虑到 RTL 更简单的开发流程,它都值得一试。他总结说:“在我看来,将完整功能的 Linux 系统与微内核进行比较是不公平的。” @@ -62,7 +62,7 @@ via: https://www.linux.com/news/event/open-source-summit-na/2017/2/inside-real-t 作者:[ERIC BROWN][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/) 荣誉推出 From ddee42fbe01bde3da00899dc48ae6a8faf3374e0 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 18 Jul 2017 18:33:26 +0800 Subject: [PATCH 0719/1407] PRF&PUB:20170714 LinkArchiver automatically submits links to the Internet Archive.md @geekpi --- ...y submits links to the Internet Archive.md | 60 +++++++++++++++++++ ...y submits links to the Internet Archive.md | 58 ------------------ 2 files changed, 60 insertions(+), 58 deletions(-) create mode 100644 published/20170714 LinkArchiver automatically submits links to the Internet Archive.md delete mode 100644 translated/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md diff --git a/published/20170714 LinkArchiver automatically submits links to the Internet Archive.md b/published/20170714 LinkArchiver automatically submits links to the Internet Archive.md new file mode 100644 index 0000000000..318de15e9a --- /dev/null +++ b/published/20170714 LinkArchiver automatically submits links to the Internet Archive.md @@ -0,0 +1,60 @@ +LinkArchiver:自动提交链接给互联网档案(Internet Archive) +============================================================ + +> 在 Twitter 上分享的链接可以永久保存,用户不用担心。 + + +![LinkArchiver automatically submits links to the Internet Archive](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/internet_archive_building_sanfran.jpg?itok=pm9eVwbC "LinkArchiver automatically submits links to the Internet Archive") + + +互联网是永远的,当发生下面的情况的就不是了。 “链接腐烂” - 当页面移动或者站点脱机,随着时间的流逝,到网站的有效链接就会断开 - 对于尝试在线做研究的人来说,这是一个真正的问题。[互联网档案馆(Internet Archive)][4]通过在它的“时光机(Wayback Machine)”中提供提交的内容来帮助解决这个问题。 + +当然,困难的是让人们记得提交档案链接。 + +这就是 Parker Higgins 的新 Twitter 机器人所切入的地方。[@LinkArchiver][5] 会自动提交关注了[互联网档案馆(Internet Archive)][4]的帐户所提交的链接。如果一个 Twitter 用户关注了 [@LinkArchiver][6],它会回关,即使用户取消关注机器人,它也会继续添加链接。这意味着在 Twitter 上共享的链接可以永久保存,用户不用担心。 + +无需留意这个方面对 Higgins 非常有吸引力。他对 Opensource.com 说:“我对整个装置的被动程度非常在意。如果你依靠人们选择什么是_重要的_来存档,你会错过很多最重要的东西,只要抓取每个发表链接的副本,这个机器人应该有助于确保我们不会错过上下文。” + +在最初开发机器人之后,Higgins 联系了[互联网档案馆(Internet Archive)][4]。他对自动化造成问题的担忧很快被消除。尽管他在请求时给 API 请求用了一个自定义的用户代理字符串,但是他说:“他们处理的流量实际上是个舍入错误。”扩展性的问题在 Twitter 方面:其服务限制了帐户的关注者数量和新关注者的比例。这限制了 LinkArchiver 的单个实例的能力。 + +幸运的是,LinkArchiver 以 AGPLv3 授权在 [GitHub][7] 上发布。 + +有了一台小的服务器和一个 Twitter 账号, 任何人都可以运行这个机器人。Higgins 设想人们运行一个关注特定的兴趣或社交圈子的 LinkArchiver 的实例。“发生在我身上的一件事是,你可以关闭回关行为,并关注特定的组或者兴趣。例如,机器人可以关注一群朋友或同学,或主要媒体,或每一个美国参议员和代表,并存档他们发表的 tweet。” + +这不是 Higgins 第一次写 Twitter 机器人:[@securethenews][8]、[@pomological][9] 以及受欢迎的 [@choochoobot][10] 是他之前的作品。这些机器人都是只写的。 LinkArchiver 是他开发的第一个互动机器人,这需要学习几种新技能。这是 Higgins 参与 [Recurse Center][11] 的一部分,这是为程序员进行的为期 12 周的活动。 + +Higgins 鼓励大家的拉取请求以及其他的 LinkArchiver 机器人实例。 + +(题图:Beatrice Murch 拍摄的 Inernet Archive 总部; CC BY ([on Flickr][3])) + +-------------------------------------------------------------------------------- + +作者简介: + +Ben Cotton - Ben Cotton 是一个受训过的气象学家和一名高性能计算机工程师。Ben 在 Cycle Computing 做技术传教士。他是 Fedora 用户和贡献者,合作创办当地的一个开源集会,是一名开源倡议者和软件自由机构的支持者。他的推特 (@FunnelFiasco) + + +--- + +via: https://opensource.com/article/17/7/linkarchiver-automatically-submits-links-internet-archive + +作者:[Ben Cotton][a] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/bcotton +[1]:https://opensource.com/article/17/7/linkarchiver-automatically-submits-links-internet-archive?rate=Z9DDX962B5JWk6LID_iia3S7H9s7ZMF8cGTVlNLvCs8 +[2]:https://opensource.com/user/30131/feed +[3]:https://www.flickr.com/photos/blmurch/5079018246/ +[4]:https://archive.org/ +[5]:https://twitter.com/linkarchiver +[6]:https://twitter.com/linkarchiver +[7]:https://github.com/thisisparker/linkarchiver +[8]:https://twitter.com/securethenews +[9]:https://twitter.com/pomological +[10]:https://twitter.com/choochoobot +[11]:https://www.recurse.com/ +[12]:https://opensource.com/users/bcotton +[13]:https://opensource.com/users/bcotton diff --git a/translated/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md b/translated/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md deleted file mode 100644 index 7062df901a..0000000000 --- a/translated/tech/20170714 LinkArchiver automatically submits links to the Internet Archive.md +++ /dev/null @@ -1,58 +0,0 @@ -LinkArchiver 自动提交链接到 Internet Archive 中 -============================================================ - -### 在 Twitter 上分享的链接可以永久保存,用户不用担心。 - - -![LinkArchiver automatically submits links to the Internet Archive](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/internet_archive_building_sanfran.jpg?itok=pm9eVwbC "LinkArchiver automatically submits links to the Internet Archive") -图片版权:  - -Beatrice Murch 拍摄的 Inernet Archive 总部; CC BY ([on Flickr][3]) - -互联网是永远的,当发生下面的情况的就不是了。 “链接腐烂” - 当页面移动或者站点脱机,随着时间的流逝,到网站的有效链接就会断开 - 对于尝试在线研究的人来说,这是一个真正的问题。[Internet Archive][4]通过在“时光机”中提供提交的内容来帮助解决这个问题。 - -当然,困难的是让人们记得提交档案链接。 - -这就是 Parker Higgins 的新 Twitter 机器切入的地方。[@LinkArchiver][5] 会自动提交关注了 Internet Archive 的帐户提交的链接。如果一个 Twitter 用户关注了 [@LinkArchiver][6],它会回关,即使用户取消关注机器人,它也会继续添加链接。这意味着在 Twitter 上共享的链接可以永久保存,用户不用担心。 - -无需留意方面对 Higgins 非常有吸引力。他对 Opensource.com 说:“我对整个装置的被动程度非常激动。如果你依靠人们选择什么是_重要的_来存档,你会错过很多最重要的东西,只要抓住每个发表链接的副本,这个机器人应该有助于确保我们不会错过上下文。” - -在最初开发机器人之后,Higgins 联系了 Internet Archive。他对自动化造成问题的担忧很快被消除。尽管他在请求时给 API 请求一个自定义的用户代理字符串,但是他说:“他们处理的流量实际上是个舍入错误。”扩展性的问题在 Twitter 方面:服务限制了帐户的关注者数量和新关注者的比例。这限制了 LinkArchiver 的单个实例的能力。 - -幸运的是,LinkArchiver 以 AGPLv3 授权在 [GitHub][7] 上发布。 - -有了一台小的服务器和一个 Twitter 账号, 任何人都可以运行这个机器人。Higgins 设想人们运行一个关注特定的兴趣或社交圈子的 LinkArchiver 的实例。“发生在我身上的一件事是, 你可以关闭回关行为, 并关注特定的组或者兴趣。例如, 机器人可以关注一群朋友或同学, 或主要媒体, 或每一个美国参议员和代表, 并存档他们发表的 tweet。” - -这不是 Higgins 第一次写 Twitter 机器人:[@securethenews][8]、[@pomological][9]以及受欢迎的 [@choochoobot][10] 是他之前的作品。这些机器人都是只写的。 LinkArchiver 是他开发的第一个互动机器人,这需要学习几种新技能。这是 Higgins 参与[ Recurse Center][11] 的一部分,这是为程序员进行的为期 12 周的活动。 - -Higgins 鼓励 pull request 以及其他的 LinkArchiver 机器人实例。 - --------------------------------------------------------------------------------- - -作者简介: - -Ben Cotton - Ben Cotton 是一个受训过的气象学家和一名高性能计算机工程师。Ben 在 Cycle Computing 做技术传教士。他是 Fedora 用户和贡献者,合作创办当地的一个开源集会,是一名开源倡议者和软件自由机构的支持者。他的推特 (@FunnelFiasco) - - -via: https://opensource.com/article/17/7/linkarchiver-automatically-submits-links-internet-archive - -作者:[Ben Cotton ][a] -译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/bcotton -[1]:https://opensource.com/article/17/7/linkarchiver-automatically-submits-links-internet-archive?rate=Z9DDX962B5JWk6LID_iia3S7H9s7ZMF8cGTVlNLvCs8 -[2]:https://opensource.com/user/30131/feed -[3]:https://www.flickr.com/photos/blmurch/5079018246/ -[4]:https://archive.org/ -[5]:https://twitter.com/linkarchiver -[6]:https://twitter.com/linkarchiver -[7]:https://github.com/thisisparker/linkarchiver -[8]:https://twitter.com/securethenews -[9]:https://twitter.com/pomological -[10]:https://twitter.com/choochoobot -[11]:https://www.recurse.com/ -[12]:https://opensource.com/users/bcotton -[13]:https://opensource.com/users/bcotton From c5d6b02909ca033448570d6dfd1647451a379425 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 18 Jul 2017 19:48:57 +0800 Subject: [PATCH 0720/1407] PRF&PUB:20161006 Go Serverless with Apex and Composes MongoDB.md @xiaow6 --- ...rverless with Apex and Composes MongoDB.md | 72 ++++++++++--------- 1 file changed, 39 insertions(+), 33 deletions(-) rename {translated/tech => published}/20161006 Go Serverless with Apex and Composes MongoDB.md (60%) diff --git a/translated/tech/20161006 Go Serverless with Apex and Composes MongoDB.md b/published/20161006 Go Serverless with Apex and Composes MongoDB.md similarity index 60% rename from translated/tech/20161006 Go Serverless with Apex and Composes MongoDB.md rename to published/20161006 Go Serverless with Apex and Composes MongoDB.md index 35e3341ff7..db7c9198e1 100644 --- a/translated/tech/20161006 Go Serverless with Apex and Composes MongoDB.md +++ b/published/20161006 Go Serverless with Apex and Composes MongoDB.md @@ -1,35 +1,40 @@ +使用 Apex 和 Compose MongoDB 开发 serverless +============ -# 使用 Apex 和 Compose's MongoDB 开发 serverless +Apex 是一个将开发和部署 AWS Lambda 函数的过程打包了的工具。它提供了一个本地命令行工具来创建安全上下文、部署函数,甚至追踪云端日志。由于 AWS Lambda 服务将函数看成独立的单元,Apex 提供了一个框架层将一系列函数作为一个项目。另外,它将服务拓展到不仅仅是 Java,Javascript 和 Ptyhon 语言,甚至包括 Go 语言。 -_Apex 是一个将开发和部署 AWS Lambda 函数的过程打包了的工具。它提供了一个本地命令行工具来创建安全上下文,部署函数,甚至追踪云端日志。由于 AWS Lambda 服务将函数看成独立的单元,Apex 提供了一个框架层将一系列函数作为一个项目。另外,它将服务拓展到不仅仅是 Java,Javascript 和 Ptyhon,更例如Go语言。_ +两年前 Express (基本上是 NodeJS 事实标准上的网络框架层)的作者,[离开][12]了 Node 社区,而将其注意力转向 Go (谷歌创造的后端服务语言),以及 Lambda(由 AWS 提供的函数即服务)。尽管一个开发者的行为无法引领一股潮流,但是来看看他正在做的名叫 [Apex][13] 项目会很有趣,因为它可能预示着未来很大一部分网络开发的改变。 -两年前 Express (基本上是 NodeJS 实际的网络框架层)的作者,离开了 Node 社区,而将其注意力转向 Go,谷歌创造的后端服务语言,以及 Lambda, 由 AWS 提供的函数即服务。尽管一个开发者的行为无法引领一股潮流,但是来看看他正在做的名叫 [Apex][13] 项目会很有趣,因为它可能预示着未来很大一部分网络开发的改变。 -##### 什么是 Lambda? +### 什么是 Lambda? -如今,人们如果不能运行自己的硬件,他们会选择付费使用一些云端的虚拟服务器。在云上,他们 -部署一个完整的协议栈如 Node,Express, 和一个自定义应用。或者如果他们探索了更远,使用了诸如 Heroku 或者 Bluemix 之类的新玩意,也可能在某些已经预配置好 Node 的容器中仅仅通过部署应用代码来部署他们完整的应用。 +如今,人们如果不能使用自己的硬件,他们会选择付费使用一些云端的虚拟服务器。在云上,他们会部署一个完整的协议栈如 Node、Express,和一个自定义应用。或者如果他们更进一步使用了诸如 Heroku 或者 Bluemix 之类的新玩意,也可能在某些已经预配置好 Node 的容器中仅仅通过部署应用代码来部署他们完整的应用。 -在这个抽象阶梯上的下一步是来单独部署函数到云端而不是一个完整的应用。这些函数之后可以被一大堆外部事件触发。例如,AWS 的 API 网关服务可以将代理 HTTP 请求作为触发函数的事件,而函数即服务供应方根据要求执行匹配的函数。 +在这个抽象的阶梯上的下一步是单独部署函数到云端而不是一个完整的应用。这些函数之后可以被一大堆外部事件触发。例如,AWS 的 API 网关服务可以将代理 HTTP 请求作为触发函数的事件,而函数即服务(FaaS)的供应方根据要求执行匹配的函数。 -###### 从 Apex 开始 +### Apex 起步 -Apex 是一个将 AWS 命令行接口封装起来的命令行工具。因此,开始使用 Apex 的第一步就是确保你已经安装和配置了的从 AWS 获取的命令行工具(详情请查看 [AWS CLI Getting Started][14]或者 [Apex documentation][15])。 +Apex 是一个将 AWS 命令行接口封装起来的命令行工具。因此,开始使用 Apex 的第一步就是确保你已经安装和配置了从 AWS 获取的命令行工具(详情请查看 [AWS CLI Getting Started][14] 或者 [Apex documentation][15])。 接下来,安装 Apex: -`curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh` +``` +curl https://raw.githubusercontent.com/apex/apex/master/install.sh | sh +``` 然后为你的新项目创建一个目录并运行: -`apex init` +``` +apex init +``` - ![apexInit](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620758/nzjk1pi1rce1yarbp6xl.png) +![apexInit](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620758/nzjk1pi1rce1yarbp6xl.png) -这步会配置好一些必须的安全策略,并且将项目名字赋在函数名后,因为 Lambda 使用扁平化的命名空间。同时它也会创建一些配置文件 拥有一个 “Hello World" 风格的 Javascript 函数的functions 目录。 +这步会配置好一些必须的安全策略,并且将项目名字附在函数名后,因为 Lambda 使用扁平化的命名空间。同时它也会创建一些配置文件和默认的 “Hello World" 风格的 Javascript 函数的 functions 目录。 - ![tree](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620765/bbsb8h6nkc9nx2qs0foa.png) +![tree](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620765/bbsb8h6nkc9nx2qs0foa.png) Apex/Lambda 一个非常友好的特性是创建函数非常直观。创建一个以你函数名为名的新目录,然后在其中创建项目。如果想要使用 Go 语言,你可以创建一个叫 `simpleGo` 的目录然后在其中创建一个小型的 `main` 函数: + ``` // serverless/functions/simpleGo/main.go package main @@ -56,45 +61,43 @@ func main() { } ``` -Node 是 Lambda 支持的运行环境,Apex 使用 NodeJS shim 来调用由上述程序产生的二进制文件。它将 `event` 传入二进制文件的 STDIN,将从二进制返回的 STDOUT 作为`value`。通过 STDERR 来显示 log。`apex.HandleFunc` 用来为你管理所有的管道。事实上在 Unix 惯例里这是一个非常简单的解决方案。你甚至可以通过在本地命令行执行 `go run main.go` 来测试它。 +Node 是 Lambda 所支持的运行环境,Apex 使用 NodeJS shim 来调用由上述程序产生的二进制文件。它将 `event` 传入二进制文件的 STDIN,将从二进制返回的 STDOUT 作为 `value`。通过 STDERR 来显示日志。`apex.HandleFunc` 用来为你管理所有的管道。事实上在 Unix 惯例里这是一个非常简单的解决方案。你甚至可以通过在本地命令行执行 `go run main.go` 来测试它。 - ![goRun](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620784/ddb0vkcef50pnjgfdqn7.png) +![goRun](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620784/ddb0vkcef50pnjgfdqn7.png) -通过 Apex 向云端部署稍显琐碎:![apexDeploy](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620790/x6l8qg2vticpxhzi7kl3.png) +通过 Apex 向云端部署稍显琐碎: + +![apexDeploy](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620790/x6l8qg2vticpxhzi7kl3.png) - 注意,这将会对你的函数指定命名空间,控制版本,甚至为其他多开发环境如 `staging` 和 `production`配置`env`。 +注意,这将会对你的函数指定命名空间,控制版本,甚至为其他多开发环境如 `staging` 和 `production`配置`env`。 通过 `apex invoke` 在云端执行也比较琐碎: ![apexInvoke](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620796/jccxskukvy5utgegy2hr.png) +当然我们也可以追踪一些日志: -当然我们也可以追踪一些日志: ![apexLog](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620802/ym3z6w8ojmrq7pucr5bp.png) +![apexLog](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620802/ym3z6w8ojmrq7pucr5bp.png) 这些是从 AWS CloudWatch 返回的结果。它们都在 AWS 的 UI 中可见,但是当在另一个终端参照此结果来署它会更快。 -##### 窥探内部的秘密 - +### 窥探内部的秘密 来看看它内部到底部署了什么很具有指导性。Apex 将 shim 和所有需要用来运行函数的东西打包起来。另外,它会提前做好配置如入口与安全条例: - ![lambdaConfig](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620812/zz6qwocvuhhl4lq6bf4p.png) +![lambdaConfig](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620812/zz6qwocvuhhl4lq6bf4p.png) Lambda 服务实际上接受一个包含所有依赖的 zip 压缩包,它会被部署到服务器来执行指定的函数。我们可以使用 `apex build ` 在本地创建一个压缩包用来在以后解压以探索。 - ![apexBuild](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620818/ybidaj2i2ijurjbcqrx2.png) - +![apexBuild](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620818/ybidaj2i2ijurjbcqrx2.png) 这里的 `_apex_index.js handle` 函数是原始的入口。它会配置好一些环境变量然后进入 `index.js`。 而 `index.js` 孕育一个 `main` Go 的二进制文件的子进程并且将所有关联联结在一起。 - - -##### 使用 `mgo` 继续深入 - +### 使用 `mgo` 继续深入 `mgo` 是 Go 语言的 MongoDB 驱动。使用 Apex 来创建一个函数来连接到 Compose 的 MongoDB 就如同我们已经学习过的 `simpleGo` 函数一样直观。这里我们会通过增加一个 `mgoGo` 目录和另一个 `main.go` 来创建一个新函数。 @@ -154,14 +157,17 @@ func main() { } ``` +发布部署,我们可以通过使用正确类型的事件来模拟调用了一个 API: - 发布部署,我们可以通过使用正确类型的事件来模拟调用了一个 API:![apexMgo](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620829/jeprb3r6qrgjkzblkhho.png) +![apexMgo](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620829/jeprb3r6qrgjkzblkhho.png) - 最终结果是 `insert` 到在 [Compose 之上 的MongoDB][16] 中。![composeDeploy](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620833/vdy8hjiwxpe02evgqwcm.png) +最终结果是 `insert` 到在 [Compose 之上 的 MongoDB][16] 中。 -##### 还有更多…… +![composeDeploy](https://res.cloudinary.com/dyyck73ly/image/upload/v1475620833/vdy8hjiwxpe02evgqwcm.png) -尽管目前我们已经涉及了 Apex 的方方面面,但是仍然有很多值得我们去探索的东西。它还和 [Terraform][17] 进行了整合。如果你真的希望,你可以发布一个多语言项目包括 Javascript,Java, Python 以及 Go。你也可以为开发、策划以及量产配置多种环境。你可以调整运行资源如调整存储大小和运行时间来调整成本。而且你可以把函数勾连到 API 网关上来传输一个 HTTP API 或者使用一些类似 SNS (简单通知服务)来为云端的函数创建管道。 +### 还有更多…… + +尽管目前我们已经涉及了 Apex 的方方面面,但是仍然有很多值得我们去探索的东西。它还和 [Terraform][17] 进行了整合。如果你真的希望,你可以发布一个多语言项目包括 Javascript、Java、Python 以及 Go。你也可以为开发、演示以及产品环境配置多种环境。你可以调整运行资源如调整存储大小和运行时间来调整成本。而且你可以把函数勾连到 API 网关上来传输一个 HTTP API 或者使用一些类似 SNS (简单通知服务)来为云端的函数创建管道。 和大多数事物一样,Apex 和 Lambda 并不是在所有场景下都完美。 但是,在你的工具箱中增加一个完全不需要你来管理底层建设的工具完全没有坏处。 @@ -177,7 +183,7 @@ via: https://www.compose.com/articles/go-serverless-with-apex-and-composes-mongo 作者:[Hays Hutton][a] 译者:[xiaow6](https://github.com/xiaow6) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From ac7ea29a79d159e0dfaa2c9d08e1a439c1f33a71 Mon Sep 17 00:00:00 2001 From: bigdimple <786796696@qq.com> Date: Wed, 19 Jul 2017 00:12:24 +0800 Subject: [PATCH 0721/1407] bigdimple translating Two great uses for teh cp command --- sources/tech/20170705 Two great uses for the cp command.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170705 Two great uses for the cp command.md b/sources/tech/20170705 Two great uses for the cp command.md index ade899d29b..c7d9eda069 100644 --- a/sources/tech/20170705 Two great uses for the cp command.md +++ b/sources/tech/20170705 Two great uses for the cp command.md @@ -1,3 +1,4 @@ +【big_dimple翻译中】 Two great uses for the cp command ============================================================ From 89c8f49212d96eaf72db97c85b8cce98646cbb97 Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 19 Jul 2017 08:41:39 +0800 Subject: [PATCH 0722/1407] translated --- ...ing required Node-RED on a Raspberry Pi.md | 105 ------------------ ...ing required Node-RED on a Raspberry Pi.md | 101 +++++++++++++++++ 2 files changed, 101 insertions(+), 105 deletions(-) delete mode 100644 sources/tech/20170705 No coding required Node-RED on a Raspberry Pi.md create mode 100644 translated/tech/20170705 No coding required Node-RED on a Raspberry Pi.md diff --git a/sources/tech/20170705 No coding required Node-RED on a Raspberry Pi.md b/sources/tech/20170705 No coding required Node-RED on a Raspberry Pi.md deleted file mode 100644 index 28eb430978..0000000000 --- a/sources/tech/20170705 No coding required Node-RED on a Raspberry Pi.md +++ /dev/null @@ -1,105 +0,0 @@ -translating---geekpi - -No coding required: Node-RED on a Raspberry Pi -============================================================ - -### Check out this tutorial to see how easy it is to set up hardware flows with Node-RED's drag-and-drop interface. - - -![No coding required: Node-RED on a Raspberry Pi](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/hardware_hammer_sign.jpg?itok=vh76LBib "No coding required: Node-RED on a Raspberry Pi") -Image by :  - -Thomas Hawk on [Flickr][12]. [CC BY-NC 2.0][13]. Modified by Opensource.com - -Node-RED is a programming tool that lets you quickly connect hardware devices using a browser-based editor. It comes with a wide range of nodes that can be used to build flows in a drag-and-drop manner, significantly reducing your development time. [Node-RED][14] is installed with Raspian Jessie for Raspberry Pi, and there is also an option to download Node-RED separately. - -More on Raspberry Pi - -* [Our latest on Raspberry Pi][1] - -* [What is Raspberry Pi?][2] - -* [Getting started with Raspberry Pi][3] - -* [Send us your Raspberry Pi projects and tutorials][4] - -To show you how it works, we'll build a simple tool using Node-RED to communicate with a cellular modem connected to a Raspberry Pi. With cellular modems, you can send/receive data from your Raspberry Pi over a cellular network. You can use one of the 3G/4G USB dongles commonly available through cellular network providers, or you can connect a development board with a 3G or 4G wireless modem. - -Whether you're connecting with a USB dongle or a development board, the connection interface to the Raspberry Pi is through a USB port. In this tutorial, I'm connecting a [SIM900][15] development board to Raspberry Pi through a USB-to-serial converter cable. - -### [node_red1.png][5] - -![Connecting SIM900 to Raspberry Pi through a USB-to-serial converter cable](https://opensource.com/sites/default/files/u128651/node_red1.png "Connecting SIM900 to Raspberry Pi through a USB-to-serial converter cable") - -The first step is to check that the SIM900 development board is connected to the Raspberry Pi. - -### [node_red2a.png][6] - -![Checking that the SIM900 development board is connected](https://opensource.com/sites/default/files/u128651/node_red2a.png "Checking that the SIM900 development board is connected") - -The USB-to-serial adapter shows up here as one of the USB devices connected to the Raspberry Pi. - -Next, check the USB port number the SIM900 board is connected to. - -### [node_red3a.png][7] - -![Checking the SIM900 board's USB port number](https://opensource.com/sites/default/files/u128651/node_red3a.png "Checking the SIM900 board's USB port number") - -In the last line above, you can see that the SIM900 board (connected through the USB-to-serial converter) is connected to **ttyUSB0** on the Raspberry Pi. Now we're ready to start using Node-RED. - -Launch Node-RED on the Raspberry Pi. - -### [node_red4a.png][8] - -![​​​​Launching Node-RED in Raspberry Pi](https://opensource.com/sites/default/files/u128651/node_red4a.png "​​​​Launching Node-RED in Raspberry Pi") - -Download this [sample flow][16] and import it into Node-RED. Note that the flow file is a JSON representation of the graphical UI. - -The imported flow should look like this in Node-RED: - -### [node_red5.png][9] - -![The imported flow in Node-RED](https://opensource.com/sites/default/files/u128651/node_red5.png "The imported flow in Node-RED") - -Injection nodes set up [AT commands][17] required to query the modem. The **Add Newline**function node appends **\r\n** to the AT commands passed from the injection nodes. Output from **Add Newline** is then wired to the **Serial Out** node, which writes data to the serial port. The AT command response from the modem is read through the **Serial In** node, which outputs the response to the **Debug **window. Make sure the serial port number and port speed are configured in both the **Serial In** and **Serial Out** nodes. - -Node-RED is an easy-to-use programming tool that can be used to quickly integrate and test hardware devices. As you can see from this tutorial, connecting and testing a cellular mode with Raspberry Pi using Node-RED required no coding at all. - -For more information about Node-RED and other ways it can be used, visit [the project's website][18]. - --------------------------------------------------------------------------------- - -作者简介: - -Surya G - My interest is in software development for IOT projects especially those that uses cellular modems. - - -via: https://opensource.com/article/17/7/nodered-raspberrypi-hardware - -作者:[ Surya G ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/gssm2m -[1]:https://opensource.com/tags/raspberry-pi?src=raspberry_pi_resource_menu1 -[2]:https://opensource.com/resources/what-raspberry-pi?src=raspberry_pi_resource_menu2 -[3]:https://opensource.com/article/16/12/getting-started-raspberry-pi?src=raspberry_pi_resource_menu3 -[4]:https://opensource.com/article/17/2/raspberry-pi-submit-your-article?src=raspberry_pi_resource_menu4 -[5]:https://opensource.com/file/359036 -[6]:https://opensource.com/file/359086 -[7]:https://opensource.com/file/359091 -[8]:https://opensource.com/file/359716 -[9]:https://opensource.com/file/359056 -[10]:https://opensource.com/article/17/7/nodered-raspberrypi-hardware?rate=NjMvod1gAOI2Tf9t0YLr-4tbe_K1XWfHWNjVkTkPuzU -[11]:https://opensource.com/user/137861/feed -[12]:https://www.flickr.com/photos/thomashawk/3048157616/in/photolist-5DmB4E-BzrZ4-5aUXCN-nvBWYa-qbkwAq-fEFeDm-fuZxgC-dufA8D-oi8Npd-b6FiBp-7ChGA3-aSn7xK-7NXMyh-a9bQQr-5NG9W7-agCY7E-4QD9zm-7HLTtj-4uCiHy-bYUUtG -[13]:https://creativecommons.org/licenses/by-nc/2.0/ -[14]:https://nodered.org/ -[15]:http://m2msupport.net/m2msupport/simcom-sim900-gprs-2g-module/ -[16]:http://m2msupport.net/m2msupport/wp-content/themes/admired/Node-RED/modem_commands -[17]:http://m2msupport.net/m2msupport/software-and-at-commands-for-m2m-modules/ -[18]:https://nodered.org/ -[19]:https://opensource.com/users/gssm2m -[20]:https://opensource.com/users/gssm2m diff --git a/translated/tech/20170705 No coding required Node-RED on a Raspberry Pi.md b/translated/tech/20170705 No coding required Node-RED on a Raspberry Pi.md new file mode 100644 index 0000000000..c477cc20ab --- /dev/null +++ b/translated/tech/20170705 No coding required Node-RED on a Raspberry Pi.md @@ -0,0 +1,101 @@ +不需要编码:树莓派上的 Node-RED +============================================================ + +### 查看本教程,看看使用 Node-RED 的拖放界面设置硬件流是多么容易。 + +![No coding required: Node-RED on a Raspberry Pi](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/hardware_hammer_sign.jpg?itok=vh76LBib "No coding required: Node-RED on a Raspberry Pi") +图片提供:  + +Thomas Hawk 的 [Flickr][12]. [CC BY-NC 2.0][13]. Opensource.com 修改 + +Node-RED 是一个编程工具,可让你使用基于浏览器的编辑器快速连接硬件设备。它具有大量的节点,可以拖放的方式构建流程,这大大减少了开发时间。[Node-RED][14] 会与树莓派的 Raspian Jessie 一起安装,你还可以独立下载 Node-RED。 + +更多关于Raspberry Pi + +* [我们最新的树莓派][1] + +* [什么是树莓派?][2] + +* [开始使用树莓派][3] + +* [给我们发送你的树莓派项目和教程][4] + +为了向你展示它如何工作,我们将使用 Node-RED 构建一个简单的工具,与连接到树莓派的蜂窝调制解调器通信。使用蜂窝调制解调器,你可以通过蜂窝网络从你的树莓派发送/接收数据。你可以使用蜂窝网络提供商通常提供的 3G/4G USB 加密狗,也可以将开发板与 3 G或 4G 无线调制解调器连接。 + +无论你是连接 USB 加密狗还是开发板,树莓派的连接接口都是通过 USB 端口。在本教程中,我将一块 [SIM900][15] 开发板通过一根 USB 转串行电缆连接到树莓派。 + +### [node_red1.png][5] + +![Connecting SIM900 to Raspberry Pi through a USB-to-serial converter cable](https://opensource.com/sites/default/files/u128651/node_red1.png "Connecting SIM900 to Raspberry Pi through a USB-to-serial converter cable") + +第一步是检查 SIM900 开发板是否连接到树莓派上。 + +### [node_red2a.png][6] + +![Checking that the SIM900 development board is connected](https://opensource.com/sites/default/files/u128651/node_red2a.png "Checking that the SIM900 development board is connected") + +USB 转串行适配器在这里显示为连接到树莓派的 USB 设备之一。 + +接下来,检查 SIM900 连接的 USB 端口号。 + +### [node_red3a.png][7] + +![Checking the SIM900 board's USB port number](https://opensource.com/sites/default/files/u128651/node_red3a.png "Checking the SIM900 board's USB port number") + +在最后一行,你可以看到 SIM900 板(通过 USB 转串行转换器连接)连接到了树莓派上的 **ttyUSB0**。现在我们准备开始使用 Node-RED。 + +在树莓派上启动 Node-RED。 + +### [node_red4a.png][8] + +![​​​​Launching Node-RED in Raspberry Pi](https://opensource.com/sites/default/files/u128651/node_red4a.png "​​​​Launching Node-RED in Raspberry Pi") + +下载[示例流图][16]并将其导入到 Node-RED 中。请注意,流文件是图形 UI 的 JSON 表示形式。 + +在 Node-RED 中,导入的流图应该看上去像这样: + +### [node_red5.png][9] + +![The imported flow in Node-RED](https://opensource.com/sites/default/files/u128651/node_red5.png "The imported flow in Node-RED") + +注入节点设置 [ AT 命令][17]需要查询调制解调器。**添加换行** 功能节点将注入节点传递过来的 AT 命令后面附加 **\r\n**。**添加换行** 的输出然后连接到**串行输出**节点,它将数据写入串行端口。来自调制解调器的 AT 命令响应通过 **串行输入** 节点读取,该节点将响应输出到 **调试** 窗口。确认串行端口号和端口速度在 **串行输入** 和 **串行输出** 节点中的配置。 + +Node-RED 是一种易于使用的编程工具,可用于快速集成和测试硬件设备。从本教程可以看出,使用 Node-RED 连接和测试使用树莓派的蜂窝模式不需要编码。 + +有关 Node-RED 和其他可以使用的方式的更多信息,请访问[项目网站][18]。 + +-------------------------------------------------------------------------------- + +作者简介: + +Surya G - 我的兴趣是为物联网项目尤其是使用蜂窝调制解调器的项目做软件开发。 + +via: https://opensource.com/article/17/7/nodered-raspberrypi-hardware + +作者:[ Surya G ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/gssm2m +[1]:https://opensource.com/tags/raspberry-pi?src=raspberry_pi_resource_menu1 +[2]:https://opensource.com/resources/what-raspberry-pi?src=raspberry_pi_resource_menu2 +[3]:https://opensource.com/article/16/12/getting-started-raspberry-pi?src=raspberry_pi_resource_menu3 +[4]:https://opensource.com/article/17/2/raspberry-pi-submit-your-article?src=raspberry_pi_resource_menu4 +[5]:https://opensource.com/file/359036 +[6]:https://opensource.com/file/359086 +[7]:https://opensource.com/file/359091 +[8]:https://opensource.com/file/359716 +[9]:https://opensource.com/file/359056 +[10]:https://opensource.com/article/17/7/nodered-raspberrypi-hardware?rate=NjMvod1gAOI2Tf9t0YLr-4tbe_K1XWfHWNjVkTkPuzU +[11]:https://opensource.com/user/137861/feed +[12]:https://www.flickr.com/photos/thomashawk/3048157616/in/photolist-5DmB4E-BzrZ4-5aUXCN-nvBWYa-qbkwAq-fEFeDm-fuZxgC-dufA8D-oi8Npd-b6FiBp-7ChGA3-aSn7xK-7NXMyh-a9bQQr-5NG9W7-agCY7E-4QD9zm-7HLTtj-4uCiHy-bYUUtG +[13]:https://creativecommons.org/licenses/by-nc/2.0/ +[14]:https://nodered.org/ +[15]:http://m2msupport.net/m2msupport/simcom-sim900-gprs-2g-module/ +[16]:http://m2msupport.net/m2msupport/wp-content/themes/admired/Node-RED/modem_commands +[17]:http://m2msupport.net/m2msupport/software-and-at-commands-for-m2m-modules/ +[18]:https://nodered.org/ +[19]:https://opensource.com/users/gssm2m +[20]:https://opensource.com/users/gssm2m From f5dffc722983652d01626fb2f3481a37f0aa03bb Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 19 Jul 2017 08:48:00 +0800 Subject: [PATCH 0723/1407] translating --- ...ELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md b/sources/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md index c39d8e4176..c4f08ff871 100644 --- a/sources/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md +++ b/sources/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md @@ -1,3 +1,5 @@ +translating---geekpi + HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX ============================================================ From 734bc9e8e314c3aed1a9de67247aff625e35ed2c Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 19 Jul 2017 10:33:53 +0800 Subject: [PATCH 0724/1407] PRF&PUB:20170705 No coding required Node-RED on a Raspberry Pi.md @geekpi --- ...ing required Node-RED on a Raspberry Pi.md | 45 ++++++------------- 1 file changed, 13 insertions(+), 32 deletions(-) rename {translated/tech => published}/20170705 No coding required Node-RED on a Raspberry Pi.md (74%) diff --git a/translated/tech/20170705 No coding required Node-RED on a Raspberry Pi.md b/published/20170705 No coding required Node-RED on a Raspberry Pi.md similarity index 74% rename from translated/tech/20170705 No coding required Node-RED on a Raspberry Pi.md rename to published/20170705 No coding required Node-RED on a Raspberry Pi.md index c477cc20ab..003185f804 100644 --- a/translated/tech/20170705 No coding required Node-RED on a Raspberry Pi.md +++ b/published/20170705 No coding required Node-RED on a Raspberry Pi.md @@ -1,80 +1,61 @@ 不需要编码:树莓派上的 Node-RED ============================================================ -### 查看本教程,看看使用 Node-RED 的拖放界面设置硬件流是多么容易。 +> 查看本教程,看看使用 Node-RED 的拖放界面设置硬件流程是多么容易。 ![No coding required: Node-RED on a Raspberry Pi](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/hardware_hammer_sign.jpg?itok=vh76LBib "No coding required: Node-RED on a Raspberry Pi") -图片提供:  -Thomas Hawk 的 [Flickr][12]. [CC BY-NC 2.0][13]. Opensource.com 修改 +Node-RED 是一个编程工具,可让你使用基于浏览器的编辑器快速连接硬件设备。它具有大量的节点,可以以拖放的方式构建流程,这大大减少了开发时间。[Node-RED][14] 与树莓派的 Raspian Jessie 一起安装,你还可以独立下载 Node-RED。 -Node-RED 是一个编程工具,可让你使用基于浏览器的编辑器快速连接硬件设备。它具有大量的节点,可以拖放的方式构建流程,这大大减少了开发时间。[Node-RED][14] 会与树莓派的 Raspian Jessie 一起安装,你还可以独立下载 Node-RED。 +为了向你展示它如何工作,我们将使用 Node-RED 构建一个简单的工具,与连接到树莓派的蜂窝调制解调器通信。使用蜂窝调制解调器,你可以通过蜂窝网络从你的树莓派发送/接收数据。你可以使用蜂窝网络提供商通常提供的 3G/4G USB 加密狗,也可以将开发板与 3G 或 4G 无线调制解调器连接。 -更多关于Raspberry Pi - -* [我们最新的树莓派][1] - -* [什么是树莓派?][2] - -* [开始使用树莓派][3] - -* [给我们发送你的树莓派项目和教程][4] - -为了向你展示它如何工作,我们将使用 Node-RED 构建一个简单的工具,与连接到树莓派的蜂窝调制解调器通信。使用蜂窝调制解调器,你可以通过蜂窝网络从你的树莓派发送/接收数据。你可以使用蜂窝网络提供商通常提供的 3G/4G USB 加密狗,也可以将开发板与 3 G或 4G 无线调制解调器连接。 - -无论你是连接 USB 加密狗还是开发板,树莓派的连接接口都是通过 USB 端口。在本教程中,我将一块 [SIM900][15] 开发板通过一根 USB 转串行电缆连接到树莓派。 - -### [node_red1.png][5] +无论你是连接 USB 加密狗还是开发板,树莓派的连接接口都是通过 USB 端口的。在本教程中,我将一块 [SIM900][15] 开发板通过一根 USB 转串行电缆连接到树莓派。 ![Connecting SIM900 to Raspberry Pi through a USB-to-serial converter cable](https://opensource.com/sites/default/files/u128651/node_red1.png "Connecting SIM900 to Raspberry Pi through a USB-to-serial converter cable") 第一步是检查 SIM900 开发板是否连接到树莓派上。 -### [node_red2a.png][6] - ![Checking that the SIM900 development board is connected](https://opensource.com/sites/default/files/u128651/node_red2a.png "Checking that the SIM900 development board is connected") -USB 转串行适配器在这里显示为连接到树莓派的 USB 设备之一。 +USB 转串行适配器在这里被显示为连接到树莓派的 USB 设备之一。 接下来,检查 SIM900 连接的 USB 端口号。 -### [node_red3a.png][7] - ![Checking the SIM900 board's USB port number](https://opensource.com/sites/default/files/u128651/node_red3a.png "Checking the SIM900 board's USB port number") 在最后一行,你可以看到 SIM900 板(通过 USB 转串行转换器连接)连接到了树莓派上的 **ttyUSB0**。现在我们准备开始使用 Node-RED。 在树莓派上启动 Node-RED。 -### [node_red4a.png][8] - ![​​​​Launching Node-RED in Raspberry Pi](https://opensource.com/sites/default/files/u128651/node_red4a.png "​​​​Launching Node-RED in Raspberry Pi") -下载[示例流图][16]并将其导入到 Node-RED 中。请注意,流文件是图形 UI 的 JSON 表示形式。 +下载[示例流图][16]并将其导入到 Node-RED 中。请注意,流文件是该图形 UI 的 JSON 表示形式。 在 Node-RED 中,导入的流图应该看上去像这样: -### [node_red5.png][9] - ![The imported flow in Node-RED](https://opensource.com/sites/default/files/u128651/node_red5.png "The imported flow in Node-RED") -注入节点设置 [ AT 命令][17]需要查询调制解调器。**添加换行** 功能节点将注入节点传递过来的 AT 命令后面附加 **\r\n**。**添加换行** 的输出然后连接到**串行输出**节点,它将数据写入串行端口。来自调制解调器的 AT 命令响应通过 **串行输入** 节点读取,该节点将响应输出到 **调试** 窗口。确认串行端口号和端口速度在 **串行输入** 和 **串行输出** 节点中的配置。 +注入节点设置 [AT 命令][17]需要查询调制解调器。**添加换行** 功能节点会在注入节点传递过来的 AT 命令后面附加 **\r\n**。**添加换行** 的输出然后被连接到**串行输出**节点,它将数据写入串行端口。来自调制解调器的 AT 命令的响应通过 **串行输入** 节点读取,该节点将响应输出到 **调试** 窗口。确认串行端口号和端口速度在 **串行输入** 和 **串行输出** 节点中的配置。 Node-RED 是一种易于使用的编程工具,可用于快速集成和测试硬件设备。从本教程可以看出,使用 Node-RED 连接和测试使用树莓派的蜂窝模式不需要编码。 有关 Node-RED 和其他可以使用的方式的更多信息,请访问[项目网站][18]。 +(题图: Thomas Hawk 的 [Flickr][12]. [CC BY-NC 2.0][13]. Opensource.com 修改) + -------------------------------------------------------------------------------- 作者简介: Surya G - 我的兴趣是为物联网项目尤其是使用蜂窝调制解调器的项目做软件开发。 +--- + via: https://opensource.com/article/17/7/nodered-raspberrypi-hardware -作者:[ Surya G ][a] +作者:[Surya G][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/) 荣誉推出 From e8f2c9577b846ef2f4e5b8a54315fc53221e7442 Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 19 Jul 2017 17:13:32 +0800 Subject: [PATCH 0725/1407] PRF&PUB:20170321 7 ways to discuss legal matters with an open community.md @geekpi --- ...ss legal matters with an open community.md | 65 +++++++++++++++++++ ...ss legal matters with an open community.md | 65 ------------------- 2 files changed, 65 insertions(+), 65 deletions(-) create mode 100644 published/20170321 7 ways to discuss legal matters with an open community.md delete mode 100644 translated/talk/20170321 7 ways to discuss legal matters with an open community.md diff --git a/published/20170321 7 ways to discuss legal matters with an open community.md b/published/20170321 7 ways to discuss legal matters with an open community.md new file mode 100644 index 0000000000..4f6f063219 --- /dev/null +++ b/published/20170321 7 ways to discuss legal matters with an open community.md @@ -0,0 +1,65 @@ +与开放社区讨论法律事宜的 7 种方式 +============================================================ + +> 你的组织的律师准备好与开源社区打交道了么?不要让他们犯这些错。 + + ![7 ways to discuss legal matters with an open community](https://opensource.com/sites/default/files/styles/image-full-size/public/images/law/LAW-Internet_construction_9401467_520x292_0512_dc.png?itok=xmtgmowQ "7 ways to discuss legal matters with an open community") + +我注意到有相当多的人尝试与[开源推进联盟的许可证评估社区] [3]以及 [Apache 软件基金会的法律事务委员会][4]建立沟通,当轮到_你_与开放社区进行法律讨论时,我想提供一些成功的提示和技巧。 + +### 不要代理人 + +首先,也是最重要的是,要确保进行谈话的人员既是_有资格的_,也是_有授权的_。不要用代理人,这只会让社区沮丧,他们很快会发现你的代表总是扮演二手车推销员的角色并且要求到后面的房间交易。显然,法律讨论将涉及公司的一个团队,可能涉及产品管理、工程和内部咨询。 但代表们需要能够自己控制谈话内容,不要总是引用幕后某个匿名人物的话。 + +### 多边主义 + +开源社区就安全合作所需的确定性达成了难得一致的共识。这种共识体现在其治理中,尤其是在他们使用的开源许可证中。所以当你提出一个新的提案时,就不像是一个普通的商业交易。这些是双边谈判,以双方的自由为代价来创造一个最佳妥协的和平条约。在这个讨论中,你只是许多方面之一,你需要解释为什么你的提案对所有人都有益。写上多边之间的调整本质上是缓慢的,所以不要设置最后期限。无论你做什么,不要建议对开源许可证进行更改! + +### 首先学习 + +现有的共识和过程其存在是有原因的。你应该了解每个元素的原因,最好连同其发生的历史一起了解,然后再提出修改。这样,你可以在进一步发展的背景下表达你的提案,这样你可以避免在社区历史中受教育(浪费社区资源,降低你机会的有效性)。回看邮件列表,并向开发人员询问历史和来龙去脉。 + +### 透明 + +开源开发人员使用一个迭代、增量修改的过程。即使需要大的变化,它几乎总是用一系列更小、更好的解释或不言而喻的正确变化来实现的,这样每个人都可以跟进并支持。你提出的更改也是如此。不要弄出新的贡献者协议或者修改过的许可证,并期望每个人都相信你是专家、一切都是对的。你需要提供一根“红线”(相当于法律文件的差异),记录每个变化,并提供一个承认任何社区影响并为其辩护的理由。如果你_只是_为了你自己的利益需要一个东西,那就承认它,而不是希望没有人会注意到。 + +### 谦逊 + +你是一个炙手可热的律师,而你认为只有程序员才使用邮件列表。很明显,对你而言他们缺乏讨论的经验,所以你安排了一个你认为是同等的代理人,简化这一切,或者提出与社区选择的律师进行一对一的讨论。 我很抱歉地说你做的全都是错的。由于社区的政策是多边协商一致的,所以他们很有可能知道他们为什么定下现在的这些决定。名单上的一些人将具有优秀的领域知识,可能会比你的更好。而且一对一这件事是终极的羞辱,就像询问是否有一个成年人可以与你说话。 + +### 不要秘密渠道 + +有可能在某种领导机构,也许你认识在公司法务工作的 VP,也许你认识社区的总法律顾问。虽然在某些情况下,询问如何操控流程的提示可能是可以接受的,但尝试通过秘密渠道讨论或协商来试图影响甚至决定结果,那么结果会很糟糕。你最终可能会被邀请进行一对一的讨论, 但你不应该要求或期待它。 + +### 成为一个成员 + +如果你一切都做得正确,那么社区就有可能尊重你。坚持这些。作为一名冷静、机智的贡献者建立你的声誉。当人们犯你犯过的错误(或者已避免的)时,帮助他们。作为邮件列表社区的值得信赖的参与者,你是项目和雇主的真正资产。继续贡献,一些项目最终会在它们的治理中为你提供一个角色。 + +_这个文章的早期版本[最初发表][1]在 Meshed Insights 中。_ + +(题图: opensource.com) + +-------------------------------------------------------------------------------- + +作者简介: + +Simon Phipps - 计算机行业和开源老手 Simon Phipps 上线了 Public Software,一个欧洲的开源项目托管,Document Foundation 的志愿者总监。他的帖子由 Patreon 赞助者赞助 - 如果你想要看更多,成为其中一个! + +------------ + +via: https://opensource.com/open-organization/17/3/legal-matters-community + +作者:[Simon Phipps][a] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/simonphipps +[1]:https://meshedinsights.com/2017/02/28/engaging-communities-on-legal-matters-7-tips/ +[2]:https://opensource.com/open-organization/17/3/legal-matters-community?rate=gSFbyOzBTIipXOdeeL-GVIT1BYoC4f61FKZJ7KRg3d0 +[3]:https://opensource.org/approval +[4]:https://www.apache.org/legal/ +[5]:https://opensource.com/user/12532/feed +[6]:https://opensource.com/open-organization/17/3/legal-matters-community#comments +[7]:https://opensource.com/users/simonphipps diff --git a/translated/talk/20170321 7 ways to discuss legal matters with an open community.md b/translated/talk/20170321 7 ways to discuss legal matters with an open community.md deleted file mode 100644 index 00e42047ba..0000000000 --- a/translated/talk/20170321 7 ways to discuss legal matters with an open community.md +++ /dev/null @@ -1,65 +0,0 @@ -与开放社区讨论法律事宜的 7 种方式 -============================================================ - -> 你的组织的律师准备好参加开放社区了么?不要让他们犯这些错。 - - - ![7 ways to discuss legal matters with an open community](https://opensource.com/sites/default/files/styles/image-full-size/public/images/law/LAW-Internet_construction_9401467_520x292_0512_dc.png?itok=xmtgmowQ "7 ways to discuss legal matters with an open community") ->图片提供: opensource.com - -我注意到有相当多的人尝试同时参与[开源倡议的许可评估社区] [3]以及[ Apache 软件基金会的法律事务委员会][4],我想提供一些成功的提示和技巧在当轮到_你_与开放社区进行法律讨论时。 - -### 不要代理人 - -首先要确保进行谈话的人员既有_资格_,又有_授权_。不要用代理人,这只会让社区沮丧,他们很快会发现你的代表总是扮演二手车推销员的角色并且到后面的房间要求交易。显然,法律讨论将涉及公司的一个团队,可能涉及产品管理、工程和内部咨询。 但代表们需要能够自己进行谈话,不要总是引用幕后匿名人物的话。 - -### 多边主义 - -一个开源社区就安全合作所需的确定性达成了难得一致的共识。这种共识体现在其治理中,尤其是在他们使用的开源许可证中。所以当你提出一个新的提案时,这不是一个正常的商业交易。这些是双边谈判,交换双方的自由创造一个最佳妥协的和平条约。在这个讨论中,你只是许多方面之一,你需要解释为什么你的提案对所有人都有好处。谈判多边变化本质上是缓慢的,所以不要设置最后期限。无论你做什么,不要建议对开源许可证进行更改! - -### 首先学习 - -现有的共识和过程存在一个原因。你应该了解每个元素的原因,最好连同其发生的历史一起了解,然后再提出修改。这样,你可以在进一步发展的背景下表达你的提案,这样你可以避免在社区历史中受教育(浪费社区资源,降低你机会的有效性)。回看邮件列表,并向开发人员询问历史和来龙去脉。 - -### 透明 - -开源开发人员使用一个迭代、增量修改的过程。即使需要大的变化,它几乎总是用一系列更小,更好的解释或不言而喻的正确变化来实现的,这样每个人都可以跟进并支持。你提出的更改也是如此。不要出现新的贡献者协议或者修改过的许可证,并期望每个人都相信你是专家,所以一切都是好的。你需要提供一根“红线”(相当于法律文件的差异),记录每个变化,并提供一个承认任何社区影响的里有并为其辩护。如果你_只是_为了你自己的利益需要一个东西,承认它,而不是希望没有人会注意到。 - -### 谦逊 - -你是一个炙手可热的律师,你认为只有程序员使用邮件列表。很明显,对你而言他们缺乏讨论的经验,所以你排了一个你认为是同等的代理人,简化这一切,或者提出与社区选择的律师进行一对一的讨论。 我很抱歉地说你做的都是错的。由于社区的政策是多边协商一致的,所以他们很有可能知道他们现在的决定。名单上的一些人将具有优秀的领域知识,可能会比你的更好。而且一对一这件事是终极的羞辱,就像询问是否有一个成年人可以与你说话。 - -### 不要后台渠道 - -有可能是某种领导机构。也许你认识在公司法务工作的 VP。也许你认识社区的总法律顾问。虽然在某些情况下,询问如何操控流程的提示可能是可以接受的,但试图影响甚至决定结果的方式进行后台渠道讨论或协商, 那么结果会很糟糕。你最终可能会被邀请进行一对一的讨论, 但你不应该要求或期待。 - -### 成为一个成员 - -如果你一切都做得正确,那么社区就有可能尊重你。坚持这些。作为一名冷静、机智的贡献者建立你的声誉。当人们犯你犯过的错误(或者已避免的)时,帮助他们。作为邮件列表社区的值得信赖的参与者,你是项目和雇主的真正资产。继续贡献,一些项目最终会在它们的治理中为你提供一个角色。 - -_这个文章的早期版本[最初发表][1]在 Meshed Insights 中。_ - --------------------------------------------------------------------------------- - -作者简介: - -Simon Phipps - 计算机行业和开源老手 Simon Phipps 上线了 Public Software,一个欧洲的开源项目托管,Document Foundation 的志愿者总监。他的帖子由 Patreon 赞助者赞助 - 如果你想要看更多,成为其中一个! - ------------- - -via: https://opensource.com/open-organization/17/3/legal-matters-community - -作者:[ Simon Phipps][a] -译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/simonphipps -[1]:https://meshedinsights.com/2017/02/28/engaging-communities-on-legal-matters-7-tips/ -[2]:https://opensource.com/open-organization/17/3/legal-matters-community?rate=gSFbyOzBTIipXOdeeL-GVIT1BYoC4f61FKZJ7KRg3d0 -[3]:https://opensource.org/approval -[4]:https://www.apache.org/legal/ -[5]:https://opensource.com/user/12532/feed -[6]:https://opensource.com/open-organization/17/3/legal-matters-community#comments -[7]:https://opensource.com/users/simonphipps From a50af76e64cb0895b683b2524705ba2611271a1f Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?=E5=91=A8=E5=AE=B6=E6=9C=AA?= Date: Wed, 19 Jul 2017 19:31:03 +0800 Subject: [PATCH 0726/1407] Update 20170312 OpenGL Go Tutorial Part 1.md --- sources/tech/20170312 OpenGL Go Tutorial Part 1.md | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/sources/tech/20170312 OpenGL Go Tutorial Part 1.md b/sources/tech/20170312 OpenGL Go Tutorial Part 1.md index 1f5c8d4b89..4910a893fb 100644 --- a/sources/tech/20170312 OpenGL Go Tutorial Part 1.md +++ b/sources/tech/20170312 OpenGL Go Tutorial Part 1.md @@ -1,4 +1,5 @@ -translating by kylecao +translating by GitFuture + OpenGL & Go Tutorial Part 1: Hello, OpenGL ============================================================ From 1b37d310b24f748c2ec3136ed543ecd905cb19c5 Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 19 Jul 2017 21:08:53 +0800 Subject: [PATCH 0727/1407] PRF&PUB:20170616 Do you have what it takes to be a software developer.md @geekpi --- ...hat it takes to be a software developer.md | 40 +++++++++++++++++++ ...hat it takes to be a software developer.md | 34 ---------------- 2 files changed, 40 insertions(+), 34 deletions(-) create mode 100644 published/20170616 Do you have what it takes to be a software developer.md delete mode 100644 translated/talk/20170616 Do you have what it takes to be a software developer.md diff --git a/published/20170616 Do you have what it takes to be a software developer.md b/published/20170616 Do you have what it takes to be a software developer.md new file mode 100644 index 0000000000..db0eb40b08 --- /dev/null +++ b/published/20170616 Do you have what it takes to be a software developer.md @@ -0,0 +1,40 @@ +成为一名软件开发者你应该学习哪种语言? +================= + +![](https://www.linuxcareer.com/images/software_developer_skills.jpg) + +应用程序的领域在不断发展。底层的 Linux 做了很多工作,而且还在继续,但是在过去几年里,应用程序领域开始增长。在这种情况下,开发人员使用哪种语言构建这些应用程序?简而言之,要看情况,我知道这个说法没啥稀奇的。但是,通过我们拥有的数据,我们可以确定哪些语言领先。 + +站在山顶的语言是 Java。它已经出现在开源软件领域 15 年以上,但它并不是一直在顶峰。在早期,我们没有看到那么多对 java 开发者感兴趣的,但现在情况已经改变了。它是目前应用领域的权威领导者。虽然这个数字在过去六个季度没有明显增长,但其整体数量却令人印象深刻。平均而言,关注于开源软件的公司发布的职位中有超过 1/3 的职位要求 Java 技能。这对几年前没有在榜单上出现的语言而言是一个非凡的成就。而且,由于它在 Android 中的大量使用,未来这个数字进一步增加也并不奇怪。 + +在应用程序领域中使用的另一种语言是 C++。虽然它的数量不能与 Java 竞争,但它仍然在这个领域占据了很大的市场份额。而且每 3 个招聘中有一个要求 Java,C++ 则是每 4 个中有一个要求它。与 Java 非常类似,其数量在过去六个季度中保持相对稳定。C++ 一直被大量使用,即使 Java 已经取代它,它仍然是一种高度相关的语言。 + + + +进入到网络应用领域,多年来一直在城头变幻大王旗。在早期,大多数 Web 程序毫无疑问地选择使用 PHP 开发。正如之前关于脚本的文章所讨论的,这几年来已经发生了变化。在过去几年中,PHP 的使用似乎有所恶化。在过去一年半的时间里,已经急剧下降了 30% 以上。这是一个令人震惊的数字,只有时间才能告诉我们趋势是否持续。 + +最初打破 PHP 领导地位的是 Ruby on Rails。多年来,我看到公司们和开发者们进行了这一转型。Ruby on Rails 经历了一段时间,在这个时期它是这个领域的首选语言。然而,从我们收集的数字来看,它的光泽似乎已经失去了一点。虽然没有像 PHP 这样的衰退,但其数量一直保持相对平稳,它曾经有过的增长似乎停滞不前。 + + + +目前在网络应用程序领域的王者似乎是 Javascript。它获得了最大的总数。虽然它的数量保持平坦,这很像 Ruby on Rails,但它已经吸引了更多的观众。平均来说,过去六个季度,公司在分析的 10,000 份工作清单中有 1,500 份需要 Javascript 技能。这比 PHP 或 Ruby on Rails 多了 70%。 + +随着 PHP 的衰落以及 Ruby on Rails 和 Javascript 停滞不前,是谁在 Web 程序领域保持增长呢?这个群体的突出者似乎是 Golang。它在 2007 年由 Google 内的几位开发人员创建,似乎这种语言开始获得更广泛的受众群体。虽然与我们讨论的其它三个的总数相比不多,但看起来这一年半以来增长了 50%。如果这种趋势继续下去,那将是非常有趣的。在我看来,我预计我们会继续看到 Golang 挤占 其它三个的群体份额。 + + + +如往常一样,我们会监测这些语言的各种前进方向,以观察市场趋势。而且,榜单的任何新进入者都会被密切关注。这是一个令人兴奋和动态的发展领域。一个会提供随时间不断变化的结果。 + +-------------------------------------------------------------------------------- + +via: https://www.linuxcareer.com/do-you-have-what-it-takes-to-be-a-software-developer + +作者:[Brent Marinaccio][a] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.linuxcareer.com/do-you-have-what-it-takes-to-be-a-software-developer +[1]:https://www.linuxcareer.com/skills-watch +[2]:https://www.linuxcareer.com/do-you-have-what-it-takes-to-be-a-software-developer# diff --git a/translated/talk/20170616 Do you have what it takes to be a software developer.md b/translated/talk/20170616 Do you have what it takes to be a software developer.md deleted file mode 100644 index 3dec6cc692..0000000000 --- a/translated/talk/20170616 Do you have what it takes to be a software developer.md +++ /dev/null @@ -1,34 +0,0 @@ -# 成为一名软件开发者需要些什么? - -![](https://www.linuxcareer.com/images/software_developer_skills.jpg) - -应用程序是在应用领域。底层的 Linux 做了很多工作,而且还在继续,但是在过去几年里,应用程序领域开始增长。在这种情况下,开发人员使用哪种语言构建这些应用程序?简而言之,要看情况,我所了解的并不是一个巨大的惊喜。但是,随着我们逐渐拥有的数据,我们可以确定哪些语言领先。 - -发现自己在领先的语言是 Java。它已经围绕开源软件15年以上,但情况并不总是如此。在早期,我们没有看到很多对 java 开发者的兴趣,但这个男孩已经改变了。它是目前应用领域的权威领导者。虽然数字在过去六个季度没有增长,但整体数量却令人印象深刻。平均而言,在 FLOSS 上公司发布的职位中有超过 1/3 的职位要求 Java 技能。这对几年前没有在榜单上出现的语言而言是一个壮举。而且,由于它与 Android 的大量使用,未来这个数字增加也并不奇怪。 - -在应用程序领域中使用的另一种语言是 C++。虽然它的数量不能与 Java 竞争,但它仍然在这个领域占据了很大的市场份额。而且 3 个招聘中有一个要求 Java,C++ 是 4 个中有一个要求。与 Java 类似,其数字在过去六个季度中保持相对稳定。C++一直被大量使用,即使 Java 已经取代它,它仍然是一种高度相关的语言。 - - -进入到网络应用领域,多年来一直在改变领导者。在早期,大多数 Web 程序明确选择使用 PHP 开发。正如之前关于脚本的文章所讨论的,这几年来已经发生了变化。在过去几年中,PHP 的使用似乎有所恶化。在过去一年半的时间里,已经急剧下降了 30% 以上。这是一个令人震惊的数字,只有时间才能确定趋势是否持续。 - -最初打破 PHP 领导的最初是 Ruby on Rails。多年来,我看到公司和开发商进行了这一转型。Ruby on Rails 经历了一段时间,在这个时期它是这个领域的首选语言。然而,从我们收集的数字来看,它的光泽似乎已经失去了一点优势。虽然没有像 PHP 这样的衰退,但其数量一直保持相对平稳,所以它曾经经历的增长似乎停滞不前。 - -目前在网络应用程序领域的王者似乎是 Javascript。它获得了最大的总数。虽然它的数量保持平坦,这很像 Ruby on Rails,但它已经吸引了更多的观众。平均来说,过去六个季度,公司在分析的 10,000 份工作清单中有 1,500 份需要 Javascript 技能。这比 PHP 或 Ruby on Rails 多了 70%。 - -随着 PHP 的衰落以及 Ruby on Rails 和 Javascript 停滞不前,有什么在 Web 程序领域增长的么?这个群体的突出者似乎是 Golang。它在 2007 年由 Google 内的几位开发人员创建,似乎这种语言开始获得更广泛的受众群体。虽然与其他三个讨论的总体数字相比,总体看起来比去年同期增长了 50%。如果这种趋势继续下去,那将是非常有趣的。在我看来,我预计我们会继续以牺牲其他三个的群体来获得 Golang 的增长。 - -如往常一样,我们会监测这些语言的各种前进方向,以观察市场趋势。而且,榜单的任何新进入者都会被密切关注。这是一个令人兴奋和动态的发展领域。一个会提供随时间不断变化的结果。 - --------------------------------------------------------------------------------- - -via: https://www.linuxcareer.com/do-you-have-what-it-takes-to-be-a-software-developer - -作者:[Brent Marinaccio ][a] -译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.linuxcareer.com/do-you-have-what-it-takes-to-be-a-software-developer -[1]:https://www.linuxcareer.com/skills-watch -[2]:https://www.linuxcareer.com/do-you-have-what-it-takes-to-be-a-software-developer# From b94bdebb45d3bee65a0699601366a2e42913f1fd Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 20 Jul 2017 08:39:34 +0800 Subject: [PATCH 0728/1407] translated --- ... RUNNING WITH ACTIVE PROCESSES ON LINUX.md | 148 ------------------ ... RUNNING WITH ACTIVE PROCESSES ON LINUX.md | 146 +++++++++++++++++ 2 files changed, 146 insertions(+), 148 deletions(-) delete mode 100644 sources/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md create mode 100644 translated/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md diff --git a/sources/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md b/sources/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md deleted file mode 100644 index c4f08ff871..0000000000 --- a/sources/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md +++ /dev/null @@ -1,148 +0,0 @@ -translating---geekpi - -HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX -============================================================ - -A quick guide for recovering deleted files which still have running processes on your Linux system using Terminal. - -In many cases, deleted files are applicable to recover even if the file has an active process and currently used by a single or multiple users. On Linux system every currently running process gets ID and it will be stated as a process identifier “PID” and all stacked up in /proc directory. This exactly what we need to recover deleted files which still running and it has a PID. So, here’s how we are going to do that. - -Let’s say you have opened a compressed file and later on you have deleted this file. For the demonstration purpose, the compressed file is called “opengapps.zip” that would be the file we will open and deleted afterward. - -### CALCULATE THE MD5 HASH OF THE ORIGINAL FILE - -We will calculate the MD5 for this file before deleting it. So, we could compare the original MD5 hash to the MD5 hash of the recovered file. This process will guarantee that the integrity of the compressed file we have recovered is the same and it’s not corrupted. - -``` -md5sum opengapps.zip >> md5-opengapps.txt -``` - -To display the content of the text file - -``` -cat md5-opengapps.txt -``` - -``` -Terminal Output -86489b68b40d144f0e00a0ea8407f7c0 opengapps.zip -``` - -After checking the MD5 hash for the compressed file. We will keep the compressed file opened and we will delete it. Afterward, we will start with the recovering process of that file with the following steps: - -``` -rm opengapps.zip -``` - -### THE RECOVERING PROCESS FOR A DELETED FILE - -As we have mentioned earlier the running processes are available in the /proc directory. We can search for that process we need inside that directory with the following command: - -Since we already know that the filename includes .zip file extension we could search using .zip extension. It will limit the output result and display the required process. - -``` -ps -axu | grep .zip -``` - -``` -Terminal Output -m 13119 0.8 1.0 121788 30788 ? Sl 06:17 0:00 file-roller /home/m/Downloads/Compressed/opengapps.zip -m 13164 0.0 0.0 5108 832 pts/20 S+ 06:18 0:00 grep --color=auto .zip -``` - -Then we will navigate to the directory which includes the process with PID **13119** and open /fd directory. - -``` -cd /proc/13119/fd -``` - -/fd (file descriptor) directory includes multiple files including the file we need to recover. That file is connected with a hard link to the original one we kept running in the background. All files inside /fd directory comes with numbers for the “file name”. So, to identify which one of these files is linked to the original one, we will list the /fd directory contents with long listing format option. - -``` -ls -l -``` - -``` -Terminal Output -total 0 -lr-x------ 1 m m 64 Jul 14 06:17 0 -> /dev/null -lrwx------ 1 m m 64 Jul 14 06:17 1 -> socket:[26161] -lrwx------ 1 m m 64 Jul 14 06:17 10 -> anon_inode:[eventfd] -lr-x------ 1 m m 64 Jul 14 06:17 11 -> anon_inode:inotify -lrwx------ 1 m m 64 Jul 14 06:17 12 -> socket:[5752671] -lr-x------ 1 m m 64 Jul 14 06:17 13 -> /home/m/Downloads/Compressed/opengapps.zip (deleted) -lrwx------ 1 m m 64 Jul 14 06:17 2 -> socket:[26161] -lrwx------ 1 m m 64 Jul 14 06:17 3 -> anon_inode:[eventfd] -lrwx------ 1 m m 64 Jul 14 06:17 4 -> anon_inode:[eventfd] -lrwx------ 1 m m 64 Jul 14 06:17 5 -> socket:[5751361] -lrwx------ 1 m m 64 Jul 14 06:17 6 -> anon_inode:[eventfd] -lrwx------ 1 m m 64 Jul 14 06:17 7 -> anon_inode:[eventfd] -lrwx------ 1 m m 64 Jul 14 06:17 8 -> socket:[5751363] -lrwx------ 1 m m 64 Jul 14 06:17 9 -> socket:[5751365] -``` - -As you can see in the terminal output, that the original file “opengapps.zip” has been deleted and it is still linked to a file name **13** with the process PID **13119**. However, we still can recover it by copying the file linked to it to a safe location. - -``` -cp 13 /home/m/Downloads/Compressed -``` - -After the file has been copied. we will return the directory which includes the recovered file and rename it with the following command. - -``` -mv 13 opengapps-recovered.zip -``` - -### CALCULATE THE MD5 HASH OF THE RECOVERED FILE - -Since we had recovered the file. let’s check the integrity of the file, just to make sure the file is not corrupted and it’s as same as the original one. Earlier we have saved the MD5 hash for the original file. - -``` -md5sum opengapps-recovered.zip >> md5-opengapps.txt -``` - -This command will check MD5 hash for the file and it will overwrite the text file to include the MD5 hash for the new recovered file to easily compare both MD5 hashes. - -Time to display the contents of the text file to compare both MD5 hashes of the original file and recovered file. - -``` -cat md5-opengapps.txt -``` - -``` -Terminal Output -86489b68b40d144f0e00a0ea8407f7c0 opengapps.zip -86489b68b40d144f0e00a0ea8407f7c0 opengapps-recovered.zip -``` - -The MD5 hash for the recovered file is the same. So, we successfully recovered the file we had deleted earlier and it has been recovered with the same file integrity and works fine. - - [![](http://www.linuxnov.com/wp-content/uploads/2017/07/Recovering-a-deleted-file-using-terminal-LinuxNov.png)][5] - -**Note:** in some cases, some files are not visible with **ps -axu** command. So, try to check the application running that file to recover the file from it running process. - -Let’s say we have a video with .avi extension running using Totem media player. All you need to check the PID of the Totem application and go through the same instructions mentioned in this example. - -To find out the PID of a running application use the following command followed by the application name. - -``` -pidof application name -``` -Support Us By Sharing - --------------------------------------------------------------------------------- - -via: http://www.linuxnov.com/recover-deleted-files-still-running-active-processes-linux/ - -作者:[mhnassif ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.linuxnov.com/author/mhnassif/ -[1]:http://www.linuxnov.com/author/mhnassif/ -[2]:http://www.linuxnov.com/category/how-to/ -[3]:http://www.linuxnov.com/category/shell-cli/ -[4]:http://www.linuxnov.com/recover-deleted-files-still-running-active-processes-linux/#comments -[5]:http://www.linuxnov.com/wp-content/uploads/2017/07/Recovering-a-deleted-file-using-terminal-LinuxNov.png diff --git a/translated/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md b/translated/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md new file mode 100644 index 0000000000..4dd1c34fab --- /dev/null +++ b/translated/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md @@ -0,0 +1,146 @@ +如何在 Linux 中恢复仍在活动进程中的已删除文件 +============================================================ + +使用终端恢复你 Linux 系统上仍在运行进程的已删除文件的快速指南。 + +许多情况下,删除的文件都可以恢复,即使该文件具有活动进程,并且目前被单个或多个用户使用。在 Linux 系统中,每个当前正在运行的进程都会获得 ID,并将其显示为进程标识符 “PID”,并将它们存放在 /proc 目录中。这正是我们需要恢复仍在运行的已删除的文件,并且它具有PID。所以,这就是我们如何做到这一点的。 + +假设你打开了一个压缩文件,之后你已经删除了这个文件。为了演示目的,压缩文件称为 “opengapps.zip”,这将是之后我们将打开和删除的文件。 + +### 计算原始文件的 MD5 哈希 + +删除之前,我们将计算该文件的 MD5。这样我们可以将原来的 MD5 哈希值与恢复文件的 MD5 哈希进行比较。这个过程将保证我们恢复的压缩文件的完整性是一样的,它没有被破坏。 + +``` +md5sum opengapps.zip >> md5-opengapps.txt +``` + +要显示文本文件的内容。 + +``` +cat md5-opengapps.txt +``` + +``` +终端输出 +86489b68b40d144f0e00a0ea8407f7c0 opengapps.zip +``` + +检查压缩文件的 MD5 哈希值之后。我们将保持打开的压缩文件,并将其删除。之后,我们将从文件的恢复过程开始,步骤如下: + +``` +rm opengapps.zip +``` + +### 删除文件的恢复过程 + +正如我们前面提到的,运行的进程在 /proc 目录中。我们可以使用以下命令搜索该目录中需要的进程: + +由于我们已经知道文件名包括 .zip 扩展名,因此我们可以使用 .zip 扩展名进行搜索。它将限制输出结果并显示所需的进程。 + +``` +ps -axu | grep .zip +``` + +``` +终端输出 +m 13119 0.8 1.0 121788 30788 ? Sl 06:17 0:00 file-roller /home/m/Downloads/Compressed/opengapps.zip +m 13164 0.0 0.0 5108 832 pts/20 S+ 06:18 0:00 grep --color=auto .zip +``` + +然后我们将进入到包含 PID **13119** 的目录并打开 /fd 目录。 + +``` +cd /proc/13119/fd +``` + +/fd (文件描述符)目录包含多个文件,包括我们需要恢复的文件。该文件链接到我们在后台运行的原始硬链接。 /fd 目录中的所有文件都带有作为“文件名”的数字。因此,要确定这些文件中的哪一个链接到原始文件,我们将用详细列表选项列出 /fd 目录。 + +``` +ls -l +``` + +``` +终端输出 +total 0 +lr-x------ 1 m m 64 Jul 14 06:17 0 -> /dev/null +lrwx------ 1 m m 64 Jul 14 06:17 1 -> socket:[26161] +lrwx------ 1 m m 64 Jul 14 06:17 10 -> anon_inode:[eventfd] +lr-x------ 1 m m 64 Jul 14 06:17 11 -> anon_inode:inotify +lrwx------ 1 m m 64 Jul 14 06:17 12 -> socket:[5752671] +lr-x------ 1 m m 64 Jul 14 06:17 13 -> /home/m/Downloads/Compressed/opengapps.zip (deleted) +lrwx------ 1 m m 64 Jul 14 06:17 2 -> socket:[26161] +lrwx------ 1 m m 64 Jul 14 06:17 3 -> anon_inode:[eventfd] +lrwx------ 1 m m 64 Jul 14 06:17 4 -> anon_inode:[eventfd] +lrwx------ 1 m m 64 Jul 14 06:17 5 -> socket:[5751361] +lrwx------ 1 m m 64 Jul 14 06:17 6 -> anon_inode:[eventfd] +lrwx------ 1 m m 64 Jul 14 06:17 7 -> anon_inode:[eventfd] +lrwx------ 1 m m 64 Jul 14 06:17 8 -> socket:[5751363] +lrwx------ 1 m m 64 Jul 14 06:17 9 -> socket:[5751365] +``` + +正如你在终端输出中看到的,原始文件 “opengapps.zip” 已被删除,但它仍然链接到一个文件名 **13**,并具有进程 PID **13119**。但是,我们仍然可以通过将链接文件复制到安全的地方来恢复。 + +``` +cp 13 /home/m/Downloads/Compressed +``` + +文件复制后。我们将返回包含恢复文件的目录,并使用以下命令重命名它。 + +``` +mv 13 opengapps-recovered.zip +``` + +### 计算恢复文件的 MD5 哈希 + +由于我们已经恢复了该文件。让我们检查该文件的完整性,这只是为了确保文件没有损坏,并且和原来一样。早先我们保存了原始文件的 MD5 哈希值。 + +``` +md5sum opengapps-recovered.zip >> md5-opengapps.txt +``` + +该命令将检查文件的 MD5 哈希值,并在文件中追加新恢复文件的 MD5 哈希值,以轻松比较两个 MD5 哈希值。 + +可以显示文本文件的内容来比较原始文件和恢复文件的 MD5 哈希值。 + +``` +cat md5-opengapps.txt +``` + +``` +终端输出 +86489b68b40d144f0e00a0ea8407f7c0 opengapps.zip +86489b68b40d144f0e00a0ea8407f7c0 opengapps-recovered.zip +``` + +恢复文件的 MD5 哈希是一样的。所以,我们成功地恢复了我们以前删除的文件,并且恢复后文件完整性一致,并且工作正常。 + + [![](http://www.linuxnov.com/wp-content/uploads/2017/07/Recovering-a-deleted-file-using-terminal-LinuxNov.png)][5] + +**注意:** 在某些情况下,某些文件无法通过 **ps -axu** 命令看到。 所以,尝试检查运行的程序,并从中恢复文件。 + +假设我们有一个使用 Totem 媒体播放器播放中的以 .avi 为扩展名的视频。你需要做的就是检查 Totem 的 PID,并按照本示例中提到的相同说明进行操作。 + +要查找正在运行的程序的 PID,请使用以下命令,后面跟程序的名称。 + +``` +pidof application name +``` +通过分享支持我们 + +-------------------------------------------------------------------------------- + +via: http://www.linuxnov.com/recover-deleted-files-still-running-active-processes-linux/ + +作者:[mhnassif ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.linuxnov.com/author/mhnassif/ +[1]:http://www.linuxnov.com/author/mhnassif/ +[2]:http://www.linuxnov.com/category/how-to/ +[3]:http://www.linuxnov.com/category/shell-cli/ +[4]:http://www.linuxnov.com/recover-deleted-files-still-running-active-processes-linux/#comments +[5]:http://www.linuxnov.com/wp-content/uploads/2017/07/Recovering-a-deleted-file-using-terminal-LinuxNov.png From b14bde8a3be50f7ec8cc214db43f03e694c88b50 Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 20 Jul 2017 08:46:50 +0800 Subject: [PATCH 0729/1407] translating --- .../tech/20170716 Nylas Mail A Free Email Client For Linux.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170716 Nylas Mail A Free Email Client For Linux.md b/sources/tech/20170716 Nylas Mail A Free Email Client For Linux.md index 6f1b568478..9ea02a2efe 100644 --- a/sources/tech/20170716 Nylas Mail A Free Email Client For Linux.md +++ b/sources/tech/20170716 Nylas Mail A Free Email Client For Linux.md @@ -1,3 +1,5 @@ +translating----geekpi + # [Nylas Mail A Free Email Client For Linux][7] From c3b0e36c58747cc15584bbc7d1a8be6c4d868aee Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 20 Jul 2017 09:34:44 +0800 Subject: [PATCH 0730/1407] PRF&PUB:20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md @geekpi --- ... RUNNING WITH ACTIVE PROCESSES ON LINUX.md | 39 +++++++------------ 1 file changed, 14 insertions(+), 25 deletions(-) rename {translated/tech => published}/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md (64%) diff --git a/translated/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md b/published/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md similarity index 64% rename from translated/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md rename to published/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md index 4dd1c34fab..255704f0f7 100644 --- a/translated/tech/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md +++ b/published/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md @@ -1,11 +1,11 @@ 如何在 Linux 中恢复仍在活动进程中的已删除文件 ============================================================ -使用终端恢复你 Linux 系统上仍在运行进程的已删除文件的快速指南。 +> 使用终端恢复你 Linux 系统上仍在运行进程的已删除文件的快速指南。 -许多情况下,删除的文件都可以恢复,即使该文件具有活动进程,并且目前被单个或多个用户使用。在 Linux 系统中,每个当前正在运行的进程都会获得 ID,并将其显示为进程标识符 “PID”,并将它们存放在 /proc 目录中。这正是我们需要恢复仍在运行的已删除的文件,并且它具有PID。所以,这就是我们如何做到这一点的。 +许多情况下,删除的文件都可以恢复,比如在该文件有活动的进程在操作它,并且目前被单个或多个用户使用时。在 Linux 系统中,每个当前正在运行的进程都会获得 ID,其被称之为进程标识符 “PID”,并将它们存放在 `/proc` 目录中。这正是我们恢复仍在运行的进程中(具有PID)已删除的文件所需要的东西。这里就是介绍我们如何做到这一点的。 -假设你打开了一个压缩文件,之后你已经删除了这个文件。为了演示目的,压缩文件称为 “opengapps.zip”,这将是之后我们将打开和删除的文件。 +假设你打开了一个压缩文件,之后你删除了这个文件。为了演示目的,压缩文件称为 “opengapps.zip”,这将是之后我们将打开和删除的文件。 ### 计算原始文件的 MD5 哈希 @@ -19,14 +19,11 @@ md5sum opengapps.zip >> md5-opengapps.txt ``` cat md5-opengapps.txt -``` -``` -终端输出 86489b68b40d144f0e00a0ea8407f7c0 opengapps.zip ``` -检查压缩文件的 MD5 哈希值之后。我们将保持打开的压缩文件,并将其删除。之后,我们将从文件的恢复过程开始,步骤如下: +检查压缩文件的 MD5 哈希值之后。我们将压缩文件保持打开(LCTT 译注:此处是使用 file-roller 这个图形界面的解压程序保持对该压缩文件的打开,其内置在 GNOME 环境中;在桌面环境中,使用桌面工具打开一个压缩包也能起到同样的作用。又及,本文举例不是很恰当,如果是删除了某个服务进程的已经打开的配置文件,那么这种恢复就很有意义),并将其删除。之后,我们将从文件的恢复过程开始,步骤如下: ``` rm opengapps.zip @@ -34,34 +31,28 @@ rm opengapps.zip ### 删除文件的恢复过程 -正如我们前面提到的,运行的进程在 /proc 目录中。我们可以使用以下命令搜索该目录中需要的进程: +正如我们前面提到的,运行的进程在 `/proc` 目录中。我们可以使用以下命令搜索该目录中需要的进程: 由于我们已经知道文件名包括 .zip 扩展名,因此我们可以使用 .zip 扩展名进行搜索。它将限制输出结果并显示所需的进程。 ``` ps -axu | grep .zip -``` -``` -终端输出 m 13119 0.8 1.0 121788 30788 ? Sl 06:17 0:00 file-roller /home/m/Downloads/Compressed/opengapps.zip m 13164 0.0 0.0 5108 832 pts/20 S+ 06:18 0:00 grep --color=auto .zip ``` -然后我们将进入到包含 PID **13119** 的目录并打开 /fd 目录。 +然后我们将进入到包含 PID `13119` 的目录并打开 `fd` 子目录。 ``` cd /proc/13119/fd ``` -/fd (文件描述符)目录包含多个文件,包括我们需要恢复的文件。该文件链接到我们在后台运行的原始硬链接。 /fd 目录中的所有文件都带有作为“文件名”的数字。因此,要确定这些文件中的哪一个链接到原始文件,我们将用详细列表选项列出 /fd 目录。 +`fd` (文件描述符)目录包含多个文件,包括我们需要恢复的文件。该文件以硬链接的方式链接到原始文件。 `fd` 目录中的所有文件都以数字链接到“文件名”。因此,要确定这些文件中的哪一个链接到该原始文件,我们将用详细列表选项列出 /fd 目录。 ``` ls -l -``` -``` -终端输出 total 0 lr-x------ 1 m m 64 Jul 14 06:17 0 -> /dev/null lrwx------ 1 m m 64 Jul 14 06:17 1 -> socket:[26161] @@ -79,7 +70,7 @@ lrwx------ 1 m m 64 Jul 14 06:17 8 -> socket:[5751363] lrwx------ 1 m m 64 Jul 14 06:17 9 -> socket:[5751365] ``` -正如你在终端输出中看到的,原始文件 “opengapps.zip” 已被删除,但它仍然链接到一个文件名 **13**,并具有进程 PID **13119**。但是,我们仍然可以通过将链接文件复制到安全的地方来恢复。 +正如你在终端输出中看到的,原始文件 “opengapps.zip” 已被删除,但它仍然链接到一个文件名 `13`,其进程 PID `13119`。但是,我们仍然可以通过将链接的文件复制到安全的地方来恢复它。 ``` cp 13 /home/m/Downloads/Compressed @@ -105,10 +96,7 @@ md5sum opengapps-recovered.zip >> md5-opengapps.txt ``` cat md5-opengapps.txt -``` -``` -终端输出 86489b68b40d144f0e00a0ea8407f7c0 opengapps.zip 86489b68b40d144f0e00a0ea8407f7c0 opengapps-recovered.zip ``` @@ -117,24 +105,25 @@ cat md5-opengapps.txt [![](http://www.linuxnov.com/wp-content/uploads/2017/07/Recovering-a-deleted-file-using-terminal-LinuxNov.png)][5] -**注意:** 在某些情况下,某些文件无法通过 **ps -axu** 命令看到。 所以,尝试检查运行的程序,并从中恢复文件。 +**注意:** 在某些情况下,某些文件无法通过 `ps -axu` 命令看到。 所以,尝试检查运行的程序,并从中恢复文件。 假设我们有一个使用 Totem 媒体播放器播放中的以 .avi 为扩展名的视频。你需要做的就是检查 Totem 的 PID,并按照本示例中提到的相同说明进行操作。 要查找正在运行的程序的 PID,请使用以下命令,后面跟程序的名称。 ``` -pidof application name +pidof 程序名 ``` -通过分享支持我们 + +通过分享支持我们。 -------------------------------------------------------------------------------- via: http://www.linuxnov.com/recover-deleted-files-still-running-active-processes-linux/ -作者:[mhnassif ][a] +作者:[mhnassif][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/) 荣誉推出 From 7fb75af8f760542f6c7643be54308e9a80adbc77 Mon Sep 17 00:00:00 2001 From: toyijiu <309378714@qq.com> Date: Thu, 20 Jul 2017 14:10:02 +0900 Subject: [PATCH 0731/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E4=B8=AD=20by=20Wu?= =?UTF-8?q?Xiao(toyijiu)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sources/tech/20170707 Bash prompt tips and tricks.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170707 Bash prompt tips and tricks.md b/sources/tech/20170707 Bash prompt tips and tricks.md index 3fff0d6356..4a0d94502f 100644 --- a/sources/tech/20170707 Bash prompt tips and tricks.md +++ b/sources/tech/20170707 Bash prompt tips and tricks.md @@ -1,3 +1,5 @@ +翻译中 by WuXiao(toyijiu) +============================================================ Bash prompt tips and tricks ============================================================ From 0391a3e9990312f3d2e351a10c8be02346532f97 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 20 Jul 2017 13:41:44 +0800 Subject: [PATCH 0732/1407] PRF&PUB:20170619 Is IoT the Future of Linux.md @geekpi --- .../20170619 Is IoT the Future of Linux.md | 83 ++++++++++++++++++ .../20170619 Is IoT the Future of Linux.md | 84 ------------------- 2 files changed, 83 insertions(+), 84 deletions(-) create mode 100644 published/20170619 Is IoT the Future of Linux.md delete mode 100644 translated/tech/20170619 Is IoT the Future of Linux.md diff --git a/published/20170619 Is IoT the Future of Linux.md b/published/20170619 Is IoT the Future of Linux.md new file mode 100644 index 0000000000..f555328701 --- /dev/null +++ b/published/20170619 Is IoT the Future of Linux.md @@ -0,0 +1,83 @@ +物联网是 Linux 的未来么? +============================================================ + +> Linux 无疑将在物联网中扮演一个关键角色,但是其光彩将与其它的一些分享。 + +随着 [Canonical 重新关注于][8]赢利和新技术,我们中的一些人发现我们正在思考 Linux 未来将走向何方,IoT(物联网)是否是 Linux 的未来? 本文旨在解决这两个问题。 + +### Mycroft 运行于 Linux + +对于大多数非技术世界的人来说,实际上有几个不同的 IoT 项目,它们不是我们不断在网络上看到广告的过度商业化的项目,其中最成功的就是 [Mycroft][9] 项目。 + +使得 Mycroft 有趣的部分原因是你不需要在专门的硬件上得到它。这意味着你可以将其下载到 Raspberry Pi 或甚至您自己的 PC 上。这是物联网领域更常见的来自其它厂商的商业化替代品中所没有出现的自由元素。Mycroft 项目的另一个有趣的事实是,它最初是众筹的,所以从一开始它就是真正的社区驱动的项目。 + +那么它的技能(skill)——这个用来描述它能力的术语——怎么样?目前,我听到一些褒贬不一的评论。通过查看 Github 上列出的技能,其整个列表似乎相当令人印象深刻。更深层次挖掘的话,很容易看出,它的许多技能比使用专有的 IoT 设备要好。 + +值得注意的是,为物联网设备开发的官方技能与社区成员开发的功能之间存在明显的区别。Mycroft 的官方技能列表其实很薄弱。让我们面对这个情况,就像 Linux 运行在物联网设备上一样酷,让我大开眼界的是,在 [Mycroft Github][10] 页面上并没有一个官方的邮件检查技能。好吧,在社区技能部分有一个 Gmail,它带有一个问号,因为它显然没有验证过是否可以工作(或不工作)。 + +### Google Home - 这是一个包含在谜语中的 Linux 谜题 + +那么 Google 的物联网产品 Google Home 呢?当然这运行在 Linux上,对吧?是的,在广义上说是这样……事实证明,Google Home [基于 Chromecast][11]。那 Chromecast 呢?它是基于 Google TV。我们还在 Linux 的部分么?不完全是。 + +显然,Chromecast 基本上运行的是 [Android 的精简版][12]。而且我们大多数人都知道,Android 确实使用了 Linux 内核的定制版本。 + +在这一点上,我觉得我们需要问自己 - Google 是我们可以想出的最好的 Linux 物联网代表吗?我认为不是,因为我觉得他们会愿意做出隐私妥协,而这是我们在一个纯粹的 Linux 物联网环境中所不愿见的。 但这只是我个人的信仰。 + +假设我们愿意接受 Google Home 这种隐私方面的可疑而带来的好处,也假设有在底层有一些可辨识出来的 Linux 成分,那么与 Mycroft 的纯粹的开源体验相比如何呢? + +目前,谷歌正在解决这个局面。首先,如果你愿意,你可以安装 Google Home的“大脑”(称为 Google Assistant)到树莓派上。这可以通过 [Google Assistant SDK][13] 获得。 + +如你猜的那样,这个 SDK 可以在 Linux 上安装。安装完 portaudio、各种库和用 pip 安装 google-assistant-sdk 之后,你可以开始用树莓派进行通话了,就像 Google Home 设备一样。 + +回到实际 Google Home 设备本身,你可能会想知道它的可用技能?开箱即用,它提供与 Google Play 音乐、Pandora、Spotify 和 iHeart Radio 以及其他流式音乐服务的音乐播放。Google Home 不仅拥有比 Mycroft 更多的“交流”技能,它还可以与像 Netflix 这样的服务和诸如 Philips、Nest 和 [IFTTT][14] 等各种智能家居任务的家庭品牌一同工作。我有提到它还可以安排 Google 日历或者订购披萨么? + +相比之下,Mycroft 对于想要创造自己的技能的 DIY 开发者来说更好,Google Home 现在可以就开始使用,而不是某一天。 + +### Amazon Echo 可以运行于 Linux + +我首先要承认的是我不知道 Amazon Echo 本身是否运行在 Linux 的某些元素上。也就是说,我知道你可以将 Echo 背后的大脑安装到 Linux 驱动的树莓派上!当[第一次发布派上的版本时][15],有点让人失望的是,你不得不按一个按钮来激活 Echo 的聆听模式。 + +转眼到了现在,派上的 Echo 现在支持用可编程的“热词”来激活它。这意味着你可以运行一个安装了 Linux 的派,其操作方式与官方 Amazon Echo 相似。然后,如果你买了 Echo Dot,你可以跳过额外的工作,省去在树莓派上安装 Mycroft 的那些极客的东西。 + +就像 Mycroft 和 Google Home 一样,Amazon Echo 可以在派上使用很重要,因为它使任何人都可以使用物联网技术 - 而不仅仅是那些选择官方硬件的人。而且由于亚马逊已经有更多的时间来开发这项技术,因此,可以说 Echo 是超前于可编程技能竞争以及整体进度的。 + +所以即使 Google Home 在问题回答上做的更好,但是 Echo 支持更多的第三方物联网设备,有些人认为它比 Google Home 的声音更自然。就个人而言,我认为两台设备的声音听起来都不错。但这只是我的意见。 + +### 物联网是 Linux 最好的 + +假如我们用一点时间来继续看看这些与 Linux 兼容的物联网设备或者像 Mycroft 这样真正使用 Linux 的社区伙伴的项目,有一点是可以肯定的,Linux 仍然是等式的一部分。 + +我认为不使用像 Linux 这样的自由/开放源代码平台是愚蠢的。毕竟,这些设备往往会连接到其他物联网自动化组件。这意味着安全性是一个真正的考虑。在 Linux 下运行物联网意味着我们可以有一个社区确保安全,而不是希望制造商为我们做到这一点。 + +需要一个例子说明为什么这很重要吗?看看那些不运行开源固件的路由器,当制造商停止支持该设备时会发生什么 - 安全风险开始出现。 + +物联网是 Linux 的未来吗?在我看来,我认为是……但不是全部。我认为对许多人来说,这是前进的道路。但是最后,我认为在 Linux 之上将会有许多专有的“东西”,只有像 Mycroft 这样纯粹的项目才能保持 Linux。 + +那么你怎么看?你认为像 Mycroft 这样的开源项目现在与 Google 和 Amazon 的产品在正常竞争么?反之,你觉得还有其他基于 Linux 的产品更适合这项工作么?无论是什么,点击评论,让我们来谈谈。 + +-------------------------------------------------------------------------------- + +via: http://www.datamation.com/open-source/is-iot-the-future-of-linux.html + +作者:[Matt Hartley][a] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.datamation.com/author/Matt-Hartley-3080.html +[1]:http://www.datamation.com/feedback/http://www.datamation.com/open-source/is-iot-the-future-of-linux.html +[2]:http://www.datamation.com/author/Matt-Hartley-3080.html +[3]:http://www.datamation.com/e-mail/http://www.datamation.com/open-source/is-iot-the-future-of-linux.html +[4]:http://www.datamation.com/print/http://www.datamation.com/open-source/is-iot-the-future-of-linux.html +[5]:http://www.datamation.com/open-source/is-iot-the-future-of-linux.html#comment_form +[6]:http://www.datamation.com/open-source/is-iot-the-future-of-linux.html# +[7]:http://www.datamation.com/author/Matt-Hartley-3080.html +[8]:https://insights.ubuntu.com/2017/04/05/growing-ubuntu-for-cloud-and-iot-rather-than-phone-and-convergence/ +[9]:https://mycroft.ai/ +[10]:https://github.com/MycroftAI/mycroft-skills +[11]:https://www.theverge.com/circuitbreaker/2016/5/31/11822032/google-home-chromecast-android +[12]:https://www.extremetech.com/computing/162463-chromecast-hacked-its-based-on-google-tv-and-android-not-chrome-os +[13]:https://developers.google.com/assistant/sdk/ +[14]:https://ifttt.com/google_assistant +[15]:https://www.raspberrypi.org/blog/amazon-echo-homebrew-version/ diff --git a/translated/tech/20170619 Is IoT the Future of Linux.md b/translated/tech/20170619 Is IoT the Future of Linux.md deleted file mode 100644 index 94936d9cb6..0000000000 --- a/translated/tech/20170619 Is IoT the Future of Linux.md +++ /dev/null @@ -1,84 +0,0 @@ -物联网是 Linux 的未来么? -============================================================ - - -_Linux 将会在物联网中扮演一个关键角色,但是它可能会分享焦点。_ - -随着[ Canonical 重新聚焦在][8]赢利和新技术,我们中的一些人发现我们正在思考 Linux 未来将走向何方,IoT(物联网)是否是 Linux 的未来? 本文旨在解决这两个问题。 - -### Mycroft 运行于 Linux - -对于大多数非技术世界的人来说,实际上有几个不同的 IoT 项目,它们不是我们不断在网络上看到广告的过度商业化的项目。其中最成功的就是 [Mycroft][9] 项目。 - -使得 Mycroft 有趣的部分原因是你不需要在专门的硬件上得到它。这意味着你可以将其下载到 Raspberry Pi 或甚至您自己的 PC 上。这是其他玩家在物联网领域其他更常见的商业化替代品中不常见到的自由元素。Mycroft 项目的另一个有趣的事实是,它最初是众筹的。所以从一开始它就是真正的社区驱动的项目。 - -那么它的技能,这个用来描述它能力的术语怎么样?目前,我听到一些褒贬不一的评论。通过查看 Github 上列出的技能,整体列表似乎相当令人印象深刻。更深层次挖掘的话,很容易看出,许多技能比使用专有的 IoT 设备的技能要好。 - -值得注意的是,物联网设备的官方技能与社区成员开发的功能之间存在明显的区别。Mycroft 的官方技能列表其实很薄弱。让我们面对它,就像 Linux 运行物联网设备一样酷,对我来说,没有官方的邮件检查技能列在 [Mycroft Github][10] 页面上是令人兴奋的。好吧,在社区技能部分有一个 Gmail,它带有一个问号,因为它显然没有验证可以工作(或不工作)。 - -### Google Home - 这是一个包含在谜语中的 Linux 谜题 - -那么 Google 的物联网产品 Google Home 呢?当然这运行在 Linux上,对吧?是的,在广泛意义上。。。事实证明,Google Home [基于 Chromecast][11]。那 Chromecast 呢?它是基于 Google TV。我们还在 Linux 的部分么?不完全是。 - -显然,Chromecast 基本上是运行[ Android 的精简版][12]。而且我们大多数人都知道,Android 确实使用了 Linux 内核的定制版本。 - -在这一点上,我觉得我们需要问自己 - Google 是我们可以想出的最好的 Linux 物联网代表吗?我不会反对,因为我觉得他们愿意在一个纯粹的 Linux 物联网环境中做出我们不会看到的隐私妥协。 但这只是我个人的信仰。 - -假设我们愿意让 Google Home 获得怀疑的好处,假设有一些 Linux 值得认可,那么与 Mycroft 的纯粹的开源体验相比呢? - -目前,谷歌正在打破它。首先,如果你愿意,你可以安装 Google Home(称为 Google Assistant)的“大脑”到树莓派上。这可以通过 [Google Assistant SDK][13] 获得。 - -如你猜的那样,这个 SDK 可以在 Linux 上安装。安装完 portaudio、各种库并且 pip 安装 google-assistant-sdk 之后,你可以开始用派进行通话了,就像 Google Home 设备一样。 - -回到实际 Google Home 设备本身,你可能会想知道它的可用技能?开箱即用,它提供与 Google Play 音乐、Pandora、Spotify 和 iHeart Radio 以及其他流式音乐服务的音乐播放。Google Home 不仅拥有比 Mycroft 更多的“交流”技能,它还适用于像 Netflix 这样的服务和诸如 Philips、Nest和 [IFTTT][14] 等各种智能家居任务的家庭品牌。我有提到它还可以安排 Google 日历或者订购披萨么? - -相比之下,Mycroft 对于想要创造自己的技能的 DIY 开发者来说更好,Google Home 现在可以开始使用,而不是某一天。 - -### Amazon Echo 可以运行于 Linux - -我首先要承认的是我不知道 Amazon Echo 本身是否运行在 Linux 的某些元素上。也就是说,我知道你可以将 Echo 背后的大脑安装到 Linux 驱动的树莓派上!当[第一次发布派上的版本时][15],有点让人失望的是,你不得不按一个按钮来激活 Echo 的聆听模式。 - -很快进行到现在,派上的 Echo 现在支持可编程的“热词”来激活它。这意味着你可以运行一个安装了 Linux 的派,其操作方式与官方 Amazon Echo 相似。在说一次,如果你买了 Echo Dot,你可以跳过额外的工作来代替在安装了 Mycroft 的派上保存极客的东西。 - -就像 Mycroft 和 Google Home 一样,Amazon Echo 可以在派上使用很重要,因为它使任何人都可以使用物联网技术 - 而不仅仅是那些选择官方硬件的人。而且由于亚马逊已经有更多的时间来开发这项技术,因此,可以说 Echo 是超前于可编程技能竞争以及整体进度的。 - -所以即使 Google Home 在问题回答上更好,但是 Echo 支持更多的第三方物联网设备,有些人认为它比 Google Home 有更自然的声音。就个人而言,我认为两台设备的声音听起来都不错。但这只是我的意见。 - -### 物联网是 Linux 最好的 - -假设我们将继续看到这些与 Linux 兼容的物联网设备或者像 Mycroft 这样真正用 Linux 与社区的项目,有一点是可以肯定的,Linux 仍然是等式的一部分。 - -我认为不使用像 Linux 这样的自由/开放源代码平台是愚蠢的。毕竟,这些设备往往会连接到其他物联网自动化组件。这意味着安全性是一个真正的考虑。在 Linux 下运行物联网意味着我们可以作为一个社区确保安全是好的,而不是希望制造商为我们做到这一点。 - -需要一个例子说明为什么这很重要?看看那些不运行开源固件的路由器。当制造商停止支持该设备时会发生什么 - 安全风险开始出现。 - -物联网是 Linux 的未来吗?在我看来,我认为这是。。。但不是全部。我认为对许多人来说,这是前进的道路。但是最后,我认为在 Linux 之上将会有许多专有的“东西”,只有像 Mycroft 这样纯粹的项目才能保持 Linux。 - -那么你会说什么?你认为像 Mycroft 这样的开源项目现在与 Google 和 Amazon 的产品在正常竞争么?反之,你觉得还有其他基于 Linux 的产品更适合这项工作么?无论是什么,点击评论,让我们来谈谈。 - --------------------------------------------------------------------------------- - -via: http://www.datamation.com/open-source/is-iot-the-future-of-linux.html - -作者:[Matt Hartley ][a] -译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.datamation.com/author/Matt-Hartley-3080.html -[1]:http://www.datamation.com/feedback/http://www.datamation.com/open-source/is-iot-the-future-of-linux.html -[2]:http://www.datamation.com/author/Matt-Hartley-3080.html -[3]:http://www.datamation.com/e-mail/http://www.datamation.com/open-source/is-iot-the-future-of-linux.html -[4]:http://www.datamation.com/print/http://www.datamation.com/open-source/is-iot-the-future-of-linux.html -[5]:http://www.datamation.com/open-source/is-iot-the-future-of-linux.html#comment_form -[6]:http://www.datamation.com/open-source/is-iot-the-future-of-linux.html# -[7]:http://www.datamation.com/author/Matt-Hartley-3080.html -[8]:https://insights.ubuntu.com/2017/04/05/growing-ubuntu-for-cloud-and-iot-rather-than-phone-and-convergence/ -[9]:https://mycroft.ai/ -[10]:https://github.com/MycroftAI/mycroft-skills -[11]:https://www.theverge.com/circuitbreaker/2016/5/31/11822032/google-home-chromecast-android -[12]:https://www.extremetech.com/computing/162463-chromecast-hacked-its-based-on-google-tv-and-android-not-chrome-os -[13]:https://developers.google.com/assistant/sdk/ -[14]:https://ifttt.com/google_assistant -[15]:https://www.raspberrypi.org/blog/amazon-echo-homebrew-version/ From d0c86473eac883d27d06af590ec6bb360dffd286 Mon Sep 17 00:00:00 2001 From: toyijiu <309378714@qq.com> Date: Thu, 20 Jul 2017 21:47:43 +0900 Subject: [PATCH 0733/1407] =?UTF-8?q?=E5=AE=8C=E6=88=90=E7=BF=BB=E8=AF=91-?= =?UTF-8?q?20170707=20Bash=20prompt=20tips=20and=20tricks.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20170707 Bash prompt tips and tricks.md | 157 ------------------ .../20170707 Bash prompt tips and tricks.md | 122 ++++++++++++++ 2 files changed, 122 insertions(+), 157 deletions(-) delete mode 100644 sources/tech/20170707 Bash prompt tips and tricks.md create mode 100644 translated/tech/20170707 Bash prompt tips and tricks.md diff --git a/sources/tech/20170707 Bash prompt tips and tricks.md b/sources/tech/20170707 Bash prompt tips and tricks.md deleted file mode 100644 index 4a0d94502f..0000000000 --- a/sources/tech/20170707 Bash prompt tips and tricks.md +++ /dev/null @@ -1,157 +0,0 @@ -翻译中 by WuXiao(toyijiu) -============================================================ -Bash prompt tips and tricks -============================================================ - -### Here are a few hidden treasures you can use to customize your Bash prompt. - -![Bash prompt tips and tricks](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/osdc_terminals.png?itok=QmkPW7P1 "Bash prompt tips and tricks") -Image by :  - -[ajmexico][8]. Modified by [Jason Baker][9]. [CC BY-SA 2.0][10]. - -Anyone who has started a terminal in Linux is familiar with the default Bash prompt: - -``` -[user@$host ~]$ -``` - -But did you know is that this is completely customizable and can contain some very useful information? Here are a few hidden treasures you can use to customize your Bash prompt. - -### How is the Bash prompt set? - -The Bash prompt is set by the environment variable **PS1** (Prompt String 1), which is used for interactive shell prompts. There is also a **PS2** variable, which is used when more input is required to complete a Bash command. - -``` -[dneary@dhcp-41-137 ~]$ export PS1="[Linux Rulez]$ " -[Linux Rulez] export PS2="... " -[Linux Rulez] if true; then -... echo "Success!" -... fi -Success! -``` - -### Where is the value of PS1 set? - -PS1 is a regular environment variable. - -The system default value is set in **/etc/bashrc**. On my system, the default prompt is set with this line: - -``` -[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ " -``` - -This tests whether the value of PS1 is **\s-\v$** (the system default value), and if it is, it sets PS1 to the value **[\u@\h \W]\\$**. - -If you want to see a custom prompt, however, you should not be editing **/etc/bashrc**. You should instead add it to **.bashrc** in your **Home** directory. - -### What do \u, \h, \W, \s, and \v mean? - -More Linux resources - -* [What is Linux?][1] - -* [What are Linux containers?][2] - -* [Download Now: Linux commands cheat sheet][3] - -* [Advanced Linux commands cheat sheet][4] - -* [Our latest Linux articles][5] - -In the **PROMPTING** section of **man bash**, you can find a description of all the special characters in **PS1** and **PS2**. The following are the default options: - -* **\u**: Username - -* **\h**: Short hostname - -* **\W**: Basename of the current working directory (**~** for home, the end of the current directory elsewhere) - -* **\s**: Shell name (**bash** or **sh**, depending on how the shell is called) - -* **\v**: The shell's version - -### What other special strings can I use in the prompts? - -There are a number of special strings that can be useful. - -* **\d**: Expands to the date in the format "Tue Jun 27" - -* **\D{fmt}**: Allows custom date formats—see **man strftime** for the available options - -* **\D{%c}**: Gives the date and time in the current locale - -* **\n**: Include a new line (see multi-line prompts below) - -* **\w**: The full path of the current working directory - -* **\H**: The full hostname for the current machine - -* **\!**: History number—you can run any previous command with its history number by using the shell history event designator **!** followed by the number for the specific command you are interested in. (Using Linux history is yet another tutorial...) - -There are many other special characters—you can see the full list in the **PROMPTING**section of the **Bash man page**. - -### Multi-line prompts - -If you use longer prompts (say if you include **\H** or **\w** or a full **date-time**), you may want to break things over two lines. Here is an example of a multi-line prompt, with the date, time, and current working directory on one line, and **username @hostname** on the second line: - -``` -PS1="\D{%c} \w\n[\u@\H]$ " -``` - -### Are there any other interesting things I can do? - -One thing people occasionally do is create colorful prompts. While I find them annoying and distracting, you may like them. For example, to change the date-time above to display in red text, the directory in cyan, and your username on a yellow background, you could try this: - -``` -PS1="\[\e[31m\]\D{%c}\[\e[0m\] -    \[\e[36m\]\w\[\e[0m\]\n[\[\e[1;43m\]\u\[\e[0m\]@\H]$ " -``` - -To dissect this: - -* **\[..\]** declares some non-printed characters - -* **\e[..** is an escape character. What follows is a special escape sequence to change the color (or other characteristic) in the terminal - -* **31m** is red text (**41m** would be a red background) - -* **36m** is cyan text - -* **1;43m** declares a yellow background (**1;33m** would be yellow text) - -* **\[\e[0m\]** at the end resets the colors to the terminal defaults - -You can find more colors and tips in the [Bash prompt HOWTO][11]. You can even make text inverted or blinking! Why on earth anyone would want to do this, I don't know. But you can! - -What are your favorite Bash prompt customizations? And which ones have you seen that drive you crazy? Let me know in the comments. - --------------------------------------------------------------------------------- - -作者简介: - -Dave Neary - Dave Neary is a member of the Open Source and Standards team at Red Hat, helping make Open Source projects important to Red Hat be successful. Dave has been around the free and open source software world, wearing many different hats, since sending his first patch to the GIMP in 1999. - -via: https://opensource.com/article/17/7/bash-prompt-tips-and-tricks - -作者:[Dave Neary ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/dneary -[1]:https://opensource.com/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[6]:https://opensource.com/article/17/7/bash-prompt-tips-and-tricks?rate=7o5TkSbm_tDUEANDpxTZJU3LgEg0EK-j4xPuNL79m3M -[7]:https://opensource.com/user/16681/feed -[8]:https://www.flickr.com/photos/15587432@N02/3281139507/ -[9]:https://opensource.com/users/jason-baker -[10]:https://creativecommons.org/licenses/by/2.0/ -[11]:http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html -[12]:https://opensource.com/users/dneary -[13]:https://opensource.com/users/dneary -[14]:https://opensource.com/article/17/7/bash-prompt-tips-and-tricks#comments diff --git a/translated/tech/20170707 Bash prompt tips and tricks.md b/translated/tech/20170707 Bash prompt tips and tricks.md new file mode 100644 index 0000000000..dc2977ac1a --- /dev/null +++ b/translated/tech/20170707 Bash prompt tips and tricks.md @@ -0,0 +1,122 @@ +Linux Bash 提示符的一些骚操作 +======================================================= + +###一些能让你自定义 Bash 提示符的黑科技 +![Bash prompt tips and tricks](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/osdc_terminals.png?itok=QmkPW7P1 "Bash prompt tips and tricks") +照片来源 :  + +[ajmexico][8]. 修改自 [Jason Baker][9]. [CC BY-SA 2.0][10]. + +当你在 Linux 环境下打开一个 Shell 终端时,会看到命令行中出现了类似下面的一个提示符: +```git +[user@$host ~]$ +``` +你知道命令行提示符其实是可以自己设置添加许多非常有用的信息的吗?在这篇文章中我就会教你如何自定义自己的 Bash 命令行提示符,想看的话就接着看吧~ + +###如何设置 Bash 提示符 +Bash 提示符是通过环境变量 PS1(提示符字符串1) 来设置的。当然如果你想一次输入多行的数据,可以尝试通过 PS2 环境变量来设置提示符: +```git +[dneary@dhcp-41-137 ~]$ export PS1="[Linux Rulez]$ " +[Linux Rulez] export PS2="... " +[Linux Rulez] if true; then +... echo "Success!" +... fi +Success! +``` + +###在哪里设置 PS1 的值? +PS1 就是一个普通的环境变量,系统默认值设置在 /etc/bashrc 目录中,在我的系统中,默认提示符通过以下命令来设置: +```git +[ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ " +``` +它判断 PS1 是否是系统的默认值 \s-\v$ ,如果是的话则将值设置为 [\u@\h \W]\$。 +如果你想要自定义提示符,就不应该修改 /etc/bashrc ,而是应该在你的用户目录下将自定义命令加到.bashrc文件中。 + +###上面提到的 \u,\h,\W,\s 和 \v 是什么意思? +这里有一些参考链接: +- [Linux 是什么](1) +- [Linux 容器是什么](2) +- [快下载吧:这里有Linux 命令小抄](3) +- [比楼上更高级的 Linux 命令小抄](4) +- [我们最新的 Linux 相关文章](5) +在 man bash 中的 PROMPTING 章节,你能够找到所有 PS1 和 PS2 相关描述符的功能,以下是一些比较常用的: +- \u: 用户名 +- \h: 短主机名 +- \W: 当前你所在的目录名,只显示你的当前父目录 +- \s:Shell 名字(bash 或者 sh,取决于你的 Shell 尊姓大名) +- \v:Shell 的版本号 + +###还有其他的一些特殊的字符串可以用在提示符当中吗 +除了上面这些,还有很多有用的字符串可以用在提示符当中: +- \d:将日期扩展成 "Tue Jun 27" 这种格式 +- \D{fmt}:允许自定义日期格式-可通过 man strftime 来获得更多信息 +- \D{%c}:获得当地的日期和时间 +- \n:换行(参考下面的多行提示符) +- \w:显示当前工作目录的绝对路径 +- \H:党建工作机器的全名 +除了以上这些,你还可以在 Bash man page 的 PROMPTING 部分找到更多的特殊字符和它的用处。 + +###多行提示符 +如果你的提示符过长,想将提示符切成两行,可以使用 "\n" 将提示符切断成两行显示,比如下面的例子会在第一行显示日期,时间和当前工作目录,第二行显示用户名和主机名: +```git +PS1="\D{%c} \w\n[\u@\H]$ " +``` +人们偶尔也想将提示符变成彩色的。虽然我觉得彩色提示符让人分心/易怒,但是也许你很喜欢。如果我们想将日期变成红色的,目录变成青蓝色,用户名搞一个黄色背景,你可以这样做: +```git +PS1="\[\e[31m\]\D{%c}\[\e[0m\] +    \[\e[36m\]\w\[\e[0m\]\n[\[\e[1;43m\]\u\[\e[0m\]@\H]$ " +``` +- [..] :表示不需要打印的字符 +- \e[.. :转义字符,后面的字符串表示颜色或者其他意思 +- 31m :表示红色字体(41m 表示是红色背景) +- 36m :表示是青蓝色字体 +- 1;43m :表示黄色字体(1;33m 表示黄色字体) +- [\e[0m]] :将颜色恢复成系统终端默认颜色 +你可以在[Bash prompt HOWTO](11)这个网站找到更多的颜色代码,甚至可以让字符翻转和闪烁!我可不想这个干,但是你可以! +所以你最喜欢的自定义提示符是什么样子的呢?有没有让你抓狂的自定义提示符呢?请在评论里告诉我吧~ + +作者简介: + +Dave Neary - Dave Neary is a member of the Open Source and Standards team at Red Hat, helping make Open Source projects important to Red Hat be successful. Dave has been around the free and open source software world, wearing many different hats, since sending his first patch to the GIMP in 1999. + +via: https://opensource.com/article/17/7/bash-prompt-tips-and-tricks + +作者:[Dave Neary ][a] +译者:[吴霄/toyijiu](https://github.com/toyijiu) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/dneary +[1]:https://opensource.com/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[6]:https://opensource.com/article/17/7/bash-prompt-tips-and-tricks?rate=7o5TkSbm_tDUEANDpxTZJU3LgEg0EK-j4xPuNL79m3M +[7]:https://opensource.com/user/16681/feed +[8]:https://www.flickr.com/photos/15587432@N02/3281139507/ +[9]:https://opensource.com/users/jason-baker +[10]:https://creativecommons.org/licenses/by/2.0/ +[11]:http://tldp.org/HOWTO/Bash-Prompt-HOWTO/x329.html +[12]:https://opensource.com/users/dneary +[13]:https://opensource.com/users/dneary +[14]:https://opensource.com/article/17/7/bash-prompt-tips-and-tricks#comments + + + + + + + + + + + + + + + + + + From 6cad9ec441524e22c2ee332e810b6c8ec1e16dec Mon Sep 17 00:00:00 2001 From: toyijiu <309378714@qq.com> Date: Thu, 20 Jul 2017 22:06:14 +0900 Subject: [PATCH 0734/1407] =?UTF-8?q?=E7=94=B3=E8=AF=B7=E7=BF=BB=E8=AF=91-?= =?UTF-8?q?WuXiao/toyijiu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ux to the rescue How I introduced my organization to Linux.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md b/sources/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md index f50aa8c411..cab0b693f2 100644 --- a/sources/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md +++ b/sources/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md @@ -1,3 +1,4 @@ +翻译中 by WuXiao/toyijiu Linux to the rescue: How I introduced my organization to Linux ============================================================ From ff1e6b5a298cec799bcd25fdcf4669088e3b433a Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 20 Jul 2017 21:42:58 +0800 Subject: [PATCH 0735/1407] PRF:20170707 Bash prompt tips and tricks.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @toyijiu 总体来说翻译的不错,个别地方略有遗漏,格式上稍有偏离。加油,干的不错! --- .../20170707 Bash prompt tips and tricks.md | 136 +++++++++--------- 1 file changed, 69 insertions(+), 67 deletions(-) diff --git a/translated/tech/20170707 Bash prompt tips and tricks.md b/translated/tech/20170707 Bash prompt tips and tricks.md index dc2977ac1a..b47fce4135 100644 --- a/translated/tech/20170707 Bash prompt tips and tricks.md +++ b/translated/tech/20170707 Bash prompt tips and tricks.md @@ -1,21 +1,23 @@ Linux Bash 提示符的一些骚操作 ======================================================= -###一些能让你自定义 Bash 提示符的黑科技 +> 一些能让你自定义 Bash 提示符的黑科技 + ![Bash prompt tips and tricks](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/osdc_terminals.png?itok=QmkPW7P1 "Bash prompt tips and tricks") -照片来源 :  -[ajmexico][8]. 修改自 [Jason Baker][9]. [CC BY-SA 2.0][10]. +当你在 Linux 环境下打开一个 Shell 终端时,会看到命令行中出现了类似下面的一个 Bash 提示符: -当你在 Linux 环境下打开一个 Shell 终端时,会看到命令行中出现了类似下面的一个提示符: -```git +``` [user@$host ~]$ ``` + 你知道命令行提示符其实是可以自己设置添加许多非常有用的信息的吗?在这篇文章中我就会教你如何自定义自己的 Bash 命令行提示符,想看的话就接着看吧~ -###如何设置 Bash 提示符 -Bash 提示符是通过环境变量 PS1(提示符字符串1) 来设置的。当然如果你想一次输入多行的数据,可以尝试通过 PS2 环境变量来设置提示符: -```git +### 如何设置 Bash 提示符 + +Bash 提示符是通过环境变量 `PS1` (提示符字符串 1Prompt String 1) 来设置的,它用于交互式 shell 提示符。当然如果你需要更多的输入才能完成一个 Bash 命令时,`PS2` 环境变量就是用来设置多行提示符的: + +``` [dneary@dhcp-41-137 ~]$ export PS1="[Linux Rulez]$ " [Linux Rulez] export PS2="... " [Linux Rulez] if true; then @@ -24,66 +26,84 @@ Bash 提示符是通过环境变量 PS1(提示符字符串1) 来设置的。当 Success! ``` -###在哪里设置 PS1 的值? -PS1 就是一个普通的环境变量,系统默认值设置在 /etc/bashrc 目录中,在我的系统中,默认提示符通过以下命令来设置: -```git +### 在哪里设置 PS1 的值? + +`PS1` 就是一个普通的环境变量,系统默认值设置在 `/etc/bashrc` 中,在我的系统中,默认提示符通过以下命令来设置的: + +``` [ "$PS1" = "\\s-\\v\\\$ " ] && PS1="[\u@\h \W]\\$ " ``` -它判断 PS1 是否是系统的默认值 \s-\v$ ,如果是的话则将值设置为 [\u@\h \W]\$。 -如果你想要自定义提示符,就不应该修改 /etc/bashrc ,而是应该在你的用户目录下将自定义命令加到.bashrc文件中。 -###上面提到的 \u,\h,\W,\s 和 \v 是什么意思? -这里有一些参考链接: -- [Linux 是什么](1) -- [Linux 容器是什么](2) -- [快下载吧:这里有Linux 命令小抄](3) -- [比楼上更高级的 Linux 命令小抄](4) -- [我们最新的 Linux 相关文章](5) -在 man bash 中的 PROMPTING 章节,你能够找到所有 PS1 和 PS2 相关描述符的功能,以下是一些比较常用的: -- \u: 用户名 -- \h: 短主机名 -- \W: 当前你所在的目录名,只显示你的当前父目录 -- \s:Shell 名字(bash 或者 sh,取决于你的 Shell 尊姓大名) -- \v:Shell 的版本号 +它判断 `PS1` 是否是系统的默认值 `\s-\v$` ,如果是的话则将值设置为 `[\u@\h \W]\$`。(LCTT 译注:注意命令中用 `\` 做了转义。) + +但如果你想要自定义提示符,不应该修改 `/etc/bashrc` ,而是应该在你的主目录下将自定义命令加到 `.bashrc` 文件中。 + +### 上面提到的 `\u`、`\h`、`\W`、`\s` 和 `\v` 是什么意思? + +在 `man bash` 中的 PROMPTING 章节中,你能够找到所有 `PS1` 和 `PS2` 相关的特殊字符的描述,以下是一些比较常用的: + +- `\u`:用户名 +- `\h`:短主机名 +- `\W`:当前你所在的目录的名称(basename),`~` 表示你的主目录 +- `\s`:Shell 名字(bash 或者 sh,取决于你的 Shell 的名字是什么) +- `\v`:Shell 的版本号 + +### 还有哪些特殊的字符串可以用在提示符当中 -###还有其他的一些特殊的字符串可以用在提示符当中吗 除了上面这些,还有很多有用的字符串可以用在提示符当中: -- \d:将日期扩展成 "Tue Jun 27" 这种格式 -- \D{fmt}:允许自定义日期格式-可通过 man strftime 来获得更多信息 -- \D{%c}:获得当地的日期和时间 -- \n:换行(参考下面的多行提示符) -- \w:显示当前工作目录的绝对路径 -- \H:党建工作机器的全名 -除了以上这些,你还可以在 Bash man page 的 PROMPTING 部分找到更多的特殊字符和它的用处。 -###多行提示符 -如果你的提示符过长,想将提示符切成两行,可以使用 "\n" 将提示符切断成两行显示,比如下面的例子会在第一行显示日期,时间和当前工作目录,第二行显示用户名和主机名: -```git +- `\d`:将日期扩展成 “Tue Jun 27” 这种格式 +- `\D{fmt}`:允许自定义日期格式——可通过 `man strftime` 来获得更多信息 +- `\D{%c}`:获得本地化的日期和时间 +- `\n`:换行(参考下面的多行提示符) +- `\w`:显示当前工作目录的完整路径 +- `\H`:当前工作机器的完整主机名 + +除了以上这些,你还可以在 Bash 的 man 页面的 PROMPTING 部分找到更多的特殊字符和它的用处。 + +### 多行提示符 + +如果你的提示符过长(比如说你想包括 `\H` 、`\w` 或完整的日期时间时 ),想将提示符切成两行,可以使用 `\n` 将提示符切断成两行显示,比如下面的多行的例子会在第一行显示日期、时间和当前工作目录,第二行显示用户名和主机名: + +``` PS1="\D{%c} \w\n[\u@\H]$ " ``` -人们偶尔也想将提示符变成彩色的。虽然我觉得彩色提示符让人分心/易怒,但是也许你很喜欢。如果我们想将日期变成红色的,目录变成青蓝色,用户名搞一个黄色背景,你可以这样做: -```git +### 还能再好玩点吗? + +人们偶尔也想将提示符变成彩色的。虽然我觉得彩色提示符让人分心、易怒,但是也许你很喜欢。如果我们想将日期变成红色的,目录变成青蓝色,用户名搞一个黄色背景,你可以这样做: + +``` PS1="\[\e[31m\]\D{%c}\[\e[0m\]     \[\e[36m\]\w\[\e[0m\]\n[\[\e[1;43m\]\u\[\e[0m\]@\H]$ " ``` -- [..] :表示不需要打印的字符 -- \e[.. :转义字符,后面的字符串表示颜色或者其他意思 -- 31m :表示红色字体(41m 表示是红色背景) -- 36m :表示是青蓝色字体 -- 1;43m :表示黄色字体(1;33m 表示黄色字体) -- [\e[0m]] :将颜色恢复成系统终端默认颜色 -你可以在[Bash prompt HOWTO](11)这个网站找到更多的颜色代码,甚至可以让字符翻转和闪烁!我可不想这个干,但是你可以! + +- `\[..\]` :表示一些非打印字符 +- `\e[..` :转义字符,后面的跟着的特定的转义字符串在终端中表示颜色或者其他意思 +- `31m` :表示红色字体(`41m` 表示是红色背景) +- `36m` :表示是青蓝色字体 +- `1;43m` :表示黄色字体(`1;33m` 表示黄色字体) +- `[\e[0m]]` :它在最后将颜色恢复成系统终端默认颜色 + +你可以在 [Bash prompt HOWTO](11) 这里找到更多的颜色代码,甚至可以让字符反相和闪烁!我不知道为什么地球人会有这种想法,但是你可以这么干! + 所以你最喜欢的自定义提示符是什么样子的呢?有没有让你抓狂的自定义提示符呢?请在评论里告诉我吧~ + +(照片来源:[ajmexico][8]. 修改自 [Jason Baker][9]. [CC BY-SA 2.0][10].) + +--- + 作者简介: -Dave Neary - Dave Neary is a member of the Open Source and Standards team at Red Hat, helping make Open Source projects important to Red Hat be successful. Dave has been around the free and open source software world, wearing many different hats, since sending his first patch to the GIMP in 1999. +Dave Neary - Dave Neary 是红帽开源和标准化团队成员,帮助开源项目对红帽的成功至关重要。自从在 1999 年为 GIMP 提交了第一个补丁以来,他一直带着各种不同的帽子,在开源的世界徜徉。 + +--- via: https://opensource.com/article/17/7/bash-prompt-tips-and-tricks -作者:[Dave Neary ][a] +作者:[Dave Neary][a] 译者:[吴霄/toyijiu](https://github.com/toyijiu) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 @@ -102,21 +122,3 @@ via: https://opensource.com/article/17/7/bash-prompt-tips-and-tricks [12]:https://opensource.com/users/dneary [13]:https://opensource.com/users/dneary [14]:https://opensource.com/article/17/7/bash-prompt-tips-and-tricks#comments - - - - - - - - - - - - - - - - - - From 745f5839e417d9da4e2d09c2105aebc53471e604 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 20 Jul 2017 21:43:48 +0800 Subject: [PATCH 0736/1407] PUB:20170707 Bash prompt tips and tricks.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @toyijiu 明早9点后可在此 URL 见到发布结果: https://linux.cn/article-8711-1.html --- .../tech => published}/20170707 Bash prompt tips and tricks.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170707 Bash prompt tips and tricks.md (100%) diff --git a/translated/tech/20170707 Bash prompt tips and tricks.md b/published/20170707 Bash prompt tips and tricks.md similarity index 100% rename from translated/tech/20170707 Bash prompt tips and tricks.md rename to published/20170707 Bash prompt tips and tricks.md From 34bb4de49b2436ca22da58e18c285efef5276403 Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 21 Jul 2017 08:40:40 +0800 Subject: [PATCH 0737/1407] translated --- ...ylas Mail A Free Email Client For Linux.md | 45 -------------- ...ylas Mail A Free Email Client For Linux.md | 59 +++++++++++++++++++ 2 files changed, 59 insertions(+), 45 deletions(-) delete mode 100644 sources/tech/20170716 Nylas Mail A Free Email Client For Linux.md create mode 100644 translated/tech/20170716 Nylas Mail A Free Email Client For Linux.md diff --git a/sources/tech/20170716 Nylas Mail A Free Email Client For Linux.md b/sources/tech/20170716 Nylas Mail A Free Email Client For Linux.md deleted file mode 100644 index 9ea02a2efe..0000000000 --- a/sources/tech/20170716 Nylas Mail A Free Email Client For Linux.md +++ /dev/null @@ -1,45 +0,0 @@ -translating----geekpi - -# [Nylas Mail A Free Email Client For Linux][7] - - - - [![Nylas Mail An Amazing Free Email Client For Linux](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-mail-review_orig.jpg)][1] ​So questions are being asked whether Ubuntu should still ship with a default email client. Personally, I have not used [Thunderbird][9] in a really long time. I wanna believe this is not the first time the question has been asked but this time I believe there is a really good chance that it is gonna get cut. This is because everyday users tend to resort to web-based clients such as Gmail or Outlook for their email needs. And for the power user on Linux, there are quite a few options available to choose from. [Geary][10], Empathy, Evolution, and Thunderbird itself have served many users quite well for sometime now, but I found something worth checking out: it is called Nylas Mail.​Previously known as [Nylas N1][11] client, [Nylas Mail][12] was introduced early this year in January and along with it came a free version; **Nylas Mail** Basic along with the previously available paid version. Also, back in January, the client was available for only Mac but it is now available for Linux and Windows users. - -### Why Nylas? - -​A lot of people have chosen Nylas Mail for a variety of reasons. Let us take a look at some of the common themes that run around. - -**Simplicity**- Nylas Mail client manages elegance and simplicity. Built in electron, the app is very pretty and easy going. The design also ensures setting up your emails in Nylas is pretty easy and straightforward. [![Nylas mail an awesome email client for linux](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/nylas-mail-an-awesome-email-client-for-linux.jpg?1499814843)][2] ​**Compatibility** - Nylas Mail is compatible with all email providers. It is compatible with Gmail, Yahoo, Exchange and IMAP accounts so you are covered wherever you get your mail. [![nylas compatible with gmail facebook imap](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/nylas-compatible-with-gmail-facebook-imap.jpg?1499814928)][3] **​Powerful features** - Nylas ships with a ton of features. There is a full-screen mode, offline support, multiple layout formats, multiple accounts, unified inboxes, reminders, snoozing, signatures and send later. Some of these features come with the Nylas Mail Basic. [![nylas email client powerful features](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/nylas-email-client-powerful-features.jpg?1499814992)][4] **​Hybrid backend** - Previously, Nylas sort of synced a copy of your mail into a server using the Nylas cloud and this was like mehn for many people. Fortunately, with the latest version, Nylas now employs a hybrid backend that connects directly to your email providers such as Gmail or Outlook. The cloud sync, although is still available, is only used when you use advanced subscription tools such as snoozing and tracking. The downside is that it is one or the other. Want some pro features, you require cloud sync, you don’t want cloud sync, you miss out on those features. [![nylas email hybrid backend](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/editor/nylas-email-hybrid-backend.jpg?1499815041)][5] **​Open-source and a free edition** - Nylas mail is available as an open source project. This means you can take the code and build it up yourself. You can even setup your own server to sidestep the issue. [![nylas open source and free email client](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/nylas-open-source-and-free-email-client.jpg?1499815091)][6] **Cross-platform** - Nylas is a cross-platform app available on Linux, Windows and Mac OS X. So regardless of which desktop operating system you prefer, you can rest assured that Nylas has you covered. And the experience is the same all across. - -### What needs some work? - -So far so good with Nylas email clients but there are a few gripes. First is the paid option which was introduced back in 2016\. The introduction of the free version kind of deals with this issue but the fact that some of the features are only available for the costly price of about $9/month is off-putting for most people including me. Also, not many people like to keep copies of their mail on a server somewhere. Of course, you can set up your own server but who needs the hassle. Lastly, for an app that runs in the background, it can be quite the memory hog. I hope it is not due to the fact that it is written mainly in electron and I want to believe this is going to get better with updates and improvements - -### Conclusion - -**​Nylas Mail** hits a very sweet spot for me in terms of features and function and I believe you definitely should check it out. As an email client, it is pretty effective and I'm really liking Nylas Mail and will definitely keep it around. Maybe you should too. Kudos to the developers for the good work being done. Do you have another app you want us to take a look at? Point it out in the comments below and share your thoughts and comments as well. | - --------------------------------------------------------------------------------- - -via: http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux - -作者:[http://www.linuxandubuntu.com ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux -[1]:http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux -[2]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-mail-an-awesome-email-client-for-linux_orig.jpg -[3]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-compatible-with-gmail-facebook-imap_orig.jpg -[4]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-email-client-powerful-features_orig.jpg -[5]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-email-hybrid-backend_orig.jpg -[6]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-open-source-and-free-email-client_orig.jpg -[7]:http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux -[8]:http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux#comments -[9]:http://www.linuxandubuntu.com/home/thunderbird-release-with-several-bug-fixes -[10]:http://www.linuxandubuntu.com/home/geany-a-lightweight-ide-or-code-editor-for-programmers -[11]:http://www.linuxandubuntu.com/home/nylas-n1-a-premium-email-client-for-linux -[12]:https://www.nylas.com/nylas-mail/ diff --git a/translated/tech/20170716 Nylas Mail A Free Email Client For Linux.md b/translated/tech/20170716 Nylas Mail A Free Email Client For Linux.md new file mode 100644 index 0000000000..1eb2eeacb2 --- /dev/null +++ b/translated/tech/20170716 Nylas Mail A Free Email Client For Linux.md @@ -0,0 +1,59 @@ +# [Nylas Mail 一个 Linux 中免费的邮件客户端][7] + + + [![Nylas Mail An Amazing Free Email Client For Linux](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-mail-review_orig.jpg)][1] + 有一个被提及的问题是 Ubuntu 是否还应该附有默认的电子邮件客户端。就个人而言,我已经很长时间没有使用 [Thunderbird][9] 了。我相信这不是一个第一次被问到的问题,但我相信这是一个很好的机会把它裁剪掉。这是因为日常用户倾向于使用基于网络的客户端,例如 Gmail 或 Outlook 来满足其邮件需求。而对于 Linux 上的经验丰富的用户而言,还有很多可供选择的选项。[Geary][10]、Empathy、Evolution 和 Thunderbird 本身已经为很多用户提供了很好的服务,但是我发现了值得一试的东西:它被称为 Nylas Mail。 +它以前被称为 [Nylas N1][11],Nylas Mail 于今年初在 1 月份推出,接着是一个免费版本; **Nylas Mail** Basic 以及以前提供的付费版本。此外,在 1 月份,客户端仅适用于 Mac,但现在可用于 Linux 和 Windows 用户。 + +### 为什么使用 Nylas? + +​很多人因为种种原因选择了 Nylas Mail。让我们来看看一些常见的原因。 + +**简单** - Nylas Mail 客户端管理优雅简单。用 electron 构建,应用非常漂亮,容易使用。该设计还确保在 Nylas 中设置电子邮件非常简单直接。 +[![Nylas mail an awesome email client for linux](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/nylas-mail-an-awesome-email-client-for-linux.jpg?1499814843)][2] + +**兼容性** - Nylas Mail 与所有电子邮件提供商兼容。它与 Gmail、Yahoo、Exchange 和 IMAP 帐户兼容,因此你可以在任何地方收到邮件。 + [![nylas compatible with gmail facebook imap](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/nylas-compatible-with-gmail-facebook-imap.jpg?1499814928)][3] + +**​强大的功能**​ - Nylas 拥有大量功能。它有一个全屏模式、离线支持、多布局格式、多帐户、统一的收件箱、提醒、打盹、签名和稍后发送功能。其中一些功能随 Nylas Mail Basic 一起提供。 + [![nylas email client powerful features](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/nylas-email-client-powerful-features.jpg?1499814992)][4] + +**​混合后端 **​ - 以前,Nylas 将邮件的一个副本同步到使用 Nylas 云的服务器中,这对许多人来说就像 mehn 一样。幸运的是,在最新版本中,Nylas 采用了一个混合后端,可直接连接到 Gmail 或 Outlook 等电子邮件提供商。云同步虽然仍然可用,但仅在使用高级订阅工具(如打盹和跟踪)时使用。缺点是它是一个或另一个后端。想要一些专业功能,你需要云同步,你不想要云同步,那你错过了这些功能。 + [![nylas email hybrid backend](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/editor/nylas-email-hybrid-backend.jpg?1499815041)][5] + + **​开源和免费版 **​ - Nylas 作为开源项目。这意味着你可以自己编写代码并自行构建。你甚至可以设置自己的服务器以回避问题。 +[![nylas open source and free email client](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/nylas-open-source-and-free-email-client.jpg?1499815091)][6] + +**跨平台** - Nylas 是在 Linux、Windows 和 Mac OS X 上提供的跨平台应用程序。因此,无论你喜欢哪种桌面操作系统,你都可以放心,因为 Nylas 都已经覆盖了。而且用法是相同的。 + +### 还要做些什么? + +到目前为止,Nylas 邮件客户端很好,但有一些抱怨。首先是在 2016 年推出的付费选项。引入免费版本有点像是这个问题的方案,但事实上,一些功能只能用每月 $9 的价格使用让包括我在内的大部分人不快。此外,没有多少人喜欢将邮件的副本保存在某台服务器上。当然,你可以设置自己的服务器,但有些麻烦。最后,对于在后台运行的应用程序,它需要当当多的内存。我希望这不是因为它主要是用 electron 写的,我相信随着它的更新和改进,它会变得更好。 + +### 总结 + +**​Nylas Mail** 在特性和功能方面对我来说非常棒,我相信你一定要用一下。作为一个电子邮件客户端,它是非常有效的,我真的很喜欢 Nylas Mail,并且一定会一直使用它。也许你应该也会。向开发人员的所做的工作致谢。你有其他的程序想让我们看下么?在下面的评论中指出,并分享你的想法和意见。 + +-------------------------------------------------------------------------------- + +via: http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux + +作者:[http://www.linuxandubuntu.com ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux +[1]:http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux +[2]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-mail-an-awesome-email-client-for-linux_orig.jpg +[3]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-compatible-with-gmail-facebook-imap_orig.jpg +[4]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-email-client-powerful-features_orig.jpg +[5]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-email-hybrid-backend_orig.jpg +[6]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-open-source-and-free-email-client_orig.jpg +[7]:http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux +[8]:http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux#comments +[9]:http://www.linuxandubuntu.com/home/thunderbird-release-with-several-bug-fixes +[10]:http://www.linuxandubuntu.com/home/geany-a-lightweight-ide-or-code-editor-for-programmers +[11]:http://www.linuxandubuntu.com/home/nylas-n1-a-premium-email-client-for-linux +[12]:https://www.nylas.com/nylas-mail/ From 01f8b5eb1dbadb3ee28da96d345e64f233fab938 Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 21 Jul 2017 08:46:38 +0800 Subject: [PATCH 0738/1407] translating --- ...0629 This is how you OpenStack 6 new guides and tutorials.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md b/sources/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md index 9948fd1207..abd64f992a 100644 --- a/sources/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md +++ b/sources/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md @@ -1,3 +1,5 @@ +translating----geekpi + This is how you OpenStack: 6 new guides and tutorials ============================================================ From df7bff7690c3fa39c3599c86ad706e13fe7acc1b Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 21 Jul 2017 10:07:55 +0800 Subject: [PATCH 0739/1407] PRF&PUB:31 The (updated) history of Android.md @alim0x --- .../31 The (updated) history of Android.md | 150 ++++-------------- 1 file changed, 33 insertions(+), 117 deletions(-) rename {translated/talk => published}/The history of Android/31 The (updated) history of Android.md (77%) diff --git a/translated/talk/The history of Android/31 The (updated) history of Android.md b/published/The history of Android/31 The (updated) history of Android.md similarity index 77% rename from translated/talk/The history of Android/31 The (updated) history of Android.md rename to published/The history of Android/31 The (updated) history of Android.md index c9c819c4b1..4e2727334f 100644 --- a/translated/talk/The history of Android/31 The (updated) history of Android.md +++ b/published/The history of Android/31 The (updated) history of Android.md @@ -1,89 +1,36 @@ -安卓编年史 +安卓编年史(31):安卓 6.0 棉花糖 +============== ### 安卓 6.0 棉花糖 2015 年 10 月,谷歌给世界带来了安卓 6.0 棉花糖。配合这个版本的发布,谷歌委托生产了两部新的 Nexus 设备:[华为 Nexus 6P 和 LG Nexus 5X][39]。除了常规的性能升级,新手机还带有一套关键硬件:为棉花糖的新指纹 API 准备的指纹识别器。棉花糖还引入了一个疯狂的全新搜索特性,被称作“Google Now on Tap”,用户控制的应用权限,一个全新的数据备份系统,以及许多其它的改良。 +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/32-1-1440x1466.jpg) + #### 新谷歌应用 - - -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/32-1-150x150.jpg) - ][3] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/app-drawer-150x150.jpg) - ][4] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/2015-10-01-19.01.201-150x150.png) - ][5] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/Untitled-3-150x150.gif) - ][6] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/google-now-home-150x150.jpg) - ][7] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/typing-150x150.jpg) - ][8] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/serp-150x150.jpg) - ][9] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/voice-150x150.jpg) - ][10] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/icons-150x150.jpg) - ][11] - 棉花糖是[谷歌大标志重新设计][40]后的第一个安卓版本。系统也随之升级,主要是一个新的谷歌应用,给搜索小部件,搜索页面以及应用图标添加了一个多彩的标志。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/app-drawer.jpg) + 谷歌将应用抽屉从页面导航的横向布局还原回了单页竖直滚动表的形式。早期版本的安卓用的都是竖直滚动表的形式,直到谷歌在蜂巢中改成了横向页面系统。滚动单页面让人更容易从很多应用中找到目标。一项“快速滚动”的特性同样好用,它可以让你拖动滚动条来激活字母索引。新的应用抽屉布局也用到了小部件抽屉上。考虑到旧系统中小部件轻松就超过了 15 页,这是个大改进。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/2015-10-01-19.01.201.png) + 棉花糖应用抽屉顶部的“建议应用”栏也让查找应用变得更快。该栏显示的内容一直在变化,试图在你需要的时候为你提供你需要的应用。它使用了算法来统计应用使用,经常一起打开的应用以及每天的打开次数。 #### Google Now on Tap——一个没有完美实现的特性 - - -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/ontap-150x150.jpg) - ][12] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/onta3p-150x150.jpg) - ][13] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/now-on-tap-150x150.jpg) - ][14] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/fail1-150x150.jpg) - ][15] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/youtube-150x150.jpg) - ][16] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/apps-150x150.jpg) - ][17] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/fail2-150x150.jpg) - ][18] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/hangouts-150x150.jpg) - ][19] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/voice-context-150x150.jpg) - ][20] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/wrongstephen-150x150.jpg) - ][21] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/assist-api-980x576-150x150.jpg) - ][22] +![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/ontap.jpg) 棉花糖的头等新特性之一就是“Google Now on Tap”。有了 Now on Tap,你可以在安卓的任意界面长按 home 键,安卓会将整个屏幕发送给谷歌进行处理。谷歌会试着分析页面上的内容,并从屏幕底部弹出显示一个特殊的搜索结果列表。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/onta3p.jpg) + Now on Tap 产生的结果不是通常的 10 个蓝色链接——即便那必定有一个通往谷歌搜索的链接。Now on Tap 还可以深度连接到其它使用了谷歌的应用索引功能的应用。他们的想法是你可以在 Youtube 音乐视频那里唤出 Now on tap,然后获得一个到谷歌 Play 或亚马逊“购买”页面的链接。在演员新闻文章处唤出 Now on Tap 可以链接到 IMDb 应用中该演员的页面上。 +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/assist-api-980x576.jpg) + 谷歌没有让这成为私有特性,而是给安卓创建了一个全新的“Assistant API(助理 API)”。用户可以挑选一个“助理应用”,它可以在长按 home 键的时候获取很多信息。助理应用会获取所有由当前应用加载的数据——不仅是直接从屏幕获取到的——连同所有这些图片还有任何开发者想要包含的元数据。这个 API 驱动了谷歌 Now on Tap,如果愿意的话,它还允许第三方打造 Now on Tap 的竞争对手。 谷歌在棉花糖的发布会上炒作了 Now on Tap,但实际上,这项特性不是很实用。谷歌搜索的价值在于你可以问它准确的问题——你输入你想要的内容,它搜索整个互联网寻找答案或网页。Now on Tap 让事情变得无限困难,因为它甚至不知道你要问的是什么。你带着特定意图打开了 Now on Tap,但你发送给谷歌的查询是很不准确的“屏幕上的所有内容”。谷歌需要猜测你查询的内容然后试着基于它给出有用的结果或操作。 @@ -96,75 +43,44 @@ Now on Tap 产生的结果不是通常的 10 个蓝色链接——即便那必 #### 权限 - -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/33-1-150x150.jpg) - ][23] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/34-1-150x150.jpg) - ][24] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/perm-150x150.jpg) - ][25] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/denied-1-150x150.jpg) - ][26] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/denied-2-150x150.jpg) - ][27] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/apps-150x150.jpg) - ][28] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/overlay-150x150.jpg) - ][29] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/system-permisions-150x150.jpg) - ][30] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/warning-150x150.jpg) - ][31] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/Google_IO_2015_-_Android_M_Permissions_-_YouTube_-_Google_Chrome_2015-09-04_12-31-49-150x150.jpg) - ][32] +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/33-1-1440x1454.jpg) 安卓 6.0 终于引入了应用权限系统,让用户可以细粒度地控制应用可以访问的数据。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/perm.jpg) + +![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/denied-1.jpg) + 应用在安装的时候不再给你一份长长的权限列表。在棉花糖中,应用安装根本不询问任何权限。当应用需要一个权限的时候——比如访问你的位置、摄像头、麦克风,或联系人列表的时候——它们会在需要用到的时候询问。在你使用应用的时候,如果需要新权限时会弹出一个“允许或拒绝”的对话框。一些应用的设置流程这么处理:在启动的时候询问获取一些关键权限,其它的等到需要用到的时候再弹出提示。这样更好地与用户沟通了需要权限是为了做什么——应用需要摄像头权限,因为你刚刚点击了摄像头按钮。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/apps.jpg) + +![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/system-permisions.jpg) + 除了及时的“允许或拒绝”对话框,棉花糖还添加了一个权限设置界面。这个复选框大列表让数据敏感用户可以浏览应用拥有的权限。他们不仅可以通过应用来查询,也可以通过权限来查询。举个例子,你可以查看所有拥有访问麦克风权限的应用。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/warning.jpg) + 谷歌试验应用权限已经有一段时间了,这些设置界面基本就是隐藏的“[App Ops][42]”系统的重生,它是在安卓 4.3 中不小心引入并很快被移除的权限管理系统。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/Google_IO_2015_-_Android_M_Permissions_-_YouTube_-_Google_Chrome_2015-09-04_12-31-49.jpg) + 尽管谷歌在之前版本就试验过了,棉花糖的权限系统最大的不同是它代表了一个向权限系统的有序过渡。安卓 4.3 的 App Ops 从没有计划暴露给用户,所以开发者不了解它。在 4.3 中拒绝一个应用需要的一个权限经常导致奇怪的错误信息或一个彻底的崩溃。棉花糖的系统对开发者是缺省的——新的权限系统只适用于针对棉花糖 SDK 开发的应用,谷歌将它作为开发者已经为权限处理做好准备的信号。权限系统还允许在一项功能由于权限被拒绝无法正常工作时与用户进行沟通。应用会被告知它们的权限请求被拒绝,它们可以指导用户在需要该功能的时候去打开该权限访问。 #### 指纹 API +![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/finger1.jpg) - -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/finger1-150x150.jpg) - ][33] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/fingerlock-150x150.jpg) - ][34] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/2015-10-16-17.19.36-150x150.png) - ][35] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/fingerprintplaystore-150x150.jpg) - ][36] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/confirm-150x150.jpg) - ][37] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/2015-09-04_16-38-31-150x150.png) - ][38] +![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/fingerlock.jpg) 在棉花糖出现之前,少数厂商推出了他们自己的指纹解决方案以作为对[苹果的 Touch ID][43] 的回应。但在棉花糖中,谷歌终于带来了生态级别的指纹识别 API。新系统包含了指纹注册界面,指纹验证锁屏以及允许应用将内容保护在一个指纹扫描或锁屏验证之后的 API。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/fingerprintplaystore.jpg) + Play 商店是最先支持该 API 的应用之一。你可以使用你的指纹来购买应用,而不用输入你的密码。Nexus 5X 和 6P 是最先支持指纹 API 的手机,手机背面带有指纹读取硬件。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/2015-09-04_16-38-31.png) + 指纹 API 推出不久后时间,是罕见的安卓生态合作例子之一。所有带有指纹识别的手机都使用谷歌的 API,并且大多数银行和购物应用都很好地支持了它。 -------------------------------------------------------------------------------- @@ -179,7 +95,7 @@ via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-histor 作者:[RON AMADEO][a] 译者:[alim0x](https://github.com/alim0x) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From e6fa90c976cd401b096984955ec44cfcd95f5319 Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 21 Jul 2017 10:11:43 +0800 Subject: [PATCH 0740/1407] =?UTF-8?q?=E6=9B=B4=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- published/20170707 Bash prompt tips and tricks.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/published/20170707 Bash prompt tips and tricks.md b/published/20170707 Bash prompt tips and tricks.md index b47fce4135..547d2c5963 100644 --- a/published/20170707 Bash prompt tips and tricks.md +++ b/published/20170707 Bash prompt tips and tricks.md @@ -84,7 +84,7 @@ PS1="\[\e[31m\]\D{%c}\[\e[0m\] - `1;43m` :表示黄色字体(`1;33m` 表示黄色字体) - `[\e[0m]]` :它在最后将颜色恢复成系统终端默认颜色 -你可以在 [Bash prompt HOWTO](11) 这里找到更多的颜色代码,甚至可以让字符反相和闪烁!我不知道为什么地球人会有这种想法,但是你可以这么干! +你可以在 [Bash prompt HOWTO][11] 这里找到更多的颜色代码,甚至可以让字符反相和闪烁!我不知道为什么地球人会有这种想法,但是你可以这么干! 所以你最喜欢的自定义提示符是什么样子的呢?有没有让你抓狂的自定义提示符呢?请在评论里告诉我吧~ From 80c81f839cd1de3c24fd3b685b3e8b19a4d33714 Mon Sep 17 00:00:00 2001 From: datastruct Date: Fri, 21 Jul 2017 10:47:14 +0800 Subject: [PATCH 0741/1407] Update 20170523 An introduction to Libral a systems management library for Linux.md --- ... Libral a systems management library for Linux.md | 12 ++++-------- 1 file changed, 4 insertions(+), 8 deletions(-) diff --git a/translated/tech/20170523 An introduction to Libral a systems management library for Linux.md b/translated/tech/20170523 An introduction to Libral a systems management library for Linux.md index 2cc45b63ae..4df3353824 100644 --- a/translated/tech/20170523 An introduction to Libral a systems management library for Linux.md +++ b/translated/tech/20170523 An introduction to Libral a systems management library for Linux.md @@ -45,11 +45,7 @@ ralsh hostmyhost.example.com ip=10.0.0.1 \ Libral 可以在[这个 git 仓库][12]找到并下载。其核心是由 C++ 编写的,构建它的说明可以[在该仓库中][13]找到,不过只是在你想要为 Libral 的 C++ 核心做贡献的时候才需要看它。Libral 的网站上包含了一个 [预构建的 tarball][14],可以用在任何使用 “glibc 2.12” 或者更高版本的 Linux 机器上。可以使用该 “tarball” 的内容进一步探究 ralsh 和开发新的提供者(provider),它使得 Libral 具备了管理新类型资源的能力。 - -After downloading and unpacking the tarball, the **ralsh** command can be found in **ral/bin**. Running it without arguments will list all resource types that Libral knows about. Passing the **--help **option prints output that contains more example of how to use **ralsh**. - -下载完毕后解压“tarball”,“ralsh”命令就会生成在目录“ral/bin”下。运行这个不需要任何参数的命令就会将 Libral 所知道所有资源类型列举出来。利用“--help“选项打印输出关于”ralsh“更多的实例。 - +在下载解压“tarball”后,在目录“ral/bin”下就会生成“ralsh”命令。运行不需要任何参数的“ralsh”命令就会将 Libral 的所有资源类型列举出来。利用“--help“选项打印输出关于”ralsh“更多的说明。 ### 与配置管理系统的关系 @@ -70,8 +66,8 @@ After downloading and unpacking the tarball, the **ralsh** command can be foun Basing a management API on desired state, i.e., the idea that the user expresses what the system should look like after an operation rather than how to get into that state, is hardly controversial at this point. Bidirectionality makes it possible to use the same API and, more importantly, the same resource abstractions to read existing state and to enforce changes to it. Lightweight abstractions ensure that it is easy to learn the API and make use of it quickly; past attempts at such management APIs have unduly burdened the user with learning a modeling framework, an important factor in their lack of adoption. -基于期望的状态的管理 API,举个例子来说,这个理解应该是当用户在一个操作执行后希望系统看起来是什么表达方式,而不是怎么进入这个状态,在这一点上很难引起争议。双向性使得使用相同的 API 成为可能,更重要的是,相同的资源抽象成读取已经存在的和强制改变它。轻量级的抽象行为确保能容易的学习和快速的使用API;过去尝试管理 API 的方式已经过度的加重了学习框架建模的使用者的负担了,一个重要的因素是他们的接受力缺乏。 - +建立一个期望状态的管理 API,举个例子来说,用户表示当操作执行后希望系统看起来是什么状态,而不是怎样进入这个状态,是很难引起争议的。双向性使得使用相同的 API 成为可能,更重要的是,相同的资源抽象成读取现有状态和强制修改成这种状态。轻量级的抽象行为确保能容易的学习 API 并能快速的使用;过去尝试管理 API 的方式已经过度加重了学习建模框架的使用者的负担了,一个重要的因素是他们的接受力缺乏。 +--> Finally, it has to be easy to extend Libral's management capabilities so that users can teach Libral how to manage new kinds of resources. This is important both because of the sheer amount of resources that one might want to manage (and that Libral will manage in due time), as well as because even a fully built-out Libral will always fall short of a user's custom management needs. @@ -221,7 +217,7 @@ Libral 有很多方式方法,如 API ,它的性能在不断地进化发展 If any of this has made you curious, I would love to hear from you, be it in the form of a pull request, an enhancement request, or just a report of your experience trying out **ralsh**. -如果这让你很好奇,我很想听听你的想法,可以使推拉请求的方式,可以是增强请求方式,亦或者报告你对“ralsh”测试的经验体验。 +如果这让你很好奇,我很想听听你的想法,可以用推拉请求的方式,可以是增强请求方式,亦或者报告你对“ralsh”测试的经验体验。 (题图:[Internet Archive Book Images][10],修改:Opensource.com. CC BY-SA 4.0) -------------------------------------------------------------------------------- From c781174e0077a8fc4d0683e07c6b990dcc28fabe Mon Sep 17 00:00:00 2001 From: toyijiu <309378714@qq.com> Date: Fri, 21 Jul 2017 22:54:41 +0900 Subject: [PATCH 0742/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=AE=8C=E6=88=90-?= =?UTF-8?q?toyijiu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...w I introduced my organization to Linux.md | 124 ------------------ ...w I introduced my organization to Linux.md | 118 +++++++++++++++++ 2 files changed, 118 insertions(+), 124 deletions(-) delete mode 100644 sources/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md create mode 100644 translated/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md diff --git a/sources/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md b/sources/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md deleted file mode 100644 index cab0b693f2..0000000000 --- a/sources/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md +++ /dev/null @@ -1,124 +0,0 @@ -翻译中 by WuXiao/toyijiu -Linux to the rescue: How I introduced my organization to Linux -============================================================ - -### After a very public early failure, a large university's IT team finds switching its web registration system to Linux nearly triples user capacity. - - -![Linux to the rescue: How I introduced my organization to Linux](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/OSDC_Penguin_Image_520x292_12324207_0714_mm_v1a.png?itok=WfAkwbFy "Linux to the rescue: How I introduced my organization to Linux") -Image by :  - -Opensource.com - -In 1998, I managed the server administration group for the new web team at the University of Minnesota. The U of M is a very large institution, with over 60,000 students across all system campuses. Until then, the university managed its student records on an aging mainframe system. But that was all about to change. - -The mainframe was not Y2K compliant, so we were working to set up a new student records system delivered by PeopleSoft. The new system was a big deal to the university in many ways, not only for modernizing our records system but also for offering new features. Yet it lacked one key feature: You couldn't register for classes from your web browser. - -That may seem like a major oversight by today's standards, but in the late 1990s, the World Wide Web was still pretty new. Amazon was only a few years old. eBay had just reached its first birthday. Google had recently gone live. Wikipedia didn't exist yet. In context, it's not that surprising that in 1998 PeopleSoft didn't support registering for courses via the web. But as a pioneering university that originated the Gopher network and created a functional web interface to the previous mainframe system, we believed web registration was a critical feature for the new student records system. - -More Linux resources - -* [What is Linux?][1] - -* [What are Linux containers?][2] - -* [Download Now: Linux commands cheat sheet][3] - -* [Advanced Linux commands cheat sheet][4] - -* [Our latest Linux articles][5] - -Our job on the web team was to build that missing web registration frontend to PeopleSoft. - -Fortunately, we didn't have to do it alone. We contracted with IBM, and over the next year, we worked together to build the new web registration system. IBM donated hardware and software to run the new web system: Three SP computer nodes running the latest versions of AIX, IBM Java, and IBM WebSphere, with a separate IBM load balancer dividing traffic between the three nodes. - -![AIX network diagram](https://opensource.com/sites/default/files/resize/diagram-aix_0-700x363.png "AIX network diagram") - -After more than a year of development and testing, we finally went live! Unfortunately, it was an immediate failure. - -### Too much load - -Throughout development, we were unable to realistically simulate the load of many students accessing the new system at once. But it was not from lack of trying. The university had a custom web load test software package, and IBM supplemented it with its own tool. But the web was still pretty new, and we didn't realize the web load testing tools just weren't up to the job yet. - -After months of load testing with both tools, we had tuned the new web registration system for an expected load of 240 concurrent users. - -Unfortunately, our actual usage was almost twice that. On day one, as soon as the system came online, over 400 students simultaneously signed into the new web registration system. Overwhelmed by the unexpected load, the three web servers crashed. We found ourselves constantly restarting the web servers as the high web traffic continued to crush them. As soon as we restarted one web server, the next would go down. And so on, for the entire month-long registration period. - -Without a reliable way to register for classes on the web, students had to sign up for classes the old-fashioned way: by going to the registrar's office. Lines to register went down the hallway and out the door. It wasn't long before the bad news hit the local news, with headlines such as "Computer failure forces students to register in person." - -![Negative headlines about web registration crashes](https://opensource.com/sites/default/files/resize/headlines-700x522.jpg "Negative headlines about web registration crashes") - -Having faced a very public defeat, we did our best to improve things for the next registration cycle, only six months away. We worked frantically to increase the capacity of the web system. Despite many code fixes and configuration tweaks, we were unable to boost the system to sufficiently support more users. Try as we might, we faced certain failure at the next registration cycle. - -And as feared, the web system again failed dramatically at our next registration. The servers crashed again and again under the immense load. This time, the news headlines included such gems as: "Web registration system is worthless." - -With another six months before our next go-live, we felt trapped. No one could figure out why the system was constantly crashing under load. We knew it would fail again at the next registration period. We had to do something, anything, to improve the system. But what to do? Every option was on the table. - -### What if we changed platforms? - -IBM had recently embraced Linux, releasing Linux versions of its Java and WebSphere products. All products were certified for RHEL (Red Hat Enterprise Linux), which several of us were already running on our desktop systems. We realized we now had the ecosystem to run the web registration system on Linux, as a supported platform. But would it perform any better on Linux than AIX? - -After setting up a test server and running initial load tests, we were stunned to see one Linux server easily supporting what three AIX servers could not. A single Linux server running the same web registration code with the same IBM Java and IBM WebSphere sustained over 200 users. - -We shared our findings with the registrar and the CIO, who approved our plan to migrate the web registration system to Linux. It was our first time running Linux in the University of Minnesota enterprise, but we had nothing to lose. The AIX system would fail again, anyway. Linux was a long shot, but it was our only hope. - -We immediately ramped up new Linux servers for production. Colleagues in another team diverted several Intel servers to our effort, where we installed RHEL and the IBM components. We performed countless series of load tests on the new system, looking for weak points, only to find the Linux servers running smoothly. - -After a restless two months, we finally went live. And it was a resounding success! The web registration system performed flawlessly on Linux, despite heavy usage. At our peak during that registration period, the Linux servers managed over 600 concurrent users, with barely a blip. Linux had rescued web registration at the University of Minnesota. - -### Lessons for success - -As I look back on that massive rescue operation, I find several themes you can use to introduce Linux in your own organization: - -1. **Solve a problem, don't stroke an ego.** - -When we proposed running Linux in the enterprise, we weren't doing it because we thought Linux was cool. Sure, we were Linux fans and we already ran Linux on the desktop and at home, but we were there to solve a problem. Our registrar and other stakeholders appreciated that Linux was a solution to a problem, not just something we wanted to do because Linux was cool. - -1. **Change as little as possible.** - -Our success hinged on the fact that IBM had finally released versions of its Java and WebSphere products for Linux. This allowed us to minimize changes to the system as we migrated from AIX to Linux. Comparing the AIX configuration to the Linux configuration, only the hardware and operating system changed. Every other component on the system remained the same. It was this "known" quantity that instilled confidence in making the change. - -![AIX cost diagram](https://opensource.com/sites/default/files/resize/cost-diagram-aix-700x363.png "AIX cost diagram") - -![Linux cost diagram](https://opensource.com/sites/default/files/resize/cost-diagram-linux-700x363.png "Linux cost diagram") - -1. **Be honest about the risks and benefits.** - -Our problem was obvious: Web registration had failed in our previous two registration cycles and would likely fail again. When we presented our idea to our stakeholders, proposing that we replace the AIX web servers with Linux, we were open about the expected risks and benefits. The bottom line was if we changed nothing, we would fail. If we tried Linux, we might fail or we might not. We shared our findings from our initial load tests, which demonstrated that Linux was more likely to succeed than fail. - -But even if Linux failed, we could easily put the old AIX servers back into production. That "fallback" preparation reassured the registrar that we had appropriately measured the benefits and the risks and were prepared in case things went wrong. - -1. **Communicate broadly.** - -In making our pitch to migrate to Linux, we cast a wide net. We wrote an executive white paper that clearly communicated what we planned to do and why we thought it would work. The key to this white paper's success was its brevity. Executives do not want to read a "novel" about a technical idea, nor do they want to get mired in the technical details. We intentionally wrote the white paper for the executive level, describing our proposal in broad strokes. - -As we replaced the system with Linux, we provided regular updates to inform our stakeholders about our progress to build the new Linux system. After we finally went live on the Linux web registration system, we posted daily updates, reporting how many students had registered for classes on the new system, and if we saw any problems. - -Even though it's been nearly two decades since our early failure with AIX and very successful experiment with Linux, all of these lessons still apply. Sure, Linux did the heavy lifting here, but our overall success was due to bringing people together in the spirit of solving a common problem. And that's a lesson that I think you can apply to pretty much any situation you face. - --------------------------------------------------------------------------------- - -作者简介: - -Jim Hall - I am the founder and coordinator of the FreeDOS Project. I also serve as a director on the GNOME Foundation Board of Directors. At work, I am the Chief Information Officer for Ramsey County, Minnesota. In my spare time, I contribute to usability in open source software, and mentor usability testing in GNOME via Outreachy (formerly the GNOME Outreach Program for Women). - - -via: https://opensource.com/article/17/7/how-introduced-organization-linux - -作者:[ Jim Hall ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/jim-hall -[1]:https://opensource.com/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[6]:https://opensource.com/article/17/7/how-introduced-organization-linux?rate=G1WfZzJPTN4w4fVviJ7iFru6ZBDBBTKkT8QRxSh727g -[7]:https://opensource.com/user/126046/feed -[8]:https://opensource.com/users/jim-hall -[9]:https://opensource.com/users/jim-hall -[10]:https://opensource.com/article/17/7/how-introduced-organization-linux#comments diff --git a/translated/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md b/translated/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md new file mode 100644 index 0000000000..6bcc1dddc5 --- /dev/null +++ b/translated/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md @@ -0,0 +1,118 @@ +拯救者 Liunx:我是如何向团队介绍引入 Liunx 的 +============================================================ + +###在项目早期就遇到公开的失败后,一个著名大学的 IT 团队决定将他们的 web 注册系统部署到 Liunx上,此举几乎将服务器的最大用户访问量提高了3倍 + +![Linux to the rescue: How I introduced my organization to Linux](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/OSDC_Penguin_Image_520x292_12324207_0714_mm_v1a.png?itok=WfAkwbFy "Linux to the rescue: How I introduced my organization to Linux") +图片来源于 :  + +Opensource.com + +1998年,我在明尼苏达大学为一个新的 web 团队管理他们的服务器群。明尼苏达大学是一个非常大的大学,拥有接近 6000 名在校大学生。当时学校是用一个上了年纪的大型机系统来做学生的档案管理系统,这种系统已经过时了,所以需要做出改变。 + +这个系统不是 Y2K 类型的(保存年份时只用两位数,导致记录 2000 年时计算机会记录为 1900 年,详见[What Does Y2K Compliant Mean?](https://stackoverflow.com/questions/18200744/what-does-y2k-compliant-mean)),所以我们准备建立一个新的学生档案管理系统并由仁科软件公司来交付。这个新系统对明尼苏达大学来说有很多作用,不仅能够管理学生的档案,还能提供其他的一些功能。然而它却缺少了一项关键特性:你不能在你的浏览器上通过web来给你的班级进行注册。 + +按照今天的标准来看,这是一个重大的疏忽,但是在二十世纪九十年代,互联网还是一个新生概念。亚马逊才建立不久,ebay 刚创业一年,google 呱呱坠地,Wikipedia 还没有影儿。所以1998年仁科公司没有支持 web 在线注册课程这个功能也就不足为奇了。但是明尼苏达大学作为 Gopher 网络协议的发源地,并且给之前的大型机系统开发了一套 web 功能接口,我们觉得 web 在线注册功能对于这个新的学生档案管理系统是至关重要的。 + +更多 Linux 相关的资源链接: + +* [Linux 是什么?][1] + +* [Linux 容器是什么?][2] + +* [快下载吧:这里有 linux 命令小抄][3] + +* [更高级的 Linux 命令行小抄][4] + +* [我们最新的 Linux 相关的文章][5] + +我们在这个 web 团队的任务就是去实现此管理系统的 web 在线注册功能。 + +幸运的是,我们并不是孤军奋战。我们联系了 IBM ,在第二年一起开始来搭建这个新的 web 在线注册系统。IBM 负责提供硬件和软件环境来运行这个 web 系统:3 个 SP 电脑节点运行最新的AIX 系统(类 UNIX 操作系统)、IBM Java 和 IBM WebSphere 平台,并用一个 IBM 的负载均衡器来实现 3 个节点的负载分流。 +![AIX network diagram](https://opensource.com/sites/default/files/resize/diagram-aix_0-700x363.png "AIX network diagram") + +在经过一年多的开发和测试后,我们的系统终于上线了!但不幸的是失败却接踵而至。 + +### 负载过大 + +在开发过程中,我们无法准确地模拟测试真实场景下许多学生同时登陆的场景。原因不是没有测试环境,明尼苏达大学有定制的 web 负载测试软件包,而且 IBM 有自己的工具做补充,但是这个 web 系统在当时对我们来说实在是太陌生了,我们没有意识到这些测试工具是不能满足要求的。 + +通过数月的测试,我们将此 web 系统的预期负载量调整到 240 个用户。但不幸的是,我们实际的使用量却是预期的两倍左右,在第一天系统上线时,超过 400 名学生马上同时登陆进系统,由于负载远远超出预期值,3 台 web 服务器直接宕机了。由于持续的高负载,服务器一直崩溃,只能不断地重启。一台刚重启完,另一台又宕机重启了,这种场景居然持续了一个月。 + +由于不能有效地通过 web 注册,学生只能通过原来的方法来注册:来到登记员的办公室,拿着笔注册,然后再出门。当地报纸也幸灾乐祸地嘲讽道:"电脑软件的失败强迫学生只能面对面地注册!" + +![Negative headlines about web registration crashes](https://opensource.com/sites/default/files/resize/headlines-700x522.jpg "Negative headlines about web registration crashes") + +面对失败这个事实,我们尽自己全力在下一个开发周期中来提高软件性能,在之后6个月的时间里,我们疯狂地想去增强这套系统的负载能力。尽管增加了更多的代码,调整了多次配置,还是不能支持更多的用户。尽力了,然而面对的还是失败。 + +就如所料的,在下一个迭代周期后,迎接我们的还是失败。服务器由于负载问题一次又一次地宕机。这一次新闻标题已经变成了:“web 注册系统就是垃圾”。 + +在开始下一个为期6个月的迭代前,我们已经绝望了。没有人知道服务器不停宕机的原因,我们已经预期这个问题现在是无解的。我们是要采取一些措施来搞定这个问题,但是怎么做呢?以下是我们讨论得出的方法: + + +### 是否需要切换新的平台? + +IBM 当时引入了 Linux,给它的 Java 和 WebSphere 平台做了二次开发。所有产品都获得了红帽公司的认证,并且有几个产品已经在我们的桌面系统上运行了。我们意识到了现在在 Linux 上已经有了完整的生态系统来运行我们的 web 管理系统,但是它能表现的比 AIX 更好吗? + +在搭建好一个测试服务器并进行基本的负载测试后,我们惊奇的发现一台 Linux 服务器能够轻松地支持之前 3 台 AIX 服务器所不能支持的负载量,在相同的 web 代码、IBM Java 和 WebSphere 平台下,单台 Linux 服务器能够支持超过 200 个用户。 + +我们将这个消息告诉了登记员和首席信息官,他们同意将 web 注册系统切换到 Linux 平台上。虽然这是我们第一次在明尼苏达大学跑 Linux,但是失败已成习惯,反而无所畏惧了。AIX 只会失败,Linux 却是我们唯一的希望。 + + +我们马上基于 Linux 来进行开发。另一个组的同事也释放了几台 Intel 服务器来给我们使用,我们给服务器装上红帽系统和相关的 IBM 组件,然后在新系统上进行了持续性的负载测试,令人欣喜的是,Linux 服务器没有出现任何问题。 + +经过两个月高强度的开发测试,我们的新系统终于上线了,而且是巨大的成功!在巨大的负载下,web 注册系统在 Linux 的表现都堪称完美。同时在线峰值甚至超过了 600 名用户。Linux 拯救了明尼苏达大学的 web 注册系统~ + +### 成功的经验 +当我回首这个项目时,我发现你可以用以下几个点来向你的团队介绍 Linux: + +1. **解决问题, 不要自欺欺人.** + +当我们提议在企业中使用 Linux 时,并不是因为我们认为 Linux 很酷才使用它。当然,我们是 Linux 的爱好者并且已经在自己的环境中运行过它,但是我们在公司是为了解决问题的。能用 Linux 是因为我们的登记员和出资人同意 Linux 是解决问题的一个方法,而不仅仅是因为 Linux很酷我们想用它。 + +2. **尽可能小的去做改变.** + +我们的成功是建立在 IBM 已经基于 Linux 做出了它的 Java 和 WebSphere 产品的基础上的。这能让我们在将 web 系统从 AIX 切换到 Linux 上不用做过多的修改适配。两者比起来只有硬件和操作系统改变了,其他系统相关的组件都保持了一致,这些都是保证平台切换成功的基石。 + +![AIX cost diagram](https://opensource.com/sites/default/files/resize/cost-diagram-aix-700x363.png "AIX cost diagram") + +![Linux cost diagram](https://opensource.com/sites/default/files/resize/cost-diagram-linux-700x363.png "Linux cost diagram") + +3. **诚实对待风险和回报.** + +我们的问题很明显:web 注册系统在前两个迭代周期中都失败了,而且很可能再次失败。当我们将自己的想法(AIX 切换到 Linux)告诉出资方后,我们对其中的风险和回报是心知肚明的。如果我们什么都不做,就只有失败,如果我们尝试切换到 Linux 平台,我们可能会成功,而且从最初的测试结果分析,成功的概率是高于失败的。 + +而且就算在 Linux 平台下项目还是失败了,我们也可以迅速地切换回AIX 服务器。有了这些细致的分析和措施,终于使登记员能够安心让我们试试 Linux。 + +4. **言简意赅地交流.** + +在项目平台切换的过程中,我们做了一个整体计划。我们在一张白纸上明确地写下了我们计划做什么,为什么要这么做。这种方式的成功关键就在于计划的简短性。领导们不喜欢像看小说一样来看技术性的主意,他们不想纠缠在技术细节中。所以我们有意地在执行层面上进行计划安排,在框架层面上进行描述。 +当我们在进行平台切换时,我们会定期的告诉出资人当前进展。当新系统成功完成后,我们每天都会提交更新,报告已经有多少学生成功通过此系统完成注册和遇到的问题。 + +尽管这个项目已经过去了接近 20 年,但是其中的经验教训在今天仍然适用。尽管 Linux 在其中起了举足轻重的作用,但是最重要的还是我们成功地将所有人的目标引导到解决共同的问题上。我认为这种经验也可以运用到很多你所面对的事情当中。 + +-------------------------------------------------------------------------------- + +作者简介: + +Jim Hall -我是 FreeDOS 项目的发起者和协调人,我也在 GNOME 理事会中担任董事。工作上我是明尼苏达州拉姆西县的首席信息官,空闲时间里我为开源软件的可用性做出相关的贡献,并通过 [Outreachy](https://en.wikipedia.org/wiki/Outreachy)(为女性提供帮助的一项GNOME外展服务)来指导可用性测试。 + +via: https://opensource.com/article/17/7/how-introduced-organization-linux + +作者:[ Jim Hall ][a] +译者:[吴霄/toyijiu](https://github.com/toyijiu) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/jim-hall +[1]:https://opensource.com/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[6]:https://opensource.com/article/17/7/how-introduced-organization-linux?rate=G1WfZzJPTN4w4fVviJ7iFru6ZBDBBTKkT8QRxSh727g +[7]:https://opensource.com/user/126046/feed +[8]:https://opensource.com/users/jim-hall +[9]:https://opensource.com/users/jim-hall +[10]:https://opensource.com/article/17/7/how-introduced-organization-linux#comments From a402660ae92576d8069be81ac224509fb04f422a Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 22 Jul 2017 12:33:09 +0800 Subject: [PATCH 0743/1407] PRF:20170523 An introduction to Libral a systems management library for Linux.md @stevenzdg988 --- ... a systems management library for Linux.md | 213 ++++++------------ 1 file changed, 70 insertions(+), 143 deletions(-) diff --git a/translated/tech/20170523 An introduction to Libral a systems management library for Linux.md b/translated/tech/20170523 An introduction to Libral a systems management library for Linux.md index 4df3353824..3d8fe5c3dc 100644 --- a/translated/tech/20170523 An introduction to Libral a systems management library for Linux.md +++ b/translated/tech/20170523 An introduction to Libral a systems management library for Linux.md @@ -1,13 +1,13 @@ -Libral 简介:开源的 Linux 系统管理库 +Libral:一个提供资源和服务统一管理 API 的系统管理库 ============================================================ -> Libral 对系统资源和服务提供了一个统一的管理 API ,其可以作为脚本管理任务和配置管理系统的构建的坚实基础。 +> Libral 为系统资源和服务提供了一个统一的管理 API ,其可以作为脚本管理任务和构建配置管理系统的坚实基础。 ![An introduction to Libral, a systems management library for Linux](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/yearbook-haff-rx-linux-file-lead_0.png?itok=48iDNoH8 "An introduction to Libral, a systems management library for Linux") -作为继承了 Unix 的传统的 Linux 操作系统,其并没有一个综合的系统管理 API 接口,相反,管理操作是通过多种特定用途的工具和 API 来实现的,其每一个都有自己约定和特有的风格。这就使得编写一个极其简单的系统管理任务脚本将变得很困难很脆弱。 +作为继承了 Unix 的传统的 Linux 操作系统,其并没有一个综合的系统管理 API 接口,相反,管理操作是通过多种特定用途的工具和 API 来实现的,其每一个都有自己约定和特有的风格。这就使得编写一个哪怕是简单的系统管理任务的脚本也很困难、很脆弱。 -举个例子来说,改变 “app” 用户的登录 shell 要运行 `usermod -s /sbin/nologin app`。这个命令运行的很好,除了系统上没有 “app” 用户的情况之外。为了修复这个例外错误,具有创新精神的脚本编写者也许要这样写: +举个例子来说,改变 “app” 用户的登录 shell 要运行 `usermod -s /sbin/nologin app`。这个命令通常没有问题,只是当系统上没有 “app” 用户时就不行了。为了解决这个例外错误,具有创新精神的脚本编写者也许要这样写: ``` grep -q app /etc/passwd \ @@ -15,22 +15,21 @@ grep -q app /etc/passwd \   || useradd ... -s /sbin/nologin app ``` -因此,当 “app” 用户存在于系统中时,会执行更改登录 shell 的操作;而当此用户不存在时,此用户就会被创建。不幸的是,这种利用编写系统管理任务脚本的途径是不适合的:对于每一种资源来说,就会有一套不同的工具,而且必须考虑其不同的使用惯例;不一致和经常性的不完备的错误报告将会使错误的处理变得困难;再者会因为工具所具有的本质特性引起的故障而导致执行失败。 +这样,当 “app” 用户存在于系统中时,会执行更改登录 shell 的操作;而当此用户不存在时,就会创建此用户。不幸的是,这种编写系统管理任务脚本的方式是不适合的:对于每一种资源来说都会有一套不同的工具,而且每个都有其不同的使用惯例;不一致性和经常出现的不完备的错误报告将会使错误的处理变得困难;再者也会因为工具自身的特性引发的故障而导致执行失败。 -实际上,以上所举的例子是不正确的:`grep` 并不是用来查找 “app” 用户的,它只能简单的查找文件 `/etc/passwd` 的一些行中是否有字符串 “app”,在大多数情况下它或许可以工作,但是也可能会在最关键的时刻出错。 +实际上,以上所举的例子也是不正确的:`grep` 并不是用来查找 “app” 用户的,它只能在文件 `/etc/passwd` 的一些行中简单的查找是否有字符串 “app”,在大多数情况下它或许可以工作,但是也可能会在最关键的时刻出错。 -很显然,管理工具不是执行简单的任务的脚本,充其量其也难以构成一个较大的管理系统。认识到这一点,现有的配置管理系统,比如 Puppet、Chef,及 Ansible,围绕基本的操作系统资源的管理竭尽全力的建立其内部 API 就是明智之举。这些资源由各自需要的密切相关的工具抽象成内部的 API。这不仅导致大量的重复性工作,也为尝试一个新的和创新管理工具设置了强大的障碍。 +很显然,那些执行简单任务的脚本管理工具,很难成为大型管理系统的基础。认识到这一点,现有的配置管理系统,比如 Puppet、Chef 及 Ansible,围绕基本的操作系统资源的管理竭尽全力的建立其内部 API 就是明智之举。这些资源抽象是内部 API,其与所需的相应工具密切相关。但这不仅导致大量的重复性工作,也为尝试一个新创新的管理工具设置了强大的障碍。 -在创建虚拟机或者容器镜像这一领域,这种障碍就变得非常明显:比如在创建镜像的过程中,就需要要么回答关于它们的简单问题,要么对其进行简单的更改。但是要使工具完成所有的任务就需要特殊的处理,这些问题和变化正好是一些人试图利用脚本解决的问题。因此,镜像构建要么依靠特定的脚本,要么需要使用(和安装)一个相当强大的配置管理系统。 - -[Libral][11] 将为管理工具和任务提供一个可靠的保证,通过对系统资源提供一个公用的管理 API,并使其可以通过命令行工具 `ralsh` 使用,它允许用户按照相同的方法查询和修改系统资源,能够有可预见的错误报告。对以上的举例来说,可以通过命令 `ralsh -aq user app` 检查 “app” 用户是否存在;通过 `ralsh -aq package foo` 检查 “foo” 软件包是否已经被安装;一般情况下,通过命令 `ralsh -aq TYPE NAME` 检查 ”NAME“ 是否是 ”TYPE“ 资源类型。类似的,创建或更改存在的用户,可以运行: +在创建虚拟机或者容器镜像这一领域,这种障碍就变得非常明显:比如在创建镜像的过程中,就要么需要回答关于它们的简单问题,要么需要对其进行简单的更改才行。但是工具全都需要特别处理,那些所遇到的问题和更改需要用脚本逐个处理。因此,镜像构建要么依靠特定的脚本,要么需要使用(和安装)一个相当强大的配置管理系统。 +[Libral][11] 将为管理工具和任务提供一个可靠的保证,通过对系统资源提供一个公用的管理 API,并使其可以通过命令行工具 `ralsh` 使用,它允许用户按照相同的方法查询和修改系统资源,并有可预见的错误报告。对以上的举例来说,可以通过命令 `ralsh -aq user app` 检查 “app” 用户是否存在;通过 `ralsh -aq package foo` 检查 “foo” 软件包是否已经安装;一般情况下,可以通过命令 `ralsh -aq TYPE NAME` 检查 ”NAME“ 是否是 ”TYPE“ 类型的资源。类似的,要创建或更改已存在的用户,可以运行: ``` ralsh user app home=/srv/app shell=/sbin/nologin ``` -接下来在文件 `/etc/hosts` 创建和修改条目,可以运行命令: +以及,要在文件 `/etc/hosts` 创建和修改条目,可以运行命令: ``` @@ -38,24 +37,23 @@ ralsh hostmyhost.example.com ip=10.0.0.1 \ host_aliases=myhost,apphost ``` -以这种方式运行,“ralsh” 的用户事实上完全与那两个命令的内部运行工作机制相隔离:第一个需要适当的调用命令 `useradd` 或者 `usermod`,而第二个需要在 `/etc/hosts` 文件中进行编辑。而对于该用户来说,他们似乎都采取同样的模型:“确保资源处于我所需要的状态。” - +以这种方式运行,“ralsh” 的使用者事实上完全隔离在那两个命令内部的不同运行工作机制之外:第一个命令需要适当的调用命令 `useradd` 或者 `usermod`,而第二个需要在 `/etc/hosts` 文件中进行编辑。而对于该用户来说,他们似乎都采取同样的模型:“确保资源处于我所需要的状态。” ### 怎样获取和使用 Libral 呢? -Libral 可以在[这个 git 仓库][12]找到并下载。其核心是由 C++ 编写的,构建它的说明可以[在该仓库中][13]找到,不过只是在你想要为 Libral 的 C++ 核心做贡献的时候才需要看它。Libral 的网站上包含了一个 [预构建的 tarball][14],可以用在任何使用 “glibc 2.12” 或者更高版本的 Linux 机器上。可以使用该 “tarball” 的内容进一步探究 ralsh 和开发新的提供者(provider),它使得 Libral 具备了管理新类型资源的能力。 +Libral 可以在[这个 git 仓库][12]找到并下载。其核心是由 C++ 编写的,构建它的说明可以[在该仓库中][13]找到,不过只是在你想要为 Libral 的 C++ 核心做贡献的时候才需要看它。Libral 的网站上包含了一个 [预构建的 tarball][14],可以用在任何使用 “glibc 2.12” 或者更高版本的 Linux 机器上。可以使用该 “tarball” 的内容进一步探究 ralsh ,以及开发新的提供者(provider),它使得 Libral 具备了管理新类型资源的能力。 -在下载解压“tarball”后,在目录“ral/bin”下就会生成“ralsh”命令。运行不需要任何参数的“ralsh”命令就会将 Libral 的所有资源类型列举出来。利用“--help“选项打印输出关于”ralsh“更多的说明。 +在下载解压 tarball 后,在目录 `ral/bin` 下能找到 `ralsh` 命令。运行不需要任何参数的 `ralsh` 命令就会列举出来 Libral 的所有资源类型。利用 `--help` 选项可以打印输出关于 `ralsh` 的更多说明。 ### 与配置管理系统的关系 -知名的配置管理系统,如 Puppet、Chef 及 Ansible,解决了一些 Libral 所解决的同样的问题。将 Libral 与它们的区别是是它们所做大部分工作和 Libral 不同。配置管理系统被构建来处理跨大量节点的管理各种事物的多样复杂性。而另一方面 Libral 旨在提供一个定义明确的低级别的系统管理 API ,独立于任何特定的工具,可用于各种各样的编程语言。 +知名的配置管理系统,如 Puppet、Chef 及 Ansible,解决了一些 Libral 所解决的同样的问题。将 Libral 与它们的区分开的主要是它们所做工作和 Libral 不同。配置管理系统被构建来处理跨大量节点管理各种事物的多样性和复杂性。而另一方面 Libral 旨在提供一个定义明确的低级别的系统管理 API ,独立于任何特定的工具,可用于各种各样的编程语言。 -通过消除大型配置管理系统中包含的应用程序逻辑,Libral 在如何使用方面是非常万能的,从介绍里提及的简单的脚本任务,到作为构建复杂的管理应用的构建块。专注与这些基础层面也使其保持很小,目前不到 2.5 MB,这对于资源严重受限的环境,如容器和小型设备来说是一个重要考虑因素。 +通过消除大型配置管理系统中包含的应用程序逻辑,Libral 从前面介绍里提及的简单的脚本任务,到作为构建复杂的管理应用的构建块,它在如何使用方面是非常灵活的。专注与这些基础层面也使其保持很小,目前不到 2.5 MB,这对于资源严重受限的环境,如容器和小型设备来说是一个重要考虑因素。 ### Libral API -在过去的十年里,Libral API 的设计是由实现配置管理系统的经验所指导的,虽然它并没有直接绑定到它们其中任何一个应用上,但它考虑这些问题,做出选择克服它们的缺点。 +在过去的十年里,Libral API 是在实现配置管理系统的经验下指导设计的,虽然它并没有直接绑定到它们其中任何一个应用上,但它考虑到了这些问题,并规避了它们的缺点。 在 API 设计中四个重要的原则: @@ -64,177 +62,106 @@ Libral 可以在[这个 git 仓库][12]找到并下载。其核心是由 C++ 编 * 轻量级抽象 * 易于扩展 -Basing a management API on desired state, i.e., the idea that the user expresses what the system should look like after an operation rather than how to get into that state, is hardly controversial at this point. Bidirectionality makes it possible to use the same API and, more importantly, the same resource abstractions to read existing state and to enforce changes to it. Lightweight abstractions ensure that it is easy to learn the API and make use of it quickly; past attempts at such management APIs have unduly burdened the user with learning a modeling framework, an important factor in their lack of adoption. +基于期望状态的管理 API,举个例子来说,用户表示当操作执行后希望系统看起来是什么状态,而不是怎样进入这个状态,这一点什么争议。双向性使得使用(读、写)相同的 API 成为可能,更重要的是,相同的资源可以抽象成读取现有状态和强制修改成这种状态。轻量级抽象行为确保能容易的学习 API 并能快速的使用;过去在管理 API 上的尝试过度加重了学习建模框架的使用者的负担,其中一个重要的因素是他们的接受力缺乏。 -建立一个期望状态的管理 API,举个例子来说,用户表示当操作执行后希望系统看起来是什么状态,而不是怎样进入这个状态,是很难引起争议的。双向性使得使用相同的 API 成为可能,更重要的是,相同的资源抽象成读取现有状态和强制修改成这种状态。轻量级的抽象行为确保能容易的学习 API 并能快速的使用;过去尝试管理 API 的方式已经过度加重了学习建模框架的使用者的负担了,一个重要的因素是他们的接受力缺乏。 ---> +最后,它必须易于扩展 Libral 的管理功能,这样用户可以教给 Libral 如何管理新类型的资源。这很重要,因为人们也许要管理的资源可能很多(而且 Libral 需要在适当时间进行管理),再者,因为即使是完全成熟的 Libral 也总是存在达不到用户自定义的管理需求。 -Finally, it has to be easy to extend Libral's management capabilities so that users can teach Libral how to manage new kinds of resources. This is important both because of the sheer amount of resources that one might want to manage (and that Libral will manage in due time), as well as because even a fully built-out Libral will always fall short of a user's custom management needs. +目前与 Libral API 进行交互的主要方式是通过 `ralsh` 命令行工具。它也提供了底层的 C++ API ,不过其仍处在不断的演变当中,主要的还是为简单的脚本任务做准备。该项目也提供了为 CRuby 提供语言绑定,其它语言也在陆续跟进。 -终于,它必须易于扩展 Libral 的管理功能,这样用户可以让 Libral 如何管理新类型的资源。这很重要,因为绝对数量的资源,一种情况可能需要管理(Libral 将在适当时间进行管理),再者,因为既是一个完全成熟的 Libral 也总是存在达不到用户自定义的管理需求。 +未来 Libral 还将提供一个提供远程 API 的守护进程,它可以做为管理系统的基础服务,而不需要在管理节点上安装额外的代理。这一点,加上对 Libral 管理功能的定制能力,可以严格控制系统的哪些方面可以管理,哪些方面要避免干扰。 +举个例子来说,一个仅限于管理用户和服务的 Libral 配置会避免干扰到在节点上安装的包。当前任何现有的配置管理系统都不可能控制以这种方式管理的内容;尤其是,需要对受控节点进行任意的 SSH 访问也会将该系统暴露不必要的意外和恶意干扰。 -Currently, the main way to interact with the Libral API is through the **ralsh **command line tool. It exposes the underlying C++ API, which is still in flux, and is mainly geared at simple scripting tasks. The project also provides language bindings for CRuby, with others to follow. - -目前与 Libral API 进行交互的主要方式是通过“ralsh”命令行工具。它公开了底层的 C++ API ,不过人处在不断的演变当中,主要的还是为面向简单的脚本任务做准备。该项目提供了为 CRuby提供语言绑定并且会有更多的参加者共同参与。 - - -In the future, Libral will also provide a daemon with a remote API, so that it can serve as the basis for management systems that do not need to install additional agents on managed nodes. This, coupled with the ability to tailor the management capabilities of Libral, makes it possible to tightly control which aspects of a system can be managed and which ones are protected from any interference. - -未来,Libral 还将提供一个可远程支持的虚拟光驱 API ,因此它可以成为一个管理系统的基本服务,在此基础上管理节点不需要安装额外的代理。这一点,共轭能力能够更加适合 Libral 的管理功能,使其在更加紧密的控制系统方面和对来自任何干扰的保护成为一种可能。 - - -For example, a Libral installation that is restricted to managing users and services will be guaranteed to not interfere with the packages installed on a node. Controlling what gets managed in this manner is currently not possible with any of the existing configuration-management systems; in particular, systems that require arbitrary SSH access to a managed node also expose that system to unwanted accidental or malicious interference. - -举个例子来说,Libral 仅限于管理用户和服务的安装将受到保护,在一个节点上进行包安装的时候不会受到干扰。获得以这种方式的管理控制在当前是不可能与现有的配置管理系统共存的;尤其当系统需要通过任意的 SSH 访问一个托管的节点并同时显示对系统有害的信息或者是恶意干扰。 - - -The basis of the Libral API is formed by two very simple operations: **get** to retrieve the current state of resources, and **set** to enforce the state of current resources. Idealizing a little from the actual implementation, they can be thought of as: - -Libral API 的基础是由两个非常简单的操作构成的:“get” 用来检索当前资源的状态,“set” 用来强制当前资源的状态。理想化的实现当前安装启用状态,可能要通过以下步骤: +Libral API 的基础是由两个非常简单的操作构成的:“get” 用来检索当前资源的状态,“set” 用来设置当前资源的状态。理想化地实现是这样的,通过以下步骤: ``` - provider.get(names) -> List[resource] - provider.set(List[update]) -> List[change] +provider.get(names) -> List[resource] +provider.set(List[update]) -> List[change] ``` -The **provider** is the object that knows how to manage a certain kind of resource, like a user, a service, or a package, and the Libral API provides ways to look up the provider for a certain kind of resource. +“provider” 是要知道怎样管理的一种资源的对象,就像用户、服务、软件包等等,Libral API 提供了一种查找特定资源的管理器(provider)的方法。 -“provider" 是要了解怎样管理一种资源的对象,就像用户,服务,包文件,Libral API 提供了一种查找资源的方法。 +“get” 操作能够接收资源名称列表(如用户名),然后产生一个资源列表,其本质来说是利用散列的方式列出每种资源的属性。这个列表必须包含所提供名称的资源,但是可以包含更多内容,因此一个简单的 “get” 的实现可以忽略名称并列出所有它知道的资源。 +“set” 操作被用来设置所要求的状态,并接受一个更新列表。每个更新可以包含 “update.is”,其表示当前状态的资源,“update.should” 表示被资源所期望的状态。调用 “set” 方法将会让更新列表中所提到的资源成为 “update.should” 中指示的状态,并列出对每个资源所做的更改。 -The **get** operation receives a list of resource names, e.g., usernames, and needs to produce a list of resources, which are essentially hashes listing the attributes of each resource. This list must contain resources with the provided names, but might contain more, so that a naive **get** implementation can simply ignore the names and list all the resources it knows about. - -”get“ 操作能够接收资源名称列表,举例子来说,用户名,需要产生一个资源列表,本质来说是利用散列的方式列出每种资源的属性。这个列表必须包含提供名称的资源,但是可能包含更多内容,因此”get“ 的启用可以忽略名称列出所有它知道的资源。 - - -The **set** operation is used to enforce desired state and receives a list of updates. Each update contains **update.is**, a resource representing the current state, and **update.should**, a resource representing the desired state. Calling the **set** method will make sure that the resources mentioned in the update list will be in the state indicated in **update.should** and produces a list of the changes made to each resource. - -”set“ 操作被用来强制要求的状态,接收列表的更新。每次更新包含”update.is",表示当前状态的资源,“update.should" 表示被要求状态的资源。调用”set“方法将会确认更新列表中提到的资源,将会在”update.should"中显示状态,产生一个对每个资源进行更改的列表。 - - -With **ralsh**, the current state of the **root** user can be retrieved with the command **ralsh user root**; by default, the command produces human-readable output, reminiscent of Puppet, but **ralsh** also supports a **--json** flag to make it produce JSON output for consumption by scripts. The human-readable output is: - -在 “ralsh”下,利用“ralsh user root"能够重新获得“root”用户的当前状态;默认情况下,这个命令会产生一个用户可读的输出,就像木偶一样,但是”ralsh“支持”--json“选项,将利用脚本消耗产生 JSON 输出。用户可读输出是: - +在 `ralsh` 下,利用 `ralsh user root` 能够重新获得 “root” 用户的当前状态;默认情况下,这个命令会产生一个用户可读的输出,就像 Puppet 中一样,但是 `ralsh` 支持 `--json` 选项,可以生成脚本可以使用的 JSON 输出。用户可读的输出是: ``` - # ralsh user root - user::useradd { 'root': - ensure => 'present', - comment => 'root', - gid => '0', - groups => ['root'], - home => '/root', - shell => '/bin/bash', - uid => '0', - } +# ralsh user root +user::useradd { 'root': + ensure => 'present', + comment => 'root', + gid => '0', + groups => ['root'], + home => '/root', + shell => '/bin/bash', + uid => '0', +} ``` -Similarly, the user can be changed with: - -用户将被修改成类似于下面的形式: +类似的,用户也可以用下面的形式修改: ``` - # ralsh user root comment='The superuser' - user::useradd { 'root': - ensure => 'present', - comment => 'The superuser', - gid => '0', - groups => ['root'], - home => '/root', - shell => '/bin/bash', - uid => '0', - } - comment(root->The superuser) +# ralsh user root comment='The superuser' +user::useradd { 'root': + ensure => 'present', + comment => 'The superuser', + gid => '0', + groups => ['root'], + home => '/root', + shell => '/bin/bash', + uid => '0', +} +comment(root->The superuser) ``` -The output of ralsh lists both the new state of the root user, with the changed comment attribute, and what changes were made (solely to the **comment** attribute in this case). Running the same command a second time will produce much the same output, but without any change indication, as none will be needed. +`ralsh` 的输出列出了 “root” 用户的新状态和被改变的 `comment` 属性,以及修改了什么内容(在这种情形下单指 `comment` 属性)。下一秒运行相同的命令将产生同样的输出,但是不会提示修改,因为没有需要修改的内容。 + +### 编写管理器(provider) + +为 `ralsh` 编写新的管理器(provider)是很容易的,也花费不了多少工夫,但是这一步骤是至关重要的。正因为如此,`ralsh` 提供了大量的调用约定,使得可以根据管理器所能提供的能力而调整其实现复杂性成为可能。管理器可以使用遵循特定调用约定的外部脚本,也可以以 C++ 实现并内置到 Libral 里面。到目前为止,有三种调用约定: -”ralsh“的输出列出了”root“用户两种新状态,被改变的属性注释,以及修改了什么内容(在这种情形下单独的”注释”属性)。运行相同的命令一秒钟的时间将产生同样的输出,但是没有任何修改的迹象,也没有需求。 +* [simple][16] 调用约定是编写 shell 脚本用为管理器。 +* [JSON][7] 调用约定意味着可以利用 Ruby 或者 Python 脚本语言编写管理器。 +* [内部 C++ API[8] 可以被用来实现原生的管理器。 -### Writing providers +强烈建议使用 “simple” 或者 “JSON” 调用约定开始开发管理器。GitHub 上的 [simple.prov][15] 文件包含了一个简单的 shell 管理器框架,应该很容易的替换为你自己的管理器。[python.prov][16] 文件包含了利用 Python编写的 JSON 管理器框架。 -编写程序管理器 +利用高级脚本语言编写的管理器存在一个问题是,对于这些语言,在当前运行 Libral 的系统上需要包含所有的支持库在内运行环境。在某些情况下,这不是一个障碍;举例子来说,基于 “yum” 的包管理的管理器需要 Python 被安装在当前的系统上,因为 “yum” 就是用 Python 开发的。 -It is crucially important that writing new providers for ralsh is easy and requires a minimum amount of effort. For this reason, ralsh offers a number of calling conventions that make it possible to trade the complexity of implementing a provider against the power of what the provider can do. Providers can either be external scripts that adhere to a specific calling convention or be implemented in C++ and built into Libral. Currently, there are three calling conventions: +然而在很多时候,无法预期一种 Bourne shell(Bash)之外的设计语言能够安装到所有的管理系统上。通常,管理器的编写者需要一个更加强大的脚本编译环境是实际需要。然而事与愿违,绑定一个完整的 Ruby 或 Python 作为解释器来运行将会增加 Libral 的大小超出了实际使用环境对资源的限制。另一方面,通常选择 Lua 或者 JavaScript 作为可嵌入的脚本编辑语言是不适应这种环境的,因为大多数的管理器的编写者不熟悉他们,通常情况下需要做大量的工作才能满足系统管理的实际需求。 -为“ralsh”编写新的管理器是很容易的,也是花费不了多少努力,但是这一步骤是至关重要的。正因为如此,“ralsh”提供了大量的调用约定,依靠其效能实现交换复杂的执行成为可能。管理器可以使用遵循特定调用约定的外部脚本也可以是执行 C++ 并构建Libral。到目前为止,有三种调用约定: +Libral 绑定了一个 [mruby][17] 版本,一个小的、嵌入在 Ruby 的版本,提供给管理器的编写者一个稳定的基础以及功能强大的可实现的程序设计语言。mruby 是 Ruby 语言的一个完整实现,尽管其减少了大量的标准库支持。与 Libral 绑定的 mruby 包含了 Ruby 用于脚本编辑管理任务的大多数的重要标准库,其将基于管理器编写者的需求随着时间的推移得到加强。Libral 的 mruby 绑定了 API 适配器使编写管理器更适合 JSON 约定,比如它包含了简单的工具(如编译修改结构体文件的 [Augeas][18])来解决解析和输出 JSON 的约定。[mruby.prov][19] 文件包含了利用 mruby 编写的 JSON 管理器框架实例。 -* The [simple][6] calling convention is geared towards writing shell scripts that serve as providers - -[simple][16]调用约定是针对编写 shell 脚本服务于管理器。 - -* The [JSON][7] calling convention is meant for writing providers in scripting languages like Ruby or Python - -[JSON][7]调用约定意味着可以利用 Ruby 或者 Python 脚本语言编写管理器。 - -* The [internal C++ API][8] can be used to implement providers natively - -[internal C++ API[]8] 可以被用来执行本机的管理器。 +### 下一步工作 -It is highly recommended to start provider development using the **simple** or the **JSON** calling convention. The file [simple.prov][15] on GitHub contains a skeleton for a simple shell provider, and it should be easy to adapt it for one's own provider. The file [python.prov][16] contains the skeleton of a JSON provider written in Python. +Libral 最关键的是下一步要使其增加广泛的可用性——从 [预编译的 tarball][20] 对于开发管理器的起步和深入是一个不错的方法,但是 Libral 也需要打包到主流的发行版上,并在上面可以找到。同样的,Libral 强大的功能取决于它附带的管理器的集合,及需要被扩展覆盖一组核心管理功能。Libral 的网站上包含了[一个 todo 列表][21]列出了管理器的最迫切需求。 -强烈建议开始管理其开发使用“simple” 或者“JSON” 调用约定。[simple.prov][15]文件在GitHub上包含了一个简单的 shell 管理器框架,应该很容易的被自己的管理器兼容。[python.prov][16]文件包含了利用 Python编写的 JSON 管理器框架。 +现在有多种方法能够提高不同用途的 Libral 的可用性:从编写更多程序语言的绑定,举例来说,Python 或者 Go;到使 `ralsh` 更容易在 shell 脚本中使用,除了现有的可读输出和 JSON 输出之外,可以很轻松的在 shell 脚本中格式化输出。在大规模的管理中使用 Libral 也能够在增加上面讨论过的远程 API 而得到改良,Libral 利用像 SSH 这样的传输工具实现更好的支持批量安装要求为各种架构提供预编译的 tarball,并且脚本基于所发现的目标系统架构选择正确的包。 -One problem with using higher-level scripting languages for providers is that the runtimes, including all supporting libraries, for these languages need to be present on the system on which Libral will run. In some cases, that is not an obstacle; for example, a provider that does package management based on **yum** can expect that Python is present on the system, as **yum** is written in it. +Libral 和它的 API、它的性能能够不断地进化发展;一个有趣的可能性是为 API 增加提醒能力,这样做可以向系统报告资源在超出它的范围发生的变化。Libral 面临的挑战是保持小型化、轻量级和良好定义的工具,来对抗不断增加的用例和管理性能——我希望每一个读者都能成为这个挑战之旅的一部分。 -利用高版本脚本语言编写的管理器存在一个运行时间的问题,包含所有的支持库,这些脚本语言需要在当前的系统上运行 Libral。在某些情况下,这不是一个障碍;举例子来说,基于“yum” 的包管理的管理器需要 Python 被安装在当前的系统上,而“yum”是用 Python 开发的一样。 - -In many other cases though, there's no logical choice for a language beyond Bourne shell (or Bash) that can be expected to be installed on all managed systems. Often, provider writers need a more powerful scripting environment than just that. Unfortunately, bundling a full Ruby or Python interpreter with its runtime would increase Libral's size beyond what can reasonably be -used in resource-constrained environments. On the other hand, the canonical choices of Lua or Javascript as small embeddable scripting languages are not suitable for this context as they are both not familiar to most provider writers, and require quite a bit of work to expose commonly needed facilities for systems management. - -然而在很多时候,无法选择一种超过 Bourne shell (或者 Bash)的设计语言能够按照预期安装到所有的管理系统上。通常,管理器的编写者需要一个更加强大的脚本编译环境是更实际一些的。然而事与愿违,绑定一个完整的 Ruby 或 Python作为解释器来运行将会增加 Libral 的空间超出了实际使用环境对资源的限制。另一方面,Lua 或者 JavaScript 可嵌入的脚本编辑语言的选择规范与其上下文是不匹配的,因为大多数的管理器的编写者不熟悉他们,通常情况下需要做大量的工作对需要生产环境系统管理工具进行发布。 - -Libral bundles a version of [mruby][17], a small, embeddable version of Ruby, to give provider writers a stable foundation, and a powerful programming language for their implementation. mruby is a full implementation of the Ruby language, albeit with a much reduced standard library. The mruby bundled with Libral contains the parts of Ruby's standard library most important for scripting management tasks, which will be enhanced further over time based on the needs of provider writers. Libral's mruby also bundles an API adpater that makes writing providers to the json convention more comfortable, as it contains simple utilities (like [Augeas][18] for modifying structured files) and conveniences around parsing and outputting JSON. The file [mruby.prov][19] contains a skeleton example of a json provider written in mruby. - -Libral 绑定了一个[mruby][17]版本,一个小的,嵌入在 Ruby 的版本,提供给管理器的编写者一个具有稳定的基础以及功能强大的可实现的程序设计语言。Mruby 就是一款可实现的 Ruby 语言,尽管减少了大量的标准库支持。绑定了 Libral 的 Mruby 包含了 Ruby 的标准库的大多数重要的脚本编辑管理任务,随着时间的推移将来在管理器编写者基础性的需求上将得到加强。Libral 的 Mruby 绑定了 API 适配器使编写管理器更适合 JSON 约定,因为它包含了简单的工具(如编译修改结构体文件的[Augeas][18])和围绕语法和输出JSON的约定。[mruby.prov][19]文件包含了利用 Mruby 编写的 JSON 管理器框架实例。 - - -### Future work - -展望 - -The most important next steps for Libral are to make it more widely usable—the [precompiled tarball][20] is a great way to get started and sufficient to develop providers, but Libral also needs to be packaged and made available in mainstream distributions. In a similar vein, the utility of Libral strongly depends on the set of providers it ships with and those need to be expanded to cover a core set of management functionality. The Libral site contains [a todo list][21] showing the providers that are most urgently needed. - - -Libral 最关键的是下一步要使其增加广泛的可用性-从[precompiled tarball][20]开始并充分的开发管理器是一个极好的方法,但是 Libral 需要打包并且能够在主流的分布上提高可用性。同样的,Libral 强大的功用取决于管理器的集合附带及需要被扩展覆盖的一组核心管理功能。Libral 的网站上包含了 [a todo list][21]并且列出了管理器的最迫切需求。 - - -There are also several ways in which the availability of Libral for different uses can be improved: from writing bindings for additional languages, for example, Python or Go, to making the use of **ralsh** in shell scripts even easier by offering, besides the existing human-readable output and JSON output, an output format that is easy to process in shell scripts. Use of Libral for larger-scale management can also be improved by adding the remote API discussed above, and by better supporting bulk installation of Libral via transports like SSH—that mostly requires providing prebuilt tarballs for more architectures and scripts that can select the right one based on the discovered architecture of the target system. - -现在有多种方法来让不同的用户能够提高 Libral的可用性:编写绑定附加程序语言,举例来说,Python 或者 Go,提供条件使“ralsh” 更容易在 shell 脚本中使用,除了现有的可读输出和 JSON 输出之外,可以很轻松的在 shell 脚本中格式化输出。Libral 运用大规模的管理能够在增加远程 API 协商而得到改良,Libral 利用像 SSh 这样的传输工具实现了更好的支持批量安装,大多数情况下需要提供更多的框架和脚本的预先构建包才能选择一款基于创新的目标框架系统。 - - -There are many more ways in which Libral, its API, and its capabilities could evolve; one intriguing possibility is adding notification capabilities to the API so that Libral can report changes to system resources as they happen outside of its purview. The challenge for Libral will be to continue to be a small, lightweight and well-defined tool while covering an ever increasing set of uses and management capabilities—a challenge and a journey that I encourage every reader to become a part of. - -Libral 有很多方式方法,如 API ,它的性能在不断地进化发展;一个有趣的可能性是为 API 增加性能的显示,这样做可以向系统报告资源在超出它的范围发生的变化。Libral 面临的挑战将一直持续下去的是小型化,轻量级和良好定义的工具,来替代曾经增加的使用和管理性能-我希望每一个读者都能成为这个挑战和旅行的一部分。 - - -If any of this has made you curious, I would love to hear from you, be it in the form of a pull request, an enhancement request, or just a report of your experience trying out **ralsh**. - -如果这让你很好奇,我很想听听你的想法,可以用推拉请求的方式,可以是增强请求方式,亦或者报告你对“ralsh”测试的经验体验。 +如果这让你很好奇,我很想听听你的想法,可以用拉取请求的方式,也可以是增强请求方式,亦或者报告你对 ralsh 体验经验。 (题图:[Internet Archive Book Images][10],修改:Opensource.com. CC BY-SA 4.0) -------------------------------------------------------------------------------- 作者简介: -David Lutterkort - David is a software engineer at Puppet, where he’s worked on projects such as Direct Puppet and Razor, the best provisioning tool, ever. He was one of the earliest contributors to Puppet and is the main author of Augeas, a configuration editing tool. - -David Lutterkort - 戴维是一个 Puppet 的软件工程师,他曾经参与的项目有 Direct Puppet 和 Razor,最好的工具提供。他是 Puppet 最早的编著者之一,也是 Augeas 的主要作者,一个编辑工具配置专家。 +David Lutterkort - 戴维是一个 Puppet 的软件工程师,他曾经参与的项目有 Direct Puppet 和最好的供给工具 Razor。他是 Puppet 最早的编著者之一,也是配置编辑工具 Augeas 的主要作者。 ------------------------ via: https://opensource.com/article/17/5/intro-libral-systems-management-library-linux 作者:[David Lutterkort][a] -译者:[译者:stevenzdg988](https://github.com/stevenzdg988) -校对:[校对者ID](https://github.com/校对者ID) +译者:[stevenzdg988](https://github.com/stevenzdg988) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From a550fbbcd924655841c9bfb3295ca497a5bba1f2 Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 22 Jul 2017 12:33:30 +0800 Subject: [PATCH 0744/1407] PUB:20170523 An introduction to Libral a systems management library for Linux.md @stevenzdg988 --- ...troduction to Libral a systems management library for Linux.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170523 An introduction to Libral a systems management library for Linux.md (100%) diff --git a/translated/tech/20170523 An introduction to Libral a systems management library for Linux.md b/published/20170523 An introduction to Libral a systems management library for Linux.md similarity index 100% rename from translated/tech/20170523 An introduction to Libral a systems management library for Linux.md rename to published/20170523 An introduction to Libral a systems management library for Linux.md From 2a40709c788e828f964040cda2f1a9c1d50aebee Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 22 Jul 2017 23:33:17 +0800 Subject: [PATCH 0745/1407] PRF&PUB:20170716 Nylas Mail A Free Email Client For Linux.md @geekpi --- ...ylas Mail A Free Email Client For Linux.md | 36 ++++++++++++------- 1 file changed, 23 insertions(+), 13 deletions(-) rename {translated/tech => published}/20170716 Nylas Mail A Free Email Client For Linux.md (51%) diff --git a/translated/tech/20170716 Nylas Mail A Free Email Client For Linux.md b/published/20170716 Nylas Mail A Free Email Client For Linux.md similarity index 51% rename from translated/tech/20170716 Nylas Mail A Free Email Client For Linux.md rename to published/20170716 Nylas Mail A Free Email Client For Linux.md index 1eb2eeacb2..53c0817e19 100644 --- a/translated/tech/20170716 Nylas Mail A Free Email Client For Linux.md +++ b/published/20170716 Nylas Mail A Free Email Client For Linux.md @@ -1,34 +1,44 @@ -# [Nylas Mail 一个 Linux 中免费的邮件客户端][7] +Nylas Mail: 一个 Linux 的免费邮件客户端 +======== + +[![Nylas Mail An Amazing Free Email Client For Linux](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-mail-review_orig.jpg)][1] - [![Nylas Mail An Amazing Free Email Client For Linux](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/nylas-mail-review_orig.jpg)][1] - 有一个被提及的问题是 Ubuntu 是否还应该附有默认的电子邮件客户端。就个人而言,我已经很长时间没有使用 [Thunderbird][9] 了。我相信这不是一个第一次被问到的问题,但我相信这是一个很好的机会把它裁剪掉。这是因为日常用户倾向于使用基于网络的客户端,例如 Gmail 或 Outlook 来满足其邮件需求。而对于 Linux 上的经验丰富的用户而言,还有很多可供选择的选项。[Geary][10]、Empathy、Evolution 和 Thunderbird 本身已经为很多用户提供了很好的服务,但是我发现了值得一试的东西:它被称为 Nylas Mail。 -它以前被称为 [Nylas N1][11],Nylas Mail 于今年初在 1 月份推出,接着是一个免费版本; **Nylas Mail** Basic 以及以前提供的付费版本。此外,在 1 月份,客户端仅适用于 Mac,但现在可用于 Linux 和 Windows 用户。 +有一个经常被提及的问题是 Ubuntu 是否还应该提供默认的电子邮件客户端。就个人而言,我已经很长时间没有使用 [Thunderbird][9] 了。我相信这不是一个第一次被问到的问题,但我相信这是一个把它解决掉的很好机会。这是因为日常用户倾向于使用基于网络的客户端,例如 Gmail 或 Outlook 来满足其邮件需求。而对于 Linux 上的经验丰富的用户而言,还有很多可供选择的选项。[Geary][10]、Empathy、Evolution 和 Thunderbird 本身已经为很多用户提供了很好的服务,但是我发现了值得一试的东西:它被称为 Nylas Mail。 + +它以前被称为 [Nylas N1][11],Nylas Mail 于今年初在 1 月份推出,同时还发布了一个免费版本;**Nylas Mail** Basic 以前是一个付费版本。此外,在 1 月份,客户端仅适用于 Mac,但现在可用于 Linux 和 Windows 用户。 + +(在我写此文时,它还处于活跃开发状态,但是现在已经停止开发了。) ### 为什么使用 Nylas? ​很多人因为种种原因选择了 Nylas Mail。让我们来看看一些常见的原因。 -**简单** - Nylas Mail 客户端管理优雅简单。用 electron 构建,应用非常漂亮,容易使用。该设计还确保在 Nylas 中设置电子邮件非常简单直接。 +**简单** - Nylas Mail 客户端管理优雅简单。用 electron 构建,应用非常漂亮,易于使用。其设计还确保了在 Nylas 中设置电子邮件非常简单直接。 + [![Nylas mail an awesome email client for linux](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/nylas-mail-an-awesome-email-client-for-linux.jpg?1499814843)][2] **兼容性** - Nylas Mail 与所有电子邮件提供商兼容。它与 Gmail、Yahoo、Exchange 和 IMAP 帐户兼容,因此你可以在任何地方收到邮件。 + [![nylas compatible with gmail facebook imap](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/nylas-compatible-with-gmail-facebook-imap.jpg?1499814928)][3] -**​强大的功能**​ - Nylas 拥有大量功能。它有一个全屏模式、离线支持、多布局格式、多帐户、统一的收件箱、提醒、打盹、签名和稍后发送功能。其中一些功能随 Nylas Mail Basic 一起提供。 - [![nylas email client powerful features](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/nylas-email-client-powerful-features.jpg?1499814992)][4] +**功能​强大**​ - Nylas 拥有大量功能。它有一个全屏模式、离线支持、多布局格式、多帐户、统一的收件箱、提醒、打盹、签名和稍后发送功能。其中一些功能随 Nylas Mail Basic 一起提供。 -**​混合后端 **​ - 以前,Nylas 将邮件的一个副本同步到使用 Nylas 云的服务器中,这对许多人来说就像 mehn 一样。幸运的是,在最新版本中,Nylas 采用了一个混合后端,可直接连接到 Gmail 或 Outlook 等电子邮件提供商。云同步虽然仍然可用,但仅在使用高级订阅工具(如打盹和跟踪)时使用。缺点是它是一个或另一个后端。想要一些专业功能,你需要云同步,你不想要云同步,那你错过了这些功能。 - [![nylas email hybrid backend](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/editor/nylas-email-hybrid-backend.jpg?1499815041)][5] +[![nylas email client powerful features](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/nylas-email-client-powerful-features.jpg?1499814992)][4] + +**​混合后端**​ - 以前,Nylas 将邮件的一个副本同步到使用 Nylas 云的服务器中,这对许多人来说就像 mehn 一样。幸运的是,在最新版本中,Nylas 采用了一个混合后端,可直接连接到 Gmail 或 Outlook 等电子邮件提供商。云同步虽然仍然可用,但仅在使用高级订阅工具(如打盹snoozing和跟踪)时使用。缺点是它是一而二的。如果想要一些专业功能,你需要云同步;你不想用云同步,那你错过了这些功能。 + +[![nylas email hybrid backend](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/editor/nylas-email-hybrid-backend.jpg?1499815041)][5] + +**​开源和免费版**​ - Nylas 作为开源项目。这意味着你可以自己编写代码并自行构建。你甚至可以设置自己的服务器以回避问题。 - **​开源和免费版 **​ - Nylas 作为开源项目。这意味着你可以自己编写代码并自行构建。你甚至可以设置自己的服务器以回避问题。 [![nylas open source and free email client](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/published/nylas-open-source-and-free-email-client.jpg?1499815091)][6] **跨平台** - Nylas 是在 Linux、Windows 和 Mac OS X 上提供的跨平台应用程序。因此,无论你喜欢哪种桌面操作系统,你都可以放心,因为 Nylas 都已经覆盖了。而且用法是相同的。 ### 还要做些什么? -到目前为止,Nylas 邮件客户端很好,但有一些抱怨。首先是在 2016 年推出的付费选项。引入免费版本有点像是这个问题的方案,但事实上,一些功能只能用每月 $9 的价格使用让包括我在内的大部分人不快。此外,没有多少人喜欢将邮件的副本保存在某台服务器上。当然,你可以设置自己的服务器,但有些麻烦。最后,对于在后台运行的应用程序,它需要当当多的内存。我希望这不是因为它主要是用 electron 写的,我相信随着它的更新和改进,它会变得更好。 +到目前为止,Nylas 邮件客户端很好,但有一些抱怨。首先是在 2016 年推出的付费选项。引入免费版本有点像是这个解决这个问题的方案,但事实上,一些功能只能以每月 $9 的价格使用让包括我在内的大部分人不快。此外,没有多少人喜欢将邮件的副本保存在某台服务器上。当然,你可以设置自己的服务器,但有些麻烦。最后,对于在后台运行的应用程序来说,它需要相当多的内存。我希望这不是因为它主要是用 electron 写的,我相信随着它的更新和改进,它会变得更好。 ### 总结 @@ -38,9 +48,9 @@ via: http://www.linuxandubuntu.com/home/nylas-mail-an-amazing-free-email-client-for-linux -作者:[http://www.linuxandubuntu.com ][a] +作者:[linuxandubuntu][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/) 荣誉推出 From ce2dd0bf1ee35e0c86d2fb0aae55161dcca1e1f4 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 23 Jul 2017 10:10:37 +0800 Subject: [PATCH 0746/1407] PRF&PUB:20170714 Linux to the rescue How I introduced my organization to Linux.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @toyijiu 翻译的很好! --- ...w I introduced my organization to Linux.md | 64 ++++++++----------- 1 file changed, 27 insertions(+), 37 deletions(-) rename {translated/tech => published}/20170714 Linux to the rescue How I introduced my organization to Linux.md (64%) diff --git a/translated/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md b/published/20170714 Linux to the rescue How I introduced my organization to Linux.md similarity index 64% rename from translated/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md rename to published/20170714 Linux to the rescue How I introduced my organization to Linux.md index 6bcc1dddc5..3bada276dc 100644 --- a/translated/tech/20170714 Linux to the rescue How I introduced my organization to Linux.md +++ b/published/20170714 Linux to the rescue How I introduced my organization to Linux.md @@ -1,76 +1,61 @@ -拯救者 Liunx:我是如何向团队介绍引入 Liunx 的 +拯救者 Linux:我是如何给我的团队引入 Linux 的 ============================================================ -###在项目早期就遇到公开的失败后,一个著名大学的 IT 团队决定将他们的 web 注册系统部署到 Liunx上,此举几乎将服务器的最大用户访问量提高了3倍 +> 在项目早期就遇到公开的失败后,一个著名大学的 IT 团队决定将他们的 web 注册系统部署到 Linux上,此举几乎将服务器的最大用户访问量提高了 3 倍 ![Linux to the rescue: How I introduced my organization to Linux](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/OSDC_Penguin_Image_520x292_12324207_0714_mm_v1a.png?itok=WfAkwbFy "Linux to the rescue: How I introduced my organization to Linux") -图片来源于 :  -Opensource.com +1998年,我在明尼苏达大学为一个新的 web 团队管理他们的服务器管理组。明尼苏达大学是一个非常大的大学,个个院校拥有接近 6000 名在校大学生。当时学校是用一个上了年纪的大型机系统来做学生的档案管理系统,这种系统已经过时了,所以需要做出改变。 -1998年,我在明尼苏达大学为一个新的 web 团队管理他们的服务器群。明尼苏达大学是一个非常大的大学,拥有接近 6000 名在校大学生。当时学校是用一个上了年纪的大型机系统来做学生的档案管理系统,这种系统已经过时了,所以需要做出改变。 +这个系统不是 Y2K 类型的(LCTT 译注:保存年份时只用两位数,导致记录 2000 年时计算机会记录为 1900 年,详见[What Does Y2K Compliant Mean?](https://stackoverflow.com/questions/18200744/what-does-y2k-compliant-mean)),所以我们准备建立一个由仁科软件公司来交付的新的学生档案管理系统。这个新系统对明尼苏达大学来说有很多作用,不仅能够管理学生的档案,还能提供其他的一些功能。然而它却缺少了一项关键特性:你不能在你的浏览器上通过 web 来给你的班级进行注册。 -这个系统不是 Y2K 类型的(保存年份时只用两位数,导致记录 2000 年时计算机会记录为 1900 年,详见[What Does Y2K Compliant Mean?](https://stackoverflow.com/questions/18200744/what-does-y2k-compliant-mean)),所以我们准备建立一个新的学生档案管理系统并由仁科软件公司来交付。这个新系统对明尼苏达大学来说有很多作用,不仅能够管理学生的档案,还能提供其他的一些功能。然而它却缺少了一项关键特性:你不能在你的浏览器上通过web来给你的班级进行注册。 - -按照今天的标准来看,这是一个重大的疏忽,但是在二十世纪九十年代,互联网还是一个新生概念。亚马逊才建立不久,ebay 刚创业一年,google 呱呱坠地,Wikipedia 还没有影儿。所以1998年仁科公司没有支持 web 在线注册课程这个功能也就不足为奇了。但是明尼苏达大学作为 Gopher 网络协议的发源地,并且给之前的大型机系统开发了一套 web 功能接口,我们觉得 web 在线注册功能对于这个新的学生档案管理系统是至关重要的。 - -更多 Linux 相关的资源链接: - -* [Linux 是什么?][1] - -* [Linux 容器是什么?][2] - -* [快下载吧:这里有 linux 命令小抄][3] - -* [更高级的 Linux 命令行小抄][4] - -* [我们最新的 Linux 相关的文章][5] +按照今天的标准来看,这是一个重大的疏忽,但是在上世纪九十年代,互联网还是一个新生概念。亚马逊才建立不久,ebay 刚创业一年,google 呱呱坠地,Wikipedia 还没有影儿。所以 1998 年仁科公司没有支持 web 在线注册课程这个功能也就不足为奇了。但是明尼苏达大学作为 Gopher 网络的发源地,并且给之前的大型机系统开发了一套 web 功能接口,我们觉得 web 在线注册功能对于这个新的学生档案管理系统是至关重要的。 我们在这个 web 团队的任务就是去实现此管理系统的 web 在线注册功能。 -幸运的是,我们并不是孤军奋战。我们联系了 IBM ,在第二年一起开始来搭建这个新的 web 在线注册系统。IBM 负责提供硬件和软件环境来运行这个 web 系统:3 个 SP 电脑节点运行最新的AIX 系统(类 UNIX 操作系统)、IBM Java 和 IBM WebSphere 平台,并用一个 IBM 的负载均衡器来实现 3 个节点的负载分流。 +幸运的是,我们并不是孤军奋战。我们联系了 IBM ,在第二年一起开始来搭建这个新的 web 在线注册系统。IBM 负责提供硬件和软件环境来运行这个 web 系统:3 个运行最新的 AIX 系统(类 UNIX 操作系统)、IBM Java 和 IBM WebSphere 平台的 SP 电脑节点,并用一个 IBM 的负载均衡器来实现 3 个节点的负载分流。 + ![AIX network diagram](https://opensource.com/sites/default/files/resize/diagram-aix_0-700x363.png "AIX network diagram") 在经过一年多的开发和测试后,我们的系统终于上线了!但不幸的是失败却接踵而至。 ### 负载过大 -在开发过程中,我们无法准确地模拟测试真实场景下许多学生同时登陆的场景。原因不是没有测试环境,明尼苏达大学有定制的 web 负载测试软件包,而且 IBM 有自己的工具做补充,但是这个 web 系统在当时对我们来说实在是太陌生了,我们没有意识到这些测试工具是不能满足要求的。 +在开发过程中,我们无法准确地模拟测试真实场景下许多学生同时登录的场景。原因不是没有测试环境,明尼苏达大学有定制的 web 负载测试软件包,而且 IBM 有自己的工具做补充,但是这个 web 系统在当时对我们来说实在是太陌生了,我们没有意识到这些测试工具是不能满足要求的。 -通过数月的测试,我们将此 web 系统的预期负载量调整到 240 个用户。但不幸的是,我们实际的使用量却是预期的两倍左右,在第一天系统上线时,超过 400 名学生马上同时登陆进系统,由于负载远远超出预期值,3 台 web 服务器直接宕机了。由于持续的高负载,服务器一直崩溃,只能不断地重启。一台刚重启完,另一台又宕机重启了,这种场景居然持续了一个月。 +通过数月的测试,我们将此 web 系统的预期负载量调整到 240 个并发用户。但不幸的是,我们实际的使用量却是预期的两倍左右,在第一天系统上线时,超过 400 名学生马上同时登录进系统,由于负载远远超出预期值,3 台 web 服务器直接宕机了。由于持续的高负载,服务器一直崩溃,只能不断地重启。一台刚重启完,另一台又宕机重启了,这种场景居然持续了一个月。 由于不能有效地通过 web 注册,学生只能通过原来的方法来注册:来到登记员的办公室,拿着笔注册,然后再出门。当地报纸也幸灾乐祸地嘲讽道:"电脑软件的失败强迫学生只能面对面地注册!" ![Negative headlines about web registration crashes](https://opensource.com/sites/default/files/resize/headlines-700x522.jpg "Negative headlines about web registration crashes") -面对失败这个事实,我们尽自己全力在下一个开发周期中来提高软件性能,在之后6个月的时间里,我们疯狂地想去增强这套系统的负载能力。尽管增加了更多的代码,调整了多次配置,还是不能支持更多的用户。尽力了,然而面对的还是失败。 +面对失败这个事实,我们尽自己全力在下一个开发周期中来提高软件性能,在之后 6 个月的时间里,我们疯狂地想去增强这套系统的负载能力。尽管增加了更多的代码,调整了多次配置,还是不能支持更多的用户。尽力了,然而面对的还是失败。 就如所料的,在下一个迭代周期后,迎接我们的还是失败。服务器由于负载问题一次又一次地宕机。这一次新闻标题已经变成了:“web 注册系统就是垃圾”。 -在开始下一个为期6个月的迭代前,我们已经绝望了。没有人知道服务器不停宕机的原因,我们已经预期这个问题现在是无解的。我们是要采取一些措施来搞定这个问题,但是怎么做呢?以下是我们讨论得出的方法: - +在开始下一个为期 6 个月的迭代前,我们已经绝望了。没有人知道服务器不停宕机的原因,我们已经预期这个问题现在是无解的。我们是要采取一些措施来搞定这个问题,但是怎么做呢?以下是我们讨论得出的方法: ### 是否需要切换新的平台? -IBM 当时引入了 Linux,给它的 Java 和 WebSphere 平台做了二次开发。所有产品都获得了红帽公司的认证,并且有几个产品已经在我们的桌面系统上运行了。我们意识到了现在在 Linux 上已经有了完整的生态系统来运行我们的 web 管理系统,但是它能表现的比 AIX 更好吗? +IBM 当时引入了 Linux,给它的 Java 和 WebSphere 平台做了二次开发。所有产品都获得了红帽公司的 RHEL 认证,并且有几个产品已经在我们的桌面系统上运行了。我们意识到了现在在 Linux 上已经有了完整的生态系统来运行我们的 web 管理系统,但是它能表现的比 AIX 更好吗? 在搭建好一个测试服务器并进行基本的负载测试后,我们惊奇的发现一台 Linux 服务器能够轻松地支持之前 3 台 AIX 服务器所不能支持的负载量,在相同的 web 代码、IBM Java 和 WebSphere 平台下,单台 Linux 服务器能够支持超过 200 个用户。 -我们将这个消息告诉了登记员和首席信息官,他们同意将 web 注册系统切换到 Linux 平台上。虽然这是我们第一次在明尼苏达大学跑 Linux,但是失败已成习惯,反而无所畏惧了。AIX 只会失败,Linux 却是我们唯一的希望。 +我们将这个消息告诉了登记员和 CIO,他们同意将 web 注册系统切换到 Linux 平台上。虽然这是我们第一次在明尼苏达大学跑 Linux,但是失败已成习惯,反而无所畏惧了。AIX 只会失败,Linux 却是我们唯一的希望。 - -我们马上基于 Linux 来进行开发。另一个组的同事也释放了几台 Intel 服务器来给我们使用,我们给服务器装上红帽系统和相关的 IBM 组件,然后在新系统上进行了持续性的负载测试,令人欣喜的是,Linux 服务器没有出现任何问题。 +我们马上基于 Linux 来进行开发。另一个组的同事也提供了几台 Intel 服务器来给我们使用,我们给服务器装上红帽系统和相关的 IBM 组件,然后在新系统上进行了持续性的负载测试,令人欣喜的是,Linux 服务器没有出现任何问题。 经过两个月高强度的开发测试,我们的新系统终于上线了,而且是巨大的成功!在巨大的负载下,web 注册系统在 Linux 的表现都堪称完美。同时在线峰值甚至超过了 600 名用户。Linux 拯救了明尼苏达大学的 web 注册系统~ ### 成功的经验 + 当我回首这个项目时,我发现你可以用以下几个点来向你的团队介绍 Linux: -1. **解决问题, 不要自欺欺人.** +1、 **解决问题, 不要自欺欺人** 当我们提议在企业中使用 Linux 时,并不是因为我们认为 Linux 很酷才使用它。当然,我们是 Linux 的爱好者并且已经在自己的环境中运行过它,但是我们在公司是为了解决问题的。能用 Linux 是因为我们的登记员和出资人同意 Linux 是解决问题的一个方法,而不仅仅是因为 Linux很酷我们想用它。 -2. **尽可能小的去做改变.** +2、 **尽可能小的去做改变** 我们的成功是建立在 IBM 已经基于 Linux 做出了它的 Java 和 WebSphere 产品的基础上的。这能让我们在将 web 系统从 AIX 切换到 Linux 上不用做过多的修改适配。两者比起来只有硬件和操作系统改变了,其他系统相关的组件都保持了一致,这些都是保证平台切换成功的基石。 @@ -78,30 +63,35 @@ IBM 当时引入了 Linux,给它的 Java 和 WebSphere 平台做了二次开 ![Linux cost diagram](https://opensource.com/sites/default/files/resize/cost-diagram-linux-700x363.png "Linux cost diagram") -3. **诚实对待风险和回报.** +3、 **诚实对待风险和回报** 我们的问题很明显:web 注册系统在前两个迭代周期中都失败了,而且很可能再次失败。当我们将自己的想法(AIX 切换到 Linux)告诉出资方后,我们对其中的风险和回报是心知肚明的。如果我们什么都不做,就只有失败,如果我们尝试切换到 Linux 平台,我们可能会成功,而且从最初的测试结果分析,成功的概率是高于失败的。 -而且就算在 Linux 平台下项目还是失败了,我们也可以迅速地切换回AIX 服务器。有了这些细致的分析和措施,终于使登记员能够安心让我们试试 Linux。 +而且就算在 Linux 平台下项目还是失败了,我们也可以迅速地切换回 AIX 服务器。有了这些细致的分析和措施,终于使登记员能够安心让我们试试 Linux。 -4. **言简意赅地交流.** +4、 **言简意赅地交流** 在项目平台切换的过程中,我们做了一个整体计划。我们在一张白纸上明确地写下了我们计划做什么,为什么要这么做。这种方式的成功关键就在于计划的简短性。领导们不喜欢像看小说一样来看技术性的主意,他们不想纠缠在技术细节中。所以我们有意地在执行层面上进行计划安排,在框架层面上进行描述。 + 当我们在进行平台切换时,我们会定期的告诉出资人当前进展。当新系统成功完成后,我们每天都会提交更新,报告已经有多少学生成功通过此系统完成注册和遇到的问题。 尽管这个项目已经过去了接近 20 年,但是其中的经验教训在今天仍然适用。尽管 Linux 在其中起了举足轻重的作用,但是最重要的还是我们成功地将所有人的目标引导到解决共同的问题上。我认为这种经验也可以运用到很多你所面对的事情当中。 +(题图 : Opensource.com) + -------------------------------------------------------------------------------- 作者简介: Jim Hall -我是 FreeDOS 项目的发起者和协调人,我也在 GNOME 理事会中担任董事。工作上我是明尼苏达州拉姆西县的首席信息官,空闲时间里我为开源软件的可用性做出相关的贡献,并通过 [Outreachy](https://en.wikipedia.org/wiki/Outreachy)(为女性提供帮助的一项GNOME外展服务)来指导可用性测试。 + +--- via: https://opensource.com/article/17/7/how-introduced-organization-linux -作者:[ Jim Hall ][a] +作者:[Jim Hall][a] 译者:[吴霄/toyijiu](https://github.com/toyijiu) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 0a8d1ea9e6f3f55fd8463d9302107e1d5fb97649 Mon Sep 17 00:00:00 2001 From: toyijiu <309378714@qq.com> Date: Mon, 24 Jul 2017 08:48:46 +0900 Subject: [PATCH 0747/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E4=B8=AD-WuXiao(to?= =?UTF-8?q?yijiu)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20170712 How to use a man page Faster than a Google search.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170712 How to use a man page Faster than a Google search.md b/sources/tech/20170712 How to use a man page Faster than a Google search.md index 184734e0c6..a556f4c07f 100644 --- a/sources/tech/20170712 How to use a man page Faster than a Google search.md +++ b/sources/tech/20170712 How to use a man page Faster than a Google search.md @@ -1,3 +1,4 @@ +翻译中 by WuXiao(toyijiu) How to use a man page: Faster than a Google search ============================================================ From 09f8b35436d2a2b5323fae7189db1896b2d33188 Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 24 Jul 2017 08:54:28 +0800 Subject: [PATCH 0748/1407] Delete 20170629 This is how you OpenStack 6 new guides and tutorials.md --- ...ou OpenStack 6 new guides and tutorials.md | 70 ------------------- 1 file changed, 70 deletions(-) delete mode 100644 sources/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md diff --git a/sources/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md b/sources/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md deleted file mode 100644 index abd64f992a..0000000000 --- a/sources/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md +++ /dev/null @@ -1,70 +0,0 @@ -translating----geekpi - -This is how you OpenStack: 6 new guides and tutorials -============================================================ - -### Want to learn more about the ins and outs of OpenStack? These free resources could be just what you need. - - -![OpenStack guides and tutorials](https://opensource.com/sites/default/files/styles/image-full-size/public/images/education/edu_rcos.png?itok=wLMIaigd "OpenStack guides and tutorials") -Image by :  - -opensource.com - -Cloud infrastructure is a hugely in-demand skill. And if you're looking for an open source solution for your cloud infrastructure needs, chances are [OpenStack][12] is in that mix. - -OpenStack is a huge collection of projects, providing solutions and integrations for nearly every part of the cloud stack. While this large scope makes it a powerful tool, it also means that it can be hard to keep up and learn about the full suite of projects, how to use them, how to customize them, and how to contribute code back to them. - -Fortunately, there are a lot of options to help you. In addition to the [official project documentation][13], printed books, and certification and training programs, there are also a ton of great community-created resources. Every month here on Opensource.com, we take a look for recently published guides and tutorials across blogs and other websites, and bring them to you in one place. Let's dive into what we found this time around. - -* First up in this month's batch, we have a guide from Antony Messerli on how to[ set up an OpenStack cloud][1] with Ansible. Messerli walks us through the configuration on his lab environment and the playbooks necessary to get OpenStack up and running on his cluster, as well as the basics of adding images, setting up the network, and more. It's a good read if you're considering Ansible to set up a small local OpenStack test environment. - -* Next, have you ever wondered how Neutron networking works in OpenStack? How does what's happening in the application correspond to the underlying code? Arie Bregman provides an OpenStack Neutron code deep dive in [this post][2]; you'll definitely want to be familiar with general networking principles and at least a little bit of the OpenStack code base in order to follow along. - -* Gerrit is the open source code review project used by OpenStack in order to manage incoming patches and allow for feedback and testing before merging changes into the main OpenStack code base. For those used to a different code review system (or none at all), Gerrit can be a little confusing to follow, though it has great dashboard features so you can see just the information that's important to you. Dougal Matthews walks us through his Gerrit dashboard setup in [this article][3], which might just help you create your own. - -* The [videos][4] from last month's OpenStack Summit in Boston have become available, and whether you were able to attend last month's event or not, they contain a treasure trove of topics both technical and non-technical. Not sure where to start? How about [this presentation][5] from Julio Villarreal Pelegrino on how to plan for, build, and operate a successful OpenStack cloud at scale. - -* Security should be at the top of concerns for any cloud administrator. But where do you get started? Naveen Joy posted a great [checklist][6] of ten security questions for locking down your OpenStack network; you can check it out in addition to the [video][7]from his talk on the same topic last month. - -* The internal messaging services in OpenStack are managed in a common library that lives inside of the Oslo project called, not surprisingly, Oslo.Messenging. Learn the basics of what this library is and what it offers in this [two][8] [part][9] blog post. - -* * * - -Want more? Be sure to check out our complete set of [OpenStack guides, howtos, and tutorials][14] from over three years of community-generated content to help you learn to be an effective OpenStack developer or administrator. - -Know of a great tutorial, guide, or how-to that we should have included? Share it in the comments below - --------------------------------------------------------------------------------- - -作者简介: - -Jason Baker - Jason is passionate about using technology to make the world more open, from software development to bringing sunlight to local governments. Linux desktop enthusiast. Map/geospatial nerd. Raspberry Pi tinkerer. Data analysis and visualization geek. Occasional coder. Cloud nativist. Follow him on Twitter. - - -via: https://opensource.com/article/17/6/openstack-guides-and-tutorials - -作者:[ Jason Baker (Red Hat)][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/jason-baker -[1]:https://www.reversengineered.com/2016/05/09/setting-up-an-openstack-cloud-using-ansible/ -[2]:http://abregman.com/2017/05/29/openstack-neutron-service-code-deep-dive/ -[3]:http://www.dougalmatthews.com/2017/May/19/how-i-gerrit/ -[4]:https://www.openstack.org/videos/ -[5]:http://www.juliosblog.com/dont-fail-at-scale-how-to-plan-for-build-and-operate-a-successful-openstack-cloud-video-openstack-summit2017/ -[6]:https://blogs.cisco.com/cloud/securing-openstack-networking -[7]:https://www.openstack.org/videos/boston-2017/securing-openstack-networking -[8]:https://pigdogweb.wordpress.com/2017/05/22/intro-to-oslo-messaging/ -[9]:https://pigdogweb.wordpress.com/2017/06/02/oslo-messaging-the-cloud-is-calling/ -[10]:https://opensource.com/article/17/6/openstack-guides-and-tutorials?rate=tRBp5wgAE1d3YHJSwcHWnfgXyJlqJedMImQFqJiW-tE -[11]:https://opensource.com/user/19894/feed -[12]:https://opensource.com/resources/what-is-openstack -[13]:http://docs.openstack.org/ -[14]:https://opensource.com/resources/openstack-tutorials -[15]:https://opensource.com/users/jason-baker -[16]:https://opensource.com/users/jason-baker -[17]:https://opensource.com/article/17/6/openstack-guides-and-tutorials#comments From 712e9f2e7c23a01d9d5b8bba35395f9cb48dc823 Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 24 Jul 2017 08:55:53 +0800 Subject: [PATCH 0749/1407] translated --- ...ou OpenStack 6 new guides and tutorials.md | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 translated/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md diff --git a/translated/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md b/translated/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md new file mode 100644 index 0000000000..a11825ef94 --- /dev/null +++ b/translated/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md @@ -0,0 +1,67 @@ +给你的 OpenStack:6 个新指南和教程 +============================================================ + +### 想了解更多关于 OpenStack 的内容?这些免费资源可能只是你所需要的。 + + +![OpenStack guides and tutorials](https://opensource.com/sites/default/files/styles/image-full-size/public/images/education/edu_rcos.png?itok=wLMIaigd "OpenStack guides and tutorials") +图片来源: + +opensource.com + +云基础设施是一个非常需要的技能。如果你正在为你的云基础架构需求寻找开源解决方案,那么 [OpenStack][12] 就是其中之一。 + +OpenStack 是一个巨大的项目集合,为云服务的几乎每一个部分都提供了解决方案和集成。虽然这个巨大范围使得它成为一个强大的工具,但这也意味着可能很难跟上并了解整个项目,如何使用它们、如何自定义它们以及如何向其提供代码。 + +幸运的是,有很多选择可以帮助你。除了[官方项目文档] [13]、印刷书籍和认证培训计划外,还有大量社区创造的优秀资源。我们每个月可以在 Opensource.com 上查看它在博客和其他网站上最近发布的指南和教程,这会给你启发。我们来看看这次我们发现了什么。 + +* 首先在本月的批量发布中,我们有一篇来自 Antony Messerli 的指南,介绍如何通过 Ansible [设置 OpenStack 云][1]。Messerli 引导我们完成实验室环境中的配置以及 OpenStack 在集群上运行所需的 playbook,还有添加镜像、设置网络等的基础知识。如果你正在考虑使用 Ansible 安装 OpenStack 小型本地测试环境,这是一篇很好的文章。 + +* 接下来,你有没有想过 Neutron 网络如何在 OpenStack 中的工作的么?应用程序中发生的如何对应于底层代码?Arie Bregman 在[这篇文章][2]中提供了一段 OpenStack Neutron 代码。你一定要熟悉一般的网络原理,至少有一点 OpenStack 代码基础才能跟上。 + +* Gerrit是 OpenStack 使用的开源代码审查项目,用于管理上传的修补程序,并允许在将更改合并到主 OpenStack 代码库之前进行反馈和测试。对于那些习惯于不同的代码审查系统(或根本没有的),Gerrit 可能会有点混乱,尽管它具有很好的仪表板功能,因此你只能看到对你很重要的信息。Dougal Matthews 在[这篇文章][3]中带我们看了他的 Gerrit 仪表板设置,这可能会帮助你设置自己的。 + +* 上个月在波士顿举办的 OpenStack 峰会的[视频][4]已经有了,无论你是否参加过上个月的活动,这都包含了技术和非技术专题的宝库。不知道从哪里开始?这有个来自 Julio Villarreal Pelegrino 关于如何规划、构建、运行一个成功的 OpenStack 云计算的[演讲][5]。 + +* 任何云管理员都应该担心安全问题。但你从哪里开始?Naveen Joy 发布了一个很好的十个安全问题的[清单][6],用于加固你的 OpenStack 网络;你可以在上个月的同一主题演讲中查看[这个视频][7]。 + +* OpenStack 中的内部消息服务在一个公共库中进行管理,该库存在于一个称为 Oslo 的项目中,不令人惊讶地它被称为 Oslo.Messenging。要了解这个库的基础知识,它在这个分为[ 2 个][8][部分][9]的博客中提到。 + +* * * + +想要了解更多?请务必从有三年以上社区生成的内容中查看我们完整的 [OpenStack 指南、如何做和教程][14],以帮助你学习成为一名高效的 OpenStack 开发人员或管理员。 + +有很棒教程、指导或者如何做需要我们分享的么?在下面的评论中分享。 + +-------------------------------------------------------------------------------- + +作者简介: + +Jason Baker - Jason 热衷于使用技术使世界更加开放,从软件开发到阳光政府行动。Linux 桌面爱好者、地图/地理空间爱好者、树莓派工匠、数据分析和可视化极客、偶尔的码农、云本土主义者。在 Twitter 上关注他。 + +via: https://opensource.com/article/17/6/openstack-guides-and-tutorials + +作者:[ Jason Baker (Red Hat)][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/jason-baker +[1]:https://www.reversengineered.com/2016/05/09/setting-up-an-openstack-cloud-using-ansible/ +[2]:http://abregman.com/2017/05/29/openstack-neutron-service-code-deep-dive/ +[3]:http://www.dougalmatthews.com/2017/May/19/how-i-gerrit/ +[4]:https://www.openstack.org/videos/ +[5]:http://www.juliosblog.com/dont-fail-at-scale-how-to-plan-for-build-and-operate-a-successful-openstack-cloud-video-openstack-summit2017/ +[6]:https://blogs.cisco.com/cloud/securing-openstack-networking +[7]:https://www.openstack.org/videos/boston-2017/securing-openstack-networking +[8]:https://pigdogweb.wordpress.com/2017/05/22/intro-to-oslo-messaging/ +[9]:https://pigdogweb.wordpress.com/2017/06/02/oslo-messaging-the-cloud-is-calling/ +[10]:https://opensource.com/article/17/6/openstack-guides-and-tutorials?rate=tRBp5wgAE1d3YHJSwcHWnfgXyJlqJedMImQFqJiW-tE +[11]:https://opensource.com/user/19894/feed +[12]:https://opensource.com/resources/what-is-openstack +[13]:http://docs.openstack.org/ +[14]:https://opensource.com/resources/openstack-tutorials +[15]:https://opensource.com/users/jason-baker +[16]:https://opensource.com/users/jason-baker +[17]:https://opensource.com/article/17/6/openstack-guides-and-tutorials#comments From 52b7c7edd97b6de6ff69efa635a99d956e795d5f Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 24 Jul 2017 08:59:03 +0800 Subject: [PATCH 0750/1407] translating --- .../tech/20170713 Fundamentals of graph databases with Neo4j.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170713 Fundamentals of graph databases with Neo4j.md b/sources/tech/20170713 Fundamentals of graph databases with Neo4j.md index d804e34b67..655083d4be 100644 --- a/sources/tech/20170713 Fundamentals of graph databases with Neo4j.md +++ b/sources/tech/20170713 Fundamentals of graph databases with Neo4j.md @@ -1,3 +1,5 @@ +translating-----geekpi + Fundamentals of graph databases with Neo4j ============================================================ From 66d841dccd43e2e6f0ed1deba722cdcda77c6585 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 24 Jul 2017 14:42:13 +0800 Subject: [PATCH 0751/1407] PRF&PUB:20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md @ictlyh --- ...Linux Debugger Part 4 Elves and dwarves.md | 74 ++++++------------- 1 file changed, 21 insertions(+), 53 deletions(-) rename {translated/tech => published}/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md (74%) diff --git a/translated/tech/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md b/published/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md similarity index 74% rename from translated/tech/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md rename to published/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md index 54bbb35896..261f35a64c 100644 --- a/translated/tech/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md +++ b/published/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md @@ -1,68 +1,43 @@ -开发 Linux 调试器第四部分:Elves 和 dwarves +开发一个 Linux 调试器(四):Elves 和 dwarves ============================================================ -到目前为止,你已经听到了关于 dwarves、调试信息、一种无需解析就可以理解源码方式的窃窃私语。今天我们会详细介绍源码级的调试信息,作为本指南后面部分使用它的准备。 - -* * * +到目前为止,你已经偶尔听到了关于 dwarves、调试信息、一种无需解析就可以理解源码方式。今天我们会详细介绍源码级的调试信息,作为本指南后面部分使用它的准备。 ### 系列文章索引 随着后面文章的发布,这些链接会逐渐生效。 -1. [启动][1] - +1. [准备环境][1] 2. [断点][2] - 3. [寄存器和内存][3] - 4. [Elves 和 dwarves][4] - 5. [源码和信号][5] - 6. [源码级逐步执行][6] - 7. 源码级断点 - 8. 调用栈展开 - 9. 读取变量 - 10. 下一步 -译者注:ELF([Executable and Linkable Format](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format "Executable and Linkable Format") 可执行文件格式),DWARF(一种广泛使用的调试数据格式,参考 [WIKI](https://en.wikipedia.org/wiki/DWARF "DWARF WIKI")) -* * * - ### ELF 和 DWARF 简介 -ELF 和 DWARF 可能是两个你没有听说过,但可能大部分时间都在使用的组件。ELF(Executable and Linkable Format,可执行和可链接格式)是 Linux 系统中使用最广泛的目标文件格式;它指定了一种方式存储二进制文件的所有不同部分,例如代码、静态数据、调试信息以及字符串。它还告诉加载器如何加载二进制文件并准备执行,其中包括说明二进制文件不同部分在内存中应该放置的地点,哪些位需要根据其它组件的位置固定(_重分配_)以及其它。在这些博文中我不会用太多篇幅介绍 ELF,但是如果你感兴趣的话,你可以查看[这个很好的信息图][7]或[标准][8]。 +ELF 和 DWARF 可能是两个你没有听说过,但可能大部分时间都在使用的组件。ELF([Executable and Linkable Format](https://en.wikipedia.org/wiki/Executable_and_Linkable_Format "Executable and Linkable Format"),可执行和可链接格式)是 Linux 系统中使用最广泛的目标文件格式;它指定了一种存储二进制文件的所有不同部分的方式,例如代码、静态数据、调试信息以及字符串。它还告诉加载器如何加载二进制文件并准备执行,其中包括说明二进制文件不同部分在内存中应该放置的地点,哪些位需要根据其它组件的位置固定(_重分配_)以及其它。在这些博文中我不会用太多篇幅介绍 ELF,但是如果你感兴趣的话,你可以查看[这个很好的信息图][7]或[该标准][8]。 -DWARF 是通常和 ELF 一起使用的调试信息格式。它不一定要绑定到 ELF,但它们两者是一起发展的,一起工作得很好。这种格式允许编译器告诉调试器最初的源代码如何和被执行的二进制文件相关联。这些信息分散到不同的 ELF 部分,每个部分都有一份它自己中继的信息。这是从这种高度信息集成中定义、提取的不同部分,可能有些过时[DWARF 调试格式简介][9]: +[DWARF](https://en.wikipedia.org/wiki/DWARF "DWARF WIKI")是通常和 ELF 一起使用的调试信息格式。它不一定要绑定到 ELF,但它们两者是一起发展的,一起工作得很好。这种格式允许编译器告诉调试器最初的源代码如何和被执行的二进制文件相关联。这些信息分散到不同的 ELF 部分,每个部分都衔接有一份它自己的信息。下面不同部分的定义,信息取自这个稍有过时但非常重要的 [DWARF 调试格式简介][9]: * `.debug_abbrev` `.debug_info` 部分使用的缩略语 - * `.debug_aranges` 内存地址和编译的映射 - * `.debug_frame` 调用帧信息 - * `.debug_info` 包括 DWARF 信息条目(DIEs:DWARF Information Entries)的核心 DWARF 数据 - * `.debug_line` 行号程序 - * `.debug_loc` 位置描述 - * `.debug_macinfo` 宏描述 - * `.debug_pubnames` 全局对象和函数查找表 - * `.debug_pubtypes` 全局类型查找表 - * `.debug_ranges` DIEs 的引用地址范围 - * `.debug_str` `.debug_info` 使用的字符串列表 - * `.debug_types` 类型描述 -我们最关心 `.debug_line` 和 `.debug_info` 部分,让我们来看一个简单程序的 DWARF 信息。 +我们最关心的是 `.debug_line` 和 `.debug_info` 部分,让我们来看一个简单程序的 DWARF 信息。 ``` int main() { @@ -73,8 +48,6 @@ int main() { } ``` -* * * - ### DWARF 行表 如果你用 `-g` 选项编译这个程序,然后将结果传递给 `dwarfdump` 执行,在行号部分你应该可以看到类似这样的东西: @@ -101,7 +74,7 @@ Source lines (from CU-DIE at .debug_info offset 0x0000000b): 前面几行是一些如何理解 dump 的信息 - 主要的行号数据从以 `0x00400670` 开头的行开始。实际上这是一个代码内存地址到文件中行列号的映射。`NS` 表示地址标记一个新语句的开始,这通常用于设置断点或逐步执行。`PE` 表示函数序言(LCTT 译注:在汇编语言中,[function prologue](https://en.wikipedia.org/wiki/Function_prologue "function prologue") 是程序开始的几行代码,用于准备函数中用到的栈和寄存器)的结束,这对于设置函数断点非常有帮助。`ET` 表示转换单元的结束。信息实际上并不像这样编码;真正的编码是一种非常节省空间的排序程序,可以通过执行它来建立这些行信息。 -那么,假设我们想在 variable.cpp 的第 4 行设置断点,我们该怎么做呢?我们查找和该文件对应的条目,然后查找对应的行条目,查找对应的地址,在那里设置一个断点。在我们的例子中,条目是: +那么,假设我们想在 `variable.cpp` 的第 4 行设置断点,我们该怎么做呢?我们查找和该文件对应的条目,然后查找对应的行条目,查找对应的地址,在那里设置一个断点。在我们的例子中,条目是: ``` 0x00400686 [ 4,14] NS @@ -112,14 +85,11 @@ Source lines (from CU-DIE at .debug_info offset 0x0000000b): 反过来也是如此。如果我们已经有了一个内存地址 - 例如说,一个程序计数器值 - 想找到它在源码中的位置,我们只需要从行表信息中查找最接近的映射地址并从中抓取行号。 -* * * - ### DWARF 调试信息 `.debug_info` 部分是 DWARF 的核心。它给我们关于我们程序中存在的类型、函数、变量、希望和梦想的信息。这部分的基本单元是 DWARF 信息条目(DWARF Information Entry),我们亲切地称之为 DIEs。一个 DIE 包括能告诉你正在展现什么样的源码级实体的标签,后面跟着一系列该实体的属性。这是我上面展示的简单事例程序的 `.debug_info` 部分: ``` - .debug_info COMPILE_UNIT
: @@ -201,15 +171,15 @@ for each compile unit: ``` -这对于很多目的都有效,但如果有成员函数或者内联,就会变得更加复杂。假如有内联,一旦我们找到范围包括我们程序计数器的函数,我们需要递归遍历该 DIE 的所有孩子检查是否有内联函数能更好地匹配。在我的代码中,我不会为该调试器处理内联,但如果你想要的话你可以添加该功能。 +这对于很多目的都有效,但如果有成员函数或者内联(inline),就会变得更加复杂。假如有内联,一旦我们找到其范围包括我们的程序计数器(PC)的函数,我们需要递归遍历该 DIE 的所有孩子检查有没有内联函数能更好地匹配。在我的代码中,我不会为该调试器处理内联,但如果你想要的话你可以添加该功能。 ### 如何在一个函数上设置断点? -再次说明,这取决于你是否想要支持成员函数,命名空间以及类似的东西。对于简单的函数你只需要迭代遍历不同编译单元中的函数直到你找到一个合适的名字。如果你的编译器能够填充 `.debug_pubnames` 部分,你可以更高效地做到这点。 +再次说明,这取决于你是否想要支持成员函数、命名空间以及类似的东西。对于简单的函数你只需要迭代遍历不同编译单元中的函数直到你找到一个合适的名字。如果你的编译器能够填充 `.debug_pubnames` 部分,你可以更高效地做到这点。 -一旦找到了函数,你可以在 `DW_AT_low_pc` 给定的内存地址设置一个断点。尽管如此,那会在函数序言处中断,但更合适的是在用户代码出中断。由于行表信息可以指定内存地址、后者指定序言的结束,你只需要在行表中查找 `DW_AT_low_pc` 的值,然后一直读取直到被标记为序言结束的条目。一些编译器不会输出这些信息,因此另一种方式是在该函数第二行条目指定的地址处设置断点。 +一旦找到了函数,你可以在 `DW_AT_low_pc` 给定的内存地址设置一个断点。不过那会在函数序言处中断,但更合适的是在用户代码处中断。由于行表信息可以指定序言的结束的内存地址,你只需要在行表中查找 `DW_AT_low_pc` 的值,然后一直读取直到被标记为序言结束的条目。一些编译器不会输出这些信息,因此另一种方式是在该函数第二行条目指定的地址处设置断点。 -假如我们想在我们事例程序中的 `main` 函数设置断点。我们查找名为 `main` 的函数,获取到它的 DIE: +假如我们想在我们示例程序中的 `main` 函数设置断点。我们查找名为 `main` 的函数,获取到它的 DIE: ``` < 1><0x0000002e> DW_TAG_subprogram @@ -242,21 +212,21 @@ Clang 在这个条目中包括了序言结束标记,因此我们知道在这 ### 我如何读取一个变量的内容? -读取变量可能非常复杂。它们是难以捉摸的东西,可能在整个函数中移动、保存在寄存器中、被放置于内存、被优化掉、隐藏在角落里,等等。幸运的是我们的简单事例是真的简单。如果我们想读取变量 `a` 的内容,我们需要看它的 `DW_AT_location` 属性: +读取变量可能非常复杂。它们是难以捉摸的东西,可能在整个函数中移动、保存在寄存器中、被放置于内存、被优化掉、隐藏在角落里,等等。幸运的是我们的简单示例是真的很简单。如果我们想读取变量 `a` 的内容,我们需要看它的 `DW_AT_location` 属性: ``` DW_AT_location DW_OP_fbreg -8 ``` -这告诉我们内容被保存在以栈帧基偏移为 `-8` 的地方。为了找到栈帧基,我们查找所在函数的 `DW_AT_frame_base` 属性。 +这告诉我们内容被保存在以栈帧基(base of the stack frame)偏移为 `-8` 的地方。为了找到栈帧基,我们查找所在函数的 `DW_AT_frame_base` 属性。 ``` DW_AT_frame_base DW_OP_reg6 ``` -从 [System V x86_64 ABI][10] 我们可以知道 `reg6` 在 x86 中是帧指针寄存器。现在我们读取帧指针的内容,从中减去 8,就找到了我们的变量。如果我们真的想它变得有意义,我们还需要看它的类型: +从 [System V x86_64 ABI][10] 我们可以知道 `reg6` 在 x86 中是帧指针寄存器。现在我们读取帧指针的内容,从中减去 `8`,就找到了我们的变量。如果我们知道它具体是什么,我们还需要看它的类型: ``` < 2><0x0000004c> DW_TAG_variable @@ -279,7 +249,7 @@ DW_AT_frame_base DW_OP_reg6 当然,类型可能比那要复杂得多,因为它们要能够表示类似 C++ 的类型,但是这能给你它们如何工作的基本认识。 -再次回到帧基,Clang 可以通过帧指针寄存器跟踪帧基。最近版本的 GCC 倾向于 `DW_OP_call_frame_cfa`,它包括解析 `.eh_frame` ELF 部分,那是一个我不会去写的完全不同的内容。如果你告诉 GCC 使用 DWARF 2 而不是最近的版本,它会倾向于输出位置列表,这更便于阅读: +再次回到帧基(frame base),Clang 可以通过帧指针寄存器跟踪帧基。最近版本的 GCC 倾向于使用 `DW_OP_call_frame_cfa`,它包括解析 `.eh_frame` ELF 部分,那是一个我不会去写的另外一篇完全不同的文章。如果你告诉 GCC 使用 DWARF 2 而不是最近的版本,它会倾向于输出位置列表,这更便于阅读: ``` DW_AT_frame_base @@ -292,28 +262,26 @@ DW_AT_frame_base Date: Mon, 24 Jul 2017 19:07:24 +0900 Subject: [PATCH 0752/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=AE=8C=E6=88=90-?= =?UTF-8?q?toyijiu?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... a man page Faster than a Google search.md | 158 ------------------ ... a man page Faster than a Google search.md | 143 ++++++++++++++++ 2 files changed, 143 insertions(+), 158 deletions(-) delete mode 100644 sources/tech/20170712 How to use a man page Faster than a Google search.md create mode 100644 translated/tech/20170712 How to use a man page Faster than a Google search.md diff --git a/sources/tech/20170712 How to use a man page Faster than a Google search.md b/sources/tech/20170712 How to use a man page Faster than a Google search.md deleted file mode 100644 index a556f4c07f..0000000000 --- a/sources/tech/20170712 How to use a man page Faster than a Google search.md +++ /dev/null @@ -1,158 +0,0 @@ -翻译中 by WuXiao(toyijiu) -How to use a man page: Faster than a Google search -============================================================ - -### Linux manual pages are easier to use than you think and hold a wealth of information. - - -![How to use a man page: Faster than a Google search](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/yearbook-haff-rx-linux-file-lead_0.png?itok=48iDNoH8 "How to use a man page: Faster than a Google search") -Image by :  - -[Internet Archive Book Images][8]. Modified by Opensource.com. CC BY-SA 4.0 - -It's easy to get into the habit of googling anything you want to know about a command or operation in Linux, but I'd argue there's something even better: a living and breathing, complete reference, the **man pages**, which is short for manual pages. - -The history of man pages predates Linux, all the way back to the early days of Unix. [According to Wikipedia][9], Dennis Ritchie and Ken Thompson wrote the first man pages in 1971, well before the days of personal computers, around the time when many calculators in use were the size of toaster ovens. Man pages also have a reputation of being terse and, in a way, have a language of their own. Just like Unix and Linux, the man pages have not been static, and they continue to be developed and maintained just like the kernel. - -Man pages are divided into sections referenced by numbers: - -1. General user commands - -2. System calls - -3. Library functions - -4. Special files and drivers - -5. File formats - -6. Games and screensavers - -7. Miscellanea - -8. System administration commands and daemons - -Even so, users generally don't need to know the section where a particular command lies to find what they need. - -The files are formatted in a way that may look odd to many users today. Originally, they were written in in an old form of markup called **troff** because they were designed to be printed through a PostScript printer, so they included formatting for headers and other layout aspects. In Linux, [**groff** ][10]is used instead. - -In my Fedora, the man pages are located in **/usr/share/man** with subdirectories (like **man1** for Section 1 commands) as well as additional subdirectories for translations of the man pages. - -If you look up the man page for the command **man**, you'll see the file **man.1.gz**, which is the man pages compressed with the **gzip** utility. To access a man page, type a command such as: - -``` -man man -``` - -for example, to show the man page for **man**. This uncompresses the man page, interprets the formatting commands, and displays the results with [**less**][11], so navigation is the same as when you use **less**. - -All man pages should have the following subsections: **Name**, **Synopsis**, **Description**, **Examples**, and **See** **Also**. Many have additional sections, like **Options**, **Exit** **Status**, **Environment**, **Bugs**, **Files**, **Author**, **Reporting** **Bugs**, **History**, and **Copyright**. - -### Breaking down a man page - -To explain how to interpret a typical man page, let's use the [man page for **ls**][12] as an example. Under **Name**, we see - -``` -ls - list directory contents -``` - -which tells us what **ls** means in the simplest terms. - -Under **Synopsis**, we begin to see the terseness: - -``` -ls [OPTION]... [FILE]… -``` - -Any element that occurs inside brackets is optional. The above command means you can legitimately type **ls** and nothing else. The ellipsis after each element indicates that you can include as many options as you want (as long as they're compatible with each other) and as many files as you want. You can specify a directory name, and you can also use ***** as a wildcard. For example: - -``` -ls Documents/*.txt -``` - -Under **Description**, we see a more verbose description of what the command does, followed by a list of the available options for the command. The first option for **ls** is - -``` --a, --all -        do not ignore entries starting with . -``` - -If we want to use this option, we can either type the short form syntax, **-a**, or the long form **--all**. Not all options have two forms (e.g., **--author**), and even when they do, they aren't always so obviously related (e.g., -**F, --classify**). When you want to use multiple options, you can either type the short forms with spaces in between or type them with a single hyphen and no spaces (as long as they do not require further sub-options). Therefore, - -``` -ls -a -d -l -``` - -and - -``` -ls -adl -``` - -are equivalent. - -The command **tar** is somewhat unique, presumably due to its long history, in that it doesn't require a hyphen at all for the short form. Therefore, - -``` -tar -cvf filearchive.tar thisdirectory/ -``` - -and - -``` -tar cvf filearchive.tar thisdirectory/ -``` - -are both legitimate. - -On the **ls** man page, after **Description** are **Author**, **Reporting Bugs**, **Copyright**, and **See Also**. - -The **See Also** section will often suggest related man pages, so it is generally worth a glance. After all, there is much more to man pages than just commands. - -More Linux resources - -* [What is Linux?][1] - -* [What are Linux containers?][2] - -* [Download Now: Linux commands cheat sheet][3] - -* [Advanced Linux commands cheat sheet][4] - -* [Our latest Linux articles][5] - -Certain commands that are specific to Bash and not system commands, like **alias**, **cd**, and a number of others, are listed together in a single **BASH_BUILTINS** man page. While the documentation for these is even more terse and compact, overall it contains similar information. - -I find that man pages offer a lot of good, usable information, especially when I need a command I haven't used recently, and I need to brush up on the options and requirements. This is one place where the man pages' much-maligned terseness is actually very beneficial. - --------------------------------------------------------------------------------- - -作者简介: - -Greg Pittman - Greg is a retired neurologist in Louisville, Kentucky, with a long-standing interest in computers and programming, beginning with Fortran IV in the 1960s. When Linux and open source software came along, it kindled a commitment to learning more, and eventually contributing. He is a member of the Scribus Team. - - -via: https://opensource.com/article/17/7/using-man-pages - -作者:[ Greg Pittman ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/greg-p -[1]:https://opensource.com/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[6]:https://opensource.com/article/17/7/using-man-pages?rate=W0QImEyJK1b4qSGof6I3agtPeTpPQXkaSekp_bI_Rno -[7]:https://opensource.com/user/30666/feed -[8]:https://www.flickr.com/photos/internetarchivebookimages/14803082483/in/photolist-oy6EG4-pZR3NZ-i6r3NW-e1tJSX-boBtf7-oeYc7U-o6jFKK-9jNtc3-idt2G9-i7NG1m-ouKjXe-owqviF-92xFBg-ow9e4s-gVVXJN-i1K8Pw-4jybMo-i1rsBr-ouo58Y-ouPRzz-8cGJHK-85Evdk-cru4Ly-rcDWiP-gnaC5B-pAFsuf-hRFPcZ-odvBMz-hRCE7b-mZN3Kt-odHU5a-73dpPp-hUaaAi-owvUMK-otbp7Q-ouySkB-hYAgmJ-owo4UZ-giHgqu-giHpNc-idd9uQ-osAhcf-7vxk63-7vwN65-fQejmk-pTcLgA-otZcmj-fj1aSX-hRzHQk-oyeZfR -[9]:https://en.wikipedia.org/wiki/Man_page -[10]:https://en.wikipedia.org/wiki/Groff_(software) -[11]:https://en.wikipedia.org/wiki/Less_(Unix) -[12]:http://linuxcommand.org/man_pages/ls1.html -[13]:https://opensource.com/users/greg-p -[14]:https://opensource.com/users/greg-p -[15]:https://opensource.com/article/17/7/using-man-pages#comments diff --git a/translated/tech/20170712 How to use a man page Faster than a Google search.md b/translated/tech/20170712 How to use a man page Faster than a Google search.md new file mode 100644 index 0000000000..0ab5460fb0 --- /dev/null +++ b/translated/tech/20170712 How to use a man page Faster than a Google search.md @@ -0,0 +1,143 @@ +教你如何更快速有效地利用man来代替google索引 +============================================================ + +### Linux 的 manual page其实拥有很多有用的信息,而且比你想象中更容易使用 + +![How to use a man page: Faster than a Google search](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/yearbook-haff-rx-linux-file-lead_0.png?itok=48iDNoH8 "How to use a man page: Faster than a Google search") +照片来源于 :  + +[Internet Archive Book Images][8]. 修改自 Opensource.com. CC BY-SA 4.0 + +我们通常通过 google 索引来查询 Linux 中的指令说明,但是其实还有一个更好的办法:那就是通过 Linux 自带的 **man pages**(manual pages 的缩写) 来查询指令详尽完整的使用说明。 + + +man pages 的历史本身比 Linux 还长,可以追溯到 Unix 早期那个年代。 通过[这个 Wikipedia][9]可以知道,Dennis Ritchie 和 Ken Thompson 在 1971 年写了第一个 man pages,那个年代的计算员使用的还是像烤箱一样的计算机,个人电脑还未出世。man pages 也有它自己的一套设计精炼的语法,和 Unix 与 Linux 一样,man pages 也不是一成不变的,它就像 Linux 内核一样不停地发展更新。 + +Man pages 通过数字标识符来分成不同类型的内容: + +1. 一般用户指令 + +2. 系统调用指令 + +3. 库函数 + +4. 特殊的文件和驱动程序 + +5. 文档格式 + +6. 游戏和屏保 + +7. Miscellanea + +8. 系统管理指令和守护进程 + +尽管如此,用户一般也不需要知道他们想查询的指令是属于哪一个类型的。 + +这些文件格式化的方式在当今许多用户看来有点古怪。因为最开始他们是用**trooff** 的方式,通过 PostScript 打印机来打印,所以包含了头部和布局方面的格式化信息。在 Linux 中,取而代之使用了一种叫做[**groff**][10]的方法。 + +在我的 Fedora 系统中,man pages 相关的文件存储在 **/usr/share/man** 目录下,根据文件类型分别存储在类似于 man1(man1 就是存储一般用户指令) 的子目录中。 + +如果你在 Shell 中输入 man 查询 man page,你查到的将是 **gzip** 格式压缩的 **man.1.gz** 文件,想要查询 man page 的话,需要输入如下指令: + +``` +man man +``` + +这个例子会显示 **man** 的 man page,先解压 man page 文件,然后解释这条指令并显示在 Shell 上,也可以输入 **man less**,两者的效果是一样的。 + +所有的 man pages 都应该显示这些分段消息:**Name**, **Synopsis**, **Description**,**Examples**,**See**,**Also**. 有些还会添加一些额外的分段消息,比如 **Options**, **Exit** **Status**, **Environment**, **Bugs**, **Files**, **Author**, **Reporting** **Bugs**, **History**,**Copyright**。 + +### 详细说明一个 man page + +为了更详细地介绍一个典型的 man page,就用 [**ls**][12] 指令来分析吧,在 **Name** 分段下,我们可以看到如下内容: + +``` +ls - list directory contents +``` + +它会简要地告诉我 **ls** 这条指令的作用. + +在 **Synopsis** 分段下,我们可以看到如下的内容: + +``` +ls [OPTION]... [FILE]… +``` + +任何在中括号中的元素都是可选的。你可以只输入 **ls** 指令,后面不接任何参数。参数后面的省略号表示你可以添加任意多个合法兼容的参数和文件名。对于 [FILE] 参数,你可以指定具体的文件夹名,或者可以使用通配符 *****,比如这个例子,它会显示 Documents 文件夹下的 .txt 文件: + +``` +ls Documents/*.txt +``` + +在 **Description** 分段下, 我们可以看到关于这条指令更加详细的信息,还有一列关于这条指令各个参数作用的详细介绍,比如说 **ls** 指令的 **-a** 参数,它的作用是显示包括隐藏文件/目录在内的所有文件: + +``` +-a, --all +``` + +如果我们想用这些参数,要么用他们的别名,比如 **-a** ,要么用他们的全名,比如 **--all**(两条中划线)。然而并不是所有参数都有全名和别名(比如 **--author** 只有一种),而且两者的名字并不总是相互关联的(-**F, --classify**)。当你想用多条参数时,要么以空格隔开,要么共用一个连字符**-**,在连字符后连续输入你需要的参数(不要添加空格)。比如下面两个等价的例子: + +``` +ls -a -d -l +``` + +``` +ls -adl +``` + +但是 **tar** 这个指令有些例外,由于一些历史遗留原因,当参数使用别名时可以不用添加连字符**-**,因此以下两种命令都是合法的: + +``` +tar -cvf filearchive.tar thisdirectory/ +``` + + +``` +tar cvf filearchive.tar thisdirectory/ +``` + +**ls** 的 **Description** 分段后是 **Author**,**Reporting Bugs**,**Copyright**, **See Also** 字段。 + +**See Also** 字段会提供一些相关的 man pages, 没事的话可以看看. 毕竟除了指令外还有许多其他类型的 man pages。 + +这里有一些参考链接: +- [Linux 是什么](1) +- [Linux 容器是什么](2) +- [快下载吧:这里有Linux 命令小抄](3) +- [比楼上更高级的 Linux 命令小抄](4) +- [我们最新的 Linux 相关文章](5) + + +有一些指令不是系统指令,而是 Bash 特有的,比如 **alias** 和 **cd**。这些 Bash 特有的指令可以在 **BASH_BUILTINS** man page 中查看,和上面的比起来他们的描述更加精炼,不过内容都是类似的。 + +其实通过 man pages 你可以获得大量有用的信息,特别是当你想用一个已经很久没用过的指令,需要复习下这条指令的作用时。这个时候 man pages 饱受非议的简洁性反而对你来说是更好的。 + +-------------------------------------------------------------------------------- + +作者简介: +Greg Pittman - Greg 是住在肯塔基州路易斯维尔的一位退休神经学家,但是却对计算机和编程保持着长久的兴趣,从十九世纪六十年代就开始捣腾 Fortran IV 了。随着 Linux 和开源软件的到来,更加激起了他去学习的兴趣并投身于这项事业中,并成为 Scribus 组织的一员。 + +via: https://opensource.com/article/17/7/using-man-pages + +作者:[ Greg Pittman ][a] +译者:[吴霄/toyijiu](https://github.com/toyijiu) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/greg-p +[1]:https://opensource.com/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[6]:https://opensource.com/article/17/7/using-man-pages?rate=W0QImEyJK1b4qSGof6I3agtPeTpPQXkaSekp_bI_Rno +[7]:https://opensource.com/user/30666/feed +[8]:https://www.flickr.com/photos/internetarchivebookimages/14803082483/in/photolist-oy6EG4-pZR3NZ-i6r3NW-e1tJSX-boBtf7-oeYc7U-o6jFKK-9jNtc3-idt2G9-i7NG1m-ouKjXe-owqviF-92xFBg-ow9e4s-gVVXJN-i1K8Pw-4jybMo-i1rsBr-ouo58Y-ouPRzz-8cGJHK-85Evdk-cru4Ly-rcDWiP-gnaC5B-pAFsuf-hRFPcZ-odvBMz-hRCE7b-mZN3Kt-odHU5a-73dpPp-hUaaAi-owvUMK-otbp7Q-ouySkB-hYAgmJ-owo4UZ-giHgqu-giHpNc-idd9uQ-osAhcf-7vxk63-7vwN65-fQejmk-pTcLgA-otZcmj-fj1aSX-hRzHQk-oyeZfR +[9]:https://en.wikipedia.org/wiki/Man_page +[10]:https://en.wikipedia.org/wiki/Groff_(software) +[11]:https://en.wikipedia.org/wiki/Less_(Unix) +[12]:http://linuxcommand.org/man_pages/ls1.html +[13]:https://opensource.com/users/greg-p +[14]:https://opensource.com/users/greg-p +[15]:https://opensource.com/article/17/7/using-man-pages#comments From 9a4691c9a0babf2530e220138de540104e338c06 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 24 Jul 2017 19:03:45 +0800 Subject: [PATCH 0753/1407] =?UTF-8?q?PRF&PUB:20170215=20Talk=20of=20tech?= =?UTF-8?q?=20innovation=20is=20bullshit.=20Shut=20up=20and=20get=20the=20?= =?UTF-8?q?work=20done=20=E2=80=93=20says=20Linus=20Torvalds.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @geekpi --- ...get the work done – says Linus Torvalds.md | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) rename {translated/talk => published}/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md (51%) diff --git a/translated/talk/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md b/published/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md similarity index 51% rename from translated/talk/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md rename to published/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md index 9eb5d482ca..7b13bca07f 100644 --- a/translated/talk/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md +++ b/published/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md @@ -1,39 +1,39 @@ -Linus Torvalds 说 - 谈技术创新是愚蠢的。闭上嘴把事情做好 +Linus Torvalds 说:谈论技术创新是愚蠢的,闭上嘴把事情做好 ============================================================ -> 来自 Linux 内核首领的最佳生活提示 +> 来自 Linux 内核首领的最佳生活提示。 - ![Linus Torvalds at Open Source Leadership Summit](https://regmedia.co.uk/2017/02/15/linus_torvalds.jpg?x=648&y=348&crop=1) +![Linus Torvalds at Open Source Leadership Summit](https://regmedia.co.uk/2017/02/15/linus_torvalds.jpg?x=648&y=348&crop=1) -**OSLS** Linus Torvalds 认为,技术行业的创新庆祝活动是骄人的,自我的祝贺和自我服务的。 +**OSLS 报道:** Linus Torvalds 认为,技术行业的创新庆祝活动是沾沾自喜,自我陶醉和自私自利的。 -他所使用的艺术术语更为直率:“行业的创新如此之多都是胡说。” 他说:“任何人都可以创新,不要做这种‘不同思考’,这是无意义的,它们有百分之九十九是完成工作。” +他所使用的艺术化术语更为直率:“行业的创新如此之多都是胡说。” 他说:“人人创新——不要做这种‘不同思考’,这是无意义的,它们有百分之九十九只是工作而已。” -周三在加利福尼亚州的[开源领袖峰会] [5]中,Linux 基金会执行总监 Jim Zemlin 采访了 Linus,讨论了他如何管理 Linux 内核的开发和他对工作的态度。 +周三在加利福尼亚州召开的[开源领袖峰会(OSLS)][5]中,Linux 基金会执行总监 Jim Zemlin 采访了 Linus,讨论了他如何管理 Linux 内核的开发和他对工作的态度。 -Torvalds 说:“所有的炒作都不是真正的工作,真正的工作是细节。” +Torvalds 说:“所有的炒作都不是真正的工作,真正的工作是在细节之中。” Torvalds 表示赞成这样一个观点,即成功的项目是 99% 的汗水,百分之一的创新。 -作为[开源 Linux 内核][6]的创造者和仁慈的独裁者,不用提还是 Git 分布式版本控制系统的发明者,Torvalds 已经证明他的方法产生了结果。很难夸大 Linux 对技术行业的影响。Linux 是服务器的主要操作系统。几乎所有的高性能计算都运行在 Linux 上。而大多数移动设备和嵌入式设备都依赖于 Linux。 +作为[开源 Linux 内核][6]的创造者和仁慈独裁者,不用提还是 Git 分布式版本控制系统的发明者,Torvalds 已经证明他的方法产生了结果。Linux 对技术行业的影响已经不用再夸大了。Linux 是服务器的主要操作系统,几乎所有的高性能计算都运行在 Linux 上,而大多数移动设备和嵌入式设备都依赖于 Linux。 -Linux 内核可能是 PC 时代最成功的技术协作项目。根据 Zemlin 的说法,内核贡献者自 2005 年以来总共增加了 13,500 多个,其中每天大约增加 10,000 行代码,移除 8000 行代码,修改 1,500 到 1,800 行代码。而且这一直在继续 - 虽然不是一直以目前的速度 - 但这已经超过了二十五年。 +Linux 内核可能是 PC 时代最成功的技术协作项目。根据 Zemlin 的说法,内核贡献者自 2005 年以来总共增加了 13500 多个,其中每天大约增加 10000 行代码,移除 8000 行代码,修改 1500 到 1800 行代码,而且这一直在继续 —— 虽然不是一直以目前的速度 —— 但这已经超过了二十五年。 -Torvalds 说:“我们已经这样做了 25 年,而且我们遇到的一个常见问题是人们站在在对方的脚趾上。所以对于所有这些历史,我们所做的是组织代码,组织代码流,[以及]组织我们的维护在痛点上 - 人们对一段代码的不一致 - 基本上消失了。” +Torvalds 说:“我们已经这样做了 25 年,而且我们遇到的一个常见问题是人们彼此需要磨合。所以组织代码、组织代码流、[以及]组织我们的维护关系构成了我们的历史,最终那些痛点,我说的是代码争议,基本上消失了。” Torvalds 解释说,该项目的结构使人们能够独立工作。他说:“我们已经能够真正模块化代码和开发模式,所以我们可以并行做很多事情。” Torvalds 说,技术起着明显的作用,但流程至少是同样重要的。 -Torvalds说:“这是一个社会项目。这是关于技术,技术是让人们能够就问题达成一致的东西,因为...它通常有非常明确的对和错。” +Torvalds 说:“这是一个社会化项目。这是技术层面的东西,而技术是让人们能够就问题达成一致的东西,因为……它通常有非常明确的对和错。” -但是现在 Torvalds 并没有像 20 年前一样对每一个变化进行审查,而是依靠贡献者的社交网络。他说:“这是社交网络和信任,并且我们有一个非常强大的网络,这就是为什么我们可以有一千人参与到每个版本。” +但是现在 Torvalds 并没有像 20 年前一样对每一个变化进行审查,而是依靠贡献者的社交网络。他说:“这是社交网络和信任,并且我们有一个非常强大的网络,这就是为什么我们可以有一千人参与到每个发布当中。” -对信任的重视解释了参与内核开发的困难,因为人们无法登录,提交代码然后消失。Torvalds 说:“你要提交很多小的补丁直到维护者信任你,在这一点上,你不仅仅是一个提交补丁的人,而是成为信任网络的一部分。” +对信任的重视解释了参与内核开发的困难,因为人们不可以登录、提交代码然后消失不见。Torvalds 说:“你要提交很多小的补丁直到维护者信任你才行,在这一点上,你不仅仅是一个提交补丁的人,而是成为信任网络的一部分。” -十年前,Torvalds 表示,他告诉其他内核贡献者,他希望有一个八周的发布时间表,而不是可能拖延几年的发布周期。内核开发人员设法将其发布周期减少到大约两个半月。从那时起,发展一直没有太大的惊喜。 +十年前,Torvalds 表示,他告诉其他内核贡献者,他希望有一个八周的发布时间表,而不是可能拖延几年的发布周期。内核开发人员设法将其发布周期减少到大约两个半月。从那时起,开发工作就一直很平稳。 -Torvalds 说:“说我们的流程有多好几乎是无聊的。对于我来说,所有真正紧张的时刻都是关于流程的,它们不有关代码,当代码不起作用时,这实际上是令人兴奋的...流程问题是很痛苦的。你永远不会想有流程问题...当人们开始对彼此生气时。” +Torvalds 说:“说我们的流程有多么好很无聊。对于我来说,所有真正紧张的时刻都是关于流程的,它们和代码无关,当代码不工作时,这实际上是令人高兴的……流程问题是很痛苦的。你永远不会想有流程问题……尤其是当人们开始彼此生气时。” -------------------------------------------------------------------------------- @@ -41,7 +41,7 @@ via: http://www.theregister.co.uk/2017/02/15/think_different_shut_up_and_work_ha 作者:[Thomas Claburn][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/) 荣誉推出 From ee55958909aac24a23b4deb813d763cab0007b3c Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 25 Jul 2017 00:17:37 +0800 Subject: [PATCH 0754/1407] PRF&PUB:20170629 This is how you OpenStack 6 new guides and tutorials.md @geekpi --- ...ou OpenStack 6 new guides and tutorials.md | 36 ++++++++----------- 1 file changed, 14 insertions(+), 22 deletions(-) rename {translated/tech => published}/20170629 This is how you OpenStack 6 new guides and tutorials.md (68%) diff --git a/translated/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md b/published/20170629 This is how you OpenStack 6 new guides and tutorials.md similarity index 68% rename from translated/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md rename to published/20170629 This is how you OpenStack 6 new guides and tutorials.md index a11825ef94..5f87327913 100644 --- a/translated/tech/20170629 This is how you OpenStack 6 new guides and tutorials.md +++ b/published/20170629 This is how you OpenStack 6 new guides and tutorials.md @@ -1,37 +1,29 @@ -给你的 OpenStack:6 个新指南和教程 + 6 个学习 OpenStack 的新指南和教程 ============================================================ -### 想了解更多关于 OpenStack 的内容?这些免费资源可能只是你所需要的。 - +> 想了解更多关于 OpenStack 的内容?这些免费资源可能只是你所需要的。 ![OpenStack guides and tutorials](https://opensource.com/sites/default/files/styles/image-full-size/public/images/education/edu_rcos.png?itok=wLMIaigd "OpenStack guides and tutorials") -图片来源: -opensource.com 云基础设施是一个非常需要的技能。如果你正在为你的云基础架构需求寻找开源解决方案,那么 [OpenStack][12] 就是其中之一。 -OpenStack 是一个巨大的项目集合,为云服务的几乎每一个部分都提供了解决方案和集成。虽然这个巨大范围使得它成为一个强大的工具,但这也意味着可能很难跟上并了解整个项目,如何使用它们、如何自定义它们以及如何向其提供代码。 +OpenStack 是一个巨大的项目集合,为云服务的几乎每一个部分都提供了解决方案和集成。虽然这个巨大范围使得它成为一个强大的工具,但这也意味着可能很难跟上并了解整个项目,了解如何使用它们、如何自定义它们以及如何向其提供代码。 -幸运的是,有很多选择可以帮助你。除了[官方项目文档] [13]、印刷书籍和认证培训计划外,还有大量社区创造的优秀资源。我们每个月可以在 Opensource.com 上查看它在博客和其他网站上最近发布的指南和教程,这会给你启发。我们来看看这次我们发现了什么。 - -* 首先在本月的批量发布中,我们有一篇来自 Antony Messerli 的指南,介绍如何通过 Ansible [设置 OpenStack 云][1]。Messerli 引导我们完成实验室环境中的配置以及 OpenStack 在集群上运行所需的 playbook,还有添加镜像、设置网络等的基础知识。如果你正在考虑使用 Ansible 安装 OpenStack 小型本地测试环境,这是一篇很好的文章。 - -* 接下来,你有没有想过 Neutron 网络如何在 OpenStack 中的工作的么?应用程序中发生的如何对应于底层代码?Arie Bregman 在[这篇文章][2]中提供了一段 OpenStack Neutron 代码。你一定要熟悉一般的网络原理,至少有一点 OpenStack 代码基础才能跟上。 +幸运的是,有很多选择可以帮助你。除了[官方项目文档] [13]、纸质书籍和认证培训计划外,还有大量社区创造的优秀资源。我们每个月可以在 Opensource.com 上查看它在博客和其他网站上最近发布的指南和教程,这会给你启发。我们来看看这次我们发现了什么。 +* 首先在本月的这一批中,我们有一篇来自 Antony Messerli 的指南,介绍如何通过 Ansible [设置 OpenStack 云][1]。Messerli 将引导我们完成实验室环境中的配置以及在集群上运行 OpenStack 所需的 playbook,还有添加镜像、设置网络等的基础知识。如果你正在考虑使用 Ansible 安装 OpenStack 小型本地测试环境,这是一篇很好的文章。 +* 接下来,你有没有想过 Neutron 网络如何在 OpenStack 中的工作的?应用程序中发生的事情如何对应于底层代码?Arie Bregman 在[这篇文章][2]中提供了一段 OpenStack Neutron 代码。你需要熟悉一般的网络原理,至少有一点 OpenStack 代码基础才能跟上。 * Gerrit是 OpenStack 使用的开源代码审查项目,用于管理上传的修补程序,并允许在将更改合并到主 OpenStack 代码库之前进行反馈和测试。对于那些习惯于不同的代码审查系统(或根本没有的),Gerrit 可能会有点混乱,尽管它具有很好的仪表板功能,因此你只能看到对你很重要的信息。Dougal Matthews 在[这篇文章][3]中带我们看了他的 Gerrit 仪表板设置,这可能会帮助你设置自己的。 +* 上个月在波士顿举办的 OpenStack 峰会的[视频][4]已经发布了,无论你是否参加过上个月的活动,这都包含了技术和非技术专题的宝库。不知道从哪里开始?这有个来自 Julio Villarreal Pelegrino 关于如何规划、构建、运行一个成功的 OpenStack 云计算的[演讲][5]。 +* 任何云管理员都应该担心安全问题。但你从哪里开始?Naveen Joy 发布了一个很好的十个安全问题的[清单][6],用于加固你的 OpenStack 网络;你可以在上个月的同一主题演讲中查看[这个视频][7]。 +* OpenStack 中的内部消息服务在一个公共库中进行管理,该库存在于一个称为 Oslo 的项目中,自然它被称为 Oslo.Messenging。要了解这个库的基础知识,它在这个分为[两个][8][部分][9]的博客中提到。 -* 上个月在波士顿举办的 OpenStack 峰会的[视频][4]已经有了,无论你是否参加过上个月的活动,这都包含了技术和非技术专题的宝库。不知道从哪里开始?这有个来自 Julio Villarreal Pelegrino 关于如何规划、构建、运行一个成功的 OpenStack 云计算的[演讲][5]。 - -* 任何云管理员都应该担心安全问题。但你从哪里开始?Naveen Joy 发布了一个很好的十个安全问题的[清单][6],用于加固你的 OpenStack 网络;你可以在上个月的同一主题演讲中查看[这个视频][7]。 - -* OpenStack 中的内部消息服务在一个公共库中进行管理,该库存在于一个称为 Oslo 的项目中,不令人惊讶地它被称为 Oslo.Messenging。要了解这个库的基础知识,它在这个分为[ 2 个][8][部分][9]的博客中提到。 - -* * * - -想要了解更多?请务必从有三年以上社区生成的内容中查看我们完整的 [OpenStack 指南、如何做和教程][14],以帮助你学习成为一名高效的 OpenStack 开发人员或管理员。 +想要了解更多?可以从这三年来社区说提供的内容中找到我们完整的 [OpenStack 指南、如何做和教程][14],以帮助你学习成为一名高效的 OpenStack 开发人员或管理员。 有很棒教程、指导或者如何做需要我们分享的么?在下面的评论中分享。 + +(图片来源:opensource.com) -------------------------------------------------------------------------------- @@ -41,9 +33,9 @@ Jason Baker - Jason 热衷于使用技术使世界更加开放,从软件开发 via: https://opensource.com/article/17/6/openstack-guides-and-tutorials -作者:[ Jason Baker (Red Hat)][a] +作者:[Jason Baker][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/) 荣誉推出 From 74020313dfcbded915650f3ffc79d834905a63a0 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 25 Jul 2017 01:01:28 +0800 Subject: [PATCH 0755/1407] PRF&PUB:20170712 How to use a man page Faster than a Google search.md @toyijiu --- ... a man page Faster than a Google search.md | 126 +++++++++++++++ ... a man page Faster than a Google search.md | 143 ------------------ 2 files changed, 126 insertions(+), 143 deletions(-) create mode 100644 published/20170712 How to use a man page Faster than a Google search.md delete mode 100644 translated/tech/20170712 How to use a man page Faster than a Google search.md diff --git a/published/20170712 How to use a man page Faster than a Google search.md b/published/20170712 How to use a man page Faster than a Google search.md new file mode 100644 index 0000000000..9cc837e761 --- /dev/null +++ b/published/20170712 How to use a man page Faster than a Google search.md @@ -0,0 +1,126 @@ +教你如何比谷歌搜索更快速有效地利用 man +============================================================ + +> Linux 的帮助手册其实拥有很多有用的信息,而且比你想象中更容易使用 + +![How to use a man page: Faster than a Google search](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/yearbook-haff-rx-linux-file-lead_0.png?itok=48iDNoH8 "How to use a man page: Faster than a Google search") + +我们通常通过 google 来查询 Linux 中的命令说明,但是其实还有一个更好的办法:那就是通过 Linux 自带的 **man 帮助页**来查询命令详尽完整的使用说明。 + +man 页面的历史本身比 Linux 还长,可以追溯到 Unix 早期那个年代。 通过[这个 Wikipedia][9] 可以知道,Dennis Ritchie 和 Ken Thompson 在 1971 年写了第一个 man 帮助页,那个年代的计算器使用的还是像烤箱一样的计算机,个人电脑还未出世。man 帮助页也有它自己的一套设计精炼的语法,和 Unix 与 Linux 一样,man 帮助页也不是一成不变的,它就像 Linux 内核一样不停地发展更新。 + +Man 帮助页通过数字标识符来分成不同类型的内容: + +1. 一般用户命令 +2. 系统调用命令 +3. 库函数 +4. 特殊的文件和驱动程序 +5. 文件格式 +6. 游戏和屏保 +7. 杂项 +8. 系统管理命令和守护进程 + +尽管如此,用户一般也不需要知道他们想查询的命令是属于哪一个类型的。 + +这些文件格式化的方式在当今许多用户看来有点古怪。因为最开始他们是用 **trooff** 的方式,通过 PostScript 打印机来打印,所以包含了头部和布局方面的格式化信息。在 Linux 中,取而代之使用了一种叫做 [groff][10] 的方法。 + +在我的 Fedora 系统中,man 帮助页相关的文件存储在 `/usr/share/man` 下的子目录中(比如 `man1` 存储第一部分的命令),还有进一步的子目录用于存储 man 帮助页的翻译。 + +如果你在 Shell 中查找 `man` 命令的 man 帮助页,你时间看到将是 gzip 工具压缩的 `man.1.gz` 文件。想要查询 man 帮助页,需要输入类似如下命令: + +``` +man man +``` + +这个例子会显示 `man` 命令的 man 帮助页,这将先解压 man 帮助页文件,然后解释格式化指令并用 `less` 显示结果,所以导航操作和在 `less` 中一样。 + +所有的 man 帮助页都应该显示这些子段落:**Name**、 **Synopsis**、 **Description**、**Examples**、**See**、**Also**。有些还会添加一些额外的子段落,比如 **Options**、 **Exit**、**Status**、 **Environment**、**Bugs**、**Files**、**Author**、**Reporting**、**Bugs**、**History**、**Copyright**。 + +### 详细说明一个 man 帮助页 + +为了更详细地介绍一个典型的 man 帮助页,就用 [ls][12] 命令的帮助页来分析吧,在 **Name** 分段下,我们可以看到如下内容: + +``` +ls - list directory contents +``` + +它会简要地告诉我 `ls` 这条命令的作用. + +在 `Synopsis` 分段下,我们可以看到如下的内容: + +``` +ls [OPTION]... [FILE]… +``` + +任何在中括号中的元素都是可选的。你可以只输入 `ls` 命令,后面不接任何参数。参数后面的省略号表示你可以添加任意多个彼此兼容的参数,以及许多文件名。对于 `[FILE]` 参数,你可以指定具体的目录名,或者可以使用通配符 `*`,比如这个例子,它会显示 `Documents` 文件夹下的 `.txt` 文件: + +``` +ls Documents/*.txt +``` + +在 **Description** 分段下, 我们可以看到关于这条命令更加详细的信息,还有关于这条命令各个参数作用的详细介绍的列表,比如说 `ls` 命令第一个选项 `-a` 参数,它的作用是显示包括隐藏文件/目录在内的所有文件: + +``` +-a, --all +``` + +如果我们想用这些参数,要么用它们的别名,比如 `-a`,要么用它们的全名,比如 `--all`(两条中划线)。然而并不是所有参数都有全名和别名(比如 `--author` 只有一种),而且两者的名字并不总是相互关联的(`-F` 和 `--classify`)。当你想用多个参数时,要么以空格隔开,要么共用一个连字符 `-`,在连字符后连续输入你需要的参数(不要添加空格)。比如下面两个等价的例子: + +``` +ls -a -d -l +``` + +``` +ls -adl +``` + +但是 `tar` 这个命令有些例外,由于一些历史遗留原因,当参数使用别名时可以不用添加连字符 `-`,因此以下两种命令都是合法的: + +``` +tar -cvf filearchive.tar thisdirectory/ + +tar cvf filearchive.tar thisdirectory/ +``` + +**ls** 的 **Description** 分段后是 **Author**、**Reporting Bugs**、**Copyright**、 **See Also** 等分段。 + +**See Also** 分段会提供一些相关的 man 帮助页,没事的话可以看看。毕竟除了命令外还有许多其他类型的 man 帮助页。 + +有一些命令不是系统命令,而是 Bash 特有的,比如 `alias` 和 `cd`。这些 Bash 特有的命令可以在 **BASH_BUILTINS** man 帮助页中查看,和上面的比起来它们的描述更加精炼,不过内容都是类似的。 + +其实通过 man 帮助页让你可以获得大量有用的信息,特别是当你想用一个已经很久没用过的命令,需要复习下这条命令的作用时。这个时候 man 帮助页饱受非议的简洁性反而对你来说是更好的。 + +(题图: [Internet Archive Book Images][8]. 修改自 Opensource.com. CC BY-SA 4.0) + +-------------------------------------------------------------------------------- + +作者简介: + +Greg Pittman - Greg 是住在肯塔基州路易斯维尔的一位退休神经学家,但是却对计算机和编程保持着长久的兴趣,从十九世纪六十年代就开始捣腾 Fortran IV 了。随着 Linux 和开源软件的到来,更加激起了他去学习的兴趣并投身于这项事业中,并成为 Scribus 组织的一员。 + +------- + +via: https://opensource.com/article/17/7/using-man-pages + +作者:[Greg Pittman][a] +译者:[吴霄/toyijiu](https://github.com/toyijiu) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/greg-p +[1]:https://opensource.com/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[6]:https://opensource.com/article/17/7/using-man-pages?rate=W0QImEyJK1b4qSGof6I3agtPeTpPQXkaSekp_bI_Rno +[7]:https://opensource.com/user/30666/feed +[8]:https://www.flickr.com/photos/internetarchivebookimages/14803082483/in/photolist-oy6EG4-pZR3NZ-i6r3NW-e1tJSX-boBtf7-oeYc7U-o6jFKK-9jNtc3-idt2G9-i7NG1m-ouKjXe-owqviF-92xFBg-ow9e4s-gVVXJN-i1K8Pw-4jybMo-i1rsBr-ouo58Y-ouPRzz-8cGJHK-85Evdk-cru4Ly-rcDWiP-gnaC5B-pAFsuf-hRFPcZ-odvBMz-hRCE7b-mZN3Kt-odHU5a-73dpPp-hUaaAi-owvUMK-otbp7Q-ouySkB-hYAgmJ-owo4UZ-giHgqu-giHpNc-idd9uQ-osAhcf-7vxk63-7vwN65-fQejmk-pTcLgA-otZcmj-fj1aSX-hRzHQk-oyeZfR +[9]:https://en.wikipedia.org/wiki/Man_page +[10]:https://en.wikipedia.org/wiki/Groff_(software) +[11]:https://en.wikipedia.org/wiki/Less_(Unix) +[12]:http://linuxcommand.org/man_pages/ls1.html +[13]:https://opensource.com/users/greg-p +[14]:https://opensource.com/users/greg-p +[15]:https://opensource.com/article/17/7/using-man-pages#comments diff --git a/translated/tech/20170712 How to use a man page Faster than a Google search.md b/translated/tech/20170712 How to use a man page Faster than a Google search.md deleted file mode 100644 index 0ab5460fb0..0000000000 --- a/translated/tech/20170712 How to use a man page Faster than a Google search.md +++ /dev/null @@ -1,143 +0,0 @@ -教你如何更快速有效地利用man来代替google索引 -============================================================ - -### Linux 的 manual page其实拥有很多有用的信息,而且比你想象中更容易使用 - -![How to use a man page: Faster than a Google search](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/yearbook-haff-rx-linux-file-lead_0.png?itok=48iDNoH8 "How to use a man page: Faster than a Google search") -照片来源于 :  - -[Internet Archive Book Images][8]. 修改自 Opensource.com. CC BY-SA 4.0 - -我们通常通过 google 索引来查询 Linux 中的指令说明,但是其实还有一个更好的办法:那就是通过 Linux 自带的 **man pages**(manual pages 的缩写) 来查询指令详尽完整的使用说明。 - - -man pages 的历史本身比 Linux 还长,可以追溯到 Unix 早期那个年代。 通过[这个 Wikipedia][9]可以知道,Dennis Ritchie 和 Ken Thompson 在 1971 年写了第一个 man pages,那个年代的计算员使用的还是像烤箱一样的计算机,个人电脑还未出世。man pages 也有它自己的一套设计精炼的语法,和 Unix 与 Linux 一样,man pages 也不是一成不变的,它就像 Linux 内核一样不停地发展更新。 - -Man pages 通过数字标识符来分成不同类型的内容: - -1. 一般用户指令 - -2. 系统调用指令 - -3. 库函数 - -4. 特殊的文件和驱动程序 - -5. 文档格式 - -6. 游戏和屏保 - -7. Miscellanea - -8. 系统管理指令和守护进程 - -尽管如此,用户一般也不需要知道他们想查询的指令是属于哪一个类型的。 - -这些文件格式化的方式在当今许多用户看来有点古怪。因为最开始他们是用**trooff** 的方式,通过 PostScript 打印机来打印,所以包含了头部和布局方面的格式化信息。在 Linux 中,取而代之使用了一种叫做[**groff**][10]的方法。 - -在我的 Fedora 系统中,man pages 相关的文件存储在 **/usr/share/man** 目录下,根据文件类型分别存储在类似于 man1(man1 就是存储一般用户指令) 的子目录中。 - -如果你在 Shell 中输入 man 查询 man page,你查到的将是 **gzip** 格式压缩的 **man.1.gz** 文件,想要查询 man page 的话,需要输入如下指令: - -``` -man man -``` - -这个例子会显示 **man** 的 man page,先解压 man page 文件,然后解释这条指令并显示在 Shell 上,也可以输入 **man less**,两者的效果是一样的。 - -所有的 man pages 都应该显示这些分段消息:**Name**, **Synopsis**, **Description**,**Examples**,**See**,**Also**. 有些还会添加一些额外的分段消息,比如 **Options**, **Exit** **Status**, **Environment**, **Bugs**, **Files**, **Author**, **Reporting** **Bugs**, **History**,**Copyright**。 - -### 详细说明一个 man page - -为了更详细地介绍一个典型的 man page,就用 [**ls**][12] 指令来分析吧,在 **Name** 分段下,我们可以看到如下内容: - -``` -ls - list directory contents -``` - -它会简要地告诉我 **ls** 这条指令的作用. - -在 **Synopsis** 分段下,我们可以看到如下的内容: - -``` -ls [OPTION]... [FILE]… -``` - -任何在中括号中的元素都是可选的。你可以只输入 **ls** 指令,后面不接任何参数。参数后面的省略号表示你可以添加任意多个合法兼容的参数和文件名。对于 [FILE] 参数,你可以指定具体的文件夹名,或者可以使用通配符 *****,比如这个例子,它会显示 Documents 文件夹下的 .txt 文件: - -``` -ls Documents/*.txt -``` - -在 **Description** 分段下, 我们可以看到关于这条指令更加详细的信息,还有一列关于这条指令各个参数作用的详细介绍,比如说 **ls** 指令的 **-a** 参数,它的作用是显示包括隐藏文件/目录在内的所有文件: - -``` --a, --all -``` - -如果我们想用这些参数,要么用他们的别名,比如 **-a** ,要么用他们的全名,比如 **--all**(两条中划线)。然而并不是所有参数都有全名和别名(比如 **--author** 只有一种),而且两者的名字并不总是相互关联的(-**F, --classify**)。当你想用多条参数时,要么以空格隔开,要么共用一个连字符**-**,在连字符后连续输入你需要的参数(不要添加空格)。比如下面两个等价的例子: - -``` -ls -a -d -l -``` - -``` -ls -adl -``` - -但是 **tar** 这个指令有些例外,由于一些历史遗留原因,当参数使用别名时可以不用添加连字符**-**,因此以下两种命令都是合法的: - -``` -tar -cvf filearchive.tar thisdirectory/ -``` - - -``` -tar cvf filearchive.tar thisdirectory/ -``` - -**ls** 的 **Description** 分段后是 **Author**,**Reporting Bugs**,**Copyright**, **See Also** 字段。 - -**See Also** 字段会提供一些相关的 man pages, 没事的话可以看看. 毕竟除了指令外还有许多其他类型的 man pages。 - -这里有一些参考链接: -- [Linux 是什么](1) -- [Linux 容器是什么](2) -- [快下载吧:这里有Linux 命令小抄](3) -- [比楼上更高级的 Linux 命令小抄](4) -- [我们最新的 Linux 相关文章](5) - - -有一些指令不是系统指令,而是 Bash 特有的,比如 **alias** 和 **cd**。这些 Bash 特有的指令可以在 **BASH_BUILTINS** man page 中查看,和上面的比起来他们的描述更加精炼,不过内容都是类似的。 - -其实通过 man pages 你可以获得大量有用的信息,特别是当你想用一个已经很久没用过的指令,需要复习下这条指令的作用时。这个时候 man pages 饱受非议的简洁性反而对你来说是更好的。 - --------------------------------------------------------------------------------- - -作者简介: -Greg Pittman - Greg 是住在肯塔基州路易斯维尔的一位退休神经学家,但是却对计算机和编程保持着长久的兴趣,从十九世纪六十年代就开始捣腾 Fortran IV 了。随着 Linux 和开源软件的到来,更加激起了他去学习的兴趣并投身于这项事业中,并成为 Scribus 组织的一员。 - -via: https://opensource.com/article/17/7/using-man-pages - -作者:[ Greg Pittman ][a] -译者:[吴霄/toyijiu](https://github.com/toyijiu) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/greg-p -[1]:https://opensource.com/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[6]:https://opensource.com/article/17/7/using-man-pages?rate=W0QImEyJK1b4qSGof6I3agtPeTpPQXkaSekp_bI_Rno -[7]:https://opensource.com/user/30666/feed -[8]:https://www.flickr.com/photos/internetarchivebookimages/14803082483/in/photolist-oy6EG4-pZR3NZ-i6r3NW-e1tJSX-boBtf7-oeYc7U-o6jFKK-9jNtc3-idt2G9-i7NG1m-ouKjXe-owqviF-92xFBg-ow9e4s-gVVXJN-i1K8Pw-4jybMo-i1rsBr-ouo58Y-ouPRzz-8cGJHK-85Evdk-cru4Ly-rcDWiP-gnaC5B-pAFsuf-hRFPcZ-odvBMz-hRCE7b-mZN3Kt-odHU5a-73dpPp-hUaaAi-owvUMK-otbp7Q-ouySkB-hYAgmJ-owo4UZ-giHgqu-giHpNc-idd9uQ-osAhcf-7vxk63-7vwN65-fQejmk-pTcLgA-otZcmj-fj1aSX-hRzHQk-oyeZfR -[9]:https://en.wikipedia.org/wiki/Man_page -[10]:https://en.wikipedia.org/wiki/Groff_(software) -[11]:https://en.wikipedia.org/wiki/Less_(Unix) -[12]:http://linuxcommand.org/man_pages/ls1.html -[13]:https://opensource.com/users/greg-p -[14]:https://opensource.com/users/greg-p -[15]:https://opensource.com/article/17/7/using-man-pages#comments From 0c7b2d1b947efc027d30f49ecaebdff90d2ad054 Mon Sep 17 00:00:00 2001 From: toyijiu <309378714@qq.com> Date: Tue, 25 Jul 2017 08:46:31 +0900 Subject: [PATCH 0756/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E4=B8=AD-WuXiao(to?= =?UTF-8?q?yijiu)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sources/talk/20170320 Education of a Programmer.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/talk/20170320 Education of a Programmer.md b/sources/talk/20170320 Education of a Programmer.md index 5690c0fd5c..5672a26b38 100644 --- a/sources/talk/20170320 Education of a Programmer.md +++ b/sources/talk/20170320 Education of a Programmer.md @@ -1,3 +1,5 @@ +翻译中 by WuXiao(toyijiu) + Education of a Programmer ============================================================ From 72dc8509a860049c40fd7d8fe4cd2038dfaac7d6 Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 25 Jul 2017 08:39:14 +0800 Subject: [PATCH 0757/1407] translated --- ...damentals of graph databases with Neo4j.md | 87 ------------------- ...damentals of graph databases with Neo4j.md | 84 ++++++++++++++++++ 2 files changed, 84 insertions(+), 87 deletions(-) delete mode 100644 sources/tech/20170713 Fundamentals of graph databases with Neo4j.md create mode 100644 translated/tech/20170713 Fundamentals of graph databases with Neo4j.md diff --git a/sources/tech/20170713 Fundamentals of graph databases with Neo4j.md b/sources/tech/20170713 Fundamentals of graph databases with Neo4j.md deleted file mode 100644 index 655083d4be..0000000000 --- a/sources/tech/20170713 Fundamentals of graph databases with Neo4j.md +++ /dev/null @@ -1,87 +0,0 @@ -translating-----geekpi - -Fundamentals of graph databases with Neo4j -============================================================ - -### In the first of a three-part series, learn the basics of graph databases, which power some of the largest data pools on the planet. - - -![Fundamentals of graph databases with Neo4j](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/grasshopper_graph_lead.jpg?itok=X5QPAGYh "Fundamentals of graph databases with Neo4j") -Image credits :  - -Modified by Jen Wike Huger, CC BY-SA - -For very large collections of diverse, unstructured information, graph databases have emerged as a technology to help collect, manage, and search large sets of data. In this three-part series, we'll explore graph databases, using [Neo4j][9], an open source graph database. - -In this article, I'll show you the basics of graph databases, bringing you up to speed on the conceptual model. In the second, I'll show you how to spin up a Neo4j database and populate it with some data using the built-in browser tools. And, in the third and final article in the series, we'll explore a couple of programming libraries for using Neo4j in your development work. - -Grasping the conceptual model for graph databases is useful, so we'll start there. A graph database has only two kinds of data stored in it:  _nodes_  and  _edges_ . - -* **Nodes are entities:** things such as people, invoices, movies, books, or other concrete things. These are somewhat equivalent to a record or row in a relational database. - -* **Edges name relationships:** the concepts, events, or things that connect nodes. In relational databases, these relationships are ordinarily stored in the database rows with a linking field. In graph databases, they are themselves useful, searchable objects in their own right. - -Both nodes and edges can possess searchable  _properties_ . For instance, if your nodes represented people, they might own properties like name, gender, date of birth, height, and so forth. Edge properties might describe when a relationship between two people was established, the circumstances of meeting, or the nature of the relationship. - -Here's a diagram to help you visualize this: - -### [article_1_image_1.jpg][5] - -![Graph database image 1](https://opensource.com/sites/default/files/u128651/article_1_image_1.jpg "Graph database image 1") - -In this diagram, you learn that Jane Doe has a new husband, John; a daughter (from her prior relationship) Mary Smith; and friends Robert and Rhonda Roe. The Roes have a son, Ryan, who is dating Mary Smith. - -See how it works? Each node represents a person, standing alone, in isolation from other nodes. Everything you need to find about  _that_  person can be stored in the node's properties. Edges describe the relationships between the people, with as much detail as you need for the application. - -Relationships are one-way and cannot be undirected, but that's no problem. Since the database can traverse both directions with the same speed, and direction can be ignored, you only need to define this relationship once. If your application requires directional relationships, you're free to use them, but if bidirectionality is implied, it's not required. - -Programming and development - -* [New Python content][1] - -* [Our latest JavaScript articles][2] - -* [Recent Perl posts][3] - -* [Red Hat Developers Blog][4] - -Another thing to notice is that graph databases are, by nature, schema-less. This differs from a relational database, where each row has a set list of fields, and adding new fields is a major investment in development and upgrades. - -Each node can possess a  _label_ ; this label is all the "typing" you need for most applications and is the analog of the table name in a typical relational database. A label lets you differentiate between different node types. If you need to add a new label or property, change your application to start using it! - -With graph databases, you can simply start using the new properties and labels, and nodes will acquire them as they are created or edited. There's no need to convert things; just start using them in your code. In the example here, you can see that we know Jane's and Mary's favorite colors and Mary's date of birth, but not anyone else's. The system doesn't need to know about that; users can add that information at will as nodes are accessed in the normal course of the application's usage. - -As a developer, this is a useful thing. Instead of having to handle the database schema changes, you can just add the new label or property to forms that deal with the nodes and start using it. For nodes that don't have the property, nothing is displayed. You'd have to code the form with either type of database, but you drop a lot of the backend work that you'd need to do with a relational database. - -Let's add some new information: - -### [article_1_image_2.jpg][6] - -![Graph database image 2, defining a new type of node](https://opensource.com/sites/default/files/u128651/article_1_image_2.jpg "Graph database image 2, defining a new type of node") - -Here is a new type of node, representing a location, and some relevant relationships. Now we see that John Doe was born in Petaluma, Calif., while his wife, Jane, was born in Grand Prairie, Texas. They both now live in Cypress, Texas, because Jane works in nearby Houston. The lack of city relationships with Ryan Roe isn't any big deal to the database, we just  _don't know_  that information yet. The database could easily acquire new data and add it, creating new nodes and relationships as needed, as application users entered more data. - -Understanding nodes and edges should be enough to get you started with graph databases. If you're like me, you're already thinking about how an application you work on might be restructured in a graph. In the next article in this series, I'll show you how to install Neo4j, insert data, and do some basic searching. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/17/7/fundamentals-graph-databases-neo4j - -作者:[Ruth Holloway ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/druthb -[1]:https://opensource.com/tags/python?src=programming_resource_menu1 -[2]:https://opensource.com/tags/javascript?src=programming_resource_menu2 -[3]:https://opensource.com/tags/perl?src=programming_resource_menu3 -[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu4 -[5]:https://opensource.com/file/363056 -[6]:https://opensource.com/file/363061 -[7]:https://opensource.com/article/17/7/fundamentals-graph-databases-neo4j?rate=QlLa3Y_1alHoy77MX2w69IZN5nYBJZrkZ0b2F_0wH_A -[8]:https://opensource.com/user/36051/feed -[9]:https://neo4j.com/ -[10]:https://opensource.com/users/druthb -[11]:https://opensource.com/users/druthb diff --git a/translated/tech/20170713 Fundamentals of graph databases with Neo4j.md b/translated/tech/20170713 Fundamentals of graph databases with Neo4j.md new file mode 100644 index 0000000000..726c807845 --- /dev/null +++ b/translated/tech/20170713 Fundamentals of graph databases with Neo4j.md @@ -0,0 +1,84 @@ +Neo4j 图数据库的基础 +============================================================ + +### 在共三部的第一部分中,我们将学习图形数据库的基础知识,它为这地球上最大的一些数据库提供支持。 + +![Fundamentals of graph databases with Neo4j](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/grasshopper_graph_lead.jpg?itok=X5QPAGYh "Fundamentals of graph databases with Neo4j") +图片来源:  + +由 Jen Wike Huger 修改,CC BY-SA + +对于非常大量的各种非结构化信息,图数据库已经成为帮助收集、管理和搜索大量数据的技术。在这三部分系列中,我们将使用 [Neo4j][9],一个开源图数据库来研究图数据库。 + +在本文中,我将向你展示图数据库的基础知识,帮助你快速了解概念模型。第二,我将向你展示如何启动 Neo4j 数据库,并使用内置的浏览器工具填充一些数据。而且,在本系列的最后一篇文章中,我们将探讨一些在开发工作中使用 Neo4j 的编程库。 + +掌握图数据库的概念模型是有用的,所以我们从那里开始。图数据库中只存储两种数据:_节点_和_边_。 + +* **节点是实体:**诸如人物、发票、电影、书籍或其他具体事物。这些有些等同于关系数据库中的记录或行。 + +* **边名关系:**连接节点的概念、事件或事物。在关系数据库中,这些关系通常存储在具有链接字段的数据库行中。在图形数据库中,它们本身就是有用的,可搜索的对象。 + +节点和边都可以拥有可搜索的_属性_。例如,如果你的节点代表人,他们可能拥有名字、性别、出生日期、身高等属性。边属性可能描述了两个人之间的关系何时建立,见面的情况或关系的性质。 + +这是一个帮助你可视化的图表: + +### [article_1_image_1.jpg][5] + +![Graph database image 1](https://opensource.com/sites/default/files/u128651/article_1_image_1.jpg "Graph database image 1") + +在这张图中,你知道 Jane Doe 有一个新的丈夫 John;一个女儿(从她以前的关系)Mary Smith 和朋友 Robert 和 Rhonda Roe。Roes 有一个儿子 Ryan,他正在与 Mary Smith 约会。 + +看看它怎么工作?每个节点代表一个独立于其他节点的人。你需要找到关于_那个_ 人的一切都可以存储在节点的属性中。边描述了人们之间的关系,这与你在程序中需要的一样多。 + +关系是单向的,且不能无向,但这没有问题。由于数据库可以以相同的速度遍历两个方向,并且方向可以忽略,你只需要定义一次此关系。如果你的程序需要定向关系,则可以自由使用它们,但如果双向性是暗含的,则不需要。 + +编程与开发 + +* [新的 Python 内容][1] + +* [我们最新的 JavaScript 文章][2] + +* [最近的 Perl 帖子][3] + +* [红帽开发者博客][4] + +另外需要注意的是,图数据库本质上是无 schema 的。这与关系数据库不同,每行都有一组列表,并且添加新的字段是开发和升级的主要工作。 + +每个节点都可以拥有一个_标签_;这个标签是大多数程序你需要“输入”的,是典型关系数据库中表名的模拟。标签可以让你区分不同的节点类型。如果你需要添加新的标签或属性,请更改你的程序来开始使用! + +使用图数据库,你可以直接开始使用新的属性和标签,节点将在创建或编辑时获取它们。没有必要去转换东西;只需开始在你的代码中使用它们。在这里的例子中,你可以看到,我们知道 Jane 和 Mary 最喜欢的颜色和 Mary 的出生日期,但是别人没有。这个系统不需要知道它;用户可以在程序使用中随意访问节点,添加任意信息。 + +作为一名开发人员,这是一个有用的特性。你可以将新的标签或属性添加到由节点处理的表单中并开始使用它,而不必进行数据库 schema 修改。对于没有属性的节点,将不显示任何内容。你需要使用任一类型的数据库对表单进行编码,但是你可以放下在关系型数据库中要进行的后端工作了。 + +让我们添加一些新的信息: + +### [article_1_image_2.jpg][6] + +![Graph database image 2, defining a new type of node](https://opensource.com/sites/default/files/u128651/article_1_image_2.jpg "Graph database image 2, defining a new type of node") + +这是一个新的节点类型,它代表一个位置,以及一些相关关系。现在我们看到 John Doe 出生在加利福尼亚州的 Petaluma,而他的妻子 Jane 则出生在德克萨斯州的 Grand Prairie。 他们现在住在得克萨斯州的赛普拉斯,因为 Jane 在附近的休斯顿工作。Ryan Roe 缺乏城市关系对数据库来说没有什么大不了的事情,我们_不知道_那些信息。当用户输入更多数据时,数据库可以轻松获取新数据并添加新数据,根据需要创建新的节点和关系。 + +了解节点和边应该足以让你开始使用图形数据库。如果你像我一样,你已经在考虑如何在一个图中重组你的程序。在本系列的下一篇文章中,我将向你展示如何安装 Neo4j、插入数据,并进行一些基本的搜索。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/17/7/fundamentals-graph-databases-neo4j + +作者:[Ruth Holloway ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/druthb +[1]:https://opensource.com/tags/python?src=programming_resource_menu1 +[2]:https://opensource.com/tags/javascript?src=programming_resource_menu2 +[3]:https://opensource.com/tags/perl?src=programming_resource_menu3 +[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu4 +[5]:https://opensource.com/file/363056 +[6]:https://opensource.com/file/363061 +[7]:https://opensource.com/article/17/7/fundamentals-graph-databases-neo4j?rate=QlLa3Y_1alHoy77MX2w69IZN5nYBJZrkZ0b2F_0wH_A +[8]:https://opensource.com/user/36051/feed +[9]:https://neo4j.com/ +[10]:https://opensource.com/users/druthb +[11]:https://opensource.com/users/druthb From 1517f4cf974650db5ec2d12a7c16dad85bedaf63 Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 25 Jul 2017 08:44:32 +0800 Subject: [PATCH 0758/1407] translated --- .../20170624 Writing a Linux Debugger Part 8 Stack unwinding.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170624 Writing a Linux Debugger Part 8 Stack unwinding.md b/sources/tech/20170624 Writing a Linux Debugger Part 8 Stack unwinding.md index 5196548f3a..654bddc6b1 100644 --- a/sources/tech/20170624 Writing a Linux Debugger Part 8 Stack unwinding.md +++ b/sources/tech/20170624 Writing a Linux Debugger Part 8 Stack unwinding.md @@ -1,3 +1,5 @@ +translating---geekpi + Writing a Linux Debugger Part 8: Stack unwinding ============================================================ From 4ceeb3c4d83b2f7f16cfcfeabfbb8598e0a67452 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 25 Jul 2017 17:07:41 +0800 Subject: [PATCH 0759/1407] PRF:20170119 The Many the Humble the Ubuntu Users.md @svtter --- ...19 The Many the Humble the Ubuntu Users.md | 37 ++++++++++--------- 1 file changed, 20 insertions(+), 17 deletions(-) diff --git a/translated/talk/20170119 The Many the Humble the Ubuntu Users.md b/translated/talk/20170119 The Many the Humble the Ubuntu Users.md index c53b1c7d34..9fed5d4888 100644 --- a/translated/talk/20170119 The Many the Humble the Ubuntu Users.md +++ b/translated/talk/20170119 The Many the Humble the Ubuntu Users.md @@ -1,32 +1,35 @@ -# 多数的,低下的Ubuntu用户 +那些乌央乌央的、普普通通的 Ubuntu 用户们 +============ -#### “更好的捕鼠器“不是一个合格生物学家的专用谚语。就像Ubuntu,尽管带有一点小问题,但它仅仅需要非常优秀的做好它的工作。 +> “更好的捕鼠器“ 并不是一个合格生物学家的专用谚语。就像 Ubuntu,它只需要好好工作,而不会让我惊着。 -### Roblimo的藏身处 +(LCTT 译注,“做个更好的捕鼠器”是个国外的谚语,意指不断有人发明更好的捕鼠器,然而其实没什么大的意义。) -我已经很久不是一个擅长于计算机的人了。事实上,我在网上第一次获得小有名气是在写一个星期专栏的时候,这个专栏的名字是“这台老电脑”。它描述的是一台古老的设备能够做什么——通常在上面安装Linux——在那之后,我又在Andover.net上开设了一个相同的专栏,名字叫做“平价计算”,是关于如何在这个世界省钱的——在这个大部分在线计算机专栏都让你花钱花到你没钱吃饭的世界里(译者注:作者的意思是“我算是一股清流了”)。 +### Roblimo 的藏身处 -据我所知的那些大部分的Linux的早期使用者,都痴迷于他们的电脑,还有那些让他们电脑有用的软件。他们乐于仔细研读源代码并且做出一点小小的修改。最关键的是,他们是计算科学的学生,或者从事IT行业的人们。他们的计算机和计算机网络迷住了他们,就像是他们本来应该成为的样子。 +我从来就不是一个计算机极客。事实上,我在网上第一次小有名气是为 Time/Life 写一个每周专栏的时候,这个专栏的名字是“这台老电脑”。它介绍的是一台古老的设备能够做什么——通常是在上面安装 Linux——在那之后,我又在Andover.net 上开设了一个相同的专栏,名字叫做“廉价计算”,是关于如何在这个世界省钱的——而其它那些大部分在线计算机专栏都是在让你花钱花到你没饭吃(LCTT 译者注:作者的意思是“我算是一股清流了”)。 -我是(现在也是)一个写作者,不是一个从事计算机科学的家伙。对于我而言,计算机一直以来都是一个工具。我希望他们能够老老实实的,直到我让它们去做点什么,然后按照我的意思去做,最好只有一点点小问题,不至于让我烦躁。我喜欢图形化界面,因为我没有足够的时间去记忆很长的命令行来管理我的电脑和网络。当然,我是有能力使用命令行的,但是我更愿意站在海滩上,不沉浸在命令行的海洋里。 +据我所知的那些大部分的 Linux 的早期使用者,都痴迷于他们的电脑,还有那些让他们电脑有用的软件。他们乐于仔细研读源代码并且做出一点小小的修改。最关键的是,他们大多是学计算机的,或者是从事 IT 行业的。他们的计算机和计算机网络迷住了他们,就像他们本该那样似的。 -有一段时间啊,在Linux这个圈子里,仁慈的用户太少了。“你什么意思?你仅仅是想要你的电脑去书写文章,或者可能增加一点点HTML到里面吗?“开发者和管理员这样询问道,好像所有除了编写代码的其他领域的奉献者们都不如他们所贡献的。 +我过去是(现在也是)一个作者,不是一个搞计算机的。于我而言,计算机一直都只是一个工具而已。我希望它们能够老老实实的听话,我让它们做啥就做啥,最多可以出一点点小毛病。我喜欢图形化界面,因为我记不住那么长的命令行来管理我的电脑和网络。当然,我能找到它们,也能输入它们,但是我可不想费劲。 -但是尽管面临这些讥笑和嘲讽,我在一次又一次的宣讲和谈话中提出一个像这样的主题:”与其仅仅解决你自己的痛点,为什么不把你朋友的痛点也一起解决了呢?比如与你携同工作的朋友?以及在那些在你最喜欢的饭店工作的朋友们,还有你的医生?难道你不希望你的医生专注于医治病人,而不是在`apt get`以及`grep`心烦意乱?“ +在 Linux 这个圈子里,有那么一段时间用户很少。“你什么意思?你只是想要你的电脑去写点文章,或者最多添加点 HTML 么?”开发者和管理员这样询问道,好像所有除了编写代码之外的奉献者们都不如他们所贡献的。 -所以,是的,因为我希望能够更简单的使用Linux,我是一个[早期的Mandrake用户][1],并且在今天,我是一个快乐的Ubuntu使用者。 +但是尽管面临这些讥笑和嘲讽,我在一次又一次的宣讲和谈话中提出一个像这样的主题:“不要光挠自己的痒痒,也帮你女朋友解决一下啊!还有你的同事,以及那些你最喜欢的饭店的厨子们,还有你的医生。难道你不希望你的医生专注于医治病人,而是在 `apt get` 以及 `grep` 里心烦意乱?“ -为什么是Ubuntu?你一定是在逗我,为什么不是?它是Linux发行版中的丰田凯美瑞(或者本田思域)!平凡的而卓越。它流行到你可以在网络实时聊天,Linux问题,Ubuntu自己的论坛上以及许许多多的地方都发现它的身影。 +所以,是的,因为我希望能够更简单的使用 Linux,我是一个[早期的曼德拉草用户][1],而现在,我是一个快乐的 Ubuntu 使用者。 -当然,使用Debian或者Fedora是很酷的,还有Mint也是一个与众不同的小帅哥。但是我依然感兴趣于写一些故事以及添加一些HTML到故事里,加之在浏览器中阅读,在Google Docs与合作客户修改工作,随时接受我的邮件,用一张过去或者现在的图片做这做那…这些全部都是电脑用户的那点事儿。 +为什么是 Ubuntu?你一定是在逗我?为什么不是呢?它是 Linux 发行版中的丰田凯美瑞(或者本田思域)!平凡而卓越。它是如此的流行,你可以在 IRC、LinuxQuestion 社区、 Ubuntu 自己的论坛,以及许许多多的地方得到帮助。 -当这一切运行的时候,我的桌面什么样子就没有意义了。我不能看见它!它覆盖了整个应用窗口!然后我使用了两个显示器,不仅仅是一个。我有...让我们看看,17个打开的标签页在两个窗口中。并且GIMP在运行,[Bluefish][2],这个我刚才在使用的东西,来书写这篇文章。 +当然,使用 Debian 或者 Fedora 也是很酷的,还有 Mint 也是开箱即用又华丽万分。但是我依然感兴趣于写一些文章和添加一点点 HTML,以及在浏览器中随时看点什么、在 Google Docs 为一两个公司客气写点什么,随时接收我的邮件,用一张过去或者现在的图片做这做那……基本上我就在电脑上干点这些。 -所以对我而言,Ubuntu是我最小的抵抗之路。Mint可能有一点可爱,但是当你使用它的时候去掉它的修饰(就是底部的边栏,译者注),它不就是Ubuntu吗?所以如果我是用一个个相同的程序,我的确,并且不能看见桌面环境,所以谁还在意他长什么样子? +当这一切都正常的时候,我的桌面是什么样子就没有意义了。我又看不见它!它整个被应用窗口覆盖了!然后我使用了两个显示器,不仅仅是一个。我有……让我数数,17 个标签页打开在两个 Chrome 窗口中。并且 GIMP 在运行中,[Bluefish][2],这个我刚才在使用的东西,用来书写这篇文章。 -有些研究表明Mint正在变得更加流行,而有些人说Debian更甚。但是他们的研究中,Ubuntu都是居于最上位的,尽管这一年又一年过去了。 +所以对我而言,Ubuntu 是我的阻力最小的道路。Mint 或许比较可爱,但是当你使用它的时候去掉它的那些边边角角的修饰,它不就是 Ubuntu 吗?所以如果我是用一个个相同的程序,并且不能看见桌面环境,所以谁还在意它长什么样子? -所以称我为大多数人吧!认为我无聊吧!称我为多数的,低下的Ubuntu用户吧——至少从现在开始... +有些研究表明 Mint 正在变得更加流行,而有些人说 Debian 更甚。但是在他们的研究中,Ubuntu 永远都是居于最上位的,尽管这一年又一年过去了。 + +所以称我为大多数人吧!说我乏味吧!称我为乌央乌央的、普普通通的 Ubuntu 用户吧——至少从现在开始…… ------ @@ -34,7 +37,7 @@ ![](http://0.gravatar.com/avatar/f861a631676e6d4d2f4e4de2454f230e?s=80&d=blank&r=pg) -Robin "Roblimo" Miller 是一个自由职业的作者并且是前开源科技组的主编辑。开源科技组,这个公司拥有SourceForge, freshmeat, Linux.com, NewForge, ThinkGeek以及Slashdot, 并且他直到最近依然在Slashdot作为一个视频编辑者。他的博客是Robin ‘Roblimo’ Miller的私人站点。@robinAKAroblimo +Robin "Roblimo" Miller 是一个自由职业作者,并且是开源技术集团的前主编,该公司旗下有 SourceForge、 freshmeat、Linux.com、NewForge、ThinkGeek 以及 Slashdot,并且他直到最近依然在 Slashdot 担任视频编辑。虽然他现在基本上退休了,但他仍然兼任 Grid Dynamics 的社论顾问,而且(显然)在为 FOSS Force 在写文章。 ------ @@ -42,7 +45,7 @@ via: http://fossforce.com/2017/01/many-humble-ubuntu-users/ 作者:[Robin "Roblimo" Miller][a] 译者:[svtter](https://github.com/svtter) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 71d1f94d43f492cb9829567f5c0655e6824f0f02 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 25 Jul 2017 17:07:58 +0800 Subject: [PATCH 0760/1407] PUB:20170119 The Many the Humble the Ubuntu Users.md @svtter --- .../20170119 The Many the Humble the Ubuntu Users.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/talk => published}/20170119 The Many the Humble the Ubuntu Users.md (100%) diff --git a/translated/talk/20170119 The Many the Humble the Ubuntu Users.md b/published/20170119 The Many the Humble the Ubuntu Users.md similarity index 100% rename from translated/talk/20170119 The Many the Humble the Ubuntu Users.md rename to published/20170119 The Many the Humble the Ubuntu Users.md From f541dfcf52d3645793314e5631e9fe4e6baf32bd Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 25 Jul 2017 22:27:16 +0800 Subject: [PATCH 0761/1407] PRF:20170209 The benefits of tracking issues publicly.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @geekpi 很重要的一篇文章,我很受启发 --- ...he benefits of tracking issues publicly.md | 43 ++++++++----------- 1 file changed, 18 insertions(+), 25 deletions(-) diff --git a/translated/tech/20170209 The benefits of tracking issues publicly.md b/translated/tech/20170209 The benefits of tracking issues publicly.md index f28ce1f446..985fab2c66 100644 --- a/translated/tech/20170209 The benefits of tracking issues publicly.md +++ b/translated/tech/20170209 The benefits of tracking issues publicly.md @@ -1,53 +1,46 @@ -公开追踪问题的好处 +开放组织公开追踪问题的好处 ============================================================ -### 在公共组织中,在线追踪问题可以将客户变成同事 +> 在开放组织中,在线追踪问题可以将客户转变成伙伴。 -Posted 09 Feb 2017[Chad Whitacre][20][Feed][19]11[up][5] ![The benefits of tracking issues publicly](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/OSDC_bees_network.png?itok=Ims9tFQS "The benefits of tracking issues publicly") -图片提供: opensource.com -一个公开的问题追踪器是开放组织的重要沟通工具,相对在公开渠道中开展渠道,没有比[透明和包容][6]更好的方法了。因此,让我们来探讨在开放组织中使用问题跟踪器的一些最佳实践。 +一个公开的问题追踪器是开放组织的重要沟通工具,和在公开渠道中开展工作相比,没有比这种方式更[透明和包容][6]的方式了。因此,让我们来探讨一下在开放组织中使用问题跟踪器的一些最佳实践。 -在开始之前,我们先来定义“问题追踪器”的含义。简单地说,问题跟踪器是**一个共享的待办事项列表**。想象一下胡乱写一张待办事项列表:购买面包、邮件打包、归还图书馆书籍。当你在城里开车时,把列表上的每一项划掉都感觉很好。现在,将它扩展到你需要在组织中需要完成的工作,并增加软件协作健康度。这样你就有一个问题追踪器了! +在开始之前,我们先来定义“问题追踪器issue tracker”的含义。简单地说,问题跟踪器是**一个共享的待办事项列表**。想象一下一张胡乱写的待办事项列表:购买面包、邮件打包、归还图书馆书籍。当你在城里开车时,把列表上的每一项划掉的感觉很好。现在,将它扩展到你需要在组织中完成的工作,并增加合适的软件协作能力。这样你就有一个问题追踪器了! -无论你使用的是 GitHub 还是其他的,如 Bitbucket、GitLab 或 Trello,问题跟踪器都是与你的同事进行协调的正确工具。这对将外部人员_变成_同事是至关重要的,这是开放组织的特征之一。这是如何工作的?我很高兴你问了这个问题。 +无论你使用的是 GitHub 还是其他的,如 Bitbucket、GitLab 或 Trello,问题跟踪器都是与你的伙伴进行协调的正确工具。这对将外部人员_变成_伙伴是至关重要的,这是开放组织的特征之一。那么这是如何工作的?我很高兴你问了这个问题。 ### 使用问题追踪器的最佳实践 -使用公共问题跟踪器将外部人员转换为同事的最佳实践是基于过去五年来我们在 [Gratipay][7] 的经验。我们帮助公司和其他为开源支付,我们喜欢使用我们的问题跟踪器与我们的社区合作。这就是我们学到的。 +使用公共问题跟踪器将外部人员转换为伙伴的最佳实践是基于过去五年来我们在 [Gratipay][7] 的经验。我们帮助公司和其他组织为开源买单,我们喜欢使用我们的问题跟踪器与我们的社区合作。这就是我们所学到的。 -**0\. 隐私优先。** 在文章中谈论公共问题追踪器的隐私看上去是一个奇怪的开始。但是我们必须记住,[开放本身并不是目的][8],任何真诚和真正的开放是建立在安全和同意的坚实基础之上的。不要公开发布客户或其他第三方私下给你的信息,除非你明确提出要求并且他们明确同意。采纳一个政策并训练你的人。[这是 Gratipay 的政策][9]供你参考。好的!现在我们明白了,让我们继续吧。 +**0、 隐私优先。** 在这篇文章中谈论公共问题追踪器的隐私看上去是一个奇怪的开始。但是我们必须记住,[开放本身并不是目的][8],任何真诚和真正的开放是建立在安全和认可的坚实基础之上的。不要公开发布客户或其他第三方私下给你的信息,除非你明确提出了要求并且得到了他们的明确同意。采纳一个隐私政策并培训你的人员。[这篇 Gratipay 的政策][9]可供参考。好的!现在这部分清楚之后,让我们继续。 -**1\. 默认公开决定。** 如果你私下做决定,你就会失去运行一个开放组织的好处,比如表达多样化的想法、招募有活力的人才、实现更大的责任感。即使你的全职员工是最初使用你的公共问题跟踪器的唯一员工,那也要这么做。 避免将你的公共问题追踪者视为二等公民。如果你在办公室进行对话,请在公共问题跟踪器上发布摘要,并在完成决定之前让你的社区回复。这是使用问题跟踪器解锁你组织开放权力的第一步:如果它不在问题追踪器中,那就不会发生! +**1、 默认采用公开决策。** 如果你私下做决策,你就会失去运行一个开放组织的好处,比如表达多样化的想法、招募有活力的人才、实现更大的责任感。即使你的全职员工是最初使用你的公共问题跟踪器的唯一员工,那也要这么做。 避免将你的公共问题追踪器视为二等公民。如果你在办公室进行对话,请在公共问题跟踪器上发布摘要,并在最终决策之前给你的社区留出时间来响应。这是使用问题跟踪器解锁你组织开放权力的第一步:如果它不在问题追踪器中,那就没用! -**2\. 关联其他工具。** 我们许多人都喜欢 IRC 和 Slack,这并不是什么秘密。或者你的组织已经使用 Trello,但是你也想开始使用 GitHub。这没问题!在 GitHub issue 中放入 Trello 卡片的链接很容易,反之亦然。交叉关联保证了被一个或者另一个问题困住的外部人员能够发现额外的帮助它们充分理解这个问题的上下文。对于聊天服务,你可能需要配置公共日志记录才能维护连接(隐私注意事项:当你这么做时,请务必在你的频道描述中宣传该事实)。也就是说,你应该在私人 Slack 或其他私人渠道中对话,就像在办公室里面对面的对话一样。换句话说,一定要总结公众问题跟踪器上的对话。看看上面说的:无论离线或在线,如果不在问题跟踪器中,那就没有发生! +**2、 关联其他工具。** 我们许多人都喜欢 IRC 和 Slack,这并不是什么秘密。或者你的组织已经使用 Trello,但是你也想开始使用 GitHub。这没问题!在 GitHub issue 中放入 Trello 卡片的链接很容易,反之亦然。交叉关联保证了被一个或另一个问题困住的外部人员能够发现帮助它们充分理解这个问题的更多相关信息。对于聊天服务,你可能需要配置公共日志记录才能维护关联(隐私注意事项:当你这么做时,请务必在你的频道描述中宣传该事实)。也就是说,你应该在私人 Slack 或其他私人渠道中对话,就像在办公室里面对面的对话一样。换句话说,一定要总结公众问题跟踪器上的对话。看看上面说的:无论离线或在线,如果不在问题跟踪器中,那就没用! -**3\. 将谈话导向追踪器中。** 社交媒体很快就能获得很多反馈,尤其是发现问题,但这不是解决问题的地方。问题跟踪器为深入的对话和根本原因分析留出空间。更重要的是,它们是为了完成任务而优化的,而不是无限拖延。当问题解决后点击“关闭”按钮的感觉真的很好!现在将公共问题跟踪器作为你的主要工作场所,你可以开始邀请在社交媒体上与你接触的外部人员在追踪器中进一步地讨论。简单的如,“感谢您的反馈!听起来类似(链接到公共问题)?” ,这可以在很大程度上向外界传达你的组织没有隐藏的内容,并欢迎他们的参与。 +**3、 将谈话导向追踪器中。** 社交媒体很快就能获得很多反馈,尤其是发现问题,但这不是解决问题的地方。问题跟踪器为深入的对话和分析根本原因留出了空间。更重要的是,它们是为了完成任务而优化的,而不是无限拖延。当问题解决后点击“关闭”按钮的感觉真的很好!现在将公共问题跟踪器作为你的主要工作场所,你可以开始邀请在社交媒体上与你接触的外部人员在追踪器中进一步地讨论。简单的如,“感谢您的反馈!听起来像是(某个公共问题的链接)?” ,这可以在很大程度上向外界传达你的组织没有隐藏的内容,并欢迎他们的参与。 -**4\. 设置一个“元”追踪器。** 在一开始,你的问题追踪器很自然聚焦在_产品_上。当你准备好开放到一个新的水平,考虑设置一个关于你的_组织_本身的问题跟踪。在 Gratipay,我们愿意一个公共的问题追踪器其中,称之为 “Inside Gratipay”,讨论我们组织的任何方面,从[我们的预算][10]到[我们的法律结构][11]到[我们的名字][12]。 是的,这有时有点混乱 - 重命名组织是一个特别激烈的[争议话题][13]!但对我们来说,在社区参与方面的好处是值得的。 +**4、 设置一个“元”追踪器。** 在一开始,你的问题追踪器很自然聚焦在_具体产品_上。当你准备好开放到一个新的水平时,考虑设置一个关于你的_组织_本身的问题跟踪。在 Gratipay,我们有一个称之为 “Inside Gratipay”的公共问题追踪器,我们愿意在其中讨论我们组织的任何方面,从[我们的预算][10]到[我们的法律结构][11]到[我们的名字][12]。 是的,这有时有点混乱 —— 重命名组织是一个特别激烈的[争议话题][13]!但对我们来说,在社区参与方面的好处是值得的。 -**5\. 使用你的元追踪器入门。** 一旦你有一个元问题追踪器,新的入门过程就表明了自己:邀请潜在的同事创建自己的入门券。如果他们以前从未使用过你的特定问题追踪器,那么这将是他们学习的极好机会。注册帐号并提交问题应该很简单(如果不是,请考虑切换工具!)。这将为你的新同事创造一个早期的成功事件,以及开始共享所有权,并在组织内部拥有一席之地。当然,没有愚蠢的问题,但是这_尤其_在某人的入门券上这是真的。这是你的新同事熟悉组织工作方式时询问任何问题的地方。当然,你需要确保快速回复他们的问题,让他们参与并帮助他们融入你的组织。这也是一个很好的方法来记录你最终授予这个人的各种系统的访问权限。至关重要的是,这可以开始[在雇佣他们之前][14]。 +**5、 将你的元追踪器用于加入过程。** 一旦你有一个元问题追踪器,就有了一个新的加入过程:邀请潜在的伙伴创建自己的入场券。如果他们以前从未使用过你的特定的问题追踪器,那么这将是他们学习的极好机会。注册帐号并提交问题应该很简单(如果不是,请考虑切换工具!)。这将让你的新伙伴尽早跨过门槛,开始分享参与感,并在组织内部拥有一席之地。当然,没有问题是愚蠢的,尤其是在某个人的入场券中更是如此。这是你的新伙伴熟悉组织工作方式时询问任何问题的地方。你需要确保快速回复他们的问题,让他们参与并帮助他们融入你的组织。这也是一个很好的方法来记录你最终授予这个人的各种系统的访问权限。至关重要的是,这可以[在雇佣他们之前][14]开始。 -**6\. 雷达项目。** 大多数问题跟踪器包括一些组织和优先排序任务的方法。例如,GitHub 有[里程碑][15]和[项目][16]。这些通常旨在使组织成员的工作重点相一致。在 Gratipay,我们发现使用这些工具可以帮助协作者拥有并组织各自的工作重点。我们发现这一点提供了不同于将问题分配给特定个人(另外的问题跟踪器通常提供的)的价值。 我可能会关心别人正在积极工作的问题,或者我可能有兴趣开始某些事情,但很高兴让别人先要申报。拥有自己的项目空间来组织我对组织工作的看法是与我的同事沟通“我的雷达上有什么”的强大方式。 +**6、 雷达项目。** 大多数问题跟踪器包括一些组织和排序任务的方法。例如,GitHub 有[里程碑][15]和[项目][16]。这些通常旨在使组织成员的工作重点相一致。在 Gratipay,我们发现使用这些工具可以帮助协作者拥有并排序各自的工作重点。与其它的问题跟踪器通常提供的将问题分配给特定个人的做法不同,我们发现这一点提供了不同的价值。 我可能会关心别人正在积极工作的问题,或者我可能有兴趣开始某些事情,但别人先提出来我也很高兴。拥有自己的项目空间来组织我对该组织的工作的看法是与我的伙伴们沟通“我的雷达上有什么”的强大方式。 -更多开放组织资源 +**7、 使用机器人自动化任务。** 最终,你可能会发现某些任务会一再出现。这表明自动化可以简化你的工作流程。在 Gratipay,我们[构建][17]了一个[机器人][18]帮助我们完成一些重复的任务。诚然,这是一个有点高级的用法。如果你达到了这一点,你能完全使用公共问题追踪器来开放你的组织! -* [下载开放组织领导人手册][1] -* [下载开放组织领域指导][2] -* [什么是开放组织?][3] -* [什么是开放决定?][4] +如 Jim Whitehurst 所说 “吸引社区内外参与” ,这些是我们在 Gratipay 内使用我们的问题跟踪器的一些最有用的做法。也就是说,我们一直在学习。如果你有自己的经验分享,请发表评论! -**7\. 使用机器人自动化任务。** 最终,你可能会发现某些任务会一再出现。这表明自动化可以简化你的工作流程。在 Gratipay,我们[构建][17]了一个[机器人][18]帮助我们完成一些重复的任务。诚然,这是一个有点高级的用法。如果你达到了这一点,你能完全使用公共问题追踪器来开放你的组织! - -这些是我们在 Gratipay 内使用我们的问题跟踪器如 Jim Whitehurst 所说那样 “吸引社区内外参与” 的一些最有用的做法。也就是说,我们一直在学习。如果你有自己的经验分享,请发表评论! +(题图:opensource.com) -------------------------------------------------------------------------------- 作者简介: -Chad Whitacre - 我是 Gratipay 的创始人,Gratipay 是一个开放组织,致力于培育一个感恩,慷慨和爱的经济。我们为开放组织提供支付你想的支付以及拿你想拿的补偿 - 我们在自己的平台上资助。在线下,我居住在美国宾夕法尼亚州匹兹堡,在线上,我活跃在 GitHub。 +Chad Whitacre - 我是 Gratipay 的创始人,Gratipay 是一个开放组织,致力于培育一个感恩、慷慨和爱的经济。我们帮助公司和其它组织为开源买单,以及赞助我们的平台。在线下,我居住在美国宾夕法尼亚州匹兹堡,在线上,我活跃在 GitHub。 -------------------------------------------------------------------------------- @@ -55,7 +48,7 @@ via: https://opensource.com/open-organization/17/2/tracking-issues-publicly 作者:[Chad Whitacre][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/) 荣誉推出 From 8e0269ca29e4567acb970d45b8d63d0c80d3c5d6 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 25 Jul 2017 22:27:34 +0800 Subject: [PATCH 0762/1407] PUB:20170209 The benefits of tracking issues publicly.md @geekpi --- .../20170209 The benefits of tracking issues publicly.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170209 The benefits of tracking issues publicly.md (100%) diff --git a/translated/tech/20170209 The benefits of tracking issues publicly.md b/published/20170209 The benefits of tracking issues publicly.md similarity index 100% rename from translated/tech/20170209 The benefits of tracking issues publicly.md rename to published/20170209 The benefits of tracking issues publicly.md From f73cc381db8e889edb2b8c7b84e85bbe407f656a Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 25 Jul 2017 23:33:44 +0800 Subject: [PATCH 0763/1407] PRF&PUB:32 The (updated) history of Android.md @alim0x --- .../32 The (updated) history of Android.md | 105 ++++-------------- 1 file changed, 24 insertions(+), 81 deletions(-) rename {translated/talk => published}/The history of Android/32 The (updated) history of Android.md (74%) diff --git a/translated/talk/The history of Android/32 The (updated) history of Android.md b/published/The history of Android/32 The (updated) history of Android.md similarity index 74% rename from translated/talk/The history of Android/32 The (updated) history of Android.md rename to published/The history of Android/32 The (updated) history of Android.md index cd2b759d94..a71da07d1b 100644 --- a/translated/talk/The history of Android/32 The (updated) history of Android.md +++ b/published/The history of Android/32 The (updated) history of Android.md @@ -1,43 +1,35 @@ -# 幕后变化 +安卓编年史(32):安卓 6.0 棉花糖(2) +======================= + +#### 幕后变化 棉花糖对自棒棒糖引入的节电任务调度器 API 进行了扩展。任务调度器将应用后台进程从随意唤醒设备规整成一个有组织的系统。任务调度器基本上就是一个后台进程的交通警察。 -在棉花糖中,谷歌还添加了一个“Doze(休眠)”模式来在设备闲置的时候节约更多电量。如果设备静止不动,未接入电源,并且屏幕处于关闭状态,它会慢慢进入低功耗离线模式,锁定后台进程。在一段时间之后,网络连接会被禁用。唤醒会被锁定——应用会请求唤醒手机来运行后台进程——而它会被忽略。系统警报(不含用户设置的闹钟)以及[任务调度器][25]也会被关闭。 +在棉花糖中,谷歌还添加了一个 “Doze(休眠)”模式来在设备闲置的时候节约更多电量。如果设备静止不动,未接入电源,并且屏幕处于关闭状态,它会慢慢进入低功耗离线模式,锁定后台进程。在一段时间之后,网络连接会被禁用。唤醒会被锁定——应用会请求唤醒手机来运行后台进程——而它会被忽略。系统警报(不含用户设置的闹钟)以及[任务调度器][25]也会被关闭。 -如果你曾经发现把设备设置为飞行模式,并且注意到电池续航延长了许多,Doze 就像是一个自动飞行模式,在你手机不用的时候介入——它真的延长了电池续航。它对于整天或整夜放在桌子上的手机很有效,对于平板就更好了,因为它常常被遗忘在咖啡桌上。 +如果你曾经发现把设备设置为飞行模式,并且注意到电池续航延长了许多,Doze 就像是一个自动的飞行模式,在你手机不用的时候介入——它真的延长了电池续航。它对于整天或整夜放在桌子上的手机很有效,对于平板就更好了,因为它常常被遗忘在咖啡桌上。 唯一能把设备从 Doze 模式唤醒的来自谷歌云消息推送服务的“高优先级消息”。这是为信息服务准备的,所以即使设备处于休眠状态,也能够收取信息。 - -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/inactive-apps-150x150.jpg) - ][1] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/battery-optimizations-150x150.jpg) - ][2] +![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/inactive-apps.jpg) “应用待机”是另一项或多或少有用的节电特性,它在后台静默运行。这背后的逻辑很简单:如果你和应用停止交互一段时间,安卓就认为它是不重要的,并取消它访问网络和后台进程的权力。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/battery-optimizations.jpg) + 对于应用待机而言,和一个应用“交互”意味着打开一个应用,开始一项前台服务,或者生成一条通知。任何其中的一条操作就会重置该应用的待机计时器。对于每种其它边界情况,谷歌在设置里添加了一个名字意味模糊的“电池优化”界面。用户可以在这里设置应用白名单让它免疫应用待机。至于开发者,他们在开发者设置中有个“不活跃应用”选项可以手动设置应用到待机状态来测试。 应用待机主要是自动禁用你不用的应用,这是个对抗垃圾应用或被遗忘的应用消耗电量的好方法。因为它是完全静默且后台自动执行的,它还能让新手也能拥有一部精心调教过的设备。 -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/autobackup-150x150.jpg) - ][3] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/07/backup2-150x150.jpg) - ][4] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/BACKUP1-150x150.jpg) - ][5] +![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/autobackup.jpg) 谷歌在过去几年尝试了很多应用备份方案,在棉花糖中它又[换了个方案][26]。棉花糖的暴力应用备份系统的目标是保存整个应用数据文件夹到云端。这是可能的并且在技术上是可行的,但即便是谷歌自己的应用对它的支持都不怎么好。设置好一部新安卓手机依然是个大麻烦,要处理无数的登录和弹出教程。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/BACKUP1.jpg) + 到界面这里,棉花糖的备份系统使用了谷歌 Drive 应用。在谷歌 Drive 的设置中有一个“管理备份”界面,不仅会显示新备份系统的应用数据,还有谷歌过去几年尝试的其它应用备份方案的数据。 - ![安卓的应用关联设置,基本就是一个应用地址转发系统。 ](https://cdn.arstechnica.net/wp-content/uploads/2016/10/app-linkingf-980x576-980x576.jpg) - +![安卓的应用关联设置,基本就是一个应用地址转发系统。 ](https://cdn.arstechnica.net/wp-content/uploads/2016/10/app-linkingf-980x576-980x576.jpg) 藏在设置里的还有一个新的“应用关联”功能,它可以将应用“链接”到网站。在应用关联出现之前,在全新安装的机器上打开一个谷歌地图链接通常会弹出一个“使用以下方式打开”的对话框,来获知你是想在浏览器还是在谷歌地图应用中打开这个链接。 @@ -45,42 +37,16 @@ 应用关联对拥有指定客户端应用的站点来说很棒,比如谷歌地图、Instagram、Facebook。对于有 API 以及多种客户端的站点,比如 Twitter,应用关联界面让用户可以设置任意地址的默认关联应用。不过默认应用关联覆盖了百分之九十的用例,在新手机上大大减少了烦人的弹窗。 - -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/adopt1-150x150.jpg) - ][6] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/setup-150x150.jpg) - ][7] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/format1-150x150.jpg) - ][8] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/move-data-150x150.jpg) - ][9] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/downloads-150x150.jpg) - ][10] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/removingisbad-150x150.jpg) - ][11] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/explorer-150x150.jpg) - ][12] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/sort-options-150x150.jpg) - ][13] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/gridorlist-150x150.jpg) - ][14] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/file-mange-150x150.jpg) - ][15] +![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/adopt1.jpg) 可选存储是棉花糖的最佳特性之一。它将 SD 卡从一个二级存储池转换成一个完美的合并存储方案。插入 SD 卡,将它格式化,然后你就有了更多的存储空间,而这是你从来没有想过的事情。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/format1.jpg) + 插入 SD 卡会弹出一条设置通知,用户可以选择将卡格式化成“外置”或“内置”存储。“内置”存储选项就是新的可选存储模式,它会将存储卡格式化为 ext4 文件系统。唯一的缺点?那就是存储卡和数据都被“锁定”到你的手机上了。如果不格式化的话,你没法取出存储卡茶道其它地方使用。谷歌对于内置存储的使用场景判断就是一旦设置就不再更改。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/removingisbad.jpg) + 如果你强行拔出了 SD 卡,安卓会尽它最大的努力处理好。它会弹出一条消息“建议最好将 SD 卡插回”和一个“忘记”这张卡的选项。当然“忘记”这张卡将会导致各种数据丢失,建议最好不要这么做。 不幸的是实际上可以使用可选存储的设备很长时间都没有出现。Nexus 设备不支持存储卡,所以为了测试我们插上了一个 U 盘作为我们的可选存储。OEM 厂商最初抵制这项功能,[LG 和三星][27]都在他们 2016 年初的旗舰机上禁用了它。三星说“我们相信我们的用户需要 microSD 卡是用来在手机和其它设备之间转移数据的”,一旦卡被格式化成 ext4 这就不可能了。 @@ -89,39 +55,16 @@ #### 音量和通知 - -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/1-2-150x150.jpg) - ][16] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/2-4-150x150.jpg) - ][17] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/dnd1-150x150.jpg) - ][18] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/2015-09-13-05.13.49-150x150.png) - ][19] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/2015-09-08-19.58.51-150x150.png) - ][20] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/dnd11-150x150.jpg) - ][21] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/dnd4-150x150.jpg) - ][22] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/3-3-150x150.jpg) - ][23] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/2015-09-08-19.23.13-150x150.png) - ][24] +![](https://cdn.arstechnica.net/wp-content/uploads/2016/10/1-2-1440x1454.jpg) 为了更简洁的设计,谷歌将通知优先级控制从音量弹窗中移除了。按下音量键会弹出一个单独的滑动条,对应当前音源控制,还有一个下拉按钮可以展开控制面板,显示所有的三个声音控制条:通知,媒体和闹钟。所有的通知优先级控制还在——它们现在在一个“勿扰模式”的快速设置方块中。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/dnd1.jpg) + 通知控制最有用的新功能之一是允许用户控制抬头通知——现在叫“预览”通知。这项功能让通知在屏幕顶部弹出,就像 iOS 那样。谷歌认为最重要的通知应该提升到高于你普通日常通知的地位。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/2015-09-13-05.13.49.png) + 但是,在棒棒糖中,这项特性引入的时候,谷歌糟糕地让开发者来决定他们的应用是否“重要”。毫无疑问,所有开发者都认为他的应用是世界上最重要的东西。所以尽管最初这项特性是为你亲密联系人的即时消息设计的,最后变成了被 Facebook 的点赞通知所操控。在棉花糖中,每个应用在通知设置都有一个“设置为优先”复选框,给了用户一把大锤来收拾不守规矩的应用。 -------------------------------------------------------------------------------- @@ -136,7 +79,7 @@ via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-histor 作者:[RON AMADEO][a] 译者:[alim0x](https://github.com/alim0x) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 0304f2ce701953ece85024da6cab189e16a1bf48 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 25 Jul 2017 23:51:02 +0800 Subject: [PATCH 0764/1407] PRF&PUB:33 The (updated) history of Android.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @alim0x 终于完成了!!! --- .../33 The (updated) history of Android.md | 104 +++--------------- 1 file changed, 14 insertions(+), 90 deletions(-) rename {translated/talk => published}/The history of Android/33 The (updated) history of Android.md (80%) diff --git a/translated/talk/The history of Android/33 The (updated) history of Android.md b/published/The history of Android/33 The (updated) history of Android.md similarity index 80% rename from translated/talk/The history of Android/33 The (updated) history of Android.md rename to published/The history of Android/33 The (updated) history of Android.md index a0a2c68bf0..9428972b8f 100644 --- a/translated/talk/The history of Android/33 The (updated) history of Android.md +++ b/published/The history of Android/33 The (updated) history of Android.md @@ -1,4 +1,7 @@ -# 每月安全更新 +安卓编年史(33):安卓 7.0 牛轧糖,Pixel 手机,以及未来 +================= + +#### 每月安全更新 [ ![看看新的“安卓安全补丁程序级别”栏。 ](https://cdn.arstechnica.net/wp-content/uploads/2016/10/settings-5-980x957.jpg) @@ -7,123 +10,44 @@ 在棉花糖发布的几个月前,安卓的“Stagefright”媒体服务器漏洞被披露给了公众,这个漏洞允许在旧版本安卓上远程执行代码。由于这个漏洞影响到了数十亿安卓设备,安卓受到了媒体广泛的批评。 -谷歌则以开始一项月度安卓安全更新项目作为回应。每个月它都会手机 bug,修复它们,然后推送新代码给 AOSP 和 Nexus 设备。OEM 厂商——它们已经在更新的泥潭中挣扎(也许是因为不关心)——基本上就是被告知“面对现实”然后跟上步伐。每个其它的主流操作系统有经常的安全更新——这就是成为这么大的平台的代价。为了协调 OEM 厂商,谷歌让他们提前一个月可以获取到更新。30 天之后,发布安全公告并将更新推送给谷歌设备。 +谷歌则以开始一项月度安卓安全更新项目作为回应。每个月它都会收集 bug,修复它们,然后推送新代码给 AOSP 和 Nexus 设备。OEM 厂商——它们已经在更新的泥潭中挣扎(也许是因为不关心)——基本上就是被告知“面对现实”然后跟上步伐。每个其它的主流操作系统有经常的安全更新——这就是成为这么大的平台的代价。为了协调 OEM 厂商,谷歌让他们提前一个月可以获取到更新。30 天之后,发布安全公告并将更新推送给谷歌设备。 月度更新项目是在棉花糖发布的两个月前开始的,但在这个主要的系统更新中谷歌添加了一栏“安卓安全补丁程序级别”到关于手机界面中。这里没有使用晦涩难懂的版本号,就用了日期来表示。这让任何人都能轻松看懂手机系统过时了多久,是个很好的让动作缓慢的 OEM 厂商羞愧的方式。 - - -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/text-150x150.jpg) - ][2] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/extra-150x150.jpg) - ][3] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/translate-150x150.jpg) - ][4] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/chromecustomtab-150x150.jpg) - ][5] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/CCT_Large-2-150x150.gif) - ][6] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/settings-5-150x150.jpg) - ][7] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/settings-1-150x150.jpg) - ][8] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/settings2-150x150.jpg) - ][9] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/settings-3-150x150.jpg) - ][10] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/nearby-150x150.jpg) - ][11] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/settings-6-150x150.jpg) - ][12] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/settings-7-150x150.jpg) - ][13] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/settings-8-150x150.jpg) - ][14] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/settings-9-150x150.jpg) - ][15] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/2015-10-03-18.21.17-150x150.png) - ][16] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/2015-10-04-05.32.23-150x150.png) - ][17] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/easter-egg-150x150.jpg) - ][18] +![](https://cdn.arstechnica.net/wp-content/uploads/2015/09/text.jpg) 文本选择菜单现在是个浮动工具条,会在你选择的时候在文本旁边弹出。这里也不止是常规的“剪切/复制/粘贴”命令。应用可以在工具栏上放置特殊选项,比如谷歌文档里的“添加链接”。 在标准的文本命令之后,一个省略号按钮会显示一个二级菜单,应用可以在这里给文本选择菜单添加额外的功能。使用新的“文本处理”API,直接给其它应用传递文本现在变得非常轻松。如果你装了谷歌翻译,在这个菜单上会显示一个“翻译”选项。谷歌搜索也在这个工具栏里为谷歌 Now on Tap 添加了一个“助理”选项。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/settings-6.jpg) + 棉花糖添加了一个隐藏的设置,叫做“系统界面调谐器”。这个部分包含了全方位的高级用户特性和试验性项目。要访问这个设置,你需要下拉通知中心,按住“设置”按钮几秒钟。设置齿轮会旋转,然后最终你会看到一条消息显示系统界面调谐器已解锁。一旦它被打开,你就可以在系统设置的底部,开发者选项附近找到它了。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/settings-7.jpg) + 在系统界面调谐器的第一部分,用户可以在快速设置面板添加自定义瓷片,这项特性后来被重制成了应用可以使用的 API。此时这项特性还很粗糙,基本就是允许用户在文本框里输入一条自定义命令。系统状态图标可以单独打开或关闭,所以如果你真的很讨厌知道你已经连接到另外无线网络,你可以把这个图标关闭。这里有一项受欢迎的电源显示新增特性,可以将电池电量百分比显示嵌入到电池图标中。还有个用来截屏的“演示”模式,它会将正常的状态栏替换成一个假的,干净的版本。 +![](https://cdn.arstechnica.net/wp-content/uploads/2015/10/easter-egg.jpg) + ### 安卓 7.0 牛轧糖,Pixel 手机,以及未来 [安卓 7.0 牛轧糖][34]和 [Pixel 手机][35]几个月前刚刚发布,你可以读读我们对它们的完整评测。二者都有无数我们还没看到最终效果的特性和影响,所以我们暂且搁置,等它真正成为“历史”之后再进行评说。 - - -### 延伸阅读 - -[安卓 7.0 牛轧糖评测——在你的大手机上做更多的事][25] - 牛轧糖为了 Daydream VR 对[图形和传感器][36]做出了很大的改动,Daydream VR 是谷歌即将来临的智能手机驱动 VR 体验,[我们已经尝试过了][37]但还没花时间写下点什么。从 Chrome OS 借鉴来了新的“无缝升级”功能,系统拥有两个系统分区,可以在你使用其中一个的时候,对另一个在后台进行静默升级。考虑到 Pixel 是这个功能的唯一首发设备,并且还没有收到更新,我们也不确定这个功能是什么样子的。 - -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/08/2016-08-17-18.21.22-150x150.png) - ][19] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/08/2016-08-17-18.20.59-150x150.png) - ][20] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/08/Android-N_1-150x150.jpg) - ][21] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/03/2016-03-20-19.26.55-150x150.png) - ][22] -* [ - ![](https://cdn.arstechnica.net/wp-content/uploads/2016/08/pip-active-150x150.png) - ][23] +![](https://cdn.arstechnica.net/wp-content/uploads/2016/08/Android-N_1-1440x848.jpg) 牛轧糖最有趣的新功能之一是改进的应用框架,它允许改变应用尺寸大小。这让谷歌可以在手机和平板上实现分屏,在安卓 TV 上实现画中画,以及一个神秘的浮动窗口模式。我们已经能够通过一些软件技巧来访问浮动窗口模式,但还没有看到谷歌在实际产品中使用它。难道它的目标是桌面计算? 安卓和 Chrome OS 则继续走在共同成长的道路上。安卓应用现在已经能够在一些 Chromebook 上[运行了][38],给了这个“仅 Web”的系统 Play 商店以及一系列的应用生态。有传言称 Chrome OS 和安卓未来将会更加紧密结合成“[Andromeda][39]”——一个“Android”和“Chrome”混合而成的词——它可能是一个融合的 Chrome/安卓系统的代号。 - 我们还没有看到 Pixel 手机会创造怎样的历史。谷歌最近发布了两部新旗舰机 Pixel 和 Pixel XL,加入了硬件竞争之中。谷歌之前和合作伙伴合作生产联名的 Nexus 手机,但 Pixel 产品线用的是“Google”品牌。谷歌声明这是一个完全的硬件 OEM,HTC 是合同制造商,就类似苹果把富士康作为合同制造商那样。 - - -### 延伸阅读 - -[Google Pixel 评测:最好的安卓手机,即便是有点贵][26] - 拥有自己的硬件改变了谷歌制造软件的方式。谷歌发布了“谷歌助理”作为未来版的“OK Google”语音命令系统。但助理是 Pixel 的独占特性,谷歌没有把它推送给所有安卓设备。谷歌对界面做了一些改变,一个定制版的“Pixel 启动器”主屏应用和一套新的系统界面,这些都是 Pixel 独占的。我们需要时间来见证未来功能点在“安卓”和“Pixel”之间的平衡。 - -### 延伸阅读 - -[和谷歌的 Hiroshi Lockheimer 聊聊 Pixel,安卓 OEM 和其它][27] - 见证这这些改变,我们可能正处在安卓历史上最不确定的点上。但在安卓最近的 2016 年 10 月活动前,安卓、Chrome OS以及谷歌 Play 的 SVP [Hiroshi Lockheimer][40] 说,他相信我们将来都会动情回顾这些最新的安卓更新。Lockheimer 是现在谷歌事实上的软件统治者,他认为最新的更新会是自安卓八年前亮相以来最有意义的事件。尽管在发布会后他没有对这个观点进行详细阐述,但事实表明明年这时候我们_可能_都不会讨论安卓了——它可能已经是一个安卓/Chrome OS 结合体了!正如 2008 年以来那样,安卓历史的下一篇章一定会更加有趣。 -------------------------------------------------------------------------------- @@ -138,7 +62,7 @@ via: http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-histor 作者:[RON AMADEO][a] 译者:[alim0x](https://github.com/alim0x) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From d488e79fc497986d5d5145961051c0b3105b4aec Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 26 Jul 2017 08:39:46 +0800 Subject: [PATCH 0765/1407] translated --- ...a Linux Debugger Part 8 Stack unwinding.md | 197 ------------------ ...a Linux Debugger Part 8 Stack unwinding.md | 196 +++++++++++++++++ 2 files changed, 196 insertions(+), 197 deletions(-) delete mode 100644 sources/tech/20170624 Writing a Linux Debugger Part 8 Stack unwinding.md create mode 100644 translated/tech/20170624 Writing a Linux Debugger Part 8 Stack unwinding.md diff --git a/sources/tech/20170624 Writing a Linux Debugger Part 8 Stack unwinding.md b/sources/tech/20170624 Writing a Linux Debugger Part 8 Stack unwinding.md deleted file mode 100644 index 654bddc6b1..0000000000 --- a/sources/tech/20170624 Writing a Linux Debugger Part 8 Stack unwinding.md +++ /dev/null @@ -1,197 +0,0 @@ -translating---geekpi - -Writing a Linux Debugger Part 8: Stack unwinding -============================================================ - -Sometimes the most important information you need to know about what your current program state is how it got there. This is typically provided with a `backtrace` command, which gives you the chain of function calls which have lead to the the program is right now. This post will show you how to implement stack unwinding on x86_64 to generate such a backtrace. - -* * * - -### Series index - -These links will go live as the rest of the posts are released. - -1. [Setup][1] - -2. [Breakpoints][2] - -3. [Registers and memory][3] - -4. [Elves and dwarves][4] - -5. [Source and signals][5] - -6. [Source-level stepping][6] - -7. [Source-level breakpoints][7] - -8. [Stack unwinding][8] - -9. Reading variables - -10. Next steps - -* * * - -Take the following program as an example: - -``` -void a() { - //stopped here -} - -void b() { - a(); -} - -void c() { - a(); -} - -int main() { - b(); - c(); -} -``` - -If the debugger is stopped at the `//stopped here` line, there are two ways which it could have got there: `main->b->a` or `main->c->a`. If we set a breakpoint there with LLDB, continue, and ask for a backtrace, then we get the following: - -``` -* frame #0: 0x00000000004004da a.out`a() + 4 at bt.cpp:3 - frame #1: 0x00000000004004e6 a.out`b() + 9 at bt.cpp:6 - frame #2: 0x00000000004004fe a.out`main + 9 at bt.cpp:14 - frame #3: 0x00007ffff7a2e830 libc.so.6`__libc_start_main + 240 at libc-start.c:291 - frame #4: 0x0000000000400409 a.out`_start + 41 - -``` - -This says that we are currently in function `a`, which we got to from function `b`, which we got to from `main` and so on. Those final two frames are just how the compiler has bootstrapped the `main` function. - -The question now is how we implement this on x86_64\. The most robust way to do this is to parse the `.eh_frame` section of the ELF file and work out how to unwind the stack from there, but this is a pain. You could use `libunwind` or something similar to do it for you, but that’s boring. Instead, we’ll assume that the compiler has laid out the stack in a certain way and we’ll just walk it manually. In order to do this, we first need to understand how the stack is laid out. - -``` - High - | ... | - +---------+ - +24| Arg 1 | - +---------+ - +16| Arg 2 | - +---------+ - + 8| Return | - +---------+ -EBP+--> |Saved EBP| - +---------+ - - 8| Var 1 | - +---------+ -ESP+--> | Var 2 | - +---------+ - | ... | - Low - -``` - -As you can see, the frame pointer for the last stack frame is stored at the start of current stack frame, creating a linked list of frame pointers. The stack is unwound by following this linked list. We can find out which function the next frame in the list belongs to by looking up the return address in the DWARF info. Some compilers will omit tracking the frame base with the `EBP`, since this can be represented as an offset from `ESP` and it frees up an extra register. Passing `-fno-omit-frame-pointer` to GCC or Clang should force it to follow the convention we’re relying on, even when optimisations are enabled. - -We’ll do all our work in a `print_backtrace` function: - -``` -void debugger::print_backtrace() { -``` - -Something to decide early is what format to print out the frame information in. I used a little lambda to push this out the way: - -``` - auto output_frame = [frame_number = 0] (auto&& func) mutable { - std::cout << "frame #" << frame_number++ << ": 0x" << dwarf::at_low_pc(func) - << ' ' << dwarf::at_name(func) << std::endl; - }; -``` - -The first frame to print out will be the one which is currently being executed. We can get the information for this frame by looking up the current program counter in the DWARF: - -``` - auto current_func = get_function_from_pc(get_pc()); - output_frame(current_func); -``` - -Next we need to get the frame pointer and return address for the current function. The frame pointer is stored in the `rbp` register, and the return address is 8 bytes up the stack from the frame pointer. - -``` - auto frame_pointer = get_register_value(m_pid, reg::rbp); - auto return_address = read_memory(frame_pointer+8); -``` - -Now we have all the information we need to unwind the stack. I’m just going to keep unwinding until the debugger hits `main`, but you could also choose to stop when the frame pointer is `0x0`, which will get you the functions which your implementation called before `main` as well. We’ll to grab the frame pointer and return address from each frame and print out the information as we go. - -``` - while (dwarf::at_name(current_func) != "main") { - current_func = get_function_from_pc(return_address); - output_frame(current_func); - frame_pointer = read_memory(frame_pointer); - return_address = read_memory(frame_pointer+8); - } -} -``` - -That’s it! The whole function is here for your convenience: - -``` -void debugger::print_backtrace() { - auto output_frame = [frame_number = 0] (auto&& func) mutable { - std::cout << "frame #" << frame_number++ << ": 0x" << dwarf::at_low_pc(func) - << ' ' << dwarf::at_name(func) << std::endl; - }; - - auto current_func = get_function_from_pc(get_pc()); - output_frame(current_func); - - auto frame_pointer = get_register_value(m_pid, reg::rbp); - auto return_address = read_memory(frame_pointer+8); - - while (dwarf::at_name(current_func) != "main") { - current_func = get_function_from_pc(return_address); - output_frame(current_func); - frame_pointer = read_memory(frame_pointer); - return_address = read_memory(frame_pointer+8); - } -} -``` - -### Adding commands - -Of course, we have to expose this command to the user. - -``` - else if(is_prefix(command, "backtrace")) { - print_backtrace(); - } -``` - -### Testing it out - -A good way to test this functionality is by writing a test program with a bunch of small functions which call each other. Set a few breakpoints, jump around the code a bit, and make sure that your backtrace is accurate. - -* * * - -We’ve come a long way from a program which can merely spawn and attach to other programs. The penultimate post in this series will finish up the implementation of the debugger by supporting the reading and writing of variables. Until then you can find the code for this post [here][9]. - --------------------------------------------------------------------------------- - -via: https://blog.tartanllama.xyz/c++/2017/06/24/writing-a-linux-debugger-unwinding/ - -作者:[Simon Brand][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://twitter.com/TartanLlama -[1]:https://blog.tartanllama.xyz/c++/2017/03/21/writing-a-linux-debugger-setup/ -[2]:https://blog.tartanllama.xyz/c++/2017/03/24/writing-a-linux-debugger-breakpoints/ -[3]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/ -[4]:https://blog.tartanllama.xyz/c++/2017/04/05/writing-a-linux-debugger-elf-dwarf/ -[5]:https://blog.tartanllama.xyz/c++/2017/04/24/writing-a-linux-debugger-source-signal/ -[6]:https://blog.tartanllama.xyz/c++/2017/05/06/writing-a-linux-debugger-dwarf-step/ -[7]:https://blog.tartanllama.xyz/c++/2017/06/19/writing-a-linux-debugger-source-break/ -[8]:https://blog.tartanllama.xyz/c++/2017/06/24/writing-a-linux-debugger-unwinding/ -[9]:https://github.com/TartanLlama/minidbg/tree/tut_unwind diff --git a/translated/tech/20170624 Writing a Linux Debugger Part 8 Stack unwinding.md b/translated/tech/20170624 Writing a Linux Debugger Part 8 Stack unwinding.md new file mode 100644 index 0000000000..a0a1b3693a --- /dev/null +++ b/translated/tech/20170624 Writing a Linux Debugger Part 8 Stack unwinding.md @@ -0,0 +1,196 @@ +编写 Linux 调试器第 8 部分:堆栈展开 +============================================================ + +有时你需要知道的最重要的信息是什么,你当前的程序状态是如何到达那里的。这有一个 `backtrace` 命令,它给你提供了程序当前的函数调用链。这篇文章将向你展示如何在 x86_64 上实现堆栈展开以生成这样的回溯。 + + +* * * + +### 系列索引 + +这些链接将会随着其他帖子的发布而上线。 + +1. [设置][1] + +2. [断点][2] + +3. [寄存器和内存][3] + +4. [ELF 和 DWARF][4] + +5. [源和信号][5] + +6. [源码级单步调试][6] + +7. [源码级断点][7] + +8. [堆栈展开][8] + +9. 读取变量 + +10. 下一步 + +* * * + +用下面的程序作为例子: + +``` +void a() { + //stopped here +} + +void b() { + a(); +} + +void c() { + a(); +} + +int main() { + b(); + c(); +} +``` + +如果调试器停在 `//stopped here' 这行,那么有两种方法可以达到:`main->b->a` 或 `main->c->a`。如果我们用 LLDB 设置一个断点,继续并请求一个回溯,那么我们将得到以下内容: + +``` +* frame #0: 0x00000000004004da a.out`a() + 4 at bt.cpp:3 + frame #1: 0x00000000004004e6 a.out`b() + 9 at bt.cpp:6 + frame #2: 0x00000000004004fe a.out`main + 9 at bt.cpp:14 + frame #3: 0x00007ffff7a2e830 libc.so.6`__libc_start_main + 240 at libc-start.c:291 + frame #4: 0x0000000000400409 a.out`_start + 41 + +``` + +这说明我们目前在函数 `a` 中,`a` 从函数 `b` 中跳转,`b` 从 `main` 中跳转等等。最后两个帧是编译器如何引导 `main` 函数。 + +现在的问题是我们如何在 x86_64 上实现。最稳定的方法是解析 ELF 文件的 `.eh_frame` 部分,并解决如何从那里展开堆栈,但这会很痛苦。你可以使用 `libunwind` 或类似的来做,但这很无聊。相反,我们假设编译器以某种方式设置了堆栈,我们将手动进行。为了做到这一点,我们首先需要了解堆栈的布局。 + +``` + High + | ... | + +---------+ + +24| Arg 1 | + +---------+ + +16| Arg 2 | + +---------+ + + 8| Return | + +---------+ +EBP+--> |Saved EBP| + +---------+ + - 8| Var 1 | + +---------+ +ESP+--> | Var 2 | + +---------+ + | ... | + Low + +``` + +你可以看到,最后一个堆栈帧的帧指针存储在当前堆栈帧的开始处,创建一个链接的指针列表。按照这个链表解开堆栈。我们可以通过查找 DWARF 信息中的返回地址来找出列表中下一帧的函数。一些编译器将忽略跟踪 `EBP` 的帧基址,因为这可以表示为 `ESP` 的偏移量,并可以释放一个额外的寄存器。即使启用了优化,传递 `-fno-omit-frame-pointer` 到 GCC 或 Clang 会强制它遵循我们依赖的约定。 + +我们将在 `print_backtrace` 函数中完成所有的工作: + +``` +void debugger::print_backtrace() { +``` + +首先要决定的是使用什么格式打印出帧信息。我用了一个 lambda 来推出这个方法: + +``` + auto output_frame = [frame_number = 0] (auto&& func) mutable { + std::cout << "frame #" << frame_number++ << ": 0x" << dwarf::at_low_pc(func) + << ' ' << dwarf::at_name(func) << std::endl; + }; +``` + +打印输出的第一帧是当前正在执行的帧。我们可以通过查找 DWARF 中的当前程序计数器来获取此帧的信息: + +``` + auto current_func = get_function_from_pc(get_pc()); + output_frame(current_func); +``` + +接下来我们需要获取当前函数的帧指针和返回地址。帧指针存储在 `rbp` 寄存器中,返回地址从帧指针堆栈起的 8 字节。 + +``` + auto frame_pointer = get_register_value(m_pid, reg::rbp); + auto return_address = read_memory(frame_pointer+8); +``` + +现在我们拥有了展开堆栈所需的所有信息。我只需要继续展开,直到调试器命中 `main`,但是当帧指针为 `0x0`时,你也可以选择停止,这些是你在调用 `main` 函数之前调用的函数。我们将从每帧抓取帧指针和返回地址,并打印出信息。 + +``` + while (dwarf::at_name(current_func) != "main") { + current_func = get_function_from_pc(return_address); + output_frame(current_func); + frame_pointer = read_memory(frame_pointer); + return_address = read_memory(frame_pointer+8); + } +} +``` + +就是这样!以下是整个函数: + +``` +void debugger::print_backtrace() { + auto output_frame = [frame_number = 0] (auto&& func) mutable { + std::cout << "frame #" << frame_number++ << ": 0x" << dwarf::at_low_pc(func) + << ' ' << dwarf::at_name(func) << std::endl; + }; + + auto current_func = get_function_from_pc(get_pc()); + output_frame(current_func); + + auto frame_pointer = get_register_value(m_pid, reg::rbp); + auto return_address = read_memory(frame_pointer+8); + + while (dwarf::at_name(current_func) != "main") { + current_func = get_function_from_pc(return_address); + output_frame(current_func); + frame_pointer = read_memory(frame_pointer); + return_address = read_memory(frame_pointer+8); + } +} +``` + +### 添加命令 + +当然,我们必须向用户公开这个命令。 + +``` + else if(is_prefix(command, "backtrace")) { + print_backtrace(); + } +``` + +### 测试 + +测试此功能的一个方法是通过编写一个测试程序与一堆互相调用的小函数。设置几个断点,跳在代码附近,并确保你的回溯是准确的。 + +* * * + +我们已经从一个只能产生并附加到其他程序的程序走了很长的路。本系列的倒数第二篇文章将通过支持读写变量来完成调试器的实现。在此之前,你可以在[这里][9]找到这个帖子的代码。 + +-------------------------------------------------------------------------------- + +via: https://blog.tartanllama.xyz/c++/2017/06/24/writing-a-linux-debugger-unwinding/ + +作者:[Simon Brand][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://twitter.com/TartanLlama +[1]:https://blog.tartanllama.xyz/c++/2017/03/21/writing-a-linux-debugger-setup/ +[2]:https://blog.tartanllama.xyz/c++/2017/03/24/writing-a-linux-debugger-breakpoints/ +[3]:https://blog.tartanllama.xyz/c++/2017/03/31/writing-a-linux-debugger-registers/ +[4]:https://blog.tartanllama.xyz/c++/2017/04/05/writing-a-linux-debugger-elf-dwarf/ +[5]:https://blog.tartanllama.xyz/c++/2017/04/24/writing-a-linux-debugger-source-signal/ +[6]:https://blog.tartanllama.xyz/c++/2017/05/06/writing-a-linux-debugger-dwarf-step/ +[7]:https://blog.tartanllama.xyz/c++/2017/06/19/writing-a-linux-debugger-source-break/ +[8]:https://blog.tartanllama.xyz/c++/2017/06/24/writing-a-linux-debugger-unwinding/ +[9]:https://github.com/TartanLlama/minidbg/tree/tut_unwind From cf38a0cf3602e49d122c7094b7ddbe0eac15087c Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 26 Jul 2017 08:43:36 +0800 Subject: [PATCH 0766/1407] translating --- ...Using a Multi-Source Unified Block List With Whitelisting.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md b/sources/tech/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md index be6c824f9f..aa59fb3387 100644 --- a/sources/tech/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md +++ b/sources/tech/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md @@ -1,3 +1,5 @@ +translating----geekpi + This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting ============================================================ From 0a4f562ed01adfe9cab73528b5f0a1cd03106303 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 13:21:59 +0800 Subject: [PATCH 0767/1407] =?UTF-8?q?20170726-1=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...to Samba4 AD from Commandline – Part 14.md | 297 ++++++++++++++++++ 1 file changed, 297 insertions(+) create mode 100644 sources/tech/20170714 Integrate CentOS 7 to Samba4 AD from Commandline – Part 14.md diff --git a/sources/tech/20170714 Integrate CentOS 7 to Samba4 AD from Commandline – Part 14.md b/sources/tech/20170714 Integrate CentOS 7 to Samba4 AD from Commandline – Part 14.md new file mode 100644 index 0000000000..29162628ac --- /dev/null +++ b/sources/tech/20170714 Integrate CentOS 7 to Samba4 AD from Commandline – Part 14.md @@ -0,0 +1,297 @@ +Integrate CentOS 7 to Samba4 AD from Commandline – Part 14 +============================================================ + +This guide will show you how you can integrate a CentOS 7 Server with no Graphical User Interface to [Samba4 Active Directory Domain Controller][3] from command line using Authconfig software. + +This type of setup provides a single centralized account database held by Samba and allows the AD users to authenticate to CentOS server across the network infrastructure. + +#### Requirements + +1. [Create an Active Directory Infrastructure with Samba4 on Ubuntu][1] + +2. [CentOS 7.3 Installation Guide][2] + +### Step 1: Configure CentOS for Samba4 AD DC + +1. Before starting to join CentOS 7 Server into a Samba4 DC you need to assure that the network interface is properly configured to query domain via DNS service. + +Run [ip address][4] command to list your machine network interfaces and choose the specific NIC to edit by issuing nmtui-edit command against the interface name, such as ens33 in this example, as illustrated below. + +``` +# ip address +# nmtui-edit ens33 +``` + [![List Network Interfaces](https://www.tecmint.com/wp-content/uploads/2017/07/List-Network-Interfaces.jpg)][5] + +List Network Interfaces + +2. Once the network interface is opened for editing, add the static IPv4 configurations best suited for your LAN and make sure you setup Samba AD Domain Controllers IP addresses for the DNS servers. + +Also, append the name of your domain in search domains filed and navigate to OK button using [TAB] key to apply changes. + +The search domains filed assures that the domain counterpart is automatically appended by DNS resolution (FQDN) when you use only a short name for a domain DNS record. + + [![Configure Network Interface](https://www.tecmint.com/wp-content/uploads/2017/07/Configure-Network-Interface.png)][6] + +Configure Network Interface + +3. Finally, restart the network daemon to apply changes and test if DNS resolution is properly configured by issuing series of ping commands against the domain name and domain controllers short names as shown below. + +``` +# systemctl restart network.service +# ping -c2 tecmint.lan +# ping -c2 adc1 +# ping -c2 adc2 +``` + [![Verify DNS Resolution on Domain](https://www.tecmint.com/wp-content/uploads/2017/07/Verify-DNS-Resolution-on-Domain.png)][7] + +Verify DNS Resolution on Domain + +4. Also, configure your machine hostname and reboot the machine to properly apply the settings by issuing the following commands. + +``` +# hostnamectl set-hostname your_hostname +# init 6 +``` + +Verify if hostname was correctly applied with the below commands. + +``` +# cat /etc/hostname +# hostname +``` + +5. Finally, sync local time with Samba4 AD DC by issuing the below commands with root privileges. + +``` +# yum install ntpdate +# ntpdate domain.tld +``` + [![Sync Time with Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/07/Sync-Time-with-Samba4-AD-DC.png)][8] + +Sync Time with Samba4 AD DC + +### Step 2: Join CentOS 7 Server to Samba4 AD DC + +6. To join CentOS 7 server to Samba4 Active Directory, first install the following packages on your machine from an account with root privileges. + +``` +# yum install authconfig samba-winbind samba-client samba-winbind-clients +``` + +7. In order to integrate CentOS 7 server to a domain controller run authconfig-tui graphical utility with root privileges and use the below configurations as described below. + +``` +# authconfig-tui +``` + +At the first prompt screen choose: + +* On User Information: + * Use Winbind + +* On Authentication tab select by pressing [Space] key: + * Use Shadow Password + + * Use Winbind Authentication + + * Local authorization is sufficient + + [![Authentication Configuration](https://www.tecmint.com/wp-content/uploads/2017/07/Authentication-Configuration.png)][9] + +Authentication Configuration + +8. Hit Next to continue to the Winbind Settings screen and configure as illustrated below: + +* Security Model: ads + +* Domain = YOUR_DOMAIN (use upper case) + +* Domain Controllers = domain machines FQDN (comma separated if more than one) + +* ADS Realm = YOUR_DOMAIN.TLD + +* Template Shell = /bin/bash + + [![Winbind Settings](https://www.tecmint.com/wp-content/uploads/2017/07/Winbind-Settings.png)][10] + +Winbind Settings + +9. To perform domain joining navigate to Join Domain button using [tab] key and hit [Enter] key to join domain. + +At the next screen prompt, add the credentials for a Samba4 AD account with elevated privileges to perform the machine account joining into AD and hit OK to apply settings and close the prompt. + +Be aware that when you type the user password, the credentials won’t be shown in the password screen. On the remaining screen hit OK again to finish domain integration for CentOS 7 machine. + + [![Join Domain to Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/07/Join-Domain-to-Samba4-AD-DC.png)][11] + +Join Domain to Samba4 AD DC + + [![Confirm Winbind Settings](https://www.tecmint.com/wp-content/uploads/2017/07/Confirm-Winbind-Settings.png)][12] + +Confirm Winbind Settings + +To force adding a machine into a specific Samba AD Organizational Unit, get your machine exact name using hostname command and create a new Computer object in that OU with the name of your machine. + +The best way to add a new object into a Samba4 AD is by using ADUC tool from a Windows machine integrated into the domain with [RSAT tools installed][13] on it. + +Important: An alternate method of joining a domain is by using authconfig command line which offers extensive control over the integration process. + +However, this method is prone to errors do to its numerous parameters as illustrated on the below command excerpt. The command must be typed into a single long line. + +``` +# authconfig --enablewinbind --enablewinbindauth --smbsecurity ads --smbworkgroup=YOUR_DOMAIN --smbrealm YOUR_DOMAIN.TLD --smbservers=adc1.yourdomain.tld --krb5realm=YOUR_DOMAIN.TLD --enablewinbindoffline --enablewinbindkrb5 --winbindtemplateshell=/bin/bash--winbindjoin=domain_admin_user --update --enablelocauthorize --savebackup=/backups +``` + +10. After the machine has been joined to domain, verify if winbind service is up and running by issuing the below command. + +``` +# systemctl status winbind.service +``` + +11. Then, check if CentOS machine object has been successfully created in Samba4 AD. Use AD Users and Computers tool from a Windows machine with RSAT tools installed and navigate to your domain Computers container. A new AD computer account object with name of your CentOS 7 server should be listed in the right plane. + +12. Finally, tweak the configuration by opening samba main configuration file (/etc/samba/smb.conf) with a text editor and append the below lines at the end of the [global]configuration block as illustrated below: + +``` +winbind use default domain = true +winbind offline logon = true +``` + [![Configure Samba](https://www.tecmint.com/wp-content/uploads/2017/07/Configure-Samba.jpg)][14] + +Configure Samba + +13. In order to create local homes on the machine for AD accounts at their first logon run the below command. + +``` +# authconfig --enablemkhomedir --update +``` + +14. Finally, restart Samba daemon to reflect changes and verify domain joining by performing a logon on the server with an AD account. The home directory for the AD account should be automatically created. + +``` +# systemctl restart winbind +# su - domain_account +``` + [![Verify Domain Joining](https://www.tecmint.com/wp-content/uploads/2017/07/Verify-Domain-Joining.jpg)][15] + +Verify Domain Joining + +15. List the domain users or domain groups by issuing one of the following commands. + +``` +# wbinfo -u +# wbinfo -g +``` + [![List Domain Users and Groups](https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-Users-and-Groups.png)][16] + +List Domain Users and Groups + +16. To get info about a domain user run the below command. + +``` +# wbinfo -i domain_user +``` + [![List Domain User Info](https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-User-Info.jpg)][17] + +List Domain User Info + +17. To display summary domain info issue the following command. + +``` +# net ads info +``` + [![List Domain Summary](https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-Summary.jpg)][18] + +List Domain Summary + +### Step 3: Login to CentOS with a Samba4 AD DC Account + +18. To authenticate with a domain user in CentOS, use one of the following command line syntaxes. + +``` +# su - ‘domain\domain_user’ +# su - domain\\domain_user +``` + +Or use the below syntax in case winbind use default domain = true parameter is set to samba configuration file. + +``` +# su - domain_user +# su - domain_user@domain.tld +``` + +19. In order to add root privileges for a domain user or group, edit sudoers file using visudocommand and add the following lines as illustrated on the below screenshot. + +``` +YOUR_DOMAIN\\domain_username ALL=(ALL:ALL) ALL #For domain users +%YOUR_DOMAIN\\your_domain\ group ALL=(ALL:ALL) ALL #For domain groups +``` + +Or use the below excerpt in case winbind use default domain = true parameter is set to samba configuration file. + +``` +domain_username ALL=(ALL:ALL) ALL #For domain users +%your_domain\ group ALL=(ALL:ALL) ALL #For domain groups +``` + [![Grant Root Privileges on Domain Users](https://www.tecmint.com/wp-content/uploads/2017/07/Grant-Root-Privileges-on-Domain-Users.jpg)][19] + +Grant Root Privileges on Domain Users + +20. The following series of commands against a Samba4 AD DC can also be useful for troubleshooting purposes: + +``` +# wbinfo -p #Ping domain +# wbinfo -n domain_account #Get the SID of a domain account +# wbinfo -t #Check trust relationship +``` + +21. To leave the domain run the following command against your domain name using a domain account with elevated privileges. After the machine account has been removed from the AD, reboot the machine to revert changes before the integration process. + +``` +# net ads leave -w DOMAIN -U domain_admin +# init 6 +``` + +That’s all! Although this procedure is mainly focused on joining a CentOS 7 server to a Samba4 AD DC, the same steps described here are also valid for integrating a CentOS server into a Microsoft Windows Server 2012 Active Directory. + +-------------------------------------------------------------------------------- + +作者简介: + +Matei Cezar +I'am a computer addicted guy, a fan of open source and linux based system software, have about 4 years experience with Linux distributions desktop, servers and bash scripting. + +------------------ + +via: https://www.tecmint.com/integrate-centos-7-to-samba4-active-directory/ + +作者:[Matei Cezar ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/cezarmatei/ +[1]:https://www.tecmint.com/install-samba4-active-directory-ubuntu/ +[2]:https://www.tecmint.com/centos-7-3-installation-guide/ +[3]:https://www.tecmint.com/install-samba4-active-directory-ubuntu/ +[4]:https://www.tecmint.com/ip-command-examples/ +[5]:https://www.tecmint.com/wp-content/uploads/2017/07/List-Network-Interfaces.jpg +[6]:https://www.tecmint.com/wp-content/uploads/2017/07/Configure-Network-Interface.png +[7]:https://www.tecmint.com/wp-content/uploads/2017/07/Verify-DNS-Resolution-on-Domain.png +[8]:https://www.tecmint.com/wp-content/uploads/2017/07/Sync-Time-with-Samba4-AD-DC.png +[9]:https://www.tecmint.com/wp-content/uploads/2017/07/Authentication-Configuration.png +[10]:https://www.tecmint.com/wp-content/uploads/2017/07/Winbind-Settings.png +[11]:https://www.tecmint.com/wp-content/uploads/2017/07/Join-Domain-to-Samba4-AD-DC.png +[12]:https://www.tecmint.com/wp-content/uploads/2017/07/Confirm-Winbind-Settings.png +[13]:https://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/ +[14]:https://www.tecmint.com/wp-content/uploads/2017/07/Configure-Samba.jpg +[15]:https://www.tecmint.com/wp-content/uploads/2017/07/Verify-Domain-Joining.jpg +[16]:https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-Users-and-Groups.png +[17]:https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-User-Info.jpg +[18]:https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-Summary.jpg +[19]:https://www.tecmint.com/wp-content/uploads/2017/07/Grant-Root-Privileges-on-Domain-Users.jpg +[20]:https://www.tecmint.com/author/cezarmatei/ +[21]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[22]:https://www.tecmint.com/free-linux-shell-scripting-books/ From b5603d34500b4b9155622d0724ebff3cab9d1f4a Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 13:23:21 +0800 Subject: [PATCH 0768/1407] =?UTF-8?q?20170726-2=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ba4 AD DC with SSSD and Realm – Part 15.md | 377 ++++++++++++++++++ 1 file changed, 377 insertions(+) create mode 100644 sources/tech/20170718 Integrate Ubuntu to Samba4 AD DC with SSSD and Realm – Part 15.md diff --git a/sources/tech/20170718 Integrate Ubuntu to Samba4 AD DC with SSSD and Realm – Part 15.md b/sources/tech/20170718 Integrate Ubuntu to Samba4 AD DC with SSSD and Realm – Part 15.md new file mode 100644 index 0000000000..32a5caf4ae --- /dev/null +++ b/sources/tech/20170718 Integrate Ubuntu to Samba4 AD DC with SSSD and Realm – Part 15.md @@ -0,0 +1,377 @@ +Integrate Ubuntu to Samba4 AD DC with SSSD and Realm – Part 15 +============================================================ + + +This tutorial will guide you on how to join an Ubuntu Desktop machine into a Samba4 Active Directory domain with SSSD and Realmd services in order to authenticate users against an Active Directory. + +#### Requirements: + +1. [Create an Active Directory Infrastructure with Samba4 on Ubuntu][1] + +### Step 1: Initial Configurations + +1. Before starting to join Ubuntu into an Active Directory make sure the hostname is properly configured. Use hostnamectl command to set the machine name or manually edit /etc/hostname file. + +``` +$ sudo hostnamectl set-hostname your_machine_short_hostname +$ cat /etc/hostname +$ hostnamectl +``` + +2. On the next step, edit machine network interface settings and add the proper IP configurations and the correct DNS IP server addresses to point to the Samba AD domain controller as illustrated in the below screenshot. + +If you have configured a DHCP server at your premises to automatically assign IP settings for your LAN machines with the proper AD DNS IP addresses then you can skip this step and move forward. + + [![Configure Network Interface](https://www.tecmint.com/wp-content/uploads/2017/07/Configure-Network-Interface.jpg)][2] + +Configure Network Interface + +On the above screenshot, 192.168.1.254 and 192.168.1.253 represents the IP addresses of the Samba4 Domain Controllers. + +3. Restart the network services to apply the changes using the GUI or from command line and issue a series of ping command against your domain name in order to test if DNS resolution is working as expected. Also, use host command to test DNS resolution. + +``` +$ sudo systemctl restart networking.service +$ host your_domain.tld +$ ping -c2 your_domain_name +$ ping -c2 adc1 +$ ping -c2 adc2 +``` + +4. Finally, make sure that machine time is in sync with Samba4 AD. Install ntpdate package and sync time with the AD by issuing the below commands. + +``` +$ sudo apt-get install ntpdate +$ sudo ntpdate your_domain_name +``` + +### Step 2: Install Required Packages + +5. On this step install the necessary software and required dependencies in order to join Ubuntu into Samba4 AD DC: Realmd and SSSD services. + +``` +$ sudo apt install adcli realmd krb5-user samba-common-bin samba-libs samba-dsdb-modules sssd sssd-tools libnss-sss libpam-sss packagekit policykit-1 +``` + +6. Enter the name of the default realm with uppercases and press Enter key to continue the installation. + + [![Set Realm Name](https://www.tecmint.com/wp-content/uploads/2017/07/Set-realm-name.png)][3] + +Set Realm Name + +7. Next, create the SSSD configuration file with the following content. + +``` +$ sudo nano /etc/sssd/sssd.conf +``` + +Add following lines to sssd.conf file. + +``` +[nss] +filter_groups = root +filter_users = root +reconnection_retries = 3 +[pam] +reconnection_retries = 3 +[sssd] +domains = tecmint.lan +config_file_version = 2 +services = nss, pam +default_domain_suffix = TECMINT.LAN +[domain/tecmint.lan] +ad_domain = tecmint.lan +krb5_realm = TECMINT.LAN +realmd_tags = manages-system joined-with-samba +cache_credentials = True +id_provider = ad +krb5_store_password_if_offline = True +default_shell = /bin/bash +ldap_id_mapping = True +use_fully_qualified_names = True +fallback_homedir = /home/%d/%u +access_provider = ad +auth_provider = ad +chpass_provider = ad +access_provider = ad +ldap_schema = ad +dyndns_update = true +dyndsn_refresh_interval = 43200 +dyndns_update_ptr = true +dyndns_ttl = 3600 +``` + +Make sure you replace the domain name in following parameters accordingly: + +``` +domains = tecmint.lan +default_domain_suffix = TECMINT.LAN +[domain/tecmint.lan] +ad_domain = tecmint.lan +krb5_realm = TECMINT.LAN +``` + +8. Next, add the proper permissions for SSSD file by issuing the below command: + +``` +$ sudo chmod 700 /etc/sssd/sssd.conf +``` + +9. Now, open and edit Realmd configuration file and add the following lines. + +``` +$ sudo nano /etc/realmd.conf +``` + +Realmd.conf file excerpt: + +``` +[active-directory] +os-name = Linux Ubuntu +os-version = 17.04 +[service] +automatic-install = yes +[users] +default-home = /home/%d/%u +default-shell = /bin/bash +[tecmint.lan] +user-principal = yes +fully-qualified-names = no +``` + +10. The last file you need to modify belongs to Samba daemon. Open /etc/samba/smb.conf file for editing and add the following block of code at the beginning of the file, after the [global]section as illustrated on the image below. + +``` + workgroup = TECMINT +client signing = yes +client use spnego = yes +kerberos method = secrets and keytab +realm = TECMINT.LAN +security = ads +``` + [![Configure Samba Server](https://www.tecmint.com/wp-content/uploads/2017/07/Configure-Samba-Server.jpg)][4] + +Configure Samba Server + +Make sure you replace the domain name value, especially the realm value to match your domain name and run testparm command in order to check if the configuration file contains no errors. + +``` +$ sudo testparm +``` + [![Test Samba Configuration](https://www.tecmint.com/wp-content/uploads/2017/07/Test-Samba-Configuration.jpg)][5] + +Test Samba Configuration + +11. After you’ve made all the required changes, test Kerberos authentication using an AD administrative account and list the ticket by issuing the below commands. + +``` +$ sudo kinit ad_admin_user@DOMAIN.TLD +$ sudo klist +``` + [![Check Kerberos Authentication](https://www.tecmint.com/wp-content/uploads/2017/07/Check-Kerberos-Authentication.jpg)][6] + +Check Kerberos Authentication + +### Step 3: Join Ubuntu to Samba4 Realm + +12. To join Ubuntu machine to Samba4 Active Directory issue following series of commands as illustrated below. Use the name of an AD DC account with administrator privileges in order for the binding to realm to work as expected and replace the domain name value accordingly. + +``` +$ sudo realm discover -v DOMAIN.TLD +$ sudo realm list +$ sudo realm join TECMINT.LAN -U ad_admin_user -v +$ sudo net ads join -k +``` + [![Join Ubuntu to Samba4 Realm](https://www.tecmint.com/wp-content/uploads/2017/07/Join-Ubuntu-to-Samba4-Realm.jpg)][7] + +Join Ubuntu to Samba4 Realm + + [![List Realm Domain Info](https://www.tecmint.com/wp-content/uploads/2017/07/List-Realm-Domain-Info.jpg)][8] + +List Realm Domain Info + + [![Add User to Realm Domain](https://www.tecmint.com/wp-content/uploads/2017/07/Add-User-to-Realm-Domain.jpg)][9] + +Add User to Realm Domain + + [![List Realm Domain Info](https://www.tecmint.com/wp-content/uploads/2017/07/Add-Domain-to-Realm.jpg)][10] + +Add Domain to Realm + +13. After the domain binding took place, run the below command to assure that all domain accounts are permitted to authenticate on the machine. + +``` +$ sudo realm permit -all +``` + +Subsequently, you can allow or deny access for a domain user account or a group using realm command as presented on the below examples. + +``` +$ sudo realm deny -a +$ realm permit --groups ‘domain.tld\Linux Admins’ +$ realm permit user@domain.lan +$ realm permit DOMAIN\\User2 +``` + +14. From a Windows machine with [RSAT tools installed][11] you can open AD UC and navigate to Computers container and check if an object account with the name of your machine has been created. + + [![Confirm Domain Added to AD DC](https://www.tecmint.com/wp-content/uploads/2017/07/Confirm-Domain-Added.jpg)][12] + +Confirm Domain Added to AD DC + +### Step 4: Configure AD Accounts Authentication + +15. In order to authenticate on Ubuntu machine with domain accounts you need to run pam-auth-update command with root privileges and enable all PAM profiles including the option to automatically create home directories for each domain account at the first login. + +Check all entries by pressing [space] key and hit ok to apply configuration. + +``` +$ sudo pam-auth-update +``` + [![PAM Configuration](https://www.tecmint.com/wp-content/uploads/2017/07/PAM-Configuration.jpg)][13] + +PAM Configuration + +16. On systems manually edit /etc/pam.d/common-account file and the following line in order to automatically create homes for authenticated domain users. + +``` +session required pam_mkhomedir.so skel=/etc/skel/ umask=0022 +``` + +17. If Active Directory users can’t change their password from command line in Linux, open /etc/pam.d/common-password file and remove the use_authtok statement from password line to finally look as on the below excerpt. + +``` +password [success=1 default=ignore] pam_winbind.so try_first_pass +``` + +18. Finally, restart and enable Realmd and SSSD service to apply changes by issuing the below commands: + +``` +$ sudo systemctl restart realmd sssd +$ sudo systemctl enable realmd sssd +``` + +19. In order to test if the Ubuntu machine was successfully integrated to realm run install winbind package and run wbinfo command to list domain accounts and groups as illustrated below. + +``` +$ sudo apt-get install winbind +$ wbinfo -u +$ wbinfo -g +``` + [![List Domain Accounts](https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-Accounts.jpg)][14] + +List Domain Accounts + +20. Also, check Winbind nsswitch module by issuing the getent command against a specific domain user or group. + +``` +$ sudo getent passwd your_domain_user +$ sudo getent group ‘domain admins’ +``` + [![Check Winbind Nsswitch](https://www.tecmint.com/wp-content/uploads/2017/07/check-Winbind-nsswitch.jpg)][15] + +Check Winbind Nsswitch + +21. You can also use Linux id command to get info about an AD account as illustrated on the below command. + +``` +$ id tecmint_user +``` + [![Check AD User Info](https://www.tecmint.com/wp-content/uploads/2017/07/Check-AD-User-Info.jpg)][16] + +Check AD User Info + +22. To authenticate on Ubuntu host with a Samba4 AD account use the domain username parameter after su – command. Run id command to get extra info about the AD account. + +``` +$ su - your_ad_user +``` + [![AD User Authentication](https://www.tecmint.com/wp-content/uploads/2017/07/AD-User-Authentication.jpg)][17] + +AD User Authentication + +Use pwd command to see your domain user current working directory and passwd command if you want to change password. + +23. To use a domain account with root privileges on your Ubuntu machine, you need to add the AD username to the sudo system group by issuing the below command: + +``` +$ sudo usermod -aG sudo your_domain_user@domain.tld +``` + +Login to Ubuntu with the domain account and update your system by running apt updatecommand to check root privileges. + +24. To add root privileges for a domain group, open end edit /etc/sudoers file using visudocommand and add the following line as illustrated. + +``` +%domain\ admins@tecmint.lan ALL=(ALL:ALL) ALL +``` + +25. To use domain account authentication for Ubuntu Desktop modify LightDM display manager by editing /usr/share/lightdm/lightdm.conf.d/50-ubuntu.conf file, append the following two lines and restart lightdm service or reboot the machine apply changes. + +``` +greeter-show-manual-login=true +greeter-hide-users=true +``` + +Log in to Ubuntu Desktop with a domain account using either your_domain_username or your_domain_username@your_domain.tld syntax. + +26. To use short name format for Samba AD accounts, edit /etc/sssd/sssd.conf file, add the following line in [sssd] block as illustrated below. + +``` +full_name_format = %1$s +``` + +and restart SSSD daemon to apply changes. + +``` +$ sudo systemctl restart sssd +``` + +You will notice that the bash prompt will change to the short name of the AD user without appending the domain name counterpart. + +27. In case you cannot login due to enumerate=true argument set in sssd.conf you must clear sssd cached database by issuing the below command: + +``` +$ rm /var/lib/sss/db/cache_tecmint.lan.ldb +``` + +That’s all! Although this guide is mainly focused on integration with a Samba4 Active Directory, the same steps can be applied in order to integrate Ubuntu with Realmd and SSSD services into a Microsoft Windows Server Active Directory. + +-------------------------------------------------------------------------------- + +作者简介: + +Matei Cezar +I'am a computer addicted guy, a fan of open source and linux based system software, have about 4 years experience with Linux distributions desktop, servers and bash scripting. + +------------------ + +via: https://www.tecmint.com/integrate-ubuntu-to-samba4-ad-dc-with-sssd-and-realm/ + +作者:[ Matei Cezar][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/cezarmatei/ +[1]:https://www.tecmint.com/install-samba4-active-directory-ubuntu/ +[2]:https://www.tecmint.com/wp-content/uploads/2017/07/Configure-Network-Interface.jpg +[3]:https://www.tecmint.com/wp-content/uploads/2017/07/Set-realm-name.png +[4]:https://www.tecmint.com/wp-content/uploads/2017/07/Configure-Samba-Server.jpg +[5]:https://www.tecmint.com/wp-content/uploads/2017/07/Test-Samba-Configuration.jpg +[6]:https://www.tecmint.com/wp-content/uploads/2017/07/Check-Kerberos-Authentication.jpg +[7]:https://www.tecmint.com/wp-content/uploads/2017/07/Join-Ubuntu-to-Samba4-Realm.jpg +[8]:https://www.tecmint.com/wp-content/uploads/2017/07/List-Realm-Domain-Info.jpg +[9]:https://www.tecmint.com/wp-content/uploads/2017/07/Add-User-to-Realm-Domain.jpg +[10]:https://www.tecmint.com/wp-content/uploads/2017/07/Add-Domain-to-Realm.jpg +[11]:https://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/ +[12]:https://www.tecmint.com/wp-content/uploads/2017/07/Confirm-Domain-Added.jpg +[13]:https://www.tecmint.com/wp-content/uploads/2017/07/PAM-Configuration.jpg +[14]:https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-Accounts.jpg +[15]:https://www.tecmint.com/wp-content/uploads/2017/07/check-Winbind-nsswitch.jpg +[16]:https://www.tecmint.com/wp-content/uploads/2017/07/Check-AD-User-Info.jpg +[17]:https://www.tecmint.com/wp-content/uploads/2017/07/AD-User-Authentication.jpg +[18]:https://www.tecmint.com/author/cezarmatei/ +[19]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[20]:https://www.tecmint.com/free-linux-shell-scripting-books/ From 26e3a9ff9d00fa1829aa64ac725cbf33bafc261d Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 13:26:06 +0800 Subject: [PATCH 0769/1407] =?UTF-8?q?20170726-3=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...nux Adobe Alternatives You Need to Know.md | 131 ++++++++++++++++++ 1 file changed, 131 insertions(+) create mode 100644 sources/tech/20160909 Best Linux Adobe Alternatives You Need to Know.md diff --git a/sources/tech/20160909 Best Linux Adobe Alternatives You Need to Know.md b/sources/tech/20160909 Best Linux Adobe Alternatives You Need to Know.md new file mode 100644 index 0000000000..b2c1756ec5 --- /dev/null +++ b/sources/tech/20160909 Best Linux Adobe Alternatives You Need to Know.md @@ -0,0 +1,131 @@ +Best Linux Adobe Alternatives You Need to Know +============================================================ +![](https://www.maketecheasier.com/assets/uploads/2016/09/adobe-alternative-linux-featured.jpg "Best Linux Adobe Alternatives You Need to Knows") + + + +Looking for Adobe alternatives as a Linux user? You’re not alone. If you’re an avid graphic designer, you’re probably well-versed at avoiding pricey Adobe products. Still, Linux users are typically the ones granted the shortest end of the stick when it comes to Adobe. Adobe alternatives are a must – but what exactly are the best options available? + +[Ads by Google][4] + +It ultimately comes down to the specific Adobe program and what you hope to accomplish. Fortunately, as necessity remains the mother of all invention, others have answered the call. The result is a series of highly efficient stand-ins for Adobe software. + +### Evince (Adobe Acrobat) + +![Evince_AdobeReaderSubstitute](https://www.maketecheasier.com/assets/uploads/2016/08/Evince_AdobeReaderSubstitute.jpg "Evince_AdobeReaderSubstitute") + +Like Adobe Acrobat Reader, [Evince][6] is a “document viewer for multiple documents.” For example, users may rely on Evince as a PDF viewer. It also supports various comic book formats (cbr, cbz, cb7, and cbt). You can find a [complete list of supported formats][7] at the Evince website. + +Linux users don’t have to look high and low for Evince, as it comes standard. You can head to the official site for updates when needed. + +### Pixlr (Adobe Photoshop) + +![Pixlr_Photoshopsubstitute](https://www.maketecheasier.com/assets/uploads/2016/08/Pixlr_Photoshopsubstitute.jpg "Pixlr_Photoshopsubstitute") + +The wonderful thing about [Pixlr][8] is this Adobe alternative’s various tools are available online. If you have an Internet connection, then you have a powerful image editing workspace. + +[Pixlr Editor][9] is a capable stand-in for Photoshop, as you can work with layers and related effects. It also has some nifty drawing and color-editing tools. [Pixlr Express][10] doesn’t have as many features, as it’s mainly for enhancing images. Adjust the color and clarity, and also add some Instagram-friendly effects! + +It’s incredible what you can accomplish with Pixlr, and it’s completely free. + +### Inkscape (Adobe Illustrator) + +![Inkscape_Illustratorsubstitute](https://www.maketecheasier.com/assets/uploads/2016/08/Inkscape_Illustratorsubstitute.jpg "Inkscape_Illustratorsubstitute") + +[Inkscape][11] is another well-recommended free Adobe alternative. It functions mainly as a “professional vector graphics editor.” In addition to Illustrator, Inkscape also gets held up against Corel Draw, Freehand, and Xara X. + +Its vector design tools are handy for crafting logos and “high scalability” artwork. Inkscape includes drawing, shape, and text tools. Layer tools allow you to lock, group, or hide individual layers. + +### Pinegrow Web Editor (Adobe Dreamweaver) + +![Pinegrow_Dreamweaversubstitute](https://www.maketecheasier.com/assets/uploads/2016/08/Pinegrow_Dreamweaversubstitute-400x204.jpg "Pinegrow_Dreamweaversubstitute") + +[Pinegrow Web Editor][12] is a great substitute for Dreamweaver on Linux. The program lets you work on HTML sites right on your desktop. + +Instead of just creating with code (and having to preview later), Pinegrow provides a detailed visual editing experience. You can see and test your HTML projects live, learning in real time whether links work or if images are where they’re supposed to be. Pinegrow also comes with a WordPress theme builder. + +Try it free for 30 days. If you like it, you can buy it for a one-time payment of $49. + +### Scribus (Adobe InDesign) + +![Scribus_InDesignsubstitute](https://www.maketecheasier.com/assets/uploads/2016/08/Scribus_InDesignsubstitute.jpg "Scribus_InDesignsubstitute") + +[Scribus][13] is probably the closest substitute you’ll find to Adobe’s InDesign. According to its developers, you should [strongly consider][14] Scribus because “it’s reliable and free.” + +In actuality, Scribus is more than an excellent desktop publishing tool; it’s a great  _self-_ publishing tool. Why rely on expensive businesses to create high-quality magazines and books when you can do it yourself?  Scribus currently allows designers to work with a 200-color palette, with [promises to double the number][15] of colors with the next stable version. + +### digiKam (Adobe Lightroom) + +![digiKam_Lightroomsubstitute](https://www.maketecheasier.com/assets/uploads/2016/08/digiKam_Lightroomsubstitute-400x213.jpg "digiKam_Lightroomsubstitute") + +[digiKam][16] is perhaps the best Lightroom alternative at the moment for Linux users. Features include the capacity to import photographs, organize image collections, enhance images, create slideshows, and more. + +Its sleek design and advanced features are an actual labor of love; the people behind digiKam are, in fact, photographers. More than that, they wanted the ability to do in Linux what others can accomplish with Lightroom. + +### Webflow (Adobe Muse) + +![Webflow_Museubstitute](https://www.maketecheasier.com/assets/uploads/2016/08/Webflow_Museubstitute-400x158.jpg "Webflow_Museubstitute") + +[Webflow][17] is yet another website that proves how much you can accomplish without having to download software. A very handy Adobe alternative for Muse, Webflow is ideal for creating highly-responsive website designs. + +One of the best aspects of Webflow is that you don’t need to do your own coding. Just drag and drop images and write text. Webflow does the “heavy lifting” for you. There’s the option of building a website completely from scratch, or you can use various templates. Although free, the premium options boast additional features, such as the ability to easily export HTML and CSS to use elsewhere. + +### Tupi (Adobe Animate) + +![Tupi_Animatesubstitute](https://www.maketecheasier.com/assets/uploads/2016/08/Tupi_Animatesubstitute.jpg "Tupi_Animatesubstitute") + +[Tupi][18] is an Adobe alternative for Animate – or anyone who isn’t [too keen on Flash][19] these days. Sure, Tupi’s creators state that it’s not meant to be competition for Flash. However, the ability to work with HTML5 doesn’t stop it from being an ideal substitute. + +Draw and animate in 2D on your PC or tablet. Unsure how to get started? Learn how to make cutout animations and more using the site’s [YouTube tutorials][20]. + +### Black Magic Fusion (Adobe After Effects) + +![Fusion_AFterEffectssubstitute](https://www.maketecheasier.com/assets/uploads/2016/08/Fusion_AFterEffectssubstitute.jpg "Fusion_AFterEffectssubstitute") + +[Black Magic Fusion][21] was destined to upstage Adobe’s After Effects. This visual effects software is the outcome of roughly 25 years of development! Fusion is routinely used to create impressive effects in Hollywood movies and television shows – driving home its detailed and stylish capabilities. + +Fusion works by using nodes, “small icons that represent effects, filters, and other processing .” These nodes are linked together to create a series of sophisticated visual effects. The program includes a host of features such as image retouching, object tracking, and mind-blowing 3D effects. + +You have the option of a free version or shelling out $995 for Fusion Studio. To help you decide, [you can compare][22]free and premium Fusion features. + +[Ads by Google][5] + +### Conclusion + +As you can see, others are way ahead of you regarding Adobe alternatives. Thanks to open source ingenuity, significantly improved substitutes continue to be released. We could soon see a complete suite created just for Linux users. Until then, you’ll have these alternatives to choose from at your leisure. + +Know of any useful Adobe alternatives not mentioned here? Share software recommendations in the comment section below. + +-------------------------------------------------------------------------------- + +via: https://www.maketecheasier.com/adobe-alternatives-for-linux/ + +作者:[ Toni Matthews-El][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.maketecheasier.com/author/ttmatthe/ +[1]:https://www.maketecheasier.com/author/ttmatthe/ +[2]:https://www.maketecheasier.com/adobe-alternatives-for-linux/#comments +[3]:https://www.maketecheasier.com/category/linux-tips/ +[4]:https://support.google.com/adsense/troubleshooter/1631343 +[5]:https://support.google.com/adsense/troubleshooter/1631343 +[6]:https://wiki.gnome.org/Apps/Evince +[7]:https://wiki.gnome.org/Apps/Evince/SupportedDocumentFormats +[8]:https://pixlr.com/ +[9]:https://pixlr.com/editor/ +[10]:https://pixlr.com/express/ +[11]:https://inkscape.org/en/ +[12]:http://pinegrow.com/ +[13]:https://www.scribus.net/ +[14]:https://www.scribus.net/why-on-earth-should-i-use-scribus-2/ +[15]:https://www.scribus.net/because-color-matters/ +[16]:http://digikam.org/ +[17]:https://webflow.com/ +[18]:http://www.maefloresta.com/portal/ +[19]:https://www.maketecheasier.com/sites-moving-away-flash/ +[20]:https://www.youtube.com/user/maefloresta +[21]:https://www.blackmagicdesign.com/ +[22]:https://www.blackmagicdesign.com/products/fusion/compare From 9b9c6bea04d734c2dba83668b19bc01e1c274950 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 13:27:34 +0800 Subject: [PATCH 0770/1407] =?UTF-8?q?20170726-4=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...s I use dwm for my Linux window manager.md | 87 +++++++++++++++++++ 1 file changed, 87 insertions(+) create mode 100644 sources/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md diff --git a/sources/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md b/sources/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md new file mode 100644 index 0000000000..c8f5831c6e --- /dev/null +++ b/sources/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md @@ -0,0 +1,87 @@ +Top 4 reasons I use dwm for my Linux window manager +============================================================ + +### A window manager handles the sizing and arrangement of the windows you open, among other things. + + +![Top 4 reasons I use dwm for my Linux window manager](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/car-penguin-drive-linux-yellow.png?itok=ueZE5mph "Top 4 reasons I use dwm for my Linux window manager") +Image by :  + +Internet Archive [Book][4] [Images][5]. Modified by Opensource.com. CC BY-SA 4.0 + +I like minimalistic views. If I could run everything in a terminal I would. It's free from shiny stuff that hogs my resources and distracts my feeble mind. I also grow tired of resizing and moving windows, never getting them to align perfectly. + +On my quest for minimalism, I grew fond of [Xfce][6] and used it as my main [desktop environment][7] for years on my Linux computers. Then, one day I came across a video of [Bryan Lunduke][8] talking about the awesome [window manager][9] he used called [Awesome][10]. It neatly arranges all of your windows for you, and so, sounded like just what I wanted. I tried it out but didn't get the hang of the configuration needed to tweak it into my liking. So, I moved on and discovered [xmonad][11], but I had a similar result. It worked fine but I couldn't get around the Haskell part to really turn it into my perfect desktop. + +Years passed and by accident, I found my way to [suckless.org][12] and their version of a window manager called [dwm][13]. + +In short, a desktop environment such as KDE, Gnome, or Xfce includes many things, of which a window manager is one, but also with select applications. A window manager alone handles (among other window related things) the sizing and arrangement of the windows you open. Different desktop environments use different window managers. KDE has KWin, Gnome 2 has Metacity, Gnome 3 has Mutter, and Xfce has Xfwm. Conveniently, for all of these, you can change the default window manager to something else, which is what I've been doing for a while. I've been switching mine to dwm, and here's why I love it. + +### Dynamic window management + +The killer feature for dwm, as with Awesome and xmonad, is the part where the tool automatically arranges the windows for you, filling the entire space of your screen. Sure, for most desktop environments today it's possible to create keyboard shortcuts to arrange windows to the left, right, top, bottom or full screen, but with dwm it's just one less thing to think about. + +Dwm divides the screen into a master and a stack area. There are three layouts to choose from: tile, monocle, and floating. When using tile mode, which is what I use the most, it puts the window which requires the most attention in the master area while the others are tiled in the stack area. In the monocle layout, all windows are maximized and you toggle between them. The floating layout allows you resize the windows as you want (as the most window managers do), which is handy if you're using Gimp or a similar application where custom size windows makes more sense. + +Usually, in your desktop environment, you can use different workspaces to sort your windows and gather similar applications in designated workspaces. At work, I use one workspace for ongoing work and one for internet browsing. Dwm has a similar function called tags. You can group windows by tags and by selecting a tag, you display all the windows with that tag. + +### Efficiency + +Dwm is efficient if you want to save as much power as you can on your computer. Xfce and other lightweight environments are great on older or weaker machines, but dwm uses (in my case) about 1/3 of resources compared to Xfce after login. When I was using an eee pc with 1 GB RAM it made quite a difference if the memory was occupied to 660 MB or 230 MB. That left me with more room for the editors and browsers I wanted to use. + +### Minimalistic + +I typically set up my applications beside each other: the terminal as the master window (usually running Vim as an editor), a browser for email, and another browser window open for research or [Trello][14]. For casual internet browsing, I fire up a Chromium window in another workspace or a  _tag_  as I mentioned earlier. + +### [dwm.png][1] + +![](https://opensource.com/sites/default/files/dwm.png) + +Screenshot by author. + +With standard desktop environments, you often have at least one or two panels, top and bottom or on the side, taking up space. I have tried out the autohide panel function that most of them have, but I was annoyed every time I accidently put the mouse pointer too close to the edge and the panel popped out at the most inconvenient time. You can make them smaller as well but I still enjoy the minimalistic status bar on top of the screen available in dwm. + +### Speed + +When evaluating speed, I count both how quickly dwm is loaded when I log in and how quickly the applications launch when I start them. When using newer, faster computers you might not care about this detail yet, but for me, there is a noticable difference between various desktop environments and window managers. I don't want to actually wait for my computer to perform such easy tasks, it should just pop up. Also, using keyboard shortcuts to launch everything is faster than using a mouse or a touchpad, and my hands don't have to leave the keyboard. + +### Conclusion + +That said, I would not recommend dwm to the novice user. It takes some time to read up on how to configure it to your liking (unless you are satisfied with the setup provided by your Linux distribution). I have found some of the patches you might want to include can be tricky to get working and the support community is small (the IRC channel states "No patch-handholding"). So, it might take a bit of effort to get exactly what you want. However, once you do, it's well worth that bit investment. + +And hey, it looks as awesome as Awesome. + +-------------------------------------------------------------------------------- + +作者简介: + +Jimmy Sjölund - Jimmy Sjölund is a senior IT service manager and innovation coach at Telia Company, focusing on organisation development, exploring agile and lean workflows and is a visualisation enthusiast. He's also an open source evangelist, previously engaged in Ubuntu Studio and Plume Creator. + +----------------- + +via: https://opensource.com/article/17/7/top-4-reasons-i-use-dwm-linux-window-manager + +作者:[ Jimmy Sjölund Feed ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/jimmysjolund +[1]:https://opensource.com/file/363336 +[2]:https://opensource.com/article/17/7/top-4-reasons-i-use-dwm-linux-window-manager?rate=T8qhopZLfd1eum_NMLOSGckUh2nIjfeRpkERGjGhu7w +[3]:https://opensource.com/user/56551/feed +[4]:https://www.flickr.com/photos/internetarchivebookimages/14746482994/in/photolist-ot6zCN-odgbDq-orm48o-otifuv-otdyWa-ouDjnZ-otGT2L-odYVqY-otmff7-otGamG-otnmSg-rxnhoq-orTmKf-otUn6k-otBg1e-Gm6FEf-x4Fh64-otUcGR-wcXsxg-tLTN9R-otrWYV-otnyUE-iaaBKz-ovcPPi-ovokCg-ov4pwM-x8Tdf1-hT5mYr-otb75b-8Zk6XR-vtefQ7-vtehjQ-xhhN9r-vdXhWm-xFBgtQ-vdXdJU-vvTH6R-uyG5rH-vuZChC-xhhGii-vvU5Uv-vvTNpB-vvxqsV-xyN2Ai-vdXcFw-vdXuNC-wBMhes-xxYmxu-vdXxwS-vvU8Zt +[5]:https://www.flickr.com/photos/internetarchivebookimages/14774719031/in/photolist-ovAie2-otPK99-xtDX7p-tmxqWf-ow3i43-odd68o-xUPaxW-yHCtWi-wZVsrD-DExW5g-BrzB7b-CmMpC9-oy4hyF-x3UDWA-ow1m4A-x1ij7w-tBdz9a-tQMoRm-wn3tdw-oegTJz-owgrs2-rtpeX1-vNN6g9-owemNT-x3o3pX-wiJyEs-CGCC4W-owg22q-oeT71w-w6PRMn-Ds8gyR-x2Aodm-owoJQm-owtGp9-qVxppC-xM3Gw7-owgV5J-ou9WEs-wihHtF-CRmosE-uk9vB3-wiKdW6-oeGKq3-oeFS4f-x5AZtd-w6PNuv-xgkofr-wZx1gJ-EaYPED-oxCbFP +[6]:https://xfce.org/ +[7]:https://en.wikipedia.org/wiki/Desktop_environment +[8]:http://lunduke.com/ +[9]:https://en.wikipedia.org/wiki/Window_manager +[10]:https://awesomewm.org/ +[11]:http://xmonad.org/ +[12]:http://suckless.org/ +[13]:http://dwm.suckless.org/ +[14]:https://opensource.com/node/22546 +[15]:https://opensource.com/users/jimmysjolund +[16]:https://opensource.com/users/jimmysjolund +[17]:https://opensource.com/article/17/7/top-4-reasons-i-use-dwm-linux-window-manager#comments From 796360c7e17b3ebcf400941314ed20aadff07003 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 13:29:36 +0800 Subject: [PATCH 0771/1407] =?UTF-8?q?20170726-5=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20170717 Why you should be a sysadmin.md | 68 +++++++++++++++++++ 1 file changed, 68 insertions(+) create mode 100644 sources/tech/20170717 Why you should be a sysadmin.md diff --git a/sources/tech/20170717 Why you should be a sysadmin.md b/sources/tech/20170717 Why you should be a sysadmin.md new file mode 100644 index 0000000000..81f410ae9e --- /dev/null +++ b/sources/tech/20170717 Why you should be a sysadmin.md @@ -0,0 +1,68 @@ +Why you should be a sysadmin +============================================================ + +### Network and system administration jobs are well-paying and plentiful. + + +![Why you should be a sysadmin](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/sysadmin_uncleserver.jpeg?itok=Tc9LAT7N "Why you should be a sysadmin") +Image credits :  + +Jason Baker, CC BY-SA 4.0 + +We are at war with entropy, and Uncle Server wants YOU to be a system administrator. + +Chances are good that you are already an administrator for some systems you own, and you do it for free because that's just how it goes these days. But there are employers willing and eager to pay good money for someone to help administer their systems. We're currently near zero unemployment in system and network administration, and the Bureau of Labor Statistics projects continued [9% growth][3] in the field through 2024. + +What about automation, you ask. Perhaps you've heard sysadmins say how they intend to automate away their entire job, or how they automated their predecessor's job in a single shell script. How many have you heard of that succeeding? When the job is automation, there is always more to automate. + +If you attend or watch videos of sysadmin conferences, you'll see a field that needs new blood. Not only is there a distinct lack of younger people, but also fairly extreme gender and racial imbalances. While those are topics for a different article, diversity is well proven to improve resilience, problem-solving, innovation, and decision-making—things of great interest to sysadmins. + +### Do I want to be a sysadmin? + +So you're needed, but do you need system administration? Assuming you live in a first world country, US$ 70,000 annual income seems to be a threshold for happiness—or at least shedding most money-related stress. The median for system and network administrators is US$ 80,000, so hitting that threshold is quite achievable, though obviously there are plenty of people making less (and more). + +Is system administration something you've done for free? Most of us manage at least a few devices, but that doesn't mean you enjoy it. If you've added some extra systems acting as servers on your home network, you're a candidate. Did you justify adding a Minecraft server for your kid mostly so that you could have fun setting up a Raspberry Pi server? Maybe it's time to consider getting paid to do that sort of work. + +System administration as a generalist job offers a particular kind of flexibility. System administrators are needed across a wide variety of industries and company sizes. Most urban areas have a need for some on-site workers, and remote work is also a strong possibility. + +Anyone can work with open source software for free, but as a sysadmin you can also get paid to do it. System administrators often contribute to open source projects, support open source vendors, and work with a wide variety of interesting and powerful open source software as part of their regular job. + +Last, what about the community? I can say from years of experience that it is hard to find a more welcoming, encouraging, friendly, and helpful community. Sure, there is the stereotype of the grumpy sysadmin, but I feel that's mostly an outdated joke now. Most sysadmins today respond positively to all forms of constructive feedback, particularly when it comes to welcoming newcomers. We're almost all keenly aware of our diversity and demographic problems and eager to solve them. We are a community of deep and diverse interests. Ask a sysadmin what they do outside of work and you are unlikely to be bored. + +### So where do I sign up? + +If you're convinced, first the good news. More than many STEM careers, it's possible to transition into system administration without a directly relevant four-year degree. In fact, there are relatively few four-year degrees in system administration in the entire world, which helps set expectations. As with every white-collar job these days, a degree does help, and the more relevant the better. Unlike many other STEM careers, there is a natural entry-level position: the helpdesk. + +The bad news for system administration hopefuls is true for many STEM (and even non-STEM) fields: Employers are looking for people with years of experience and advanced degrees, even for explicitly entry-level positions. Employers are underpaying. Employers aren't investing in training. The consolation is that these problems are so prevalent in the job market that you'll be facing them in any job. + +System administration can be a starting point for other IT fields, such as network administration, database administration, and site reliability engineering. And just a bit further away are software engineering, quality assurance, and IT management. + +Details of the sysadmin job, both the stereotypes and obvious aspects, as well as some less obvious things to consider, are topics for future Opensource.com articles. We'll also cover some important ways in which the field is likely to change and offer ways to evaluate and compare sysadmin positions and ask powerful questions during interviews. + +If you're interested in joining the field, consider joining the [League of Professional System Administrators][4] (LOPSA), the professional organization on which I serve as a board member. Membership is affordable (and may be covered by your employer) and free for students. Being a LOPSA member is a fantastic way to meet sysadmins and discuss the career with people at various levels of experience and in a variety of industries and work environments. + +-------------------------------------------------------------------------------- + +作者简介: + +Paul English - Paul English is CEO of PreOS Security Inc. Paul is a Board member for the League of Professional System Administrator, a non-profit professional association for hte advancement of the practice of system administration from 2015 through 2017. Paul has Bachelors in Computer Science from Worcester Polytechnic Institute obtained in 1998. And Paul has been a UNIX & Linux system administrator and wearer of many other IT hats since 1996. + +------------------- + + +via: https://opensource.com/article/17/7/why-become-sysadmin + +作者:[ Paul English ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/penglish +[1]:https://opensource.com/article/17/7/why-become-sysadmin?rate=_WhJK6oklTBkiCcSP0hmPIxAiSrmlSbsDqrz3RTBx-4 +[2]:https://opensource.com/user/157701/feed +[3]:https://www.bls.gov/ooh/Computer-and-Information-Technology/Network-and-computer-systems-administrators.htm#tab-1 +[4]:https://lopsa.org/ +[5]:https://opensource.com/users/penglish +[6]:https://opensource.com/users/penglish +[7]:https://opensource.com/article/17/7/why-become-sysadmin#comments From 899d01f8fb58a034f75bab3a12c521195a1e688f Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 13:31:33 +0800 Subject: [PATCH 0772/1407] =?UTF-8?q?20170726-6=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...hat you need to know about hybrid cloud.md | 133 ++++++++++++++++++ 1 file changed, 133 insertions(+) create mode 100644 sources/tech/20170725 What you need to know about hybrid cloud.md diff --git a/sources/tech/20170725 What you need to know about hybrid cloud.md b/sources/tech/20170725 What you need to know about hybrid cloud.md new file mode 100644 index 0000000000..fbbb094ebb --- /dev/null +++ b/sources/tech/20170725 What you need to know about hybrid cloud.md @@ -0,0 +1,133 @@ +What you need to know about hybrid cloud +============================================================ + +### Learn the ins and outs of hybrid cloud, including what it is and how to use it. + +![What you need to know about hybrid cloud](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/bus_cloud_database.png?itok=xd6EcK2u "What you need to know about hybrid cloud") +Image by :  + +[Jason Baker][10]. [CC BY-SA 4.0][11]. + +Of the many technologies that have emerged over the past decade, cloud computing is notable for its rapid advance from a niche technology to global domination. On its own, cloud computing has created a lot of confusion, arguments, and debates, and "hybrid" cloud, which blends several types of cloud computing, has created even more uncertainty. Read on for answers to some of the most common questions about hybrid cloud. + +### What is a hybrid cloud? + +Basically, a hybrid cloud is a flexible and integrated combination of on-premises infrastructure, private cloud, and public (i.e., third-party) cloud platforms. Even though public and private cloud services are bound together in a hybrid cloud, in practice they remain unique and separate entities with services that can be orchestrated together. The choice to use both public and private cloud infrastructure is based on several factors, including cost, load flexibility, and data security. + +Advanced features, such as scale-up and scale-out, can quickly expand a cloud application's infrastructure on demand, making hybrid cloud a popular choice for services with seasonal or other variable resource demands. (Scaling up means to increase compute resources, such as CPU cores and memory, on a specific Linux instance, whereas scaling out means to provision multiple instances with similar configurations and distribute them into a cluster.) + +Explore the open source cloud + +* [What is the cloud?][1] + +* [What is OpenStack?][2] + +* [What is Kubernetes?][3] + +* [Why the operating system matters for containers][4] + +* [Keeping Linux containers safe and secure][5] + +At the center of hybrid cloud solutions sits open source software, such as [OpenStack][12], that deploys and manages large networks of virtual machines. Since its initial release in October 2010, OpenStack has been thriving globally. Some of its integrated projects and tools handle core cloud computing services, such as compute, networking, storage, and identity, while dozens of other projects can be bundled together with OpenStack to create unique and deployable hybrid cloud solutions. + +### Components of the hybrid cloud + +As illustrated in the graphic below, a hybrid cloud consists of private cloud, public cloud, and the internal network connected and managed through orchestration, system management, and automation tools. + +### [hybridcloud1.jpg][6] + +![Hybrid cloud model diagram](https://opensource.com/sites/default/files/u128651/hybridcloud1.jpg "Hybrid cloud model diagram") + +Model of the hybrid cloud + +### Public cloud infrastructure: + +* **Infrastructure as a Service (IaaS) **provides compute resources, storage, networking, firewall, intrusion prevention services (IPS), etc. from a remote data center. These services can be monitored and managed using a graphical user interface (GUI) or a command line interface (CLI). Rather than purchasing and building their own infrastructure, public IaaS users consume these services as needed and pay based on usage. + +* **Platform as a Service (PaaS)** allows users to develop, test, manage, and run applications and servers. These include the operating system, middleware, web servers, database, and so forth. Public PaaS provides users with predefined services in the form of templates that can be easily deployed and replicated, instead of manually implementing and configuring infrastructure. + +* **Software as a Service (SaaS)** delivers software through the internet. Users can consume these services under a subscription or license model or at the account level, where they are billed as active users. SaaS software is low cost, low maintenance, painless to upgrade, and reduces the burden of buying new hardware, software, or bandwidth to support growth. + +### Private cloud infrastructure: + +* Private **IaaS and PaaS** are hosted in isolated data centers and integrated with public clouds that can consume the infrastructure and services available in remote data centers. This enables a private cloud owner to leverage public cloud infrastructure to expand applications and utilize their compute, storage, networking, and so forth across the globe. + +* **SaaS** is completely monitored, managed, and controlled by public cloud providers. SaaS is generally not shared between public and private cloud infrastructure and remains a service provided through a public cloud. + +### Cloud orchestration and automation tools: + +A cloud orchestration tool is necessary for planning and coordinating private and public cloud instances. This tool should inherit intelligence, including the capability to streamline processes and automate repetitive tasks. Further, an integrated automation tool is responsible for automatically scaling up and scaling out when a set threshold is crossed, as well as performing self-healing if any fractional damage or downtime occurs. + +### System and configuration management tools: + +In a hybrid cloud, system and configuration tools, such as [Foreman][13], manage the complete lifecycles of the virtual machines provisioned in private and public cloud data centers. These tools give system administrators the power to easily control users, roles, deployments, upgrades, and instances and to apply patches, bugfixes, and enhancements in a timely manner. Including [Puppet][14] in the Foreman tool enables administrators to manage configurations and define a complete end state for all provisioned and registered hosts. + +### Hybrid cloud features + +The hybrid cloud makes sense for most organizations because of these key features: + +* **Scalability:** In a hybrid cloud, integrated private and public cloud instances share a pool of compute resources for each provisioned instance. This means each instance can scale up or out anytime, as needed. + +* **Rapid response:** Hybrid clouds' elasticity supports rapid bursting of instances in the public cloud when private cloud resources exceed their threshold. This is especially valuable when peaks in demand produce significant and variable increases in load and capacity for a running application (e.g., online retailers during the holiday shopping season). + +* **Reliability:** Organizations can choose among public cloud providers based on the cost, efficiency, security, bandwidth, etc. that match their needs. In a hybrid cloud, organizations can also decide where to store sensitive data and whether to expand instances in a private cloud or to expand geographically through public infrastructure. Also, the hybrid model's ability to store data and configurations across multiple sites supports backup, disaster recovery, and high availability. + +* **Management:** Managing networking, storage, instances, and/or data can be tedious in non-integrated cloud environments. Traditional orchestration tools, in comparison to hybrid tools, are extremely modest and consequently limit decision making and automation for complete end-to-end processes and tasks. With hybrid cloud and an effective management application, you can keep track of every component as their numbers grow and, by regularly optimizing those components, minimize annual expense.  + +* **Security:** Security and privacy are critical when evaluating whether to place applications and data in the cloud. The IT department must verify all compliance requirements and deployment policies. Security in the public cloud is improving and continues to mature. And, in the hybrid cloud model, organizations can store highly sensitive information in the private cloud and integrate it with less sensitive data stored in the public cloud. + +* **Pricing:** Cloud pricing is generally based on the infrastructure and service level agreement required. In the hybrid cloud model, users can compare costs at a granular level for compute resources (CPU/memory), bandwidth, storage, networking, public IP address, etc. Prices are either fixed or variable and can be metered monthly, hourly, or even per second. Therefore, users can always shop for the best pricing among public cloud providers and deploy their instances accordingly. + +### Where hybrid cloud is today + +Although there is a large and growing demand for public cloud offerings and migrating systems from on-premises to the public cloud, most large organizations remain concerned. Most still keep critical applications and data in corporate data centers and legacy systems. They fear losing control, security threats, data privacy, and data authenticity in public infrastructure. Because hybrid cloud minimizes these problems and maximizes benefits, it's the best solution for most large organizations. + +### Where we'll be five years from now + +I expect that the hybrid cloud model will be highly accepted globally, and corporate "no-cloud" policies will be rare, within only a handful of years. Here is what else I think we will see: + +* Since hybrid cloud acts as a shared responsibility, there will be increased coordination between corporate and public cloud providers for implementing security measures to curb cyber attacks, malware, data leakage, and other threats. + +* Bursting of instances will be rapid, so customers can spontaneously meet load requirements or perform self-healing. + +* Further, orchestration or automation tools (such as [Ansible][8]) will play a significant role by inheriting intelligence for solving critical situations. + +* Metering and the concept of "pay-as-you-go" will be transparent to customers, and tools will enable users to make decisions by monitoring fluctuating prices, safely destroy existing instances, and provision new instances to get the best available pricing. + +What predictions do you have for hybrid cloud—and cloud computing in general—over the next five years? Please share your opinions in the comments. + +-------------------------------------------------------------------------------- + +作者简介: + +Amit Das - Amit works as an engineer in Red Hat, and is passionate about Linux, Cloud computing, DevOps etc. He is a strong believer that new innovation and technology, in a open way which makes world more open, can positively impact the society and change many lives. + + + +----------------- + +via: https://opensource.com/article/17/7/what-is-hybrid-cloud + +作者:[Amit Das ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/amit-das +[1]:https://opensource.com/resources/cloud?src=cloud_resource_menu1 +[2]:https://opensource.com/resources/what-is-openstack?src=cloud_resource_menu2 +[3]:https://opensource.com/resources/what-is-kubernetes?src=cloud_resource_menu3 +[4]:https://opensource.com/16/12/yearbook-why-operating-system-matters?src=cloud_resource_menu4 +[5]:https://opensource.com/business/16/10/interview-andy-cathrow-anchore?src=cloud_resource_menu5 +[6]:https://opensource.com/file/364211 +[7]:https://opensource.com/article/17/7/what-is-hybrid-cloud?rate=TwB_2KyXM7iqrwDPGZpe6WultoCajdIVgp8xI4oZkTw +[8]:https://opensource.com/life/16/8/cloud-ansible-gateway +[9]:https://opensource.com/user/157341/feed +[10]:https://opensource.com/users/jason-baker +[11]:https://creativecommons.org/licenses/by-sa/4.0/ +[12]:https://opensource.com/resources/openstack +[13]:https://github.com/theforeman +[14]:https://github.com/theforeman/puppet-foreman +[15]:https://opensource.com/users/amit-das +[16]:https://opensource.com/users/amit-das From f4ffe570b0db98518862d3da3cb2b541398984a0 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 13:37:09 +0800 Subject: [PATCH 0773/1407] =?UTF-8?q?20170726-7=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...70705 IoT Fuels Growth of Linux Malware.md | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 sources/tech/20170705 IoT Fuels Growth of Linux Malware.md diff --git a/sources/tech/20170705 IoT Fuels Growth of Linux Malware.md b/sources/tech/20170705 IoT Fuels Growth of Linux Malware.md new file mode 100644 index 0000000000..369c1a6e00 --- /dev/null +++ b/sources/tech/20170705 IoT Fuels Growth of Linux Malware.md @@ -0,0 +1,99 @@ +IoT Fuels Growth of Linux Malware +============================================================ +![linus-iot-security](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2016-internet-of-things-1.jpg) + +![](http://www.linuxinsider.com/images/2015/image-credit-adobe-stock_130x15.gif) + +![](http://www.linuxinsider.com/images/2008/atab.gif) + +[**Managing Your Intellectual Property Integrity During M&A Transactions**][7] +[][8]Flexera Software presents best practices and methodology for the technical due diligence auditing process. +**[Download the White Paper][3]** + +Malware targeting Linux systems is growing, largely due to a proliferation of devices created to connect to the Internet of Things. + +That is one of the findings in a report [WatchGuard Technologies][4], a maker of network security appliances, released last week. + +The report, which analyzes data gathered from more than 26,000 appliances worldwide, found three Linux malware programs in the top 10 for the first quarter of the year, compared with only one during the previous period. + +"Linux attacks and malware are on the rise," wrote WatchGuard CTO Corey Nachreiner and Security Threat Analyst Marc Laliberte, coauthors of the report. "We believe this is because systemic weaknesses in IoT devices, paired with their rapid growth, are steering botnet authors towards the Linux platform." + +However, "blocking inbound Telnet and SSH, along with using complex administrative passwords, can prevent the vast majority of potential attacks," they suggested. + +### New Avenue for Hackers + +Linux malware began growing at the end of last year with the Mirai botnet, observed Laliberte. Mirai made a splash in September when it was used to attack part of the Internet's infrastructure and knock millions of users offline. + +"Now, with IoT devices skyrocketing, a whole new avenue is opening up to attackers," he told LinuxInsider. "It's our belief that the rise we're seeing in Linux malware is going hand in hand with that new target on the Internet." + +Makers of IoT devices haven't been showing a great deal of concern about security, Laliberte continued. Their goals are to make their devices work, make them cheap, and make them quickly. + +"They really don't care about security during the development process," he said. + +### Trivial Pursuits + +Most IoT manufacturers use stripped down versions of Linux because the operating system requires minimal system resources to operate, said Paul Fletcher, cybersecurity evangelist at [Alert Logic][5]. + +"When you combine that with the large quantity of IoT devices being connected to the Internet, that equals a large volume of Linux systems online and available for attack," he told LinuxInsider. + +In their desire to make their devices easy to use, manufacturers use protocols that are also user-friendly for hackers. + +"Attackers can gain access to these vulnerable interfaces, then upload and execute the malicious code of their choice," Fletcher said. + +Manufacturers frequently have poor default settings for their devices, he pointed out. + +"Often, admin accounts have blank passwords or easy-to-guess default passwords, such as 'password123,'" Fletcher said. + +The security problems often are "nothing Linux-specific per se," said Johannes B. Ullrich, chief research officer at the [SANS Institute][6]. + +"The manufacturer is careless on how they configured the device, so they make it trivial to exploit these devices," he told LinuxInsider. + +### Malware in Top 10 + +These Linux malware programs cracked the top 10 in WatchGuard's tally for the first quarter: + +* Linux/Exploit, which catches several malicious trojans used to scan systems for devices that can be enlisted into a botnet. + +* Linux/Downloader, which catches malevolent Linux shell scripts. Linux runs on many different architectures, such as ARM, MIPS and traditional x86 chipsets. An executable compiled for one architecture will not run on a device running a different one, the report explains. Thus, some Linux attacks exploit dropper shell scripts to download and install the proper malicious components for the architecture they are infecting. + +* Linux/Flooder, which catches Linux distributed-denial-of-service tools, such as Tsunami, used to perform DDoS amplification attacks, as well as DDoS tools used by Linux botnets like Mirai. "As the Mirai botnet showed us, Linux-based IoT devices are a prime target for botnet armies," the report notes. + +### Web Server Battleground + +A shift in how adversaries are attacking the Web has occurred, the WatchGuard report notes. + +At the end of 2016, 73 percent of Web attacks targeted clients -- browsers and supporting software, the company found. That radically changed during the first three months of this year, with 82 percent of Web attacks focused on Web servers or Web-based services. + +"We don't think drive-by download style attacks will go away, but it appears attackers have focused their efforts and tools on trying to exploit Web server attacks," report coauthors Nachreiner and Laliberte wrote. + +There's been a decline in the effectiveness of antivirus software since the end of 2016, they also found. + +"For the second quarter in a row, we have seen our legacy AV solution miss a lot of malware that our more advanced solution can catch. In fact, it has gone up from 30 percent to 38 percent," Nachreiner and Laliberte reported. + +"Nowadays, cyber criminals use many subtle tricks to repack their malware so that it evades signature-based detection," they noted. "This is why so many networks that use basic AV become victims of threats like ransomware." + +-------------------------------------------------------------------------------- + +作者简介: + +John P. Mello Jr. has been an ECT News Network reporter since 2003. His areas of focus include cybersecurity, IT issues, privacy, e-commerce, social media, artificial intelligence, big data and consumer electronics. He has written and edited for numerous publications, including the Boston Business Journal, the Boston Phoenix, Megapixel.Net and Government Security News. Email John. + +------------- + +via: http://www.linuxinsider.com/story/84652.html + +作者:[John P. Mello Jr ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:john.mello@newsroom.ectnews.com +[1]:http://www.linuxinsider.com/story/84652.html?rss=1# +[2]:http://www.linuxinsider.com/perl/mailit/?id=84652 +[3]:http://www.linuxinsider.com/story/84652.html?rss=1 +[4]:http://www.watchguard.com/ +[5]:http://www.alertlogic.com/ +[6]:http://www.sans.org/ +[7]:http://www.linuxinsider.com/story/84652.html?rss=1 +[8]:http://www.linuxinsider.com/story/84652.html?rss=1 From f8d4b4e36fb64ac55ab3890d716366d3001379c0 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 13:39:08 +0800 Subject: [PATCH 0774/1407] =?UTF-8?q?20170726-8=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ers Up Cloud Server Workstation Systems.md | 138 ++++++++++++++++++ 1 file changed, 138 insertions(+) create mode 100644 sources/tech/20170715 Fedora 26 Powers Up Cloud Server Workstation Systems.md diff --git a/sources/tech/20170715 Fedora 26 Powers Up Cloud Server Workstation Systems.md b/sources/tech/20170715 Fedora 26 Powers Up Cloud Server Workstation Systems.md new file mode 100644 index 0000000000..fa86a0c588 --- /dev/null +++ b/sources/tech/20170715 Fedora 26 Powers Up Cloud Server Workstation Systems.md @@ -0,0 +1,138 @@ +Fedora 26 Powers Up Cloud, Server, Workstation Systems +============================================================ + + +[**What Every CSO Must Know About Open Source | Download the White Paper**][9] +[][10]Flexera Software shares application security strategies for security and engineering teams to manage open source. +**[Download Now!][3]** + +The [Fedora Project][4] this week announced the general availability of Fedora 26, the latest version of the fully open source Fedora operating system. + +![Fedora 26 Powers Up Cloud, Server, Workstation Systems](http://www.linuxinsider.com/ai/631127/fedora.jpg) + +Fedora Linux is the community version of Red Hat Enterprise Linux, or RHEL. Fedora 26 comprises a set of base packages that form the foundation of three distinct editions targeting different users. + +Fedora Atomic Host edition is an operating system for running container-based workloads. Fedora Server edition installs the Fedora Server OS on a hard drive. Fedora Workstation edition is a user-friendly operating system for laptops and desktop computers, suitable for a broad range of users -- from hobbyists and students to professionals in corporate environments. + +All three editions share a common base and some common strengths. All of the Fedora editions are released twice a year. + +The Fedora Project is a testing ground for innovations and new features. Some will be implemented in upcoming releases of RHEL, said Matthew Miller, Fedora Project Leader. + +"Fedora is not directly involved in those productization decisions," he told LinuxInsider. "Fedora provides a look at many ideas and technologies, and it is a great place for Red Hat Enterprise Linux customers to get involved and provide feedback." + +### Package Power + +The Fedora developers updated and improved the packages powering all three editions. They made numerous bug fixes and performance tweaks in Fedora 26 to provide an enhanced user experience across Fedora's use cases. + +These packages include the following improvements: + +* Updated compilers and languages, including GNU Compiler Collection 7, Go 1.8, Python 3.6 and Ruby 2.4; + +* DNF 2.0, the latest version of Fedora's next-generation package management system with improved backward compatibility with Yum; + +* A new storage configuration screen for the Anaconda installation program, which enables bottom-up configuration from devices and partitions; and + +* Fedora Media Writer updates that enable users to create bootable SD cards for ARM-based devices, like Raspberry Pi. + +The cloud tools are essential to users with a cloud presence, especially programmers, noted Roger L. Kay, president of [Endpoint Technologies Associates][5]. + +"Kubernetes is essential for programmers interested in writing from the hybrid cloud, which is arguably one of the more important developments in the industry at the moment," he told LinuxInsider. "Cloud -- public, private and hybrid -- is key to the future of enterprise computing." + +### Fedora 26 Atomic Host Makeover + +Linux containers and container orchestration engines have been expanding in popularity. Fedora 26 Atomic Host offers a minimal-footprint operating system tailored for running container-based workloads across environments, from bare metal to the cloud. + +Fedora 26 Atomic Host updates are delivered roughly every two weeks, a schedule that lets users keep pace with upstream innovation. + +Fedora 26 Atomic Host is available for Amazon EC2\. Images for OpenStack, Vagrant, and standard installer ISO images are available on the [Fedora Project][6]website. + +A minimal Fedora Atomic container image also made its debut with Fedora 26. + +### Cloud Hosting + +The latest release brings new capabilities and features to Fedora 26 Atomic Host: + +* Containerized Kubernetes as an alternative to built-in Kubernetes binaries, enabling users to run different versions of the container orchestration engine more easily; + +* The latest version of rpm-ostree, which includes support for direct RPM install, a reload command, and a clean-up command; + +* System Containers, which provide a way of installing system infrastructure software, like networking or Kubernetes, on Fedora Atomic Host in a container; and + +* Updated versions of Docker, Atomic and Cockpit for enhanced container building, system support and workload monitoring. + +Containerizing Kubernetes is important for Fedora Atomic Host for two big reasons, according to the Fedora Project's Miller. + +"First, it lets us remove it from the base image, reducing the size and complexity there," he explained. "Second, providing it in a container makes it easy to swap in different versions without disrupting the base or causing trouble for people who are not ready for a change quite yet." + +### Server-Side Services + +Fedora 26 Server provides a flexible, multi-role platform for data center operations. It also allows users to customize this edition of the Fedora operating system to fit their unique needs. + +New features for Fedora 26 Server include FreeIPA 4.5, which improves running the security information management solution in containers, and SSSD file caching to speed up the resolution of user and group queries. + +Fedora 26 Server edition later this month will add a preview of Fedora's modularity technology delivered as "Boltron." As a modular operating system, Boltron enables different versions of different applications to run on the same system, essentially allowing for leading-edge runtimes to be paired with stable databases. + +### Workstation Workout + +Among the new tools and features for general users is updated GNOME desktop functionality. Devs will get enhanced productivity tools. + +Fedora 26 Workstation comes with GNOME 3.24 and numerous updated functionality tweaks. Night Light subtly changes screen color based on time of day to reduce effect on sleep patterns. [LibreOffice][7] 5.3 is the latest update to the open source office productivity suite. + +GNOME 3.24 provides mature versions of Builder and Flatpak to give devs better application development tools for easier access across the board to a variety of systems, including Rust and Meson. + +### Not Just for Devs + +The inclusion of updated cloud tools in a Linux distro targeting enterprise users is significant, according to Scott Sellers, CEO of [Azul Systems][8]. + +"The cloud is a primary development and production platform for emerging companies, as well as some of the largest enterprises on the planet," he told LinuxInsider. + +"Given the cutting-edge nature of the Fedora community, we would expect a strong cloud focus in any Fedora release, and Fedora 26 does not disappoint," Sellers said. + +The other feature set of immediate interest to the Fedora developer and user community is the work the Fedora team did in terms of modularity, he noted. + +"We will be looking at these experimental features closely," Sellers said. + +### Supportive Upgrade Path + +Users of Fedora, more than users of other Linux distros, have a vested interest in upgrading to Fedora 26, even if they are not heavy cloud users, according to Sellers. + +"One of the primary advantages of this distro is to get an early look at production-grade advanced technologies that [eventually] will be integrated into RHEL," he said. "Early reviews of Fedora 26 suggest that it is very stable, with lots of bug fixes as well as performance enhancements." + +Users interested in upgrading from earlier Fedora editions may find an easier approach than wiping existing systems to install Fedora 26, noted Fedora's Miller. Fedora maintains two releases at a time, plus a month of overlap. + +"So, if you are on Fedora 24, you should upgrade in the next month," he said. "Happy Fedora 25 users can take their time. This is one of the advantages of Fedora over fast-moving rolling releases." + +### Faster Delivery + +Users can schedule their own upgrades rather than having to take them when the distro makes them. + +That said, users of Fedora 23 or earlier should upgrade soon. The community no longer produces security updates for those releases. + +-------------------------------------------------------------------------------- + +作者简介: + +Jack M. Germain has been an ECT News Network reporter since 2003. His main areas of focus are enterprise IT, Linux and open source technologies. He has written numerous reviews of Linux distros and other open source software. Email Jack. + + +--------------- + +via: http://www.linuxinsider.com/story/84674.html + +作者:[ Jack M. Germain][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:jack.germain@newsroom.ectnews.comm +[1]:http://www.linuxinsider.com/story/84674.html?rss=1# +[2]:http://www.linuxinsider.com/perl/mailit/?id=84674 +[3]:http://www.linuxinsider.com/story/84674.html?rss=1 +[4]:https://getfedora.org/ +[5]:http://www.ndpta.com/ +[6]:https://getfedora.org/ +[7]:http://www.libreoffice.org/ +[8]:https://www.azul.com/ +[9]:http://www.linuxinsider.com/story/84674.html?rss=1 +[10]:http://www.linuxinsider.com/story/84674.html?rss=1 From ea7219f5f3f841c3dffea9245502bfa385e88650 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 13:40:49 +0800 Subject: [PATCH 0775/1407] =?UTF-8?q?20170726-9=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ersial Open Container Industry Standard.md | 130 ++++++++++++++++++ 1 file changed, 130 insertions(+) create mode 100644 sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md diff --git a/sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md b/sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md new file mode 100644 index 0000000000..2f28ccf5c5 --- /dev/null +++ b/sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md @@ -0,0 +1,130 @@ +CoreOS, OCI Unveil Controversial Open Container Industry Standard +============================================================ +![coreos-oci-open-container-industry-standard](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2017-core-os-1.jpg) + + +[**Managing Your Intellectual Property Integrity During M&A Transactions**][12] +[][13]Flexera Software presents best practices and methodology for the technical due diligence auditing process. +**[Download the White Paper][3]** + +[CoreOS][4] and the [Open Container Initiative][5] on Wednesday introduced image and runtime specifications largely based on Docker's image format technology. + +However, OCI's decision to model the standard on Docker's de facto platform has raised questions. Some critics have argued for other options. + +Version 1.0 provides a stable standard for application containers, according to Brandon Philips, CTO at CoreOS and chair of the OCI Technical Oversight Board. + +Having a standard created by industry leaders should spur OCI partners to develop further standards and innovation, he said. + +Reaching the 1.0 mark means that the OCI Runtime Spec and the OCI Image Format Spec now are ready for broad use. Further, this achievement will push the OCI community to help stabilize a growing market of interoperable pluggable tools, Philips added. + +The industry-supported standards also will provide a sense of confidence that containers are here to stay, he said, and that Kubernetes users can expect future support. + +"The outcome is really good. The certification process is under way now," Philips told LinuxInsider. + +### Collaboration Challenges + +Open standards are key to the success of the container ecosystem, said Philips, and the best way to achieve standards is by working closely with the community. However, reaching agreement on version 1.0 was more time consuming than expected. + +"Early on, the biggest challenge was coming to terms with the model of how the project releases would work and how to get the project off the ground," Philips recalled. "Everyone underestimated how much time that would take." + +Coalition members dealt with mismatched expectations about what they wanted to do, he said, but in the last year or so, the group got the referencing expectations done and more testing came through. + +### Quest for Standards + +CoreOS officials began discussing the idea for an industry-approved open standard for the container image and runtime specifications several years ago. That early quest led to the realization that agreeing on a standard image format was critical, Phillips said. + +CoreOS and container technology creator [Docker][6] announced OCI's formation in June 2015\. The coalition started with 21 industry leaders forming the Open Container Project (OCP) as a non-profit organization seeking minimal common standards for software containers for cloud storage. + +The coalition includes leaders in the container industry -- among them, Docker, Microsoft, Red Hat, IBM, Google and The Linux Foundation. + +OCI's goal is to give high confidence to application developers that the software deployed in their containers will continue to work when newer specifications come out and people develop new tools. That confidence must be met for both proprietary and open source software. + +It does not matter if the tools and applications are proprietary or open source. With the specifications in place, the products can be designed to work with any container configuration, Philips said. + +"You need a conscious effort to create standards outside of people writing code. It is a separate effort," he added. + +As part of the coalition, Docker donated its de facto image format standard technology to the OCP. + +It included the company's container format, runtime code and specifications. Work on creating an Open Container Initiative Image Specification began last year. + +The standards milestone gives container users the capability to develop, package and sign application containers. They also can run the containers in a variety of container engines, noted Philips. + +### A Choice of One? + +The coalition faced two ways to pursue open standards, observed Charles King, principal analyst at [Pund-IT][7]. The first option was to gather like-minded people to hash out differences and build standards from scratch. + +The coalition members seemed to settle for the second option, which involved adopting a powerful, market leading platform as an effective standard, he said. + +"Docker's contributions to The [Linux Foundation][8] put the OCI firmly on the second path -- but those who are concerned about Docker's approach or its market position may feel there are better options," King told LinuxInsider. + +In fact, one OCI member -- CoreOS -- leveled some strong criticism of the group's general direction at the beginning of the effort, he said, "so it will be interesting to see how V1.0 does/doesn't address those concerns." + +### Faster Path + +Docker's widely deployed runtime implementation is a suitable foundation for building an open standard. It already was a defacto standard, according to David Linthicum, senior vice president at [Cloud Technology Partners][9]. + +"It's also important that we get this working for us quickly. The waves of standards meetings, dealing with politics and things such as that, just waste time," he told LinuxInsider. + +Right now, though, there are no better options, Linthicum added. + +The runtime Docker uses is runC, which is an implementation of the OCI runtime standard, according to Joe Brockmeier, senior evangelist for Linux Containers at Red Hat. + +"So, runC is a suitable foundation for a runtime standard, yes. It is broadly accepted and forms the basis for most container implementations today," he told LinuxInsider. + +OCI is far more than Docker. While Docker did commit the underlying code from which the OCI specification is derived, the lineage stops there, said Brockmeier, and no truly viable alternatives exist. + +### Docking the Question + +Adopting an industry-wide standard likely will simplify and speed container adoption and management for many companies, suggested Pund-IT's King. It also is likely that some key vendors will continue to focus on their own proprietary container technologies. + +"They'll argue that theirs is a superior path -- but that will effectively prevent the OCI from achieving market-wide leadership," he said. "Starting out with a standard that's more or less complete, as OCI has, may not perfectly please everyone, but it's likely to move forward to completion more quickly and effectively than other options." + +Containers have standardized deployment to cloud, with Docker clearly leading the way, said Marko Anastasov, cofounder of [Semaphore][10]. + +Docker's de facto standard container does represent the best foundation for developing an open standard, he said. + +"How Docker's commercial interests will influence the scale of its involvement in OCI remains to be seen," he told LinuxInsider. + +### Opposing Viewpoint + +An open standard is not the end-all for adopting more containers in cloud deployment, contended Nic Cheneweth, principal consultant with[ThoughtWorks][11]. A better approach is to look at the impact of the server virtualization segment of the IT industry. + +"The principal driver for continued growth and widespread adoption was not in the statement of an industry standard but in the potential and realized efficiencies obtained by use of any of the competing technologies, such as VMware, Xen, etc.," Cheneweth told LinuxInsider. + +Aspects of container technology, such as the container itself, lend themselves to definition of a standard. Until then, healthy competition guided by deep open source software involvement will contribute to be a better standard, he said. + +A standard around the orchestration of containers is not particularly important to the continued growth of the space, according to Cheneweth. + +However, if the industry insists on locking into a de facto container standard, the model OCI chose is a good starting point, he said. "I don't know that better options are available, but certainly worse ones exist." + +-------------------------------------------------------------------------------- + +作者简介: + +Jack M. Germain has been an ECT News Network reporter since 2003. His main areas of focus are enterprise IT, Linux and open source technologies. He has written numerous reviews of Linux distros and other open source software. Email Jack. + + +---- + +via: http://www.linuxinsider.com/story/84689.html + +作者:[Jack M. Germain ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:jack.germain@newsroom.ectnews.comm +[1]:http://www.linuxinsider.com/story/84689.html?rss=1# +[2]:http://www.linuxinsider.com/perl/mailit/?id=84689 +[3]:http://www.linuxinsider.com/story/84689.html?rss=1 +[4]:https://coreos.com/ +[5]:https://www.opencontainers.org/ +[6]:https://www.docker.com/ +[7]:http://www.pund-it.com/ +[8]:http://www.linuxfoundation.org/ +[9]:https://www.cloudtp.com/ +[10]:http://www.semaphoreci.com/ +[11]:https://www.thoughtworks.com/ +[12]:http://www.linuxinsider.com/story/84689.html?rss=1 +[13]:http://www.linuxinsider.com/story/84689.html?rss=1 From 1dfa0c9fb979fa4d4350f1246f10a252b12e2484 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 13:43:35 +0800 Subject: [PATCH 0776/1407] =?UTF-8?q?20170126-10=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...rchy Standard Shows Which Bits Are Boss.md | 99 +++++++++++++++++++ 1 file changed, 99 insertions(+) create mode 100644 sources/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md diff --git a/sources/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md b/sources/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md new file mode 100644 index 0000000000..c60de652f5 --- /dev/null +++ b/sources/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md @@ -0,0 +1,99 @@ +The Filesystem Hierarchy Standard Shows Which Bits Are Boss +============================================================ +![linux](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2016-linux-1.jpg) + + +[**The State of Open Source Software: Year in Review | Webinar**][5] +[][6]Flexera Software's VP of Product Management discusses the compliance and vulnerability events and trends from 2016 impacting organizations using open source software.  +**[Watch Now!][3]** + +If you've ever been curious enough to look through your system's root directory ("/"), you may have found yourself a little overwhelmed. Most of the three-letter directory names don't tell you much about what they do, and if you ever needed to make important modifications, it would be tough to know where to look. + +I'd like to take those of you who haven't ventured much into your root directory on a brief tour. + +### Helpful Tools + +Before we embark, here are a couple of tools that are worth getting familiar with, as they will allow you to dig through anything interesting you find on your own later. None of these programs will make any changes to your files. + +The most useful tool is "ls" -- it lists the contents of any directory given with a full or relative path (i.e., one starting from the current directory) as an argument. + +$ ls  _path_ + +As you progress deeper into the filesystem, it might get cumbersome to type long paths repeatedly, so if you get to that point, you can replace "ls" with "cd" to change the current working directory (the one your terminal is currently "in") to that directory. As with "ls", just give "cd" a directory path as an argument. + +$ cd  _path_ + +If you're not sure what kind of file something is, use the "file" command on it by running "file" and the filename as an argument. + +$ file  _filename_ + +Finally, if the file seems like it could be human-readable, use "less" to look at it (again, with no fear of making changes). As with the last tool, give a filename as an argument to view it. + +$ less  _filename_ + +When you're done scanning through the file, hit "q" to quit, which returns you to your terminal. + +### Root Directory Road Trip + +Now we can begin our journey. I'm going to proceed in alphabetical order through the directories directly within the root directory. This is by no means an exhaustive catalog, but by the end, we will have hit the highlights. + +All of the classifications and functions of the directories we will go over are based on the Linux Filesystem Hierarchy Standard, or FHS. The Linux FHS, maintained by the [Linux Foundation][4], assists designers and developers of distributions and programs by structuring where the various components of their tools should go. + +By keeping all of the files, binaries, and manuals in a consistent organization across programs, the FHS makes learning, debugging, or modifying them much easier. Imagine how tedious it would be if instead of using the "man" command to find usage guides, you had to hunt for the manual for every program. + +Alphabetically, and structurally, it is fitting that we start with **"/bin"**. This directory is where all the core system binary files containing commands for the shell (the program that interprets terminal instructions) are found. Without the contents of this directory, your system wouldn't do much. + +Next is the **"/boot"** directory, where all the stuff your computer needs to boot up is stored. Among these things, the most important ones are your bootloader and kernel. The bootloader is the program that initializes a few basic utilities to allow the boot process to continue. At the end of its initialization, the bootloader loads the kernel, which allows the computer to interface with all other hardware and firmware. From this point, it can proceed to bring the entire operating system online. + +The **"/dev"** directory is where file-like objects representing everything your system recognizes as a "device" are stored. These includes obvious devices such as the hardware components of your computer: your keyboard, screen, hard drive, etc. + +Additionally, "/dev" contains pseudo-files signifying streams of data that your system treats as "devices." One example is the data that goes in and out of your terminal, which is divided into three "streams." Information it reads coming in is called "standard input." The output of commands or processes is "standard output." Finally, an auxiliary output classified as debugging information is directed to "standard error." Terminals themselves are also found as files here. + +**"/etc"** (pronounced like the craft commerce site "Etsy," if you want to impress Linux veterans), is where many programs store their configuration files, which are used to change their settings. Some programs store copies of default configurations here, which are to be copied to another location before modification. Others store the one and only copy of the configuration here and expect users to modify it directly. Many programs reserved for the root user depend on this latter mode of configuration. + +The **"/home"** directory is where users' personal files reside. For desktop users, this is where you spend most of your time. For every unprivileged user, there is a directory with corresponding name here. + +**"/lib"** is home to the many libraries that your system depends on to run. Many programs employ one or more functions or subroutines that are common across dozens or hundreds of programs. So, instead of each program reproducing every component it needs within its binary, which would result in comparatively massive and inefficient programs, it references one or more of these libraries by making a "library call." + +Removable media like USB flash drives or cameras are made accessible in the **"/media"** directory. While it is not present on all systems, it is common in distributions specializing in intuitive desktop systems, like Ubuntu. Media that has storage is "mounted" here, meaning that while the raw stream of bits from the device are found under "/dev", the file objects that users usually interact with are accessible here. + +The **"/proc"** directory is a virtual filesystem that dynamically displays system data. What this means is that the system creates the contents of "/proc" on the fly, populating it with files that hold information about the system (such as hardware statistics) that is generated by virtue of running. + +**"/tmp"** is, aptly enough, where temporary information like cached data is sent. There's really not much more to it than that. + +Most program binaries on modern Linux systems are kept in the **"/usr"**directory. To unify the various directories containing binaries, "/usr" contains a copy of everything in "/bin", "/sbin", and "/lib". + +Finally, **"/var"** is where data of "variable" length is kept. The kind of variable-length data found here is generally data that is expected to keep accumulating, like logs and caches. One example is the log your kernel keeps. + +To keep your hard drive from filling up and crashing, "/var" has a built in "log rotate" function that deletes old information to make room for new information, maintaining a fixed maximum size. + +### Poke Around + +As I said, this is definitely not everything you'll find in the root directory, but it is a good start toward figuring out where your system's core functions reside -- and, moreover, what those functions are. + +So, if you weren't sure what there was to learn, you probably have plenty of ideas now. If you want an even better idea, poke around in these directories for yourself! + +-------------------------------------------------------------------------------- + +作者简介: + +Jonathan Terrasi has been an ECT News Network columnist since 2017. His main interests are computer security (particularly with the Linux desktop), encryption, and analysis of politics and current affairs. He is a full-time freelance writer and musician. His background includes providing technical commentaries and analyses in articles published by the Chicago Committee to Defend the Bill of Rights. + +------ + + +via: http://www.linuxinsider.com/story/84658.html + +作者:[Jonathan Terrasi ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.linuxinsider.com/perl/mailit/?id=84658 +[1]:http://www.linuxinsider.com/story/84658.html?rss=1# +[2]:http://www.linuxinsider.com/perl/mailit/?id=84658 +[3]:http://www.linuxinsider.com/story/84658.html?rss=1 +[4]:http://www.linuxfoundation.org/ +[5]:http://www.linuxinsider.com/story/84658.html?rss=1 +[6]:http://www.linuxinsider.com/story/84658.html?rss=1 From ebeb9c8fa465e0f3d4094f00804cfea1dea282e3 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 13:48:54 +0800 Subject: [PATCH 0777/1407] =?UTF-8?q?20170726-11=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... Linux Kernel 4.12 Stable on Linux Mint.md | 60 +++++++++++++++++++ 1 file changed, 60 insertions(+) create mode 100644 sources/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md diff --git a/sources/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md b/sources/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md new file mode 100644 index 0000000000..6100fa02eb --- /dev/null +++ b/sources/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md @@ -0,0 +1,60 @@ +Install Linux Kernel 4.12 (Stable) on Linux Mint +============================================================ + +![Install Linux Kernel 4.12 (Stable) on Linux Mint](https://mintguide.org/uploads/tux_system.jpg) + +**Linus Torvalds** introduced the **[Linux][5] [kernel][6] 4.12**. You can download the relevant **deb**packages from **[HERE][7]** and install them. Or just follow the instructions given below that will help you to install a new kernel. + + _**Warning. The [Linux][1] [kernel][2] is a critical element of the system. To do the upgrade costs when one of your hardware devices is not working properly, and the new kernel may fix this problem. But at the same time installing a new kernel unnecessarily can lead to undesirable regressions, such as: no network connection, no sound or even the inability to boot the system, so install a new kernel on your own risk.**_ + +The easiest way to install any kernel - program [UKUU][8]Install UKUU on **[Linux Mint][9].** + +``` +TerminalShekin@mylinuxmintpc~$sudo apt-add-repository -y ppa:teejee2008/ppa +sudo apt-get update +sudo apt-get install ukuu +``` + +**Reminder  _to users of computers with [Nvidia][3]/AMD. Before installing the kernel, it is advisable to switch to the free driver._** + +**If you decide to delete the kernel 4.12,** + +1. When the computer boots, the [GRUB][12] menu, select your old kernel. After booting the system, remove the new kernel by command below +2. Use program [UKUU][13] or command: +``` +TerminalShekin@mylinuxmintpc~$sudo apt purge linux-image-4.12-* +``` +3. And update **GRUB** or **[BURG][10]** +``` +TerminalShekin@mylinuxmintpc~$sudo update-grub +``` +To return to the previous kernel when booting **Grub** select **Previous Linux versions** +Good Luck!!! +[kernel.org][14] + +-------------------------------------------------------------------------------- + +via: https://mintguide.org/system/798-install-linux-kernel-4-12-stable-on-linux-mint.html + +作者:[Shekin ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://mintguide.org/user/Shekin/ +[1]:https://mintguide.org/ +[2]:https://mintguide.org/tags/kernel/ +[3]:https://mintguide.org/tags/nvidia/ +[4]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cDovL2tlcm5lbC51YnVudHUuY29tL35rZXJuZWwtcHBhL21haW5saW5lL3Y0LjEyLw%3D%3D +[5]:https://mintguide.org/ +[6]:https://mintguide.org/tags/kernel/ +[7]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cDovL2tlcm5lbC51YnVudHUuY29tL35rZXJuZWwtcHBhL21haW5saW5lL3Y0LjEyLw%3D%3D +[8]:https://mintguide.org/tools/691-ukuu-ubuntu-kernel-upgrade-utility.html +[9]:https://mintguide.org/ +[10]:https://mintguide.org/effects/716-burg-graphical-bootloader-install-to-linux-mint.html +[11]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly93d3cua2VybmVsLm9yZy8%3D +[12]:https://mintguide.org/tools/37-restore-grub-boot-loader-in-linux-mint-after-installation-reinstallation-windows.html +[13]:https://mintguide.org/tools/691-ukuu-ubuntu-kernel-upgrade-utility.html +[14]:https://mintguide.org/engine/dude/index/leech_out.php?a%3AaHR0cHM6Ly93d3cua2VybmVsLm9yZy8%3D +[15]:https://mintguide.org/system/ From 1a843227b2687fc77e210c9882331f5f14633270 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 13:51:42 +0800 Subject: [PATCH 0778/1407] =?UTF-8?q?20170726-12=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ontainer Docker Compose on Ubuntu 16.04.md | 171 ++++++++++++++++++ 1 file changed, 171 insertions(+) create mode 100644 sources/tech/20170628 Container Docker Compose on Ubuntu 16.04.md diff --git a/sources/tech/20170628 Container Docker Compose on Ubuntu 16.04.md b/sources/tech/20170628 Container Docker Compose on Ubuntu 16.04.md new file mode 100644 index 0000000000..cf1b398e82 --- /dev/null +++ b/sources/tech/20170628 Container Docker Compose on Ubuntu 16.04.md @@ -0,0 +1,171 @@ +Container: Docker Compose on Ubuntu 16.04 +============================================================ + + [![docker compose logo](https://www.unixmen.com/wp-content/uploads/2017/06/docker-compose-logo-696x1226.png "docker-compose-logo")][3] + +### What is Docker Compose + +[Docker Compose][4] is a tool for running multi-container Docker applications. To configure an application’s services with Compose we use a configuration file, and then, executing a single command, it is possible to create and start all the services specified in the configuration. + +Docker Compose is useful for many different projects like: + +* **Development**: with the Compose command line tools we create (and interact with) an isolated environment which will host the application being developed. + By using the [Compose file][2], developers document and configure all of the application’s service dependencies. + +* **Automated testing**: this use case requires an environment for running tests in. Compose provides a convenient way to manage isolated testing environments for a test suite. The full environment is defined in the Compose file. + +Docker Compose was made on the [Fig][5] source code, a community project now unused. + +In this tutorial we will see how to install Docker Compose on an Ubuntu 16.04 machine. + +### Install Docker + +We need Docker in order to install Docker Compose. First, add the public key for the official Docker repository: + +``` +$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add- +``` + +Next, add the Docker repository to `apt` sources list: + +``` +$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" +``` + +Update the packages database and install Docker with `apt`: + +``` +$ sudo apt-get update +$ sudo apt install docker-ce +``` + +At the end of the installation process, the Docker daemon should be started and enabled to load at boot time. We can check its status with the following command: + +``` +$ sudo systemctl status docker +--------------------------------- + +● docker.service - Docker Application Container Engine + Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) + Active: active (running) +``` + +### Install Docker Compose + +At this point it is possible to install Docker Compose. Download the current release by executing the following command: + +``` +# curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose +``` + +Make the downloaded binary executable: + +``` +# chmod +x /usr/local/bin/docker-compose +``` + +Check the Docker Compose version: + +``` +$ docker-compose -v +``` + +The output should be something like this: + +``` +docker-compose version 1.14.0, build c7bdf9e +``` + +### Testing Docker Compose + +The Docker Hub includes a Hello World image for demonstration purposes, illustrating the configuration required to run a container with Docker Compose. + +Create a new directory and move into it: + +``` +$ mkdir hello-world +$ cd hello-world +``` + +Create a new YAML file: + +``` +$ $EDITOR docker-compose.yml +``` + +In this file paste the following content: + +``` +unixmen-compose-test: + image: hello-world +``` + + _**Note:** the first line is used as part of the container name._ + +Save and exit. + +#### Run the container + +Next, execute the following command in the `hello-world` directory: + +``` +$ sudo docker-compose up +``` + +If everything is correct, this should be the output shown by Compose: + +``` +Pulling unixmen-compose-test (hello-world:latest)... +latest: Pulling from library/hello-world +b04784fba78d: Pull complete +Digest: sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f +Status: Downloaded newer image for hello-world:latest +Creating helloworld_unixmen-compose-test_1 ... +Creating helloworld_unixmen-compose-test_1 ... done +Attaching to helloworld_unixmen-compose-test_1 +unixmen-compose-test_1 | +unixmen-compose-test_1 | Hello from Docker! +unixmen-compose-test_1 | This message shows that your installation appears to be working correctly. +unixmen-compose-test_1 | +unixmen-compose-test_1 | To generate this message, Docker took the following steps: +unixmen-compose-test_1 | 1\. The Docker client contacted the Docker daemon. +unixmen-compose-test_1 | 2\. The Docker daemon pulled the "hello-world" image from the Docker Hub. +unixmen-compose-test_1 | 3\. The Docker daemon created a new container from that image which runs the +unixmen-compose-test_1 | executable that produces the output you are currently reading. +unixmen-compose-test_1 | 4\. The Docker daemon streamed that output to the Docker client, which sent it +unixmen-compose-test_1 | to your terminal. +unixmen-compose-test_1 | +unixmen-compose-test_1 | To try something more ambitious, you can run an Ubuntu container with: +unixmen-compose-test_1 | $ docker run -it ubuntu bash +unixmen-compose-test_1 | +unixmen-compose-test_1 | Share images, automate workflows, and more with a free Docker ID: +unixmen-compose-test_1 | https://cloud.docker.com/ +unixmen-compose-test_1 | +unixmen-compose-test_1 | For more examples and ideas, visit: +unixmen-compose-test_1 | https://docs.docker.com/engine/userguide/ +unixmen-compose-test_1 | +helloworld_unixmen-compose-test_1 exited with code 0 +``` + +Docker containers only run as long as the command is active, so the container will stop when the test finishes running. + +### Conclusion + +This concludes the tutorial about the installation of Docker Compose on an Ubuntu 16.04 machine. We have also seen how to create a simple project through the Compose file in YAML format. + +-------------------------------------------------------------------------------- + +via: https://www.unixmen.com/container-docker-compose-ubuntu-16-04/ + +作者:[ Giuseppe Molica][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.unixmen.com/author/tutan/ +[1]:https://www.unixmen.com/author/tutan/ +[2]:https://docs.docker.com/compose/compose-file/ +[3]:https://www.unixmen.com/wp-content/uploads/2017/06/docker-compose-logo.png +[4]:https://docs.docker.com/compose/overview/ +[5]:http://www.fig.sh/ From 759e11c5f8707b84f457cdea0ed42756d4be0162 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 13:53:29 +0800 Subject: [PATCH 0779/1407] =?UTF-8?q?20170726-13=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...nstall Zabbix on an Ubuntu 16.04 Server.md | 217 ++++++++++++++++++ 1 file changed, 217 insertions(+) create mode 100644 sources/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md diff --git a/sources/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md b/sources/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md new file mode 100644 index 0000000000..235fe15048 --- /dev/null +++ b/sources/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md @@ -0,0 +1,217 @@ +Monitoring Server: Install Zabbix on an Ubuntu 16.04 Server +============================================================ + + [![Zabbix logo](https://www.unixmen.com/wp-content/uploads/2017/06/zabbix_logo.png "zabbix_logo")][3] + +### Monitoring Server – What is Zabbix + +[Zabbix][2] is an enterprise-class open source distributed monitoring server solution. The software monitors different parameters of a network and the integrity of a server, and also allows the configuration of email based alerts for any event. Zabbix offers reporting and data visualization features based on the data stored in a database (MySQL, for example). Every metric collected by the software is accessible through a web-based interface. + +Zabbix is released under the terms of the GNU General Public License version 2 (GPLv2), totally free of cost. + +In this tutorial we will install Zabbix on an Ubuntu 16.04 server running MySQL, Apache and PHP. + +### Install the Zabbix Server + +First, we’ll need to install a few PHP modules required by Zabbix: + +``` +# apt-get install php7.0-bcmath php7.0-xml php7.0-mbstring +``` +The Zabbix package available in the Ubuntu repositories is outdated. Use the official Zabbix repository to install the latest stable version. + +Install the repository package by executing the following commands: + +``` +$ wget http://repo.zabbix.com/zabbix/3.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.2-1+xenial_all.deb +# dpkg -i zabbix-release_3.2-1+xenial_all.deb +``` + +Then update the `apt` packages source: + +``` +# apt-get update +``` +Now it’s possible to install Zabbix Server with MySQL support and the PHP front-end. Execute the command: +``` +# apt-get install zabbix-server-mysql zabbix-frontend-php +``` + +Install the Zabbix agent: + +``` +# apt-get install zabbix-agent +``` + +Zabbix is now installed. The next step is to configure a database for storing its data. + +### Configure MySQL for Zabbix + +We need to create a new MySQL database, in which Zabbix will store the collected data. + +Start the MySQL shell: + +``` +$ mysql -uroot -p +``` + +Next: + +``` +mysql> CREATE DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_bin; +Query OK, 1 row affected (0.00 sec) + +mysql> GRANT ALL PRIVILEGES ON zabbix.* TO zabbix@localhost IDENTIFIED BY 'usr_strong_pwd'; +Query OK, 0 rows affected, 1 warning (0.00 sec) + +mysql> EXIT; +Bye +``` + +Next, import the initial schema and data. + +``` +# zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql -uzabbix -p zabbix +``` + +Enter the password for the **zabbix** user created in the MySQL shell. + +Next, we need to edit the Zabbix Server configuration file, which is `/etc/zabbix/zabbis_server.conf`: + +``` +# $EDITOR /etc/zabbix/zabbix_server.conf +``` + +Search the `DBPassword` section of the file: + +``` +### Option: DBPassword +# Database password. Ignored for SQLite. +# Comment this line if no password is used. +# +# Mandatory: no +# Default: +# DBPassword= + +``` + +Uncomment the `DBPassword=` line and edit by adding the password created in MySQL: + +``` +DBPassword=usr_strong_pwd + +``` + +Next, look for the `DBHost=` line and uncomment it. + +Save and exit. + +### Configure PHP + +We need to configure PHP for working with Zabbix. During the installation process, the installer created a configuration file in `/etc/zabbix`, named `apache.conf`. Open this file: + +``` +# $EDITOR /etc/zabbix/apache.conf +``` + +Here, right now, it’s necessary only to uncomment the `date.timezone` setting and set the correct timezone: + +``` + + + php_value max_execution_time 300 + php_value memory_limit 128M + php_value post_max_size 16M + php_value upload_max_filesize 2M + php_value max_input_time 300 + php_value always_populate_raw_post_data -1 + php_value date.timezone Europe/Rome + + +``` + +Save and exit. + +At this point, restart Apache and start the Zabbix Server service, enabling it for starting at boot time: + +``` +# systemctl restart apache2 +# systemctl start zabbix-server +# systemctl enable zabbix-server +``` +Check the Zabbix status with `systemctl`: +``` +# systemctl status zabbix-server +``` + +This command should output: + +``` +â zabbix-server.service - Zabbix Server + Loaded: loaded (/lib/systemd/system/zabbix-server.service; enabled; vendor pr + Active: active (running) ... +``` + +At this point, the server-side part of Zabbix has been correctly installed and configured. + +### Configure Zabbix Web Fronted + +As mentioned in the introduction, Zabbix has a web-based front-end which we’ll use for visualizing collected data. However, this interface has to be configured. + +With a web browser, go to URL `http://localhost/zabbix`. + +![Zabbix monitoring server Frontend Setup](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot1.png) + +Click on  _**Next step**_ + +![snapshot2](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot2.png) + +Be sure that all the values are **Ok**, and then click on  _**Next step** _ again. + +![Zabbix MySQL configuration](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot3.png) +Insert the MySQL **zabbix** user password, and then click on  _**Next step**_ . + +![Zabbix server details](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot4.png) + +Click on  _**Next step**_ , and the installer will show the following page with all the configuration parameters. Check again to ensure that everything is correct.. + +![Zabbix pre-installation details](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot5.png) + +![Zabbix installation finished](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot6.png) + +Click **Next step** to proceed to the final screen. + +Click finish to complete the front-end installation. The default user name is **Admin** with **zabbix **as the password. + +### Getting Started with the Zabbix Server + +![Zabbix login interface](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot7.png) + +After logging in with the above mentioned credentials, we will see the Zabbix dashboard: +![zabbix dashboard](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot8.png) +Go on  _Administration -> Users_  for an overview about enabled accounts +![Zabbix users](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot9.png) +Create a new account by clicking on  _**Create user**_ +![Zabbix User Creation](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot10.png) +Click on **Add** in the **Groups** section and select one group +![snapshot11](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot11.png) +Save the new user credentials, and it will appear in the  _Administration -> Users _ panel.**Note that in Zabbix access rights to hosts are assigned to user groups, not individual users.** + +### Conclusion + +This concludes the tutorial for the Zabbix Server installation. Now, the monitoring infrastructure is ready to do its job and collect data about servers that need to be added in the Zabbix configuration. + +-------------------------------------------------------------------------------- + +via: https://www.unixmen.com/monitoring-server-install-zabbix-ubuntu-16-04/ + +作者:[Giuseppe Molica ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.unixmen.com/author/tutan/ +[1]:https://www.unixmen.com/author/tutan/ +[2]:http://www.zabbix.com/ +[3]:https://www.unixmen.com/wp-content/uploads/2017/06/zabbix_logo.png From 126057ee96bc01003fd1f6968710e1227cf497ea Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 13:55:05 +0800 Subject: [PATCH 0780/1407] =?UTF-8?q?20170726-15=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...How To Install OrientDB on Ubuntu 16.04.md | 232 ++++++++++++++++++ 1 file changed, 232 insertions(+) create mode 100644 sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md diff --git a/sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md b/sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md new file mode 100644 index 0000000000..d3fba80ed1 --- /dev/null +++ b/sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md @@ -0,0 +1,232 @@ +NoSQL: How To Install OrientDB on Ubuntu 16.04 +============================================================ + + + [![OrientDB NoSQL DBMS](https://www.unixmen.com/wp-content/uploads/2017/07/orientdb-696x318.png "orientdb")][2] + +### Introduction – NoSQL and OrientDB + +When talking about databases, in general, we refer to two major families: RDBMS (**R**elational **D**ata**b**ase **M**anagement **S**ystem), which use as user and application program interface a language named **S**tructured **Q**uery **L**anguage (or SQL) and non-relational database management systems, or **NoSQL** databases. + +Between the two models there is a huge difference in the way they consider (and store) data. + +#### Relational Database Management Systems + +In the relational model (like MySQL, or its fork, MariaDB), a database is a set of tables, each containing one or more data categories organized in columns. Each row of the DB contains a unique instance of data for categories defined by columns. + +Just as an example, consider a table containing customers. Each row correspond to a customer, with columns for name, address, and every required information. +Another table could contain an order, with product, customer, date and everything else. A user of this DB can obtain a view that fits its needs, for example a report about customers that bought products in a specific range of prices. + +#### NoSQL Database Management Systems + +In the NoSQL (or Not only SQL) database management systems, databases are designed implementing different “formats” for data, like a document, key-value, graph and others. The database systems realized with this paradigm are built especially for large-scale database clusters, and huge web applications. Today, NoSQL databases are used by major companies like Google and Amazon. + +##### Document databases + +Document databases store data in document format. The usage of this kind of DBs is usually raised with JavaScript and JSON, however, XML and other formats are accepted. An example is MongoDB. + +##### Key-value databases + +This is a simple model pairing a unique key with a value. These systems are performant and highly scalable for caching. Examples include BerkeleyDB and MemcacheDB. + +##### Graph databases + +As the name predicts, these databases store data using graph models, meaning that data is organized as nodes and interconnections between them. This is a flexible model which can evolve over time and use. These systems are applied where there is the necessity of mapping relationships. +Examples are IBM Graphs and Neo4j **and OrientDB**. + +### OrientDB + +[OrientDB][3], as stated by the company behind it, is a multi-model NoSQL Database Management System that “ _combines the power of graphs with documents, key/value, reactive, object-oriented and geospatial models into one **scalable, high-performance operational database**“._ + +OrientDB has also support for SQL, with extensions to manipulate trees and graphs. + +### Goals + +This tutorial explains how to install and configure OrientDB Community on a server running Ubuntu 16.04. + +### Download OrientDB + +On an up to date server, download the latest version of OrientDB by executing the following command: + +``` +$ wget -O orientdb-community-2.2.22.tar.gz http://orientdb.com/download.php?file=orientdb-community-2.2.22.tar.gz&os=linux +``` + +This is a tarball containing pre-compiled binaries, so extract the archive with `tar`: + +``` +$ tar -zxf orientdb-community-2.2.22.tar.gz +``` + +Move the extracted directory into `/opt`: + +``` +# mv orientdb-community-2.2.22 /opt/orientdb +``` + +### Start OrientDB Server + +Starting the OrientDB server requires the execution of the shell script contained in `orientdb/bin/`: + +``` +# /opt/orientdb/bin/server.sh +``` + +During the first start, this installer will display some information and will ask for an OrientDB root password: + +``` ++---------------------------------------------------------------+ +| WARNING: FIRST RUN CONFIGURATION | ++---------------------------------------------------------------+ +| This is the first time the server is running. Please type a | +| password of your choice for the 'root' user or leave it blank | +| to auto-generate it. | +| | +| To avoid this message set the environment variable or JVM | +| setting ORIENTDB_ROOT_PASSWORD to the root password to use. | ++---------------------------------------------------------------+ + +Root password [BLANK=auto generate it]: ******** +Please confirm the root password: ******** +``` + +After that, the OrientDB server will start: + +``` +INFO OrientDB Server is active v2.2.22 (build fb2b7d321ea8a5a5b18a82237049804aace9e3de). [OServer] +``` + +From now on, we will need a second terminal to interact with the OrientDB server. + +Stop OrientDB by hitting `Ctrl+C`. + +### Configure a Daemon + +At this point, OrientDB is just a bunch of shell scripts. With a text editor, open `/opt/orientdb/bin/orientdb.sh`: + +``` +# $EDITOR /opt/orientdb/bin/orientdb.sh +``` + +In the first lines, we will see: + +``` +#!/bin/sh +# OrientDB service script +# +# Copyright (c) OrientDB LTD (http://orientdb.com/) + +# chkconfig: 2345 20 80 +# description: OrientDb init script +# processname: orientdb.sh + +# You have to SET the OrientDB installation directory here +ORIENTDB_DIR="YOUR_ORIENTDB_INSTALLATION_PATH" +ORIENTDB_USER="USER_YOU_WANT_ORIENTDB_RUN_WITH" +``` + +Configure `ORIENTDB_DIR` and `ORIENTDB_USER`. + +Create a user, for example **orientdb**, by executing the following command: + +``` +# useradd -r orientdb -s /sbin/nologin +``` + +**orientdb** is the user we enter in the `ORIENTDB_USER` line. + +Change the ownership of `/opt/orientdb`: + +``` +# chown -R orientdb:orientdb /opt/orientdb +``` + +Change the configuration server file’s permission: + +``` +# chmod 640 /opt/orientdb/config/orientdb-server-config.xml +``` + +#### Install the Systemd Service + +OrientDB tarball contains a service file, `/opt/orientdb/bin/orientdb.service`. Copy it to the `/etc/systemd/system` directory: + +``` +# cp /opt/orientdb/bin/orientdb.service /etc/systemd/system +``` + +Edit the OrientDB service file: + +``` +# $EDITOR /etc/systemd/system/orientdb.service +``` + +There, the `[service]` block should look like this: + +``` +[Service] +User=ORIENTDB_USER +Group=ORIENTDB_GROUP +ExecStart=$ORIENTDB_HOME/bin/server.sh +``` + +Edit as follow: + +``` +[Service] +User=orientdb +Group=orientdb +ExecStart=/opt/orientdb/bin/server.sh +``` + +Save and exit. + +Reload systemd daemon service: + +``` +# systemctl daemon-reload +``` + +Start OrientDB and enable for starting at boot time: + +``` +# systemctl start orientdb +# systemctl enable orientdb +``` + +Check OrientDB status: + +``` +# systemctl status orientdb +``` + +The command should output: + +``` +● orientdb.service - OrientDB Server + Loaded: loaded (/etc/systemd/system/orientdb.service; disabled; vendor preset: enabled) + Active: active (running) ... +``` + +And that’s all! OrientDB Community is installed and correctly running. + +### Conclusion + +In this tutorial we have seen a brief comparison between RDBMS and NoSQL DBMS. We have also installed and completed a basic configuration of OrientDB Community server-side. + +This is the first step for deploying a full OrientDB infrastructure, ready for managing large-scale systems data. + +-------------------------------------------------------------------------------- + +via: https://www.unixmen.com/nosql-install-orientdb-ubuntu-16-04/ + +作者:[Giuseppe Molica ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.unixmen.com/author/tutan/ +[1]:https://www.unixmen.com/author/tutan/ +[2]:https://www.unixmen.com/wp-content/uploads/2017/07/orientdb.png +[3]:https://orientdb.com/ From 33933e0c03e5602f87941835e9641afcc9e4f027 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 13:56:37 +0800 Subject: [PATCH 0781/1407] =?UTF-8?q?20170726-16=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ure an NGINX web server on Ubuntu 16.04.md | 183 ++++++++++++++++++ 1 file changed, 183 insertions(+) create mode 100644 sources/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md diff --git a/sources/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md b/sources/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md new file mode 100644 index 0000000000..faeb81a2ed --- /dev/null +++ b/sources/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md @@ -0,0 +1,183 @@ +Encryption: How To Secure an NGINX web server on Ubuntu 16.04 +============================================================By [Giuseppe Molica][1]
+ + [![Let's Encrypt Encryption CA](https://www.unixmen.com/wp-content/uploads/2017/06/le-logo-standard.png "le-logo-standard")][2] + +### What is Let’s Encrypt + +[Let’s Encrypt][3] is a free certificate authority brought by the Internet Security Research Group (ISRG). It provides an easy and automated way to obtain free SSL/TLS certificates – a required step for enabling encryption and HTTPS traffic on web servers. Most of the steps in obtaining and installing a certificate can be automated by using a tool called [Certbot][4]. + +In particular, this software can be used in presence of shell access to the server: in other words, when it’s possible to connect to the server through SSH. + +In this tutorial we will see how to use `certbot` to obtain a free SSL certificate and use it with Nginx on an Ubuntu 16.04 server. + +### Install Certbot + +The first step is to install `certbot`, the software client which will automate almost everything in the process. Certbot developers maintain their own Ubuntu software repository which contain software newer than those present in the Ubuntu repositories. + +Add the Certbot repository: + +``` +# add-apt-repository ppa:certbot/certbot +``` + +Next, update the APT sources list: + +``` +# apt-get update +``` + +At this point, it is possible to install `certbot` with the following `apt` command: + +``` +# apt-get install certbot +``` + +Certbot is now installed and ready to use. + +### Obtain a Certificate + +There are various Certbot plugins for obtaining SSL certificates. These plugins help in obtaining a certificate, while its installation and web server configuration are both left to the admin. + +We will use a plugin called **Webroot** to obtain a SSL certificate. + +This plugin is recommended in those cases where there is the ability to modify the content being served. There is no need to stop the web server during the certificate issuance process. + +#### Configure NGINX + +Webroot works by creating a temporary file for each domain in a directory called `.well-known`, placed inside the web root directory. In our case, the web root directory is `/var/www/html`. Ensure that the directory is accessible to Let’s Encrypt for validation. To do so, edit the NGINX configuration. With a text editor, open the `/etc/nginx/sites-available/default` file: + +``` +# $EDITOR /etc/nginx/sites-available/default +``` + +In this file, in the server block, place the following content: + +``` + location ~ /.well-known { + allow all; + } +``` + +Save, exit and check the NGINX configuration: + +``` +# nginx -t +``` + +Without errors, it should display: + +``` +nginx: the configuration file /etc/nginx/nginx.conf syntax is ok +nginx: configuration file /etc/nginx/nginx.conf test is successful +``` + +Restart NGINX: + +``` +# systemctl restart nginx +``` + +#### Obtain Certificate with Certbot + +The next step is to obtain a new certificate using Certbot with the Webroot plugin. In this tutorial, we will secure (as example) the domain www.example.com. It is required to specify every domain that should be secured by the certificate. Execute the following command: + +``` +# certbot certonly --webroot --webroot-path=/var/www/html -d www.example.com +``` + +During the process, Cerbot will ask for a valid email address for notification purposes. It will also ask to share it with the EFF, but this is not required. After agreeing the Terms of Services, it will obtain a new certificate. + +At the end, the directory `/etc/letsencrypt/archive` will contain the following files: + +* chain.pem: Let’s Encrypt chain certificate. + +* cert.pem: domain certificate. + +* fullchain.pem: combination of `cert.pem` and `chain.pem`. + +* privkey.pem: certificate’s private key. + +Certbot will also create symbolic links to the most recent certificate files in `/etc/letsencrypt/live/**domain_name**/`. This is the path we will use in server configuration. + +### Configure SSL/TLS on NGINX + +The next step is server configuration. Create a new snippet in the `/etc/nginx/snippets/`. A **snippet** is a part of a configuration file that can be included in virtual host configuration files. So, create a new file: + +``` +# $EDITOR /etc/nginx/snippets/secure-example.conf +``` + +The content of this file will be the directives specifying the locations of the certificate and key. Paste the following content: + +``` +ssl_certificate /etc/letsencrypt/live/domain_name/fullchain.pem; +ssl_certificate_key /etc/letsencrypt/live/domain_name/privkey.pem; +``` + +In our case, `domain_name` would be `example.com`. + +#### Edit NGINX Configuration + +Edit the default Virtual Host file: + +``` +# $EDITOR /etc/nginx/sites-available/default +``` + +As follows: + +``` +server { + listen 80 default_server; + listen [::]:80 default_server; + server_name www.example.com + return 301 https://$server_name$request_uri; + + # SSL configuration + # + listen 443 ssl default_server; + listen [::]:443 ssl default_server; + include snippets/secure-example.conf + # + # Note: You should disable gzip for SSL traffic. + # See: https://bugs.debian.org/773332 +... +``` + +This will enable encryption on NGINX. + +Save, exit and check the NGINX configuration file: + +``` +# nginx -t + +nginx: the configuration file /etc/nginx/nginx.conf syntax is ok +nginx: configuration file /etc/nginx/nginx.conf test is successful +``` + +Restart NGINX: + +``` +# systemctl restart nginx +``` + +### Conclusion + +Following all the steps above, at this point we have a secured NGINX-based web server, with encryption granted by Certbot and Let’s Encrypt. This is just a basic configuration, of course, and it’s possible to use many NGINX configuration parameters for personalizing everything, but that depends on specific web server requirements. + +-------------------------------------------------------------------------------- + +via: https://www.unixmen.com/encryption-secure-nginx-web-server-ubuntu-16-04/ + +作者:[Giuseppe Molica ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.unixmen.com/author/tutan/ +[1]:https://www.unixmen.com/author/tutan/ +[2]:https://www.unixmen.com/wp-content/uploads/2017/06/le-logo-standard.png +[3]:https://letsencrypt.org/ +[4]:https://certbot.eff.org/ From 5c4c069acbcbb48d8fbc453784d4ccf21a125060 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 13:58:55 +0800 Subject: [PATCH 0782/1407] =?UTF-8?q?20170726-17=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...12 How To Setup Apache Hadoop On CentOS.md | 261 ++++++++++++++++++ 1 file changed, 261 insertions(+) create mode 100644 sources/tech/20170712 How To Setup Apache Hadoop On CentOS.md diff --git a/sources/tech/20170712 How To Setup Apache Hadoop On CentOS.md b/sources/tech/20170712 How To Setup Apache Hadoop On CentOS.md new file mode 100644 index 0000000000..a61a4eb192 --- /dev/null +++ b/sources/tech/20170712 How To Setup Apache Hadoop On CentOS.md @@ -0,0 +1,261 @@ +How To Setup Apache Hadoop On CentOS +============================================================ + + [![](https://www.unixmen.com/wp-content/uploads/2015/06/hadoop1-696x249.png "hadoop1")][2] + +The **Apache Hadoop** software library is a framework that allows for the distributed processing of large data sets across clusters of computers using simple programming models The Apache™ Hadoop® project develops open-source software for reliable, scalable, distributed computing. + +The project includes these modules: + +* **Hadoop Common**: The common utilities that support the other Hadoop modules. + +* **Hadoop Distributed File System (HDFS™)**: A distributed file system that provides high-throughput access to application data. + +* **Hadoop YARN**: A framework for job scheduling and cluster resource management. + +* **Hadoop MapReduce**: A YARN-based system for parallel processing of large data sets. + +This article will help you for step by step install and configure single node hadoop cluster using Hadoop on centos. + +### Install Java + +Before installing hadoop make sure you have java installed on your system. Use this command to check the version of the installed Java. + +``` +java -version +java version "1.7.0_75" +Java(TM) SE Runtime Environment (build 1.7.0_75-b13) +Java HotSpot(TM) 64-Bit Server VM (build 24.75-b04, mixed mode) +``` + +To install or update Java use following step by step instructions. + +First step is to download latest version of java from the [Oracle official website][3]. + +``` +cd /opt/ +wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2Fwww.oracle.com%2F; oraclelicense=accept-securebackup-cookie" "http://download.oracle.com/otn-pub/java/jdk/7u79-b15/jdk-7u79-linux-x64.tar.gz" +tar xzf jdk-7u79-linux-x64.tar.gz +``` + +Need to set up to use newer version of Java using alternatives. Use the following commands to do it. + +``` +cd /opt/jdk1.7.0_79/ +alternatives --install /usr/bin/java java /opt/jdk1.7.0_79/bin/java 2 +alternatives --config java +``` + +``` +There are 3 programs which provide 'java'. + + Selection Command +----------------------------------------------- +* 1 /opt/jdk1.7.0_60/bin/java + + 2 /opt/jdk1.7.0_72/bin/java + 3 /opt/jdk1.7.0_79/bin/java + +Enter to keep the current selection[+], or type selection number: 3 [Press Enter] +``` + +Now you may also required to set up javac and jar commands path using alternatives command. + +``` +alternatives --install /usr/bin/jar jar /opt/jdk1.7.0_79/bin/jar 2 +alternatives --install /usr/bin/javac javac /opt/jdk1.7.0_79/bin/javac 2 +alternatives --set jar /opt/jdk1.7.0_79/bin/jar +alternatives --set javac /opt/jdk1.7.0_79/bin/javac +``` + +The next step is to configure environment variables. Use following commands to set up these variable properly + +* Setup **JAVA_HOME** Variable + +``` +export JAVA_HOME=/opt/jdk1.7.0_79 +``` + +* Setup **JRE_HOME** Variable + +``` +export JRE_HOME=/opt/jdk1.7.0_79/jre +``` + +* Setup **PATH** Variable + +``` +export PATH=$PATH:/opt/jdk1.7.0_79/bin:/opt/jdk1.7.0_79/jre/bin +``` + +### Installing **Apache Hadoop** + +After setting up the java environment. Let stat installing **Apache Hadoop.** + +The first step is to create a system user account to use for hadoop installation. + +``` +useradd hadoop +passwd hadoop +``` + +Now you need to configure the ssh keys for the user hadoop. Using following command to enable ssh login without password. + +``` +su - hadoop +ssh-keygen -t rsa +cat ~/.ssh/id_rsa.pub >> ~/.ssh/authorized_keys +chmod 0600 ~/.ssh/authorized_keys +exit +``` + +Now download hadoop latest available version from its official site [hadoop.apache.org][4]. + +``` +cd ~ +wget http://apache.claz.org/hadoop/common/hadoop-2.6.0/hadoop-2.6.0.tar.gz +tar xzf hadoop-2.6.0.tar.gz +mv hadoop-2.6.0 hadoop +``` + +Now the next step is to set environment variable uses by hadoop. + +Edit **~/.bashrc** file and add the following listes of  values at end of file. + +``` +export HADOOP_HOME=/home/hadoop/hadoop +export HADOOP_INSTALL=$HADOOP_HOME +export HADOOP_MAPRED_HOME=$HADOOP_HOME +export HADOOP_COMMON_HOME=$HADOOP_HOME +export HADOOP_HDFS_HOME=$HADOOP_HOME +export YARN_HOME=$HADOOP_HOME +export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native +export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin +``` + +Then apply the changes in current running environment + +``` +source ~/.bashrc +``` + +edit **$HADOOP_HOME/etc/hadoop/hadoop-env.sh** file and set **JAVA_HOME**environment variable + +``` +export JAVA_HOME=/opt/jdk1.7.0_79/ +``` + +Now you start with the configuration with basic hadoop single node cluster setup. + +First edit hadoop configuration files and make following changes. + +``` + cd /home/hadoop/hadoop/etc/hadoop +``` + +Let’s start by editing core-site.xml + +``` + + + fs.default.name + hdfs://localhost:9000 + + +``` + +Then Edit hdfs-site.xml: + +``` + + + dfs.replication + 1 + + + + dfs.name.dir + file:///home/hadoop/hadoopdata/hdfs/namenode + + + + dfs.data.dir + file:///home/hadoop/hadoopdata/hdfs/datanode + + +``` + +and edit mapred-site.xml: + +``` + + + mapreduce.framework.name + yarn + + +``` + +finally edit yarn-site.xml: + +``` + + + yarn.nodemanager.aux-services + mapreduce_shuffle + + +``` + +Now format the namenode using following command: + +``` +hdfs namenode -format +``` + +To start all hadoop services use the following command: + +``` +cd /home/hadoop/hadoop/sbin/ +start-dfs.sh +start-yarn.sh +``` + +To check if all services are started well use ‘jps‘ command: + +``` +jps +``` + +You should see like this output. + +``` +26049 SecondaryNameNode +25929 DataNode +26399 Jps +26129 JobTracker +26249 TaskTracker +25807 NameNode +``` + +Now you can access to Hadoop Services in your Browser at: **http://your-ip-address:8088/.** + + [![hadoop](http://www.unixmen.com/wp-content/uploads/2015/06/hadoop.png)][5] + +Thanks!!! + +-------------------------------------------------------------------------------- + +via: https://www.unixmen.com/setup-apache-hadoop-centos/ + +作者:[anismaj ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.unixmen.com/author/anis/ +[1]:https://www.unixmen.com/author/anis/ +[2]:https://www.unixmen.com/wp-content/uploads/2015/06/hadoop1.png +[3]:http://www.oracle.com/technetwork/java/javase/downloads/jdk7-downloads-1880260.html +[4]:https://hadoop.apache.org/ +[5]:http://www.unixmen.com/wp-content/uploads/2015/06/hadoop.png From 842761d0a923ebc620779a58da2b0a769cb7ef7a Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 14:00:11 +0800 Subject: [PATCH 0783/1407] =?UTF-8?q?20170726-17=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ysis How To Install Bro On Ubuntu 16.04.md | 244 ++++++++++++++++++ 1 file changed, 244 insertions(+) create mode 100644 sources/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md diff --git a/sources/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md b/sources/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md new file mode 100644 index 0000000000..fa4e8bc272 --- /dev/null +++ b/sources/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md @@ -0,0 +1,244 @@ +Network Analysis: How To Install Bro On Ubuntu 16.04 +============================================================ + + + [![Bro Network Analysis Logo](https://www.unixmen.com/wp-content/uploads/2017/07/brologo-696x696.jpg "brologo")][4] + +### Introduction: Bro Network Analysis Framework + +Bro is an open source network analysis framework with a focus on network security monitoring. It is the result of 15 years of research, widely used by major universities, research labs, supercomputing centers and many open-science communities. It is developed mainly at the International Computer Science Institute, in Berkeley, and the National Center for Supercomputing Applications, in Urbana-Champaign. + +Bro has various features, including the following: + +* Bro’s scripting language enables site-specific monitoring policies + +* Targeting of high-performance networks + +* Analyzers for many protocols, enabling high-level semantic analysis at the application level + +* It keeps extensive application-layer stats about the network it monitors. + +* Bro interfaces with other applications for real-time exchange of information + +* It comprehensively logs everything and provides a high-level archive of a network’s activity. + +This tutorial explains how to build from source and install Bro on an Ubuntu 16.04 Server. + +### Prerequisites + +Bro has many dependencies: + +* Libpcap ([http://www.tcpdump.org][2]) + +* OpenSSL libraries ([http://www.openssl.org][3]) + +* BIND8 library + +* Libz + +* Bash (required for BroControl) + +* Python 2.6+ (required for BroControl) + +Building from source requires also: + +* CMake 2.8+ + +* Make + +* GCC 4.8+ or Clang 3.3+ + +* SWIG + +* GNU Bison + +* Flex + +* Libpcap headers + +* OpenSSL headers + +* zlib headers + +### Getting Started + +First of all, install all the required dependencies, by executing the following command: + +``` +# apt-get install cmake make gcc g++ flex bison libpcap-dev libssl-dev python-dev swig zlib1g-dev +``` + +#### Install GeoIP Database for IP Geolocation + +Bro depends on GeoIP for address geolocation. Install both the IPv4 and IPv6 versions: + +``` +$ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz +$wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCityv6-beta/GeoLiteCityv6.dat.gz +``` + +Decompress both archives: + +``` +$ gzip -d GeoLiteCity.dat.gz +$ gzip -d GeoLiteCityv6.dat.gz +``` + +Move the decompressed files to `/usr/share/GeoIP` directory: + +``` +# mvGeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat +# mv GeoLiteCityv6.dat /usr/share/GeoIP/GeoIPCityv6.dat +``` + +Now, it’s possible to build Bro from source. + +### Build Bro + +The latest Bro development version can be obtained through `git` repositories. Execute the following command: + +``` +$ git clone --recursive git://git.bro.org/bro +``` + +Go to the cloned directory and simply build Bro with the following commands: + +``` +$ cd bro +$ ./configure +$ make +``` + +The make command will require some time to build everything. The exact amount of time, of course, depends on the server performances. + +The `configure` script can be executed with some argument to specify what dependencies you want build to, in particular the `--with-*` options. + +### Install Bro + +Inside the cloned `bro` directory, execute: + +``` +# make install +``` + +The default installation path is `/usr/local/bro`. + +### Configure Bro + +Bro configuration files are located in the `/usr/local/bro/etc` directory. There are three files: + +* `node.cfg`, used to configure which node (or nodes) to monitor. + +* `broctl.cfg`, the BroControl configuration file. + +* `networks.cgf`, containing a list of networks in CIDR notation. + +#### Configure Mail Settings + +Open the `broctl.cfg` configuration file: + +``` +# $EDITOR /usr/local/bro/etc/broctl.cfg +``` + +Look for the **Mail Options** section, and edit the `MailTo` line as follow: + +``` +# Recipient address for emails sent out by Bro and BroControl +MailTo = admin@example.com +``` + +Save and close. There are many other options, but in most cases the defaults are good enough. + +#### Choose Nodes To Monitor + +Out of the box, Bro is configured to operate in the standalone mode. In this tutorial we are doing a standalone installation, so it’s not necessary to change very much. However, look at the `node.cfg` configuration file: + +``` +# $EDITOR /usr/local/bro/etc/node.cfg +``` + +In the `[bro]` section, you should see something like this: + +``` +[bro] +type=standalone +host=localhost +interface=eth0 +``` + +Make sure that the interface matches the public interface of the Ubuntu 16.04 server. + +Save and exit. + +### Configure Node’s Networks + +The last file to edit is `network.cfg`. Open it with a text editor: + +``` +# $EDITOR /usr/local/bro/etc/networks.cfg +``` + +By default, you should see the following content: + +``` +# List of local networks in CIDR notation, optionally followed by a +# descriptive tag. +# For example, "10.0.0.0/8" or "fe80::/64" are valid prefixes. + +10.0.0.0/8 Private IP space +172.16.0.0/12 Private IP space +192.168.0.0/16 Private IP space +``` + +Delete the three entries (which are just example for how to use this file), and enter the public and private IP space of your server, in the format: + +``` +X.X.X.X/X Public IP space +X.X.X.X/X Private IP space +``` + +Save and exit. + +### Manage Bro Installation with BroControl + +Managing Bro requires using BroControl, which comes in form of an interactive shell and a command line tool. Start the shell with: + +``` +# /usr/local/bro/bin/broctl +``` + +To use as a command line tool, just pass an argument to the previous command, for example: + +``` +# /usr/local/bro/bin/broctl status +``` + +This will check Bro’s status, by showing output like: + +``` +Name Type Host Status Pid Started +bro standalone localhost running 6807 20 Jul 12:30:50 +``` + +### Conclusion + +This concludes the Bro’s installation tutorial. We used the source based installation because it is the most efficient way to obtain the latest version available, however this network analysis framework can also be downloaded in pre-built binary format. + +See you next time! + +-------------------------------------------------------------------------------- + +via: https://www.unixmen.com/how-to-install-bro-ubuntu-1604/ + +作者:[ Giuseppe Molica][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.unixmen.com/author/tutan/ +[1]:https://www.unixmen.com/author/tutan/ +[2]:http://www.tcpdump.org/ +[3]:http://www.openssl.org/ +[4]:https://www.unixmen.com/wp-content/uploads/2017/07/brologo.jpg From b7172ad9445f7bd48d54e4677832c97f892bec6f Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 14:16:34 +0800 Subject: [PATCH 0784/1407] =?UTF-8?q?20170726-17=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md | 104 ++++++++++++++++++ 1 file changed, 104 insertions(+) create mode 100644 sources/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md diff --git a/sources/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md b/sources/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md new file mode 100644 index 0000000000..9e2fc78628 --- /dev/null +++ b/sources/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md @@ -0,0 +1,104 @@ +DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS +============================================================ + + +Today marks an important milestone for the Open Container Initiative (OCI) with the release of the OCI v1.0 runtime and image specifications – a journey that Docker has been central in driving and navigating over the last two years. It has been our goal to provide low-level standards as building blocks for the community, customers and the broader industry. To understand the significance of this milestone, let’s take a look at the history of Docker’s growth and progress in developing industry-standard container technologies. + +The History of Docker Runtime and Image Donations to the OCI + +Docker’s image format and container runtime quickly emerged as the de facto standard following its release as an open source project in 2013\. We recognized the importance of turning it over to a neutral governance body to fuel innovation and prevent fragmentation in the industry. Working together with a broad group of container technologists and industry leaders, the Open Container Project was formed to create a set of container standards and was launched under the auspices of the Linux Foundation in June 2015 at DockerCon. It became the Open Container Initiative (OCI) as the project evolved that Summer. + +Docker contributed runc, a reference implementation for the container runtime software that had grown out of Docker employee [Michael Crosby’s][17] libcontainer project. runc is the basis for the runtime specification describing the life-cycle of a container and the behavior of a container runtime. runc is used in production across tens of millions of nodes, which is an order of magnitude more than any other code base. runc became the reference implementation for the runtime specification project itself, and continued to evolve with the project.   + +Almost a year after work began on the runtime specification, a new working group formed to specify a container image format. Docker donated the Docker V2 Image Format to the OCI as the basis for the image specification. With this donation, the OCI defines the data structures — the primitives — that make up a container image. Defining the container image format is an important step for adoption, but it takes a platform like Docker to activate its value by defining and providing tooling on how to build images, manage them and ship them around. For example, things such as the Dockerfile are not included in the OCI specifications. + +Title: Docker’s History of Contribution to the OCI + +![Docker and OCI](https://i2.wp.com/blog.docker.com/wp-content/uploads/OCI.png?resize=938%2C1491&ssl=1) + +The Journey to Open Container Standards + +The specifications have continued to evolve for two years now. Smaller projects have been spun out of the runc reference implementation as the code has been refactored, as well as support testing tools that will become the test suite for certification. + +See the timeline above for details about Docker’s involvement in shaping OCI, which includes: creating runc, iterating on the runtime specification with the community, creating containerd to integrate runc in Docker 1.11, donating the Docker V2 Image Format to OCI as a base for the image format specification, implementing that specification in [containerd][18] so that this core container runtime covers both the runtime and image format standards, and finally donating containerd to the Cloud Native Computing Foundation (CNCF) and iterating on it towards a 1.0 alpha release this month. + +Maintainers [Michael Crosby][19] and [Stephen Day][20] have lead the development of these specifications and have been instrumental in bringing v1.0 to fruition, alongside contributions from Alexander Morozov, Josh Hawn, Derek McGown and Aaron Lehmann, as well as Stephen Walli participating in the certification working group. + +Docker remains committed to driving container standards, building a strong base at the layers where everyone agrees so that the industry can innovate at the layers that are still very differentiated. + +Open Standards are Only a Piece of the Puzzle + +Docker is a complete platform for creating, managing, securing, and orchestrating containers and container images. The vision has always been a base of industry standard specifications that support open source components or the plumbing of a container solution. The Docker platform sits above this layer – providing users and customers with a secure container management solution from development through production.   + +The OCI runtime and image specifications become the dependable standards base that allow and encourage the greatest number of container solutions and at the same time, they do not restrict product innovation or shutout major contributors. To draw a comparison, TCP/IP, HTTP and HTML became the dependable standards base upon which the World Wide Web was built over the past 25 years. Companies continue to innovate with new tools, technologies and browsers on these standards. The OCI specifications provide the similar foundation for containers solutions going forward. + +Open source projects also play a role in providing components for product development. The OCI runc reference implementation is used by the containerd project, a larger container runtime responsible for image transfer and storage, container execution and supervision, and low-level functions to support storage and network attachments. The containerd project was contributed by Docker to the CNCF and sits alongside other important projects to support cloud native computing solutions. + +Docker uses containerd and more of its own core open source infrastructure elements like the LinuxKit, InfraKit and Notary projects to build and secure container solutions that become the Docker Community Edition tools. Users and organizations looking for complete container platforms that are holistic and provide container management, security, orchestration, networking and more can look to Docker Enterprise Edition. + +![Docker Stack](https://i0.wp.com/blog.docker.com/wp-content/uploads/243938a0-856b-4a7f-90ca-2452a69a385c-1.jpg?resize=1019%2C511&ssl=1) + +> This diagram highlights that the OCI specifications provide a layer of standards, implemented by a container runtime: containerd and runc. To assemble a full container platform such as Docker with full container lifecycle workflow, many other components are brought together: to manage infrastructure (InfraKit), provide an operating system (LinuxKit), deliver orchestration (SwarmKit), ensure security (Notary). + +What’s Next for the OCI + +We should celebrate the efforts of the developers as the runtime and image specifications are published. The next critical work to be done by the Open Container Initiative is to deliver a certification program to validate claims from implementers that their products and projects do indeed conform to the runtime and image specifications. The [Certification Working Group][21] has been putting together a program that in conjunction with a developing suite of test tools for both the [runtime][22] and [image][23] specifications will show how implementations fare against the standards. + +At the same time, the developers of the current specifications are considering the next most important areas of container technology to specify. Work is underway around a common networking interface for containers in the Cloud Native Computing Foundation, but work to support signing and distribution are areas under consideration for the OCI. + +Alongside the OCI and its members, Docker remains committed to standardizing container technology. The OCI’s mission is to give users and companies the baseline on which they can innovate in the areas of developer tooling, image distribution, container orchestration, security, monitoring and management. Docker will continue to lead the charge in innovation – not only with tooling that increases productivity and increases efficiencies, but also by empowering users, partners and customers to innovate as well. + +**Learn more about OCI and Open Source at Docker:** + +* Read about the [OCI specifications Myths][1] + +* Visit the [Open Container Initiative website][2] + +* Visit the [Moby Project website][3] + +* Attend [DockerCon Europe 2017][4] + +* Attend the [Moby Summit LA][5] alongside OSS NA + +-------------------------------------------------------------------------------- + +作者简介: + +Patrick Chanezon is member of technical staff at Docker Inc. He helps to build Docker, an open platform for distributed applications for developers and sysadmins. Software developer and storyteller, he spent 10 years building platforms at Netscape & Sun, then 10 years evangelizing platforms at Google, VMware & Microsoft. His main professional interest is in building and kickstarting the network effect for these wondrous two-sided markets called Platforms. He has worked on platforms for Portals, Ads, Commerce, Social, Web, Distributed Apps, and Cloud. More information is available at linkedin.com/in/chanezon. Patrick tweets at @chanezon. + + + +------ + +via: https://blog.docker.com/2017/07/oci-release-of-v1-0-runtime-and-image-format-specifications/ + +作者:[Patrick Chanezon ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://blog.docker.com/author/chanezon/ +[1]:https://blog.docker.com/2017/07/demystifying-open-container-initiative-oci-specifications/ +[2]:https://www.opencontainers.org/join +[3]:http://mobyproject.org/ +[4]:https://europe-2017.dockercon.com/ +[5]:https://www.eventbrite.com/e/moby-summit-los-angeles-tickets-35930560273 +[6]:https://blog.docker.com/author/chanezon/ +[7]:https://blog.docker.com/tag/cncf/ +[8]:https://blog.docker.com/tag/containerd/ +[9]:https://blog.docker.com/tag/containers/ +[10]:https://blog.docker.com/tag/docker/ +[11]:https://blog.docker.com/tag/docker-image-format/ +[12]:https://blog.docker.com/tag/docker-runtime/ +[13]:https://blog.docker.com/tag/infrakit/ +[14]:https://blog.docker.com/tag/linux-foundation/ +[15]:https://blog.docker.com/tag/oci/ +[16]:https://blog.docker.com/tag/open-containers/ +[17]:https://github.com/crosbymichael +[18]:https://containerd.io/ +[19]:https://github.com/crosbymichael +[20]:https://github.com/stevvooe +[21]:https://github.com/opencontainers/certification +[22]:https://github.com/opencontainers/runtime-tools +[23]:https://github.com/opencontainers/image-tools From a3578a10061e0f089a8bd8db6074244d5a99d893 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 14:19:01 +0800 Subject: [PATCH 0785/1407] =?UTF-8?q?20170726-18=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...CONTAINER INITIATIVE OCI SPECIFICATIONS.md | 89 +++++++++++++++++++ 1 file changed, 89 insertions(+) create mode 100644 sources/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md diff --git a/sources/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md b/sources/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md new file mode 100644 index 0000000000..d107eb66d1 --- /dev/null +++ b/sources/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md @@ -0,0 +1,89 @@ +DEMYSTIFYING THE OPEN CONTAINER INITIATIVE (OCI) SPECIFICATIONS +============================================================ + + +The Open Container Initiative (OCI) announced the completion of the first versions of the container runtime and image specifications this week. The OCI is an effort under the auspices of the Linux Foundation to develop specifications and standards to support container solutions. A lot of effort has gone into the [building of these specifications][12] over the past two years. With that in mind, let’s take a look at some of the myths that have arisen over the past two years. + +![OCI](https://i1.wp.com/blog.docker.com/wp-content/uploads/logo_oci.png?resize=800%2C180&ssl=1) + +Myth: The OCI is a replacement for Docker + +Standards are important, but they are far from a complete production platform. Take for example, the World Wide Web. It  has evolved over the last 25 years and was built on core dependable standards like TCP/IP, HTTP and HTML. Using TCP/IP as an example, when enterprises coalesced around TCP/IP as a common protocol, it fueled the growth of routers and in particular – Cisco. However, Cisco became a leader in its market by focusing on differentiated features on its routing platform. We believe the parallel exists with the OCI specifications and Docker. + +[Docker is a complete production platform][13] for developing, distributing, securing and orchestrating container-based solutions. The OCI specification is used by Docker, but it represents only about five percent of our code and a small part of the Docker platform concerned with the runtime behavior of a container and the layout of a container image.  + +Myth: Products and projects already are certified to the OCI specifications + +The runtime and image specifications have just released as 1.0 this week. However, the OCI certification program is still in development so companies cannot claim compliance, conformance or compatibility until certification is formally rolled out later this year. + +The OCI [certification working group][14] is currently defining the standard so that products and open source projects can demonstrate conformance to the specifications. Standards and specifications are important for engineers implementing solutions, but formal certification is the only way to reassure customers that the technology they are working with is truly conformant to the standard. + +Myth: Docker doesn’t support the OCI specifications work + +Docker has a long history with contributing to the OCI. We developed and donated a majority of the OCI code and have been instrumental in defining the OCI runtime and image specifications as maintainers of the project. When the Docker runtime and image format quickly became the de facto standards after being released as open source in 2013, we thought it would be beneficial to donate the code to a neutral governance body to avoid fragmentation and encourage innovation. The goal was to provide a dependable and standardized specification so Docker contributed runc, a simple container runtime, as the basis of the runtime specification work, and later contributed the Docker V2 image specification as the basis for the OCI image specification work. + +Docker developers like Michael Crosby and Stephen Day have been key contributors from the beginning of this work, ensuring Docker’s experience hosting and running billions of container images carries through to the OCI. When the certification working group completes its work, Docker will bring its products through the OCI certification process to demonstrate OCI conformance. + +Myth: The OCI specifications are about Linux containers  + +There is a misperception that the OCI is only applicable to Linux container technologies because it is under the aegis of the Linux Foundation. The reality is that although Docker technology started in the Linux world, Docker has been collaborating with Microsoft to bring our container technology, platform and tooling to the world of Windows Server. Additionally, the underlying technology that Docker has donated to the OCI is broadly applicable to  multi-architecture environments including Linux, Windows and Solaris and covers x86, ARM and IBM zSeries.  + +Myth: Docker was just one of many contributors to the OCI + +The OCI as an organization has a lot of supporting members representing the breadth of the container industry. That said, it has been a small but dedicated group of individual technologists that have contributed the time and technology to the efforts that have produced the initial specifications. Docker was a founding member of the OCI, contributing the initial code base that would form the basis of the runtime specification and later the reference implementation itself. Likewise, Docker contributed the Docker V2 Image specification to act as the basis of the OCI image specification. + +Myth: CRI-O is an OCI project + +CRI-O is an open source project in the Kubernetes incubator in the Cloud Native Computing Foundation (CNCF) – it is not an OCI project. It is based on an earlier version of the Docker architecture, whereas containerd is a direct CNCF project that is a larger container runtime that includes the runc reference implementation. containerd is responsible for image transfer and storage, container execution and supervision, and low-level functions to support storage and network attachments. Docker donated containerd to the CNCF with the support of the five largest cloud providers: Alibaba Cloud, AWS, Google Cloud Platform, IBM Softlayer and Microsoft Azure with a charter of being a core container runtime for multiple container platforms and orchestration systems.   + +Myth: The OCI specifications are now complete  + +While the release of the runtime and image format specifications is an important milestone, there’s still work to be done. The initial scope of the OCI was to define a narrow specification on which developers could depend for the runtime behavior of a container, preventing fragmentation in the industry, and still allowing innovation in the evolving container domain. This was later expanded to include a container image specification. + +As the working groups complete the first stable specifications for runtime behavior and image format, new work is under consideration. Ideas for future work include distribution and signing. The next most important work for the OCI, however, is delivering on a certification process backed by a test suite now that the first specifications are stable. + +**Learn more about OCI and Open Source at Docker:** + +* Read the blog post about the [OCI Release of v1.0 Runtime and Image Format Specifications][1] + +* Visit the [Open Container Initiative website][2] + +* Visit the [Moby Project website][3] + +* Attend [DockerCon Europe 2017][4] + +* Attend the [Moby Summit LA][5] alongside OSS NA + +-------------------------------------------------------------------------------- + +作者简介: + +Stephen is Director, Open Source Programs at Docker. He has been a Director and Distinguished Technologist at Hewlett-Packard Enterprise. He blogs about open source software and business at “Once More Unto The Breach” (http://stephesblog.blogs.com) and opensource.com. + + + +----------------- + +via: https://blog.docker.com/2017/07/demystifying-open-container-initiative-oci-specifications/ + +作者:[Stephen ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: +[1]:https://blog.docker.com/2017/07/oci-release-of-v1-0-runtime-and-image-format-specifications +[2]:https://www.opencontainers.org/join +[3]:http://mobyproject.org/ +[4]:https://europe-2017.dockercon.com/ +[5]:https://www.eventbrite.com/e/moby-summit-los-angeles-tickets-35930560273 +[6]:https://blog.docker.com/author/stephen-walli/ +[7]:https://blog.docker.com/tag/containerd/ +[8]:https://blog.docker.com/tag/cri-o/ +[9]:https://blog.docker.com/tag/linux-containers/ +[10]:https://blog.docker.com/tag/linux-foundation/ +[11]:https://blog.docker.com/tag/oci/ +[12]:https://blog.docker.com/2017/07/oci-release-of-v1-0-runtime-and-image-format-specifications +[13]:https://www.docker.com/ +[14]:https://github.com/opencontainers/certification From 3142e4286e44578ca3624da37f4811132945f8c0 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 14:20:50 +0800 Subject: [PATCH 0786/1407] =?UTF-8?q?20170726-19=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...LEARN DOCKER FOR FREE: PLAY-WITH-DOCKER.md | 120 ++++++++++++++++++ 1 file changed, 120 insertions(+) create mode 100644 sources/tech/20170717 THE BEST WAY TO LEARN DOCKER FOR FREE: PLAY-WITH-DOCKER.md diff --git a/sources/tech/20170717 THE BEST WAY TO LEARN DOCKER FOR FREE: PLAY-WITH-DOCKER.md b/sources/tech/20170717 THE BEST WAY TO LEARN DOCKER FOR FREE: PLAY-WITH-DOCKER.md new file mode 100644 index 0000000000..4d65c983be --- /dev/null +++ b/sources/tech/20170717 THE BEST WAY TO LEARN DOCKER FOR FREE: PLAY-WITH-DOCKER.md @@ -0,0 +1,120 @@ +THE BEST WAY TO LEARN DOCKER FOR FREE: PLAY-WITH-DOCKER (PWD) +============================================================ + + +Last year at the Distributed System Summit in Berlin, Docker captains[ Marcos Nils][15] and[ Jonathan Leibiusky][16] started hacking on an in-browser solution to help people learn Docker. A few days later, [Play-with-docker][17] (PWD) was born.  + +PWD is a Docker playground which allows users to run Docker commands in a matter of seconds. It gives the experience of having a free Alpine Linux Virtual Machine in browser, where you can build and run Docker containers and even create clusters in[ Docker Swarm Mode][18]. Under the hood Docker-in-Docker (DinD) is used to give the effect of multiple VMs/PCs. In addition to the playground, PWD also includes a training site composed of a large set of Docker labs and quizzes from beginner to advanced level available at [training.play-with-docker.com][19]. + +In case you missed it, Marcos and Jonathan presented PWD during the last DockerCon Moby Cool Hack session. Watch the video below for a deep dive into the infrastructure and roadmaps. + + +Over the past few months, the Docker team has been working closely with Marcos, Jonathan and other active members of the Docker community to add new features to the project and Docker labs to the training section. + +### PWD: the Playground + +Here is a quick recap of what’s new with the Docker playground: + +##### 1\.     PWD Docker Machine driver and SSH + +As PWD success grew, the community started to ask if they could use PWD to run their own Docker workshops and trainings. So one of the first improvements made to the project was the creation of [PWD Docker machine driver][20], which allows users to create and manage their PWD hosts easily through their favorite terminal including the option to use ssh related commands. Here is how it works: + +![Play With Docker](https://i2.wp.com/blog.docker.com/wp-content/uploads/ssh.gif?zoom=1.5625&resize=710%2C446&ssl=1) + +##### 2\.     Adding support for file upload + +Another cool feature brought to you by Marcos and Jonathan is the ability to upload your Dockerfile directly into your PWD windows with a simple drag and drop of your file in your PWD instance. + +![](https://i0.wp.com/blog.docker.com/wp-content/uploads/pwd_upload-1.gif?zoom=1.5625&resize=710%2C406&ssl=1) + +##### 3\.     Templated session + +In addition to file upload, PWD also has a feature which lets you spin up a 5 nodes swarm in a matter of seconds using predefined templates. + +##### +![Play with Docker](https://i1.wp.com/blog.docker.com/wp-content/uploads/templated-session-1.gif?zoom=1.5625&resize=710%2C412&ssl=1) + +##### 4\.      Showcasing your applications with Docker in a single click + +Another cool feature that comes with PWD is its embeddable button that you can use in your sites to set up a PWD environment and deploy a compose stack right away and a [chrome extension][21] that adds the “Try in PWD” button to the most popular images in DockerHub. Here’s a short demo of the extension in action: + + ![Play with Docker](https://lh5.googleusercontent.com/FqIHfES8KdNCY7YT9fZb5DbL7WYq6Qwb30RgubXix2x2ImJkaHrsEBZbb4rAxilhxgNmu56cQWZHiAbft3ox_T7UXn5oQRtRuxjrFhqRSiSXwFRJcLq6cWiAyg-pFddiJIVs0rY) + +### PWD: the Training Site + + A number of new labs are available on [training.play-with-docker.com][22]. Some notable highlights include two labs that were originally hands-on labs from DockerCon in Austin, and a couple that highlight new features that are stable in Docker 17.06CE: + +* [Docker Networking Hands-on Lab][1] + +* [Docker Orchstration Hands-on Lab][2] + +* [Multi-stage builds][3] + +* [Docker swarm config files][4] + +All in all, there are now 36 labs, with more being added all the time. If you want to contribute a lab, check out the [GitHub repo][23] and get started. + +### PWD: the Use Cases + +With the traffic to the site and the feedback we’ve received, it’s fair to say that PWD has a lot of traction right now. Here are some of the most common use-cases: + +* Try new features fast as it’s updated with the latest dev versions. + +* Set up clusters in no-time and launch replicated services. + +* Learn through it’s interactive tutorials: [training.play-with-docker.com][5]. + +* Give presentations at conferences and meetups. + +* Allow to run advanced workshops that’d usually require complex setups, such as Jérôme’s [advanced Docker Orchestration workshop][6] + +* Collaborate with community members to diagnose and detect issues. + +Get involved with PWD: + +* Contribute to [PWD by submitting PRs][7] + +* Contribute to the [PWD training site][8] + +-------------------------------------------------------------------------------- + +作者简介; + +Victor is the Sr. Community Marketing Manager at Docker, Inc. He likes fine wines, chess and soccer in no particular order. Victor tweets at @vcoisne. + + + +----------- + +via: https://blog.docker.com/2017/07/best-way-learn-docker-free-play-docker-pwd/ + +作者:[Victor ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://blog.docker.com/author/victor_c/ +[1]:http://training.play-with-docker.com/docker-networking-hol/ +[2]:http://training.play-with-docker.com/orchestration-hol/ +[3]:http://training.play-with-docker.com/multi-stage/ +[4]:http://training.play-with-docker.com/swarm-config/ +[5]:http://training.play-with-docker.com/ +[6]:https://github.com/docker/labs/tree/master/Docker-Orchestration +[7]:https://github.com/play-with-docker/ +[8]:https://github.com/play-with-docker/training +[9]:https://blog.docker.com/author/victor_c/ +[10]:https://blog.docker.com/tag/docker-labs/ +[11]:https://blog.docker.com/tag/docker-training/ +[12]:https://blog.docker.com/tag/docker-workshops/ +[13]:https://blog.docker.com/tag/play-with-docker/ +[14]:https://blog.docker.com/tag/pwd/ +[15]:https://www.twitter.com/marcosnils +[16]:https://www.twitter.com/xetorthio +[17]:http://play-with-docker.com/ +[18]:https://docs.docker.com/engine/swarm/ +[19]:http://training.play-with-docker.com/ +[20]:https://github.com/play-with-docker/docker-machine-driver-pwd/releases/tag/v0.0.5 +[21]:https://chrome.google.com/webstore/detail/play-with-docker/kibbhpioncdhmamhflnnmfonadknnoan +[22]:http://training.play-with-docker.com/ +[23]:https://github.com/play-with-docker/play-with-docker.github.io From 9fe2df374bd0ae97aa71e9fa854032e810593636 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 14:35:36 +0800 Subject: [PATCH 0787/1407] =?UTF-8?q?20170726-20=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...king a factory image with private snaps.md | 167 ++++++++++++++++++ 1 file changed, 167 insertions(+) create mode 100644 sources/tech/20170711 Ubuntu Core Making a factory image with private snaps.md diff --git a/sources/tech/20170711 Ubuntu Core Making a factory image with private snaps.md b/sources/tech/20170711 Ubuntu Core Making a factory image with private snaps.md new file mode 100644 index 0000000000..a5938fcf75 --- /dev/null +++ b/sources/tech/20170711 Ubuntu Core Making a factory image with private snaps.md @@ -0,0 +1,167 @@ +Ubuntu Core: Making a factory image with private snaps +============================================================ + + + +### Share or save + +This is a follow-up to the [ROS prototype to production on Ubuntu Core][3] series to answer a question I received: “What if I want to make an image for the factory, but don’t want to make my snaps public?” This question is of course not robotics-specific, and neither is its answer. In this post we’ll cover two ways to do this. + +Before we start, you’ll need a little bit of an Ubuntu Core imaging background. If you followed the ROS prototype to production series ([part 5][4] specifically) you already have the required background, but if you didn’t, check out the [tutorial for creating your own Ubuntu Core image][5]. + +Assuming you’re up-to-speed and know what I’m talking about when I say “model definition” or “model assertion,” let’s get started on a few different methods for creating an Ubuntu Core image with private snaps. + +### Method 1: Don’t put your snap in the store at all + +It really doesn’t get simpler. Take a look at this example model definition, **amd64-model.json**: + +``` +{ + "type": "model", + "series": "16", + "model": "custom-amd64", + "architecture": "amd64", + "gadget": "pc", + "kernel": "pc-kernel", + "authority-id": "4tSgWHfAL1vm9l8mSiutBDKnnSQBv0c8", + "brand-id": "4tSgWHfAL1vm9l8mSiutBDKnnSQBv0c8", + "timestamp": "2017-06-23T21:03:24+00:00", + "required-snaps": ["kyrofa-test-snap"] +} +``` + +Let’s go ahead and turn that into a model assertion: + +``` +$ cat amd64-model.json | snap sign -k my-key-name > amd64.model +You need a passphrase to unlock the secret key for +user: "my-key-name" +4096-bit RSA key, ID 0B79B865, created 2016-01-01 +... +``` + +Now you have your model assertion: **amd64.model**. If you hand that to **ubuntu-image** right now you’ll run into a problem: + +``` +$ sudo ubuntu-image -c stable amd64.model +Fetching core +Fetching pc-kernel +Fetching pc +Fetching kyrofa-test-snap +error: cannot find snap "kyrofa-test-snap": snap not found +COMMAND FAILED: snap prepare-image --channel=stable amd64.model /tmp/tmp6p453gk9/unpack +``` + +The snap with the name **kyrofa-test-snap** isn’t actually in the store. But that’s important to note: the model definition (and thus assertion) only contains a list of snap names. If you have a snap locally with that name, even if it’s not in the store, you can tell **ubuntu-image** to use it to satisfy that name in the assertion with the **–extra-snaps** option: + +``` +$ sudo ubuntu-image -c stable \ + --extra-snaps /path/to/kyrofa-test-snap_0.1_amd64.snap \ + amd64.model +Fetching core +Fetching pc-kernel +Fetching pc +Copying "/path/to/kyrofa-test-snap_0.1_amd64.snap" (kyrofa-test-snap) +kyrofa-test-snap already prepared, skipping +WARNING: "kyrofa-test-snap" were installed from local snaps +disconnected from a store and cannot be refreshed subsequently! +Partition size/offset need to be a multiple of sector size (512). +The size/offset will be rounded up to the nearest sector. +``` + +There. You now have an Ubuntu Core image (named **pc.img**) with your snap preinstalled, without the snap ever needing to be in the store. This works, but it has a big disadvantage which **ubuntu-image** points out with a warning: preinstalling a snap that isn’t connected to the store means you have no way to update it once devices are flashed with this image. Your only update mechanism would be to ship new images to be flashed. + +### Method 2: Use a brand store + +When you create a store account and visit [dashboard.snapcraft.io][6], you’re viewing your snaps in the standard Ubuntu store. If you install snapd fresh on your system, this is the store it uses by default. While you can release snaps privately on the Ubuntu store, you [can’t preinstall those in an image][7] because only you (and the collaborators you’ve added) can obtain access to it. The only way you can make an image in this case would be to make the snaps publicly available, which defeats the whole purpose of this post. + +For this use-case, we have what are called [**brand stores**][8]. Brand stores are still hosted in the Ubuntu store, but they’re a custom, curated version of it, meant to be specific to a given company or device. They can inherit (or not) from the standard Ubuntu store, and be open to all developers or locked down to a specific group (which is what we want in our case, to keep things private). + +Note that this is a paid feature. You need to [request a brand store][9]. Once your request has been granted, you’ll see your new store by visiting “stores you can access” under your name. + +![](https://insights.ubuntu.com/wp-content/uploads/1a62/stores_you_can_access.jpg) + +There you’ll see the various stores to which you have access. You’ll have at least two: the normal Ubuntu store, and your new brand store. Select the brand store (red rectangle). While you’re here, record your store ID (blue rectangle): you’ll need it in a moment. + +![](https://insights.ubuntu.com/wp-content/uploads/b10c/Screenshot-from-2017-07-06-15-16-32.png) + +From there, registering names/uploading snaps works the same way, but now they go into your brand store instead of the standard one, and assuming you have it unlisted, those snaps are not available to external users. The only caveat today is that at least the first upload for the snap needs to be via the web interface. After that, you can continue to use Snapcraft like normal. + +So how does this change things? My “kyrofa-store” inherits snaps from the Ubuntu store, and also contains a “kyrofa-branded-test-snap” published into the stable channel. This snap isn’t available in the Ubuntu store, as you can see if you search for it: + +``` +$ snap find kyrofa-branded +The search "kyrofa-branded" returned 0 snaps +``` + +But using the store ID we recorded earlier, we can make a model assertion that pulls from the brand store instead of the Ubuntu store. We just need to add the “store” key to the JSON document, making it look like this: + +``` +{ + "type": "model", + "series": "16", + "model": "custom-amd64", + "architecture": "amd64", + "gadget": "pc", + "kernel": "pc-kernel", + "authority-id": "4tSgWHfAL1vm9l8mSiutBDKnnSQBv0c8", + "brand-id": "4tSgWHfAL1vm9l8mSiutBDKnnSQBv0c8", + "timestamp": "2017-06-23T21:03:24+00:00", + "required-snaps": ["kyrofa-branded-test-snap"], + "store": "kyek" +} +``` + +Sign it just as we did in **Method 1**, and we can create an Ubuntu Core image with our private, brand-store snap preinstalled as simply as: + +``` +$ sudo ubuntu-image -c stable amd64.model +Fetching core +Fetching pc-kernel +Fetching pc +Fetching kyrofa-branded-test-snap +Partition size/offset need to be a multiple of sector size (512). +The size/offset will be rounded up to the nearest sector. +``` + +Now, like at the end of **Method 1**, you have a **pc.img** ready for the factory. However, with this method, the snaps in the image are all coming from the store, which means they will automatically update as usual. + +### Conclusion + +These are the only two options for doing this today. When I started writing this post I thought there was a third (keeping one’s snap private and creating an image with it), but that turns out to [not be the case][10]. + +Note that we’ve also received numerous requests for some sort of on-premises/enterprise store, and while such a product is not yet available, the store team is working on it. Once this is available, I’ll write a new post about it. + +I hope this proves useful! + + _Original post can be found [here][1]._ + +-------------------------------------------------------------------------------- + +作者简介: + +Kyle is a member of the Snapcraft team, and is also Canonical's resident roboticist. He focuses on snaps and the snap developer experience, as well as robotics enablement for snaps and Ubuntu Core. + + + +----- + +via: https://insights.ubuntu.com/2017/07/11/ubuntu-core-making-a-factory-image-with-private-snaps/ + +作者:[Kyle Fazzari ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://insights.ubuntu.com/author/kyrofa/ +[1]:http://bit.ly/2sS7M1i +[2]:https://insights.ubuntu.com/author/kyrofa/ +[3]:https://insights.ubuntu.com/2017/04/06/from-ros-prototype-to-production-on-ubuntu-core/ +[4]:https://insights.ubuntu.com/2017/05/09/ros-production-create-ubuntu-core-image-with-snap-preinstalled-55/ +[5]:https://tutorials.ubuntu.com/tutorial/create-your-own-core-image +[6]:http://dashboard.snapcraft.io/ +[7]:https://forum.snapcraft.io/t/unable-to-create-an-image-that-uses-private-snaps +[8]:https://docs.ubuntu.com/core/en/build-store/index +[9]:https://docs.ubuntu.com/core/en/create +[10]:https://forum.snapcraft.io/t/unable-to-create-an-image-that-uses-private-snaps From 880265f58424d4ca8a5baef1f62596981142a6c7 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 14:36:44 +0800 Subject: [PATCH 0788/1407] =?UTF-8?q?20170726-21=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... with Husarion CORE2-ROS running Ubuntu.md | 54 +++++++++++++++++++ 1 file changed, 54 insertions(+) create mode 100644 sources/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md diff --git a/sources/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md b/sources/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md new file mode 100644 index 0000000000..44828018fc --- /dev/null +++ b/sources/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md @@ -0,0 +1,54 @@ +Robot development made easy with Husarion CORE2-ROS running Ubuntu +============================================================ + + + +### Share or save + + _This is the first in a series of two posts by guest blogger; Dominik Nowak, CEO at Husarion._ + +We’ve seen many breakthroughs happening in the IT industry over the last decade. Arguably the most meaningful one on the consumer side was the adoption of smartphones and mobile development. What’s the next big thing, now that the smartphones are so common and, let’s face it, slightly boring? We say: robotics. + +Business knows that well with many manufacturing lines running solely by robots. The consumer and service side, though, have yet to see a massive breakthrough. We believe it’s all a matter of accessibility and lowering the barrier to entry for developers. There just have to be good, simple tools to quickly prototype and develop robots. To test new ideas and empower engineers, so they can solve many of the issues humanity still faces. Issues that are trickier to tackle than a tap in an app. + +Building robots is a challenging task that the [Husarion][2] team is trying to make easier. Husarion is a robotic company working on rapid development platform for robots. The products of the company are CORE2 robotic controller and the cloud platform to manage all CORE2 based robots. CORE2 is the second generation of Husarion’s robotics controller and it’s now available [here][3]. + +CORE2 combines a real-time microcontroller board and a single board computer running Ubuntu. Ubuntu is the most popular Linux distribution not only for [desktops][4], but also for embedded hardware in IoT & [robotics][5] applications. + +![](https://insights.ubuntu.com/wp-content/uploads/2c47/husarion.png) + +CORE2 controller comes in two configurations. The first one with ESP32 Wi-Fi module is dedicated for robotic applications that need low power consumption and real-time, secure remote control. The second one, called CORE2-ROS, basically integrates two boards in one: +– A board with real-time microcontroller running firmware using the Real-Time Operating System (RTOS) and integrating interfaces for motors, encoders and sensors +– A single board computer (SBC) running Linux with ROS packages ([Robot Operating System][6]) and other software tools. + +The ‘real-time’ board does the low-level job. It contains the efficient STM32F4 series microcontroller which is great for driving motors, reading encoders, communicating with sensors and controlling the whole mechatronic or robotic system. In most applications, the CPU load does not exceed a few percents and the real-time operation is guaranteed by a dedicated programming framework based on RTOS. We also assured the compatibility with Arduino libraries. The majority of the tasks are processed in the microcontroller peripherals, such as timers, communication interfaces, ADCs etc. with the strong support of interrupts and DMA channels. In short, it is not a job for a single-board computer that has the other tasks. + +On the other hand, it’s almost obvious that the modern and advanced robotic applications can no longer be based only on microcontrollers, for a few reasons: +– Autonomous robots need a lot of processing power to perform navigation, image and sound recognition, moving in a swarm etc., +– Writing the advanced software requires standardisation to be efficient – SBCs become more and more popular in the industry and the same is observed for the software written for SBCs, which is very similar to PC computers +– SBCs are getting less expensive every year +– Husarion believes that combining these two worlds is very beneficial in robotics. + +CORE2-ROS controller is available in two configurations with [Raspberry Pi 3 ][7]or [ASUS Tinker Board][8]. CORE-ROS is running Ubuntu, Husarion dev & management tools and ROS packets. + +In the next post, find out why Husarion decided to use Ubuntu. + +-------------------------------------------------------------------------------- + +via: https://insights.ubuntu.com/2017/07/12/robot-development-made-easy-with-husarion-core2-ros-running-ubuntu/ + +作者:[Guest ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://insights.ubuntu.com/author/guest/ +[1]:https://insights.ubuntu.com/author/guest/ +[2]:https://husarion.com/ +[3]:https://www.crowdsupply.com/husarion/core2 +[4]:https://www.ubuntu.com/desktop +[5]:https://www.ubuntu.com/internet-of-things/robotics +[6]:http://www.ros.org/ +[7]:https://www.raspberrypi.org/products/raspberry-pi-3-model-b/ +[8]:https://www.asus.com/uk/Single-Board-Computer/Tinker-Board/ From 1c04293f4309162934891d86483dc496f80e6881 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 14:38:16 +0800 Subject: [PATCH 0789/1407] =?UTF-8?q?20170726-22=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...lps you avoid getting a stuck OpenStack.md | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 sources/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md diff --git a/sources/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md b/sources/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md new file mode 100644 index 0000000000..bf0eea18bf --- /dev/null +++ b/sources/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md @@ -0,0 +1,76 @@ +How modelling helps you avoid getting a stuck OpenStack +============================================================ + + +### Share or save + +![](https://insights.ubuntu.com/wp-content/uploads/bd5d/airbus.jpg) + + _Lego model of an Airbus A380-800\. Airbus run OpenStack_ + +A “StuckStack” is a deployment of OpenStack that usually, for technical but sometimes business reasons, is unable to be upgraded without significant disruption, time and expense. In the last post on this topic we discussed how many of these clouds became stuck and how the decisions made at the time were consistent with much of the prevailing wisdom of the day. Now, with OpenStack being 7 years old, the recent explosion of growth in container orchestration systems and more businesses starting to make use of cloud platforms, both public and private, OpenStack are under pressure. + +### No magic solution + +If you are still searching for a solution to upgrade your existing StuckStack in place without issues, then I have bad news for you: there are no magic solutions and you are best focusing your energy on building a standardised platform that can be operated efficiently and upgraded easily. + +The low cost airlines industry has shown that whilst flyers may aspire to best of breed experience and sit in first or business class sipping champagne with plenty of space to relax, most will choose to fly in the cheapest seat as ultimately the value equation doesn’t warrant them paying more. Workloads are the same. Long term, workloads will run on the platform where it is most economic to run them as the business really doesn’t benefit from running on premium priced hardware or software. + +Amazon, Microsoft, Google and other large scale public cloud players know this which is why they have built highly efficient data centres and used models to build, operate and scale their infrastructure. Enterprises have long followed a policy of using best of breed hardware and software infrastructure that is designed, built, marketed, priced, sold and implemented as first class experiences. The reality may not have always lived up to the promise but it matters not now anyway, as the cost model cannot survive in today’s world. Some organisations have tried to tackle this by switching to free software alternatives yet without a change in their own behaviour. Thus find that they are merely moving cost from software acquisition to software operation.The good news is that the techniques used by the large operators, who place efficient operations above all else, are available to organisations of all types now. + +### What is a software model? + +Whilst for many years software applications have been comprised of many objects, processes and services, in recent years it has become far more common for applications to be made up of many individual services that are highly distributed across servers in a data centre and across different data centres themselves. + +![](https://insights.ubuntu.com/wp-content/uploads/f881/OpenStack-graphic.png) + + _A simple representation of OpenStack Services_ + +Many services means many pieces of software to configure, manage and keep track of over many physical machines. Doing this at scale in a cost efficient way requires a model of how all the components are connected and how they map to physical resources. To build the model we need to have a library of software components, a means of defining how they connect with one another and a way to deploy them onto a platform, be it physical or virtual. At Canonical we recognised this several years ago and built [Juju][2], a generic software modelling tool that enables operators to compose complex software applications with flexible topologies, architectures and deployment targets from a catalogue of 100s of common software services. + +![](https://insights.ubuntu.com/wp-content/uploads/7790/jjuju.png) + + _Juju modelling OpenStack Services_ + +In Juju, software services are defined in something called a Charm. Charms are pieces of code, typically written in python or bash that give information about the service – the interfaces declared, how the service is installed, what other services it can connect to etc. + +Charms can be simple or complex depending on the level of intelligence you wish to give them. For OpenStack, Canonical, with help from the upstream OpenStack community, has developed a full set of Charms for the primary OpenStack services. The Charms represents the instructions for the model such that it can be deployed, operated scaled and replicated with ease. The Charms also define how to upgrade themselves including, where needed, the sequence in which to perform the upgrade and how to gracefully pause and resume services when required. By connecting Juju to a bare metal provisioning system such as [Metal As A Service (MAAS)][3] the logical model of OpenStack can is deployed to physical hardware. By default, the Charms will deploy services in LXC containers which gives greater flexibility to relocate services as required based on the cloud behaviour. Config is defined in the Charms or injected at deploy time by a 3rd party tool such as Puppet or Chef. + +There are 2 distinct benefits from this approach: 1 – by creating a model we have abstracted each of the cloud services from the underlying hardware and 2: we have the means to compose new architectures through iterations using the standardised components from a known source. This consistency is what enables us to deploy very different cloud architectures using the same tooling, safe in the knowledge that we will be able to operate and upgrade them easily. + +With hardware inventory being managed with a fully automated provisioning tool and software applications modelled, operators can scale infrastructure much more efficiently than using legacy enterprise techniques or building a bespoke system that deviates from core. Valuable development resources can be focused on innovating in the application space, bringing new software services online faster rather than altering standard, commodity infrastructure in a way which will create compatibility problems further down the line. + +In the next post I’ll highlight some of the best practises for deploying a fully modelled OpenStack and how you can get going quickly. If you have an existing StuckStack then whilst we aren’t going to be able to rescue it that easily, we will be able to get you on a path to fully supported, efficient infrastructure with operations cost that compares to public cloud. + +### Upcoming webinar + +If you are stuck on an old version of OpenStack and want to upgrade your OpenStack cloud easily and without downtime, watch our [on-demand webinar][4] with live demo of an upgrade from Newton to Ocata. + +### Contact us + +If you would like to learn more about migrating to a Canonical OpenStack cloud, [get in touch][5]. + +-------------------------------------------------------------------------------- + +作者简介: + +Cloud Product Manager focused on Ubuntu OpenStack. Previously at MySQL and Red Hat. Likes motorcycles and meeting people who do interesting stuff with Ubuntu and OpenStack + + +------ + + +via: https://insights.ubuntu.com/2017/07/18/stuckstack-how-modelling-helps-you-avoid-getting-a-stuck-openstack/ + +作者:[Mark Baker ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://insights.ubuntu.com/author/markbaker/ +[1]:https://insights.ubuntu.com/author/markbaker/ +[2]:https://www.ubuntu.com/cloud/juju +[3]:https://www.ubuntu.com/server/maas +[4]:http://ubunt.eu/Bwe7kQ +[5]:http://ubunt.eu/3OYs5s From 75698df75408226873fdd28465fcb334c9f09c08 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 14:39:39 +0800 Subject: [PATCH 0790/1407] =?UTF-8?q?20170726-23=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... when building a robot with open source.md | 55 +++++++++++++++++++ 1 file changed, 55 insertions(+) create mode 100644 sources/tech/20170718 Things to consider when building a robot with open source.md diff --git a/sources/tech/20170718 Things to consider when building a robot with open source.md b/sources/tech/20170718 Things to consider when building a robot with open source.md new file mode 100644 index 0000000000..fb732bd275 --- /dev/null +++ b/sources/tech/20170718 Things to consider when building a robot with open source.md @@ -0,0 +1,55 @@ +Things to consider when building a robot with open source +============================================== + + +### Share or save + +![](https://insights.ubuntu.com/wp-content/uploads/fbfc/flashing.png) + +So you’re considering (or are in the process of) bringing a robot, using open source software, to market. It’s based on Linux. Maybe you’re using the [Robot Operating System][2] (ROS), or the [Mission Oriented Operating Suite][3] (MOOS), or yet another open-source middleware that’s helping you streamline development. As development nears something useful, you start receiving some pressure about desired returns on this thing. You might be asked ‘When can we start selling it?’ This is where you reach a crossroads. + +You can do one of two things: + +1. Start shipping essentially what you have now + +2. Step back, and treat going to production as an entirely new problem to solve, with new questions to answer + +You don’t need to look very far to see examples of people who settled on (1). In fact, the IoT market is flooded with them. With the rush to get devices to market, it’s not at all rare to find devices left with hard-coded credentials, development keys, various security vulnerabilities, and no update path. + +Think of Mirai, the botnet that mounted a DDoS attack with traffic surpassing 1Tbps, bringing down some of the biggest websites on the Internet. It’s made up primarily of IoT devices. Does it use super cool black magic developed in a windowless lab (or basement) to overwhelm the devices’ defenses and become their master? Nope, default (and often hard-coded) credentials. Did the manufacturers of these devices react quickly and release updates to all these devices in order to secure them? No, many of them don’t have an update method at all. [They recalled them instead][4]. + +Rather than rushing to market, take a step back. You can save yourself and your company a lot of pain simply by thinking through a few points. + +For example, **how is your software updated**? You  _must_  be able to answer this question. Your software is not perfect. In a few weeks you’ll find out that, when your autonomous HMMWV is used in California, it thinks that little sagebrush is an oak. Or you accidentally included your SSH keys. + +**How is the base OS updated**? Perhaps this is still part of your product, and answering the above question answers this one as well. But perhaps your OS comes from another vendor. How do you get updates from them to your customers? This is where security vulnerabilities can really bite you: a kernel that is never updated, or a severely out-of-date openssl. + +Once you have updates figured out, **how is your robot recovered if an update goes sideways**? My go-to example for this is a common solution to the previous problem: automatic security updates. That’s a great practice for servers and desktops and things that are obviously computers, because most people realize that there’s an acceptable way to turn those off, and it’s  _not_  to hold the power button for 5 seconds. Robotic systems (and IoT systems in general) have a bit of an issue in that sometimes they’re not viewed as computers at all. If your robot is behaving oddly, chances are it will be forcefully powered off. If it was behaving oddly because it was installing a kernel update real quick, well, now you have a robotic paperweight with a partially installed kernel. You need to be able to deal with this type of situation. + +Finally, **what is your factory process**? How do you install Linux, ROS (or whatever middleware you’re using), and your own stuff on a device you’re about to ship? Small shops might do it by hand, but that doesn’t scale and is error-prone. Others might make a custom seeded distro ISO, but that’s no small task and it’s not easy to maintain as you update your software. Still others use Chef or some other automation tool with a serious learning curve, and before long you realize that you dumped a significant amount of engineering effort into something that should have been easy. + +All of these questions are important. If you find yourself not having clear answers to any of them, you should join our webinar, where we discuss how to build a commercial robot with open source. We’ll help you think through these questions, and be available to answer any more you have! + +-------------------------------------------------------------------------------- + +作者简介: + +Kyle is a member of the Snapcraft team, and is also Canonical's resident roboticist. He focuses on snaps and the snap developer experience, as well as robotics enablement for snaps and Ubuntu Core. + + + +----------- + +via: https://insights.ubuntu.com/2017/07/18/things-to-consider-when-building-a-robot-with-open-source/ + +作者:[Kyle Fazzari ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://insights.ubuntu.com/author/kyrofa/ +[1]:https://insights.ubuntu.com/author/kyrofa/ +[2]:http://www.ros.org/ +[3]:http://www.robots.ox.ac.uk/~mobile/MOOS/wiki/pmwiki.php/Main/HomePage +[4]:https://krebsonsecurity.com/2016/10/iot-device-maker-vows-product-recall-legal-action-against-western-accusers/ From 77b5a30a88f9edb1ea915d07d412ed79d9b8db5f Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 14:40:57 +0800 Subject: [PATCH 0791/1407] =?UTF-8?q?20170726-24=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ss another way to get socket statistics.md | 67 +++++++++++++++++++ 1 file changed, 67 insertions(+) create mode 100644 sources/tech/20170725 ss another way to get socket statistics.md diff --git a/sources/tech/20170725 ss another way to get socket statistics.md b/sources/tech/20170725 ss another way to get socket statistics.md new file mode 100644 index 0000000000..51067dffde --- /dev/null +++ b/sources/tech/20170725 ss another way to get socket statistics.md @@ -0,0 +1,67 @@ +ss: another way to get socket statistics +============================================================ + +### Share or save + +In an earlier blog post I mentioned **ss**, another tool that comes with the  _iproute2_  package and allows you to query statistics about sockets. The same thing that can be done with **netstat**, with the added benefit that it is typically a little bit faster, and shorter to type. + +Just **ss **by default will display much the same thing as netstat, and can be similarly passed options to limit the output to just what you want. For instance: + +``` +$ ss -t +State       Recv-Q Send-Q       Local Address:Port                        Peer Address:Port +ESTAB       0      0                127.0.0.1:postgresql                     127.0.0.1:48154 +ESTAB       0      0            192.168.0.136:35296                      192.168.0.120:8009 +ESTAB       0      0            192.168.0.136:47574                     173.194.74.189:https +``` + +[…] + +**ss -t **shows just TCP connections. **ss -u **can be used to show UDP connections, **-l **will show only listening ports, and things can be further filtered to just the information you want. + +I have not tested all the possible options, but you can even forcibly close sockets with **-K**. + +One place where **ss** really shines though is in its filtering capabilities. Let’s list all connections with a source port of 22 (ssh): + +``` +$ ss state all sport = :ssh +Netid State      Recv-Q Send-Q     Local Address:Port                      Peer Address:Port +tcp   LISTEN     0      128                    *:ssh                                  *:* +tcp   ESTAB      0      0          192.168.0.136:ssh                      192.168.0.102:46540 +tcp   LISTEN     0      128                   :::ssh                                 :::* +``` + +And if I want to show only connected sockets (everything but  _listening_  or  _closed_ ): + +``` +$ ss state connected sport = :ssh +Netid State      Recv-Q Send-Q     Local Address:Port                      Peer Address:Port +tcp   ESTAB      0      0          192.168.0.136:ssh                      192.168.0.102:46540 +``` + +Similarly, you can have it list all connections to a specific host or range; in this case, using the 74.125.0.0/16 subnet, which apparently belongs to Google: + +``` +$ ss state all dst 74.125.0.0/16 +Netid State      Recv-Q Send-Q     Local Address:Port                      Peer Address:Port +tcp   ESTAB      0      0          192.168.0.136:33616                   74.125.142.189:https +tcp   ESTAB      0      0          192.168.0.136:42034                    74.125.70.189:https +tcp   ESTAB      0      0          192.168.0.136:57408                   74.125.202.189:https +``` + +This is very much the same syntax as for  _iptables_ , so if you’re familiar with that already, it will be quite easy to pick up. You can also install the  _iproute2-doc_  package, and look in  _/usr/share/doc/iproute2-doc/ss.html_  for the full documentation. + +Try it for yourself! You’ll see how well it works. If anything, I’m glad for the fewer characters this makes me type. + +-------------------------------------------------------------------------------- + +via: https://insights.ubuntu.com/2017/07/25/ss-another-way-to-get-socket-statistics/ + +作者:[ Mathieu Trudel-Lapierre ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://insights.ubuntu.com/author/mathieu-trudel-lapierre/ +[1]:https://insights.ubuntu.com/author/mathieu-trudel-lapierre/ From 423d72a33c690e25fa7af81bc667a4150afafa34 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 14:42:31 +0800 Subject: [PATCH 0792/1407] =?UTF-8?q?20170726-26=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20170712 Storage management in LXD 2.15.md | 83 +++++++++++++++++++ 1 file changed, 83 insertions(+) create mode 100644 sources/tech/20170712 Storage management in LXD 2.15.md diff --git a/sources/tech/20170712 Storage management in LXD 2.15.md b/sources/tech/20170712 Storage management in LXD 2.15.md new file mode 100644 index 0000000000..c4644d75f8 --- /dev/null +++ b/sources/tech/20170712 Storage management in LXD 2.15.md @@ -0,0 +1,83 @@ +Storage management in LXD 2.15 +============================================================ + + +### Share or save + +![containers](https://cbrauner.files.wordpress.com/2017/07/containers.png?w=1008) + +For a long time LXD has supported multiple storage drivers. Users could choose between zfs, btrfs, lvm, or plain directory storage pools but they could only ever use a single storage pool. A frequent feature request was to support not just a single storage pool but multiple storage pools. This way users would for example be able to maintain a zfs storage pool backed by an SSD to be used by very I/O intensive containers and another simple directory based storage pool for other containers. Luckily, this is now possible since LXD gained its own storage management API a few versions back. + +### Creating storage pools + +A new LXD installation comes without any storage pool defined. If you run `lxd init`LXD will offer to create a storage pool for you. The storage pool created by `lxd init`will be the default storage pool on which containers are created. + + [![asciicast](https://asciinema.org/a/126892.png)][2] + +### Creating further storage pools + +Our client tool makes it really simple to create additional storage pools. In order to create and administer new storage pools you can use the `lxc storage` command. So if you wanted to create an additional btrfs storage pool on a block device `/dev/sdb`you would simply use `lxc storage create my-btrfs btrfs source=/dev/sdb`. But let’s take a look: + + [![asciicast](https://asciinema.org/a/128580.png)][3] + +### Creating containers on the default storage pool + +If you started from a fresh install of LXD and created a storage pool via `lxd init` LXD will use this pool as the default storage pool. That means if you’re doing a `lxc launch images:ubuntu/xenial xen1` LXD will create a storage volume for the container’s root filesystem on this storage pool. In our examples we’ve been using `my-first-zfs-pool`as our default storage pool: + + [![asciicast](https://asciinema.org/a/128582.png)][4] + +### Creating containers on a specific storage pool + +But you can also tell `lxc launch` and `lxc init` to create a container on a specific storage pool by simply passing the `-s` argument. For example, if you wanted to create a new container on the `my-btrfs` storage pool you would do `lxc launch images:ubuntu/xenial xen-on-my-btrfs -s my-btrfs`: + + [![asciicast](https://asciinema.org/a/128583.png)][5] + +### Creating custom storage volumes + +If you need additional space for one of your containers to for example store additional data the new storage API will let you create storage volumes that can be attached to a container. This is as simple as doing `lxc storage volume create my-btrfs my-custom-volume`: + + [![asciicast](https://asciinema.org/a/128584.png)][6] + +### Attaching custom storage volumes to containers + +Of course this feature is only helpful because the storage API let’s you attach those storage volume to containers. To attach a storage volume to a container you can use `lxc storage volume attach my-btrfs my-custom-volume xen1 data /opt/my/data`: + + [![asciicast](https://asciinema.org/a/128585.png)][7] + +### Sharing custom storage volumes between containers + +By default LXD will make an attached storage volume writable by the container it is attached to. This means it will change the ownership of the storage volume to the container’s id mapping. But Storage volumes can also be attached to multiple containers at the same time. This is great for sharing data among multiple containers. However, this comes with a few restrictions. In order for a storage volume to be attached to multiple containers they must all share the same id mapping. Let’s create an additional container `xen-isolated` that has an isolated id mapping. This means its id mapping will be unique in this LXD instance such that no other container does have the same id mapping. Attaching the same storage volume `my-custom-volume` to this container will now fail: + + [![asciicast](https://asciinema.org/a/128588.png)][8] + +But let’s make `xen-isolated` have the same mapping as `xen1` and let’s also rename it to `xen2` to reflect that change. Now we can attach `my-custom-volume` to both `xen1` and `xen2` without a problem: + + [![asciicast](https://asciinema.org/a/128593.png)][9] + +### Summary + +The storage API is a very powerful addition to LXD. It provides a set of essential features that are helpful in dealing with a variety of problems when using containers at scale. This short introducion hopefully gave you an impression on what you can do with it. There will be more to come in the future. + +This blog was originally featured at [Brauner's Blog][10] + +-------------------------------------------------------------------------------- + +via: https://insights.ubuntu.com/2017/07/12/storage-management-in-lxd-2-15/ + +作者:[Christian Brauner ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://cbrauner.wordpress.com/ +[1]:https://insights.ubuntu.com/author/christian-brauner/ +[2]:https://asciinema.org/a/126892 +[3]:https://asciinema.org/a/128580 +[4]:https://asciinema.org/a/128582 +[5]:https://asciinema.org/a/128583 +[6]:https://asciinema.org/a/128584 +[7]:https://asciinema.org/a/128585 +[8]:https://asciinema.org/a/128588 +[9]:https://asciinema.org/a/128593 +[10]:https://cbrauner.wordpress.com/ From efd1b45b8cc010acc089bb0eba0194a4d9f629fe Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 14:44:23 +0800 Subject: [PATCH 0793/1407] =?UTF-8?q?20170726-27=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sources/tech/20170706 OpenStack in a Snap.md | 197 +++++++++++++++++++ 1 file changed, 197 insertions(+) create mode 100644 sources/tech/20170706 OpenStack in a Snap.md diff --git a/sources/tech/20170706 OpenStack in a Snap.md b/sources/tech/20170706 OpenStack in a Snap.md new file mode 100644 index 0000000000..9a4e9ed933 --- /dev/null +++ b/sources/tech/20170706 OpenStack in a Snap.md @@ -0,0 +1,197 @@ +OpenStack in a Snap +============================================================ + + +### Share or save + +![](https://insights.ubuntu.com/wp-content/uploads/646b/openstaack-in-a-snap.png) + +OpenStack is complex and many of the community members are working hard to make the deployment and operation of OpenStack easier. Much of this time is focused on tools such as Ansible, Puppet, Kolla, Juju, Triple-O, Chef (to name a few). But what if we step down a level and also make the package experience easier? + +With snaps we’re working on doing just that. Snaps are a new way of delivering software. The following description from [snapcraft.io][2] provides a good summary of the core benefits of snaps:  _“Snaps are quick to install, easy to create, safe to run, and they update automatically and transactionally so your app is always fresh and never broken.”_ + +### Bundled software + +A single snap can deliver multiple pieces of software from different sources to provide a solution that gets you up and running fast. You’ll notice that installing a snap is quick. That’s because when you install a snap, that single snap bundles all of its dependencies. That’s a bit different from installing a deb, where all of the dependencies get pulled down and installed separately. + +### Snaps are easy to create + +In my time working on Ubuntu, I’ve spent much of it working on Debian packaging for OpenStack. It’s a niche skill that takes quite a bit of time to understand the nuances of. When compared with snaps, the difference in complexity between deb packages and snaps is like night and day. Snaps are just plain simple to work on, and even quite fun! + +### A few more features of snaps + +* Each snap is installed in it’s own read-only squashfs filesystem. + +* Each snap is run in a strict environment sandboxed by AppArmor and seccomp policy. + +* Snaps are transactional. New versions of a snap install to a new read-only squashfs filesystem. If an upgrade fails, it will roll-back to the old version. + +* Snaps will auto-refresh when new versions are available. + +* OpenStack Snaps are guaranteed to be aligned with OpenStack’s upper-constraints. Packagers no longer need to maintain separate packages for the OpenStack dependency chain. Woo-hoo! + +### Introducing the OpenStack Snaps! + +We currently have the following projects snapped: + +* **Keystone** – This snap provides the OpenStack identity service. + +* **Glance** – This snap provides the OpenStack image service. + +* **Neutron** – This snap specifically provides the ‘neutron-server’ process as part of a snap based OpenStack deployment. + +* **Nova** – This snap provides the Nova controller component of an OpenStack deployment. + +* **Nova-hypervisor** – This snap provides the hypervisor component of an OpenStack deployment, configured to use Libvirt/KVM + Open vSwitch which are installed using deb packages. This snap also includes nova-lxd, allowing for use of nova-lxd instead of KVM. + +This is enough to get a minimal working OpenStack cloud. You can find the source for all of the OpenStack snaps on [github][3]. For more details on the OpenStack snaps please refer to the individual READMEs in the upstream repositories. There you can find more details for managing the snaps, such as overriding default configs, restarting services, setting up aliases, and more. + +### Want to create your own OpenStack snap? + +Check out the [snap cookie cutter][4]. I’ll be writing a blog post soon that walks you through using the snap cookie cutter. It’s really simple and will help get the creation of a new OpenStack snap bootstrapped in no time. + +### Testing the OpenStack snaps + +We’ve been using a simple script for initial testing of the OpenStack snaps. The script installs the snaps on a single node and provides additional post-install configuration for services. To try it out: + +``` +git clone https://github.com/openstack-snaps/snap-test +cd snap-test +./snap-deploy +``` + +At this point we’ve been doing all of our testing on Ubuntu Xenial (16.04). Also note that this will install and configure quite a bit of software on your system so you’ll likely want to run it on a disposable machine. + +### Tracking OpenStack + +Today you can install snaps from the edge channel of the snap store. For example: + +``` +sudo snap install --edge keystone +``` + +The OpenStack team is working toward getting CI/CD in place to enable publishing snaps across tracks for OpenStack releases (Ie. a track for ocata, another track for pike, etc). Within each track will be 4 different channels. The edge channel for each track will contain the tip of the OpenStack project’s corresponding branch, with the beta, candidate and release channels being reserved for released versions. This should result in an experience such as: + +``` +sudo snap install --channel=ocata/stable keystone +sudo snap install --channel=pike/edge keystone +``` + +### Poking around + +Snaps have various environment variables available to them that simplify the creation of the snap. They’re all documented [here][6]. You probably won’t need to know much about them to be honest, however there are a few locations that you’ll want to be familiar with once you’ve installed a snap: + +### _$SNAP == /snap//current_ + +This is where the snap and all of it’s files are mounted. Everything here is read-only. In my current install of keystone, $SNAP is /snap/keystone/91\. Fortunately you don’t need to know the current version number as there’s a symlink to that directory at /snap/keystone/current. + +``` +$ ls /snap/keystone/current/ +bin                     etc      pysqlite2-doc        usr +command-manage.wrapper  include  snap                 var +command-nginx.wrapper   lib      snap-openstack.yaml +command-uwsgi.wrapper   meta     templates + +$ ls /snap/keystone/current/bin/ +alembic                oslo-messaging-send-notification +convert-json           oslo-messaging-zmq-broker +jsonschema             oslo-messaging-zmq-proxy +keystone-manage        oslopolicy-checker +keystone-wsgi-admin    oslopolicy-list-redundant +keystone-wsgi-public   oslopolicy-policy-generator +lockutils-wrapper      oslopolicy-sample-generator +make_metadata.py       osprofiler +mako-render            parse_xsd2.py +mdexport.py            pbr +merge_metadata.py      pybabel +migrate                snap-openstack +migrate-repository     sqlformat +netaddr                uwsgi +oslo-config-generator + +$ ls /snap/keystone/current/usr/bin/ +2to3               idle     pycompile     python2.7-config +2to3-2.7           pdb      pydoc         python2-config +cautious-launcher  pdb2.7   pydoc2.7      python-config +compose            pip      pygettext     pyversions +dh_python2         pip2     pygettext2.7  run-mailcap +easy_install       pip2.7   python        see +easy_install-2.7   print    python2       smtpd.py +edit               pyclean  python2.7 + +$ ls /snap/keystone/current/lib/python2.7/site-packages/ +... +``` + +### _$SNAP_COMMON == /var/snap//common_ + +This directory is used for system data that is common across revisions of a snap. This is where you’ll override default config files and access log files. + +``` +$ ls /var/snap/keystone/common/ +etc  fernet-keys  lib  lock  log  run + +$ sudo ls /var/snap/keystone/common/etc/ +keystone  nginx  uwsgi + +$ ls /var/snap/keystone/common/log/ +keystone.log  nginx-access.log  nginx-error.log  uwsgi.log +``` + +### Strict confinement + +The snaps all run under strict confinement, where each snap is run in a restricted environment that is sandboxed with seccomp and AppArmor policy. More details on snap confinement can be viewed [here][7]. + +### New features/updates coming for snaps + +There are a few features and updates coming for snaps that I’m looking forward to: + +* We’re working on getting libvirt AppArmor policy in place so that the nova-hypervisor snap can access qcow2 backing files. + * For now, as a work-around, you can put virt-aa-helper in complain mode: sudo aa-complain /usr/lib/libvirt/virt-aa-helper + +* We’re also working on getting additional snapd interface policy in place that will enable network connectivity for deployed instances. + * For now you can install the nova-hypervisor snap in devmode, which disables security confinement: snap install –devmode –edge nova-hypervisor + +* Auto-connecting nova-hypervisor interfaces. We’re working on getting the interfaces for the nova-hypervisor defined automatically at install time. + * Interfaces define the AppArmor and seccomp policy that enables a snap to access resources on the system. + + * For now you can manually connect the required interfaces as described in the nova-hypervisor snap’s README. + +* Auto-alias support for commands. We’re working on getting auto-alias support defined for commands across the snaps, where aliases will be defined automatically at install time. + * This enables use of the traditional command names. Instead of ‘nova.manage db sync‘ you’ll be able to issue ‘nova-manage db sync’ right after installing the snap. + + * For now you can manually enable aliases after the snap is installed, such as ‘snap alias nova.manage nova-manage’. See the snap READMEs for more details. + +* Auto-alias support for daemons. Currently snappy only supports aliases for commands (not daemons). Once alias support is available for daemons, we’ll set them up to be automatically configured at install time. + * This enables use of the traditional unit file names. Instead of ‘systemctl restart snap.nova.nova-compute’ you’ll be able to issue ‘systemctl restart nova-compute’. + +* Asset tracking for snaps. This will enables tracking of versions used to build the snap which can be re-used in future builds. + +If you’d like to chat more about snaps you can find us on IRC in #openstack-snaps on freenode. We welcome your feedback and contributions! Thanks and have fun! Corey + +-------------------------------------------------------------------------------- + +作者简介: + +Corey Bryant is an Ubuntu core developer and software engineer at Canonical on the OpenStack Engineering team, primarily focusing on OpenStack packaging for Ubuntu and OpenStack charm development for Juju. He's passionate about open-source software and enjoys working with people from all over the world on a common cause. + + + +------ + +via: 网址 + +作者:[ Corey Bryant ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://insights.ubuntu.com/author/corey-bryant/ +[1]:https://insights.ubuntu.com/author/corey-bryant/ +[2]:http://snapcraft.io/ +[3]:https://github.com/openstack?utf8=%E2%9C%93&q=snap-&type=&language= +[4]:https://github.com/openstack-snaps/snap-cookiecutter/blob/master/README.rst +[5]:https://github.com/openstack-snaps/snap-test +[6]:https://snapcraft.io/docs/reference/env +[7]:https://snapcraft.io/docs/reference/confinement From 6b61ae0faa407461caae343e4e8a3b1f0dec6b45 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 14:46:13 +0800 Subject: [PATCH 0794/1407] =?UTF-8?q?20170726-27=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...d publish snap packages using snapcraft.md | 173 ++++++++++++++++++ 1 file changed, 173 insertions(+) create mode 100644 sources/tech/20170628 Build test and publish snap packages using snapcraft.md diff --git a/sources/tech/20170628 Build test and publish snap packages using snapcraft.md b/sources/tech/20170628 Build test and publish snap packages using snapcraft.md new file mode 100644 index 0000000000..dbb86e5ee6 --- /dev/null +++ b/sources/tech/20170628 Build test and publish snap packages using snapcraft.md @@ -0,0 +1,173 @@ +Build, test, and publish snap packages using snapcraft +============================================================ + + +### Share or save + + _This is a guest post by Ricardo Feliciano, Developer Evangelist at CircleCI. If you would like to contribute a guest post, please contact ubuntu-iot@canonical.com._ + +Snapcraft, the package management system fighting for its spot at the Linux table, re-imagines how you can deliver your software. A new set of cross-distro tools are available to help you build and publish “Snaps”. We’ll cover how to use CircleCI 2.0 to power this process and some potential gotchas along the way. + +### What are snap packages? And Snapcraft? + +**Snaps** are software packages for Linux distributions. They’re designed with lessons learned from delivering software on mobile platforms such as Android as well Internet of Things devices. **Snapcraft** is the name that encompasses Snaps and the command-line tool that builds them, [the website][9], and pretty much the entire ecosystem around the technologies that enables this. + +Snap packages are designed to isolate and encapsulate an entire application. This concept enables Snapcraft’s goal of increasing security, stability, and portability of software allowing a single “snap” to be installed on not just multiple versions of Ubuntu, but Debian, Fedora, Arch, and more. Snapcraft’s description per their website: + +“Package any app for every Linux desktop, server, cloud or device, and deliver updates directly.” + +### Building a snap package on CircleCI 2.0 + +Building a snap on CircleCI is mostly the same as your local machine, wrapped with [CircleCI 2.0 syntax][10]. We’ll go through a sample config file in this post. If you’re not familiar with CircleCI or would like to know more about getting started with 2.0 specifically, you can start [here][11]. + +### Base Config + +``` +version: 2 +jobs: + build: + machine: true + working_directory: ~/project + steps: + - checkout + - run: + command: | + sudo apt update && sudo apt install -y snapd + sudo snap install snapcraft --edge --classic + /snap/bin/snapcraft + +``` + +This example uses the `machine` executor to install `snapd`, the executable that allows you to manage snaps and enables the platform, as well as `snapcraft`, the tool for creating snaps. + +The `machine` executor is used rather than the `docker` executor as we need a newer kernel for the build process. Linux 4.4 is available here, which is new enough for our purposes. + +### Userspace dependencies + +The example above uses the `machine` executor, which currently is [a VM with Ubuntu 14.04 (Trusty)][12] and the Linux v4.4 kernel. This is fine if your project/snap requires build dependencies available in the Trusty repositories. What if you need dependencies available in a different version, perhaps Ubuntu 16.04 (Xenial)? We can still use Docker within the `machine` executor to build our snap. + +``` +version: 2 +jobs: + build: + machine: true + working_directory: ~/project + steps: + - checkout + - run: + command: | + sudo apt update && sudo apt install -y snapd + docker run -v $(pwd):$(pwd) -t ubuntu:xenial sh -c "apt update -qq && apt install snapcraft -y && cd $(pwd) && snapcraft" + +``` + +In this example, we again install `snapd` in the `machine` executor’s VM, but we decide to install Snapcraft and build our snap within a Docker container built with the Ubuntu Xenial image. All `apt` packages available in Ubuntu 16.04 will be available to `snapcraft` during the build. + +### Testing + +Unit testing your software’s code has been covered extensively in [our blog][13], [our docs][14], and around the Internet. Searching for your language/framework and unit testing or CI will turn up tons of information. Building a snap on CircleCI means we end with a `.snap` file which we can test in addition to the code that created it. + +### Workflows + +Let’s say the snap we built was a webapp. We can build a testing suite to make sure this snap installs and runs correctly. We could try installing the snap. We could run [Selenium][15] to make sure the proper pages load, logins, work, etc. Here’s the catch, snaps are designed to run on multiple Linux distros. That means we need to be able to run this test suite in Ubuntu 16.04, Fedora 25, Debian 9, etc. CircleCI 2.0’s Workflows can efficiently solve this. + +[A recent addition][16] to the CircleCI 2.0 beta is Workflows. This allows us to run discrete jobs in CircleCI with a certain flow logic. In this case, **after** our snap is built, which would be a single job, we could then kick off snap distro testing jobs, running in parallel. One for each distro we want to test. Each of these jobs would be a different [Docker image][17] for that distro (or in the future, additional `executors` will be available). + +Here’s simple example of what this might look like: + +``` +workflows: + version: 2 + build-test-and-deploy: + jobs: + - build + - acceptance_test_xenial: + requires: + - build + - acceptance_test_fedora_25: + requires: + - build + - acceptance_test_arch: + requires: + - build + - publish: + requires: + - acceptance_test_xenial + - acceptance_test_fedora_25 + - acceptance_test_arch + +``` + +This setup builds the snap, and then runs acceptance tests on it with four different distros. If and when all distro builds pass, then we can run the publish `job` in order to finish up any remaining snap task before pushing it to the Snap Store. + +### Persisting the .snap package + +To test our `.snap` package in the workflows example, a way of persisting that file between builds is needed. I’ll mention two ways here. + +1. **artifacts** – We could store the snap package as a CircleCI artifact during the `build`job. Then retrieve it within the following jobs. CircleCI Workflows has its own way of of handling sharing artifacts which can be found [here][1]. + +2. **snap store channels** – When publishing a snap to the Snap Store, there’s more than one `channel` to choose from. It’s becoming a common practice to publish the master branch of your snap to the `edge` channel for internal and/or user testing. This can be done in the `build` job, with the following jobs installing the snap from the edge channel. + +The first method is faster to complete and has the advantage of being able to run acceptance tests on your snap before it hits the Snap Store and touches any user, even testing users. The second method has the advantage of install from the Snap Store being one of the test that is run during CI. + +### Authenticating with the snap store + +The script [snapcraft-config-generator.py][18] can generate the store credentials and save them to `.snapcraft/snapcraft.cfg` (note: always inspect public scripts before running them). You don’t want to store this file in plaintext in your repo (for security reasons). You can either base64 encode the file and store it as a [private environment variable][19] or you can [encrypt the file][20] and just store the key in a private environment variable. + +Here’s an example of having the store credentials in an encrypted file, and using the creds in a `deploy` step to publish to the Snap Store: + +``` +- deploy: + name: Push to Snap Store + command: | + openssl aes-256-cbc -d -in .snapcraft/snapcraft.encrypted -out .snapcraft/snapcraft.cfg -k $KEY + /snap/bin/snapcraft push *.snap + +``` + +Instead of a deploy step, keeping with the Workflow examples from earlier, this could be a deploy job that only runs when and if the acceptance test jobs passed. + +### More information + +* Alan Pope’s [Forum Post][2]: “popey” is a Canonical employee and wrote the post in [Snapcraft’s Forum][3] that inspired this blog post + +* [Snapcraft Website][4]: the official Snapcraft website + +* [Snapcraft’s CircleCI Bug Report][5]: There is an open bug report on Launchpad to add support for CircleCI to Snapcraft. This will make this process a little easier and more “official”. Please add your support. + +* How the [Nextcloud][6] snap is being built with CircleCI: a great blog post called [“Continuous acceptance tests for complex applications”][7]. Also influenced this blog post. + +Original post [here][21] + +-------------------------------------------------------------------------------- + +via: https://insights.ubuntu.com/2017/06/28/build-test-and-publish-snap-packages-using-snapcraft/ + +作者:[ Guest ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://insights.ubuntu.com/author/guest/ +[1]:https://circleci.com/docs/2.0/workflows/#using-workspaces-to-share-artifacts-among-jobs +[2]:https://forum.snapcraft.io/t/building-and-pushing-snaps-using-circleci/789 +[3]:https://forum.snapcraft.io/ +[4]:https://snapcraft.io/ +[5]:https://bugs.launchpad.net/snapcraft/+bug/1693451 +[6]:https://nextcloud.com/ +[7]:https://kyrofa.com/posts/continuous-acceptance-tests-for-complex-applications +[8]:https://insights.ubuntu.com/author/guest/ +[9]:https://snapcraft.io/ +[10]:https://circleci.com/docs/2.0/ +[11]:https://circleci.com/docs/2.0/first-steps/ +[12]:https://circleci.com/docs/1.0/differences-between-trusty-and-precise/ +[13]:https://circleci.com/blog/ +[14]:https://circleci.com/docs/ +[15]:http://www.seleniumhq.org/ +[16]:https://circleci.com/blog/introducing-workflows-on-circleci-2-0/ +[17]:https://circleci.com/docs/2.0/building-docker-images/ +[18]:https://gist.github.com/3v1n0/479ad142eccdd17ad7d0445762dea755 +[19]:https://circleci.com/docs/1.0/environment-variables/#setting-environment-variables-for-all-commands-without-adding-them-to-git +[20]:https://github.com/circleci/encrypted-files +[21]:https://circleci.com/blog/build-test-publish-snap-packages?utm_source=insightsubuntu&utm_medium=syndicatedblogpost From 8bf96320c6e86b2a19441f476fd06814037f8d0e Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 14:50:59 +0800 Subject: [PATCH 0795/1407] =?UTF-8?q?20170726-28=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sources/tech/20170120 lxc exec vs ssh.md | 101 +++++++++++++++++++++++ 1 file changed, 101 insertions(+) create mode 100644 sources/tech/20170120 lxc exec vs ssh.md diff --git a/sources/tech/20170120 lxc exec vs ssh.md b/sources/tech/20170120 lxc exec vs ssh.md new file mode 100644 index 0000000000..fa74a587c0 --- /dev/null +++ b/sources/tech/20170120 lxc exec vs ssh.md @@ -0,0 +1,101 @@ +lxc exec vs ssh +============================================================ + + +Recently, I’ve implemented several improvements for `lxc exec`. In case you didn’t know, `lxc exec` is [LXD][1]‘s client tool that uses the [LXD][2] [client api][3] to talk to the LXD daemon and execute any program the user might want. Here is a small example of what you can do with it: + + [![asciicast](https://asciinema.org/a/100035.png)][4] + +One of our main goals is to make `lxc exec` feel as similar to `ssh` as possible since this is the standard of running commands interactively or non-interactively remotely. Making `lxc exec` behave nicely was tricky. + +### 1\. Handling background tasks + +A long-standing problem was certainly how to correctly handle background tasks. Here’s an asciinema illustration of the problem with a pre [LXD][5] 2.7 instance: + + [![asciicast](https://asciinema.org/a/100040.png)][6] + +What you can see there is that putting a task in the background will lead to `lxc exec` not being able to exit. A lot of sequences of commands can trigger this problem: + +``` +chb@conventiont|~ +> lxc exec zest1 bash +root@zest1:~# yes & +y +y +y +. +. +. +``` + +Nothing would save you now. `yes` will simply write to `stdout` till the end of time as quickly as it can… +The root of the problem lies with `stdout` being kept open which is necessary to ensure that any data written by the process the user has started is actually read and sent back over the websocket connection we established. +As you can imagine this becomes a major annoyance when you e.g. run a shell session in which you want to run a process in the background and then quickly want to exit. Sorry, you are out of luck. Well, you were. +The first, and naive approach is obviously to simply close `stdout` as soon as you detect that the foreground program (e.g. the shell) has exited. Not quite as good as an idea as one might think… The problem becomes obvious when you then run quickly executing programs like: + +``` +lxc exec -- ls -al /usr/lib +``` + +where the `lxc exec` process (and the associated `forkexec` process (Don’t worry about it now. Just remember that `Go` + `setns()` are not on speaking terms…)) exits before all  _buffered_  data in `stdout` was read. In this case you will cause truncated output and no one wants that. After a few approaches to the problem that involved, disabling pty buffering (Wasn’t pretty I tell you that and also didn’t work predictably.) and other weird ideas I managed to solve this by employing a few `poll()` “tricks” (In some sense of the word “trick”.). Now you can finally run background tasks and cleanly exit. To wit: + [![asciicast](https://asciinema.org/a/100043.png)][7] + +### 2\. Reporting exit codes caused by signals + +`ssh` is a wonderful tool. One thing however, I never really liked was the fact that when the command that was run by ssh received a signal `ssh` would always report `-1` aka exit code `255`. This is annoying when you’d like to have information about what signal caused the program to terminate. This is why I recently implemented the standard shell convention of reporting any signal-caused exits using the standard convention `128 + n` where `n` is defined as the signal number that caused the executing program to exit. For example, on `SIGKILL` you would see `128 + SIGKILL = 137` (Calculating the exit codes for other deadly signals is left as an exercise to the reader.). So you can do: + +``` +chb@conventiont|~ +> lxc exec zest1 sleep 100 +``` + + +Now, send `SIGKILL` to the executing program (Not to `lxc exec` itself, as `SIGKILL`is not forwardable.): + +``` +kill -KILL $(pidof sleep 100) +``` + +and finally retrieve the exit code for your program: + +``` +chb@conventiont|~ +> echo $? +137 +``` + +Voila. This obviously only works nicely when a) the exit code doesn’t breach the `8`-bit wall-of-computing and b) when the executing program doesn’t use `137` to indicate success (Which would be… interesting(?).). Both arguments don’t seem too convincing to me. The former because most deadly signals  _should_  not breach the range. The latter because (i) that’s the users problem, (ii) these exit codes are actually reserved (I  _think_ .), (iii) you’d have the same problem running the program locally or otherwise. +The main advantage I see in this is the ability to report back fine-grained exit statuses for executing programs. Note, by no means can we report back  _all_ instances where the executing program was killed by a signal, e.g. when your program handles `SIGTERM` and exits cleanly there’s no easy way for [LXD][8] to detect this and report back that this program was killed by signal. You will simply receive success aka exit code `0`. + +### 3\. Forwarding signals + +This is probably the least interesting (or maybe it isn’t, no idea) but I found it quite useful. As you saw in the `SIGKILL` case before, I was explicit in pointing out that one must send `SIGKILL` to the executing program not to the `lxc exec`command itself. This is due to the fact that `SIGKILL` cannot be handled in a program. The only thing the program can do is die… like right now… this instance… sofort… (You get the idea…). But a lot of other signals `SIGTERM`, `SIGHUP`, and of course `SIGUSR1` and `SIGUSR2` can be handled. So when you send signals that can be handled to `lxc exec` instead of the executing program, newer versions of [LXD][9] will forward the signal to the executing process. This is pretty convenient in scripts and so on. + +In any case, I hope you found this little `lxc exec` post/rant useful. Enjoy [LXD][10]it’s a crazy beautiful beast to play with. Give it a try online [https://linuxcontainers.org/lxd/try-it/][11] and for all you developers out there: Checkout [https://github.com/lxc/lxd][12] and send us patches.  + + + We don’t require any `CLA` to be signed, we simply follow the kernel style of requiring a `Signed-off-by` line. + +-------------------------------------------------------------------------------- + +via: https://cbrauner.wordpress.com/2017/01/20/lxc-exec-vs-ssh/ + +作者:[brauner][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://cbrauner.wordpress.com +[1]:https://github.com/lxc/lxd +[2]:https://github.com/lxc/lxd +[3]:https://github.com/lxc/lxd/blob/master/client.go +[4]:https://asciinema.org/a/100035?autoplay=1 +[5]:https://github.com/lxc/lxd +[6]:https://asciinema.org/a/100040?autoplay=1 +[7]:https://asciinema.org/a/100043?autoplay=1 +[8]:https://github.com/lxc/lxd +[9]:https://github.com/lxc/lxd +[10]:https://github.com/lxc/lxd +[11]:https://linuxcontainers.org/lxd/try-it/ +[12]:https://github.com/lxc/lxd From 01e34b6a14fefec906276d8406a98abfafe72ccf Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 14:53:52 +0800 Subject: [PATCH 0796/1407] =?UTF-8?q?20170726-29=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...es in Red Hat Enterprise Linux – Part 1.md | 230 ++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 sources/tech/20170719 Containing System Services in Red Hat Enterprise Linux – Part 1.md diff --git a/sources/tech/20170719 Containing System Services in Red Hat Enterprise Linux – Part 1.md b/sources/tech/20170719 Containing System Services in Red Hat Enterprise Linux – Part 1.md new file mode 100644 index 0000000000..6f6c6fd16e --- /dev/null +++ b/sources/tech/20170719 Containing System Services in Red Hat Enterprise Linux – Part 1.md @@ -0,0 +1,230 @@ +Containing System Services in Red Hat Enterprise Linux – Part 1 +============================================================ + + +At the 2017 Red Hat Summit, several people asked me “We normally use full VMs to separate network services like DNS and DHCP, can we use containers instead?”. The answer is yes, and here’s an example of how to create a system container in Red Hat Enterprise Linux 7 today.    + +### **THE GOAL** + +#### _Create a network service that can be updated independently of any other services of the system, yet easily managed and updated from the host._ + +Let’s explore setting up a BIND server running under systemd in a container. In this part, we’ll look at building our container, as well as managing the BIND configuration and data files. + +In Part Two, we’ll look at how systemd on the host integrates with systemd in the container. We’ll explore managing the service in the container, and enabling it as a service on the host. + +### **CREATING THE BIND CONTAINER** + +To get systemd working inside a container easily, we first need to add two packages on the host: `oci-register-machine` and `oci-systemd-hook`. The `oci-systemd-hook` hook allows us to run systemd in a container without needing to use a privileged container or manually configuring tmpfs and cgroups. The `oci-register-machine` hook allows us to keep track of the container with the systemd tools like `systemctl` and `machinectl`. + +``` +[root@rhel7-host ~]# yum install oci-register-machine oci-systemd-hook +``` + +On to creating our BIND container. The [Red Hat Enterprise Linux 7 base image][6]  includes systemd as an init system. We can install and enable BIND the same way we would on a typical system. You can [download this Dockerfile from the git repository][7] in the Resources. + +``` +[root@rhel7-host bind]# vi Dockerfile + +# Dockerfile for BIND +FROM registry.access.redhat.com/rhel7/rhel +ENV container docker +RUN yum -y install bind && \ +    yum clean all && \ +    systemctl enable named +STOPSIGNAL SIGRTMIN+3 +EXPOSE 53 +EXPOSE 53/udp +CMD [ "/sbin/init" ] +``` + +Since we’re starting with an init system as PID 1, we need to change the signal sent by the docker CLI when we tell the container to stop. From the `kill` system call man pages (`man 2 kill`): + +``` +The only signals that can be sent to process ID 1, the init +process, are those for which init has explicitly installed +signal handlers. This is done to assure the system is not +brought down accidentally. +``` + +For the systemd signal handlers, `SIGRTMIN+3` is the signal that corresponds to `systemd start halt.target`. We also expose both TCP and UDP ports for BIND, since both protocols could be in use. + +### **MANAGING DATA** + +With a functional BIND service, we need a way to manage the configuration and zone files. Currently those are inside the container, so we  _could_  enter the container any time we wanted to update the configs or make a zone file change. This isn’t ideal from a management perspective.  We’ll need to rebuild the container when we need to update BIND, so changes in the images would be lost. Having to enter the container any time we need to update a file or restart the service adds steps and time. + +Instead, we’ll extract the configuration and data files from the container and copy them to the host, then mount them at run time. This way we can easily restart or rebuild the container without losing changes. We can also modify configs and zones by using an editor outside of the container. Since this container data looks like “ _site-specific data served by this system_ ”, let’s follow the File System Hierarchy and create `/srv/named` on the local host to maintain administrative separation. + +``` +[root@rhel7-host ~]# mkdir -p /srv/named/etc + +[root@rhel7-host ~]# mkdir -p /srv/named/var/named +``` + +##### _NOTE: If you are migrating an existing configuration, you can skip the following step and copy it directly to the`/srv/named` directories. You may still want to check the container assigned GID with a temporary container._ + +Let’s build and run an temporary container to examine BIND. With a init process as PID 1, we can’t run the container interactively to get a shell. We’ll exec into it after it launches, and check for important files with `rpm`. + +``` +[root@rhel7-host ~]# docker build -t named . + +[root@rhel7-host ~]# docker exec -it $( docker run -d named ) /bin/bash + +[root@0e77ce00405e /]# rpm -ql bind +``` + +For this example, we’ll need `/etc/named.conf` and everything under `/var/named/`. We can extract these with `machinectl`. If there’s more than one container registered, we can see what’s running in any machine with `machinectl status`. Once we have the configs we can stop the temporary container. + + _There’s also a[ sample `named.conf` and zone files for `example.com` in the Resources][2] if you prefer._ + +``` +[root@rhel7-host bind]# machinectl list + +MACHINE                          CLASS     SERVICE +8824c90294d5a36d396c8ab35167937f container docker + +[root@rhel7-host ~]# machinectl copy-from 8824c90294d5a36d396c8ab35167937f /etc/named.conf /srv/named/etc/named.conf + +[root@rhel7-host ~]# machinectl copy-from 8824c90294d5a36d396c8ab35167937f /var/named /srv/named/var/named + +[root@rhel7-host ~]# docker stop infallible_wescoff +``` + +### **FINAL CREATION** + +To create and run the final container, add the volume options to mount: + +* file `/srv/named/etc/named.conf` as `/etc/named.conf` + +* directory `/srv/named/var/named` as `/var/named` + +Since this is our final container, we’ll also provide a meaningful name that we can refer to later. + +``` +[root@rhel7-host ~]# docker run -d -p 53:53 -p 53:53/udp -v /srv/named/etc/named.conf:/etc/named.conf:Z -v /srv/named/var/named:/var/named:Z --name named-container named +``` + +With the final container running, we can modify the local configs to change the behavior of BIND in the container. The BIND server will need to listen on any IP that the container might be assigned. Be sure the GID of any new file matches the rest of the BIND files from the container.  + +``` +[root@rhel7-host bind]# cp named.conf /srv/named/etc/named.conf + +[root@rhel7-host ~]# cp example.com.zone /srv/named/var/named/example.com.zone + +[root@rhel7-host ~]# cp example.com.rr.zone  /srv/named/var/named/example.com.rr.zone +``` + +> [Curious why I didn’t need to change SELinux context on the host directories?][3] + +We’ll reload the config by exec’ing the `rndc` binary provided by the container. We can use `journald` in the same fashion to check the BIND logs. If you run into errors, you can edit the file on the host, and reload the config. Using `host` or `dig` on the host, we can check the responses from the contained service for example.com. + +``` +[root@rhel7-host ~]# docker exec -it named-container rndc reload        +server reload successful + +[root@rhel7-host ~]# docker exec -it named-container journalctl -u named -n +-- Logs begin at Fri 2017-05-12 19:15:18 UTC, end at Fri 2017-05-12 19:29:17 UTC. -- +May 12 19:29:17 ac1752c314a7 named[27]: automatic empty zone: 9.E.F.IP6.ARPA +May 12 19:29:17 ac1752c314a7 named[27]: automatic empty zone: A.E.F.IP6.ARPA +May 12 19:29:17 ac1752c314a7 named[27]: automatic empty zone: B.E.F.IP6.ARPA +May 12 19:29:17 ac1752c314a7 named[27]: automatic empty zone: 8.B.D.0.1.0.0.2.IP6.ARPA +May 12 19:29:17 ac1752c314a7 named[27]: reloading configuration succeeded +May 12 19:29:17 ac1752c314a7 named[27]: reloading zones succeeded +May 12 19:29:17 ac1752c314a7 named[27]: zone 1.0.10.in-addr.arpa/IN: loaded serial 2001062601 +May 12 19:29:17 ac1752c314a7 named[27]: zone 1.0.10.in-addr.arpa/IN: sending notifies (serial 2001062601) +May 12 19:29:17 ac1752c314a7 named[27]: all zones loaded +May 12 19:29:17 ac1752c314a7 named[27]: running + +[root@rhel7-host bind]# host www.example.com localhost +Using domain server: +Name: localhost +Address: ::1#53 +Aliases: +www.example.com is an alias for server1.example.com. +server1.example.com is an alias for mail +``` + +> [Did your zone file not update? It might be your editor not the serial number.][4] + +### THE FINISH LINE (?) + +We’ve got what we set out to accomplish. DNS requests and zones are being served from a container. We’ve got a persistent location to manage data and configurations across updates.   + +In Part 2 of this series, we’ll see how to treat the container as a normal service on the host. + +* * * + + _[Follow the RHEL Blog][5] to receive updates on Part 2 of this series and other new posts via email._ + +* * * + +### _**Additional Resources:**_ + +#### GitHub repository for accompanying files:  [https://github.com/nzwulfin/named-container][8] + +#### **SIDEBAR 1: ** _SELinux context on local files accessed by a container_ + +You may have noticed that when I copied the files from the container to the local host, I didn’t run a `chcon` to change the files on the host to type `svirt_sandbox_file_t`.  Why didn’t it break? Copying a file into `/srv` should have made that file label type `var_t`. Did I `setenforce 0`? + +Of course not, that would make Dan Walsh cry.  And yes, `machinectl` did indeed set the label type as expected, take a look: + +Before starting the container: + +``` +[root@rhel7-host ~]# ls -Z /srv/named/etc/named.conf + +-rw-r-----. unconfined_u:object_r:var_t:s0   /srv/named/etc/named.conf +``` + +No, I used a volume option in run that makes Dan Walsh happy, `:Z`.  This part of the command `-v /srv/named/etc/named.conf:/etc/named.conf:Z` does two things: first it says this needs to be relabeled with a private volume SELinux label, and second it says to mount it read / write. + +After starting the container: + +``` +[root@rhel7-host ~]# ls -Z /srv/named/etc/named.conf + +-rw-r-----. root 25 system_u:object_r:svirt_sandbox_file_t:s0:c821,c956 /srv/named/etc/named.conf +``` + +#### **SIDEBAR 2: ** _VIM backup behavior can change inodes_ + +If you made the edits to the config file with `vim` on the local host and you aren’t seeing the changes in the container, you may have inadvertently created a new file that the container isn’t aware of. There are three `vim` settings that affect backup copies during editing: backup, writebackup, and backupcopy. + +I’ve snipped out the defaults that apply for RHEL 7 from the official VIM backup_table [http://vimdoc.sourceforge.net/htmldoc/editing.html#backup-table] + +``` +backup    writebackup + +   off     on backup current file, deleted afterwards (default) +``` + +So we don’t create tilde copies that stick around, but we are creating backups. The other setting is backupcopy, where `auto` is the shipped default: + +``` +"yes" make a copy of the file and overwrite the original one + "no" rename the file and write a new one + "auto" one of the previous, what works best +``` + +This combo means that when you edit a file, unless `vim` sees a reason not to (check the docs for the logic) you will end up with a new file that contains your edits, which will be renamed to the original filename when you save. This means the file gets a new inode. For most situations this isn’t a problem, but here the bind mount into the container *is* senstive to inode changes. To solve this, you need to change the backupcopy behavior. + +Either in the `vim` session or in your `.vimrc`, add `set backupcopy=yes`. This will make sure the original file gets truncated and overwritten, preserving the inode and propagating the changes into the container. + +-------------------------------------------------------------------------------- + +via: http://rhelblog.redhat.com/2017/07/19/containing-system-services-in-red-hat-enterprise-linux-part-1/ + +作者:[Matt Micene ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://rhelblog.redhat.com/2017/07/19/containing-system-services-in-red-hat-enterprise-linux-part-1/ +[1]:http://rhelblog.redhat.com/author/mmicenerht/ +[2]:http://rhelblog.redhat.com/2017/07/19/containing-system-services-in-red-hat-enterprise-linux-part-1/#repo +[3]:http://rhelblog.redhat.com/2017/07/19/containing-system-services-in-red-hat-enterprise-linux-part-1/#sidebar_1 +[4]:http://rhelblog.redhat.com/2017/07/19/containing-system-services-in-red-hat-enterprise-linux-part-1/#sidebar_2 +[5]:http://redhatstackblog.wordpress.com/feed/ +[6]:https://access.redhat.com/containers +[7]:http://rhelblog.redhat.com/2017/07/19/containing-system-services-in-red-hat-enterprise-linux-part-1/#repo +[8]:https://github.com/nzwulfin/named-container From 1ea14436780362af08fa4caca91093ec0fe6813c Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 14:55:08 +0800 Subject: [PATCH 0797/1407] 20170726-30 --- ...n Be Hacked Using Eight-Month-Old Flaws.md | 58 +++++++++++++++++++ 1 file changed, 58 insertions(+) create mode 100644 sources/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md diff --git a/sources/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md b/sources/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md new file mode 100644 index 0000000000..20871570aa --- /dev/null +++ b/sources/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md @@ -0,0 +1,58 @@ +70,000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws +============================================================ + + + +![](https://cdn.thenewstack.io/media/2017/07/261d7153-business-841174_640.jpg) + +Eight months after three critical vulnerabilities were fixed in the memcached open source caching software, there are over 70,000 caching servers directly exposed on the internet that have yet to be patched. Hackers could execute malicious code on them or steal potentially sensitive data from their caches, security researchers warn. + +[Memcached][1] is a software package that implements a high performance caching server for storing chunks of data obtained from database and API calls in RAM. This helps speed up dynamic web applications, making it well suited for large websites and big-data projects. + +While memcached is not a database replacement, the data it stores in RAM can include user sessions and other sensitive information from database queries. As such, the server was not designed to be directly exposed to untrusted environments like the internet, even though some of the more recent versions support basic authentication. + +Back in October, the memcached developers fixed three remote code execution vulnerabilities ([CVE-2016-8704][2], [CVE-2016-8705][3] and [CVE-2016-8706][4]) that were found and reported by security researchers from [Cisco Systems’ Talos division][5]. All of these flaws affected memcached’s binary protocol for storing and retrieving data and one of them was in the [Simple Authentication and Security Layer ][6](SASL) implementation. + +Throughout December and January several groups of attackers wiped data from tens of thousands of publicly exposed databases including MongoDB, CouchDB, Hadoop and Elasticsearch clusters. In many cases they asked server administrators for money to return the data, but there was no evidence they actually copied it. + +The Talos researchers thought that memcached servers might be the next target, especially giving the flaws they had identified a few months earlier, so in February they decided to run a series of internet scans to determine the potential attack surface. + +The scan results revealed that around 108,000 memcached servers were directly exposed to the internet and only 24,000 of them required authentication. The fact that so many servers were publicly accessible without authentication was bad enough, but when they also tested for the presence of the three vulnerabilities, they found that only 200 servers requiring authentication actually had the October patches deployed. All the rest were open to hacking through the SASL vulnerability. + +Overall, 85,000 or around 80 percent of all memcached servers exposed to the internet lacked the security fixes for the three critical flaws announced in October. + +Troubled by the poor patch adoption rate, the Talos researchers decided to run whois queries on the IP addresses of all of those servers and send notification emails to their owners. + +Earlier this month the researchers decided to redo their scans. They found that there are still 106,000 memcached servers exposed to the internet, although 28,500 have different IP addresses than the ones found in February. + +Of these 106,000 servers, 73,400 or around 70 percent continue to be vulnerable to the three exploits patched in October. Over 18,000 of the identified servers require authentication and 99 percent of those continue to have the SASL vulnerability. + +Even after sending tens of thousands of notification emails, the patch adoption rate improved by only 10 percent in six months. + +“The severity of these types of vulnerabilities cannot be understated,” the Talos researchers said Monday in a [blog post][7]. “These vulnerabilities potentially affect a platform that is deployed across the internet by small and large enterprises alike. With the recent spate of worm attacks leveraging vulnerabilities this should be a red flag for administrators around the world. If left unaddressed the vulnerabilities could be leveraged to impact organizations globally and impact business severely.” + +The conclusions of this exercise suggest that many web application owners do a poor job of safeguarding their users’ data. First, a surprisingly large number of memcached servers are directly exposed to the internet and the majority of them do not use authentication. The data cached on these servers is at risk even without the presence of any vulnerabilities. + +Second, even when critical vulnerabilities that could be used to completely compromise servers are patched, many server administrators don’t apply the security fixes in a timely manner, if ever. + +Under these circumstances, seeing large scale attacks against memcached servers like those that targeted MongoDB databases would not be surprising. + +-------------------------------------------------------------------------------- + +via: https://thenewstack.io/70000-memcached-servers-can-hacked-using-eight-month-old-flaws/ + +作者:[Lucian Constantin ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://thenewstack.io/author/lucian/ +[1]:https://memcached.org/ +[2]:https://www.talosintelligence.com/reports/TALOS-2016-0219/ +[3]:https://www.talosintelligence.com/reports/TALOS-2016-0220/ +[4]:https://www.talosintelligence.com/reports/TALOS-2016-0221/ +[5]:https://www.talosintelligence.com/ +[6]:https://tools.ietf.org/html/rfc4422 +[7]:http://blog.talosintelligence.com/2017/07/memcached-patch-failure.html +[8]:https://thenewstack.io/author/lucian/ From e613a43c5b5ca939a8836c8a4bbc503ca4addb7e Mon Sep 17 00:00:00 2001 From: VicYu Date: Wed, 26 Jul 2017 14:59:04 +0800 Subject: [PATCH 0798/1407] Update 20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md --- .../20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md b/sources/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md index 6100fa02eb..91aa2df505 100644 --- a/sources/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md +++ b/sources/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md @@ -1,3 +1,5 @@ + Vic020 + Install Linux Kernel 4.12 (Stable) on Linux Mint ============================================================ From 9704e40fd6ca03bab51cbc2a78ee0e22b85b9be2 Mon Sep 17 00:00:00 2001 From: Locez Date: Wed, 26 Jul 2017 15:06:50 +0800 Subject: [PATCH 0799/1407] translating by locez --- .../tech/20170628 Container Docker Compose on Ubuntu 16.04.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170628 Container Docker Compose on Ubuntu 16.04.md b/sources/tech/20170628 Container Docker Compose on Ubuntu 16.04.md index cf1b398e82..5333f8bfc0 100644 --- a/sources/tech/20170628 Container Docker Compose on Ubuntu 16.04.md +++ b/sources/tech/20170628 Container Docker Compose on Ubuntu 16.04.md @@ -1,3 +1,4 @@ +translating by locez Container: Docker Compose on Ubuntu 16.04 ============================================================ From bd9be5180c447589cff8f71f0b7d9e24d781c5aa Mon Sep 17 00:00:00 2001 From: cygmris Date: Wed, 26 Jul 2017 15:15:27 +0800 Subject: [PATCH 0800/1407] cygmris is translating OpenStack in a Snap --- sources/tech/20170706 OpenStack in a Snap.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170706 OpenStack in a Snap.md b/sources/tech/20170706 OpenStack in a Snap.md index 9a4e9ed933..a1c85b2dc4 100644 --- a/sources/tech/20170706 OpenStack in a Snap.md +++ b/sources/tech/20170706 OpenStack in a Snap.md @@ -1,3 +1,5 @@ +cygmris is translating + OpenStack in a Snap ============================================================ From 950b88cb4ce61381ef16a09735755b06ea711539 Mon Sep 17 00:00:00 2001 From: vic Date: Wed, 26 Jul 2017 15:27:50 +0800 Subject: [PATCH 0801/1407] Translated --- ... Linux Kernel 4.12 Stable on Linux Mint.md | 30 ++++++++++--------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/sources/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md b/sources/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md index 91aa2df505..c7bcdb9285 100644 --- a/sources/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md +++ b/sources/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md @@ -1,15 +1,13 @@ - Vic020 - -Install Linux Kernel 4.12 (Stable) on Linux Mint +Linux Mint安装Linux Kernel 4.12(稳定版) ============================================================ -![Install Linux Kernel 4.12 (Stable) on Linux Mint](https://mintguide.org/uploads/tux_system.jpg) +![Linux Mint安装Linux Kernel 4.12(稳定版)](https://mintguide.org/uploads/tux_system.jpg) -**Linus Torvalds** introduced the **[Linux][5] [kernel][6] 4.12**. You can download the relevant **deb**packages from **[HERE][7]** and install them. Or just follow the instructions given below that will help you to install a new kernel. +**Linus Torvalds** 推荐的 **[Linux][5] [内核][6] 4.12**. 从 **[这里][7]** 可以直接下载相关的 **deb** 包来安装. 或者, 继续阅读本文,按下面的步骤安装新kernel. - _**Warning. The [Linux][1] [kernel][2] is a critical element of the system. To do the upgrade costs when one of your hardware devices is not working properly, and the new kernel may fix this problem. But at the same time installing a new kernel unnecessarily can lead to undesirable regressions, such as: no network connection, no sound or even the inability to boot the system, so install a new kernel on your own risk.**_ + _**警告. [Linux][1] [内核][2] 是系统的关键组成. 在硬件设备不正常工作时,可以尝试执行升级,新的内核可能会解决此问题。 但同样的, 非必须地更新一个新的内核也会导致不必要的回滚, 例如, 无网络连接, 没有声音, 甚至是无法正常启动系统, 所以安装一个新的内核,请正确认识风险.**_ -The easiest way to install any kernel - program [UKUU][8]Install UKUU on **[Linux Mint][9].** +最简单的安装任意内核方法 - 在**[Linux Mint][9]** 使用 [UKUU][8] 项目. ``` TerminalShekin@mylinuxmintpc~$sudo apt-add-repository -y ppa:teejee2008/ppa @@ -17,21 +15,25 @@ sudo apt-get update sudo apt-get install ukuu ``` -**Reminder  _to users of computers with [Nvidia][3]/AMD. Before installing the kernel, it is advisable to switch to the free driver._** +**提醒 _所有[Nvidia][3]/AMD电脑用户, 在安装内核之前, 建议切换到可用的驱动._** -**If you decide to delete the kernel 4.12,** -1. When the computer boots, the [GRUB][12] menu, select your old kernel. After booting the system, remove the new kernel by command below -2. Use program [UKUU][13] or command: +**如果决定删除内核4.12,** + +1.首先, 重启计算机,选择[GRUB][12]菜单中的旧内核启动.引导系统结束,通过以下命令删除新的内核 + +2.然后, 使用 [UKUU][13] 项目,或者命令: ``` TerminalShekin@mylinuxmintpc~$sudo apt purge linux-image-4.12-* ``` -3. And update **GRUB** or **[BURG][10]** +3.最后, 更新 **GRUB**或者**[BURG][10]** ``` TerminalShekin@mylinuxmintpc~$sudo update-grub ``` -To return to the previous kernel when booting **Grub** select **Previous Linux versions** +为了回到之前的内核, 在启动**Grub**的时候,选择**以前的Linux版本** + Good Luck!!! + [kernel.org][14] -------------------------------------------------------------------------------- @@ -39,7 +41,7 @@ Good Luck!!! via: https://mintguide.org/system/798-install-linux-kernel-4-12-stable-on-linux-mint.html 作者:[Shekin ][a] -译者:[译者ID](https://github.com/译者ID) +译者:[VicYu](https://vicyu.com) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 14d49eb9f106e022711dcd404a2d8eb7a909dd59 Mon Sep 17 00:00:00 2001 From: vic Date: Wed, 26 Jul 2017 15:28:53 +0800 Subject: [PATCH 0802/1407] Moved --- .../20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {sources => translated}/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md (100%) diff --git a/sources/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md b/translated/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md similarity index 100% rename from sources/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md rename to translated/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md From 617d9e71e4bbbfe66be1024008bc8d78243b7f27 Mon Sep 17 00:00:00 2001 From: vic Date: Wed, 26 Jul 2017 15:33:26 +0800 Subject: [PATCH 0803/1407] pick up --- .../tech/20170725 ss another way to get socket statistics.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170725 ss another way to get socket statistics.md b/sources/tech/20170725 ss another way to get socket statistics.md index 51067dffde..4d560a579a 100644 --- a/sources/tech/20170725 ss another way to get socket statistics.md +++ b/sources/tech/20170725 ss another way to get socket statistics.md @@ -1,3 +1,5 @@ + Vic020 + ss: another way to get socket statistics ============================================================ From 32f712b62618dc207d68330cb249ed9701cdfb3e Mon Sep 17 00:00:00 2001 From: vic Date: Wed, 26 Jul 2017 15:58:01 +0800 Subject: [PATCH 0804/1407] Translated --- ...ss another way to get socket statistics.md | 28 ++++++++----------- 1 file changed, 12 insertions(+), 16 deletions(-) diff --git a/sources/tech/20170725 ss another way to get socket statistics.md b/sources/tech/20170725 ss another way to get socket statistics.md index 4d560a579a..250ed2c756 100644 --- a/sources/tech/20170725 ss another way to get socket statistics.md +++ b/sources/tech/20170725 ss another way to get socket statistics.md @@ -1,13 +1,9 @@ - Vic020 - -ss: another way to get socket statistics +ss: 获得socket统计的另一种方法 ============================================================ -### Share or save +在之前的文章中,我有提到**ss**, _iproute2_ 包附带的另一个工具, 允许你查询socket的有关统计信息. 可以完成**netstat**同样的任务, 但是,ss稍微快一点而且命令更简短. -In an earlier blog post I mentioned **ss**, another tool that comes with the  _iproute2_  package and allows you to query statistics about sockets. The same thing that can be done with **netstat**, with the added benefit that it is typically a little bit faster, and shorter to type. - -Just **ss **by default will display much the same thing as netstat, and can be similarly passed options to limit the output to just what you want. For instance: +直接输入**ss**, 默认会显示与netstat同样的内容, 并且输入类似的参数可以获取你想要的类似输出. 例如: ``` $ ss -t @@ -15,15 +11,15 @@ State       Recv-Q Send-Q       Local Address:Port                 ESTAB       0      0                127.0.0.1:postgresql                     127.0.0.1:48154 ESTAB       0      0            192.168.0.136:35296                      192.168.0.120:8009 ESTAB       0      0            192.168.0.136:47574                     173.194.74.189:https +[…] ``` -[…] -**ss -t **shows just TCP connections. **ss -u **can be used to show UDP connections, **-l **will show only listening ports, and things can be further filtered to just the information you want. +**ss -t** 只显示TCP连接. **ss -u** 用于显示UDP连接, **-l** 只会显示监听的端口,而且可以进一步过滤到任何想要的信息。 -I have not tested all the possible options, but you can even forcibly close sockets with **-K**. +我并没有测试所有可用参数, 但是可以使用 **-K** 强制关闭socket. -One place where **ss** really shines though is in its filtering capabilities. Let’s list all connections with a source port of 22 (ssh): +**ss**真正耀眼的地方是内置的过滤能力.让我们列出所有端口为22(ssh)的连接: ``` $ ss state all sport = :ssh @@ -33,7 +29,7 @@ tcp   ESTAB      0      0          192.168.0.136:ssh           tcp   LISTEN     0      128                   :::ssh                                 :::* ``` -And if I want to show only connected sockets (everything but  _listening_  or  _closed_ ): +如果只想看已建立的socket(排除了 _listening_ 和 _closed_ ): ``` $ ss state connected sport = :ssh @@ -41,7 +37,7 @@ Netid State      Recv-Q Send-Q     Local Address:Port               tcp   ESTAB      0      0          192.168.0.136:ssh                      192.168.0.102:46540 ``` -Similarly, you can have it list all connections to a specific host or range; in this case, using the 74.125.0.0/16 subnet, which apparently belongs to Google: +类似的, 可以列出指定的host或者ip段; 例如, 列出到达74.125.0.0/16子网的连接, 这个子网属于Google: ``` $ ss state all dst 74.125.0.0/16 @@ -51,16 +47,16 @@ tcp   ESTAB      0      0          192.168.0.136:42034         tcp   ESTAB      0      0          192.168.0.136:57408                   74.125.202.189:https ``` -This is very much the same syntax as for  _iptables_ , so if you’re familiar with that already, it will be quite easy to pick up. You can also install the  _iproute2-doc_  package, and look in  _/usr/share/doc/iproute2-doc/ss.html_  for the full documentation. +ss与 _iptables_ 的语法非常相同, 如果已经熟悉了其语法, ss非常容易上手. 也可以安装 _iproute2-doc_ 包, 通过 _/usr/share/doc/iproute2-doc/ss.html_ 获得完整文档. -Try it for yourself! You’ll see how well it works. If anything, I’m glad for the fewer characters this makes me type. +还不快试试! 你就可以知道它有多棒.无论如何, 让我输入的字符越少我越高兴. -------------------------------------------------------------------------------- via: https://insights.ubuntu.com/2017/07/25/ss-another-way-to-get-socket-statistics/ 作者:[ Mathieu Trudel-Lapierre ][a] -译者:[译者ID](https://github.com/译者ID) +译者:[VicYu](https://vicyu.com) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From c52368d0d8163b6e30e2634eb870af69478e6941 Mon Sep 17 00:00:00 2001 From: vic Date: Wed, 26 Jul 2017 15:58:46 +0800 Subject: [PATCH 0805/1407] Moved --- .../tech/20170725 ss another way to get socket statistics.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {sources => translated}/tech/20170725 ss another way to get socket statistics.md (100%) diff --git a/sources/tech/20170725 ss another way to get socket statistics.md b/translated/tech/20170725 ss another way to get socket statistics.md similarity index 100% rename from sources/tech/20170725 ss another way to get socket statistics.md rename to translated/tech/20170725 ss another way to get socket statistics.md From 7e0b41e8fc824a02f9ee8d9e53cb0815ed52f4ac Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 16:44:43 +0800 Subject: [PATCH 0806/1407] =?UTF-8?q?20170726-32=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...amework for Edge Computing Gains Ground.md | 76 +++++++++++++++++++ 1 file changed, 76 insertions(+) create mode 100644 sources/tech/20170724 IoT Framework for Edge Computing Gains Ground.md diff --git a/sources/tech/20170724 IoT Framework for Edge Computing Gains Ground.md b/sources/tech/20170724 IoT Framework for Edge Computing Gains Ground.md new file mode 100644 index 0000000000..c1f565fd31 --- /dev/null +++ b/sources/tech/20170724 IoT Framework for Edge Computing Gains Ground.md @@ -0,0 +1,76 @@ +IoT Framework for Edge Computing Gains Ground +============================================================ + +![EdgeX](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/edgex_0.png?itok=DUnFipVf "EdgeX") +The open source EdgeX Foundry project is developing a standardized interoperability framework for Internet of Things (IoT) edge computing.[Used with permission][1] + +In April, The Linux Foundation [launched][3] the open source [EdgeX Foundry][4] project to develop a standardized interoperability framework for Internet of Things (IoT) edge computing. Recently, EdgeX Foundry [announced][5] eight new members, bringing the total membership to 58. + +The new members are Absolute, IoT Impact LABS, inwinSTACK, Parallel Machines, Queen’s University Belfast, RIOT, Toshiba Digital Solutions Corporation, and Tulip Interfaces. They join a roster that includes AMD, Analog Devices, Canonical/Ubuntu, Cloud Foundry, Dell, Linaro, Mocana, NetFoundry, Opto 22, RFMicron, and VMWare, among others. + +EdgeX Foundry is built around Dell’s early stage, Apache 2.0 licensed [FUSE][6] IoT middleware framework, which offers more than a dozen microservices comprising over 125,000 lines of code. The Linux Foundation worked with Dell to launch the EdgeX Foundry after the FUSE project merged with a similar AllJoyn-compliant IoTX project led by current EdgeX members Two Bulls and Beechwood. + +EdgeX Foundry will create and certify an ecosystem of interoperable, plug-and-play components. The open source EdgeX stack will mediate between a variety of sensor network messaging protocols and multiple cloud and analytics platforms. The framework is designed to help facilitate interoperability code that spans edge analytics, security, system management, and services. + +The key benefit for members and their customers is the potential to more easily integrating pre-certified software for IoT gateways and smart edge devices. “EdgeX Foundry reduces the challenges that we face in deploying multi-vendor solutions in the real world,” said Dan Mahoney, Lead Engineer for [IoT Impact LABS][7], in an interview with Linux.com. + +Why would The Linux Foundation launch another IoT standardization group while it’s still consolidating its AllSeen Alliance project’s AllJoyn spec into its [IoTivity standard][8]? For one thing, EdgeX Foundry differs from IoTivity in that for now it’s focused exclusively on industrial rather than both consumer and industrial IoT. Even more specifically, it targets middleware for gateways and smart endpoints. The projects also differ in that IoTivity is more about interoperability of existing products while EdgeX hopes to shape new products with pre-certified building blocks. + +“IoTivity provides a device protocol enabling seamless device-to-device connectivity, while EdgeX Foundry provides a framework for edge computing,” said Philip DesAutels, PhD Senior Director of IoT at The Linux Foundation. “With EdgeX Foundry, any protocol -- IoTivity, BacNet, EtherCat, etc. -- can be integrated to enable multi-protocol communications between devices implementing a variety of protocols and a common edge framework. The goal is to create an ecosystem of interoperable components to reduce uncertainty, accelerate time to market, and facilitate scale.” + +Last month, the IoTivity project, which is backed by the [Open Connectivity Foundation][9] (OCF), as well as The Linux Foundation, released [IoTivity 1.3][10], which adds bridges to the once rival AllJoyn spec backed by the Allseen Alliance, and also adds hooks to the OCF’s UPnP device discovery standard. The IoTivity and AllJoyn standards should achieve even greater integration in [IoTivity 2.0][11]. + +IoTivity and EdgeX are “highly complementary,” DesAutels told Linux.com. “Since there are several members of EdgeX Foundry that are also involved in either IoTivity or OCF, the project anticipates strong partnerships between IoTivity and EdgeX.” + +Although both EdgeX and IoTivity are billed as being cross-platform in both CPU architecture and OS, IoTivity is still primarily a Linux driven effort -- spanning Ubuntu, Tizen, and Android -- that is now expanding to Windows and iOS. By comparison, EdgeX Foundry is designed from the start to be fully cross-platform, regardless of CPU architecture or OS, including Linux, Windows, and Mac OS, and potentially real-time operating systems (RTOSes). + +One of the new EdgeX members is the [RIOT][12] project, which offers an open source, IoT-oriented RIOT RTOS. “RIOT starts where Linux doesn’t fit so it is natural for the RIOT community to participate and support complementary open-source initiatives like EdgeX Foundry for edge computing,” stated RIOT’s Thomas Eichinger in a testimonial quote. + +### Easing sensor integration + +IoT Impact LABS (aka Impact LABS or just plain LABS) is another new EdgeX member. The company has a novel business model of helping small-to-medium sized businesses live pilot IoT solutions. Most of its clients, which include several EdgeX Foundry members, are working on projects for enabling smart cities, resilient infrastructure, improved food security, as well as solutions designed for communities facing natural resource challenges. + +“At LABS we spend a lot of time troubleshooting new solutions for our pilot hosts,” said Dan Mahoney. “EdgeX Foundry will let us deploy faster with high-quality solutions by keeping the edge software development efforts to a minimum.” + +The framework will be especially helpful in projects that involve many types of sensors from multiple vendors. “EdgeX Foundry gives us the ability to rapidly build gateway software to handle all the sensors being deployed,” added Mahoney. Sensor manufacturers will be able to use the EdgeX SDK to write a single application-level device driver for a given protocol that can then be used by multiple vendors and solutions. + +### Bringing analytics to the edge + +When asked how his company would like to see the EdgeX framework evolve, Mahoney said: “A goal we would like to encourage is to have multiple industrial protocols available as device services -- and a clear path for implementing edge analytics.” + +Edge computing analytics is a growing trend in both industrial and consumer IoT. In the latter, we’ve already seen several smart home [hubs integrating analytics][13] technology such as Alexa voice activated AI support or video analytics. This typically requires offloading processing to cloud services, which poses challenges in security and privacy, potential service loss due to provider outages, and latency issues. + +With industrial IoT gateways, latency is the most important issue. As a result, there’s growing interest in adding more cloud-like intelligence to IoT gateways. One solution is to securely bring cloud-like applications to embedded devices via containers, as with [ResinOS and Ubuntu Core’s snap mechanisms][14]. Another approach is to develop IoT ecosystems that shift more cloud intelligence to the edge. Last month, Amazon released its AWS Lambda based [AWS Greengrass][15]IoT stack for Linux based gateways. The software enables AWS compute, messaging, data caching, and sync capabilities to run on connected devices such as IoT gateways.  + +Analytics is a key element of the EdgeX Foundry roadmap. One founding member is Cloud Foundry, which is aiming to integrate its industry leading cloud application platform with edge devices. Another new member -- [Parallel Machines][16] -- plans to leverage EdgeX to help it bring AI to the edge. + +It’s still early days at EdgeX Foundry. The software is still in alpha stage, and the company had its first big meeting only last month. The project has initiated a series of “Tech Talks” training sessions for new developers. More information may be found [here][17]. + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/blog/2017/7/iot-framework-edge-computing-gains-ground + +作者:[ ERIC BROWN][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.linux.com/users/ericstephenbrown +[1]:https://www.linux.com/licenses/category/used-permission +[2]:https://www.linux.com/files/images/edgexpng-0 +[3]:http://linuxgizmos.com/open-source-group-focuses-on-industrial-iot-gateway-middleware/ +[4]:https://www.edgexfoundry.org/ +[5]:https://www.edgexfoundry.org/announcement/2017/07/17/edgex-foundry-builds-momentum-for-a-iot-interoperability-and-a-unified-marketplace-with-eight-new-members/ +[6]:https://medium.com/@gigastacey/dell-plans-an-open-source-iot-stack-3dde43f24feb +[7]:https://iotimpactlabs.com/ +[8]:https://www.linux.com/news/how-iotivity-and-alljoyn-could-combine +[9]:https://openconnectivity.org/developer/specifications/international-standards +[10]:https://wiki.iotivity.org/release_note_1.3.0 +[11]:https://www.linux.com/news/iotivity-20-whats-store +[12]:https://riot-os.org/ +[13]:https://www.linux.com/news/smart-linux-home-hubs-mix-iot-ai +[14]:https://www.linux.com/news/future-iot-containers-aim-solve-security-crisis +[15]:http://linuxgizmos.com/amazon-releases-aws-greengrass-for-local-iot-processing-on-linux-devices/ +[16]:https://www.parallelmachines.com/ +[17]:https://wiki.edgexfoundry.org/ From fd029a2c95fd6e2a0e8370c16ca48b24864eec3c Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 26 Jul 2017 16:46:41 +0800 Subject: [PATCH 0807/1407] =?UTF-8?q?20170726-33=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../tech/20170725 Linux Weather Forecast.md | 59 +++++++++++++++++++ 1 file changed, 59 insertions(+) create mode 100644 sources/tech/20170725 Linux Weather Forecast.md diff --git a/sources/tech/20170725 Linux Weather Forecast.md b/sources/tech/20170725 Linux Weather Forecast.md new file mode 100644 index 0000000000..f52fd9b900 --- /dev/null +++ b/sources/tech/20170725 Linux Weather Forecast.md @@ -0,0 +1,59 @@ +Linux Weather Forecast +============================================================ + +### Welcome to the Linux Weather Forecast + +This page is an attempt to track ongoing developments in the Linux development community that have a good chance of appearing in a mainline kernel and/or major distributions sometime in the near future. Your "chief meteorologist" is Jonathan Corbet, Executive Editor at [LWN.net][8]. If you have suggestions on improving the forecast (and particularly if you have a project or patchset that you think should be tracked), please add your comments below.  + +### Forecast Summaries + +**Current conditions**: The 4.12 kernel was released on July 2\. It contains many new features, including: + +* The [BFQ and Kyber block I/O schedulers][2]. BFQ, which has been under development for years, promises better performance on interactive systems and has attracted interest in the mobile device area. Kyber, instead, is a much simpler scheduler intended for fast devices typically found in enterprise settings. + +* The epoll_wait() system call can now perform busy-polling of network sockets. + +* The live-patching mechanism has gained the [hybrid consistency model][3], which will allow more complex patches to be applied to running kernels. + +* The [trusted execution framework][4] should ease dealings between the kernel and code running in the ARM TrustZone secure world. + +4.12 was one of the busiest kernel development cycles ever, with nearly 15,000 changes merged. See [this article][9] for an overview of where those changes came from. + +**Short-term forecast**: The 4.13 kernel can be expected in early September 2017.  Some of the changes that will be found in this kernel are: + +* Better support for non-blocking direct block I/O operations. + +* The [structure-layout randomization mechanism][5] is the next step in the ongoing project of hardening the kernel against attack. + +* The kernel now has [native support for the TLS network protocol][6]. + +* Steps toward the [swapping of transparent huge pages][7] have been taken, leading eventually to better memory-management performance. + +* The handling of writeback errors in the block subsystem [has been improved][1], with the result that errors are far less likely to go unreported to the application writing the data. + +The 4.13 kernel is in the stabilization period now, so only fixes will be accepted during the remainder of this development cycle. + +This [work][10] is licensed under a [Creative Commons Attribution-ShareAlike 3.0 License][11]. + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/news/2017/7/linux-weather-forecast + +作者:[JONATHAN CORBET][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.linux.com/users/corbet +[1]:https://lwn.net/Articles/724307/ +[2]:https://lwn.net/Articles/720675/ +[3]:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d83a7cb375eec21f04c83542395d08b2f6641da2 +[4]:https://lwn.net/Articles/717125/ +[5]:https://lwn.net/Articles/722293/ +[6]:https://lwn.net/Articles/666509/ +[7]:https://lwn.net/Articles/717707/ +[8]:http://www.lwn.net/ +[9]:https://lwn.net/Articles/726950/ +[10]:http://purl.org/dc/elements/1.1/ +[11]:http://creativecommons.org/licenses/by-sa/3.0/ From e648e75db5350f3f77c8bf56d25e8112ec9dbbb4 Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 27 Jul 2017 08:31:04 +0800 Subject: [PATCH 0808/1407] translated --- ...ce Unified Block List With Whitelisting.md | 90 ------------------- ...ce Unified Block List With Whitelisting.md | 90 +++++++++++++++++++ 2 files changed, 90 insertions(+), 90 deletions(-) delete mode 100644 sources/tech/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md create mode 100644 translated/tech/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md diff --git a/sources/tech/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md b/sources/tech/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md deleted file mode 100644 index aa59fb3387..0000000000 --- a/sources/tech/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md +++ /dev/null @@ -1,90 +0,0 @@ -translating----geekpi - -This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting -============================================================ - - ![](https://irp-cdn.multiscreensite.com/58a25abc/dms3rep/multi/desktop/host-400x300.jpg) - -There are many helpful lists maintained online with constantly-updated hosts files that contain the domains of various Internet crap peddlers. Copying these lists into your hosts file can easily block a large number of domains that your system would be better off unable to connect to. This method works without installing a browser plug-in and will handle blocking for any browser (and any other program) on the system. - -In this tutorial, I'll show you how to get Steven Black's [Unified Hosts script][1] up and running in Linux. The script will keep your computer's hosts file updated (from multiple sources) with the latest known ad servers, phishing sites and other web scum, all while providing a nice, clean way to manage your own black/whitelists separately from the lists the script manages. - -There are two caveats to note before putting 30,000 domains into your hosts file. First off, these huge lists contain servers that you might need unblocked in order to make an online purchase or for some other temporary situation. You'll know you have a problem when something on the web is broken since you messed with your hosts file. To remedy this, I'm going to show you how to make a handy on/off switch so you can quickly disable your blocklist to buy that Himalayan salt lamp (it's the ions). I still consider it a feature of these lists that all manner of things get blocked (it was only annoying until I thought of making that off switch). If you have a repeat problem with a blocked server that you need often, just add it to your whitelist file and you're all set. - -The second problem is a slight performance hit because the system has to check the entire list each time a domain is called up. Maybe there's a small hit, but not big enough for me to ditch the list and let every connection through. However, consider yourself warned. - -Hosts files block a server by directing requests to that server to either 127.0.0.1 or 0.0.0.0 - in other words, nowhere. Some say using zero's is a faster, less problematic way to accomplish the blocking. You can configure the script to use any blocking ip you want by executing it with the --ip option like "--ip nnn.nnn.nnn.nnn", but the default is 0.0.0.0 and that's where I'm leaving it. - -I used to do what Steven's script does by hand every once in a while, going to each site, copy/pasting their lists into my hosts file, doing a find-replace to change the one-twenty-seven's to zeros, etc. I knew the whole thing could be automated and there were tons of dupes, but I never took the time to address the problems. Since finding this script, that's now a forgotten chore. - -Let's start by getting a fresh copy of Mr. Black's code downloaded (~150MB) so we can push some electrons around. You'll need git installed, so if it's not, go to the terminal and enter: - -**sudo apt-get install git**  - -After it's done installing, enter: - -**mkdir unifiedhosts**  -**cd unifiedhosts**  -**git clone** [**https://github.com/StevenBlack/hosts.git** ][2] -**cd hosts**  - -While your cursor blinks at Steven's script, let's talk about choices. The script has a few options and extensions that I wont cover here, but I figure if you got this far and you're interested, the [readme.md][3] file can tell you all you need to know. - -You need python installed to run the script, and which version you have matters. To find the version of Python you have, enter: - -**python --version**  - -If you don't have python installed: - -**sudo apt-get install python**  - -For Python 2.7, execute the script by entering "python" as I do below. For Python 3, replace "python" in the command with "python3". Upon execution, the script makes sure it has the most recent version of each list and if not, grabs a new copy. It then writes a new hosts file, including anything in your black/whitelists. Let's give it a try using the -r option to replace our active hosts file and the -a option so the script wont ask any questions. Back to the terminal, and: - -**python updateHostsFile.py -r -a**  - -The command will ask for your password so it can write to /etc/. For the newly updated list to be active, some systems require a good flush of the DNS cache. On the same hardware, I've observed different operating systems express very different behavior regarding the length of time it takes for a server to become reachable/unreachable after updating the hosts file without a flush. I've seen everything from instantaneously (Slackware) to never/reboot (Windows). There are commands to flush the DNS cache, but they're different on each OS and even each distro, so just reboot if the changes don't take. - -Now it's as simple as adding your personal exceptions to the black/whitelist files and running the script whenever you want to update the hosts file. The script will adjust the resultant hosts file according to your specs, appending the file with your additions automatically each time you run it. - -Finally, let's create the on/off switches. We need a script for each function, so go back to the terminal to create the OFF switch by entering (replacing leafpad with your text editor): - -**leafpad hosts-off.sh**  - -and enter the following into the new file: - -**#!/bin/sh**  -**sudo mv /etc/hosts /etc/hostsDISABLED**  - -And then make it executable with: - -**chmod +x hosts-off.sh**  - -Similarly, for the ON switch: - -**leafpad hosts-on.sh -** -and enter the following into the new file: - -**#!/bin/sh**  -**sudo mv /etc/hostsDISABLED /etc/hosts -** -And finally make it executable with: - -**chmod +x hosts-on.sh - -**All you need to do is create a shortcut somewhere for each script, labeling them HOSTS-ON and HOSTS-OFF and there you have it. - --------------------------------------------------------------------------------- - -via: https://www.darrentoback.com/this-script-updates-hosts-files-using-a-multi-source-unified-block-list-with-whitelisting - -作者:[dmt][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.darrentoback.com/about-me -[1]:https://github.com/StevenBlack/hosts -[2]:https://github.com/StevenBlack/hosts.git -[3]:https://github.com/StevenBlack/hosts/blob/master/readme.md diff --git a/translated/tech/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md b/translated/tech/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md new file mode 100644 index 0000000000..3844f1c586 --- /dev/null +++ b/translated/tech/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md @@ -0,0 +1,90 @@ +此脚本使用含多来源统一阻止列表的白名单来更新主机文件 +============================================================ + + ![](https://irp-cdn.multiscreensite.com/58a25abc/dms3rep/multi/desktop/host-400x300.jpg) + +网上有许多持续维护的含有不同垃圾域的有用列表。将这些列表复制到你的主机文件中可以轻松阻止大量的域,你的系统则无法连接它们。此方法在不安装浏览器插件的情况下工作,并且将处理系统上任何浏览器(和任何其他程序)的阻止操作。 + +在本教程中,我将向你展示如何在 Linux 中启动并运行 Steven Black 的[统一主机脚本][1]。该脚本将使用最新的已知广告服务器、网络钓鱼网站和其他网络垃圾邮件更新(多个来源)的计算机主机文件,同时提供一个漂亮、干净的方式来管理自己的黑名单/白名单,与脚本管理的列表分开管理。 + +在将 30,000 个域放入主机文件之前,需要注意两点。首先,这些巨大的列表包含可能需要解除封锁的服务器,以便进行在线购买或其他一些临时情况。当网上的事情出现问题时,你会意识到你遇到一个麻烦了,因为你搞砸了你的主机文件。为了解决这个问题,我将向你展示如何使用方便的打开/关闭开关,以便你可以快速禁用阻止列表购买喜马拉雅盐雾灯(它是等离子灯)。我仍然认为这些列表的一个特点是将所有的一切都封锁(这只是烦人,直到我想到了关闭开关)。如果你经常遇到你需要的服务器被阻止的问题,只需将其添加到白名单文件中即可。 + +第二个问题是性能受到了轻微的影响, 因为每次调用一个域时, 系统都必须检查整个列表。也许会有一个小的命中, 但不够大, 因此我放弃名单, 让每一个连接都通过。但是, 请你自己考虑。 + +主机文件通过将请求定向到 127.0.0.1 或 0.0.0.0(换句话说定向到空地址)来阻止请求。有人说使用 0 是更快,问题更少的方法。你可以将脚本配置为使用 “-ip nnn.nnn.nnn.nnn” 这样的 ip +选项来作为阻止 ip, 但默认值是 0.0.0.0, 这是我使用的值。 + + +我曾经将 Steven 脚本做的事每隔一段时间就手动做一遍,进到每一个站点,将他们的列表拷贝/粘贴到我的主机文件中,做一个查找替换将其中一些变成 0 等等。我知道整件事情可以自动化,这样做有点傻,但我从来没有花时间解决这个问题。直到我找到这个脚本, 现在这已经是一个被遗忘的杂务。 + +让我们先下载一份 Black 代码拷贝(大约 150MB),以便我们可以进行下一步。你需要安装 git,因此如果还没安装,进入到终端输入: + +**sudo apt-get install git**  + +安装完之后,输入: + +**mkdir unifiedhosts**  +**cd unifiedhosts**  +**git clone** [**https://github.com/StevenBlack/hosts.git** ][2] +**cd hosts**  + +当您的光标在 Steven 的脚本中闪烁时,让我们来谈谈选择。该脚本有几个选项和扩展,但扩展我不会在这里覆盖,但如果你到了这一步并且你有兴趣,[readme.md][3] 可以告诉你所有你需要知道的。 + +你需要安装 python 来运行此脚本,并且与版本有关。要找到你安装的 Python 版本,请输入: + +**python --version**  + +如果你还没安装 Python: + +**sudo apt-get install python**  + +对于 Python 2.7,如下所示,输入 “python” 来执行脚本。对于 Python 3,在命令中的 “python” 替换成 “python3”。执行后,该脚本会确保它具有每个列表的最新版本,如果没有,它会抓取一个新的副本。然后,它会写入一个新的 hosts 文件,包括了黑名单/白名单中的任何内容。让我们尝试使用 -r 选项来替换我们的活动主机文件以及 -a 选项,以便脚本不会发生任何问题。回到终端: + +**python updateHostsFile.py -r -a**  + +该命令将询问你的密码,以便能够写入 /etc/。为了使新更新的列表处于活动状态,某些系统需要清除 DNS 缓存。在同一个硬件上,我观察到不同的操作系统表现出非常不同的行为,在没有刷新缓存的情况下不同的服务器变为可访问/不可访问所需的时间长度都不同。我已经看到了从即时(Slackware)到重启更新(Windows)的所有情况。有一些命令可以刷新 DNS 缓存,但是它们在每个操作系统甚至每个发行版上都不同,所以如果没有生效,只需要重新启动就行了。 + +现在,只要将你的个人例外添加到黑名单/白名单中,并且只要你想要更新主机文件,运行该脚本就好。该脚本将根据你的要求调整生成的主机文件,每次运行文件时会自动追加你额外的列表。 + +最后,我们来创建一个打开/关闭开关。我们每个功能都需要一个脚本,所以回到终端输入下面的内容创建关闭开关(用你自己的文本编辑器替换 leafpad): + +**leafpad hosts-off.sh**  + +在新文件中输入下面的内容: + +**#!/bin/sh**  +**sudo mv /etc/hosts /etc/hostsDISABLED**  + +接着让它可执行: + +**chmod +x hosts-off.sh**  + +相似地,对于打开开关: + +**leafpad hosts-on.sh +** +在新文件中输入下面的内容: + +**#!/bin/sh**  +**sudo mv /etc/hostsDISABLED /etc/hosts +** +最后让它可执行: + +**chmod +x hosts-on.sh + +**你所需要做的是为每个脚本创建一个快捷方式,标记它们的 HOSTS-ON 和 HOSTS-OFF,你就能找到它们了。 + +-------------------------------------------------------------------------------- + +via: https://www.darrentoback.com/this-script-updates-hosts-files-using-a-multi-source-unified-block-list-with-whitelisting + +作者:[dmt][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.darrentoback.com/about-me +[1]:https://github.com/StevenBlack/hosts +[2]:https://github.com/StevenBlack/hosts.git +[3]:https://github.com/StevenBlack/hosts/blob/master/readme.md From c841a7c06f372f004231b197ca9e2fd6f9d41d67 Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 27 Jul 2017 08:33:22 +0800 Subject: [PATCH 0809/1407] translating --- sources/tech/20170725 Linux Weather Forecast.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170725 Linux Weather Forecast.md b/sources/tech/20170725 Linux Weather Forecast.md index f52fd9b900..75a89be707 100644 --- a/sources/tech/20170725 Linux Weather Forecast.md +++ b/sources/tech/20170725 Linux Weather Forecast.md @@ -1,3 +1,5 @@ +translating---geekpi + Linux Weather Forecast ============================================================ From 0615f49bf08ea582c9310005e51fc6ce3fdbd60c Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 27 Jul 2017 14:37:48 +0800 Subject: [PATCH 0810/1407] PRF&PUB:20170725 ss another way to get socket statistics.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @Vic020 标点符号要用中文。 --- ...ss another way to get socket statistics.md | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) rename {translated/tech => published}/20170725 ss another way to get socket statistics.md (62%) diff --git a/translated/tech/20170725 ss another way to get socket statistics.md b/published/20170725 ss another way to get socket statistics.md similarity index 62% rename from translated/tech/20170725 ss another way to get socket statistics.md rename to published/20170725 ss another way to get socket statistics.md index 250ed2c756..a3b74306db 100644 --- a/translated/tech/20170725 ss another way to get socket statistics.md +++ b/published/20170725 ss another way to get socket statistics.md @@ -1,9 +1,9 @@ -ss: 获得socket统计的另一种方法 +ss:查看网络连接的另一种方法 ============================================================ -在之前的文章中,我有提到**ss**, _iproute2_ 包附带的另一个工具, 允许你查询socket的有关统计信息. 可以完成**netstat**同样的任务, 但是,ss稍微快一点而且命令更简短. +在之前的文章中,我提到过 `ss`,它是 iproute2 包附带的另一个工具,允许你查询 socket 的有关统计信息。可以完成 `netstat` 同样的任务,但是,`ss` 稍微快一点而且命令更简短。 -直接输入**ss**, 默认会显示与netstat同样的内容, 并且输入类似的参数可以获取你想要的类似输出. 例如: +直接输入 `ss`,默认会显示与 `netstat` 同样的内容,并且输入类似的参数可以获取你想要的类似输出。例如: ``` $ ss -t @@ -14,12 +14,11 @@ ESTAB       0      0            192.168.0.136:47574           […] ``` +`ss -t` 只显示 TCP 连接。`ss -u` 用于显示 UDP 连接,`-l` 参数只会显示监听的端口,而且可以进一步过滤到任何想要的信息。 -**ss -t** 只显示TCP连接. **ss -u** 用于显示UDP连接, **-l** 只会显示监听的端口,而且可以进一步过滤到任何想要的信息。 +我并没有测试所有可用参数,但是你甚至可以使用 `-K` 强制关闭 socket。 -我并没有测试所有可用参数, 但是可以使用 **-K** 强制关闭socket. - -**ss**真正耀眼的地方是内置的过滤能力.让我们列出所有端口为22(ssh)的连接: +`ss` 真正耀眼的地方是其内置的过滤能力。让我们列出所有端口为 22(ssh)的连接: ``` $ ss state all sport = :ssh @@ -29,7 +28,7 @@ tcp   ESTAB      0      0          192.168.0.136:ssh           tcp   LISTEN     0      128                   :::ssh                                 :::* ``` -如果只想看已建立的socket(排除了 _listening_ 和 _closed_ ): +如果只想看已建立的 socket(排除了 _listening_ 和 _closed_ ): ``` $ ss state connected sport = :ssh @@ -37,7 +36,7 @@ Netid State      Recv-Q Send-Q     Local Address:Port               tcp   ESTAB      0      0          192.168.0.136:ssh                      192.168.0.102:46540 ``` -类似的, 可以列出指定的host或者ip段; 例如, 列出到达74.125.0.0/16子网的连接, 这个子网属于Google: +类似的,可以列出指定的 host 或者 ip 段。例如,列出到达 74.125.0.0/16 子网的连接,这个子网属于 Google: ``` $ ss state all dst 74.125.0.0/16 @@ -47,17 +46,17 @@ tcp   ESTAB      0      0          192.168.0.136:42034         tcp   ESTAB      0      0          192.168.0.136:57408                   74.125.202.189:https ``` -ss与 _iptables_ 的语法非常相同, 如果已经熟悉了其语法, ss非常容易上手. 也可以安装 _iproute2-doc_ 包, 通过 _/usr/share/doc/iproute2-doc/ss.html_ 获得完整文档. +`ss`与 iptables 的语法非常相同,如果已经熟悉了其语法,`ss` 非常容易上手。也可以安装 iproute2-doc 包, 通过 `/usr/share/doc/iproute2-doc/ss.html` 获得完整文档。 -还不快试试! 你就可以知道它有多棒.无论如何, 让我输入的字符越少我越高兴. +还不快试试! 你就可以知道它有多棒。无论如何,让我输入的字符越少我越高兴。 -------------------------------------------------------------------------------- via: https://insights.ubuntu.com/2017/07/25/ss-another-way-to-get-socket-statistics/ -作者:[ Mathieu Trudel-Lapierre ][a] +作者:[Mathieu Trudel-Lapierre][a] 译者:[VicYu](https://vicyu.com) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From b15a551c6b476521ed818684d15a0b931626d1ca Mon Sep 17 00:00:00 2001 From: Yu Haixin <836401406@qq.com> Date: Thu, 27 Jul 2017 15:09:36 +0800 Subject: [PATCH 0811/1407] Translating by name1e5s (#5842) * Translatting by name1e5s * [Translated]The decline of GPL?.md --- sources/talk/20170213 The decline of GPL.md | 93 ------------------- ...LEARN DOCKER FOR FREE PLAY-WITH-DOCKER.md} | 0 .../talk/20170213 The decline of GPL.md | 91 ++++++++++++++++++ 3 files changed, 91 insertions(+), 93 deletions(-) delete mode 100644 sources/talk/20170213 The decline of GPL.md rename sources/tech/{20170717 THE BEST WAY TO LEARN DOCKER FOR FREE: PLAY-WITH-DOCKER.md => 20170717 THE BEST WAY TO LEARN DOCKER FOR FREE PLAY-WITH-DOCKER.md} (100%) create mode 100644 translated/talk/20170213 The decline of GPL.md diff --git a/sources/talk/20170213 The decline of GPL.md b/sources/talk/20170213 The decline of GPL.md deleted file mode 100644 index 491b9c2930..0000000000 --- a/sources/talk/20170213 The decline of GPL.md +++ /dev/null @@ -1,93 +0,0 @@ -The decline of GPL? -============================================================ - - ![The decline of GPL?](https://opensource.com/sites/default/files/styles/image-full-size/public/images/law/LAW_vaguepatent_520x292.png?itok=9It-cWjB "The decline of GPL?") -Image by : opensource.com - -A little while ago I saw an interesting tweet from Stephen O'Grady at RedMonk [on the state of open source licensing][2], including this graph. - - ![Redmonk Black Duck Licensing](https://opensource.com/sites/default/files/resize/oss-blk-duck-licensing-0110-0117-wm-2-520x344.png "Redmonk Black Duck Licensing") - -This graph shows how license usage has changed from 2010 to 2017\. In reading it, it is clear that usage of the GPL 2.0 license, one of the purest copyleft licenses around, has more than halved in usage. According to the chart it would appear that the popularity of open source licensing has subsequently shifted to the [MIT][3] and [Apache][4] licenses. There has also been a small increase in [GPL 3.0][5] usage. - -So, what does all this mean? - -Why has GPL 2.0 usage dropped so dramatically with only a marginal increase in GPL 3.0 usage? Why has MIT and Apache usage grown so dramatically? - -Of course, there are many interpretations, but my guess is that this is due to the increased growth in open source in business, and a nervousness around the GPL in the commercial world. Let's dig in. - -### The GPL and business - -Now, before I get started, I know I am going to raise the ire of some GPL fans. Before you start yelling at me, I want to be very clear: I am a huge fan and supporter of the GPL. - -I have licensed every piece of software I have ever written under the GPL, I have been an active financial supporter of the [Free Software Foundation][6] and [Software Freedom Conservancy][7] and the work they do, and I advocate for the usage of the GPL. My comments here are not about the validity or the great value of the GPL—it is an unquestionably great license—but more about the perception and interpretation of the license in the industry. - -About four years ago, I was at an annual event called the Open Source Think Tank. This event was a small, intimate, annual gathering of executives in the open source industry in the California wine country. The event focused on networking, building alliances, and identifying and addressing industry problems. - -At this event, there was a group case study in which the attendees were broken into smaller groups and asked to recommend an open source license for a real-world project that was building a core open source technology. Each group read back their recommendations, and I was surprised to see that every one of the 10 or so groups suggested a permissive license, and not one suggested the GPL. - -I had seen an observational trend in the industry towards the Apache and MIT licenses, but this raised a red flag at the time about the understanding, acceptance, and comfort of the GPL in the open source industry. - -It seems that in recent years that trend has continued. Aside from the Black Duck research, a [license study in GitHub][8] in 2015 found that the MIT license was a dominant choice. Even observationally in my work at XPRIZE (where we chose a license for the [Global Learning XPRIZE][9]), and my work as a [community leadership consultant][10], I have seen a similar trend with many of my clients who feel uncomfortable licensing their code under GPL. - -With an [estimated 65% of companies contributing to open source][11], there has clearly been a growth in commercial interest and investment since 2010\. I believe this, tied with the trends I just outlined, would suggest that the industry does not feel the GPL is generally the right choice for an open source business. - -### Interfacing community and company - -To be honest, GPL's declining popularity is not entirely surprising, and for a few reasons. - -Firstly, as the open source industry has evolved, it has become clear that finding the right balance of community engagement and a business model that... y'know... actually works, is a key decision. There was a misconception in the early days of open source that, "If you build it, they will come." Sure, they often came to use your software, but in many cases, "If you built it, they wouldn't necessarily give you any money." - -As the years have progressed we have seen various companies, such as Red Hat, Automattic, Docker, Canonical, Digital Ocean, and others, explore different methods of making money in open source. This has included distribution models, services models, open core models, and more. What has become clear is that the traditional software scarcity model doesn't work with open source code; therefore, you need to choose a license that supports the needs of the model the company chooses. Getting this balance between revenue and providing your technology for free is a tough prospect for many. - -This is where we see the rub. While the GPL is an open source license, it is fundamentally a Free Software license. As a Free Software license, much of the stewardship and support for the GPL has been driven by the Free Software Foundation. - -As much as I love the work of the Free Software Foundation, their focus has ultimately been anchored from the perspective that software absolutely has to be 100% free. There isn't much room for compromise with the FSF, and even well-recognized open source projects (such as many Linux distributions) have been deemed "non-free" due to a tiny bit of binary firmware. - -This proves complicated for businesses where there is rarely a black and white set of choices and there is instead a multitude of grey. Few businesses share the pure ideology of the Free Software Foundation (or similar groups such as the Software Freedom Conservancy), and thus I suspect businesses are less comfortable about choosing a license that is so connected to such a pure ideology. - -Now, to be clear, I don't blame the FSF (and similar organizations such as the SFC) for this. They have a specific mandate and mission focused on building a comprehensive free software commons, and it is perfectly reasonable for them to draw their line in the sand wherever they choose. The FSF and SFC do _phenomenal_ work and I will long continue to be a supporter of them and the many wonderful people who work there. I just believe that a consequence of such purity is that companies may feel uneasy being able to meet the mark, and thus chose to use a different choice of license than the GPL. - -I suspect what has also affected GPL usage is a change in dynamic as open source has grown. In the early days, one of the core fundamental reasons why projects would start was a rigorous focus on openness and the ethical elements of software freedom. The GPL was unsurprisingly a natural choice for this projects, with Debian, Ubuntu, Fedora, Linux, and many others as examples. - -In recent years though we have seen a newer generation of developers form for whom there is a less critical, and if I dare say it, less religious focus on freedom. For them, open source is a pragmatic and practical component in building software as opposed to an ethical choice, and I suspect this is why we have seen such a growth in the use of MIT and Apache licenses. - -### The future? - -What does this mean for the GPL? - -My guess is that the GPL will continue to be a popular choice of license, but developers will view it increasingly as a purer free software license. I suspect that projects that have an ethical commitment to software freedom will prioritize the GPL over other licenses, but for businesses where there needs to be the balance we discussed earlier, I suspect the MIT and Apache licenses will continue to grow in popularity. - -Either way, the great news is that open source and free software is growing, and while there may be complexity and change in how licenses are used, what matters more is that technology is increasingly becoming open, accessible, and available to everyone. - --------------------------------------------------------------------------------- - -作者简介: - -Jono Bacon - Jono Bacon is a leading community manager, speaker, author, and podcaster. He is the founder of Jono Bacon Consulting which provides community strategy/execution, developer workflow, and other services. He also previously served as director of community at GitHub, Canonical, XPRIZE, OpenAdvantage, and consulted and advised a range of organizations. - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/17/2/decline-gpl - -作者:[Jono Bacon][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/jonobacon -[1]:https://opensource.com/article/17/2/decline-gpl?rate=WfBHpUyo5BSde1SNTJjuzZTJbjkZTES77tcHwpfTMdU -[2]:https://twitter.com/sogrady/status/820001441733607424 -[3]:https://opensource.org/licenses/MIT -[4]:http://apache.org/licenses/ -[5]:https://www.gnu.org/licenses/gpl-3.0.en.html -[6]:http://www.fsf.org/ -[7]:https://sfconservancy.org/ -[8]:https://github.com/blog/1964-open-source-license-usage-on-github-com -[9]:http://learning.xprize.org/ -[10]:http://www.jonobacon.org/consulting -[11]:https://opensource.com/business/16/5/2016-future-open-source-survey -[12]:https://opensource.com/user/26312/feed -[13]:https://opensource.com/article/17/2/decline-gpl#comments -[14]:https://opensource.com/users/jonobacon diff --git a/sources/tech/20170717 THE BEST WAY TO LEARN DOCKER FOR FREE: PLAY-WITH-DOCKER.md b/sources/tech/20170717 THE BEST WAY TO LEARN DOCKER FOR FREE PLAY-WITH-DOCKER.md similarity index 100% rename from sources/tech/20170717 THE BEST WAY TO LEARN DOCKER FOR FREE: PLAY-WITH-DOCKER.md rename to sources/tech/20170717 THE BEST WAY TO LEARN DOCKER FOR FREE PLAY-WITH-DOCKER.md diff --git a/translated/talk/20170213 The decline of GPL.md b/translated/talk/20170213 The decline of GPL.md new file mode 100644 index 0000000000..240a4601cb --- /dev/null +++ b/translated/talk/20170213 The decline of GPL.md @@ -0,0 +1,91 @@ +GPL 没落了吗? +=================================== + +![GPL 没落了吗?](https://opensource.com/sites/default/files/styles/image-full-size/public/images/law/LAW_vaguepatent_520x292.png?itok=9It-cWjB "The decline of GPL?") +Image by : opensource.com + +不久之前我看到了 RedMonk 的 Stephen O'Grady 发了一个[关于开源协议的有趣的推特][2],那个推特里面有这张图。 + + ![Redmonk Black Duck Licensing](https://opensource.com/sites/default/files/resize/oss-blk-duck-licensing-0110-0117-wm-2-520x344.png "Redmonk Black Duck Licensing") + +这张图片显示了从 2010 到 2017 年间各种开源协议之间的使用率的变化。在这张图片里,显然 GPL 2.0,最纯净的 copyleft 协议之一,的使用率不只是折了个半。表格表明,开源项目中 [MIT][3] 协议和 [Apache][4] 协议开始受欢迎。[GPL 3.0][5] 的使用率也有所上涨。 + +这些意味着什么? + +为什么 GPL 2.0 的使用率跌的这么多但是 GPL 3.0 仅仅是涨了一丁点?为什么 MIT 和 Apache 的使用率涨了那么多? + +当然,有很多原因可以解释这件事情,但是我想这是因为商业开源项目的增多,以及商业社会对于 GPL 协议的担心导致的,我们细细掰扯。 + +### GPL 协议与商业社会 + +我知道我要说的可能会激怒一些 GPL粉,所以在你们开始喷之前,我想说明:我支持 GPL,也是 GPL 粉丝。 + +我写过的所有软件都使用的 GPL 协议,我也是一直是出资支持 [自由软件基金会][6] 以及 [软件自由保护组织][7] 以及他们的工作的,我支持使用 GPL 协议。我在这说的无关 GPL 的合法性或者 GPL 的巨大价值 —— 毫无疑问这是一个好协议 —— 我在这要说的是商业社会对于这个协议的看法。 + +大概四年之前,我参加了一个叫做 开源智库 的峰会。这个峰会是一个私人小型峰会,每年都会把各大开源企业的管理人员请到加利福尼亚的酒庄。这个峰会聚焦于网络,构建联盟,识别报告企业问题。 + +在这个峰会上,有一个小组研究,在这个小组研究中,与会者被分成小组,被要求给一个真实存在的核心开源技术推荐一个开源协议。每个小组都给出了回应。不到十分之一的小组推荐了公共许可证,没有热推荐 GPL 许可证。 + +我看到了开源行业对于 Apache 以及 MIT 协议的逐步认可,但是他们却对花时间理解,接受,熟悉 GPL 这件事高高挂起。 + +在这几年里,这种趋势仍在蔓延。除了 Black Duck 的调查之外, 2015 年 [GitHub 上的开源协议调查][8] 也显示 MIT 是人们的首选。我还能看到,在我工作的 XPRIZE (我们为我们的 [Global Learning XPRIZE][9] 选择了开源协议),在我的职位,[社区领导顾问][10],我也能感觉到那种倾向,因为越来越多的客户觉得把他们的代码用 GPL 发布不舒服。 + +随着 [大约 65% 的公司对开源事业做贡献][11] ,自从 2010 年以后显然开源行业已经有了不少商业资本和投资。我相信,我之前说的那些趋势,已经表明这行业不认为 GPL 适合搞开源生意。 + +### 连接社区和公司 + +说真的,GPL 的没落不太让人吃惊,因为有如下原因。 + +首先,开源行业已经转型升级,它要在社区发展以及...你懂的...真正能赚钱的商业模型中做出均衡,这是它们要做的最重要的决策。在开源思想发展之初,人们有种误解说,“如果你搞出来了,他们就会用”,他们确实会来使用你的软件,但是在很多情况下,都是“如果你搞出来了,他们不一定会给你钱。” + +随着历史的进程,我们看到了许多公司,比如 Red Hat, Automattic, Docker, Canonical, Digital Ocean 等等等等,发展着在开源领域中赚钱的法子。他们发展过分发模型,服务模型,开源核心服务模型等等等等。现在可以确定的是,传统的商业软件赚钱的方式已经不在开源软件这适用;因此,你得选择一个能够支持你的公司的营业方式的开源协议。在赚钱和免费提供你的技术之间找到平衡在很多情况下是很困难的一件事。 + +这就是我们看到那些变化的原因。尽管 GPL 是一个开源协议,但是它还是自由软件协议,作为自由软件协议,它的管理以及支持是由自由软件基金会提供的。 + +我喜欢自由软件基金会的作品,但是他们已经把观点局限于软件必须 100 % 绝对免费。对于 FSF 没有多少可以妥协的,甚至很多出名的开源项目(比如很多 Linux 发行版)仅仅是因为一丁点二进制固件就被认为是 “非免费” 软件。 + +对于商业来说,最复杂的就是它不是非黑即白,更多的时候是两者混合的灰色,很少有公司有自由软件基金会(或者类似的组织,比如软件自由保护组织)的那种纯粹的理念,因此我想那些公司也不喜欢选择和那些理念相关的协议。 + +我需要说明,我不是在这是说 FSF 以及类似的组织(比如 SFC)的错。他们有着打造完全免费的软件的目标,对于他们来说,走它们选择的路十分合理。FSF 以及 SFC 做了_了不起_的工作,我将继续支持这些组织以及为他们工作的人们。我相信,这种纯粹性的高要求的一个后果就是让那些公司认为自己难以达到要求,因此,他们使用了非 GPL 的其他协议。 + +近年来,尽管我们已经看到了不再那么挑剔的一代开发者的出现,但是他们却缺少对于自由的关注。对于他们来说开源软件是务实实用的构建软件的一部分,而不是关乎伦理的问题。我想,这就是为什么我们发现 MIT 和 Apache 协议的流行的原因。 + +### 未来 ? + +这对于 GPL 意味着什么? + +我的猜想是 GPL 依然将是一个主要选项,但是开发者将将他视为纯粹的自由软件协议。我想对于软件的纯粹性有高要求的项目会优先选择 GPL 协议。但是对于商业软件,为了保持我们之前讨论的平衡,他们不会那么做。我猜测, MIT 以及 Apache 依然会继续流行下去。 + +不管怎样,好消息是开源/免费软件行业确实在增长。无论使用的协议会发生怎样的变化,技术确实变得更加开放,可以接触,人人都能使用。 + +-------------------------------------------------------------------------------- + +作者简介: + +Jono Bacon - Jono Bacon is a leading community manager, speaker, author, and podcaster. He is the founder of Jono Bacon Consulting which provides community strategy/execution, developer workflow, and other services. He also previously served as director of community at GitHub, Canonical, XPRIZE, OpenAdvantage, and consulted and advised a range of organizations. + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/17/2/decline-gpl + +作者:[Jono Bacon][a] +译者:[name1e5s](https://github.com/name1e5s) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/jonobacon +[1]:https://opensource.com/article/17/2/decline-gpl?rate=WfBHpUyo5BSde1SNTJjuzZTJbjkZTES77tcHwpfTMdU +[2]:https://twitter.com/sogrady/status/820001441733607424 +[3]:https://opensource.org/licenses/MIT +[4]:http://apache.org/licenses/ +[5]:https://www.gnu.org/licenses/gpl-3.0.en.html +[6]:http://www.fsf.org/ +[7]:https://sfconservancy.org/ +[8]:https://github.com/blog/1964-open-source-license-usage-on-github-com +[9]:http://learning.xprize.org/ +[10]:http://www.jonobacon.org/consulting +[11]:https://opensource.com/business/16/5/2016-future-open-source-survey +[12]:https://opensource.com/user/26312/feed +[13]:https://opensource.com/article/17/2/decline-gpl#comments +[14]:https://opensource.com/users/jonobacon From 6547a6b000f0e954751ca84f7a55c18cdfebc618 Mon Sep 17 00:00:00 2001 From: Ezio Date: Thu, 27 Jul 2017 15:10:48 +0800 Subject: [PATCH 0812/1407] =?UTF-8?q?20170727-1=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 修改文件名 --- ...17 THE BEST WAY TO LEARN DOCKER FOR FREE PLAY-WITH-DOCKER.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/tech/20170717 THE BEST WAY TO LEARN DOCKER FOR FREE PLAY-WITH-DOCKER.md b/sources/tech/20170717 THE BEST WAY TO LEARN DOCKER FOR FREE PLAY-WITH-DOCKER.md index 4d65c983be..0dca67a591 100644 --- a/sources/tech/20170717 THE BEST WAY TO LEARN DOCKER FOR FREE PLAY-WITH-DOCKER.md +++ b/sources/tech/20170717 THE BEST WAY TO LEARN DOCKER FOR FREE PLAY-WITH-DOCKER.md @@ -84,7 +84,7 @@ Victor is the Sr. Community Marketing Manager at Docker, Inc. He likes fine wine ------------ +-------------------------------------------------------------------------------- via: https://blog.docker.com/2017/07/best-way-learn-docker-free-play-docker-pwd/ From 1915cf3339c2b265c28dfd33a5f5e51e5d84f7f5 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 27 Jul 2017 15:15:10 +0800 Subject: [PATCH 0813/1407] PRF&PUB:20170713 Fundamentals of graph databases with Neo4j.md @geekpi --- ...damentals of graph databases with Neo4j.md | 68 +++++++++++++++ ...damentals of graph databases with Neo4j.md | 84 ------------------- 2 files changed, 68 insertions(+), 84 deletions(-) create mode 100644 published/20170713 Fundamentals of graph databases with Neo4j.md delete mode 100644 translated/tech/20170713 Fundamentals of graph databases with Neo4j.md diff --git a/published/20170713 Fundamentals of graph databases with Neo4j.md b/published/20170713 Fundamentals of graph databases with Neo4j.md new file mode 100644 index 0000000000..2285f7a1b7 --- /dev/null +++ b/published/20170713 Fundamentals of graph databases with Neo4j.md @@ -0,0 +1,68 @@ +Neo4j 图数据库基础 +============================================================ + +> 在这个三篇系列文章的第一篇文章中,我们将学习图数据库(graph database)的基础知识,它支持了这地球上最大的一些数据池。 + +![Fundamentals of graph databases with Neo4j](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/grasshopper_graph_lead.jpg?itok=X5QPAGYh "Fundamentals of graph databases with Neo4j") + +对于海量的各种非结构化信息来说,图数据库已经成为帮助收集、管理和搜索大量数据的技术。在这三篇系列文章中,我们将使用开源图数据库软件 [Neo4j][9] 来研究图数据库。 + +在本文中,我将向你展示图数据库的基础知识,帮助你快速了解概念模型。在第二篇中,我将向你展示如何启动 Neo4j 数据库,并使用内置的浏览器工具填充一些数据。而且,在本系列的最后一篇文章中,我们将探讨一些在开发工作中使用的 Neo4j 编程库。 + +掌握图数据库的概念模型是有用的,所以我们从那里开始。图数据库中只存储两种数据:节点nodeedge。 + +* **节点是实体:**诸如人物、发票、电影、书籍或其他具体事物。这些有些等同于关系数据库中的记录或行。 +* **边名关系:**连接节点的概念、事件或事物。在关系数据库中,这些关系通常存储在具有链接字段的数据库行中。在图数据库中,它们本身就是有用的,是可以以其自己的权限搜索的对象。 + +节点和边都可以拥有可搜索的_属性_。例如,如果你的节点代表人,他们可能拥有名字、性别、出生日期、身高等属性。而边的属性可能描述了两个人之间的关系何时建立,见面的情况或关系的性质。 + +这是一个帮助你可视化的图表: + +![Graph database image 1](https://opensource.com/sites/default/files/u128651/article_1_image_1.jpg "Graph database image 1") + +在这张图中,你知道 Jane Doe 有一个新的丈夫 John;一个女儿(来自她以前的夫妻关系)Mary Smith 和朋友 Robert 和 Rhonda Roe。Roes 有一个儿子 Ryan,他正在与 Mary Smith 约会。 + +看看它怎么工作?每个节点代表一个独立于其他节点的人。你需要找到关于_那个_人的一切都可以存储在节点的属性中。边描述了人们之间的关系,这与你在程序中需要的一样多。 + +关系是单向的,且不能是无向的,但这没有问题。由于数据库可以以相同的速度遍历两个方向,并且方向可以忽略,你只需要定义一次此关系。如果你的程序需要定向关系,则可以自由使用它们,但如果双向性是暗含的,则不需要。 + +另外需要注意的是,图数据库本质上是无 schema 的。这与关系数据库不同,关系数据库每行都有一组列表,并且添加新的字段会给开发和升级带来很多工作。 + +每个节点都可以拥有一个标签label;对于大多数程序你需要“输入”这个标签,是对典型的关系数据库中的表名的模拟。标签可以让你区分不同的节点类型。如果你需要添加新的标签或属性,修改程序来用它就行! + +使用图数据库,你可以直接开始使用新的属性和标签,节点将在创建或编辑时获取它们。不需要转换东西;只需在你的代码中使用它们即可。在这里的例子中,你可以看到,我们知道 Jane 和 Mary 最喜欢的颜色和 Mary 的出生日期,但是别人没有(这些属性)。这个系统不需要知道它;用户可以在正常使用程序的过程中访问节点时为其添加信息(属性)。 + +作为一名开发人员,这是一个有用的特性。你可以将新的标签或属性添加到由节点处理的表单中并开始使用它,而不必进行数据库 schema 的修改。对于没有该属性的节点,将不显示任何内容。你可以使用任何一种类型的数据库来为表单进行编码,但是你可以放下在关系型数据库中要进行的许多后端工作了。 + +让我们添加一些新的信息: + +![Graph database image 2, defining a new type of node](https://opensource.com/sites/default/files/u128651/article_1_image_2.jpg "Graph database image 2, defining a new type of node") + +这是一个新的节点类型,它代表一个位置,以及一些相关关系。现在我们看到 John Doe 出生在加利福尼亚州的 Petaluma,而他的妻子 Jane 则出生在德克萨斯州的 Grand Prairie。 他们现在住在得克萨斯州的赛普拉斯,因为 Jane 在附近的休斯顿工作。Ryan Roe 缺乏城市关系对数据库来说没有什么大不了的事情,我们_不知道_那些信息而已。当用户输入更多数据时,数据库可以轻松获取新数据并添加新数据,并根据需要创建新的节点和关系。 + +了解节点和边应该足以让你开始使用图形数据库。如果你像我一样,已经在考虑如何在一个图中重组你的程序。在本系列的下一篇文章中,我将向你展示如何安装 Neo4j、插入数据,并进行一些基本的搜索。 + +(题图:由 Jen Wike Huger 修改,CC BY-SA) + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/17/7/fundamentals-graph-databases-neo4j + +作者:[Ruth Holloway][a] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/druthb +[1]:https://opensource.com/tags/python?src=programming_resource_menu1 +[2]:https://opensource.com/tags/javascript?src=programming_resource_menu2 +[3]:https://opensource.com/tags/perl?src=programming_resource_menu3 +[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu4 +[5]:https://opensource.com/file/363056 +[6]:https://opensource.com/file/363061 +[7]:https://opensource.com/article/17/7/fundamentals-graph-databases-neo4j?rate=QlLa3Y_1alHoy77MX2w69IZN5nYBJZrkZ0b2F_0wH_A +[8]:https://opensource.com/user/36051/feed +[9]:https://neo4j.com/ +[10]:https://opensource.com/users/druthb +[11]:https://opensource.com/users/druthb diff --git a/translated/tech/20170713 Fundamentals of graph databases with Neo4j.md b/translated/tech/20170713 Fundamentals of graph databases with Neo4j.md deleted file mode 100644 index 726c807845..0000000000 --- a/translated/tech/20170713 Fundamentals of graph databases with Neo4j.md +++ /dev/null @@ -1,84 +0,0 @@ -Neo4j 图数据库的基础 -============================================================ - -### 在共三部的第一部分中,我们将学习图形数据库的基础知识,它为这地球上最大的一些数据库提供支持。 - -![Fundamentals of graph databases with Neo4j](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/grasshopper_graph_lead.jpg?itok=X5QPAGYh "Fundamentals of graph databases with Neo4j") -图片来源:  - -由 Jen Wike Huger 修改,CC BY-SA - -对于非常大量的各种非结构化信息,图数据库已经成为帮助收集、管理和搜索大量数据的技术。在这三部分系列中,我们将使用 [Neo4j][9],一个开源图数据库来研究图数据库。 - -在本文中,我将向你展示图数据库的基础知识,帮助你快速了解概念模型。第二,我将向你展示如何启动 Neo4j 数据库,并使用内置的浏览器工具填充一些数据。而且,在本系列的最后一篇文章中,我们将探讨一些在开发工作中使用 Neo4j 的编程库。 - -掌握图数据库的概念模型是有用的,所以我们从那里开始。图数据库中只存储两种数据:_节点_和_边_。 - -* **节点是实体:**诸如人物、发票、电影、书籍或其他具体事物。这些有些等同于关系数据库中的记录或行。 - -* **边名关系:**连接节点的概念、事件或事物。在关系数据库中,这些关系通常存储在具有链接字段的数据库行中。在图形数据库中,它们本身就是有用的,可搜索的对象。 - -节点和边都可以拥有可搜索的_属性_。例如,如果你的节点代表人,他们可能拥有名字、性别、出生日期、身高等属性。边属性可能描述了两个人之间的关系何时建立,见面的情况或关系的性质。 - -这是一个帮助你可视化的图表: - -### [article_1_image_1.jpg][5] - -![Graph database image 1](https://opensource.com/sites/default/files/u128651/article_1_image_1.jpg "Graph database image 1") - -在这张图中,你知道 Jane Doe 有一个新的丈夫 John;一个女儿(从她以前的关系)Mary Smith 和朋友 Robert 和 Rhonda Roe。Roes 有一个儿子 Ryan,他正在与 Mary Smith 约会。 - -看看它怎么工作?每个节点代表一个独立于其他节点的人。你需要找到关于_那个_ 人的一切都可以存储在节点的属性中。边描述了人们之间的关系,这与你在程序中需要的一样多。 - -关系是单向的,且不能无向,但这没有问题。由于数据库可以以相同的速度遍历两个方向,并且方向可以忽略,你只需要定义一次此关系。如果你的程序需要定向关系,则可以自由使用它们,但如果双向性是暗含的,则不需要。 - -编程与开发 - -* [新的 Python 内容][1] - -* [我们最新的 JavaScript 文章][2] - -* [最近的 Perl 帖子][3] - -* [红帽开发者博客][4] - -另外需要注意的是,图数据库本质上是无 schema 的。这与关系数据库不同,每行都有一组列表,并且添加新的字段是开发和升级的主要工作。 - -每个节点都可以拥有一个_标签_;这个标签是大多数程序你需要“输入”的,是典型关系数据库中表名的模拟。标签可以让你区分不同的节点类型。如果你需要添加新的标签或属性,请更改你的程序来开始使用! - -使用图数据库,你可以直接开始使用新的属性和标签,节点将在创建或编辑时获取它们。没有必要去转换东西;只需开始在你的代码中使用它们。在这里的例子中,你可以看到,我们知道 Jane 和 Mary 最喜欢的颜色和 Mary 的出生日期,但是别人没有。这个系统不需要知道它;用户可以在程序使用中随意访问节点,添加任意信息。 - -作为一名开发人员,这是一个有用的特性。你可以将新的标签或属性添加到由节点处理的表单中并开始使用它,而不必进行数据库 schema 修改。对于没有属性的节点,将不显示任何内容。你需要使用任一类型的数据库对表单进行编码,但是你可以放下在关系型数据库中要进行的后端工作了。 - -让我们添加一些新的信息: - -### [article_1_image_2.jpg][6] - -![Graph database image 2, defining a new type of node](https://opensource.com/sites/default/files/u128651/article_1_image_2.jpg "Graph database image 2, defining a new type of node") - -这是一个新的节点类型,它代表一个位置,以及一些相关关系。现在我们看到 John Doe 出生在加利福尼亚州的 Petaluma,而他的妻子 Jane 则出生在德克萨斯州的 Grand Prairie。 他们现在住在得克萨斯州的赛普拉斯,因为 Jane 在附近的休斯顿工作。Ryan Roe 缺乏城市关系对数据库来说没有什么大不了的事情,我们_不知道_那些信息。当用户输入更多数据时,数据库可以轻松获取新数据并添加新数据,根据需要创建新的节点和关系。 - -了解节点和边应该足以让你开始使用图形数据库。如果你像我一样,你已经在考虑如何在一个图中重组你的程序。在本系列的下一篇文章中,我将向你展示如何安装 Neo4j、插入数据,并进行一些基本的搜索。 - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/17/7/fundamentals-graph-databases-neo4j - -作者:[Ruth Holloway ][a] -译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/druthb -[1]:https://opensource.com/tags/python?src=programming_resource_menu1 -[2]:https://opensource.com/tags/javascript?src=programming_resource_menu2 -[3]:https://opensource.com/tags/perl?src=programming_resource_menu3 -[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu4 -[5]:https://opensource.com/file/363056 -[6]:https://opensource.com/file/363061 -[7]:https://opensource.com/article/17/7/fundamentals-graph-databases-neo4j?rate=QlLa3Y_1alHoy77MX2w69IZN5nYBJZrkZ0b2F_0wH_A -[8]:https://opensource.com/user/36051/feed -[9]:https://neo4j.com/ -[10]:https://opensource.com/users/druthb -[11]:https://opensource.com/users/druthb From 33dc749bc606bca2fb00c236bbb3e182b75ba7f2 Mon Sep 17 00:00:00 2001 From: lhr Date: Thu, 27 Jul 2017 18:30:34 +0800 Subject: [PATCH 0814/1407] =?UTF-8?q?=E3=80=90LHRchina=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=E4=B8=AD=E3=80=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ... OCI Unveil Controversial Open Container Industry Standard.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md b/sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md index 2f28ccf5c5..894a129107 100644 --- a/sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md +++ b/sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md @@ -1,3 +1,4 @@ +translating---LHRchina CoreOS, OCI Unveil Controversial Open Container Industry Standard ============================================================ ![coreos-oci-open-container-industry-standard](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2017-core-os-1.jpg) From 8ecd6ad64d8a903b235bcadf02fd84945c39a65d Mon Sep 17 00:00:00 2001 From: firmianay Date: Thu, 27 Jul 2017 18:46:02 +0800 Subject: [PATCH 0815/1407] firmianay translating --- ...mcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md b/sources/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md index 20871570aa..34fc026660 100644 --- a/sources/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md +++ b/sources/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md @@ -1,3 +1,5 @@ +Translating---firmianay + 70,000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws ============================================================ From e591c3499be60f0789356d4bf9c1351ce3d74a65 Mon Sep 17 00:00:00 2001 From: firmianay Date: Thu, 27 Jul 2017 22:17:35 +0800 Subject: [PATCH 0816/1407] translated --- ...n Be Hacked Using Eight-Month-Old Flaws.md | 60 ------------------- ...n Be Hacked Using Eight-Month-Old Flaws.md | 57 ++++++++++++++++++ 2 files changed, 57 insertions(+), 60 deletions(-) delete mode 100644 sources/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md create mode 100644 translated/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md diff --git a/sources/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md b/sources/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md deleted file mode 100644 index 34fc026660..0000000000 --- a/sources/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md +++ /dev/null @@ -1,60 +0,0 @@ -Translating---firmianay - -70,000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws -============================================================ - - - -![](https://cdn.thenewstack.io/media/2017/07/261d7153-business-841174_640.jpg) - -Eight months after three critical vulnerabilities were fixed in the memcached open source caching software, there are over 70,000 caching servers directly exposed on the internet that have yet to be patched. Hackers could execute malicious code on them or steal potentially sensitive data from their caches, security researchers warn. - -[Memcached][1] is a software package that implements a high performance caching server for storing chunks of data obtained from database and API calls in RAM. This helps speed up dynamic web applications, making it well suited for large websites and big-data projects. - -While memcached is not a database replacement, the data it stores in RAM can include user sessions and other sensitive information from database queries. As such, the server was not designed to be directly exposed to untrusted environments like the internet, even though some of the more recent versions support basic authentication. - -Back in October, the memcached developers fixed three remote code execution vulnerabilities ([CVE-2016-8704][2], [CVE-2016-8705][3] and [CVE-2016-8706][4]) that were found and reported by security researchers from [Cisco Systems’ Talos division][5]. All of these flaws affected memcached’s binary protocol for storing and retrieving data and one of them was in the [Simple Authentication and Security Layer ][6](SASL) implementation. - -Throughout December and January several groups of attackers wiped data from tens of thousands of publicly exposed databases including MongoDB, CouchDB, Hadoop and Elasticsearch clusters. In many cases they asked server administrators for money to return the data, but there was no evidence they actually copied it. - -The Talos researchers thought that memcached servers might be the next target, especially giving the flaws they had identified a few months earlier, so in February they decided to run a series of internet scans to determine the potential attack surface. - -The scan results revealed that around 108,000 memcached servers were directly exposed to the internet and only 24,000 of them required authentication. The fact that so many servers were publicly accessible without authentication was bad enough, but when they also tested for the presence of the three vulnerabilities, they found that only 200 servers requiring authentication actually had the October patches deployed. All the rest were open to hacking through the SASL vulnerability. - -Overall, 85,000 or around 80 percent of all memcached servers exposed to the internet lacked the security fixes for the three critical flaws announced in October. - -Troubled by the poor patch adoption rate, the Talos researchers decided to run whois queries on the IP addresses of all of those servers and send notification emails to their owners. - -Earlier this month the researchers decided to redo their scans. They found that there are still 106,000 memcached servers exposed to the internet, although 28,500 have different IP addresses than the ones found in February. - -Of these 106,000 servers, 73,400 or around 70 percent continue to be vulnerable to the three exploits patched in October. Over 18,000 of the identified servers require authentication and 99 percent of those continue to have the SASL vulnerability. - -Even after sending tens of thousands of notification emails, the patch adoption rate improved by only 10 percent in six months. - -“The severity of these types of vulnerabilities cannot be understated,” the Talos researchers said Monday in a [blog post][7]. “These vulnerabilities potentially affect a platform that is deployed across the internet by small and large enterprises alike. With the recent spate of worm attacks leveraging vulnerabilities this should be a red flag for administrators around the world. If left unaddressed the vulnerabilities could be leveraged to impact organizations globally and impact business severely.” - -The conclusions of this exercise suggest that many web application owners do a poor job of safeguarding their users’ data. First, a surprisingly large number of memcached servers are directly exposed to the internet and the majority of them do not use authentication. The data cached on these servers is at risk even without the presence of any vulnerabilities. - -Second, even when critical vulnerabilities that could be used to completely compromise servers are patched, many server administrators don’t apply the security fixes in a timely manner, if ever. - -Under these circumstances, seeing large scale attacks against memcached servers like those that targeted MongoDB databases would not be surprising. - --------------------------------------------------------------------------------- - -via: https://thenewstack.io/70000-memcached-servers-can-hacked-using-eight-month-old-flaws/ - -作者:[Lucian Constantin ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://thenewstack.io/author/lucian/ -[1]:https://memcached.org/ -[2]:https://www.talosintelligence.com/reports/TALOS-2016-0219/ -[3]:https://www.talosintelligence.com/reports/TALOS-2016-0220/ -[4]:https://www.talosintelligence.com/reports/TALOS-2016-0221/ -[5]:https://www.talosintelligence.com/ -[6]:https://tools.ietf.org/html/rfc4422 -[7]:http://blog.talosintelligence.com/2017/07/memcached-patch-failure.html -[8]:https://thenewstack.io/author/lucian/ diff --git a/translated/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md b/translated/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md new file mode 100644 index 0000000000..60f8cf1125 --- /dev/null +++ b/translated/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md @@ -0,0 +1,57 @@ +漏洞修复八个月后仍有超过 70,000 台 Memcached 服务器面临危险 +============================================================ + + + +![](https://cdn.thenewstack.io/media/2017/07/261d7153-business-841174_640.jpg) + +在开源缓存软件 memcached 修复了三个关键漏洞的八个月之后,仍有超过 70,000 台未打补丁的缓存服务器直接暴露在互联网上。安全研究员警告说,黑客可能会在服务器上执行恶意代码或从其缓存中窃取潜在的敏感数据。 + +[Memcached][1] 是一个实现了高性能缓存服务的软件包,用于存储从数据库和 ARM 中获取的数据块。这有助于提高动态 Web 应用程序的速度,使其更加适合大型网站和大数据项目。 + +虽然 memcached 不是数据库的替代品,但它存储在 RAM 中的数据包括来自数据库查询的用户会话和其他敏感信息。因此,服务器的设计不能直接暴露在互联网等不受信任的环境中,最新的版本已经支持了基本的身份验证。 + +去年 10 月份,memcached 的开发者修复了由 [思科 Talos 部门][5] 安全研究员发现并报告的三个远程代码执行漏洞([CVE-2016-8704][2],[CVE-2016-8705][3] 和 [CVE-2016-8706][4])。所有这些漏洞都影响到了 memcached 用于存储和检索数据的二进制协议,其中一个漏洞在 [Simple Authentication and Security Layer ][6](SASL) 中实现。 + +在去年 12 月到今年 1 月期间,成队的攻击者从数万个公开的数据库中擦除数据,包括 MongoDB,CouchDB,Hadoop 和 Elasticsearch 集群。在很多情况下,攻击者对希望恢复数据的服务器管理员进行勒索,然而没有任何证据表明他们的确对删除数据进行了复制。 + +Talos 的研究人员认为, memcached 服务器可能是下一个被攻击的目标,特别是在几个月前发现了漏洞之后。所以在二月份他们决定进行一系列的互联网扫描来确定潜在的攻击面。 + +扫描结果显示,大约有 108,000 个 memcached 服务器直接暴露在互联网上,其中只有 24,000 个服务器需要身份验证。如此多的服务器在没有身份验证的情况下可以公开访问已经足够糟糕,但是当他们对所提交的三个漏洞进行测试时,他们发现只有 200 台需要身份验证的服务器部署了 10 月的补丁。其他的所有服务器都可能通过 SASL 漏洞进行攻击。 + +总的来说,暴露于互联网上的 memcached 服务器有 85,000 个或大约 80% 都没有对 10 月份的三个关键漏洞进行安全修复。 + +由于补丁的采用率不佳,Talos 的研究人员决定对所有这些服务器的 IP 地址进行 whois 查询,并向其所有者发送电子邮件通知。 + +本月初,研究人员决定再次进行扫描。他们发现,虽然有 28,500 台服务器的 IP 地址与 2 月份时的地址不同,但仍然有 106,000 台 memcached 服务器暴露在因特网上。 + +在这 106,000 台服务器中,有 73,400 台或大约 70% 的服务器在 10 月份修复的三个漏洞的测试中仍然受到攻击。超过 18,000 个已识别的服务器需要身份验证,其中 99% 的服务器仍然存在 SASL 漏洞。 + +即便是发送了成千上万封电子邮件进行通知,补丁的采用率仅仅提高了 10%。 + +Talos 研究人员在周一的[博客][7]中表示:“这些漏洞的严重程度不能被低估。这些漏洞可能会影响到小型和大型企业在互联网上部署的平台,随着最近大量的蠕虫利用漏洞进行攻击,应该为全世界的服务器管理员敲响警钟。如果这些漏洞没有修复,就可能被利用,对组织和业务造成严重的影响。” + +这项工作的结论表明,许多网络应用程序的所有者在保护用户数据方面做得不好。首先,大量的 Memcached 服务器直接暴露在互联网上,其中大多数都没有使用身份验证。即使没有任何漏洞,这些服务器上缓存的数据也存在着安全风险。 + +其次,即使提供了关键漏洞的补丁,许多服务器管理员也不会及时地进行修复。 + +在这种情况下,看到 memcached 服务器像 MongoDB 数据库一样被大规模攻击也并不奇怪。 + +-------------------------------------------------------------------------------- + +via: https://thenewstack.io/70000-memcached-servers-can-hacked-using-eight-month-old-flaws/ + +作者:[Lucian Constantin ][a] +译者:[firmianay](https://github.com/firmianay) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://thenewstack.io/author/lucian/ +[1]:https://memcached.org/ +[2]:https://www.talosintelligence.com/reports/TALOS-2016-0219/ +[3]:https://www.talosintelligence.com/reports/TALOS-2016-0220/ +[4]:https://www.talosintelligence.com/reports/TALOS-2016-0221/ +[5]:https://www.talosintelligence.com/ +[6]:https://tools.ietf.org/html/rfc4422 +[7]:http://blog.talosintelligence.com/2017/07/memcached-patch-failure.html From 6af9f889eaa98a1959ed8333d9f4f5c64143ccf1 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 27 Jul 2017 23:05:51 +0800 Subject: [PATCH 0817/1407] PRF&PUB:20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md @Vic020 --- ... Linux Kernel 4.12 Stable on Linux Mint.md | 31 +++++++------------ 1 file changed, 12 insertions(+), 19 deletions(-) rename {translated/tech => published}/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md (55%) diff --git a/translated/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md b/published/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md similarity index 55% rename from translated/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md rename to published/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md index c7bcdb9285..91d2775933 100644 --- a/translated/tech/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md +++ b/published/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md @@ -1,13 +1,13 @@ -Linux Mint安装Linux Kernel 4.12(稳定版) +在 Linux Mint 安装 Linux Kernel 4.12(稳定版) ============================================================ ![Linux Mint安装Linux Kernel 4.12(稳定版)](https://mintguide.org/uploads/tux_system.jpg) -**Linus Torvalds** 推荐的 **[Linux][5] [内核][6] 4.12**. 从 **[这里][7]** 可以直接下载相关的 **deb** 包来安装. 或者, 继续阅读本文,按下面的步骤安装新kernel. +**Linus Torvalds** 发布了 **Linux 内核 4.12**。你可以从**[这里][7]**直接下载相关的 **deb** 包来安装。或者,继续阅读本文,按下面的步骤安装新内核。 - _**警告. [Linux][1] [内核][2] 是系统的关键组成. 在硬件设备不正常工作时,可以尝试执行升级,新的内核可能会解决此问题。 但同样的, 非必须地更新一个新的内核也会导致不必要的回滚, 例如, 无网络连接, 没有声音, 甚至是无法正常启动系统, 所以安装一个新的内核,请正确认识风险.**_ +**警告:Linux 内核 是系统的关键元素。在某个硬件设备不正常工作时,可以尝试执行升级,新的内核可能会解决此问题。 但同样的,非必须地更新一个新的内核也可能导致不必要的回滚,例如,无网络连接, 没有声音,甚至是无法正常启动系统,所以安装一个新的内核,请正确认识风险。** -最简单的安装任意内核方法 - 在**[Linux Mint][9]** 使用 [UKUU][8] 项目. +最简单的安装任意内核方法 - 在**Linux Mint** 使用 [UKUU][8]。 ``` TerminalShekin@mylinuxmintpc~$sudo apt-add-repository -y ppa:teejee2008/ppa @@ -15,34 +15,27 @@ sudo apt-get update sudo apt-get install ukuu ``` -**提醒 _所有[Nvidia][3]/AMD电脑用户, 在安装内核之前, 建议切换到可用的驱动._** +**提醒:所有的 Nvidia/AMD 电脑用户, 在安装内核之前,建议切换到 free 版本的驱动。** -**如果决定删除内核4.12,** +**如果决定删除内核 4.12,** -1.首先, 重启计算机,选择[GRUB][12]菜单中的旧内核启动.引导系统结束,通过以下命令删除新的内核 +1. 首先,重启计算机,选择 GRUB 菜单中的旧内核启动。系统引导完成之后,通过以下命令删除新的内核: +2. 然后,使用 [UKUU][13] 程序,或者命令:`sudo apt purge linux-image-4.12-*` +3. 最后,更新 **GRUB** 或者 **[BURG][10]**:`sudo update-grub` -2.然后, 使用 [UKUU][13] 项目,或者命令: -``` -TerminalShekin@mylinuxmintpc~$sudo apt purge linux-image-4.12-* -``` -3.最后, 更新 **GRUB**或者**[BURG][10]** -``` -TerminalShekin@mylinuxmintpc~$sudo update-grub -``` -为了回到之前的内核, 在启动**Grub**的时候,选择**以前的Linux版本** +在启动 **GRUB** 的时候,选择**以前的 Linux 版本**即可回到以前版本的内核。 Good Luck!!! -[kernel.org][14] -------------------------------------------------------------------------------- via: https://mintguide.org/system/798-install-linux-kernel-4-12-stable-on-linux-mint.html -作者:[Shekin ][a] +作者:[Shekin][a] 译者:[VicYu](https://vicyu.com) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From fbc869fce968ad71047d35c111231e1226bcd889 Mon Sep 17 00:00:00 2001 From: xu0o0 Date: Fri, 28 Jul 2017 05:00:43 +0800 Subject: [PATCH 0818/1407] translating by @haoqixu --- ...70718 Top 4 reasons I use dwm for my Linux window manager.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md b/sources/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md index c8f5831c6e..23dc182005 100644 --- a/sources/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md +++ b/sources/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md @@ -1,4 +1,4 @@ -Top 4 reasons I use dwm for my Linux window manager +【haoqixu 翻译中】Top 4 reasons I use dwm for my Linux window manager ============================================================ ### A window manager handles the sizing and arrangement of the windows you open, among other things. From fbd110796f94935c19ad01904e87c933424d27bc Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 28 Jul 2017 08:37:55 +0800 Subject: [PATCH 0819/1407] translated --- .../tech/20170725 Linux Weather Forecast.md | 61 ------------------- .../tech/20170725 Linux Weather Forecast.md | 59 ++++++++++++++++++ 2 files changed, 59 insertions(+), 61 deletions(-) delete mode 100644 sources/tech/20170725 Linux Weather Forecast.md create mode 100644 translated/tech/20170725 Linux Weather Forecast.md diff --git a/sources/tech/20170725 Linux Weather Forecast.md b/sources/tech/20170725 Linux Weather Forecast.md deleted file mode 100644 index 75a89be707..0000000000 --- a/sources/tech/20170725 Linux Weather Forecast.md +++ /dev/null @@ -1,61 +0,0 @@ -translating---geekpi - -Linux Weather Forecast -============================================================ - -### Welcome to the Linux Weather Forecast - -This page is an attempt to track ongoing developments in the Linux development community that have a good chance of appearing in a mainline kernel and/or major distributions sometime in the near future. Your "chief meteorologist" is Jonathan Corbet, Executive Editor at [LWN.net][8]. If you have suggestions on improving the forecast (and particularly if you have a project or patchset that you think should be tracked), please add your comments below.  - -### Forecast Summaries - -**Current conditions**: The 4.12 kernel was released on July 2\. It contains many new features, including: - -* The [BFQ and Kyber block I/O schedulers][2]. BFQ, which has been under development for years, promises better performance on interactive systems and has attracted interest in the mobile device area. Kyber, instead, is a much simpler scheduler intended for fast devices typically found in enterprise settings. - -* The epoll_wait() system call can now perform busy-polling of network sockets. - -* The live-patching mechanism has gained the [hybrid consistency model][3], which will allow more complex patches to be applied to running kernels. - -* The [trusted execution framework][4] should ease dealings between the kernel and code running in the ARM TrustZone secure world. - -4.12 was one of the busiest kernel development cycles ever, with nearly 15,000 changes merged. See [this article][9] for an overview of where those changes came from. - -**Short-term forecast**: The 4.13 kernel can be expected in early September 2017.  Some of the changes that will be found in this kernel are: - -* Better support for non-blocking direct block I/O operations. - -* The [structure-layout randomization mechanism][5] is the next step in the ongoing project of hardening the kernel against attack. - -* The kernel now has [native support for the TLS network protocol][6]. - -* Steps toward the [swapping of transparent huge pages][7] have been taken, leading eventually to better memory-management performance. - -* The handling of writeback errors in the block subsystem [has been improved][1], with the result that errors are far less likely to go unreported to the application writing the data. - -The 4.13 kernel is in the stabilization period now, so only fixes will be accepted during the remainder of this development cycle. - -This [work][10] is licensed under a [Creative Commons Attribution-ShareAlike 3.0 License][11]. - --------------------------------------------------------------------------------- - -via: https://www.linux.com/news/2017/7/linux-weather-forecast - -作者:[JONATHAN CORBET][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.linux.com/users/corbet -[1]:https://lwn.net/Articles/724307/ -[2]:https://lwn.net/Articles/720675/ -[3]:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d83a7cb375eec21f04c83542395d08b2f6641da2 -[4]:https://lwn.net/Articles/717125/ -[5]:https://lwn.net/Articles/722293/ -[6]:https://lwn.net/Articles/666509/ -[7]:https://lwn.net/Articles/717707/ -[8]:http://www.lwn.net/ -[9]:https://lwn.net/Articles/726950/ -[10]:http://purl.org/dc/elements/1.1/ -[11]:http://creativecommons.org/licenses/by-sa/3.0/ diff --git a/translated/tech/20170725 Linux Weather Forecast.md b/translated/tech/20170725 Linux Weather Forecast.md new file mode 100644 index 0000000000..ef00efcf5c --- /dev/null +++ b/translated/tech/20170725 Linux Weather Forecast.md @@ -0,0 +1,59 @@ +Linux 天气预报 +============================================================ + +### 欢迎来到 Linux 天气预报 + +本页面是为了跟踪在不久的将来某个时间内有可能出现在主线内核和/或主要发行版中的 Linux 开发社区的进展情况。你的“首席气象学家”是 [LWN.net][8] 执行编辑 Jonathan Corbet。如果你有改进预测的建议(特别是如果你有一个你认为应该跟踪的项目或修补程序),请在下面添加你的意见。 + +### 预测摘要 + +**当前情况**:内核 4.12 于 7 月 2 日发布。它包含了许多新功能,包括: + +* [BFQ和 Kyber 块 I/O 调度器][2]。已经开发多年的 BFQ 在交互式系统上表现更好,这引起了移动设备领域的兴趣。相反,Kyber 是一个更简单的调度程序,旨在用于通常在企业设置中的快速设备。 + +* epoll_wait() 系统调用现在可以执行网络套接字的繁忙轮询。 + +* 实时修补机制已经实现了[混合一致性模型][3],这将允许更复杂的补丁应用于运行内核。 + +* [可信执行框架][4]应该使得内核与在 ARM TrustZone 安全世界中运行的代码之间的交易更加容易。 + +4.12 是最繁忙的内核开发周期之一,合并了近 15,000 次更新。有关这些变化来源的概述,请参阅[本文][9]。 + +**短期预测**:4.13 内核预期在 2017 年 9 月初发布。这个内核中会出现的一些变化是: + +* 更好地支持非阻塞直接块 I/O 操作。 + +* [结构布局随机化机制][5]是正在进行的内核加固防攻击项目的下一步。 + +* 内核现在已经[原生支持 TLS 网络协议][6]。 + +* 采取[透明大页交换][7],这使得有更好的内存管理性能。 + +* 块子系统中回写错误的处理[已经改进][1],这使得错误不太可能不告诉程序而写入数据。 + +4.13 内核现在处于稳定时期,所以在这个开发周期的剩余时间内只有修复被接受。 + +这篇[文章][10]根据[知识共享署名 - 共享 3.0 许可证][11]获得许可。 + +-------------------------------------------------------------------------------- + +via: https://www.linux.com/news/2017/7/linux-weather-forecast + +作者:[JONATHAN CORBET][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.linux.com/users/corbet +[1]:https://lwn.net/Articles/724307/ +[2]:https://lwn.net/Articles/720675/ +[3]:https://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git/commit/?id=d83a7cb375eec21f04c83542395d08b2f6641da2 +[4]:https://lwn.net/Articles/717125/ +[5]:https://lwn.net/Articles/722293/ +[6]:https://lwn.net/Articles/666509/ +[7]:https://lwn.net/Articles/717707/ +[8]:http://www.lwn.net/ +[9]:https://lwn.net/Articles/726950/ +[10]:http://purl.org/dc/elements/1.1/ +[11]:http://creativecommons.org/licenses/by-sa/3.0/ From 6507264432ea78388f17610b05fe3a5cc0b64731 Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 28 Jul 2017 08:39:43 +0800 Subject: [PATCH 0820/1407] translating --- ...elopment made easy with Husarion CORE2-ROS running Ubuntu.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md b/sources/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md index 44828018fc..c8bb81947d 100644 --- a/sources/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md +++ b/sources/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md @@ -1,3 +1,5 @@ +translating---geekpi + Robot development made easy with Husarion CORE2-ROS running Ubuntu ============================================================ From bcb47436a0035d8ac5557e8f53685ae10bd5029c Mon Sep 17 00:00:00 2001 From: Wueiz Date: Fri, 28 Jul 2017 09:17:03 +0800 Subject: [PATCH 0821/1407] Update 20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 新手第一次试水,看到请关闭 --- .../20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md b/sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md index d3fba80ed1..75a1824111 100644 --- a/sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md +++ b/sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md @@ -1,3 +1,4 @@ +Translating by a972667237 NoSQL: How To Install OrientDB on Ubuntu 16.04 ============================================================ From 4db7c8e3e47088f4d974e70193b707bff14a7e0e Mon Sep 17 00:00:00 2001 From: Flowsnow Date: Fri, 28 Jul 2017 09:58:27 +0800 Subject: [PATCH 0822/1407] =?UTF-8?q?=E3=80=90=E7=94=B3=E8=AF=B7=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=E3=80=91THE=20BEST=20WAY=20TO=20LEARN=20DOCKER=20FOR?= =?UTF-8?q?=20FREE=20PLAY-WITH-DOCKER?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...17 THE BEST WAY TO LEARN DOCKER FOR FREE PLAY-WITH-DOCKER.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170717 THE BEST WAY TO LEARN DOCKER FOR FREE PLAY-WITH-DOCKER.md b/sources/tech/20170717 THE BEST WAY TO LEARN DOCKER FOR FREE PLAY-WITH-DOCKER.md index 0dca67a591..9da1e59ba2 100644 --- a/sources/tech/20170717 THE BEST WAY TO LEARN DOCKER FOR FREE PLAY-WITH-DOCKER.md +++ b/sources/tech/20170717 THE BEST WAY TO LEARN DOCKER FOR FREE PLAY-WITH-DOCKER.md @@ -1,3 +1,5 @@ +translating by flowsnow + THE BEST WAY TO LEARN DOCKER FOR FREE: PLAY-WITH-DOCKER (PWD) ============================================================ From 808d95355f2bafb5ecd9ffe46737f9748bb32241 Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 28 Jul 2017 12:12:47 +0800 Subject: [PATCH 0823/1407] PRF:20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @firmianay 谢谢你的初次翻译,干的不错! --- ...n Be Hacked Using Eight-Month-Old Flaws.md | 28 +++++++++---------- 1 file changed, 13 insertions(+), 15 deletions(-) diff --git a/translated/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md b/translated/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md index 60f8cf1125..a0d7fea53d 100644 --- a/translated/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md +++ b/translated/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md @@ -1,33 +1,31 @@ -漏洞修复八个月后仍有超过 70,000 台 Memcached 服务器面临危险 +漏洞修复八个月后,仍有超过七万台 memcached 服务器面临危险 ============================================================ - - ![](https://cdn.thenewstack.io/media/2017/07/261d7153-business-841174_640.jpg) -在开源缓存软件 memcached 修复了三个关键漏洞的八个月之后,仍有超过 70,000 台未打补丁的缓存服务器直接暴露在互联网上。安全研究员警告说,黑客可能会在服务器上执行恶意代码或从其缓存中窃取潜在的敏感数据。 +在开源缓存软件 memcached 修复了三个关键漏洞的八个月之后,仍有超过 70000 台未打补丁的缓存服务器直接暴露在互联网上。安全研究员警告说,黑客可能会在服务器上执行恶意代码或从其缓存中窃取潜在的敏感数据。 -[Memcached][1] 是一个实现了高性能缓存服务的软件包,用于存储从数据库和 ARM 中获取的数据块。这有助于提高动态 Web 应用程序的速度,使其更加适合大型网站和大数据项目。 +[memcached][1] 是一个实现了高性能缓存服务的软件包,用于在内存中存储从数据库和 API 调用中获取的数据块。这有助于提高动态 Web 应用程序的响应速度,使其更加适合大型网站和大数据项目。 -虽然 memcached 不是数据库的替代品,但它存储在 RAM 中的数据包括来自数据库查询的用户会话和其他敏感信息。因此,服务器的设计不能直接暴露在互联网等不受信任的环境中,最新的版本已经支持了基本的身份验证。 +虽然 memcached 不是数据库的替代品,但它存储在内存中的数据包括了来自数据库查询的用户会话和其他敏感信息。因此,该服务器在设计上并不能直接暴露在互联网等不受信任的环境中,其最新的版本已经支持了基本身份验证。 -去年 10 月份,memcached 的开发者修复了由 [思科 Talos 部门][5] 安全研究员发现并报告的三个远程代码执行漏洞([CVE-2016-8704][2],[CVE-2016-8705][3] 和 [CVE-2016-8706][4])。所有这些漏洞都影响到了 memcached 用于存储和检索数据的二进制协议,其中一个漏洞在 [Simple Authentication and Security Layer ][6](SASL) 中实现。 +去年 10 月份,memcached 的开发者修复了由 [思科 Talos 部门][5] 安全研究员发现并报告的三个远程代码执行漏洞([CVE-2016-8704][2]、[CVE-2016-8705][3] 和 [CVE-2016-8706][4])。所有这些漏洞都影响到了 memcached 用于存储和检索数据的二进制协议,其中一个漏洞出现在 [Simple Authentication and Security Layer ][6](SASL)的实现中。 -在去年 12 月到今年 1 月期间,成队的攻击者从数万个公开的数据库中擦除数据,包括 MongoDB,CouchDB,Hadoop 和 Elasticsearch 集群。在很多情况下,攻击者对希望恢复数据的服务器管理员进行勒索,然而没有任何证据表明他们的确对删除数据进行了复制。 +在去年 12 月到今年 1 月期间,成队的攻击者从数万个公开的数据库中擦除数据,这包括 MongoDB、CouchDB、Hadoop 和 Elasticsearch 集群。在很多情况下,攻击者勒索想要恢复数据的服务器管理员,然而没有任何证据表明他们的确对所删除的数据进行了复制。 Talos 的研究人员认为, memcached 服务器可能是下一个被攻击的目标,特别是在几个月前发现了漏洞之后。所以在二月份他们决定进行一系列的互联网扫描来确定潜在的攻击面。 -扫描结果显示,大约有 108,000 个 memcached 服务器直接暴露在互联网上,其中只有 24,000 个服务器需要身份验证。如此多的服务器在没有身份验证的情况下可以公开访问已经足够糟糕,但是当他们对所提交的三个漏洞进行测试时,他们发现只有 200 台需要身份验证的服务器部署了 10 月的补丁。其他的所有服务器都可能通过 SASL 漏洞进行攻击。 +扫描结果显示,大约有 108000 个 memcached 服务器直接暴露在互联网上,其中只有 24000 个服务器需要身份验证。如此多的服务器在没有身份验证的情况下可以公开访问已经足够糟糕,但是当他们对所提交的三个漏洞进行测试时,他们发现只有 200 台需要身份验证的服务器部署了 10 月的补丁,其它的所有服务器都可能通过 SASL 漏洞进行攻击。 -总的来说,暴露于互联网上的 memcached 服务器有 85,000 个或大约 80% 都没有对 10 月份的三个关键漏洞进行安全修复。 +总的来说,暴露于互联网上的 memcached 服务器有大约 80%,即 85000 个都没有对 10 月份的三个关键漏洞进行安全修复。 由于补丁的采用率不佳,Talos 的研究人员决定对所有这些服务器的 IP 地址进行 whois 查询,并向其所有者发送电子邮件通知。 -本月初,研究人员决定再次进行扫描。他们发现,虽然有 28,500 台服务器的 IP 地址与 2 月份时的地址不同,但仍然有 106,000 台 memcached 服务器暴露在因特网上。 +本月初,研究人员决定再次进行扫描。他们发现,虽然有 28500 台服务器的 IP 地址与 2 月份时的地址不同,但仍然有 106000 台 memcached 服务器暴露在因特网上。 -在这 106,000 台服务器中,有 73,400 台或大约 70% 的服务器在 10 月份修复的三个漏洞的测试中仍然受到攻击。超过 18,000 个已识别的服务器需要身份验证,其中 99% 的服务器仍然存在 SASL 漏洞。 +在这 106000 台服务器中,有大约 70%,即 73400 台服务器在 10 月份修复的三个漏洞的测试中仍然受到攻击。超过 18000 个已识别的服务器需要身份验证,其中 99% 的服务器仍然存在 SASL 漏洞。 -即便是发送了成千上万封电子邮件进行通知,补丁的采用率仅仅提高了 10%。 +即便是发送了成千上万封电子邮件进行通知,补丁的采用率也仅仅提高了 10%。 Talos 研究人员在周一的[博客][7]中表示:“这些漏洞的严重程度不能被低估。这些漏洞可能会影响到小型和大型企业在互联网上部署的平台,随着最近大量的蠕虫利用漏洞进行攻击,应该为全世界的服务器管理员敲响警钟。如果这些漏洞没有修复,就可能被利用,对组织和业务造成严重的影响。” @@ -41,9 +39,9 @@ Talos 研究人员在周一的[博客][7]中表示:“这些漏洞的严重程 via: https://thenewstack.io/70000-memcached-servers-can-hacked-using-eight-month-old-flaws/ -作者:[Lucian Constantin ][a] +作者:[Lucian Constantin][a] 译者:[firmianay](https://github.com/firmianay) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 862f2de59d9a08bcba2930f7fa6285296e9347ea Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 28 Jul 2017 12:13:18 +0800 Subject: [PATCH 0824/1407] PUB:20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md @firmianay https://linux.cn/article-8731-1.html --- ...Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md (100%) diff --git a/translated/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md b/published/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md similarity index 100% rename from translated/tech/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md rename to published/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md From 6ffc2a3673d9694b93671a0a04c3b334a7fcdb55 Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 28 Jul 2017 12:38:21 +0800 Subject: [PATCH 0825/1407] PRF&PUB:20170725 Linux Weather Forecast.md @geekpi --- .../20170725 Linux Weather Forecast.md | 35 ++++++++----------- 1 file changed, 14 insertions(+), 21 deletions(-) rename {translated/tech => published}/20170725 Linux Weather Forecast.md (54%) diff --git a/translated/tech/20170725 Linux Weather Forecast.md b/published/20170725 Linux Weather Forecast.md similarity index 54% rename from translated/tech/20170725 Linux Weather Forecast.md rename to published/20170725 Linux Weather Forecast.md index ef00efcf5c..57e9489b18 100644 --- a/translated/tech/20170725 Linux Weather Forecast.md +++ b/published/20170725 Linux Weather Forecast.md @@ -1,37 +1,30 @@ -Linux 天气预报 +Linux “天气预报” ============================================================ ### 欢迎来到 Linux 天气预报 -本页面是为了跟踪在不久的将来某个时间内有可能出现在主线内核和/或主要发行版中的 Linux 开发社区的进展情况。你的“首席气象学家”是 [LWN.net][8] 执行编辑 Jonathan Corbet。如果你有改进预测的建议(特别是如果你有一个你认为应该跟踪的项目或修补程序),请在下面添加你的意见。 +本页面是为了跟踪在不久的将来某个时间内有可能出现在主线内核和/或主要发行版中的 Linux 开发社区的进展情况。你的“首席气象学家”是 [LWN.net][8] 执行主编 Jonathan Corbet。如果你有改进预测的建议(特别是如果你有一个你认为应该跟踪的项目或修补程序的情况下),请在下面补充你的意见。 ### 预测摘要 **当前情况**:内核 4.12 于 7 月 2 日发布。它包含了许多新功能,包括: -* [BFQ和 Kyber 块 I/O 调度器][2]。已经开发多年的 BFQ 在交互式系统上表现更好,这引起了移动设备领域的兴趣。相反,Kyber 是一个更简单的调度程序,旨在用于通常在企业设置中的快速设备。 +* [BFQ 和 Kyber 块 I/O 调度器][2]。已经开发多年的 BFQ 在交互式系统上表现更好,这引起了移动设备领域的兴趣。相反,Kyber 是一个更简单的调度程序,旨在用于通常出现在企业配置中的快速设备。 +* epoll_wait() 系统调用现在可以执行网络套接字的繁忙轮询。 +* 实时修补机制已经实现了[混合一致性模型][3],这将可以把更复杂的补丁应用于运行中的内核。 +* [可信执行框架][4]应该使得内核与在 ARM TrustZone 安全世界中运行的代码之间的交互更加容易。 -* epoll_wait() 系统调用现在可以执行网络套接字的繁忙轮询。 - -* 实时修补机制已经实现了[混合一致性模型][3],这将允许更复杂的补丁应用于运行内核。 - -* [可信执行框架][4]应该使得内核与在 ARM TrustZone 安全世界中运行的代码之间的交易更加容易。 - -4.12 是最繁忙的内核开发周期之一,合并了近 15,000 次更新。有关这些变化来源的概述,请参阅[本文][9]。 +4.12 是最繁忙的内核开发周期之一,合并了近 15000 次更新。有关这些变化来源的概述,请参阅[这里][9]。 **短期预测**:4.13 内核预期在 2017 年 9 月初发布。这个内核中会出现的一些变化是: -* 更好地支持非阻塞直接块 I/O 操作。 +* 更好地支持非阻塞直接块 I/O 操作。 +* [结构布局随机化机制][5]是正在进行的内核加固防攻击项目的下一步。 +* 内核现在已经[原生支持 TLS 网络协议][6]。 +* 采取[透明大页交换][7],这使得有更好的内存管理性能。 +* 块子系统中回写错误的处理[已经改进][1],这使得错误不太可能不告知程序而写入数据。 -* [结构布局随机化机制][5]是正在进行的内核加固防攻击项目的下一步。 - -* 内核现在已经[原生支持 TLS 网络协议][6]。 - -* 采取[透明大页交换][7],这使得有更好的内存管理性能。 - -* 块子系统中回写错误的处理[已经改进][1],这使得错误不太可能不告诉程序而写入数据。 - -4.13 内核现在处于稳定时期,所以在这个开发周期的剩余时间内只有修复被接受。 +4.13 内核现在处于稳定时期,所以在这个开发周期的剩余时间内只会接受修复补丁。 这篇[文章][10]根据[知识共享署名 - 共享 3.0 许可证][11]获得许可。 @@ -41,7 +34,7 @@ via: https://www.linux.com/news/2017/7/linux-weather-forecast 作者:[JONATHAN CORBET][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/) 荣誉推出 From ec4a8ffe5e1bc8dd7f31e5971115248662421d75 Mon Sep 17 00:00:00 2001 From: sugarfillet <1911093465@qq.com> Date: Fri, 28 Jul 2017 16:30:38 +0800 Subject: [PATCH 0826/1407] sugarfillet translating --- sources/tech/20170717 Why you should be a sysadmin.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170717 Why you should be a sysadmin.md b/sources/tech/20170717 Why you should be a sysadmin.md index 81f410ae9e..93150cf7f3 100644 --- a/sources/tech/20170717 Why you should be a sysadmin.md +++ b/sources/tech/20170717 Why you should be a sysadmin.md @@ -1,3 +1,4 @@ +sugarfillet translating Why you should be a sysadmin ============================================================ From b52b9791c684e2d8cf1ab2163716b86b37902150 Mon Sep 17 00:00:00 2001 From: lhr Date: Fri, 28 Jul 2017 18:12:45 +0800 Subject: [PATCH 0827/1407] translating half ,save lhr --- ...ersial Open Container Industry Standard.md | 98 ++++++++++++++++++- 1 file changed, 97 insertions(+), 1 deletion(-) diff --git a/sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md b/sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md index 894a129107..6be5b2ca3d 100644 --- a/sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md +++ b/sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md @@ -1,4 +1,3 @@ -translating---LHRchina CoreOS, OCI Unveil Controversial Open Container Industry Standard ============================================================ ![coreos-oci-open-container-industry-standard](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2017-core-os-1.jpg) @@ -129,3 +128,100 @@ via: http://www.linuxinsider.com/story/84689.html [11]:https://www.thoughtworks.com/ [12]:http://www.linuxinsider.com/story/84689.html?rss=1 [13]:http://www.linuxinsider.com/story/84689.html?rss=1 + + +CoreOs , OCI(Open Container Initiative) 标准解开容器工业标准论战 +[**在并购交易中保护你的智力资产完整**][12][][13]。Flexera 软件公司 提供卓越的技术尽职调查审计过程的实践和方案 +[CoreOS][4] 和 [OCI标准][5] 本周三引入的镜像和运行时标准最大限度的参照了Docker的镜像规范技术 +然而,OCI模仿docker的de facto 平台的决定引发了一些问题。一些批评者提出来用另外的解决方案 +CoreOs的CTO及OCI技术管理委员会主席Brandon Philips说 1.0版本 提供了应用容器的稳定标准,产业领导者所创造的标准激发了OCI标准参与者创造出更深层的标准和创新。 +他说,OCI完成1.0版本意味着 OCI运行时规范和OCI镜像格式标准现在已经可以广泛使用。 +进一步说明,现在取得的成就将推动OCI社区稳固一个成长中的互操作插接式工具集市场 +产业支持的标准将提供一种信心:容器将被留存并且Kubernetes(Kubernetes是Google开源的Docker容器集群管理系统)用户将获得更进一步的支持 +Philips告诉LinuxInsider:结果是相当不错的,证明过程已经开始. +### 合作和挑战 +开放标准是容器生态系统取得成功的关键 最好的实现标准的方式是与社区协作。然而,在1.0版本上达成共识所花费的时间超越了我们的的想象。 +"早期,最大的挑战在于接受项目的发布模式及如何实施该项目",他追述道,”每个人都低估了项目所要花费的时间。“ + +合作者面对着和他们想做的不一致的预期,他说,但是在最近的一年前后,小组达到了他们的期望并且经历了更多的实验 + +### 追逐标准 + +CoreOS 官方在几年前就开始讨论这个想法:工业支持的开源容器镜像和运行时规范标准 +早期的探索使我们认识到:标准镜像格式的一致是决定性的。Phillips说 + +CoreOS和容器技术创造者[Docker][6] 在2015年6月宣布OCI的开始。合作起始于 21个工业领导者制定开源容器计划(OCP)作为一个旨在最低限度的云存储通用软件容器标准的非营利组织 + +联合包括容器业界的领导者:Docker、微软、红帽、IBM、谷歌和linux基金会 + +OCI标准的目的是给予应用开发者高度的信心:新的标准或者新的开发工具出现,部署在容器上的软件仍然能够持续运转。这种信心必须同时满足所有私有和开源软件 + +工具和应用是私有还是开源的并没有什么关系。当标准开始应用,产品会被设计成与任何容器配置相融合,Philips说。 + +你需要刻意的超出人们写代码的功夫地努力去创造一个标准。它是一个额外的功夫。他补充道 + +作为合作的一部分,Docker向OCP(开源容器计划)贡献出它的de facto 镜像格式标准技术。 + +它包括公司的容器格式、运行时代码和标准。建立开源容器首创镜像标准的工作起始于去年 + +标准的里程碑给予容器使用者开发、打包、签名应用容器的能力。他们也能够在各种容器引擎上运行容器,Philips强调 + +### 唯一的选择? + +[Pund-IT][7]的首席分析师Charles King注意到:合作面临着两种实现标准的方式。第一种选择是汇集相同意向的人员来避免分歧从零开始建立标准,但是合作者似乎不得不接受第二种方案:采用一种强大的以市场为导向的平台作为一个有效的标准。 + +Docker对[Linux Foundation][8](linux基金会)的贡献使OCI坚定的选择了第二种方案。但是那些关注于Docker的实现途径或者它的市场地位的人也许感觉应该有更好的选择。King对LinuxInsider讲述 + +事实上,一个OCI成员--CoreOs --在开始的时候对该组织的总体方向进行了一些强烈的批评。拭目以待V1.0版本是否处理了那些关注点将是很有趣的事情 + + +### 更快的路径 + +Docker已经被广泛的部署运行时实现是一个合适的基础。据[Cloud Technology Partners][9] 的高级副总裁David Linthicum所说,Docker已经是一个de facto 标准 + +“我们很快就能实现这些很重要。但是前后的标准会议、处理政治因素等事情却是如此的浪费时间” 。他对LinuxInsider采访者说 + +但是现在没有跟好的选择,他告诉LinuxInsider采访者 + +据RedHat公司的高级linux容器技术布道者Joe Brockmeier所说,Docker的运行时是 runC 。 它是一种OCI标准标准的实现 + +因此,runC 是一个合适的运行时标准的基础。它被广泛的接受并成为了大多数容器技术实现的基础 + +OCI是比Docker更进一步的标准。尽管Docker确实提交了OCI规范的基础的底层代码,然而这一谱系就此停止,并没真正的可行替代方案存在。 + +### 对接问题 + +Pund-IT的领导建议:采用一种广泛使用的产业标准将简化和加速许多公司对容器技术的采纳和管理。也有可能一些关键的供应商将继续关注他们自己的专有容器技术 + +Docker的商业利益将如何影响其参与OCI的规模还有待观察 + +### 反对的观点 + +开放标准并不是在云部署中采用更多的容器的最终目标。[ThoughtWorks][11]的首席顾问Nic Cheneweth 主张。更好的的方法是查看IT行业的服务器虚拟化部分的影响 + + + + + + + + + + + + + + + + + + + + + + + + + + + From 3e39cdaa4671806433466db11be8e8221ed4ee2b Mon Sep 17 00:00:00 2001 From: firmianay Date: Fri, 28 Jul 2017 22:42:44 +0800 Subject: [PATCH 0828/1407] firmianay translating --- ...628 Network Analysis How To Install Bro On Ubuntu 16.04.md | 4 +++- 1 file changed, 3 insertions(+), 1 deletion(-) diff --git a/sources/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md b/sources/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md index fa4e8bc272..531bcd100b 100644 --- a/sources/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md +++ b/sources/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md @@ -1,8 +1,10 @@ +translating by firmianay + Network Analysis: How To Install Bro On Ubuntu 16.04 ============================================================ - [![Bro Network Analysis Logo](https://www.unixmen.com/wp-content/uploads/2017/07/brologo-696x696.jpg "brologo")][4] + [![Bro Network Analysis Logo](https://www.unixmen.com/wp-content/uploads/2017/07/brologo-696x696.jpg "brologo")][4] ### Introduction: Bro Network Analysis Framework From 11b9435d0cbf44d5a58ebff9bff27bface2a3019 Mon Sep 17 00:00:00 2001 From: firmianay Date: Fri, 28 Jul 2017 23:50:40 +0800 Subject: [PATCH 0829/1407] translated --- ...ysis How To Install Bro On Ubuntu 16.04.md | 122 +++++++++--------- 1 file changed, 60 insertions(+), 62 deletions(-) diff --git a/sources/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md b/sources/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md index 531bcd100b..13cb4ba6d9 100644 --- a/sources/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md +++ b/sources/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md @@ -1,48 +1,46 @@ -translating by firmianay - -Network Analysis: How To Install Bro On Ubuntu 16.04 +网络分析利器:在 Ubuntu 16.04 上安装 Bro ============================================================ [![Bro Network Analysis Logo](https://www.unixmen.com/wp-content/uploads/2017/07/brologo-696x696.jpg "brologo")][4] -### Introduction: Bro Network Analysis Framework +### 简介:Bro 网络分析框架 -Bro is an open source network analysis framework with a focus on network security monitoring. It is the result of 15 years of research, widely used by major universities, research labs, supercomputing centers and many open-science communities. It is developed mainly at the International Computer Science Institute, in Berkeley, and the National Center for Supercomputing Applications, in Urbana-Champaign. +Bro是一个开源网络分析框架,侧重于网络安全监控。这是一项长达 15 年的研究成果,被各大学、研究实验室、超级计算机中心和许多开放科学界广泛使用。它主要由伯克利国际计算机科学研究所和 Urbana-Champaign 国家超级计算机应用中心开发。 -Bro has various features, including the following: +Bro 的功能包括: -* Bro’s scripting language enables site-specific monitoring policies +* Bro 的脚本语言支持特定站点的监控策略 -* Targeting of high-performance networks +* 针对高性能网络 -* Analyzers for many protocols, enabling high-level semantic analysis at the application level +* 分析器支持许多协议,可以在应用层面实现高级语义分析 -* It keeps extensive application-layer stats about the network it monitors. +* 它保留了关于其监视的网络的广泛应用层统计信息 -* Bro interfaces with other applications for real-time exchange of information +* Bro 能够与其他应用程序接口实时地交换信息 -* It comprehensively logs everything and provides a high-level archive of a network’s activity. +* 它的日志全面地记录一切信息,并提供网络活动的高级存档 -This tutorial explains how to build from source and install Bro on an Ubuntu 16.04 Server. +本教程将介绍如何从源代码构建,并在 Ubuntu 16.04 服务器上安装 Bro。 -### Prerequisites +### 准备工作 -Bro has many dependencies: +Bro 有许多依赖文件: * Libpcap ([http://www.tcpdump.org][2]) -* OpenSSL libraries ([http://www.openssl.org][3]) +* OpenSSL 库 ([http://www.openssl.org][3]) -* BIND8 library +* BIND8 库 * Libz -* Bash (required for BroControl) +* Bash (BroControl 所需要) -* Python 2.6+ (required for BroControl) +* Python 2.6+ (BroControl 所需要) -Building from source requires also: +从源代码构建还需要: * CMake 2.8+ @@ -62,48 +60,48 @@ Building from source requires also: * zlib headers -### Getting Started +### 入门 -First of all, install all the required dependencies, by executing the following command: +首先,通过执行以下命令来安装所有必需的依赖项: ``` # apt-get install cmake make gcc g++ flex bison libpcap-dev libssl-dev python-dev swig zlib1g-dev ``` -#### Install GeoIP Database for IP Geolocation +#### 安装定位 IP 地理位置的GeoIP数据库 -Bro depends on GeoIP for address geolocation. Install both the IPv4 and IPv6 versions: +Bro 使用 GeoIP 的定位地理位置。安装 IPv4 和 IPv6 版本: ``` $ wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCity.dat.gz $wget http://geolite.maxmind.com/download/geoip/database/GeoLiteCityv6-beta/GeoLiteCityv6.dat.gz ``` -Decompress both archives: +解压这两个压缩包: ``` $ gzip -d GeoLiteCity.dat.gz $ gzip -d GeoLiteCityv6.dat.gz ``` -Move the decompressed files to `/usr/share/GeoIP` directory: +将解压后的文件移动到 `/usr/share/GeoIP` 目录下: ``` # mvGeoLiteCity.dat /usr/share/GeoIP/GeoIPCity.dat # mv GeoLiteCityv6.dat /usr/share/GeoIP/GeoIPCityv6.dat ``` -Now, it’s possible to build Bro from source. +现在,可以从源代码构建 Bro 了。 -### Build Bro +### 构建 Bro -The latest Bro development version can be obtained through `git` repositories. Execute the following command: +最新的 Bro 开发版本可以通过 `git` 仓库获得。执行以下命令: ``` $ git clone --recursive git://git.bro.org/bro ``` -Go to the cloned directory and simply build Bro with the following commands: +转到克隆下来的目录,然后使用以下命令就可以简单地构建 Bro: ``` $ cd bro @@ -111,56 +109,56 @@ $ ./configure $ make ``` -The make command will require some time to build everything. The exact amount of time, of course, depends on the server performances. +make 命令需要一些时间来构建一切。确切的时间取决于服务器的性能。 -The `configure` script can be executed with some argument to specify what dependencies you want build to, in particular the `--with-*` options. +可以使用一些参数来执行 `configure` 脚本,以指定要构建的依赖关系,特别是 `--with-*` 选项。 -### Install Bro +### 安装 Bro -Inside the cloned `bro` directory, execute: +在克隆的 `bro` 目录中执行: ``` # make install ``` -The default installation path is `/usr/local/bro`. +默认安装路径为 `/usr/local/bro`。 -### Configure Bro +### 配置 Bro -Bro configuration files are located in the `/usr/local/bro/etc` directory. There are three files: +Bro 的配置文件位于 `/usr/local/bro/etc` 目录下。 这里有三个文件: -* `node.cfg`, used to configure which node (or nodes) to monitor. +* `node.cfg`,用于配置要监视的单个节点(或多个节点)。 -* `broctl.cfg`, the BroControl configuration file. +* `broctl.cfg`,BroControl 的配置文件。 -* `networks.cgf`, containing a list of networks in CIDR notation. +* `networks.cgf`,包含一个使用 CIDR 标记法表示的网络列表。 -#### Configure Mail Settings +#### 配置邮件设置 -Open the `broctl.cfg` configuration file: +打开 `broctl.cfg` 配置文件: ``` # $EDITOR /usr/local/bro/etc/broctl.cfg ``` -Look for the **Mail Options** section, and edit the `MailTo` line as follow: +查看 **Mail Options** 选项,并编辑 `MailTo` 行如下: ``` # Recipient address for emails sent out by Bro and BroControl MailTo = admin@example.com ``` -Save and close. There are many other options, but in most cases the defaults are good enough. +保存并关闭。还有许多其他选项,但在大多数情况下,默认值就足够好了。 -#### Choose Nodes To Monitor +#### 选择要监视的节点 -Out of the box, Bro is configured to operate in the standalone mode. In this tutorial we are doing a standalone installation, so it’s not necessary to change very much. However, look at the `node.cfg` configuration file: +开箱即用,Bro 被配置为以独立模式运行。在本教程中,我们就是做一个独立的安装,所以没有必要改变。但是,也请查看 `node.cfg` 配置文件: ``` # $EDITOR /usr/local/bro/etc/node.cfg ``` -In the `[bro]` section, you should see something like this: +在 `[bro]` 部分,你应该看到这样的东西: ``` [bro] @@ -169,19 +167,19 @@ host=localhost interface=eth0 ``` -Make sure that the interface matches the public interface of the Ubuntu 16.04 server. +请确保接口与 Ubuntu 16.04 服务器的公共接口相匹配。 -Save and exit. +保存并退出。 -### Configure Node’s Networks +### 配置监视节点的网络 -The last file to edit is `network.cfg`. Open it with a text editor: +最后一个要编辑的文件是 `network.cfg`。使用文本编辑器打开它: ``` # $EDITOR /usr/local/bro/etc/networks.cfg ``` -By default, you should see the following content: +默认情况下,你应该看到以下内容: ``` # List of local networks in CIDR notation, optionally followed by a @@ -193,48 +191,48 @@ By default, you should see the following content: 192.168.0.0/16 Private IP space ``` -Delete the three entries (which are just example for how to use this file), and enter the public and private IP space of your server, in the format: +删除这三个条目(这只是如何使用此文件的示例),并输入服务器的公用和专用 IP 空间,格式如下: ``` X.X.X.X/X Public IP space X.X.X.X/X Private IP space ``` -Save and exit. +保存并退出。 -### Manage Bro Installation with BroControl +### 使用 BroControl 管理 Bro 的安装 -Managing Bro requires using BroControl, which comes in form of an interactive shell and a command line tool. Start the shell with: +管理 Bro 需要使用 BroControl,它以交互式 shell 和命令行工具的形式出现。启动 shell: ``` # /usr/local/bro/bin/broctl ``` -To use as a command line tool, just pass an argument to the previous command, for example: +要想使用命令行工具,只需将参数传递给上一个命令,例如: ``` # /usr/local/bro/bin/broctl status ``` -This will check Bro’s status, by showing output like: +这将通过显示以下的输出来检查 Bro 的状态: ``` Name Type Host Status Pid Started bro standalone localhost running 6807 20 Jul 12:30:50 ``` -### Conclusion +### 结论 -This concludes the Bro’s installation tutorial. We used the source based installation because it is the most efficient way to obtain the latest version available, however this network analysis framework can also be downloaded in pre-built binary format. +这是一篇 Bro 的安装教程。我们使用基于源代码的安装,因为它是获得可用的最新版本的最有效的方法,但是该网络分析框架也可以下载预构建的二进制格式文件。 -See you next time! +下次见! -------------------------------------------------------------------------------- via: https://www.unixmen.com/how-to-install-bro-ubuntu-1604/ 作者:[ Giuseppe Molica][a] -译者:[译者ID](https://github.com/译者ID) +译者:[firmianay](https://github.com/firmianay) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From f0d6ec591bf2a5c3fe11bdc50c9f46961f7d1a6a Mon Sep 17 00:00:00 2001 From: firmianay Date: Fri, 28 Jul 2017 23:52:42 +0800 Subject: [PATCH 0830/1407] translated --- ...0170628 Network Analysis How To Install Bro On Ubuntu 16.04.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {sources => translated}/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md (100%) diff --git a/sources/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md b/translated/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md similarity index 100% rename from sources/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md rename to translated/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md From b94c003acc56d25373f22f7294f13049e7aad699 Mon Sep 17 00:00:00 2001 From: firmianay Date: Sat, 29 Jul 2017 09:14:01 +0800 Subject: [PATCH 0831/1407] translating by firmianay --- ...ng Kdump for examining Linux Kernel crashes.md | 15 ++++++++------- 1 file changed, 8 insertions(+), 7 deletions(-) diff --git a/sources/tech/20170621 Using Kdump for examining Linux Kernel crashes.md b/sources/tech/20170621 Using Kdump for examining Linux Kernel crashes.md index d22db18362..74e8e5f0a8 100644 --- a/sources/tech/20170621 Using Kdump for examining Linux Kernel crashes.md +++ b/sources/tech/20170621 Using Kdump for examining Linux Kernel crashes.md @@ -1,16 +1,17 @@ -Using Kdump for examining Linux Kernel crashes +translating by firmianay + +使用 Kdump 检查 Linux 内核崩溃 ============================================================ -### Let's examine the basics of kdump usage and look at the internals of kdump/kexec kernel implementation. +### 我们先看一下 kdump 使用的基础知识,看看 kdump/kexec 内核实现的内部结构。 ![Using Kdump for examining Linux Kernel crashes](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/linux_boot.png?itok=pSGmf8Ca "Using Kdump for examining Linux Kernel crashes") -Image by :  -[Penguin][13], [Boot][14]. Modified by Opensource.com. [CC BY-SA 4.0][15]. +Image by : [Penguin][13], [Boot][14]. Modified by Opensource.com. [CC BY-SA 4.0][15]. -[Kdump][16] is a way to acquire a crashed Linux kernel dump, but finding documents that explain its usage and internals can be challenging. In this article, I'll examine the basics of kdump usage and look at the internals of kdump/kexec kernel implementation. +[Kdump][16] 是获取崩溃的 Linux 内核转储的一种方法,但是想找到解释其使用和内部结构的文档可能有点困难。在本文中,我将研究 kdump 使用的基础知识,并查看 kdump/kexec 内核实现的内部结构。 -[Kexec][17] is a Linux kernel-to-kernel boot loader that helps to boot the second kernel from the context of first kernel. Kexec shuts down the first kernel, bypasses the BIOS or firmware stage, and jumps to second kernel. Thus, reboots become faster in absence of the BIOS stage. +[Kexec][17] 是一个 Linux 内核到内核的引导加载程序,可以帮助从第一个内核的上下文引导到第二个内核。Kexec 关闭第一个内核,绕过 BIOS 或固件阶段,并跳转到第二个内核。因此,在没有 BIOS 阶段的情况下,重新启动变得更快。 Kdump can be used with the kexec application—for example, when the second kernel is booted when the first kernel panics, the second kernel is used to copy the memory dump of first kernel, which can be analyzed with tools such as gdb and crash to determine the panic reasons. (In this article, I'll use the terms  _first kernel_  for the currently running kernel,  _second kernel_  for the kernel run using kexec, and  _capture kernel_  for kernel run when current kernel panics.) @@ -60,7 +61,7 @@ A typical command to load a capture kernel: **echo c > /pros/sysrq-trigger** can be used to crash the kernel for test purposes. See **man kexec** for detail about options provided by kexec-tools. Before moving to the next section, which focuses on internal implementation, watch this kexec_dump demo: - ** 此处有iframe,请手动处理 ** + ** 此处有iframe,请手动处理 ** ### Kdump: End-to-end flow From 58b9de1b08154c95cb2eaa8063ec36ebecd3054e Mon Sep 17 00:00:00 2001 From: firmianay Date: Sat, 29 Jul 2017 13:39:10 +0800 Subject: [PATCH 0832/1407] translated --- ...dump for examining Linux Kernel crashes.md | 183 +++++++++--------- 1 file changed, 90 insertions(+), 93 deletions(-) diff --git a/sources/tech/20170621 Using Kdump for examining Linux Kernel crashes.md b/sources/tech/20170621 Using Kdump for examining Linux Kernel crashes.md index 74e8e5f0a8..3ad176e65f 100644 --- a/sources/tech/20170621 Using Kdump for examining Linux Kernel crashes.md +++ b/sources/tech/20170621 Using Kdump for examining Linux Kernel crashes.md @@ -1,9 +1,7 @@ -translating by firmianay - 使用 Kdump 检查 Linux 内核崩溃 ============================================================ -### 我们先看一下 kdump 使用的基础知识,看看 kdump/kexec 内核实现的内部结构。 +### 我们先看一下 kdump 使用的基础知识,和 kdump/kexec 内核实现的内部结构。 ![Using Kdump for examining Linux Kernel crashes](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/linux_boot.png?itok=pSGmf8Ca "Using Kdump for examining Linux Kernel crashes") @@ -13,9 +11,9 @@ Image by : [Penguin][13], [Boot][14]. Modified by Opensource.com. [CC BY-SA 4 [Kexec][17] 是一个 Linux 内核到内核的引导加载程序,可以帮助从第一个内核的上下文引导到第二个内核。Kexec 关闭第一个内核,绕过 BIOS 或固件阶段,并跳转到第二个内核。因此,在没有 BIOS 阶段的情况下,重新启动变得更快。 -Kdump can be used with the kexec application—for example, when the second kernel is booted when the first kernel panics, the second kernel is used to copy the memory dump of first kernel, which can be analyzed with tools such as gdb and crash to determine the panic reasons. (In this article, I'll use the terms  _first kernel_  for the currently running kernel,  _second kernel_  for the kernel run using kexec, and  _capture kernel_  for kernel run when current kernel panics.) +Kdump 可以与 kexec 应用程序一起使用 - 例如,当第一个内核崩溃时第二个内核启动,第二个内核用于复制第一个内核的内存转储,可以使用 gdb 和 crash 等工具分析崩溃的原因。(在本文中,我将使用术语 _first kernel_ 作为当前运行的内核,_second kernel_ 作为使用 kexec 运行的内核,_capture kernel_ 表示在当前内核崩溃时运行内核。) -More Linux resources +更多 Linux 资料: * [What is Linux?][1] @@ -27,81 +25,81 @@ More Linux resources * [Our latest Linux articles][5] -The kexec mechanism has components in the kernel as well as in user space. The kernel provides few system calls for kexec reboot functionality. A user space tool called kexec-tools uses those calls and provides an executable to load and boot the second kernel. Sometimes a distribution also adds wrappers on top of kexec-tools, which helps capture and save the dump for various dump target configurations. In this article, I will use the name  _distro-kexec-tools_  to avoid confusion between upstream kexec-tools and distro-specific kexec-tools code. My example will use the Fedora Linux distribution. +kexec 机制在内核以及用户空间中都有组件。内核提供了几个用于 kexec 重启功能的系统调用。名为 kexec-tools 的用户空间工具使用这些调用,并提供可执行文件来加载和引导第二个内核。有的发行版还会在 kexec-tools 上添加包装器,这有助于捕获并保存各种转储目标配置的转储。在本文中,我将使用名为 distro-kexec-tools 的工具来避免上游 kexec 工具和特定于发行版的 kexec-tools 代码之间的混淆。我的例子将使用 Fedora Linux 发行版。 -### Fedora kexec-tools +### Fedora kexec-tools 工具 -**dnf install kexec-tools** installs fedora-kexec-tools on Fedora machines. The kdump service can be started by executing **systemctl start kdump** after installation of fedora-kexec-tools. When this service starts, it creates a root file system (initramfs) that contains resources to mount the target for saving vmcore, and a command to copy/dump vmcore to the target. This service then loads the kernel and initramfs at the suitable location within the crash kernel region so that they can be executed upon kernel panic. +使用 **dnf install kexec-tools** 命令在 Fedora 机器上安装 fedora-kexec-tools。在按章 fedora-kexec-tools 后可以执行 **systemctl start kdump** 命令来启动 kdump 服务。当此服务启动时,它将创建一个根文件系统(initramfs),其中包含了装载目标的资源,用于保存 vmcore,以及复制和转储 vmcore 的命令。然后,该服务将内核和 initramfs 加载到崩溃内核区域内的合适位置,以便在内核崩溃时可以执行它们。 -Fedora wrapper provides two user configuration files: +Fedora 包装器提供了两个用户配置文件: -1. **/etc/kdump.conf** specifies configuration parameters whose modification requires rebuild of the initramfs. For example, if you change the dump target from a local disk to an NFS-mounted disk, you will need NFS-related kernel modules to be loaded by the capture kernel. +1. **/etc/kdump.conf** 指定修改后需要重建 initramfs 的配置参数。例如,如果将转储目标从本地磁盘更改为 NFS 装载的磁盘,则需要使用与 NFS 相关的内核模块才能由捕获内核加载。 -2. **/etc/sysconfig/kdump** specifies configuration parameters whose modification do not require rebuild of the initramfs. For example, you do not need to rebuild the initramfs if you only need to modify command-line arguments passed to the capture kernel. +2. **/etc/sysconfig/kdump** 指定修改后不需要重新构建 initramfs 的配置参数。例如,如果只需修改传递给捕获内核的命令行参数,则不需要重新构建 initramfs。 -If the kernel panics after the kdump service starts, then the capture kernel is executed, which further executes the vmcore save process from initramfs and reboots to a stable kernel afterward. +如果内核在 kdump 服务启动之后出现故障,那么捕获内核被执行,进一步会执行 initramfs 中的 vmcore 保存过程,然后重新启动到稳定的内核。 -### kexec-tools +### kexec-tools 工具 -Compilation of kexec-tools source code provides an executable called **kexec**. The same executable can be used to load and execute a second kernel or to load a capture kernel, which can be executed upon kernel panic. +编译 kexec-tools 的源代码得到了一个名为 **kexec** 的可执行文件。相同的可执行文件可用于加载和执行第二个内核或加载捕获内核,可以在内核崩溃时执行。 -A typical command to load a second kernel: +加载第二个内核的命令: ``` # kexec -l kernel.img --initrd=initramfs-image.img –reuse-cmdline ``` -**--reuse-command** line says to use the same command line as that of first kernel. Pass initramfs using **--initrd**. **-l** says that you are loading the second kernel, which can be executed by the kexec application itself (**kexec -e**). A kernel loaded using **-l** cannot be executed at kernel panic. You must pass **-p**instead of **-l** to load the capture kernel that can be executed upon kernel panic. +**--reuse-command** 参数表示使用与第一个内核相同的命令行。使用 **--initrd** 传递 initramfs。 **-l** 表示正在加载第二个内核,可以由 kexec 应用程序本身执行(**kexec -e**)。使用 **-l** 加载的内核不能在内核崩溃时执行。为了加载可以在内核崩溃时执行的捕获内核,必须传递参数 **-l**。 -A typical command to load a capture kernel: +加载捕获内核的命令: ``` # kexec -p kernel.img --initrd=initramfs-image.img –reuse-cmdline ``` -**echo c > /pros/sysrq-trigger** can be used to crash the kernel for test purposes. See **man kexec** for detail about options provided by kexec-tools. Before moving to the next section, which focuses on internal implementation, watch this kexec_dump demo: +**echo c > /pros/sysrq-trigger** 可用于使内核崩溃以进行测试。有关 kexec-tools 提供的选项的详细信息,请参阅 **man kexec**。在转到下一个部分之前,请看这个 kexec_dump 的演示: - ** 此处有iframe,请手动处理 ** +[kexec_dump_demo (YouTube)](https://www.youtube.com/embed/iOq_rJhrKhA?rel=0&origin=https://opensource.com&enablejsapi=1) -### Kdump: End-to-end flow +### Kdump: 端到端流 -Figure 1 shows a flow diagram. Crashkernel memory must be reserved for the capture kernel during booting of the first kernel. You can pass **crashkernel=Y@X** in the kernel command line, where **@X** is optional. **crashkernel=256M** works with most of the x86_64 systems; however, selecting a right amount of memory for the crash kernel is dependent on many factors, such as kernel size and initramfs, as well as runtime memory requirement of modules and applications included in initramfs. See the [kernel-parameters documentation][18] for more ways to pass crash kernel arguments. +图 1 展示了流程图。必须在引导第一个内核期间为捕获内核保留 Crashkernel 的内存。您可以在内核命令行中传递 **crashkernel=Y@X**,其中 **@X** 是可选的。**crashkernel=256M** 适用于大多数 x86_64 系统;然而,为崩溃内核选择适当的内存取决于许多因素,如内核大小和 initramfs,以及 initramfs 中包含的模块和应用程序运行时的内存需求。有关传递崩溃内核参数的更多方法,请参阅 [kernel-parameters documentation][18] 文档。 ![pratyush_f1.png](https://opensource.com/sites/default/files/images/life/pratyush_f1.png) -You can pass kernel and initramfs images to a **kexec** executable as shown in the typical command of section (**kexec-tools**). The capture kernel can be the same as the first kernel or can be different. Typically, keep it the same. Initramfs can be optional; for example, when the kernel is compiled with **CONFIG_INITRAMFS_SOURCE**, you do not need it. Typically, you keep a different capture initramfs from the first initramfs, because automating a copy of vmcore in capture initramfs is better. When **kexec** is executed, it also loads **elfcorehdr** data and the purgatory executable. **elfcorehdr** has information about the system RAM memory organization, and purgatory is a binary that executes before the capture kernel executes and verifies that the second stage binary/data have the correct SHA. Purgatory can be made optional as well. +您可以将内核和 initramfs 镜像传递给 **kexec** 可执行文件,如(**kexec-tools**)部分的命令所示。捕获内核可以与第一个内核相同,也可以不同。通常,保持不变。Initramfs 是可选的;例如,当内核使用 **CONFIG_INITRAMFS_SOURCE** 编译时,您不需要它。通常,从第一个 initramfs 中保存一个不一样的捕获 initramfs,因为在捕获 initramfs 中自动执行 vmcore 的副本能获得更好的效果。当执行 **kexec** 时,它还加载了 **elfcorehdr** 数据和 purgatory 可执行文件。 **elfcorehdr** 具有关于系统内存组织的信息,purgatory 可以在捕获内核执行之前执行并验证第二级二进制或数据是否具有正确的 SHA。Purgatory 也是可选的。 -When the first kernel panics, it does a minimal necessary exit process and switches to purgatory if it exists. Purgatory verifies SHA256 of loaded binaries and, if those are correct, then it passes control to the capture kernel. The capture kernel creates vmcore per the system RAM information received from **elfcorehdr**. Thus, you will see a dump of the first kernel in /proc/vmcore after the capture kernel boots. Depending on the initramfs you have used, you can now analyze the dump, copy it to any disk, or there can be an automated copy followed by reboot to a stable kernel. +当第一个内核崩溃时,它执行必要的退出过程并切换到 purgatory(如果存在)。Purgatory 验证加载二进制文件的 SHA256,如果是正确的,则将控制权传递给捕获内核。捕获内核根据从 **elfcorehdr** 接收到的系统内存信息创建 vmcore。因此,捕获内核启动后,您将看到 /proc/vmcore 中第一个内核的转储。根据您使用的 initramfs,您现在可以分析转储,将其复制到任何磁盘,也可以是自动复制的,然后重新启动到稳定的内核。 -### Kernel system calls +### 内核系统调用 -The kernel provides two system calls—**kexec_load()** and **kexec_file_load()**, which can be used to load the second kernel when **kexec -l** is executed. It also provides an extra flag for the **reboot()** system call, which can be used to boot into second kernel using **kexec -e**. +内核提供了两个系统调用:**kexec_load()** 和 **kexec_file_load()**,可以用于在执行 **kexec -l** 时加载第二个内核。它还为 **reboot()** 系统调用提供了一个额外的标志,可用于使用 **kexec -e** 引导到第二个内核。 -**kexec_load()**: The **kexec_load()** system call loads a new kernel that can be executed later by **reboot()**. Its prototype is defined as follows: +**kexec_load()**:**kexec_load()** 系统调用加载一个可以在之后通过 **reboot()** 执行的新的内核。其原型定义如下: ``` long kexec_load(unsigned long entry, unsigned long nr_segments, struct kexec_segment *segments, unsigned long flags); ``` -User space needs to pass segments for different components, such as kernel, initramfs, etc. Thus, the **kexec** executable helps in preparing these segments. The structure of **kexec_segment** looks like as follows: +用户空间需要为不同的组件传递不同的段,如内核,initramfs 等。因此,**kexec** 可执行文件有助于准备这些段。**kexec_segment** 的结构如下所示: ``` struct kexec_segment { void *buf; - /* Buffer in user space */ + /* 用户空间缓冲区 */ size_t bufsz; - /* Buffer length in user space */ + /* 用户空间中的缓冲区长度 */ void *mem; - /* Physical address of kernel */ + /* 内核的物理地址 */ size_t memsz; - /* Physical address length */ + /* 物理地址长度 */ }; ``` -When **reboot()** is called with **LINUX_REBOOT_CMD_KEXEC**, it boots into a kernel loaded by **kexec_load()**. If a flag **KEXEC_ON_CRASH** is passed to **kexec_load()**, then the loaded kernel will not be executed with **reboot(LINUX_REBOOT_CMD_KEXEC)**; rather, that will be executed on kernel panic. **CONFIG_KEXEC** must be defined to use kexec and **CONFIG_CRASH_DUMP** should be defined for kdump. +当使用 **LINUX_REBOOT_CMD_KEXEC** 调用 **reboot()** 时,它会引导进入由 **kexec_load** 加载的内核。如果标志 **KEXEC_ON_CRASH** 被传递给 **kexec_load()**,则加载的内核将不会使用 **reboot(LINUX_REBOOT_CMD_KEXEC)** 来启动;相反,这将在内核崩溃中执行。必须定义 **CONFIG_KEXEC** 才能使用 **kexec**,并且为 kdump 定义 **CONFIG_CRASH_DUMP**。 -**kexec_file_load()**: As a user you pass only two arguments (i.e., kernel and initramfs) to the **kexec** executable. **kexec** then reads data from sysfs or other kernel information source and creates all segments. So, **kexec_file_load()**gives you simplification in user space, where you pass only file descriptors of kernel and initramfs. The rest of the all segment preparation is done by the kernel itself. **CONFIG_KEXEC_FILE** should be enabled to use this system call. Its prototype looks like: +**kexec_file_load()**:作为用户,你只需传递两个参数(即 kernel 和 initramfs)到 **kexec** 可执行文件。然后,**kexec** 从 sysfs 或其他内核信息源中读取数据,并创建所有段。所以使用 **kexec_file_load()** 可以简化用户空间,只传递内核和 initramfs 的文件描述符。其余部分由内核本身完成。使用此系统调用时应该启用 **CONFIG_KEXEC_FILE**。它的原型如下: ``` long kexec_file_load(int kernel_fd, int initrd_fd, unsigned long @@ -109,35 +107,35 @@ cmdline_len, const char __user * cmdline_ptr, unsigned long flags); ``` -Notice that **kexec_file_load()** also accepts the command line, whereas **kexec_load()** did not. The kernel has different architecture-specific ways to accept the command line. Therefore, **kexec-tools** passes the command-line through one of the segments (like in **dtb** or **ELF boot notes**, etc.) in case of **kexec_load()**. +请注意,**kexec_file_load** 也可以接受命令行,而 **kexec_load()** 不行。内核根据不同的系统架构来接受和执行命令行。因此,在 **kexec_load()** 的情况下,**kexec-tools** 将通过其中一个段(如在 **dtb** 或 **ELF** 引导注释等)中传递命令行。 -Currently, **kexec_file_load()** is supported for x86 and PowerPC only. +目前,**kexec_file_load()** 仅支持 x86 和 PowerPC。 -### What happens when the kernel crashes +### 当内核崩溃时会发生什么 -When the first kernel panics, before control is passed to the purgatory or capture kernel it does the following: +当第一个内核崩溃时,在控制权传递给 purgatory 或捕获内核之前,会执行以下操作: -* prepares CPU registers (see **crash_setup_regs()** in kernel code); +* 准备 CPU 寄存器(参见内核代码中的 **crash_setup_regs()**); -* updates vmcoreinfo note (see **crash_save_vmcoreinfo()**); +* 更新 vmcoreinfo 备注(请参阅 **crash_save_vmcoreinfo()**); -* shuts down non-crashing CPUs and saves the prepared registers (see **machine_crash_shutdown()** and **crash_save_cpu()**); +* 关闭非崩溃的 CPU 并保存准备好的寄存器(请参阅 **machine_crash_shutdown()** 和 **crash_save_cpu()**); -* you also might need to disable the interrupt controller here; +* 您可能需要在此处禁用中断控制器; -* and at the end, it performs the kexec reboot (see **machine_kexec()**), which loads/flushes kexec segments to memory and passes control to the execution of entry segment. Entry segment could be purgatory or start address of next kernel. +* 最后,它执行 kexec 重新启动(请参阅 **machine_kexec()**),它将加载或刷新 kexec 段到内存,并将控制权传递给进入段的执行文件。输入段可以是下一个内核的 purgatory 或开始地址。 -### ELF program headers +### ELF 程序头 -Most of the dump cores involved in kdump are in ELF format. Thus, understanding ELF Program headers is important, especially if you want to find issues with vmcore preparation. Each ELF file has a program header that: +kdump中涉及的大多数转储核心都是 ELF 格式。因此,理解 ELF 程序头部很重要,特别是当您想要找到 vmcore 准备的问题。每个 ELF 文件都有一个程序头: -* is read by the system loader, +* 由系统加载器读取, -* describes how the program should be loaded into memory, +* 描述如何将程序加载到内存中, -* and one can use **Objdump -p elf_file** to look into program headers. +* 可以使用 **Objdump -p elf_file** 来查看程序头。 -An example of ELF program headers of a vmcore: +vmcore 的 ELF 程序头的示例如下: ``` # objdump -p vmcore @@ -160,21 +158,21 @@ LOAD off 0x00000003807f0000 vaddr 0xffff8003ff9f0000 paddr 0x00000043ff9f0000 al 0x0000000000610000 memsz 0x0000000000610000 flags rwx ``` -In this example, there is one note section and the rest are load sections. The note section has information about CPU notes and load sections have information about copied system RAM components. +在这个例子中,有一个 note 段,其余的是 load 段。note 段提供了有关 CPU 信息,load 段提供了关于复制的系统内存组件的信息。 -Vmcore starts with **elfcorehdr**, which has the same structure as that of a an ELF program header. See the representation of **elfcorehdr** in Figure 2: +Vmcore 从 **elfcorehdr** 开始,它具有与 ELF 程序头相同的结构。参见图 2 中 **elfcorehdr** 的表示: ![pratyush_f2.png](https://opensource.com/sites/default/files/images/life/pratyush_f2.png) -**kexec-tools** reads /sys/devices/system/cpu/cpu%d/crash_notes and prepares headers for **CPU PT_NOTE**. Similarly, it reads **/sys/kernel/vmcoreinfo** and prepares headers for **vmcoreinfo PT_NOTE**, and reads system RAM values from **/proc/iomem** and prepares memory **PT_LOAD** headers. When the capture kernel receives **elfcorehdr**, it appends data from addresses mentioned in the header and prepares vmcore. +**kexec-tools** 读取 /sys/devices/system/cpu/cpu%d/crash_notes 并准备 **CPU PT_NOTE** 的头文件。同样,它读取 **/sys/kernel/vmcoreinfo** 并准备 **vmcoreinfo PT_NOTE** 的头文件,从 **/proc/iomem** 读取系统内存并准备存储器 **PT_LOAD** 标头。当捕获内核接收到 **elfcorehdr** 时,它从头文件中提到的地址中读取数据,并准备 vmcore。 ### Crash notes -Crash notes is a per-CPU area for storing CPU states in case of a system crash; it has information about current PID and CPU registers. +Crash notes 是每个 CPU 中用于在系统崩溃的情况下存储 CPU 状态的区域; 它有关于当前 PID 和 CPU 寄存器的信息。 ### vmcoreinfo -This note section has various kernel debug information, such as struct size, symbol values, page size, etc. Values are parsed by capture kernel and embedded into **/proc/vmcore**. **vmcoreinfo** is used mainly by the **makedumpfile** application. **include/linux/kexec.h** in the Linux kernel has macros to define a new **vmcoreinfo**. Some of the example macros are like these: +该 note 段具有各种内核调试信息,如结构体大小、符号值、页面大小等。这些值由捕获内核解析并嵌入到 **/proc/vmcore** 中。 vmcoreinfo 主要由 **makedumpfile** 应用程序使用。在 Linux 内核,**include/linux/kexec.h** 宏定义了一个新的 **vmcoreinfo**。 一些示例宏如下所示: * **VMCOREINFO_PAGESIZE()** @@ -186,91 +184,91 @@ This note section has various kernel debug information, such as struct size, sym ### makedumpfile -Much information (such as free pages) in a vmcore is not useful. Makedumpfile is an application that excludes unnecessary pages, such as: +vmcore 中的许多信息(如可用页面)都没有用处。Makedumpfile 是一个用于排除不必要的页面的应用程序,如: -* pages filled with zeroes, +* 填满零的页面, -* cache pages without private flag (non-private cache); +* 没有私有标志的缓存页面(非专用缓存); -* cache pages with private flag (private cache); +* 具有私有标志的缓存页面(专用缓存); -* user process data pages; +* 用户进程数据页; -* free pages. +* 可用页面。 -Additionally, makedumpfile compresses **/proc/vmcore** data while copying. It can also erase sensitive symbol information from dump; however, it first needs kernel's debug information to do that. This debug information comes from either **VMLINUX** or **vmcoreinfo**, and its output either can be in ELF format or kdump-compressed format. +此外,makedumpfile 在复制时压缩 **/proc/vmcore** 的数据。它也可以从转储中删除敏感的符号信息; 然而,为了做到这一点,它首先需要内核的调试信息。该调试信息来自 **VMLINUX** 或 **vmcoreinfo**,其输出可以是 ELF 格式或 kdump 压缩格式。 -Typical usage: +典型用法: ``` # makedumpfile -l --message-level 1 -d 31 /proc/vmcore makedumpfilecore ``` -See **man makedumpfile** for detail. +详细信息请参阅 **man makedumpfile**。 -### Debugging kdump issues +### kdump 调试 -Issues that new kdump users might have: +新手在使用 kdump 时可能会遇到的问题: -### _Kexec -p kernel_image_  did not succeed +### _Kexec -p kernel_image_  没有成功 -* Check whether crash memory is allocated. +* 检查是否分配了崩溃内存。 -* **cat /sys/kernel/kexec_crash_size** should have no zero value. +* **cat /sys/kernel/kexec_crash_size** 不应该有零值。 -* **cat /proc/iomem | grep "Crash kernel"** should have an allocated range. +* **cat /proc/iomem | grep "Crash kernel"** 应该有一个分配的范围。 -* If not allocated, then pass the proper **crashkernel=** argument in the command line. +* 如果未分配,则在命令行中传递正确的 **crashkernel=** 参数。 -* If nothing shows up, then pass **-d** in the **kexec** command and share the debug output with the kexec-tools mailing list. +* 如果没有显示,则在 **kexec** 命令中传递参数 **-d**,并使用 kexec-tools 邮件列表共享调试输出。 -### Do not see anything on console after last message from first kernel (such as "bye") +### 在第一个内核的最后一个消息之后,在控制台上看不到任何东西(比如“bye”) -* Check whether **kexec -l kernel_image** followed by **kexec -e** works. +* 检查 **kexec -e** 之后的 **kexec -l kernel_image** 命令是否工作。 -* Might be missing architecture- or machine-specific options. +* 可能缺少支持的体系结构或特定机器的选项。 -* Might have purgatory SHA verification failed. If your architecture does not support a console in purgatory, then it is difficult to debug. +* 可能是 purgatory 的 SHA 验证失败。如果您的体系结构不支持 purgatory 中的控制台,则很难进行调试。 -* Might have second kernel crashed early. +* 可能是第二个内核早已崩溃。 -* Pass **earlycon**/**earlyprintk** option for your system to the second kernel command line. +* 将您的系统的 **earlycon** 或 **earlyprintk** 选项传递给第二个内核的命令行。 -* Share **dmesg** log of both the first and capture kernel with kexec-tools mailing list. +* 使用 kexec-tools 邮件列表共享第一个内核和捕获内核的 **dmesg** 日志。 -### Resources +### 资源 #### fedora-kexec-tools -* Repository: **git://pkgs.fedoraproject.org/kexec-tools** +* 存储库: **git://pkgs.fedoraproject.org/kexec-tools** -* Mailing list: [kexec@lists.fedoraproject.org][7] +* 邮件列表:[kexec@lists.fedoraproject.org][7] -* Description: Specs file and scripts to provide user-friendly command/services so that **kexec-tools** can be automated in different user scenarios. +* 说明:规定的文件和脚本提供了用户友好的命令和服务,以便 **kexec-tools** 可以在不同的用户场景下实现自动化。 #### kexec-tools -* Repository: git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git +* 存储库: git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git -* Mailing list: [kexec@lists.infradead.org][8] +* 邮件列表:[kexec@lists.infradead.org][8] -* Description: Uses kernel system calls and provides a user command **kexec**. +* 说明:使用内核系统调用并提供用户命令 **kexec**。 #### Linux kernel -* Repository: **git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git** +* 存储库: **git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git** -* Mailing list: [kexec@lists.infradead.org][9] +* 邮件列表:[kexec@lists.infradead.org][9] -* Description: Implements **kexec_load()**, **kexec_file_load()**, and **reboot()**system call and architecture-specific code, such as **machine_kexec()** and **machine_crash_shutdown()**, etc. +* 说明:实现了 **kexec_load()**、**kexec_file_load()**、**reboot()** 系统调用和特定体系结构的代码,例如 **machine_kexec()** 和 **machine_crash_shutdown()**。 #### Makedumpfile -* Repository: **git://git.code.sf.net/p/makedumpfile/code** +* 存储库: **git://git.code.sf.net/p/makedumpfile/code** -* Mailing list: [kexec@lists.infradead.org][10] +* 邮件列表:[kexec@lists.infradead.org][10] -* Description: Compresses and filters unnecessary component from the dumpfile. +* 说明:从转储文件中压缩和过滤不必要的组件。 _Learn more in Pratyush Anand's [KDUMP: Usage and Internals][11] talk at LinuxCon ContainerCon CloudOpen China on June 20, 2017._ @@ -279,15 +277,14 @@ Issues that new kdump users might have: 作者简介: -Pratyush Anand - Pratyush is working with Red Hat as a Linux Kernel Generalist. Primarily, he takes care of several kexec/kdump issues being faced by Red Hat product and upstream. He also handles other kernel debugging/tracing/performance issues around Red Hat supported ARM64 platforms. Apart from Linux Kernel, he has also contributed in upstream kexec-tools and makedumpfile project. He is an open source enthusiast and delivers volunteer lectures in educational institutes for the promotion of FOSS. - +Pratyush Anand - Pratyush 正在与 Red Hat 合作,作为 Linux 内核通才。他主要负责 Red Hat 产品和上游所面临的几个 kexec/kdump 问题。他还处理 Red Hat 支持的 ARM64 平台周围的其他内核调试、跟踪和性能问题。除了 Linux 内核,他还在上游的 kexec-tools 和 makedumpfile 项目中做出了贡献。他是一名开源爱好者,并在教育机构举办志愿者讲座,促进了 FOSS。 ------- via: https://opensource.com/article/17/6/kdump-usage-and-internals 作者:[Pratyush Anand ][a] -译者:[译者ID](https://github.com/译者ID) +译者:[firmianay](https://github.com/firmianay) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 26e1ecda8986f760807110d35f361ff0ecac7e07 Mon Sep 17 00:00:00 2001 From: firmianay Date: Sat, 29 Jul 2017 13:40:22 +0800 Subject: [PATCH 0833/1407] move --- .../20170621 Using Kdump for examining Linux Kernel crashes.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {sources => translated}/tech/20170621 Using Kdump for examining Linux Kernel crashes.md (100%) diff --git a/sources/tech/20170621 Using Kdump for examining Linux Kernel crashes.md b/translated/tech/20170621 Using Kdump for examining Linux Kernel crashes.md similarity index 100% rename from sources/tech/20170621 Using Kdump for examining Linux Kernel crashes.md rename to translated/tech/20170621 Using Kdump for examining Linux Kernel crashes.md From 8c188f15a11fbe49de2e5727d56351559ce79dff Mon Sep 17 00:00:00 2001 From: SunWave Date: Sat, 29 Jul 2017 16:14:22 +0800 Subject: [PATCH 0834/1407] Update 20170718 Things to consider when building a robot with open source.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 申请翻译本文 --- ...Things to consider when building a robot with open source.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170718 Things to consider when building a robot with open source.md b/sources/tech/20170718 Things to consider when building a robot with open source.md index fb732bd275..b25a8ecc7a 100644 --- a/sources/tech/20170718 Things to consider when building a robot with open source.md +++ b/sources/tech/20170718 Things to consider when building a robot with open source.md @@ -1,3 +1,5 @@ +Translating by Sunwave + Things to consider when building a robot with open source ============================================== From c7b00d85a40078ba7452a973f4a5fdd21edc5789 Mon Sep 17 00:00:00 2001 From: firmianay Date: Sat, 29 Jul 2017 21:43:26 +0800 Subject: [PATCH 0835/1407] translating by firmianay --- ...tall Update Latest Kernel In Ubuntu LinuxMint.md | 12 +++++++----- 1 file changed, 7 insertions(+), 5 deletions(-) diff --git a/sources/tech/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md b/sources/tech/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md index 58b63eb039..1c670b034d 100644 --- a/sources/tech/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md +++ b/sources/tech/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md @@ -1,3 +1,5 @@ +translating by firmianay + Linux Kernel Utilities (LKU) – A Set Of Shell Scripts To Compile, Install & Update Latest Kernel In Ubuntu/LinuxMint ============================================================ @@ -44,7 +46,7 @@ Just run `update_ubuntu_kernel.sh` shell file. In the very first time script w Once the kernel images get downloaded, it will popup the `sudo` password to start the new kernel installation. ``` -$ ./update_ubuntu_kernel.sh +$ ./update_ubuntu_kernel.sh [+] Checking Distro \_ Distro identified as LinuxMint. @@ -168,7 +170,7 @@ Do you want the lowlatency kernel? (y/[n]): [+] Checking AntiVirus flag and disabling if necessary [+] Installing kernel . . . -[sudo] password for magi: +[sudo] password for magi: Selecting previously unselected package linux-headers-4.4.10-040410. (Reading database ... 230647 files and directories currently installed.) Preparing to unpack linux-headers-4.4.10-040410_4.4.10-040410.201605110631_all.deb ... @@ -287,10 +289,10 @@ Linux magi-VirtualBox 4.11.3-041103-generic #201705251233 SMP Thu May 25 16:34:5 Just run `remove_old_kernels.sh` shell file to remove/purge all inactive kernels. ``` -$ ./remove_old_kernels.sh +$ ./remove_old_kernels.sh ++++++++++++++++++++++++++++++++ - +++ W A R N I N G +++ + +++ W A R N I N G +++ ++++++++++++++++++++++++++++++++ A reboot is recommended before running this script to ensure the current kernel tagged @@ -303,7 +305,7 @@ You have been warned. [?]Continue to automagically remove ALL old kernels? (y/N)y \_ Removing ALL old kernels . . . -[sudo] password for magi: +[sudo] password for magi: Reading package lists... Done Building dependency tree Reading state information... Done From fb8023c7e35b63d0c4a2dfad57e9f4835e57d1bd Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 29 Jul 2017 23:10:26 +0800 Subject: [PATCH 0836/1407] PRF:20170213 The decline of GPL.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @name1e5s 翻译的不错,不过一般我们的语境中,“free” 会是指“自由”,而不是免费,遇到这个词需要斟酌。 --- .../talk/20170213 The decline of GPL.md | 46 ++++++++++--------- 1 file changed, 24 insertions(+), 22 deletions(-) diff --git a/translated/talk/20170213 The decline of GPL.md b/translated/talk/20170213 The decline of GPL.md index 240a4601cb..1651337362 100644 --- a/translated/talk/20170213 The decline of GPL.md +++ b/translated/talk/20170213 The decline of GPL.md @@ -4,65 +4,67 @@ GPL 没落了吗? ![GPL 没落了吗?](https://opensource.com/sites/default/files/styles/image-full-size/public/images/law/LAW_vaguepatent_520x292.png?itok=9It-cWjB "The decline of GPL?") Image by : opensource.com -不久之前我看到了 RedMonk 的 Stephen O'Grady 发了一个[关于开源协议的有趣的推特][2],那个推特里面有这张图。 +不久之前我看到了 RedMonk 的 Stephen O'Grady 发了一个[关于开源协议][2]的有趣的推特,那个推特里面有这张图。 - ![Redmonk Black Duck Licensing](https://opensource.com/sites/default/files/resize/oss-blk-duck-licensing-0110-0117-wm-2-520x344.png "Redmonk Black Duck Licensing") +![Redmonk Black Duck Licensing](http://sogrady-media.redmonk.com/sogrady/files/2017/01/OSS-blk-duck-licensing-0110-0117-wm-2.png "Redmonk Black Duck Licensing") -这张图片显示了从 2010 到 2017 年间各种开源协议之间的使用率的变化。在这张图片里,显然 GPL 2.0,最纯净的 copyleft 协议之一,的使用率不只是折了个半。表格表明,开源项目中 [MIT][3] 协议和 [Apache][4] 协议开始受欢迎。[GPL 3.0][5] 的使用率也有所上涨。 +这张图片显示了从 2010 到 2017 年间各种开源协议之间的使用率的变化。在这张图片里,显然 GPL 2.0 —— 最纯净的 copyleft 协议之一 —— 的使用率降低了一多半。该图表表明,开源项目中 [MIT][3] 协议和 [Apache][4] 协议开始受欢迎。[GPL 3.0][5] 的使用率也有所上涨。 这些意味着什么? -为什么 GPL 2.0 的使用率跌的这么多但是 GPL 3.0 仅仅是涨了一丁点?为什么 MIT 和 Apache 的使用率涨了那么多? +为什么 GPL 2.0 的使用率跌的这么多但是 GPL 3.0 仅仅是涨了一丁点?为什么 MIT 协议和 Apache 协议的使用率涨了那么多? 当然,有很多原因可以解释这件事情,但是我想这是因为商业开源项目的增多,以及商业社会对于 GPL 协议的担心导致的,我们细细掰扯。 ### GPL 协议与商业社会 -我知道我要说的可能会激怒一些 GPL粉,所以在你们开始喷之前,我想说明:我支持 GPL,也是 GPL 粉丝。 +我知道我要说的可能会激怒一些 GPL 粉,所以在你们开始喷之前,我想说明的是:我支持 GPL,我也是 GPL 粉丝。 -我写过的所有软件都使用的 GPL 协议,我也是一直是出资支持 [自由软件基金会][6] 以及 [软件自由保护组织][7] 以及他们的工作的,我支持使用 GPL 协议。我在这说的无关 GPL 的合法性或者 GPL 的巨大价值 —— 毫无疑问这是一个好协议 —— 我在这要说的是商业社会对于这个协议的看法。 +我写过的所有软件都使用的是 GPL 协议,我也是一直是积极出资支持 [自由软件基金会][6] 以及 [软件自由保护组织][7] 以及他们的工作的,我支持使用 GPL 协议。我在这说的无关 GPL 的合法性或者 GPL 的巨大价值 —— 毫无疑问这是一个好协议 —— 我在这要说的是业内对于这个协议的看法。 -大概四年之前,我参加了一个叫做 开源智库 的峰会。这个峰会是一个私人小型峰会,每年都会把各大开源企业的管理人员请到加利福尼亚的酒庄。这个峰会聚焦于网络,构建联盟,识别报告企业问题。 +大概四年之前,我参加了一个叫做开源智库Open Source Think Tank的峰会。这个峰会是一个私人小型峰会,每年都会把各大开源企业的管理人员请到加利福尼亚的酒庄。这个峰会聚焦于建立关系、构建联盟,找到并解决行业问题。 -在这个峰会上,有一个小组研究,在这个小组研究中,与会者被分成小组,被要求给一个真实存在的核心开源技术推荐一个开源协议。每个小组都给出了回应。不到十分之一的小组推荐了公共许可证,没有热推荐 GPL 许可证。 +在这个峰会上,有一个分组研究,在其中,与会者被分成小组,被要求给一个真实存在的核心的开源技术推荐一个开源协议。每个小组都给出了回应。不到十分之一的小组推荐了宽容许可证,没有人推荐 GPL 许可证。 -我看到了开源行业对于 Apache 以及 MIT 协议的逐步认可,但是他们却对花时间理解,接受,熟悉 GPL 这件事高高挂起。 +我看到了开源行业对于 Apache 协议以及 MIT 协议的逐步认可,但是他们却对花时间理解、接受和熟悉 GPL 这件事高高挂起。 -在这几年里,这种趋势仍在蔓延。除了 Black Duck 的调查之外, 2015 年 [GitHub 上的开源协议调查][8] 也显示 MIT 是人们的首选。我还能看到,在我工作的 XPRIZE (我们为我们的 [Global Learning XPRIZE][9] 选择了开源协议),在我的职位,[社区领导顾问][10],我也能感觉到那种倾向,因为越来越多的客户觉得把他们的代码用 GPL 发布不舒服。 +在这几年里,这种趋势仍在蔓延。除了 Black Duck 的调查之外, 2015 年 [GitHub 上的开源协议调查][8] 也显示 MIT 是人们的首选。我还能看到,在我工作的 XPRIZE (我们为我们的 [Global Learning XPRIZE][9] 选择了开源协议),在我作为[社区领导顾问][10]的工作方面,我也能感觉到那种倾向,因为越来越多的客户觉得把他们的代码用 GPL 发布不舒服。 -随着 [大约 65% 的公司对开源事业做贡献][11] ,自从 2010 年以后显然开源行业已经有了不少商业资本和投资。我相信,我之前说的那些趋势,已经表明这行业不认为 GPL 适合搞开源生意。 +随着 [大约 65% 的公司对开源事业做贡献][11] ,自从 2010 年以后显然开源行业已经引来了不少商业兴趣和投资。我相信,我之前说的那些趋势,已经表明这行业不认为 GPL 适合搞开源生意。 ### 连接社区和公司 说真的,GPL 的没落不太让人吃惊,因为有如下原因。 -首先,开源行业已经转型升级,它要在社区发展以及...你懂的...真正能赚钱的商业模型中做出均衡,这是它们要做的最重要的决策。在开源思想发展之初,人们有种误解说,“如果你搞出来了,他们就会用”,他们确实会来使用你的软件,但是在很多情况下,都是“如果你搞出来了,他们不一定会给你钱。” +首先,开源行业已经转型升级,它要在社区发展以及……你懂的……真正能赚钱的商业模型中做出均衡,这是它们要做的最重要的决策。在开源思想发展之初,人们有种误解说,“如果你搞出来了,他们就会用”,他们确实会来使用你的软件,但是在很多情况下,都是“如果你搞出来了,他们不是一定要给你钱。” -随着历史的进程,我们看到了许多公司,比如 Red Hat, Automattic, Docker, Canonical, Digital Ocean 等等等等,发展着在开源领域中赚钱的法子。他们发展过分发模型,服务模型,开源核心服务模型等等等等。现在可以确定的是,传统的商业软件赚钱的方式已经不在开源软件这适用;因此,你得选择一个能够支持你的公司的营业方式的开源协议。在赚钱和免费提供你的技术之间找到平衡在很多情况下是很困难的一件事。 +随着历史的进程,我们看到了许多公司,比如 Red Hat、Automattic、Docker、Canonical、Digital Ocean 等等等等,探索着在开源领域中赚钱的法子。他们探索过分发模式、服务模式,核心开源模式等等。现在可以确定的是,传统的商业软件赚钱的方式已经不再适用开源软件;因此,你得选择一个能够支持你的公司的经营方式的开源协议。在赚钱和免费提供你的技术之间找到平衡在很多情况下是很困难的一件事。 -这就是我们看到那些变化的原因。尽管 GPL 是一个开源协议,但是它还是自由软件协议,作为自由软件协议,它的管理以及支持是由自由软件基金会提供的。 +这就是我们看到那些变化的原因。尽管 GPL 是一个开源协议,但是它根本上是个自由软件协议,作为自由软件协议,它的管理以及支持是由自由软件基金会提供的。 -我喜欢自由软件基金会的作品,但是他们已经把观点局限于软件必须 100 % 绝对免费。对于 FSF 没有多少可以妥协的,甚至很多出名的开源项目(比如很多 Linux 发行版)仅仅是因为一丁点二进制固件就被认为是 “非免费” 软件。 +我喜欢自由软件基金会的作品,但是他们已经把观点局限于软件必须 100% 绝对自由。对于自由软件基金会没有多少可以妥协的余地,甚至很多出名的开源项目(比如很多 Linux 发行版)仅仅是因为一丁点二进制固件就被认为是 “非自由” 软件。 -对于商业来说,最复杂的就是它不是非黑即白,更多的时候是两者混合的灰色,很少有公司有自由软件基金会(或者类似的组织,比如软件自由保护组织)的那种纯粹的理念,因此我想那些公司也不喜欢选择和那些理念相关的协议。 +对于商业来说,最复杂的是它不是非黑即白的,更多的时候是两者混合的灰色,很少有公司有自由软件基金会(或者类似的组织,比如软件自由保护组织)的那种纯粹的理念,因此我想那些公司也不喜欢选择和那些理念相关的协议。 -我需要说明,我不是在这是说 FSF 以及类似的组织(比如 SFC)的错。他们有着打造完全免费的软件的目标,对于他们来说,走它们选择的路十分合理。FSF 以及 SFC 做了_了不起_的工作,我将继续支持这些组织以及为他们工作的人们。我相信,这种纯粹性的高要求的一个后果就是让那些公司认为自己难以达到要求,因此,他们使用了非 GPL 的其他协议。 +我需要说明,我不是在这是说自由软件基金会以及类似的组织(比如软件自由保护组织)的错。他们有着打造完全自由的软件的目标,对于他们来说,走它们选择的路十分合理。自由软件基金会以及软件自由保护组织做了_了不起_的工作,我将继续支持这些组织以及为他们工作的人们。我只是觉得这种对纯粹性的高要求的一个后果就是让那些公司认为自己难以达到要求,因此,他们使用了非 GPL 的其他协议。 -近年来,尽管我们已经看到了不再那么挑剔的一代开发者的出现,但是他们却缺少对于自由的关注。对于他们来说开源软件是务实实用的构建软件的一部分,而不是关乎伦理的问题。我想,这就是为什么我们发现 MIT 和 Apache 协议的流行的原因。 +我怀疑 GPL 的使用是随着开源软件增长而变化的。在以前,启动(开源)项目的根本原因之一是对开放性和软件自由的伦理因素的严格关注。GPL 无疑是项目的自然选择,Debian、Ubuntu、Fedora 和 Linux 内核以及很多都是例子。 + +近年来,尽管我们已经看到了不再那么挑剔的一代开发者的出现,但是如果我说的过激一些,他们缺少对于自由的关注。对于他们来说开源软件是构建软件的务实、实用的一部分,而无关伦理。我想,这就是为什么我们发现 MIT 和 Apache 协议的流行的原因。 ### 未来 ? 这对于 GPL 意味着什么? -我的猜想是 GPL 依然将是一个主要选项,但是开发者将将他视为纯粹的自由软件协议。我想对于软件的纯粹性有高要求的项目会优先选择 GPL 协议。但是对于商业软件,为了保持我们之前讨论的平衡,他们不会那么做。我猜测, MIT 以及 Apache 依然会继续流行下去。 +我的猜想是 GPL 依然将是一个主要选项,但是开发者将将之视为纯粹的自由软件协议。我想对于软件的纯粹性有高要求的项目会优先选择 GPL 协议。但是对于商业软件,为了保持我们之前讨论过的那种平衡,他们不会那么做。我猜测, MIT 以及 Apache 依然会继续流行下去。 -不管怎样,好消息是开源/免费软件行业确实在增长。无论使用的协议会发生怎样的变化,技术确实变得更加开放,可以接触,人人都能使用。 +不管怎样,好消息是开源/自由软件行业确实在增长。无论使用的协议会发生怎样的变化,技术确实变得更加开放,可以接触,人人都能使用。 -------------------------------------------------------------------------------- 作者简介: -Jono Bacon - Jono Bacon is a leading community manager, speaker, author, and podcaster. He is the founder of Jono Bacon Consulting which provides community strategy/execution, developer workflow, and other services. He also previously served as director of community at GitHub, Canonical, XPRIZE, OpenAdvantage, and consulted and advised a range of organizations. +Jono Bacon - Jono Bacon 是一位领袖级的社区管理者、演讲者、作者和播客主。他是 Jono Bacon 咨询公司的创始人,提供社区战略和执行、开发者流程和其它的服务。他之前任职于 GitHub、Canonical 和 XPRIZE、OpenAdvantage 的社区总监,并为大量的组织提供咨询和顾问服务。 -------------------------------------------------------------------------------- @@ -70,7 +72,7 @@ via: https://opensource.com/article/17/2/decline-gpl 作者:[Jono Bacon][a] 译者:[name1e5s](https://github.com/name1e5s) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 716487cf8367d1f5faba505bca6295093ff3e94f Mon Sep 17 00:00:00 2001 From: wxy Date: Sat, 29 Jul 2017 23:10:58 +0800 Subject: [PATCH 0837/1407] PUB:20170213 The decline of GPL.md @name1e5s --- {translated/talk => published}/20170213 The decline of GPL.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/talk => published}/20170213 The decline of GPL.md (100%) diff --git a/translated/talk/20170213 The decline of GPL.md b/published/20170213 The decline of GPL.md similarity index 100% rename from translated/talk/20170213 The decline of GPL.md rename to published/20170213 The decline of GPL.md From 0ba3af0b969c2bca12c5f92bb869d60319b841db Mon Sep 17 00:00:00 2001 From: firmianay Date: Sat, 29 Jul 2017 23:12:02 +0800 Subject: [PATCH 0838/1407] translated --- ...pdate Latest Kernel In Ubuntu LinuxMint.md | 54 +++++++++---------- 1 file changed, 26 insertions(+), 28 deletions(-) rename {sources => translated}/tech/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md (82%) diff --git a/sources/tech/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md b/translated/tech/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md similarity index 82% rename from sources/tech/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md rename to translated/tech/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md index 1c670b034d..d63c639884 100644 --- a/sources/tech/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md +++ b/translated/tech/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md @@ -1,49 +1,47 @@ -translating by firmianay - -Linux Kernel Utilities (LKU) – A Set Of Shell Scripts To Compile, Install & Update Latest Kernel In Ubuntu/LinuxMint +Linux Kernel Utilities(LKU) - 一套在 Ubuntu/LinuxMint 上编译、安装和更新最新内核的 Shell 脚本 ============================================================ -Installing & Upgrading latest Linux kernel in the manual way is not a small task for everyone, including experience guys. It requires depth knowledge on Linux core. We have already covered in the past about UKUU (Ubuntu Kernel Upgrade Utility) which automatically detect the latest mainline kernel from kernel.ubuntu.com and popup the nice GUI for installation. +以手动方式安装和升级最新的 Linux 内核对于每个人来说都不是一件小事,甚至包括一些有经验的人。它需要对 Linux 内核有深入的了解。过去我们已经介绍了 UKUU(Ubuntu Kernel Upgrade Utility),它可以从 kernel.ubuntu.com 网站上自动检测最新的主线内核,并弹出一个不错的窗口界面进行安装。 -[Linux Kernel Utilities][2] (LKU) offers set of shell scripts (Three Shell Scripts) which help users to compile & install latest Linux kernel from kernel.org, also install precompiled latest Ubuntu kernel from kernel.ubuntu.com. Even it has an option to choose required kernel (manual kernel selection) based on our requirement. +[Linux Kernel Utilities][2] (LKU)提供一组 shell 脚本(三个 Shell 脚本),可以帮助用户从 kernel.org 获取并编译和安装最新的 Linux 内核,还可以从 kernel.ubuntu.com 获取安装最新的 Ubuntu 内核。甚至可以根据需要选择所需的内核(手动内核选择)。 -This script will also check the downloaded archive against the PGP signature file and possible to choose generic and lowlatency kernels. +该脚本还将根据 PGP 签名文件检查下载的存档,并且可以选择通用和低版本的内核。 -Suggested Read : [Ukuu – An Easy Way To Install/Upgrade Linux Kernel In Ubuntu based Systems][3] +建议阅读:[Ukuu – An Easy Way To Install/Upgrade Linux Kernel In Ubuntu based Systems][3] -It remove/purge all inactive kernels and won’t leave backup kernel for safety purpose. It is highly recommended that a reboot be performed before executing this script. +它可以删除或清除所有非活动的内核,并且不会为了安全目的留下备份的内核。强烈建议在执行此脚本之前重新启动。 -* compile_linux_kernel.sh : Users can able to compile & install required or latest kernel from kernel.org +* compile_linux_kernel.sh :用户可以从 kernel.org 编译和安装所需的或最新的内核 -* update_ubuntu_kernel.sh : Users can able to install & update required or latest precompiled ubuntu kernel from kernel.ubuntu.com +* update_ubuntu_kernel.sh : 用户可以从 kernel.ubuntu.com 安装并更新所需或最新的预编译 Ubuntu 内核 -* remove_old_kernels.sh : This will remove/purge all inactive kernels and will keep only the currently loaded version +* remove_old_kernels.sh : 这将删除或清除所有非活动内核,并且只保留当前加载的版本 -Kernel.org has regular release cycle (every three months once) which comes with new features, Improved Hardware & System Performance. Most of the distributions doesn’t offer/include the latest kernel except rolling release distributions such as Arch Linux, openSUSE Tumbleweed, etc., since it has a standard release cycle. +Kernel.org 有固定的发布周期(每三个月一次),发布内容包括新功能,改进的硬件和系统性能。由于它具有标准的发布周期,除了滚动发布的版本(如 Arch Linux,openSUSE Tumbleweed 等),大多数发行版都不提供最新的内核。 -#### How to Install Linux Kernel Utilities (LKU) +#### 如何安装 Linux Kernel Utilities (LKU) -As we told in the beginning of the article, its set of shell script so just clone the developer github repository and run the appropriate shell file to perform the activity. +正如我们在文章的开头所说的,它的 shell 脚本集只是克隆开发人员的 github 仓库并运行相应的 shell 文件来执行这个过程。 ``` $ git clone https://github.com/mtompkins/linux-kernel-utilities.git && cd linux-kernel-utilities ``` -#### Install Specific kernel +#### 安装指定版本内核 -For testing purpose we are going to install `Linux v4.4.10-xenial` kernel. Before proceeding the new kernel installation we need to check current installed kernel version with help of `uanme -a` command so that we can check whether the new kernel get installed or not? +为了测试的目的,我们将安装 `Linux v4.4.10-xenial` 内核。在安装新内核之前,我们需要通过 `uanme -a` 命令检查当前安装的内核版本,以便我们可以检查新内核是否可以安装 ``` $ uname -a Linux magi-VirtualBox 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux ``` -As per the above output, our system has `4.4.0-21-generic` kernel. +根据上面的输出,我们的系统使用 4.4.0-21 通用内核。 -Just run `update_ubuntu_kernel.sh` shell file. In the very first time script will check whether all dependencies are met or not? and will install missing dependencies automatically. It detect which distribution it is and retrieve Precompiled kernels available from kernel.ubuntu.com. Now, choose your desired kernel from the list and input the value, and hit `Enter` then sit-back because it’s going to download the kernel images (linux-headers-4.4.10, linux-headers-4.4.10-xxx-generic & linux-image-4.4.10-xxx-generic). +只需运行 `update_ubuntu_kernel.sh` shell 文件。第一次运行脚本时会检查是否满足所有的依赖关系,然后自动安装缺少的依赖项。它会检测系统使用的发行版,并检索 kernel.ubuntu.com 中可用的预编译内核。现在,从列表中选择你需要的内核并输入序号,然后按 Enter 键,它将下载内核映像(linux-headers-4.4.10,linux-headers-4.4.10-xxx-generic 和 linux-image-4.4.10-xxx-generic)。 -Once the kernel images get downloaded, it will popup the `sudo` password to start the new kernel installation. +一旦内核镜像被下载,它将要求输入 `sudo` 密码来启动新内核的安装。 ``` $ ./update_ubuntu_kernel.sh @@ -212,22 +210,22 @@ done \_ Done ``` -Post installation do the reboot to use the newly installed kernel. +安装后需要重新启动以使用新安装的内核。 ``` $ sudo reboot now ``` -yes, we are using newly installed kernel `4.4.10-040410-generic` +现在,你正在使用的就是新安装的 `4.4.10-040410-generic` 版本内核。 ``` $ uname -a Linux magi-VirtualBox 4.4.10-040410-generic #201605110631 SMP Wed May 11 10:33:23 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux ``` -#### Install Latest Kernel +#### 安装最新版本内核 -Its same as above but we don’t want to choose the descried one, its automatically install most recent latest kernel. +过程与上述相同,它将自动安装最新版本的内核。 ``` $ ./update_ubuntu_kernel.sh --latest @@ -271,22 +269,22 @@ done \_ Done ``` -Post installation do the reboot to use the newly installed kernel. +安装后需要重新启动以使用新安装的内核。 ``` $ sudo reboot now ``` -yes, we are using newly installed kernel `4.11.3-041103-generic`. +现在,你正在使用的就是最新版本 `4.11.3-041103-generic` 的内核。 ``` $ uname -a Linux magi-VirtualBox 4.11.3-041103-generic #201705251233 SMP Thu May 25 16:34:52 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux ``` -#### Remove/Purge Old Kernel +#### 删除或清除旧内核 -Just run `remove_old_kernels.sh` shell file to remove/purge all inactive kernels. +只需要运行 `remove_old_kernels.sh` shell 文件即可删除或清除所有非活动状态的内核。 ``` $ ./remove_old_kernels.sh @@ -340,7 +338,7 @@ run-parts: executing /etc/kernel/postrm.d/zz-update-grub 4.4.9-040409-lowlatency via: http://www.2daygeek.com/lku-linux-kernel-utilities-compile-install-update-latest-kernel-in-linux-mint-ubuntu/ 作者:[ 2DAYGEEK ][a] -译者:[译者ID](https://github.com/译者ID) +译者:[firmianay](https://github.com/firmianay) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From d9de6413f55cd7a95c492f3a3a71b3be4d41c320 Mon Sep 17 00:00:00 2001 From: firmianay Date: Sat, 29 Jul 2017 23:27:36 +0800 Subject: [PATCH 0839/1407] translating by firmianay --- ...715 DYNAMIC PORT FORWARDING MOUNT A SOCKS SERVER WITH SSH.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170715 DYNAMIC PORT FORWARDING MOUNT A SOCKS SERVER WITH SSH.md b/sources/tech/20170715 DYNAMIC PORT FORWARDING MOUNT A SOCKS SERVER WITH SSH.md index 6ecca0c15a..d393ad4749 100644 --- a/sources/tech/20170715 DYNAMIC PORT FORWARDING MOUNT A SOCKS SERVER WITH SSH.md +++ b/sources/tech/20170715 DYNAMIC PORT FORWARDING MOUNT A SOCKS SERVER WITH SSH.md @@ -1,3 +1,5 @@ +translating by firmianay + DYNAMIC PORT FORWARDING / MOUNT A SOCKS SERVER WITH SSH ================= From 73975c5768dba302cc2ffe708fed43a0ade35c02 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 30 Jul 2017 11:32:43 +0800 Subject: [PATCH 0840/1407] PRF&PUB:20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md @firmianay --- ...ysis How To Install Bro On Ubuntu 16.04.md | 48 ++++++------------- 1 file changed, 14 insertions(+), 34 deletions(-) rename {translated/tech => published}/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md (82%) diff --git a/translated/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md b/published/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md similarity index 82% rename from translated/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md rename to published/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md index 13cb4ba6d9..fc8e3c5db9 100644 --- a/translated/tech/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md +++ b/published/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md @@ -6,21 +6,16 @@ ### 简介:Bro 网络分析框架 -Bro是一个开源网络分析框架,侧重于网络安全监控。这是一项长达 15 年的研究成果,被各大学、研究实验室、超级计算机中心和许多开放科学界广泛使用。它主要由伯克利国际计算机科学研究所和 Urbana-Champaign 国家超级计算机应用中心开发。 +Bro 是一个开源的网络分析框架,侧重于网络安全监控。这是一项长达 15 年的研究成果,被各大学、研究实验室、超级计算机中心和许多开放科学界广泛使用。它主要由伯克利国际计算机科学研究所和伊利诺伊大学厄巴纳-香槟分校的国家超级计算机应用中心开发。 Bro 的功能包括: -* Bro 的脚本语言支持特定站点的监控策略 - +* Bro 的脚本语言支持针对站点定制监控策略 * 针对高性能网络 - * 分析器支持许多协议,可以在应用层面实现高级语义分析 - -* 它保留了关于其监视的网络的广泛应用层统计信息 - +* 它保留了其所监控的网络的丰富的应用层统计信息 * Bro 能够与其他应用程序接口实时地交换信息 - -* 它的日志全面地记录一切信息,并提供网络活动的高级存档 +* 它的日志全面地记录了一切信息,并提供网络活动的高级存档 本教程将介绍如何从源代码构建,并在 Ubuntu 16.04 服务器上安装 Bro。 @@ -29,38 +24,25 @@ Bro 的功能包括: Bro 有许多依赖文件: * Libpcap ([http://www.tcpdump.org][2]) - * OpenSSL 库 ([http://www.openssl.org][3]) - * BIND8 库 - * Libz - * Bash (BroControl 所需要) - * Python 2.6+ (BroControl 所需要) 从源代码构建还需要: * CMake 2.8+ - * Make - * GCC 4.8+ or Clang 3.3+ - * SWIG - * GNU Bison - * Flex - * Libpcap headers - * OpenSSL headers - * zlib headers -### 入门 +### 起步 首先,通过执行以下命令来安装所有必需的依赖项: @@ -68,7 +50,7 @@ Bro 有许多依赖文件: # apt-get install cmake make gcc g++ flex bison libpcap-dev libssl-dev python-dev swig zlib1g-dev ``` -#### 安装定位 IP 地理位置的GeoIP数据库 +#### 安装定位 IP 地理位置的 GeoIP 数据库 Bro 使用 GeoIP 的定位地理位置。安装 IPv4 和 IPv6 版本: @@ -109,7 +91,7 @@ $ ./configure $ make ``` -make 命令需要一些时间来构建一切。确切的时间取决于服务器的性能。 +`make` 命令需要一些时间来构建一切。确切的时间取决于服务器的性能。 可以使用一些参数来执行 `configure` 脚本,以指定要构建的依赖关系,特别是 `--with-*` 选项。 @@ -128,9 +110,7 @@ make 命令需要一些时间来构建一切。确切的时间取决于服务器 Bro 的配置文件位于 `/usr/local/bro/etc` 目录下。 这里有三个文件: * `node.cfg`,用于配置要监视的单个节点(或多个节点)。 - * `broctl.cfg`,BroControl 的配置文件。 - * `networks.cgf`,包含一个使用 CIDR 标记法表示的网络列表。 #### 配置邮件设置 @@ -141,7 +121,7 @@ Bro 的配置文件位于 `/usr/local/bro/etc` 目录下。 这里有三个文 # $EDITOR /usr/local/bro/etc/broctl.cfg ``` -查看 **Mail Options** 选项,并编辑 `MailTo` 行如下: +查看 `Mail Options` 选项,并编辑 `MailTo` 行如下: ``` # Recipient address for emails sent out by Bro and BroControl @@ -150,7 +130,7 @@ MailTo = admin@example.com 保存并关闭。还有许多其他选项,但在大多数情况下,默认值就足够好了。 -#### 选择要监视的节点 +#### 选择要监视的节点 开箱即用,Bro 被配置为以独立模式运行。在本教程中,我们就是做一个独立的安装,所以没有必要改变。但是,也请查看 `node.cfg` 配置文件: @@ -167,11 +147,11 @@ host=localhost interface=eth0 ``` -请确保接口与 Ubuntu 16.04 服务器的公共接口相匹配。 +请确保 `inferface` 与 Ubuntu 16.04 服务器的公网接口相匹配。 保存并退出。 -### 配置监视节点的网络 +#### 配置监视节点的网络 最后一个要编辑的文件是 `network.cfg`。使用文本编辑器打开它: @@ -202,7 +182,7 @@ X.X.X.X/X Private IP space ### 使用 BroControl 管理 Bro 的安装 -管理 Bro 需要使用 BroControl,它以交互式 shell 和命令行工具的形式出现。启动 shell: +管理 Bro 需要使用 BroControl,它支持交互式 shell 和命令行工具两种形式。启动该 shell: ``` # /usr/local/bro/bin/broctl @@ -231,9 +211,9 @@ bro standalone localhost running 6807 20 Jul 12:30:50 via: https://www.unixmen.com/how-to-install-bro-ubuntu-1604/ -作者:[ Giuseppe Molica][a] +作者:[Giuseppe Molica][a] 译者:[firmianay](https://github.com/firmianay) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 5ba385c13c6abc5aee1b975d0f1ae4c16d296d8e Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 30 Jul 2017 15:04:52 +0800 Subject: [PATCH 0841/1407] PRF:20170621 Using Kdump for examining Linux Kernel crashes.md @firmianay --- ...dump for examining Linux Kernel crashes.md | 192 +++++++----------- 1 file changed, 74 insertions(+), 118 deletions(-) diff --git a/translated/tech/20170621 Using Kdump for examining Linux Kernel crashes.md b/translated/tech/20170621 Using Kdump for examining Linux Kernel crashes.md index 3ad176e65f..d4d32f28cc 100644 --- a/translated/tech/20170621 Using Kdump for examining Linux Kernel crashes.md +++ b/translated/tech/20170621 Using Kdump for examining Linux Kernel crashes.md @@ -1,55 +1,40 @@ 使用 Kdump 检查 Linux 内核崩溃 ============================================================ -### 我们先看一下 kdump 使用的基础知识,和 kdump/kexec 内核实现的内部结构。 +> 让我们先看一下 kdump 的基本使用方法,和 kdump/kexec 在内核中是如何实现。 ![Using Kdump for examining Linux Kernel crashes](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/linux_boot.png?itok=pSGmf8Ca "Using Kdump for examining Linux Kernel crashes") -Image by : [Penguin][13], [Boot][14]. Modified by Opensource.com. [CC BY-SA 4.0][15]. +[kdump][16] 是获取崩溃的 Linux 内核转储的一种方法,但是想找到解释其使用和内部结构的文档可能有点困难。在本文中,我将研究 kdump 的基本使用方法,和 kdump/kexec 在内核中是如何实现。 -[Kdump][16] 是获取崩溃的 Linux 内核转储的一种方法,但是想找到解释其使用和内部结构的文档可能有点困难。在本文中,我将研究 kdump 使用的基础知识,并查看 kdump/kexec 内核实现的内部结构。 +[kexec][17] 是一个 Linux 内核到内核的引导加载程序,可以帮助从第一个内核的上下文引导到第二个内核。kexec 会关闭第一个内核,绕过 BIOS 或固件阶段,并跳转到第二个内核。因此,在没有 BIOS 阶段的情况下,重新启动变得更快。 -[Kexec][17] 是一个 Linux 内核到内核的引导加载程序,可以帮助从第一个内核的上下文引导到第二个内核。Kexec 关闭第一个内核,绕过 BIOS 或固件阶段,并跳转到第二个内核。因此,在没有 BIOS 阶段的情况下,重新启动变得更快。 +kdump 可以与 kexec 应用程序一起使用 —— 例如,当第一个内核崩溃时第二个内核启动,第二个内核用于复制第一个内核的内存转储,可以使用 `gdb` 和 `crash` 等工具分析崩溃的原因。(在本文中,我将使用术语“第一内核”作为当前运行的内核,“第二内核” 作为使用 kexec 运行的内核,“捕获内核” 表示在当前内核崩溃时运行的内核。) -Kdump 可以与 kexec 应用程序一起使用 - 例如,当第一个内核崩溃时第二个内核启动,第二个内核用于复制第一个内核的内存转储,可以使用 gdb 和 crash 等工具分析崩溃的原因。(在本文中,我将使用术语 _first kernel_ 作为当前运行的内核,_second kernel_ 作为使用 kexec 运行的内核,_capture kernel_ 表示在当前内核崩溃时运行内核。) - -更多 Linux 资料: - -* [What is Linux?][1] - -* [What are Linux containers?][2] - -* [Download Now: Linux commands cheat sheet][3] - -* [Advanced Linux commands cheat sheet][4] - -* [Our latest Linux articles][5] - -kexec 机制在内核以及用户空间中都有组件。内核提供了几个用于 kexec 重启功能的系统调用。名为 kexec-tools 的用户空间工具使用这些调用,并提供可执行文件来加载和引导第二个内核。有的发行版还会在 kexec-tools 上添加包装器,这有助于捕获并保存各种转储目标配置的转储。在本文中,我将使用名为 distro-kexec-tools 的工具来避免上游 kexec 工具和特定于发行版的 kexec-tools 代码之间的混淆。我的例子将使用 Fedora Linux 发行版。 +kexec 机制在内核以及用户空间中都有组件。内核提供了几个用于 kexec 重启功能的系统调用。名为 kexec-tools 的用户空间工具使用这些调用,并提供可执行文件来加载和引导“第二内核”。有的发行版还会在 kexec-tools 上添加封装器,这有助于捕获并保存各种转储目标配置的转储。在本文中,我将使用名为 distro-kexec-tools 的工具来避免上游 kexec 工具和特定于发行版的 kexec-tools 代码之间的混淆。我的例子将使用 Fedora Linux 发行版。 ### Fedora kexec-tools 工具 -使用 **dnf install kexec-tools** 命令在 Fedora 机器上安装 fedora-kexec-tools。在按章 fedora-kexec-tools 后可以执行 **systemctl start kdump** 命令来启动 kdump 服务。当此服务启动时,它将创建一个根文件系统(initramfs),其中包含了装载目标的资源,用于保存 vmcore,以及复制和转储 vmcore 的命令。然后,该服务将内核和 initramfs 加载到崩溃内核区域内的合适位置,以便在内核崩溃时可以执行它们。 +使用 `dnf install kexec-tools` 命令在 Fedora 机器上安装 fedora-kexec-tools。在安装 fedora-kexec-tools 后可以执行 `systemctl start kdump` 命令来启动 kdump 服务。当此服务启动时,它将创建一个根文件系统(initramfs),其中包含了要挂载到目标位置的资源,以保存 vmcore,以及用来复制和转储 vmcore 到目标位置的命令。然后,该服务将内核和 initramfs 加载到崩溃内核区域内的合适位置,以便在内核崩溃时可以执行它们。 -Fedora 包装器提供了两个用户配置文件: +Fedora 封装器提供了两个用户配置文件: -1. **/etc/kdump.conf** 指定修改后需要重建 initramfs 的配置参数。例如,如果将转储目标从本地磁盘更改为 NFS 装载的磁盘,则需要使用与 NFS 相关的内核模块才能由捕获内核加载。 +1. `/etc/kdump.conf` 指定修改后需要重建 initramfs 的配置参数。例如,如果将转储目标从本地磁盘更改为 NFS 挂载的磁盘,则需要由“捕获内核”所加载的 NFS 相关的内核模块。 +2. `/etc/sysconfig/kdump` 指定修改后不需要重新构建 initramfs 的配置参数。例如,如果只需修改传递给“捕获内核”的命令行参数,则不需要重新构建 initramfs。 -2. **/etc/sysconfig/kdump** 指定修改后不需要重新构建 initramfs 的配置参数。例如,如果只需修改传递给捕获内核的命令行参数,则不需要重新构建 initramfs。 - -如果内核在 kdump 服务启动之后出现故障,那么捕获内核被执行,进一步会执行 initramfs 中的 vmcore 保存过程,然后重新启动到稳定的内核。 +如果内核在 kdump 服务启动之后出现故障,那么“捕获内核”就会执行,其将进一步执行 initramfs 中的 vmcore 保存过程,然后重新启动到稳定的内核。 ### kexec-tools 工具 -编译 kexec-tools 的源代码得到了一个名为 **kexec** 的可执行文件。相同的可执行文件可用于加载和执行第二个内核或加载捕获内核,可以在内核崩溃时执行。 +编译 kexec-tools 的源代码得到了一个名为 `kexec` 的可执行文件。这个同名的可执行文件可用于加载和执行“第二内核”,或加载“捕获内核”,它可以在内核崩溃时执行。 -加载第二个内核的命令: +加载“第二内核”的命令: ``` # kexec -l kernel.img --initrd=initramfs-image.img –reuse-cmdline ``` -**--reuse-command** 参数表示使用与第一个内核相同的命令行。使用 **--initrd** 传递 initramfs。 **-l** 表示正在加载第二个内核,可以由 kexec 应用程序本身执行(**kexec -e**)。使用 **-l** 加载的内核不能在内核崩溃时执行。为了加载可以在内核崩溃时执行的捕获内核,必须传递参数 **-l**。 +`--reuse-command` 参数表示使用与“第一内核”相同的命令行。使用 `--initrd` 传递 initramfs。 `-l` 表明你正在加载“第二内核”,其可以由 `kexec` 应用程序本身执行(`kexec -e`)。使用 `-l` 加载的内核不能在内核崩溃时执行。为了加载可以在内核崩溃时执行的“捕获内核”,必须传递参数 `-p` 取代 `-l`。 加载捕获内核的命令: @@ -57,32 +42,32 @@ Fedora 包装器提供了两个用户配置文件: # kexec -p kernel.img --initrd=initramfs-image.img –reuse-cmdline ``` -**echo c > /pros/sysrq-trigger** 可用于使内核崩溃以进行测试。有关 kexec-tools 提供的选项的详细信息,请参阅 **man kexec**。在转到下一个部分之前,请看这个 kexec_dump 的演示: +`echo c > /pros/sysrq-trigger` 可用于使内核崩溃以进行测试。有关 kexec-tools 提供的选项的详细信息,请参阅 `man kexec`。在转到下一个部分之前,请看这个 kexec_dump 的演示: [kexec_dump_demo (YouTube)](https://www.youtube.com/embed/iOq_rJhrKhA?rel=0&origin=https://opensource.com&enablejsapi=1) -### Kdump: 端到端流 +### kdump: 端到端流 -图 1 展示了流程图。必须在引导第一个内核期间为捕获内核保留 Crashkernel 的内存。您可以在内核命令行中传递 **crashkernel=Y@X**,其中 **@X** 是可选的。**crashkernel=256M** 适用于大多数 x86_64 系统;然而,为崩溃内核选择适当的内存取决于许多因素,如内核大小和 initramfs,以及 initramfs 中包含的模块和应用程序运行时的内存需求。有关传递崩溃内核参数的更多方法,请参阅 [kernel-parameters documentation][18] 文档。 +下图展示了流程图。必须在引导“第一内核”期间为捕获内核保留 crashkernel 的内存。您可以在内核命令行中传递 `crashkernel=Y@X`,其中 `@X` 是可选的。`crashkernel=256M` 适用于大多数 x86_64 系统;然而,为崩溃内核选择适当的内存取决于许多因素,如内核大小和 initramfs,以及 initramfs 中包含的模块和应用程序运行时的内存需求。有关传递崩溃内核参数的更多方法,请参阅 [kernel-parameters 文档][18]。 ![pratyush_f1.png](https://opensource.com/sites/default/files/images/life/pratyush_f1.png) -您可以将内核和 initramfs 镜像传递给 **kexec** 可执行文件,如(**kexec-tools**)部分的命令所示。捕获内核可以与第一个内核相同,也可以不同。通常,保持不变。Initramfs 是可选的;例如,当内核使用 **CONFIG_INITRAMFS_SOURCE** 编译时,您不需要它。通常,从第一个 initramfs 中保存一个不一样的捕获 initramfs,因为在捕获 initramfs 中自动执行 vmcore 的副本能获得更好的效果。当执行 **kexec** 时,它还加载了 **elfcorehdr** 数据和 purgatory 可执行文件。 **elfcorehdr** 具有关于系统内存组织的信息,purgatory 可以在捕获内核执行之前执行并验证第二级二进制或数据是否具有正确的 SHA。Purgatory 也是可选的。 +您可以将内核和 initramfs 镜像传递给 `kexec` 可执行文件,如(`kexec-tools`)部分的命令所示。“捕获内核”可以与“第一内核”相同,也可以不同。通常,一样即可。Initramfs 是可选的;例如,当内核使用 `CONFIG_INITRAMFS_SOURCE` 编译时,您不需要它。通常,从第一个 initramfs 中保存一个不一样的捕获 initramfs,因为在捕获 initramfs 中自动执行 vmcore 的副本能获得更好的效果。当执行 `kexec` 时,它还加载了 `elfcorehdr` 数据和 purgatory 可执行文件(LCTT 译注:purgatory 就是一个引导加载程序,是为 kdump 定作的。它被赋予了“炼狱”这样一个古怪的名字应该只是一种调侃)。 `elfcorehdr` 具有关于系统内存组织的信息,而 purgatory 可以在“捕获内核”执行之前执行并验证第二阶段的二进制或数据是否具有正确的 SHA。purgatory 也是可选的。 -当第一个内核崩溃时,它执行必要的退出过程并切换到 purgatory(如果存在)。Purgatory 验证加载二进制文件的 SHA256,如果是正确的,则将控制权传递给捕获内核。捕获内核根据从 **elfcorehdr** 接收到的系统内存信息创建 vmcore。因此,捕获内核启动后,您将看到 /proc/vmcore 中第一个内核的转储。根据您使用的 initramfs,您现在可以分析转储,将其复制到任何磁盘,也可以是自动复制的,然后重新启动到稳定的内核。 +当“第一内核”崩溃时,它执行必要的退出过程并切换到 purgatory(如果存在)。purgatory 验证加载二进制文件的 SHA256,如果是正确的,则将控制权传递给“捕获内核”。“捕获内核”根据从 `elfcorehdr` 接收到的系统内存信息创建 vmcore。因此,“捕获内核”启动后,您将看到 `/proc/vmcore` 中“第一内核”的转储。根据您使用的 initramfs,您现在可以分析转储,将其复制到任何磁盘,也可以是自动复制的,然后重新启动到稳定的内核。 ### 内核系统调用 -内核提供了两个系统调用:**kexec_load()** 和 **kexec_file_load()**,可以用于在执行 **kexec -l** 时加载第二个内核。它还为 **reboot()** 系统调用提供了一个额外的标志,可用于使用 **kexec -e** 引导到第二个内核。 +内核提供了两个系统调用:`kexec_load()` 和 `kexec_file_load()`,可以用于在执行 `kexec -l` 时加载“第二内核”。它还为 `reboot()` 系统调用提供了一个额外的标志,可用于使用 `kexec -e` 引导到“第二内核”。 -**kexec_load()**:**kexec_load()** 系统调用加载一个可以在之后通过 **reboot()** 执行的新的内核。其原型定义如下: +`kexec_load()`:`kexec_load()` 系统调用加载一个可以在之后通过 `reboot()` 执行的新的内核。其原型定义如下: ``` long kexec_load(unsigned long entry, unsigned long nr_segments, struct kexec_segment *segments, unsigned long flags); ``` -用户空间需要为不同的组件传递不同的段,如内核,initramfs 等。因此,**kexec** 可执行文件有助于准备这些段。**kexec_segment** 的结构如下所示: +用户空间需要为不同的组件传递不同的段,如内核,initramfs 等。因此,`kexec` 可执行文件有助于准备这些段。`kexec_segment` 的结构如下所示: ``` struct kexec_segment { @@ -97,9 +82,9 @@ struct kexec_segment { }; ``` -当使用 **LINUX_REBOOT_CMD_KEXEC** 调用 **reboot()** 时,它会引导进入由 **kexec_load** 加载的内核。如果标志 **KEXEC_ON_CRASH** 被传递给 **kexec_load()**,则加载的内核将不会使用 **reboot(LINUX_REBOOT_CMD_KEXEC)** 来启动;相反,这将在内核崩溃中执行。必须定义 **CONFIG_KEXEC** 才能使用 **kexec**,并且为 kdump 定义 **CONFIG_CRASH_DUMP**。 +当使用 `LINUX_REBOOT_CMD_KEXEC` 调用 `reboot()` 时,它会引导进入由 `kexec_load` 加载的内核。如果标志 `KEXEC_ON_CRASH` 被传递给 `kexec_load()`,则加载的内核将不会使用 `reboot(LINUX_REBOOT_CMD_KEXEC)` 来启动;相反,这将在内核崩溃中执行。必须定义 `CONFIG_KEXEC` 才能使用 `kexec`,并且为 `kdump` 定义 `CONFIG_CRASH_DUMP`。 -**kexec_file_load()**:作为用户,你只需传递两个参数(即 kernel 和 initramfs)到 **kexec** 可执行文件。然后,**kexec** 从 sysfs 或其他内核信息源中读取数据,并创建所有段。所以使用 **kexec_file_load()** 可以简化用户空间,只传递内核和 initramfs 的文件描述符。其余部分由内核本身完成。使用此系统调用时应该启用 **CONFIG_KEXEC_FILE**。它的原型如下: +`kexec_file_load()`:作为用户,你只需传递两个参数(即 `kernel` 和 `initramfs`)到 `kexec` 可执行文件。然后,`kexec` 从 sysfs 或其他内核信息源中读取数据,并创建所有段。所以使用 `kexec_file_load()` 可以简化用户空间,只传递内核和 initramfs 的文件描述符。其余部分由内核本身完成。使用此系统调用时应该启用 `CONFIG_KEXEC_FILE`。它的原型如下: ``` long kexec_file_load(int kernel_fd, int initrd_fd, unsigned long @@ -107,33 +92,27 @@ cmdline_len, const char __user * cmdline_ptr, unsigned long flags); ``` -请注意,**kexec_file_load** 也可以接受命令行,而 **kexec_load()** 不行。内核根据不同的系统架构来接受和执行命令行。因此,在 **kexec_load()** 的情况下,**kexec-tools** 将通过其中一个段(如在 **dtb** 或 **ELF** 引导注释等)中传递命令行。 +请注意,`kexec_file_load` 也可以接受命令行,而 `kexec_load()` 不行。内核根据不同的系统架构来接受和执行命令行。因此,在 `kexec_load()` 的情况下,`kexec-tools` 将通过其中一个段(如在 dtb 或 ELF 引导注释等)中传递命令行。 -目前,**kexec_file_load()** 仅支持 x86 和 PowerPC。 +目前,`kexec_file_load()` 仅支持 x86 和 PowerPC。 -### 当内核崩溃时会发生什么 +#### 当内核崩溃时会发生什么 -当第一个内核崩溃时,在控制权传递给 purgatory 或捕获内核之前,会执行以下操作: +当第一个内核崩溃时,在控制权传递给 purgatory 或“捕获内核”之前,会执行以下操作: -* 准备 CPU 寄存器(参见内核代码中的 **crash_setup_regs()**); +* 准备 CPU 寄存器(参见内核代码中的 `crash_setup_regs()`); +* 更新 vmcoreinfo 备注(请参阅 `crash_save_vmcoreinfo()`); +* 关闭非崩溃的 CPU 并保存准备好的寄存器(请参阅 `machine_crash_shutdown()` 和 `crash_save_cpu()`); +* 您可能需要在此处禁用中断控制器; +* 最后,它执行 kexec 重新启动(请参阅 `machine_kexec()`),它将加载或刷新 kexec 段到内存,并将控制权传递给进入段的执行文件。输入段可以是下一个内核的 purgatory 或开始地址。 -* 更新 vmcoreinfo 备注(请参阅 **crash_save_vmcoreinfo()**); +#### ELF 程序头 -* 关闭非崩溃的 CPU 并保存准备好的寄存器(请参阅 **machine_crash_shutdown()** 和 **crash_save_cpu()**); - -* 您可能需要在此处禁用中断控制器; - -* 最后,它执行 kexec 重新启动(请参阅 **machine_kexec()**),它将加载或刷新 kexec 段到内存,并将控制权传递给进入段的执行文件。输入段可以是下一个内核的 purgatory 或开始地址。 - -### ELF 程序头 - -kdump中涉及的大多数转储核心都是 ELF 格式。因此,理解 ELF 程序头部很重要,特别是当您想要找到 vmcore 准备的问题。每个 ELF 文件都有一个程序头: +kdump 中涉及的大多数转储核心都是 ELF 格式。因此,理解 ELF 程序头部很重要,特别是当您想要找到 vmcore 准备的问题。每个 ELF 文件都有一个程序头: * 由系统加载器读取, - * 描述如何将程序加载到内存中, - -* 可以使用 **Objdump -p elf_file** 来查看程序头。 +* 可以使用 `Objdump -p elf_file` 来查看程序头。 vmcore 的 ELF 程序头的示例如下: @@ -160,43 +139,36 @@ LOAD off 0x00000003807f0000 vaddr 0xffff8003ff9f0000 paddr 0x00000043ff9f0000 al 在这个例子中,有一个 note 段,其余的是 load 段。note 段提供了有关 CPU 信息,load 段提供了关于复制的系统内存组件的信息。 -Vmcore 从 **elfcorehdr** 开始,它具有与 ELF 程序头相同的结构。参见图 2 中 **elfcorehdr** 的表示: +vmcore 从 `elfcorehdr` 开始,它具有与 ELF 程序头相同的结构。参见下图中 `elfcorehdr` 的表示: ![pratyush_f2.png](https://opensource.com/sites/default/files/images/life/pratyush_f2.png) -**kexec-tools** 读取 /sys/devices/system/cpu/cpu%d/crash_notes 并准备 **CPU PT_NOTE** 的头文件。同样,它读取 **/sys/kernel/vmcoreinfo** 并准备 **vmcoreinfo PT_NOTE** 的头文件,从 **/proc/iomem** 读取系统内存并准备存储器 **PT_LOAD** 标头。当捕获内核接收到 **elfcorehdr** 时,它从头文件中提到的地址中读取数据,并准备 vmcore。 +`kexec-tools` 读取 `/sys/devices/system/cpu/cpu%d/crash_notes` 并准备 `CPU PT_NOTE` 的标头。同样,它读取 `/sys/kernel/vmcoreinfo` 并准备 `vmcoreinfo PT_NOTE` 的标头,从 `/proc/iomem` 读取系统内存并准备存储器 `PT_LOAD` 标头。当“捕获内核”接收到 `elfcorehdr` 时,它从标头中提到的地址中读取数据,并准备 vmcore。 -### Crash notes +#### Crash note -Crash notes 是每个 CPU 中用于在系统崩溃的情况下存储 CPU 状态的区域; 它有关于当前 PID 和 CPU 寄存器的信息。 +Crash notes 是每个 CPU 中用于在系统崩溃的情况下存储 CPU 状态的区域;它有关于当前 PID 和 CPU 寄存器的信息。 -### vmcoreinfo +#### vmcoreinfo -该 note 段具有各种内核调试信息,如结构体大小、符号值、页面大小等。这些值由捕获内核解析并嵌入到 **/proc/vmcore** 中。 vmcoreinfo 主要由 **makedumpfile** 应用程序使用。在 Linux 内核,**include/linux/kexec.h** 宏定义了一个新的 **vmcoreinfo**。 一些示例宏如下所示: +该 note 段具有各种内核调试信息,如结构体大小、符号值、页面大小等。这些值由捕获内核解析并嵌入到 `/proc/vmcore` 中。 `vmcoreinfo` 主要由 `makedumpfile` 应用程序使用。在 Linux 内核,`include/linux/kexec.h` 宏定义了一个新的 `vmcoreinfo`。 一些示例宏如下所示: -* **VMCOREINFO_PAGESIZE()** +* `VMCOREINFO_PAGESIZE()` +* `VMCOREINFO_SYMBOL()` +* `VMCOREINFO_SIZE()` +* `VMCOREINFO_STRUCT_SIZE()` -* **VMCOREINFO_SYMBOL()** +#### makedumpfile -* **VMCOREINFO_SIZE()** - -* **VMCOREINFO_STRUCT_SIZE()** - -### makedumpfile - -vmcore 中的许多信息(如可用页面)都没有用处。Makedumpfile 是一个用于排除不必要的页面的应用程序,如: - -* 填满零的页面, - -* 没有私有标志的缓存页面(非专用缓存); +vmcore 中的许多信息(如可用页面)都没有用处。`makedumpfile` 是一个用于排除不必要的页面的应用程序,如: +* 填满零的页面; +* 没有私有标志的缓存页面(非专用缓存); * 具有私有标志的缓存页面(专用缓存); - -* 用户进程数据页; - +* 用户进程数据页; * 可用页面。 -此外,makedumpfile 在复制时压缩 **/proc/vmcore** 的数据。它也可以从转储中删除敏感的符号信息; 然而,为了做到这一点,它首先需要内核的调试信息。该调试信息来自 **VMLINUX** 或 **vmcoreinfo**,其输出可以是 ELF 格式或 kdump 压缩格式。 +此外,`makedumpfile` 在复制时压缩 `/proc/vmcore` 的数据。它也可以从转储中删除敏感的符号信息; 然而,为了做到这一点,它首先需要内核的调试信息。该调试信息来自 `VMLINUX` 或 `vmcoreinfo`,其输出可以是 ELF 格式或 kdump 压缩格式。 典型用法: @@ -204,88 +176,72 @@ vmcore 中的许多信息(如可用页面)都没有用处。Makedumpfile 是 # makedumpfile -l --message-level 1 -d 31 /proc/vmcore makedumpfilecore ``` -详细信息请参阅 **man makedumpfile**。 +详细信息请参阅 `man makedumpfile`。 ### kdump 调试 新手在使用 kdump 时可能会遇到的问题: -### _Kexec -p kernel_image_  没有成功 +#### `Kexec -p kernel_image`  没有成功 * 检查是否分配了崩溃内存。 +* `cat /sys/kernel/kexec_crash_size` 不应该有零值。 +* `cat /proc/iomem | grep "Crash kernel"` 应该有一个分配的范围。 +* 如果未分配,则在命令行中传递正确的 `crashkernel=` 参数。 +* 如果没有显示,则在 `kexec` 命令中传递参数 `-d`,并将输出信息发送到 kexec-tools 邮件列表。 -* **cat /sys/kernel/kexec_crash_size** 不应该有零值。 - -* **cat /proc/iomem | grep "Crash kernel"** 应该有一个分配的范围。 - -* 如果未分配,则在命令行中传递正确的 **crashkernel=** 参数。 - -* 如果没有显示,则在 **kexec** 命令中传递参数 **-d**,并使用 kexec-tools 邮件列表共享调试输出。 - -### 在第一个内核的最后一个消息之后,在控制台上看不到任何东西(比如“bye”) - -* 检查 **kexec -e** 之后的 **kexec -l kernel_image** 命令是否工作。 +#### 在“第一内核”的最后一个消息之后,在控制台上看不到任何东西(比如“bye”) +* 检查 `kexec -e` 之后的 `kexec -l kernel_image` 命令是否工作。 * 可能缺少支持的体系结构或特定机器的选项。 - * 可能是 purgatory 的 SHA 验证失败。如果您的体系结构不支持 purgatory 中的控制台,则很难进行调试。 - -* 可能是第二个内核早已崩溃。 - -* 将您的系统的 **earlycon** 或 **earlyprintk** 选项传递给第二个内核的命令行。 - -* 使用 kexec-tools 邮件列表共享第一个内核和捕获内核的 **dmesg** 日志。 +* 可能是“第二内核”早已崩溃。 +* 将您的系统的 `earlycon` 或 `earlyprintk` 选项传递给“第二内核”的命令行。 +* 使用 kexec-tools 邮件列表共享第一个内核和捕获内核的 `dmesg` 日志。 ### 资源 #### fedora-kexec-tools -* 存储库: **git://pkgs.fedoraproject.org/kexec-tools** - +* GitHub 仓库:`git://pkgs.fedoraproject.org/kexec-tools` * 邮件列表:[kexec@lists.fedoraproject.org][7] - -* 说明:规定的文件和脚本提供了用户友好的命令和服务,以便 **kexec-tools** 可以在不同的用户场景下实现自动化。 +* 说明:Specs 文件和脚本提供了用户友好的命令和服务,以便 `kexec-tools` 可以在不同的用户场景下实现自动化。 #### kexec-tools -* 存储库: git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git - +* GitHub 仓库:git://git.kernel.org/pub/scm/utils/kernel/kexec/kexec-tools.git * 邮件列表:[kexec@lists.infradead.org][8] - -* 说明:使用内核系统调用并提供用户命令 **kexec**。 +* 说明:使用内核系统调用并提供用户命令 `kexec`。 #### Linux kernel -* 存储库: **git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git** - +* GitHub 仓库: `git://git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git` * 邮件列表:[kexec@lists.infradead.org][9] - -* 说明:实现了 **kexec_load()**、**kexec_file_load()**、**reboot()** 系统调用和特定体系结构的代码,例如 **machine_kexec()** 和 **machine_crash_shutdown()**。 +* 说明:实现了 `kexec_load()`、`kexec_file_load()`、`reboot()` 系统调用和特定体系结构的代码,例如 `machine_kexec()` 和 `machine_crash_shutdown()`。 #### Makedumpfile -* 存储库: **git://git.code.sf.net/p/makedumpfile/code** - +* GitHub 仓库: `git://git.code.sf.net/p/makedumpfile/code` * 邮件列表:[kexec@lists.infradead.org][10] - * 说明:从转储文件中压缩和过滤不必要的组件。 - _Learn more in Pratyush Anand's [KDUMP: Usage and Internals][11] talk at LinuxCon ContainerCon CloudOpen China on June 20, 2017._ +(题图:[Penguin][13]、 [Boot][14],修改:Opensource.com. [CC BY-SA 4.0][15]) -------------------------------------------------------------------------------- 作者简介: -Pratyush Anand - Pratyush 正在与 Red Hat 合作,作为 Linux 内核通才。他主要负责 Red Hat 产品和上游所面临的几个 kexec/kdump 问题。他还处理 Red Hat 支持的 ARM64 平台周围的其他内核调试、跟踪和性能问题。除了 Linux 内核,他还在上游的 kexec-tools 和 makedumpfile 项目中做出了贡献。他是一名开源爱好者,并在教育机构举办志愿者讲座,促进了 FOSS。 +Pratyush Anand - Pratyush 正在以以为 Linux 内核专家的身份与 Red Hat 合作。他主要负责 Red Hat 产品和上游所面临的几个 kexec/kdump 问题。他还处理 Red Hat 支持的 ARM64 平台周围的其他内核调试、跟踪和性能问题。除了 Linux 内核,他还在上游的 kexec-tools 和 makedumpfile 项目中做出了贡献。他是一名开源爱好者,并在教育机构举办志愿者讲座,促进了 FOSS。 + ------- via: https://opensource.com/article/17/6/kdump-usage-and-internals -作者:[Pratyush Anand ][a] +作者:[Pratyush Anand][a] 译者:[firmianay](https://github.com/firmianay) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 3f0c500d7b521425bc9e061f0607d003a16b05f3 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 30 Jul 2017 15:06:34 +0800 Subject: [PATCH 0842/1407] PUB:20170621 Using Kdump for examining Linux Kernel crashes.md @firmianay --- .../20170621 Using Kdump for examining Linux Kernel crashes.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170621 Using Kdump for examining Linux Kernel crashes.md (100%) diff --git a/translated/tech/20170621 Using Kdump for examining Linux Kernel crashes.md b/published/20170621 Using Kdump for examining Linux Kernel crashes.md similarity index 100% rename from translated/tech/20170621 Using Kdump for examining Linux Kernel crashes.md rename to published/20170621 Using Kdump for examining Linux Kernel crashes.md From 68d8eedac1c49ad79a117665d9bc0bf37c28a5d3 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 30 Jul 2017 15:58:04 +0800 Subject: [PATCH 0843/1407] PRF&PUB:20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md @geekpi --- ...ce Unified Block List With Whitelisting.md | 109 ++++++++++++++++++ ...ce Unified Block List With Whitelisting.md | 90 --------------- 2 files changed, 109 insertions(+), 90 deletions(-) create mode 100644 published/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md delete mode 100644 translated/tech/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md diff --git a/published/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md b/published/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md new file mode 100644 index 0000000000..4f8dc92a91 --- /dev/null +++ b/published/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md @@ -0,0 +1,109 @@ +使用统一阻止列表和白名单来更新主机文件 +============================================================ + +![](https://irp-cdn.multiscreensite.com/58a25abc/dms3rep/multi/desktop/host-400x300.jpg) + +网上有许多持续维护的含有不同垃圾域的有用列表。将这些列表复制到你的主机文件中可以轻松阻止大量的域,你的系统将根本不用去连接它们。此方法可以在不安装浏览器插件的情况下工作,并且将为系统上任何浏览器(和任何其他程序)提供阻止操作。 + +在本教程中,我将向你展示如何在 Linux 中启动并运行 Steven Black 的[统一主机脚本][1]。该脚本将使用来自多个来源的最新已知的广告服务器、网络钓鱼网站和其他网络垃圾的地址来更新你的计算机主机文件,同时提供一个漂亮、干净的方式来管理你自己的黑名单/白名单,其分别来自于该脚本管理的各个列表。 + +在将 30,000 个域放入主机文件之前,需要注意两点。首先,这些巨大的列表包含可能需要解除封锁的服务器,以便进行在线购买或其他一些临时情况。如果你弄乱了你的主机文件,你要知道网上的某些东西可能会出现问题。为了解决这个问题,我将向你展示如何使用方便的打开/关闭开关,以便你可以快速禁用你的阻止列表来购买喜马拉雅盐雾灯(它是等离子灯)。我仍然认为这些列表的目的之一是将所有的一切都封锁(有点烦人,直到我想到了做一个关闭开关)。如果你经常遇到你需要的服务器被阻止的问题,只需将其添加到白名单文件中即可。 + +第二个问题是性能受到了轻微的影响, 因为每次调用一个域时, 系统都必须检查整个列表。只是有一点点影响, 而没有大到让我因此而放弃黑名单,让每一个连接都通过。你具体要怎么选择自己看着办。 + +主机文件通过将请求定向到 127.0.0.1 或 0.0.0.0(换句话说定向到空地址)来阻止请求。有人说使用 0.0.0.0 是更快,问题更少的方法。你可以将脚本配置为使用 `-ip nnn.nnn.nnn.nnn` 这样的 ip 选项来作为阻止 ip,但默认值是 0.0.0.0,这是我使用的值。 + +我曾经将 Steven Black 的脚本做的事每隔一段时间就手动做一遍,进到每一个站点,将他们的列表拷贝/粘贴到我的主机文件中,做一个查找替换将其中的 127 变成 0 等等。我知道整件事情可以自动化,这样做有点傻,但我从来没有花时间解决这个问题。直到我找到这个脚本,现在这事已经是一个被遗忘的杂务。 + +让我们先下载一份最新的 Steven Black 的代码拷贝(大约 150MB),以便我们可以进行下一步。你需要安装 git,因此如果还没安装,进入到终端输入: + +``` +sudo apt-get install git +``` + +安装完之后,输入: + +``` +mkdir unifiedhosts  +cd unifiedhosts +git clone https://github.com/StevenBlack/hosts.git +cd hosts +``` + +当你打开了 Steven 的脚本时,让我们来看看有什么选项。该脚本有几个选项和扩展,但扩展我不会在这里提交,但如果你到了这一步并且你有兴趣,[readme.md][3] 可以告诉你所有你需要知道的。 + +你需要安装 python 来运行此脚本,并且与版本有关。要找到你安装的 Python 版本,请输入: + +``` +python --version +``` + +如果你还没安装 Python: + +``` +sudo apt-get install python +``` + +对于 Python 2.7,如下所示,输入 `python` 来执行脚本。对于 Python 3,在命令中的 `python` 替换成 `python3`。执行后,该脚本会确保它具有每个列表的最新版本,如果没有,它会抓取一个新的副本。然后,它会写入一个新的主机文件,包括了你的黑名单/白名单中的任何内容。让我们尝试使用 `-r` 选项来替换我们的当前的主机文件,而 `-a` 选项可以脚本不会问我们任何问题。回到终端: + +``` +python updateHostsFile.py -r -a +``` + +该命令将询问你的 root 密码,以便能够写入 `/etc/`。为了使新更新的列表处于激活状态,某些系统需要清除 DNS 缓存。在同一个硬件设备上,我观察到不同的操作系统表现出非常不同的行为,在没有刷新缓存的情况下不同的服务器变为可访问/不可访问所需的时间长度都不同。我已经看到了从即时更新(Slackware)到重启更新(Windows)的各种情况。有一些命令可以刷新 DNS 缓存,但是它们在每个操作系统甚至每个发行版上都不同,所以如果没有生效,只需要重新启动就行了。 + +现在,只要将你的个人例外添加到黑名单/白名单中,并且只要你想要更新主机文件,运行该脚本就好。该脚本将根据你的要求调整生成的主机文件,每次运行文件时会自动追加你额外的列表。 + +最后,我们来创建一个打开/关闭开关,对于打开和关闭功能每个都创建一个脚本,所以回到终端输入下面的内容创建关闭开关(用你自己的文本编辑器替换 leafpad): + +``` +leafpad hosts-off.sh +``` + +在新文件中输入下面的内容: + +``` +#!/bin/sh +sudo mv /etc/hosts /etc/hostsDISABLED +``` + +接着让它可执行: + +``` +chmod +x hosts-off.sh +``` + +相似地,对于打开开关: + +``` +leafpad hosts-on.sh +``` +在新文件中输入下面的内容: + +``` +#!/bin/sh +sudo mv /etc/hostsDISABLED /etc/hosts +``` + +最后让它可执行: + +``` +chmod +x hosts-on.sh +``` + +你所需要做的是为每个脚本创建一个快捷方式,标记为 HOSTS-ON 和 HOSTS-OFF,放在你能找到它们的地方。 + +-------------------------------------------------------------------------------- + +via: https://www.darrentoback.com/this-script-updates-hosts-files-using-a-multi-source-unified-block-list-with-whitelisting + +作者:[dmt][a] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.darrentoback.com/about-me +[1]:https://github.com/StevenBlack/hosts +[2]:https://github.com/StevenBlack/hosts.git +[3]:https://github.com/StevenBlack/hosts/blob/master/readme.md diff --git a/translated/tech/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md b/translated/tech/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md deleted file mode 100644 index 3844f1c586..0000000000 --- a/translated/tech/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md +++ /dev/null @@ -1,90 +0,0 @@ -此脚本使用含多来源统一阻止列表的白名单来更新主机文件 -============================================================ - - ![](https://irp-cdn.multiscreensite.com/58a25abc/dms3rep/multi/desktop/host-400x300.jpg) - -网上有许多持续维护的含有不同垃圾域的有用列表。将这些列表复制到你的主机文件中可以轻松阻止大量的域,你的系统则无法连接它们。此方法在不安装浏览器插件的情况下工作,并且将处理系统上任何浏览器(和任何其他程序)的阻止操作。 - -在本教程中,我将向你展示如何在 Linux 中启动并运行 Steven Black 的[统一主机脚本][1]。该脚本将使用最新的已知广告服务器、网络钓鱼网站和其他网络垃圾邮件更新(多个来源)的计算机主机文件,同时提供一个漂亮、干净的方式来管理自己的黑名单/白名单,与脚本管理的列表分开管理。 - -在将 30,000 个域放入主机文件之前,需要注意两点。首先,这些巨大的列表包含可能需要解除封锁的服务器,以便进行在线购买或其他一些临时情况。当网上的事情出现问题时,你会意识到你遇到一个麻烦了,因为你搞砸了你的主机文件。为了解决这个问题,我将向你展示如何使用方便的打开/关闭开关,以便你可以快速禁用阻止列表购买喜马拉雅盐雾灯(它是等离子灯)。我仍然认为这些列表的一个特点是将所有的一切都封锁(这只是烦人,直到我想到了关闭开关)。如果你经常遇到你需要的服务器被阻止的问题,只需将其添加到白名单文件中即可。 - -第二个问题是性能受到了轻微的影响, 因为每次调用一个域时, 系统都必须检查整个列表。也许会有一个小的命中, 但不够大, 因此我放弃名单, 让每一个连接都通过。但是, 请你自己考虑。 - -主机文件通过将请求定向到 127.0.0.1 或 0.0.0.0(换句话说定向到空地址)来阻止请求。有人说使用 0 是更快,问题更少的方法。你可以将脚本配置为使用 “-ip nnn.nnn.nnn.nnn” 这样的 ip -选项来作为阻止 ip, 但默认值是 0.0.0.0, 这是我使用的值。 - - -我曾经将 Steven 脚本做的事每隔一段时间就手动做一遍,进到每一个站点,将他们的列表拷贝/粘贴到我的主机文件中,做一个查找替换将其中一些变成 0 等等。我知道整件事情可以自动化,这样做有点傻,但我从来没有花时间解决这个问题。直到我找到这个脚本, 现在这已经是一个被遗忘的杂务。 - -让我们先下载一份 Black 代码拷贝(大约 150MB),以便我们可以进行下一步。你需要安装 git,因此如果还没安装,进入到终端输入: - -**sudo apt-get install git**  - -安装完之后,输入: - -**mkdir unifiedhosts**  -**cd unifiedhosts**  -**git clone** [**https://github.com/StevenBlack/hosts.git** ][2] -**cd hosts**  - -当您的光标在 Steven 的脚本中闪烁时,让我们来谈谈选择。该脚本有几个选项和扩展,但扩展我不会在这里覆盖,但如果你到了这一步并且你有兴趣,[readme.md][3] 可以告诉你所有你需要知道的。 - -你需要安装 python 来运行此脚本,并且与版本有关。要找到你安装的 Python 版本,请输入: - -**python --version**  - -如果你还没安装 Python: - -**sudo apt-get install python**  - -对于 Python 2.7,如下所示,输入 “python” 来执行脚本。对于 Python 3,在命令中的 “python” 替换成 “python3”。执行后,该脚本会确保它具有每个列表的最新版本,如果没有,它会抓取一个新的副本。然后,它会写入一个新的 hosts 文件,包括了黑名单/白名单中的任何内容。让我们尝试使用 -r 选项来替换我们的活动主机文件以及 -a 选项,以便脚本不会发生任何问题。回到终端: - -**python updateHostsFile.py -r -a**  - -该命令将询问你的密码,以便能够写入 /etc/。为了使新更新的列表处于活动状态,某些系统需要清除 DNS 缓存。在同一个硬件上,我观察到不同的操作系统表现出非常不同的行为,在没有刷新缓存的情况下不同的服务器变为可访问/不可访问所需的时间长度都不同。我已经看到了从即时(Slackware)到重启更新(Windows)的所有情况。有一些命令可以刷新 DNS 缓存,但是它们在每个操作系统甚至每个发行版上都不同,所以如果没有生效,只需要重新启动就行了。 - -现在,只要将你的个人例外添加到黑名单/白名单中,并且只要你想要更新主机文件,运行该脚本就好。该脚本将根据你的要求调整生成的主机文件,每次运行文件时会自动追加你额外的列表。 - -最后,我们来创建一个打开/关闭开关。我们每个功能都需要一个脚本,所以回到终端输入下面的内容创建关闭开关(用你自己的文本编辑器替换 leafpad): - -**leafpad hosts-off.sh**  - -在新文件中输入下面的内容: - -**#!/bin/sh**  -**sudo mv /etc/hosts /etc/hostsDISABLED**  - -接着让它可执行: - -**chmod +x hosts-off.sh**  - -相似地,对于打开开关: - -**leafpad hosts-on.sh -** -在新文件中输入下面的内容: - -**#!/bin/sh**  -**sudo mv /etc/hostsDISABLED /etc/hosts -** -最后让它可执行: - -**chmod +x hosts-on.sh - -**你所需要做的是为每个脚本创建一个快捷方式,标记它们的 HOSTS-ON 和 HOSTS-OFF,你就能找到它们了。 - --------------------------------------------------------------------------------- - -via: https://www.darrentoback.com/this-script-updates-hosts-files-using-a-multi-source-unified-block-list-with-whitelisting - -作者:[dmt][a] -译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.darrentoback.com/about-me -[1]:https://github.com/StevenBlack/hosts -[2]:https://github.com/StevenBlack/hosts.git -[3]:https://github.com/StevenBlack/hosts/blob/master/readme.md From a52700390879232cac6ed8b5c9ed4247c53f4500 Mon Sep 17 00:00:00 2001 From: SunWave Date: Sun, 30 Jul 2017 16:42:41 +0800 Subject: [PATCH 0844/1407] Delete 20170718 Things to consider when building a robot with open source.md --- ... when building a robot with open source.md | 57 ------------------- 1 file changed, 57 deletions(-) delete mode 100644 sources/tech/20170718 Things to consider when building a robot with open source.md diff --git a/sources/tech/20170718 Things to consider when building a robot with open source.md b/sources/tech/20170718 Things to consider when building a robot with open source.md deleted file mode 100644 index b25a8ecc7a..0000000000 --- a/sources/tech/20170718 Things to consider when building a robot with open source.md +++ /dev/null @@ -1,57 +0,0 @@ -Translating by Sunwave - -Things to consider when building a robot with open source -============================================== - - -### Share or save - -![](https://insights.ubuntu.com/wp-content/uploads/fbfc/flashing.png) - -So you’re considering (or are in the process of) bringing a robot, using open source software, to market. It’s based on Linux. Maybe you’re using the [Robot Operating System][2] (ROS), or the [Mission Oriented Operating Suite][3] (MOOS), or yet another open-source middleware that’s helping you streamline development. As development nears something useful, you start receiving some pressure about desired returns on this thing. You might be asked ‘When can we start selling it?’ This is where you reach a crossroads. - -You can do one of two things: - -1. Start shipping essentially what you have now - -2. Step back, and treat going to production as an entirely new problem to solve, with new questions to answer - -You don’t need to look very far to see examples of people who settled on (1). In fact, the IoT market is flooded with them. With the rush to get devices to market, it’s not at all rare to find devices left with hard-coded credentials, development keys, various security vulnerabilities, and no update path. - -Think of Mirai, the botnet that mounted a DDoS attack with traffic surpassing 1Tbps, bringing down some of the biggest websites on the Internet. It’s made up primarily of IoT devices. Does it use super cool black magic developed in a windowless lab (or basement) to overwhelm the devices’ defenses and become their master? Nope, default (and often hard-coded) credentials. Did the manufacturers of these devices react quickly and release updates to all these devices in order to secure them? No, many of them don’t have an update method at all. [They recalled them instead][4]. - -Rather than rushing to market, take a step back. You can save yourself and your company a lot of pain simply by thinking through a few points. - -For example, **how is your software updated**? You  _must_  be able to answer this question. Your software is not perfect. In a few weeks you’ll find out that, when your autonomous HMMWV is used in California, it thinks that little sagebrush is an oak. Or you accidentally included your SSH keys. - -**How is the base OS updated**? Perhaps this is still part of your product, and answering the above question answers this one as well. But perhaps your OS comes from another vendor. How do you get updates from them to your customers? This is where security vulnerabilities can really bite you: a kernel that is never updated, or a severely out-of-date openssl. - -Once you have updates figured out, **how is your robot recovered if an update goes sideways**? My go-to example for this is a common solution to the previous problem: automatic security updates. That’s a great practice for servers and desktops and things that are obviously computers, because most people realize that there’s an acceptable way to turn those off, and it’s  _not_  to hold the power button for 5 seconds. Robotic systems (and IoT systems in general) have a bit of an issue in that sometimes they’re not viewed as computers at all. If your robot is behaving oddly, chances are it will be forcefully powered off. If it was behaving oddly because it was installing a kernel update real quick, well, now you have a robotic paperweight with a partially installed kernel. You need to be able to deal with this type of situation. - -Finally, **what is your factory process**? How do you install Linux, ROS (or whatever middleware you’re using), and your own stuff on a device you’re about to ship? Small shops might do it by hand, but that doesn’t scale and is error-prone. Others might make a custom seeded distro ISO, but that’s no small task and it’s not easy to maintain as you update your software. Still others use Chef or some other automation tool with a serious learning curve, and before long you realize that you dumped a significant amount of engineering effort into something that should have been easy. - -All of these questions are important. If you find yourself not having clear answers to any of them, you should join our webinar, where we discuss how to build a commercial robot with open source. We’ll help you think through these questions, and be available to answer any more you have! - --------------------------------------------------------------------------------- - -作者简介: - -Kyle is a member of the Snapcraft team, and is also Canonical's resident roboticist. He focuses on snaps and the snap developer experience, as well as robotics enablement for snaps and Ubuntu Core. - - - ------------ - -via: https://insights.ubuntu.com/2017/07/18/things-to-consider-when-building-a-robot-with-open-source/ - -作者:[Kyle Fazzari ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://insights.ubuntu.com/author/kyrofa/ -[1]:https://insights.ubuntu.com/author/kyrofa/ -[2]:http://www.ros.org/ -[3]:http://www.robots.ox.ac.uk/~mobile/MOOS/wiki/pmwiki.php/Main/HomePage -[4]:https://krebsonsecurity.com/2016/10/iot-device-maker-vows-product-recall-legal-action-against-western-accusers/ From 5403018ddef7e76815edf5d5eadaa8c21c73f869 Mon Sep 17 00:00:00 2001 From: SunWave Date: Sun, 30 Jul 2017 16:57:39 +0800 Subject: [PATCH 0845/1407] Create 20170718 Things to consider when building a robot with open source.md --- ... when building a robot with open source.md | 23 +++++++++++++++++++ 1 file changed, 23 insertions(+) create mode 100644 translated/tech/20170718 Things to consider when building a robot with open source.md diff --git a/translated/tech/20170718 Things to consider when building a robot with open source.md b/translated/tech/20170718 Things to consider when building a robot with open source.md new file mode 100644 index 0000000000..0df508d7aa --- /dev/null +++ b/translated/tech/20170718 Things to consider when building a robot with open source.md @@ -0,0 +1,23 @@ +使用开源构建机器人时需要考虑的事项 + +或许你正在考虑(或正在进行)将机器人使用开源软件推向市场。这个机器人是基于linux构建的。也许你正在使用机器人操作系统(ROS)或任务导向的操作套件(MODS),或者是另外一个可以帮助你简化开发过程的开源中间件。当开发接近实用化,期望得到回报会开始给你带来一些压力。你可能会被问到“我们的产品什么时候可以开始销售?”,这时你将面临重要的抉择。 +你可以做下面两件事之一: +1.对现有的产品开始出货 +2.回过头去,把现在的产品当做一个全新的问题来解决,并提出新的问题 +不需要看很远,就可以找到采用(1)的例子。事实上,在物联网设备市场上,到处都是这样的设备。由于急于将设备推向市场,在这些设备中找到硬编码证书、开发密钥、各种安全漏洞和没有更新方式的产品并不少见。 +想想Mirai僵尸程序,通过僵尸网络发起一个网络流量超过1Tbps的分布式拒绝服务攻击(DDos),导致一些互联网上最大的网站停止服务。这个僵尸网络主要由物联网设备组成。这种为了攻破设备的防御机制进而控制设备所开发的僵尸程序,是采用了超级酷的黑魔法在一个无窗实验室(或地下基地)开发的吗?不是,默认的(通常是硬编码)证书。这些设备的制造商是否快速反应并发布所有这些设备的更新,以确保设备的安全?不,很多制造商根本没有更新方法。他们会开始反思。 +不是急于将产品推向市场,而是退后一步。多思考几点,就可以使你自己和你所在公司避免痛苦。 +例如,你的软件如何更新?这必须能回答这个问题。你的软件不是完美的。几个星期之内,当你在加利福尼亚使用自主的高机动性多用途轮式车辆(HMMWV)时,它把小灌木识别为一棵橡树。或者你不小心在软件中包含了你的SSH密钥。 +基础操作系统如何更新?也许这仍然是你的产品的一部分,也是你回答上一个问题的答案。但也许你使用的操作系统来自于另外一个供应商。你如何从供应商那里得到更新并提供给客户?这就是安全漏洞真正让你头痛的地方:从来不更新的内核,或者严重过时的开放ssl。 +当你解决了更新问题,在更新过程出现问题时,机器人怎么恢复?我的示例是对前面问题的一个常见解决方案:自动安全更新。对于服务器和台式机以及显然是计算机的东西来说,这是一个很好的做法,因为大多数人意识到有一个可以接受的方法来关闭它,而不是按住电源按钮5秒钟。机器人系统(以及大多数物联网系统)有一个问题,有时它们根本不被认为是计算机。如果您的机器人表现奇怪,有可能会被强制关闭。如果你的机器人行为奇怪,因为它正在快速安装一个内核更新,那么,现在你有一个部分安装内核的机器人。你需要有能力处理这种情况。 +最后,你的工厂流程是什么?你如何安装Linux,ROS(或者你使用的中间件),以及你要安装在设备上的你自己的东西?小的工厂可能会手工操作,但这种方法没有伸缩性,容易出错。其他厂商可能会制作一个定制化的初始发行版ISO,但这是不小的任务,在更新软件时也不容易维护。还有一些厂商会使用专家或者有陡峭学习曲线的自动化工具,不久就会意识到,你把大量的工程精力投入到本来应该很简单的工作中。 +所有这些问题都很重要。针对这些问题,如果你发现自己没有任何明确的答案,你应该加入我们的网络研讨会,在研讨会上我们讨论如何使用开放源代码构建一个商业化机器人。我们会帮助你思考这些问题,并可以回答你更多问题。 + +作者简介: +Kyle是Snapcraft团队的一员,也是Canonical公司的常驻机器人专家,他专注于snaps和snap开发实践,以及snaps和Ubuntu Core的机器人技术实现。 + +via: https://insights.ubuntu.com/2017/07/18/things-to-consider-when-building-a-robot-with-open-source/ + +作者:Kyle Fazzari 译者:SunWave 校对:校对者ID + +本文由 LCTT 原创编译,Linux中国 荣誉推出 From f568d398cc4f98b10a0f88eb9f13de914b7855cf Mon Sep 17 00:00:00 2001 From: SunWave Date: Sun, 30 Jul 2017 16:58:51 +0800 Subject: [PATCH 0846/1407] Delete 20170718 Things to consider when building a robot with open source.md --- ... when building a robot with open source.md | 23 ------------------- 1 file changed, 23 deletions(-) delete mode 100644 translated/tech/20170718 Things to consider when building a robot with open source.md diff --git a/translated/tech/20170718 Things to consider when building a robot with open source.md b/translated/tech/20170718 Things to consider when building a robot with open source.md deleted file mode 100644 index 0df508d7aa..0000000000 --- a/translated/tech/20170718 Things to consider when building a robot with open source.md +++ /dev/null @@ -1,23 +0,0 @@ -使用开源构建机器人时需要考虑的事项 - -或许你正在考虑(或正在进行)将机器人使用开源软件推向市场。这个机器人是基于linux构建的。也许你正在使用机器人操作系统(ROS)或任务导向的操作套件(MODS),或者是另外一个可以帮助你简化开发过程的开源中间件。当开发接近实用化,期望得到回报会开始给你带来一些压力。你可能会被问到“我们的产品什么时候可以开始销售?”,这时你将面临重要的抉择。 -你可以做下面两件事之一: -1.对现有的产品开始出货 -2.回过头去,把现在的产品当做一个全新的问题来解决,并提出新的问题 -不需要看很远,就可以找到采用(1)的例子。事实上,在物联网设备市场上,到处都是这样的设备。由于急于将设备推向市场,在这些设备中找到硬编码证书、开发密钥、各种安全漏洞和没有更新方式的产品并不少见。 -想想Mirai僵尸程序,通过僵尸网络发起一个网络流量超过1Tbps的分布式拒绝服务攻击(DDos),导致一些互联网上最大的网站停止服务。这个僵尸网络主要由物联网设备组成。这种为了攻破设备的防御机制进而控制设备所开发的僵尸程序,是采用了超级酷的黑魔法在一个无窗实验室(或地下基地)开发的吗?不是,默认的(通常是硬编码)证书。这些设备的制造商是否快速反应并发布所有这些设备的更新,以确保设备的安全?不,很多制造商根本没有更新方法。他们会开始反思。 -不是急于将产品推向市场,而是退后一步。多思考几点,就可以使你自己和你所在公司避免痛苦。 -例如,你的软件如何更新?这必须能回答这个问题。你的软件不是完美的。几个星期之内,当你在加利福尼亚使用自主的高机动性多用途轮式车辆(HMMWV)时,它把小灌木识别为一棵橡树。或者你不小心在软件中包含了你的SSH密钥。 -基础操作系统如何更新?也许这仍然是你的产品的一部分,也是你回答上一个问题的答案。但也许你使用的操作系统来自于另外一个供应商。你如何从供应商那里得到更新并提供给客户?这就是安全漏洞真正让你头痛的地方:从来不更新的内核,或者严重过时的开放ssl。 -当你解决了更新问题,在更新过程出现问题时,机器人怎么恢复?我的示例是对前面问题的一个常见解决方案:自动安全更新。对于服务器和台式机以及显然是计算机的东西来说,这是一个很好的做法,因为大多数人意识到有一个可以接受的方法来关闭它,而不是按住电源按钮5秒钟。机器人系统(以及大多数物联网系统)有一个问题,有时它们根本不被认为是计算机。如果您的机器人表现奇怪,有可能会被强制关闭。如果你的机器人行为奇怪,因为它正在快速安装一个内核更新,那么,现在你有一个部分安装内核的机器人。你需要有能力处理这种情况。 -最后,你的工厂流程是什么?你如何安装Linux,ROS(或者你使用的中间件),以及你要安装在设备上的你自己的东西?小的工厂可能会手工操作,但这种方法没有伸缩性,容易出错。其他厂商可能会制作一个定制化的初始发行版ISO,但这是不小的任务,在更新软件时也不容易维护。还有一些厂商会使用专家或者有陡峭学习曲线的自动化工具,不久就会意识到,你把大量的工程精力投入到本来应该很简单的工作中。 -所有这些问题都很重要。针对这些问题,如果你发现自己没有任何明确的答案,你应该加入我们的网络研讨会,在研讨会上我们讨论如何使用开放源代码构建一个商业化机器人。我们会帮助你思考这些问题,并可以回答你更多问题。 - -作者简介: -Kyle是Snapcraft团队的一员,也是Canonical公司的常驻机器人专家,他专注于snaps和snap开发实践,以及snaps和Ubuntu Core的机器人技术实现。 - -via: https://insights.ubuntu.com/2017/07/18/things-to-consider-when-building-a-robot-with-open-source/ - -作者:Kyle Fazzari 译者:SunWave 校对:校对者ID - -本文由 LCTT 原创编译,Linux中国 荣誉推出 From 6c4bdba61aeb9af453f7353c5ef42f4af769c916 Mon Sep 17 00:00:00 2001 From: SunWave Date: Sun, 30 Jul 2017 17:13:41 +0800 Subject: [PATCH 0847/1407] translated --- ... when building a robot with open source.md | 40 +++++++++++++++++++ 1 file changed, 40 insertions(+) create mode 100644 translated/tech/20170718 Things to consider when building a robot with open source.md diff --git a/translated/tech/20170718 Things to consider when building a robot with open source.md b/translated/tech/20170718 Things to consider when building a robot with open source.md new file mode 100644 index 0000000000..c1d755d3b5 --- /dev/null +++ b/translated/tech/20170718 Things to consider when building a robot with open source.md @@ -0,0 +1,40 @@ +# 使用开放源代码构建机器人时需要考虑的事项 # + + +![](https://camo.githubusercontent.com/fb86e7bb10d32ee088cd821de147f03289912930/68747470733a2f2f696e7369676874732e7562756e74752e636f6d2f77702d636f6e74656e742f75706c6f6164732f666266632f666c617368696e672e706e67) + +或许你正在考虑(或正在进行)将机器人使用开源软件推向市场。这个机器人是基于linux构建的。也许你正在使用机器人操作系统(ROS)或任务导向的操作套件(MODS),或者是另外一个可以帮助你简化开发过程的开源中间件。当开发接近实用化,期望得到回报会开始给你带来一些压力。你可能会被问到“我们的产品什么时候可以开始销售?”,这时你将面临重要的抉择。 + +你可以做下面两件事之一: + +1.对现有的产品开始出货 + +2.回过头去,把现在的产品当做一个全新的问题来解决,并提出新的问题 + +不需要看很远,就可以找到采用(1)的例子。事实上,在物联网设备市场上,到处都是这样的设备。由于急于将设备推向市场,在这些设备中找到硬编码证书、开发密钥、各种安全漏洞和没有更新方式的产品并不少见。 + +想想Mirai僵尸程序,通过僵尸网络发起一个网络流量超过1Tbps的分布式拒绝服务攻击(DDos),导致一些互联网上最大的网站停止服务。这个僵尸网络主要由物联网设备组成。这种为了攻破设备的防御机制进而控制设备所开发的僵尸程序,是采用了超级酷的黑魔法在一个无窗实验室(或地下基地)开发的吗?不是,默认的(通常是硬编码)证书。这些设备的制造商是否快速反应并发布所有这些设备的更新,以确保设备的安全?不,很多制造商根本没有更新方法。他们会开始反思。 + +不是急于将产品推向市场,而是退后一步。多思考几点,就可以使你自己和你所在公司避免痛苦。 + +例如,你的软件如何更新?这必须能回答这个问题。你的软件不是完美的。几个星期之内,当你在加利福尼亚使用自主的高机动性多用途轮式车辆(HMMWV)时,它把小灌木识别为一棵橡树。或者你不小心在软件中包含了你的SSH密钥。 + +基础操作系统如何更新?也许这仍然是你的产品的一部分,也是你回答上一个问题的答案。但也许你使用的操作系统来自于另外一个供应商。你如何从供应商那里得到更新并提供给客户?这就是安全漏洞真正让你头痛的地方:从来不更新的内核,或者严重过时的开放ssl。 + +当你解决了更新问题,在更新过程出现问题时,机器人怎么恢复?我的示例是对前面问题的一个常见解决方案:自动安全更新。对于服务器和台式机以及显然是计算机的东西来说,这是一个很好的做法,因为大多数人意识到有一个可以接受的方法来关闭它,而不是按住电源按钮5秒钟。机器人系统(以及大多数物联网系统)有一个问题,有时它们根本不被认为是计算机。如果您的机器人表现奇怪,有可能会被强制关闭。如果你的机器人行为奇怪,因为它正在快速安装一个内核更新,那么,现在你有一个部分安装内核的机器人。你需要有能力处理这种情况。 + +最后,你的工厂流程是什么?你如何安装Linux,ROS(或者你使用的中间件),以及你要安装在设备上的你自己的东西?小的工厂可能会手工操作,但这种方法没有伸缩性,容易出错。其他厂商可能会制作一个定制化的初始发行版ISO,但这是不小的任务,在更新软件时也不容易维护。还有一些厂商会使用专家或者有陡峭学习曲线的自动化工具,不久就会意识到,你把大量的工程精力投入到本来应该很简单的工作中。 +所有这些问题都很重要。针对这些问题,如果你发现自己没有任何明确的答案,你应该加入我们的网络研讨会,在研讨会上我们讨论如何使用开放源代码构建一个商业化机器人。我们会帮助你思考这些问题,并可以回答你更多问题。 + +---------- + +作者简介: +Kyle是Snapcraft团队的一员,也是Canonical公司的常驻机器人专家,他专注于snaps和snap开发实践,以及snaps和Ubuntu Core的机器人技术实现。 + +---------- + +via: [https://insights.ubuntu.com/2017/07/18/things-to-consider-when-building-a-robot-with-open-source/](https://insights.ubuntu.com/2017/07/18/things-to-consider-when-building-a-robot-with-open-source/) + +作者:Kyle Fazzari 译者:SunWave 校对:校对者ID + +本文由 LCTT 原创编译,Linux中国 荣誉推出 From a586f6b1962aed32b830d275e8505ad94e4da6f1 Mon Sep 17 00:00:00 2001 From: ninaiwohe109 <761484150@qq.com> Date: Sun, 30 Jul 2017 20:27:22 +0800 Subject: [PATCH 0848/1407] Update 20160909 Best Linux Adobe Alternatives You Need to Know.md --- .../20160909 Best Linux Adobe Alternatives You Need to Know.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/tech/20160909 Best Linux Adobe Alternatives You Need to Know.md b/sources/tech/20160909 Best Linux Adobe Alternatives You Need to Know.md index b2c1756ec5..dd27c9a54c 100644 --- a/sources/tech/20160909 Best Linux Adobe Alternatives You Need to Know.md +++ b/sources/tech/20160909 Best Linux Adobe Alternatives You Need to Know.md @@ -1,4 +1,4 @@ -Best Linux Adobe Alternatives You Need to Know +Best Linux Adobe Alternatives You Need to Know ###translating by ninaiwohe109 ============================================================ ![](https://www.maketecheasier.com/assets/uploads/2016/09/adobe-alternative-linux-featured.jpg "Best Linux Adobe Alternatives You Need to Knows") From 270ee87dcd37e1b2d30181612df3e70df8840ac9 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 30 Jul 2017 23:17:43 +0800 Subject: [PATCH 0849/1407] PRF&PUB:20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md @firmianay --- ...pdate Latest Kernel In Ubuntu LinuxMint.md | 47 +++++++++---------- 1 file changed, 22 insertions(+), 25 deletions(-) rename {translated/tech => published}/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md (89%) diff --git a/translated/tech/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md b/published/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md similarity index 89% rename from translated/tech/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md rename to published/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md index d63c639884..ca072a9710 100644 --- a/translated/tech/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md +++ b/published/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md @@ -1,26 +1,23 @@ -Linux Kernel Utilities(LKU) - 一套在 Ubuntu/LinuxMint 上编译、安装和更新最新内核的 Shell 脚本 +LKU:一套在 Ubuntu/LinuxMint 上编译、安装和更新最新内核的 Shell 脚本 ============================================================ +以手动方式安装和升级最新的 Linux 内核对于每个人来说都不是一件小事,甚至包括一些有经验的人也是如此。它需要对 Linux 内核有深入的了解。过去我们已经介绍了 UKUU(Ubuntu Kernel Upgrade Utility),它可以从 kernel.ubuntu.com 网站上自动检测最新的主线内核,并弹出一个不错的窗口界面进行安装。 -以手动方式安装和升级最新的 Linux 内核对于每个人来说都不是一件小事,甚至包括一些有经验的人。它需要对 Linux 内核有深入的了解。过去我们已经介绍了 UKUU(Ubuntu Kernel Upgrade Utility),它可以从 kernel.ubuntu.com 网站上自动检测最新的主线内核,并弹出一个不错的窗口界面进行安装。 +[Linux Kernel Utilities][2] (LKU)提供一组 shell 脚本(三个 Shell 脚本),可以帮助用户从 kernel.org 获取并编译和安装最新的 Linux 内核,也可以从 kernel.ubuntu.com 获取安装最新的预编译的 Ubuntu 内核。甚至可以根据需要选择所需的内核(手动内核选择)。 -[Linux Kernel Utilities][2] (LKU)提供一组 shell 脚本(三个 Shell 脚本),可以帮助用户从 kernel.org 获取并编译和安装最新的 Linux 内核,还可以从 kernel.ubuntu.com 获取安装最新的 Ubuntu 内核。甚至可以根据需要选择所需的内核(手动内核选择)。 +该脚本还将根据 PGP 签名文件检查下载的归档文件,并且可以选择通用和低延迟版内核。 -该脚本还将根据 PGP 签名文件检查下载的存档,并且可以选择通用和低版本的内核。 +建议阅读:[ukuu:一种在基于 Ubuntu 的系统上轻松安装升级 Linux 内核的方式][3] -建议阅读:[Ukuu – An Easy Way To Install/Upgrade Linux Kernel In Ubuntu based Systems][3] +它可以删除或清除所有非活动的内核,并且不会为了安全目的留下备份的内核。强烈建议在执行此脚本之前重新启动一次。 -它可以删除或清除所有非活动的内核,并且不会为了安全目的留下备份的内核。强烈建议在执行此脚本之前重新启动。 +* `compile_linux_kernel.sh` :用户可以从 kernel.org 编译和安装所需的或最新的内核 +* `update_ubuntu_kernel.sh` :用户可以从 kernel.ubuntu.com 安装并更新所需或最新的预编译 Ubuntu 内核 +* `remove_old_kernels.sh` :这将删除或清除所有非活动内核,并且只保留当前加载的版本 -* compile_linux_kernel.sh :用户可以从 kernel.org 编译和安装所需的或最新的内核 +kernel.org 有固定的发布周期(每三个月一次),发布的内核包括了新的功能,改进了硬件和系统性能。由于它具有标准的发布周期,除了滚动发布的版本(如 Arch Linux,openSUSE Tumbleweed 等),大多数发行版都不提供最新的内核。 -* update_ubuntu_kernel.sh : 用户可以从 kernel.ubuntu.com 安装并更新所需或最新的预编译 Ubuntu 内核 - -* remove_old_kernels.sh : 这将删除或清除所有非活动内核,并且只保留当前加载的版本 - -Kernel.org 有固定的发布周期(每三个月一次),发布内容包括新功能,改进的硬件和系统性能。由于它具有标准的发布周期,除了滚动发布的版本(如 Arch Linux,openSUSE Tumbleweed 等),大多数发行版都不提供最新的内核。 - -#### 如何安装 Linux Kernel Utilities (LKU) +### 如何安装 Linux Kernel Utilities (LKU) 正如我们在文章的开头所说的,它的 shell 脚本集只是克隆开发人员的 github 仓库并运行相应的 shell 文件来执行这个过程。 @@ -28,18 +25,18 @@ Kernel.org 有固定的发布周期(每三个月一次),发布内容包括 $ git clone https://github.com/mtompkins/linux-kernel-utilities.git && cd linux-kernel-utilities ``` -#### 安装指定版本内核 +### 安装指定版本内核 -为了测试的目的,我们将安装 `Linux v4.4.10-xenial` 内核。在安装新内核之前,我们需要通过 `uanme -a` 命令检查当前安装的内核版本,以便我们可以检查新内核是否可以安装 +为了测试的目的,我们将安装 Linux v4.4.10-xenial 内核。在安装新内核之前,我们需要通过 `uanme -a` 命令检查当前安装的内核版本,以便我们可以检查新内核是否可以安装。 ``` $ uname -a Linux magi-VirtualBox 4.4.0-21-generic #37-Ubuntu SMP Mon Apr 18 18:33:37 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux ``` -根据上面的输出,我们的系统使用 4.4.0-21 通用内核。 +根据上面的输出,我们的系统使用的是 4.4.0-21 通用内核。 -只需运行 `update_ubuntu_kernel.sh` shell 文件。第一次运行脚本时会检查是否满足所有的依赖关系,然后自动安装缺少的依赖项。它会检测系统使用的发行版,并检索 kernel.ubuntu.com 中可用的预编译内核。现在,从列表中选择你需要的内核并输入序号,然后按 Enter 键,它将下载内核映像(linux-headers-4.4.10,linux-headers-4.4.10-xxx-generic 和 linux-image-4.4.10-xxx-generic)。 +只需运行 `update_ubuntu_kernel.sh` shell 脚本。第一次运行脚本时会检查是否满足所有的依赖关系,然后自动安装缺少的依赖项。它会检测系统使用的发行版,并检索 kernel.ubuntu.com 中可用的预编译内核。现在,从列表中选择你需要的内核并输入序号,然后按回车键,它将下载内核映像(linux-headers-4.4.10,linux-headers-4.4.10-xxx-generic 和 linux-image-4.4.10-xxx-generic)。 一旦内核镜像被下载,它将要求输入 `sudo` 密码来启动新内核的安装。 @@ -216,14 +213,14 @@ done $ sudo reboot now ``` -现在,你正在使用的就是新安装的 `4.4.10-040410-generic` 版本内核。 +现在,你正在使用的就是新安装的 4.4.10-040410-generic 版本内核。 ``` $ uname -a Linux magi-VirtualBox 4.4.10-040410-generic #201605110631 SMP Wed May 11 10:33:23 UTC 2016 x86_64 x86_64 x86_64 GNU/Linux ``` -#### 安装最新版本内核 +### 安装最新版本内核 过程与上述相同,它将自动安装最新版本的内核。 @@ -275,16 +272,16 @@ done $ sudo reboot now ``` -现在,你正在使用的就是最新版本 `4.11.3-041103-generic` 的内核。 +现在,你正在使用的就是最新版本 4.11.3-041103-generic 的内核。 ``` $ uname -a Linux magi-VirtualBox 4.11.3-041103-generic #201705251233 SMP Thu May 25 16:34:52 UTC 2017 x86_64 x86_64 x86_64 GNU/Linux ``` -#### 删除或清除旧内核 +### 删除或清除旧内核 -只需要运行 `remove_old_kernels.sh` shell 文件即可删除或清除所有非活动状态的内核。 +只需要运行 `remove_old_kernels.sh` shell 脚本即可删除或清除所有非活动状态的内核。 ``` $ ./remove_old_kernels.sh @@ -337,9 +334,9 @@ run-parts: executing /etc/kernel/postrm.d/zz-update-grub 4.4.9-040409-lowlatency via: http://www.2daygeek.com/lku-linux-kernel-utilities-compile-install-update-latest-kernel-in-linux-mint-ubuntu/ -作者:[ 2DAYGEEK ][a] +作者:[2DAYGEEK][a] 译者:[firmianay](https://github.com/firmianay) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 117662cd6793c202c87e640a0f8a27c9db88097c Mon Sep 17 00:00:00 2001 From: Wueiz Date: Mon, 31 Jul 2017 00:07:51 +0800 Subject: [PATCH 0850/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=AE=8C=E6=88=90?= =?UTF-8?q?=20How=20To=20Install=20OrientDB=20on=20Ubuntu=2016.04?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 完成翻译 How To Install OrientDB on Ubuntu 16.04 --- ...How To Install OrientDB on Ubuntu 16.04.md | 230 ++++++++++++++++++ 1 file changed, 230 insertions(+) create mode 100644 translated/tech/How To Install OrientDB on Ubuntu 16.04.md diff --git a/translated/tech/How To Install OrientDB on Ubuntu 16.04.md b/translated/tech/How To Install OrientDB on Ubuntu 16.04.md new file mode 100644 index 0000000000..bc87d99fbb --- /dev/null +++ b/translated/tech/How To Install OrientDB on Ubuntu 16.04.md @@ -0,0 +1,230 @@ +非关系型数据库: 如何在 Ubuntu 16.04 上安装 OrientDB +============================================================ + + + ![OrientDB NoSQL DBMS]【(https://www.unixmen.com/wp-content/uploads/2017/07/orientdb-696x318.png "orientdb")][2] + +### 说明 - 非关系型数据库和 OrientDB + +通常在我们提及数据库的时候,想到的是两个主要的分类:用于用户和应用程序之间进行对接的一种被称为结构化查询语言(**S**tructured **Q**uery **L**anguage or SQL)的关系型数据库管理系统(RDBMS, **R**elational **D**ata **b**ase **M**anagement **S**ystem) 以及非关系型数据库管理系统(non-relational database management systems 或称 NoSQL 数据库). + +这两个模型,在如何处理(存储)数据的方面存在着巨大的差异。 + +#### 关系数据库管理系统 + +在关系模型中(如MySQL,或者其分支 MariaDB),一个数据库是一系列包含一个或多个以列组织的数据实例的表。数据库的每行包含一个唯一的由列定义的数据实例。 + +举个例子,想象一个包含客户的表。每一行相当于一个客户,而其中的每一列分别对应名字、地址以及其他所必须的信息。 + +而另一个表可能是包含订单、产品、客户、日期以及其他一切。而这个数据库的使用者则可以获得一个满足其需要的视图,例如一个客户在一个特定的价格范围购买产品的报告。 + +#### 非关系型数据库管理系统 + +在非关系型数据库(或称不仅仅是数据库)管理系统中,数据库被设计为使用不同的方式存储数据,比如文档存储、键值对存储、图形关系存储以及其他方式存储。使用此种形式实现的数据库系统专门被用于大型数据库集群和大型 Web 应用。现今,非关系型数据库被用于某些大公司,如谷歌和亚马逊。 + +##### 文档存储数据库 + +文档存储数据库是将数据用文档的形式存储。这种类型的运用通常表现为 JavaScript 和 JSON,实际上,XML 和其他形式的存储也是可以被采用的。这里的一个例子就是 MongoDB。 + +##### 键值对存储数据库 + +这是一个唯一键(key)配对一个值(value)的简单模型。这个系统在高速缓存方面具有高性能和高度可扩展性。这里的例子包括 BerkeleyDB 和 MemacacheDB。 +##### 图形关系数据库 + +正如其名,这种数据库通过使用图模型存储数据,这意味着数据通过节点和两个节点之间的互连进行组织。这是一个可以随着时间的推移和使用而发展的灵活模型。这个系统应用于那些强调映射关系的地方。这里的例子有 IBM Graphs、Neo4j 以及 **OrientDB**。 + +### OrientDB + +[OrientDB][3] 是一个多模式的非关系型数据库管理系统。正如开发它的公司所说的“_它是一个将图形与文档、键值对、反应性、面向对象和地理空间模型结合在一起的**可扩展的、高性能的数据库**_”。 + +OrientDB 还支持 SQL 来扩展操作树和图。 + +### 目标 + +这个教程旨在教会大家如何在运行 Ubuntu 16.04 的服务器上下载和配置 OrientDB 公开版。 + +### 下载 OrientDB + +我们可以从最新的服务端上通过输入下面的指令来下载最新版本的 OrientDB。 + +``` +$ wget -O orientdb-community-2.2.22.tar.gz http://orientdb.com/download.php?file=orientdb-community-2.2.22.tar.gz&os=linux +``` + +这里下载的是一个包含预编译二进制文件的压缩包,所以我们可以使用 `tar` 指令来操作解压它: + +``` +$ tar -zxf orientdb-community-2.2.22.tar.gz +``` + +将从中提取出来的文件夹整体移动到 `/opt`: + +``` +# mv orientdb-community-2.2.22 /opt/orientdb +``` + +### 启动 OrientDB Server + +启动 OrientDB 服务 需要运行 `orientdb/bin/` 目录下的shell: + +``` +# /opt/orientdb/bin/server.sh +``` + +如果你是第一次开启 OrientDB 服务,安装程序还会显示一些提示信息以及提醒你设置 OrientDB 的 root 用户密码: +``` ++---------------------------------------------------------------+ +| WARNING: FIRST RUN CONFIGURATION | ++---------------------------------------------------------------+ +| This is the first time the server is running. Please type a | +| password of your choice for the 'root' user or leave it blank | +| to auto-generate it. | +| | +| To avoid this message set the environment variable or JVM | +| setting ORIENTDB_ROOT_PASSWORD to the root password to use. | ++---------------------------------------------------------------+ + +Root password [BLANK=auto generate it]: ******** +Please confirm the root password: ******** +``` + +在完成这些后,OrientDB 数据库服务将成功启动: +``` +INFO OrientDB Server is active v2.2.22 (build fb2b7d321ea8a5a5b18a82237049804aace9e3de). [OServer] +``` + +从现在开始,我们需要第二个终端来与 OrientDB 服务进行交互。(有些问题) + +若要强制停止 OrientDB 执行 `Ctrl+C` 即可。 + +### 配置守护进程 + + +此时,我们可以认为 OrientDB 仅仅是一串 shell 脚本,可以用编辑器打开 `/opt/orientdb/bin/orientdb.sh`: + +``` +# $EDITOR /opt/orientdb/bin/orientdb.sh +``` + +在它的首段,我们可以看到: + +``` +#!/bin/sh +# OrientDB service script +# +# Copyright (c) OrientDB LTD (http://orientdb.com/) + +# chkconfig: 2345 20 80 +# description: OrientDb init script +# processname: orientdb.sh + +# You have to SET the OrientDB installation directory here +ORIENTDB_DIR="YOUR_ORIENTDB_INSTALLATION_PATH" +ORIENTDB_USER="USER_YOU_WANT_ORIENTDB_RUN_WITH" +``` + +我们需要配置`ORIENTDB_DIR` 以及 `ORIENTDB_USER`. + +然后创建一个用户,例如我们创建一个名为**orientdb**的用户,我们需要输入下面的指令: + +``` +# useradd -r orientdb -s /sbin/nologin +``` + +**orientdb** 就是我们在 `ORIENTDB_USER` 输入处的用户。 + +再更改 `/opt/orientdb` 目录的所有权: + +``` +# chown -R orientdb:orientdb /opt/orientdb +``` + +改变服务配置文件的权限: + +``` +# chmod 640 /opt/orientdb/config/orientdb-server-config.xml +``` + +#### 下载系统守护进程服务 + +OrientDB 的压缩包包含一个服务文件`/opt/orientdb/bin/orientdb.service`。我们将其复制到 `/etc/systemd/system` 文件夹下: + +``` +# cp /opt/orientdb/bin/orientdb.service /etc/systemd/system +``` + +编辑该服务文件: + +``` +# $EDITOR /etc/systemd/system/orientdb.service +``` + +其中`[service]` 内容块看起来应该是这样的: + +``` +[Service] +User=ORIENTDB_USER +Group=ORIENTDB_GROUP +ExecStart=$ORIENTDB_HOME/bin/server.sh +``` + +将其改成如下样式: + +``` +[Service] +User=orientdb +Group=orientdb +ExecStart=/opt/orientdb/bin/server.sh +``` + +保存并退出。 + +重新加载系统守护进程: + +``` +# systemctl daemon-reload +``` + +启动 OrientDB 并同意其开机自启动: + +``` +# systemctl start orientdb +# systemctl enable orientdb +``` + +确认 OrientDB 的状态: + +``` +# systemctl status orientdb +``` + +上述指令应该会输出: + +``` +● orientdb.service - OrientDB Server + Loaded: loaded (/etc/systemd/system/orientdb.service; disabled; vendor preset: enabled) + Active: active (running) ... +``` + +流程就是这样了!OrientDB 社区版成功安装并且正确运行在我们的服务器上了。 + +### 总结 + +在这个指导中,我们看到了一些关系型数据库管理系统(RDBMS)以及非关系型数据库管理系统(NoSQL DBMS)的简单对照。我们也安装 OrientDB 社区版的服务器端并完成了其基础的配置。 + +这是我们部署完全的 OrientDB 基础设施的第一步,也是我们用于管理大型系统数据的起步。 + +-------------------------------------------------------------------------------- + +via: https://www.unixmen.com/nosql-install-orientdb-ubuntu-16-04/ + +作者:[Giuseppe Molica ][a] +译者:[a92667237](https://github.com/a972667237) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.unixmen.com/author/tutan/ +[1]:https://www.unixmen.com/author/tutan/ +[2]:https://www.unixmen.com/wp-content/uploads/2017/07/orientdb.png +[3]:https://orientdb.com/ From 18ba43fe60018265beae789123bc2630767c58e3 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 31 Jul 2017 00:07:56 +0800 Subject: [PATCH 0851/1407] PRF:20170718 Things to consider when building a robot with open source.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @SunWave ,翻译的不错!不过请注意保持 Markdown 格式,如果你对此不熟悉,可以找写相关文章看看,我们只用了很简单的部分。 --- ... when building a robot with open source.md | 40 ++++++++++++------- 1 file changed, 25 insertions(+), 15 deletions(-) diff --git a/translated/tech/20170718 Things to consider when building a robot with open source.md b/translated/tech/20170718 Things to consider when building a robot with open source.md index c1d755d3b5..3ebc5d7e19 100644 --- a/translated/tech/20170718 Things to consider when building a robot with open source.md +++ b/translated/tech/20170718 Things to consider when building a robot with open source.md @@ -1,40 +1,50 @@ -# 使用开放源代码构建机器人时需要考虑的事项 # - +使用开源代码构建机器人时需要考虑的事项 +============= ![](https://camo.githubusercontent.com/fb86e7bb10d32ee088cd821de147f03289912930/68747470733a2f2f696e7369676874732e7562756e74752e636f6d2f77702d636f6e74656e742f75706c6f6164732f666266632f666c617368696e672e706e67) -或许你正在考虑(或正在进行)将机器人使用开源软件推向市场。这个机器人是基于linux构建的。也许你正在使用机器人操作系统(ROS)或任务导向的操作套件(MODS),或者是另外一个可以帮助你简化开发过程的开源中间件。当开发接近实用化,期望得到回报会开始给你带来一些压力。你可能会被问到“我们的产品什么时候可以开始销售?”,这时你将面临重要的抉择。 +或许你正在考虑(或正在进行)将机器人使用开源软件推向市场。这个机器人是基于 linux 构建的。也许你正在使用[机器人操作系统][1](ROS)或[任务导向操作套件][2](MOOS),或者是另外一个可以帮助你简化开发过程的开源中间件。当开发接近实用化,对回报的期望开始给你带来一些压力。你可能会被问到“我们的产品什么时候可以开始销售?”,这时你将面临重要的抉择。 你可以做下面两件事之一: -1.对现有的产品开始出货 +1. 对现有的产品开始出货 -2.回过头去,把现在的产品当做一个全新的问题来解决,并提出新的问题 +2. 回过头去,把产品化当做一个全新的问题来解决,并处理新的问题 -不需要看很远,就可以找到采用(1)的例子。事实上,在物联网设备市场上,到处都是这样的设备。由于急于将设备推向市场,在这些设备中找到硬编码证书、开发密钥、各种安全漏洞和没有更新方式的产品并不少见。 +不需要看很远,就可以找到采用方式(1)的例子。事实上,在物联网设备市场上,到处都是这样的设备。由于急于将设备推向市场,这些可以在设备中找到硬编码证书、开发密钥、各种安全漏洞和没有更新方式的产品并不少见。 -想想Mirai僵尸程序,通过僵尸网络发起一个网络流量超过1Tbps的分布式拒绝服务攻击(DDos),导致一些互联网上最大的网站停止服务。这个僵尸网络主要由物联网设备组成。这种为了攻破设备的防御机制进而控制设备所开发的僵尸程序,是采用了超级酷的黑魔法在一个无窗实验室(或地下基地)开发的吗?不是,默认的(通常是硬编码)证书。这些设备的制造商是否快速反应并发布所有这些设备的更新,以确保设备的安全?不,很多制造商根本没有更新方法。他们会开始反思。 +想想 Mirai 僵尸网络,通过该僵尸网络发起的流量超过 1Tbps 的分布式拒绝服务攻击(DDos),导致一些互联网上最大的网站停止服务。这个僵尸网络主要由物联网设备组成。这种攻破设备的防御机制进而控制设备所开发的僵尸程序,是采用了超级酷的黑魔法在一个没有窗户的实验室(或地下基地)开发的吗?不是,默认(通常是硬编码)证书而已。这些设备的制造商是否快速反应并发布所有这些设备的更新,以确保设备的安全?不,很多制造商根本没有更新方法。[他们召回设备而不是发布更新][3]。 -不是急于将产品推向市场,而是退后一步。多思考几点,就可以使你自己和你所在公司避免痛苦。 +不要急于将产品推向市场,而是退后一步。只要多思考几点,就可以使你自己和你所在公司避免痛苦。 -例如,你的软件如何更新?这必须能回答这个问题。你的软件不是完美的。几个星期之内,当你在加利福尼亚使用自主的高机动性多用途轮式车辆(HMMWV)时,它把小灌木识别为一棵橡树。或者你不小心在软件中包含了你的SSH密钥。 +例如,**你的软件如何更新?**你*必须*能回答这个问题。你的软件不是完美的。只要几个星期你就会发现,当你在加利福尼亚使用自主的高机动性多用途轮式车辆(HMMWV)时,它把小灌木识别为一棵橡树。或者你不小心在软件中包含了你的 SSH 密钥。 -基础操作系统如何更新?也许这仍然是你的产品的一部分,也是你回答上一个问题的答案。但也许你使用的操作系统来自于另外一个供应商。你如何从供应商那里得到更新并提供给客户?这就是安全漏洞真正让你头痛的地方:从来不更新的内核,或者严重过时的开放ssl。 +**基础操作系统如何更新?**也许这仍然是你的产品的一部分,也是你回答上一个问题的答案。但也许你使用的操作系统来自于另外一个供应商。你如何从供应商那里得到更新并提供给客户?这就是安全漏洞真正让你头痛的地方:从来不更新的内核,或者严重过时的 openssl。 -当你解决了更新问题,在更新过程出现问题时,机器人怎么恢复?我的示例是对前面问题的一个常见解决方案:自动安全更新。对于服务器和台式机以及显然是计算机的东西来说,这是一个很好的做法,因为大多数人意识到有一个可以接受的方法来关闭它,而不是按住电源按钮5秒钟。机器人系统(以及大多数物联网系统)有一个问题,有时它们根本不被认为是计算机。如果您的机器人表现奇怪,有可能会被强制关闭。如果你的机器人行为奇怪,因为它正在快速安装一个内核更新,那么,现在你有一个部分安装内核的机器人。你需要有能力处理这种情况。 +当你解决了更新问题,**在更新过程出现问题时,机器人怎么恢复?**我的示例是对前面问题的一个常见解决方案:自动安全更新。对于服务器和台式机以及显然是计算机的东西来说,这是一个很好的做法,因为大多数人意识到有一个可接受的方法来关闭它,而*不是*按住电源按钮 5 秒钟。机器人系统(以及大多数物联网系统)有一个问题,有时它们根本不被认为是计算机。如果您的机器人表现奇怪,有可能会被强制关闭。如果你的机器人行为奇怪是因为它正在快速安装一个内核更新,那么,现在你就有一个安装了半个内核的机器人镇纸了。你需要能够处理这种情况。 -最后,你的工厂流程是什么?你如何安装Linux,ROS(或者你使用的中间件),以及你要安装在设备上的你自己的东西?小的工厂可能会手工操作,但这种方法没有伸缩性,容易出错。其他厂商可能会制作一个定制化的初始发行版ISO,但这是不小的任务,在更新软件时也不容易维护。还有一些厂商会使用专家或者有陡峭学习曲线的自动化工具,不久就会意识到,你把大量的工程精力投入到本来应该很简单的工作中。 -所有这些问题都很重要。针对这些问题,如果你发现自己没有任何明确的答案,你应该加入我们的网络研讨会,在研讨会上我们讨论如何使用开放源代码构建一个商业化机器人。我们会帮助你思考这些问题,并可以回答你更多问题。 +最后,**你的工厂流程是什么?**你如何安装 Linux,ROS(或者你使用的中间件),以及你要安装在设备上的你自己的东西?小的工厂可能会手工操作,但这种方法不成规模,也容易出错。其他厂商可能会制作一个定制化的初始发行版 ISO,但这是个不小的任务,在更新软件时也不容易维护。还有一些厂商会使用 Chef 或者有陡峭学习曲线的自动化工具,不久你就会意识到,你把大量的工程精力投入到了本来应该很简单的工作中。 + +所有这些问题都很重要。针对这些问题,如果你发现自己没有任何明确的答案,你应该加入我们的[网络研讨会][4],在研讨会上我们讨论如何使用开放源代码构建一个商业化机器人。我们会帮助你思考这些问题,并可以回答你更多问题。 ---------- 作者简介: -Kyle是Snapcraft团队的一员,也是Canonical公司的常驻机器人专家,他专注于snaps和snap开发实践,以及snaps和Ubuntu Core的机器人技术实现。 + +Kyle 是 Snapcraft 团队的一员,也是 Canonical 公司的常驻机器人专家,他专注于 snaps 和 snap 开发实践,以及 snaps 和 Ubuntu Core 的机器人技术实现。 ---------- via: [https://insights.ubuntu.com/2017/07/18/things-to-consider-when-building-a-robot-with-open-source/](https://insights.ubuntu.com/2017/07/18/things-to-consider-when-building-a-robot-with-open-source/) -作者:Kyle Fazzari 译者:SunWave 校对:校对者ID +作者:[Kyle Fazzari][a] +译者:[SunWave](https://github.com/SunWave) +校对:[wxy](https://github.com/wxy) 本文由 LCTT 原创编译,Linux中国 荣誉推出 + +[a]:https://insights.ubuntu.com/author/kyrofa/ +[1]:http://www.ros.org/ +[2]:http://www.robots.ox.ac.uk/~mobile/MOOS/wiki/pmwiki.php/Main/HomePage +[3]:https://krebsonsecurity.com/2016/10/iot-device-maker-vows-product-recall-legal-action-against-western-accusers/ +[4]:https://www.brighttalk.com/webcast/6793/268763?utm_source=insights From daf6ba3e4ff68401db75fdaa6deeb29c10fd8185 Mon Sep 17 00:00:00 2001 From: Wueiz Date: Mon, 31 Jul 2017 00:08:00 +0800 Subject: [PATCH 0852/1407] Delete 20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md --- ...How To Install OrientDB on Ubuntu 16.04.md | 233 ------------------ 1 file changed, 233 deletions(-) delete mode 100644 sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md diff --git a/sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md b/sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md deleted file mode 100644 index 75a1824111..0000000000 --- a/sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md +++ /dev/null @@ -1,233 +0,0 @@ -Translating by a972667237 -NoSQL: How To Install OrientDB on Ubuntu 16.04 -============================================================ - - - [![OrientDB NoSQL DBMS](https://www.unixmen.com/wp-content/uploads/2017/07/orientdb-696x318.png "orientdb")][2] - -### Introduction – NoSQL and OrientDB - -When talking about databases, in general, we refer to two major families: RDBMS (**R**elational **D**ata**b**ase **M**anagement **S**ystem), which use as user and application program interface a language named **S**tructured **Q**uery **L**anguage (or SQL) and non-relational database management systems, or **NoSQL** databases. - -Between the two models there is a huge difference in the way they consider (and store) data. - -#### Relational Database Management Systems - -In the relational model (like MySQL, or its fork, MariaDB), a database is a set of tables, each containing one or more data categories organized in columns. Each row of the DB contains a unique instance of data for categories defined by columns. - -Just as an example, consider a table containing customers. Each row correspond to a customer, with columns for name, address, and every required information. -Another table could contain an order, with product, customer, date and everything else. A user of this DB can obtain a view that fits its needs, for example a report about customers that bought products in a specific range of prices. - -#### NoSQL Database Management Systems - -In the NoSQL (or Not only SQL) database management systems, databases are designed implementing different “formats” for data, like a document, key-value, graph and others. The database systems realized with this paradigm are built especially for large-scale database clusters, and huge web applications. Today, NoSQL databases are used by major companies like Google and Amazon. - -##### Document databases - -Document databases store data in document format. The usage of this kind of DBs is usually raised with JavaScript and JSON, however, XML and other formats are accepted. An example is MongoDB. - -##### Key-value databases - -This is a simple model pairing a unique key with a value. These systems are performant and highly scalable for caching. Examples include BerkeleyDB and MemcacheDB. - -##### Graph databases - -As the name predicts, these databases store data using graph models, meaning that data is organized as nodes and interconnections between them. This is a flexible model which can evolve over time and use. These systems are applied where there is the necessity of mapping relationships. -Examples are IBM Graphs and Neo4j **and OrientDB**. - -### OrientDB - -[OrientDB][3], as stated by the company behind it, is a multi-model NoSQL Database Management System that “ _combines the power of graphs with documents, key/value, reactive, object-oriented and geospatial models into one **scalable, high-performance operational database**“._ - -OrientDB has also support for SQL, with extensions to manipulate trees and graphs. - -### Goals - -This tutorial explains how to install and configure OrientDB Community on a server running Ubuntu 16.04. - -### Download OrientDB - -On an up to date server, download the latest version of OrientDB by executing the following command: - -``` -$ wget -O orientdb-community-2.2.22.tar.gz http://orientdb.com/download.php?file=orientdb-community-2.2.22.tar.gz&os=linux -``` - -This is a tarball containing pre-compiled binaries, so extract the archive with `tar`: - -``` -$ tar -zxf orientdb-community-2.2.22.tar.gz -``` - -Move the extracted directory into `/opt`: - -``` -# mv orientdb-community-2.2.22 /opt/orientdb -``` - -### Start OrientDB Server - -Starting the OrientDB server requires the execution of the shell script contained in `orientdb/bin/`: - -``` -# /opt/orientdb/bin/server.sh -``` - -During the first start, this installer will display some information and will ask for an OrientDB root password: - -``` -+---------------------------------------------------------------+ -| WARNING: FIRST RUN CONFIGURATION | -+---------------------------------------------------------------+ -| This is the first time the server is running. Please type a | -| password of your choice for the 'root' user or leave it blank | -| to auto-generate it. | -| | -| To avoid this message set the environment variable or JVM | -| setting ORIENTDB_ROOT_PASSWORD to the root password to use. | -+---------------------------------------------------------------+ - -Root password [BLANK=auto generate it]: ******** -Please confirm the root password: ******** -``` - -After that, the OrientDB server will start: - -``` -INFO OrientDB Server is active v2.2.22 (build fb2b7d321ea8a5a5b18a82237049804aace9e3de). [OServer] -``` - -From now on, we will need a second terminal to interact with the OrientDB server. - -Stop OrientDB by hitting `Ctrl+C`. - -### Configure a Daemon - -At this point, OrientDB is just a bunch of shell scripts. With a text editor, open `/opt/orientdb/bin/orientdb.sh`: - -``` -# $EDITOR /opt/orientdb/bin/orientdb.sh -``` - -In the first lines, we will see: - -``` -#!/bin/sh -# OrientDB service script -# -# Copyright (c) OrientDB LTD (http://orientdb.com/) - -# chkconfig: 2345 20 80 -# description: OrientDb init script -# processname: orientdb.sh - -# You have to SET the OrientDB installation directory here -ORIENTDB_DIR="YOUR_ORIENTDB_INSTALLATION_PATH" -ORIENTDB_USER="USER_YOU_WANT_ORIENTDB_RUN_WITH" -``` - -Configure `ORIENTDB_DIR` and `ORIENTDB_USER`. - -Create a user, for example **orientdb**, by executing the following command: - -``` -# useradd -r orientdb -s /sbin/nologin -``` - -**orientdb** is the user we enter in the `ORIENTDB_USER` line. - -Change the ownership of `/opt/orientdb`: - -``` -# chown -R orientdb:orientdb /opt/orientdb -``` - -Change the configuration server file’s permission: - -``` -# chmod 640 /opt/orientdb/config/orientdb-server-config.xml -``` - -#### Install the Systemd Service - -OrientDB tarball contains a service file, `/opt/orientdb/bin/orientdb.service`. Copy it to the `/etc/systemd/system` directory: - -``` -# cp /opt/orientdb/bin/orientdb.service /etc/systemd/system -``` - -Edit the OrientDB service file: - -``` -# $EDITOR /etc/systemd/system/orientdb.service -``` - -There, the `[service]` block should look like this: - -``` -[Service] -User=ORIENTDB_USER -Group=ORIENTDB_GROUP -ExecStart=$ORIENTDB_HOME/bin/server.sh -``` - -Edit as follow: - -``` -[Service] -User=orientdb -Group=orientdb -ExecStart=/opt/orientdb/bin/server.sh -``` - -Save and exit. - -Reload systemd daemon service: - -``` -# systemctl daemon-reload -``` - -Start OrientDB and enable for starting at boot time: - -``` -# systemctl start orientdb -# systemctl enable orientdb -``` - -Check OrientDB status: - -``` -# systemctl status orientdb -``` - -The command should output: - -``` -● orientdb.service - OrientDB Server - Loaded: loaded (/etc/systemd/system/orientdb.service; disabled; vendor preset: enabled) - Active: active (running) ... -``` - -And that’s all! OrientDB Community is installed and correctly running. - -### Conclusion - -In this tutorial we have seen a brief comparison between RDBMS and NoSQL DBMS. We have also installed and completed a basic configuration of OrientDB Community server-side. - -This is the first step for deploying a full OrientDB infrastructure, ready for managing large-scale systems data. - --------------------------------------------------------------------------------- - -via: https://www.unixmen.com/nosql-install-orientdb-ubuntu-16-04/ - -作者:[Giuseppe Molica ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.unixmen.com/author/tutan/ -[1]:https://www.unixmen.com/author/tutan/ -[2]:https://www.unixmen.com/wp-content/uploads/2017/07/orientdb.png -[3]:https://orientdb.com/ From ad19b6ba7a6b1b1413b37568884496bc4918ad7b Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 31 Jul 2017 00:08:57 +0800 Subject: [PATCH 0853/1407] PUB:20170718 Things to consider when building a robot with open source.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @SunWave 明早 10 点后可在 https://linux.cn/ 首页访问到 --- ...8 Things to consider when building a robot with open source.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170718 Things to consider when building a robot with open source.md (100%) diff --git a/translated/tech/20170718 Things to consider when building a robot with open source.md b/published/20170718 Things to consider when building a robot with open source.md similarity index 100% rename from translated/tech/20170718 Things to consider when building a robot with open source.md rename to published/20170718 Things to consider when building a robot with open source.md From f88cef6e8af25057b8c8e2fa9cded5abf930787c Mon Sep 17 00:00:00 2001 From: xu0o0 Date: Mon, 31 Jul 2017 02:48:37 +0800 Subject: [PATCH 0854/1407] translated by @haoqixu --- ...s I use dwm for my Linux window manager.md | 87 ------------------ ...s I use dwm for my Linux window manager.md | 91 +++++++++++++++++++ 2 files changed, 91 insertions(+), 87 deletions(-) delete mode 100644 sources/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md create mode 100644 translated/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md diff --git a/sources/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md b/sources/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md deleted file mode 100644 index 23dc182005..0000000000 --- a/sources/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md +++ /dev/null @@ -1,87 +0,0 @@ -【haoqixu 翻译中】Top 4 reasons I use dwm for my Linux window manager -============================================================ - -### A window manager handles the sizing and arrangement of the windows you open, among other things. - - -![Top 4 reasons I use dwm for my Linux window manager](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/car-penguin-drive-linux-yellow.png?itok=ueZE5mph "Top 4 reasons I use dwm for my Linux window manager") -Image by :  - -Internet Archive [Book][4] [Images][5]. Modified by Opensource.com. CC BY-SA 4.0 - -I like minimalistic views. If I could run everything in a terminal I would. It's free from shiny stuff that hogs my resources and distracts my feeble mind. I also grow tired of resizing and moving windows, never getting them to align perfectly. - -On my quest for minimalism, I grew fond of [Xfce][6] and used it as my main [desktop environment][7] for years on my Linux computers. Then, one day I came across a video of [Bryan Lunduke][8] talking about the awesome [window manager][9] he used called [Awesome][10]. It neatly arranges all of your windows for you, and so, sounded like just what I wanted. I tried it out but didn't get the hang of the configuration needed to tweak it into my liking. So, I moved on and discovered [xmonad][11], but I had a similar result. It worked fine but I couldn't get around the Haskell part to really turn it into my perfect desktop. - -Years passed and by accident, I found my way to [suckless.org][12] and their version of a window manager called [dwm][13]. - -In short, a desktop environment such as KDE, Gnome, or Xfce includes many things, of which a window manager is one, but also with select applications. A window manager alone handles (among other window related things) the sizing and arrangement of the windows you open. Different desktop environments use different window managers. KDE has KWin, Gnome 2 has Metacity, Gnome 3 has Mutter, and Xfce has Xfwm. Conveniently, for all of these, you can change the default window manager to something else, which is what I've been doing for a while. I've been switching mine to dwm, and here's why I love it. - -### Dynamic window management - -The killer feature for dwm, as with Awesome and xmonad, is the part where the tool automatically arranges the windows for you, filling the entire space of your screen. Sure, for most desktop environments today it's possible to create keyboard shortcuts to arrange windows to the left, right, top, bottom or full screen, but with dwm it's just one less thing to think about. - -Dwm divides the screen into a master and a stack area. There are three layouts to choose from: tile, monocle, and floating. When using tile mode, which is what I use the most, it puts the window which requires the most attention in the master area while the others are tiled in the stack area. In the monocle layout, all windows are maximized and you toggle between them. The floating layout allows you resize the windows as you want (as the most window managers do), which is handy if you're using Gimp or a similar application where custom size windows makes more sense. - -Usually, in your desktop environment, you can use different workspaces to sort your windows and gather similar applications in designated workspaces. At work, I use one workspace for ongoing work and one for internet browsing. Dwm has a similar function called tags. You can group windows by tags and by selecting a tag, you display all the windows with that tag. - -### Efficiency - -Dwm is efficient if you want to save as much power as you can on your computer. Xfce and other lightweight environments are great on older or weaker machines, but dwm uses (in my case) about 1/3 of resources compared to Xfce after login. When I was using an eee pc with 1 GB RAM it made quite a difference if the memory was occupied to 660 MB or 230 MB. That left me with more room for the editors and browsers I wanted to use. - -### Minimalistic - -I typically set up my applications beside each other: the terminal as the master window (usually running Vim as an editor), a browser for email, and another browser window open for research or [Trello][14]. For casual internet browsing, I fire up a Chromium window in another workspace or a  _tag_  as I mentioned earlier. - -### [dwm.png][1] - -![](https://opensource.com/sites/default/files/dwm.png) - -Screenshot by author. - -With standard desktop environments, you often have at least one or two panels, top and bottom or on the side, taking up space. I have tried out the autohide panel function that most of them have, but I was annoyed every time I accidently put the mouse pointer too close to the edge and the panel popped out at the most inconvenient time. You can make them smaller as well but I still enjoy the minimalistic status bar on top of the screen available in dwm. - -### Speed - -When evaluating speed, I count both how quickly dwm is loaded when I log in and how quickly the applications launch when I start them. When using newer, faster computers you might not care about this detail yet, but for me, there is a noticable difference between various desktop environments and window managers. I don't want to actually wait for my computer to perform such easy tasks, it should just pop up. Also, using keyboard shortcuts to launch everything is faster than using a mouse or a touchpad, and my hands don't have to leave the keyboard. - -### Conclusion - -That said, I would not recommend dwm to the novice user. It takes some time to read up on how to configure it to your liking (unless you are satisfied with the setup provided by your Linux distribution). I have found some of the patches you might want to include can be tricky to get working and the support community is small (the IRC channel states "No patch-handholding"). So, it might take a bit of effort to get exactly what you want. However, once you do, it's well worth that bit investment. - -And hey, it looks as awesome as Awesome. - --------------------------------------------------------------------------------- - -作者简介: - -Jimmy Sjölund - Jimmy Sjölund is a senior IT service manager and innovation coach at Telia Company, focusing on organisation development, exploring agile and lean workflows and is a visualisation enthusiast. He's also an open source evangelist, previously engaged in Ubuntu Studio and Plume Creator. - ------------------ - -via: https://opensource.com/article/17/7/top-4-reasons-i-use-dwm-linux-window-manager - -作者:[ Jimmy Sjölund Feed ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/jimmysjolund -[1]:https://opensource.com/file/363336 -[2]:https://opensource.com/article/17/7/top-4-reasons-i-use-dwm-linux-window-manager?rate=T8qhopZLfd1eum_NMLOSGckUh2nIjfeRpkERGjGhu7w -[3]:https://opensource.com/user/56551/feed -[4]:https://www.flickr.com/photos/internetarchivebookimages/14746482994/in/photolist-ot6zCN-odgbDq-orm48o-otifuv-otdyWa-ouDjnZ-otGT2L-odYVqY-otmff7-otGamG-otnmSg-rxnhoq-orTmKf-otUn6k-otBg1e-Gm6FEf-x4Fh64-otUcGR-wcXsxg-tLTN9R-otrWYV-otnyUE-iaaBKz-ovcPPi-ovokCg-ov4pwM-x8Tdf1-hT5mYr-otb75b-8Zk6XR-vtefQ7-vtehjQ-xhhN9r-vdXhWm-xFBgtQ-vdXdJU-vvTH6R-uyG5rH-vuZChC-xhhGii-vvU5Uv-vvTNpB-vvxqsV-xyN2Ai-vdXcFw-vdXuNC-wBMhes-xxYmxu-vdXxwS-vvU8Zt -[5]:https://www.flickr.com/photos/internetarchivebookimages/14774719031/in/photolist-ovAie2-otPK99-xtDX7p-tmxqWf-ow3i43-odd68o-xUPaxW-yHCtWi-wZVsrD-DExW5g-BrzB7b-CmMpC9-oy4hyF-x3UDWA-ow1m4A-x1ij7w-tBdz9a-tQMoRm-wn3tdw-oegTJz-owgrs2-rtpeX1-vNN6g9-owemNT-x3o3pX-wiJyEs-CGCC4W-owg22q-oeT71w-w6PRMn-Ds8gyR-x2Aodm-owoJQm-owtGp9-qVxppC-xM3Gw7-owgV5J-ou9WEs-wihHtF-CRmosE-uk9vB3-wiKdW6-oeGKq3-oeFS4f-x5AZtd-w6PNuv-xgkofr-wZx1gJ-EaYPED-oxCbFP -[6]:https://xfce.org/ -[7]:https://en.wikipedia.org/wiki/Desktop_environment -[8]:http://lunduke.com/ -[9]:https://en.wikipedia.org/wiki/Window_manager -[10]:https://awesomewm.org/ -[11]:http://xmonad.org/ -[12]:http://suckless.org/ -[13]:http://dwm.suckless.org/ -[14]:https://opensource.com/node/22546 -[15]:https://opensource.com/users/jimmysjolund -[16]:https://opensource.com/users/jimmysjolund -[17]:https://opensource.com/article/17/7/top-4-reasons-i-use-dwm-linux-window-manager#comments diff --git a/translated/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md b/translated/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md new file mode 100644 index 0000000000..efefdf908b --- /dev/null +++ b/translated/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md @@ -0,0 +1,91 @@ +我选择 dwm 作为窗口管理器的 4 大理由 +============================================================ + +### 窗口管理器负责管理打开窗口的大小、布置以及其它相关的方面。 + + +![Top 4 reasons I use dwm for my Linux window manager](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/car-penguin-drive-linux-yellow.png?itok=ueZE5mph "我选择 dwm 作为窗口管理器的 4 大理由") + +图片来自: + +Internet Archive [Book][4] [Images][5] 由 Opensource.com 修改 CC BY-SA 4.0 + + +我喜欢极简的视图。如果可能,我会尽量在一个终端下运行所有需要的程序。这避免了一些浮夸的特效占用我的资源或者分散我的注意力。而且,调整窗口大小和位置却依旧无法使它们完美地对齐,这也让我感到厌烦。 + +出于对极简化的追求,我喜欢上了 [Xfce][6] 并且把它作为我主要的 Linux [桌面环境][7]好几年了。直到后来我看了 [Bryan Lunduke][8] 关于他所使用的 [Awesome][10] [窗口管理器][9]的视频。Awesome 为用户整齐地布置好他们的窗口,看起来就是我想要的效果。我在尝试之后却发现我难以把它配置成我喜欢的样子。于是我继续查找,发现了 [xmonad][11] 然而我遇到了同样的问题。[Xmonad][11] 可以良好运作但为了把它配置成我理想中的样子我却不得不先通过 Haskell 语言这关。(译者: AwesomeWM 使用 lua 语言作为配置语言,而 xmonad 使用 Haskell 语言) + +几年后,我无意间发现了 [suckless.org][12] 和他们的窗口管理器 [dwm][13]。 + +简而言之,一个窗口管理器,例如 KDE,Gnome 或者 Xfce,包括了许多部件,其中除了窗口管理器还有其它应用程序。窗口管理器负责管理打开窗口的大小、布置(以及其它窗口相关的方面)。不同的桌面环境使用不同的窗口管理器,KDE 使用 KWin,Gnome 2 使用 Metacity, Gnome 3 使用 Mutter, 以及 Xfce 使用 Xfwm。你可以方便地替换这些桌面环境的默认窗口管理器。我已经把我的窗口管理器替换成 dwm,下面我说说我喜欢 dwm 的理因。 + +### 动态窗口管理 + +与 Awesome 及 xmonad 一样,dwm 的杀手锏是它能利用屏幕的所有空间为你自动排列好窗口。当然,在现在的大多数桌面环境中,你也可以设置相应的快捷键把你的窗口放置在屏幕的上下左右或者是全屏,但是有了 dwm 我们就不需要考虑这么多了。 + +Dwm 把屏幕分为主区域和栈区域。它包含三种布局:平铺,单片镜(monocle)和浮动。平铺模式是我最常使用的,它把一个主要的窗口放置在主区域,将其余窗口平铺在栈区域中。在单片镜模式中,所有窗口都会被最大化,你可以在它们之间相互切换。浮动模式允许你自由调整窗口大小(就像在大多数窗口管理器下那样),这在你使用像 Gimp +这类需要自定义窗口大小的应用时更为方便。 + +一般情况下,在你的桌面环境下你可以使用不同的工作空间来分类你的窗口,把相近的应用程序放置在计划好的工作空间中。在工作时,我会使用一个工作空间来进行工作同时使用另一个工作空间来浏览网页。Dwm 有一个相似的功能叫标签。你可以使用标签给窗口分组,当你选中一个标签时,就能显示具有相应标签的窗口。 + +### 高效 + +Dwm 能让你的计算机尽量地节省电量。Xfce 和其它轻量桌面环境在较旧或者较低性能的机器上很受欢迎,但是相比于 Xfce,dwm 在登录后只使用了 1/3 的资源(在我的例子中)。当我在使用一台 1 GB 内存的Eee PC (译者:华硕生产的一款上网本,已停产)时,占用 660 MB 和 230MB 的差别就很大了。这让我有足够的内存空间运行我的编辑器和浏览器。 + +### 极简 + +通常,我让我的应用程序彼此相邻:作为主窗口的终端(通常运行着 Vim),用来查阅邮件的浏览器,和另外一个用来查阅资料或者 [Trello][14] 的浏览器窗口。对于临时的网页浏览,我会在另一个工作空间或者说是另一个 _标签_ 中开启一个 Chromium 窗口。 + +### [dwm.png][1] + +![](https://opensource.com/sites/default/files/dwm.png) + +来自作者的屏幕截图。 + +在标准的桌面环境下,通常会有一或两个面板占据着屏幕上下或者两侧的空间。我尝试过使用自动隐藏功能,但当光标太靠近边缘导致面板弹出造成的不便实在让我很厌烦。你也可以把它们设置得更小,但我还是更喜欢 dwm 的极简状态栏。 + +### 速度 + +评判速度时,我比较看重 dwm 在登录后的加载速度和启动程序的速度。如果使用更快更新的计算机,你可能不会在意这些细节,但是对我来说,不同的桌面环境和窗口管理器会有明显的差距。 +我实在不想连这种简单的操作也要等待,它们应该一下子就完成。另外,使用键盘快捷键来启动程序比起用鼠标或者触控板要快一些,而且我不想让双手离开键盘。 + +### 小结 + +即便如此,我也不会向新手用户推荐 dwm。研究如何配置它需要耗费一些时间(除非你对你的发行版提供的默认配置感到满意)。我发现要让一些你想要的补丁正常工作可能会有点棘手,而且相应的社区也比较小(IRC 频道明确表示不提供补丁的手把手教学)。所以,为了得到你想要的效果,你得有些付出才行。不过,这也是值得的。 + +而且你看,它就像 Awesome 一样酷炫。 + +-------------------------------------------------------------------------------- + +作者简介: + +Jimmy Sjölund - Jimmy Sjölund 是 Telia Company 的高级 IT 服务经理,关注团队开发、探索敏捷工作流和精益工作流的创新导师,以及可视化方向爱好者。他同时也是一名开源布道者,先前从事于 Ubuntu Studio 和 Plume Creator。 + +----------------- + +via: https://opensource.com/article/17/7/top-4-reasons-i-use-dwm-linux-window-manager + +作者:[ Jimmy Sjölund Feed ][a] +译者:[haoqixu](https://github.com/haoqixu) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/jimmysjolund +[1]:https://opensource.com/file/363336 +[2]:https://opensource.com/article/17/7/top-4-reasons-i-use-dwm-linux-window-manager?rate=T8qhopZLfd1eum_NMLOSGckUh2nIjfeRpkERGjGhu7w +[3]:https://opensource.com/user/56551/feed +[4]:https://www.flickr.com/photos/internetarchivebookimages/14746482994/in/photolist-ot6zCN-odgbDq-orm48o-otifuv-otdyWa-ouDjnZ-otGT2L-odYVqY-otmff7-otGamG-otnmSg-rxnhoq-orTmKf-otUn6k-otBg1e-Gm6FEf-x4Fh64-otUcGR-wcXsxg-tLTN9R-otrWYV-otnyUE-iaaBKz-ovcPPi-ovokCg-ov4pwM-x8Tdf1-hT5mYr-otb75b-8Zk6XR-vtefQ7-vtehjQ-xhhN9r-vdXhWm-xFBgtQ-vdXdJU-vvTH6R-uyG5rH-vuZChC-xhhGii-vvU5Uv-vvTNpB-vvxqsV-xyN2Ai-vdXcFw-vdXuNC-wBMhes-xxYmxu-vdXxwS-vvU8Zt +[5]:https://www.flickr.com/photos/internetarchivebookimages/14774719031/in/photolist-ovAie2-otPK99-xtDX7p-tmxqWf-ow3i43-odd68o-xUPaxW-yHCtWi-wZVsrD-DExW5g-BrzB7b-CmMpC9-oy4hyF-x3UDWA-ow1m4A-x1ij7w-tBdz9a-tQMoRm-wn3tdw-oegTJz-owgrs2-rtpeX1-vNN6g9-owemNT-x3o3pX-wiJyEs-CGCC4W-owg22q-oeT71w-w6PRMn-Ds8gyR-x2Aodm-owoJQm-owtGp9-qVxppC-xM3Gw7-owgV5J-ou9WEs-wihHtF-CRmosE-uk9vB3-wiKdW6-oeGKq3-oeFS4f-x5AZtd-w6PNuv-xgkofr-wZx1gJ-EaYPED-oxCbFP +[6]:https://xfce.org/ +[7]:https://en.wikipedia.org/wiki/Desktop_environment +[8]:http://lunduke.com/ +[9]:https://en.wikipedia.org/wiki/Window_manager +[10]:https://awesomewm.org/ +[11]:http://xmonad.org/ +[12]:http://suckless.org/ +[13]:http://dwm.suckless.org/ +[14]:https://opensource.com/node/22546 +[15]:https://opensource.com/users/jimmysjolund +[16]:https://opensource.com/users/jimmysjolund +[17]:https://opensource.com/article/17/7/top-4-reasons-i-use-dwm-linux-window-manager#comments From ecf9c733be00f08d87b08aa20bfc64b25971e500 Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 31 Jul 2017 08:44:23 +0800 Subject: [PATCH 0855/1407] translated --- ... with Husarion CORE2-ROS running Ubuntu.md | 56 ------------------- ... with Husarion CORE2-ROS running Ubuntu.md | 54 ++++++++++++++++++ 2 files changed, 54 insertions(+), 56 deletions(-) delete mode 100644 sources/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md create mode 100644 translated/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md diff --git a/sources/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md b/sources/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md deleted file mode 100644 index c8bb81947d..0000000000 --- a/sources/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md +++ /dev/null @@ -1,56 +0,0 @@ -translating---geekpi - -Robot development made easy with Husarion CORE2-ROS running Ubuntu -============================================================ - - - -### Share or save - - _This is the first in a series of two posts by guest blogger; Dominik Nowak, CEO at Husarion._ - -We’ve seen many breakthroughs happening in the IT industry over the last decade. Arguably the most meaningful one on the consumer side was the adoption of smartphones and mobile development. What’s the next big thing, now that the smartphones are so common and, let’s face it, slightly boring? We say: robotics. - -Business knows that well with many manufacturing lines running solely by robots. The consumer and service side, though, have yet to see a massive breakthrough. We believe it’s all a matter of accessibility and lowering the barrier to entry for developers. There just have to be good, simple tools to quickly prototype and develop robots. To test new ideas and empower engineers, so they can solve many of the issues humanity still faces. Issues that are trickier to tackle than a tap in an app. - -Building robots is a challenging task that the [Husarion][2] team is trying to make easier. Husarion is a robotic company working on rapid development platform for robots. The products of the company are CORE2 robotic controller and the cloud platform to manage all CORE2 based robots. CORE2 is the second generation of Husarion’s robotics controller and it’s now available [here][3]. - -CORE2 combines a real-time microcontroller board and a single board computer running Ubuntu. Ubuntu is the most popular Linux distribution not only for [desktops][4], but also for embedded hardware in IoT & [robotics][5] applications. - -![](https://insights.ubuntu.com/wp-content/uploads/2c47/husarion.png) - -CORE2 controller comes in two configurations. The first one with ESP32 Wi-Fi module is dedicated for robotic applications that need low power consumption and real-time, secure remote control. The second one, called CORE2-ROS, basically integrates two boards in one: -– A board with real-time microcontroller running firmware using the Real-Time Operating System (RTOS) and integrating interfaces for motors, encoders and sensors -– A single board computer (SBC) running Linux with ROS packages ([Robot Operating System][6]) and other software tools. - -The ‘real-time’ board does the low-level job. It contains the efficient STM32F4 series microcontroller which is great for driving motors, reading encoders, communicating with sensors and controlling the whole mechatronic or robotic system. In most applications, the CPU load does not exceed a few percents and the real-time operation is guaranteed by a dedicated programming framework based on RTOS. We also assured the compatibility with Arduino libraries. The majority of the tasks are processed in the microcontroller peripherals, such as timers, communication interfaces, ADCs etc. with the strong support of interrupts and DMA channels. In short, it is not a job for a single-board computer that has the other tasks. - -On the other hand, it’s almost obvious that the modern and advanced robotic applications can no longer be based only on microcontrollers, for a few reasons: -– Autonomous robots need a lot of processing power to perform navigation, image and sound recognition, moving in a swarm etc., -– Writing the advanced software requires standardisation to be efficient – SBCs become more and more popular in the industry and the same is observed for the software written for SBCs, which is very similar to PC computers -– SBCs are getting less expensive every year -– Husarion believes that combining these two worlds is very beneficial in robotics. - -CORE2-ROS controller is available in two configurations with [Raspberry Pi 3 ][7]or [ASUS Tinker Board][8]. CORE-ROS is running Ubuntu, Husarion dev & management tools and ROS packets. - -In the next post, find out why Husarion decided to use Ubuntu. - --------------------------------------------------------------------------------- - -via: https://insights.ubuntu.com/2017/07/12/robot-development-made-easy-with-husarion-core2-ros-running-ubuntu/ - -作者:[Guest ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://insights.ubuntu.com/author/guest/ -[1]:https://insights.ubuntu.com/author/guest/ -[2]:https://husarion.com/ -[3]:https://www.crowdsupply.com/husarion/core2 -[4]:https://www.ubuntu.com/desktop -[5]:https://www.ubuntu.com/internet-of-things/robotics -[6]:http://www.ros.org/ -[7]:https://www.raspberrypi.org/products/raspberry-pi-3-model-b/ -[8]:https://www.asus.com/uk/Single-Board-Computer/Tinker-Board/ diff --git a/translated/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md b/translated/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md new file mode 100644 index 0000000000..72d1a8606e --- /dev/null +++ b/translated/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md @@ -0,0 +1,54 @@ +运行 Ubuntu 的 Husarion CORE2-ROS 使得机器人开发变得容易 +============================================================ + + + +### 分享或保存 + +_这是游客投稿的本系列两篇中的第一篇;Dominik Nowak,Husarion 的 CEO _ + +过去十年,我们见证了 IT 行业的许多突破。可以说对消费者最有意义的一个方面是智能手机和移动开发的普及。接下来的大事件是什么,现在智能手机是如此常见,让我们面对它,有点无聊吗?我们猜是:机器人。 + +众所周知,许多生产线完全由机器人运行。但在消费者和服务方面,还没有看到巨大的突破。我们认为这是一个无障碍的问题,并降低开发人员进入的门槛。这只需要好的,简单的工具来快速做出原型和开发机器人。为了测试新的想法并赋予工程师权利,所以他们可以解决许多人类仍然面临的问题。比应用中的点按更棘手的问题。 + +构建机器人是一个具有挑战性的任务,[Husarion][2] 团队正在努力使其更容易。Husarion 是一家从事机器人快速开发平台的机器人公司。该公司的产品是 CORE2 机器人控制器和云平台,它用于管理所有基于 CORE2 的机器人。CORE2 是第二代 Husarion 机器人控制器,它可在[这里][3]看到。 + +CORE2 结合了实时微控制器板和运行 Ubuntu 的单板计算机。Ubuntu 是最受欢迎的 Linux 发行版,不仅适用于[桌面][4],还适用于物联网和 [机器人][5]程序中的嵌入式硬件。 + +![](https://insights.ubuntu.com/wp-content/uploads/2c47/husarion.png) + +CORE2 控制器有两种配置。第一款采用 ESP32 Wi-Fi 模块的专用于需要低功耗和实时、安全遥控的机器人应用。第二个,称为 CORE2-ROS,基本来讲集成了两块板: +- 使用实时操作系统(RTOS)的实时微控制器并集成电机、编码器和传感器接口的电路板 +- 带有 ROS([Robot Operating System] [6])包的运行 Linux 的单板计算机(SBC)和其他软件工具。 + +“实时”电路板做底层工作。它包含高效的 STM32F4 系列微控制器,非常适用于驱动电机、读码器、与传感器通信,并控制整个机电或机器人系统。在大多数应用中,CPU 负载不超过几个百分点,实时操作由基于 RTOS 的专用编程框架保证。我们还保证与 Arduino 库的兼容性。大多数任务都在微控制器外设中处理,如定时器、通信接口、ADC 等,它具有中断和 DMA 通道的强大支持。简而言之,对于具有其他任务的单板计算机来说,这不是一项任务。 + +另一方面,很显然,现代和先进的机器人程序不能仅仅基于微控制器,原因如下: +- 自动机器人需要大量的处理能力来执行导航、图像和声音识别、移动等等, +- 编写先进的软件需要标准化才能有效 - SBC 在行业中越来越受欢迎,而对于为 SBC 编写的软件也是如此,这与 PC 电脑非常相似 +- SBC 每年都变得越来越便宜 +– Husarion 认为,结合这两个世界在机器人技术方面是非常有益的。 + +CORE2-ROS 控制器有两种配置:[Raspberry Pi 3][7] 或 [ASUS Tinker Board][8]。CORE-ROS 运行于 Ubuntu、Husarion 开发和管理工具以及 ROS 软件包上。 + +下篇文章将发现为何 Husarion 决定使用 Ubuntu + +-------------------------------------------------------------------------------- + +via: https://insights.ubuntu.com/2017/07/12/robot-development-made-easy-with-husarion-core2-ros-running-ubuntu/ + +作者:[Guest ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://insights.ubuntu.com/author/guest/ +[1]:https://insights.ubuntu.com/author/guest/ +[2]:https://husarion.com/ +[3]:https://www.crowdsupply.com/husarion/core2 +[4]:https://www.ubuntu.com/desktop +[5]:https://www.ubuntu.com/internet-of-things/robotics +[6]:http://www.ros.org/ +[7]:https://www.raspberrypi.org/products/raspberry-pi-3-model-b/ +[8]:https://www.asus.com/uk/Single-Board-Computer/Tinker-Board/ From b2d168dd1aa123050774243901c2a184d7451cf8 Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 31 Jul 2017 08:46:36 +0800 Subject: [PATCH 0856/1407] translating --- sources/tech/20170712 Storage management in LXD 2.15.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170712 Storage management in LXD 2.15.md b/sources/tech/20170712 Storage management in LXD 2.15.md index c4644d75f8..38cdb26497 100644 --- a/sources/tech/20170712 Storage management in LXD 2.15.md +++ b/sources/tech/20170712 Storage management in LXD 2.15.md @@ -1,3 +1,5 @@ +translating---geekpi + Storage management in LXD 2.15 ============================================================ From e597bccf4bdd4fa4f21265cc471b3f7f3373be6d Mon Sep 17 00:00:00 2001 From: Ezio Date: Mon, 31 Jul 2017 11:08:51 +0800 Subject: [PATCH 0857/1407] =?UTF-8?q?Revert=20"=E7=BF=BB=E8=AF=91=20How=20?= =?UTF-8?q?To=20Install=20OrientDB=20on=20Ubuntu=2016.04=20=E5=AE=8C?= =?UTF-8?q?=E6=88=90"?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...How To Install OrientDB on Ubuntu 16.04.md | 233 ++++++++++++++++++ ...How To Install OrientDB on Ubuntu 16.04.md | 230 ----------------- 2 files changed, 233 insertions(+), 230 deletions(-) create mode 100644 sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md delete mode 100644 translated/tech/How To Install OrientDB on Ubuntu 16.04.md diff --git a/sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md b/sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md new file mode 100644 index 0000000000..75a1824111 --- /dev/null +++ b/sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md @@ -0,0 +1,233 @@ +Translating by a972667237 +NoSQL: How To Install OrientDB on Ubuntu 16.04 +============================================================ + + + [![OrientDB NoSQL DBMS](https://www.unixmen.com/wp-content/uploads/2017/07/orientdb-696x318.png "orientdb")][2] + +### Introduction – NoSQL and OrientDB + +When talking about databases, in general, we refer to two major families: RDBMS (**R**elational **D**ata**b**ase **M**anagement **S**ystem), which use as user and application program interface a language named **S**tructured **Q**uery **L**anguage (or SQL) and non-relational database management systems, or **NoSQL** databases. + +Between the two models there is a huge difference in the way they consider (and store) data. + +#### Relational Database Management Systems + +In the relational model (like MySQL, or its fork, MariaDB), a database is a set of tables, each containing one or more data categories organized in columns. Each row of the DB contains a unique instance of data for categories defined by columns. + +Just as an example, consider a table containing customers. Each row correspond to a customer, with columns for name, address, and every required information. +Another table could contain an order, with product, customer, date and everything else. A user of this DB can obtain a view that fits its needs, for example a report about customers that bought products in a specific range of prices. + +#### NoSQL Database Management Systems + +In the NoSQL (or Not only SQL) database management systems, databases are designed implementing different “formats” for data, like a document, key-value, graph and others. The database systems realized with this paradigm are built especially for large-scale database clusters, and huge web applications. Today, NoSQL databases are used by major companies like Google and Amazon. + +##### Document databases + +Document databases store data in document format. The usage of this kind of DBs is usually raised with JavaScript and JSON, however, XML and other formats are accepted. An example is MongoDB. + +##### Key-value databases + +This is a simple model pairing a unique key with a value. These systems are performant and highly scalable for caching. Examples include BerkeleyDB and MemcacheDB. + +##### Graph databases + +As the name predicts, these databases store data using graph models, meaning that data is organized as nodes and interconnections between them. This is a flexible model which can evolve over time and use. These systems are applied where there is the necessity of mapping relationships. +Examples are IBM Graphs and Neo4j **and OrientDB**. + +### OrientDB + +[OrientDB][3], as stated by the company behind it, is a multi-model NoSQL Database Management System that “ _combines the power of graphs with documents, key/value, reactive, object-oriented and geospatial models into one **scalable, high-performance operational database**“._ + +OrientDB has also support for SQL, with extensions to manipulate trees and graphs. + +### Goals + +This tutorial explains how to install and configure OrientDB Community on a server running Ubuntu 16.04. + +### Download OrientDB + +On an up to date server, download the latest version of OrientDB by executing the following command: + +``` +$ wget -O orientdb-community-2.2.22.tar.gz http://orientdb.com/download.php?file=orientdb-community-2.2.22.tar.gz&os=linux +``` + +This is a tarball containing pre-compiled binaries, so extract the archive with `tar`: + +``` +$ tar -zxf orientdb-community-2.2.22.tar.gz +``` + +Move the extracted directory into `/opt`: + +``` +# mv orientdb-community-2.2.22 /opt/orientdb +``` + +### Start OrientDB Server + +Starting the OrientDB server requires the execution of the shell script contained in `orientdb/bin/`: + +``` +# /opt/orientdb/bin/server.sh +``` + +During the first start, this installer will display some information and will ask for an OrientDB root password: + +``` ++---------------------------------------------------------------+ +| WARNING: FIRST RUN CONFIGURATION | ++---------------------------------------------------------------+ +| This is the first time the server is running. Please type a | +| password of your choice for the 'root' user or leave it blank | +| to auto-generate it. | +| | +| To avoid this message set the environment variable or JVM | +| setting ORIENTDB_ROOT_PASSWORD to the root password to use. | ++---------------------------------------------------------------+ + +Root password [BLANK=auto generate it]: ******** +Please confirm the root password: ******** +``` + +After that, the OrientDB server will start: + +``` +INFO OrientDB Server is active v2.2.22 (build fb2b7d321ea8a5a5b18a82237049804aace9e3de). [OServer] +``` + +From now on, we will need a second terminal to interact with the OrientDB server. + +Stop OrientDB by hitting `Ctrl+C`. + +### Configure a Daemon + +At this point, OrientDB is just a bunch of shell scripts. With a text editor, open `/opt/orientdb/bin/orientdb.sh`: + +``` +# $EDITOR /opt/orientdb/bin/orientdb.sh +``` + +In the first lines, we will see: + +``` +#!/bin/sh +# OrientDB service script +# +# Copyright (c) OrientDB LTD (http://orientdb.com/) + +# chkconfig: 2345 20 80 +# description: OrientDb init script +# processname: orientdb.sh + +# You have to SET the OrientDB installation directory here +ORIENTDB_DIR="YOUR_ORIENTDB_INSTALLATION_PATH" +ORIENTDB_USER="USER_YOU_WANT_ORIENTDB_RUN_WITH" +``` + +Configure `ORIENTDB_DIR` and `ORIENTDB_USER`. + +Create a user, for example **orientdb**, by executing the following command: + +``` +# useradd -r orientdb -s /sbin/nologin +``` + +**orientdb** is the user we enter in the `ORIENTDB_USER` line. + +Change the ownership of `/opt/orientdb`: + +``` +# chown -R orientdb:orientdb /opt/orientdb +``` + +Change the configuration server file’s permission: + +``` +# chmod 640 /opt/orientdb/config/orientdb-server-config.xml +``` + +#### Install the Systemd Service + +OrientDB tarball contains a service file, `/opt/orientdb/bin/orientdb.service`. Copy it to the `/etc/systemd/system` directory: + +``` +# cp /opt/orientdb/bin/orientdb.service /etc/systemd/system +``` + +Edit the OrientDB service file: + +``` +# $EDITOR /etc/systemd/system/orientdb.service +``` + +There, the `[service]` block should look like this: + +``` +[Service] +User=ORIENTDB_USER +Group=ORIENTDB_GROUP +ExecStart=$ORIENTDB_HOME/bin/server.sh +``` + +Edit as follow: + +``` +[Service] +User=orientdb +Group=orientdb +ExecStart=/opt/orientdb/bin/server.sh +``` + +Save and exit. + +Reload systemd daemon service: + +``` +# systemctl daemon-reload +``` + +Start OrientDB and enable for starting at boot time: + +``` +# systemctl start orientdb +# systemctl enable orientdb +``` + +Check OrientDB status: + +``` +# systemctl status orientdb +``` + +The command should output: + +``` +● orientdb.service - OrientDB Server + Loaded: loaded (/etc/systemd/system/orientdb.service; disabled; vendor preset: enabled) + Active: active (running) ... +``` + +And that’s all! OrientDB Community is installed and correctly running. + +### Conclusion + +In this tutorial we have seen a brief comparison between RDBMS and NoSQL DBMS. We have also installed and completed a basic configuration of OrientDB Community server-side. + +This is the first step for deploying a full OrientDB infrastructure, ready for managing large-scale systems data. + +-------------------------------------------------------------------------------- + +via: https://www.unixmen.com/nosql-install-orientdb-ubuntu-16-04/ + +作者:[Giuseppe Molica ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.unixmen.com/author/tutan/ +[1]:https://www.unixmen.com/author/tutan/ +[2]:https://www.unixmen.com/wp-content/uploads/2017/07/orientdb.png +[3]:https://orientdb.com/ diff --git a/translated/tech/How To Install OrientDB on Ubuntu 16.04.md b/translated/tech/How To Install OrientDB on Ubuntu 16.04.md deleted file mode 100644 index bc87d99fbb..0000000000 --- a/translated/tech/How To Install OrientDB on Ubuntu 16.04.md +++ /dev/null @@ -1,230 +0,0 @@ -非关系型数据库: 如何在 Ubuntu 16.04 上安装 OrientDB -============================================================ - - - ![OrientDB NoSQL DBMS]【(https://www.unixmen.com/wp-content/uploads/2017/07/orientdb-696x318.png "orientdb")][2] - -### 说明 - 非关系型数据库和 OrientDB - -通常在我们提及数据库的时候,想到的是两个主要的分类:用于用户和应用程序之间进行对接的一种被称为结构化查询语言(**S**tructured **Q**uery **L**anguage or SQL)的关系型数据库管理系统(RDBMS, **R**elational **D**ata **b**ase **M**anagement **S**ystem) 以及非关系型数据库管理系统(non-relational database management systems 或称 NoSQL 数据库). - -这两个模型,在如何处理(存储)数据的方面存在着巨大的差异。 - -#### 关系数据库管理系统 - -在关系模型中(如MySQL,或者其分支 MariaDB),一个数据库是一系列包含一个或多个以列组织的数据实例的表。数据库的每行包含一个唯一的由列定义的数据实例。 - -举个例子,想象一个包含客户的表。每一行相当于一个客户,而其中的每一列分别对应名字、地址以及其他所必须的信息。 - -而另一个表可能是包含订单、产品、客户、日期以及其他一切。而这个数据库的使用者则可以获得一个满足其需要的视图,例如一个客户在一个特定的价格范围购买产品的报告。 - -#### 非关系型数据库管理系统 - -在非关系型数据库(或称不仅仅是数据库)管理系统中,数据库被设计为使用不同的方式存储数据,比如文档存储、键值对存储、图形关系存储以及其他方式存储。使用此种形式实现的数据库系统专门被用于大型数据库集群和大型 Web 应用。现今,非关系型数据库被用于某些大公司,如谷歌和亚马逊。 - -##### 文档存储数据库 - -文档存储数据库是将数据用文档的形式存储。这种类型的运用通常表现为 JavaScript 和 JSON,实际上,XML 和其他形式的存储也是可以被采用的。这里的一个例子就是 MongoDB。 - -##### 键值对存储数据库 - -这是一个唯一键(key)配对一个值(value)的简单模型。这个系统在高速缓存方面具有高性能和高度可扩展性。这里的例子包括 BerkeleyDB 和 MemacacheDB。 -##### 图形关系数据库 - -正如其名,这种数据库通过使用图模型存储数据,这意味着数据通过节点和两个节点之间的互连进行组织。这是一个可以随着时间的推移和使用而发展的灵活模型。这个系统应用于那些强调映射关系的地方。这里的例子有 IBM Graphs、Neo4j 以及 **OrientDB**。 - -### OrientDB - -[OrientDB][3] 是一个多模式的非关系型数据库管理系统。正如开发它的公司所说的“_它是一个将图形与文档、键值对、反应性、面向对象和地理空间模型结合在一起的**可扩展的、高性能的数据库**_”。 - -OrientDB 还支持 SQL 来扩展操作树和图。 - -### 目标 - -这个教程旨在教会大家如何在运行 Ubuntu 16.04 的服务器上下载和配置 OrientDB 公开版。 - -### 下载 OrientDB - -我们可以从最新的服务端上通过输入下面的指令来下载最新版本的 OrientDB。 - -``` -$ wget -O orientdb-community-2.2.22.tar.gz http://orientdb.com/download.php?file=orientdb-community-2.2.22.tar.gz&os=linux -``` - -这里下载的是一个包含预编译二进制文件的压缩包,所以我们可以使用 `tar` 指令来操作解压它: - -``` -$ tar -zxf orientdb-community-2.2.22.tar.gz -``` - -将从中提取出来的文件夹整体移动到 `/opt`: - -``` -# mv orientdb-community-2.2.22 /opt/orientdb -``` - -### 启动 OrientDB Server - -启动 OrientDB 服务 需要运行 `orientdb/bin/` 目录下的shell: - -``` -# /opt/orientdb/bin/server.sh -``` - -如果你是第一次开启 OrientDB 服务,安装程序还会显示一些提示信息以及提醒你设置 OrientDB 的 root 用户密码: -``` -+---------------------------------------------------------------+ -| WARNING: FIRST RUN CONFIGURATION | -+---------------------------------------------------------------+ -| This is the first time the server is running. Please type a | -| password of your choice for the 'root' user or leave it blank | -| to auto-generate it. | -| | -| To avoid this message set the environment variable or JVM | -| setting ORIENTDB_ROOT_PASSWORD to the root password to use. | -+---------------------------------------------------------------+ - -Root password [BLANK=auto generate it]: ******** -Please confirm the root password: ******** -``` - -在完成这些后,OrientDB 数据库服务将成功启动: -``` -INFO OrientDB Server is active v2.2.22 (build fb2b7d321ea8a5a5b18a82237049804aace9e3de). [OServer] -``` - -从现在开始,我们需要第二个终端来与 OrientDB 服务进行交互。(有些问题) - -若要强制停止 OrientDB 执行 `Ctrl+C` 即可。 - -### 配置守护进程 - - -此时,我们可以认为 OrientDB 仅仅是一串 shell 脚本,可以用编辑器打开 `/opt/orientdb/bin/orientdb.sh`: - -``` -# $EDITOR /opt/orientdb/bin/orientdb.sh -``` - -在它的首段,我们可以看到: - -``` -#!/bin/sh -# OrientDB service script -# -# Copyright (c) OrientDB LTD (http://orientdb.com/) - -# chkconfig: 2345 20 80 -# description: OrientDb init script -# processname: orientdb.sh - -# You have to SET the OrientDB installation directory here -ORIENTDB_DIR="YOUR_ORIENTDB_INSTALLATION_PATH" -ORIENTDB_USER="USER_YOU_WANT_ORIENTDB_RUN_WITH" -``` - -我们需要配置`ORIENTDB_DIR` 以及 `ORIENTDB_USER`. - -然后创建一个用户,例如我们创建一个名为**orientdb**的用户,我们需要输入下面的指令: - -``` -# useradd -r orientdb -s /sbin/nologin -``` - -**orientdb** 就是我们在 `ORIENTDB_USER` 输入处的用户。 - -再更改 `/opt/orientdb` 目录的所有权: - -``` -# chown -R orientdb:orientdb /opt/orientdb -``` - -改变服务配置文件的权限: - -``` -# chmod 640 /opt/orientdb/config/orientdb-server-config.xml -``` - -#### 下载系统守护进程服务 - -OrientDB 的压缩包包含一个服务文件`/opt/orientdb/bin/orientdb.service`。我们将其复制到 `/etc/systemd/system` 文件夹下: - -``` -# cp /opt/orientdb/bin/orientdb.service /etc/systemd/system -``` - -编辑该服务文件: - -``` -# $EDITOR /etc/systemd/system/orientdb.service -``` - -其中`[service]` 内容块看起来应该是这样的: - -``` -[Service] -User=ORIENTDB_USER -Group=ORIENTDB_GROUP -ExecStart=$ORIENTDB_HOME/bin/server.sh -``` - -将其改成如下样式: - -``` -[Service] -User=orientdb -Group=orientdb -ExecStart=/opt/orientdb/bin/server.sh -``` - -保存并退出。 - -重新加载系统守护进程: - -``` -# systemctl daemon-reload -``` - -启动 OrientDB 并同意其开机自启动: - -``` -# systemctl start orientdb -# systemctl enable orientdb -``` - -确认 OrientDB 的状态: - -``` -# systemctl status orientdb -``` - -上述指令应该会输出: - -``` -● orientdb.service - OrientDB Server - Loaded: loaded (/etc/systemd/system/orientdb.service; disabled; vendor preset: enabled) - Active: active (running) ... -``` - -流程就是这样了!OrientDB 社区版成功安装并且正确运行在我们的服务器上了。 - -### 总结 - -在这个指导中,我们看到了一些关系型数据库管理系统(RDBMS)以及非关系型数据库管理系统(NoSQL DBMS)的简单对照。我们也安装 OrientDB 社区版的服务器端并完成了其基础的配置。 - -这是我们部署完全的 OrientDB 基础设施的第一步,也是我们用于管理大型系统数据的起步。 - --------------------------------------------------------------------------------- - -via: https://www.unixmen.com/nosql-install-orientdb-ubuntu-16-04/ - -作者:[Giuseppe Molica ][a] -译者:[a92667237](https://github.com/a972667237) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.unixmen.com/author/tutan/ -[1]:https://www.unixmen.com/author/tutan/ -[2]:https://www.unixmen.com/wp-content/uploads/2017/07/orientdb.png -[3]:https://orientdb.com/ From 7157377659558f82a5ed65b7e84dcda37e968da4 Mon Sep 17 00:00:00 2001 From: Wueiz Date: Mon, 31 Jul 2017 11:24:57 +0800 Subject: [PATCH 0858/1407] Rename How To Install OrientDB on Ubuntu 16.04.md to 20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md --- ... => 20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md} | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename translated/tech/{How To Install OrientDB on Ubuntu 16.04.md => 20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md} (100%) diff --git a/translated/tech/How To Install OrientDB on Ubuntu 16.04.md b/translated/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md similarity index 100% rename from translated/tech/How To Install OrientDB on Ubuntu 16.04.md rename to translated/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md From 70ffd941bb764c66981812832784d4ce4f344056 Mon Sep 17 00:00:00 2001 From: VicYu Date: Mon, 31 Jul 2017 15:29:25 +0800 Subject: [PATCH 0859/1407] =?UTF-8?q?Revert=20"Revert=20"=E7=BF=BB?= =?UTF-8?q?=E8=AF=91=20How=20To=20Install=20OrientDB=20on=20Ubuntu=2016.04?= =?UTF-8?q?=20=E5=AE=8C=E6=88=90""?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...How To Install OrientDB on Ubuntu 16.04.md | 233 ------------------ ...How To Install OrientDB on Ubuntu 16.04.md | 230 +++++++++++++++++ 2 files changed, 230 insertions(+), 233 deletions(-) delete mode 100644 sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md create mode 100644 translated/tech/How To Install OrientDB on Ubuntu 16.04.md diff --git a/sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md b/sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md deleted file mode 100644 index 75a1824111..0000000000 --- a/sources/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md +++ /dev/null @@ -1,233 +0,0 @@ -Translating by a972667237 -NoSQL: How To Install OrientDB on Ubuntu 16.04 -============================================================ - - - [![OrientDB NoSQL DBMS](https://www.unixmen.com/wp-content/uploads/2017/07/orientdb-696x318.png "orientdb")][2] - -### Introduction – NoSQL and OrientDB - -When talking about databases, in general, we refer to two major families: RDBMS (**R**elational **D**ata**b**ase **M**anagement **S**ystem), which use as user and application program interface a language named **S**tructured **Q**uery **L**anguage (or SQL) and non-relational database management systems, or **NoSQL** databases. - -Between the two models there is a huge difference in the way they consider (and store) data. - -#### Relational Database Management Systems - -In the relational model (like MySQL, or its fork, MariaDB), a database is a set of tables, each containing one or more data categories organized in columns. Each row of the DB contains a unique instance of data for categories defined by columns. - -Just as an example, consider a table containing customers. Each row correspond to a customer, with columns for name, address, and every required information. -Another table could contain an order, with product, customer, date and everything else. A user of this DB can obtain a view that fits its needs, for example a report about customers that bought products in a specific range of prices. - -#### NoSQL Database Management Systems - -In the NoSQL (or Not only SQL) database management systems, databases are designed implementing different “formats” for data, like a document, key-value, graph and others. The database systems realized with this paradigm are built especially for large-scale database clusters, and huge web applications. Today, NoSQL databases are used by major companies like Google and Amazon. - -##### Document databases - -Document databases store data in document format. The usage of this kind of DBs is usually raised with JavaScript and JSON, however, XML and other formats are accepted. An example is MongoDB. - -##### Key-value databases - -This is a simple model pairing a unique key with a value. These systems are performant and highly scalable for caching. Examples include BerkeleyDB and MemcacheDB. - -##### Graph databases - -As the name predicts, these databases store data using graph models, meaning that data is organized as nodes and interconnections between them. This is a flexible model which can evolve over time and use. These systems are applied where there is the necessity of mapping relationships. -Examples are IBM Graphs and Neo4j **and OrientDB**. - -### OrientDB - -[OrientDB][3], as stated by the company behind it, is a multi-model NoSQL Database Management System that “ _combines the power of graphs with documents, key/value, reactive, object-oriented and geospatial models into one **scalable, high-performance operational database**“._ - -OrientDB has also support for SQL, with extensions to manipulate trees and graphs. - -### Goals - -This tutorial explains how to install and configure OrientDB Community on a server running Ubuntu 16.04. - -### Download OrientDB - -On an up to date server, download the latest version of OrientDB by executing the following command: - -``` -$ wget -O orientdb-community-2.2.22.tar.gz http://orientdb.com/download.php?file=orientdb-community-2.2.22.tar.gz&os=linux -``` - -This is a tarball containing pre-compiled binaries, so extract the archive with `tar`: - -``` -$ tar -zxf orientdb-community-2.2.22.tar.gz -``` - -Move the extracted directory into `/opt`: - -``` -# mv orientdb-community-2.2.22 /opt/orientdb -``` - -### Start OrientDB Server - -Starting the OrientDB server requires the execution of the shell script contained in `orientdb/bin/`: - -``` -# /opt/orientdb/bin/server.sh -``` - -During the first start, this installer will display some information and will ask for an OrientDB root password: - -``` -+---------------------------------------------------------------+ -| WARNING: FIRST RUN CONFIGURATION | -+---------------------------------------------------------------+ -| This is the first time the server is running. Please type a | -| password of your choice for the 'root' user or leave it blank | -| to auto-generate it. | -| | -| To avoid this message set the environment variable or JVM | -| setting ORIENTDB_ROOT_PASSWORD to the root password to use. | -+---------------------------------------------------------------+ - -Root password [BLANK=auto generate it]: ******** -Please confirm the root password: ******** -``` - -After that, the OrientDB server will start: - -``` -INFO OrientDB Server is active v2.2.22 (build fb2b7d321ea8a5a5b18a82237049804aace9e3de). [OServer] -``` - -From now on, we will need a second terminal to interact with the OrientDB server. - -Stop OrientDB by hitting `Ctrl+C`. - -### Configure a Daemon - -At this point, OrientDB is just a bunch of shell scripts. With a text editor, open `/opt/orientdb/bin/orientdb.sh`: - -``` -# $EDITOR /opt/orientdb/bin/orientdb.sh -``` - -In the first lines, we will see: - -``` -#!/bin/sh -# OrientDB service script -# -# Copyright (c) OrientDB LTD (http://orientdb.com/) - -# chkconfig: 2345 20 80 -# description: OrientDb init script -# processname: orientdb.sh - -# You have to SET the OrientDB installation directory here -ORIENTDB_DIR="YOUR_ORIENTDB_INSTALLATION_PATH" -ORIENTDB_USER="USER_YOU_WANT_ORIENTDB_RUN_WITH" -``` - -Configure `ORIENTDB_DIR` and `ORIENTDB_USER`. - -Create a user, for example **orientdb**, by executing the following command: - -``` -# useradd -r orientdb -s /sbin/nologin -``` - -**orientdb** is the user we enter in the `ORIENTDB_USER` line. - -Change the ownership of `/opt/orientdb`: - -``` -# chown -R orientdb:orientdb /opt/orientdb -``` - -Change the configuration server file’s permission: - -``` -# chmod 640 /opt/orientdb/config/orientdb-server-config.xml -``` - -#### Install the Systemd Service - -OrientDB tarball contains a service file, `/opt/orientdb/bin/orientdb.service`. Copy it to the `/etc/systemd/system` directory: - -``` -# cp /opt/orientdb/bin/orientdb.service /etc/systemd/system -``` - -Edit the OrientDB service file: - -``` -# $EDITOR /etc/systemd/system/orientdb.service -``` - -There, the `[service]` block should look like this: - -``` -[Service] -User=ORIENTDB_USER -Group=ORIENTDB_GROUP -ExecStart=$ORIENTDB_HOME/bin/server.sh -``` - -Edit as follow: - -``` -[Service] -User=orientdb -Group=orientdb -ExecStart=/opt/orientdb/bin/server.sh -``` - -Save and exit. - -Reload systemd daemon service: - -``` -# systemctl daemon-reload -``` - -Start OrientDB and enable for starting at boot time: - -``` -# systemctl start orientdb -# systemctl enable orientdb -``` - -Check OrientDB status: - -``` -# systemctl status orientdb -``` - -The command should output: - -``` -● orientdb.service - OrientDB Server - Loaded: loaded (/etc/systemd/system/orientdb.service; disabled; vendor preset: enabled) - Active: active (running) ... -``` - -And that’s all! OrientDB Community is installed and correctly running. - -### Conclusion - -In this tutorial we have seen a brief comparison between RDBMS and NoSQL DBMS. We have also installed and completed a basic configuration of OrientDB Community server-side. - -This is the first step for deploying a full OrientDB infrastructure, ready for managing large-scale systems data. - --------------------------------------------------------------------------------- - -via: https://www.unixmen.com/nosql-install-orientdb-ubuntu-16-04/ - -作者:[Giuseppe Molica ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.unixmen.com/author/tutan/ -[1]:https://www.unixmen.com/author/tutan/ -[2]:https://www.unixmen.com/wp-content/uploads/2017/07/orientdb.png -[3]:https://orientdb.com/ diff --git a/translated/tech/How To Install OrientDB on Ubuntu 16.04.md b/translated/tech/How To Install OrientDB on Ubuntu 16.04.md new file mode 100644 index 0000000000..bc87d99fbb --- /dev/null +++ b/translated/tech/How To Install OrientDB on Ubuntu 16.04.md @@ -0,0 +1,230 @@ +非关系型数据库: 如何在 Ubuntu 16.04 上安装 OrientDB +============================================================ + + + ![OrientDB NoSQL DBMS]【(https://www.unixmen.com/wp-content/uploads/2017/07/orientdb-696x318.png "orientdb")][2] + +### 说明 - 非关系型数据库和 OrientDB + +通常在我们提及数据库的时候,想到的是两个主要的分类:用于用户和应用程序之间进行对接的一种被称为结构化查询语言(**S**tructured **Q**uery **L**anguage or SQL)的关系型数据库管理系统(RDBMS, **R**elational **D**ata **b**ase **M**anagement **S**ystem) 以及非关系型数据库管理系统(non-relational database management systems 或称 NoSQL 数据库). + +这两个模型,在如何处理(存储)数据的方面存在着巨大的差异。 + +#### 关系数据库管理系统 + +在关系模型中(如MySQL,或者其分支 MariaDB),一个数据库是一系列包含一个或多个以列组织的数据实例的表。数据库的每行包含一个唯一的由列定义的数据实例。 + +举个例子,想象一个包含客户的表。每一行相当于一个客户,而其中的每一列分别对应名字、地址以及其他所必须的信息。 + +而另一个表可能是包含订单、产品、客户、日期以及其他一切。而这个数据库的使用者则可以获得一个满足其需要的视图,例如一个客户在一个特定的价格范围购买产品的报告。 + +#### 非关系型数据库管理系统 + +在非关系型数据库(或称不仅仅是数据库)管理系统中,数据库被设计为使用不同的方式存储数据,比如文档存储、键值对存储、图形关系存储以及其他方式存储。使用此种形式实现的数据库系统专门被用于大型数据库集群和大型 Web 应用。现今,非关系型数据库被用于某些大公司,如谷歌和亚马逊。 + +##### 文档存储数据库 + +文档存储数据库是将数据用文档的形式存储。这种类型的运用通常表现为 JavaScript 和 JSON,实际上,XML 和其他形式的存储也是可以被采用的。这里的一个例子就是 MongoDB。 + +##### 键值对存储数据库 + +这是一个唯一键(key)配对一个值(value)的简单模型。这个系统在高速缓存方面具有高性能和高度可扩展性。这里的例子包括 BerkeleyDB 和 MemacacheDB。 +##### 图形关系数据库 + +正如其名,这种数据库通过使用图模型存储数据,这意味着数据通过节点和两个节点之间的互连进行组织。这是一个可以随着时间的推移和使用而发展的灵活模型。这个系统应用于那些强调映射关系的地方。这里的例子有 IBM Graphs、Neo4j 以及 **OrientDB**。 + +### OrientDB + +[OrientDB][3] 是一个多模式的非关系型数据库管理系统。正如开发它的公司所说的“_它是一个将图形与文档、键值对、反应性、面向对象和地理空间模型结合在一起的**可扩展的、高性能的数据库**_”。 + +OrientDB 还支持 SQL 来扩展操作树和图。 + +### 目标 + +这个教程旨在教会大家如何在运行 Ubuntu 16.04 的服务器上下载和配置 OrientDB 公开版。 + +### 下载 OrientDB + +我们可以从最新的服务端上通过输入下面的指令来下载最新版本的 OrientDB。 + +``` +$ wget -O orientdb-community-2.2.22.tar.gz http://orientdb.com/download.php?file=orientdb-community-2.2.22.tar.gz&os=linux +``` + +这里下载的是一个包含预编译二进制文件的压缩包,所以我们可以使用 `tar` 指令来操作解压它: + +``` +$ tar -zxf orientdb-community-2.2.22.tar.gz +``` + +将从中提取出来的文件夹整体移动到 `/opt`: + +``` +# mv orientdb-community-2.2.22 /opt/orientdb +``` + +### 启动 OrientDB Server + +启动 OrientDB 服务 需要运行 `orientdb/bin/` 目录下的shell: + +``` +# /opt/orientdb/bin/server.sh +``` + +如果你是第一次开启 OrientDB 服务,安装程序还会显示一些提示信息以及提醒你设置 OrientDB 的 root 用户密码: +``` ++---------------------------------------------------------------+ +| WARNING: FIRST RUN CONFIGURATION | ++---------------------------------------------------------------+ +| This is the first time the server is running. Please type a | +| password of your choice for the 'root' user or leave it blank | +| to auto-generate it. | +| | +| To avoid this message set the environment variable or JVM | +| setting ORIENTDB_ROOT_PASSWORD to the root password to use. | ++---------------------------------------------------------------+ + +Root password [BLANK=auto generate it]: ******** +Please confirm the root password: ******** +``` + +在完成这些后,OrientDB 数据库服务将成功启动: +``` +INFO OrientDB Server is active v2.2.22 (build fb2b7d321ea8a5a5b18a82237049804aace9e3de). [OServer] +``` + +从现在开始,我们需要第二个终端来与 OrientDB 服务进行交互。(有些问题) + +若要强制停止 OrientDB 执行 `Ctrl+C` 即可。 + +### 配置守护进程 + + +此时,我们可以认为 OrientDB 仅仅是一串 shell 脚本,可以用编辑器打开 `/opt/orientdb/bin/orientdb.sh`: + +``` +# $EDITOR /opt/orientdb/bin/orientdb.sh +``` + +在它的首段,我们可以看到: + +``` +#!/bin/sh +# OrientDB service script +# +# Copyright (c) OrientDB LTD (http://orientdb.com/) + +# chkconfig: 2345 20 80 +# description: OrientDb init script +# processname: orientdb.sh + +# You have to SET the OrientDB installation directory here +ORIENTDB_DIR="YOUR_ORIENTDB_INSTALLATION_PATH" +ORIENTDB_USER="USER_YOU_WANT_ORIENTDB_RUN_WITH" +``` + +我们需要配置`ORIENTDB_DIR` 以及 `ORIENTDB_USER`. + +然后创建一个用户,例如我们创建一个名为**orientdb**的用户,我们需要输入下面的指令: + +``` +# useradd -r orientdb -s /sbin/nologin +``` + +**orientdb** 就是我们在 `ORIENTDB_USER` 输入处的用户。 + +再更改 `/opt/orientdb` 目录的所有权: + +``` +# chown -R orientdb:orientdb /opt/orientdb +``` + +改变服务配置文件的权限: + +``` +# chmod 640 /opt/orientdb/config/orientdb-server-config.xml +``` + +#### 下载系统守护进程服务 + +OrientDB 的压缩包包含一个服务文件`/opt/orientdb/bin/orientdb.service`。我们将其复制到 `/etc/systemd/system` 文件夹下: + +``` +# cp /opt/orientdb/bin/orientdb.service /etc/systemd/system +``` + +编辑该服务文件: + +``` +# $EDITOR /etc/systemd/system/orientdb.service +``` + +其中`[service]` 内容块看起来应该是这样的: + +``` +[Service] +User=ORIENTDB_USER +Group=ORIENTDB_GROUP +ExecStart=$ORIENTDB_HOME/bin/server.sh +``` + +将其改成如下样式: + +``` +[Service] +User=orientdb +Group=orientdb +ExecStart=/opt/orientdb/bin/server.sh +``` + +保存并退出。 + +重新加载系统守护进程: + +``` +# systemctl daemon-reload +``` + +启动 OrientDB 并同意其开机自启动: + +``` +# systemctl start orientdb +# systemctl enable orientdb +``` + +确认 OrientDB 的状态: + +``` +# systemctl status orientdb +``` + +上述指令应该会输出: + +``` +● orientdb.service - OrientDB Server + Loaded: loaded (/etc/systemd/system/orientdb.service; disabled; vendor preset: enabled) + Active: active (running) ... +``` + +流程就是这样了!OrientDB 社区版成功安装并且正确运行在我们的服务器上了。 + +### 总结 + +在这个指导中,我们看到了一些关系型数据库管理系统(RDBMS)以及非关系型数据库管理系统(NoSQL DBMS)的简单对照。我们也安装 OrientDB 社区版的服务器端并完成了其基础的配置。 + +这是我们部署完全的 OrientDB 基础设施的第一步,也是我们用于管理大型系统数据的起步。 + +-------------------------------------------------------------------------------- + +via: https://www.unixmen.com/nosql-install-orientdb-ubuntu-16-04/ + +作者:[Giuseppe Molica ][a] +译者:[a92667237](https://github.com/a972667237) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.unixmen.com/author/tutan/ +[1]:https://www.unixmen.com/author/tutan/ +[2]:https://www.unixmen.com/wp-content/uploads/2017/07/orientdb.png +[3]:https://orientdb.com/ From f792d23ea29395b7349ba7df41c16966324cf6d7 Mon Sep 17 00:00:00 2001 From: DPueng <30588988+DPueng@users.noreply.github.com> Date: Mon, 31 Jul 2017 17:06:36 +0800 Subject: [PATCH 0860/1407] Update 20170202 Why we need open leaders more than ever.md --- .../talk/20170202 Why we need open leaders more than ever.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/talk/20170202 Why we need open leaders more than ever.md b/sources/talk/20170202 Why we need open leaders more than ever.md index 8694cbbcce..bcaf9903fe 100644 --- a/sources/talk/20170202 Why we need open leaders more than ever.md +++ b/sources/talk/20170202 Why we need open leaders more than ever.md @@ -1,3 +1,5 @@ +Translated by DPueng + Why we need open leaders more than ever ============================================================ From 79ea4935715b7d748bd06b7b6bfa56e2eea1bfaa Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 31 Jul 2017 22:23:49 +0800 Subject: [PATCH 0861/1407] PRF:20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @a92667237 祝贺你完成了第一篇翻译! --- ...How To Install OrientDB on Ubuntu 16.04.md | 57 ++++++++++--------- 1 file changed, 29 insertions(+), 28 deletions(-) diff --git a/translated/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md b/translated/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md index bc87d99fbb..c89e4d9b31 100644 --- a/translated/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md +++ b/translated/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md @@ -1,26 +1,25 @@ -非关系型数据库: 如何在 Ubuntu 16.04 上安装 OrientDB +NoSQL: 如何在 Ubuntu 16.04 上安装 OrientDB ============================================================ + ![OrientDB NoSQL DBMS](https://www.unixmen.com/wp-content/uploads/2017/07/orientdb-696x318.png "orientdb") - ![OrientDB NoSQL DBMS]【(https://www.unixmen.com/wp-content/uploads/2017/07/orientdb-696x318.png "orientdb")][2] +### 说明 - 非关系型数据库(NoSQL)和 OrientDB -### 说明 - 非关系型数据库和 OrientDB +通常在我们提及数据库的时候,想到的是两个主要的分类:使用用于用户和应用程序之间进行对接的一种被称为结构化查询语言(**S**tructured **Q**uery **L**anguage ,缩写 SQL)的关系型数据库管理系统(**R**elational **D**ata **b**ase **M**anagement **S**ystem,缩写 RDBMS) 以及非关系型数据库管理系统(non-relational database management systems 或称 NoSQL 数据库)。 -通常在我们提及数据库的时候,想到的是两个主要的分类:用于用户和应用程序之间进行对接的一种被称为结构化查询语言(**S**tructured **Q**uery **L**anguage or SQL)的关系型数据库管理系统(RDBMS, **R**elational **D**ata **b**ase **M**anagement **S**ystem) 以及非关系型数据库管理系统(non-relational database management systems 或称 NoSQL 数据库). - -这两个模型,在如何处理(存储)数据的方面存在着巨大的差异。 +这两种模型在如何处理(存储)数据的方面存在着巨大的差异。 #### 关系数据库管理系统 -在关系模型中(如MySQL,或者其分支 MariaDB),一个数据库是一系列包含一个或多个以列组织的数据实例的表。数据库的每行包含一个唯一的由列定义的数据实例。 +在关系模型中(如 MySQL,或者其分支 MariaDB),一个数据库是一个表的集合,其中每个表包含一个或多个以列组织的数据分类。数据库的每行包含一个唯一的数据实例,其分类由列定义。 举个例子,想象一个包含客户的表。每一行相当于一个客户,而其中的每一列分别对应名字、地址以及其他所必须的信息。 -而另一个表可能是包含订单、产品、客户、日期以及其他一切。而这个数据库的使用者则可以获得一个满足其需要的视图,例如一个客户在一个特定的价格范围购买产品的报告。 +而另一个表可能是包含订单、产品、客户、日期以及其它的种种。而这个数据库的使用者则可以获得一个满足其需要的视图,例如一个客户在一个特定的价格范围购买产品的报告。 #### 非关系型数据库管理系统 -在非关系型数据库(或称不仅仅是数据库)管理系统中,数据库被设计为使用不同的方式存储数据,比如文档存储、键值对存储、图形关系存储以及其他方式存储。使用此种形式实现的数据库系统专门被用于大型数据库集群和大型 Web 应用。现今,非关系型数据库被用于某些大公司,如谷歌和亚马逊。 +在非关系型数据库(或称为不仅仅是数据库Not only SQL)管理系统中,数据库被设计为使用不同的方式存储数据,比如文档存储、键值对存储、图形关系存储以及其他方式存储。使用此种形式实现的数据库系统专门被用于大型数据库集群和大型 Web 应用。现今,非关系型数据库被用于某些大公司,如谷歌和亚马逊。 ##### 文档存储数据库 @@ -28,20 +27,21 @@ ##### 键值对存储数据库 -这是一个唯一键(key)配对一个值(value)的简单模型。这个系统在高速缓存方面具有高性能和高度可扩展性。这里的例子包括 BerkeleyDB 和 MemacacheDB。 +这是一个由唯一的key配对一个value的简单模型。这个系统在高速缓存方面具有高性能和高度可扩展性。这里的例子包括 BerkeleyDB 和 MemacacheDB。 + ##### 图形关系数据库 -正如其名,这种数据库通过使用图模型存储数据,这意味着数据通过节点和两个节点之间的互连进行组织。这是一个可以随着时间的推移和使用而发展的灵活模型。这个系统应用于那些强调映射关系的地方。这里的例子有 IBM Graphs、Neo4j 以及 **OrientDB**。 +正如其名,这种数据库通过使用graph模型存储数据,这意味着数据通过节点和节点之间的互连进行组织。这是一个可以随着时间的推移和使用而发展的灵活模型。这个系统应用于那些强调映射关系的地方。这里的例子有 IBM Graphs、Neo4j 以及 **OrientDB**。 ### OrientDB -[OrientDB][3] 是一个多模式的非关系型数据库管理系统。正如开发它的公司所说的“_它是一个将图形与文档、键值对、反应性、面向对象和地理空间模型结合在一起的**可扩展的、高性能的数据库**_”。 +[OrientDB][3] 是一个多模式的非关系型数据库管理系统。正如开发它的公司所说的“_它是一个将图形关系与文档、键值对、反应性、面向对象和地理空间模型结合在一起的**可扩展的、高性能的数据库**_”。 -OrientDB 还支持 SQL 来扩展操作树和图。 +OrientDB 还支持 SQL ,经过扩展可以用来操作树和图。 ### 目标 -这个教程旨在教会大家如何在运行 Ubuntu 16.04 的服务器上下载和配置 OrientDB 公开版。 +这个教程旨在教会大家如何在运行 Ubuntu 16.04 的服务器上下载并配置 OrientDB 社区版。 ### 下载 OrientDB @@ -63,15 +63,16 @@ $ tar -zxf orientdb-community-2.2.22.tar.gz # mv orientdb-community-2.2.22 /opt/orientdb ``` -### 启动 OrientDB Server +### 启动 OrientDB 服务器 -启动 OrientDB 服务 需要运行 `orientdb/bin/` 目录下的shell: +启动 OrientDB 服务器需要运行 `orientdb/bin/` 目录下的 shell 脚本: ``` # /opt/orientdb/bin/server.sh ``` -如果你是第一次开启 OrientDB 服务,安装程序还会显示一些提示信息以及提醒你设置 OrientDB 的 root 用户密码: +如果你是第一次开启 OrientDB 服务器,安装程序还会显示一些提示信息,以及提醒你设置 OrientDB 的 root 用户密码: + ``` +---------------------------------------------------------------+ | WARNING: FIRST RUN CONFIGURATION | @@ -88,18 +89,18 @@ Root password [BLANK=auto generate it]: ******** Please confirm the root password: ******** ``` -在完成这些后,OrientDB 数据库服务将成功启动: +在完成这些后,OrientDB 数据库服务器将成功启动: + ``` INFO OrientDB Server is active v2.2.22 (build fb2b7d321ea8a5a5b18a82237049804aace9e3de). [OServer] ``` -从现在开始,我们需要第二个终端来与 OrientDB 服务进行交互。(有些问题) +从现在开始,我们需要用第二个终端来与 OrientDB 服务器进行交互。 若要强制停止 OrientDB 执行 `Ctrl+C` 即可。 ### 配置守护进程 - 此时,我们可以认为 OrientDB 仅仅是一串 shell 脚本,可以用编辑器打开 `/opt/orientdb/bin/orientdb.sh`: ``` @@ -125,13 +126,13 @@ ORIENTDB_USER="USER_YOU_WANT_ORIENTDB_RUN_WITH" 我们需要配置`ORIENTDB_DIR` 以及 `ORIENTDB_USER`. -然后创建一个用户,例如我们创建一个名为**orientdb**的用户,我们需要输入下面的指令: +然后创建一个用户,例如我们创建一个名为 `orientdb` 的用户,我们需要输入下面的指令: ``` # useradd -r orientdb -s /sbin/nologin ``` -**orientdb** 就是我们在 `ORIENTDB_USER` 输入处的用户。 +`orientdb` 就是我们在 `ORIENTDB_USER` 处输入的用户。 再更改 `/opt/orientdb` 目录的所有权: @@ -139,7 +140,7 @@ ORIENTDB_USER="USER_YOU_WANT_ORIENTDB_RUN_WITH" # chown -R orientdb:orientdb /opt/orientdb ``` -改变服务配置文件的权限: +改变服务器配置文件的权限: ``` # chmod 640 /opt/orientdb/config/orientdb-server-config.xml @@ -147,7 +148,7 @@ ORIENTDB_USER="USER_YOU_WANT_ORIENTDB_RUN_WITH" #### 下载系统守护进程服务 -OrientDB 的压缩包包含一个服务文件`/opt/orientdb/bin/orientdb.service`。我们将其复制到 `/etc/systemd/system` 文件夹下: +OrientDB 的压缩包包含一个服务文件 `/opt/orientdb/bin/orientdb.service`。我们将其复制到 `/etc/systemd/system` 文件夹下: ``` # cp /opt/orientdb/bin/orientdb.service /etc/systemd/system @@ -159,7 +160,7 @@ OrientDB 的压缩包包含一个服务文件`/opt/orientdb/bin/orientdb.service # $EDITOR /etc/systemd/system/orientdb.service ``` -其中`[service]` 内容块看起来应该是这样的: +其中 `[service]` 内容块看起来应该是这样的: ``` [Service] @@ -185,7 +186,7 @@ ExecStart=/opt/orientdb/bin/server.sh # systemctl daemon-reload ``` -启动 OrientDB 并同意其开机自启动: +启动 OrientDB 并使其开机自启动: ``` # systemctl start orientdb @@ -218,9 +219,9 @@ ExecStart=/opt/orientdb/bin/server.sh via: https://www.unixmen.com/nosql-install-orientdb-ubuntu-16-04/ -作者:[Giuseppe Molica ][a] +作者:[Giuseppe Molica][a] 译者:[a92667237](https://github.com/a972667237) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 716d361777eb5fb58dbbd1cd19a6d6fde3fa28a8 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 31 Jul 2017 22:24:36 +0800 Subject: [PATCH 0862/1407] PUB: 20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @a92667237 https://linux.cn/article-8742-1.html 明天10点发布 --- .../20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md (100%) diff --git a/translated/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md b/published/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md similarity index 100% rename from translated/tech/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md rename to published/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md From a61e9a04d115d5785a01b586b8d02139f1110a83 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 31 Jul 2017 22:58:14 +0800 Subject: [PATCH 0863/1407] PRF:20170718 Top 4 reasons I use dwm for my Linux window manager.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @haoqixu 恭喜首译完成!翻译的不错。 --- ...s I use dwm for my Linux window manager.md | 41 ++++++++----------- 1 file changed, 17 insertions(+), 24 deletions(-) diff --git a/translated/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md b/translated/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md index efefdf908b..3d8e00ee48 100644 --- a/translated/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md +++ b/translated/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md @@ -1,73 +1,66 @@ 我选择 dwm 作为窗口管理器的 4 大理由 ============================================================ -### 窗口管理器负责管理打开窗口的大小、布置以及其它相关的方面。 +> 窗口管理器window manager负责管理打开窗口的大小、布置以及其它相关的方面。 ![Top 4 reasons I use dwm for my Linux window manager](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/car-penguin-drive-linux-yellow.png?itok=ueZE5mph "我选择 dwm 作为窗口管理器的 4 大理由") -图片来自: +(图片来自:Internet Archive [Book][4] [Images][5] 由 Opensource.com 修改 CC BY-SA 4.0) -Internet Archive [Book][4] [Images][5] 由 Opensource.com 修改 CC BY-SA 4.0 +我喜欢极简。如果可能,我会尽量在一个终端下运行所有需要的程序。这避免了一些浮夸的特效占用我的资源或者分散我的注意力。而且,无论怎么调整窗口大小和位置却依旧无法使它们完美地对齐,这也让我感到厌烦。 - -我喜欢极简的视图。如果可能,我会尽量在一个终端下运行所有需要的程序。这避免了一些浮夸的特效占用我的资源或者分散我的注意力。而且,调整窗口大小和位置却依旧无法使它们完美地对齐,这也让我感到厌烦。 - -出于对极简化的追求,我喜欢上了 [Xfce][6] 并且把它作为我主要的 Linux [桌面环境][7]好几年了。直到后来我看了 [Bryan Lunduke][8] 关于他所使用的 [Awesome][10] [窗口管理器][9]的视频。Awesome 为用户整齐地布置好他们的窗口,看起来就是我想要的效果。我在尝试之后却发现我难以把它配置成我喜欢的样子。于是我继续查找,发现了 [xmonad][11] 然而我遇到了同样的问题。[Xmonad][11] 可以良好运作但为了把它配置成我理想中的样子我却不得不先通过 Haskell 语言这关。(译者: AwesomeWM 使用 lua 语言作为配置语言,而 xmonad 使用 Haskell 语言) +出于对极简化的追求,我喜欢上了 [Xfce][6] 并且把它作为我主要的 Linux [桌面环境][7]好几年了。直到后来我看了 [Bryan Lunduke][8] 关于他所使用的名为 [Awesome][10] 的[窗口管理器][9]的视频。Awesome 为用户整齐地布置好他们的窗口,看起来就是我想要的效果。但在我尝试之后却发现我难以把它配置成我喜欢的样子。于是我继续搜寻,发现了 [xmonad][11],然而我遇到了同样的问题。[xmonad][11] 可以良好运作但为了把它配置成我理想中的样子我却不得不先通过 Haskell 语言这关。(LCTT 译注: AwesomeWM 使用 lua 语言作为配置语言,而 xmonad 使用 Haskell 语言) 几年后,我无意间发现了 [suckless.org][12] 和他们的窗口管理器 [dwm][13]。 -简而言之,一个窗口管理器,例如 KDE,Gnome 或者 Xfce,包括了许多部件,其中除了窗口管理器还有其它应用程序。窗口管理器负责管理打开窗口的大小、布置(以及其它窗口相关的方面)。不同的桌面环境使用不同的窗口管理器,KDE 使用 KWin,Gnome 2 使用 Metacity, Gnome 3 使用 Mutter, 以及 Xfce 使用 Xfwm。你可以方便地替换这些桌面环境的默认窗口管理器。我已经把我的窗口管理器替换成 dwm,下面我说说我喜欢 dwm 的理因。 +简而言之,一个窗口管理器,例如 KDE,Gnome 或者 Xfce,包括了许多部件,其中除了窗口管理器还有其它应用程序。窗口管理器负责管理打开窗口的大小、布置(以及其它窗口相关的方面)。不同的桌面环境使用不同的窗口管理器,KDE 使用 KWin,Gnome 2 使用 Metacity, Gnome 3 使用 Mutter, 以及 Xfce 使用 Xfwm。当然,你可以方便地替换这些桌面环境的默认窗口管理器。我已经把我的窗口管理器替换成 dwm,下面我说说我喜欢 dwm 的理因。 ### 动态窗口管理 -与 Awesome 及 xmonad 一样,dwm 的杀手锏是它能利用屏幕的所有空间为你自动排列好窗口。当然,在现在的大多数桌面环境中,你也可以设置相应的快捷键把你的窗口放置在屏幕的上下左右或者是全屏,但是有了 dwm 我们就不需要考虑这么多了。 +与 Awesome 及 xmonad 一样,dwm 的杀手锏是它能利用屏幕的所有空间为你自动排布好窗口。当然,在现在的大多数桌面环境中,你也可以设置相应的快捷键把你的窗口放置在屏幕的上下左右或者是全屏,但是有了 dwm 我们就不需要考虑这么多了。 -Dwm 把屏幕分为主区域和栈区域。它包含三种布局:平铺,单片镜(monocle)和浮动。平铺模式是我最常使用的,它把一个主要的窗口放置在主区域,将其余窗口平铺在栈区域中。在单片镜模式中,所有窗口都会被最大化,你可以在它们之间相互切换。浮动模式允许你自由调整窗口大小(就像在大多数窗口管理器下那样),这在你使用像 Gimp -这类需要自定义窗口大小的应用时更为方便。 +dwm 把屏幕分为主区域和栈区域。它包含三种布局:平铺,单片镜(monocle)和浮动。平铺模式是我最常使用的,它把一个主要的窗口放置在主区域来获取最大关注力,而将其余窗口平铺在栈区域中。在单片镜模式中,所有窗口都会被最大化,你可以在它们之间相互切换。浮动模式允许你自由调整窗口大小(就像在大多数窗口管理器下那样),这在你使用像 Gimp 这类需要自定义窗口大小的应用时更为方便。 -一般情况下,在你的桌面环境下你可以使用不同的工作空间来分类你的窗口,把相近的应用程序放置在计划好的工作空间中。在工作时,我会使用一个工作空间来进行工作同时使用另一个工作空间来浏览网页。Dwm 有一个相似的功能叫标签。你可以使用标签给窗口分组,当你选中一个标签时,就能显示具有相应标签的窗口。 +一般情况下,在你的桌面环境下你可以使用不同的工作空间(workspace)来分类你的窗口,把相近的应用程序放置在计划好的工作空间中。在工作时,我会使用一个工作空间来进行工作,同时使用另一个工作空间来浏览网页。dwm 有一个相似的功能叫标签。你可以使用标签给窗口分组,当你选中一个标签时,就能显示具有相应标签的窗口。 ### 高效 -Dwm 能让你的计算机尽量地节省电量。Xfce 和其它轻量桌面环境在较旧或者较低性能的机器上很受欢迎,但是相比于 Xfce,dwm 在登录后只使用了 1/3 的资源(在我的例子中)。当我在使用一台 1 GB 内存的Eee PC (译者:华硕生产的一款上网本,已停产)时,占用 660 MB 和 230MB 的差别就很大了。这让我有足够的内存空间运行我的编辑器和浏览器。 +dwm 能让你的计算机尽量地节省电量。Xfce 和其它轻量桌面环境在较旧或者较低性能的机器上很受欢迎,但是相比于 Xfce,dwm 在登录后只使用了它们 1/3 的资源(在我的例子中)。当我在使用一台 1 GB 内存的 Eee PC (LCTT 译注:华硕生产的一款上网本,已停产)时,占用 660 MB 和 230MB 的差别就很大了。这让我有足够的内存空间运行我的编辑器和浏览器。 ### 极简 -通常,我让我的应用程序彼此相邻:作为主窗口的终端(通常运行着 Vim),用来查阅邮件的浏览器,和另外一个用来查阅资料或者 [Trello][14] 的浏览器窗口。对于临时的网页浏览,我会在另一个工作空间或者说是另一个 _标签_ 中开启一个 Chromium 窗口。 - -### [dwm.png][1] +通常,我让我的应用程序彼此相邻:作为主窗口的终端(通常运行着 Vim)、用来查阅邮件的浏览器,和另外一个用来查阅资料或者打开 [Trello][14] 的浏览器窗口。对于临时的网页浏览,我会在另一个工作空间或者说是另一个 _标签_ 中开启一个 Chromium 窗口。 ![](https://opensource.com/sites/default/files/dwm.png) -来自作者的屏幕截图。 +*来自作者的屏幕截图。* 在标准的桌面环境下,通常会有一或两个面板占据着屏幕上下或者两侧的空间。我尝试过使用自动隐藏功能,但当光标太靠近边缘导致面板弹出造成的不便实在让我很厌烦。你也可以把它们设置得更小,但我还是更喜欢 dwm 的极简状态栏。 ### 速度 -评判速度时,我比较看重 dwm 在登录后的加载速度和启动程序的速度。如果使用更快更新的计算机,你可能不会在意这些细节,但是对我来说,不同的桌面环境和窗口管理器会有明显的差距。 -我实在不想连这种简单的操作也要等待,它们应该一下子就完成。另外,使用键盘快捷键来启动程序比起用鼠标或者触控板要快一些,而且我不想让双手离开键盘。 +评判速度时,我比较看重 dwm 在登录后的加载速度和启动程序的速度。如果使用更快、更新的计算机,你可能不会在意这些细节,但是对我来说,不同的桌面环境和窗口管理器会有明显的差距。我实在不想连这种简单的操作也要等待,它们应该一下子就完成。另外,使用键盘快捷键来启动程序比起用鼠标或者触控板要快一些,而且我不想让双手离开键盘。 ### 小结 -即便如此,我也不会向新手用户推荐 dwm。研究如何配置它需要耗费一些时间(除非你对你的发行版提供的默认配置感到满意)。我发现要让一些你想要的补丁正常工作可能会有点棘手,而且相应的社区也比较小(IRC 频道明确表示不提供补丁的手把手教学)。所以,为了得到你想要的效果,你得有些付出才行。不过,这也是值得的。 +即便如此,我也不会向新手用户推荐 dwm。研究如何配置它需要耗费一些时间(除非你对你的发行版提供的默认配置感到满意)。我发现要让一些你想要的补丁正常工作可能会有点棘手,而且相应的社区也比较小(其 IRC 频道明确表示不提供补丁的手把手帮助)。所以,为了得到你想要的效果,你得有些付出才行。不过,这也是值得的。 -而且你看,它就像 Awesome 一样酷炫。 +而且你看,它就像 Awesome 一样 awesome。 -------------------------------------------------------------------------------- 作者简介: -Jimmy Sjölund - Jimmy Sjölund 是 Telia Company 的高级 IT 服务经理,关注团队开发、探索敏捷工作流和精益工作流的创新导师,以及可视化方向爱好者。他同时也是一名开源布道者,先前从事于 Ubuntu Studio 和 Plume Creator。 +Jimmy Sjölund - 他是 Telia Company 的高级 IT 服务经理,关注团队开发、探索敏捷工作流和精益工作流的创新导师,以及可视化方向爱好者。他同时也是一名开源布道者,先前从事于 Ubuntu Studio 和 Plume Creator。 ----------------- via: https://opensource.com/article/17/7/top-4-reasons-i-use-dwm-linux-window-manager -作者:[ Jimmy Sjölund Feed ][a] +作者:[Jimmy Sjölund][a] 译者:[haoqixu](https://github.com/haoqixu) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From afd59f8cd76232d3a17ef43136a426685da36a31 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 31 Jul 2017 22:58:49 +0800 Subject: [PATCH 0864/1407] PUB:20170718 Top 4 reasons I use dwm for my Linux window manager.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @haoqixu https://linux.cn/article-8743-1.html 明天下午发布 --- ...0170718 Top 4 reasons I use dwm for my Linux window manager.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170718 Top 4 reasons I use dwm for my Linux window manager.md (100%) diff --git a/translated/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md b/published/20170718 Top 4 reasons I use dwm for my Linux window manager.md similarity index 100% rename from translated/tech/20170718 Top 4 reasons I use dwm for my Linux window manager.md rename to published/20170718 Top 4 reasons I use dwm for my Linux window manager.md From 7aa1bd161f1cd35bbddb0ebb7c1943bb93393bc4 Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 31 Jul 2017 23:12:33 +0800 Subject: [PATCH 0865/1407] =?UTF-8?q?=E5=BD=92=E6=A1=A3=20201707?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../20161006 Go Serverless with Apex and Composes MongoDB.md | 0 .../20161214 BUILD A 64-BIT KERNEL FOR YOUR RASPBERRY PI 3.md | 0 ... up a Continuous Integration server for Android development.md | 0 ...s Using a Multi-Source Unified Block List With Whitelisting.md | 0 .../{ => 201707}/20170119 The Many the Humble the Ubuntu Users.md | 0 published/{ => 201707}/20170209 Inside Real-Time Linux.md | 0 .../20170209 The benefits of tracking issues publicly.md | 0 ...20170213 Free as in puppy The hidden costs of free software.md | 0 published/{ => 201707}/20170213 The decline of GPL.md | 0 ...llshit. Shut up and get the work done – says Linus Torvalds.md | 0 ... Using Scripting Languages in IoT Challenges and Approaches.md | 0 ...0170309 The impact GitHub is having on your software career.md | 0 ...0321 7 ways to discuss legal matters with an open community.md | 0 ...170331 Writing a Linux Debugger Part 3 Registers and memory.md | 0 ...uld work anywhere flock to the worlds most expensive cities.md | 0 .../20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md | 0 .../20170426 How to get started learning to program.md | 0 ...e and Integrate iRedMail Services to Samba4 AD DC – Part 11.md | 0 ...to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md | 0 ...troduction to Libral a systems management library for Linux.md | 0 ...Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md | 0 .../20170525 An introduction to Linux s EXT4 filesystem.md | 0 published/{ => 201707}/20170529 NMAP OS Detection.md | 0 published/{ => 201707}/20170529 Ubuntu GamePack.md | 0 ... Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md | 0 ...-One System Update And Maintenance Tool For UbuntuLinuxMint.md | 0 ...0170609 Python 3.6 - install latest version into Linux Mint.md | 0 ...0170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md | 0 ...170616 Do you have what it takes to be a software developer.md | 0 .../20170617 Installing Fedora 26 Beta on a MacBook Air.md | 0 published/{ => 201707}/20170619 Is IoT the Future of Linux.md | 0 .../{ => 201707}/20170620 Debian armhf VM on arm64 server.md | 0 ...ct Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md | 0 ...1 Boot Repair Tool - Repair The Most Boot Related Problems.md | 0 .../20170621 How To kill An Inactive OR Idle SSH Sessions.md | 0 .../20170621 Using Kdump for examining Linux Kernel crashes.md | 0 ...2 8 ways to contribute to open source when you have no time.md | 0 ...622 Ring is a Privacy-Focused Open-Source Skype Alternative.md | 0 ...hromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md | 0 .../20170627 How to turn a Raspberry Pi into an eBook server.md | 0 ...0170628 Network Analysis How To Install Bro On Ubuntu 16.04.md | 0 .../20170629 4 cool facts you should know about FreeDOS.md | 0 ...170629 This is how you OpenStack 6 new guides and tutorials.md | 0 .../20170705 No coding required Node-RED on a Raspberry Pi.md | 0 published/{ => 201707}/20170707 Bash prompt tips and tricks.md | 0 .../20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md | 0 .../20170712 How to use a man page Faster than a Google search.md | 0 .../20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md | 0 .../20170713 Fundamentals of graph databases with Neo4j.md | 0 ... DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md | 0 ...rchiver automatically submits links to the Internet Archive.md | 0 ...nux to the rescue How I introduced my organization to Linux.md | 0 .../20170716 Nylas Mail A Free Email Client For Linux.md | 0 ...8 Things to consider when building a robot with open source.md | 0 ...0170718 Top 4 reasons I use dwm for my Linux window manager.md | 0 ...Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md | 0 published/{ => 201707}/20170725 Linux Weather Forecast.md | 0 .../20170725 ss another way to get socket statistics.md | 0 58 files changed, 0 insertions(+), 0 deletions(-) rename published/{ => 201707}/20161006 Go Serverless with Apex and Composes MongoDB.md (100%) rename published/{ => 201707}/20161214 BUILD A 64-BIT KERNEL FOR YOUR RASPBERRY PI 3.md (100%) rename published/{ => 201707}/20161228 How to set up a Continuous Integration server for Android development.md (100%) rename published/{ => 201707}/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md (100%) rename published/{ => 201707}/20170119 The Many the Humble the Ubuntu Users.md (100%) rename published/{ => 201707}/20170209 Inside Real-Time Linux.md (100%) rename published/{ => 201707}/20170209 The benefits of tracking issues publicly.md (100%) rename published/{ => 201707}/20170213 Free as in puppy The hidden costs of free software.md (100%) rename published/{ => 201707}/20170213 The decline of GPL.md (100%) rename published/{ => 201707}/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md (100%) rename published/{ => 201707}/20170215 Using Scripting Languages in IoT Challenges and Approaches.md (100%) rename published/{ => 201707}/20170309 The impact GitHub is having on your software career.md (100%) rename published/{ => 201707}/20170321 7 ways to discuss legal matters with an open community.md (100%) rename published/{ => 201707}/20170331 Writing a Linux Debugger Part 3 Registers and memory.md (100%) rename published/{ => 201707}/20170402 Why do developers who could work anywhere flock to the worlds most expensive cities.md (100%) rename published/{ => 201707}/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md (100%) rename published/{ => 201707}/20170426 How to get started learning to program.md (100%) rename published/{ => 201707}/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md (100%) rename published/{ => 201707}/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md (100%) rename published/{ => 201707}/20170523 An introduction to Libral a systems management library for Linux.md (100%) rename published/{ => 201707}/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md (100%) rename published/{ => 201707}/20170525 An introduction to Linux s EXT4 filesystem.md (100%) rename published/{ => 201707}/20170529 NMAP OS Detection.md (100%) rename published/{ => 201707}/20170529 Ubuntu GamePack.md (100%) rename published/{ => 201707}/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md (100%) rename published/{ => 201707}/20170607 uCareSystem - All-In-One System Update And Maintenance Tool For UbuntuLinuxMint.md (100%) rename published/{ => 201707}/20170609 Python 3.6 - install latest version into Linux Mint.md (100%) rename published/{ => 201707}/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md (100%) rename published/{ => 201707}/20170616 Do you have what it takes to be a software developer.md (100%) rename published/{ => 201707}/20170617 Installing Fedora 26 Beta on a MacBook Air.md (100%) rename published/{ => 201707}/20170619 Is IoT the Future of Linux.md (100%) rename published/{ => 201707}/20170620 Debian armhf VM on arm64 server.md (100%) rename published/{ => 201707}/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md (100%) rename published/{ => 201707}/20170621 Boot Repair Tool - Repair The Most Boot Related Problems.md (100%) rename published/{ => 201707}/20170621 How To kill An Inactive OR Idle SSH Sessions.md (100%) rename published/{ => 201707}/20170621 Using Kdump for examining Linux Kernel crashes.md (100%) rename published/{ => 201707}/20170622 8 ways to contribute to open source when you have no time.md (100%) rename published/{ => 201707}/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md (100%) rename published/{ => 201707}/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md (100%) rename published/{ => 201707}/20170627 How to turn a Raspberry Pi into an eBook server.md (100%) rename published/{ => 201707}/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md (100%) rename published/{ => 201707}/20170629 4 cool facts you should know about FreeDOS.md (100%) rename published/{ => 201707}/20170629 This is how you OpenStack 6 new guides and tutorials.md (100%) rename published/{ => 201707}/20170705 No coding required Node-RED on a Raspberry Pi.md (100%) rename published/{ => 201707}/20170707 Bash prompt tips and tricks.md (100%) rename published/{ => 201707}/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md (100%) rename published/{ => 201707}/20170712 How to use a man page Faster than a Google search.md (100%) rename published/{ => 201707}/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md (100%) rename published/{ => 201707}/20170713 Fundamentals of graph databases with Neo4j.md (100%) rename published/{ => 201707}/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md (100%) rename published/{ => 201707}/20170714 LinkArchiver automatically submits links to the Internet Archive.md (100%) rename published/{ => 201707}/20170714 Linux to the rescue How I introduced my organization to Linux.md (100%) rename published/{ => 201707}/20170716 Nylas Mail A Free Email Client For Linux.md (100%) rename published/{ => 201707}/20170718 Things to consider when building a robot with open source.md (100%) rename published/{ => 201707}/20170718 Top 4 reasons I use dwm for my Linux window manager.md (100%) rename published/{ => 201707}/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md (100%) rename published/{ => 201707}/20170725 Linux Weather Forecast.md (100%) rename published/{ => 201707}/20170725 ss another way to get socket statistics.md (100%) diff --git a/published/20161006 Go Serverless with Apex and Composes MongoDB.md b/published/201707/20161006 Go Serverless with Apex and Composes MongoDB.md similarity index 100% rename from published/20161006 Go Serverless with Apex and Composes MongoDB.md rename to published/201707/20161006 Go Serverless with Apex and Composes MongoDB.md diff --git a/published/20161214 BUILD A 64-BIT KERNEL FOR YOUR RASPBERRY PI 3.md b/published/201707/20161214 BUILD A 64-BIT KERNEL FOR YOUR RASPBERRY PI 3.md similarity index 100% rename from published/20161214 BUILD A 64-BIT KERNEL FOR YOUR RASPBERRY PI 3.md rename to published/201707/20161214 BUILD A 64-BIT KERNEL FOR YOUR RASPBERRY PI 3.md diff --git a/published/20161228 How to set up a Continuous Integration server for Android development.md b/published/201707/20161228 How to set up a Continuous Integration server for Android development.md similarity index 100% rename from published/20161228 How to set up a Continuous Integration server for Android development.md rename to published/201707/20161228 How to set up a Continuous Integration server for Android development.md diff --git a/published/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md b/published/201707/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md similarity index 100% rename from published/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md rename to published/201707/20170117 This Script Updates Hosts Files Using a Multi-Source Unified Block List With Whitelisting.md diff --git a/published/20170119 The Many the Humble the Ubuntu Users.md b/published/201707/20170119 The Many the Humble the Ubuntu Users.md similarity index 100% rename from published/20170119 The Many the Humble the Ubuntu Users.md rename to published/201707/20170119 The Many the Humble the Ubuntu Users.md diff --git a/published/20170209 Inside Real-Time Linux.md b/published/201707/20170209 Inside Real-Time Linux.md similarity index 100% rename from published/20170209 Inside Real-Time Linux.md rename to published/201707/20170209 Inside Real-Time Linux.md diff --git a/published/20170209 The benefits of tracking issues publicly.md b/published/201707/20170209 The benefits of tracking issues publicly.md similarity index 100% rename from published/20170209 The benefits of tracking issues publicly.md rename to published/201707/20170209 The benefits of tracking issues publicly.md diff --git a/published/20170213 Free as in puppy The hidden costs of free software.md b/published/201707/20170213 Free as in puppy The hidden costs of free software.md similarity index 100% rename from published/20170213 Free as in puppy The hidden costs of free software.md rename to published/201707/20170213 Free as in puppy The hidden costs of free software.md diff --git a/published/20170213 The decline of GPL.md b/published/201707/20170213 The decline of GPL.md similarity index 100% rename from published/20170213 The decline of GPL.md rename to published/201707/20170213 The decline of GPL.md diff --git a/published/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md b/published/201707/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md similarity index 100% rename from published/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md rename to published/201707/20170215 Talk of tech innovation is bullshit. Shut up and get the work done – says Linus Torvalds.md diff --git a/published/20170215 Using Scripting Languages in IoT Challenges and Approaches.md b/published/201707/20170215 Using Scripting Languages in IoT Challenges and Approaches.md similarity index 100% rename from published/20170215 Using Scripting Languages in IoT Challenges and Approaches.md rename to published/201707/20170215 Using Scripting Languages in IoT Challenges and Approaches.md diff --git a/published/20170309 The impact GitHub is having on your software career.md b/published/201707/20170309 The impact GitHub is having on your software career.md similarity index 100% rename from published/20170309 The impact GitHub is having on your software career.md rename to published/201707/20170309 The impact GitHub is having on your software career.md diff --git a/published/20170321 7 ways to discuss legal matters with an open community.md b/published/201707/20170321 7 ways to discuss legal matters with an open community.md similarity index 100% rename from published/20170321 7 ways to discuss legal matters with an open community.md rename to published/201707/20170321 7 ways to discuss legal matters with an open community.md diff --git a/published/20170331 Writing a Linux Debugger Part 3 Registers and memory.md b/published/201707/20170331 Writing a Linux Debugger Part 3 Registers and memory.md similarity index 100% rename from published/20170331 Writing a Linux Debugger Part 3 Registers and memory.md rename to published/201707/20170331 Writing a Linux Debugger Part 3 Registers and memory.md diff --git a/published/20170402 Why do developers who could work anywhere flock to the worlds most expensive cities.md b/published/201707/20170402 Why do developers who could work anywhere flock to the worlds most expensive cities.md similarity index 100% rename from published/20170402 Why do developers who could work anywhere flock to the worlds most expensive cities.md rename to published/201707/20170402 Why do developers who could work anywhere flock to the worlds most expensive cities.md diff --git a/published/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md b/published/201707/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md similarity index 100% rename from published/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md rename to published/201707/20170405 Writing a Linux Debugger Part 4 Elves and dwarves.md diff --git a/published/20170426 How to get started learning to program.md b/published/201707/20170426 How to get started learning to program.md similarity index 100% rename from published/20170426 How to get started learning to program.md rename to published/201707/20170426 How to get started learning to program.md diff --git a/published/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md b/published/201707/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md similarity index 100% rename from published/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md rename to published/201707/20170510 How to Configure and Integrate iRedMail Services to Samba4 AD DC – Part 11.md diff --git a/published/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md b/published/201707/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md similarity index 100% rename from published/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md rename to published/201707/20170513 How to Integrate iRedMail Roundcube with Samba4 AD DC – Part 12.md diff --git a/published/20170523 An introduction to Libral a systems management library for Linux.md b/published/201707/20170523 An introduction to Libral a systems management library for Linux.md similarity index 100% rename from published/20170523 An introduction to Libral a systems management library for Linux.md rename to published/201707/20170523 An introduction to Libral a systems management library for Linux.md diff --git a/published/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md b/published/201707/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md similarity index 100% rename from published/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md rename to published/201707/20170524 How to Configure Thunderbird with iRedMail for Samba4 AD – Part 13.md diff --git a/published/20170525 An introduction to Linux s EXT4 filesystem.md b/published/201707/20170525 An introduction to Linux s EXT4 filesystem.md similarity index 100% rename from published/20170525 An introduction to Linux s EXT4 filesystem.md rename to published/201707/20170525 An introduction to Linux s EXT4 filesystem.md diff --git a/published/20170529 NMAP OS Detection.md b/published/201707/20170529 NMAP OS Detection.md similarity index 100% rename from published/20170529 NMAP OS Detection.md rename to published/201707/20170529 NMAP OS Detection.md diff --git a/published/20170529 Ubuntu GamePack.md b/published/201707/20170529 Ubuntu GamePack.md similarity index 100% rename from published/20170529 Ubuntu GamePack.md rename to published/201707/20170529 Ubuntu GamePack.md diff --git a/published/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md b/published/201707/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md similarity index 100% rename from published/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md rename to published/201707/20170602 Linux Kernel Utilities A Set Of Shell Scripts To Compile, Install Update Latest Kernel In Ubuntu LinuxMint.md diff --git a/published/20170607 uCareSystem - All-In-One System Update And Maintenance Tool For UbuntuLinuxMint.md b/published/201707/20170607 uCareSystem - All-In-One System Update And Maintenance Tool For UbuntuLinuxMint.md similarity index 100% rename from published/20170607 uCareSystem - All-In-One System Update And Maintenance Tool For UbuntuLinuxMint.md rename to published/201707/20170607 uCareSystem - All-In-One System Update And Maintenance Tool For UbuntuLinuxMint.md diff --git a/published/20170609 Python 3.6 - install latest version into Linux Mint.md b/published/201707/20170609 Python 3.6 - install latest version into Linux Mint.md similarity index 100% rename from published/20170609 Python 3.6 - install latest version into Linux Mint.md rename to published/201707/20170609 Python 3.6 - install latest version into Linux Mint.md diff --git a/published/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md b/published/201707/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md similarity index 100% rename from published/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md rename to published/201707/20170612 3 Easy Ways To Create Or Extend Swap Space In Linux.md diff --git a/published/20170616 Do you have what it takes to be a software developer.md b/published/201707/20170616 Do you have what it takes to be a software developer.md similarity index 100% rename from published/20170616 Do you have what it takes to be a software developer.md rename to published/201707/20170616 Do you have what it takes to be a software developer.md diff --git a/published/20170617 Installing Fedora 26 Beta on a MacBook Air.md b/published/201707/20170617 Installing Fedora 26 Beta on a MacBook Air.md similarity index 100% rename from published/20170617 Installing Fedora 26 Beta on a MacBook Air.md rename to published/201707/20170617 Installing Fedora 26 Beta on a MacBook Air.md diff --git a/published/20170619 Is IoT the Future of Linux.md b/published/201707/20170619 Is IoT the Future of Linux.md similarity index 100% rename from published/20170619 Is IoT the Future of Linux.md rename to published/201707/20170619 Is IoT the Future of Linux.md diff --git a/published/20170620 Debian armhf VM on arm64 server.md b/published/201707/20170620 Debian armhf VM on arm64 server.md similarity index 100% rename from published/20170620 Debian armhf VM on arm64 server.md rename to published/201707/20170620 Debian armhf VM on arm64 server.md diff --git a/published/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md b/published/201707/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md similarity index 100% rename from published/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md rename to published/201707/20170620 How To Patch and Protect Linux Kernel Stack Clash Vulnerability CVE-2017-1000364 .md diff --git a/published/20170621 Boot Repair Tool - Repair The Most Boot Related Problems.md b/published/201707/20170621 Boot Repair Tool - Repair The Most Boot Related Problems.md similarity index 100% rename from published/20170621 Boot Repair Tool - Repair The Most Boot Related Problems.md rename to published/201707/20170621 Boot Repair Tool - Repair The Most Boot Related Problems.md diff --git a/published/20170621 How To kill An Inactive OR Idle SSH Sessions.md b/published/201707/20170621 How To kill An Inactive OR Idle SSH Sessions.md similarity index 100% rename from published/20170621 How To kill An Inactive OR Idle SSH Sessions.md rename to published/201707/20170621 How To kill An Inactive OR Idle SSH Sessions.md diff --git a/published/20170621 Using Kdump for examining Linux Kernel crashes.md b/published/201707/20170621 Using Kdump for examining Linux Kernel crashes.md similarity index 100% rename from published/20170621 Using Kdump for examining Linux Kernel crashes.md rename to published/201707/20170621 Using Kdump for examining Linux Kernel crashes.md diff --git a/published/20170622 8 ways to contribute to open source when you have no time.md b/published/201707/20170622 8 ways to contribute to open source when you have no time.md similarity index 100% rename from published/20170622 8 ways to contribute to open source when you have no time.md rename to published/201707/20170622 8 ways to contribute to open source when you have no time.md diff --git a/published/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md b/published/201707/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md similarity index 100% rename from published/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md rename to published/201707/20170622 Ring is a Privacy-Focused Open-Source Skype Alternative.md diff --git a/published/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md b/published/201707/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md similarity index 100% rename from published/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md rename to published/201707/20170623 Chromebook Dual Boot How-to Ubuntu 17.04 GNOME and Chrome OS.md diff --git a/published/20170627 How to turn a Raspberry Pi into an eBook server.md b/published/201707/20170627 How to turn a Raspberry Pi into an eBook server.md similarity index 100% rename from published/20170627 How to turn a Raspberry Pi into an eBook server.md rename to published/201707/20170627 How to turn a Raspberry Pi into an eBook server.md diff --git a/published/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md b/published/201707/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md similarity index 100% rename from published/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md rename to published/201707/20170628 Network Analysis How To Install Bro On Ubuntu 16.04.md diff --git a/published/20170629 4 cool facts you should know about FreeDOS.md b/published/201707/20170629 4 cool facts you should know about FreeDOS.md similarity index 100% rename from published/20170629 4 cool facts you should know about FreeDOS.md rename to published/201707/20170629 4 cool facts you should know about FreeDOS.md diff --git a/published/20170629 This is how you OpenStack 6 new guides and tutorials.md b/published/201707/20170629 This is how you OpenStack 6 new guides and tutorials.md similarity index 100% rename from published/20170629 This is how you OpenStack 6 new guides and tutorials.md rename to published/201707/20170629 This is how you OpenStack 6 new guides and tutorials.md diff --git a/published/20170705 No coding required Node-RED on a Raspberry Pi.md b/published/201707/20170705 No coding required Node-RED on a Raspberry Pi.md similarity index 100% rename from published/20170705 No coding required Node-RED on a Raspberry Pi.md rename to published/201707/20170705 No coding required Node-RED on a Raspberry Pi.md diff --git a/published/20170707 Bash prompt tips and tricks.md b/published/201707/20170707 Bash prompt tips and tricks.md similarity index 100% rename from published/20170707 Bash prompt tips and tricks.md rename to published/201707/20170707 Bash prompt tips and tricks.md diff --git a/published/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md b/published/201707/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md similarity index 100% rename from published/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md rename to published/201707/20170711 Install Linux Kernel 4.12 Stable on Linux Mint.md diff --git a/published/20170712 How to use a man page Faster than a Google search.md b/published/201707/20170712 How to use a man page Faster than a Google search.md similarity index 100% rename from published/20170712 How to use a man page Faster than a Google search.md rename to published/201707/20170712 How to use a man page Faster than a Google search.md diff --git a/published/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md b/published/201707/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md similarity index 100% rename from published/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md rename to published/201707/20170712 NoSQL How To Install OrientDB on Ubuntu 16.04.md diff --git a/published/20170713 Fundamentals of graph databases with Neo4j.md b/published/201707/20170713 Fundamentals of graph databases with Neo4j.md similarity index 100% rename from published/20170713 Fundamentals of graph databases with Neo4j.md rename to published/201707/20170713 Fundamentals of graph databases with Neo4j.md diff --git a/published/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md b/published/201707/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md similarity index 100% rename from published/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md rename to published/201707/20170714 HOW TO RECOVER DELETED FILES STILL RUNNING WITH ACTIVE PROCESSES ON LINUX.md diff --git a/published/20170714 LinkArchiver automatically submits links to the Internet Archive.md b/published/201707/20170714 LinkArchiver automatically submits links to the Internet Archive.md similarity index 100% rename from published/20170714 LinkArchiver automatically submits links to the Internet Archive.md rename to published/201707/20170714 LinkArchiver automatically submits links to the Internet Archive.md diff --git a/published/20170714 Linux to the rescue How I introduced my organization to Linux.md b/published/201707/20170714 Linux to the rescue How I introduced my organization to Linux.md similarity index 100% rename from published/20170714 Linux to the rescue How I introduced my organization to Linux.md rename to published/201707/20170714 Linux to the rescue How I introduced my organization to Linux.md diff --git a/published/20170716 Nylas Mail A Free Email Client For Linux.md b/published/201707/20170716 Nylas Mail A Free Email Client For Linux.md similarity index 100% rename from published/20170716 Nylas Mail A Free Email Client For Linux.md rename to published/201707/20170716 Nylas Mail A Free Email Client For Linux.md diff --git a/published/20170718 Things to consider when building a robot with open source.md b/published/201707/20170718 Things to consider when building a robot with open source.md similarity index 100% rename from published/20170718 Things to consider when building a robot with open source.md rename to published/201707/20170718 Things to consider when building a robot with open source.md diff --git a/published/20170718 Top 4 reasons I use dwm for my Linux window manager.md b/published/201707/20170718 Top 4 reasons I use dwm for my Linux window manager.md similarity index 100% rename from published/20170718 Top 4 reasons I use dwm for my Linux window manager.md rename to published/201707/20170718 Top 4 reasons I use dwm for my Linux window manager.md diff --git a/published/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md b/published/201707/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md similarity index 100% rename from published/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md rename to published/201707/20170724 70000 Memcached Servers Can Be Hacked Using Eight-Month-Old Flaws.md diff --git a/published/20170725 Linux Weather Forecast.md b/published/201707/20170725 Linux Weather Forecast.md similarity index 100% rename from published/20170725 Linux Weather Forecast.md rename to published/201707/20170725 Linux Weather Forecast.md diff --git a/published/20170725 ss another way to get socket statistics.md b/published/201707/20170725 ss another way to get socket statistics.md similarity index 100% rename from published/20170725 ss another way to get socket statistics.md rename to published/201707/20170725 ss another way to get socket statistics.md From 43dc75d1669243bb8c9eb201239ab777e50665bd Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 1 Aug 2017 08:24:46 +0800 Subject: [PATCH 0866/1407] translated --- ...20170712 Storage management in LXD 2.15.md | 85 ------------------- ...20170712 Storage management in LXD 2.15.md | 85 +++++++++++++++++++ 2 files changed, 85 insertions(+), 85 deletions(-) delete mode 100644 sources/tech/20170712 Storage management in LXD 2.15.md create mode 100644 translated/tech/20170712 Storage management in LXD 2.15.md diff --git a/sources/tech/20170712 Storage management in LXD 2.15.md b/sources/tech/20170712 Storage management in LXD 2.15.md deleted file mode 100644 index 38cdb26497..0000000000 --- a/sources/tech/20170712 Storage management in LXD 2.15.md +++ /dev/null @@ -1,85 +0,0 @@ -translating---geekpi - -Storage management in LXD 2.15 -============================================================ - - -### Share or save - -![containers](https://cbrauner.files.wordpress.com/2017/07/containers.png?w=1008) - -For a long time LXD has supported multiple storage drivers. Users could choose between zfs, btrfs, lvm, or plain directory storage pools but they could only ever use a single storage pool. A frequent feature request was to support not just a single storage pool but multiple storage pools. This way users would for example be able to maintain a zfs storage pool backed by an SSD to be used by very I/O intensive containers and another simple directory based storage pool for other containers. Luckily, this is now possible since LXD gained its own storage management API a few versions back. - -### Creating storage pools - -A new LXD installation comes without any storage pool defined. If you run `lxd init`LXD will offer to create a storage pool for you. The storage pool created by `lxd init`will be the default storage pool on which containers are created. - - [![asciicast](https://asciinema.org/a/126892.png)][2] - -### Creating further storage pools - -Our client tool makes it really simple to create additional storage pools. In order to create and administer new storage pools you can use the `lxc storage` command. So if you wanted to create an additional btrfs storage pool on a block device `/dev/sdb`you would simply use `lxc storage create my-btrfs btrfs source=/dev/sdb`. But let’s take a look: - - [![asciicast](https://asciinema.org/a/128580.png)][3] - -### Creating containers on the default storage pool - -If you started from a fresh install of LXD and created a storage pool via `lxd init` LXD will use this pool as the default storage pool. That means if you’re doing a `lxc launch images:ubuntu/xenial xen1` LXD will create a storage volume for the container’s root filesystem on this storage pool. In our examples we’ve been using `my-first-zfs-pool`as our default storage pool: - - [![asciicast](https://asciinema.org/a/128582.png)][4] - -### Creating containers on a specific storage pool - -But you can also tell `lxc launch` and `lxc init` to create a container on a specific storage pool by simply passing the `-s` argument. For example, if you wanted to create a new container on the `my-btrfs` storage pool you would do `lxc launch images:ubuntu/xenial xen-on-my-btrfs -s my-btrfs`: - - [![asciicast](https://asciinema.org/a/128583.png)][5] - -### Creating custom storage volumes - -If you need additional space for one of your containers to for example store additional data the new storage API will let you create storage volumes that can be attached to a container. This is as simple as doing `lxc storage volume create my-btrfs my-custom-volume`: - - [![asciicast](https://asciinema.org/a/128584.png)][6] - -### Attaching custom storage volumes to containers - -Of course this feature is only helpful because the storage API let’s you attach those storage volume to containers. To attach a storage volume to a container you can use `lxc storage volume attach my-btrfs my-custom-volume xen1 data /opt/my/data`: - - [![asciicast](https://asciinema.org/a/128585.png)][7] - -### Sharing custom storage volumes between containers - -By default LXD will make an attached storage volume writable by the container it is attached to. This means it will change the ownership of the storage volume to the container’s id mapping. But Storage volumes can also be attached to multiple containers at the same time. This is great for sharing data among multiple containers. However, this comes with a few restrictions. In order for a storage volume to be attached to multiple containers they must all share the same id mapping. Let’s create an additional container `xen-isolated` that has an isolated id mapping. This means its id mapping will be unique in this LXD instance such that no other container does have the same id mapping. Attaching the same storage volume `my-custom-volume` to this container will now fail: - - [![asciicast](https://asciinema.org/a/128588.png)][8] - -But let’s make `xen-isolated` have the same mapping as `xen1` and let’s also rename it to `xen2` to reflect that change. Now we can attach `my-custom-volume` to both `xen1` and `xen2` without a problem: - - [![asciicast](https://asciinema.org/a/128593.png)][9] - -### Summary - -The storage API is a very powerful addition to LXD. It provides a set of essential features that are helpful in dealing with a variety of problems when using containers at scale. This short introducion hopefully gave you an impression on what you can do with it. There will be more to come in the future. - -This blog was originally featured at [Brauner's Blog][10] - --------------------------------------------------------------------------------- - -via: https://insights.ubuntu.com/2017/07/12/storage-management-in-lxd-2-15/ - -作者:[Christian Brauner ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://cbrauner.wordpress.com/ -[1]:https://insights.ubuntu.com/author/christian-brauner/ -[2]:https://asciinema.org/a/126892 -[3]:https://asciinema.org/a/128580 -[4]:https://asciinema.org/a/128582 -[5]:https://asciinema.org/a/128583 -[6]:https://asciinema.org/a/128584 -[7]:https://asciinema.org/a/128585 -[8]:https://asciinema.org/a/128588 -[9]:https://asciinema.org/a/128593 -[10]:https://cbrauner.wordpress.com/ diff --git a/translated/tech/20170712 Storage management in LXD 2.15.md b/translated/tech/20170712 Storage management in LXD 2.15.md new file mode 100644 index 0000000000..9bd6b2483b --- /dev/null +++ b/translated/tech/20170712 Storage management in LXD 2.15.md @@ -0,0 +1,85 @@ +LXD 2.15 中的存储管理 +============================================================ + + +### 分享或保存 + +![containers](https://cbrauner.files.wordpress.com/2017/07/containers.png?w=1008) + +长久以来 LXD 已经支持多种存储驱动。用户可以在 zfs、btrfs、lvm 或纯目录存储池之间进行选择,但它们只能使用单个存储池。一个被频繁被提到的需求是不仅支持单个存储池,还支持多个存储池。这样,用户可以维护一个由 SSD 支持的 zfs 存储池用于 I/O 密集型容器,另一个简单的基于目录的存储池用于其他容器。幸运的是,现在这是可能的,因为 LXD 在几个版本后有了自己的存储管理 API。 + +### 创建存储池 + +新安装 LXD 没有定义任何存储池。如果你运行 `lxd init` ,LXD 将提供为你创建一个存储池。由 `lxd init` 创建的存储池将是创建容器的默认存储池。 + + + [![asciicast](https://asciinema.org/a/126892.png)][2] + +### 创建更多的存储池 + +我们的客户端工具使得创建额外的存储池变得非常简单。为了创建和管理新的存储池,你可以使用 `lxc storage` 命令。所以如果你想在块设备 `/dev/sdb` 上创建一个额外的 btrfs 存储池,你只需使用 `lxc storage create my-btrfs btrfs source=/dev/sdb`。让我们来看看: + + [![asciicast](https://asciinema.org/a/128580.png)][3] + +### 在默认存储池上创建容器 + +如果你从全新安装的 LXD 开始,并通过 `lxd init` 创建了一个存储池,LXD 将使用此池作为默认存储池。这意味着如果你执行 `lxc launch images:ubuntu/xenial xen1`,LXD 将为此存储池上的容器的根文件系统创建一个存储卷。在示例中,我们使用 `my-first-zfs-pool` 作为默认存储池 + + [![asciicast](https://asciinema.org/a/128582.png)][4] + +### 在特定存储池上创建容器 + +但是你也可以通过传递 `-s` 参数来告诉 `lxc launch` 和 `lxc init` 在特定存储池上创建一个容器。例如,如果要在 `my-btrfs` 存储池上创建一个新的容器,你可以执行 `lxc launch images:ubuntu/xenial xen-on-my-btrfs -s my-btrfs`: + + [![asciicast](https://asciinema.org/a/128583.png)][5] + +### 创建自定义存储卷 + +如果你其中一个容器需要额外的空间存储额外的数据,那么新的存储 API 将允许你创建可以连接到容器的存储卷。只需要 `lxc storage volume create my-btrfs my-custom-volume`: + + [![asciicast](https://asciinema.org/a/128584.png)][6] + +### 连接自定义卷到容器中 + +Of course this feature is only helpful because the storage API let’s you attach those storage volume to containers. To attach a storage volume to a container you can use `lxc storage volume attach my-btrfs my-custom-volume xen1 data /opt/my/data`: +当然,这个功能是有用的,因为存储 API 让你把这些存储卷连接到容器。要将存储卷连接到容器,可以使用 `lxc storage volume attach my-btrfs my-custom-volume xen1 data /opt/my/data`: + + [![asciicast](https://asciinema.org/a/128585.png)][7] + +### 在容器之间共享自定义存储卷 + +默认情况下,LXD 将使连接的存储卷由其所连接的容器写入。这意味着它会将存储卷的所有权更改为容器的 id 映射。但存储卷也可以同时连接到多个容器。这对于在多个容器之间共享数据是非常好的。但是,这有一些限制。为了将存储卷连接到多个容器,它们必须共享相同的 id 映射。让我们创建一个额外的具有一个隔离的 id 映射的容器 `xen-isolated`。这意味着它的 id 映射在这个 LXD 实例中将是唯一的,因此没有其他容器具有相同的id映射。将相同的存储卷 `my-custom-volume` 连接到此容器现在将会失败: + + [![asciicast](https://asciinema.org/a/128588.png)][8] + +但是我们让 `xen-isolated` 与 `xen1` 有相同的映射,并把它重命名为 `xen2` 来反映这个变化。现在我们可以将 `my-custom-volume` 连接到 `xen1` 和 `xen2` 而不会有问题: + + [![asciicast](https://asciinema.org/a/128593.png)][9] + +### 总结 + +存储 API 是 LXD 非常强大的补充。它提供了一组基本功能,有助于在大规模使用容器时处理各种问题。这个简短的介绍希望给你一个印象,你可以做什么。将来会有更多介绍。 + +本篇文章最初在[ Brauner 的博客][10]中发布。 + +-------------------------------------------------------------------------------- + +via: https://insights.ubuntu.com/2017/07/12/storage-management-in-lxd-2-15/ + +作者:[Christian Brauner ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://cbrauner.wordpress.com/ +[1]:https://insights.ubuntu.com/author/christian-brauner/ +[2]:https://asciinema.org/a/126892 +[3]:https://asciinema.org/a/128580 +[4]:https://asciinema.org/a/128582 +[5]:https://asciinema.org/a/128583 +[6]:https://asciinema.org/a/128584 +[7]:https://asciinema.org/a/128585 +[8]:https://asciinema.org/a/128588 +[9]:https://asciinema.org/a/128593 +[10]:https://cbrauner.wordpress.com/ From 1ce1f1ab6524ac4333733545097cb34524b386dc Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 1 Aug 2017 08:27:39 +0800 Subject: [PATCH 0867/1407] translated --- ...ion How To Secure an NGINX web server on Ubuntu 16.04.md | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/sources/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md b/sources/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md index faeb81a2ed..ea486fdc9b 100644 --- a/sources/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md +++ b/sources/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md @@ -1,5 +1,9 @@ +translating----geekpi + Encryption: How To Secure an NGINX web server on Ubuntu 16.04 -============================================================By [Giuseppe Molica][1]
+============================================================ + +By [Giuseppe Molica][1]
[![Let's Encrypt Encryption CA](https://www.unixmen.com/wp-content/uploads/2017/06/le-logo-standard.png "le-logo-standard")][2] From 6456d35cbe7e99433f1ecc99b7d5dd5b339744e1 Mon Sep 17 00:00:00 2001 From: sugarfillet <1911093465@qq.com> Date: Tue, 1 Aug 2017 18:08:03 +0800 Subject: [PATCH 0868/1407] abc --- abc | 103 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 103 insertions(+) create mode 100644 abc diff --git a/abc b/abc new file mode 100644 index 0000000000..0a4689f8f0 --- /dev/null +++ b/abc @@ -0,0 +1,103 @@ +Is system administration something you've done for free? +Most of us manage at least a few devices, but that doesn't mean you enjoy it. +If you've added some extra systems acting as servers on your home network, you're a candidate. +Did you justify adding a Minecraft server for your kid mostly so that you could have fun setting up a Raspberry Pi server? +Maybe it's time to consider getting paid to do that sort of work. + +你曾经做的一些系统管理是免费的吗?我们大多数人都多多少少的管理一些设备,但是那并不代表你享受它。 +如果你曾经在你家的网络中添加了一些服务器,你就是系统管理的候选人。 +有些人会为自己的孩子设法添加一个我的世界的服务器,他们会通过树莓派来设置。你是这些人么? +也许是时候来考虑通过做这样的工作来获取报酬了。 + + +System administration as a generalist job offers a particular kind of flexibility. +System administrators are needed across a wide variety of industries and company sizes. +Most urban areas have a need for some on-site workers, and remote work is also a strong possibility. + +作为一份需要全面只是的工作,系统管理提供了很特别的伸缩性。 +各种各样的企业和公司都需要系统管理员。 +大多数的市区需要一些现场办公人员,但是远程办公也有很大的可能性。 + + +Anyone can work with open source software for free, +but as a sysadmin you can also get paid to do it. +System administrators often contribute to open source projects, +support open source vendors, and work with a wide variety of interesting and powerful open source software as part of their regular job. + +每个人都可以免费的从事开源软件,但是,作为系统管理员,你可以在此同时获得报酬。 +系统管理员经常以贡献开源项目,支持开源的供应商,参与各种各样的有趣的强大的开源软件为他们日常的工作。 + + +Last, what about the community? +I can say from years of experience that it is hard to find a more welcoming, encouraging, friendly, and helpful community. +Sure, there is the stereotype of the grumpy sysadmin, but I feel that's mostly an outdated joke now. +Most sysadmins today respond positively to all forms of constructive feedback, particularly when it comes to welcoming newcomers. +We're almost all keenly aware of our diversity and demographic problems and eager to solve them. +We are a community of deep and diverse interests. +Ask a sysadmin what they do outside of work and you are unlikely to be bored. + + +最后,谈一下社区。 +以我多年的经验来看,找到一个更加欢迎的,鼓励的,友好的,有帮助的社区是非常难的。 +系统管理员给人的刻板印象就是性情乖戾的,但是我感觉现在这只不过是个过时的笑话。 +现在大多数的系统管理员积极的回应所有形式的结构性的反馈,尤其是欢迎新手。 +我们总是能敏锐的察觉到多样的入门级别的问题,并且着急去解决它们。我们是一个深度的,有着多种兴趣的社区。 +问一下一个系统管理在工作之余都干了些什么,肯定不会无聊。 + + +If you're convinced, first the good news. More than many STEM careers, +it's possible to transition into system administration without a directly relevant four-year degree. +In fact, there are relatively few four-year degrees in system administration in the entire world, which helps set expectations. + +As with every white-collar job these days, a degree does help, and the more relevant the better. Unlike many other STEM careers, +there is a natural entry-level position: the helpdesk. + +如果你被说服了,首先有个好消息。 +与与许多主流职业相比,从没有直接的相关的 4 年制学位转为系统管理员是可能的。 +事实上,全世界的系统管理四年制度相对较少,这有助于预期。 +对于现在的白领工作,学位确实有用,而且越相关越好。与其他的主流职业相比,这儿有一个自然的入门级别的职位,帮助台。 + + +The bad news for system administration hopefuls is true for many STEM (and even non-STEM) fields: +Employers are looking for people with years of experience and advanced degrees, +even for explicitly entry-level positions. Employers are underpaying. +Employers aren't investing in training. +The consolation is that these problems are so prevalent in the job market that you'll be facing them in any job. + +系统管理员所希望的坏消息是真的,对于主流或者非主流领域: +雇主在寻找有多年经验的和有高学历的人,甚至是入门级别的位置。雇主是刻薄的。 +雇主不会花钱给你培训。 +值得欣慰的是,这些问题是非常普遍的,而且是你将会面对的。 + +System administration can be a starting point for other IT fields, such as network administration, database administration, and site reliability engineering. +And just a bit further away are software engineering, quality assurance, and IT management. + +系统管理可以作为其他 IT 领域的起点。比如:网络管理,数据库管理,网站可靠性工程师,再偏一些的有,软件工程师,质量保证,IT 管理。 + +Details of the sysadmin job, both the stereotypes and obvious aspects, +as well as some less obvious things to consider, are topics for future Opensource.com articles. +We'll also cover some important ways in which the field is likely to change and offer ways to evaluate and compare sysadmin positions and ask powerful questions during interviews. + + +系统管理的细节,刻板印象和一些明显的方面,还要考虑一些不明显的方面,是未来 Opensource.com 文章的话题。 +我们也会涵盖这个领域可能会改变的重要方面,提供一些方法评估和比较系统管理的职位,在面试期间问一些有力的问题。 + +If you're interested in joining the field, consider joining the League of Professional System Administrators (LOPSA), +the professional organization on which I serve as a board member. +Membership is affordable (and may be covered by your employer) and free for students. +Being a LOPSA member is a fantastic way to meet sysadmins and discuss the career with people at various levels of experience and in a variety of industries and work environments. + + +如果你对加入这个领域有兴趣,考虑加入专业系统管理者联盟( LOPSA ),我在这个组织任董事会成员。 +会员资格是负担得起的(可能由您的雇主负责),学生免费。 +作为LOPSA会员,是满足系统管理员和讨论与各种经验以及各种行业和工作环境中的人员的职业生涯的绝佳方式。 + + + + + + + + + + From 02aefb4a85b60e02b9c7aecc241edc2f915443f2 Mon Sep 17 00:00:00 2001 From: sugarfillet <1911093465@qq.com> Date: Tue, 1 Aug 2017 20:01:58 +0800 Subject: [PATCH 0869/1407] translated Why you should be a sysadmin --- abc | 103 ------------------ .../20170717 Why you should be a sysadmin.md | 69 ------------ .../20170717 Why you should be a sysadmin.md | 100 +++++++++++++++++ 3 files changed, 100 insertions(+), 172 deletions(-) delete mode 100644 abc delete mode 100644 sources/tech/20170717 Why you should be a sysadmin.md create mode 100644 translated/tech/20170717 Why you should be a sysadmin.md diff --git a/abc b/abc deleted file mode 100644 index 0a4689f8f0..0000000000 --- a/abc +++ /dev/null @@ -1,103 +0,0 @@ -Is system administration something you've done for free? -Most of us manage at least a few devices, but that doesn't mean you enjoy it. -If you've added some extra systems acting as servers on your home network, you're a candidate. -Did you justify adding a Minecraft server for your kid mostly so that you could have fun setting up a Raspberry Pi server? -Maybe it's time to consider getting paid to do that sort of work. - -你曾经做的一些系统管理是免费的吗?我们大多数人都多多少少的管理一些设备,但是那并不代表你享受它。 -如果你曾经在你家的网络中添加了一些服务器,你就是系统管理的候选人。 -有些人会为自己的孩子设法添加一个我的世界的服务器,他们会通过树莓派来设置。你是这些人么? -也许是时候来考虑通过做这样的工作来获取报酬了。 - - -System administration as a generalist job offers a particular kind of flexibility. -System administrators are needed across a wide variety of industries and company sizes. -Most urban areas have a need for some on-site workers, and remote work is also a strong possibility. - -作为一份需要全面只是的工作,系统管理提供了很特别的伸缩性。 -各种各样的企业和公司都需要系统管理员。 -大多数的市区需要一些现场办公人员,但是远程办公也有很大的可能性。 - - -Anyone can work with open source software for free, -but as a sysadmin you can also get paid to do it. -System administrators often contribute to open source projects, -support open source vendors, and work with a wide variety of interesting and powerful open source software as part of their regular job. - -每个人都可以免费的从事开源软件,但是,作为系统管理员,你可以在此同时获得报酬。 -系统管理员经常以贡献开源项目,支持开源的供应商,参与各种各样的有趣的强大的开源软件为他们日常的工作。 - - -Last, what about the community? -I can say from years of experience that it is hard to find a more welcoming, encouraging, friendly, and helpful community. -Sure, there is the stereotype of the grumpy sysadmin, but I feel that's mostly an outdated joke now. -Most sysadmins today respond positively to all forms of constructive feedback, particularly when it comes to welcoming newcomers. -We're almost all keenly aware of our diversity and demographic problems and eager to solve them. -We are a community of deep and diverse interests. -Ask a sysadmin what they do outside of work and you are unlikely to be bored. - - -最后,谈一下社区。 -以我多年的经验来看,找到一个更加欢迎的,鼓励的,友好的,有帮助的社区是非常难的。 -系统管理员给人的刻板印象就是性情乖戾的,但是我感觉现在这只不过是个过时的笑话。 -现在大多数的系统管理员积极的回应所有形式的结构性的反馈,尤其是欢迎新手。 -我们总是能敏锐的察觉到多样的入门级别的问题,并且着急去解决它们。我们是一个深度的,有着多种兴趣的社区。 -问一下一个系统管理在工作之余都干了些什么,肯定不会无聊。 - - -If you're convinced, first the good news. More than many STEM careers, -it's possible to transition into system administration without a directly relevant four-year degree. -In fact, there are relatively few four-year degrees in system administration in the entire world, which helps set expectations. - -As with every white-collar job these days, a degree does help, and the more relevant the better. Unlike many other STEM careers, -there is a natural entry-level position: the helpdesk. - -如果你被说服了,首先有个好消息。 -与与许多主流职业相比,从没有直接的相关的 4 年制学位转为系统管理员是可能的。 -事实上,全世界的系统管理四年制度相对较少,这有助于预期。 -对于现在的白领工作,学位确实有用,而且越相关越好。与其他的主流职业相比,这儿有一个自然的入门级别的职位,帮助台。 - - -The bad news for system administration hopefuls is true for many STEM (and even non-STEM) fields: -Employers are looking for people with years of experience and advanced degrees, -even for explicitly entry-level positions. Employers are underpaying. -Employers aren't investing in training. -The consolation is that these problems are so prevalent in the job market that you'll be facing them in any job. - -系统管理员所希望的坏消息是真的,对于主流或者非主流领域: -雇主在寻找有多年经验的和有高学历的人,甚至是入门级别的位置。雇主是刻薄的。 -雇主不会花钱给你培训。 -值得欣慰的是,这些问题是非常普遍的,而且是你将会面对的。 - -System administration can be a starting point for other IT fields, such as network administration, database administration, and site reliability engineering. -And just a bit further away are software engineering, quality assurance, and IT management. - -系统管理可以作为其他 IT 领域的起点。比如:网络管理,数据库管理,网站可靠性工程师,再偏一些的有,软件工程师,质量保证,IT 管理。 - -Details of the sysadmin job, both the stereotypes and obvious aspects, -as well as some less obvious things to consider, are topics for future Opensource.com articles. -We'll also cover some important ways in which the field is likely to change and offer ways to evaluate and compare sysadmin positions and ask powerful questions during interviews. - - -系统管理的细节,刻板印象和一些明显的方面,还要考虑一些不明显的方面,是未来 Opensource.com 文章的话题。 -我们也会涵盖这个领域可能会改变的重要方面,提供一些方法评估和比较系统管理的职位,在面试期间问一些有力的问题。 - -If you're interested in joining the field, consider joining the League of Professional System Administrators (LOPSA), -the professional organization on which I serve as a board member. -Membership is affordable (and may be covered by your employer) and free for students. -Being a LOPSA member is a fantastic way to meet sysadmins and discuss the career with people at various levels of experience and in a variety of industries and work environments. - - -如果你对加入这个领域有兴趣,考虑加入专业系统管理者联盟( LOPSA ),我在这个组织任董事会成员。 -会员资格是负担得起的(可能由您的雇主负责),学生免费。 -作为LOPSA会员,是满足系统管理员和讨论与各种经验以及各种行业和工作环境中的人员的职业生涯的绝佳方式。 - - - - - - - - - - diff --git a/sources/tech/20170717 Why you should be a sysadmin.md b/sources/tech/20170717 Why you should be a sysadmin.md deleted file mode 100644 index 93150cf7f3..0000000000 --- a/sources/tech/20170717 Why you should be a sysadmin.md +++ /dev/null @@ -1,69 +0,0 @@ -sugarfillet translating -Why you should be a sysadmin -============================================================ - -### Network and system administration jobs are well-paying and plentiful. - - -![Why you should be a sysadmin](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/sysadmin_uncleserver.jpeg?itok=Tc9LAT7N "Why you should be a sysadmin") -Image credits :  - -Jason Baker, CC BY-SA 4.0 - -We are at war with entropy, and Uncle Server wants YOU to be a system administrator. - -Chances are good that you are already an administrator for some systems you own, and you do it for free because that's just how it goes these days. But there are employers willing and eager to pay good money for someone to help administer their systems. We're currently near zero unemployment in system and network administration, and the Bureau of Labor Statistics projects continued [9% growth][3] in the field through 2024. - -What about automation, you ask. Perhaps you've heard sysadmins say how they intend to automate away their entire job, or how they automated their predecessor's job in a single shell script. How many have you heard of that succeeding? When the job is automation, there is always more to automate. - -If you attend or watch videos of sysadmin conferences, you'll see a field that needs new blood. Not only is there a distinct lack of younger people, but also fairly extreme gender and racial imbalances. While those are topics for a different article, diversity is well proven to improve resilience, problem-solving, innovation, and decision-making—things of great interest to sysadmins. - -### Do I want to be a sysadmin? - -So you're needed, but do you need system administration? Assuming you live in a first world country, US$ 70,000 annual income seems to be a threshold for happiness—or at least shedding most money-related stress. The median for system and network administrators is US$ 80,000, so hitting that threshold is quite achievable, though obviously there are plenty of people making less (and more). - -Is system administration something you've done for free? Most of us manage at least a few devices, but that doesn't mean you enjoy it. If you've added some extra systems acting as servers on your home network, you're a candidate. Did you justify adding a Minecraft server for your kid mostly so that you could have fun setting up a Raspberry Pi server? Maybe it's time to consider getting paid to do that sort of work. - -System administration as a generalist job offers a particular kind of flexibility. System administrators are needed across a wide variety of industries and company sizes. Most urban areas have a need for some on-site workers, and remote work is also a strong possibility. - -Anyone can work with open source software for free, but as a sysadmin you can also get paid to do it. System administrators often contribute to open source projects, support open source vendors, and work with a wide variety of interesting and powerful open source software as part of their regular job. - -Last, what about the community? I can say from years of experience that it is hard to find a more welcoming, encouraging, friendly, and helpful community. Sure, there is the stereotype of the grumpy sysadmin, but I feel that's mostly an outdated joke now. Most sysadmins today respond positively to all forms of constructive feedback, particularly when it comes to welcoming newcomers. We're almost all keenly aware of our diversity and demographic problems and eager to solve them. We are a community of deep and diverse interests. Ask a sysadmin what they do outside of work and you are unlikely to be bored. - -### So where do I sign up? - -If you're convinced, first the good news. More than many STEM careers, it's possible to transition into system administration without a directly relevant four-year degree. In fact, there are relatively few four-year degrees in system administration in the entire world, which helps set expectations. As with every white-collar job these days, a degree does help, and the more relevant the better. Unlike many other STEM careers, there is a natural entry-level position: the helpdesk. - -The bad news for system administration hopefuls is true for many STEM (and even non-STEM) fields: Employers are looking for people with years of experience and advanced degrees, even for explicitly entry-level positions. Employers are underpaying. Employers aren't investing in training. The consolation is that these problems are so prevalent in the job market that you'll be facing them in any job. - -System administration can be a starting point for other IT fields, such as network administration, database administration, and site reliability engineering. And just a bit further away are software engineering, quality assurance, and IT management. - -Details of the sysadmin job, both the stereotypes and obvious aspects, as well as some less obvious things to consider, are topics for future Opensource.com articles. We'll also cover some important ways in which the field is likely to change and offer ways to evaluate and compare sysadmin positions and ask powerful questions during interviews. - -If you're interested in joining the field, consider joining the [League of Professional System Administrators][4] (LOPSA), the professional organization on which I serve as a board member. Membership is affordable (and may be covered by your employer) and free for students. Being a LOPSA member is a fantastic way to meet sysadmins and discuss the career with people at various levels of experience and in a variety of industries and work environments. - --------------------------------------------------------------------------------- - -作者简介: - -Paul English - Paul English is CEO of PreOS Security Inc. Paul is a Board member for the League of Professional System Administrator, a non-profit professional association for hte advancement of the practice of system administration from 2015 through 2017. Paul has Bachelors in Computer Science from Worcester Polytechnic Institute obtained in 1998. And Paul has been a UNIX & Linux system administrator and wearer of many other IT hats since 1996. - -------------------- - - -via: https://opensource.com/article/17/7/why-become-sysadmin - -作者:[ Paul English ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/penglish -[1]:https://opensource.com/article/17/7/why-become-sysadmin?rate=_WhJK6oklTBkiCcSP0hmPIxAiSrmlSbsDqrz3RTBx-4 -[2]:https://opensource.com/user/157701/feed -[3]:https://www.bls.gov/ooh/Computer-and-Information-Technology/Network-and-computer-systems-administrators.htm#tab-1 -[4]:https://lopsa.org/ -[5]:https://opensource.com/users/penglish -[6]:https://opensource.com/users/penglish -[7]:https://opensource.com/article/17/7/why-become-sysadmin#comments diff --git a/translated/tech/20170717 Why you should be a sysadmin.md b/translated/tech/20170717 Why you should be a sysadmin.md new file mode 100644 index 0000000000..0b742ccd32 --- /dev/null +++ b/translated/tech/20170717 Why you should be a sysadmin.md @@ -0,0 +1,100 @@ +sugarfillet translated + +为什么你应该成为一名系统管理员? +============================================================ + + +### 网络和系统管理员工资高并且人数多 + + +![为什么你应该成为一名系统管理员](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/sysadmin_uncleserver.jpeg?itok=Tc9LAT7N "Why you should be a sysadmin") +索引 : Jason Baker, CC BY-SA 4.0 + + +我们在与混乱战斗,而且,服务器大叔需要你成为系统管理员。这是个很好的机会,因为你已经管理过你有的那些系统,你本可以不需酬劳地管理那些每天如一日运行的系统。但是还是有一些面试官,愿意拿一笔很不错的薪水来应聘系统管理员。目前,系统和网络管理的失业率几乎为零,但是劳工统计局估计到 2024 年该指数将持续 [9% 的增长][3]。 + + + +你可能会问,自动化怎么样?大概你已经听一些系统管理员说,他们打算如何来自动化他们所有的工作,或者,他们如何在一个 shell 脚本里自动化完成他们前任者的工作。你听过的有多少成功的?当任务可以自动化,也会有更多的东西需要自动化。 + + +如果你参加或者观看系统管理者会议的视频,你会发现需要新鲜血液的领域。不仅仅是明显的缺少年轻人,而且相当严重的性别和种族不平等。虽然有点儿跑题,但是多样性已经被证明可以提高系统管理员非常感兴趣的自我恢复力、解决问题的能力,创新力和决策力。 + + +### 我想成为一名系统管理员吗? + + + +你被需要了,但是你需要系统管理吗?如果你生活在一个第一世界国家,每季度 70,000 美元的收入看上去是一个感到幸福的标准收入,或者说至少减少了大部分的与钱相关的压力。系统和网络管理员的中位季度收入是 80,000 美元,很容易达标,尽管明显有些人赚的更少或更多。 + + + + +你曾经做的一些系统管理是免费的吗?我们大多数人都多多少少的管理一些设备,但是那并不代表你享受它。如果你曾经在你家的网络中添加了一些服务器,你就是系统管理的候选人。有些人会为自己的孩子设法添加一个我的世界的服务器,他们会通过树莓派来设置。你是这些人么?也许是时候来考虑通过做这样的工作来获取报酬了。 + + + + +作为一份需要全面只是的工作,系统管理提供了很特别的伸缩性。各种各样的企业和公司都需要系统管理员。大多数的市区需要一些现场办公人员,但是远程办公也有很大的可能性。 + + + +每个人都可以免费的从事开源软件,但是,作为系统管理员,你可以在此同时获得报酬。系统管理员经常以贡献开源项目,支持开源的供应商,参与各种各样的有趣的强大的开源软件为他们日常的工作。 + + + +最后,谈一下社区。以我多年的经验来看,找到一个更加欢迎的,鼓励的,友好的,有帮助的社区是非常难的。系统管理员给人的刻板印象就是性情乖戾的,但是我感觉现在这只不过是个过时的笑话。现在大多数的系统管理员积极的回应所有形式的结构性的反馈,尤其是欢迎新手。我们总是能敏锐的察觉到多样的入门级别的问题,并且着急去解决它们。我们是一个深度的,有着多种兴趣的社区。问一下一个系统管理在工作之余都干了些什么,肯定不会无聊。 + + +### 因此,我要去哪儿开始? + + + + +如果你被说服了,首先有个好消息。与与许多主流职业相比,从没有直接的相关的 4 年制学位转为系统管理员是可能的。事实上,全世界的系统管理四年制度相对较少,这有助于预期。对于现在的白领工作,学位确实有用,而且越相关越好。与其他的主流职业相比,这儿有一个自然的入门级别的职位,帮助台。 + + + +系统管理员所希望的坏消息是真的,对于主流或者非主流领域:雇主在寻找有多年经验的和有高学历的人,甚至是入门级别的位置。雇主是刻薄的。雇主不会花钱给你培训。值得欣慰的是,这些问题是非常普遍的,而且是你将会面对的。 + + + + +系统管理可以作为其他 IT 领域的起点。比如:网络管理,数据库管理,网站可靠性工程师,再偏一些的有,软件工程师,质量保证,IT 管理。 + + + + +系统管理的细节,刻板印象和一些明显的方面,还要考虑一些不明显的方面,是未来 Opensource.com 文章的话题。我们也会涵盖这个领域可能会改变的重要方面,提供一些方法评估和比较系统管理的职位,在面试期间问一些有力的问题。 + + + + +如果你对加入这个领域有兴趣,考虑加入[专业系统管理者联盟][4](LOPSA),我在这个组织任董事会成员。会员资格是负担得起的(可能由您的雇主负责),学生免费。作为 LOPSA 会员,是满足系统管理员和讨论与各种经验以及各种行业和工作环境中的人员的职业生涯的绝佳方式。 + +-------------------------------------------------------------------------------- + +作者简介: + + +保罗-英语 - 保罗是 PreOS 安全公司的首席执行官。保罗是专业系统管理员联盟的董事会成员,该专业系统管理员联盟是一个非营利性专业协会,从 2015 年到 2017 年,他提升了系统管理实践。保罗在 1998 年获得了伍斯特理工学院的计算机学士学位。自1996年以来,Paul一直是 UNIX 和 Linux 系统管理员和许多其他 IT 帽子的佩戴者。 + +------------------- + + +via: https://opensource.com/article/17/7/why-become-sysadmin + +作者:[ Paul English ][a] +译者:[sugarfillet](https://github.com/sugarfillet) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/penglish +[1]:https://opensource.com/article/17/7/why-become-sysadmin?rate=_WhJK6oklTBkiCcSP0hmPIxAiSrmlSbsDqrz3RTBx-4 +[2]:https://opensource.com/user/157701/feed +[3]:https://www.bls.gov/ooh/Computer-and-Information-Technology/Network-and-computer-systems-administrators.htm#tab-1 +[4]:https://lopsa.org/ +[5]:https://opensource.com/users/penglish +[6]:https://opensource.com/users/penglish +[7]:https://opensource.com/article/17/7/why-become-sysadmin#comments From 6e9f6299f2d27819fd9d5ed8de62db24533b7280 Mon Sep 17 00:00:00 2001 From: sugarfillet <1911093465@qq.com> Date: Tue, 1 Aug 2017 20:01:58 +0800 Subject: [PATCH 0870/1407] translated Why you should be a sysadmin --- abc | 103 ------------------ .../20170717 Why you should be a sysadmin.md | 69 ------------ .../20170717 Why you should be a sysadmin.md | 92 ++++++++++++++++ 3 files changed, 92 insertions(+), 172 deletions(-) delete mode 100644 abc delete mode 100644 sources/tech/20170717 Why you should be a sysadmin.md create mode 100644 translated/tech/20170717 Why you should be a sysadmin.md diff --git a/abc b/abc deleted file mode 100644 index 0a4689f8f0..0000000000 --- a/abc +++ /dev/null @@ -1,103 +0,0 @@ -Is system administration something you've done for free? -Most of us manage at least a few devices, but that doesn't mean you enjoy it. -If you've added some extra systems acting as servers on your home network, you're a candidate. -Did you justify adding a Minecraft server for your kid mostly so that you could have fun setting up a Raspberry Pi server? -Maybe it's time to consider getting paid to do that sort of work. - -你曾经做的一些系统管理是免费的吗?我们大多数人都多多少少的管理一些设备,但是那并不代表你享受它。 -如果你曾经在你家的网络中添加了一些服务器,你就是系统管理的候选人。 -有些人会为自己的孩子设法添加一个我的世界的服务器,他们会通过树莓派来设置。你是这些人么? -也许是时候来考虑通过做这样的工作来获取报酬了。 - - -System administration as a generalist job offers a particular kind of flexibility. -System administrators are needed across a wide variety of industries and company sizes. -Most urban areas have a need for some on-site workers, and remote work is also a strong possibility. - -作为一份需要全面只是的工作,系统管理提供了很特别的伸缩性。 -各种各样的企业和公司都需要系统管理员。 -大多数的市区需要一些现场办公人员,但是远程办公也有很大的可能性。 - - -Anyone can work with open source software for free, -but as a sysadmin you can also get paid to do it. -System administrators often contribute to open source projects, -support open source vendors, and work with a wide variety of interesting and powerful open source software as part of their regular job. - -每个人都可以免费的从事开源软件,但是,作为系统管理员,你可以在此同时获得报酬。 -系统管理员经常以贡献开源项目,支持开源的供应商,参与各种各样的有趣的强大的开源软件为他们日常的工作。 - - -Last, what about the community? -I can say from years of experience that it is hard to find a more welcoming, encouraging, friendly, and helpful community. -Sure, there is the stereotype of the grumpy sysadmin, but I feel that's mostly an outdated joke now. -Most sysadmins today respond positively to all forms of constructive feedback, particularly when it comes to welcoming newcomers. -We're almost all keenly aware of our diversity and demographic problems and eager to solve them. -We are a community of deep and diverse interests. -Ask a sysadmin what they do outside of work and you are unlikely to be bored. - - -最后,谈一下社区。 -以我多年的经验来看,找到一个更加欢迎的,鼓励的,友好的,有帮助的社区是非常难的。 -系统管理员给人的刻板印象就是性情乖戾的,但是我感觉现在这只不过是个过时的笑话。 -现在大多数的系统管理员积极的回应所有形式的结构性的反馈,尤其是欢迎新手。 -我们总是能敏锐的察觉到多样的入门级别的问题,并且着急去解决它们。我们是一个深度的,有着多种兴趣的社区。 -问一下一个系统管理在工作之余都干了些什么,肯定不会无聊。 - - -If you're convinced, first the good news. More than many STEM careers, -it's possible to transition into system administration without a directly relevant four-year degree. -In fact, there are relatively few four-year degrees in system administration in the entire world, which helps set expectations. - -As with every white-collar job these days, a degree does help, and the more relevant the better. Unlike many other STEM careers, -there is a natural entry-level position: the helpdesk. - -如果你被说服了,首先有个好消息。 -与与许多主流职业相比,从没有直接的相关的 4 年制学位转为系统管理员是可能的。 -事实上,全世界的系统管理四年制度相对较少,这有助于预期。 -对于现在的白领工作,学位确实有用,而且越相关越好。与其他的主流职业相比,这儿有一个自然的入门级别的职位,帮助台。 - - -The bad news for system administration hopefuls is true for many STEM (and even non-STEM) fields: -Employers are looking for people with years of experience and advanced degrees, -even for explicitly entry-level positions. Employers are underpaying. -Employers aren't investing in training. -The consolation is that these problems are so prevalent in the job market that you'll be facing them in any job. - -系统管理员所希望的坏消息是真的,对于主流或者非主流领域: -雇主在寻找有多年经验的和有高学历的人,甚至是入门级别的位置。雇主是刻薄的。 -雇主不会花钱给你培训。 -值得欣慰的是,这些问题是非常普遍的,而且是你将会面对的。 - -System administration can be a starting point for other IT fields, such as network administration, database administration, and site reliability engineering. -And just a bit further away are software engineering, quality assurance, and IT management. - -系统管理可以作为其他 IT 领域的起点。比如:网络管理,数据库管理,网站可靠性工程师,再偏一些的有,软件工程师,质量保证,IT 管理。 - -Details of the sysadmin job, both the stereotypes and obvious aspects, -as well as some less obvious things to consider, are topics for future Opensource.com articles. -We'll also cover some important ways in which the field is likely to change and offer ways to evaluate and compare sysadmin positions and ask powerful questions during interviews. - - -系统管理的细节,刻板印象和一些明显的方面,还要考虑一些不明显的方面,是未来 Opensource.com 文章的话题。 -我们也会涵盖这个领域可能会改变的重要方面,提供一些方法评估和比较系统管理的职位,在面试期间问一些有力的问题。 - -If you're interested in joining the field, consider joining the League of Professional System Administrators (LOPSA), -the professional organization on which I serve as a board member. -Membership is affordable (and may be covered by your employer) and free for students. -Being a LOPSA member is a fantastic way to meet sysadmins and discuss the career with people at various levels of experience and in a variety of industries and work environments. - - -如果你对加入这个领域有兴趣,考虑加入专业系统管理者联盟( LOPSA ),我在这个组织任董事会成员。 -会员资格是负担得起的(可能由您的雇主负责),学生免费。 -作为LOPSA会员,是满足系统管理员和讨论与各种经验以及各种行业和工作环境中的人员的职业生涯的绝佳方式。 - - - - - - - - - - diff --git a/sources/tech/20170717 Why you should be a sysadmin.md b/sources/tech/20170717 Why you should be a sysadmin.md deleted file mode 100644 index 93150cf7f3..0000000000 --- a/sources/tech/20170717 Why you should be a sysadmin.md +++ /dev/null @@ -1,69 +0,0 @@ -sugarfillet translating -Why you should be a sysadmin -============================================================ - -### Network and system administration jobs are well-paying and plentiful. - - -![Why you should be a sysadmin](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/sysadmin_uncleserver.jpeg?itok=Tc9LAT7N "Why you should be a sysadmin") -Image credits :  - -Jason Baker, CC BY-SA 4.0 - -We are at war with entropy, and Uncle Server wants YOU to be a system administrator. - -Chances are good that you are already an administrator for some systems you own, and you do it for free because that's just how it goes these days. But there are employers willing and eager to pay good money for someone to help administer their systems. We're currently near zero unemployment in system and network administration, and the Bureau of Labor Statistics projects continued [9% growth][3] in the field through 2024. - -What about automation, you ask. Perhaps you've heard sysadmins say how they intend to automate away their entire job, or how they automated their predecessor's job in a single shell script. How many have you heard of that succeeding? When the job is automation, there is always more to automate. - -If you attend or watch videos of sysadmin conferences, you'll see a field that needs new blood. Not only is there a distinct lack of younger people, but also fairly extreme gender and racial imbalances. While those are topics for a different article, diversity is well proven to improve resilience, problem-solving, innovation, and decision-making—things of great interest to sysadmins. - -### Do I want to be a sysadmin? - -So you're needed, but do you need system administration? Assuming you live in a first world country, US$ 70,000 annual income seems to be a threshold for happiness—or at least shedding most money-related stress. The median for system and network administrators is US$ 80,000, so hitting that threshold is quite achievable, though obviously there are plenty of people making less (and more). - -Is system administration something you've done for free? Most of us manage at least a few devices, but that doesn't mean you enjoy it. If you've added some extra systems acting as servers on your home network, you're a candidate. Did you justify adding a Minecraft server for your kid mostly so that you could have fun setting up a Raspberry Pi server? Maybe it's time to consider getting paid to do that sort of work. - -System administration as a generalist job offers a particular kind of flexibility. System administrators are needed across a wide variety of industries and company sizes. Most urban areas have a need for some on-site workers, and remote work is also a strong possibility. - -Anyone can work with open source software for free, but as a sysadmin you can also get paid to do it. System administrators often contribute to open source projects, support open source vendors, and work with a wide variety of interesting and powerful open source software as part of their regular job. - -Last, what about the community? I can say from years of experience that it is hard to find a more welcoming, encouraging, friendly, and helpful community. Sure, there is the stereotype of the grumpy sysadmin, but I feel that's mostly an outdated joke now. Most sysadmins today respond positively to all forms of constructive feedback, particularly when it comes to welcoming newcomers. We're almost all keenly aware of our diversity and demographic problems and eager to solve them. We are a community of deep and diverse interests. Ask a sysadmin what they do outside of work and you are unlikely to be bored. - -### So where do I sign up? - -If you're convinced, first the good news. More than many STEM careers, it's possible to transition into system administration without a directly relevant four-year degree. In fact, there are relatively few four-year degrees in system administration in the entire world, which helps set expectations. As with every white-collar job these days, a degree does help, and the more relevant the better. Unlike many other STEM careers, there is a natural entry-level position: the helpdesk. - -The bad news for system administration hopefuls is true for many STEM (and even non-STEM) fields: Employers are looking for people with years of experience and advanced degrees, even for explicitly entry-level positions. Employers are underpaying. Employers aren't investing in training. The consolation is that these problems are so prevalent in the job market that you'll be facing them in any job. - -System administration can be a starting point for other IT fields, such as network administration, database administration, and site reliability engineering. And just a bit further away are software engineering, quality assurance, and IT management. - -Details of the sysadmin job, both the stereotypes and obvious aspects, as well as some less obvious things to consider, are topics for future Opensource.com articles. We'll also cover some important ways in which the field is likely to change and offer ways to evaluate and compare sysadmin positions and ask powerful questions during interviews. - -If you're interested in joining the field, consider joining the [League of Professional System Administrators][4] (LOPSA), the professional organization on which I serve as a board member. Membership is affordable (and may be covered by your employer) and free for students. Being a LOPSA member is a fantastic way to meet sysadmins and discuss the career with people at various levels of experience and in a variety of industries and work environments. - --------------------------------------------------------------------------------- - -作者简介: - -Paul English - Paul English is CEO of PreOS Security Inc. Paul is a Board member for the League of Professional System Administrator, a non-profit professional association for hte advancement of the practice of system administration from 2015 through 2017. Paul has Bachelors in Computer Science from Worcester Polytechnic Institute obtained in 1998. And Paul has been a UNIX & Linux system administrator and wearer of many other IT hats since 1996. - -------------------- - - -via: https://opensource.com/article/17/7/why-become-sysadmin - -作者:[ Paul English ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/penglish -[1]:https://opensource.com/article/17/7/why-become-sysadmin?rate=_WhJK6oklTBkiCcSP0hmPIxAiSrmlSbsDqrz3RTBx-4 -[2]:https://opensource.com/user/157701/feed -[3]:https://www.bls.gov/ooh/Computer-and-Information-Technology/Network-and-computer-systems-administrators.htm#tab-1 -[4]:https://lopsa.org/ -[5]:https://opensource.com/users/penglish -[6]:https://opensource.com/users/penglish -[7]:https://opensource.com/article/17/7/why-become-sysadmin#comments diff --git a/translated/tech/20170717 Why you should be a sysadmin.md b/translated/tech/20170717 Why you should be a sysadmin.md new file mode 100644 index 0000000000..9f11a1831c --- /dev/null +++ b/translated/tech/20170717 Why you should be a sysadmin.md @@ -0,0 +1,92 @@ +sugarfillet translated + +为什么你应该成为一名系统管理员? +============================================================ + + +### 网络和系统管理员工资高并且人数多 + + +![为什么你应该成为一名系统管理员](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/sysadmin_uncleserver.jpeg?itok=Tc9LAT7N "Why you should be a sysadmin") +索引 : Jason Baker, CC BY-SA 4.0 + + +我们在与混乱战斗,而且,服务器大叔需要你成为系统管理员。这是个很好的机会,因为你已经管理过你有的那些系统,你本可以不需酬劳地管理那些每天如一日运行的系统。但是还是有一些面试官,愿意拿一笔很不错的薪水来应聘系统管理员。目前,系统和网络管理的失业率几乎为零,但是劳工统计局估计到 2024 年该指数将持续 [9% 的增长][3]。 + + + +你可能会问,自动化怎么样?大概你已经听一些系统管理员说,他们打算如何来自动化他们所有的工作,或者,他们如何在一个 shell 脚本里自动化完成他们前任者的工作。你听过的有多少成功的?当任务可以自动化,也会有更多的东西需要自动化。 + + +如果你参加或者观看系统管理者会议的视频,你会发现需要新鲜血液的领域。不仅仅是明显的缺少年轻人,而且相当严重的性别和种族不平等。虽然有点儿跑题,但是多样性已经被证明可以提高系统管理员非常感兴趣的自我恢复力、解决问题的能力,创新力和决策力。 + + +### 我想成为一名系统管理员吗? + + + +你被需要了,但是你需要系统管理吗?如果你生活在一个第一世界国家,每季度 70,000 美元的收入看上去是一个感到幸福的标准收入,或者说至少减少了大部分的与钱相关的压力。系统和网络管理员的中位季度收入是 80,000 美元,很容易达标,尽管明显有些人赚的更少或更多。 + + + + +你曾经做的一些系统管理是免费的吗?我们大多数人都多多少少的管理一些设备,但是那并不代表你享受它。如果你曾经在你家的网络中添加了一些服务器,你就是系统管理的候选人。有些人会为自己的孩子设法添加一个我的世界的服务器,他们会通过树莓派来设置。你是这些人么?也许是时候来考虑通过做这样的工作来获取报酬了。 + + + + +作为一份需要全面只是的工作,系统管理提供了很特别的伸缩性。各种各样的企业和公司都需要系统管理员。大多数的市区需要一些现场办公人员,但是远程办公也有很大的可能性。 + + + +每个人都可以免费的从事开源软件,但是,作为系统管理员,你可以在此同时获得报酬。系统管理员经常以贡献开源项目,支持开源的供应商,参与各种各样的有趣的强大的开源软件为他们日常的工作。 + + + +最后,谈一下社区。以我多年的经验来看,找到一个更加欢迎的,鼓励的,友好的,有帮助的社区是非常难的。系统管理员给人的刻板印象就是性情乖戾的,但是我感觉现在这只不过是个过时的笑话。现在大多数的系统管理员积极的回应所有形式的结构性的反馈,尤其是欢迎新手。我们总是能敏锐的察觉到多样的入门级别的问题,并且着急去解决它们。我们是一个深度的,有着多种兴趣的社区。问一下一个系统管理在工作之余都干了些什么,肯定不会无聊。 + + +### 因此,我要去哪儿开始? + + + + +如果你被说服了,首先有个好消息。与与许多主流职业相比,从没有直接的相关的 4 年制学位转为系统管理员是可能的。事实上,全世界的系统管理四年制度相对较少,这有助于预期。对于现在的白领工作,学位确实有用,而且越相关越好。与其他的主流职业相比,这儿有一个自然的入门级别的职位,帮助台。 + + + +系统管理员所希望的坏消息是真的,对于主流或者非主流领域:雇主在寻找有多年经验的和有高学历的人,甚至是入门级别的位置。雇主是刻薄的。雇主不会花钱给你培训。值得欣慰的是,这些问题是非常普遍的,而且是你将会面对的。 + + +系统管理可以作为其他 IT 领域的起点。比如:网络管理,数据库管理,网站可靠性工程师,再偏一些的有,软件工程师,质量保证,IT 管理。 + +系统管理的细节,刻板印象和一些明显的方面,还要考虑一些不明显的方面,是未来 Opensource.com 文章的话题。我们也会涵盖这个领域可能会改变的重要方面,提供一些方法评估和比较系统管理的职位,在面试期间问一些有力的问题。 + +如果你对加入这个领域有兴趣,考虑加入[专业系统管理者联盟][4](LOPSA),我在这个组织任董事会成员。会员资格是负担得起的(可能由您的雇主负责),学生免费。作为 LOPSA 会员,是满足系统管理员和讨论与各种经验以及各种行业和工作环境中的人员的职业生涯的绝佳方式。 + +-------------------------------------------------------------------------------- + +作者简介: + + +保罗-英语 - 保罗是 PreOS 安全公司的首席执行官。保罗是专业系统管理员联盟的董事会成员,该专业系统管理员联盟是一个非营利性专业协会,从 2015 年到 2017 年,他提升了系统管理实践。保罗在 1998 年获得了伍斯特理工学院的计算机学士学位。自 1996 年以来,Paul一直是 UNIX 和 Linux 系统管理员和许多其他 IT 帽子的佩戴者。 + +------------------- + + +via: https://opensource.com/article/17/7/why-become-sysadmin + +作者:[ Paul English ][a] +译者:[sugarfillet](https://github.com/sugarfillet) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/penglish +[1]:https://opensource.com/article/17/7/why-become-sysadmin?rate=_WhJK6oklTBkiCcSP0hmPIxAiSrmlSbsDqrz3RTBx-4 +[2]:https://opensource.com/user/157701/feed +[3]:https://www.bls.gov/ooh/Computer-and-Information-Technology/Network-and-computer-systems-administrators.htm#tab-1 +[4]:https://lopsa.org/ +[5]:https://opensource.com/users/penglish +[6]:https://opensource.com/users/penglish +[7]:https://opensource.com/article/17/7/why-become-sysadmin#comments From 6dd9349461606a9f28a4b2037ac14650dc878a47 Mon Sep 17 00:00:00 2001 From: xu0o0 Date: Wed, 2 Aug 2017 03:38:04 +0800 Subject: [PATCH 0871/1407] translating by @haoqixu --- sources/tech/20170710 How Linux containers have evolved.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/tech/20170710 How Linux containers have evolved.md b/sources/tech/20170710 How Linux containers have evolved.md index 159c7ed47d..d2d2c35150 100644 --- a/sources/tech/20170710 How Linux containers have evolved.md +++ b/sources/tech/20170710 How Linux containers have evolved.md @@ -1,4 +1,4 @@ -How Linux containers have evolved +【haoqixu翻译中】How Linux containers have evolved ============================================================ ### Containers have come a long way in the past few years. We walk through the timeline. From d4717fe91ad6b48ebf7f89a89858e36e73b13d33 Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 2 Aug 2017 08:52:43 +0800 Subject: [PATCH 0872/1407] translated --- ...ure an NGINX web server on Ubuntu 16.04.md | 187 ------------------ ...ure an NGINX web server on Ubuntu 16.04.md | 185 +++++++++++++++++ 2 files changed, 185 insertions(+), 187 deletions(-) delete mode 100644 sources/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md create mode 100644 translated/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md diff --git a/sources/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md b/sources/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md deleted file mode 100644 index ea486fdc9b..0000000000 --- a/sources/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md +++ /dev/null @@ -1,187 +0,0 @@ -translating----geekpi - -Encryption: How To Secure an NGINX web server on Ubuntu 16.04 -============================================================ - -By [Giuseppe Molica][1] - - [![Let's Encrypt Encryption CA](https://www.unixmen.com/wp-content/uploads/2017/06/le-logo-standard.png "le-logo-standard")][2] - -### What is Let’s Encrypt - -[Let’s Encrypt][3] is a free certificate authority brought by the Internet Security Research Group (ISRG). It provides an easy and automated way to obtain free SSL/TLS certificates – a required step for enabling encryption and HTTPS traffic on web servers. Most of the steps in obtaining and installing a certificate can be automated by using a tool called [Certbot][4]. - -In particular, this software can be used in presence of shell access to the server: in other words, when it’s possible to connect to the server through SSH. - -In this tutorial we will see how to use `certbot` to obtain a free SSL certificate and use it with Nginx on an Ubuntu 16.04 server. - -### Install Certbot - -The first step is to install `certbot`, the software client which will automate almost everything in the process. Certbot developers maintain their own Ubuntu software repository which contain software newer than those present in the Ubuntu repositories. - -Add the Certbot repository: - -``` -# add-apt-repository ppa:certbot/certbot -``` - -Next, update the APT sources list: - -``` -# apt-get update -``` - -At this point, it is possible to install `certbot` with the following `apt` command: - -``` -# apt-get install certbot -``` - -Certbot is now installed and ready to use. - -### Obtain a Certificate - -There are various Certbot plugins for obtaining SSL certificates. These plugins help in obtaining a certificate, while its installation and web server configuration are both left to the admin. - -We will use a plugin called **Webroot** to obtain a SSL certificate. - -This plugin is recommended in those cases where there is the ability to modify the content being served. There is no need to stop the web server during the certificate issuance process. - -#### Configure NGINX - -Webroot works by creating a temporary file for each domain in a directory called `.well-known`, placed inside the web root directory. In our case, the web root directory is `/var/www/html`. Ensure that the directory is accessible to Let’s Encrypt for validation. To do so, edit the NGINX configuration. With a text editor, open the `/etc/nginx/sites-available/default` file: - -``` -# $EDITOR /etc/nginx/sites-available/default -``` - -In this file, in the server block, place the following content: - -``` - location ~ /.well-known { - allow all; - } -``` - -Save, exit and check the NGINX configuration: - -``` -# nginx -t -``` - -Without errors, it should display: - -``` -nginx: the configuration file /etc/nginx/nginx.conf syntax is ok -nginx: configuration file /etc/nginx/nginx.conf test is successful -``` - -Restart NGINX: - -``` -# systemctl restart nginx -``` - -#### Obtain Certificate with Certbot - -The next step is to obtain a new certificate using Certbot with the Webroot plugin. In this tutorial, we will secure (as example) the domain www.example.com. It is required to specify every domain that should be secured by the certificate. Execute the following command: - -``` -# certbot certonly --webroot --webroot-path=/var/www/html -d www.example.com -``` - -During the process, Cerbot will ask for a valid email address for notification purposes. It will also ask to share it with the EFF, but this is not required. After agreeing the Terms of Services, it will obtain a new certificate. - -At the end, the directory `/etc/letsencrypt/archive` will contain the following files: - -* chain.pem: Let’s Encrypt chain certificate. - -* cert.pem: domain certificate. - -* fullchain.pem: combination of `cert.pem` and `chain.pem`. - -* privkey.pem: certificate’s private key. - -Certbot will also create symbolic links to the most recent certificate files in `/etc/letsencrypt/live/**domain_name**/`. This is the path we will use in server configuration. - -### Configure SSL/TLS on NGINX - -The next step is server configuration. Create a new snippet in the `/etc/nginx/snippets/`. A **snippet** is a part of a configuration file that can be included in virtual host configuration files. So, create a new file: - -``` -# $EDITOR /etc/nginx/snippets/secure-example.conf -``` - -The content of this file will be the directives specifying the locations of the certificate and key. Paste the following content: - -``` -ssl_certificate /etc/letsencrypt/live/domain_name/fullchain.pem; -ssl_certificate_key /etc/letsencrypt/live/domain_name/privkey.pem; -``` - -In our case, `domain_name` would be `example.com`. - -#### Edit NGINX Configuration - -Edit the default Virtual Host file: - -``` -# $EDITOR /etc/nginx/sites-available/default -``` - -As follows: - -``` -server { - listen 80 default_server; - listen [::]:80 default_server; - server_name www.example.com - return 301 https://$server_name$request_uri; - - # SSL configuration - # - listen 443 ssl default_server; - listen [::]:443 ssl default_server; - include snippets/secure-example.conf - # - # Note: You should disable gzip for SSL traffic. - # See: https://bugs.debian.org/773332 -... -``` - -This will enable encryption on NGINX. - -Save, exit and check the NGINX configuration file: - -``` -# nginx -t - -nginx: the configuration file /etc/nginx/nginx.conf syntax is ok -nginx: configuration file /etc/nginx/nginx.conf test is successful -``` - -Restart NGINX: - -``` -# systemctl restart nginx -``` - -### Conclusion - -Following all the steps above, at this point we have a secured NGINX-based web server, with encryption granted by Certbot and Let’s Encrypt. This is just a basic configuration, of course, and it’s possible to use many NGINX configuration parameters for personalizing everything, but that depends on specific web server requirements. - --------------------------------------------------------------------------------- - -via: https://www.unixmen.com/encryption-secure-nginx-web-server-ubuntu-16-04/ - -作者:[Giuseppe Molica ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.unixmen.com/author/tutan/ -[1]:https://www.unixmen.com/author/tutan/ -[2]:https://www.unixmen.com/wp-content/uploads/2017/06/le-logo-standard.png -[3]:https://letsencrypt.org/ -[4]:https://certbot.eff.org/ diff --git a/translated/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md b/translated/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md new file mode 100644 index 0000000000..0c089a06dd --- /dev/null +++ b/translated/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md @@ -0,0 +1,185 @@ +加密:如何保护 Ubuntu 16.04 上的 NGINX Web 服务器 +============================================================ + +由 [Giuseppe Molica][1] 提供 + + [![Let's Encrypt Encryption CA](https://www.unixmen.com/wp-content/uploads/2017/06/le-logo-standard.png "le-logo-standard")][2] + +### 什么是 Let’s Encrypt + +[Let’s Encrypt][3]是互联网安全研究组织 (ISRG) 提供的免费认证机构。它提供了一种轻松自动的方式来获取免费的 SSL/TLS 证书 - 这是在 Web 服务器上启用加密和 HTTPS 流量的必要步骤。获取和安装证书的大多数步骤可以通过使用名为 [Certbot][4] 的工具进行自动化。 + +特别地,该软件可在可以使用 shell 的服务器上使用:换句话说,当可以通过 SSH 连接使用。 + +在本教程中,我们将看到如何使用 `certbot` 获取免费的 SSL 证书,并在 Ubuntu 16.04 服务器上使用 Nginx。 + +### 安装 Certbot + +第一步是安装 `certbot`,该软件客户端可以几乎自动化所有的过程。 Certbot 开发人员维护自己的 Ubuntu 仓库,其中包含比 Ubuntu 仓库中存在的软件更新的软件。 + +添加Certbot 仓库: + +``` +# add-apt-repository ppa:certbot/certbot +``` + +接下来,更新 APT 源列表: + +``` +# apt-get update +``` + +此时,可以使用以下 `apt` 命令安装 `certbot`: + +``` +# apt-get install certbot +``` + +Certbot 现已安装并可使用。 + +### 获得证书 + +有各种 Certbot 插件可用于获取 SSL 证书。这些插件有助于获取证书,而其安装和 Web 服务器配置都留给管理员。 + +我们使用一个名为 **Webroot** 的插件来获取 SSL 证书。 + +在有能力修改正在运行的内容的情况下,建议使用此插件。在证书颁发过程中不需要停止 Web 服务器。 + +#### 配置 NGINX + +Webroot 通过为名为 `.well-known` 的目录中的每个域创建一个临时文件,并放置在 Web 根目录下。在我们的例子中,Web 根目录是 `/var/www/html`。确保该目录对 Let’s Encrypt 可访问以用于验证 。为此,请编辑 NGINX 配置。使用文本编辑器打开 `/etc/nginx/sites-available/default`: + +``` +# $EDITOR /etc/nginx/sites-available/default +``` + +在该文件中,在服务器块内,输入以下内容: + +``` + location ~ /.well-known { + allow all; + } +``` + +保存,退出并检查 NGINX 配置: + +``` +# nginx -t +``` + +没有错误应该会显示: + +``` +nginx: the configuration file /etc/nginx/nginx.conf syntax is ok +nginx: configuration file /etc/nginx/nginx.conf test is successful +``` + +重启 NGINX: + +``` +# systemctl restart nginx +``` + +#### 使用 Certbot 获取证书 + +下一步是使用 Certbot 的 Webroot 插件获取新证书。在本教程中,我们将示例保护域 www.example.com。需要指定应由证书保护的每个域。执行以下命令: + +``` +# certbot certonly --webroot --webroot-path=/var/www/html -d www.example.com +``` + +在此过程中,Cerbot 将要求有效的电子邮件地址进行通知。还会要求与 EFF 分享,但这不是必需的。在同意服务条款之后,它将获得一个新的证书。 + +最后,目录 `/etc/letsencrypt/archive` 将包含以下文件: + +* chain.pem:加密链证书。 + +* cert.pem:域名证书。 + +* fullchain.pem:`cert.pem`和 `chain.pem` 的组合。 + +* privkey.pem:证书私钥。 + +Certbot 还将创建符号链接到 `/etc/letsencrypt/live/**domain_name**/` 中的最新证书文件。这是我们将在服务器配置中使用的路径。 + +### 在 NGINX 上配置 SSL/TLS + +下一步是服务器配置。在 `/etc/nginx/snippets/` 中创建一个新的代码段。 **snippet** 是配置文件的一部分,可以包含在虚拟主机配置文件中。所以,创建一个新的文件: + +``` +# $EDITOR /etc/nginx/snippets/secure-example.conf +``` + +该文件的内容将指定证书和密钥位置。粘贴以下内容: + +``` +ssl_certificate /etc/letsencrypt/live/domain_name/fullchain.pem; +ssl_certificate_key /etc/letsencrypt/live/domain_name/privkey.pem; +``` + +在我们的例子中,`domain_name` 是 `example.com`。 + +#### 编辑 NGINX 配置 + +编辑默认虚拟主机文件: + +``` +# $EDITOR /etc/nginx/sites-available/default +``` + +如下: + +``` +server { + listen 80 default_server; + listen [::]:80 default_server; + server_name www.example.com + return 301 https://$server_name$request_uri; + + # SSL configuration + # + listen 443 ssl default_server; + listen [::]:443 ssl default_server; + include snippets/secure-example.conf + # + # Note: You should disable gzip for SSL traffic. + # See: https://bugs.debian.org/773332 +... +``` + +这将启用 NGINX 加密。 + +保存、退出并检查 NGINX 配置文件: + +``` +# nginx -t + +nginx: the configuration file /etc/nginx/nginx.conf syntax is ok +nginx: configuration file /etc/nginx/nginx.conf test is successful +``` + +重启 NGINX: + +``` +# systemctl restart nginx +``` + +### 总结 + +按照上述步骤,此时我们已经拥有了一个安全的基于 NGINX 的 Web 服务器,它由 Certbot 和 Let’s Encrypt 加密。这只是一个基本配置,当然你可以使用许多 NGINX 配置参数来个性化所有东西,但这取决于特定的 Web 服务器要求。 + +-------------------------------------------------------------------------------- + +via: https://www.unixmen.com/encryption-secure-nginx-web-server-ubuntu-16-04/ + +作者:[Giuseppe Molica ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.unixmen.com/author/tutan/ +[1]:https://www.unixmen.com/author/tutan/ +[2]:https://www.unixmen.com/wp-content/uploads/2017/06/le-logo-standard.png +[3]:https://letsencrypt.org/ +[4]:https://certbot.eff.org/ From 01f6fdde7d5d0947fd8ec74f0fe9120bf4fa1bc5 Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 2 Aug 2017 08:55:37 +0800 Subject: [PATCH 0873/1407] translating --- sources/tech/20170705 IoT Fuels Growth of Linux Malware.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170705 IoT Fuels Growth of Linux Malware.md b/sources/tech/20170705 IoT Fuels Growth of Linux Malware.md index 369c1a6e00..22d8990dbb 100644 --- a/sources/tech/20170705 IoT Fuels Growth of Linux Malware.md +++ b/sources/tech/20170705 IoT Fuels Growth of Linux Malware.md @@ -1,3 +1,5 @@ +translating---geekpi + IoT Fuels Growth of Linux Malware ============================================================ ![linus-iot-security](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2016-internet-of-things-1.jpg) From d6a0eede5ea33b7097e48d19c3dacb8efc445f3d Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 2 Aug 2017 10:19:19 +0800 Subject: [PATCH 0874/1407] PRF:20170717 Why you should be a sysadmin.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @sugarfillet 恭喜你,完成了首篇翻译! --- .../20170717 Why you should be a sysadmin.md | 66 ++++++------------- 1 file changed, 21 insertions(+), 45 deletions(-) diff --git a/translated/tech/20170717 Why you should be a sysadmin.md b/translated/tech/20170717 Why you should be a sysadmin.md index 32d9c39e63..84e8a28b98 100644 --- a/translated/tech/20170717 Why you should be a sysadmin.md +++ b/translated/tech/20170717 Why you should be a sysadmin.md @@ -1,84 +1,60 @@ -sugarfillet translated - 为什么你应该成为一名系统管理员? ============================================================ - -### 网络和系统管理员工资高并且人数多 - +> 网络和系统管理工作工资高、岗位多。 ![为什么你应该成为一名系统管理员](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/sysadmin_uncleserver.jpeg?itok=Tc9LAT7N "Why you should be a sysadmin") -索引 : Jason Baker, CC BY-SA 4.0 +我们为秩序而战,而服务器大叔则需要你成为系统管理员。 -我们在与混乱战斗,而且,服务器大叔需要你成为系统管理员。这是个很好的机会,因为你已经管理过你有的那些系统,你本可以不需酬劳地管理那些每天如一日运行的系统。但是还是有一些面试官,愿意拿一笔很不错的薪水来应聘系统管理员。目前,系统和网络管理的失业率几乎为零,但是劳工统计局估计到 2024 年该指数将持续 [9% 的增长][3]。 +这是个很好的机会,因为你已经管理过你有的那些系统,你本可以不需酬劳地管理那些日逐一日地运行的系统。但还是有一些面试官,愿意拿一笔很不错的薪水来找一些人去管理他们的系统。目前,系统和网络管理的失业率几乎为零,但是美国劳工统计局估计到 2024 年该领域将持续 [9% 的增长][3]。 +你可能会问,自动化运维怎么样?大概你已经听一些系统管理员说过,他们打算如何来自动化他们所有的工作,或者,他们如何在一个 shell 脚本里自动化完成他们前任者的工作。你听过的有多少成功的?自动化了某个任务,就会有更多的东西需要自动化。 +如果你参加过系统管理者会议或观看过他们的视频,你会发现这是一个需要新鲜血液的领域。不仅仅是明显的缺少年轻人,而且相当地性别和种族不平等。虽然有点儿跑题,但是多样性已经被证明可以提高系统管理员非常感兴趣的自我恢复力、解决问题的能力,创新力和决策力。 -你可能会问,自动化怎么样?大概你已经听一些系统管理员说,他们打算如何来自动化他们所有的工作,或者,他们如何在一个 shell 脚本里自动化完成他们前任者的工作。你听过的有多少成功的?当任务可以自动化,也会有更多的东西需要自动化。 +### 我要成为一名系统管理员吗? +有人要你,但是你要做系统管理工作吗?如果你生活在一个第一世界国家,每季度 70,000 美元的收入看上去是一个可以感到幸福的标准收入,或者说至少减少了大部分的与钱相关的压力。系统和网络管理员的中位季度收入是 80,000 美元,很容易达标,尽管明显有些人赚的更少或更多。 -如果你参加或者观看系统管理者会议的视频,你会发现需要新鲜血液的领域。不仅仅是明显的缺少年轻人,而且相当严重的性别和种族不平等。虽然有点儿跑题,但是多样性已经被证明可以提高系统管理员非常感兴趣的自我恢复力、解决问题的能力,创新力和决策力。 +你曾经免费做过一些系统管理工作吗?我们大多数人都多多少少地管理一些设备,但是那并不代表你喜欢管理它。如果你曾经在你家的网络中添加了一些服务器,你就是一个备选的系统管理员。你想要为自己的孩子添加一个“我的世界”的游戏服务器么,所以你用树莓派搭建了一个?也许是时候来考虑通过做这样的工作来获取报酬了。 +作为一份需要全面知识的工作,系统管理工作有很大的跨度。各种行业和各种规模的公司都需要系统管理员。大多数的位于市区里的公司需要一些现场上班的人员,但是远程办公也有很大的可能性。 -### 我想成为一名系统管理员吗? +每个人都是免费地用开源软件工作,但是,作为系统管理员,你也可以计酬工作。系统管理员经常把对开源项目做贡献、支持开源供应商、使用各种各样的有趣而强大的开源软件为他们日常工作的一部分。 +最后,谈一下社区。以我多年的经验来看,找到一个欢迎新人的、鼓励参与的、气氛友好的、彼此帮助的社区是非常难的。系统管理员给人的刻板印象就是性情乖戾,但是我感觉现在这只不过是个过时的笑话。现在大多数的系统管理员积极地回应各种形式的有建设性的反馈,尤其是欢迎新手。我们总是能敏锐的察觉到各种各样的入门级问题,并且热心于解决它们。我们是一个有深度的、兴趣广泛的社区。问一下一个系统管理员在工作之余都干了些什么,你肯定会感到吃惊。 +### 那么,我要从哪儿开始? -你被需要了,但是你需要系统管理吗?如果你生活在一个第一世界国家,每季度 70,000 美元的收入看上去是一个感到幸福的标准收入,或者说至少减少了大部分的与钱相关的压力。系统和网络管理员的中位季度收入是 80,000 美元,很容易达标,尽管明显有些人赚的更少或更多。 +如果你被说服了,首先有个好消息。与许多技术类职业相比,从不是直接相关的四年制学历转为系统管理员是可能的。事实上,全世界有四年本科学历的系统管理员相对较少,所以不用太担心这个。对于现在的白领工作,学历确实有用,而且越相关越好。与其他的技术类职业相比,这儿有一个很自然的入门级别的职位:技术支持。 +对系统管理工作的候选人来说有个坏消息是真的,在技术类领域(甚至非技术类领域):雇主在寻找有多年经验的和有高学历的人,即便是在入门级别的岗位上。雇主是刻薄的,雇主不会花钱给你培训。不过稍嫌安慰的是,这些问题在人才市场上是非常普遍的,所以不管你找什么工作都得面对这种问题。 +系统管理工作可以作为其他 IT 领域的起点。比如:网络管理、数据库管理、网站可靠性工程师(SRE),再远一些的也有,软件工程师、质量保证(QA)、IT 管理。 +系统管理工作的具体情况,包括其刻板的印象和一些明显的方面以及不明显的方面,是未来我们的文章的主题。我们也会涵盖这个领域可能会改变的重要方面,提供一些方法来评估和比较系统管理职位,以及在面试中问到的一些重要问题。 -你曾经做的一些系统管理是免费的吗?我们大多数人都多多少少的管理一些设备,但是那并不代表你享受它。如果你曾经在你家的网络中添加了一些服务器,你就是系统管理的候选人。有些人会为自己的孩子设法添加一个我的世界的服务器,他们会通过树莓派来设置。你是这些人么?也许是时候来考虑通过做这样的工作来获取报酬了。 +如果你对加入这个领域有兴趣,可以考虑加入[专业系统管理者联盟][4](LOPSA),我在这个组织任董事会成员。会员资格是你负担得起的(可能由您的雇主负责),而学生免费。成为 LOPSA 会员,是找到同行们和与有各种经验、各种行业和工作环境中的人员讨论职业生涯的绝佳方式。 +(题图 : Jason Baker, CC BY-SA 4.0) - -作为一份需要全面只是的工作,系统管理提供了很特别的伸缩性。各种各样的企业和公司都需要系统管理员。大多数的市区需要一些现场办公人员,但是远程办公也有很大的可能性。 - - - -每个人都可以免费的从事开源软件,但是,作为系统管理员,你可以在此同时获得报酬。系统管理员经常以贡献开源项目,支持开源的供应商,参与各种各样的有趣的强大的开源软件为他们日常的工作。 - - - -最后,谈一下社区。以我多年的经验来看,找到一个更加欢迎的,鼓励的,友好的,有帮助的社区是非常难的。系统管理员给人的刻板印象就是性情乖戾的,但是我感觉现在这只不过是个过时的笑话。现在大多数的系统管理员积极的回应所有形式的结构性的反馈,尤其是欢迎新手。我们总是能敏锐的察觉到多样的入门级别的问题,并且着急去解决它们。我们是一个深度的,有着多种兴趣的社区。问一下一个系统管理在工作之余都干了些什么,肯定不会无聊。 - - -### 因此,我要从哪儿开始? - - - - -如果你被说服了,首先有个好消息。与与许多主流职业相比,从没有直接的相关的 4 年制学位转为系统管理员是可能的。事实上,全世界的系统管理四年制度相对较少,这有助于预期。对于现在的白领工作,学位确实有用,而且越相关越好。与其他的主流职业相比,这儿有一个自然的入门级别的职位,帮助台。 - - - -系统管理员所希望的坏消息是真的,对于主流或者非主流领域:雇主在寻找有多年经验的和有高学历的人,甚至是入门级别的位置。雇主是刻薄的。雇主不会花钱给你培训。值得欣慰的是,这些问题是非常普遍的,而且是你将会面对的。 - - -系统管理可以作为其他 IT 领域的起点。比如:网络管理,数据库管理,网站可靠性工程师,再偏一些的有,软件工程师,质量保证,IT 管理。 - -系统管理的细节,刻板印象和一些明显的方面,还要考虑一些不明显的方面,是未来 Opensource.com 文章的话题。我们也会涵盖这个领域可能会改变的重要方面,提供一些方法评估和比较系统管理的职位,在面试期间问一些有力的问题。 - -如果你对加入这个领域有兴趣,考虑加入[专业系统管理者联盟][4](LOPSA),我在这个组织任董事会成员。会员资格是负担得起的(可能由您的雇主负责),学生免费。作为 LOPSA 会员,是满足系统管理员和讨论与各种经验以及各种行业和工作环境中的人员的职业生涯的绝佳方式。 - -------------------------------------------------------------------------------- 作者简介: -保罗-英语 - 保罗是 PreOS 安全公司的首席执行官。保罗是专业系统管理员联盟的董事会成员,该专业系统管理员联盟是一个非营利性专业协会,从 2015 年到 2017 年,他提升了系统管理实践。保罗在 1998 年获得了伍斯特理工学院的计算机学士学位。自 1996 年以来,Paul一直是 UNIX 和 Linux 系统管理员和许多其他 IT 帽子的佩戴者。 +Paul English - 他是 PreOS 安全公司的首席执行官,也是专业系统管理员联盟的董事会成员,该专业系统管理员联盟是一个非营利性专业协会,从 2015 年至今致力于提升系统管理工作实践。 Paul 在 1998 年获得了伍斯特理工学院的计算机学士学位。自 1996 年以来,Paul 一直是 UNIX 和 Linux 系统管理员和许多场合冠以 IT 之名的那个人。最近他在管理一些系统管理员。 ------------------- via: https://opensource.com/article/17/7/why-become-sysadmin -作者:[ Paul English ][a] +作者:[Paul English][a] 译者:[sugarfillet](https://github.com/sugarfillet) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From cbecaa674ec32af388b942298f062d5f754cd20b Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 2 Aug 2017 10:19:51 +0800 Subject: [PATCH 0875/1407] PUB:20170717 Why you should be a sysadmin.md @sugarfillet https://linux.cn/article-8745-1.html --- .../tech => published}/20170717 Why you should be a sysadmin.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170717 Why you should be a sysadmin.md (100%) diff --git a/translated/tech/20170717 Why you should be a sysadmin.md b/published/20170717 Why you should be a sysadmin.md similarity index 100% rename from translated/tech/20170717 Why you should be a sysadmin.md rename to published/20170717 Why you should be a sysadmin.md From 5016dd80da3db8a159e1f7a3be88dd917718776d Mon Sep 17 00:00:00 2001 From: Locez Date: Wed, 2 Aug 2017 13:27:20 +0800 Subject: [PATCH 0876/1407] trandlated Container Docker Compose on Ubuntu 16.04.md --- ...ontainer Docker Compose on Ubuntu 16.04.md | 164 ++++++++++++++++++ 1 file changed, 164 insertions(+) create mode 100644 translated/tech/20170628 Container Docker Compose on Ubuntu 16.04.md diff --git a/translated/tech/20170628 Container Docker Compose on Ubuntu 16.04.md b/translated/tech/20170628 Container Docker Compose on Ubuntu 16.04.md new file mode 100644 index 0000000000..69c8c5f3c9 --- /dev/null +++ b/translated/tech/20170628 Container Docker Compose on Ubuntu 16.04.md @@ -0,0 +1,164 @@ +容器:在 Ubuntu 16.04 中使用 Docker Compose +============================================================ + + [![docker compose logo](https://www.unixmen.com/wp-content/uploads/2017/06/docker-compose-logo-696x1226.png "docker-compose-logo")][3] + +### 什么是 Docker Compose +[Docker Compose][4] 是一个运行多容器 Docker 应用的工具。Compose 通过一个配置文件来配置一个应用的服务,然后通过一个命令创建并启动所有在配置文件中指定的服务。 +Docker Compose 适用于许多不同的项目,如: + +* **开发**:利用 Compose 命令行工具,我们可以创建一个隔离(可交互)的环境来承载正在开发中的应用程序。 + 通过使用 [Compose 文件][2],开发者可以记录和配置所有应用程序的服务依赖关系。 +* **自动测试**:此用例需求一个测试运行环境。Compose 提供了一种方便的方式来管理测试套件的隔离测试环境。完整的环境在 Compose 文件中定义。 + +Docker Compose 是由[图][5]中的源码构建的,这个社区项目现在已经没有使用了。 + +在本教程中,我们将看到如何在 Ubuntn 16.04 上安装 Docker Compose。 + +### 安装 Docker +我们需要安装 Docker 来安装 Docker Compose。首先为官方 Docker 仓库添加公钥。 + +``` +$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add- +``` + +接下来,添加 Docker 仓库到 `apt` 源列表: + + +``` +$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" +``` + +更新包数据库,并使用 `apt` 安装 Docker + + +``` +$ sudo apt-get update +$ sudo apt install docker-ce +``` + +在安装进程结束后,Docker 守护程序应该已经启动并设为开机自启。我们可以通过下面的命令来查看它的状态: + + +``` +$ sudo systemctl status docker +--------------------------------- + +● docker.service - Docker Application Container Engine + Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) + Active: active (running) +``` + +### 安装 Docker Compose +现在可以安装 Docker Compose 了。通过执行以下命令下载当前版本。 + +``` +# curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose +``` + +为二进制文件添加执行权限: + +``` +# chmod +x /usr/local/bin/docker-compose +``` + +检查 Docker Compose 版本: + +``` +$ docker-compose -v +``` + +输出应该如下: + +``` +docker-compose version 1.14.0, build c7bdf9e +``` + +### 测试 Docker Compose +Docker Hub 包含了一个用于演示的 Hello World 镜像,可以用来说明使用 Docker Compose 来运行一个容器所需的配置。 +创建并打开一个目录: + +``` +$ mkdir hello-world +$ cd hello-world +``` + +创建一个新的 YAML 文件: + +``` +$ $EDITOR docker-compose.yml +``` + +在文件中粘贴如下内容: + +``` +unixmen-compose-test: + image: hello-world +``` + + _**注意:** 第一行是容器名称的一部分。_ + +保存并退出。 + +#### 运行容器 +接下来,在 `hello-world` 目录执行以下命令: + +``` +$ sudo docker-compose up +``` + +如果一切正常,Compose 输出应该如下: + +``` +Pulling unixmen-compose-test (hello-world:latest)... +latest: Pulling from library/hello-world +b04784fba78d: Pull complete +Digest: sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f +Status: Downloaded newer image for hello-world:latest +Creating helloworld_unixmen-compose-test_1 ... +Creating helloworld_unixmen-compose-test_1 ... done +Attaching to helloworld_unixmen-compose-test_1 +unixmen-compose-test_1 | +unixmen-compose-test_1 | Hello from Docker! +unixmen-compose-test_1 | This message shows that your installation appears to be working correctly. +unixmen-compose-test_1 | +unixmen-compose-test_1 | To generate this message, Docker took the following steps: +unixmen-compose-test_1 | 1\. The Docker client contacted the Docker daemon. +unixmen-compose-test_1 | 2\. The Docker daemon pulled the "hello-world" image from the Docker Hub. +unixmen-compose-test_1 | 3\. The Docker daemon created a new container from that image which runs the +unixmen-compose-test_1 | executable that produces the output you are currently reading. +unixmen-compose-test_1 | 4\. The Docker daemon streamed that output to the Docker client, which sent it +unixmen-compose-test_1 | to your terminal. +unixmen-compose-test_1 | +unixmen-compose-test_1 | To try something more ambitious, you can run an Ubuntu container with: +unixmen-compose-test_1 | $ docker run -it ubuntu bash +unixmen-compose-test_1 | +unixmen-compose-test_1 | Share images, automate workflows, and more with a free Docker ID: +unixmen-compose-test_1 | https://cloud.docker.com/ +unixmen-compose-test_1 | +unixmen-compose-test_1 | For more examples and ideas, visit: +unixmen-compose-test_1 | https://docs.docker.com/engine/userguide/ +unixmen-compose-test_1 | +helloworld_unixmen-compose-test_1 exited with code 0 +``` + +Docker 容器只能在命令(译者注:此处应为容器中的命令)还处于活动状态时运行,因此当测试完成运行时,容器将停止运行。 + +### 结论 +本文是关于在 Ubuntu 16.04 中安装 Docker Compose 的教程。我们还看到了如何通过一个 YAML 格式的 Compose 文件构建一个简单的项目。 +-------------------------------------------------------------------------------- + +via: https://www.unixmen.com/container-docker-compose-ubuntu-16-04/ + +作者:[ Giuseppe Molica][a] +译者:[Locez](https://github.com/locez) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.unixmen.com/author/tutan/ +[1]:https://www.unixmen.com/author/tutan/ +[2]:https://docs.docker.com/compose/compose-file/ +[3]:https://www.unixmen.com/wp-content/uploads/2017/06/docker-compose-logo.png +[4]:https://docs.docker.com/compose/overview/ +[5]:http://www.fig.sh/ From d8631a2947ddd3c315a1a4fcac0f6a40b63a7418 Mon Sep 17 00:00:00 2001 From: Locez Date: Wed, 2 Aug 2017 13:31:40 +0800 Subject: [PATCH 0877/1407] delete source/tech/Container Docker Compose on Ubuntu 16.04.md --- ...ontainer Docker Compose on Ubuntu 16.04.md | 172 ------------------ 1 file changed, 172 deletions(-) delete mode 100644 sources/tech/20170628 Container Docker Compose on Ubuntu 16.04.md diff --git a/sources/tech/20170628 Container Docker Compose on Ubuntu 16.04.md b/sources/tech/20170628 Container Docker Compose on Ubuntu 16.04.md deleted file mode 100644 index 5333f8bfc0..0000000000 --- a/sources/tech/20170628 Container Docker Compose on Ubuntu 16.04.md +++ /dev/null @@ -1,172 +0,0 @@ -translating by locez -Container: Docker Compose on Ubuntu 16.04 -============================================================ - - [![docker compose logo](https://www.unixmen.com/wp-content/uploads/2017/06/docker-compose-logo-696x1226.png "docker-compose-logo")][3] - -### What is Docker Compose - -[Docker Compose][4] is a tool for running multi-container Docker applications. To configure an application’s services with Compose we use a configuration file, and then, executing a single command, it is possible to create and start all the services specified in the configuration. - -Docker Compose is useful for many different projects like: - -* **Development**: with the Compose command line tools we create (and interact with) an isolated environment which will host the application being developed. - By using the [Compose file][2], developers document and configure all of the application’s service dependencies. - -* **Automated testing**: this use case requires an environment for running tests in. Compose provides a convenient way to manage isolated testing environments for a test suite. The full environment is defined in the Compose file. - -Docker Compose was made on the [Fig][5] source code, a community project now unused. - -In this tutorial we will see how to install Docker Compose on an Ubuntu 16.04 machine. - -### Install Docker - -We need Docker in order to install Docker Compose. First, add the public key for the official Docker repository: - -``` -$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add- -``` - -Next, add the Docker repository to `apt` sources list: - -``` -$ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" -``` - -Update the packages database and install Docker with `apt`: - -``` -$ sudo apt-get update -$ sudo apt install docker-ce -``` - -At the end of the installation process, the Docker daemon should be started and enabled to load at boot time. We can check its status with the following command: - -``` -$ sudo systemctl status docker ---------------------------------- - -● docker.service - Docker Application Container Engine - Loaded: loaded (/lib/systemd/system/docker.service; enabled; vendor preset: enabled) - Active: active (running) -``` - -### Install Docker Compose - -At this point it is possible to install Docker Compose. Download the current release by executing the following command: - -``` -# curl -L https://github.com/docker/compose/releases/download/1.14.0/docker-compose-`uname -s`-`uname -m` > /usr/local/bin/docker-compose -``` - -Make the downloaded binary executable: - -``` -# chmod +x /usr/local/bin/docker-compose -``` - -Check the Docker Compose version: - -``` -$ docker-compose -v -``` - -The output should be something like this: - -``` -docker-compose version 1.14.0, build c7bdf9e -``` - -### Testing Docker Compose - -The Docker Hub includes a Hello World image for demonstration purposes, illustrating the configuration required to run a container with Docker Compose. - -Create a new directory and move into it: - -``` -$ mkdir hello-world -$ cd hello-world -``` - -Create a new YAML file: - -``` -$ $EDITOR docker-compose.yml -``` - -In this file paste the following content: - -``` -unixmen-compose-test: - image: hello-world -``` - - _**Note:** the first line is used as part of the container name._ - -Save and exit. - -#### Run the container - -Next, execute the following command in the `hello-world` directory: - -``` -$ sudo docker-compose up -``` - -If everything is correct, this should be the output shown by Compose: - -``` -Pulling unixmen-compose-test (hello-world:latest)... -latest: Pulling from library/hello-world -b04784fba78d: Pull complete -Digest: sha256:f3b3b28a45160805bb16542c9531888519430e9e6d6ffc09d72261b0d26ff74f -Status: Downloaded newer image for hello-world:latest -Creating helloworld_unixmen-compose-test_1 ... -Creating helloworld_unixmen-compose-test_1 ... done -Attaching to helloworld_unixmen-compose-test_1 -unixmen-compose-test_1 | -unixmen-compose-test_1 | Hello from Docker! -unixmen-compose-test_1 | This message shows that your installation appears to be working correctly. -unixmen-compose-test_1 | -unixmen-compose-test_1 | To generate this message, Docker took the following steps: -unixmen-compose-test_1 | 1\. The Docker client contacted the Docker daemon. -unixmen-compose-test_1 | 2\. The Docker daemon pulled the "hello-world" image from the Docker Hub. -unixmen-compose-test_1 | 3\. The Docker daemon created a new container from that image which runs the -unixmen-compose-test_1 | executable that produces the output you are currently reading. -unixmen-compose-test_1 | 4\. The Docker daemon streamed that output to the Docker client, which sent it -unixmen-compose-test_1 | to your terminal. -unixmen-compose-test_1 | -unixmen-compose-test_1 | To try something more ambitious, you can run an Ubuntu container with: -unixmen-compose-test_1 | $ docker run -it ubuntu bash -unixmen-compose-test_1 | -unixmen-compose-test_1 | Share images, automate workflows, and more with a free Docker ID: -unixmen-compose-test_1 | https://cloud.docker.com/ -unixmen-compose-test_1 | -unixmen-compose-test_1 | For more examples and ideas, visit: -unixmen-compose-test_1 | https://docs.docker.com/engine/userguide/ -unixmen-compose-test_1 | -helloworld_unixmen-compose-test_1 exited with code 0 -``` - -Docker containers only run as long as the command is active, so the container will stop when the test finishes running. - -### Conclusion - -This concludes the tutorial about the installation of Docker Compose on an Ubuntu 16.04 machine. We have also seen how to create a simple project through the Compose file in YAML format. - --------------------------------------------------------------------------------- - -via: https://www.unixmen.com/container-docker-compose-ubuntu-16-04/ - -作者:[ Giuseppe Molica][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.unixmen.com/author/tutan/ -[1]:https://www.unixmen.com/author/tutan/ -[2]:https://docs.docker.com/compose/compose-file/ -[3]:https://www.unixmen.com/wp-content/uploads/2017/06/docker-compose-logo.png -[4]:https://docs.docker.com/compose/overview/ -[5]:http://www.fig.sh/ From bd0e6f2816106671a027a076a63d968c7a637c63 Mon Sep 17 00:00:00 2001 From: lhr Date: Wed, 2 Aug 2017 13:48:54 +0800 Subject: [PATCH 0878/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=AE=8C=E6=88=90?= =?UTF-8?q?=EF=BC=8C=E6=8F=90=E4=BA=A4=E5=88=9D=E7=89=88?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ersial Open Container Industry Standard.md | 175 +++++------------- 1 file changed, 48 insertions(+), 127 deletions(-) diff --git a/sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md b/sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md index 6be5b2ca3d..3c067bd769 100644 --- a/sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md +++ b/sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md @@ -1,107 +1,102 @@ -CoreOS, OCI Unveil Controversial Open Container Industry Standard +CoreOs , OCI(Open Container Initiative) 标准揭开了容器工业标准论战 ============================================================ ![coreos-oci-open-container-industry-standard](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2017-core-os-1.jpg) - -[**Managing Your Intellectual Property Integrity During M&A Transactions**][12] -[][13]Flexera Software presents best practices and methodology for the technical due diligence auditing process. +[**在并购交易中保护知识产权完整性**][12][][13]。Flexera 软件公司 提供卓越的技术尽职调查审计过程的实践和方案 **[Download the White Paper][3]** -[CoreOS][4] and the [Open Container Initiative][5] on Wednesday introduced image and runtime specifications largely based on Docker's image format technology. +[CoreOS][4] 和 [OCI标准][5] 本周三发布的镜像和运行时标准主要参照了Docker的镜像格式技术 -However, OCI's decision to model the standard on Docker's de facto platform has raised questions. Some critics have argued for other options. +然而,OCI对docker的de facto 平台标准的模仿的决定引发了一些问题。一些批评者提出其他方案 -Version 1.0 provides a stable standard for application containers, according to Brandon Philips, CTO at CoreOS and chair of the OCI Technical Oversight Board. +CoreOs的CTO及OCI技术管理委员会主席Brandon Philips说 1.0版本 为应用容器提供了一个稳定标准 -Having a standard created by industry leaders should spur OCI partners to develop further standards and innovation, he said. +他说,产业领导者所创造的标准激发了OCI标准参与者创造出更深层的标准和创新。 -Reaching the 1.0 mark means that the OCI Runtime Spec and the OCI Image Format Spec now are ready for broad use. Further, this achievement will push the OCI community to help stabilize a growing market of interoperable pluggable tools, Philips added. -The industry-supported standards also will provide a sense of confidence that containers are here to stay, he said, and that Kubernetes users can expect future support. +Philips补充道,OCI完成1.0版本意味着 OCI运行时规范和OCI镜像格式标准现在已经可以广泛使用。 +此外,现在取得的成就将推动OCI社区稳固一个成长中的互操作可插拔工具集市场 -"The outcome is really good. The certification process is under way now," Philips told LinuxInsider. +产业支持的标准将提供一种信心:容器将被留存并且Kubernetes(Kubernetes是Google开源的Docker容器集群管理系统)用户将获得更进一步的支持 -### Collaboration Challenges +Philips告诉LinuxInsider:结果是相当不错的,证明过程已经开始. -Open standards are key to the success of the container ecosystem, said Philips, and the best way to achieve standards is by working closely with the community. However, reaching agreement on version 1.0 was more time consuming than expected. +### 合作和挑战 -"Early on, the biggest challenge was coming to terms with the model of how the project releases would work and how to get the project off the ground," Philips recalled. "Everyone underestimated how much time that would take." +开放标准是容器生态系统取得成功的关键 Philips说,最好的实现标准的方式是与社区协作。然而,在1.0版本上达成共识所花费的时间超出了预期。 -Coalition members dealt with mismatched expectations about what they wanted to do, he said, but in the last year or so, the group got the referencing expectations done and more testing came through. +"早期,最大的挑战在于处理项目的发布模式及如何实施该项目",他追述道,”每个人都低估了项目所要花费的时间。“ -### Quest for Standards +他说,合作者面对着和他们想做的不一致的预期,但是在过去的一年前后,小组达到了他们的期望并且经历了更多的实验 -CoreOS officials began discussing the idea for an industry-approved open standard for the container image and runtime specifications several years ago. That early quest led to the realization that agreeing on a standard image format was critical, Phillips said. +### 追逐标准 -CoreOS and container technology creator [Docker][6] announced OCI's formation in June 2015\. The coalition started with 21 industry leaders forming the Open Container Project (OCP) as a non-profit organization seeking minimal common standards for software containers for cloud storage. +CoreOS 官方在几年前就开始讨论这个想法:行业支持的开源容器镜像和运行时规范标准,Phillips说,早期的探索使我们认识到:在标准镜像格式上达成一致是决定性的。 -The coalition includes leaders in the container industry -- among them, Docker, Microsoft, Red Hat, IBM, Google and The Linux Foundation. +CoreOS和容器技术创造者[Docker][6] 在2015年6月宣布OCI的开始。合作起始于 21个行业领导者制定开源容器计划(OCP)。它作为一个非营利组织,旨在建立云存储软件容器的最低通用标准 -OCI's goal is to give high confidence to application developers that the software deployed in their containers will continue to work when newer specifications come out and people develop new tools. That confidence must be met for both proprietary and open source software. +联盟包括容器业界的领导者:Docker、微软、红帽、IBM、谷歌和linux基金会 -It does not matter if the tools and applications are proprietary or open source. With the specifications in place, the products can be designed to work with any container configuration, Philips said. +OCI标准的目的是让应用开发者相信:新的规范并开发新出工具时,部署在容器上的软件仍然能够持续运转。这种信心必须同时满足所有私有和开源软件 -"You need a conscious effort to create standards outside of people writing code. It is a separate effort," he added. +工具和应用是私有还是开源的并没有什么关系。当规范开始应用,产品会被设计成与任何容器配置相适应,Philips说。 -As part of the coalition, Docker donated its de facto image format standard technology to the OCP. +你需要有意识地超越编写代码的人能力之外创建标准。它是一个额外的功夫。他补充道 -It included the company's container format, runtime code and specifications. Work on creating an Open Container Initiative Image Specification began last year. +作为联盟的一部分,Docker向OCP(开源容器计划)贡献出它的de facto 镜像格式标准技术。 -The standards milestone gives container users the capability to develop, package and sign application containers. They also can run the containers in a variety of container engines, noted Philips. +它包括公司的容器格式、运行时代码和规范。建立开源容器首创镜像标准的工作起始于去年。 -### A Choice of One? +标准的里程碑给予容器使用者开发、打包、签名应用容器的能力。他们也能够在各种容器引擎上运行容器,Philips强调 -The coalition faced two ways to pursue open standards, observed Charles King, principal analyst at [Pund-IT][7]. The first option was to gather like-minded people to hash out differences and build standards from scratch. +### 唯一的选择? -The coalition members seemed to settle for the second option, which involved adopting a powerful, market leading platform as an effective standard, he said. +[Pund-IT][7]的首席分析师Charles King表示:联盟面临着两种实现标准的方式。第一种选择是汇集相同意向的人员来避免分歧从零开始建立标准。 -"Docker's contributions to The [Linux Foundation][8] put the OCI firmly on the second path -- but those who are concerned about Docker's approach or its market position may feel there are better options," King told LinuxInsider. +但是联盟成员似乎满足于第二种方案:采用一种强大的以市场为导向的平台作为一个有效的标准。 -In fact, one OCI member -- CoreOS -- leveled some strong criticism of the group's general direction at the beginning of the effort, he said, "so it will be interesting to see how V1.0 does/doesn't address those concerns." +Docker对[Linux Foundation][8](linux基金会)的贡献使OCI坚定的选择了第二种方案。但是那些关注于Docker的实现途径或者它的市场地位的人也许感觉应该有更好的选择。King对LinuxInsider讲述 -### Faster Path +事实上,一个OCI成员--CoreOs --在开始的时候对该组织的总体方向进行了一些强烈的批评。拭目以待V1.0版本是否处理了那些关注点将是很有趣的事情 -Docker's widely deployed runtime implementation is a suitable foundation for building an open standard. It already was a defacto standard, according to David Linthicum, senior vice president at [Cloud Technology Partners][9]. -"It's also important that we get this working for us quickly. The waves of standards meetings, dealing with politics and things such as that, just waste time," he told LinuxInsider. +### 更快的路径 -Right now, though, there are no better options, Linthicum added. +Docker已经被广泛的部署运行时实现是建立开放标准的合适基础。据[Cloud Technology Partners][9] 的高级副总裁David Linthicum所说,Docker已经是一个de facto 标准 -The runtime Docker uses is runC, which is an implementation of the OCI runtime standard, according to Joe Brockmeier, senior evangelist for Linux Containers at Red Hat. +“我们能很快就能实现这些想法也是很重要的。但是前后的标准会议、处理政治因素等事情只是浪费时间” 。他对LinuxInsider采访者说 -"So, runC is a suitable foundation for a runtime standard, yes. It is broadly accepted and forms the basis for most container implementations today," he told LinuxInsider. +但是现在没有更好的选择,他告诉LinuxInsider采访者 -OCI is far more than Docker. While Docker did commit the underlying code from which the OCI specification is derived, the lineage stops there, said Brockmeier, and no truly viable alternatives exist. +据RedHat公司的linux容器技术高级布道者Joe Brockmeier所说,Docker的运行时是 runC 。 它是OCI运行时标准的一种实现。 -### Docking the Question +因此,runC 是一个合适的运行时标准的基础。它被广泛的接受并成为了大多数容器技术实现的基础。他告诉LinuxInsider -Adopting an industry-wide standard likely will simplify and speed container adoption and management for many companies, suggested Pund-IT's King. It also is likely that some key vendors will continue to focus on their own proprietary container technologies. +OCI是比Docker更进一步的标准。尽管Docker确实提交了遵循OCI规范的底层代码,然而这一谱系就此停止,并且没真正的可行替代方案存在。 -"They'll argue that theirs is a superior path -- but that will effectively prevent the OCI from achieving market-wide leadership," he said. "Starting out with a standard that's more or less complete, as OCI has, may not perfectly please everyone, but it's likely to move forward to completion more quickly and effectively than other options." +### 对接问题 -Containers have standardized deployment to cloud, with Docker clearly leading the way, said Marko Anastasov, cofounder of [Semaphore][10]. +Pund-IT的领导建议:采用一种广泛使用的产业标准将简化和加速许多公司对容器技术的采纳和管理。也有可能一些关键的供应商将继续关注他们自己的专有容器技术 -Docker's de facto standard container does represent the best foundation for developing an open standard, he said. +他们辩称他们的做法是一个更好的方式但这将有效的阻止OCI取得市场的主导地位。从一个大体上实现的标准开始,就像OCI所做的那样,也许并不能完美的使所有人满意。但是这也许能比其他方案更加快速有效的实现目标 -"How Docker's commercial interests will influence the scale of its involvement in OCI remains to be seen," he told LinuxInsider. +容器已经标准化的部署到了云上,Docker显然是领先的。[Semaphore][10]联合创始人Marko Anastasov说。Docker的de facto标准容器代表了开发开放标准的的最佳基础。Docker的商业利益将如何影响其参与OCI的规模还有待观察 -### Opposing Viewpoint +### 反对的观点 -An open standard is not the end-all for adopting more containers in cloud deployment, contended Nic Cheneweth, principal consultant with[ThoughtWorks][11]. A better approach is to look at the impact of the server virtualization segment of the IT industry. +开放标准并不是在云部署中采用更多的容器的最终目标。[ThoughtWorks][11]的首席顾问Nic Cheneweth 主张。更好的的方法是查看IT行业的服务器虚拟化部分的影响 -"The principal driver for continued growth and widespread adoption was not in the statement of an industry standard but in the potential and realized efficiencies obtained by use of any of the competing technologies, such as VMware, Xen, etc.," Cheneweth told LinuxInsider. +Cheneweth对LinuxInsider说:“持续增长和广泛采用的主要动力不是在行业标准的声明中,而是在使用任何竞争技术的潜在和实现的效率方面,比如VMware、Xen等。” -Aspects of container technology, such as the container itself, lend themselves to definition of a standard. Until then, healthy competition guided by deep open source software involvement will contribute to be a better standard, he said. +容器技术的某些方面,例如容器本身,可以根据标准来定义。他说,在此之前,由深度开源软件参与引导的健康竞争将有助于成为一个更好的标准。 -A standard around the orchestration of containers is not particularly important to the continued growth of the space, according to Cheneweth. +据Cheneweth说,关于容器的编制标准对空间的持续增长并不特别重要。 -However, if the industry insists on locking into a de facto container standard, the model OCI chose is a good starting point, he said. "I don't know that better options are available, but certainly worse ones exist." - --------------------------------------------------------------------------------- +不过,他表示,如果行业坚持锁定de facto容器标准,那么OCI所选择的模型是一个很好的起点。“我不知道是否有更好的选择,但更糟糕的选择是存在的。” 作者简介: -Jack M. Germain has been an ECT News Network reporter since 2003. His main areas of focus are enterprise IT, Linux and open source technologies. He has written numerous reviews of Linux distros and other open source software. Email Jack. +自2003年以来,Jack M.Germain一直是一个新闻网络记者。他主要关注的领域是企业IT、Linux和开源技术。他已经写了很多关于Linux发行版和其他开源软件的评论。 ---- @@ -109,7 +104,7 @@ Jack M. Germain has been an ECT News Network reporter since 2003. His main areas via: http://www.linuxinsider.com/story/84689.html 作者:[Jack M. Germain ][a] -译者:[译者ID](https://github.com/译者ID) +译者:[LHRchina](https://github.com/LHRchina) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 @@ -130,80 +125,6 @@ via: http://www.linuxinsider.com/story/84689.html [13]:http://www.linuxinsider.com/story/84689.html?rss=1 -CoreOs , OCI(Open Container Initiative) 标准解开容器工业标准论战 -[**在并购交易中保护你的智力资产完整**][12][][13]。Flexera 软件公司 提供卓越的技术尽职调查审计过程的实践和方案 -[CoreOS][4] 和 [OCI标准][5] 本周三引入的镜像和运行时标准最大限度的参照了Docker的镜像规范技术 -然而,OCI模仿docker的de facto 平台的决定引发了一些问题。一些批评者提出来用另外的解决方案 -CoreOs的CTO及OCI技术管理委员会主席Brandon Philips说 1.0版本 提供了应用容器的稳定标准,产业领导者所创造的标准激发了OCI标准参与者创造出更深层的标准和创新。 -他说,OCI完成1.0版本意味着 OCI运行时规范和OCI镜像格式标准现在已经可以广泛使用。 -进一步说明,现在取得的成就将推动OCI社区稳固一个成长中的互操作插接式工具集市场 -产业支持的标准将提供一种信心:容器将被留存并且Kubernetes(Kubernetes是Google开源的Docker容器集群管理系统)用户将获得更进一步的支持 -Philips告诉LinuxInsider:结果是相当不错的,证明过程已经开始. -### 合作和挑战 -开放标准是容器生态系统取得成功的关键 最好的实现标准的方式是与社区协作。然而,在1.0版本上达成共识所花费的时间超越了我们的的想象。 -"早期,最大的挑战在于接受项目的发布模式及如何实施该项目",他追述道,”每个人都低估了项目所要花费的时间。“ - -合作者面对着和他们想做的不一致的预期,他说,但是在最近的一年前后,小组达到了他们的期望并且经历了更多的实验 - -### 追逐标准 - -CoreOS 官方在几年前就开始讨论这个想法:工业支持的开源容器镜像和运行时规范标准 -早期的探索使我们认识到:标准镜像格式的一致是决定性的。Phillips说 - -CoreOS和容器技术创造者[Docker][6] 在2015年6月宣布OCI的开始。合作起始于 21个工业领导者制定开源容器计划(OCP)作为一个旨在最低限度的云存储通用软件容器标准的非营利组织 - -联合包括容器业界的领导者:Docker、微软、红帽、IBM、谷歌和linux基金会 - -OCI标准的目的是给予应用开发者高度的信心:新的标准或者新的开发工具出现,部署在容器上的软件仍然能够持续运转。这种信心必须同时满足所有私有和开源软件 - -工具和应用是私有还是开源的并没有什么关系。当标准开始应用,产品会被设计成与任何容器配置相融合,Philips说。 - -你需要刻意的超出人们写代码的功夫地努力去创造一个标准。它是一个额外的功夫。他补充道 - -作为合作的一部分,Docker向OCP(开源容器计划)贡献出它的de facto 镜像格式标准技术。 - -它包括公司的容器格式、运行时代码和标准。建立开源容器首创镜像标准的工作起始于去年 - -标准的里程碑给予容器使用者开发、打包、签名应用容器的能力。他们也能够在各种容器引擎上运行容器,Philips强调 - -### 唯一的选择? - -[Pund-IT][7]的首席分析师Charles King注意到:合作面临着两种实现标准的方式。第一种选择是汇集相同意向的人员来避免分歧从零开始建立标准,但是合作者似乎不得不接受第二种方案:采用一种强大的以市场为导向的平台作为一个有效的标准。 - -Docker对[Linux Foundation][8](linux基金会)的贡献使OCI坚定的选择了第二种方案。但是那些关注于Docker的实现途径或者它的市场地位的人也许感觉应该有更好的选择。King对LinuxInsider讲述 - -事实上,一个OCI成员--CoreOs --在开始的时候对该组织的总体方向进行了一些强烈的批评。拭目以待V1.0版本是否处理了那些关注点将是很有趣的事情 - - -### 更快的路径 - -Docker已经被广泛的部署运行时实现是一个合适的基础。据[Cloud Technology Partners][9] 的高级副总裁David Linthicum所说,Docker已经是一个de facto 标准 - -“我们很快就能实现这些很重要。但是前后的标准会议、处理政治因素等事情却是如此的浪费时间” 。他对LinuxInsider采访者说 - -但是现在没有跟好的选择,他告诉LinuxInsider采访者 - -据RedHat公司的高级linux容器技术布道者Joe Brockmeier所说,Docker的运行时是 runC 。 它是一种OCI标准标准的实现 - -因此,runC 是一个合适的运行时标准的基础。它被广泛的接受并成为了大多数容器技术实现的基础 - -OCI是比Docker更进一步的标准。尽管Docker确实提交了OCI规范的基础的底层代码,然而这一谱系就此停止,并没真正的可行替代方案存在。 - -### 对接问题 - -Pund-IT的领导建议:采用一种广泛使用的产业标准将简化和加速许多公司对容器技术的采纳和管理。也有可能一些关键的供应商将继续关注他们自己的专有容器技术 - -Docker的商业利益将如何影响其参与OCI的规模还有待观察 - -### 反对的观点 - -开放标准并不是在云部署中采用更多的容器的最终目标。[ThoughtWorks][11]的首席顾问Nic Cheneweth 主张。更好的的方法是查看IT行业的服务器虚拟化部分的影响 - - - - - - From 1f0db1c69285711642c060780d254ef78ff9ca2a Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 2 Aug 2017 14:08:31 +0800 Subject: [PATCH 0879/1407] PRF&PUB:20170628 Container Docker Compose on Ubuntu 16.04.md @locez --- ...ontainer Docker Compose on Ubuntu 16.04.md | 33 +++++++++++-------- 1 file changed, 19 insertions(+), 14 deletions(-) rename {translated/tech => published}/20170628 Container Docker Compose on Ubuntu 16.04.md (87%) diff --git a/translated/tech/20170628 Container Docker Compose on Ubuntu 16.04.md b/published/20170628 Container Docker Compose on Ubuntu 16.04.md similarity index 87% rename from translated/tech/20170628 Container Docker Compose on Ubuntu 16.04.md rename to published/20170628 Container Docker Compose on Ubuntu 16.04.md index 69c8c5f3c9..de32b3c78b 100644 --- a/translated/tech/20170628 Container Docker Compose on Ubuntu 16.04.md +++ b/published/20170628 Container Docker Compose on Ubuntu 16.04.md @@ -1,44 +1,43 @@ -容器:在 Ubuntu 16.04 中使用 Docker Compose +在 Ubuntu 16.04 中使用 Docker Compose ============================================================ [![docker compose logo](https://www.unixmen.com/wp-content/uploads/2017/06/docker-compose-logo-696x1226.png "docker-compose-logo")][3] ### 什么是 Docker Compose + [Docker Compose][4] 是一个运行多容器 Docker 应用的工具。Compose 通过一个配置文件来配置一个应用的服务,然后通过一个命令创建并启动所有在配置文件中指定的服务。 + Docker Compose 适用于许多不同的项目,如: -* **开发**:利用 Compose 命令行工具,我们可以创建一个隔离(可交互)的环境来承载正在开发中的应用程序。 - 通过使用 [Compose 文件][2],开发者可以记录和配置所有应用程序的服务依赖关系。 +* **开发**:利用 Compose 命令行工具,我们可以创建一个隔离(而可交互)的环境来承载正在开发中的应用程序。通过使用 [Compose 文件][2],开发者可以记录和配置所有应用程序的服务依赖关系。 * **自动测试**:此用例需求一个测试运行环境。Compose 提供了一种方便的方式来管理测试套件的隔离测试环境。完整的环境在 Compose 文件中定义。 -Docker Compose 是由[图][5]中的源码构建的,这个社区项目现在已经没有使用了。 +Docker Compose 是在 [Fig][5] 的源码上构建的,这个社区项目现在已经没有使用了。 在本教程中,我们将看到如何在 Ubuntn 16.04 上安装 Docker Compose。 ### 安装 Docker + 我们需要安装 Docker 来安装 Docker Compose。首先为官方 Docker 仓库添加公钥。 ``` -$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add- +$ curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - ``` 接下来,添加 Docker 仓库到 `apt` 源列表: - ``` $ sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" ``` 更新包数据库,并使用 `apt` 安装 Docker - ``` $ sudo apt-get update $ sudo apt install docker-ce ``` -在安装进程结束后,Docker 守护程序应该已经启动并设为开机自启。我们可以通过下面的命令来查看它的状态: - +在安装进程结束后,Docker 守护程序应该已经启动并设为开机自动启动。我们可以通过下面的命令来查看它的状态: ``` $ sudo systemctl status docker @@ -50,6 +49,7 @@ $ sudo systemctl status docker ``` ### 安装 Docker Compose + 现在可以安装 Docker Compose 了。通过执行以下命令下载当前版本。 ``` @@ -75,7 +75,9 @@ docker-compose version 1.14.0, build c7bdf9e ``` ### 测试 Docker Compose + Docker Hub 包含了一个用于演示的 Hello World 镜像,可以用来说明使用 Docker Compose 来运行一个容器所需的配置。 + 创建并打开一个目录: ``` @@ -96,11 +98,12 @@ unixmen-compose-test: image: hello-world ``` - _**注意:** 第一行是容器名称的一部分。_ +_**注意:** 第一行是容器名称的一部分。_ 保存并退出。 -#### 运行容器 +### 运行容器 + 接下来,在 `hello-world` 目录执行以下命令: ``` @@ -142,17 +145,19 @@ unixmen-compose-test_1 | helloworld_unixmen-compose-test_1 exited with code 0 ``` -Docker 容器只能在命令(译者注:此处应为容器中的命令)还处于活动状态时运行,因此当测试完成运行时,容器将停止运行。 +Docker 容器只能在命令(LCTT 译注:此处应为容器中的命令)还处于活动状态时运行,因此当测试完成运行时,容器将停止运行。 ### 结论 + 本文是关于在 Ubuntu 16.04 中安装 Docker Compose 的教程。我们还看到了如何通过一个 YAML 格式的 Compose 文件构建一个简单的项目。 + -------------------------------------------------------------------------------- via: https://www.unixmen.com/container-docker-compose-ubuntu-16-04/ -作者:[ Giuseppe Molica][a] +作者:[Giuseppe Molica][a] 译者:[Locez](https://github.com/locez) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From bd11d854da33eb910967fe1f8fb362ac94cffc3a Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 2 Aug 2017 14:34:25 +0800 Subject: [PATCH 0880/1407] PRF&PUB:20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md @geekpi --- ...ure an NGINX web server on Ubuntu 16.04.md | 49 +++++++++---------- 1 file changed, 22 insertions(+), 27 deletions(-) rename {translated/tech => published}/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md (61%) diff --git a/translated/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md b/published/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md similarity index 61% rename from translated/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md rename to published/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md index 0c089a06dd..15caa3c558 100644 --- a/translated/tech/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md +++ b/published/20170628 Encryption How To Secure an NGINX web server on Ubuntu 16.04.md @@ -1,15 +1,13 @@ -加密:如何保护 Ubuntu 16.04 上的 NGINX Web 服务器 +如何保护 Ubuntu 16.04 上的 NGINX Web 服务器 ============================================================ -由 [Giuseppe Molica][1] 提供 - - [![Let's Encrypt Encryption CA](https://www.unixmen.com/wp-content/uploads/2017/06/le-logo-standard.png "le-logo-standard")][2] +![Let's Encrypt Encryption CA](https://www.unixmen.com/wp-content/uploads/2017/06/le-logo-standard.png "le-logo-standard") ### 什么是 Let’s Encrypt -[Let’s Encrypt][3]是互联网安全研究组织 (ISRG) 提供的免费认证机构。它提供了一种轻松自动的方式来获取免费的 SSL/TLS 证书 - 这是在 Web 服务器上启用加密和 HTTPS 流量的必要步骤。获取和安装证书的大多数步骤可以通过使用名为 [Certbot][4] 的工具进行自动化。 +[Let’s Encrypt][3] 是互联网安全研究组织 (ISRG) 提供的免费证书认证机构。它提供了一种轻松自动的方式来获取免费的 SSL/TLS 证书 - 这是在 Web 服务器上启用加密和 HTTPS 流量的必要步骤。获取和安装证书的大多数步骤可以通过使用名为 [Certbot][4] 的工具进行自动化。 -特别地,该软件可在可以使用 shell 的服务器上使用:换句话说,当可以通过 SSH 连接使用。 +特别地,该软件可在可以使用 shell 的服务器上使用:换句话说,它可以通过 SSH 连接使用。 在本教程中,我们将看到如何使用 `certbot` 获取免费的 SSL 证书,并在 Ubuntu 16.04 服务器上使用 Nginx。 @@ -17,7 +15,7 @@ 第一步是安装 `certbot`,该软件客户端可以几乎自动化所有的过程。 Certbot 开发人员维护自己的 Ubuntu 仓库,其中包含比 Ubuntu 仓库中存在的软件更新的软件。 -添加Certbot 仓库: +添加 Certbot 仓库: ``` # add-apt-repository ppa:certbot/certbot @@ -39,21 +37,21 @@ Certbot 现已安装并可使用。 ### 获得证书 -有各种 Certbot 插件可用于获取 SSL 证书。这些插件有助于获取证书,而其安装和 Web 服务器配置都留给管理员。 +有各种 Certbot 插件可用于获取 SSL 证书。这些插件有助于获取证书,而证书的安装和 Web 服务器配置都留给管理员。 我们使用一个名为 **Webroot** 的插件来获取 SSL 证书。 -在有能力修改正在运行的内容的情况下,建议使用此插件。在证书颁发过程中不需要停止 Web 服务器。 +在有能力修改正在提供的内容的情况下,建议使用此插件。在证书颁发过程中不需要停止 Web 服务器。 #### 配置 NGINX -Webroot 通过为名为 `.well-known` 的目录中的每个域创建一个临时文件,并放置在 Web 根目录下。在我们的例子中,Web 根目录是 `/var/www/html`。确保该目录对 Let’s Encrypt 可访问以用于验证 。为此,请编辑 NGINX 配置。使用文本编辑器打开 `/etc/nginx/sites-available/default`: +Webroot 会在 Web 根目录下的 `.well-known` 目录中为每个域创建一个临时文件。在我们的例子中,Web 根目录是 `/var/www/html`。确保该目录在 Let’s Encrypt 验证时可访问。为此,请编辑 NGINX 配置。使用文本编辑器打开 `/etc/nginx/sites-available/default`: ``` # $EDITOR /etc/nginx/sites-available/default ``` -在该文件中,在服务器块内,输入以下内容: +在该文件中,在 `server` 块内,输入以下内容: ``` location ~ /.well-known { @@ -67,7 +65,7 @@ Webroot 通过为名为 `.well-known` 的目录中的每个域创建一个临时 # nginx -t ``` -没有错误应该会显示: +没有错误的话应该会显示如下: ``` nginx: the configuration file /etc/nginx/nginx.conf syntax is ok @@ -82,29 +80,26 @@ nginx: configuration file /etc/nginx/nginx.conf test is successful #### 使用 Certbot 获取证书 -下一步是使用 Certbot 的 Webroot 插件获取新证书。在本教程中,我们将示例保护域 www.example.com。需要指定应由证书保护的每个域。执行以下命令: +下一步是使用 Certbot 的 Webroot 插件获取新证书。在本教程中,我们将保护示例域 www.example.com。需要指定应由证书保护的每个域。执行以下命令: ``` # certbot certonly --webroot --webroot-path=/var/www/html -d www.example.com ``` -在此过程中,Cerbot 将要求有效的电子邮件地址进行通知。还会要求与 EFF 分享,但这不是必需的。在同意服务条款之后,它将获得一个新的证书。 +在此过程中,Cerbot 将询问有效的电子邮件地址,用于进行通知。还会要求与 EFF 分享,但这不是必需的。在同意服务条款之后,它将获得一个新的证书。 最后,目录 `/etc/letsencrypt/archive` 将包含以下文件: -* chain.pem:加密链证书。 +* `chain.pem`:Let’s Encrypt 加密链证书。 +* `cert.pem`:域名证书。 +* `fullchain.pem`:`cert.pem`和 `chain.pem` 的组合。 +* `privkey.pem`:证书的私钥。 -* cert.pem:域名证书。 - -* fullchain.pem:`cert.pem`和 `chain.pem` 的组合。 - -* privkey.pem:证书私钥。 - -Certbot 还将创建符号链接到 `/etc/letsencrypt/live/**domain_name**/` 中的最新证书文件。这是我们将在服务器配置中使用的路径。 +Certbot 还将创建符号链接到 `/etc/letsencrypt/live/domain_name/` 中的最新证书文件。这是我们将在服务器配置中使用的路径。 ### 在 NGINX 上配置 SSL/TLS -下一步是服务器配置。在 `/etc/nginx/snippets/` 中创建一个新的代码段。 **snippet** 是配置文件的一部分,可以包含在虚拟主机配置文件中。所以,创建一个新的文件: +下一步是服务器配置。在 `/etc/nginx/snippets/` 中创建一个新的代码段。 **snippet** 是指一段配置,可以包含在虚拟主机配置文件中。如下创建一个新的文件: ``` # $EDITOR /etc/nginx/snippets/secure-example.conf @@ -147,7 +142,7 @@ server { ... ``` -这将启用 NGINX 加密。 +这将启用 NGINX 加密功能。 保存、退出并检查 NGINX 配置文件: @@ -166,15 +161,15 @@ nginx: configuration file /etc/nginx/nginx.conf test is successful ### 总结 -按照上述步骤,此时我们已经拥有了一个安全的基于 NGINX 的 Web 服务器,它由 Certbot 和 Let’s Encrypt 加密。这只是一个基本配置,当然你可以使用许多 NGINX 配置参数来个性化所有东西,但这取决于特定的 Web 服务器要求。 +按照上述步骤,此时我们已经拥有了一个安全的基于 NGINX 的 Web 服务器,它由 Certbot 和 Let’s Encrypt 提供加密。这只是一个基本配置,当然你可以使用许多 NGINX 配置参数来个性化所有东西,但这取决于特定的 Web 服务器要求。 -------------------------------------------------------------------------------- via: https://www.unixmen.com/encryption-secure-nginx-web-server-ubuntu-16-04/ -作者:[Giuseppe Molica ][a] +作者:[Giuseppe Molica][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/) 荣誉推出 From 001e79390d200bea0768ef026d676bc07f3ee5c2 Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 2 Aug 2017 14:37:05 +0800 Subject: [PATCH 0881/1407] =?UTF-8?q?=E6=9B=B4=E6=AD=A3?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- published/20170717 Why you should be a sysadmin.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/published/20170717 Why you should be a sysadmin.md b/published/20170717 Why you should be a sysadmin.md index 84e8a28b98..44561bf731 100644 --- a/published/20170717 Why you should be a sysadmin.md +++ b/published/20170717 Why you should be a sysadmin.md @@ -15,7 +15,7 @@ ### 我要成为一名系统管理员吗? -有人要你,但是你要做系统管理工作吗?如果你生活在一个第一世界国家,每季度 70,000 美元的收入看上去是一个可以感到幸福的标准收入,或者说至少减少了大部分的与钱相关的压力。系统和网络管理员的中位季度收入是 80,000 美元,很容易达标,尽管明显有些人赚的更少或更多。 +有人要你,但是你要做系统管理工作吗?如果你生活在一个第一世界国家,每年 70,000 美元的收入看上去是一个可以感到幸福的标准收入,或者说至少减少了大部分的与钱相关的压力。系统和网络管理员的中位年度收入是 80,000 美元,很容易达标,尽管明显有些人赚的更少或更多。 你曾经免费做过一些系统管理工作吗?我们大多数人都多多少少地管理一些设备,但是那并不代表你喜欢管理它。如果你曾经在你家的网络中添加了一些服务器,你就是一个备选的系统管理员。你想要为自己的孩子添加一个“我的世界”的游戏服务器么,所以你用树莓派搭建了一个?也许是时候来考虑通过做这样的工作来获取报酬了。 From 8e2734c14a3f40a2fd7e83cb97ea42a085fc536d Mon Sep 17 00:00:00 2001 From: penghuster Date: Wed, 2 Aug 2017 16:40:03 +0800 Subject: [PATCH 0882/1407] Update 20170724 IoT Framework for Edge Computing Gains Ground.md thx --- .../20170724 IoT Framework for Edge Computing Gains Ground.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170724 IoT Framework for Edge Computing Gains Ground.md b/sources/tech/20170724 IoT Framework for Edge Computing Gains Ground.md index c1f565fd31..1d9ab94eed 100644 --- a/sources/tech/20170724 IoT Framework for Edge Computing Gains Ground.md +++ b/sources/tech/20170724 IoT Framework for Edge Computing Gains Ground.md @@ -1,3 +1,5 @@ +translating by penghuster + IoT Framework for Edge Computing Gains Ground ============================================================ From a8558edc14a3f79e02f0993ac59d45bd74bffa9a Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 2 Aug 2017 20:09:44 +0800 Subject: [PATCH 0883/1407] =?UTF-8?q?20170802-1=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...at You Think You Know is Probably Wrong.md | 142 ++++++++++++++++++ 1 file changed, 142 insertions(+) create mode 100644 sources/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md diff --git a/sources/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md b/sources/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md new file mode 100644 index 0000000000..391fa250e4 --- /dev/null +++ b/sources/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md @@ -0,0 +1,142 @@ +Docker vs. Kubernetes vs. Apache Mesos: Why What You Think You Know is Probably Wrong +============================================================ + + +There are countless articles, discussions, and lots of social chatter comparing Docker, Kubernetes, and Mesos. If you listen to the partially-informed, you’d think that the three open source projects are in a fight-to-the death for container supremacy. You’d also believe that picking one over the other is almost a religious choice; with true believers espousing their faith and burning heretics who would dare to consider an alternative. + +That’s all bunk. + +While all three technologies make it possible to use containers to deploy, manage, and scale applications, in reality they each solve for different things and are rooted in very different contexts. In fact, none of these three widely adopted toolchains is completely like the others. + +Instead of comparing the overlapping features of these fast-evolving technologies, let’s revisit each project’s original mission, architectures, and how they can complement and interact with each other. + +### Let’s start with Docker… + +Docker Inc., today started as a Platform-as-a-Service startup named dotCloud. The dotCloud team found that managing dependencies and binaries across many applications and customers required significant effort. So they combined some of the capabilities of Linux [cgroups][1] and namespaces into a single and easy to use package so that applications can consistently run on any infrastructure. This package is [the Docker image][2], which provides the following capabilities: + +* Packages the application and the libraries in a single package (the Docker Image), so applications can consistently be deployed across many environments; + +* Provides Git-like semantics, such as “docker push”, “docker commit” to make it easy for application developers to quickly adopt the new technology and incorporate it in their existing workflows; + +* Define Docker images as immutable layers, enabling immutable infrastructure. Committed changes are stored as an individual read-only layers, making it easy to re-use images and track changes. Layers also save disk space and network traffic by only transporting the updates instead of entire images; + +* Run Docker containers by instantiating the immutable image with a writable layer that can temporarily store runtime changes, making it easy to deploy and scale multiple instances of the applications quickly. + +Docker grew in popularity, and developers started to move from running containers on their laptops to running them in production. Additional tooling was needed to coordinate these containers across multiple machines, known as container orchestration. Interestingly, one of the first container orchestrators that supported Docker images (June 2014) was [Marathon][3] on Apache Mesos (which we’ll describe in more detail below). That year, Solomon Hykes, founder and CTO of Docker, recommended Mesos as “[the gold standard for production clusters][4]”. Soon after, many container orchestration technologies in addition to Marathon on Mesos emerged: [Nomad][5], [Kubernetes][6] and, not surprisingly, Docker Swarm ([now part of Docker Engine][7]). + +As Docker moved to commercialize the open source file format, the company also started introducing tools to complement the core Docker file format and runtime engine, including: + +* Docker hub for public storage of Docker images; + +* Docker registry for storing it on-premise; + +* Docker cloud, a managed service for building and running containers; + +* Docker datacenter as a commercial offering embodying many Docker technologies. + +![Docker](https://mesosphere.com/wp-content/uploads/2017/07/docker-host.png) + +Source: www.docker.com. + +Docker’s insight to encapsulate software and its dependencies in a single package have been a game changer for the software industry; the same way mp3’s helped to reshape the music industry. The Docker file format became the industry standard, and leading container technology vendors (including Docker, Google, Pivotal, Mesosphere and many others) formed the [Cloud Native Computing Foundation (CNCF)][8] and [Open Container Initiative (OCI)][9]. Today, CNCF and OCI aim to ensure interoperability and standardized interfaces across container technologies and ensure that any Docker container, built using any tools, can run on any runtime or infrastructure. + +### Enter Kubernetes + +Google recognized the potential of the Docker image early on and sought to deliver container orchestration “as-a-service” on the Google Cloud Platform. Google had tremendous experience with containers (they introduced cgroups in Linux) but existing internal container and distributed computing tools like Borg were directly coupled to their infrastructure. So, instead of using any code from their existing systems, Google designed Kubernetes from scratch to orchestrate Docker containers. Kubernetes was released in February 2015 with the following goals and considerations: + +* Empower application developers with a powerful tool for Docker container orchestration without having to interact with the underlying infrastructure; + +* Provide standard deployment interface and primitives for a consistent app deployment experience and APIs across clouds; + +* Build on a Modular API core that allows vendors to integrate systems around the core Kubernetes technology. + +By March 2016, Google [donated Kubernetes][10] to CNCF, and remains today the lead contributor to the project (followed by Redhat, CoreOS and others). + +![Kubernetes](https://mesosphere.com/wp-content/uploads/2017/07/kubernetes-architecture.png) + +Source: wikipedia + +Kubernetes was very attractive for application developers, as it reduced their dependency on infrastructure and operations teams. Vendors also liked Kubernetes because it provided an easy way to embrace the container movement and provide a commercial solution to the operational challenges of running your own Kubernetes deployment (which remains a non-trivial exercise). Kubernetes is also attractive because it is open source under the CNCF, in contrast to Docker Swarm which, though open source, is tightly controlled by Docker, Inc. + +Kubernetes’ core strength is providing application developers powerful tools for orchestrating stateless Docker containers. While there are multiple initiatives to expand the scope of the project to more workloads (like analytics and stateful data services), these initiatives are still in very early phases and it remains to be seen how successful they may be. + +### Apache Mesos + +Apache Mesos started as a UC Berkeley project to create a next-generation cluster manager, and apply the lessons learned from cloud-scale, distributed computing infrastructures such as [Google’s Borg][11] and [Facebook’s Tupperware][12]. While Borg and Tupperware had a monolithic architecture and were closed-source proprietary technologies tied to physical infrastructure, Mesos introduced a modular architecture, an open source development approach, and was designed to be completely independent from the underlying infrastructure. Mesos was quickly adopted by [Twitter][13], [Apple(Siri)][14], [Yelp][15], [Uber][16], [Netflix][17], and many leading technology companies to support everything from microservices, big data and real time analytics, to elastic scaling. + +As a cluster manager, Mesos was architected to solve for a very different set of challenges: + +* Abstract data center resources into a single pool to simplify resource allocation while providing a consistent application and operational experience across private or public clouds; + +* Colocate diverse workloads on the same infrastructure such analytics, stateless microservices, distributed data services and traditional apps to improve utilization and reduce cost and footprint; + +* Automate day-two operations for application-specific tasks such as deployment, self healing, scaling, and upgrades; providing a highly available fault tolerant infrastructure; + +* Provide evergreen extensibility to run new application and technologies without modifying the cluster manager or any of the existing applications built on top of it; + +* Elastically scale the application and the underlying infrastructure from a handful, to tens, to tens of thousands of nodes. + +Mesos has a unique ability to individually manage a diverse set of workloads — including traditional applications such as Java, stateless Docker microservices, batch jobs, real-time analytics, and stateful distributed data services. Mesos’ broad workload coverage comes from its two-level architecture, which enables “application-aware” scheduling. Application-aware scheduling is accomplished by encapsulating the application-specific operational logic in a “Mesos framework” (analogous to a runbook in operations). Mesos Master, the resource manager, then offers these frameworks fractions of the underlying infrastructure while maintaining isolation. This approach allows each workload to have its own purpose-built application scheduler that understands its specific operational requirements for deployment, scaling and upgrade. Application schedulers are also independently developed, managed and updated, allowing Mesos to be highly extensible and support new workloads or add more operational capabilities over time. + +![Mesos two-level scheduler](https://mesosphere.com/wp-content/uploads/2017/07/mesos-two-level-scheduler.png) + +Take, for example, how a team manages upgrades. Stateless application can benefit from a [“blue/green”][18] deployment approach; where another complete version of the app is spun up while the old one is still live, and traffic switches to the new app when ready and the old app is destroyed. But upgrading a data workload like HDFS or Cassandra requires taking the nodes offline one at a time, preserving local data volumes to avoid data loss, performing the upgrade in-place with a specific sequence, and executing special checks and commands on each node type before and after the upgrade. Any of these steps are app or service specific, and may even be version specific. This makes it incredibly challenging to manage data services with a conventional container orchestration scheduler. + +Mesos’ ability to manage each workload the way it wants to be treated has led many companies to use Mesos as a single unified platform to run a combination of microservices and data services together. A common reference architecture for running data-intensive applications is the “[SMACK stack][19]”. + +### A Moment of Clarity + +Notice that we haven’t said anything about container orchestration to describe Apache Mesos. So why do people automatically associate Mesos with container orchestration? Container orchestration is one example of a workload that can run on Mesos’ modular architecture, and it’s done using a specialized orchestration “framework” built on top of Mesos called Marathon. Marathon was originally developed to orchestrate app archives (like JARs, tarballs, ZIP files) in [cgroup][20]containers, and was one of the first container orchestrators to support Docker containers in 2014. + +So when people compare Docker and Kubernetes to Mesos, they are actually comparing Kubernetes and Docker Swarm to Marathon running on Mesos. + +Why does this matter? Because Mesos frankly doesn’t care what’s running on top of it. Mesos can elastically provide cluster services for Java application servers, Docker container orchestration, Jenkins CI Jobs, Apache Spark analytics, Apache Kafka streaming, and more on shared infrastructure. Mesos could even run Kubernetes or other container orchestrators, though a public integration is not yet available. + +![Mesos Workloads](https://mesosphere.com/wp-content/uploads/2017/07/mesos-workloads.png) + +Source: Apache Mesos Survey 2016 + +Another consideration for Mesos (and why it’s attractive for many enterprise architects) is its maturity in running mission critical workloads. Mesos has been in large scale production (tens of thousands of servers) for more than 7 years, which is why it’s known to be more production ready and reliable at scale than many other container-enabling technologies in the market. + +### What does this all mean? + +In summary, all three technologies have something to do with Docker containers and give you access to container orchestration for application portability and scale. So how do you choose between them? It comes down to choosing the right tool for the job (and perhaps even different ones for different jobs). If you are an application developer looking for a modern way to build and package your application, or to accelerate microservices initiatives, the Docker container format and developer tooling is the best way to do so. + +If you are a dev/devops team and want to build a system dedicated exclusively to Docker container orchestration, and are willing to get your hands dirty integrating your solution with the underlying infrastructure (or rely on public cloud infrastructure like Google Container Engine or Azure Container Service), Kubernetes is a good technology for you to consider. + +If you want to build a reliable platform that runs multiple mission critical workloads including Docker containers, legacy applications (e.g., Java), and distributed data services (e.g., Spark, Kafka, Cassandra, Elastic), and want all of this portable across cloud providers and/or datacenters, then Mesos (or our own Mesos distribution, Mesosphere DC/OS) is the right fit for you. + +Whatever you choose, you’ll be embracing a set of tools that makes more efficient use of server resources, simplifies application portability, and increases developer agility. You really can’t go wrong. + +-------------------------------------------------------------------------------- + +via: https://mesosphere.com/blog/docker-vs-kubernetes-vs-apache-mesos/?from=timeline&isappinstalled=0&nsukey=b2Ig6wj1rvlgVuEZ8ens0KVLuxYx7zv7GLuL1KBpcSWpvkfF2nHcSqeKJ7JnP%2FckIM4vBaRUkwdlUpWHNzrY8va0G14sN323y7T7OEix0DZpQOUQ%2FeiRcA7wJWN3Rws4PVSSI0wapm%2Bl5jCf%2B%2Bbj5HioS%2B%2FOeeil79KMIFrgFjKRMRWwZvlbOyq4j4iaipOi + +作者:[Amr Abdelrazik ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://mesosphere.com/blog/author/amr-abdelrazik/ +[1]:https://en.wikipedia.org/wiki/Cgroups +[2]:https://docs.docker.com/engine/docker-overview/ +[3]:https://mesosphere.github.io/marathon/ +[4]:https://www.google.com/url?q=https://www.youtube.com/watch?v=sGWQ8WiGN8Y&feature=youtu.be&t=35m10s&sa=D&ust=1500923856666000&usg=AFQjCNFLtW96ZWnOUGFPX_XUuVOPdWrd_w +[5]:https://www.nomadproject.io/ +[6]:http://kubernetes.io/ +[7]:https://blog.docker.com/2016/06/docker-1-12-built-in-orchestration/ +[8]:https://www.cncf.io/ +[9]:https://www.opencontainers.org/ +[10]:https://www.linuxfoundation.org/news-media/announcements/2016/03/cloud-native-computing-foundation-accepts-kubernetes-first-hosted-0 +[11]:https://research.google.com/pubs/pub43438.html +[12]:https://www.youtube.com/watch?v=C_WuUgTqgOc +[13]:https://youtu.be/F1-UEIG7u5g +[14]:http://www.businessinsider.com/apple-siri-uses-apache-mesos-2015-8 +[15]:https://engineeringblog.yelp.com/2015/11/introducing-paasta-an-open-platform-as-a-service.html +[16]:http://highscalability.com/blog/2016/9/28/how-uber-manages-a-million-writes-per-second-using-mesos-and.html +[17]:https://medium.com/netflix-techblog/distributed-resource-scheduling-with-apache-mesos-32bd9eb4ca38 +[18]:https://martinfowler.com/bliki/BlueGreenDeployment.html +[19]:https://mesosphere.com/blog/2017/06/21/smack-stack-new-lamp-stack/ +[20]:https://en.wikipedia.org/wiki/Cgroups +[21]:https://mesosphere.com/blog/author/amr-abdelrazik/ From fc8ea8037bad403ec6da14452b00c0e90a1e699d Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 2 Aug 2017 20:22:06 +0800 Subject: [PATCH 0884/1407] =?UTF-8?q?20170802-2=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sources/tech/20170101 What is Kubernetes.md | 198 ++++++++++++++++++++ 1 file changed, 198 insertions(+) create mode 100644 sources/tech/20170101 What is Kubernetes.md diff --git a/sources/tech/20170101 What is Kubernetes.md b/sources/tech/20170101 What is Kubernetes.md new file mode 100644 index 0000000000..4a7d14f43e --- /dev/null +++ b/sources/tech/20170101 What is Kubernetes.md @@ -0,0 +1,198 @@ +What is Kubernetes? +============================================================ + +This page is an overview of Kubernetes. + +* [Kubernetes is][6] + +* [Why containers?][7] + * [Why do I need Kubernetes and what can it do?][1] + + * [How is Kubernetes a platform?][2] + + * [What Kubernetes is not][3] + + * [What does  _Kubernetes_  mean? K8s?][4] + +* [What’s next][8] + +Kubernetes is an [open-source platform for automating deployment, scaling, and operations of application containers][25] across clusters of hosts, providing container-centric infrastructure. + +With Kubernetes, you are able to quickly and efficiently respond to customer demand: + +* Deploy your applications quickly and predictably. + +* Scale your applications on the fly. + +* Roll out new features seamlessly. + +* Limit hardware usage to required resources only. + +Our goal is to foster an ecosystem of components and tools that relieve the burden of running applications in public and private clouds. + +#### Kubernetes is + +* **Portable**: public, private, hybrid, multi-cloud + +* **Extensible**: modular, pluggable, hookable, composable + +* **Self-healing**: auto-placement, auto-restart, auto-replication, auto-scaling + +Google started the Kubernetes project in 2014\. Kubernetes builds upon a [decade and a half of experience that Google has with running production workloads at scale][26], combined with best-of-breed ideas and practices from the community. + +### Why containers? + +Looking for reasons why you should be using [containers][27]? + +![Why Containers?](https://d33wubrfki0l68.cloudfront.net/e7b766e0175f30ae37f7e0e349b87cfe2034a1ae/3e391/images/docs/why_containers.svg) + +The  _Old Way_  to deploy applications was to install the applications on a host using the operating system package manager. This had the disadvantage of entangling the applications’ executables, configuration, libraries, and lifecycles with each other and with the host OS. One could build immutable virtual-machine images in order to achieve predictable rollouts and rollbacks, but VMs are heavyweight and non-portable. + +The  _New Way_  is to deploy containers based on operating-system-level virtualization rather than hardware virtualization. These containers are isolated from each other and from the host: they have their own filesystems, they can’t see each others’ processes, and their computational resource usage can be bounded. They are easier to build than VMs, and because they are decoupled from the underlying infrastructure and from the host filesystem, they are portable across clouds and OS distributions. + +Because containers are small and fast, one application can be packed in each container image. This one-to-one application-to-image relationship unlocks the full benefits of containers. With containers, immutable container images can be created at build/release time rather than deployment time, since each application doesn’t need to be composed with the rest of the application stack, nor married to the production infrastructure environment. Generating container images at build/release time enables a consistent environment to be carried from development into production. Similarly, containers are vastly more transparent than VMs, which facilitates monitoring and management. This is especially true when the containers’ process lifecycles are managed by the infrastructure rather than hidden by a process supervisor inside the container. Finally, with a single application per container, managing the containers becomes tantamount to managing deployment of the application. + +Summary of container benefits: + +* **Agile application creation and deployment**: Increased ease and efficiency of container image creation compared to VM image use. + +* **Continuous development, integration, and deployment**: Provides for reliable and frequent container image build and deployment with quick and easy rollbacks (due to image immutability). + +* **Dev and Ops separation of concerns**: Create application container images at build/release time rather than deployment time, thereby decoupling applications from infrastructure. + +* **Environmental consistency across development, testing, and production**: Runs the same on a laptop as it does in the cloud. + +* **Cloud and OS distribution portability**: Runs on Ubuntu, RHEL, CoreOS, on-prem, Google Container Engine, and anywhere else. + +* **Application-centric management**: Raises the level of abstraction from running an OS on virtual hardware to run an application on an OS using logical resources. + +* **Loosely coupled, distributed, elastic, liberated [micro-services][5]**: Applications are broken into smaller, independent pieces and can be deployed and managed dynamically – not a fat monolithic stack running on one big single-purpose machine. + +* **Resource isolation**: Predictable application performance. + +* **Resource utilization**: High efficiency and density. + +#### Why do I need Kubernetes and what can it do? + +At a minimum, Kubernetes can schedule and run application containers on clusters of physical or virtual machines. However, Kubernetes also allows developers to ‘cut the cord’ to physical and virtual machines, moving from a **host-centric** infrastructure to a **container-centric** infrastructure, which provides the full advantages and benefits inherent to containers. Kubernetes provides the infrastructure to build a truly **container-centric** development environment. + +Kubernetes satisfies a number of common needs of applications running in production, such as: + +* [Co-locating helper processes][9], facilitating composite applications and preserving the one-application-per-container model + +* [Mounting storage systems][10] + +* [Distributing secrets][11] + +* [Checking application health][12] + +* [Replicating application instances][13] + +* [Using Horizontal Pod Autoscaling][14] + +* [Naming and discovering][15] + +* [Balancing loads][16] + +* [Rolling updates][17] + +* [Monitoring resources][18] + +* [Accessing and ingesting logs][19] + +* [Debugging applications][20] + +* [Providing authentication and authorization][21] + +This provides the simplicity of Platform as a Service (PaaS) with the flexibility of Infrastructure as a Service (IaaS), and facilitates portability across infrastructure providers. + +#### How is Kubernetes a platform? + +Even though Kubernetes provides a lot of functionality, there are always new scenarios that would benefit from new features. Application-specific workflows can be streamlined to accelerate developer velocity. Ad hoc orchestration that is acceptable initially often requires robust automation at scale. This is why Kubernetes was also designed to serve as a platform for building an ecosystem of components and tools to make it easier to deploy, scale, and manage applications. + +[Labels][28] empower users to organize their resources however they please. [Annotations][29]enable users to decorate resources with custom information to facilitate their workflows and provide an easy way for management tools to checkpoint state. + +Additionally, the [Kubernetes control plane][30] is built upon the same [APIs][31] that are available to developers and users. Users can write their own controllers, such as [schedulers][32], with [their own APIs][33] that can be targeted by a general-purpose [command-line tool][34]. + +This [design][35] has enabled a number of other systems to build atop Kubernetes. + +#### What Kubernetes is not + +Kubernetes is not a traditional, all-inclusive PaaS (Platform as a Service) system. It preserves user choice where it is important. + +Kubernetes: + +* Does not limit the types of applications supported. It does not dictate application frameworks (e.g., [Wildfly][22]), restrict the set of supported language runtimes (for example, Java, Python, Ruby), cater to only [12-factor applications][23], nor distinguish  _apps_  from  _services_ . Kubernetes aims to support an extremely diverse variety of workloads, including stateless, stateful, and data-processing workloads. If an application can run in a container, it should run great on Kubernetes. + +* Does not provide middleware (e.g., message buses), data-processing frameworks (for example, Spark), databases (e.g., mysql), nor cluster storage systems (e.g., Ceph) as built-in services. Such applications run on Kubernetes. + +* Does not have a click-to-deploy service marketplace. + +* Does not deploy source code and does not build your application. Continuous Integration (CI) workflow is an area where different users and projects have their own requirements and preferences, so it supports layering CI workflows on Kubernetes but doesn’t dictate how layering should work. + +* Allows users to choose their logging, monitoring, and alerting systems. (It provides some integrations as proof of concept.) + +* Does not provide nor mandate a comprehensive application configuration language/system (for example, [jsonnet][24]). + +* Does not provide nor adopt any comprehensive machine configuration, maintenance, management, or self-healing systems. + +On the other hand, a number of PaaS systems run  _on_  Kubernetes, such as [Openshift][36], [Deis][37], and [Eldarion][38]. You can also roll your own custom PaaS, integrate with a CI system of your choice, or use only Kubernetes by deploying your container images on Kubernetes. + +Since Kubernetes operates at the application level rather than at the hardware level, it provides some generally applicable features common to PaaS offerings, such as deployment, scaling, load balancing, logging, and monitoring. However, Kubernetes is not monolithic, and these default solutions are optional and pluggable. + +Additionally, Kubernetes is not a mere  _orchestration system_ . In fact, it eliminates the need for orchestration. The technical definition of  _orchestration_  is execution of a defined workflow: first do A, then B, then C. In contrast, Kubernetes is comprised of a set of independent, composable control processes that continuously drive the current state towards the provided desired state. It shouldn’t matter how you get from A to C. Centralized control is also not required; the approach is more akin to  _choreography_ . This results in a system that is easier to use and more powerful, robust, resilient, and extensible. + +#### What does  _Kubernetes_  mean? K8s? + +The name **Kubernetes** originates from Greek, meaning  _helmsman_  or  _pilot_ , and is the root of  _governor_  and [cybernetic][39].  _K8s_  is an abbreviation derived by replacing the 8 letters “ubernete” with “8”. + +-------------------------------------------------------------------------------- + +via: https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/ + +作者:[kubernetes.io][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://kubernetes.io/ +[1]:https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/#why-do-i-need-kubernetes-and-what-can-it-do +[2]:https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/#how-is-kubernetes-a-platform +[3]:https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/#what-kubernetes-is-not +[4]:https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/#what-does-kubernetes-mean-k8s +[5]:https://martinfowler.com/articles/microservices.html +[6]:https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/#kubernetes-is +[7]:https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/#why-containers +[8]:https://kubernetes.io/docs/concepts/overview/what-is-kubernetes/#whats-next +[9]:https://kubernetes.io/docs/concepts/workloads/pods/pod/ +[10]:https://kubernetes.io/docs/concepts/storage/volumes/ +[11]:https://kubernetes.io/docs/concepts/configuration/secret/ +[12]:https://kubernetes.io/docs/tasks/configure-pod-container/configure-liveness-readiness-probes/ +[13]:https://kubernetes.io/docs/concepts/workloads/controllers/replicationcontroller/ +[14]:https://kubernetes.io/docs/tasks/run-application/horizontal-pod-autoscale/ +[15]:https://kubernetes.io/docs/concepts/services-networking/connect-applications-service/ +[16]:https://kubernetes.io/docs/concepts/services-networking/service/ +[17]:https://kubernetes.io/docs/tasks/run-application/rolling-update-replication-controller/ +[18]:https://kubernetes.io/docs/tasks/debug-application-cluster/resource-usage-monitoring/ +[19]:https://kubernetes.io/docs/concepts/cluster-administration/logging/ +[20]:https://kubernetes.io/docs/tasks/debug-application-cluster/debug-application-introspection/ +[21]:https://kubernetes.io/docs/admin/authorization/ +[22]:http://wildfly.org/ +[23]:https://12factor.net/ +[24]:https://github.com/google/jsonnet +[25]:http://www.slideshare.net/BrianGrant11/wso2con-us-2015-kubernetes-a-platform-for-automating-deployment-scaling-and-operations +[26]:https://research.google.com/pubs/pub43438.html +[27]:https://aucouranton.com/2014/06/13/linux-containers-parallels-lxc-openvz-docker-and-more/ +[28]:https://kubernetes.io/docs/concepts/overview/working-with-objects/labels/ +[29]:https://kubernetes.io/docs/concepts/overview/working-with-objects/annotations/ +[30]:https://kubernetes.io/docs/concepts/overview/components/ +[31]:https://kubernetes.io/docs/reference/api-overview/ +[32]:https://git.k8s.io/community/contributors/devel/scheduler.md +[33]:https://git.k8s.io/community/contributors/design-proposals/extending-api.md +[34]:https://kubernetes.io/docs/user-guide/kubectl-overview/ +[35]:https://github.com/kubernetes/community/blob/master/contributors/design-proposals/principles.md +[36]:https://www.openshift.org/ +[37]:http://deis.io/ +[38]:http://eldarion.cloud/ +[39]:http://www.etymonline.com/index.php?term=cybernetics From 7720479874b33234c4b946e61fcf2583038b1fec Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 2 Aug 2017 20:25:03 +0800 Subject: [PATCH 0885/1407] =?UTF-8?q?20170802-3=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sources/tech/20170102 What is Kubernetes.md | 141 ++++++++++++++++++++ 1 file changed, 141 insertions(+) create mode 100644 sources/tech/20170102 What is Kubernetes.md diff --git a/sources/tech/20170102 What is Kubernetes.md b/sources/tech/20170102 What is Kubernetes.md new file mode 100644 index 0000000000..522b9099c6 --- /dev/null +++ b/sources/tech/20170102 What is Kubernetes.md @@ -0,0 +1,141 @@ +### What is Kubernetes? + +Kubernetes, or k8s ( _k, 8 characters, s...get it?_ ), or “kube” if you’re into brevity, is an open source platform that automates [Linux container][3] operations. It eliminates many of the manual processes involved in deploying and scaling containerized applications. In other words, you can cluster together groups of hosts running Linux containers, and Kubernetes helps you easily and efficiently manage those clusters. These clusters can span hosts across [public][4], [private][5], or hybrid clouds. + +Kubernetes was originally developed and designed by engineers at Google. Google was one of the [early contributors to Linux container technology][6] and has talked publicly about how [everything at Google runs in containers][7]. (This is the technology behind Google’s cloud services.) Google generates more than 2 billion container deployments a week—all powered by an internal platform: [Borg][8]. Borg was the predecessor to Kubernetes and the lessons learned from developing Borg over the years became the primary influence behind much of the Kubernetes technology. + + _Fun fact: The seven spokes in the Kubernetes logo refer to the project’s original name, “[Project Seven of Nine][1].”_ + +Red Hat was one of the first companies to work with Google on Kubernetes, even prior to launch, and has become the [2nd leading contributor][9] to Kubernetes upstream project. Google [donated][10] the Kubernetes project to the newly formed [Cloud Native Computing Foundation][11] in 2015. + +* * * + +### Why do you need Kubernetes? + +Real production apps span multiple containers. Those containers must be deployed across multiple server hosts. Kubernetes gives you the orchestration and management capabilities required to deploy containers, at scale, for these workloads. Kubernetes orchestration allows you to build application services that span multiple containers, schedule those containers across a cluster, scale those containers, and manage the health of those containers over time. + +Kubernetes also needs to integrate with networking, storage, security, telemetry and other services to provide a comprehensive container infrastructure. + + ![Kubernetes explained - diagram](https://www.redhat.com/cms/managed-files/styles/max_size/s3/kubernetes-diagram-902x416.png?itok=C_wxL4HV "Kubernetes explained - diagram") + +Of course, this depends on how you’re using containers in your environment. A rudimentary application of Linux containers treats them as efficient, fast virtual machines. Once you scale this to a production environment and multiple applications, it's clear that you need multiple, colocated containers working together to deliver the individual services. This significantly multiplies the number of containers in your environment and as those containers accumulate, the complexity also grows. + +Kubernetes fixes a lot of common problems with container proliferation—sorting containers together into a ”pod.” Pods add a layer of abstraction to grouped containers, which helps you schedule workloads and provide necessary services—like networking and storage—to those containers. Other parts of Kubernetes help you load balance across these pods and ensure you have the right number of containers running to support your workloads. + +With the right implementation of Kubernetes—and with the help of other open source projects like [Atomic Registry][12], [Open vSwitch][13], [heapster][14], [OAuth][15], and [SELinux][16]— you can orchestrate all parts of your container infrastructure. + +* * * + +### What can you do with Kubernetes? + +The primary advantage of using Kubernetes in your environment is that it gives you the platform to schedule and run containers on clusters of physical or virtual machines. More broadly, it helps you fully implement and rely on a container-based infrastructure in production environments. And because Kubernetes is all about automation of operational tasks, you can do many of the same things that other application platforms or management systems let you do, but for your containers. + +With Kubernetes you can: + +* Orchestrate containers across multiple hosts. + +* Make better use of hardware to maximize resources needed to run your enterprise apps. + +* Control and automate application deployments and updates. + +* Mount and add storage to run stateful apps. + +* Scale containerized applications and their resources on the fly. + +* Declaratively manage services, which guarantees the deployed applications are always running how you deployed them. + +* Health-check and self-heal your apps with autoplacement, autorestart, autoreplication, and autoscaling. + +Kubernetes, however, relies on other projects to fully provide these orchestrated services. With the addition of other open source projects, you can fully realize the power of Kubernetes. These necessary pieces include (among others): + +* Registry, through projects like Atomic Registry or Docker Registry. + +* Networking, through projects like OpenvSwitch and intelligent edge routing. + +* Telemetry, through projects such as heapster, kibana, hawkular, and elastic. + +* Security, through projects like LDAP, SELinux, RBAC, and OAUTH with multi-tenancy layers. + +* Automation, with the addition of Ansible playbooks for installation and cluster life-cycle management. + +* Services, through a rich catalog of precreated content of popular app patterns. + +[Get all of this, prebuilt and ready to deploy, with Red Hat OpenShift][17] + +* * * + +### Learn to speak Kubernetes + +Like any technology, there are a lot of words specific to the technology that can be a barrier to entry. Let's break down some of the more common terms to help you understand Kubernetes. + +**Master:** The machine that controls Kubernetes nodes. This is where all task assignments originate. + +**Node:** These machines perform the requested, assigned tasks. The Kubernetes master controls them. + +**Pod:** A group of one or more containers deployed to a single node. All containers in a pod share an IP address, IPC, hostname, and other resources. Pods abstract network and storage away from the underlying container. This lets you move containers around the cluster more easily. + +**Replication controller: ** This controls how many identical copies of a pod should be running somewhere on the cluster. + +**Service:** This decouples work definitions from the pods. Kubernetes service proxies automatically get service requests to the right pod—no matter where it moves to in the cluster or even if it’s been replaced. + +**Kubelet:** This service runs on nodes and reads the container manifests and ensures the defined containers are started and running. + +**kubectl:** This is the command line configuration tool for Kubernetes. + +[Had enough? No? Check out the Kubernetes glossary.][18] + +* * * + +### Using Kubernetes in production + +Kubernetes is open source. And, as such, there’s not a formalized support structure around that technology—at least not one you’d trust your business on. If you had an issue with your implementation of Kubernetes, while running in production, you’re not going to be very happy. And your customers probably won’t, either. + +That’s where [Red Hat OpenShift][2] comes in. OpenShift is Kubernetes for the enterprise—and a lot more. OpenShift includes all of the extra pieces of technology that makes Kubernetes powerful and viable for the enterprise, including: registry, networking, telemetry, security, automation, and services. With OpenShift, your developers can make new containerized apps, host them, and deploy them in the cloud with the scalability, control, and orchestration that can turn a good idea into new business quickly and easily. + +Best of all, OpenShift is supported and developed by the #1 leader in open source, Red Hat. + +* * * + +### A look at how Kubernetes fits into your infrastructure + + ![Kubernetes diagram](https://www.redhat.com/cms/managed-files/styles/max_size/s3/kubernetes-diagram-2-824x437.png?itok=KmhLmkgi "Kubernetes diagram") + +Kubernetes runs on top of an operating system ([Red Hat Enterprise Linux Atomic Host][19], for example) and interacts with pods of containers running on the nodes. The Kubernetes master takes the commands from an administrator (or DevOps team) and relays those instructions to the subservient nodes. This handoff works with a multitude of services to automatically decide which node is best suited for the task. It then allocates resources and assigns the pods in that node to fulfill the requested work. + +So, from an infrastructure point of view, there is little change to how you’ve been managing containers. Your control over those containers happens at a higher level, giving you better control without the need to micromanage each separate container or node. Some work is necessary, but it’s mostly a question of assigning a Kubernetes master, defining nodes, and defining pods. + +### What about docker? + +The [docker][20] technology still does what it's meant to do. When kubernetes schedules a pod to a node, the kubelet on that node will instruct docker to launch the specified containers. The kubelet then continuously collects the status of those containers from docker and aggregates that information in the master. Docker pulls containers onto that node and starts and stops those containers as normal. The difference is that an automated system asks docker to do those things instead of the admin doing so by hand on all nodes for all containers. + +-------------------------------------------------------------------------------- + +via: https://www.redhat.com/en/containers/what-is-kubernetes + +作者:[www.redhat.com ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.redhat.com/ +[1]:https://cloudplatform.googleblog.com/2016/07/from-Google-to-the-world-the-Kubernetes-origin-story.html +[2]:https://www.redhat.com/en/technologies/cloud-computing/openshift +[3]:https://www.redhat.com/en/containers/whats-a-linux-container +[4]:https://www.redhat.com/en/topics/cloud-computing/what-is-public-cloud +[5]:https://www.redhat.com/en/topics/cloud-computing/what-is-private-cloud +[6]:https://en.wikipedia.org/wiki/Cgroups +[7]:https://speakerdeck.com/jbeda/containers-at-scale +[8]:http://blog.kubernetes.io/2015/04/borg-predecessor-to-kubernetes.html +[9]:http://stackalytics.com/?project_type=kubernetes-group&metric=commits +[10]:https://techcrunch.com/2015/07/21/as-kubernetes-hits-1-0-google-donates-technology-to-newly-formed-cloud-native-computing-foundation-with-ibm-intel-twitter-and-others/ +[11]:https://www.cncf.io/ +[12]:http://www.projectatomic.io/registry/ +[13]:http://openvswitch.org/ +[14]:https://github.com/kubernetes/heapster +[15]:https://oauth.net/ +[16]:https://selinuxproject.org/page/Main_Page +[17]:https://www.redhat.com/en/technologies/cloud-computing/openshift +[18]:https://kubernetes.io/docs/reference/ +[19]:https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux/options +[20]:https://www.redhat.com/en/containers/what-is-docker From 6b06356700f457d99050fe858501904c62eb6378 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 2 Aug 2017 20:27:12 +0800 Subject: [PATCH 0886/1407] =?UTF-8?q?20170802-4=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...ldren s Illustrated Guide to Kubernetes.md | 144 ++++++++++++++++++ 1 file changed, 144 insertions(+) create mode 100644 sources/tech/20160616 The Children s Illustrated Guide to Kubernetes.md diff --git a/sources/tech/20160616 The Children s Illustrated Guide to Kubernetes.md b/sources/tech/20160616 The Children s Illustrated Guide to Kubernetes.md new file mode 100644 index 0000000000..f398ef2e57 --- /dev/null +++ b/sources/tech/20160616 The Children s Illustrated Guide to Kubernetes.md @@ -0,0 +1,144 @@ +The Children's Illustrated Guide to Kubernetes +============================================================ + + +Introducing Phippy, an intrepid little PHP app, and her journey to Kubernetes. + +What is this? Well, I wrote a book that explains Kubernetes. We posted [a video version][1] to the Kubernetes community blog. If you find us at a conference, you stand a chance to pick up a physical copy. But for now, here's a blog post version! + +And after you've finished reading, tweet something at [@opendeis][2] for a chance to win a squishy little Phippy toy of your own. Not sure what to tweet? Why don't you tell us about yourself and how you use Kubernetes! + +### The Other Day... + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-illustration-1.png) + +The other day, my daughter sidled into my office, and asked me, "Dearest Father, whose knowledge is incomparable, what is Kubernetes?" + +Alright, that's a little bit of a paraphrase, but you get the idea. + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-diagram-1.png) + +And I responded, "Kubernetes is an open source orchestration system for Docker containers. It handles scheduling onto nodes in a compute cluster and actively manages workloads to ensure that their state matches the users' declared intentions. Using the concepts of "labels" and "pods", it groups the container which make up an application into logical units for easy management and discovery." + +And my daughter said to me, "Huh?" + +And so I give you... + +### The Children's Illustrated Guide to Kubernetes + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-illustration-2.png) + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-illustration-3.png) + +Once upon a time there was an app named Phippy. And she was a simple app. She was written in PHP and had just one page. She lived on a hosting provider and she shared her environment with scary other apps that she didn't know and didn't care to associate with. She wished she had her own environment: just her and a webserver she could call home. + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-diagram-2.png) + +An app has an environment that it relies upon to run. For a PHP app, that environment might include a webserver, a readable file system, and the PHP engine itself. + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-illustration-4.png) + +One day, a kindly whale came along. He suggested that little Phippy might be happier living in a container. And so the app moved. And the container was nice, but… It was a little bit like having a fancy living room floating in the middle of the ocean. + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-diagram-3.png) + +A container provides an isolated environment in which an app, together with its environment, can run. But those isolated containers often need to be managed and connected to the external world. Shared file systems, networking, scheduling, load balancing, and distribution are all challenges. + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-illustration-5.png) + +The whale shrugged his shoulders. "Sorry, kid," he said, and disappeared beneath the ocean's surface. But before Phippy could even begin to despair, a captain appeared on the horizon, piloting a gigantic ship. The ship was made of dozens of rafts all lashed together, but from the outside, it looked like one giant ship. + +"Hello there, friend PHP app. My name is Captain Kube" said the wise old captain. + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-diagram-4.png) + +"Kubernetes" is the Greek word for a ship's captain. We get the words  _Cybernetic_  and  _Gubernatorial_  from it. Led by Google, the Kubernetes project focuses on building a robust platform for running thousands of containers in production. + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-illustration-6.png) + +"I'm Phippy," said the little app. + +"Nice to make your acquaintance," said the Captain as he slapped a name tag on her. + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-diagram-5.png) + +Kubernetes uses labels as "nametags" to identify things. And it can query based on these labels. Labels are open-ended: You can use them to indicate roles, stability, or other important attributes. + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-illustration-7.png) + +Captain Kube suggested that the app might like to move her container to a pod on board the ship. Phippy happily moved her container inside of the pod aboard Kube's giant ship. It felt like home. + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-diagram-6.png) + +In Kubernetes, a Pod represents a runnable unit of work. Usually, you will run a single container inside of a Pod. But for cases where a few containers are tightly coupled, you may opt to run more than one container inside of the same Pod. Kubernetes takes on the work of connecting your pod to the network and the rest of the Kubernetes environment. + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-illustration-8.png) + +Phippy had some unusual interests. She was really into genetics and sheep. And so she asked the captain, "What if I want to clone myself… On demand… Any number of times?" + +"That's easy," said the captain. And he introduced her to the replication controllers. + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-diagram-7.png) + +Replication controllers provide a method for managing an arbitrary number of pods. A replication controller contains a pod template, which can be replicated any number of times. Through the replication controller, Kubernetes will manage your pods' lifecycle, including scaling up and down, rolling deployments, and monitoring. + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-illustration-9.png) + +For many days and nights the little app was happy with her pod and happy with her replicas. But only having yourself for company is not all it's cracked up to be…. even if it is N copies of yourself. + +Captain Kube smiled benevolently, "I have just the thing." + +No sooner had he spoken than a tunnel opened between Phippy's replication controller and the rest of the ship. With a hearty laugh, Captain Kube said, "Even when your clones come and go, this tunnel will stay here so you can discover other pods, and they can discover you!" + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-diagram-8.png) + +A service tells the rest of the Kubernetes environment (including other pods and replication controllers) what  _services_  your application provides. While pods come and go, the service IP addresses and ports remain the same. And other applications can find your service through Kurbenetes service discovery. + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-illustration-10.png) + +Thanks to the services, Phippy began to explore the rest of the ship. It wasn't long before Phippy met Goldie. And they became the best of friends. One day, Goldie did something extraordinary. She gave Phippy a present. Phippy took one look and the saddest of sad tears escaped her eye. + +"Why are you so sad?" asked Goldie. + +"I love the present, but I have nowhere to put it!" sniffled Phippy. + +But Goldie knew what to do. "Why not put it in a volume?" + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-diagram-9.png) + +A volume represents a location where containers can access and store information. For the application, the volume appears as part of the local filesystem. But volumes may be backed by local storage, Ceph, Gluster, Elastic Block Storage, and a number of other storage backends. + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-illustration-11.png) + +Phippy loved life aboard Captain Kube's ship and she enjoyed the company of her new friends (every replicated pod of Goldie was equally delightful). But as she thought back to her days on the scary hosted provider, she began to wonder if perhaps she could also have a little privacy. + +"It sounds like what you need," said Captain Kube, "is a namespace." + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-diagram-10.png) + +A namespace functions as a grouping mechanism inside of Kubernetes. Services, pods, replication controllers, and volumes can easily cooperate within a namespace, but the namespace provides a degree of isolation from the other parts of the cluster. + +![](https://deis.com/images/blog-images/kubernetes-illustrated-guide-illustration-12.png) + +Together with her new friends, Phippy sailed the seas on Captain Kube's great boat. She had many grand adventures, but most importantly, Phippy had found her home. + +And so Phippy lived happily ever after. + +-------------------------------------------------------------------------------- + + +作者简介: + +Platform Architect at Deis. Lover of wisdom, coffee, and finely crafted code. + +via: https://deis.com/blog/2016/kubernetes-illustrated-guide/ + +作者:[Matt Butcher ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://twitter.com/@technosophos +[1]:http://blog.kubernetes.io/2016/06/illustrated-childrens-guide-to-kubernetes.html +[2]:https://twitter.com/opendeis From 29adf938479fb7f67188bd23bb02398ca11df113 Mon Sep 17 00:00:00 2001 From: GitFuture <752736341@qq.com> Date: Wed, 2 Aug 2017 20:38:45 +0800 Subject: [PATCH 0887/1407] Translation Done --- .../20170312 OpenGL Go Tutorial Part 1.md | 570 ------------------ .../20170312 OpenGL Go Tutorial Part 1.md | 570 ++++++++++++++++++ 2 files changed, 570 insertions(+), 570 deletions(-) delete mode 100644 sources/tech/20170312 OpenGL Go Tutorial Part 1.md create mode 100644 translated/tech/20170312 OpenGL Go Tutorial Part 1.md diff --git a/sources/tech/20170312 OpenGL Go Tutorial Part 1.md b/sources/tech/20170312 OpenGL Go Tutorial Part 1.md deleted file mode 100644 index 4910a893fb..0000000000 --- a/sources/tech/20170312 OpenGL Go Tutorial Part 1.md +++ /dev/null @@ -1,570 +0,0 @@ -translating by GitFuture - -OpenGL & Go Tutorial Part 1: Hello, OpenGL -============================================================ - - _[Part 1: Hello, OpenGL][6]_  |  _[Part 2: Drawing the Game Board][7]_  |  _[Part 3: Implementing the Game][8]_ - - _The full source code of the tutorial is available on [GitHub][9]._ - -### Introduction - -[OpenGL][19] is pretty much the gold standard for any kind of graphics work, from desktop GUIs to games to mobile applications and even the web, I can almost guarantee you’ve viewed something rendered by OpenGL today. However, regardless of how popular and useful OpenGL is, it can be quite intimidating to get started compared to more high-level graphics libraries. - -The purpose of this tutorial is to give you a starting point and basic understanding of OpenGL, and how to utilize it with [Go][20]. There are bindings for OpenGL in just about every language and Go is no exception with the [go-gl][21] packages, a full suite of generated OpenGL bindings for various OpenGL versions. - -The tutorial will walk through a few phases outlined below, with our end goal being to implement [Conway’s Game of Life][22] using OpenGL to draw the game board in a desktop window. The full source code is available on GitHub at [github.com/KyleBanks/conways-gol][23] so feel free to check it out if you get stuck or use it as a reference if you decide to go your own way. - -Before we get started, we need to get an understanding of what  _Conway’s Game of Life_  actually is. Here’s the summary from [Wikipedia][24]: - -> The Game of Life, also known simply as Life, is a cellular automaton devised by the British mathematician John Horton Conway in 1970. -> -> The “game” is a zero-player game, meaning that its evolution is determined by its initial state, requiring no further input. One interacts with the Game of Life by creating an initial configuration and observing how it evolves, or, for advanced “players”, by creating patterns with particular properties. -> -> Rules -> -> The universe of the Game of Life is an infinite two-dimensional orthogonal grid of square cells, each of which is in one of two possible states, alive or dead, or “populated” or “unpopulated” (the difference may seem minor, except when viewing it as an early model of human/urban behaviour simulation or how one views a blank space on a grid). Every cell interacts with its eight neighbours, which are the cells that are horizontally, vertically, or diagonally adjacent. At each step in time, the following transitions occur: -> -> 1. Any live cell with fewer than two live neighbours dies, as if caused by underpopulation. -> 2. Any live cell with two or three live neighbours lives on to the next generation. -> 3. Any live cell with more than three live neighbours dies, as if by overpopulation. -> 4. Any dead cell with exactly three live neighbours becomes a live cell, as if by reproduction. - -And without further ado, here’s a demo of what we’ll be building: - - ![Conway's Game of Life in OpenGL and Golang Tutorial - Demo Game](https://kylewbanks.com/images/post/golang-opengl-conway-1.gif) - -In our simulation, a white cell indicates that it is alive, and black cell indicates that it is not. - -### Outline - -The tutorial is going to cover a lot of ground starting with the basics, however it will assume you have a minimal working knowledge of Go - at the very least you should know the basics of variables, slices, functions and structs, and have a working Go environment setup. I’ve developed the tutorial using Go version 1.8, but it should be compatible with previous versions as well. There is nothing particularly novel here in the Go implementation, so if you have experience in any similar programming language you should be just fine. - -As for the tutorial, here’s what we’ll be covering: - -* [Part 1: Hello, OpenGL][10]: Install and Setup OpenGL and [GLFW][11], Draw a Triangle to the Window -* [Part 2: Drawing the Game Board][12]: Make a Square out of Triangles, Draw a Grid of Squares covering the Window -* [Part 3: Implementing the Game][13]: Implement Conway’s Game - -The final source code is available on [GitHub][25] but each  _Part_  includes a  _Checkpoint_  at the bottom containing the code up until that point. If anything is ever unclear or if you feel lost, check the bottom of the post for the full source! - -Let’s get started! - -### Install and Setup OpenGL and GLFW - -We’ve introduced OpenGL but in order to use it we’re going to need a window to draw on to. [GLFW][26] is a cross-platform API for OpenGL that allows us to create and reference a window, and is also provided by the [go-gl][27] suite. - -The first thing we need to do is decide on an OpenGL version. For the purposes of this tutorial we’ll use **OpenGL v4.1** but you can use **v2.1** just fine if your system doesn’t have the latest OpenGL versions. In order to install OpenGL we’ll do the following: - -``` -# For OpenGL 4.1 -$ go get github.com/go-gl/gl/v4.1-core/gl - -# Or 2.1 -$ go get github.com/go-gl/gl/v2.1/gl -``` - -Next up, let’s install GLFW: - -``` -$ go get github.com/go-gl/glfw/v3.2/glfw -``` - -With these two packages installed, we’re ready to get started! We’re going to start by creating **main.go** and importing the packages (and a couple others we’ll need in a moment). - -``` -package main - -import ( - "log" - "runtime" - - "github.com/go-gl/gl/v4.1-core/gl" // OR: github.com/go-gl/gl/v2.1/gl - "github.com/go-gl/glfw/v3.2/glfw" -) -``` - -Next lets define the **main** function, the purpose of which is to initialize OpenGL and GLFW and display the window: - -``` -const ( - width = 500 - height = 500 -) - -func main() { - runtime.LockOSThread() - - window := initGlfw() - defer glfw.Terminate() - - for !window.ShouldClose() { - // TODO - } -} - -// initGlfw initializes glfw and returns a Window to use. -func initGlfw() *glfw.Window { - if err := glfw.Init(); err != nil { - panic(err) - } - - glfw.WindowHint(glfw.Resizable, glfw.False) - glfw.WindowHint(glfw.ContextVersionMajor, 4) // OR 2 - glfw.WindowHint(glfw.ContextVersionMinor, 1) - glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) - glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True) - - window, err := glfw.CreateWindow(width, height, "Conway's Game of Life", nil, nil) - if err != nil { - panic(err) - } - window.MakeContextCurrent() - - return window -} -``` - -Alright let’s take a minute to walk through this and see what’s going on. First we define a couple constants, **width** and **height** - these will determine the size of the window, in pixels. - -Next we have the **main** function. Here we instruct the **runtime** package to **LockOSThread()**, which ensures we will always execute in the same operating system thread, which is important for GLFW which must always be called from the same thread it was initialized on. Speaking of which, next we call **initGlfw** to get a window reference, and defer terminating. The window reference is then used in a for-loop where we say as long as the window should remain open, do  _something_ . We’ll come back to this in a bit. - -**initGlfw** is our next function, wherein we call **glfw.Init()** to initialize the GLFW package. After that, we define some global GLFW properties, including disabling window resizing and the properties of our OpenGL version. Next it’s time to create a **glfw.Window** which is where we’re going to do our future drawing. We simply tell it the width and height we want, as well as a title, and then call **window.MakeContextCurrent**, binding the window to our current thread. Finally, we return the window. - -If you build and run the program now, you should see… nothing. This makes sense, because we’re not actually doing anything with the window yet. - -Let’s fix that by defining a new function that initializes OpenGL: - -``` -// initOpenGL initializes OpenGL and returns an intiialized program. -func initOpenGL() uint32 { - if err := gl.Init(); err != nil { - panic(err) - } - version := gl.GoStr(gl.GetString(gl.VERSION)) - log.Println("OpenGL version", version) - - prog := gl.CreateProgram() - gl.LinkProgram(prog) - return prog -} -``` - -**initOpenGL**, like our **initGlfw** function above, initializes the OpenGL library and creates a  _program_ . A program gives us a reference to store shaders, which can then be used for drawing. We’ll come back to this in a bit, but for now just know that OpenGL is initialized and we have a **program** reference. We also print out the OpenGL version which can be helpful for debugging. - -Back in **main**, let’s call this new function: - -``` -func main() { - runtime.LockOSThread() - - window := initGlfw() - defer glfw.Terminate() - - program := initOpenGL() - - for !window.ShouldClose() { - draw(window, program) - } -} -``` - -You’ll notice now that we have our **program** reference, we’re calling a new **draw** function within our core window loop. Eventually this function will draw all of our cells to visualize the game state, but for now its just going to clear the window so we get a black screen: - -``` -func draw(window *glfw.Window, program uint32) { - gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) - gl.UseProgram(prog) - - glfw.PollEvents() - window.SwapBuffers() -} -``` - -The first thing we do is call **gl.Clear** to remove anything from the window that was drawn last frame, giving us a clean slate. Next we tell OpenGL to use our program reference, which currently does nothing. Finally, we tell GLFW to check if there were any mouse or keyboard events (which we won’t be handling in this tutorial) with the **PollEvents** function, and tell the window to **SwapBuffers**. [Buffer swapping][28] is important because GLFW (like many graphics libraries) uses double buffering, meaning everything you draw is actually drawn to an invisible canvas, and only put onto the visible canvas when you’re ready - which in this case, is indicated by calling **SwapBuffers**. - -Alright, we’ve covered a lot here, so let’s take a moment to see the fruits of our labors. Go ahead and run the program now, and you should get to see your first visual: - - ![Conway's Game of Life in OpenGL and Golang Tutorial - First Window](https://kylewbanks.com/images/post/golang-opengl-conway-2.png) - -Beautiful. - -### Draw a Triangle to the Window - -We’ve made some serious progress, even if it doesn’t look like much, but we still need to actually draw something. We’ll start by drawing a triangle, which may at first seem like it would be more difficult to draw than the squares we’re eventually going to, but you’d be mistaken for thinking so. What you may not know is that triangles are probably the easiest shapes to draw, and in fact we’ll eventually be making our squares out of triangles anyways. - -Alright so we want to draw a triangle, but how? Well, we draw shapes by defining the vertices of the shapes and providing them to OpenGL to be drawn. Let’s first define our triangle at the top of **main.go**: - -``` -var ( - triangle = []float32{ - 0, 0.5, 0, // top - -0.5, -0.5, 0, // left - 0.5, -0.5, 0, // right - } -) -``` - -This looks weird, but let’s break it down. First we have a slice of **float32**, which is the datatype we always use when providing vertices to OpenGL. The slice contains 9 values, three for each vertex of a triangle. The top line, **0, 0.5, 0**, is the top vertex represented as X, Y, and Z coordinates, the second line is the left vertex, and the third line is the right vertex. Each of these pairs of three represents the X, Y, and Z coordinates of the vertex relative to the center of the window, between **-1 and 1**. So the top point has an X of zero because its X is in the center of the window, a Y of  _0.5_  meaning it will be up one quarter (because the range is -1 to 1) of the window relative to the center of the window, and a Z of zero. For our purposes because we are drawing only in two dimensions, our Z values will always be zero. Now have a look at the left and right vertices and see if you can understand why they are defined as they are - it’s okay if it isn’t immediately clear, we’re going to see it on the screen soon enough so we’ll have a perfect visualization to play with. - -Okay, we have a triangle defined, but now we need to draw it. In order to draw it, we need what’s called a **Vertex Array Object** or **vao** which is created from a set of points (what we defined as our triangle), and can be provided to OpenGL to draw. Let’s create a function called **makeVao** that we can provide with a slice of points and have it return a pointer to an OpenGL vertex array object: - -``` -// makeVao initializes and returns a vertex array from the points provided. -func makeVao(points []float32) uint32 { - var vbo uint32 - gl.GenBuffers(1, &vbo) - gl.BindBuffer(gl.ARRAY_BUFFER, vbo) - gl.BufferData(gl.ARRAY_BUFFER, 4*len(points), gl.Ptr(points), gl.STATIC_DRAW) - - var vao uint32 - gl.GenVertexArrays(1, &vao) - gl.BindVertexArray(vao) - gl.EnableVertexAttribArray(0) - gl.BindBuffer(gl.ARRAY_BUFFER, vbo) - gl.VertexAttribPointer(0, 3, gl.FLOAT, false, 0, nil) - - return vao -} -``` - -First we create a **Vertex Buffer Object** or **vbo** to bind our **vao** to, which is created by providing the size (**4 x len(points)**) and a pointer to the points (**gl.Ptr(points)**). You may be wondering why it’s **4 x len(points)** - why not 6 or 3 or 1078? The reason is we are using **float32** slices, and a 32-bit float has 4 bytes, so we are saying the size of the buffer, in bytes, is 4 times the number of points. - -Now that we have a buffer, we can create the **vao** and bind it to the buffer with **gl.BindBuffer**, and finally return the **vao**. This **vao** will then be used to draw the triangle! - -Back in **main**: - -``` -func main() { - ... - - vao := makeVao(triangle) - for !window.ShouldClose() { - draw(vao, window, program) - } -} - -Here we call **makeVao** to get our **vao** reference from the **triangle** points we defined before, and pass it as a new argument to the **draw** function: - -func draw(vao uint32, window *glfw.Window, program uint32) { - gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) - gl.UseProgram(program) - - gl.BindVertexArray(vao) - gl.DrawArrays(gl.TRIANGLES, 0, int32(len(triangle) / 3)) - - glfw.PollEvents() - window.SwapBuffers() -} -``` - -Then we bind OpenGL to our **vao** so it knows what we’re talking above when we tell it to **DrawArrays**, and tell it the length of the triangle (divided by three, one for each X, Y, Z coordinate) slice so it knows how many vertices to draw. - -If you run the application at this point you might be expecting to see a beautiful triangle in the center of the window, but unfortunately you would be mistaken. There’s still one thing left to do, you see we’ve told OpenGL that we want to draw a triangle, but we need to tell it  _how_  to draw the triangle. - -In order to do that, we need what are called fragment and vertex shaders, which are quite advanced and beyond the scope of this tutorial (and honestly, beyond the scope of my OpenGL knowledge), however [Harold Serrano on Quora][29] gives a wonderful explanation of what they are. All we absolutely need to understand for this application is that shaders are their own mini-programs (written in [OpenGL Shader Language or GLSL][30]) that manipulate vertices to be drawn by OpenGL, and are used to (for example) determine the color of a shape. - -We start by adding two more imports and a function called **compileShader**: - -``` -import ( - "strings" - "fmt" -) - -func compileShader(source string, shaderType uint32) (uint32, error) { - shader := gl.CreateShader(shaderType) - - csources, free := gl.Strs(source) - gl.ShaderSource(shader, 1, csources, nil) - free() - gl.CompileShader(shader) - - var status int32 - gl.GetShaderiv(shader, gl.COMPILE_STATUS, &status) - if status == gl.FALSE { - var logLength int32 - gl.GetShaderiv(shader, gl.INFO_LOG_LENGTH, &logLength) - - log := strings.Repeat("\x00", int(logLength+1)) - gl.GetShaderInfoLog(shader, logLength, nil, gl.Str(log)) - - return 0, fmt.Errorf("failed to compile %v: %v", source, log) - } - - return shader, nil -} -``` - -The purpose of this function is to receive the shader source code as a string as well as its type, and return a pointer to the resulting compiled shader. If it fails to compile we’ll get an error returned containing the details. - -Now let’s define the shaders and compile them from **makeProgram**. Back up in our **const** block where we define **width** and **height**: - -``` -vertexShaderSource = ` - #version 410 - in vec3 vp; - void main() { - gl_Position = vec4(vp, 1.0); - } -` + "\x00" - -fragmentShaderSource = ` - #version 410 - out vec4 frag_colour; - void main() { - frag_colour = vec4(1, 1, 1, 1); - } -` + "\x00" -``` - -As you can see these are strings containing GLSL source code for two shaders, one for a  _vertex shader_  and another for a  _fragment shader_ . The only thing special about these strings is that they both end in a null-termination character, **\x00** - a requirement for OpenGL to be able to compile them. Make note of the **fragmentShaderSource**, this is where we define the color of our shape in RGBA format using a **vec4**. You can change the value here, which is currently **RGBA(1, 1, 1, 1)** or  _white_ , to change the color of the triangle. - -Also of note is that both programs start with **#version 410**, which you should change to **#version 120** if using OpenGL 2.1. **120** is not a typo - use **120** not **210** if you’re on OpenGL 2.1! - -Next in **initOpenGL** we’ll compile the shaders and attach them to our **program**: - -``` -func initOpenGL() uint32 { - if err := gl.Init(); err != nil { - panic(err) - } - version := gl.GoStr(gl.GetString(gl.VERSION)) - log.Println("OpenGL version", version) - - vertexShader, err := compileShader(vertexShaderSource, gl.VERTEX_SHADER) - if err != nil { - panic(err) - } - fragmentShader, err := compileShader(fragmentShaderSource, gl.FRAGMENT_SHADER) - if err != nil { - panic(err) - } - - prog := gl.CreateProgram() - gl.AttachShader(prog, vertexShader) - gl.AttachShader(prog, fragmentShader) - gl.LinkProgram(prog) - return prog -} -``` - -Here we call our **compileShader** function with the  _vertex shader_ , specifying its type as a **gl.VERTEX_SHADER**, and do the same with the  _fragment shader_  but specifying its type as a **gl.FRAGMENT_SHADER**. After compiling them, we attach them to our program by calling **gl.AttachShader** with our program and each compiled shader. - -And now we’re finally ready to see our glorious triangle! Go ahead and run, and if all is well you’ll see: - - ![Conway's Game of Life in OpenGL and Golang Tutorial - Hello, Triangle!](https://kylewbanks.com/images/post/golang-opengl-conway-3.png) - -### Summary - -Amazing, right! All that for a single triangle, but I promise you we’ve setup the majority of the OpenGL code that will serve us for the rest of the tutorial. I highly encourage you to take a few minutes to play with the code and see if you can move, resize, and change the color of the triangle. OpenGL can be  _very_  intimidating, and it can feel at times like its difficult to understand what’s going on, but understand that this isn’t magic - it only looks like it is. - -In the next part of the tutorial we’ll make a square out of two right-angled triangles - see if you can try and figure this part out before moving on. If not, don’t worry because we’ll be walking through the code in [Part 2][31], followed by creating a full grid of squares that will act as our game board. - -Finally, in [Part 3][32] we continue by using the grid to implement  _Conway’s Game of Life!_ - - _[Part 1: Hello, OpenGL][14]_  |  _[Part 2: Drawing the Game Board][15]_  |  _[Part 3: Implementing the Game][16]_ - - _The full source code of the tutorial is available on [GitHub][17]._ - -### Checkpoint - -Here’s the contents of **main.go** at this point of the tutorial: - -``` -package main - -import ( - "fmt" - "log" - "runtime" - "strings" - - "github.com/go-gl/gl/v4.1-core/gl" // OR: github.com/go-gl/gl/v2.1/gl - "github.com/go-gl/glfw/v3.2/glfw" -) - -const ( - width = 500 - height = 500 - - vertexShaderSource = ` - #version 410 - in vec3 vp; - void main() { - gl_Position = vec4(vp, 1.0); - } - ` + "\x00" - - fragmentShaderSource = ` - #version 410 - out vec4 frag_colour; - void main() { - frag_colour = vec4(1, 1, 1, 1.0); - } - ` + "\x00" -) - -var ( - triangle = []float32{ - 0, 0.5, 0, - -0.5, -0.5, 0, - 0.5, -0.5, 0, - } -) - -func main() { - runtime.LockOSThread() - - window := initGlfw() - defer glfw.Terminate() - program := initOpenGL() - - vao := makeVao(triangle) - for !window.ShouldClose() { - draw(vao, window, program) - } -} - -func draw(vao uint32, window *glfw.Window, program uint32) { - gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) - gl.UseProgram(program) - - gl.BindVertexArray(vao) - gl.DrawArrays(gl.TRIANGLES, 0, int32(len(triangle)/3)) - - glfw.PollEvents() - window.SwapBuffers() -} - -// initGlfw initializes glfw and returns a Window to use. -func initGlfw() *glfw.Window { - if err := glfw.Init(); err != nil { - panic(err) - } - glfw.WindowHint(glfw.Resizable, glfw.False) - glfw.WindowHint(glfw.ContextVersionMajor, 4) - glfw.WindowHint(glfw.ContextVersionMinor, 1) - glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) - glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True) - - window, err := glfw.CreateWindow(width, height, "Conway's Game of Life", nil, nil) - if err != nil { - panic(err) - } - window.MakeContextCurrent() - - return window -} - -// initOpenGL initializes OpenGL and returns an intiialized program. -func initOpenGL() uint32 { - if err := gl.Init(); err != nil { - panic(err) - } - version := gl.GoStr(gl.GetString(gl.VERSION)) - log.Println("OpenGL version", version) - - vertexShader, err := compileShader(vertexShaderSource, gl.VERTEX_SHADER) - if err != nil { - panic(err) - } - - fragmentShader, err := compileShader(fragmentShaderSource, gl.FRAGMENT_SHADER) - if err != nil { - panic(err) - } - - prog := gl.CreateProgram() - gl.AttachShader(prog, vertexShader) - gl.AttachShader(prog, fragmentShader) - gl.LinkProgram(prog) - return prog -} - -// makeVao initializes and returns a vertex array from the points provided. -func makeVao(points []float32) uint32 { - var vbo uint32 - gl.GenBuffers(1, &vbo) - gl.BindBuffer(gl.ARRAY_BUFFER, vbo) - gl.BufferData(gl.ARRAY_BUFFER, 4*len(points), gl.Ptr(points), gl.STATIC_DRAW) - - var vao uint32 - gl.GenVertexArrays(1, &vao) - gl.BindVertexArray(vao) - gl.EnableVertexAttribArray(0) - gl.BindBuffer(gl.ARRAY_BUFFER, vbo) - gl.VertexAttribPointer(0, 3, gl.FLOAT, false, 0, nil) - - return vao -} - -func compileShader(source string, shaderType uint32) (uint32, error) { - shader := gl.CreateShader(shaderType) - - csources, free := gl.Strs(source) - gl.ShaderSource(shader, 1, csources, nil) - free() - gl.CompileShader(shader) - - var status int32 - gl.GetShaderiv(shader, gl.COMPILE_STATUS, &status) - if status == gl.FALSE { - var logLength int32 - gl.GetShaderiv(shader, gl.INFO_LOG_LENGTH, &logLength) - - log := strings.Repeat("\x00", int(logLength+1)) - gl.GetShaderInfoLog(shader, logLength, nil, gl.Str(log)) - - return 0, fmt.Errorf("failed to compile %v: %v", source, log) - } - - return shader, nil -} -``` -Let me know if this post was helpful on Twitter [@kylewbanks][33] or down below, and follow me to keep up with future posts! - --------------------------------------------------------------------------------- - -via: https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-1-hello-opengl - -作者:[kylewbanks ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://twitter.com/kylewbanks -[1]:https://kylewbanks.com/category/golang -[2]:https://kylewbanks.com/category/opengl -[3]:https://twitter.com/intent/tweet?text=OpenGL%20%26%20Go%20Tutorial%20Part%201%3A%20Hello%2C%20OpenGL%20https%3A%2F%2Fkylewbanks.com%2Fblog%2Ftutorial-opengl-with-golang-part-1-hello-opengl%20by%20%40kylewbanks -[4]:mailto:?subject=Check%20Out%20%22OpenGL%20%26%20Go%20Tutorial%20Part%201%3A%20Hello%2C%20OpenGL%22&body=https%3A%2F%2Fkylewbanks.com%2Fblog%2Ftutorial-opengl-with-golang-part-1-hello-opengl -[5]:https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fkylewbanks.com%2Fblog%2Ftutorial-opengl-with-golang-part-1-hello-opengl -[6]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-1-hello-opengl -[7]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-2-drawing-the-game-board -[8]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-3-implementing-the-game -[9]:https://github.com/KyleBanks/conways-gol -[10]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-1-hello-opengl -[11]:http://www.glfw.org/ -[12]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-2-drawing-the-game-board -[13]:https://kylewbanks.com/blog/blog/tutorial-opengl-with-golang-part-3-implementing-the-game -[14]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-1-hello-opengl -[15]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-2-drawing-the-game-board -[16]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-3-implementing-the-game -[17]:https://github.com/KyleBanks/conways-gol -[18]:https://twitter.com/kylewbanks -[19]:https://www.opengl.org/ -[20]:https://golang.org/ -[21]:https://github.com/go-gl/gl -[22]:https://en.wikipedia.org/wiki/Conway's_Game_of_Life -[23]:https://github.com/KyleBanks/conways-gol -[24]:https://en.wikipedia.org/wiki/Conway's_Game_of_Life -[25]:https://github.com/KyleBanks/conways-gol -[26]:http://www.glfw.org/ -[27]:https://github.com/go-gl/glfw -[28]:http://www.glfw.org/docs/latest/window_guide.html#buffer_swap -[29]:https://www.quora.com/What-is-a-vertex-shader-and-what-is-a-fragment-shader/answer/Harold-Serrano?srid=aVb -[30]:https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/glsl_overview.php -[31]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-2-drawing-the-game-board -[32]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-3-implementing-the-game -[33]:https://twitter.com/kylewbanks diff --git a/translated/tech/20170312 OpenGL Go Tutorial Part 1.md b/translated/tech/20170312 OpenGL Go Tutorial Part 1.md new file mode 100644 index 0000000000..a419e08806 --- /dev/null +++ b/translated/tech/20170312 OpenGL Go Tutorial Part 1.md @@ -0,0 +1,570 @@ +OpenGL 与 Go 教程 第一节: Hello, OpenGL +============================================================ + + _[第一节: Hello, OpenGL][6]_  |  _[第二节: 绘制游戏面板][7]_  |  _[第三节: 实现游戏功能][8]_ + + _这篇教程的所有源代码都可以在 [GitHub][9] 上找到。_ + +### 介绍 + +[OpenGL][19] 是一门相当好的技术,适用于多种类型的绘图工作,从桌面的 GUI 到游戏,到移动应用甚至 web 应用。我敢保证,你今天看到的图形有些就是用 OpenGL 渲染的。可是,不管 OpenGL 多受欢迎、有多好用,与学习其它高层次的绘图库相比,学习 OpenGL 是要相当足够的决心的。 + +这个教程的目的是给你一个切入点,让你对 OpenGL 有个基本的了解,然后教你怎么用 [Go][20] 操作它。几乎每种编程语言都有绑定 OpenGL 的库,Go 也不例外,它有 [go-gl][21] 这个包。这是一个完整的套件,可以绑定 OpenGL ,适用于多种版本的 OpenGL。 + +这篇教程会按照下面列出的几个阶段进行介绍,我们最终的目标是用 OpenGL 在桌面窗口绘制游戏面板,进而实现 [Conway's Game of Life][22]。完整的源代码可以在 GitHub [github.com/KyleBanks/conways-gol][23] 上获得,当你有疑惑的时候可以随时查看源代码,或者你要按照自己的方式学习也可以参考这个代码。 + +在我们开始之前,我们要先弄明白 _Conway's Game of Life_ 到底是什么。这里是 [Wikipedia][24] 上面的总结: + +> 《Game of Life》,也可以简称为 Life,是一个细胞自动变化的过程,由英国数学家 John Horton Conway 于 1970 年提出。 +> +> 这个“游戏”没有玩家,也就是说它的发展依靠的是它的初始状态,不需要输入。用户通过创建初始配置文件、观察它如何演变,或者对于高级“玩家”可以创建特殊属性的模式,进而与《Game of Life》进行交互。 +> +> 规则 +> +> 《Game of Life》的世界是一个无穷多的二维正交的正方形细胞的格子,每一个格子都有两种可能的状态,“存活”或者“死亡”,也可以说是“填充态”或“未填充态”(区别可能很小,除非把它看作一个模拟人类/哺乳动物行为的早期模型,或者在一个人如何看待方格里的空白时)。每一个细胞与它周围的八个细胞相关联,这八个细胞分别是水平、垂直、斜对角相接的。在游戏中的每一步,下列事情中的一件将会发生: +> +> 1. 任何存活着的细胞当任何一个存活的 cell 的附近少于 2 个存活的 cell 时,该 cell 将会消亡,就像人口过少所导致的结果一样 +> 2. 当任何一个存活的 cell 的附近有 2 至 3 个存活的 cell 时,该 cell 在下一代中仍然存活。 +> 3. 当任何一个存活的 cell 的附近多于 3 个存活的 cell 时,该 cell 将会消亡,就像人口过多所导致的结果一样 +> 4. 任何一个消亡的 cell 附近刚好有 3 个存活的 cell,该 cell 会变为存活的状态,就像重生一样。 + +不需要其他工具,这里由一个我们将会制作的演示程序: + + ![OpenGL 与 Go 语言教程中的 Conway's Game of Life - 示例游戏](https://kylewbanks.com/images/post/golang-opengl-conway-1.gif) + +在我们的运行过程中,白色的细胞表示它是存活着的,黑色的细胞表示它已经死亡。 + +### 概述 + +本教程将会涉及到很多基础内容,从最基本的开始,但是你还是要对 Go 由一些最基本的了解 - 至少你应该知道变量,切片,函数和结构体,并且装了一个 Go 的运行环境。我写这篇教程用的 Go 版本是 1.8,但它应该与之前的版本兼容。这里用 Go 语言实现没有什么特别新奇的东西,因此只要你有过类似的编程经历就行。 + +这里是我们在这个教程里将会讲到的东西: + +* [第一节: Hello, OpenGL][10]: 安装 OpenGL 和 [GLFW][11],在窗口上绘制一个三角形。 +* [第二节: 绘制游戏面板][12]: 用三角形拼成方形,在窗口上用方形绘成格子。 +* [第三节: 实现游戏功能][13]: 实现 Conway 游戏 + +最后的源代码可以在 [GitHub][25] 上获得,每一节的末尾有个_回顾_,包含该节相关的代码。如果有什么不清楚的地方或者是你感到疑惑的,看看每一节末尾的完整代码。 + +现在就开始吧! + +### 安装 OpenGL 和 GLFW + +我们介绍过 OpenGL,但是为了使用它,我们要有个窗口可以绘制东西。 [GLFW][26] 是一款对于 OpenGL 跨平台的 API,允许我们创建窗口并使用,而且它是 [go-gl][27] 套件中提供的。 + +我们要做的第一件事就是确定 OpenGL 的版本。为了方便本教程,我们将会使用 **OpenGL v4.1**,但你也可以用 **v2.1** 要是你的操作系统不支持最新的 OpenGL。要安装 OpenGL,我们需要做这些事: + +``` +# 对于 OpenGL 4.1 +$ go get github.com/go-gl/gl/v4.1-core/gl + +# 或者 2.1 +$ go get github.com/go-gl/gl/v2.1/gl +``` + +然后是安装 GLFW: + +``` +$ go get github.com/go-gl/glfw/v3.2/glfw +``` + +安装好这两个包之后,我们就可以开始了!先创建 **main.go** 文件,导入相应的包(我们待会儿会用到的其他东西)。 + +``` +package main + +import ( + "log" + "runtime" + + "github.com/go-gl/gl/v4.1-core/gl" // OR: github.com/go-gl/gl/v2.1/gl + "github.com/go-gl/glfw/v3.2/glfw" +) +``` + +Next lets define the **main** function, the purpose of which is to initialize OpenGL and GLFW and display the window: +接下来定义一个叫做 **main** 的函数,这是用来初始化 OpenGL 以及 GLFW,显示窗口的: + +``` +const ( + width = 500 + height = 500 +) + +func main() { + runtime.LockOSThread() + + window := initGlfw() + defer glfw.Terminate() + + for !window.ShouldClose() { + // TODO + } +} + +// initGlfw 初始化 glfw 并且返回一个可用的窗口。 +func initGlfw() *glfw.Window { + if err := glfw.Init(); err != nil { + panic(err) + } + + glfw.WindowHint(glfw.Resizable, glfw.False) + glfw.WindowHint(glfw.ContextVersionMajor, 4) // OR 2 + glfw.WindowHint(glfw.ContextVersionMinor, 1) + glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) + glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True) + + window, err := glfw.CreateWindow(width, height, "Conway's Game of Life", nil, nil) + if err != nil { + panic(err) + } + window.MakeContextCurrent() + + return window +} +``` + +好了,让我们花一分钟来运行一下这个程序,看看会发生什么。首先定义了一些常量, **width** 和 **height** - 它们决定窗口的像素大小。 + +然后就是 **main** 函数。这里我们使用了 **runtime** 包的 **LockOSThread()**,这能确保我们总是在操作系统的一个线程中运行代码,这对 GLFW 来说很重要,GLFW 被初始化之后需要在同一个进程里被调用多次。讲完这个,接下来我们调用 **initGlfw** 来获得一个窗口的引用,并且 defer glfw 的 terminating 方法。窗口的引用会被用在一个 for 循环中,只要窗口是打开的状态,就执行某些事情。我们待会儿会讲要做的事情是什么。 + +**initGlfw** 是另一个函数,这里我们调用 **glfw.Init()** 来初始化 GLFW 包。然后我们定义了 GLFW 的一些全局属性,包括禁用调整窗口大小和改变 OpenGL 的属性。然后创建了 **glfw.Window**,这会在稍后的绘图中用到。我们仅仅告诉它我们想要的宽度和高度,以及标题,然后调用 **window.MakeContextCurrent**,将窗口绑定到当前的进程中。最后就是返回窗口的引用了。 + +如果你现在就构建、运行这个程序,你看不到任何东西。很合理,因为我们还没有用这个窗口做什么实质性的事。 + +定义一个新函数,初始化 OpenGL,就可以解决这个问题: + +``` +// initOpenGL 初始化 OpenGL 并且返回一个初始化了的程序。 +func initOpenGL() uint32 { + if err := gl.Init(); err != nil { + panic(err) + } + version := gl.GoStr(gl.GetString(gl.VERSION)) + log.Println("OpenGL version", version) + + prog := gl.CreateProgram() + gl.LinkProgram(prog) + return prog +} +``` + +**initOpenGL** 就像之前的 **initGlfw** 函数一样,初始化 OpenGL 库,创建一个_程序_。这个程序是一个包含了着色器的引用,稍后会用于绘图。待会儿会讲这一点,现在只用知道 OpenGL 已经初始化完成了,我们有一个 **program** 的引用。我们还打印了 OpenGL 的版本,这对于 debug 很有帮助。 + +回到 **main** 函数里,调用这个新函数: + +``` +func main() { + runtime.LockOSThread() + + window := initGlfw() + defer glfw.Terminate() + + program := initOpenGL() + + for !window.ShouldClose() { + draw(window, program) + } +} +``` + +你应该注意到了现在我们有 **program** 的引用,在我们的窗口循环中,调用新的 **draw** 函数。最终这个函数会绘制出所有细胞,让游戏状态变得可视化,但是现在它做的仅仅是情况窗口,所以我们只能看到一个全黑的屏幕: + +``` +func draw(window *glfw.Window, program uint32) { + gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) + gl.UseProgram(prog) + + glfw.PollEvents() + window.SwapBuffers() +} +``` + +我们首先做的是调用 **gl.clear** 函数来清除上一帧在窗口中绘制的东西,给我们一个干净的面板。然后我们告诉 OpenGL 去使用程序引用,这个引用还没有做什么事。最终我们告诉 GLFW 用 **PollEvents** 去检查是否有鼠标或者键盘事件(这一节里还不会对这些事件进行处理),告诉窗口 **SwapBuffers**。 [Buffer swapping][28](交换缓冲区) 很重要,因为 GLFW(像其他图形库一样)使用双缓冲,也就是说你绘制的所有东西实际上是绘制到一个不可见的画布上,当你准备好进行展示的时候就把绘制的这些东西放到可见的画布中 - 这种情况下,就需要调用 **SwapBuffers** 函数。 + +好了,到这里我们已经讲了很多东西,花一点时间看看我们的实验成果。运行这个程序,你应该可以看到你所绘制的第一个东西: + + ![OpenGL 与 Go 语言教程中的 Conway's Game of Life - 第一个窗口](https://kylewbanks.com/images/post/golang-opengl-conway-2.png) + +完美! + +### 在窗口里绘制三角形 + +我们已经完成了一些复杂的步骤,即使看上去和图片不像,但我们仍然需要绘制一些东西。我们会以三角形绘制开始,可能这第一眼看上去要比我们最终要绘制的方形更难,但你会知道这样的想法是错的。你可能不知道的是三角形或许是绘制的图形中最简单的,实际上我们最终会用某种方式把三角形拼成方形。 + +好吧,那么我们想要绘制一个三角形,怎么做呢?我们通过定义图形的顶点来绘制图形,把它们交给 OpenGL 来进行绘制。先在 **main.go** 的顶部里定义我们的三角形: + +``` +var ( + triangle = []float32{ + 0, 0.5, 0, // top + -0.5, -0.5, 0, // left + 0.5, -0.5, 0, // right + } +) +``` + +这看上去很奇怪,让我们分开来看。首先我们用了一个 **float32** 切片(slice),这是一种我们总会在向 OpenGL 传递顶点时用到的数据类型。这个切片包含 9 个值,每三个值构成三角形的一个点。第一行, **0, 0.5, 0** 表示的是 X、Y、Z 坐标,是最上方的顶点,第二行是左边的顶点,第三行是右边的顶点。每一组的三个点都表示相对于窗口中心点的 X、Y、Z 坐标,在 **-1 和 1** 之间。因此最上面的顶点 X 坐标是 0,因为它在 X 方向上位于窗口中央,Y 坐标是 _0.5_ 意味着它会相对窗口中央上移 1/4 个单位(因为窗口的范围是 -1 到 1),Z 坐标是 0.因为我们只需要在二维空间中绘图,所以 Z 值永远是 0。现在看一看左右两边的顶点,看看你能不能理解为什么它们是这样定义的 —— 如果不能立刻就弄清楚也没关系,我们将会在屏幕上去观察它,因此我们需要一个完美的图形来进行观察。 + +好了,我们定义了一个三角形,但是现在我们得把它画出来。要画出这个三角形,我们需要一个叫做 **Vertex Array Object** 或者叫 **vao** 的东西,这是由一系列的点(也就是我们定义的三角形)创造的,这个东西可以提供给 OpenGL 来进行绘制。创建一个叫做 **makeVao** 的函数,然后我们可以提供一组切片的点,让它返回一个指向 OpenGL vertex array object 的指针: + +``` +// makeVao 执行初始化并从提供的点里面返回一个顶点数组 +func makeVao(points []float32) uint32 { + var vbo uint32 + gl.GenBuffers(1, &vbo) + gl.BindBuffer(gl.ARRAY_BUFFER, vbo) + gl.BufferData(gl.ARRAY_BUFFER, 4*len(points), gl.Ptr(points), gl.STATIC_DRAW) + + var vao uint32 + gl.GenVertexArrays(1, &vao) + gl.BindVertexArray(vao) + gl.EnableVertexAttribArray(0) + gl.BindBuffer(gl.ARRAY_BUFFER, vbo) + gl.VertexAttribPointer(0, 3, gl.FLOAT, false, 0, nil) + + return vao +} +``` + +首先我们创造了 **Vertex Buffer Object** 或者说 **vbo** 绑定到我们的 **vao** 上,**vbo** 是通过所占空间(也就是**4 x len(points)**大小的空间)和一个指向顶点的指针(**gl.Ptr(points)**)来创建的。你也许会好奇为什么它是 **4 x len(points)** - 而不是 6 或者 3 或者 1078 呢?原因在于我们用的是 **float32** 切片,32 个 bit 的 float 浮点型变量是 4 个字节,因此我们说这个缓冲区以字节为单位的大小是点个数的 4 倍。 + +现在我们有缓冲区了,可以创建 **vao** 并用 **gl.BindBuffer** 把它绑定到缓冲区上,最后返回 **vao**。这个 **vao** 将会被用于绘制三角形! + +回到 **main** 函数: + +``` +func main() { + ... + + vao := makeVao(triangle) + for !window.ShouldClose() { + draw(vao, window, program) + } +} + +这里我们调用了 **makeVao** ,从我们之前定义的 **triangle** 顶点中获得 **vao** 引用,将它作为一个新的参数传递给 **draw** 函数: + +func draw(vao uint32, window *glfw.Window, program uint32) { + gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) + gl.UseProgram(program) + + gl.BindVertexArray(vao) + gl.DrawArrays(gl.TRIANGLES, 0, int32(len(triangle) / 3)) + + glfw.PollEvents() + window.SwapBuffers() +} +``` + +然后我们把 OpenGL 绑定到 **vao** 上,这样当我们告诉 OpenGL 三角形切片的顶点数(除以 3,是因为每一个点有 X、Y、Z 坐标),让它去 **DrawArrays** ,它就知道要画多少个顶点了。 + +如果你这时候运行程序,你可能希望在窗口中央看到一个美丽的三角形,但是不幸的是你还看不到。还有一件事情没做,我们告诉 OpenGL 我们要画一个三角形,但是我们还要告诉它_怎么_画出来。 + +要让它画出来,我们需要叫做片元着色器和顶点着色器的东西,这些已经超出本教程的范围了(老实说,也超出了我对 OpenGL 的了解),但 [Harold Serrano On Quora][29] 关于它们是什么给出了完美的介绍。我们只需要理解,对于这个应用来说,着色器是它内部的小程序(用 [OpenGL Shader Language or GLSL][30] 编写的),操作顶点进行绘制,也可用于确定图形的颜色。 + +添加两个 imports 和一个叫做 **compileShader** 的函数: + +``` +import ( + "strings" + "fmt" +) + +func compileShader(source string, shaderType uint32) (uint32, error) { + shader := gl.CreateShader(shaderType) + + csources, free := gl.Strs(source) + gl.ShaderSource(shader, 1, csources, nil) + free() + gl.CompileShader(shader) + + var status int32 + gl.GetShaderiv(shader, gl.COMPILE_STATUS, &status) + if status == gl.FALSE { + var logLength int32 + gl.GetShaderiv(shader, gl.INFO_LOG_LENGTH, &logLength) + + log := strings.Repeat("\x00", int(logLength+1)) + gl.GetShaderInfoLog(shader, logLength, nil, gl.Str(log)) + + return 0, fmt.Errorf("failed to compile %v: %v", source, log) + } + + return shader, nil +} +``` + +这个函数的目的是以字符串的形式接受着色器源代码和它的类型,然后返回一个指向这个编译好的着色器的指针。如果编译失败,我们就会获得出错的详细信息。 + +现在定义着色器,在 **makeProgram** 里编译。回到我们的 **const** 块中,我们在这里定义了 **width** 和 **hegiht**。 + +``` +vertexShaderSource = ` + #version 410 + in vec3 vp; + void main() { + gl_Position = vec4(vp, 1.0); + } +` + "\x00" + +fragmentShaderSource = ` + #version 410 + out vec4 frag_colour; + void main() { + frag_colour = vec4(1, 1, 1, 1); + } +` + "\x00" +``` + +你能看到这是两个着色器程序,包含了 GLSL 源代码的字符串,一个是_顶点着色器_,另一个是_片元着色器_。唯一比较特殊的地方是它们都要在末尾加上一个空终止字符,**\x00** —— OpenGL 需要它才能编译着色器。注意 **fragmentShaderSource**,这是我们用 RGBA 形式的值通过 **vec4** 来定义我们图形的颜色。你可以修改这里的值来改变这个三角形的颜色,现在的值是 **RGBA(1, 1, 1, 1)** 或者说是 _white_。 + +同样需要注意的是这两个程序都是运行在 **#version 410** 版本下,如果你用的是 OpenGL 2.1,那你也可以改成 **#version 120**。**120** 不是打错的,如果你用的是 OpenGL 2.1,要用 **120** 而不是 **210**! + +接下来在 **initOpenGL** 中我们会编译着色器,把它们附加到我们的 **program** 中。 + +``` +func initOpenGL() uint32 { + if err := gl.Init(); err != nil { + panic(err) + } + version := gl.GoStr(gl.GetString(gl.VERSION)) + log.Println("OpenGL version", version) + + vertexShader, err := compileShader(vertexShaderSource, gl.VERTEX_SHADER) + if err != nil { + panic(err) + } + fragmentShader, err := compileShader(fragmentShaderSource, gl.FRAGMENT_SHADER) + if err != nil { + panic(err) + } + + prog := gl.CreateProgram() + gl.AttachShader(prog, vertexShader) + gl.AttachShader(prog, fragmentShader) + gl.LinkProgram(prog) + return prog +} +``` + +这里我们用 _顶点着色器_ 调用了 **compileShader** 函数,指定它的类型是 **gl.VERTEX_SHADER**,对 _片元着色器_ 做了同样的事情,但是指定的类型是 **gl.FRAGMENT_SHADER**。编译完成后,我们把它们附加到程序中,调用 **gl.AttachShader**,传递程序以及编译好的着色器。 + +现在我们终于可以看到我们漂亮的三角形了!运行程序,如果一切顺利的话你会看到这些: + + ![OpenGL 与 Go 语言教程中的 Conway's Game of Life - Hello, Triangle!](https://kylewbanks.com/images/post/golang-opengl-conway-3.png) + +### 总结 + +是不是很惊喜!这些代码画出了一个三角形,但我保证我们已经完成了大部分的 OpenGL 代码,在接下来的章节中我们还会用到这些代码。我十分推荐你花几分钟修改一下代码,看看你能不能移动三角形,改变三角形的大小和颜色。OpenGL 可以令人心生畏惧,有时想要理解发生了什么很困难,但是要记住,这不是魔术 - 它就是它看上去的东西。 + +下一节里我们讲会用两个锐角三角形拼出一个方形 - 看看你能不能试着修改这一节的代码,再进入下一节。不能也没有关系,因为我们在 [第二节][31] 还会编写代码, 按照创建一个有许多方形的格子,我们把它当做游戏面板。 + +最后,在[第三节][32] 里我们会用格子来实现 _Conway’s Game of Life_! + + _[第一节: Hello, OpenGL][14]_ | _[第二节: 绘制游戏面板][15]_ | _[第三节:实现游戏功能][16]_ + + _本教程的完整源代码可在 [GitHub][17] 上获得。_ + +### 回顾 + +本教程 **main.go** 文件的内容如下: + +``` +package main + +import ( + "fmt" + "log" + "runtime" + "strings" + + "github.com/go-gl/gl/v4.1-core/gl" // OR: github.com/go-gl/gl/v2.1/gl + "github.com/go-gl/glfw/v3.2/glfw" +) + +const ( + width = 500 + height = 500 + + vertexShaderSource = ` + #version 410 + in vec3 vp; + void main() { + gl_Position = vec4(vp, 1.0); + } + ` + "\x00" + + fragmentShaderSource = ` + #version 410 + out vec4 frag_colour; + void main() { + frag_colour = vec4(1, 1, 1, 1.0); + } + ` + "\x00" +) + +var ( + triangle = []float32{ + 0, 0.5, 0, + -0.5, -0.5, 0, + 0.5, -0.5, 0, + } +) + +func main() { + runtime.LockOSThread() + + window := initGlfw() + defer glfw.Terminate() + program := initOpenGL() + + vao := makeVao(triangle) + for !window.ShouldClose() { + draw(vao, window, program) + } +} + +func draw(vao uint32, window *glfw.Window, program uint32) { + gl.Clear(gl.COLOR_BUFFER_BIT | gl.DEPTH_BUFFER_BIT) + gl.UseProgram(program) + + gl.BindVertexArray(vao) + gl.DrawArrays(gl.TRIANGLES, 0, int32(len(triangle)/3)) + + glfw.PollEvents() + window.SwapBuffers() +} + +// initGlfw 初始化 glfw 并返回一个窗口供使用。 +func initGlfw() *glfw.Window { + if err := glfw.Init(); err != nil { + panic(err) + } + glfw.WindowHint(glfw.Resizable, glfw.False) + glfw.WindowHint(glfw.ContextVersionMajor, 4) + glfw.WindowHint(glfw.ContextVersionMinor, 1) + glfw.WindowHint(glfw.OpenGLProfile, glfw.OpenGLCoreProfile) + glfw.WindowHint(glfw.OpenGLForwardCompatible, glfw.True) + + window, err := glfw.CreateWindow(width, height, "Conway's Game of Life", nil, nil) + if err != nil { + panic(err) + } + window.MakeContextCurrent() + + return window +} + +// initOpenGL 初始化 OpenGL 并返回一个已经编译好的着色器程序 +func initOpenGL() uint32 { + if err := gl.Init(); err != nil { + panic(err) + } + version := gl.GoStr(gl.GetString(gl.VERSION)) + log.Println("OpenGL version", version) + + vertexShader, err := compileShader(vertexShaderSource, gl.VERTEX_SHADER) + if err != nil { + panic(err) + } + + fragmentShader, err := compileShader(fragmentShaderSource, gl.FRAGMENT_SHADER) + if err != nil { + panic(err) + } + + prog := gl.CreateProgram() + gl.AttachShader(prog, vertexShader) + gl.AttachShader(prog, fragmentShader) + gl.LinkProgram(prog) + return prog +} + +// makeVao 执行初始化并从提供的点里面返回一个顶点数组 +func makeVao(points []float32) uint32 { + var vbo uint32 + gl.GenBuffers(1, &vbo) + gl.BindBuffer(gl.ARRAY_BUFFER, vbo) + gl.BufferData(gl.ARRAY_BUFFER, 4*len(points), gl.Ptr(points), gl.STATIC_DRAW) + + var vao uint32 + gl.GenVertexArrays(1, &vao) + gl.BindVertexArray(vao) + gl.EnableVertexAttribArray(0) + gl.BindBuffer(gl.ARRAY_BUFFER, vbo) + gl.VertexAttribPointer(0, 3, gl.FLOAT, false, 0, nil) + + return vao +} + +func compileShader(source string, shaderType uint32) (uint32, error) { + shader := gl.CreateShader(shaderType) + + csources, free := gl.Strs(source) + gl.ShaderSource(shader, 1, csources, nil) + free() + gl.CompileShader(shader) + + var status int32 + gl.GetShaderiv(shader, gl.COMPILE_STATUS, &status) + if status == gl.FALSE { + var logLength int32 + gl.GetShaderiv(shader, gl.INFO_LOG_LENGTH, &logLength) + + log := strings.Repeat("\x00", int(logLength+1)) + gl.GetShaderInfoLog(shader, logLength, nil, gl.Str(log)) + + return 0, fmt.Errorf("failed to compile %v: %v", source, log) + } + + return shader, nil +} +``` + +请在 Twitter [@kylewbanks][33] 上告诉我这篇文章对你是否有帮助,或者点击下方的关注,以便及时获取最新文章! + +-------------------------------------------------------------------------------- + +via: https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-1-hello-opengl + +作者:[kylewbanks ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://twitter.com/kylewbanks +[1]:https://kylewbanks.com/category/golang +[2]:https://kylewbanks.com/category/opengl +[3]:https://twitter.com/intent/tweet?text=OpenGL%20%26%20Go%20Tutorial%20Part%201%3A%20Hello%2C%20OpenGL%20https%3A%2F%2Fkylewbanks.com%2Fblog%2Ftutorial-opengl-with-golang-part-1-hello-opengl%20by%20%40kylewbanks +[4]:mailto:?subject=Check%20Out%20%22OpenGL%20%26%20Go%20Tutorial%20Part%201%3A%20Hello%2C%20OpenGL%22&body=https%3A%2F%2Fkylewbanks.com%2Fblog%2Ftutorial-opengl-with-golang-part-1-hello-opengl +[5]:https://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Fkylewbanks.com%2Fblog%2Ftutorial-opengl-with-golang-part-1-hello-opengl +[6]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-1-hello-opengl +[7]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-2-drawing-the-game-board +[8]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-3-implementing-the-game +[9]:https://github.com/KyleBanks/conways-gol +[10]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-1-hello-opengl +[11]:http://www.glfw.org/ +[12]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-2-drawing-the-game-board +[13]:https://kylewbanks.com/blog/blog/tutorial-opengl-with-golang-part-3-implementing-the-game +[14]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-1-hello-opengl +[15]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-2-drawing-the-game-board +[16]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-3-implementing-the-game +[17]:https://github.com/KyleBanks/conways-gol +[18]:https://twitter.com/kylewbanks +[19]:https://www.opengl.org/ +[20]:https://golang.org/ +[21]:https://github.com/go-gl/gl +[22]:https://en.wikipedia.org/wiki/Conway's_Game_of_Life +[23]:https://github.com/KyleBanks/conways-gol +[24]:https://en.wikipedia.org/wiki/Conway's_Game_of_Life +[25]:https://github.com/KyleBanks/conways-gol +[26]:http://www.glfw.org/ +[27]:https://github.com/go-gl/glfw +[28]:http://www.glfw.org/docs/latest/window_guide.html#buffer_swap +[29]:https://www.quora.com/What-is-a-vertex-shader-and-what-is-a-fragment-shader/answer/Harold-Serrano?srid=aVb +[30]:https://www.opengl.org/sdk/docs/tutorials/ClockworkCoders/glsl_overview.php +[31]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-2-drawing-the-game-board +[32]:https://kylewbanks.com/blog/tutorial-opengl-with-golang-part-3-implementing-the-game +[33]:https://twitter.com/kylewbanks From 888943b6719cf711269165b0c58ddddb4fcfedf3 Mon Sep 17 00:00:00 2001 From: Ezio Date: Wed, 2 Aug 2017 21:11:27 +0800 Subject: [PATCH 0888/1407] =?UTF-8?q?20170802-5=20=E9=80=89=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...Kubernetes cluster for Linux containers.md | 276 ++++++++++++++++++ 1 file changed, 276 insertions(+) create mode 100644 sources/tech/20170801 Deploy Kubernetes cluster for Linux containers.md diff --git a/sources/tech/20170801 Deploy Kubernetes cluster for Linux containers.md b/sources/tech/20170801 Deploy Kubernetes cluster for Linux containers.md new file mode 100644 index 0000000000..8631d73edb --- /dev/null +++ b/sources/tech/20170801 Deploy Kubernetes cluster for Linux containers.md @@ -0,0 +1,276 @@ +Deploy Kubernetes cluster for Linux containers +============================================================ + +In this quick start, a Kubernetes cluster is deployed using the Azure CLI. A multi-container application consisting of web front-end and a Redis instance is then deployed and run on the cluster. Once completed, the application is accessible over the internet. + +![Image of browsing to Azure Vote](https://docs.microsoft.com/en-us/azure/container-service/kubernetes/media/container-service-kubernetes-walkthrough/azure-vote.png) + +This quick start assumes a basic understanding of Kubernetes concepts, for detailed information on Kubernetes see the [Kubernetes documentation][3]. + +If you don't have an Azure subscription, create a [free account][4] before you begin. + +### Launch Azure Cloud Shell + +The Azure Cloud Shell is a free Bash shell that you can run directly within the Azure portal. It has the Azure CLI preinstalled and configured to use with your account. Click the Cloud Shell button on the menu in the upper-right of the [Azure portal][5]. + + [![Cloud Shell](https://docs.microsoft.com/en-us/azure/includes/media/cloud-shell-try-it/cloud-shell-menu.png)][6] + +The button launches an interactive shell that you can use to run all of the steps in this topic: + + [![Screenshot showing the Cloud Shell window in the portal](https://docs.microsoft.com/en-us/azure/includes/media/cloud-shell-try-it/cloud-shell-safari.png)][7] + +If you choose to install and use the CLI locally, this quickstart requires that you are running the Azure CLI version 2.0.4 or later. Run `az --version` to find the version. If you need to install or upgrade, see [Install Azure CLI 2.0][8]. + +### Create a resource group + +Create a resource group with the [az group create][9] command. An Azure resource group is a logical group in which Azure resources are deployed and managed. + +The following example creates a resource group named  _myResourceGroup_  in the  _eastus_  location. + +Azure CLICopyTry It + +``` +az group create --name myResourceGroup --location eastus + +``` + +Output: + +JSONCopy + +``` +{ + "id": "/subscriptions/00000000-0000-0000-0000-000000000000/resourceGroups/myResourceGroup", + "location": "eastus", + "managedBy": null, + "name": "myResourceGroup", + "properties": { + "provisioningState": "Succeeded" + }, + "tags": null +} + +``` + +### Create Kubernetes cluster + +Create a Kubernetes cluster in Azure Container Service with the [az acs create][10]command. The following example creates a cluster named  _myK8sCluster_  with one Linux master node and three Linux agent nodes. + +Azure CLICopyTry It + +``` +az acs create --orchestrator-type=kubernetes --resource-group myResourceGroup --name=myK8sCluster --generate-ssh-keys + +``` + +After several minutes, the command completes and returns json formatted information about the cluster. + +### Connect to the cluster + +To manage a Kubernetes cluster, use [kubectl][11], the Kubernetes command-line client. + +If you're using Azure CloudShell, kubectl is already installed. If you want to install it locally, you can use the [az acs kubernetes install-cli][12] command. + +To configure kubectl to connect to your Kubernetes cluster, run the [az acs kubernetes get-credentials][13] command. This steps downloads credentials and configures the Kubernetes CLI to use them. + +Azure CLICopyTry It + +``` +az acs kubernetes get-credentials --resource-group=myResourceGroup --name=myK8sCluster + +``` + +To verify the connection to your cluster, use the [kubectl get][14] command to return a list of the cluster nodes. + +Azure CLICopyTry It + +``` +kubectl get nodes + +``` + +Output: + +bashCopy + +``` +NAME STATUS AGE VERSION +k8s-agent-14ad53a1-0 Ready 10m v1.6.6 +k8s-agent-14ad53a1-1 Ready 10m v1.6.6 +k8s-agent-14ad53a1-2 Ready 10m v1.6.6 +k8s-master-14ad53a1-0 Ready,SchedulingDisabled 10m v1.6.6 + +``` + +### Run the application + +A Kubernetes manifest file defines a desired state for the cluster, including things like what container images should be running. For this example, a manifest is used to create all object needed to run the Azure Vote application. + +Create a file named `azure-vote.yaml` and copy into it the following YAML. + +yamlCopy + +``` +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: azure-vote-back +spec: + replicas: 1 + template: + metadata: + labels: + app: azure-vote-back + spec: + containers: + - name: azure-vote-back + image: redis + ports: + - containerPort: 6379 + name: redis +--- +apiVersion: v1 +kind: Service +metadata: + name: azure-vote-back +spec: + ports: + - port: 6379 + selector: + app: azure-vote-back +--- +apiVersion: apps/v1beta1 +kind: Deployment +metadata: + name: azure-vote-front +spec: + replicas: 1 + template: + metadata: + labels: + app: azure-vote-front + spec: + containers: + - name: azure-vote-front + image: microsoft/azure-vote-front:redis-v1 + ports: + - containerPort: 80 + env: + - name: REDIS + value: "azure-vote-back" +--- +apiVersion: v1 +kind: Service +metadata: + name: azure-vote-front +spec: + type: LoadBalancer + ports: + - port: 80 + selector: + app: azure-vote-front + +``` + +Use the [kubectl create][15] command to run the application. + +Azure CLICopyTry It + +``` +kubectl create -f azure-vote.yaml + +``` + +Output: + +bashCopy + +``` +deployment "azure-vote-back" created +service "azure-vote-back" created +deployment "azure-vote-front" created +service "azure-vote-front" created + +``` + +### Test the application + +As the application is run, a [Kubernetes service][16] is created that exposes the application front-end to the internet. This process can take a few minutes to complete. + +To monitor progress, use the [kubectl get service][17] command with the `--watch`argument. + +Azure CLICopyTry It + +``` +kubectl get service azure-vote-front --watch + +``` + +Initially the EXTERNAL-IP for the  _azure-vote-front_  service appears as  _pending_ . Once the EXTERNAL-IP address has changed from  _pending_  to an  _IP address_ , use `CTRL-C` to stop the kubectl watch process. + +bashCopy + +``` +azure-vote-front 10.0.34.242 80:30676/TCP 7s +azure-vote-front 10.0.34.242 52.179.23.131 80:30676/TCP 2m + +``` + +You can now browse to the external IP address to see the Azure Vote App. + +![Image of browsing to Azure Vote](https://docs.microsoft.com/en-us/azure/container-service/kubernetes/media/container-service-kubernetes-walkthrough/azure-vote.png) + +### Delete cluster + +When the cluster is no longer needed, you can use the [az group delete][18]command to remove the resource group, container service, and all related resources. + +Azure CLICopyTry It + +``` +az group delete --name myResourceGroup --yes --no-wait + +``` + +### Get the code + +In this quick start, pre-created container images have been used to create a Kubernetes deployment. The related application code, Dockerfile, and Kubernetes manifest file are available on GitHub.+ + +[https://github.com/Azure-Samples/azure-voting-app-redis][19] + +### Next steps + +In this quick start, you deployed a Kubernetes cluster and deployed a multi-container application to it. + +To learn more about Azure Container Service, and walk through a complete code to deployment example, continue to the Kubernetes cluster tutorial. + +-------------------------------------------------------------------------------- + +via: https://docs.microsoft.com/en-us/azure/container-service/kubernetes/container-service-kubernetes-walkthrough + +作者:[neilpeterson ][a],[mmacy][b] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://github.com/neilpeterson +[b]:https://github.com/mmacy +[1]:https://github.com/neilpeterson +[2]:https://github.com/mmacy +[3]:https://kubernetes.io/docs/home/ +[4]:https://azure.microsoft.com/free/?WT.mc_id=A261C142F +[5]:https://portal.azure.com/ +[6]:https://portal.azure.com/ +[7]:https://portal.azure.com/ +[8]:https://docs.microsoft.com/en-us/cli/azure/install-azure-cli +[9]:https://docs.microsoft.com/en-us/cli/azure/group#create +[10]:https://docs.microsoft.com/en-us/cli/azure/acs#create +[11]:https://kubernetes.io/docs/user-guide/kubectl/ +[12]:https://docs.microsoft.com/en-us/cli/azure/acs/kubernetes#install-cli +[13]:https://docs.microsoft.com/en-us/cli/azure/acs/kubernetes#get-credentials +[14]:https://kubernetes.io/docs/user-guide/kubectl/v1.6/#get +[15]:https://kubernetes.io/docs/user-guide/kubectl/v1.6/#create +[16]:https://kubernetes.io/docs/concepts/services-networking/service/ +[17]:https://kubernetes.io/docs/user-guide/kubectl/v1.6/#get +[18]:https://docs.microsoft.com/en-us/cli/azure/group#delete +[19]:https://github.com/Azure-Samples/azure-voting-app-redis.git From 0064e02af265d53512ce2fe51eb922b666a26895 Mon Sep 17 00:00:00 2001 From: rieonke Date: Wed, 2 Aug 2017 22:14:31 +0800 Subject: [PATCH 0889/1407] translating by rieonke --- ...Apache Mesos Why What You Think You Know is Probably Wrong.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md b/sources/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md index 391fa250e4..000e6a46ce 100644 --- a/sources/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md +++ b/sources/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md @@ -1,3 +1,4 @@ +> translating by rieonke Docker vs. Kubernetes vs. Apache Mesos: Why What You Think You Know is Probably Wrong ============================================================ From 46ed167b1dff4beb1183b33cd4a76ac28fe60c45 Mon Sep 17 00:00:00 2001 From: lhr Date: Wed, 2 Aug 2017 22:28:45 +0800 Subject: [PATCH 0890/1407] Translation Done --- ...ersial Open Container Industry Standard.md | 25 +------------------ 1 file changed, 1 insertion(+), 24 deletions(-) rename {sources => translated}/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md (99%) diff --git a/sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md b/translated/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md similarity index 99% rename from sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md rename to translated/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md index 3c067bd769..ed5a27cae7 100644 --- a/sources/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md +++ b/translated/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md @@ -122,27 +122,4 @@ via: http://www.linuxinsider.com/story/84689.html [10]:http://www.semaphoreci.com/ [11]:https://www.thoughtworks.com/ [12]:http://www.linuxinsider.com/story/84689.html?rss=1 -[13]:http://www.linuxinsider.com/story/84689.html?rss=1 - - - - - - - - - - - - - - - - - - - - - - - +[13]:http://www.linuxinsider.com/story/84689.html?rss=1 \ No newline at end of file From 440e08dbc7ee95ad6f639280fd5ffd927fdb44c9 Mon Sep 17 00:00:00 2001 From: lhr Date: Wed, 2 Aug 2017 23:09:44 +0800 Subject: [PATCH 0891/1407] Translating by LHRchina --- .../tech/20170725 What you need to know about hybrid cloud.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170725 What you need to know about hybrid cloud.md b/sources/tech/20170725 What you need to know about hybrid cloud.md index fbbb094ebb..03f9661dea 100644 --- a/sources/tech/20170725 What you need to know about hybrid cloud.md +++ b/sources/tech/20170725 What you need to know about hybrid cloud.md @@ -1,3 +1,4 @@ +translating by LHRchina What you need to know about hybrid cloud ============================================================ From 12f34152246058353501f0b47bf0db59bb79bfb1 Mon Sep 17 00:00:00 2001 From: rieonke Date: Wed, 2 Aug 2017 23:49:59 +0800 Subject: [PATCH 0892/1407] translated --- ...at You Think You Know is Probably Wrong.md | 143 ------------------ ...at You Think You Know is Probably Wrong.md | 143 ++++++++++++++++++ 2 files changed, 143 insertions(+), 143 deletions(-) delete mode 100644 sources/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md create mode 100644 translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md diff --git a/sources/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md b/sources/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md deleted file mode 100644 index 000e6a46ce..0000000000 --- a/sources/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md +++ /dev/null @@ -1,143 +0,0 @@ -> translating by rieonke -Docker vs. Kubernetes vs. Apache Mesos: Why What You Think You Know is Probably Wrong -============================================================ - - -There are countless articles, discussions, and lots of social chatter comparing Docker, Kubernetes, and Mesos. If you listen to the partially-informed, you’d think that the three open source projects are in a fight-to-the death for container supremacy. You’d also believe that picking one over the other is almost a religious choice; with true believers espousing their faith and burning heretics who would dare to consider an alternative. - -That’s all bunk. - -While all three technologies make it possible to use containers to deploy, manage, and scale applications, in reality they each solve for different things and are rooted in very different contexts. In fact, none of these three widely adopted toolchains is completely like the others. - -Instead of comparing the overlapping features of these fast-evolving technologies, let’s revisit each project’s original mission, architectures, and how they can complement and interact with each other. - -### Let’s start with Docker… - -Docker Inc., today started as a Platform-as-a-Service startup named dotCloud. The dotCloud team found that managing dependencies and binaries across many applications and customers required significant effort. So they combined some of the capabilities of Linux [cgroups][1] and namespaces into a single and easy to use package so that applications can consistently run on any infrastructure. This package is [the Docker image][2], which provides the following capabilities: - -* Packages the application and the libraries in a single package (the Docker Image), so applications can consistently be deployed across many environments; - -* Provides Git-like semantics, such as “docker push”, “docker commit” to make it easy for application developers to quickly adopt the new technology and incorporate it in their existing workflows; - -* Define Docker images as immutable layers, enabling immutable infrastructure. Committed changes are stored as an individual read-only layers, making it easy to re-use images and track changes. Layers also save disk space and network traffic by only transporting the updates instead of entire images; - -* Run Docker containers by instantiating the immutable image with a writable layer that can temporarily store runtime changes, making it easy to deploy and scale multiple instances of the applications quickly. - -Docker grew in popularity, and developers started to move from running containers on their laptops to running them in production. Additional tooling was needed to coordinate these containers across multiple machines, known as container orchestration. Interestingly, one of the first container orchestrators that supported Docker images (June 2014) was [Marathon][3] on Apache Mesos (which we’ll describe in more detail below). That year, Solomon Hykes, founder and CTO of Docker, recommended Mesos as “[the gold standard for production clusters][4]”. Soon after, many container orchestration technologies in addition to Marathon on Mesos emerged: [Nomad][5], [Kubernetes][6] and, not surprisingly, Docker Swarm ([now part of Docker Engine][7]). - -As Docker moved to commercialize the open source file format, the company also started introducing tools to complement the core Docker file format and runtime engine, including: - -* Docker hub for public storage of Docker images; - -* Docker registry for storing it on-premise; - -* Docker cloud, a managed service for building and running containers; - -* Docker datacenter as a commercial offering embodying many Docker technologies. - -![Docker](https://mesosphere.com/wp-content/uploads/2017/07/docker-host.png) - -Source: www.docker.com. - -Docker’s insight to encapsulate software and its dependencies in a single package have been a game changer for the software industry; the same way mp3’s helped to reshape the music industry. The Docker file format became the industry standard, and leading container technology vendors (including Docker, Google, Pivotal, Mesosphere and many others) formed the [Cloud Native Computing Foundation (CNCF)][8] and [Open Container Initiative (OCI)][9]. Today, CNCF and OCI aim to ensure interoperability and standardized interfaces across container technologies and ensure that any Docker container, built using any tools, can run on any runtime or infrastructure. - -### Enter Kubernetes - -Google recognized the potential of the Docker image early on and sought to deliver container orchestration “as-a-service” on the Google Cloud Platform. Google had tremendous experience with containers (they introduced cgroups in Linux) but existing internal container and distributed computing tools like Borg were directly coupled to their infrastructure. So, instead of using any code from their existing systems, Google designed Kubernetes from scratch to orchestrate Docker containers. Kubernetes was released in February 2015 with the following goals and considerations: - -* Empower application developers with a powerful tool for Docker container orchestration without having to interact with the underlying infrastructure; - -* Provide standard deployment interface and primitives for a consistent app deployment experience and APIs across clouds; - -* Build on a Modular API core that allows vendors to integrate systems around the core Kubernetes technology. - -By March 2016, Google [donated Kubernetes][10] to CNCF, and remains today the lead contributor to the project (followed by Redhat, CoreOS and others). - -![Kubernetes](https://mesosphere.com/wp-content/uploads/2017/07/kubernetes-architecture.png) - -Source: wikipedia - -Kubernetes was very attractive for application developers, as it reduced their dependency on infrastructure and operations teams. Vendors also liked Kubernetes because it provided an easy way to embrace the container movement and provide a commercial solution to the operational challenges of running your own Kubernetes deployment (which remains a non-trivial exercise). Kubernetes is also attractive because it is open source under the CNCF, in contrast to Docker Swarm which, though open source, is tightly controlled by Docker, Inc. - -Kubernetes’ core strength is providing application developers powerful tools for orchestrating stateless Docker containers. While there are multiple initiatives to expand the scope of the project to more workloads (like analytics and stateful data services), these initiatives are still in very early phases and it remains to be seen how successful they may be. - -### Apache Mesos - -Apache Mesos started as a UC Berkeley project to create a next-generation cluster manager, and apply the lessons learned from cloud-scale, distributed computing infrastructures such as [Google’s Borg][11] and [Facebook’s Tupperware][12]. While Borg and Tupperware had a monolithic architecture and were closed-source proprietary technologies tied to physical infrastructure, Mesos introduced a modular architecture, an open source development approach, and was designed to be completely independent from the underlying infrastructure. Mesos was quickly adopted by [Twitter][13], [Apple(Siri)][14], [Yelp][15], [Uber][16], [Netflix][17], and many leading technology companies to support everything from microservices, big data and real time analytics, to elastic scaling. - -As a cluster manager, Mesos was architected to solve for a very different set of challenges: - -* Abstract data center resources into a single pool to simplify resource allocation while providing a consistent application and operational experience across private or public clouds; - -* Colocate diverse workloads on the same infrastructure such analytics, stateless microservices, distributed data services and traditional apps to improve utilization and reduce cost and footprint; - -* Automate day-two operations for application-specific tasks such as deployment, self healing, scaling, and upgrades; providing a highly available fault tolerant infrastructure; - -* Provide evergreen extensibility to run new application and technologies without modifying the cluster manager or any of the existing applications built on top of it; - -* Elastically scale the application and the underlying infrastructure from a handful, to tens, to tens of thousands of nodes. - -Mesos has a unique ability to individually manage a diverse set of workloads — including traditional applications such as Java, stateless Docker microservices, batch jobs, real-time analytics, and stateful distributed data services. Mesos’ broad workload coverage comes from its two-level architecture, which enables “application-aware” scheduling. Application-aware scheduling is accomplished by encapsulating the application-specific operational logic in a “Mesos framework” (analogous to a runbook in operations). Mesos Master, the resource manager, then offers these frameworks fractions of the underlying infrastructure while maintaining isolation. This approach allows each workload to have its own purpose-built application scheduler that understands its specific operational requirements for deployment, scaling and upgrade. Application schedulers are also independently developed, managed and updated, allowing Mesos to be highly extensible and support new workloads or add more operational capabilities over time. - -![Mesos two-level scheduler](https://mesosphere.com/wp-content/uploads/2017/07/mesos-two-level-scheduler.png) - -Take, for example, how a team manages upgrades. Stateless application can benefit from a [“blue/green”][18] deployment approach; where another complete version of the app is spun up while the old one is still live, and traffic switches to the new app when ready and the old app is destroyed. But upgrading a data workload like HDFS or Cassandra requires taking the nodes offline one at a time, preserving local data volumes to avoid data loss, performing the upgrade in-place with a specific sequence, and executing special checks and commands on each node type before and after the upgrade. Any of these steps are app or service specific, and may even be version specific. This makes it incredibly challenging to manage data services with a conventional container orchestration scheduler. - -Mesos’ ability to manage each workload the way it wants to be treated has led many companies to use Mesos as a single unified platform to run a combination of microservices and data services together. A common reference architecture for running data-intensive applications is the “[SMACK stack][19]”. - -### A Moment of Clarity - -Notice that we haven’t said anything about container orchestration to describe Apache Mesos. So why do people automatically associate Mesos with container orchestration? Container orchestration is one example of a workload that can run on Mesos’ modular architecture, and it’s done using a specialized orchestration “framework” built on top of Mesos called Marathon. Marathon was originally developed to orchestrate app archives (like JARs, tarballs, ZIP files) in [cgroup][20]containers, and was one of the first container orchestrators to support Docker containers in 2014. - -So when people compare Docker and Kubernetes to Mesos, they are actually comparing Kubernetes and Docker Swarm to Marathon running on Mesos. - -Why does this matter? Because Mesos frankly doesn’t care what’s running on top of it. Mesos can elastically provide cluster services for Java application servers, Docker container orchestration, Jenkins CI Jobs, Apache Spark analytics, Apache Kafka streaming, and more on shared infrastructure. Mesos could even run Kubernetes or other container orchestrators, though a public integration is not yet available. - -![Mesos Workloads](https://mesosphere.com/wp-content/uploads/2017/07/mesos-workloads.png) - -Source: Apache Mesos Survey 2016 - -Another consideration for Mesos (and why it’s attractive for many enterprise architects) is its maturity in running mission critical workloads. Mesos has been in large scale production (tens of thousands of servers) for more than 7 years, which is why it’s known to be more production ready and reliable at scale than many other container-enabling technologies in the market. - -### What does this all mean? - -In summary, all three technologies have something to do with Docker containers and give you access to container orchestration for application portability and scale. So how do you choose between them? It comes down to choosing the right tool for the job (and perhaps even different ones for different jobs). If you are an application developer looking for a modern way to build and package your application, or to accelerate microservices initiatives, the Docker container format and developer tooling is the best way to do so. - -If you are a dev/devops team and want to build a system dedicated exclusively to Docker container orchestration, and are willing to get your hands dirty integrating your solution with the underlying infrastructure (or rely on public cloud infrastructure like Google Container Engine or Azure Container Service), Kubernetes is a good technology for you to consider. - -If you want to build a reliable platform that runs multiple mission critical workloads including Docker containers, legacy applications (e.g., Java), and distributed data services (e.g., Spark, Kafka, Cassandra, Elastic), and want all of this portable across cloud providers and/or datacenters, then Mesos (or our own Mesos distribution, Mesosphere DC/OS) is the right fit for you. - -Whatever you choose, you’ll be embracing a set of tools that makes more efficient use of server resources, simplifies application portability, and increases developer agility. You really can’t go wrong. - --------------------------------------------------------------------------------- - -via: https://mesosphere.com/blog/docker-vs-kubernetes-vs-apache-mesos/?from=timeline&isappinstalled=0&nsukey=b2Ig6wj1rvlgVuEZ8ens0KVLuxYx7zv7GLuL1KBpcSWpvkfF2nHcSqeKJ7JnP%2FckIM4vBaRUkwdlUpWHNzrY8va0G14sN323y7T7OEix0DZpQOUQ%2FeiRcA7wJWN3Rws4PVSSI0wapm%2Bl5jCf%2B%2Bbj5HioS%2B%2FOeeil79KMIFrgFjKRMRWwZvlbOyq4j4iaipOi - -作者:[Amr Abdelrazik ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://mesosphere.com/blog/author/amr-abdelrazik/ -[1]:https://en.wikipedia.org/wiki/Cgroups -[2]:https://docs.docker.com/engine/docker-overview/ -[3]:https://mesosphere.github.io/marathon/ -[4]:https://www.google.com/url?q=https://www.youtube.com/watch?v=sGWQ8WiGN8Y&feature=youtu.be&t=35m10s&sa=D&ust=1500923856666000&usg=AFQjCNFLtW96ZWnOUGFPX_XUuVOPdWrd_w -[5]:https://www.nomadproject.io/ -[6]:http://kubernetes.io/ -[7]:https://blog.docker.com/2016/06/docker-1-12-built-in-orchestration/ -[8]:https://www.cncf.io/ -[9]:https://www.opencontainers.org/ -[10]:https://www.linuxfoundation.org/news-media/announcements/2016/03/cloud-native-computing-foundation-accepts-kubernetes-first-hosted-0 -[11]:https://research.google.com/pubs/pub43438.html -[12]:https://www.youtube.com/watch?v=C_WuUgTqgOc -[13]:https://youtu.be/F1-UEIG7u5g -[14]:http://www.businessinsider.com/apple-siri-uses-apache-mesos-2015-8 -[15]:https://engineeringblog.yelp.com/2015/11/introducing-paasta-an-open-platform-as-a-service.html -[16]:http://highscalability.com/blog/2016/9/28/how-uber-manages-a-million-writes-per-second-using-mesos-and.html -[17]:https://medium.com/netflix-techblog/distributed-resource-scheduling-with-apache-mesos-32bd9eb4ca38 -[18]:https://martinfowler.com/bliki/BlueGreenDeployment.html -[19]:https://mesosphere.com/blog/2017/06/21/smack-stack-new-lamp-stack/ -[20]:https://en.wikipedia.org/wiki/Cgroups -[21]:https://mesosphere.com/blog/author/amr-abdelrazik/ diff --git a/translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md b/translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md new file mode 100644 index 0000000000..7a5063b471 --- /dev/null +++ b/translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md @@ -0,0 +1,143 @@ +Docker vs. Kubernetes vs. Apache Mesos: 为什么你认为你知道的可能是错的 +============================================================ + +有无数的文章、讨论、以及很多社区喋喋不休地比较 Docker ,Kubernetes 和 Mesos。如果你只是听信了只言片语,你可能会认为这三个开源项目正为了称霸容器界而殊死搏斗。你还相信从他们中选出一个来几乎是一种宗教选择;真正的信徒忠于他们的信仰,烧死那些异教徒,谁还敢考虑一个替代的方案。 + +那都是废话。 + +虽然所有这三种技术都使得使用容器来部署、管理和伸缩应用成为可能,但实际上它们各自解决了不同的问题,并且根植于迥异的上下文环境中。事实上,这三种被广泛采用的工具,都是有差别的。 + +让我们重新审视每个项目的原始任务,技术架构,以及他们如何相互补充和交互。而不是纠结于比较这些快速迭代的技术之间重叠的特性。 + +### 让我们从Docker开始… + +Docker 公司, 始于名为dotCloud的平台即服务(PaaS)供应商。dotCloud团队发现,在许多应用和客户之间管理依赖和二进制文件时需要付出大量的工作。因此他们将Linux cgroups和namespace的一些功能合并成一个单一且易于使用的包,以便于应用程序可以在任何基础设施上一致地运行。这个包就是Docker镜像。Docker镜像提供了如下的功能: + +* 将应用程序和依赖库封装在一个包( Docker 镜像)中, 因此应用可以被一致地部署在各个环境上; + +* 提供类似 Git 的语义, 例如“docker push”,“docker commit”等命令让应用开发者可以快速接受这门新的技术,并将其融入到现有的工作流中; + +* 定义 Docker 镜像为不可变的层, 支持不可变的基础设施。新提交的变更被分别保存为只读层,让复用镜像和追踪变更记录变得十分简单。层还通过只传输更新而不是整个镜像来节省磁盘空间和网络流量; + +* 通过实例化不可变的镜像和读写层来运行 Docker 容器,读写层可以临时地存储运行时变更,从而轻松部署和扩展应用程序的多个实例; + +Docker 变得越来越受欢迎,开发者们开始从笔记本电脑上运行容器迁移到生产环境中。 跨多个机器之间协调这些容器需要额外的工具,称之为容器编排。有趣的是,第一个支持 Docker 镜像(2014 年 6月)的容器编排工具是 Apache Mesos(后面会有详细介绍) 的[Marathon][3]。那年,Docker的创始人兼首席技术官Solomon Hykes将Mesos推荐为“[生产集群的黄金标准][4]”。不久之后,除了Mesos 的Marathon 之外,还有出现了许多的容器编排技术:[Nomad][4],[Kubernetes][5],不出所料还有Docker Swarm([如今是Docker 引擎的一部分][7])。 + +随着Docker开始将其开源产品商业化,该公司还开始引入工具来补充Docker核心和运行时引擎,包括: + +* 为存储公共Docker镜像的而生的Docker hub; + +* 存储私有镜像的 Docker 仓库(Docker registry); + +* Docker cloud,用于构建和运行容器的服务; + +* Docker 数据中心作为一种商业产品体现了许多Docker技术; + +![Docker](https://mesosphere.com/wp-content/uploads/2017/07/docker-host.png) + +来源: www.docker.com. + +Docker 将软件及其以来关系封装在一个软件包中的洞察力改变了软件行业的游戏规则,正如mp3的出现重塑了音乐行业一般。Docker 成为行业标准,领先的容器技术供应商(包括Docker,Google,Pivotal,Mesosphere 等) 组建了 [Cloud Native Computing Foundation (CNCF)][8] 和 [Open Container Initiative (OCI)][9]。如今, CNCF 和 OCI 旨在确保容器技术之间的互操性和标准化接口,并确保使用任何工具构建的任何Docker容器都可以在任何运行时或基础架构上运行。 + +### 进入 Kubernetes + +Google很早就认识到了Docker的潜力,并试图在Google Cloud Platform上提供容器业务流程“即服务”。 Google在容器方面拥有丰富的经验(他们在Linux中引入了cgroups),但现有的内部容器和Borg等分布式计算工具直接与其原有基础架构相耦合。所以,Google没有使用原有系统的任何代码,而是从头开始设计Kubernetes来编排Docker容器。 Kubernetes于2015年2月发布,目标和考虑如下: + +* 为应用程序开发人员提供编排Docker容器的强大工具,而无需与底层基础设施交互; + +* 提供标准部署接口和原语 ,以实现云端一致的应用部署体验和API; + +* 基于模块化API核心,允许供应商围绕Kubernetes的核心技术集成其系统。 + +2016年3月,Google[将Kubernetes捐赠][10]给了CNCF,今天仍然是该项目的主要负责人(其次是Redhat,CoreOS等)。 + +![Kubernetes](https://mesosphere.com/wp-content/uploads/2017/07/kubernetes-architecture.png) + +来源: wikipedia + +Kubernetes对应用程序开发人员非常有吸引力,因为它减轻了对基础架构和运营团队的依赖程度。供应商也喜欢Kubernetes,因为它提供了一个容易的方式来拥抱容器化运动,并为客户部署Kubernetes(这仍然是一个非常重要的工作)提供商业解决方案。 Kubernetes也是有吸引力的,因为它是CNCF旗下的开源项目,与Docker Swarm相反,Docker Swarm尽管是开源的,但是被Docker公司紧紧地掌控着。 + + +Kubernetes的核心优势是为应用程序开发人员提供了用于编排无状态Docker容器的强大工具。 虽然有多个扩大项目范围的提议,以提供更多的功能(例如分析和有状态数据服务)。虽然这些提议仍处于非常早期的阶段,他们能取得多大的成功还有待观察。 + +### Apache Mesos + +Apache Mesos 始于加州大学伯克利分校(UC Berkeley)的下一代容器集群管理器项目,并应用了从云计算分布式计算基础架构(如[Google的Borg][11]和[Facebook的Tupperware][12])中习得的经验和教训。 虽然Borg和Tupperware具有单一的架构,并且是与物理基础架构紧密结合的闭源专有技术,但Mesos推出了一种模块化架构,一种开源开发方法,旨在完全独立于基础架构。Mesos迅速被 [Twitter][13],[Apple(Siri)][14], [Yelp][15], [Uber][16], [Netflix][17] 和许多领先的技术公司采用,支持从微服务,大数据和实时分析到弹性扩展的一切。 + +作为集群管理器,Mesos被设计用来解决一系列不同的挑战: + +* 将数据中心资源抽象为单个池来简化资源分配,同时在私有云或公有云中提供一致的应用和运维体验; + +* 在相同的基础架构上协调多个工作负载,如分析、无状态微服务、分布式数据服务和传统应用程序,以提高利用率,降低成本和台面空间; + +* 为应用程序特定的任务(如部署,自我修复,扩展和升级),自动执行第二天的操作;提供高度可用的容错基础设施; + +* 提供持久的可扩展性来运行新的应用程序和技术,而无需修改集群管理器或其上构建的任何现有应用程序;提供常规的可扩展性来运行新的应用程序和技术,而无需修改集群管理器或其上构建的任何现有应用程序; + +* 弹性扩展,将应用程序和底层基础设施从少量扩展到数十到数万个节点。 + + +Mesos独有的独立管理各种工作负载的能力 - 包括传统应用程序,如Java,无状态Docker微服务,批处理作业,实时分析和有状态的分布式数据服务。Mesos广泛的工作负载覆盖来自于其两级架构,从而实现了“应用感知”调度。 通过将应用程序特定的操作逻辑封装在“Mesos框架”(类似于操作中的运行手册)中来实现应用程序感知调度。资源管理器Mesos Master提供这些框架基础架构的部分,同时保持隔离。这种方法允许每个工作负载都有自己的专门构建的应用程序调度程序,可以了解其部署,扩展和升级的特定操作要求。 应用程序调度程序也是独立开发,管理和更新的,这让Mesos拥有高可扩展的能力,支持新的工作负载或随着时间的推移增加更多的操作功能。 + +![Mesos two-level scheduler](https://mesosphere.com/wp-content/uploads/2017/07/mesos-two-level-scheduler.png) + +举一个例子,团队如何管理应用软件升级。 无状态应用程序可以从[“蓝/绿”][18]部署方案中受益;当新版本的应用运行起来时,原先旧版本的软件依然还正常运转着,然后当旧应用被销毁时流量将会切换到新的应用上。但是升级数据工作负载例如 HDFS 或者 Cassandra 要求节点停机一次,此时需要持久化本地数据以防止数据丢失,并且按照特定的顺序执行原位升级,在升级之前和升级完成之后,都要在每一个节点类型上执行特定的检查和命令。任何这些步骤都是应用程序或服务特定的,甚至可能是版本特定的。 这让使用常规容器编排调度程序来管理数据服务变得非常困难。 +Mesos以每一个工作负载所需的特定方式管理各种工作负载,使得许多公司将Mesos作为一个统一的平台,将微服务和数据服务结合在一起。数据密集型应用程序的通用参考架构是[“SMACK”][19](译者按:SMACK即Spark,Mesos,Akka,Cassandra,Kafka)。 + +### 是时候搞清楚这些了 + +请注意,我们尚未对Apache Mesos的容器编排有任何描述。所以为什么人们会自动地将Mesos和容器编排联系起来呢?容器编排是可以在Mesos的模块化架构上运行的工作负载的一个例子,它是通过一个专门的编排“框架”来完成的,这个框架就Marathon,一个构建于Mesos之上的工具。 Marathon最初是为了在[cgroup][20] 容器中编排应用文档(如JAR,tarballs,ZIP文件)而开发的,是2014年最先支持Docker容器的编排工具之一。 + +所以当人们将Docker和Kubernetes与Mesos进行比较时,他们实际上是将Kubernetes和Docker Swarm与在Mesos上运行的Marathon进行了比较。 + +为什么搞清楚这一点很重要? 因为Mesos坦率地讲并不在乎它上面运行了什么。 Mesos可以在共享的基础设施上弹性地为Java应用服务器提供集群服务,Docker容器编排,Jenkins 持续集成任务,Apache Spark分析,Apache Kafka 流,以及更多其他的服务。Mesoss甚至可以运行Kubernetes 或者其他的容器编排工具,即使公共的集成目前还不可用。 + +![Mesos Workloads](https://mesosphere.com/wp-content/uploads/2017/07/mesos-workloads.png) + +来源: Apache Mesos 调查 2016 + +Mesos的另一个考虑因素(也是为什么它对许多企业架构师来说如此有吸引力)是运行关键任务工作负载的成熟度。 Mesos已经在大规模生产环境下(成千上万台服务器)运行了超过7年的时间,这就是为什么它比市场上许多其他的容器技术更具有生产上的可行性和扩展上的可靠性。 + +### 我所说的这些什么意思? + +总而言之,所有这三种技术都与Docker容器有关,可以让你在容器编排上实现应用程序的可移植性和扩展性。那么你在它们之间如何选择呢? 归根到底是为工作选择合适的工具(也可能是为不同的工作选择不同的工具)。如果您是一个应用开发人员,正在寻找现代化的方式来构建和打包你的应用程序,或者加速你的微服务计划,Docker容器和开发工具就是最好的选择。 + +如果你们是一个dev / devops团队,并希望构建一个专门用于Docker容器编排的系统,而且愿意花时间折腾集成解决方案与底层基础设施(或依靠公共云基础架构,如Google容器引擎或Azure容器服务),Kubernetes是一个可以考虑的好技术。 + +如果你们需要建立一个运行多个关键任务工作负载的可靠平台,包括Docker容器,旧的应用程序(例如Java)和分布式数据服务(例如Spark,Kafka,Cassandra,Elastic),并希望所有这些可依移植到云端提供商或者数据中心,那么Mesos(或我们自己的Mesos发行版,Mesosphere DC / OS)更适合你们的需求。 + +无论您选择什么,您都将拥抱一套可以更有效地利用服务器资源的工具,简化应用程序的可移植性,并提高开发人员的敏捷性。 你的选择真的不会有错。 + +-------------------------------------------------------------------------------- + +via: https://mesosphere.com/blog/docker-vs-kubernetes-vs-apache-mesos/?from=timeline&isappinstalled=0&nsukey=b2Ig6wj1rvlgVuEZ8ens0KVLuxYx7zv7GLuL1KBpcSWpvkfF2nHcSqeKJ7JnP%2FckIM4vBaRUkwdlUpWHNzrY8va0G14sN323y7T7OEix0DZpQOUQ%2FeiRcA7wJWN3Rws4PVSSI0wapm%2Bl5jCf%2B%2Bbj5HioS%2B%2FOeeil79KMIFrgFjKRMRWwZvlbOyq4j4iaipOi + +作者:[Amr Abdelrazik ][a] +译者:[rieonke](https://github.com/rieonke) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://mesosphere.com/blog/author/amr-abdelrazik/ +[1]:https://en.wikipedia.org/wiki/Cgroups +[2]:https://docs.docker.com/engine/docker-overview/ +[3]:https://mesosphere.github.io/marathon/ +[4]:https://www.google.com/url?q=https://www.youtube.com/watch?v=sGWQ8WiGN8Y&feature=youtu.be&t=35m10s&sa=D&ust=1500923856666000&usg=AFQjCNFLtW96ZWnOUGFPX_XUuVOPdWrd_w +[5]:https://www.nomadproject.io/ +[6]:http://kubernetes.io/ +[7]:https://blog.docker.com/2016/06/docker-1-12-built-in-orchestration/ +[8]:https://www.cncf.io/ +[9]:https://www.opencontainers.org/ +[10]:https://www.linuxfoundation.org/news-media/announcements/2016/03/cloud-native-computing-foundation-accepts-kubernetes-first-hosted-0 +[11]:https://research.google.com/pubs/pub43438.html +[12]:https://www.youtube.com/watch?v=C_WuUgTqgOc +[13]:https://youtu.be/F1-UEIG7u5g +[14]:http://www.businessinsider.com/apple-siri-uses-apache-mesos-2015-8 +[15]:https://engineeringblog.yelp.com/2015/11/introducing-paasta-an-open-platform-as-a-service.html +[16]:http://highscalability.com/blog/2016/9/28/how-uber-manages-a-million-writes-per-second-using-mesos-and.html +[17]:https://medium.com/netflix-techblog/distributed-resource-scheduling-with-apache-mesos-32bd9eb4ca38 +[18]:https://martinfowler.com/bliki/BlueGreenDeployment.html +[19]:https://mesosphere.com/blog/2017/06/21/smack-stack-new-lamp-stack/ +[20]:https://en.wikipedia.org/wiki/Cgroups +[21]:https://mesosphere.com/blog/author/amr-abdelrazik/ + From d87bda70d554f52f8a7ca4a39eecfccec61cc6ec Mon Sep 17 00:00:00 2001 From: Rieon Date: Thu, 3 Aug 2017 00:08:21 +0800 Subject: [PATCH 0893/1407] fix spelling mistake --- ...pache Mesos Why What You Think You Know is Probably Wrong.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md b/translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md index 7a5063b471..356436b3f8 100644 --- a/translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md +++ b/translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md @@ -37,7 +37,7 @@ Docker 变得越来越受欢迎,开发者们开始从笔记本电脑上运行 来源: www.docker.com. -Docker 将软件及其以来关系封装在一个软件包中的洞察力改变了软件行业的游戏规则,正如mp3的出现重塑了音乐行业一般。Docker 成为行业标准,领先的容器技术供应商(包括Docker,Google,Pivotal,Mesosphere 等) 组建了 [Cloud Native Computing Foundation (CNCF)][8] 和 [Open Container Initiative (OCI)][9]。如今, CNCF 和 OCI 旨在确保容器技术之间的互操性和标准化接口,并确保使用任何工具构建的任何Docker容器都可以在任何运行时或基础架构上运行。 +Docker 将软件及其依赖关系封装在一个软件包中的洞察力改变了软件行业的游戏规则,正如mp3的出现重塑了音乐行业一般。Docker 成为行业标准,领先的容器技术供应商(包括Docker,Google,Pivotal,Mesosphere 等) 组建了 [Cloud Native Computing Foundation (CNCF)][8] 和 [Open Container Initiative (OCI)][9]。如今, CNCF 和 OCI 旨在确保容器技术之间的互操性和标准化接口,并确保使用任何工具构建的任何Docker容器都可以在任何运行时或基础架构上运行。 ### 进入 Kubernetes From b5b71e0501d745169547d344fee6cf11e2acdee3 Mon Sep 17 00:00:00 2001 From: Rieon Date: Thu, 3 Aug 2017 00:10:39 +0800 Subject: [PATCH 0894/1407] remove url parameters appended by mobile QQ --- ...pache Mesos Why What You Think You Know is Probably Wrong.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md b/translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md index 356436b3f8..7fc838b30f 100644 --- a/translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md +++ b/translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md @@ -110,7 +110,7 @@ Mesos的另一个考虑因素(也是为什么它对许多企业架构师来说 -------------------------------------------------------------------------------- -via: https://mesosphere.com/blog/docker-vs-kubernetes-vs-apache-mesos/?from=timeline&isappinstalled=0&nsukey=b2Ig6wj1rvlgVuEZ8ens0KVLuxYx7zv7GLuL1KBpcSWpvkfF2nHcSqeKJ7JnP%2FckIM4vBaRUkwdlUpWHNzrY8va0G14sN323y7T7OEix0DZpQOUQ%2FeiRcA7wJWN3Rws4PVSSI0wapm%2Bl5jCf%2B%2Bbj5HioS%2B%2FOeeil79KMIFrgFjKRMRWwZvlbOyq4j4iaipOi +via: https://mesosphere.com/blog/docker-vs-kubernetes-vs-apache-mesos/ 作者:[Amr Abdelrazik ][a] 译者:[rieonke](https://github.com/rieonke) From 61298933a545118c8bf25e5c8825f0222fa7d6ab Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 3 Aug 2017 08:40:14 +0800 Subject: [PATCH 0895/1407] translated --- ...70705 IoT Fuels Growth of Linux Malware.md | 101 ------------------ ...70705 IoT Fuels Growth of Linux Malware.md | 91 ++++++++++++++++ 2 files changed, 91 insertions(+), 101 deletions(-) delete mode 100644 sources/tech/20170705 IoT Fuels Growth of Linux Malware.md create mode 100644 translated/tech/20170705 IoT Fuels Growth of Linux Malware.md diff --git a/sources/tech/20170705 IoT Fuels Growth of Linux Malware.md b/sources/tech/20170705 IoT Fuels Growth of Linux Malware.md deleted file mode 100644 index 22d8990dbb..0000000000 --- a/sources/tech/20170705 IoT Fuels Growth of Linux Malware.md +++ /dev/null @@ -1,101 +0,0 @@ -translating---geekpi - -IoT Fuels Growth of Linux Malware -============================================================ -![linus-iot-security](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2016-internet-of-things-1.jpg) - -![](http://www.linuxinsider.com/images/2015/image-credit-adobe-stock_130x15.gif) - -![](http://www.linuxinsider.com/images/2008/atab.gif) - -[**Managing Your Intellectual Property Integrity During M&A Transactions**][7] -[][8]Flexera Software presents best practices and methodology for the technical due diligence auditing process. -**[Download the White Paper][3]** - -Malware targeting Linux systems is growing, largely due to a proliferation of devices created to connect to the Internet of Things. - -That is one of the findings in a report [WatchGuard Technologies][4], a maker of network security appliances, released last week. - -The report, which analyzes data gathered from more than 26,000 appliances worldwide, found three Linux malware programs in the top 10 for the first quarter of the year, compared with only one during the previous period. - -"Linux attacks and malware are on the rise," wrote WatchGuard CTO Corey Nachreiner and Security Threat Analyst Marc Laliberte, coauthors of the report. "We believe this is because systemic weaknesses in IoT devices, paired with their rapid growth, are steering botnet authors towards the Linux platform." - -However, "blocking inbound Telnet and SSH, along with using complex administrative passwords, can prevent the vast majority of potential attacks," they suggested. - -### New Avenue for Hackers - -Linux malware began growing at the end of last year with the Mirai botnet, observed Laliberte. Mirai made a splash in September when it was used to attack part of the Internet's infrastructure and knock millions of users offline. - -"Now, with IoT devices skyrocketing, a whole new avenue is opening up to attackers," he told LinuxInsider. "It's our belief that the rise we're seeing in Linux malware is going hand in hand with that new target on the Internet." - -Makers of IoT devices haven't been showing a great deal of concern about security, Laliberte continued. Their goals are to make their devices work, make them cheap, and make them quickly. - -"They really don't care about security during the development process," he said. - -### Trivial Pursuits - -Most IoT manufacturers use stripped down versions of Linux because the operating system requires minimal system resources to operate, said Paul Fletcher, cybersecurity evangelist at [Alert Logic][5]. - -"When you combine that with the large quantity of IoT devices being connected to the Internet, that equals a large volume of Linux systems online and available for attack," he told LinuxInsider. - -In their desire to make their devices easy to use, manufacturers use protocols that are also user-friendly for hackers. - -"Attackers can gain access to these vulnerable interfaces, then upload and execute the malicious code of their choice," Fletcher said. - -Manufacturers frequently have poor default settings for their devices, he pointed out. - -"Often, admin accounts have blank passwords or easy-to-guess default passwords, such as 'password123,'" Fletcher said. - -The security problems often are "nothing Linux-specific per se," said Johannes B. Ullrich, chief research officer at the [SANS Institute][6]. - -"The manufacturer is careless on how they configured the device, so they make it trivial to exploit these devices," he told LinuxInsider. - -### Malware in Top 10 - -These Linux malware programs cracked the top 10 in WatchGuard's tally for the first quarter: - -* Linux/Exploit, which catches several malicious trojans used to scan systems for devices that can be enlisted into a botnet. - -* Linux/Downloader, which catches malevolent Linux shell scripts. Linux runs on many different architectures, such as ARM, MIPS and traditional x86 chipsets. An executable compiled for one architecture will not run on a device running a different one, the report explains. Thus, some Linux attacks exploit dropper shell scripts to download and install the proper malicious components for the architecture they are infecting. - -* Linux/Flooder, which catches Linux distributed-denial-of-service tools, such as Tsunami, used to perform DDoS amplification attacks, as well as DDoS tools used by Linux botnets like Mirai. "As the Mirai botnet showed us, Linux-based IoT devices are a prime target for botnet armies," the report notes. - -### Web Server Battleground - -A shift in how adversaries are attacking the Web has occurred, the WatchGuard report notes. - -At the end of 2016, 73 percent of Web attacks targeted clients -- browsers and supporting software, the company found. That radically changed during the first three months of this year, with 82 percent of Web attacks focused on Web servers or Web-based services. - -"We don't think drive-by download style attacks will go away, but it appears attackers have focused their efforts and tools on trying to exploit Web server attacks," report coauthors Nachreiner and Laliberte wrote. - -There's been a decline in the effectiveness of antivirus software since the end of 2016, they also found. - -"For the second quarter in a row, we have seen our legacy AV solution miss a lot of malware that our more advanced solution can catch. In fact, it has gone up from 30 percent to 38 percent," Nachreiner and Laliberte reported. - -"Nowadays, cyber criminals use many subtle tricks to repack their malware so that it evades signature-based detection," they noted. "This is why so many networks that use basic AV become victims of threats like ransomware." - --------------------------------------------------------------------------------- - -作者简介: - -John P. Mello Jr. has been an ECT News Network reporter since 2003. His areas of focus include cybersecurity, IT issues, privacy, e-commerce, social media, artificial intelligence, big data and consumer electronics. He has written and edited for numerous publications, including the Boston Business Journal, the Boston Phoenix, Megapixel.Net and Government Security News. Email John. - -------------- - -via: http://www.linuxinsider.com/story/84652.html - -作者:[John P. Mello Jr ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:john.mello@newsroom.ectnews.com -[1]:http://www.linuxinsider.com/story/84652.html?rss=1# -[2]:http://www.linuxinsider.com/perl/mailit/?id=84652 -[3]:http://www.linuxinsider.com/story/84652.html?rss=1 -[4]:http://www.watchguard.com/ -[5]:http://www.alertlogic.com/ -[6]:http://www.sans.org/ -[7]:http://www.linuxinsider.com/story/84652.html?rss=1 -[8]:http://www.linuxinsider.com/story/84652.html?rss=1 diff --git a/translated/tech/20170705 IoT Fuels Growth of Linux Malware.md b/translated/tech/20170705 IoT Fuels Growth of Linux Malware.md new file mode 100644 index 0000000000..f1a172fdbb --- /dev/null +++ b/translated/tech/20170705 IoT Fuels Growth of Linux Malware.md @@ -0,0 +1,91 @@ +物联网对 Linux 恶意软件的助长 +============================================================ +![linus-iot-security](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2016-internet-of-things-1.jpg) + +针对 Linux 系统的恶意软件正在增长,这主要是由于连接到物联网设备的激增。 + +这是上周发布的网络安全设备制造商 [WatchGuard Technologies][4] 的一篇报告。 + +该报告分析了全球 26,000 多件设备收集到的数据,今年第一季度的前 10 中发现了三个针对 Linux 的恶意软件,而上一季度仅有一个。 + +WatchGuard 的 CTO Corey Nachreiner 和安全威胁分析师 Marc Laliberte 写道:“Linux 攻击和恶意软件正在兴起。我们相信这是因为 IoT 设备的系统性弱点与其快速增长相结合,它正在将僵尸网络作者转向 Linux 平台。” + +但是,他们建议“阻止入站 Telnet 和 SSH,以及使用复杂的管理密码,可以防止绝大多数潜在的攻击”。 + +### 黑客的新大道 + +Laliberte 观察到,Linux 恶意软件在去年年底随着 Mirai 僵尸网络开始增长。Mirai 在九月份曾经用来攻击部分互联网的基础设施,使数百万用户离线。 + +他告诉 LinuxInsider,“现在,随着物联网设备的飞速发展,一条全新的大道正在向攻击者开放。我们相信,随着互联网上新目标的出现,Linux 恶意软件会逐渐增多。” + +Laliberte 继续说,物联网设备制造商并没有对安全性表现出很大的关注。他们的目标是使他们的设备能够使用、便宜,制造快速。 + +他说:“他们真的不关心开发过程中的安全。” + +### 微不足道的追求 + +[Alert Logic][5] 的网络安全宣传员 Paul Fletcher说,大多数物联网制造商都使用 Linux 的裁剪版本,因为操作系统需要最少的系统资源来运行。 + +他告诉 LinuxInsider,“当你将大量与互联网连接的物联网设备结合在一起时,这相当于在线大量的 Linux 系统,它们可用于攻击。” + +为了使设备易于使用,制造商使用的协议对黑客也是友好的。 + +Fletcher 说:“攻击者可以访问这些易受攻击的接口,然后上传并执行他们选择的恶意代码。” + +他指出,厂商经常对设备的默认设置很差。 + +Fletcher说:“通常,管理员帐户是空密码或易于猜测的默认密码,例如‘password123’。” + +[SANS 研究所][6] 首席研究员 Johannes B. Ullrich 表示,安全问题通常是“本身不限定 Linux”。 + +他告诉L inuxInsider,“制造商对他们如何配置设备不屑一顾,所以他们使这些设备的利用变得微不足道。” + +### 10 大恶意软件 + +这些 Linux 恶意软件在 WatchGuard 的第一季度的统计数据中占据了前 10 名: + +* Linux/Exploit,它使用几种木马来扫描可以列入僵尸网络的设备。 + +* Linux/Downloader,它使用恶意的 Linux shell 脚本。Linux 运行在许多不同的架构上,如 ARM、MIPS 和传统的 x8 6芯片组。报告解释说,一个根据架构编译的可执行文件不能在不同架构的设备上运行。因此,一些 Linux 攻击利用 dropper shell 脚本下载并安装它们所感染的体系架构的适当恶意组件。 + +* Linux/Flooder,它使用了 Linux 分布式拒绝服务工具,如 Tsunami,用于执行 DDoS 放大攻击,以及 Linux 僵尸网络(如 Mirai)使用的 DDoS 工具。报告指出:“正如 Mirai 僵尸网络向我们展示的,基于 Linux 的物联网设备是僵尸网络军队的主要目标。 + +### Web 服务器战场 + +WatchGuard 报告指出,敌人攻击网络的方式发生了变化。 + +公司发现,到 2016 年底,73% 的 Web 攻击针对客户端 - 浏览器和配套软件。今年头三个月发生了彻底改变,82% 的 Web 攻击集中在 Web 服务器或基于 Web 的服务上。 + +报告合著者 Nachreiner 和 Laliberte 写道:“我们不认为下载风格的攻击将会消失,但似乎攻击者已经集中力量和工具来试图利用 Web 服务器攻击。” + +他们也发现,自 2006 年底以来,杀毒软件的有效性有所下降。 + +Nachreiner 和 Laliberte 报道说:“连续的第二季,我们看到使用传统的杀毒软件解决方案漏掉了使用我们更先进的解决方案可以捕获的大量恶意软件,实际上已经从 30% 上升到了 38%。” + +他说:“如今网络犯罪分子使用许多精妙的技巧来重新包装恶意软件,从而避免了基于签名的检测。这就是为什么使用基本杀毒的许多网络成为诸如赎金软件之类威胁的受害者。” + +-------------------------------------------------------------------------------- + +作者简介: + +John P. Mello Jr.自 2003 年以来一直是 ECT 新闻网记者。他的重点领域包括网络安全、IT问题、隐私权、电子商务、社交媒体、人工智能、大数据和消费电子。 他撰写和编辑了众多出版物,包括“波士顿商业杂志”、“波士顿凤凰”、“Megapixel.Net” 和 “政府安全新闻”。给 John 发邮件。 + +------------- + +via: http://www.linuxinsider.com/story/84652.html + +作者:[John P. Mello Jr ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:john.mello@newsroom.ectnews.com +[1]:http://www.linuxinsider.com/story/84652.html?rss=1# +[2]:http://www.linuxinsider.com/perl/mailit/?id=84652 +[3]:http://www.linuxinsider.com/story/84652.html?rss=1 +[4]:http://www.watchguard.com/ +[5]:http://www.alertlogic.com/ +[6]:http://www.sans.org/ +[7]:http://www.linuxinsider.com/story/84652.html?rss=1 +[8]:http://www.linuxinsider.com/story/84652.html?rss=1 From b9068e8854e1429a45afc864555c286645350eae Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 3 Aug 2017 08:42:26 +0800 Subject: [PATCH 0896/1407] translating --- sources/tech/20170120 lxc exec vs ssh.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170120 lxc exec vs ssh.md b/sources/tech/20170120 lxc exec vs ssh.md index fa74a587c0..eba94834fc 100644 --- a/sources/tech/20170120 lxc exec vs ssh.md +++ b/sources/tech/20170120 lxc exec vs ssh.md @@ -1,3 +1,5 @@ +translating----geekpi + lxc exec vs ssh ============================================================ From 168362279a38343da746869968ca5a4898d3af0a Mon Sep 17 00:00:00 2001 From: WangYue <815420852@qq.com> Date: Thu, 3 Aug 2017 09:45:49 +0800 Subject: [PATCH 0897/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E5=88=A0=E9=99=A4=E5=8E=9F=E6=96=8720170113=203=20open=20sourc?= =?UTF-8?q?e=20music=20players.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 翻译完成删除原文20170113 3 open source music players.md --- .../20170113 3 open source music players.md | 144 ------------------ 1 file changed, 144 deletions(-) delete mode 100644 sources/tech/20170113 3 open source music players.md diff --git a/sources/tech/20170113 3 open source music players.md b/sources/tech/20170113 3 open source music players.md deleted file mode 100644 index 6b96ed1ec0..0000000000 --- a/sources/tech/20170113 3 open source music players.md +++ /dev/null @@ -1,144 +0,0 @@ -翻译中 by  WangYueScream -=========================================================== -3 open source music players: Aqualung, Lollypop, and GogglesMM -============================================================ - ![3 open source music players: Aqualung, Lollypop, and GogglesMM](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/music-birds-recording-520.png?itok=wvh1g4Lw "3 open source music players: Aqualung, Lollypop, and GogglesMM") -Image by :  - -[Internet Archive][2] book images; modified by Opensource.com. [CC BY-SA 4.0][3] - -Music is a part of life. [Wikipedia's article on the history of music][4] contains this great phrase: "Since all people of the world, including the most isolated tribal groups, have a form of music...." Well, we open source folk form a tribe—that's for sure. I propose that our "form of music" includes open music players. Over the past year, I've been taking a look at the various players available; in [December 2016][5] I summarized my ongoing evaluation of open music players using these six criteria: - -1. Must be configurable to pass the music through unchanged to [ALSA][1]. (max 5 marks) -2. Should have a good "smart playlist" feature. (1 mark) -3. Should not force the user to always interact through playlists. (1 mark) -4. Should provide a simple approach to cover art—use the embedded cover art or fall back to cover.jpg (or .png) in the music directory. (1 mark) -5. Should show the signal level and effective bit rate as the music plays. (1 mark) -6. Should present good-to-great overall organization, layout, and performance. (1 mark) - -Three players suggested to me by kind readers were not available in my repositories: [Aqualung][6], [Lollypop][7], and [GogglesMM][8]. Not wanting to install stuff from the wild on my work computer, I promised to configure a "test bed" for this purpose and detail the results. - -### Aqualung - -[Aqualung][9] has a clearly written website that explains its various features. One of the comments there I found interesting was this one: - -"You can (and should) organize your music into a tree of Artists/Records/Tracks, thereby making life easier than with the all-in-one Winamp/XMMS playlist." - -This puzzled me because I think I have always had my music organized into a tree of artists, albums, and tracks. But maybe this explains why I find the XMMS-derived players to be a bit odd in terms of their music browsing capability. - -According to the Aqualung download page, the official release is source-only. While the comments there suggest that most major Linux distributions include a built copy of Aqualung, this is not the case with the distro I'm currently using on my work computer, Ubuntu 16.10. [Launchpad.net][10] does have personal package archives (PPAs), but they seem a bit out of date, so why not build from source? - -I installed **pkgconf** and dev versions of **libasound**, **libflac**, **libmp3lame**, **libvorbis**, **libxml2**, **libglib2.0**, and **libgtk+-2.0**, generally following the suggestions of the compiling page on the site and the usual "hints" from the configure script. Next, I was able to **configure** cleanly and do a **make** and a **make install**. And from there, I was able to execute **/usr/local/bin/aqualung**. - - ![Aqualung](https://opensource.com/sites/default/files/aqualung.png "Aqualung") - -Aqualung, unable to switch resolution. - -Once Aqualung was up and running, I saw a straightforward and relatively barebones two-window user interface, the player itself and the "Music Store." I opened Preferences by right-clicking on the music pane of the player and looked around to see where I could select my AudioQuest DragonFly digital-to-analog converter, but I saw no sign of anything there. However, the site notes that you can specify the output device on the command line. I ended up needing to use the **plughw** device to get Aqualung to start. - -At that point, I was disappointed to discover that Aqualung seems to require a fixed output sample rate. I could play my 44.1-KHz files just fine with the default setting, but to play my 96-KHz files, I had to stop and restart with that sample rate. Aqualung will not pass the bit stream unchanged through to the digital-to-analog converter. With that, I did not bother to continue my evaluation. - -**Not rated.** - -### Lollypop - - ![Lollypop interface](https://opensource.com/sites/default/files/lollypop_interface.png "Lollypop interface") - -The lovely Lollypop user interface. - -[Lollypop][11] has a gorgeous website. Although it's not in my work computer's repositories, there is a "Download Ubuntu/Debian" link that points to an [up-to-date PPA on launchpad.net][12]. The site offers other downloads for Flatpak, Arch Linux, Fedora, FreeBSD, and OpenSUSE. Out of curiosity, I took a look at the [Fedora link on Fedora COPR][13], and it also looks quite up-to-date, offering builds for Fedora 23–26. - -One build from source was enough excitement for that day, so I decided to try the PPA. I was able to execute Lollypop from the command line. The Settings menu was obvious in the upper right of the screen. After updating my music, I went looking for my output device configuration, but after some poking around, I couldn't find how to select the output device. Even executing on the command line with **–help** did not enlighten me. - -After some searching on the Internet I found a Lollypop developer stating that I needed **gstreamer libav** to get Lollypop to work. From this I have tentatively concluded that there may be a **gstreamer** configuration possibility to make this work, but I'm not going to pursue that for now, at least. - -Lollypop has a lovely user interface to match its lovely web page, but for now, I did not rate it. I have another reason to learn more about **gstreamer**. - -**Not rated.** - -### GogglesMM - -[Goggles Music Manager][14] also has an [up-to-date PPA on launchpad.net][15]; the installation was straightforward and I was able to execute **gogglesmm** from the command line. - -GogglesMM, out of the box, looks somewhat like Rhythmbox. I found the Audio tab under Settings > Preferences, which let me select ALSA and set my output device. I confirmed that I can play MP3, 44.1-KHz / 24-bit and 96-KHz / 24-bit music by looking at **/proc/asound/DragonFly/stream0** and the LED color on the DragonFly itself; therefore, 5 points for "rate/depth passthrough." - - ![GogglesMM](https://opensource.com/sites/default/files/gogglesmm.png "GogglesMM") - -GogglesMM playing at 96/24, showing output device. - -The documentation for GogglesMM is not largely detailed at this point, but as far as I am able to tell, the developers use filters to implement something like "smart playlists." I reviewed the functioning of filters as best as I could with the three albums installed on my test bed, and while I like what I see (especially being able to define selection criteria for songs based on a broad range of criteria), this is not what I mean when I use the term "smart playlists," which I think of as using some kind of community database of "songs like the current one." Maybe I should call this "automatic DJ" instead, but as far as I am able to determine, this feature does not exist in the current version of GogglesMM, so 0 points for "smart playlist." - -As for the queue versus playlist operation, the application supports either playing through the selected songs both in order or randomly or putting songs in a playlist, so 1 for "queue option to playlist." - -Similarly, it seemed to manage my cover art well without extra intervention (each album contained the appropriate cover art, which was recognized automatically by GogglesMM), so 1 for "embedded cover art or cover.jpg." - -I could not find any way to show signal level or effective bit rate. Nor could I find any way of seeing the bit rate and bit depth; although the application can display a "format" column, it doesn't show anything in that field on my music, so 0 for "signal level and effective bit rate." - -With respect to overall organization, GogglesMM hits all the right buttons for me. I can see what's in the play queue, the time and proportion of song played and left to play, album cover, song name, album title, and artist. Also, the available display column list seems quite large and useful, including composer for example. Finally, a really wonderful thing, the volume control actually controls the ALSA volume. If I bring up alsamixer and adjust the volume in either GogglesMM or alsamixer, the other's volume control moves and the volume adjusts. This is pretty cool and surprisingly not all that common, so 1 for overall organization. - -In total, then, GogglesMM merits an 8\. Excellent performance indeed. - -**Rating: 8** - -### The ratings so far - -As I've mentioned in the past, my favorite player is [Guayadeque][16], which gets a perfect 10, according to my ranking. Take a look at a summary of my ratings to date (N/R meaning "not rated," because I was unable to determine how to configure those players to work in bit-perfect, passthrough mode so that my digital-to-analog converter receives the PCM data at the bit rate and bit depth of the source): - - ![Open source audio players](https://opensource.com/sites/default/files/open_source_audio.png "Open source audio players") - -Please note that my ranking scheme is not for everyone. In particular, many people don't find value in music files at higher-than-CD resolution, and many people are happy with proprietary formats that promise better audio quality. - -Meanwhile, I will continue to evaluate some of the promising non-rated options. I especially like the look of Lollypop, and I feel that there is a secret spell for **gstreamer** just waiting to be unlocked that will let **gstreamer**-based players pass their data through without conversions. - -### And the music... - -My vinyl buying spree continues, and I have some great recommendations. - -First is Nils Frahm's album, [Felt][17], which was a very thoughtful gift from my daughter. I really, really like this album, which was largely recorded late at night with microphones very close to the piano strings and lots of interesting ambient piano noise—really beautiful music. Like other Nils Frahm music, the vinyl comes with a download code that allows the downloading of the album in up to 96-KHz, 24-bit FLAC format. - -The second is [Mad Professor's remix][18] of Massive Attack's album, Protection, titled No Protection. You can [get an idea of it here][19], and if you would like to try out the original, [here is what it's all about][20]. Originally released in the 1990s, this album is back on vinyl and it sounds fantastic. Unfortunately, no download code accompanies it. - -The third is [Primitives][21] by Bayonne. [Here is an idea][22] of what it's like. The Guardian newspaper has lumped this in with "the new boring," how's that for a genre? Really, if it's all so boring, maybe it's time for a career change, Anyway, give this one a whirl; maybe you'll find it boring, or maybe, like me, you'll like it! - --------------------------------------------------------------------------------- - - -作者简介: - -![](https://opensource.com/sites/default/files/styles/profile_pictures/public/clh_portrait2.jpg?itok=V1V-YAtY) - -Chris Hermansen - Engaged in computing since graduating from the University of British Columbia in 1978, I have been a full-time Linux user since 2005 and a full-time Solaris, SunOS and UNIX System V user before that. On the technical side of things, I have spent a great deal of my career doing data analysis; especially spatial data analysis. I have a substantial amount of programming experience in relation to data analysis, using awk, Python, PostgreSQL, PostGIS and lately Groovy - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/17/1/open-source-music-players - -作者:[Chris Hermansen][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/clhermansen -[1]:http://www.alsa-project.org/main/index.php/Main_Page -[2]:https://www.flickr.com/photos/internetarchivebookimages/14565158187/in/photolist-ocoBRG-ocqdPM-ot9YYX-ovb7SE-oroqfj-ot8Sfi-of1HoD-oc5c28-otBk3B-foZxvq-ocoUvo-4TqEKE-otsG7t-oeYo4w-ornGMQ-orpD9y-wLDBUf-outZV7-oc26Ui-ortZpW-ocpWLH-ocoK6c-ocYDY1-od6ADb-xxAKyY-ocofDx-oc4Jr5-otyT2E-ocpUyu-xqTAb6-oc8gK1-otdsK5-ovhkz2-ocpcHj-oc8xwk-otgmZG-otr595-otnv4o-otvdRs-ovfYEt-ovDXUV-obUPJ6-oc2MuJ-oc4zLE-oruPbN-oc1P2H-ouRk93-otaGd3-otTmwB-oc5f62 -[3]:http://creativecommons.org/licenses/by-sa/4.0/ -[4]:https://en.wikipedia.org/wiki/History_of_music -[5]:https://opensource.com/article/16/12/soundtrack-open-source-music-players -[6]:http://aqualung.jeremyevans.net/ -[7]:https://gnumdk.github.io/lollypop-web/ -[8]:https://gogglesmm.github.io/ -[9]:http://aqualung.jeremyevans.net/ -[10]:https://launchpad.net/+search?field.text=aqualung+ppa -[11]:https://gnumdk.github.io/lollypop-web/ -[12]:https://launchpad.net/~gnumdk/+archive/ubuntu/lollypop -[13]:https://copr.fedorainfracloud.org/coprs/gnumdk/lollypop/ -[14]:https://gogglesmm.github.io/ -[15]:https://launchpad.net/~s.jansen/+archive/ubuntu/gogglesmm -[16]:http://www.guayadeque.org/ -[17]:http://www.nilsfrahm.com/works/felt/ -[18]:https://en.wikipedia.org/wiki/No_Protection_(Massive_Attack_album) -[19]:https://www.youtube.com/watch?v=9TvgRb4wiB0 -[20]:https://www.youtube.com/watch?v=LCUv-hLN71c -[21]:https://musicglue.com/bayonne/products/primitives---vinyl--/ -[22]:https://www.youtube.com/watch?v=WZ6xl6CKITE From f01ab94f53cdbabae18c4b3fcd34db361dcaa341 Mon Sep 17 00:00:00 2001 From: WangYue <815420852@qq.com> Date: Thu, 3 Aug 2017 09:53:21 +0800 Subject: [PATCH 0898/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=AE=8C=E6=88=90?= =?UTF-8?q?=E6=B7=BB=E5=8A=A0=E8=AF=91=E6=96=8720170113=203=20open=20sourc?= =?UTF-8?q?e=20music=20players.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 翻译完成添加译文20170113 3 open source music players.md --- .../20170113 3 open source music players.md | 189 ++++++++++++++++++ 1 file changed, 189 insertions(+) create mode 100644 translated/tech/20170113 3 open source music players.md diff --git a/translated/tech/20170113 3 open source music players.md b/translated/tech/20170113 3 open source music players.md new file mode 100644 index 0000000000..840a351eb8 --- /dev/null +++ b/translated/tech/20170113 3 open source music players.md @@ -0,0 +1,189 @@ + +3 个开源的音乐播放器:Aqulung,Lollypop,和 GogglesMM +============================================================ + + + ![3 open source music players: Aqualung, Lollypop, and GogglesMM](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/music-birds-recording-520.png?itok=wvh1g4Lw "3 open source music players: Aqualung, Lollypop, and GogglesMM") + + +图片来源:[互联网档案馆][2]书中的图片;由 Opensource.com 编辑发布。遵循 [CC BY-SA 4.0][3] 协议。 + + +音乐是生活的一部分。[维基百科关于音乐发展历史的文章][4]有这样一段不错的描述说:“全世界所有的人们,包括哪怕是最孤立、与世隔绝的部落,都会有自己的特色音乐...”好吧,能够确定的是我们已经把那种部落的民乐推广出来广为人知。我建议我们对于“音乐形式”的划分也应该包括开源音乐播放器。在过去几年里,我已经使用体验过不少我能接触到的音乐播放器;[2016 年 12 月份][5]我根据这六个标准来总结概括分享我使用开源音乐播放器的经验感受: + + +1. 必须是能够通过设置让音乐从一成不变转换到 [ALSA][1]。(最高分 5分) +2. 应该有一个不错的“智能播放列表”。(1 分) +3. 不应该强迫用户总是只能通过播放列表来进行交互。(1 分) +4. 应该能够提供一个简单的方法来覆盖掉歌曲内嵌的图片或者在音乐目录里后退到 cover.jpg(或者 .png)。 +5. 应该能够在音乐播放的时候显示信号级别和实际的比特率。(1 分) +6. 能够呈现出不错的整体组织,结构布局和执行性能。(1 分) + + +热心的读者让我想起来有三个播放器是在我的资源仓库里找不到的:[Aqualung][6],[Lollypop][7],和 [GogglesMM][8]。我并不想在我办公用的电脑里面安装不必要的非办公需要的软件,我向大家承诺到时候我会配置一个“试验台”来达到测试这三个音乐播放器用户体验的目的并详细描述最终结果。 + +### Aqualung + + +[Aqualung][9] 有一个清晰明了的文字描述站点来解释它众多的特点。站点提供的说明中我发现其中一点特别有趣: + + +“你能够(也应该)将你的所有音乐按照艺术家/档案/声轨这样的分类标准系统化归类成一个树型结构,从而生成一个一体的 Winamp/XMMS 播放列表来让你的生活更简单。” + + +这点让我有些困惑因为我印象中我一直总是把我的音乐按照艺术家,专辑和声轨这样的分类标准系统归类。但这就可能解释了为什么我有时发现我的 XMMS-derived 播放器运行的时候有一点古怪,与这种音乐分类标准下播放器的浏览音乐的性能有关。 + + +根据在 Aqualung 官网下载的参考文档说明,官方发布的只有源代码。但是文档上的说明暗示了绝大多数主流的 Linux 发行版本都内置的有一份复制的编译后的 Aqualung,我当前用的办公电脑所使用的 Linux 发行版本并不在此范围内,Ubuntu 16.10。[Launchpad.net][10] 提供的有个人软件包库(PPAs),但那些软件看起来都有些过时了,版本比较老,所以为什么不试试编译源码安装软件呢? + + +我根据官网上编译文档的建议和配置脚本的提示安装了 **pkgconf** 以及 **libasound**,**libflac**,**libmp3lame**,**libvorbis**,**libxml2**,**libglib2.0** 和 **libgtk+-2.0** 的开发版。接下来,我就能够干净利索的进行**配置**然后进行**编译**和**编译安装**。最终我是通过执行 **/usr/local/bin/aqualung** 这个文件来进行 aqualung 的安装。 + + + ![Aqualung](https://opensource.com/sites/default/files/aqualung.png "Aqualung") + + +Aqualung,不能切换音乐播放的码率。 + + +一旦 Aqualung 启动运行,我就能看到两个相当简洁直接的窗口用户界面,播放器本身和“音乐商店”。我通过右键点击播放器的音乐面板打开参数设置查看这些可设置的参数看是否能找到 AudioQuest DragonFly 这个数字模拟转换器,但我没有找到任何相关的参数。然而,站点上的说明指出你可以通过命令行指定输出设备。最终我用 **plughw** 外置声卡设备来让 Aqualung 启动。 + + +在那个时候,真正让我对 Aqualung 感到失望的是 Aqualung 似乎是需要一个固定的输出设备来抽样检查频率。我能够用 Aqualung 播放器的默认设置来正常播放我的 44.1 Khz 文件,但是同样的抽样检查频率播放 96 Khz 的音乐文件时,我不得不关闭软件并重新启动。也正是因为这一点,我不会再继续进行对 Aqualung 的使用测评。 + + +**不作进一步的评论。** + + +### Lollypop + + + ![Lollypop interface](https://opensource.com/sites/default/files/lollypop_interface.png "Lollypop interface") + + +优美的 Lollypop 用户界面。 + + +[Lollypop][11] 有一个华丽的网站。尽管它不在我办公专用的电脑的软件仓库里面,但是有一个“针对 Ubuntu/Debian 用户的下载”链接带你跳转到 [launchpad.net 站点提供的最新的 PPA][12]。这个站点还提供针对 Flatpak,Arch Linux,Fedora,和 OpenSUSE 这些系统的 Lollypop 软件包的下载。我看了下[Fedora COPR 上针对各个 Fedora 版本的 Lollypop 下载链接][13],看起来 Lollypop 更新的比较及时而且从 Fedora 版本的 23 到 26 都有对应的软件包提供下载安装。 + + +就一天内从源码编译安装 Lollypop 软件是一件非常刺激的事,所以我决定试试从 PPA 安装这款软件。我通过命令行来安装执行 Lollypop 软件。设置菜单能够在 Lollypop 界面的右上方很明显地看见。更新完音乐后,我开始找电脑的输出设备设置,但是在一番查看后,我不知道如何针对 Lollypop 选择合适正确的输出设备。即便我在命令行通过 **-help** 也找不到有用的帮助信息。 + + +经过一番网上搜索后我找到一个 Lollypop 的开发者的描述说明才知道我需要 **gstreamer libav** 来让 Lollypop 工作。通过这个说明我暂时推断出可能还需要一个 **gstreamer** 相关配置才有可能让 Lollypop 成功正常运行工作,但是我至少现在不会去继续尝试。 + + +Lollypop 有一个优美的用户交互界面和它的优美的网站相得益彰,但是我现在不会进一步对它进行测评。否则我就又多了一个进一步去学习了解 **gstreamer** 的理由。 + + +**不作进一步的评论。** + +### GogglesMM + + +[Goggles Music Manager][14] 也有一个[在 launchpad.net 及时更新的 PPA][15];安装流程简单明了,我可以在命令行通过执行 **gogglesmm** 来完成安装。 + + +GogglesMM,非常容易上手使用,看上去和 Rhythmbox 有点像。我在 GogglesMM 的设置里面的参数设置中找到了音频选项设置,能够让我选择 ALSA 和设置音频输出用哪块输出设备。通过查看 **/proc/asound/DragonFly/stream0** 文件和 DragonFly 设备上 LED 的颜色我确定我能够用 GogglesMM 播放 44.1-KHz/21-bit 和 96-KHz/24-bit 这两种规格的音乐;因此,就凭“rate/depth passthrough”我给 GogglesMM 打 5 分。 + + + ![GogglesMM](https://opensource.com/sites/default/files/gogglesmm.png "GogglesMM") + + +上图是 GogglesMM 在播放 96/24 这种规格的音乐,显示音频输出设备选择。 + + +GogglesMM 的说明文档并没有大量的细节介绍,但是我尽可能能够说明的是,开发者们使用了不少过滤条件来实现类似“智能播放列表”的功能。我在我的测试环境下使用三张专辑来尽我所能检测过滤功能,当我使用“智能播放列表”功能的时候尽管我喜欢我看到的通过过滤筛选出来的歌曲(特别是能够基于广泛的标准来针对歌曲定义筛选条件),但这并不是我认为的“智能播放列表”,对我来说我认为“智能播放列表”应该是这样的,通过借助一些社区数据库来推荐提供和你近期播放的歌曲类似的曲目。或者我该把这个叫作“自动的 DJ”而不是“智能播放列表”,但是通过测试我最终能够确定的是,这个特性并不会在近期版本的 GogglesMM 中出现,所以我给它这个所谓的“智能播放列表”打 0 分。 + + +至于播放列表队列的操作,这款应用能够支持播放你选中的音乐也能够随机播放音乐或者把一些音乐整合到一个播放列表里面,所以我因为“播放列表的队列选项”给它打 1 分。 + + +同样的,它看起来也能够很好地不需要额外的干预来管理我的音乐艺术封面(每个专辑都包含一张合适的由 GogglesMM 自动识别的艺术封面),所以为“内嵌的艺术封面或者封面图片”打 1 分。 + + +我找不到任何方法来让 GogglesMM 显示信号级别或者实际的比特率。我也不能找到显示比特率和位深度的方法;尽管这款应用能够在一个列表里面显示所有的音乐“格式”,但是在我的音乐栏里面除了显示音乐格式不会显示其他的信息了,所以为 GogglesMM 的“信号级别和有效比特率”打 0 分。 + + +至于 GogglesMM 的整体结构,它设计的所有按钮选项都正好完全符合我的使用习惯。我能够在播放队列里面看到歌曲的时间和歌曲当前已播放的时间所占歌曲总体时间的比例,专辑封面,歌曲名,专辑名和歌唱者。可用的播放栏列表看起来相当的大容量有用,比如也包括了作曲者。最后,一个真正让我眼前一亮的特点是,音量控制竟然包含了 ALSA 音量。也就是如果我启动控制台调整音量的话然后不管是在控制台还是在 GogglesMM 里面调整音量,另一个音量控制也会做相应的音量调整。这个出乎我意外之外的功能相当的酷而且这个功能在其他的音乐播放器上也不常见,因此为它的整体架构给 GogglesMM 加 1 分。 + + +最终 GogglesMM 的这些优点共计得分 8。所表现出来的特点确实很优秀。 + + +**评分:8** + + +### 到目前为止所给出的评分 + + +我所提到的这几个开源音乐播放器中,我最喜欢的还是 [Guayadeque][16],根据我制定的标准来进行排名的话,我给 Guayadeque 打满分 10 分。来看下我对这三个开源音乐播放器的评分总结吧(N/R 代表“不作评论”,因为我不确定如何配置这些播放器来让它们以完美的码率和贯穿模式工作以便我的数字模拟信号转换器在相应源的码率和位深度接收 PCM 数据): + + + ![Open source audio players](https://opensource.com/sites/default/files/open_source_audio.png "Open source audio players") + + +请注意下我用的这个排名方法不是针对所有音乐播放器通用的。特别是很多人并不清楚高品质音乐的价值,他们更高兴专有格式的音乐能够给他们带来更好的音乐品质。 + + +与此同时,我会继续评测一些之前向大家承诺的音乐播放器一些和评测评分无关的特性。我特别喜欢 Lollypop 的外观,我也觉得待解锁的 **gstreamer** 有一种神秘的魅力,他能让基于 **gstreamer** 的音乐播放器不用通过转换就能传输他们的数据。 + + +### 关于音乐的部分... + + +我还在保持继续购买唱片的习惯,对于唱片的购买我有些不错的推荐。 + + +第一个就是 Nils Frahm 的专辑,[Felt][17],是我女儿送我的一份非常贴心的礼物。我真的真的很喜欢这张专辑,它的绝大部分歌曲都是在深夜用电麦录制的非常接近钢琴的弦乐而且也有不少有趣的钢琴演奏的背景音乐,真的是很棒的音乐。至于 Nils Frahm 其他的音乐,这些唱片也提供的有下载链接允许你下载质量高达 96-KHz,24-bit FLAC 格式的音乐。 + + +第二个就是 Massive Attack 的 [Mad Professor's remix][18] 这份专辑。你可以[在这里了解这份专辑][19],并且如果你想要尝试这份专辑最原始的版本,[这里是汇总的它的所有相关信息][20]。最原始的版本诞生于 20 世纪 90 年代,这份专辑刻录在唱片上面而且听起来非常奇幻。遗憾的是,不提供下载链接。 + + +第三个就是 Bayonne 的 [Primitives][21]。[这是专辑要表达的想法][22]。Guardian 报社把这份专辑称作是“新花样的无聊”。那么这种类型的音乐到底怎么样呢?如果这些音乐真的是非常令人乏味的,或许是时候来换份工作了,无论如何你可以试试听这些音乐;或许你会觉得它确实很乏味或者你会像我一样喜欢上这份音乐。 + +-------------------------------------------------------------------------------- + + +作者简介: + +![](https://opensource.com/sites/default/files/styles/profile_pictures/public/clh_portrait2.jpg?itok=V1V-YAtY) + + +Chris Hermansen - 自 1978 年毕业于 British Columbia 大学后一直从事计算机相关工作,2005 年之前是 Solaris,SunOS,UNIX System V 的忠实用户,之后是 Linux 的忠实用户。在技术方面,我的职业生涯大部分时间都是在做数据分析;特别是空间数据分析。拥有丰富的和数据分析相关的编程经验,用过的编程语言有 awk,Python,PostgreSQL, PostGIS 和 最新的 Groovy。 + + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/17/1/open-source-music-players + +作者:[Chris Hermansen][a] +译者:[WangYueScream](https://github.com/WangYueScream) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/clhermansen +[1]:http://www.alsa-project.org/main/index.php/Main_Page +[2]:https://www.flickr.com/photos/internetarchivebookimages/14565158187/in/photolist-ocoBRG-ocqdPM-ot9YYX-ovb7SE-oroqfj-ot8Sfi-of1HoD-oc5c28-otBk3B-foZxvq-ocoUvo-4TqEKE-otsG7t-oeYo4w-ornGMQ-orpD9y-wLDBUf-outZV7-oc26Ui-ortZpW-ocpWLH-ocoK6c-ocYDY1-od6ADb-xxAKyY-ocofDx-oc4Jr5-otyT2E-ocpUyu-xqTAb6-oc8gK1-otdsK5-ovhkz2-ocpcHj-oc8xwk-otgmZG-otr595-otnv4o-otvdRs-ovfYEt-ovDXUV-obUPJ6-oc2MuJ-oc4zLE-oruPbN-oc1P2H-ouRk93-otaGd3-otTmwB-oc5f62 +[3]:http://creativecommons.org/licenses/by-sa/4.0/ +[4]:https://en.wikipedia.org/wiki/History_of_music +[5]:https://opensource.com/article/16/12/soundtrack-open-source-music-players +[6]:http://aqualung.jeremyevans.net/ +[7]:https://gnumdk.github.io/lollypop-web/ +[8]:https://gogglesmm.github.io/ +[9]:http://aqualung.jeremyevans.net/ +[10]:https://launchpad.net/+search?field.text=aqualung+ppa +[11]:https://gnumdk.github.io/lollypop-web/ +[12]:https://launchpad.net/~gnumdk/+archive/ubuntu/lollypop +[13]:https://copr.fedorainfracloud.org/coprs/gnumdk/lollypop/ +[14]:https://gogglesmm.github.io/ +[15]:https://launchpad.net/~s.jansen/+archive/ubuntu/gogglesmm +[16]:http://www.guayadeque.org/ +[17]:http://www.nilsfrahm.com/works/felt/ +[18]:https://en.wikipedia.org/wiki/No_Protection_(Massive_Attack_album) +[19]:https://www.youtube.com/watch?v=9TvgRb4wiB0 +[20]:https://www.youtube.com/watch?v=LCUv-hLN71c +[21]:https://musicglue.com/bayonne/products/primitives---vinyl--/ +[22]:https://www.youtube.com/watch?v=WZ6xl6CKITE From cda92f1f4d9d0fe0c8eae63ccae042b16fe4df44 Mon Sep 17 00:00:00 2001 From: rieonke Date: Thu, 3 Aug 2017 10:16:14 +0800 Subject: [PATCH 0899/1407] apply for translating a new article --- .../20170801 Deploy Kubernetes cluster for Linux containers.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170801 Deploy Kubernetes cluster for Linux containers.md b/sources/tech/20170801 Deploy Kubernetes cluster for Linux containers.md index 8631d73edb..58e87796c7 100644 --- a/sources/tech/20170801 Deploy Kubernetes cluster for Linux containers.md +++ b/sources/tech/20170801 Deploy Kubernetes cluster for Linux containers.md @@ -1,3 +1,5 @@ +> translating by rieon + Deploy Kubernetes cluster for Linux containers ============================================================ From f39c711e9e735286282c33aee4752e336cd876fe Mon Sep 17 00:00:00 2001 From: firmianay Date: Thu, 3 Aug 2017 13:20:56 +0800 Subject: [PATCH 0900/1407] translated --- ...ORWARDING MOUNT A SOCKS SERVER WITH SSH.md | 166 ------------------ ...ORWARDING MOUNT A SOCKS SERVER WITH SSH.md | 164 +++++++++++++++++ 2 files changed, 164 insertions(+), 166 deletions(-) delete mode 100644 sources/tech/20170715 DYNAMIC PORT FORWARDING MOUNT A SOCKS SERVER WITH SSH.md create mode 100644 translated/tech/20170715 DYNAMIC PORT FORWARDING MOUNT A SOCKS SERVER WITH SSH.md diff --git a/sources/tech/20170715 DYNAMIC PORT FORWARDING MOUNT A SOCKS SERVER WITH SSH.md b/sources/tech/20170715 DYNAMIC PORT FORWARDING MOUNT A SOCKS SERVER WITH SSH.md deleted file mode 100644 index d393ad4749..0000000000 --- a/sources/tech/20170715 DYNAMIC PORT FORWARDING MOUNT A SOCKS SERVER WITH SSH.md +++ /dev/null @@ -1,166 +0,0 @@ -translating by firmianay - -DYNAMIC PORT FORWARDING / MOUNT A SOCKS SERVER WITH SSH -================= - -In the previous entry, [Creating TCP / IP (port forwarding) tunnels with SSH: The 8 scenarios possible using OpenSSH][17], we saw all the possibilities we have at our disposal for  _port forwarding_ … but for static port forwarding. That is, we only saw cases where we wanted to access only a port of another system by chan- ging it through the SSH connection. - -However, in that entry we left in the forefront the dynamic forwarding of ports and several, eral readers missed it, so that this entry will try to complement it (thanks to those who suggest this). - -When we talk about doing  _dynamic port forwarding_  with SSH, what we are talking about is exactly converting SSH into a [SOCKS][2] server. And what is a SOCKS server? - -Do you know what a[web proxy is for][3]? Probably yes, many companies use one. It is a system directly connected to the Internet that allows clients of an [intranet][4] without Internet access to navigate the web if they configure their browsers to make their requests through the proxy ( [although there are also transparent proxies][5] ). A web proxy, besides allowing the output to the Internet, will also cache pages, images, etc. Already downloaded by some client so you do not have to download them for another client. In addition, it allows to filter the contents and to monitor the activity of the users. However, its basic function is to forward HTTP and HTTPS traffic. - -A SOCKS server would give a service similar to the intranet of a company that provides a proxy server but is not limited to HTTP / HTTPS, but allows to forward any TCP / IP traffic (with SOCKS 5 also UDP). - -For example, imagine that we want to use our mail using POP3 or ICMP and SMTP with Thunderbird from an intranet without direct Internet access. If we only have a web proxy available, the only simple one we would use would be to use some webmail (although if it is a webmail we could also use the [Thunderbird Webmail extension][6]). We could also take advantage of the proxy by [tunneling over HTTP][7]. But the simplest thing would be that the network had a SOCKS server available that would allow us to use POP3, ICMP and SMTP through it without any inconvenience. - -Although there is a lot of software to configure very specialized SOCKS servers, setting up one with OpenSSH could be as simple as: - -> ``` -> Clientessh $ ssh -D 1080 user @ servidorssh -> ``` - -Or we could improve it a bit with: - -> ``` -> Clientessh $ ssh -fN -D 0.0.0.0:1080 user @ servidorssh -> ``` - -Where: - -* The option `-D`is similar to the options `-L`and `-R`static port forwarding. Like these, with this we can make the client listen only the local requests or those arriving from other nodes, depending on which address we associate the request: - - > ``` - > -D [bind_address:] port - > ``` - - While in static port forwarding we saw that we could do reverse port forwarding with the option `-R`, with dynamic forwarding is not possible. We can only create the SOCKS server on the SSH client side, not on the SSH server side. - -* 1080 is the typical port for SOCKS servers, just as 8080 is typical for web proxy servers. - -* The option `-N`prevents a remote shell interactive session from actually being launched. It is useful when we only do the `ssh`to establish this tunnel. - -* The option `-f`causes `ssh`it to stay in the background and disassociates itself from the current shell, so that the process becomes a daemon. It does not work without the option `-N`(or without specifying a command), otherwise an interactive shell would be incompatible with the process being in the background. - -Using [PuTTY][8] is also very simple to redirect ports. The equivalent of a ” `ssh -D 0.0.0.0:1080`” would be to use this configuration: - -![PuTTY SOCKS](https://wesharethis.com/wp-content/uploads/2017/07/putty_socks.png) - -For an application to access another network through a SOCKS server, it is convenient (although not necessary) that the application specifically supports it, just as browsers support using a proxy server. Browsers, such as Firefox or Internet Explorer, are examples of applications prepared to use a SOCKS server to access another network: - -![Firefox SOCKS](https://wesharethis.com/wp-content/uploads/2017/07/firefox_socks.png) - -![Internet Explorer SOCKS](https://wesharethis.com/wp-content/uploads/2017/07/internetexplorer_socks.png) - -Note: Capture has been obtained using [IEs 4 Linux][1] : Highly recommended if you need Internet Explorer and use Linux! - -However, it is not precisely the browsers that most often require a SOCKS server, since they usually are better arranged with the proxy server. - -But for example, the Thunderbird also allows and that is useful: - -![Thunderbird SOCKS](https://wesharethis.com/wp-content/uploads/2017/07/thunderbird_socks.png) - -Another example: the [Spotify][9] client also supports SOCKS: - -![Spotify SOCKS](https://wesharethis.com/wp-content/uploads/2017/07/spotify_socks.png) - -Something to keep in mind is name resolution. Sometimes we will find that in the current network we can not resolve the names of the systems that we want to access on the other side of the SOCKS server. SOCKS 5 also allows us to tunnel DNS requests (as is UDP allows us to SOCKS 5) and send them to the other end: It is possible to specify if we want to resolve locally or remotely (or maybe test both). Applications that support this also have to take this into account. For example, Firefox has the parameter network.proxy.socks_remote_dns (in it `about:config`) that allows us to specify that it is resolved remotely. By default it is resolved locally. - -Thunderbird also supports the parameter `network.proxy.socks_remote_dns`, but since we do not have an address bar to place `about:config`, we can change it, as we read in [MozillaZine: about: config][10], in Tools → Options → Advanced → General → Config Editor (button). - -Applications that do not specifically support SOCKS can be “socksified”. This will work well with many applications that use TCP / IP without problems, but not with all. “Socksifier” consists of loading an additional library that detects requests to the TCP / IP stack and modifying them to redirect them through the SOCKS server, so that the communication goes through without the application being specifically programmed with SOCKS support . - -There are “Socksifiers” for Windows and for [Linux.][18] - -For Windows we have for example the SocksCap, a closed but free product for non-commercial use that I have used very satisfactorily for a long time. SocksCap was made by a company called Permeo which was the company that created SOCKS reference technology. Permeo was bought by [Blue Coat][11] and it [discontinued the SocksCap][12]. You can still find the file very well `sc32r240.exe`on the Internet. Also for Windows, and free code, there is the [FreeCap][13], of appearance and use very, very similar to the SocksCap. However, it works much worse and has been maintenance-free for years. It seems that its author has preferred to dedicate his efforts to a new product this time of payment, the [WideCap][14]. - -This is the aspect of the SocksCap when we have “socksified” several applications. These applications will access the network through the SOCKS server when we launch them from here: - -![SocksCap](https://wesharethis.com/wp-content/uploads/2017/07/sockscap.png) - -In the configuration dialog we will see that if we choose the protocol SOCKS 5, we can choose where the names have to be resolved, locally or remotely: - -![SocksCap settings](https://wesharethis.com/wp-content/uploads/2017/07/sockscap_settings.png) - -On Linux, as always, we have many alternatives to a single remote command. In Debian / Ubuntu, the output of the command: - -> ``` -> $ Apt-cache search socks -> ``` - -Will show us many of them - -The best known to me are the [tsocks][15] and the [proxychains][16]. They work in much the same way: Just launch the application that we want to “socksify” with them and that’s it. An example using `proxychains`y `wget`: - -> ``` -> $ Proxychains wget http://www.google.com -> ProxyChains-3.1 (http://proxychains.sf.net) -> --19: 13: 20-- http://www.google.com/ -> Resolving www.google.com ... -> DNS-request | Www.google.com -> | S-chain | - <- - 10.23.37.3:1080-<><>-4.2.2.2:53-<><>-OK -> | DNS-response | Www.google.com is 72.14.221.147 -> 72.14.221.147 -> Connecting to www.google.com | 72.14.221.147 |: 80 ... -> | S-chain | - <- - 10.23.37.3:1080-<><>-72.14.221.147:80-<><>-OK -> Connected. -> HTTP request sent, awaiting response ... 200 OK -> Length: unspecified [text / html] -> Saving to: `index.html ' -> -> [<=>] 6,016 24.0K / s in 0.2s -> -> 19:13:21 (24.0 KB / s) - `index.html 'saved [6016] -> ``` - -For this to work, you must specify the proxy server that we want to use in `/etc/proxychains.conf`: - -> ``` -> [ProxyList] -> Socks5 clientessh 1080 -> ``` - -We can also tell you that DNS requests are made remotely: - -> ``` -> # Proxy DNS requests - no leak for DNS data -> Proxy_dns -> ``` - -Also, in the previous output, we have seen several informative messages of the same `proxychains`, not `wget`in lines marked with strings `|DNS-request|`, `|S-chain|`or `|DNS-response|`. If we do not want to see them, we can also adjust it in the configuration: - -> ``` -> # Quiet mode (no output from library) -> Quiet_mode -> ``` - --------------------------------------------------------------------------------- - -via: https://wesharethis.com/2017/07/15/dynamic-port-forwarding-mount-socks-server-ssh/ - -作者:[Ahmad][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://wesharethis.com/author/ahmad/ -[1]:https://wesharethis.com/goto/http://www.tatanka.com.br/ies4linux/page/Main_Page -[2]:https://wesharethis.com/goto/http://en.wikipedia.org/wiki/SOCKS -[3]:https://wesharethis.com/goto/http://en.wikipedia.org/wiki/Proxy_server -[4]:https://wesharethis.com/goto/http://en.wikipedia.org/wiki/Intranet -[5]:https://wesharethis.com/goto/http://en.wikipedia.org/wiki/Proxy_server#Transparent_and_non-transparent_proxy_server -[6]:https://wesharethis.com/goto/http://webmail.mozdev.org/ -[7]:https://wesharethis.com/goto/http://en.wikipedia.org/wiki/HTTP_tunnel_(software) -[8]:https://wesharethis.com/goto/http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html -[9]:https://wesharethis.com/goto/https://www.spotify.com/int/download/linux/ -[10]:https://wesharethis.com/goto/http://kb.mozillazine.org/About:config -[11]:https://wesharethis.com/goto/http://www.bluecoat.com/ -[12]:https://wesharethis.com/goto/http://www.bluecoat.com/products/sockscap -[13]:https://wesharethis.com/goto/http://www.freecap.ru/eng/ -[14]:https://wesharethis.com/goto/http://widecap.ru/en/support/ -[15]:https://wesharethis.com/goto/http://tsocks.sourceforge.net/ -[16]:https://wesharethis.com/goto/http://proxychains.sourceforge.net/ -[17]:https://wesharethis.com/2017/07/14/creating-tcp-ip-port-forwarding-tunnels-ssh-8-possible-scenarios-using-openssh/ -[18]:https://wesharethis.com/2017/07/10/linux-swap-partition/ diff --git a/translated/tech/20170715 DYNAMIC PORT FORWARDING MOUNT A SOCKS SERVER WITH SSH.md b/translated/tech/20170715 DYNAMIC PORT FORWARDING MOUNT A SOCKS SERVER WITH SSH.md new file mode 100644 index 0000000000..8767ee8c99 --- /dev/null +++ b/translated/tech/20170715 DYNAMIC PORT FORWARDING MOUNT A SOCKS SERVER WITH SSH.md @@ -0,0 +1,164 @@ +动态端口转发:安装带有SSH的SOCKS服务器 +================= + +在上一篇文章中([Creating TCP / IP (port forwarding) tunnels with SSH: The 8 scenarios possible using OpenSSH][17]),我们看到了处理端口转发的所有可能情况。但是对于静态端口转发,我们只介绍了通过 SSH 连接来访问另一个系统的端口的情况。 + +在这篇文章中,我们脱离动态端口转发的前端,而尝试补充它。 + +当我们谈论使用 SSH 进行动态端口转发时,我们谈论的是将 SSH 服务器 转换为 [SOCKS][2] 服务器。那么什么是 SOCKS 服务器? + +你知道 [Web 代理][3]是用来做什么的吗?答案可能是肯定的,因为很多公司都在使用它。它是一个直接连接到互联网的系统,允许没有互联网访问的[内部网][4]客户端通过配置浏览器的代理来请求(尽管也有[透明代理][5])浏览网页。Web 代理除了允许输出到 Internet 之外,还可以缓存页面,图像等。资源已经由某些客户端下载,所以您不必为另一个客户端而下载它们。此外,它允许过滤内容并监视用户的活动。当然了,它的基本功能是转发 HTTP 和 HTTPS 流量。 + +一个 SOCKS 服务器提供的服务类似于公司内部网络提供的代理服务器服务,但不限于 HTTP/HTTPS,它还允许转发任何 TCP/IP 流量(SOCKS 5 也是 UDP)。 + +例如,假设我们希望在一个没有直接连接到互联网的内部网上使用基于 POP3 或 ICMP 的邮件服务和 Thunderbird 的 SMTP 服务。如果我们只有一个 web 代理可以用,我们可以使用的唯一的简单方式是使用一些 webmail(也可以使用 [Thunderbird 的 Webmail 扩展][6])。我们还可以[通过 HTTP 进行隧道传递][7]来利用代理。但最简单的方式是在网络中设置一个可用的 SOCKS 服务器,它可以让我们使用 POP3、ICMP 和 SMTP,而不会造成任何的不便。 + +虽然有很多软件可以配置非常专业的 SOCKS 服务器,我们这里使用 OpenSSH 简单地设置一个: + +> ``` +> Clientessh $ ssh -D 1080 user @ servidorssh +> ``` + +或者我们可以改进一下: + +> ``` +> Clientessh $ ssh -fN -D 0.0.0.0:1080 user @ servidorssh +> ``` + +其中: + +* 选项 `-D` 类似于选项为 `-L` 和 `-R` 的静态端口转发。像这样,我们就可以让客户端只监听本地请求或从其他节点到达的请求,具体的取决于我们将请求关联到哪个地址: + + > ``` + > -D [bind_address:] port + > ``` + + 在静态端口转发中可以看到,我们使用选项 `-R` 进行反向端口转发,而动态转发是不可能的。我们只能在 SSH 客户端创建 SOCKS 服务器,而不能在 SSH 服务器端创建。 + +* 1080 是 SOCKS 服务器的典型端口,正如 8080 是 Web 代理服务器的典型端口一样。 + +* 选项 `-N` 防止了远程 shell 交互式会话的实际启动。当我们只使用 `ssh` 来建立隧道时很有用。 + +* 选项 `-f` 会使 `ssh` 停留在后台并将其与当前 `shell` 分离,以便使进程成为守护进程。如果没有选项 `-N`(或不指定命令),则不起作用,否则交互式 shell 将与后台进程不兼容。 + + 使用 [PuTTY][8] 也可以非常简单地进行端口重定向。相当于 `ssh -D 0.0.0.0:1080` 使用此配置: + +![PuTTY SOCKS](https://wesharethis.com/wp-content/uploads/2017/07/putty_socks.png) + +对于通过 SOCKS 服务器访问另一个网络的应用程序,如果应用程序提供了特殊的支持,就会非常方便(虽然不是必需的),就像浏览器支持使用代理服务器一样。浏览器(如 Firefox 或 Internet Explorer)是使用 SOCKS 服务器访问另一个网络的应用程序示例: + +![Firefox SOCKS](https://wesharethis.com/wp-content/uploads/2017/07/firefox_socks.png) + +![Internet Explorer SOCKS](https://wesharethis.com/wp-content/uploads/2017/07/internetexplorer_socks.png) + +注意:使用 [IEs 4 Linux][1] 进行捕获:如果您需要 Internet Explorer 并使用 Linux,强烈推荐! + +然而,最常见的浏览器并不要求 SOCKS 服务器,因为它们通常与代理服务器配合得更好。 + +Thunderbird 也允许这样做,而且很有用: + +![Thunderbird SOCKS](https://wesharethis.com/wp-content/uploads/2017/07/thunderbird_socks.png) + +另一个例子:[Spotify][9] 客户端同样支持 SOCKS: + +![Spotify SOCKS](https://wesharethis.com/wp-content/uploads/2017/07/spotify_socks.png) + +我们需要记住的是名称解析。有时我们会发现,在目前的网络中,我们无法解析 SOCKS 服务器另一端所要访问的系统的名称。SOCKS 5 还允许我们传播 DNS 请求(UDP 允许我们使用 SOCKS 5)并将它们发送到另一端:可以指定是否要本地或远程解析(或者也可以测试两者)。支持这一点的应用程序也必须考虑到这一点。例如,Firefox 具有参数 `network.proxy.socks_remote_dns`(在 `about:config` 中),允许我们指定远程解析。默认情况下,它在本地解析。 + +Thunderbird 也支持参数 `network.proxy.socks_remote_dns`,但由于没有地址栏来放置 `about:config`,我们需要改变它,就像在 [MozillaZine:about:config][10] 中读到的,依次点击工具→选项→高级→常规→配置编辑器(按钮)。 + +没有对 SOCKS 特殊支持的应用程序可以被 “socksified”。这对于使用 TCP/IP 的许多应用程序都没有问题,但并不是全部,这将很好地工作。“Socksifier” 包括加载一个额外的库,它可以检测对 TCP/IP 堆栈的请求,并修改它们以通过 SOCKS 服务器重定向它们,以便通信中不需要使用 SOCKS 支持进行特殊的编程。 + +在 Windows 和 [Linux.][18] 上都有 “Socksifiers”。 + +对于 Windows,我们举个例子,SocksCap 是一种非商业用途的闭源但免费的产品,我使用了很长时间都十分满意。SocksCap 由一家名为 Permeo 的公司制造,该公司是创建 SOCKS 参考技术的公司。Permeo 被 [Blue Coat][11] 买下后,它[停止了 SocksCap 项目][12]。现在你仍然可以在互联网上找到 `sc32r240.exe` 文件。[FreeCap][13] 也是面向 Windows 的免费代码项目,外观和使用都非常类似于 SocksCap。然而,它工作起来更加糟糕,多年来一直没有维护。看起来,它的作者倾向于推出需要付款的新产品 [WideCap][14]。 + +这是 SocksCap 的一个方面,当我们 “socksified” 了几个应用程序。当我们从这里启动它们时,这些应用程序将通过 SOCKS 服务器访问网络: + +![SocksCap](https://wesharethis.com/wp-content/uploads/2017/07/sockscap.png) + +在配置对话框中可以看到,如果选择了协议 SOCKS 5,我们必须选择在本地或远程解析名称: + +![SocksCap settings](https://wesharethis.com/wp-content/uploads/2017/07/sockscap_settings.png) + +在 Linux 上,一直以来我们都有许多方案来替换一个单一的远程命令。在 Debian/Ubuntu 中,命令行输出: + +> ``` +> $ Apt-cache search socks +> ``` + +输出会告诉我们很多东西 + +最著名的是 [tsocks][15] 和 [proxychains][16]。他们的工作方式大致相同:只需启动我们想要与他们 “socksify” 的应用程序,就是这样。使用 `proxychains` 的 `wget` 的例子: + +> ``` +> $ Proxychains wget http://www.google.com +> ProxyChains-3.1 (http://proxychains.sf.net) +> --19: 13: 20-- http://www.google.com/ +> Resolving www.google.com ... +> DNS-request | Www.google.com +> | S-chain | - <- - 10.23.37.3:1080-<><>-4.2.2.2:53-<><>-OK +> | DNS-response | Www.google.com is 72.14.221.147 +> 72.14.221.147 +> Connecting to www.google.com | 72.14.221.147 |: 80 ... +> | S-chain | - <- - 10.23.37.3:1080-<><>-72.14.221.147:80-<><>-OK +> Connected. +> HTTP request sent, awaiting response ... 200 OK +> Length: unspecified [text / html] +> Saving to: `index.html ' +> +> [<=>] 6,016 24.0K / s in 0.2s +> +> 19:13:21 (24.0 KB / s) - `index.html 'saved [6016] +> ``` + +为此,我们必须指定要在 `/etc/proxychains.conf` 中使用的代理服务器: + +> ``` +> [ProxyList] +> Socks5 clientessh 1080 +> ``` + +DNS 请求是远程进行的: + +> ``` +> # Proxy DNS requests - no leak for DNS data +> Proxy_dns +> ``` + +另外,在前面的输出中,我们已经看到了同一个 `proxychains` 的几条信息性的消息,而不是标有字符串 `|DNS-request|`、`|S-chain|` 或 `|DNS-response|` 行中的 `wget`。如果我们不想看到它们,也可以在配置中进行调整: + +> ``` +> # Quiet mode (no output from library) +> Quiet_mode +> ``` + +-------------------------------------------------------------------------------- + +via: https://wesharethis.com/2017/07/15/dynamic-port-forwarding-mount-socks-server-ssh/ + +作者:[Ahmad][a] +译者:[firmianay](https://github.com/firmianay) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://wesharethis.com/author/ahmad/ +[1]:https://wesharethis.com/goto/http://www.tatanka.com.br/ies4linux/page/Main_Page +[2]:https://wesharethis.com/goto/http://en.wikipedia.org/wiki/SOCKS +[3]:https://wesharethis.com/goto/http://en.wikipedia.org/wiki/Proxy_server +[4]:https://wesharethis.com/goto/http://en.wikipedia.org/wiki/Intranet +[5]:https://wesharethis.com/goto/http://en.wikipedia.org/wiki/Proxy_server#Transparent_and_non-transparent_proxy_server +[6]:https://wesharethis.com/goto/http://webmail.mozdev.org/ +[7]:https://wesharethis.com/goto/http://en.wikipedia.org/wiki/HTTP_tunnel_(software) +[8]:https://wesharethis.com/goto/http://www.chiark.greenend.org.uk/~sgtatham/putty/download.html +[9]:https://wesharethis.com/goto/https://www.spotify.com/int/download/linux/ +[10]:https://wesharethis.com/goto/http://kb.mozillazine.org/About:config +[11]:https://wesharethis.com/goto/http://www.bluecoat.com/ +[12]:https://wesharethis.com/goto/http://www.bluecoat.com/products/sockscap +[13]:https://wesharethis.com/goto/http://www.freecap.ru/eng/ +[14]:https://wesharethis.com/goto/http://widecap.ru/en/support/ +[15]:https://wesharethis.com/goto/http://tsocks.sourceforge.net/ +[16]:https://wesharethis.com/goto/http://proxychains.sourceforge.net/ +[17]:https://wesharethis.com/2017/07/14/creating-tcp-ip-port-forwarding-tunnels-ssh-8-possible-scenarios-using-openssh/ +[18]:https://wesharethis.com/2017/07/10/linux-swap-partition/ From 9ea4734385e230f0b20ccdb1d3e38f1d85045183 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 3 Aug 2017 18:17:59 +0800 Subject: [PATCH 0901/1407] PRF&PUB:20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md @geekpi --- ... with Husarion CORE2-ROS running Ubuntu.md | 25 +++++++++---------- 1 file changed, 12 insertions(+), 13 deletions(-) rename {translated/tech => published}/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md (68%) diff --git a/translated/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md b/published/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md similarity index 68% rename from translated/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md rename to published/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md index 72d1a8606e..ac8af33325 100644 --- a/translated/tech/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md +++ b/published/20170712 Robot development made easy with Husarion CORE2-ROS running Ubuntu.md @@ -2,28 +2,27 @@ ============================================================ +_这是游客投稿的本系列两篇中的第一篇;作者:Dominik Nowak,Husarion 的 CEO _ -### 分享或保存 +过去十年,我们见证了 IT 行业的许多突破。可以说对消费者最有意义的一个方面是智能手机和移动开发的普及。接下来的大事件是什么,现在智能手机是如此常见,我们天天对着它,是不是有点无聊吗?所以,我们猜是:机器人。 -_这是游客投稿的本系列两篇中的第一篇;Dominik Nowak,Husarion 的 CEO _ +众所周知,许多生产线完全由机器人运行。但在消费者和服务方面,还没有看到巨大的突破。我们认为这是一个可达性和降低开发人员进入的门槛的问题。只需要有好的、简单的工具来快速做出原型和开发机器人。为了测试新的想法并赋予工程师们更多能力,以便他们可以解决许多人类仍然面临的问题,那些比在应用中的点按一下更棘手的问题。 -过去十年,我们见证了 IT 行业的许多突破。可以说对消费者最有意义的一个方面是智能手机和移动开发的普及。接下来的大事件是什么,现在智能手机是如此常见,让我们面对它,有点无聊吗?我们猜是:机器人。 - -众所周知,许多生产线完全由机器人运行。但在消费者和服务方面,还没有看到巨大的突破。我们认为这是一个无障碍的问题,并降低开发人员进入的门槛。这只需要好的,简单的工具来快速做出原型和开发机器人。为了测试新的想法并赋予工程师权利,所以他们可以解决许多人类仍然面临的问题。比应用中的点按更棘手的问题。 - -构建机器人是一个具有挑战性的任务,[Husarion][2] 团队正在努力使其更容易。Husarion 是一家从事机器人快速开发平台的机器人公司。该公司的产品是 CORE2 机器人控制器和云平台,它用于管理所有基于 CORE2 的机器人。CORE2 是第二代 Husarion 机器人控制器,它可在[这里][3]看到。 +构建机器人是一个具有挑战性的任务,[Husarion][2] 团队正在努力使其更容易。Husarion 是一家从事于机器人快速开发平台的机器人公司。该公司的产品是 CORE2 机器人控制器和用于管理所有基于 CORE2 的机器人的云平台。CORE2 是第二代 Husarion 机器人控制器,它可在[这里][3]找到。 CORE2 结合了实时微控制器板和运行 Ubuntu 的单板计算机。Ubuntu 是最受欢迎的 Linux 发行版,不仅适用于[桌面][4],还适用于物联网和 [机器人][5]程序中的嵌入式硬件。 ![](https://insights.ubuntu.com/wp-content/uploads/2c47/husarion.png) -CORE2 控制器有两种配置。第一款采用 ESP32 Wi-Fi 模块的专用于需要低功耗和实时、安全遥控的机器人应用。第二个,称为 CORE2-ROS,基本来讲集成了两块板: +CORE2 控制器有两种配置。第一款是采用 ESP32 Wi-Fi 模块的,专用于需要低功耗和实时、安全遥控的机器人应用。第二款,称为 CORE2-ROS,基本上是将两块板子集成到了一起: + - 使用实时操作系统(RTOS)的实时微控制器并集成电机、编码器和传感器接口的电路板 - 带有 ROS([Robot Operating System] [6])包的运行 Linux 的单板计算机(SBC)和其他软件工具。 -“实时”电路板做底层工作。它包含高效的 STM32F4 系列微控制器,非常适用于驱动电机、读码器、与传感器通信,并控制整个机电或机器人系统。在大多数应用中,CPU 负载不超过几个百分点,实时操作由基于 RTOS 的专用编程框架保证。我们还保证与 Arduino 库的兼容性。大多数任务都在微控制器外设中处理,如定时器、通信接口、ADC 等,它具有中断和 DMA 通道的强大支持。简而言之,对于具有其他任务的单板计算机来说,这不是一项任务。 +“实时”电路板做底层工作。它包含高效的 STM32F4 系列微控制器,非常适用于驱动电机、读码器、与传感器通信,并控制整个机电或机器人系统。在大多数应用中,CPU 负载不超过几个百分点,实时操作由基于 RTOS 的专用编程框架支持。我们还保证与 Arduino 库的兼容性。大多数任务都在微控制器外设中处理,如定时器、通信接口、ADC 等,它具有中断和 DMA 通道的强大支持。简而言之,对于具有其他任务的单板计算机来说,这不是一项任务。 + +另一方面,很显然,现代先进的机器人程序不能仅仅基于微控制器,原因如下: -另一方面,很显然,现代和先进的机器人程序不能仅仅基于微控制器,原因如下: - 自动机器人需要大量的处理能力来执行导航、图像和声音识别、移动等等, - 编写先进的软件需要标准化才能有效 - SBC 在行业中越来越受欢迎,而对于为 SBC 编写的软件也是如此,这与 PC 电脑非常相似 - SBC 每年都变得越来越便宜 @@ -31,15 +30,15 @@ CORE2 控制器有两种配置。第一款采用 ESP32 Wi-Fi 模块的专用于 CORE2-ROS 控制器有两种配置:[Raspberry Pi 3][7] 或 [ASUS Tinker Board][8]。CORE-ROS 运行于 Ubuntu、Husarion 开发和管理工具以及 ROS 软件包上。 -下篇文章将发现为何 Husarion 决定使用 Ubuntu +下篇文章将介绍为何 Husarion 决定使用 Ubuntu 。 -------------------------------------------------------------------------------- via: https://insights.ubuntu.com/2017/07/12/robot-development-made-easy-with-husarion-core2-ros-running-ubuntu/ -作者:[Guest ][a] +作者:[Dominik Nowak][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/) 荣誉推出 From cfaa4631146d6d4aa89c6853b1875e1847e2b692 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 3 Aug 2017 19:56:22 +0800 Subject: [PATCH 0902/1407] PRF&PUB:20170712 Storage management in LXD 2.15.md @geekpi --- ...20170712 Storage management in LXD 2.15.md | 27 ++++++++----------- 1 file changed, 11 insertions(+), 16 deletions(-) rename {translated/tech => published}/20170712 Storage management in LXD 2.15.md (83%) diff --git a/translated/tech/20170712 Storage management in LXD 2.15.md b/published/20170712 Storage management in LXD 2.15.md similarity index 83% rename from translated/tech/20170712 Storage management in LXD 2.15.md rename to published/20170712 Storage management in LXD 2.15.md index 9bd6b2483b..16e4ec9c3c 100644 --- a/translated/tech/20170712 Storage management in LXD 2.15.md +++ b/published/20170712 Storage management in LXD 2.15.md @@ -1,31 +1,27 @@ LXD 2.15 中的存储管理 ============================================================ - -### 分享或保存 - ![containers](https://cbrauner.files.wordpress.com/2017/07/containers.png?w=1008) -长久以来 LXD 已经支持多种存储驱动。用户可以在 zfs、btrfs、lvm 或纯目录存储池之间进行选择,但它们只能使用单个存储池。一个被频繁被提到的需求是不仅支持单个存储池,还支持多个存储池。这样,用户可以维护一个由 SSD 支持的 zfs 存储池用于 I/O 密集型容器,另一个简单的基于目录的存储池用于其他容器。幸运的是,现在这是可能的,因为 LXD 在几个版本后有了自己的存储管理 API。 +长久以来 LXD 已经支持多种存储驱动。用户可以在 zfs、btrfs、lvm 或纯目录存储池之间进行选择,但他们只能使用单个存储池。一个被频繁被提到的需求是不仅支持单个存储池,还支持多个存储池。这样,用户可以维护一个由 SSD 支持的 zfs 存储池用于 I/O 密集型容器,另一个简单的基于目录的存储池用于其他容器。幸运的是,现在这是可能的,因为 LXD 在几个版本后有了自己的存储管理 API。 ### 创建存储池 新安装 LXD 没有定义任何存储池。如果你运行 `lxd init` ,LXD 将提供为你创建一个存储池。由 `lxd init` 创建的存储池将是创建容器的默认存储池。 - - [![asciicast](https://asciinema.org/a/126892.png)][2] +[![asciicast](https://asciinema.org/a/126892.png)][2] ### 创建更多的存储池 我们的客户端工具使得创建额外的存储池变得非常简单。为了创建和管理新的存储池,你可以使用 `lxc storage` 命令。所以如果你想在块设备 `/dev/sdb` 上创建一个额外的 btrfs 存储池,你只需使用 `lxc storage create my-btrfs btrfs source=/dev/sdb`。让我们来看看: - [![asciicast](https://asciinema.org/a/128580.png)][3] +[![asciicast](https://asciinema.org/a/128580.png)][3] ### 在默认存储池上创建容器 -如果你从全新安装的 LXD 开始,并通过 `lxd init` 创建了一个存储池,LXD 将使用此池作为默认存储池。这意味着如果你执行 `lxc launch images:ubuntu/xenial xen1`,LXD 将为此存储池上的容器的根文件系统创建一个存储卷。在示例中,我们使用 `my-first-zfs-pool` 作为默认存储池 +如果你从全新安装的 LXD 开始,并通过 `lxd init` 创建了一个存储池,LXD 将使用此池作为默认存储池。这意味着如果你执行 `lxc launch images:ubuntu/xenial xen1`,LXD 将为此存储池上的容器的根文件系统创建一个存储卷。在示例中,我们使用 `my-first-zfs-pool` 作为默认存储池。 - [![asciicast](https://asciinema.org/a/128582.png)][4] +[![asciicast](https://asciinema.org/a/128582.png)][4] ### 在特定存储池上创建容器 @@ -37,24 +33,23 @@ LXD 2.15 中的存储管理 如果你其中一个容器需要额外的空间存储额外的数据,那么新的存储 API 将允许你创建可以连接到容器的存储卷。只需要 `lxc storage volume create my-btrfs my-custom-volume`: - [![asciicast](https://asciinema.org/a/128584.png)][6] +[![asciicast](https://asciinema.org/a/128584.png)][6] ### 连接自定义卷到容器中 -Of course this feature is only helpful because the storage API let’s you attach those storage volume to containers. To attach a storage volume to a container you can use `lxc storage volume attach my-btrfs my-custom-volume xen1 data /opt/my/data`: 当然,这个功能是有用的,因为存储 API 让你把这些存储卷连接到容器。要将存储卷连接到容器,可以使用 `lxc storage volume attach my-btrfs my-custom-volume xen1 data /opt/my/data`: - [![asciicast](https://asciinema.org/a/128585.png)][7] +[![asciicast](https://asciinema.org/a/128585.png)][7] ### 在容器之间共享自定义存储卷 默认情况下,LXD 将使连接的存储卷由其所连接的容器写入。这意味着它会将存储卷的所有权更改为容器的 id 映射。但存储卷也可以同时连接到多个容器。这对于在多个容器之间共享数据是非常好的。但是,这有一些限制。为了将存储卷连接到多个容器,它们必须共享相同的 id 映射。让我们创建一个额外的具有一个隔离的 id 映射的容器 `xen-isolated`。这意味着它的 id 映射在这个 LXD 实例中将是唯一的,因此没有其他容器具有相同的id映射。将相同的存储卷 `my-custom-volume` 连接到此容器现在将会失败: - [![asciicast](https://asciinema.org/a/128588.png)][8] +[![asciicast](https://asciinema.org/a/128588.png)][8] 但是我们让 `xen-isolated` 与 `xen1` 有相同的映射,并把它重命名为 `xen2` 来反映这个变化。现在我们可以将 `my-custom-volume` 连接到 `xen1` 和 `xen2` 而不会有问题: - [![asciicast](https://asciinema.org/a/128593.png)][9] +[![asciicast](https://asciinema.org/a/128593.png)][9] ### 总结 @@ -66,9 +61,9 @@ Of course this feature is only helpful because the storage API let’s you attac via: https://insights.ubuntu.com/2017/07/12/storage-management-in-lxd-2-15/ -作者:[Christian Brauner ][a] +作者:[Christian Brauner][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/) 荣誉推出 From e3d74c0a1473863784a89fe42b1219d5f80e521e Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 3 Aug 2017 22:58:27 +0800 Subject: [PATCH 0903/1407] PRF:20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @rieonke 翻译的很好很流畅! --- ...at You Think You Know is Probably Wrong.md | 109 ++++++++---------- 1 file changed, 48 insertions(+), 61 deletions(-) diff --git a/translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md b/translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md index 7fc838b30f..a405e18300 100644 --- a/translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md +++ b/translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md @@ -1,120 +1,107 @@ -Docker vs. Kubernetes vs. Apache Mesos: 为什么你认为你知道的可能是错的 +Docker、Kubernetes 和 Apache Mesos 对比中的一些误区 ============================================================ -有无数的文章、讨论、以及很多社区喋喋不休地比较 Docker ,Kubernetes 和 Mesos。如果你只是听信了只言片语,你可能会认为这三个开源项目正为了称霸容器界而殊死搏斗。你还相信从他们中选出一个来几乎是一种宗教选择;真正的信徒忠于他们的信仰,烧死那些异教徒,谁还敢考虑一个替代的方案。 +有无数的文章、讨论、以及很多社区喋喋不休地比较 Docker、Kubernetes 和 Mesos。如果你只是听信了只言片语,你可能会认为这三个开源项目正为了称霸容器界而殊死搏斗。你可能还相信从他们中选出一个如宗教信仰般神圣——真正的信徒会忠于他们的信仰,而且会烧死那些敢于考虑替代方案的异教徒。 那都是废话。 -虽然所有这三种技术都使得使用容器来部署、管理和伸缩应用成为可能,但实际上它们各自解决了不同的问题,并且根植于迥异的上下文环境中。事实上,这三种被广泛采用的工具,都是有差别的。 +虽然所有这三种技术都使得使用容器来部署、管理和伸缩应用成为可能,但实际上它们各自解决了不同的问题,并且根植于迥异的上下文环境中。事实上,这三种被广泛采用的工具链,都是有差别的。 -让我们重新审视每个项目的原始任务,技术架构,以及他们如何相互补充和交互。而不是纠结于比较这些快速迭代的技术之间重叠的特性。 +让我们重新审视每个项目的原始任务、技术架构,以及它们是如何相互补充和交互的,而不是纠结于比较这些快速迭代的技术之间重叠的特性。 -### 让我们从Docker开始… +### 让我们从 Docker 开始…… -Docker 公司, 始于名为dotCloud的平台即服务(PaaS)供应商。dotCloud团队发现,在许多应用和客户之间管理依赖和二进制文件时需要付出大量的工作。因此他们将Linux cgroups和namespace的一些功能合并成一个单一且易于使用的包,以便于应用程序可以在任何基础设施上一致地运行。这个包就是Docker镜像。Docker镜像提供了如下的功能: +Docker 公司,始于名为 dotCloud 的平台即服务(PaaS)供应商。dotCloud 团队发现,在许多应用和客户之间管理依赖和二进制文件时需要付出大量的工作。因此他们将 Linux 的 [cgroups][1] 和 namespace 的一些功能合并成一个单一且易于使用的软件包,以便于应用程序可以一致地运行在任何基础设施上。这个软件包就是所谓的 [Docker 镜像][2],它提供了如下的功能: -* 将应用程序和依赖库封装在一个包( Docker 镜像)中, 因此应用可以被一致地部署在各个环境上; +* **将应用程序和依赖库封装在一个软件包**(即 Docker 镜像)中,因此应用可以被一致地部署在各个环境上; +* **提供类似 Git 的语义**,例如 `docker push`,`docker commit` 等命令让应用开发者可以快速接受这门新的技术,并将其融入到现有的工作流中; +* **定义 Docker 镜像为不可变的层**,支持不可变的基础设施。新提交的变更被分别保存为只读层,让复用镜像和追踪变更记录变得十分简单。层还通过只传输更新而不是整个镜像来节省磁盘空间和网络流量; +* **通过实例化不可变的镜像**和读写层来运行 Docker 容器,读写层可以临时地存储运行时变更,从而轻松部署和扩展应用程序的多个实例。 -* 提供类似 Git 的语义, 例如“docker push”,“docker commit”等命令让应用开发者可以快速接受这门新的技术,并将其融入到现有的工作流中; +Docker 变得越来越受欢迎,开发者们开始从在笔记本电脑上运行容器转而在生产环境中运行容器。跨多个机器之间协调这些容器需要额外的工具,这称之为容器编排container orchestration。有趣的是,第一个支持 Docker 镜像的容器编排工具(2014 年 6月)是 Apache Mesos 的 [Marathon][3](后面会有详细介绍) 。那年,Docker 的创始人兼首席技术官 Solomon Hykes 将 Mesos 推荐为“[生产集群的黄金标准][4]”。不久之后,除了 Mesos 的 Marathon 之外,还出现了许多的容器编排技术:[Nomad][4]、[Kubernetes][5],不出所料还有 Docker Swarm ([它如今是 Docker 引擎的一部分][7])。 -* 定义 Docker 镜像为不可变的层, 支持不可变的基础设施。新提交的变更被分别保存为只读层,让复用镜像和追踪变更记录变得十分简单。层还通过只传输更新而不是整个镜像来节省磁盘空间和网络流量; +随着 Docker 开始商业化其开源的文件格式(LCTT 译注:指 Docker 镜像的 dockerfile 文件格式),该公司还开始引入工具来完善其核心的 Docker 文件格式和运行时引擎,包括: -* 通过实例化不可变的镜像和读写层来运行 Docker 容器,读写层可以临时地存储运行时变更,从而轻松部署和扩展应用程序的多个实例; - -Docker 变得越来越受欢迎,开发者们开始从笔记本电脑上运行容器迁移到生产环境中。 跨多个机器之间协调这些容器需要额外的工具,称之为容器编排。有趣的是,第一个支持 Docker 镜像(2014 年 6月)的容器编排工具是 Apache Mesos(后面会有详细介绍) 的[Marathon][3]。那年,Docker的创始人兼首席技术官Solomon Hykes将Mesos推荐为“[生产集群的黄金标准][4]”。不久之后,除了Mesos 的Marathon 之外,还有出现了许多的容器编排技术:[Nomad][4],[Kubernetes][5],不出所料还有Docker Swarm([如今是Docker 引擎的一部分][7])。 - -随着Docker开始将其开源产品商业化,该公司还开始引入工具来补充Docker核心和运行时引擎,包括: - -* 为存储公共Docker镜像的而生的Docker hub; - -* 存储私有镜像的 Docker 仓库(Docker registry); - -* Docker cloud,用于构建和运行容器的服务; - -* Docker 数据中心作为一种商业产品体现了许多Docker技术; +* 为公开存储 Docker 镜像的而生的 Docker hub; +* 存储私有镜像的 Docker 仓库(Docker registry); +* Docker cloud,用于构建和运行容器的管理性服务; +* Docker 数据中心作为一种商业产品体现了许多 Docker 技术; ![Docker](https://mesosphere.com/wp-content/uploads/2017/07/docker-host.png) -来源: www.docker.com. +*来源: www.docker.com* -Docker 将软件及其依赖关系封装在一个软件包中的洞察力改变了软件行业的游戏规则,正如mp3的出现重塑了音乐行业一般。Docker 成为行业标准,领先的容器技术供应商(包括Docker,Google,Pivotal,Mesosphere 等) 组建了 [Cloud Native Computing Foundation (CNCF)][8] 和 [Open Container Initiative (OCI)][9]。如今, CNCF 和 OCI 旨在确保容器技术之间的互操性和标准化接口,并确保使用任何工具构建的任何Docker容器都可以在任何运行时或基础架构上运行。 +Docker 将软件及其依赖关系封装在一个软件包中的洞察力改变了软件行业的游戏规则,正如 mp3 的出现重塑了音乐行业一般。Docker 文件格式成为行业标准,领先的容器技术供应商(包括 Docker、Google、Pivotal、Mesosphere 等) 组建了 [云计算基金会Cloud Native Computing Foundation (CNCF)][8] 和 [开放容器推进联盟Open Container Initiative (OCI)][9]。如今,CNCF 和 OCI 旨在确保容器技术之间的互操性和标准化接口,并确保使用任何工具构建的任何 Docker 容器都可以在任何运行时或基础架构上运行。 ### 进入 Kubernetes -Google很早就认识到了Docker的潜力,并试图在Google Cloud Platform上提供容器业务流程“即服务”。 Google在容器方面拥有丰富的经验(他们在Linux中引入了cgroups),但现有的内部容器和Borg等分布式计算工具直接与其原有基础架构相耦合。所以,Google没有使用原有系统的任何代码,而是从头开始设计Kubernetes来编排Docker容器。 Kubernetes于2015年2月发布,目标和考虑如下: +Google 很早就认识到了 Docker 的潜力,并试图在 Google Cloud Platform (GCP)上提供容器编排“即服务”。 Google 在容器方面拥有丰富的经验(是他们在 Linux 中引入了 cgroups),但现有的内部容器和 Borg 等分布式计算工具直接与其基础架构相耦合。所以,Google 没有使用原有系统的任何代码,而是从头开始设计 Kubernetes (K8S)来编排 Docker 容器。 Kubernetes 于 2015 年 2 月发布,其目标和考虑如下: -* 为应用程序开发人员提供编排Docker容器的强大工具,而无需与底层基础设施交互; +* **为应用程序开发人员提供**编排 Docker 容器的强大工具,而无需与底层基础设施交互; +* **提供标准部署接口**和原语,以实现云端一致的应用部署体验和 API; +* **基于模块化 API 核心**,允许供应商围绕 Kubernetes 的核心技术集成其系统。 -* 提供标准部署接口和原语 ,以实现云端一致的应用部署体验和API; - -* 基于模块化API核心,允许供应商围绕Kubernetes的核心技术集成其系统。 - -2016年3月,Google[将Kubernetes捐赠][10]给了CNCF,今天仍然是该项目的主要负责人(其次是Redhat,CoreOS等)。 +2016 年 3 月,Google [将 Kubernetes 捐赠][10]给了 CNCF,并且直到今天仍然是该项目的主要贡献者(其次是Redhat,CoreOS 等)。 ![Kubernetes](https://mesosphere.com/wp-content/uploads/2017/07/kubernetes-architecture.png) -来源: wikipedia +*来源: wikipedia* -Kubernetes对应用程序开发人员非常有吸引力,因为它减轻了对基础架构和运营团队的依赖程度。供应商也喜欢Kubernetes,因为它提供了一个容易的方式来拥抱容器化运动,并为客户部署Kubernetes(这仍然是一个非常重要的工作)提供商业解决方案。 Kubernetes也是有吸引力的,因为它是CNCF旗下的开源项目,与Docker Swarm相反,Docker Swarm尽管是开源的,但是被Docker公司紧紧地掌控着。 +Kubernetes 对应用程序开发人员非常有吸引力,因为它减轻了对基础架构和运营团队的依赖程度。供应商也喜欢 Kubernetes,因为它提供了一个容易的方式来拥抱容器化运动,并为客户部署自己的 Kubernetes(这仍然是一个值得重视的挑战)提供商业解决方案。 Kubernetes 也是有吸引力的,因为它是 CNCF 旗下的开源项目,与 Docker Swarm 相反,Docker Swarm 尽管是开源的,但是被 Docker 公司紧紧地掌控着。 - -Kubernetes的核心优势是为应用程序开发人员提供了用于编排无状态Docker容器的强大工具。 虽然有多个扩大项目范围的提议,以提供更多的功能(例如分析和有状态数据服务)。虽然这些提议仍处于非常早期的阶段,他们能取得多大的成功还有待观察。 +Kubernetes 的核心优势是为应用程序开发人员提供了用于编排无状态 Docker 容器的强大工具。 虽然有多个扩大项目范围的提议,以提供更多的功能(例如分析和有状态数据服务),但这些提议仍处于非常早期的阶段,它们能取得多大的成功还有待观察。 ### Apache Mesos -Apache Mesos 始于加州大学伯克利分校(UC Berkeley)的下一代容器集群管理器项目,并应用了从云计算分布式计算基础架构(如[Google的Borg][11]和[Facebook的Tupperware][12])中习得的经验和教训。 虽然Borg和Tupperware具有单一的架构,并且是与物理基础架构紧密结合的闭源专有技术,但Mesos推出了一种模块化架构,一种开源开发方法,旨在完全独立于基础架构。Mesos迅速被 [Twitter][13],[Apple(Siri)][14], [Yelp][15], [Uber][16], [Netflix][17] 和许多领先的技术公司采用,支持从微服务,大数据和实时分析到弹性扩展的一切。 +Apache Mesos 始于加州大学伯克利分校UC Berkeley的下一代容器集群管理器项目,并应用了从云计算级别的分布式基础架构(如 [Google 的 Borg][11] 和 [Facebook 的 Tupperware][12])中习得的经验和教训。 虽然 Borg 和 Tupperware 具有单一的架构,并且是与物理基础架构紧密结合的闭源专有技术,但 Mesos 推出了一种模块化架构,一种开源的开发方法,旨在完全独立于基础架构。Mesos 迅速被 [Twitter][13]、[Apple(Siri 中)][14]、[Yelp][15]、[Uber][16]、[Netflix][17] 和许多领先的技术公司采用,支持从微服务、大数据和实时分析到弹性扩展的一切。 -作为集群管理器,Mesos被设计用来解决一系列不同的挑战: +作为集群管理器,Mesos 被设计用来解决一系列不同的挑战: -* 将数据中心资源抽象为单个池来简化资源分配,同时在私有云或公有云中提供一致的应用和运维体验; +* **将数据中心资源抽象**为单个池来简化资源分配,同时在私有云或公有云中提供一致的应用和运维体验; +* 在相同的基础架构上**协调多个工作负载**,如分析、无状态微服务、分布式数据服务和传统应用程序,以提高利用率,降低成本和台面空间; +* 为应用程序特定的任务(如部署、自我修复、扩展和升级),**自动执行第二天的操作**;提供高度可用的容错基础设施; +* **提供持久的可扩展性**来运行新的应用程序和技术,而无需修改集群管理器或其上构建的任何现有应用程序; +* **弹性扩展**可以将应用程序和底层基础设施从少量扩展到数十到数万个节点。 -* 在相同的基础架构上协调多个工作负载,如分析、无状态微服务、分布式数据服务和传统应用程序,以提高利用率,降低成本和台面空间; - -* 为应用程序特定的任务(如部署,自我修复,扩展和升级),自动执行第二天的操作;提供高度可用的容错基础设施; - -* 提供持久的可扩展性来运行新的应用程序和技术,而无需修改集群管理器或其上构建的任何现有应用程序;提供常规的可扩展性来运行新的应用程序和技术,而无需修改集群管理器或其上构建的任何现有应用程序; - -* 弹性扩展,将应用程序和底层基础设施从少量扩展到数十到数万个节点。 - - -Mesos独有的独立管理各种工作负载的能力 - 包括传统应用程序,如Java,无状态Docker微服务,批处理作业,实时分析和有状态的分布式数据服务。Mesos广泛的工作负载覆盖来自于其两级架构,从而实现了“应用感知”调度。 通过将应用程序特定的操作逻辑封装在“Mesos框架”(类似于操作中的运行手册)中来实现应用程序感知调度。资源管理器Mesos Master提供这些框架基础架构的部分,同时保持隔离。这种方法允许每个工作负载都有自己的专门构建的应用程序调度程序,可以了解其部署,扩展和升级的特定操作要求。 应用程序调度程序也是独立开发,管理和更新的,这让Mesos拥有高可扩展的能力,支持新的工作负载或随着时间的推移增加更多的操作功能。 +Mesos 独有的独立管理各种工作负载的能力 —— 包括 Java 这样的传统应用程序、无状态 Docker 微服务、批处理作业、实时分析和有状态的分布式数据服务。Mesos 广泛的工作负载覆盖来自于其两级架构,从而实现了“应用感知”调度。通过将应用程序特定的操作逻辑封装在“Mesos 框架”(类似于操作中的运行手册)中来实现应用程序感知调度。资源管理器 Mesos Master 提供了这些框架基础架构的部分,同时保持隔离。这种方法允许每个工作负载都有自己的专门构建的应用程序调度程序,可以了解其部署、扩展和升级的特定操作要求。应用程序调度程序也是独立开发、管理和更新的,这让 Mesos 拥有高度可扩展的能力,支持新的工作负载或随着时间的推移而增加更多的操作功能。 ![Mesos two-level scheduler](https://mesosphere.com/wp-content/uploads/2017/07/mesos-two-level-scheduler.png) -举一个例子,团队如何管理应用软件升级。 无状态应用程序可以从[“蓝/绿”][18]部署方案中受益;当新版本的应用运行起来时,原先旧版本的软件依然还正常运转着,然后当旧应用被销毁时流量将会切换到新的应用上。但是升级数据工作负载例如 HDFS 或者 Cassandra 要求节点停机一次,此时需要持久化本地数据以防止数据丢失,并且按照特定的顺序执行原位升级,在升级之前和升级完成之后,都要在每一个节点类型上执行特定的检查和命令。任何这些步骤都是应用程序或服务特定的,甚至可能是版本特定的。 这让使用常规容器编排调度程序来管理数据服务变得非常困难。 -Mesos以每一个工作负载所需的特定方式管理各种工作负载,使得许多公司将Mesos作为一个统一的平台,将微服务和数据服务结合在一起。数据密集型应用程序的通用参考架构是[“SMACK”][19](译者按:SMACK即Spark,Mesos,Akka,Cassandra,Kafka)。 +举一个团队如何管理应用软件升级的例子。无状态应用程序可以从[“蓝/绿”][18]部署方案中受益;当新版本的应用运行起来时,原先旧版本的软件依然还正常运转着,然后当旧应用被销毁时流量将会切换到新的应用上。但是升级数据工作负载例如 HDFS 或者 Cassandra 要求节点停机一次,此时需要持久化本地数据卷以防止数据丢失,并且按照特定的顺序执行原位升级,在升级之前和升级完成之后,都要在每一个节点类型上执行特定的检查和命令。任何这些步骤都是应用程序或服务特定的,甚至可能是版本特定的。这让使用常规容器编排调度程序来管理数据服务变得非常困难。 + +Mesos 以每一个工作负载所需的特定方式管理各种工作负载,使得许多公司将 Mesos 作为一个统一的平台,将微服务和数据服务结合在一起。数据密集型应用程序的通用参考架构是 [“SMACK 家族”][19](LCTT 译注:SMACK 即Spark、Mesos、Akka、Cassandra、Kafka)。 ### 是时候搞清楚这些了 -请注意,我们尚未对Apache Mesos的容器编排有任何描述。所以为什么人们会自动地将Mesos和容器编排联系起来呢?容器编排是可以在Mesos的模块化架构上运行的工作负载的一个例子,它是通过一个专门的编排“框架”来完成的,这个框架就Marathon,一个构建于Mesos之上的工具。 Marathon最初是为了在[cgroup][20] 容器中编排应用文档(如JAR,tarballs,ZIP文件)而开发的,是2014年最先支持Docker容器的编排工具之一。 +请注意,我们尚未对 Apache Mesos 的容器编排有任何描述。所以为什么人们会自动地将 Mesos 和容器编排联系起来呢?容器编排是可以在 Mesos 的模块化架构上运行的工作负载的一个例子,它是通过一个专门的编排“框架”来完成的,这个框架就 Marathon,一个构建于 Mesos 之上的工具。 Marathon 最初是为了在 [cgroup][20] 容器中编排应用归档(如 JAR、tarball、ZIP 文件)而开发的,是 2014 年最先支持 Docker 容器的编排工具之一。 -所以当人们将Docker和Kubernetes与Mesos进行比较时,他们实际上是将Kubernetes和Docker Swarm与在Mesos上运行的Marathon进行了比较。 +所以当人们将 Docker 和 Kubernetes 与 Mesos 进行比较时,他们实际上是将 Kubernetes 和 Docker Swarm 与在 Mesos 上运行的 Marathon 进行比较。 -为什么搞清楚这一点很重要? 因为Mesos坦率地讲并不在乎它上面运行了什么。 Mesos可以在共享的基础设施上弹性地为Java应用服务器提供集群服务,Docker容器编排,Jenkins 持续集成任务,Apache Spark分析,Apache Kafka 流,以及更多其他的服务。Mesoss甚至可以运行Kubernetes 或者其他的容器编排工具,即使公共的集成目前还不可用。 +为什么搞清楚这一点很重要? 因为 Mesos 坦率地讲并不在乎它上面运行了什么。 Mesos 可以在共享的基础设施上弹性地为 Java 应用服务器提供集群服务、Docker 容器编排、Jenkins 持续集成任务、Apache Spark 分析、Apache Kafka 流,以及更多其他的服务。Mesos 甚至可以运行 Kubernetes 或者其他的容器编排工具,即使公共的集成目前还不可用。 ![Mesos Workloads](https://mesosphere.com/wp-content/uploads/2017/07/mesos-workloads.png) -来源: Apache Mesos 调查 2016 +*来源: Apache Mesos 2016 调查问卷* -Mesos的另一个考虑因素(也是为什么它对许多企业架构师来说如此有吸引力)是运行关键任务工作负载的成熟度。 Mesos已经在大规模生产环境下(成千上万台服务器)运行了超过7年的时间,这就是为什么它比市场上许多其他的容器技术更具有生产上的可行性和扩展上的可靠性。 +Mesos 的另一个考虑因素(也是为什么它对许多企业架构师来说如此有吸引力)是运行关键任务工作负载的成熟度。 Mesos 已经在大规模生产环境下(成千上万台服务器)运行了超过 7 年的时间,这就是为什么它比市场上许多其他的容器技术更具有生产上的可行性和扩展上的可靠性。 ### 我所说的这些什么意思? -总而言之,所有这三种技术都与Docker容器有关,可以让你在容器编排上实现应用程序的可移植性和扩展性。那么你在它们之间如何选择呢? 归根到底是为工作选择合适的工具(也可能是为不同的工作选择不同的工具)。如果您是一个应用开发人员,正在寻找现代化的方式来构建和打包你的应用程序,或者加速你的微服务计划,Docker容器和开发工具就是最好的选择。 +总而言之,所有这三种技术都与 Docker 容器有关,可以让你在容器编排上实现应用程序的可移植性和扩展性。那么你在它们之间如何选择呢? 归根到底是为工作选择合适的工具(也可能是为不同的工作选择不同的工具)。如果您是一个应用开发人员,正在寻找现代化的方式来构建和打包你的应用程序,或者想加速你的微服务计划,Docker 容器和开发工具就是最好的选择。 -如果你们是一个dev / devops团队,并希望构建一个专门用于Docker容器编排的系统,而且愿意花时间折腾集成解决方案与底层基础设施(或依靠公共云基础架构,如Google容器引擎或Azure容器服务),Kubernetes是一个可以考虑的好技术。 +如果你们是一个开发人员或者 DevOps 的团队,并希望构建一个专门用于 Docker 容器编排的系统,而且愿意花时间折腾集成解决方案与底层基础设施(或依靠公共云基础架构,如 Google 容器引擎(GCE)或 Azure 容器服务(ACS)),Kubernetes 是一个可以考虑的好技术。 -如果你们需要建立一个运行多个关键任务工作负载的可靠平台,包括Docker容器,旧的应用程序(例如Java)和分布式数据服务(例如Spark,Kafka,Cassandra,Elastic),并希望所有这些可依移植到云端提供商或者数据中心,那么Mesos(或我们自己的Mesos发行版,Mesosphere DC / OS)更适合你们的需求。 +如果你们想要建立一个运行多个关键任务工作负载的可靠平台,包括 Docker 容器、传统应用程序(例如 Java)和分布式数据服务(例如 Spark、Kafka、Cassandra、Elastic),并希望所有这些可依移植到云端提供商或者数据中心,那么 Mesos(或我们自己的 Mesos 发行版,Mesosphere DC/OS)更适合你们的需求。 -无论您选择什么,您都将拥抱一套可以更有效地利用服务器资源的工具,简化应用程序的可移植性,并提高开发人员的敏捷性。 你的选择真的不会有错。 +无论您选择什么,您都将拥抱一套可以更有效地利用服务器资源的工具,简化应用程序的可移植性,并提高开发人员的敏捷性。你的选择真的不会有错。 -------------------------------------------------------------------------------- via: https://mesosphere.com/blog/docker-vs-kubernetes-vs-apache-mesos/ -作者:[Amr Abdelrazik ][a] +作者:[Amr Abdelrazik][a] 译者:[rieonke](https://github.com/rieonke) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From de6e10bdfce6e20c420cd1dbdf71344ee8cbbaff Mon Sep 17 00:00:00 2001 From: Snaplee <30320680+Snaplee@users.noreply.github.com> Date: Thu, 3 Aug 2017 23:20:03 +0800 Subject: [PATCH 0904/1407] =?UTF-8?q?Snaplee=E7=BF=BB=E8=AF=91=E4=B8=AD?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...711 Ubuntu Core Making a factory image with private snaps.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/tech/20170711 Ubuntu Core Making a factory image with private snaps.md b/sources/tech/20170711 Ubuntu Core Making a factory image with private snaps.md index a5938fcf75..40ec62e68b 100644 --- a/sources/tech/20170711 Ubuntu Core Making a factory image with private snaps.md +++ b/sources/tech/20170711 Ubuntu Core Making a factory image with private snaps.md @@ -1,4 +1,4 @@ -Ubuntu Core: Making a factory image with private snaps +【Snaplee翻译中】Ubuntu Core: Making a factory image with private snaps ============================================================ From cbaab3384b48a662cccd75e2b0246b46bf52fd10 Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 4 Aug 2017 08:45:13 +0800 Subject: [PATCH 0905/1407] translating --- sources/tech/20170120 lxc exec vs ssh.md | 103 ------------------- translated/tech/20170120 lxc exec vs ssh.md | 104 ++++++++++++++++++++ 2 files changed, 104 insertions(+), 103 deletions(-) delete mode 100644 sources/tech/20170120 lxc exec vs ssh.md create mode 100644 translated/tech/20170120 lxc exec vs ssh.md diff --git a/sources/tech/20170120 lxc exec vs ssh.md b/sources/tech/20170120 lxc exec vs ssh.md deleted file mode 100644 index eba94834fc..0000000000 --- a/sources/tech/20170120 lxc exec vs ssh.md +++ /dev/null @@ -1,103 +0,0 @@ -translating----geekpi - -lxc exec vs ssh -============================================================ - - -Recently, I’ve implemented several improvements for `lxc exec`. In case you didn’t know, `lxc exec` is [LXD][1]‘s client tool that uses the [LXD][2] [client api][3] to talk to the LXD daemon and execute any program the user might want. Here is a small example of what you can do with it: - - [![asciicast](https://asciinema.org/a/100035.png)][4] - -One of our main goals is to make `lxc exec` feel as similar to `ssh` as possible since this is the standard of running commands interactively or non-interactively remotely. Making `lxc exec` behave nicely was tricky. - -### 1\. Handling background tasks - -A long-standing problem was certainly how to correctly handle background tasks. Here’s an asciinema illustration of the problem with a pre [LXD][5] 2.7 instance: - - [![asciicast](https://asciinema.org/a/100040.png)][6] - -What you can see there is that putting a task in the background will lead to `lxc exec` not being able to exit. A lot of sequences of commands can trigger this problem: - -``` -chb@conventiont|~ -> lxc exec zest1 bash -root@zest1:~# yes & -y -y -y -. -. -. -``` - -Nothing would save you now. `yes` will simply write to `stdout` till the end of time as quickly as it can… -The root of the problem lies with `stdout` being kept open which is necessary to ensure that any data written by the process the user has started is actually read and sent back over the websocket connection we established. -As you can imagine this becomes a major annoyance when you e.g. run a shell session in which you want to run a process in the background and then quickly want to exit. Sorry, you are out of luck. Well, you were. -The first, and naive approach is obviously to simply close `stdout` as soon as you detect that the foreground program (e.g. the shell) has exited. Not quite as good as an idea as one might think… The problem becomes obvious when you then run quickly executing programs like: - -``` -lxc exec -- ls -al /usr/lib -``` - -where the `lxc exec` process (and the associated `forkexec` process (Don’t worry about it now. Just remember that `Go` + `setns()` are not on speaking terms…)) exits before all  _buffered_  data in `stdout` was read. In this case you will cause truncated output and no one wants that. After a few approaches to the problem that involved, disabling pty buffering (Wasn’t pretty I tell you that and also didn’t work predictably.) and other weird ideas I managed to solve this by employing a few `poll()` “tricks” (In some sense of the word “trick”.). Now you can finally run background tasks and cleanly exit. To wit: - [![asciicast](https://asciinema.org/a/100043.png)][7] - -### 2\. Reporting exit codes caused by signals - -`ssh` is a wonderful tool. One thing however, I never really liked was the fact that when the command that was run by ssh received a signal `ssh` would always report `-1` aka exit code `255`. This is annoying when you’d like to have information about what signal caused the program to terminate. This is why I recently implemented the standard shell convention of reporting any signal-caused exits using the standard convention `128 + n` where `n` is defined as the signal number that caused the executing program to exit. For example, on `SIGKILL` you would see `128 + SIGKILL = 137` (Calculating the exit codes for other deadly signals is left as an exercise to the reader.). So you can do: - -``` -chb@conventiont|~ -> lxc exec zest1 sleep 100 -``` - - -Now, send `SIGKILL` to the executing program (Not to `lxc exec` itself, as `SIGKILL`is not forwardable.): - -``` -kill -KILL $(pidof sleep 100) -``` - -and finally retrieve the exit code for your program: - -``` -chb@conventiont|~ -> echo $? -137 -``` - -Voila. This obviously only works nicely when a) the exit code doesn’t breach the `8`-bit wall-of-computing and b) when the executing program doesn’t use `137` to indicate success (Which would be… interesting(?).). Both arguments don’t seem too convincing to me. The former because most deadly signals  _should_  not breach the range. The latter because (i) that’s the users problem, (ii) these exit codes are actually reserved (I  _think_ .), (iii) you’d have the same problem running the program locally or otherwise. -The main advantage I see in this is the ability to report back fine-grained exit statuses for executing programs. Note, by no means can we report back  _all_ instances where the executing program was killed by a signal, e.g. when your program handles `SIGTERM` and exits cleanly there’s no easy way for [LXD][8] to detect this and report back that this program was killed by signal. You will simply receive success aka exit code `0`. - -### 3\. Forwarding signals - -This is probably the least interesting (or maybe it isn’t, no idea) but I found it quite useful. As you saw in the `SIGKILL` case before, I was explicit in pointing out that one must send `SIGKILL` to the executing program not to the `lxc exec`command itself. This is due to the fact that `SIGKILL` cannot be handled in a program. The only thing the program can do is die… like right now… this instance… sofort… (You get the idea…). But a lot of other signals `SIGTERM`, `SIGHUP`, and of course `SIGUSR1` and `SIGUSR2` can be handled. So when you send signals that can be handled to `lxc exec` instead of the executing program, newer versions of [LXD][9] will forward the signal to the executing process. This is pretty convenient in scripts and so on. - -In any case, I hope you found this little `lxc exec` post/rant useful. Enjoy [LXD][10]it’s a crazy beautiful beast to play with. Give it a try online [https://linuxcontainers.org/lxd/try-it/][11] and for all you developers out there: Checkout [https://github.com/lxc/lxd][12] and send us patches.  - - - We don’t require any `CLA` to be signed, we simply follow the kernel style of requiring a `Signed-off-by` line. - --------------------------------------------------------------------------------- - -via: https://cbrauner.wordpress.com/2017/01/20/lxc-exec-vs-ssh/ - -作者:[brauner][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://cbrauner.wordpress.com -[1]:https://github.com/lxc/lxd -[2]:https://github.com/lxc/lxd -[3]:https://github.com/lxc/lxd/blob/master/client.go -[4]:https://asciinema.org/a/100035?autoplay=1 -[5]:https://github.com/lxc/lxd -[6]:https://asciinema.org/a/100040?autoplay=1 -[7]:https://asciinema.org/a/100043?autoplay=1 -[8]:https://github.com/lxc/lxd -[9]:https://github.com/lxc/lxd -[10]:https://github.com/lxc/lxd -[11]:https://linuxcontainers.org/lxd/try-it/ -[12]:https://github.com/lxc/lxd diff --git a/translated/tech/20170120 lxc exec vs ssh.md b/translated/tech/20170120 lxc exec vs ssh.md new file mode 100644 index 0000000000..c818563af0 --- /dev/null +++ b/translated/tech/20170120 lxc exec vs ssh.md @@ -0,0 +1,104 @@ +lxc exec vs ssh +============================================================ + + +最近,我对 `lxc exec` 进行了几个改进。以防你不知道,`lxc exec` 是 [LXD][1] 的客户端工具,使用 [LXD][2] [client api][3] 与 LXD 守护程序通信并执行任何用户想要的程序,以下是你可以使用的一个例子: + + [![asciicast](https://asciinema.org/a/100035.png)][4] + +我们的主要目标之一就是使 `lxc exec` 与 `ssh` 类似,因为它是交互式或非交互式远程运行命令的标准。这使得 `lxc exec` 做得很好变得棘手。 + +### 1\. 处理后台任务 + +一个长期存在的问题当然是如何正确处理后台任务。这是一个关于 [LXD][5] 2.7 实例的问题的 asciinema 中的插图: + + [![asciicast](https://asciinema.org/a/100040.png)][6] + +你可以看到,在后台执行任务将导致 `lxc exec` 无法退出。许多命令可以触发此问题: + +``` +chb@conventiont|~ +> lxc exec zest1 bash +root@zest1:~# yes & +y +y +y +. +. +. +``` + +现在没有什么能救你。`yes` 将会永远直接写入`stdout`。 + +问题的根源在于 `stdout` 被保持打开,但这是必要的,它用以确保用户启动的进程写入的任何数据实际上是通过我们建立的 websocket 连接读取并发回的。 + +你可以想象,比如当你运行一个 shell 会话,你希望在后台运行一个进程,然后快速退出。对不起,你运气不好。 + +第一种并且原始的方法是一旦你检测到前台程序(例如 shell)已经退出就直接关闭 `stdout`。但这不像想得那么好,当你运行快速执行程序时,这个问题会变得明显,比如: + +``` +lxc exec -- ls -al /usr/lib +``` + +所有 `lxc exec` 进程(和相关的 `forkexec` 进程(现在不要担心)只要记住 `Go` + `setns()` 不是在发送...))在所有 `stdout` 中的_缓冲_数据被读取之前退出。这种情况下,将会导致截断输出,没有人想要这样。在尝试使用几个方法来后,禁用 pty 缓冲(我告诉你,这不太漂亮,也没有如预期工作。)和其他奇怪的想法,我设法通过几个 `poll()` “技巧”(tricks)(在某种意义上说一个技巧(“trick”))解决了这个问题。现在你终于可以运行后台任务,并且可以完全退出了。如图: + [![asciicast](https://asciinema.org/a/100043.png)][7] + +### 2\. 报告由信号引起的退出码 + +`ssh` 是一个很棒的工具。但有一件事,我一直以来不喜欢的是当 ssh 运行的命令接收到一个信号 `ssh` 时,总是会报告 `-1`,也就是退出码 `255`。当你想要了解导致程序终止的信号时,这很烦人。这就是为什么我最近实施标准 shell 中使用标准惯例 `128 + n`,其中 `n`被定义为导致执行程序退出的信号号码,来报告任何由信号导致的退出。例如,在 `SIGKILL` 信号上,你会看到 `128 + SIGKILL = 137`(计算其他致命信号的退出码作为读者的练习)。所以你可以这么做: + +``` +chb@conventiont|~ +> lxc exec zest1 sleep 100 +``` + + +现在,将 `SIGKILL` 发送到执行程序(不是 `lxc exec`本身,因为 `SIGKILL` 不可转发)。 + +``` +kill -KILL $(pidof sleep 100) +``` + +最后检查你程序的退出码: + +``` +chb@conventiont|~ +> echo $? +137 +``` + +瞧。这显然只有当 a) 退出码没有超过 `8`-位计算壁垒,b)当执行程序不使用 `137` 来表示成功(这将是...有趣的( ?))。这两个论点似乎对我来说都不太有说服力。前者因为最致命的信号不_应该_超过这个范围。后者因为(i)这是用户问题,(ii)这些退出代码实际上是保留的(我 _认为_。),(iii)你在本地或其他上面运行程序时会遇到同样的问题。 + +我看到的主要优点是这能够回报执行程序的细粒度的退出状态。注意,我们不会报告_所有_被一个这个信号杀死的程序的实例。当你的程序处理 `SIGTERM` 并且完全退出时,[LXD][8] 没有简单的方法来检测到这个并报告说这个程序被信号杀死了。你只会简单地收到退出码 `0`。 + +### 3\. 转发信号 + +这可能是最不有趣的(或者也许不是,不知道),但我发现它非常有用。正如你在 `SIGKILL` 案例中看到的那样,我明确地指出,必须将 `SIGKILL` 发送到执行程序,而不是 `lxc exec`命令本身。这是因为 `SIGKILL` 在程序中无法处理。程序可以做的唯一的事情就是像现在这样...像这个例子...(你知道了吧...)。但是程序可以处理很多其他信号 `SIGTERM`、`SIGHUP',当然也可以处理 `SIGUSR1` 和 `SIGUSR2`。因此,当你发送可以被 `lxc exec` 处理而不是被执行程序处理的信号时,较新版本的 [LXD][9] 会将信号转发到执行进程。这在脚本中非常方便。 + +无论如何,我希望你觉得这篇小小的 `lxc exec` 文章/胡言乱语有用。享受[LXD][10]吧,这是与一只疯狂的美丽的野兽玩耍。请试试在线实验:[https://linuxcontainers.org/lxd/try-it/][11],对于开发人员看看这里:[https://github.com/lxc/lxd][12] 并给我们补丁。 + +我们不要求签名任何 `CLA`,我们只要在核心风格中遵循取其中有 "Signed-off-by" 这行。 + +-------------------------------------------------------------------------------- + +via: https://cbrauner.wordpress.com/2017/01/20/lxc-exec-vs-ssh/ + +作者:[brauner][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://cbrauner.wordpress.com +[1]:https://github.com/lxc/lxd +[2]:https://github.com/lxc/lxd +[3]:https://github.com/lxc/lxd/blob/master/client.go +[4]:https://asciinema.org/a/100035?autoplay=1 +[5]:https://github.com/lxc/lxd +[6]:https://asciinema.org/a/100040?autoplay=1 +[7]:https://asciinema.org/a/100043?autoplay=1 +[8]:https://github.com/lxc/lxd +[9]:https://github.com/lxc/lxd +[10]:https://github.com/lxc/lxd +[11]:https://linuxcontainers.org/lxd/try-it/ +[12]:https://github.com/lxc/lxd From 3987293d7839a45bfde4f78d3143fe779148d23e Mon Sep 17 00:00:00 2001 From: geekpi Date: Fri, 4 Aug 2017 08:47:15 +0800 Subject: [PATCH 0906/1407] translating --- sources/tech/20170712 How To Setup Apache Hadoop On CentOS.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170712 How To Setup Apache Hadoop On CentOS.md b/sources/tech/20170712 How To Setup Apache Hadoop On CentOS.md index a61a4eb192..0345c5b29f 100644 --- a/sources/tech/20170712 How To Setup Apache Hadoop On CentOS.md +++ b/sources/tech/20170712 How To Setup Apache Hadoop On CentOS.md @@ -1,3 +1,5 @@ +translating-----geekpi + How To Setup Apache Hadoop On CentOS ============================================================ From dd1611e8accd2ed1185283dc7028cbc75b63e899 Mon Sep 17 00:00:00 2001 From: firmianay Date: Fri, 4 Aug 2017 10:16:07 +0800 Subject: [PATCH 0907/1407] translating by firmianay --- ...tem Hierarchy Standard Shows Which Bits Are Boss.md | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/sources/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md b/sources/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md index c60de652f5..98d65db123 100644 --- a/sources/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md +++ b/sources/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md @@ -1,3 +1,5 @@ +Translating by firmianay + The Filesystem Hierarchy Standard Shows Which Bits Are Boss ============================================================ ![linux](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2016-linux-1.jpg) @@ -17,19 +19,19 @@ Before we embark, here are a couple of tools that are worth getting familiar wit The most useful tool is "ls" -- it lists the contents of any directory given with a full or relative path (i.e., one starting from the current directory) as an argument. -$ ls  _path_ +$ ls  _path_ As you progress deeper into the filesystem, it might get cumbersome to type long paths repeatedly, so if you get to that point, you can replace "ls" with "cd" to change the current working directory (the one your terminal is currently "in") to that directory. As with "ls", just give "cd" a directory path as an argument. -$ cd  _path_ +$ cd  _path_ If you're not sure what kind of file something is, use the "file" command on it by running "file" and the filename as an argument. -$ file  _filename_ +$ file  _filename_ Finally, if the file seems like it could be human-readable, use "less" to look at it (again, with no fear of making changes). As with the last tool, give a filename as an argument to view it. -$ less  _filename_ +$ less  _filename_ When you're done scanning through the file, hit "q" to quit, which returns you to your terminal. From 956ac905dbca3bb15e61b64ff57e3d8fb9bfabff Mon Sep 17 00:00:00 2001 From: firmianay Date: Fri, 4 Aug 2017 11:53:57 +0800 Subject: [PATCH 0908/1407] translated --- ...rchy Standard Shows Which Bits Are Boss.md | 101 ------------------ ...rchy Standard Shows Which Bits Are Boss.md | 91 ++++++++++++++++ 2 files changed, 91 insertions(+), 101 deletions(-) delete mode 100644 sources/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md create mode 100644 translated/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md diff --git a/sources/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md b/sources/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md deleted file mode 100644 index 98d65db123..0000000000 --- a/sources/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md +++ /dev/null @@ -1,101 +0,0 @@ -Translating by firmianay - -The Filesystem Hierarchy Standard Shows Which Bits Are Boss -============================================================ -![linux](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2016-linux-1.jpg) - - -[**The State of Open Source Software: Year in Review | Webinar**][5] -[][6]Flexera Software's VP of Product Management discusses the compliance and vulnerability events and trends from 2016 impacting organizations using open source software.  -**[Watch Now!][3]** - -If you've ever been curious enough to look through your system's root directory ("/"), you may have found yourself a little overwhelmed. Most of the three-letter directory names don't tell you much about what they do, and if you ever needed to make important modifications, it would be tough to know where to look. - -I'd like to take those of you who haven't ventured much into your root directory on a brief tour. - -### Helpful Tools - -Before we embark, here are a couple of tools that are worth getting familiar with, as they will allow you to dig through anything interesting you find on your own later. None of these programs will make any changes to your files. - -The most useful tool is "ls" -- it lists the contents of any directory given with a full or relative path (i.e., one starting from the current directory) as an argument. - -$ ls  _path_ - -As you progress deeper into the filesystem, it might get cumbersome to type long paths repeatedly, so if you get to that point, you can replace "ls" with "cd" to change the current working directory (the one your terminal is currently "in") to that directory. As with "ls", just give "cd" a directory path as an argument. - -$ cd  _path_ - -If you're not sure what kind of file something is, use the "file" command on it by running "file" and the filename as an argument. - -$ file  _filename_ - -Finally, if the file seems like it could be human-readable, use "less" to look at it (again, with no fear of making changes). As with the last tool, give a filename as an argument to view it. - -$ less  _filename_ - -When you're done scanning through the file, hit "q" to quit, which returns you to your terminal. - -### Root Directory Road Trip - -Now we can begin our journey. I'm going to proceed in alphabetical order through the directories directly within the root directory. This is by no means an exhaustive catalog, but by the end, we will have hit the highlights. - -All of the classifications and functions of the directories we will go over are based on the Linux Filesystem Hierarchy Standard, or FHS. The Linux FHS, maintained by the [Linux Foundation][4], assists designers and developers of distributions and programs by structuring where the various components of their tools should go. - -By keeping all of the files, binaries, and manuals in a consistent organization across programs, the FHS makes learning, debugging, or modifying them much easier. Imagine how tedious it would be if instead of using the "man" command to find usage guides, you had to hunt for the manual for every program. - -Alphabetically, and structurally, it is fitting that we start with **"/bin"**. This directory is where all the core system binary files containing commands for the shell (the program that interprets terminal instructions) are found. Without the contents of this directory, your system wouldn't do much. - -Next is the **"/boot"** directory, where all the stuff your computer needs to boot up is stored. Among these things, the most important ones are your bootloader and kernel. The bootloader is the program that initializes a few basic utilities to allow the boot process to continue. At the end of its initialization, the bootloader loads the kernel, which allows the computer to interface with all other hardware and firmware. From this point, it can proceed to bring the entire operating system online. - -The **"/dev"** directory is where file-like objects representing everything your system recognizes as a "device" are stored. These includes obvious devices such as the hardware components of your computer: your keyboard, screen, hard drive, etc. - -Additionally, "/dev" contains pseudo-files signifying streams of data that your system treats as "devices." One example is the data that goes in and out of your terminal, which is divided into three "streams." Information it reads coming in is called "standard input." The output of commands or processes is "standard output." Finally, an auxiliary output classified as debugging information is directed to "standard error." Terminals themselves are also found as files here. - -**"/etc"** (pronounced like the craft commerce site "Etsy," if you want to impress Linux veterans), is where many programs store their configuration files, which are used to change their settings. Some programs store copies of default configurations here, which are to be copied to another location before modification. Others store the one and only copy of the configuration here and expect users to modify it directly. Many programs reserved for the root user depend on this latter mode of configuration. - -The **"/home"** directory is where users' personal files reside. For desktop users, this is where you spend most of your time. For every unprivileged user, there is a directory with corresponding name here. - -**"/lib"** is home to the many libraries that your system depends on to run. Many programs employ one or more functions or subroutines that are common across dozens or hundreds of programs. So, instead of each program reproducing every component it needs within its binary, which would result in comparatively massive and inefficient programs, it references one or more of these libraries by making a "library call." - -Removable media like USB flash drives or cameras are made accessible in the **"/media"** directory. While it is not present on all systems, it is common in distributions specializing in intuitive desktop systems, like Ubuntu. Media that has storage is "mounted" here, meaning that while the raw stream of bits from the device are found under "/dev", the file objects that users usually interact with are accessible here. - -The **"/proc"** directory is a virtual filesystem that dynamically displays system data. What this means is that the system creates the contents of "/proc" on the fly, populating it with files that hold information about the system (such as hardware statistics) that is generated by virtue of running. - -**"/tmp"** is, aptly enough, where temporary information like cached data is sent. There's really not much more to it than that. - -Most program binaries on modern Linux systems are kept in the **"/usr"**directory. To unify the various directories containing binaries, "/usr" contains a copy of everything in "/bin", "/sbin", and "/lib". - -Finally, **"/var"** is where data of "variable" length is kept. The kind of variable-length data found here is generally data that is expected to keep accumulating, like logs and caches. One example is the log your kernel keeps. - -To keep your hard drive from filling up and crashing, "/var" has a built in "log rotate" function that deletes old information to make room for new information, maintaining a fixed maximum size. - -### Poke Around - -As I said, this is definitely not everything you'll find in the root directory, but it is a good start toward figuring out where your system's core functions reside -- and, moreover, what those functions are. - -So, if you weren't sure what there was to learn, you probably have plenty of ideas now. If you want an even better idea, poke around in these directories for yourself! - --------------------------------------------------------------------------------- - -作者简介: - -Jonathan Terrasi has been an ECT News Network columnist since 2017. His main interests are computer security (particularly with the Linux desktop), encryption, and analysis of politics and current affairs. He is a full-time freelance writer and musician. His background includes providing technical commentaries and analyses in articles published by the Chicago Committee to Defend the Bill of Rights. - ------- - - -via: http://www.linuxinsider.com/story/84658.html - -作者:[Jonathan Terrasi ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.linuxinsider.com/perl/mailit/?id=84658 -[1]:http://www.linuxinsider.com/story/84658.html?rss=1# -[2]:http://www.linuxinsider.com/perl/mailit/?id=84658 -[3]:http://www.linuxinsider.com/story/84658.html?rss=1 -[4]:http://www.linuxfoundation.org/ -[5]:http://www.linuxinsider.com/story/84658.html?rss=1 -[6]:http://www.linuxinsider.com/story/84658.html?rss=1 diff --git a/translated/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md b/translated/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md new file mode 100644 index 0000000000..15f1cec927 --- /dev/null +++ b/translated/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md @@ -0,0 +1,91 @@ +文件系统层次标准(FHS)简介 +============================================================ +![linux](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2016-linux-1.jpg) + +当你好奇地看着系统的根目录(“/”)的时候,可能会发现自己有点不知所措。大多数三个字母的目录名称并没有告诉你他们是做什么的,如果你需要做出一些重要的修改,那就很难知道在哪里可以查看。 + +我想给大家简单地介绍下根目录。 + +### 有用的工具 + +在我们开始之前,这里有几个值得熟悉的工具,它们可以让您随时挖掘您自己找到的有趣的东西。这些程序都不会对您的文件进行任何更改。 + +最有用的工具是 “ls” -- 它列出了使用完整路径或相对路径(即从当前目录开始的路径)作为参数给出的任何目录的内容。 + +$ ls  _path_ + +当您进一步深入文件系统时,重复输入长路径可能会变得很麻烦,所以如果您想简化这一操作,可以用 “cd” 替换 “ls” 来更改当前的工作目录到该目录。与 “ls” 一样,只需将目录路径作为 “cd” 的参数。 + +$ cd  _path_ + +如果您不确定某个文件是什么文件类型的,可以通过运行 “file” 并且将文件名作为“file” 命令的参数。 + +$ file  _filename_ + +最后,如果这个文件看起来像是人可读的,那么用 “less” 来看看(不用担心文件有改变)。与最后一个工具一样,给出一个文件名作为参数来查看它。 + +$ less  _filename_ + +完成文件扫描后,点击 “q” 退出,即可返回到您的终端。 + +### 根目录之旅 + +现在就开始我们的旅程。我将按照字母顺序介绍直接在根目录下的目录。这里并没有介绍所有的目录,但到最后,我们会突出其中的亮点。 + +我们将要完成的目录的所有分类和功能都基于 Linux 文件系统层次标准(FHS)。[Linux基金会][4]维护的 Linux FHS 通过规定其工具的各个组件应该存放的位置,帮助设计师和开发人员进行发行版和程序的开发。 + +通过将所有文件,二进制文件和手册保存在程序中的一致性组织中,FHS 让学习、调试或修改更加容易。想象一下,如果不是使用 “man” 命令找到使用指南,那么你就不得不寻找每个程序的手册。 + +按照字母顺序和结构顺序,我们从 “**/bin**” 开始。该目录是包含 shell 命令的所有核心系统二进制文件(解释终端指令的程序)。没有这个目录的内容,你的系统就不能做很多事情。 + +接下来是 “**/boot**” 目录,它存储了您的计算机需要启动的所有东西。其中最重要的是引导程序和内核。引导程序是一个通过初始化一些基础工具,使引导过程继续进行的程序。在初始化结束时,引导程序会加载内核,内核允许计算机与所有其他硬件和固件进行接口。从这一点看,它可以持续地使整个操作系统工作。 + +“**/dev**” 目录是表示被系统识别为“设备”的所有文件的对象。这里包括许多显式的设备,如计算机的硬件组件:键盘,屏幕,硬盘驱动器等。 + +此外,“/dev” 还包含被系统视为“设备”的数据流的伪文件。一个例子是流入和流出您的终端的数据,可以分为三个“流”。它读取的信息被称为“标准输入”。命令或进程的输出是“标准输出”。最后,分类为调试信息的辅助输出指向“标准错误”。终端本身作为文件也可以在这里找到。 + +“**/etc**”(发音类似工艺商业网站 “Etsy”,如果你想打动 Linux 老用户的话),许多程序在这里存储他们的配置文件,用于改变他们的设置。一些程序存储这里的是默认配置的副本,这些副本将在修改之前复制到另一个位置。其他的程序在这里存储配置的唯一副本,并期望用户可以直接修改。为 root 用户保留的许多程序取决于后一种配置模式。 + +“**/home**” 目录是用户个人文件所在的位置。对于桌面用户来说,这是您花费大部分时间的地方。对于每个非特权用户,这里都有一个具有相应名称的目录。 + +“**/lib**” 是您的系统依赖运行的许多库的所在地。许多程序都会重复使用一个或多个在几十上百个程序中常见的功能或子程序。所以,如果每个程序在其二进制文件中重写它需要的每一个组件,结果会是产生出一些大而无用的程序,作为更好的替代方案,我们可以通过进行“库调用”来引用这些库中的一个或多个。 + +在 “**/media**” 目录中可以访问像 USB 闪存驱动器或摄像机这样的可移动媒体。虽然它不存在于所有系统上,但在一些专注于直观桌面的系统中还是比较普遍的,如 Ubuntu。具有存储能力的媒体在此处被“挂载”,这意味着当设备中的原始位流位于 “/dev” 目录下时,用户通常可以在这里访问那些可交互的文件对象。 + +“**/proc**” 目录是一个动态显示系统数据的虚拟文件系统。这意味着系统可以即时地创建 “/proc” 的内容,用包含运行时生成系统信息(如硬件统计信息)的文件进行填充。 + +“**/tmp**” 恰好足够的用于发送缓存数据等临时信息。这个目录不做其他更多的事情。 + +现代 Linux 系统上大多数程序的二进制文件保存在 “**/usr**” 目录中。为了统一包含二进制文件的各种目录,“/usr” 包含 “/bin”、“/sbin” 和 “/lib” 中的所有内容的副本。 + +最后,“**/var**” 里保存“可变”长度的数据。这里的可变长度数据的类型通常是会累积的数据,就像日志和缓存一样。一个例子是你的内核保留的日志。 + +为了保持硬盘远离空间用尽和崩溃的情况,“/var” 内置了“日志旋转”功能,可删除旧信息,为新信息腾出空间,维持固定的最大大小。 + +### 结尾 + +正如我所说,这里介绍的绝对不是您在根目录中可以找到的一切,但是确定系统核心功能所在地是一个很好的开始,而且可以更深入地研究这些功能是什么。 + +所以,如果你不知道要学习什么,就可能有很多的想法。如果你想得到一个更好的想法,就在这些目录中折腾自己吧! + +-------------------------------------------------------------------------------- + +作者简介: + +自 2017 年以来 Jonathan Terrasi 一直是 ECT 新闻网的专栏作家。他的主要兴趣是计算机安全(特别是 Linux 桌面),加密和分析政治和时事。他是全职自由作家和音乐家。他的背景包括在芝加哥委员会发表的保卫人权法案文章中提供技术评论和分析。 + +------ + + +via: http://www.linuxinsider.com/story/84658.html + +作者:[Jonathan Terrasi ][a] +译者:[firmianay](https://github.com/firmianay) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.linuxinsider.com/perl/mailit/?id=84658 +[1]:http://www.linuxinsider.com/story/84658.html?rss=1# +[2]:http://www.linuxinsider.com/perl/mailit/?id=84658 +[4]:http://www.linuxfoundation.org/ From 2f6a61c70aa86dd054046a202da3ebd47e34c0ee Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 4 Aug 2017 16:30:54 +0800 Subject: [PATCH 0909/1407] PUB:20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md @rieonke --- ... Apache Mesos Why What You Think You Know is Probably Wrong.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md (100%) diff --git a/translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md b/published/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md similarity index 100% rename from translated/tech/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md rename to published/20170731 Docker vs. Kubernetes vs. Apache Mesos Why What You Think You Know is Probably Wrong.md From d78418ad16a534a8160277b57fb1e06277ef5e76 Mon Sep 17 00:00:00 2001 From: wxy Date: Fri, 4 Aug 2017 23:46:15 +0800 Subject: [PATCH 0910/1407] PRF&PUB:20170113 3 open source music players.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @WangYueScream 感觉不必要的文字补充有点多。 --- .../20170113 3 open source music players.md | 145 ++++++++++++++ .../20170113 3 open source music players.md | 189 ------------------ 2 files changed, 145 insertions(+), 189 deletions(-) create mode 100644 published/20170113 3 open source music players.md delete mode 100644 translated/tech/20170113 3 open source music players.md diff --git a/published/20170113 3 open source music players.md b/published/20170113 3 open source music players.md new file mode 100644 index 0000000000..0080d5ada4 --- /dev/null +++ b/published/20170113 3 open source music players.md @@ -0,0 +1,145 @@ +3 个开源的音乐播放器:Aqulung、Lollypop 和 GogglesMM +============================================================ + +![3 open source music players: Aqualung, Lollypop, and GogglesMM](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/music-birds-recording-520.png?itok=wvh1g4Lw "3 open source music players: Aqualung, Lollypop, and GogglesMM") + + +音乐是生活的一部分。[维基百科关于音乐发展历史的文章][4]有这样一段不错的描述说:“全世界所有的人们,包括哪怕是最孤立、与世隔绝的部落,都会有自己的特色音乐……”好吧,我们开源人就构成了一个部落。我建议我们的“音乐形式”应该包括开源音乐播放器。在过去几年里,我已经使用体验过不少我能接触到的音乐播放器;[2016 年 12 月份][5]我根据这六个标准来总结概括了我使用开源音乐播放器的感受: + +1. 必须是能够通过设置让音乐一成不变地转换到 [ALSA][1]。(最高分 5分) +2. 应该有一个不错的“智能播放列表”。(1 分) +3. 不应该强迫用户只能通过播放列表来进行交互。(1 分) +4. 应该能够提供一个简单的方法来显示歌曲的封面图片——使用内嵌的封面图或使用在音乐目录里面 cover.jpg(或者 .png)文件替代。 +5. 应该能够在音乐播放的时候显示信号级别和实际比特率。(1 分) +6. 能够呈现出不错的整体组织,结构布局和执行性能。(1 分) + +热心的读者让告诉我有三个播放器是在我的资源仓库里没有的:[Aqualung][6]、[Lollypop][7] 和 [GogglesMM][8]。我并不想在我办公用的电脑里面安装那些来自外面的软件,我承诺过我会配置一个“试验台”来测试这三个音乐播放器,并给出测试的细节。 + +### Aqualung + +[Aqualung][9] 有一个写的清晰明了的网站来解释它众多的特点。其上提供的说明中我发现其中一点特别有趣: + +“你能够(也应该)将你的所有音乐按照艺术家/档案/声轨这样组织成一个树型结构,这样比生成一个一体化的 Winamp/XMMS 播放列表更舒服。” + +这点让我有些困惑,因为我总是把我的音乐按照艺术家、专辑和声轨这样组织成树状。但这就可能解释了为什么我有时发现 XMMS 流派的播放器在浏览音乐时有一点古怪。 + +根据 Aqualung 官网的下载页面说明,官方发布的只有源代码。但是文档上的说明暗示了绝大多数主流的 Linux 发行版本都包括一份 Aqualung 的构建副本,但我当前用的办公电脑所使用的 Linux 发行版 Ubuntu 16.10 并不在此范围内。[Launchpad.net][10] 提供有 PPA,但那些软件看起来都有些过时了,所以为什么不试试编译源码安装软件呢? + +我根据官网上编译文档的建议和配置脚本的提示安装了 **pkgconf** 以及 **libasound**、**libflac**、**libmp3lame**、**libvorbis**、**libxml2**、**libglib2.0** 和 **libgtk+-2.0** 的开发库。接下来,我就能够干净利索的进行 `configure` 然后进行 `make` 和 `make install`。最终我可以执行 `/usr/local/bin/aqualung` 了。 + + +![Aqualung](https://opensource.com/sites/default/files/aqualung.png "Aqualung") + +*Aqualung,不能切换音乐播放的码率。* + +一旦 Aqualung 启动运行,我就能看到相当简洁直接的两窗口界面:播放器本身和“音乐商店”。我通过右键点击播放器的音乐面板打开参数设置查看这些可设置的参数,看是否能找到 AudioQuest DragonFly 这个数模转换器,但我没有找到任何相关的迹象。然而,站点上的说明指出可以通过命令行指定输出设备。最终我用 **plughw** 设备才让 Aqualung 启动起来。 + +在那个时候,真正让我对 Aqualung 感到失望的是 Aqualung 似乎是需要一个固定的输出采样频率。我能够用 Aqualung 播放器的默认设置来正常播放我的 44.1 Khz 文件,但是同样的采样频率播放 96 Khz 的音乐文件时,我不得不关闭软件并重新启动。也正是因为这一点,我不会再继续对 Aqualung 进行使用测评。 + +**无评分。** + +### Lollypop + +![Lollypop interface](https://opensource.com/sites/default/files/lollypop_interface.png "Lollypop interface") + +*优美的 Lollypop 用户界面。* + +[Lollypop][11] 有一个华丽的网站。尽管它不在我办公专用的电脑的软件仓库里面,但是有一个“针对 Ubuntu/Debian 用户的下载”链接带你跳转到 [launchpad.net 站点提供的最新的 PPA][12]。这个站点还提供针对 Flatpak、Arch Linux、Fedora 和 OpenSUSE 这些系统的 Lollypop 软件包的下载。我看了下 [Fedora COPR 上针对各个 Fedora 版本的 Lollypop 下载链接][13],看起来 Lollypop 更新的比较及时而且从 Fedora 版本的 23 到 26 都有对应的软件包提供下载安装。 + +一天内做一次源码编译就足够了,所以我决定试试从 PPA 安装这款软件。我通过命令行来执行 Lollypop 软件。设置菜单能够在 Lollypop 界面的右上方很显眼地看见。更新完我的音乐后,我开始找电脑的输出设备设置,但是在一番查看后,我不知道该怎么选择合适的输出设备。即便我在命令行通过 **-help** 也找不到有用的帮助信息。 + +经过一番网上搜索后我找到一个 Lollypop 的开发者的提示才知道我需要 **gstreamer libav** 来让 Lollypop 工作。通过这个说明我决定停止,因为这可能需要一个 **gstreamer** 相关配置才有能工作,但是我不太想继续尝试了。 + +Lollypop 有一个优美的用户交互界面和它的优美的网站相得益彰,但是我现在不会进一步对它进行测评,否则我就又多了一个进一步去学习了解 **gstreamer** 的理由。 + +**无评分。** + +### GogglesMM + +[Goggles Music Manager][14] 也有一个[在 launchpad.net 及时更新的 PPA][15];安装流程简单明了,我现在可以在命令行执行 **gogglesmm** 了。 + +GogglesMM,非常容易上手使用,看上去和 Rhythmbox 有点像。我在 GogglesMM 的设置里面的参数设置中找到了音频选项设置,能够让我选择 ALSA 和设置音频输出设备。通过查看 **/proc/asound/DragonFly/stream0** 文件和 DragonFly 自己的 LED 颜色,我确定我能够用 GogglesMM 播放 44.1-KHz/21-bit 和 96-KHz/24-bit 这两种规格的 mp3;因此,就凭 “rate/depth passthrough” 我给 GogglesMM 打 5 分。 + +![GogglesMM](https://opensource.com/sites/default/files/gogglesmm.png "GogglesMM") + +*GogglesMM 在播放 96/24 这种规格的音乐,显示音频输出设备选择。 * + +GogglesMM 的说明文档并没有大量的细节介绍,但是我尽可能说明的是,开发者们使用了过滤器来实现类似“智能播放列表”的功能。我在我的测试环境下使用三张专辑来尽我所能检测过滤功能,当我使用“智能播放列表”功能的时候尽管我喜欢我看到的通过过滤筛选出来的歌曲(特别是能够基于广泛的标准来针对歌曲定义筛选条件),但这并不是我认为的“智能播放列表”,对我来说我认为“智能播放列表”应该是这样的,通过借助一些社区数据库来推荐提供和你近期播放的歌曲类似的曲目。或者我该把这个叫作“自动的 DJ”而不是“智能播放列表”,但是通过测试我最终能够确定的是,这个特性并不会在近期版本的 GogglesMM 中出现,所以我给它这个所谓的“智能播放列表”打 0 分。 + +至于播放列表队列的操作,这款应用能够支持播放你选中的音乐,也能够随机播放音乐或者把一些音乐整合到一个播放列表里面,所以我因为“播放列表的队列选项”给它打 1 分。 + +同样的,它看起来也能够很好地不需要额外的干预来管理我的音乐艺术封面(每个专辑都包含一张合适的艺术封面, GogglesMM 可以自动识别),所以为“内嵌的艺术封面或者封面图片”打 1 分。 + +我找不到任何方法来让 GogglesMM 显示信号级别或者实际的比特率。我也不能找到显示比特率和位深度的方法;尽管这款应用能够显示一个“格式”列,但是在我的音乐栏里面除了显示音乐格式不会显示其他的信息了,所以为 GogglesMM 的“信号级别和有效比特率”打 0 分。 + +至于 GogglesMM 的整体结构,它的所有按钮选项都正好完全符合我的使用习惯。我能够在播放队列里面看到歌曲的时间和歌曲当前已播放的时间所占歌曲总体时间的比例,专辑封面,歌曲名,专辑名和歌唱者。可用的播放栏列表看起来相当大而有用,比如也包括了作曲者。最后,一个真正让我眼前一亮的特点是,音量控制竟然包含了 ALSA 音量。也就是如果我启动 alsamixer 的话,然后不管是在 alsamixer 还是在 GogglesMM 里面调整音量,另一个音量控制也会做相应的音量调整。这个出乎我意外之外的功能相当的酷而且这个功能在其他的音乐播放器上也不常见,因此为它的整体架构给 GogglesMM 加 1 分。 + +最终 GogglesMM 的这些优点共计得分 8。所表现出来的特点确实很优秀。 + +**评分:8** + +### 到目前为止所给出的评分 + +我之前所提到的这几个开源音乐播放器中,我最喜欢的还是 [Guayadeque][16],根据我制定的标准来进行排名的话,我给 Guayadeque 打满分 10 分。来看下我对这三个开源音乐播放器的评分总结吧(N/R 代表“无评分”,因为我不确定如何配置这些播放器来让它们以完美的码率和贯穿模式工作,以便我的数模信号转换器在相应源的码率和位深度接收 PCM 数据): + +![Open source audio players](https://opensource.com/sites/default/files/open_source_audio.png "Open source audio players") + +请注意下我用的这个排名方法并不适合每个人。特别是很多人并不清楚高品质音乐的价值,他们更喜欢专有格式的音乐能够给他们带来更好的音乐品质。 + +与此同时,我会继续评测一些之前向大家承诺的音乐播放器一些和评测评分无关的特性。我特别喜欢 Lollypop 的外观,我也觉得待揭秘的 **gstreamer** 有一种神秘的魅力,它能让基于 **gstreamer** 的音乐播放器不用通过转换就能传输它们的数据。 + +### 关于音乐的部分…… + +我还在保持继续购买唱片的习惯,对于唱片的购买我有些不错的推荐。 + +第一个就是 Nils Frahm 的专辑 [Felt][17],这是我女儿送我的一份非常贴心的礼物。我真的真的很喜欢这张专辑,它的绝大部分歌曲都是在深夜用电麦录制的非常接近钢琴的弦乐,而且也有不少有趣的钢琴演奏的背景音乐,真的是很棒的音乐。至于 Nils Frahm 其他的音乐,这些唱片提供的下载链接允许你下载质量高达 96-KHz,24-bit FLAC 格式的音乐。 + +第二个就是 Massive Attack 的专辑 Protection 的 [Mad Professor 的重混版][18],专辑名是 No Protection。你可以[在这里了解这份专辑][19],并且如果你想要尝试这份专辑最原始的版本,[这里是它的所有汇总信息][20]。该专辑最初发布于 20 世纪 90 年代,这份专辑刻录在唱片上面而且听起来非常奇幻。遗憾的是,不提供下载链接。 + +第三个就是 Bayonne 的 [Primitives][21]。[这是专辑要表达的想法][22]。Guardian 报社把这份专辑称作是“新式无聊”。那么这种类型的音乐到底怎么样呢?如果这些音乐真的是非常令人乏味的,或许是时候来换份工作了,无论如何你可以试试听这些音乐;或许你会觉得它确实很乏味或者你会像我一样喜欢上这份音乐。 + +(图片来源:[互联网档案馆][2]书中的图片;由 Opensource.com 编辑发布。遵循 [CC BY-SA 4.0][3] 协议。) + +-------------------------------------------------------------------------------- + + +作者简介: + +![](https://opensource.com/sites/default/files/styles/profile_pictures/public/clh_portrait2.jpg?itok=V1V-YAtY) + + +Chris Hermansen - 自 1978 年毕业于 British Columbia 大学后一直从事计算机相关工作,2005 年之前是 Solaris、SunOS、UNIX System V 的忠实用户,之后是 Linux 的忠实用户。在技术方面,我的职业生涯大部分时间都是在做数据分析;特别是空间数据分析。拥有丰富的和数据分析相关的编程经验,用过的编程语言有 awk,Python、PostgreSQL、 PostGIS 和 最新的 Groovy。 + +-------------------------------------------------------------------------------- + +via: https://opensource.com/article/17/1/open-source-music-players + +作者:[Chris Hermansen][a] +译者:[WangYueScream](https://github.com/WangYueScream) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/clhermansen +[1]:http://www.alsa-project.org/main/index.php/Main_Page +[2]:https://www.flickr.com/photos/internetarchivebookimages/14565158187/in/photolist-ocoBRG-ocqdPM-ot9YYX-ovb7SE-oroqfj-ot8Sfi-of1HoD-oc5c28-otBk3B-foZxvq-ocoUvo-4TqEKE-otsG7t-oeYo4w-ornGMQ-orpD9y-wLDBUf-outZV7-oc26Ui-ortZpW-ocpWLH-ocoK6c-ocYDY1-od6ADb-xxAKyY-ocofDx-oc4Jr5-otyT2E-ocpUyu-xqTAb6-oc8gK1-otdsK5-ovhkz2-ocpcHj-oc8xwk-otgmZG-otr595-otnv4o-otvdRs-ovfYEt-ovDXUV-obUPJ6-oc2MuJ-oc4zLE-oruPbN-oc1P2H-ouRk93-otaGd3-otTmwB-oc5f62 +[3]:http://creativecommons.org/licenses/by-sa/4.0/ +[4]:https://en.wikipedia.org/wiki/History_of_music +[5]:https://opensource.com/article/16/12/soundtrack-open-source-music-players +[6]:http://aqualung.jeremyevans.net/ +[7]:https://gnumdk.github.io/lollypop-web/ +[8]:https://gogglesmm.github.io/ +[9]:http://aqualung.jeremyevans.net/ +[10]:https://launchpad.net/+search?field.text=aqualung+ppa +[11]:https://gnumdk.github.io/lollypop-web/ +[12]:https://launchpad.net/~gnumdk/+archive/ubuntu/lollypop +[13]:https://copr.fedorainfracloud.org/coprs/gnumdk/lollypop/ +[14]:https://gogglesmm.github.io/ +[15]:https://launchpad.net/~s.jansen/+archive/ubuntu/gogglesmm +[16]:http://www.guayadeque.org/ +[17]:http://www.nilsfrahm.com/works/felt/ +[18]:https://en.wikipedia.org/wiki/No_Protection_(Massive_Attack_album) +[19]:https://www.youtube.com/watch?v=9TvgRb4wiB0 +[20]:https://www.youtube.com/watch?v=LCUv-hLN71c +[21]:https://musicglue.com/bayonne/products/primitives---vinyl--/ +[22]:https://www.youtube.com/watch?v=WZ6xl6CKITE diff --git a/translated/tech/20170113 3 open source music players.md b/translated/tech/20170113 3 open source music players.md deleted file mode 100644 index 840a351eb8..0000000000 --- a/translated/tech/20170113 3 open source music players.md +++ /dev/null @@ -1,189 +0,0 @@ - -3 个开源的音乐播放器:Aqulung,Lollypop,和 GogglesMM -============================================================ - - - ![3 open source music players: Aqualung, Lollypop, and GogglesMM](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/music-birds-recording-520.png?itok=wvh1g4Lw "3 open source music players: Aqualung, Lollypop, and GogglesMM") - - -图片来源:[互联网档案馆][2]书中的图片;由 Opensource.com 编辑发布。遵循 [CC BY-SA 4.0][3] 协议。 - - -音乐是生活的一部分。[维基百科关于音乐发展历史的文章][4]有这样一段不错的描述说:“全世界所有的人们,包括哪怕是最孤立、与世隔绝的部落,都会有自己的特色音乐...”好吧,能够确定的是我们已经把那种部落的民乐推广出来广为人知。我建议我们对于“音乐形式”的划分也应该包括开源音乐播放器。在过去几年里,我已经使用体验过不少我能接触到的音乐播放器;[2016 年 12 月份][5]我根据这六个标准来总结概括分享我使用开源音乐播放器的经验感受: - - -1. 必须是能够通过设置让音乐从一成不变转换到 [ALSA][1]。(最高分 5分) -2. 应该有一个不错的“智能播放列表”。(1 分) -3. 不应该强迫用户总是只能通过播放列表来进行交互。(1 分) -4. 应该能够提供一个简单的方法来覆盖掉歌曲内嵌的图片或者在音乐目录里后退到 cover.jpg(或者 .png)。 -5. 应该能够在音乐播放的时候显示信号级别和实际的比特率。(1 分) -6. 能够呈现出不错的整体组织,结构布局和执行性能。(1 分) - - -热心的读者让我想起来有三个播放器是在我的资源仓库里找不到的:[Aqualung][6],[Lollypop][7],和 [GogglesMM][8]。我并不想在我办公用的电脑里面安装不必要的非办公需要的软件,我向大家承诺到时候我会配置一个“试验台”来达到测试这三个音乐播放器用户体验的目的并详细描述最终结果。 - -### Aqualung - - -[Aqualung][9] 有一个清晰明了的文字描述站点来解释它众多的特点。站点提供的说明中我发现其中一点特别有趣: - - -“你能够(也应该)将你的所有音乐按照艺术家/档案/声轨这样的分类标准系统化归类成一个树型结构,从而生成一个一体的 Winamp/XMMS 播放列表来让你的生活更简单。” - - -这点让我有些困惑因为我印象中我一直总是把我的音乐按照艺术家,专辑和声轨这样的分类标准系统归类。但这就可能解释了为什么我有时发现我的 XMMS-derived 播放器运行的时候有一点古怪,与这种音乐分类标准下播放器的浏览音乐的性能有关。 - - -根据在 Aqualung 官网下载的参考文档说明,官方发布的只有源代码。但是文档上的说明暗示了绝大多数主流的 Linux 发行版本都内置的有一份复制的编译后的 Aqualung,我当前用的办公电脑所使用的 Linux 发行版本并不在此范围内,Ubuntu 16.10。[Launchpad.net][10] 提供的有个人软件包库(PPAs),但那些软件看起来都有些过时了,版本比较老,所以为什么不试试编译源码安装软件呢? - - -我根据官网上编译文档的建议和配置脚本的提示安装了 **pkgconf** 以及 **libasound**,**libflac**,**libmp3lame**,**libvorbis**,**libxml2**,**libglib2.0** 和 **libgtk+-2.0** 的开发版。接下来,我就能够干净利索的进行**配置**然后进行**编译**和**编译安装**。最终我是通过执行 **/usr/local/bin/aqualung** 这个文件来进行 aqualung 的安装。 - - - ![Aqualung](https://opensource.com/sites/default/files/aqualung.png "Aqualung") - - -Aqualung,不能切换音乐播放的码率。 - - -一旦 Aqualung 启动运行,我就能看到两个相当简洁直接的窗口用户界面,播放器本身和“音乐商店”。我通过右键点击播放器的音乐面板打开参数设置查看这些可设置的参数看是否能找到 AudioQuest DragonFly 这个数字模拟转换器,但我没有找到任何相关的参数。然而,站点上的说明指出你可以通过命令行指定输出设备。最终我用 **plughw** 外置声卡设备来让 Aqualung 启动。 - - -在那个时候,真正让我对 Aqualung 感到失望的是 Aqualung 似乎是需要一个固定的输出设备来抽样检查频率。我能够用 Aqualung 播放器的默认设置来正常播放我的 44.1 Khz 文件,但是同样的抽样检查频率播放 96 Khz 的音乐文件时,我不得不关闭软件并重新启动。也正是因为这一点,我不会再继续进行对 Aqualung 的使用测评。 - - -**不作进一步的评论。** - - -### Lollypop - - - ![Lollypop interface](https://opensource.com/sites/default/files/lollypop_interface.png "Lollypop interface") - - -优美的 Lollypop 用户界面。 - - -[Lollypop][11] 有一个华丽的网站。尽管它不在我办公专用的电脑的软件仓库里面,但是有一个“针对 Ubuntu/Debian 用户的下载”链接带你跳转到 [launchpad.net 站点提供的最新的 PPA][12]。这个站点还提供针对 Flatpak,Arch Linux,Fedora,和 OpenSUSE 这些系统的 Lollypop 软件包的下载。我看了下[Fedora COPR 上针对各个 Fedora 版本的 Lollypop 下载链接][13],看起来 Lollypop 更新的比较及时而且从 Fedora 版本的 23 到 26 都有对应的软件包提供下载安装。 - - -就一天内从源码编译安装 Lollypop 软件是一件非常刺激的事,所以我决定试试从 PPA 安装这款软件。我通过命令行来安装执行 Lollypop 软件。设置菜单能够在 Lollypop 界面的右上方很明显地看见。更新完音乐后,我开始找电脑的输出设备设置,但是在一番查看后,我不知道如何针对 Lollypop 选择合适正确的输出设备。即便我在命令行通过 **-help** 也找不到有用的帮助信息。 - - -经过一番网上搜索后我找到一个 Lollypop 的开发者的描述说明才知道我需要 **gstreamer libav** 来让 Lollypop 工作。通过这个说明我暂时推断出可能还需要一个 **gstreamer** 相关配置才有可能让 Lollypop 成功正常运行工作,但是我至少现在不会去继续尝试。 - - -Lollypop 有一个优美的用户交互界面和它的优美的网站相得益彰,但是我现在不会进一步对它进行测评。否则我就又多了一个进一步去学习了解 **gstreamer** 的理由。 - - -**不作进一步的评论。** - -### GogglesMM - - -[Goggles Music Manager][14] 也有一个[在 launchpad.net 及时更新的 PPA][15];安装流程简单明了,我可以在命令行通过执行 **gogglesmm** 来完成安装。 - - -GogglesMM,非常容易上手使用,看上去和 Rhythmbox 有点像。我在 GogglesMM 的设置里面的参数设置中找到了音频选项设置,能够让我选择 ALSA 和设置音频输出用哪块输出设备。通过查看 **/proc/asound/DragonFly/stream0** 文件和 DragonFly 设备上 LED 的颜色我确定我能够用 GogglesMM 播放 44.1-KHz/21-bit 和 96-KHz/24-bit 这两种规格的音乐;因此,就凭“rate/depth passthrough”我给 GogglesMM 打 5 分。 - - - ![GogglesMM](https://opensource.com/sites/default/files/gogglesmm.png "GogglesMM") - - -上图是 GogglesMM 在播放 96/24 这种规格的音乐,显示音频输出设备选择。 - - -GogglesMM 的说明文档并没有大量的细节介绍,但是我尽可能能够说明的是,开发者们使用了不少过滤条件来实现类似“智能播放列表”的功能。我在我的测试环境下使用三张专辑来尽我所能检测过滤功能,当我使用“智能播放列表”功能的时候尽管我喜欢我看到的通过过滤筛选出来的歌曲(特别是能够基于广泛的标准来针对歌曲定义筛选条件),但这并不是我认为的“智能播放列表”,对我来说我认为“智能播放列表”应该是这样的,通过借助一些社区数据库来推荐提供和你近期播放的歌曲类似的曲目。或者我该把这个叫作“自动的 DJ”而不是“智能播放列表”,但是通过测试我最终能够确定的是,这个特性并不会在近期版本的 GogglesMM 中出现,所以我给它这个所谓的“智能播放列表”打 0 分。 - - -至于播放列表队列的操作,这款应用能够支持播放你选中的音乐也能够随机播放音乐或者把一些音乐整合到一个播放列表里面,所以我因为“播放列表的队列选项”给它打 1 分。 - - -同样的,它看起来也能够很好地不需要额外的干预来管理我的音乐艺术封面(每个专辑都包含一张合适的由 GogglesMM 自动识别的艺术封面),所以为“内嵌的艺术封面或者封面图片”打 1 分。 - - -我找不到任何方法来让 GogglesMM 显示信号级别或者实际的比特率。我也不能找到显示比特率和位深度的方法;尽管这款应用能够在一个列表里面显示所有的音乐“格式”,但是在我的音乐栏里面除了显示音乐格式不会显示其他的信息了,所以为 GogglesMM 的“信号级别和有效比特率”打 0 分。 - - -至于 GogglesMM 的整体结构,它设计的所有按钮选项都正好完全符合我的使用习惯。我能够在播放队列里面看到歌曲的时间和歌曲当前已播放的时间所占歌曲总体时间的比例,专辑封面,歌曲名,专辑名和歌唱者。可用的播放栏列表看起来相当的大容量有用,比如也包括了作曲者。最后,一个真正让我眼前一亮的特点是,音量控制竟然包含了 ALSA 音量。也就是如果我启动控制台调整音量的话然后不管是在控制台还是在 GogglesMM 里面调整音量,另一个音量控制也会做相应的音量调整。这个出乎我意外之外的功能相当的酷而且这个功能在其他的音乐播放器上也不常见,因此为它的整体架构给 GogglesMM 加 1 分。 - - -最终 GogglesMM 的这些优点共计得分 8。所表现出来的特点确实很优秀。 - - -**评分:8** - - -### 到目前为止所给出的评分 - - -我所提到的这几个开源音乐播放器中,我最喜欢的还是 [Guayadeque][16],根据我制定的标准来进行排名的话,我给 Guayadeque 打满分 10 分。来看下我对这三个开源音乐播放器的评分总结吧(N/R 代表“不作评论”,因为我不确定如何配置这些播放器来让它们以完美的码率和贯穿模式工作以便我的数字模拟信号转换器在相应源的码率和位深度接收 PCM 数据): - - - ![Open source audio players](https://opensource.com/sites/default/files/open_source_audio.png "Open source audio players") - - -请注意下我用的这个排名方法不是针对所有音乐播放器通用的。特别是很多人并不清楚高品质音乐的价值,他们更高兴专有格式的音乐能够给他们带来更好的音乐品质。 - - -与此同时,我会继续评测一些之前向大家承诺的音乐播放器一些和评测评分无关的特性。我特别喜欢 Lollypop 的外观,我也觉得待解锁的 **gstreamer** 有一种神秘的魅力,他能让基于 **gstreamer** 的音乐播放器不用通过转换就能传输他们的数据。 - - -### 关于音乐的部分... - - -我还在保持继续购买唱片的习惯,对于唱片的购买我有些不错的推荐。 - - -第一个就是 Nils Frahm 的专辑,[Felt][17],是我女儿送我的一份非常贴心的礼物。我真的真的很喜欢这张专辑,它的绝大部分歌曲都是在深夜用电麦录制的非常接近钢琴的弦乐而且也有不少有趣的钢琴演奏的背景音乐,真的是很棒的音乐。至于 Nils Frahm 其他的音乐,这些唱片也提供的有下载链接允许你下载质量高达 96-KHz,24-bit FLAC 格式的音乐。 - - -第二个就是 Massive Attack 的 [Mad Professor's remix][18] 这份专辑。你可以[在这里了解这份专辑][19],并且如果你想要尝试这份专辑最原始的版本,[这里是汇总的它的所有相关信息][20]。最原始的版本诞生于 20 世纪 90 年代,这份专辑刻录在唱片上面而且听起来非常奇幻。遗憾的是,不提供下载链接。 - - -第三个就是 Bayonne 的 [Primitives][21]。[这是专辑要表达的想法][22]。Guardian 报社把这份专辑称作是“新花样的无聊”。那么这种类型的音乐到底怎么样呢?如果这些音乐真的是非常令人乏味的,或许是时候来换份工作了,无论如何你可以试试听这些音乐;或许你会觉得它确实很乏味或者你会像我一样喜欢上这份音乐。 - --------------------------------------------------------------------------------- - - -作者简介: - -![](https://opensource.com/sites/default/files/styles/profile_pictures/public/clh_portrait2.jpg?itok=V1V-YAtY) - - -Chris Hermansen - 自 1978 年毕业于 British Columbia 大学后一直从事计算机相关工作,2005 年之前是 Solaris,SunOS,UNIX System V 的忠实用户,之后是 Linux 的忠实用户。在技术方面,我的职业生涯大部分时间都是在做数据分析;特别是空间数据分析。拥有丰富的和数据分析相关的编程经验,用过的编程语言有 awk,Python,PostgreSQL, PostGIS 和 最新的 Groovy。 - - --------------------------------------------------------------------------------- - -via: https://opensource.com/article/17/1/open-source-music-players - -作者:[Chris Hermansen][a] -译者:[WangYueScream](https://github.com/WangYueScream) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/clhermansen -[1]:http://www.alsa-project.org/main/index.php/Main_Page -[2]:https://www.flickr.com/photos/internetarchivebookimages/14565158187/in/photolist-ocoBRG-ocqdPM-ot9YYX-ovb7SE-oroqfj-ot8Sfi-of1HoD-oc5c28-otBk3B-foZxvq-ocoUvo-4TqEKE-otsG7t-oeYo4w-ornGMQ-orpD9y-wLDBUf-outZV7-oc26Ui-ortZpW-ocpWLH-ocoK6c-ocYDY1-od6ADb-xxAKyY-ocofDx-oc4Jr5-otyT2E-ocpUyu-xqTAb6-oc8gK1-otdsK5-ovhkz2-ocpcHj-oc8xwk-otgmZG-otr595-otnv4o-otvdRs-ovfYEt-ovDXUV-obUPJ6-oc2MuJ-oc4zLE-oruPbN-oc1P2H-ouRk93-otaGd3-otTmwB-oc5f62 -[3]:http://creativecommons.org/licenses/by-sa/4.0/ -[4]:https://en.wikipedia.org/wiki/History_of_music -[5]:https://opensource.com/article/16/12/soundtrack-open-source-music-players -[6]:http://aqualung.jeremyevans.net/ -[7]:https://gnumdk.github.io/lollypop-web/ -[8]:https://gogglesmm.github.io/ -[9]:http://aqualung.jeremyevans.net/ -[10]:https://launchpad.net/+search?field.text=aqualung+ppa -[11]:https://gnumdk.github.io/lollypop-web/ -[12]:https://launchpad.net/~gnumdk/+archive/ubuntu/lollypop -[13]:https://copr.fedorainfracloud.org/coprs/gnumdk/lollypop/ -[14]:https://gogglesmm.github.io/ -[15]:https://launchpad.net/~s.jansen/+archive/ubuntu/gogglesmm -[16]:http://www.guayadeque.org/ -[17]:http://www.nilsfrahm.com/works/felt/ -[18]:https://en.wikipedia.org/wiki/No_Protection_(Massive_Attack_album) -[19]:https://www.youtube.com/watch?v=9TvgRb4wiB0 -[20]:https://www.youtube.com/watch?v=LCUv-hLN71c -[21]:https://musicglue.com/bayonne/products/primitives---vinyl--/ -[22]:https://www.youtube.com/watch?v=WZ6xl6CKITE From 33127f35bb1165725b729b3ee02dfd9225877911 Mon Sep 17 00:00:00 2001 From: Snaplee Date: Sat, 5 Aug 2017 12:55:05 +0800 Subject: [PATCH 0911/1407] [translated by Snaplee] 20170711 Ubuntu Core Making a factory image with private snaps.md --- ...king a factory image with private snaps.md | 167 ------------------ ...king a factory image with private snaps.md | 147 +++++++++++++++ 2 files changed, 147 insertions(+), 167 deletions(-) delete mode 100644 sources/tech/20170711 Ubuntu Core Making a factory image with private snaps.md create mode 100644 translated/tech/20170711 Ubuntu Core Making a factory image with private snaps.md diff --git a/sources/tech/20170711 Ubuntu Core Making a factory image with private snaps.md b/sources/tech/20170711 Ubuntu Core Making a factory image with private snaps.md deleted file mode 100644 index 40ec62e68b..0000000000 --- a/sources/tech/20170711 Ubuntu Core Making a factory image with private snaps.md +++ /dev/null @@ -1,167 +0,0 @@ -【Snaplee翻译中】Ubuntu Core: Making a factory image with private snaps -============================================================ - - - -### Share or save - -This is a follow-up to the [ROS prototype to production on Ubuntu Core][3] series to answer a question I received: “What if I want to make an image for the factory, but don’t want to make my snaps public?” This question is of course not robotics-specific, and neither is its answer. In this post we’ll cover two ways to do this. - -Before we start, you’ll need a little bit of an Ubuntu Core imaging background. If you followed the ROS prototype to production series ([part 5][4] specifically) you already have the required background, but if you didn’t, check out the [tutorial for creating your own Ubuntu Core image][5]. - -Assuming you’re up-to-speed and know what I’m talking about when I say “model definition” or “model assertion,” let’s get started on a few different methods for creating an Ubuntu Core image with private snaps. - -### Method 1: Don’t put your snap in the store at all - -It really doesn’t get simpler. Take a look at this example model definition, **amd64-model.json**: - -``` -{ - "type": "model", - "series": "16", - "model": "custom-amd64", - "architecture": "amd64", - "gadget": "pc", - "kernel": "pc-kernel", - "authority-id": "4tSgWHfAL1vm9l8mSiutBDKnnSQBv0c8", - "brand-id": "4tSgWHfAL1vm9l8mSiutBDKnnSQBv0c8", - "timestamp": "2017-06-23T21:03:24+00:00", - "required-snaps": ["kyrofa-test-snap"] -} -``` - -Let’s go ahead and turn that into a model assertion: - -``` -$ cat amd64-model.json | snap sign -k my-key-name > amd64.model -You need a passphrase to unlock the secret key for -user: "my-key-name" -4096-bit RSA key, ID 0B79B865, created 2016-01-01 -... -``` - -Now you have your model assertion: **amd64.model**. If you hand that to **ubuntu-image** right now you’ll run into a problem: - -``` -$ sudo ubuntu-image -c stable amd64.model -Fetching core -Fetching pc-kernel -Fetching pc -Fetching kyrofa-test-snap -error: cannot find snap "kyrofa-test-snap": snap not found -COMMAND FAILED: snap prepare-image --channel=stable amd64.model /tmp/tmp6p453gk9/unpack -``` - -The snap with the name **kyrofa-test-snap** isn’t actually in the store. But that’s important to note: the model definition (and thus assertion) only contains a list of snap names. If you have a snap locally with that name, even if it’s not in the store, you can tell **ubuntu-image** to use it to satisfy that name in the assertion with the **–extra-snaps** option: - -``` -$ sudo ubuntu-image -c stable \ - --extra-snaps /path/to/kyrofa-test-snap_0.1_amd64.snap \ - amd64.model -Fetching core -Fetching pc-kernel -Fetching pc -Copying "/path/to/kyrofa-test-snap_0.1_amd64.snap" (kyrofa-test-snap) -kyrofa-test-snap already prepared, skipping -WARNING: "kyrofa-test-snap" were installed from local snaps -disconnected from a store and cannot be refreshed subsequently! -Partition size/offset need to be a multiple of sector size (512). -The size/offset will be rounded up to the nearest sector. -``` - -There. You now have an Ubuntu Core image (named **pc.img**) with your snap preinstalled, without the snap ever needing to be in the store. This works, but it has a big disadvantage which **ubuntu-image** points out with a warning: preinstalling a snap that isn’t connected to the store means you have no way to update it once devices are flashed with this image. Your only update mechanism would be to ship new images to be flashed. - -### Method 2: Use a brand store - -When you create a store account and visit [dashboard.snapcraft.io][6], you’re viewing your snaps in the standard Ubuntu store. If you install snapd fresh on your system, this is the store it uses by default. While you can release snaps privately on the Ubuntu store, you [can’t preinstall those in an image][7] because only you (and the collaborators you’ve added) can obtain access to it. The only way you can make an image in this case would be to make the snaps publicly available, which defeats the whole purpose of this post. - -For this use-case, we have what are called [**brand stores**][8]. Brand stores are still hosted in the Ubuntu store, but they’re a custom, curated version of it, meant to be specific to a given company or device. They can inherit (or not) from the standard Ubuntu store, and be open to all developers or locked down to a specific group (which is what we want in our case, to keep things private). - -Note that this is a paid feature. You need to [request a brand store][9]. Once your request has been granted, you’ll see your new store by visiting “stores you can access” under your name. - -![](https://insights.ubuntu.com/wp-content/uploads/1a62/stores_you_can_access.jpg) - -There you’ll see the various stores to which you have access. You’ll have at least two: the normal Ubuntu store, and your new brand store. Select the brand store (red rectangle). While you’re here, record your store ID (blue rectangle): you’ll need it in a moment. - -![](https://insights.ubuntu.com/wp-content/uploads/b10c/Screenshot-from-2017-07-06-15-16-32.png) - -From there, registering names/uploading snaps works the same way, but now they go into your brand store instead of the standard one, and assuming you have it unlisted, those snaps are not available to external users. The only caveat today is that at least the first upload for the snap needs to be via the web interface. After that, you can continue to use Snapcraft like normal. - -So how does this change things? My “kyrofa-store” inherits snaps from the Ubuntu store, and also contains a “kyrofa-branded-test-snap” published into the stable channel. This snap isn’t available in the Ubuntu store, as you can see if you search for it: - -``` -$ snap find kyrofa-branded -The search "kyrofa-branded" returned 0 snaps -``` - -But using the store ID we recorded earlier, we can make a model assertion that pulls from the brand store instead of the Ubuntu store. We just need to add the “store” key to the JSON document, making it look like this: - -``` -{ - "type": "model", - "series": "16", - "model": "custom-amd64", - "architecture": "amd64", - "gadget": "pc", - "kernel": "pc-kernel", - "authority-id": "4tSgWHfAL1vm9l8mSiutBDKnnSQBv0c8", - "brand-id": "4tSgWHfAL1vm9l8mSiutBDKnnSQBv0c8", - "timestamp": "2017-06-23T21:03:24+00:00", - "required-snaps": ["kyrofa-branded-test-snap"], - "store": "kyek" -} -``` - -Sign it just as we did in **Method 1**, and we can create an Ubuntu Core image with our private, brand-store snap preinstalled as simply as: - -``` -$ sudo ubuntu-image -c stable amd64.model -Fetching core -Fetching pc-kernel -Fetching pc -Fetching kyrofa-branded-test-snap -Partition size/offset need to be a multiple of sector size (512). -The size/offset will be rounded up to the nearest sector. -``` - -Now, like at the end of **Method 1**, you have a **pc.img** ready for the factory. However, with this method, the snaps in the image are all coming from the store, which means they will automatically update as usual. - -### Conclusion - -These are the only two options for doing this today. When I started writing this post I thought there was a third (keeping one’s snap private and creating an image with it), but that turns out to [not be the case][10]. - -Note that we’ve also received numerous requests for some sort of on-premises/enterprise store, and while such a product is not yet available, the store team is working on it. Once this is available, I’ll write a new post about it. - -I hope this proves useful! - - _Original post can be found [here][1]._ - --------------------------------------------------------------------------------- - -作者简介: - -Kyle is a member of the Snapcraft team, and is also Canonical's resident roboticist. He focuses on snaps and the snap developer experience, as well as robotics enablement for snaps and Ubuntu Core. - - - ------ - -via: https://insights.ubuntu.com/2017/07/11/ubuntu-core-making-a-factory-image-with-private-snaps/ - -作者:[Kyle Fazzari ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://insights.ubuntu.com/author/kyrofa/ -[1]:http://bit.ly/2sS7M1i -[2]:https://insights.ubuntu.com/author/kyrofa/ -[3]:https://insights.ubuntu.com/2017/04/06/from-ros-prototype-to-production-on-ubuntu-core/ -[4]:https://insights.ubuntu.com/2017/05/09/ros-production-create-ubuntu-core-image-with-snap-preinstalled-55/ -[5]:https://tutorials.ubuntu.com/tutorial/create-your-own-core-image -[6]:http://dashboard.snapcraft.io/ -[7]:https://forum.snapcraft.io/t/unable-to-create-an-image-that-uses-private-snaps -[8]:https://docs.ubuntu.com/core/en/build-store/index -[9]:https://docs.ubuntu.com/core/en/create -[10]:https://forum.snapcraft.io/t/unable-to-create-an-image-that-uses-private-snaps diff --git a/translated/tech/20170711 Ubuntu Core Making a factory image with private snaps.md b/translated/tech/20170711 Ubuntu Core Making a factory image with private snaps.md new file mode 100644 index 0000000000..1dc0ed53b8 --- /dev/null +++ b/translated/tech/20170711 Ubuntu Core Making a factory image with private snaps.md @@ -0,0 +1,147 @@ +# Ubuntu Core: 制作包含私有 snaps 的工厂镜像 +--- +这篇帖子是有关 [ROS prototype to production on Ubuntu Core][1] 系列的补充,用来回答我接收到的一个问题: “如何在不公开发布 snaps 的情况下制作一个工厂镜像?” 当然,问题和回答都不只是针对于机器人技术。在这篇帖子中,我将会通过两种方法来回答这个问题。 + +开始之前,你需要了解一些制作 Ubuntu Core 镜像的背景知识,如果你已经看过 [ROS prototype to production on Ubuntu Core][3] 系列文章(具体是第 5 部分),你就已经有了需要的背景知识,如果没有看过的话,可以查看有关 [制作你的 Ubuntu Core 镜像][5] 的教程。 + +如果你已经了解了最新的情况并且当我说 “模型定义” 或者 “模型断言” 时知道我在谈论什么,那就让我们开始通过不同的方法使用私有 sanps 来制作 Ubuntu Core 镜像吧。 + +### 方法 1: 无需上传你的 snap 到商店 +这是最简单的方法了。首先看一下这个有关模型定义的例子——**amd64-model.json**: +``` +{ + "type": "model", + "series": "16", + "model": "custom-amd64", + "architecture": "amd64", + "gadget": "pc", + "kernel": "pc-kernel", + "authority-id": "4tSgWHfAL1vm9l8mSiutBDKnnSQBv0c8", + "brand-id": "4tSgWHfAL1vm9l8mSiutBDKnnSQBv0c8", + "timestamp": "2017-06-23T21:03:24+00:00", + "required-snaps": ["kyrofa-test-snap"] +} +``` +让我们将它转换成模型断言 +``` +$ cat amd64-model.json | snap sign -k my-key-name > amd64.model +You need a passphrase to unlock the secret key for +user: "my-key-name" +4096-bit RSA key, ID 0B79B865, created 2016-01-01 +... +``` +获得模型断言:**amd64.model** 后,如果你现在就把它交给 **ubuntu-image** 使用,你将会碰钉子: +``` +$ sudo ubuntu-image -c stable amd64.model +Fetching core +Fetching pc-kernel +Fetching pc +Fetching kyrofa-test-snap +error: cannot find snap "kyrofa-test-snap": snap not found +COMMAND FAILED: snap prepare-image --channel=stable amd64.model /tmp/tmp6p453gk9/unpack +``` +实际上商店中并没有名为 **kyrofa-test-snap** 的 snap。这里需要重点说明的是:模型定义(以及转换后的断言)会包含一列 snap 的名字。如果你在本地有个名字相同的 snap,即使它没有存在于商店中,你也可以通过 **--extra-snaps** 选项告诉 **ubuntu-image** 在断言中增加这个名字的来使用它: +``` +$ sudo ubuntu-image -c stable \ + --extra-snaps /path/to/kyrofa-test-snap_0.1_amd64.snap \ + amd64.model +Fetching core +Fetching pc-kernel +Fetching pc +Copying "/path/to/kyrofa-test-snap_0.1_amd64.snap" (kyrofa-test-snap) +kyrofa-test-snap already prepared, skipping +WARNING: "kyrofa-test-snap" were installed from local snaps +disconnected from a store and cannot be refreshed subsequently! +Partition size/offset need to be a multiple of sector size (512). +The size/offset will be rounded up to the nearest sector. +``` +现在,在 snap 并没有上传到商店的情况下,你已经获得一个预装了私有 snap 的 Ubuntu Core 镜像(名为 pc.img)。但是这样做有一个很大的问题,ubuntu-image 会提示一个警告:不通过连接商店预装 snap 意味着你没有办法在烧录了这些镜像的设备上更新它。你只能通过制作新的镜像并重新烧录到设备的方式来更新它。 + +### 方法 2: 使用品牌商店 +当你注册了一个商店账号并访问 [dashboard.snapcraft.io][6] 时,你其实是在标准的 Ubuntu 商店中查看你的 snaps。如果你在系统中安装 snap(原文是:If you install snapd fresh on your system,但是 snapd 并不是从 Ubuntu 商城安装的,而是通过 apt-get 命令 安装的),默认会从这个商店下载。虽然你可以在 Ubuntu 商店中发布私有的 snaps,但是你 [不能将它们预装到镜像中][7],因为只有你(以及你添加的合作者)才有权限去使用它。在这种情况下制作镜像的唯一方式就是公开发布你的 snaps,然而这并不符合这篇帖子的目的(原文是:which defeats the whole purpose of this post)。 + +对于这种用例,我们有所谓的 **[品牌商店][8]**。品牌商店仍然在 Ubuntu 商店里托管,但是它们是针对于某一特定公司或设备的一个可定制的策划(curated)版本。品牌商店可以继承或者不继承标准的 Ubuntu 商店,品牌商店也可以选择开放给所有的开发者或者将其限制在一个特定的组内(保持私有正是我们想要的)。 + +请注意,这是一个付费功能。你需要 [申请一个品牌商店][9]。请求通过后,你将可以通过访问用户名下的“stores you can access” 看到你的新商店。 +![图片.png-78.9kB][10] + +在那里你可以看到多个有权使用的商店。最少的情况下也会有两个: 标准的 Ubuntu 商店以及你的新的品牌商店。选择品牌商店(红色矩形),进去后记录下你的商店 ID(蓝色矩形):等下你将会用到它。 +![图片.png-43.9kB][11] + + +在品牌商店里注册名字或者上传 snaps 和标准的商店使用的方法是一样的,只是它们现在是上传到你的品牌商店而不是标准的那个。如果你没有将品牌商店列出来,那么这些 snaps 对外部用户是不可见。但是这里需要注意的是第一次上传 snap 的时候需要通过web界面来操作。在那之后,你可以继续像往常一样使用 Snapcraft 。 + +那么这些是如何改变的呢?我的 “kyrofal-store” 从 Ubuntu 商店继承了 snaps,并且还包含一个发布在稳定通道中的 “kyrofa-bran-test-snap” 。这个 snap 在 Ubuntu 商店里是使用不了的,如果你去搜索它,你是找不到的: +``` +$ snap find kyrofa-branded +The search "kyrofa-branded" returned 0 snaps +``` + +但是使用我们前面记录的商店 ID,我们可以创建一个从品牌商店而不是 Ubuntu 商店下载 snaps 的模型断言。我们只需要将 “store” 键添加到 JSON 文件中,就像这样: +``` +{ + "type": "model", + "series": "16", + "model": "custom-amd64", + "architecture": "amd64", + "gadget": "pc", + "kernel": "pc-kernel", + "authority-id": "4tSgWHfAL1vm9l8mSiutBDKnnSQBv0c8", + "brand-id": "4tSgWHfAL1vm9l8mSiutBDKnnSQBv0c8", + "timestamp": "2017-06-23T21:03:24+00:00", + "required-snaps": ["kyrofa-branded-test-snap"], + "store": "kyek" +} +``` +使用方法 1 中的方式对它签名,然后我们就可以像这样很简单的制作一个预装有我们品牌商店私有 snap 的 Ubuntu Core 镜像: +``` +$ sudo ubuntu-image -c stable amd64.model +Fetching core +Fetching pc-kernel +Fetching pc +Fetching kyrofa-branded-test-snap +Partition size/offset need to be a multiple of sector size (512). +The size/offset will be rounded up to the nearest sector. +``` +现在,和方法 1 的最后一样,你获得了一个为工厂准备的 pc.img。并且使用这种方法制作的镜像中的所有 snaps 都从商店下载的,这意味着它们将能像平常一样自动更新。 + +### 结论 + +到目前为止,做这个只有两种方法。当我开始写这篇帖子的时候,我想过可能还有第三种(将 snap 设置为私有然后使用它制作镜像),[但最后证明是不行的][12]。 + +另外,我们也收到很多内部部署或者企业商店的请求,虽然这样的产品还没有公布,但是商店团队正在从事这项工作。一旦可用,我将会写一篇有关它的文章。 + +希望能帮助到您! + + +--- +关于作者 +Kyle 的图片 + +![Kyle_Fazzari.jpg-12kB][13] + +Kyle 是 Snapcraft 团队的一员,也是 Canonical 公司的常驻机器人专家,他专注于 snaps 和 snap 开发实践,以及 snaps 和 Ubuntu Core 的机器人技术实现。 + +- - - +via: https://insights.ubuntu.com/2017/07/11/ubuntu-core-making-a-factory-image-with-private-snaps/ + +作者:[Kyle Fazzari][a] +译者:[Snaplee](https://github.com/Snaplee) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + + [1]: https://insights.ubuntu.com/2017/04/06/from-ros-prototype-to-production-on-ubuntu-core/ + [2]: https://insights.ubuntu.com/2017/04/06/from-ros-prototype-to-production-on-ubuntu-core/ + [3]: https://insights.ubuntu.com/2017/04/06/from-ros-prototype-to-production-on-ubuntu-core/ + [4]: https://insights.ubuntu.com/2017/04/06/from-ros-prototype-to-production-on-ubuntu-core/ + [5]: https://tutorials.ubuntu.com/tutorial/create-your-own-core-image + [6]: https://dashboard.snapcraft.io/dev/snaps/ + [7]: https://forum.snapcraft.io/t/unable-to-create-an-image-that-uses-private-snaps + [8]: https://docs.ubuntu.com/core/en/build-store/index?_ga=2.103787520.1269328701.1501772209-778441655.1499262639 + [9]: https://docs.ubuntu.com/core/en/build-store/create + [10]: http://static.zybuluo.com/apollomoon/hzffexclyv4srqsnf52a9udc/%E5%9B%BE%E7%89%87.png + [11]: http://static.zybuluo.com/apollomoon/9gevrgmq01s3vdtp5qfa8tp7/%E5%9B%BE%E7%89%87.png + [12]: https://forum.snapcraft.io/t/unable-to-create-an-image-that-uses-private-snaps/1115 + [13]: http://static.zybuluo.com/apollomoon/xaxxjof19s7cbgk00xntgmqa/Kyle_Fazzari.jpg + [14]: https://insights.ubuntu.com/2017/04/06/from-ros-prototype-to-production-on-ubuntu-core/ From a6a0ede6bfdd2f87010c1c8ccad9b57667788119 Mon Sep 17 00:00:00 2001 From: Snaplee <30320680+Snaplee@users.noreply.github.com> Date: Sat, 5 Aug 2017 12:56:30 +0800 Subject: [PATCH 0912/1407] Update 20170711 Ubuntu Core Making a factory image with private snaps.md --- ...711 Ubuntu Core Making a factory image with private snaps.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translated/tech/20170711 Ubuntu Core Making a factory image with private snaps.md b/translated/tech/20170711 Ubuntu Core Making a factory image with private snaps.md index 1dc0ed53b8..efe9af6af6 100644 --- a/translated/tech/20170711 Ubuntu Core Making a factory image with private snaps.md +++ b/translated/tech/20170711 Ubuntu Core Making a factory image with private snaps.md @@ -40,7 +40,7 @@ Fetching kyrofa-test-snap error: cannot find snap "kyrofa-test-snap": snap not found COMMAND FAILED: snap prepare-image --channel=stable amd64.model /tmp/tmp6p453gk9/unpack ``` -实际上商店中并没有名为 **kyrofa-test-snap** 的 snap。这里需要重点说明的是:模型定义(以及转换后的断言)会包含一列 snap 的名字。如果你在本地有个名字相同的 snap,即使它没有存在于商店中,你也可以通过 **--extra-snaps** 选项告诉 **ubuntu-image** 在断言中增加这个名字的来使用它: +实际上商店中并没有名为 **kyrofa-test-snap** 的 snap。这里需要重点说明的是:模型定义(以及转换后的断言)会包含一列 snap 的名字。如果你在本地有个名字相同的 snap,即使它没有存在于商店中,你也可以通过 **--extra-snaps** 选项告诉 **ubuntu-image** 在断言中增加这个名字来使用它: ``` $ sudo ubuntu-image -c stable \ --extra-snaps /path/to/kyrofa-test-snap_0.1_amd64.snap \ From 117c0db7be1789f7cf4ff3ed77aa938d51e5495d Mon Sep 17 00:00:00 2001 From: Snaplee <30320680+Snaplee@users.noreply.github.com> Date: Sat, 5 Aug 2017 23:42:03 +0800 Subject: [PATCH 0913/1407] =?UTF-8?q?Snaplee=20=E5=87=86=E5=A4=87=E5=BC=80?= =?UTF-8?q?=E5=A7=8B=E7=BF=BB=E8=AF=91?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...0628 Build test and publish snap packages using snapcraft.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/sources/tech/20170628 Build test and publish snap packages using snapcraft.md b/sources/tech/20170628 Build test and publish snap packages using snapcraft.md index dbb86e5ee6..0df0b5db6c 100644 --- a/sources/tech/20170628 Build test and publish snap packages using snapcraft.md +++ b/sources/tech/20170628 Build test and publish snap packages using snapcraft.md @@ -1,4 +1,4 @@ -Build, test, and publish snap packages using snapcraft +【Snaplee准备翻译】Build, test, and publish snap packages using snapcraft ============================================================ From 5c39bac6332ce9606ccc614de1d3b57946e318f4 Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 6 Aug 2017 09:29:55 +0800 Subject: [PATCH 0914/1407] PRF&PUB:20170120 lxc exec vs ssh.md @geekpi --- published/20170120 lxc exec vs ssh.md | 103 +++++++++++++++++++ translated/tech/20170120 lxc exec vs ssh.md | 104 -------------------- 2 files changed, 103 insertions(+), 104 deletions(-) create mode 100644 published/20170120 lxc exec vs ssh.md delete mode 100644 translated/tech/20170120 lxc exec vs ssh.md diff --git a/published/20170120 lxc exec vs ssh.md b/published/20170120 lxc exec vs ssh.md new file mode 100644 index 0000000000..33520cc2a3 --- /dev/null +++ b/published/20170120 lxc exec vs ssh.md @@ -0,0 +1,103 @@ +lxc exec 介绍 +============================================================ + +最近,我对 `lxc exec` 进行了几个改进。如果你不知道它的话我介绍一下,`lxc exec` 是 [LXD][1] 的客户端工具,使用 [LXD][2] [客户端 api][3] 与 LXD 守护程序通信,并执行用户想要执行的各种程序,以下是你可以使用的一个例子: + +[![asciicast](https://asciinema.org/a/100035.png)][4] + +我们的主要目标之一就是使 `lxc exec` 与 `ssh` 类似,因为它是交互式或非交互式远程运行命令的标准。这使得 把 `lxc exec` 做得很好变得有点棘手。 + +### 1、 处理后台任务 + +一个长期存在的问题当然是如何正确处理后台任务。这是一个关于 [LXD][5] 2.7 实例的问题的例子: + +[![asciicast](https://asciinema.org/a/100040.png)][6] + +你可以看到,在后台执行任务将导致 `lxc exec` 无法退出。许多命令可以触发此问题: + +``` +chb@conventiont|~ +> lxc exec zest1 bash +root@zest1:~# yes & +y +y +y +. +. +. +``` + +现在没有什么能救你了。`yes` 将会永远直接写入`stdout`。 + +问题的根源在于 `stdout` 是一直打开着的,但这是必要的,因为它用以确保用户所启动的进程写入的任何数据实际上都是通过我们建立的 websocket 连接读取并发回的。 + +假如你想这样,运行一个 shell 会话,然后在后台运行一个进程,并马上退出 shell。对不起,它并不能如预期那样。 + +第一种并且原始的方法是一旦你检测到前台程序(例如 shell)已经退出就直接关闭 `stdout`。但这不像想得那么好,当你运行快速执行程序时,这个问题会变得明显,比如: + +``` +lxc exec -- ls -al /usr/lib +``` + +这里 `lxc exec` 进程(和相关的 `forkexec` 进程。但现在不要考虑它,只要记住 `Go` + `setns()` 不相往来就行了……)会在 `stdout` 中所有的_缓冲_数据被读取之前退出。这种情况下将会导致截断输出,没有人想要这样。在尝试使用几个方法来解决问题之后,包括禁用 pty 缓冲(我告诉你,这不太漂亮,也没有如预期工作。)和其他奇怪的思路,我设法通过几个 `poll()` “技巧”(在某种意义上说一个“技巧”)解决了这个问题。现在你终于可以运行后台任务,并且可以完全退出了。如图: + +[![asciicast](https://asciinema.org/a/100043.png)][7] + +### 2、 报告由信号引起的退出码 + +`ssh` 是一个很棒的工具。但有一件事,我一直以来不喜欢当 ssh 运行的命令接收到一个信号时, `ssh` 总是会报告 `-1`,也就是退出码 `255`。当你想要了解导致程序终止的信号时,这很烦人。这就是为什么我最近实施标准 shell 所使用的惯例 `128 + n` 来报告任何由信号导致的退出,其中 `n` 被定义为导致执行程序退出的信号量。例如,在 `SIGKILL` 信号上,你会看到 `128 + SIGKILL = 137`(计算其他致命信号的退出码作为读者的练习)。所以你可以这么做: + +``` +chb@conventiont|~ +> lxc exec zest1 sleep 100 +``` + +现在,将 `SIGKILL` 发送到执行程序(不是 `lxc exec`本身,因为 `SIGKILL` 不可转发)。 + +``` +kill -KILL $(pidof sleep 100) +``` + +最后检查你程序的退出码: + +``` +chb@conventiont|~ +> echo $? +137 +``` + +瞧。这显然只有当 a) 退出码没有超过 `8` 位计算壁垒,b)当执行程序不使用 `137` 来表示成功(这可真……有趣?!)。这两个论点似乎对我来说都不太有说服力。前者因为致命信号量不_应该_超过这个范围。后者因为(i)这是用户问题,(ii)这些退出代码实际上是保留的(我是_这样认为_。),(iii)你在本地或其他上面运行程序时会遇到同样的问题。 + +我看到的主要优点是这能够回报执行程序细粒度的退出状态。注意,我们不会报告_所有_被信号杀死的程序实例。比如说,当你的程序能够处理 `SIGTERM` 并且完全退出时,[LXD][8] 没有简单的方法来检测到这个情况并报告说这个程序被信号杀死了。你只会简单地收到退出码 `0`。 + +### 3、 转发信号 + +这可能不太有趣(或者也许不是,谁知道呢),但我发现它非常有用。正如你在 `SIGKILL` 案例中看到的那样,我明确地指出,必须将 `SIGKILL` 发送到执行程序,而不是 `lxc exec`命令本身。这是因为 `SIGKILL` 在程序中无法处理。程序可以做的唯一的事情就是去死,像现在这样……像这个例子……马上(你明白了了吧……)。但是程序可以处理很多其他信号 `SIGTERM`、`SIGHUP',当然也可以处理 `SIGUSR1` 和 `SIGUSR2`。因此,当你发送可以被 `lxc exec` 处理而不是被执行程序处理的信号时,较新版本的 [LXD][9] 会将信号转发到执行进程。这在脚本中非常方便。 + +无论如何,我希望你觉得这篇小小的 `lxc exec` 文章/胡言乱语有用。享受 [LXD][10] 吧,这是与一只疯狂的美丽的野兽玩耍。请试试在线实验:[https://linuxcontainers.org/lxd/try-it/][11],对于开发人员看看这里:[https://github.com/lxc/lxd][12] 并给我们补丁。 + +我们不要求签署任何 CLA,我们遵循内核风格,只要其中有 “Signed-off-by” 这行就好。 + +-------------------------------------------------------------------------------- + +via: https://cbrauner.wordpress.com/2017/01/20/lxc-exec-vs-ssh/ + +作者:[brauner][a] +译者:[geekpi](https://github.com/geekpi) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://cbrauner.wordpress.com +[1]:https://github.com/lxc/lxd +[2]:https://github.com/lxc/lxd +[3]:https://github.com/lxc/lxd/blob/master/client.go +[4]:https://asciinema.org/a/100035?autoplay=1 +[5]:https://github.com/lxc/lxd +[6]:https://asciinema.org/a/100040?autoplay=1 +[7]:https://asciinema.org/a/100043?autoplay=1 +[8]:https://github.com/lxc/lxd +[9]:https://github.com/lxc/lxd +[10]:https://github.com/lxc/lxd +[11]:https://linuxcontainers.org/lxd/try-it/ +[12]:https://github.com/lxc/lxd diff --git a/translated/tech/20170120 lxc exec vs ssh.md b/translated/tech/20170120 lxc exec vs ssh.md deleted file mode 100644 index c818563af0..0000000000 --- a/translated/tech/20170120 lxc exec vs ssh.md +++ /dev/null @@ -1,104 +0,0 @@ -lxc exec vs ssh -============================================================ - - -最近,我对 `lxc exec` 进行了几个改进。以防你不知道,`lxc exec` 是 [LXD][1] 的客户端工具,使用 [LXD][2] [client api][3] 与 LXD 守护程序通信并执行任何用户想要的程序,以下是你可以使用的一个例子: - - [![asciicast](https://asciinema.org/a/100035.png)][4] - -我们的主要目标之一就是使 `lxc exec` 与 `ssh` 类似,因为它是交互式或非交互式远程运行命令的标准。这使得 `lxc exec` 做得很好变得棘手。 - -### 1\. 处理后台任务 - -一个长期存在的问题当然是如何正确处理后台任务。这是一个关于 [LXD][5] 2.7 实例的问题的 asciinema 中的插图: - - [![asciicast](https://asciinema.org/a/100040.png)][6] - -你可以看到,在后台执行任务将导致 `lxc exec` 无法退出。许多命令可以触发此问题: - -``` -chb@conventiont|~ -> lxc exec zest1 bash -root@zest1:~# yes & -y -y -y -. -. -. -``` - -现在没有什么能救你。`yes` 将会永远直接写入`stdout`。 - -问题的根源在于 `stdout` 被保持打开,但这是必要的,它用以确保用户启动的进程写入的任何数据实际上是通过我们建立的 websocket 连接读取并发回的。 - -你可以想象,比如当你运行一个 shell 会话,你希望在后台运行一个进程,然后快速退出。对不起,你运气不好。 - -第一种并且原始的方法是一旦你检测到前台程序(例如 shell)已经退出就直接关闭 `stdout`。但这不像想得那么好,当你运行快速执行程序时,这个问题会变得明显,比如: - -``` -lxc exec -- ls -al /usr/lib -``` - -所有 `lxc exec` 进程(和相关的 `forkexec` 进程(现在不要担心)只要记住 `Go` + `setns()` 不是在发送...))在所有 `stdout` 中的_缓冲_数据被读取之前退出。这种情况下,将会导致截断输出,没有人想要这样。在尝试使用几个方法来后,禁用 pty 缓冲(我告诉你,这不太漂亮,也没有如预期工作。)和其他奇怪的想法,我设法通过几个 `poll()` “技巧”(tricks)(在某种意义上说一个技巧(“trick”))解决了这个问题。现在你终于可以运行后台任务,并且可以完全退出了。如图: - [![asciicast](https://asciinema.org/a/100043.png)][7] - -### 2\. 报告由信号引起的退出码 - -`ssh` 是一个很棒的工具。但有一件事,我一直以来不喜欢的是当 ssh 运行的命令接收到一个信号 `ssh` 时,总是会报告 `-1`,也就是退出码 `255`。当你想要了解导致程序终止的信号时,这很烦人。这就是为什么我最近实施标准 shell 中使用标准惯例 `128 + n`,其中 `n`被定义为导致执行程序退出的信号号码,来报告任何由信号导致的退出。例如,在 `SIGKILL` 信号上,你会看到 `128 + SIGKILL = 137`(计算其他致命信号的退出码作为读者的练习)。所以你可以这么做: - -``` -chb@conventiont|~ -> lxc exec zest1 sleep 100 -``` - - -现在,将 `SIGKILL` 发送到执行程序(不是 `lxc exec`本身,因为 `SIGKILL` 不可转发)。 - -``` -kill -KILL $(pidof sleep 100) -``` - -最后检查你程序的退出码: - -``` -chb@conventiont|~ -> echo $? -137 -``` - -瞧。这显然只有当 a) 退出码没有超过 `8`-位计算壁垒,b)当执行程序不使用 `137` 来表示成功(这将是...有趣的( ?))。这两个论点似乎对我来说都不太有说服力。前者因为最致命的信号不_应该_超过这个范围。后者因为(i)这是用户问题,(ii)这些退出代码实际上是保留的(我 _认为_。),(iii)你在本地或其他上面运行程序时会遇到同样的问题。 - -我看到的主要优点是这能够回报执行程序的细粒度的退出状态。注意,我们不会报告_所有_被一个这个信号杀死的程序的实例。当你的程序处理 `SIGTERM` 并且完全退出时,[LXD][8] 没有简单的方法来检测到这个并报告说这个程序被信号杀死了。你只会简单地收到退出码 `0`。 - -### 3\. 转发信号 - -这可能是最不有趣的(或者也许不是,不知道),但我发现它非常有用。正如你在 `SIGKILL` 案例中看到的那样,我明确地指出,必须将 `SIGKILL` 发送到执行程序,而不是 `lxc exec`命令本身。这是因为 `SIGKILL` 在程序中无法处理。程序可以做的唯一的事情就是像现在这样...像这个例子...(你知道了吧...)。但是程序可以处理很多其他信号 `SIGTERM`、`SIGHUP',当然也可以处理 `SIGUSR1` 和 `SIGUSR2`。因此,当你发送可以被 `lxc exec` 处理而不是被执行程序处理的信号时,较新版本的 [LXD][9] 会将信号转发到执行进程。这在脚本中非常方便。 - -无论如何,我希望你觉得这篇小小的 `lxc exec` 文章/胡言乱语有用。享受[LXD][10]吧,这是与一只疯狂的美丽的野兽玩耍。请试试在线实验:[https://linuxcontainers.org/lxd/try-it/][11],对于开发人员看看这里:[https://github.com/lxc/lxd][12] 并给我们补丁。 - -我们不要求签名任何 `CLA`,我们只要在核心风格中遵循取其中有 "Signed-off-by" 这行。 - --------------------------------------------------------------------------------- - -via: https://cbrauner.wordpress.com/2017/01/20/lxc-exec-vs-ssh/ - -作者:[brauner][a] -译者:[geekpi](https://github.com/geekpi) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://cbrauner.wordpress.com -[1]:https://github.com/lxc/lxd -[2]:https://github.com/lxc/lxd -[3]:https://github.com/lxc/lxd/blob/master/client.go -[4]:https://asciinema.org/a/100035?autoplay=1 -[5]:https://github.com/lxc/lxd -[6]:https://asciinema.org/a/100040?autoplay=1 -[7]:https://asciinema.org/a/100043?autoplay=1 -[8]:https://github.com/lxc/lxd -[9]:https://github.com/lxc/lxd -[10]:https://github.com/lxc/lxd -[11]:https://linuxcontainers.org/lxd/try-it/ -[12]:https://github.com/lxc/lxd From cdae917eb32bb81f05585edb1e6782e0480fc9ac Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 6 Aug 2017 11:28:40 +0800 Subject: [PATCH 0915/1407] PRF:20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @LHRchina 恭喜你完成了第一篇翻译贡献! --- ...ersial Open Container Industry Standard.md | 99 +++++++++---------- 1 file changed, 45 insertions(+), 54 deletions(-) diff --git a/translated/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md b/translated/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md index ed5a27cae7..4244b4c4ff 100644 --- a/translated/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md +++ b/translated/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md @@ -1,111 +1,102 @@ -CoreOs , OCI(Open Container Initiative) 标准揭开了容器工业标准论战 +CoreOS 和 OCI 揭开了容器工业标准的论战 ============================================================ + ![coreos-oci-open-container-industry-standard](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2017-core-os-1.jpg) -[**在并购交易中保护知识产权完整性**][12][][13]。Flexera 软件公司 提供卓越的技术尽职调查审计过程的实践和方案 -**[Download the White Paper][3]** +[CoreOS][4] 和 [开放容器联盟(OCI)][5] 周三(2017 年 7 月 19 日)发布的镜像和运行时标准主要参照了 Docker 的镜像格式技术。 -[CoreOS][4] 和 [OCI标准][5] 本周三发布的镜像和运行时标准主要参照了Docker的镜像格式技术 +然而,OCI 决定在 Docker 的事实标准平台上建立模型引发了一些问题。一些批评者提出其他方案。 -然而,OCI对docker的de facto 平台标准的模仿的决定引发了一些问题。一些批评者提出其他方案 +CoreOS 的 CTO 及 OCI 技术管理委员会主席 Brandon Philips 说, 1.0版本为应用容器提供了一个稳定标准。他说,拥有产业领导者所创造的标准,应能激发 OCI 合作伙伴进一步地发展标准和创新。Philips 补充道,OCI 完成 1.0 版本意味着 OCI 运行时规范和 OCI 镜像格式标准现在已经可以广泛使用。此外,这一成就将推动 OCI 社区稳固日益增长的可互操作的可插拔工具集市场。 -CoreOs的CTO及OCI技术管理委员会主席Brandon Philips说 1.0版本 为应用容器提供了一个稳定标准 +产业支持的标准将提供一种信心:容器已被广泛接受,并且 Kubernetes 用户将获得更进一步的支持。 -他说,产业领导者所创造的标准激发了OCI标准参与者创造出更深层的标准和创新。 +Philips 告诉 LinuxInsider,结果是相当不错的,认证流程已经开始。 +### 合作挑战 -Philips补充道,OCI完成1.0版本意味着 OCI运行时规范和OCI镜像格式标准现在已经可以广泛使用。 -此外,现在取得的成就将推动OCI社区稳固一个成长中的互操作可插拔工具集市场 +Philips 说,开放标准是容器生态系统取得成功的关键,构建标准的最好方式是与社区密切协作。然而,在 1.0 版本上达成共识所花费的时间超出了预期。 -产业支持的标准将提供一种信心:容器将被留存并且Kubernetes(Kubernetes是Google开源的Docker容器集群管理系统)用户将获得更进一步的支持 +“早期,最大的挑战在于如今解决项目的发布模式及如何实施该项目”,他追述道,”每个人都低估了项目所要花费的时间。“ -Philips告诉LinuxInsider:结果是相当不错的,证明过程已经开始. - -### 合作和挑战 - -开放标准是容器生态系统取得成功的关键 Philips说,最好的实现标准的方式是与社区协作。然而,在1.0版本上达成共识所花费的时间超出了预期。 - -"早期,最大的挑战在于处理项目的发布模式及如何实施该项目",他追述道,”每个人都低估了项目所要花费的时间。“ - -他说,合作者面对着和他们想做的不一致的预期,但是在过去的一年前后,小组达到了他们的期望并且经历了更多的实验 +他说,OCI 联盟成员对他们想做的事情抱有不相匹配的预期,但是在过去的一年中,该组织了解了期望程度,并且经历了更多的测试。 ### 追逐标准 -CoreOS 官方在几年前就开始讨论这个想法:行业支持的开源容器镜像和运行时规范标准,Phillips说,早期的探索使我们认识到:在标准镜像格式上达成一致是决定性的。 +CoreOS 官方在几年前就开始讨论行业支持的容器镜像和运行时规范的开放标准的想法,Phillips 说,早期的探索使我们认识到:在标准镜像格式上达成一致是至关重要的。 -CoreOS和容器技术创造者[Docker][6] 在2015年6月宣布OCI的开始。合作起始于 21个行业领导者制定开源容器计划(OCP)。它作为一个非营利组织,旨在建立云存储软件容器的最低通用标准 +CoreOS 和容器技术创造者 [Docker][6] 在 2015 年 6 月宣布 OCI 成立。合作起始于 21 个行业领导者制定开放容器计划(OCP)。它作为一个非营利组织,旨在建立云存储软件容器的最低通用标准。 -联盟包括容器业界的领导者:Docker、微软、红帽、IBM、谷歌和linux基金会 +联盟包括容器业界的领导者:Docker、微软、红帽、IBM、谷歌和 Linux 基金会。 -OCI标准的目的是让应用开发者相信:新的规范并开发新出工具时,部署在容器上的软件仍然能够持续运转。这种信心必须同时满足所有私有和开源软件 +OCI 的目的是让应用开发者相信:当新的规范出来并开发出新的工具时,部署在容器上的软件仍然能够持续运行。这种信心必须同时满足所有私有和开源软件。 -工具和应用是私有还是开源的并没有什么关系。当规范开始应用,产品会被设计成与任何容器配置相适应,Philips说。 +工具和应用是私有还是开源的并没有什么关系。当规范开始应用,产品可以被设计成与任何容器配置相适应,Philips 说。 -你需要有意识地超越编写代码的人能力之外创建标准。它是一个额外的功夫。他补充道 +“你需要有意识地超越编写代码的人能力之外创建标准。它是一个额外的付出。”他补充道。 -作为联盟的一部分,Docker向OCP(开源容器计划)贡献出它的de facto 镜像格式标准技术。 +作为联盟的一部分,Docker 向 OCP(开放容器计划)捐献出它的镜像格式的事实标准技术。它包括该公司的容器格式、运行时代码和规范。建立 OCI 镜像标准的工作起始于去年。 -它包括公司的容器格式、运行时代码和规范。建立开源容器首创镜像标准的工作起始于去年。 +标准的里程碑给予容器使用者开发、打包、签名应用容器的能力。他们也能够在各种容器引擎上运行容器,Philips 强调。 -标准的里程碑给予容器使用者开发、打包、签名应用容器的能力。他们也能够在各种容器引擎上运行容器,Philips强调 +### 唯一选择? -### 唯一的选择? +[Pund-IT][7] 的首席分析师 Charles King 表示:联盟面临着两种实现标准的方式。第一种选择是汇集相同意向的人员来避免分歧从零开始建立标准。 -[Pund-IT][7]的首席分析师Charles King表示:联盟面临着两种实现标准的方式。第一种选择是汇集相同意向的人员来避免分歧从零开始建立标准。 +但是联盟成员似乎满足于第二种方案:采用一种强大的市场领先的平台作为一个有效的标准。 -但是联盟成员似乎满足于第二种方案:采用一种强大的以市场为导向的平台作为一个有效的标准。 +“Docker 对 [Linux 基金会][8]的贡献使 OCI 坚定的选择了第二种方案。但是那些关注于 Docker 的做法和它的市场地位的人也许感觉应该有更好的选择。”King 对 LinuxInsider 说。 -Docker对[Linux Foundation][8](linux基金会)的贡献使OCI坚定的选择了第二种方案。但是那些关注于Docker的实现途径或者它的市场地位的人也许感觉应该有更好的选择。King对LinuxInsider讲述 +事实上,有个 OCI 成员 CoreOS 在开始的时候对该组织的总体方向进行了一些强烈的批评。他说,“所以看看 V1.0 版本是否处理或不处理那些关注点将是很有趣的事情。” -事实上,一个OCI成员--CoreOs --在开始的时候对该组织的总体方向进行了一些强烈的批评。拭目以待V1.0版本是否处理了那些关注点将是很有趣的事情 +### 更快之路 +Docker 已经被广泛部署的运行时实现是建立开放标准的合适基础。据 [Cloud Technology Partners][9] 的高级副总裁 David Linthicum 所说,Docker 已经是一个事实标准。 -### 更快的路径 +“我们能很快就让它们工作起来也是很重要的。但是一次次的标准会议、处理政治因素以及诸如此类的事情只是浪费时间” 。他告诉 LinuxInsider。 -Docker已经被广泛的部署运行时实现是建立开放标准的合适基础。据[Cloud Technology Partners][9] 的高级副总裁David Linthicum所说,Docker已经是一个de facto 标准 +但是现在没有更好的选择,他补充道。 -“我们能很快就能实现这些想法也是很重要的。但是前后的标准会议、处理政治因素等事情只是浪费时间” 。他对LinuxInsider采访者说 +据 RedHat 公司的 Linux 容器技术高级布道者 Joe Brockmeier 所说,Docker 的运行时是 runC 。它是 OCI 运行时标准的一种实现。 -但是现在没有更好的选择,他告诉LinuxInsider采访者 +“因此,runC 是一个合适的运行时标准的基础。它被广泛的接受并成为了大多数容器技术实现的基础。他说。 -据RedHat公司的linux容器技术高级布道者Joe Brockmeier所说,Docker的运行时是 runC 。 它是OCI运行时标准的一种实现。 - -因此,runC 是一个合适的运行时标准的基础。它被广泛的接受并成为了大多数容器技术实现的基础。他告诉LinuxInsider - -OCI是比Docker更进一步的标准。尽管Docker确实提交了遵循OCI规范的底层代码,然而这一谱系就此停止,并且没真正的可行替代方案存在。 +OCI 是比 Docker 更进一步的标准。尽管 Docker 确实提交了遵循 OCI 规范的底层代码,然而这一系列代码就此停止,并且没真正的可行替代方案存在。 ### 对接问题 -Pund-IT的领导建议:采用一种广泛使用的产业标准将简化和加速许多公司对容器技术的采纳和管理。也有可能一些关键的供应商将继续关注他们自己的专有容器技术 +Pund-IT 的 King 建议:采用一种广泛使用的产业标准将简化和加速许多公司对容器技术的采纳和管理。也有可能一些关键的供应商将继续关注他们自己的专有容器技术。 -他们辩称他们的做法是一个更好的方式但这将有效的阻止OCI取得市场的主导地位。从一个大体上实现的标准开始,就像OCI所做的那样,也许并不能完美的使所有人满意。但是这也许能比其他方案更加快速有效的实现目标 +“他们辩称他们的做法是一个更好的方式,但这将有效的阻止 OCI 取得市场的主导地位。”他说,“从一个大体上实现的标准开始,就像 OCI 所做的那样,也许并不能完美的使所有人满意,但是这也许能比其他方案更加快速有效的实现目标。” -容器已经标准化的部署到了云上,Docker显然是领先的。[Semaphore][10]联合创始人Marko Anastasov说。Docker的de facto标准容器代表了开发开放标准的的最佳基础。Docker的商业利益将如何影响其参与OCI的规模还有待观察 +容器已经标准化的部署到了云上,Docker 显然是领先的。[Semaphore][10] 联合创始人 Marko Anastasov 说。 -### 反对的观点 +他说,Docker 事实标准的容器代表了开发开放标准的的最佳基础。Docker 的商业利益将如何影响其参与 OCI 的规模还有待观察。 -开放标准并不是在云部署中采用更多的容器的最终目标。[ThoughtWorks][11]的首席顾问Nic Cheneweth 主张。更好的的方法是查看IT行业的服务器虚拟化部分的影响 +### 反对观点 -Cheneweth对LinuxInsider说:“持续增长和广泛采用的主要动力不是在行业标准的声明中,而是在使用任何竞争技术的潜在和实现的效率方面,比如VMware、Xen等。” +开放标准并不是在云部署中采用更多的容器的最终目标。[ThoughtWorks][11] 的首席顾问 Nic Cheneweth 表示。更好的的方法是查看 IT 行业的服务器虚拟化部分的影响。 -容器技术的某些方面,例如容器本身,可以根据标准来定义。他说,在此之前,由深度开源软件参与引导的健康竞争将有助于成为一个更好的标准。 +Cheneweth 对 LinuxInsider 说:“持续增长和广泛采用的主要动力不是在行业标准的声明中,而是通过使用任何竞争技术所获得的潜在的和实现的效率,比如 VMware、Xen 等。” -据Cheneweth说,关于容器的编制标准对空间的持续增长并不特别重要。 +容器技术的某些方面,例如容器本身,可以根据标准来定义。他说,在此之前,深入开源软件参与引导的健康竞争将有助于成为一个更好的标准。 -不过,他表示,如果行业坚持锁定de facto容器标准,那么OCI所选择的模型是一个很好的起点。“我不知道是否有更好的选择,但更糟糕的选择是存在的。” +据 Cheneweth 说,容器编排标准对该领域的持续增长并不特别重要。 + +不过,他表示,如果行业坚持锁定容器事实标准,那么 OCI 所选择的模型是一个很好的起点。“我不知道是否有更好的选择,但肯定这不是最糟糕的选择。” 作者简介: -自2003年以来,Jack M.Germain一直是一个新闻网络记者。他主要关注的领域是企业IT、Linux和开源技术。他已经写了很多关于Linux发行版和其他开源软件的评论。 +自 2003 年以来,Jack M.Germain一直是一个新闻网络记者。他主要关注的领域是企业 IT、Linux 和开源技术。他已经写了很多关于 Linux 发行版和其他开源软件的评论。 ---- via: http://www.linuxinsider.com/story/84689.html -作者:[Jack M. Germain ][a] +作者:[Jack M. Germain][a] 译者:[LHRchina](https://github.com/LHRchina) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 5c61d34681429dd417a2a5bf2a9f20c31be66d1f Mon Sep 17 00:00:00 2001 From: wxy Date: Sun, 6 Aug 2017 11:29:16 +0800 Subject: [PATCH 0916/1407] PUB:20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @LHRchina 发布后地址:https://linux.cn/article-8756-1.html ,你的个人 LCTT 页面:https://linux.cn/lctt/LHRchina --- ...S OCI Unveil Controversial Open Container Industry Standard.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md (100%) diff --git a/translated/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md b/published/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md similarity index 100% rename from translated/tech/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md rename to published/20170720 CoreOS OCI Unveil Controversial Open Container Industry Standard.md From e283f2ec2a0fd851187bf629d655cdbacf1b7e62 Mon Sep 17 00:00:00 2001 From: rieonke Date: Sun, 6 Aug 2017 22:28:45 +0800 Subject: [PATCH 0917/1407] translated --- ...Kubernetes cluster for Linux containers.md | 86 +++++++++---------- 1 file changed, 42 insertions(+), 44 deletions(-) rename {sources => translated}/tech/20170801 Deploy Kubernetes cluster for Linux containers.md (52%) diff --git a/sources/tech/20170801 Deploy Kubernetes cluster for Linux containers.md b/translated/tech/20170801 Deploy Kubernetes cluster for Linux containers.md similarity index 52% rename from sources/tech/20170801 Deploy Kubernetes cluster for Linux containers.md rename to translated/tech/20170801 Deploy Kubernetes cluster for Linux containers.md index 58e87796c7..756b5442a9 100644 --- a/sources/tech/20170801 Deploy Kubernetes cluster for Linux containers.md +++ b/translated/tech/20170801 Deploy Kubernetes cluster for Linux containers.md @@ -1,33 +1,31 @@ -> translating by rieon - Deploy Kubernetes cluster for Linux containers +部署Kubernetes 容器集群 ============================================================ -In this quick start, a Kubernetes cluster is deployed using the Azure CLI. A multi-container application consisting of web front-end and a Redis instance is then deployed and run on the cluster. Once completed, the application is accessible over the internet. +在这个快速入门教程中,我们使用 Azure CLI 创建 Kubernetes 集群。 然后在集群上部署并运行由 Web 前端和 Redis 实例组成的多容器应用程序。 一旦部署完成,应用程序可以通过互联网访问。 +![示例应用截图](https://docs.microsoft.com/en-us/azure/container-service/kubernetes/media/container-service-kubernetes-walkthrough/azure-vote.png) -![Image of browsing to Azure Vote](https://docs.microsoft.com/en-us/azure/container-service/kubernetes/media/container-service-kubernetes-walkthrough/azure-vote.png) +这个快速入门教程假设你已经基本了解了Kubernetes 的概念,有关 Kubernetes 的详细信息,请参阅[ Kubernetes 文档] [3]。 -This quick start assumes a basic understanding of Kubernetes concepts, for detailed information on Kubernetes see the [Kubernetes documentation][3]. +如果您没有 Azure 账号订阅,请在开始之前创建一个[免费帐户] [4]。 -If you don't have an Azure subscription, create a [free account][4] before you begin. +### 登陆Azure 云控制台 -### Launch Azure Cloud Shell - -The Azure Cloud Shell is a free Bash shell that you can run directly within the Azure portal. It has the Azure CLI preinstalled and configured to use with your account. Click the Cloud Shell button on the menu in the upper-right of the [Azure portal][5]. +Azure 云控制台是一个免费的 Bash shell ,你可以直接在 Azure 网站上运行。 它已经在你的账户中预先配置好了, 单击[ Azure 门户] [5]右上角菜单上的 “Cloud Shell” 按钮; [![Cloud Shell](https://docs.microsoft.com/en-us/azure/includes/media/cloud-shell-try-it/cloud-shell-menu.png)][6] -The button launches an interactive shell that you can use to run all of the steps in this topic: + 该按钮启动一个交互式 shell,您可以使用它来运行本教程中的所有操作步骤。 - [![Screenshot showing the Cloud Shell window in the portal](https://docs.microsoft.com/en-us/azure/includes/media/cloud-shell-try-it/cloud-shell-safari.png)][7] + [![ Cloud Shell 截图](https://docs.microsoft.com/en-us/azure/includes/media/cloud-shell-try-it/cloud-shell-safari.png)][7] -If you choose to install and use the CLI locally, this quickstart requires that you are running the Azure CLI version 2.0.4 or later. Run `az --version` to find the version. If you need to install or upgrade, see [Install Azure CLI 2.0][8]. +此快速入门教程所用的 Azure CLI 的版本最低要求为 2.0.4 。如果您选择在本地安装和使用 CLI 工具,请运行`az --version' 来检查已安装的版本。 如果您需要安装或升级请参阅[安装 Azure CLI 2.0 ] [8]。 -### Create a resource group +### 创建一个资源组 -Create a resource group with the [az group create][9] command. An Azure resource group is a logical group in which Azure resources are deployed and managed. +使用 [az group create] 命令[9]创建一个资源组,一个 Azure 资源组是 Azure 资源部署和管理的逻辑组。 -The following example creates a resource group named  _myResourceGroup_  in the  _eastus_  location. +以下示例在 _eastus_ 位置中创建名为 _myResourceGroup_ 的资源组。 Azure CLICopyTry It @@ -36,7 +34,7 @@ az group create --name myResourceGroup --location eastus ``` -Output: +输出: JSONCopy @@ -54,9 +52,9 @@ JSONCopy ``` -### Create Kubernetes cluster +### 创建一个 Kubernetes 集群 -Create a Kubernetes cluster in Azure Container Service with the [az acs create][10]command. The following example creates a cluster named  _myK8sCluster_  with one Linux master node and three Linux agent nodes. +使用 [az acs create] [10]命令在 Azure 容器服务中创建 Kubernetes 集群。 以下示例使用一个 Linux 主节点和三个 Linux 代理节点创建一个名为 _myK8sCluster_ 的集群。 Azure CLICopyTry It @@ -64,16 +62,15 @@ Azure CLICopyTry It az acs create --orchestrator-type=kubernetes --resource-group myResourceGroup --name=myK8sCluster --generate-ssh-keys ``` +几分钟后,命令将完成并返回有关该集群的json格式的信息。 -After several minutes, the command completes and returns json formatted information about the cluster. +### 连接到 Kubernetes 集群 -### Connect to the cluster +要管理 Kubernetes 群集,可以使用 Kubernetes 命令行工具 [kubectl] [11]。 -To manage a Kubernetes cluster, use [kubectl][11], the Kubernetes command-line client. +如果您使用 Azure CloudShell ,则已经安装了 kubectl 。 如果要在本地安装,可以使用[az acs kubernetes install-cli] [12]命令。 -If you're using Azure CloudShell, kubectl is already installed. If you want to install it locally, you can use the [az acs kubernetes install-cli][12] command. - -To configure kubectl to connect to your Kubernetes cluster, run the [az acs kubernetes get-credentials][13] command. This steps downloads credentials and configures the Kubernetes CLI to use them. +要配置 kubectl 连接到您的 Kubernetes 群集,请运行 [az acs kubernetes get-credentials] [13] 命令下载凭据并配置 Kubernetes CLI 以使用它们。 Azure CLICopyTry It @@ -82,7 +79,7 @@ az acs kubernetes get-credentials --resource-group=myResourceGroup --name=myK8sC ``` -To verify the connection to your cluster, use the [kubectl get][14] command to return a list of the cluster nodes. +要验证与集群的连接,请使用 [kubectl get] [14] 命令查看集群节点的列表。 Azure CLICopyTry It @@ -91,7 +88,7 @@ kubectl get nodes ``` -Output: +输出: bashCopy @@ -104,11 +101,11 @@ k8s-master-14ad53a1-0 Ready,SchedulingDisabled 10m v1.6.6 ``` -### Run the application +### 运行应用程序 -A Kubernetes manifest file defines a desired state for the cluster, including things like what container images should be running. For this example, a manifest is used to create all object needed to run the Azure Vote application. +Kubernetes 清单文件为集群定义了一个所需的状态,包括了集群中应该运行什么样的容器镜像。 对于此示例,清单用于创建运行 Azure Vote 应用程序所需的所有对象。 -Create a file named `azure-vote.yaml` and copy into it the following YAML. +创建一个名为 `azure-vote.yaml` ,将下面的内容拷贝到 YAML 中。 yamlCopy @@ -174,7 +171,7 @@ spec: ``` -Use the [kubectl create][15] command to run the application. +使用 [kubectl create][15] 命令来运行该应用程序。 Azure CLICopyTry It @@ -183,7 +180,7 @@ kubectl create -f azure-vote.yaml ``` -Output: +输出: bashCopy @@ -195,11 +192,11 @@ service "azure-vote-front" created ``` -### Test the application +### 测试应用程序 -As the application is run, a [Kubernetes service][16] is created that exposes the application front-end to the internet. This process can take a few minutes to complete. +当应用程序的跑起来之后,需要创建一个[ Kubernetes 服务] [16],将应用程序前端暴露在互联网上。 此过程可能需要几分钟才能完成。 -To monitor progress, use the [kubectl get service][17] command with the `--watch`argument. +要监控这个进程,使用 [kubectl get service][17] 命令时加上 `--watch` 参数。 Azure CLICopyTry It @@ -209,6 +206,7 @@ kubectl get service azure-vote-front --watch ``` Initially the EXTERNAL-IP for the  _azure-vote-front_  service appears as  _pending_ . Once the EXTERNAL-IP address has changed from  _pending_  to an  _IP address_ , use `CTRL-C` to stop the kubectl watch process. +最初,_azure-vote-front_ 服务的 EXTERNAL-IP 显示为 _pending_ 。 一旦 EXTERNAL-IP 地址从 _pending_ 变成一个具体的IP地址,请使用 “CTRL-C” 来停止 kubectl 监视进程。 bashCopy @@ -219,12 +217,13 @@ azure-vote-front 10.0.34.242 52.179.23.131 80:30676/TCP 2m ``` You can now browse to the external IP address to see the Azure Vote App. +现在你可以通过这个外网 IP 地址访问到 Azure Vote 这个应用了。 -![Image of browsing to Azure Vote](https://docs.microsoft.com/en-us/azure/container-service/kubernetes/media/container-service-kubernetes-walkthrough/azure-vote.png) +![浏览 Azure Vote 应用截图 ](https://docs.microsoft.com/en-us/azure/container-service/kubernetes/media/container-service-kubernetes-walkthrough/azure-vote.png) -### Delete cluster +### 删除集群 -When the cluster is no longer needed, you can use the [az group delete][18]command to remove the resource group, container service, and all related resources. +当不再需要集群时,可以使用 [az group delete] [18]命令删除资源组,容器服务和所有相关资源。 Azure CLICopyTry It @@ -233,24 +232,23 @@ az group delete --name myResourceGroup --yes --no-wait ``` -### Get the code +### 获取示例代码 -In this quick start, pre-created container images have been used to create a Kubernetes deployment. The related application code, Dockerfile, and Kubernetes manifest file are available on GitHub.+ +在这个快速入门教程中,预先创建的容器镜像已被用于部署 Kubernetes 。相关应用程序代码 Dockerfile 和 Kubernetes 清单文件可在 GitHub 中获得。Github 仓库地址是 [https://github.com/Azure-Samples/azure-voting-app-redis][19] -[https://github.com/Azure-Samples/azure-voting-app-redis][19] -### Next steps +### 下一步 -In this quick start, you deployed a Kubernetes cluster and deployed a multi-container application to it. +在这个快速入门教程中,您部署了一个 Kubernetes 集群,并部署了一个多容器应用程序。 -To learn more about Azure Container Service, and walk through a complete code to deployment example, continue to the Kubernetes cluster tutorial. +要了解有关 Azure 容器服务的更多信息,走完一个完整的从代码到部署的全流程,请继续阅读 Kubernetes 集群教程。 -------------------------------------------------------------------------------- via: https://docs.microsoft.com/en-us/azure/container-service/kubernetes/container-service-kubernetes-walkthrough 作者:[neilpeterson ][a],[mmacy][b] -译者:[译者ID](https://github.com/译者ID) +译者:[rieonke](https://github.com/rieonke) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 37918dbff780a30c7acbca6180a79b0780b851f4 Mon Sep 17 00:00:00 2001 From: Rieon Date: Sun, 6 Aug 2017 22:34:47 +0800 Subject: [PATCH 0918/1407] fix some styling error --- ...Kubernetes cluster for Linux containers.md | 37 ++++++------------- 1 file changed, 12 insertions(+), 25 deletions(-) diff --git a/translated/tech/20170801 Deploy Kubernetes cluster for Linux containers.md b/translated/tech/20170801 Deploy Kubernetes cluster for Linux containers.md index 756b5442a9..827449b302 100644 --- a/translated/tech/20170801 Deploy Kubernetes cluster for Linux containers.md +++ b/translated/tech/20170801 Deploy Kubernetes cluster for Linux containers.md @@ -5,13 +5,13 @@ Deploy Kubernetes cluster for Linux containers 在这个快速入门教程中,我们使用 Azure CLI 创建 Kubernetes 集群。 然后在集群上部署并运行由 Web 前端和 Redis 实例组成的多容器应用程序。 一旦部署完成,应用程序可以通过互联网访问。 ![示例应用截图](https://docs.microsoft.com/en-us/azure/container-service/kubernetes/media/container-service-kubernetes-walkthrough/azure-vote.png) -这个快速入门教程假设你已经基本了解了Kubernetes 的概念,有关 Kubernetes 的详细信息,请参阅[ Kubernetes 文档] [3]。 +这个快速入门教程假设你已经基本了解了Kubernetes 的概念,有关 Kubernetes 的详细信息,请参阅[ Kubernetes 文档][3]。 -如果您没有 Azure 账号订阅,请在开始之前创建一个[免费帐户] [4]。 +如果您没有 Azure 账号订阅,请在开始之前创建一个[免费帐户][4]。 ### 登陆Azure 云控制台 -Azure 云控制台是一个免费的 Bash shell ,你可以直接在 Azure 网站上运行。 它已经在你的账户中预先配置好了, 单击[ Azure 门户] [5]右上角菜单上的 “Cloud Shell” 按钮; +Azure 云控制台是一个免费的 Bash shell ,你可以直接在 Azure 网站上运行。 它已经在你的账户中预先配置好了, 单击[ Azure 门户][5]右上角菜单上的 “Cloud Shell” 按钮; [![Cloud Shell](https://docs.microsoft.com/en-us/azure/includes/media/cloud-shell-try-it/cloud-shell-menu.png)][6] @@ -19,16 +19,14 @@ Azure 云控制台是一个免费的 Bash shell ,你可以直接在 Azure 网 [![ Cloud Shell 截图](https://docs.microsoft.com/en-us/azure/includes/media/cloud-shell-try-it/cloud-shell-safari.png)][7] -此快速入门教程所用的 Azure CLI 的版本最低要求为 2.0.4 。如果您选择在本地安装和使用 CLI 工具,请运行`az --version' 来检查已安装的版本。 如果您需要安装或升级请参阅[安装 Azure CLI 2.0 ] [8]。 +此快速入门教程所用的 Azure CLI 的版本最低要求为 2.0.4 。如果您选择在本地安装和使用 CLI 工具,请运行 `az --version` 来检查已安装的版本。 如果您需要安装或升级请参阅[安装 Azure CLI 2.0 ][8]。 ### 创建一个资源组 -使用 [az group create] 命令[9]创建一个资源组,一个 Azure 资源组是 Azure 资源部署和管理的逻辑组。 +使用 [az group create][9] 命令创建一个资源组,一个 Azure 资源组是 Azure 资源部署和管理的逻辑组。 以下示例在 _eastus_ 位置中创建名为 _myResourceGroup_ 的资源组。 -Azure CLICopyTry It - ``` az group create --name myResourceGroup --location eastus @@ -36,7 +34,6 @@ az group create --name myResourceGroup --location eastus 输出: -JSONCopy ``` { @@ -54,7 +51,7 @@ JSONCopy ### 创建一个 Kubernetes 集群 -使用 [az acs create] [10]命令在 Azure 容器服务中创建 Kubernetes 集群。 以下示例使用一个 Linux 主节点和三个 Linux 代理节点创建一个名为 _myK8sCluster_ 的集群。 +使用 [az acs create][10] 命令在 Azure 容器服务中创建 Kubernetes 集群。 以下示例使用一个 Linux 主节点和三个 Linux 代理节点创建一个名为 _myK8sCluster_ 的集群。 Azure CLICopyTry It @@ -66,22 +63,20 @@ az acs create --orchestrator-type=kubernetes --resource-group myResourceGroup -- ### 连接到 Kubernetes 集群 -要管理 Kubernetes 群集,可以使用 Kubernetes 命令行工具 [kubectl] [11]。 +要管理 Kubernetes 群集,可以使用 Kubernetes 命令行工具 [kubectl][11]。 -如果您使用 Azure CloudShell ,则已经安装了 kubectl 。 如果要在本地安装,可以使用[az acs kubernetes install-cli] [12]命令。 +如果您使用 Azure CloudShell ,则已经安装了 kubectl 。 如果要在本地安装,可以使用 [az acs kubernetes install-cli][12] 命令。 -要配置 kubectl 连接到您的 Kubernetes 群集,请运行 [az acs kubernetes get-credentials] [13] 命令下载凭据并配置 Kubernetes CLI 以使用它们。 +要配置 kubectl 连接到您的 Kubernetes 群集,请运行 [az acs kubernetes get-credentials][13] 命令下载凭据并配置 Kubernetes CLI 以使用它们。 -Azure CLICopyTry It ``` az acs kubernetes get-credentials --resource-group=myResourceGroup --name=myK8sCluster ``` -要验证与集群的连接,请使用 [kubectl get] [14] 命令查看集群节点的列表。 +要验证与集群的连接,请使用 [kubectl get][14] 命令查看集群节点的列表。 -Azure CLICopyTry It ``` kubectl get nodes @@ -90,7 +85,6 @@ kubectl get nodes 输出: -bashCopy ``` NAME STATUS AGE VERSION @@ -107,7 +101,6 @@ Kubernetes 清单文件为集群定义了一个所需的状态,包括了集群 创建一个名为 `azure-vote.yaml` ,将下面的内容拷贝到 YAML 中。 -yamlCopy ``` apiVersion: apps/v1beta1 @@ -173,8 +166,6 @@ spec: 使用 [kubectl create][15] 命令来运行该应用程序。 -Azure CLICopyTry It - ``` kubectl create -f azure-vote.yaml @@ -182,7 +173,6 @@ kubectl create -f azure-vote.yaml 输出: -bashCopy ``` deployment "azure-vote-back" created @@ -194,7 +184,7 @@ service "azure-vote-front" created ### 测试应用程序 -当应用程序的跑起来之后,需要创建一个[ Kubernetes 服务] [16],将应用程序前端暴露在互联网上。 此过程可能需要几分钟才能完成。 +当应用程序的跑起来之后,需要创建一个 [Kubernetes 服务][16],将应用程序前端暴露在互联网上。 此过程可能需要几分钟才能完成。 要监控这个进程,使用 [kubectl get service][17] 命令时加上 `--watch` 参数。 @@ -208,8 +198,6 @@ kubectl get service azure-vote-front --watch Initially the EXTERNAL-IP for the  _azure-vote-front_  service appears as  _pending_ . Once the EXTERNAL-IP address has changed from  _pending_  to an  _IP address_ , use `CTRL-C` to stop the kubectl watch process. 最初,_azure-vote-front_ 服务的 EXTERNAL-IP 显示为 _pending_ 。 一旦 EXTERNAL-IP 地址从 _pending_ 变成一个具体的IP地址,请使用 “CTRL-C” 来停止 kubectl 监视进程。 -bashCopy - ``` azure-vote-front 10.0.34.242 80:30676/TCP 7s azure-vote-front 10.0.34.242 52.179.23.131 80:30676/TCP 2m @@ -223,9 +211,8 @@ You can now browse to the external IP address to see the Azure Vote App. ### 删除集群 -当不再需要集群时,可以使用 [az group delete] [18]命令删除资源组,容器服务和所有相关资源。 +当不再需要集群时,可以使用 [az group delete][18] 命令删除资源组,容器服务和所有相关资源。 -Azure CLICopyTry It ``` az group delete --name myResourceGroup --yes --no-wait From 829ac11331b43903aecf057fdd8c2de785877552 Mon Sep 17 00:00:00 2001 From: XYenChi <466530436@qq.com> Date: Sun, 6 Aug 2017 22:45:42 +0800 Subject: [PATCH 0919/1407] XYenChi translating --- ...nners guide to collecting and mapping Twitter data using R.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170620 A beginners guide to collecting and mapping Twitter data using R.md b/sources/tech/20170620 A beginners guide to collecting and mapping Twitter data using R.md index ec00ced6f3..06d298180b 100644 --- a/sources/tech/20170620 A beginners guide to collecting and mapping Twitter data using R.md +++ b/sources/tech/20170620 A beginners guide to collecting and mapping Twitter data using R.md @@ -1,3 +1,4 @@ +XYenChi is translating A beginner's guide to collecting and mapping Twitter data using R ============================================================ From 38c07781e2e15c70a362924335212f9864e817c9 Mon Sep 17 00:00:00 2001 From: WangYue <815420852@qq.com> Date: Mon, 7 Aug 2017 01:04:55 +0800 Subject: [PATCH 0920/1407] =?UTF-8?q?=E7=94=B3=E8=AF=B7=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=2020160616=20The=20Children=20s=20Illustrated=20Guide=20to=20K?= =?UTF-8?q?ubernetes.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 申请翻译 20160616 The Children s Illustrated Guide to Kubernetes.md --- .../20160616 The Children s Illustrated Guide to Kubernetes.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/sources/tech/20160616 The Children s Illustrated Guide to Kubernetes.md b/sources/tech/20160616 The Children s Illustrated Guide to Kubernetes.md index f398ef2e57..27d520735b 100644 --- a/sources/tech/20160616 The Children s Illustrated Guide to Kubernetes.md +++ b/sources/tech/20160616 The Children s Illustrated Guide to Kubernetes.md @@ -1,3 +1,6 @@ +申请翻译 by WangYueScream +========================= + The Children's Illustrated Guide to Kubernetes ============================================================ From d920e9d1838026728e470da986c601d56dae5421 Mon Sep 17 00:00:00 2001 From: WangYue <815420852@qq.com> Date: Mon, 7 Aug 2017 01:06:06 +0800 Subject: [PATCH 0921/1407] =?UTF-8?q?=E7=94=B3=E8=AF=B7=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=20=20=2020170421=20A=20Window=20Into=20the=20Linux=20Desktop.m?= =?UTF-8?q?d?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 申请翻译 20170421 A Window Into the Linux Desktop.md --- sources/talk/20170421 A Window Into the Linux Desktop.md | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/sources/talk/20170421 A Window Into the Linux Desktop.md b/sources/talk/20170421 A Window Into the Linux Desktop.md index 917d718aa5..b548b6ef80 100644 --- a/sources/talk/20170421 A Window Into the Linux Desktop.md +++ b/sources/talk/20170421 A Window Into the Linux Desktop.md @@ -1,3 +1,7 @@ +申请翻译    by  WangYueScream +================================== + + A Window Into the Linux Desktop ============================================================ From d344eff4d93358836c8f774a350704f162e1cefd Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 7 Aug 2017 08:44:19 +0800 Subject: [PATCH 0922/1407] translated --- ...12 How To Setup Apache Hadoop On CentOS.md | 82 +++++++++---------- 1 file changed, 40 insertions(+), 42 deletions(-) rename {sources => translated}/tech/20170712 How To Setup Apache Hadoop On CentOS.md (57%) diff --git a/sources/tech/20170712 How To Setup Apache Hadoop On CentOS.md b/translated/tech/20170712 How To Setup Apache Hadoop On CentOS.md similarity index 57% rename from sources/tech/20170712 How To Setup Apache Hadoop On CentOS.md rename to translated/tech/20170712 How To Setup Apache Hadoop On CentOS.md index 0345c5b29f..1e008a5d6c 100644 --- a/sources/tech/20170712 How To Setup Apache Hadoop On CentOS.md +++ b/translated/tech/20170712 How To Setup Apache Hadoop On CentOS.md @@ -1,27 +1,25 @@ -translating-----geekpi - -How To Setup Apache Hadoop On CentOS +如何在 CentOS 上安装 Apache Hadoop ============================================================ [![](https://www.unixmen.com/wp-content/uploads/2015/06/hadoop1-696x249.png "hadoop1")][2] -The **Apache Hadoop** software library is a framework that allows for the distributed processing of large data sets across clusters of computers using simple programming models The Apache™ Hadoop® project develops open-source software for reliable, scalable, distributed computing. +**Apache Hadoop** 软件库是一个框架,它允许使用简单的编程模型在计算机集群上对大型数据集进行分布式处理。Apache™ Hadoop® 是可靠、可扩展、分布式计算的开源软件。 -The project includes these modules: +该项目包括以下模块: -* **Hadoop Common**: The common utilities that support the other Hadoop modules. +* **Hadoop Common**:支持其他 Hadoop 模块的常用工具 -* **Hadoop Distributed File System (HDFS™)**: A distributed file system that provides high-throughput access to application data. +* **Hadoop 分布式文件系统 (HDFS™)**:分布式文件系统,可提供对应用程序数据的高吞吐量访问 -* **Hadoop YARN**: A framework for job scheduling and cluster resource management. +* **Hadoop YARN**:作业调度和集群资源管理框架。 -* **Hadoop MapReduce**: A YARN-based system for parallel processing of large data sets. +* **Hadoop MapReduce**:一个基于 YARN 的大型数据集并行处理系统。 -This article will help you for step by step install and configure single node hadoop cluster using Hadoop on centos. +本文将帮助你逐步在 CentOS 上安装 hadoop 并配置单节点 hadoop 集群。 -### Install Java +### 安装 Java -Before installing hadoop make sure you have java installed on your system. Use this command to check the version of the installed Java. +在安装 hadoop 之前,请确保你的系统上安装了 Java。使用此命令检查已安装 Java 的版本。 ``` java -version @@ -30,9 +28,9 @@ Java(TM) SE Runtime Environment (build 1.7.0_75-b13) Java HotSpot(TM) 64-Bit Server VM (build 24.75-b04, mixed mode) ``` -To install or update Java use following step by step instructions. +要安装或更新 Java,请参考下面逐步的说明。 -First step is to download latest version of java from the [Oracle official website][3]. +第一步是从[ Oracle 官方网站][3]下载最新版本的 java。 ``` cd /opt/ @@ -40,7 +38,7 @@ wget --no-cookies --no-check-certificate --header "Cookie: gpw_e24=http%3A%2F%2F tar xzf jdk-7u79-linux-x64.tar.gz ``` -Need to set up to use newer version of Java using alternatives. Use the following commands to do it. +需要设置使用更新版本的 Java 作为替代。使用以下命令来执行此操作。 ``` cd /opt/jdk1.7.0_79/ @@ -60,7 +58,7 @@ There are 3 programs which provide 'java'. Enter to keep the current selection[+], or type selection number: 3 [Press Enter] ``` -Now you may also required to set up javac and jar commands path using alternatives command. +现在你可能还需要使用alternatives 命令设置 javac 和 jar 命令路径。 ``` alternatives --install /usr/bin/jar jar /opt/jdk1.7.0_79/bin/jar 2 @@ -69,38 +67,38 @@ alternatives --set jar /opt/jdk1.7.0_79/bin/jar alternatives --set javac /opt/jdk1.7.0_79/bin/javac ``` -The next step is to configure environment variables. Use following commands to set up these variable properly +下一步是配置环境变量。使用以下命令正确设置这些变量。 -* Setup **JAVA_HOME** Variable +* 设置 **JAVA_HOME** 变量 ``` export JAVA_HOME=/opt/jdk1.7.0_79 ``` -* Setup **JRE_HOME** Variable +* 设置 **JRE_HOME** 变量 ``` export JRE_HOME=/opt/jdk1.7.0_79/jre ``` -* Setup **PATH** Variable +* 设置 **PATH** 变量 ``` export PATH=$PATH:/opt/jdk1.7.0_79/bin:/opt/jdk1.7.0_79/jre/bin ``` -### Installing **Apache Hadoop** +### 安装 **Apache Hadoop** -After setting up the java environment. Let stat installing **Apache Hadoop.** +设置好 java 环境后。开始安装 **Apache Hadoop**。 -The first step is to create a system user account to use for hadoop installation. +第一步是创建用于 hadoop 安装的系统用户帐户。 ``` useradd hadoop passwd hadoop ``` -Now you need to configure the ssh keys for the user hadoop. Using following command to enable ssh login without password. +现在你需要配置用户 hadoop 的 ssh 密钥。使用以下命令启用无需密码的 ssh 登录。 ``` su - hadoop @@ -110,7 +108,7 @@ chmod 0600 ~/.ssh/authorized_keys exit ``` -Now download hadoop latest available version from its official site [hadoop.apache.org][4]. +现在从官方网站 [hadoop.apache.org][4] 下载 hadoop 最新的可用版本。 ``` cd ~ @@ -119,9 +117,9 @@ tar xzf hadoop-2.6.0.tar.gz mv hadoop-2.6.0 hadoop ``` -Now the next step is to set environment variable uses by hadoop. +下一步是设置 hadoop 使用的环境变量。 -Edit **~/.bashrc** file and add the following listes of  values at end of file. +编辑 **~/.bashrc**,并在文件末尾添加以下这些值。 ``` export HADOOP_HOME=/home/hadoop/hadoop @@ -134,27 +132,27 @@ export HADOOP_COMMON_LIB_NATIVE_DIR=$HADOOP_HOME/lib/native export PATH=$PATH:$HADOOP_HOME/sbin:$HADOOP_HOME/bin ``` -Then apply the changes in current running environment +在当前运行环境中应用更改。 ``` source ~/.bashrc ``` -edit **$HADOOP_HOME/etc/hadoop/hadoop-env.sh** file and set **JAVA_HOME**environment variable +编辑 **$HADOOP_HOME/etc/hadoop/hadoop-env.sh** 并设置 **JAVA_HOME** 环境变量。 ``` export JAVA_HOME=/opt/jdk1.7.0_79/ ``` -Now you start with the configuration with basic hadoop single node cluster setup. +现在,先从配置基本的 hadoop 单节点集群开始。 -First edit hadoop configuration files and make following changes. +首先编辑 hadoop 配置文件并进行以下更改。 ``` cd /home/hadoop/hadoop/etc/hadoop ``` -Let’s start by editing core-site.xml +让我们编辑 core-site.xml。 ``` @@ -165,7 +163,7 @@ Let’s start by editing core-site.xml ``` -Then Edit hdfs-site.xml: +接着编辑 hdfs-site.xml: ``` @@ -186,7 +184,7 @@ Then Edit hdfs-site.xml: ``` -and edit mapred-site.xml: +并编辑 mapred-site.xml: ``` @@ -197,7 +195,7 @@ and edit mapred-site.xml: ``` -finally edit yarn-site.xml: +最后编辑 yarn-site.xml: ``` @@ -208,13 +206,13 @@ finally edit yarn-site.xml: ``` -Now format the namenode using following command: +现在使用以下命令格式化 namenode: ``` hdfs namenode -format ``` -To start all hadoop services use the following command: +要启动所有 hadoop 服务,请使用以下命令: ``` cd /home/hadoop/hadoop/sbin/ @@ -222,13 +220,13 @@ start-dfs.sh start-yarn.sh ``` -To check if all services are started well use ‘jps‘ command: +要检查所有服务是否正常启动,请使用 “jps” 命令: ``` jps ``` -You should see like this output. +你应该看到这样的输出。 ``` 26049 SecondaryNameNode @@ -239,18 +237,18 @@ You should see like this output. 25807 NameNode ``` -Now you can access to Hadoop Services in your Browser at: **http://your-ip-address:8088/.** +现在,你可以在浏览器中访问 Hadoop 服务:**http://your-ip-address:8088/**。 [![hadoop](http://www.unixmen.com/wp-content/uploads/2015/06/hadoop.png)][5] -Thanks!!! +谢谢!!! -------------------------------------------------------------------------------- via: https://www.unixmen.com/setup-apache-hadoop-centos/ 作者:[anismaj ][a] -译者:[译者ID](https://github.com/译者ID) +译者:[geekpi](https://github.com/geekpi) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 7ce7b5f279ce059a1ca5f03982fabe38d9c6951c Mon Sep 17 00:00:00 2001 From: geekpi Date: Mon, 7 Aug 2017 08:48:22 +0800 Subject: [PATCH 0923/1407] translating --- ...onitoring Server Install Zabbix on an Ubuntu 16.04 Server.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md b/sources/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md index 235fe15048..2e30a1a72a 100644 --- a/sources/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md +++ b/sources/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md @@ -1,3 +1,5 @@ +translating----geekpi + Monitoring Server: Install Zabbix on an Ubuntu 16.04 Server ============================================================ From 72872ff19d85666d42be9b421bbfd4f24c15b7a2 Mon Sep 17 00:00:00 2001 From: penghuster Date: Mon, 7 Aug 2017 10:36:27 +0800 Subject: [PATCH 0924/1407] translated by penghuster (#5897) * Delete 20170724 IoT Framework for Edge Computing Gains Ground.md * Add files via upload * Add files via upload * Delete IoT Framework for Edge Computing Gains Ground.md --- ...amework for Edge Computing Gains Ground.md | 78 ------------------- ...amework for Edge Computing Gains Ground.md | 51 ++++++++++++ 2 files changed, 51 insertions(+), 78 deletions(-) delete mode 100644 sources/tech/20170724 IoT Framework for Edge Computing Gains Ground.md create mode 100644 translated/tech/IoT Framework for Edge Computing Gains Ground.md diff --git a/sources/tech/20170724 IoT Framework for Edge Computing Gains Ground.md b/sources/tech/20170724 IoT Framework for Edge Computing Gains Ground.md deleted file mode 100644 index 1d9ab94eed..0000000000 --- a/sources/tech/20170724 IoT Framework for Edge Computing Gains Ground.md +++ /dev/null @@ -1,78 +0,0 @@ -translating by penghuster - -IoT Framework for Edge Computing Gains Ground -============================================================ - -![EdgeX](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/edgex_0.png?itok=DUnFipVf "EdgeX") -The open source EdgeX Foundry project is developing a standardized interoperability framework for Internet of Things (IoT) edge computing.[Used with permission][1] - -In April, The Linux Foundation [launched][3] the open source [EdgeX Foundry][4] project to develop a standardized interoperability framework for Internet of Things (IoT) edge computing. Recently, EdgeX Foundry [announced][5] eight new members, bringing the total membership to 58. - -The new members are Absolute, IoT Impact LABS, inwinSTACK, Parallel Machines, Queen’s University Belfast, RIOT, Toshiba Digital Solutions Corporation, and Tulip Interfaces. They join a roster that includes AMD, Analog Devices, Canonical/Ubuntu, Cloud Foundry, Dell, Linaro, Mocana, NetFoundry, Opto 22, RFMicron, and VMWare, among others. - -EdgeX Foundry is built around Dell’s early stage, Apache 2.0 licensed [FUSE][6] IoT middleware framework, which offers more than a dozen microservices comprising over 125,000 lines of code. The Linux Foundation worked with Dell to launch the EdgeX Foundry after the FUSE project merged with a similar AllJoyn-compliant IoTX project led by current EdgeX members Two Bulls and Beechwood. - -EdgeX Foundry will create and certify an ecosystem of interoperable, plug-and-play components. The open source EdgeX stack will mediate between a variety of sensor network messaging protocols and multiple cloud and analytics platforms. The framework is designed to help facilitate interoperability code that spans edge analytics, security, system management, and services. - -The key benefit for members and their customers is the potential to more easily integrating pre-certified software for IoT gateways and smart edge devices. “EdgeX Foundry reduces the challenges that we face in deploying multi-vendor solutions in the real world,” said Dan Mahoney, Lead Engineer for [IoT Impact LABS][7], in an interview with Linux.com. - -Why would The Linux Foundation launch another IoT standardization group while it’s still consolidating its AllSeen Alliance project’s AllJoyn spec into its [IoTivity standard][8]? For one thing, EdgeX Foundry differs from IoTivity in that for now it’s focused exclusively on industrial rather than both consumer and industrial IoT. Even more specifically, it targets middleware for gateways and smart endpoints. The projects also differ in that IoTivity is more about interoperability of existing products while EdgeX hopes to shape new products with pre-certified building blocks. - -“IoTivity provides a device protocol enabling seamless device-to-device connectivity, while EdgeX Foundry provides a framework for edge computing,” said Philip DesAutels, PhD Senior Director of IoT at The Linux Foundation. “With EdgeX Foundry, any protocol -- IoTivity, BacNet, EtherCat, etc. -- can be integrated to enable multi-protocol communications between devices implementing a variety of protocols and a common edge framework. The goal is to create an ecosystem of interoperable components to reduce uncertainty, accelerate time to market, and facilitate scale.” - -Last month, the IoTivity project, which is backed by the [Open Connectivity Foundation][9] (OCF), as well as The Linux Foundation, released [IoTivity 1.3][10], which adds bridges to the once rival AllJoyn spec backed by the Allseen Alliance, and also adds hooks to the OCF’s UPnP device discovery standard. The IoTivity and AllJoyn standards should achieve even greater integration in [IoTivity 2.0][11]. - -IoTivity and EdgeX are “highly complementary,” DesAutels told Linux.com. “Since there are several members of EdgeX Foundry that are also involved in either IoTivity or OCF, the project anticipates strong partnerships between IoTivity and EdgeX.” - -Although both EdgeX and IoTivity are billed as being cross-platform in both CPU architecture and OS, IoTivity is still primarily a Linux driven effort -- spanning Ubuntu, Tizen, and Android -- that is now expanding to Windows and iOS. By comparison, EdgeX Foundry is designed from the start to be fully cross-platform, regardless of CPU architecture or OS, including Linux, Windows, and Mac OS, and potentially real-time operating systems (RTOSes). - -One of the new EdgeX members is the [RIOT][12] project, which offers an open source, IoT-oriented RIOT RTOS. “RIOT starts where Linux doesn’t fit so it is natural for the RIOT community to participate and support complementary open-source initiatives like EdgeX Foundry for edge computing,” stated RIOT’s Thomas Eichinger in a testimonial quote. - -### Easing sensor integration - -IoT Impact LABS (aka Impact LABS or just plain LABS) is another new EdgeX member. The company has a novel business model of helping small-to-medium sized businesses live pilot IoT solutions. Most of its clients, which include several EdgeX Foundry members, are working on projects for enabling smart cities, resilient infrastructure, improved food security, as well as solutions designed for communities facing natural resource challenges. - -“At LABS we spend a lot of time troubleshooting new solutions for our pilot hosts,” said Dan Mahoney. “EdgeX Foundry will let us deploy faster with high-quality solutions by keeping the edge software development efforts to a minimum.” - -The framework will be especially helpful in projects that involve many types of sensors from multiple vendors. “EdgeX Foundry gives us the ability to rapidly build gateway software to handle all the sensors being deployed,” added Mahoney. Sensor manufacturers will be able to use the EdgeX SDK to write a single application-level device driver for a given protocol that can then be used by multiple vendors and solutions. - -### Bringing analytics to the edge - -When asked how his company would like to see the EdgeX framework evolve, Mahoney said: “A goal we would like to encourage is to have multiple industrial protocols available as device services -- and a clear path for implementing edge analytics.” - -Edge computing analytics is a growing trend in both industrial and consumer IoT. In the latter, we’ve already seen several smart home [hubs integrating analytics][13] technology such as Alexa voice activated AI support or video analytics. This typically requires offloading processing to cloud services, which poses challenges in security and privacy, potential service loss due to provider outages, and latency issues. - -With industrial IoT gateways, latency is the most important issue. As a result, there’s growing interest in adding more cloud-like intelligence to IoT gateways. One solution is to securely bring cloud-like applications to embedded devices via containers, as with [ResinOS and Ubuntu Core’s snap mechanisms][14]. Another approach is to develop IoT ecosystems that shift more cloud intelligence to the edge. Last month, Amazon released its AWS Lambda based [AWS Greengrass][15]IoT stack for Linux based gateways. The software enables AWS compute, messaging, data caching, and sync capabilities to run on connected devices such as IoT gateways.  - -Analytics is a key element of the EdgeX Foundry roadmap. One founding member is Cloud Foundry, which is aiming to integrate its industry leading cloud application platform with edge devices. Another new member -- [Parallel Machines][16] -- plans to leverage EdgeX to help it bring AI to the edge. - -It’s still early days at EdgeX Foundry. The software is still in alpha stage, and the company had its first big meeting only last month. The project has initiated a series of “Tech Talks” training sessions for new developers. More information may be found [here][17]. - --------------------------------------------------------------------------------- - -via: https://www.linux.com/blog/2017/7/iot-framework-edge-computing-gains-ground - -作者:[ ERIC BROWN][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.linux.com/users/ericstephenbrown -[1]:https://www.linux.com/licenses/category/used-permission -[2]:https://www.linux.com/files/images/edgexpng-0 -[3]:http://linuxgizmos.com/open-source-group-focuses-on-industrial-iot-gateway-middleware/ -[4]:https://www.edgexfoundry.org/ -[5]:https://www.edgexfoundry.org/announcement/2017/07/17/edgex-foundry-builds-momentum-for-a-iot-interoperability-and-a-unified-marketplace-with-eight-new-members/ -[6]:https://medium.com/@gigastacey/dell-plans-an-open-source-iot-stack-3dde43f24feb -[7]:https://iotimpactlabs.com/ -[8]:https://www.linux.com/news/how-iotivity-and-alljoyn-could-combine -[9]:https://openconnectivity.org/developer/specifications/international-standards -[10]:https://wiki.iotivity.org/release_note_1.3.0 -[11]:https://www.linux.com/news/iotivity-20-whats-store -[12]:https://riot-os.org/ -[13]:https://www.linux.com/news/smart-linux-home-hubs-mix-iot-ai -[14]:https://www.linux.com/news/future-iot-containers-aim-solve-security-crisis -[15]:http://linuxgizmos.com/amazon-releases-aws-greengrass-for-local-iot-processing-on-linux-devices/ -[16]:https://www.parallelmachines.com/ -[17]:https://wiki.edgexfoundry.org/ diff --git a/translated/tech/IoT Framework for Edge Computing Gains Ground.md b/translated/tech/IoT Framework for Edge Computing Gains Ground.md new file mode 100644 index 0000000000..1f7ea19a6e --- /dev/null +++ b/translated/tech/IoT Framework for Edge Computing Gains Ground.md @@ -0,0 +1,51 @@ +#IoT边缘计算框架的新进展 +--- +![](http://i.imgur.com/sZvQOVz.png) + +开源项目 EdgeX Foundry 旨在开发一个标准化的互操作物联网边缘计算框架.[使用权限获取](https://www.linux.com/licenses/category/used-permission). + +在4月, Linux 基金组织[启动](http://linuxgizmos.com/open-source-group-focuses-on-industrial-iot-gateway-middleware/)了开发一个标准化互操作物联网边缘计算框架的开源项目[EdgeX Foundry](https://www.edgexfoundry.org/). 就在最近, EdgeX Foundry 又[宣布](https://www.edgexfoundry.org/announcement/2017/07/17/edgex-foundry-builds-momentum-for-a-iot-interoperability-and-a-unified-marketplace-with-eight-new-members/)新增 8 个成员, 其总成员达到 58. + +这些新成员是 Absolute, IoT Impact LABS, inwinStack, Parallel Machines, Queen's University Belfast, RIOT, Toshiba Digital Solutions Corporation, 和 Tulip Interfaces. 其原有成员包括 AMD, Analog Devices, Canonical/Ubuntu, Cloud Foundry, Dell, Linaro, Mocana, NetFoundry, Opto 22, RFMicron 和 VMWare 等其他公司或组织. + +戴尔贡献出其基于 Apache2.0 协议的[FUSE](https://medium.com/@gigastacey/dell-plans-an-open-source-iot-stack-3dde43f24feb)框架源码作为 EdgeX Foundry 项目的种子,其中包括十几个微服务和超过 12.5 万行代码. Linux 基金会和 Dell 将合并 FUSE 和 AllJoyn-compliant IoTX 项目, 后者是由现有 EdgeX Foundry 成员 Two Bulls 和 Beechwood 发起的与 FUSE 相似的一个项目. 待合并完成 Linux 基金组织将正式宣布启动 EdgeX Foundry 项目. + +EdgeX Foundry 将创造一个互操作性的, 即插即用的物联网边缘计算组件生态系统. 开源 EdgeX 栈将协调多样的传感器网络与后台数据处理云平台间的消息协议. 该框架旨在充分挖掘横跨边缘计算, 安全, 系统管理和微服务等模块间的通用代码. + +对于项目成员及其客户来说, 其关注焦点在于借助于 IoT 网关和智能边缘设备,预认证的软件可方便集成的可能性. 在 Linux.com 的一次采访中, [IoT Impact LABS](https://iotimpactlabs.com/) 的首席工程师, Dan Mahoney 说:"现实中, EdgeX Foundry 降低我们在部署囊括多供应商解决方案时所面对的挑战." + +Linux 基金组织,在将 AllSeen Alliance 的 AllJoyn 项目合并到 [IoTivity](https://www.linux.com/news/how-iotivity-and-alljoyn-could-combine) 的情况下, 为什么Linux基金组织发起了另外一个物联网标准化项目 (EdgeX Foundry)? 原因之一, EdgeX Foundry 不同于 IoTivity, IoTivity 主要解决工业物联网问题, 而 EdgeX Foundry 旨在一站解决消费级和工业级物联网全部的问题. 更具体来说, EdgeX Foundry 旨在成为网关和智能终端的通用中间件. EdgeX Foundry 与 IoTivity 的另一个不同在于, 前者希望借助预连接的终端塑造一种新产品, 后者更多解决现存产品之间的互操作性. + +Linux 基金会 IoT 高级总监 Philip DesAutels 说:"IoTivity 提供实现设备之间无缝连接的协议, 而 EdgeX Foundry 提供了一个边缘计算框架. EdgeX Foundry 能够兼容如 IoTivity, BacNet, EtherCat 等任何协议设备, 从而实现集成多协议通信系统的通用边缘计算框架, 该项目的目标是为构建互操作组件的生态系统的过程中, 降低不确定性, 缩短市场化时间, 更好地产生规模效应." + +上个月, 由 [Open Connectivity Foundation](https://openconnectivity.org/developer/specifications/international-standards) (OCF) 和 Linux 基金组织共同发起的 IoTivity项目发布了 [IoTivity 1.3](https://wiki.iotivity.org/release_note_1.3.0), 该版本增加 了与其曾经的对手 AllJoyn spec 的纽带, 也增加了对于 OCF 的 UPnP 设备的接口. 预计在 [IoTivity 2.0](https://www.linux.com/news/iotivity-20-whats-store) 中, IoTivity 和 AllJoyn 将会更进一步深入集成. + +DesAutels 告诉 linux.com, IoTivity 和 EdgeX 是高度互补的, 其原因是 EdgeX 项目和IoTivity 项目有好几个共同成员, 如此更强化了 IoTivity 和 EdgeX 的互补关系. + +尽管 IoTivity 和 EdgeX 都宣称是跨平台,包括 CPU 架构和 OS, 但是二者还是存在一定区别. IoTivity 最初是基于 Linux 平台设计, 兼容 Ubuntu, Tizen 和 Android 等 Linux 系列 OS, 后来逐步扩展到 Windows 和 IOS 操作系统. 与之对应的 EdgeX 设计之初就是基于跨平台的理念, 其完美兼容于各种 CPU 架构, 以及 Linux, Windows 和 Mac OS 等操作系统. 未来还将兼容于实时操作系统(RTOSes). + +EdgeX 的新成员 [RIOT](https://riot-os.org/) 提供了一个开源项目 RIOT RTOS. RIOT 的主要维护者 Thomas Eichinger 在一次重要报告时说:"由于 RIOT 初衷就是致力于解决 linux 不太适应的问题, 故对于 RIOT 社区来说,参加和支持类似于 EdgeX Foundry 等与 Linux 互补性社区的积极性是自然而然的." + +##传感器集成的简化 +IoT Impact LABS (也叫aka impact LABS 或直接称为 LABS) 是另一个 EdgeX 新成员. 该公司推出了一个独特的业务, 旨在帮助中小企业度过物联网解决方案的试用阶段. 该公司的大部分客户, 其中包括几个 EdgeX Foundry 的项目成员, 是致力于建设智慧城市, 基础设施再利用, 提高食品安全, 以及解决会社面临的自然资源缺乏的挑战. + +Dan Mahoney 说:"在 LABS 我们花费了很多时间来调和试点客户的解决方案之间的差异性. EdgeX Foundry 可以最小化部署边缘软件系统的工作量,从而使我们能够更快更好地部署高质量的解决方案." + +该框架在涉及多个供应商, 多种类型传感器的场景尤其凸显优势. "Edgex Foundry 将为我们提供快速构建网关的能力, 以及快速部署传感器的能力." Mahoney 补充说到. 传感器制造商将借助 EdgeX SDK 烧写应用层协议驱动到边缘设备, 该协议能够兼容多供应商和解决方案. + +##边缘分析能力的构建 +当我们问到, Mahoney 的公司想要见到 EdgeX Foundry 怎样的发展时, 他说:"我们喜见乐闻的一个目标是有更多有效的工业协议作为设备服务出现, 一个更清晰的边缘计算实现路径." + +在工业物联网和消费级物联网中边缘计算都呈现增长趋势. 在后者, 我们已经看到如 Alexa 的智能声控以及录像分析等几个智能家居系统集成了边缘计算分析技术. 这减轻了云服务平台的计算负荷, 但同时也带来了安全, 隐私, 以及由于政策和供应商中断引起的服务中断问题. + +对于工业物联网网关, 隐私问题成为首要的问题. 因此, 在物联网网关方面出现了一些类似于云服务功能的扩展. 其中一个解决方案是, 为了安全将一些云服务上的安全保障应用借助容器如 [RIOS 与 Ubuntu 内核快照机制](https://www.linux.com/news/future-iot-containers-aim-solve-security-crisis)等方式集成到嵌入式设备. 另一种方案是, 开发 IoT 系统迁移云功能到边缘. 上个月, Amazon 为基于 linux 的网关发布了实现 [AWS Greengrass](http://linuxgizmos.com/amazon-releases-aws-greengrass-for-local-iot-processing-on-linux-devices/) 物联网协议栈的 AWS lambda. 该软件能够使计算, 消息路由, 数据收集和同步能力在边缘设备上完成,如物联网网关. + +分析能力是 EdgeX Foundry 的一个关键功能要点. 发起成员 Cloud Foundry 是旨在集成其主要的工业应用平台到边缘设备. 另一个新成员 [Parallel Machines](https://www.parallelmachines.com/) 计划利用EdgeX将AI带到边缘设备. + +EdgeX Foundry 仍然在项目早期, 软件仍然在 α 阶段, 其成员在上个月才刚刚进行了第一次全体成员大会. 同时项目已经为新开发者准备了一些初始训练课程, 另外从[这里](https://wiki.edgexfoundry.org/)也能获取更多的信息. + +原文连接: [https://www.linux.com/blog/2017/7/iot-framework-edge-computing-gains-ground](https://www.linux.com/blog/2017/7/iot-framework-edge-computing-gains-ground) + +作者: [ERIC BROWN](https://www.linux.com/users/ericstephenbrown) 译者:penghuster 校对:校对者ID + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 \ No newline at end of file From bd52ac07df1a0331448362e8eee77d2959aa9b0f Mon Sep 17 00:00:00 2001 From: rieonke Date: Mon, 7 Aug 2017 10:57:23 +0800 Subject: [PATCH 0925/1407] apply for translating --- ...STIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md | 2 ++ ...I RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md | 2 ++ 2 files changed, 4 insertions(+) diff --git a/sources/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md b/sources/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md index d107eb66d1..a05fe75cbd 100644 --- a/sources/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md +++ b/sources/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md @@ -1,3 +1,5 @@ +> translating by rieon + DEMYSTIFYING THE OPEN CONTAINER INITIATIVE (OCI) SPECIFICATIONS ============================================================ diff --git a/sources/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md b/sources/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md index 9e2fc78628..21117c34f6 100644 --- a/sources/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md +++ b/sources/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md @@ -1,3 +1,5 @@ +> translating by rieon + DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS ============================================================ From d46e3e6349aa6b685a7310ab353b0115409b9c5d Mon Sep 17 00:00:00 2001 From: penghuster Date: Mon, 7 Aug 2017 11:34:03 +0800 Subject: [PATCH 0926/1407] Rename IoT Framework for Edge Computing Gains Ground.md to 20170724 IoT Framework for Edge Computing Gains Ground.md --- ...> 20170724 IoT Framework for Edge Computing Gains Ground.md} | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) rename translated/tech/{IoT Framework for Edge Computing Gains Ground.md => 20170724 IoT Framework for Edge Computing Gains Ground.md} (98%) diff --git a/translated/tech/IoT Framework for Edge Computing Gains Ground.md b/translated/tech/20170724 IoT Framework for Edge Computing Gains Ground.md similarity index 98% rename from translated/tech/IoT Framework for Edge Computing Gains Ground.md rename to translated/tech/20170724 IoT Framework for Edge Computing Gains Ground.md index 1f7ea19a6e..4c0390c65d 100644 --- a/translated/tech/IoT Framework for Edge Computing Gains Ground.md +++ b/translated/tech/20170724 IoT Framework for Edge Computing Gains Ground.md @@ -48,4 +48,4 @@ EdgeX Foundry 仍然在项目早期, 软件仍然在 α 阶段, 其成员在上 作者: [ERIC BROWN](https://www.linux.com/users/ericstephenbrown) 译者:penghuster 校对:校对者ID -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 \ No newline at end of file +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 0f19f709d1faaf04ca686aeedecb8022df6c455c Mon Sep 17 00:00:00 2001 From: rieonke Date: Mon, 7 Aug 2017 16:19:05 +0800 Subject: [PATCH 0927/1407] translated --- ...CONTAINER INITIATIVE OCI SPECIFICATIONS.md | 91 ------------------- ...CONTAINER INITIATIVE OCI SPECIFICATIONS.md | 88 ++++++++++++++++++ 2 files changed, 88 insertions(+), 91 deletions(-) delete mode 100644 sources/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md create mode 100644 translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md diff --git a/sources/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md b/sources/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md deleted file mode 100644 index a05fe75cbd..0000000000 --- a/sources/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md +++ /dev/null @@ -1,91 +0,0 @@ -> translating by rieon - -DEMYSTIFYING THE OPEN CONTAINER INITIATIVE (OCI) SPECIFICATIONS -============================================================ - - -The Open Container Initiative (OCI) announced the completion of the first versions of the container runtime and image specifications this week. The OCI is an effort under the auspices of the Linux Foundation to develop specifications and standards to support container solutions. A lot of effort has gone into the [building of these specifications][12] over the past two years. With that in mind, let’s take a look at some of the myths that have arisen over the past two years. - -![OCI](https://i1.wp.com/blog.docker.com/wp-content/uploads/logo_oci.png?resize=800%2C180&ssl=1) - -Myth: The OCI is a replacement for Docker - -Standards are important, but they are far from a complete production platform. Take for example, the World Wide Web. It  has evolved over the last 25 years and was built on core dependable standards like TCP/IP, HTTP and HTML. Using TCP/IP as an example, when enterprises coalesced around TCP/IP as a common protocol, it fueled the growth of routers and in particular – Cisco. However, Cisco became a leader in its market by focusing on differentiated features on its routing platform. We believe the parallel exists with the OCI specifications and Docker. - -[Docker is a complete production platform][13] for developing, distributing, securing and orchestrating container-based solutions. The OCI specification is used by Docker, but it represents only about five percent of our code and a small part of the Docker platform concerned with the runtime behavior of a container and the layout of a container image.  - -Myth: Products and projects already are certified to the OCI specifications - -The runtime and image specifications have just released as 1.0 this week. However, the OCI certification program is still in development so companies cannot claim compliance, conformance or compatibility until certification is formally rolled out later this year. - -The OCI [certification working group][14] is currently defining the standard so that products and open source projects can demonstrate conformance to the specifications. Standards and specifications are important for engineers implementing solutions, but formal certification is the only way to reassure customers that the technology they are working with is truly conformant to the standard. - -Myth: Docker doesn’t support the OCI specifications work - -Docker has a long history with contributing to the OCI. We developed and donated a majority of the OCI code and have been instrumental in defining the OCI runtime and image specifications as maintainers of the project. When the Docker runtime and image format quickly became the de facto standards after being released as open source in 2013, we thought it would be beneficial to donate the code to a neutral governance body to avoid fragmentation and encourage innovation. The goal was to provide a dependable and standardized specification so Docker contributed runc, a simple container runtime, as the basis of the runtime specification work, and later contributed the Docker V2 image specification as the basis for the OCI image specification work. - -Docker developers like Michael Crosby and Stephen Day have been key contributors from the beginning of this work, ensuring Docker’s experience hosting and running billions of container images carries through to the OCI. When the certification working group completes its work, Docker will bring its products through the OCI certification process to demonstrate OCI conformance. - -Myth: The OCI specifications are about Linux containers  - -There is a misperception that the OCI is only applicable to Linux container technologies because it is under the aegis of the Linux Foundation. The reality is that although Docker technology started in the Linux world, Docker has been collaborating with Microsoft to bring our container technology, platform and tooling to the world of Windows Server. Additionally, the underlying technology that Docker has donated to the OCI is broadly applicable to  multi-architecture environments including Linux, Windows and Solaris and covers x86, ARM and IBM zSeries.  - -Myth: Docker was just one of many contributors to the OCI - -The OCI as an organization has a lot of supporting members representing the breadth of the container industry. That said, it has been a small but dedicated group of individual technologists that have contributed the time and technology to the efforts that have produced the initial specifications. Docker was a founding member of the OCI, contributing the initial code base that would form the basis of the runtime specification and later the reference implementation itself. Likewise, Docker contributed the Docker V2 Image specification to act as the basis of the OCI image specification. - -Myth: CRI-O is an OCI project - -CRI-O is an open source project in the Kubernetes incubator in the Cloud Native Computing Foundation (CNCF) – it is not an OCI project. It is based on an earlier version of the Docker architecture, whereas containerd is a direct CNCF project that is a larger container runtime that includes the runc reference implementation. containerd is responsible for image transfer and storage, container execution and supervision, and low-level functions to support storage and network attachments. Docker donated containerd to the CNCF with the support of the five largest cloud providers: Alibaba Cloud, AWS, Google Cloud Platform, IBM Softlayer and Microsoft Azure with a charter of being a core container runtime for multiple container platforms and orchestration systems.   - -Myth: The OCI specifications are now complete  - -While the release of the runtime and image format specifications is an important milestone, there’s still work to be done. The initial scope of the OCI was to define a narrow specification on which developers could depend for the runtime behavior of a container, preventing fragmentation in the industry, and still allowing innovation in the evolving container domain. This was later expanded to include a container image specification. - -As the working groups complete the first stable specifications for runtime behavior and image format, new work is under consideration. Ideas for future work include distribution and signing. The next most important work for the OCI, however, is delivering on a certification process backed by a test suite now that the first specifications are stable. - -**Learn more about OCI and Open Source at Docker:** - -* Read the blog post about the [OCI Release of v1.0 Runtime and Image Format Specifications][1] - -* Visit the [Open Container Initiative website][2] - -* Visit the [Moby Project website][3] - -* Attend [DockerCon Europe 2017][4] - -* Attend the [Moby Summit LA][5] alongside OSS NA - --------------------------------------------------------------------------------- - -作者简介: - -Stephen is Director, Open Source Programs at Docker. He has been a Director and Distinguished Technologist at Hewlett-Packard Enterprise. He blogs about open source software and business at “Once More Unto The Breach” (http://stephesblog.blogs.com) and opensource.com. - - - ------------------ - -via: https://blog.docker.com/2017/07/demystifying-open-container-initiative-oci-specifications/ - -作者:[Stephen ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]: -[1]:https://blog.docker.com/2017/07/oci-release-of-v1-0-runtime-and-image-format-specifications -[2]:https://www.opencontainers.org/join -[3]:http://mobyproject.org/ -[4]:https://europe-2017.dockercon.com/ -[5]:https://www.eventbrite.com/e/moby-summit-los-angeles-tickets-35930560273 -[6]:https://blog.docker.com/author/stephen-walli/ -[7]:https://blog.docker.com/tag/containerd/ -[8]:https://blog.docker.com/tag/cri-o/ -[9]:https://blog.docker.com/tag/linux-containers/ -[10]:https://blog.docker.com/tag/linux-foundation/ -[11]:https://blog.docker.com/tag/oci/ -[12]:https://blog.docker.com/2017/07/oci-release-of-v1-0-runtime-and-image-format-specifications -[13]:https://www.docker.com/ -[14]:https://github.com/opencontainers/certification diff --git a/translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md b/translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md new file mode 100644 index 0000000000..c9719623e5 --- /dev/null +++ b/translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md @@ -0,0 +1,88 @@ +解密开放容器计划(OCI)规范 +============================================================ + + +开放容器计划(OCI)宣布本周完成容器运行时和镜像的第一版规范。OCI 在是 Linux 基金会支持下的容器解决方案标准化的成果。两年来,为了[建立这些规范][12]已经付出了大量的努力。 考虑到这一点,让我们来看看过去两年来出现的一些误区。 + +![OCI](https://i1.wp.com/blog.docker.com/wp-content/uploads/logo_oci.png?resize=800%2C180&ssl=1) + +误区:OCI 是 Docker 的替代品 + +诚然标准非常重要,但它们远非一个完整的生产平台。 以万维网为例,它25年来一路演进,建立在诸如 TCP/IP ,HTTP 和 HTML 等核心可靠的标准之上。再以 TCP/IP 为例,当企业将 TCP/IP 合并为一种通用协议时,它推动了路由器行业,尤其是思科的发展。 然而,思科通过专注于在其路由平台上提供差异化的功能,而成为市场的领导者。我们认为 OCI 规范和 Docker 也是类似这样并行存在的。 + +[Docker 是一个完整的生产平台][13],提供了基于容器的开发、分发、安全、编排的一体化解决方案。Docker 使用了 OCI 规范,但它大约只占总代码的 5%,而且 Docker 平台只有一小部分涉及容器的运行时行为和容器镜像的布局。 + +误区:产品和项目已经通过了 OCI 规范认证 + +运行时和镜像规范本周刚发布1.0的版本。 而且 OCI 认证计划仍在开发阶段,所以企业在认证正式推出之前(今年晚些时候),没法要求容器产品的合规性,一致性或兼容性。 + +OCI [认证工作组][14] 目前正在制定标准,使容器产品和开源项目能够符合规范的要求。标准和规范对于实施解决方案的工程师很重要,但正式认证是向客户保证其正在使用的技术真正符合标准的唯一方式。 + +误区:Docker不支持 OCI 规范的工作 + +Docker 很早就开始为 OCI 做出贡献。 我们向 OCI 贡献了大部分的代码,作为 OCI 项目的维护者,为OCI运行时和镜像规范定义提供了积极的帮助。当 Docker 运行时和镜像格式在 2013 年开源发布之后,迅速成为事实上的标准,我们认为将代码捐赠给中立的管理机构,对于避免容器行业的碎片化和鼓励行业创新将是有益的。我们的目标是提供一个可靠和标准化的规范,因此 Docker 提供了一个简单的容器运行时 runc 作为运行时规范工作的基础,后来提供了 Docker V2 镜像规范作为 OCI 镜像规范工作的基础。 + +Docker 的开发人员如 Michael Crosby 和 Stephen Day 从一开始就是这项工作的关键贡献者,确保能将 Docker 的托管和运行数十亿个容器镜像的经验带给 OCI。 等认证工作组完成(制定认证规范的)工作后,Docker将通过OCI认证过程将其产品展示出来,以证明OCI的一致性。 + +误区:OCI 仅用于 Linux 容器技术 + +因为 OCI 是由 Linux 基金会 (Linux Foundation) 由负责制定的,所以很容易让人误解为,OCI 仅适用于 Linux 容器技术。 而实际上并非如此,尽管 Docker 技术始于 Linux 世界,但 Docker 也一直在与微软合作,将我们的容器技术,平台和工具带入 Windows Server 的世界。 此外,Docker 向 OCI 捐赠的基础技术广泛适用于包括 Linux ,Windows 和 Solaris 在内的多种操作系统环境,涵盖了 x86,ARM 和 IBM zSeries 等多种架构环境。 + +误区:Docker只是OCI的众多贡献者之一 + +OCI 作为一个组织有很多支持成员,代表了容器行业的广度。 也就是说,它是一个小而专业的个人技术专家组,为制作初始规范的工作贡献了大量的时间和技术。 Docker 是 OCI 的创始成员,贡献了初始代码库,构成了运行时规范的基础,后来引入了参考实现。 同样地,Docker 也将 Docker V2 镜像规范贡献给 OCI 作为镜像规范的基础。 + +误区:CRI-O 是 OCI 项目 + +CRI-O 是云计算基金会(CNCF)Kubernetes 孵化器的开源项目 -- 它不是 OCI 项目。 它基于早期版本的 Docker 体系结构,而 containerd 是一个直接的 CNCF 项目,它是一个包括 runc 参考实现的更大的容器运行时。 containerd 负责镜像传输和存储,容器运行和监控,以及支持存储和网络附件的底层功能。 Docker 在五个最大的云提供商(阿里云,AWS,Google Cloud Platform (GCP),IBM Softlayer 和 Microsoft Azure)的支持下,将 containerd 捐赠给了云计算基金会(CNCF),作为多个容器平台和编排系统的核心容器运行时。 + +规格:OCI 规范现在已经完成了 + +虽然首版运行时和镜像格式规范的发布是一个重要的里程碑,但还有许多工作有待完成。 OCI 的一开始着眼于定义一个狭窄的规范:开发人员可以依赖于容器的运行时行为,防止容器行业碎片化,并且仍然允许在不断变化的容器域中进行创新。之后才将含容器镜像规范囊括其中。 + +随着工作组完成运行时行为和镜像格式的第一个稳定规范,新的工作考量也已经同步展开。未来的新特性包括分发和签名。 然而,OCI 的下一个最重要的工作是提供一个由测试套件支持的认证过程,因为第一个规范已经稳定了。 + +** 在 Docker 了解更多关于 OCI 和开源的信息:** + +* 阅读关于[OCI v1.0 版本的运行时和镜像格式规范]的博文[1] + +* 访问 [OCI 的网站][2] + +* 访问 [Moby 项目网站][3] + +* 参加 [DockerCon Europe 2017][4] + +* 参加 [Moby Summit LA][5]  + +-------------------------------------------------------------------------------- + +作者简介: + +Stephen 是 Docker 开源项目总监。 他曾在 Hewlett-Packard Enterprise (惠普企业)担任董事和杰出技术专家。 他的关于开源软件和商业的博客“再次违约”(http://stephesblog.blogs.com)和网站 opensource.com。 + + +----------------- + +via: https://blog.docker.com/2017/07/demystifying-open-container-initiative-oci-specifications/ + +作者:[Stephen ][a] +译者:[rieonke](https://github.com/rieonke) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]: +[1]:https://blog.docker.com/2017/07/oci-release-of-v1-0-runtime-and-image-format-specifications +[2]:https://www.opencontainers.org/join +[3]:http://mobyproject.org/ +[4]:https://europe-2017.dockercon.com/ +[5]:https://www.eventbrite.com/e/moby-summit-los-angeles-tickets-35930560273 +[6]:https://blog.docker.com/author/stephen-walli/ +[7]:https://blog.docker.com/tag/containerd/ +[8]:https://blog.docker.com/tag/cri-o/ +[9]:https://blog.docker.com/tag/linux-containers/ +[10]:https://blog.docker.com/tag/linux-foundation/ +[11]:https://blog.docker.com/tag/oci/ +[12]:https://blog.docker.com/2017/07/oci-release-of-v1-0-runtime-and-image-format-specifications +[13]:https://www.docker.com/ +[14]:https://github.com/opencontainers/certification From 777e19c50db48a00ebcd426cdc51c99c64fa4711 Mon Sep 17 00:00:00 2001 From: Rieon Date: Mon, 7 Aug 2017 16:39:03 +0800 Subject: [PATCH 0928/1407] enhanced --- ...CONTAINER INITIATIVE OCI SPECIFICATIONS.md | 32 +++++++++---------- 1 file changed, 16 insertions(+), 16 deletions(-) diff --git a/translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md b/translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md index c9719623e5..cd7a55997e 100644 --- a/translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md +++ b/translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md @@ -2,45 +2,45 @@ ============================================================ -开放容器计划(OCI)宣布本周完成容器运行时和镜像的第一版规范。OCI 在是 Linux 基金会支持下的容器解决方案标准化的成果。两年来,为了[建立这些规范][12]已经付出了大量的努力。 考虑到这一点,让我们来看看过去两年来出现的一些误区。 +开放容器计划(OCI)宣布本周完成容器运行时和镜像的第一版规范。OCI 在是 Linux 基金会(Linux Foundation)支持下的容器解决方案标准化的成果。两年来,为了[建立这些规范][12]已经付出了大量的努力。 由此,让我们一起来回顾过去两年中出现的一些误区。 ![OCI](https://i1.wp.com/blog.docker.com/wp-content/uploads/logo_oci.png?resize=800%2C180&ssl=1) -误区:OCI 是 Docker 的替代品 +** 误区:OCI 是 Docker 的替代品 ** 诚然标准非常重要,但它们远非一个完整的生产平台。 以万维网为例,它25年来一路演进,建立在诸如 TCP/IP ,HTTP 和 HTML 等核心可靠的标准之上。再以 TCP/IP 为例,当企业将 TCP/IP 合并为一种通用协议时,它推动了路由器行业,尤其是思科的发展。 然而,思科通过专注于在其路由平台上提供差异化的功能,而成为市场的领导者。我们认为 OCI 规范和 Docker 也是类似这样并行存在的。 [Docker 是一个完整的生产平台][13],提供了基于容器的开发、分发、安全、编排的一体化解决方案。Docker 使用了 OCI 规范,但它大约只占总代码的 5%,而且 Docker 平台只有一小部分涉及容器的运行时行为和容器镜像的布局。 -误区:产品和项目已经通过了 OCI 规范认证 +** 误区:产品和项目已经通过了 OCI 规范认证 ** 运行时和镜像规范本周刚发布1.0的版本。 而且 OCI 认证计划仍在开发阶段,所以企业在认证正式推出之前(今年晚些时候),没法要求容器产品的合规性,一致性或兼容性。 OCI [认证工作组][14] 目前正在制定标准,使容器产品和开源项目能够符合规范的要求。标准和规范对于实施解决方案的工程师很重要,但正式认证是向客户保证其正在使用的技术真正符合标准的唯一方式。 -误区:Docker不支持 OCI 规范的工作 +** 误区:Docker不支持 OCI 规范的工作 ** -Docker 很早就开始为 OCI 做出贡献。 我们向 OCI 贡献了大部分的代码,作为 OCI 项目的维护者,为OCI运行时和镜像规范定义提供了积极的帮助。当 Docker 运行时和镜像格式在 2013 年开源发布之后,迅速成为事实上的标准,我们认为将代码捐赠给中立的管理机构,对于避免容器行业的碎片化和鼓励行业创新将是有益的。我们的目标是提供一个可靠和标准化的规范,因此 Docker 提供了一个简单的容器运行时 runc 作为运行时规范工作的基础,后来提供了 Docker V2 镜像规范作为 OCI 镜像规范工作的基础。 +Docker 很早就开始为 OCI 做贡献。 我们向 OCI 贡献了大部分的代码,作为 OCI 项目的维护者,为 OCI 运行时和镜像规范定义提供了积极有益的帮助。Docker 运行时和镜像格式在 2013 年开源发布之后,便迅速成为事实上的标准,我们认为将代码捐赠给中立的管理机构,对于避免容器行业的碎片化和鼓励行业创新将是有益的。我们的目标是提供一个可靠和标准化的规范,因此 Docker 提供了一个简单的容器运行时 runc 作为运行时规范工作的基础,后来又贡献了 Docker V2 镜像规范作为 OCI 镜像规范工作的基础。 -Docker 的开发人员如 Michael Crosby 和 Stephen Day 从一开始就是这项工作的关键贡献者,确保能将 Docker 的托管和运行数十亿个容器镜像的经验带给 OCI。 等认证工作组完成(制定认证规范的)工作后,Docker将通过OCI认证过程将其产品展示出来,以证明OCI的一致性。 +Docker 的开发人员如 Michael Crosby 和 Stephen Day 从一开始就是这项工作的关键贡献者,确保能将 Docker 的托管和运行数十亿个容器镜像的经验带给 OCI。等认证工作组完成(制定认证规范的)工作后,Docker 将通过 OCI 认证将其产品展示出来,以证明 OCI 的一致性。 -误区:OCI 仅用于 Linux 容器技术 +** 误区:OCI 仅用于 Linux 容器技术 ** -因为 OCI 是由 Linux 基金会 (Linux Foundation) 由负责制定的,所以很容易让人误解为,OCI 仅适用于 Linux 容器技术。 而实际上并非如此,尽管 Docker 技术始于 Linux 世界,但 Docker 也一直在与微软合作,将我们的容器技术,平台和工具带入 Windows Server 的世界。 此外,Docker 向 OCI 捐赠的基础技术广泛适用于包括 Linux ,Windows 和 Solaris 在内的多种操作系统环境,涵盖了 x86,ARM 和 IBM zSeries 等多种架构环境。 +因为 OCI 是由 Linux 基金会 (Linux Foundation) 负责制定的,所以很容易让人误解为 OCI 仅适用于 Linux 容器技术。 而实际上并非如此,尽管 Docker 技术源于 Linux 世界,但 Docker 也一直在与微软合作,将我们的容器技术、平台和工具带到 Windows Server 的世界。 此外,Docker 向 OCI 贡献的基础技术广泛适用于包括 Linux ,Windows 和 Solaris 在内的多种操作系统环境,涵盖了 x86,ARM 和 IBM zSeries 等多种架构环境。 -误区:Docker只是OCI的众多贡献者之一 +** 误区:Docker 仅仅是OCI的众多贡献者之一 ** -OCI 作为一个组织有很多支持成员,代表了容器行业的广度。 也就是说,它是一个小而专业的个人技术专家组,为制作初始规范的工作贡献了大量的时间和技术。 Docker 是 OCI 的创始成员,贡献了初始代码库,构成了运行时规范的基础,后来引入了参考实现。 同样地,Docker 也将 Docker V2 镜像规范贡献给 OCI 作为镜像规范的基础。 +OCI 作为一个支持成员众多的开放组织,代表了容器行业的广度。 也就是说,它是一个小而专业的个人技术专家组,为制作初始规范的工作贡献了大量的时间和技术。 Docker 是 OCI 的创始成员,贡献了初始代码库,构成了运行时规范的基础,后来引入了参考实现。 同样地,Docker 也将 Docker V2 镜像规范贡献给 OCI 作为镜像规范的基础。 -误区:CRI-O 是 OCI 项目 +** 误区:CRI-O 是 OCI 项目 ** -CRI-O 是云计算基金会(CNCF)Kubernetes 孵化器的开源项目 -- 它不是 OCI 项目。 它基于早期版本的 Docker 体系结构,而 containerd 是一个直接的 CNCF 项目,它是一个包括 runc 参考实现的更大的容器运行时。 containerd 负责镜像传输和存储,容器运行和监控,以及支持存储和网络附件的底层功能。 Docker 在五个最大的云提供商(阿里云,AWS,Google Cloud Platform (GCP),IBM Softlayer 和 Microsoft Azure)的支持下,将 containerd 捐赠给了云计算基金会(CNCF),作为多个容器平台和编排系统的核心容器运行时。 +CRI-O 是云计算基金会(CNCF)Kubernetes 孵化器的开源项目 -- 它不是 OCI 项目。 它基于早期版本的 Docker 体系结构,而 containerd 是一个直接的 CNCF 项目,它是一个包括 runc 参考实现的更大的容器运行时。 containerd 负责镜像传输和存储,容器运行和监控,以及支持存储和网络附件等底层功能。 Docker 在五个最大的云提供商(阿里云,AWS,Google Cloud Platform (GCP),IBM Softlayer 和 Microsoft Azure)的支持下,将 containerd 捐赠给了云计算基金会(CNCF),作为多个容器平台和编排系统的核心容器运行时。 -规格:OCI 规范现在已经完成了 +** 误区:OCI 规范现在已经完成了 ** -虽然首版运行时和镜像格式规范的发布是一个重要的里程碑,但还有许多工作有待完成。 OCI 的一开始着眼于定义一个狭窄的规范:开发人员可以依赖于容器的运行时行为,防止容器行业碎片化,并且仍然允许在不断变化的容器域中进行创新。之后才将含容器镜像规范囊括其中。 +虽然首版容器运行时和镜像格式规范的发布是一个重要的里程碑,但还有许多工作有待完成。 OCI 的一开始着眼于定义一个狭窄的规范:开发人员可以依赖于容器的运行时行为,防止容器行业碎片化,并且仍然允许在不断变化的容器域中进行创新。之后才将含容器镜像规范囊括其中。 -随着工作组完成运行时行为和镜像格式的第一个稳定规范,新的工作考量也已经同步展开。未来的新特性包括分发和签名。 然而,OCI 的下一个最重要的工作是提供一个由测试套件支持的认证过程,因为第一个规范已经稳定了。 +随着工作组完成运行时行为和镜像格式的第一个稳定规范,新的工作考量也已经同步展开。未来的新特性将包括分发和签名等。 然而,OCI 的下一个最重要的工作是提供一个由测试套件支持的认证过程,因为第一个规范已经稳定了。 ** 在 Docker 了解更多关于 OCI 和开源的信息:** @@ -58,7 +58,7 @@ CRI-O 是云计算基金会(CNCF)Kubernetes 孵化器的开源项目 -- 它 作者简介: -Stephen 是 Docker 开源项目总监。 他曾在 Hewlett-Packard Enterprise (惠普企业)担任董事和杰出技术专家。 他的关于开源软件和商业的博客“再次违约”(http://stephesblog.blogs.com)和网站 opensource.com。 +Stephen 是 Docker 开源项目总监。 他曾在 Hewlett-Packard Enterprise (惠普企业)担任董事和杰出技术专家。他的关于开源软件和商业的博客 “再次违约”(http://stephesblog.blogs.com) 和网站 opensource.com。 ----------------- From fb217aa93a658538e70f9f9082e626996cc4945c Mon Sep 17 00:00:00 2001 From: Rieon Date: Mon, 7 Aug 2017 16:40:41 +0800 Subject: [PATCH 0929/1407] fixed styling mistakes --- ...OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md b/translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md index cd7a55997e..ba0240a59c 100644 --- a/translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md +++ b/translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md @@ -6,13 +6,13 @@ ![OCI](https://i1.wp.com/blog.docker.com/wp-content/uploads/logo_oci.png?resize=800%2C180&ssl=1) -** 误区:OCI 是 Docker 的替代品 ** +**误区:OCI 是 Docker 的替代品** 诚然标准非常重要,但它们远非一个完整的生产平台。 以万维网为例,它25年来一路演进,建立在诸如 TCP/IP ,HTTP 和 HTML 等核心可靠的标准之上。再以 TCP/IP 为例,当企业将 TCP/IP 合并为一种通用协议时,它推动了路由器行业,尤其是思科的发展。 然而,思科通过专注于在其路由平台上提供差异化的功能,而成为市场的领导者。我们认为 OCI 规范和 Docker 也是类似这样并行存在的。 [Docker 是一个完整的生产平台][13],提供了基于容器的开发、分发、安全、编排的一体化解决方案。Docker 使用了 OCI 规范,但它大约只占总代码的 5%,而且 Docker 平台只有一小部分涉及容器的运行时行为和容器镜像的布局。 -** 误区:产品和项目已经通过了 OCI 规范认证 ** +**误区:产品和项目已经通过了 OCI 规范认证** 运行时和镜像规范本周刚发布1.0的版本。 而且 OCI 认证计划仍在开发阶段,所以企业在认证正式推出之前(今年晚些时候),没法要求容器产品的合规性,一致性或兼容性。 @@ -24,25 +24,25 @@ Docker 很早就开始为 OCI 做贡献。 我们向 OCI 贡献了大部分的 Docker 的开发人员如 Michael Crosby 和 Stephen Day 从一开始就是这项工作的关键贡献者,确保能将 Docker 的托管和运行数十亿个容器镜像的经验带给 OCI。等认证工作组完成(制定认证规范的)工作后,Docker 将通过 OCI 认证将其产品展示出来,以证明 OCI 的一致性。 -** 误区:OCI 仅用于 Linux 容器技术 ** +**误区:OCI 仅用于 Linux 容器技术** 因为 OCI 是由 Linux 基金会 (Linux Foundation) 负责制定的,所以很容易让人误解为 OCI 仅适用于 Linux 容器技术。 而实际上并非如此,尽管 Docker 技术源于 Linux 世界,但 Docker 也一直在与微软合作,将我们的容器技术、平台和工具带到 Windows Server 的世界。 此外,Docker 向 OCI 贡献的基础技术广泛适用于包括 Linux ,Windows 和 Solaris 在内的多种操作系统环境,涵盖了 x86,ARM 和 IBM zSeries 等多种架构环境。 -** 误区:Docker 仅仅是OCI的众多贡献者之一 ** +**误区:Docker 仅仅是OCI的众多贡献者之一** OCI 作为一个支持成员众多的开放组织,代表了容器行业的广度。 也就是说,它是一个小而专业的个人技术专家组,为制作初始规范的工作贡献了大量的时间和技术。 Docker 是 OCI 的创始成员,贡献了初始代码库,构成了运行时规范的基础,后来引入了参考实现。 同样地,Docker 也将 Docker V2 镜像规范贡献给 OCI 作为镜像规范的基础。 -** 误区:CRI-O 是 OCI 项目 ** +**误区:CRI-O 是 OCI 项目** CRI-O 是云计算基金会(CNCF)Kubernetes 孵化器的开源项目 -- 它不是 OCI 项目。 它基于早期版本的 Docker 体系结构,而 containerd 是一个直接的 CNCF 项目,它是一个包括 runc 参考实现的更大的容器运行时。 containerd 负责镜像传输和存储,容器运行和监控,以及支持存储和网络附件等底层功能。 Docker 在五个最大的云提供商(阿里云,AWS,Google Cloud Platform (GCP),IBM Softlayer 和 Microsoft Azure)的支持下,将 containerd 捐赠给了云计算基金会(CNCF),作为多个容器平台和编排系统的核心容器运行时。 -** 误区:OCI 规范现在已经完成了 ** +**误区:OCI 规范现在已经完成了** 虽然首版容器运行时和镜像格式规范的发布是一个重要的里程碑,但还有许多工作有待完成。 OCI 的一开始着眼于定义一个狭窄的规范:开发人员可以依赖于容器的运行时行为,防止容器行业碎片化,并且仍然允许在不断变化的容器域中进行创新。之后才将含容器镜像规范囊括其中。 随着工作组完成运行时行为和镜像格式的第一个稳定规范,新的工作考量也已经同步展开。未来的新特性将包括分发和签名等。 然而,OCI 的下一个最重要的工作是提供一个由测试套件支持的认证过程,因为第一个规范已经稳定了。 -** 在 Docker 了解更多关于 OCI 和开源的信息:** +**在 Docker 了解更多关于 OCI 和开源的信息:** * 阅读关于[OCI v1.0 版本的运行时和镜像格式规范]的博文[1] From 5ace10490a79e99adfc73ace961432ccf8968a55 Mon Sep 17 00:00:00 2001 From: Rieon Date: Mon, 7 Aug 2017 16:52:09 +0800 Subject: [PATCH 0930/1407] fixed styling mistake again --- ...STIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md b/translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md index ba0240a59c..c8b79a054e 100644 --- a/translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md +++ b/translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md @@ -18,7 +18,7 @@ OCI [认证工作组][14] 目前正在制定标准,使容器产品和开源项目能够符合规范的要求。标准和规范对于实施解决方案的工程师很重要,但正式认证是向客户保证其正在使用的技术真正符合标准的唯一方式。 -** 误区:Docker不支持 OCI 规范的工作 ** +**误区:Docker不支持 OCI 规范的工作** Docker 很早就开始为 OCI 做贡献。 我们向 OCI 贡献了大部分的代码,作为 OCI 项目的维护者,为 OCI 运行时和镜像规范定义提供了积极有益的帮助。Docker 运行时和镜像格式在 2013 年开源发布之后,便迅速成为事实上的标准,我们认为将代码捐赠给中立的管理机构,对于避免容器行业的碎片化和鼓励行业创新将是有益的。我们的目标是提供一个可靠和标准化的规范,因此 Docker 提供了一个简单的容器运行时 runc 作为运行时规范工作的基础,后来又贡献了 Docker V2 镜像规范作为 OCI 镜像规范工作的基础。 From 5effde10b14aec83448d76fcc05001b28854ddaa Mon Sep 17 00:00:00 2001 From: XYenChi <466530436@qq.com> Date: Mon, 7 Aug 2017 17:43:55 +0800 Subject: [PATCH 0931/1407] XYenChi translating --- ...ecting and mapping Twitter data using R.md | 179 ------------------ ...ba4 AD DC with SSSD and Realm – Part 15.md | 1 + ...ecting and mapping Twitter data using R.md | 179 ++++++++++++++++++ 3 files changed, 180 insertions(+), 179 deletions(-) delete mode 100644 sources/tech/20170620 A beginners guide to collecting and mapping Twitter data using R.md create mode 100644 translated/20170620 A beginners guide to collecting and mapping Twitter data using R.md diff --git a/sources/tech/20170620 A beginners guide to collecting and mapping Twitter data using R.md b/sources/tech/20170620 A beginners guide to collecting and mapping Twitter data using R.md deleted file mode 100644 index 06d298180b..0000000000 --- a/sources/tech/20170620 A beginners guide to collecting and mapping Twitter data using R.md +++ /dev/null @@ -1,179 +0,0 @@ -XYenChi is translating -A beginner's guide to collecting and mapping Twitter data using R -============================================================ - -### Learn to use R's twitteR and leaflet packages, which allow you to map the location of tweets on any topic. - -![A beginner's guide to collecting and mapping Twitter data using R](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/cloud-globe.png?itok=H4f-RAz_ "A beginner's guide to collecting and mapping Twitter data using R") -Image by :  - -[Jason Baker][14]. [CC BY-SA 4.0][15]. Source: [Cloud][16], [Globe][17]. Both [CC0][18]. - -When I started learning R, I also needed to learn how to collect Twitter data and map it for research purposes. Despite the wealth of information on the internet about this topic, I found it difficult to understand what was involved in collecting and mapping Twitter data. Not only was I was a novice to R, but I was also unfamiliar with the technical terms in the various tutorials. Despite these barriers, I was successful! In this tutorial, I will break down how to collect Twitter data and display it on a map in a way that even novice coders can understand. - -Programming and development - -* [New Python content][1] - -* [Our latest JavaScript articles][2] - -* [Recent Perl posts][3] - -* [Red Hat Developers Blog][4] - -### Create the app - -If you don't have a Twitter account, the first thing you need to do is to [create one][19]. After that, go to [apps.twitter.com][20] to create an app that allows you to collect Twitter data. Don't worry, creating the app is extremely easy. The app you create will connect to the Twitter application program interface (API). Think of an API as an electronic personal assistant of sorts. You will be using the API to ask another program to do something for you. In this case, you will be connecting to the Twitter API and asking it to collect data. Just make sure you don't ask too much, because there is a [limit][21] on how many times you can request Twitter data. - -There are two APIs that you can use to collect tweets. If you want to do a one-time collection of tweets, then you'll use the **REST API**. If you want to do a continuous collection of tweets for a specific time period, you'll use the **streaming API**. In this tutorial, I'll focus on using the REST API. - -After you create your app, go to the **Keys and Access Tokens** tab. You will need the Consumer Key (API key), Consumer Secret (API secret), Access Token, and Access Token Secret to access your app in R. - -### Collect the Twitter data - -The next step is to open R and get ready to write code. For beginners, I recommend using [RStudio][22], the integrated development environment (IDE) for R. I find using RStudio helpful when I am troubleshooting or testing code. R has a package to access the REST API called **[twitteR][8]**. - -Open RStudio and create a new RScript. Once you have done this, you will need to install and load the **twitteR** package: - -``` -install.packages("twitteR") -#installs TwitteR -library (twitteR) -#loads TwitteR -``` - -Once you've installed and loaded the **twitteR** package, you will need to enter the your app's API information from the section above: - -``` -api_key <- "" - #in the quotes, put your API key -api_secret <- "" - #in the quotes, put your API secret token -token <- "" - #in the quotes, put your token -token_secret <- "" - #in the quotes, put your token secret -``` - -Next, connect to Twitter to access the API: - -``` -setup_twitter_oauth(api_key, api_secret, token, token_secret) -``` - -Let's try doing a Twitter search about community gardens and farmers markets: - -``` -tweets <- searchTwitter("community garden OR #communitygarden OR farmers market OR #farmersmarket", n = 200, lang = "en") -``` - -This code simply says to search for the first 200 tweets **(n = 200)** in English **(lang = "en")**, which contain the terms **community garden** or **farmers market**or any hashtag mentioning these terms. - -After you have done your Twitter search, save your results in a data frame: - -``` -tweets.df <-twListToDF(tweets) -``` - -To create a map with your tweets, you will need to export what you collected into a **.csv** file: - -``` -write.csv(tweets.df, "C:\Users\YourName\Documents\ApptoMap\tweets.csv") - #an example of a file extension of the folder in which you want to save the .csv file. -``` - -Make sure you save your **R** code before running it and moving on to the next step. - -### Create the map - -Now that you have data, you can display it in a map. For this tutorial, we will make a basic app using the R package **[Leaflet][9]**, a popular JavaScript library for making interactive maps. Leaflet uses the [**magrittr**][23] pipe operator (**%>%**), which makes it easier to write code because the syntax is more natural. It might seem strange at first, but it does cut down on the amount of work you have to do when writing code. - -For the sake of clarity, open a new R script in RStudio and install these packages: - -``` -install.packages("leaflet") -install.packages("maps") -library(leaflet) -library(maps) -``` - -Now you need a way for Leaflet to access your data: - -``` -read.csv("C:\Users\YourName\Documents\ApptoMap\tweets.csv", stringsAsFactors = FALSE) -``` - -**stringAsFactors = FALSE** means to keep the information as it is and not convert it into factors. (For information about factors, read the article ["stringsAsFactors: An unauthorized biography"][24], by Roger Peng.) - -It's time to make your Leaflet map. You are going to use the **OpenStreetMap**base map for your map: - -``` -m <- leaflet(mymap) %>% addTiles() -``` - -Let's add circles to the base map. For **lng** and **lat**, enter the name of the columns that contain the latitude and longitude of your tweets followed by **~**. The **~longitude** and **~latitude** refer to the name of the columns in your **.csv** file: - -``` -m %>% addCircles(lng = ~longitude, lat = ~latitude, popup = mymap$type, weight = 8, radius = 40, color = "#fb3004", stroke = TRUE, fillOpacity = 0.8) -``` - -Run your code. A web browser should pop up and display your map. Here is a map of the tweets that I collected in the previous section: - -### [leafletmap.jpg][6] - -![Map of tweets by location](https://opensource.com/sites/default/files/leafletmap.jpg "Map of tweets by location") - -Map of tweets by location, Leaflet and OpenStreetMap, [CC-BY-SA][5] - - - -Although you might be surprised with the small number of tweets on the map, typically only 1% of tweets are geocoded. I collected a total of 366 tweets, but only 10 (around 3% of total tweets) were geocoded. If you are having trouble getting geocoded tweets, change your search terms to see if you get a better result. - -### Wrapping up - -For beginners, putting all the pieces together to create a Leaflet map from Twitter data can be overwhelming. This tutorial is based on my experiences doing this task, and I hope it makes the learning process easier for you. - - _Dorris Scott will present this topic in a workshop, [From App to Map: Collecting and Mapping Social Media Data using R][10], at the [We Rise][11] Women in Tech Conference ([#WeRiseTech][12]) June 23-24 in Atlanta._ - --------------------------------------------------------------------------------- - -作者简介: - -Dorris Scott - Dorris Scott is a PhD student in geography at the University of Georgia. Her research emphases are in Geographic Information Systems (GIS), geographic data science, visualization, and public health. Her dissertation is on combining traditional and non-traditional data about Veteran’s Affairs hospitals in a GIS interface to help patients make more informed decisions regarding their healthcare. - - ------------------ -via: https://opensource.com/article/17/6/collecting-and-mapping-twitter-data-using-r - -作者:[Dorris Scott ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/dorrisscott -[1]:https://opensource.com/tags/python?src=programming_resource_menu -[2]:https://opensource.com/tags/javascript?src=programming_resource_menu -[3]:https://opensource.com/tags/perl?src=programming_resource_menu -[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu -[5]:https://creativecommons.org/licenses/by-sa/2.0/ -[6]:https://opensource.com/file/356071 -[7]:https://opensource.com/article/17/6/collecting-and-mapping-twitter-data-using-r?rate=Rnu6Lf0Eqvepznw75VioNPWIaJQH39pZETBfu2ZI3P0 -[8]:https://cran.r-project.org/web/packages/twitteR/twitteR.pdf -[9]:https://rstudio.github.io/leaflet -[10]:https://werise.tech/sessions/2017/4/16/from-app-to-map-collecting-and-mapping-social-media-data-using-r?rq=social%20mapping -[11]:https://werise.tech/ -[12]:https://twitter.com/search?q=%23WeRiseTech&src=typd -[13]:https://opensource.com/user/145006/feed -[14]:https://opensource.com/users/jason-baker -[15]:https://creativecommons.org/licenses/by-sa/4.0/ -[16]:https://pixabay.com/en/clouds-sky-cloud-dark-clouds-1473311/ -[17]:https://pixabay.com/en/globe-planet-earth-world-1015311/ -[18]:https://creativecommons.org/publicdomain/zero/1.0/ -[19]:https://twitter.com/signup -[20]:https://apps.twitter.com/ -[21]:https://dev.twitter.com/rest/public/rate-limiting -[22]:https://www.rstudio.com/ -[23]:https://github.com/smbache/magrittr -[24]:http://simplystatistics.org/2015/07/24/stringsasfactors-an-unauthorized-biography/ -[25]:https://opensource.com/users/dorrisscott diff --git a/sources/tech/20170718 Integrate Ubuntu to Samba4 AD DC with SSSD and Realm – Part 15.md b/sources/tech/20170718 Integrate Ubuntu to Samba4 AD DC with SSSD and Realm – Part 15.md index 32a5caf4ae..513f75be09 100644 --- a/sources/tech/20170718 Integrate Ubuntu to Samba4 AD DC with SSSD and Realm – Part 15.md +++ b/sources/tech/20170718 Integrate Ubuntu to Samba4 AD DC with SSSD and Realm – Part 15.md @@ -1,3 +1,4 @@ +XYenChi is Translating Integrate Ubuntu to Samba4 AD DC with SSSD and Realm – Part 15 ============================================================ diff --git a/translated/20170620 A beginners guide to collecting and mapping Twitter data using R.md b/translated/20170620 A beginners guide to collecting and mapping Twitter data using R.md new file mode 100644 index 0000000000..a7d6c8e6cd --- /dev/null +++ b/translated/20170620 A beginners guide to collecting and mapping Twitter data using R.md @@ -0,0 +1,179 @@ + +用 R 收集和映射推特数据的初学者向导 +============================================================ + +### Learn to use R's twitteR and leaflet packages, which allow you to map the location of tweets on any topic. + +![用 R 收集和映射推特数据的初学者向导](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/cloud-globe.png?itok=H4f-RAz_ "用 R 收集和映射推特数据的初学者向导") +Image by :  + +[琼斯·贝克][14]. [CC BY-SA 4.0][15]. 来源: [Cloud][16], [Globe][17]. Both [CC0][18]. + +当我开始学习 R ,出于研究的目的我也需要学习如何收集推特数据并对其进行映射。尽管网上关于这个话题的信息很多,但我发觉难以理解什么与收集并映射推特数据相关。我不仅是个 R 新手,而且对不同教程中技术关系不熟悉。尽管困难重重,我成功了!在这个教程里,我将以一种新手程序员都能看懂的方式攻略如何收集推特数据并将至展现在地图中。 + +程序设计和开发 + +* [新 Python 内容][1] + +* [我们最新的 JavaScript 文章][2] + +* [ Perl 近期投递][3] + +* [红帽子开发者博客][4] + +### 创建应用程序 + +如果你没有推特帐号,首先你需要 [注册一个][19].然后, 到  [apps.twitter.com][20] 创建一个允许你收集推特数据应用程序。别担心,创建应用程序极其简单。你创建的应用程序会与推特应用程序接口(API)相连。 想象 API 是一个多功能电子个人助手。你可以使用 API 让其他程序帮你做事。这样一来,你可以接入推特 API 令其收集数据。只需确保不要请求太多,因为推特数据请求次数是有[限制][21] 的。 + +收集推文有两个可用的 API 。你若想做一次性的推文收集,那么使用 **REST API**. 若是想在特定时间内持续收集,可以用 **streaming API**。教程中我主要使用 REST API. + +创建应用程序之后,前往 **Keys and Access Tokens** 标签。你需要 Consumer Key (API key), Consumer Secret (API secret), Access Token, 和 Access Token Secret 来在 R 中访问你的应用程序。 + +### 收集推特数据 + +下一步是打开 R 准备写代码。对于初学者,我推荐使用 [RStudio][22], R 的集成开发环境 (IDE) 。我发现 RStudio 在解决问题和测试代码时很实用。 R 有访问 REST API 的包叫 **[twitteR][8]**. + +打开 RStudio 并新建 RScript。做好这些之后,你需要安装和加载 **twitteR** 包: + +``` +install.packages("twitteR") +#installs TwitteR +library (twitteR) +#loads TwitteR +``` + +安装并载入 **twitteR** 包之后,你得输入上文提及的应用程序的 API 信息: + +``` +api_key <- "" + #in the quotes, put your API key +api_secret <- "" + #in the quotes, put your API secret token +token <- "" + #in the quotes, put your token +token_secret <- "" + #in the quotes, put your token secret +``` + +接下来,连接推特访问 API: + +``` +setup_twitter_oauth(api_key, api_secret, token, token_secret) +``` + +我们来试试有关社区花园和农夫市场的推特研究: + +``` +tweets <- searchTwitter("community garden OR #communitygarden OR farmers market OR #farmersmarket", n = 200, lang = "en") +``` + +代码意思是搜索前200篇 **(n = 200)**英文 **(lang = "en")**推文, 包括关键词 **community garden** 或 **farmers market**或任何提及这些关键词的话题标签。 + +推特搜索完成之后,在数据框中保存你的结果: + +``` +tweets.df <-twListToDF(tweets) +``` + +为了用推文创建地图,你需要收集的导出为 **.csv** 文件: + +``` +write.csv(tweets.df, "C:\Users\YourName\Documents\ApptoMap\tweets.csv") + #an example of a file extension of the folder in which you want to save the .csv file. +``` + +运行前确保 **R** 代码已保存然后继续进行下一步。. + +### 生成地图 + +现在你有了可以展示在地图上的数据。在此教程中,我们将用一个 R 包 **[Leaflet][9]**做一个基本的应用程序,一个热门 JavaScript 库做交互式地图。 Leaflet 使用 [**magrittr**][23] 管道运算符 (**%>%**), 使得它易于写代码因为语法更加自然。刚接触可能有点奇怪,但它确实降低了写代码的工作量。 + +为了清晰度,在 RStudio 打开一个新的 R 脚本安装这些包: + +``` +install.packages("leaflet") +install.packages("maps") +library(leaflet) +library(maps) +``` + +现在需要一个路径让 Leaflet 访问你的数据: + +``` +read.csv("C:\Users\YourName\Documents\ApptoMap\tweets.csv", stringsAsFactors = FALSE) +``` + +**stringAsFactors = FALSE** 意思是保留信息,不将它转化成 factors. (想了解 factors,读这篇文章["stringsAsFactors: An unauthorized biography"][24], by Roger Peng.) + +是时候制作你的 Leaflet 地图了。你将使用 **OpenStreetMap**基本地图来做你的地图: + +``` +m <- leaflet(mymap) %>% addTiles() +``` + +我们来给基本地图加个范围。对于 **lng** 和 **lat**, 添加列名包括推文的经纬度,前面加个**~**。 **~longitude** 和 **~latitude** 在你的 **.csv** 文件中与列名相关的: + +``` +m %>% addCircles(lng = ~longitude, lat = ~latitude, popup = mymap$type, weight = 8, radius = 40, color = "#fb3004", stroke = TRUE, fillOpacity = 0.8) +``` + +运行你的代码。一个网页浏览器将会弹出并展示你的地图。这是我前面收集的推文的地图: + +### [leafletmap.jpg][6] + +![推文定位地图](https://opensource.com/sites/default/files/leafletmap.jpg "推文定位地图") + +用定位、 Leaflet 和 OpenStreetMap 的推文地图, [CC-BY-SA][5] + + + +虽然你可能会对地图上的图文数量如此之小感到惊奇,典型地,只有1%的推文被地理编码了。我收集了总数为366的推文,但只有10(大概总推文的3%)是被地理编码了的。如果为能得到地理编码过的推文困扰,改变搜索关键词看看能不能得到更好的结果。 + +### 总结 + +对于初学者,把所有碎片结合起来去从推特数据生成一个 Leaflet 地图可能很艰难。 这个教程基于我完成这个任务的经验,我希望它能让你的学习过程变得更轻松。 + + _Dorris Scott 将会在研讨会上提出这个话题, [从应用程序到地图: 用 R 收集映射社会媒体数据][10], at the [We Rise][11] Women in Tech Conference ([#WeRiseTech][12]) 六月 23-24 在亚特兰大。_ + +-------------------------------------------------------------------------------- + +作者简介: + +Dorris Scott - Dorris Scott 是佐治亚大学的地理学博士生。她的研究重心是地理信息系统 (GIS), 地理数据科学, 可视化和公共卫生。她的论文是在一个 GIS 系统接口联系退伍军人福利医院的传统和非传统数据,帮助病人为他们的健康状况作出更为明朗的决定。 + + +----------------- +via: https://opensource.com/article/17/6/collecting-and-mapping-twitter-data-using-r + +作者:[Dorris Scott ][a] +译者:[XYenChi](https://github.com/XYenChi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/dorrisscott +[1]:https://opensource.com/tags/python?src=programming_resource_menu +[2]:https://opensource.com/tags/javascript?src=programming_resource_menu +[3]:https://opensource.com/tags/perl?src=programming_resource_menu +[4]:https://developers.redhat.com/?intcmp=7016000000127cYAAQ&src=programming_resource_menu +[5]:https://creativecommons.org/licenses/by-sa/2.0/ +[6]:https://opensource.com/file/356071 +[7]:https://opensource.com/article/17/6/collecting-and-mapping-twitter-data-using-r?rate=Rnu6Lf0Eqvepznw75VioNPWIaJQH39pZETBfu2ZI3P0 +[8]:https://cran.r-project.org/web/packages/twitteR/twitteR.pdf +[9]:https://rstudio.github.io/leaflet +[10]:https://werise.tech/sessions/2017/4/16/from-app-to-map-collecting-and-mapping-social-media-data-using-r?rq=social%20mapping +[11]:https://werise.tech/ +[12]:https://twitter.com/search?q=%23WeRiseTech&src=typd +[13]:https://opensource.com/user/145006/feed +[14]:https://opensource.com/users/jason-baker +[15]:https://creativecommons.org/licenses/by-sa/4.0/ +[16]:https://pixabay.com/en/clouds-sky-cloud-dark-clouds-1473311/ +[17]:https://pixabay.com/en/globe-planet-earth-world-1015311/ +[18]:https://creativecommons.org/publicdomain/zero/1.0/ +[19]:https://twitter.com/signup +[20]:https://apps.twitter.com/ +[21]:https://dev.twitter.com/rest/public/rate-limiting +[22]:https://www.rstudio.com/ +[23]:https://github.com/smbache/magrittr +[24]:http://simplystatistics.org/2015/07/24/stringsasfactors-an-unauthorized-biography/ +[25]:https://opensource.com/users/dorrisscott From 20b8b55776bb488000ed0e979a73b3257862ce3a Mon Sep 17 00:00:00 2001 From: wxy Date: Mon, 7 Aug 2017 18:21:37 +0800 Subject: [PATCH 0932/1407] PRF&PUB:20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md @firmianay --- ...rchy Standard Shows Which Bits Are Boss.md | 99 +++++++++++++++++++ ...rchy Standard Shows Which Bits Are Boss.md | 91 ----------------- 2 files changed, 99 insertions(+), 91 deletions(-) create mode 100644 published/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md delete mode 100644 translated/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md diff --git a/published/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md b/published/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md new file mode 100644 index 0000000000..a44afd5ddb --- /dev/null +++ b/published/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md @@ -0,0 +1,99 @@ +文件系统层次标准(FHS)简介 +============================================================ +![linux](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2016-linux-1.jpg) + +当你好奇地看着系统的根目录(`/`)的时候,可能会发现自己有点不知所措。大多数三个字母的目录名称并没有告诉你它们是做什么的,如果你需要做出一些重要的修改,那就很难知道在哪里可以查看。 + +我想给那些没有深入了解过自己的根目录的人简单地介绍下它。 + +### 有用的工具 + +在我们开始之前,这里有几个需要熟悉的工具,它们可以让您随时挖掘那些您自己找到的有趣的东西。这些程序都不会对您的文件进行任何更改。 + +最有用的工具是 `ls` -- 它列出了使用完整路径或相对路径(即从当前目录开始的路径)作为参数给出的任何目录的内容。 + +``` +$ ls  路径 +``` + +当您进一步深入文件系统时,重复输入长路径可能会变得很麻烦,所以如果您想简化这一操作,可以用 `cd` 替换 `ls` 来更改当前的工作目录到该目录。与 `ls` 一样,只需将目录路径作为 `cd` 的参数。 + +``` +$ cd  路径 +``` + +如果您不确定某个文件是什么文件类型的,可以通过运行 `file` 并且将文件名作为 `file` 命令的参数。 + +``` +$ file  文件名 +``` + +最后,如果这个文件看起来像是适宜阅读的,那么用 `less` 来看看(不用担心文件有改变)。与最后一个工具一样,给出一个文件名作为参数来查看它。 + +``` +$ less  文件名 +``` + +完成文件翻阅后,点击 `q` 键退出,即可返回到您的终端。 + +### 根目录之旅 + +现在就开始我们的旅程。我将按照字母顺序介绍直接放在根目录下的目录。这里并没有介绍所有的目录,但到最后,我们会突出其中的亮点。 + +我们所有要遍历的目录的分类及功能都基于 Linux 的文件系统层次标准(FHS)。[Linux 基金会][4]维护的 Linux FHS 帮助发行版和程序的设计者和开发人员来规划他们的工具的各个组件应该存放的位置。 + +通过将各个程序的所有文件、二进制文件和帮助手册保存在一致的组织结构中,FHS 让对它们的学习、调试或修改更加容易。想象一下,如果不是使用 `man` 命令找到使用指南,那么你就得对每个程序分别寻找其手册。 + +按照字母顺序和结构顺序,我们从 `/bin` 开始。该目录是存放所有核心系统二进制文件的地方,其包含的命令可以在 shell (解释终端指令的程序)中使用。没有这个目录的内容,你的系统就基本没法使用。 + +接下来是 `/boot` 目录,它存储了您的计算机启动所需的所有东西。其中最重要的是引导程序和内核。引导程序是一个通过初始化一些基础工具,使引导过程得以继续的程序。在初始化结束时,引导程序会加载内核,内核允许计算机与所有其它硬件和固件进行接口。从这一点看,它可以使整个操作系统工作起来。 + +`/dev` 目录用于存储类似文件的对象来表示被系统识别为“设备”的各种东西。这里包括许多显式的设备,如计算机的硬件组件:键盘、屏幕、硬盘驱动器等。 + +此外,`/dev` 还包含被系统视为“设备”的数据流的伪文件。一个例子是流入和流出您的终端的数据,可以分为三个“流”。它读取的信息被称为“标准输入”。命令或进程的输出是“标准输出”。最后,被分类为调试信息的辅助性输出指向到“标准错误”。终端本身作为文件也可以在这里找到。 + +`/etc`(发音类似工艺商业网站 “Etsy”,如果你想让 Linux 老用户惊艳一下的话,囧),许多程序在这里存储它们的配置文件,用于改变它们的设置。一些程序存储这里的是默认配置的副本,这些副本将在修改之前复制到另一个位置。其它的程序在这里存储配置的唯一副本,并期望用户可以直接修改。为 root 用户保留的许多程序常用一种配置模式。 + +`/home` 目录是用户个人文件所在的位置。对于桌面用户来说,这是您花费大部分时间的地方。对于每个非特权用户,这里都有一个具有相应名称的目录。 + +`/lib` 是您的系统赖以运行的许多库的所在地。许多程序都会重复使用一个或多个功能或子程序,它们经常会出现在几十上百个程序中。所以,如果每个程序在其二进制文件中重复写它需要的每一个组件,结果会是产生出一些大而无当的程序,作为更好的替代方案,我们可以通过进行“库调用”来引用这些库中的一个或多个。 + +在 `/media` 目录中可以访问像 USB 闪存驱动器或摄像机这样的可移动媒体。虽然它并不是所有系统上都有,但在一些专注于直观的桌面系统中还是比较普遍的,如 Ubuntu。具有存储能力的媒体在此处被“挂载”,这意味着当设备中的原始位流位于 `/dev` 目录下时,用户通常可以在这里访问那些可交互的文件对象。 + +`/proc` 目录是一个动态显示系统数据的虚拟文件系统。这意味着系统可以即时地创建 `/proc` 的内容,用包含运行时生成的系统信息(如硬件统计信息)的文件进行填充。 + +`/tmp` 正如其名字,用于放置缓存数据等临时信息。这个目录不做其他更多的事情。 + +现代 Linux 系统上大多数程序的二进制文件保存在 `/usr` 目录中。为了统一包含二进制文件的各种目录,`/usr` 包含 `/bin`、`/sbin` 和 `/lib` 中的所有内容的副本。 + +最后,`/var` 里保存“可变variable”长度的数据。这里的可变长度数据的类型通常是会累积的数据,就像日志和缓存一样。一个例子是你的内核保留的日志。 + +为了避免硬盘空间用尽和崩溃的情况,`/var` 内置了“日志旋转”功能,可删除旧信息,为新信息腾出空间,维持固定的最大大小。 + +### 结尾 + +正如我所说,这里介绍的绝对不是您在根目录中可以找到的一切,但是确定系统核心功能所在地是一个很好的开始,而且可以更深入地研究这些功能是什么。 + +所以,如果你不知道要学习什么,就可能有很多的想法。如果你想得到一个更好的想法,就在这些目录中折腾自己吧! + +-------------------------------------------------------------------------------- + +作者简介: + +自 2017 年以来 Jonathan Terrasi 一直是 ECT 新闻网的专栏作家。他的主要兴趣是计算机安全(特别是 Linux 桌面),加密和分析政治和时事。他是全职自由作家和音乐家。他的背景包括在芝加哥委员会发表的保卫人权法案文章中提供技术评论和分析。 + +------ + + +via: http://www.linuxinsider.com/story/84658.html + +作者:[Jonathan Terrasi][a] +译者:[firmianay](https://github.com/firmianay) +校对:[wxy](https://github.com/wxy) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:http://www.linuxinsider.com/perl/mailit/?id=84658 +[1]:http://www.linuxinsider.com/story/84658.html?rss=1# +[2]:http://www.linuxinsider.com/perl/mailit/?id=84658 +[4]:http://www.linuxfoundation.org/ diff --git a/translated/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md b/translated/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md deleted file mode 100644 index 15f1cec927..0000000000 --- a/translated/tech/20170711 The Filesystem Hierarchy Standard Shows Which Bits Are Boss.md +++ /dev/null @@ -1,91 +0,0 @@ -文件系统层次标准(FHS)简介 -============================================================ -![linux](http://www.linuxinsider.com/article_images/story_graphics_xlarge/xl-2016-linux-1.jpg) - -当你好奇地看着系统的根目录(“/”)的时候,可能会发现自己有点不知所措。大多数三个字母的目录名称并没有告诉你他们是做什么的,如果你需要做出一些重要的修改,那就很难知道在哪里可以查看。 - -我想给大家简单地介绍下根目录。 - -### 有用的工具 - -在我们开始之前,这里有几个值得熟悉的工具,它们可以让您随时挖掘您自己找到的有趣的东西。这些程序都不会对您的文件进行任何更改。 - -最有用的工具是 “ls” -- 它列出了使用完整路径或相对路径(即从当前目录开始的路径)作为参数给出的任何目录的内容。 - -$ ls  _path_ - -当您进一步深入文件系统时,重复输入长路径可能会变得很麻烦,所以如果您想简化这一操作,可以用 “cd” 替换 “ls” 来更改当前的工作目录到该目录。与 “ls” 一样,只需将目录路径作为 “cd” 的参数。 - -$ cd  _path_ - -如果您不确定某个文件是什么文件类型的,可以通过运行 “file” 并且将文件名作为“file” 命令的参数。 - -$ file  _filename_ - -最后,如果这个文件看起来像是人可读的,那么用 “less” 来看看(不用担心文件有改变)。与最后一个工具一样,给出一个文件名作为参数来查看它。 - -$ less  _filename_ - -完成文件扫描后,点击 “q” 退出,即可返回到您的终端。 - -### 根目录之旅 - -现在就开始我们的旅程。我将按照字母顺序介绍直接在根目录下的目录。这里并没有介绍所有的目录,但到最后,我们会突出其中的亮点。 - -我们将要完成的目录的所有分类和功能都基于 Linux 文件系统层次标准(FHS)。[Linux基金会][4]维护的 Linux FHS 通过规定其工具的各个组件应该存放的位置,帮助设计师和开发人员进行发行版和程序的开发。 - -通过将所有文件,二进制文件和手册保存在程序中的一致性组织中,FHS 让学习、调试或修改更加容易。想象一下,如果不是使用 “man” 命令找到使用指南,那么你就不得不寻找每个程序的手册。 - -按照字母顺序和结构顺序,我们从 “**/bin**” 开始。该目录是包含 shell 命令的所有核心系统二进制文件(解释终端指令的程序)。没有这个目录的内容,你的系统就不能做很多事情。 - -接下来是 “**/boot**” 目录,它存储了您的计算机需要启动的所有东西。其中最重要的是引导程序和内核。引导程序是一个通过初始化一些基础工具,使引导过程继续进行的程序。在初始化结束时,引导程序会加载内核,内核允许计算机与所有其他硬件和固件进行接口。从这一点看,它可以持续地使整个操作系统工作。 - -“**/dev**” 目录是表示被系统识别为“设备”的所有文件的对象。这里包括许多显式的设备,如计算机的硬件组件:键盘,屏幕,硬盘驱动器等。 - -此外,“/dev” 还包含被系统视为“设备”的数据流的伪文件。一个例子是流入和流出您的终端的数据,可以分为三个“流”。它读取的信息被称为“标准输入”。命令或进程的输出是“标准输出”。最后,分类为调试信息的辅助输出指向“标准错误”。终端本身作为文件也可以在这里找到。 - -“**/etc**”(发音类似工艺商业网站 “Etsy”,如果你想打动 Linux 老用户的话),许多程序在这里存储他们的配置文件,用于改变他们的设置。一些程序存储这里的是默认配置的副本,这些副本将在修改之前复制到另一个位置。其他的程序在这里存储配置的唯一副本,并期望用户可以直接修改。为 root 用户保留的许多程序取决于后一种配置模式。 - -“**/home**” 目录是用户个人文件所在的位置。对于桌面用户来说,这是您花费大部分时间的地方。对于每个非特权用户,这里都有一个具有相应名称的目录。 - -“**/lib**” 是您的系统依赖运行的许多库的所在地。许多程序都会重复使用一个或多个在几十上百个程序中常见的功能或子程序。所以,如果每个程序在其二进制文件中重写它需要的每一个组件,结果会是产生出一些大而无用的程序,作为更好的替代方案,我们可以通过进行“库调用”来引用这些库中的一个或多个。 - -在 “**/media**” 目录中可以访问像 USB 闪存驱动器或摄像机这样的可移动媒体。虽然它不存在于所有系统上,但在一些专注于直观桌面的系统中还是比较普遍的,如 Ubuntu。具有存储能力的媒体在此处被“挂载”,这意味着当设备中的原始位流位于 “/dev” 目录下时,用户通常可以在这里访问那些可交互的文件对象。 - -“**/proc**” 目录是一个动态显示系统数据的虚拟文件系统。这意味着系统可以即时地创建 “/proc” 的内容,用包含运行时生成系统信息(如硬件统计信息)的文件进行填充。 - -“**/tmp**” 恰好足够的用于发送缓存数据等临时信息。这个目录不做其他更多的事情。 - -现代 Linux 系统上大多数程序的二进制文件保存在 “**/usr**” 目录中。为了统一包含二进制文件的各种目录,“/usr” 包含 “/bin”、“/sbin” 和 “/lib” 中的所有内容的副本。 - -最后,“**/var**” 里保存“可变”长度的数据。这里的可变长度数据的类型通常是会累积的数据,就像日志和缓存一样。一个例子是你的内核保留的日志。 - -为了保持硬盘远离空间用尽和崩溃的情况,“/var” 内置了“日志旋转”功能,可删除旧信息,为新信息腾出空间,维持固定的最大大小。 - -### 结尾 - -正如我所说,这里介绍的绝对不是您在根目录中可以找到的一切,但是确定系统核心功能所在地是一个很好的开始,而且可以更深入地研究这些功能是什么。 - -所以,如果你不知道要学习什么,就可能有很多的想法。如果你想得到一个更好的想法,就在这些目录中折腾自己吧! - --------------------------------------------------------------------------------- - -作者简介: - -自 2017 年以来 Jonathan Terrasi 一直是 ECT 新闻网的专栏作家。他的主要兴趣是计算机安全(特别是 Linux 桌面),加密和分析政治和时事。他是全职自由作家和音乐家。他的背景包括在芝加哥委员会发表的保卫人权法案文章中提供技术评论和分析。 - ------- - - -via: http://www.linuxinsider.com/story/84658.html - -作者:[Jonathan Terrasi ][a] -译者:[firmianay](https://github.com/firmianay) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:http://www.linuxinsider.com/perl/mailit/?id=84658 -[1]:http://www.linuxinsider.com/story/84658.html?rss=1# -[2]:http://www.linuxinsider.com/perl/mailit/?id=84658 -[4]:http://www.linuxfoundation.org/ From b7fc688ed5d1d6e7da69fb45ca42c5c1be319b42 Mon Sep 17 00:00:00 2001 From: sugarfillet <1911093465@qq.com> Date: Mon, 7 Aug 2017 23:32:02 +0800 Subject: [PATCH 0933/1407] translating by sugarfillet --- .../tech/20170711 Functional testing Gtk applications in C.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170711 Functional testing Gtk applications in C.md b/sources/tech/20170711 Functional testing Gtk applications in C.md index f2b211372f..717796f8c4 100644 --- a/sources/tech/20170711 Functional testing Gtk applications in C.md +++ b/sources/tech/20170711 Functional testing Gtk applications in C.md @@ -1,3 +1,4 @@ +translating by sugarfillet Functional testing Gtk+ applications in C ============================================================ From 08497ba2feea66360a3218b9c5622196bf2ce8b1 Mon Sep 17 00:00:00 2001 From: rieonke Date: Mon, 7 Aug 2017 23:35:14 +0800 Subject: [PATCH 0934/1407] translated --- ...RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md | 106 ------------------ ...RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md | 101 +++++++++++++++++ 2 files changed, 101 insertions(+), 106 deletions(-) delete mode 100644 sources/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md create mode 100644 translated/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md diff --git a/sources/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md b/sources/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md deleted file mode 100644 index 21117c34f6..0000000000 --- a/sources/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md +++ /dev/null @@ -1,106 +0,0 @@ -> translating by rieon - -DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS -============================================================ - - -Today marks an important milestone for the Open Container Initiative (OCI) with the release of the OCI v1.0 runtime and image specifications – a journey that Docker has been central in driving and navigating over the last two years. It has been our goal to provide low-level standards as building blocks for the community, customers and the broader industry. To understand the significance of this milestone, let’s take a look at the history of Docker’s growth and progress in developing industry-standard container technologies. - -The History of Docker Runtime and Image Donations to the OCI - -Docker’s image format and container runtime quickly emerged as the de facto standard following its release as an open source project in 2013\. We recognized the importance of turning it over to a neutral governance body to fuel innovation and prevent fragmentation in the industry. Working together with a broad group of container technologists and industry leaders, the Open Container Project was formed to create a set of container standards and was launched under the auspices of the Linux Foundation in June 2015 at DockerCon. It became the Open Container Initiative (OCI) as the project evolved that Summer. - -Docker contributed runc, a reference implementation for the container runtime software that had grown out of Docker employee [Michael Crosby’s][17] libcontainer project. runc is the basis for the runtime specification describing the life-cycle of a container and the behavior of a container runtime. runc is used in production across tens of millions of nodes, which is an order of magnitude more than any other code base. runc became the reference implementation for the runtime specification project itself, and continued to evolve with the project.   - -Almost a year after work began on the runtime specification, a new working group formed to specify a container image format. Docker donated the Docker V2 Image Format to the OCI as the basis for the image specification. With this donation, the OCI defines the data structures — the primitives — that make up a container image. Defining the container image format is an important step for adoption, but it takes a platform like Docker to activate its value by defining and providing tooling on how to build images, manage them and ship them around. For example, things such as the Dockerfile are not included in the OCI specifications. - -Title: Docker’s History of Contribution to the OCI - -![Docker and OCI](https://i2.wp.com/blog.docker.com/wp-content/uploads/OCI.png?resize=938%2C1491&ssl=1) - -The Journey to Open Container Standards - -The specifications have continued to evolve for two years now. Smaller projects have been spun out of the runc reference implementation as the code has been refactored, as well as support testing tools that will become the test suite for certification. - -See the timeline above for details about Docker’s involvement in shaping OCI, which includes: creating runc, iterating on the runtime specification with the community, creating containerd to integrate runc in Docker 1.11, donating the Docker V2 Image Format to OCI as a base for the image format specification, implementing that specification in [containerd][18] so that this core container runtime covers both the runtime and image format standards, and finally donating containerd to the Cloud Native Computing Foundation (CNCF) and iterating on it towards a 1.0 alpha release this month. - -Maintainers [Michael Crosby][19] and [Stephen Day][20] have lead the development of these specifications and have been instrumental in bringing v1.0 to fruition, alongside contributions from Alexander Morozov, Josh Hawn, Derek McGown and Aaron Lehmann, as well as Stephen Walli participating in the certification working group. - -Docker remains committed to driving container standards, building a strong base at the layers where everyone agrees so that the industry can innovate at the layers that are still very differentiated. - -Open Standards are Only a Piece of the Puzzle - -Docker is a complete platform for creating, managing, securing, and orchestrating containers and container images. The vision has always been a base of industry standard specifications that support open source components or the plumbing of a container solution. The Docker platform sits above this layer – providing users and customers with a secure container management solution from development through production.   - -The OCI runtime and image specifications become the dependable standards base that allow and encourage the greatest number of container solutions and at the same time, they do not restrict product innovation or shutout major contributors. To draw a comparison, TCP/IP, HTTP and HTML became the dependable standards base upon which the World Wide Web was built over the past 25 years. Companies continue to innovate with new tools, technologies and browsers on these standards. The OCI specifications provide the similar foundation for containers solutions going forward. - -Open source projects also play a role in providing components for product development. The OCI runc reference implementation is used by the containerd project, a larger container runtime responsible for image transfer and storage, container execution and supervision, and low-level functions to support storage and network attachments. The containerd project was contributed by Docker to the CNCF and sits alongside other important projects to support cloud native computing solutions. - -Docker uses containerd and more of its own core open source infrastructure elements like the LinuxKit, InfraKit and Notary projects to build and secure container solutions that become the Docker Community Edition tools. Users and organizations looking for complete container platforms that are holistic and provide container management, security, orchestration, networking and more can look to Docker Enterprise Edition. - -![Docker Stack](https://i0.wp.com/blog.docker.com/wp-content/uploads/243938a0-856b-4a7f-90ca-2452a69a385c-1.jpg?resize=1019%2C511&ssl=1) - -> This diagram highlights that the OCI specifications provide a layer of standards, implemented by a container runtime: containerd and runc. To assemble a full container platform such as Docker with full container lifecycle workflow, many other components are brought together: to manage infrastructure (InfraKit), provide an operating system (LinuxKit), deliver orchestration (SwarmKit), ensure security (Notary). - -What’s Next for the OCI - -We should celebrate the efforts of the developers as the runtime and image specifications are published. The next critical work to be done by the Open Container Initiative is to deliver a certification program to validate claims from implementers that their products and projects do indeed conform to the runtime and image specifications. The [Certification Working Group][21] has been putting together a program that in conjunction with a developing suite of test tools for both the [runtime][22] and [image][23] specifications will show how implementations fare against the standards. - -At the same time, the developers of the current specifications are considering the next most important areas of container technology to specify. Work is underway around a common networking interface for containers in the Cloud Native Computing Foundation, but work to support signing and distribution are areas under consideration for the OCI. - -Alongside the OCI and its members, Docker remains committed to standardizing container technology. The OCI’s mission is to give users and companies the baseline on which they can innovate in the areas of developer tooling, image distribution, container orchestration, security, monitoring and management. Docker will continue to lead the charge in innovation – not only with tooling that increases productivity and increases efficiencies, but also by empowering users, partners and customers to innovate as well. - -**Learn more about OCI and Open Source at Docker:** - -* Read about the [OCI specifications Myths][1] - -* Visit the [Open Container Initiative website][2] - -* Visit the [Moby Project website][3] - -* Attend [DockerCon Europe 2017][4] - -* Attend the [Moby Summit LA][5] alongside OSS NA - --------------------------------------------------------------------------------- - -作者简介: - -Patrick Chanezon is member of technical staff at Docker Inc. He helps to build Docker, an open platform for distributed applications for developers and sysadmins. Software developer and storyteller, he spent 10 years building platforms at Netscape & Sun, then 10 years evangelizing platforms at Google, VMware & Microsoft. His main professional interest is in building and kickstarting the network effect for these wondrous two-sided markets called Platforms. He has worked on platforms for Portals, Ads, Commerce, Social, Web, Distributed Apps, and Cloud. More information is available at linkedin.com/in/chanezon. Patrick tweets at @chanezon. - - - ------- - -via: https://blog.docker.com/2017/07/oci-release-of-v1-0-runtime-and-image-format-specifications/ - -作者:[Patrick Chanezon ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://blog.docker.com/author/chanezon/ -[1]:https://blog.docker.com/2017/07/demystifying-open-container-initiative-oci-specifications/ -[2]:https://www.opencontainers.org/join -[3]:http://mobyproject.org/ -[4]:https://europe-2017.dockercon.com/ -[5]:https://www.eventbrite.com/e/moby-summit-los-angeles-tickets-35930560273 -[6]:https://blog.docker.com/author/chanezon/ -[7]:https://blog.docker.com/tag/cncf/ -[8]:https://blog.docker.com/tag/containerd/ -[9]:https://blog.docker.com/tag/containers/ -[10]:https://blog.docker.com/tag/docker/ -[11]:https://blog.docker.com/tag/docker-image-format/ -[12]:https://blog.docker.com/tag/docker-runtime/ -[13]:https://blog.docker.com/tag/infrakit/ -[14]:https://blog.docker.com/tag/linux-foundation/ -[15]:https://blog.docker.com/tag/oci/ -[16]:https://blog.docker.com/tag/open-containers/ -[17]:https://github.com/crosbymichael -[18]:https://containerd.io/ -[19]:https://github.com/crosbymichael -[20]:https://github.com/stevvooe -[21]:https://github.com/opencontainers/certification -[22]:https://github.com/opencontainers/runtime-tools -[23]:https://github.com/opencontainers/image-tools diff --git a/translated/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md b/translated/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md new file mode 100644 index 0000000000..34f42798e4 --- /dev/null +++ b/translated/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md @@ -0,0 +1,101 @@ +Docker 领导 OCI 发布容器运行时和镜像格式规范 V1.0 +============================================================ + +今天是开放容器计划(OCI)的一个重要里程碑,OCI 发布了容器运行时和镜像规范的 1.0 版本,而Docker 在这过去两年中一直充当着驱动和领航的核心角色。我们的目标是为社区、客户以及更广泛的容器行业提供底层的标准。要了解这一里程碑的意义,我们先来看看 Docker 在开发容器技术行业标准方面的成长和发展历史。 + +**Docker 将运行时和镜像捐赠给 OCI 的历史** + +Docker 的镜像格式和容器运行时在 2013 年作为开源项目发布后,迅速成为事实上的标准。我们认识到将其转交给中立管理机构管理,以加强创新和防止行业碎片化的重要性。我们与广泛的容器技术人员和行业领导者合作,成立了开放容器项目(Open Container Project)来制定了一套容器标准,并在 Linux 基金会的支持下,于 2015 年 6 月在 Docker 大会(DockerCon)上推出。最终在那个夏天演变成为开放容器计划(Open Container Initiative ,OCI)。 + +Docker 贡献了 runc ,这是从 Docker 员工 [Michael Crosby] [17] 的 libcontainer 项目中发展而来的容器运行时参考实现。 runc 是描述容器生命周期和运行时行为的运行时规范的基础。runc 被用在数千万个节点的生产环境中,这比任何其他代码库都要大一个数量级。runc 已经成为运行时规范的参考实现,并且随着项目的进展而不断发展。 + +在运行时规范制定工作开始近一年后,我们组建了一个新的工作组来制定镜像格式的规范。 Docker 将 Docker V2 镜像格式捐赠给 OCI 作为镜像规范的基础。通过这次捐赠,OCI 定义了构成容器镜像的数据结构(原始镜像)。定义容器镜像格式是一个至关重要的步骤,但它需要一个像 Docker 这样的平台通过定义和提供构建、管理和发布镜像的工具来实现它的价值。 例如,Dockerfile 等内容并不包括在 OCI 规范中。 + +**标题:Docker 为 OCI 贡献的历史** + +![Docker 和 OCI](https://i2.wp.com/blog.docker.com/wp-content/uploads/OCI.png?resize=938%2C1491&ssl=1) + +**开放容器标准化之旅** + +这个规范已经持续开发了两年。随着代码的重构,小型项目已经从 runc 参考实现中脱颖而出,并支持即将发布的认证测试工具。 + +有关 Docker 参与塑造 OCI 的详细信息,请参阅上面的时间轴,其中包括:创建 runc ,和社区一起更新迭代运行时规范,创建 containerd 以便于将 runc 集成到 Docker 1.11 中,将 Docker V2 镜像格式贡献给 OCI 作为其础镜像格式规范的基础,并在 [containerd][18] 中实现该规范,使得该核心容器运行时同时涵盖了运行时和镜像格式标准,最后将 containerd 捐赠给了云计算基金会(CNCF),并将其更新到 1.0 alpha 版本于本月发布。 + +维护者 [Michael Crosby][19] 和 [Stephen Day][20] 引导了这些规范的发展,并且为 v1.0 版本的实现提供了极大的帮助,以及 Alexander Morozov,Josh Hawn,Derek McGown 和 Aaron Lehmann 也贡献了代码,以及Stephen Walli 参加了认证工作组。 + +Docker 仍然致力于推动容器标准化进程,在每个人都认可的层面建立起坚实的基础,使整个容器行业能够在依旧十分差异化的层面上进行创新。 + +**开放标准只是一小块拼图** + +Docker 是一个完整的平台,用于创建、管理、保护和编排容器以及镜像。该项目的愿景始终是致力于成为支持开源组件的行业规范的基石,或着是容器解决方案的校准铅锤。Docker 平台正位于此层之上 -- 为客户提供从开发到生产的安全的容器管理解决方案。 + +OCI 运行时和镜像规范成为一个可靠的标准基础,允许和鼓励多样化的容器解决方案,同时它们不限制产品创新或遏制主要开发者。打一个比方,TCP/IP,HTTP 和 HTML 成为过去25年来建立万维网的可靠标准,其他公司可以继续通过这些标准的新工具、技术和浏览器进行创新。 OCI 规范也为容器解决方案提供了类似的规范基础。 + +开源项目也在为产品开发提供组件方面发挥着作用。containerd 项目就使用 OCI 的 runc 参考实现,负责镜像的传输和存储,容器运行和监控,以及支持存储和网络附件的等底层功能。containerd 项目已经被 Docker 捐赠给了 CNCF ,与其他重要项目一起支持云计算解决方案。 + +Docker 使用了 containerd 和其他自己的核心开源基础设施组件,如 LinuxKit,InfraKit 和 Notary 等项目来构建和保护 Docker 社区版容器解决方案。正在寻找一个完整的容器平台,能提供容器管理、安全性、编排、网络和更多功能的用户和组织可以查看 Docker Enterprise Edition 。 + +![Docker 栈](https://i0.wp.com/blog.docker.com/wp-content/uploads/243938a0-856b-4a7f-90ca-2452a69a385c-1.jpg?resize=1019%2C511&ssl=1) + +> 这张图强调了 OCI 规范提供了一个由容器运行时实现的标准层:containerd 和 runc。 要组装一个完整的、具有完整容器生命周期和工作流程的容器平台,如 Docker,需要和许多其他的组件集成在一起:管理基础架构的 InfraKit,提供操作系统的 LinuxKit,交付编排的 SwarmKit,确保安全性的 Notary。 + +**OCI 下一步该干什么** + +随着运行时和镜像规范的发布,我们应该庆祝开发者的努力。开放容器计划的下一个关键工作是提供认证计划,以验证实现者的产品和项目确实符合运行时和镜像规范。[认证工作组][21] 已经组织了一个程序,结合了开发套件(developing suite)的[运行时][22]和[镜像][23]规范测试工具将展示产品应该如何参照标准进行实现。 + +同时,目前规范的开发者们正在考虑下一个最重要的容器技术领域。云计算基金会的通用容器网络接口开发工作已经正在进行中,支持镜像签署和分发的工作正也在 OCI 的考虑之中。 + +除了 OCI 及其成员,Docker 仍然致力于推进容器技术的标准化。 OCI 的使命是为用户和公司提供在开发人工具、镜像分发、容器编排、安全、监控和管理等方面进行创新的基准。Docker 将继续引领创新,不仅提供提高生产力和效率的工具,而且还通过授权用户,合作伙伴和客户进行创新。 + +**在 Docker 学习更过关于 OCI 和开源的信息:** + +* 阅读 [OCI 规范的误区][1] + +* 访问 [开放容器计划的网站][2] + +* 访问 [Moby 项目网站 ][3] + +* 参加 [DockerCon Europe 2017][4] + +* 参加 [Moby Summit LA][5] + +-------------------------------------------------------------------------------- + +作者简介: + +Patrick Chanezon是Docker Inc.技术人员。他的工作是帮助构建 Docker 。一个程序员和讲故事的人 (storyller),他在 Netscape 和 Sun 工作了10年的时间,又在Google,VMware 和微软工作了10年。他的主要职业兴趣是为这些奇特的双边市场“平台”建立和推动网络效应。他曾在门户网站,广告,电商,社交,Web,分布式应用和云平台上工作过。有关更多信息,请访问 linkedin.com/in/chanezon 和他的推特@chanezon。 + +------ + +via: https://blog.docker.com/2017/07/oci-release-of-v1-0-runtime-and-image-format-specifications/ + +作者:[Patrick Chanezon ][a] +译者:[rieonke](https://github.com/rieonke) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://blog.docker.com/author/chanezon/ +[1]:https://blog.docker.com/2017/07/demystifying-open-container-initiative-oci-specifications/ +[2]:https://www.opencontainers.org/join +[3]:http://mobyproject.org/ +[4]:https://europe-2017.dockercon.com/ +[5]:https://www.eventbrite.com/e/moby-summit-los-angeles-tickets-35930560273 +[6]:https://blog.docker.com/author/chanezon/ +[7]:https://blog.docker.com/tag/cncf/ +[8]:https://blog.docker.com/tag/containerd/ +[9]:https://blog.docker.com/tag/containers/ +[10]:https://blog.docker.com/tag/docker/ +[11]:https://blog.docker.com/tag/docker-image-format/ +[12]:https://blog.docker.com/tag/docker-runtime/ +[13]:https://blog.docker.com/tag/infrakit/ +[14]:https://blog.docker.com/tag/linux-foundation/ +[15]:https://blog.docker.com/tag/oci/ +[16]:https://blog.docker.com/tag/open-containers/ +[17]:https://github.com/crosbymichael +[18]:https://containerd.io/ +[19]:https://github.com/crosbymichael +[20]:https://github.com/stevvooe +[21]:https://github.com/opencontainers/certification +[22]:https://github.com/opencontainers/runtime-tools +[23]:https://github.com/opencontainers/image-tools From a536e9064eccfd74758a8da82b747f7c089fb81d Mon Sep 17 00:00:00 2001 From: Rieon Date: Mon, 7 Aug 2017 23:43:51 +0800 Subject: [PATCH 0935/1407] fixed styling mistake --- ...I RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translated/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md b/translated/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md index 34f42798e4..80b5ff505c 100644 --- a/translated/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md +++ b/translated/tech/20170719 DOCKER LEADS OCI RELEASE OF V1.0 RUNTIME AND IMAGE FORMAT SPECIFICATIONS.md @@ -7,7 +7,7 @@ Docker 领导 OCI 发布容器运行时和镜像格式规范 V1.0 Docker 的镜像格式和容器运行时在 2013 年作为开源项目发布后,迅速成为事实上的标准。我们认识到将其转交给中立管理机构管理,以加强创新和防止行业碎片化的重要性。我们与广泛的容器技术人员和行业领导者合作,成立了开放容器项目(Open Container Project)来制定了一套容器标准,并在 Linux 基金会的支持下,于 2015 年 6 月在 Docker 大会(DockerCon)上推出。最终在那个夏天演变成为开放容器计划(Open Container Initiative ,OCI)。 -Docker 贡献了 runc ,这是从 Docker 员工 [Michael Crosby] [17] 的 libcontainer 项目中发展而来的容器运行时参考实现。 runc 是描述容器生命周期和运行时行为的运行时规范的基础。runc 被用在数千万个节点的生产环境中,这比任何其他代码库都要大一个数量级。runc 已经成为运行时规范的参考实现,并且随着项目的进展而不断发展。 +Docker 贡献了 runc ,这是从 Docker 员工 [Michael Crosby][17] 的 libcontainer 项目中发展而来的容器运行时参考实现。 runc 是描述容器生命周期和运行时行为的运行时规范的基础。runc 被用在数千万个节点的生产环境中,这比任何其他代码库都要大一个数量级。runc 已经成为运行时规范的参考实现,并且随着项目的进展而不断发展。 在运行时规范制定工作开始近一年后,我们组建了一个新的工作组来制定镜像格式的规范。 Docker 将 Docker V2 镜像格式捐赠给 OCI 作为镜像规范的基础。通过这次捐赠,OCI 定义了构成容器镜像的数据结构(原始镜像)。定义容器镜像格式是一个至关重要的步骤,但它需要一个像 Docker 这样的平台通过定义和提供构建、管理和发布镜像的工具来实现它的价值。 例如,Dockerfile 等内容并不包括在 OCI 规范中。 From 81603873745469949dc52d9ea97f06ee7ac6779f Mon Sep 17 00:00:00 2001 From: rieonke Date: Tue, 8 Aug 2017 00:09:53 +0800 Subject: [PATCH 0936/1407] apply for translating --- ...ining System Services in Red Hat Enterprise Linux – Part 1.md | 1 + 1 file changed, 1 insertion(+) diff --git a/sources/tech/20170719 Containing System Services in Red Hat Enterprise Linux – Part 1.md b/sources/tech/20170719 Containing System Services in Red Hat Enterprise Linux – Part 1.md index 6f6c6fd16e..2410f2dcad 100644 --- a/sources/tech/20170719 Containing System Services in Red Hat Enterprise Linux – Part 1.md +++ b/sources/tech/20170719 Containing System Services in Red Hat Enterprise Linux – Part 1.md @@ -1,3 +1,4 @@ +> translating by rieonke Containing System Services in Red Hat Enterprise Linux – Part 1 ============================================================ From 7e17c948f411251e239af80d2fe915d2cc9ca04a Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 8 Aug 2017 08:40:04 +0800 Subject: [PATCH 0937/1407] translated --- ...nstall Zabbix on an Ubuntu 16.04 Server.md | 219 ----------------- ...nstall Zabbix on an Ubuntu 16.04 Server.md | 225 ++++++++++++++++++ 2 files changed, 225 insertions(+), 219 deletions(-) delete mode 100644 sources/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md create mode 100644 translated/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md diff --git a/sources/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md b/sources/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md deleted file mode 100644 index 2e30a1a72a..0000000000 --- a/sources/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md +++ /dev/null @@ -1,219 +0,0 @@ -translating----geekpi - -Monitoring Server: Install Zabbix on an Ubuntu 16.04 Server -============================================================ - - [![Zabbix logo](https://www.unixmen.com/wp-content/uploads/2017/06/zabbix_logo.png "zabbix_logo")][3] - -### Monitoring Server – What is Zabbix - -[Zabbix][2] is an enterprise-class open source distributed monitoring server solution. The software monitors different parameters of a network and the integrity of a server, and also allows the configuration of email based alerts for any event. Zabbix offers reporting and data visualization features based on the data stored in a database (MySQL, for example). Every metric collected by the software is accessible through a web-based interface. - -Zabbix is released under the terms of the GNU General Public License version 2 (GPLv2), totally free of cost. - -In this tutorial we will install Zabbix on an Ubuntu 16.04 server running MySQL, Apache and PHP. - -### Install the Zabbix Server - -First, we’ll need to install a few PHP modules required by Zabbix: - -``` -# apt-get install php7.0-bcmath php7.0-xml php7.0-mbstring -``` -The Zabbix package available in the Ubuntu repositories is outdated. Use the official Zabbix repository to install the latest stable version. - -Install the repository package by executing the following commands: - -``` -$ wget http://repo.zabbix.com/zabbix/3.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.2-1+xenial_all.deb -# dpkg -i zabbix-release_3.2-1+xenial_all.deb -``` - -Then update the `apt` packages source: - -``` -# apt-get update -``` -Now it’s possible to install Zabbix Server with MySQL support and the PHP front-end. Execute the command: -``` -# apt-get install zabbix-server-mysql zabbix-frontend-php -``` - -Install the Zabbix agent: - -``` -# apt-get install zabbix-agent -``` - -Zabbix is now installed. The next step is to configure a database for storing its data. - -### Configure MySQL for Zabbix - -We need to create a new MySQL database, in which Zabbix will store the collected data. - -Start the MySQL shell: - -``` -$ mysql -uroot -p -``` - -Next: - -``` -mysql> CREATE DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_bin; -Query OK, 1 row affected (0.00 sec) - -mysql> GRANT ALL PRIVILEGES ON zabbix.* TO zabbix@localhost IDENTIFIED BY 'usr_strong_pwd'; -Query OK, 0 rows affected, 1 warning (0.00 sec) - -mysql> EXIT; -Bye -``` - -Next, import the initial schema and data. - -``` -# zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql -uzabbix -p zabbix -``` - -Enter the password for the **zabbix** user created in the MySQL shell. - -Next, we need to edit the Zabbix Server configuration file, which is `/etc/zabbix/zabbis_server.conf`: - -``` -# $EDITOR /etc/zabbix/zabbix_server.conf -``` - -Search the `DBPassword` section of the file: - -``` -### Option: DBPassword -# Database password. Ignored for SQLite. -# Comment this line if no password is used. -# -# Mandatory: no -# Default: -# DBPassword= - -``` - -Uncomment the `DBPassword=` line and edit by adding the password created in MySQL: - -``` -DBPassword=usr_strong_pwd - -``` - -Next, look for the `DBHost=` line and uncomment it. - -Save and exit. - -### Configure PHP - -We need to configure PHP for working with Zabbix. During the installation process, the installer created a configuration file in `/etc/zabbix`, named `apache.conf`. Open this file: - -``` -# $EDITOR /etc/zabbix/apache.conf -``` - -Here, right now, it’s necessary only to uncomment the `date.timezone` setting and set the correct timezone: - -``` - - - php_value max_execution_time 300 - php_value memory_limit 128M - php_value post_max_size 16M - php_value upload_max_filesize 2M - php_value max_input_time 300 - php_value always_populate_raw_post_data -1 - php_value date.timezone Europe/Rome - - -``` - -Save and exit. - -At this point, restart Apache and start the Zabbix Server service, enabling it for starting at boot time: - -``` -# systemctl restart apache2 -# systemctl start zabbix-server -# systemctl enable zabbix-server -``` -Check the Zabbix status with `systemctl`: -``` -# systemctl status zabbix-server -``` - -This command should output: - -``` -â zabbix-server.service - Zabbix Server - Loaded: loaded (/lib/systemd/system/zabbix-server.service; enabled; vendor pr - Active: active (running) ... -``` - -At this point, the server-side part of Zabbix has been correctly installed and configured. - -### Configure Zabbix Web Fronted - -As mentioned in the introduction, Zabbix has a web-based front-end which we’ll use for visualizing collected data. However, this interface has to be configured. - -With a web browser, go to URL `http://localhost/zabbix`. - -![Zabbix monitoring server Frontend Setup](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot1.png) - -Click on  _**Next step**_ - -![snapshot2](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot2.png) - -Be sure that all the values are **Ok**, and then click on  _**Next step** _ again. - -![Zabbix MySQL configuration](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot3.png) -Insert the MySQL **zabbix** user password, and then click on  _**Next step**_ . - -![Zabbix server details](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot4.png) - -Click on  _**Next step**_ , and the installer will show the following page with all the configuration parameters. Check again to ensure that everything is correct.. - -![Zabbix pre-installation details](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot5.png) - -![Zabbix installation finished](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot6.png) - -Click **Next step** to proceed to the final screen. - -Click finish to complete the front-end installation. The default user name is **Admin** with **zabbix **as the password. - -### Getting Started with the Zabbix Server - -![Zabbix login interface](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot7.png) - -After logging in with the above mentioned credentials, we will see the Zabbix dashboard: -![zabbix dashboard](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot8.png) -Go on  _Administration -> Users_  for an overview about enabled accounts -![Zabbix users](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot9.png) -Create a new account by clicking on  _**Create user**_ -![Zabbix User Creation](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot10.png) -Click on **Add** in the **Groups** section and select one group -![snapshot11](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot11.png) -Save the new user credentials, and it will appear in the  _Administration -> Users _ panel.**Note that in Zabbix access rights to hosts are assigned to user groups, not individual users.** - -### Conclusion - -This concludes the tutorial for the Zabbix Server installation. Now, the monitoring infrastructure is ready to do its job and collect data about servers that need to be added in the Zabbix configuration. - --------------------------------------------------------------------------------- - -via: https://www.unixmen.com/monitoring-server-install-zabbix-ubuntu-16-04/ - -作者:[Giuseppe Molica ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.unixmen.com/author/tutan/ -[1]:https://www.unixmen.com/author/tutan/ -[2]:http://www.zabbix.com/ -[3]:https://www.unixmen.com/wp-content/uploads/2017/06/zabbix_logo.png diff --git a/translated/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md b/translated/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md new file mode 100644 index 0000000000..090d8b2289 --- /dev/null +++ b/translated/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md @@ -0,0 +1,225 @@ +监控服务器:在 Ubuntu 16.04 Server 上安装 Zabbix +============================================================ + + [![Zabbix logo](https://www.unixmen.com/wp-content/uploads/2017/06/zabbix_logo.png "zabbix_logo")][3] + +### 监控服务器 - 什么是 Zabbix + +[Zabbix][2] 是企业级开源分布式监控服务器解决方案。该软件能监控网络的不同参数以及服务器的完整性,还允许为任何事件配置基于电子邮件的警报。Zabbix 根据存储在数据库(例如 MySQL)中的数据提供报告和数据可视化功能。软件收集的每个测量可以通过基于 Web 的界面访问。 + + +Zabbix 根据 GNU 通用公共许可证版本 2(GPLv2)的条款发布,完全免费。 + +在本教程中,我们将在运行 MySQL、Apache 和 PHP 的 Ubuntu 16.04 server 上安装 Zabbix。 + +### 安装 Zabbix 服务器 + +首先,我们需要安装 Zabbix 所需的几个 PHP 模块: + +``` +# apt-get install php7.0-bcmath php7.0-xml php7.0-mbstring +``` +Ubuntu 仓库中提供的 Zabbix 软件包已经过时了。使用官方 Zabbix 仓库安装最新的稳定版本。 + +通过执行以下命令来安装仓库软件包: + +``` +$ wget http://repo.zabbix.com/zabbix/3.2/ubuntu/pool/main/z/zabbix-release/zabbix-release_3.2-1+xenial_all.deb +# dpkg -i zabbix-release_3.2-1+xenial_all.deb +``` + +然后更新 `apt` 包源码: + +``` +# apt-get update +``` +现在可以安装带有 MySQL 支持和 PHP 前端的 Zabbix 服务器。执行命令: + +``` +# apt-get install zabbix-server-mysql zabbix-frontend-php +``` + +安装 Zabbix 代理: + +``` +# apt-get install zabbix-agent +``` + +Zabbix 现已安装。下一步是配置数据库来存储数据。 + +### 为 Zabbix 配置 MySQL + +我们需要创建一个新的 MySQL 数据库,Zabbix 将用来存储收集的数据。 + +启动 MySQL shell: + +``` +$ mysql -uroot -p +``` + +接下来: + +``` +mysql> CREATE DATABASE zabbix CHARACTER SET utf8 COLLATE utf8_bin; +Query OK, 1 row affected (0.00 sec) + +mysql> GRANT ALL PRIVILEGES ON zabbix.* TO zabbix@localhost IDENTIFIED BY 'usr_strong_pwd'; +Query OK, 0 rows affected, 1 warning (0.00 sec) + +mysql> EXIT; +Bye +``` + +接下来,导入初始表和数据。 + +``` +# zcat /usr/share/doc/zabbix-server-mysql/create.sql.gz | mysql -uzabbix -p zabbix +``` + +输入在 MySQL shell 中创建的 **zabbix** 用户的密码。 + +接下来,我们需要编辑 Zabbix 服务器配置文件,它是 `/etc/zabbix/zabbis_server.conf`: + +``` +# $EDITOR /etc/zabbix/zabbix_server.conf +``` + +搜索文件的 `DBPassword` 部分: + +``` +### Option: DBPassword +# Database password. Ignored for SQLite. +# Comment this line if no password is used. +# +# Mandatory: no +# Default: +# DBPassword= + +``` + +取消注释 `DBPassword=` 这行,并添加在 MySQL 中创建的密码: + +``` +DBPassword=usr_strong_pwd + +``` + +接下来,查找 `DBHost=` 这行并取消注释。 + +保存并退出。 + +### 配置 PHP + +我们需要配置 PHP 来使用 Zabbix。在安装过程中,安装程序在 `/etc/zabbix` 中创建了一个名为 `apache.conf` 的配置文件。打开此文件: + +``` +# $EDITOR /etc/zabbix/apache.conf +``` + +此时,只需要取消注释 `date.timezone` 并设置正确的时区: + +``` + + + php_value max_execution_time 300 + php_value memory_limit 128M + php_value post_max_size 16M + php_value upload_max_filesize 2M + php_value max_input_time 300 + php_value always_populate_raw_post_data -1 + php_value date.timezone Europe/Rome + + +``` + +保存并退出。 + +此时,重启 Apache 并启动 Zabbix Server 服务,使其能够在开机时启动: + +``` +# systemctl restart apache2 +# systemctl start zabbix-server +# systemctl enable zabbix-server +``` + +用 `systemctl` 检查 Zabbix 状态: + +``` +# systemctl status zabbix-server +``` + +这个命令应该输出: + +``` +â zabbix-server.service - Zabbix Server + Loaded: loaded (/lib/systemd/system/zabbix-server.service; enabled; vendor pr + Active: active (running) ... +``` + +此时,Zabbix 的服务器端已经正确安装和配置了。 + +### 配置 Zabbix Web 前端 + +如介绍中所述,Zabbix 有一个基于 Web 的前端,我们将用于可视化收集的数据。但是,必须配置此接口。 + +使用 Web 浏览器,进入 URL `http://localhost/zabbix`。 + +![Zabbix monitoring server Frontend Setup](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot1.png) + +点击  _**Next step**_ + +![snapshot2](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot2.png) + +确保所有的值都是 **Ok**,然后再次单击 _**Next step** _ 。 + +![Zabbix MySQL configuration](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot3.png) +输入 MySQL **zabbix** 的用户密码,然后点击 _ **Next step** _。 + +![Zabbix server details](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot4.png) + +单击 _**Next step**_ ,安装程序将显示具有所有配置参数的页面。再次检查以确保一切正确。 + +![Zabbix pre-installation details](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot5.png) + +![Zabbix installation finished](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot6.png) + +点击 **Next step** 进入最后一页。 + +点击完成以完成前端安装。默认用户名为 **Admin**,密码是 **zabbix**。 + +### Zabbix 服务器入门 + +![Zabbix login interface](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot7.png) + +使用上述凭证登录后,我们将看到 Zabbix 面板: +![zabbix dashboard](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot8.png) + +前往 _Administration -> Users_,了解已启用帐户的概况 +![Zabbix users](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot9.png) + +通过点击 _**Create user**_ 创建一个新帐户。 +![Zabbix User Creation](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot10.png) + +点击 **Groups** 中的 **Add**,然后选择一个组 +![snapshot11](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot11.png) + +保存新用户凭证,它将显示在 _Administration -> Users_ 面板中。**请注意,在 Zabbix 中,主机的访问权限分配给用户组,而不是单个用户。** + +### 总结 + +我们结束了 Zabbix Server 安装的教程。现在,监控基础设施已准备好完成其工作并收集有关需要在 Zabbix 配置中添加的服务器的数据。 + +-------------------------------------------------------------------------------- + +via: https://www.unixmen.com/monitoring-server-install-zabbix-ubuntu-16-04/ + +作者:[Giuseppe Molica ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.unixmen.com/author/tutan/ +[1]:https://www.unixmen.com/author/tutan/ +[2]:http://www.zabbix.com/ +[3]:https://www.unixmen.com/wp-content/uploads/2017/06/zabbix_logo.png From 8802523af450b5003f852b68644781f6c16defef Mon Sep 17 00:00:00 2001 From: geekpi Date: Tue, 8 Aug 2017 08:45:13 +0800 Subject: [PATCH 0938/1407] translating --- ...ntegrate CentOS 7 to Samba4 AD from Commandline – Part 14.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170714 Integrate CentOS 7 to Samba4 AD from Commandline – Part 14.md b/sources/tech/20170714 Integrate CentOS 7 to Samba4 AD from Commandline – Part 14.md index 29162628ac..9affa013ed 100644 --- a/sources/tech/20170714 Integrate CentOS 7 to Samba4 AD from Commandline – Part 14.md +++ b/sources/tech/20170714 Integrate CentOS 7 to Samba4 AD from Commandline – Part 14.md @@ -1,3 +1,5 @@ +translting----geekpi + Integrate CentOS 7 to Samba4 AD from Commandline – Part 14 ============================================================ From 730c3677ca27da373a1368de8171e994c1ca880f Mon Sep 17 00:00:00 2001 From: XYenChi <466530436@qq.com> Date: Tue, 8 Aug 2017 10:43:56 +0800 Subject: [PATCH 0939/1407] translated --- ...ers guide to collecting and mapping Twitter data using R.md | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) rename translated/{ => tech}/20170620 A beginners guide to collecting and mapping Twitter data using R.md (98%) diff --git a/translated/20170620 A beginners guide to collecting and mapping Twitter data using R.md b/translated/tech/20170620 A beginners guide to collecting and mapping Twitter data using R.md similarity index 98% rename from translated/20170620 A beginners guide to collecting and mapping Twitter data using R.md rename to translated/tech/20170620 A beginners guide to collecting and mapping Twitter data using R.md index a7d6c8e6cd..7239547e7c 100644 --- a/translated/20170620 A beginners guide to collecting and mapping Twitter data using R.md +++ b/translated/tech/20170620 A beginners guide to collecting and mapping Twitter data using R.md @@ -1,8 +1,7 @@ - 用 R 收集和映射推特数据的初学者向导 ============================================================ -### Learn to use R's twitteR and leaflet packages, which allow you to map the location of tweets on any topic. +### 学习使用 R's twitteR 和 leaflet 包, 你就可以把任何话题的推文定位画在地图上。 ![用 R 收集和映射推特数据的初学者向导](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/cloud-globe.png?itok=H4f-RAz_ "用 R 收集和映射推特数据的初学者向导") Image by :  From 966caf6c4c87cd98a5c9636c964f5b648484e2cc Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 8 Aug 2017 18:36:05 +0800 Subject: [PATCH 0940/1407] PRF&PUB:20170801 Deploy Kubernetes cluster for Linux containers.md @rieonke --- ...Kubernetes cluster for Linux containers.md | 47 +++++++++---------- 1 file changed, 21 insertions(+), 26 deletions(-) rename {translated/tech => published}/20170801 Deploy Kubernetes cluster for Linux containers.md (74%) diff --git a/translated/tech/20170801 Deploy Kubernetes cluster for Linux containers.md b/published/20170801 Deploy Kubernetes cluster for Linux containers.md similarity index 74% rename from translated/tech/20170801 Deploy Kubernetes cluster for Linux containers.md rename to published/20170801 Deploy Kubernetes cluster for Linux containers.md index 827449b302..43f16c816a 100644 --- a/translated/tech/20170801 Deploy Kubernetes cluster for Linux containers.md +++ b/published/20170801 Deploy Kubernetes cluster for Linux containers.md @@ -1,38 +1,38 @@ -Deploy Kubernetes cluster for Linux containers -部署Kubernetes 容器集群 +在 Azure 中部署 Kubernetes 容器集群 ============================================================ -在这个快速入门教程中,我们使用 Azure CLI 创建 Kubernetes 集群。 然后在集群上部署并运行由 Web 前端和 Redis 实例组成的多容器应用程序。 一旦部署完成,应用程序可以通过互联网访问。 +在这个快速入门教程中,我们使用 Azure CLI 创建一个 Kubernetes 集群,然后在集群上部署运行由 Web 前端和 Redis 实例组成的多容器应用程序。一旦部署完成,应用程序可以通过互联网访问。 + ![示例应用截图](https://docs.microsoft.com/en-us/azure/container-service/kubernetes/media/container-service-kubernetes-walkthrough/azure-vote.png) -这个快速入门教程假设你已经基本了解了Kubernetes 的概念,有关 Kubernetes 的详细信息,请参阅[ Kubernetes 文档][3]。 +这个快速入门教程假设你已经基本了解了 Kubernetes 的概念,有关 Kubernetes 的详细信息,请参阅 [Kubernetes 文档][3]。 -如果您没有 Azure 账号订阅,请在开始之前创建一个[免费帐户][4]。 +如果您没有 Azure 账号,请在开始之前创建一个[免费帐户][4]。 -### 登陆Azure 云控制台 +### 登录 Azure 云控制台 -Azure 云控制台是一个免费的 Bash shell ,你可以直接在 Azure 网站上运行。 它已经在你的账户中预先配置好了, 单击[ Azure 门户][5]右上角菜单上的 “Cloud Shell” 按钮; +Azure 云控制台是一个免费的 Bash shell,你可以直接在 Azure 网站上运行。它已经在你的账户中预先配置好了, 单击 [Azure 门户][5]右上角菜单上的 “Cloud Shell” 按钮; - [![Cloud Shell](https://docs.microsoft.com/en-us/azure/includes/media/cloud-shell-try-it/cloud-shell-menu.png)][6] +[![Cloud Shell](https://docs.microsoft.com/en-us/azure/includes/media/cloud-shell-try-it/cloud-shell-menu.png)][6] - 该按钮启动一个交互式 shell,您可以使用它来运行本教程中的所有操作步骤。 +该按钮会启动一个交互式 shell,您可以使用它来运行本教程中的所有操作步骤。 - [![ Cloud Shell 截图](https://docs.microsoft.com/en-us/azure/includes/media/cloud-shell-try-it/cloud-shell-safari.png)][7] +[![ Cloud Shell 截图](https://docs.microsoft.com/en-us/azure/includes/media/cloud-shell-try-it/cloud-shell-safari.png)][7] -此快速入门教程所用的 Azure CLI 的版本最低要求为 2.0.4 。如果您选择在本地安装和使用 CLI 工具,请运行 `az --version` 来检查已安装的版本。 如果您需要安装或升级请参阅[安装 Azure CLI 2.0 ][8]。 +此快速入门教程所用的 Azure CLI 的版本最低要求为 2.0.4。如果您选择在本地安装和使用 CLI 工具,请运行 `az --version` 来检查已安装的版本。 如果您需要安装或升级请参阅[安装 Azure CLI 2.0 ][8]。 ### 创建一个资源组 -使用 [az group create][9] 命令创建一个资源组,一个 Azure 资源组是 Azure 资源部署和管理的逻辑组。 +使用 [az group create][9] 命令创建一个资源组,一个 Azure 资源组是指 Azure 资源部署和管理的逻辑组。 -以下示例在 _eastus_ 位置中创建名为 _myResourceGroup_ 的资源组。 +以下示例在 _eastus_ 区域中创建名为 _myResourceGroup_ 的资源组。 ``` az group create --name myResourceGroup --location eastus ``` -输出: +输出: ``` @@ -53,23 +53,21 @@ az group create --name myResourceGroup --location eastus 使用 [az acs create][10] 命令在 Azure 容器服务中创建 Kubernetes 集群。 以下示例使用一个 Linux 主节点和三个 Linux 代理节点创建一个名为 _myK8sCluster_ 的集群。 -Azure CLICopyTry It ``` az acs create --orchestrator-type=kubernetes --resource-group myResourceGroup --name=myK8sCluster --generate-ssh-keys ``` -几分钟后,命令将完成并返回有关该集群的json格式的信息。 +几分钟后,命令将完成并返回有关该集群的 json 格式的信息。 ### 连接到 Kubernetes 集群 要管理 Kubernetes 群集,可以使用 Kubernetes 命令行工具 [kubectl][11]。 -如果您使用 Azure CloudShell ,则已经安装了 kubectl 。 如果要在本地安装,可以使用 [az acs kubernetes install-cli][12] 命令。 +如果您使用 Azure CloudShell ,则已经安装了 kubectl 。如果要在本地安装,可以使用 [az acs kubernetes install-cli][12] 命令。 要配置 kubectl 连接到您的 Kubernetes 群集,请运行 [az acs kubernetes get-credentials][13] 命令下载凭据并配置 Kubernetes CLI 以使用它们。 - ``` az acs kubernetes get-credentials --resource-group=myResourceGroup --name=myK8sCluster @@ -83,7 +81,7 @@ kubectl get nodes ``` -输出: +输出: ``` @@ -171,7 +169,7 @@ kubectl create -f azure-vote.yaml ``` -输出: +输出: ``` @@ -188,15 +186,13 @@ service "azure-vote-front" created 要监控这个进程,使用 [kubectl get service][17] 命令时加上 `--watch` 参数。 -Azure CLICopyTry It ``` kubectl get service azure-vote-front --watch ``` -Initially the EXTERNAL-IP for the  _azure-vote-front_  service appears as  _pending_ . Once the EXTERNAL-IP address has changed from  _pending_  to an  _IP address_ , use `CTRL-C` to stop the kubectl watch process. -最初,_azure-vote-front_ 服务的 EXTERNAL-IP 显示为 _pending_ 。 一旦 EXTERNAL-IP 地址从 _pending_ 变成一个具体的IP地址,请使用 “CTRL-C” 来停止 kubectl 监视进程。 +最初,_azure-vote-front_ 服务的 EXTERNAL-IP 显示为 _pending_ 。 一旦 EXTERNAL-IP 地址从 _pending_ 变成一个具体的 IP 地址,请使用 “CTRL-C” 来停止 kubectl 监视进程。 ``` azure-vote-front 10.0.34.242 80:30676/TCP 7s @@ -204,7 +200,6 @@ azure-vote-front 10.0.34.242 52.179.23.131 80:30676/TCP 2m ``` -You can now browse to the external IP address to see the Azure Vote App. 现在你可以通过这个外网 IP 地址访问到 Azure Vote 这个应用了。 ![浏览 Azure Vote 应用截图 ](https://docs.microsoft.com/en-us/azure/container-service/kubernetes/media/container-service-kubernetes-walkthrough/azure-vote.png) @@ -234,9 +229,9 @@ az group delete --name myResourceGroup --yes --no-wait via: https://docs.microsoft.com/en-us/azure/container-service/kubernetes/container-service-kubernetes-walkthrough -作者:[neilpeterson ][a],[mmacy][b] +作者:[neilpeterson][a],[mmacy][b] 译者:[rieonke](https://github.com/rieonke) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 85fbb5cc2e5616561a52b53e639ad569604c4a59 Mon Sep 17 00:00:00 2001 From: wxy Date: Tue, 8 Aug 2017 18:47:06 +0800 Subject: [PATCH 0941/1407] PRF&PUB:20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md @geekpi --- ...nstall Zabbix on an Ubuntu 16.04 Server.md | 36 +++++++++++-------- 1 file changed, 22 insertions(+), 14 deletions(-) rename {translated/tech => published}/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md (87%) diff --git a/translated/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md b/published/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md similarity index 87% rename from translated/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md rename to published/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md index 090d8b2289..7add8b0583 100644 --- a/translated/tech/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md +++ b/published/20170705 Monitoring Server Install Zabbix on an Ubuntu 16.04 Server.md @@ -1,12 +1,11 @@ -监控服务器:在 Ubuntu 16.04 Server 上安装 Zabbix +在 Ubuntu 16.04 Server 上安装 Zabbix ============================================================ [![Zabbix logo](https://www.unixmen.com/wp-content/uploads/2017/06/zabbix_logo.png "zabbix_logo")][3] ### 监控服务器 - 什么是 Zabbix -[Zabbix][2] 是企业级开源分布式监控服务器解决方案。该软件能监控网络的不同参数以及服务器的完整性,还允许为任何事件配置基于电子邮件的警报。Zabbix 根据存储在数据库(例如 MySQL)中的数据提供报告和数据可视化功能。软件收集的每个测量可以通过基于 Web 的界面访问。 - +[Zabbix][2] 是企业级开源分布式监控服务器解决方案。该软件能监控网络的不同参数以及服务器的完整性,还允许为任何事件配置基于电子邮件的警报。Zabbix 根据存储在数据库(例如 MySQL)中的数据提供报告和数据可视化功能。软件收集的每个测量指标都可以通过基于 Web 的界面访问。 Zabbix 根据 GNU 通用公共许可证版本 2(GPLv2)的条款发布,完全免费。 @@ -19,6 +18,7 @@ Zabbix 根据 GNU 通用公共许可证版本 2(GPLv2)的条款发布,完 ``` # apt-get install php7.0-bcmath php7.0-xml php7.0-mbstring ``` + Ubuntu 仓库中提供的 Zabbix 软件包已经过时了。使用官方 Zabbix 仓库安装最新的稳定版本。 通过执行以下命令来安装仓库软件包: @@ -28,11 +28,12 @@ $ wget http://repo.zabbix.com/zabbix/3.2/ubuntu/pool/main/z/zabbix-release/zabbi # dpkg -i zabbix-release_3.2-1+xenial_all.deb ``` -然后更新 `apt` 包源码: +然后更新 `apt` 包源: ``` # apt-get update ``` + 现在可以安装带有 MySQL 支持和 PHP 前端的 Zabbix 服务器。执行命令: ``` @@ -166,18 +167,19 @@ DBPassword=usr_strong_pwd ![Zabbix monitoring server Frontend Setup](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot1.png) -点击  _**Next step**_ +点击  **Next step** ![snapshot2](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot2.png) -确保所有的值都是 **Ok**,然后再次单击 _**Next step** _ 。 +确保所有的值都是 **Ok**,然后再次单击 **Next step** 。 ![Zabbix MySQL configuration](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot3.png) -输入 MySQL **zabbix** 的用户密码,然后点击 _ **Next step** _。 + +输入 MySQL **zabbix** 的用户密码,然后点击 **Next step**。 ![Zabbix server details](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot4.png) -单击 _**Next step**_ ,安装程序将显示具有所有配置参数的页面。再次检查以确保一切正确。 +单击 **Next step** ,安装程序将显示具有所有配置参数的页面。再次检查以确保一切正确。 ![Zabbix pre-installation details](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot5.png) @@ -192,18 +194,24 @@ DBPassword=usr_strong_pwd ![Zabbix login interface](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot7.png) 使用上述凭证登录后,我们将看到 Zabbix 面板: + ![zabbix dashboard](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot8.png) -前往 _Administration -> Users_,了解已启用帐户的概况 +前往 **Administration -> Users**,了解已启用帐户的概况: + ![Zabbix users](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot9.png) -通过点击 _**Create user**_ 创建一个新帐户。 +通过点击 **Create user** 创建一个新帐户。 + ![Zabbix User Creation](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot10.png) -点击 **Groups** 中的 **Add**,然后选择一个组 +点击 **Groups** 中的 **Add**,然后选择一个组: + ![snapshot11](https://www.unixmen.com/wp-content/uploads/2017/06/snapshot11.png) -保存新用户凭证,它将显示在 _Administration -> Users_ 面板中。**请注意,在 Zabbix 中,主机的访问权限分配给用户组,而不是单个用户。** +保存新用户凭证,它将显示在 **Administration -> Users** 面板中。 + +**请注意,在 Zabbix 中,主机的访问权限分配给用户组,而不是单个用户。** ### 总结 @@ -213,9 +221,9 @@ DBPassword=usr_strong_pwd via: https://www.unixmen.com/monitoring-server-install-zabbix-ubuntu-16-04/ -作者:[Giuseppe Molica ][a] +作者:[Giuseppe Molica][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/) 荣誉推出 From 4609fcaf05aa538c70baa2ee9774942f16e62d49 Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 9 Aug 2017 08:26:03 +0800 Subject: [PATCH 0942/1407] translated --- ...to Samba4 AD from Commandline – Part 14.md | 299 ------------------ ...to Samba4 AD from Commandline – Part 14.md | 297 +++++++++++++++++ 2 files changed, 297 insertions(+), 299 deletions(-) delete mode 100644 sources/tech/20170714 Integrate CentOS 7 to Samba4 AD from Commandline – Part 14.md create mode 100644 translated/tech/20170714 Integrate CentOS 7 to Samba4 AD from Commandline – Part 14.md diff --git a/sources/tech/20170714 Integrate CentOS 7 to Samba4 AD from Commandline – Part 14.md b/sources/tech/20170714 Integrate CentOS 7 to Samba4 AD from Commandline – Part 14.md deleted file mode 100644 index 9affa013ed..0000000000 --- a/sources/tech/20170714 Integrate CentOS 7 to Samba4 AD from Commandline – Part 14.md +++ /dev/null @@ -1,299 +0,0 @@ -translting----geekpi - -Integrate CentOS 7 to Samba4 AD from Commandline – Part 14 -============================================================ - -This guide will show you how you can integrate a CentOS 7 Server with no Graphical User Interface to [Samba4 Active Directory Domain Controller][3] from command line using Authconfig software. - -This type of setup provides a single centralized account database held by Samba and allows the AD users to authenticate to CentOS server across the network infrastructure. - -#### Requirements - -1. [Create an Active Directory Infrastructure with Samba4 on Ubuntu][1] - -2. [CentOS 7.3 Installation Guide][2] - -### Step 1: Configure CentOS for Samba4 AD DC - -1. Before starting to join CentOS 7 Server into a Samba4 DC you need to assure that the network interface is properly configured to query domain via DNS service. - -Run [ip address][4] command to list your machine network interfaces and choose the specific NIC to edit by issuing nmtui-edit command against the interface name, such as ens33 in this example, as illustrated below. - -``` -# ip address -# nmtui-edit ens33 -``` - [![List Network Interfaces](https://www.tecmint.com/wp-content/uploads/2017/07/List-Network-Interfaces.jpg)][5] - -List Network Interfaces - -2. Once the network interface is opened for editing, add the static IPv4 configurations best suited for your LAN and make sure you setup Samba AD Domain Controllers IP addresses for the DNS servers. - -Also, append the name of your domain in search domains filed and navigate to OK button using [TAB] key to apply changes. - -The search domains filed assures that the domain counterpart is automatically appended by DNS resolution (FQDN) when you use only a short name for a domain DNS record. - - [![Configure Network Interface](https://www.tecmint.com/wp-content/uploads/2017/07/Configure-Network-Interface.png)][6] - -Configure Network Interface - -3. Finally, restart the network daemon to apply changes and test if DNS resolution is properly configured by issuing series of ping commands against the domain name and domain controllers short names as shown below. - -``` -# systemctl restart network.service -# ping -c2 tecmint.lan -# ping -c2 adc1 -# ping -c2 adc2 -``` - [![Verify DNS Resolution on Domain](https://www.tecmint.com/wp-content/uploads/2017/07/Verify-DNS-Resolution-on-Domain.png)][7] - -Verify DNS Resolution on Domain - -4. Also, configure your machine hostname and reboot the machine to properly apply the settings by issuing the following commands. - -``` -# hostnamectl set-hostname your_hostname -# init 6 -``` - -Verify if hostname was correctly applied with the below commands. - -``` -# cat /etc/hostname -# hostname -``` - -5. Finally, sync local time with Samba4 AD DC by issuing the below commands with root privileges. - -``` -# yum install ntpdate -# ntpdate domain.tld -``` - [![Sync Time with Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/07/Sync-Time-with-Samba4-AD-DC.png)][8] - -Sync Time with Samba4 AD DC - -### Step 2: Join CentOS 7 Server to Samba4 AD DC - -6. To join CentOS 7 server to Samba4 Active Directory, first install the following packages on your machine from an account with root privileges. - -``` -# yum install authconfig samba-winbind samba-client samba-winbind-clients -``` - -7. In order to integrate CentOS 7 server to a domain controller run authconfig-tui graphical utility with root privileges and use the below configurations as described below. - -``` -# authconfig-tui -``` - -At the first prompt screen choose: - -* On User Information: - * Use Winbind - -* On Authentication tab select by pressing [Space] key: - * Use Shadow Password - - * Use Winbind Authentication - - * Local authorization is sufficient - - [![Authentication Configuration](https://www.tecmint.com/wp-content/uploads/2017/07/Authentication-Configuration.png)][9] - -Authentication Configuration - -8. Hit Next to continue to the Winbind Settings screen and configure as illustrated below: - -* Security Model: ads - -* Domain = YOUR_DOMAIN (use upper case) - -* Domain Controllers = domain machines FQDN (comma separated if more than one) - -* ADS Realm = YOUR_DOMAIN.TLD - -* Template Shell = /bin/bash - - [![Winbind Settings](https://www.tecmint.com/wp-content/uploads/2017/07/Winbind-Settings.png)][10] - -Winbind Settings - -9. To perform domain joining navigate to Join Domain button using [tab] key and hit [Enter] key to join domain. - -At the next screen prompt, add the credentials for a Samba4 AD account with elevated privileges to perform the machine account joining into AD and hit OK to apply settings and close the prompt. - -Be aware that when you type the user password, the credentials won’t be shown in the password screen. On the remaining screen hit OK again to finish domain integration for CentOS 7 machine. - - [![Join Domain to Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/07/Join-Domain-to-Samba4-AD-DC.png)][11] - -Join Domain to Samba4 AD DC - - [![Confirm Winbind Settings](https://www.tecmint.com/wp-content/uploads/2017/07/Confirm-Winbind-Settings.png)][12] - -Confirm Winbind Settings - -To force adding a machine into a specific Samba AD Organizational Unit, get your machine exact name using hostname command and create a new Computer object in that OU with the name of your machine. - -The best way to add a new object into a Samba4 AD is by using ADUC tool from a Windows machine integrated into the domain with [RSAT tools installed][13] on it. - -Important: An alternate method of joining a domain is by using authconfig command line which offers extensive control over the integration process. - -However, this method is prone to errors do to its numerous parameters as illustrated on the below command excerpt. The command must be typed into a single long line. - -``` -# authconfig --enablewinbind --enablewinbindauth --smbsecurity ads --smbworkgroup=YOUR_DOMAIN --smbrealm YOUR_DOMAIN.TLD --smbservers=adc1.yourdomain.tld --krb5realm=YOUR_DOMAIN.TLD --enablewinbindoffline --enablewinbindkrb5 --winbindtemplateshell=/bin/bash--winbindjoin=domain_admin_user --update --enablelocauthorize --savebackup=/backups -``` - -10. After the machine has been joined to domain, verify if winbind service is up and running by issuing the below command. - -``` -# systemctl status winbind.service -``` - -11. Then, check if CentOS machine object has been successfully created in Samba4 AD. Use AD Users and Computers tool from a Windows machine with RSAT tools installed and navigate to your domain Computers container. A new AD computer account object with name of your CentOS 7 server should be listed in the right plane. - -12. Finally, tweak the configuration by opening samba main configuration file (/etc/samba/smb.conf) with a text editor and append the below lines at the end of the [global]configuration block as illustrated below: - -``` -winbind use default domain = true -winbind offline logon = true -``` - [![Configure Samba](https://www.tecmint.com/wp-content/uploads/2017/07/Configure-Samba.jpg)][14] - -Configure Samba - -13. In order to create local homes on the machine for AD accounts at their first logon run the below command. - -``` -# authconfig --enablemkhomedir --update -``` - -14. Finally, restart Samba daemon to reflect changes and verify domain joining by performing a logon on the server with an AD account. The home directory for the AD account should be automatically created. - -``` -# systemctl restart winbind -# su - domain_account -``` - [![Verify Domain Joining](https://www.tecmint.com/wp-content/uploads/2017/07/Verify-Domain-Joining.jpg)][15] - -Verify Domain Joining - -15. List the domain users or domain groups by issuing one of the following commands. - -``` -# wbinfo -u -# wbinfo -g -``` - [![List Domain Users and Groups](https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-Users-and-Groups.png)][16] - -List Domain Users and Groups - -16. To get info about a domain user run the below command. - -``` -# wbinfo -i domain_user -``` - [![List Domain User Info](https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-User-Info.jpg)][17] - -List Domain User Info - -17. To display summary domain info issue the following command. - -``` -# net ads info -``` - [![List Domain Summary](https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-Summary.jpg)][18] - -List Domain Summary - -### Step 3: Login to CentOS with a Samba4 AD DC Account - -18. To authenticate with a domain user in CentOS, use one of the following command line syntaxes. - -``` -# su - ‘domain\domain_user’ -# su - domain\\domain_user -``` - -Or use the below syntax in case winbind use default domain = true parameter is set to samba configuration file. - -``` -# su - domain_user -# su - domain_user@domain.tld -``` - -19. In order to add root privileges for a domain user or group, edit sudoers file using visudocommand and add the following lines as illustrated on the below screenshot. - -``` -YOUR_DOMAIN\\domain_username ALL=(ALL:ALL) ALL #For domain users -%YOUR_DOMAIN\\your_domain\ group ALL=(ALL:ALL) ALL #For domain groups -``` - -Or use the below excerpt in case winbind use default domain = true parameter is set to samba configuration file. - -``` -domain_username ALL=(ALL:ALL) ALL #For domain users -%your_domain\ group ALL=(ALL:ALL) ALL #For domain groups -``` - [![Grant Root Privileges on Domain Users](https://www.tecmint.com/wp-content/uploads/2017/07/Grant-Root-Privileges-on-Domain-Users.jpg)][19] - -Grant Root Privileges on Domain Users - -20. The following series of commands against a Samba4 AD DC can also be useful for troubleshooting purposes: - -``` -# wbinfo -p #Ping domain -# wbinfo -n domain_account #Get the SID of a domain account -# wbinfo -t #Check trust relationship -``` - -21. To leave the domain run the following command against your domain name using a domain account with elevated privileges. After the machine account has been removed from the AD, reboot the machine to revert changes before the integration process. - -``` -# net ads leave -w DOMAIN -U domain_admin -# init 6 -``` - -That’s all! Although this procedure is mainly focused on joining a CentOS 7 server to a Samba4 AD DC, the same steps described here are also valid for integrating a CentOS server into a Microsoft Windows Server 2012 Active Directory. - --------------------------------------------------------------------------------- - -作者简介: - -Matei Cezar -I'am a computer addicted guy, a fan of open source and linux based system software, have about 4 years experience with Linux distributions desktop, servers and bash scripting. - ------------------- - -via: https://www.tecmint.com/integrate-centos-7-to-samba4-active-directory/ - -作者:[Matei Cezar ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://www.tecmint.com/author/cezarmatei/ -[1]:https://www.tecmint.com/install-samba4-active-directory-ubuntu/ -[2]:https://www.tecmint.com/centos-7-3-installation-guide/ -[3]:https://www.tecmint.com/install-samba4-active-directory-ubuntu/ -[4]:https://www.tecmint.com/ip-command-examples/ -[5]:https://www.tecmint.com/wp-content/uploads/2017/07/List-Network-Interfaces.jpg -[6]:https://www.tecmint.com/wp-content/uploads/2017/07/Configure-Network-Interface.png -[7]:https://www.tecmint.com/wp-content/uploads/2017/07/Verify-DNS-Resolution-on-Domain.png -[8]:https://www.tecmint.com/wp-content/uploads/2017/07/Sync-Time-with-Samba4-AD-DC.png -[9]:https://www.tecmint.com/wp-content/uploads/2017/07/Authentication-Configuration.png -[10]:https://www.tecmint.com/wp-content/uploads/2017/07/Winbind-Settings.png -[11]:https://www.tecmint.com/wp-content/uploads/2017/07/Join-Domain-to-Samba4-AD-DC.png -[12]:https://www.tecmint.com/wp-content/uploads/2017/07/Confirm-Winbind-Settings.png -[13]:https://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/ -[14]:https://www.tecmint.com/wp-content/uploads/2017/07/Configure-Samba.jpg -[15]:https://www.tecmint.com/wp-content/uploads/2017/07/Verify-Domain-Joining.jpg -[16]:https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-Users-and-Groups.png -[17]:https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-User-Info.jpg -[18]:https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-Summary.jpg -[19]:https://www.tecmint.com/wp-content/uploads/2017/07/Grant-Root-Privileges-on-Domain-Users.jpg -[20]:https://www.tecmint.com/author/cezarmatei/ -[21]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ -[22]:https://www.tecmint.com/free-linux-shell-scripting-books/ diff --git a/translated/tech/20170714 Integrate CentOS 7 to Samba4 AD from Commandline – Part 14.md b/translated/tech/20170714 Integrate CentOS 7 to Samba4 AD from Commandline – Part 14.md new file mode 100644 index 0000000000..3c8c3e581a --- /dev/null +++ b/translated/tech/20170714 Integrate CentOS 7 to Samba4 AD from Commandline – Part 14.md @@ -0,0 +1,297 @@ +Samba 系列(十四):在命令行中将 CentOS 7 与 Samba4 AD 集成 +============================================================ + +本指南将向你介绍如何使用 Authconfig 在命令行中将无图形界面的 CentOS 7 服务器集成到[ Samba4 AD 域控制器][3]中。 + +这类设置提供了由 Samba 持有的单一集中式帐户数据库,允许 AD 用户通过网络基础设施对 CentOS 服务器进行身份验证。 + +#### 要求 + +1. [在 Ubuntu 上使用 Samba4 创建 AD 基础架构][1] + +2. [CentOS 7.3 安装指南][2] + +### 步骤 1:为 Samba4 AD DC 配置 CentOS + +1. 在开始将 CentOS 7 服务器加入 Samba4 DC 之前,你需要确保网络接口被正确配置为通过 DNS 服务查询域。 + +运行 [ip address][4] 命令列出你机器网络接口,选择要编辑的特定网卡,通过针对接口名称运行 nmtui-edit 命令(如本例中的 ens33),如下所示。 + +``` +# ip address +# nmtui-edit ens33 +``` + [![List Network Interfaces](https://www.tecmint.com/wp-content/uploads/2017/07/List-Network-Interfaces.jpg)][5] + +列出网络接口 + +2. 打开网络接口进行编辑后,添加最适合 LAN 的静态 IPv4 配置,并确保为 DNS 服务器设置 Samba AD 域控制器 IP 地址。 + +另外,在搜索域中追加你的域的名称,并使用 [TAB] 键跳到确定按钮来应用更改。 + +当你仅对域 dns 记录使用短名称时, 已提交的搜索域保证域对应项会自动追加到 dns 解析 (FQDN) 中。 + + [![Configure Network Interface](https://www.tecmint.com/wp-content/uploads/2017/07/Configure-Network-Interface.png)][6] + +配置网络接口 + +3.最后,重启网络守护进程以应用更改,并通过对域名和域控制器 ping 来测试 DNS 解析是否正确配置,如下所示。 + +``` +# systemctl restart network.service +# ping -c2 tecmint.lan +# ping -c2 adc1 +# ping -c2 adc2 +``` + [![Verify DNS Resolution on Domain](https://www.tecmint.com/wp-content/uploads/2017/07/Verify-DNS-Resolution-on-Domain.png)][7] + +验证域上的 DNS 解析 + +4. 另外,使用下面的命令配置你的计算机主机名并重启机器应用更改。 + +``` +# hostnamectl set-hostname your_hostname +# init 6 +``` + +使用以下命令验证主机名是否正确配置。 + +``` +# cat /etc/hostname +# hostname +``` + +5. 最后,使用 root 权限运行以下命令,与 Samba4 AD DC 同步本地时间。 + +``` +# yum install ntpdate +# ntpdate domain.tld +``` + [![Sync Time with Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/07/Sync-Time-with-Samba4-AD-DC.png)][8] + +与 Samba4 AD DC 同步时间 + +### 步骤 2:将 CentOS 7 服务器加入到 Samba4 AD DC + +6. 要将 CentOS 7 服务器加入到 Samba4 AD 中,请先用具有 root 权限的帐户在计算机上安装以下软件包。 + +``` +# yum install authconfig samba-winbind samba-client samba-winbind-clients +``` + +7. 为了将 CentOS 7 服务器与域控制器集成,可以使用 root 权限运行 authconfig-tui,并使用下面的配置。 + +``` +# authconfig-tui +``` + +首屏选择: + +* 在 User Information 中: + * Use Winbind + +* 在 Authentication 中使用[空格键]选择: + * Use Shadow Password + + * Use Winbind Authentication + + * Local authorization is sufficient + + [![Authentication Configuration](https://www.tecmint.com/wp-content/uploads/2017/07/Authentication-Configuration.png)][9] + +验证配置 + +8. 点击 Next 进入 Winbind 设置界面并配置如下: + +* Security Model: ads + +* Domain = YOUR_DOMAIN (use upper case) + +* Domain Controllers = domain machines FQDN (comma separated if more than one) + +* ADS Realm = YOUR_DOMAIN.TLD + +* Template Shell = /bin/bash + + [![Winbind Settings](https://www.tecmint.com/wp-content/uploads/2017/07/Winbind-Settings.png)][10] + +Winbind 设置 + +9. 要加入域,使用 [tab] 键跳到 “Join Domain” 按钮,然后按[回车]键加入域。 + +在下一个页面,添加具有提升权限的 Samba4 AD 帐户的凭据,以将计算机帐户加入 AD,然后单击 “OK” 应用设置并关闭提示。 + +请注意,当你输入用户密码时,凭据将不会显示在屏幕中。在下面再次点击 OK,完成 CentOS 7 的域集成。 + + [![Join Domain to Samba4 AD DC](https://www.tecmint.com/wp-content/uploads/2017/07/Join-Domain-to-Samba4-AD-DC.png)][11] + +加入域到 Samba4 AD DC + + [![Confirm Winbind Settings](https://www.tecmint.com/wp-content/uploads/2017/07/Confirm-Winbind-Settings.png)][12] + +确认 Winbind 设置 + +要强制将机器添加到特定的 Samba AD OU 中,请使用 hostname 命令获取计算机的完整名称,并使用机器名称在该 OU 中创建一个新的计算机对象。 + +将新对象添加到 Samba4 AD 中的最佳方法是已经集成到[安装了 RSAT 工具][13]的域的 Wubdows 机器上使用 ADUC 工具。 + +重要:加入域的另一种方法是使用 authconfig 命令行,它可以对集成过程进行广泛的控制。 + +但是,这种方法很容易因为其众多参数造成错误,如下所示。该命令必须输入一条长命令行。 + +``` +# authconfig --enablewinbind --enablewinbindauth --smbsecurity ads --smbworkgroup=YOUR_DOMAIN --smbrealm YOUR_DOMAIN.TLD --smbservers=adc1.yourdomain.tld --krb5realm=YOUR_DOMAIN.TLD --enablewinbindoffline --enablewinbindkrb5 --winbindtemplateshell=/bin/bash--winbindjoin=domain_admin_user --update --enablelocauthorize --savebackup=/backups +``` + +10. 机器加入域后,通过使用以下命令验证 winbind 服务是否正常运行。 + +``` +# systemctl status winbind.service +``` + +11. 接着检查是否在 Samba4 AD 中成功创建了 CentOS 机器对象。从安装了 RSAT 工具的 Windows 机器使用 AD 用户和计算机工具,并进入到你的域计算机容器。一个名为 CentOS 7 Server 的新 AD 计算机帐户对象应该在右边的列表中。 + +12. 最后,使用文本编辑器打开 samba 主配置文件(/etc/samba/smb.conf)来调整配置,并在 [global] 配置块的末尾附加以下行,如下所示: + +``` +winbind use default domain = true +winbind offline logon = true +``` + [![Configure Samba](https://www.tecmint.com/wp-content/uploads/2017/07/Configure-Samba.jpg)][14] + +配置 Samba + +13. 为了在 AD 帐户首次登录时在机器上创建本地家目录,请运行以下命令 + +``` +# authconfig --enablemkhomedir --update +``` + +14. 最后,重启 Samba 守护进程使更改生效,并使用一个 AD 账户登陆验证域加入。AD 帐户的家目录应该会自动创建。 + +``` +# systemctl restart winbind +# su - domain_account +``` + [![Verify Domain Joining](https://www.tecmint.com/wp-content/uploads/2017/07/Verify-Domain-Joining.jpg)][15] + +验证域加入 + +15. 通过以下命令之一列出域用户或域组。 + +``` +# wbinfo -u +# wbinfo -g +``` + [![List Domain Users and Groups](https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-Users-and-Groups.png)][16] + +列出域用户和组 + +16. 要获取有关域用户的信息,请运行以下命令。 + +``` +# wbinfo -i domain_user +``` + [![List Domain User Info](https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-User-Info.jpg)][17] + +列出域用户信息 + +17. 要显示域摘要信息,请使用以下命令。 + +``` +# net ads info +``` + [![List Domain Summary](https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-Summary.jpg)][18] + +列出域摘要 + +### 步骤 3:使用 Samba4 AD DC 帐号登录CentOS + +18. 要在 CentOS 中与域用户进行身份验证,请使用以下命令语法之一。 + +``` +# su - ‘domain\domain_user’ +# su - domain\\domain_user +``` + +或者使用下面的语法来防止 winbind 使用 default domain = true 参数来设置 samba 配置文件。 + +``` +# su - domain_user +# su - domain_user@domain.tld +``` + +19. 要为域用户或组添加 root 权限,请使用 visudocommand 编辑 sudoers 文件,并添加以下截图所示的行。 + +``` +YOUR_DOMAIN\\domain_username ALL=(ALL:ALL) ALL #For domain users +%YOUR_DOMAIN\\your_domain\ group ALL=(ALL:ALL) ALL #For domain groups +``` + +如果 winbind 使用 default domain = true 参数设置 samba 配置文件,那么使用下面的配置。 + +``` +domain_username ALL=(ALL:ALL) ALL #For domain users +%your_domain\ group ALL=(ALL:ALL) ALL #For domain groups +``` + [![Grant Root Privileges on Domain Users](https://www.tecmint.com/wp-content/uploads/2017/07/Grant-Root-Privileges-on-Domain-Users.jpg)][19] + +授予域用户 root 权限 + +20. 针对 Samba4 AD DC 的以下一系列命令也可用于故障排除: + +``` +# wbinfo -p #Ping domain +# wbinfo -n domain_account #Get the SID of a domain account +# wbinfo -t #Check trust relationship +``` + +21. 要离开该域, 请使用具有提升权限的域帐户对你的域名运行以下命令。从 AD 中删除计算机帐户后, 重启计算机以在集成进程之前还原更改。 + +``` +# net ads leave -w DOMAIN -U domain_admin +# init 6 +``` + +就是这样了!尽管此过程主要集中在将 CentOS 7 服务器加入到 Samba4 AD DC 中,但这里描述的相同步骤也适用于将 CentOS 服务器集成到 Microsoft Windows Server 2012 AD 中。 + +-------------------------------------------------------------------------------- + +作者简介: + +Matei Cezar +我是一个电脑上瘾的家伙,开源和基于 linux 的系统软件的粉丝,在 Linux 发行版桌面、服务器和 bash 脚本方面拥有大约 4 年的经验。 + +------------------ + +via: https://www.tecmint.com/integrate-centos-7-to-samba4-active-directory/ + +作者:[Matei Cezar ][a] +译者:[geekpi](https://github.com/geekpi) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://www.tecmint.com/author/cezarmatei/ +[1]:https://www.tecmint.com/install-samba4-active-directory-ubuntu/ +[2]:https://www.tecmint.com/centos-7-3-installation-guide/ +[3]:https://www.tecmint.com/install-samba4-active-directory-ubuntu/ +[4]:https://www.tecmint.com/ip-command-examples/ +[5]:https://www.tecmint.com/wp-content/uploads/2017/07/List-Network-Interfaces.jpg +[6]:https://www.tecmint.com/wp-content/uploads/2017/07/Configure-Network-Interface.png +[7]:https://www.tecmint.com/wp-content/uploads/2017/07/Verify-DNS-Resolution-on-Domain.png +[8]:https://www.tecmint.com/wp-content/uploads/2017/07/Sync-Time-with-Samba4-AD-DC.png +[9]:https://www.tecmint.com/wp-content/uploads/2017/07/Authentication-Configuration.png +[10]:https://www.tecmint.com/wp-content/uploads/2017/07/Winbind-Settings.png +[11]:https://www.tecmint.com/wp-content/uploads/2017/07/Join-Domain-to-Samba4-AD-DC.png +[12]:https://www.tecmint.com/wp-content/uploads/2017/07/Confirm-Winbind-Settings.png +[13]:https://www.tecmint.com/manage-samba4-ad-from-windows-via-rsat/ +[14]:https://www.tecmint.com/wp-content/uploads/2017/07/Configure-Samba.jpg +[15]:https://www.tecmint.com/wp-content/uploads/2017/07/Verify-Domain-Joining.jpg +[16]:https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-Users-and-Groups.png +[17]:https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-User-Info.jpg +[18]:https://www.tecmint.com/wp-content/uploads/2017/07/List-Domain-Summary.jpg +[19]:https://www.tecmint.com/wp-content/uploads/2017/07/Grant-Root-Privileges-on-Domain-Users.jpg +[20]:https://www.tecmint.com/author/cezarmatei/ +[21]:https://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/ +[22]:https://www.tecmint.com/free-linux-shell-scripting-books/ From 1f27925a39a167e91e345a5bfb41db8e0e81998a Mon Sep 17 00:00:00 2001 From: geekpi Date: Wed, 9 Aug 2017 08:31:29 +0800 Subject: [PATCH 0943/1407] translating --- ...8 How modelling helps you avoid getting a stuck OpenStack.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md b/sources/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md index bf0eea18bf..ab05f37142 100644 --- a/sources/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md +++ b/sources/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md @@ -1,3 +1,5 @@ +translating---geekpi + How modelling helps you avoid getting a stuck OpenStack ============================================================ From 69ab92dc6eb9f5cdd20cd33dc722ca58d505be59 Mon Sep 17 00:00:00 2001 From: toyijiu <309378714@qq.com> Date: Wed, 9 Aug 2017 15:21:01 +0800 Subject: [PATCH 0944/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E4=B8=AD=20by=20to?= =?UTF-8?q?yijiu=20=E4=B9=8B=E5=89=8D=E9=80=89=E7=9A=84=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=E6=96=87=E7=AB=A0=E5=A4=AA=E9=95=BF=EF=BC=8C=E8=80=8C=E4=B8=94?= =?UTF-8?q?=E4=B8=8D=E6=98=AF=E5=96=9C=E6=AC=A2=E7=9A=84=E7=B1=BB=E5=9E=8B?= =?UTF-8?q?=EF=BC=8C=E5=B8=8C=E6=9C=9B=E6=8D=A2=E4=B8=80=E4=B8=AA=E7=9F=AD?= =?UTF-8?q?=E4=B8=80=E7=82=B9=E7=9A=84=EF=BC=8C=E6=AF=94=E8=BE=83=E6=84=9F?= =?UTF-8?q?=E5=85=B4=E8=B6=A3=E7=9A=84=E6=96=87=E7=AB=A0=E7=BF=BB=E8=AF=91?= =?UTF-8?q?=EF=BC=8C=E8=BF=98=E6=9C=9B=E6=89=B9=E5=87=86~?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- sources/talk/20170320 Education of a Programmer.md | 2 -- ...22 The What Why and Wow Behind the CoreOS Container Linux.md | 1 + 2 files changed, 1 insertion(+), 2 deletions(-) diff --git a/sources/talk/20170320 Education of a Programmer.md b/sources/talk/20170320 Education of a Programmer.md index 5672a26b38..5690c0fd5c 100644 --- a/sources/talk/20170320 Education of a Programmer.md +++ b/sources/talk/20170320 Education of a Programmer.md @@ -1,5 +1,3 @@ -翻译中 by WuXiao(toyijiu) - Education of a Programmer ============================================================ diff --git a/sources/tech/20170622 The What Why and Wow Behind the CoreOS Container Linux.md b/sources/tech/20170622 The What Why and Wow Behind the CoreOS Container Linux.md index 9f79c35776..8398c07aaf 100644 --- a/sources/tech/20170622 The What Why and Wow Behind the CoreOS Container Linux.md +++ b/sources/tech/20170622 The What Why and Wow Behind the CoreOS Container Linux.md @@ -1,3 +1,4 @@ +translated by toyijiu The What, Why and Wow! Behind the CoreOS Container Linux ============================================================ From 76a64f2e9f0feea14fae04e6fcc7f59ab0d4dc4d Mon Sep 17 00:00:00 2001 From: polebug Date: Wed, 9 Aug 2017 16:37:57 +0800 Subject: [PATCH 0945/1407] polebug is translating --- ...ing the move from Scala to Go and why were not going back.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170124 Making the move from Scala to Go and why were not going back.md b/sources/tech/20170124 Making the move from Scala to Go and why were not going back.md index 61283e4986..cef21ffece 100644 --- a/sources/tech/20170124 Making the move from Scala to Go and why were not going back.md +++ b/sources/tech/20170124 Making the move from Scala to Go and why were not going back.md @@ -1,3 +1,5 @@ +polebug is translating + Making the move from Scala to Go, and why we’re not going back ============================================================ From 53c422bb76031a6384afed26a9f7059702e6da0e Mon Sep 17 00:00:00 2001 From: wxy Date: Wed, 9 Aug 2017 17:11:37 +0800 Subject: [PATCH 0946/1407] PRF&PUB:20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @rieonke 翻译的很好,流畅而达意! --- ...CONTAINER INITIATIVE OCI SPECIFICATIONS.md | 44 ++++++++----------- 1 file changed, 19 insertions(+), 25 deletions(-) rename {translated/tech => published}/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md (50%) diff --git a/translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md b/published/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md similarity index 50% rename from translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md rename to published/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md index c8b79a054e..fde82f0023 100644 --- a/translated/tech/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md +++ b/published/20170719 DEMYSTIFYING THE OPEN CONTAINER INITIATIVE OCI SPECIFICATIONS.md @@ -1,73 +1,67 @@ 解密开放容器计划(OCI)规范 ============================================================ - -开放容器计划(OCI)宣布本周完成容器运行时和镜像的第一版规范。OCI 在是 Linux 基金会(Linux Foundation)支持下的容器解决方案标准化的成果。两年来,为了[建立这些规范][12]已经付出了大量的努力。 由此,让我们一起来回顾过去两年中出现的一些误区。 +开放容器计划Open Container Initiative(OCI)宣布本周完成了容器运行时和镜像的第一版规范。OCI 在是 Linux 基金会Linux Foundation支持下的容器解决方案标准化的成果。两年来,为了[建立这些规范][12]已经付出了大量的努力。 由此,让我们一起来回顾过去两年中出现的一些误区。 ![OCI](https://i1.wp.com/blog.docker.com/wp-content/uploads/logo_oci.png?resize=800%2C180&ssl=1) -**误区:OCI 是 Docker 的替代品** +### 误区:OCI 是 Docker 的替代品 -诚然标准非常重要,但它们远非一个完整的生产平台。 以万维网为例,它25年来一路演进,建立在诸如 TCP/IP ,HTTP 和 HTML 等核心可靠的标准之上。再以 TCP/IP 为例,当企业将 TCP/IP 合并为一种通用协议时,它推动了路由器行业,尤其是思科的发展。 然而,思科通过专注于在其路由平台上提供差异化的功能,而成为市场的领导者。我们认为 OCI 规范和 Docker 也是类似这样并行存在的。 +诚然标准非常重要,但它们远非一个完整的生产平台。 以万维网为例,它 25 年来一路演进,建立在诸如 TCP/IP 、HTTP 和 HTML 等可靠的核心标准之上。再以 TCP/IP 为例,当企业将 TCP/IP 合并为一种通用协议时,它推动了路由器行业,尤其是思科的发展。 然而,思科通过专注于在其路由平台上提供差异化的功能,而成为市场的领导者。我们认为 OCI 规范和 Docker 也是类似这样并行存在的。 [Docker 是一个完整的生产平台][13],提供了基于容器的开发、分发、安全、编排的一体化解决方案。Docker 使用了 OCI 规范,但它大约只占总代码的 5%,而且 Docker 平台只有一小部分涉及容器的运行时行为和容器镜像的布局。 -**误区:产品和项目已经通过了 OCI 规范认证** +### 误区:产品和项目已经通过了 OCI 规范认证 -运行时和镜像规范本周刚发布1.0的版本。 而且 OCI 认证计划仍在开发阶段,所以企业在认证正式推出之前(今年晚些时候),没法要求容器产品的合规性,一致性或兼容性。 +运行时和镜像规范本周刚发布 1.0 的版本。 而且 OCI 认证计划仍在开发阶段,所以企业在该认证正式推出之前(今年晚些时候),没法要求容器产品的合规性、一致性或兼容性。 -OCI [认证工作组][14] 目前正在制定标准,使容器产品和开源项目能够符合规范的要求。标准和规范对于实施解决方案的工程师很重要,但正式认证是向客户保证其正在使用的技术真正符合标准的唯一方式。 +OCI [认证工作组][14]目前正在制定标准,使容器产品和开源项目能够符合规范的要求。标准和规范对于实施解决方案的工程师很重要,但正式认证是向客户保证其正在使用的技术真正符合标准的唯一方式。 -**误区:Docker不支持 OCI 规范的工作** +### 误区:Docker 不支持 OCI 规范的工作 Docker 很早就开始为 OCI 做贡献。 我们向 OCI 贡献了大部分的代码,作为 OCI 项目的维护者,为 OCI 运行时和镜像规范定义提供了积极有益的帮助。Docker 运行时和镜像格式在 2013 年开源发布之后,便迅速成为事实上的标准,我们认为将代码捐赠给中立的管理机构,对于避免容器行业的碎片化和鼓励行业创新将是有益的。我们的目标是提供一个可靠和标准化的规范,因此 Docker 提供了一个简单的容器运行时 runc 作为运行时规范工作的基础,后来又贡献了 Docker V2 镜像规范作为 OCI 镜像规范工作的基础。 Docker 的开发人员如 Michael Crosby 和 Stephen Day 从一开始就是这项工作的关键贡献者,确保能将 Docker 的托管和运行数十亿个容器镜像的经验带给 OCI。等认证工作组完成(制定认证规范的)工作后,Docker 将通过 OCI 认证将其产品展示出来,以证明 OCI 的一致性。 -**误区:OCI 仅用于 Linux 容器技术** +### 误区:OCI 仅用于 Linux 容器技术 -因为 OCI 是由 Linux 基金会 (Linux Foundation) 负责制定的,所以很容易让人误解为 OCI 仅适用于 Linux 容器技术。 而实际上并非如此,尽管 Docker 技术源于 Linux 世界,但 Docker 也一直在与微软合作,将我们的容器技术、平台和工具带到 Windows Server 的世界。 此外,Docker 向 OCI 贡献的基础技术广泛适用于包括 Linux ,Windows 和 Solaris 在内的多种操作系统环境,涵盖了 x86,ARM 和 IBM zSeries 等多种架构环境。 +因为 OCI 是由 Linux 基金会Linux Foundation 负责制定的,所以很容易让人误解为 OCI 仅适用于 Linux 容器技术。 而实际上并非如此,尽管 Docker 技术源于 Linux 世界,但 Docker 也一直在与微软合作,将我们的容器技术、平台和工具带到 Windows Server 的世界。 此外,Docker 向 OCI 贡献的基础技术广泛适用于包括 Linux 、Windows 和 Solaris 在内的多种操作系统环境,涵盖了 x86、ARM 和 IBM zSeries 等多种架构环境。 -**误区:Docker 仅仅是OCI的众多贡献者之一** +### 误区:Docker 仅仅是 OCI 的众多贡献者之一 -OCI 作为一个支持成员众多的开放组织,代表了容器行业的广度。 也就是说,它是一个小而专业的个人技术专家组,为制作初始规范的工作贡献了大量的时间和技术。 Docker 是 OCI 的创始成员,贡献了初始代码库,构成了运行时规范的基础,后来引入了参考实现。 同样地,Docker 也将 Docker V2 镜像规范贡献给 OCI 作为镜像规范的基础。 +OCI 作为一个支持成员众多的开放组织,代表了容器行业的广度。 也就是说,它是一个小而专业的个人技术专家组,为制作初始规范的工作贡献了大量的时间和技术。 Docker 是 OCI 的创始成员,贡献了初始代码库,构成了运行时规范的基础和后来的参考实现。 同样地,Docker 也将 Docker V2 镜像规范贡献给 OCI 作为镜像规范的基础。 -**误区:CRI-O 是 OCI 项目** +### 误区:CRI-O 是 OCI 项目 -CRI-O 是云计算基金会(CNCF)Kubernetes 孵化器的开源项目 -- 它不是 OCI 项目。 它基于早期版本的 Docker 体系结构,而 containerd 是一个直接的 CNCF 项目,它是一个包括 runc 参考实现的更大的容器运行时。 containerd 负责镜像传输和存储,容器运行和监控,以及支持存储和网络附件等底层功能。 Docker 在五个最大的云提供商(阿里云,AWS,Google Cloud Platform (GCP),IBM Softlayer 和 Microsoft Azure)的支持下,将 containerd 捐赠给了云计算基金会(CNCF),作为多个容器平台和编排系统的核心容器运行时。 +CRI-O 是云计算基金会Cloud Native Computing Foundation(CNCF)的 Kubernetes 孵化器的开源项目 -- 它不是 OCI 项目。 它基于早期版本的 Docker 体系结构,而 containerd 是一个直接的 CNCF 项目,它是一个包括 runc 参考实现的更大的容器运行时。 containerd 负责镜像传输和存储、容器运行和监控,以及支持存储和网络附件等底层功能。 Docker 在五个最大的云提供商(阿里云、AWS、Google Cloud Platform(GCP)、IBM Softlayer 和 Microsoft Azure)的支持下,将 containerd 捐赠给了云计算基金会(CNCF),作为多个容器平台和编排系统的核心容器运行时。 -**误区:OCI 规范现在已经完成了** +### 误区:OCI 规范现在已经完成了 -虽然首版容器运行时和镜像格式规范的发布是一个重要的里程碑,但还有许多工作有待完成。 OCI 的一开始着眼于定义一个狭窄的规范:开发人员可以依赖于容器的运行时行为,防止容器行业碎片化,并且仍然允许在不断变化的容器域中进行创新。之后才将含容器镜像规范囊括其中。 +虽然首版容器运行时和镜像格式规范的发布是一个重要的里程碑,但还有许多工作有待完成。 OCI 一开始着眼于定义一个狭窄的规范:开发人员可以依赖于容器的运行时行为,防止容器行业碎片化,并且仍然允许在不断变化的容器域中进行创新。之后才将含容器镜像规范囊括其中。 随着工作组完成运行时行为和镜像格式的第一个稳定规范,新的工作考量也已经同步展开。未来的新特性将包括分发和签名等。 然而,OCI 的下一个最重要的工作是提供一个由测试套件支持的认证过程,因为第一个规范已经稳定了。 **在 Docker 了解更多关于 OCI 和开源的信息:** -* 阅读关于[OCI v1.0 版本的运行时和镜像格式规范]的博文[1] - +* 阅读关于 [OCI v1.0 版本的运行时和镜像格式规范]的博文[1] * 访问 [OCI 的网站][2] - * 访问 [Moby 项目网站][3] - * 参加 [DockerCon Europe 2017][4] - * 参加 [Moby Summit LA][5]  -------------------------------------------------------------------------------- 作者简介: -Stephen 是 Docker 开源项目总监。 他曾在 Hewlett-Packard Enterprise (惠普企业)担任董事和杰出技术专家。他的关于开源软件和商业的博客 “再次违约”(http://stephesblog.blogs.com) 和网站 opensource.com。 - +Stephen 是 Docker 开源项目总监。 他曾在 Hewlett-Packard Enterprise (惠普企业)担任董事和杰出技术专家。他的关于开源软件和商业的博客发布在 “再次违约”(http://stephesblog.blogs.com) 和网站 opensource.com 上。 ----------------- via: https://blog.docker.com/2017/07/demystifying-open-container-initiative-oci-specifications/ -作者:[Stephen ][a] +作者:[Stephen][a] 译者:[rieonke](https://github.com/rieonke) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 6efc68f4740a85b763cad7b93854a87db5c1c5bd Mon Sep 17 00:00:00 2001 From: toyijiu <309378714@qq.com> Date: Wed, 9 Aug 2017 22:07:56 +0800 Subject: [PATCH 0947/1407] =?UTF-8?q?=E7=BF=BB=E8=AF=91=E5=AE=8C=E6=88=90-?= =?UTF-8?q?20170622=20The=20What=20Why=20and=20Wow=20Behind=20the=20CoreOS?= =?UTF-8?q?=20Container=20Linux.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...d Wow Behind the CoreOS Container Linux.md | 95 ------------------- ...d Wow Behind the CoreOS Container Linux.md | 90 ++++++++++++++++++ 2 files changed, 90 insertions(+), 95 deletions(-) delete mode 100644 sources/tech/20170622 The What Why and Wow Behind the CoreOS Container Linux.md create mode 100644 translated/tech/20170622 The What Why and Wow Behind the CoreOS Container Linux.md diff --git a/sources/tech/20170622 The What Why and Wow Behind the CoreOS Container Linux.md b/sources/tech/20170622 The What Why and Wow Behind the CoreOS Container Linux.md deleted file mode 100644 index 8398c07aaf..0000000000 --- a/sources/tech/20170622 The What Why and Wow Behind the CoreOS Container Linux.md +++ /dev/null @@ -1,95 +0,0 @@ -translated by toyijiu -The What, Why and Wow! Behind the CoreOS Container Linux -============================================================ - - -![](https://cdn-images-1.medium.com/max/1600/1*znkOJQnw5_8Ko8VMEpRlpg.png) - -#### Latest Linux distro automatically updates kernel software and gives full configuration control across clusters. - -The usual debate over server Linux distributions begins with: - - _Do you use a _ [_Red Hat Enterprise Linux (RHEL)_][1] _-based distribution, such as _ [_CentOS_][2] _ or _ [_Fedora_][3] _; a _ [_Debian_][4] _-based Linux like _ [_Ubuntu_][5] _; or _ [_SUSE_][6] _?_ - -But now, [CoreOS Container Linux][7] joins the fracas. [CoreOS, recently offered by Linode on its servers][8], takes an entirely different approach than its more conventional, elder siblings. - -So, you may be asking yourself: “Why should I bother, when there are so many other solid Linux distros?” Well, I’ll let Greg Kroah-Hartman, the kernel maintainer for the Linux-stable branch and CoreOS advisor, start the conversation: - -> (CoreOS) handles distro updates (based on the ChromeOS code) combined with Docker and potentially checkpoint/restore, (which) means that you might be [able to update the distro under your application without stopping/starting the process/container.][9] I’ve seen it happen in testing, and it’s scary [good].” - -And that assessment came when CoreOS was in alpha. Back then, [CoreOS was being developed in — believe it or not — a Silicon Valley garage][10]. While CoreOS is no Apple or HPE, it’s grown considerably in the last four years. - -When I checked in on them at 2017’s [CoreOS Fest][11] in San Francisco, CoreOS had support from Google Cloud, IBM, Amazon Web Services, and Microsoft. The project itself now has over a thousand contributors. They think they’re on to something good, and I agree. - -Why? Because, CoreOS is a lightweight Linux designed from the get-go for running containers. It started as a [Docker][12] platform, but over time CoreOS has taken its own path to containers. It now supports both its own take on containers, [rkt][13] (pronounced rocket), and Docker. - -Unlike most Linux distributions, CoreOS doesn’t have a package manager. Instead it takes a page from Google’s ChromeOS and automates software updates to ensure better security and reliability of machines and containers running on clusters. Both operating system updates and security patches are regularly pushed to CoreOS Container Linux machines without sysadmin intervention. - -You control how often patches are pushed using [CoreUpdate, with its web-based interface][14]. This enables you to control when your machines update, and how quickly an update is rolled out across your cluster. - -Specifically, CoreOS does this with the the distributed configuration service [etcd][15]. This is an open-source, distributed key value store based on [YAML][16]. Etcd provides shared configuration and service discovery for Container Linux clusters. - -This service runs on each machine in a cluster. When one server goes down, say to update, it handles the leader election so that the overall Linux system and containerized applications keep running as each server is updated. - -To handle cluster management, [CoreOS used to use fleet][17]. This ties together [systemd][18] and etcd into a distributed init system. While fleet is still around, CoreOS has joined etcd with [Kubernetes][19] container orchestration to form an even more powerful management tool. - -CoreOS also enables you to declaratively customize other operating system specifications, such as network configuration, user accounts, and systemd units, with [cloud-config][20]. - -Put it all together and you have a Linux that’s constantly self-updating to the latest patches while giving you full control over its configuration from individual systems to thousand of container instances. Or, as CoreOS puts it, “You’ll never have to run [Chef ][21]on every machine in order to change a single config value ever again.” - -Let’s say you want to expand your DevOps control even further. [CoreOS helps you there, too, by making it easy to deploy Kubernetes][22]. - -So, what does all this mean? CoreOS is built from the ground-up to make it easy to deploy, manage and run containers. Yes, other Linux distributions, such as the Red Hat family with [Project Atomic][23], also enable you to do this, but for these distributions, it’s an add-on. CoreOS was designed from day one for containers. - -If you foresee using containers in your business — and you’d better because [Docker and containers are fast becoming  _The Way_  to develop and run business applications][24] — then you must consider CoreOS Container Linux, no matter whether you’re running on bare-metal, virtual machines, or the cloud. - -* * * - - _Please feel free to share below any comments or insights about your experience with or questions about CoreOS. And if you found this blog useful, please consider sharing it through social media._ - -* * * - - _About the blogger: Steven J. Vaughan-Nichols is a veteran IT journalist whose estimable work can be found on a host of channels, including _ [_ZDNet.com_][25] _, _ [_PC Magazine_][26] _, _ [_InfoWorld_][27] _, _ [_ComputerWorld_][28] _, _ [_Linux Today_][29] _ and _ [_eWEEK_][30] _. Steven’s IT expertise comes without parallel — he has even been a Jeopardy! clue. And while his views and cloud situations are solely his and don’t necessarily reflect those of Linode, we are grateful for his contributions. He can be followed on Twitter (_ [_@sjvn_][31] _)._ - --------------------------------------------------------------------------------- - -via: https://medium.com/linode-cube/the-what-why-and-wow-behind-the-coreos-container-linux-fa7ceae5593c - -作者:[Steven J. Vaughan-Nichols ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://medium.com/linode-cube/the-what-why-and-wow-behind-the-coreos-container-linux-fa7ceae5593c -[1]:https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux -[2]:https://www.centos.org/ -[3]:https://getfedora.org/ -[4]:https://www.debian.org/ -[5]:https://www.ubuntu.com/ -[6]:https://www.suse.com/ -[7]:https://coreos.com/os/docs/latest -[8]:https://www.linode.com/docs/platform/use-coreos-container-linux-on-linode -[9]:https://plus.google.com/+gregkroahhartman/posts/YvWFmPa9kVf -[10]:https://www.wired.com/2013/08/coreos-the-new-linux/ -[11]:https://coreos.com/fest/ -[12]:https://www.docker.com/ -[13]:https://coreos.com/rkt -[14]:https://coreos.com/products/coreupdate/ -[15]:https://github.com/coreos/etcd -[16]:http://yaml.org/ -[17]:https://github.com/coreos/fleet -[18]:https://www.freedesktop.org/wiki/Software/systemd/ -[19]:https://kubernetes.io/ -[20]:https://coreos.com/os/docs/latest/cloud-config.html -[21]:https://insights.hpe.com/articles/what-is-chef-a-primer-for-devops-newbies-1704.html -[22]:https://blogs.dxc.technology/2017/06/08/coreos-moves-in-on-cloud-devops-with-kubernetes/ -[23]:http://www.projectatomic.io/ -[24]:http://www.zdnet.com/article/what-is-docker-and-why-is-it-so-darn-popular/ -[25]:http://www.zdnet.com/meet-the-team/us/steven-j-vaughan-nichols/ -[26]:http://www.pcmag.com/author-bio/steven-j.-vaughan-nichols -[27]:http://www.infoworld.com/author/Steven-J.-Vaughan_Nichols/ -[28]:http://www.computerworld.com/author/Steven-J.-Vaughan_Nichols/ -[29]:http://www.linuxtoday.com/author/Steven+J.+Vaughan-Nichols/ -[30]:http://www.eweek.com/cp/bio/Steven-J.-Vaughan-Nichols/ -[31]:http://www.twitter.com/sjvn diff --git a/translated/tech/20170622 The What Why and Wow Behind the CoreOS Container Linux.md b/translated/tech/20170622 The What Why and Wow Behind the CoreOS Container Linux.md new file mode 100644 index 0000000000..d9d87d78ba --- /dev/null +++ b/translated/tech/20170622 The What Why and Wow Behind the CoreOS Container Linux.md @@ -0,0 +1,90 @@ +CoreOS,一款新的 Linux 发行版的相关介绍 +============================================================ + +![](https://cdn-images-1.medium.com/max/1600/1*znkOJQnw5_8Ko8VMEpRlpg.png) + +#### CoreOS,一款最新的 Linux 发行版本,支持自动升级内核软件,提供各集群间的全部配置操作控制。 + +关于使用哪个版本的 Linux 系统,我们常常会引发相关的讨论: +你是喜欢基于 [_Red Hat Enterprise Linux (RHEL)_][1] 的 [_CentOS_][2] 或者 [_Fedora_][3],还是基于 [_Debian_][4] 的 [_Ubuntu_][5] 和 [_SUSE_][6] 呢? + +但是现在,一款名叫 [CoreOS Container Linux][7] 的 Linux 发行版进入了我们的视野。和它的老前辈比起来,它使用了完全不同的实现方法,并且最近已经正式被部署到一家名叫 Linode 的美国 VPS 提供商的服务器上,为其提供[相关服务][8]。 + +你可能会感到不解,这里有这么多成熟的 Linux 发行版本,为什么要选择用 CoreOS ?借用 Linux 主干分支的维护人员,也是 CoreOS 的顾问的 Greg Kroah-Hartman 先生的一句话: + +> CoreOS 的发行版升级基于 ChromeOS 代码,不用断开 Docker,支持潜在的修复和核对,这意味着不用停止或者重启你的相关进程,就可以[在线升级][9], 测试版本已经支持此功能,这是史无前例的。 + +当 Greg Kroah-Hartman 做出这段评价时,CoreOS 还处于 α 的版本阶段,当时[开发团队正在硅谷的一个车库中紧锣密鼓地开发此产品][10],但 CoreOS 不像最开始的苹果或者惠普,在过去的四年当中一直稳步发展。 + +当我参加在旧金山举办的 [2017 CoreOS 大会][11]时,CoreOS 已经支持谷歌云、IBM、亚马逊和微软的相关服务。现在有超过 1000 位开发人员参与到这个项目中,并为能够成为这个伟大产品的一员而感到高兴。 + +究其原因,CoreOS 是基于 get-go 的轻量级容器化 Linux 发行版,最初基于 [Docker][12] 平台,随着版本的更新,现在除了 Docker ,也支持 [rkt][13] 和 自己的容器。 + +不像大多数其他的 Linux 发行版,CoreOS 没有包管理器,取而代之的是通过 Google ChromeOS 的页面自动进行软件升级,这样能提高在集群上运行的机器/容器的安全性和可靠性。不用通过系统管理员的干涉,操作系统升级组件和安全补丁可以定期自动地上传到 CoreOS 容器进行升级。 + +你可以通过 [CoreUpdate 接口][14]来修改周期上传的时间,这样你就可以控制软件升级的时间和速率。 + +CoreOS 通过一种叫做 [etcd][15] 的分布式配置服务来进行升级,etcd 基于 [YAML][16],是一个开源的分布式哈希表存储系统,它可以为 Linux 集群容器提供服务搜索和共享配置等功能。 + +此服务可作用于集群上的所有服务器,当其中一台服务器需要升级时,可通过集群选举算法来升级,而其他机器则照常运行。 + +对于集群管理,CoreOS 之前采用的是 [fleet][17] 方法,这将 etcd 和 [systemd][18] 强耦合到分布式初始化系统中。当 fleet 仍然在运行时,CoreOS 结合 etcd 和 [Kubernetes][19] 容器编制来构成一个更加强有力的管理工具。 + +CoreOS 也可以让你以声明的方式定义其他操作系统的相关规格,比如用[云配置][20]的方式管理网络配置,用户账号和系统网元等。 + +综上所述,CoreOS 可以自动升级到最新版本,能让你获得从单独系统到集群等各种场景的完全控制,你再也不用为了改变一个单独的配置而在每一个集群的机器上运行 [Chef][21] 配置了。 + +所以说,对于运维工程师来说,[CoreOS能够更加快速有效地帮助你部署各种平台系统][22]。 + +通过CoreOS自下而上的构建,运维人员能够更加容易地部署、管理和运行系统。当然有[原子计画的红帽][23]等其他 Linux 发行版本也可以达到类似的效果,但它是在后续版本中才扩展的附加组件,而 CoreOS 从它诞生的第一天就有了。 + +当前[基于容器和 Docker 的框架已经逐渐成为商业系统的主流][24],如果在可预见的未来,你要在工作中使用容器,你最好考虑下 CoreOS,不管你的系统是在云上、虚拟机还是裸机硬件上跑。 + +* * * +如果有任何关于 CoreOS 的观点或者问题,还请在评论栏中留言。如果你觉得这篇博客还算有用的话,还请分享一下~ +* * * + +关于博主:Steven J. Vaughan-Nichols 是一位经验丰富的 IT 记者,许多网站中都刊登有他的文章,包括 [_ZDNet.com_][25] _, _ [_PC Magazine_][26] _, _ [_InfoWorld_][27] _, _ [_ComputerWorld_][28] _, _ [_Linux Today_][29] 和 [_eWEEK_][30] 等. 他拥有丰富的 IT 知识 - 而且他曾参加过智力竞赛节目 Jeopardy !他的相关观点都是自身思考的结果,并不代表 Linode 公司,我们对他做出的贡献致以最真诚的感谢。如果想知道他更多的信息,可以关注他的 Twitter [_@sjvn_][31]. + +-------------------------------------------------------------------------------- + +via: https://medium.com/linode-cube/the-what-why-and-wow-behind-the-coreos-container-linux-fa7ceae5593c + +作者:[Steven J. Vaughan-Nichols ][a] +译者:[吴霄/toyijiu](https://github.com/toyijiu) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://medium.com/linode-cube/the-what-why-and-wow-behind-the-coreos-container-linux-fa7ceae5593c +[1]:https://www.redhat.com/en/technologies/linux-platforms/enterprise-linux +[2]:https://www.centos.org/ +[3]:https://getfedora.org/ +[4]:https://www.debian.org/ +[5]:https://www.ubuntu.com/ +[6]:https://www.suse.com/ +[7]:https://coreos.com/os/docs/latest +[8]:https://www.linode.com/docs/platform/use-coreos-container-linux-on-linode +[9]:https://plus.google.com/+gregkroahhartman/posts/YvWFmPa9kVf +[10]:https://www.wired.com/2013/08/coreos-the-new-linux/ +[11]:https://coreos.com/fest/ +[12]:https://www.docker.com/ +[13]:https://coreos.com/rkt +[14]:https://coreos.com/products/coreupdate/ +[15]:https://github.com/coreos/etcd +[16]:http://yaml.org/ +[17]:https://github.com/coreos/fleet +[18]:https://www.freedesktop.org/wiki/Software/systemd/ +[19]:https://kubernetes.io/ +[20]:https://coreos.com/os/docs/latest/cloud-config.html +[21]:https://insights.hpe.com/articles/what-is-chef-a-primer-for-devops-newbies-1704.html +[22]:https://blogs.dxc.technology/2017/06/08/coreos-moves-in-on-cloud-devops-with-kubernetes/ +[23]:http://www.projectatomic.io/ +[24]:http://www.zdnet.com/article/what-is-docker-and-why-is-it-so-darn-popular/ +[25]:http://www.zdnet.com/meet-the-team/us/steven-j-vaughan-nichols/ +[26]:http://www.pcmag.com/author-bio/steven-j.-vaughan-nichols +[27]:http://www.infoworld.com/author/Steven-J.-Vaughan_Nichols/ +[28]:http://www.computerworld.com/author/Steven-J.-Vaughan_Nichols/ +[29]:http://www.linuxtoday.com/author/Steven+J.+Vaughan-Nichols/ +[30]:http://www.eweek.com/cp/bio/Steven-J.-Vaughan-Nichols/ +[31]:http://www.twitter.com/sjvn From 8ec5a349f2c6541ca3a9a8109fee2f2c04333102 Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 10 Aug 2017 08:41:05 +0800 Subject: [PATCH 0948/1407] translated --- ...lps you avoid getting a stuck OpenStack.md | 78 ------------------- ...lps you avoid getting a stuck OpenStack.md | 76 ++++++++++++++++++ 2 files changed, 76 insertions(+), 78 deletions(-) delete mode 100644 sources/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md create mode 100644 translated/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md diff --git a/sources/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md b/sources/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md deleted file mode 100644 index ab05f37142..0000000000 --- a/sources/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md +++ /dev/null @@ -1,78 +0,0 @@ -translating---geekpi - -How modelling helps you avoid getting a stuck OpenStack -============================================================ - - -### Share or save - -![](https://insights.ubuntu.com/wp-content/uploads/bd5d/airbus.jpg) - - _Lego model of an Airbus A380-800\. Airbus run OpenStack_ - -A “StuckStack” is a deployment of OpenStack that usually, for technical but sometimes business reasons, is unable to be upgraded without significant disruption, time and expense. In the last post on this topic we discussed how many of these clouds became stuck and how the decisions made at the time were consistent with much of the prevailing wisdom of the day. Now, with OpenStack being 7 years old, the recent explosion of growth in container orchestration systems and more businesses starting to make use of cloud platforms, both public and private, OpenStack are under pressure. - -### No magic solution - -If you are still searching for a solution to upgrade your existing StuckStack in place without issues, then I have bad news for you: there are no magic solutions and you are best focusing your energy on building a standardised platform that can be operated efficiently and upgraded easily. - -The low cost airlines industry has shown that whilst flyers may aspire to best of breed experience and sit in first or business class sipping champagne with plenty of space to relax, most will choose to fly in the cheapest seat as ultimately the value equation doesn’t warrant them paying more. Workloads are the same. Long term, workloads will run on the platform where it is most economic to run them as the business really doesn’t benefit from running on premium priced hardware or software. - -Amazon, Microsoft, Google and other large scale public cloud players know this which is why they have built highly efficient data centres and used models to build, operate and scale their infrastructure. Enterprises have long followed a policy of using best of breed hardware and software infrastructure that is designed, built, marketed, priced, sold and implemented as first class experiences. The reality may not have always lived up to the promise but it matters not now anyway, as the cost model cannot survive in today’s world. Some organisations have tried to tackle this by switching to free software alternatives yet without a change in their own behaviour. Thus find that they are merely moving cost from software acquisition to software operation.The good news is that the techniques used by the large operators, who place efficient operations above all else, are available to organisations of all types now. - -### What is a software model? - -Whilst for many years software applications have been comprised of many objects, processes and services, in recent years it has become far more common for applications to be made up of many individual services that are highly distributed across servers in a data centre and across different data centres themselves. - -![](https://insights.ubuntu.com/wp-content/uploads/f881/OpenStack-graphic.png) - - _A simple representation of OpenStack Services_ - -Many services means many pieces of software to configure, manage and keep track of over many physical machines. Doing this at scale in a cost efficient way requires a model of how all the components are connected and how they map to physical resources. To build the model we need to have a library of software components, a means of defining how they connect with one another and a way to deploy them onto a platform, be it physical or virtual. At Canonical we recognised this several years ago and built [Juju][2], a generic software modelling tool that enables operators to compose complex software applications with flexible topologies, architectures and deployment targets from a catalogue of 100s of common software services. - -![](https://insights.ubuntu.com/wp-content/uploads/7790/jjuju.png) - - _Juju modelling OpenStack Services_ - -In Juju, software services are defined in something called a Charm. Charms are pieces of code, typically written in python or bash that give information about the service – the interfaces declared, how the service is installed, what other services it can connect to etc. - -Charms can be simple or complex depending on the level of intelligence you wish to give them. For OpenStack, Canonical, with help from the upstream OpenStack community, has developed a full set of Charms for the primary OpenStack services. The Charms represents the instructions for the model such that it can be deployed, operated scaled and replicated with ease. The Charms also define how to upgrade themselves including, where needed, the sequence in which to perform the upgrade and how to gracefully pause and resume services when required. By connecting Juju to a bare metal provisioning system such as [Metal As A Service (MAAS)][3] the logical model of OpenStack can is deployed to physical hardware. By default, the Charms will deploy services in LXC containers which gives greater flexibility to relocate services as required based on the cloud behaviour. Config is defined in the Charms or injected at deploy time by a 3rd party tool such as Puppet or Chef. - -There are 2 distinct benefits from this approach: 1 – by creating a model we have abstracted each of the cloud services from the underlying hardware and 2: we have the means to compose new architectures through iterations using the standardised components from a known source. This consistency is what enables us to deploy very different cloud architectures using the same tooling, safe in the knowledge that we will be able to operate and upgrade them easily. - -With hardware inventory being managed with a fully automated provisioning tool and software applications modelled, operators can scale infrastructure much more efficiently than using legacy enterprise techniques or building a bespoke system that deviates from core. Valuable development resources can be focused on innovating in the application space, bringing new software services online faster rather than altering standard, commodity infrastructure in a way which will create compatibility problems further down the line. - -In the next post I’ll highlight some of the best practises for deploying a fully modelled OpenStack and how you can get going quickly. If you have an existing StuckStack then whilst we aren’t going to be able to rescue it that easily, we will be able to get you on a path to fully supported, efficient infrastructure with operations cost that compares to public cloud. - -### Upcoming webinar - -If you are stuck on an old version of OpenStack and want to upgrade your OpenStack cloud easily and without downtime, watch our [on-demand webinar][4] with live demo of an upgrade from Newton to Ocata. - -### Contact us - -If you would like to learn more about migrating to a Canonical OpenStack cloud, [get in touch][5]. - --------------------------------------------------------------------------------- - -作者简介: - -Cloud Product Manager focused on Ubuntu OpenStack. Previously at MySQL and Red Hat. Likes motorcycles and meeting people who do interesting stuff with Ubuntu and OpenStack - - ------- - - -via: https://insights.ubuntu.com/2017/07/18/stuckstack-how-modelling-helps-you-avoid-getting-a-stuck-openstack/ - -作者:[Mark Baker ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://insights.ubuntu.com/author/markbaker/ -[1]:https://insights.ubuntu.com/author/markbaker/ -[2]:https://www.ubuntu.com/cloud/juju -[3]:https://www.ubuntu.com/server/maas -[4]:http://ubunt.eu/Bwe7kQ -[5]:http://ubunt.eu/3OYs5s diff --git a/translated/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md b/translated/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md new file mode 100644 index 0000000000..5cad8ffe47 --- /dev/null +++ b/translated/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md @@ -0,0 +1,76 @@ +如何建模可以帮助你避免在 OpenStack 中遇到问题 +============================================================ + + +### 分享或保存 + +![](https://insights.ubuntu.com/wp-content/uploads/bd5d/airbus.jpg) + + _乐高的空客 A380-800模型。空客运行 OpenStack_ + +“StuckStack” 是 OpenStack 的一种部署方式,通常由于技术上但有时是商业上的原因,它无法在没有明显中断、时间和费用的情况下升级。在关于这个话题的最后一篇文章中,我们讨论了这些云中有多少陷入僵局,当时的决定与当今大部分的智慧是一致的。现在 OpenStack 已经有 7 年了,最近随着容器编排系统的增长以及更多企业开始利用公共和私有的云平台,OpenStack 正面临着压力。 + + +### 没有魔法解决方案 + +如果你仍在寻找一个解决方案来没有任何问题地升级你现有的 StuckStack, 那么我有坏消息给你: 有没有魔法解决方案, 你最好集中精力建立一个标准化的平台, 它可以有效地操作和升级。 + +低成本航空业已经表明, 虽然乘客可能渴望最好的体验, 可以坐在头等舱或者商务舱喝香槟, 有足够的空间放松, 但是大多数人会选择乘坐最便宜的, 最终价值等式不保证他们付出更多的代价。工作负载是相同的。长期而言, 工作负载将运行在最经济的平台上, 因为在高价硬件或软件上运行的业务实际上并没有受益。 + +Amazon、Microsoft、Google 等大型公共云企业都知道,这就是为什么他们建立了高效的数据中心, 并使用模型来构建、操作和扩展基础设施。长期以来,企业一直奉行以设计、制造、市场、定价、销售,实施为一体的最优秀的硬件和软件基础设施。现实可能并不总是符合承诺,但由于成本模式在当今世界无法生存,所以现在还不重要。一些组织试图通过改用免费软件替代, 而不改变自己的行为来解决这一问题。因此, 他们发现, 他们只是将成本从软件获取变到软件操作。好消息是,那些高效运营的大型运营商使用的技术,现在可用于所有类型的组织。 + +### 什么是软件模型? + +虽然许多年来, 软件程序由许多对象、进程和服务组成, 但近年来, 程序是普遍由许多单独的服务组成, 它们高度分布式地分布在数据中心的不同服务器以及跨越数据中心的服务器上。 + +![](https://insights.ubuntu.com/wp-content/uploads/f881/OpenStack-graphic.png) + + _OpenStack 服务的简单演示_ + +许多服务意味着许多软件需要配置、管理并跟踪许多物理机器。以成本效益的方式规模化地进行这一工作需要一个模型,即所有组件如何连接以及它们如何映射到物理资源。为了构建模型,我们需要有一个软件组件库,这是一种定义它们如何彼此连接以及将其部署到平台上的方法,无论是物理还是虚拟。在 Canonical 公司,我们几年前就认识到这一点,并建立了一个通用的软件建模工具 [Juju][2],使得运营商能够从 100 个通用软件服务目录中组合灵活的拓扑结构、架构和部署目标。 + +![](https://insights.ubuntu.com/wp-content/uploads/7790/jjuju.png) + + _Juju 建模 OpenStack 服务_ + +在 Juju 中,软件服务被定义为一种叫做 Charm 的东西。 Charms 是代码片段,它通常用 python 或 bash 编写,其中提供有关服务的信息 - 声明的接口、服务的安装方式、可连接的其他服务等。 + +Charms 可以简单或者复杂,具体取决于你想要赋予的功能。对于 OpenStack,Canonical 在上游 OpenStack 社区的帮助下,为主要 OpenStack 服务开发了一套完整的 Charms。Charms 代表了模型的说明,使其可以轻松地部署、操作扩展和复制。Charms 还定义了如何升级自身,包括在需要时执行升级的顺序以及如何在需要时优雅地暂停和恢复服务。通过将 Juju 连接到诸如[裸机即服务(MAAS)][3]这样的裸机配置系统,其中 OpenStack 的逻辑模型可以部署到物理硬件上。默认情况下,Charms 将在 LXC 容器中部署服务,从而根据云行为的需要, 提供更大的灵活性来重新定位服务。配置在 Charms 中定义,或者在部署时由第三方工具(如 Puppet 或 Chef)注入。 + +这种方法有两个不同的好处:1 - 通过创建一个模型,我们从底层硬件抽象出每个云服务。2 - 使用已知来源的标准化组件,通过迭代组合新的架构。这种一致性使我们能够使用相同的工具部署非常不同的云架构,运行和升级这些工具是安全的。 + +通过全面自动化的配置工具和软件程序来管理硬件库存,运营商可以比使用传统企业技术或构建偏离核心的定制系统更有效地扩展基础架构。有价值的开发资源可以集中在创新应用领域,使新的软件服务更快上线,而不是改变标准的商品基础设施, 这将会导致进一步的兼容性问题。 + +在下一篇文章中,我将介绍部署完全建模的 OpenStack 的一些最佳实践,以及如何快速地进行操作。如果你有一个现有的 StuckStack, 那么虽然我们不能很容易地拯救它, 但是与公有云相比,我们将能够让你走上一条完全支持的、高效的基础架构以及运营成本的道路。 + +### 即将举行的网络研讨会 + +如果你在旧版本的 OpenStack 中遇到问题,并且想要轻松升级 OpenStack 云并且无需停机,请观看我们的[在线点播研讨会][4],从 Newton 升级到 Ocata 的现场演示。 + +### 联系我们 + +如果你想了解有关迁移到 Canonical OpenStack 云的更多信息,请[联系][5]。 + +-------------------------------------------------------------------------------- + +作者简介: + +专注于 Ubuntu OpenStack 的云产品经理。以前在 MySQL 和 Red Hat 工作。喜欢摩托车,遇见使用 Ubuntu 和 Openstack 做有趣事的人。 + +------ + + +via: https://insights.ubuntu.com/2017/07/18/stuckstack-how-modelling-helps-you-avoid-getting-a-stuck-openstack/ + +作者:[Mark Baker ][a] +译者:[译者ID](https://github.com/译者ID) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://insights.ubuntu.com/author/markbaker/ +[1]:https://insights.ubuntu.com/author/markbaker/ +[2]:https://www.ubuntu.com/cloud/juju +[3]:https://www.ubuntu.com/server/maas +[4]:http://ubunt.eu/Bwe7kQ +[5]:http://ubunt.eu/3OYs5s From f6464ce07f5f20644003f24e0872df4695bb5363 Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 10 Aug 2017 08:42:21 +0800 Subject: [PATCH 0949/1407] translated --- ...8 How modelling helps you avoid getting a stuck OpenStack.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/translated/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md b/translated/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md index 5cad8ffe47..c9076ec50f 100644 --- a/translated/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md +++ b/translated/tech/20170718 How modelling helps you avoid getting a stuck OpenStack.md @@ -63,7 +63,7 @@ Charms 可以简单或者复杂,具体取决于你想要赋予的功能。对 via: https://insights.ubuntu.com/2017/07/18/stuckstack-how-modelling-helps-you-avoid-getting-a-stuck-openstack/ 作者:[Mark Baker ][a] -译者:[译者ID](https://github.com/译者ID) +译者:[geekpi](https://github.com/geekpi) 校对:[校对者ID](https://github.com/校对者ID) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 2be2f3ca1a7b99dd4fa1ecde65d49c00ddbc3cff Mon Sep 17 00:00:00 2001 From: geekpi Date: Thu, 10 Aug 2017 08:45:50 +0800 Subject: [PATCH 0950/1407] translating --- .../20170117 The Age of the Unikernel- 10 Projects to Know.md | 2 ++ 1 file changed, 2 insertions(+) diff --git a/sources/tech/20170117 The Age of the Unikernel- 10 Projects to Know.md b/sources/tech/20170117 The Age of the Unikernel- 10 Projects to Know.md index 45cf389712..fdda74b4e7 100644 --- a/sources/tech/20170117 The Age of the Unikernel- 10 Projects to Know.md +++ b/sources/tech/20170117 The Age of the Unikernel- 10 Projects to Know.md @@ -1,3 +1,5 @@ +translating---geekpi + The Age of the Unikernel: 10 Projects to Know ============================================================ From 31e744876b3f7191ab9062cdd98002b4f2329fa3 Mon Sep 17 00:00:00 2001 From: dimple <786796696@qq.com> Date: Thu, 10 Aug 2017 10:03:54 +0800 Subject: [PATCH 0951/1407] 20170705 Two great uses for the cp command (#5916) * translated * Update 20170705 Two great uses for the cp command.md * Update 20170705 Two great uses for the cp command.md * Update 20170705 Two great uses for the cp command.md --- ...70705 Two great uses for the cp command.md | 206 ------------------ ...70705 Two great uses for the cp command.md | 188 ++++++++++++++++ 2 files changed, 188 insertions(+), 206 deletions(-) delete mode 100644 sources/tech/20170705 Two great uses for the cp command.md create mode 100644 translated/tech/20170705 Two great uses for the cp command.md diff --git a/sources/tech/20170705 Two great uses for the cp command.md b/sources/tech/20170705 Two great uses for the cp command.md deleted file mode 100644 index c7d9eda069..0000000000 --- a/sources/tech/20170705 Two great uses for the cp command.md +++ /dev/null @@ -1,206 +0,0 @@ -【big_dimple翻译中】 -Two great uses for the cp command -============================================================ - -### Linux's copy command makes quick work of making specialized backups. - - -![Two great uses for the cp command](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/car-penguin-drive-linux-yellow.png?itok=ueZE5mph "Two great uses for the cp command") -Image by :  - -Internet Archive [Book][10] [Images][11]. Modified by Opensource.com. CC BY-SA 4.0 - -The point-and-click graphical user interface available on Linux is a wonderful thing... but if your favorite interactive development environment consists of the terminal window, Bash, Vim, and your favorite language compiler, then, like me, you use the terminal  _a lot_ . - -But even people who generally avoid the terminal can benefit by being more aware of the riches that its environment offers. A case in point – the **cp** command. [According to Wikipedia][12], the **cp** (or copy) command was part of Version 1 of [Unix][13]. Along with a select group of other commands—**ls**, **mv**, **cd**, **pwd**, **mkdir**, **vi**, **sh**, **sed**, and **awk** come to mind—**cp** was one of my first few steps in System V Unix back in 1984\. The most common use of **cp** is to make a copy of a file, as in: - -``` -cp sourcefile destfile -``` - -More Linux resources - -* [What is Linux?][1] - -* [What are Linux containers?][2] - -* [Download Now: Linux commands cheat sheet][3] - -* [Advanced Linux commands cheat sheet][4] - -* [Our latest Linux articles][5] - -issued at the command prompt in a terminal session. The above command copies the file named **sourcefile** to the file named **destfile**. If **destfile** doesn't exist before the command is issued, it's created; if it does exist, it's overwritten. - -I don't know how many times I've used this command (maybe I don't want to know), but I do know that I often use it when I'm writing and testing code and I have a working version of something that I want to retain as-is before I move on. So, I have probably typed something like this: - -``` -cp test1.py test1.bak -``` - -at a command prompt at least a zillion times over the past 30+ years. Alternatively, I might have decided to move on to version 2 of my test program, in which case I may have typed: - -``` -cp test1.py test2.py -``` - -to accomplish the first step of that move. - -This is such a common and simple thing to do that I have rarely ever looked at the reference documentation for **cp**. But, while backing up my Pictures folder (using the Files application in my GUI environment), I started thinking, "I wonder if there is an option to have **cp** copy over only new files or those that have changed?" And sure enough, there is! - -### Great use #1: Updating a second copy of a folder - -Let's say I have a folder on my computer that contains a collection of files. Furthermore, let's say that from time to time I put a new file into that collection. Finally, let's say that from time to time I might edit one of those files in some way. An example of such a collection might be the photos I download from my cellphone or my music files. - -Assuming that this collection of files has some enduring value to me, I might occasionally want to make a copy of it—a kind of "snapshot" of it—to preserve it on some other media. Of course, there are many utility programs that exist for doing backups, but maybe I want to have this exact structure duplicated on a removable device that I generally store offline or even connect to another computer. - -The **cp** command offers a dead-easy way to do this. Here's an example. - -In my **Pictures** folder, I have a sub-folder called **Misc**. For illustrative purposes, I'm going to make a copy of it on a USB memory stick. Here we go! - -``` -me@desktop:~/Pictures$ cp -r Misc /media/clh/4388-D5FE -me@desktop:~/Pictures$ -``` - -The above lines are copied as-is from my terminal window. For those who might not be fully comfortable with that environment, it's worth noting that **me @mydesktop:~/Pictures$** is the command prompt provided by the terminal before every command is entered and executed. It identifies the user (**me**), the computer (**mydesktop**), and the current working directory, in this case, **~/Pictures**, which is shorthand for **/home/me/Pictures**, that is, the **Pictures** folder in my home directory. - -The command I've entered and executed, **cp -r Misc /media/clh/4388-D5FE**, copies the folder **Misc** and all its contents (the **-r**, or "recursive," option indicates the contents as well as the folder or file itself) into the folder **/media/clh/4388-D5FE**, which is where my USB stick is mounted. - -Executing the command returned me to the original prompt. Like with most commands inherited from Unix, if the command executes without detecting any kind of anomalous result, it won't print out a message like "execution succeeded" before terminating. People who would like more feedback can use the **-v** option to make execution "verbose." - -Below is an image of my new copy of **Misc** on the USB drive. There are nine JPEG files in the directory. - -### [cp1_file_structure.png][6] - -![Image of the new copy of Misc on the USB drive](https://opensource.com/sites/default/files/u128651/cp1_file_structure.png "Image of the new copy of Misc on the USB drive") - -Suppose I add a few new files to the master copy of the directory **~/Pictures/Misc**, so now it looks like this: - -### [cp2_new_files.png][7] - -![New files added to the master directory](https://opensource.com/sites/default/files/u128651/cp2_new_files.png "New files added to the master directory") - -Now I want to copy over only the new files to my memory stick. For this I'll use the "update" and "verbose" options to **cp**: - -``` -me@desktop:~/Pictures$ cp -r -u -v Misc /media/clh/4388-D5FE -'Misc/asunder.png' -> '/media/clh/4388-D5FE/Misc/asunder.png' -'Misc/editing tags guayadeque.png' -> '/media/clh/4388-D5FE/Misc/editing tags guayadeque.png' -'Misc/misc on usb.png' -> '/media/clh/4388-D5FE/Misc/misc on usb.png' -me@desktop:~/Pictures$ -``` - -The first line above shows the **cp** command and its options (**-r** for "recursive", **-u** for "update," and **-v** for "verbose"). The next three lines show the files that are copied across. The last line shows the command prompt again. - -Generally speaking, options such as **-r** can also be given in a more verbose fashion, such as **--recursive**. In brief form, they can also be combined, such as **-ruv**. - -### Great use #2 – Making versioned backups - -Returning to my initial example of making periodic backups of working versions of code in development, another really useful **cp** option I discovered while learning about update is backup. - -Suppose I'm setting out to write a really useful Python program. Being a fan of iterative development, I might do so by getting a simple version of the program working first, then successively adding more functionality to it until it does the job. Let's say my first version just prints the string "hello world" using the Python print command. This is a one-line program that looks like this: - -``` -print 'hello world' -``` - -and I've put that string in the file **test1.py**. I can run it from the command line as follows: - -``` -me@desktop:~/Test$ python test1.py -hello world -me@desktop:~/Test$ -``` - -Now that the program is working, I want to make a backup of it before adding the next component. I decide to use the backup option with numbering, as follows: - -``` -clh@vancouver:~/Test$ cp --force --backup=numbered test1.py test1.py -clh@vancouver:~/Test$ ls -test1.py  test1.py.~1~ -clh@vancouver:~/Test$ -``` - -So, what does this all mean? - -First, the **--backup=numbered** option says, "I want to do a backup, and I want successive backups to be numbered." So the first backup will be number 1, the second 2, and so on. - -Second, note that the source file and destination file are the same. Normally, if we try to use the **cp** command to copy a file onto itself, we will receive a message like: - -``` -cp: 'test1.py' and 'test1.py' are the same file -``` - -In the special case where we are doing a backup and we want the same source and destination, we use the **--force** option. - -Third, I used the **ls** (or "list") command to show that we now have a file called **test1.py**, which is the original, and another called **test1.py.~1~**, which is the backup file. - -Suppose now that the second bit of functionality I want to add to the program is another print statement that prints the string "Kilroy was here." Now the program in file **test1.py**looks like this: - -``` -print 'hello world' -print 'Kilroy was here' -``` - -See how simple Python programming is? Anyway, if I again execute the backup step, here's what happens: - -``` -clh@vancouver:~/Test$ cp --force --backup=numbered test1.py test1.py -clh@vancouver:~/Test$ ls -test1.py test1.py.~1~ test1.py.~2~ -clh@vancouver:~/Test$ -``` - -Now we have two backup files: **test1.py.~1~**, which contains the original one-line program, and **test1.py.~2~**, which contains the two-line program, and I can move on to adding and testing some more functionality. - -This is such a useful thing to me that I am considering making a shell function to make it simpler. - -### Three points to wrap this up - -First, the Linux manual pages, installed by default on most desktop and server distros, provide details and occasionally useful examples of commands like **cp**. At the terminal, enter the command: - -``` -man cp -``` - -Such explanations can be dense and obscure to users just trying to learn how to use a command in the first place. For those inclined to persevere nevertheless, I suggest creating a test directory and files and trying the command and options out there. - -Second, if a tutorial is of greater interest, the search string "linux shell tutorial" typed into your favorite search engine brings up a lot of interesting and useful resources. - -Third, if you're wondering, "Why bother when the GUI typically offers the same functionality with point-and-click ease?" I have two responses. The first is that "point-and-click" isn't always that easy, especially when it disrupts another workflow and requires a lot of points and a lot of clicks to make it work. The second is that repetitive tasks can often be easily streamlined through the use of shell scripts, shell functions, and shell aliases. - -Are you using the **cp** command in new or interesting ways? Let us know about them in the comments. - --------------------------------------------------------------------------------- - -作者简介: - -Chris Hermansen - Engaged in computing since graduating from the University of British Columbia in 1978, I have been a full-time Linux user since 2005 and a full-time Solaris, SunOS and UNIX System V user before that. On the technical side of things, I have spent a great deal of my career doing data analysis; especially spatial data analysis. I have a substantial amount of programming experience in relation to data analysis, using awk, Python, PostgreSQL, PostGIS and lately Groovy. - - -via: https://opensource.com/article/17/7/two-great-uses-cp-command - -作者:[ Chris Hermansen ][a] -译者:[译者ID](https://github.com/译者ID) -校对:[校对者ID](https://github.com/校对者ID) - -本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - -[a]:https://opensource.com/users/clhermansen -[1]:https://opensource.com/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent -[6]:https://opensource.com/file/360601 -[7]:https://opensource.com/file/360606 -[8]:https://opensource.com/article/17/7/two-great-uses-cp-command?rate=87TiE9faHZRes_f4Gj3yQZXhZ-x7XovYhnhjrk3SdiM -[9]:https://opensource.com/user/37806/feed -[10]:https://www.flickr.com/photos/internetarchivebookimages/14746482994/in/photolist-ot6zCN-odgbDq-orm48o-otifuv-otdyWa-ouDjnZ-otGT2L-odYVqY-otmff7-otGamG-otnmSg-rxnhoq-orTmKf-otUn6k-otBg1e-Gm6FEf-x4Fh64-otUcGR-wcXsxg-tLTN9R-otrWYV-otnyUE-iaaBKz-ovcPPi-ovokCg-ov4pwM-x8Tdf1-hT5mYr-otb75b-8Zk6XR-vtefQ7-vtehjQ-xhhN9r-vdXhWm-xFBgtQ-vdXdJU-vvTH6R-uyG5rH-vuZChC-xhhGii-vvU5Uv-vvTNpB-vvxqsV-xyN2Ai-vdXcFw-vdXuNC-wBMhes-xxYmxu-vdXxwS-vvU8Zt -[11]:https://www.flickr.com/photos/internetarchivebookimages/14774719031/in/photolist-ovAie2-otPK99-xtDX7p-tmxqWf-ow3i43-odd68o-xUPaxW-yHCtWi-wZVsrD-DExW5g-BrzB7b-CmMpC9-oy4hyF-x3UDWA-ow1m4A-x1ij7w-tBdz9a-tQMoRm-wn3tdw-oegTJz-owgrs2-rtpeX1-vNN6g9-owemNT-x3o3pX-wiJyEs-CGCC4W-owg22q-oeT71w-w6PRMn-Ds8gyR-x2Aodm-owoJQm-owtGp9-qVxppC-xM3Gw7-owgV5J-ou9WEs-wihHtF-CRmosE-uk9vB3-wiKdW6-oeGKq3-oeFS4f-x5AZtd-w6PNuv-xgkofr-wZx1gJ-EaYPED-oxCbFP -[12]:https://en.wikipedia.org/wiki/Cp_(Unix) -[13]:https://en.wikipedia.org/wiki/Unix -[14]:https://opensource.com/users/clhermansen -[15]:https://opensource.com/users/clhermansen -[16]:https://opensource.com/article/17/7/two-great-uses-cp-command#comments diff --git a/translated/tech/20170705 Two great uses for the cp command.md b/translated/tech/20170705 Two great uses for the cp command.md new file mode 100644 index 0000000000..48fb8224a7 --- /dev/null +++ b/translated/tech/20170705 Two great uses for the cp command.md @@ -0,0 +1,188 @@ +【big_dimple翻译完成】 +# cp命令两个高效的用法 + +============================================================ + +### Linux中高效的备份拷贝命令 + + +![Two great uses for the cp command](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/car-penguin-drive-linux-yellow.png?itok=ueZE5mph "Two great uses for the cp command") + +图像来自于:Opensource.com + +在Linux上能使用图形化界面是一件很美妙的事...但是如果你像我一样,喜欢的开发交互环境和编译器是终端窗口,Bash 和 Vim,那你将会经常和终端打交道。 + +即使是不经常使用终端的人,也能通过终端提供的环境来获取很多有用的知识。举个例子—**cp**命令,通过[Wiki百科][12]的解释,**cp** (或者copy)命令是[Unix][13]系统第一个版本中的一部分。以及其他的一组命令 **ls**, **mv**, **cd**, **pwd**, **mkdir**, **vi**, **sh**, **sed**, 和 **awk** 还有我们所说的 **cp** 都是在 1984 年构造Unix系统第一个版本中最初的几步。**cp** 命令最常见的用法是复制文件。像这样: + +``` +cp sourcefile destfile +``` +在终端中执行此命令,上述命令将名为 **sourcefile** 的文件复制到名为 **destfile** 的文件中。如果在执行命令之前 **destfile** 文件不存在,那将会创建此文件,如果已经存在,那就会覆盖此文件。 + +这个命令我不知道自己用了多少次了(或许我不想知道),但是我知道在我测试代码的时候,我经常用,为了保留当前版本,而且又能继续修改,我会输入这个命令: + +``` +cp test1.py test1.bak +``` +在过去的30多年里,我使用了无数次这个命令。另外,当我决定编写我的第二版测试程序时,我会输入这个命令: + +``` +cp test1.py test2.py +``` +这样就完成了修改程序版本的第一步。 + +我通常很少查看 **cp** 命令的参考文档,但是当我在备份我的图片文件夹的时候(在GUI环境下使用文件应用),我开始思考“在 **cp** 命令中是否有个参数支持只复制新文件或者是修改过的文件。”果然,真的有! + +### 高效用法1:更新你的文件夹 +比如说在我的电脑上有一个存放各种文件的文件夹,另外我要不时的往里面添加一些新文件,而且我会不时地修改一些文件,例如我手机里下载的照片或者是音乐。 + +假设我收集的这些文件对我而言都很有价值,我有时候会想做个拷贝,就像是“快照”一样将文件保存在其它媒体。当然目前有很多程序都支持备份,但是我想更为精确的将目录结构复制到可移动设备中,方便于我经常使用这些离线设备或者连接到其它电脑上。 + + **cp** 命令提供了一个易如反掌的方法。例子如下: + +在我的 **Pictures** 文件夹下,我有这样一个文件夹名字为 **Misc**。为了方便说明,我把文件拷贝到USB存储设备上。让我们开始吧! + +``` +me@desktop:~/Pictures$ cp -r Misc /media/clh/4388-D5FE +me@desktop:~/Pictures$ +``` +上面的命令是我从按照终端窗口中完整复制下来的。对于有些人来说这种环境可能不是很舒服,在我们输入命令或者执行命令之前,需要注意的是 **me@mydesktop:~/Pictures** 这个前缀,(**me**)这个是当前用户,(**mydesktop**)这是电脑名称,(**~/Pictures**)这个是当前工作目录,是(**/home/me/Pictures**)完整路径的缩写。 + +我输入这个命令并执行后(**cp -r Misc /media/clh/4388-D5FE**),拷贝 **Misc** 目录下所有文件(这个 **-r**参数,全称“recursive”,递归处理,意思为本目录下所有文件及子目录一起处理)到我的USB设备的挂载目录 **/media/clh/4388-D5FE**。 + +执行命令后回到之前的提示,大多数命令继承了Unix的特性,在命令执行后,如果没有任何异常什么都不显示,在任务结束之前不会显示像“execution succeeded“这样的提示符。如果想获取更多的反馈,就使用 **-v** 参数让执行结果更详细。 + +下图中是我的USB设备中刚刚拷贝过来的文件夹 **Misc** ,里面总共有 9 张图片。 + +### [cp1_file_structure.png][6] + +![Image of the new copy of Misc on the USB drive](https://opensource.com/sites/default/files/u128651/cp1_file_structure.png "Image of the new copy of Misc on the USB drive") + +假设我要在原始拷贝路径下 **~/Pictures/Misc** 下添加一些新文件,就像这样: + +### [cp2_new_files.png][7] + +![New files added to the master directory](https://opensource.com/sites/default/files/u128651/cp2_new_files.png "New files added to the master directory") + +现在我想只拷贝新的文件到我的存储设备上,我就使用 **cp** 的“update”和“verbose”选项。 + +``` +me@desktop:~/Pictures$ cp -r -u -v Misc /media/clh/4388-D5FE +'Misc/asunder.png' -> '/media/clh/4388-D5FE/Misc/asunder.png' +'Misc/editing tags guayadeque.png' -> '/media/clh/4388-D5FE/Misc/editing tags guayadeque.png' +'Misc/misc on usb.png' -> '/media/clh/4388-D5FE/Misc/misc on usb.png' +me@desktop:~/Pictures$ +``` +上面的第一行中是 **cp** 命令和具体的参数(**-r** 是“recursive”, **-u** 是“update”,**-v** 是“verbose”)。接下来的三行显示被复制文件的信息,最后一行显示命令行前缀。 + +通常来说,参数 **-r** 也可用用更详细的方式使用 **--recursive**。但是以简短的方式,也可以这么用 **-ruv**。 + +###高效用法2:版本备份 + +回到一开始的例子中,我在开发的时候定期给我的代码版本进行备份。然后我找到了另一种更好用的 **cp** 参数。 + +假设我正在编写一个非常有用的Python程序,作为一个喜欢不断修改代码的开发者,我会在一开始定义一个程序简单版本,然后不停的忘里面添加各种功能直到它能成功的运行起来。比方说我的第一个版本就是用Python程序打印出“hello world”。这只有一行代码的程序就像这样: + +``` +print 'hello world' +``` + +然后我将这个代码保存成文件命名为 **test1.py**。我可以这么运行它: + +``` +me@desktop:~/Test$ python test1.py +hello world +me@desktop:~/Test$ +``` + +现在程序可以运行了,我想在添加新的内容之前进行备份。我决定使用带编号的备份选项,如下: + +``` +clh@vancouver:~/Test$ cp --force --backup=numbered test1.py test1.py +clh@vancouver:~/Test$ ls +test1.py  test1.py.~1~ +clh@vancouver:~/Test$ +``` + +所以,上面的做法是什么意思呢? + +第一,这个 **--backup=numbered** 参数意思为“我要做个备份,而且是带编号的连续备份”。所以一个备份就是 1 号,第二个就是 2 号,等等。 + +第二,如果源文件和目标文件名字是一样的。通常我们使用 **cp** 命令去拷贝成自己,会得到这样的报错信息: + +``` +cp: 'test1.py' and 'test1.py' are the same file +``` + +在特殊情况下,如果我们想备份的源文件和目标文件名字相同,我们使用 **--force** 参数。 + +第三,我使用 **ls** (或者是“list”)命令来显示现在目录下的文件,名字为 **test1.py** 的是原始文件,名字为 **test1.py.~1~** 的是备份文件 + +假如现在我要加上第二个功能,在程序里加上另一行代码,可以打印“Kilroy was here.”。现在程序文件 **test1.py** 的内容如下: + +``` +print 'hello world' +print 'Kilroy was here' +``` + +看到Python代码如此简单了吗?不管怎样,如果我再次执行备份的步骤,结果如下: + + +``` +clh@vancouver:~/Test$ cp --force --backup=numbered test1.py test1.py +clh@vancouver:~/Test$ ls +test1.py test1.py.~1~ test1.py.~2~ +clh@vancouver:~/Test$ +``` +现在我有有两个备份文件: **test1.py.~1~** 包含了一行代码的程序,和 **test1.py.~2~** 包含两行代码的程序。 + +这个很好用的功能,让我在进行shell编程的时候变得更为简单。 + +###最后总结 + +第一,Linux手册页,默认安装在大多数桌面和服务器发行版,它提供了更为详细的使用方法和例子,就像 **cp** 命令,在终端中输入如下命令: + +``` +man cp +``` + +对于那些想学习如何使用这些命令,但不清楚如何使用的用户应该首先看一下这些说明,然后我建议创建一个测试目录和文件来尝试使用命令和选项。 + +第二,兴趣是最好的老师。在你最喜欢的搜索引擎中搜索“linux shell tutorial”,你会获得很多有趣和有用的资源。 + +第三,你是不是在想,“为什么我要用这么麻烦的方法,图形化界面中有相同的功能,只用点击几下岂不是更简单?”,关于这个问题我有两个理由。首先,在我们工作中需要中断其他工作流程以及大量使用点击动作时,点击动作可就不简单了。其次,如果我们要完成流水线般的重复性工作,通过使用shell脚本和shell函数以及shell重命名等功能就能很轻松的实现。 + +你还知道关于 **cp** 命令其他更棒的使用方式吗?请在留言中积极回复哦~ + +-------------------------------------------------------------------------------- + +作者简介: + +Chris Hermansen - 1978 年毕业于英国哥伦比亚大学后一直从事计算机相关职业,我从2005年开始一直使用Linux,Solaris, SunOS,在那之前我就是Unix系统管理员了,在技术方面,我花了大量的职业生涯做数据分析,尤其是空间数据分析,我有大量的编程经验与数据分析经验,熟练使用awk,Python,PostgreSQL,PostGIS和Groovy。 + + +原文: https://opensource.com/article/17/7/two-great-uses-cp-command + +作者:[ Chris Hermansen ][a] +译者:[bigdimple](https://github.com/bigdimple) +校对:[校对者ID](https://github.com/校对者ID) + +本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 + +[a]:https://opensource.com/users/clhermansen +[1]:https://opensource.com/resources/what-is-linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[2]:https://opensource.com/resources/what-are-linux-containers?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[3]:https://developers.redhat.com/promotions/linux-cheatsheet/?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[4]:https://developers.redhat.com/cheat-sheet/advanced-linux-commands-cheatsheet?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[5]:https://opensource.com/tags/linux?intcmp=70160000000h1jYAAQ&utm_source=intcallout&utm_campaign=linuxcontent +[6]:https://opensource.com/file/360601 +[7]:https://opensource.com/file/360606 +[8]:https://opensource.com/article/17/7/two-great-uses-cp-command?rate=87TiE9faHZRes_f4Gj3yQZXhZ-x7XovYhnhjrk3SdiM +[9]:https://opensource.com/user/37806/feed +[10]:https://www.flickr.com/photos/internetarchivebookimages/14746482994/in/photolist-ot6zCN-odgbDq-orm48o-otifuv-otdyWa-ouDjnZ-otGT2L-odYVqY-otmff7-otGamG-otnmSg-rxnhoq-orTmKf-otUn6k-otBg1e-Gm6FEf-x4Fh64-otUcGR-wcXsxg-tLTN9R-otrWYV-otnyUE-iaaBKz-ovcPPi-ovokCg-ov4pwM-x8Tdf1-hT5mYr-otb75b-8Zk6XR-vtefQ7-vtehjQ-xhhN9r-vdXhWm-xFBgtQ-vdXdJU-vvTH6R-uyG5rH-vuZChC-xhhGii-vvU5Uv-vvTNpB-vvxqsV-xyN2Ai-vdXcFw-vdXuNC-wBMhes-xxYmxu-vdXxwS-vvU8Zt +[11]:https://www.flickr.com/photos/internetarchivebookimages/14774719031/in/photolist-ovAie2-otPK99-xtDX7p-tmxqWf-ow3i43-odd68o-xUPaxW-yHCtWi-wZVsrD-DExW5g-BrzB7b-CmMpC9-oy4hyF-x3UDWA-ow1m4A-x1ij7w-tBdz9a-tQMoRm-wn3tdw-oegTJz-owgrs2-rtpeX1-vNN6g9-owemNT-x3o3pX-wiJyEs-CGCC4W-owg22q-oeT71w-w6PRMn-Ds8gyR-x2Aodm-owoJQm-owtGp9-qVxppC-xM3Gw7-owgV5J-ou9WEs-wihHtF-CRmosE-uk9vB3-wiKdW6-oeGKq3-oeFS4f-x5AZtd-w6PNuv-xgkofr-wZx1gJ-EaYPED-oxCbFP +[12]:https://en.wikipedia.org/wiki/Cp_(Unix) +[13]:https://en.wikipedia.org/wiki/Unix +[14]:https://opensource.com/users/clhermansen +[15]:https://opensource.com/users/clhermansen +[16]:https://opensource.com/article/17/7/two-great-uses-cp-command#comments From 3dd42073bb041a9fddaab688b787d3a78530974c Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 10 Aug 2017 13:47:44 +0800 Subject: [PATCH 0952/1407] PRF:20170705 Two great uses for the cp command.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @bigdimple 恭喜你完成了第一篇翻译,翻译的不错。不过要适当注意标点符号的使用。具体你可以参考我校对的版本(做版本对比) 你的 LCTT 个人专页是: https://linux.cn/lctt/bigdimple --- ...70705 Two great uses for the cp command.md | 97 +++++++++---------- 1 file changed, 48 insertions(+), 49 deletions(-) diff --git a/translated/tech/20170705 Two great uses for the cp command.md b/translated/tech/20170705 Two great uses for the cp command.md index 48fb8224a7..d9aaca8c7c 100644 --- a/translated/tech/20170705 Two great uses for the cp command.md +++ b/translated/tech/20170705 Two great uses for the cp command.md @@ -1,70 +1,66 @@ -【big_dimple翻译完成】 -# cp命令两个高效的用法 - +cp 命令两个高效的用法 ============================================================ -### Linux中高效的备份拷贝命令 - +> Linux 中高效的备份拷贝命令 ![Two great uses for the cp command](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/car-penguin-drive-linux-yellow.png?itok=ueZE5mph "Two great uses for the cp command") -图像来自于:Opensource.com +在 Linux 上能使用鼠标点来点去的图形化界面是一件很美妙的事……但是如果你喜欢的开发交互环境和编译器是终端窗口、Bash 和 Vim,那你应该像我一样*经常*和终端打交道。 -在Linux上能使用图形化界面是一件很美妙的事...但是如果你像我一样,喜欢的开发交互环境和编译器是终端窗口,Bash 和 Vim,那你将会经常和终端打交道。 - -即使是不经常使用终端的人,也能通过终端提供的环境来获取很多有用的知识。举个例子—**cp**命令,通过[Wiki百科][12]的解释,**cp** (或者copy)命令是[Unix][13]系统第一个版本中的一部分。以及其他的一组命令 **ls**, **mv**, **cd**, **pwd**, **mkdir**, **vi**, **sh**, **sed**, 和 **awk** 还有我们所说的 **cp** 都是在 1984 年构造Unix系统第一个版本中最初的几步。**cp** 命令最常见的用法是复制文件。像这样: +即使是不经常使用终端的人,如果对终端环境深入了解也能获益良多。举个例子—— `cp` 命令,据 [维基百科][12] 的解释,`cp` (意即 copy)命令是第一个版本的 [Unix][13] 系统的一部分。连同一组其它的命令 `ls`、`mv`、`cd`、`pwd`、`mkdir`、`vi`、`sh`、`sed` 和 `awk` ,还有提到的 `cp` 都是我在 1984 年接触 System V Unix 系统时所学习的命令之一。`cp` 命令最常见的用法是制作文件副本。像这样: ``` cp sourcefile destfile ``` -在终端中执行此命令,上述命令将名为 **sourcefile** 的文件复制到名为 **destfile** 的文件中。如果在执行命令之前 **destfile** 文件不存在,那将会创建此文件,如果已经存在,那就会覆盖此文件。 -这个命令我不知道自己用了多少次了(或许我不想知道),但是我知道在我测试代码的时候,我经常用,为了保留当前版本,而且又能继续修改,我会输入这个命令: +在终端中执行此命令,上述命令将名为 `sourcefile` 的文件复制到名为 `destfile` 的文件中。如果在执行命令之前 `destfile` 文件不存在,那将会创建此文件,如果已经存在,那就会覆盖此文件。 + +这个命令我不知道自己用了多少次了(我也不想知道),但是我知道在我编写测试代码的时候,我经常用,为了保留当前正常的版本,而且又能继续修改,我会输入这个命令: ``` cp test1.py test1.bak ``` -在过去的30多年里,我使用了无数次这个命令。另外,当我决定编写我的第二版测试程序时,我会输入这个命令: + +在过去的30多年里,我使用了无数次这个命令。另外,当我决定编写我的第二个版本的测试程序时,我会输入这个命令: ``` cp test1.py test2.py ``` -这样就完成了修改程序版本的第一步。 -我通常很少查看 **cp** 命令的参考文档,但是当我在备份我的图片文件夹的时候(在GUI环境下使用文件应用),我开始思考“在 **cp** 命令中是否有个参数支持只复制新文件或者是修改过的文件。”果然,真的有! +这样就完成了修改程序的第一步。 + +我通常很少查看 `cp` 命令的参考文档,但是当我在备份我的图片文件夹的时候(在 GUI 环境下使用 “file” 应用),我开始思考“在 `cp` 命令中是否有个参数支持只复制新文件或者是修改过的文件。”果然,真的有! + +### 高效用法 1:更新你的文件夹 -### 高效用法1:更新你的文件夹 比如说在我的电脑上有一个存放各种文件的文件夹,另外我要不时的往里面添加一些新文件,而且我会不时地修改一些文件,例如我手机里下载的照片或者是音乐。 假设我收集的这些文件对我而言都很有价值,我有时候会想做个拷贝,就像是“快照”一样将文件保存在其它媒体。当然目前有很多程序都支持备份,但是我想更为精确的将目录结构复制到可移动设备中,方便于我经常使用这些离线设备或者连接到其它电脑上。 - **cp** 命令提供了一个易如反掌的方法。例子如下: + `cp` 命令提供了一个易如反掌的方法。例子如下: -在我的 **Pictures** 文件夹下,我有这样一个文件夹名字为 **Misc**。为了方便说明,我把文件拷贝到USB存储设备上。让我们开始吧! +在我的 `Pictures` 文件夹下,我有这样一个文件夹名字为 `Misc`。为了方便说明,我把文件拷贝到 USB 存储设备上。让我们开始吧! ``` me@desktop:~/Pictures$ cp -r Misc /media/clh/4388-D5FE me@desktop:~/Pictures$ ``` -上面的命令是我从按照终端窗口中完整复制下来的。对于有些人来说这种环境可能不是很舒服,在我们输入命令或者执行命令之前,需要注意的是 **me@mydesktop:~/Pictures** 这个前缀,(**me**)这个是当前用户,(**mydesktop**)这是电脑名称,(**~/Pictures**)这个是当前工作目录,是(**/home/me/Pictures**)完整路径的缩写。 -我输入这个命令并执行后(**cp -r Misc /media/clh/4388-D5FE**),拷贝 **Misc** 目录下所有文件(这个 **-r**参数,全称“recursive”,递归处理,意思为本目录下所有文件及子目录一起处理)到我的USB设备的挂载目录 **/media/clh/4388-D5FE**。 +上面的命令是我从按照终端窗口中完整复制下来的。对于有些人来说不是很适应这种环境,在我们输入命令或者执行命令之前,需要注意的是 `me@mydesktop:~/Pictures` 这个前缀,`me` 这个是当前用户,`mydesktop` 这是电脑名称,`~/Pictures` 这个是当前工作目录,是 `/home/me/Pictures` 完整路径的缩写。 -执行命令后回到之前的提示,大多数命令继承了Unix的特性,在命令执行后,如果没有任何异常什么都不显示,在任务结束之前不会显示像“execution succeeded“这样的提示符。如果想获取更多的反馈,就使用 **-v** 参数让执行结果更详细。 +我输入这个命令 `cp -r Misc /media/clh/4388-D5FE` 并执行后 ,拷贝 `Misc` 目录下所有文件(这个 `-r` 参数,全称 “recursive”,递归处理,意思为本目录下所有文件及子目录一起处理)到我的 USB 设备的挂载目录 `/media/clh/4388-D5FE`。 -下图中是我的USB设备中刚刚拷贝过来的文件夹 **Misc** ,里面总共有 9 张图片。 +执行命令后回到之前的提示,大多数命令继承了 Unix 的特性,在命令执行后,如果没有任何异常什么都不显示,在任务结束之前不会显示像 “execution succeeded” 这样的提示消息。如果想获取更多的反馈,就使用 `-v` 参数让执行结果更详细。 -### [cp1_file_structure.png][6] +下图中是我的 USB 设备中刚刚拷贝过来的文件夹 `Misc` ,里面总共有 9 张图片。 ![Image of the new copy of Misc on the USB drive](https://opensource.com/sites/default/files/u128651/cp1_file_structure.png "Image of the new copy of Misc on the USB drive") -假设我要在原始拷贝路径下 **~/Pictures/Misc** 下添加一些新文件,就像这样: - -### [cp2_new_files.png][7] +假设我要在原始拷贝路径下 `~/Pictures/Misc` 下添加一些新文件,就像这样: ![New files added to the master directory](https://opensource.com/sites/default/files/u128651/cp2_new_files.png "New files added to the master directory") -现在我想只拷贝新的文件到我的存储设备上,我就使用 **cp** 的“update”和“verbose”选项。 +现在我想只拷贝新的文件到我的存储设备上,我就使用 `cp` 的“更新”和“详细”选项。 ``` me@desktop:~/Pictures$ cp -r -u -v Misc /media/clh/4388-D5FE @@ -73,21 +69,21 @@ me@desktop:~/Pictures$ cp -r -u -v Misc /media/clh/4388-D5FE 'Misc/misc on usb.png' -> '/media/clh/4388-D5FE/Misc/misc on usb.png' me@desktop:~/Pictures$ ``` -上面的第一行中是 **cp** 命令和具体的参数(**-r** 是“recursive”, **-u** 是“update”,**-v** 是“verbose”)。接下来的三行显示被复制文件的信息,最后一行显示命令行前缀。 +上面的第一行中是 `cp` 命令和具体的参数(`-r` 是“递归”, `-u` 是“更新”,`-v` 是“详细”)。接下来的三行显示被复制文件的信息,最后一行显示命令行提示符。 -通常来说,参数 **-r** 也可用用更详细的方式使用 **--recursive**。但是以简短的方式,也可以这么用 **-ruv**。 +通常来说,参数 `-r` 也可用更详细的风格 `--recursive`。但是以简短的方式,也可以这么连用 `-ruv`。 -###高效用法2:版本备份 +### 高效用法 2:版本备份 -回到一开始的例子中,我在开发的时候定期给我的代码版本进行备份。然后我找到了另一种更好用的 **cp** 参数。 +回到一开始的例子中,我在开发的时候定期给我的代码版本进行备份。然后我找到了另一种更好用的 `cp` 参数。 -假设我正在编写一个非常有用的Python程序,作为一个喜欢不断修改代码的开发者,我会在一开始定义一个程序简单版本,然后不停的忘里面添加各种功能直到它能成功的运行起来。比方说我的第一个版本就是用Python程序打印出“hello world”。这只有一行代码的程序就像这样: +假设我正在编写一个非常有用的 Python 程序,作为一个喜欢不断修改代码的开发者,我会在一开始编写一个程序简单版本,然后不停的往里面添加各种功能直到它能成功的运行起来。比方说我的第一个版本就是用 Python 程序打印出 “hello world”。这只有一行代码的程序就像这样: ``` print 'hello world' ``` -然后我将这个代码保存成文件命名为 **test1.py**。我可以这么运行它: +然后我将这个代码保存成文件命名为 `test1.py`。我可以这么运行它: ``` me@desktop:~/Test$ python test1.py @@ -106,26 +102,26 @@ clh@vancouver:~/Test$ 所以,上面的做法是什么意思呢? -第一,这个 **--backup=numbered** 参数意思为“我要做个备份,而且是带编号的连续备份”。所以一个备份就是 1 号,第二个就是 2 号,等等。 +第一,这个 `--backup=numbered` 参数意思为“我要做个备份,而且是带编号的连续备份”。所以一个备份就是 1 号,第二个就是 2 号,等等。 -第二,如果源文件和目标文件名字是一样的。通常我们使用 **cp** 命令去拷贝成自己,会得到这样的报错信息: +第二,如果源文件和目标文件名字是一样的。通常我们使用 `cp` 命令去拷贝成自己,会得到这样的报错信息: ``` cp: 'test1.py' and 'test1.py' are the same file ``` -在特殊情况下,如果我们想备份的源文件和目标文件名字相同,我们使用 **--force** 参数。 +在特殊情况下,如果我们想备份的源文件和目标文件名字相同,我们使用 `--force` 参数。 -第三,我使用 **ls** (或者是“list”)命令来显示现在目录下的文件,名字为 **test1.py** 的是原始文件,名字为 **test1.py.~1~** 的是备份文件 +第三,我使用 `ls` (意即 “list”)命令来显示现在目录下的文件,名字为 `test1.py` 的是原始文件,名字为 `test1.py.~1~` 的是备份文件 -假如现在我要加上第二个功能,在程序里加上另一行代码,可以打印“Kilroy was here.”。现在程序文件 **test1.py** 的内容如下: +假如现在我要加上第二个功能,在程序里加上另一行代码,可以打印 “Kilroy was here.”。现在程序文件 `test1.py` 的内容如下: ``` print 'hello world' print 'Kilroy was here' ``` -看到Python代码如此简单了吗?不管怎样,如果我再次执行备份的步骤,结果如下: +看到 Python 编程多么简单了吗?不管怎样,如果我再次执行备份的步骤,结果如下: ``` @@ -134,13 +130,13 @@ clh@vancouver:~/Test$ ls test1.py test1.py.~1~ test1.py.~2~ clh@vancouver:~/Test$ ``` -现在我有有两个备份文件: **test1.py.~1~** 包含了一行代码的程序,和 **test1.py.~2~** 包含两行代码的程序。 +现在我有有两个备份文件: `test1.py.~1~` 包含了一行代码的程序,和 `test1.py.~2~` 包含两行代码的程序。 -这个很好用的功能,让我在进行shell编程的时候变得更为简单。 +这个很好用的功能,我考虑做个 shell 函数让它变得更简单。 -###最后总结 +### 最后总结 -第一,Linux手册页,默认安装在大多数桌面和服务器发行版,它提供了更为详细的使用方法和例子,就像 **cp** 命令,在终端中输入如下命令: +第一,Linux 手册页,它在大多数桌面和服务器发行版都默认安装了,它提供了更为详细的使用方法和例子,对于 `cp` 命令,在终端中输入如下命令: ``` man cp @@ -148,24 +144,27 @@ man cp 对于那些想学习如何使用这些命令,但不清楚如何使用的用户应该首先看一下这些说明,然后我建议创建一个测试目录和文件来尝试使用命令和选项。 -第二,兴趣是最好的老师。在你最喜欢的搜索引擎中搜索“linux shell tutorial”,你会获得很多有趣和有用的资源。 +第二,兴趣是最好的老师。在你最喜欢的搜索引擎中搜索 “linux shell tutorial”,你会获得很多有趣和有用的资源。 -第三,你是不是在想,“为什么我要用这么麻烦的方法,图形化界面中有相同的功能,只用点击几下岂不是更简单?”,关于这个问题我有两个理由。首先,在我们工作中需要中断其他工作流程以及大量使用点击动作时,点击动作可就不简单了。其次,如果我们要完成流水线般的重复性工作,通过使用shell脚本和shell函数以及shell重命名等功能就能很轻松的实现。 +第三,你是不是在想,“为什么我要用这么麻烦的方法,图形化界面中有相同的功能,只用点击几下岂不是更简单?”,关于这个问题我有两个理由。首先,在我们工作中需要中断其他工作流程以及大量使用点击动作时,点击动作可就不简单了。其次,如果我们要完成流水线般的重复性工作,通过使用 shell 脚本和 shell 函数以及 shell 重命名等功能就能很轻松的实现。 -你还知道关于 **cp** 命令其他更棒的使用方式吗?请在留言中积极回复哦~ +你还知道关于 `cp` 命令其他更棒的使用方式吗?请在留言中积极回复哦~ + +(题图:Opensource.com) -------------------------------------------------------------------------------- 作者简介: -Chris Hermansen - 1978 年毕业于英国哥伦比亚大学后一直从事计算机相关职业,我从2005年开始一直使用Linux,Solaris, SunOS,在那之前我就是Unix系统管理员了,在技术方面,我花了大量的职业生涯做数据分析,尤其是空间数据分析,我有大量的编程经验与数据分析经验,熟练使用awk,Python,PostgreSQL,PostGIS和Groovy。 +Chris Hermansen - 1978 年毕业于英国哥伦比亚大学后一直从事计算机相关职业,我从 2005 年开始一直使用 Linux、Solaris、SunOS,在那之前我就是 Unix 系统管理员了,在技术方面,我的大量的职业生涯都是在做数据分析,尤其是空间数据分析,我有大量的编程经验与数据分析经验,熟练使用 awk、Python、PostgreSQL、PostGIS 和 Groovy。 +--- -原文: https://opensource.com/article/17/7/two-great-uses-cp-command +via: https://opensource.com/article/17/7/two-great-uses-cp-command -作者:[ Chris Hermansen ][a] +作者:[Chris Hermansen][a] 译者:[bigdimple](https://github.com/bigdimple) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 From 699218a6029785d4e7e5503ac30c430d0eacb316 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 10 Aug 2017 13:48:21 +0800 Subject: [PATCH 0953/1407] PUB:20170705 Two great uses for the cp command.md @bigdimple https://linux.cn/article-8766-1.html --- .../20170705 Two great uses for the cp command.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170705 Two great uses for the cp command.md (100%) diff --git a/translated/tech/20170705 Two great uses for the cp command.md b/published/20170705 Two great uses for the cp command.md similarity index 100% rename from translated/tech/20170705 Two great uses for the cp command.md rename to published/20170705 Two great uses for the cp command.md From f61e217521b4626e6eec661228e3906c9e9f76c4 Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 10 Aug 2017 17:10:55 +0800 Subject: [PATCH 0954/1407] PRF:20170711 Ubuntu Core Making a factory image with private snaps.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @Snaplee 恭喜你,完成了第一篇贡献!你的 LCTT 专页是: https://linux.cn/lctt/Snaplee 文中有一处翻译你有质疑,我看了,其实原文没错,它说的 snapd ,那个确实也是 apt 安装的,我校对修改了。 另外,文中的图片,都不需要另外做本地化处理。我发布文章时候,会自动本地化到 LINUX.CN 上了。 --- ...king a factory image with private snaps.md | 108 ++++++++++-------- 1 file changed, 60 insertions(+), 48 deletions(-) diff --git a/translated/tech/20170711 Ubuntu Core Making a factory image with private snaps.md b/translated/tech/20170711 Ubuntu Core Making a factory image with private snaps.md index efe9af6af6..d625de186c 100644 --- a/translated/tech/20170711 Ubuntu Core Making a factory image with private snaps.md +++ b/translated/tech/20170711 Ubuntu Core Making a factory image with private snaps.md @@ -1,13 +1,16 @@ -# Ubuntu Core: 制作包含私有 snaps 的工厂镜像 ---- -这篇帖子是有关 [ROS prototype to production on Ubuntu Core][1] 系列的补充,用来回答我接收到的一个问题: “如何在不公开发布 snaps 的情况下制作一个工厂镜像?” 当然,问题和回答都不只是针对于机器人技术。在这篇帖子中,我将会通过两种方法来回答这个问题。 +Ubuntu Core:制作包含私有 snap 的工厂镜像 +======== + +这篇帖子是有关 [在 Ubuntu Core 开发 ROS 原型到成品][1] 系列的补充,用来回答我收到的一个问题: “我想做一个工厂镜像,但我不想使我的 snap 公开” 当然,这个问题和回答都不只是针对于机器人技术。在这篇帖子中,我将会通过两种方法来回答这个问题。 -开始之前,你需要了解一些制作 Ubuntu Core 镜像的背景知识,如果你已经看过 [ROS prototype to production on Ubuntu Core][3] 系列文章(具体是第 5 部分),你就已经有了需要的背景知识,如果没有看过的话,可以查看有关 [制作你的 Ubuntu Core 镜像][5] 的教程。 +开始之前,你需要了解一些制作 Ubuntu Core 镜像的背景知识,如果你已经看过 [在 Ubuntu Core 开发 ROS 原型到成品[3] 系列文章(具体是第 5 部分),你就已经有了需要的背景知识,如果没有看过的话,可以查看有关 [制作你的 Ubuntu Core 镜像][5] 的教程。 -如果你已经了解了最新的情况并且当我说 “模型定义” 或者 “模型断言” 时知道我在谈论什么,那就让我们开始通过不同的方法使用私有 sanps 来制作 Ubuntu Core 镜像吧。 +如果你已经了解了最新的情况,并且当我说 “模型定义” 或者 “模型断言” 时知道我在谈论什么,那就让我们开始通过不同的方法使用私有 sanps 来制作 Ubuntu Core 镜像吧。 + +### 方法 1: 不要上传你的 snap 到商店 + +这是最简单的方法了。首先看一下这个有关模型定义的例子——`amd64-model.json`: -### 方法 1: 无需上传你的 snap 到商店 -这是最简单的方法了。首先看一下这个有关模型定义的例子——**amd64-model.json**: ``` { "type": "model", @@ -21,16 +24,20 @@ "timestamp": "2017-06-23T21:03:24+00:00", "required-snaps": ["kyrofa-test-snap"] } -``` -让我们将它转换成模型断言 +``` + +让我们将它转换成模型断言: + ``` $ cat amd64-model.json | snap sign -k my-key-name > amd64.model You need a passphrase to unlock the secret key for user: "my-key-name" 4096-bit RSA key, ID 0B79B865, created 2016-01-01 ... -``` -获得模型断言:**amd64.model** 后,如果你现在就把它交给 **ubuntu-image** 使用,你将会碰钉子: +``` + +获得模型断言:`amd64.model` 后,如果你现在就把它交给 `ubuntu-image` 使用,你将会碰钉子: + ``` $ sudo ubuntu-image -c stable amd64.model Fetching core @@ -40,7 +47,9 @@ Fetching kyrofa-test-snap error: cannot find snap "kyrofa-test-snap": snap not found COMMAND FAILED: snap prepare-image --channel=stable amd64.model /tmp/tmp6p453gk9/unpack ``` -实际上商店中并没有名为 **kyrofa-test-snap** 的 snap。这里需要重点说明的是:模型定义(以及转换后的断言)会包含一列 snap 的名字。如果你在本地有个名字相同的 snap,即使它没有存在于商店中,你也可以通过 **--extra-snaps** 选项告诉 **ubuntu-image** 在断言中增加这个名字来使用它: + +实际上商店中并没有名为 `kyrofa-test-snap` 的 snap。这里需要重点说明的是:模型定义(以及转换后的断言)只包含了一系列的 snap 的名字。如果你在本地有个那个名字的 snap,即使它没有存在于商店中,你也可以通过 `--extra-snaps` 选项告诉 `ubuntu-image` 在断言中匹配这个名字来使用它: + ``` $ sudo ubuntu-image -c stable \ --extra-snaps /path/to/kyrofa-test-snap_0.1_amd64.snap \ @@ -54,30 +63,35 @@ WARNING: "kyrofa-test-snap" were installed from local snaps disconnected from a store and cannot be refreshed subsequently! Partition size/offset need to be a multiple of sector size (512). The size/offset will be rounded up to the nearest sector. -``` -现在,在 snap 并没有上传到商店的情况下,你已经获得一个预装了私有 snap 的 Ubuntu Core 镜像(名为 pc.img)。但是这样做有一个很大的问题,ubuntu-image 会提示一个警告:不通过连接商店预装 snap 意味着你没有办法在烧录了这些镜像的设备上更新它。你只能通过制作新的镜像并重新烧录到设备的方式来更新它。 +``` -### 方法 2: 使用品牌商店 -当你注册了一个商店账号并访问 [dashboard.snapcraft.io][6] 时,你其实是在标准的 Ubuntu 商店中查看你的 snaps。如果你在系统中安装 snap(原文是:If you install snapd fresh on your system,但是 snapd 并不是从 Ubuntu 商城安装的,而是通过 apt-get 命令 安装的),默认会从这个商店下载。虽然你可以在 Ubuntu 商店中发布私有的 snaps,但是你 [不能将它们预装到镜像中][7],因为只有你(以及你添加的合作者)才有权限去使用它。在这种情况下制作镜像的唯一方式就是公开发布你的 snaps,然而这并不符合这篇帖子的目的(原文是:which defeats the whole purpose of this post)。 +现在,在 snap 并没有上传到商店的情况下,你已经获得一个预装了私有 snap 的 Ubuntu Core 镜像(名为 `pc.img`)。但是这样做有一个很大的问题,ubuntu-image 会提示一个警告:不通过连接商店预装 snap 意味着你没有办法在烧录了这些镜像的设备上更新它。你只能通过制作新的镜像并重新烧录到设备的方式来更新它。 -对于这种用例,我们有所谓的 **[品牌商店][8]**。品牌商店仍然在 Ubuntu 商店里托管,但是它们是针对于某一特定公司或设备的一个可定制的策划(curated)版本。品牌商店可以继承或者不继承标准的 Ubuntu 商店,品牌商店也可以选择开放给所有的开发者或者将其限制在一个特定的组内(保持私有正是我们想要的)。 +### 方法 2: 使用品牌商店 + +当你注册了一个商店账号并访问 [dashboard.snapcraft.io][6] 时,你其实是在标准的 Ubuntu 商店中查看你的 snap。如果你是在系统中新安装的 snapd,默认会从这个商店下载。虽然你可以在 Ubuntu 商店中发布私有的 snap,但是你[不能将它们预装到镜像中][7],因为只有你(以及你添加的合作者)才有权限去使用它。在这种情况下制作镜像的唯一方式就是公开发布你的 snap,然而这并不符合这篇帖子的目的。 -请注意,这是一个付费功能。你需要 [申请一个品牌商店][9]。请求通过后,你将可以通过访问用户名下的“stores you can access” 看到你的新商店。 -![图片.png-78.9kB][10] +对于这种用例,我们有所谓的 [品牌商店][8]。品牌商店仍然托管在 Ubuntu 商店里,但是它们是针对于某一特定公司或设备的一个定制的、专门的版本。品牌商店可以继承或者不继承标准的 Ubuntu 商店,品牌商店也可以选择开放给所有的开发者或者将其限制在一个特定的组内(保持私有正是我们想要的)。 -在那里你可以看到多个有权使用的商店。最少的情况下也会有两个: 标准的 Ubuntu 商店以及你的新的品牌商店。选择品牌商店(红色矩形),进去后记录下你的商店 ID(蓝色矩形):等下你将会用到它。 -![图片.png-43.9kB][11] +请注意,这是一个付费功能。你需要 [申请一个品牌商店][9]。请求通过后,你将可以通过访问用户名下的 “stores you can access” 看到你的新商店。 + +![](https://insights.ubuntu.com/wp-content/uploads/1a62/stores_you_can_access.jpg) +在那里你可以看到多个有权使用的商店。最少的情况下也会有两个:标准的 Ubuntu 商店以及你的新的品牌商店。选择品牌商店(红框),进去后记录下你的商店 ID(蓝框):等下你将会用到它。 -在品牌商店里注册名字或者上传 snaps 和标准的商店使用的方法是一样的,只是它们现在是上传到你的品牌商店而不是标准的那个。如果你没有将品牌商店列出来,那么这些 snaps 对外部用户是不可见。但是这里需要注意的是第一次上传 snap 的时候需要通过web界面来操作。在那之后,你可以继续像往常一样使用 Snapcraft 。 +![](https://insights.ubuntu.com/wp-content/uploads/b10c/Screenshot-from-2017-07-06-15-16-32.png) + +在品牌商店里注册名字或者上传 snap 和标准的商店使用的方法是一样的,只是它们现在是上传到你的品牌商店而不是标准的那个。如果你将品牌商店放在 unlisted 里面,那么这些 snap 对外部用户是不可见。但是这里需要注意的是第一次上传 snap 的时候需要通过 web 界面来操作。在那之后,你可以继续像往常一样使用 Snapcraft 来操作。 + +那么这些是如何改变的呢?我的 “kyrofal-store” 从 Ubuntu 商店继承了 snap,并且还包含一个发布在稳定通道中的 “kyrofa-bran-test-snap” 。这个 snap 在 Ubuntu 商店里是使用不了的,如果你去搜索它,你是找不到的: -那么这些是如何改变的呢?我的 “kyrofal-store” 从 Ubuntu 商店继承了 snaps,并且还包含一个发布在稳定通道中的 “kyrofa-bran-test-snap” 。这个 snap 在 Ubuntu 商店里是使用不了的,如果你去搜索它,你是找不到的: ``` $ snap find kyrofa-branded The search "kyrofa-branded" returned 0 snaps ``` -但是使用我们前面记录的商店 ID,我们可以创建一个从品牌商店而不是 Ubuntu 商店下载 snaps 的模型断言。我们只需要将 “store” 键添加到 JSON 文件中,就像这样: +但是使用我们前面记录的商店 ID,我们可以创建一个从品牌商店而不是 Ubuntu 商店下载 snap 的模型断言。我们只需要将 “store” 键添加到 JSON 文件中,就像这样: + ``` { "type": "model", @@ -92,8 +106,10 @@ The search "kyrofa-branded" returned 0 snaps "required-snaps": ["kyrofa-branded-test-snap"], "store": "kyek" } -``` -使用方法 1 中的方式对它签名,然后我们就可以像这样很简单的制作一个预装有我们品牌商店私有 snap 的 Ubuntu Core 镜像: +``` + +使用方法 1 中的方式对它签名,然后我们就可以像这样很简单的制作一个预装有我们品牌商店私有 snap 的 Ubuntu Core 镜像: + ``` $ sudo ubuntu-image -c stable amd64.model Fetching core @@ -102,8 +118,9 @@ Fetching pc Fetching kyrofa-branded-test-snap Partition size/offset need to be a multiple of sector size (512). The size/offset will be rounded up to the nearest sector. -``` -现在,和方法 1 的最后一样,你获得了一个为工厂准备的 pc.img。并且使用这种方法制作的镜像中的所有 snaps 都从商店下载的,这意味着它们将能像平常一样自动更新。 +``` + +现在,和方法 1 的最后一样,你获得了一个为工厂准备的 `pc.img`。并且使用这种方法制作的镜像中的所有 snap 都从商店下载的,这意味着它们将能像平常一样自动更新。 ### 结论 @@ -113,35 +130,30 @@ The size/offset will be rounded up to the nearest sector. 希望能帮助到您! - --- + 关于作者 -Kyle 的图片 - -![Kyle_Fazzari.jpg-12kB][13] Kyle 是 Snapcraft 团队的一员,也是 Canonical 公司的常驻机器人专家,他专注于 snaps 和 snap 开发实践,以及 snaps 和 Ubuntu Core 的机器人技术实现。 -- - - +--- + via: https://insights.ubuntu.com/2017/07/11/ubuntu-core-making-a-factory-image-with-private-snaps/ 作者:[Kyle Fazzari][a] 译者:[Snaplee](https://github.com/Snaplee) -校对:[校对者ID](https://github.com/校对者ID) +校对:[wxy](https://github.com/wxy) 本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出 - [1]: https://insights.ubuntu.com/2017/04/06/from-ros-prototype-to-production-on-ubuntu-core/ - [2]: https://insights.ubuntu.com/2017/04/06/from-ros-prototype-to-production-on-ubuntu-core/ - [3]: https://insights.ubuntu.com/2017/04/06/from-ros-prototype-to-production-on-ubuntu-core/ - [4]: https://insights.ubuntu.com/2017/04/06/from-ros-prototype-to-production-on-ubuntu-core/ - [5]: https://tutorials.ubuntu.com/tutorial/create-your-own-core-image - [6]: https://dashboard.snapcraft.io/dev/snaps/ - [7]: https://forum.snapcraft.io/t/unable-to-create-an-image-that-uses-private-snaps - [8]: https://docs.ubuntu.com/core/en/build-store/index?_ga=2.103787520.1269328701.1501772209-778441655.1499262639 - [9]: https://docs.ubuntu.com/core/en/build-store/create - [10]: http://static.zybuluo.com/apollomoon/hzffexclyv4srqsnf52a9udc/%E5%9B%BE%E7%89%87.png - [11]: http://static.zybuluo.com/apollomoon/9gevrgmq01s3vdtp5qfa8tp7/%E5%9B%BE%E7%89%87.png - [12]: https://forum.snapcraft.io/t/unable-to-create-an-image-that-uses-private-snaps/1115 - [13]: http://static.zybuluo.com/apollomoon/xaxxjof19s7cbgk00xntgmqa/Kyle_Fazzari.jpg - [14]: https://insights.ubuntu.com/2017/04/06/from-ros-prototype-to-production-on-ubuntu-core/ +[1]: https://insights.ubuntu.com/2017/04/06/from-ros-prototype-to-production-on-ubuntu-core/ +[2]: https://insights.ubuntu.com/2017/04/06/from-ros-prototype-to-production-on-ubuntu-core/ +[3]: https://insights.ubuntu.com/2017/04/06/from-ros-prototype-to-production-on-ubuntu-core/ +[4]: https://insights.ubuntu.com/2017/04/06/from-ros-prototype-to-production-on-ubuntu-core/ +[5]: https://tutorials.ubuntu.com/tutorial/create-your-own-core-image +[6]: https://dashboard.snapcraft.io/dev/snaps/ +[7]: https://forum.snapcraft.io/t/unable-to-create-an-image-that-uses-private-snaps +[8]: https://docs.ubuntu.com/core/en/build-store/index?_ga=2.103787520.1269328701.1501772209-778441655.1499262639 +[9]: https://docs.ubuntu.com/core/en/build-store/create +[12]: https://forum.snapcraft.io/t/unable-to-create-an-image-that-uses-private-snaps/1115 +[14]: https://insights.ubuntu.com/2017/04/06/from-ros-prototype-to-production-on-ubuntu-core/ From 859c471b652e6e6a873e2e84bbec4a1e259db67a Mon Sep 17 00:00:00 2001 From: wxy Date: Thu, 10 Aug 2017 17:11:50 +0800 Subject: [PATCH 0955/1407] PUB:20170711 Ubuntu Core Making a factory image with private snaps.md MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit @Snaplee 难怪你以这篇为第一篇,原来你就是 snap 啊~ 发布地址: https://linux.cn/article-8767-1.html --- ...70711 Ubuntu Core Making a factory image with private snaps.md | 0 1 file changed, 0 insertions(+), 0 deletions(-) rename {translated/tech => published}/20170711 Ubuntu Core Making a factory image with private snaps.md (100%) diff --git a/translated/tech/20170711 Ubuntu Core Making a factory image with private snaps.md b/published/20170711 Ubuntu Core Making a factory image with private snaps.md similarity index 100% rename from translated/tech/20170711 Ubuntu Core Making a factory image with private snaps.md rename to published/20170711 Ubuntu Core Making a factory image with private snaps.md From bdc7fabbcc1ac4647203598b936d108f80ee7572 Mon Sep 17 00:00:00 2001 From: MonkeyDEcho <863626156@qq.com> Date: Thu, 10 Aug 2017 19:27:10 +0800 Subject: [PATCH 0956/1407] translated --- ...220 TypeScript the missing introduction.md | 427 ++++++++++++++++++ 1 file changed, 427 insertions(+) create mode 100644 translated/tech/20161220 TypeScript the missing introduction.md diff --git a/translated/tech/20161220 TypeScript the missing introduction.md b/translated/tech/20161220 TypeScript the missing introduction.md new file mode 100644 index 0000000000..53c7e84782 --- /dev/null +++ b/translated/tech/20161220 TypeScript the missing introduction.md @@ -0,0 +1,427 @@ +简洁的介绍TypeScript +============================================================= + + +**下文是James Henry([@MrJamesHenry][8])所编辑的内容。我是ESLint核心团队的一员,也是TypeScript的热衷者和发扬者。我和Todd合作在[UltimateAngular][9]平台上发布Angular和TypeScript的精品课程。** + +> 本文的主旨是为了介绍我们对TypeScript的思考和在JavaScript开发当中的更好的使用。 +> +> 我们将给出编译和关键字准确的定义 + +TypeScript强大之处远远不止这些,本篇文章无法涵盖,想要了解更多请阅读官方文档[official document][15],或者查阅[TypeScript courses over on UltimateAngular][16]UltimateAngular平台的TypeScript精品课程-从初学者到TypeScript高手 + +### [目录][17] + +* [背景][10] +* [关键知识的掌握][11] + * [JavaScript解释型语言还是编译型语言][1] + * [运行时间 VS 编译时间][2] + * [TypeScript编译器][3] + * [动态类型 VS 静态类型][4] +* [TypeScript在我们JavaScript工作流程中的作用][12] + * [我们的源文件是我们的文档,TypeScript是我们的拼写检查][5] +* [TypeScript是一种可以启动其它工具的工具][13] + * [什么是抽象语法树(AST)?][6] + * [示例:在VS中重命名符号][7] +* [总结][14] + +### [背景][18] + +TypeScript是很容易掌握的强大开发工具 + +然而,TypeScript可能比JavaScript要更为复杂,因为TypeScript可能同时向我们介绍以前没有考虑到的JavaScript程序相关的一些列技术概念。 + +每当我们谈论到类型、编译器等这些概念的时候。事情就会变的非常麻烦和不知所云起来。 + +这篇文章就是为了你在学习过程中你需要知道的许许多多不知所云的概念解答的,来帮助你TypeScript入门的,让你轻松自如的应对这些概念。 + +### [关键知识的掌握][19] + +有时候运行我们的代码是在Web浏览器中运行,和我们平常运行代码有不同的感觉,它是怎样运行自己书写的代码的?“没有经过编译的,是正确的吗?”。“我敢肯定没有类型的...” + +情况变的更有趣了,当我们知道通过前后程序的定义来判断语法的正确与否 + +首先我们要作的是 + +#### [JavaScript 解释型语言还是编译型语言][20] + +传统意义上,程序员经常将自己的程序编译之后运行出结果就认为这种语言是编译型语言。 + +> 从初学者的角度来说,编译的过程就是将我们自己编辑好的高级语言程序转换成机器实际运行过程中能够看懂的格式(一般是二进制文件格式)。 + +就像GO语言,可以使用go build的命令行工具编译.go的文件格式,将其编译成较低级的语言,可以直接运行的格式。(译者没有使用过GO语言,不清楚GO编译过程的机制,试着用C语言的方式说明) + +``` +# We manually compile our .go file into something we can run +# using the command line tool "go build" +go build ultimate-angular.go +# ...then we execute it! +./ultimate-angular +``` + +我们在日常使用JavaScript开发的时候并没有编译的这一步,这是JavaScript忽略了我们程序员对新一代构建工具和模块加载程序的热爱。 + +我们编写JavaScript代码在浏览器的