2018年9月

当在备份重要文件和通过网络发送大文件的时候,对文件进行压缩非常有用。请注意,压缩一个已经压缩过的文件会增加额外开销,因此你将会得到一个更大一些的文件。所以,请不要压缩已经压缩过的文件。在 GNU/Linux 中,有许多程序可以用来压缩和解压缩文件。在这篇教程中,我们仅学习其中两个应用程序。

在类 Unix 系统中,最常见的用来压缩文件的程序是:

  1. gzip
  2. bzip2

1. 使用 gzip 程序来压缩和解压缩文件

gzip 是一个使用 Lempel-Ziv 编码(LZ77)算法来压缩和解压缩文件的实用工具。

1.1 压缩文件

如果要压缩一个名为 ostechnix.txt 的文件,使之成为 gzip 格式的压缩文件,那么只需运行如下命令:

$ gzip ostechnix.txt

上面的命令运行结束之后,将会出现一个名为 ostechnix.txt.gz 的 gzip 格式压缩文件,代替了原始的 ostechnix.txt 文件。

gzip 命令还可以有其他用法。一个有趣的例子是,我们可以将一个特定命令的输出通过管道传递,然后作为 gzip 程序的输入来创建一个压缩文件。看下面的命令:

$ ls -l Downloads/ | gzip > ostechnix.txt.gz

上面的命令将会创建一个 gzip 格式的压缩文件,文件的内容为 Downloads 目录的目录项。

1.2 压缩文件并将输出写到新文件中(不覆盖原始文件)

默认情况下,gzip 程序会压缩给定文件,并以压缩文件替代原始文件。但是,你也可以保留原始文件,并将输出写到标准输出。比如,下面这个命令将会压缩 ostechnix.txt 文件,并将输出写入文件 output.txt.gz

$ gzip -c ostechnix.txt > output.txt.gz

类似地,要解压缩一个 gzip 格式的压缩文件并指定输出文件的文件名,只需运行:

$ gzip -c -d output.txt.gz > ostechnix1.txt

上面的命令将会解压缩 output.txt.gz 文件,并将输出写入到文件 ostechnix1.txt 中。在上面两个例子中,原始文件均不会被删除。

1.3 解压缩文件

如果要解压缩 ostechnix.txt.gz 文件,并以原始未压缩版本的文件来代替它,那么只需运行:

$ gzip -d ostechnix.txt.gz

我们也可以使用 gunzip 程序来解压缩文件:

$ gunzip ostechnix.txt.gz

1.4 在不解压缩的情况下查看压缩文件的内容

如果你想在不解压缩的情况下,使用 gzip 程序查看压缩文件的内容,那么可以像下面这样使用 -c 选项:

$ gunzip -c ostechnix1.txt.gz

或者,你也可以像下面这样使用 zcat 程序:

$ zcat ostechnix.txt.gz

你也可以通过管道将输出传递给 less 命令,从而一页一页的来查看输出,就像下面这样:

$ gunzip -c ostechnix1.txt.gz | less
$ zcat ostechnix.txt.gz | less

另外,zless 程序也能够实现和上面的管道同样的功能。

$ zless ostechnix1.txt.gz

1.5 使用 gzip 压缩文件并指定压缩级别

gzip 的另外一个显著优点是支持压缩级别。它支持下面给出的 3 个压缩级别:

  • 1 – 最快 (最差)
  • 9 – 最慢 (最好)
  • 6 – 默认级别

要压缩名为 ostechnix.txt 的文件,使之成为“最好”压缩级别的 gzip 压缩文件,可以运行:

$ gzip -9 ostechnix.txt

1.6 连接多个压缩文件

我们也可以把多个需要压缩的文件压缩到同一个文件中。如何实现呢?看下面这个例子。

$ gzip -c ostechnix1.txt > output.txt.gz
$ gzip -c ostechnix2.txt >> output.txt.gz

上面的两个命令将会压缩文件 ostechnix1.txtostechnix2.txt,并将输出保存到一个文件 output.txt.gz 中。

你可以通过下面其中任何一个命令,在不解压缩的情况下,查看两个文件 ostechnix1.txtostechnix2.txt 的内容:

$ gunzip -c output.txt.gz
$ gunzip -c output.txt
$ zcat output.txt.gz
$ zcat output.txt

如果你想了解关于 gzip 的更多细节,请参阅它的 man 手册。

$ man gzip

2. 使用 bzip2 程序来压缩和解压缩文件

bzip2gzip 非常类似,但是 bzip2 使用的是 Burrows-Wheeler 块排序压缩算法,并使用 哈夫曼 Huffman 编码。使用 bzip2 压缩的文件以 “.bz2” 扩展结尾。

正如我上面所说的, bzip2 的用法和 gzip 几乎完全相同。只需在上面的例子中将 gzip 换成 bzip2,将 gunzip 换成 bunzip2,将 zcat 换成 bzcat 即可。

要使用 bzip2 压缩一个文件,并以压缩后的文件取而代之,只需运行:

$ bzip2 ostechnix.txt

如果你不想替换原始文件,那么可以使用 -c 选项,并把输出写入到新文件中。

$ bzip2 -c ostechnix.txt > output.txt.bz2

如果要解压缩文件,则运行:

$ bzip2 -d ostechnix.txt.bz2

或者,

$ bunzip2 ostechnix.txt.bz2

如果要在不解压缩的情况下查看一个压缩文件的内容,则运行:

$ bunzip2 -c ostechnix.txt.bz2

或者,

$ bzcat ostechnix.txt.bz2

如果你想了解关于 bzip2 的更多细节,请参阅它的 man 手册。

$ man bzip2

总结

在这篇教程中,我们学习了 gzipbzip2 程序是什么,并通过 GNU/Linux 下的一些例子学习了如何使用它们来压缩和解压缩文件。接下来,我们将要学习如何在 Linux 中将文件和目录归档。

干杯!


via: https://www.ostechnix.com/how-to-compress-and-decompress-files-in-linux/

作者:SK 选题:lujun9972 译者:ucasFL 校对:wxy

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

这些库可以使你更容易构架个人项目。

在 Python/Django 的世界里有这样一个谚语:为语言而来,为社区而留。对绝大多数人来说的确是这样的,但是,还有一件事情使得我们一直停留在 Python 的世界里,不愿离开,那就是我们可以很容易地利用一顿午餐或晚上几个小时的时间,把一个想法快速地实现出来。

这个月,我们来探讨一些我们喜欢用来快速完成 业余项目 side projects 或打发午餐时间的 Python 库。

在数据库中即时保存数据:Dataset

当我们想要在不知道最终数据库表长什么样的情况下,快速收集数据并保存到数据库中的时候,Dataset 库将是我们的最佳选择。Dataset 库有一个简单但功能强大的 API,因此我们可以很容易的把数据保存下来,之后再进行整理。

Dataset 建立在 SQLAlchemy 之上,所以如果需要对它进行扩展,你会感到非常熟悉。使用 Django 内建的 inspectdb 管理命令可以很容易地把底层数据库模型导入 Django 中,这使得和现有数据库一同工作不会出现任何障碍。

从网页抓取数据:Beautiful Soup

Beautiful Soup(一般写作 BS4)库使得从 HTML 网页中提取信息变得非常简单。当我们需要把非结构化或弱结构化的 HTML 转换为结构化数据的时候,就需要使用 Beautiful Soup 。用它来处理 XML 数据也是一个很好的选择,否则 XML 的可读性或许会很差。

和 HTTP 内容打交道:Requests

当需要和 HTTP 内容打交道的时候,Requests 毫无疑问是最好的标准库。当我们想要抓取 HTML 网页或连接 API 的时候,都离不开 Requests 库。同时,它也有很好的文档。

编写命令行工具:Click

当需要写一个简单的 Python 脚本作为命令行工具的时候,Click 是我最喜欢用的库。它的 API 非常直观,并且在实现时经过了深思熟虑,我们只需要记住很少的几个模式。它的文档也很优秀,这使得学习其高级特性更加容易。

对事物命名:Python Slugify

众所周知,命名是一件困难的事情。Python Slugify 是一个非常有用的库,它可以把一个标题或描述转成一个带有特性的唯一标识符。如果你正在做一个 Web 项目,并且你想要使用对 搜索引擎优化友好 SEO-friendly 的链接,那么,使用 Python Slugify 可以让这件事变得很容易。

和插件打交道:Pluggy

Pluggy 库相对较新,但是如果你想添加一个插件系统到现有应用中,那么使用 Pluggy 是最好也是最简单的方式。如果你使用过 pytest,那么实际上相当于已经使用过 Pluggy 了,虽然你还不知道它。

把 CSV 文件转换到 API 中:DataSette

DataSette 是一个神奇的工具,它可以很容易地把 CSV 文件转换为全特性的只读 REST JSON API,同时,不要把它和 Dataset 库混淆。Datasette 有许多特性,包括创建图表和 geo(用于创建交互式地图),并且很容易通过容器或第三方网络主机进行部署。

处理环境变量等:Envparse

如果你不想在源代码中保存 API 密钥、数据库凭证或其他敏感信息,那么你便需要解析环境变量,这时候 envparse 是最好的选择。Envparse 能够处理环境变量、ENV 文件、变量类型,甚至还可以进行预处理和后处理(例如,你想要确保变量名总是大写或小写的)。

有什么你最喜欢的用于业余项目的 Python 库不在这个列表中吗?请在评论中和我们分享。


via: https://opensource.com/article/18/9/python-libraries-side-projects

作者:Jeff Triplett 选题:lujun9972 译者:ucasFL 校对:wxy

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

你或许已经注意到了,在 Linux 上使用 Google Chrome 或 Chromium 浏览器在 YouTube 或其它类似网站观看高清视频会增加你的 CPU 使用率,如果你用的是笔记本,电脑会发热而且电池会很快用完。这是因为 Chrome/Chromium(Firefox 也是如此,但是 Firefox 的问题没有办法解决)在 Linux 上不支持硬件加速的视频解码。

这篇文章讲述了如何在 Linux 环境安装带有 VA-API 补丁的 Chromium 开发版,它支持 GPU 加速的视频解码,可以显著减少观看在线高清视频时的 CPU 使用率,这篇教程只适用于 Intel 和 Nvidia 的显卡,我没有 ATI/AMD 的显卡可以试验,也没有使用过这几种显卡。

这是 Chromium 浏览器在 Ubuntu18.04 中,在没有 GPU 加速视频解码的情况下播放一个 1080p 的 YouTube 视频:

这是带有 VA-API 补丁的 Chromium 浏览器在 Ubuntu18.04 中,在带有 GPU 加速视频解码的情况下播放同样的 1080p 的 YouTube 视频:

注意截图中的 CPU 使用率。两张截图都是在我老旧而依然强大的桌面计算机上捕捉的。在我的笔记本电脑上,没有硬件加速的 Chromium 带来更高的 CPU 使用率。

“只需 VA-API 即可在 Linux 启用 VAVDA、VAVEA 和 VAJDA” 这个补丁在一年多以前就提交给了 Chromium,但是它还没有合并。

Chrome 有一个选项可以覆盖软件渲染列表(#ignore-gpu-blacklist),但是这个选项不能启用硬件加速的视频解码。启用这个选项以后,你或许会在访问 chrome://gpu 时发现这些信息:“Video Decode: Hardware accelerated “,然而这个并不意味着真的可以工作。在 YouTube 打开一个高清视频并用诸如 htop 的工具查看 CPU 使用率(这是我在以上截图中用来查看 CPU 使用率的)。因为 GPU 视频解码没有真的被启用,你应该看到较高的 CPU 使用率。下面有一个部分是关于检查你是否真的在使用硬件加速的视频解码的。

文中使用的 Chromium 浏览器 Ubuntu 版启用 VA-API 的补丁在这个地址可以获得

在 Ubuntu 和 Linux Mint 安装和使用带有 VA-API 支持的 Chromium 浏览器

每个人都该知道 Chromium 开发版本没有理想中那么稳定。所以你可能发现 bug,它可能会发生崩溃等情况。它现在可能正常运行,但是谁知道几次更新以后会发生什么。

还有,如果你想启用 Widevine 支持(这样你才能观看 Netflix 视频和 YouTube 付费视频),Chromium dev 分支 PPA 要求你执行一些额外步骤。 如果你想要一些功能,比如同步,也是如此(需要注册 API 密钥还要在你的系统上设置好)。执行这些任务的说明在 Chromium 开发版本的 PPA 中有详细解释。

对于 Nvidia 显卡,vdpau 视频驱动程序需要更新以便显示 vaQuerySurfaceAttributes。所以 Nvidia 需要使用打过补丁的 vdpau-va-driver。值得庆幸的是,Chromium-dev PPA 提供了这个打过补丁的包。

带有 VA-API 补丁的 Chromium 也可用于其它 Linux 发行版,在第三方仓库,比如说 Arch Linux(对于 Nvidia 你需要这个补丁过的 libva-vdpau-driver)。如果你不使用 Ubuntu 或 Linux Mint,你得自己找那些包。

1、安装带有 VA-API 补丁的 Chromium

有一个带 VA-API 补丁的 Chromium Beta PPA,但是它缺少适用于 Ubuntu 18.04 的 vdpau-video。如果你需要,你可以使用这个 Beta PPA,而不是我在下面的步骤中使用 Dev PPA,不过如果你使用 Nvidia 显卡,你需要从这个 Dev PPA 中下载安装 vdpau-va-driver,并确认 Ubuntu/Linux Mint 不更新这个包(有点复杂,如果你准备根据下面步骤使用 Dev PPA 的话,不需要手动做这些)。

你可以添加 Chromium 开发分支 PPA,并在 Ubuntu 或 Linux Mint(及其它基于 Ubuntu 的发行版,如 elementary,以及 Ubuntu 或 Linux Mint 的风味版,如 Xubuntu、Kubuntu、Ubuntu MATE、Linux Mint MATE 等等)上安装最新的 Chromium 浏览器开发版:

sudo add-apt-repository ppa:saiarcot895/chromium-dev
sudo apt-get update
sudo apt install chromium-browser

2、安装 VA-API 驱动

对于 Intel 的显卡,你需要安装 i965-va-driver 这个包(它可能早就安装好了)

sudo apt install i965-va-driver

对于 Nvidia 的显卡(在开源的 Nouveau 驱动和闭源的 Nvidia 驱动上,它应该都有效), 安装 vdpau-va-driver

sudo apt install vdpau-va-driver

3、在 Chromium 启用硬件加速视频选项

复制这串地址,粘贴进 Chromium 的 URL 栏: chrome://flags/#enable-accelerated-video (或者在 chrome://flags 搜索 Hardware-accelerated video )并启用它,然后重启 Chromium 浏览器。

在默认的 Google Chrome / Chromium 版本,这个选项不可用,但是你可以在启用了 VP-API 的 Chromium 版本启用它。

4、安装 h264ify Chrome 扩展

YouTube(可能还有其它一些网址也是如此)默认使用 VP8 或 VP9 编码解码器,许多 GPU 不支持这种编码解码器的硬件解码。h264ify 会强制 YouTube 使用大多数 GPU 都支持的 H.264 而不是 VP8/VP9。

这个扩展还能阻塞 60fps 的视频,对低性能机器有用。

你可以在视频上右键点击,并且选择 Stats for nerds 以查看 Youtube 视频所使用额编码解码器,如果启用了 h264ify 扩展,你可以看到编码解码器是 avc / mp4a。如果没有启用,编码解码器应该是 vp09 / opus。

如何检查 Chromium 是否在使用 GPU 视频解码

在 YouTube 打开一个视频,然后,在 Chromium 打开一个新的标签页并将以下地址输入 URL 栏:chrome://media-internals

chrome://media-internals 标签页中,点击视频的 URL(为了展开它), 往下滚动查看 Player Properties 的下面,你应该可以找到 video_decoder 属性。如果video_decoder 的值是 GpuVideoDecoder ,这说明当前在另一个标签页播放的 YouTube 视频正在使用硬件加速的的视频解码。

如果它显示的是 FFmpegVideoDecoderVpxVideoDecoder ,说明加速视频解码无效或者你忘记安装或禁用了 h264ify 这个 Chrome 扩展。

如果无效,你可以通过在命令行运行 chromium-browser ,通过查看是否有 VA-API 相关的错误显示出来以调试。你也可以运行 vainfo(在 Ubuntu 或 Linux Mint 上安装:sudo apt install vainfo)和 vdpauinfo (对于 Nvidia,在 Ubuntu 或 Linux Mint 上安装:sudo apt install vdpauinfo)并且查看是否有显示任何错误。


via: https://www.linuxuprising.com/2018/08/how-to-enable-hardware-accelerated.html

作者:Logix 选题:lujun9972 译者:GraveAccent 校对:wxy

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

Docker 是一个开源项目,为开发人员和系统管理员提供了一个开放平台,可以将应用程序构建、打包为一个轻量级容器,并在任何地方运行。Docker 会在软件容器中自动部署应用程序。

Django 是一个用 Python 编写的 Web 应用程序框架,遵循 MVC(模型-视图-控制器)架构。它是免费的,并在开源许可下发布。它速度很快,旨在帮助开发人员尽快将他们的应用程序上线。

在本教程中,我将逐步向你展示在 Ubuntu 16.04 中如何为现有的 Django 应用程序创建 docker 镜像。我们将学习如何 docker 化一个 Python Django 应用程序,然后使用一个 docker-compose 脚本将应用程序作为容器部署到 docker 环境。

为了部署我们的 Python Django 应用程序,我们需要其它 docker 镜像:一个用于 Web 服务器的 nginx docker 镜像和用于数据库的 PostgreSQL 镜像。

我们要做什么?

  1. 安装 Docker-ce
  2. 安装 Docker-compose
  3. 配置项目环境
  4. 构建并运行
  5. 测试

步骤 1 - 安装 Docker-ce

在本教程中,我们将从 docker 仓库安装 docker-ce 社区版。我们将安装 docker-ce 社区版和 docker-compose(其支持 compose 文件版本 3)。

在安装 docker-ce 之前,先使用 apt 命令安装所需的 docker 依赖项。

sudo apt install -y \
    apt-transport-https \
    ca-certificates \
    curl \
    software-properties-common

现在通过运行以下命令添加 docker 密钥和仓库。

curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add -
sudo add-apt-repository \
   "deb [arch=amd64] https://download.docker.com/linux/ubuntu \
   $(lsb_release -cs) \
   stable"

安装 Docker-ce

更新仓库并安装 docker-ce。

sudo apt update
sudo apt install -y docker-ce

安装完成后,启动 docker 服务并使其能够在每次系统引导时启动。

systemctl start docker
systemctl enable docker

接着,我们将添加一个名为 omar 的新用户并将其添加到 docker 组。

useradd -m -s /bin/bash omar
usermod -a -G docker omar

启动 Docker

omar 用户身份登录并运行 docker 命令,如下所示。

su - omar
docker run hello-world

确保你能从 Docker 获得 hello-world 消息。

检查 Docker 安装

Docker-ce 安装已经完成。

步骤 2 - 安装 Docker-compose

在本教程中,我们将使用支持 compose 文件版本 3 的最新 docker-compose。我们将手动安装 docker-compose

使用 curl 命令将最新版本的 docker-compose 下载到 /usr/local/bin 目录,并使用 chmod 命令使其有执行权限。

运行以下命令:

sudo curl -L https://github.com/docker/compose/releases/download/1.21.0/docker-compose-$(uname -s)-$(uname -m) -o /usr/local/bin/docker-compose
sudo chmod +x /usr/local/bin/docker-compose

现在检查 docker-compose 版本。

docker-compose version

确保你安装的是最新版本的 docker-compose 1.21。

安装 Docker-compose

已安装支持 compose 文件版本 3 的 docker-compose 最新版本。

步骤 3 - 配置项目环境

在这一步中,我们将配置 Python Django 项目环境。我们将创建新目录 guide01,并使其成为我们项目文件的主目录,例如包括 Dockerfile、Django 项目、nginx 配置文件等。

登录到 omar 用户。

su - omar

创建一个新目录 guide01,并进入目录。

mkdir -p guide01
cd guide01/

现在在 guide01 目录下,创建两个新目录 projectconfig

mkdir project/ config/

注意:

  • project 目录:我们所有的 python Django 项目文件都将放在该目录中。
  • config 目录:项目配置文件的目录,包括 nginx 配置文件、python pip 的requirements.txt 文件等。

创建一个新的 requirements.txt 文件

接下来,使用 vim 命令在 config 目录中创建一个新的 requirements.txt 文件。

vim config/requirements.txt

粘贴下面的配置:

Django==2.0.4  
gunicorn==19.7.0  
psycopg2==2.7.4

保存并退出。

创建 Nginx 虚拟主机文件 django.conf

config 目录下创建 nginx 配置目录并添加虚拟主机配置文件 django.conf

mkdir -p config/nginx/
vim config/nginx/django.conf

粘贴下面的配置:

upstream web {
  ip_hash;
  server web:8000;
}
 
# portal
server {
  location / {
        proxy_pass http://web/;
  }
  listen 8000;
  server_name localhost;
 
  location /static {    
    autoindex on;    
    alias /src/static/;    
  }
}

保存并退出。

创建 Dockerfile

guide01 目录下创建新文件 Dockerfile

运行以下命令:

vim Dockerfile

现在粘贴下面的 Dockerfile 脚本:

FROM python:3.5-alpine
ENV PYTHONUNBUFFERED 1  

RUN apk update && \
    apk add --virtual build-deps gcc python-dev musl-dev && \
    apk add postgresql-dev bash

RUN mkdir /config  
ADD /config/requirements.txt /config/  
RUN pip install -r /config/requirements.txt
RUN mkdir /src
WORKDIR /src

保存并退出。

注意:

我们想要为我们的 Django 项目构建基于 Alpine Linux 的 Docker 镜像,Alpine 是最小的 Linux 版本。我们的 Django 项目将运行在带有 Python 3.5 的 Alpine Linux 上,并添加 postgresql-dev 包以支持 PostgreSQL 数据库。然后,我们将使用 python pip 命令安装在 requirements.txt 上列出的所有 Python 包,并为我们的项目创建新目录 /src

创建 Docker-compose 脚本

使用 vim 命令在 guide01 目录下创建 docker-compose.yml 文件。

vim docker-compose.yml

粘贴以下配置内容:

version: '3'
  services:
    db:
      image: postgres:10.3-alpine
      container_name: postgres01
    nginx:
      image: nginx:1.13-alpine
      container_name: nginx01
      ports:
        - "8000:8000"
      volumes:
        - ./project:/src
        - ./config/nginx:/etc/nginx/conf.d
      depends_on:
        - web
    web:
      build: .
      container_name: django01
      command: bash -c "python manage.py makemigrations && python manage.py migrate && python manage.py collectstatic --noinput && gunicorn hello_django.wsgi -b 0.0.0.0:8000"
      depends_on:
        - db
      volumes:
        - ./project:/src
      expose:
        - "8000"
      restart: always

保存并退出。

注意:

使用这个 docker-compose 文件脚本,我们将创建三个服务。使用 alpine Linux 版的 PostgreSQL 创建名为 db 的数据库服务,再次使用 alpine Linux 版的 Nginx 创建 nginx 服务,并使用从 Dockerfile 生成的自定义 docker 镜像创建我们的 python Django 容器。

配置项目环境

配置 Django 项目

将 Django 项目文件复制到 project 目录。

cd ~/django
cp -r * ~/guide01/project/

进入 project 目录并编辑应用程序设置 settings.py

cd ~/guide01/project/
vim hello_django/settings.py

注意:

我们将部署名为 “hello\_django” 的简单 Django 应用程序。

ALLOW_HOSTS 行中,添加服务名称 web

ALLOW_HOSTS = ['web']

现在更改数据库设置,我们将使用 PostgreSQL 数据库来运行名为 db 的服务,使用默认用户和密码。

DATABASES = {  
    'default': {
        'ENGINE': 'django.db.backends.postgresql_psycopg2',
        'NAME': 'postgres',
        'USER': 'postgres',
        'HOST': 'db',
        'PORT': 5432,
    }
}

至于 STATIC_ROOT 配置目录,将此行添加到文件行的末尾。

STATIC_ROOT = os.path.join(BASE_DIR, 'static/')

保存并退出。

配置 Django 项目

现在我们准备在 docker 容器下构建和运行 Django 项目。

步骤 4 - 构建并运行 Docker 镜像

在这一步中,我们想要使用 guide01 目录中的配置为我们的 Django 项目构建一个 Docker 镜像。

进入 guide01 目录。

cd ~/guide01/

现在使用 docker-compose 命令构建 docker 镜像。

docker-compose build

运行 docker 镜像

启动 docker-compose 脚本中的所有服务。

docker-compose up -d

等待几分钟让 Docker 构建我们的 Python 镜像并下载 nginx 和 postgresql docker 镜像。

使用 docker-compose 构建镜像

完成后,使用以下命令检查运行容器并在系统上列出 docker 镜像。

docker-compose ps
docker-compose images

现在,你将在系统上运行三个容器,列出 Docker 镜像,如下所示。

docke-compose ps 命令

我们的 Python Django 应用程序现在在 docker 容器内运行,并且已经创建了为我们服务的 docker 镜像。

步骤 5 - 测试

打开 Web 浏览器并使用端口 8000 键入服务器地址,我的是:http://ovh01:8000/

现在你将看到默认的 Django 主页。

默认 Django 项目主页

接下来,通过在 URL 上添加 /admin 路径来测试管理页面。

http://ovh01:8000/admin/

然后你将会看到 Django 管理登录页面。

Django administration

Docker 化 Python Django 应用程序已成功完成。

参考


via: https://www.howtoforge.com/tutorial/docker-guide-dockerizing-python-django-application/

作者:Muhammad Arul 译者:MjSeven 校对:wxy

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

这篇文章介绍 差异文件 diff 补丁文件 patch ,以及它们如何在开源项目中使用的例子。

如果你曾有机会在一个使用分布式开发模型的大型代码库上工作过,你就应该听说过类似下面的话,“Sue 刚发过来一个 补丁 patch ”,“Rajiv 正在 签出 checking out 差异 diff ”, 可能这些词(补丁、差异文件)对你而言很陌生,而你确定很想搞懂他们到底指什么。开源软件对上述提到的名词有很大的贡献,作为大型项目从 Apache web 服务器到 Linux 内核的开发模型,“基于补丁文件的开发” 这一模式贯穿了上述项目的始终。实际上,你可能不知道 Apache 的名字就来自“一系列的代码补丁”(LCTT 译注:Apache 英文发音和补丁的英文 patch 相似),它们被一一收集起来并针对原来的 NCSA HTTPd server source code 进行了修订。

你可能认为这只不过是些逸闻,但是一份早期的 Apache 网站的存档中 声称 Apache 的名字就是来自于最早的“补丁”集合;即“ 打了补丁的 APAtCHy ”服务器,简化为 Apache。

好了,言归正传,程序员嘴里说的“差异”和“补丁”到底是什么?

首先,在这篇文章里,我们可以认为这两个术语都指向同一个概念。“diff” 是 ”difference“ 的简写;Unix 下的同名工具程序 diff剖析了一个或多个文件之间的“差异”。下面我们会看到 diff 的例子:

一个“补丁”指的是文件之间一系列差异,这些差异能被 Unix 的 diff 程序应用在源代码树上。我们能使用 diff 工具来创建“差异”(或“补丁”),然后使用该工具将它们 “打” 在一个没有这个补丁的同样的源代码版本上。此外,(我又要开始跑题说些历史轶事了……),“补丁” 这个词真的指在计算机的早期使用打卡机的时候,用来覆盖在打孔纸带上来对软件进行修改的覆盖纸,那个时代打孔纸带就是在计算机处理器上运行的程序。下面来自 维基页面) 的这张图真切的描绘了最初的“打补丁”这个词的出处:

现在你对补丁和差异就了一个基本的概念,让我们来看看软件开发者是怎么使用这些工具的。如果你还没有使用过类似于 Gitsubversion 这样的源代码版本控制工具的话,我将会一步步展示最流行的软件项目是怎么使用它们的。如果你将一个软件的生命周期看成是一条时间线的话,你就能看见这个软件的点滴变化,比如在何时源代码加上了一个功能,在何时源代码修复了一个功能缺陷。我们称这些改变的点为“ 提交 commit ”,“提交”这个词被当今最流行的源代码版本管理工具 Git 所使用,当你想检查在一个提交前后的代码变化的话,(或者在许多个提交之间的代码变化),你都可以使用工具来观察文件差异。

如果你同样在使用 Git 开发软件的话,你可以在你的本地开发环境做些希望交给别的开发者的提交,以添加到他们的源代码树中。为了给别的开发者你的提交,一个方法就是创建一个你本地文件的差异文件,然后将这个“补丁”发送给和你工作在同一个源代码树的别的开发者。别的开发者在“打”了你的补丁之后,就能看到在你的代码变树上的变化。

Linux、Git 和 GitHub

这种分享补丁的开发模型正是现今 Linux 内核社区如何处理内核修改提议而采用的模型。如果你有机会浏览任何一个主流的 Linux 内核邮件列表 —— 主要是 LKML,也包括 linux-containersfs-develNetdev 等等,你能看到很多开发者会贴出他们想让其他内核开发者审核、测试或者合入 Linux 官方 Git 代码树某个位置的补丁。当然,讨论 Git 不在这篇文章范围之内(Git 是由 Linus Torvalds 开发的源代码控制系统,它支持分布式开发模型以及允许独立于主要代码仓库的补丁包,这些补丁包能被推送或拉取到不同的源代码树上,并遵守这些代码树各自的开发流程。)

在继续我们的话题之前,我们当然不能忽略和补丁和差异这个概念相关的最流行的服务:GitHub。从它的名字就能猜想出 GitHub 是基于 Git 的,而且它还围绕着 Git 对分布式开源代码开发模型提供了基于 Web 和 API 的工作流管理。(LCTT 译注:即 拉取请求 Pull Request )。在 GitHub 上,分享补丁的方式不是像 Linux 内核社区那样通过邮件列表,而是通过创建一个 拉取请求 。当你提交你自己的源代码树的改动时,你能通过创建一个针对软件项目的共享仓库的“拉取请求”来分享你的代码改动(LCTT 译注:即核心开发者维护一个主仓库,开发者去“ 复刻 fork ”这个仓库,待各自的提交后再创建针对这个主仓库的拉取请求,所有的拉取请求由主仓库的核心开发者批准后才能合入主代码库。)GitHub 被当今很多活跃的开源社区所采用,如 KubernetesDocker容器网络接口 (CNI)Istio 等等。在 GitHub 的世界里,用户会倾向于使用基于 Web 页面的方式来审核一个拉取请求里的补丁或差异,你也可以直接访问原始的补丁并在命令行上直接使用它们。

该说点干货了

我们前面已经讲了在流行的开源社区里是怎么应用补丁和差异的,现在看看一些例子。

第一个例子包括一个源代码树的两个不同副本,其中一个有代码改动,我们想用 diff 来看看这些改动是什么。这个例子里,我们想看的是“ 合并格式 unified ”的补丁,这是现在软件开发世界里最通用的格式。如果想知道更详细参数的用法以及如何生成差异文件,请参考 diff 手册。原始的代码在 sources-orig 目录,而改动后的代码在 sources-fixed 目录。如果要在你的命令行上用“合并格式”来展示补丁,请运行如下命令。(LCTT 译注:参数 -N 代表如果比较的文件不存在,则认为是个空文件, -a 代表将所有文件都作为文本文件对待,-u 代表使用合并格式并输出上下文,-r 代表递归比较目录)

$ diff -Naur sources-orig/ sources-fixed/

……下面是 diff 命令的输出:

diff -Naur sources-orig/officespace/interest.go sources-fixed/officespace/interest.go
--- sources-orig/officespace/interest.go        2018-08-10 16:39:11.000000000 -0400
+++ sources-fixed/officespace/interest.go       2018-08-10 16:39:40.000000000 -0400
@@ -11,15 +11,13 @@
   InterestRate float64
 }

+// compute the rounded interest for a transaction
 func computeInterest(acct *Account, t Transaction) float64 {

   interest := t.Amount * t.InterestRate
   roundedInterest := math.Floor(interest*100) / 100.0
   remainingInterest := interest - roundedInterest

-  // a little extra..
-  remainingInterest *= 1000
-
   // Save the remaining interest into an account we control:
   acct.Balance = acct.Balance + remainingInterest

最开始几行 diff 命令的输出可以这样解释:三个 --- 显示了原来文件的名字;任何在原文件(LCTT 译注:不是源文件)里存在而在新文件里不存在的行将会用前缀 -,用来表示这些行被从源代码里“减去”了。而 +++ 表示的则相反:在新文件里被加上的行会被放上前缀 +,表示这是在新文件里被“加上”的行。补丁文件中的每一个补丁“块”(用 @@ 作为前缀的的部分)都有上下文的行号,这能帮助补丁工具(或其它处理器)知道在代码的哪里应用这个补丁块。你能看到我们已经修改了“Office Space”这部电影里提到的那个函数(移除了三行并加上了一行代码注释),电影里那个有点贪心的工程师可是偷偷的在计算利息的函数里加了点“料”哦。(LCTT译注:剧情详情请见电影 https://movie.douban.com/subject/1296424/)

如果你想找人来测试你的代码改动,你可以将差异保存到一个补丁里:

$ diff -Naur sources-orig/ sources-fixed/ >myfixes.patch

现在你有补丁 myfixes.patch 了,你能把它分享给别的开发者,他们可以将这个补丁打在他们自己的源代码树上从而得到和你一样的代码并测试他们。如果一个开发者的当前工作目录就是他的源代码树的根的话,他可以用下面的命令来打补丁:

$ patch -p1 < ../myfixes.patch
patching file officespace/interest.go

现在这个开发者的源代码树已经打好补丁并准备好构建和测试文件的修改了。那么如果这个开发者在打补丁之前已经改动过了怎么办?只要这些改动没有直接冲突(LCTT 译注:比如改在同一行上),补丁工具就能自动的合并代码的改动。例如下面的interest.go 文件,它有其它几处改动,然后它想打上 myfixes.patch 这个补丁:

$ patch -p1 < ../myfixes.patch
patching file officespace/interest.go
Hunk #1 succeeded at 26 (offset 15 lines).

在这个例子中,补丁警告说代码改动并不在文件原来的地方而是偏移了 15 行。如果你文件改动的很厉害,补丁可能干脆说找不到要应用的地方,还好补丁程序提供了提供了打开“模糊”匹配的选项(这个选项在文档里有预置的警告信息,对其讲解已经超出了本文的范围)。

如果你使用 Git 或者 GitHub 的话,你可能不会直接使用补丁或差异。Git 已经内置了这些功能,你能使用这些功能和共享一个源代码树的其他开发者交互,拉取或合并代码。Git 一个比较相近的功能是可以使用 git diff 来对你的本地代码树生成全局差异,又或者对你的任意两次”引用“(可能是一个代表提交的数字,或一个标记或分支的名字,等等)做全局补丁。你甚至能简单的用管道将 git diff 的输出到一个文件里(这个文件必须严格符合将要被使用它的程序的输入要求),然后将这个文件交给一个并不使用 Git 的开发者应用到他的代码上。当然,GitHub 把这些功能放到了 Web 上,你能直接在 Web 页面上查看一个拉取请求的文件变动。在 Web 上你能看到所展示的合并差异,GitHub 还允许你将这些代码改动下载为原始的补丁文件。

总结

好了,你已经学到了”差异“和”补丁“是什么,以及在 Unix/Linux 上怎么使用命令行工具和它们交互。除非你还在像 Linux 内核开发这样的项目中工作而使用完全基于补丁文件的开发方式,你应该会主要通过你的源代码控制系统(如 Git)来使用补丁。但熟悉像 GitHub 这样的高级别工具的技术背景和技术底层对你的工作也是大有裨益的。谁知道会不会有一天你需要和一个来自 Linux 世界邮件列表的补丁包打交道呢?


via: https://opensource.com/article/18/8/diffs-patches

作者:Phil Estes 选题:lujun9972 译者:David Chen 校对:wxy

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

编者按:本系列区块链文章改编自网络文章,本文主要基于 Vegard Nordahl & Meghana Rao 的文章,并补充修订了部分内容。

我们为什么要写这个博客?

想象一下,你穿越到 1990 年代早期。当时,互联网还处于起步阶段,老百姓几乎没有理解它是如何运作的。

1993 年,全球互联网用户总数约为 1400 万,整个互联网由大约 130 个网站组成(ourworldindata.org)。大多数人都听说过互联网,但是对于绝大多数人来说,还很难看到它的前景。

1995 年左右,风险投资开始意识到万维网的巨大潜力,互联网从默默无闻变为主流。数百万美元投入到初创公司中,通常只包括一小部分程序员和一个涉及互联网的想法。尽管如此,人们对互联网还是持怀疑态度,大规模采用似乎还远未确定。

“我预测互联网将很快成为超新星,并在 1996 年灾难性地崩溃。”
—— 以太网发明者 Robert Metcalfe,InfoWorld,1995 年

“事实上,在线数据库不会取代你的日报,光盘不会可以取代一个称职的老师,计算机网络也不会改变政府的工作方式。”

  • 新闻周刊,1995年

一年后,互联网拥有了 7500 万用户。到 1999 年,它已在全球范围内增长到 2.8 亿用户。

两年后 Robert Metcalfe 在万维网大会上不得不“吃掉他的话”,他将他的专栏副本与一些水混合,在观众面前吃下去(wired)。而新闻周刊于 2012 年停止了纸质印刷,改为纯在线方式发售……

那么, Robert Metcalfe 和新闻周刊在互联网趋势的判断上出了什么问题呢?我们认为,他们严重低估了互联网减少低效从而提高人类创造价值的能力。互联网现在渗透到我们生活的各个方面的真正原因是它使得个人和企业的效率大大提高了。

今天,由于区块链这个技术创新的出现,人类又一次站在一个潜在的效率飞跃的十字路口。风投已开始意识到区块链的巨大潜力,向初创公司投入大量资金,这些公司通常只包括一小组程序员和一个涉及区块链的想法(weusecoins.com)。与此同时,老百姓对区块链的运作方式几乎没有了解。

本博客试图向小白们介绍区块链,让他们了解这项技术并教他们如何成为参与者。在本博客的过程中,我们将深入探讨区块链的一些技术方面,探索其用例,分析不同的区块链,为初学者提供分步指南。

区块链,一场会计革命

虽然区块链通常被认为是计算机技术的进步,但它更容易被理解为会计的进步。本质上讲,会计的任务是追踪交易和价值所有权。仔细思考的话,你会发现所有权是一种模糊的概念。所有权不是物品的固有属性。相反,所有权完全由共识决定。你可以在一个物体上写下你的名字或在房产上插上你自己的旗帜,但你必须能说服你社会中的其他人同意这是真正属于你的资产。既然所有权不是内在属性,我们如何在任何时间确定所有权?我们如何建立一个系统来确保所有权信息是安全的,并且不会被恶意用户改变?

这不是一个简单的问题,随着我们的社会变得越来越复杂,人类发明了越来越聪明的解决方式。在现代社会,确定和记录所有权的方式因资产类型而异,但通常可归结为以下内容。

当前的所有权跟踪系统
当前,物品、资产或创意的所有权由我们的法律系统决定,通常涉及书面或数字的所有权记录(例如,土地所有权、收据、版权文件、专利等)。当两个非信任方之间发生所有权转让时,我们依靠银行或政府组织等中介机构来获取信任、真实性和确定性。对于数字或非实物资产(如货币、股票、知识产权或数字媒体)尤其如此。如果两个人都声称对同一资产拥有所有权,或者记录的合法性存在争议,则通过法院或法庭来解决争议,确定所有权。

我们目前的所有权跟踪系统复杂、效率低、不是特别可靠,而且往往不是很透明。这包括让中间人参与并使文档难以伪造/复制。这就是为什么许多国家要求您支付印花税或其他税款,以使结婚证书和土地所有权等文件具有法律约束力和可执行性。这也是为什么需要 3 天才能汇款给国外的亲戚。中间人必须确保资金进入和离开正确的账户,并确保适当的记录完整无缺。所有信息记账的情况都是如此,它们的准确性至关重要,例如支付和货币系统、资产管理、监管合规和审计、房地产、记录管理、身份管理、投票、税收等。
这就是区块链技术的用武之地。

区块链本质上是一种会计工具,它大大简化了这一过程,并提供了一个不依赖中介的记录保存系统,而且它具有以下特点:

  • 快速高效
  • 不受伪造/黑客攻击
  • 可靠
  • 不可更改(一旦信息被锁定,就无法更改)
  • 透明
  • 不需要双方之间的信任

区块链的内部运作

简而言之,区块链是一个数据库,它包含不断增长的安全加密信息链接块,这些信息块通过独立的分散节点网络进行复制和分发。

是不是有点拗口?下面简单介绍下。

在区块链术语中,“ block ”只是被认为同时发生的信息的集合。想象它的最简单方法是将单个块想象为一个电子表格。

电子表格中的每一行都包含一条信息,例如交易信息,例如“Vega 向 Meg 发送 4 美元”。最终,电子表格块“完成”并链接到链中的前一个块。

然后,新添加的块被广播到网络中的每个节点。节点是用于区块链的计算机。

结果是包含数百万行信息的长链电子表格,复制并存储在不同的节点上。由于任何人都可以将计算机设置为节点,因此您最终会在全球范围内建立庞大的公有计算机网络,这些都有助于整个区块链的健康和安全。

让我们看一个具体的例子来准确理解信息如何通过区块链传输。Joe 想要使用世界上最知名的区块链 —— 比特币区块链将 $5 发送给 Jane。要做到这一点,Joe 所要做的就是在他的计算机上写出这笔交易的代码并将其广播到比特币区块链网络。

随着区块链网络上的计算机收到此消息,它将进入一个称为 未确认事务云 unconfirmed transaction cloud 的特殊位置。

区块链网络中的每台计算机都在持续监听未确认事务云,尝试以解决特殊谜题的方式对消息进行排序(之后会详细介绍)。

当计算机设法找到解决特殊谜题的方法时,他们将其广播到区块链网络的其余部分,并获得对首个解决谜题的计算机的奖品。

然后,未确认事务云中的消息变成一个整齐的块(电子表格),并且每个计算机在验证该解决方案确实解决了特殊谜题之后,将此块附加到区块链。

每个计算机节点都将整个区块链存储在其硬盘驱动器上,并且可以独立于区块链网络上的其他节点来验证传入的消息和块。整个系统去中心化,没有单点故障。

这基本上就是比特币区块链的工作原理:

  1. 用户将交易广播到区块链网络
  2. 计算机节点以解决特殊谜题的方式竞争,获得打包事务权
  3. 当节点可以正确打包事务时,它们会将解决方案广播到网络上的所有其他节点
  4. 每个节点独立地验证解决方案
  5. 如果解决方案有效并且块中仅包含可信事务,每个节点就独立地将新块附加到区块链

与传统会计系统相比,区块链的优点是:

  • 没有单点故障:如果一台计算机突然关闭或被黑客入侵,不会打扰或损害网络的其余部分。其余的计算机将继续向区块链添加电子表格块。
  • 去中心化系统:基于区块链技术的所有权记录不受某个实体或组织的控制。
  • 超级高效:在验证传入消息时不涉及人工。建立信任不需要中间人或中间人。一切都是通过计算机代码完成的,通过独立的公有计算机网络实现完整性。
  • 完全透明性:每个电子表格上的每一行都存储在网络上的每个节点上。因此,区块链中的所有信息都是公开的,如果怀疑存在不法行为,任何人都可以对其进行检查和审查。
  • 非实名 pseudo-anonymous :区块链中不存储任何姓名或个人信息。交易和账户余额是公开的;换句话说,非实名是指每个人在区块链上有一个和真实身份无关的虚拟身份,但是这个虚拟身份做的所有事情都是透明的。

区块链安全

上面这些可能听起来很诱人,但您可能仍有疑问。

世界上存在着无数超级聪明的恶意黑客,这个方案真的安全吗?

区块链公开存储,会有严重的隐私问题吗?

可以在区块链中使用的加密保护机制中找到这两个问题的答案。要了解破解区块链多么困难,您必须了解一些基础技术。大多数区块链使用两种加密技术的组合:加密哈希函数和数字签名,实现两个目标:

  • 确保块是不可变的。也就是说,确保每个块在区块链中的特定位置,并且改变顺序或改变块的内容是不可能的。
  • 由整个区块链网络验证广播的交易确实来自帐户的私钥持有者。

这些保护机制的内部工作非常有趣,将在之后详细介绍。

许多人认为网络安全本质上是不安全的,如果有足够的时间和激励,超级聪明的恶意黑客将总能找到窃取您信息的方法。

但事实并非如此。绝大多数区块链中使用的加密系统从未被破解。专家们普遍认为,目前的最佳加密方法对于普通计算机是不可击穿的。如果有人真的找到了方法来破解这些系统,区块链程序也无需太担心,因为我们的整个金融系统目前使用完全相同的加密技术。

以比特币为例来看区块链技术的安全性。比特币是世界上第一个也是目前最大的区块链加密货币,于 2009 年 1 月投入使用。从那时起,它的市值已经增长到 400 多亿美元(编者注:到2018年9月,市值已达一千多亿美元),每天大约有 300,000 个比特币交易。尽管如此,基本的比特币算法并没有出现过一次破坏。不过,对于这个行业来说,发生过多次比特币交易网站被黑客入侵。然而,比特币本身从未被黑客入侵,并且继续保持 100% 的跟踪记录,其表现完全符合其创建者的预期。

这并不是说比特币的处理没有风险。要正确处理任何加密货币,您需要采取一些预防措施,以确保那些超级聪明的恶意黑客无法访问您的帐户。区块链安全性将成为本系列的关键主题之一,因为我们坚信,赋予人们安全和自信地使用区块链技术的能力对于实现该技术的大规模采用至关重要。

随着区块链技术的成熟,我们希望您将来加入我们。我们确信这项技术将改变世界,也很高兴能够在这个早期阶段参与这一旅程。

所以,无论你以前从未听说过区块链,你是一个想要了解更多技术的爱好者,或者你是寻找新机会的投资者,你来对了地方。我们将努力定期更新我们的系列文章,并提供关于区块链技术各方面的细致,公正的观点。

你喜欢这篇博文吗?我们很乐意在下面的留言板上收到您的来信!如果您在我们的内容中发现任何错误或错误,请随时告诉我们,我们会及时更正。我们的下一篇文章将简要介绍区块链和比特币的历史。希望能在那里见到你!


via: https://www.myblockchainblog.com/blog/what-the-hell-is-blockchain

作者:Vegard Nordahl & Meghana Rao 选题:jasminepeng 译者:jasminepeng 校对:wxy

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