2015年11月

在Arch Linux中使用iPhone遇到麻烦了么?iPhone和Linux从来都没有很好地集成。本教程中,我会向你展示如何在Antergos Linux中使用iPhone,对于同样基于Arch的的Linux发行版如Manjaro也应该同样管用。

我最近购买了一台全新的iPhone 6S,当我连接到Antergos Linux中要拷贝一些照片时,它完全没有检测到它。我看见iPhone正在被充电并且我已经允许了iPhone“信任这台电脑”,但是还是完全没有检测到。我尝试运行dmseg但是没有关于iPhone或者Apple的信息。有趣的是我当我安装好了libimobiledevice,这个就可以解决iPhone在Ubuntu中的挂载问题

我会向你展示如何在Antergos中使用运行iOS 9的iPhone 6S。这会有更多的命令行,但是我假设你用的是ArchLinux,并不惧怕使用终端(也不应该惧怕)。

在Arch Linux中挂载iPhone

第一步:如果已经插入,请拔下你的iPhone。

第二步:现在,打开终端输入下面的命令来安装必要的包。如果它们已经安装过了也没有关系。

sudo pacman -Sy ifuse usbmuxd libplist libimobiledevice

第三步: 这些库和程序安装完成后,重启系统。

sudo reboot

第四步:创建一个iPhone的挂载目录,我建议在家目录中创建一个iPhone目录。

mkdir ~/iPhone

第五步:解锁你的手机并插入,如果询问是否信任该计算机,请允许信任。

第六步: 看看这时iPhone是否已经被机器识别了。

dmesg | grep -i iphone

这时就该显示iPhone和Apple的结果了。就像这样:

[ 31.003392] ipheth 2-1:4.2: Apple iPhone USB Ethernet device attached
[ 40.950883] ipheth 2-1:4.2: Apple iPhone USB Ethernet now disconnected
[ 47.471897] ipheth 2-1:4.2: Apple iPhone USB Ethernet device attached
[ 82.967116] ipheth 2-1:4.2: Apple iPhone USB Ethernet now disconnected
[ 106.735932] ipheth 2-1:4.2: Apple iPhone USB Ethernet device attached

这意味着这时iPhone已经被Antergos/Arch成功地识别了。

第七步: 设置完成后是时候挂载iPhone了,使用下面的命令:

ifuse ~/iPhone

由于我们在家目录中创建了挂载目录,你不需要root权限就可以在家目录中看见。如果命令成功了,你就不会看见任何输出。

回到Files看下iPhone是否已经识别。对于我而言,在Antergos中看上去这样:

你可以在这个目录中访问文件。从这里复制文件或者复制到里面。

第八步: 当你想要卸载的时候,使用这个命令:

sudo umount ~/iPhone

对你有用么?

我知道这并不是非常方便和理想,iPhone应该像其他USB设备那样工作,但是事情并不总是像人们想的那样。好的是一点小的DIY就能解决这个问题带来了一点成就感(至少对我而言)。我必须要说的是Antergos应该修复这个问题让iPhone可以默认挂载。

这个技巧对你有用么?如果你有任何问题或者建议,欢迎留下评论。


via: http://itsfoss.com/iphone-antergos-linux/

作者:Abhishek 译者:geekpi 校对:wxy

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

T-Mobile G1

T-Mobile G1 [T-Mobile 供图]

安卓 1.0——谷歌系 app 和实体硬件的引入

到了 2008 年 10 月,安卓 1.0 已经准备好发布,这个系统在 T-Mobile G1(又以 HTC Dream 为人周知)上初次登台。G1 进入了被 iPhone 3G 和 Nokia 1680 classic 所主宰的市场。(这些手机并列获得了 2008 年销量最佳手机称号,各自卖出了 350 万台。)G1 的具体销量数字已难以获得,但 T-Mobile 宣称截至 2009 年 4 月该设备的销量突破了 100 万台。无论从哪方面来说这在竞争中都处于落后地位。

G1 拥有单核 528Mhz 的 ARM 11 处理器,一个 Adreno 130 的 GPU,192MB 内存,以及多达 256MB 的存储空间提供给系统以及应用使用。它有一块 3.2 英寸、320x480 分辨率的显示屏,被布置在一个含有实体全键盘的滑动结构之上。所以尽管安卓软件的确走过了很长的一段路,硬件也是的。时至今日,我们可以在一个厂商提供手表中得到比这更好的参数:最新的三星智能手表拥有 512MB 内存以及 1GHz 的双核处理器。

当 iPhone 有着最少数量的按键的时候,G1 确实完全相反的,按键几乎支持每个硬件控制。它有拨通和挂断按钮,home 键,后退,以及菜单键,一个相机快门键,音量控制键,一个轨迹球,当然,还有 50 个键盘按键。未来安卓设备将会慢慢离开按键多多的界面设计,几乎每部新旗舰都在减少按键的数量。

但是这是第一次,人们见到了运行在实机上的安卓,而不是跑在一个令人沮丧的慢吞吞的模拟器上。安卓 1.0 没有 iPhone 那样顺滑流畅,闪亮耀眼,或拥有那么多的新闻报道。它也不像 Windows Mobile 6.5 那样才华横溢。但这仍然是个好的开始。

安卓1.0和0.9的默认应用列表。

安卓 1.0 和 0.9 的默认应用列表。[Ron Amadeo供图]

安卓 1.0 的核心与两个月前发布的 beta 版本相比看起来并没有什么引人注目的不同,但这个消费产品带来了不少应用,包括一套完整的谷歌系应用。日历,电子邮件,Gmail,即时通讯,市场,设置,语音拨号,以及 YouTube 都是全新登场。那时候,音乐是智能手机上占据主宰地位的媒体类型,其王者是 iTunes 音乐商店。谷歌没有自家的音乐服务,所以它选择了亚马逊并绑定了亚马逊 MP3 商店。

安卓最重要的新增内容是首次登场的谷歌商店,叫做“安卓市场 Beta”。与此同时大部分公司满足于将它们的软件目录称作各种“应用商店”——意思是一个出售应用的商店,并且只出售应用——谷歌明显有着更大的野心。它搭配了一个更为通用的名字,“安卓市场”。这个名字的想法是安卓市场不仅仅拥有应用,还拥有一切你的安卓设备所需要的东西。

第一个安卓市场客户端。截图展示了主页,“我的下载”,一个应用页面,以及一个应用权限页面。

第一个安卓市场客户端。截图展示了主页,“我的下载”,一个应用页面,以及一个应用权限页面。[Google供图]

那时候,安卓市场只提供应用和游戏,开发者们甚至还不能为它们收费。苹果的 App Store 相对与安卓市场有 4 个月的先发优势,但是谷歌的主要差异化在于安卓的商店几乎是完全开放的。在 iPhone 上,应用受制于苹果的审查,必须遵循设计和技术指南。潜在的新应用不允许在功能上复制已有应用。在安卓市场,开发者可以自由地做任何想做的,包括开发替代已有的应用。控制的缺失导致福祸相依。它允许开发者革新已有的功能,但同时意味着甚至是毫无价值的垃圾应用也被允许进入市场。

时至今日,这个安卓市场的客户端是又一个不再能够和谷歌服务器通讯的应用。幸运的是,它也是在因特网上被真正记录的为数不多的早期安卓应用之一。主页提供了通向一般区域的连接,像应用,游戏,搜索,以及下载,顶部有横向滚动显示的特色应用图标。搜索结果和“我的下载”页面以滚动列表的方式显示应用,显示应用名,开发者,费用(在那时都是免费的),以及评分。单独的应用页面展示了一个简短的描述、安装数、用户评论和评分,以及最重要的安装按钮。早期的安卓市场不支持图片,开发者唯一能使用的区域是应用描述,还有着 500 字的限制。这使得类似维护一个更新日志变的十分困难,因为只有描述的位置可以供其使用。

就在安装之前,安卓市场显示了应用所需要的权限。这是苹果直至 2012 年之前都避免做的,那年一个 iOS 应用被发现在用户不知情的情况下将完整的通讯录上传到云端。权限显示给出了一个完整的应用用到的权限列表,尽管这个版本强迫用户同意应用权限。界面有个“OK”按钮,但是除了后退按钮没有办法取消。

Gmail展示收件箱,打开菜单的收件箱。

Gmail 展示收件箱,打开菜单的收件箱。[Ron Amadeo供图]

下一个重要的应用也许就是 Gmail。大多数基本的功能此时已经准备好了。未读邮件以加粗显示,标签是个有颜色的标记。在收件箱中每封独立邮件显示着主题,发件人,以及一个会话中的回复数。Gmail 加星标志也在这里——快速点击即可给邮件加星或取消。一如往常,对于早期版本的安卓,菜单里有收件箱视图应有的所有按钮。但是,一旦打开了一封邮件,界面看起来就更加的现代了,“回复”和“转发”按钮永久固定在了屏幕底部。单独回复可以点击它们来展开和收缩。

圆角,阴影,以及气泡图标给了整个应用“卡通”的外表,但是这是个好的开始。安卓的功能第一哲学真正从此开始:Gmail 支持标签,邮件会话,搜索,以及邮件推送。

Gmail在安卓1.0的标签视图,写邮件界面,以及设置。

Gmail 在安卓 1.0 的标签视图,写邮件界面,以及设置。[Ron Amadeo 供图]

但是如果你认为 Gmail 很丑,电子邮件应用又拉低了下限。它没有分离的收件箱或文件夹视图——所有东西都糊在一个界面。应用呈现给你一个文件夹列表,点击一个文件夹会以内嵌的方式展开内容。未读邮件左侧有条绿色的线指示,这就是电子邮件应用的界面。这个应用支持 IMAP 和 POP3,但是没有 Exchange。


Ron Amadeo / Ron是Ars Technica的评论编缉,专注于安卓系统和谷歌产品。他总是在追寻新鲜事物,还喜欢拆解事物看看它们到底是怎么运作的。@RonAmadeo


via: http://arstechnica.com/gadgets/2014/06/building-android-a-40000-word-history-of-googles-mobile-os/6/

译者:alim0x 校对:wxy

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

之前我听说高效的系统管理员的一个特点是懒惰。一开始看起来很矛盾,但作者接下来解释了其中的原因:

自动化 Linux 系统维护任务

RHCE 系列:第四部分 - 自动化 Linux 系统维护任务

如果一个系统管理员花费大量的时间解决问题以及做重复的工作,你就应该怀疑他这么做是否正确。换句话说,一个高效的系统管理员/工程师应该制定一个计划使得其尽量花费少的时间去做重复的工作,以及通过使用本系列中第三部分 使用 Linux 工具集监视系统活动报告 介绍的工具来预见问题。因此,尽管看起来他/她没有做很多的工作,但那是因为 shell 脚本帮助完成了他的/她的大部分任务,这也就是本章我们将要探讨的东西。

什么是 shell 脚本?

简单的说,shell 脚本就是一个由 shell 一步一步执行的程序,而 shell 是在 Linux 内核和最终用户之间提供接口的另一个程序。

默认情况下,RHEL 7 中用户使用的 shell 是 bash(/bin/bash)。如果你想知道详细的信息和历史背景,你可以查看这个维基页面

关于这个 shell 提供的众多功能的介绍,可以查看 man 手册,也可以从 (Bash 命令)处下载 PDF 格式。除此之外,假设你已经熟悉 Linux 命令(否则我强烈建议你首先看一下 Tecmint.com 中的文章 从新手到系统管理员指南 )。现在让我们开始吧。

写一个脚本显示系统信息

为了方便,首先让我们新建一个目录用于保存我们的 shell 脚本:

# mkdir scripts
# cd scripts

然后用喜欢的文本编辑器打开新的文本文件 system_info.sh。我们首先在头部插入一些注释以及一些命令:

#!/bin/bash

# RHCE 系列第四部分示例脚本
# 该脚本会返回以下这些系统信息:
# -主机名称:
echo -e "\e[31;43m***** HOSTNAME INFORMATION *****\e[0m"
hostnamectl
echo ""
# -文件系统磁盘空间使用:
echo -e "\e[31;43m***** FILE SYSTEM DISK SPACE USAGE *****\e[0m"
df -h
echo ""
# -系统空闲和使用中的内存:
echo -e "\e[31;43m ***** FREE AND USED MEMORY *****\e[0m"
free
echo ""
# -系统启动时间:
echo -e "\e[31;43m***** SYSTEM UPTIME AND LOAD *****\e[0m"
uptime
echo ""
# -登录的用户:
echo -e "\e[31;43m***** CURRENTLY LOGGED-IN USERS *****\e[0m"
who
echo ""
# -使用内存最多的 5 个进程
echo -e "\e[31;43m***** TOP 5 MEMORY-CONSUMING PROCESSES *****\e[0m"
ps -eo %mem,%cpu,comm --sort=-%mem | head -n 6
echo ""
echo -e "\e[1;32mDone.\e[0m"

然后,给脚本可执行权限:

# chmod +x system_info.sh

运行脚本:

./system_info.sh

注意为了更好的可视化效果各部分标题都用颜色显示:

服务器监视 Shell 脚本

服务器监视 Shell 脚本

颜色功能是由以下命令提供的:

echo -e "\e[COLOR1;COLOR2m<YOUR TEXT HERE>\e[0m"

其中 COLOR1 和 COLOR2 是前景色和背景色(Arch Linux Wiki 有更多的信息和选项解释), 是你想用颜色显示的字符串。

使任务自动化

你想使其自动化的任务可能因情况而不同。因此,我们不可能在一篇文章中覆盖所有可能的场景,但是我们会介绍使用 shell 脚本可以使其自动化的三种典型任务:

1) 更新本地文件数据库, 2) 查找(或者删除)有 777 权限的文件, 以及 3) 文件系统使用超过定义的阀值时发出警告。

让我们在脚本目录中新建一个名为 auto_tasks.sh 的文件并添加以下内容:

#!/bin/bash

# 自动化任务示例脚本:
# -更新本地文件数据库:
echo -e "\e[4;32mUPDATING LOCAL FILE DATABASE\e[0m"
updatedb
if [ $? == 0 ]; then
        echo "The local file database was updated correctly."
else
        echo "The local file database was not updated correctly."
fi
echo ""

# -查找 和/或 删除有 777 权限的文件。
echo -e "\e[4;32mLOOKING FOR FILES WITH 777 PERMISSIONS\e[0m"
# Enable either option (comment out the other line), but not both.
# Option 1: Delete files without prompting for confirmation. Assumes GNU version of find.
#find -type f -perm 0777 -delete
# Option 2: Ask for confirmation before deleting files. More portable across systems.
find -type f -perm 0777 -exec rm -i {} +;
echo ""
# -文件系统使用率超过定义的阀值时发出警告 
echo -e "\e[4;32mCHECKING FILE SYSTEM USAGE\e[0m"
THRESHOLD=30
while read line; do
        # This variable stores the file system path as a string
        FILESYSTEM=$(echo $line | awk '{print $1}')
        # This variable stores the use percentage (XX%)
        PERCENTAGE=$(echo $line | awk '{print $5}')
        # Use percentage without the % sign.
        USAGE=${PERCENTAGE%?}
        if [ $USAGE -gt $THRESHOLD ]; then
                echo "The remaining available space in $FILESYSTEM is critically low. Used: $PERCENTAGE"
        fi
done < <(df -h --total | grep -vi filesystem)

请注意该脚本最后一行两个 < 符号之间有个空格。

查找 777 权限文件的 Shell 脚本

查找 777 权限文件的 Shell 脚本

使用 Cron

想更进一步提高效率,你不会想只是坐在你的电脑前手动执行这些脚本。相反,你会使用 cron 来调度这些任务周期性地执行,并把结果通过邮件发动给预先指定的接收者,或者将它们保存到使用 web 浏览器可以查看的文件中。

下面的脚本(filesystem\_usage.sh)会运行有名的 df -h 命令,格式化输出到 HTML 表格并保存到 report.html 文件中:

#!/bin/bash
# 演示使用 shell 脚本创建 HTML 报告的示例脚本
# Web directory
WEB_DIR=/var/www/html
# A little CSS and table layout to make the report look a little nicer
echo "<HTML>
<HEAD>
<style>
.titulo{font-size: 1em; color: white; background:#0863CE; padding: 0.1em 0.2em;}
table
{
border-collapse:collapse;
}
table, td, th
{
border:1px solid black;
}
</style>
<meta http-equiv='Content-Type' content='text/html; charset=UTF-8' />
</HEAD>
<BODY>" > $WEB_DIR/report.html
# View hostname and insert it at the top of the html body
HOST=$(hostname)
echo "Filesystem usage for host <strong>$HOST</strong><br>
Last updated: <strong>$(date)</strong><br><br>
<table border='1'>
<tr><th class='titulo'>Filesystem</td>
<th class='titulo'>Size</td>
<th class='titulo'>Use %</td>
</tr>" >> $WEB_DIR/report.html
# Read the output of df -h line by line
while read line; do
echo "<tr><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $1}' >> $WEB_DIR/report.html
echo "</td><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $2}' >> $WEB_DIR/report.html
echo "</td><td align='center'>" >> $WEB_DIR/report.html
echo $line | awk '{print $5}' >> $WEB_DIR/report.html
echo "</td></tr>" >> $WEB_DIR/report.html
done < <(df -h | grep -vi filesystem)
echo "</table></BODY></HTML>" >> $WEB_DIR/report.html

在我们的 RHEL 7 服务器(192.168.0.18)中,看起来像下面这样:

服务器监视报告

服务器监视报告

你可以添加任何你想要的信息到那个报告中。添加下面的 crontab 条目在每天下午的 1:30 运行该脚本:

30 13 * * * /root/scripts/filesystem_usage.sh

总结

你很可能想起各种其他想要自动化的任务;正如你看到的,使用 shell 脚本能极大的简化任务。如果你觉得这篇文章对你有所帮助就告诉我们吧,别犹豫在下面的表格中添加你自己的想法或评论。


via: http://www.tecmint.com/using-shell-script-to-automate-linux-system-maintenance-tasks/

作者:Gabriel Cánepa 译者:ictlyh 校对:wxy

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

How to show desktop in GNOME 3

如何在 GNOME 3 中显示桌面?GNOME是一个很棒的桌面环境但是它更加专注于在程序间切换。如果你想关闭所有运行中的窗口,仅仅显示桌面呢?

在Windows中,你可以按下Windows+D。在Ubuntu Unity中,可以用Ctrl+Super+D快捷键。不过由于一些原因,GNOME禁用了显示桌面的快捷键。

当你按下Super+D或者Ctrl+Super+D,什么都不会发生。如果你想要看到桌面,你得一个个最小化窗口。如果你有好几个打开的窗口那么这会非常不方便。

在本教程中,我将会向你展示在GNOME 3中添加显示桌面的快捷键。

在GNOME 3 中添加显示桌面的快捷键

我在本教程的使用的是带有GNOME 3.18的Antergos Linux,但是这些步骤对于任何GNOME 3版本的Linux发行版都适用。同时,Antergos也使用了Numix主题作为默认主题。因此你也许不会看到平常的GNOME图标。但是我相信步骤是一目了然的,很容易就能理解。

第一步

进入系统设置。点击右上角,在下拉列表中,点击系统设置图标。

System Settings in GNOME Antergos Linux

第二步

当你在系统设置中时,寻找Keyboard设置。

Keyboard settings in GNOME 3

第三步

在这里,选择Shortcuts标签并在左边拦选择Navigation。向下滚动一点查找Hide all normal windows。你会看见它已经被禁用了。

Shortcut keys in GNOME 3

第四步

在“Hide all normla windows”上面点击一下。你会看到它变成了New accelerator。现在无论你按下哪个键,它都会被指定为显示桌面的快捷键。

如果你不小心按下了错误的组合键,只要按下退格它就会被禁用。再次点击并使用需要的组合键。

Shortcut key edit in GNOME 3

第五步

一旦设置了组合键,只要关闭系统设置。不用保存设置因为更改是立即生效的。在本例中,我使用Ctrl+Super+D来与我在Ubuntu Unity中的使用习惯保持一致。

Keyboard shortcut edit in GNOME

就是这样。享受GNOME 3中的显示桌面快捷键吧。我希望这篇教程对你们有用。有任何问题、建议或者留言都欢迎:)


via: http://itsfoss.com/show-desktop-gnome-3/

作者:Abhishek 译者:geekpi 校对:Caroline

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

"相较于其它方式,我一直热衷于推崇围绕数据设计代码,我想这也是Git能够如此成功的一大原因[…]在我看来,区别程序员优劣的一大标准就在于他是否认为自己设计的代码还是数据结构更为重要。"

-- Linus Torvalds


"优秀的数据结构与简陋的代码组合远比反之的组合更好。"

-- Eric S. Raymond, The Cathedral and The Bazaar

数据结构与算法分析

学习数据结构与算法分析会让您成为一名出色的程序员。

数据结构与算法分析是一种解决问题的思维模式。 在您的个人知识库中,数据结构与算法分析的相关知识储备越多,您将越多具备应对并解决各类繁杂问题的能力。掌握了这种思维模式,您还将有能力针对新问题提出更多以前想不到的漂亮的解决方案。

您将更深入地了解,计算机如何完成各项操作。无论您是否是直接使用给定的算法,它都影响着您作出的各种技术决定。从计算机操作系统的内存分配到RDBMS的内在工作机制,以及网络协议如何实现将数据从地球的一个角落发送至另一个角落,这些大大小小的工作的完成,都离不开基础的数据结构与算法,理解并掌握它将会让您更了解计算机的运作机理。

对算法广泛深入的学习能为您储备解决方案来应对大体系的问题。之前建模困难时遇到的问题如今通常都能融合进经典的数据结构中得到很好地解决。即使是最基础的数据结构,只要对它进行足够深入的钻研,您将会发现在每天的编程任务中都能经常用到这些知识。

有了这种思维模式,在遇到磨棱两可的问题时,您将能够想出新奇的解决方案。即使最初并没有打算用数据结构与算法解决相应问题的情况,当真正用它们解决这些问题时您会发现它们将非常有用。要意识到这一点,您至少要对数据结构与算法分析的基础知识有深入直观的认识。

理论认识就讲到这里,让我们一起看看下面几个例子。

最短路径问题

我们想要开发一个软件来计算从一个国际机场出发到另一个国际机场的最短距离。假设我们受限于以下路线:

Dijkstra 算法

从这张画出机场各自之间的距离以及目的地的图中,我们如何才能找到最短距离,比方说从赫尔辛基到伦敦?Dijkstra算法是能让我们在最短的时间得到正确答案的适用算法。

在所有可能的解法中,如果您曾经遇到过这类问题,知道可以用Dijkstra算法求解,您大可不必从零开始实现它,只需知道该算法的代码库能帮助您解决相关的实现问题。

如果你深入到该算法的实现中,您将深入理解一项著名的重要图论算法。您会发现实际上该算法比较消耗资源,因此名为A*的扩展经常用于代替该算法。这个算法应用广泛,从机器人寻路的功能实现到TCP数据包路由,以及GPS寻径问题都能应用到这个算法。

先后排序问题

您想要在 开放式在线课程 MOOC,Massive Open Online Courses 平台上(如Udemy或Khan学院)学习某课程,有些课程之间彼此依赖。例如,用户学习 牛顿力学 Newtonian Mechanics 课程前必须先修 微积分 Calculus 课程,课程之间可以有多种依赖关系。用YAML表述举例如下:

# Mapping from course name to requirements
#
# If you're a physcist or a mathematicisn and you're reading this, sincere
# apologies for the completely made-up dependency tree :)
courses:
  arithmetic:         []
  algebra:            [arithmetic]
  trigonometry:       [algebra]
  calculus:           [algebra, trigonometry]
  geometry:           [algebra]
  mechanics:          [calculus, trigonometry]
  atomic_physics:     [mechanics, calculus]
  electromagnetism:   [calculus, atomic_physics]
  radioactivity:      [algebra, atomic_physics]
  astrophysics:       [radioactivity, calculus]
  quantumn_mechanics: [atomic_physics, radioactivity, calculus]

鉴于以上这些依赖关系,作为一名用户,我希望系统能帮我列出必修课列表,让我在之后可以选择任意一门课程学习。如果我选择了微积分(calculus)课程,我希望系统能返回以下列表:

arithmetic -> algebra -> trigonometry -> calculus

这里有两个潜在的重要约束条件:

  • 返回的必修课列表中,每门课都与下一门课存在依赖关系
  • 我们不希望列表中有任何重复课程

这是解决数据间依赖关系的例子,解决该问题的排序算法称作 拓扑排序算法 tsort,topological sort 。它适用于解决上述我们用YAML列出的依赖关系图的情况,以下是在图中显示的相关结果(其中箭头代表需要先修的课程):

拓扑排序算法

拓扑排序算法的实现就是从如上所示的图中找到满足各层次要求的依赖关系。因此如果我们只列出包含radioactivity和与它有依赖关系的子图,运行tsort排序,会得到如下的顺序表:

arithmetic
algebra
trigonometry
calculus
mechanics
atomic_physics
radioactivity

这符合我们上面描述的需求,用户只需选出radioactivity,就能得到在此之前所有必修课程的有序列表。

在运用该排序算法之前,我们甚至不需要深入了解算法的实现细节。一般来说,你可能选择的各种编程语言在其标准库中都会有相应的算法实现。即使最坏的情况,Unix也会默认安装tsort程序,运行man tsort 来了解该程序。

其它拓扑排序适用场合

  • 类似make的工具 可以让您声明任务之间的依赖关系,这里拓扑排序算法将从底层实现具有依赖关系的任务顺序执行的功能。
  • 具有require指令的编程语言适用于要运行当前文件需先运行另一个文件的情况。这里拓扑排序用于识别文件运行顺序以保证每个文件只加载一次,且满足所有文件间的依赖关系要求。
  • 带有甘特图的项目管理工具。甘特图能直观列出给定任务的所有依赖关系,在这些依赖关系之上能提供给用户任务完成的预估时间。我不常用到甘特图,但这些绘制甘特图的工具很可能会用到拓扑排序算法。

霍夫曼编码实现数据压缩

霍夫曼编码 Huffman coding 是一种用于无损数据压缩的编码算法。它的工作原理是先分析要压缩的数据,再为每个字符创建一个二进制编码。字符出现的越频繁,编码赋值越小。因此在一个数据集中e可能会编码为111,而x会编码为10010。创建了这种编码模式,就可以串联无定界符,也能正确地进行解码。

在gzip中使用的DEFLATE算法就结合了霍夫曼编码与LZ77一同用于实现数据压缩功能。gzip应用领域很广,特别适用于文件压缩(以.gz为扩展名的文件)以及用于数据传输中的http请求与应答。

学会实现并使用霍夫曼编码有如下益处:

  • 您会理解为什么较大的压缩文件会获得较好的整体压缩效果(如压缩的越多,压缩率也越高)。这也是SPDY协议得以推崇的原因之一:在复杂的HTTP请求/响应过程数据有更好的压缩效果。
  • 您会了解数据传输过程中如果想要压缩JavaScript/CSS文件,运行压缩软件是完全没有意义的。PNG文件也是类似,因为它们已经使用DEFLATE算法完成了压缩。
  • 如果您试图强行破译加密的信息,您可能会发现由于重复数据压缩质量更好,密文给定位的数据压缩率将帮助您确定相关的 分组密码工作模式 block cipher mode of operation

下一步选择学习什么是困难的

作为一名程序员应当做好持续学习的准备。为了成为一名web开发人员,您需要了解标记语言以及Ruby/Python、正则表达式、SQL、JavaScript等高级编程语言,还需要了解HTTP的工作原理,如何运行UNIX终端以及面向对象的编程艺术。您很难有效地预览到未来的职业全景,因此选择下一步要学习哪些知识是困难的。

我没有快速学习的能力,因此我不得不在时间花费上非常谨慎。我希望尽可能地学习到有持久生命力的技能,即不会在几年内就过时的技术。这意味着我也会犹豫这周是要学习JavaScript框架还是那些新的编程语言。

只要占主导地位的计算模型体系不变,我们如今使用的数据结构与算法在未来也必定会以另外的形式继续适用。您可以放心地将时间投入到深入掌握数据结构与算法知识中,它们将会成为您作为一名程序员的职业生涯中一笔长期巨大的财富。


via: http://www.happybearsoftware.com/how-learning-data-structures-and-algorithms-makes-you-a-better-developer

作者:Happy Bear 译者:icybreaker 校对:Caroline

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

就前面的几篇文章来说,我一直是以 Ubuntu 与 Fedora 作为新手入门的系统,但是其实我真正想推荐的是 Arch ,经过前面的学习,或许你对 Linux 已经有了一个大致的了解,现在如果你想加速你的步伐,也许可以看看本文。如果要问为什么学习 Linux ,我也只能回答 Just for fun 。

本文基本上是我个人见解,有不正确的地方恳请批评指正,另外本文只是推荐 Arch ,并没有说 Arch 是最适合新手的。

Arch Linux

Arch Linux

我的 Linux 学习之路

谈起我的 Linux 学习之路,时间其实并不长,2014 年的 5 月份左右才加入 Linux 中国的群,才开始了解这个系统,并且因为是高三了,我也不可能花太多时间在学习 Linux 这个系统上的,但是我的经验却使我花了相对很少的时间,已经能达到把 Linux 当作自己的桌面系统的程度了。

一切的起因只因为我电脑仅有 512 Mb 的内存,这使得我这个一直以来的 xp 用户,最后连上个 QQ 都能卡死,这样忍受了很久,终于我去寻找解决的方法了。或许是因为我的想法的原因,解决方法并不是去为电脑升级硬件,而是寻找代替 xp 的系统,这时候 Linux 进入了我的眼球,到处都在说 Linux 轻便简洁,以及只需几十兆内存便可流畅运行。当然这时候我搜索出来的肯定是传说中的对新手最友好的 Ubuntu 了,最后我怀着激动的心情安装了它,当时是很开心的,觉得自己终于能换个系统玩了,可以摆脱过去卡机了。但事实是证明我天真了,Ubuntu 的 Unity 桌面,我的老古董机子根本吃不消,玩起来更卡了,甚至后来装 XUbuntu 也无济于事,遇到问题的时候,我去搜索答案能搜出来,但是答案却是基本是无效的,面对这种情况,我当时玩 Ubuntu 是什么东西也没学到的。

Ubuntu 的体验令我有点沮丧,再者它也不适合我机子。后来我又知道了 Debian ,这个发行版据称稳定健壮。我这次怀着犹豫的心情去安装了,安装过程不像 Ubuntu 那样顺利,记得应该遇到过一点问题,但还是解决了。这次的 Debian 安装让我很满意,我的电脑像复活了一样,再也不会卡顿了。然而面对 Debian 我能干什么?我后来发现我什么也没干,我不了解任何东西,我也只会用鼠标点点,右键查看一下属性,双击点个可执行文件 。就这样过了一两个星期(我是只有周末才有半天从学校回来碰个电脑的),有一天,我看到 Linux 中国的群里在讨论一个名为 Arch 的发行版,出于好奇我去搜索了一番,这便是我与 Arch 相遇的开始。

Arch Linux 的设计理念是 轻量简洁。这点正符合我心意,二话不说我就开始了我的 Arch 之旅。当时我还不懂什么是命令行,安装过程完全是参照 Arch Wiki 的过程,虽然不懂为什么,但是我却是一次安装成功,看着自己一步一步敲命令安装的系统当时特有成就感。 Arch Wiki 提供了一条龙服务,刚安装完系统的 Arch 是不带桌面的,但是 Arch Wiki 提供了详细的桌面配置过程,以及输入法配置过程。查看自己的内存使用情况, LXDE + 32 位的 Arch Linux,我的内存占用才 70 M 左右,我知道我这次找到了真爱,于是一直使用 Arch 至今,也感谢我的电脑配置低,不然我很可能就停留在 Ubuntu 了。

使用 Arch Linux 的优势

至于我为什么要推荐 Arch Linux ?对于一个新手,它相对其他发行版有哪些优势呢?

不少人会说 Arch 太难了,不适合新手,对新手并不友好。可我却不这么认为,难是因为你站在了一个较高的起点,而这个高的起点会使你更快地进步,更快地了解 Linux 。Arch 所带给我的就是这样一种学习体验。我从不会到会,再到教别人所用的时间并不长,也许有人会说我只是个特例,那么这篇文章就是写给那些想成为特例的人。学习是靠自己的,只要自己有心,又有什么学不会呢?最近 “Linux 中国-新手村” QQ 群里的许多新人,总是自己一上来就要答案,但是却不曾想过,自己为这个问题做了什么尝试,自己是否有毅力去坚持学习 Linux ?

下面是自己认为推荐 Arch 的一些理由,仅代表我个人的观点:

  • Arch 使你站在一个较高的起点入门,但相应地,你会需要付出一点耐心去学习,并且你会学的更快
  • Arch Wiki 非常丰富,就是我们遇到问题时解决的利器。在遇到问题时先去 Arch Wiki 搜索一下,基本可以解决,这比搜索引擎搜索出来的 Blog 或别人写的一点笔记要靠谱的多
  • Arch 采用滚动更新的方式,因此你不用再考虑以后升级系统需要重装的问题
  • Arch 除了基础的软件包外,不会附加一些多余的东西,所以你的系统基本上是你所需要的东西
  • Arch 的 pacman 是非常简单高效的包管理工具,帮助你轻松管理系统
  • Arch 的 AUR 仓库包含大量软件包,只需一个 makepkg 命令即可构建,非常方便

基于上面的一些原因,我认为 Arch 其实是适合新手的。

首先它比其他大多数发行版要自由;其次它没有预先安装的图形包管理工具,这使得我们必须在终端下完成我们的大部分操作,这将是我们从 Windows 鼠标模式逃离出来的一种动力与压力,因为你拿着鼠标没什么可干的;最后便是 Arch Wiki 对于绝大多数软件包要如何配置,遇到问题怎么去解决,都有详细的说明,这对于新手来说肯定是一个福音。

我推荐 Arch 其实是把自己置于一个相对的窘迫的境地(但是其实笔者不觉得这是困境,我当时对 Arch 是一见钟情的,怀着极大的兴趣把 Arch 收下了),只有这样才会激活你的动力,战胜它,你就赢了自己,收获了技能,如果选择放弃,那么可能你不适合这种学习方式。

结束

可以说我学习 Linux 基本都得益于 Arch 的 Wiki ,是它为我解决了很多问题,再也不用像无头苍蝇一样去搜索答案,当然你使用其他发行版也可以参照 Arch Wiki ,不要浪费了这份宝贵的资源。另外如果你是真心想学习 Linux ,我推荐你看看 Linus 的自传 《just for fun》,还有鸟哥的 《鸟哥的 Linux 私房菜》。Linus 的自传会使你明白一小部分关于 Linux 的故事,我所做的也只是 just for fun ;而鸟哥的书则可以作为一本入门的书籍,鸟哥写的太详细了,选读部分内容就好。最后祝各位能在接下来的学习之路,奋勇向前。