2017年1月16日星期一

玩转奇妙清单

你的记忆没你想像得可靠

俗话说「好记忆不如烂笔头」,Evrenote 的理念就认为「用我们的大脑去记忆不可靠,所以需要一个额外的第二大脑:Evrenote」。
的确,无论你是学生党还是工作党,现代生活中大大小小的琐事越来越多,已经很难不借助外部工具来记录。其实现在很多学生党用豆瓣单纯地标记电影、书籍和歌曲,就是一份变相的清单。更不要说步入社会后,随着承担的角色越来越多,无论是家庭聚会,还是工作进度,甚至每个月交水电费这样的小事,稍不留神就被抛诸脑后。

清单可以帮助你理清思路,作出规划

很多人显然意识到了「一个脑子记不过来」这一惨痛的事实,开始寻求一些解决之道,于是开始接触时间管理、GTD 等概念。然而,这些概念要不过于复杂,不适用于自己的实际生活,要么过于理论,很难套用到具体的行为中去。
而清单则是一个恰到好处的解决方案。一方面,清单充当了思维导图的角色,但你把不同的事项分别存放在不同的清单列表中,实际上已经是对这些事项的第一次梳理,明确了大致分类,方便对自己的日程和时间作出具体的分配和规划。另一方面,清单可以督促我们的行动。很多实验都已经证明了,无论你有没有强迫症,在清单上留有尚待完成的事项,都会激发一个人的行动欲,提高我们的办事效率。

那为什么偏偏选择「奇妙清单」?

1. 因为它「恰到好处」

市面上有太多 To-do 类的 App,简单的如 Clear,最早的版本就是列出清单,甚至都没有提醒功能。复杂的有 GTD 老牌软件 OmniFocus,你可以为每个事项设定不同的情景,关联不同的人物,在不同的透视下查看,当然,如果你每天都有上百个待办事项,OmniFocus 才是你唯一正确的选择。然而对于我们一般人,这些过于简单或复杂的设定,其实并不适用于大多数人的普通生活。
「奇妙清单」没有复杂的情景设置,也没有任务的无限层级,事实上,它从推出到现在,整体的设计和使用理念都没有发生过重大的改变。它的层级只有「清单 - 事项 - 子任务」三级,它只支持设置到期时间和一次提醒,它只可以对优先级高的任务打上星标……
这些不是设计的妥协。一款无所不能的 App,往往大多数人会因为学习成本过高而放弃。但「奇妙清单」非常巧妙地把握了这个平衡,在使用时一切功能都恰到好处。尽管偶尔,你也会抱怨些许功能不如意,但大多数时候,它对于普通人就是最实用的清单应用。

2. 因为它跨了所有平台

「奇妙清单」的另一大优势,在于它的跨平台性。现代生活中,随着移动设备的普及,事实上我们每天都需要在不同的屏幕,不同的系统中切换,有一款能横跨所有平台的 App,会让一切更加无缝地连接起来。
「奇妙清单」可以在 iPhone、iPad、安卓、Windows Phone、Windows 8、Mac、Chromebook、Kindle Fire 和网页上免费使用,除非你时至今日还在坚持黑莓、WebOS 等平台,否则,「奇妙清单」已经可以 360° 全方位无死角地覆盖你所可能接触的一切平台。

3. 因为它支持团队协作

许多事情的完成,往往需要的是一个团队的共同努力,这在工作中十分常见。「奇妙清单」不仅仅可以出色地记录你生活中的各类待办事项,它从诞生的第一天起,就也在考虑如何帮助一个团队更好地协同交流。
因此,「奇妙清单」可以共享清单,可以指派分配任务,彼此之间可以留言通知……一切都让沟通无所阻碍。你可以用它和家人来共享旅游出行必备品的清单,也可以和同事共同跟踪项目进度的情况。
     

4. 因为它和 Evernote、Dropbox 「有一腿」

「奇妙清单」和 Evernote、Dropbox 是许多人现代效率工作的三件必备品,巧合的是,它们也是世界著名风投机构「红杉资本」所投资的三大效率马车。目前,「奇妙清单」已经在附件功能中整合了 Dropbox,但这只是第一步,「奇妙清单」的创始团队已经明确表示了之后会和 Evernote、Dropbox 有更多的深度合作,三者结合在一起,充满了无限的想像空间。

5. 因为它是 —— 免 费 的!

 最后,「奇妙清单」的大杀器是免费!这么说可能不带感,那么来纵观一下它的同类应用。
  • OmniFocus 的 Mac 版本需要 258 元,如果你想在 iPhone 上也使用 OmniFocus,请再掏 128 元。
  • 国产的 Doit.im 也不错,但想像「奇妙清单」一样在多平台间同步?请每个月掏 10 元。
  • Clear,这款最近才加入提醒功能的 App,iPhone 版 30 元,Mac 版 68 元。
而「奇妙清单」呢,上面提到的所有功能,都是免费的。当然,它也有如下图的付费 Pro 版本,但免费账户依然可以有限制地免费使用所有高级功能,而且几乎能满足我们绝大多数人的日常需求。 
终于,介绍到这里,时间线也终于恢复了正常,你肯定至少试用了「奇妙清单」,如果还有没有,相信你也有兴趣下载来试试看了,那就请继续关注本技巧专题系列吧,咱们下期见。

2017年1月11日星期三

28个UNIX/LINUX的命令行神器

dstat & sar

iostat, vmstat, ifstat 三合一的工具,用来查看系统性能(我在《性能调优攻略》中提到过那三个xxstat工具)。
你可以这样使用:
1
alias dstat='dstat -cdlmnpsy'
dstat screenshot

slurm

查看网络流量的一个工具
slurm screenshot

vim & emacs

真正程序员的代码编辑器。
vim screenshot

screen, dtach, tmux, byobu

你是不是经常需要 SSH 或者 telent 远程登录到 Linux 服务器?你是不是经常为一些长时间运行的任务而头疼,比如系统备份、ftp 传输等等。通常情况下我们都是为每一个这样的任务开一个远程终端窗口,因为他们执行的时间太长了。必须等待它执行完毕,在此期间可不能关掉窗口或者断开连接,否则这个任务就会被杀掉,一切半途而废了。
Screen是一个可以在多个进程之间多路复用一个物理终端的窗口管理器。Screen中有会话的概念,用户可以在一个screen会话中创建多个screen窗口,在每一个screen窗口中就像操作一个真实的telnet/SSH连接窗口那样。请参看IBM DeveloperWorks的这篇文章《使用 screen 管理你的远程会话
gnu screen screenshot
dtach 是用来模拟screen的detach的功能的小工具,其可以让你随意地attach到各种会话上 。下图为dtach+dvtm的样子。
tmux是一个优秀的终端复用软件,类似GNU Screen,但来自于OpenBSD,采用BSD授权。使用它最直观的好处就是,通过一个终端登录远程主机并运行tmux后,在其中可以开启多个控制台而无需再“浪费”多余的终端来连接这台远程主机;当然其功能远不止于此。与screen相比的优点:可以横向和纵向分割窗口,且窗格可以自由移动和调整大小。可在多个缓冲区进行复制和粘贴,支持跨窗口搜索;非正常断线后不需重新detach;……  有人说——与tmux相比,screen简直弱爆了
byobu是Ubuntu开发的,在Screen的基础上进行包装,使其更加易用的一个工具。最新的Byobu,已经是基于Tmux作为后端了。可通过“byobu-tmux”这个命令行前端来接受各种与tmux一模一样的参数来控制它。Byobu的细节做的非常好,效果图如下:

multitail

MultiTail是个用来实现同时监控多个文档、类似tail命令的功能的软件。他和tail的区别就是他会在控制台中打开多个窗口,这样使同时监控多个日志文档成为可能。他还可以看log文件的统计,合并log文件,过滤log文件,分屏,……。
multitail screenshot

tpp

终端下的PPT,要是在某某大会上用这个演示PPT,就太TMD的Geek了。
tpp screenshot

xargs & parallel

Executes tasks from input (even multithread).
xargs 是一个比较古老的命令,有简单的并行功能,这个不说了。对于GNU parallel ( online manpage )来说,它不仅能够处理本机上多执行绪,还能分散至远端电脑协助处理。而使用GNU parallel前,要先确定本机有安装GNU parallel / ssh / rsync,远端电脑也要安装ssh。
xargs screenshot

duplicity & rsyncrypto

Duplicity是使用rsync算法加密的高效率备份软件,Duplicity支持目录加密生产和格式上传到远程或本地文件服务器。
rsyncrypto 就是 rsync + encryption。对于rsync的算法可参看酷壳的rsync核心算法
Encrypting backup tools.
duplicity screenshot

nethack & slash’em

NetHackWiki),20年历史的古老电脑游戏。没有声音,没有漂亮的界面,不过这个游戏真的很有意思。网上有个家伙说:如果你一生只做一件事情,那么玩NetHack。这句话很惹眼,但也让人觉得这个游戏很复杂不容易上手。其实,这个游戏很虽然很复杂,却容易上手。虽然玩通关很难,但上手很容易。NetHack上有许多复杂的规则,”the DevTeam thinks of everything”(开发团队想到了所有的事情)。各种各样的怪物,各种各样的武器….,有许多spoilers文件来说明其规则。除了每次开始随机生成的地图,每次玩游戏,你也都会碰到奇怪的事情: 因为喝了一种药水,变成了机器人;因为踢坏了商店的门被要求高价赔偿;你的狗为你偷来了商店的东西….. 这有点象人生,你不能完全了解这个世界,但你仍然可以选择自己的面对方式。
网上有许多文章所这是最好的电脑游戏或最好的电脑游戏之一。也许是因为它开放的源代码让人赞赏,古老的历史让人宽容,复杂的规则让人敬畏。虽然它不是当前流行的游戏,但它比任何一个当前流行的游戏都更有可能再经受20年的考验。
Slash’EM 也是一个基于NetHack的经典游戏。
nethack screenshot

lftp

利用lftp命令行ftp工具进行网站数据的增量备份,镜像,就像使用rsync一样。
lftp screenshot

ack

ack是一个perl脚本,是grep的一个可选替换品。其可以对匹配字符有高亮显示。是为程序员专门设计的,默认递归搜索,省提供多种文件类型供选。
ack screenshot

calcurse & remind + wyrd

calcurse是一个命令行下的日历和日程软件。remind + wyrd也很类似。关于日历,我不得不提一个Linux的Cycle日历,也是一个神器,呵呵。
calcurse screenshot

newsbeuter & rsstail

newsbeuter 和 rsstail 是命令行下RSS的阅读工具。
newsbeuter screenshot

powertop

做个环保的程序员,看看自己的电脑里哪些程序费电。PowerTOP 是一个让 Intel 平台的笔记本电脑节省电源的 Linux 工具。此工具由 Intel 公司发布。它可以帮助用户找出那些耗电量大的程序,通过修复或者关闭那些应用程序或进程,从而为用户节省电源。
powertop screenshot

htop & iotop

htop 和 iotop  用来查看进程,内存和IO负载。
htop screenshot

ttyrec & ipbt

ttyrec 是一个 tty 控制台录制程序,其所录制的数据文件可以使用与之配套的 ttyplay 播放。不管是你在 tty 中的各种操作,还是在 tty 中耳熟能详的软件,都可进行录制。
ipbt 是一个用来回放 ttyrec 所录制的控制台输入过程的工具。
与此类似的还有Shelr 和 termrec 
ipbt screenshot

rsync

通过SSH进行文件同步的经典工具(核心算法
rsync screenshot

mtr

MTR – traceroute 2.0,其是把 traceroute 和 ping 集成在一块的一个小工具 用于诊断网络。
mtr screenshot

socat & netpipes

socat是一个多功能的网络工具,名字来由是” Socket CAT”,可以看作是netcat的N倍加强版。
netpipes 和socat一样,主要是用来在命令行来进行socket操作的命令,这样你就可以在Shell脚本下行进socket网络通讯了。
socat screenshot

iftop & iptraf

iftopiptraf可以用来查看当前网络链接的一些流量情况。
iftop screenshot

siege & tsung

Siege是一个压力测试和评测工具,设计用于WEB开发这评估应用在压力下的承受能力:可以根据配置对一个WEB站点进行多用户的并发访问,记录每个用户所有请求过程的相应时间,并在一定数量的并发访问下重复进行。
Tsung 是一个压力测试工具,可以测试包括HTTP, WebDAV, PostgreSQL, MySQL, LDAP, and XMPP/Jabber等服务器。针对 HTTP 测试,Tsung 支持 HTTP 1.0/1.1 ,包含一个代理模式的会话记录、支持 GET、POST 和 PUT 以及 DELETE 方法,支持 Cookie 和基本的 WWW 认证,同时还支持 SSL。
siege screenshot

ledger

ledger 一个命令行下记帐的小工具。
ledger screenshot

taskwarrior

TaskWarrior 是一个基于命令行的 TODO 列表管理工具。主要功能包括:标签、彩色表格输出、报表和图形、大量的命令、底层API、多用户文件锁等功能。
taskwarrior screenshot
下图是TaskWarrior 2.0的界面:

curl

cURL是一个利用URL语法在命令行下工作的文件传输工具,1997年首次发行。它支持文件上传和下载,所以是综合传输工具,但按传统,习惯称cURL为下载工具。cURL还包含了用于程序开发的libcurl。cURL支援的通訊協定有FTP、FTPS、HTTP、HTTPS、TFTP、SFTP、Gopher、SCP、Telnet、DICT、FILE、LDAP、LDAPS、IMAP、POP3、SMTP和RTSP。
curl screenshot

rtorrent & aria2

rTorrent 是一个非常简洁、优秀、非常轻量的BT客户端. 它使用了 ncurses 库以 C++ 编写, 因此它完全基于文本并在终端中运行. 将 rTorrent 用在安装有 GNU Screen 和 Secure Shell 的低端系统上作为远程的 BT 客户端是非常理想的。
aria2 是 Linux 下一个不错的高速下载工具。由于它具有分段下载引擎,所以支持从多个地址或者从一个地址的多个连接来下载同一个文件。这样自然就大大加快了文件的下载速度。aria2 也具有断点续传功能,这使你随时能够恢复已经中断的文件下载。除了支持一般的 http(s) 和 ftp 协议外,aria2 还支持 BitTorrent 协议。这意味着,你也可以使用 aria2 来下载 torrent 文件。
 rtorrent screenshot

ttytter & earthquake

TTYtter 是一个Perl写的命令行上发Twitter的工具,可以进行所有其他平台客户端能进行的事情,当然,支持中文。脚本控、CLI控、终端控、Perl控的最愛。
Earthquake也是一个命令行上的Twitter客户端。
ttytter screenshot

vifm & ranger

Vifm 基于ncurses的文件管理器,DOS风格,用键盘操作。
vifm screenshot
Ranger用 Python 完成,默认为使用 Vim 风格的按键绑定,比如 hjkl(上下左右),dd(剪切),yy(复制)等等。功能很全,扩展/可配置性也非常不错。类似MacOS X下Finder(文件管理器)的多列文件管理方式。支持多标签页。实时预览文本文件和目录。

cowsay & sl

cowsay  不说了,如下所示,哈哈哈。还有xcowsay,你可以自己搜一搜。
cowsay screenshot
 sl是什么?ls?,呵呵,你会经常把ls 打成sl吗?如果是的话,这个东西可以让你娱乐一下,你会看到一辆火车呼啸而过~~,相当拉风。你可以使用sudo apt-get install sl 安装。
最后,再介绍一个命令中linuxlogo,你可以使用 sudo apt-get install linuxlogo来安装,然后,就可以使用linuxlogo -L
来看一下各种Linux的logo了

Hadoop教程——HDFS简介

1

一、HDFS的基本概念

1.1、数据块(block)
  • HDFS(Hadoop Distributed File System)默认的最基本的存储单位是64M的数据块。
  • 和普通文件系统相同的是,HDFS中的文件是被分成64M一块的数据块存储的。
  • 不同于普通文件系统的是,HDFS中,如果一个文件小于一个数据块的大小,并不占用整个数据块存储空间。
1.2、元数据节点(Namenode)和数据节点(datanode)
元数据节点用来管理文件系统的命名空间:
  1. 其将所有的文件和文件夹的元数据保存在一个文件系统树中。
  2. 这些信息也会在硬盘上保存成以下文件:命名空间镜像(namespace image)及修改日志(edit log)
  3. 其还保存了一个文件包括哪些数据块,分布在哪些数据节点上。然而这些信息并不存储在硬盘上,而是在系统启动的时候从数据节点收集而成的。
数据节点是文件系统中真正存储数据的地方。
  1. 客户端(client)或者元数据信息(namenode)可以向数据节点请求写入或者读出数据块。
  2. 其周期性的向元数据节点回报其存储的数据块信息。
从元数据节点(secondary namenode)
  1. 从元数据节点并不是元数据节点出现问题时候的备用节点,它和元数据节点负责不同的事情。
  2. 其主要功能就是周期性将元数据节点的命名空间镜像文件和修改日志合并,以防日志文件过大。这点在下面会相信叙述。
  3. 合并过后的命名空间镜像文件也在从元数据节点保存了一份,以防元数据节点失败的时候,可以恢复。
1.2.1、元数据节点文件夹结构
1
VERSION文件是java properties文件,保存了HDFS的版本号。
  1. layoutVersion是一个负整数,保存了HDFS的持续化在硬盘上的数据结构的格式版本号。
  2. namespaceID是文件系统的唯一标识符,是在文件系统初次格式化时生成的。
  3. cTime此处为0
  4. storageType表示此文件夹中保存的是元数据节点的数据结构。
1
1.2.2、文件系统命名空间映像文件及修改日志
  • 当文件系统客户端(client)进行写操作时,首先把它记录在修改日志中(edit log)
  • 元数据节点在内存中保存了文件系统的元数据信息。在记录了修改日志后,元数据节点则修改内存中的数据结构。
  • 每次的写操作成功之前,修改日志都会同步(sync)到文件系统。
  • fsimage文件,也即命名空间映像文件,是内存中的元数据在硬盘上的checkpoint,它是一种序列化的格式,并不能够在硬盘上直接修改。
  • 同数据的机制相似,当元数据节点失败时,则最新checkpoint的元数据信息从fsimage加载到内存中,然后逐一重新执行修改日志中的操作。
  • 从元数据节点就是用来帮助元数据节点将内存中的元数据信息checkpoint到硬盘上的
checkpoint的过程如下:
  1. 从元数据节点通知元数据节点生成新的日志文件,以后的日志都写到新的日志文件中。
  2. 从元数据节点用http get从元数据节点获得fsimage文件及旧的日志文件。
  3. 从元数据节点将fsimage文件加载到内存中,并执行日志文件中的操作,然后生成新的fsimage文件。
  4. 从元数据节点奖新的fsimage文件用http post传回元数据节点
  5. 元数据节点可以将旧的fsimage文件及旧的日志文件,换为新的fsimage文件和新的日志文件(第一步生成的),然后更新fstime文件,写入此次checkpoint的时间。
这样元数据节点中的fsimage文件保存了最新的checkpoint的元数据信息,日志文件也重新开始,不会变的很大了。
信息
1.2.3、从元数据节点的目录结构
信息
1.2.4、数据节点的目录结构
目录
数据节点的VERSION文件格式如下:
格式
blk_保存的是HDFS的数据块,其中保存了具体的二进制数据。
blk_.meta保存的是数据块的属性信息:版本信息,类型信息,和checksum
当一个目录中的数据块到达一定数量的时候,则创建子文件夹来保存数据块及数据块属性信息。

二、数据流(data flow)

2.1、读文件的过程
  1. 客户端(client)用FileSystem的open()函数打开文件
  2. DistributedFileSystem用RPC调用元数据节点,得到文件的数据块信息。
  3. 对于每一个数据块,元数据节点返回保存数据块的数据节点的地址。
  4. DistributedFileSystem返回FSDataInputStream给客户端,用来读取数据。
  5. 客户端调用stream的read()函数开始读取数据。
  6. DFSInputStream连接保存此文件第一个数据块的最近的数据节点。
  7. Data从数据节点读到客户端(client)
  8. 当此数据块读取完毕时,DFSInputStream关闭和此数据节点的连接,然后连接此文件下一个数据块的最近的数据节点。
  9. 当客户端读取完毕数据的时候,调用FSDataInputStream的close函数。
  10. 在读取数据的过程中,如果客户端在与数据节点通信出现错误,则尝试连接包含此数据块的下一个数据节点。
  11. 失败的数据节点将被记录,以后不再连接。
读文件
2.2、写文件的过程
  1. 客户端调用create()来创建文件
  2. DistributedFileSystem用RPC调用元数据节点,在文件系统的命名空间中创建一个新的文件。
  3. 元数据节点首先确定文件原来不存在,并且客户端有创建文件的权限,然后创建新文件。
  4. DistributedFileSystem返回DFSOutputStream,客户端用于写数据。
  5. 客户端开始写入数据,DFSOutputStream将数据分成块,写入data queue。
  6. Data queue由Data Streamer读取,并通知元数据节点分配数据节点,用来存储数据块(每块默认复制3块)。分配的数据节点放在一个pipeline里。
  7. Data Streamer将数据块写入pipeline中的第一个数据节点。第一个数据节点将数据块发送给第二个数据节点。第二个数据节点将数据发送给第三个数据节点。
  8. DFSOutputStream为发出去的数据块保存了ack queue,等待pipeline中的数据节点告知数据已经写入成功。
如果数据节点在写入的过程中失败:
  1. 关闭pipeline,将ack queue中的数据块放入data queue的开始。
  2. 当前的数据块在已经写入的数据节点中被元数据节点赋予新的标示,则错误节点重启后能够察觉其数据块是过时的,会被删除。
  3. 失败的数据节点从pipeline中移除,另外的数据块则写入pipeline中的另外两个数据节点。
  4. 元数据节点则被通知此数据块是复制块数不足,将来会再创建第三份备份。
当客户端结束写入数据,则调用stream的close函数。此操作将所有的数据块写入pipeline中的数据节点,并等待ack queue返回成功。最后通知元数据节点写入完毕。