让系统崩溃的黑天鹅分类
在严重的故障发生之前,找到引起问题的异常事件,并修复它。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/25/123944dppim8qrrqs8iiru.png">Media</a>黑天鹅Black swan用来比喻造成严重影响的小概率事件(比如 2008 年的金融危机)。在生产环境的系统中,黑天鹅是指这样的事情:它引发了你不知道的问题,造成了重大影响,不能快速修复或回滚,也不能用值班说明书上的其他标准响应来解决。它是事发几年后你还在给新人说起的事件。从定义上看,黑天鹅是不可预测的,不过有时候我们能找到其中的一些模式,针对有关联的某一类问题准备防御措施。例如,大部分故障的直接原因是变更(代码、环境或配置)。虽然这种方式触发的 bug 是独特的、不可预测的,但是常见的金丝雀发布对避免这类问题有一定的作用,而且自动回滚已经成了一种标准止损策略。随着我们的专业性不断成熟,一些其他的问题也正逐渐变得容易理解,被归类到某种风险并有普适的预防策略。公布出来的黑天鹅事件所有科技公司都有生产环境的故障,只不过并不是所有公司都会分享他们的事故分析。那些公开讨论事故的公司帮了我们的忙。下列事故都描述了某一类问题,但它们绝对不是只一个孤例。我们的系统中都有黑天鹅在潜伏着,只是有些人还不知道而已。达到上限达到任何类型的限…
在严重的故障发生之前,找到引起问题的异常事件,并修复它。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/25/123944dppim8qrrqs8iiru.png">Media</a>黑天鹅Black swan用来比喻造成严重影响的小概率事件(比如 2008 年的金融危机)。在生产环境的系统中,黑天鹅是指这样的事情:它引发了你不知道的问题,造成了重大影响,不能快速修复或回滚,也不能用值班说明书上的其他标准响应来解决。它是事发几年后你还在给新人说起的事件。从定义上看,黑天鹅是不可预测的,不过有时候我们能找到其中的一些模式,针对有关联的某一类问题准备防御措施。例如,大部分故障的直接原因是变更(代码、环境或配置)。虽然这种方式触发的 bug 是独特的、不可预测的,但是常见的金丝雀发布对避免这类问题有一定的作用,而且自动回滚已经成了一种标准止损策略。随着我们的专业性不断成熟,一些其他的问题也正逐渐变得容易理解,被归类到某种风险并有普适的预防策略。公布出来的黑天鹅事件所有科技公司都有生产环境的故障,只不过并不是所有公司都会分享他们的事故分析。那些公开讨论事故的公司帮了我们的忙。下列事故都描述了某一类问题,但它们绝对不是只一个孤例。我们的系统中都有黑天鹅在潜伏着,只是有些人还不知道而已。达到上限达到任何类型的限…
DevOps 应聘者应该准备回答的 20 个问题
想要建立一个积极,富有成效的工作环境? 在招聘过程中要专注于寻找契合点。Media
via https://linux.cn/article-10275-1.html
想要建立一个积极,富有成效的工作环境? 在招聘过程中要专注于寻找契合点。Media
via https://linux.cn/article-10275-1.html
DevOps 应聘者应该准备回答的 20 个问题
想要建立一个积极,富有成效的工作环境? 在招聘过程中要专注于寻找契合点。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/25/210921fh1ipxpphxz5wggg.png">Media</a>聘请一个不合适的人<a href="https://www.shrm.org/resourcesandtools/hr-topics/employee-relations/pages/cost-of-bad-hires.aspx">代价是很高的</a>。根据 Link 人力资源的首席执行官 Jörgen Sundberg 的统计,招聘、雇佣一名新员工将会花费公司$240,000 之多,当你进行了一次不合适的招聘:你失去了他们的知识技能。你失去了他们的人脉。你的团队将可能进入到一个组织发展的震荡阶段你的公司将会面临组织破裂的风险当你失去一名员工的时候,你就像丢失了公司版图中的一块。同样值得一提的是另一端的痛苦。应聘到一个错误工作岗位的员工会感受到很大的压力以及整个身心的不满意,甚至是健康问题。另外一方面,当你招聘到合适的人时,新的员工将会:丰富公司现有的文化,使你的组织成为一个更好的工作场所。研究表明一个积极的工作文化能够帮助更长久推动财务业绩增长,而且如果你在一个欢快的环境中工作,你更有可能在生活中做的更好。热爱和你的组织在一起工作。当人们热爱他们所在做的,他们会趋向于做的更好。招聘以适合或加强现有的文化在 DevOps 和敏捷团多中是必不可少的。也就是说雇佣到一个能够鼓励积极合作的人,以便来自不同背景,有着不同目标和工&#…
想要建立一个积极,富有成效的工作环境? 在招聘过程中要专注于寻找契合点。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/25/210921fh1ipxpphxz5wggg.png">Media</a>聘请一个不合适的人<a href="https://www.shrm.org/resourcesandtools/hr-topics/employee-relations/pages/cost-of-bad-hires.aspx">代价是很高的</a>。根据 Link 人力资源的首席执行官 Jörgen Sundberg 的统计,招聘、雇佣一名新员工将会花费公司$240,000 之多,当你进行了一次不合适的招聘:你失去了他们的知识技能。你失去了他们的人脉。你的团队将可能进入到一个组织发展的震荡阶段你的公司将会面临组织破裂的风险当你失去一名员工的时候,你就像丢失了公司版图中的一块。同样值得一提的是另一端的痛苦。应聘到一个错误工作岗位的员工会感受到很大的压力以及整个身心的不满意,甚至是健康问题。另外一方面,当你招聘到合适的人时,新的员工将会:丰富公司现有的文化,使你的组织成为一个更好的工作场所。研究表明一个积极的工作文化能够帮助更长久推动财务业绩增长,而且如果你在一个欢快的环境中工作,你更有可能在生活中做的更好。热爱和你的组织在一起工作。当人们热爱他们所在做的,他们会趋向于做的更好。招聘以适合或加强现有的文化在 DevOps 和敏捷团多中是必不可少的。也就是说雇佣到一个能够鼓励积极合作的人,以便来自不同背景,有着不同目标和工&#…
用 Python 和 Conu 测试容器
Conu (container utilities 的简写) 是一个 Python 库,让你编写容器测试变得简单。Media
via https://linux.cn/article-10276-1.html
Conu (container utilities 的简写) 是一个 Python 库,让你编写容器测试变得简单。Media
via https://linux.cn/article-10276-1.html
用 Python 和 Conu 测试容器
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/25/215123sq8nep3nn7ccp13m.jpg">Media</a>越来越多的开发人员使用容器开发和部署他们的应用。这意味着可以轻松地测试容器也变得很重要。<a href="https://github.com/user-cont/conu">Conu</a> (container utilities 的简写) 是一个 Python 库,让你编写容器测试变得简单。本文向你介绍如何使用它测试容器。开始吧首先,你需要一个容器程序来测试。为此,以下命令创建一个包含一个容器的 Dockerfile 和一个被容器伺服的 Flask 应用程序的文件夹。<pre class="prettyprint linenums">$ mkdir container_test$ cd container_test$ touch Dockerfile$ touch app.py</pre>将以下代码复制到 app.py 文件中。这是惯常的基本 Flask 应用,它返回字符串 “Hello Container World!”。<pre class="prettyprint linenums">from flask import Flaskapp = Flask(__name__)@app.route('/')def hello_world(): return 'Hello Container World!'if __name__ == '__main__': app.run(debug=True,host='0.0.0.0')</pre>创建和构建测试容器为了构建测试容器,将以下指令添加到 Dockerfile。<pre class="prettyprint linenums">FROM registry.fedoraproject.org/fedora-minimal:latestRUN microdnf -y install python3-flask && microdnf clean allADD ./app.py /srvCMD ["python3", "/srv/app.py"]</pre>然后使用 Docker CLI 工具构建容器。<pre class="prettyprint linenums">$ sudo dnf -y install docker$ sudo systemctl start docker$ sudo docker build . -t flaskapp_container</pre>提示:只有在系统上未安装 Docker 时才需要前两个命令。构建之后使用以下命令运行容器。<pre class="prettyprint linenums">$ sudo docker run -p 5000:5000 --rm flaskapp_container* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)* Restarting with stat* Debugger is active!* Debugger PIN: 473-505-51</pre>最后,使用 curl 检查 Flask 应用程序是否在容器内正确运行:<pre class="prettyprint linenums">$ curl http://127.0.0.1:5000Hello Container World!</pre>现在,flaskapp_container 正在运行并准备好进行测试,你可以使用 Ctrl+C 将其停止。创建测试脚本在编写测试脚本之前,必须安装 conu。在先前创建的 container_test 目录中,运行以下命令。<pre class="prettyprint…
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/25/215123sq8nep3nn7ccp13m.jpg">Media</a>越来越多的开发人员使用容器开发和部署他们的应用。这意味着可以轻松地测试容器也变得很重要。<a href="https://github.com/user-cont/conu">Conu</a> (container utilities 的简写) 是一个 Python 库,让你编写容器测试变得简单。本文向你介绍如何使用它测试容器。开始吧首先,你需要一个容器程序来测试。为此,以下命令创建一个包含一个容器的 Dockerfile 和一个被容器伺服的 Flask 应用程序的文件夹。<pre class="prettyprint linenums">$ mkdir container_test$ cd container_test$ touch Dockerfile$ touch app.py</pre>将以下代码复制到 app.py 文件中。这是惯常的基本 Flask 应用,它返回字符串 “Hello Container World!”。<pre class="prettyprint linenums">from flask import Flaskapp = Flask(__name__)@app.route('/')def hello_world(): return 'Hello Container World!'if __name__ == '__main__': app.run(debug=True,host='0.0.0.0')</pre>创建和构建测试容器为了构建测试容器,将以下指令添加到 Dockerfile。<pre class="prettyprint linenums">FROM registry.fedoraproject.org/fedora-minimal:latestRUN microdnf -y install python3-flask && microdnf clean allADD ./app.py /srvCMD ["python3", "/srv/app.py"]</pre>然后使用 Docker CLI 工具构建容器。<pre class="prettyprint linenums">$ sudo dnf -y install docker$ sudo systemctl start docker$ sudo docker build . -t flaskapp_container</pre>提示:只有在系统上未安装 Docker 时才需要前两个命令。构建之后使用以下命令运行容器。<pre class="prettyprint linenums">$ sudo docker run -p 5000:5000 --rm flaskapp_container* Running on http://0.0.0.0:5000/ (Press CTRL+C to quit)* Restarting with stat* Debugger is active!* Debugger PIN: 473-505-51</pre>最后,使用 curl 检查 Flask 应用程序是否在容器内正确运行:<pre class="prettyprint linenums">$ curl http://127.0.0.1:5000Hello Container World!</pre>现在,flaskapp_container 正在运行并准备好进行测试,你可以使用 Ctrl+C 将其停止。创建测试脚本在编写测试脚本之前,必须安装 conu。在先前创建的 container_test 目录中,运行以下命令。<pre class="prettyprint…
Greg Kroah-Hartman 解释内核社区是如何使 Linux 安全的
由于 Linux 使用量持续扩大,内核社区去提高这个世界上使用最广泛的技术 —— Linux 内核的安全性的重要性越来越高。Media
via https://linux.cn/article-10277-1.html
由于 Linux 使用量持续扩大,内核社区去提高这个世界上使用最广泛的技术 —— Linux 内核的安全性的重要性越来越高。Media
via https://linux.cn/article-10277-1.html
如何在 Linux 上安装设备驱动程序
学习 Linux 设备驱动如何工作,并知道如何使用它们。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/25/225946aqxqufjcwjiwdwda.jpg">Media</a>对于一个熟悉 Windows 或者 MacOS 的人,想要切换到 Linux,它们都会面临一个艰巨的问题就是怎么安装和配置设备驱动。这是可以理解的,因为 Windows 和 MacOS 都有一套机制把这个过程做得非常的友好。比如说,当你插入一个新的硬件设备, Windows 能够自动检测并会弹出一个窗口询问你是否要继续驱动程序的安装。你也可以从网络上下载驱动程序,仅仅需要双击解压或者是通过设备管理器导入驱动程序即可。而这在 Linux 操作系统上并非这么简单。第一个原因是, Linux 是一个开源的操作系统,所以有 <a href="https://en.wikipedia.org/wiki/List_of_Linux_distributions">数百种 Linux 发行版的变体</a>。也就是说不可能做一个指南来适应所有的 Linux 发行版。因为每种 Linux 安装驱动程序的过程都有差异。第二,大多数默认的 Linux 驱动程序也都是开源的,并被集成到了系统中,这使得安装一些并未包含的驱动程序变得非常复杂,即使已经可以检测大多数的硬件设备。第三,不同发行版的许可也有差异。例如,<a href="https://fedoraproject.org/wiki/Forbidden_items?rd=ForbiddenItems">Fedora 禁止事项</a> 禁止包含专有的、受法律保护,或者是违反美国法律的驱动程序。而 Ubuntu 则让用户<a href="https://www.ubuntu.com/licensing">避免使用受法律保护或闭源的硬件设备</a>。为了更好的学习 Linux 驱动程序是如何工作的,我…
学习 Linux 设备驱动如何工作,并知道如何使用它们。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/25/225946aqxqufjcwjiwdwda.jpg">Media</a>对于一个熟悉 Windows 或者 MacOS 的人,想要切换到 Linux,它们都会面临一个艰巨的问题就是怎么安装和配置设备驱动。这是可以理解的,因为 Windows 和 MacOS 都有一套机制把这个过程做得非常的友好。比如说,当你插入一个新的硬件设备, Windows 能够自动检测并会弹出一个窗口询问你是否要继续驱动程序的安装。你也可以从网络上下载驱动程序,仅仅需要双击解压或者是通过设备管理器导入驱动程序即可。而这在 Linux 操作系统上并非这么简单。第一个原因是, Linux 是一个开源的操作系统,所以有 <a href="https://en.wikipedia.org/wiki/List_of_Linux_distributions">数百种 Linux 发行版的变体</a>。也就是说不可能做一个指南来适应所有的 Linux 发行版。因为每种 Linux 安装驱动程序的过程都有差异。第二,大多数默认的 Linux 驱动程序也都是开源的,并被集成到了系统中,这使得安装一些并未包含的驱动程序变得非常复杂,即使已经可以检测大多数的硬件设备。第三,不同发行版的许可也有差异。例如,<a href="https://fedoraproject.org/wiki/Forbidden_items?rd=ForbiddenItems">Fedora 禁止事项</a> 禁止包含专有的、受法律保护,或者是违反美国法律的驱动程序。而 Ubuntu 则让用户<a href="https://www.ubuntu.com/licensing">避免使用受法律保护或闭源的硬件设备</a>。为了更好的学习 Linux 驱动程序是如何工作的,我…
Linux 中国翻译组成立项目管理委员会,向正规化管理迈出一步
我们在原有的核心成员、译者两层的组织结构的基础上,吸收其它开源组织的管理经验,成立了三层结构的项目管理结构。Media
via https://linux.cn/article-10279-1.html
我们在原有的核心成员、译者两层的组织结构的基础上,吸收其它开源组织的管理经验,成立了三层结构的项目管理结构。Media
via https://linux.cn/article-10279-1.html
Linux 中国翻译组成立项目管理委员会,向正规化管理迈出一步
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/26/133144ba2bcf5he9h9fasv.jpg">Media</a><a href="https://linux.cn/lctt/">Linux 中国翻译组(LCTT)</a>成立<a href="https://linux.cn/article-9999-1.html">已逾五年</a>了,这些年来,我们在不断地改进我们的流程、管理。鉴于当前的人员规模的增大和事务的繁多,我们认为需要将管理水平更上一个台阶。因此,我们在原有的核心成员、译者两层的组织结构的基础上,吸收其它开源组织的管理经验,成立了三层结构的项目管理结构。新的管理层级为:<strong>译者</strong>:加入 LCTT 翻译活动中,并有实际贡献者即为译者。预备译者:加入 LCTT ,但尚未进行实际贡献者,视为预备译者。<strong>核心成员</strong>:做出重大贡献者列入核心成员。可执行日常管理任务。荣誉成员:长期休眠的核心成员列入荣誉成员。荣誉成员被收回写入权限,但保留投票权和历史荣誉。<strong>管理委员</strong>:由核心成员中选出,对 LCTT 事务进行表决和决策,并负责日常管理任务的最终执行。主席:由管理委员中选出,由现任管理委员进行选举。管理委员组成管理委员会(PMC),对 LCTT 的发展事务进行决策和执行。主要负责:制定和优化贡献流程和制度提名和投票 LCTT 核心成员、荣誉成员和主席成员管理兜底负责核心成员的管理事务而核心译者作为 LCTT 的中坚力量,除了参与翻译活动之外,还具有如下职权:…
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/26/133144ba2bcf5he9h9fasv.jpg">Media</a><a href="https://linux.cn/lctt/">Linux 中国翻译组(LCTT)</a>成立<a href="https://linux.cn/article-9999-1.html">已逾五年</a>了,这些年来,我们在不断地改进我们的流程、管理。鉴于当前的人员规模的增大和事务的繁多,我们认为需要将管理水平更上一个台阶。因此,我们在原有的核心成员、译者两层的组织结构的基础上,吸收其它开源组织的管理经验,成立了三层结构的项目管理结构。新的管理层级为:<strong>译者</strong>:加入 LCTT 翻译活动中,并有实际贡献者即为译者。预备译者:加入 LCTT ,但尚未进行实际贡献者,视为预备译者。<strong>核心成员</strong>:做出重大贡献者列入核心成员。可执行日常管理任务。荣誉成员:长期休眠的核心成员列入荣誉成员。荣誉成员被收回写入权限,但保留投票权和历史荣誉。<strong>管理委员</strong>:由核心成员中选出,对 LCTT 事务进行表决和决策,并负责日常管理任务的最终执行。主席:由管理委员中选出,由现任管理委员进行选举。管理委员组成管理委员会(PMC),对 LCTT 的发展事务进行决策和执行。主要负责:制定和优化贡献流程和制度提名和投票 LCTT 核心成员、荣誉成员和主席成员管理兜底负责核心成员的管理事务而核心译者作为 LCTT 的中坚力量,除了参与翻译活动之外,还具有如下职权:…
在 Linux 上自定义 bash 命令提示符
尽管很多插件或工具都可以很轻易地满足这一需求,但我们也可以不使用插件和工具,自己手动自定义一些基本的显示方式,例如添加或者修改某些元素、更改前景色、更改背景色等等。Media
via https://linux.cn/article-10280-1.html
尽管很多插件或工具都可以很轻易地满足这一需求,但我们也可以不使用插件和工具,自己手动自定义一些基本的显示方式,例如添加或者修改某些元素、更改前景色、更改背景色等等。Media
via https://linux.cn/article-10280-1.html
在 Linux 上自定义 bash 命令提示符
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/27/111117mkydge86ndem2xfp.jpg">Media</a>众所周知,<strong>bash</strong>(the <strong>B</strong>ourne-<strong>A</strong>gain <strong>Sh</strong>ell)是目前绝大多数 Linux 发行版使用的默认 shell。本文将会介绍如何通过添加颜色和样式来自定义 bash 命令提示符的显示。尽管很多插件或工具都可以很轻易地满足这一需求,但我们也可以不使用插件和工具,自己手动自定义一些基本的显示方式,例如添加或者修改某些元素、更改前景色、更改背景色等等。在 Linux 中自定义 bash 命令提示符在 bash 中,我们可以通过更改 $PS1 环境变量的值来自定义 bash 命令提示符。一般情况下,bash 命令提示符会是以下这样的形式:<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/27/111320oltgbmz8l3eg891u.png">Media</a>在上图这种默认显示形式当中,“sk” 是我的用户名,而 “ubuntuserver” 是我的主机名。只要插入一些以反斜杠开头的特殊转义字符串,就可以按照你的喜好修改命令提示符了。下面我来举几个例子。在开始之前,我强烈建议你预先备份 ~/.bashrc 文件。<pre class="prettyprint linenums">$ cp ~/.bashrc ~/.bashrc.bak</pre>更改 bash 命令提示符中的 username@hostname 部分如上所示,bash 命令提示符一般都带有 “username@hostname” 部分,这个部分是可以修改的。只需要编辑 ~/.bashrc 文件:<pre class="prettyprint linenums">$ vi ~/.bashrc</pre>在文件的最后添加一行:<pre class="prettyprint linenums">PS1="ostechnix> "</pre>将上面的 “ostechnix” 替换为任意一个你想使用的单词,然后按 ESC 并输入 :wq 保存、退出文件。执行以下命令使刚才的修改生效:<pre class="prettyprint linenums">$ source ~/.bashrc</pre>你就…
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/27/111117mkydge86ndem2xfp.jpg">Media</a>众所周知,<strong>bash</strong>(the <strong>B</strong>ourne-<strong>A</strong>gain <strong>Sh</strong>ell)是目前绝大多数 Linux 发行版使用的默认 shell。本文将会介绍如何通过添加颜色和样式来自定义 bash 命令提示符的显示。尽管很多插件或工具都可以很轻易地满足这一需求,但我们也可以不使用插件和工具,自己手动自定义一些基本的显示方式,例如添加或者修改某些元素、更改前景色、更改背景色等等。在 Linux 中自定义 bash 命令提示符在 bash 中,我们可以通过更改 $PS1 环境变量的值来自定义 bash 命令提示符。一般情况下,bash 命令提示符会是以下这样的形式:<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/27/111320oltgbmz8l3eg891u.png">Media</a>在上图这种默认显示形式当中,“sk” 是我的用户名,而 “ubuntuserver” 是我的主机名。只要插入一些以反斜杠开头的特殊转义字符串,就可以按照你的喜好修改命令提示符了。下面我来举几个例子。在开始之前,我强烈建议你预先备份 ~/.bashrc 文件。<pre class="prettyprint linenums">$ cp ~/.bashrc ~/.bashrc.bak</pre>更改 bash 命令提示符中的 username@hostname 部分如上所示,bash 命令提示符一般都带有 “username@hostname” 部分,这个部分是可以修改的。只需要编辑 ~/.bashrc 文件:<pre class="prettyprint linenums">$ vi ~/.bashrc</pre>在文件的最后添加一行:<pre class="prettyprint linenums">PS1="ostechnix> "</pre>将上面的 “ostechnix” 替换为任意一个你想使用的单词,然后按 ESC 并输入 :wq 保存、退出文件。执行以下命令使刚才的修改生效:<pre class="prettyprint linenums">$ source ~/.bashrc</pre>你就…
如何在 Anbox 上安装 Google Play 商店及启用 ARM 支持
Anbox (Anroid in a Box)是一个自由开源工具,它允许你在 Linux 上运行 Android 应用程序。默认情况下,Anbox 没有 Google Play 商店或 ARM 应用支持。Media
via https://linux.cn/article-10281-1.html
Anbox (Anroid in a Box)是一个自由开源工具,它允许你在 Linux 上运行 Android 应用程序。默认情况下,Anbox 没有 Google Play 商店或 ARM 应用支持。Media
via https://linux.cn/article-10281-1.html
如何在 Anbox 上安装 Google Play 商店及启用 ARM 支持
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/27/115100j1mj9blltf1njvav.png">Media<a href="https://anbox.io/">Anbox (Anroid in a Box)是一个自由开源工具,它允许你在 Linux 上运行 Android 应用程序。它的工作原理是在 LXC 容器中运行 Android 运行时环境,重新创建 Android 的目录结构作为可挂载的 loop 镜像,同时使用本机 Linux 内核来执行应用。据其网站所述,它的主要特性是安全性、性能、集成和趋同(不同外形尺寸缩放)。使用 Anbox,每个 Android 应用或游戏就像系统应用一样都在一个单独的窗口中启动,它们的行为或多或少类似于常规窗口,显示在启动器中,可以平铺等等。默认情况下,Anbox 没有 Google Play 商店或 ARM 应用支持。要安装应用,你必须下载每个应用的 APK 并使用 adb 手动安装。此外,默认情况下不能使用 Anbox 安装 ARM 应用或游戏 —— 尝试安装 ARM 应用会显示以下错误:<pre class="prettyprint linenums">Failed to install PACKAGE.NAME.apk: Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113]</pre>你可以在 Anbox 中手动设置 Google Play 商店和 ARM 应用支持(通过 libhoudini),但这是一个非常复杂的过程。为了更容易地在 Anbox 上安装 Google Play 商店和 Google Play 服务,并让它支持 ARM 应用程序和游戏(使用 libhoudini),<a href="https://geeks-r-us.de/2017/08/26/android-apps-auf-dem-linux-desktop/">geeks-r-us.de(文章是德语)上的人创建了一个自动执行这些任务的脚本。在使用之前,我想明确指出,即使在集成 libhoudini 来支持 ARM 后,也并非所有 Android 应用和游戏都能在 Anbox 中运行。某些 Android 应用和游戏可能根本不会出现在 Google Play 商&#…
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/27/115100j1mj9blltf1njvav.png">Media<a href="https://anbox.io/">Anbox (Anroid in a Box)是一个自由开源工具,它允许你在 Linux 上运行 Android 应用程序。它的工作原理是在 LXC 容器中运行 Android 运行时环境,重新创建 Android 的目录结构作为可挂载的 loop 镜像,同时使用本机 Linux 内核来执行应用。据其网站所述,它的主要特性是安全性、性能、集成和趋同(不同外形尺寸缩放)。使用 Anbox,每个 Android 应用或游戏就像系统应用一样都在一个单独的窗口中启动,它们的行为或多或少类似于常规窗口,显示在启动器中,可以平铺等等。默认情况下,Anbox 没有 Google Play 商店或 ARM 应用支持。要安装应用,你必须下载每个应用的 APK 并使用 adb 手动安装。此外,默认情况下不能使用 Anbox 安装 ARM 应用或游戏 —— 尝试安装 ARM 应用会显示以下错误:<pre class="prettyprint linenums">Failed to install PACKAGE.NAME.apk: Failure [INSTALL_FAILED_NO_MATCHING_ABIS: Failed to extract native libraries, res=-113]</pre>你可以在 Anbox 中手动设置 Google Play 商店和 ARM 应用支持(通过 libhoudini),但这是一个非常复杂的过程。为了更容易地在 Anbox 上安装 Google Play 商店和 Google Play 服务,并让它支持 ARM 应用程序和游戏(使用 libhoudini),<a href="https://geeks-r-us.de/2017/08/26/android-apps-auf-dem-linux-desktop/">geeks-r-us.de(文章是德语)上的人创建了一个自动执行这些任务的脚本。在使用之前,我想明确指出,即使在集成 libhoudini 来支持 ARM 后,也并非所有 Android 应用和游戏都能在 Anbox 中运行。某些 Android 应用和游戏可能根本不会出现在 Google Play 商&#…
2018 重温 Unix 哲学
在现代微服务环境中,构建小型、单一的应用程序的旧策略又再一次流行了起来。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/27/123158rm6qqqjgdffp16dm.jpg">Media</a>1984 年,Rob Pike 和 Brian W. Kernighan 在 AT&T 贝尔实验室技术期刊上发表了名为 “<a href="http://harmful.cat-v.org/cat-v/">Unix 环境编程</a>” 的文章,其中他们使用 BSD 的 cat -v 例子来认证 Unix 哲学。简而言之,Unix 哲学是:构建小型、单一的应用程序 —— 不管用什么语言 —— 只做一件小而美的事情,用 stdin / stdout 进行通信,并通过管道进行连接。听起来是不是有点耳熟?是的,我也这么认为。这就是 James Lewis 和 Martin Fowler 给出的 <a href="https://martinfowler.com/articles/microservices.html">微服务的定义</a> 。简单来说,微服务架构的风格是将单个 应用程序开发为一套小型服务的方法,每个服务都运行在它的进程中,并用轻量级机制进行通信,通常是 HTTP 资源 API 。虽然一个 *nix 程序或者是一个微服务本身可能非常局限甚至不是很有用,但是当这些独立工作的单元组合在一起的时候就显示出了它们真正的好处和强大。*nix程序 vs 微服务下面的表格对比了 *nix 环境中的程序(例如 cat 或 lsof)与微服务环境中的程序。 *nix 程序微服务执行单元程序使用 stdin/stdout使用 HTTP 或 gRPC API数据流管道?可配置和参数化命令行参数、环境变量和配置文件JSON/YAML 文档发现包管理器、man、makeDNS、环境变量、OpenAPI让我们详细的看看每一行。执行单元*nix 系统(如 Linux)中的执行单元是一个可执行的文件(二进制或者…
在现代微服务环境中,构建小型、单一的应用程序的旧策略又再一次流行了起来。<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/27/123158rm6qqqjgdffp16dm.jpg">Media</a>1984 年,Rob Pike 和 Brian W. Kernighan 在 AT&T 贝尔实验室技术期刊上发表了名为 “<a href="http://harmful.cat-v.org/cat-v/">Unix 环境编程</a>” 的文章,其中他们使用 BSD 的 cat -v 例子来认证 Unix 哲学。简而言之,Unix 哲学是:构建小型、单一的应用程序 —— 不管用什么语言 —— 只做一件小而美的事情,用 stdin / stdout 进行通信,并通过管道进行连接。听起来是不是有点耳熟?是的,我也这么认为。这就是 James Lewis 和 Martin Fowler 给出的 <a href="https://martinfowler.com/articles/microservices.html">微服务的定义</a> 。简单来说,微服务架构的风格是将单个 应用程序开发为一套小型服务的方法,每个服务都运行在它的进程中,并用轻量级机制进行通信,通常是 HTTP 资源 API 。虽然一个 *nix 程序或者是一个微服务本身可能非常局限甚至不是很有用,但是当这些独立工作的单元组合在一起的时候就显示出了它们真正的好处和强大。*nix程序 vs 微服务下面的表格对比了 *nix 环境中的程序(例如 cat 或 lsof)与微服务环境中的程序。 *nix 程序微服务执行单元程序使用 stdin/stdout使用 HTTP 或 gRPC API数据流管道?可配置和参数化命令行参数、环境变量和配置文件JSON/YAML 文档发现包管理器、man、makeDNS、环境变量、OpenAPI让我们详细的看看每一行。执行单元*nix 系统(如 Linux)中的执行单元是一个可执行的文件(二进制或者…
举例说明 alias 和 unalias 命令
一个记住这些如此长的命令的简便方式就是为这些命令创建一个别名。你可以为任何经常重复调用的常用命令创建别名,而不仅仅是长命令。Media
via https://linux.cn/article-10283-1.html
一个记住这些如此长的命令的简便方式就是为这些命令创建一个别名。你可以为任何经常重复调用的常用命令创建别名,而不仅仅是长命令。Media
via https://linux.cn/article-10283-1.html
举例说明 alias 和 unalias 命令
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/27/224429noagpp9h5hbi8bk8.jpg">Media</a>如果不是一个命令行重度用户的话,过了一段时间之后,你就可能已经忘记了这些复杂且冗长的 Linux 命令了。当然,有很多方法可以让你 <a href="https://www.ostechnix.com/easily-recall-forgotten-linux-commands/">回想起遗忘的命令</a>。你可以简单的 <a href="https://www.ostechnix.com/save-commands-terminal-use-demand/">保存常用的命令</a> 然后按需使用。也可以在终端里 <a href="https://www.ostechnix.com/bookmark-linux-commands-easier-repeated-invocation/">标记重要的命令</a>,然后在任何时候你想要的时间使用它们。而且,Linux 有一个内建命令 history 可以帮助你记忆这些命令。另外一个记住这些如此长的命令的简便方式就是为这些命令创建一个别名。你可以为任何经常重复调用的常用命令创建别名,而不仅仅是长命令。通过这种方法,你不必再过多地记忆这些命令。这篇文章中,我们将会在 Linux 环境下举例说明 alias 和 unalias 命令。alias 命令alias 使用一个用户自定义的字符串来代替一个或者一串命令(包括多个选项、参数)。这个字符串可以是一个简单的名字或者缩写,不管这个命令原来多么复杂。alias 命令已经预装在 shell(包括 BASH、Csh、Ksh 和 Zsh 等) 当中。alias 的通用语法是:<pre class="prettyprint linenums">alias [alias-name[=string]...]</pre>接下来看几个例子。列出别名可能在你的系统中已经设置了一些别名。有些应用在你安装它们的时候可能已经自动创建了别名。要查看已经存在的别名,运行:<pre class="prettyprint linenums">$ alias</pre>或者,<pre class="prettyprint…
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/27/224429noagpp9h5hbi8bk8.jpg">Media</a>如果不是一个命令行重度用户的话,过了一段时间之后,你就可能已经忘记了这些复杂且冗长的 Linux 命令了。当然,有很多方法可以让你 <a href="https://www.ostechnix.com/easily-recall-forgotten-linux-commands/">回想起遗忘的命令</a>。你可以简单的 <a href="https://www.ostechnix.com/save-commands-terminal-use-demand/">保存常用的命令</a> 然后按需使用。也可以在终端里 <a href="https://www.ostechnix.com/bookmark-linux-commands-easier-repeated-invocation/">标记重要的命令</a>,然后在任何时候你想要的时间使用它们。而且,Linux 有一个内建命令 history 可以帮助你记忆这些命令。另外一个记住这些如此长的命令的简便方式就是为这些命令创建一个别名。你可以为任何经常重复调用的常用命令创建别名,而不仅仅是长命令。通过这种方法,你不必再过多地记忆这些命令。这篇文章中,我们将会在 Linux 环境下举例说明 alias 和 unalias 命令。alias 命令alias 使用一个用户自定义的字符串来代替一个或者一串命令(包括多个选项、参数)。这个字符串可以是一个简单的名字或者缩写,不管这个命令原来多么复杂。alias 命令已经预装在 shell(包括 BASH、Csh、Ksh 和 Zsh 等) 当中。alias 的通用语法是:<pre class="prettyprint linenums">alias [alias-name[=string]...]</pre>接下来看几个例子。列出别名可能在你的系统中已经设置了一些别名。有些应用在你安装它们的时候可能已经自动创建了别名。要查看已经存在的别名,运行:<pre class="prettyprint linenums">$ alias</pre>或者,<pre class="prettyprint…
如何在终端中浏览 Stack Overflow
你可以如你在 Google 搜索中那样直接用英语查询,然后它会使用 Google 和 Stackoverflow API 来搜索给定的查询。Media
via https://linux.cn/article-10284-1.html
你可以如你在 Google 搜索中那样直接用英语查询,然后它会使用 Google 和 Stackoverflow API 来搜索给定的查询。Media
via https://linux.cn/article-10284-1.html
如何在终端中浏览 Stack Overflow
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/27/234754jwxn6uz09e515frm.png">Media</a>前段时间,我们写了一篇关于 <a href="https://www.ostechnix.com/search-browse-stack-overflow-website-commandline/">SoCLI</a> 的文章,它是一个从命令行搜索和浏览 Stack Overflow 网站的 python 脚本。今天,我们将讨论一个名为 “how2” 的类似工具。它是一个命令行程序,可以从终端浏览 Stack Overflow。你可以如你在 <a href="https://www.ostechnix.com/google-search-navigator-enhance-keyboard-navigation-in-google-search/">Google 搜索</a>中那样直接用英语查询,然后它会使用 Google 和 Stackoverflow API 来搜索给定的查询。它是使用 NodeJS 编写的自由开源程序。使用 how2 从终端浏览 Stack Overflow由于 how2 是一个 NodeJS 包,我们可以使用 Npm 包管理器安装它。如果你尚未安装 Npm 和 NodeJS,请参考以下指南。在安装 Npm 和 NodeJS 后,运行以下命令安装 how2。<pre class="prettyprint linenums">$ npm install -g how2</pre>现在让我们看下如何使用这个程序浏览 Stack Overflow。使用 how2 搜索 Stack Overflow 站点的典型用法是:<pre class="prettyprint linenums">$ how2 <search-query></pre>例如,我将搜索如何创建 tgz 存档。<pre class="prettyprint linenums">$ how2 create archive tgz</pre>哎呀!我收到以下错误。<pre class="prettyprint linenums">/home/sk/.nvm/versions/node/v9.11.1/lib/node_modules/how2/node_modules/devnull/transports/transport.js:59Transport.prototype.__proto__ = EventEmitter.prototype; ^ TypeError: Cannot read property 'prototype' of undefined at Object.<anonymous> (/home/sk/.nvm/versions/node/v9.11.1/lib/node_modules/how2/node_modules/devnull/transports/transport.js:59:46) at Module._compile (internal/modules/cjs/loader.js:654:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:665:10) at Module.load (internal/modules/cjs/loader.js:566:32) at tryModuleLoad (internal/modules/cjs/loader.js:506:12) at Function.Module._load (internal/modules/cjs/loader.js:498:3) at Module.require (internal/modules/cjs/loader.js:598:17) at require (internal/modules/cjs/helpers.js:11:18) at Object.<anonymous> (/home/sk/.nvm/versions/node/v9.11.1/lib/node_modules/how2/node_modules/devnull/transports/stream.js:8:17) at Module._compile (internal/modules/cjs/loader.js:654:30)</pre>我可能遇到了一个 bug。我希望它在未来版本中得到修复。但是,我在<a href="https://github.com/santinic/how2/issues/79">这里</a>找到…
<a href="https://dn-linuxcn.qbox.me/data/attachment/album/201811/27/234754jwxn6uz09e515frm.png">Media</a>前段时间,我们写了一篇关于 <a href="https://www.ostechnix.com/search-browse-stack-overflow-website-commandline/">SoCLI</a> 的文章,它是一个从命令行搜索和浏览 Stack Overflow 网站的 python 脚本。今天,我们将讨论一个名为 “how2” 的类似工具。它是一个命令行程序,可以从终端浏览 Stack Overflow。你可以如你在 <a href="https://www.ostechnix.com/google-search-navigator-enhance-keyboard-navigation-in-google-search/">Google 搜索</a>中那样直接用英语查询,然后它会使用 Google 和 Stackoverflow API 来搜索给定的查询。它是使用 NodeJS 编写的自由开源程序。使用 how2 从终端浏览 Stack Overflow由于 how2 是一个 NodeJS 包,我们可以使用 Npm 包管理器安装它。如果你尚未安装 Npm 和 NodeJS,请参考以下指南。在安装 Npm 和 NodeJS 后,运行以下命令安装 how2。<pre class="prettyprint linenums">$ npm install -g how2</pre>现在让我们看下如何使用这个程序浏览 Stack Overflow。使用 how2 搜索 Stack Overflow 站点的典型用法是:<pre class="prettyprint linenums">$ how2 <search-query></pre>例如,我将搜索如何创建 tgz 存档。<pre class="prettyprint linenums">$ how2 create archive tgz</pre>哎呀!我收到以下错误。<pre class="prettyprint linenums">/home/sk/.nvm/versions/node/v9.11.1/lib/node_modules/how2/node_modules/devnull/transports/transport.js:59Transport.prototype.__proto__ = EventEmitter.prototype; ^ TypeError: Cannot read property 'prototype' of undefined at Object.<anonymous> (/home/sk/.nvm/versions/node/v9.11.1/lib/node_modules/how2/node_modules/devnull/transports/transport.js:59:46) at Module._compile (internal/modules/cjs/loader.js:654:30) at Object.Module._extensions..js (internal/modules/cjs/loader.js:665:10) at Module.load (internal/modules/cjs/loader.js:566:32) at tryModuleLoad (internal/modules/cjs/loader.js:506:12) at Function.Module._load (internal/modules/cjs/loader.js:498:3) at Module.require (internal/modules/cjs/loader.js:598:17) at require (internal/modules/cjs/helpers.js:11:18) at Object.<anonymous> (/home/sk/.nvm/versions/node/v9.11.1/lib/node_modules/how2/node_modules/devnull/transports/stream.js:8:17) at Module._compile (internal/modules/cjs/loader.js:654:30)</pre>我可能遇到了一个 bug。我希望它在未来版本中得到修复。但是,我在<a href="https://github.com/santinic/how2/issues/79">这里</a>找到…