安卓编年史（17）：安卓 3.0 蜂巢—平板和设计复兴

Android 3.0还有人用？

当时只知道Moto的Xoom支持这个系统，其他的还真没听说

来自北京的 Internet Explorer 11.0|Windows 10 用户

# 安卓编年史（17）：安卓 3.0 蜂巢—平板和设计复兴

*安卓市场的新设计试水“卡片式”界面，这将成为谷歌的主要风格。 [Ron Amadeo 供图]*

安卓推向市场已经有两年半时间了，安卓市场放出了它的第四版设计。这个新设计十分重要，因为它已经很接近谷歌的“卡片式”界面了。通过在小方块中显示应用或其他内容，谷歌可以使它的设计在不同尺寸屏幕下无缝过渡而不受影响。内容可以像一个相册应用里的照片一样显示——给布局渲染填充一个内容块列表，加上屏幕包装，就完成了。更大的屏幕一次可以看到更多的内容块，小点的屏幕一次看到的内容就少。内容用了不一样的方式显示，谷歌还在右边新增了一个“分类”板块，顶部还有个巨大的热门应用滚动显示。

虽然设计上为更容易配置界面准备好准备好了，但功能上还没有。最初发布的市场版本锁定为横屏模式，而且还是蜂巢独占的。

*应用详情页和“我的应用”界面。 [Ron Amadeo 供图]*

新的市场不仅出售应用，还加入了书籍和电影租借。谷歌从 2010 年开始出售图书；之前只通过网站出售。新的市场将谷歌所有的内容销售聚合到了一处，进一步向苹果 iTunes 所的主宰地位展开较量。虽然在“安卓市场”出售这些东西有点品牌混乱，因为大部分内容都不依赖于安卓才能使用。

*浏览器看起来非常像 Chrome，联系人使用了双面板界面。 [Ron Amadeo 供图]*

新浏览器界面顶部添加了标签页栏。尽管这个浏览器并不是 Chrome ，但它模仿了许多 Chrome 的设计和特性。除了这个探索性的顶部标签页界面，浏览器还加入了隐身标签，在浏览网页时不保存历史记录和自动补全记录。它还有个选项可以让你拥有一个 Chrome 风格的新标签页，页面上包含你最经常访问的网页略缩图。

新浏览器甚至还能和 Chrome 同步。在浏览器登录后，它会下载你的 Chrome 书签并且自动登录你的谷歌账户。收藏一个页面只需点击地址栏的星形标志即可，和谷歌地图一样，浏览器抛弃了缩放按钮，完全改用手势控制。

联系人应用最终从电话应用中移除，并且独立为一个应用。之前的联系人/拨号的混合式设计相对于人们使用现代智能手机的方式来说，过于以电话为中心了。联系人中存有电子邮件、IM、短信、地址、生日以及社交网络等信息，所以将它们捆绑在电话应用里的意义和将它们放进谷歌地图里差不多。抛开了电话通讯功能，联系人能够简化成没有标签页的联系人列表。蜂巢采用了双面板视图，在左侧显示完整的联系人列表，右侧是联系人详情。应用利用了 Fragments API，通过它应用可以在同一屏显示多个面板界面。

蜂巢版本的联系人应用是第一个拥有快速滚动功能的版本。当按住左侧滚动条的时候，你可以快速上下拖动，应用会显示列表当前位置的首字母预览。

*新 Youtube 应用看起来像是来自黑客帝国。 [Ron Amadeo 供图]*

谢天谢地 Youtube 终于抛弃了自安卓 2.3 以来的谷歌给予这个视频服务的“独特”设计，新界面设计与系统更加一体化。主界面是一个水平滚动的曲面墙，上面显示着最热门或者（登录之后）个人关注的视频。虽然谷歌从来没有将这个设计带到手机上，但它可以被认为是一个易于重新配置的卡片界面。操作栏在这里是个可配置的工具栏。没有登录时，操作栏由一个搜索栏填满。当你登录后，搜索缩小为一个按钮，“首页”，“浏览”和“你的频道”标签将会显示出来。

*蜂巢用一个蓝色框架的电脑界面来驱动主屏。电影工作室完全采用橙色电子风格主题。 [Ron Amadeo 供图]*

蜂巢新增的应用“电影工作室”，这不是一个不言自明的应用，而且没有任何的解释或说明。就我们所知，你可以导入视频，剪切它们，添加文本和场景过渡。编辑视频——电脑上你可以做的最耗时、困难，以及处理器密集型任务之一 —— 在平板上完成感觉有点野心过大了，谷歌在之后的版本里将其完全移除了。电影工作室里我们最喜欢的部分是它完全的电子风格主题。虽然系统的其它部分使用蓝色高亮，在这里是橙色的。（电影工作室是个邪恶的程序！）

*小部件！ [Ron Amadeo 供图]*

蜂巢带来了新的部件框架，允许部件滚动，Gmail、Email 以及日历部件都升级了以支持改功能。Youtube 和书籍使用了新的部件，内容卡片可以自动滚动切换。在小部件上轻轻向上或向下滑动可以切换卡片。我们不确定你的书籍中哪些书会被显示出来，但如果你想要的话它就在那儿。尽管所有的这些小部件在 10 英寸屏幕上运行良好，谷歌从未为手机重新设计它们，这让它们在安卓最流行的规格上几乎毫无用处。所有的小部件有个大块的标识标题栏，而且通常占据大半屏幕只显示很少的内容。

*安卓 3.1 中可滚动的最近应用以及可自定义大小的小部件。 [Ron Amadeo 供图]*

蜂巢后续的版本修复了 3.0 早期的一些问题。安卓 3.1 在蜂巢的第一个版本之后三个月放出，并带来了一些改进。小部件自定义大小是添加的最大特性之一。长按小部件之后，一个带有拖拽按钮的蓝色外框会显示出来，拖动按钮可以改变小部件尺寸。最近应用界面现在可以垂直滚动并且承载更多应用。这个版本唯一缺失的功能是滑动关闭应用。

在今天，一个 0.1 版本的升级是个主要更新，但是在蜂巢，那只是个小更新。除了一些界面调整，3.1 添加了对游戏手柄，键盘，鼠标以及其它 USB 和蓝牙输入设备的支持。它还提供了更多的开发者 API。

*安卓 3.2 的兼容性缩放和一个安卓平板上典型的展开视图应用。 [Ron Amadeo 供图]*

安卓 3.2 在 3.1 发布后两个月放出，添加了七到八英寸的小尺寸平板支持。3.2 终于启用了 SD 卡支持，Xoom 在生命最初的五个月就像是初生儿的柔弱的肢体一样。

蜂巢匆匆问世是为了成为一个生态系统建设者。如果应用没有平板版本，没人会想要一个安卓平板的，所以谷歌知道需要尽快将东西送到开发者手中。在这个安卓平板生态的早期阶段，应用还没有到齐。这是拥有 Xoom 的人们所面临的最大的问题。

3.2 添加了“兼容缩放”，给了用户一个新选项，可以将应用拉伸适应屏幕（如右侧图片显示的那样）或缩放成正常的应用布局来适应屏幕。这些选项都不是很理想，由于没有应用生态来支持平板，蜂巢设备销售状况惨淡。但谷歌的平板决策最终还是会得到回报。今天，安卓平板已经[取代 iOS 占据了最大的市场份额](http://techcrunch.com/2014/03/03/gartner-195m-tablets-sold-in-2013-android-grabs-top-spot-from-ipad-with-62-share/)。

### Google Music Beta —— 取代内容商店的云存储

*姜饼上的 Google Music Beta。 [Ron Amadeo 供图]*

尽管蜂巢改进了 Google Music 的界面，但是音乐应用的设计并没有从蜂巢直接进化到冰淇淋三明治。2011 年 5 月，谷歌发布了“[Google Music Beta](http://arstechnica.com/gadgets/2011/05/hands-on-grooving-on-the-go-with-impressive-google-music-beta/)”，和新的 Google Music 应用一同到来的在线音乐存储。

新 Google Music 为安卓 2.2 及以上版本设计，借鉴了 Cooliris 相册的设计语言，但也有改变之处，背景使用了模糊处理的图片。几乎所有东西都是透明的：弹出菜单，顶部标签页，还有底部的正在播放栏。可以下载单独的歌曲或整个播放列表到设备上离线播放，这让 Google Music 成为一个让音乐同步到你所有设备的好途径。除了移动应用外，Google Music 还有一个 Web 应用，让它可以在任何一台桌面电脑上使用。

谷歌和唱片公司关于内容的合约还没有谈妥，音乐商店还没准备好，所以它的权宜之计是允许用户存储音乐到线上并下载到设备上。如今谷歌除了音乐存储服务外，还有单曲购买和订阅模式。

---

[Ron Amadeo](http://arstechnica.com/author/ronamadeo) / Ron 是 Ars Technica 的评论编缉，专注于安卓系统和谷歌产品。他总是在追寻新鲜事物，还喜欢拆解事物看看它们到底是怎么运作的。[@RonAmadeo](https://twitter.com/RonAmadeo)

---

via: <http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/18/>

译者：[alim0x](https://github.com/alim0x) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


安卓编年史（18）：Android 4.0 冰淇淋三明治—摩登时代

# 安卓编年史（18）：Android 4.0 冰淇淋三明治—摩登时代

### Android 4.0 冰淇淋三明治 —— 摩登时代

*三星 Galaxy Nexus，安卓4.0的首发设备。*

安卓 4.0，冰淇淋三明治，在 2011 年 10 月发布，系统发布回到正轨，带来定期发布的手机和平板，并且安卓再次开源。这是自姜饼以来手机设备的第一个更新，意味着最主要的安卓用户群体近乎一年没有见到更新了。4.0 随处可见缩小版的蜂巢设计，还将虚拟按键，<ruby> 操作栏 <rp>  （ </rp> <rt>  Action Bar </rt> <rp>  ） </rp></ruby>，全新的设计语言带到了手机上。

冰淇淋三明治在三星 Galaxy Nexus 上首次亮相，也是最早带有 720p 显示屏的安卓手机之一。随着分辨率的提高，Galaxy Nexus 使用了更大的 4.65 英寸显示屏——几乎比最初的 Nexus One 大了一整英寸。这被许多批评者认为“太大了”，但如今的安卓设备甚至更大。（5 英寸当今是“正常”的。）冰淇淋三明治比姜饼的性能要求更高，Galaxy Nexus 配备了一颗双核，1.2Ghz 德州仪器 OMAP 处理器和 1GB 的内存。

在美国，Galaxy Nexus 在 Verizon 首发并且支持 LTE。不像之前的 Nexus 设备，最流行的型号——Verizon 版——是在运营商的控制之下，谷歌的软件和更新在手机得到更新之前要经过 Verizon 的核准。这导致了更新的延迟以及 Verizon 不喜欢的应用被移除，即便是 Google Wallet 也不例外。

多亏了冰淇淋三明治的软件改进，谷歌终于达成了移除手机上按钮的目标。有了虚拟导航键，实体电容按钮就可以移除了，最终 Galaxy Nexus 仅有电源和音量是实体按键。

*安卓 4.0 将很多蜂巢的设计缩小了。 [Ron Amadeo 供图]*

电子质感的审美在蜂巢中显得有点多。于是在冰淇淋三明治中，谷歌开始减少科幻风的设计。科幻风的时钟字体从半透明折叠风格转变成纤细，优雅，看起来更加正常的字体。解锁环的水面波纹效果被去除了，蜂巢中的外星风格时钟小部件也被极简设计所取代。系统按钮也经过了重新设计，原先的蓝色轮廓，偶尔的厚边框变成了细的，设置带有白色轮廓。默认壁纸从蜂巢的蓝色太空船内部变成条纹状，破碎的彩虹，给默认布局增添了不少迟来的色彩。

蜂巢的系统栏在手机上一分为二。在顶上是传统的状态栏，底部是新的系统栏，放着三个系统按钮：后退、主屏幕、最近应用。一个固定的搜索栏放置在了主屏幕顶部。该栏以和底栏一样的方式固定在屏幕上，所以在五个主屏上，它总共占据了 20 个图标大小的位置。在蜂巢的锁屏上，内部的小圆圈可以向大圆圈外的任意位置滑动来解锁设备。在冰淇淋三明治，你得把小圆圈移动到解锁图标上。这个新准确度要求允许谷歌向锁屏添加新的选项：一个相机快捷方式。将小圆圈拖向相机图标会直接启动相机，跳过了主屏幕。

*一个手机系统意味着更多的应用，通知面板重新回到了全屏界面。 [Ron Amadeo 供图]*

应用抽屉还是标签页式的，但是蜂巢中的“我的应用”标签被“部件”标签页替代，这是个简单的 2×3 部件略缩图视图。像蜂巢里的那样，这个应用抽屉是分页的，需要水平滑动换页。（如今安卓仍在使用这个应用抽屉设计。）应用抽屉里新增的是 Google+ 应用，后来独立存在。还有一个“Messenger”快捷方式，是 Google+ 的私密信息服务。（不要混淆 “Messenger” 和已有的 “Messaging” 短信应用。）

因为我们现在回到了手机上，所以短信，新闻和天气，电话，以及语音拨号都回来了，以及 Cordy，一个平板的游戏，被移除了。尽管不是 Nexus 设备，我们的截图还是来自 Verizon 版的设备，可以从图上看到有像 “My Verizon Mobile” 和 “VZ Backup Assistant” 这样没用的应用。为了和冰淇淋三明治的去电子风格主题一致，日历和相机图标现在看起来更像是来自地球的东西而不是来自外星球。时钟，下载，电话，以及安卓市场同样得到了新图标，“联系人”获得了新图标，还有新名字 “People”。

通知面板进行了大改造，特别是和[之前姜饼中的设计](http://cdn.arstechnica.net/wp-content/uploads/2014/02/32.png)相比而言。面板头部有个日期，一个设置的快捷方式，以及“清除所有”按钮。虽然蜂巢的第一个版本就允许用户通过通知右边的“X”消除单个通知，但是冰淇淋三明治的实现更加优雅：只要从左向右滑动通知即可。蜂巢有着蓝色高亮，但是蓝色色调到处都是。冰淇淋三明治几乎把所有地方的蓝色统一成一个（如果你想知道确定的值，hex 码是 `#33B5E5`）。通知面板的背景是透明的，底部的“把手”变为一个简单的小蓝圈，带着不透明的黑色背景。

*安卓市场的主页背景变成了黑色。 [Ron Amadeo 供图]*

市场获得了又一个新设计。它终于再次支持纵向模式，并且添加了音乐到商店中，你可以从中购买音乐。新的市场拓展了从蜂巢中引入的卡片概念，它还是第一个同时使用在手机和平板上的版本。主页上的卡片通常不是链接到应用的，而是指向特别的促销页面，像是“编辑精选”或季度促销。

---

[Ron Amadeo](http://arstechnica.com/author/ronamadeo) / Ron是Ars Technica的评论编缉，专注于安卓系统和谷歌产品。他总是在追寻新鲜事物，还喜欢拆解事物看看它们到底是怎么运作的。[@RonAmadeo](https://twitter.com/RonAmadeo)

---

via: <http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/19/>

译者：[alim0x](https://github.com/alim0x) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


怎么使用 Diff 和 Meld 工具发现两个目录间的不同之处

Summary: 本篇文章中，我们将会描述在 Linux 下怎样找到两个目录之间的不同。

diff是很有价值的开源工具，很遗憾在非Linux平台下它不是自由的。

是这样的？不允许用在 Windows 上之类的？我还真没注意到它的许可证~

你运行一下你的mac上的diff看看，它是不自由的。这不是许可证的问题，这是自由与否的问题。

get 不到你的点。

cuthead@cuthead-To-be-filled-by-O-E-M:~$ echo abc >1.txt

cuthead@cuthead-To-be-filled-by-O-E-M:~$ echo bbc >2.txt

cuthead@cuthead-To-be-filled-by-O-E-M:~$ diff 1.txt 2.txt

1c1

< abc

---

> bbc

cuthead@cuthead-To-be-filled-by-O-E-M:~$

仅在Linux下工作，在Mac下不工作，我其实也有Mac。但我比较喜欢Linux。

我给你说，diff有图形化工具diffuse

我不知道你什么情况，但是我原样复制你的命令，在我的 mac 下执行，结果是和 linux 下一样的。bash 和 zsh 都工作。

cmp -l 1.txt 2.txt | gawk '{printf &quot;%08X %02X %02X\n&quot;, $1, strtonum(0$2), strtonum(0$3)}' 我用windows 10年，mac 10年，我可以很确定的说mac没有diff

没有 diff 有什么问题么，无论是 ports ，还是 brew，或者编译，都可以有啊。

本篇文章中，我们将会描述在 Linux 下怎样找到两个目录之间的不同。

# 怎么使用 Diff 和 Meld 工具发现两个目录间的不同之处

在之前的一篇文章里，我们回顾了 [Linux 下 9 个最好的文件比较工具](http://www.tecmint.com/best-linux-file-diff-tools-comparison/)，本篇文章中，我们将会描述在 Linux 下怎样找到两个目录之间的不同。

一般情况下，要在 Linux 下比较两个文件，我们会使用 `diff` （一个简单的源自 Unix 的命令行工具）来显示两个计算机文件的不同；它一行一行的去比较文件，而且很方便使用，在几乎全部的 Linux 发行版都预装了。

问题是在 Linux 下我们怎么才能比较两个目录？现在，我们想知道两个目录中哪些文件/子目录是共有的，哪些只存在一个于目录。

运行 diff 常规的语法如下：

```
$ diff [OPTION]… FILES
$ diff options dir1 dir2

```

默认情况下，输出是按文件/子文件夹的文件名的字母排序的，如下面截图所示，在命令中， `-q` 开关是告诉 `diif` 只有在文件有差异时报告。

```
$ diff -q directory-1/ directory-2/

```

*两个文件夹之间的差异*

再次运行 `diff` 并不能进入子文件夹，但是我们可以使用 `-r` 开关来读子文件夹，如下所示。

```
$ diff -qr directory-1/ directory-2/

```

### 使用 Meld 可视化比较和合并工具

`meld` 是一个很酷的图形化工具（一个 GNOME 桌面下的可视化的比较和合并工具），可供那些喜欢使用鼠标的人使用，可按如下来安装。

```
$ sudo apt install meld  [Debian/Ubuntu systems]
$ sudo yum install meld  [RHEL/CentOS systems]
$ sudo dnf install meld  [Fedora 22+]

```

一旦你安装了它之后，在 **Ubuntu Dash** 或者 **Linux Mint** 菜单搜索 “**meld**” ，或者 Fedora 或 CentOS 桌面的 Activities Overview，然后启动它。

你可以看到如下的 Meld 界面，可以选择文件或者文件夹来比较，此外还有版本控制视图。点击目录比较并移动到下个界面。

*Meld 比较工具*

选择你想要比较的文件夹，注意你可以勾选 “**3-way Comparison**” 选项，添加第三个文件夹。

*选择比较的文件夹*

选择好要比较的文件夹后，点击 “Compare”。

*文件夹不同列表*

在这篇文章中，我们描述了怎么在 Linux 下找到两个文件夹的不同。如果你知道其他的命令或者图形界面工具，不要忘记在下方评论分享你们的想法。

---

作者简介：

Aaron Kili 是一个 Linux 和 F.O.S.S 爱好者，即将成为 Linux 系统管理员，Web 开发者，目前是 TecMint 的内容创建者，他喜欢使用电脑工作，并且非常相信分享知识。

---

via: <http://www.tecmint.com/compare-find-difference-between-two-directories-in-linux/>

作者：[Aaron Kili](http://www.tecmint.com/author/aaronkili/) 译者：[hkurj](https://github.com/hkurj) 校对：[jasminepeng](https://github.com/jasminepeng)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


安卓编年史（19）：Android 4.0 冰淇淋三明治—摩登时代

# 安卓编年史（19）：Android 4.0 冰淇淋三明治—摩登时代

*和之前完全不同的市场设计。以上是分类，特色，热门应用以及应用详情页面。 [Ron Amadeo 供图]*

这些截图给了我们冰淇淋三明治中新版操作栏的第一印象。几乎所有的应用顶部都有一条栏，带有应用图标，当前界面标题，一些功能按钮，右边还有一个菜单按钮。这个右对齐的菜单按钮被称为“更多操作”，因为里面存放着无法放置到主操作栏的项目。不过更多操作菜单并不是固定不变的，它给了操作栏节省了更多的屏幕空间——比如在横屏模式或在平板上时，更多操作菜单的项目会像通常的按钮一样显示在操作栏上。

冰淇凌三明治中新增了“滑动标签页”设计，替换掉了谷歌之前推行的 2×3 方阵导航屏幕。一个标签页栏放置在了操作栏下方，位于中间的标签显示的是当前页面，左右侧的两个标签显示的是对应的当前页面的左右侧页面。向左右滑动可以切换标签页，或者你可以点击指定页面的标签跳转过去。

应用详情页面有个很赞的设计，在应用截图后，会根据你关于那个应用的历史动态地重新布局页面。如果你从来没有安装过该应用，应用描述会优先显示。如果你曾安装过这个应用，第一部分将会是评价栏，它会邀请你评价该应用或者提醒你上次你安装该应用时的评价是什么。之前使用过的应用页面第二部分是“新特性”，因为一个老用户最关心的应该是应用有什么变化。

*最近应用和浏览器和蜂巢中的类似，但是是小号的。 [Ron Amadeo 供图]*

最近应用的电子风格外观被移除了。略缩图周围的蓝色的轮廓线被去除了，同时去除的还有背景怪异的、不均匀的蓝色光晕。它现在看起来是个中立型的界面，在任何时候看起来都很舒适。

浏览器尽了最大的努力把标签页体验带到手机上来。多标签浏览受到了关注，操作栏上引入的一个标签页按钮会打开一个类似最近应用的界面，显示你打开的标签页，而不是浪费宝贵的屏幕空间引入一个标签条。从功能上来说，这个和之前的浏览器中的“窗口”视图没什么差别。浏览器最佳的改进是菜单中的“请求桌面版站点”选项，这让你可以从默认的移动站点视图切换到正常站点。浏览器展示了谷歌的操作栏设计的灵活性，尽管这里没有左上角的应用图标，功能上来说和其他的顶栏设计相似。

*Gmail 和 Google Talk —— 它们和蜂巢中的相似，但是更小！ [Ron Amadeo 供图]*

Gmail 和 Google Talk 看起来都像是之前蜂巢中的设计的缩小版，但是有些小调整让它们在小屏幕上表现更佳。Gmail 以双操作栏为特色——一个在屏幕顶部，一个在底部。顶部操作栏显示当前文件夹、账户，以及未读消息数目，点击顶栏可以打开一个导航菜单。底部操作栏有你期望出现在更多操作中的选项。使用双操作栏布局是为了在界面显示更多的按钮，但是在横屏模式下纵向空间有限，双操作栏就合并成一个顶部操作栏。

在邮件视图下，往下滚动屏幕时蓝色栏有“粘性”。它会固定在屏幕顶部，所以你一直可以看到该邮件是谁写的，回复它，或者给它加星标。一旦处于邮件消息界面，底部细长的、深灰色栏会显示你当前在收件箱（或你所在的某个列表）的位置，并且你可以向左或向右滑动来切换到其他邮件。

Google Talk 允许你像在 Gmail 中那样左右滑动来切换聊天窗口，但是这里显示栏是在顶部。

*新的拨号和来电界面，都是姜饼以来我们还没见过的。 [Ron Amadeo 供图]*

因为蜂巢只给平板使用，所以一些界面设计直接超前于姜饼。冰淇淋三明治的新拨号界面就是如此，黑色和蓝色相间，并且使用了可滑动切换的小标签。尽管冰淇淋三明治终于做对了，将电话主体和联系人独立开来，但电话应用还是有它自己的联系人标签。现在有两个地方可以看到你的联系人列表——一个有着暗色主题，另一个有着亮色主题。由于实体搜索按钮不再是硬性要求，底部的按钮栏的语音信息快捷方式被替换为了搜索图标。

谷歌几乎就是把来电界面做成了锁屏界面的镜像，这意味着冰淇淋三明治有着一个环状解锁设计。除了通常的接受和挂断选项，圆环的顶部还添加了一个按钮，让你可以挂断来电并给对方发送一条预先定义好的信息。向上滑动并选择一条信息如“现在无法接听，一会回电”，相比于一直响个不停的手机而言这样做的信息交流更加丰富。

*蜂巢没有文件夹和信息应用，所以这里是冰淇淋三明治和姜饼的对比。 [Ron Amadeo 供图]*

现在创建文件夹更加方便了。在姜饼中，你得长按屏幕，选择“文件夹”选项，再点击“新文件夹”。在冰淇淋三明治中，你只要将一个图标拖拽到另一个图标上面，就会自动创建一个文件夹，并包含这两个图标。这简直不能更简单了，比寻找隐藏的长按命令容易多了。

设计上也有很大的改进。姜饼使用了一个通用的米黄色文件夹图标，但冰淇淋三明治直接显示出了文件夹中的头三个应用，把它们的图标叠在一起，在外侧画一个圆圈，并将其设置为文件夹图标。打开文件夹容器将自动调整大小以适应文件夹中的应用图标数目，而不是显示一个全屏的，大部分都是空的对话框。这看起来好得多得多。

*Youtube 转换到一个更加现代的白色主题，使用了列表视图替换疯狂的 3D 滚动视图。 [Ron Amadeo 供图]*

Youtube 经过了完全的重新设计，看起来没那么像是来自黑客帝国的产物，更像是，嗯，Youtube。它现在就是一个简单的垂直滚动的白色视频列表，就像网站的那样。在你手机上制作视频受到了重视，操作栏的第一个按钮专用于拍摄视频。奇怪的是，不同的界面左上角使用了不同的 Youtube 标志，在水平的 Youtube 标志和方形标志之间切换。

Youtube 几乎在所有地方都使用了滑动标签页。它们被放置在主页面以在浏览和账户间切换，放置在视频页面以在评论，介绍和相关视频之间切换。4.0 版本的应用显示出 Google+ Youtube 集成的第一个信号，通常的评分按钮旁边放置了 “+1” 图标。最终 Google+ 会完全占据 Youtube，将评论和作者页面变成 Google+ 活动。

*冰淇淋三明治试着让事情对所有人都更加简单。这里是数据使用量追踪，打开许多数据的新开发者选项，以及使用向导。 [Ron Amadeo 供图]*

数据使用量允许用户更轻松地追踪和控制他们的数据使用。主页面显示一个月度使用量图表，用户可以设置数据使用警告值或者硬性使用限制以避免超量使用产生费用。所有的这些只需简单地拖动橙色和红色水平限制线在图表上的位置即可。纵向的白色把手允许用户选择图表上的一段指定时间段。在页面底部，选定时间段内的数据使用量又细分到每个应用，所以用户可以选择一个数据使用高峰并轻松地查看哪个应用在消耗大量流量。当流量紧张的时候，更多操作按钮中有个限制所有后台流量的选项。设置之后只用在前台运行的程序有权连接互联网。

开发者选项通常只有一点点设置选项，但是在冰淇淋三明治中，这部分有非常多选项。谷歌添加了所有类型的屏幕诊断显示浮层来帮助开发者理解他们的应用中发生了什么。你可以看到 CPU 使用率，触摸点位置，还有视图界面更新。还有些选项可以更改系统功能，比如控制动画速度，后台处理，以及 GPU 渲染。

安卓和 iOS 之间最大的区别之一就是应用抽屉界面。在冰淇淋三明治对更加用户友好的追求下，设备第一次初始化启动会启动一个小教程，向用户展示应用抽屉的位置以及如何将应用图标从应用抽屉拖拽到主屏幕。随着实体菜单按键的移除和像这样的改变，安卓 4.0 做了很大的努力变得对新智能手机用户和转换过来的用户更有吸引力。

*“触摸分享”NFC 支持，Google Earth，以及应用信息，让你可以禁用垃圾软件。*

冰淇淋三明治内置对 [NFC](http://arstechnica.com/gadgets/2011/02/near-field-communications-a-technology-primer/) 的完整支持。尽管之前的设备，比如 Nexus S 也拥有 NFC，得到的支持是有限的并且系统并不能利用芯片做太多事情。4.0 添加了一个“Android Beam”功能，两台拥有 NFC 的安卓 4.0 设备可以借此在设备间来回传输数据。NFC 会传输关于此时屏幕显示的数据，因此在手机显示一个网页的时候使用该功能会将该页面传送给另一部手机。你还可以发送联系人信息、方向导航，以及 Youtube 链接。当两台手机放在一起时，屏幕显示会缩小，点击缩小的界面会发送相关信息。

在安卓中，用户不允许删除系统应用，以保证系统完整性。运营商和 OEM 利用该特性并开始将垃圾软件放入系统分区，经常有一些没用的应用存在系统中。安卓 4.0 允许用户禁用任何不能被卸载的应用，意味着该应用还存在于系统中但是不显示在应用抽屉里并且不能运行。如果用户愿意深究设置项，这给了他们一个简单的途径来拿回手机的控制权。

安卓 4.0 可以看做是现代安卓时代的开始。大部分这时发布的谷歌应用只能在安卓 4.0 及以上版本运行。4.0 还有许多谷歌想要好好利用的新 API——至少最初想要——对 4.0 以下的版本的支持就有限了。在冰淇淋三明治和蜂巢之后，谷歌真的开始认真对待软件设计。在 2012 年 1 月，谷歌[最终发布了](http://arstechnica.com/business/2012/01/google-launches-style-guide-for-android-developers/) *Android Design*，一个教安卓开发者如何创建符合安卓外观和感觉的应用的设计指南站点。这是 iOS 在有第三方应用支持开始就在做的事情，苹果还严肃地对待应用的设计，不符合指南的应用都被 App Store 拒之门外。安卓三年以来谷歌没有给出任何公共设计规范文档的事实，足以说明事情有多糟糕。但随着在 Duarte 掌控下的安卓设计革命，谷歌终于发布了基本设计需求。

### Google Play 和直接面向消费者出售设备的回归

2012 年 3 月 6 日，谷歌将旗下提供的所有内容统一到 “Google Play”。安卓市场变为了 Google Play 商店，Google Books 变为 Google Play Books，Google Music 变为 Google Play Music，还有 Android Market Movies 变为 Google Play Movies & TV。尽管应用界面的变化不是很大，这四个内容应用都获得了新的名称和图标。在 Play 商店购买的内容会下载到对应的应用中，Play 商店和 Play 内容应用一道给用户提供了易管理的内容体验。

Google Play 更新是谷歌第一个大的更新周期外更新。四个自带应用都没有通过系统更新获得升级，它们都是直接通过安卓市场/ Play 商店更新的。对单独的应用启用周期外更新是谷歌的重大关注点之一，而能够实现这样的更新，是自姜饼时代开始的工程努力的顶峰。谷歌一直致力于对应用从系统“解耦”，从而让它们能够通过安卓市场/ Play 商店进行分发。

尽管一两个应用（主要是地图和 Gmail）之前就在安卓市场上，从这里开始你会看到许多更重大的更新，而其和系统发布无关。系统更新需要 OEM 厂商和运营商的合作，所以很难保证推送到每个用户手上。而 Play 商店更新则完全掌握在谷歌手上，给了谷歌一条直接到达用户设备的途径。因为 Google Play 的发布，安卓市场对自身升级到了 Google Play Store，在那之后，图书，音乐以及电影应用都下发了 Google Play 式的更新。

Google Play 系列应用的设计仍然不尽相同。每个应用的外观和功能各有差异，但暂且来说，一个统一的品牌标识是个好的开始。从品牌标识中去除“安卓”字样是很有必要的，因为很多服务是在浏览器中提供的，不需要安卓设备也能使用。

2012 年 4 月，谷歌[再次开始通过 Play 商店销售设备](http://arstechnica.com/gadgets/2011/02/near-field-communications-a-technology-primer/)，恢复在 Nexus One 发布时尝试的直接面向消费者销售的方式。尽管距 Nexus One 销售结束仅有两年，但网上购物现在更加寻常，在接触到物品之前就购买它并不像在 2010 年时听起来那么疯狂。

谷歌也看到了价格敏感的用户在面对 Nexus One 的 530 美元的价格时的反应。第一部销售的设备是无锁的，GSM 版本的 Galaxy Nexus，价格 399 美元。在那之后，价格变得更低。350 美元成为了最近两台 Nexus 设备的入门价，7 英寸 Nexus 平板的价格更是只有 200 美元到 220 美元。

今天，Play 商店销售八款不同的安卓设备，四款 Chromebook，一款自动调温器，以及许多配件，设备商店已经是谷歌新产品发布的实际地点了。新产品发布总是如此受欢迎，站点往往无法承载如此大的流量，新 Nexus 手机也在几小时内售空。

---

[Ron Amadeo](http://arstechnica.com/author/ronamadeo) / Ron是Ars Technica的评论编缉，专注于安卓系统和谷歌产品。他总是在追寻新鲜事物，还喜欢拆解事物看看它们到底是怎么运作的。[@RonAmadeo](https://twitter.com/RonAmadeo)

---

via: <http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/20/>

译者：[alim0x](https://github.com/alim0x) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


MyCLI ：一个支持自动补全和语法高亮的 MySQL/MariaDB 客户端

Emacs 有没有类似插件

centos上pip安装命令不对，应该是yum -y install python-pip

# MyCLI ：一个支持自动补全和语法高亮的 MySQL/MariaDB 客户端

MyCLI 是一个易于使用的命令行客户端，可用于受欢迎的数据库管理系统 MySQL、MariaDB 和 Percona，支持自动补全和语法高亮。它是使用 `prompt_toolkit` 库写的，需要 Python 2.7、3.3、3.4、3.5 和 3.6 的支持。MyCLI 还支持通过 SSL 安全连接到 MySQL 服务器。

#### MyCLI 的特性

* 当你第一次使用它的时候，将会自动创建一个文件 `~/.myclirc`。
* 当输入 SQL 的关键词和数据库中的表、视图和列时，支持自动补全。
* 默认情况下也支持智能补全，能根据上下文的相关性提供补全建议。

比如：

```
SELECT * FROM <Tab> - 这将显示出数据库中的表名。
SELECT * FROM users WHERE <Tab> - 这将简单的显示出列名称。

```

* 通过使用 `Pygents` 支持语法高亮
* 支持 SSL 连接
* 提供多行查询支持
* 它可以将每一个查询和输出记录到一个文件中（默认情况下禁用）。
* 允许保存收藏一个查询（使用 `\fs 别名` 保存一个查询，并可使用 `\f 别名` 运行它）。
* 支持 SQL 语句执行和表查询计时
* 以更吸引人的方式打印表格数据

### 如何在 Linux 上为 MySQL 和 MariaDB 安装 MyCLI

在 Debian/Ubuntu 发行版上，你可以很容易的像下面这样使用 `apt` 命令 来安装 MyCLI 包：

```
$ sudo apt-get update
$ sudo apt-get install mycli

```

同样，在 Fedora 22+ 上也有 MyCLI 的可用包，你可以像下面这样使用 `dnf` 命令 来安装它：

```
$ sudo dnf install mycli

```

对于其他 Linux 发行版，比如 RHEL/CentOS，你需要使用 Python 的 `pip` 工具来安装 MyCLI。首先，使用下面的命令来安装 pip：

```
$ sudo yum install pip

```

安装好 `pip` 以后，你可以像下面这样安装 MyCLI：

```
$ sudo pip install mycli

```

### 在 Linux 中如何使用 MyCLI 连接 MySQL 和 MariaDB

安装好 MyCLI 以后，你可以像下面这样使用它：

```
$ mycli -u root -h localhost

```

#### 自动补全

对于关键词和 SQL 函数可以进行简单的自动补全：

*MySQL 自动补全*

#### 智能补全

当输入 `FROM` 关键词以后会进行表名称的补全：

*MySQL 智能补全*

#### 别名支持

当表的名称设置别名以后，也支持列名称的补全：

*MySQL 别名支持*

#### 语法高亮

支持 MySQL 语法高亮：

*MySQL 语法高亮*

#### 格式化 SQL 的输出

MySQL 的输出会通过 [`less` 命令](https://www.tecmint.com/linux-more-command-and-less-command-examples/) 进行格式化输出：

*MySQL 格式化输出*

要登录 MySQL 并同时选择数据库，你可以使用和下面类似的命令：

```
$ mycli local_database
$ mycli -h localhost -u root app_db
$ mycli mysql://amjith@localhost:3306/django_poll

```

更多使用选项，请输入：

```
$ mycli --help

```

MyCLI 主页： <http://mycli.net/index>

记得阅读一些关于 MySQL 管理的有用文章：

1. [在 Linux 中用于数据库管理的 20 个 MySQL（Mysqladmin）命令](https://www.tecmint.com/mysqladmin-commands-for-database-administration-in-linux/)
2. [如何在 Linux 中更改默认的 MySQL/MariaDB 数据目录](https://www.tecmint.com/change-default-mysql-mariadb-data-directory-in-linux/)
3. [在 Linux 中监测 MySQL 性能的 4 个实用命令行工具](https://www.tecmint.com/mysql-performance-monitoring/)
4. [如何在 Linux 中更改 MySQL 或 MariaDB 的 Root 密码](/article-8328-1.html)
5. [MySQL 备份和恢复数据库管理命令](https://www.tecmint.com/mysql-backup-and-restore-commands-for-database-administration/)

MyCLI 作者写的两篇如何创建具有可发现性的交互式命令行客户端的文章：

1. [4 个拥有绝佳命令行界面的终端程序](/article-8526-1.html)
2. [4 个用于构建优秀的命令行用户界面的 Python 库](/article-8561-1.html)

这就是本文的全部内容了。在这篇指南中，我们展示了如何通过一些简单的命令在 Linux 中安装和使用 MyCLI。记得通过下面的反馈表向我们分享你关于这篇文章的想法。

---

作者简介：

Aaron Kili是一名 Linux 和 F.O.S.S 的爱好者，未来的 Linux 系统管理员、网站开发人员，目前是 TecMint 的内容创作者，他喜欢用电脑工作，并乐于分享知识。

---

via: <https://www.tecmint.com/mycli-mysql-client-with-auto-completion-syntax-highlighting/>

作者：[Aaron Kili](https://www.tecmint.com/author/aaronkili/) 译者：[ucasFL](https://github.com/ucasFL) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


ssh_scan：远程验证你 SSH 服务的配置和策略

Summary: ssh_scan 是一个面向 Linux 和 UNIX 服务器的易用的 SSH 服务参数配置和策略的扫描器程序，其思路来自Mozilla OpenSSH 安全指南，这个指南为 SSH 服务参数配置提供了一个可靠的安全策略基线的建议，如加密算法（Ciphers），报文认证信息码算法（MAC），密钥交换算法（KexAlgos）和其它。

前面讲的在安装有问题

系统：centos6.4

1.安装的是rubygems,少写了个s

2.yum rubygem会提示ruby版本要在2.0以上，

所以我使用的是源码安装的ruby 和rubygems，默认安装目录是/usr/local/bin    做个软链接到/usr/bin下就可以了

谢谢，已更正 :D

# ssh_scan：远程验证你 SSH 服务的配置和策略

`ssh_scan` 是一个面向 Linux 和 UNIX 服务器的易用的 SSH 服务参数配置和策略的扫描器程序，其思路来自[Mozilla OpenSSH 安全指南](https://wiki.mozilla.org/Security/Guidelines/OpenSSH)，这个指南为 SSH 服务参数配置提供了一个可靠的安全策略基线的建议，如加密算法（Ciphers），报文认证信息码算法（MAC），密钥交换算法（KexAlgos）和其它。

<img src="content_image/album_201706_05_094154g4ah7ilcejlls4ii.jpg" alt="" title="">

`ssh_scan` 有如下好处：

* 它的依赖是最小化的，`ssh_scan` 只引入了本地 Ruby 和 BinData 来进行它的工作，没有太多的依赖。
* 它是可移植的，你可以在其它的项目中使用 `ssh_scan` 或者将它用在[自动化任务](https://www.tecmint.com/automating-linux-system-administration-tasks/)上。
* 它是易于使用的，只需要简单的将它指向一个 SSH 服务就可以获得一个该服务所支持的选项和策略状态的 JSON 格式报告。
* 它同时也是易于配置的，你可以创建适合你策略需求的策略。

**建议阅读：** [如何在 Linux 上安装配置 OpenSSH 服务](https://www.tecmint.com/install-openssh-server-in-linux/)

### 如何在 Linux 上安装 ssh\_scan

有如下三种安装 `ssh_scan` 的方式：

使用 Ruby gem 来安装运行，如下：

```
----------- 在 Debian/Ubuntu -----------
$ sudo apt-get install rubygems
$ sudo gem install ssh_scan
----------- 在 CentOS/RHEL -----------
# yum install ruby rubygems
# gem install ssh_scan

```

使用[docker 容器](https://www.tecmint.com/install-docker-and-learn-containers-in-centos-rhel-7-6/)来运行，如下：

```
# docker pull mozilla/ssh_scan
# docker run -it mozilla/ssh_scan /app/bin/ssh_scan -t github.com

```

使用源码安装运行，如下：

```
# git clone https://github.com/mozilla/ssh_scan.git
# cd ssh_scan
# gpg2 --keyserver hkp://keys.gnupg.net --recv-keys 409B6B1796C275462A1703113804BB82D39DC0E3
# curl -sSL https://get.rvm.io | bash -s stable
# rvm install 2.3.1
# rvm use 2.3.1
# gem install bundler
# bundle install
# ./bin/ssh_scan

```

### 如何在 Linux 上使用 ssh\_scan

使用 `ssh_scan` 的语法如下：

```
$ ssh_scan -t ip地址
$ ssh_scan -t 主机名

```

举个例子来扫描 192.168.43.198 这台服务器的 SSH 配置和策略，键入：

```
$ ssh_scan -t 192.168.43.198

```

注意你同时也可以像下方展示的给 `-t` 选项传入一个[IP地址/地址段/主机名]：

```
$ ssh_scan -t 192.168.43.198,200,205
$ ssh_scan -t test.tecmint.lan

```

输出示例：

```
I, [2017-05-09T10:36:17.913644 #7145]  INFO -- : You're using the latest version of ssh_scan 0.0.19
[
  {
    "ssh_scan_version": "0.0.19",
    "ip": "192.168.43.198",
    "port": 22,
    "server_banner": "SSH-2.0-OpenSSH_7.2p2 Ubuntu-4ubuntu2.1",
    "ssh_version": 2.0,
    "os": "ubuntu",
    "os_cpe": "o:canonical:ubuntu:16.04",
    "ssh_lib": "openssh",
    "ssh_lib_cpe": "a:openssh:openssh:7.2p2",
    "cookie": "68b17bcca652eeaf153ed18877770a38",
    "key_algorithms": [
      "curve25519-sha256@libssh.org",
      "ecdh-sha2-nistp256",
      "ecdh-sha2-nistp384",
      "ecdh-sha2-nistp521",
      "diffie-hellman-group-exchange-sha256",
      "diffie-hellman-group14-sha1"
    ],
    "server_host_key_algorithms": [
      "ssh-rsa",
      "rsa-sha2-512",
      "rsa-sha2-256",
      "ecdsa-sha2-nistp256",
      "ssh-ed25519"
    ],
    "encryption_algorithms_client_to_server": [
      "chacha20-poly1305@openssh.com",
      "aes128-ctr",
      "aes192-ctr",
      "aes256-ctr",
      "aes128-gcm@openssh.com",
      "aes256-gcm@openssh.com"
    ],
    "encryption_algorithms_server_to_client": [
      "chacha20-poly1305@openssh.com",
      "aes128-ctr",
      "aes192-ctr",
      "aes256-ctr",
      "aes128-gcm@openssh.com",
      "aes256-gcm@openssh.com"
    ],
    "mac_algorithms_client_to_server": [
      "umac-64-etm@openssh.com",
      "umac-128-etm@openssh.com",
      "hmac-sha2-256-etm@openssh.com",
      "hmac-sha2-512-etm@openssh.com",
      "hmac-sha1-etm@openssh.com",
      "umac-64@openssh.com",
      "umac-128@openssh.com",
      "hmac-sha2-256",
      "hmac-sha2-512",
      "hmac-sha1"
    ],
    "mac_algorithms_server_to_client": [
      "umac-64-etm@openssh.com",
      "umac-128-etm@openssh.com",
      "hmac-sha2-256-etm@openssh.com",
      "hmac-sha2-512-etm@openssh.com",
      "hmac-sha1-etm@openssh.com",
      "umac-64@openssh.com",
      "umac-128@openssh.com",
      "hmac-sha2-256",
      "hmac-sha2-512",
      "hmac-sha1"
    ],
    "compression_algorithms_client_to_server": [
      "none",
      "zlib@openssh.com"
    ],
    "compression_algorithms_server_to_client": [
      "none",
      "zlib@openssh.com"
    ],
    "languages_client_to_server": [
    ],
    "languages_server_to_client": [
    ],
    "hostname": "tecmint",
    "auth_methods": [
      "publickey",
      "password"
    ],
    "fingerprints": {
      "rsa": {
        "known_bad": "false",
        "md5": "0e:d0:d7:11:f0:9b:f8:33:9c:ab:26:77:e5:66:9e:f4",
        "sha1": "fc:8d:d5:a1:bf:52:48:a6:7e:f9:a6:2f:af:ca:e2:f0:3a:9a:b7:fa",
        "sha256": "ff:00:b4:a4:40:05:19:27:7c:33:aa:db:a6:96:32:88:8e:bf:05:a1:81:c0:a4:a8:16:01:01:0b:20:37:81:11"
      }
    },
    "start_time": "2017-05-09 10:36:17 +0300",
    "end_time": "2017-05-09 10:36:18 +0300",
    "scan_duration_seconds": 0.221573169,
    "duplicate_host_key_ips": [
    ],
    "compliance": {
      "policy": "Mozilla Modern",
      "compliant": false,
      "recommendations": [
        "Remove these Key Exchange Algos: diffie-hellman-group14-sha1",
        "Remove these MAC Algos: umac-64-etm@openssh.com, hmac-sha1-etm@openssh.com, umac-64@openssh.com, hmac-sha1",
        "Remove these Authentication Methods: password"
      ],
      "references": [
        "https://wiki.mozilla.org/Security/Guidelines/OpenSSH"
      ]
    }
  }
]

```

你可以使用 `-p` 选项来指定不同的端口，`-L` 选项来开启日志记录配合 `-V` 选项来指定日志级别：

```
$ ssh_scan -t 192.168.43.198 -p 22222 -L ssh-scan.log -V INFO

```

另外，可以使用 `-P` 或 `--policy` 选项来指定一个策略文件（默认是 Mozilla Modern）（LCTT 译注：这里的 Modern 可能指的是 <https://wiki.mozilla.org/Security/Server_Side_TLS> 中提到的 Modern compatibility ）：

```
$ ssh_scan -t 192.168.43.198 -L ssh-scan.log -V INFO -P /path/to/custom/policy/file

```

ssh\_scan 使用帮助与其它示例：

```
$ ssh_scan -h

```

输出示例：

```
ssh_scan v0.0.17 (https://github.com/mozilla/ssh_scan)
Usage: ssh_scan [options]
-t, --target [IP/Range/Hostname] IP/Ranges/Hostname to scan
-f, --file [FilePath]            File Path of the file containing IP/Range/Hostnames to scan
-T, --timeout [seconds]          Timeout per connect after which ssh_scan gives up on the host
-L, --logger [Log File Path]     Enable logger
-O, --from_json [FilePath]       File to read JSON output from
-o, --output [FilePath]          File to write JSON output to
-p, --port [PORT]                Port (Default: 22)
-P, --policy [FILE]              Custom policy file (Default: Mozilla Modern)
--threads [NUMBER]           Number of worker threads (Default: 5)
--fingerprint-db [FILE]      File location of fingerprint database (Default: ./fingerprints.db)
--suppress-update-status     Do not check for updates
-u, --unit-test [FILE]           Throw appropriate exit codes based on compliance status
-V [STD_LOGGING_LEVEL],
--verbosity
-v, --version                    Display just version info
-h, --help                       Show this message
Examples:
ssh_scan -t 192.168.1.1
ssh_scan -t server.example.com
ssh_scan -t ::1
ssh_scan -t ::1 -T 5
ssh_scan -f hosts.txt
ssh_scan -o output.json
ssh_scan -O output.json -o rescan_output.json
ssh_scan -t 192.168.1.1 -p 22222
ssh_scan -t 192.168.1.1 -p 22222 -L output.log -V INFO
ssh_scan -t 192.168.1.1 -P custom_policy.yml
ssh_scan -t 192.168.1.1 --unit-test -P custom_policy.yml

```

SSH 服务器相关参考阅读：

1. [使用 SSH Keygen（ssh-keygen）五步实现 SSH 免密登录](https://www.tecmint.com/ssh-passwordless-login-using-ssh-keygen-in-5-easy-steps/)
2. [安全 SSH 服务器的 5 个最佳实践](/article-7683-1.html)
3. [使用 Chroot 来限制 SSH 用户进入某些目录](/article-8313-1.html)
4. [如何配置 SSH 连接来简化远程登录](/article-8306-1.html)

如果需要更详细的信息可以访问 `ssh_scan` 的 Github 仓库：<https://github.com/mozilla/ssh_scan>

---

作者简介：

Aaron Kili 是 Linux 与 F.O.S.S （自由及开源软件）爱好者，一位将来的 Linux 系统管理员，网站开发者，现在是一个热爱与计算机一起工作并且拥有强烈知识分信念的 TecMint 内容贡献者。

---

via: <https://www.tecmint.com/ssh_scan-ssh-configuration-and-policy-scanner-for-linux/>

作者：[Aaron Kili](https://www.tecmint.com/author/aaronkili/) 译者：[wcnnbdk1](https://github.com/wcnnbdk1) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Summary: 在本篇中，我们会向你解释 shutdown、poweroff、halt 以及 reboot 命令。我们会解释清楚当你用那些可用的选项执行的时候它们实际做了什么。

只能说是介绍，而不是理解。<br />
没什么干货。

这个。。。

最重要的是要分清出"停止機器"和"關閉機器"的區別，至於用哪個命令，呵呵，這些命令是互相引用或者說互相替代的～

poweroff和shutdown now一样啊

并没有解释这些命令具体的细节和区别，差评

并没有看懂什么。。。

等于没写

"低层维护状态"是什么意思？“底层维护”还听说过。

原文如此，low-level ，应该不是专有名词，可能是指，处于通电但是没有进入引导状态。

很水啊，没有解释下几个名词的区别吗？

shutdown 以一种安全的方式关闭系统。所有登陆用户都可以看到关机信息提示，并且 login  将被阻塞。

halt命令，若系统的 runlevel 为 0 或 6 ，则关闭系统，否则以 shutdown 指令（加上 -h 参数）来取代。

poweroff命令用来关闭计算机操作系统并且切断系统电源。

reboot执行reboot指令可让系统停止运作，并重新开机。

网上能搜到的就这些，详细的内容自己搜搜看吧，文章列出的内容确实太单一了。

要看具体的 init 是什么，systemd 是没有 runlevel 的概念。

来自 man 的简要说明

poweroff, halt, reboot: These are legacy commands available for compatibility only.

shutdown: shutdown may be used to halt, power-off or reboot the machine.

然而我并没有看懂

我选择init 0 关机init 6 重启

其实我还是比较想知道shutdown -r now和reboot的区别，据我所了解的：

【reboot】默认情况下其实是调用了shutdown -r来进行重启的；

和【halt】类似，【halt】其实是调用shutdown -h命令！

这种理解不知道是否正确？！

關閉機器:主板关电<br />
停止機器：主板不关电，可以看到风扇、灯都在闪

# 理解 Linux 中的 shutdown、poweroff、halt 和 reboot 命令

<img src="content_image/album_201706_05_095810ydt5h18yh8etzhkx.jpg" alt="" title="">

在本篇中，我们会向你解释 `shutdown`、`poweroff`、`halt` 以及 `reboot` 命令。我们会解释清楚当你用那些可用的选项执行的时候它们实际做了什么。

如果你想深入 Linux 服务器管理，那么为了有效和可靠的服务器管理，这些[重要的 Linux 命令](https://www.tecmint.com/60-commands-of-linux-a-guide-from-newbies-to-system-administrator/)你需要完全理解。

通常上，当你想要关闭或者重启你的机器时，你会运行下面之一的命令：

### shutdown 命令

`shutdown` 会给系统计划一个时间关机。它可以被用于停止、关机、重启机器。

你可以指定一个时间字符串（通常是 `now` 或者用 `hh:mm` 指定小时/分钟）作为第一个参数。额外地，你也可以设置一个广播信息在系统关闭前发送给所有已登录的用户。

重要：如果使用了时间参数，系统关机前 5 分钟，会创建 `/run/nologin` 文件。以确保没有人可以再登录。

`shutdown` 命令示例：

```
# shutdown
# shutdown now
# shutdown 13:20
# shutdown -p now  ### 关闭机器
# shutdown -H now  ### 停止机器
# shutdown -r09:35 ### 在 09:35am 重启机器

```

要取消即将进行的关机，只要输入下面的命令：

```
# shutdown -c

```

### halt 命令

`halt` 通知硬件来停止所有的 CPU 功能，但是仍然保持通电。你可以用它使系统处于低层维护状态。

注意在有些情况会它会完全关闭系统。下面是 `halt` 命令示例：

```
# halt             ### 停止机器
# halt -p          ### 关闭机器
# halt --reboot    ### 重启机器

```

### poweroff 命令

`poweroff` 会发送一个 ACPI 信号来通知系统关机。

下面是 `poweroff` 命令示例：

```
# poweroff           ### 关闭机器
# poweroff --halt    ### 停止机器
# poweroff --reboot  ### 重启机器

```

### reboot 命令

`reboot` 通知系统重启。

```
# reboot           ### 重启机器
# reboot --halt    ### 停止机器
# reboot -p        ### 关闭机器

```

就是这样了！如先前提到的，理解这些命令能够有效并可靠地在多用户环境下管理 Linux 服务器。你有一些额外的想法么？在评论区留言与我们分享。

---

作者简介：

Aaron Kili是一名 Linux 和 F.O.S.S 的爱好者，未来的 Linux 系统管理员、网站开发人员，目前是 TecMint 的内容创作者，他喜欢用电脑工作，并乐于分享知识。

---

via: <https://www.tecmint.com/shutdown-poweroff-halt-and-reboot-commands-in-linux/>

作者：[Aaron Kili](https://www.tecmint.com/author/aaronkili/) 译者：[geekpi](https://github.com/geekpi) 校对：[jasminepeng](https://github.com/jasminepeng)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


极客漫画：数据库链接池中的生生死死

你知道得太多了<br />
“砰”

大企业吗？真是伤脑筋。

“砰”

# 极客漫画：数据库链接池中的生生死死

<img src="content_image/album_201706_05_140712giqn2zgynkl17fq1.png" alt="Life (and Death) in the DB Connection Pool" title="Life (and Death) in the DB Connection Pool">

数据库连接池是常用的 B/S 技术，而似乎生活在这个“池子”里面的那些连接对象有点不幸。

要是顺利的话，你干完活就可以歇着了。

要是不顺利，比如你掌握的连接已经被拒绝了，那么……

你就会被“砰”地干掉。就问你怕不怕？（话说回来，回答错误会不会也被“砰”……）

---

via: <http://turnoff.us/geek/db-connection-pool/>

作者：[Daniel Stori](http://turnoff.us/about/) 译者&点评：[wxy](https://github.com/wxy) 校对&合成：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


调试器工作原理（三）：调试信息

# 调试器工作原理（三）：调试信息

这是调试器的工作原理系列文章的第三篇。阅读这篇文章之前应当先阅读[第一篇](/article-8552-1.html)与[第二篇](/article-8418-1.html)。

### 这篇文章的主要内容

本文将解释调试器是如何在机器码中查找它将 C 语言源代码转换成机器语言代码时所需要的 C 语言函数、变量、与数据。

### 调试信息

现代编译器能够将有着各种缩进或嵌套的程序流程、各种数据类型的变量的高级语言代码转换为一大堆称之为机器码的 0/1 数据，这么做的唯一目的是尽可能快的在目标 CPU 上运行程序。通常来说一行 C 语言代码能够转换为若干条机器码。变量被分散在机器码中的各个部分，有的在堆栈中，有的在寄存器中，或者直接被优化掉了。数据结构与对象在机器码中甚至不“存在”，它们只是用于将数据按一定的结构编码存储进缓存。

那么调试器怎么知道，当你需要在某个函数入口处暂停时，程序要在哪停下来呢？它怎么知道当你查看某个变量值时，它怎么找到这个值？答案是，调试信息。

编译器在生成机器码时同时会生成相应的调试信息。调试信息代表了可执行程序与源代码之间的关系，并以一种提前定义好的格式，同机器码存放在一起。过去的数年里，人们针对不同的平台与可执行文件发明了很多种用于存储这些信息的格式。不过我们这篇文章不会讲这些格式的历史，而是将阐述这些调试信息是如何工作的，所以我们将专注于一些事情，比如 `DWARF`。`DWARF` 如今十分广泛的用作 Linux 和类 `Unix` 平台上的可执行文件的调试格式。

### ELF 中的 DWARF

根据[它的维基百科](http://en.wikipedia.org/wiki/DWARF) 所描述，虽然 `DWARF` 是同 `ELF` 一同设计的（`DWARF` 是由 `DWARF` 标准委员会推出的开放标准。上文中展示的图标就来自这个网站。），但 `DWARF` 在理论上来说也可以嵌入到其他的可执行文件格式中。

`DWARF` 是一种复杂的格式，它吸收了过去许多年各种不同的架构与操作系统的格式的经验。正是因为它解决了一个在任何平台与 ABI （应用二进制接口）上为任意高级语言产生调试信息这样棘手的难题，它也必须很复杂。想要透彻的讲解 `DWARF` 仅仅是通过这单薄的一篇文章是远远不够的，说实话我也并没有充分地了解 `DWARF` 到每一个微小的细节，所以我也不能十分透彻的讲解 （如果你感兴趣的话，文末有一些能够帮助你的资源。建议从 `DWARF` 教程开始上手）。这篇文章中我将以浅显易懂的方式展示 `DWARF`，以说明调试信息是如何实际工作的。

### ELF 文件中的调试部分

首先让我们看看 `DWARF` 处在 ELF 文件中的什么位置。`ELF` 定义了每一个生成的目标文件中的每一节。 <ruby> 节头表 <rt>  section header table </rt></ruby> 声明并定义了每一节及其名字。不同的工具以不同的方式处理不同的节，例如连接器会寻找连接器需要的部分，调试器会查找调试器需要的部分。

我们本文的实验会使用从这个 C 语言源文件构建的可执行文件，编译成 `tracedprog2`：

```
#include <stdio.h>

void do_stuff(int my_arg)、
{
    int my_local = my_arg + 2;
    int i;

    for (i = 0; i < my_local; ++i)
        printf("i = %d\n", i);
}

int main()
{
    do_stuff(2);
    return 0;
}

```

使用 `objdump -h` 命令检查 `ELF` 可执行文件中的<ruby> 节头 <rt>  section header </rt></ruby>，我们会看到几个以 `.debug_` 开头的节，这些就是 `DWARF` 的调试部分。

```
26 .debug_aranges 00000020  00000000  00000000  00001037
                 CONTENTS, READONLY, DEBUGGING
27 .debug_pubnames 00000028  00000000  00000000  00001057
                 CONTENTS, READONLY, DEBUGGING
28 .debug_info   000000cc  00000000  00000000  0000107f
                 CONTENTS, READONLY, DEBUGGING
29 .debug_abbrev 0000008a  00000000  00000000  0000114b
                 CONTENTS, READONLY, DEBUGGING
30 .debug_line   0000006b  00000000  00000000  000011d5
                 CONTENTS, READONLY, DEBUGGING
31 .debug_frame  00000044  00000000  00000000  00001240
                 CONTENTS, READONLY, DEBUGGING
32 .debug_str    000000ae  00000000  00000000  00001284
                 CONTENTS, READONLY, DEBUGGING
33 .debug_loc    00000058  00000000  00000000  00001332
                 CONTENTS, READONLY, DEBUGGING

```

每个节的第一个数字代表了该节的大小，最后一个数字代表了这个节开始位置距离 `ELF` 的偏移量。调试器利用这些信息从可执行文件中读取节。

现在让我们看看一些在 `DWARF` 中查找有用的调试信息的实际例子。

### 查找函数

调试器的最基础的任务之一，就是当我们在某个函数处设置断点时，调试器需要能够在入口处暂停。为此，必须为高级代码中的函数名称与函数在机器码中指令开始的地址这两者之间建立起某种映射关系。

为了获取这种映射关系，我们可以查找 `DWARF` 中的 `.debug_info` 节。在我们深入之前，需要一点基础知识。`DWARF` 中每一个描述类型被称之为调试信息入口（`DIE`）。每个 `DIE` 都有关于它的类型、属性之类的标签。`DIE` 之间通过兄弟节点或子节点相互连接，属性的值也可以指向其它的 `DIE`。

运行以下命令：

```
objdump --dwarf=info tracedprog2

```

输出文件相当的长，为了方便举例我们只关注这些行（从这里开始，无用的冗长信息我会以 （...）代替，方便排版）：

```
<1><71>: Abbrev Number: 5 (DW_TAG_subprogram)
    <72>   DW_AT_external    : 1
    <73>   DW_AT_name        : (...): do_stuff
    <77>   DW_AT_decl_file   : 1
    <78>   DW_AT_decl_line   : 4
    <79>   DW_AT_prototyped  : 1
    <7a>   DW_AT_low_pc      : 0x8048604
    <7e>   DW_AT_high_pc     : 0x804863e
    <82>   DW_AT_frame_base  : 0x0      (location list)
    <86>   DW_AT_sibling     : <0xb3>

<1><b3>: Abbrev Number: 9 (DW_TAG_subprogram)
    <b4>   DW_AT_external    : 1
    <b5>   DW_AT_name        : (...): main
    <b9>   DW_AT_decl_file   : 1
    <ba>   DW_AT_decl_line   : 14
    <bb>   DW_AT_type        : <0x4b>
    <bf>   DW_AT_low_pc      : 0x804863e
    <c3>   DW_AT_high_pc     : 0x804865a
    <c7>   DW_AT_frame_base  : 0x2c     (location list)

```

上面的代码中有两个带有 `DW_TAG_subprogram` 标签的入口，在 `DWARF` 中这是对函数的指代。注意，这是两个节的入口，其中一个是 `do_stuff` 函数的入口，另一个是主（`main`）函数的入口。这些信息中有很多值得关注的属性，但其中最值得注意的是 `DW_AT_low_pc`。它代表了函数开始处程序指针的值（在 x86 平台上是 `EIP`）。此处 `0x8048604` 代表了 `do_stuff` 函数开始处的程序指针。下面我们将利用 `objdump -d` 命令对可执行文件进行反汇编。来看看这块地址中都有什么：

```
08048604 <do_stuff>:
 8048604:       55           push   ebp
 8048605:       89 e5        mov    ebp,esp
 8048607:       83 ec 28     sub    esp,0x28
 804860a:       8b 45 08     mov    eax,DWORD PTR [ebp+0x8]
 804860d:       83 c0 02     add    eax,0x2
 8048610:       89 45 f4     mov    DWORD PTR [ebp-0xc],eax
 8048613:       c7 45 (...)  mov    DWORD PTR [ebp-0x10],0x0
 804861a:       eb 18        jmp    8048634 <do_stuff+0x30>
 804861c:       b8 20 (...)  mov    eax,0x8048720
 8048621:       8b 55 f0     mov    edx,DWORD PTR [ebp-0x10]
 8048624:       89 54 24 04  mov    DWORD PTR [esp+0x4],edx
 8048628:       89 04 24     mov    DWORD PTR [esp],eax
 804862b:       e8 04 (...)  call   8048534 <printf@plt>
 8048630:       83 45 f0 01  add    DWORD PTR [ebp-0x10],0x1
 8048634:       8b 45 f0     mov    eax,DWORD PTR [ebp-0x10]
 8048637:       3b 45 f4     cmp    eax,DWORD PTR [ebp-0xc]
 804863a:       7c e0        jl     804861c <do_stuff+0x18>
 804863c:       c9           leave
 804863d:       c3           ret

```

显然，`0x8048604` 是 `do_stuff` 的开始地址，这样一来，调试器就可以建立函数与其在可执行文件中的位置间的映射关系。

### 查找变量

假设我们当前在 `do_staff` 函数中某个位置上设置断点停了下来。我们想通过调试器取得 `my_local` 这个变量的值。调试器怎么知道在哪里去找这个值呢？很显然这要比查找函数更为困难。变量可能存储在全局存储区、堆栈、甚至是寄存器中。此外，同名变量在不同的作用域中可能有着不同的值。调试信息必须能够反映所有的这些变化，当然，`DWARF` 就能做到。

我不会逐一去将每一种可能的状况，但我会以调试器在 `do_stuff` 函数中查找 `my_local` 变量的过程来举个例子。下面我们再看一遍 `.debug_info` 中 `do_stuff` 的每一个入口，这次连它的子入口也要一起看。

```
<1><71>: Abbrev Number: 5 (DW_TAG_subprogram)
    <72>   DW_AT_external    : 1
    <73>   DW_AT_name        : (...): do_stuff
    <77>   DW_AT_decl_file   : 1
    <78>   DW_AT_decl_line   : 4
    <79>   DW_AT_prototyped  : 1
    <7a>   DW_AT_low_pc      : 0x8048604
    <7e>   DW_AT_high_pc     : 0x804863e
    <82>   DW_AT_frame_base  : 0x0      (location list)
    <86>   DW_AT_sibling     : <0xb3>
 <2><8a>: Abbrev Number: 6 (DW_TAG_formal_parameter)
    <8b>   DW_AT_name        : (...): my_arg
    <8f>   DW_AT_decl_file   : 1
    <90>   DW_AT_decl_line   : 4
    <91>   DW_AT_type        : <0x4b>
    <95>   DW_AT_location    : (...)       (DW_OP_fbreg: 0)
 <2><98>: Abbrev Number: 7 (DW_TAG_variable)
    <99>   DW_AT_name        : (...): my_local
    <9d>   DW_AT_decl_file   : 1
    <9e>   DW_AT_decl_line   : 6
    <9f>   DW_AT_type        : <0x4b>
    <a3>   DW_AT_location    : (...)      (DW_OP_fbreg: -20)
<2><a6>: Abbrev Number: 8 (DW_TAG_variable)
    <a7>   DW_AT_name        : i
    <a9>   DW_AT_decl_file   : 1
    <aa>   DW_AT_decl_line   : 7
    <ab>   DW_AT_type        : <0x4b>
    <af>   DW_AT_location    : (...)      (DW_OP_fbreg: -24)

```

看到每个入口处第一对尖括号中的数字了吗？这些是嵌套的等级，在上面的例子中，以 `<2>` 开头的入口是以 `<1>` 开头的子入口。因此我们得知 `my_local` 变量（以 `DW_TAG_variable` 标签标记）是 `do_stuff` 函数的局部变量。除此之外，调试器也需要知道变量的数据类型，这样才能正确的使用与显示变量。上面的例子中 `my_local` 的变量类型指向另一个 `DIE` `<0x4b>`。如果使用 `objdump` 命令查看这个 `DIE` 的话，我们会发现它是一个有符号 4 字节整型数据。

而为了在实际运行的程序内存中查找变量的值，调试器需要使用到 `DW_AT_location` 属性。对于 `my_local` 而言，是 `DW_OP_fbreg: -20`。这个代码段的意思是说 `my_local` 存储在距离它所在函数起始地址偏移量为 `-20` 的地方。

`do_stuff` 函数的 `DW_AT_frame_base` 属性值为 `0x0 (location list)`。这意味着这个属性的值需要在 `location list` 中查找。下面我们来一起看看。

```
$ objdump --dwarf=loc tracedprog2

tracedprog2:     file format elf32-i386

Contents of the .debug_loc section:

    Offset   Begin    End      Expression
    00000000 08048604 08048605 (DW_OP_breg4: 4 )
    00000000 08048605 08048607 (DW_OP_breg4: 8 )
    00000000 08048607 0804863e (DW_OP_breg5: 8 )
    00000000 <End of list>
    0000002c 0804863e 0804863f (DW_OP_breg4: 4 )
    0000002c 0804863f 08048641 (DW_OP_breg4: 8 )
    0000002c 08048641 0804865a (DW_OP_breg5: 8 )
    0000002c <End of list>

```

我们需要关注的是第一列（`do_stuff` 函数的 `DW_AT_frame_base` 属性包含 `location list` 中 `0x0` 的偏移量。而 `main` 函数的相同属性包含 `0x2c` 的偏移量，这个偏移量是第二套地址列表的偏移量）。对于调试器可能定位到的每一个地址，它都会指定当前栈帧到变量间的偏移量，而这个偏移就是通过寄存器来计算的。对于 x86 平台而言，`bpreg4` 指向 `esp`，而 `bpreg5` 指向 `ebp`。

让我们再看看 `do_stuff` 函数的头几条指令。

```
08048604 <do_stuff>:
 8048604:       55          push   ebp
 8048605:       89 e5       mov    ebp,esp
 8048607:       83 ec 28    sub    esp,0x28
 804860a:       8b 45 08    mov    eax,DWORD PTR [ebp+0x8]
 804860d:       83 c0 02    add    eax,0x2
 8048610:       89 45 f4    mov    DWORD PTR [ebp-0xc],eax

```

只有当第二条指令执行后，`ebp` 寄存器才真正存储了有用的值。当然，前两条指令的基址是由上面所列出来的地址信息表计算出来的。一但 `ebp` 确定了，计算偏移量就十分方便了，因为尽管 `esp` 在操作堆栈的时候需要移动，但 `ebp` 作为栈底并不需要移动。

究竟我们应该去哪里找 `my_local` 的值呢？在 `0x8048610` 这块地址后， `my_local` 的值经过在 `eax` 中的计算后被存在了内存中，从这里开始我们才需要关注 `my_local` 的值。调试器会利用 `DW_OP_breg5: 8` 这个栈帧来查找。我们回想下，`my_local` 的 `DW_AT_location` 属性值为 `DW_OP_fbreg: -20`。所以应当从基址中 `-20` ，同时由于 `ebp` 寄存器需要 `+8`，所以最终结果为 `ebp - 12`。现在再次查看反汇编代码，来看看数据从 `eax` 中被移动到哪里了。当然，这里 `my_local` 应当被存储在了 `ebp - 12` 的地址中。

### 查看行号

当我们谈到在调试信息寻找函数的时候，我们利用了些技巧。当调试 C 语言源代码并在某个函数出放置断点的时候，我们并不关注第一条“机器码”指令（函数的调用准备工作已经完成而局部变量还没有初始化）。我们真正关注的是函数的第一行“C 代码”。

这就是 `DWARF` 完全覆盖映射 C 源代码中的行与可执行文件中机器码地址的原因。下面是 `.debug_line` 节中所包含的内容，我们将其转换为可读的格式展示如下。

```
$ objdump --dwarf=decodedline tracedprog2

tracedprog2:     file format elf32-i386

Decoded dump of debug contents of section .debug_line:

CU: /home/eliben/eli/eliben-code/debugger/tracedprog2.c:
File name           Line number    Starting address
tracedprog2.c                5           0x8048604
tracedprog2.c                6           0x804860a
tracedprog2.c                9           0x8048613
tracedprog2.c               10           0x804861c
tracedprog2.c                9           0x8048630
tracedprog2.c               11           0x804863c
tracedprog2.c               15           0x804863e
tracedprog2.c               16           0x8048647
tracedprog2.c               17           0x8048653
tracedprog2.c               18           0x8048658

```

很容易就可以看出其中 C 源代码与反汇编代码之间的对应关系。第 5 行指向 `do_stuff` 函数的入口，`0x8040604`。第 6 行，指向 `0x804860a` ，正是调试器在调试 `do_stuff` 函数时需要停下来的地方。这里已经完成了函数调用的准备工作。上面的这些信息形成了行号与地址间的双向映射关系。

* 当在某一行设置断点的时候，调试器会利用这些信息去查找相应的地址来做断点工作（还记得上篇文章中的 `int 3` 指令吗？）
* 当指令造成段错误时，调试器会利用这些信息来查看源代码中发生问题的行。

### libdwarf - 用 DWARF 编程

尽管使用命令行工具来获得 `DWARF` 很有用，但这仍然不够易用。作为程序员，我们希望知道当我们需要这些调试信息时应当怎么编程来获取这些信息。

自然我们想到的第一种方法就是阅读 `DWARF` 规范并按规范操作阅读使用。有句话说的好，分析 HTML 应当使用库函数，永远不要手工分析。对于 `DWARF` 来说正是如此。`DWARF` 比 HTML 要复杂得多。上面所展示出来的只是冰山一角。更糟糕的是，在实际的目标文件中，大部分信息是以非常紧凑的压缩格式存储的，分析起来更加复杂（信息中的某些部分，例如位置信息与行号信息，在某些虚拟机下是以指令的方式编码的）。

所以我们要使用库来处理 `DWARF`。下面是两种我熟悉的主要的库（还有些不完整的库这里没有写）

1. `BFD` （libbfd），包含了 `objdump` （对，就是这篇文章中我们一直在用的这货），`ld`（`GNU` 连接器）与 `as`（`GNU` 编译器）。`BFD` 主要用于 [GNU binutils](http://www.gnu.org/software/binutils/)。
2. `libdwarf` ，同它的哥哥 `libelf` 一同用于 `Solaris` 与 `FreeBSD` 中的调试信息分析。

相比较而言我更倾向于使用 `libdwarf`，因为我对它了解的更多，并且 `libdwarf` 的开源协议更开放（`LGPL` 对比 `GPL`）。

因为 `libdwarf` 本身相当复杂，操作起来需要相当多的代码，所以我在这不会展示所有代码。你可以在 [这里](https://github.com/eliben/code-for-blog/blob/master/2011/dwarf_get_func_addr.c) 下载代码并运行试试。运行这些代码需要提前安装 `libelfand` 与 `libdwarf` ，同时在使用连接器的时候要使用参数 `-lelf` 与 `-ldwarf`。

这个示例程序可以接受可执行文件并打印其中的函数名称与函数入口地址。下面是我们整篇文章中使用的 C 程序经过示例程序处理后的输出。

```
$ dwarf_get_func_addr tracedprog2
DW_TAG_subprogram: 'do_stuff'
low pc  : 0x08048604
high pc : 0x0804863e
DW_TAG_subprogram: 'main'
low pc  : 0x0804863e
high pc : 0x0804865a

```

`libdwarf` 的文档很棒，如果你花些功夫，利用 `libdwarf` 获得这篇文章中所涉及到的 `DWARF` 信息应该并不困难。

### 结论与计划

原理上讲，调试信息是个很简单的概念。尽管实现细节可能比较复杂，但经过了上面的学习我想你应该了解了调试器是如何从可执行文件中获取它需要的源代码信息的了。对于程序员而言，程序只是代码段与数据结构；对可执行文件而言，程序只是一系列存储在内存或寄存器中的指令或数据。但利用调试信息，调试器就可以将这两者连接起来，从而完成调试工作。

此文与这系列的前两篇，一同介绍了调试器的内部工作过程。利用这里所讲到的知识，再敲些代码，应该可以完成一个 Linux 中最简单、基础但也有一定功能的调试器。

下一步我并不确定要做什么，这个系列文章可能就此结束，也有可能我要讲些堆栈调用的事情，又或者讲 Windows 下的调试。你们有什么好的点子或者相关材料，可以直接评论或者发邮件给我。

### 参考

* objdump 参考手册
* [ELF](http://en.wikipedia.org/wiki/Executable_and_Linkable_Format) 与 [DWARF](http://en.wikipedia.org/wiki/DWARF) 的维基百科
* [Dwarf Debugging Standard 主页](http://dwarfstd.org/)，这里有很棒的 DWARF 教程与 DWARF 标准，作者是 Michael Eager。第二版基于 GCC 也许更能吸引你。
* [libdwarf 主页](http://reality.sgiweb.org/davea/dwarf.html)，这里可以下载到 libwarf 的完整库与参考手册
* [BFD 文档](http://sourceware.org/binutils/docs-2.21/bfd/index.html)

---

---

via: <http://eli.thegreenplace.net/2011/02/07/how-debuggers-work-part-3-debugging-information>

作者：[Eli Bendersky](http://eli.thegreenplace.net/) 译者：[YYforymj](https://github.com/YYforymj) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


软件定义存储（SDS）的发展：十个你应当知道的项目

# 软件定义存储（SDS）的发展：十个你应当知道的项目

<img src="content_image/album_201706_06_153319xy8kyg6blkreodt6.jpg" alt="Software defined Storage" title="Software Defined Storage">

>
> 凭借 SDS，组织机构可以更好抽象出底层存储的管理功能，并且通过不同策略实现灵活配置。下面将要向你展示一些你应当知道的此类开源项目。
>
>
>

纵观 2016 年，SDS（Software-Defined Storage，软件定义存储）方面取得了很多里程碑式的进步，并且日益紧密的与云部署结合在了一起。凭借 SDS ，组织机构可以更好抽象出底层存储的管理功能，并且通过不同策略实现灵活配置。当然，他们也可以选择自由开源的 SDS 解决方案。人们熟知的 Ceph 正是凭借 OpenStack 部署在不断扩大自己的影响力，但是它离成为唯一的 SDS 开源项目还有很长的路要走。

Gartner 的一份市场调查报告中预测，截至到 2019 年，70% 已有的存储部署解决方案会支持以纯软件的方式来实施。同时 Gartner 还预测截至到 2020 年，70% 到 80% 的非结构化数据会存储在由 SDS 管理的廉价存储设备中。

最近，Dell EMC 公司加入到了由 Linux 基金会发起的 [OpenSDS](http://ctt.marketwire.com/?release=11G125514-001&id=10559023&type=0&url=https%3A%2F%2Fwww.opensds.io%2F) 项目中。 OpenSDS 致力于寻求解决 SDS 集成所面临的挑战，并推动企业对开放标准的采用。它由存储客户与厂商组成，包括 Fujitsu，Hitachi Data Systems，Huawei，Oregon State University 以及 Vodafone。同时 OpenSDS 也寻求与其它的上游开源社区进行合作，比如 Cloud Native Computing Foundation、Docker、OpenStack 以及 Open Container Initiative。

根据 Open SDS 项目的 [主页](https://www.opensds.io/)，2017 年会是 SDS 的一个元年：“社区希望在 2017 第二季度完成原型的发布，并且在第三季度中发布一个测试版本。OpenSDS 的最初组织者期望能通过这个项目来影响到一些开源技术，比如来自 Openstack 社区的 Cinder 和 Manila 项目，并且能够支持更广泛的云存储解决方案。”

与此同时，SDS 相关项目也呈现了爆发式的增长，其范围横跨 Apache Cassandra 到 Cehp。Linux 基金会最近发布了 2016 年度报告“[开放云指南：当前的趋势及开源项目](http://ctt.marketwire.com/?release=11G120876-001&id=10172077&type=0&url=http%3A%2F%2Fgo.linuxfoundation.org%2Frd-open-cloud-report-2016-pr)”，报告从整体上分析了开放云计算的现状，其中有一章涵盖了 SDS。你可以[下载](http://go.linuxfoundation.org/l/6342/2016-10-31/3krbjr)这篇报告，需要注意的是，这是一份综合了容器发展趋势、SDS，以及云计算的重新定义等等很多内容。报告中涵盖了当今对于开源云计算最重要的一些项目，并分类给出了描述和链接。

在这个系列的文章中，我们从该报告中整理了很多项目，并且针对它们是如何发展的提供了一些额外的视角及信息。在下面的内容当中，你会看到现今对 SDS 来说很重要的项目，并且能了解到它们为什么具有这么大的影响力。同时，根据上面的报告，我们提供了相关项目的 GitHub 仓库链接，方便大家查看。

### 软件定义存储（SDS）

* [Apache Cassandra](http://cassandra.apache.org/)

Apache Cassandra 是一个可扩展的、高可用的，面向任务优先应用的数据库。它可以运行在商业设备或者云架构上，并且能实现跨数据中心的低延迟数据传输，同时具备良好的容错性。[Cassandra 的 GitHub 仓库](https://github.com/apache/cassandra)。
* [Ceph](http://ceph.com/)

Ceph 是 Red Hat 构建的一个企业级可扩展的块设备、对象，以及文件存储平台，并且可部署在公有云或者私有云之上。Ceph 目前被广泛应用于 OpenStack。[Ceph 的 GitHub 仓库](https://github.com/ceph/ceph)。
* [CouchDB](http://couchdb.apache.org/)

CouchDB 是一个 Apache 软件基金会项目，是一个单节点或者集群数据库管理系统。CouchDB 提供了 RESTful HTTP 接口来读取和更新数据库文件。[CouchDB 的 GitHub 仓库](https://github.com/apache/couchdb)。
* [Docker 数据卷插件](https://docs.docker.com/engine/extend/plugins_volume/)

Docker Engine 数据卷插件可以使 Engine 与外部的存储系统一起集成部署，并且数据卷的生命周期与单一 Engine 主机相同。目前存在很多第三方的数据卷管理插件，包括 Azure File Storage、NetApp、VMware vSphere 等等。你可以在 GitHub上查找到更多的插件。
* [GlusterFS](https://www.gluster.org/)

Gluster 是 Red Hat 的可扩展网络文件系统，同时也是数据管理平台。Gluster 可以部署在公有云，私有云或者混合云之上，可用于 Linux 容器内的流媒体处理任务、数据分析任务，以及其它数据和带宽敏感型任务的执行。[GlusterFS 的 GitHub 仓库](https://github.com/gluster/glusterfs)。
* [MongoDB](https://www.mongodb.com/)

MongoDB 是一个高性能的文件数据库，并且部署和扩展都非常简单。[MongoDB 的 GitHub 仓库](https://github.com/mongodb/mongo)。
* [Nexenta](https://nexenta.com/)

NexentaStor 是一个可扩展的、统一的软件定义的文件和块设备管理服务，同时支持数据管理功能。它能够与 VMware 集成，并且支持 Docker 和 OpenStack。[Nexenta 的 GitHub 仓库](https://github.com/Nexenta)。
* [Redis](http://redis.io/)

Redis 是一个基于内存的数据存储，一般被用作数据库、缓存，以及消息代理。它支持多种数据结构，并且本身支持复制、Lua 脚本、LRU 算法、事务，以及多层级的硬盘持久化。
* [Riak CS](http://docs.basho.com/riak/cs/2.1.1/)

Riak CS（Cloud Storage）是基于 Basho 的分布式数据库 Riak KV 构建的对象存储软件。它提供了在不同规模的分布式云存储能力，可以用于公有云和私有云，还能为大压力的应用和服务提供基础的存储服务。其 API 兼容 Amazon S3，并且支持租户级别的费用计算和测量能力。[Riak CS 的 GitHub 仓库](https://github.com/basho/riak_cs)。
* [Swift](https://wiki.openstack.org/wiki/Swift)

Swift 是 OpenStack 项目中的对象存储系统，设计初衷是通过简单 API 存储和获取非结构化数据。Swift 设计之初就是可扩展的，并且针对持久性、可靠性以及并发数据读取做了优化。[Swift 的 GitHub 仓库](https://github.com/openstack/swift)。

*了解更多的开源云计算趋势以及更完整的开源云计算项目列表，请[下载 Linux 基金会的“开放云指南”](http://bit.ly/2eHQOwy)。*

（题图：Pixabay，CC0）

---

via: <https://www.linux.com/news/open-cloud-report/2016/guide-open-cloud-software-defined-storage-opens>

作者：[SAM DEAN](https://www.linux.com/users/sam-dean) 译者：[toutoudnf](https://github.com/toutoudnf) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


mimipenguin：从当前 Linux 用户转储登录密码

# mimipenguin：从当前 Linux 用户转储登录密码

mimipenguin 是一个免费、开源、简单但是强大的 shell/python 脚本，用来从当前 Linux 桌面用户转储登录凭证（用户名和密码），并且已在不同的 Linux 发行版中测试过。

另外，它还支持如：VSFTPd（活跃的 FTP 客户端连接）、Apache2（活跃的/旧的 HTTP 基础认证会话，但是这需要 Gcore），还有 openssh-server（活跃的 SSH 链接，需用 [sudo 命令](https://www.tecmint.com/sudoers-configurations-for-setting-sudo-in-linux/)）。重要的是，它逐渐被移植到其他语言中，以支持所有可想到的以后可以利用的情况。

### mimipenguin 是如何工作的？

要理解 mimipenguin 是如何工作的，你需要知道所有或者大多数的 Linux 发行版会在内存中存储大量的重要信息, 如：凭据、加密密钥以及个人数据。

尤其是用户名和密码是由进程（运行中的程序）保存在内存中，并以明文形式存储较长时间。mimipenguin 在技术上利用这些在内存中的明文凭证 - 它会转储一个进程，并提取可能包含明文凭据的行。

然后，通过以下内容的哈希值来尝试计算每个单词的出现几率：`/etc/shadow`、内存和 regex 搜索。一旦找到任何内容，它就会在标准输出上打印出来。

### 在 Linux 中安装 mimipenguin

我们将使用 git 来克隆 mimipenguin 仓库，因此如果你还没安装，那么首先在系统上安装 git。

```
$ sudo apt install git      #Debian/Ubuntu systems
$ sudo yum install git      #RHEL/CentOS systems
$ sudo dnf install git      #Fedora 22+

```

接着像这样在你的家目录（或者其他任何地方）克隆 mimipenguin 目录：

```
$ git clone https://github.com/huntergregal/mimipenguin.git

```

下载完成后，进入并如下运行 mimipenguin：

```
$ cd mimipenguin/
$ ./mimipenguin.sh

```

注意：如果你遇到下面的错误，那就使用 sudo 命令：

```
Root required - You are dumping memory...
Even mimikatz requires administrator

```

*在 Linux 中转储登录密码*

从上面的输出中，mimipenguin 向你提供了桌面环境的用户名和密码。

另外，还可以如下运行 python 版脚本：

```
$ sudo ./mimipenguin.py

```

注意有时 gcore 可能会阻塞脚本（这是 gcore 中一个已知问题）。

### 未来更新

下面是将会被添加到 mimipenguin 的功能：

* 提升总体效率
* 添加更多支持以及其他的凭据位置
* 包括支持非桌面环境
* 添加 LDAP 的支持

mimipenguin 的 Github 仓库：<https://github.com/huntergregal/mimipenguin>

同样，请查阅：

1. [如何在 Linux 中用密码保护一个 vim 文件](/article-8547-1.html)
2. [如何在 Linux 中生成/加密/解密随机密码](https://www.tecmint.com/generate-encrypt-decrypt-random-passwords-in-linux/)
3. [如何在 RHEL/CentOS/Fedora 中用密码保护 GRUB](https://www.tecmint.com/password-protect-grub-in-linux/)
4. [在 CentOS 7 中重置/恢复忘记的 root 用户账号密码](/article-8212-1.html)

在下面的评论栏中分享你关于这个工具的额外想法或者对 Linux 中内存中明文凭据的问题。

（题图：Pixabay，CC0）

---

作者简介：

Aaron Kili 是 Linux 和 F.O.S.S 爱好者，即将成为 Linux SysAdmin 和网络开发人员，目前是 TecMint 的内容创作者，他喜欢在电脑上工作，并坚信分享知识。

---

via: <https://www.tecmint.com/mimipenguin-hack-login-passwords-of-linux-users/>

作者：[Aaron Kili](https://www.tecmint.com/author/aaronkili/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


使用 Python 开始你的机器学习之旅

支持linux中国，加油

谢谢！！

# 使用 Python 开始你的机器学习之旅

>
> 机器学习是你的简历中必需的一门技能。我们简要概括一下使用 Python 来进行机器学习的一些步骤。
>
>
>

<img src="content_image/album_201706_07_091219dd15wiwukzlubid0.png" alt="Get started with machine learning using Python" title="Get started with machine learning using Python">

你想知道如何开始机器学习吗？在这篇文章中，我将简要概括一下使用 [Python](https://opensource.com/article/17/2/3-top-machine-learning-libraries-python) 来开始机器学习的一些步骤。Python 是一门流行的开源程序设计语言，也是在人工智能及其它相关科学领域中最常用的语言之一。机器学习简称 ML，是人工智能的一个分支，它是利用算法从数据中进行学习，然后作出预测。机器学习有助于帮助我们预测我们周围的世界。

从无人驾驶汽车到股市预测，再到在线学习，机器学习通过预测来进行自我提高的方法几乎被用在了每一个领域。由于机器学习的实际运用，目前它已经成为就业市场上最有需求的技能之一。另外，使用 Python 来开始机器学习很简单，因为有大量的在线资源，以及许多可用的 [Python 机器学习库](https://opensource.com/article/17/2/3-top-machine-learning-libraries-python)。

你需要如何开始使用 Python 进行机器学习呢？让我们来总结一下这个过程。

### 提高你的 Python 技能

由于 Python 在工业界和科学界都非常受欢迎，因此你不难找到 Python 的学习资源。如果你是一个从未接触过 Python 的新手，你可以利用在线资源，比如课程、书籍和视频来学习 Python。比如下面列举的一些资源：

* [Python 学习之路](https://learnpythonthehardway.org/book/)
* [Google 开发者 Python 课程（视频）](https://www.youtube.com/playlist?list=PLfZeRfzhgQzTMgwFVezQbnpc1ck0I6CQl)
* [Google 的 Python 课堂](https://developers.google.com/edu/python/)

### 安装 Anaconda

下一步是安装 [Anacona](https://opensource.com/tags/javascript?src=programming_resource_menu)。有了 Anaconda ，你将可以开始使用 Python 来探索机器学习的世界了。Anaconda 的默认安装库包含了进行机器学习所需要的工具。

### 基本的机器学习技能

有了一些基本的 Python 编程技能，你就可以开始学习一些基本的机器学习技能了。一个实用的学习方法是学到一定技能便开始进行练习。然而，如果你想深入学习这个领域，那么你需要准备投入更多的学习时间。

一个获取技能的有效方法是在线课程。吴恩达的 Coursera [机器学习课程](https://www.coursera.org/learn/machine-learning) 是一个不错的选择。其它有用的在线训练包括：

* [Python 机器学习： Scikit-Learn 教程](https://www.datacamp.com/community/tutorials/machine-learning-python#gs.HfAvLRs)
* [Python 实用机器学习教程](https://pythonprogramming.net/machine-learning-tutorial-python-introduction/)

你也可以在 [LiveEdu.tv](https://www.liveedu.tv/) 上观看机器学习视频，从而进一步了解这个领域。

### 学习更多的 Python 库

当你对 Python 和机器学习有一个好的感觉之后，可以开始学习一些[开源的 Python 库](https://opensource.com/article/17/5/4-practical-python-libraries)。科学的 Python 库将会使完成一些简单的机器学习任务变得很简单。然而，选择什么库是完全主观的，并且在业界内许多人有很大的争论。

一些实用的 Python 库包括：

* [Scikit-learn](http://scikit-learn.org/stable/) ：一个优雅的机器学习算法库，可用于数据挖掘和数据分析任务。
* [Tensorflow](https://opensource.com/article/17/2/machine-learning-projects-tensorflow-raspberry-pi) ：一个易于使用的神经网络库。
* [Theano](http://deeplearning.net/software/theano/) ： 一个强大的机器学习库，可以帮助你轻松的评估数学表达式。
* [Pattern](https://github.com/clips/pattern) ： 可以帮助你进行自然语言处理、数据挖掘以及更多的工作。
* [Nilearn](https://github.com/nilearn/nilearn) ：基于 Scikit-learn，它可以帮助你进行简单快速的统计学习。

### 探索机器学习

对基本的 Python、机器学习技能和 Python 库有了一定理解之后，就可以开始探索机器学习了。接下来，尝试探索一下 Scikit-learn 库。一个不错的教程是 Jake VanderPlas 写的 [Scikit-learn 简介](http://nbviewer.jupyter.org/github/donnemartin/data-science-ipython-notebooks/blob/master/scikit-learn/scikit-learn-intro.ipynb)。

然后，进入中级主题，比如 [K-均值聚类算法简介](https://www.datascience.com/blog/introduction-to-k-means-clustering-algorithm-learn-data-science-tutorials)、线性回归、[决策树](http://machinelearningmastery.com/implement-decision-tree-algorithm-scratch-python/)和逻辑回归。

最后，深入高级机器学习主题，比如向量机和复杂数据转换。

就像学习任何新技能一样，练习得越多，就会学得越好。你可以通过练习不同的算法，使用不同的数据集来更好的理解机器学习，并提高解决问题的整体能力。

使用 Python 进行机器学习是对你的技能的一个很好的补充，并且有大量免费和低成本的在线资源可以帮助你。你已经掌握机器学习技能了吗？可以在下面留下你的评论，或者[提交一篇文章](https://opensource.com/story)来分享你的故事。

（题图：opensource.com）

---

作者简介：

Michael J. Garbade 博士是旧金山 LiveEdu Inc（Livecoding.tv）的创始人兼首席执行官。Livecoding.tv 是世界上观看工程师直播编代码最先进的直播平台。你可以通过观看工程师们写网站、移动应用和游戏，来将你的技能提升到一个新的水平。MichaelJ. Garbade 博士拥有金融学博士学位，并且是一名自学成才的工程师，他喜欢 Python、Django、Sencha Touch 和视频流。

---

via: <https://opensource.com/article/17/5/python-machine-learning-introduction>

作者：[Michael J. Garbade](https://opensource.com/users/drmjg) 译者：[ucasFL](https://github.com/ucasFL) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


使用 comm 比较两个排序好的文件

Summary: Linux 中的 comm 命令可以让用户按行比较两个已经排序好的文件。在本教程中，我们将使用一些浅显易懂的例子来讨论这个命令行工具。

# 使用 comm 比较两个排序好的文件

Linux 中的 `comm` 命令可以让用户按行比较两个**已经排序好**的文件。在本教程中，我们将使用一些浅显易懂的例子来讨论这个命令行工具。在开始之前，请注意，本教程中提到的所有例子都已经在 Ubuntu 16.04LTS 版本中测试过。

下面的例子将会告诉你 `comm` 命令是如何工作的。

### 1、 如何使用 `comm` 比较两个排序好的文件

要使用 `comm` 命令比较两个排序好的文件，只需要把它们的名字作为 `comm` 命令的参数。下面是通常的语法：

```
comm [name-of-first-file] [name-of-second-file]

```

比如，假设 `file1` 和 `file2` 是这种情况下的两个文件。前者包含下面几行内容：

```
001
056
127
258

```

而后者包含下面几行内容：

```
002
056
167
369

```

此时，`comm` 命令的输出如下图所示：

```
comm file1 file2

```

你可以看到，输出包含 3 列。第一列是仅包含在 `file1` 中的内容，第二列是仅包含在 `file2` 中的内容，最后，第三列是两个文件中均包含的内容。

### 2、 如何不输出 `comm` 命令输出中的某些列

如果你想，你可以不输出 `comm` 命令输出中的某些列。对于该特性，你有三个命令行选项可用：`-1`、`-2` 和 `-3` 。正如你所猜想的，这些数字表示你不想输出的列。

比如，下面这个命令将会不输出上面例子中的第三列：

```
comm -3 file1 file2

```

因此，你可以看到，第三列并没有输出。

注意，你可以通过一个单一命令同时不输出多列内容。比如：

```
comm -12 file1 file2

```

上面这个命令将会不输出第一、二列。

### 3、 如何使用 `comm` 命令比较两个未排序好的文件

正如我们所知道的，`comm` 只可用于排序好的文件。如果发现其中一个文件未排序好，那么便会在输出中产生一条信息来告诉用户。比如，我们交换 `file1` 的第一行和第二行，然后与 `file2` 进行比较。下面是该命令的输出：

你可以看到，这个命令产生一个输出告诉我们：`file1` 还没有排序好。此时，如果你不想让这个工具检查输入是否已经排序好，那么你可以使用 `--nocheck-order` 选项：

```
comm --nocheck-order file1 file2

```

你可以看到，前面出现的提示信息已经消失了。

注意，如果你想明确告诉 `comm` 命令来检查输入文件是否排序好，那么你可以使用 `--check-order` 选项。

### 4、 如何用自定义字符串分隔 `comm` 命令的输出列

默认情况下，`comm` 命令的输出列之间是以空格分隔的。然而，如何你想使用一个自定义字符串作为分隔符，那么你可以使用 `--output-delimiter` 选项。使用该选项时需要指定你想用来作为分隔符的字符串。

```
comm --output-delimiter=+ file1 file2

```

比如，我们使用加号来作为分隔符：

### 5、 如何使 `comm` 的输出行以 `NUL` 字符终止

默认情况下，`comm` 命令的输出行以新行终止。然而，如果你想，那么你可以改为以 `NUL` 字符终止，只需要使用 `-z` 选项即可：

```
comm -z file1 file2

```

### 结论

`comm` 命令并没有特别多的特性性，我们在这儿已经讨论了它的绝大多数命令行选项。只需要理解和练习在这篇教程中讨论的内容，那么你便可以在日常工作中知道如何使用这个工具了。如果你有任何问题或者疑问，请前往该命令的 [man 手册](https://linux.cn/man/1/comm)，或者在下面评论。

---

via: <https://www.howtoforge.com/linux-comm-command/>

作者：[Himanshu Arora](https://www.howtoforge.com/linux-comm-command/) 译者：[ucasFL](https://github.com/ucasFL) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


FreeFileSync：在 Ubuntu 中对比及同步文件

# FreeFileSync：在 Ubuntu 中对比及同步文件

FreeFileSync 是一个自由、开源以及跨平台的文件夹对比及同步软件，它可以帮助你同步 Linux、Windows 和 Mac OS 中的文件和文件夹。

它是便携的，也可以被安装在本地系统中，它的功能丰富，旨在节省设置和执行备份操作的时间，同时具有有吸引力的图形界面。

#### FreeFileSync 功能

下面是它的主要功能：

1. 它可以同步网络共享和本地磁盘。
2. 它可以同步 MTP 设备（Android、iPhone、平板电脑、数码相机）。
3. 它也可以通过 [SFTP（SSH 文件传输协议）](http://www.tecmint.com/sftp-command-examples/)进行同步。
4. 它可以识别被移动和被重命名的文件和文件夹。
5. 使用目录树显示磁盘空间使用情况。
6. 支持复制锁定文件（卷影复制服务）。
7. 识别冲突并同步删除（propagate deletions）。
8. 支持按内容比较文件。
9. 它可以配置为处理符号链接。
10. 支持批量自动同步。
11. 支持多个文件夹比较。
12. 支持深入详细的错误报告。
13. 支持复制 NTFS 扩展属性，如（压缩、加密、稀疏）。
14. 还支持复制 NTFS 安全权限和 NTFS 备用数据流。
15. 支持超过 260 个字符的长文件路径。
16. 支持免故障的文件复制防止数据损坏。
17. 允许扩展环境变量，例如 `％UserProfile％`。
18. 支持通过卷名访问可变驱动器盘符（U盘）。
19. 支持管理已删除/更新文件的版本。
20. 通过最佳同步序列防止光盘空间问题。
21. 完全支持 Unicode。
22. 提供高度优化的运行时性能。
23. 支持过滤器包含和排除文件等。

### 如何在 Ubuntu 中安装 FreeFileSync

我们会添加官方的 FreeFileSync PPA，这只在 Ubuntu 14.04 和 Ubuntu 15.10 上有，那么像这样更新系统仓库列表并安装它：

```
-------------- 在 Ubuntu 14.04 和 15.10 上 --------------
$ sudo apt-add-repository ppa:freefilesync/ffs
$ sudo apt-get update
$ sudo apt-get install freefilesync

```

对于 Ubuntu 16.04 或者更新的版本，进入 [FreeFileSync 的下载页](http://www.freefilesync.org/download.php)为你的 Ubuntu 和 Debian 获取合适的包。

接下来，进入下载文件夹，如下解压 FreeFileSync\_\*.tar.gz 到 `/opt` 目录中：

```
$ cd Downloads/
$ sudo tar xvf FreeFileSync_*.tar.gz -C /opt/
$ cd /opt/
$ ls
$ sudo unzip FreeFileSync/Resources.zip -d /opt/FreeFileSync/Resources/

```

下载我们会使用 Gnome 面板创建一个程序启动器（`.desktop` 文件）。要浏览系统中 `.desktop` 文件的例子，列出 `/usr/share/applications` 目录的内容：

```
$ ls /usr/share/applications

```

为防你没有安装 Gnome 面板，输入下面的命令来安装：

```
$ sudo apt-get install --no-install-recommends gnome-panel

```

接下来，运行下面的命令来创建程序启动器：

```
$ sudo gnome-desktop-item-edit /usr/share/applications/ --create-new

```

并定义下面的值：

```
Type:      Application
Name:      FreeFileSync
Command:   /opt/FreeFileSync/FreeFileSync
Comment:   Folder Comparison and Synchronization

```

要为启动器添加一个图标，只需要点击图标选择：`/opt/FreeFileSync/Resources/FreeFileSync.png`。

当你设置完成之后，点击 OK 创建。

*创建桌面启动器*

如果你不想要创建桌面启动器，你可以从目录中启动 FreeFileSync。

```
$ ./FreeFileSync

```

### 如何在 Ubuntu 中使用 FreeFileSync

在 Ubuntu 中，在 Unity Dash 中搜索 FreeFileSync，然而在 Linux Mint 中，在 System Menu 中搜索，并点击 FreeFileSync 图标打开。

*FreeFileSync*

#### 使用 FreeFileSync 比较两个文件夹

在下面的例子中，我们使用：

```
Source Folder:  /home/aaronkilik/bin
Destination Folder: /media/aaronkilik/J_CPRA_X86F/scripts

```

要比较文件时间以及两个文件夹的大小（默认设置），只要点击比较按钮。

*在 Linux 中比较两个文件夹*

通过下面的界面，可以在两个文件夹中按 `F6` 来更改要比较的内容：文件时间和大小、内容或文件大小。请注意，你选择的每个选项的含义也包括在内。

*文件比较设置*

#### 使用 FreeFileSync 同步两个文件夹

你可以开始比较两个文件夹，接着点击 Synchronize 按钮启动同步进程。在之后出现的对话框中点击 Start：

```
Source Folder: /home/aaronkilik/Desktop/tecmint-files
Destination Folder: /media/aaronkilik/Data/Tecmint

```

*比较以及同步两个文件夹*

*开始文件同步*

*文件同步完成*

在下面的界面中按下 `F8` 设置默认同步选项：two way、mirror、update 或 custom。每个选项的意义不言自明。

*文件同步设置*

要了解更多信息，访问 FreeFileSync 主页：<http://www.freefilesync.org/>

就是这样了！在本篇中，我们向你展示了如何在 Ubuntu 以及它的衍生版 Linux Mint、Kubuntu 等等中安装 FreeFileSync。在下面的评论栏中分享你的想法。

---

作者简介：

Ravi Saive，TecMint 的原创作者。一个喜爱在互联网上分享技巧和提示的计算机 geek 和 Linux 老手。我的大多数服务运行在 Linux 开源平台上。请在 Twitter、Facebook、Google+ 上关注我。

---

via: <http://www.tecmint.com/freefilesync-compare-synchronize-files-in-ubuntu/>

作者：[Ravi Saive](http://www.tecmint.com/author/admin/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


为什么每家企业都应该考虑使用开源的 POS 系统

开源pos系统，安装问题支持需要付费么？

“大量的社区开发者在开发新功能的同时也会检查并修复影响系统安全的各种漏洞。有那么多的程序员在分析和维护开源软件的源代码，这可比专有软件开发商对代码的审查要严格得多。因此，开源的 POS 系统实际上更安全。”现在还有人提这种观点？

抱有开源等于安全思维的人多了去了。

重点在于——“一个技术精湛的员工提供技术支持”

# 为什么每家企业都应该考虑使用开源的 POS 系统

销售点终端 (POS) 系统是从很久以前的简单的收银机发展而来的。如今的 POS 系统可以提供一体化解决方案，包括支付流程、库存管理、营销工具等等。零售店也可以使用移动设备来接收现金流和各种成本支出相关的日报表。

POS 系统是每家企业重要的生命线，那就意味着你在选择 POS 系统的过程中要非常谨慎。目前可供选择的收银系统也很多，但是如果你想节约成本，适应不断变化的业务需求，跟上技术发展的脚步，你应该很明智地考虑使用开源系统。你可以随意使用一款源代码公开的开源 POS 系统，这比那些严格保密源代码的专有系统要有更大的优势。

使用开源的 POS 系统，你可以获得它的一些非常重要的特性。

### 无限的灵活性

开源系统与其它系统的兼容性非常好。它们与第三方厂家系统进行集成的能力——从帐务和客户关系管理软件（CRM）到订单管理和库存管理系统——使得当企业管理者想要扩展专有 POS 系统以外的其它功能时，开源系统具有更强大的优势。

在 [2014 年科技调查](http://hospitalitytechnology.edgl.com/news/POS-Integration-Becoming-a--Must-Have-94389) 活动中，很多餐厅管理者声称 POS 系统的功能集成度将会是他们考虑更换新系统的主要因素。这是开源系统最具亮点的一方面。专有系统买来什么样就是什么样，很难与其它厂家的系统进行集成。但是使用开源系统，你就可以进行无限的集成及定制功能。如果你觉得你们公司的商业模式会不断的增长和变化，那么只有考虑使用开源的 POS 系统才能根据需要实时调整系统。

### 更快的开发速度

开源系统的另外一个优势是它有很多的社区开发者提供技术支持，他们持续不断的提交新功能，并且优化原有的功能。由于这种特性，开源项目的开发周期要比商用产品快得多——修复缺陷的速度更快，更新升级也很快，并且新的功能模块也不断地被开发出来。

### 更低的成本

也就是说，“更低的成本”意味着“基本免费”。你还需要购买相关硬件产品，只是软件本身是免费使用的。开源 POS 系统不像专有 POS 系统那样在购买时或是后期维护过程中需要支付高昂的费用，其每年的维护费在 3000 至 50000 美元之间，而开源系统则不会像专有系统那样需要花钱来购买。

在 [2013 年版](https://pos.toasttab.com/restaurant-technology-industry-report/2015) 的餐饮行业技术服务调查研究过程中，有超过一半的受访餐厅老板表示他们从很多的技术产商购买服务——有些餐厅所面对的技术厂家多达 10 个。而使用纯粹的开源定制化系统不需要支付维护费用，这从节约成本上来说意义非常重大。

然而，有一点我还得提醒大家。如果你们公司没有一个技术精湛的员工提供技术支持，你可能还需要聘请外部技术人员来帮助你们安装，调试和升级系统。开源系统允许用户无限制地集成和定制化开发，但是你还需要有技术精湛的专家来支持才行，这也会产生额外的费用。尽管如此，开源系统仍然是一个非常具有成本效益的选择。

### 更好的安全性

如果任何人都可以看到源代码，那是不是也意味着它同样对那些怀有恶意并想入侵你系统的程序员开放呢？那不就是一个安全上的严重隐患吗？事实正好相反。

大量的社区开发者在开发新功能的同时也会检查并修复影响系统安全的各种漏洞。有那么多的程序员在分析和维护开源软件的源代码，这可比专有软件开发商对代码的审查要严格得多。因此，开源的 POS 系统实际上更安全。

有很多开源的 POS 系统解决方案可供选择，我列出一部分来：

* [Chromis](http://chromis.co.uk/)
* [Drupal POS](https://www.acromediainc.com/drupal-pos)
* [Floreant](http://floreant.org/)
* [Odoo](https://www.odoo.com/)
* [Open Source Point of Sale](https://github.com/jekkos/opensourcepos)
* [Unicenta](https://unicenta.com/)

### 勇敢地跨出第一步

你比其它人更了解你们公司。只有你能决定哪种开源系统最适合你们公司。由于开源 POS 系统比专有 POS 系统有更多亮丽的优点——灵活性、开发快速、低成本、更安全——因此，每个公司都应该考虑使用开源的 POS 系统。

（题图：opensource.com）

---

作者简介：

我是 AcroMedia 公司数字化市场营销项目经理。我们主要使用 Drupal 开源系统来为客户提供定制化商业解决方案。

---

via: <https://opensource.com/article/17/1/open-source-point-sale-system>

作者：[Preston Pilgrim](https://opensource.com/users/preston-pilgrim) 译者：[rusking](https://github.com/rusking) 校对：[Bestony](https://github.com/Bestony)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


你为什么使用 Linux 和开源软件？

谁能说说开源和帕累托法则联系    @wxy

单纯的出于自由和浪

对待我自己的成长笔记和技术总结，我个人将会保持共享、共享、共享的原则。要不然自己忘记了都找不到。。。这很像DNA片段。最好的保留就是把自己复制出去！！！

<自由软件 自由社区> 建议通读。。。

82法则么，这里的意思是只需要付出20%，就能得到80%的需求了，剩下的20% 可以付费或者自己搞定。

我使用linux的理由：刚开始是因为老电脑用windows太卡，后来是因为习惯了就不想换了。<br />
我使用开源软件的理由：并没有什么特殊的理由，linux下大多数实用和好用的软件都是开源的。但如果一个很不错的软件不开源，我还是会选择使用它。

来自河南郑州的 Chrome Mobile 58.0|Android 6.0 用户

因为我觉得好玩。就这样。

以前电脑太老，win10巨卡，用上Linux，一年后换新电脑，用习惯了linux……必要条件<br />
恰好用linux相对不卡，恰好linux免费开源……充分条件

完全是因为受不了WINDOWS下的广告软件才逃到LINUX的

比 windows 资源消耗低, 如 RAM 内存, 明显低很多

环境非常适合用于开发, 安装软件也很方便, 一个指令即可

基本BT/迅雷下载, IM, 浏览, 听音乐,看视频都没问题

玩大咖游戏可以用 Steam, 但网上买游戏不是免费

不需要磁盘整理, 也不一定需要防病毒软件

想不到理由为什么我不用 LINUX, 而特意买 windows 来用.

就因为 windows 界面看起来较美? 还是安全? 别开玩笑了. 我才不会买账.

# 你为什么使用 Linux 和开源软件？

>
> LinuxQuestions.org 的用户分享了他们使用 Linux 和开源技术的原因。我们的用户如何回答这个问题？
>
>
>

<img src="content_image/album_201706_08_073956jvpn21ma7mxux8an.png" alt="Why do you use Linux and open source software?" title="Why do you use Linux and open source software?">

在网站问答区发布时我曾经提到过，尽管我一般会回答来自用户问题，但偶尔我也会反过来问读者一些问题。我并没有在问答区第一期文章这样做，看起来有点姗姗来迟。我最近在 LinuxQuestions.org 上提问了两个相关的问题，收到了很多回复。让我们看看我们的用户对同样的问题和 LinuxQuestions.org 的回答的对比。

### 你为什么使用 Linux？

我向 LinuxQuestions.org 社区提问的第一个问题是：**[你们使用 Linux 的原因是什么？](http://www.linuxquestions.org/questions/linux-general-1/what-are-the-reasons-you-use-linux-4175600842/)**

#### 回答集锦

*oldwierdal*：我用 Linux 是因为它运行快速、安全、可靠。在全世界的贡献者的参与下，Linux 或许已经成为当前我们能用到的最先进和最具创新的软件。Linux 的用户体验就像红丝绒蛋糕上的糖衣一样令人回味无穷；此外，Linux 是免费的。

*Timothy Miller*：我最开始使用 Linux 是因为它免费的，而且那时候我的经济条件无法承受购买新的 Windows 系统正版授权的费用。

*ondoho* ：因为它是一个拥有全球性社区为之努力、独立的草根操作系统。因为它在各方面都是自由的。因为它有足够多的理由让我们信任它。

*joham34*：稳定、免费、安全，能够运行在低配置的电脑上，提供良好技术支持的社区，感染病毒的几率更小。

*Ook*：我用 Linux 是因为它可以完成工作，对我来说 Windows 系统在某些事上从来都不能做好。我不得不浪费时间和金钱让 Windows 继续正常运行下去。

*rhamel*：我非常担心个人隐私泄露在网上。我意识到我不得不在隐私和便利性之间做出妥协。我可能是在骗自己但我确实认为 Linux 至少在某种程度上给了我一定的隐私权。

*educateme*：我使用 Linux 因为它的开放、好学、热情乐于助人的社区。而且，它是免费的。

*colinetsegers*：我为什么用 Linux？原因不止一个。简单的说有以下几点：

1. 自由分享知识的理念。
2. 浏览网页的时候有安全感。
3. 大量免费、有用的软件。

*bamunds*：因为我热爱自由。

*cecilskinner1989*：我用 Linux 的两个原因：稳定性和隐私。

### 你为什么使用开源软件？

第二个问题相对更加宽泛：**[你为什么使用开源软件？](http://www.linuxquestions.org/questions/linux-general-1/what-are-the-reasons-you-use-open-source-software-4175600843/)**你会注意到尽管有些回复是有重复的部分，但用户的回答大体上的语气是不同的，有些用户的回答得到很多人的赞同和支持，也有不少用户的回答不怎么被其他人认同。

#### 回答集锦

*robert leleu*：温馨、合作的氛围是我沉溺于开源的主要原因。

*cjturner*：对于应用而言，开源正好反映了帕累托法则；不做二次开发的话，一个软件包最终可能只能满足你的 80% 的需求，而你需要自己解决剩下的 20%。开源给了你一个途径，通过社区来解决这种问题，你可以自己努力实现（如果你有相关的技能）或者花钱有偿请人实现你的需求。

*Timothy Miller*：我喜欢这种体验，我能够自己检查源代码来确定我所选择的软件是安全的。

*teckk*：没有繁琐的许可要求或者数字版权管理（DRM），而且每个人都可以获得它。

*rokytnji* ：像零花钱，摩托车部件，孙辈的生日礼物那样令人愉悦。

*timl*：没有自由软件避免隐私的泄露是不可能。

*hazel*：我喜欢自由软件的哲学，但如果 Linux 是一个糟糕的操作系统我也会理性的不去使用它。我使用 Linux 是因为我热爱 Linux，而且你也能免费获得它就像免费的啤酒一样。事实上它也如言论自由一般自由不受拘束，使用开源软件让我感觉很舒服。但是如果我发现我的计算机有一个硬件需要专有固件的配合才能发挥功能，我也会使用专有固件。

*lm8*：我使用开源软件是因为我不必担心由于开发公司的破产或者决定停止维护它而导致它可能会变得过时或者被废弃。我能够自己来完成后续的更新、维护。如果我想让软件能够做我想的任何事情，我也可以进一步定制它，但是如果有更多的特性，那就更好了。我也喜欢开源，因为开源我才能够和朋友、同事们分享我喜欢的程序。

*donguitar*：因为它能够让我学到很多，也让我让别人学到了很多。

### 该你回答了

所以，***你*** 使用 Linux 的原因是什么？ ***你*** 使用开源软件的原因是什么？请在评论区告诉我们。

#### 最后的补充

最后，在以后的文章里你想看到什么问题的回答？是社区的建立和维护的相关问题，还是你想知道如何对一个开源项目作出贡献，还是更有技术性的问题 — 向我们提交你对 Linux 和 开源的问题。

（题图：opensource.com）

---

作者简介：

Jeremy Garcia - Jeremy Garcia 是 LinuxQuestions.org 的创立者同时也是一位热情中不乏现实主义的开源倡导者。你可以在 Twitter 上关注 Jeremy：@linuxquestions

---

via: <https://opensource.com/article/17/3/why-do-you-use-linux-and-open-source-software>

作者：[Jeremy Garcia](https://opensource.com/users/jeremy-garcia) 译者：[WangYueScream](https://github.com/WangYueScream) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


安卓编年史（20）：安卓 4.1，果冻豆——Google Now 指明未来

# 安卓编年史（20）：安卓 4.1，果冻豆——Google Now 指明未来

### 安卓 4.1，果冻豆——Google Now指明未来

*华硕制造的 Nexus 7，安卓 4.1 的首发设备*

随着 2012 年 7 月安卓 4.1 果冻豆的发布，谷歌的安卓发布节奏进入每六个月一发布的轨道。平台已经成熟，三个月的发布周期就没那么必要了，更长的发布周期也给了 OEM 厂商足够的时间跟上谷歌的节奏。和蜂巢不同，小数点后的更新发布现在是主要更新，4.1 带来了主要的界面更新和框架变化。

果冻豆最大的变化之一，并且你在截图中看不到的是“黄油计划”，这个名字代表了谷歌工程师让安卓的动画顺畅地跑在 30FPS 上的努力。还有一些核心变化，像垂直同步和三重缓冲，每个动画都经过优化以流畅地绘制。动画和顺滑滚动一直是安卓和 iOS 相比之下的弱点。经过在核心动画框架和单独的应用上的努力，果冻豆让安卓的流畅度大幅接近 iOS。

和果冻豆一起到来的还有 [Nexus](http://arstechnica.com/gadgets/2012/07/divine-intervention-googles-nexus-7-is-a-fantastic-200-tablet/) 7，由华硕生产的 7 英寸平板。不像之前主要是横屏模式的 Xoom，Nexus 7 主要以竖屏模式使用，像个大一号的手机。Nexus 7 展现了经过一年半的生态建设，谷歌已经准备好了给平板市场带来一部旗舰设备。和 Nexus One 和 GSM Galaxy Nexus 一样，Nexus 7 直接由谷歌在线销售。尽管那些早先的设备对习惯于运营商补贴的消费者来说价格高的惊人，Nexus 7 以仅仅 200 美元的价格推向大众市场。这个价格给你带来一部 7 英寸、1280x800 英寸显示屏、四核 1.2GHz Tegra 3 处理器、1GB 内存、8GB 内置存储的设备。Nexus 7 的性价比如此之高，许多人都想知道谷歌到底有没有在其旗舰平板上赚到钱。

更小、更轻、7 英寸，这些因素促成了谷歌巨大的成功，并且将谷歌带向了引领行业潮流的位置。一开始制造 10 英寸 iPad 的苹果，最终也不得不推出和 Nexus 7 相似的 iPad Mini 来应对。

*4.1 的新锁屏设计，壁纸，以及系统按钮新的点击高亮。 [Ron Amadeo 供图]*

蜂巢引入的电子风格在冰淇淋三明治中有所减少，果冻豆在此之上走得更远。它开始从系统中大范围地移除蓝色。迹象就是系统按钮的点击高亮从蓝色变为了灰色。

*新应用阵容合成图以及新的消息可展开通知面板。 [Ron Amadeo 供图]*

通知中心面板完全重制了，这个设计一直沿用到今天的奇巧巧克力（KitKat）。新面板扩展到了屏幕顶部，并且覆盖了状态栏图标，这意味着通知面板打开的时候不再能看到状态栏。时间突出显示在左上角，旁边是日期和设置按钮。清除所有通知的按钮，在冰淇淋三明治中显示为一个“X”按钮，现在变为阶梯状的按钮，象征着清除所有通知的时候消息交错滑动的动画效果。底部的面板把手从一个小圆换成了一条直线，和面板等宽。所有的排版都发生了变化——通知面板的所有项现在都使用了更大，更细的字体。通知面板是另一个从冰淇淋三明治和蜂巢中引入的蓝色元素被移除的屏幕。除了触摸高亮之外整个通知面板都是灰色的。

通知面板也引入了新功能。相较于之前的两行设计，现在的通知消息可以展开以显示更多信息。通知消息可以显示最多 8 行文本，甚至还能在消息底部显示按钮。屏幕截图通知消息底部有个分享按钮，你也可以直接从未接来电通知中拨号，或者将一个正在响铃的闹钟小睡，这些都可以在通知面板完成。新通知消息默认展开，但当它们堆叠到一起时会恢复原来的尺寸。在通知消息上双指向下滑动可以展开消息。

*新谷歌搜索应用，带有 Google Now 卡片，语音搜索，以及文字搜索。 [Ron Amadeo 供图]*

果冻豆中不止对安卓而言，也是对谷歌来说最大的特性，是新版谷歌搜索应用。它带来了“Google Now”，一个预测性搜索功能。Google Now 在搜索框下面显示为几张卡片，它会提供谷歌认为你所关心的事物的搜索结果。就比如谷歌地图搜索你最近在桌面电脑查找的地点或日历的约会地点、天气，以及旅行时回家的时间。

新版谷歌搜索应用自然可以从谷歌图标启动，但它还可以在任意屏幕从系统栏上滑访问。长按系统栏会唤出一个类似锁屏解锁的环。卡片部分纵向滚动，如果你不想看到它们，可以滑动消除它们。语音搜索是更新的一个大部分。提问不是无脑地输入进谷歌，如果谷歌知道答案，它还会用文本语音转换引擎回答你。传统的文字搜索当然也支持。只需点击搜索栏然后开始输入即可。

谷歌经常将 Google Now 称作“谷歌搜索的未来”。告诉谷歌你想要什么这还不够好。谷歌想要在你之前知道你想要什么。Google Now 用谷歌所有的数据挖掘关于你的知识为你服务，这也是谷歌对抗搜索引擎竞争对手，比如必应，的最大优势所在。智能手机比你拥有的其它设备更了解你，所以该服务在安卓上首次亮相。但谷歌慢慢也将 Google Now 加入 Chrome，最终似乎会到达 Google.com。

尽管功能很重要，但同时 Google Now 是谷歌产品有史以来最重要的设计工作也是毋庸置疑的。谷歌搜索应用引入的白色卡片审美将会成为几乎所有谷歌产品设计的基础。今天，卡片风格被用在 Google Play 商店以及所有的 Play 内容应用，Youtube、谷歌地图、Drive、Keep、Gmail、Google+ 以及其它产品。同时也不限于安卓应用。不少谷歌的桌面站点和 iOS 应用也以此设计为灵感。设计是谷歌历史上的弱项之一，但 Google Now 开始谷歌最终在设计上采取了行动，带来一个统一的，全公司范围的设计语言。

*又一个 Youtube 的重新设计，信息密度有所下降。 [Ron Amadeo 供图]*

又一个版本，又一个 Youtube 的重新设计。这次列表视图主要基于略缩图，大大的图片占据了屏幕的大部分。信息密度在新列表设计中有所下降。之前 Youtube 每屏大约能显示 6 个项目，现在只能显示 3 个。

Youtube 是首批在应用左侧加入滑动抽屉的应用之一，该特性会成为谷歌应用的标准设计风格。抽屉中有你的账户的链接和订阅频道，这让谷歌可以去除页面顶部标签页设计。

*Google Play 服务的职责以及安卓的剩余部分职责。 [Ron Amadeo 供图]*

### Google Play 服务——碎片化和让系统版本（几乎）过时

碎片化那时候看起来这并不是个大问题，但 2012 年 12 月，Google Play 服务 1.0 面向所有安卓 2.2 及以上版本的手机推出。它添加了一些 Google+ API 和对 OAuth 2.0 的支持。

尽管这个升级听起来很无聊，但 Google Play 服务最终会成长为安卓整体的一部分。Google Play 服务扮演着正常应用和安卓系统的中间角色，使得谷歌可以升级或替换一些核心组件，并在不发布新安卓版本的前提下添加 API。

有了 Play 服务，谷歌有了直接接触安卓手机核心部分的能力，而不用通过 OEM 更新一集运营商批准的过程。谷歌使用 Play 服务添加了全新的位置系统、恶意软件扫描、远程擦除功能，以及新的谷歌地图 API，所有的这一切都不用通过发布一个系统更新实现。正如我们在姜饼部分的结尾提到的，感谢 Play 服务里这些“可移植的”API 实现，姜饼仍然能够下载现代版本的 Play 商店和许多其他的谷歌应用。

另一个巨大的益处是安卓用户基础的兼容性。最新版本的安卓系统要经过很长时间到达大多数用户手中，这意味着最新版本系统绑定的 API 在大多数用户升级之前对开发者来说没有任何意义。Google Play 服务兼容冻酸奶及以上版本，换句话说就是 99% 的活跃设备，并且更新可以直接通过 Play 商店直接推送到手机上。通过将 API 包含在 Google Play 服务中而不是安卓中，谷歌可以在一周内将新 API 推送到几乎所有用户手中。这对许多版本碎片化引起的问题来说是个[伟大的解决方案](http://arstechnica.com/gadgets/2013/09/balky-carriers-and-slow-oems-step-aside-google-is-defragging-android/)。

---

[Ron Amadeo](http://arstechnica.com/author/ronamadeo) / Ron 是 Ars Technica的评论编缉，专注于安卓系统和谷歌产品。他总是在追寻新鲜事物，还喜欢拆解事物看看它们到底是怎么运作的。[@RonAmadeo](https://twitter.com/RonAmadeo)

---

via: <http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/21/>

译者：[alim0x](https://github.com/alim0x) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


cron 与 anacron：如何在 Linux 中计划任务

# cron 与 anacron：如何在 Linux 中计划任务

<img src="content_image/album_201706_08_230239x0dew0x0mbf1x05m.jpg" alt="" title="">

在本篇中，我们会解释 cron 和 anacron，并向你展示如何在 Linux 中设置 anacron。我们也会比较这两个工具。

要[在一个给定时间或者稍后安排一个任务](https://www.tecmint.com/linux-cron-alternative-at-command-to-schedule-tasks/)，你可以使用 `at` 或者 `batch` 命令，要使命令能够重复运行，你可以使用 cron 以及 anacron 工具。

[cron](https://www.tecmint.com/11-cron-scheduling-task-examples-in-linux/) - 是一个用于运行计划任务如系统备份、更新等的守护进程。它适合在那些 24X7 不间断运行的机器如服务器上运行的计划任务。

命令/脚本被写在 cron 任务脚本中，它是在 `crontab` 文件中被安排的。系统默认的 `crontab` 文件是 `/etc/crontab`，但是每个用户也可以创建自己的 `crontab` 文件来在特定时间运行用户定义的命令。

要创建一份个人 `crontab` 文件，只要输入：

```
$ crontab -e

```

### 如何在 Linux 中设置 anacron

anacron 用于以天为单位的频率运行命令。它的工作与 cron 稍有不同，**它假设机器不会一直开机**。

cron 也适合在那些不会 24X7 运行如笔记本以及桌面电脑的机器上运行每日、每周以及每月的计划任务（LCTT 译注：不适合按小时、分钟执行任务）。

假设你有一个计划任务（比如备份脚本）要使用 cron 在每天半夜运行，也许你以及睡着，那时你的桌面/笔记本电脑已经关机。你的备份脚本就不会被运行。

然而，如果你使用 anacron，你可以确保在你下次开启桌面/笔记本电脑的时候，备份脚本会被执行。

### anacron 如何在 Linux 工作

anacron 任务被列在 `/etc/anacrontab` 中，任务可以使用下面的格式（anacron 文件中的注释必须以 `#` 号开始）安排。

```
period   delay   job-identifier   command

```

从上面的格式中：

* `period` - 这是任务的频率，以天来指定，或者是 `@daily`、`@weekly`、`@monthly` 代表每天、每周、每月一次。你也可以使用数字：`1` - 每天、`7` - 每周、`30` - 每月，或者 `N` - 几天。
* `delay` - 这是在执行一个任务前等待的分钟数。
* `job-id` - 这是写在日志文件中任务的独特名字。
* `command` - 这是要执行的命令或 shell 脚本。

要浏览示例文件，输入：

```
$ ls -l /var/spool/anacron/
total 12
-rw------- 1 root root 9 Jun  1 10:25 cron.daily
-rw------- 1 root root 9 May 27 11:01 cron.monthly
-rw------- 1 root root 9 May 30 10:28 cron.weekly

```

这是实际发生的：

* anacron 会检查任务是否已经在 `period` 字段指定的时间被被执行了。如果没有，则在等待 `delay` 字段中指定的分钟数后，执行 `command` 字段中指定的命令。
* 一旦任务被执行了，它会使用 `job-id`（时间戳文件名）字段中指定的名称将日期记录在 `/var/spool/anacron` 目录中的时间戳文件中。

现在让我们看一个例子。这个会每天运行 `/home/aaronkilik/bin/backup.sh` 脚本：

```
@daily    10    example.daily   /bin/bash /home/aaronkilik/bin/backup.sh

```

当机器在 `backup.sh` 期望被运行时是关机的，anacron 会在机器开机十分钟之后运行它，而不用再等待 7 天。

这里有两个你应该理解的 anacrontab 文件的重要变量：

* `START_HOURS_RANGE` - 这个设置任务开始运行的时间范围（也就是任务只在这几个小时内运行）。
* `RANDOM_DELAY` - 这定义添加到用户定义的任务延迟的最大随机延迟（默认为 45）。

这是你的 anacrontab 文件可能看上去的样子。

Anacron – `/etc/anacrontab`：

```
# /etc/anacrontab: configuration file for anacron
# See anacron(8) and anacrontab(5) for details.
SHELL=/bin/sh
PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
HOME=/root
LOGNAME=root
# These replace cron's entries
1       5       cron.daily      run-parts --report /etc/cron.daily
7       10      cron.weekly     run-parts --report /etc/cron.weekly
@monthly        15      cron.monthly    run-parts --report /etc/cron.monthly
@daily    10    example.daily   /bin/bash /home/aaronkilik/bin/backup.sh

```

下面是 cron 以及 anacron 的比较，帮助你理解何时用他们其中一个。

| cron | anacron |
| --- | --- |
| 它是守护进程 | 它不是守护进程 |
| 适合服务器 | 适合桌面/笔记本电脑 |
| 可以让你以分钟级运行计划任务 | 只能让你以天为基础来运行计划任务 |
| 关机时不会执行计划任务 | 如果计划任务到期，机器是关机的，那么它会在机器下次开机后执行计划任务 |
| 普通用户和 root 用户都可以使用 | 只有 root 用户可以使用（使用特定的配置启动普通任务） |

cron 和 anacron 主要的区别在于 cron 能在那些持续运行的机器上有效地运行，而 anacron 是针对那些会在一天内或者一周内会关机的机器。

如果你还知道其他方式，请在评论栏中与我们分享。

（题图：Pixabay，CC0）

---

作者简介：

Aaron Kili 是一个 Linux 和 F.O.S.S 爱好者、Linux 系统管理员、网络开发人员，现在也是 TecMint 的内容创作者，他喜欢和电脑一起工作，坚信共享知识。

---

via: <https://www.tecmint.com/cron-vs-anacron-schedule-jobs-using-anacron-on-linux/>

作者：[Aaron Kili](https://www.tecmint.com/author/aaronkili/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


AWS 云服务大全（71 种）

# AWS 云服务大全（71 种）

<img src="content_image/album_201706_09_000008n6h42nmzagbm62nv.jpg" alt="" title="">

*认识 71 个 AWS 云服务的术语 ! 通过了解 AWS 世界中使用的术语开始你的 AWS 云服务使用生涯 !*

AWS，即<ruby> 亚马逊 Web 服务 <rt>  Amazon Web Services </rt></ruby>，是一个提供了一系列按使用计费的 web 服务的云平台。 它是迄今为止最为著名的云平台之一。由于其灵活性、有效性、弹性、可测量性和无须维护，所以有一些企业正逐步把他们的业务迁移到云端。 由于许多公司目前在使用这些服务，所以对于系统管理员和运维人员来说应该了解一下 AWS。

这篇文章旨在列出这些 AWS 提供的服务并且解释在 AWS 中出现的术语。

截止到目前为止（2017 年 3 月），AWS 提供了分为 17 组的共计 71 种服务：

### 计算型服务

这是一个提供了虚拟服务器配置功能的服务，即所谓的云计算。它提供了包括以下这一系列的服务。

1. EC2：EC2 代表弹性计算云。这种服务提供了可根据个人需求扩展的 [虚拟机][11]。
2. EC2 容器服务：其高性能，高可扩展性使其可在 EC2 集群环境中运行服务。
3. Lightsail：该服务使用户非常容易地启动和管理虚拟服务器（EC2）。
4. Elastic Beanstalk：该服务能够自动管理你的应用程序的容量配置、负载平衡、扩展以及健康监控从而减少你的管理压力。
5. Lambda：它允许你只在你需要的时候运行代码而不用去管理服务器。
6. Batch：它使用户能够以自定义的管理方式运行计算工作负载（批处理）。

### 存储型服务

它是一种云存储服务，即由 Amazon 提供的云存储设施。 该组服务包括：

1. S3：S3 代表简单存储服务（3 个 S）。 它给你提供了在线存储服务，你可随时从任何地方存储/检索任何数据。
2. EFS：EFS 代表弹性文件系统。 它是一个可以和 EC2 服务器一起使用的在线存储服务。
3. Glacier：它是一种低成本/低性能数据存储解决方案，主要针对存档或长期备份。
4. Storage Gateway：这种服务的接口会将你的内部应用程序（托管在 AWS 之外）与 AWS 存储连接。

### 数据库

AWS 还提供在其基础设施上托管数据库，以便客户可以利用亚马逊最先进的技术来获得更快/高效/安全的数据处理。 该组包括：

1. RDS：RDS 代表关系数据库服务。 用于在云上设置，操作和管理关系数据库。
2. DynamoDB：其 NoSQL 数据库提供了快速处理和高可扩展性。
3. ElastiCache：这是一种为你的 Web 应用程序管理内存缓存以便更快运行它们的方案 ！
4. Redshift：它是一个巨大的（PB 级）的完全可升级的云端数据仓库服务。

### 网络 & 内容分发

由于 AWS 提供云端的 EC2 服务器，因此网络相关内容也将在出现在这里。 内容分发用于向位于最近位置的用户提供文件。 现如今有许多非常有名的加速网站。

1. VPC：VPC 代表虚拟私有云。 它是你自己的虚拟网络，是你的专用 AWS 帐户。
2. CloudFront：这是 AWS 的内容分发网络（CDN）服务。
3. Direct Connect：它是将数据中心/场所与 AWS 连接起来的网络方式，以提高吞吐量，降低网络成本，并避免由于基于互联网的连接而导致的连接问题。
4. Route 53：它是一个云端的域名系统的 DNS Web 服务。

### 迁移

它提供了一系列服务来帮助你实现本地服务到 AWS 的迁移工作。 这包括 ：

1. Application Discovery Service：专门用于分析您的服务器、网络、应用程序以帮助/加速迁移的服务。
2. DMS：DMS 指的是数据库迁移服务。 它用于将数据从本地数据库迁移到 EC2 上托管的 RDS 或 DB。
3. Server Migration：也称为 SMS（服务器迁移服务）是一种无代理服务，将您的工作负载从本地移动到 AWS。
4. Snowball： 当你想要使用物理存储设备（而不是基于互联网/基于网络的传输）将大量数据传入/迁出 AWS 时，你应该使用它。

### 开发者工具

顾名思义, 这是一系列帮助开发者简化在云端编码的服务。

1. CodeCommit：它是一个安全的、可扩展的、可管理的源代码管理服务，用于托管代码仓库。
2. CodeBuild：这是一个云端的代码生成器。主要用于执行、测试代码和构建部署软件包。
3. CodeDeploy：这是一个可在 AWS 服务器或本地进行自动化应用程序部署的部署服务。
4. CodePipeline：这个部署服务可以使编码人员可以在发布之前将其应用程序可视化。
5. X-Ray：它可以使用事件调用分析应用程序。

### 管理工具

这是一组可帮助你管理 AWS 上的 Web 服务的服务。

1. CloudWatch：监控你的 AWS 资源或应用程序的监控服务。
2. CloudFormation：基础设施即代码！以集体有序的方式管理 AWS 架构的方式。
3. CloudTrail：AWS 帐户的审计和合规工具。
4. Config : AWS 的资源清单、配置历史记录和配置更改通知，以实现安全性和治理。
5. OpsWorks：它可以自动化地配置，部署 EC2 或内部部署计算。
6. Service Catalog：创建和管理被批准在你/公司帐户中使用的 IT 服务目录。
7. Trusted Advisor：它的 AWS AI 可以通过审查你的 AWS 基础设施使你的 AWS 基础设施更好，更省钱。
8. Managed Service：提供持续的基础设施管理。

### 安全性、身份和合规

这是一组很重要的 AWS 服务以确保你的 AWS 空间的安全性。

1. IAM：IAM 即身份和访问管理，控制用户访问你的 AWS 资源和服务。
2. Inspector：自动安全评估可帮助你在 AWS 上的应用安全和合规。
3. Certificate Manager：为 AWS 应用程序提供，管理和部署 SSL / TLS 证书。
4. Directory Service：相当于 AWS 的 Microsoft Active Directory。
5. WAF & Shield：WAF 即 Web 应用防火墙。 监控和控制对 CloudFront 或负载均衡器上的内容的访问。
6. Compliance Reports：AWS 基础设施空间的合规报告，以确保您的应用程序符合您的策略。

### 数据分析

AWS 空间的数据分析服务，以帮助您查看、计划和对帐户中的事件采取行动。

1. Athena：它是一个基于 SQL 查询的服务，用于分析 S3 存储的数据。
2. EMR：EMR 的全写是 Elastic Map Reduce。 是一个主要用于大数据处理和分析的服务。
3. CloudSearch：AWS 在应用和服务中的搜索功能。
4. Elasticsearch Service：它可以创建一个域并在 AWS Cloud 中部署、操作和扩展 Elasticsearch 集群。
5. Kinesis：这种服务可以实现实时的大量流数据处理。
6. Data Pipeline：它可以帮助我们在不同的 AWS 服务之间实现数据迁移。
7. QuickSight：收集、分析和呈现 AWS 的业务数据。

### 人工智能

AWS 的 AI!

1. Lex：它可以帮助我们在一些使用语音和文本的应用中构建会话界面。
2. Polly：这是一个提供文字到语音转换的服务。
3. Rekognition：使您能够将图像分析添加到应用程序。
4. Machine Learning：它具有学习数据中的模式的算法。

### 物联网

这个服务保证了 AWS 在不同设备上的高可用性。

1. AWS IoT：它使联网硬件设备与 AWS 的应用程序能够交互。

### 游戏开发

顾名思义，这个服务旨在游戏开发。

1. Amazon GameLift：该服务旨在部署、管理用于会话的多人游戏的专用游戏服务器。

### 移动服务

这是一组主要针对手持设备的服务。

1. Mobile Hub：帮助您创建移动应用的后台功能并将其集成到移动应用。
2. Cognito：在连接了互联网设备上控制移动用户的身份验证和 AWS 的访问。
3. Device Farm：移动应用测试服务使你可以在 Android 上托管的真实手机上跨 Android、iOS 测试应用。
4. Mobile Analytics：在 AWS 上测量、跟踪和分析移动应用数据。
5. Pinpoint：针对性的推送通知和移动互动。

### 应用服务

这是一组可以和你在 AWS 上的应用一起使用的服务。

1. Step Functions：定义和使用应用程序中的各种功能。
2. SWF：SWF 代表简单的工作流服务。其云工作流程管理可帮助开发人员在应用程序生命周期的不同阶段进行协调和贡献。
3. API Gateway：帮助开发人员创建、管理和托管 API。
4. Elastic Transcoder：帮助开发人员将媒体文件转换为在各种设备上可以播放的格式。

### 消息

AWS 中的通知和消息服务。

1. SQS：SQS 表示简单队列服务。完全管理的消息队列服务，用于在 AWS 中的服务和应用之间进行通信。
2. SNS：SNS 代表简单通知服务。 为 AWS 用户推送通知服务，提醒他们有关其在 AWS 空间中的服务。
3. SES：SES 代表简单电子邮件服务。 这是 AWS 为自己的客户提供高性价比的电子邮件服务。

### 企业生产率

一组帮你提高业务生产率的服务。

1. WorkDocs：协同文件共享、存储和编辑服务。
2. WorkMail：安全的商务邮件、日程服务。
3. Amazon Chime：在线的企业会议！

### 桌面和应用程序流式传输

实现桌面应用程序通过云端进行流传输。

1. WorkSpaces：完全管理且安全的云计算服务。
2. AppStream 2.0：来自云端的流式桌面应用。

（题图：rackaid.com）

---

via: <http://kerneltalks.com/virtualization/aws-cloud-terminology/>

作者：[Shrikant Lavhate](http://kerneltalks.com/virtualization/aws-cloud-terminology/) 译者：[chenxinlong](https://github.com/chenxinlong) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


如何从参与开源项目的过程中获取自信

# 如何从参与开源项目的过程中获取自信

<img src="content_image/album_201706_09_090159ixbqbwxzq06vqx8q.jpg" alt="如何从参与开源项目的过程中获取自信" title="How to gain confidence to participate in open source">

随着大脑的发育，你渐渐学会了这世上什么事情可以/应该做，以及什么事情不能/不应该做。你所有的行为都受到周围大众的影响，很多时候，阻碍你参与某事的原因就是你缺乏自信。

纵观我们的生活，我们都或多或少的受到了世俗和社会行为的“教条”影响。我们可能从小就被这样教育：演说家说的都是真理、CEO 都是有远见的、警察维护社会秩序，尊重别人代表着静听让人把话说完，如果人家说错了，你要看场合轻柔的指出来 —— 好吧，这有点复杂。

当你决心参与到开源项目之中去的时候，自信将扮演重要角色。开源社区有其固有的参与性。参与就相当于开源世界的流通货币，持有该货币的量取决于你的自信。你的参与性越高、技能越高、分享你的想法和简洁次数越多，你就越能通过自己的<ruby> 提交 <rp>  （ </rp> <rt>  commit </rt> <rp>  ） </rp></ruby>来改善某一个项目。所有这些都需要你有很强的信念 —— 你有值得分享的事情 —— 并且你会常常思考自己要做什么、分享什么。

这里不得不说说这样一个事实：我们每一个人都一些值得分享的事情。但是你要找出这个值得分享的事情是什么，以及在哪个位置分享它才能把这个分享推向最积极、最有意义的一面。

认真思考一下三点，这将增强你的自信，并能让你在开源社区中更容易取得进步。

### 没有人会站在你的角度来看待你

你要时刻谨记着：你是完全独立的个人，他人对你做出的评论就像是不存在一样，只有这样才能更好的获得自信。

我们都习惯了这样认知，周围的人都是根据我们的行为来做出评判的。这一习惯是学习如何更像社会群体一样生活的副产品。而且很可能在我们的童年，父母根据我们的行为设置的奖励机制时，这个习惯就根植我们心底。到了青春期，老师们对我们的表现来评价，给我们划分等级和分数，拿我们和身边的小伙伴对比。这样的动力和奖励机制给我们的大脑建立了一个包括自我反思在内的反馈回路。我们需要预测自己能否得到回报，并要为那些可能发生的事情做好应对。

现今的我们都有这样第一个疑惑：身边的人是如何看我的？然而，真相是多数人都不会花太多时间来对你进行正确客观的评价。我们所有人只是关注自己的回报，我们有自己热衷于某件事的的热情、有大量急待解决的问题。也有一些人忙于关心他们自己如何影响身边的人，他们并不会在身上花费时间。他们根本不会注意到你是否出错、大声谈话还是像他们的背景音乐一样。所有的那些疑惑都只是在你自己的脑海中而已，而非在其他任何人脑中。

我们需要被人们所接受的愿望也是人生意义的一部分，但是这类受我们所遇之人的一时兴起。这些人可能对我们缺乏全面认识，比如我们叫什么、我们来自哪里、形成我们认知的经历，等等。我们能否为人们所接受是一件不受我们自身控制的事情。但是，我们是可以通过与之交流来改变的。

在开源的社区化世界里，记住这一点是非常重要的：人们是不会过多的考虑你的感受的。因为你的同事和导师都在忙于其它项目或则社区成员。

一旦你认知了这一点，通过积极地沟通来热情拥抱这个世界吧。寻求帮助、告知他人你的需求、指出你的贡献、让人们知道你和他们在一起努力、你也是这个社区中的活跃分子。当人们向你靠拢 ——而非相反 —— 时，你的开源可信度和自信会得到极大的提高。

### 所有人都热衷于分享自己熟知的事情

任何成功的开源社区都是一个包含教和学的社区。为沐浴在开源中，你不仅需要用到自身的已有知识，还需要不断的吸收消化其他人提供课程中的知识。幸运的是，人们都普遍热衷于分享他们熟悉的事情。

思考一下，当他人问及你的观点时，你是什么感受。得知他人认可了你所说的观点，对你的本我和自我是多么美好的一件事。

在儿童期时，我们的大脑并没有那么发达，无法为我们容纳现实世界中大量的信息量。我们曾一度认为自己是世界的中心。在六岁以前，我们的认知一直在不断成长。在此期间，我们的父母会因我们哭泣而做出回应，周围的成年人都会满足我们要求。这会在我们心底形成自己在世界上最重要的证据。

我们的神经回路在此期间建立完成，我们的性格也在此期间形成。随着我们学会参与社会和城市的生活，我们逐渐的认识到自己并非世界的中心。然而，最初形成并深植我们心底那种意识并不会因此马上就消除掉。正确理解我们在整个社会氛围中的个人意识将有助于你与他人建立连接并融洽相处。

在团结协作中慢慢积累学习经验可以很好的磨练自己、发展自己社会关系和提高自身技能。想要进军开源的世界，不断地学习是不可或缺的。

那么，这些和自信有些什么关系呢？通过表明你重视他人的知识和付出，你提高的不仅是他们的自信，还有你自己的自信。那时你将会感到更加灵活。有些时候，你不得不承认自己也有不懂的地方。

自信的人也许会说“是的，我不知道”，但却不会因此而沮丧。

### 一分耕耘，一分收获

你一定听过“不懂装懂，永远是饭桶”。这样说吧，自信就像其他很多的心理现象。积极地提示自己：我很聪明、有趣、引人关注、极富天赋、健谈、是一个很好的伙伴、独一无二、知识面广、学习能力强、常常自省的思想者，或者是其他你想要具备的特质，久而久之你就会觉得自己就是这样的人。并且，如果这可以在你身上生效，在其他人身上也一样。。

我们把这个称为自我肯定。

此外，在开源的世界中，你是如何为人考虑、如何待人，那么反过来，他人也会是这样的。如果你想在开源贡献中获得成功，你就要有足够的自信来相信自己坚持的立场和事物，当然了，你要以一种可以让人接受的方式来表现，同时还要包容其他的意见和观点。领导者的标志就是，在生活中塑造他们想要看到的形象，而不管是否有他人模仿。

那么，你是否有其他增强自信的方法呢？记得在评论区告诉我们哦。

（题图：[Gabriel Kamener, Sown Together](https://www.flickr.com/photos/42647587@N06/) 原创，经 Jen Wike Huger 修改。）

---

作者简介：

Laura Hilliger - 艺术家、教育事业者、作家、技术专家。她是一个多媒体设计师和开发者、技术联络员、项目经理、一个开放且喜欢协作环境的网络黑客。她主张变革，目前为发展壮大绿色和平组织而辛勤工作。Alum @Mozilla，UC Berkeley，BAVC， Adobe。Twitter @epilepticrabbit 。

---

译者简介：

[GHLandy](http://GHLandy.com) —— <ruby> 欲得之，则为之奋斗。 <rp>  （ </rp> <rt>  If you want it, work for it. </rt> <rp>  ） </rp></ruby>

---

via: <https://opensource.com/article/17/1/3-ways-improve-your-confidence>

作者：[Laura Hilliger](https://opensource.com/users/laurahilliger) 译者：[GHlandy](https://github.com/GHlandy) 校对：[Bestony](https://github.com/Bestony)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


更快的机器学习即将来到 Linux 内核

然后在我们这个世界的某一天，skynet 正式通过加载 LInux 内核的电脑上线？

得益于自由开源生态环境，Linux内核的进化一直进行中。。。

原文标题有问题。内核只是加了HMM功能，并没有加入机器学习，是HMM有利于机器学习提高性能。

GPU驱动是LINUX的痛啊

# 更快的机器学习即将来到 Linux 内核

>
> Linux 内核新增的异构内存管理将解锁加速 GPU 的新途径，并挖掘其它的机器学习硬件的潜能
>
>
>

<img src="content_image/album_201706_09_095208u5to9y7oybtoy7zp.jpg" alt="更快的机器学习正在来到你身边的 Linux 内核" title="更快的机器学习正在来到你身边的 Linux 内核">

一项开发了很久的内存管理技术将会给机器学习和其它 GPU 驱动的程序很大幅度的提升，而它也将在接下来的几个版本中进入 Linux 内核。

异构内存管理（HMM）可以允许设备驱动为在其自身内存管理下的进程镜像地址空间。正如红帽的开发者 Jérôme Glisse [所解释的](https://lkml.org/lkml/2017/4/21/872)，这让像 GPU 这样的硬件设备可以直接访问进程内存，而不用花费复制带来的额外开销。它还不违反现代操作系统提供的内存保护功能。

一类会从 HMM 中获益最多的应用是基于 GPU 的机器学习。像 OpenCL 和 CUDA 这样的库能够从 HMM 中获得速度的提升。HMM 实现这个的方式和[加速基于 GPU 的机器学习](http://www.infoworld.com/article/3195437/machine-learning-analytics-get-a-boost-from-gpu-data-frame-project.html)相似，就是让数据留在原地，靠近 GPU 的地方，在那里直接操作数据，尽可能少地移动数据。

像这样的加速对于 CUDA（英伟达基于 GPU 的处理库）来说，只会有益于在英伟达 GPU 上的操作，这些 GPU 也是目前加速数据处理的主要硬件。但是，OpenCL 设计用来编写可以针对多种硬件的代码——CPU、GPU、FPGA 等等——随着这些硬件的成熟，HMM 能够提供更加广泛的益处。

要让 Linux 中的 HMM 处于可用状态还有一些阻碍。第一个是内核支持，在很长一段时间里都受到限制。[早在 2014](https://lwn.net/Articles/597289/)年，HMM 最初作为 Linux 内核补丁集提出，红帽和英伟达都是关键开发者。需要做的工作不少，但是开发者认为代码可以提交上去，也许接下来的几个内核版本就能把它包含进去。

第二个阻碍是显卡驱动支持，英伟达一直在自己单独做一些工作。据 Glisse 的说法，AMD 的 GPU 可能也会支持 HMM，所以这种特殊优化不会仅限于英伟达的 GPU。AMD 一直都在尝试提升它的 GPU 市场占有率，有可能会[将 GPU 和 CPU 整合](http://www.infoworld.com/article/3099204/hardware/amd-mulls-a-cpugpu-super-chip-in-a-server-reboot.html)到同一模具。但是，软件生态系统依然更青睐英伟达；要使其兑现，还需要更多的像 HMM 这样的中立项目，以及让 OpenCL 提供和 CUDA 相当的性能。

第三个阻碍是硬件支持，因为 HMM 的工作需要一项称作<ruby> 可重现页面故障 <rp>  （ </rp> <rt>  replayable page faults </rt> <rp>  ） </rp></ruby>的硬件特性。只有英伟达的帕斯卡系列高端 GPU 才支持这项特性。从某些意义上来说这是个好消息，因为这意味着英伟达只需要提供单一硬件的驱动支持就能让 HMM 正常使用，工作量就少了。

一旦 HMM 到位，对于提供 GPU 实例的公有云提供商就会面临压力，他们需要[支持最新最好一代的 GPU](http://www.infoworld.com/article/3126076/artificial-intelligence/aws-machine-learning-vms-go-faster-but-not-forward.html)。这并不是仅仅将老款的开普勒架构显卡换成最新的帕斯卡架构显卡就行了，因为后续的每一代显卡都会更加优秀，像 HMM 这样的支持优化将提供战略优势。

（题图：Thinkstock）

---

via: <http://www.infoworld.com/article/3196884/linux/faster-machine-learning-is-coming-to-the-linux-kernel.html>

作者：[Serdar Yegulalp](http://www.infoworld.com/author/Serdar-Yegulalp/) 译者：[alim0x](https://github.com/alim0x) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


Linux 基金会宣布在华建立正式分支机构

Summary: 在 LinuxCon 2017 （北京）即将召开前夕，我们 Linux 中国会同 51CTO、开源中国对 Linux 基金会执行董事 Jim Zemlin 进行了一场远跨大洋的视频专访。

哈哈哈，老王。为什么不是 wxy 了？

哈哈哈，因为老了~~<br />
:-D

老王up up

Linux在中国肯定比其他国家更好，因为中国法律不认可GPL，公司能用代码赚钱养程序员。------我瞎评论的

Where is wxy ? Who is wxy ?

Jim Zemlin。。。真正的粉丝一定会眼花的。。。

那个光头~

Old King: Linux的专题活动，没使用Linux操作系统的本本吗？

汗，我好像应该带头才对——该换个本子了。

# Linux 基金会宣布在华建立正式分支机构

>
> 专访 Linux 基金会执行董事 Jim Zemlin
>
>
>

在 LinuxCon 2017 （北京）即将召开前夕，我们Linux 中国会同 51CTO、开源中国对 [Linux 基金会](http://linuxfoundation.org/)执行董事 Jim Zemlin 进行了一场远跨大洋的视频专访。

在这次专访中，Jim 先生回答了几个开源界和互联网领域关注的问题，并披露了一些有趣的消息和数据。

首先，Jim 先生对 [LinuxCon + ContainerCon + CloudOpen 大会（以下简称 LC3）](https://www.lfasiallc.com/linuxcon-containercon-cloudopen-china)的情况做了介绍：

>
> 首先感谢大家能够出席我们今天的这个活动。先给大家介绍一下我们 LC3 大会。LC3 大会是我们第一次在中国举办这样的活动。在这次活动上，我们邀请到了一些开源界的领袖一起来到中国。
>
>
> 我们可以看到开源在过去这几年在全球都实现了可持续的增长，无论是在云计算，还是在汽车领域，还是在其他的领域。我们也看到中国越来越多地参与到了开源的发展过程中。
>
>
> 在这次活动上，Linux 基金会创始人 Linus Torvalds 会应邀首次访问中国，同时，我们也会邀请一些开源和技术方面的领袖人物来到中国，与中国的开发者和使用 Linux 基础设施的企业，一起来探讨开源方面的事宜。包括 [OpenStack](http://www.openstack.org/) 的项目执行董事、 [Kubernetes](https://kubernetes.io/) 项目的负责人。还有 [hyperledger](https://www.hyperledger.org/)，这是一个在区块链方面的项目，我们也邀请到了它的执行董事。以及 [Open Networking 基金会](https://www.opennetworking.org/)的代表。此外还包括一些大型企业的代表，比如说中国的华为、阿里巴巴、百度等这些企业也会参加这次活动；国外的像 Google、IBM、Amazon 等等这些企业也会来参加这次活动。
>
>
> 我们希望这次活动可以给中国这些利用 Linux 来开发解决方案的企业和组织提供了一个绝佳的机会，让他们可以和世界上一些领先的开源项目开发者或者是负责人一起聊一聊。
>
>
> 我们可以看到 Linux 在中国还是应用得非常广泛的，像阿里云，还有华为的一些产品，包括腾讯、百度，事实上他们都在广泛地使用 Linux，所以说这次活动可以为国内的企业和国内开源方面领先的开发者以及国外领先的开源方面的开发者架设一个桥梁，一起来探讨开源方面的话题。
>
>
>

在之后长达一个小时的采访中，我们还向 Jim 先生提到了若干感兴趣的问题，现将其中一些问题摘录如下：

**1、[LinuxCon](https://www.lfasiallc.com/linuxcon-containercon-cloudopen-china)** **是** **Linux** **基金会第一次高调在中国开展的大型活动，我想了解，这是否代表着** **Linux** **基金会正式地在中国开展活动？如果** **Linux** **基金会加大在中国国内的活动力度，主要的工作方向是建立政府、企业的合作关系呢？还是会扶植和联合高校社团、****LUG****、开源社区这样的团体呢？是否会进一步在中国国内设立正式的分支机构乃至人员？**

*Jim：*

实际上我们去年已经开始在中国建立了一个我们自己的机构。

历史上我们主要和一些开源的企业先开展合作，比如说华为、中国移动；也会和一些本地的社区组织机构开展合作。当然，我们还是希望能够不断地扩展我们在中国的活动，特别是在网络和云计算领域。在网络方面，我们与中国三大电信运营商，包括中国移动、中国电信、中国联通，以及中兴、华为等展开了合作。在云计算方面，我们有[云原生（CNCF）](https://www.cncf.io/)的一些项目，主要是和阿里云、腾讯、百度等三家大的公司来开展合作。

**2、在当前的互联网、移动互联网和物联网迅猛发展形势下，我们面临的安全威胁越来越多，越来越广泛，比如说近年来的几次重大安全事件，从<ruby> 破壳 <rp>  （ </rp> <rt>  Shellshock </rt> <rp>  ） </rp></ruby>****、<ruby> 心血 <rp>  （ </rp> <rt>  heartbleed </rt> <rp>  ） </rp></ruby>****，到最近的** **SMB** **的几个病毒，都给互联网和社会造成了很大影响。那么** **Linux** **的安全性是否能够胜任面对安全的攻击，乃至阻止和遏制安全风险所带来的威胁？** **Linux** **基金会在指导** **Linux** **发展的方向上，是否会把安全性放在功能性之上？****Jim** **先生您是如何看待这个问题的？**

*Jim：*

其实如果要在安全方面拿 Linux 和 Windows 相比，我觉得不是太准确。因为从安全的角度来说你要开发任何一个比较复杂的软件系统，只要这个系统一复杂，就难免会有安全漏洞。

从安全性的角度来看，Linux 这个软件的开发过程，它实际上会有成千上万个开源开发者对它的安全性进行审议，所有的这些代码实际上我们会经过一个“同行审议”的过程，通过这样一些做法和流程可以保证开发出来的 Linux 软件是安全的。

所以，在我们 Linux 开发的过程中，我们希望能够建立一些安全代码的规范。我们启动了 CoreOS 这样一些项目，主要是希望能够帮助我们开发出安全的可靠的软件，这些代码可以经过审计，能够保证我们开发出来的代码是最安全的。总而言之，安全是我们包括 Linux 在内的所有的项目的重中之重，非常关注的、重视的一个问题。

**3、Linux** **与人工智能、云技术、物联网等的结合会在近期进入爆发阶段吗？**

*Jim：*

在云计算方面，像大家都比较熟知的 Kubernetes，它的发展得是非常非常快的，也是参与的开发者非常多的。我们了解到有 380 家企业和 2500 多名开发者在致力于 Kubernetes 的开发，在 GitHub 的仓库中已经有近 5 万个提交和 8000 个 fork。所以，我们可以看到这个规模是非常非常大的。顺便说一句，Kubernetes 的执行董事三周后也会来中国给大家介绍 Kubernetes 发展的情况。

除了在云计算，我们在物联网的项目方面，比如说我们的 [EdgeX](http://www.edgexfoundry.org/) 项目和 IoT 的项目，这些也是有很多开源的项目的，像人工智能、云计算或者是物联网，我们在中国举办的这些活动会越来越多，我们在中国的布局也会扩大，大家参加我们的大会可以了解到这些领域的更多信息。

**4、越来越多的企业都加入代码贡献中，这对于** **Linux** **的发展与推动带来哪些变化？**

*Jim：*

新的企业和新的机构加入到 Linux 的活动当中，会给 Linux 带来更多的价值。比如说上周在日本丰田宣布它卖得最好的凯美瑞汽车会使用 Linux 系统。汽车行业加入 Linux 意味着他们对我们 Linux 的内核会提出新的要求，对那些为嵌入式系统开发解决方案的这些厂商来说也是很好的消息，因为加入 Linux 意味着他们的测试覆盖范围更大了，有更多的人对这个代码进行审议。

总的来说，我们觉得越多的企业和组织架构加入到 Linux 的阵营，实际上对我们 Linux 的发展是越好的。

**5、您认为开源与人工智能碰撞将出现什么样的火花？**

*Jim：*

谈到人工智能，实际上所有的基础设施都需要人工智能的应用。在人工智能的开源项目，现在最大的是谷歌领导的 [TensorFlow](http://www.tensorflow.org/) 这个项目，本次大会我们也邀请到了一些嘉宾会就这方面的内容做一些介绍。

**6、中国有越来越多的开发者加入了开源，但是在** **GitHub** **上来自中国的高质量开源很少，大部分都是来自于国外，您认为，要实现高质量的开源软件，需要具备哪些环境和条件？**

*Jim：*

实际上我们也看到中国有一些高质量的开源的项目也在不断地发展。去年我们与华为和中国移动宣布了一个开源的项目，后来又有中国电信和中国联通的加入，再后来又有一些国际运营商，像 AT&T 和 Orange 也加入了，和中国一些企业共同联手，希望能够建立世界上最大的开源的电信类基础设施。

中国的开源项目和美国相比数量不够多，第一个就是历史原因，因为在美国软件开发的历史比中国要长一些。但是我们可以看到中国也在大步地迎头赶上。我们之所以在中国举办 LC3 大会也是希望让全世界顶尖的开发者和中国的一些企业、一些顶尖的开发者能够共同坐在一起进行探讨，分享最佳实践，我们相信未来中国会有更多的自主的开源的项目。

我们也知道我们 Linux 创始人 Linus Torvalds 也会来到中国，也会和中国这些开源的开发者进行很好地交流，希望能够推动中国的开源项目不断地发展和扩展。

我觉得这次 LC3 大会是一次难得的机会，因为它让全球领先的开发者齐聚一堂。举个例子，一个精英开发者和一个普通的软件开发者的区别能大到什么程度？就像毕加索和一个普通家里面的画家一样，有这样大的一个区别。所以，这次盛会给大家提供了一个很好的机会和世界上最优秀的开发和计算方面的专家共同探讨问题，我们也希望通过这次活动让大家了解到怎么样更好地利用开源来开发新的产品和服务，我们也致力于和中国的这些开发者和行业进行密切地合作，开发出来更多的可以带来价值的开源的代码。

---

经过了一个小时的面对面沟通，我们了解到 Linux 基金会有志于在中国开展更多、更高层次的交流与合作，为在中国推动开源和技术进步而创造更好的环境。

让我们期待 Jim、Linus 以及更多的开源领袖的到来，在 LC3 大会与大家分享开源和技术进步的经验和体会。

我们也将全程跟踪 LC3大会的消息，并及时分享重要技术信息给大家，敬请期待。

Linux 中国，老王报道于北京

2017 年6 月 9 日


教职人员是否可以运用维基百科教学？

说的都好，墙住了。咋办。哈哈哈

污染了DNS，没有封IP~~改host就行

# 教职人员是否可以运用维基百科教学？

<img src="content_image/album_201706_09_221423ncwpjiz43vcs3ipb.png" alt="" title="">

自从 2010 年，已经有 29000 个学生完成了 Wiki Ed 这一项目。他们在维基百科上添加了 2500 万词条，相当于 85000 页纸张的内容。这相当于最新出版的 Britannica 百科全书中全部词条的 66%。Wiki Ed 的学生们最积极的时候，他们贡献了维基百科上 10% 的内容， 极大地补充了贫乏的学术板块。

为了了解更多关于这个项目的信息，我联络了 LiAnna Davis -- Wiki Ed 项目的负责人。他极富热情地同意来回答我的问题。

提示：[Wiki 教育基金会 (Wiki Ed)](https://wikiedu.org/) 的平台是用自由软件搭建的，你可以在这里找到： [WikiEdu Dashboard GitHub](https://github.com/WikiEducationFoundation/WikiEduDashboard)。

**Wiki Ed 这一项目是如何启动的？说说你的背景以及你是如何参与进这个项目的。**

在2010年，[维基基金会](https://wikimediafoundation.org/wiki/Home)（简称 WMF，运营维基百科的非营利组织）注意到了一个趋势 -- 大学的教职人员如果本身也是维基词条的编辑者，会成功地将编辑维基词条作为一项任务交给了自己课堂里的学生。WMF 就此开展了一个试行项目试图解决这个问题：如果本身不编辑维基词条的教职人员支持课程中包含维基词条的编辑任务，他们是否可以通过维基百科实现教学呢？

我是这个团队的一员，在 2010 年被试行雇用，我对这个问题的回答是：“可以。” 在 2013年，WMF 将这个项目的美国分部和加拿大分部拆分，形成了一个新的非营利性组织 -- 维基教育基金会（ Wiki Ed）；自此我也从 WMF 到了Wiki Ed。自那以后我们便成为了一个独立组织，我们可以专注于这个项目并且将这个项目拓展开来 -- 起初 WMF 时期每年只有 75 个班级参与，而这个学期已经有 275 班级参与了 Wiki Ed。

**人们总是觉得大学生对科技相关的一切事物都很敏感，尤其是互联网，但是你们的网站上写道，“大学本科学生可能具有高科技敏感度，但这并不代表他们具有数字信息素养。” 你可以稍微解释一下这句话吗？**

仅仅因为一个人可以搞明白自己的 iPhone 如何使用不代表他们可以明辨他们在网上阅读的信息是否值得信赖。 [斯坦福的一项研究](https://sheg.stanford.edu/upload/V3LessonPlans/Executive%20Summary%2011.21.16.pdf) (“评估信息：公民在线推理的基石 November 22, 2016.”)在近期表明：学生们并不具有数字信息素养。然而，当学生们在撰写维基百科文章之时，他们必须这样。他们需要严格遵守维基百科的[可信来源](https://en.wikipedia.org/wiki/Wikipedia:Identifying_reliable_sources) 规范，这些规范明确了维基百科上的任何信息都必须注明来源，这些来源必须是独立的，而且是可以追溯的事实。对于很多学生，这样注明来源还是第一次，多数人之前仅仅是通过谷歌搜索话题或者注明他们亲眼所见的第一手资料来进行资料的检索和查证。他们需要理解哪些资料可靠，哪些资料不可靠，从而成为足够成熟的电子信息消费者。

**你想对那些声称“维基百科不是一个可靠的来源”的人说些什么？**

维基百科是一本百科全书，根据在词典中的定义，它是一个第三手资料。当学生们开始读本科的时候，他们应该学会参考一手和二手资料，而不是第三手资料，因此学生不应该，且不能引用维基百科的内容。但是维基百科在研究之初会是一个不错的选择，它可以给你对这个话题一个广泛的认识，并且帮你发现页面底部那些你可以参考的文章来源。就像我们所鼓励的：“不要引用！用你的语言写！”

>
> 这样做可以让学生们代入知识生产者的身份，而不是知识的消费者……
>
>
>

**一个教授在 Wiki Ed 项目中的参与是如何影响到他的学生的呢？**

通过运用维基百科教学，导师们可以给学生们提供有价值的媒体素养、批判性思维、线上交流以及写作能力，不论他们在毕业之后会继续选择科研或是加入工作大军，这些极富价值的品质和技能都能帮助他们成功。这样做可以让学生们代入知识生产者的身份，而不是知识的消费者，而且这可以给予他们一个真正在这个世界做出改变的机会，而不是学生们到了学期末便会抛之脑后的生硬习题。

我们正在积极鼓励新的班级在春季学期加入这个项目。感兴趣的教职人员可以点击 [维基教育基金会的教学页](https://teach.wikiedu.org/) 由此开始。

**一个教师会需要哪些职业素养来参与这个项目？学生又是需要哪些训练呢？**

当你在[维基教育基金会的教学页](http://teach.wikiedu.org/)上注册的时候，你会发现 Wiki Ed 为新加入的教职人员提供了如何运用维基百科实现教学的在线指南。我们还有为学生提供的一系列的在线训练，根据他们不同的任务自动分配不同的指南（例如，如果你希望你的学生在文章中插入图片，他们会得到一个如何插入编辑图片的教学单元，如果你不需要，他们便不会得到这个单元的指南）。在部分十几个学科中，我们还有特定的指南书展示了这几个学科的特定编辑方式。除此之外，我们还有熟练维基百科编辑的工作人员帮助回答学生和导师们的问题。我们的系统已经在逐步扩大；我们在这个秋季学期已经支持了超过 6300 个学生，并且已经适应了与没有维基编辑经验的教职人员合作，因此这样就保证了没有人会因为资历不够而无法参与。

**“<ruby> 访问学者 <rt>  Visiting Scholars </rt></ruby>”这个项目是指？**

我们正在试着建立学术界和维基百科之间的联系，而鼓励运用维基百科教学的项目只是其中的一环。在“<ruby> 访问学者 <rt>  Visiting Scholars </rt></ruby>”这一项目中，大学图书馆或者教学部门将公开他们的资料，并提供给一个缺乏资料的认证的维基百科编辑人员（被称作是“访问学者”）。通过大学这一渠道，“访问学者”们可以有机会使用这些资源来完善维基百科广泛领域中的文章。这是一个规模相对小却伟大的项目，因为我们花了很多时间来建立这样的联系，但是这些“学者”们都产出了许多真的很精彩的内容。

**你的合作伙伴有谁？他们的参与如何影响到你现在的成功呢，或者在未来将会如何呢？**

我们与那些将我们工作的价值看做对他们的学科的一种服务的学术机构合作。让我们面对这个现实：当人们想要获取关于一个话题的知识之时，他们不会去读那些同行审议过，并在这些机构发表的学术论文，他们会去维基百科。通过鼓励这些机构中的教职人员用维基百科教学，正可以完善维基百科的在这些学科中的内容和信息。我们的合作伙伴扩充了我们的潜在成员，并且让我们以合作身份大量完善了维基百科上特定学科的内容。

我们欢迎读者点击这个[支持我们](http://wikiedu.org/donate) 的页面通过捐赠来支持我们的工作。

（题图：opensource.com）

---

作者简介：

Don Watkins 是一个教育家，专注教育技术，创业家，开源提倡者。教育心理学硕士、教育领导力硕士、Linux 系统管理员、思科认证网络支持工程师、Virtual Box 虚拟化认证。关注他： @Don\_Watkins 。

---

via: <https://opensource.com/article/17/1/Wiki-Education-Foundation>

作者：Don Watkins 译者：[scoutydren](https://github.com/scoutydren) 校对：[Bestony](https://github.com/Bestony)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出


Linux 系统中修复 SambaCry 漏洞（CVE-2017-7494）

Summary: 这个问题在 Samba 网站上被描述为 CVE-2017-7494，并且已知会影响 Samba v3.5（2010 年 3 月初发布）及以后版本。由于与 WannaCry 有相似之处，它被非官方地被命名为 SambaCry：它们均针对 SMB 协议，并且可能是蠕虫病毒 - 这可能导致其从一个系统传播到另一个系统中。

开启SELinux之后是不是就没事了？

# Linux 系统中修复 SambaCry 漏洞（CVE-2017-7494）

Samba 很久以来一直是为 \*nix 系统上的 Windows 客户端提供共享文件和打印服务的标准。家庭用户，中型企业和大型公司都在使用它，它作为最佳解决方案在多种操作系统共存的环境中脱颖而出。

由于广泛使用的工具很可能发生这种情况，大多数 Samba 安装都面临着可能利用已知漏洞的攻击的风险，这个漏洞直到 WannaCry 勒索软件攻击的新闻出来之前都被认为是不重要的。

在本文中，我们将解释这个 Samba 漏洞是什么以及如何保护你负责的系统。根据你的安装类型（从仓库或者源码），你需要采取不同的方法。

如果你目前有在任何环境中使用 Samba 或者知道有人在使用，请继续阅读！

### 漏洞

过时和未修补的系统容易受到远程代码执行漏洞的攻击。简单来说，这意味着访问可写共享的人可以上传一段任意代码，并使用服务器中的 root 权限执行该代码。

这个问题在 Samba 网站上被描述为 [CVE-2017-7494](https://www.samba.org/samba/security/CVE-2017-7494.html)，并且已知会影响 Samba v3.5（2010 年 3 月初发布）及以后版本。由于与 WannaCry 有相似之处，它被非官方地被命名为 SambaCry：它们均针对 SMB 协议，并且可能是蠕虫病毒 - 这可能导致其从一个系统传播到另一个系统中。

Debian、Ubuntu、CentOS 和 Red Hat 已采取快速的行动来保护它们的用户，并为其支持的版本发布了补丁。另外，还提供了不受支持的安全临时解决方案。

### 更新 Samba

如先前提到的那样，根据你之前安装的方法有两种方式更新：

#### 如果你从发行版的仓库中安装的 Samba

让我们看下在这种情况下你需要做什么：

**在 Debian 下修复 SambaCry**

添加下面的行到你的源列表中（`/etc/apt/sources.list`）以确保 apt 能够获得最新的安全更新：

```
deb http://security.debian.org stable/updates main
deb-src http://security.debian.org/ stable/updates main

```

接下来，更新可用的软件包：

```
# aptitude update

```

最后，确保 samba 软件包的版本符合漏洞修复的版本（见 [CVE-2017-7494](https://security-tracker.debian.org/tracker/CVE-2017-7494)）：

```
# aptitude show samba

```

*在 Debian 中修复 SambaCry*

**在 Ubuntu 中修复 SambaCry**

要开始修复，如下检查新的可用软件包并更新 Samba 软件包：

```
$ sudo apt-get update
$ sudo apt-get install samba

```

已经修复 CVE-2017-7494 的 Samba 版本有下面这些：

* 17.04: samba 2:4.5.8+dfsg-0ubuntu0.17.04.2
* 16.10: samba 2:4.4.5+dfsg-2ubuntu5.6
* 16.04 LTS: samba 2:4.3.11+dfsg-0ubuntu0.16.04.7
* 14.04 LTS: samba 2:4.3.11+dfsg-0ubuntu0.14.04.8

最后，运行下面命令验证你的 Ubuntu 已经安装了正确的版本。

```
$ sudo apt-cache show samba

```

**在 CentOS/RHEL 7 中修复 SambaCry**

在 EL 7 中打过补丁的 Samba 版本是 samba-4.4.4-14.el7\_3。要安装它，这些做：

```
# yum makecache fast
# yum update samba

```

像先前那样，确保你已经安装了打补丁的 Samba 版本：

```
# yum info samba

```

*在 CentOS 中修复 SambaCry*

旧支持的 CentOS 以及 RHEL 更老的版本也有修复。参见 [RHSA-2017-1270](https://rhn.redhat.com/errata/RHSA-2017-1270.html) 获取更多。

#### 如果你从源码安装的 Samba

注意：下面的过程假设你先前从源码构建的 Samba。强烈建议你在部署到生产服务器之前先在测试环境尝试。

此外，开始之前确保你备份了 `smb.conf` 文件。

在这种情况下，我们也会从源码编译并更新 Samba。然而在开始之前，我们必须先确保安装了所有的依赖。注意这也许会花费几分钟。

**在 Debian 和 Ubuntu 中：**

```
# aptitude install acl attr autoconf bison build-essential \
debhelper dnsutils docbook-xml docbook-xsl flex gdb krb5-user \
libacl1-dev libaio-dev libattr1-dev libblkid-dev libbsd-dev \
libcap-dev libcups2-dev libgnutls28-dev libjson-perl \
libldap2-dev libncurses5-dev libpam0g-dev libparse-yapp-perl \
libpopt-dev libreadline-dev perl perl-modules pkg-config \
python-all-dev python-dev python-dnspython python-crypto xsltproc \
zlib1g-dev libsystemd-dev libgpgme11-dev python-gpgme python-m2crypto

```

**在 CentOS 7 或相似的版本中：**

```
# yum install attr bind-utils docbook-style-xsl gcc gdb krb5-workstation \
libsemanage-python libxslt perl perl-ExtUtils-MakeMaker \
perl-Parse-Yapp perl-Test-Base pkgconfig policycoreutils-python \
python-crypto gnutls-devel libattr-devel keyutils-libs-devel \
libacl-devel libaio-devel libblkid-devel libxml2-devel openldap-devel \
pam-devel popt-devel python-devel readline-devel zlib-devel

```

停止服务（LCTT 译注：此处不必要）：

```
# systemctl stop smbd

```

下载并解压源码（在写作时 4.6.4 是最新的版本）：

```
# wget https://www.samba.org/samba/ftp/samba-latest.tar.gz
# tar xzf samba-latest.tar.gz
# cd samba-4.6.4

```

出于了解信息的目的，用以下命令检查可用的配置选项。

```
# ./configure --help

```

如果你在先前的版本的构建中有使用到一些选项，你或许可以在上面命令的返回中包含一些选项，或者你可以选择使用默认值：

```
# ./configure
# make
# make install

```

最后重启服务。

```
# systemctl restart smbd

```

并验证你正在使用的是更新后的版本：

```
# smbstatus --version

```

这里返回的应该是 4.6.4。

### 其它情况

如果你使用的是不受支持的发行版本，并且由于某些原因无法升级到最新版本，你或许要考虑下面这些建议：

* 如果 SELinux 是启用的，你是处于保护之下的！
* 确保 Samba 共享是用 `noexec` 选项挂载的。这会阻止二进制文件从被挂载的文件系统中执行。

还有将：

```
nt pipe support = no

```

添加到 `smb.conf` 的 `[global]` 字段中。你或许要记住，根据 Samba 项目，这“或许禁用 Windows 客户端的某些功能”。

重要：注意 `nt pipe support = no` 选项会禁用 Windows 客户端的共享列表。比如：当你在一台 Samba 服务器的 Windows Explorer 中输入 `\\10.100.10.2\` 时，你会看到 “permission denied”。Windows 客户端不得不手动执行共享，如 `\\10.100.10.2\share_name` 来访问共享。

### 总结

在本篇中，我们已经描述了 SambaCry 漏洞以及如何减轻影响。我们希望你可以使用这个信息来保护你负责的系统。

如果你有关于这篇文章的任何提问以及评论，欢迎使用下面的评论栏让我们知道。

---

作者简介：

Gabriel Cánepa 是一名 GNU/Linux 系统管理员，阿根廷圣路易斯 Villa Mercedes 的 web 开发人员。他为一家国际大型消费品公司工作，在日常工作中使用 FOSS 工具以提高生产力，并从中获得极大乐趣。

---

via: <https://www.tecmint.com/fix-sambacry-vulnerability-cve-2017-7494-in-linux/>

作者：[Gabriel Cánepa](https://www.tecmint.com/author/gacanepa/) 译者：[geekpi](https://github.com/geekpi) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创编译，[Linux中国](https://linux.cn/) 荣誉推出


# 安卓编年史（21）：安卓 4.2，果冻豆——全新 Nexus 设备，全新平板界面

### 安卓 4.2，果冻豆——全新 Nexus 设备，全新平板界面

安卓平台成熟的脚步越来越快，谷歌也将越来越多的应用托管到 Play 商店，需要通过系统更新来更新的应用越来越少。但是不间断的更新还是要继续的，2012 年 11 月，安卓 4.2 发布。4.2 还是叫做“果冻豆”，这个版本主要是一些少量变动。

*LG 生产的 Nexus 4 和三星生产的 Nexus 10。 [Google/Ron Amadeo 供图]*

和安卓 4.2 一同发布的还有两部旗舰设备，Nexus 4 和 Nexus 10，都由谷歌直接在 Play 商店出售。Nexus 4 使用了 Nexus 7 的策略，令人惊讶的低价和高质量，并且无锁设备售价 300 美元。Nexus 4 有一个 4 核 1.5GHz 骁龙 S4 Pro 处理器，2GB 内存以及 1280×768 分辨率 4.7 英寸 LCD 显示屏。谷歌的新旗舰手机由 LG 生产，并和制造商一起将关注点转向了材料和质量。Nexus 4 有着正反两面双面玻璃，这会让你爱不释手，它是有史以来触感最佳的安卓手机之一。Nexus 4 最大的缺点是没有 LTE 支持，那时候大部分手机，包括 Version Galaxy Nexus 都有更快的基带。但 Nexus 4 的需求仍大大超出了谷歌的预料——发布当日大量的流量拖垮了 Play 商店网站。手机在一小时之内销售一空。

Nexus 10 是谷歌的第一部 10 英寸 Nexus 平板。该设备的亮点是 2560×1600 分辨率的显示屏，在这个等级上是分辨率最高的。这背后是双核 1.7GHz Cortex A15 处理器和 2GB 内存的强力支持。随着时间一个月一个月地流逝，Nexus 10 似乎逐渐成为了第一部也是最后一部 10 英寸 Nexus 平板。通常这些设备每年都升级，但 Nexus 10 至今面世 16 个月了，可预见的未来还没有新设备的迹象。谷歌在小尺寸的 7 英寸平板上做得很出色，它似乎更倾向于让[像三星](http://arstechnica.com/gadgets/2014/01/hands-on-with-samsungs-notepro-and-tabpro-new-screen-sizes-and-magazine-ui/)这样的合作伙伴探索更大的平板家族。

*新的锁屏，壁纸，以及时钟小部件设计。 [Ron Amadeo 供图]*

4.2 为锁屏带来了很多变化。文字居中，并且对小时使用了较大的字重，对分钟使用了较细的字体。锁屏现在是分页的，可以自定义小部件。锁屏不仅仅是一个简单的时钟，用户还可以将其替换成其它小部件或者添加额外的页面和更多的小部件。

*锁屏的添加小部件页面，小部件列表，锁屏上的 Gmail 部件，以及滑动到相机。 [Ron Amadeo 供图]*

锁屏现在就像是一个精简版的主屏幕。页面轮廓会显示在锁屏的左右两侧来提示用户可以滑动到有其他小部件的页面。向左滑动页面会显示一个中间带有加号的简单空白页面，点击加号会打开兼容锁屏的小部件列表。锁屏每个页面限制一个小部件，将小部件向上或向下拖动可以展开或收起。最右侧的页面保留给了相机——一个简单的滑动就能打开相机界面，但是你没办法滑动回来。

*新的快速设置面板以及内置应用集合。 [Ron Amadeo 供图]*

4.2 最大的新增特性之一就是“快速设置”面板。安卓 3.0 为平板引入了快速改变电源设置的途径，4.2 终于将这种能力带给了手机。通知中心右上角加入了一枚新图标，可以在正常的通知列表和新的快速设置之间切换。快速设置提供了对屏幕亮度、网络连接、电池以及数据用量更加快捷的访问，而不用打开完整的设置界面。安卓 4.1 中顶部的设置按钮移除掉了，快速设置中添加了一个按钮来替代它。

应用抽屉和 4.2 中的应用阵容有很多改变。得益于 Nexus 4 更宽的屏幕横纵比（5:3，Galaxy Nexus 是 16:9），应用抽屉可以显示一行五个应用图标的方阵。4.2 将自带的浏览器替换为了 Google Chrome，自带的日历换成了 Google Calendar，它们都带来了新的图标设计。时钟和相机应用在 4.2 中经过了重制，新的图标也是其中的一部分。“Google Settings”是个新应用，用于提供对系统范围内所有存在的谷歌账户设置的快捷方式，它有着和 Google Search 和 Google+ 图标一致的风格。谷歌地图拥有了新图标，谷歌纵横，以往是谷歌地图的一部分，作为对 Google+ location 的支持在这个版本退役。

*浏览器替换为 Chrome，带有全屏取景器的新相机界面。 [Ron Amadeo 供图]*

原来的自带浏览器在一段时间内对 Chrome 的模仿上下了不少功夫——它引入了许多 Chrome 的界面元素，许多 Chrome 的特性，甚至还使用了 Chrome 的 javascript 引擎——但安卓 4.2 来临的时候，谷歌认为安卓版的 Chrome 已经准备好换下这个模仿者了。表面上看起来没有多大不同；界面看起来不一样，而且早期版本的 Chrome 安卓版滚动起来没有原浏览器顺畅。不过从深层次来说，一切都不一样。安卓的主浏览器开发现在由 Google Chrome 团队负责，而不是作为安卓团队的子项目存在。安卓的默认浏览器从绑定安卓版本发布、停滞不前的应用变成了不断更新的 Play 商店应用。现在甚至还有一个每个月接收一些更新的 beta 通道。

相机界面经过了重新设计。它现在完全是个全屏应用，显示摄像头的实时图像并且在上面显示控制选项。布局审美和安卓 1.5 的[相机设计](http://cdn.arstechnica.net/wp-content/uploads/2013/12/device-2013-12-26-11016071.png)有很多共同之处：带对焦的最小化的控制放置在取景器显示之上。中间的控制环在你长按屏幕或点击右下角圆形按钮的时候显示。你的手指保持在屏幕上时，你可以滑动来选择环上的选项，通常是展开进入一个子菜单。在高亮的选项上释放手指选中它。这灵感很明显来自于安卓 4.0 浏览器中的快速控制，但是将选项安排在一个环上意味着你的手指几乎总会挡住一部分界面。

*时钟应用，从一个只有两个界面的应用变成功能强大，实用的应用。 [Ron Amadeo 供图]*

时钟应用经过了完整的改造，从一个简单的两个界面的闹钟，到一个世界时钟、闹钟、定时器，以及秒表俱全。时钟应用的设计和谷歌之前引入的完全不同，有着极简审美和红色高亮。它看起来像是谷歌的一个试验。甚至是几个版本之后，这个设计语言似乎也仅限于这个应用。

时钟的时间选择器是经过特别精心设计的。它显示一个简单的数字盘，会智能地禁用会导致无效时间的数字。设置闹钟时间也不能在没有明确选择 AM 和 PM 时设置，永远地解决了不小心将 9am 的闹钟设置成 9pm 的问题。

*平板的新系统界面使用了延展版的手机界面。 [Ron Amadeo 供图]*

安卓 4.2 中最有争议的改变是平板界面，从单独一个统一的底部系统栏变成带有顶部状态栏和底部系统栏的双栏设计。新设计统一了手机和平板的界面，但批评人士说将手机界面延展到 10 英寸的横向平板上是浪费空间。因为导航按键现在拥有了整个底栏，所以他们像手机界面那样被居中。

*平板上的多用户，以及新的手势键盘。 [Ron Amadeo 供图]*

在平板上，安卓 4.2 带来了多用户支持。在设置里，新增了“用户”部分，你可以在这里管理一台设备上的用户。设置在每个用户账户内完成，安卓会给每个用户保存单独的设置，主屏幕，应用以及应用数据。

4.2 还添加了有滑动输入能力的键盘。用户可以将手指一直保持在屏幕上，按顺序在字母按键上滑动来输入，而不用像以前那样一个一个字母单独地输入。

---

[Ron Amadeo](http://arstechnica.com/author/ronamadeo) / Ron是Ars Technica的评论编缉，专注于安卓系统和谷歌产品。他总是在追寻新鲜事物，还喜欢拆解事物看看它们到底是怎么运作的。[@RonAmadeo](https://twitter.com/RonAmadeo)

---

via: <http://arstechnica.com/gadgets/2016/10/building-android-a-40000-word-history-of-googles-mobile-os/22/>

译者：[alim0x](https://github.com/alim0x) 校对：[wxy](https://github.com/wxy)

本文由 [LCTT](https://github.com/LCTT/TranslateProject) 原创翻译，[Linux中国](http://linux.cn/) 荣誉推出