自从 10 天前，我们发起了徽标征集活动，得到了大家的踊跃支持。虽然有相当多朋友表示原来的徽标就挺好，是的修改下就可以，但是也有很多朋友给我们提交了新的徽标设计及其设计理念。以下，我将这些设计展示给大家，大家可以发表意见。当然，也欢迎更多朋友来提交你们的徽标设计。当前已经收到的徽标设计以下是我们当前收到的设计展示及设计理念，我们共收到了 9 位贡献者提交的 12 份设计。以下按名字排序列出：1466587594地址：https://github.com/LCTT/logo/tree/master/1466587594设计者：1466587594设计理念：徽标呈箭头状,代表回车键蓝绿配色,完全照搬样例,外加了一个两者的混合色主体是稍带圆角又显锐利的字母 L 与 C 的结合,要说带有一些含义的话不免有些强行了alim0x地址：https://github.com/LCTT/logo/tree/master/alim0x设计者：alim0x设计理念：扁平化图标，符合当下趋势主体风格延续原有徽标，减轻徽标更换对受众印象认知的影响中间为原徽标风格的 “L”，小圆点增加徽标活泼感外圈为 “C” 抽象而来，代表 “CN”、“Community”配色上绿色作为主题色，同时中环使用浅绿色作为过渡，使徽标更清新且饱满flag-1地址：https://github.com/LCTT/logo/tree/master/flag-1设计者：ullpdq设计理念：一直觉得国旗设计得很美flag-2地址：https://github.com/LCTT/logo/tree/master/flag-2设计者：ullpdq设计理念：国旗方案的变种logo0281地址：https://github.com/LCTT/logo/tree/master/logo0281设计者：liujiacode设计理念：该徽标保留了旧徽标的配色 (绿, 白, 灰) 和一些元素 (如中间的 "L"). 在旧徽标的基础上, 本徽标更强调社区与社区成员之间的联系. Linux 社区如同一张复杂而有序的网络, 紧紧地将成员联系在一起.徽标背景由深灰色方块和浅灰色中国版图构成, 表示 Linux.CN 主要是面向全国的 Linux 技术社区.图中四个角落分别有朝向不同方向的 "C" ("C" 代表 "Community"), 表示参与到社区中的开源爱好者们专业技能不同, 目标也不同.图正中有一个 "L" ("L" 代表 "Linux", 是旧徽标中的关键元素之一), 代表 Linux 社区.四个 "C" 的开口方向都朝向中间的 "L" , 表示开源爱好者们相互交流与合作, 共同构建起整个社区. "C" 与 "L" 通过一张复杂而又有序的网络连接在一起, 表示开源爱好者们之间并不是相互孤立的, 而是通过社区网络稳定而有序地结合在一起."C" 也可以代表 "Component", 表示 Linux 系统是由多个组件构成的. 这些组件之间并不是相互孤立的, 这些组件的协同作用使得 Linux 能够正常运行.图案下方写有社区名称, 即 "Linux.CN".logo0964地址：https://github.com/LCTT/logo/tree/master/logo0964设计者：liujiacode设计理念：徽标背景由深灰色方块和浅灰色中国版图构成, 表示 Linux.CN 主要是面向全国的 Linux 技术社区.图中绿色方框代表 Linux 终端, 终端内有命令提示符 "LC:~$\_". 其中 "LC" 是 "Linux.CN" 的缩写.绿色方框叠加在一起, 表示使用 Linux 的开源爱好者们相互交流与合作, 共同构建起整个社区.图案下方写有社区名称, 即 "Linux.CN".long地址：https://github.com/LCTT/logo/tree/master/long设计者：lujun9972设计理念：巨龙,毛笔,石砚,玉佩,筷子.尽显中国气息.备注：此设计稿规格不符合要求（500x500 的正方形）。RedInLinux地址：https://github.com/LCTT/logo/tree/master/RedInLinux设计者：Marksteinsong设计理念：为表示对“Linux中国的支持”，特地来凑个数。备注：此设计稿规格不符合要求（500x500 的正方形）。tinnx地址：https://github.com/LCTT/logo/tree/master/tinnx设计者：AntonVanke设计理念：主体是LC下面一行Linux.cnWSJ地址：https://github.com/LCTT/logo/tree/master/WSJ设计者：wangshijun-shexian设计理念：尽量保留原logo元素，以维持用户记忆，减少突兀感；保留的元素有①灰黑色背景色调②大写字母L③网址④整体造型；改变的元素有①底部绿色改成更新的苹果绿②绿色范围减小，去掉网址，可与圆形内接等边三角形贴合，增加图形稳定性，给放大主logo元素让出空间③大写字母L放大，去掉隔断，填充网址④L东侧是大写字母C，颜色与底部颜色相同，可以凸显原logo架构，主体形状与L相似，东北部加等腰直角三角形，与L共同组成正方形，该正方形可联想成向东怒吼的雄狮侧面部，寓意Linux中国在中国大地孔武有力，大有作为；新logo可方可圆，黑白阴阳稿也一样简洁醒目，可用于各类应用场合。wxy地址：https://github.com/LCTT/logo/tree/master/wxy设计者：wxy设计理念：本徽标的灵感来自于俄罗斯方块游戏。配色的蓝绿：绿色一直是我们主题色，蓝色比较搭配，当然要是给它赋予专业、自由的寓意也无不可。主体是一个 4x4 的离散格子，其中由两个字母组成，分别“L”和“c”，这是我们的简写。yue-1地址：https://github.com/LCTT/logo/tree/master/yue-1设计者：ullpdq设计理念：这个方案是钺，配色什么的就随意了，回头可以再调整徽标征集活动活动目标：为 Linux 中国设计制作一个新的徽标活动时间：2019 年 9 月 20 日 — 2019 年 10 月 31 日时间节点：2019 年 9 月 20 日 — 2019 年 10 月 20 日：徽标征集及点评2019 年 9 月 21 日 — 2019 年 10 月 30 日：官方评选2019 年 10 月 31 日 评选结果发布参与方式：本活动完全在 GitHub 上进行，因此投稿、点评、建议都采用 GitHub 相应机制来完成。仓库地址： https://github.com/LCTT/logo投稿：通过 GitHub 的 PR 提交你的徽标设计展示图和设计说明。格式要求：每个投稿一个自行命名的文件夹，不当命名我们会予以修改。文件夹内包括：名为 logo.png 的 png 格式的徽标，尺寸为 500px X 500px，评选阶段无需投递原稿一个名为 README.md 的说明文件，说明创意构思点评：对提交徽标的 PR 发表评论建议：通过 GitHub 的 议题 issue 发起最后，既然是征集评选活动，那就该有奖品：一等奖（获选）一名，奖金 3000 元二等奖两名，各奖 500 元三等奖五名，各奖 100 元此外，一等奖作品的作者需同样将该的完整版权授予 Linux 中国，但作品作者的相关信息会在 Linux 中国官方予以记录和致谢。
使用 Python 开展数据科学为你提供了无限的潜力，使你能够以有意义和启发性的方式解析、解释和组织数据。数据科学是计算领域一个令人兴奋的新领域，它围绕分析、可视化和关联以解释我们的计算机收集的有关世界的无限信息而建立。当然，称其为“新”领域有点不诚实，因为该学科是统计学、数据分析和普通而古老的科学观察派生而来的。但是数据科学是这些学科的形式化分支，拥有自己的流程和工具，并且可以广泛应用于以前从未产生过大量不可管理数据的学科（例如视觉效果）。数据科学是一个新的机会，可以重新审视海洋学、气象学、地理学、制图学、生物学、医学和健康以及娱乐行业的数据，并更好地了解其中的模式、影响和因果关系。像其他看似包罗万象的大型领域一样，知道从哪里开始探索数据科学可能会令人生畏。有很多资源可以帮助数据科学家使用自己喜欢的编程语言来实现其目标，其中包括最流行的编程语言之一：Python。使用 Pandas、Matplotlib 和 Seaborn 这些库，你可以学习数据科学的基本工具集。如果你对 Python 的基本用法不是很熟悉，请在继续之前先阅读我的 Python 介绍。创建 Python 虚拟环境程序员有时会忘记在开发计算机上安装了哪些库，这可能导致他们提供了在自己计算机上可以运行，但由于缺少库而无法在所有其它电脑上运行的代码。Python 有一个系统旨在避免这种令人不快的意外：虚拟环境。虚拟环境会故意忽略你已安装的所有 Python 库，从而有效地迫使你一开始使用通常的 Python 进行开发。为了用 venv 激活虚拟环境, 为你的环境取个名字 (我会用 example) 并且用下面的指令创建它:$ python3 -m venv example 导入 source 该环境的 bin 目录里的 activate 文件以激活它：$ source ./example/bin/activate (example) $你现在“位于”你的虚拟环境中。这是一个干净的状态，你可以在其中构建针对该问题的自定义解决方案，但是额外增加了需要有意识地安装依赖库的负担。安装 Pandas 和 NumPy你必须在新环境中首先安装的库是 Pandas 和 NumPy。这些库在数据科学中很常见，因此你肯定要时不时安装它们。它们也不是你在数据科学中唯一需要的库，但是它们是一个好的开始。Pandas 是使用 BSD 许可证的开源库，可轻松处理数据结构以进行分析。它依赖于 NumPy，这是一个提供多维数组、线性代数和傅立叶变换等等的科学库。使用 pip3 安装两者：(example) $ pip3 install pandas安装 Pandas 还会安装 NumPy，因此你无需同时指定两者。一旦将它们安装到虚拟环境中，安装包就会被缓存，这样，当你再次安装它们时，就不必从互联网上下载它们。这些是你现在仅需的库。接下来，你需要一些样本数据。生成样本数据集数据科学都是关于数据的，幸运的是，科学、计算和政府组织可以提供许多免费和开放的数据集。虽然这些数据集是用于教育的重要资源，但它们具有比这个简单示例所需的数据更多的数据。你可以使用 Python 快速创建示例和可管理的数据集：#!/usr/bin/env python3 import random def rgb(): NUMBER=random.randint(0,255)/255 return NUMBER FILE = open('sample.csv','w') FILE.write('"red","green","blue"') for COUNT in range(10): FILE.write('\n{:0.2f},{:0.2f},{:0.2f}'.format(rgb(),rgb(),rgb()))这将生成一个名为 sample.csv 的文件，该文件由随机生成的浮点数组成，这些浮点数在本示例中表示 RGB 值（在视觉效果中通常是数百个跟踪值）。你可以将 CSV 文件用作 Pandas 的数据源。使用 Pandas 提取数据Pandas 的基本功能之一是可以提取数据和处理数据，而无需程序员编写仅用于解析输入的新函数。如果你习惯于自动执行此操作的应用程序，那么这似乎不是很特别，但请想象一下在 LibreOffice 中打开 CSV 并且必须编写公式以在每个逗号处拆分值。Pandas 可以让你免受此类低级操作的影响。以下是一些简单的代码，可用于提取和打印以逗号分隔的值的文件：#!/usr/bin/env python3 from pandas import read_csv, DataFrame import pandas as pd FILE = open('sample.csv','r') DATAFRAME = pd.read_csv(FILE) print(DATAFRAME)一开始的几行导入 Pandas 库的组件。Pandas 库功能丰富，因此在寻找除本文中基本功能以外的功能时，你会经常参考它的文档。接下来，通过打开你创建的 sample.csv 文件创建变量 FILE。Pandas 模块 read_csv（在第二行中导入）使用该变量来创建 数据帧 dataframe 。在 Pandas 中，数据帧是二维数组，通常可以认为是表格。数据放入数据帧中后，你可以按列和行进行操作，查询其范围，然后执行更多操作。目前，示例代码仅将该数据帧输出到终端。运行代码。你的输出会和下面的输出有些许不同，因为这些数字都是随机生成的，但是格式都是一样的。(example) $ python3 ./parse.py red green blue 0 0.31 0.96 0.47 1 0.95 0.17 0.64 2 0.00 0.23 0.59 3 0.22 0.16 0.42 4 0.53 0.52 0.18 5 0.76 0.80 0.28 6 0.68 0.69 0.46 7 0.75 0.52 0.27 8 0.53 0.76 0.96 9 0.01 0.81 0.79假设你只需要数据集中的红色值（red），你可以通过声明数据帧的列名称并有选择地仅打印你感兴趣的列来做到这一点：from pandas import read_csv, DataFrame import pandas as pd FILE = open('sample.csv','r') DATAFRAME = pd.read_csv(FILE) # define columns DATAFRAME.columns = [ 'red','green','blue' ] print(DATAFRAME['red'])现在运行代码，你只会得到红色列：(example) $ python3 ./parse.py 0 0.31 1 0.95 2 0.00 3 0.22 4 0.53 5 0.76 6 0.68 7 0.75 8 0.53 9 0.01 Name: red, dtype: float64处理数据表是经常使用 Pandas 解析数据的好方法。从数据帧中选择数据的方法有很多，你尝试的次数越多就越习惯。可视化你的数据很多人偏爱可视化信息已不是什么秘密，这是图表和图形成为与高层管理人员开会的主要内容的原因，也是“信息图”在新闻界如此流行的原因。数据科学家的工作之一是帮助其他人理解大量数据样本，并且有一些库可以帮助你完成这项任务。将 Pandas 与可视化库结合使用可以对数据进行可视化解释。一个流行的可视化开源库是 Seaborn，它基于开源的 Matplotlib。安装 Seaborn 和 Matplotlib你的 Python 虚拟环境还没有 Seaborn 和 Matplotlib，所以用 pip3 安装它们。安装 Seaborn 的时候，也会安装 Matplotlib 和很多其它的库。(example) $ pip3 install seaborn为了使 Matplotlib 显示图形，你还必须安装 PyGObject 和 Pycairo。这涉及到编译代码，只要你安装了必需的头文件和库，pip3 便可以为你执行此操作。你的 Python 虚拟环境不了解这些依赖库，因此你可以在环境内部或外部执行安装命令。在 Fedora 和 CentOS 上：(example) $ sudo dnf install -y gcc zlib-devel bzip2 bzip2-devel readline-devel \ sqlite sqlite-devel openssl-devel tk-devel git python3-cairo-devel \ cairo-gobject-devel gobject-introspection-devel在 Ubuntu 和 Debian 上：(example) $ sudo apt install -y libgirepository1.0-dev build-essential \ libbz2-dev libreadline-dev libssl-dev zlib1g-dev libsqlite3-dev wget \ curl llvm libncurses5-dev libncursesw5-dev xz-utils tk-dev libcairo2-dev一旦它们安装好了，你可以安装 Matplotlib 需要的 GUI 组件。(example) $ pip3 install PyGObject pycairo用 Seaborn 和 Matplotlib 显示图形在你最喜欢的文本编辑器新建一个叫 vizualize.py 的文件。要创建数据的线形图可视化，首先，你必须导入必要的 Python 模块 —— 先前代码示例中使用的 Pandas 模块：#!/usr/bin/env python3 from pandas import read_csv, DataFrame import pandas as pd接下来，导入 Seaborn、Matplotlib 和 Matplotlib 的几个组件，以便你可以配置生成的图形：import seaborn as sns import matplotlib import matplotlib.pyplot as plt from matplotlib import rcParamsMatplotlib 可以将其输出导出为多种格式，包括 PDF、SVG 和桌面上的 GUI 窗口。对于此示例，将输出发送到桌面很有意义，因此必须将 Matplotlib 后端设置为 GTK3Agg。如果你不使用 Linux，则可能需要使用 TkAgg 后端。设置完 GUI 窗口以后，设置窗口大小和 Seaborn 预设样式：matplotlib.use('GTK3Agg') rcParams['figure.figsize'] = 11,8 sns.set_style('darkgrid')现在，你的显示已配置完毕，代码已经很熟悉了。使用 Pandas 导入 sample.csv 文件，并定义数据帧的列：FILE = open('sample.csv','r') DATAFRAME = pd.read_csv(FILE) DATAFRAME.columns = [ 'red','green','blue' ]有了适当格式的数据，你可以将其绘制在图形中。将每一列用作绘图的输入，然后使用 plt.show() 在 GUI 窗口中绘制图形。plt.legend() 参数将列标题与图形上的每一行关联（loc 参数将图例放置在图表之外而不是在图表上方）：for i in DATAFRAME.columns: DATAFRAME[i].plot() plt.legend(bbox_to_anchor=(1, 1), loc=2, borderaxespad=1) plt.show()运行代码以获得结果。你的图形可以准确显示 CSV 文件中包含的所有信息：值在 Y 轴上，索引号在 X 轴上，并且图形中的线也被标识出来了，以便你知道它们代表什么。然而，由于此代码正在跟踪颜色值（至少是假装），所以线条的颜色不仅不直观，而且违反直觉。如果你永远不需要分析颜色数据，则可能永远不会遇到此问题，但是你一定会遇到类似的问题。在可视化数据时，你必须考虑呈现数据的最佳方法，以防止观看者从你呈现的内容中推断出虚假信息。为了解决此问题（并展示一些可用的自定义设置），以下代码为每条绘制的线分配了特定的颜色：import matplotlib from pandas import read_csv, DataFrame import pandas as pd import seaborn as sns import matplotlib.pyplot as plt from matplotlib import rcParams matplotlib.use('GTK3Agg') rcParams['figure.figsize'] = 11,8 sns.set_style('whitegrid') FILE = open('sample.csv','r') DATAFRAME = pd.read_csv(FILE) DATAFRAME.columns = [ 'red','green','blue' ] plt.plot(DATAFRAME['red'],'r-') plt.plot(DATAFRAME['green'],'g-') plt.plot(DATAFRAME['blue'],'b-') plt.plot(DATAFRAME['red'],'ro') plt.plot(DATAFRAME['green'],'go') plt.plot(DATAFRAME['blue'],'bo') plt.show()这使用特殊的 Matplotlib 表示法为每列创建两个图。每列的初始图分配有一种颜色（红色为 r，绿色为 g，蓝色为 b）。这些是内置的 Matplotlib 设置。 - 表示实线（双破折号，例如 r--，将创建虚线）。为每个具有相同颜色的列创建第二个图，但是使用 o 表示点或节点。为了演示内置的 Seaborn 主题，请将 sns.set_style 的值更改为 whitegrid。停用你的虚拟环境探索完 Pandas 和绘图后，可以使用 deactivate 命令停用 Python 虚拟环境：(example) $ deactivate $当你想重新使用它时，只需像在本文开始时一样重新激活它即可。重新激活虚拟环境时，你必须重新安装模块，但是它们是从缓存安装的，而不是从互联网下载的，因此你不必联网。无尽的可能性Pandas、Matplotlib、Seaborn 和数据科学的真正力量是无穷的潜力，使你能够以有意义和启发性的方式解析、解释和组织数据。下一步是使用你在本文中学到的新工具探索简单的数据集。Matplotlib 和 Seaborn 不仅有折线图，还有很多其他功能，因此，请尝试创建条形图或饼图或完全不一样的东西。一旦你了解了你的工具集并对如何关联数据有了一些想法，则可能性是无限的。数据科学是寻找隐藏在数据中的故事的新方法。让开源成为你的媒介。via: https://opensource.com/article/19/9/get-started-data-science-python作者：Seth Kenlon 选题：lujun9972 译者：GraveAccent 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
IBM 将区块链引入红帽 OpenShift；为混合云客户添加了Apache CouchDB
IBM 在其区块链平台上增加了红帽 OpenShift 支持，并将用于 Apache CouchDB 的 Kubernetes Operator 引入其混合云服务中。IBM 本周继续推进其红帽和开源集成工作，在其区块链平台上添加了红帽 OpenShift 支持，并在其混合云服务产品之外为 Apache CouchDB 引入了 Kubernetes Operator。在该公司的旗舰级企业 Kubernetes 平台 红帽 OpenShift 上部署 IBM 区块链 的能力，意味着 IBM 区块链的开发人员将能够在本地、公共云或混合云架构中部署安全软件。区块链是一个分布式数据库，维护着一个不断增长的记录列表，可以使用哈希技术对其进行验证，并且 IBM 区块链平台包括用于构建、操作、治理和发展受保护的区块链网络的工具。IBM 表示，其区块链 / OpenShift 组合的目标客户面对的公司客户是：希望保留区块链分类帐副本并在自己的基础设施上运行工作负载以实现安全性，降低风险或合规性；需要将数据存储在特定位置以满足数据驻留要求；需要在多个云或混合云架构中部署区块链组件。自 7 月份完成对红帽的收购以来，IBM 一直在围绕红帽基于 Kubernetes 的 OpenShift 容器平台构建云开发生态系统。最近，这位蓝色巨人将其新 z15 大型机与 IBM 的红帽技术融合在一起，称它将为红帽 OpenShift 容器平台提供 IBM z/OS 云代理。该产品将通过连接到 Kubernetes 容器为用户提供 z/OS 计算资源的直接自助访问。IBM 表示，打算在 IBM z 系列和 LinuxONE 产品上向 Linux 提供 IBM Cloud Pak 产品。Cloud Paks 是由 OpenShift 与 100 多种其他 IBM 软件产品组成的捆绑包。LinuxONE 是 IBM 专为支持 Linux 环境而设计的非常成功的大型机系统。IBM 表示，愿景是使支持 OpenShift 的 IBM 软件成为客户用来转变其组织的基础构建组件。IBM 表示：“我们的大多数客户都需要支持混合云工作负载以及可在任何地方运行这些工作负载的灵活性的解决方案，而用于红帽的 z/OS 云代理将成为我们在平台上启用云原生的关键。”在相关新闻中，IBM 宣布支持开源 Apache CouchDB，这是 Apache CouchDB 的 Kubernetes Operator，并且该 Operator 已通过认证可与红帽 OpenShift 一起使用。Operator 可以自动部署、管理和维护 Apache CouchDB 部署。Apache CouchDB 是非关系型开源 NoSQL 数据库。在最近的 Forrester Wave 报告中，研究人员说：“企业喜欢 NoSQL 这样的能力，可以使用低成本服务器和可以存储、处理和访问任何类型的业务数据的灵活的无模式模型进行横向扩展。NoSQL 平台为企业基础设施专业人士提供了对数据存储和处理的更好控制，并提供了可加速应用程序部署的配置。当许多组织使用 NoSQL 来补充其关系数据库时，一些组织已开始替换它们以支持更好的性能、扩展规模并降低其数据库成本。”当前，IBM 云使用 Cloudant Db 服务作为其针对新的云原生应用程序的标准数据库。IBM 表示，对 CouchDB 的强大支持为用户提供了替代方案和后备选项。IBM 表示，能够将它们全部绑定到红帽 OpenShift Kubernetes 部署中，可以使客户在部署应用程序并在多个云环境中移动数据时使用数据库本地复制功能来维持对数据的低延迟访问。“我们的客户正在转向基于容器化和微服务的架构，以提高速度、敏捷性和运营能力。在云原生应用程序开发中，应用程序需要具有支持可伸缩性、可移植性和弹性的数据层。”IBM 院士兼云数据库副总裁 Adam Kocoloski 写道，“我们相信数据可移植性和 CouchDB 可以大大改善多云架构的功能，使客户能够构建真正可在私有云、公共云和边缘位置之间移植的解决方案。”via: https://www.networkworld.com/article/3441362/ibm-brings-blockchain-to-red-hat-openshift-adds-apache-couchdb-for-hybrid-cloud-customers.html作者：Michael Cooney 选题：lujun9972 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
在本系列的上一指南中，我们讨论了 Hyperledger 项目（HLP），这是一个由 Linux 基金会开发的增长最快的产品。在本指南中，我们将详细讨论什么是“ 以太坊 Ethereum ”及其功能。许多研究人员认为，互联网的未来将基于 去中心化计算 decentralized computing 的原理。实际上，去中心化计算是互联网放在首位的更广泛目标之一。但是，由于可用的计算能力不同，互联网发生了转折。尽管现代服务器功能使得服务器端处理和执行成为可能，但在世界上大部分地区缺乏像样的移动网络使得客户端也是如此。现在，现代智能手机具有 SoC（片上系统），在客户端本身上也能够处理许多此类操作，但是，由于安全地检索和存储数据而受到的限制仍然迫使开发人员需要在服务器端进行计算和数据管理。因此，当前可以观察到数据传输能力方面存在瓶颈。由于分布式数据存储和程序执行平台的进步，所有这些可能很快就会改变。区块链允许在分布式用户网络（而不是中央服务器）上进行安全的数据管理和程序执行，这在互联网历史上基本上是第一次。以太坊就是一个这样的区块链平台，使开发人员可以访问用于在这样的去中心化网络上构建和运行应用程序的框架和工具。尽管它以其加密货币而广为人知，以太坊不只是 以太币 ether （加密货币）。这是一种完整的 图灵完备 Turing complete 编程语言，旨在开发和部署 DApp（即 分布式应用 Distributed APPlication ） 1 。我们会在接下来的一篇文章中详细介绍 DApp。以太坊是开源的，默认情况下是一个公共（非许可）区块链，并具有一个大范围的智能合约平台底层（Solidity）。以太坊提供了一个称为“ 以太坊虚拟机 Ethereum virtual machine （EVM）”的虚拟计算环境，以运行应用程序和智能合约 2 。以太坊虚拟机运行在世界各地的成千上万个参与节点上，这意味着应用程序数据在保证安全的同时，几乎不可能被篡改或丢失。以太坊的背后：什么使之不同在 2017 年，为了推广对以太坊区块链的功能的利用，技术和金融领域的 30 多个团队汇聚一堂。因此，“ 以太坊企业联盟 Ethereum Enterprise Alliance ”（EEA）由众多支持成员组成，包括微软、摩根大通、思科、德勤和埃森哲。摩根大通已经拥有 Quorum，这是一个基于以太坊的去中心化金融服务计算平台，目前已经投入运行；而微软拥有基于以太坊的云服务，通过其 Azure 云业务销售 3 。什么是以太币，它和以太坊有什么关系以太坊的创建者 维塔利克·布特林 Vitalik Buterin 深谙去中心化处理平台的真正价值以及为比特币提供动力的底层区块链技术。他提议比特币应该开发以支持运行分布式应用程序（DApp）和程序（现在称为智能合约）的想法，未能获得多数同意。因此，他在 2013 年发表的白皮书中提出了以太坊的想法。原始白皮书仍然保留，可供读者阅读。其理念是开发一个基于区块链的平台来运行智能合约和应用程序，这些合约和应用程序设计为在节点和用户设备上运行，而非服务器上运行。以太坊系统经常被误认为就是加密货币以太币，但是，必须重申，以太坊是一个用于开发和执行应用程序的全栈平台，自成立以来一直如此，而比特币则不是。以太网目前是按市值计算的第二大加密货币，在撰写本文时，其平均交易价格为每个以太币 170 美元 4 。该平台的功能和技术特性 5 正如我们已经提到的，称为以太币的加密货币只是该平台功能之一。该系统的目的不仅仅是处理金融交易。 实际上，以太坊平台和比特币之间的主要区别在于它们的脚本能力。以太坊是以图灵完备的编程语言开发的，这意味着它具有类似于其他主要编程语言的脚本编程和应用程序功能。开发人员需要此功能才能在平台上创建 DApp 和复杂的智能合约，而该功能是比特币缺失的。以太币的“挖矿”过程更加严格和复杂。尽管可以使用专用的 ASIC 来开采比特币，但以太坊使用的基本哈希算法（EThash）降低了 ASIC 在这方面的优势。为激励矿工和节点运营者运行网络而支付的交易费用本身是使用称为 “ 燃料 Gas ”的计算令牌来计算的。通过要求交易的发起者支付与执行交易所需的计算资源数量成比例的以太币，燃料提高了系统的弹性以及对外部黑客和攻击的抵抗力。这与其他平台（例如比特币）相反，在该平台上，交易费用与交易规模一并衡量。因此，以太坊的平均交易成本从根本上低于比特币。这也意味着在以太坊虚拟机上运行的应用程序需要付费，具体取决于应用程序要解决的计算问题。基本上，执行越复杂，费用就越高。以太坊的出块时间估计约为 10 - 15 秒。出块时间是在区块链网络上打时间戳和创建区块所需的平均时间。与将在比特币网络上进行同样的交易要花费 10 分钟以上的时间相比，很明显，就交易和区块验证而言，以太坊要快得多。有趣的是，对可开采的以太币数量或开采速度没有硬性限制，这导致其系统设计不像比特币那么激进。总结尽管与以太坊相比，它远远超过了类似的平台，但在以太坊企业联盟开始推动之前，该平台本身尚缺乏明确的发展道路。虽然以太坊平台确实推动了企业发展，但必须注意，以太坊还可以满足小型开发商和个人的需求。 这样一来，为最终用户和企业开发的平台就为以太坊遗漏了许多特定功能。另外，以太坊基金会提出和开发的区块链模型是一种公共模型，而 Hyperledger 项目等项目提出的模型是私有的和需要许可的。虽然只有时间才能证明以太坊、Hyperledger 和 R3 Corda 等平台中，哪一个平台会在现实场景中找到最多粉丝，但此类系统确实证明了以区块链为动力的未来主张背后的有效性。Gabriel Nicholas, “Ethereum Is Coding’s New Wild West | WIRED,” Wired , 2017. ↩What is Ethereum? — Ethereum Homestead 0.1 documentation. ↩Ethereum, a Virtual Currency, Enables Transactions That Rival Bitcoin’s – The New York Times. ↩Cryptocurrency Market Capitalizations | CoinMarketCap. ↩Introduction — Ethereum Homestead 0.1 documentation. ↩via: https://www.ostechnix.com/blockchain-2-0-what-is-ethereum/作者：ostechnix 选题：lujun9972 译者：wxy 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
一次编辑便可将文本转换为多种格式。下面是如何开始使用 Markdown。在很长一段时间里，我发现我在 GitLab 和 GitHub 上看到的所有文件都带有 .md 扩展名，这是专门为开发人员编写的文件类型。几周前，当我开始使用 Markdown 时，我的观念发生了变化。它很快成为我日常工作中最重要的工具。Markdown 使我的生活更简易。我只需要在已经编写的代码中添加一些符号，并且在浏览器扩展或开源程序的帮助下，即可将文本转换为各种常用格式，如 ODT、电子邮件（稍后将详细介绍）、PDF 和 EPUB。什么是 Markdown?来自 维基百科的友情提示:Markdown 是一种轻量级标记语言，具有纯文本格式语法。这意味着通过在文本中使用一些额外的符号，Markdown 可以帮助你创建具有特定结构和格式的文档。当你以纯文本（例如，在记事本应用程序中）做笔记时，没有任何东西表明哪个文本应该是粗体或斜体。在普通文本中，你在写链接时需要将一个链接写为 “http://example.com ”，或者写为 “example.com”，又或“访问网站（example.com）”。这样没有内在的一致性。但是如果你按照 Markdown 的方式编写，你的文本就有了内在的一致性。计算机喜欢一致性，因为这使得它们能够遵循严格的指令而不用担心异常。相信我；一旦你学会使用 Markdown，每一项写作任务在某种程度上都会比以前更容易、更好。让我们开始吧。Markdown 基础以下是使用 Markdown 的基础语法。1、创建一个以 .md 扩展名结尾的文本文件（例如，example.md）。你可以使用任何文本编辑器（甚至像 LibreOffice 或 Microsoft word 这样的文字处理程序亦可），只要记住将其保存为文本文件。2、想写什么就写什么，就像往常一样:Lorem ipsum Consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. De Finibus Bonorum et Malorum Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.（LCTT 译注：上述这段“Lorem ipsum”，中文又称“乱数假文”，是一篇常用于排版设计领域的拉丁文文章，主要目的为测试文章或文字在不同字型、版型下看起来的效果。）3、确保在段落之间留有空行。如果你习惯写商务信函或传统散文，这可能会觉得不自然，因为那里段落只有一行，甚至在第一个单词前还有一个缩进。对于 Markdown，空行（一些文字处理程序使用 ¶，称为Pilcrow 符号）保证在创建一个新段落应用另一种格式（如 HTML）。4、指定标题和副标题。对于文档的标题，在文本前面添加一个井号或散列符号（#）和一个空格（例如 # Lorem ipsum）。第一个副标题级别使用两个（## De Finibus Bonorum et Malorum），下一个级别使用三个（### 第三个副标题），以此类推。注意，在井号和第一个单词之间有一个空格。# Lorem ipsum Consectetur adipiscing elit, sed do eiusmod tempor incididunt ut labore et dolore magna aliqua. Ut enim ad minim veniam, quis nostrud exercitation ullamco laboris nisi ut aliquip ex ea commodo consequat. Duis aute irure dolor in reprehenderit in voluptate velit esse cillum dolore eu fugiat nulla pariatur. Excepteur sint occaecat cupidatat non proident, sunt in culpa qui officia deserunt mollit anim id est laborum. ## De Finibus Bonorum et Malorum Sed ut perspiciatis unde omnis iste natus error sit voluptatem accusantium doloremque laudantium, totam rem aperiam, eaque ipsa quae ab illo inventore veritatis et quasi architecto beatae vitae dicta sunt explicabo. Nemo enim ipsam voluptatem quia voluptas sit aspernatur aut odit aut fugit, sed quia consequuntur magni dolores eos qui ratione voluptatem sequi nesciunt. Neque porro quisquam est, qui dolorem ipsum quia dolor sit amet, consectetur, adipisci velit, sed quia non numquam eius modi tempora incidunt ut labore et dolore magnam aliquam quaerat voluptatem.5、如果你想使用粗体字符，只需将字母放在两个星号之间，没有空格：**对应的文本将以粗体显示**。6、对于斜体，将文本放在没有空格的下划线符号之间：_我希望这个本文以斜体显示_。（LCTT 译注：有的 Markdown 流派会将用下划线引起来的字符串视作下划线文本，而单个星号 * 引用起来的才视作斜体。从兼容性的角度看，使用星号比较兼容。）7、要插入一个链接（像 Markdown Tutorial），把你想链接的文本放在括号里，URL 放在括号里，中间没有空格：[Markdown Tutorial](<https://www.markdowntutorial.com/>)。8、块引用是用大于号编写的（>）在你要引用的文本前加上大于符号和空格: > 名言引用。Markdown 教程和技巧这些技巧可以帮助你上手 Markdown ，但它涵盖了很多功能，不仅仅是粗体、斜体和链接。学习 Markdown 的最好方法是使用它，但是我建议你花 15 分钟来学习这篇简单的 Markdown 教程，学以致用，勤加练习。由于现代 Markdown 是对结构化文本概念的许多不同解释的融合，CommonMark 项目定义了一个规范，其中包含一组严格的规则，以使 Markdown 更加清晰。在编辑时手边准备一份符合 CommonMark 的快捷键列表可能会有帮助。你能用 Markdown 做什么Markdown 可以让你写任何你想写的东西，仅需一次编辑，就可以把它转换成几乎任何你想使用的格式。下面的示例演示如何将用 MD 编写简单的文本并转换为不同的格式。你不需要多种格式的文档-你可以仅仅编辑一次…然后拥有无限可能。1、简单的笔记：你可以用 Markdown 编写你的笔记，并且在保存笔记时，开源笔记应用程序 Turtl 将解释你的文本文件并显示为对应的格式。你可以把笔记存储在任何地方!2、PDF 文件：使用 Pandoc 应用程序，你可以使用一个简单的命令将 Markdown 文件转换为 PDF：pandoc <file.md> -o <file.pdf>3、Email：你还可以通过安装浏览器扩展 Markdown Here 将 Markdown 文本转换为 html 格式的电子邮件。要使用它，只需选择你的 Markdown 文本，在这里使用 Markdown 将其转换为 HTML，并使用你喜欢的电子邮件客户端发送消息。现在就开始上手吧你不需要一个特殊的应用程序来使用 Markdown，你只需要一个文本编辑器和上面的技巧。它与你已有的写作方式兼容；你所需要做的就是使用它，所以试试吧。via: https://opensource.com/article/19/9/introduction-markdown作者：Juan Islas 选题：lujun9972 译者：qfzy1233 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
之前就觉得我的 Emacs 启动好慢，查看启动日志会发现启动到一般的时候会有一个比较长时间的卡顿。 之前一直没有理会它，今天花了点时间探索了一下，发现罪魁祸首居然是 exec-path-from-shell 这个包。现将探索的过程记录如下： 由于使用了 spacemacs 的配置，配置上比较复杂，不太想通过实验缩减配置的方式来摸索出问题的地方。刚好最近在学习使用 strace 工具，因此决定使用 strace 来看看 Emacs 到底卡在哪里。strace emacs --fg-daemon 输出的内容特别多，这里只截取卡顿前的部分内容readlinkat(AT_FDCWD, "/home", 0x7ffd1d3abb50, 1024) = -1 EINVAL (无效的参数) readlinkat(AT_FDCWD, "/home/lujun9972", 0x7ffd1d3abf00, 1024) = -1 EINVAL (无效的参数) readlinkat(AT_FDCWD, "/home/lujun9972/.emacs.d", 0x7ffd1d3ac2b0, 1024) = -1 EINVAL (无效的参数) readlinkat(AT_FDCWD, "/home/lujun9972/.emacs.d/elpa", 0x7ffd1d3ac660, 1024) = -1 EINVAL (无效的参数) readlinkat(AT_FDCWD, "/home/lujun9972/.emacs.d/elpa/exec-path-from-shell-20180323.1904", 0x7ffd1d3aca10, 1024) = -1 EINVAL (无效的参数) readlinkat(AT_FDCWD, "/home/lujun9972/.emacs.d/elpa/exec-path-from-shell-20180323.1904/exec-path-from-shell.elc", 0x7ffd1d3acdc0, 1024) = -1 EINVAL (无效的参数) lseek(7, -2655, SEEK_CUR) = 1441 read(7, "\n(defvar exec-path-from-shell-de"..., 4096) = 4096 lseek(7, 5537, SEEK_SET) = 5537 lseek(7, 5537, SEEK_SET) = 5537 lseek(7, 5537, SEEK_SET) = 5537 lseek(7, 5537, SEEK_SET) = 5537 lseek(7, 5537, SEEK_SET) = 5537 lseek(7, 5537, SEEK_SET) = 5537 brk(0x7507000) = 0x7507000 lseek(7, 5537, SEEK_SET) = 5537 lseek(7, 5537, SEEK_SET) = 5537 lseek(7, 5537, SEEK_SET) = 5537 read(7, "230\\205\26\0\t\22\\307\\310\t!\vC\\\"\\211\24\\2"..., 4096) = 2430 lseek(7, 7967, SEEK_SET) = 7967 lseek(7, 7967, SEEK_SET) = 7967 lseek(7, 7967, SEEK_SET) = 7967 lseek(7, 7967, SEEK_SET) = 7967 read(7, "", 4096) = 0 close(7) = 0 getpid() = 10818 faccessat(AT_FDCWD, "/home/lujun9972/bin/printf", X_OK) = -1 ENOENT (没有那个文件或目录) faccessat(AT_FDCWD, "/usr/local/sbin/printf", X_OK) = -1 ENOENT (没有那个文件或目录) faccessat(AT_FDCWD, "/usr/local/bin/printf", X_OK) = -1 ENOENT (没有那个文件或目录) faccessat(AT_FDCWD, "/usr/bin/printf", X_OK) = 0 stat("/usr/bin/printf", {st_mode=S_IFREG|0755, st_size=51176, ...}) = 0 openat(AT_FDCWD, "/dev/null", O_RDONLY|O_CLOEXEC) = 7 faccessat(AT_FDCWD, "/proc/5070/fd/.", F_OK) = 0 faccessat(AT_FDCWD, "/proc/5070/fd/.", F_OK) = 0 faccessat(AT_FDCWD, "/bin/bash", X_OK) = 0 stat("/bin/bash", {st_mode=S_IFREG|0755, st_size=903440, ...}) = 0 pipe2([8, 9], O_CLOEXEC) = 0 rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0 vfork() = 10949 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 close(9) = 0 close(7) = 0 read(8, "bash: \346\227\240\346\263\225\350\256\276\345\256\232\347\273\210\347\253\257\350\277\233\347\250\213\347\273"..., 16384) = 74 read(8, "bash: \346\255\244 shell \344\270\255\346\227\240\344\273\273\345\212\241\346\216\247\345"..., 16310) = 35 read(8, "setterm: \347\273\210\347\253\257 xterm-256color \344"..., 16275) = 51 read(8, "Couldn't get a file descriptor r"..., 16224) = 56 read(8, "bash: [: \357\274\232\351\234\200\350\246\201\346\225\264\346\225\260\350\241\250\350\276\276\345\274"..., 16168) = 34 read(8, "Your display number is 0\n", 16134) = 25 read(8, "Test whether fcitx is running co"..., 16109) = 53 read(8, "Fcitx is running correctly.\n\n==="..., 16056) = 87 read(8, "Launch fbterm...\n", 15969) = 17 read(8, "stdin isn't a tty!\n", 15952) = 19 read(8, "__RESULT\0/home/lujun9972/bin:/ho"..., 15933) = 298 read(8, 0x7ffd1d39ce9d, 15635) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=10949, si_uid=1000, si_status=0, si_utime=10, si_stime=7} --- rt_sigreturn({mask=[]}) = -1 EINTR (被中断的系统调用) read(8, "", 15635) = 0 wait4(10949, [{WIFEXITED(s) && WEXITSTATUS(s) == 0}], 0, NULL) = 10949 close(8) = 0 getpid() = 10818 faccessat(AT_FDCWD, "/home/lujun9972/bin/printf", X_OK) = -1 ENOENT (没有那个文件或目录) faccessat(AT_FDCWD, "/usr/local/sbin/printf", X_OK) = -1 ENOENT (没有那个文件或目录) faccessat(AT_FDCWD, "/usr/local/bin/printf", X_OK) = -1 ENOENT (没有那个文件或目录) faccessat(AT_FDCWD, "/usr/bin/printf", X_OK) = 0 stat("/usr/bin/printf", {st_mode=S_IFREG|0755, st_size=51176, ...}) = 0 openat(AT_FDCWD, "/dev/null", O_RDONLY|O_CLOEXEC) = 7 faccessat(AT_FDCWD, "/proc/5070/fd/.", F_OK) = 0 faccessat(AT_FDCWD, "/proc/5070/fd/.", F_OK) = 0 faccessat(AT_FDCWD, "/bin/bash", X_OK) = 0 stat("/bin/bash", {st_mode=S_IFREG|0755, st_size=903440, ...}) = 0 pipe2([8, 9], O_CLOEXEC) = 0 rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0 vfork() = 11679 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 close(9) = 0 close(7) = 0 read(8, "setterm: \347\273\210\347\253\257 xterm-256color \344"..., 16384) = 51 read(8, "Couldn't get a file descriptor r"..., 16333) = 56 read(8, "/home/lujun9972/.bash_profile: \347"..., 16277) = 72 read(8, "Your display number is 0\nTest wh"..., 16205) = 78 read(8, "Fcitx is running correctly.\n\n==="..., 16127) = 104 read(8, "stdin isn't a tty!\n", 16023) = 19 read(8, "__RESULT\0b269cd09e7ec4e8a115188c"..., 16004) = 298 read(8, 0x7ffd1d39cba6, 15706) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) --- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=11679, si_uid=1000, si_status=0, si_utime=1, si_stime=1} --- rt_sigreturn({mask=[]}) = -1 EINTR (被中断的系统调用) read(8, 很容易就可以看出，当 Emacs 卡顿时，它在尝试从 8 号文件句柄中读取内容。那么 8 号文件句柄在哪里定义的呢？往前看可以看到：pipe2([8, 9], O_CLOEXEC) = 0 rt_sigprocmask(SIG_BLOCK, [INT CHLD], [], 8) = 0 vfork() = 11679 rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0 close(9) = 0 可以推测出，Emacs 主进程 fork 出一个子进程（进程号为 11679），并通过管道读取子进程的内容。然而，从--- SIGCHLD {si_signo=SIGCHLD, si_code=CLD_EXITED, si_pid=11679, si_uid=1000, si_status=0, si_utime=1, si_stime=1} --- rt_sigreturn({mask=[]}) = -1 EINTR (被中断的系统调用) read(8, 可以看出，实际上子进程已经退出了（父进程收到 SIGCHLD 信号），父进程确依然在尝试从管道中读取内容，导致的阻塞。而且从read(8, "setterm: \347\273\210\347\253\257 xterm-256color \344"..., 16384) = 51 read(8, "Couldn't get a file descriptor r"..., 16333) = 56 read(8, "/home/lujun9972/.bash_profile: \347"..., 16277) = 72 read(8, "Your display number is 0\nTest wh"..., 16205) = 78 read(8, "Fcitx is running correctly.\n\n==="..., 16127) = 104 read(8, "stdin isn't a tty!\n", 16023) = 19 read(8, "__RESULT\0b269cd09e7ec4e8a115188c"..., 16004) = 298 read(8, 0x7ffd1d39cba6, 15706) = ? ERESTARTSYS (To be restarted if SA_RESTART is set) 看到，子进程的输出似乎是我的交互式登录 bash 启动时的输出（加载了 .bash_profile）在往前翻发现这么一段信息：readlinkat(AT_FDCWD, "/home", 0x7ffd1d3abb50, 1024) = -1 EINVAL (无效的参数) readlinkat(AT_FDCWD, "/home/lujun9972", 0x7ffd1d3abf00, 1024) = -1 EINVAL (无效的参数) readlinkat(AT_FDCWD, "/home/lujun9972/.emacs.d", 0x7ffd1d3ac2b0, 1024) = -1 EINVAL (无效的参数) readlinkat(AT_FDCWD, "/home/lujun9972/.emacs.d/elpa", 0x7ffd1d3ac660, 1024) = -1 EINVAL (无效的参数) readlinkat(AT_FDCWD, "/home/lujun9972/.emacs.d/elpa/exec-path-from-shell-20180323.1904", 0x7ffd1d3aca10, 1024) = -1 EINVAL (无效的参数) readlinkat(AT_FDCWD, "/home/lujun9972/.emacs.d/elpa/exec-path-from-shell-20180323.1904/exec-path-from-shell.elc", 0x7ffd1d3acdc0, 1024) = -1 EINVAL (无效的参数) lseek(7, -2655, SEEK_CUR) = 1441 read(7, "\n(defvar exec-path-from-shell-de"..., 4096) = 4096 这很明显是跟 exec-path-from-shell 有关啊。通过查看 exec-path-from-shell 的实现，发现 exec-path-from-shell 的实现原理是通过实际调启一个 shell，然后输出 PATH 和 MANPATH 的值的。 而且对于 bash 来说，默认的启动参数为 -i -l（可以通过exec-path-from-shell-arguments来设置）。也就是说 bash 会作为交互式的登录shell来启动的，因此会加载 .bash_profile 和 .bashrc。既然发现跟 exec-path-from-shell 这个包有关，而且据说这个包对 Linux 其实意义不大，那不如直接禁用掉好了。dotspacemacs-excluded-packages '(exec-path-from-shell) 再次重启Emacs，发现这次启动速度明显快了许多了。
每周开源点评：云原生 Java、开源安全以及更多行业趋势
开源社区和行业趋势的每周总览。作为我在具有开源开发模型的企业软件公司担任高级产品营销经理的角色的一部分，我为产品营销人员、经理和其他影响者定期发布有关开源社区，市场和行业趋势的定期更新。 以下是该更新中我和他们最喜欢的五篇文章。《为什么现代 web 开发如此复杂？》文章地址现代前端 web 开发带来了一种两极分化的体验：许多人喜欢它，而其他人则鄙视它。我是现代Web开发的忠实拥护者，尽管我将其描述为“魔法”——而魔法也有其优点和缺点……。最近，我一直在向那些只具有粗略的原始 web 开发工作流程的人们讲解“现代 web 开发工作流程”……，但我发现需要解释的内容实在是太多了！甚至笼统的解释最终都会变得冗长。因此，在我努力写下更多解释的过程中，这里是对 web 开发演变的一个长期而笼统的解释的开始……影响：足够具体，对前端开发人员非常有用（特别是对新开发人员），且足够简单，解释得足够好，可以帮助非开发人员更好地理解前端开发人员的一些问题。到最后，你将（有点）了解 Javascript 和 WebAPI 之间的区别，以及 2019 年的 Javascript 与 2006 年的 Javascript 有何不同。开源 Kubernetes 安全审计文章链接去年，云原生计算基金会（CNCF）开始为其项目执行并开源第三方安全审计，以提高我们生态系统的整体安全性。这个想法是从一些项目开始，并从 CNCF 社区收集了关于这个试点项目是否有用的反馈。第一批经历这个过程的项目是 CoreDNS、Envoy 和 Prometheus。这些首次公开审计发现了从一般漏洞到严重漏洞的安全问题。有了这些结果，CoreDNS、Envoy 和 Prometheus 的项目维护者就能够解决已发现的漏洞，并添加文档来帮助用户。从这些初始审计中得出的主要结论是，公开安全审计是测试开源项目的质量及其漏洞管理过程的一个很好的方法，更重要的是，测试开源项目的安全实践有多大的弹性。特别是 CNCF 的毕业项目，它们被世界上一些最大的公司广泛应用于生产中，它们必须坚持最高级别的安全最佳实践。影响：就像 Linux 之于数据中心一样，很多公司都把云计算押宝在 Kubernetes 上。从安全的角度来看，看到其中 4 家公司以确保项目正在做应该做的事情，这激发了人们的信心。共享这项研究表明，开源远远不止是仓库中的代码；它是以一种有益于整个社区而不是少数人利益的方式获取和分享专家意见。Quarkus——这个轻量级 Java 框架的下一步是什么？文章链接“容器优先”是什么意思？Quarkus 有哪些优势？0.20.0 版本有什么新功能？未来我们可以期待哪些功能？1.0.0 版什么时候发布？我们对 Quarkus 有很多问题，而 Alex Soto 也很耐心地回答了所有问题。 随着 Quarkus 0.20.0 的发布，我们和 JAX 伦敦演讲者，Java 拥护者和红帽的开发人员体验总监 Alex Soto 进行了接触。他很好地回答了我们关于 Quarkus 的过去、现在和未来的所有问题。看起来我们对这个令人兴奋的轻量级框架有很多期待！影响：最近有个聪明的人告诉我，Quarkus 有潜力使 Java “可能成为容器和无服务器环境的最佳语言之一”。不禁使我多看了一眼。尽管 Java 是最流行的编程语言之一（如果不是最流行的），但当你听到“云原生”一词时，它可能并不是第一个想到的语言。Quarkus 可以通过让开发人员将他们的经验应用到新的挑战中，从而扩展和提高他们所拥有的技能的价值。Julia 编程语言：用户批露他们最喜欢和最讨厌它的地方文章链接Julia 最受欢迎的技术特性是速度和性能，其次是易用性，而最受欢迎的非技术特性是使用者无需付费即可使用它。用户还报告了他们对该语言最大的不满。排在首位的是附加功能的包不够成熟，或者维护得不够好，无法满足他们的需求。影响：Julia 1.0 版本已经发布了一年，并且在一系列相关指标（下载、GitHub 星级等）中取得了令人瞩目的增长。它是一种直接针对我们当前和未来最大挑战（“科学计算、机器学习、数据挖掘、大规模线性代数、分布式和并行计算”）的语言，因此，了解用户对它的感受，就可以间接看到有关这些挑战的应对情况。多云数据解读：11 个有趣的统计数据文章链接如果你把我们最近对 Kubernetes 的有趣数据的深入研究归结最基本的一条，它看起来是这样的：Kubernetes 的受欢迎程度在可预见的未来将持续下去。剧透警报：当你挖掘有关多云使用情况的最新数据时，他们告诉你一个类似的描述：使用率正在飙升。这种一致性是有道理的。也许不是每个组织都将使用 Kubernetes 来管理其多云和/或混合云基础架构，但是两者越来越紧密地联系在一起。即使不这样做，它们都反映了向更分散和异构 IT 环境的普遍转变，以及云原生开发和其他重叠趋势。影响：越来越多地采用“多云战略”的另一种解释是，它们将组织中单独部分未经协商而作出的决策追溯为“战略”，从而使决策合法化。“等等，所以你从谁那里买了几个小时？又从另一个人那里买了几个小时？为什么在会议纪要中没有呢？我想我们现在是一家多云公司！”。当然，我在开玩笑，我敢肯定大多数大公司的协调能力远胜于此，对吗？我希望你喜欢这张上周让我印象深刻的列表，并在下周一回来了解更多的开放源码社区、市场和行业趋势。via: https://opensource.com/article/19/8/cloud-native-java-and-more作者：Tim Hildred 选题：lujun9972 译者：laingke 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
chgrp 和 newgrp 命令可帮助你管理需要维护组所有权的文件。在最近的一篇文章中，我介绍了 chown 命令，它用于修改系统上的文件所有权。回想一下，所有权是分配给一个对象的用户和组的组合。chgrp 和 newgrp 命令为管理需要维护组所有权的文件提供了帮助。使用 chgrpchgrp 只是更改文件的组所有权。这与 chown :<group> 命令相同。你可以使用：$chown :alan mynotes或者：$chgrp alan mynotes递归chgrp 和它的一些参数可以用在命令行和脚本中。就像许多其他 Linux 命令一样，chgrp 有一个递归参数 -R。如下所示，你需要它来对文件夹及其内容进行递归操作。我加了 -v（详细）参数，因此 chgrp 会告诉我它在做什么：$ ls -l . conf .: drwxrwxr-x 2 alan alan 4096 Aug 5 15:33 conf conf: -rw-rw-r-- 1 alan alan 0 Aug 5 15:33 conf.xml # chgrp -vR delta conf changed group of 'conf/conf.xml' from alan to delta changed group of 'conf' from alan to delta参考当你要更改文件的组以匹配特定的配置，或者当你不知道具体的组时（比如你运行一个脚本时），可使用参考文件 （--reference=RFILE）。你可以复制另外一个作为参考的文件（RFILE）的组。比如，为了撤销上面的更改 （请注意，点 . 代表当前工作目录）：$ chgrp -vR --reference=. conf报告更改大多数命令都有用于控制其输出的参数。最常见的是 -v 来启用详细信息，而且 chgrp 命令也拥有详细模式。它还具有 -c（--changes）参数，指示 chgrp 仅在进行了更改时报告。chgrp 还会报告其他内容，例如是操作不被允许时。参数 -f（--silent、--quiet）用于禁止显示大部分错误消息。我将在下一节中使用此参数和 -c 来显示实际更改。保持根目录Linux 文件系统的根目录（/）应该受到高度重视。如果命令在此层级犯了一个错误，那么后果可能是可怕的，并会让系统无法使用。尤其是在运行一个会递归修改甚至删除的命令时。chgrp 命令有一个可用于保护和保持根目录的参数。它是 --preserve-root。如果在根目录中将此参数和递归一起使用，那么什么也不会发生，而是会出现一条消息：[root@localhost /]# chgrp -cfR --preserve-root a+w / chgrp: it is dangerous to operate recursively on '/' chgrp: use --no-preserve-root to override this failsafe不与递归（-R）结合使用时，该选项无效。但是，如果该命令由 root 用户运行，那么 / 的权限将会更改，但其下的其他文件或目录的权限则不会被更改：[alan@localhost /]$ chgrp -c --preserve-root alan / chgrp: changing group of '/': Operation not permitted [root@localhost /]# chgrp -c --preserve-root alan / changed group of '/' from root to alan令人惊讶的是，它似乎不是默认参数。而选项 --no-preserve-root 是默认的。如果你在不带“保持”选项的情况下运行上述命令，那么它将默认为“无保持”模式，并可能会更改不应更改的文件的权限：[alan@localhost /]$ chgrp -cfR alan / changed group of '/dev/pts/0' from tty to alan changed group of '/dev/tty2' from tty to alan changed group of '/var/spool/mail/alan' from mail to alan关于 newgrpnewgrp 命令允许用户覆盖当前的主要组。当你在所有文件必须有相同的组所有权的目录中操作时，newgrp 会很方便。假设你的内网服务器上有一个名为 share 的目录，不同的团队在其中存储市场活动照片。组名为 share。当不同的用户将文件放入目录时，文件的主要组可能会变得混乱。每当添加新文件时，你都可以运行 chgrp 将错乱的组纠正为 share：$ cd share ls -l -rw-r--r--. 1 alan share 0 Aug 7 15:35 pic13 -rw-r--r--. 1 alan alan 0 Aug 7 15:35 pic1 -rw-r--r--. 1 susan delta 0 Aug 7 15:35 pic2 -rw-r--r--. 1 james gamma 0 Aug 7 15:35 pic3 -rw-rw-r--. 1 bill contract 0 Aug 7 15:36 pic4我在 chmod 命令的文章中介绍了 setgid 模式。它是解决此问题的一种方法。但是，假设由于某种原因未设置 setgid 位。newgrp 命令在此时很有用。在任何用户将文件放入 share 目录之前，他们可以运行命令 newgrp share。这会将其主要组切换为 share，因此他们放入目录中的所有文件都将有 share 组，而不是用户自己的主要组。完成后，用户可以使用以下命令切换回常规主要组（举例）：newgrp alan总结了解如何管理用户、组和权限非常重要。最好知道一些替代方法来解决可能遇到的问题，因为并非所有环境都以相同的方式设置。via: https://opensource.com/article/19/9/linux-chgrp-and-newgrp-commands作者：Alan Formy-Duval 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
了解 .NET 开发平台启动和运行的基础知识。.NET 框架由 Microsoft 于 2000 年发布。该平台的开源实现 Mono 在 21 世纪初成为了争议的焦点，因为微软拥有 .NET 技术的多项专利，并且可能使用这些专利来终止 Mono 项目。幸运的是，在 2014 年，微软宣布 .NET 开发平台从此成为 MIT 许可下的开源平台，并在 2016 年收购了开发 Mono 的 Xamarin 公司。.NET 和 Mono 已经同时可用于 C#、F#、GTK+、Visual Basic、Vala 等的跨平台编程环境。使用 .NET 和 Mono 创建的程序已经应用于 Linux、BSD、Windows、MacOS、Android，甚至一些游戏机。你可以使用 .NET 或 Mono 来开发 .NET 应用。这两个都是开源的，并且都有活跃和充满活力的社区。本文重点介绍微软的 .NET 环境。如何安装 .NET.NET 下载被分为多个包：一个仅包含 .NET 运行时，另一个 .NET SDK 包含了 .NET Core 和运行时。根据架构和操作系统版本，这些包可能有多个版本。要开始使用 .NET 进行开发，你必须安装该 SDK。它为你提供了 dotnet 终端或 PowerShell 命令，你可以使用它们来创建和生成项目。Linux要在 Linux 上安装 .NET，首先将微软 Linux 软件仓库添加到你的计算机。在 Fedora 上：$ sudo rpm --import https://packages.microsoft.com/keys/microsoft.asc $ sudo wget -q -O /etc/yum.repos.d/microsoft-prod.repo https://packages.microsoft.com/config/fedora/27/prod.repo在 Ubuntu 上：$ wget -q https://packages.microsoft.com/config/ubuntu/19.04/packages-microsoft-prod.deb -O packages-microsoft-prod.deb $ sudo dpkg -i packages-microsoft-prod.deb接下来，使用包管理器安装 SDK，将 <X.Y> 替换为当前版本的 .NET 版本：在 Fedora 上：$ sudo dnf install dotnet-sdk-<X.Y>在 Ubuntu 上：$ sudo apt install apt-transport-https $ sudo apt update $ sudo apt install dotnet-sdk-<X.Y>下载并安装所有包后，打开终端并输入下面命令确认安装：$ dotnet --version X.Y.ZWindows如果你使用的是微软 Windows，那么你可能已经安装了 .NET 运行时。但是，要开发 .NET 应用，你还必须安装 .NET Core SDK。首先，下载安装程序。请认准下载 .NET Core 进行跨平台开发（.NET Framework 仅适用于 Windows）。下载 .exe 文件后，双击该文件启动安装向导，然后单击两下进行安装：接受许可证并允许安装继续。然后，从左下角的“应用程序”菜单中打开 PowerShell。在 PowerShell 中，输入测试命令：PS C:\Users\osdc> dotnet如果你看到有关 dotnet 安装的信息，那么说明 .NET 已正确安装。MacOS如果你使用的是 Apple Mac，请下载 .pkg 形式的 Mac 安装程序。下载并双击该 .pkg 文件，然后单击安装程序。你可能需要授予安装程序权限，因为该软件包并非来自 App Store。下载并安装所有软件包后，请打开终端并输入以下命令来确认安装：$ dotnet --version X.Y.ZHello .NETdotnet 命令提供了一个用 .NET 编写的 “hello world” 示例程序。或者，更准确地说，该命令提供了示例应用。首先，使用 dotnet 命令以及 new 和 console 参数创建一个控制台应用的项目目录及所需的代码基础结构。使用 -o 选项指定项目名称：$ dotnet new console -o hellodotnet这将在当前目录中创建一个名为 hellodotnet 的目录。进入你的项目目录并看一下：$ cd hellodotnet $ dir hellodotnet.csproj obj Program.csProgram.cs 是一个空的 C＃ 文件，它包含了一个简单的 Hello World 程序。在文本编辑器中打开查看它。微软的 Visual Studio Code 是一个使用 dotnet 编写的跨平台的开源应用，虽然它不是一个糟糕的文本编辑器，但它会收集用户的大量数据（在它的二进制发行版的许可证中授予了自己权限）。如果要尝试使用 Visual Studio Code，请考虑使用 VSCodium，它是使用 Visual Studio Code 的 MIT 许可的源码构建的版本，而没有远程收集（请阅读此文档来禁止此构建中的其他形式追踪）。或者，只需使用现有的你最喜欢的文本编辑器或 IDE。新控制台应用中的样板代码为：using System; namespace hellodotnet { class Program { static void Main(string[] args) { Console.WriteLine("Hello World!"); } } }要运行该程序，请使用 dotnet run 命令：$ dotnet run Hello World!这是 .NET 和 dotnet 命令的基本工作流程。这里有完整的 .NET C＃ 指南，并且都是与 .NET 相关的内容。关于 .NET 实战示例，请关注 Alex Bunardzic 在 opensource.com 中的变异测试文章。via: https://opensource.com/article/19/9/getting-started-net作者：Seth Kenlon 选题：lujun9972 译者：geekpi 校对：wxy本文由 LCTT 原创编译，Linux中国 荣誉推出
这是一系列关于构建“即时消息”应用的新帖子。你应该对这类应用并不陌生。有了它们的帮助，我们才可以与朋友畅聊无忌。Facebook Messenger、WhatsApp 和 Skype 就是其中的几个例子。正如你所看到的那样，这些应用允许我们发送图片、传输视频、录制音频、以及和一大帮子人聊天等等。当然，我们的教程应用将会尽量保持简单，只在两个用户之间发送文本消息。我们将会用 CockroachDB 作为 SQL 数据库，用 Go 作为后端语言，并且用 JavaScript 来制作 web 应用。这是第一篇帖子，我们将会讲述数据库的设计。CREATE TABLE users ( id SERIAL NOT NULL PRIMARY KEY, username STRING NOT NULL UNIQUE, avatar_url STRING, github_id INT NOT NULL UNIQUE );显然，这个应用需要一些用户。我们这里采用社交登录的形式。由于我选用了 GitHub，所以这里需要保存一个对 GitHub 用户 ID 的引用。CREATE TABLE conversations ( id SERIAL NOT NULL PRIMARY KEY, last_message_id INT, INDEX (last_message_id DESC) );每个对话都会引用最近一条消息。每当我们输入一条新消息时，我们都会更新这个字段。我会在后面添加外键约束。… 你可能会想，我们可以先对对话进行分组，然后再通过这样的方式获取最近一条消息。但这样做会使查询变得更加复杂。CREATE TABLE participants ( user_id INT NOT NULL REFERENCES users ON DELETE CASCADE, conversation_id INT NOT NULL REFERENCES conversations ON DELETE CASCADE, messages_read_at TIMESTAMPTZ NOT NULL DEFAULT now(), PRIMARY KEY (user_id, conversation_id) );尽管之前我提到过对话只会在两个用户之间进行，但我们还是采用了允许向对话中添加多个参与者的设计。因此，在对话和用户之间有一个参与者表。为了知道用户是否有未读消息，我们在消息表中添加了“读取时间”（messages_read_at）字段。每当用户在对话中读取消息时，我们都会更新它的值，这样一来，我们就可以将它与对话中最后一条消息的“创建时间”（created_at）字段进行比较。CREATE TABLE messages ( id SERIAL NOT NULL PRIMARY KEY, content STRING NOT NULL, user_id INT NOT NULL REFERENCES users ON DELETE CASCADE, conversation_id INT NOT NULL REFERENCES conversations ON DELETE CASCADE, created_at TIMESTAMPTZ NOT NULL DEFAULT now(), INDEX(created_at DESC) );尽管我们将消息表放在最后，但它在应用中相当重要。我们用它来保存对创建它的用户以及它所出现的对话的引用。而且还可以根据“创建时间”（created_at）来创建索引以完成对消息的排序。ALTER TABLE conversations ADD CONSTRAINT fk_last_message_id_ref_messages FOREIGN KEY (last_message_id) REFERENCES messages ON DELETE SET NULL;我在前面已经提到过这个外键约束了，不是吗:D有这四张表就足够了。你也可以将这些查询保存到一个文件中，并将其通过管道传送到 Cockroach CLI。首先，我们需要启动一个新节点：cockroach start --insecure --host 127.0.0.1然后创建数据库和这些表：cockroach sql --insecure -e "CREATE DATABASE messenger" cat schema.sql | cockroach sql --insecure -d messenger这篇帖子就到这里。在接下来的部分中，我们将会介绍「登录」，敬请期待。源代码via: https://nicolasparada.netlify.com/posts/go-messenger-schema/作者：Nicolás Parada 选题：lujun9972 译者：PsiACE 校对：wxy本文由 LCTT 原创编译，Linux 中国 荣誉推出