分类 技术 下的文章

通过在 GitLab 或 GitHub 上分享你的点文件,可以在整个系统上备份或同步你的自定义配置。

通过隐藏文件集(称为 点文件 dotfile )来定制操作系统是个非常棒的想法。在这篇 Shell 点文件可以为你做点什么中,H. Waldo Grunenwald 详细介绍了为什么以及如何设置点文件的细节。现在让我们深入探讨分享它们的原因和方式。

什么是点文件?

点文件 dotfile ”是指我们计算机中四处漂泊的配置文件。这些文件通常在文件名的开头以 . 开头,例如 .gitconfig,并且操作系统通常在默认情况下将其隐藏。例如,当我在 MacOS 上使用 ls -a 时,它才会显示所有可爱的点文件,否则就不会显示这些点文件。

dotfiles on master
➜ ls
README.md  Rakefile   bin       misc    profiles   zsh-custom

dotfiles on master
➜ ls -a
.               .gitignore      .oh-my-zsh      README.md       zsh-custom
..              .gitmodules     .tmux           Rakefile
.gemrc          .global_ignore .vimrc           bin
.git            .gvimrc         .zlogin         misc
.gitconfig      .maid           .zshrc          profiles

如果看一下用于 Git 配置的 .gitconfig,我能看到大量的自定义配置。我设置了帐户信息、终端颜色首选项和大量别名,这些别名可以使我的命令行界面看起来就像我的一样。这是 [alias] 块的摘录:

87   # Show the diff between the latest commit and the current state
88   d = !"git diff-index --quiet HEAD -- || clear; git --no-pager diff --patch-with-stat"
89
90   # `git di $number` shows the diff between the state `$number` revisions ago and the current state
91   di = !"d() { git diff --patch-with-stat HEAD~$1; }; git diff-index --quiet HEAD -- || clear; d"
92
93   # Pull in remote changes for the current repository and all its submodules
94   p = !"git pull; git submodule foreach git pull origin master"
95
96   # Checkout a pull request from origin (of a github repository)
97   pr = !"pr() { git fetch origin pull/$1/head:pr-$1; git checkout pr-$1; }; pr"

由于我的 .gitconfig 有 200 多行的自定义设置,我无意于在我使用的每一台新计算机或系统上重写它,其他人肯定也不想这样。这是分享点文件变得越来越流行的原因之一,尤其是随着社交编码网站 GitHub 的兴起。正式提倡分享点文件的文章是 Zach Holman 在 2008 年发表的《点文件意味着被复刻》。其前提到今天依然如此:我想与我自己、与点文件新手,以及那些分享了他们的自定义配置从而教会了我很多知识的人分享它们。

分享点文件

我们中的许多人拥有多个系统,或者知道硬盘变化无常,因此我们希望备份我们精心策划的自定义设置。那么我们如何在环境之间同步这些精彩的文件?

我最喜欢的答案是分布式版本控制,最好是可以为我处理繁重任务的服务。我经常使用 GitHub,随着我对 GitLab 的使用经验越来越丰富,我肯定会一如既往地继续喜欢它。任何一个这样的服务都是共享你的信息的理想场所。要自己设置的话可以这样做:

  1. 登录到你首选的基于 Git 的服务。
  2. 创建一个名为 dotfiles 的存储库。(将其设置为公开!分享即关爱。)
  3. 将其克隆到你的本地环境。(你可能需要设置 Git 配置命令来克隆存储库。GitHub 和 GitLab 都会提示你需要运行的命令。)
  4. 将你的点文件复制到该文件夹中。
  5. 将它们符号链接回到其目标文件夹(最常见的是 $HOME)。
  6. 将它们推送到远程存储库。

上面的步骤 4 是这项工作的关键,可能有些棘手。无论是使用脚本还是手动执行,工作流程都是从 dotfiles 文件夹符号链接到点文件的目标位置,以便对点文件的任何更新都可以轻松地推送到远程存储库。要对我的 .gitconfig 文件执行此操作,我要输入:

$ cd dotfiles/
$ ln -nfs .gitconfig $HOME/.gitconfig

添加到符号链接命令的标志还具有其他一些用处:

  • -s 创建符号链接而不是硬链接。
  • -f 在发生错误时继续做其他符号链接(此处不需要,但在循环中很有用)
  • -n 避免符号链接到一个符号链接文件(等同于其他版本的 ln-h 标志)

如果要更深入地研究可用参数,可以查看 IEEE 和开放小组的 ln 规范以及 MacOS 10.14.3 上的版本。自从其他人的点文件中拉取出这些标志以来,我才发现了这些标志。

你还可以使用一些其他代码来简化更新,例如我从 Brad Parbs 复刻的 Rakefile。另外,你也可以像 Jeff Geerling 在其点文件中那样,使它保持极其简单的状态。他使用此 Ansible 剧本对文件进行符号链接。这样使所有内容保持同步很容易:你可以从点文件的文件夹中进行 cron 作业或偶尔进行 git push

简单旁注:什么不能分享

在继续之前,值得注意的是你不应该添加到共享的点文件存储库中的内容 —— 即使它以点开头。任何有安全风险的东西,例如 .ssh/ 文件夹中的文件,都不是使用此方法分享的好选择。确保在在线发布配置文件之前仔细检查配置文件,并再三检查文件中没有 API 令牌。

我应该从哪里开始?

如果你不熟悉 Git,那么我有关 Git 术语的文章和常用命令备忘清单将会帮助你继续前进。

还有其他超棒的资源可帮助你开始使用点文件。多年前,我就发现了 dotfiles.github.io,并继续使用它来更广泛地了解人们在做什么。在其他人的点文件中隐藏了许多秘传知识。花时间浏览一些,大胆地将它们添加到自己的内容中。

我希望这是让你在计算机上拥有一致的点文件的快乐开端。

你最喜欢的点文件技巧是什么?添加评论或在 Twitter 上找我 @mbbroberg


via: https://opensource.com/article/19/3/move-your-dotfiles-version-control

作者:Matthew Broberg 选题:lujun9972 译者:wxy 校对:wxy

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

了解如何使用配置文件来改善你的工作环境。

不要问你可以为你的 shell 点文件 dotfile 做什么,而是要问一个 shell 点文件可以为你做什么!

我一直在操作系统领域里面打转,但是在过去的几年中,我的日常使用的一直是 Mac。很长一段时间,我都在使用 Bash,但是当几个朋友开始把 zsh 当成宗教信仰时,我也试试了它。我没用太长时间就喜欢上了它,几年后,我越发喜欢它做的许多小事情。

我一直在使用 zsh(通过 Homebrew 提供,而不是由操作系统安装的)和 Oh My Zsh 增强功能

本文中的示例是我的个人 .zshrc。大多数都可以直接用在 Bash 中,我觉得不是每个人都依赖于 Oh My Zsh,但是如果不用的话你的工作量可能会有所不同。曾经有一段时间,我同时为 zsh 和 Bash 维护一个 shell 点文件,但是最终我还是放弃了我的 .bashrc

不偏执不行

如果你希望在各个操作系统上使用相同的点文件,则需要让你的点文件聪明点。

### Mac 专用
if [[ "$OSTYPE" == "darwin"* ]]; then
        # Mac 专用内容在此

例如,我希望 Alt + 箭头键 将光标按单词移动而不是单个空格。为了在 iTerm2(我的首选终端)中实现这一目标,我将此代码段添加到了 .zshrc 的 Mac 专用部分:

### Mac 专用
if [[ "$OSTYPE" == "darwin"* ]]; then
        ### Mac 用于 iTerm2 的光标命令;映射 ctrl+arrows 或 alt+arrows 来快速移动
        bindkey -e
        bindkey '^[[1;9C' forward-word
        bindkey '^[[1;9D' backward-word
        bindkey '\e\e[D' backward-word
        bindkey '\e\e[C' forward-word
fi

(LCTT 译注:标题 “We’re all mad here” 是电影《爱丽丝梦游仙境》中,微笑猫对爱丽丝讲的一句话:“我们这儿全都是疯的”。)

在家不工作

虽然我开始喜欢我的 Shell 点文件了,但我并不总是想要家用计算机上的东西与工作的计算机上的东西一样。解决此问题的一种方法是让补充的点文件在家中使用,而不是在工作中使用。以下是我的实现方式:

if [[ `egrep 'dnssuffix1|dnssuffix2' /etc/resolv.conf` ]]; then
        if [ -e $HOME/.work ]
                source $HOME/.work
        else
                echo "This looks like a work machine, but I can't find the ~/.work file"
        fi
fi

在这种情况下,我根据我的工作 dns 后缀(或多个后缀,具体取决于你的情况)来提供(source)一个可以使我的工作环境更好的单独文件。

(LCTT 译注:标题 “What about Bob?” 是 1991 年的美国电影《天才也疯狂》。)

你该这么做

现在可能是放弃使用波浪号(~)表示编写脚本时的主目录的好时机。你会发现在某些上下文中无法识别它。养成使用环境变量 $HOME 的习惯,这将为你节省大量的故障排除时间和以后的工作。

如果你愿意,合乎逻辑的扩展是应该包括特定于操作系统的点文件。

(LCTT 译注:标题 “That thing you do” 是 1996 年由汤姆·汉克斯执导的喜剧片《挡不住的奇迹》。)

别指望记忆

我写了那么多 shell 脚本,我真的再也不想写脚本了。并不是说 shell 脚本不能满足我大部分时间的需求,而是我发现写 shell 脚本,可能只是拼凑了一个胶带式解决方案,而不是永久地解决问题。

同样,我讨厌记住事情,在我的整个职业生涯中,我经常不得不在一天之中就彻彻底底地改换环境。实际的结果是这些年来,我不得不一再重新学习很多东西。(“等等……这种语言使用哪种 for 循环结构?”)

因此,每隔一段时间我就会觉得自己厌倦了再次寻找做某事的方法。我改善生活的一种方法是添加别名。

对于任何一个使用操作系统的人来说,一个常见的情况是找出占用了所有磁盘的内容。不幸的是,我从来没有记住过这个咒语,所以我做了一个 shell 别名,创造性地叫做 bigdirs

alias bigdirs='du --max-depth=1 2> /dev/null | sort -n -r | head -n20'

虽然我可能不那么懒惰,并实际记住了它,但是,那不太 Unix ……

(LCTT 译注:标题 “Memory, all alone in the moonlight” 是一手英文老歌。)

输错的人们

使用 shell 别名改善我的生活的另一种方法是使我免于输入错误。我不知道为什么,但是我已经养成了这种讨厌的习惯,在序列 ea 之后输入 w,所以如果我想清除终端,我经常会输入 cleawr。不幸的是,这对我的 shell 没有任何意义。直到我添加了这个小东西:

alias cleawr='clear'

在 Windows 中有一个等效但更好的命令 cls,但我发现自己会在 Shell 也输入它。看到你的 shell 表示抗议真令人沮丧,因此我添加:

alias cls='clear'

是的,我知道 ctrl + l,但是我从不使用它。

(LCTT 译注:标题 “Typos, and the people who love them” 可能来自某部电影。)

要自娱自乐

工作压力很大。有时你需要找点乐子。如果你的 shell 不知道它显然应该执行的命令,则可能你想直接让它耸耸肩!你可以使用以下功能执行此操作:

shrug() { echo "¯\_(ツ)_/¯"; }

如果还不行,也许你需要掀桌不干了:

fliptable() { echo "(╯°□°)╯ ┻━┻"; } # 掀桌,用法示例: fsck -y /dev/sdb1 || fliptable

想想看,当我想掀桌子时而我不记得我给它起了个什么名字,我会有多沮丧和失望,所以我添加了更多的 shell 别名:

alias flipdesk='fliptable'
alias deskflip='fliptable'
alias tableflip='fliptable'

而有时你需要庆祝一下:

disco() {
        echo "(•_•)"
        echo "<)   )╯"
        echo " /    \ "
        echo ""
        echo "\(•_•)"
        echo " (   (>"
        echo " /    \ "
        echo ""
        echo " (•_•)"
        echo "<)   )>"
        echo " /    \ "
}

通常,我会将这些命令的输出通过管道传递到 pbcopy,并将其粘贴到我正在使用的相关聊天工具中。

我从一个我关注的一个叫 “Command Line Magic” @ climagic 的 Twitter 帐户得到了下面这个有趣的函数。自从我现在住在佛罗里达州以来,我很高兴看到我这一生中唯一的一次下雪:

snow() {
        clear;while :;do echo $LINES $COLUMNS $(($RANDOM%$COLUMNS));sleep 0.1;done|gawk '{a[$3]=0;for(x in a) {o=a[x];a[x]=a[x]+1;printf "\033[%s;%sH ",o,x;printf "\033[%s;%sH*\033[0;0H",a[x],x;}}'
}

(LCTT 译注:标题 “Amuse yourself” 是 1936 年的美国电影《自娱自乐》)

函数的乐趣

我们已经看到了一些我使用的函数示例。由于这些示例中几乎不需要参数,因此可以将它们作为别名来完成。 当比一个短句更长时,我出于个人喜好使用函数。

在我职业生涯的很多时期我都运行过 Graphite,这是一个开源、可扩展的时间序列指标解决方案。 在很多的情况下,我需要将度量路径(用句点表示)转换到文件系统路径(用斜杠表示),反之亦然,拥有专用于这些任务的函数就变得很有用:

# 在 Graphite 指标和文件路径之间转换很有用
function dottoslash() {
        echo $1 | sed 's/\./\//g'
}
function slashtodot() {
        echo $1 | sed 's/\//\./g'
}

在我的另外一段职业生涯里,我运行了很多 Kubernetes。如果你对运行 Kubernetes 不熟悉,你需要编写很多 YAML。不幸的是,一不小心就会编写了无效的 YAML。更糟糕的是,Kubernetes 不会在尝试应用 YAML 之前对其进行验证,因此,除非你应用它,否则你不会发现它是无效的。除非你先进行验证:

function yamllint() {
        for i in $(find . -name '*.yml' -o -name '*.yaml'); do echo $i; ruby -e "require 'yaml';YAML.load_file(\"$i\")"; done
}

因为我厌倦了偶尔破坏客户的设置而让自己感到尴尬,所以我写了这个小片段并将其作为提交前挂钩添加到我所有相关的存储库中。在持续集成过程中,类似的内容将非常有帮助,尤其是在你作为团队成员的情况下。

(LCTT 译注:哦抱歉,我不知道这个标题的出处。)

手指不听话

我曾经是一位出色的盲打打字员。但那些日子已经一去不回。我的打字错误超出了我的想象。

在各种时期,我多次用过 Chef 或 Kubernetes。对我来说幸运的是,我从未同时使用过这两者。

Chef 生态系统的一部分是 Test Kitchen,它是加快测试的一组工具,可通过命令 kitchen test 来调用。Kubernetes 使用 CLI 工具 kubectl 进行管理。这两个命令都需要几个子命令,并且这两者都不会特别顺畅地移动手指。

我没有创建一堆“输错别名”,而是将这两个命令别名为 k

alias k='kitchen test $@'

alias k='kubectl $@'

(LCTT 译注:标题 “Oh, fingers, where art thou?” 演绎自《O Brother, Where Art Thou?》,这是 2000 年美国的一部电影《逃狱三王》。)

分裂与合并

我职业生涯的后半截涉及与其他人一起编写更多代码。我曾在许多环境中工作过,在这些环境中,我们在帐户中复刻了存储库副本,并将拉取请求用作审核过程的一部分。当我想确保给定存储库的复刻与父版本保持最新时,我使用 fetchupstream

alias fetchupstream='git fetch upstream && git checkout master && git merge upstream/master && git push'

(LCTT 译注:标题 “Timesplitters” 是一款视频游戏《时空分裂者》。)

颜色之荣耀

我喜欢颜色。它可以使 diff 之类的东西更易于使用。

alias diff='colordiff'

我觉得彩色的手册页是个巧妙的技巧,因此我合并了以下函数:

# 彩色化手册页,来自:
# http://boredzo.org/blog/archives/2016-08-15/colorized-man-pages-understood-and-customized
man() {
        env \
                LESS_TERMCAP_md=$(printf "\e[1;36m") \
                LESS_TERMCAP_me=$(printf "\e[0m") \
                LESS_TERMCAP_se=$(printf "\e[0m") \
                LESS_TERMCAP_so=$(printf "\e[1;44;33m") \
                LESS_TERMCAP_ue=$(printf "\e[0m") \
                LESS_TERMCAP_us=$(printf "\e[1;32m") \
                man "$@"
}

我喜欢命令 which,但它只是告诉你正在运行的命令在文件系统中的位置,除非它是 Shell 函数才能告诉你更多。在多个级联的点文件之后,有时会不清楚函数的定义位置或作用。事实证明,whencetype 命令可以帮助解决这一问题。

# 函数定义在哪里?
whichfunc() {
        whence -v $1
        type -a $1
}

(LCTT 译注:标题“Mine eyes have seen the glory of the coming of color” 演绎自歌曲 《Mine Eyes Have Seen The Glory Of The Coming Of The Lord》)

总结

希望本文对你有所帮助,并能激发你找到改善日常使用 Shell 的方法。这些方法不必庞大、新颖或复杂。它们可能会解决一些微小但频繁的摩擦、创建捷径,甚至提供减少常见输入错误的解决方案。

欢迎你浏览我的 dotfiles 存储库,但我要警示你,这样做可能会花费很多时间。请随意使用你认为有帮助的任何东西,并互相取长补短。


via: https://opensource.com/article/18/9/shell-dotfile

作者:H.Waldo Grunenwald 选题:lujun9972 译者:wxy 校对:wxy

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

学习如何使用 chown 命令更改文件或目录的所有权。

Linux 系统上的每个文件和目录均由某个人拥有,拥有者可以完全控制更改或删除他们拥有的文件。除了有一个拥有用户外,文件还有一个拥有组

你可以使用 ls -l 命令查看文件的所有权:

[pablo@workstation Downloads]$ ls -l
total 2454732
-rw-r--r--. 1 pablo pablo 1934753792 Jul 25 18:49 Fedora-Workstation-Live-x86_64-30-1.2.iso

该输出的第三和第四列是拥有用户和组,它们一起称为所有权。上面的那个 ISO 文件这两者都是 pablo

所有权设置由 chmod 命令进行设置,控制允许谁可以执行读取、写入或运行的操作。你可以使用 chown 命令更改所有权(一个或两者)。

所有权经常需要更改。文件和目录一直存在在系统中,但用户不断变来变去。当文件和目录在系统中移动时,或从一个系统移动到另一个系统时,所有权也可能需要更改。

我的主目录中的文件和目录的所有权是我的用户和我的主要组,以 user:group 的形式表示。假设 Susan 正在管理 Delta 组,该组需要编辑一个名为 mynotes 的文件。你可以使用 chown 命令将该文件的用户更改为 susan,组更改为 delta

$ chown susan:delta mynotes
ls -l
-rw-rw-r--. 1 susan delta 0 Aug  1 12:04 mynotes

当给该文件设置好了 Delta 组时,它可以分配回给我:

$ chown alan mynotes
$ ls -l mynotes
-rw-rw-r--. 1 alan delta 0 Aug  1 12:04 mynotes

给用户后添加冒号(:),可以将用户和组都分配回给我:

$ chown alan: mynotes
$ ls -l mynotes
-rw-rw-r--. 1 alan alan 0 Aug  1 12:04 mynotes

通过在组前面加一个冒号,可以只更改组。现在,gamma 组的成员可以编辑该文件:

$ chown :gamma mynotes
$ ls -l
-rw-rw-r--. 1 alan gamma 0 Aug  1 12:04 mynotes

chown 的一些附加参数都能用在命令行和脚本中。就像许多其他 Linux 命令一样,chown 有一个递归参数(-R),它告诉该命令进入目录以对其中的所有文件进行操作。没有 -R 标志,你就只能更改文件夹的权限,而不会更改其中的文件。在此示例中,假定目的是更改目录及其所有内容的权限。这里我添加了 -v(详细)参数,以便 chown 报告其工作情况:

$ 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

$ chown -vR susan:delta conf
changed ownership of 'conf/conf.xml' from alan:alan to  susan:delta
changed ownership of 'conf' from alan:alan to  susan:delta

根据你的角色,你可能需要使用 sudo 来更改文件的所有权。

在更改文件的所有权以匹配特定配置时,或者在你不知道所有权时(例如运行脚本时),可以使用参考文件(--reference=RFILE)。例如,你可以复制另一个文件(RFILE,称为参考文件)的用户和组,以撤消上面所做的更改。回想一下,点(.)表示当前的工作目录。

$ chown -vR --reference=. conf

报告更改

大多数命令都有用于控制其输出的参数。最常见的是 -v--verbose)以启用详细信息,但是 chown 还具有 -c--changes)参数来指示 chown 仅在进行更改时报告。chown 还会报告其他情况,例如不允许进行的操作。

参数 -f--silent--quiet)用于禁止显示大多数错误消息。在下一节中,我将使用 -f-c,以便仅显示实际更改。

保持根目录

Linux 文件系统的根目录(/)应该受到高度重视。如果命令在此层级上犯了一个错误,则后果可能会使系统完全无用。尤其是在运行一个会递归修改甚至删除的命令时。chown 命令具有一个可用于保护和保持根目录的参数,它是 --preserve-root。如果在根目录中将此参数和递归一起使用,那么什么也不会发生,而是会出现一条消息:

$ chown -cfR --preserve-root alan /
chown: it is dangerous to operate recursively on '/'
chown: use --no-preserve-root to override this failsafe

如果不与 --recursive 结合使用,则该选项无效。但是,如果该命令由 root 用户运行,则 / 本身的权限将被更改,但其下的其他文件或目录的权限则不会更改:

$ chown -c --preserve-root alan /
chown: changing ownership of '/': Operation not permitted
[root@localhost /]# chown -c --preserve-root alan /
changed ownership of '/' from root to alan

所有权即安全

文件和目录所有权是良好的信息安全性的一部分,因此,偶尔检查和维护文件所有权以防止不必要的访问非常重要。chown 命令是 Linux 安全命令集中最常见和最重要的命令之一。


via: https://opensource.com/article/19/8/linux-chown-command

作者:Alan Formy-Duval 选题:lujun9972 译者:wxy 校对:wxy

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

有一种观点认为,在 IT 行业工作的许多人经常从网络帖子里复制和粘贴。我们都干过,复制粘贴本身不是问题。问题是当我们在不理解它们的情况下这样干。

几年前,一个曾经在我团队中工作的朋友需要将虚拟机模板从站点 A 复制到站点 B。他们无法理解为什么复制的文件在站点 A 上为 10GB,但是在站点 B 上却变为 100GB。

这位朋友认为 rsync 是一个神奇的工具,应该仅“同步”文件本身。但是,我们大多数人所忘记的是了解 rsync 的真正含义、用法,以及我认为最重要的是它原本是用来做什么的。本文提供了有关 rsync 的更多信息,并解释了那件事中发生了什么。

关于 rsync

rsync 是由 Andrew Tridgell 和 Paul Mackerras 创建的工具,其动机是以下问题:

假设你有两个文件,file_Afile_B。你希望将 file_B 更新为与 file_A 相同。显而易见的方法是将 file_A 复制到 file_B

现在,假设这两个文件位于通过慢速通信链接(例如,拨号 IP 链接)连接的两个不同的服务器上。如果file_A 大,将其复制到 file_B 将会很慢,有时甚至是不可能完成的。为了提高效率,你可以在发送前压缩 file_A,但这通常只会获得 2 到 4 倍的效率提升。

现在假设 file_Afile_B 非常相似,并且为了加快处理速度,你可以利用这种相似性。一种常见的方法是仅通过链接发送 file_Afile_B 之间的差异,然后使用这个差异列表在远程端重建文件。

问题在于,用于在两个文件之间创建一组差异的常规方法依赖于能够读取两个文件。因此,它们要求链接的一端预先提供两个文件。如果它们在同一台计算机上不是同时可用的,则无法使用这些算法。(一旦将文件复制过来,就不需要做对比差异了)。而这是 rsync 解决的问题。

rsync 算法有效地计算源文件的哪些部分与现有目标文件的部分匹配。这样,匹配的部分就不需要通过链接发送了;所需要的只是对目标文件部分的引用。只有源文件中不匹配的部分才需要发送。

然后,接收者可以使用对现有目标文件各个部分的引用和原始素材来构造源文件的副本。

另外,可以使用一系列常用压缩算法中的任何一种来压缩发送到接收器的数据,以进一步提高速度。

我们都知道,rsync 算法以一种漂亮的方式解决了这个问题。

rsync 的介绍之后,回到那件事!

问题 1:自动精简配置

有两件事可以帮助那个朋友了解正在发生的事情。

该文件在其他地方的大小变得越来越大的问题是由源系统上启用了 自动精简配置 Thin Provisioning (TP)引起的,这是一种优化存储区域网络(SAN)或网络连接存储(NAS)中可用空间效率的方法。

由于启用了 TP,源文件只有 10GB,并且在不使用任何其他配置的情况下使用 rsync 进行传输时,目标位置将接收到全部 100GB 的大小。rsync 无法自动完成该(TP)操作,必须对其进行配置。

进行此工作的选项是 -S(或 –sparse),它告诉 rsync 有效地处理稀疏文件。它会按照它说的做!它只会发送该稀疏数据,因此源和目标将有一个 10GB 的文件。

问题 2:更新文件

当发送一个更新的文件时会出现第二个问题。现在目标仅接收 10GB 了,但始终传输的是整个文件(包含虚拟磁盘),即使只是在该虚拟磁盘上更改了一个配置文件。换句话说,只是该文件的一小部分发生了更改。

用于此传输的命令是:

rsync -avS vmdk_file syncuser@host1:/destination

同样,了解 rsync 的工作方式也将有助于解决此问题。

上面是关于 rsync 的最大误解。我们许多人认为 rsync 只会发送文件的增量更新,并且只会自动更新需要更新的内容。但这不是 rsync 的默认行为

如手册页所述,rsync 的默认行为是在目标位置创建文件的新副本,并在传输完成后将其移动到正确的位置。

要更改 rsync 的默认行为,你必须设置以下标志,然后 rsync 将仅发送增量:

--inplace               原地更新目标文件
--partial               保留部分传输的文件
--append                附加数据到更短的文件
--progress              在传输时显示进度条

因此,可以确切地执行我那个朋友想要的功能的完整命令是:

rsync -av --partial --inplace --append --progress vmdk_file syncuser@host1:/destination

注意,出于两个原因,这里必须删除稀疏选项 -S。首先是通过网络发送文件时,不能同时使用 –sparse–inplace。其次,当你以前使用过 –sparse 发送文件时,就无法再使用 –inplace 进行更新。请注意,低于 3.1.3 的 rsync 版本将拒绝 –sparse–inplace 的组合。

因此,即使那个朋友最终通过网络复制了 100GB,那也只需发生一次。以下所有更新仅复制差异,从而使复制非常高效。


via: https://fedoramagazine.org/copying-large-files-with-rsync-and-some-misconceptions/

作者:Daniel Leite de Abreu 选题:lujun9972 译者:wxy 校对:wxy

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

使用 Python 开展数据科学为你提供了无限的潜力,使你能够以有意义和启发性的方式解析、解释和组织数据。

数据科学是计算领域一个令人兴奋的新领域,它围绕分析、可视化和关联以解释我们的计算机收集的有关世界的无限信息而建立。当然,称其为“新”领域有点不诚实,因为该学科是统计学、数据分析和普通而古老的科学观察派生而来的。

但是数据科学是这些学科的形式化分支,拥有自己的流程和工具,并且可以广泛应用于以前从未产生过大量不可管理数据的学科(例如视觉效果)。数据科学是一个新的机会,可以重新审视海洋学、气象学、地理学、制图学、生物学、医学和健康以及娱乐行业的数据,并更好地了解其中的模式、影响和因果关系。

像其他看似包罗万象的大型领域一样,知道从哪里开始探索数据科学可能会令人生畏。有很多资源可以帮助数据科学家使用自己喜欢的编程语言来实现其目标,其中包括最流行的编程语言之一:Python。使用 PandasMatplotlibSeaborn 这些库,你可以学习数据科学的基本工具集。

如果你对 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 显示图形,你还必须安装 PyGObjectPycairo。这涉及到编译代码,只要你安装了必需的头文件和库,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 rcParams

Matplotlib 可以将其输出导出为多种格式,包括 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()

运行代码以获得结果。

 title=

你的图形可以准确显示 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

 title=

停用你的虚拟环境

探索完 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中国 荣誉推出

Ethereum

在本系列的上一指南中,我们讨论了 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 等平台中,哪一个平台会在现实场景中找到最多粉丝,但此类系统确实证明了以区块链为动力的未来主张背后的有效性。


  1. Gabriel Nicholas, “Ethereum Is Coding’s New Wild West | WIRED,” Wired , 2017.
  2. What is Ethereum? — Ethereum Homestead 0.1 documentation.
  3. Ethereum, a Virtual Currency, Enables Transactions That Rival Bitcoin’s – The New York Times.
  4. Cryptocurrency Market Capitalizations | CoinMarketCap.
  5. Introduction — Ethereum Homestead 0.1 documentation.

via: https://www.ostechnix.com/blockchain-2-0-what-is-ethereum/

作者:ostechnix 选题:lujun9972 译者:wxy 校对:wxy

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