2020年10月

本教程向你展示在 Ubuntu 上安装深度(Deepin)桌面环境的正确步骤。还提到了移除步骤。

毫无疑问,深度操作系统(Deepin OS)是一个 漂亮的 Linux 发行版。最近发布的 深度操作系统 V20 就更加美观了。

深度操作系统 是基于 Debian 的,默认的存储库镜像太慢了。如果你更愿意使用 Ubuntu,可以选择 UbuntuDDE Linux 发行版 形式的 Ubuntu 的深度操作系统的变体。它还不是 官方的 Ubuntu 风格 之一。

重新安装新的发行版 是一个麻烦,因为你会丢失数据,你将不得不在新安装的 UbuntuDDE 上重新安装你的应用程序。

一个更简单的选择是在现有的 Ubuntu 系统上安装深度桌面环境(DDE)。毕竟,你可以轻松地在一个系统中安装多个桌面环境

不要烦恼,这很容易做到,如果你不喜欢,也可以恢复这些更改。让我来告诉你怎么做。

在 Ubuntu 20.04 上安装深度桌面环境

UbuntuDDE 团队已为他们的发行版创建了一个 PPA,你可以使用相同的 PPA 在 Ubuntu 20.04 上安装深度桌面环境。请记住,此 PPA 仅适用于 Ubuntu 20.04。请阅读有关 在 Ubuntu 中使用 PPA

没有深度桌面环境 V20

你将在此处使用 PPA 安装的深度桌面环境还不是新的 V20。它可能会在 Ubuntu 20.10 发布后出现,但是我们不能担保。

以下是你需要遵循的步骤:

步骤 1:你需要首先在终端上输入以下内容,来添加 Ubuntu DDE Remix 团队的官方 PPA

sudo add-apt-repository ppa:ubuntudde-dev/stable

步骤 2:添加存储库以后,继而安装深度桌面环境。

sudo apt install ubuntudde-dde

现在,安装将启动,一段时间后,将要求你选择 显示管理器 display manager

如果需要深度桌面主题的锁屏,则需要选择 “lightdm”。如果不需要,你可以将其设置为 “gdm3”。

如果你看不到此选项,可以通过键入以下命令来获得它,然后选择你首选的显示管理器:

sudo dpkg-reconfigure lightdm

步骤 3: 完成后,你必须退出并通过选择 “Deepin” 会话再次登录,或者重新启动系统。

就是这样。马上在你的 Ubuntu 20.04 LTS 系统上享受深度桌面环境体验吧!

从 Ubuntu 20.04 删除深度桌面

如果你不喜欢这种体验,或者由于某些原因它有 bug,可以按照以下步骤将其删除。

步骤 1: 如果你已将 “lightdm” 设置为显示管理器,则需要在卸载深度桌面环境之前将显示管理器设置为 “gdm3”。为此,请键入以下命令:

sudo dpkg-reconfigure lightdm

然后,选择 “gdm3” 继续。

完成此操作后,你只需输入以下命令即可完全删除深度桌面环境:

sudo apt remove startdde ubuntudde-dde

你只需重启即可回到原来的 Ubuntu 桌面环境。如果图标没有响应,只需打开终端(CTRL + ALT + T)并输入:

reboot

总结

有不同的 桌面环境选择 是件好事。如果你真的喜欢深度桌面环境的界面,那么这可能是在 Ubuntu 上体验深度操作系统的一种方式。

如果你有任何疑问或遇到任何问题,请在评论中告诉我。


via: https://itsfoss.com/install-deepin-ubuntu/

作者:Ankush Das 选题:lujun9972 译者:gxlct008 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

本文是该系列的第八篇。

继续前端部分,让我们在本文中完成 home 页面的开发。 我们将添加一个开始对话的表单和一个包含最新对话的列表。

对话表单

转到 static/ages/home-page.js 文件,在 HTML 视图中添加一些标记。

<form id="conversation-form">
    <input type="search" placeholder="Start conversation with..." required>
</form>

将该表单添加到我们显示 “auth user” 和 “logout” 按钮部分的下方。

page.getElementById('conversation-form').onsubmit = onConversationSubmit

现在我们可以监听 “submit” 事件来创建对话了。

import http from '../http.js'
import { navigate } from '../router.js'

async function onConversationSubmit(ev) {
    ev.preventDefault()

    const form = ev.currentTarget
    const input = form.querySelector('input')

    input.disabled = true

    try {
        const conversation = await createConversation(input.value)
        input.value = ''
        navigate('/conversations/' + conversation.id)
    } catch (err) {
        if (err.statusCode === 422) {
            input.setCustomValidity(err.body.errors.username)
        } else {
            alert(err.message)
        }
        setTimeout(() => {
            input.focus()
        }, 0)
    } finally {
        input.disabled = false
    }
}

function createConversation(username) {
    return http.post('/api/conversations', { username })
}

在提交时,我们使用用户名对 /api/conversations 进行 POST 请求,并重定向到 conversation 页面(用于下一篇文章)。

对话列表

还是在这个文件中,我们将创建 homePage() 函数用来先异步加载对话。

export default async function homePage() {
    const conversations = await getConversations().catch(err => {
        console.error(err)
        return []
    })
    /\*...\*/
}

function getConversations() {
    return http.get('/api/conversations')
}

然后,在标记中添加一个列表来渲染对话。

<ol id="conversations"></ol>

将其添加到当前标记的正下方。

const conversationsOList = page.getElementById('conversations')
for (const conversation of conversations) {
    conversationsOList.appendChild(renderConversation(conversation))
}

因此,我们可以将每个对话添加到这个列表中。

import { avatar, escapeHTML } from '../shared.js'

function renderConversation(conversation) {
    const messageContent = escapeHTML(conversation.lastMessage.content)
    const messageDate = new Date(conversation.lastMessage.createdAt).toLocaleString()

    const li = document.createElement('li')
    li.dataset['id'] = conversation.id
    if (conversation.hasUnreadMessages) {
        li.classList.add('has-unread-messages')
    }
    li.innerHTML = `
 <a href="/conversations/${conversation.id}">
 <div>
 ${avatar(conversation.otherParticipant)}
 <span>${conversation.otherParticipant.username}</span>
 </div>
 <div>
 <p>${messageContent}</p>
 <time>${messageDate}</time>
 </div>
 </a>
 `
    return li
}

每个对话条目都包含一个指向对话页面的链接,并显示其他参与者信息和最后一条消息的预览。另外,您可以使用 .hasUnreadMessages 向该条目添加一个类,并使用 CSS 进行一些样式设置。也许是粗体字体或强调颜色。

请注意,我们需要转义信息的内容。该函数来自于 static/shared.js 文件:

export function escapeHTML(str) {
    return str
        .replace(/&/g, '&amp;')
        .replace(/</g, '&lt;')
        .replace(/>/g, '&gt;')
        .replace(/"/g, '&quot;')
        .replace(/'/g, '&#039;')
}

这会阻止将用户编写的消息显示为 HTML。如果用户碰巧编写了类似以下内容的代码:

<script>alert('lololo')</script>

这将非常烦人,因为该脚本将被执行?。所以,永远记住要转义来自不可信来源的内容。

消息订阅

最后但并非最不重要的一点,我想在这里订阅消息流。

const unsubscribe = subscribeToMessages(onMessageArrive)
page.addEventListener('disconnect', unsubscribe)

homePage() 函数中添加这一行。

function subscribeToMessages(cb) {
    return http.subscribe('/api/messages', cb)
}

函数 subscribe() 返回一个函数,该函数一旦调用就会关闭底层连接。这就是为什么我把它传递给 “断开连接” disconnect 事件的原因;因此,当用户离开页面时,事件流将被关闭。

async function onMessageArrive(message) {
    const conversationLI = document.querySelector(`li[data-id="${message.conversationID}"]`)
    if (conversationLI !== null) {
        conversationLI.classList.add('has-unread-messages')
        conversationLI.querySelector('a > div > p').textContent = message.content
        conversationLI.querySelector('a > div > time').textContent = new Date(message.createdAt).toLocaleString()
        return
    }

    let conversation
    try {
        conversation = await getConversation(message.conversationID)
        conversation.lastMessage = message
    } catch (err) {
        console.error(err)
        return
    }

    const conversationsOList = document.getElementById('conversations')
    if (conversationsOList === null) {
        return
    }

    conversationsOList.insertAdjacentElement('afterbegin', renderConversation(conversation))
}

function getConversation(id) {
    return http.get('/api/conversations/' + id)
}

每次有新消息到达时,我们都会在 DOM 中查询会话条目。如果找到,我们会将 has-unread-messages 类添加到该条目中,并更新视图。如果未找到,则表示该消息来自刚刚创建的新对话。我们去做一个对 /api/conversations/{conversationID} 的 GET 请求,以获取在其中创建消息的对话,并将其放在对话列表的前面。


以上这些涵盖了主页的所有内容 ?。 在下一篇文章中,我们将对 conversation 页面进行编码。


via: https://nicolasparada.netlify.com/posts/go-messenger-home-page/

作者:Nicolás Parada 选题:lujun9972 译者:gxlct008 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

你刚刚全新安装了 Manjaro Linux,那么现在该做什么呢?

下面是我推荐你在安装后进行的一些必不可少的步骤。

不过说实话,这些都是我在安装 Manjaro 后喜欢做的事,根据你的需求,步骤可能会有所不同。

推荐在安装完 Manjaro Linux 后去做的事

我使用的是 Xfce 版的 Manjaro,但这些步骤也适用于 Manjaro 的其它桌面环境版本。

1、设置最快的镜像

在更新系统之前,我建议先整理一下镜像列表。在刷新 Manjaro 系统和从软件仓库下载软件包的时候,优化后的镜像列表会对系统的性能产生明显的影响。

打开终端模拟器并输入以下命令:

sudo pacman-mirrors --fasttrack

2、更新系统

保持系统更新可以降低安全漏洞的发生机率,在安装新的软件之前也建议刷新一下系统的软件仓库。

你可以用下面的命令来更新 Manjaro 系统

sudo pacman -Syu

3、启用 AUR、Snap 以及 Flatpak 支持

Arch 用户仓库 Arch User Repository (AUR)是用户选择基于 Arch Linux 的系统的一个主要理由。你可以在 AUR 中访问到大量的附加软件。

(LCTT 译注:AUR 中的 PKGBUILD 均为用户上传且未经审核,使用者需要自负责任,在构建软件包前请注意检查其中内容是否合理。)

作为可选项,你可以直接在 Pacman 图形化软件包管理器中启用对 Snap 以及 Flatpak 的支持。

启用 TRIM(仅 SSD)

如果你的根分区已经安装在了 SSD 上,启用 TRIM) 会是你在安装 Manjaro 后需要做的一件事。TRIM 会帮助清理 SSD 中的块,从而延长 SSD 的使用寿命。

要在 Manjaro 中启用 TRIM,请在终端中输入以下命令:

sudo systemctl enable fstrim.timer

5、安装内核(高级用户)

我在 Manjaro 评测中提到的一个话题就是,你可以在图形界面中轻易地更换内核。

喜欢使用命令行?你也可以在终端中列出系统中已安装的内核以及安装新的内核。

列出已安装的内核:

mhwd-kernel -li

安装新内核(以最新的 5.8 版本内核为例):

sudo mhwd-kernel -i linux58

6、安装微软 TrueType 字体(如果需要)

我经常在个人电脑上编辑工作文件,因此我需要 Times New Roman 或 Arial 等微软字体。

如果你也需要使用微软字体,可以从 AUR 中取得这个软件包。如果你想要在命令行中管理 AUR 软件包,可以选择安装一个 AUR 助手

结论

如果你想在一个预配置、为桌面优化的发行版上享受 Arch Linux 的优点,Manjaro 是一个很好的发行版。虽然它预置了很多东西,但由于每个人设置和需求的不同,有几个步骤是不能提前完成的。

除开已经提到的步骤,还有哪一步对你来说是必不可少的?请在下面的评论中告诉我们。


via: https://itsfoss.com/things-to-do-after-installing-manjaro/

作者:Dimitrios Savvopoulos 选题:lujun9972 译者:rakino 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

演示文稿往往是枯燥的。这就是为什么有些人会添加动画或漫画/meme 来增加一些幽默和风格来打破单调。

如果你需要在你的大学或公司的演示文稿中加入一些独特的风格,那么使用 Linux 终端怎么样?想象一下,这将是多么酷的事情啊!

Present:Linux 终端中进行演示

在终端中可以做很多有趣好玩的事情。制作和展示幻灯片只是其中之一。

这个基于 Python 的应用名为 Present,它可以让你创建基于 Markdown 和 YML 的幻灯片,你可以在你的大学或公司里演讲,并以真正的极客风格取悦人们。

我制作了一个视频,展示了在 Linux 终端中用 Present 演示一些东西的样子。

Present 的功能

你可以用 Present 做以下事情:

  • 使用 Markdown 语法在幻灯片中添加文本
  • 用箭头或 PgUp/Down 键控制幻灯片
  • 改变前景和背景颜色
  • 在幻灯片中添加图像
  • 增加代码块
  • 播放模拟代码,并用 codio YML 文件输出

在 Linux 上安装 Present

Present 是一个基于 Python 的工具,你可以使用 PIP 来安装它。你应该确保用这个命令在 Ubuntu 上安装 Pip

sudo apt install python3-pip

如果你使用的是其他发行版,请检查你的包管理器来安装 PIP3。

安装 PIP 后,你就可以以这种方式全局安装 Present:

sudo pip3 install present

你也可以只为当前用户安装,但你也必须将 ~/.local/bin 添加到你的 PATH 环境变量。

在 Linux 终端中使用 Present 来创建和展示幻灯片

由于 Present 使用了 Markdown 语法,你应该用它来创建自己的幻灯片。在这里使用 Markdown 编辑器会有帮助。

Present 需要一个 Markdown 文件来读取和播放幻灯片。你可以下载这个示例幻灯片,但你需要单独下载嵌入的图像,并将它放在图像文件夹内。

  • 在 Markdown 文件中使用 来分隔幻灯片。
  • 使用 Markdown 语法在幻灯片中添加文本。
  • 使用以下语法添加图片 ![RC] (images/name.png)
  • 通过添加像 <!– fg=white bg=red –> 这样的语法来改变幻灯片的颜色。
  • 使用像 <!– effect=fireworks –> 这样的语法来添加带有效果的幻灯片。
  • 使用 codio 语法 添加代码运行模拟。
  • 使用 q 退出演示,并用左/右箭头或 PgUp/Down 键控制幻灯片。

请记住,在演示时调整终端窗口的大小会把东西搞乱,按回车键也是如此。

总结

如果你熟悉 Markdown 和终端,使用 Present 对你来说并不困难。

你不能把它和常规的用 Impress、MS Office 等制作的幻灯片相比,但偶尔使用,它是一个很酷的工具。如果你是计算机科学/网络专业的学生,或者是开发人员或系统管理员,你的同事一定会觉得很有趣。


via: https://itsfoss.com/presentation-linux-terminal/

作者:Abhishek Prakash 选题:lujun9972 译者:geekpi 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

Jack Wallen 认为,Microsoft Linux 是 Microsoft 桌面操作系统的下一个演进方向。他解释了为什么这将是一个对 Microsoft、IT 专业人士、用户和 Linux 社区的双赢。

我尊敬的同事 Steven J. Vaughan-Nichols 在姊妹网站 ZDNet 上发表了一篇出色的文章,名为《基于 Linux 的 Windows 非常有意义》,他在文中讨论了 Eric S. Raymond 的观点,即我们正接近桌面战争的最后阶段。Vaughan-Nichols 猜测,下一个合乎逻辑的步骤是在 Linux 内核上运行的 Windows 界面。

这是有道理的,尤其是考虑到微软在 Windows 的 Linux 子系统(WSL) 上的努力。然而,从我过去几年所目睹的一切来看,我认为可以得出一个对微软更有意义的结论。

Microsoft Linux: 为什么它是最好的解决方案

一度,微软的最大摇钱树是软件,确切地说是 Windows 和 Microsoft Office。但是,就像科技行业中的所有事物一样,进化也在发生,而拒绝进化的科技公司失败了。

微软明白这一点,并且它已经进化了。一个恰当的例子是:Microsoft Azure。微软的云计算服务,以及 AWSGoogle Cloud 已经成为这个不断变化的行业的巨大推动力。Azure 已成为微软新世界的摇钱树 —— 多到以至于这家在桌面电脑市场上享有垄断地位的公司已经开始意识到,或许还有更好的方式来利用桌面计算机。

这种优势很容易通过 Linux 来实现,但不是你可能想到的 Linux。Vaughan-Nichols 所建议的 Microsoft Linux 对于微软来说可能是一个很好的垫脚石,但我相信该公司需要做出一个更大的飞跃。我说的是登月规模的飞跃 —— 这将使所有参与者的生活变得更加轻松。

我说的是深入 Linux 领域。忘掉在 Linux 内核上运行 Windows 10 界面的桌面版本吧,最后承认 Microsoft Linux 可能是当今世界的最佳解决方案。

微软发布一个完整的 Linux 发行版将对所有参与者来说意味着更少的挫败感。微软可以将其在 Windows 10 桌面系统上的开发工作转移到一个更稳定、更可靠、更灵活、更经考验的桌面系统上来。微软可以从任意数量的桌面系统中选择自己的官方风格:GNOME、KDE、Pantheon、Xfce、Mint、Cinnamon... 不胜枚举。微软可以按原样使用桌面,也可以为它们做出贡献,创造一些更符合用户习惯的东西。

开发:微软并没有摆脱困境

这并不意味着微软在开发方面将摆脱困境。微软也希望对 Wine 做出重大贡献,以确保其所有产品均可在兼容层上顺畅运行,并且默认集成到操作系统中,这样最终用户就不必为安装 Windows 应用程序做任何额外的工作。

Windows 用户需要 Defender

微软开发团队也希望将 Windows Defender 移植到这个新的发行版中。等一等。什么?我真的是在暗示 Microsoft Linux 需要 Windows Defender 吗?是的,我确定。为什么?

最终用户仍然需要防范 网络钓鱼 诈骗 phishing scams 、恶意 URL 和其他类型的攻击。普通的 Windows 用户可能不会意识到,Linux 和安全使用实践的结合远比 Windows 10 和 Windows Defender 要安全得多。所以,是的,将 Windows Defender 移植到 Microsoft Linux 将是保持用户基础舒适的一个很好的步骤。

这些用户将很快了解在台式计算机上工作的感觉,而不必处理 Windows 操作系统带来的日常困扰。更新更流畅、更值得信赖、更安全,桌面更有意义。

微软、用户和 IT 专业人士的双赢

微软一直在尽其所能将用户从标准的基于客户端的软件迁移到云和其他托管解决方案,并且其软件摇钱树已经变成了以网络为中心和基于订阅的软件。所有这些 Linux 用户仍然可以使用 Microsoft 365 和它必须提供的任何其他 软件即服务 Software as a Service (SaaS)解决方案——所有这些都来自于 Linux 操作系统的舒适性和安全性。

这对微软和消费者而言是双赢的,因为这样 Windows 没有那么多令人头疼的事情要处理(通过捕获漏洞和对其专有解决方案进行安全补丁),消费者可以得到一个更可靠的解决方案而不会错过任何东西。 如果微软打对了牌,他们可以对 KDE 或几乎任何 Linux 桌面环境重新设置主题,使其与 Windows 10 界面没有太大区别。

如果布局得当,消费者甚至可能都不知道其中的区别——“Windows 11” 将仅仅是 Microsoft 桌面操作系统的下一个演进版本。

说到胜利,IT 专业人员将花费更少的时间来处理病毒、恶意软件和操作系统问题,而把更多的时间用于保持网络(以及为该网络供动力的服务器)的运行和安全上。

大卖场怎么办?

这是个关键的地方。为了让这一做法真正发挥作用,微软将不得不完全放弃 Windows,转而使用自己风格的 Linux。基于同样的思路,微软需要确保大卖场里的 PC 都安装了 Microsoft Linux 系统。没有半途而废的余地——微软必须全力以赴,以确保这次转型的成功。

一旦大卖场开始销售安装了 Microsoft Linux 的 PC 和笔记本电脑,我预测这一举措对所有相关人员来说将会是一个巨大的成功。微软会被视为终于推出了一款值得消费者信赖的操作系统;消费者将拥有一个这样的桌面操作系统,它不会带来太多令人头疼的事情,而会带来真正的生产力和乐趣;Linux 社区最终将主导桌面计算机。

Microsoft Linux:时机已到

你可能会认为这个想法很疯狂,但如果你真的仔细想想,微软 Windows 的演进就是朝着这个方向发展的。为什么不绕过这个时间线的中途部分,而直接跳到一个为所有参与者带来成功的终极游戏呢? Microsoft Linux 正当其时。


via: https://www.techrepublic.com/article/could-microsoft-be-en-route-to-dumping-windows-in-favor-of-linux/

作者:jack-wallen 选题:wxy 译者:gxlct008 校对:wxy

本文由 LCTT 原创编译,Linux中国 荣誉推出

代码英雄讲述了开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。

什么是《代码英雄》

代码英雄 Command Line Heroes 是世界领先的企业开源软件解决方案供应商红帽(Red Hat)精心制作的原创音频播客,讲述开发人员、程序员、黑客、极客和开源反叛者如何彻底改变技术前景的真实史诗。该音频博客邀请到了谷歌、NASA 等重量级企业的众多技术大牛共同讲述开源、操作系统、容器、DevOps、混合云等发展过程中的动人故事。

本文是《代码英雄》系列播客第二季(7):无服务器音频脚本。

导语: 无服务器Serverless到底意味着什么?当然,总得有服务器存在 —— 构建网络的基本架构不会改变。不过在将服务器交给一小部分人运维之后,开发者们会发生什么变化呢?

无服务器编程让初学者们可以更加轻松简单地部署自己的应用程序,让工作更有效率,这是它的优点。Andrea Passwater 跟我们分享了抽象底层架构会给我们带来多大的便利。不过凡事必有代价,无服务器化也有很多问题。Rodric Rabbah 解释了无服务器意味着你将部署和回应问题的能力拱手献出 —— 这就是为什么他帮助创建了 Apache OpenWhisk,这是一个开源的无服务环境框架,同时 Himanshu Pant 也来分享了他对于何时应该使用无服务器服务的观点。

无服务器编程应该是为开发者们 赋能授权 empowerment 的。我们也应该对于全局场景保持关注 —— 尽管我们精简了我们的工具箱。

00:00:03 - Al Gore 档案

现如今,当然了,在全美乃至全世界,互联网正在彻头彻尾地改变着我们的生活。

00:00:13 - Saron Yitbarek

那是 1998 年。 Google 才刚刚雇佣了它的第一名员工,副总统 Al Gore 在接受媒体采访。

00:00:22 - Al Gore 档案

这项技术还处于起步阶段。当我和 比尔·克林顿 Bill Clinton 总统入主白宫时,只有 50 个网站。现在看看,我在生日那天收到了一束虚拟鲜花。

00:00:37 - Saron Yitbarek

好的。我已经感觉到你的眉毛皱起了。为什么我要向你展现某些 20 年前的互联网史?这是因为我想要提醒你,互联网的基础仍然是相同的。

00:00:51

当然,现在有不止 50 个站点了,我知道。但是,我们仍然在发送虚拟鲜花。从开发人员的角度来看,如果你将我们所有的惊人进步剥离开来,你得到的仍然是相同的“ 客户端 - 服务器 client-server ”(C/S)模型,这就是一切的开始。一个提供了分布式网络的客户端 - 服务器模型。

00:01:16

如今,开发人员谈论了很多有关 无服务器 Serverless 的问题,这听起来像是 Al Gore 谈到的客户端 - 服务器模型被废弃了。而且,如果我们不小心,我们能够抽象出太多的基础架构,以至于忘记了仍然有服务器在那里做着它们的工作。

00:01:37

但是,无服务器真的意味着没有服务器吗?真的吗?还是开发人员与服务器之间的关系正在变化?在这一集中,我们将与来自世界各地的人们交谈,以探索这种被称为“ 无服务器 serverless ”的东西。

00:01:54

我是 Saron Yitbarek,这里是《代码英雄》,一档来自红帽的原创播客节目。

00:02:03 - Andrea Passwater

你知道无线网络在某些地方还有线缆吗?

00:02:06 - Saron Yitbarek

Andrea Passwater 在一家名为 …… 嗯…… “无服务器” 的公司工作。他们创建了一款流行的开源框架来开发无服务器应用程序。Andrea 注意到了各个组织是多么渴望抽象化基础架构的方法,而这正是神奇的“无服务器”一词始终给予人希望的地方。

00:02:28 - Andrea Passwater

我认为这一术语主要是为了传达这样一个事实,即如果你是从事无服务器应用方面工作的开发人员,你不必考虑那些服务器。你只需要写代码并将代码部署到云提供商即可,而不必担心管理。这就是无服务器的真正含义。

00:02:49 - Saron Yitbarek

对于 Andrea 来说,无服务器的吸引力很明显。

00:02:53 - Andrea Passwater

倘若你以无服务器的方式开发应用程序,则可以不必去考虑部署和维护该应用程序的日常工作。这意味着你可以专注于它的商业价值,你可以专注于发挥创造力。

00:03:12 - Saron Yitbarek

而无服务器的另一大好处是,你不太可能发现自己在重复造轮子。

00:03:18 - Andrea Passwater

当有像 Auth0 这样可以直接使用的服务存在时,为什么要创建自己的身份验证方法呢?归根结底,无服务器就是为开发人员提供机会,使得他们能够更加轻松快速地构建起能把他们脑子里的所有的主意带到世界上的程序。

00:03:41 - Saron Yitbarek

我明白了!

00:02:27

想象一下,你拿了满手的东西,正跌跌撞撞地走向一扇门。这扇门滑开了,以简单、友好……

00:03:50

(让我来说)

00:03:51

……的方式。这就是无服务器。它为你打开了大门,使得开发工作不再那么繁琐。事实上,随着各个组织趋向于混合云环境,以及无服务器运动的发展,开发的障碍正在消失。

00:04:09

Andrea 听说过很多有关非开发人员进行开发的话题。

00:04:15 - Andrea Passwater

这是传统上认为自己写不了代码,而现如今由于无服务器而得以投身于软件工程的人的故事,并且能够开发这些使得他们自己的工作流程和类似的东西自动化的工具。这与你你做什么工作都没关系。

00:04:31

你在工作中要做的一些事情是如此的呆板无聊,比如你每天都在做的例行事情,和那些你会想“难道计算机不能为我做这件事吗?”的事情。我开始有了这种感觉的时候,我碰巧在一家名为“无服务器”的公司工作,他们像这样:“你意识到我们制作的产品可以为你提供帮助,对吗?”

00:04:50 - Saron Yitbarek

Andrea 认为,不久之后,许多从未将自己视为开发人员的人将意识到他们能够自己构建简单的应用程序,基本上免费。

00:05:02 - Andrea Passwater

借助 Lambda,我从不需要为自己制作的任何小型应用程序付费。我可以让这些机器人为我做一部分工作,是的,我可以提高工作效率。但是,我也不必再做这些无聊的工作了。我可以做些更有趣的事情。

00:05:17 - Saron Yitbarek

即使是对于专业开发人员来说,这种自动门效果在满手杂物的世界里也是很诱人的。

00:05:25 - Andrea Passwater

我认为人们对于能够让一两个人的团队,在短时间内就让原型工作起来很感兴趣。在几天时间内,他们就可以启动并运行原型。我认为这使得人们开始意识到,他们可以专注于驱动他们的应用、产品和公司中的商业价值的部分。这非常让人兴奋,他们可以专注于商业价值。

00:05:54 - Saron Yitbarek

我要再抛出一个术语给你。准备好了吗? 功能即服务 Functions-as-a-service (FaaS)。就像是 AWS Lambda 或 Apache OpenWhisk 之类的无服务器产品。“功能即服务”意味着,只有在被触发时程序才会执行某个功能,这效率更高。

00:06:15

此外,这让我对计算能力和运行时间的担心少了很多。最终,无服务器可能会成为一个相当不错的基础配置。事实上,有些人甚至开始怀疑,我们是否要完全使用无服务器?它可以替代容器吗?

00:06:34 - Michael Hausenblas

我理解这这种想法。

00:06:35 - Saron Yitbarek

Michael Hausenblas 是 Red Hat OpenShift 团队的开发倡导者。

00:06:41 - Michael Hausenblas

如果你看一下我们现在拥有的这些东西,包括 OpenShift 和 Cloud Foundry 和一些其他东西,你实质上就拥有了抽象化。基本上,Heroku 或多或少地倾向于向这个想法。对吗?这是非常简单的方式,无需担心程序会如何运行,无需担心它是什么样的。只需要给我们代码,我们来处理剩下的工作。

00:07:03 - Saron Yitbarek

是的。听起来相当不错。这听起来有点儿像是梦想中的“ 无运维 no-ops ”环境,一切都自动化并且抽象化了,就像是开发者版本的极简主义室内设计。很棒、很干净的界面。

00:07:21

但是, Michael 想要让你了解你一些现实情况。

00:07:25 - Michael Hausenblas

没有运维!是吗?你知道,它只是神奇地以某种方式消失。你可以在 HackerNews 和 Twitter 以及其他任何地方看到这些笑话。无服务器?当然有服务器!我知道,当然有。而且也肯定有运维。

00:07:39

总得有人去做这些,总得有人去架设服务器、给操作系统打补丁、去创建容器镜像,因为,你猜猜这些功能会在哪里执行?当然是在某种计算机上。

00:07:54 - Saron Yitbarek

这不是零和博弈。功能即服务无法直接取代容器,而是在工具箱中增加了一个工具。我还有更多的事情要告诉你。通过使用这种新工具,转变成无服务器并不只是意味着运维就是其他人的事情,你仍然需要自己考虑自己的运维。

00:08:14 - Michael Hausenblas

你会看到在基础架构侧有一点运维工作。但是,也有一点是开发人员的事情。如果你处在一个极端情况之下,比如说使用 Lambda,那么你是没有任何任何类型的管理员权限的,对吧?

00:08:29

你不能简单地致电或是短信给一名基础架构管理员。显然,你组织之中的某一个人就必须得做这件事。但是,我担心许多组织只看到了它是如此简单而便宜。我们无需动这个,还有这个、这个,然后忘记了谁在待命,谁是真正地在待命?你对此有什么策略吗?

00:08:52

如果没有的话,那么你可能会想要在进行之前,先制定一个策略。

00:09:00 - Saron Yitbarek

需要有人处于待命状态。即使选择了“无服务器”,你仍然需要在头脑中萦绕更大的场景,你仍然需要让你的运维有序进行。

00:09:24

在我早先时候抛出那个“功能即服务”术语时,你是不是有过些许畏缩?过去,基于云的开发为我们带来了大量的 “xx 即服务”的术语。我们有基础架构即服务(IaaS)、平台即服务(PaaS)、软件即服务(SaaS)、数据即服务(DaaS)、数据库即服务(DBaaS) …… 等等。

00:09:48

如果你难以理解它们的不同,那你并不孤单。这就是我们找来了 Himanshu Pant 的原因。他是位于印度德里的苏格兰皇家银行的技术主管。他花了多年时间来分析其中的差异。

00:10:04 - Himanshu Pant

这些其他的计算范例在名称上和无服务器听起来是如此的相似,以至于人们往往会忘记,或者困惑于为什么没有将它们称之为无服务器,或者为什么这个被称为无服务器。

00:10:20 - Saron Yitbarek

因此,无服务器与容器不同,无服务器也不是平台即服务。但是 Himanshu 希望将其明确一下。功能即服务能够提供什么?又不能提供什么?

00:10:35

他与我们分享了两件轶事,有两次他弄清楚了什么时候该使用无服务器,什么时候应该放弃。第一次来自一个 24 小时黑客马拉松。 Himanshu 当时正试图开发一个聊天机器人。

00:10:49 - Himanshu Pant

有各种各样的指标会影响它的选择。例如逻辑覆盖率、可能产生的成本以及可伸缩性。而我选择在无服务器环境下完成这项工作。

00:11:04

当我在开发它的时候,我意识到成本是一个层面,而这确实是我所青睐的技能。因此,即使其他所有的参与者都有更好的……我想说的是,覆盖率,或者说是逻辑覆盖率。这里讲的是 NLP 语境或其场景。

00:11:19

但是,就成本和可伸缩性而言,我是手操胜券的,因为借助无服务器,这完全取决于人们在该聊天机器人上所进行调用的次数,并相应的触发该功能。这是一个我十分乐意采用无服务器的用例,因为成本 —— 没有成本。以及更快的开发时间,而且老实说,当时还并不完全是生产规模级别的工作负载。

00:11:45

我可以使用平台上的某些新兴工具。这对我而言是一次胜利。

00:11:52 - Saron Yitbarek

很好。那时无服务器才有了意义。但是,在 Himanshu 目前供职的银行里,人们正在将他们的系统从旧版迁移到云端。而这提出了不同的目标。

00:12:07 - Himanshu Pant

我们正在尝试查看哪些工作负载适用于哪些范例。比如 IaaS、BaaS、FaaS,这显然是属于企业领域的。你要看到这些方面,比如说第一,可靠的供应商难以寻找,以及第二,该技术应该得到广泛的验证。这对于像是银行业这样的规避风险的行业而言更是如此。

00:12:30

这就是平台即服务(PaaS),但是仍然需要更好的证明、更好的功能,以及它们比传统工具更优越的地方。

00:12:40 - Saron Yitbarek

Himanshu 正在研究自己的需求以及他自己的舒适区,并且研究哪些工作负载在哪种云计算规范中是有意义的。

00:12:49 - Himanshu Pant

假设某个听众在一家贸易商店工作,他想构建某种东西,比如说一个入口。对于他或者她来说,无服务器可能并不是真正合适的选择,因为在那种在特定机器的应用程序中,延迟可能是不该出现的。

00:13:05 - Saron Yitbarek

归根结底,这是一种有节制的做法,而不是将所有东西都丢进一个桶里。当我们思索哪一种基于云的架构是真正我们所想要做的工作时,还有一件事情需要考虑。所有这些抽象的东西,所有解放你双手的东西,最终如何改变的不仅仅是我们的工作方式,还改变了完成工作本身。

00:13:31

抽象掉一部分工作负载可能意味着更少的自定义选项。想象一下你购买的一辆车。它能工作,它能开。但是接着想象一下你自己组装的一辆车,这辆车会按照你决定的方式工作。

00:13:48 - Rania Khalaf

这是有代价的。

00:13:50 - Saron Yitbarek

Rania Khalaf 是 IBM 研究部门的 AI 工程总监。

00:13:56 - Rania Khalaf

在使用这些无服务器应用程序的过程中,你可能无法完全控制所有正在发生的事情。你无法控制全盘计划,或是程序何时何地运行。

00:14:06 - Saron Yitbarek

这是一种权衡,对吗?当你使用无服务器时,细粒度控制可能会失误。

00:14:13 - Rania Khalaf

它对于终端用户而言,抽象化了如此之多的东西,以至于你想要拥有更多的控制权、不同的规划、更多的检查与平衡、功能可以运行多长时间的不同值,等等等等。那么,如果你真的希望能够进入系统并修补,也许你可以创建你自己的部署环境。

00:14:32 - Saron Yitbarek

不过,这将需要一些新东西,一类新的无服务器环境,开源社区已经在为自己打造了它。Rania 和她的 IBM 团队参与了该运动。

00:14:44 - Rania Khalaf

我们首先研究是一种语言……它基本上是 JavaScript 的扩展,可以让你创建这些多线程交互服务的组合,以此作为起点,为你提供一种更加轻量级服务的方式。大约在同一时间,云和微服务以及平台即服务开始真正兴起。

00:15:08

仅仅是将这两种趋势结合起来,就可以用可能来自于你,也可能来自其他人的许多小部件,构建更加高阶的功能。

00:15:18 - Saron Yitbarek

Rania 和她的团队正在构建 Apache OpenWhisk,一款开源的功能平台。

00:15:23 - Rania Khalaf

对于 OpenWhisk,我们从一开始就开源了。其中很大的原因是,为了让社区和我们一起参与进来。但是同时也是为了揭掉外包装,将控制权交给想要运行自己的无服务器计算环境的人们,以便他们能够根据自己的需求对其进行自定义,也许将它们置身于自己的控制之中,看看它实际上是如何运行的,以对其进行更好的控制。

00:15:54

而且,我们还可以提供更加精细的控制,如果仅仅是普通服务,人们就不会有这种控制。

00:16:03 - Saron Yitbarek

将控制权交还给想要运行自己的无服务器运行环境的人。这是下一阶段的无服务器。加入 OpenWhisk,你将获得像是 Fission 和 Gestalt 之类的其它开源平台。我们开始看到无服务器领域正在演变得比原先更具适应性,而且功能更为强大。

00:16:31

为了真正了解为什么开源版的无服务器很重要,我与 OpenWhisk 的创始人之一进行了谈话。

00:16:39

嗨,Rodric。最近好吗?

00:16:40 - Rodric Rabbah

很好。你好吗?谢谢你邀请我参与节目。

00:16:42 - Saron Yitbarek

Rodric Rabbah 是构思并创立 OpenWhisk 的三位开发者之一。以下是我们的谈话。

00:16:54 - Rodric Rabbah

别人可能会很困惑,也可能会窃笑,因为人们可能会想:“倘若没有服务器,你要怎么做计算呢?”

00:17:02 - Saron Yitbarek

是的。服务器就在某处,只是我不必去费心考虑它。

00:17:05 - Rodric Rabbah

完全正确。这就是这个模式的真正美妙之处。当你开始以无服务器的方式进行开发时,你就再也不想回到过去了。你知道的,如今我已经置身其中接近 4 年了,并且已经开发了一些达到生产质量的应用程序。

00:17:19

这是我如今惟一的开发方式。如果你告诉我必须要配置一台计算机并且安装操作系统,这对我而言完完全全是陌生的。我甚至都不确定我是不是还知道该怎么做。

00:17:29 - Saron Yitbarek

是的。当你这样说的时候,听起来像是减轻了很大的负担。你知道吗?当最初听说无服务器时,至少我会想:“伙计,我必须要去学习的事又多了一件。”

00:17:38

但是,当你这样说的时候,听起来不错。

00:17:41 - Rodric Rabbah

这确实听起来很棒。然而,你应该已经意识到你必须要从这幻想的气泡中抽出一点儿空气。它不是万能药。

00:17:50 - Saron Yitbarek

有哪些令人惊讶的风险或问题是人们在起步时可能没有看到或意识到的呢?

00:17:58 - Rodric Rabbah

我认为缺乏透明度可能是最大的问题。这有点儿让我想起了新语言问世时出现的,那些提高了计算机抽象水平的技术。在当今的无服务器环境中,这是一种类似的令人震惊的效果。

00:18:16

在这个过程中,你通常会写一个功能,然后只需部署这个功能即可。它可以立即运行,比如在 web 上作为 APIN 点。它可以大规模伸缩。我的意思是你无需自己做任何工作即可运行数千个实例。

00:18:32

但是,倘若哪里出了问题,那应该如何调试呢?或者我实际上是想要检查我的功能失败的上下文环境。通常,这些功能在进程内运行,与你隔离 —— 你甚至无法登录计算机查看你的代码在何处运行。它们可能在封闭的容器环境之中运行,你不知道里面有什么。

00:18:53

获得一点儿透明度对你而言变得很困难。这是工具最终将提供帮助的地方。但是,工具的缺乏某种程度上会让人们陷入一个相当大的陷阱。

00:19:05 - Saron Yitbarek

这真的很好。那么让我们回到 OpenWhisk。请给我说说关于它的事情。

00:19:11 - Rodric Rabbah

该项目在 Amazon Lambda 宣布推出产品的那一刻就开始了,这实际上是无服务器开始成为术语,并且开始在该领域获得关注的时刻。当我们看到 Lambda 时,我们开始思索:“这里有许多技术需要开发。不仅仅是在新的云计算的基础层上,而且在置于其上的编程模型之上,这实际上都使得它更易于被程序员访问。”你知道,由于出自 IBM 研究所,我们拥有相当强大的技术,不只是编程语言设计、编译器专业知识以及运行时的专业知识的技能。

00:19:54

我们的一个小团队,基本上三个人……

00:19:57 - Saron Yitbarek

哇。

00:19:57 - Rodric Rabbah

……聚集在一起,做了最初的开发和原型,最终成为 OpenWhisk,带有命令行工具,这是现如今无服务器实际上的编程接口。编程模型概念,然后是它必须支持的实际架构,本质上,是服务器模型的这个功能,提供了无服务器所支持的所有好处。

00:20:22

请注意,真正的起源是 Amazon Lambda 的出现,并可以说这是一种新的计算模型。

00:20:28 - Saron Yitbarek

那么花了多长时间?或者说是第一个版本什么时候出现的。

00:20:30 - Rodric Rabbah

实际上很快。事实上,当 IBM 宣布……好吧,那时还是 IBM OpenWhisk。从我们第一次提交到现在才一年。

00:20:39 - Saron Yitbarek

哇。我的天哪。

00:20:41 - Rodric Rabbah

这着实令人激动。

00:20:43 - Saron Yitbarek

这确实很令人印象深刻。事实上,当它第一次启动时,它不叫 OpenWhisk,而是 Whisk。对吗?

00:20:49 - Rodric Rabbah

Whisk 是内部名称,没错。我取的这个名字。这个名字背后的意思是迅速而又灵活地行动。

00:21:00 - Saron Yitbarek

很好。

00:21:01 - Rodric Rabbah

你“搅拌”了一个功能,就可以了。你可以将其放入烤箱中烘焙。

00:21:07 - Saron Yitbarek

太好了,因为当我看到它,我肯定想的是鸡蛋。我在想,让我们“ 搅拌 whisk ”一些鸡蛋。

00:21:12 - Rodric Rabbah

对。我们对该名称进行了一些正面和负面的评价。当我们开源一项技术,并将其放到 GitHub 上时,我们会在上面加上 open 前缀,以强调该技术与开源一样开放,可以自由使用、自由下载、自由贡献。

00:21:32 - Saron Yitbarek

是的。

00:21:33 - Rodric Rabbah

我们将其开源的目的,实际上是一定程度上提升可以在当今无服务器平台上执行标准。对我们来说,重要的是要建立一个平台,不仅可以用于生产环境,还可以与全世界共享,而且还可用于学术研究或一般性研究。也许因为出自 IBM 的研究机构,我们有点儿在意这个。

00:22:00

但是,这是有所回报的,我知道一些大学 —— 从 Princeton 到 Cornell —— 在他们的研究中使用 OpenWhisk。我去过 Brown、 Williams College、 MIT、 CMU 等几所大学,并且进行了一些讲座,目的是鼓励学生真正地去研究围绕无服务器以及服务器功能的问题、工具、编程模型,并且使他们对技术感兴趣。

00:22:26

向他们显示,如果他们真的为开源项目做出了贡献,那么有一条路可以让 IBM 的云功能接受它并在生产环境中运行,通常在一周之内。

00:22:34 - Saron Yitbarek

哇。这么快。

00:22:36 - Rodric Rabbah

这让一些人感到惊讶。

00:22:38 - Saron Yitbarek

这是一个非常高效的过程。

00:22:41 - Rodric Rabbah

这确实证明了我们是如何在开源环境下开发许许多多技术的。这不是一个开放核心模式,有些组件有所保留。实际上在 IBM 云之中所运行的就是 Apache OpenWhisk 项目。

00:22:56 - Saron Yitbarek

当你思索无服务器的未来,以及我们所选择的前进道路时,你觉得它们将是不可避免地奔向开源吗?

00:23:08

我认为最近对于开源的价值存在一场激烈的争议,尤其是在云计算领域。

00:23:13 - Saron Yitbarek

是的,没错。

00:23:15 - Rodric Rabbah

如果你在思考为什么人们会转向云计算,或者为什么他们可能会厌恶投身于云计算领域,这就是供应商锁定的问题……丧失透明度。开源在一定程度上缓解这些问题,发挥了重要的作用。然后再看看类似 Kubernetes 的服务,它只是在容器和系统管理方面吞噬了云,就那么的成功!

00:23:41 - Rodric Rabbah

如果你正在做的事情接触到了容器,鉴于它的主导地位,保持闭源与否还值得讨论吗?我倾向于认为开放性是有帮助的,从开发人员的角度来看,这很有吸引力。

00:23:57 - Saron Yitbarek

当你考虑未来的无服务器生态及其工具、项目以及服务时,你看到了什么呢?对你来说,无服务器的未来是什么样的?

00:24:08 - Rodric Rabbah

我认为,你会开始越来越少思考底层技术,而变得越来越多地考虑编程体验以及围绕它的工具:用于调试的、用于部署管理的、用于性能分析的、用于安全性。

00:24:26

我认为,所有这些都非常重要。你如何运行你的功能的底层机制 —— 无论它们是在容器中还是在一些未来的技术下运行,也无论你是将它们运行在一个云上或是多个云上 —— 我认为,它们都不重要。有点儿像是 Kubernetes 在容器以及容器管理方面所做的事情。

00:24:46

类似的还有一层要放在上面,就是服务分层的功能,可以实现那种无服务器概念。然后,它实际上的表现取决于你在其中安放的中间件。你如何赋能授权给开发者,让他们真正利用这款新的云端计算机,以及你要在它周围投入的辛劳,让他们的体验愉快。

00:25:07 - Saron Yitbarek

是的。这种赋能授权看起来怎么样?

00:25:13 - Rodric Rabbah

一言以蔽之,就是高效。这是一种能力,可以只专注于对于我,作为一名开发人员而言有价值的东西,或者如果我在公司工作的话,对于我公司的价值。这样能够更快地规避问题,因为你释放了你的脑细胞,而不用去考虑基础设施和如何伸缩,以及在硬件层面如何保障事物的安全性。

00:25:38

现在,你可以真正地创新,将脑力重新投入到更快的创新中去,从而为你的终端用户带来更多的价值。我想把这一切都归结于更高的效率。

00:25:55 - Saron Yitbarek

Rodric Rabbah 是 OpenWhisk 的一位创始人。还记得我在这一期节目开始的时候所说的吗?互联网所基于的那种老旧的客户端 - 服务器模型并不会消失。改变的是,我是说彻底改变的是我们对服务器的思考方式。

00:26:19

在所谓的无服务器世界之中,希望我们专注于代码本身,而不用担心基础架构。但是,我们所选择的抽象等级,以及如何保持对于未被抽象的工作的控制,才是使得无服务器世界变得真正有趣的地方。

00:26:40

无服务器最终应当是为开发人员赋能授权的。免于打补丁、进行扩展和管理基础设施。但是,与此同时,即使我们抽象化了一些任务,依然必须对整体如何工作保持关注。我们会问,我要放弃的是哪些控制权,而我要收回的又是哪些控制权?

00:27:07

下一集是我们史诗般的第二季的大结局,《代码英雄》将要前往火星。我们将会了解 NASA 的火星探测器如何开始自己的开源革命。并且我们将与 NASA 喷气推进实验室的 CTO 进行交流,了解开源是如何塑造太空探索的未来的。

00:27:39 - Saron Yitbarek

与此同时,如果你想要更加深入地研究无服务器开发的问题,或是在这一季里我们所探索过的任何主题,请访问 redhat.com/commandlineheroes,查看免费资源。当你在那里时,你甚至可以为我们自己的代码英雄游戏作出贡献。

00:28:00 - Saron Yitbarek

我是 Saron Yitbarek。感谢收听,编程不已。

什么是 LCTT SIG 和 LCTT LCRH SIG

LCTT SIG 是 LCTT 特别兴趣小组 Special Interest Group ,LCTT SIG 是针对特定领域、特定内容的翻译小组,翻译组成员将遵循 LCTT 流程和规范,参与翻译,并获得相应的奖励。LCRH SIG 是 LCTT 联合红帽(Red Hat)发起的 SIG,当前专注任务是《代码英雄》系列播客的脚本汉化,已有数十位贡献者加入。敬请每周三、周五期待经过我们精心翻译、校对和发布的译文。

欢迎加入 LCRH SIG 一同参与贡献,并领取红帽(Red Hat)和我们联合颁发的专属贡献者证书。


via: https://www.redhat.com/en/command-line-heroes/season-2/at-your-serverless

作者:Red Hat 选题:bestony 译者:JonnieWayy 校对:acyanbird, wxy

本文由 LCRH 原创编译,Linux中国 荣誉推出