杭州校区切换校区

新闻资讯

  • news

    使用 Python 的 toolz 库开始函数式编程

    发布时间:2018-11-15

    <p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">在这个由两部分组成的系列文章的第二部分中,我们将继续探索如何将函数式编程方法中的好想法引入到 Python中,以实现两全其美。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">在上一篇文章中,我们介绍了<span style="font-family:&quot;color:#4D8AD8;line-height:28px;">不可变数据结构</span><span class="" style="font-family:&quot;color:#FFFFFF;line-height:1em;font-size:9px;vertical-align:super;background-color:#666666;">[1]</span>。 这些数据结构使得我们可以编写“纯”函数,或者说是没有副作用的函数,仅仅接受一些参数并返回结果,同时保持良好的性能。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">在这篇文章中,我们使用 toolz 库来构建。 这个库具有操作此类函数的函数,并且它们在纯函数中表现得特别好。 在函数式编程世界中,它们通常被称为“高阶函数”,因为它们将函数作为参数,将函数作为结果返回。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">让我们从这里开始:</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#E28964;line-height:28px;">def</span><span class="" style="color:#B8FFB8;line-height:28px;"> add_one_word</span><span class="" style="color:#B8FFB8;line-height:28px;">(</span><span class="" style="color:#B8FFB8;line-height:28px;">words</span><span class="" style="color:#B8FFB8;line-height:28px;">,</span><span class="" style="color:#B8FFB8;line-height:28px;"> word</span><span class="" style="color:#B8FFB8;line-height:28px;">):</span></p></li><li><p><span class="" style="color:#B8FFB8;line-height:28px;">&nbsp; &nbsp; </span><span class="" style="color:#E28964;line-height:28px;">return</span><span class="" style="color:#B8FFB8;line-height:28px;"> words</span><span class="" style="color:#B8FFB8;line-height:28px;">.</span><span class="" style="color:#E28964;line-height:28px;">set</span><span class="" style="color:#B8FFB8;line-height:28px;">(</span><span class="" style="color:#B8FFB8;line-height:28px;">words</span><span class="" style="color:#B8FFB8;line-height:28px;">.</span><span class="" style="color:#E28964;line-height:28px;">get</span><span class="" style="color:#B8FFB8;line-height:28px;">(</span><span class="" style="color:#B8FFB8;line-height:28px;">word</span><span class="" style="color:#B8FFB8;line-height:28px;">,</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#3387CC;line-height:28px;">0</span><span class="" style="color:#B8FFB8;line-height:28px;">)</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#B8FFB8;line-height:28px;">+</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#3387CC;line-height:28px;">1</span><span class="" style="color:#B8FFB8;line-height:28px;">)</span></p></li></ol></pre> <p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">这个函数假设它的第一个参数是一个不可变的类似字典的对象,它返回一个新的类似字典的在相关位置递增的对象:这就是一个简单的频率计数器。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">但是,只有将它应用于单词流并做<span style="font-family:&quot;color:#42962A;line-height:28px;">归纳</span>时才有用。 我们可以使用内置模块&nbsp;functools&nbsp;中的归纳器。</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#B8FFB8;line-height:28px;">functools</span><span class="" style="color:#B8FFB8;line-height:28px;">.</span><span class="" style="color:#B8FFB8;line-height:28px;">reduce</span><span class="" style="color:#B8FFB8;line-height:28px;">(</span><span class="" style="color:#E28964;line-height:28px;">function</span><span class="" style="color:#B8FFB8;line-height:28px;">,</span><span class="" style="color:#B8FFB8;line-height:28px;"> stream</span><span class="" style="color:#B8FFB8;line-height:28px;">,</span><span class="" style="color:#B8FFB8;line-height:28px;"> initializer</span><span class="" style="color:#B8FFB8;line-height:28px;">)</span></p></li></ol></pre> <p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">我们想要一个函数,应用于流,并且能能返回频率计数。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">我们首先使用&nbsp;toolz.curry&nbsp;函数:</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#B8FFB8;line-height:28px;">add_all_words </span><span class="" style="color:#B8FFB8;line-height:28px;">=</span><span class="" style="color:#B8FFB8;line-height:28px;"> curry</span><span class="" style="color:#B8FFB8;line-height:28px;">(</span><span class="" style="color:#B8FFB8;line-height:28px;">functools</span><span class="" style="color:#B8FFB8;line-height:28px;">.</span><span class="" style="color:#B8FFB8;line-height:28px;">reduce</span><span class="" style="color:#B8FFB8;line-height:28px;">,</span><span class="" style="color:#B8FFB8;line-height:28px;"> add_one_word</span><span class="" style="color:#B8FFB8;line-height:28px;">)</span></p></li></ol></pre> <p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">使用此版本,我们需要提供初始化程序。但是,我们不能只将&nbsp;pyrsistent.m&nbsp;函数添加到&nbsp;curry&nbsp;函数中; 因为这个顺序是错误的。</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#B8FFB8;line-height:28px;">add_all_words_flipped </span><span class="" style="color:#B8FFB8;line-height:28px;">=</span><span class="" style="color:#B8FFB8;line-height:28px;"> flip</span><span class="" style="color:#B8FFB8;line-height:28px;">(</span><span class="" style="color:#B8FFB8;line-height:28px;">add_all_words</span><span class="" style="color:#B8FFB8;line-height:28px;">)</span></p></li></ol></pre> <p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">flip&nbsp;这个高阶函数返回一个调用原始函数的函数,并且翻转参数顺序。</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#B8FFB8;line-height:28px;">get_all_words </span><span class="" style="color:#B8FFB8;line-height:28px;">=</span><span class="" style="color:#B8FFB8;line-height:28px;"> add_all_words_flipped</span><span class="" style="color:#B8FFB8;line-height:28px;">(</span><span class="" style="color:#B8FFB8;line-height:28px;">pyrsistent</span><span class="" style="color:#B8FFB8;line-height:28px;">.</span><span class="" style="color:#B8FFB8;line-height:28px;">m</span><span class="" style="color:#B8FFB8;line-height:28px;">())</span></p></li></ol></pre> <p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">我们利用&nbsp;flip&nbsp;自动调整其参数的特性给它一个初始值:一个空字典。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">现在我们可以执行&nbsp;get_all_words(word_stream)&nbsp;这个函数来获取频率字典。 但是,我们如何获得一个单词流呢? Python 文件是按行供流的。</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#E28964;line-height:28px;">def</span><span class="" style="color:#B8FFB8;line-height:28px;"> to_words</span><span class="" style="color:#B8FFB8;line-height:28px;">(</span><span class="" style="color:#B8FFB8;line-height:28px;">lines</span><span class="" style="color:#B8FFB8;line-height:28px;">):</span></p></li><li><p><span class="" style="color:#B8FFB8;line-height:28px;">&nbsp; &nbsp; </span><span class="" style="color:#E28964;line-height:28px;">for</span><span class="" style="color:#B8FFB8;line-height:28px;"> line </span><span class="" style="color:#E28964;line-height:28px;">in</span><span class="" style="color:#B8FFB8;line-height:28px;"> lines</span><span class="" style="color:#B8FFB8;line-height:28px;">:</span></p></li><li><p><span class="" style="color:#B8FFB8;line-height:28px;">&nbsp; &nbsp; &nbsp; &nbsp; </span><span class="" style="color:#E28964;line-height:28px;">yield</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#E28964;line-height:28px;">from</span><span class="" style="color:#B8FFB8;line-height:28px;"> line</span><span class="" style="color:#B8FFB8;line-height:28px;">.</span><span class="" style="color:#E28964;line-height:28px;">split</span><span class="" style="color:#B8FFB8;line-height:28px;">()</span></p></li></ol></pre> <p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">在单独测试每个函数后,我们可以将它们组合在一起:</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#B8FFB8;line-height:28px;">words_from_file </span><span class="" style="color:#B8FFB8;line-height:28px;">=</span><span class="" style="color:#B8FFB8;line-height:28px;"> toolz</span><span class="" style="color:#B8FFB8;line-height:28px;">.</span><span class="" style="color:#B8FFB8;line-height:28px;">compose</span><span class="" style="color:#B8FFB8;line-height:28px;">(</span><span class="" style="color:#B8FFB8;line-height:28px;">get_all_words</span><span class="" style="color:#B8FFB8;line-height:28px;">,</span><span class="" style="color:#B8FFB8;line-height:28px;"> to_words</span><span class="" style="color:#B8FFB8;line-height:28px;">)</span></p></li></ol></pre> <p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">在这种情况下,组合只是使两个函数很容易阅读:首先将文件的行流应用于&nbsp;to_words,然后将&nbsp;get_all_words&nbsp;应用于&nbsp;to_words&nbsp;的结果。 但是文字上读起来似乎与代码执行相反。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">当我们开始认真对待可组合性时,这很重要。有时可以将代码编写为一个单元序列,单独测试每个单元,最后将它们全部组合。如果有几个组合元素时,组合的顺序可能就很难理解。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">toolz&nbsp;库借用了 Unix 命令行的做法,并使用&nbsp;pipe&nbsp;作为执行相同操作的函数,但顺序相反。</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#B8FFB8;line-height:28px;">words_from_file </span><span class="" style="color:#B8FFB8;line-height:28px;">=</span><span class="" style="color:#B8FFB8;line-height:28px;"> toolz</span><span class="" style="color:#B8FFB8;line-height:28px;">.</span><span class="" style="color:#B8FFB8;line-height:28px;">pipe</span><span class="" style="color:#B8FFB8;line-height:28px;">(</span><span class="" style="color:#B8FFB8;line-height:28px;">to_words</span><span class="" style="color:#B8FFB8;line-height:28px;">,</span><span class="" style="color:#B8FFB8;line-height:28px;"> get_all_words</span><span class="" style="color:#B8FFB8;line-height:28px;">)</span></p></li></ol></pre> <p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">现在读起来更直观了:将输入传递到&nbsp;to_words,并将结果传递给&nbsp;get_all_words。 在命令行上,等效写法如下所示:</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#B8FFB8;line-height:28px;">$ </span><span class="" style="color:#E28964;line-height:28px;">cat</span><span class="" style="color:#B8FFB8;line-height:28px;"> files </span><span class="" style="color:#B8FFB8;line-height:28px;">|</span><span class="" style="color:#B8FFB8;line-height:28px;"> to_words </span><span class="" style="color:#B8FFB8;line-height:28px;">|</span><span class="" style="color:#B8FFB8;line-height:28px;"> get_all_words</span></p></li></ol></pre> <p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">toolz&nbsp;库允许我们操作函数,切片、分割和组合,以使我们的代码更容易理解和测试。</p>
  • news

    如何禁用 Ubuntu 服务器中终端欢迎消息中的广告

    发布时间:2018-11-06

    <p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">如果你正在使用最新的 Ubuntu 服务器版本,你可能已经注意到欢迎消息中有一些与 Ubuntu 服务器平台无关的促销链接。你可能已经知道&nbsp;<span style="font-family:&quot;color:#C40F0F;line-height:28px;">MOTD</span>,即&nbsp;<span style="font-family:&quot;color:#C40F0F;line-height:28px;">M</span>essage&nbsp;<span style="font-family:&quot;color:#C40F0F;line-height:28px;">O</span>f&nbsp;<span style="font-family:&quot;color:#C40F0F;line-height:28px;">T</span>he&nbsp;<span style="font-family:&quot;color:#C40F0F;line-height:28px;">D</span>ay 的开头首字母,在 Linux 系统每次登录时都会显示欢迎信息。通常,欢迎消息包含操作系统版本,基本系统信息,官方文档链接以及有关最新安全更新等的链接。这些是我们每次通过 SSH 或本地登录时通常会看到的内容。但是,最近在终端欢迎消息中出现了一些其他链接。我已经几次注意到这些链接,但我并在意,也从未点击过。题图是我的 Ubuntu 18.04 LTS 服务器上显示的终端欢迎消息。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">正如你在上面截图中所看到的,欢迎消息中有一个 bit.ly 链接和 Ubuntu wiki 链接。有些人可能会惊讶并想知道这是什么。其实欢迎信息中的链接无需担心。它可能看起来像广告,但并不是商业广告。链接实际上指向到了&nbsp;<span style="font-family:&quot;color:#4D8AD8;line-height:28px;">Ubuntu 官方博客</span><span class="" style="font-family:&quot;color:#FFFFFF;line-height:1em;font-size:9px;vertical-align:super;background-color:#666666;">[1]</span>&nbsp;和&nbsp;<span style="font-family:&quot;color:#4D8AD8;line-height:28px;">Ubuntu wiki</span><span class="" style="font-family:&quot;color:#FFFFFF;line-height:1em;font-size:9px;vertical-align:super;background-color:#666666;">[2]</span>。正如我之前所说,其中的一个链接是不相关的,没有任何与 Ubuntu 服务器相关的细节,这就是为什么我开头称它们为广告。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">虽然我们大多数人都不会访问 bit.ly 链接,但是有些人可能出于好奇去访问这些链接,结果失望地发现它只是指向一个外部链接。你可以使用任何 URL 去短网址服务,例如 unshorten.it,在访问真正链接之前,查看它会指向哪里。或者,你只需在 bit.ly 链接的末尾输入加号(+)即可查看它们的实际位置以及有关链接的一些统计信息。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:center;"><img src="http://115.29.210.249/tggPic/content/2018-11/1541492819814.jpg" data-ke-src="http://115.29.210.249/tggPic/content/2018-11/1541492819814.jpg" alt=""></p><p class="" style="font-family:Optima-Regular, PingFangTC-light;color:#FFFFFF;text-align:justify;font-size:1.4em;background-color:#3F51B5;">什么是 MOTD 以及它是如何工作的?</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">2009 年,来自 Canonical 的 Dustin Kirkland 在 Ubuntu 中引入了 MOTD 的概念。它是一个灵活的框架,使管理员或发行包能够在&nbsp;/etc/update-motd.d/&nbsp;位置添加可执行脚本,目的是生成在登录时显示有益的、有趣的消息。它最初是为 Landscape(Canonical 的商业服务)实现的,但是其它发行版维护者发现它很有用,并且在他们自己的发行版中也采用了这个特性。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">如果你在 Ubuntu 系统中查看&nbsp;/etc/update-motd.d/,你会看到一组脚本。一个是打印通用的 “欢迎” 横幅。下一个打印 3 个链接,显示在哪里可以找到操作系统的帮助。另一个计算并显示本地系统包可以更新的数量。另一个脚本告诉你是否需要重新启动等等。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">从 Ubuntu 17.04 起,开发人员添加了&nbsp;/etc/update-motd.d/50-motd-news,这是一个脚本用来在欢迎消息中包含一些附加信息。这些附加信息是:</p><span style="color:#666666;font-family:&quot;font-size:14px;background-color:#FFFFFF;">1.&nbsp;重要的关键信息,例如 ShellShock、Heartbleed 等2.&nbsp;生命周期(EOL)消息,新功能可用性等3.&nbsp;在 Ubuntu 官方博客和其他有关 Ubuntu 的新闻中发布的一些有趣且有益的帖子</span><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">另一个特点是异步,启动后约 60 秒,systemd 计时器运行&nbsp;/etc/update-motd.d/50-motd-news –force&nbsp;脚本。它提供了&nbsp;/etc/default/motd-news&nbsp;脚本中定义的 3 个配置变量。默认值为:ENABLED=1, URLS="https://motd.ubuntu.com", WAIT="5"。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">以下是&nbsp;/etc/default/motd-news&nbsp;文件的内容:</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#B8FFB8;line-height:28px;">$ </span><span class="" style="color:#E28964;line-height:28px;">cat</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#B8FFB8;line-height:28px;">/</span><span class="" style="color:#B8FFB8;line-height:28px;">etc</span><span class="" style="color:#B8FFB8;line-height:28px;">/</span><span class="" style="color:#E28964;line-height:28px;">default</span><span class="" style="color:#B8FFB8;line-height:28px;">/</span><span class="" style="color:#B8FFB8;line-height:28px;">motd</span><span class="" style="color:#B8FFB8;line-height:28px;">-</span><span class="" style="color:#B8FFB8;line-height:28px;">news</span></p></li><li><p><span class="" style="color:#AEAEAE;line-height:28px;font-style:italic;">#</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#89BDFF;line-height:28px;">Enable</span><span class="" style="color:#B8FFB8;line-height:28px;">/</span><span class="" style="color:#B8FFB8;line-height:28px;">disable the dynamic MOTD news service</span></p></li><li><p><span class="" style="color:#AEAEAE;line-height:28px;font-style:italic;">#</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#89BDFF;line-height:28px;">This</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#E28964;line-height:28px;">is</span><span class="" style="color:#B8FFB8;line-height:28px;"> a useful way to provide dynamic</span><span class="" style="color:#B8FFB8;line-height:28px;">,</span><span class="" style="color:#B8FFB8;line-height:28px;"> informative</span></p></li><li><p><span class="" style="color:#AEAEAE;line-height:28px;font-style:italic;">#</span><span class="" style="color:#B8FFB8;line-height:28px;"> information pertinent to the </span><span class="" style="color:#E28964;line-height:28px;">users</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#E28964;line-height:28px;">and</span><span class="" style="color:#B8FFB8;line-height:28px;"> administrators</span></p></li><li><p><span class="" style="color:#AEAEAE;line-height:28px;font-style:italic;">#</span><span class="" style="color:#B8FFB8;line-height:28px;"> of the </span><span class="" style="color:#E28964;line-height:28px;">local</span><span class="" style="color:#B8FFB8;line-height:28px;"> system</span></p></li><li><p><span class="" style="color:#B8FFB8;line-height:28px;">ENABLED</span><span class="" style="color:#B8FFB8;line-height:28px;">=</span><span class="" style="color:#3387CC;line-height:28px;">1</span></p></li><li></li><li><p><span class="" style="color:#AEAEAE;line-height:28px;font-style:italic;">#</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#89BDFF;line-height:28px;">Configure</span><span class="" style="color:#B8FFB8;line-height:28px;"> the source of dynamic MOTD news</span></p></li><li><p><span class="" style="color:#AEAEAE;line-height:28px;font-style:italic;">#</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#89BDFF;line-height:28px;">White</span><span class="" style="color:#B8FFB8;line-height:28px;"> space separated </span><span class="" style="color:#E28964;line-height:28px;">list</span><span class="" style="color:#B8FFB8;line-height:28px;"> of </span><span class="" style="color:#3387CC;line-height:28px;">0</span><span class="" style="color:#B8FFB8;line-height:28px;"> to many news services</span></p></li><li><p><span class="" style="color:#AEAEAE;line-height:28px;font-style:italic;">#</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#89BDFF;line-height:28px;">For</span><span class="" style="color:#B8FFB8;line-height:28px;"> security reasons</span><span class="" style="color:#B8FFB8;line-height:28px;">,</span><span class="" style="color:#B8FFB8;line-height:28px;"> these must be https</span></p></li><li><p><span class="" style="color:#AEAEAE;line-height:28px;font-style:italic;">#</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#E28964;line-height:28px;">and</span><span class="" style="color:#B8FFB8;line-height:28px;"> have a valid certificate</span></p></li><li><p><span class="" style="color:#AEAEAE;line-height:28px;font-style:italic;">#</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#89BDFF;line-height:28px;">Canonical</span><span class="" style="color:#B8FFB8;line-height:28px;"> runs a service at motd</span><span class="" style="color:#B8FFB8;line-height:28px;">.</span><span class="" style="color:#B8FFB8;line-height:28px;">ubuntu</span><span class="" style="color:#B8FFB8;line-height:28px;">.</span><span class="" style="color:#B8FFB8;line-height:28px;">com</span><span class="" style="color:#B8FFB8;line-height:28px;">,</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#E28964;line-height:28px;">and</span><span class="" style="color:#B8FFB8;line-height:28px;"> you</span></p></li><li><p><span class="" style="color:#AEAEAE;line-height:28px;font-style:italic;">#</span><span class="" style="color:#B8FFB8;line-height:28px;"> can easily run one too</span></p></li><li><p><span class="" style="color:#B8FFB8;line-height:28px;">URLS</span><span class="" style="color:#B8FFB8;line-height:28px;">=</span><span class="" style="color:#65B042;line-height:28px;">"https://motd.ubuntu.com"</span></p></li><li></li><li><p><span class="" style="color:#AEAEAE;line-height:28px;font-style:italic;">#</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#89BDFF;line-height:28px;">Specify</span><span class="" style="color:#B8FFB8;line-height:28px;"> the </span><span class="" style="color:#E28964;line-height:28px;">time</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#E28964;line-height:28px;">in</span><span class="" style="color:#B8FFB8;line-height:28px;"> seconds</span><span class="" style="color:#B8FFB8;line-height:28px;">,</span><span class="" style="color:#B8FFB8;line-height:28px;"> you</span><span class="" style="color:#65B042;line-height:28px;">'re willing to wait for</span></p></li><li><p><span class="" style="color:#65B042;line-height:28px;"># dynamic MOTD news</span></p></li><li><p><span class="" style="color:#65B042;line-height:28px;"># Note that news messages are fetched in the background by</span></p></li><li><p><span class="" style="color:#65B042;line-height:28px;"># a systemd timer, so this should never block boot or login</span></p></li><li><p><span class="" style="color:#65B042;line-height:28px;">WAIT=5</span></p></li></ol></pre> <p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">好事情是 MOTD 是完全可定制的,所以你可以彻底禁用它(ENABLED=0)、根据你的意愿更改或添加脚本、以秒为单位更改等待时间等等。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">如果启用了 MOTD,那么 systemd 计时器作业将循环遍历每个 URL,将它们的内容缩减到每行 80 个字符、最多 10 行,并将它们连接到&nbsp;/var/cache/motd-news&nbsp;中的缓存文件。此 systemd 计时器作业将每隔 12 小时运行并更新&nbsp;/var/cache/motd-news。用户登录后,/var/cache/motd-news&nbsp;的内容会打印到屏幕上。这就是 MOTD 的工作原理。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">此外,/etc/update-motd.d/50-motd-news&nbsp;文件中包含自定义的用户代理字符串,以报告有关计算机的信息。如果你查看&nbsp;/etc/update-motd.d/50-motd-news&nbsp;文件,你会看到:</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#AEAEAE;line-height:28px;font-style:italic;">#</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#89BDFF;line-height:28px;">Piece</span><span class="" style="color:#B8FFB8;line-height:28px;"> together the user agent</span></p></li><li><p><span class="" style="color:#B8FFB8;line-height:28px;">USER_AGENT</span><span class="" style="color:#B8FFB8;line-height:28px;">=</span><span class="" style="color:#65B042;line-height:28px;">"curl/$curl_ver $lsb $platform $cpu $uptime"</span></p></li></ol></pre> <p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">这意味着,MOTD 检索器将向 Canonical 报告你的操作系统版本、硬件平台、CPU 类型和正常运行时间。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">到这里,希望你对 MOTD 有了一个基本的了解。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">现在让我们回到主题,我不想要这个功能。我该如何禁用它?如果欢迎消息中的促销链接仍然困扰你,并且你想永久禁用它们,则可以通过以下方法快速禁用它。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;color:#FFFFFF;text-align:justify;font-size:1.4em;background-color:#3F51B5;">在 Ubuntu 服务器中禁用终端欢迎消息中的广告</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">要禁用这些广告,编辑文件:</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#B8FFB8;line-height:28px;">$ </span><span class="" style="color:#E28964;line-height:28px;">sudo</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#E28964;line-height:28px;">vi</span><span class="" style="color:#B8FFB8;line-height:28px;"> </span><span class="" style="color:#B8FFB8;line-height:28px;">/</span><span class="" style="color:#B8FFB8;line-height:28px;">etc</span><span class="" style="color:#B8FFB8;line-height:28px;">/</span><span class="" style="color:#E28964;line-height:28px;">default</span><span class="" style="color:#B8FFB8;line-height:28px;">/</span><span class="" style="color:#B8FFB8;line-height:28px;">motd</span><span class="" style="color:#B8FFB8;line-height:28px;">-</span><span class="" style="color:#B8FFB8;line-height:28px;">news</span></p></li></ol></pre> <p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">找到以下行并将其值设置为&nbsp;0(零)。</p> <pre class=""><ol class="list-paddingleft-2"><li><p><span class="" style="color:#B8FFB8;line-height:28px;">[...]</span></p></li><li><p><span class="" style="color:#B8FFB8;line-height:28px;">ENABLED</span><span class="" style="color:#B8FFB8;line-height:28px;">=</span><span class="" style="color:#3387CC;line-height:28px;">0</span></p></li><li><p><span class="" style="color:#B8FFB8;line-height:28px;">[...]</span></p></li></ol></pre> <p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">保存并关闭文件。现在,重新启动系统,看看欢迎消息是否仍然显示来自 Ubuntu 博客的链接。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:center;"><img src="http://115.29.210.249/tggPic/content/2018-11/1541492860952.png" data-ke-src="http://115.29.210.249/tggPic/content/2018-11/1541492860952.png" alt=""></p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;font-size:14px;background-color:#FFFFFF;text-align:justify;">看到没?现在没有来自 Ubuntu 博客和 Ubuntu wiki 的链接。</p>
  • news

    灰度发布在 UCloud 大规模虚拟网络中的应用

    发布时间:2018-10-25

    <div class="news_content" style="margin:0px;padding:20px 0px 0px;font-family:&quot;color:#333333;font-size:14px;background-color:#FFFFFF;"><span class="content" style="color:#666666;line-height:28px;"><p class="" style="font-family:Optima-Regular, PingFangTC-light;color:#FFFFFF;text-align:justify;font-size:1.4em;background-color:#3F51B5;">ServiceMesh 实现控制面灰度</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;text-align:justify;">在控制面,早期灰度发布采用 APIGW 的方式实现。APIGW 通常仅部署在用户流量的入口,完全灰度发布就需要完整地部署两套系统。但在微服务化的时代,任何一个微服务发生变更都需要完整地部署两套系统,这不仅成本高且严重影响产品变更速度。ServiceMesh 以类似于将 APIGateway 部署到本地,同时提供集中化控制的方式,完美地解决了这些问题。&nbsp;</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;text-align:justify;">UCloud 的轻量级 ServiceMesh 平台基于 Istio,继续使用 Envoy 代理,修改 Pilot 在保留完整的 DSL 支持的基础上实现了脱离 K8S 运行。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;text-align:justify;">因此网络团队对 Pilot 做了高度定制,从而更能满足自身的需求。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;color:#333333;text-align:center;"><img src="http://115.29.210.249/tggPic/content/2018-10/1540445371049.jpg" data-ke-src="http://115.29.210.249/tggPic/content/2018-10/1540445371049.jpg" alt=""></p>◈&nbsp;定制方案一:按账号灰度。在 GRPC 或者 HTTP 请求中添加自定义 Header&nbsp;x-ucloud-routeby,x-ucloud-routeby&nbsp;采用 Cookie 的编码格式,在其中包含账户信息,配置 Envoy 根据该 Header 进行策略路由。◈&nbsp;定制方案二:采用显式代理而不是 IPTables 透明引流的方式和 Envoy 集成,支持 HTTP 1.0、HTTP 2.0 和 gRPC。在配置了 Envoy 的 Proxy Port 情况下,通过 Envoy 接入 ServiceMesh;如果配置域名且没有配置 Envoy 的 Proxy,则自动采用 ETCD gRPC 命名与发现的方式;如果配置 IP 地址和端口,则直连指定地址。<br><p style="color:#333333;"><img src="http://115.29.210.249/tggPic/content/2018-10/1540445402507.jpg" data-ke-src="http://115.29.210.249/tggPic/content/2018-10/1540445402507.jpg" alt=""></p><p style="color:#333333;">◈&nbsp;定制方案三:采用 docker-compose 管理容器实现 sidecar。新方案中仍然采用容器的方式打包和部署微服务,但采用 Host 的网络方式简化了现存服务的网络通信方式。通过这种方式实现了一个简单的服务管理、版本管理、集群管理、路由策略管理层,为集群中的每台 Node(虚拟机或物理服务器)生成 docker-compose 配置文件,从而部署和管理每台 Node 的服务。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;color:#FFFFFF;text-align:justify;font-size:1.4em;background-color:#3F51B5;">可编程交换机实现转发面灰度</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;text-align:justify;">在转发面灰度的方案选择上,团队采用了可编程交换机(基于 Barefoot Tofino 芯片)来实现灰度网关,替换普通交换机实现强灰度能力。&nbsp;</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;text-align:justify;">灰度网关最大提供 64 个 100G 的接口、6.4T 带宽,PPS 性能可达 4400 兆,延迟为 us 级别,能够很好支持网络宽带的高性能要求。灰度网关可以提供:一致性哈希 ECMP 的能力;可以基于任意定制字段(包括内层虚拟网络地址以及租户 ID)计算哈希;在计算哈希前优先应用灰度规则,可以根据任意字段定制灰度规则,最小粒度可以做到按 TCP 流来灰度。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;color:#333333;text-align:center;"><img src="http://115.29.210.249/tggPic/content/2018-10/1540445417074.jpg" data-ke-src="http://115.29.210.249/tggPic/content/2018-10/1540445417074.jpg" alt=""></p><p class="" style="font-family:Optima-Regular, PingFangTC-light;color:#FFFFFF;text-align:justify;font-size:1.4em;background-color:#3F51B5;">转发面灰度示例</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;text-align:justify;">有了上述这些新工具,可以通过部署新的策略实现更加细粒的灰度发布,具体方案为:可编程交换机 BGP 宣告集群 VIP 引流,根据选择字段计算一致性哈希后将流量量分发给后端服务器,并按照选择字段(VNI、源地址、目的地址)配置灰度规则。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;text-align:justify;">灰度步骤如下:</p>1.&nbsp;按 VM 的粒度将流量量切换到灰度后端服务器器;2.&nbsp;切换完成后立刻自动回归测试,根据路由表自动生成监测地址列表,并 Ping 检测网络互通性;3.&nbsp;测试通过则逐步增加灰度的VM地址;4.&nbsp;直到整个 VPC 的流量量全部切换到灰度后端服务器器;5.&nbsp;再切换一个新的 VPC,直到所有分片内的 VPC 都切换到新的灰度后端服务器;6.&nbsp;完成灰度发布。</span></div><div><br></div>
  • news

    如何确保云服务的可靠性呢?

    发布时间:2018-10-19

    <p style="color:inherit;font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">从客户的角度来看,云服务应该只是工作。但是,服务的中断其实是不可避免的,这不是一个“是否会发生”的问题,严格意义上是“何时会发生”的问题。不管在线服务的设计和建成是如何的精炼,都会不可避免的遭遇到突发事件的发生。区别就在于服务提供商如何预测,并及时的从这些情况中进行恢复。从而保证客户的体验。</p><h4 style="font-size:1.2em;font-family:-apple-system-font, BlinkMacSystemFont, &quot;text-align:justify;color:#37474F;background-color:#FFFFFF;"><span style="font-size:inherit;color:inherit;line-height:inherit;"><img src="http://115.29.210.249/tggPic/content/2018-10/1539946726606.jpg" data-ke-src="http://115.29.210.249/tggPic/content/2018-10/1539946726606.jpg" alt=""><br></span></h4><h4 style="font-size:1.2em;font-family:-apple-system-font, BlinkMacSystemFont, &quot;text-align:justify;color:#37474F;background-color:#FFFFFF;"><span style="font-size:inherit;color:inherit;line-height:inherit;">指导设计原则</span></h4><p style="color:inherit;font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">云服务的三大设计指导原则:1、数据的完整性,2、容错能力,3、快速恢复。这些是客户期望满足的三大属性,至少,要在他们的服务中保证这三大属性。数据完整性是指保护客户委托服务的信息的保真度。容错能力是服务供应商能够检测到故障,并自动采取纠正措施,以便使得服务不会发生中断的服务能力。快速恢复能力是指在未预料到的故障发生时,能够迅速而完全的恢复服务的能力。</p><p style="color:inherit;font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">作为服务商,我们需要尽可能的提前识别并找出各种潜在的故障,然后在服务设计阶段对这些情况进行充分的考虑。这种周全的计划可以帮助我们决定如何确切地服务,并在发生意想不到的挑战时如何做出反应。服务必须能够从这些故障的情况下进行恢复,并保证最小的中断。虽然我们不能预测到每一个故障点或每一失效模式,但利用前瞻性、业务连续性规划和大量的实践,我们可以制定一套紧急预案的流程,以备不时之需。</p><p style="color:inherit;font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">根据云计算的特点,其可以被描述为一个复杂的系统组成,依赖于共享的基础设施和松散的耦合的性,许多特性都是在供应商的直接控制之外。传统上,许多企业维护的内部部署的计算环境,能够让他们直接控制他们的应用程序,基础设施和相关服务。然而,随着云计算的使用量的持续增长,很多企业都纷纷开始选择放弃一些控制权,以降低成本,充分利用资源的弹性(例如,计算、存储、网络资源),促进业务的灵活性,以及??更有效地利用他们的IT资源。</p><h4 style="font-size:1.2em;font-family:-apple-system-font, BlinkMacSystemFont, &quot;text-align:justify;color:#37474F;background-color:#FFFFFF;"><span style="font-size:inherit;color:inherit;line-height:inherit;">理解团队的角色定位</span></h4><p style="color:inherit;font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">从工程服务团队的角度来看,设计和建筑服务(相对于盒产品,或企业内部部署的解决方案)意味着扩大了他们的责任范围。在设计企业内部部署的解决方案时,工程团队只需要设计建造并测试服务,将其打包,然后根据软件操作建议所描述的计算环境进行发布即可。而相比之下,工程服务团队在设计建造并测试服务之后,还要进行相关的部署和监控,以便确保服务的继续运行,如果有突发事件,他们需要确保尽快的解决。而且工程服务团队经常对服务计算环境具有更少的控制权!</p><h4 style="font-size:1.2em;font-family:-apple-system-font, BlinkMacSystemFont, &quot;text-align:justify;color:#37474F;background-color:#FFFFFF;"><span style="font-size:inherit;color:inherit;line-height:inherit;">采用故障模式及影响分析</span></h4><p style="color:inherit;font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">许多服务团队采用故障模型(FMA)和根本原因分析(RCA),以帮助他们提高服务的可靠性,防止故障的发生。我的看法是,这些都是必要的,但还不够。相反,设计团队应采用故障模式及影响分析(FMEA)来帮助确保更有效的结果。</p><p style="color:inherit;font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">FMA通过可重复的设计流程旨在识别和减轻服务设计过程中的故障。RCA包括识别和确定导致有害结果的性质、规模、位置和时间因素。一套整体的终端到终端的FMEA方法的主要好处包括全面的故障点和故障模式综合图,能够形成一个工程投资的优先级列表,以减轻已知故障的映射。</p><p style="color:inherit;font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">FMEA运用系统可靠性工程师技术的开发研究,发现可能出现的(复杂的)系统故障问题。研究通过评估严重程度、发生的频率和检测能力来了解故障影响可能存在的问题,以便基于不同的风险优先处理所需工程投资。</p><p style="color:inherit;font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">准备阶段:在此步骤中,重要的是要理解系统的完整性,生成一个完整的系统的逻辑图,包括其组成部分、数据源和数据业务流。使用模板来完成,这提高了整体的分析结果,通过提供可能的故障点,设计团队可以发掘到重要的线索。</p><p style="color:inherit;font-family:-apple-system-font, BlinkMacSystemFont, &quot;font-size:inherit;text-align:justify;background-color:#FFFFFF;">发现组件间的相互作用:一切都在这一步的范围内。从前面所指出的逻辑图开始,以确定所有的组件是否容易运行失败。了解所有组件(连接器)之间的相互作用,以及每个组件如何在完整的系统中发挥作用。</p>
  • news

    从过时的 Windows 机器迁移到 Linux

    发布时间:2018-10-09

    <div class="news_content" style="margin:0px;padding:20px 0px 0px;font-family:&quot;color:#333333;font-size:14px;background-color:#FFFFFF;"><span class="content" style="color:#666666;line-height:28px;"><p class="" style="font-family:Optima-Regular, PingFangTC-light;color:#FFFFFF;text-align:justify;font-size:1.4em;background-color:#3F51B5;">为何选择 Linux ?</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;text-align:justify;">我们必须做出改变,首先,我们的老系统在性能方面不够用:我们经历过频繁的崩溃,每当运行超过两个应用时,机器就会负载过度,关闭机器时有一半的几率冻结等等。这很容易让我们从工作中分心,意味着我们没有我们应有的工作效率了。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;text-align:justify;">升级到 Windows 的新版本也是一种选择,但这样可能会带来额外的开销,而且我们的软件本身也是要与 Microsoft 的办公软件竞争。因此我们在这方面也存在意识形态的问题。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;text-align:justify;">其次,就像我之前提过的, ONLYOFFICE 产品在 Linux 社区内非常受欢迎。通过阅读 Linux 用户在使用我们的软件时的体验,我们也对加入他们很感兴趣。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;text-align:justify;">在我们要求转换到 Linux 系统一周后,我们拿到了崭新的装好了&nbsp;<span style="font-family:&quot;color:#4D8AD8;line-height:28px;">Kubuntu</span><span class="" style="font-family:&quot;color:#FFFFFF;line-height:1em;font-size:9px;vertical-align:super;background-color:#666666;">[1]</span>&nbsp;的机器。我们选择了 16.04 版本,因为这个版本支持 KDE Plasma 5.5 和包括 Dolphin 在内的很多 KDE 应用,同时也包括 LibreOffice 5.1 和 Firefox 45 。</p><p class="" style="font-family:Optima-Regular, PingFangTC-light;color:#FFFFFF;text-align:justify;font-size:1.4em;background-color:#3F51B5;">Linux 让人喜欢的地方</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;text-align:justify;">我相信 Linux 最大的优势是它的运行速度,比如,从按下机器的电源按钮到开始工作只需要几秒钟时间。从一开始,一切看起来都超乎寻常地快:总体的响应速度,图形界面,甚至包括系统更新的速度。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;text-align:justify;">另一个使我惊奇的事情是跟 Windows 相比, Linux 几乎能让你配置任何东西,包括整个桌面的外观。在设置里面,我发现了如何修改各种栏目、按钮和字体的颜色和形状,也可以重新布置任意桌面组件的位置,组合桌面小工具(甚至包括漫画和颜色选择器)。我相信我还仅仅只是了解了基本的选项,之后还需要探索这个系统更多著名的定制化选项。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;text-align:justify;">Linux 发行版通常是一个非常安全的环境。人们很少在 Linux 系统中使用防病毒的软件,因为很少有人会写病毒程序来攻击 Linux 系统。因此你可以拥有很好的系统速度,并且节省了时间和金钱。</p><p style="font-family:Optima-Regular, PingFangTC-light;color:#333333;text-align:justify;">总之, Linux 已经改变了我们的日常生活,用一系列的新选项和功能大大震惊了我们。仅仅通过短时间的使用,我们已经可以给它总结出以下特性:</p>◈&nbsp;操作很快很顺畅◈&nbsp;高度可定制◈&nbsp;对新手很友好◈&nbsp;了解基本组件很有挑战性,但回报丰厚◈&nbsp;安全可靠◈&nbsp;对所有想改变工作场所的人来说都是一次绝佳的体验</span></div><div><br></div>
在线咨询 ×

您好,请问有什么可以帮您?我们将竭诚提供最优质服务!