mirror of
https://github.com/LCTT/TranslateProject.git
synced 2025-02-06 23:50:16 +08:00
commit
131c81b24e
56
README.md
56
README.md
@ -56,6 +56,7 @@ LCTT 的组成
|
||||
* 2016/02/29 选题 DeadFire 病逝。
|
||||
* 2016/05/09 提升 PurlingNayuki 为校对。
|
||||
* 2016/09/10 LCTT 三周年。
|
||||
* 2016/12/24 拟定 LCTT [Core 规则](core.md),并增加新的 Core 成员: @ucasFL、@martin2011qi,及调整一些组。
|
||||
|
||||
活跃成员
|
||||
-------------------------------
|
||||
@ -63,8 +64,7 @@ LCTT 的组成
|
||||
目前 TP 活跃成员有:
|
||||
- Leader @wxy,
|
||||
- Source @oska874,
|
||||
- Proofreader @PurlingNayuki,
|
||||
- Proofreader @carolinewuyan,
|
||||
- Proofreaders @jasminepeng,
|
||||
- CORE @geekpi,
|
||||
- CORE @GOLinux,
|
||||
- CORE @ictlyh,
|
||||
@ -77,95 +77,95 @@ LCTT 的组成
|
||||
- CORE @alim0x,
|
||||
- CORE @tinyeyeser,
|
||||
- CORE @Locez,
|
||||
- CORE @ucasFL
|
||||
- CORE @martin2011qi
|
||||
- Senior @DeadFire,
|
||||
- Senior @reinoir222,
|
||||
- Senior @vito-L,
|
||||
- Senior @jasminepeng,
|
||||
- Senior @willqian,
|
||||
- Senior @vizv,
|
||||
- Senior @dongfengweixiao,
|
||||
- Senior @PurlingNayuki,
|
||||
- Senior @carolinewuyan,
|
||||
- cposture,
|
||||
- ZTinoZ,
|
||||
- martin2011qi,
|
||||
- theo-l,
|
||||
- Luoxcat,
|
||||
- GHLandy,
|
||||
- wi-cuckoo,
|
||||
- StdioA,
|
||||
- disylee,
|
||||
- haimingfg,
|
||||
- wwy-hust,
|
||||
- felixonmars,
|
||||
- KayGuoWhu,
|
||||
- mr-ping,
|
||||
- su-kaiyao,
|
||||
- StdioA,
|
||||
- wyangsun,
|
||||
- su-kaiyao,
|
||||
- ivo-wang,
|
||||
- GHLandy,
|
||||
- cvsher,
|
||||
- OneNewLife
|
||||
- DongShuaike,
|
||||
- flsf,
|
||||
- SPccman,
|
||||
- Stevearzh
|
||||
- Stevearzh,
|
||||
- bestony,
|
||||
- Linchenguang,
|
||||
- Linux-pdz,
|
||||
- 2q1w2007,
|
||||
- H-mudcup,
|
||||
- MikeCoder,
|
||||
- NearTan,
|
||||
- goreliu,
|
||||
- H-mudcup,
|
||||
- GitFuture,
|
||||
- MikeCoder,
|
||||
- xiqingongzi,
|
||||
- goreliu,
|
||||
- rusking,
|
||||
- jiajia9linuxer,
|
||||
- name1e5s,
|
||||
- TxmszLou,
|
||||
- ZhouJ-sh,
|
||||
- wangjiezhe,
|
||||
- icybreaker,
|
||||
- zky001,
|
||||
- vim-kakali,
|
||||
- shipsw,
|
||||
- LinuxBars,
|
||||
- Moelf,
|
||||
- name1e5s,
|
||||
- Chao-zhi
|
||||
- johnhoow,
|
||||
- soooogreen,
|
||||
- kokialoves,
|
||||
- linuhap,
|
||||
- GitFuture,
|
||||
- ChrisLeeGit,
|
||||
- blueabysm,
|
||||
- yangmingming,
|
||||
- boredivan,
|
||||
- yechunxiao19,
|
||||
- XLCYun,
|
||||
- KevinSJ,
|
||||
- zky001,
|
||||
- l3b2w1,
|
||||
- tenght,
|
||||
- firstadream,
|
||||
- coloka,
|
||||
- luoyutiantang,
|
||||
- sonofelice,
|
||||
- jiajia9linuxer,
|
||||
- scusjs,
|
||||
- woodboow,
|
||||
- 1w2b3l,
|
||||
- JonathanKang,
|
||||
- bestony,
|
||||
- crowner,
|
||||
- dingdongnigetou,
|
||||
- mtunique,
|
||||
- Rekii008,
|
||||
- hyaocuk,
|
||||
- szrlee,
|
||||
- Xuanwo,
|
||||
- nd0104,
|
||||
- xiaoyu33,
|
||||
- ynmlml,
|
||||
- Flowsnow,
|
||||
- ggaaooppeenngg,
|
||||
- mudongliang,
|
||||
- Tanete,
|
||||
- lfzark,
|
||||
- chenzhijun,
|
||||
- frankatlingingdigital,
|
||||
- willcoderwang,
|
||||
- liuaiping,
|
||||
- rogetfan,
|
||||
- JeffDing,
|
||||
- Yuking-net,
|
||||
|
||||
(按增加行数排名前百,更新于2016/09/10)
|
||||
(按增加行数排名前百,更新于2016/12/24)
|
||||
|
||||
谢谢大家的支持!
|
||||
|
||||
|
39
core.md
Normal file
39
core.md
Normal file
@ -0,0 +1,39 @@
|
||||
给核心成员的一封信
|
||||
===================
|
||||
|
||||
鉴于您的卓越贡献,我邀请您成为 LCTT 的核心(Core)成员。
|
||||
|
||||
作为核心成员,您拥有如下权利:
|
||||
|
||||
- 您能够合并您以及其它普通成员的 PR
|
||||
- 您能够校对其它普通成员的文章,并提交校对 PR
|
||||
- 您能够建议或反对将某位普通成员升级为核心成员
|
||||
- 您能够自主添加符合 LCTT 定位的选题并翻译
|
||||
- 您能够以 LCTT 核心成员名义宣称、署名
|
||||
- 在得到 LCTT 同意后,以 LCTT 身份出席活动
|
||||
- 在得到 LCTT 同意后,创建 LCTT 名下的其它仓库并管理(及邀请其它成员参与)
|
||||
- 成为 LinuxCN 管理团队的一员
|
||||
- 参与 LCTT 及 LinuxCN 决策投票
|
||||
|
||||
以下是不允许的行为,虽然您可能有这样的权限:
|
||||
|
||||
- 直接在 LCTT 主仓库上提交修改
|
||||
- 在 LCTT 主仓库上创建分支
|
||||
|
||||
除此以外,您有以下义务:
|
||||
|
||||
- 为您的 GitHub 账户创建安全的密码
|
||||
- 为您的 GitHub 账户创建 2FA 验证
|
||||
- 不得外借您的 GitHub 账户,您需要为您的账户负责
|
||||
- 保持参与度,如长期不能参与,会转换身份为荣誉成员,并放弃相应权限
|
||||
- 接待新加入的成员,并做好引导个工作
|
||||
- 维护 Wiki
|
||||
|
||||
作为核心成员,您会执行一些管理工作,以下是一些惯例:
|
||||
|
||||
- 合并 PR 时,要按时间顺序,从最早的(最下方)的开始合并
|
||||
- 合并 PR 时,如果与仓库或前面的 PR 冲突,则关闭该 PR,并提醒 PR 发起人修改处理
|
||||
- 除非必要,合并 PR 时不要 squash-merge
|
||||
|
||||
wxy@LCTT
|
||||
2016/12/24
|
@ -0,0 +1,94 @@
|
||||
GNU/Linux,爱憎由之
|
||||
==================
|
||||
|
||||
首先,我能确定本文提及的内容一定会造成激烈的辩论,从之前那篇 [我讨厌 GNU/Linux 的五个理由 – 你呢,爱还是恨?][1] 的页底评论区就可见一斑。
|
||||
|
||||
也因此,我在此没有使用恨 (hate) 这个词,那会让我感觉很不舒服,所以我觉得用不喜欢 (dislike) 来代替更合适。
|
||||
|
||||
[![关于 Linux,我所不喜欢的事情](http://www.tecmint.com/wp-content/uploads/2015/11/Things-I-Dislike-About-Linux.png)][2]
|
||||
|
||||
*关于 Linux,我所不喜欢的 5 件事。*
|
||||
|
||||
也就是说,请读者记住,文中的观点完完全全出于我个人和自身的经历,而这些想法和经历可能会和他人的相似,也可能相去甚远。
|
||||
|
||||
此外,我也意识到,这些所谓的不喜欢(dislike)是与经验相关的,Linux 就是这个样子。然而,但正是这些事实阻碍了新用户做出迁移系统的决定。
|
||||
|
||||
像从前一样,随时留下评论并展开讨论,或者提出任何其他符合本文主题的观点。
|
||||
|
||||
### 不喜欢理由之一:从 Windows 迁移到 Linux 对用户来说是个陡峭的学习曲线
|
||||
|
||||
如果说使用 Windows 已经成为了你生活中不可缺少的一个部分,那么你在 Linux 电脑上安装一个新软件之前,还必须要习惯和理解诸如远程仓库(repository)、依赖关系(dependency)、包(package)和包管理器(package manager)等概念。
|
||||
|
||||
不久你也会发现,仅仅使用鼠标点击一个可执行程序是很难完成某个程序的安装的。或者由于一些原因,你没有可用的网络,那么安装一个你想要的软件会是一件非常累人的任务。
|
||||
|
||||
### 不喜欢理由之二:独立学习使用仍存在困难
|
||||
|
||||
类似理由一,事实上,最开始独立学习 Linux 知识的时候,很多人都会觉得那是一个巨大挑战。尽管网上有数以千万计的教程和 [大量的好书][3],但初学者也会因此烦了选择困难症,不知从何开始学习。
|
||||
|
||||
此外,数不清的社区 (比如:[linuxsay.com][4]) 论坛中都有大量的有经验用户为大家无偿提供(通常都是这样的)解答,但不幸的是,这些问题的解答并不完全可信、或者与新用户的经验和知识层面不匹配,导致用户无法理解。
|
||||
|
||||
事实上,因为有太多的发行版系列及其衍生版本可以获取,这使得我们有必要向第三方机构付费,让他们指引我们走向 Linux 世界的第一步、了解这些发行版系列之间的相同点以及区别。
|
||||
|
||||
### 不喜欢理由之三:新老系统/软件迁移问题
|
||||
|
||||
一旦你下定决心开始使用 Linux,那么无论是在家里或是办公室,也无论是个人版或者企业级,你都要完全从旧系统向新系统迁移,然后要考虑这些年来你所使用的软件在 Linux 平台上的替代产品。
|
||||
|
||||
而这确实令人矛盾不已,特别是要面对相同类型(比如文本处理器、关系型数据库系统、图形套件等) 的多个不同程序,而又没有受过专业指导和训练,那么很多人都下定不了决心要使用哪个好。
|
||||
|
||||
除非有可敬的有经验用户或者教学视频进行指导,否则存在太多的软件实例给用户进行选择,真的会让人走进误区。
|
||||
|
||||
### 不喜欢理由之四:缺乏硬件厂商的驱动支持
|
||||
|
||||
恐怕没有人能否认这样的事实,Linux 走过了漫长的历史,它的第一个内核版本公布已经有 20 多年了(LCTT 译注:准确说是将近 26 年了,1991.10.05 - 2017.02,相信现今很多我们这些 Linux 用户在第一个内核版本公布的时候都还没出生,包括译者在内)。随着越来越多的设备驱动编译进每次发布的稳定内核中、越来越多的厂商开始支持研究和开发兼容 Linux 的设备驱动,Linux 用户们不再会经常遇到设备运行不正常的情况了,但还是会偶尔遭遇的。
|
||||
|
||||
并且,如果你的个人计算或者公司业务需要一个特殊设备,但恰巧又没有现成的 Linux 驱动,你还得困在 Windows 或者其他有驱动支持的其他系统。
|
||||
|
||||
尽管你经常这样提醒自己:“闭源软件真他妈邪恶!”,但事实上的确有闭源软件,并且不幸的是,出于商业需求我们多数情况还是被迫使用它。
|
||||
|
||||
### 不喜欢理由之五:Linux 的主要力量仍在于服务器
|
||||
|
||||
这么说吧,我加入 Linux 阵营的主要原因是多年前它将一台老电脑生机焕发并能够正常使用让我看到了它的前景。花费了一段时间来解决不喜欢理由之一、之二中遇到的那些问题,并且成功使用一台 566 MHz 赛扬处理器、10 GB IDE 硬盘以及仅有 256 MB 内存的机器搭载 Debian Squeeze 建立起一个家庭文件/打印/ Web 服务于一体的服务器之后,我非常开心。
|
||||
|
||||
当我发现即便是处于高负载的情况,[htop 显示][5] 系统资源消耗才勉强到达一半,这令非常我惊喜。
|
||||
|
||||
你可能已经不停在再问自己,文中明明说的是不喜欢 Linux,为什么还提这些事呢?答案很简单,我是需要一个比较好的 Linux 桌面发行版来运行在一台相对老旧的电脑上。当然我并不指望能够有那么一个发行版可以运行上述提到那种硬件特征的电脑上,但我的确没有发现有任何一款外观漂亮的可定制桌面系统能运行在 1 GB 内存以下的电脑中,如果可以,其速度大概比鼻涕虫还慢吧。
|
||||
|
||||
我想在此重申一下:我是说“我没发现”,而非“不存在”。可能某天我会发现一个较好的 Linux 桌面发行版能够用在我房间里那台寿终正寝的笔记本上。如果那天真的到来,我将首先删除这篇文章,并向它竖起大拇指。
|
||||
|
||||
### 总而言之
|
||||
|
||||
在本文中,我也尝试了提及 Linux 在某些地方仍需不断改进。我是一名幸福的 Linux 用户,并由衷地感谢那些杰出的社区不断为 Linux 系统、组件和其他功能做出贡献。我想重复一下我在本文开头说的 —— 这些明显的不足点,如果从适当的角度去看也是一种优势,或者也快了吧。
|
||||
|
||||
在那到来之前,让我们相互支持,一起学习并帮助 Linux 成长和传播。随时在下方留下你的评论和问题 —— 我们期待你不同的观点。
|
||||
|
||||
-------------------------------
|
||||
|
||||
作者简介:
|
||||
|
||||
Gabriel Cánepa —— 一位来自阿根廷圣路易斯梅塞德斯镇 (Villa Mercedes, San Luis, Argentina) 的 GNU/Linux 系统管理员,Web 开发者。就职于一家世界领先级的消费品公司,乐于在每天的工作中能使用 FOSS 工具来提高生产力。
|
||||
|
||||
-------------------------------
|
||||
|
||||
译者简介:
|
||||
|
||||
[GHLandy](http://GHLandy.com) —— 生活中所有欢乐与苦闷都应藏在心中,有些事儿注定无人知晓,自己也无从说起。
|
||||
|
||||
-------------------------------
|
||||
|
||||
via: http://www.tecmint.com/things-i-dislike-and-love-about-gnu-linux/
|
||||
|
||||
作者:[Gabriel Cánepa][a]
|
||||
译者:[GHLandy](https://github.com/GHLandy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/gacanepa/
|
||||
[1]:https://linux.cn/article-3855-1.html
|
||||
[2]:http://www.tecmint.com/wp-content/uploads/2015/11/Things-I-Dislike-About-Linux.png
|
||||
[3]:http://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/
|
||||
[4]:http://linuxsay.com/
|
||||
[5]:http://www.tecmint.com/install-htop-linux-process-monitoring-for-rhel-centos-fedora/
|
||||
[6]:http://www.tecmint.com/author/gacanepa/
|
||||
[7]:http://www.tecmint.com/10-useful-free-linux-ebooks-for-newbies-and-administrators/
|
||||
[8]:http://www.tecmint.com/free-linux-shell-scripting-books/
|
91
published/20160425 What is SRE.md
Normal file
91
published/20160425 What is SRE.md
Normal file
@ -0,0 +1,91 @@
|
||||
什么是 SRE(网站可靠性工程)?
|
||||
============================================================
|
||||
|
||||
网站可靠性工程师(Site Reliability Engineer)是近来越来越多看到的一个职位。它是什么意思?它来自哪里?让我们从 Google SRE 团队来学习。
|
||||
|
||||
![Bridge](https://d3tdunqjn7n0wj.cloudfront.net/360x240/bridge-1031545-1400-389c9609ff7c64083c93db48dc77eeff.jpg)
|
||||
|
||||
本文为 Niall Richard Murphy、Jennifer Petoff、Chris Jones、Betsy Beyer 编辑的 [<ruby>《网站可靠性工程》<rt>Site Reliability Engineering</rt></ruby>][9] 一书的摘录。
|
||||
|
||||
SRE 网站可靠性工程(Site Reliability Engineering)在[ 11 月 7-10 日在阿姆斯特丹举办的 O'Reilly Velocity 会议][10]上也有提到。
|
||||
|
||||
### 介绍
|
||||
|
||||
> 希望不是一种策略。
|
||||
>
|
||||
> —— 传统的 SRE 如是说
|
||||
|
||||
一个公认的事实是系统不会自己运行。 那么,一个系统 — 尤其是复杂大规模系统 — _应该_怎么运行呢?
|
||||
|
||||
### 系统管理员的服务管理方法
|
||||
|
||||
以前,公司雇用系统管理员来运行复杂的计算系统。
|
||||
|
||||
系统管理员(或者称为 sysadmin)这种方式包括整合现有软件组件,使之互相协作来完成一个服务。系统管理员的任务是运行服务,响应事件,并在事件发生时进行更新。随着系统复杂度的增长和流量的增长,事件和更新也相应增长,导致管理员团队也越来越庞大才能完成更多的工作。由于系统管理员的角色需要的技能与产品开发人员有很大不同,开发和系统管理员被分为不同的团队:“开发”和“运维”。
|
||||
|
||||
系统管理员模式的服务管理有几个优点。对于决定该如何运行和服务的公司而言,这种方法相对容易实现:它作为一个已被人们所熟悉的行业范例,有很多例子可以从中学习和效仿。相关人才库已经广泛普及。有一系列现有的工具,软件组件(现成的或其他)和集成公司可用于帮助运行这些组装的系统,所以新手系统管理团队不必重新发明轮子以及从头设计系统。
|
||||
|
||||
此方式将公司开发和运维分离,也有一些缺点和困难。主要有两类:直接代价和间接代价。
|
||||
|
||||
直接代价很显而易见了。利用依靠手工干预来进行变更管理和事件处理的团队进行服务管理,当服务和/或流量增长时,成本是很昂贵的,因为团队随着系统负载的增长也在相应增长。
|
||||
|
||||
开发/运维分离的间接代价可能不那么明显,但常常比直接代价还要昂贵。代价来自于两个团队背景,技术,激励都非常不同。他们使用不同的词汇来描述所面临的情境;对技术方案的风险和可能性他们持不同的假设;对产品稳定性的目标级别也会有不同的争议。团队的分离很容易导致不只是激励的不同,还有沟通、目标的不同,以及最终,信任和尊重的分离。这是一种恶性循环。
|
||||
|
||||
因此,传统运营团队及其在产品开发中的同行往往会发生冲突,最突出的是如何将软件发布到生产环境。在开发团队的核心上,他们希望推出新功能,并看到它们被用户采纳。在运维团队的核心上, 他们希望确保服务在运行中不会中断。因为大多数中断是由某种变化引起的 - 新的配置、新的功能发布或者新的用户流量类型 - 这两个团队的目标基本上处于紧张状态。
|
||||
|
||||
两个团队都明白,以最想要的条款(“我们可以没有阻碍地在任何时间发布任何东西”以及“我们不想在系统工作后改变任何东西”)来表达他们的利益是不可接受的。因为他们的词汇和风险假设都不同,两个团体经常采用常见的斗争形式来提高他们的利益。 运维团队试图通过提高发布和变更门槛来保护运行中的系统免受更改的风险。例如,发布审查可能包含对_每个_问题的显式审查,这些问题过去都_曾经_引起过服务中断 - 它可能是一个任意长度的列表,并且不是所有检查元素都一样重要。开发团队很快学会了如何回应。他们通过较少的“发布”和更多的“功能切换”、“增量更新”或 “选择性失明”来规避。他们采取诸如分割产品功能的策略,以便更少的功能受到发布审查。
|
||||
|
||||
### Google 的服务管理方法:网站可靠性工程
|
||||
|
||||
冲突不是提供软件服务的必然部分。Google 选择以不同的方式运行自己的系统:我们的网站可靠性工程团队专注于雇佣软件工程师来运行我们的产品,并创建系统来完成那些本来由系统工程师手动完成的工作。
|
||||
|
||||
什么是网站可靠性工程(Site Reliability Engineering),是如它在谷歌定义的那样么?我的解释很简单:SRE 是当你要求一位软件工程师设计一个运维团队时所发生的结果。当我在 2003 年加入 Google 并负责运行一个由 7 名工程师组成的“生产团队”时,那时我工作的全部都是软件工程。所以我以自己是一名 SRE 的方式,设计和管理了一个_我_想要的团队的样子。这个团队已经成为了 Google 的目前的 SRE 团队,它仍如最初一名终生软件工程师所想象的那个样子。
|
||||
|
||||
Google 服务管理方法的主要构成部分是由每个 SRE 团队组成的。作为一个整体,SRE 可以分为两大类。
|
||||
|
||||
50-60% 的人是 Google 软件工程师,或者更确切地说,是通过 Google 软件工程师的标准程序招聘的人。其他 40-50% 的候选人非常接近 Google 软件工程师资格(即拥有所需技能集的 85-99%),以及一些具有大多数软件工程师没有的一些 SRE 技术技能的人。到目前为止,UNIX 系统底层和网络(第 1 层到第 3 层)的专业知识是我们寻求的两种最常见的替代技术技能。
|
||||
|
||||
所有的 SRE 的共同点是有开发软件系统以解决复杂问题的信念和能力。在 SRE 中,我们密切跟踪两个团队的职业发展,并且迄今为止发现在两种工程师之间的表现没有实际差异。事实上,SRE 团队的多样性背景经常产生聪明、高质量的系统,这显然是几个技能集合成的产物。
|
||||
|
||||
我们这样招聘 SRE 的结果是,我们有了这样一个团队:(a)手动执行任务很快会变得无聊。(b)他们有必要的技能集来写出软件以取代以前的手动操作,即使解决方案很复杂。SRE 还会与其他开发部门分享学术以及知识背景。因此,SRE 从根本上做了一个运维团队历来做的工作,但它使用具有软件专业知识的工程师,并期望这些内在倾向于使用软件并且有能力用软件的人用软件设计并实现自动化来代替人力劳动。
|
||||
|
||||
按照设计,至关重要的是 SRE 团队专注于工程。没有恒定的工程,运维工作增加,团队将需要更多的人来上工作量。最终,传统的以运维为中心的团队与服务规模呈线性关系:如果服务支持的产品成功,运维工作将随着流量而增长。这意味着雇用更多的人一遍又一遍地完成相同的任务。
|
||||
|
||||
为了避免这种命运,负责管理服务的团队需要写代码,否则就会被工作淹没。因此,Google 为 SRE 们_设置了一个 “运维” 工作的上限,如任务单、紧急呼叫、手动任务最多只占 50% 工作量_。此上限确保 SRE 团队在其计划中有足够的时间使服务稳定及可操作。50% 是上限;随着时间的推移,除了自己的设备,SRE 团队应该只有很少的运维工作,他们几乎可以完全从事开发任务,因为服务基本上可以运行和维修自己:我们想要的系统是_自动的_,而不只是_自动化_。在实践中,规模和新功能始终是 SRE 要考虑的。
|
||||
|
||||
Google 的经验法则是,SRE 团队必须花费剩余的 50% 的时间来进行实际开发。那么我们该如何执行这个阈值呢?首先,我们必须测量 SRE 如何花费时间。通过测量,我们确保团队不断花费不到 50% 的时间用于开发改变他们实践的工作上。通常这意味着会将一些运维负担转移回开发团队,或者给团队添加新的员工,而不指派该团队额外的运维责任。意识到在运维和开发工作之间保持这种平衡使我们能保证 SRE 具有参与创造性的自主工程的空间,同时仍然保留从运维那学来的智慧。
|
||||
|
||||
我们发现 Google SRE 的运行大规模系统的方法有很多优点。由于 SRE 是直接修改代码以使 Google 的系统可以运行自己,SRE 团队的特点是快速创新以及大量接受变革。这样的团队能相对价廉地支持相同的服务,面向运维的团队需要大量的人。相反,运行、维护和改进系统所需的 SRE 的数量随系统的大小而线性收敛。最后,SRE 不仅规避了开发/运维分裂的障碍,而且这种结构也改善了我们的产品开发团队:产品开发和 SRE 团队之间的轻松转移交叉训练了整个团队,并且提高了那些在学习构建百万级别分布式系统上有困难的开发人员的技能。
|
||||
|
||||
尽管有这些好处,SRE 模型的特点是其自身独特的挑战。 Google 面临的一个持续挑战是招聘 SRE:SRE 不仅与产品开发招聘流程竞争相同的候选人,而且我们将招聘人员的编码和系统工程技能都设置得如此之高,这意味着我们的招聘池必然很小。由于我们的学科相对新颖独特,在如何建立和管理 SRE 团队方面没有太多的行业信息(不过希望这本书能朝着这个方向迈进!)。一旦 SRE 团队到位,他们潜在的非正统的服务管理方法需要强有力的管理支持。例如,一旦错误预估耗尽,除非是管理层的强制要求, 否则在季度剩余的时间里决定停止发布可能不会被产品开发团队所接受。
|
||||
|
||||
> **DevOps 或者 SRE?**
|
||||
|
||||
> “DevOps” 这个术语在 2008 年末出现,并在写这篇文章时(2016 年早期)仍在发生变动。 其核心原则:IT 部门在系统设计和开发的每个阶段的参与、严重依赖自动化与人力投入、工程实践和工具在操作任务中的应用,与许多 SRE 的原则和实践一致。 人们可以将 DevOps 视为几种核心 SRE原则向更广泛的组织,管理结构和人员的推广。 可以等价地将 SRE 视为具有某些特殊扩展的 DevOps 的特定实现。
|
||||
|
||||
------------------------
|
||||
|
||||
作者简介:Benjamin Treynor Sloss 创造了“网站可靠性工程(Site Reliability Engineering)”一词,他自 2003 年以来一直负责 Google 的全球运营、网络和生产工程。截至 2016 年,他管理着全球范围内一个大约 4000 名软硬件和网络工程师团队。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.oreilly.com/ideas/what-is-sre-site-reliability-engineering
|
||||
|
||||
作者:[Benjamin Treynor][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.oreilly.com/people/benjamin-treynor-sloss
|
||||
[1]:https://shop.oreilly.com/product/0636920053385.do
|
||||
[2]:https://shop.oreilly.com/product/0636920053385.do
|
||||
[3]:https://www.oreilly.com/ideas/what-is-sre-site-reliability-engineering
|
||||
[4]:https://shop.oreilly.com/product/0636920053385.do
|
||||
[5]:https://shop.oreilly.com/product/0636920053385.do
|
||||
[6]:https://www.oreilly.com/people/benjamin-treynor-sloss
|
||||
[7]:https://pixabay.com/
|
||||
[8]:https://www.oreilly.com/people/benjamin-treynor-sloss
|
||||
[9]:http://shop.oreilly.com/product/0636920041528.do?intcmp=il-webops-books-videos-update-na_new_site_site_reliability_engineering_text_cta
|
||||
[10]:http://conferences.oreilly.com/velocity/devops-web-performance-eu?intcmp=il-webops-confreg-update-vleu16_new_site_what_is_sre_text_cta
|
||||
[11]:https://pixabay.com/
|
114
published/20160510 What is Docker.md
Normal file
114
published/20160510 What is Docker.md
Normal file
@ -0,0 +1,114 @@
|
||||
Docker 是什么?
|
||||
================
|
||||
|
||||
![](https://d3tdunqjn7n0wj.cloudfront.net/720x480/card-catalog-crop-c76cf2c8b4881e6662c4e9058367a874.jpg)
|
||||
|
||||
> 这是一篇摘录,取自于 Karl Matthias 和 Sean P. Kane 撰写的 [Docker 即学即用][3]。其中或许包含一些引用到本文中没有的内容,因为那些是整本书中的一部分。
|
||||
|
||||
2013 年 3 月 15 日,在加利福尼亚州圣克拉拉召开的 Python 开发者大会上,dotCloud 的创始人兼首席执行官 Solomon Hvkes 在一场仅五分钟的[微型演讲][4]中,首次提出了 Docker 这一概念。当时,仅约 40 人(除 dotCloud 内部人员)获得了使用 Docker 的机会。
|
||||
|
||||
这在之后的几周内,有关 Docker 的新闻铺天盖地。随后这个项目很快在 [Github][5] 上开源,任何人都可以下载它并为其做出贡献。在之后的几个月中,越来越多的业界人士开始听说 Docker 以及它是如何彻底地改变了软件的开发、交付和运行的方式。一年之内,Docker 的名字几乎无人不知无人不晓,但还是有很多人不太明白 Docker 究竟是什么,人们为何如此兴奋。
|
||||
|
||||
Docker 是一个工具,它致力于为任何应用程序创建分发版本而简化封装流程,将其部署到各种规模的环境中,并将敏捷软件组织的工作流程和响应流水化。
|
||||
|
||||
### Docker 带来的希望
|
||||
|
||||
虽然表面上被视为一个虚拟化平台,但 Docker 远远不止如此。Docker 涉及的领域横跨了业界多个方面,包括 KVM、 Xen、 OpenStack、 Mesos、 Capistrano、 Fabric、 Ansible、 Chef、 Puppet、 SaltStack 等技术。或许你已经发现了,在 Docker 的竞争产品列表中有一些很值得关注。例如,大多数工程师都不会认为,虚拟化产品和配置管理工具是竞争关系,但 Docker 和这两种技术都有点关系。前面列举的一些技术常常因其提高了工作效率而获得称赞,这就导致了大量的探讨。而现在 Docker 正是这些过去十年间最广泛使用的技术之一。
|
||||
|
||||
如果你要拿 Docker 分别与这些领域的卫冕冠军按照功能逐项比较,那么 Docker 看上去可能只是个一般的竞争对手。Docker 在某些领域表现的更好,但它带来的是一个跨越广泛的解决工作流程中众多挑战的功能集合。通过将应用程序部署工具(如 Capistrano、 Fabric)的易用性和虚拟化系统管理的易于性结合,使工作流程自动化,以及易于实施<ruby>编排<rt>orchestration</rt></ruby>,Docker 提供了一个非常强大的功能集合。
|
||||
|
||||
大量的新技术来来去去,因此对这些新事物保持一定的怀疑总是好的。如果不深入研究,人们很容易误以为 Docker 只是另一种为开发者和运营团队解决一些具体问题的技术。如果把 Docker 单独看作一种虚拟化技术或者部署技术,它看起来并不引人注目。不过 Docker 可比表面上看起来的强大得多。
|
||||
|
||||
即使在小型团队中,团队内部的沟通和相处也往往是困难的。然而在我们生活的这个世界里,团队内部对于细节的沟通是迈向成功越来越不可或缺的因素。而一个能够降低沟通复杂性,协助开发更为强健软件的工具,无疑是一个巨大的成功。这正是 Docker 值得我们深入了解的原因。当然 Docker 也不是什么灵丹妙药,它的正确使用还需深思熟虑,不过 Docker 确实能够解决一些组织层面的现实问题,还能够帮助公司更好更快地发布软件。使用精心设计的 Docker 工作流程能够让技术团队更加和谐,为组织创造实实在在的收益。
|
||||
|
||||
那么,最让公司感到头疼的问题是什么呢?现如今,很难按照预期的速度发布软件,而随着公司从只有一两个开发人员成长到拥有若干开发团队的时候,发布新版本时的沟通负担将越来越重,难以管理。开发者不得不去了解软件所处环境的复杂性,生产运营团队也需要不断地理解所发布软件的内部细节。这些通常都是不错的工作技能,因为它们有利于更好地从整体上理解发布环境,从而促进软件的鲁棒性设计。但是随着组织成长的加速,这些技能的拓展很困难。
|
||||
|
||||
充分了解所用的环境细节往往需要团队之间大量的沟通,而这并不能直接为团队创造值。例如,为了发布版本 1.2.1、开发人员要求运维团队升级特定的库,这个过程就降低了开发效率,也没有为公司创造价值。如果开发人员能够直接升级他们所使的库,然后编写代码,测试新版本,最后发布软件,那么整个交付过程所用的时间将会明显缩短。如果运维人员无需与多个应用开发团队相协调,就能够在宿主系统上升级软件,那么效率将大大提高。Docker 有助于在软件层面建立一层隔离,从而减轻团队的沟通负担。
|
||||
|
||||
除了有助于解决沟通问题,在某种程度上 Docker 的软件架构还鼓励开发出更多健壮的应用程序。这种架构哲学的核心是一次性的小型容器。在新版本部署的时候,会将旧版本应用的整个运行环境全部丢弃。在应用所处的环境中,任何东西的存在时间都不会超过应用程序本身。这是一个简单却影响深远的想法。这就意味着,应用程序不会意外地依赖于之前版本的遗留产物;对应用的短暂调试和修改也不会存在于未来的版本中;应用程序具有高度的可移植性,因为应用的所有状态要么直接包含于部署物中,且不可修改,要么存储于数据库、缓存或文件服务器等外部依赖中。
|
||||
|
||||
因此,应用程序不仅具有更好的可扩展性,而且更加可靠。存储应用的容器实例数量的增减,对于前端网站的影响很小。事实证明,这种架构对于非 Docker 化的应用程序已然成功,但是 Docker 自身包含了这种架构方式,使得 Docker 化的应用程序始终遵循这些最佳实践,这也是一件好事。
|
||||
|
||||
### Docker 工作流程的好处
|
||||
|
||||
我们很难把 Docker 的好处一一举例。如果用得好,Docker 能在多个方面为组织,团队,开发者和运营工程师带来帮助。从宿主系统的角度看,所有应用程序的本质是一样的,因此这就决定了 Docker 让架构的选择更加简单。这也让工具的编写和应用程序之间的分享变得更加容易。这世上没有什么只有好处却没有挑战的东西,但是 Docker 似乎就是一个例外。以下是一些我们使用 Docker 能够得到的好处:
|
||||
|
||||
**使用开发人员已经掌握的技能打包软件**
|
||||
|
||||
> 许多公司为了管理各种工具来为它们支持的平台生成软件包,不得不提供一些软件发布和构建工程师的岗位。像 rpm、mock、 dpkg 和 pbuilder 等工具使用起来并不容易,每一种工具都需要单独学习。而 Docker 则把你所有需要的东西全部打包起来,定义为一个文件。
|
||||
|
||||
**使用标准化的镜像格式打包应用软件及其所需的文件系统**
|
||||
|
||||
> 过去,不仅需要打包应用程序,还需要包含一些依赖库和守护进程等。然而,我们永远不能百分之百地保证,软件运行的环境是完全一致的。这就使得软件的打包很难掌握,许多公司也不能可靠地完成这项工作。常有类似的事发生,使用 Scientific Linux 的用户试图部署一个来自社区的、仅在 Red Hat Linux 上经过测试的软件包,希望这个软件包足够接近他们的需求。如果使用 Dokcer、只需将应用程序和其所依赖的每个文件一起部署即可。Docker 的分层镜像使得这个过程更加高效,确保应用程序运行在预期的环境中。
|
||||
|
||||
**测试打包好的构建产物并将其部署到运行任意系统的生产环境**
|
||||
|
||||
> 当开发者将更改提交到版本控制系统的时候,可以构建一个新的 Docker 镜像,然后通过测试,部署到生产环境,整个过程中无需任何的重新编译和重新打包。
|
||||
|
||||
**将应用软件从硬件中抽象出来,无需牺牲资源**
|
||||
|
||||
> 传统的企业级虚拟化解决方案,例如 VMware,以消耗资源为代价在物理硬件和运行其上的应用软件之间建立抽象层。虚拟机管理程序和每一个虚拟机中运行的内核都要占用一定的硬件系统资源,而这部分资源将不能够被宿主系统的应用程序使用。而容器仅仅是一个能够与 Linux 内核直接通信的进程,因此它可以使用更多的资源,直到系统资源耗尽或者配额达到上限为止。
|
||||
|
||||
Docker 出现之前,Linux 容器技术已经存在了很多年,Docker 使用的技术也不是全新的。但是这个独一无二的集强大架构和工作流程于一身的 Docker 要比各个技术加在一起还要强大的多。Docker 终于让已经存在了十余年的 Linux 容器走进了普通技术人员的生活中。Docker 让容器更加轻易地融入到公司现有的工作流程中。以上讨论到的问题已被很多人认可,以至于 Docker 项目的快速发展超出了所有人的合理预期。
|
||||
|
||||
Docker 发布的第一年,许多刚接触的新人惊讶地发现,尽管 Docker 还不能在生产环境中使用,但是来自 Docker 开源社区源源不断的提交,飞速推动着这个项目向前发展。随着时间的推移,这一速度似乎越来越快。现在 Docker 进入了 1.x 发布周期,稳定性好了,可以在生产环境中使用。因此,许多公司使用 Docker 来解决它们在应用程序交付过程中面对的棘手问题。
|
||||
|
||||
### Docker 不是什么
|
||||
|
||||
Docker 可以解决很多问题,这些问题是其他类型的传统工具专门解决的。那么 Docker 在功能上的广度就意味着它在特定的功能上缺乏深度。例如,一些组织认为,使用 Docker 之后可以完全摈弃配置管理工具,但 Docker 真正强大之处在于,它虽然能够取代某些传统的工具,但通常与它们是兼容的,甚至与它们结合使用还能增强自身的功能。下面将列举一些 Docker 还未能完全取代的工具,如果与它们结合起来使用,往往能取得更好的效果。
|
||||
|
||||
**企业级虚拟化平台(VMware、KVM 等)**
|
||||
|
||||
> 容器并不是传统意义上的虚拟机。虚拟机包含完整的操作系统,运行在宿主操作系统之上。虚拟化平台最大的优点是,一台宿主机上可以使用虚拟机运行多个完全不同的操作系统。而容器是和主机共用同一个内核,这就意味着容器使用更少的系统资源,但必须基于同一个底层操作系统(如 Linux)。
|
||||
|
||||
**云平台(Openstack、CloudStack 等)**
|
||||
|
||||
> 与企业级虚拟化平台一样,容器和云平台的工作流程表面上有大量的相似之处。从传统意义上看,二者都可以按需横向扩展。但是,Docker 并不是云平台,它只能在预先安装 Docker 的宿主机中部署,运行和管理容器,并能创建新的宿主系统(实例),对象存储,数据块存储以及其他与云平台相关的资源。
|
||||
|
||||
**配置管理工具(Puppet、Chef 等)**
|
||||
|
||||
> 尽管 Docker 能够显著提高一个组织管理应用程序及其依赖的能力,但不能完全取代传统的配置管理工具。Dockerfile 文件用于定义一个容器构建时内容,但不能持续管理容器运行时的状态和 Docker 的宿主系统。
|
||||
|
||||
**部署框架(Capistrano、Fabric等)**
|
||||
|
||||
> Docker 通过创建自成一体的容器镜像,简化了应用程序在所有环境上的部署过程。这些用于部署的容器镜像封装了应用程序的全部依赖。然而 Docker 本身无法执行复杂的自动化部署任务。我们通常使用其他工具一起实现较大的工作流程自动化。
|
||||
|
||||
**工作负载管理工具(Mesos、Fleet等)**
|
||||
|
||||
> Docker 服务器没有集群的概念。我们必须使用其他的业务流程工具(如 Docker 自己开发的 Swarm)智能地协调多个 Docker 主机的任务,跟踪所有主机的状态及其资源使用情况,确保运行着足够的容器。
|
||||
|
||||
**虚拟化开发环境(Vagrant 等)**
|
||||
|
||||
> 对开发者来说,Vagrant 是一个虚拟机管理工具,经常用来模拟与实际生产环境尽量一致的服务器软件栈。此外,Vagrant 可以很容易地让 Mac OS X 和基于 Windows 的工作站运行 Linux 软件。由于 Docker 服务器只能运行在 Linux 上,于是它提供了一个名为 Boot2Docker 的工具允许开发人员在不同的平台上快速运行基于 Linux 的 Docker 容器。Boot2Docker 足以满足很多标准的 Docker 工作流程,但仍然无法支持 Docker Machine 和 Vagrant 的所有功能。
|
||||
|
||||
如果没有强有力的参考标准,很难理解 Docker 的作用。下一章我们将概览 Docker,它是什么,它的目标使用场景,以及它的优势。
|
||||
|
||||
-----------------
|
||||
作者简介:
|
||||
|
||||
#### [Karl Matthias][1]
|
||||
|
||||
Karl Matthias 曾在创业公司和世界 500 强企业中担任过开发人员,系统管理员和网络工程师。在德国和英国的初创公司工作了若干年后,他和家人回到了美国俄勒冈州波特兰,在 New Relic 公司担任首席网站可靠性工程师。业余时间,他会和他的两个女儿玩,用他那老式相机摄摄影,或者骑骑自行车。
|
||||
|
||||
#### [Sean Kane][2]
|
||||
|
||||
Sean Kane 目前在 New Relic 公司的共享基础设施团队中担任首席网站可靠性工程师。他在生产运维领域有很长的职业生涯,在不同的行业中工作过,有许多不同的头衔。他在各类聚会和技术论坛做过演讲,涉及过疲劳预警和硬件自动化等话题。他的青年阶段大部分在海外度过,毕业于林林兄弟及巴纳姆和贝利小丑学院,在美国中央情报局做过两次实习等等,他一直在探索生活的真谛。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.oreilly.com/learning/what-is-docker
|
||||
|
||||
作者:[Karl Matthias][a],[Sean Kane][b]
|
||||
译者:[Cathon](https://github.com/Cathon)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.oreilly.com/people/5abbf-karl-matthias
|
||||
[b]:https://www.oreilly.com/people/d5ce6-sean-kane
|
||||
[1]:https://www.oreilly.com/people/5abbf-karl-matthias
|
||||
[2]:https://www.oreilly.com/people/d5ce6-sean-kane
|
||||
[3]:http://shop.oreilly.com/product/0636920036142.do?intcmp=il-security-books-videos-update-na_new_site_what_is_docker_text_cta
|
||||
[4]:http://youtu.be/wW9CAH9nSLs
|
||||
[5]:https://github.com/docker/docker
|
||||
[6]:https://commons.wikimedia.org/wiki/File:2009_3962573662_card_catalog.jpg
|
@ -0,0 +1,276 @@
|
||||
忘记技术债务 —— 教你如何创造技术财富
|
||||
===============
|
||||
|
||||
电视里正播放着《老屋》节目,[Andrea Goulet][58] 和她的商业合作伙伴正悠闲地坐在客厅里,商讨着他们的战略计划。那正是大家思想的火花碰撞出创新事物的时刻。他们正在寻求一种能够实现自身价值的方式 —— 为其它公司清理<ruby>遗留代码<rt>legacy code</rt></ruby>及科技债务。他们此刻的情景,像极了电视里的场景。(LCTT 译注:《老屋》电视节目提供专业的家装、家庭改建、重新装饰、创意等等信息,与软件的改造有异曲同工之处)。
|
||||
|
||||
“我们意识到我们现在做的工作不仅仅是清理遗留代码,实际上我们是在用重建老屋的方式来重构软件,让系统运行更持久、更稳定、更高效,”Goulet 说。“这让我开始思考公司如何花钱来改善他们的代码,以便让他们的系统运行更高效。就好比为了让屋子变得更有价值,你不得不使用一个全新的屋顶。这并不吸引人,但却是至关重要的,然而很多人都搞错了。“
|
||||
|
||||
如今,她是 [Corgibytes][57] 公司的 CEO —— 这是一家提高软件现代化和进行系统重构方面的咨询公司。她曾经见过各种各样糟糕的系统、遗留代码,以及严重的科技债务事件。Goulet 认为**创业公司需要转变思维模式,不是偿还债务,而是创造科技财富,不是要铲除旧代码,而是要逐步修复代码**。她解释了这种新的方法,以及如何完成这些看似不可能完成的事情 —— 实际上是聘用优秀的工程师来完成这些工作。
|
||||
|
||||
### 反思遗留代码
|
||||
|
||||
关于遗留代码最常见的定义是由 Michael Feathers 在他的著作[<ruby>《高效利用遗留代码》<rt>Working Effectively with Legacy Code</rt></ruby>][56]一书中提出:遗留代码就是没有被测试所覆盖的代码。这个定义比大多数人所认为的 —— 遗留代码仅指那些古老、陈旧的系统这个说法要妥当得多。但是 Goulet 认为这两种定义都不够明确。“遗留代码与软件的年头儿毫无关系。一个两年的应用程序,其代码可能已经进入遗留状态了,”她说。“**关键要看软件质量提高的难易程度。**”
|
||||
|
||||
这意味着写得不够清楚、缺少解释说明的代码,是没有包含任何关于代码构思和决策制定的流程的成果。单元测试就是这样的一种成果,但它并没有包括了写那部分代码的原因以及逻辑推理相关的所有文档。如果想要提升代码,但没办法搞清楚原开发者的意图 —— 那些代码就属于遗留代码了。
|
||||
|
||||
> **遗留代码不是技术问题,而是沟通上的问题。**
|
||||
|
||||
![](https://s3.amazonaws.com/marquee-test-akiaisur2rgicbmpehea/H4y9x4gQj61G9aK4v8Kp_Screen%20Shot%202016-08-11%20at%209.16.38%20AM.png)
|
||||
|
||||
如果你像 Goulet 所说的那样迷失在遗留代码里,你会发现每一次的沟通交流过程都会变得像那条[<ruby>康威定律<rt>Conway’s Law</rt></ruby>][54]所描述的一样。
|
||||
|
||||
Goulet 说:“这个定律认为你的代码能反映出整个公司的组织沟通结构,如果想修复公司的遗留代码,而没有一个好的组织沟通方式是不可能完成的。那是很多人都没注意到的一个重要环节。”
|
||||
|
||||
Goulet 和她的团队成员更像是考古学家一样来研究遗留系统项目。他们根据前开发者写的代码构件相关的线索来推断出他们的思想意图。然后再根据这些构件之间的关系来做出新的决策。
|
||||
|
||||
代码构件最重要的什么呢?**良好的代码结构、清晰的思想意图、整洁的代码**。例如,如果使用通用的名称如 “foo” 或 “bar” 来命名一个变量,半年后再返回来看这段代码时,根本就看不出这个变量的用途是什么。
|
||||
|
||||
如果代码读起来很困难,可以使用源代码控制系统,这是一个非常有用的工具,因为它可以提供代码的历史修改信息,并允许软件开发者写明他们作出本次修改的原因。
|
||||
|
||||
Goulet 说:“我一个朋友认为提交代码时附带的信息,每一个概要部分的内容应该有半条推文那么长(几十个字),如需要的话,代码的描述信息应该有一篇博客那么长。你得用这个方式来为你修改的代码写一个合理的说明。这不会浪费太多额外的时间,并且能给后期的项目开发者提供非常多的有用信息,但是让人惊讶的是很少有人会这么做。我们经常能看到一些开发人员在被一段代码激怒之后,要用 `git blame` 扒代码库找出这些垃圾是谁干的,结果最后发现是他们自己干的。”
|
||||
|
||||
使用自动化测试对于理解程序的流程非常有用。Goulet 解释道:“很多人都比较认可 Michael Feathers 提出的关于遗留代码的定义。测试套件对于理解开发者的意图来说是非常有用的工具,尤其当用来与[<ruby>行为驱动开发模式<rt>Behavior Driven Development</rt></ruby>][53]相结合时,比如编写测试场景。”
|
||||
|
||||
理由很简单,如果你想将遗留代码限制在一定程度下,注意到这些细节将使代码更易于理解,便于在以后也能工作。编写并运行一个代码单元,接受、认可,并且集成测试。写清楚注释的内容,方便以后你自己或是别人来理解你写的代码。
|
||||
|
||||
尽管如此,由于很多已知的和不可意料的原因,遗留代码仍然会出现。
|
||||
|
||||
在创业公司刚成立初期,公司经常会急于推出很多新的功能。开发人员在巨大的交付压力下,测试常常半途而废。Corgibytes 团队就遇到过好多公司很多年都懒得对系统做详细的测试了。
|
||||
|
||||
确实如此,当你急于开发出系统原型的时候,强制性地去做太多的测试也许意义不大。但是,一旦产品开发完成并投入使用后,你就需要投入时间精力来维护及完善系统了。Goulet 说:“很多人说,‘别在维护上费心思,重要的是功能!’ **如果真这样,当系统规模到一定程序的时候,就很难再扩展了。同时也就失去市场竞争力了。**”
|
||||
|
||||
最后才明白过来,原来热力学第二定律对代码也同样适用:**你所面临的一切将向熵增的方向发展。**你需要与混乱无序的技术债务进行一场无休无止的战斗。随着时间的推移,遗留代码也逐渐变成一种债务。
|
||||
|
||||
她说:“我们再次拿家来做比喻。你必须坚持每天收拾餐具、打扫卫生、倒垃圾。如果你不这么做,情况将来越来越糟糕,直到有一天你不得不向 HazMat 团队求助。”(LCTT 译注:HazMat 团队,危害物质专队)
|
||||
|
||||
就跟这种情况一样,Corgibytes 团队接到很多公司 CEO 的求助电话,比如 Features 公司的 CEO 在电话里抱怨道:“现在我们公司的开发团队工作效率太低了,三年前只需要两个星期就完成的工作,现在却要花费12个星期。”
|
||||
|
||||
> **技术债务往往反映出公司运作上的问题。**
|
||||
|
||||
很多公司的 CTO 明知会发生技术债务的问题,但是他们很难说服其它同事相信花钱来修复那些已经存在的问题是值得的。这看起来像是在走回头路,很乏味,也不是新的产品。有些公司直到系统已经严重影响了日常工作效率时,才着手去处理这些技术债务方面的问题,那时付出的代价就太高了。
|
||||
|
||||
### 忘记债务,创造技术财富
|
||||
|
||||
如果你想把[<ruby>重构技术债务<rt>reframe your technical debt</rt></ruby>][52] — [敏捷开发讲师 Declan Whelan 最近造出的一个术语][51] — 作为一个积累技术财富的机会,你很可能要先说服你们公司的 CEO、投资者和其它的股东接受并为之共同努力。
|
||||
|
||||
“我们没必要把技术债务想像得很可怕。当产品处于开发设计初期,技术债务反而变得非常有用,”Goulet 说。“当你解决一些系统遗留的技术问题时,你会充满成就感。例如,当你在自己家里安装新窗户时,你确实会花费一笔不少的钱,但是之后你每个月就可以节省 100 美元的电费。程序代码亦是如此。虽然暂时没有提高工作效率,但随时时间推移将提高生产力。”
|
||||
|
||||
一旦你意识到项目团队工作不再富有成效时,就需要确认下是哪些技术债务在拖后腿了。
|
||||
|
||||
“我跟很多不惜一切代价招募英才的初创公司交流过,他们高薪聘请一些工程师来只为了完成更多的工作。”她说。“与此相反,他们应该找出如何让原有的每个工程师能更高效率工作的方法。你需要去解决什么样的技术债务以增加额外的生产率?”
|
||||
|
||||
如果你改变自己的观点并且专注于创造技术财富,你将会看到产能过剩的现象,然后重新把多余的产能投入到修复更多的技术债务和遗留代码的良性循环中。你们的产品将会走得更远,发展得更好。
|
||||
|
||||
> **别把你们公司的软件当作一个项目来看。从现在起,把它想象成一栋自己要长久居住的房子。**
|
||||
|
||||
“这是一个极其重要的思想观念的转变,”Goulet 说。“这将带你走出短浅的思维模式,并让你比之前更加关注产品的维护工作。”
|
||||
|
||||
这就像对一栋房子,要实现其现代化及维护的方式有两种:小动作,表面上的更改(“我买了一块新的小地毯!”)和大改造,需要很多年才能偿还所有债务(“我想我们应替换掉所有的管道...”)。你必须考虑好两者,才能让你们已有的产品和整个团队顺利地运作起来。
|
||||
|
||||
这还需要提前预算好 —— 否则那些较大的花销将会是硬伤。定期维护是最基本的预期费用。让人震惊的是,很多公司都没把维护当成商务成本预算进来。
|
||||
|
||||
这就是 Goulet 提出“**<ruby>软件重构<rt>software remodeling</rt></ruby>**”这个术语的原因。当你房子里的一些东西损坏的时候,你并不是铲除整个房子,从头开始重建。同样的,当你们公司出现老的、损坏的代码时,重写代码通常不是最明智的选择。
|
||||
|
||||
下面是 Corgibytes 公司在重构客户代码用到的一些方法:
|
||||
|
||||
* 把大型的应用系统分解成轻量级的更易于维护的微服务。
|
||||
* 让功能模块彼此解耦以便于扩展。
|
||||
* 更新形象和提升用户前端界面体验。
|
||||
* 集合自动化测试来检查代码可用性。
|
||||
* 代码库可以让重构或者修改更易于操作。
|
||||
|
||||
系统重构也进入到 DevOps 领域。比如,Corgibytes 公司经常推荐新客户使用 [Docker][50],以便简单快速的部署新的开发环境。当你们团队有 30 个工程师的时候,把初始化配置时间从 10 小时减少到 10 分钟对完成更多的工作很有帮助。系统重构不仅仅是应用于软件开发本身,也包括如何进行系统重构。
|
||||
|
||||
如果你知道做些什么能让你们的代码管理起来更容易更高效,就应该把这它们写入到每年或季度的项目规划中。别指望它们会自动呈现出来。但是也别给自己太大的压力来马上实施它们。Goulets 看到很多公司从一开始就致力于 100% 测试覆盖率而陷入困境。
|
||||
|
||||
**具体来说,每个公司都应该把以下三种类型的重构工作规划到项目建设中来:**
|
||||
|
||||
* 自动测试
|
||||
* 持续交付
|
||||
* 文化提升
|
||||
|
||||
咱们来深入的了解下每一项内容。
|
||||
|
||||
#### 自动测试
|
||||
|
||||
“有一位客户即将进行第二轮融资,但是他们没办法在短期内招聘到足够的人才。我们帮助他们引进了一种自动化测试框架,这让他们的团队在 3 个月的时间内工作效率翻了一倍,”Goulets 说。“这样他们就可以在他们的投资人面前自豪的说,‘我们一个精英团队完成的任务比两个普通的团队要多。’”
|
||||
|
||||
自动化测试从根本上来讲就是单个测试的组合,就是可以再次检查某一行代码的单元测试。可以使用集成测试来确保系统的不同部分都正常运行。还可以使用验收性测试来检验系统的功能特性是否跟你想像的一样。当你把这些测试写成测试脚本后,你只需要简单地用鼠标点一下按钮就可以让系统自行检验了,而不用手工的去梳理并检查每一项功能。
|
||||
|
||||
在产品市场尚未打开之前就来制定自动化测试机制有些言之过早。但是一旦你有一款感到满意,并且客户也很依赖的产品,就应该把这件事付诸实施了。
|
||||
|
||||
#### 持续交付
|
||||
|
||||
这是与自动化交付相关的工作,过去是需要人工完成。目的是当系统部分修改完成时可以迅速进行部署,并且短期内得到反馈。这使公司在其它竞争对手面前有很大的优势,尤其是在客户服务行业。
|
||||
|
||||
“比如说你每次部署系统时环境都很复杂。熵值无法有效控制,”Goulets 说。“我们曾经见过花 12 个小时甚至更多的时间来部署一个很大的集群环境。在这种情况下,你不会愿意频繁部署了。因为太折腾人了,你还会推迟系统功能上线的时间。这样,你将落后于其它公司并失去竞争力。”
|
||||
|
||||
**在持续性改进的过程中常见的其它自动化任务包括:**
|
||||
|
||||
* 在提交完成之后检查构建中断部分。
|
||||
* 在出现故障时进行回滚操作。
|
||||
* 自动化审查代码的质量。
|
||||
* 根据需求增加或减少服务器硬件资源。
|
||||
* 让开发、测试及生产环境配置简单易懂。
|
||||
|
||||
举一个简单的例子,比如说一个客户提交了一个系统 Bug 报告。开发团队越高效解决并修复那个 Bug 越好。对于开发人员来说,修复 Bug 的挑战根本不是个事儿,这本来也是他们的强项,主要是系统设置上不够完善导致他们浪费太多的时间去处理 bug 以外的其它问题。
|
||||
|
||||
使用持续改进的方式时,你要严肃地决定决定哪些工作应该让机器去做,哪些交给研发去完成更好。如果机器更擅长,那就使其自动化完成。这样也能让研发愉快地去解决其它有挑战性的问题。同时客户也会很高兴地看到他们报怨的问题被快速处理了。你的待修复的未完成任务数减少了,之后你就可以把更多的时间投入到运用新的方法来提高产品的质量上了。**这是创造科技财富的一种转变。**因为开发人员可以修复 bug 后立即发布新代码,这样他们就有时间和精力做更多事。
|
||||
|
||||
“你必须时刻问自己,‘我应该如何为我们的客户改善产品功能?如何做得更好?如何让产品运行更高效?’不过还要不止于此。”Goulets 说。“一旦你回答完这些问题后,你就得询问下自己,如何自动去完成那些需要改善的功能。”
|
||||
|
||||
#### 文化提升
|
||||
|
||||
Corgibytes 公司每天都会看到同样的问题:一家创业公司建立了一个对开发团队毫无推动的文化环境。公司 CEO 抱着双臂思考着为什么这样的环境对员工没多少改变。然而事实却是公司的企业文化对工作并不利。为了激励工程师,你必须全面地了解他们的工作环境。
|
||||
|
||||
为了证明这一点,Goulet 引用了作者 Robert Henry 说过的一段话:
|
||||
|
||||
> **目的不是创造艺术,而是在最美妙的状态下让艺术应运而生。**
|
||||
|
||||
“你们也要开始这样思考一下你们的软件,”她说。“你们的企业文件就类似那个状态。你们的目标就是创造一个让艺术品应运而生的环境,这件艺术品就是你们公司的代码、一流的售后服务、充满幸福感的开发者、良好的市场预期、盈利能力等等。这些都息息相关。”
|
||||
|
||||
优先考虑解决公司的技术债务和遗留代码也是一种文化。那是真正为开发团队清除障碍,以制造影响的方法。同时,这也会让你将来有更多的时间精力去完成更重要的工作。如果你不从根本上改变固有的企业文化环境,你就不可能重构公司产品。改变对产品维护及现代化的投资的态度是开始实施变革的第一步,最理想情况是从公司的 CEO 开始自顶向下转变。
|
||||
|
||||
以下是 Goulet 关于建立那种流态文化方面提出的建议:
|
||||
|
||||
* 反对公司嘉奖那些加班到深夜的“英雄”。提倡高效率的工作方式。
|
||||
* 了解协同开发技术,比如 Woody Zuill 提出的[<ruby>合作编程<rt>Mob Programming</rt></ruby>][44]模式。
|
||||
* 遵从 4 个[现代敏捷开发][42]原则:用户至上、实践及快速学习、把安全放在首位、持续交付价值。
|
||||
* 每周为研发人员提供项目外的职业发展时间。
|
||||
* 把[日工作记录][43]作为一种驱动开发团队主动解决问题的方式。
|
||||
* 把同情心放在第一位。Corgibytes 公司让员工参加 [Brene Brown 勇气工厂][40]的培训是非常有用的。
|
||||
|
||||
“如果公司高管和投资者不支持这种升级方式,你得从客户服务的角度去说服他们,”Goulet 说,“告诉他们通过这次调整后,最终产品将如何给公司的大多数客户提高更好的体验。这是你能做的一个很有力的论点。”
|
||||
|
||||
### 寻找最具天才的代码重构者
|
||||
|
||||
整个行业都认为顶尖的工程师不愿意干修复遗留代码的工作。他们只想着去开发新的东西。大家都说把他们留在维护部门真是太浪费人才了。
|
||||
|
||||
**其实这些都是误解。如果你知道去哪里和如何找工程师,并为他们提供一个愉快的工作环境,你就可以找到技术非常精湛的工程师,来帮你解决那些最棘手的技术债务问题。**
|
||||
|
||||
“每次在会议上,我们都会问现场的同事‘谁喜欢去在遗留代码上工作?’每次只有不到 10% 的与会者会举手。”Goulet 说。“但是我跟这些人交流后,我发现这些工程师恰好是喜欢最具挑战性工作的人才。”
|
||||
|
||||
有一位客户来寻求她的帮助,他们使用国产的数据库,没有任何相关文档,也没有一种有效的方法来弄清楚他们公司的产品架构。她称修理这种情况的一类工程师为“修正者”。在 Corgibytes 公司,她有一支这样的修正者团队由她支配,热衷于通过研究二进制代码来解决技术问题。
|
||||
|
||||
![](https://s3.amazonaws.com/marquee-test-akiaisur2rgicbmpehea/BeX5wWrESmCTaJYsuKhW_Screen%20Shot%202016-08-11%20at%209.17.04%20AM.png)
|
||||
|
||||
那么,如何才能找到这些技术人才呢? Goulet 尝试过各种各样的方法,其中有一些方法还是富有成效的。
|
||||
|
||||
她创办了一个社区网站 [legacycode.rocks][49] 并且在招聘启示上写道:“长期招聘那些喜欢重构遗留代码的另类开发人员...如果你以从事处理遗留代码的工作为自豪,欢迎加入!”
|
||||
|
||||
“我开始收到很多人发来邮件说,‘噢,天呐,我也属于这样的开发人员!’”她说。“只需要发布这条信息,并且告诉他们这份工作是非常有意义的,就吸引了合适的人才。”
|
||||
|
||||
在招聘的过程中,她也会使用持续性交付的经验来回答那些另类开发者想知道的信息:包括详细的工作内容以及明确的要求。“我这么做的原因是因为我讨厌重复性工作。如果我收到多封邮件来咨询同一个问题,我会把答案发布在网上,我感觉自己更像是在写说明文档一样。”
|
||||
|
||||
但是随着时间的推移,她发现可以重新定义招聘流程来帮助她识别出更出色的候选人。比如说,她在应聘要求中写道,“公司 CEO 将会重新审查你的简历,因此请确保求职信中致意时不用写明性别。所有以‘尊敬的先生’或‘先生’开头的信件将会被当垃圾处理掉”。这些只是她的招聘初期策略。
|
||||
|
||||
“我开始这么做是因为很多申请人把我当成男性,因为我是一家软件公司的男性 CEO,我必须是男性!?”Goulet 说。“所以,有一天我想我应该它当作应聘要求放到网上,看有多少人注意到这个问题。令我惊讶的是,这让我过滤掉一些不太严谨的申请人。还突显出了很多擅于从事遗留代码方面工作的人。”
|
||||
|
||||
Goulet 想起一个应聘者发邮件给我说,“我查看了你们网站的代码(我喜欢这个网站,这也是我的工作)。你们的网站架构很奇特,好像是用 PHP 写的,但是你们却运行在用 Ruby 语言写的 Jekyll 下。我真的很好奇那是什么呢。”
|
||||
|
||||
Goulet 从她的设计师那里得知,原来,在 HTML、CSS 和 JavaScript 文件中有一个未使用的 PHP 类名,她一直想解决这个问题,但是一直没机会。Goulet 的回复是:“你正在找工作吗?”
|
||||
|
||||
另外一名候选人注意到她曾经在一篇说明文档中使用 CTO 这个词,但是她的团队里并没有这个头衔(她的合作伙伴是 Chief Code Whisperer)。这些注重细节、充满求知欲、积极主动的候选者更能引起她的注意。
|
||||
|
||||
> **代码修正者不仅需要注重细节,而且这也是他们必备的品质。**
|
||||
|
||||
让人吃惊的是,Goulet 从来没有为招募最优秀的代码修正者而感到厌烦过。“大多数人都是通过我们的网站直接投递简历,但是当我们想扩大招聘范围的时候,我们会通过 [PowerToFly][48] 和 [WeWorkRemotely][47] 网站进行招聘。我现在确实不需要招募新人马了。他们需要经历一段很艰难的时期才能理解代码修正者的意义是什么。”
|
||||
|
||||
如果他们通过首轮面试,Goulet 将会让候选者阅读一篇 Arlo Belshee 写的文章“[<ruby>命名是一个过程<rt>Naming is a Process</rt></ruby>][46]”。它讲的是非常详细的处理遗留代码的的过程。她最经典的指导方法是:“阅读完这段代码并且告诉我,你是怎么理解的。”
|
||||
|
||||
她将找出对问题的理解很深刻并且也愿意接受文章里提出的观点的候选者。这对于区分有深刻理解的候选者和仅仅想获得工作的候选者来说,是极其有用的办法。她强烈要求候选者找出一段与他操作相关的代码,来证明他是充满激情的、有主见的及善于分析问题的人。
|
||||
|
||||
最后,她会让候选者跟公司里当前的团队成员一起使用 [Exercism.io][45] 工具进行编程。这是一个开源项目,它允许开发者学习如何在不同的编程语言环境下使用一系列的测试驱动开发的练习进行编程。结对编程课程的第一部分允许候选者选择其中一种语言来使用。下一个练习中,面试官可以选择一种语言进行编程。他们总能看到那些人处理异常的方法、随机应便的能力以及是否愿意承认某些自己不了解的技术。
|
||||
|
||||
“当一个人真正的从执业者转变为大师的时候,他会毫不犹豫的承认自己不知道的东西,”Goulet说。
|
||||
|
||||
让他们使用自己不熟悉的编程语言来写代码,也能衡量其坚韧不拔的毅力。“我们想听到某个人说,‘我会深入研究这个问题直到彻底解决它。’也许第二天他们仍然会跑过来跟我们说,‘我会一直留着这个问题直到我找到答案为止。’那是作为一个成功的修正者表现出来的一种气质。”
|
||||
|
||||
> **产品开发人员在我们这个行业很受追捧,因此很多公司也想让他们来做维护工作。这是一个误解。最优秀的维护修正者并不是最好的产品开发工程师。**
|
||||
|
||||
如果一个有天赋的修正者在眼前,Goulet 懂得如何让他走向成功。下面是如何让这种类型的开发者感到幸福及高效工作的一些方式:
|
||||
|
||||
* 给他们高度的自主权。把问题解释清楚,然后安排他们去完成,但是永不命令他们应该如何去解决问题。
|
||||
* 如果他们要求升级他们的电脑配置和相关工具,尽管去满足他们。他们明白什么样的需求才能最大限度地提高工作效率。
|
||||
* 帮助他们[避免分心][39]。他们喜欢全身心投入到某一个任务直至完成。
|
||||
|
||||
总之,这些方法已经帮助 Corgibytes 公司培养出二十几位对遗留代码充满激情的专业开发者。
|
||||
|
||||
### 稳定期没什么不好
|
||||
|
||||
大多数创业公司都都不想跳过他们的成长期。一些公司甚至认为成长期应该是永无止境的。而且,他们觉得也没这个必要跳过成长期,即便他们已经进入到了下一个阶段:稳定期。**完全进入到稳定期意味着你拥有人力资源及管理方法来创造技术财富,同时根据优先权适当支出。**
|
||||
|
||||
“在成长期和稳定期之间有个转折点,就是维护人员必须要足够壮大,并且相对于专注新功能的产品开发人员,你开始更公平的对待维护人员,”Goulet 说。“你们公司的产品开发完成了。现在你得让他们更加稳定地运行。”
|
||||
|
||||
这就意味着要把公司更多的预算分配到产品维护及现代化方面。“你不应该把产品维护当作是一个不值得关注的项目,”她说。“这必须成为你们公司固有的一种企业文化 —— 这将帮助你们公司将来取得更大的成功。“
|
||||
|
||||
最终,你通过这些努力创建的技术财富,将会为你的团队带来一大批全新的开发者:他们就像侦查兵一样,有充足的时间和资源去探索新的领域,挖掘新客户资源并且给公司创造更多的机遇。当你们在新的市场领域做得更广泛并且不断取得进展 —— 那么你们公司已经真正地进入到繁荣发展的状态了。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://firstround.com/review/forget-technical-debt-heres-how-to-build-technical-wealth/
|
||||
|
||||
作者:[http://firstround.com/][a]
|
||||
译者:[rusking](https://github.com/rusking)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: http://firstround.com/
|
||||
[1]:http://corgibytes.com/blog/2016/04/15/inception-layers/
|
||||
[2]:http://www.courageworks.com/
|
||||
[3]:http://corgibytes.com/blog/2016/08/02/how-we-use-daily-journals/
|
||||
[4]:https://www.industriallogic.com/blog/modern-agile/
|
||||
[5]:http://mobprogramming.org/
|
||||
[6]:http://exercism.io/
|
||||
[7]:http://arlobelshee.com/good-naming-is-a-process-not-a-single-step/
|
||||
[8]:https://weworkremotely.com/
|
||||
[9]:https://www.powertofly.com/
|
||||
[10]:http://legacycode.rocks/
|
||||
[11]:https://www.docker.com/
|
||||
[12]:http://legacycoderocks.libsyn.com/technical-wealth-with-declan-wheelan
|
||||
[13]:https://www.agilealliance.org/resources/initiatives/technical-debt/
|
||||
[14]:https://en.wikipedia.org/wiki/Behavior-driven_development
|
||||
[15]:https://en.wikipedia.org/wiki/Conway%27s_law
|
||||
[16]:https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052
|
||||
[17]:http://corgibytes.com/
|
||||
[18]:https://www.linkedin.com/in/andreamgoulet
|
||||
[19]:http://corgibytes.com/blog/2016/04/15/inception-layers/
|
||||
[20]:http://www.courageworks.com/
|
||||
[21]:http://corgibytes.com/blog/2016/08/02/how-we-use-daily-journals/
|
||||
[22]:https://www.industriallogic.com/blog/modern-agile/
|
||||
[23]:http://mobprogramming.org/
|
||||
[24]:http://mobprogramming.org/
|
||||
[25]:http://exercism.io/
|
||||
[26]:http://arlobelshee.com/good-naming-is-a-process-not-a-single-step/
|
||||
[27]:https://weworkremotely.com/
|
||||
[28]:https://www.powertofly.com/
|
||||
[29]:http://legacycode.rocks/
|
||||
[30]:https://www.docker.com/
|
||||
[31]:http://legacycoderocks.libsyn.com/technical-wealth-with-declan-wheelan
|
||||
[32]:https://www.agilealliance.org/resources/initiatives/technical-debt/
|
||||
[33]:https://en.wikipedia.org/wiki/Behavior-driven_development
|
||||
[34]:https://en.wikipedia.org/wiki/Conway%27s_law
|
||||
[35]:https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052
|
||||
[36]:https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052
|
||||
[37]:http://corgibytes.com/
|
||||
[38]:https://www.linkedin.com/in/andreamgoulet
|
||||
[39]:http://corgibytes.com/blog/2016/04/15/inception-layers/
|
||||
[40]:http://www.courageworks.com/
|
||||
[41]:http://corgibytes.com/blog/2016/08/02/how-we-use-daily-journals/
|
||||
[42]:https://www.industriallogic.com/blog/modern-agile/
|
||||
[43]:http://corgibytes.com/blog/2016/08/02/how-we-use-daily-journals/
|
||||
[44]:http://mobprogramming.org/
|
||||
[45]:http://exercism.io/
|
||||
[46]:http://arlobelshee.com/good-naming-is-a-process-not-a-single-step/
|
||||
[47]:https://weworkremotely.com/
|
||||
[48]:https://www.powertofly.com/
|
||||
[49]:http://legacycode.rocks/
|
||||
[50]:https://www.docker.com/
|
||||
[51]:http://legacycoderocks.libsyn.com/technical-wealth-with-declan-wheelan
|
||||
[52]:https://www.agilealliance.org/resources/initiatives/technical-debt/
|
||||
[53]:https://en.wikipedia.org/wiki/Behavior-driven_development
|
||||
[54]:https://en.wikipedia.org/wiki/Conway%27s_law
|
||||
[56]:https://www.amazon.com/Working-Effectively-Legacy-Michael-Feathers/dp/0131177052
|
||||
[57]:http://corgibytes.com/
|
||||
[58]:https://www.linkedin.com/in/andreamgoulet
|
@ -0,0 +1,85 @@
|
||||
如何重置 RHEL7/CentOS7 系统的密码
|
||||
=================
|
||||
|
||||
### 介绍
|
||||
|
||||
**目的**
|
||||
|
||||
在 RHEL7/CentOS7/Scientific Linux 7 中重设 root 密码。
|
||||
|
||||
**要求**
|
||||
|
||||
RHEL7 / CentOS7 / Scientific Linux 7
|
||||
|
||||
**困难程度**
|
||||
|
||||
中等
|
||||
|
||||
### 指导
|
||||
|
||||
RHEL7 的世界发生了变化,重置 root 密码的方式也一样。虽然中断引导过程的旧方法(init=/bin/bash)仍然有效,但它不再是推荐的。“Systemd” 使用 “rd.break” 来中断引导。让我们快速浏览下整个过程。
|
||||
|
||||
**启动进入最小模式**
|
||||
|
||||
重启系统并在内核列表页面在系统启动之前按下 `e`。你会进入编辑模式。
|
||||
|
||||
**中断启动进程**
|
||||
|
||||
在内核字符串中 - 在以 `linux 16 /vmlinuz- ect` 结尾的行中输入 `rd.break`。接着 `Ctrl+X` 重启。系统启动进入初始化内存磁盘,并挂载在 `/sysroot`。在此模式中你不需要输入密码。
|
||||
|
||||
**重新挂载文件系统以便读写**
|
||||
|
||||
```
|
||||
switch_root:/# mount -o remount,rw /sysroot/
|
||||
```
|
||||
|
||||
**使 /sysroot 成为根目录**
|
||||
|
||||
```
|
||||
switch_root:/# chroot /sysroot
|
||||
```
|
||||
|
||||
命令行提示符会稍微改变。
|
||||
|
||||
**修改 root 密码**
|
||||
|
||||
```
|
||||
sh-4.2# passwd
|
||||
```
|
||||
|
||||
**加载 SELinux 策略**
|
||||
|
||||
```
|
||||
sh-4.2# load_policy -i
|
||||
```
|
||||
|
||||
**在 /etc/shadow 中设置上下文类型**
|
||||
|
||||
```
|
||||
sh-4.2# chcon -t shadow_t /etc/shadow
|
||||
```
|
||||
|
||||
注意:你可以通过如下创建 `autorelabel` 文件的方式来略过最后两步,但自动重建卷标会花费很长时间。
|
||||
|
||||
```
|
||||
sh-4.2# touch /.autorelabel
|
||||
```
|
||||
|
||||
因为这个原因,尽管它更简单,它应该作为“懒人选择”,而不是建议。
|
||||
|
||||
**退出并重启**
|
||||
|
||||
退出并重启并用新的 root 密码登录。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://linuxconfig.org/how-to-reset-the-root-password-in-rhel7-centos7-scientific-linux-7-based-systems
|
||||
|
||||
作者:[Rado Folwarczny][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://linuxconfig.org/how-to-reset-the-root-password-in-rhel7-centos7-scientific-linux-7-based-systems
|
||||
|
@ -1,42 +1,40 @@
|
||||
OneNewLife translated
|
||||
|
||||
Apache、Nginx 与 Node.js 之争 —— WordPress 与 Ghost 的性能大对决
|
||||
============================================================
|
||||
|
||||
![Node、Apache 与 Nginx 的对决](https://iwf1.com/wordpress/wp-content/uploads/2016/11/Node-vs-Apache-vs-Nginx-730x430.jpg)
|
||||
![Node、Apache 与 Nginx 的对决](https://iwf1.com/wordpress/wp-content/uploads/2016/11/Node-vs-Apache-vs-Nginx-730x430.jpg)
|
||||
|
||||
巨强之间的终极对决:崛起的新星 Node.js 能否战胜巨人 Apache 和 Nginx?
|
||||
巨头之间的终极对决:崛起的新星 Node.js 能否战胜巨人 Apache 和 Nginx?
|
||||
|
||||
我和你一样,都阅读过大量散布在互联网各处的意见或事实,其中有一些我认为是可靠的,而其它的可能是谣传,让人难以置信。
|
||||
|
||||
我读过的许多信息是相当矛盾的,有人深信 StackOverflow,而其他人展示了一个清晰的令人惊讶的结果,这在推动我自己去做测试来验证结论的过程中扮演了重要的角色。
|
||||
我读过的许多信息是相当矛盾的,有人深信 StackOverflow(比如[这个](http://stackoverflow.com/questions/9967887/node-js-itself-or-nginx-frontend-for-serving-static-files)和[另一个](http://stackoverflow.com/questions/16770673/using-node-js-only-vs-using-node-js-with-apache-nginx)),而其他人展示了一个清晰的令人惊讶的[结果](http://centminmod.com/siegebenchmarks/2013/020313/index.html),这在推动我自己去做测试来验证结论的过程中扮演了重要的角色。
|
||||
|
||||
起初,我做了一些思想准备,认为我可以避免自己进行测试来校验结论的麻烦——在我沉浸在这种想法之前我甚至已经知道会这样。
|
||||
起初,我做了一些思想准备,我认为我可以避免自己进行实际测试来校验结论的麻烦——在我知道这一切之前我一直这样认为。
|
||||
|
||||
尽管如此,往后看的时候,似乎我最初的想法是相当准确的,并且已经再次重申我的测试。这个事实让我想起了当年我在学校学到的爱因斯坦和他的光电效应的实验,他面临着一个光的波粒二重性的问题,最初的结论是实验受到他的心理状态的影响,即当他期望结果是一个波的时候结果就会是一个波,反之亦然。
|
||||
尽管如此,回顾之前,似乎我最初的想法是相当准确的,并且被我的测试再次印证。这个事实让我想起了当年我在学校学到的爱因斯坦和他的光电效应的实验,他面临着一个光的波粒二重性的问题,最初的结论是实验受到他的心理状态的影响,即当他期望结果是一个波的时候结果就会是一个波,反之亦然。
|
||||
|
||||
也就是说,我坚信我的结果不会在不久的将来被证明是一个二重性,虽然我的心理状态可能在某种程度上对他们有影响。
|
||||
也就是说,我坚信我的结果不会在不久的将来被证明二重性,虽然我的心理状态可能在某种程度上对它们有影响。
|
||||
|
||||
### 关于比较
|
||||
|
||||
在我看来,我阅读的一个来源给作者处理自然现象和个人偏见带来了一种革命性的方式。
|
||||
上面我读过一份材料具有一种革新的方式,在我看来,需要了解其自然而然的主观性和作者自身的偏见。
|
||||
|
||||
这同时也是一种我决定接受的方式,因此我提前声明以下内容:
|
||||
我决定采用这种方式,因此,提前声明以下内容:
|
||||
|
||||
开发者花了很多年来磨练他们的工艺。那些达到更高水平的人通常参考很多因素来做出自己的抉择。这是主观的;你将会推崇和捍卫你的技术决策。
|
||||
开发者花了很多年来打磨他们的作品。那些取得了更高成就的人通常参考很多因素来做出自己的抉择,这是主观的做法;你需要推崇和捍卫你的技术决策。
|
||||
|
||||
也就是说,这个比较点不会成为另一篇“兄弟,使用任何适合你的东西”的文章。我将会根据我的自身经验、要求和偏见提出建议。你会同意一些观点,反对他人;这是很好的——你的意见会帮助别人做出明智的选择。
|
||||
也就是说,这个比较文章的着眼点不会成为另一篇“哥们,使用适合你的东西就好”的口水文章。我将会根据我的自身经验、需求和偏见提出建议。你可能会同意其中一些观点,反对另外一些;这很好——你的意见会帮助别人做出明智的选择。
|
||||
|
||||
感谢 Craig Buckler 的 [建站观点][2],这重新启发了我比较的意义——尝试重新忘记自我,并试图让所有的读者心悦诚服。
|
||||
感谢 [SitePoint][2] 的 Craig Buckler ,重新启发了我对比较类文章的看法——尝试重新忘记自我,并试图让所有的读者心悦诚服。
|
||||
|
||||
### 关于测试
|
||||
|
||||
所有的测试都在本地运行:
|
||||
|
||||
* 英特尔酷睿 i7-2600k,四核心八线程的机器
|
||||
* **[Gentoo Linux][1]** 是用于测试的操作系统
|
||||
* 英特尔酷睿 i7-2600k,四核八线程的机器
|
||||
* [Gentoo Linux][1] 是用于测试的操作系统
|
||||
|
||||
用于基准测试的工具:ApacheBench,2.3 版(次版本:1748469)
|
||||
用于基准测试的工具:ApacheBench,2.3 <$Revision: 1748469 $>
|
||||
|
||||
测试包括一系列基准,从 1000 到 10000 个请求以及从 100 到 1000 个的并发请求——结果相当令人惊讶。
|
||||
|
||||
@ -47,24 +45,24 @@ Apache、Nginx 与 Node.js 之争 —— WordPress 与 Ghost 的性能大对决
|
||||
[![Lorem Ipsum and ApacheBenchmark](http://iwf1.com/wordpress/wp-content/uploads/2016/11/Lorem-Ipsum-and-ApacheBenchmark-730x411.jpg)
|
||||
][3]
|
||||
|
||||
Lorem Ipsum 和 ApacheBenchmark
|
||||
*Lorem Ipsum 和 ApacheBenchmark*
|
||||
|
||||
我决定专注于静态文件的原因是因为它们删除了可能对测试产生影响的各种渲染因素,例如:编程语言解释器的速度、解释器与服务器的集成程度等等。
|
||||
我决定专注于静态文件的原因是因为它们去除了可能对测试产生影响的各种渲染因素,例如:编程语言解释器的速度、解释器与服务器的集成程度等等。
|
||||
|
||||
此外,基于我的自身经验,平均网页加载时间的很大一部分通常用于静态内容,例如图片,因此关注哪个服务器可以节省我们加载静态内容的时间是比较现实的。
|
||||
此外,基于我自身的经验,平均网页加载时间很大一部分通常花费在静态内容上,例如图片,因此关注哪个服务器可以节省我们加载静态内容的时间是比较现实的。
|
||||
|
||||
除此之外,我还想测试一个更加真实的案例,案例中我在运行不同 CMS 的动态页面(稍后将详细介绍)时对服务器进行基准测试。
|
||||
|
||||
### 服务器
|
||||
#### 服务器
|
||||
|
||||
正如我用的是 Gentoo Linux,你可以说我的 HTTP 服务器在一开始就已经经过优化了,因为我在构建系统的时候只使用了我实际需要的东西。也就是说,当我运行我的测试的时候,不应该在后台运行任何不必要的代码或加载没用的模块。
|
||||
正如我用的是 Gentoo Linux,你就知道我的 HTTP 服务器在一开始就已经经过优化了,因为我在构建系统的时候只使用了我实际需要的东西。也就是说,当我运行我的测试的时候,不会在后台运行任何不必要的代码或加载没用的模块。
|
||||
|
||||
[![Apache、Nginx 和 Node.js 的使用标志对比](http://iwf1.com/wordpress/wp-content/uploads/2016/10/Apache-vs-Nginx-vs-Node.js-use-flags-730x241.jpg)
|
||||
[![Apache、Nginx 和 Node.js 的使用的配置对比](http://iwf1.com/wordpress/wp-content/uploads/2016/10/Apache-vs-Nginx-vs-Node.js-use-flags-730x241.jpg)
|
||||
][4]
|
||||
|
||||
Apache、Nginx 和 Node.js 的使用标志对比
|
||||
*Apache、Nginx 和 Node.js 的使用的配置对比*
|
||||
|
||||
### Apache
|
||||
#### Apache
|
||||
|
||||
```
|
||||
$: curl -i http://localhost/index.html
|
||||
@ -84,7 +82,7 @@ Content-Type: text/html
|
||||
|
||||
Apache 配置了 “event mpm”。
|
||||
|
||||
### Nginx
|
||||
#### Nginx
|
||||
|
||||
```
|
||||
$: curl -i http://localhost/index.html
|
||||
@ -101,9 +99,9 @@ ETag: "58160010-2cf2"
|
||||
Accept-Ranges: bytes
|
||||
```
|
||||
|
||||
Nginx 包括各种调整:`sendfile on`、`tcp_nopush on` 和 `tcp_nodelay on`。
|
||||
Nginx 包括几个调整:`sendfile on`、`tcp_nopush on` 和 `tcp_nodelay on`。
|
||||
|
||||
### Node.js
|
||||
#### Node.js
|
||||
|
||||
```
|
||||
$: curl -i http://127.0.0.1:8080
|
||||
@ -117,7 +115,7 @@ Date: Sun, 30 Oct 2016 16:39:47 GMT
|
||||
Connection: keep-alive
|
||||
```
|
||||
|
||||
在静态测试中使用的 Node.js 服务器是从零开始定制的,这样可以让它尽可能更加的轻快——没有使用外部模块(Node 核心模块除外)。
|
||||
在静态测试中使用的 Node.js 服务器是从头定制的,这样可以让它尽可能更加的轻快——没有使用外部模块(Node 核心模块除外)。
|
||||
|
||||
### 测试结果
|
||||
|
||||
@ -126,19 +124,19 @@ Connection: keep-alive
|
||||
[![Apache、Nginx 与 Node 的对比:请求负载能力(每 100 位并发用户)](http://iwf1.com/wordpress/wp-content/uploads/2016/11/requests-730x234.jpg)
|
||||
][5]
|
||||
|
||||
Apache、Nginx 与 Node 的对比:请求负载的性能(每 100 位并发用户
|
||||
*Apache、Nginx 与 Node 的对比:请求负载的性能(每 100 位并发用户)*
|
||||
|
||||
[![Apache、Nginx 与 Node 的对比:用户负载能力](http://iwf1.com/wordpress/wp-content/uploads/2016/11/concurrency-730x234.jpg)
|
||||
][6]
|
||||
|
||||
Apache、Nginx 与 Node 的对比:用户负载能力(每 1000 个请求)
|
||||
*Apache、Nginx 与 Node 的对比:用户负载能力(每 1000 个请求)*
|
||||
|
||||
### 压力测试
|
||||
|
||||
[![Apache、Nginx 与 Node 的对比:完成 1000 位用户并发的 100000 个请求耗时](http://iwf1.com/wordpress/wp-content/uploads/2016/11/stress.jpg)
|
||||
][7]
|
||||
|
||||
Apache、Nginx 与 Node 的对比:完成 1000 位用户并发的 100000 个请求耗时
|
||||
*Apache、Nginx 与 Node 的对比:完成 1000 位用户并发的 100000 个请求耗时*
|
||||
|
||||
### 我们可以从结果中得到什么?
|
||||
|
||||
@ -146,31 +144,31 @@ Apache、Nginx 与 Node 的对比:完成 1000 位用户并发的 100000 个请
|
||||
|
||||
还有一个相当惊人的事实是,在特定的用户并发数和请求数下,Node.js 可以比 Nginx 和 Apache 更快。
|
||||
|
||||
当请求的数量在并发测试中增加的时候,Nginx 将重回领先的位置,这个结果可以让那些陷入 Node.js 的遐想的人清醒一下。
|
||||
但当请求的数量在并发测试中增加的时候,Nginx 将重回领先的位置,这个结果可以让那些陷入 Node.js 的遐想的人清醒一下。
|
||||
|
||||
和 Apache、Nginx 不同的是,Node.js 似乎对用户的并发数不太敏感,尤其是在集群节点。如图所示,集群节点在 0.1 秒左右保持一条直线,而 Apache 和 Nginx 都有大约 0.2 秒的波动。
|
||||
|
||||
基于上述统计可以得出的结论是:站点越小,其使用的服务器就越重要。然而,随着网站的受众越来越多,HTTP 服务器的影响变得愈加明显。
|
||||
基于上述统计可以得出的结论是:网站比较小,其使用的服务器就无所谓。然而,随着网站的受众越来越多,HTTP 服务器的影响变得愈加明显。
|
||||
|
||||
当涉及到每台服务器的原始速度的底线的时候,正如压力测试所描述的,我的感觉是,性能背后最关键的因素不是一些特定的算法,但它到底是什么,实际上每台服务器所运行的编程语言。
|
||||
当涉及到每台服务器的原始速度的底线的时候,正如压力测试所描述的,我的感觉是,性能背后最关键的因素不是一些特定的算法,而实际上是运行的每台服务器所用的编程语言。
|
||||
|
||||
由于 Apache 和 Nginx 都使用了 C 语言—— AOT 语言(编译型语言),而 Node.js 使用了 JavaScript ——这是一种 JIT 语言(解释型语言)。这意味着 Node.js 在执行程序的过程中还有额外的工作负担。
|
||||
|
||||
这意味着我不能仅仅基于上面的结果来下结论,而要做进一步校验,你会看到下面的结果,我得到几乎相同的性能奇偶性校验,即使当我使用一台经过优化的 Node.js 服务器来构建和流行的 Express 框架。
|
||||
这意味着我不能仅仅基于上面的结果来下结论,而要做进一步校验,正如你下面看到的结果,当我使用一台经过优化的 Node.js 服务器与流行的 Express 框架时,我得到几乎相同的性能结论。
|
||||
|
||||
### The Bigger Picture
|
||||
### 全面考虑
|
||||
|
||||
一天就这么过去了,如果没有服务的内容,HTTP 服务器是没什么用的。因此,在比较 web 服务器的时候,我们必须考虑的一个重要的部分就是我们希望在上面运行的内容。
|
||||
逝者如斯夫,如果没有服务的内容,HTTP 服务器是没什么用的。因此,在比较 web 服务器的时候,我们必须考虑的一个重要的部分就是我们希望在上面运行的内容。
|
||||
|
||||
虽然其它功能也存在,但是 HTTP 服务器最广泛的使用就是运行网站。因此,为了看到每台服务器的性能对现实生活的影响,我决定比较一下 WordPress ——世界上使用最广泛的 CMS(内容管理系统)和 Ghost ——内核使用了 JavaScript 的一颗冉冉升起的明星。
|
||||
虽然也有其它的功能,但是 HTTP 服务器最广泛的使用就是运行网站。因此,为了看到每台服务器的性能的实际效果,我决定比较一下世界上使用最广泛的 CMS(内容管理系统)WordPress 和 Ghost —— 内核使用了 JavaScript 的一颗冉冉升起的明星。
|
||||
|
||||
基于 JavaScript 的 Ghost 网页能否胜过运行在 PHP 和 Apache / Nginx 上面的 WordPress 页面?
|
||||
|
||||
这是一个有趣的问题,因为 Ghost 具有操作工具单一且一致的优点——无需额外的封装,而 WordPress 需要依赖 Apache / Nginx 和 PHP 之间的集成,这可能会导致显著的性能缺陷。
|
||||
|
||||
除此之外,PHP 和 Node.js 之间还有一个显著的性能差异,这有利于后者,我将在下面简要介绍一下,可能会出现一些与初衷大相径庭的结果。
|
||||
除此之外,PHP 距 Node.js 之间还有一个显著的性能落差,后者更佳,我将在下面简要介绍一下,可能会出现一些与初衷大相径庭的结果。
|
||||
|
||||
### PHP 与 Node.js 的对决
|
||||
#### PHP 与 Node.js 的对决
|
||||
|
||||
为了比较 WordPress 和 Ghost,我们必须首先考虑一个影响到两者的基本组件。
|
||||
|
||||
@ -178,9 +176,9 @@ Apache、Nginx 与 Node 的对比:完成 1000 位用户并发的 100000 个请
|
||||
|
||||
* 非阻塞的 I/O
|
||||
* 事件驱动
|
||||
* 更新颖,更少的残旧代码
|
||||
* 更新颖、更少的残旧代码
|
||||
|
||||
由于有大量的比较解释和演示了 Node.js 的原始速度超过 PHP(包括 PHP 7),我不会再进一步阐述这个主题,请你自行用谷歌搜索相关内容。
|
||||
由于有大量的测评文章解释和演示了 Node.js 的原始速度超过 PHP(包括 PHP 7),我不会再进一步阐述这个主题,请你自行用谷歌搜索相关内容。
|
||||
|
||||
因此,考虑到 Node.js 的性能优于 PHP,一个 Node.js 的网站的速度要比 Apache / Nginx 和 PHP 的网站快吗?
|
||||
|
||||
@ -188,9 +186,9 @@ Apache、Nginx 与 Node 的对比:完成 1000 位用户并发的 100000 个请
|
||||
|
||||
当比较 WordPress 和 Ghost 时,有些人会说这就像比较苹果和橘子,大多数情况下我同意这个观点,因为 WordPress 是一个完全成熟的 CMS,而 Ghost 基本上只是一个博客平台。
|
||||
|
||||
然而,两者仍然有共同竞争的市场,其中两者都可以用于向世界发布你的个人想法。
|
||||
然而,两者仍然有共同竞争的市场,这两者都可以用于向世界发布你的个人文章。
|
||||
|
||||
制定一个前提,我们怎么比较两个完全基于不同的代码来运行的平台,包括主题和核心功能。
|
||||
制定一个前提,我们怎么比较两个完全基于不同的代码来运行的平台,包括风格主题和核心功能。
|
||||
|
||||
事实上,一个科学的实验测试条件是很难设计的。然而,在这个测试中我对更接近生活的情景更感兴趣,所以 WordPress 和 Ghost 都将保留其主题。因此,这里的目标是使两个平台的网页大小尽可能相似,让 PHP 和 Node.js 在幕后斗智斗勇。
|
||||
|
||||
@ -199,19 +197,19 @@ Apache、Nginx 与 Node 的对比:完成 1000 位用户并发的 100000 个请
|
||||
[![Node、Nginx 和 Apache 性能比较表](http://iwf1.com/wordpress/wp-content/uploads/2016/11/Node-vs-Nginx-vs-Apache-comparison-table-730x185.jpg)
|
||||
][8]
|
||||
|
||||
Node、Nginx、Apache 以及运行 WordPress 和 Ghost 的比较。前两行是 WordPress,底部的两行是 Ghost
|
||||
*Node、Nginx、Apache 以及运行 WordPress 和 Ghost 的比较。前两行是 WordPress,底部的两行是 Ghost*
|
||||
|
||||
正如你所见,尽管事实上 Ghost(Node.js)正在加载一个更小的页面(你可能会惊讶 1 字节可以产生这么大的差异),它仍然比同时使用 Nginx 和 Apache 的 WordPress 要慢。
|
||||
正如你所见,尽管事实上 Ghost(Node.js)正在加载一个更小的页面(你可能会惊讶 1kb 可以产生这么大的差异),它仍然比同时使用 Nginx 和 Apache 的 WordPress 要慢。
|
||||
|
||||
此外,抢占每个 Node 服务器使用 Nginx 代理作为负载均衡器实际上会提升还是降低性能?
|
||||
此外,使用 Nginx 代理作为负载均衡器来接管每个 Node 服务器的请求实际上会提升还是降低性能?
|
||||
|
||||
那么,根据上面的表格,如果说它产生什么效果的话,它造成了减益的效果——这是一个合理的结果,因为额外封装一层理所当然会使其变得更慢。当然,上面的数字也表明这可以忽略不计。
|
||||
那么,根据上面的表格,如果说它产生什么效果的话,它造成了更慢的效果——这是一个合理的结果,因为额外封装一层理所当然会使其变得更慢。当然,上面的数字也表明这点差异可以忽略不计。
|
||||
|
||||
但是上表中最重要的一点是,即使 Node.js 比 PHP 快,HTTP 服务器的作用也可能超过某个 web 平台使用的编程语言的重要性。
|
||||
|
||||
当然,另一方面,如果加载的页面更多地依赖于服务器端的脚本服务,那么我怀疑结果可能会有点不同。
|
||||
当然,另一方面,如果加载的页面更多地依赖于服务器端的脚本处理,那么我怀疑结果可能会有点不同。
|
||||
|
||||
最后,如果一个 web 平台真的想在自己的天地里击败 WordPress,从这个比较中得出的结论就是,要想性能占优,必须要定制一些像 PHP-FPM 的工具,它将直接与 JavaScript 通信(而不是作为服务器来运行),因此它可以完全利用 JS 的力量来达到更好的性能。
|
||||
最后,如果一个 web 平台真的想在这场竞赛里击败 WordPress,从这个比较中得出的结论就是,要想性能占优,必须要定制一些像 PHP-FPM 的工具,它将直接与 JavaScript 通信(而不是作为服务器来运行),因此它可以完全发挥 JavaScript 的力量来达到更好的性能。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -219,7 +217,7 @@ via: https://iwf1.com/apache-vs-nginx-vs-node-js-and-what-it-means-about-the-per
|
||||
|
||||
作者:[Liron][a]
|
||||
译者:[OneNewLife](https://github.com/OneNewLife)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
90
published/20161103 Perl and the birth of the dynamic web.md
Normal file
90
published/20161103 Perl and the birth of the dynamic web.md
Normal file
@ -0,0 +1,90 @@
|
||||
Perl 与动态网站的诞生
|
||||
==================
|
||||
|
||||
> 在新闻组和邮件列表里、在计算机科学实验室里、在各大陆之间,流传着一个神秘的故事,那是关于 Perl 与动态网站之间的不得不说的往事。
|
||||
|
||||
![Perl and the birth of the dynamic web](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/osdc-lead-web-internet.png?itok=hq81pSDs "Perl and the birth of the dynamic web")
|
||||
|
||||
>图片来源 : [Internet Archive Book Images][30], 由 Opensource.com 修改. [CC BY-SA 4.0][29].
|
||||
|
||||
早期互联网历史中,有一些脍炙人口的开创性事件:如 蒂姆·伯纳斯·李(Tim Berners-Lee)在邮件组上[宣布][28] WWW-project 的那天,该文档随同 [CERN][27] 发布的项目代码进入到了公共域,以及 1993 年 1 月的[第一版 NCSA Mosaic 浏览器][26]。虽然这些独立的事件是相当重要的,但是当时的技术的开发已经更为丰富,不再是由一组的孤立事件组成,而更像是一系列有内在联系的故事。
|
||||
|
||||
这其中的一个故事描述的是网站是如何变成_动态的_,通俗说来就是我们如何使服务器除了提供静态 HTML 文档之外做更多的事。这是个流传在[新闻组][25]和邮件列表间、计算机科学实验室里、各个大陆之间的故事,重点不是一个人,而是一种编程语言:Perl。
|
||||
|
||||
### CGI 脚本和信息软件
|
||||
|
||||
在上世纪 90 年代中后期,Perl 几乎和动态网站是同义词。Perl 是一种相对来说容易学习的解释型语言,并且有强大的文本处理特性,使得它能够很容易的编写脚本来把一个网站关联到数据库、处理由用户发送的表单数据,当然,还要创造那些上世纪 90 年代的网站的经典形象——计数器和留言簿。
|
||||
|
||||
类似的网站特性渐渐的变成了 CGI 脚本的形式,其全称为通用网关接口(Common Gateway Interface),[首个实现][24]由 Rob McCool 于 1993 年 11 月在 NCSA HTTPD 上完成。CGI 是目的是直面功能,并且在短短几年间,任何人都可以很容易的找到一些由 Perl 写的预制的脚本存档。有一个声名狼籍的案例就是 [Matt's Scripts Archive][23],这是一种流行却包含各种安全缺陷的源代码库,它甚至使得 Perl 社区成员创建了一种被称为 [Not Matt‘s Scripts][22] 的更为专业的替换选择。
|
||||
|
||||
在当时,无论是业余爱好者,还是职业程序员都采用 Perl 来制作动态网站和应用,Tim O’Reilly [创造了词汇“信息软件(infoware)”][21] 来描述网站和 Perl 怎样成为变化中的计算机工业的一部分。考虑到 Yahoo!和 Amazon 带来的创新,O‘Reilly 写道:“传统软件在大量的软件中仅仅包含了少量的信息;而信息软件则在少量的软件中包含了大量的信息。” Perl 是一种像瑞士军刀一样的完美的小而强大的工具,它支撑了信息媒体从巨大的网站目录向早期的用户生成内容(UGC)平台的转变。
|
||||
|
||||
### 题外话
|
||||
|
||||
尽管使用 Perl 来制作 CGI 简直是上佳之选,但是编程语言和不断提升中的动态网站之间的关系变得更加的密切与深入。从[第一个网站][20](在 1990 年的圣诞节前)出现到 1993 年 McCool 实现 CGI 的短暂时期内,Web 上的各种东西,比如表单、图片以及表格,就这么逐渐出现在上世纪 90 年代乃至后来。尽管伯纳斯·李也对这些早期的岁月产生了影响,但是不同的人看到的是 Web 不同的潜在作用,并将它推向各自不同的方向。一方面,这样的结果来自一些著名的辩论,例如 [HTML 应该和 SGML 保持多近的关系][19]、[是否应该实现一个图像标签][18]等等。在另一方面,在没有直接因素影响的情况下改变是极其缓慢的。后者已经很好的描述了动态网站是如何发展的。
|
||||
|
||||
从某种意义上说,第一个“网关”的诞生可以追溯到 1991 至 1992 年之间(LCTT 译注:此处所谓“网关”的意义请参照 CGI 的定义),当时伯纳斯·李和一些计算机科学家与超文本爱好者[编写服务程序][17]使得一些特定的资源能够连接到一起,例如 CERN 的内部应用程序、通用的应用程序如 Oracle 数据库、[广域信息查询系统(WAIS)][16] 等等。(WAIS 是 Web 的前身,上世纪 80 年代后期开发,其中,开发者之一 [Brewster Kahle][15],是一个数字化图书管理员和 [Internet Archive][14] 的创始人。)可以这样理解,“网关”就是一个被设计用来连接其它 Web、数据库或者应用程序的定制的 Web 服务器。任何的动态功能就意味着在不同的端口上运行另外一个守护进程(参考阅读,例如伯纳斯·李对于在网站上[如何添加一个搜索功能][13] 的描述)。伯纳斯·李期望 Web 可以成为不同信息系统之间的通用接口,并且鼓励建立单一用途服务。他也提到 Perl 是一种强大的(甚至是不可思议)、可以将各种东西组合起来的语言。
|
||||
|
||||
然而,另一种对“网关”的理解指出它不一定是一个定制设备,可能只是一个脚本,一个并不需要额外服务器的低吞吐量的附加脚本。这种形式的首次出现是有争议性的 Jim Davis 的 [Gateway to the U Mich Geography server][11],于 1992 年的 11 月发布在了 WWW-talk 邮件列表中。Davis 的脚本是使用 Perl 编写的,是一种 Web API 的原型,基于格式化的用户查询从另外的服务器拉取数据。我们来说明一下这两种对于网关的理解的不同之处,伯纳斯·李[回复了][10] Davis 的邮件,期望他和 Michigan 服务器的作者“能够达成某种共识”,“从网络的角度来看的话”仅使用一台服务器来提供这样的信息可能会更有意义。伯纳斯·李,可能是期待着 Web 的发明者可以提出一种有秩序的信息资源访问方式。这样从不同服务器上拉取数据的网关和脚本意味着一种潜在的 Web 的质的变化,虽然不断增多,但也可能有点偏离了伯纳斯·李的原始观点。
|
||||
|
||||
### 回到 Perl HTTPD
|
||||
|
||||
在 Davis 的地理服务器上的网关向标准化的、低吞吐量的、通过 CGI 方式实现的脚本化网关迈进的一步中,[Perl HTTPD][9] 的出现是很重要的事件,它是 1993 年初由印地安纳大学的研究生 Marc Van Heyningen 在布卢明顿(Bloomington)完全使用 Perl 语言实现的一个 Web 服务器程序。从 Van Heyningen 给出的[设计原则][8]来看,基于使用 Perl 就不需要任何的编译过程这样一种事实,使得它能够成为一种极易扩展的服务器程序,这个服务器包含了“一个向代码中增加新特性时只要简单的重启一下就可以,而不会有任何的宕机时间的特性”,使得这个服务器程序可以频繁的加入新功能。
|
||||
|
||||
Perl HTTPD 代表了那种服务器程序应该是单一、特定目的的观点。相应的,这种模式似乎暗示了在 Web 开发中像这样渐进式的、持续测试的软件产品可能会最终变成一种共识。Van Heyningen 在后来[提到过][7]他从头编写这样一个服务器程序的初衷是当时没有一种简便的方式使用 CERN 服务器程序来生成“虚拟文档”(例如,动态生成的页面),他打趣说使用 Perl 这样的“神之语言”来写可能是最简单的方式了。在他初期编写的众多脚本中有一个 Sun 操作系统的用户手册的 Web 界面,以及 [Finger 网关][6](这是一种早期用来共享计算机系统信息或者是用户信息的协议)。
|
||||
|
||||
虽然 Van Heyningen 将印地安纳大学的服务器主要用来连接现存的信息资源,他和研究生们同时也看见了作为个人发布形式的潜在可能。其中一件广为人知事件是在 1993-1994 年之间围绕着一个著名的加拿大案件而[公布][5]的一系列的文件、照片和新闻故事,与此形成鲜明对比的是,所有的全国性媒体都保持了沉默。
|
||||
|
||||
Perl HTTPD 没有坚持到现在的需要。今天,Van Heyningen 回忆起这个程序的时候认为这个程序只是当时的一个原型产品。它的原始目的只是向那些已经选择了 Gopher 作为大学的网络界面的资深教员们展示了网络的另一种利用方式。Van Heyningen 以[一种基于 Web 的、可搜索的出版物索引][4]的方式,用代码回应了他的导师们的虚荣。就是说,在服务器程序技术方面关键创新是为了赢得争论的胜利而诞生的,在这个角度上来看代码做到了所有要求它所做的事。
|
||||
|
||||
不管该服务器程序的生命是否短暂,伴随者 Perl HTTPD 一起出现的理念已经传播到了各个角落。Van Heyningen 开始收到了获取该代码的请求,而后将它分享到了网上,并提示说,需要了解一些 Perl 就可以将它移植到其它操作系统(或者找到一个这样的人也行)。不久之后,居住在奥斯汀(Austin)的程序员 Tony Sanders 开发了一个被称为 [Plexus][3] 的轻便版本。Sander 的服务器程序是一款全功能的产品,并且同样包含了 Perl HTTPD 所建议的易扩展性,而且添加一些新的特性如图片解码等。Plexus [直接影响了][2] Rob McCool 给 NCSA HTTPD 服务器上的脚本开发的“htbin”,并且同样影响到了不久之后诞生的通用网关接口(CGI)。
|
||||
|
||||
在这些历史遗产之外,感谢妙不可言的 Internet Archive(互联网时光机)使得 Perl HTTPD 在今天依然保留在一种我们依然可以获取的形式,你可以从[这里下载 tarball][1]。
|
||||
|
||||
### 历史展望
|
||||
|
||||
对于技术世界的颠覆来说,技术的改变总是在一个相互对立的过程中。现有的技术是思考新技术的基础与起点。过时的编程形式启迪了今天人们做事的新方式。网络世界的创新可能看起来更像是对于旧技术的扩展,不仅仅是 Perl。
|
||||
|
||||
在萌芽事件的简单的时间轴之外,Web 历史学者也许可以从 Perl 获取更多的线索。其中一部份的挑战在于材料的获取。更多需要做的事情包括从可获取的大量杂乱的数据中梳理出它的结构,将分散在邮件列表、归档网站,书本和杂志中的信息内容组合在一起。还有一部分的挑战是需要认识到 Web 的历史不仅仅是新技术发布的日子,它同时包括了个人记忆、人类情感与社会进程等,并且这不仅仅是单一的历史线而是有许许多多条相似的历史线组合而成的。就如 Perl 的信条一样“殊途同归。(There's More Than One Way To Do It.)”
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/life/16/11/perl-and-birth-dynamic-web
|
||||
|
||||
作者:[Michael Stevenson][a]
|
||||
译者:[wcnnbdk1](https://github.com/wcnnbdk1)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://opensource.com/users/mstevenson
|
||||
[1]:https://web.archive.org/web/20011126190051/http://www.cs.indiana.edu/perl-server/httpd.pl.tar.Z
|
||||
[2]:http://1997.webhistory.org/www.lists/www-talk.1993q4/0516.html
|
||||
[3]:https://web.archive.org/web/19990421192342/http://www.earth.com/server/doc/plexus.html
|
||||
[4]:https://web.archive.org/web/19990428030253/http://www.cs.indiana.edu:800/cstr/search
|
||||
[5]:https://web.archive.org/web/19970720205155/http://www.cs.indiana.edu/canada/karla.html
|
||||
[6]:https://web.archive.org/web/19990429014629/http://www.cs.indiana.edu:800/finger/gateway
|
||||
[7]:https://web.archive.org/web/19980122184328/http://www.cs.indiana.edu/perl-server/history.html
|
||||
[8]:https://web.archive.org/web/19970720025822/http://www.cs.indiana.edu/perl-server/intro.html
|
||||
[9]:https://web.archive.org/web/19970720025822/http://www.cs.indiana.edu/perl-server/code.html
|
||||
[10]:https://lists.w3.org/Archives/Public/www-talk/1992NovDec/0069.html
|
||||
[11]:https://lists.w3.org/Archives/Public/www-talk/1992NovDec/0060.html
|
||||
[12]:http://info.cern.ch/hypertext/WWW/Provider/ShellScript.html
|
||||
[13]:http://1997.webhistory.org/www.lists/www-talk.1993q1/0109.html
|
||||
[14]:https://archive.org/index.php
|
||||
[15]:http://brewster.kahle.org/about/
|
||||
[16]:https://en.wikipedia.org/wiki/Wide_area_information_server
|
||||
[17]:http://info.cern.ch/hypertext/WWW/Daemon/Overview.html
|
||||
[18]:http://1997.webhistory.org/www.lists/www-talk.1993q1/0182.html
|
||||
[19]:http://1997.webhistory.org/www.lists/www-talk.1993q1/0096.html
|
||||
[20]:http://info.cern.ch/hypertext/WWW/TheProject.html
|
||||
[21]:https://web.archive.org/web/20000815230603/http://www.edventure.com/release1/1198.html
|
||||
[22]:http://nms-cgi.sourceforge.net/
|
||||
[23]:https://web.archive.org/web/19980709151514/http://scriptarchive.com/
|
||||
[24]:http://1997.webhistory.org/www.lists/www-talk.1993q4/0518.html
|
||||
[25]:https://en.wikipedia.org/wiki/Usenet_newsgroup
|
||||
[26]:http://1997.webhistory.org/www.lists/www-talk.1993q1/0099.html
|
||||
[27]:https://tenyears-www.web.cern.ch/tenyears-www/
|
||||
[28]:https://groups.google.com/forum/#!msg/alt.hypertext/eCTkkOoWTAY/bJGhZyooXzkJ
|
||||
[29]:https://creativecommons.org/licenses/by-sa/4.0/
|
||||
[30]:https://www.flickr.com/photos/internetarchivebookimages/14591826409/in/photolist-oeqVBX-xezHCD-otJDtG-whb6Qz-tohe9q-tCxH8y-xq4VfN-otJFfh-xEmn3b-tERUdv-oucUgd-wKDyLy-owgebW-xd6Wew-xGEvuT-toqHkP-oegBCj-xtDdzN-tF19ip-xGFbWP-xcQMJq-wxrrkN-tEYczi-tEYvCn-tohQuy-tEzFwN-xHikPT-oetG8V-toiGvh-wKEgAu-xut1qp-toh7PG-xezovR-oegRMa-wKN2eg-oegSRp-sJ29GF-oeqXLV-oeJTBY-ovLF3X-oeh2iJ-xcQBWs-oepQoy-ow4xoo-xknjyD-ovunVZ-togQaj-tEytff-xEkSLS-xtD8G1
|
@ -0,0 +1,99 @@
|
||||
如何在 XenServer 7 GUI 虚拟机(VM)上提高屏幕分辨率
|
||||
============
|
||||
|
||||
### 介绍
|
||||
|
||||
**目的**
|
||||
|
||||
如果你想要将 XenServer 虚拟机作为远程桌面,默认的分辨率可能不能满足你的要求。
|
||||
|
||||
![Default xenserver screen VM resolution](https://linuxconfig.org/images/xenserver-7-default-screen-resolution.png)
|
||||
|
||||
本篇的目标是提高 XenServer 7 GUI 虚拟机(VM)的屏幕分辨率
|
||||
|
||||
**要求**
|
||||
|
||||
访问 XenServer 7 系统的权限
|
||||
|
||||
**难易性**
|
||||
|
||||
简单
|
||||
|
||||
**惯例**
|
||||
|
||||
* `#` - 给定命令需要作为 root 用户权限运行或者使用 `sudo` 命令
|
||||
* `$` - 给定命令作为常规权限用户运行
|
||||
|
||||
### 指导
|
||||
|
||||
**获得 VM UUID**
|
||||
|
||||
首先,我们需要获得想要提升分辨率的虚拟机的 UUID。
|
||||
|
||||
```
|
||||
# xe vm-list
|
||||
uuid ( RO) : 09a3d0d3-f16c-b215-9460-50dde9123891
|
||||
name-label ( RW): CentOS 7
|
||||
power-state ( RO): running
|
||||
```
|
||||
|
||||
提示:如果你将此 UUID 保存为 shell 变量会节省一些时间:
|
||||
|
||||
```
|
||||
# UUID=09a3d0d3-f16c-b215-9460-50dde9123891
|
||||
```
|
||||
|
||||
**关闭 VM**
|
||||
|
||||
优雅地关闭 VM 或使用 `xe vm-vm-shutdown` 命令:
|
||||
|
||||
```
|
||||
# xe vm-shutdown uuid=$UUID
|
||||
```
|
||||
|
||||
**更新 VGA 的 VIDEORAM 设置**
|
||||
|
||||
检查你目前的 VGA 的 VIDEORAM 参数设置:
|
||||
|
||||
```
|
||||
# xe vm-param-get uuid=$UUID param-name="platform" param-key=vga
|
||||
std
|
||||
# xe vm-param-get uuid=$UUID param-name="platform" param-key=videoram
|
||||
8
|
||||
```
|
||||
|
||||
要提升屏幕的分辨率,将 VGA 更新到 `std` (如果已经设置过,就不需要做什么),并将 `videoram` 调大几兆,如设置成 16:
|
||||
|
||||
```
|
||||
# xe vm-param-set uuid=$UUID platform:vga=std
|
||||
# xe vm-param-set uuid=$UUID platform:videoram=16
|
||||
```
|
||||
|
||||
**启动 VM**
|
||||
|
||||
```
|
||||
# xe vm-start uuid=$UUID
|
||||
```
|
||||
|
||||
![increased xenserver screen VM resolution](https://linuxconfig.org/images/xenserver-7-increased-screen-resolution.png)
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm
|
||||
|
||||
作者:[Lubos Rendek][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm
|
||||
[1]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h5-1-obtain-vm-uuid
|
||||
[2]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h5-2-shutdown-vm
|
||||
[3]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h5-3-update-vga-a-videoram-settings
|
||||
[4]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h5-4-start-vm
|
||||
[5]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h1-objective
|
||||
[6]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h2-requirements
|
||||
[7]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h3-difficulty
|
||||
[8]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h4-conventions
|
||||
[9]:https://linuxconfig.org/how-to-increase-screen-resolution-on-xenserver-7-gui-virtual-machine-vm#h5-instructions
|
85
published/20161128 Mir is not only about Unity8.md
Normal file
85
published/20161128 Mir is not only about Unity8.md
Normal file
@ -0,0 +1,85 @@
|
||||
Mir 并不只是 Unity 8
|
||||
============================================================
|
||||
|
||||
![mir](https://insights.ubuntu.com/wp-content/uploads/2cf2/MIR.png)
|
||||
|
||||
_这是一篇来自 Canonical 的软件工程师 Alan Griffiths 的一篇游客文章。如果你也想投稿,请联系 ubuntu-devices@canonical.com_
|
||||
|
||||
Mir 是一个计算机显示的管理应用的支持项目。它可以与当前 Ubuntu 桌面(及很多其他桌面)上使用的、我们更熟悉的 X-Window 相比较。我下面会讨论 Mir 的一些动机,但本篇的目的是澄清 Mir 和 Unity 8 之间的关系。
|
||||
|
||||
大多数时候你听说 Mir 时都会提到 Unity 8。这并不奇怪,因为 Unity 8 是 Canonical 新的用户界面 shell,用户会一直与它交互。 Mir “只”使这成为可能。Unity 8 目前用于手机和平板电脑,也可以在 Ubuntu 16.10 桌面上“预览”它。
|
||||
|
||||
在这里我想解释一下,可以不用 Unity 8 也可以使用 Mir。要么作为替代 shell,要么作为嵌入式环境的更简单的界面:信息亭,电子标牌等。Mir “抽象层”证明了这一点,它提供了三个重要的元素:
|
||||
|
||||
1. libmiral.so - Mir 的稳定接口,提供基本的窗口管理;
|
||||
2. miral-shell - 一个提供“传统”和“平铺”窗口管理的示例 shell;
|
||||
3. miral-kiosk - 一个仅提供基本窗口管理的示例“信息亭”。
|
||||
|
||||
miral-shell 和 miral-kiosk 示例服务器可从 zesty 的归档文件中获得,Kevin Gunn 已经在“Voices”上写了一篇基于 miral-kiosk 的“信息亭”的概览的[博文][1]。我将在下面给出更多关于使用这些例子的细节,但在[我的“voices”博客][2]上有更多(包括“如何”开发自己的替代 Mir 服务器)。
|
||||
|
||||
### 使用 MIR
|
||||
|
||||
Mir 是一套编程库,而不是独立的程序。这意味着这需要程序去调用它实现相应的功能。有两种方式去使用 Mir 库:编写程序的时候作为“客户端”,或者在实现 shell 时作为“服务端”。客户端(和 X11 一起)典型是使用工具库,而不是直接使用 Mir(或者 X11)。
|
||||
|
||||
GTK、Qt 和 SDL2 中有对 Mir 的支持。当在那些工具库中启用对它的支持时(默认在 Ubuntu 中启用支持),意味着使用这些工具的程序应该“可以工作”于 Mir 中。除此之外还有一个 Xmir:一个运行于 Mir 的 X11 服务器,这允许基于 X 的服务运行在 Mir 服务端上。
|
||||
|
||||
但是开始之前 Mir 客户端需要一个相匹配的 Mir 服务端。在最后一个开发周期中,Mir 团队在演示中将 MirAL 作为编写 Mir 服务端的推荐方法,并推出了一个“miral-examples”包。在 Ubuntu 的开发版本 zesty 中,你可以从归档中安装它:
|
||||
|
||||
```
|
||||
$ sudo apt install miral-examples mir-graphics-drivers-desktop qtubuntu-desktop
|
||||
```
|
||||
|
||||
_对于其他平台,你需要自己构建 MirAL(有关详细信息,请参阅 Mir 桌面环境示例)。_
|
||||
|
||||
miral-examples 安装后你可以在 Unity 7 中以窗口的方式运行一个 Mir 服务端,然后在里面运行一个客户端(比如 gedit):
|
||||
|
||||
```
|
||||
$ miral-shell&
|
||||
$ miral-run gedit
|
||||
```
|
||||
|
||||
这会给你一个(非常基础的)“传统” 的桌面窗口管理。另外你可以试下“平铺”窗口管理器:
|
||||
|
||||
```
|
||||
$ miral-shell --window-manager tiling&
|
||||
$ miral-run qterminal
|
||||
```
|
||||
|
||||
或者(甚至更基础的)信息亭界面:
|
||||
|
||||
```
|
||||
$ miral-kiosk&
|
||||
$ miral-run 7kaa
|
||||
```
|
||||
|
||||
这些 Mir 服务端都不会提供带有“启动器”、通知等的完整“桌面”。但是它们演示了不使用 Unity 8 使用 Mir 的可能。
|
||||
|
||||
### MIR 解决的问题
|
||||
|
||||
X-Window 系统已经是,并且仍然是,提供了一种与计算机的交互的非常成功的方式。它提供了广泛的硬件和驱动程序一致的抽象。它支持许多桌面环境和图形用户界面工具包,并可以让它们在大量计算机上一起工作。
|
||||
|
||||
但它来自一个与当前电脑使用方式非常不同的时代,现在有一些问题是很难满足的,因为它需要支持老旧的系统。
|
||||
|
||||
在 1980 年,大多数计算机是由专家管理的大型事物,将它们连接在一起“是非常困难的”。在那个时代,开发软件的成本是这样的,一个程序“监听”另一个程序获得的好处是可以忽略不计的:此时几乎没有计算机,同时它们是独立的,它们所有的工作和金融无关。
|
||||
|
||||
X-Window 开发于这种环境下,通过一系列扩展,它已经适应了许多变化。但它本质上是不安全的:任何应用程序可以知道显示了什么(并影响它)。你可以编写像 Xeyes(用“眼睛”跟踪光标)或“Tickeys”(通过键盘来生成打字机噪声)等应用程序。现实是,任何应用程序可以跟踪和操纵几乎所有的事情。这就是基于 X 的桌面如 Unity 7、Gnome、KDE及其它桌面工作的方式。
|
||||
|
||||
X-Window 中的窗口管理的开放性质不适合用于具有数百万计算机连接到因特网的世界,它们用于信用卡交易和网上银行,且由非专家管理,并自愿安装来自陌生人的程序。人们越来越意识到让 X-Window 适应新的安全性和图形性能的要求是不可行的。
|
||||
|
||||
现在至少有两个开源项目旨在提供一个替代品:Mir 和 Wayland。虽然有些人认为两者是竞争关系,但在很多领域,它们有共同的利益:它们都需要与那些之前假定使用 X11 的其它软件交互,并且许多引入支持的工作对两者都有益。
|
||||
|
||||
Canonical 的 X-Window 替换品 Mir,它只将信息暴露给它需要的应用程序(因此没有按键监听或光标跟踪)。它可以满足当前时代的需求,并可以利用现代硬件,如图形处理器。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://insights.ubuntu.com/2016/11/28/mir-is-not-only-about-unity8/
|
||||
|
||||
作者:[Guest][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://insights.ubuntu.com/author/guest/
|
||||
[1]:http://voices.canonical.com/kevin.gunn/
|
||||
[2]:http://voices.canonical.com/alan.griffiths/
|
@ -0,0 +1,82 @@
|
||||
“硅谷的女儿”的成才之路
|
||||
=======================================================
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/images/life/myopensourcestory.png?itok=6TXlAkFi)
|
||||
|
||||
在 2014 年,为了对网上一些关于在科技行业女性稀缺的评论作出回应,我的同事 [Crystal Beasley][1] 倡议在科技/信息安全方面工作的女性在网络上分享自己的“成才之路”。这篇文章就是我的故事。我把我的故事与你们分享是因为我相信榜样的力量,也相信一个人有多种途径,选择一个让自己满意的有挑战性的工作以及可以实现目标的人生。
|
||||
|
||||
### 和电脑相伴的童年
|
||||
|
||||
我可以说是硅谷的女儿。我的故事不是一个从科技业余爱好转向专业的故事,也不是从小就专注于这份事业的故事。这个故事更多的是关于环境如何塑造你 — 通过它的那种已然存在的文化来改变你,如果你想要被改变的话。这不是从小就开始努力并为一个明确的目标而奋斗的故事,我意识到,这其实是享受了一些特权的成长故事。
|
||||
|
||||
我出生在曼哈顿,但是我在新泽西州长大,因为我的爸爸退伍后,在那里的罗格斯大学攻读计算机科学的博士学位。当我四岁时,学校里有人问我爸爸干什么谋生时,我说,“他就是看电视和捕捉小虫子,但是我从没有见过那些小虫子”(LCTT 译注:小虫子,bug)。他在家里有一台哑终端(LCTT 译注:就是那台“电视”),这大概与他在 Bolt Beranek Newman 公司的工作有关,做关于早期互联网人工智能方面的工作。我就在旁边看着。
|
||||
|
||||
我没能玩上父亲的会抓小虫子的电视,但是我很早就接触到了技术领域,我很珍惜这个礼物。提早的熏陶对于一个未来的高手是十分必要的 — 所以,请花时间和你的小孩谈谈你在做的事情!
|
||||
|
||||
![](https://opensource.com/sites/default/files/resize/moss-520x433.png)
|
||||
|
||||
*我父亲的终端和这个很类似 —— 如果不是这个的话 CC BY-SA 4.0*
|
||||
|
||||
当我六岁时,我们搬到了加州。父亲在施乐的帕克研究中心(Xerox PARC)找到了一个工作。我记得那时我认为这个城市一定有很多熊,因为在它的旗帜上有一个熊。在1979年,帕洛阿图市还是一个大学城,还有果园和开阔地带。
|
||||
|
||||
在 Palo Alto 的公立学校待了一年之后,我的姐姐和我被送到了“半岛学校”,这个“民主典范”学校对我造成了深刻的影响。在那里,好奇心和创新意识是被高度推崇的,教育也是由学生自己分组讨论决定的。在学校,我们很少能看到叫做电脑的东西,但是在家就不同了。
|
||||
|
||||
在父亲从施乐辞职之后,他就去了苹果公司,在那里他工作使用并带回家让我玩的第一批电脑就是:Apple II 和 LISA。我的父亲在最初的 LISA 的研发团队。我直到现在还深刻的记得他让我们一次又一次的“玩”鼠标训练的场景,因为他想让我的 3 岁大的妹妹也能对这个东西觉得好用 —— 她也确实那样。
|
||||
|
||||
![](https://opensource.com/sites/default/files/resize/600px-apple_lisa-520x520.jpg)
|
||||
|
||||
*我们的 LISA 看起来就像这样。谁看到鼠标哪儿去了?CC BY-SA 4.0*
|
||||
|
||||
在学校,我的数学的概念学得不错,但是基本计算却惨不忍睹。我的第一个学校的老师告诉我的家长和我,说我的数学很差,还说我很“笨”。虽然我在“常规的”数学项目中表现出色,能理解一个超出 7 岁孩子理解能力的逻辑谜题,但是我不能完成我们每天早上都要做的“练习”。她说我傻,这事我不会忘记。在那之后的十年我都没能相信自己的逻辑能力和算法的水平。**不要低估你对孩子说的话的影响**。
|
||||
|
||||
在我玩了几年爸爸的电脑之后,他从 Apple 公司跳槽到了 EA,又跳到了 SGI,我又体验了他带回来的新玩意。这让我们认为我们家的房子是镇里最酷的,因为我们在车库里有一个能玩 Doom 的 SGI 的机器。我不会太多的编程,但是现在看来,从那些年里我学到对尝试新的科技毫不恐惧。同时,我的学文学和教育的母亲,成为了一个科技行业的作家,她向我证实了一个人的职业可以改变,而且一个做母亲的人可能同时驾驭一个科技职位。我不是说这对她来说很简单,但是她让我认为这件事看起来很简单。你可能会想这些早期的熏陶能把我带到科技行业,但是它没有。
|
||||
|
||||
### 本科时光
|
||||
|
||||
我想我要成为一个小学教师,我就读米尔斯学院就是想要做这个。但是后来我开始研究女性学,后来又研究神学,我这样做仅仅是由于我自己的一个渴求:我希望能理解人类的意志以及为更好的世界而努力。
|
||||
|
||||
同时,我也感受到了互联网的巨大力量。在 1991 年,拥有你自己的 UNIX 的账户,能够和全世界的人谈话,是很令人兴奋的事。我仅仅从在互联网中“玩”就学到了不少,从那些愿意回答我提出的问题的人那里学到的就更多了。这些学习对我的职业生涯的影响不亚于我在正规学校教育之中学到的知识。所有的信息都是有用的。我在一个女子学院度过了学习的关键时期,那时是一个杰出的女性在掌管计算机院。在那个宽松氛围的学院,我们不仅被允许,还被鼓励去尝试很多的道路(我们能接触到很多很多的科技,还有聪明人愿意帮助我们),我也确实那样做了。我十分感激当年的教育。在那个学院,我也了解了什么是极客文化。
|
||||
|
||||
之后我去了研究生院去学习女性主义神学,但是技术的气息已经渗入我的灵魂。当我意识到我不想成为一个教授或者一个学术伦理家时,我离开了学术圈,带着学校债务和一些想法回到了家。
|
||||
|
||||
### 新的开端
|
||||
|
||||
在 1995 年,我被互联网连接人们以及分享想法和信息的能力所震惊(直到现在仍是如此)。我想要进入这个行业。看起来我好像要“女承父业”,但是我不知道如何开始。我开始在硅谷做临时工,从 Sun 微系统公司得到我的第一个“真正”技术职位前尝试做了一些事情(为半导体数据公司写最基础的数据库,技术手册印发前的事务,备份工资单的存跟)。这些事很让人激动。(毕竟,我们是“.com”中的那个”点“)。
|
||||
|
||||
在 Sun 公司,我努力学习,尽可能多的尝试新事物。我的第一个工作是<ruby>网页化<rt> HTMLing</rt></ruby>(啥?这居然是一个词!)白皮书,以及为 Beta 程序修改一些基础的服务工具(大多数是 Perl 写的)。后来我成为 Solaris beta 项目组中的项目经理,并在 Open Solaris 的 Beta 版运行中感受到了开源的力量。
|
||||
|
||||
在那里我做的最重要的事情就是学习。我发现在同样重视工程和教育的地方有一种气氛,在那里我的问题不再显得“傻”。我很庆幸我选对了导师和朋友。在决定休第二个孩子的产假之前,我上每一堂我能上的课程,读每一本我能读的书,尝试自学我在学校没有学习过的技术,商业以及项目管理方面的技能。
|
||||
|
||||
### 重回工作
|
||||
|
||||
当我准备重新工作时,Sun 公司已经不再是合适的地方了。所以,我整理了我的联系信息(网络帮到了我),利用我的沟通技能,最终获得了一个管理互联网门户的长期合同(2005 年时,一切皆门户),并且开始了解 CRM、发布产品的方式、本地化、网络等知识。我讲这么多背景,主要是我的尝试以及失败的经历,和我成功的经历同等重要,从中学到很多。我也认为我们需要这个方面的榜样。
|
||||
|
||||
从很多方面来看,我的职业生涯的第一部分是我的技术教育。时变势移 —— 我在帮助组织中的女性和其他弱势群体,但是并没有看出为一个技术行业的女性有多难。当时无疑我没有看到这个行业的缺陷,但是现在这个行业更加的厌恶女性,一点没有减少。
|
||||
|
||||
在这些事情之后,我还没有把自己当作一个标杆,或者一个高级技术人员。当我在父母圈子里认识的一位极客朋友鼓励我申请一个看起来定位十分模糊且技术性很强的开源的非盈利基础设施机构(互联网系统协会 ISC,它是广泛部署的开源 DNS 名称服务器 BIND 的缔造者,也是 13 台根域名服务器之一的运营商)的产品经理时,我很震惊。有很长一段时间,我都不知道他们为什么要雇佣我!我对 DNS、基础设备,以及协议的开发知之甚少,但是我再次遇到了老师,并再度开始飞速发展。我花时间出差,在关键流程攻关,搞清楚如何与高度国际化的团队合作,解决麻烦的问题,最重要的是,拥抱支持我们的开源和充满活力的社区。我几乎重新学了一切,通过试错的方式。我学习如何构思一个产品。如何通过建设开源社区,领导那些有这特定才能,技能和耐心的人,是他们给了产品价值。
|
||||
|
||||
### 成为别人的导师
|
||||
|
||||
当我在 ISC 工作时,我通过 [TechWomen 项目][2] (一个让来自中东和北非的技术行业的女性到硅谷来接受教育的计划),我开始喜欢教学生以及支持那些技术女性,特别是在开源行业中奋斗的。也正是从这时起我开始相信自己的能力。我还需要学很多。
|
||||
|
||||
当我第一次读 TechWomen 关于导师的广告时,我根本不认为他们会约我面试!我有冒名顶替综合症。当他们邀请我成为第一批导师(以及以后六年每年的导师)时,我很震惊,但是现在我学会了相信这些都是我努力得到的待遇。冒名顶替综合症是真实的,但是随着时间过去我就慢慢名副其实了。
|
||||
|
||||
### 现在
|
||||
|
||||
最后,我不得不离开我在 ISC 的工作。幸运的是,我的工作以及我的价值让我进入了 Mozilla ,在这里我的努力和我的幸运让我在这里承担着重要的角色。现在,我是一名支持多样性与包容的高级项目经理。我致力于构建一个更多样化,更有包容性的 Mozilla ,站在之前的做同样事情的巨人的肩膀上,与最聪明友善的人们一起工作。我用我的激情来让人们找到贡献一个世界需要的互联网的有意义的方式:这让我兴奋了很久。当我爬上山峰,我能极目四望!
|
||||
|
||||
通过对组织和个人行为的干预来获取一种改变文化的新方式,这和我的人生轨迹有着不可思议的联系 —— 从我的早期的学术生涯,到职业生涯再到现在。每天都是一个新的挑战,我想这是我喜欢在科技行业工作,尤其是在开放互联网工作的理由。互联网天然的多元性是它最开始吸引我的原因,也是我还在寻求的 —— 所有人都有机会和获取资源的可能性,无论背景如何。榜样、导师、资源,以及最重要的,尊重,是不断发展技术和开源文化的必要组成部分,实现我相信它能实现的所有事 —— 包括给所有人平等的接触机会。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://opensource.com/life/16/5/my-open-source-story-larissa-shapiro
|
||||
|
||||
作者:[Larissa Shapiro][a]
|
||||
译者:[name1e5s](https://github.com/name1e5s)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/larissa-shapiro
|
||||
[1]: http://skinnywhitegirl.com/blog/my-nerd-story/1101/
|
||||
[2]: https://www.techwomen.org/mentorship/why-i-keep-coming-back-to-mentor-with-techwomen
|
365
published/201612/20160516 Securing Your Server.md
Normal file
365
published/201612/20160516 Securing Your Server.md
Normal file
@ -0,0 +1,365 @@
|
||||
Linux 服务器安全简明指南
|
||||
============================================================
|
||||
|
||||
现在让我们强化你的服务器以防止未授权访问。
|
||||
|
||||
### 经常升级系统
|
||||
|
||||
保持最新的软件是你可以在任何操作系统上采取的最大的安全预防措施。软件更新的范围从关键漏洞补丁到小 bug 的修复,许多软件漏洞实际上是在它们被公开的时候得到修补的。
|
||||
|
||||
### 自动安全更新
|
||||
|
||||
有一些用于服务器上自动更新的参数。[Fedora 的 Wiki][15] 上有一篇很棒的剖析自动更新的利弊的文章,但是如果你把它限制到安全更新上,自动更新的风险将是最小的。
|
||||
|
||||
自动更新的可行性必须你自己判断,因为它归结为**你**在你的服务器上做什么。请记住,自动更新仅适用于来自仓库的包,而不是自行编译的程序。你可能会发现一个复制了生产服务器的测试环境是很有必要的。可以在部署到生产环境之前,在测试环境里面更新来检查问题。
|
||||
|
||||
* CentOS 使用 [yum-cron][2] 进行自动更新。
|
||||
* Debian 和 Ubuntu 使用 [无人值守升级][3]。
|
||||
* Fedora 使用 [dnf-automatic][4]。
|
||||
|
||||
### 添加一个受限用户账户
|
||||
|
||||
到目前为止,你已经作为 `root` 用户访问了你的服务器,它有无限制的权限,可以执行**任何**命令 - 甚至可能意外中断你的服务器。 我们建议创建一个受限用户帐户,并始终使用它。 管理任务应该使用 `sudo` 来完成,它可以临时提升受限用户的权限,以便管理你的服务器。
|
||||
|
||||
> 不是所有的 Linux 发行版都在系统上默认包含 `sudo`,但大多数都在其软件包仓库中有 `sudo`。 如果得到这样的输出 `sudo:command not found`,请在继续之前安装 `sudo`。
|
||||
|
||||
要添加新用户,首先通过 SSH [登录到你的服务器][16]。
|
||||
|
||||
#### CentOS / Fedora
|
||||
|
||||
1、 创建用户,用你想要的名字替换 `example_user`,并分配一个密码:
|
||||
|
||||
```
|
||||
useradd example_user && passwd example_user
|
||||
```
|
||||
|
||||
2、 将用户添加到具有 sudo 权限的 `wheel` 组:
|
||||
|
||||
```
|
||||
usermod -aG wheel example_user
|
||||
```
|
||||
|
||||
#### Ubuntu
|
||||
|
||||
1、 创建用户,用你想要的名字替换 `example_user`。你将被要求输入用户密码:
|
||||
|
||||
```
|
||||
adduser example_user
|
||||
```
|
||||
|
||||
2、 添加用户到 `sudo` 组,这样你就有管理员权限了:
|
||||
|
||||
```
|
||||
adduser example_user sudo
|
||||
```
|
||||
|
||||
#### Debian
|
||||
|
||||
1、 Debian 默认的包中没有 `sudo`, 使用 `apt-get` 来安装:
|
||||
|
||||
```
|
||||
apt-get install sudo
|
||||
```
|
||||
|
||||
2、 创建用户,用你想要的名字替换 `example_user`。你将被要求输入用户密码:
|
||||
|
||||
```
|
||||
adduser example_user
|
||||
```
|
||||
|
||||
3、 添加用户到 `sudo` 组,这样你就有管理员权限了:
|
||||
|
||||
```
|
||||
adduser example_user sudo
|
||||
```
|
||||
|
||||
创建完有限权限的用户后,断开你的服务器连接:
|
||||
|
||||
```
|
||||
exit
|
||||
```
|
||||
|
||||
重新用你的新用户登录。用你的用户名代替 `example_user`,用你的服务器 IP 地址代替例子中的 IP 地址:
|
||||
|
||||
```
|
||||
ssh example_user@203.0.113.10
|
||||
```
|
||||
|
||||
现在你可以用你的新用户帐户管理你的服务器,而不是 `root`。 几乎所有超级用户命令都可以用 `sudo`(例如:`sudo iptables -L -nv`)来执行,这些命令将被记录到 `/var/log/auth.log` 中。
|
||||
|
||||
### 加固 SSH 访问
|
||||
|
||||
默认情况下,密码认证用于通过 SSH 连接到您的服务器。加密密钥对更加安全,因为它用私钥代替了密码,这通常更难以暴力破解。在本节中,我们将创建一个密钥对,并将服务器配置为不接受 SSH 密码登录。
|
||||
|
||||
#### 创建验证密钥对
|
||||
|
||||
1、这是在你本机上完成的,**不是**在你的服务器上,这里将创建一个 4096 位的 RSA 密钥对。在创建过程中,您可以选择使用密码加密私钥。这意味着它不能在没有输入密码的情况下使用,除非将密码保存到本机桌面的密钥管理器中。我们建议您使用带有密码的密钥对,但如果你不想使用密码,则可以将此字段留空。
|
||||
|
||||
**Linux / OS X**
|
||||
|
||||
> 如果你已经创建了 RSA 密钥对,则这个命令将会覆盖它,这可能会导致你不能访问其它的操作系统。如果你已创建过密钥对,请跳过此步骤。要检查现有的密钥,请运行 `ls〜/ .ssh / id_rsa *`。
|
||||
|
||||
```
|
||||
ssh-keygen -b 4096
|
||||
```
|
||||
|
||||
在输入密码之前,按下 **回车**使用 `/home/your_username/.ssh` 中的默认名称 `id_rsa` 和 `id_rsa.pub`。
|
||||
|
||||
**Windows**
|
||||
|
||||
这可以使用 PuTTY 完成,在我们指南中已有描述:[使用 SSH 公钥验证][6]。
|
||||
|
||||
2、将公钥上传到您的服务器上。 将 `example_user` 替换为你用来管理服务器的用户名称,将 `203.0.113.10` 替换为你的服务器的 IP 地址。
|
||||
|
||||
**Linux**
|
||||
|
||||
在本机上:
|
||||
|
||||
```
|
||||
ssh-copy-id example_user@203.0.113.10
|
||||
```
|
||||
|
||||
**OS X**
|
||||
|
||||
在你的服务器上(用你的权限受限用户登录):
|
||||
|
||||
```
|
||||
mkdir -p ~/.ssh && sudo chmod -R 700 ~/.ssh/
|
||||
```
|
||||
|
||||
在本机上:
|
||||
|
||||
```
|
||||
scp ~/.ssh/id_rsa.pub example_user@203.0.113.10:~/.ssh/authorized_keys
|
||||
```
|
||||
|
||||
> 如果相对于 `scp` 你更喜欢 `ssh-copy-id` 的话,那么它也可以在 [Homebrew][5] 中找到。使用 `brew install ssh-copy-id` 安装。
|
||||
|
||||
**Windows**
|
||||
|
||||
* **选择 1**:使用 [WinSCP][1] 来完成。 在登录窗口中,输入你的服务器的 IP 地址作为主机名,以及非 root 的用户名和密码。单击“登录”连接。
|
||||
|
||||
一旦 WinSCP 连接后,你会看到两个主要部分。 左边显示本机上的文件,右边显示服务区上的文件。 使用左侧的文件浏览器,导航到你已保存公钥的文件,选择公钥文件,然后点击上面工具栏中的“上传”。
|
||||
|
||||
系统会提示你输入要将文件放在服务器上的路径。 将文件上传到 `/home/example_user/.ssh /authorized_keys`,用你的用户名替换 `example_user`。
|
||||
|
||||
* **选择 2**:将公钥直接从 PuTTY 键生成器复制到连接到你的服务器中(作为非 root 用户):
|
||||
|
||||
```
|
||||
mkdir ~/.ssh; nano ~/.ssh/authorized_keys
|
||||
```
|
||||
|
||||
上面命令将在文本编辑器中打开一个名为 `authorized_keys` 的空文件。 将公钥复制到文本文件中,确保复制为一行,与 PuTTY 所生成的完全一样。 按下 `CTRL + X`,然后按下 `Y`,然后回车保存文件。
|
||||
|
||||
最后,你需要为公钥目录和密钥文件本身设置权限:
|
||||
|
||||
```
|
||||
sudo chmod 700 -R ~/.ssh && chmod 600 ~/.ssh/authorized_keys
|
||||
```
|
||||
|
||||
这些命令通过阻止其他用户访问公钥目录以及文件本身来提供额外的安全性。有关它如何工作的更多信息,请参阅我们的指南[如何修改文件权限][7]。
|
||||
|
||||
3、 现在退出并重新登录你的服务器。如果你为私钥指定了密码,则需要输入密码。
|
||||
|
||||
#### SSH 守护进程选项
|
||||
|
||||
1、 **不允许 root 用户通过 SSH 登录。** 这要求所有的 SSH 连接都是通过非 root 用户进行。当以受限用户帐户连接后,可以通过使用 `sudo` 或使用 `su -` 切换为 root shell 来使用管理员权限。
|
||||
|
||||
```
|
||||
# Authentication:
|
||||
...
|
||||
PermitRootLogin no
|
||||
```
|
||||
|
||||
2、 **禁用 SSH 密码认证。** 这要求所有通过 SSH 连接的用户使用密钥认证。根据 Linux 发行版的不同,它可能需要添加 `PasswordAuthentication` 这行,或者删除前面的 `#` 来取消注释。
|
||||
|
||||
```
|
||||
# Change to no to disable tunnelled clear text passwords
|
||||
PasswordAuthentication no
|
||||
```
|
||||
|
||||
> 如果你从许多不同的计算机连接到服务器,你可能想要继续启用密码验证。这将允许你使用密码进行身份验证,而不是为每个设备生成和上传密钥对。
|
||||
|
||||
3、 **只监听一个互联网协议。** 在默认情况下,SSH 守护进程同时监听 IPv4 和 IPv6 上的传入连接。除非你需要使用这两种协议进入你的服务器,否则就禁用你不需要的。 _这不会禁用系统范围的协议,它只用于 SSH 守护进程。_
|
||||
|
||||
使用选项:
|
||||
|
||||
* `AddressFamily inet` 只监听 IPv4。
|
||||
* `AddressFamily inet6` 只监听 IPv6。
|
||||
|
||||
默认情况下,`AddressFamily` 选项通常不在 `sshd_config` 文件中。将它添加到文件的末尾:
|
||||
|
||||
```
|
||||
echo 'AddressFamily inet' | sudo tee -a /etc/ssh/sshd_config
|
||||
```
|
||||
|
||||
4、 重新启动 SSH 服务以加载新配置。
|
||||
|
||||
如果你使用的 Linux 发行版使用 systemd(CentOS 7、Debian 8、Fedora、Ubuntu 15.10+)
|
||||
|
||||
```
|
||||
sudo systemctl restart sshd
|
||||
```
|
||||
|
||||
如果您的 init 系统是 SystemV 或 Upstart(CentOS 6、Debian 7、Ubuntu 14.04):
|
||||
|
||||
```
|
||||
sudo service ssh restart
|
||||
```
|
||||
|
||||
#### 使用 Fail2Ban 保护 SSH 登录
|
||||
|
||||
[Fail2Ban][17] 是一个应用程序,它会在太多的失败登录尝试后禁止 IP 地址登录到你的服务器。由于合法登录通常不会超过三次尝试(如果使用 SSH 密钥,那不会超过一个),因此如果服务器充满了登录失败的请求那就表示有恶意访问。
|
||||
|
||||
Fail2Ban 可以监视各种协议,包括 SSH、HTTP 和 SMTP。默认情况下,Fail2Ban 仅监视 SSH,并且因为 SSH 守护程序通常配置为持续运行并监听来自任何远程 IP 地址的连接,所以对于任何服务器都是一种安全威慑。
|
||||
|
||||
有关安装和配置 Fail2Ban 的完整说明,请参阅我们的指南:[使用 Fail2ban 保护服务器][18]。
|
||||
|
||||
### 删除未使用的面向网络的服务
|
||||
|
||||
大多数 Linux 发行版都安装并运行了网络服务,监听来自互联网、回环接口或两者兼有的传入连接。 将不需要的面向网络的服务从系统中删除,以减少对运行进程和对已安装软件包攻击的概率。
|
||||
|
||||
#### 查明运行的服务
|
||||
|
||||
要查看服务器中运行的服务:
|
||||
|
||||
```
|
||||
sudo netstat -tulpn
|
||||
```
|
||||
|
||||
> 如果默认情况下 `netstat` 没有包含在你的 Linux 发行版中,请安装软件包 `net-tools` 或使用 `ss -tulpn` 命令。
|
||||
|
||||
以下是 `netstat` 的输出示例。 请注意,因为默认情况下不同发行版会运行不同的服务,你的输出将有所不同:
|
||||
|
||||
|
||||
```
|
||||
Proto Recv-Q Send-Q Local Address Foreign Address State PID/Program name
|
||||
tcp 0 0 0.0.0.0:111 0.0.0.0:* LISTEN 7315/rpcbind
|
||||
tcp 0 0 0.0.0.0:22 0.0.0.0:* LISTEN 3277/sshd
|
||||
tcp 0 0 127.0.0.1:25 0.0.0.0:* LISTEN 3179/exim4
|
||||
tcp 0 0 0.0.0.0:42526 0.0.0.0:* LISTEN 2845/rpc.statd
|
||||
tcp6 0 0 :::48745 :::* LISTEN 2845/rpc.statd
|
||||
tcp6 0 0 :::111 :::* LISTEN 7315/rpcbind
|
||||
tcp6 0 0 :::22 :::* LISTEN 3277/sshd
|
||||
tcp6 0 0 ::1:25 :::* LISTEN 3179/exim4
|
||||
udp 0 0 127.0.0.1:901 0.0.0.0:* 2845/rpc.statd
|
||||
udp 0 0 0.0.0.0:47663 0.0.0.0:* 2845/rpc.statd
|
||||
udp 0 0 0.0.0.0:111 0.0.0.0:* 7315/rpcbind
|
||||
udp 0 0 192.0.2.1:123 0.0.0.0:* 3327/ntpd
|
||||
udp 0 0 127.0.0.1:123 0.0.0.0:* 3327/ntpd
|
||||
udp 0 0 0.0.0.0:123 0.0.0.0:* 3327/ntpd
|
||||
udp 0 0 0.0.0.0:705 0.0.0.0:* 7315/rpcbind
|
||||
udp6 0 0 :::111 :::* 7315/rpcbind
|
||||
udp6 0 0 fe80::f03c:91ff:fec:123 :::* 3327/ntpd
|
||||
udp6 0 0 2001:DB8::123 :::* 3327/ntpd
|
||||
udp6 0 0 ::1:123 :::* 3327/ntpd
|
||||
udp6 0 0 :::123 :::* 3327/ntpd
|
||||
udp6 0 0 :::705 :::* 7315/rpcbind
|
||||
udp6 0 0 :::60671 :::* 2845/rpc.statd
|
||||
```
|
||||
|
||||
`netstat` 告诉我们服务正在运行 [RPC][19](`rpc.statd` 和 `rpcbind`)、SSH(`sshd`)、[NTPdate][20](`ntpd`)和[Exim][21](`exim4`)。
|
||||
|
||||
##### TCP
|
||||
|
||||
请参阅 `netstat` 输出的 `Local Address` 那一列。进程 `rpcbind` 正在侦听 `0.0.0.0:111` 和 `:::111`,外部地址是 `0.0.0.0:*` 或者 `:::*` 。这意味着它从任何端口和任何网络接口接受来自任何外部地址(IPv4 和 IPv6)上的其它 RPC 客户端的传入 TCP 连接。 我们看到类似的 SSH,Exim 正在侦听来自回环接口的流量,如所示的 `127.0.0.1` 地址。
|
||||
|
||||
##### UDP
|
||||
|
||||
UDP 套接字是[无状态][14]的,这意味着它们只有打开或关闭,并且每个进程的连接是独立于前后发生的连接。这与 TCP 的连接状态(例如 `LISTEN`、`ESTABLISHED`和 `CLOSE_WAIT`)形成对比。
|
||||
|
||||
我们的 `netstat`输出说明 NTPdate :1)接受服务器的公网 IP 地址的传入连接;2)通过本地主机进行通信;3)接受来自外部的连接。这些连接是通过端口 123 进行的,同时支持 IPv4 和 IPv6。我们还看到了 RPC 打开的更多的套接字。
|
||||
|
||||
#### 查明该移除哪个服务
|
||||
|
||||
如果你在没有启用防火墙的情况下对服务器进行基本的 TCP 和 UDP 的 [nmap][22] 扫描,那么在打开端口的结果中将出现 SSH、RPC 和 NTPdate 。通过[配置防火墙][23],你可以过滤掉这些端口,但 SSH 除外,因为它必须允许你的传入连接。但是,理想情况下,应该禁用未使用的服务。
|
||||
|
||||
* 你可能主要通过 SSH 连接管理你的服务器,所以让这个服务需要保留。如上所述,[RSA 密钥][8]和 [Fail2Ban][9] 可以帮助你保护 SSH。
|
||||
* NTP 是服务器计时所必需的,但有个替代 NTPdate 的方法。如果你喜欢不开放网络端口的时间同步方法,并且你不需要纳秒精度,那么你可能有兴趣用 [OpenNTPD][10] 来代替 NTPdate。
|
||||
* 然而,Exim 和 RPC 是不必要的,除非你有特定的用途,否则应该删除它们。
|
||||
|
||||
> 本节针对 Debian 8。默认情况下,不同的 Linux 发行版具有不同的服务。如果你不确定某项服务的功能,请尝试搜索互联网以了解该功能是什么,然后再尝试删除或禁用它。
|
||||
|
||||
#### 卸载监听的服务
|
||||
|
||||
如何移除包取决于发行版的包管理器:
|
||||
|
||||
**Arch**
|
||||
|
||||
```
|
||||
sudo pacman -Rs package_name
|
||||
```
|
||||
|
||||
**CentOS**
|
||||
|
||||
```
|
||||
sudo yum remove package_name
|
||||
```
|
||||
|
||||
**Debian / Ubuntu**
|
||||
|
||||
```
|
||||
sudo apt-get purge package_name
|
||||
```
|
||||
|
||||
**Fedora**
|
||||
|
||||
```
|
||||
sudo dnf remove package_name
|
||||
```
|
||||
|
||||
再次运行 `sudo netstat -tulpn`,你看到监听的服务就只会有 SSH(`sshd`)和 NTP(`ntpdate`,网络时间协议)。
|
||||
|
||||
### 配置防火墙
|
||||
|
||||
使用防火墙阻止不需要的入站流量能为你的服务器提供一个高效的安全层。 通过指定入站流量,你可以阻止入侵和网络测绘。 最佳做法是只允许你需要的流量,并拒绝一切其他流量。请参阅我们的一些关于最常见的防火墙程序的文档:
|
||||
|
||||
* [iptables][11] 是 netfilter 的控制器,它是 Linux 内核的包过滤框架。 默认情况下,iptables 包含在大多数 Linux 发行版中。
|
||||
* [firewallD][12] 是可用于 CentOS/Fedora 系列发行版的 iptables 控制器。
|
||||
* [UFW][13] 为 Debian 和 Ubuntu 提供了一个 iptables 前端。
|
||||
|
||||
### 接下来
|
||||
|
||||
这些是加固 Linux 服务器的最基本步骤,但是进一步的安全层将取决于其预期用途。 其他技术可以包括应用程序配置,使用[入侵检测][24]或者安装某个形式的[访问控制][25]。
|
||||
|
||||
现在你可以按你的需求开始设置你的服务器了。 我们有一个文档库来以帮助你从[从共享主机迁移][26]到[启用两步验证][27]到[托管网站] [28]等各种主题。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linode.com/docs/security/securing-your-server/
|
||||
|
||||
作者:[Phil Zona][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.linode.com/docs/security/securing-your-server/
|
||||
[1]:http://winscp.net/
|
||||
[2]:https://fedoraproject.org/wiki/AutoUpdates#Fedora_21_or_earlier_versions
|
||||
[3]:https://help.ubuntu.com/lts/serverguide/automatic-updates.html
|
||||
[4]:https://dnf.readthedocs.org/en/latest/automatic.html
|
||||
[5]:http://brew.sh/
|
||||
[6]:https://www.linode.com/docs/security/use-public-key-authentication-with-ssh#windows-operating-system
|
||||
[7]:https://www.linode.com/docs/tools-reference/modify-file-permissions-with-chmod
|
||||
[8]:https://www.linode.com/docs/security/securing-your-server/#create-an-authentication-key-pair
|
||||
[9]:https://www.linode.com/docs/security/securing-your-server/#use-fail2ban-for-ssh-login-protection
|
||||
[10]:https://en.wikipedia.org/wiki/OpenNTPD
|
||||
[11]:https://www.linode.com/docs/security/firewalls/control-network-traffic-with-iptables
|
||||
[12]:https://www.linode.com/docs/security/firewalls/introduction-to-firewalld-on-centos
|
||||
[13]:https://www.linode.com/docs/security/firewalls/configure-firewall-with-ufw
|
||||
[14]:https://en.wikipedia.org/wiki/Stateless_protocol
|
||||
[15]:https://fedoraproject.org/wiki/AutoUpdates#Why_use_Automatic_updates.3F
|
||||
[16]:https://www.linode.com/docs/getting-started#logging-in-for-the-first-time
|
||||
[17]:http://www.fail2ban.org/wiki/index.php/Main_Page
|
||||
[18]:https://www.linode.com/docs/security/using-fail2ban-for-security
|
||||
[19]:https://en.wikipedia.org/wiki/Open_Network_Computing_Remote_Procedure_Call
|
||||
[20]:http://support.ntp.org/bin/view/Main/SoftwareDownloads
|
||||
[21]:http://www.exim.org/
|
||||
[22]:https://nmap.org/
|
||||
[23]:https://www.linode.com/docs/security/securing-your-server/#configure-a-firewall
|
||||
[24]:https://linode.com/docs/security/ossec-ids-debian-7
|
||||
[25]:https://en.wikipedia.org/wiki/Access_control#Access_Control
|
||||
[26]:https://www.linode.com/docs/migrate-to-linode/migrate-from-shared-hosting
|
||||
[27]:https://www.linode.com/docs/security/linode-manager-security-controls
|
||||
[28]:https://www.linode.com/docs/websites/hosting-a-website
|
@ -0,0 +1,50 @@
|
||||
容器和 Unikernel 能从树莓派和 Arduino 学到什么?
|
||||
==========================================================================
|
||||
|
||||
![](https://opensource.com/sites/default/files/styles/image-full-size/public/images/business/bus-containers.png?itok=vM7_7vs0)
|
||||
|
||||
某一天,我和我的一个机械工程师朋友聊天的时候。 他最近在做一个给半挂卡车的电子辅助刹车系统,他提到他们公司的办公室里都是 [Arduinos][1]。这主要是方便员工可以快速的对新的想法进行实验。他也提到了,Arduinos 其实比自己画电路板更加昂贵。对此,我感到非常震惊,因为我从软件行业得到的印象是 Arduinos 比定制电路板更加便宜。
|
||||
|
||||
我常常把 [Arduinos][2] 和 [树莓派][3] 看做是可以制作非常有趣设备的小型、Cool、特别的组件。我主要从事于软件行业,并且总是觉得运行在 x86 和 x86-64 设备上的 Linux 才算是“常规用途”。而事实是,Arduinos 并不是特殊用途。实际上,它们是很常规的用途。它们相当的小、便宜,而且非常的灵活。这就是为什么它们像野火一样流行起来的原因。它们有全品类的输入输出设备和扩展卡。它们能让创客们快速的构建非常 Cool 的设备。它们甚至可以让公司可以快速地开发产品。
|
||||
|
||||
一套 Arduino 的单价比批量生产的电路板高了很多,但是,看不见的时间成本却低了很多。当电路板大规模生产的时候,价格可以控制的很低,但是,之前的研发费用却高了很多。所以,总而言之,答案就是,使用 Arduino 划得来。
|
||||
|
||||
### Unikernel、Rump 内核和容器主机
|
||||
|
||||
Unikernel、Rump 内核和迷你 Linux 发行版,这些操作系统是为了特有用途而构建的。这些特有的操作系统,某种程度上就像定制电路板。它们需要前期的投入,还需要设计,但是,当大规模部署的时候,它可以提供强大的性能。
|
||||
|
||||
迷你操作系统,例如:红帽企业版 Atomic 或者 CoreOS 是为了运行容器而构建的。它们很小,快速,易于在启动时配置,并且很适合于运行容器。缺点就是它需要额外的工程量来添加第三方插件,比如监控客户端或者虚拟化的工具。副作用就是载入的工具也需要重新设计为超级权限的容器。 如果你正在构建一个巨大的容器环境,这些额外的工作量是划算的。但是,如果只是想尝试下容器,那可能就没必要了。
|
||||
|
||||
容器提供了运行标准化的工作流程(比如使用 [glibc][4] 编译)的能力。一个好处就是你可以在你的电脑上构建和测试这个工作单元(Docker 镜像)并且在完全不同的硬件上或者云端非常顺利的部署,而保持着相同的特性。在生产环境中,容器的宿主机仍然由运维团队进行配置管理,但是应用被开发团队控制。这就是对双方来说最好的合作方式。
|
||||
|
||||
Unikernels 和 Rump 内核依旧是为了特定目标构建的,但是却更进一步。整个的操作系统在构建的时候就被开发或者架构师配置好了。这带来了好处,同时还有挑战。
|
||||
|
||||
一个好处就是,开发人员可以控制这个工作流程的运转。理论上说,一个开发者可以为了不同的特性,尝试 [不同的 TCP 协议栈][5],并且选择最好的一个。在操作系统启动的时候,开发人也可以配置 IP 地址,而不是通过 DHCP。 开发人员也可以裁剪任何对于应用而言不需要的部分。这也是性能提升的保障,因为减少了[不必要的上下文切换][6]。
|
||||
|
||||
同时,Unikernel 也带来了挑战。目前,还缺失很多的工具。 现在,和画板子的世界类似,开发人员需要花费很多时间和精力在检查是否有完整的库文件存在,不然的话,他们必须改变他们应用的执行方式。在如何让这个“嵌入式”的操作系统在运行时配置的方面,也存在挑战。最后,每次操作系统的大改动,都需要[反馈到开发人员][7]来进行修改。这并没有一个在开发和运维之间明确的界限,所以我能想象,为了接受了这个开发流程,一些组织或者公司必须要改变。
|
||||
|
||||
### 结论
|
||||
|
||||
在专门的容器主机比如 Rump 内核和 Unikernel 方面也有一些有趣的传闻,因为,它们会带来一个特定工作流程的潜在变革(嵌入式、云,等等)。在这个令人激动又快速发展的领域请保持你的关注,但是也要谨慎。
|
||||
|
||||
目前,Unikernel 看起来和定制电路板很像。它们都需要前期的研发投资,并且都是非常独特的,可以为确定的工作流程带来好处。同时,容器甚至在常规的工作流中都非常有趣,而且它不需要那么多的投入。一个简单的例子,运维团队能方便的在容器上部署一个应用,但是在 Unikernel 上部署一个应用则需要重新设计和编码,而且业界并不能完全保证,这个工作流程就可以被部署在 Unikernel 上。
|
||||
|
||||
容器,Rump 内核 和 Unikernel 有一个光明的未来!
|
||||
|
||||
--------------------------------------
|
||||
via: https://opensource.com/business/16/5/containers-unikernels-learn-arduino-raspberry-pi
|
||||
|
||||
作者:[Scott McCarty][a]
|
||||
译者:[MikeCoder](https://github.com/MikeCoder)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://opensource.com/users/fatherlinux
|
||||
[1]: https://opensource.com/resources/what-arduino
|
||||
[2]: https://opensource.com/life/16/4/arduino-day-3-projects
|
||||
[3]: https://opensource.com/resources/what-raspberry-pi
|
||||
[4]: https://en.wikipedia.org/wiki/GNU_C_Library
|
||||
[5]: http://www.eetasia.com/ARTICLES/2001JUN/2001JUN18_NTEK_CT_AN5.PDF
|
||||
[6]: https://en.wikipedia.org/wiki/Context_switch
|
||||
[7]: http://developers.redhat.com/blog/2016/05/18/3-reasons-i-should-build-my-containerized-applications-on-rhel-and-openshift/
|
@ -0,0 +1,336 @@
|
||||
Excel “过滤和编辑” - Pandas 中的示范操作
|
||||
==================================================
|
||||
|
||||
![](http://pbpython.com/images/Boolean-Indexing-Example.png)
|
||||
|
||||
### 介绍
|
||||
|
||||
我听许多人说我[之前的关于 pandas 处理一般的 Excel 任务][1]的文章对于帮助新的 pandas 用户将 Excel 处理过程转化成对应的 pandas 代码是有用的。这篇文章将会保持传统,通过介绍不同的 pandas 使用 Excel 的过滤功能作为一个模型进行索引的例子来理解该处理过程。
|
||||
|
||||
大多数 pandas 的新手首先学到的东西就是基本的数据过滤。即使在过去的时间中使用 pandas 工作持续数月,我最近意识到我没有在我每天的工作中使用过的 pandas 过滤的方法还有另外一个好处。也就是说,你可以过滤一组给定的列,而使用一个简化的 pandas 的语法更新另一组列。这和我所说的 Excel 中的“过滤并编辑”很像。
|
||||
|
||||
这篇文章将会介绍一些基于各种条件过滤一个 pandas 数据帧并同时更新数据的例子。同时,我将更多的介绍一下 panda 的索引,和如何使用索引功能例如 .loc , .ix 和 .iloc 来简单、快速基于简单或者是复杂的条件来更新一个数据子集。
|
||||
|
||||
### Excel: “过滤并编辑”
|
||||
|
||||
在数据透视表以外,在 EXCEL 顶部工具栏的工具之一是过滤器。这个简单的工具允许用户通过不同的数据、文本与格式条件去快速过滤与排序数据。这里是由几个不同的条件过滤数据产生的样本数据的基本截图:
|
||||
|
||||
![](http://pbpython.com/images/filter-example.png)
|
||||
|
||||
该过滤过程是直观的,即使是最新手的用户,也很容易掌握。我也注意到,人们会使用此功能来选择数据行,然后根据行的条件来更新其它的列。下面的例子显示了我所描述的情形:
|
||||
|
||||
![](http://pbpython.com/images/commission-example.png)
|
||||
|
||||
在这个例子中,我过滤了 Account Number、SKU 和 Unit Price 的数据。接着我手工增加了 Commission_Rate列,并且在每个单元格中输入 0.01。这种方法的好处是可以很容易理解,并有助于管理有联系的复杂数据而不用写长长的 Excel 公式或者使用 VBA。这种方法的缺点是,它是不可重复的,同时,对于刚入门的外行人了解哪些条件被用于过滤器可能是比较困难的。
|
||||
|
||||
例如,假设你看上述截图,如果不看每一列数据,没有明显的方法去知道什么被过滤了。幸运的是,我们可以在 pandas 中完成相似操作。不用奇怪,在 pandas 中使用简单干净的代码来执行“过滤并编辑”模式是很容易的。
|
||||
|
||||
### 布尔检索
|
||||
|
||||
现在,我想通过 pandas 中一些布尔索引的细节来使你对这个问题有点感觉。如果你想要去理解 pandas 的在多数情况下的[索引和数据选择][3],那么这是一个要理解的重要概念。这种想法可能看起来有点复杂,对新的 pandas 用户(可能对经验丰富的用户来说太基础),但我认为重要的是要花一些时间了解它。如果你掌握了这一概念,用 pandas 进行数据工作的基本过程将更简单。
|
||||
|
||||
pandas 通过标签、基于数字的位置或者一个布尔值(True/False)列表来支持索引(或者选择数据)。使用一个布尔值的列表来选择一个行被称为布尔索引,将是本文其余部分的重点。
|
||||
|
||||
我发现,我的 pandas 的工作流程往往侧重于使用布尔值的列表选择我的数据。换句话说,当我创建了 pandas 数据帧,我倾向于保持数据框架的默认索引。因此,该布尔索引本身并不具有真正意义,同时也不是简单的选择数据。
|
||||
|
||||
|
||||
> 关键点
|
||||
> pandas 中布尔索引是选择行的数据的强大的和有用的方法之一。
|
||||
|
||||
让我们看一些示例的数据帧来帮助澄清在 pandas 中布尔索引做的是什么。
|
||||
|
||||
首先,我们将创建一个来自 Python 的列表的非常小的数据帧,并使用它来展示布尔索引是如何工作的。
|
||||
|
||||
|
||||
```
|
||||
import pandas as pd
|
||||
sales = [('account', ['Jones LLC', 'Alpha Co', 'Blue Inc', 'Mega Corp']),
|
||||
('Total Sales', [150, 200, 75, 300]),
|
||||
('Country', ['US', 'UK', 'US', 'US'])]
|
||||
df = pd.DataFrame.from_items(sales)
|
||||
```
|
||||
|
||||
|account |Total Sales |Country
|
||||
:--|:-- |:-- |:
|
||||
0 |Jones LLC |150 |US
|
||||
1 |Alpha Co |200 |UK
|
||||
2 |Blue Inc |75 |US
|
||||
3 |Mega Corp |300 |US
|
||||
|
||||
注意值 0-3,是怎么样会自动分配给行的?这些都是索引,在这个数据集它们不是特别有意义的,但对 pandas 是有用的,对于了解如下其他没有描述的用例是重要的。
|
||||
|
||||
当我们引用布尔索引时,我们只是说,我们可以通过一个 True 或 Flse 的值的列表表示我们要查看的每一行。
|
||||
|
||||
在这种情况下,如果我们想查看Jones LLC、Blue Inc 和 Mega Corp 的数据,我们可以看到,True、False 列表看起来会像这样:
|
||||
|
||||
```
|
||||
indices = [True, False, True, True]
|
||||
```
|
||||
|
||||
这没什么奇怪的,你可以通过把这个列表传入到你的数据帧,你就看到它只会显示该值是 True 的行:
|
||||
|
||||
```
|
||||
df[indices]
|
||||
```
|
||||
|
||||
|account |Total Sales |Country
|
||||
:--|:--|:--|:--
|
||||
0 |Jones LLC |150 |US
|
||||
2 |Blue Inc |75 |US
|
||||
3 |Mega Corp |300 |US
|
||||
|
||||
|
||||
这里是一个刚刚发生了什么的示意图:
|
||||
|
||||
![](http://pbpython.com/images/Boolean-Indexing-Example.png)
|
||||
|
||||
手工创建索引列表是可以工作的,但是显然对任何一个稍微大点的数据集来说却不是可扩展的或非常有用的。幸运的是,pandas 可以用一个简单的查询语言创建这些布尔索引,对熟悉使用 Python (或任何语言)的人应该很容易。
|
||||
|
||||
例如,让我们看看来自美国的所有销售的行。如果我们执行一个基于 Country 列的 Python 表达式:
|
||||
|
||||
|
||||
```
|
||||
df.Country == 'US'
|
||||
```
|
||||
|
||||
```
|
||||
0 True
|
||||
1 False
|
||||
2 True
|
||||
3 True
|
||||
Name: Country, dtype: bool
|
||||
```
|
||||
|
||||
这个例子显示了 pandas 如何将你的 Python 的常规逻辑,把它应用到一个数据帧并返回一个布尔值列表。那么这个布尔值的列表可以传递到数据帧来获取相应的行。
|
||||
|
||||
在真正的代码中,你不需要做这两个步骤。简洁的做这事的方法典型的看上去如下:
|
||||
|
||||
```
|
||||
df[df["Country"] == 'US']
|
||||
```
|
||||
|
||||
|account |Total Sales |Country
|
||||
:--|:--|:--|:--
|
||||
0 |Jones LLC |150| US
|
||||
2 |Blue Inc |75 |US
|
||||
3 |Mega Corp| 300| US
|
||||
|
||||
虽然这个概念很简单,但你可以编写非常复杂的逻辑,使用 Python 的威力来过滤数据。
|
||||
|
||||
|
||||
> 关键点
|
||||
> 在这个例子中, `df[df.Country == 'US']` 等价于 `df[df["Country"] == 'US']` ‘.’ 标记法是简洁的但是在你列名中有空格时不会工作。
|
||||
|
||||
|
||||
### 选择需要的列
|
||||
|
||||
现在,我们已经指出了如何选择行的数据,我们如何控制显示哪些列?在上面的例子中,没有明确的方法完成这个。Pandas 能使用三种基于位置的索引支持这个用法:.loc 、iloc 和 .ix 。这些功能也允许我们在所看到的行之外挑选列。
|
||||
|
||||
关于什么时候选择使用 .loc 、iloc 或者是 .ix,在这里很容易困惑。 快速总结的区别是:
|
||||
|
||||
- .loc 用于标签索引
|
||||
- .iloc 用于基于整数的位置
|
||||
- .ix 是一个快捷方式,它将尝试使用标签(比如 .loc)但失败后将退而求其次使用基于整数的位置(比如 .iloc)
|
||||
|
||||
因此问题是我该使用哪个?我必须坦诚地说,我有的时候也会被这些搞混。我发现我最常使用 .loc 。主要是因为我的数据不适合于有意义的基于位置的索引(换句话说,我很少发现自己需要使用 .iloc),所以我坚持使用 .loc。
|
||||
|
||||
公平地讲,每一个方法都有自己的用途,在许多情况下都是有用的。特别是处理多索引数据帧时。我不会在这篇文章中讨论那个话题-也许在未来的博文会说。
|
||||
|
||||
现在我们已经涵盖了这样一个话题,让我们来展示如何筛选一行的值的数据帧,具体选择要显示的列。
|
||||
|
||||
继续我们的例子,如果我们只是想显示对应于我们的索引的帐户名称,该怎么做?使用 .loc 很简单:
|
||||
|
||||
```
|
||||
df.loc[[True, True, False, True], "account"]
|
||||
```
|
||||
|
||||
```
|
||||
1 Alpha Co
|
||||
2 Blue Inc
|
||||
3 Mega Corp
|
||||
Name: account, dtype: object
|
||||
```
|
||||
|
||||
如果你想看到多个列,只需传递一个列表:
|
||||
|
||||
```
|
||||
df.loc[[True, True, False, True], ["account", "Country"]]
|
||||
```
|
||||
|
||||
| account |Country
|
||||
:--|:--|:--
|
||||
0 |Jones LLC| US
|
||||
1 |Alpha Co |UK
|
||||
3 |Mega Corp |US
|
||||
|
||||
真正的威力是当你在你的数据上创建更复杂的查询。在这种情况下,让我们展示所有的帐户名称和 sales > 200 的国家:
|
||||
|
||||
```
|
||||
df.loc[df["Total Sales"] > 200, ["account", "Country"]]
|
||||
```
|
||||
|
||||
|account| Country
|
||||
:--|:--|:--
|
||||
3 |Mega Corp| US
|
||||
|
||||
|
||||
这个过程可以看做有点相当于我们上面讨论过的 Excel 过滤器。但是有更多的好处,你还可以限制你检索的列数,而不仅仅是行。
|
||||
|
||||
### 编辑列
|
||||
|
||||
所有这些都是好的背景知识,但当你使用一个类似的方法基于选择的行来更新一个或多个列时,这个处理过程就真的是非常漂亮。
|
||||
|
||||
作为一个简单的例子,让我们增加一个 rate 列到我们的数据:
|
||||
|
||||
```
|
||||
df["rate"] = 0.02
|
||||
```
|
||||
|
||||
| account |Total Sales| Country |rate
|
||||
:--|:--|:--|:--|:--
|
||||
0 |Jones LLC |150 |US |0.02
|
||||
1 |Alpha Co |200 |UK |0.02
|
||||
2 |Blue Inc |75 |US |0.02
|
||||
3 |Mega Corp |300 |US |0.02
|
||||
|
||||
|
||||
假如说如果你卖了超过 100,你的利率是 5%。基本的过程是设置一个布尔索引来选择列,然后将该值赋给利率列:
|
||||
|
||||
|
||||
```
|
||||
df.loc[df["Total Sales"] > 100, ["rate"]] = .05
|
||||
```
|
||||
|
||||
| account |Total Sales| Country| rate
|
||||
:--|:--|:--|:--|:--
|
||||
0 |Jones LLC |150| US| 0.05
|
||||
1 |Alpha Co |200 |UK |0.05
|
||||
2 |Blue Inc |75| US |0.02
|
||||
3 |Mega Corp |300| US| 0.05
|
||||
|
||||
|
||||
希望你逐步看过这篇文章,这将对于帮助你理解这个语法是如何工作的是有意义的。现在你明白了“过滤并编辑”方法的基本原理。最后一节将介绍 Excel 和 pandas 这个过程的更多细节。
|
||||
|
||||
### 将这些组合在一起
|
||||
|
||||
对于最后的例子,我们将创建一个简单的佣金计算器,使用以下规则:
|
||||
|
||||
- 所有的佣金计算在交易水平
|
||||
- 所有销售的基础佣金为 2%
|
||||
- 所有 shirt 都将获得 2.5% 的佣金
|
||||
- 有个特殊的环节,在一个交易中销售的数额 >10 的 belt 将得到 4% 的佣金
|
||||
- 所有在一个单一的 shoe 类交易中 > 1000 美元,有一个特别的 250 美元奖金加上一个 4.5% 的佣金
|
||||
|
||||
要在 Excel 中做到这一点,使用的过滤器和编辑方法:
|
||||
|
||||
- 添加一个 2% 的佣金列
|
||||
- 添加一个 0 美元的奖金列
|
||||
- 过滤 shirts,并将 vale 改为 2.5%
|
||||
- 清除过滤器
|
||||
- 过滤数量 > 10 的 belt ,并将值更改为 4%
|
||||
- 清除过滤器
|
||||
- 过滤 > 1000 美元 shoe,并相应的增加佣金和奖金为 4.5% 和 250 美元
|
||||
|
||||
我不会显示每一步的屏幕快照,但这里是最后一个过滤器的屏幕快照:
|
||||
|
||||
![](http://pbpython.com/images/filter-2.png)
|
||||
|
||||
这种方法很简单,便于操作,但它不具备很好的可重复性,也不能审核。当然还有其他的方法,如在 Excel 公式或 VBA 中实现这些。然而,这种过滤器和编辑的方法是常用的,可以说明 pandas 的逻辑。
|
||||
|
||||
现在,让我们在 pandas 中运行这个例子。
|
||||
|
||||
首先,读入 [Excel 文件][4]同时加入默认值为 2% 的 rate 一列:
|
||||
```
|
||||
import pandas as pd
|
||||
df = pd.read_excel("https://github.com/chris1610/pbpython/blob/master/data/sample-sales-reps.xlsx?raw=true")
|
||||
df["commission"] = .02
|
||||
df.head()
|
||||
```
|
||||
|
||||
| account number| customer name| sales rep| sku |category |quantity |unit price| ext price| date| commission
|
||||
:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--
|
||||
0 |680916 |Mueller and Sons |Loring Predovic |GP-14407 | Belt |19 |88.49 |1681.31 |2015-11-17 05:58:34| 0.02
|
||||
1 |680916 |Mueller and Sons |Loring Predovic |FI-01804| Shirt |3| 78.07| 234.21 |2016-02-13 04:04:11 |0.02
|
||||
2 |530925 |Purdy and Sons| Teagan O’Keefe |EO-54210 |Shirt |19 |30.21 |573.99 |2015-08-11 12:44:38 |0.02
|
||||
3 |14406| Harber, Lubowitz and Fahey| Esequiel Schinner| NZ-99565| Shirt| 12| 90.29 |1083.48 |2016-01-23 02:15:50 |0.02
|
||||
4 |398620| Brekke Ltd |Esequiel Schinner |NZ-99565 |Shirt |5| 72.64 |363.20 |2015-08-10 07:16:03 |0.02
|
||||
|
||||
|
||||
下一个规则是所有 shirt 获得 2.5% 和 Belt 销售 > 10 得到一个 4% 的 rate:
|
||||
|
||||
```
|
||||
df.loc[df["category"] == "Shirt", ["commission"]] = .025
|
||||
df.loc[(df["category"] == "Belt") & (df["quantity"] >= 10), ["commission"]] = .04
|
||||
df.head()
|
||||
```
|
||||
|
||||
| account number |customer name |sales rep| sku |category |quantity| unit price| ext price |date |commission
|
||||
:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--
|
||||
0 |680916| Mueller and Sons| Loring Predovic| GP-14407| Belt| 19 |88.49| 1681.31 |2015-11-17 05:58:34| 0.040
|
||||
1 |680916| Mueller and Sons| Loring Predovic| FI-01804| Shirt |3 |78.07 |234.21| 2016-02-13 04:04:11 |0.025
|
||||
2 |530925 |Purdy and Sons |Teagan O’Keefe| EO-54210 |Shirt| 19 |30.21 |573.99 |2015-08-11 12:44:38| 0.025
|
||||
3 |14406| Harber, Lubowitz and Fahey| Esequiel Schinner| NZ-99565| Shirt| 12| 90.29| 1083.48| 2016-01-23 02:15:50 |0.025
|
||||
4 |398620| Brekke Ltd| Esequiel Schinner| NZ-99565| Shirt| 5 |72.64 |363.20| 2015-08-10 07:16:03 |0.025
|
||||
|
||||
最后的佣金规则是加上特别的奖金:
|
||||
|
||||
```
|
||||
df["bonus"] = 0
|
||||
df.loc[(df["category"] == "Shoes") & (df["ext price"] >= 1000 ), ["bonus", "commission"]] = 250, 0.045
|
||||
|
||||
# Display a sample of rows that show this bonus
|
||||
df.ix[3:7]
|
||||
```
|
||||
|
||||
| account number| customer name |sales rep| sku |category| quantity| unit price| ext price| date| commission| bonus
|
||||
:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--|:--
|
||||
3| 14406| Harber, Lubowitz and Fahey| Esequiel Schinner| NZ-99565| Shirt |12 |90.29| 1083.48 |2016-01-23 02:15:50 |0.025 |0
|
||||
4| 398620| Brekke Ltd| Esequiel Schinner |NZ-99565| Shirt| 5| 72.64| 363.20| 2015-08-10 07:16:03| 0.025| 0
|
||||
5| 282122| Connelly, Abshire and Von Beth| Skiles| GJ-90272| Shoes| 20| 96.62| 1932.40 |2016-03-17 10:19:05 |0.045 |250
|
||||
6 |398620 |Brekke Ltd| Esequiel Schinner |DU-87462 |Shirt| 10| 67.64 |676.40| 2015-11-25 22:05:36| 0.025| 0
|
||||
7| 218667| Jaskolski-O’Hara| Trish Deckow| DU-87462| Shirt |11| 91.86| 1010.46 |2016-04-24 15:05:58| 0.025| 0
|
||||
|
||||
为了做好佣金的计算:
|
||||
|
||||
```
|
||||
# Calculate the compensation for each row
|
||||
df["comp"] = df["commission"] * df["ext price"] + df["bonus"]
|
||||
|
||||
# Summarize and round the results by sales rep
|
||||
df.groupby(["sales rep"])["comp"].sum().round(2)
|
||||
```
|
||||
|
||||
```
|
||||
sales rep
|
||||
Ansley Cummings 2169.76
|
||||
Beth Skiles 3028.60
|
||||
Esequiel Schinner 10451.21
|
||||
Loring Predovic 10108.60
|
||||
Shannen Hudson 5275.66
|
||||
Teagan O'Keefe 7989.52
|
||||
Trish Deckow 5807.74
|
||||
Name: comp, dtype: float64
|
||||
```
|
||||
|
||||
如果你有兴趣,一个例子手册放在[github][5]。
|
||||
|
||||
### 总结
|
||||
|
||||
感谢阅读文章。 我发现,在学习如何使用 pandas 的新用户所面临最大的挑战之一,是根据他们基于 Excel 的知识,如何找出建立一个等效的基于 pandas 的解决方案。在许多情况下,pandas 的解决方案将是更健壮、更快、更容易审计和更强大的。然而,学习曲线需要花费一些时间。我希望这个展示了如何使用电子表格的过滤工具来解决一个问题的例子,将有助于那些刚刚在开始 pandas 之旅的同学们。祝你好运!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://pbpython.com/excel-filter-edit.html
|
||||
|
||||
作者:[Chris Moffitt ][a]
|
||||
译者:[zky001](https://github.com/zky001)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: http://pbpython.com/author/chris-moffitt.html
|
||||
[1]: http://pbpython.com/excel-pandas-comp.html
|
||||
[2]: http://pbpython.com/excel-pandas-comp-2.html
|
||||
[3]: http://pandas.pydata.org/pandas-docs/stable/indexing.html
|
||||
[4]: https://github.com/chris1610/pbpython/blob/master/data/sample-sales-reps.xlsx?raw=true
|
||||
[5]: https://github.com/chris1610/pbpython/blob/master/notebooks/Commissions-Example.ipynb
|
71
published/201612/20160627 Linux Practicality vs Activism.md
Normal file
71
published/201612/20160627 Linux Practicality vs Activism.md
Normal file
@ -0,0 +1,71 @@
|
||||
Linux 的实用性 VS 行动主义
|
||||
==================================
|
||||
|
||||
*我们使用 Linux 是因为它比其他操作系统更实用,还是其他更高级的理由呢?*
|
||||
|
||||
运行 Linux 的最吸引人的事情之一就是它所提供的自由。 Linux 社区之间的分野在于我们如何看待这种自由。
|
||||
|
||||
对一些人来说,使用 Linux 可以享受到不受供应商限制或避免高昂的软件成本的自由。大多数人会称这个是一个实用性的考虑。而其它用户会告诉你,他们享受的是自由软件的自由。那就意味着拥护支持<ruby> [自由软件运动][1]<rt> Free Software Movement</rt> </ruby>的 Linux 发行版,完全避免专有软件和所有相关的东西。
|
||||
|
||||
在这篇文章中,我将带你比较这两种自由的区别,以及它们如何影响 Linux 的使用。
|
||||
|
||||
### 专有的问题
|
||||
|
||||
大多数 Linux 用户有一个共同点,就是他们尽量避免使用专有软件。对像我这样的实用主义的爱好者来说,这意味着我能够控制我的软件支出,以及避免过度依赖特定供应商。当然,我不是一个程序员……所以我对安装软件的调整是十分微小的。但也有一些个别情况,对应用程序的小调整就意味着它要么能工作,要么不能。
|
||||
|
||||
还有一些 Linux 爱好者,倾向于避开专有软件,因为他们觉得使用它们是不道德的。通常这里主要的问题是使用专有软件会剥夺或者干脆阻碍你的个人自由。像这些用户更喜欢使用 Linux 发行版和软件来支持 [自由软件理念][2] 。虽然它与开源的概念相似并经常直接与之混淆,[但它们之间还是有些差异的][3] 。
|
||||
|
||||
因此,问题就在这里:像我这样的用户往往将便利性置于纯粹的软件自由的理念之上。不要误会我的意思,像我这样的人喜欢使用符合自由软件理念的软件,但我们也更有可能做出让步(使用专有软件),以完成特定的任务。
|
||||
|
||||
这两种类型的 Linux 爱好者都喜欢使用非专有软件的解决方案。但是,自由软件倡导者根本不会去使用专有软件,而实用主义用户会选择具有最佳性能的工具。这意味着,在有些情况下,这些用户会在他们的非专有操作系统上运行专有应用或代码。
|
||||
|
||||
最终,这两种类型的用户都喜欢使用 Linux 所提供的非专有解决方案。但是,我们这样做的原因往往会有所不同。有人认为那些不支持自由软件的人是无知的。我不同意这种看法,我认为它是实用方便性的问题。那些喜欢实用方便性的用户根本不关心他们软件的政治问题。
|
||||
|
||||
### 实用方便性
|
||||
|
||||
当你问起绝大多数的人为什么使用他们现在的操作系统,回答通常都集中于实用方便性。方便性可能体现在“它是我一直使用的系统”,乃至于“它运行了我需要的软件”。 其他人可能进一步解释说,软件对他们使用操作系统的偏好影响不大,而是对操作系统的熟悉程度的问题,最后,还有一些特殊的“商业考虑”或硬件兼容性等问题也导致我们使用这个操作系统而不是另一个。
|
||||
|
||||
这可能会让你们中许多人很惊讶,不过如今我运行桌面 Linux 最大的一个原因是由于我熟悉它。即使我能为别人提供 Windows 和 OS X 的支持,实际上我使用这些操作系统时感觉相当沮丧,因为它们根本就不是我习惯的用法。也因此我对那些 Linux 新手表示同情,因为我太懂得踏入陌生的领域是怎样的让人恼火了。我的观点是这样的 —— 熟悉具有价值,而且熟悉加强了实用方便性。
|
||||
|
||||
现在,如果我们把它和一个自由软件倡导者的需求来比较,你会发现这种人都愿意学习新的甚至更具挑战性的东西,以避免使用非自由软件。对这种用户,我最赞赏的地方,就是他们坚定的采取少数人选择的道路来坚持他们的原则,在我看来,这是十分值得赞赏的。
|
||||
|
||||
### 自由的价值
|
||||
|
||||
我不羡慕那些自由软件倡导者的一个地方,就是根据<ruby> [自由软件基金会][4] <rt>Free Software Foundation</rt></ruby>规定的标准,为实现其自由,他们要始终使用 Linux 发行版和硬件而付出的额外工作。这意味着 Linux 内核需要摆脱专有的驱动支持,而且硬件不需要任何专有代码。当然不是不可能的,但确实很难。
|
||||
|
||||
一个自由软件倡导者可以达到的最好的情况是硬件是“自由兼容”的。有些供应商,可以满足这一需求,但大多提供的硬件依赖于 Linux 兼容的专有固件。实用主义用户对自由软件倡导者来说是个搅局者。
|
||||
|
||||
那么这一切意味着的是,倡导者必须比实用主义的 Linux 爱好者,更加警惕。这本身并不一定是坏事,但如果是打算跳入自由软件的阵营那就要考虑下了。比较而言,实用主义的用户可以不假思索地使用与 Linux 兼容的任何软件或硬件。我不知道你是怎么想的,但在我眼中这样更轻松一点。
|
||||
|
||||
### 定义自由软件
|
||||
|
||||
这一部分可能会让一部分人不高兴,因为我不相信自由软件只有一种。从我的立场,我认为真正的自由是能够在一个特定情况下在所有可用的数据里,用最适合这个人生活方式的方法来解决。
|
||||
|
||||
对我来说,我更喜欢使用能满足我所有需求的 Linux 桌面,这包括使用非专有软件和专有软件。尽管有人认为专有软件限制了我的个人自由,但我必须反驳这一点,因为我有优先使用它的自由,即选择的自由。
|
||||
|
||||
或许,这也就是为什么我更认同<ruby>开源软件<rt> Open Source Software</rt></ruby>的理想,而不是坚持<ruby>自由软件运动<rt>Free Software movement</rt></ruby>的理念。我更愿意和这样的人群在一起,他们不会花时间告诉我,我使用对我最适合的方式却是错误的。根据我的经验,这些开源的人群仅仅是感兴趣去分享自由软件的优点,不带有自由软件的理想主义的激情。
|
||||
|
||||
我觉得自由软件的概念很棒。而且对那些需要活跃在软件政治,并向大众指出使用专有软件的缺陷的人来说,我认为 Linux ( [GNU/Linux][5] ) 行动是一个不错的选择。而像我这样的实用主义用户可能从自由软件的支持者转向,如本文中所说。
|
||||
|
||||
当我介绍 Linux 的桌面时,我富有激情地分享它的实际优点。如果我成功地让他们享受这一经历,我鼓励用户自己去发现自由软件的观点。但我发现大多数人使用 Linux 并不是因为他们想拥抱自由软件,而仅仅是他们想要最好的用户体验。也许只有我是这样的观点,很难说。
|
||||
|
||||
你怎么认为呢?你是一个自由软件倡导者吗?也许你倾向于在桌面 Linux 发行版中使用专有软件/代码?那么评论和分享您的 Linux 桌面体验吧!
|
||||
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.datamation.com/open-source/linux-practicality-vs-activism.html
|
||||
|
||||
作者:[Matt Hartley][a]
|
||||
译者:[joVoV](https://github.com/joVoV)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: http://www.datamation.com/author/Matt-Hartley-3080.html
|
||||
[1]: https://en.wikipedia.org/wiki/Free_software_movement
|
||||
[2]: https://www.gnu.org/philosophy/free-sw.en.html
|
||||
[3]: https://www.gnu.org/philosophy/free-software-for-freedom.en.html
|
||||
[4]: https://en.wikipedia.org/wiki/Free_Software_Foundation
|
||||
[5]: https://en.wikipedia.org/wiki/GNU/Linux_naming_controversy
|
@ -0,0 +1,196 @@
|
||||
用数据科学搭建一个实时推荐引擎
|
||||
======================
|
||||
|
||||
编者注:本文是 2016 年 4 月 Nicole Whilte 在欧洲 [GraphConnect][1] 时所作。这儿我们快速回顾一下她所涉及的内容:
|
||||
- 图数据库推荐基础
|
||||
- 社会化推荐
|
||||
- 相似性推荐
|
||||
- 集群推荐
|
||||
|
||||
今天我们将要讨论的内容是数据科学和图推荐(graph recommendations):
|
||||
|
||||
我在 [Neo4j][2] 任职已经两年了,但实际上我已经使用 Neo4j 和 [Cypher][3] 工作三年了。当我首次发现这个特别的图数据库(graph database)的时候,我还是一个研究生,那时候我在奥斯丁的德克萨斯大学攻读关于社交网络的统计学硕士学位。
|
||||
|
||||
[实时推荐引擎][4]是 Neo4j 中最广泛的用途之一,也是使它如此强大并且容易使用的原因之一。为了探索这个东西,我将通过使用示例数据集来阐述如何将统计学方法并入这些引擎中。
|
||||
|
||||
第一个很简单 - 将 Cypher 用于社交推荐。接下来,我们将看一看相似性推荐,这涉及到可被计算的相似性度量,最后探索的是集群推荐。
|
||||
|
||||
### 图数据库推荐基础
|
||||
|
||||
下面的数据集包含所有达拉斯 Fort Worth 国际机场的餐饮场所,达拉斯 Fort Worth 国际机场是美国主要的机场枢纽之一:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816214938/recommendation-engine-data-science-nicole-white-graphconnect-768x432.png)
|
||||
|
||||
我们把节点标记成黄色并按照出入口和航站楼给它们的位置建模。同时我们也按照食物和饮料的主类别将地点分类,其中一些包括墨西哥食物、三明治、酒吧和烤肉。
|
||||
|
||||
让我们做一个简单的推荐。我们想要在机场的某一确定地点找到一种特定食物,大括号中的内容表示是的用户输入,它将进入我们的假想应用程序中。
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816215426/food-drink-real-time-recommendation-engine-parameters-768x208.png)
|
||||
|
||||
这个英文句子表示成 Cypher 查询:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816215537/cypher-query-dfw-food-drink-real-time-recommendations-768x364.png)
|
||||
|
||||
这将提取出该类别中用户所请求的所有地点、航站楼和出入口。然后我们可以计算出用户所在位置到出入口的准确距离,并以升序返回结果。再次说明,这个非常简单的 Cypher 推荐仅仅依据的是用户在机场中的位置。
|
||||
|
||||
### 社交推荐(Social Recommendations)
|
||||
|
||||
让我们来看一下社交推荐。在我们的假想应用程序中,用户可以登录并且可以用和 Facebook 类似的方式标记自己“喜好”的地点,也可以在某地签到。
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816215655/social-media-recommendation-engine-data-model-768x550.png)
|
||||
|
||||
考虑位于我们所研究的第一个模型之上的数据模型,现在让我们在下面的分类中找到用户的朋友喜好的航站楼里面离出入口最近的餐饮场所:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816215751/social-recommendation-engine-parameters-768x258.png)
|
||||
|
||||
MATCH 子句和我们第一次 Cypher 查询的 MATCH 子句相似,只是现在我们依据喜好和朋友来匹配:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816215846/social-recommendation-engine-cypher-query-768x468.png)
|
||||
|
||||
前三行是完全一样的,但是现在要考虑的是那些登录的用户,我们想要通过 :FRIENDS_WITH 这一关系来找到他们的朋友。仅需通过在 Cypher 中增加一些行内容,我们现在已经把社交层面考虑到了我们的推荐引擎中。
|
||||
|
||||
再次说明,我们仅仅显示了用户明确请求的类别,并且这些类别中的地点与用户进入的地方是相同的航站楼。当然,我们希望按照登录并做出请求的用户来滤过这些目录,然后返回地点的名字、位置以及所在目录。我们也要显示出有多少朋友已经“喜好”那个地点以及那个地点到出入口的确切距离,然后在 RETURN 子句中同时返回所有这些内容。
|
||||
|
||||
### 相似性推荐(Similarity Recommendations)
|
||||
|
||||
现在,让我们看一看相似性推荐引擎:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816215944/similarity-recommendation-engine-data-model-768x646.png)
|
||||
|
||||
和前面的数据模型相似,用户可以标记“喜好”的地点,但是这一次他们可以用 1 到 10 的整数给地点评分。这是通过前期在 Neo4j 中增加一些属性到关系中建模实现的。
|
||||
|
||||
这将允许我们找到其他相似的用户,比如以上面的 Greta 和 Alice 为例,我们已经查询了他们共同喜好的地点,并且对于每一个地点,我们可以看到他们所设定的权重。大概地,我们可以通过他们的评分来确定他们之间的相似性大小。
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816220107/user-similarity-recommendation-engine-768x481.png)
|
||||
|
||||
现在我们有两个向量:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816220204/user-length-vectors-300x180.png)
|
||||
|
||||
现在让我们按照欧几里得距离(Euclidean distance)的定义来计算这两个向量之间的距离:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816220239/euclidean-distance-user-vectors.png)
|
||||
|
||||
我们把所有的数字带入公式中计算,然后得到下面的相似度,这就是两个用户之间的“距离”:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816220323/user-vector-distance-similarity-metric-768x140.png)
|
||||
|
||||
你可以很容易地在 Cypher 中计算两个特定用户的“距离”,特别是如果他们仅仅同时“喜好”一个很小的地点子集。再次说明,这儿我们依据两个用户 Alice 和 Greta 来进行匹配,并尝试去找到他们同时“喜好”的地点:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816220517/similarity-recommendation-engine-Cypher-query-users-768x399.png)
|
||||
|
||||
他们都有对最后找到的地点的 :LIKES 关系,然后我们可以在 Cypher 中很容易的计算出他们之间的欧几里得距离,计算方法为他们对各个地点评分差的平方求和再开平方根。
|
||||
|
||||
在两个特定用户的例子中上面这个方法或许能够工作。但是,在实时情况下,当你想要通过和实时数据库中的其他用户比较,从而由一架飞机上的一个用户推断相似用户时,这个方法就不一定能够工作。不用说,至少它不能够很好的工作。
|
||||
|
||||
为了找到解决这个问题的好方法,我们可以预先计算好距离并存入实际关系中:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816220642/similarity-recommendation-engine-user-euclidean-distance-768x284.png)
|
||||
|
||||
当遇到一个很大的数据集时,我们需要成批处理这件事,在这个很小的示例数据集中,我们可以按照所有用户的迪卡尔乘积(Cartesian product)和他们共同“喜好”的地点来进行匹配。当我们使用 WHERE id(u1) < id(u2) 作为 Cypher 询问的一部分时,它只是来确定我们在左边和右边没有找到相同的对的一个技巧。
|
||||
|
||||
通过用户之间的欧几里得距离,我们创建了他们之间的一种关系,叫做 :DISTANCE,并且设置了一个叫做 euclidean 的欧几里得属性。理论上,我们可以也通过用户间的一些关系来存储其他相似度从而获取不同的相似度,因为在确定的环境下某些相似度可能比其他相似度更有用。
|
||||
|
||||
在 Neo4j 中,的确是对关系属性建模的能力使得完成像这样的事情无比简单。然而,实际上,你不会希望存储每一个可能存在的单一关系,因为你仅仅希望返回离他们“最近”的一些人。
|
||||
|
||||
因此你可以根据一些临界值来存入前几个,从而你不需要构建完整的连通图。这允许你完成一些像下面这样的实时的数据库查询,因为我们已经预先计算好了“距离”并存储在了关系中,在 Cypher 中,我们能够很快的攫取出数据。
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816220737/similarity-recommendation-engine-parameters-768x256.png)
|
||||
|
||||
在这个查询中,我们依据地点和类别来进行匹配:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816221031/similarity-real-time-recommendation-engine-cypher-query-768x384.png)
|
||||
|
||||
再次说明,前三行是相同的,除了登录用户以外,我们找出了和他们有 :DISTANCE 关系的用户。这是我们前面查看的关系产生的作用 - 实际上,你只需要存储处于前几位的相似用户 :DISTANCE 关系,因此你不需要在 MATCH 子句中攫取大量用户。相反,我们只攫取和那些用户“喜好”的地方有 :DISTANCE 关系的用户。
|
||||
|
||||
这允许我们用少许几行内容表达较为复杂的模型。我们也可以攫取 :LIKES 关系并把它放入到变量中,因为后面我们将使用这些权重来评分。
|
||||
|
||||
在这儿重要的是,我们可以依据“距离”大小将用户按照升序进行排序,因为这是一个距离测度。同时,我们想要找到用户间的最小距离因为距离越小表明他们的相似度最大。
|
||||
|
||||
通过其他按照欧几里得距离大小排序好的用户,我们得到用户评分最高的三个地点并按照用户的平均评分高低来推荐这些地点。换句话说,我们先找出一个活跃用户,然后依据其他用户“喜好”的地点找出和他最相似的其他用户,接下来按照这些相似用户的平均评分把那些地点排序在结果的集合中。
|
||||
|
||||
本质上,我们通过把所有评分相加然后除以收集的用户数目来计算出平均分,然后按照平均评分的升序进行排序。其次,我们按照出入口距离排序。假想地,我猜测应该会有交接点,因此你可以按照出入口距离排序然后再返回名字、类别、出入口和航站楼。
|
||||
|
||||
### 集群推荐(Cluster Recommendations)
|
||||
|
||||
我们最后要讲的一个例子是集群推荐,在 Cypher 中,这可以被想像成一个作为临时解决方案的离线计算工作流。这可能完全基于在[欧洲 GraphConnect 上宣布的新方法][5],但是有时你必须进行一些 Cypher 2.3 版本所没有的算法逼近。
|
||||
|
||||
在这儿你可以使用一些统计软件,把数据从 Neo4j 取出然后放入像 Apache Spark、R 或者 Python 这样的软件中。下面是一段把数据从 Neo4j 中取出的 R 代码,运行该程序,如果正确,写下程序返回结果的给 Neo4j,可以是一个属性、节点、关系或者一个新的标签。
|
||||
|
||||
通过持续把程序运行结果放入到图表中,你可以在一个和我们刚刚看到的查询相似的实时查询中使用它:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816221336/cluster-recommendation-r-code-algorithm-neo4j.png)
|
||||
|
||||
下面是用 R 来完成这件事的一些示例代码,但是你可以使用任何你最喜欢的软件来做这件事,比如 Python 或 Spark。你需要做的只是登录并连接到图表。
|
||||
|
||||
在下面的例子中,我基于用户的相似性把他们聚合起来。每个用户作为一个观察点,然后得到他们对每一个目录评分的平均值。
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816221449/cluster-recommendation-engine-r-code-example-768x403.png)
|
||||
|
||||
假定用户对酒吧类评分的方式和一般的评分方式相似。然后我攫取出喜欢相同类别中的地点的用户名、类别名、“喜好”关系的平均权重,比如平均权重这些信息,从而我可以得到下面这样一个表格:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816221557/cluster-user-category-likes-768x295.png)
|
||||
|
||||
因为我们把每一个用户都作为一个观察点,所以我们必须巧妙的处理每一个类别中的数据,这些数据的每一个特性都是用户对该类中餐厅评分的平均权重。接下来,我们将使用这些数据来确定用户的相似性,然后我将使用聚类(clustering)算法来确定在不同集群中的用户。
|
||||
|
||||
在 R 中这很直接:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816221716/clustering-algorith-recommendation-r-example-768x347.png)
|
||||
|
||||
在这个示例中我们使用 K-均值(k-means)聚类算法,这将使你很容易攫取集群分配。总之,我通过运行聚类算法然后分别得到每一个用户的集群分配。
|
||||
|
||||
Bob 和 David 在一个相同的集群中 - 他们在集群二中 - 现在我可以实时查看哪些用户被放在了相同的集群中。
|
||||
|
||||
接下来我把集群分配写入 CSV 文件中,然后存入图数据库:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816221805/load-csv-cypher-example-768x227.png)
|
||||
|
||||
我们只有用户和集群分配,因此 CSV 文件只有两列。 LOAD CSV 是 Cypher 中的内建语法,它允许你从一些其他文件路径或者 URL 调用 CSV ,并给它一个别名。接下来,我们将匹配图数据库中存在的用户,从 CSV 文件中攫取用户列然后合并到集群中。
|
||||
|
||||
我们在图表中创建了一个新的标签节点:Cluster ID, 这是由 K-平均聚类算法给出的。接下来我们创建用户和集群间的关系,通过创建这个关系,当我们想要找到在相同集群中的实际推荐用户时,就会很容易进行查询。
|
||||
|
||||
我们现在有了一个新的集群标签,在相同集群中的用户和那个集群存在关系。新的数据模型看起来像下面这样,它比我们前面探索的其他数据模型要更好:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816221913/clustering-recommendation-engine-data-model-768x401.png)
|
||||
|
||||
现在让我们考虑下面的查询:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816222009/clustering-recommendation-engine-parameters-768x259.png)
|
||||
|
||||
通过这个 Cypher 查询,我们在更远处找到了在同一个集群中的相似用户。由于这个原因,我们删除了“距离”关系:
|
||||
|
||||
![](https://s3.amazonaws.com/dev.assets.neo4j.com/wp-content/uploads/20160816222045/cluster-recommendation-engine-cypher-query-example-768x385.png)
|
||||
|
||||
在这个查询中,我们取出已经登录的用户,根据用户-集群关系找到他们所在的集群,找到他们附近和他们在相同集群中的用户。
|
||||
|
||||
我们把这些用户分配到变量 c1 中,然后我们得到其他被我取别名为 neighbor 变量的用户,这些用户和那个相同集群存在着用户-集群关系,最后我们得到这些附近用户“喜好”的地点。再次说明,我把“喜好”放入了变量 r 中,因为我们需要从关系中攫取权重来对结果进行排序。
|
||||
|
||||
在这个查询中,我们所做的改变是,不使用相似性距离,而是攫取在相同集群中的用户,然后对类别、航站楼以及我们所攫取的登录用户进行声明。我们收集所有的权重:来自附近用户“喜好”地点的“喜好”关系,得到的类别,确定的距离值,然后把它们按升序进行排序并返回结果。
|
||||
|
||||
在这些例子中,我们可以进行一个相当复杂的处理并且将其放到图数据库中,然后我们就可以使用实时算法结果-聚类算法和集群分配的结果。
|
||||
|
||||
我们更喜欢的工作流程是更新这些集群分配,更新频率适合你自己就可以,比如每晚一次或每小时一次。当然,你可以根据直觉来决定多久更新一次这些集群分配是可接受的。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://neo4j.com/blog/real-time-recommendation-engine-data-science/
|
||||
|
||||
作者:[Nicole White][a]
|
||||
译者:[ucasFL](https://github.com/ucasFL)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://neo4j.com/blog/contributor/nicole-white/
|
||||
[1]: http://graphconnect.com/
|
||||
[2]: http://neo4j.com/product/
|
||||
[3]: http://neo4j.com/blog/why-database-query-language-matters/#cypher
|
||||
[4]: https://neo4j.com/use-cases/real-time-recommendation-engine/
|
||||
[5]: https://neo4j.com/blog/neo4j-3-0-massive-scale-developer-productivity/
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
@ -1,19 +1,19 @@
|
||||
安卓平台上的依赖注入 - 第一部分
|
||||
安卓平台上的依赖注入(一)
|
||||
===========================
|
||||
|
||||
![](https://d262ilb51hltx0.cloudfront.net/max/2000/1*YWlAzAY20KLLGIyyD_mzZw.png)
|
||||
|
||||
刚开始学习软件工程的时候,我们经常会碰到像这样的事情:
|
||||
|
||||
>软件应该符合 SOLID 原则。
|
||||
> 软件应该符合 SOLID 原则。
|
||||
|
||||
但这句话实际是什么意思?让我们看看 SOLID 中每个字母在架构里所代表的重要含义,例如:
|
||||
|
||||
- [S 单职责原则][1]
|
||||
- [O 开闭原则][2]
|
||||
- [L Liskov 替换原则][3]
|
||||
- [I 接口分离原则][4]
|
||||
- [D 依赖反转原则][5] 这也是依赖注入的核心概念。
|
||||
- [S - 单职责原则][1]
|
||||
- [O - 开闭原则][2]
|
||||
- [L - Liskov 替换原则][3]
|
||||
- [I - 接口分离原则][4]
|
||||
- [D - 依赖反转原则][5] 这也是依赖注入(dependency injection)的核心概念。
|
||||
|
||||
简单来说,我们需要提供一个类,这个类有它所需要的所有对象,以便实现其功能。
|
||||
|
||||
@ -39,7 +39,7 @@ class DependencyInjection {
|
||||
}
|
||||
```
|
||||
|
||||
正如我们所见,第一种情况是我们在构造器里创建了依赖对象,但在第二种情况下,它作为参数被传递给构造器,这就是我们所说的依赖注入。这样做是为了让我们所写的类不依靠特定依赖关系的实现,却能直接使用它。
|
||||
正如我们所见,第一种情况是我们在构造器里创建了依赖对象,但在第二种情况下,它作为参数被传递给构造器,这就是我们所说的依赖注入(dependency injection)。这样做是为了让我们所写的类不依靠特定依赖关系的实现,却能直接使用它。
|
||||
|
||||
参数传递的目标是构造器,我们就称之为构造器依赖注入;或者是某个方法,就称之为方法依赖注入:
|
||||
|
||||
@ -58,13 +58,13 @@ class Example {
|
||||
```
|
||||
|
||||
|
||||
要是你想总体深入地了解依赖注入,可以看看由 [Dan Lew][t2] 发表的[精彩的演讲][t1],事实上是这个演讲启迪了这个概述。
|
||||
要是你想总体深入地了解依赖注入,可以看看由 [Dan Lew][t2] 发表的[精彩的演讲][t1],事实上是这个演讲启迪了这篇概述。
|
||||
|
||||
在 Android 平台,当需要框架来处理依赖注入这个特殊的问题时,我们有不同的选择,其中最有名的框架就是 [Dagger 2][t3]。它最开始是由 Square 公司(译者注:Square 是美国一家移动支付公司)里一些很棒的开发者开发出来的,然后慢慢发展成由 Google 自己开发。特别地,Dagger 1 先被开发出来,然后 Big G 接手这个项目,做了很多改动,比如以注释为基础,在编译的时候就完成 Dagger 的任务,也就是第二个版本。
|
||||
在 Android 平台,当需要框架来处理依赖注入这个特殊的问题时,我们有不同的选择,其中最有名的框架就是 [Dagger 2][t3]。它最开始是由 Square 公司(LCTT 译注:Square 是美国一家移动支付公司)的一些很棒的开发者开发出来的,然后慢慢发展成由 Google 自己开发。首先开发出来的是 Dagger 1,然后 Big G 接手这个项目发布了第二个版本,做了很多改动,比如以注解(annotation)为基础,在编译的时候完成其任务。
|
||||
|
||||
### 导入框架
|
||||
|
||||
安装 Dagger 并不难,但需要导入 `android-apt` 插件,通过向项目的根目录下的 build.gradle 文件中添加它的依赖关系:
|
||||
安装 Dagger 并不难,但需要导入 `android-apt` 插件,通过向项目的根目录下的 `build.gradle` 文件中添加它的依赖关系:
|
||||
|
||||
```
|
||||
buildscript{
|
||||
@ -76,13 +76,13 @@ buildscript{
|
||||
}
|
||||
```
|
||||
|
||||
然后,我们需要将 `android-apt` 插件应用到项目 build.gradle 文件,放在文件顶部 Android 应用那一句的下一行:
|
||||
然后,我们需要将 `android-apt` 插件应用到项目 `build.gradle` 文件,放在文件顶部 Android application 那一句的下一行:
|
||||
|
||||
```
|
||||
apply plugin: ‘com.neenbedankt.android-apt’
|
||||
```
|
||||
|
||||
这个时候,我们只用添加依赖关系,然后就能使用库和注释了:
|
||||
这个时候,我们只用添加依赖关系,然后就能使用库及其注解(annotation)了:
|
||||
|
||||
```
|
||||
dependencies{
|
||||
@ -93,11 +93,11 @@ dependencies{
|
||||
}
|
||||
```
|
||||
|
||||
>需要加上最后一个依赖关系是因为 @Generated 注解在 Android 里还不可用,但它是[原生的 Java 注解][t4]。
|
||||
> 需要加上最后一个依赖关系是因为 @Generated 注解在 Android 里还不可用,但它是[原生的 Java 注解][t4]。
|
||||
|
||||
### Dagger 模块
|
||||
|
||||
要注入依赖,首先需要告诉框架我们能提供什么(比如说上下文)以及特定的对象应该怎样创建。为了完成注入,我们用 `@Module` 注释对一个特殊的类进行了注解(这样 Dagger 就能识别它了),寻找 `@Provide` 标记的方法,生成图表,能够返回我们所请求的对象。
|
||||
要注入依赖,首先需要告诉框架我们能提供什么(比如说上下文)以及特定的对象应该怎样创建。为了完成注入,我们用 `@Module` 注释对一个特殊的类进行了注解(这样 Dagger 就能识别它了),寻找 `@Provide` 注解的方法,生成图表,能够返回我们所请求的对象。
|
||||
|
||||
看下面的例子,这里我们创建了一个模块,它会返回给我们 `ConnectivityManager`,所以我们要把 `Context` 对象传给这个模块的构造器。
|
||||
|
||||
@ -122,11 +122,11 @@ public class ApplicationModule {
|
||||
}
|
||||
```
|
||||
|
||||
>Dagger 中十分有意思的一点是只用在一个方法前面添加一个 Singleton 注解,就能处理所有从 Java 中继承过来的问题。
|
||||
> Dagger 中十分有意思的一点是简单地注解一个方法来提供一个单例(Singleton),就能处理所有从 Java 中继承过来的问题。
|
||||
|
||||
### 容器
|
||||
### 组件
|
||||
|
||||
当我们有一个模块的时候,我们需要告诉 Dagger 想把依赖注入到哪里:我们在一个容器里,一个特殊的注解过的接口里完成依赖注入。我们在这个接口里创造不同的方法,而接口的参数是我们想注入依赖关系的类。
|
||||
当我们有一个模块的时候,我们需要告诉 Dagger 想把依赖注入到哪里:我们在一个组件(Component)里完成依赖注入,这是一个我们特别创建的特殊注解接口。我们在这个接口里创造不同的方法,而接口的参数是我们想注入依赖关系的类。
|
||||
|
||||
下面给出一个例子并告诉 Dagger 我们想要 `MainActivity` 类能够接受 `ConnectivityManager`(或者在图表里的其它依赖对象)。我们只要做类似以下的事:
|
||||
|
||||
@ -139,15 +139,15 @@ public interface ApplicationComponent {
|
||||
}
|
||||
```
|
||||
|
||||
>正如我们所见,@Component 注解有几个参数,一个是所支持的模块的数组,意味着它能提供的依赖。这里既可以是 Context 也可以是 ConnectivityManager,因为他们在 ApplicationModule 类中有声明。
|
||||
> 正如我们所见,@Component 注解有几个参数,一个是所支持的模块的数组,代表它能提供的依赖。这里既可以是 `Context` 也可以是 `ConnectivityManager`,因为它们在 `ApplicationModule` 类中有声明。
|
||||
|
||||
### 使用
|
||||
### 用法
|
||||
|
||||
这时,我们要做的是尽快创建容器(比如在应用的 onCreate 方法里面)并且返回这个容器,那么类就能用它来注入依赖了:
|
||||
这时,我们要做的是尽快创建组件(比如在应用的 `onCreate` 阶段)并返回它,那么类就能用它来注入依赖了:
|
||||
|
||||
>为了让框架自动生成 DaggerApplicationComponent,我们需要构建项目以便 Dagger 能够扫描我们的代码库,并且生成我们需要的部分。
|
||||
> 为了让框架自动生成 `DaggerApplicationComponent`,我们需要构建项目以便 Dagger 能够扫描我们的代码,并生成我们需要的部分。
|
||||
|
||||
在 `MainActivity` 里,我们要做的两件事是用 `@Inject` 注解符对想要注入的属性进行注释,调用我们在 `ApplicationComponent` 接口中声明的方法(请注意后面一部分会因我们使用的注入类型的不同而变化,但这里简单起见我们不去管它),然后依赖就被注入了,我们就能自由使用他们:
|
||||
在 `MainActivity` 里,我们要做的两件事是用 `@Inject` 注解符对想要注入的属性进行注解,调用我们在 `ApplicationComponent` 接口中声明的方法(请注意后面一部分会因我们使用的注入类型的不同而变化,但这里简单起见我们不去管它),然后依赖就被注入了,我们就能自由使用他们:
|
||||
|
||||
```
|
||||
public class MainActivity extends AppCompatActivity {
|
||||
@ -164,7 +164,7 @@ public class MainActivity extends AppCompatActivity {
|
||||
|
||||
### 总结
|
||||
|
||||
当然了,我们可以手动注入依赖,管理所有不同的对象,但 Dagger 打消了很多有关模板的“噪声”,Dagger 给我们有用的附加品(比如 `Singleton`),而仅用 Java 处理将会很糟糕。
|
||||
当然了,我们可以手动注入依赖,管理所有不同的对象,但 Dagger 消除了很多比如模板这样的“噪声”,给我们提供有用的附加品(比如 `Singleton`),而仅用 Java 处理将会很糟糕。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
@ -172,7 +172,7 @@ via: https://medium.com/di-101/di-101-part-1-81896c2858a0#.3hg0jj14o
|
||||
|
||||
作者:[Roberto Orgiu][a]
|
||||
译者:[GitFuture](https://github.com/GitFuture)
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -0,0 +1,179 @@
|
||||
用带有 Amazon Cognito Identity SDK 的 webpack 打包 JavaScript
|
||||
=====
|
||||
|
||||
这篇文章针对开发和部署基于 JavaScript 的应用(服务器端的 Node.js 或者客户端)的各种经验水平的开发者,通过本文,你将看到如何把 AWS SDK, Amazon Cognito Identity SDK 嵌入到 JavaScript 中,以及如何使用流行的 [webpack][1] 模块打包器。
|
||||
|
||||
2016 年 7 月, AWS [推出了 Amazon Cognito 用户库(user pool)][2],这个新特性极大的方便了开发者在移动和 Web 应用程序上添加注册和登录功能。为了让开发者更容易在自己的应用程序中实现用户库功能,我们也发布了[用于 JavaScript 的 Amazon Cognito Identity SDK][3]。
|
||||
|
||||
Amazon Cognito 用户库可以让你在移动和 Web 应用程序上添加用户注册和登录功能更加容易。全托管用户库可以扩展到数以百万计的用户,你可以在每个 AWS 账户下有多重目录。创建一个用户库只需要几分钟的时间,并且你可以决定当一个新用户在你的应用程序或服务上注册时哪些属性(包括地址、邮箱、电话号码以及自定义属性)是强制的,哪些是可选择的。你的应用程序也可以指定所需的密码强度,指定用户需要进行多因素认证(MFA),以及通过电话号码或者邮件地址来验证新用户,从而进一步加强应用程序的安全性。
|
||||
|
||||
如果你是首次接触用于 JavaScript 的 Amazon Cognito Identity SDK,那么请先阅读[这篇 AWS 文章][4]作为开始。
|
||||
|
||||
### 为什么在 JavaScript 上使用 Asset 及模块捆绑的 Amazon Cogtito Identity SDK
|
||||
|
||||
今天,针对移动和桌面的现代 Web 应用程序都能为用户提供安全、快捷、灵敏以及类本地应用的体验。毫无疑问,现代的浏览器功能足够强大,能够肩负起大量可能的功能实现。许多流行的实现很大程度上依赖于 JavaScript 应用程序通过某种形式的 asset 封装和/或模块捆绑进行部署。这使得许多开发人员能够很好的维护自己的 JavaScript 应用程序,并且可以通过使用 script 标签创建一个或多个可以加载到客户端浏览器上的文件。
|
||||
|
||||
关于如何实现打包有许多争鸣,包括 [Grunt][5] 和 [Gulp][6] 这样的 task runner,以及 [Browserity][7] 这样的打包器。然而,一个普遍的共识是, asset 打包不仅可以改善加载时间 - 它可以在确保可测试性和健壮性的前提下使你的应用程序模块化。
|
||||
|
||||
### 使用带有 Amazon Cognito Identity SDK 的 webpack 打包 JavaScript
|
||||
|
||||
我们接到了许多请求,要求我们提供如何在 webpack 环境下整合用于 JavaScript 的 Amazon Cognito Identity SDK 的更多细节。我们特地要求确保 webpack 正确管理一下第三方的依赖包:
|
||||
|
||||
- [用于 BigInteger 计算的 JavaScript BN 库][8](jsbn)
|
||||
- [jsbn 扩展][9]及包含大多数公共 BigInteger 方法的其它 jsbn 方法(jsbn2)
|
||||
- [Stanford JavaScript Crypto 库][10](jscl)
|
||||
|
||||
通过这些例子,可以看到,下面这些 bower 库都被 bower.json 使用
|
||||
|
||||
```
|
||||
"aws-cognito-sdk": "https://raw.githubusercontent.com/aws/amazon-cognito-identity-js/master/dist/aws-cognito-sdk.js",
|
||||
"amazon-cognito-identity": "https://raw.githubusercontent.com/aws/amazon-cognito-identity-js/master/dist/amazon-cognito-identity.min.js",
|
||||
"sjcl": "https://raw.githubusercontent.com/bitwiseshiftleft/sjcl/master/sjcl.js",
|
||||
"jsbn": "https://raw.githubusercontent.com/andyperlitch/jsbn/master/index.js",
|
||||
```
|
||||
|
||||
出于我们前面给出的关于 asset 打包对于开发过程的重要性的原因,除非你的应用程序非常小,否则使用像 webpack 这样的 asset 打包工具几乎总是必须的。当然,还有一个方法是可以通过使用标签简单的处理所有依赖关系。然而,这会污染全局命名空间,而且不能够提供最优的资源管理和加载方式。许多开发者首次使用的是具有标准 babel 加载器的标准 webpack.config.js 文件,像下面展示的这样。
|
||||
|
||||
```
|
||||
{
|
||||
/** test for file ending in js or jsx
|
||||
* exclude node_module and bower_components - we dont want to babel these
|
||||
* use the babel loader
|
||||
* apply the react and es2015 (es6) transformations **/
|
||||
|
||||
test: /\.jsx?$/,
|
||||
exclude: /(node_modules|bower_components)/,
|
||||
loader: 'babel',
|
||||
query: {
|
||||
presets: ['react', 'es2015']
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
需要重点记住的是,这个配置没有考虑一些第三方依赖关系,这些被用于 JavaScript 的 Amazon Cognito Identity SDK 所使用的第三方依赖目前没有使用 [JavaScript 通用模块定义(UMD)][11]。
|
||||
|
||||
UMD 模式试图提供与 [RequireJS][12] 和 [CommonJS][13] 这些当前最流行的脚本加载器的异步模块定义 [AMD] 的基本兼容。
|
||||
|
||||
这是 webpack 所依赖的模式,为了让 webpack 能够工作,我们必须进行一些改变。不做这些改变,你可能会遇到下面这些错误。
|
||||
|
||||
```
|
||||
amazon-cognito-identity.min.js:19 Uncaught ReferenceError: BigInteger is not defined
|
||||
```
|
||||
这样一个错误可能会在调用 AWSCognito.CognitoIdentityServiceProvider.CognitoUser property authenticateUser 的时候出现。在这个错误例子中,我们可以利用 webpack 的 import 和 export 加载器的能力来解决这个错误。
|
||||
|
||||
### 使用 webpack 加载器
|
||||
|
||||
根据 [webpack 文档],“加载器允许你通过 require() 或 load 来预处理文件。加载器是一种类似其它构建工具中 “tasks” 的工具,它可以提供一个处理前端构建步骤的强大方法。加载器可以把一个文件从一种语言转化成另一种语言,比如把 CoffeeScript 转化成 JavaScript ,或者把图像转换为 data URL。“
|
||||
|
||||
为了解决 UMD 的兼容性缺乏的问题,你必须依赖两个具体的加载器, import 和 export 加载器。
|
||||
|
||||
#### 使用 export 加载器
|
||||
|
||||
在使用用于 JavaScript 的 Amazon Cognito Identity SDK 的情况下,我们需要确保把 theAWSCognito 变量导出到 require /import 它们的模块的变量范围内(针对 ES6)。
|
||||
|
||||
```
|
||||
{
|
||||
test: /aws-cognito-sdk\/index\.js/,
|
||||
loader: 'exports?AWSCognito'
|
||||
}
|
||||
```
|
||||
|
||||
在由 webpack 创建的捆绑中,使用 export 加载器会有导出模块方法的效果。因此, 在 require 和 import 后,AWSCognito 和 AWS 是可访问的(针对 ES6)。
|
||||
|
||||
```
|
||||
var AWSCognito = require('aws-cognito-sdk')
|
||||
|
||||
/*** EXPORTS from export-loader ***/
|
||||
module.exports = AWSCongito
|
||||
```
|
||||
|
||||
[这儿][18]可以找到更多关于 export 加载器的信息。
|
||||
|
||||
#### 使用 import 加载器
|
||||
|
||||
import 加载器主要用于把变量注入(import)到另一个模块的变量范围内。当第三方模块需要依赖全局变量的时候, import 加载器非常有用,比如针对 JavaScript 的 Amazon Cognito Identity SDK 需要依赖 BigInteger 或者 sjcl 的时候。
|
||||
|
||||
如果你不使用 webpack 加载器,下面这些内容会在一个捆绑中生成。
|
||||
|
||||
```
|
||||
__webpack_require__(431); // refers to jsbin
|
||||
__webpack_require__(432); // refers to sjcl
|
||||
```
|
||||
|
||||
因为 jsbin 和 sjcl 都不能 export 任何东西,因此任何依赖于这些模块的调用都会导致一个错误。
|
||||
|
||||
为了解决这个问题,我们需要使用下面的 webpack 加载器配置:
|
||||
|
||||
```
|
||||
{
|
||||
test: /amazon-cognito-identity\/index\.js/,
|
||||
loader: 'imports?jsbn,BigInteger=>jsbn.BigInteger,sjcl'
|
||||
},
|
||||
{
|
||||
test: /sjcl\/index\.js/,
|
||||
loader: 'imports?sjcl'
|
||||
}
|
||||
```
|
||||
|
||||
这个配置把下面的这些内容嵌入到了由 webpack 创建的捆绑中(此时是 bundle.js)。
|
||||
|
||||
````
|
||||
/*** IMPORTS FROM imports-loader ***/
|
||||
var jsbn = __webpack_require__(431);
|
||||
var BigInteger = jsbn.BigInteger;
|
||||
var sjcl = __webpack_require__(432);
|
||||
```
|
||||
|
||||
结果,jsbn、BigInteger 和 sjcl 都被从它们各自的模块中导入到了用于 JavaScript 的 Amazon Cognito Identity SDK 中。
|
||||
|
||||
有关 import 加载器的更多信息可以在[这儿][15]找到。
|
||||
|
||||
### 下一步
|
||||
|
||||
我们鼓励你下载[用于 JavaScript 的 Amazon Cognito Identity SDK][16] 并开始构建你的应用,并在这篇文章的指导下通过 webpack 能够迅速掌握。
|
||||
|
||||
如果你有任何意见或问题,请在下面自由评论,也可以发邮件到 teichtah@amazon.com 或者在[这儿][17]提出问题。
|
||||
|
||||
### 引用
|
||||
|
||||
这篇文章引用了下面这些第三方资源:
|
||||
|
||||
- webpack - https://webpack.github.io/
|
||||
- webpack 文件 - http://webpack.github.io/docs/what-is-webpack.html
|
||||
- webpack export 加载器 - https://github.com/webpack/exports-loader
|
||||
- webpack import 加载器 - https://github.com/webpack/imports-loader
|
||||
- 用于 BigInteger 计算的 JavaScript BN 库- http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js
|
||||
- jsbns - http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn2.js
|
||||
- Stanford JavaScript Crypto 库 - https://github.com/bitwiseshiftleft/sjcl
|
||||
- RequireJS - http://requirejs.org/
|
||||
- CommonJS - http://www.commonjs.org/
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://mobile.awsblog.com/post/Tx1A84CLMDJ744T/Using-webpack-with-the-Amazon-Cognito-Identity-SDK-for-JavaScript
|
||||
|
||||
作者:[Marc Teichtahl][a]
|
||||
译者:[ucasFL](https://github.com/ucasFL)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://mobile.awsblog.com/blog/author/Marc+Teichtahl
|
||||
[1]: https://webpack.github.io/
|
||||
[2]: https://blogs.aws.amazon.com/security/post/Tx13NVD4AWG9QK9/Amazon-Cognito-Your-User-Pools-is-Now-Generally-Available
|
||||
[3]: https://github.com/aws/amazon-cognito-identity-js
|
||||
[4]: http://mobile.awsblog.com/post/Tx2O14ZY8A5LFHT/Accessing-Your-User-Pools-using-the-Amazon-Cognito-Identity-SDK-for-JavaScript
|
||||
[5]: http://gruntjs.com/
|
||||
[6]: http://gulpjs.com/
|
||||
[7]: http://browserify.org/
|
||||
[8]: http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn.js
|
||||
[9]: http://www-cs-students.stanford.edu/~tjw/jsbn/jsbn2.js
|
||||
[10]: https://github.com/bitwiseshiftleft/sjcl
|
||||
[11]: https://github.com/umdjs/umd
|
||||
[12]: http://requirejs.org/
|
||||
[13]: http://www.commonjs.org/
|
||||
[14]: http://webpack.github.io/docs/what-is-webpack.html
|
||||
[15]: https://github.com/webpack/imports-loader
|
||||
[16]: https://github.com/aws/amazon-cognito-identity-js
|
||||
[17]: https://github.com/aws/amazon-cognito-identity-js/issues
|
||||
[18]: https://github.com/webpack/exports-loader
|
@ -0,0 +1,97 @@
|
||||
监控微服务的五原则
|
||||
====
|
||||
|
||||
![](http://thenewstack.io/wp-content/uploads/2016/09/toppicsysdig.jpg)
|
||||
|
||||
我们对微服务的需求可以归纳为一个词:速度。这种更快提供功能完善且可靠的软件的需求,彻底改变了软件开发模式。毫无疑问,这个改变对软件管理,包括系统监控的方式,都产生了影响。在这篇文章里,我们将重点关注放在有效地监控产品环境中的微服务所需做出的主要改变。我们将为这一新的软件架构拟定 5 条指导性原则来调整你的监控方法。
|
||||
|
||||
监控是微服务控制系统的关键部分,你的软件越复杂,那么你就越难了解其性能及问题排障。鉴于软件交付发生的巨大改变,监控系统同样需要进行彻底的改造,以便在微服务环境下表现更好。下面我们将介绍监控微服务的 5 条原则,如下:
|
||||
|
||||
1. 监控容器及其里面的东西。
|
||||
2. 在服务性能上做监控,而不是容器性能。
|
||||
3. 监控弹性和多地部署的服务。
|
||||
4. 监控 API。
|
||||
5. 将您的监控映射到您的组织结构。
|
||||
|
||||
利用这 5 条原则,你可以在向微服务前进的道路上,建立更有效的对微服务的监控。这些原则,可以让你应对随着微服务而来的技术变化和组织变化。
|
||||
|
||||
### 微服务监控的原则
|
||||
|
||||
#### 1、监控容器及其里面的东西
|
||||
|
||||
容器因构建微服务而凸显其重要性,容器的速度、可移植性和隔离特性让开发者很容易就爱上了微服务模型。容器的好处已经写的够多了,毋庸赘述。
|
||||
|
||||
容器对于其外围的系统来说就像是黑盒子。这对于开发来说大有裨益,从开发环境到生产环境,甚至从开发者的笔记本到云端,为它们带来高度的可移植性。但是当运行起来后,监控和解决服务问题时,这个黑盒子让常规的方法难以奏效了,我们会想:容器里到底在运行着什么?程序和代码运行性能如何?它有什么重要的输出指标吗?从 DevOps 的视角,你需要对容器有更深的了解而不是仅仅知道有一些容器的存在。
|
||||
|
||||
![](http://thenewstack.io/wp-content/uploads/2016/09/greatfordev.jpg)
|
||||
|
||||
非容器环境下衡量的典型做法,是让一个代理程序运行在主机或者虚机上的用户空间里,但这并不适用于容器。因为容器的优点是小,将各种进程分离开来,并尽可能的减少依赖关系。
|
||||
|
||||
而且,从规模上看,成千上万的监测代理,对即使是一个中等大小的部署都是一个昂贵的资源浪费和管理的噩梦。对于容器有两个潜在的解决方案:1)要求你的开发人员直接监控他们的代码,或者2)利用一个通用的内核级的检测方法来查看主机上的所有应用程序和容器活动。这里我们不会深入说明,但每一种方法都有其优点和缺点。
|
||||
|
||||
#### 2、 利用业务流程系统提醒服务性能
|
||||
|
||||
理解容器容器中的运行数据并不容易,一个单一容器相比组成一个功能或服务的容器聚合,测量复杂度要低得多。
|
||||
|
||||
这特别适用于应用程序级别的信息,比如哪个请求拥有最短响应时间,或者哪些 URL 遇到最多的错误,但它同样也适用于架构级别的监测,比如哪个服务的容器使用 CPU 资源超过了事先分配的资源数。
|
||||
|
||||
越来越多的软件部署需要一个<ruby>编排系统<rt> orchestration system</rt></ruby>,将应用程序的逻辑规划转化到物理的容器中。常见的编排系统包括 Kubernetes、Mesosphere DC/OS 和 Docker Swarm。团队可以用一个编排系统来(1)定义微服务(2)理解部署的每个服务的当前状态。你可以认为编排系统甚至比容器还重要。容器是短暂的,只有满足你的服务需求才会存在。
|
||||
|
||||
DevOps 团队应该将告警重点放到运行特征上,以尽可能贴近监控服务的体验。如果应用受到了影响,这些告警是评估事态的第一道防线。但是获得这些告警并不容易,除非你的监控系统是基于原生于容器的。
|
||||
|
||||
<ruby>[原生容器][1]<rt>Container-native</rt></ruby>解决方案利用<ruby>编排元数据<rt>orchestration metadata</rt></ruby>来动态聚合容器和应用程序数据,并按每个服务计算监控度量。根据您的编排工具,您可能想在不同层次进行深入检测。比如,在 Kubernetes 里,你通常有 Namespace、ReplicaSet、Pod 和一些其他容器。聚合这些不同的层,对排除逻辑故障是很有必要的,与构成服务的容器的物理部署无关。
|
||||
|
||||
![](http://thenewstack.io/wp-content/uploads/2016/09/servicemonitoring.jpg)
|
||||
|
||||
#### 3、 监控<ruby>弹性<rt>Elastic</rt></ruby>和<ruby>多地部署<rt>Multi-Location</rt></ruby>的服务
|
||||
|
||||
弹性服务不是一个新概念,但是它在原生容器环境中的变化速度比在虚拟环境中快的多。迅速的变化会严重影响检测系统的正常运行。
|
||||
|
||||
监测传统的系统经常需要根据软件部署,手动调整检查指标。这种调整可以是具体的,如定义要捕获的单个指标,或基于应用程序在一个特定的容器中的操作配置要收集的数据。在小规模上(比如几十个容器)我们可以接受,但是再大规模就难以承受了。微服务的集中监控必须能够自由的随弹性服务而增长和缩减,无需人工干预。
|
||||
|
||||
比如,如果 DevOps 团队必须手动定义容器包含哪个服务需要监控,他们毫无疑问会失手,因为 Kubernetes 或者 Mesos 每天都会定期创建新的容器。同样,如果代码发布并置于生产环境时要求运维团队安装一个<ruby>定制的状态端点<rt>custom stats endpoint</rt></ruby>,也给开发者从 Docker 仓库获取基础镜像带来更多的挑战。
|
||||
|
||||
在生产环境中,建立面向跨越多个数据中心或多个云的复杂部署的监控,比如,如果你的服务跨越私有数据中心和 AWS,那么亚马逊的 AWS CloudWatch 就很难做到这一点。这就要求我们建立一个跨不同地域的监控系统,并可在动态的原生容器环境下运行。
|
||||
|
||||
#### 4、 监控 API
|
||||
|
||||
在微服务环境中,API 接口是通用的。本质上,它们是将服务暴露给其它团队的唯一组件。事实上,API 的响应和一致性可以看作是“内部 SLA”,即使还没有定义一个正式的 SLA(服务等级协议)。
|
||||
|
||||
因此,API 接口的监控也是必要的。API 监控可以有不同的形式,但是很显然它绝对不是简单的二进制上下检查。例如,了解像时间函数这样的最常使用的<ruby>端点<rt>endpoint</rt></ruby>是有价值的。这使得团队可以看到服务使用的变化,无论是由于设计变更或用户的改变。
|
||||
|
||||
你也可以记录服务最缓慢的端点,这些可能揭示出重大的问题,或者至少指向需要在系统中做优化的区域。
|
||||
|
||||
最后,跟踪系统服务响应的能力是另一个很重要的能力,它主要是开发者使用,也能帮助你了解整体用户体验,同时将信息基于底层和应用程序视角分成两大部分。
|
||||
|
||||
#### 5、 将您的监控映射到您的组织结构
|
||||
|
||||
这篇文章着重在微服务和监控上,像其他科技文章一样,这是因为很多人都关注此层面。
|
||||
|
||||
对于那些熟悉<ruby>[康威定律][2]<rt> Conway’s law</rt></ruby>的人来说,系统的设计是基于开发团队的组织结构。创造更快,更敏捷的软件的压力推动了团队去思考重新调整他们的开发组织和管理它的规则。
|
||||
|
||||
![](http://thenewstack.io/wp-content/uploads/2016/09/mapmonitoring.jpg)
|
||||
|
||||
所以,如果他们想从这个新的软件架构(微服务)上获益,他们的团队必须将微服务映射到团队自身中。也就是说,他们需要更小的更松散耦合的团队,可以选择自己的方向只要能够满足整个需求即可。在每一个团队中,对于开发语言的使用,bug 的提交甚至工作职责都会有更大的控制能力。
|
||||
|
||||
DevOps 团队对此可以启用一个监控平台:让每一个微服务团队可以有自己的警报,度量指标,和控制面板,同时也要给出整体系统的视图。
|
||||
|
||||
### 总结
|
||||
|
||||
让微服务流行起来的是快捷。开发组织要想更快的为客户提供更多的功能,然后微服务技术就来了,架构转向微服务并且容器的流行让快捷开发成为可能,所有相关的进程理所当然的搭上了这辆火车。
|
||||
|
||||
最后,基本的监控原则需要适应伴随微服务而来的技术和结构。越早认识到这种转变的开发团队,能更早更容易的适应微服务这一新的架构。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://thenewstack.io/five-principles-monitoring-microservices/
|
||||
|
||||
作者:[Apurva Dave][a] ,[Loris Degioanni][b]
|
||||
译者:[jiajia9linuxer](https://github.com/jiajia9linuxer)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: http://thenewstack.io/author/apurvadave/
|
||||
[b]: http://thenewstack.io/author/lorisdegioanni/
|
||||
[1]:https://techcrunch.com/2016/04/27/lets-define-container-native/
|
||||
[2]:https://en.wikipedia.org/wiki/Conway%27s_law
|
@ -0,0 +1,61 @@
|
||||
|
||||
|
||||
智能机应该舍弃耳机插口吗?以下是我们的观点
|
||||
====
|
||||
|
||||
![](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2016/09/Writers-Opinion-Headphone-Featured.jpg)
|
||||
|
||||
尽管苹果公司将在 iPhone 7 上面取消耳机插口的传言早就有了,但是在上周苹果公司的公告证实了这个消息后,它还是成为了一个热门话题。
|
||||
|
||||
对于那些不知道这个最新消息的人再介绍下,苹果公司已经移除了手机上的耳机接口,改为通过闪电接口插入手机。随手机销售的除了闪电接口耳机外,还有一个适配器,如果人们还想在手机上使用现有的耳机,可以使用它。苹果公司也将出售一款新产品:AirPods。它们被戴入你的耳朵后通过无线和手机连接。舍弃耳机接口的最大的好处是能够让手机保持干燥和防水。
|
||||
|
||||
现在苹果公司将在 iPhone 7 上面取消耳机接口已经是一个重大新闻了,我们询问我们的作者,“你怎么看待智能机取消耳机接口?”
|
||||
|
||||
### 我们的观点
|
||||
|
||||
Derrik 认为“苹果公司的这种取消手机耳机接口的行为是为了推进更多昂贵的不遵循公开标准的外围设备。”他也不想每使用五个小时就不得不给 AirPods 充电。尽管他知道 3.5毫米 的耳机接口逐渐过时,作为一个“音质发烧友”,他喜欢新的,开放的标准,但“盈利性企业的推动”让他担心设备的自由性。
|
||||
|
||||
![](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2016/09/headphone-jacks.jpg)
|
||||
|
||||
Damien 在自从有了蓝牙耳机后的这段日子里基本不怎么使用耳机接口了。总之,他讨厌有线耳机的电线,所以他认为“移除手机耳机接口的做法非常好。”当然他也理解 Derrik 抱怨无线耳机耗尽电源后需要充电会带来不方便,给他一种“没有依靠”的感觉。
|
||||
|
||||
Trevor 直接了当地表明自己认为智能手机移除耳机接口是一种愚蠢的做法,当他了解到 iPhone 7 无法在给手机充电的同时使用耳机后,认为“愚蠢加倍”。他总是使用有线耳机来听音乐或者看视频,从不用蓝牙耳机。因为蓝牙耳机会加速手机电量的消耗,所以他用有线耳机。
|
||||
|
||||
Simon 并不是有线耳机的忠诚用户。他并没有见过太多为了留出更多空间而移除耳机接口的手机产品。他认为“接下来要看顾客是喜欢无线耳机、适配器、防水塞,还是 AirPods,闪电接口或适配器”。他认为不应该这么快就移除智能机的耳机接口,他更喜欢公共的可以适配所有的标准。
|
||||
|
||||
James 认为现在的无线技术已经足够成熟,所以他认为 iPhone 7 移除耳机接口是一个不错的策略,因为这也能够促进苹果公司硬件产品的销量。他碰巧使用过昂贵的有线耳机,所以就个人经历而言“还没有被说服,”他表示自己的 Xperia 智能手机虽然有耳机插口但是防水性也不差。
|
||||
|
||||
Jeffry 指出“几乎全世界所有科技领域的过渡性尝试,都是在无法从这些尝试中受益的人的强烈反对意见中开始的。”他还记得苹果公司因为移除软盘驱动器和不支持 Flash 曾遭到大量的抨击,但现在两者都已经成为行业规范了。他坚信一切都是为了更好的发展而慢慢演变的,智能机移除耳机接口只是“步入未来的一小步”,而苹果公司“足够勇敢来引导未来智能机的一种走向(顺便通过此方式赚点钱)”。
|
||||
|
||||
|
||||
![](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2016/09/Writers-Opinion-Headphone-Headset.jpg)
|
||||
|
||||
Vamsi 并不介意耳机接口的移除,只要“有一个更好的解决方案,适用于使用不同类型耳机和其他的设备的用户”。他不认为通过闪电接口使用耳机是一个不错的解决方案,因为这使得几乎所有的其他耳机废弃。至于蓝牙耳机,他只是不想再使用另外一个设备。此外,他不想争论使用无线耳机可以提高手机的防水性能,因为已经存在不少带有耳机接口的设备防水性能也不错。
|
||||
|
||||
|
||||
Mahesh 更喜欢用带有耳机接口的智能手机,因为他经常在给手机充电的同时听音乐。他认为我们将会在接下来的几个月看到移除耳机接口后给用户带来的诸多不方便之处。
|
||||
|
||||
Derrik 也不赞同“移除开放标准的接口,使用专有连接”。你可能认为可以通过适配器来使耳机连接手机,但是雷电接口可以被随时关闭,苹果公司也能够随时停止这些适配器的销售。他也指出 AirPods 不会取代蓝牙耳机。
|
||||
|
||||
|
||||
![](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2016/09/Writers-Opinion-Headphone-AirPods.jpg)
|
||||
|
||||
至于我,我会在两方面来考虑这个事情:新技术和苹果公司产品的其他方面。自从 iPhone 系列第一款出售以来,我一直都在使用 iPhone 系列手机。但从 2012 年我用 iPhone 5 开始,我没有更换过手机,所以我是有些过时的。我会是第一批买 iPhone 7 的人。我讨厌白色的耳机线在我脸旁,所以我也可能会选择 AirPods。我很欣赏手机防水性能变得更好。至于同时充电和收听的问题,新手机续航时间足够长,所以我不认为这是什么大问题。即使我的旧 iPhone 5 手机,续航时间都可以达到 12 到 20 个小时之间。所以我不认为这是一个问题。
|
||||
|
||||
我们的作者已经给了你很多他们对于智能手机移除耳机接口的看法。你怎么看待这件事?你会想念耳机接口吗?你会从此技术更新中获得乐趣吗?你是会尝试使用 iPhone 5 还是使用 AirPods?让我们在评论区了解你的看法。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.maketecheasier.com/should-smartphones-do-away-with-the-headphone-jack/?utm_medium=feed&utm_source=feedpress.me&utm_campaign=Feed%3A+maketecheasier
|
||||
|
||||
作者:[Laura Tucker][a]
|
||||
译者:[WangYueScream](https://github.com/WangYueScream) [LemonDemo](https://github.com/LemonDemo)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.maketecheasier.com/author/lauratucker/
|
||||
|
||||
|
||||
|
||||
|
@ -0,0 +1,109 @@
|
||||
如何在 Linux 下安装 PyCharm
|
||||
============================================
|
||||
|
||||
![](https://fthmb.tqn.com/ju1u-Ju56vYnXabPbsVRyopd72Q=/768x0/filters:no_upscale()/about/pycharmstart-57e2cb405f9b586c351a4cf7.png)
|
||||
|
||||
### 简介
|
||||
|
||||
Linux 经常被看成是一个远离外部世界,只有极客才会使用的操作系统,但是这是不准确的,如果你想开发软件,那么 Linux 能够为你提供一个非常棒的开发环境。
|
||||
|
||||
刚开始学习编程的新手们经常会问这样一个问题:应该使用哪种语言?当涉及到 Linux 系统的时候,通常的选择是 C、C++、Python、Java、PHP、Perl 和 Ruby On Rails。
|
||||
|
||||
Linux 系统的许多核心程序都是用 C 语言写的,但是如果离开 Linux 系统的世界, C 语言就不如其它语言比如 Java 和 Python 那么常用。
|
||||
|
||||
对于学习编程的人来说, Python 和 Java 都是不错的选择,因为它们是跨平台的,因此,你在 Linux 系统上写的程序在 Windows 系统和 Mac 系统上也能够很好的工作。
|
||||
|
||||
虽然你可以使用任何编辑器来开发 Python 程序,但是如果你使用一个同时包含编辑器和调试器的优秀的集成开发环境(IDE)来进行开发,那么你的编程生涯将会变得更加轻松。
|
||||
|
||||
PyCharm 是由 Jetbrains 公司开发的一个跨平台编辑器。如果你之前是在 Windows 环境下进行开发,那么你会立刻认出 Jetbrains 公司,它就是那个开发了 Resharper 的公司。 Resharper 是一个用于重构代码的优秀产品,它能够指出代码可能存在的问题,自动添加声明,比如当你在使用一个类的时候它会自动为你导入。
|
||||
|
||||
这篇文章将讨论如何在 Linux 系统上获取、安装和运行 PyCharm 。
|
||||
|
||||
### 如何获取 PyCharm
|
||||
|
||||
你可以通过访问[https://www.jetbrains.com/pycharm/][1]获取 PyCharm 。
|
||||
|
||||
屏幕中央有一个很大的 'Download' 按钮。
|
||||
|
||||
你可以选择下载专业版或者社区版。如果你刚刚接触 Python 编程那么推荐下载社区版。然而,如果你打算发展到专业化的编程,那么专业版的一些优秀特性是不容忽视的。
|
||||
|
||||
### 如何安装 PyCharm
|
||||
|
||||
下载好的文件的名称可能类似这种样子 ‘pycharm-professional-2016.2.3.tar.gz’。
|
||||
|
||||
以 “tar.gz” 结尾的文件是被 [gzip][2] 工具压缩过的,并且把文件夹用 [tar][3] 工具归档到了一起。你可以阅读关于[提取 tar.gz 文件][4]指南的更多信息。
|
||||
|
||||
加快速度,为了解压文件,你需要做的是首先打开终端,然后通过下面的命令进入下载文件所在的文件夹:
|
||||
|
||||
```
|
||||
cd ~/Downloads
|
||||
```
|
||||
|
||||
现在,通过运行下面的命令找到你下载的文件的名字:
|
||||
|
||||
```
|
||||
ls pycharm*
|
||||
```
|
||||
|
||||
然后运行下面的命令解压文件:
|
||||
|
||||
```
|
||||
tar -xvzf pycharm-professional-2016.2.3.tar.gz -C ~
|
||||
```
|
||||
|
||||
记得把上面命令中的文件名替换成通过 `ls` 命令获知的 pycharm 文件名。(也就是你下载的文件的名字)。上面的命令将会把 PyCharm 软件安装在 `home` 目录中。
|
||||
|
||||
### 如何运行 PyCharm
|
||||
|
||||
要运行 PyCharm, 首先需要进入 `home` 目录:
|
||||
|
||||
```
|
||||
cd ~
|
||||
```
|
||||
|
||||
运行 `ls` 命令查找文件夹名:
|
||||
|
||||
```
|
||||
ls
|
||||
```
|
||||
|
||||
查找到文件名以后,运行下面的命令进入 PyCharm 目录:
|
||||
|
||||
```
|
||||
cd pycharm-2016.2.3/bin
|
||||
```
|
||||
|
||||
最后,通过运行下面的命令来运行 PyCharm:
|
||||
|
||||
```
|
||||
sh pycharm.sh &
|
||||
```
|
||||
|
||||
如果你是在一个桌面环境比如 GNOME 、 KDE 、 Unity 、 Cinnamon 或者其他现代桌面环境上运行,你也可以通过桌面环境的菜单或者快捷方式来找到 PyCharm 。
|
||||
|
||||
### 总结
|
||||
|
||||
现在, PyCharm 已经安装好了,你可以开始使用它来开发一个桌面应用、 web 应用和各种工具。
|
||||
|
||||
如果你想学习如何使用 Python 编程,那么这里有很好的[学习资源][5]值得一看。里面的文章更多的是关于 Linux 学习,但也有一些资源比如 Pluralsight 和 Udemy 提供了关于 Python 学习的一些很好的教程。
|
||||
|
||||
如果想了解 PyCharm 的更多特性,请点击[这儿][6]来查看。它覆盖了从创建项目到描述用户界面、调试以及代码重构的全部内容。
|
||||
|
||||
-----------------------------------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.lifewire.com/how-to-install-the-pycharm-python-ide-in-linux-4091033
|
||||
|
||||
作者:[Gary Newell][a]
|
||||
译者:[ucasFL](https://github.com/ucasFL)
|
||||
校对:[oska874](https://github.com/oska874)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.lifewire.com/gary-newell-2180098
|
||||
[1]:https://www.jetbrains.com/pycharm/
|
||||
[2]:https://www.lifewire.com/example-uses-of-the-linux-gzip-command-4078675
|
||||
[3]:https://www.lifewire.com/uses-of-linux-command-tar-2201086
|
||||
[4]:https://www.lifewire.com/extract-tar-gz-files-2202057
|
||||
[5]:https://www.lifewire.com/learn-linux-in-structured-manner-4061368
|
||||
[6]:https://www.lifewire.com/pycharm-the-best-linux-python-ide-4091045
|
||||
[7]:https://fthmb.tqn.com/ju1u-Ju56vYnXabPbsVRyopd72Q=/768x0/filters:no_upscale()/about/pycharmstart-57e2cb405f9b586c351a4cf7.png
|
146
published/201612/20160923 PyCharm - The Best Linux Python IDE.md
Normal file
146
published/201612/20160923 PyCharm - The Best Linux Python IDE.md
Normal file
@ -0,0 +1,146 @@
|
||||
PyCharm - Linux 下最好的 Python IDE
|
||||
=========
|
||||
![](https://fthmb.tqn.com/AVEbzYN3BPH_8cGYkPflIx58-XE=/768x0/filters:no_upscale()/about/pycharm2-57e2d5ee5f9b586c352c7493.png)
|
||||
|
||||
### 介绍
|
||||
|
||||
在这篇指南中,我将向你介绍一个集成开发环境 - PyCharm, 你可以在它上面使用 Python 编程语言开发专业应用。
|
||||
|
||||
Python 是一门优秀的编程语言,因为它真正实现了跨平台,用它开发的应用程序在 Windows、Linux 以及 Mac 系统上均可运行,无需重新编译任何代码。
|
||||
|
||||
PyCharm 是由 [Jetbrains][3] 开发的一个编辑器和调试器,[Jetbrains][3] 就是那个开发了 Resharper 的人。不得不说,Resharper 是一个很优秀的工具,它被 Windows 开发者们用来重构代码,同时,它也使得 Windows 开发者们写 .NET 代码更加轻松。[Resharper][2] 的许多原则也被加入到了 [PyCharm][3] 专业版中。
|
||||
|
||||
### 如何安装 PyCharm
|
||||
|
||||
我已经[写了一篇][4]关于如何获取 PyCharm 的指南,下载、解压文件,然后运行。
|
||||
|
||||
### 欢迎界面
|
||||
|
||||
当你第一次运行 PyCharm 或者关闭一个项目的时候,会出现一个屏幕,上面显示一系列近期项目。
|
||||
|
||||
你也会看到下面这些菜单选项:
|
||||
|
||||
* 创建新项目
|
||||
* 打开项目
|
||||
* 从版本控制仓库检出
|
||||
|
||||
还有一个配置设置选项,你可以通过它设置默认 Python 版本或者一些其他设置。
|
||||
|
||||
### 创建一个新项目
|
||||
|
||||
当你选择‘创建一个新项目’以后,它会提供下面这一系列可能的项目类型供你选择:
|
||||
|
||||
* Pure Python
|
||||
* Django
|
||||
* Flask
|
||||
* Google App Engine
|
||||
* Pyramid
|
||||
* Web2Py
|
||||
* Angular CLI
|
||||
* AngularJS
|
||||
* Foundation
|
||||
* HTML5 Bolierplate
|
||||
* React Starter Kit
|
||||
* Twitter Bootstrap
|
||||
* Web Starter Kit
|
||||
|
||||
这不是一个编程教程,所以我没必要说明这些项目类型是什么。如果你想创建一个可以运行在 Windows、Linux 和 Mac 上的简单桌面运行程序,那么你可以选择 Pure Python 项目,然后使用 Qt 库来开发图形应用程序,这样的图形应用程序无论在何种操作系统上运行,看起来都像是原生的,就像是在该系统上开发的一样。
|
||||
|
||||
选择了项目类型以后,你需要输入一个项目名字并且选择一个 Python 版本来进行开发。
|
||||
|
||||
### 打开一个项目
|
||||
|
||||
你可以通过单击‘最近打开的项目’列表中的项目名称来打开一个项目,或者,你也可以单击‘打开’,然后浏览到你想打开的项目所在的文件夹,找到该项目,然后选择‘确定’。
|
||||
|
||||
### 从源码控制进行查看
|
||||
|
||||
PyCharm 提供了从各种在线资源查看项目源码的选项,在线资源包括 [GitHub][5]、[CVS][6]、Git、[Mercurial][7] 以及 [Subversion][8]。
|
||||
|
||||
### PyCharm IDE(集成开发环境)
|
||||
|
||||
PyCharm IDE 中可以打开顶部的菜单,在这个菜单下方你可以看到每个打开的项目的标签。
|
||||
|
||||
屏幕右方是调试选项区,可以单步运行代码。
|
||||
|
||||
左侧面板有项目文件和外部库的列表。
|
||||
|
||||
如果想在项目中新建一个文件,你可以鼠标右击项目的名字,然后选择‘新建’。然后你可以在下面这些文件类型中选择一种添加到项目中:
|
||||
|
||||
* 文件
|
||||
* 目录
|
||||
* Python 包
|
||||
* Python 包
|
||||
* Jupyter 笔记
|
||||
* HTML 文件
|
||||
* Stylesheet
|
||||
* JavaScript
|
||||
* TypeScript
|
||||
* CoffeeScript
|
||||
* Gherkin
|
||||
* 数据源
|
||||
|
||||
当添加了一个文件,比如 Python 文件以后,你可以在右边面板的编辑器中进行编辑。
|
||||
|
||||
文本是全彩色编码的,并且有黑体文本。垂直线显示缩进,从而能够确保缩进正确。
|
||||
|
||||
编辑器具有智能补全功能,这意味着当你输入库名字或可识别命令的时候,你可以按 'Tab' 键补全命令。
|
||||
|
||||
### 调试程序
|
||||
|
||||
你可以利用屏幕右上角的’调试选项’调试程序的任何一个地方。
|
||||
|
||||
如果你是在开发一个图形应用程序,你可以点击‘绿色按钮’来运行程序,你也可以通过 'shift+F10' 快捷键来运行程序。
|
||||
|
||||
为了调试应用程序,你可以点击紧挨着‘绿色按钮’的‘绿色箭头’或者按 ‘shift+F9’ 快捷键。你可以点击一行代码的灰色边缘,从而设置断点,这样当程序运行到这行代码的时候就会停下来。
|
||||
|
||||
你可以按 'F8' 单步向前运行代码,这意味着你只是运行代码但无法进入函数内部,如果要进入函数内部,你可以按 'F7'。如果你想从一个函数中返回到调用函数,你可以按 'shift+F8'。
|
||||
|
||||
调试过程中,你会在屏幕底部看到许多窗口,比如进程和线程列表,以及你正在监视的变量。
|
||||
|
||||
当你运行到一行代码的时候,你可以对这行代码中出现的变量进行监视,这样当变量值改变的时候你能够看到。
|
||||
|
||||
另一个不错的选择是使用覆盖检查器运行代码。在过去这些年里,编程界发生了很大的变化,现在,对于开发人员来说,进行测试驱动开发是很常见的,这样他们可以检查对程序所做的每一个改变,确保不会破坏系统的另一部分。
|
||||
|
||||
覆盖检查器能够很好的帮助你运行程序,执行一些测试,运行结束以后,它会以百分比的形式告诉你测试运行所覆盖的代码有多少。
|
||||
|
||||
还有一个工具可以显示‘类函数’或‘类’的名字,以及一个项目被调用的次数和在一个特定代码片段运行所花费的时间。
|
||||
|
||||
### 代码重构
|
||||
|
||||
PyCharm 一个很强大的特性是代码重构选项。
|
||||
|
||||
当你开始写代码的时候,会在右边缘出现一个小标记。如果你写的代码可能出错或者写的不太好, PyCharm 会标记上一个彩色标记。
|
||||
|
||||
点击彩色标记将会告诉你出现的问题并提供一个解决方法。
|
||||
|
||||
比如,你通过一个导入语句导入了一个库,但没有使用该库中的任何东西,那么不仅这行代码会变成灰色,彩色标记还会告诉你‘该库未使用’。
|
||||
|
||||
对于正确的代码,也可能会出现错误提示,比如在导入语句和函数起始之间只有一个空行。当你创建了一个名称非小写的函数时它也会提示你。
|
||||
|
||||
你不必遵循 PyCharm 的所有规则。这些规则大部分只是好的编码准则,与你的代码是否能够正确运行无关。
|
||||
|
||||
代码菜单还有其它的重构选项。比如,你可以进行代码清理以及检查文件或项目问题。
|
||||
|
||||
### 总结
|
||||
|
||||
PyCharm 是 Linux 系统上开发 Python 代码的一个优秀编辑器,并且有两个可用版本。社区版可供临时开发者使用,专业版则提供了开发者开发专业软件可能需要的所有工具。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.lifewire.com/pycharm-the-best-linux-python-ide-4091045
|
||||
|
||||
作者:[Gary Newell][a]
|
||||
译者:[ucasFL](https://github.com/ucasFL)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.lifewire.com/gary-newell-2180098
|
||||
[1]:https://www.jetbrains.com/
|
||||
[2]:https://www.jetbrains.com/resharper/
|
||||
[3]:https://www.jetbrains.com/pycharm/specials/pycharm/pycharm.html?&gclid=CjwKEAjw34i_BRDH9fbylbDJw1gSJAAvIFqU238G56Bd2sKU9EljVHs1bKKJ8f3nV--Q9knXaifD8xoCRyjw_wcB&gclsrc=aw.ds.ds&dclid=CNOy3qGQoc8CFUJ62wodEywCDg
|
||||
[4]:https://www.lifewire.com/how-to-install-the-pycharm-python-ide-in-linux-4091033
|
||||
[5]:https://github.com/
|
||||
[6]:http://www.linuxhowtos.org/System/cvs_tutorial.htm
|
||||
[7]:https://www.mercurial-scm.org/
|
||||
[8]:https://subversion.apache.org/
|
88
published/201612/20161014 IS OPEN SOURCE DESIGN A THING.md
Normal file
88
published/201612/20161014 IS OPEN SOURCE DESIGN A THING.md
Normal file
@ -0,0 +1,88 @@
|
||||
开源可以用来做设计吗?
|
||||
================
|
||||
|
||||
开源的[超凡和强大][15]毋庸置疑。从服务器到个人电脑桌面、移动设备,甚至到所谓的“物联网”,开源在各个领域遍布全球。然而有一个行业,传统的专有闭源软件解决方案依然占据主导地位,并且通常特别昂贵,这就是设计产业。在这篇文章中,我们会大致描述一些自由及开源的替代软件来抛砖引玉,看是否能代替你现在所用的设计工具集。也许你是一个刚起步的设计师,需要节省开支。也许你的经验十分丰富,只是单纯的想换一个更加“开放”的工作方式。读下去,让我们看看[自由及开源软件][14]世界到底带来了什么!
|
||||
|
||||
### 绘图
|
||||
|
||||
在开源世界,有几个可行且十分强大的工具,代替 Adobe 支持的主流产品。
|
||||
|
||||
#### GIMP
|
||||
|
||||
GIMP, 或者说 <ruby> [GNU 图像处理程序][13]<rt>GNU Image Manipulation Program</rt></ruby> 是一个非常强大的免费开源软件,可替代 Adobe 公司的 PhotoShop 。它由一个相当强大的核心团队开发和维护,为设计创造提供强大的图片编辑工具,比如滤镜、笔刷、修饰。如果你想使用 UX/UI 库设计模型,GIMP 甚至可以处理 .PSD 文件。最后,GIMP 还可以用来做数字艺术、logo 等类似的东西。GIMP 可以免费下载并在 Linux、MacOS 和 Windows 上运行。
|
||||
|
||||
#### Inkscape
|
||||
|
||||
[Inkscape][12] 有一个宣传语,代表着它的核心价值观 —— “Draw Freely”,它是一个开源而自由的产品,可以替代 Adobe 公司的另一产品 —— 强大、专有而且昂贵的矢量程序 Illustrator 。Inkscape 提供了大量的设计和画图工具,易用的颜色拾取导航栏,滤镜和渐变工具,还有很多很多。如果设计师下决心使用开源软件解决方案,你可以在博客和论坛帖子上找到非常好的在线文档。和 GIMP 一样,Inkscape 也可以免费下载并可在 Linux、MacOS 和 Windows 上运行。
|
||||
|
||||
想从经验丰富的图形和网页设计师那里学习更多关于这些开源工具的使用知识?请在 YouTube 网站上找一下这些人:
|
||||
|
||||
* [Nick Saporito][3] (Nick 有很好的资源,介绍 Inkscape 的基本特性,涵盖了图标、网站或者图形设计师日常会使用的基本功能)。
|
||||
* [Irfan Prastinato][2] (Irfan 的亮点是使用 Inkscape 专注于现代图标的创作)。
|
||||
* [Cameron Bohnstedt][1] (Cameron 是一个数字艺术家,由于他很专业并且有丰富的经验,开源工具(GIMP、Inkscape、Blender)的力量被真正的展示了出来。很有感染力,值得一看)。
|
||||
|
||||
### 网页设计与开发
|
||||
|
||||
要设计功能丰富、响应快速的网页和原型时,这里有几个工具 —— 有些是开源的 —— 供设计师选择。这些工具最近几年一直在持续发展,在我看来,这应该是反映出了设计发展的趋势是响应式网站设计要和我们生产的设备变化得一样快。
|
||||
|
||||
#### Bootstrap
|
||||
|
||||
在我看来,[Bootstrap][11] 促进了响应式设计,甚至是“移动为先”的设计实现了跳跃式的突破。Boostrap 最初由 Twitter 开发人员 Mark Otto 和 Jacob Thornton 开发,是一个完全开源、完全可定制的开发框架,利用它你可以制作出满足你的客户需求的网页。有了 Bootstrap 就有了坚实的基础, Bootstrap 4.0 目前正在进行内部测试,在稳定的 3.0 版本的基础上做了大量的底层优化,包括 CSS 预处理器从 Less 换成 Sass,一个增强的网格系统,JavaScript 插件的重构等等。
|
||||
|
||||
#### Gravit
|
||||
|
||||
另一个自由开源的矢量程序 Gravit,它受到越来越多的关注。Gravit 可以在浏览器上运行,不仅是 Adobe Illustrator 在矢量方面的一个切实可行的替代品(尽管功能不是那么丰富),也有望成为一个成熟的设计环境。不论是 logo 设计,还是移动应用、网站,任何东西你都可以拿来会进行设计。自从 Gravit 成为我在浏览器上的可选工具后,我最近一些工作就是靠它完成的,除此之外它还很强大,简洁直观。
|
||||
|
||||
### 一些免费但不开源的解决方案……
|
||||
|
||||
#### Webflow
|
||||
|
||||
[Webflow][9] 是一个强大的全能网页设计环境,可以在浏览器上运行。Webflow 的奇妙之处是设计网页基本不需要写代码,当你设计时,它会在后台自动生成代码。我发现 Webflow 的界面十分干净清爽,非常直观。诚然,Webflow 没有开源,但是免费版支持同时设计和开发两个网页项目。
|
||||
|
||||
#### Froont
|
||||
|
||||
另一个基于浏览器的网页设计程序是 [Froont][8]。和 Webflow 相似, Froont 设计非常直观简洁,而且强大。利用 Froont,在任何相关设备上,你都可以高效地设计一个全新、独一无二的响应式网站。和 Webflow 一样,Froont 还允许设计师在需要的时候导出代码。
|
||||
|
||||
Webflow 和 Froont 除了收费计划外均有免费版,很适于一次设计一个站点,还可以将你的工作成果发布到网上,如果你选择的话。
|
||||
|
||||
### 文本编辑器
|
||||
|
||||
有一些产品供想使用自由开源编辑器的设计师和开发者选择,作为自己平常编写代码工具的替代品。
|
||||
|
||||
#### Atom
|
||||
|
||||
Atom 号称为<ruby>“[面向 21 世纪的黑客专用编辑器][7]”<rt>hackable editor for the 21st Century</rt></ruby>, 它是全功能的编辑器,看起来内置了完成工作所需的所有功能 —— 比如代码自动补全、多功能视图等。它的可玩性很高,用户可以以自己喜欢的方式对 Atom 进行自定义。Atom 有自己的包管理器, 用户可以下载成千上万的软件包进一步定制 Atom,添加独一无二的功能。
|
||||
|
||||
|
||||
### 结论
|
||||
|
||||
当今时代,设计师不要被昂贵臃肿的专有软件所束缚。使用一些自由开源的工具,具有开源意识的设计师有足够多的选择,为他们的客户创造漂亮、实用的设计作品。如果喜欢这篇文章就分享吧,也可以在下面评论你最喜欢的开源的设计工具!
|
||||
|
||||
[分享到 Google+][6][分享到 Twitter][5][分享到 Facebook][4]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://freedompenguin.com/articles/opinion/open-source-design-thing/
|
||||
|
||||
作者:[Sean LeRoy][a]
|
||||
译者:[fuowang](https://github.com/fuowang)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://freedompenguin.com/author/seanleroy/
|
||||
[1]:https://www.youtube.com/channel/UCOfXyFkINXf_e9XNosTJZDw
|
||||
[2]:https://www.youtube.com/user/desainew
|
||||
[3]:https://www.youtube.com/channel/UCEQXp_fcqwPcqrzNtWJ1w9w
|
||||
[4]:http://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Ffreedompenguin.com%2Farticles%2Fopinion%2Fopen-source-design-thing%2F
|
||||
[5]:http://twitter.com/intent/tweet/?text=Is+Open+Source+Design+a+Thing%3F&url=https%3A%2F%2Ffreedompenguin.com%2Farticles%2Fopinion%2Fopen-source-design-thing%2F
|
||||
[6]:https://plus.google.com/share?url=https%3A%2F%2Ffreedompenguin.com%2Farticles%2Fopinion%2Fopen-source-design-thing%2F
|
||||
[7]:https://atom.io/
|
||||
[8]:http://froont.com/
|
||||
[9]:https://webflow.com/
|
||||
[10]:https://gravit.io/
|
||||
[11]:http://getbootstrap.com/
|
||||
[12]:https://inkscape.org/en/
|
||||
[13]:https://www.gimp.org/
|
||||
[14]:https://en.wikipedia.org/wiki/Free_and_open-source_software
|
||||
[15]:https://medium.com/dawn-capital/why-leverage-the-power-of-open-source-to-build-a-successful-software-business-8aba6f665bc4#.ggmn2ojxp
|
@ -0,0 +1,151 @@
|
||||
WattOS:一个稳如磐石、快如闪电、面向所有人的轻量级 Linux 发行版
|
||||
=============================
|
||||
|
||||
![WattOS](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/wattos-main.png?itok=b7-Z7GK1)
|
||||
|
||||
*Jack Wallen 将介绍一下是什么让 WattOS 这么特别。 [使用许可][81]*
|
||||
|
||||
Linux 领域里的每个人不是听说过就是使用过某个轻量级的 Linux 发行版。大家都知道我们不断追求的是:占用内存少,配置资源要求低,包含一个轻量级的桌面环境(或者窗口管理器),并且提供和其他发行版相似的桌面布局,把赌注押在相同的需求之上。
|
||||
|
||||
这种发行版大多用来工作。有一个可以击垮很多轻量级 Linux 发行版的问题,它们没有真正含有一般用户完成工作需要的工具。结果就是,它们沦落为用来完成特殊任务(像数据恢复、做信息亭等)。
|
||||
|
||||
在某种程度上,WattOS 陷入了同样的困境(它唯一含有的生产力工具是 PDF 阅读器,而且它使用标准的“任务栏/开始菜单”象征桌面)。然而幸运的是,WattOS 通过难以置信的运行速度、稳定性以及内置新立得包管理器弥补了这些缺点;所以,WattOS 可以很容易的成为一个适合所有人的轻量级 Linux 发行版。
|
||||
|
||||
到底是什么让 WattOS 如此特别,让我们一起一探究竟。
|
||||
|
||||
### 内核
|
||||
|
||||
事实上当我发现 WattOS 基于 kernel 4.4 内核时我非常吃惊。升级系统之后,执行 `uname -r` 命令可以看到是 4.4.0-38-generic。鉴于这个发行版的目的是让老旧和运行卡顿的机器重获新生,它和我的 Elementary OS Loki 发行版内置相同版本的内核真是一个可爱的惊喜。这意味着 WattOS 在新旧硬件上都会有良好的工作表现。
|
||||
|
||||
真正的惊喜不止于此,当你去 WattOS 的网站,你会同时发现 32 位和 64 位版本的下载地址(现在大多数新的发行版都倾向于放弃 32 位发行版本)。所以,不仅系统内核对新式硬件提供支持,而且系统发行版本的多种架构也能让那些老式的 32 位机器重获新生。
|
||||
|
||||
### 运行速度
|
||||
|
||||
当安装上 WattOS 的时候,有那么一刻我对它有纯粹的羡慕。WattOS 的运行速度快的令人难以置信。甚至当它的桌面版作为客户机在 VirtualBox 虚拟机平台工作时,运行速度依然远远超过了我的 Elementary OS Loki 桌面发行版。后来我才了解到当时运行的宿主机是 [System76 Leopard][80],配置有水冷装置的 i7 处理器和 16GB 的运行内存。分配给 WattOS 大约 2G 的内存,让它看起来没有什么任务可以拖慢它。WattOS 的运行速度壮观的令人难以诉说,它越来越成熟了。我从没见过火狐浏览器能打开的这么快。
|
||||
|
||||
接下来说说 LibreOffice 应用的启动。由于想测试 LibreOffice 的启动速度,所以我打开了新立得软件包管理器,计划安装这一开源办公软件套件的佼佼者。
|
||||
|
||||
无果。
|
||||
|
||||
安装 LibreOffice 的主要问题是缺少一个依赖软件包 python3-uno,而且无论怎么尝试都无法安装成功。然而,最后我在 [LibreOffice 官方网站][79] 上下载了 deb 格式的软件包。把下载的文件解压之后,`cd` 到 LibreOffice_5.2.2.2_Linux_x86-64_deb/DEBS/ 目录下,最后通过执行 `sudo dpkg -i *.deb` 命令成功的安装好了 LibreOffice。
|
||||
|
||||
LibreOffice 运行的怎么样呢?速度快到要疯了。值得再提的是,我从没见过这个应用能像在 WattOS 上运行的这么快。点击 LibreOffice Writer 的图标,它花费的时间是在 Elementary OS Loki (已经很快了)主机上花费的一半。
|
||||
|
||||
### 桌面
|
||||
|
||||
我个人偏爱于桌面向更加现代化的趋势进行迭代。我是 Ubuntu 的 Unity 桌面,GNOME 3 桌面,以及(特别是) [Elementary OS][78] 的粉丝。所以使用古老风格桌面的主意意味着对我几乎没有吸引力。即便如此,WattOS 在把现代设计风格融入老式设计时做的非常好。举例来说,默认的桌面主题(图 1)。WattOS 的 UI 设计者巧妙设计了桌面主题,所以它没有完全偏离 Windows XP 或者老式 Linux CDE 风格的窗口管理器的设计理念。
|
||||
|
||||
![WattOS](https://www.linux.com/sites/lcom/files/styles/rendered_file/public/wattos_a.png?itok=eavmkVgL)
|
||||
|
||||
*图 1:WattOS 的文件管理器展示了有些现代化的主题 [使用许可][76]*
|
||||
|
||||
关于 WattOS 的桌面(基于 [LXDE][75])的确有一些要说的但以前从来没说过,就是每个拥有像简洁、直接,有足够灵活度和自定义度这些特点的 Linux 桌面版,对每个使用过 Windows 95 的电脑使用者来说都会很熟悉。
|
||||
|
||||
### 惊喜之处,优点和缺点
|
||||
|
||||
正像每个新的 Linux 桌面版的体验那样,WattOS 有让人惊喜的地方,同时也有优点和缺点。首先,说说优点。
|
||||
|
||||
WattOS 除了绝对的速度(用一个简单的 “WOW” 来评论),还在桌面上固定了一些特别的惊喜(大多数都是预置的应用)。额外的软件中最好的是 [KeePassX][74](一个极少被默认包含在桌面版的应用)。我认为密码管理器应该默认安装在每一个电脑桌面上,值得骄傲的是 WattOS 预装了这个杰出的工具。
|
||||
|
||||
下一个讨论的是预装火狐浏览器。许多轻量级的发行版会预装像 [Surf][73] 或者 [Midori][72] 这样的浏览器。这两个浏览器都不错,但是它们的兼容性经常达不到像谷歌文档这样网站的要求。因为 WattOS 含有成熟的火狐浏览器,你会发现该系统的功能在火狐浏览器兼容的网站上表现的很完美。
|
||||
|
||||
最后,算不上好的意外。正如我已经提到的,在安装 LibreOffice 时马上就有了故障。然而安装像 GIMP 这样的软件就很顺利(所以我认为这是偶然问题)。除了这一个问题,我觉得默认桌面菜单有些混乱。例如,新立得软件包管理器放在个性化菜单里。我更愿在主菜单中突出显示项中看到它,并且加上类似“软件安装”(或任何其他新用户容易理解)的标签。从我的视角来说,个性化菜单项应该用于放置配置该平台各种风格的工具,而不是安装软件的工具。
|
||||
|
||||
除此之外,若想在 WattOS 主攻方向上的找茬的话,特别是你要找一个面对老旧硬件 Linux 发行版时,你会发现这非常困难。
|
||||
|
||||
### 结论
|
||||
|
||||
尽管 WattOS 主要为老旧硬件设计,但你完全可以把它运行在现代桌面电脑上,并且会运行的很好。根据零学习曲线,你很快就会熟悉 WattOS,并发现它运行极快而且稳定。试试这个小排量的 Linux 发行版吧,相信它会给你同样深刻的印象。如果你发现 WattOS 运行的不够快(发生了一些我没有预料到的事),你完全可以去使用 [Microwatt][71](一个更轻的轻量级发行版)。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.linux.com/learn/wattos-rock-solid-lightning-fast-lightweight-linux-distro-all
|
||||
|
||||
作者:[JACK WALLEN][a]
|
||||
译者:[fuowang](https://github.com/fuowang)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://www.linux.com/users/jlwallen
|
||||
[1]:https://www.youtube.com/channel/UCOfXyFkINXf_e9XNosTJZDw
|
||||
[2]:https://www.youtube.com/user/desainew
|
||||
[3]:https://www.youtube.com/channel/UCEQXp_fcqwPcqrzNtWJ1w9w
|
||||
[4]:http://www.facebook.com/sharer/sharer.php?u=https%3A%2F%2Ffreedompenguin.com%2Farticles%2Fopinion%2Fopen-source-design-thing%2F
|
||||
[5]:http://twitter.com/intent/tweet/?text=Is+Open+Source+Design+a+Thing%3F&url=https%3A%2F%2Ffreedompenguin.com%2Farticles%2Fopinion%2Fopen-source-design-thing%2F
|
||||
[6]:https://plus.google.com/share?url=https%3A%2F%2Ffreedompenguin.com%2Farticles%2Fopinion%2Fopen-source-design-thing%2F
|
||||
[7]:https://atom.io/
|
||||
[8]:http://froont.com/
|
||||
[9]:https://webflow.com/
|
||||
[10]:https://gravit.io/
|
||||
[11]:http://getbootstrap.com/
|
||||
[12]:https://inkscape.org/en/
|
||||
[13]:https://www.gimp.org/
|
||||
[14]:https://en.wikipedia.org/wiki/Free_and_open-source_software
|
||||
[15]:https://medium.com/dawn-capital/why-leverage-the-power-of-open-source-to-build-a-successful-software-business-8aba6f665bc4#.ggmn2ojxp
|
||||
[16]:https://github.com/majutsushi/tagbar
|
||||
[17]:http://ctags.sourceforge.net/
|
||||
[18]:https://github.com/majutsushi/tagbar/zipball/70fix
|
||||
[19]:https://raw.githubusercontent.com/tpope/vim-pathogen/master/autoload/pathogen.vim
|
||||
[20]:http://www.vim.org/scripts/script.php?script_id=2332
|
||||
[21]:https://www.howtoforge.com/tutorial/vim-editor-plugins-for-software-developers-2-syntastic/
|
||||
[22]:https://www.howtoforge.com/images/vim-editor-plugins-for-software-developers/big/vimplugins-delimitmate-help.png
|
||||
[23]:https://github.com/Raimondi/delimitMate
|
||||
[24]:https://www.howtoforge.com/images/vim-editor-plugins-for-software-developers/big/vimplugins-tagbar-visibility.png
|
||||
[25]:https://www.howtoforge.com/images/vim-editor-plugins-for-software-developers/big/vimplugins-tagbar-ex2.png
|
||||
[26]:https://www.howtoforge.com/images/vim-editor-plugins-for-software-developers/big/vimplugins-tagbar-example.png
|
||||
[27]:http://www.tldp.org/LDP/intro-linux/html/sect_06_02.html
|
||||
[28]:http://majutsushi.github.io/tagbar/
|
||||
[29]:http://vi.stackexchange.com/questions/388/what-is-the-difference-between-the-vim-plugin-managers
|
||||
[30]:https://www.howtoforge.com/images/vim-editor-plugins-for-software-developers/big/vimplugins-vimrc.png
|
||||
[31]:http://www.vim.org/
|
||||
[32]:https://github.com/scrooloose/syntastic
|
||||
[33]:https://github.com/scrooloose/syntastic/blob/master/doc/syntastic.txt
|
||||
[34]:https://www.howtoforge.com/images/3337/big/syntastic-error-all-descr.png
|
||||
[35]:https://www.howtoforge.com/images/3337/big/syntastic-error-descr.png
|
||||
[36]:https://www.howtoforge.com/images/3337/big/syntastic-error-highlight.png
|
||||
[37]:https://github.com/scrooloose/syntastic
|
||||
[38]:http://www.vim.org/
|
||||
[39]:https://www.howtoforge.com/tutorial/vim-editor-plugins-for-software-developers/
|
||||
[40]:https://en.wikipedia.org/wiki/Trim_%28computing%29
|
||||
[41]:https://en.wikipedia.org/wiki/Sudo
|
||||
[42]:http://snapcraft.io/
|
||||
[43]:http://flatpak.org/
|
||||
[44]:https://en.wikipedia.org/wiki/Wine_%28software%29
|
||||
[45]:https://en.wikipedia.org/wiki/Live_CD
|
||||
[46]:http://distrowatch.com/
|
||||
[47]:http://www.internetnews.com/skerner/2009/10/white-house-goes-open-source-w.html
|
||||
[48]:https://www.whitehouse.gov/blog/2016/10/13/removing-barriers-constituent-conversations
|
||||
[49]:http://planetwatt.com/new/index.php/2016/09/23/microwatt-r10-released/
|
||||
[50]:http://midori-browser.org/
|
||||
[51]:http://surf.suckless.org/
|
||||
[52]:https://www.keepassx.org/
|
||||
[53]:http://lxde.org/
|
||||
[54]:https://www.linux.com/licenses/category/used-permission
|
||||
[55]:https://www.linux.com/files/images/wattosapng
|
||||
[56]:https://elementary.io/
|
||||
[57]:https://www.libreoffice.org/
|
||||
[58]:https://system76.com/desktops/leopard
|
||||
[59]:https://www.linux.com/licenses/category/used-permission
|
||||
[60]:http://planetwatt.com/new/index.php/2016/09/23/microwatt-r10-released/
|
||||
[61]:http://midori-browser.org/
|
||||
[62]:http://surf.suckless.org/
|
||||
[63]:https://www.keepassx.org/
|
||||
[64]:http://lxde.org/
|
||||
[65]:https://www.linux.com/licenses/category/used-permission
|
||||
[66]:https://www.linux.com/files/images/wattosapng
|
||||
[67]:https://elementary.io/
|
||||
[68]:https://www.libreoffice.org/
|
||||
[69]:https://system76.com/desktops/leopard
|
||||
[70]:https://www.linux.com/licenses/category/used-permission
|
||||
[71]:http://planetwatt.com/new/index.php/2016/09/23/microwatt-r10-released/
|
||||
[72]:http://midori-browser.org/
|
||||
[73]:http://surf.suckless.org/
|
||||
[74]:https://www.keepassx.org/
|
||||
[75]:http://lxde.org/
|
||||
[76]:https://www.linux.com/licenses/category/used-permission
|
||||
[77]:https://www.linux.com/files/images/wattosapng
|
||||
[78]:https://elementary.io/
|
||||
[79]:https://www.libreoffice.org/
|
||||
[80]:https://system76.com/desktops/leopard
|
||||
[81]:https://www.linux.com/licenses/category/used-permission
|
@ -0,0 +1,78 @@
|
||||
怎样在 Android 上手动备份你的短信/彩信?
|
||||
============================================================
|
||||
|
||||
![Android backup sms](https://iwf1.com/wordpress/wp-content/uploads/2016/10/Android-backup-sms-mms.jpg)
|
||||
|
||||
如果你要换一部手机或升级你的系统,备份你的数据就变得至关重要。我们存储重要数据的位置之一就是我们的短信/彩信,不管是感情价值还是实用价值,备份它们是很有用的。
|
||||
|
||||
然而,不像照片、视频或音频文件可以相对容易地传输和备份,备份短信/彩信比较复杂,通常需要使用第三方 app 或服务。
|
||||
|
||||
### 为什么要手动备份
|
||||
|
||||
尽管现在有很多不同的 app 能够帮你备份短信/彩信,你可能因为以下原因,考虑自己动手备份它们:
|
||||
|
||||
1. app **可能不能**在所有的设备和安卓版本上都工作。
|
||||
2. app 可能把你的备份数据上传到云端, 有**破坏你的内容安全**的风险。
|
||||
3. 通过手动备份,你可以完全掌握你的数据通过哪里,走向哪里,备份过程中减少被间谍软件窥视的危险。
|
||||
4. 手动备份相比其他方法**更省时,更省力,更直接**。
|
||||
|
||||
### 怎么手动备份短信/彩信?
|
||||
|
||||
要手动备份你的短信/彩信,你需要在你的电脑上安装一个叫做 [adb][1] 的安卓工具。
|
||||
|
||||
现在,需要重点知道的是,安卓把短信/彩信通常存储在一个叫做 `mmssms.db` 的数据库里。
|
||||
|
||||
因为在不同设备上这个数据库的位置可能不相同,而且,其他短信 app 会创建它们自己的数据库,比如 GO SMS 会创建 `gommssms.db` 数据库, 所以你需要做的第一件事是搜索这些数据库。
|
||||
|
||||
打开命令行工具(我使用了 Linux Terminal, 你也可以使用 Windows CMD 或 PowerShell )并运行以下命令:
|
||||
|
||||
注意: 以下是完成该任务的一系列命令,再后面是每个命令用途的解释。
|
||||
|
||||
```
|
||||
adb root
|
||||
adb shell
|
||||
find / -name "*mmssms*"
|
||||
exit
|
||||
|
||||
adb pull /PATH/TO/mmssms.db /PATH/TO/DESTINATION/FOLDER
|
||||
|
||||
```
|
||||
|
||||
#### 解释
|
||||
|
||||
一开始我们使用 `adb root` 命令来以 root 模式启动 adb - 这样我们就有了读取系统保护文件的权限。
|
||||
|
||||
`adb shell` 用来进入设备的 shell。
|
||||
|
||||
然后, `find` 命令用来搜索数据库。(在我的例子中,我发现数据库在 `/data/data/com.android.providers.telephony/databases/mmssms.db`)
|
||||
|
||||
建议:如果你的终端输出了太多无关的结果,可以试试使用 `find` 的参数来精简结果。(具体参数可以搜索引擎查下)
|
||||
|
||||
[
|
||||
![Android SMS&MMS databases](http://iwf1.com/wordpress/wp-content/uploads/2016/10/Android-SMSMMS-databases-730x726.jpg)
|
||||
][2]
|
||||
|
||||
*安卓短信/彩信数据库*
|
||||
|
||||
然后我们使用 `exit` 命令回退到我们的本地系统目录。
|
||||
|
||||
最后,使用 `adb pull` 把数据库文件复制到我们电脑的一个文件夹里。
|
||||
|
||||
现在,当你想要还原短信/彩信时,不管是还原到新的设备还是新的系统版本, 只要再次搜索新系统中短信/彩信的具体位置,并用我们备份的数据库替换它即可。
|
||||
|
||||
使用 `adb push` 来替换它,例如:`adb push ~/Downloads/mmssms.db /data/data/com.android.providers.telephony/databases/mmssms.db`
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://iwf1.com/how-to-manually-backup-your-sms-mms-messages-on-android/
|
||||
|
||||
作者:[Liron][a]
|
||||
译者:[willcoderwang](http://wangzk.win)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://iwf1.com/tag/android
|
||||
[1]:http://developer.android.com/tools/help/adb.html
|
||||
[2]:http://iwf1.com/wordpress/wp-content/uploads/2016/10/Android-SMSMMS-databases.jpg
|
@ -1,111 +1,91 @@
|
||||
translating by chao-zhi
|
||||
|
||||
一个日常 Linux 使用者关于 Xubuntu 16.10 的论述 - 一个开始的好选择
|
||||
点评 Xubuntu 16.10:起步的好选择
|
||||
===============
|
||||
|
||||
### 简介
|
||||
|
||||
[![](https://2.bp.blogspot.com/-i4QOIuRjyWA/WAJ9zWbjKeI/AAAAAAAAM1U/-t0-4KB6cFgdyk3LvYbNDNiuC0dB29vRACLcB/s640/live1.png)][36]
|
||||
|
||||
Xubuntu 一直是我最喜欢的发行版。与其他的 Linux 发行版相比,他的外观看起来不那么迷人,它当然也不会预装所有你需要的软件。
|
||||
Xubuntu 一直是我最喜欢的发行版之一。与其它的 Linux 发行版相比,它的外观看起来不那么迷人,它当然也不会把你需要的软件全部预装上。
|
||||
|
||||
Xubuntu 给你的仅仅是一个基础的初始形态.
|
||||
Xubuntu 能够给你的就是一个良好的起点。
|
||||
|
||||
如果你是那种喜欢定制桌面的外观和触感的人,那么 XFCE 绝对是最好的桌面环境。
|
||||
如果你是那种喜欢定制桌面和外观的人,那么 XFCE 绝对是适合于这种的最好的桌面环境。如果你的系统资源不足,或想让桌面漂亮舒服, XFCE 还是一个很棒的选择。
|
||||
|
||||
如果你希望低系统资源占用,或你想让工作又漂亮又丝滑,那么 XFCE 则是一个伟大的选择。
|
||||
Xubuntu 之所以成领先于其它 Linux 发行版,就是因为它默认安装 XFCE 桌面。
|
||||
|
||||
Xubuntu 之所以成为一个优秀的 Linux 发行版,就是因为他默认安装 XFCE 桌面。
|
||||
毫无疑问,在硬件兼容性、易用性、稳定性、易于安装,以及拥有一个大型社区等方面,Ubuntu 是很难被超越的。Xubuntu 是 Ubuntu Linux 发行版的官方流派,因此你可以拥有所有 Ubuntu 的优点,除了用 XFCE 桌面代替 Unity 桌面。
|
||||
|
||||
毫无疑问,当涉及到硬件兼容性、易用性、稳定性、易于安装和拥有一个大型社区,Ubuntu 是很难被超越的。
|
||||
你可以选择性的安装应用到你的发行版上,而不是像其它发行版那样预装了一堆你不需要的应用。Xubuntu 只附带了一些必须的应用,在这么小的核心之外的应用要靠你自己去找并安装。
|
||||
|
||||
Xubuntu 是 Ubuntu Linux 发行版的官方支持的,因此你可以拥有所有 Ubuntu 的优点,除了用 XFCE 桌面代替 Untiy 桌面。
|
||||
|
||||
你可以选择性的安装应用到你的发行版上,而不是像其他发行版那样预装了一堆你不需要的应用。
|
||||
|
||||
Xubuntu 只在小核心中附带了一些必须的应用,直到你找到并安装其他的应用。
|
||||
|
||||
对我来说,以上就是我为什么认为 Xubuntu 是一个极好的发行版的原因。一个简单的初始安装并且任由我将其自定义为我想要的样子。
|
||||
对我来说,以上就是我为什么认为 Xubuntu 是最棒的发行版的原因。从简单的基本安装开始,然后按照你要的去定制就好了。
|
||||
|
||||
### 如何获得 Xubuntu
|
||||
|
||||
你可以在 [http://xubuntu.org/][35] 访问 Xubuntu 的网站。
|
||||
你可以访问 Xubuntu 的官网:[http://xubuntu.org/][35]。
|
||||
|
||||
[![](https://3.bp.blogspot.com/-GnYseQr9r3c/WAKA9R3hHPI/AAAAAAAAM1g/A3rvnr3W3Tk55apwsqmFs8nvr7zAMWnLACLcB/s640/getxubuntu.PNG)][34]
|
||||
|
||||
你可以在这里 [http://xubuntu.org/getxubuntu/][33] 找到下载页。
|
||||
|
||||
它有两个版本,大多数人会选择长期支持版本(LTS),除非你希望每六个月更新一次系统。
|
||||
它有两个版本,大多数人会选择长期支持版本(LTS),除非你希望每六个月更新一次系统。而另一个版本是我今天要讲的,它就是 16.10 版。
|
||||
|
||||
另一个版本是我今天要讲的,它就是 16.10 版。
|
||||
|
||||
你既可以选择一个种子文件来下载,也可以访问他的镜像源下载。
|
||||
你既可以选择一个种子文件来下载 ISO,也可以访问它的镜像源下载。
|
||||
|
||||
[![](https://3.bp.blogspot.com/-VBWH0CJsijM/WAKB3uDPvNI/AAAAAAAAM1k/cpigdxtjMEUQANxb6BF4efS9g7EZDFnZACLcB/s640/mirrorlist.PNG)][32]
|
||||
|
||||
如果你选择在镜像源中下载,你需要点击合适的 ISO 文件。比如 64 位的选择 amd-64.iso 文件,而 32 位的选择 i386.iso。
|
||||
|
||||
有很多教程,可以教你怎么创建一个 Linux 启动 U 盘。
|
||||
有很多教程,可以教你怎么创建一个 Linux 启动 U 盘:
|
||||
|
||||
* [这是 Ubuntu 的教程,同样适用于 Xubuntu][3]
|
||||
* [你也可以试试这款针对 Xubuntu 的教程][2]
|
||||
* [这是一个如何在 Ubuntu 下创建的教程,同样适用于 Xubuntu][3]
|
||||
* [你也可以试试这份针对 Xubuntu 的教程][2]
|
||||
* [或者你也可以试试这个][1]
|
||||
|
||||
如果这些你都觉得太复杂,你可以看看这个
|
||||
|
||||
[从这买一个][31]
|
||||
|
||||
.
|
||||
如果这些你都觉得太复杂,你可以 [从这买一个][31]。
|
||||
|
||||
### 安装
|
||||
|
||||
[![](https://4.bp.blogspot.com/-4GZVmSbI3nw/WAKDyLh8UdI/AAAAAAAAM10/BhSSR0e3GkYC-5fSrjyLmhNKpuQnogbdQCLcB/s320/install1.png)][30]
|
||||
[![](https://4.bp.blogspot.com/-4GZVmSbI3nw/WAKDyLh8UdI/AAAAAAAAM10/BhSSR0e3GkYC-5fSrjyLmhNKpuQnogbdQCLcB/s640/install1.png)][30]
|
||||
|
||||
与 Ubuntu 相比,安装 Xubuntu 相对要直接一点。
|
||||
|
||||
如果你曾经装了一个,那么你可以简单的安装任何一个。
|
||||
像 Ubuntu 其它版本一样,安装 Xubuntu 相当直白。如果你曾经装过一个版本,那么基本上你可以安装任何一个版本。
|
||||
|
||||
开始时选择你的安装语言。
|
||||
|
||||
[![](https://4.bp.blogspot.com/-0YgUIjeTb6I/WAKECFfeOwI/AAAAAAAAM14/lyUO2P7O9WYjLgCS0i-ARAbhnvGho_71ACLcB/s320/install2.png)][29]
|
||||
[![](https://4.bp.blogspot.com/-0YgUIjeTb6I/WAKECFfeOwI/AAAAAAAAM14/lyUO2P7O9WYjLgCS0i-ARAbhnvGho_71ACLcB/s640/install2.png)][29]
|
||||
|
||||
你会被问到,是否需要同时安装更新,和是否要安装第三方软件,包括播放音乐的软件和专有驱动。
|
||||
你会被问到,是否需要同时安装更新,是否要安装第三方软件,包括播放音乐的软件和专有驱动。想要完成这些,你需要联网。
|
||||
|
||||
想要完成这些,你需要联网。
|
||||
再次,这也很直白,我们会在之后再次涉及到这些。
|
||||
|
||||
相比于直接安装,他会在安装好后覆盖安装更新.
|
||||
[![](https://1.bp.blogspot.com/-Pzt6YUVJbGY/WAKEf6QY2-I/AAAAAAAAM18/I41MoEvv_aguUX6Y9HkVLC_QnONpzyCVwCLcB/s640/install3.png)][28]
|
||||
|
||||
[![](https://1.bp.blogspot.com/-Pzt6YUVJbGY/WAKEf6QY2-I/AAAAAAAAM18/I41MoEvv_aguUX6Y9HkVLC_QnONpzyCVwCLcB/s320/install3.png)][28]
|
||||
如果你有一个备用的未分配的磁盘分区和并且安装了 Windows,您将看到可以选择在已有 Windows 的情况下安装 Xubuntu 并设置双启动。
|
||||
|
||||
如果你有一个备用的未分配的磁盘分区和并且安装了 Windows,您将看到可以选择安装 Xubuntu 并设置双启动。
|
||||
您也可以选择安装 Xubuntu 作为唯一的操作系统,还可以选择别的任何你喜欢的分区来安装。
|
||||
|
||||
您还可以选择安装 Xubuntu 作为唯一的操作系统,你也可以选择别的任何你喜欢的分区来安装。
|
||||
|
||||
[![](https://4.bp.blogspot.com/-tcwOutnWJk8/WAKE5kGhPxI/AAAAAAAAM2A/9ZZrZRi6KR4renDxjwbRw8uoRqpAI8NzACLcB/s320/install4.png)][27]
|
||||
[![](https://4.bp.blogspot.com/-tcwOutnWJk8/WAKE5kGhPxI/AAAAAAAAM2A/9ZZrZRi6KR4renDxjwbRw8uoRqpAI8NzACLcB/s640/install4.png)][27]
|
||||
|
||||
下一步是设置你所在的区域以确定你的时区。
|
||||
|
||||
[![](https://4.bp.blogspot.com/-cCNxMeLAE-Y/WAKFQjSZe2I/AAAAAAAAM2I/ZaTKZ8DAzFg-TOfS5BkNdN1-HYlRXweYwCLcB/s320/install5.png)][26]
|
||||
[![](https://4.bp.blogspot.com/-cCNxMeLAE-Y/WAKFQjSZe2I/AAAAAAAAM2I/ZaTKZ8DAzFg-TOfS5BkNdN1-HYlRXweYwCLcB/s640/install5.png)][26]
|
||||
|
||||
接下来两步是选择你的键盘模式,并选择你的语言。
|
||||
接下来两步是选择语言和键盘设置,以确定键盘模式。
|
||||
|
||||
[![](https://3.bp.blogspot.com/-rnLEH6sBp7E/WAKFbgaxakI/AAAAAAAAM2M/-mG3lSxc41EKPQ2BnNbSmLRdgVeyT36jwCLcB/s320/install6.png)][25]
|
||||
[![](https://3.bp.blogspot.com/-rnLEH6sBp7E/WAKFbgaxakI/AAAAAAAAM2M/-mG3lSxc41EKPQ2BnNbSmLRdgVeyT36jwCLcB/s640/install6.png)][25]
|
||||
|
||||
最后还是创建一个初始账户.
|
||||
最后创建一个默认账户,输入你的名字、你计算机的名字、设置用户名和密码。
|
||||
|
||||
输入你的名字,你计算机的名字,设置用户名和密码。
|
||||
|
||||
Xubuntu 将会被安装在你的电脑上了。
|
||||
Xubuntu 将会被安装在你的电脑上了,你可以继续往下看了。
|
||||
|
||||
### 第一印象
|
||||
|
||||
[![](https://1.bp.blogspot.com/-twtmUl3w008/WAKFtvOGMuI/AAAAAAAAM2Q/txM1lfCM7QkzhLDqEqacavmAMMg2DSr0ACLcB/s640/fulldesktop.png)][24]
|
||||
|
||||
Xubuntu 的初始界面只有面板位于蓝色桌面的顶部。通过你桌面上的图标,你可以看到所有可用的设备。
|
||||
Xubuntu 的初始界面只有一个面板位于蓝色桌面的顶部。通过桌面上的图标,你可以看到所有可用的驱动器。
|
||||
|
||||
画面的顶部是个简单的面板。
|
||||
|
||||
面板的左侧角落有一个单独的图标(老鼠的样子),点击它后会出现一个时尚,轻量但功能全面的菜单,它被称为 Whisker(胡须)菜单。
|
||||
面板的左侧角落有一个单独的图标(老鼠的样子),点击它后会出现一个时尚而轻量,但功能全面的菜单,它被称为 Whisker(胡须)菜单。
|
||||
|
||||
在右上角有着通知、电源、蓝牙、网络、音量和时钟的图标。
|
||||
|
||||
@ -113,11 +93,11 @@ Xubuntu 的初始界面只有面板位于蓝色桌面的顶部。通过你桌面
|
||||
|
||||
[![](https://2.bp.blogspot.com/-nEvPMHkpTQ8/WAKG17nVliI/AAAAAAAAM2Y/2K6alEtBWAg9x9GS7hDEoJwprrwOqUQfwCLcB/s640/internet.png)][23]
|
||||
|
||||
你可以通过点击面板上的网络图标来连接互联网。一个无线网络的列表将会出现,你可以选择一个点击进去,并键入密码,就可以连接了。
|
||||
你可以通过点击面板上的网络图标来连接互联网。一个无线网络的列表将会出现,你可以选择一个点击,并键入密码,就可以连接了。
|
||||
|
||||
我是在我的联想 Ideapad Y700 上安装 Xubuntu 的,这个本子还是比较新潮的。但是许多发行版在无线网络连接时都会报错,而我必须使用无线网络工作。
|
||||
我是在我的联想 Ideapad Y700 上安装 Xubuntu 的,这个本子很现代,其上运行的许多发行版在无线网络连接时会有些小问题,我不得不找些规避问题的方法。
|
||||
|
||||
Xubuntu 16.10 工作时却没有出现任何问题。
|
||||
但 Xubuntu 16.10 工作的很好,不需要做任何修改。
|
||||
|
||||
### 驱动
|
||||
|
||||
@ -125,53 +105,53 @@ Xubuntu 16.10 工作时却没有出现任何问题。
|
||||
|
||||
为你的电脑寻找可用的附加驱动是十分必要的。
|
||||
|
||||
虽然作为默认设置的开源驱动是基本够用的,但是如果你有着较好的显卡,并且想获得更好的图形体验,那就十分有必要去寻找专有的驱动。
|
||||
虽然默认的开源驱动是基本够用的,但是如果你有着较好的显卡,并且想获得更好的图形体验,那就十分有必要去寻找专有驱动。
|
||||
|
||||
你可以找到附加驱动的窗口,通过打开它来寻找附加驱动。
|
||||
打开菜单,搜索附加驱动,你可以找到附加驱动设置界面。
|
||||
|
||||
如果你找到了适合你的显卡驱动,但是它显示不工作,那么我还是建议你用默认的图形驱动。
|
||||
如果看到你的显卡驱动,但是它不工作,那么我还是建议你用默认的显卡驱动。
|
||||
|
||||
### 打印
|
||||
|
||||
[![](https://1.bp.blogspot.com/-loH1k_rWYcA/WAKICKT7YUI/AAAAAAAAM2g/01rCedfYovgesf5Cf1RlcwFVfwPwhf2JACLcB/s320/printer.png)][21]
|
||||
[![](https://1.bp.blogspot.com/-loH1k_rWYcA/WAKICKT7YUI/AAAAAAAAM2g/01rCedfYovgesf5Cf1RlcwFVfwPwhf2JACLcB/s640/printer.png)][21]
|
||||
|
||||
我有一个爱普生 WF-2630 无线打印机。 Xubuntu 能够直接找到这台打印机,并安装相关驱动,来进行打印工作。
|
||||
我有一个爱普生 WF-2630 无线打印机。 Xubuntu 能够直接找到这台打印机,并安装相关驱动。
|
||||
|
||||
我试着打印了一张纸,发现它的输出非常合适。
|
||||
我打印了测试页,发现它的输出非常合适。
|
||||
|
||||
### 网络附加存储
|
||||
### 网络存储
|
||||
|
||||
[![](https://4.bp.blogspot.com/-hFDeZKOzZu4/WAKIWilPHoI/AAAAAAAAM2o/GhJBVIDfU0oPgc7Z8cvH4i4gbu_3tlOfgCLcB/s640/wdmycloud.png)][20]
|
||||
|
||||
我有一个 WD MyCloud 存储设备需要通过网络连接上。
|
||||
我有一个跨无线网络连接的 WD MyCloud 存储设备。
|
||||
|
||||
你可以通过默认的文件管理器 Thunar 来访问这个设备。值得注意的是,我在网络设备中找到了 WD MyCloud 设备,但是点击它时显示错误。
|
||||
可以通过默认的文件管理器 Thunar 来访问这个设备。值得注意的是,我在网络设备中找到了 WD MyCloud 设备,但是点击它时显示错误。
|
||||
|
||||
但是我打开 Windows 的网络文件夹时,WD MyCloud 也显示出来了,而且我也能正常的访问文件夹
|
||||
但是我打开 Windows 网络文件夹时,WD MyCloud 也显示出来了,而且我也能正常访问该设备上的文件夹。
|
||||
|
||||
### 软件
|
||||
|
||||
[![](https://1.bp.blogspot.com/-nPqWKUsDVoI/WAKJTxLDxUI/AAAAAAAAM2w/8LoOvhNltV8IQtSoyN_oPWjjKyV1bTMyACLcB/s640/whynotfirefox.png)][19]
|
||||
|
||||
我在文章开始时提到了,Xubuntu 给了一个最小化的应用程序配置,所以几乎所有事情你都可以直接开始。
|
||||
我在文章开始时提到了,Xubuntu 配备了最少的应用集,不过它包含了你开始所需要的所有应用。
|
||||
|
||||
火狐浏览器是它的默认浏览器,Thunderbird 是默认的邮件客户端
|
||||
火狐浏览器是它的默认浏览器,Thunderbird 是默认的邮件客户端。
|
||||
|
||||
[![](https://1.bp.blogspot.com/-Tw2PlooCqVU/WAKJznZu2DI/AAAAAAAAM20/E0RDAQKPxNY6l0TF10s2Yo9ge-LToZFtQCLcB/s640/parole.png)][18]
|
||||
|
||||
你也有一个全套的 Libreoffice 套件和 Parole 媒体播放器。
|
||||
你也有一个全套的 LibreOffice 套件和 Parole 媒体播放器。
|
||||
|
||||
它也有一系列工具,比如图片查看器、计算器、光盘刻录工具,还有一个BT下载器。
|
||||
它也有一系列工具,比如图片查看器、计算器、光盘刻录工具,还有一个 BT 下载器。
|
||||
|
||||
[![](https://2.bp.blogspot.com/-jDTpUNkQLYA/WAKKLPYyIEI/AAAAAAAAM24/0hcjRSnQonIdhnb1Knq1gMu_2i3bWo3ZQCLcB/s640/imageviewer.png)][17]
|
||||
|
||||
我很高兴,现在在大多数发行版上,Abiword 和 Gnumeric 都被忽略掉了,因为他们实在无关紧要。大多数人们最终会安装 Libreoffice 的。
|
||||
我很高兴,现在在大多数发行版上,Abiword 和 Gnumeric 都被忽略掉了,因为它们实在无关紧要。大多数人们最终会安装 Libreoffice 的。
|
||||
|
||||
缺乏专门的音频播放器这点比较奇怪。另外我需要提到的是我通常最终会安装谷歌的 Chrome 浏览器,而不是使用Firefox。
|
||||
|
||||
这章节的第一个图片说明了原因。这张图片里,我试图利用谷歌商店里的东西激起你的兴趣,可惜的是各种版本的 DRM 和其他一些问题导致了视频无法播放。
|
||||
本节的第一个图片说明了原因。这张图片里,我试图观看 Google Play 商店的 “Curb Your Enthusiam” 视频,可惜的是各种 DRM 和其它一些问题导致了视频无法播放。
|
||||
|
||||
当从谷歌网站上下载一个东西都报错了之后,我就不能接受简单的跳过这个问题。如下所示。
|
||||
从谷歌网站上一个简单的下载就可以解决问题。如下所示。
|
||||
|
||||
[![](https://3.bp.blogspot.com/-_aqn8leBcuY/WAKLOAzAhnI/AAAAAAAAM3A/yruGYEG0PHc4WRAqRjeVoYxjhVlHiIfCwCLcB/s640/Screenshot_2016-10-15_17-57-28.png)][16]
|
||||
|
||||
@ -179,49 +159,47 @@ Xubuntu 16.10 工作时却没有出现任何问题。
|
||||
|
||||
[![](https://2.bp.blogspot.com/-6kjAgQV6Oss/WAKLhFbihcI/AAAAAAAAM3E/TLeK0xPexNEaxdzb_NkPn_BDDxOoTR2-gCLcB/s640/software.png)][15]
|
||||
|
||||
在基于 Ubuntu 16.04 版本的发行版上普遍存在的一个主要问题是有些程序无法在图形安装软件中安装。
|
||||
在 Ubuntu 16.04 以后的发行版上普遍存在的一个主要问题是有些程序无法在图形安装软件中安装。
|
||||
|
||||
比如你在软件管理器中找不到 Steam 。
|
||||
比如在软件管理器中找不到 Steam。
|
||||
|
||||
[![](https://3.bp.blogspot.com/-4e1ozcMoijU/WAKL2Gp5C1I/AAAAAAAAM3I/VY7XBvxOLCkiK-UdSvypfQFnrkfCtt3rwCLcB/s640/steamnotinsoftware.png)][14]
|
||||
|
||||
如果你使用命令行输入 “sudo apt-cache search steam” 你会发现软件可以安装。
|
||||
如果你使用命令行输入 `sudo apt-cache search steam` 你会发现有这个软件。
|
||||
|
||||
[![](https://3.bp.blogspot.com/-rzTMI5a6EAE/WAKMFfDi-2I/AAAAAAAAM3Q/1-l612iZmSEYY188kfyzKo5s75nFWSz6ACLcB/s640/steaminaptget.png)][13]
|
||||
|
||||
并不是 只有Steam 被遗漏了,其他软件比如 Skype 同样不能再图形软件管理工具中找到。
|
||||
并不是只有 Steam 被遗漏了,其它软件比如 Skype 同样不能在图形软件管理工具中找到。
|
||||
|
||||
我希望这个问题能够在所有 Ubuntu 发现版中间被解决。
|
||||
我真希望这个问题已经在所有 Ubuntu 发行版中解决了。
|
||||
|
||||
我最近还试用了 Kubuntu 16.04 ,发现他的软件工具完全无用,搜索根本不工作。
|
||||
我最近还试用了 Kubuntu 16.04 ,发现它的叫做 Discover 的软件工具完全无用,搜索根本不工作。
|
||||
|
||||
幸运的是,Xubuntu 上的软件工具可以安装大多数软件包,我利用它搜寻并装上了 Quod Libet 音乐播放器。
|
||||
幸运的是,Xubuntu 上的软件管理器可以安装大多数软件包,我利用它搜寻并装上了 Quod Libet 音乐播放器。
|
||||
|
||||
[![](https://4.bp.blogspot.com/-l_INcXhflac/WAKMqz8mYtI/AAAAAAAAM3U/qBNl5YO8VOEMndpZm5IEMYOGYrih_Q4DQCLcB/s640/quodlibet.png)][12]
|
||||
|
||||
[![](https://1.bp.blogspot.com/-erNT96pq67c/WAKM-331qKI/AAAAAAAAM3Y/jbnf5cZbFxgM9Q543XA3bFDqQ91MkmpJACLcB/s320/music.png)][11]
|
||||
[![](https://1.bp.blogspot.com/-erNT96pq67c/WAKM-331qKI/AAAAAAAAM3Y/jbnf5cZbFxgM9Q543XA3bFDqQ91MkmpJACLcB/s640/music.png)][11]
|
||||
|
||||
顺便说一下,如果你在安装 Xubuntu 时选择了同时安装 MP3 播放器,它也不会出现任何问题。
|
||||
顺便说一下,如果你在安装 Xubuntu 时选择了同时安装解码器,那么 MP3 播放也不会出现任何问题。
|
||||
|
||||
如果你没有同时安装 MP3 播放器,那么你需要打开终端模拟器,安装 Xubuntu 限制的额外包。
|
||||
如果没有安装,那么你需要打开终端模拟器,安装 Xubuntu Restricted Extras 包。
|
||||
|
||||
### 个性化 Xubuntu
|
||||
|
||||
[![](https://1.bp.blogspot.com/-MlFCGvvjSe8/WAKNdG8i6SI/AAAAAAAAM3g/6g7WNJbmZX856kp4ezO56boIWbGLRLMdQCLcB/s320/changewallpaper.png)][10]
|
||||
[![](https://1.bp.blogspot.com/-MlFCGvvjSe8/WAKNdG8i6SI/AAAAAAAAM3g/6g7WNJbmZX856kp4ezO56boIWbGLRLMdQCLcB/s640/changewallpaper.png)][10]
|
||||
|
||||
在这方面你可以做很多事:
|
||||
在这方面你可以做很多事来定制 Xubuntu, [参见这里][9]。
|
||||
|
||||
[个性,Xubuntu 的方法在这][9]。
|
||||
|
||||
Xubuntu 提供一整套壁纸,如上图所示,你要做的第一件事就是选一个好看的壁纸并添加一个像 Dock 的面板和一个能够启动所有你喜欢的软件的启动器。
|
||||
Xubuntu 提供一整套漂亮的壁纸,如上图所示,你要做的第一件事就是选一个好看的壁纸并添加一个 Dock 风格的面板,里面含所有你喜欢的软件的启动器。
|
||||
|
||||
[![](https://2.bp.blogspot.com/-h_HRUcMTYu0/WAKN7J_0BJI/AAAAAAAAM3k/NKy7ybXZCEM23IK0Nkjp-TDo2PQ1ff4bQCLcB/s640/newwallpaper.png)][8]
|
||||
|
||||
Xubuntu 有一个相对较新的特性就是 XFDashboard 。它带来了与 Gnome 类似的 Dash 面板。你可以在上面添加启动器和能够让他快速出现的键盘快捷键。
|
||||
Xubuntu 有一个相对较新的特性就是 XFDashboard 。它带来了与 Gnome 桌面类似的 Dash 面板。你可以在上面添加启动器和能够让应用快速启动的键盘快捷键。
|
||||
|
||||
[![](https://1.bp.blogspot.com/-ZCmwHtAahH0/WAKORXPnNFI/AAAAAAAAM3o/lKR4bnEbi-syQdMp_KoCb8xQAd4WTP5dgCLcB/s640/xfdashboard.png)][7]
|
||||
|
||||
展示了一个快速选择不同工作区和启动应用的好方法。
|
||||
此图展示了一个快速选择不同工作区和启动应用的好方法。
|
||||
|
||||
说老实话,当谈到个性化 Xubuntu 时,有一种世界尽在我掌中的感觉。
|
||||
|
||||
@ -239,31 +217,27 @@ Xubuntu 有一个相对较新的特性就是 XFDashboard 。它带来了与 Gnom
|
||||
|
||||
### 总结
|
||||
|
||||
我并没有经常使用 Xubuntu ,并不是因为我不喜欢它。事实上我是 Xubuntu 的大粉丝,并且我在另一个电脑上有一个它的大量定制版。
|
||||
我不对 Xubuntu 点评更多,并不是因为我不喜欢它。事实上我是 Xubuntu 的大粉丝,并且我在另一个电脑上有一个它的深度定制版。
|
||||
|
||||
我使用电脑时,我希望把事情做到最好,我最恼火的是看到下面这个情况。
|
||||
我使用电脑时,我希望了解发生了什么,没有比看到下面这种情况更让人恼火的了。
|
||||
|
||||
[![](https://1.bp.blogspot.com/-GX3xYYXeTfY/WAKTRbvHv0I/AAAAAAAAM4Q/NzN8PfAOHGouj6z7-TPLyC18e_TXhCukACLcB/s640/IMG_20161015_163354-min.jpg)][4]
|
||||
|
||||
认真的说,为啥会有人认为 windows 适合工作,当他每天看到这个消息 “正在安装(1/285)” ,于是你就失去了一个小时,以便让他进行自我更新。
|
||||
认真的说,为啥会有人认为 windows 适合工作?似乎每隔一就会看到消息 “正在安装(1/285)” ,于是当它自己更新时,你就失去了一个小时。而 Xubuntu(和其它发行版一样)更新不会打断你每天的工作。
|
||||
|
||||
而 Xubuntu(和其他发行版一样)更新不会打断你每天的工作。
|
||||
|
||||
事实是,Xubuntu 真的没有什么改变,它是坚固的,稳定的,它不需要改变(除了软件管理的需要以外)。
|
||||
事实是,Xubuntu 真的没有什么需要改变的,它可靠、稳定、不需要改变什么(除了软件管理器)。
|
||||
|
||||
我非常推荐 Xubuntu。
|
||||
|
||||
我还想说去试一试 Peppermint OS、Linux Mint XFCE 或者 Manjaro XFCE 也是十分值得的.
|
||||
此外,我还得说去试一试 Peppermint OS、Linux Mint XFCE 或者 Manjaro XFCE 也是十分值得的。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.everydaylinuxuser.com/2016/10/an-everyday-linux-user-review-of_15.html
|
||||
|
||||
作者:[Gary Newell][a]
|
||||
|
||||
译者:[chao-zhi](https://github.com/chao-zhi)
|
||||
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -0,0 +1,113 @@
|
||||
Fedora 中使用 Inkscape 起步
|
||||
=============
|
||||
|
||||
![inkscape-gettingstarted](https://cdn.fedoramagazine.org/wp-content/uploads/2016/10/inkscape-gettingstarted-945x400.png)
|
||||
|
||||
Inkscape 是一个流行的、功能齐全、自由而开源的矢量[图形编辑器][3],它已经在 Fedora 官方仓库中。它特别适合创作 [SVG 格式][4]的矢量图形。Inkscape 非常适于创建和操作图片和插图,以及创建图表和用户界面设计。
|
||||
|
||||
[
|
||||
![cyberscoty-landscape-800px](https://cdn.fedoramagazine.org/wp-content/uploads/2016/10/cyberscoty-landscape-800px.png)
|
||||
][5]
|
||||
|
||||
*使用 inkscape 创建的[风车景色][1]的插图*
|
||||
|
||||
[其官方网站的截图页][6]上有一些很好的例子,说明 Inkscape 可以做些什么。<ruby>Fedora 杂志<rt>Fedora Magazine</rt></ruby>上的大多数精选图片也是使用 Inkscape 创建的,包括最近的精选图片:
|
||||
|
||||
[
|
||||
![communty](https://cdn.fedoramagazine.org/wp-content/uploads/2016/09/communty.png)
|
||||
][7]
|
||||
|
||||
*Fedora 杂志最近使用 Inkscape 创建的精选图片*
|
||||
|
||||
### 在 Fedora 上安装 Inkscape
|
||||
|
||||
**Inkscape 已经[在 Fedora 官方仓库中了][8],因此可以非常简单地在 Fedora Workstation 上使用 Software 这个应用来安装它:**
|
||||
|
||||
[
|
||||
![inkscape-gnome-software](https://cdn.fedoramagazine.org/wp-content/uploads/2016/10/inkscape-gnome-software.png)
|
||||
][9]
|
||||
|
||||
另外,如果你习惯用命令行,你可以使用 `dnf` 命令来安装:
|
||||
|
||||
```
|
||||
sudo dnf install inkscape
|
||||
```
|
||||
|
||||
### (开始)深入 Inkscape
|
||||
|
||||
当第一次打开程序时,你会看到一个空白页面,并且有一组不同的工具栏。对于初学者,最重要的三个工具栏是:Toolbar、Tools Control Bar、 Colour Palette(调色板):
|
||||
|
||||
[
|
||||
![inkscape_window](https://cdn.fedoramagazine.org/wp-content/uploads/2016/10/inkscape_window.png)
|
||||
][10]
|
||||
|
||||
**Toolbar**提供了创建绘图的所有基本工具,包括以下工具:
|
||||
|
||||
* 矩形工具:用于绘制矩形和正方形
|
||||
* 星形/多边形(形状)工具
|
||||
* 圆形工具:用于绘制椭圆和圆
|
||||
* 文本工具:用于添加标签和其他文本
|
||||
* 路径工具:用于创建或编辑更复杂或自定义的形状
|
||||
* 选择工具:用于选择图形中的对象
|
||||
|
||||
**Colour Palette** 提供了一种设置当前选定对象的颜色的快速方式。 **Tools Control Bar** 提供了工具栏中当前选定工具的所有设置。每次选择新工具时,Tools Control Bar 会变成该工具的相应设置:
|
||||
|
||||
[
|
||||
![](https://cdn.fedoramagazine.org/wp-content/uploads/2016/10/inkscape-toolscontrolbar.gif)
|
||||
][11]
|
||||
|
||||
### 绘图
|
||||
|
||||
接下来,让我们使用 Inkscape 绘制一个星星。 首先,从 **Toolbar** 中选择星形工具,**然后在主绘图区域上单击并拖动。**
|
||||
|
||||
你可能会注意到你画的星星看起来很像一个三角形。要更改它,请使用 **Tools Control Bar** 中的 **Corners** 选项,再添加几个点。 最后,当你完成后,在星星仍被选中的状态下,从 **Palette**(调色板)中选择一种颜色来改变星星的颜色:
|
||||
|
||||
[
|
||||
![inkscape-drawastar](https://cdn.fedoramagazine.org/wp-content/uploads/2016/10/inkscape-drawastar.gif)
|
||||
][12]
|
||||
|
||||
接下来,可以在 Toolbar 中实验一些其他形状工具,如矩形工具,螺旋工具和圆形工具。通过不同的设置,每个工具都可以创建一些独特的图形。
|
||||
|
||||
### 在绘图中选择并移动对象
|
||||
|
||||
现在你有一堆图形了,你可以使用 Select 工具来移动它们。要使用 Select 工具,首先从工具栏中选择它,然后单击要操作的形状,接着将图形拖动到您想要的位置。
|
||||
|
||||
选择形状后,你还可以使用尺寸句柄调整图形大小。此外,如果你单击所选的图形,尺寸句柄将转变为旋转模式,并允许你旋转图形:
|
||||
|
||||
[
|
||||
![inkscape-movingshapes](https://cdn.fedoramagazine.org/wp-content/uploads/2016/10/inkscape-movingshapes.gif)
|
||||
][13]
|
||||
|
||||
* * *
|
||||
|
||||
Inkscape是一个很棒的软件,它还包含了更多的工具和功能。在本系列的下一篇文章中,我们将介绍更多可用来创建插图和文档的功能和选项。
|
||||
|
||||
-----------------------
|
||||
|
||||
作者简介:Ryan 是一名 Fedora 设计师。他使用 Fedora Workstation 作为他的主要桌面,还有来自 Libre Graphics 世界的最好的工具,尤其是矢量图形编辑器 Inkscape。
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/getting-started-inkscape-fedora/
|
||||
|
||||
作者:[Ryan Lerch][a]
|
||||
译者:[geekpi](https://github.com/geekpi)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://ryanlerch.id.fedoraproject.org/
|
||||
[1]:https://openclipart.org/detail/185885/windmill-in-landscape
|
||||
[2]:https://fedoramagazine.org/getting-started-inkscape-fedora/
|
||||
[3]:https://inkscape.org/
|
||||
[4]:https://en.wikipedia.org/wiki/Scalable_Vector_Graphics
|
||||
[5]:https://cdn.fedoramagazine.org/wp-content/uploads/2016/10/cyberscoty-landscape-800px.png
|
||||
[6]:https://inkscape.org/en/about/screenshots/
|
||||
[7]:https://cdn.fedoramagazine.org/wp-content/uploads/2016/09/communty.png
|
||||
[8]:https://apps.fedoraproject.org/packages/inkscape
|
||||
[9]:https://cdn.fedoramagazine.org/wp-content/uploads/2016/10/inkscape-gnome-software.png
|
||||
[10]:https://cdn.fedoramagazine.org/wp-content/uploads/2016/10/inkscape_window.png
|
||||
[11]:https://cdn.fedoramagazine.org/wp-content/uploads/2016/10/inkscape-toolscontrolbar.gif
|
||||
[12]:https://cdn.fedoramagazine.org/wp-content/uploads/2016/10/inkscape-drawastar.gif
|
||||
[13]:https://cdn.fedoramagazine.org/wp-content/uploads/2016/10/inkscape-movingshapes.gif
|
@ -0,0 +1,101 @@
|
||||
Livepatch —— 免重启给 Ubuntu Linux 内核打关键性安全补丁
|
||||
============================================================
|
||||
|
||||
如果你是一个在企业环境中维护关键性系统的系统管理员,你肯定对以下两件事深有感触:
|
||||
|
||||
1) 很难找个停机时间去给系统安装安全补丁以修复内核或者系统漏洞 。如果你工作的公司或者企业没有适当的安全策略,运营管理可能最终会优先保证系统的运行而不是解决系统漏洞。 此外,内部的官僚作风也可能延迟批准停机时间。我当时就是这样的。
|
||||
|
||||
2) 有时候你确实负担不起停机造成的损失,并且还要做好用别的什么方法减小恶意攻击带来的的风险的准备。
|
||||
|
||||
好消息是 Canonical 公司最近针对 Ubuntu 16.04 (64位版本 / 4.4.x 内核) 发布了 Livepatch 服务,它可以让你不用重启就能给内核打关键性安全补丁。 对,你没看错:使用 Livepatch 你不用重启就能使 Ubuntu 16.04 服务器系统的安全补丁生效。
|
||||
|
||||
### 注册 Ubuntu Livepatch 账号
|
||||
|
||||
要运行 Canonical Livepatch 服务你先要在这里注册一个账号 [https://auth.livepatch.canonical.com/][1],并且表明你是一个普通用户还是企业用户(付费)。 通过使用令牌,所有的 Ubuntu 用户都能将最多 3 台不同的电脑连接到 Livepatch 服务:
|
||||
|
||||
[
|
||||
![Canonical Livepatch Service](http://www.tecmint.com/wp-content/uploads/2016/10/Canonical-Livepatch-Service.png)
|
||||
][2]
|
||||
|
||||
*Canonical Livepatch 服务*
|
||||
|
||||
下一步系统会提示你输入你的 Ubuntu One 凭据,或者你也可以注册一个新账号。如果你选择后者,则需要你确认你的邮件地址才能完成注册:
|
||||
|
||||
[
|
||||
![Ubuntu One Confirmation Mail](http://www.tecmint.com/wp-content/uploads/2016/10/Ubuntu-One-Confirmation-Mail.png)
|
||||
][3]
|
||||
|
||||
*Ubuntu One 确认邮件*
|
||||
|
||||
一旦你点了上面的链接确认了你的邮件地址,你就会回到这个界面:[https://auth.livepatch.canonical.com/][4] 并获取你的 Livepatch 令牌。
|
||||
|
||||
### 获取并使用 Livepatch 令牌
|
||||
|
||||
首先把分配给你账号的这个唯一的令牌复制下来:
|
||||
|
||||
[
|
||||
![Canonical Livepatch Token](http://www.tecmint.com/wp-content/uploads/2016/10/Livepatch-Token.png)
|
||||
][5]
|
||||
|
||||
*Canonical Livepatch 令牌*
|
||||
|
||||
然后打开终端,输入:
|
||||
|
||||
```
|
||||
$ sudo snap install canonical-livepatch
|
||||
```
|
||||
|
||||
上面的命令会安装 livepatch 程序,下面的命令会为你的系统启用它。
|
||||
|
||||
```
|
||||
$ sudo canonical-livepatch enable [YOUR TOKEN HERE]
|
||||
```
|
||||
|
||||
如果后一条的命令提示找不到 `canonical-livepatch` ,检查一下 `/snap/bin` 是否已经添加到你的路径, 或者把你的工作目录切换到 `/snap/bin` 下执行也行。
|
||||
|
||||
```
|
||||
$ sudo ./canonical-livepatch enable [YOUR TOKEN HERE]
|
||||
```
|
||||
|
||||
[
|
||||
![Install Livepatch in Ubuntu](http://www.tecmint.com/wp-content/uploads/2016/10/Install-Livepatch-in-Ubuntu.png)
|
||||
][6]
|
||||
|
||||
*在 Ubuntu 中安装 Livepatch*
|
||||
|
||||
之后,你可能需要检查应用于内核的补丁的描述和状态。幸运的是,这很简单。
|
||||
|
||||
```
|
||||
$ sudo ./canonical-livepatch status --verbose
|
||||
```
|
||||
|
||||
如下图所示:
|
||||
|
||||
[
|
||||
![Check Livepatch Status in Ubuntu](http://www.tecmint.com/wp-content/uploads/2016/10/Check-Livepatch-Status.png)
|
||||
][7]
|
||||
|
||||
*检查补丁安装情况*
|
||||
|
||||
在你的 Ubuntu 服务器上启用了 Livepatch,你就可以在保证系统安全的同时把计划内的外的停机时间降到最低。希望 Canonical 的这个举措会在管理上给你带来便利,甚至更近一步带来提升。
|
||||
|
||||
如果你对这篇文章有什么疑问,欢迎在下面留言,我们会尽快回复。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/livepatch-install-critical-security-patches-to-ubuntu-kernel
|
||||
|
||||
作者:[Gabriel Cánepa][a]
|
||||
译者:[Yinux](https://github.com/Yinux)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/gacanepa/
|
||||
[1]:https://auth.livepatch.canonical.com/
|
||||
[2]:http://www.tecmint.com/wp-content/uploads/2016/10/Canonical-Livepatch-Service.png
|
||||
[3]:http://www.tecmint.com/wp-content/uploads/2016/10/Ubuntu-One-Confirmation-Mail.png
|
||||
[4]:https://auth.livepatch.canonical.com/
|
||||
[5]:http://www.tecmint.com/wp-content/uploads/2016/10/Livepatch-Token.png
|
||||
[6]:http://www.tecmint.com/wp-content/uploads/2016/10/Install-Livepatch-in-Ubuntu.png
|
||||
[7]:http://www.tecmint.com/wp-content/uploads/2016/10/Check-Livepatch-Status.png
|
@ -1,29 +1,29 @@
|
||||
如何在 LINUX 和 WINDOWS 之间共享 STEAM 的游戏文件
|
||||
如何在 Linux 和 Windows 之间共享 Steam 的游戏文件
|
||||
============
|
||||
|
||||
[![如何在 LINUX 和 WINDOWS 之间共享 STEAM 的游戏文件](https://itsfoss.com/wp-content/uploads/2016/10/share-games-linux-windows-steam.jpg)][16]
|
||||
[![如何在 Linux 和 Windows 之间共享 Steam 的游戏文件](https://itsfoss.com/wp-content/uploads/2016/10/share-games-linux-windows-steam.jpg)][16]
|
||||
|
||||
简介:这篇详细的指南将向你展示如何在 Linux 和 Windows 之间共享 Steam 的游戏文件以节省下载的总用时和下载的数据量。
|
||||
简介:这篇详细的指南将向你展示如何在 Linux 和 Windows 之间共享 Steam 的游戏文件以节省下载的总用时和下载的数据量。我们将展示给你它是怎样为我们节约了 83 % 的数据下载量。
|
||||
|
||||
假如你决心成为一名 Linux 平台上的玩家,并且在 [Steam][15] 上拥有同时支持 Linux 和 Windows 平台的游戏,或者基于上面同样的原因,拥有双重启动的系统,则你可以考虑看看这篇文章。
|
||||
假如你决心成为一名 Linux 平台上的玩家,并且在 [Steam][15] 上拥有同时支持 Linux 和 Windows 平台的游戏,或者基于同样的原因,拥有双重启动的系统,则你可以考虑看看这篇文章。
|
||||
|
||||
我们中的许多玩家都拥有双重启动的 Linux 和 Windows。有些人只拥有 Linux 系统,但同时拥有当前还没有被 Linux 平台上的 Steam 支持的游戏。所以我们同时保留这两个系统以便我们可以在忽略平台的前提下玩我们喜爱的游戏。
|
||||
|
||||
幸运的是 [Linux gaming][13] 出现了,越来越多在 Windows 平台上受欢迎的 Steam 游戏在 Linux 平台上的 Steam 中被开发了出来。
|
||||
幸运的是 [Linux 游戏][13]社区应运而生,越来越多在 Windows 平台上受欢迎的 Steam 游戏也发布在 Linux 平台上的 Steam 中。
|
||||
|
||||
我们中的许多人喜欢备份我们的 Steam 游戏,使得我们不再苦苦等待游戏下载完成。这些游戏很大程度上是 Windows 平台下的 Steam 游戏。
|
||||
|
||||
现在,很多游戏也已经登陆了 [Linux 平台上的 Steam][12],例如奇异人生、古墓丽影 2013、中土世界:魔多阴影、幽浮:未知敌人、幽浮 2、与日赛跑、公路救赎、燥热 等等,并且[这份名单一直在增长][11]。甚至还有 [杀出重围:人类分裂][10] 和 [疯狂的麦克斯][9] !!!在一些游戏的 Windows 版发布之后,现在我们不必再等候多年,而只需等待几月左右,便可以听到类似的消息了,这可是大新闻啊!
|
||||
现在,很多游戏也已经登陆了 [Linux 平台上的 Steam][12],例如奇异人生(Life is Strange)、古墓丽影 2013(Tomb Raider 2013)、中土世界:魔多阴影(Shadow of Mordor)、幽浮:未知敌人(XCOM: Enemy Unknown)、幽浮 2、与日赛跑(Race The Sun)、公路救赎(Road Redemption)、燥热(SUPERHOT) 等等,并且[这份名单一直在增长][11]。甚至还有 [杀出重围:人类分裂(Deus Ex: Mankind Divided)][10] 和 [疯狂的麦克斯(Mad Max)][9] !!!在一些游戏的 Windows 版发布之后,现在我们不必再等候多年,而只需等待几月左右,便可以听到类似的消息了,这可是大新闻啊!
|
||||
|
||||
下面的实验性方法将向你展示如何使用你现存的任何平台上游戏文件来在 Steam 上恢复游戏的大部分数据。对于某些游戏,它们在两个平台下有很多相似的文件,利用下面例子中的方法,将减少你在享受这些游戏之前的漫长的等待时间。
|
||||
|
||||
在下面的方法中,我们将一步一步地尝试利用 Steam 自己的备份与恢复或者以手工的方式来达到我们的目的。当涉及到这些方法的时候,我们也将向你展示这两个平台上游戏文件的相同和不同之处,以便你也可以探索并做出你自己的调整。
|
||||
在下面的方法中,我们将一步一步地尝试利用 Steam 自身的备份与恢复功能或者以手工的方式来达到我们的目的。当涉及到这些方法的时候,我们也将向你展示这两个平台上游戏文件的相同和不同之处,以便你也可以探索并做出你自己的调整。
|
||||
|
||||
下面的方法中,我们将使用 Ubuntu 14.04 LTS 和 Windows 10 来执行备份与恢复 Steam 的测试。
|
||||
|
||||
### #1 : Steam 自己的备份与恢复
|
||||
### 1、Steam 自身的备份与恢复
|
||||
|
||||
当我们尝试使用 Windows 平台上 Steam 中《燥热》这个游戏的备份(这些加密文件是 .csd 格式)时,Linux 平台上的 Steam 不能识别这些文件,并重新开始下载整个游戏了!甚至在做了验证性检验后,仍然有很大一部分文件不能被 Steam 识别出来。我们在 Windows 上也做了类似的操作,但结果是一样的!
|
||||
当我们尝试使用 Windows 平台上 Steam 中《燥热(SUPERHOT)》这个游戏的备份(这些加密文件是 .csd 格式)时,Linux 平台上的 Steam 不能识别这些文件,并重新开始下载整个游戏了!甚至在做了验证性检验后,仍然有很大一部分文件不能被 Steam 识别出来。我们在 Windows 上也做了类似的操作,但结果是一样的!
|
||||
|
||||
![steam-restore-failure-from-windows-backup](https://itsfoss.com/wp-content/uploads/2016/10/steam-restore-failure-from-windows-backup.jpeg)
|
||||
|
||||
@ -31,11 +31,11 @@
|
||||
|
||||
现在到了我们用某些手工的方法来共享 Windows 和 Linux 上的 Steam 游戏的时刻了!
|
||||
|
||||
### #2 : 手工方法
|
||||
### 2、手工方法
|
||||
|
||||
首先,让我们先看看 Linux 下这些游戏文件所处的位置(用户目录在 /home 中):
|
||||
|
||||
这是 Linux 平台上 Steam 游戏的默认安装位置。 `.local` 和 `.steam` 目录默认情况下是不可见的,你必须将它们显现出来。我们将推荐拥有一个自定义的 Steam 安装位置以便更容易地处理这些文件。这里 `SUPERHOT.x86_64` 是 Linux 下原生的可执行文件,与 Windows 中的 `.exe` 文件类似。
|
||||
这是 Linux 平台上 Steam 游戏的默认安装位置。 `.local` 和 `.steam` 目录默认情况下是不可见的,你必须将它们显现出来。我们将推荐使用一个自定义的 Steam 安装位置以便更容易地处理这些文件。这里 `SUPERHOT.x86_64` 是 Linux 下原生的可执行文件,与 Windows 中的 `.exe` 文件类似。
|
||||
|
||||
![superhot_data1](https://itsfoss.com/wp-content/uploads/2016/10/superhot_data1-e1477112816241.jpeg)
|
||||
|
||||
@ -43,11 +43,11 @@
|
||||
|
||||
![superhot_data2](https://itsfoss.com/wp-content/uploads/2016/10/superhot_data2.jpeg)
|
||||
|
||||
下面我们来看看这些 `.acf` 格式的文件。“appmanifest_322500.acf”便是那个我们需要的文件。编辑并调整这个文件对 Steam 识别在 “common”这个目录下现存的非加密的原始文件备份大有裨益:
|
||||
下面我们来看看这些 `.acf` 格式的文件。`appmanifest_322500.acf` 便是那个我们需要的文件。编辑并调整这个文件有助于 Steam 识别在 `common` 这个目录下现存的非加密的原始文件备份:
|
||||
|
||||
![steam_linux_manifests](https://itsfoss.com/wp-content/uploads/2016/10/steam_linux_manifests-e1477112765133.jpeg)
|
||||
|
||||
为了确认这个文件的相似性,用编辑器打开这个文件并检查它。我们越多地了解这个文件越好。这个[链接是来自 Steam 论坛上的一个帖子][8],它展示了这个文件的主要意义。它类似于下面这样:
|
||||
为了确认这个文件是一样的,用编辑器打开这个文件并检查它。我们越多地了解这个文件越好。这个[链接是来自 Steam 论坛上的一个帖子][8],它展示了这个文件的主要意义。它类似于下面这样:
|
||||
|
||||
```
|
||||
“AppState”
|
||||
@ -80,7 +80,7 @@
|
||||
|
||||
![superhot-windows-steam](https://itsfoss.com/wp-content/uploads/2016/10/superhot-windows-steam.jpeg)![superhot-windows-steam2](https://itsfoss.com/wp-content/uploads/2016/10/superhot-windows-steam2.jpeg)
|
||||
|
||||
我们复制了 “SUPERHOT”目录和 .acf 格式的文件(这个文件在 Windows 的 Steam 上格式是一样的)。在复制 .acf 文件和游戏目录到 Linux 中 Steam 它们对应的位置时,我们需要确保 Steam 没有在后台运行。
|
||||
我们复制了 `SUPERHOT` 目录和 `.acf` 格式的清单文件(这个文件在 Windows 的 Steam 上格式是一样的)。在复制 `.acf` 文件和游戏目录到 Linux 中 Steam 它们对应的位置时,我们需要确保 Steam 没有在后台运行。
|
||||
|
||||
在转移完成之后,我们运行 Steam 并看到了这个:
|
||||
|
||||
@ -90,14 +90,14 @@
|
||||
|
||||
我们还进行了其他几种尝试:
|
||||
|
||||
* 我们尝试使用 Linux 下原有的清单文件(.acf)和来自 Windows 的手工备份文件,但结果是 Steam 重新开始下载游戏。
|
||||
* 我们看到当我们将 “SUPERHOT_Data” 这个目录中的 “SH_Data” 更换为 Windows 中的对应目录时,同上面的一样,也重新开始下载整个游戏。
|
||||
* 我们尝试使用 Linux 下原有的清单文件(`.acf`)和来自 Windows 的手工备份文件,但结果是 Steam 重新开始下载游戏。
|
||||
* 我们看到当我们将 `SUPERHOT_Data` 这个目录中的 `SH_Data` 更换为 Windows 中的对应目录时,同上面的一样,也重新开始下载整个游戏。
|
||||
|
||||
### 理解清单目录的一个尝试
|
||||
|
||||
清单目录绝对可以被进一步地被编辑和修改以此来改善上面的结果,使得 Steam 检测出尽可能多的文件。
|
||||
|
||||
在 Github 上有一个[项目][7],包含一个可以生成这些清单文件的 python 脚本。任何 Steam 游戏的 AppID 可以从[SteamDB][6] 上获取到。知晓了游戏的 ID 号后,你便可以用你喜爱的编辑器以下面的格式创建你自己的清单文件 appmanifest_<AppID>.acf”。在上面手工方法中,我们可以看到 SUPERHOT 这个游戏的 AppID 是 322500,所以对应的清单文件名应该是 appmanifest_322500.acf。
|
||||
在 Github 上有一个[项目][7],包含一个可以生成这些清单文件的 python 脚本。任何 Steam 游戏的 AppID 可以从[SteamDB][6] 上获取到。知晓了游戏的 ID 号后,你便可以用你喜爱的编辑器以下面的格式创建你自己的清单文件 `appmanifest_<AppID>.acf`。在上面手工方法中,我们可以看到 SUPERHOT 这个游戏的 AppID 是 322500,所以对应的清单文件名应该是 `appmanifest_322500.acf`。
|
||||
|
||||
下面以我们知晓的信息来尝试对该文件进行一些解释:
|
||||
|
||||
@ -139,10 +139,8 @@
|
||||
via: https://itsfoss.com/share-steam-files-linux-windows/
|
||||
|
||||
作者:[Avimanyu Bandyopadhyay][a]
|
||||
|
||||
译者:[FSSlc](https://github.com/FSSlc)
|
||||
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -1,39 +1,46 @@
|
||||
OneNewLife translated
|
||||
|
||||
# Webpack 2 入门
|
||||
Webpack 2 入门
|
||||
==============
|
||||
|
||||
![](https://cdn-images-1.medium.com/max/2000/1*yI44h8Df-l-2LUqvXIi8JQ.png)
|
||||
|
||||
Webpack 2 即将退出测试,[一旦文档完成][26]。不过这不意味着你现在不能开始使用第 2 版,前提是你知道怎么配置它。
|
||||
Webpack 2 [一旦文档完成][26],就将结束 Beta 测试期。不过这并不意味着你现在不能开始使用第 2 版,前提是你知道怎么配置它。
|
||||
|
||||
### Webpack 是什么
|
||||
|
||||
官方的说法是最简单的 —— Webpack 是一个 JavaScript 模块打包器。然而,自从它发布以来,它发展成为了你所有前端代码的管理工具(有意地或社区的意愿)。
|
||||
简单来说,Webpack 是一个 JavaScript 模块打包器。然而,自从它发布以来,它发展成为了你所有的前端代码的管理工具(或许是有意的,或许是社区的意愿)。
|
||||
|
||||
![](https://cdn-images-1.medium.com/max/800/1*yBt2rFj2DbckFliGE0LEyg.png)
|
||||
![](https://cdn-images-1.medium.com/max/800/1*yBt2rFj2DbckFliGE0LEyg.png)
|
||||
|
||||
任务运行器,例如 Gulp,可以处理许多不同的预处理器和转换器,但是在所有的情景下,它都需要一个输入源并将其压缩到一个编译好的输出文件中。然而,它是在个案基础上这样做的,不用担心整个系统。这是开发者的负担:找到任务运行器中断的地方,并找到适当的方式将所有这些模块在生产中联合在一起。
|
||||
*老式的任务运行器的方式:你的标记、样式和 JavaScript 是分离的。你必须分别管理它们每一个,并且你需要确保每一样都达到产品级*
|
||||
|
||||
Webpack 试图通过提出一个大胆的想法来减轻开发者的负担:如果有一部分开发过程可以自动处理依赖关系会怎样?如果我们可以简单地写代码,让构建过程只基于最终需求管理自己会怎样?
|
||||
任务运行器(task runner),例如 Gulp,可以处理许多不同的预处理器(preprocesser)和转换器(transpiler),但是在所有的情景下,它都需要一个输入源并将其压缩到一个编译好的输出文件中。然而,它是在每个部分的基础上这样做的,而没有考虑到整个系统。这就造成了开发者的负担:找到任务运行器所不能处理的地方,并找到适当的方式将所有这些模块在生产环境中联合在一起。
|
||||
|
||||
![](https://cdn-images-1.medium.com/max/800/1*TOFfoH0cXTc8G3Y_F6j3Jg.png)
|
||||
Webpack 试图通过提出一个大胆的想法来减轻开发者的负担:如果有一部分开发过程可以自动处理依赖关系会怎样?如果我们可以简单地写代码,让构建过程最终只根据需求管理自己会怎样?
|
||||
|
||||
如果你过去几年一直是 web 社区的一员,你已经知道解决问题的首选方法:使用 JavaScript 来构建。因此 Webpack 尝试通过 JavaScript 传递依赖关系使构建过程更加容易。不过这个设计真正的亮点不是简单的代码管理部分,而是管理层由 100% 有效的 JavaScript 实现(具有 Nodejs 特性)。Webpack 能够让你写有效的 JavaScript,更好更全面地了解系统。
|
||||
![](https://cdn-images-1.medium.com/max/800/1*TOFfoH0cXTc8G3Y_F6j3Jg.png)
|
||||
|
||||
换句话来说:你不需要为 Webpack 写代码。你只需要写项目代码。而且 Webpack 会持续工作(当然需要一些配置)。
|
||||
*Webpack 的方式:如果 Webpack 了解依赖关系,它会仅捆绑我们在生产环境中实际需要的部分*
|
||||
|
||||
如果你过去几年一直参与 web 社区,你已经知道解决问题的首选方法:使用 JavaScript 来构建。而且 Webpack 尝试通过 JavaScript 传递依赖关系使得构建过程更加容易。不过这个设计真正的亮点不是简化代码管理部分,而是管理层由 100% 有效的 JavaScript 实现(具有 Nodejs 特性)。Webpack 能够让你编写有效的 JavaScript,更好更全面地了解系统。
|
||||
|
||||
换句话来说:你不需要为 Webpack 写代码。你只需要写项目代码。而且 Webpack 就会持续工作(当然需要一些配置)。
|
||||
|
||||
简而言之,如果你曾经遇到过以下任何一种情况:
|
||||
|
||||
* 意外引入一些你不需要在生产中用上的样式表和 JS 库,使项目膨胀
|
||||
* 载入有问题的依赖项
|
||||
* 意外引入一些你不需要在生产中用上的 CSS 样式表和 JS 库,使项目膨胀
|
||||
* 意外的两次载入(或三次)库
|
||||
* 遇到作用域的问题 —— CSS 和 JavaScript 都会有
|
||||
* 找到一个好的构建系统让你在 JavaScript 中使用 Node/Bower 模块,或者依靠一个疯狂的后端配置来正确地使用这些模块
|
||||
* 需要优化资产交付,但担心你会弄坏一些东西
|
||||
* 寻找一个让你在 JavaScript 中使用 Node/Bower 模块的构建系统,要么就得依靠一个令人发狂的后端配置才能正确地使用这些模块
|
||||
* 需要优化资产(asset)交付,但你担心会弄坏一些东西
|
||||
|
||||
那么你可以从 Webpack 中收益了。它通过让 JavaScript 毫不费力地担心你的依赖关系和加载顺序,而不是开发者的大脑。最好的部分是?Webpack 甚至可以纯粹在服务器端运行,这意味着你还可以使用 Webpack 构建[渐进增强][25]的网站。
|
||||
等等……
|
||||
|
||||
那么你可以从 Webpack 中收益了。它通过让 JavaScript 轻松处理你的依赖关系和加载顺序,而不是通过开发者的大脑。最好的部分是,Webpack 甚至可以纯粹在服务器端运行,这意味着你还可以使用 Webpack 构建[渐进增强式][25]网站。
|
||||
|
||||
### 第一步
|
||||
|
||||
我们将在本教程中使用 [Yarn][24](运行命令 `brew install yarn`) 代替 `npm`,不过这完全取决于你,它们做同样的事情。在我们的项目文件夹中,我们将在终端窗口中运行以下代码,将 Webpack 2 添加到我们的全局软件包以及本地项目中:
|
||||
我们将在本教程中使用 [Yarn][24](运行命令 `brew install yarn`) 代替 `npm`,不过这完全取决于你的喜好,它们做同样的事情。在我们的项目文件夹中,我们将在终端窗口中运行以下代码,将 Webpack 2 添加到我们的全局软件包以及本地项目中:
|
||||
|
||||
```
|
||||
yarn global add webpack@2.1.0-beta.25 webpack-dev-server@2.1.0-beta.9
|
||||
@ -59,14 +66,14 @@ module.exports = {
|
||||
};
|
||||
```
|
||||
|
||||
注意:`__dirname` 是指你的项目根目录
|
||||
注意:此处 `__dirname` 是指你的项目根目录
|
||||
|
||||
记住,Webpack “知道”你的项目发生了什么。它通过阅读你的代码来实现(别担心,它签署了一个 NDA 协议)。Webpack 基本上执行以下操作:
|
||||
记住,Webpack “知道”你的项目发生了什么。它通过阅读你的代码来实现(别担心,它签署了保密协议 :D )。Webpack 基本上执行以下操作:
|
||||
|
||||
1. 从 `context` 文件夹开始...
|
||||
2. ...它查找 `entry` 的文件名...
|
||||
3. ...并读取内容。每一个 `import`([ES6][7])或 `require()`(Nodejs)的依赖会在它解析代码的时候找到,它会在最终构建的时候打包这些依赖项。然后,它会搜索那些依赖项以及那些依赖项所依赖的依赖项,直到它到达“树”的最底端 —— 只是打包它所需要的,没有其它东西。
|
||||
4. Webpack 从 `context` 文件夹打包所有东西到 `output.path` 文件夹,使用 `output.filename` 命名模板来为其命名(其中 `[name]` 被替换成来自 `entry` 的对象键)。
|
||||
1. 从 `context` 文件夹开始……
|
||||
2. ……它查找 `entry` 下的文件名……
|
||||
3. ……并读取其内容。每一个 `import`([ES6][7])或 `require()`(Nodejs)的依赖会在它解析代码的时候找到,它会在最终构建的时候打包这些依赖项。然后,它会搜索那些依赖项以及那些依赖项所依赖的依赖项,直到它到达“树”的最底端 —— 只打包它所需要的,没有其它东西。
|
||||
4. Webpack 从 `context` 文件夹打包所有东西到 `output.path` 文件夹,使用 `output.filename` 命名模板来为其命名(其中 `[name]` 被替换成来自 `entry` 的对象的键)。
|
||||
|
||||
所以如果我们的 `src/app.js` 文件看起来像这样(假设我们事先运行了 `yarn add --dev moment`):
|
||||
|
||||
@ -88,16 +95,16 @@ webpack -p
|
||||
|
||||
注意:`p` 标志表示“生产”模式,这会压缩输出文件。
|
||||
|
||||
它会输出一个 `dist/app.bundle.js`,这会将当前日期和时间打印到控制台。要注意 Webpack 会自动识别 `'moment'` 指代什么(虽然如果你有一个 `moment.js` 文件在你的目录,默认情况下 Webpack 会优先考虑你的 `moment` Node 模块)。
|
||||
它会输出一个 `dist/app.bundle.js`,并将当前日期和时间打印到控制台。要注意 Webpack 会自动识别 上面的 `'moment'` 指代的是什么(比如说,虽然如果你有一个 `moment.js` 文件在你的目录,默认情况下 Webpack 会优先考虑你的 `moment` Node 模块)。
|
||||
|
||||
### 使用多个文件
|
||||
|
||||
你可以通过仅仅修改 `entry` 对象来指定任意数量的输入/输出点。
|
||||
你可以通过仅仅修改 `entry` 对象来指定任意数量的入口(entry)/输出点(output)。
|
||||
|
||||
#### 打包多个文件
|
||||
|
||||
```
|
||||
`'use strict';
|
||||
'use strict';
|
||||
|
||||
const webpack = require("webpack");
|
||||
|
||||
@ -110,7 +117,7 @@ module.exports = {
|
||||
path: __dirname + "/dist",
|
||||
filename: "[name].bundle.js",
|
||||
},
|
||||
};`
|
||||
};
|
||||
```
|
||||
|
||||
所有文件都会按照数组的顺序一起被打包成一个 `dist/app.bundle.js` 文件。
|
||||
@ -118,7 +125,7 @@ module.exports = {
|
||||
#### 输出多个文件
|
||||
|
||||
```
|
||||
`const webpack = require("webpack");
|
||||
const webpack = require("webpack");
|
||||
|
||||
module.exports = {
|
||||
context: __dirname + "/src",
|
||||
@ -131,7 +138,7 @@ module.exports = {
|
||||
path: __dirname + "/dist",
|
||||
filename: "[name].bundle.js",
|
||||
},
|
||||
};`
|
||||
};
|
||||
```
|
||||
|
||||
或者,你可以选择打包成多个 JS 文件以便于分割应用的某些模块。这将被打包成 3 个文件:`dist/home.bundle.js`,`dist/events.bundle.js` 和 `dist/contact.bundle.js`。
|
||||
@ -160,7 +167,6 @@ module.exports = {
|
||||
|
||||
### 开发
|
||||
|
||||
Webpack actually has its own development server, so whether you’re developing a static site or are just prototyping your front-end, it’s perfect for either. To get that running, just add a `devServer` object to `webpack.config.js`:
|
||||
Webpack 实际上有自己的开发服务器,所以无论你是开发一个静态网站还是只是你的网站前端原型,它都是无可挑剔的。要运行那个服务器,只需要添加一个 `devServer` 对象到 `webpack.config.js`:
|
||||
|
||||
```
|
||||
@ -186,7 +192,7 @@ module.exports = {
|
||||
<script src="/assets/app.bundle.js"></script>
|
||||
```
|
||||
|
||||
... 在你的终端运行:
|
||||
……在你的终端中运行:
|
||||
|
||||
```
|
||||
webpack-dev-server
|
||||
@ -208,11 +214,11 @@ module.exports = {
|
||||
};
|
||||
```
|
||||
|
||||
这会将你打包好的文件附加到一个 `window.myClassName` 实例。因此,使用该命名空间,你可以调用入口文件的可用方法(可以在[文档][23]中阅读有关此设置的更多信息)。
|
||||
……这会将你打包好的文件附加到一个 `window.myClassName` 实例。因此,使用该命名空间,你可以调用入口文件的可用方法(可以在[该文档][23]中阅读有关此设置的更多信息)。
|
||||
|
||||
### 加载器
|
||||
|
||||
到目前为止,我们所做的一切只涉及 JavaScript。从一开始使用 JavaScript 是重要的,因为它是 Webpack 唯一支持的语言。事实上我们可以处理几乎所有文件类型,只要我们将其转换成 JavaScript。我们用加载器来实现这个功能。
|
||||
到目前为止,我们所做的一切只涉及 JavaScript。从一开始就使用 JavaScript 是重要的,因为它是 Webpack 唯一支持的语言。事实上我们可以处理几乎所有文件类型,只要我们将其转换成 JavaScript。我们用加载器(loader)来实现这个功能。
|
||||
|
||||
加载器可以是 Sass 这样的预处理器,或者是 Babel 这样的转译器。在 NPM 上,它们通常被命名为 `*-loader`,例如 `sass-loader` 和 `babel-loader`。
|
||||
|
||||
@ -250,11 +256,11 @@ module.exports = {
|
||||
|
||||
Webpack 1 的用户注意:加载器的核心概念没有任何改变,但是语法改进了。直到官方文档完成之前,这可能不是确切的首选语法。
|
||||
|
||||
`/\.js$/` 这个正则表达式查找所有以 `.js` 结尾的待通过 Babel 加载的文件。Webpack 依靠正则检查给予你完全的控制权 —— 它不限制你的文件扩展名或者假设你的代码必须以某种方式组织。例如:也许你的 `/my_legacy_code/` 文件夹下的内容不是用 ES6 写的。所以你可以修改上述的 `test` 为 `/^((?!my_legacy_folder).)\.js$/`,这将会排除那个特定的文件夹,不过会用 Babel 处理其余的文件。
|
||||
`/\.js$/` 这个正则表达式查找所有以 `.js` 结尾的待通过 Babel 加载的文件。Webpack 依靠正则检查给予你完全的控制权 —— 它不限制你的文件扩展名或者假定你的代码必须以某种方式组织。例如:也许你的 `/my_legacy_code/` 文件夹下的内容不是用 ES6 写的,所以你可以修改上述的 `test` 为 `/^((?!my_legacy_folder).)\.js$/`,这将会排除那个特定的文件夹,不过会用 Babel 处理其余的文件。
|
||||
|
||||
#### CSS 和 Style 加载器
|
||||
|
||||
如果我们只想加载 CSS 作为我们的应用程序,我们也可以这样做。假设我们有一个 `index.js` 文件,我们将从那里引入:
|
||||
如果我们只想为我们的应用所需加载 CSS,我们也可以这样做。假设我们有一个 `index.js` 文件,我们将从那里引入:
|
||||
|
||||
```
|
||||
import styles from './assets/stylesheets/application.css';
|
||||
@ -287,27 +293,27 @@ module.exports = {
|
||||
|
||||
加载器以数组的逆序处理。这意味着 `css-loader` 会比 `style-loader` 先执行。
|
||||
|
||||
你可能会注意到,即使在生产版本中,这实际上是将你的 CSS 和 JavaScript 打包在一起,`style-loader` 手动将你的样式写到 `<head>`。乍一看,它可能看起来有点怪异,但你仔细想想这就慢慢开始变得更加有意义了。你已经节省了一个头部请求 —— 节省了一些连接上的时间。如果你用 JavaScript 来加载你的 DOM,无论如何,这从本质上消除了 [FOUC][21]。
|
||||
你可能会注意到,即使在生产版本中,这实际上是将你的 CSS 和 JavaScript 打包在一起,`style-loader` 手动将你的样式写到 `<head>`。乍一看,它可能看起来有点怪异,但你仔细想想就会发现这就慢慢开始变得更加有意义了。你已经节省了一个头部请求 —— 节省了一些连接上的时间。如果你用 JavaScript 来加载你的 DOM,无论如何,这从本质上消除了 [FOUC][21]。
|
||||
|
||||
你还会注意到一个开箱即用的特性 —— Webpack 已经通过将这些文件打包在一起以自动解决你所有的 `@import` 查询(而不是依靠 CSS 默认的 import 方式,这会导致无谓的头部请求以及资源加载缓慢)。
|
||||
|
||||
从你的 JS 加载 CSS 是非常惊人的,因为你现在可以用一种新的强大的方式将你的 CSS 模块化。仅仅通过加载 `button.js` 来加载 `button.css`。这将意味着如果 `button.js` 从来没有真正使用过的话,它的 CSS 就不会膨胀我们的生产版本。如果你坚持面向组件的 CSS 实践,如 SMACSS 或 BEM,你会看到更紧密地结合你的 CSS 和你的标记 + JavaScript 的价值。
|
||||
从你的 JS 加载 CSS 是非常惊人的,因为你现在可以用一种新的强大的方式将你的 CSS 模块化。比如说你要只通过 `button.js` 来加载 `button.css`,这将意味着如果 `button.js` 从来没有真正使用过的话,它的 CSS 就不会膨胀我们的生产版本。如果你坚持面向组件的 CSS 实践,如 SMACSS 或 BEM,你会看到更紧密地结合你的 CSS 和你的标记和 JavaScript 的价值。
|
||||
|
||||
#### CSS 和 Node 模块
|
||||
|
||||
我们可以使用 Webpack 来利用 Node 的使用 `~` 前缀导入 Node 模块的优势。如果我们运行 `yarn add normalize.css`,我们可以使用:
|
||||
我们可以使用 Webpack 来利用 Node.js 使用 `~` 前缀导入 Node 模块的优势。如果我们运行 `yarn add normalize.css`,我们可以使用:
|
||||
|
||||
```
|
||||
@import "~normalize.css";
|
||||
```
|
||||
|
||||
并且充分利用 NPM 来管理我们的第三方样式 —— 版本控制、没有任何副本和粘贴的部分。此外,让 Webpack 为我们打包 CSS 比起使用 CSS 的默认导入方式有明显的优势 —— 节省无谓的头部请求和加载时间。
|
||||
……并且充分利用 NPM 来管理我们的第三方样式 —— 版本控制、没有任何副本和粘贴的部分。此外,让 Webpack 为我们打包 CSS 比起使用 CSS 的默认导入方式有明显的优势 —— 节省无谓的头部请求和加载时间。
|
||||
|
||||
更新:这一节和下面一节已经更新为准确的用法,不再使用 CSS 模块简单地导入 Node 模块。感谢 [Albert Fernández][20] 的帮助!
|
||||
更新:这一节和下面一节已经更新为准确的用法,不再使用 CSS 模块简单地导入 Node 的模块。感谢 [Albert Fernández][20] 的帮助!
|
||||
|
||||
#### CSS 模块
|
||||
|
||||
你可能听说过 [CSS 模块][19],它消除了 CSS 的层叠性。通常它的最适用场景是只有当你使用 JavaScript 构建 DOM 的时候,但实质上,它神奇地将你的 CSS 类放置到加载它的 JavaScript 文件([在这里了解更多][18])。如果你打算使用它,CSS 模块已经与 `css-loader` 封装在一起(`yarn add --dev css-loader`):
|
||||
你可能听说过 [CSS 模块][19],它把 CSS 变成了 SS,消除了 CSS 的层叠性(Cascading)。通常它的最适用场景是只有当你使用 JavaScript 构建 DOM 的时候,但实质上,它神奇地将你的 CSS 类放置到加载它的 JavaScript 文件里([在这里了解更多][18])。如果你打算使用它,CSS 模块已经与 `css-loader` 封装在一起(`yarn add --dev css-loader`):
|
||||
|
||||
```
|
||||
module.exports = {
|
||||
@ -329,7 +335,7 @@ module.exports = {
|
||||
};
|
||||
```
|
||||
|
||||
注意:对于 `css-loader`,我们现在使用扩展对象语法来给它传递一个选项。你可以使用一个更为精简的字符串来取代默认选项,正如我们仍然使用了 `'style-loader'`。
|
||||
注意:对于 `css-loader`,我们现在使用扩展对象语法(expanded object syntax)来给它传递一个选项。你可以使用一个更为精简的字符串来取代默认选项,正如我们仍然使用了 `style-loader`。
|
||||
|
||||
* * *
|
||||
|
||||
@ -347,7 +353,7 @@ module.exports = {
|
||||
};
|
||||
```
|
||||
|
||||
我们首先指定源目录,然后指定 `node_modules`。因此,Webpack 会更好地处理解析度,按照既定的顺序(分别用你的源目录和 Node 模块的目录替换 `'src'` 和 `'node_modules'`),首先查找我们的源目录,然后再查找已安装的 Node 模块。
|
||||
我们首先指定源目录,然后指定 `node_modules`。这样,Webpack 会更好地处理解析,按照既定的顺序(分别用你的源目录和 Node 模块的目录替换 `"src"` 和 `"node_modules"`),首先查找我们的源目录,然后再查找已安装的 Node 模块。
|
||||
|
||||
#### Sass
|
||||
|
||||
@ -390,7 +396,7 @@ module.exports = {
|
||||
import styles from './assets/stylesheets/application.css';
|
||||
```
|
||||
|
||||
让我们安装这个插件到本地(我们需要 2016 年 10 月的 测试版本):
|
||||
让我们安装这个插件到本地(我们需要 2016 年 10 月的测试版本):
|
||||
|
||||
```
|
||||
yarn add --dev extract-text-webpack-plugin@2.0.0-beta.4
|
||||
@ -430,13 +436,13 @@ module.exports = {
|
||||
|
||||
#### HTML
|
||||
|
||||
正如你可能已经猜到,Webpack 还有一个 `[html-loader][6]` 插件。但是,当我们用 JavaScript 加载 HTML 时,我们针对不同的场景分成了不同的方法,我无法想出一个单一的例子来为你计划下一步做什么。通常,你需要加载 HTML 以便于在更大的系统(如 [React][13]、[Angular][12]、[Vue][11] 或 [Ember][10])中使用 JavaScript 风格的标记,如 [JSX][16]、[Mustache][15] 或 [Handlebars][14]。
|
||||
正如你可能已经猜到,Webpack 还有一个 `[html-loader][6]` 插件。但是,当我们用 JavaScript 加载 HTML 时,我们针对不同的场景分成了不同的方法,我无法想出一个单一的例子来为你计划下一步做什么。通常,你需要加载 HTML 以便于在更大的系统(如 [React][13]、[Angular][12]、[Vue][11] 或 [Ember][10])中使用 JavaScript 风格的标记,如 [JSX][16]、[Mustache][15] 或 [Handlebars][14]。或者你可以使用类似 [Pug][27] (以前叫 Jade)或 [Haml][28] 这样的 HTML 预处理器,抑或你可以直接把同样的 HTML 从你的源代码目录推送到你的构建目录。你怎么做都行。
|
||||
|
||||
教程到此为止了:你可以用 Webpack 加载标记,但是进展到这一步的时候,关于你的架构,你将做出自己的决定,我和 Webpack 都无法左右你。不过参考以上的例子以及搜索 NPM 上适用的加载器应该足够你发展下去了。
|
||||
|
||||
### 从模块的角度思考
|
||||
|
||||
为了充分使用 Webpack,你必须从模块的角度来思考 —— 细粒度的、可复用的、用于高效处理每一件事的独立的处理程序。这意味着采取这样的方式:
|
||||
为了充分使用 Webpack,你必须从模块的角度来思考:细粒度的、可复用的、用于高效处理每一件事的独立的处理程序。这意味着采取这样的方式:
|
||||
|
||||
```
|
||||
└── js/
|
||||
@ -460,9 +466,9 @@ module.exports = {
|
||||
└── application.js // ~ 1KB of code; imports from ./components/
|
||||
```
|
||||
|
||||
结果呈现了整洁的、可复用的代码。每一个独立的组件依赖于 `import` 自身的依赖,并 `export` 它想要暴露给其它模块的部分。结合 Babel 和 ES6,你可以利用 [JavaScript 类][9] 来实现更强大的模块化,而不用考虑它的工作原理。
|
||||
结果呈现了整洁的、可复用的代码。每一个独立的组件通过 `import` 来引入自身的依赖,并 `export` 它想要暴露给其它模块的部分。结合 Babel 和 ES6,你可以利用 [JavaScript 类][9] 来实现更强大的模块化,而不用考虑它的工作原理。
|
||||
|
||||
有关模块的更多信息,请参阅 Preethi Kasreddy [这篇优秀的文章][8].
|
||||
有关模块的更多信息,请参阅 Preethi Kasreddy [这篇优秀的文章][8]。
|
||||
|
||||
* * *
|
||||
|
||||
@ -479,10 +485,8 @@ module.exports = {
|
||||
via: https://blog.madewithenvy.com/getting-started-with-webpack-2-ed2b86c68783#.oozfpppao
|
||||
|
||||
作者:[Drew Powers][a]
|
||||
|
||||
译者:[OneNewLife](https://github.com/OneNewLife)
|
||||
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
@ -513,3 +517,5 @@ via: https://blog.madewithenvy.com/getting-started-with-webpack-2-ed2b86c68783#.
|
||||
[24]:https://yarnpkg.com/
|
||||
[25]:https://www.smashingmagazine.com/2009/04/progressive-enhancement-what-it-is-and-how-to-use-it/
|
||||
[26]:https://github.com/webpack/webpack/issues/1545#issuecomment-255446425
|
||||
[27]: https://github.com/pugjs/pug-loader
|
||||
[28]: https://github.com/AlexanderPavlenko/haml-loader
|
@ -0,0 +1,240 @@
|
||||
24 款必备的 Linux 桌面应用(2016 版)
|
||||
=====
|
||||
|
||||
[![Must have Linux applications](https://itsfoss.com/wp-content/uploads/2016/10/Essentials-applications-for-every-Linux-user.jpg)][39]
|
||||
|
||||
摘要:Linux 的必备软件有哪些?这将会是一个非常主观的回答,主要取决于你出于什么目的才使用桌面版 Linux。不过有一些必备的 Linux 桌面应用是大部分 Linux 用户都可能会用到的,这里将会列出不管在哪个发行版中你都应该安装的 Linux 桌面应用。
|
||||
|
||||
在 Linux 中,所有的一切都有多种可选方案的。首先,你会选择一个发行版,对吧?你可能需要尝试过多个发行版才能选出自己喜欢的风味。你是否还试过很多个音乐播放器?它们还是有很多选择的吧?
|
||||
|
||||
但并不是所有的这些应用都一样——有些以简洁为目标,而另一些则可能会提供大量的特性。根据自身的需求选择一款正确的应用也是一件相当困惑和累人的任务。就让我们来使这个过程变得容易一些吧。
|
||||
|
||||
### Linux 用户最好的自由软件
|
||||
|
||||
在这里,我把自己喜欢用的 Linux 必备软件以几个类型列出来。当然不能说这些是最好的,但在我尝试了大量的各类软件之后,最后才得到这个分类列表。所以,非常欢迎你在评论区畅言自己最喜欢的应用。
|
||||
|
||||
### Web浏览器
|
||||
|
||||
![Web Browsers](https://itsfoss.com/wp-content/uploads/2016/10/Essential-Linux-Apps-Web-Browser-1024x512.jpg)
|
||||
|
||||
*Web 浏览器*
|
||||
|
||||
#### [Google Chrome][38]
|
||||
|
||||
Google Chrome 是一个功能完备、性能强悍的 web 浏览器。它具备了非常彪悍的同步功能,同时还提供大量的功能扩展插件。如果那你习惯于 Google 的生态系统,那么 Chrome 绝对是你的不二选择。当然,假如你想要一个开源的解决方案,那么你可以试试 [Chromium][37],Google Chrome 就是基于 Chromium 构建的。
|
||||
|
||||
#### [Firefox][36]
|
||||
|
||||
如果你并非 Google Chrome 迷,那就试试 Firefox。它有着比较久的历史,也是一个稳定而健壮的 web 浏览器。
|
||||
|
||||
#### [Vivaldi][35]
|
||||
|
||||
如果说你想尝试新鲜事物并做一些改变,那么,你可以试试 Vivaldi,它为 web 浏览器带来了全新的使用方式,由前 Opera 项目成员基于 Chromium 项目开发。它开源、轻量级,同时不失定制性。尽管它还很年轻,缺少一些特性,但真的让人感觉清爽,可以完成你绝大多数的工作。
|
||||
|
||||
推荐阅读:[Otter 浏览器给 Opera 粉丝带来希望](https://itsfoss.com/otter-browser-review/)
|
||||
|
||||
### 下载管理器
|
||||
|
||||
![Download Managers](https://itsfoss.com/wp-content/uploads/2016/10/Essential-Linux-Apps-Download-Manager-1024x512.jpg)
|
||||
|
||||
*下载管理器*
|
||||
|
||||
#### [Uget][34]
|
||||
|
||||
Uget 是我见过最好的下载管理器了。其源码是开放的,同时提供给你在下载浏览器中所想到的一切功能。其中,高级设置选项可以用来更好的管理下载。它支持排队下载和断点下载、支持多连接来下载大体积文件、支持通过不同分类来下载到不同目录等等。
|
||||
|
||||
#### [Xdm][33]
|
||||
|
||||
Xdm (Xtreme Download Manager,极限下载管理器) 是一款用 Java 开发的功能强大且开源的工具。有着所有下载管理器的必备功能,包括:视频捕获器、智能调度和浏览器集成。
|
||||
|
||||
推荐阅读:[Linux 下 4 个最佳下载管理器](https://itsfoss.com/4-best-download-managers-for-linux/)
|
||||
|
||||
### BitTorrent 客户端
|
||||
|
||||
![BitTorrent Clients](https://itsfoss.com/wp-content/uploads/2016/10/Essential-Linux-Apps-BitTorrent-Client-1024x512.jpg)
|
||||
|
||||
*BitTorrent 客户端*
|
||||
|
||||
#### [Deluge][32]
|
||||
|
||||
Deluge 是一个开源的 BitTorrent 客户端,有着漂亮的用户界面。假如你习惯使用 Windows 下的 uTorrent,你就会知道两者有着很多的相似之处。它有大量的配置选项和插件来帮你应付各种下载任务。
|
||||
|
||||
#### [Transmission][31]
|
||||
|
||||
Transmission 是最轻量级的 Bittorrent 客户端——开源、有着最轻量级的用户界面。在多数的 Linux 发行版中都预装了 Transmission。
|
||||
|
||||
推荐阅读:[Ubuntu 下五个最好的 BT 客户端](https://linux.cn/article-6095-1.html)
|
||||
|
||||
### 云存储
|
||||
|
||||
![Cloud Storages](https://itsfoss.com/wp-content/uploads/2016/10/Essential-Linux-Apps-Cloud-Storage-1024x512.jpg)
|
||||
|
||||
*云存储*
|
||||
|
||||
#### [Dropbox][30]
|
||||
|
||||
Dropbox 是目前最流行云存储服务之一。你注册之后就有 2 GB 的免费空间。Dropbox 提供了一个健壮而简洁的 Linux 客户端。
|
||||
|
||||
#### [Mega][29]
|
||||
|
||||
Mega 提供了 50 GB 的免费空间,但其最好的一点却非免费空间之大,而是它为你的文件传输提供了点对点加密。它在 Linux 平台上也有一个可靠的客户端,名为 MEGAsync。
|
||||
|
||||
推荐阅读:[Linux 下最佳免费云服务](https://itsfoss.com/cloud-services-linux/)
|
||||
|
||||
### 即时消息软件
|
||||
|
||||
![Communication Apps](https://itsfoss.com/wp-content/uploads/2016/10/Essential-Linux-Apps-Communication-1024x512.jpg)
|
||||
|
||||
*即时消息软件*
|
||||
|
||||
#### [Pidgin][28]
|
||||
|
||||
Pidgin 是一个开源的即时消息客户端,支持多个聊天平台,包括 Facebook、Google Talk、Yahoo,甚至是 IRC。它还可以通过第三方插件来进行扩展,这样可以把很多功能集成到 Pidgin 中去。
|
||||
|
||||
#### [Skype][27]
|
||||
|
||||
我想,应该所有人都知道 Skype 吧,它是目前最流行的视频聊天平台。近期,它又为 Linux 平台[发布了一个全新的桌面客户端][26]。
|
||||
|
||||
推荐阅读:[Linux 上的最佳消息应用](https://itsfoss.com/best-messaging-apps-linux/)
|
||||
|
||||
### 办公套件
|
||||
|
||||
![Office Suites](https://itsfoss.com/wp-content/uploads/2016/10/Essential-Linux-Apps-Office-Suite-1024x512.jpg)
|
||||
|
||||
*办公套件*
|
||||
|
||||
#### [LibreOffice][25]
|
||||
|
||||
LibreOffice 是 Linux 平台下开发活跃度最高的开源办公套件。它有六大核心模块:Writer (文字处理)、Calc (电子表格)、Impress (文稿演示)、Draw (图像绘制)、Math (数学公式)、Base (数据库),并且,这些模块都支持多种格式。当然,LibreOffice 也是支持第三方扩展的,多数的 Linux 发行版都用它作为默认的办公套件。
|
||||
|
||||
#### [WPS Office][24]
|
||||
|
||||
如果想要尝试 LibreOffice 之外的办公套件,WPS Office 当然是不容错过的,它支持 Writer (文字处理)、presentation (文稿演示)、spreadsheets (电子表格)。
|
||||
|
||||
推荐阅读:[微软 Office 办公套件的最佳开源替代品](https://itsfoss.com/best-free-open-source-alternatives-microsoft-office/)
|
||||
|
||||
### 音乐播放器
|
||||
|
||||
![Music Players](https://itsfoss.com/wp-content/uploads/2016/10/Essential-Linux-Apps-Music-Player-1024x512.jpg)
|
||||
|
||||
*音乐播放器*
|
||||
|
||||
##### [Lollypop][23]
|
||||
|
||||
这是一个相对较新的音乐播放器。Lollypop 是开源的,有着非常漂亮的用户界面,提供了非常友好的歌曲管理、播放历史支持、在线电台和派对模式。尽管这是一个很简单的音乐播放器,没有太多的高级特性,但还是值得一试的。
|
||||
|
||||
#### [RhythmBox][22]
|
||||
|
||||
Rhythmbox 最初是为 Gnome 开发的音乐播放器,但现在已经可以很好的在其他的桌面环境中工作。它可以完成音乐播放器的所有基本任务,包括 CD 转录 & 刻录、播放历史等,而且还支持 iPod。
|
||||
|
||||
#### [CMUS][21]
|
||||
|
||||
假如你是极简主义派,并深爱着终端界面,那么 cmus 很合适你。就个人而言,我很喜欢并一直在用这个软件。它是类 Unix 平台下一个相当小巧、响应速度快、有着功能强大的控制台音乐播放器,具备了音乐播放器所有基本特性。通过其它的扩展和脚本,你可以使它功能更加丰富。
|
||||
|
||||
推荐阅读:[在 Ubuntu 14.04 和 Linux Mint 17 安装 Tomahawk 播放器](https://itsfoss.com/install-tomahawk-ubuntu-1404-linux-mint-17/)
|
||||
|
||||
### 视频播放器
|
||||
|
||||
![Video Player](https://itsfoss.com/wp-content/uploads/2016/10/Essential-Linux-Apps-Video-Player-1024x512.jpg)
|
||||
|
||||
*视频播放器*
|
||||
|
||||
#### [VLC][20]
|
||||
|
||||
VLC 是一个开源的媒体播放器,具有简洁、速度快、轻量级而功能强大等特点。它做到了真正的开箱即用,几乎支持所有你想到的视频格式,而且可以播放在线流媒体。当然,它支持一些非常棒的插件来完成不同的任务,比方说在播放视频时下载对应的字幕。
|
||||
|
||||
#### [Kodi][19]
|
||||
|
||||
Kodi 是一个功能完备的媒体播放器,开源并流行于其用户群体中。它可以处理本地或者网络存储中的视频、音乐、图片、播客甚至是游戏,你还有使用它来录制 TV。Kodi 可以通过附件和不同的皮肤来自定义。
|
||||
|
||||
推荐阅读:[Linux 上的 4 种格式转换器](https://itsfoss.com/format-factory-alternative-linux/)
|
||||
|
||||
### 图像编辑器
|
||||
|
||||
![Photo Editors](https://itsfoss.com/wp-content/uploads/2016/10/Essential-Linux-Apps-Photo-Editor-1024x512.jpg)
|
||||
|
||||
*图像编辑器*
|
||||
|
||||
#### [GIMP][18]
|
||||
|
||||
GIMP 是 Linux 平台下 Photoshop 的替代方案。它是开源的,是一个全功能、专业的图像编辑软件,打包了非常多的工具用来处理各类图像。在此基础上,还有大量的定制选项以及第三方插件可以用于增强用户的使用体验。
|
||||
|
||||
#### [Krita][17]
|
||||
|
||||
Krita 主要是一个绘图工具,但也可以用来编辑图像。它同样也是开源的,也打包了很多精致且高级的工具。
|
||||
|
||||
推荐阅读:[Linux 上最佳图像应用](https://itsfoss.com/image-applications-ubuntu-linux/)
|
||||
|
||||
### 文本编辑器
|
||||
|
||||
每个 Linux 发行版都会自带一个文本编辑器。通常,它的功能相对来说比较简单,没有太多的功能,但还是有一些具有增强功能的编辑器。
|
||||
|
||||
![Text Editors](https://itsfoss.com/wp-content/uploads/2016/10/Essential-Linux-Apps-Text-Editor-1024x512.jpg)
|
||||
|
||||
*文本编辑器*
|
||||
|
||||
#### [Atom][16]
|
||||
|
||||
Atom 是一个现代的可魔改的文本编辑器,由 GitHub 进行维护更新。它是完全开源的,为你的文本编辑任务提供了你所想到一切可能性。它做到了真正的开箱即用,你也可以进行自定义,让它变成你所需要的样子。同时,你可以从社区中获取有关它的大量扩展和主题。
|
||||
|
||||
#### [Sublime Text][15]
|
||||
|
||||
Sublime Text 是主流的文本编辑器之一。尽管它并不免费,但它允许你把软件作为评估使用,而且没有时间限制。Sublime Text 是一个功能丰富和复杂的软件。当然,它还有插件和主题支持。
|
||||
|
||||
推荐阅读:[Linux 上四个最佳的现代开源代码编辑器](https://linux.cn/article-7468-1.html)
|
||||
|
||||
### 启动器 (Launcher)
|
||||
|
||||
![Launchers](https://itsfoss.com/wp-content/uploads/2016/10/Essential-Linux-Apps-Launcher-1024x512.jpg)
|
||||
|
||||
*启动器 (Launcher)*
|
||||
|
||||
#### [Albert][14]
|
||||
|
||||
Albert 的灵感来至于 Alfred (Mac 中的一个高效应用,可以做到一切信手拈来),但仍在开发中。Albert 反应很快,可扩展、可定制。其目标就是“不用思考就使用一切可用资源”。它可以很好的集成到你的 Linux 发行版中,并让你保持高效。
|
||||
|
||||
#### [Synapse][13]
|
||||
|
||||
Synapse 已有一些历史,是一个简洁的启动器,可以用来搜索和运行应用。它还可以加速各种各样的工作流,比如控制音乐、搜索文件、目录以及书签、运行命令等等。
|
||||
|
||||
---
|
||||
|
||||
正如 Abhishek 所说,我们会一直为读者 (比如,你) 更新这个 Linux 必备软件列表。那么,你最喜欢的 Linux 必备软件是什么呢?随时和我们分享,并想我们这个列表提出更多的软件分类。
|
||||
|
||||
--------------------------------------------------------
|
||||
via: https://itsfoss.com/essential-linux-applications
|
||||
|
||||
作者:[Munif Tanjim][a]
|
||||
译者:[GHLandy](https://github.com/GHLandy)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://itsfoss.com/author/munif/
|
||||
[13]:https://launchpad.net/synapse-project
|
||||
[14]:https://github.com/ManuelSchneid3r/albert
|
||||
[15]:http://www.sublimetext.com/
|
||||
[16]:https://atom.io/
|
||||
[17]:https://krita.org/en/
|
||||
[18]:https://www.gimp.org/
|
||||
[19]:https://kodi.tv/
|
||||
[20]:http://www.videolan.org/
|
||||
[21]:https://cmus.github.io/
|
||||
[22]:https://wiki.gnome.org/Apps/Rhythmbox
|
||||
[23]:http://gnumdk.github.io/lollypop-web/
|
||||
[24]:https://www.wps.com/
|
||||
[25]:https://www.libreoffice.org/
|
||||
[26]:https://linux.cn/article-7574-1.html
|
||||
[27]:https://www.skype.com/
|
||||
[28]:https://www.pidgin.im/
|
||||
[29]:https://mega.nz/
|
||||
[30]:https://www.dropbox.com/
|
||||
[31]:https://transmissionbt.com/
|
||||
[32]:http://deluge-torrent.org/
|
||||
[33]:http://xdman.sourceforge.net/
|
||||
[34]:http://ugetdm.com/
|
||||
[35]:https://vivaldi.com/
|
||||
[36]:https://www.mozilla.org/en-US/firefox
|
||||
[37]:https://www.chromium.org/Home
|
||||
[38]:https://www.google.com/chrome/browser
|
||||
[39]:https://itsfoss.com/wp-content/uploads/2016/10/Essentials-applications-for-every-Linux-user.jpg
|
@ -0,0 +1,63 @@
|
||||
我们大学机房使用的 Fedora 系统
|
||||
==========
|
||||
|
||||
![Fedora-powered computer lab at our university](https://cdn.fedoramagazine.org/wp-content/uploads/2016/10/fedora-powered-computer-lab-945x400.png)
|
||||
|
||||
在[塞尔维亚共和国诺维萨德大学的自然科学系和数学与信息学系][5],我们教学生很多东西。从编程语言的入门到机器学习,所有开设的课程最终目的是让我们的学生能够像专业的开发者和软件工程师一样思考。课程时间紧凑而且学生众多,所以我们必须对现有可利用的资源进行合理调整以满足正常的教学。最终我们决定将机房计算机系统换为 Fedora。
|
||||
|
||||
### 以前的设置
|
||||
|
||||
我们过去的解决方案是在 Ubuntu 系统上面安装 Windows [虚拟机][4]并在虚拟机下安装好教学所需的开发软件。这在当时看起来是一个很不错的主意。然而,这种方法有很多弊端。首先,运行虚拟机导致了严重的计算机性能的浪费,因此导致操作系统性能和运行速度降低。此外,虚拟机有时候会在另一个用户会话里面同时运行。这会导致计算机工作严重缓慢。我们不得不在启动电脑和启动虚拟机上花费宝贵的时间。最后,我们意识到我们的大部分教学所需软件都有对应的 Linux 版本。虚拟机不是必需的。我们需要寻找一个更好的解决办法。
|
||||
|
||||
### 进入 Fedora!
|
||||
|
||||
![Computer lab in Serbia powered by Fedora](https://cdn.fedoramagazine.org/wp-content/uploads/2016/10/jxXtuFO-1024x576.jpg)
|
||||
|
||||
*默认运行 Fedora 工作站版本的一个机房的照片*
|
||||
|
||||
我们考虑使用一种简洁的安装替代以前的 Windows 虚拟机方案。我们最终决定使用 Fedora,这有很多原因。
|
||||
|
||||
#### 发展的前沿
|
||||
|
||||
在我们所教授的课程中,我们会用到很多各种各样的开发工具。因此,能够及时获取可用的最新、最好的开发工具很重要。在 Fedora 下,我们发现我们用到的开发工具有 95% 都能够在官方的软件仓库中找到!只有少量的一些工具,我们才需要手动安装。这在 Fedora 下很简单,因为你能获取到几乎所有的现成的开发工具。
|
||||
|
||||
在这个过程中我们意识到我们使用了大量自由、开源的软件和工具。保证这些软件总是能够及时更新通常需要做大量的工作,然而 Fedora 没有这个问题。
|
||||
|
||||
#### 硬件兼容性
|
||||
|
||||
我们机房选择 Fedora 的第二个原因是硬件兼容性。机房现在的电脑还是比较崭新的。过去比较低的内核版本总有些问题。在 Fedora 下,我们总能获得最新的内核版本。正如我们预期的那样,一切运行良好,没有任何问题。
|
||||
|
||||
我们决定使用带有 [GNOME 桌面环境][2]的 Fedora [工作站版本][3]。学生们发现它很容易、直观,可以快速上手。对我们来说,学生有一个简单的环境很重要,这样他们会更多的关注自己的任务和课程本身,而不是一个复杂的或者运行缓慢的用户界面。
|
||||
|
||||
#### 自主的技术支持
|
||||
|
||||
最后一个原因,我们院系高度赞赏自由、开放源代码的软件。使用这些软件,学生们即便在毕业后和工作的时候,仍然能够继续自由地使用它们。在这个过程中,他们通常也对 Fedora 和自由、开源的软件有了一定了解。
|
||||
|
||||
### 转换机房
|
||||
|
||||
我们找来其中的一台电脑,完全手动安装好。包括准备所有必要的脚本和软件,设置远程控制权限和一些其他的重要组成部分。我们也为每一门课程单独设置一个用户账号以方便学生存储他们的文件。
|
||||
|
||||
一台电脑安装配置好后,我们使用一个强大的、免费的、开源的叫做 [CloneZilla][1] 的工具。 CloneZilla 能够制作硬盘镜像以做恢复用。镜像大小约为 11 G。我们用一些带有高速 USB 3.0 接口的闪存来还原磁盘镜像到其余的电脑。我们仅仅利用若干个闪存设备花费了 75 分钟设置好其余的 24 台电脑。
|
||||
|
||||
### 将来的工作
|
||||
|
||||
我们机房现在所有的电脑都完全使用 Fedora (没有虚拟机)。剩下的工作是设置一些管理脚本方便远程安装软件,电脑的开关等等。
|
||||
|
||||
我们由衷地感谢所有 Fedora 的维护人员、软件包管理人员和其他贡献者。我们希望我们的工作能够鼓励其他的学校和大学像我们一样将机房电脑的操作系统转向 Fedora。我们很高兴地确认 Fedora 完全适合我们,同时我们也保证 Fedora 同样会适合您!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://fedoramagazine.org/fedora-computer-lab-university/
|
||||
|
||||
作者:[Nemanja Milošević][a]
|
||||
译者:[WangYueScream](https://github.com/WangYueScream),[LemonDemo](https://github.com/LemonDemo)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]: https://fedoramagazine.org/author/nmilosev/
|
||||
[1]:http://clonezilla.org/
|
||||
[2]:https://www.gnome.org/
|
||||
[3]:https://getfedora.org/workstation/
|
||||
[4]:https://en.wikipedia.org/wiki/Virtual_machine
|
||||
[5]:http://www.dmi.rs/
|
@ -1,22 +1,22 @@
|
||||
Linux 中的 DTrace
|
||||
Linux 中的 DTrace :BPF 进入 4.9 内核
|
||||
===========
|
||||
|
||||
![](https://raw.githubusercontent.com/brendangregg/bcc/master/images/bcc_tracing_tools_2016.png)
|
||||
|
||||
随着 BPF 追踪系统(基于时间采样)最后一个主要功能被合并至 Linux 4.9-rc1 版本的内核中,现在 Linux 内核拥有类似 DTrace 的原生追踪功能。DTrace 是 Solaris 系统中的高级追踪器。对于长期使用 DTrace 的用户和专家,这将是一个振奋人心的里程碑!在 Linux 系统上,现在你可以使用用安全的、低负载的定制追踪系统,通过执行时间的柱状图和频率统计等信息,分析应用的性能以及内核。
|
||||
随着 BPF 追踪系统(基于时间采样)最后一个主要功能被合并至 Linux 4.9-rc1 版本的内核中,现在 Linux 内核拥有类似 DTrace 的原生追踪功能。DTrace 是 Solaris 系统中的高级追踪器。对于长期使用 DTrace 的用户和专家,这将是一个振奋人心的里程碑!现在在 Linux 系统上,你可以在生产环境中使用安全的、低负载的定制追踪系统,通过执行时间的柱状图和频率统计等信息,分析应用的性能以及内核。
|
||||
|
||||
用于 Linux 的追踪工程有很多,但是最终被合并进 Linux 内核的技术从一开始就根本不是一个追踪项目:它是最开始是用于 Berkeley Packet Filter(BPF)的补丁。这些补丁允许 BPF 将软件包重定向,创建软件定义的网络。久而久之,支持追踪事件就被添加进来了,使得程序追踪可用于 Linux 系统。
|
||||
用于 Linux 的追踪项目有很多,但是这个最终被合并进 Linux 内核的技术从一开始就根本不是一个追踪项目:它是最开始是用于伯克利包过滤器(Berkeley Packet Filter)(BPF)的增强功能。这些补丁允许 BPF 重定向数据包,从而创建软件定义网络(SDN)。久而久之,对事件追踪的支持就被添加进来了,使得程序追踪可用于 Linux 系统。
|
||||
|
||||
尽管目前 BPF 没有像 DTrace 一样的高级语言,它所提供的前端已经足够让我创建很多 BPF 工具了,其中有些是基于我以前的 [DTraceToolkit][37]。这个帖子将告诉你怎么去用这些工具,BPF 提供的前端,以及畅谈这项技术将会何去何从。
|
||||
尽管目前 BPF 没有像 DTrace 一样的高级语言,但它所提供的前端已经足够让我创建很多 BPF 工具了,其中有些是基于我以前的 [DTraceToolkit][37]。这个帖子将告诉你怎么去用这些 BPF 提供的前端工具,以及畅谈这项技术将会何去何从。
|
||||
|
||||
### 截图
|
||||
### 示例
|
||||
|
||||
我已经将基于 BPF 的追踪工具添加到了开源的 [bcc][36] 项目里(感谢 PLUMgrid 公司的 Brenden Blanco 带领 bcc 项目的发展)。详见 [bcc 安装][35] 手册。它会在 /usr/share/bcc/tools 目录下添加一系列工具,包括接下来的那些工具。
|
||||
我已经将基于 BPF 的追踪工具添加到了开源的 [bcc][36] 项目里(感谢 PLUMgrid 公司的 Brenden Blanco 带领 bcc 项目的发展)。详见 [bcc 安装][35] 手册。它会在 `/usr/share/bcc/tools` 目录下添加一系列工具,包括接下来的那些工具。
|
||||
|
||||
捕获新进程:
|
||||
|
||||
```
|
||||
# **execsnoop**
|
||||
# execsnoop
|
||||
PCOMM PID RET ARGS
|
||||
bash 15887 0 /usr/bin/man ls
|
||||
preconv 15894 0 /usr/bin/preconv -e UTF-8
|
||||
@ -27,13 +27,12 @@ nroff 15900 0 /usr/bin/locale charmap
|
||||
nroff 15901 0 /usr/bin/groff -mtty-char -Tutf8 -mandoc -rLL=169n -rLT=169n
|
||||
groff 15902 0 /usr/bin/troff -mtty-char -mandoc -rLL=169n -rLT=169n -Tutf8
|
||||
groff 15903 0 /usr/bin/grotty
|
||||
|
||||
```
|
||||
|
||||
硬盘 I/O 延迟的柱状图:
|
||||
|
||||
```
|
||||
# **biolatency -m**
|
||||
# biolatency -m
|
||||
Tracing block device I/O... Hit Ctrl-C to end.
|
||||
^C
|
||||
msecs : count distribution
|
||||
@ -44,13 +43,12 @@ Tracing block device I/O... Hit Ctrl-C to end.
|
||||
16 -> 31 : 100 |**************************************|
|
||||
32 -> 63 : 62 |*********************** |
|
||||
64 -> 127 : 18 |****** |
|
||||
|
||||
```
|
||||
|
||||
追踪常见的 ext4 操作,稍慢于 5ms:
|
||||
追踪慢于 5 毫秒的 ext4 常见操作:
|
||||
|
||||
```
|
||||
# **ext4slower 5**
|
||||
# ext4slower 5
|
||||
Tracing ext4 operations slower than 5 ms
|
||||
TIME COMM PID T BYTES OFF_KB LAT(ms) FILENAME
|
||||
21:49:45 supervise 3570 W 18 0 5.48 status.new
|
||||
@ -67,26 +65,24 @@ TIME COMM PID T BYTES OFF_KB LAT(ms) FILENAME
|
||||
21:49:48 ps 12776 R 832 0 12.02 libprocps.so.4.0.0
|
||||
21:49:48 run 12779 R 128 0 13.21 cut
|
||||
[...]
|
||||
|
||||
```
|
||||
|
||||
追踪新建的 TCP 活跃连接(connect()):
|
||||
追踪新建的 TCP 活跃连接(`connect()`):
|
||||
|
||||
```
|
||||
# **tcpconnect**
|
||||
# tcpconnect
|
||||
PID COMM IP SADDR DADDR DPORT
|
||||
1479 telnet 4 127.0.0.1 127.0.0.1 23
|
||||
1469 curl 4 10.201.219.236 54.245.105.25 80
|
||||
1469 curl 4 10.201.219.236 54.67.101.145 80
|
||||
1991 telnet 6 ::1 ::1 23
|
||||
2015 ssh 6 fe80::2000:bff:fe82:3ac fe80::2000:bff:fe82:3ac 22
|
||||
|
||||
```
|
||||
|
||||
通过捕获 getaddrinfo()/gethostbyname() 库的调用来追踪 DNS 延迟:
|
||||
通过跟踪 `getaddrinfo()`/`gethostbyname()` 库的调用来追踪 DNS 延迟:
|
||||
|
||||
```
|
||||
# **gethostlatency**
|
||||
# gethostlatency
|
||||
TIME PID COMM LATms HOST
|
||||
06:10:24 28011 wget 90.00 www.iovisor.org
|
||||
06:10:28 28127 wget 0.00 www.iovisor.org
|
||||
@ -96,25 +92,23 @@ TIME PID COMM LATms HOST
|
||||
06:11:16 29195 curl 3.00 www.facebook.com
|
||||
06:11:25 29404 curl 72.00 foo
|
||||
06:11:28 29475 curl 1.00 foo
|
||||
|
||||
```
|
||||
|
||||
按类别划分 VFS 操作的时间间隔统计:
|
||||
|
||||
```
|
||||
# **vfsstat**
|
||||
# vfsstat
|
||||
TIME READ/s WRITE/s CREATE/s OPEN/s FSYNC/s
|
||||
18:35:32: 231 12 4 98 0
|
||||
18:35:33: 274 13 4 106 0
|
||||
18:35:34: 586 86 4 251 0
|
||||
18:35:35: 241 15 4 99 0
|
||||
|
||||
```
|
||||
|
||||
对一个给定的 PID,通过内核和用户堆栈轨迹来追踪 CPU 外的时间(由内核进行统计):
|
||||
对一个给定的 PID,通过内核和用户堆栈轨迹来追踪 CPU 处理之外的时间(由内核进行统计):
|
||||
|
||||
```
|
||||
# **offcputime -d -p 24347**
|
||||
# offcputime -d -p 24347
|
||||
Tracing off-CPU time (us) of PID 24347 by user + kernel stack... Hit Ctrl-C to end.
|
||||
^C
|
||||
[...]
|
||||
@ -142,13 +136,12 @@ Tracing off-CPU time (us) of PID 24347 by user + kernel stack... Hit Ctrl-C to e
|
||||
00007f6733a969b0 read
|
||||
- bash (24347)
|
||||
1450908
|
||||
|
||||
```
|
||||
|
||||
追踪 MySQL 查询延迟(通过 USDT 探针):
|
||||
|
||||
```
|
||||
# **mysqld_qslower `pgrep -n mysqld`**
|
||||
# mysqld_qslower `pgrep -n mysqld`
|
||||
Tracing MySQL server queries for PID 14371 slower than 1 ms...
|
||||
TIME(s) PID MS QUERY
|
||||
0.000000 18608 130.751 SELECT * FROM words WHERE word REGEXP '^bre.*n$'
|
||||
@ -156,101 +149,97 @@ TIME(s) PID MS QUERY
|
||||
4.603549 18608 24.164 SELECT COUNT(*) FROM words
|
||||
9.733847 18608 130.936 SELECT count(*) AS count FROM words WHERE word REGEXP '^bre.*n$'
|
||||
17.864776 18608 130.298 SELECT * FROM words WHERE word REGEXP '^bre.*n$' ORDER BY word
|
||||
|
||||
```
|
||||
|
||||
<!--Using the trace multi-tool to watch login requests, by instrumenting the pam library: -->
|
||||
检测 pam 库并使用多种追踪工具观察登陆请求:
|
||||
监测 pam 库并使用多种追踪工具观察登录请求:
|
||||
|
||||
```
|
||||
# **trace 'pam:pam_start "%s: %s", arg1, arg2'**
|
||||
# trace 'pam:pam_start "%s: %s", arg1, arg2'
|
||||
TIME PID COMM FUNC -
|
||||
17:49:45 5558 sshd pam_start sshd: root
|
||||
17:49:47 5662 sudo pam_start sudo: root
|
||||
17:49:49 5727 login pam_start login: bgregg
|
||||
|
||||
```
|
||||
|
||||
bcc 项目里的很多工具都有帮助信息(-h 选项),并且都应该包含有示例的 man 页面和文本文件。
|
||||
bcc 项目里的很多工具都有帮助信息(`-h` 选项),并且都应该包含有示例的 man 页面和文本文件。
|
||||
|
||||
### 必要的
|
||||
### 必要性
|
||||
|
||||
2014 年,Linux 追踪程序就有一些内核相关的特性(自 ftrace 和 pref_events),但是我们仍然要转储并报告进程数据,因为数十年的老技术会有很大规模的开销。你不能频繁地访问进程名,函数名,堆栈轨迹或内核中的其它任何数据。你不能在将变量保存到一个监测事件里,又在另一个事件里访问它们,这意味着你不能在自定义的地方计算延迟(或者说时间参数)。你也不能创建一个内核之内的延迟柱状图,也不能追踪 USDT 探针,甚至不能写自定义的程序。DTrace 可以做到这些,但仅限于 Solaris 或 BSD 系统。在 Linux 系统中,有些基于树的追踪器,像 SystemTap 就可以满足你的这些需求,但它也有自身的不足。(你可以写一个基于探针的内核模块来满足需求-但实际上没人这么做。)
|
||||
2014 年,Linux 追踪程序就有一些内核相关的特性(来自 `ftrace` 和 `pref_events`),但是我们仍然要转储并报告进程数据,这种几十年前的老技术有很多的限制。你不能频繁地访问进程名、函数名、堆栈轨迹或内核中的任意的其它数据。你不能在将变量保存到一个监测事件里,又在另一个事件里访问它们,这意味着你不能在你需要的地方计算延迟(或者说时间增量)。你也不能创建一个内核内部的延迟柱状图,也不能追踪 USDT 探针,甚至不能写个自定义的程序。DTrace 可以做到所有这些,但仅限于 Solaris 或 BSD 系统。在 Linux 系统中,有些不在主线内核的追踪器,比如 SystemTap 就可以满足你的这些需求,但它也有自身的不足。(理论上说,你可以写一个基于探针的内核模块来满足需求-但实际上没人这么做。)
|
||||
|
||||
2014 年我加入了 Netflix cloud performance 团队。做了这么久的 DTrace 方面的专家,转到 Linux 对我来说简直不可思议。但我确实这么做了,尤其是发现了严重的问题:Netflix cloud 会随着应用,微服务架构和分布式系统的快速变化,性能受到影响。有时要用到系统追踪,而我之前是用的 DTrace。在 Linux 系统上可没有 DTrace,我就开始用 Linux 内核内建的 ftrace 和 perf_events 工具,构建了一个追踪工具([perf-tools][34])。这些工具很有用,但有些工作还是没法完成,尤其是延迟柱状图图以及计算堆栈踪迹。我们需要的是内核追踪程序化。
|
||||
2014 年我加入了 Netflix cloud performance 团队。做了这么久的 DTrace 方面的专家,转到 Linux 对我来说简直不可思议。但我确实这么做了,而且遇到了巨大的挑战:在应用快速变化、采用微服务架构和分布式系统的情况下,调优 Netflix cloud。有时要用到系统追踪,而我之前是用的 DTrace。在 Linux 系统上可没有 DTrace,我就开始用 Linux 内核内建的 `ftrace` 和 `perf_events` 工具,构建了一个追踪工具([perf-tools][34])。这些工具很有用,但有些工作还是没法完成,尤其是延迟柱状图以及堆栈踪迹计数。我们需要的是内核追踪的可程序化。
|
||||
|
||||
### 发生了什么?
|
||||
|
||||
BPF 将程序化的功能添加到现有的内核追踪工具中(tracepoints, kprobes, uprobes)。在 Linux 4.x 系列的内核里,这些功能大大加强了。
|
||||
BPF 将程序化的功能添加到现有的内核追踪工具中(`tracepoints`、`kprobes`、`uprobes`)。在 Linux 4.x 系列的内核里,这些功能大大加强了。
|
||||
|
||||
时间采样是最主要的部分,它被 Linux 4.9-rc1 所采用([patchset][33])。十分感谢 Alexei Starovoitov(致力于 Facebook 中的 BPF 开发),改进 BPF 的主要开发者。
|
||||
时间采样是最主要的部分,它被 Linux 4.9-rc1 所采用([patchset][33])。十分感谢 Alexei Starovoitov(在 Facebook 致力于 BPF 的开发),他是这些 BPF 增强功能的主要开发者。
|
||||
|
||||
Linux 内核现在内建有以下这些特性(添加自 2.6 版本到 4.9 版本):
|
||||
Linux 内核现在内建有以下这些特性(自 2.6 版本到 4.9 版本之间增加):
|
||||
|
||||
* 内核级的动态追踪(BPF 对 kprobes 的支持)
|
||||
* 用户级的动态追踪(BPF 对 uprobes 的支持)
|
||||
* 内核级的静态追踪(BPF 对 tracepoints 的支持)
|
||||
* 时间采样事件(BPF 的 pref_event_open)
|
||||
* PMC 事件(BPF 的 pref_event_open)
|
||||
* 内核级的动态追踪(BPF 对 `kprobes` 的支持)
|
||||
* 用户级的动态追踪(BPF 对 `uprobes` 的支持)
|
||||
* 内核级的静态追踪(BPF 对 `tracepoints` 的支持)
|
||||
* 时间采样事件(BPF 的 `pref_event_open`)
|
||||
* PMC 事件(BPF 的 `pref_event_open`)
|
||||
* 过滤器(通过 BPF 程序)
|
||||
* 调试输出(bpf_trace_printk())
|
||||
* 事件输出(bpf_perf_event_output())
|
||||
* 调试输出(`bpf_trace_printk()`)
|
||||
* 按事件输出(`bpf_perf_event_output()`)
|
||||
* 基础变量(全局的和每个线程的变量,基于 BPF 映射)
|
||||
* 关联数组(通过 BPF 映射)
|
||||
* 频率计数(基于 BPF 映射)
|
||||
* 柱状图(power-of-2, 线性及自定义,基于 BPF 映射)
|
||||
* Timestamps and time deltas (bpf_ktime_get_ns(), and BPF programs)
|
||||
* 时间戳和时间参数(bpf_ktime_get_ns(),和 BPF 程序)
|
||||
* 内核态的堆栈轨迹(BPF stackmap 栈映射)
|
||||
* 用户态的堆栈轨迹 (BPF stackmap 栈映射)
|
||||
* 重写 ring 缓存(pref_event_attr.write_backward)
|
||||
* 柱状图(2 的冥次方、线性及自定义,基于 BPF 映射)
|
||||
* 时间戳和时间增量(`bpf_ktime_get_ns()`,和 BPF 程序)
|
||||
* 内核态的堆栈轨迹(BPF 栈映射)
|
||||
* 用户态的堆栈轨迹 (BPF 栈映射)
|
||||
* 重写 ring 缓存(`pref_event_attr.write_backward`)
|
||||
|
||||
我们采用的前端是 bcc,它同时提供 Python 和 lua 接口。bcc 添加了:
|
||||
|
||||
* 用户级静态追踪(基于 uprobes 的 USDT 探针)
|
||||
* 调试输出(调用 BPF.trace_pipe() 和 BPF.trace_fields() 函数的 Python)
|
||||
* 所有事件输出(BPF_PERF_OUTPUT 宏和 BPF.open_perf_buffer())
|
||||
* 间隔输出(BPF.get_table() 和 table.clear())
|
||||
* 打印柱状图(table.print_log2_hist())
|
||||
* 内核级的 C 结构体导航(bcc 重写 bpf_probe_read() 函数的映射)
|
||||
* 内核级的符号解析(ksym(), ksymaddr())
|
||||
* 用户级的符号解析(usymaddr())
|
||||
* BPF tracepoint 支持(通过 TRACEPOINT_PROBE)
|
||||
* BPF 堆栈轨迹支持(包括针对堆栈框架的 walk 方法)
|
||||
* 其它各种助手宏和方法
|
||||
* 例子(位于 /examples 目录)
|
||||
* 工具(位于 /tools 目录)
|
||||
* 教程(/docs/tutorial*.md)
|
||||
* 参考手册(/docs/reference_guide.md)
|
||||
* 用户级静态追踪(基于 `uprobes` 的 USDT 探针)
|
||||
* 调试输出(Python 中调用 `BPF.trace_pipe()` 和 `BPF.trace_fields()` 函数 )
|
||||
* 按事件输出(`BPF_PERF_OUTPUT` 宏和 `BPF.open_perf_buffer()`)
|
||||
* 间隔输出(`BPF.get_table()` 和 `table.clear()`)
|
||||
* 打印柱状图(`table.print_log2_hist()`)
|
||||
* 内核级的 C 结构体导航(bcc 重写器映射到 `bpf_probe_read()` 函数)
|
||||
* 内核级的符号解析(`ksym()`、 `ksymaddr()`)
|
||||
* 用户级的符号解析(`usymaddr()`)
|
||||
* BPF 跟踪点支持(通过 `TRACEPOINT_PROBE`)
|
||||
* BPF 堆栈轨迹支持(包括针对堆栈框架的 `walk` 方法)
|
||||
* 其它各种辅助宏和方法
|
||||
* 例子(位于 `/examples` 目录)
|
||||
* 工具(位于 `/tools` 目录)
|
||||
* 教程(`/docs/tutorial*.md`)
|
||||
* 参考手册(`/docs/reference_guide.md`)
|
||||
|
||||
直到最新也是最主要的特性被整合进来,我才开始写这篇文章,现在它在 4.9-rc1 内核中。我们还需要去完成一些次要的东西,还有另外一些事情要做,但是现在我们所拥有的已经值得欢呼了。现在 Linux 拥有内建的高级追踪能力。
|
||||
直到最新也是最主要的特性被整合进来,我才开始写这篇文章,现在它在 4.9-rc1 内核中。我们还需要去完成一些次要的东西,还有另外一些事情要做,但是现在我们所拥有的已经值得欢呼了。现在 Linux 拥有了内建的高级追踪能力。
|
||||
|
||||
### 安全性
|
||||
|
||||
设计 BPF 以及改进版时就考虑到产品安全,它被用在大范围的生产环境里。确信的话,你应该能找到一个挂起内核的方法。这个例子是偶然而不是必然,类似的漏洞会被快速修复,尤其是当 BPF 合并入了 Linux。因为 Linux 可是公众的焦点。
|
||||
设计 BPF 及其增强功能时就考虑到生产环境级安全,它被用在大范围的生产环境里。不过你想的话,你还是可以找到一个挂起内核的方法。这种情况是偶然的,而不是必然,类似的漏洞会被快速修复,尤其是当 BPF 合并入了 Linux。因为 Linux 可是公众的焦点。
|
||||
|
||||
在开发过程中我们碰到了一些非 BPF 的漏洞,它们需要被修复:rcu 不可重入,这可能导致内核由于 funccount 挂起,在 4.6 内核版本中这个漏洞被 “bpf: map pre-alloc” 所修复,旧版本内核的漏洞暂时由 bcc 处理。还有一个是 uprobe 的内存计算问题,这导致 uprobe 分配内存失败,在 4.8 内核版本这个漏洞由 “uprobes: Fix the memcg accounting” 补丁所修复,并且该补丁还将被移植到之前版本的内核中(例如,它现在被移植到了 4.4.27 和 4.4.0-45.66 版本中)。
|
||||
在开发过程中我们碰到了一些非 BPF 的漏洞,它们需要被修复:rcu 不可重入,这可能导致内核由于 funccount 挂起,在 4.6 内核版本中这个漏洞被 “bpf: map pre-alloc” 补丁集所修复,旧版本内核的漏洞 bcc 有个临时处理方案。还有一个是 uprobe 的内存计算问题,这导致 uprobe 分配内存失败,在 4.8 内核版本这个漏洞由 “uprobes: Fix the memcg accounting” 补丁所修复,并且该补丁还将被移植到之前版本的内核中(例如,它现在被移植到了 4.4.27 和 4.4.0-45.66 版本中)。
|
||||
|
||||
### 为什么 Linux 追踪很耗时?
|
||||
### 为什么 Linux 追踪用了这么久才加进来?
|
||||
|
||||
首要任务被分到了若干追踪器中间:只有联合使用这些追踪器才能有作用。想要了解更多关于这个或其它方面的问题,可以看一看我在 2014 年写的 [tracing summit talk][32]。我忽视了计数器在部分方案中的效率:有些公司发现其它追踪器(SystemTap 和 LTTng)能满足他们的需求,尽管他们乐于听到 BPF 的开发进程,考虑到他们现有的解决方案,帮助 BPF 的开发就不那么重要了。
|
||||
首要任务被分到了若干追踪器中间:这些不是某个追踪器单个的事情。想要了解更多关于这个或其它方面的问题,可以看一看我在 2014 年 [tracing summit 上的讲话][32]。我忽视了部分方案的反面影响:有些公司发现其它追踪器(SystemTap 和 LTTng)能满足他们的需求,尽管他们乐于听到 BPF 的开发进程,但考虑到他们现有的解决方案,帮助 BPF 的开发就不那么重要了。
|
||||
|
||||
近两年里 BPF 仅在追踪领域得到加强。这一过程原本可以更快的,但早期缺少全职工作于 BPF 追踪的工程师。Alexei Starovoitov (BPF 领导者),Brenden Blanco (bcc 领导者),我还有其它一些开发者,都有其它的事情要做。我在 Netflix 公司花了大量时间(自由工作地),大概有 7% 的时间是花在 BPF 和 bcc 上。某种程度上这不是我的首要任务,因为我还有自己的工作(包括我的 perf-tools,一个工作在旧版本内核上的程序)。
|
||||
BPF 仅在近两年里在追踪领域得到加强。这一过程原本可以更快的,但早期缺少全职从事于 BPF 追踪的工程师。Alexei Starovoitov (BPF 领导者),Brenden Blanco (bcc 领导者),我还有其它一些开发者,都有其它的事情要做。我在 Netflix 公司花了大量时间(志愿地),大概有 7% 的时间是花在 BPF 和 bcc 上。某种程度上这不是我的首要任务,因为我还有自己的工作(包括我的 perf-tools,一个可以工作在旧版本内核上的程序)。
|
||||
|
||||
BPF 追踪已经推出了,已经有科技公司开始关注 BPF 的特点了。但我还是推荐 [Netflix 公司][31]。(如果你为了 BPF 而要聘请我,那我还是十分乐于待在 Netflix 公司的!)
|
||||
现在BPF 追踪器已经推出了,已经有科技公司开始寻找会 BPF 的人了。但我还是推荐 [Netflix 公司][31]。(如果你为了 BPF 而要聘请我,那我还是十分乐于待在 Netflix 公司的!)
|
||||
|
||||
### 使用简单
|
||||
|
||||
DTrace 和 bcc/BPF 现在的最大区别就是哪个更好使用。这取决于你要用 BPF 追踪做什么了。如果你要
|
||||
|
||||
* **使用 BPF tools/metrics**:应该是没什么区别的。工具的表现都差不多,图形用户界面的访问也类似。大部分用户通过这种方式使用 BPF。
|
||||
* **开发 tools/metrics**:bcc 的开发可难多了。DTrace 有一套自己的简单语言,D 语音,和 awk 语言相似,而 bcc 使用已有的带有库的语言(C 语言,Python 和 lua)。一个用 C 和 Python 写的 bcc 工具与仅仅用 D 语言写出来的工具相比,可能要多十多倍行数的代码,或者更多。但是很多 DTrace 工具用 shell 包装来提供参数和差错,会让代码变得十分臃肿。编程的难处是不同的:重写 bcc 更需要巧妙性,这导致某些脚本更加难开发。(尤其是 bpf_probe_read() 这类的函数,需要了解更多 BPF 的内涵知识)。当计划改进 bcc 时,这一情形将得到改善。
|
||||
* **运行常见的命令**:十分相近。用 “dtrace” 命令,DTrace 能做很多事,但 bcc 有各种工具,trace,argdist,funccount,funclatency 等等。
|
||||
* **使用 BPF 工具/度量**:应该是没什么区别的。工具的表现都差不多,图形用户界面都能取得类似度量指标。大部分用户通过这种方式使用 BPF。
|
||||
* **开发工具/度量**:bcc 的开发可难多了。DTrace 有一套自己的简单语言,D 语音,和 awk 语言相似,而 bcc 使用已有的语言(C 语言,Python 和 lua)及其类库。一个用 C 和 Python 写的 bcc 工具与仅仅用 D 语言写出来的工具相比,可能要多十多倍行数的代码,或者更多。但是很多 DTrace 工具用 shell 封装来提供参数和差错检查,会让代码变得十分臃肿。编程的难处是不同的:重写 bcc 更需要巧妙性,这导致某些脚本更加难开发。(尤其是 `bpf_probe_read()` 这类的函数,需要了解更多 BPF 的内涵知识)。当计划改进 bcc 时,这一情形将得到改善。
|
||||
* **运行常见的命令**:十分相近。通过 `dtrace` 命令,DTrace 能做很多事,但 bcc 有各种工具,`trace`、`argdist`、`funccount`、`funclatency` 等等。
|
||||
* **编写自定义的特殊命令**:使用 DTrace 的话,这就没有必要了。允许定制消息快速传递和系统快速响应,DTrace 的高级分析很快。而 bcc 现在受限于它的多种工具以及它们的适用范围。
|
||||
|
||||
简单来说,如果你只使用 BPF 工具的话,就不必关注这些差异了。如果你经验丰富,是个开发者(像我一样),目前 bcc 的使用是比较困难的。
|
||||
简单来说,如果你只使用 BPF 工具的话,就不必关注这些差异了。如果你经验丰富,是个开发者(像我一样),目前 bcc 的使用更难一些。
|
||||
|
||||
举一个 bcc 的 Python 前端的例子,下面是追踪硬盘 I/O 和 打印 I/O 容量柱状图的代码:
|
||||
举一个 bcc 的 Python 前端的例子,下面是追踪硬盘 I/O 并打印出 I/O 大小的柱状图代码:
|
||||
|
||||
```
|
||||
from bcc import BPF
|
||||
@ -281,16 +270,15 @@ except KeyboardInterrupt:
|
||||
|
||||
# output
|
||||
b["dist"].print_log2_hist("kbytes")
|
||||
|
||||
```
|
||||
|
||||
注意 Python 代码中嵌入的 C 语句(text=)。
|
||||
注意 Python 代码中嵌入的 C 语句(`text=`)。
|
||||
|
||||
这就完成了任务,但仍有改进的空间。好在我们有时间去做:人们使用 Linux 4.9 并能用上 BPF 还得好几个月呢,所以我们有时间来制造工具和前端。
|
||||
|
||||
### 高级语言
|
||||
|
||||
前端越简单,比如高级语言,所改进的可能就越不如你所期望的。绝大多数人使用封装好的工具(和 GUI),仅有少部分人能写出这些工具。但我不反对使用高级语言,比如 SystemTap,毕竟已经开发出来了。
|
||||
前端越简单,比如高级语言,所改进的可能就越不如你所期望的。绝大多数人使用封装好的工具(和图形界面),仅有少部分人能写出这些工具。但我不反对使用高级语言,比如 SystemTap,毕竟已经开发出来了。
|
||||
|
||||
```
|
||||
#!/usr/bin/stap
|
||||
@ -307,12 +295,11 @@ probe syscall.open
|
||||
{
|
||||
printf("%6d %6d %16s %s\n", uid(), pid(), execname(), filename);
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
如果拥有整合了语言和脚本的 SystemTap 前端与高性能内核内建的 BPF 后端,会不会令人满意呢?RedHat 公司的 Richard Henderson 已经在进行相关工作了,并且发布了 [初代版本][30]!
|
||||
如果拥有整合了语言和脚本的 SystemTap 前端与高性能的内置在内核中的 BPF 后端,会不会令人满意呢?RedHat 公司的 Richard Henderson 已经在进行相关工作了,并且发布了 [初代版本][30]!
|
||||
|
||||
这是 [ply][29],一个完全新颖的 BPF 高级语言:
|
||||
这是 [ply][29],一个完全新颖的 BPF 高级语言:
|
||||
|
||||
```
|
||||
#!/usr/bin/env ply
|
||||
@ -321,7 +308,6 @@ kprobe:SyS_*
|
||||
{
|
||||
$syscalls[func].count()
|
||||
}
|
||||
|
||||
```
|
||||
|
||||
这也是一份承诺。
|
||||
@ -330,30 +316,30 @@ kprobe:SyS_*
|
||||
|
||||
### 如何帮助我们
|
||||
|
||||
* **推广**:BPF 追踪目前还没有什么市场方面的进展。尽管有公司了解并在使用它(Facebook,Netflix,Github 和其它公司),但要广为人知尚需时日。分享关于 BPF 产业的文章和资源来帮助我们。
|
||||
* **推广**:BPF 追踪器目前还没有什么市场方面的进展。尽管有公司了解并在使用它(Facebook、Netflix、Github 和其它公司),但要广为人知尚需时日。你可以分享关于 BPF 的文章和资源给业内的其它公司来帮助我们。
|
||||
* **教育**:你可以撰写文章,发表演讲,甚至参与 bcc 文档的编写。分享 BPF 如何解决实际问题以及为公司带来收益的实例。
|
||||
* **解决 bcc 的问题**:参考 [bcc issue list][19],这包含了错误和需要的特性。
|
||||
* **提交错误**:使用 bcc/BPF,提交你发现的错误。
|
||||
* **创造工具**:有很多可视化的工具需要开发,请不要太草率,因为大家会先花几个小时学习使用你做的工具,所以请尽量把工具做的直观好用(参考我的 [文档][18])。就像 Mike Muuss 提及到他自己的 [ping][17] 程序:“要是我早知道这是我一生中最出名的成就,我就多开发一两天,添加更多选项。”
|
||||
* **高级语言**:如果现有的 bcc 前端语言让你很困扰,或者你能弄门更好的语言。要是你想将这门语言内建到 bcc 里面,你需要使用 libbcc。或者你可以帮助进行 SystemTap BPF 或 ply 的工作。
|
||||
* **整合图形界面**:除了 bcc 可以使用的 CLI 命令行工具,怎么让这些信息可视呢?延迟关系,火焰图等等。
|
||||
* **创造工具**:有很多可视化的工具需要开发,但请不要太草率,因为大家会先花几个小时学习使用你做的工具,所以请尽量把工具做的直观好用(参考我的[文档][18])。就像 Mike Muuss 提及到他自己的 [ping][17] 程序:“要是我早知道这是我一生中最出名的成就,我就多开发一两天,添加更多选项。”
|
||||
* **高级语言**:如果现有的 bcc 前端语言让你很困扰,或许你能弄门更好的语言。要是你想将这门语言内建到 bcc 里面,你需要使用 libbcc。或者你可以帮助 SystemTap BPF 或 ply 的工作。
|
||||
* **整合图形界面**:除了 bcc 可以使用的 CLI 命令行工具,怎么让这些信息可视呢?延迟热点图,火焰图等等。
|
||||
|
||||
### 其它追踪器
|
||||
|
||||
那么 SystemTap,ktap,sysdig,LTTng 等追踪器怎么样呢?它们有个共同点,要么使用了 BPF,要么在自己的领域做得更好。会有单独的文章介绍它们自己。
|
||||
那么 SystemTap、ktap、sysdig、LTTng 等追踪器怎么样呢?它们有个共同点,要么使用了 BPF,要么在自己的领域做得更好。会有单独的文章介绍它们自己。
|
||||
|
||||
至于 DTrace ?我们公司目前还在基于 FreeBSD 系统的 CDN 中使用它。
|
||||
|
||||
### 更多 bcc/BPF 的信息
|
||||
### 更多 bcc/BPF 的信息
|
||||
|
||||
我已经写了一篇 [bcc/BPF Tool End-User Tutorial][28],一篇 [bcc Python Developer's Tutorial][27],一篇 [bcc/BPF Reference Guide][26],和已经写好的有用的 [/tools][25],每一个工具都有一个 [example.txt][24] 文件和 [man page][23]。我之前写过的关于 bcc 和 BPF 的文章有:
|
||||
我已经写了一篇《[bcc/BPF 工具最终用户教程][28]》,一篇《[bcc Python 开发者教程][27]》,一篇《[bcc/BPF 参考手册][26]》,并提供了一些有用的[工具][25],每一个工具都有一个 [example.txt][24] 文件和 [man page][23]。我之前写过的关于 bcc 和 BPF 的文章有:
|
||||
|
||||
* [eBPF: One Small Step][16] (以后就叫做 BPF)
|
||||
* [eBPF: One Small Step][16] (后来就叫做 BPF)
|
||||
* [bcc: Taming Linux 4.3+ Tracing Superpowers][15]
|
||||
* [Linux eBPF Stack Trace Hack][14] (现在官方支持追踪堆栈了)
|
||||
* [Linux eBPF Off-CPU Flame Graph][13] (" " ")
|
||||
* [Linux Wakeup and Off-Wake Profiling][12] (" " ")
|
||||
* [Linux Chain Graph Prototype][11] (" " ")
|
||||
* [Linux eBPF Off-CPU Flame Graph][13]
|
||||
* [Linux Wakeup and Off-Wake Profiling][12]
|
||||
* [Linux Chain Graph Prototype][11]
|
||||
* [Linux eBPF/bcc uprobes][10]
|
||||
* [Linux BPF Superpowers][9]
|
||||
* [Ubuntu Xenial bcc/BPF][8]
|
||||
@ -369,22 +355,22 @@ kprobe:SyS_*
|
||||
|
||||
### 致谢
|
||||
|
||||
* Van Jacobson and Steve McCanne,他是最早将 BPF 应用到包过滤的。
|
||||
* Barton P. Miller,Jeffrey K. Hollingsworth,and Jon Cargille,发明了动态追踪,并发表文章《Dynamic Program Instrumentation for Scalable Performance Tools》,可扩展高性能计算协议 (SHPCC),于田纳西州诺克斯维尔市,1994 年 5 月发表。
|
||||
* kerninst (ParaDyn, UW-Madison), an early dynamic tracing tool that showed the value of dynamic tracing (late 1990's).(早期的能够显示动态追踪数值的动态追踪工具,稍晚于 1990 年)
|
||||
* Mathieu Desnoyers (of LTTng),内核的主要开发者,主导 tracepoints 项目。
|
||||
* Van Jacobson 和 Steve McCanne,他们创建了最初用作过滤器的 BPF 。
|
||||
* Barton P. Miller,Jeffrey K. Hollingsworth,and Jon Cargille,发明了动态追踪,并发表论文《Dynamic Program Instrumentation for Scalable Performance Tools》,可扩展高性能计算协议 (SHPCC),于田纳西州诺克斯维尔市,1994 年 5 月发表。
|
||||
* kerninst (ParaDyn, UW-Madison),展示了动态跟踪的价值的早期动态跟踪工具(上世纪 90 年代后期)
|
||||
* Mathieu Desnoyers (在 LTTng),内核的主要开发者,主导 tracepoints 项目。
|
||||
* IBM 开发的作为 DProbes 一部分的 kprobes,DProbes 在 2000 年时曾与 LTT 一起提供 Linux 动态追踪,但没有整合到一起。
|
||||
* Bryan Cantrill, Mike Shapiro, and Adam Leventhal (Sun Microsystems),DTrace 的核心成员,DTrace 是一款很棒的动态追踪工具,安全而且简单(2004 年)。考虑到动态追踪的技术,DTrace 是科技的重要转折点:它很安全,默认安装在 Solaris 以及其它以可靠性著称的系统里。
|
||||
* Bryan Cantrill, Mike Shapiro, and Adam Leventhal (Sun Microsystems),DTrace 的核心开发者,DTrace 是一款很棒的动态追踪工具,安全而且简单(2004 年)。对于动态追踪技术,DTrace 是科技的重要转折点:它很安全,默认安装在 Solaris 以及其它以可靠性著称的系统里。
|
||||
* 来自 Sun Microsystems 的各部门的许多员工,促进了 DTrace,为我们带来了高级系统追踪的意识。
|
||||
* Roland McGrath (at Red Hat),utrace 项目的主要开发者,utrace 变成了后来的 uprobes。
|
||||
* Alexei Starovoitov (PLUMgrid, then Facebook), 加强版 BPF(可编程内核容器)的主要开发者。
|
||||
* 那些帮助反馈,提交代码、测试以及针对增强版 BPF 补丁(搜索 BPF 的 lkml)的 Linux 内核工程师: Wang Nan, Daniel Borkmann, David S. Miller, Peter Zijlstra, 以及其它很多人。
|
||||
* Roland McGrath (在 Red Hat),utrace 项目的主要开发者,utrace 变成了后来的 uprobes。
|
||||
* Alexei Starovoitov (PLUMgrid, 后来是 Facebook),加强版 BPF(可编程内核部件)的主要开发者。
|
||||
* 那些帮助反馈、提交代码、测试以及针对增强版 BPF 补丁(请在 lkml 搜索 BPF)的 Linux 内核工程师: Wang Nan、 Daniel Borkmann、 David S. Miller、 Peter Zijlstra 以及其它很多人。
|
||||
* Brenden Blanco (PLUMgrid),bcc 的主要开发者。
|
||||
* Sasha Goldshtein (Sela) 开发了 bcc 中可用的 tracepoint,和功能最强大的 bcc 工具 trace 及 argdist,帮助 USDT 项目的开发。
|
||||
* Sasha Goldshtein (Sela) 开发了 bcc 中的跟踪点支持,和功能最强大的 bcc 工具 trace 及 argdist,帮助 USDT 项目的开发。
|
||||
* Vicent Martí 和其它 Github 上的工程师,为 bcc 编写了基于 lua 的前端,帮助 USDT 部分项目的开发。
|
||||
* Allan McAleavy, Mark Drayton,和其他的改进 bcc 的贡献者。
|
||||
* Allan McAleavy、 Mark Drayton,和其他的改进 bcc 的贡献者。
|
||||
|
||||
感觉 Netflix 提供环的境和支持,让我能够编写 BPF 和 bcc tracing 并完成它们。开发追踪工具(使用 TNF/prex, DTrace, SystemTap, ktap, ftrace, perf, and now bcc/BPF)和写书、博客以及评论,我已经编写了多年的追踪工具。
|
||||
感觉 Netflix 提供的环境和支持,让我能够编写 BPF 和 bcc 跟踪器并完成它们。我已经编写了多年的追踪工具(使用 TNF/prex、DTrace、SystemTap、ktap、ftrace、perf,现在是 bcc/BPF),并写书、博客以及评论,
|
||||
|
||||
最后,感谢 [Deirdré][20] 编辑了另外一篇文章。
|
||||
|
||||
@ -392,9 +378,9 @@ kprobe:SyS_*
|
||||
|
||||
Linux 没有 DTrace(语言),但它现在有了,或者说拥有了 DTraceTookit(工具)。
|
||||
|
||||
通过内核构建的 BPF 引擎补丁,Linux 4.9 内核有用来支持现代化追踪的最后一项功能。内核支持这一最难的部分已经做完了。今后的任务包括更多的命令行执行工具,可选的高级语言和图形用户界面。
|
||||
通过增强内置的 BPF 引擎,Linux 4.9 内核拥有了用来支持现代化追踪的最后一项能力。内核支持这一最难的部分已经做完了。今后的任务包括更多的命令行执行工具,以及高级语言和图形用户界面。
|
||||
|
||||
对于性能分析产品的客户,这也是一件好事:你能查看延迟柱状图和热点图,CPU 运行和休眠的火焰图,拥有更好的时延断点和更低耗的工具。我们现在用的追踪和处理程序是没有效率的方式。
|
||||
对于性能分析产品的客户,这也是一件好事:你能查看延迟柱状图和热点图,CPU 处理和 CPU 之外的火焰图,拥有更好的时延断点和更低耗的工具。在用户空间按包跟踪和处理是没有效率的方式。
|
||||
|
||||
那么你什么时候会升级到 Linux 4.9 呢?一旦官方发布,新的性能测试工具就来了:`apt-get install bcc-tools` 。
|
||||
|
||||
@ -407,10 +393,8 @@ Brendan
|
||||
via: http://www.brendangregg.com/blog/2016-10-27/dtrace-for-linux-2016.html
|
||||
|
||||
作者:[Brendan Gregg][a]
|
||||
|
||||
译者:[GitFuture](https://github.com/GitFuture)
|
||||
|
||||
校对:[校对者ID](https://github.com/校对者ID)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
@ -1,16 +1,17 @@
|
||||
# 你会考虑乘坐无人驾驶汽车吗?
|
||||
你会考虑乘坐无人驾驶汽车吗?
|
||||
==================
|
||||
|
||||
![](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2016/10/Writers-Opinion-Driverless-Car-Featured.jpg "你会考虑乘坐无人驾驶汽车吗?")
|
||||
|
||||
科技在经历重大进展。最近我们经历的是如苹果手表及各种克隆,FitBit活动智能设备, 谷歌眼镜等可穿戴设备。看起来下一个就是人们研究了很长时间的无人驾驶汽车了。
|
||||
科技在经历重大进展。最近我们经历的是如苹果手表及各种克隆品、FitBit 活动智能设备、谷歌眼镜等可穿戴设备。看起来下一个就是人们研究了很长时间的无人驾驶汽车了。
|
||||
|
||||
这些汽车,有时也叫做自动汽车,自动驾驶汽车,或机器人汽车,确实可以依靠技术自己驾驶。它们能探测周边环境,如障碍物和标志,并使用 GPS 找到自己的路线。但是它们驾驶起来安全吗?我们请教我们的科技作者,“你会考虑乘坐无人驾驶汽车吗?”
|
||||
这些汽车,有时也叫做自动汽车、自动驾驶汽车,或机器人汽车,确实可以依靠技术自己驾驶。它们能探测周边环境,如障碍物和标志,并使用 GPS 找到自己的路线。但是它们驾驶起来安全吗?我们请教我们的科技作者,“你会考虑乘坐无人驾驶汽车吗?”
|
||||
|
||||
### 我们的观点
|
||||
|
||||
**Derrik** 说他会乘坐无人驾驶汽车,因为 “_技术早就存在,而且很多聪明能干的人研究了很长时间。_” 他承认它们还是有些问题,但他相信很多事故的发生是因为有人的参与。如果不考虑人,他认为乘坐无人驾驶汽车会“_难以置信的安全_。”
|
||||
|
||||
对 **Phil**来说,这些汽车让他“紧张”,但他也承认这是他想象出的,因为他从没乘坐过。他同意 Derrik 这些技术是高度发达的观点,也知道它的原理,但仍然认为“_ 自己新技术接受缓慢,不会购买这类车_” 他甚至坦白说平时很少使用定速巡航。他认为依赖它太多的司机会让他感到不安全。
|
||||
对 **Phil** 来说,这些汽车让他“紧张”,但他也承认这是他想象出的,因为他从没乘坐过。他同意 Derrik 这些技术是高度发达的观点,也知道它的原理,但仍然认为“_他自己对新技术接受缓慢,不会购买这类车_” 他甚至坦白说平时很少使用定速巡航。他认为依赖它太多的司机会让他感到不安全。
|
||||
|
||||
![writers-opinion-driverless-car](https://maketecheasier-2d0f.kxcdn.com/assets/uploads/2016/10/Writers-Opinion-Driverless-Car.jpg "编辑对无人驾驶汽车的观点")
|
||||
|
||||
@ -18,25 +19,22 @@
|
||||
|
||||
他是一个“焦虑型乘客”, 更喜欢控制整个局面。 对他来说,他的车子在哪里开很重要。如果是以低速在城市中驾驶他感觉还好,但如果是在“宽度不足两车道的弯弯曲曲的英国乡村道路”上,则绝不可以。他和 Phil 都认为英国道路与美国道路大大不同。他建议让别人去做小白鼠, 等到确定安全了再乘坐。
|
||||
|
||||
对 **Mahesh**来说, 他绝对会乘坐无人驾驶汽车,因为他知道这些汽车公司“ 拥有坚实的安全技术,决不会让他们的顾客去冒险。 ” 他承认安全与否还与车辆行驶的道路有关。
|
||||
对 **Mahesh**来说, 他绝对会乘坐无人驾驶汽车,因为他知道这些汽车公司“_拥有坚实的安全技术,决不会让他们的顾客去冒险。_” 他承认安全与否还与车辆行驶的道路有关。
|
||||
|
||||
我的观点有些像这些观点的折中。虽然平时我会快速地投入到新科技中,但如果要拿生命去冒险,我不会那么做。我承认这些汽车发展了很久,应该很安全。而且坦率地说,很多司机比无人驾驶汽车危险得多。但和 Robert 一样,我想我会让其他人去做小白鼠,等到它更普遍了再去乘坐。
|
||||
|
||||
|
||||
### 你的观点
|
||||
|
||||
在这个问题上,你的观点是什么呢? 你会信任新生的科学技术呢,还是乘坐无人驾驶汽车时会紧张到不行? 你会考虑乘坐无人驾驶汽车吗? 在下面的评论里加入讨论吧。
|
||||
|
||||
<small style="box-sizing: inherit; font-size: 16px;">图片来自: [Steve Jurvetson][4] 和 [Steve Jurvetson at Wikimedia Commons][3]</small>
|
||||
图片来自: [Steve Jurvetson][4] 和 [Steve Jurvetson at Wikimedia Commons][3]
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.maketecheasier.com/riding-driverless-car/?utm_medium=feed&utm_source=feedpress.me&utm_campaign=Feed%3A+maketecheasier
|
||||
via: https://www.maketecheasier.com/riding-driverless-car/
|
||||
|
||||
作者:[Laura Tucker][a]
|
||||
|
||||
译者:[willcoderwang](https://github.com/willcoderwang)
|
||||
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
202
published/201612/20161030 I dont understand Pythons Asyncio.md
Normal file
202
published/201612/20161030 I dont understand Pythons Asyncio.md
Normal file
@ -0,0 +1,202 @@
|
||||
雾里看花之 Python Asyncio
|
||||
===============
|
||||
|
||||
最近我开始发力钻研 Python 的新 [asyncio][4] 模块。原因是我需要做一些事情,使用事件 IO 会使这些事情工作得更好,炙手可热的 asynio 正好可以用来牛刀小试。从试用的经历来看,该模块比我预想的复杂许多,我现在可以非常肯定地说,我不知道该如何恰当地使用 asyncio。
|
||||
|
||||
从 Twisted 框架借鉴一些经验来理解 asynio 并非难事,但是,asyncio 包含众多的元素,我开始动摇,不知道如何将这些孤立的零碎拼图组合成一副完整的图画。我已没有足够的智力提出任何更好的建议,在这里,只想分享我的困惑,求大神指点。
|
||||
|
||||
|
||||
#### 原语
|
||||
|
||||
*asyncio* 通过<ruby>协程<rt>coroutines</rt></ruby> 的帮助来实现异步 IO。最初它是通过 `yield` 和 `yield from` 表达式实现的一个库,因为 Python 语言本身演进的缘故,现在它已经变成一个更复杂的怪兽。所以,为了在同一个频道讨论下去,你需要了解如下一些术语:
|
||||
|
||||
* 事件循环
|
||||
* 事件循环策略
|
||||
* awaitable
|
||||
* 协程函数
|
||||
* 老式协程函数
|
||||
* 协程
|
||||
* 协程封装
|
||||
* 生成器(generator)
|
||||
* future
|
||||
* 并发的future
|
||||
* 任务(task)
|
||||
* 句柄
|
||||
* 执行器(executor)
|
||||
* 传输(transport)
|
||||
* 协议
|
||||
|
||||
此外,Python 还新增了一些新的特殊方法:
|
||||
* `__aenter__` 和 `__aenter__`,用于异步块操作
|
||||
* `__aiter__` 和 `__anext__ `,用于异步迭代器(异步循环和异步推导)。为了更强大些,协议已经改变过一次了。 在 Python 3.5 它返回一个 awaitable(这是个协程);在 3.6它返回一个新的异步生成器。
|
||||
* `__await__`,用于自定义的 awaitable
|
||||
|
||||
你还需要了解相当多的内容,文档涵盖了那些部分。尽管如此,我做了一些额外说明以便对其有更好的理解:
|
||||
|
||||
### 事件循环
|
||||
|
||||
asyncio 事件循环和你第一眼看上去的略有不同。表面看,每个线程都有一个事件循环,然而事实并非如此。我认为它们应该按照如下的方式工作:
|
||||
* 如果是主线程,当调用 `asyncio.get_event_loop()` 时创建一个事件循环。
|
||||
* 如果是其它线程,当调用 `asyncio.get_event_loop()` 时返回运行时错误。
|
||||
* 当前线程可以使用 `asyncio.set_event_loop()` 在任何时间节点绑定事件循环。该事件循环可由 `asyncio.new_evet_loop()` 函数创建。
|
||||
* 事件循环可以在不绑定到当前线程的情况下使用。
|
||||
* `asyncio.get_event_loop()` 返回绑定线程的事件循环,而非当前运行的事件循环。
|
||||
|
||||
这些行为的组合是超混淆的,主要有以下几个原因。 首先,你需要知道这些函数被委托到全局设置的底层事件循环策略。 默认是将事件循环绑定到线程。 或者,如果需要的话,可以在理论上将事件循环绑定到一个 greenlet 或类似的。 然而,重要的是要知道库代码不控制策略,因此不能推断 asyncio 将适用于线程。
|
||||
|
||||
其次,asyncio 不需要通过策略将事件循环绑定到上下文。 事件循环可以单独工作。 但是这正是库代码的第一个问题,因为协同程序或类似的东西并不知道哪个事件循环负责调度它。 这意味着,如果从协程中调用 `asyncio.get_event_loop()`,你可能没有机会取得事件循环。 这也是所有 API 均采用可选的显式事件循环参数的原因。 举例来说,要弄清楚当前哪个协程正在运行,不能使用如下调用:
|
||||
|
||||
```
|
||||
def get_task():
|
||||
loop = asyncio.get_event_loop()
|
||||
try:
|
||||
return asyncio.Task.get_current(loop)
|
||||
except RuntimeError:
|
||||
return None
|
||||
```
|
||||
|
||||
相反,必须显式地传递事件循环。 这进一步要求你在库代码中显式地遍历事件循环,否则可能发生很奇怪的事情。 我不知道这种设计的思想是什么,但如果不解决这个问题(例如 `get_event_loop()` 返回实际运行的事件循环),那么唯一有意义的其它方案是明确禁止显式事件循环传递,并要求它绑定到当前上下文(线程等)。
|
||||
|
||||
由于事件循环策略不提供当前上下文的标识符,因此库也不可能以任何方式“索引”到当前上下文。 也没有回调函数用来监视这样的上下文的拆除,这进一步限制了实际可以开展的操作。
|
||||
|
||||
### awaitable 与<ruby>协程<rt>coroutine</rt></ruby>
|
||||
|
||||
以我的愚见,Python 最大的设计错误是过度重载迭代器。它们现在不仅用于迭代,而且用于各种类型的协程。 Python 中迭代器最大的设计错误之一是如果 `StopIteration` 没有被捕获形成的空泡。 这可能导致非常令人沮丧的问题,其中某处的异常可能导致其它地方的生成器或协同程序中止。 这是一个长期存在的问题,基于 Python 的模板引擎如 Jinja 经常面临这种问题。 该模板引擎在内部渲染为生成器,并且当由于某种原因的模板引起 `StopIteration` 时,渲染就停止在那里。
|
||||
|
||||
Python 慢慢认识到了过度重载的教训。 首先在 3.x 版本加入 asyncio 模块,并没有语言级支持。 所以自始至终它不过仅仅是装饰器和生成器而已。 为了实现 `yield from` 以及其它东西,`StopIteration` 再次重载。 这导致了令人困惑的行为,像这样:
|
||||
|
||||
```
|
||||
>>> def foo(n):
|
||||
... if n in (0, 1):
|
||||
... return [1]
|
||||
... for item in range(n):
|
||||
... yield item * 2
|
||||
...
|
||||
>>> list(foo(0))
|
||||
[]
|
||||
>>> list(foo(1))
|
||||
[]
|
||||
>>> list(foo(2))
|
||||
[0, 2]
|
||||
```
|
||||
|
||||
没有错误,没有警告。只是不是你所期望的行为。 这是因为从一个作为生成器的函数中 `return` 的值实际上引发了一个带有单个参数的 `StopIteration`,它不是由迭代器协议捕获的,而只是在协程代码中处理。
|
||||
|
||||
在 3.5 和 3.6 有很多改变,因为现在除了生成器我们还有协程对象。除了通过封装生成器来生成协程,没有其它可以直接生成协程的单独对象。它是通过用给函数加 `async` 前缀来实现。 例如 `async def x()` 会产生这样的协程。 现在在 3.6,将有单独的异步生成器,它通过触发 `AsyncStopIteration` 保持其独立性。 此外,对于Python 3.5 和更高版本,导入新的 future 对象(`generator_stop`),如果代码在迭代步骤中触发 `StopIteration`,它将引发 `RuntimeError`。
|
||||
|
||||
为什么我提到这一切? 因为老的实现方式并未真的消失。 生成器仍然具有 `send` 和 `throw` 方法以及协程仍然在很大程度上表现为生成器。你需要知道这些东西,它们将在未来伴随你相当长的时间。
|
||||
|
||||
为了统一很多这样的重复,现在我们在 Python 中有更多的概念了:
|
||||
|
||||
* awaitable:具有`__await__`方法的对象。 由本地协同程序和旧式协同程序以及一些其它程序实现。
|
||||
* 协程函数(coroutinefunction):返回原生协程的函数。 不要与返回协程的函数混淆。
|
||||
* 协程(coroutine): 原生的协程程序。 注意,目前为止,当前文档不认为老式 asyncio 协程是协程程序。 至少 `inspect.iscoroutine` 不认为它是协程。 尽管它被 `future/awaitable` 分支接纳。
|
||||
|
||||
特别令人困惑的是 `asyncio.iscoroutinefunction` 和 `inspect.iscoroutinefunction` 正在做不同的事情,这与 `inspect.iscoroutine` 和 `inspect.iscoroutinefunction` 情况相同。 值得注意的是,尽管 `inspect` 在类型检查中不知道有关 asycnio 旧式协程函数的任何信息,但是当您检查 awaitable 状态时它显然知道它们,即使它与 `__await__` 不一致。
|
||||
|
||||
### <ruby>协程封装器<rt>coroutine wrapper</rt></ruby>
|
||||
|
||||
每当你运行 `async def` ,Python 就会调用一个线程局部的协程封装器。它由 `sys.set_coroutine_wrapper` 设置,并且它是可以包装这些东西的一个函数。 看起来有点像如下代码:
|
||||
|
||||
```
|
||||
>>> import sys
|
||||
>>> sys.set_coroutine_wrapper(lambda x: 42)
|
||||
>>> async def foo():
|
||||
... pass
|
||||
...
|
||||
>>> foo()
|
||||
__main__:1: RuntimeWarning: coroutine 'foo' was never awaited
|
||||
42
|
||||
```
|
||||
|
||||
在这种情况下,我从来没有实际调用原始的函数,只是给你一个提示,说明这个函数可以做什么。 目前我只能说它总是线程局部有效,所以,如果替换事件循环策略,你需要搞清楚如何让协程封装器在相同的上下文同步更新。创建的新线程不会从父线程继承那些标识。
|
||||
|
||||
这不要与 asyncio 协程封装代码混淆。
|
||||
|
||||
### awaitable 和 future
|
||||
|
||||
有些东西是 awaitable 的。 据我所见,以下概念被认为是 awaitable:
|
||||
|
||||
* 原生的协程
|
||||
* 配置了假的 `CO_ITERABLE_COROUTINE` 标识的生成器(文中有涉及)
|
||||
* 具有 `__await__` 方法的对象
|
||||
|
||||
除了生成器由于历史遗留的原因不使用之外,其它的对象都使用 `__await__` 方法。 `CO_ITERABLE_COROUTINE` 标志来自哪里?它来自一个协程封装器(现在与 `sys.set_coroutine_wrapper` 有些混淆),即 `@asyncio.coroutine`。 通过一些间接方法,它使用 `types.coroutine`(现在与 `types.CoroutineType` 或 `asyncio.coroutine` 有些混淆)封装生成器,并通过另外一个标志 `CO_ITERABLE_COROUTINE` 重新创建内部代码对象。
|
||||
|
||||
所以既然我们知道这些东西是什么,那么什么是 future? 首先,我们需要澄清一件事情:在 Python 3 中,实际上有两种(完全不兼容)的 future 类型:`asyncio.futures.Future` 和 `concurrent.futures.Future`。 其中一个出现在另一个之前,但它们都仍然在 asyncio 中使用。 例如,`asyncio.run_coroutine_threadsafe()` 将调度一个协程到在另一个线程中运行的事件循环,但它返回一个 `concurrent.futures.Future` 对象,而不是 `asyncio.futures.Future` 对象。 这是有道理的,因为只有 `concurrent.futures.Future` 对象是线程安全的。
|
||||
|
||||
所以现在我们知道有两个不兼容的 future,我们应该澄清哪个 future 在 asyncio 中。 老实说,我不完全确定差异在哪里,但我打算暂时称之为“最终”。它是一个最终将持有一个值的对象,当还在计算时你可以对最终结果做一些处理。 future 对象的一些变种称为 deferred,还有一些叫做 promise。 我实在难以理解它们真正的区别。
|
||||
|
||||
你能用一个 future 对象做什么? 你可以关联一个准备就绪时将被调用的回调函数,或者你可以关联一个 future 失败时将被触发的回调函数。 此外,你可以 `await` 它(它实现`__await__`,因此可等待),此外,future 也可以取消。
|
||||
|
||||
那么你怎样才能得到这样的 future 对象? 通过在 awaitable 对象上调用 `asyncio.ensure_future`。它会把一个旧版的生成器转变为 future 对象。 然而,如果你阅读文档,你会读到 `asyncio.ensure_future` 实际上返回一个`task`(任务)。 那么问题来了,什么是任务?
|
||||
|
||||
### 任务
|
||||
|
||||
任务(task)某种意义上是一个封装了协程的 futur 对象。它的工作方式和 future 类似,但它也有一些额外的方法来提取所包含的协程的当前堆栈。 我们已经见过了在前面提到过的任务,因为它是通过 `Task.get_current` 确定事件循环当前正在做什么的主要方式。
|
||||
|
||||
在如何取消工作方面,任务和 future 也有区别,但这超出了本文的范围。“取消”是它们自己最大的问题。 如果你处于一个协程中,并且知道自己正在运行,你可以通过前面提到的 `Task.get_current` 获取自己的任务,但这需要你知道自己被派遣在哪个事件循环,该事件循环可能是、也可能不是已绑定的那个线程。
|
||||
|
||||
协程不可能知道它与哪个循环一起使用。`task` 也没有提供该信息的公共 API。 然而,如果你确实可以获得一个任务,你可以访问 `task._loop`,通过它反指到事件循环。
|
||||
|
||||
### 句柄
|
||||
|
||||
除了上面提到的所有一切还有句柄。 句柄是等待执行的不透明对象,不可等待,但可以被取消。 特别是如果你使用 `call_soon` 或者 `call_soon_threadsafe`(还有其它一些)调度执行一个调用,你可以获得句柄,然后使用它尽力尝试取消执行,但不能等待实际调用生效。
|
||||
|
||||
### <ruby>执行器<rt>Executor</rt></ruby>
|
||||
|
||||
因为你可以有多个事件循环,但这并不意味着每个线程理所当然地应用多个事件循环,最常见的情形还是一个线程一个事件循环。 那么你如何通知另一个事件循环做一些工作? 你不能到另一个线程的事件循环中执行回调函数并获取结果。 这种情况下,你需要使用执行器。
|
||||
|
||||
<ruby>执行器<rt>Executor</rt></ruby>来自 `concurrent.futures`,它允许你将工作安排到本身未发生事件的线程中。 例如,如果在事件循环中使用 `run_in_executor` 来调度将在另一个线程中调用的函数。 其返回结果是 asyncio 协程,而不是像 `run_coroutine_threadsafe` 这样的并发协程。 我还没有足够的心智来弄清楚为什么设计这样的 API,应该如何使用,以及什么时候使用。 文档中建议执行器可以用于构建多进程。
|
||||
|
||||
### 传输和协议
|
||||
|
||||
我总是认为传输与协议也凌乱不堪,实际这部分内容基本上是对 Twisted 的逐字拷贝。详情毋庸赘述,请直接阅读相关文档。
|
||||
|
||||
### 如何使用 asyncio
|
||||
|
||||
现在我们已经大致了解 asyncio,我发现了一些模式,人们似乎在写 asyncio 代码时使用:
|
||||
|
||||
* 将事件循环传递给所有协程。 这似乎是社区中一部分人的做法。 把事件循环信息提供给协程为协程获取自己运行的任务提供了可能性。
|
||||
* 或者你要求事件循环绑定到线程,这也能达到同样的目的。 理想情况下两者都支持。 可悲的是,社区已经分化。
|
||||
* 如果想使用上下文数据(如线程本地数据),你可谓是运气不佳。 最流行的变通方法显然是 atlassian 的 `aiolocals`,它基本上需要你手动传递上下文信息到协程,因为解释器不为此提供支持。 这意味着如果你用一个工具类库生成协程,你将失去上下文。
|
||||
* 忽略 Python 中的旧式协程。 只使用 3.5 版本中 `async def` 关键字和协程。 你总可能要用到它们,因为在老版本中,没有异步上下文管理器,这是非常必要的资源管理。
|
||||
* 学习重新启动事件循环进行善后清理。 这部分功能和我预想的不同,我花了比较长的时间来厘清它的实现。清理操作的最好方式是不断重启事件循环直到没有等待事件。 遗憾的是没有什么通用的模式来处理清理操作,你只能用一些丑陋的临时方案糊口度日。 例如 aiohttp 的 web 支持也做这个模式,所以如果你想要结合两个清理逻辑,你可能需要重新实现它提供的工具助手,因为该助手功能实现后,它彻底破坏了事件循环的设计。 当然,它不是我见过的第一个干这种坏事的库 :(。
|
||||
* 使用子进程是不明显的。 你需要一个事件循环在主线程中运行,我想它是在监听信号事件,然后分派到其它事件循环。 这需要通过 `asyncio.get_child_watcher().attach_loop(...)` 通知循环。
|
||||
* 编写同时支持异步和同步的代码在某种程度上注定要失败。 尝试在同一个对象上支持 `with` 和 `async with` 是危险的事情。
|
||||
* 如果你想给一个协程起个更好的名字,弄清楚为什么它没有被等待,设置 `__name__`没有帮助。 你需要设置 `__qualname__` 而不是打印出错误消息来。
|
||||
* 有时内部类型交换会使你麻痹。 特别是 `asyncio.wait()` 函数将确保所有的事情都是 future,这意味着如果你传递协程,你将很难发现你的协程是否已经完成或者正在等待,因为输入对象不再匹配输出对象。 在这种情况下,唯一真正理智的做法是确保前期一切都是 future。
|
||||
|
||||
### 上下文数据
|
||||
|
||||
除了疯狂的复杂性和对如何更好地编写 API 缺乏理解,我最大的问题是完全缺乏对上下文本地数据的考虑。这是 Node 社区现在学习的东西。`continuation-local-storage` 存在,但该实现被接受的太晚。持续本地存储和类似的概念常用于在并发环境中实施安全策略,并且该信息的损坏可能导致严重的安全问题。
|
||||
|
||||
事实上,Python 甚至没有任何存储,这令人失望至极。我正在研究这个内容,因为我正在调查如何最好地支持 [Sentry's breadcrumbs][3] 的 asyncio,然而我并没有看到一个合理的方式做到这一点。在 asyncio 中没有上下文的概念,没有办法从通用代码中找出您正在使用的事件循环,并且如果没有 monkeypatching(运行环境下的补丁),也无法获取这些信息。
|
||||
|
||||
Node 当前正在经历如何[找到这个问题的长期解决方案][2]的过程。这个问题不容忽视,因为它在所有生态系统中反复出现过,如 JavaScript、Python 和 .NET 环境。该问题[被命名为异步上下文传播][1],其解决方案有许多名称。在 Go 中,需要使用上下文包,并明确地传递给所有 goroutine(不是一个完美的解决方案,但至少有一个)。.NET 具有本地调用上下文形式的最佳解决方案。它可以是线程上下文,Web 请求上下文或类似的东西,除非被抑制,否则它会自动传播。微软的解决方案是我们的黄金标准。我现在相信,微软在 15 年前已经解决了该问题。
|
||||
|
||||
我不知道该生态系统是否还够年轻,还可以添加逻辑调用上下文,可能现在仍然为时未晚。
|
||||
|
||||
### 个人感想
|
||||
|
||||
复杂的东西变得越来越复杂。 我没有随意使用 asyncio 的心智。它需要不断地更新所有 Python 语言的变化的知识,这很大程度上使语言本身变得复杂。 令人鼓舞的是,围绕着它的生态系统正在不断发展,只是不知道还需要几年的时间,才能带给开发者愉快和稳定的开发体验。
|
||||
|
||||
3.5 版本引入的东西(新的协程对象)非常棒。 特别是这些变化包括引入了一个合理的基础,这些都是我在早期的版本中一直期盼的。在我心中, 通过重载生成器实现协程是一个错误。 关于什么是 asyncio,我难以置喙。 这是一个非常复杂的事情,内部令人眼花缭乱。 我很难理解它工作的所有细节。你什么时候可以传递一个生成器,什么时候它必须是一个真正的协程,future 是什么,任务是什么,事件循环如何工作,这甚至还没有触碰到真正的 IO 部分。
|
||||
|
||||
最糟糕的是,asyncio 甚至不是特别快。 David Beazley 演示的它设计的 asyncio 的替代品是原生版本速度的两倍。 asyncio 巨复杂,很难理解,也无法兑现自己在主要特性上的承诺,对于它,我只想说我想静静。我知道,至少我对 asyncio 理解的不够透彻,没有足够的信心对人们如何用它构建代码给出建议。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://lucumr.pocoo.org/2016/10/30/i-dont-understand-asyncio/
|
||||
|
||||
作者:[Armin Ronacher][a]
|
||||
译者:[firstadream](https://github.com/firstadream)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://lucumr.pocoo.org/about/
|
||||
[1]:https://docs.google.com/document/d/1tlQ0R6wQFGqCS5KeIw0ddoLbaSYx6aU7vyXOkv-wvlM/edit
|
||||
[2]:https://github.com/nodejs/node-eps/pull/18
|
||||
[3]:https://docs.sentry.io/learn/breadcrumbs/
|
||||
[4]:https://docs.python.org/3/library/asyncio.html
|
306
published/201612/20161102 5 Best FPS Games For Linux.md
Normal file
306
published/201612/20161102 5 Best FPS Games For Linux.md
Normal file
@ -0,0 +1,306 @@
|
||||
Linux 下五个最佳的 FPS 游戏
|
||||
================
|
||||
|
||||
![best FPS games for linux](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/fps-games-for-linux.jpg?581)
|
||||
|
||||
开源用户久经游戏界的冷落与疏忽,他们给别的操作系统大量生产游戏,却没有几个在 Linux 上可以玩的。要在 Linux 上玩到画质好的 Linux 游戏大作,解决方案就是 [wine][26],但 wine 在开箱即用方面做的并不好。大多数画质一般的小游戏的制作者通常并不考虑为 Linux 开发或移植游戏,因为 Linux 的用户群体太小了。
|
||||
|
||||
如今,Linux 的用户规模和范畴日益增多,而且你也看到了非开源的组织也[表达了他们对开源的支持][24]。
|
||||
|
||||
我们应该对 Linux 游戏抱有期望吗?现在有能在 Linux 系统上运行的大作吗?可以在网上与其他操作系统的用户玩吗?这些问题的答案是响亮的 YES.
|
||||
|
||||
让我给你介绍一下 Linux 系统上的 5 个最好的 FPS 游戏(第一人称射击游戏)。想玩这些游戏并不太麻烦,你可以安装任何一种 Linux 系统。我们选择了五个最好的,你可以看看:
|
||||
|
||||
### **[1、 CS - 反恐精英:全球攻势(Counter-Strike: Global Offensive )][19]**
|
||||
|
||||
这个多人的第一人称射击游戏是 Hidden Patch 与 Valve Corporation 开发的游戏,它发布于 2012 年 8 月 21 日,但到 2014 年 9 月份才为 Linux 用户推出 Linux 移植版。
|
||||
|
||||
这款游戏本来是为游戏半条命(Half-Life)所开发的游戏 MOD。
|
||||
|
||||
[
|
||||
![counter strike for linux](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/counter-strike.jpg?628)
|
||||
][18]
|
||||
|
||||
这款跨平台游戏只支持 Windows、MacOS 和 Linux 用户,电视游戏机用户因为主机游戏更新速度太慢而不支持。这款 Linux 游戏包含四种游戏模式。
|
||||
|
||||
#### CS 游戏模式
|
||||
|
||||
**经典:竞技模式**
|
||||
|
||||
这是让 CS (反恐精英)出名的最有名的游戏模式,五对五,一场三十局。可以加入你同伴的队伍,也可以排队加入随机队伍的空位。
|
||||
|
||||
[
|
||||
![counter strike classic competitive](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/counter-strike-classic-competitive.jpg?654)
|
||||
][17]
|
||||
|
||||
**经典:休闲模式**
|
||||
|
||||
如果玩家不想玩之前的 30 局 16 胜模式,可以选择休闲模式,找个对手按自己的节奏打。系统会自动给玩家穿上防弹衣,也提供防御炸弹用的工具包。成功射杀敌人还有额外奖励。
|
||||
|
||||
**爆破模式**
|
||||
|
||||
爆破模式是一个快节奏的游戏模式,游戏中玩家轮流保卫一个炸弹点,防御带有起始武器装备的攻击者。这个模式里,如果你在当前局成功射杀敌人,就会在下一局获得更强的武器,最终你会获得一把强大的狙击步枪。
|
||||
|
||||
**军备竞赛模式**
|
||||
|
||||
这个模式是一种武器升级模式,玩家通过击杀敌人来得到一把升级过的武器。当你取得武器列表中最先进的武器时,你将得到一把金匕首并赢得胜利。
|
||||
|
||||
#### CS 的配置要求
|
||||
|
||||
**系统:** Ubuntu 12.04
|
||||
**处理器:** 64-bit 英特尔双核,或 AMD 2.8 GHz 处理器
|
||||
**内存:** 4 GB
|
||||
**显卡:** nVidia GeForce 8600/9600GT、ATI/AMD Radeon HD2600/3600 (Graphic Drivers: nVidia 310、AMD 12.11)、 OpenGL 2.1
|
||||
**硬盘:** 至少 15 GB 的空间
|
||||
**声卡:** OpenAL 兼容声卡
|
||||
|
||||
### **[2、 无主之地(Borderlands) 2][16]**
|
||||
|
||||
[
|
||||
![borderlands 2](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/borderlands-2_1.jpg?588)
|
||||
][15]
|
||||
|
||||
无主之地是综合了第一人称射击游戏和角色扮演游戏的角色扮演射击游戏,是 Gearbox(一个独立游戏开发组)制作的。
|
||||
|
||||
这个游戏中,四名玩家组成寻宝猎人队伍,做各种主线与支线任务找到潘多拉星球上的”传说宝库“。玩家可以在游戏里到网上与其他玩家组队。这个游戏于 2012 年 9 月 18 日正式出售。游戏采用虚幻引擎 3 和 PhysX Technology 开发。
|
||||
|
||||
#### 无主之地 2 游戏情节
|
||||
|
||||
这款游戏的游戏情节主要是完成主线任务和搜刮战利品(武器、盾、服饰等等)。游戏里有四种角色,每个角色有不同的技能和操作风格。
|
||||
|
||||
* **突击兵(Axton)** – 可以召唤“军刀炮塔“提供攻击性辅助角色;
|
||||
* **魔女(Maya)** – 可以用一个能量球将敌人暂时固定在一处;
|
||||
* **刺客(Zer0)** – 可以在短时间内进入隐身状态,并制造全息假象来迷惑敌人;
|
||||
* **狂枪手(Salvador)** – 可以暂时手持两把武器,比如拿一对火箭筒指向敌人;
|
||||
|
||||
|[
|
||||
![Axton “The Commando”](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/axton_orig.jpg)
|
||||
][4]
|
||||
|
||||
*Axton “突击兵”*
|
||||
|
||||
[
|
||||
![Zero”The Assassin”](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/zero_orig.jpg)
|
||||
][3]
|
||||
|
||||
*Zero “刺客”*
|
||||
|
||||
[
|
||||
![Maya “The Siren”](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/maya.jpg?381)
|
||||
][2]
|
||||
|
||||
*Maya “魔女”*
|
||||
|
||||
[
|
||||
![Salvador ](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/salvador.jpg?375)
|
||||
][1]
|
||||
|
||||
*Salvador “狂枪手”*
|
||||
|
||||
这款游戏受到评论家的好评。根据游戏的趣味性、游戏世界的构造,还有 RPG 系统,IGN 给这个游戏的评分是 9/10。
|
||||
|
||||
#### 无主之地 2 配置要求
|
||||
|
||||
**系统:** SteamOS、Ubuntu 14.04
|
||||
**处理器:** 英特尔双核、AMD Phenom II X4
|
||||
**处理器速度:** 2.4GHz
|
||||
**内存:** 4 GB
|
||||
**硬盘:** 13 GB
|
||||
**显卡 (NVidia):** Geforce 260
|
||||
**显卡 (VRam):** 1GB
|
||||
|
||||
无主之地 2 Linux 版目前不支持英特尔集成显卡芯片组和 ATI 芯片组。
|
||||
|
||||
### **[3、 军团要塞(Team Fortress) 2][14]**
|
||||
|
||||
[
|
||||
![team fortress 2](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/team-fortress-2_1.jpg?744)
|
||||
][13]
|
||||
|
||||
这款游戏是有史以来最受欢迎,且评分最高的游戏之一,而且它是免费的。这是 [Valve 公司][21] 制作与发售的一款第一人称在线多玩家射击游戏。这款游戏经常更新,mod、地图,还有装备也常更新。游戏的玩家也可以参与游戏更新的内容设计。游戏于 2013 年 2 月 14 日移植到 Linux 系统。
|
||||
|
||||
游戏中,玩家可以加入不同队伍,选择不同角色参与各种游戏模式(包括情报战模式和山丘之王模式)。
|
||||
|
||||
#### 军团要塞 2 游戏情节
|
||||
|
||||
游戏的故事背景中,两个队伍由两方招的雇佣兵组成,目的是保护其中一方的资产,并销毁另一方的公司资产。两个队伍名字分别代表两方的公司 - RED(保证开挖爆破,即红队)和 BLU(建筑联合同盟,即蓝队)。你可以从九名各有优势和劣势的角色挑选自己喜欢的来玩。
|
||||
|
||||
#### 军团要塞 2 游戏模式
|
||||
|
||||
**情报战模式**
|
||||
|
||||
这个模式的目的是获取一个装有情报的公文包并回到你的大本营,而要防止敌人将公文包成功带回他们的大本营。拿着公文包的玩家可以随时丢掉公文包,或者在被杀的时候掉落。如果在两分钟之内没有别人捡起公文包,公文包就会回到起点。
|
||||
|
||||
时间到的时候,分数最高的队伍获胜。
|
||||
|
||||
[
|
||||
![team fortress 2 capture flag](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/team-fortress-2_2.jpg?779)
|
||||
][12]
|
||||
|
||||
**推车模式**
|
||||
|
||||
在这个游戏模式中,地图上只有一个公文包,所以双方需要强盗公文包运送到指定地点。只有同一个队伍的人可以拿公文包,直到成功运到指定地点,或者掉落倒计时结束时公文包回到起始点。
|
||||
|
||||
[
|
||||
![team fortress special delivery](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/team-fortress-special-delivery_orig.jpg)
|
||||
][11]
|
||||
|
||||
**山丘之王**
|
||||
|
||||
这个游戏模式的目的是控制地图中心点,并坚持保卫一段时间。
|
||||
|
||||
游戏开始时,玩家无法进入守卫点,直到某方达到了进入守卫点的分数,封锁才会被解除。占领控制点的时候,游戏会开始守卫倒计时,这时对方玩家需要夺得控制权,开始他们的守卫倒计时。当某方队伍的倒计时表达到 00:00 的时候,游戏结束,占领控制点的队伍获胜。
|
||||
|
||||
[
|
||||
![team fortress king of the hill](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/team-fortress-2-kill-of-the-hill_orig.jpg)
|
||||
][10]
|
||||
|
||||
#### 军团要塞 2 配置要求
|
||||
|
||||
**系统:** Ubuntu 12.04
|
||||
**处理器:** 英特尔双核或 AMD 2.8 GHz
|
||||
**内存:** 1 GB RAM
|
||||
**显卡:** nVidia GeForce 8600/9600GT、ATI/AMD Radeon HD2600/3600 (Graphic Drivers: nVidia 310、 AMD 12.11)、OpenGL 2.1
|
||||
**网线:** 互联网链接
|
||||
**硬盘:** 15 GB 可用空间
|
||||
**声卡:** OpenAL 兼容声卡
|
||||
**其他:** 鼠标,键盘
|
||||
|
||||
### **[4、 地铁 2033 重制版(Metro 2033 redux)][9]**
|
||||
|
||||
地铁 2033 重制版由 4A 游戏工作室开发、THQ 发售。玩家以 Artyom 的角色在核战后莫斯科的废墟中生存,他需要打败一群被称为“DARKENS”的邪恶突变体。
|
||||
|
||||
[
|
||||
![metro 2033 redux](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/metro-2033-redux_orig.jpg)
|
||||
][8]
|
||||
|
||||
有时游戏里的人类也是敌人,所以为了防止被抓住,游戏种玩家应该多用隐形术并悄无声息地干掉敌人。
|
||||
|
||||
地铁 2033 受到诸多评论家的好评,其中 IGN 给的评分是 6.9/10。
|
||||
|
||||
#### 地铁 2033 游戏情节
|
||||
|
||||
游戏主要发生在莫斯科地铁中,有个别任务设在在地面上的核辐射废墟中。游戏是单人游戏,玩家需要看游戏场景片得悉重要情节。
|
||||
|
||||
游戏里玩家可以使用传统武器(左轮手枪、猎枪)。玩家需要搜查废墟或尸体获得子弹。
|
||||
|
||||
敌人分两类,一类是人,另一类是突变体。人攻击玩家的时候会躲避玩家攻击,而突变体会正面攻击,企图咬伤玩家。
|
||||
|
||||
玩家大部分时间都待在黑暗的隧道里,需要手电筒照亮路线。在地面上的时候,玩家需要防毒面具,而这个防毒面具有可能在战斗种受到损害,这样玩家就不得不再去寻找一个新的防毒面具。
|
||||
|
||||
#### 地铁 2033 配置要求
|
||||
|
||||
**最低配置**
|
||||
**系统:** 64-bit Ubuntu 12.04 或 14.04 或 Steam OS
|
||||
**处理器:** 英特尔 i5 2.7 GHz (或同等的 AMD)
|
||||
**内存:** 4 GB RAM
|
||||
**显卡:** NVIDIA Geforce 460 / AMD 5850 加 2GB VRAM
|
||||
**硬盘:** 10 GB 可用空间
|
||||
**其他:** 因为用OpenGL 4, 游戏不支持英特尔集成显卡
|
||||
|
||||
**推荐配置**
|
||||
**系统:** 64-bit Ubuntu 12.04 or 14.04 or Steam OS
|
||||
**处理器:** Intel Core i7 2.5 Ghz (or equivalent AMD)
|
||||
**内存:** 8 GB RAM
|
||||
**显卡:** NVIDIA Geforce 680 / AMD 7870 with 2GB VRAM+
|
||||
**硬盘:** 10 GB 可用空间
|
||||
**其他:** 因为用OpenGL 4, 游戏不支持英特尔集成显卡
|
||||
|
||||
### **[5、 求生之路(Left 4 Dead) 2(L4D2)][7]**
|
||||
|
||||
这是 Valve 公司制作与发售的多人协作 FPS,于 2013 年 7 月发行 Linux 版本。
|
||||
|
||||
[
|
||||
![left 4 dead 2](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/left-4-dead.jpg?731)
|
||||
][6]
|
||||
|
||||
游戏有四名幸存者供玩家选择,需要打败僵尸,即感染者。这些感染者会因为严重的精神病而极具攻击性。游戏软件里的 AI 会按照玩家的水平而提升游戏难度,使游戏更有挑战性。
|
||||
|
||||
### 求生之路 2 游戏情节
|
||||
|
||||
这个游戏里共有五个章节,其中每个章节分三到五个级别。每个章节在菜单里和加载屏幕中以电影形式出现,电影主人公是四名幸存者。
|
||||
|
||||
[
|
||||
![left 4 dead 2](http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/left-4-dead-2-gameplay.jpg?779)
|
||||
][5]
|
||||
|
||||
玩家可以看到队伍同伴的生命状况,同时也要注意射击或挥舞武器时不要误伤到同伴。
|
||||
|
||||
#### 游戏模式
|
||||
|
||||
求生之路 2 总共有 5 种游戏模式:
|
||||
|
||||
**战役模式**
|
||||
|
||||
四名玩家组成队伍,共同完成故事章节。游戏中遇到的其他幸存者都是 CPU 控制的 NPC。
|
||||
|
||||
**单人模式**
|
||||
|
||||
和战役模式相近,但队友都是 CPU 控制的 NPC。
|
||||
|
||||
**对抗模式**
|
||||
|
||||
四名操控幸存者的玩家对抗四名操控特殊感染者的玩家。每一局双方玩家都会调换角色,按幸存者局里面队伍所获得的分数计算积分。
|
||||
|
||||
**生存模式**
|
||||
|
||||
玩家会被封在某个章节地图中的一个区,游戏开始时画面会出一个计时器。玩家会按照地图里的生存时间得分,坚持的时间越长,得分越高。
|
||||
|
||||
**清道夫模式**
|
||||
|
||||
玩家分成两组,4 对 4,一组幸存者,一组感染者。幸存者需要收集大量的油桶,并装满一个发电机里,而感染者则要防止幸存者成功完成任务。
|
||||
|
||||
#### 求生之路 2 配置要求
|
||||
|
||||
**系统:** Ubuntu 12.04
|
||||
**处理器:** 英特尔双核或 AMD 2.8 GHz
|
||||
**内存:** 2 GB RAM
|
||||
**显卡:** nVidia GeForce 8600/9600GT、ATI/AMD Radeon HD2600/3600 (显卡: nVidia 310、 AMD 12.11)、 OpenGL 2.1
|
||||
**硬盘:** 13 GB 可用空间
|
||||
**声卡:** OpenAL 兼容声卡
|
||||
|
||||
### 总结
|
||||
|
||||
这些年来,Linux 已经日益受到游戏厂家们的重视,在游戏界不像以前那么受到冷落。如今的 Linux 已不像昔日,以前,别的操作系统的用户笼统的概括说“Linux 只能供程序员编程“,但如今的 Linux 已经不同了。
|
||||
|
||||
现在,你已经不需要双系统来打游戏,虽然现在的选择暂时不多,但天天都会增加。在这五个游戏中,你最喜欢那一部?在下方的评论里告诉我们吧。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.linuxandubuntu.com/home/5-best-fps-games-for-linux
|
||||
|
||||
作者:[Mohd Sohail][a]
|
||||
译者:[jayjay823](https://github.com/jayjay823)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.linuxandubuntu.com/contact-us.html
|
||||
[1]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/salvador_orig.jpg?375
|
||||
[2]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/maya_orig.jpg?381
|
||||
[3]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/zero_orig.jpg
|
||||
[4]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/axton_orig.jpg
|
||||
[5]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/left-4-dead-2-gameplay_orig.jpg?779
|
||||
[6]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/left-4-dead_orig.jpg?731
|
||||
[7]:http://store.steampowered.com/app/550/
|
||||
[8]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/metro-2033-redux_orig.jpg
|
||||
[9]:http://store.steampowered.com/app/286690/
|
||||
[10]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/team-fortress-2-kill-of-the-hill_orig.jpg
|
||||
[11]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/team-fortress-special-delivery_orig.jpg
|
||||
[12]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/team-fortress-2_2_orig.jpg?779
|
||||
[13]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/team-fortress-2_1_orig.jpg?744
|
||||
[14]:http://store.steampowered.com/app/440/
|
||||
[15]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/borderlands-2_1_orig.jpg?588
|
||||
[16]:http://store.steampowered.com/app/49520/
|
||||
[17]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/counter-strike-classic-competitive_orig.jpg?654
|
||||
[18]:http://www.linuxandubuntu.com/uploads/2/1/1/5/21152474/counter-strike_orig.jpg?628
|
||||
[19]:http://store.steampowered.com/app/730/
|
||||
[20]:http://www.linuxandubuntu.com/home/5-best-fps-games-for-linux
|
||||
[21]:http://www.valvesoftware.com/
|
||||
[22]:http://store.steampowered.com/app/70/?
|
||||
[23]:http://www.linuxandubuntu.com/home/category/games
|
||||
[24]:http://www.theverge.com/2016/9/15/12926288/microsoft-really-does-love-linux
|
||||
[25]:http://linux.com/
|
||||
[26]:https://www.winehq.org/
|
||||
[27]:http://www.linuxandubuntu.com/home/category/games
|
||||
[28]:http://www.linuxandubuntu.com/home/5-best-fps-games-for-linux
|
@ -1,13 +1,15 @@
|
||||
# 4 种简单方法让你在 Linux 下生成一个高强度密码
|
||||
在 Linux 下生成高强度密码的四种方法
|
||||
===============
|
||||
|
||||
![在 Linux 下生成一个高强度密码](https://www.ostechnix.com/wp-content/uploads/2016/11/password-720x340.jpg)
|
||||
图片来源: Google.
|
||||
![在 Linux 下生成一个高强度密码](https://www.ostechnix.com/wp-content/uploads/2016/11/password-720x340.jpg)
|
||||
|
||||
前一段时间,我们已经分享了如何 [强制用户在基于 DEB 的系统中使用高强度的密码][8] ,例如 Debian,Ubuntu,Linux Mint, Elementary OS 等系统中。那么,你可能会疑惑一个高强度的密码究竟是什么样的呢?怎么才能生成一个那样的密码呢?不用担心,下面我们将介绍 4 种简单方法让你在 Linux 中生成一个高强度密码。当然,已经有很多免费的工具或者方式来完成这个任务,但这里我们仅考虑那些简单直接的方法。下面就让我们开始吧。
|
||||
*图片来源: Google.*
|
||||
|
||||
前一段时间,我们已经分享了如何在诸如 Debian、Ubuntu、Linux Mint、Elementary OS 的基于 DEB 的系统中[强制用户使用高强度的密码][8] ,比如。那么,你可能会疑惑一个高强度的密码究竟是什么样的呢?怎么才能生成一个那样的密码呢?不用担心,下面我们将介绍 4 种简单方法让你在 Linux 中生成一个高强度密码。当然,已经有很多免费的工具或者方式来完成这个任务,但这里我们仅考虑那些简单直接的方法。下面就让我们开始吧。
|
||||
|
||||
### 1. 在 Linux 中使用 OpenSSL 来生成一个高强度密码
|
||||
|
||||
OpenSSL 在所有的类 Unix 发行版本,Solaris,Mac OS X 和 Windows 中都可以获取到。
|
||||
OpenSSL 在所有的类 Unix 发行版、Solaris、Mac OS X 和 Windows 中都可以获取到。
|
||||
|
||||
要使用 OpenSSL 生成一个随机密码,打开终端并运行下面的命令:
|
||||
|
||||
@ -74,7 +76,7 @@ Choo4aicozai3a
|
||||
![sksk_004](http://www.ostechnix.com/wp-content/uploads/2016/11/sk@sk_004.png)
|
||||
][5]
|
||||
|
||||
上面的命令将只生成 一个 14 位字符长的密码,如果要生成两个不同的 14 位字符长的密码,则可以运行:
|
||||
上面的命令将生成一个 14 位字符长的密码,如果要生成两个不同的 14 位字符长的密码,则可以运行:
|
||||
|
||||
```
|
||||
pwgen 14 2
|
||||
@ -135,30 +137,18 @@ xoiFush3ceiPhe
|
||||
|
||||
另外,pwgen 命令还有一些很实用的选项:
|
||||
|
||||
```
|
||||
-c 或 --capitalize (在密码中包含至少一个大写字母)
|
||||
|
||||
-A 或 --no-capitalize (在密码中不包含大写字母)
|
||||
|
||||
-n 或 --numerals (在密码中包含至少一个数字)
|
||||
|
||||
-0 或 --no-numerals (在密码中不包含数字)
|
||||
|
||||
-y 或 --symbols (在密码中包含至少一个特殊字符)
|
||||
|
||||
-s 或 --secure (生成完全随机的密码)
|
||||
|
||||
-B 或 --ambiguous (在密码中不包含难于区分的字母,如 0 和 o, 1 和 l)
|
||||
|
||||
-h 或 --help (输出帮助信息)
|
||||
|
||||
-H 或 --sha1=path/to/file[#seed] (使用某个给定文件的 sha1 哈希值来作为随机数的生成种子)
|
||||
|
||||
-C (按列输出生成好的密码)
|
||||
|
||||
-1 (不按列输出生成好的密码)
|
||||
|
||||
-v 或 --no-vowels (不使用任何元音字母,以防止生成下流的词语)
|
||||
- `-c` 或 `--capitalize` 在密码中包含至少一个大写字母
|
||||
- `-A` 或 `--no-capitalize` 在密码中不包含大写字母
|
||||
- `-n` 或 `--numerals` 在密码中包含至少一个数字
|
||||
- `-0` 或 `--no-numerals` 在密码中不包含数字
|
||||
- `-y` 或 `--symbols` 在密码中包含至少一个特殊字符
|
||||
- `-s` 或 `--secure` 生成完全随机的密码
|
||||
- `-B` 或 `--ambiguous` 在密码中不包含难于区分的字母,如 `0` 和 `o`、`1` 和 `l`
|
||||
- `-h` 或 `--help` 输出帮助信息
|
||||
- `-H` 或 `--sha1=path/to/file[#seed]` 使用某个给定文件的 sha1 哈希值来作为随机数的生成种子
|
||||
- `-C` 按列输出生成好的密码
|
||||
- `-1` 不按列输出生成好的密码
|
||||
- `-v` 或 `--no-vowels` 不使用任何元音字母,以防止生成下流的词语
|
||||
```
|
||||
|
||||
若想了解更多信息,请查阅其联机手册:
|
||||
@ -169,7 +159,7 @@ man pwgen
|
||||
|
||||
### 3. 在 Linux 中使用 GPG 来生成一个高强度密码
|
||||
|
||||
GPG (GnuPG 或 GNU Privacy Guard) 是一个免费的命令行程序,可以用于替代赛门铁克的 PGP 加密软件。在类 Unix 操作系统、Microsoft Windows 和 Android 中都可以获取到它。
|
||||
GPG (GnuPG 或 GNU Privacy Guard) 是一个自由开源的命令行程序,可以用于替代赛门铁克的 PGP 加密软件。在类 Unix 操作系统、Microsoft Windows 和 Android 中都可以获取到它。
|
||||
|
||||
要使用 PGP 生成 1 个长度为 14 个字符的高强度密码,请在终端中运行下面的命令:
|
||||
|
||||
@ -251,22 +241,19 @@ perl password.pl
|
||||
![sksk_002](http://www.ostechnix.com/wp-content/uploads/2016/11/sk@sk_002.png)
|
||||
][1]
|
||||
|
||||
注: 我无法找到这个脚本的原有作者,假如你知道作者的名字,请在下面的评论部分让我知晓,我将在这篇指南中添加上该作者的名字。
|
||||
注: 我无法找到这个脚本的原作者,假如你知道作者的名字,请在下面的评论部分让我知晓,我将在这篇指南中添加上该作者的名字。
|
||||
|
||||
请注意:对于生成的密码,你必须记住它,或者将它保存到电脑中一个安全的地方。我建议你记住密码并将它从系统中删除,因为这比你的系统被黑客控制要好的多。
|
||||
|
||||
伙计们,今天就是这么多了。不久我将带来另一篇有意思的文章。在此之前,敬请继续关注 OSTechNix。
|
||||
|
||||
伙计们,今天就是这么多了。不久我将带来另一篇有意思的文章。在此之前,敬请继续关注。
|
||||
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.ostechnix.com/4-easy-ways-to-generate-a-strong-password-in-linux/
|
||||
|
||||
作者:[ SK ][a]
|
||||
|
||||
作者:[SK][a]
|
||||
译者:[FSSlc](https://github.com/FSSlc)
|
||||
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
@ -0,0 +1,83 @@
|
||||
如何在 Debian 和 Ubuntu 系统上自动安装安全更新
|
||||
============================================================
|
||||
|
||||
之前已经说过,一些最优秀的系统管理员看上去(注意这里使用的词是 seem(看上去))总是很“懒”的,这句话我再同意不过了。
|
||||
|
||||
虽然这句话听起来有点荒谬,但我敢打赌在大多数情况下它是对的-不是因为他们不去做他们原本应该做的事情,而是因为他们已经让系统自动去完成这样的事情了。
|
||||
|
||||
对于 Linux 系统来说,一个最关键的需求是为相应的 Linux 版本保持更新最新的安全补丁。
|
||||
|
||||
在这篇文章中,我们将讨论如何在 Debian 和 Ubuntu 系统上进行设置,从而实现自动安装或更新重要的安装包或补丁。
|
||||
|
||||
其他的 Linux 版本:[CentOS/RHEL 配置自动安装安全更新][1]
|
||||
|
||||
不必多说,为了执行这篇文章中所讲到的任务,你需要有超级用户特权。
|
||||
|
||||
### 在 Debian/Ubuntu 上配置自动安全更新
|
||||
|
||||
首先,安装下面这些安装包:
|
||||
|
||||
```
|
||||
# aptitude update -y && aptitude install unattended-upgrades apt-listchanges -y
|
||||
```
|
||||
|
||||
`apt-listchanges` 将会通知你在升级过程中发生的改变。
|
||||
|
||||
接下来,用你最喜欢的文本编辑器打开 `/etc/apt/apt.conf.d/50unattended-upgrades`,然后在 `Unattended-Upgrade::Origins-Pattern` 块中间加入下面这行内容:
|
||||
|
||||
```
|
||||
Unattended-Upgrade::Mail "root";
|
||||
```
|
||||
最后,执行下面的命令来生成所需的配置文件(`/etc/apt/apt.conf.d/20auto-upgrades`),从而激活自动更新:
|
||||
|
||||
```
|
||||
# dpkg-reconfigure -plow unattended-upgrades
|
||||
```
|
||||
|
||||
当提示安装自动升级时,选择 'Yes':
|
||||
|
||||
[
|
||||
![在 Debian 上配置自动安装更新](http://www.tecmint.com/wp-content/uploads/2016/11/Configure-Unattended-Security-Updates-on-Debian.png)
|
||||
][2]
|
||||
|
||||
*在 Debian 上配置自动安装更新*
|
||||
|
||||
然后检查下面这两行是否已经加入到文件 `/etc/apt/apt.conf.d/20auto-upgrades` 中了:
|
||||
|
||||
```
|
||||
APT::Periodic::Update-Package-Lists "1";
|
||||
APT::Periodic::Unattended-Upgrade "1";
|
||||
```
|
||||
|
||||
增加下面这行内容使通知更加详细:
|
||||
|
||||
```
|
||||
APT::Periodic::Verbose "2";
|
||||
```
|
||||
|
||||
最后,检查 `/etc/apt/listchanges.conf` 来确保通知能被发送给 root 用户。
|
||||
|
||||
[
|
||||
![Debian 系统上提示安全更新](http://www.tecmint.com/wp-content/uploads/2016/11/Notify-Security-Updates-on-Debian.png)
|
||||
][3]
|
||||
|
||||
*在 Debian 系统上提示安全更新*
|
||||
|
||||
在这篇文章中,我们讨论了如何确保你的系统定期更新最新的安全补丁。另外,你也学习了如何设置提示,从而确保应用了新的补丁时你能够被通知到。
|
||||
|
||||
你有任何关于这篇文章的问题吗?你可以在下面的评论栏留下你的问题。我们期待收到你的回复。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/auto-install-security-updates-on-debian-and-ubuntu
|
||||
|
||||
作者:[Gabriel Cánepa][a]
|
||||
译者:[ucasFL](https://github.com/ucasFL)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 组织编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/gacanepa/
|
||||
[1]:https://linux.cn/article-8015-1.html
|
||||
[2]:http://www.tecmint.com/wp-content/uploads/2016/11/Configure-Unattended-Security-Updates-on-Debian.png
|
||||
[3]:http://www.tecmint.com/wp-content/uploads/2016/11/Notify-Security-Updates-on-Debian.png
|
@ -0,0 +1,181 @@
|
||||
在 Linux 下将 PNG 和 JPG 批量互转的四种方法
|
||||
==============
|
||||
|
||||
计算机术语中,批处理指的是用一个非交互式的程序来[执行一序列的任务][11]的方法。这篇教程里,我们会使用 Linux 命令行工具,并提供 4 种简单的处理方式来把一些 `.PNG` 格式的图像批量转换成 `.JPG` 格式的,以及转换回来。
|
||||
|
||||
虽然所有示例中我们使用的都是 `convert` 命令行工具,但是您也可以使用 `mogrify` 命令来达到同样的效果。
|
||||
|
||||
convert 命令的语法如下:
|
||||
|
||||
```
|
||||
$ convert 输入选项 输入文件 输出选项 输出文件
|
||||
|
||||
```
|
||||
|
||||
而 mogrify 的为:
|
||||
|
||||
```
|
||||
$ mogrify 选项 输入文件
|
||||
|
||||
```
|
||||
|
||||
注意:在使用 `mogrify` 命令时,默认情况下源图像文件会被转换后的新文件覆盖掉,您可以使用明确的操作选项来禁止覆盖,具体的选项可以在手册页中查询得到。
|
||||
|
||||
下面是把所有 `.PNG` 格式图像批量转换为 `.JPG` 格式的各种实现方式。如果想把 `.JPG` 转换为 `.PNG` 格式,也可使用这些命令,按需修改。
|
||||
|
||||
### 1、 使用 `ls` 和 `xargs` 命令来转换 PNG 和 JPG
|
||||
|
||||
[ls 命令](10) 可以列出所有的 png 图像文件, `xargs` 使得可以从标准输入构建和执行 `convert` 命令,从而将所有 `.png` 图像转换为 `.jpg` 图像。
|
||||
|
||||
```
|
||||
----------- 从 PNG 转换到 JPG -----------
|
||||
$ ls -1 *.png | xargs -n 1 bash -c 'convert "$0" "${0%.png}.jpg"'
|
||||
|
||||
----------- 从 JPG 转换到 PNG -----------
|
||||
$ ls -1 *.jpg | xargs -n 1 bash -c 'convert "$0" "${0%.jpg}.png"'
|
||||
|
||||
```
|
||||
|
||||
关于上面命令选项的说明:
|
||||
|
||||
1. `-1` – 告诉 ls 每行列出一个图像名称的选项标识
|
||||
2. `-n` – 指定最多参数个数,例子中为 1
|
||||
3. `-c` – 指示 bash 运行给定的命令
|
||||
4. `${0%.png}.jpg` – 设置新转换的图像文件的名字,`%` 符号用来删除源文件的扩展名
|
||||
|
||||
[
|
||||
![Convert PNG to JPG Format in Linux](http://www.tecmint.com/wp-content/uploads/2016/11/Convert-PNG-to-JPG-in-Linux.png)
|
||||
][9]
|
||||
|
||||
*Linux 中 PNG 格式转为 JPG 格式*
|
||||
|
||||
我使用 `ls -ltr` 命令按[修改的日期和时间列出所有文件][8]。
|
||||
|
||||
类似的,也可以使用上面的命令要把 `.jpg` 图像转换为 `.png` 格式,只需稍微调整就行。
|
||||
|
||||
### 2、 使用 GNU 的 `parallel` 命令来转换 PNG 和 JPG
|
||||
|
||||
GNU 的 parallel 使用户能够从标准输入并行构建和执行 shell 命令。确保您的系统上安装了 GNU Parallel,否则请使用以下适当的命令进行安装:
|
||||
|
||||
```
|
||||
$ sudo apt-get install parallel [在 Debian/Ubuntu 系统中]
|
||||
$ sudo yum install parallel [在 RHEL/CentOS 和 Fedora 系统中]
|
||||
|
||||
```
|
||||
|
||||
安装好 `parallel` 工具后,您就可以运行下面的命令来把所有从标准输入的 `.png` 图像转换成 `.jpg` 格式的图像。
|
||||
|
||||
```
|
||||
----------- 从 PNG 转换到 JPG -----------
|
||||
$ parallel convert '{}' '{.}.jpg' ::: *.png
|
||||
|
||||
----------- 从 JPG 转换到 PNG -----------
|
||||
$ parallel convert '{}' '{.}.png' ::: *.jpg
|
||||
|
||||
```
|
||||
|
||||
其中:
|
||||
|
||||
1. `{}` – 输入行替代符,代替了从输入源读取的完整行。
|
||||
2. `{.}` – 去除扩展名的输入行。
|
||||
3. `:::` – 指定输入源的符号,即上面示例的命令行,在这里 *png 或 jpg* 是命令参数。
|
||||
|
||||
[
|
||||
![Parallel Command - Converts All PNG Images to JPG Format](http://www.tecmint.com/wp-content/uploads/2016/11/Convert-PNG-to-JPG-Using-Parallel-Command.png)
|
||||
][7]
|
||||
|
||||
*Parallel 命令 – 把所有 PNG 图像转换为 JPG 格式*
|
||||
|
||||
或者,您也可以结合 [ls][6] 和 `parallel` 命令来批量转换所有图像,如图所示:
|
||||
|
||||
```
|
||||
----------- 从 PNG 转换到 JPG -----------
|
||||
$ ls -1 *.png | parallel convert '{}' '{.}.jpg'
|
||||
|
||||
----------- 从 JPG 转换到 PNG -----------
|
||||
$ ls -1 *.jpg | parallel convert '{}' '{.}.png'
|
||||
|
||||
```
|
||||
|
||||
### 3、 使用 `for` 循环命令来转换 PNG 和 JPG
|
||||
|
||||
为了避免编写 shell 脚本的繁琐,你可以从命令行执行 `for` 循环语句,如下所示:
|
||||
|
||||
```
|
||||
----------- 从 PNG 转换到 JPG -----------
|
||||
$ bash -c 'for image in *.png; do convert "$image" "${image%.png}.jpg"; echo “image $image converted to ${image%.png}.jpg ”; done'
|
||||
|
||||
----------- 从 JPG 转换到 PNG -----------
|
||||
$ bash -c 'for image in *.jpg; do convert "$image" "${image%.jpg}.png"; echo “image $image converted to ${image%.jpg}.png ”; done'
|
||||
|
||||
```
|
||||
|
||||
对上面的命令所使用的选项参数的描述:
|
||||
|
||||
1. `-c` 允许执行包括在单引号中的循环语句。
|
||||
2. `image` 变量是目录中的图像名的数量记数器。
|
||||
3. 对于每个转换操作,在 `$image` 转换为 `${image%.png}.jpg` 这行中,[echo 命令][1]通知用户 png 图像已经转换为 jpg 格式,反之亦然。
|
||||
4. `${image%.png}.jpg` 语句创建了转换后的图像名字,其中 `%` 表示去除源图像文件的扩展名。
|
||||
|
||||
[
|
||||
![for loop - Convert PNG to JPG Format](http://www.tecmint.com/wp-content/uploads/2016/11/Convert-PNG-to-JPG-Using-for-loop-Command.png)
|
||||
][5]
|
||||
|
||||
*for 循环语句 – 从 PNG 转换到 JPG 格式*
|
||||
|
||||
### 4、 使用 Shell 脚本来转换 PNG 和 JPG
|
||||
|
||||
如果你不想像前面的例子那样让你的命令行变得邋遢的话,可以写一个小脚本,如下所示:
|
||||
|
||||
注意:适当地交换 `.png` 和 `.jpg` 扩展名,如下面的例子所示,从一种格式转换到另一种格式:
|
||||
|
||||
```
|
||||
#!/bin/bash
|
||||
#convert
|
||||
for image in *.png; do
|
||||
convert "$image" "${image%.png}.jpg"
|
||||
echo “image $image converted to ${image%.png}.jpg ”
|
||||
done
|
||||
exit 0
|
||||
|
||||
```
|
||||
|
||||
把上面的脚本保存为 `convert.sh` 文件,然后使此脚本文件可执行,接着从存有图像文件的目录下执行。
|
||||
|
||||
```
|
||||
$ chmod +x convert.sh
|
||||
$ ./convert.sh
|
||||
|
||||
```
|
||||
[
|
||||
![Batch Image Convert Using Shell Script](http://www.tecmint.com/wp-content/uploads/2016/11/Batch-Image-Convert-Using-Shell-Script.png)
|
||||
][4]
|
||||
|
||||
*使用 Shell 脚本来批量图像转换*
|
||||
|
||||
总之,我们介绍了一些重要的将 .png 图像批量转换为 .jpg 格式的方法,以及再转回来。如果还想对图像进行一些优化的话, 您可以移步到 [ Linux 系统中如何压缩 png 和 jpg 图像][3]这篇指导文章。
|
||||
|
||||
您可以给我们分享一些包括 Linux 命令行工具在内的把图像从一种格式转成另一种格式的方式方法,或者在下面的评论部分畅所欲言。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/linux-image-conversion-tools/
|
||||
|
||||
作者:[Aaron Kili][a]
|
||||
译者:[runningwater](https://github.com/runningwater)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/aaronkili/
|
||||
[1]:http://www.tecmint.com/echo-command-in-linux/
|
||||
[2]:http://www.tecmint.com/tag/linux-tricks/
|
||||
[3]:http://www.tecmint.com/optimize-and-compress-jpeg-or-png-batch-images-linux-commandline/
|
||||
[4]:http://www.tecmint.com/wp-content/uploads/2016/11/Batch-Image-Convert-Using-Shell-Script.png
|
||||
[5]:http://www.tecmint.com/wp-content/uploads/2016/11/Convert-PNG-to-JPG-Using-for-loop-Command.png
|
||||
[6]:http://www.tecmint.com/tag/linux-ls-command/
|
||||
[7]:http://www.tecmint.com/wp-content/uploads/2016/11/Convert-PNG-to-JPG-Using-Parallel-Command.png
|
||||
[8]:http://www.tecmint.com/sort-ls-output-by-last-modified-date-and-time/
|
||||
[9]:http://www.tecmint.com/wp-content/uploads/2016/11/Convert-PNG-to-JPG-in-Linux.png
|
||||
[10]:http://www.tecmint.com/tag/linux-ls-command/
|
||||
[11]:http://www.tecmint.com/using-shell-script-to-automate-linux-system-maintenance-tasks/
|
@ -0,0 +1,108 @@
|
||||
怎样在 Arch Linux 终端上更改 WiFi 密码
|
||||
============================================================
|
||||
|
||||
![Update Wifi Network Password From Terminal In Arch Linux](https://www.ostechnix.com/wp-content/plugins/lazy-load/images/1x1.trans.gif)
|
||||
|
||||
自从修改了我的路由器的 WiFi 网络密码后,我的 Arch Linux 测试机就不能连接到网络了。由于我的 Arch Linux 测试机没有图形化桌面环境,我不得不在终端上更改 WiFi 密码。在图形化操作界面中,更改 WiFi 密码是很容易的。我仅仅需要打开网络管理器,就能很快更改 WiFi 网络密码。但是,我从来没有在 Arch Linux 终端上用命令行来更改 WiFi 密码。我开始在 google 上搜索相关资料,并且在 Arch Linux 论坛找到了一个好的解决办法。如果你也面临同样的问题,读完这篇文章吧,这个方法并没有那么难。
|
||||
|
||||
### 在终端更改 WiFi 网络密码
|
||||
|
||||
修改了路由器的 WiFi 密码之后,我尝试运行 `wifi-menu` 命令来更新 WiFi 密码,但是它一直报如下错误。
|
||||
|
||||
```
|
||||
sudo wifi-menu
|
||||
```
|
||||
|
||||
它显示了可用的 WiFi 列表。
|
||||
|
||||
[
|
||||
![](http://www.ostechnix.com/wp-content/uploads/2016/11/sk@sk_001-1.png)
|
||||
][2]
|
||||
|
||||
我的 WiFi 网络名为 Murugs9376。我选中了我的 WiFi 网络,然后在 OK 处按下回车。它没有让我输入新的 WiFi 密码(我以为它会先问我是否密码已经更改),却显示了下面的错误。
|
||||
|
||||
```
|
||||
Interface 'wlp9s0' is controlled by netctl-auto
|
||||
WPA association/authentication failed for interface 'wlp9s0'
|
||||
```
|
||||
|
||||
[
|
||||
![](http://www.ostechnix.com/wp-content/uploads/2016/11/sk@sk_002-1.png)
|
||||
][3]
|
||||
|
||||
在 Arch 发行版上,我没有太多的经验。因此我去了 Arch Linux 论坛希望能找到解决方法。感天谢地,之前有人发了同样问题的帖子并从一位 Arch 老司机那里得到了解决办法。
|
||||
|
||||
网络相关的配置文件都是存放在 `/etc/netctl/` 文件夹下。例如,下面是我的 Arch Linux 测试机上该文件夹下的内容:
|
||||
|
||||
```
|
||||
ls /etc/netctl/
|
||||
|
||||
Sample Output:
|
||||
|
||||
examples ostechnix 'wlp9s0-Chendhan Cell Service' wlp9s0-Pratheesh
|
||||
hooks wlp9s0 wlp9s0-Murugu9376
|
||||
interfaces wlp9s0-AndroidAP wlp9s0-none
|
||||
```
|
||||
|
||||
[
|
||||
![](http://www.ostechnix.com/wp-content/uploads/2016/11/sk@sk_003-1.png)
|
||||
][4]
|
||||
|
||||
我如果想要更改密码,只需要删除我的 WiFi 网络配置文件 (这里是 `wlp9s0-Murugs9376`) 并且重新运行 `wifi-menu` 命令。
|
||||
|
||||
因此,用下面的命令来删除原来的 WiFi 配置文件:
|
||||
|
||||
```
|
||||
sudo rm /etc/netctl/wlp9s0-Murugu9376
|
||||
```
|
||||
|
||||
删除配置文件之后,运行 `wifi-menu` 命令来更新 WiFi 密码。
|
||||
|
||||
```
|
||||
sudo wifi-menu
|
||||
```
|
||||
|
||||
选择 WiFi 网络,并且按回车键。
|
||||
|
||||
[
|
||||
![](http://www.ostechnix.com/wp-content/uploads/2016/11/sk@sk_004-1.png)
|
||||
][5]
|
||||
|
||||
|
||||
为新配置文件输入一个新名字。
|
||||
|
||||
[
|
||||
![](http://www.ostechnix.com/wp-content/uploads/2016/11/sk@sk_005-1.png)
|
||||
][6]
|
||||
|
||||
最后,输入 WiFi 新密码到配置文件中,并且按下回车键。
|
||||
|
||||
[
|
||||
![](http://www.ostechnix.com/wp-content/uploads/2016/11/sk@sk_006-1.png)
|
||||
][7]
|
||||
|
||||
|
||||
这样就完成了。现在,我们已经更新了我们的 WiFi 网络密码。像你所看到的一样,在 Arch Linux 终端里面更新 WiFi 密码并不是件很难的事情。任何人都能在几秒钟以内完成它。
|
||||
|
||||
如果您觉得这个教程很有帮助,希望您能分享到您的社交网络中来支持我们。
|
||||
|
||||
谢谢!
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: https://www.ostechnix.com/update-wifi-network-password-terminal-arch-linux/
|
||||
|
||||
作者:[SK][a]
|
||||
译者:[chenzhijun](https://github.com/chenzhijun)
|
||||
校对:[jasminepeng](https://github.com/jasminepeng)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.ostechnix.com/author/sk/
|
||||
[1]:http://ostechnix.tradepub.com/free/w_pacb38/prgm.cgi?a=1
|
||||
[2]:http://www.ostechnix.com/wp-content/uploads/2016/11/sk@sk_001-1.png
|
||||
[3]:http://www.ostechnix.com/wp-content/uploads/2016/11/sk@sk_002-1.png
|
||||
[4]:http://www.ostechnix.com/wp-content/uploads/2016/11/sk@sk_003-1.png
|
||||
[5]:http://www.ostechnix.com/wp-content/uploads/2016/11/sk@sk_004-1.png
|
||||
[6]:http://www.ostechnix.com/wp-content/uploads/2016/11/sk@sk_005-1.png
|
||||
[7]:http://www.ostechnix.com/wp-content/uploads/2016/11/sk@sk_006-1.png
|
@ -0,0 +1,119 @@
|
||||
如何在 Linux/Unix 系统中验证端口是否被占用
|
||||
==========
|
||||
|
||||
[![](https://s0.cyberciti.org/images/category/old/linux-logo.png)][1]
|
||||
|
||||
在 Linux 或者类 Unix 中,我该如何检查某个端口是否被占用?我又该如何验证 Linux 服务器中有哪些端口处于监听状态?
|
||||
|
||||
验证哪些端口在服务器的网络接口上处于监听状态是非常重要的。你需要注意那些开放端口来检测网络入侵。除了网络入侵,为了排除故障,确认服务器上的某个端口是否被其他应用程序占用也是必要的。比方说,你可能会在同一个系统中安装了 Apache 和 Nginx 服务器,所以了解是 Apache 还是 Nginx 占用了 # 80/443 TCP 端口真的很重要。这篇快速教程会介绍使用 `netstat` 、 `nmap` 和 `lsof` 命令来检查端口使用信息并找出哪些程序正在使用这些端口。
|
||||
|
||||
### 如何检查 Linux 中的程序和监听的端口
|
||||
|
||||
1、 打开一个终端,如 shell 命令窗口。
|
||||
2、 运行以下任意一行命令:
|
||||
|
||||
```
|
||||
sudo lsof -i -P -n | grep LISTEN
|
||||
sudo netstat -tulpn | grep LISTEN
|
||||
sudo nmap -sTU -O IP地址
|
||||
```
|
||||
|
||||
下面我们看看这些命令和它们的详细输出内容:
|
||||
|
||||
### 方式 1:lsof 命令
|
||||
|
||||
语法如下:
|
||||
|
||||
```
|
||||
$ sudo lsof -i -P -n
|
||||
$ sudo lsof -i -P -n | grep LISTEN
|
||||
$ doas lsof -i -P -n | grep LISTEN ### OpenBSD
|
||||
```
|
||||
|
||||
输出如下:
|
||||
|
||||
[![Fig.01: Check the listening ports and applications with lsof command](https://s0.cyberciti.org/uploads/faq/2016/11/lsof-outputs.png)][2]
|
||||
|
||||
*图 1:使用 lsof 命令检查监听端口和程序*
|
||||
|
||||
仔细看上面输出的最后一行:
|
||||
|
||||
```
|
||||
sshd 85379 root 3u IPv4 0xffff80000039e000 0t0 TCP 10.86.128.138:22 (LISTEN)
|
||||
```
|
||||
|
||||
- `sshd` 是程序的名称
|
||||
- `10.86.128.138` 是 `sshd` 程序绑定 (LISTEN) 的 IP 地址
|
||||
- `22` 是被使用 (LISTEN) 的 TCP 端口
|
||||
- `85379` 是 `sshd` 任务的进程 ID (PID)
|
||||
|
||||
### 方式 2:netstat 命令
|
||||
|
||||
你可以如下面所示使用 `netstat` 来检查监听的端口和程序。
|
||||
|
||||
**Linux 中 netstat 语法**
|
||||
|
||||
```
|
||||
$ netstat -tulpn | grep LISTEN
|
||||
```
|
||||
|
||||
**FreeBSD/MacOS X 中 netstat 语法**
|
||||
|
||||
```
|
||||
$ netstat -anp tcp | grep LISTEN
|
||||
$ netstat -anp udp | grep LISTEN
|
||||
```
|
||||
|
||||
**OpenBSD 中 netstat 语法**
|
||||
|
||||
```
|
||||
$ netstat -na -f inet | grep LISTEN
|
||||
$ netstat -nat | grep LISTEN
|
||||
```
|
||||
|
||||
### 方式 3:nmap 命令
|
||||
|
||||
语法如下:
|
||||
|
||||
```
|
||||
$ sudo nmap -sT -O localhost
|
||||
$ sudo nmap -sU -O 192.168.2.13 ### 列出打开的 UDP 端口
|
||||
$ sudo nmap -sT -O 192.168.2.13 ### 列出打开的 TCP 端口
|
||||
```
|
||||
|
||||
示例输出如下:
|
||||
|
||||
[![Fig.02: Determines which ports are listening for TCP connections using nmap](https://s0.cyberciti.org/uploads/faq/2016/11/nmap-outputs.png)][3]
|
||||
|
||||
*图 2:使用 nmap 探测哪些端口监听 TCP 连接*
|
||||
|
||||
你可以用一句命令合并 TCP/UDP 扫描:
|
||||
|
||||
```
|
||||
$ sudo nmap -sTU -O 192.168.2.13
|
||||
```
|
||||
|
||||
### 赠品:对于 Windows 用户
|
||||
|
||||
在 windows 系统下可以使用下面的命令检查端口使用情况:
|
||||
|
||||
```
|
||||
netstat -bano | more
|
||||
netstat -bano | grep LISTENING
|
||||
netstat -bano | findstr /R /C:"[LISTING]"
|
||||
```
|
||||
|
||||
----------------------------------------------------
|
||||
|
||||
via: https://www.cyberciti.biz/faq/unix-linux-check-if-port-is-in-use-command/
|
||||
|
||||
作者:[VIVEK GITE][a]
|
||||
译者:[GHLandy](https://github.com/GHLandy)
|
||||
校对:[oska874](https://github.com/oska874)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:https://www.cyberciti.biz/faq/unix-linux-check-if-port-is-in-use-command/
|
||||
[1]:https://www.cyberciti.biz/faq/category/linux/
|
||||
[2]:http://www.cyberciti.biz/faq/unix-linux-check-if-port-is-in-use-command/lsof-outputs/
|
||||
[3]:http://www.cyberciti.biz/faq/unix-linux-check-if-port-is-in-use-command/nmap-outputs/
|
@ -0,0 +1,234 @@
|
||||
Neofetch :带发行版 Logo 图像的系统信息显示工具
|
||||
============================================================
|
||||
|
||||
Neofetch 是一个跨平台的易于使用的 [系统信息显示命令行脚本][3],它收集你的系统信息,并在终端中和图像一起显示出来,这个图像可能是你的发行版的 logo 也可能是你选择的一幅 ascii 艺术字。
|
||||
|
||||
Neofetch 和 [ScreenFetch][4] 或者 [Linux_Logo][5] 很像,但是它可以高度定制,并且还有一些额外的我们要在下面讨论的特点。
|
||||
|
||||
它的主要特点有:运行速度快,可以显示全色图像 —— 用 ASCII 字符显示的发行版 logo ,旁边显示系统信息,可以高度定制,可以随时随地显示系统信息,并且在脚本结束的时候还可以通过一个特殊的参数来启用桌面截图。
|
||||
|
||||
#### 系统要求:
|
||||
|
||||
1. Bash 3.0+ 带 ncurses 支持。
|
||||
2. w3m-img (有时候会打包成 w3m) 或者 iTerm2 或者 Terminology,用于显示图像。
|
||||
3. [imagemagick][1],用于创建缩略图。
|
||||
4. 支持 `[\033[14t` 的 [Linux 终端模拟器][2] 或者 xdotool 或者 xwininfo + xprop 或者 xwininfo + xdpyinfo 。
|
||||
5. Linux 系统中还需要 feh、nitrogen 或者 gsettings 来提供对墙纸的支持。
|
||||
|
||||
注意:你可以从 Neofetch 的 Github 页面了解更多关于可选依赖的信息,以检查你的 [Linux 终端模拟器][6] 是不是真的支持 `\033[14t` 或者是否需要一些额外的依赖来使这个脚本在你的发行版上工作得更好。
|
||||
|
||||
### 怎样在 Linux 系统上安装 Neofetch
|
||||
|
||||
Neofetch 可以从几乎所有 Linux 发行版的第三方仓库轻松安装,请按照以下各自的安装说明进行安装。
|
||||
|
||||
#### Debian
|
||||
|
||||
```
|
||||
$ echo "deb http://dl.bintray.com/dawidd6/neofetch jessie main" | sudo tee -a /etc/apt/sources.list
|
||||
$ curl -L "https://bintray.com/user/downloadSubjectPublicKey?username=bintray" -o Release-neofetch.key && sudo apt-key add Release-neofetch.key && rm Release-neofetch.key
|
||||
$ sudo apt-get update
|
||||
$ sudo apt-get install neofetch
|
||||
```
|
||||
|
||||
#### Ubuntu 和 Linux Mint
|
||||
|
||||
```
|
||||
$ sudo add-apt-repository ppa:dawidd0811/neofetch
|
||||
$ sudo apt-get update
|
||||
$ sudo apt-get install neofetch
|
||||
```
|
||||
|
||||
#### RHEL, CentOS 和 Fedora
|
||||
|
||||
你的系统里面要安装了 `dnf-plugins-core` ,或者用以下命令安装它:
|
||||
|
||||
```
|
||||
$ sudo yum install dnf-plugins-core
|
||||
```
|
||||
|
||||
启用 COPR 仓库然后安装 neofetch。
|
||||
|
||||
```
|
||||
$ sudo dnf copr enable konimex/neofetch
|
||||
$ sudo dnf install neofetch
|
||||
```
|
||||
|
||||
#### Arch Linux
|
||||
|
||||
你可以用 packer 或 Yaourt 从 AUR 安装 neofetch 或 neofetch-git。
|
||||
|
||||
```
|
||||
$ packer -S neofetch
|
||||
$ packer -S neofetch-git
|
||||
或
|
||||
$ yaourt -S neofetch
|
||||
$ yaourt -S neofetch-git
|
||||
```
|
||||
|
||||
#### Gentoo
|
||||
|
||||
从 Gentoo/Funtoo 的官方源安装 app-misc/neofetch。如果你要安装这个程序的 git 版的话,你可以安装 app-misc/neofetch-9999。
|
||||
|
||||
### 怎么在 Linux 中使用 Neofetch
|
||||
|
||||
一旦你安装了 Neofetch ,使用它的一般语法是:
|
||||
|
||||
```
|
||||
$ neofetch
|
||||
```
|
||||
|
||||
注意: 要是你没有安装 w3m-img 或者 [imagemagick][7] 的话,[screenfetch][8] 会默认被启用,neofetch 会如下图所示显示你的 [ASCII 艺术 logo]。
|
||||
|
||||
#### Linux Mint 系统信息
|
||||
|
||||
[
|
||||
![Linux Mint 系统信息](http://www.tecmint.com/wp-content/uploads/2016/11/Linux-Mint-System-Information.png)
|
||||
][10]
|
||||
|
||||
*Linux Mint 系统信息*
|
||||
|
||||
#### Ubuntu 系统信息
|
||||
|
||||
[
|
||||
![Ubuntu System Information](http://www.tecmint.com/wp-content/uploads/2016/11/Ubuntu-System-Information.png)
|
||||
][11]
|
||||
|
||||
*Ubuntu 系统信息*
|
||||
|
||||
如果你想用图片显示你的发行版 logo,需要用下面的命令安装 w3m-img 或者 imagemagick 。
|
||||
|
||||
```
|
||||
$ sudo apt-get install w3m-img [On Debian/Ubuntu/Mint]
|
||||
$ sudo yum install w3m-img [On RHEL/CentOS/Fedora]
|
||||
```
|
||||
|
||||
然后再次运行 neofetch,你就会看到如下图所示的用你系统的默认墙纸来显示图片。
|
||||
|
||||
```
|
||||
$ neofetch
|
||||
```
|
||||
[
|
||||
![Ubuntu System Information with Logo](http://www.tecmint.com/wp-content/uploads/2016/11/Ubuntu-System-Information-with-Logo.png)
|
||||
][12]
|
||||
|
||||
*Ubuntu 系统信息带 logo*
|
||||
|
||||
第一次运行 neofetch 后,它会在这里创建一个配置文件: `$HOME/.config/neofetch/config`。
|
||||
|
||||
这个配置文件可以让你通过 `printinfo ()` 函数来调整你想显示在终端的系统信息。你可以增加,修改,删除,也可以使用 bash 代码去调整你要显示的信息。
|
||||
|
||||
你可以如下图所示用你喜欢的编辑器打开这个配置文件:
|
||||
|
||||
```
|
||||
$ vi ~/.config/neofetch/config
|
||||
```
|
||||
|
||||
以下是我系统配置的片段 ,显示了 `printinfo ()` 函数。
|
||||
|
||||
Neofetch 配置
|
||||
|
||||
```
|
||||
#!/usr/bin/env bash
|
||||
# vim:fdm=marker
|
||||
#
|
||||
# Neofetch config file
|
||||
# https://github.com/dylanaraps/neofetch
|
||||
|
||||
# Speed up script by not using unicode
|
||||
export LC_ALL=C
|
||||
export LANG=C
|
||||
|
||||
# Info Options {{{
|
||||
|
||||
# Info
|
||||
# See this wiki page for more info:
|
||||
# https://github.com/dylanaraps/neofetch/wiki/Customizing-Info
|
||||
printinfo() {
|
||||
info title
|
||||
info underline
|
||||
|
||||
info "Model" model
|
||||
info "OS" distro
|
||||
info "Kernel" kernel
|
||||
info "Uptime" uptime
|
||||
info "Packages" packages
|
||||
info "Shell" shell
|
||||
info "Resolution" resolution
|
||||
info "DE" de
|
||||
info "WM" wm
|
||||
info "WM Theme" wmtheme
|
||||
info "Theme" theme
|
||||
info "Icons" icons
|
||||
info "Terminal" term
|
||||
info "Terminal Font" termfont
|
||||
info "CPU" cpu
|
||||
info "GPU" gpu
|
||||
info "Memory" memory
|
||||
|
||||
# info "CPU Usage" cpu_usage
|
||||
# info "Disk" disk
|
||||
# info "Battery" battery
|
||||
# info "Font" font
|
||||
# info "Song" song
|
||||
# info "Local IP" localip
|
||||
# info "Public IP" publicip
|
||||
# info "Users" users
|
||||
# info "Birthday" birthday
|
||||
|
||||
info linebreak
|
||||
info cols
|
||||
info linebreak
|
||||
}
|
||||
.....
|
||||
```
|
||||
|
||||
下面的命令可以显示所有你能在 neofetch 脚本中用的参数和配置值:
|
||||
|
||||
```
|
||||
$ neofetch --help
|
||||
```
|
||||
|
||||
要启用所有的功能和参数来运行程序,你可以用 `--test` 参数:
|
||||
|
||||
```
|
||||
$ neofetch --test
|
||||
```
|
||||
|
||||
要再次显示 ASCII 艺术 logo ,你可以用 `--ascii` 参数 :
|
||||
|
||||
```
|
||||
$ neofetch --ascii
|
||||
```
|
||||
|
||||
这篇文章中,我们向你介绍了一个可以高度定制的、用来收集系统信息并将它显示在终端上的命令行脚本。
|
||||
|
||||
如果你有什么问题,或者对这个脚本有什么想法,请在下面留言。
|
||||
|
||||
最后但是同样重要的是,如果你知道有类似的脚本,请毫不犹豫地告诉我们,感谢反馈。
|
||||
|
||||
在此访问 [neofetch Github 仓库][13]。
|
||||
|
||||
--------------------------------------------------------------------------------
|
||||
|
||||
via: http://www.tecmint.com/neofetch-shows-linux-system-information-with-logo
|
||||
|
||||
作者:[Aaron Kili][a]
|
||||
译者:[Yinux](https://github.com/Yinux)
|
||||
校对:[wxy](https://github.com/wxy)
|
||||
|
||||
本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译,[Linux中国](https://linux.cn/) 荣誉推出
|
||||
|
||||
[a]:http://www.tecmint.com/author/aaronkili/
|
||||
[1]:http://www.tecmint.com/install-imagemagick-in-linux/
|
||||
[2]:http://www.tecmint.com/linux-terminal-emulators/
|
||||
[3]:http://www.tecmint.com/screenfetch-system-information-generator-for-linux/
|
||||
[4]:http://www.tecmint.com/screenfetch-system-information-generator-for-linux/
|
||||
[5]:http://www.tecmint.com/linux_logo-tool-to-print-color-ansi-logos-of-linux/
|
||||
[6]:http://www.tecmint.com/linux-terminal-emulators/
|
||||
[7]:http://www.tecmint.com/install-imagemagick-in-linux/
|
||||
[8]:http://www.tecmint.com/screenfetch-system-information-generator-for-linux/
|
||||
[9]:http://www.tecmint.com/linux_logo-tool-to-print-color-ansi-logos-of-linux/
|
||||
[10]:http://www.tecmint.com/wp-content/uploads/2016/11/Linux-Mint-System-Information.png
|
||||
[11]:http://www.tecmint.com/wp-content/uploads/2016/11/Ubuntu-System-Information.png
|
||||
[12]:http://www.tecmint.com/wp-content/uploads/2016/11/Ubuntu-System-Information-with-Logo.png
|
||||
[13]:https://github.com/dylanaraps/neofetch
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user