行者无疆 始于足下 - 行走,思考,在路上

打造高效的工作环境(番外篇1): windows/linux钗黛双收

前两篇文章基本上都在对Windows进行各种吐槽,最近Win8消费者预览版的出现更是让我对我的吐槽充满了信心——微软已经堕落到需要靠五颜六色的砖块来吸引眼球的地步了。我虽然没有亲身体验过Metro UI,但是我依然坚持,Metro UI是个无比糟糕的设计,一个彻头彻尾的倒退。颠覆传统、回归本原?是回归到Windows 3.x时代吗?一眼望去,Metro UI似乎很绚烂,像焰火漫天的夜空,但是稍不留意,作为使用者的我们就很容易迷失在图标的海洋里面。在我的印象中,直角化的图案一直是设计里的禁忌之一,而为了弥补这个缺憾(或者说是对传统的颠覆),Metro采用了大量的颜色来填充一个又一个的砖块,使得这些砖块能够不至于“迷失自我”。

我认为一个良好的使用界面应该要有统一的风格,至少不能有太多的颜色,而不是像一个调色版一样令人眼花缭乱;圆角在舒适的用户体验中是不可缺少的,可惜苹果在前,*nix在后,微软在UI设计方面的创新已经没有太多可选的余地,只能走一个极端来玩一场赌博;前两年的Ribbon界面应该是Metro设计的一个铺垫,我认为Ribbon确实是个不错的创新,能够将大量的MS Office小白用户从繁杂的菜单中解放出来,但是Metro实在太过了;最苦的应该是Windows开发者,唉,三年一小改、五年一大改是微软的一贯风格。

不过这些对我都不重要,重要的是我相信,即便我对Windows吐槽了这么多,许多朋友还是小心翼翼,不敢投入Linux的怀抱。正常,因为Linux的门槛确实不低,加上一大堆的概念和思维的转变,再补上如百花从般绚烂多彩的发行版和如满天繁星般闪亮的各种大小bug瑕疵,足以令80%的初学者望而却步。而我又不想让我的文章太过小众(我在开篇中说过,这一系列的文章主要面对以Linux系统为工作环境的初级Coder,兼带高级电脑使用者)。因此,我总结了一些变通的方法,让你可以在你的Windows系统上无痛地尝尝Linux的鲜。

本文主要针对那些想要尝试下Linux但又怕损坏自己Windows的工作平台的同志。当然,本文的重点还是命令行环境的建立,因为熟练掌握命令行是高效使用Linux的必由之路。而至于图形界面,由于Windows Explorer的顽固存在,Windows下的GUI没什么可折腾的。除了虚拟机,似乎没有什么特别完美的办法能够在不切换系统的情况下体验Linux的图形界面。

本文主要介绍一些简单易行的方法手段,能够在Windows下建立一套相对完整的Linux命令行实验环境,为后面系列的文章奠定一个基础,并借此扩大下本系列文章的“打击面”。

1 Cygwin

  • What:通俗的讲,Cygwin是Windows上的一个模拟软件,最初是由Cygnus Solutions公司开发的。
    • Cygwin通过对Windows API的整合封装模拟出一套POSIX API。有了这套基础性的POSIX API(就是Linux C编程的什么fork/wait啊、signal啊、open/close啊这套东西),再加上一套合适的交叉编译器(就是大名鼎鼎的GCC了),就有了在Windows上模拟运行*nix软件的基础。
    • Cygwin本身也包含了很多常用的自由软件,包括核心的bash、coreutils、findutils等,配合Cygwin/X这个东西,甚至可以直接运行许多X Windows上的软件,包括Emacs,gvim等等。
  • How:1
  • Pros:傻瓜式安装;可以和host文件系统方便互通。
  • Cons:没有类似于apt-get这种杀手级的软件包管理工具,安装一些额外的软件颇费周折,而且官方软件库更新较慢。
  • 可用性:3星。
    • 很多以linux为推荐运行平台的软件也支持在Cygwin上开发测试,比如hadoop
  • 结论:如果只是看看Linux的命令行长什么样子,那么本文看到这里就可以了。

2 SUA

  • What:SUA是Windows的一个subsystem,提供一些基本的POSIX API,在此基础上提供一些简单的*nix程序,诸如vi、ksh、csh、ls、cat等。
  • How:@see 这里
  • Pros:SUA是微软自家的东西。
  • Cons:除了Pros之外都是缺点。
    • 软件稀少,版本低无法扩展是致命伤。我只用过一次就甩了。
  • 可用性:1星,玩具而已,未见日常使用
  • 结论:了解即可

3 虚拟机

  • What:虚拟机大概是最常用也最方便的方式了吧,虽然虚拟机本身的水非常深。我第一次接触虚拟机的概念还是在大一上,那个时候自己还在熟悉怎样更好更快地安装Windows操作系统,Virtual PC自然而然就成了我的好伙伴,而我也为能在Virtual PC下顺利安装一个MS DOS 7.1感到欣喜不已。后来接触到了VMware,它有两个显著的特性,一大特性是强,另一大特性就是卡。VirtualBox是我的最爱,轻量快速,乃居家旅行杀人越货必备良品。
  • How:准备10G硬盘空间就OK。
    • VirtualBox有一些非常给力的特性:
  • Pros:虚拟机能够给你100%原生的Linux观感和体验,而且使用过程中无毒无害,更不用担心将系统不小心搞挂,配合上VirtualBox的文件共享功能和全屏功能,再加上一个稍微给力点的电脑2,有时候能够达到以假乱真的效果
  • Cons:性能上还是有些损失的;除了VMware,其余虚拟机软件好像没有特别方便的方法支持bridge network,有时候很不方便。
  • 可用性:4星
  • 结论:VirtualBox乃居家旅行杀人越货必备良品。

4 Colinux

  • What:Cooperative Linux, abbreviated as coLinux, is software which allows Microsoft Windows and the Linux kernel to run simultaneously in parallel on the same machine. 简单而言,coLinux和VirtualBox这类虚拟软件最大的区别在于,coLinux运行的linux系统是何Windows宿主系统共享系统资源的3,因此其性能对比VirtualBox这类虚拟机软件要好很多。
  • How:coLinux本身的安装还是要非一番周折的。幸运的是,万能的社区提供了两个打包好的一键安装方案,那就是andLinuxTopologilinux。我只用过andLinux,推荐。
    • coLinux可以通过samba和windows系统共享文件。
    • 可以将coLinux做成随系统启动的一个服务,并且在coLinux里面开始sshd进行,之后用putty这类软件连接ssh,就可以全面享受linux命令行运指如飞的畅快了。
    • 如果你以前没有用过apt-get这个程序,这次不要错过,因为集中化的软件管理机制是linux(debian/ubuntu的apt-get)的杀手级特性,也是我的最爱。
  • Pros:除了Cons都是Pros。
  • Cons:None。
  • 可用性:5星。
  • 结论:这是我大三暑假在华数淘宝实习时跟一位高手偷师过来的,最爱,强烈推荐。

5 其余解决方案

除了以上谈到的,KDE for Windows是在Windows上体验KDE桌面环境的一种可行的方案,虽然其目前bug依然多多;如果你玩腻了以上所有,想装个真家伙,又怕手生一不小心误删重要文件,那么Ubuntu Wubi应该是一个不错的解决方案。如果你已经开始讨厌Ubuntu Wubi了,那么恭喜你,你已经成功地被我忽悠,进入*nix的精彩世界,just enjoy it。

--

Footnotes:

1 什么?你不会问我Cygwin要怎么安装吧?

2 不够2G内存的同志赶紧去花钱加内存吧,当然,有双屏更好。

3 coLinux运行的linux系统需要对内核进行特殊的修改。当然,关于这种修改本身和coLinux背后的原理已经远远超出了本文讨论的内容和本人的技术水平,还请高手不吝赐教。

打造高效的工作环境(2): 高效的文件管理

1 为什么Windows的文件系统混乱、低效?

让众位久等了!上篇Why Windows Sucks的吐槽文中,我曾谈到,Windows文件系统几点令我非常不喜欢的地方:

  • 文件系统多盘拼,文件命名大小混
  • 权限控制小烦躁,命令终端很废柴

本篇我们稍微深入探讨一下这个话题,并由此引入我们接下来系列文章的主角,*nix。

上小学的时候我们就知道,Windows的第一个盘是C盘。如果你稍微研究下所谓“Windows提速优化”这类的教程,你就会知道C盘是所谓的系统盘,非常重要。如果你足够细心,并且有足够的耐力,那么你可能会学到:

  • 程序尽量不要装在C盘,影响系统运行速度
  • 可以用工具将C盘里的"My Documents"(中文名是“我的文档”)里面的东西转移到别的盘里,这样可以节省很多系统盘的空间,“有可能”使得系统运行更加畅快
  • 定期整理下磁盘碎片,清理下注册表,杀杀毒,可以提高系统运行速度

但是你有没有想过:

  • A盘和B盘哪里去了?
  • 为什么我的系统有C、D、E三个盘而别人的系统除了C、D、E还有F,甚至还有Z盘?
  • 为什么一个电脑的文件系统要分为多个盘呢?
  • 苹果系统需要整理磁盘碎片吗?
  • 注册表到底是干嘛用的?
  • ……

事实上这个世界上本不该有这么多个为什么,一切的一切,源于Windows蹩脚的设计:

  • Windows的文件系统是多根的,这导致你几乎没有办法控制你的移动硬盘的挂载点,几乎没有办法进行chroot高级实验,几乎没有办法制定规范化的类似于*nix下的FHS标准
  • Windows的文件系统目录结构是极其混乱而不统一的,我引用一张表格1来对比说明下*nix和Windows两种文件系统的目录结构,你可以看到,*nix系统目录的命名都非常简洁规律,便于脚本自动化处理,而Windows的文件命名和目录结构像是一层层的石头胡乱堆砌的
     
    Function Linux Microsoft
    Kernel root "WINNT" or "WINDOWS"another page on this site
      /boot  
    Executables /usr/bin "Program Files"
      /usr/lib  
      /usr/share  
      /usr/doc  
      /usr/apps  
    Drivers /dev Win…/System32
    hosts file /etc Win…/System32/Drivers/Etc
    One for each User /usr "Documents and Settings"
      /user  
    Log files /var -
    Temporary work files /tmp Temp
    Optimizing Utilities /opt -
  • Windows的系统文件命名非常混乱,不堪入目,正如“一千个读者心中就有一千个哈姆雷特”一样,一千个Windows C盘就有一千种的文件命名和目录结构,下面是我的正版Windows 7系统下的C盘目录:
    • Windows 7下的C盘:
      • autoexec.bat
      • b7e61efa43ef263f987f6b2dbfe5b362
      • Boot
      • bootmgr
      • BOOTSECT.BAK
      • bootsqm.dat
      • Config.Msi
      • config.sys
      • Documents
      • Download
      • found.000
      • Intel
      • IO.SYS
      • LLabs
      • mfg
      • MSDOS.SYS
      • PerfLogs
      • ppsvodcache
      • ProgramData
      • Program
      • QQDownload
      • $RECYCLE.BIN
      • RRbackups
      • swshare
      • System
      • Temp
      • Users
      • Windows
    • linux下的根目录:
      • bin
      • boot
      • dev
      • etc
      • home
      • lib
      • lib64
      • lost+found
      • media
      • mnt
      • opt
      • proc
      • root
      • run
      • sbin
      • srv
      • sys
      • tmp
      • usr
      • var
  • 合理的文件结构组织和文件命名,对于自动脚本处理是非常重要的,譬如,如果一个文件名称为"My Documents",那么在脚本处理中,如果不小心编码,这个文件就会被当成"My"和"Documents"两个文件处理。

1.1 历史原因

当然,这种混乱是有一定历史原因的。细细讲来倒是很有意思的一件事情。话说MS80年代初只是主打做Basic语言解释器小的软件公司,后来IBM需要发展PC机,最开始找的是DEC公司的人,但是DEC的老总据说是非常忙,而私人飞机好像出了问题,于是就错过了和IBM的谈判,让MS拣了个大大的便宜。而MS呢,手头是没有成型的操作系统的,就从一个不知名的小公司里面花了5万刀买来了一个系统,并重新命名为MS-DOS,联合Intel和IBM做起了合伙生意,只是IBM没有想到的是,你来我往,几番周折,两个小弟弟MS和Intel成长了起来,在90年代中期其风头甚至盖过了IBM自己。其实谈起计算机的水平和资历,全世界也没有几个敢和IBM叫板的公司,当年IBM 360系统的横空出世,不仅开创了软件工程中众多的“人月神话”,更让无数黑客在360系统的熏陶下成长起来。扯远了,话说回来,MS-DOS呢,是一个非常蹩脚的操作系统,甚至连美国大学里的学生都瞧不惯,说微软是做小儿科系统的公司2。你想一想,90年代的时候,Richard Stevens的APUE都出第一版了,而MS-DOS大概才刚刚摆脱8个字符以下长度文件名的限制。后来呢,苹果抄袭Xerox,搞出了漂亮的GUI,这样一来,微软压力甚大,因为系统底层比不过Unix,表面层GUI又被苹果占了先机,危矣。怎么办好呢?微软开始一面搞Windows,一面联合IBM搞OS/2,同时明修栈道、暗度陈仓,从老的DEC公司挖来一批人开始默默地搞NT(号称"New Technology"的操作系统)。这样一直多战线并存的搞到了Windows 2000的横空出世。话说Windows 2000之所以叫Windows 2000,一方面是因为它是在2000年推出的,另一方面恐怕是搞出Windows 2000确实动用了MS 2000个以上的人力(我猜的,不过几千人的人力是有的)。至此呢,Windows开始一心搞NT。其实这样也好,美中不足的是NT为了兼容以前蹩脚操作系统,背上了很多沉重的历史包袱,这也导致Windows系统更新换代的速度特别的慢。Ubuntu半年推出一个新版本,Mac OS自动X后,10年光景,已经到了X.7的版本,每个版本都有大的提升,而微软闭门造车耗时五年的Vista,还有新进推出的Win7,奋战了这么多年,还是没能将XP第一的宝座纳入囊中,我看MS的系统是江郎才尽,再难突破了3

而在微软系统的代代更新中,最苦命的算是一直追随MS的程序员了,掏着升级系统和硬件的银子不说,就连自己费尽力气学到的知识,从BASIC、到MS-DOS、到VC++、到MFC,到ASP,到ASP.NET,到C#,也随着微软系统的更新换代灰飞烟灭了……殊不知,*nix下的程序员,纵历风雨,我心永恒。靠着vi+gcc,我就能闯天下。

2 *nix文件系统的优势

相较Windows,*nix的文件系统相对要规范的多,究其根源,在于*nix有一条非常重要的设计哲学,那就是:Everything in Unix is a file:

  • linux的文件系统是单根的,具有一种逻辑意义上的美感。可能有人会问,如果我们新插入一个移动硬盘,我没有盘符,怎么访问?这就是Windows的惯性思维。在Linux中,我们可以随意创建一个目录,然后通过mount命令将起挂载在这个目录点上。事实上有一个叫做fuse4的东西,允许你mount你想得到想不到的很多东西:
    • 见过PB级别的文件系统吗?我见过,在百度,我们通过hadoop的一个fuse模块,将几千台机器组成的PB级的HDFS文件系统挂载到单机硬盘节点上,对外提供ftp服务5
    • 你可以通过SSH挂载远程机器的文件系统6
    • 你还可以挂载一个ftp到本地系统7
    • 你甚至可以将你的Gmail挂载过来,当本地磁盘用8
  • linux的文件命令和文件存放是很有规律的,稍微学习下,你就会知道/bin、/etc、/usr、/home目录的作用,并且,在所有的*nix环境下,都有这些统一规范的目录。
  • linux为每个用户建立一个单独的/home/user主目录,所有用户相关的配置都存放在这个目录下,结合linux下所有几乎所有配置文件都是纯文本这样的特点,带来的好处就是极其简单实用的用户数据迁移过程 ——当你系统崩溃重装的时候,只需要保留/home分区,不用做太多的配置,一切都在:
    • 原先的软件快捷键几乎保持不变
    • vim和emacs的配置不变
    • 甚至连桌面的壁纸都不会变
  • linux中大量采用纯文本的配置文件,相比较于中央集权的注册表方式管理的配置文件, 纯文本文件的好处在于通用性、直观性、可见性和易读性 。虽然文本配置格式多样,但是你已然可以使用你最擅长的工具(哪怕是OpenOffice也行)来查看甚至修改配置文件,并且可以根据个人需要讲这些配置文件放到诸如bitbucket这类SCM系统里面;而对于Windows的注册表,一旦损坏,除了少数几个专有的工具,你就只能双手一撒,重装系统,或者给微软打电话了。

3 一些个人的关于文件组织和管理的Tips

以上,都是关于Windows不好的吐槽以及*nix好的赞扬,没兴趣的看客可以直接忽略,因为下面的内容才是本篇文章的核心所在。

我曾经无数次在学校教室、宿舍和公司的办公桌上,看见各式人等电脑中,一个可怜单薄的桌面上,存放着从txt、doc、docx、ppt,到jpg、png,到rm、mkv,到rar,到"xxxx的快捷方式"等等五花八门的没有八十也有一百个之多的文件。那感觉就像是看到了五湖四海的人们睡到了一张星级宾馆的床上,令人心头一紧、后背发凉。我甚至可以感觉得到他们盯着屏幕、挪着鼠标、眯着双眼寻找某年某月某日的一份word文件的焦躁与辛苦。我甚至还能联想到,这样的人在生活中也多数是邋遢的,他们会随手丢弃东西,经常翻箱倒柜的去寻找某个久远的日子里的一个小物品。

不是这样的,正确高效的文件组织管理绝对不该是这样的。我相信,即便你没有洁癖,但是看着电脑桌面上那么一坨乱糟糟的东西,心情也会不好的。所以我的电脑桌面上向来都是清清爽爽,一个图标都不放。我个人总结了一些粗浅的文件组织管理的小技巧,经过两年多的实战,效果还是不错的:

3.1 规范同一的文件命名

  • 尽量使用小写的文件命名
  • 尽量使用英文单词命名(良好的英文水平是优秀Coder的必要条件)
  • 如果文件名是多个单词,用下划线_将多个单词连接起来,千万不要留有空格,对脚本化的文档处理非常不利

3.2 良好和谐的目录结构

  • documents:主要存放各种文档,包括但不限于各种工作简历啊、考试进度啊、学校通知啊,诸如此类,定期删除过期文档,将有学习价值的文件转移到study文件夹下
  • downloads:主要存放Firefox等Internet软件的下载资源,有价值的资源及时转移,没有价值的资源及早删除
  • media:主要存放各种多媒体资源,重点用户轻松娱乐,三个子文件夹:
    • musics: 存放喜欢的音乐,将这个文件夹导入Amarok或者你喜欢的播放器软件即可
    • pictures:主要存放个人照片和网上的一些有趣有意义的图片
    • videos:各种电影,我非常喜欢看电影哈,可惜电脑硬盘空间不够,加上我决定要逐步完善自己的版权意识,所以存量有限
  • mnt:用于临时挂载一些U盘的目录
  • programming:用于自己学习编程的目录,我现在用BitBucket管理自己的代码,每个bitbucket上的repository都对应于这个文件夹下的一个子目录
  • software:用于存放一些有用的软件,其实这个没啥必要,因为linux主流distribution的软件库一般都非常完善,只要有好的网络环境,想装什么软件(哪怕同时装几十个软件)只是一条命令或者一次鼠标点击的事情
  • study:存放自己有电脑以来收集到的各种学习资料和自己大学里的各种作业、ppt、文档等等,分门别类,定期整理删除
  • tmp:我自己的tmp目录,用于临时创建一些不重要的测试文件,常见场景是我需要测试一些C语言或者TeX或者Python里面的某个特性,因此临时创建一个小文件,编译运行下,看看效果
  • tools:用于存放自己写的一些系统管理的小工具,比如我自己写的SSH翻墙脚本、设定笔记本电池充电阀值的脚本等等

4 接下来

按照原本的写作计划,在本篇文章的基础之上,我将在接下来的三篇文章中谈到三个主题:

  • Just Find it: Findutils,介绍*nix的小工具,帮助你在文件的海洋中傲游穿梭,包括但不限于:
    • 如何迅速而准确的定位你想要的寻找的文件
    • 如何迅速而准确的在历史的目录树中进行切换穿梭
    • 如何仅仅借助Shell工具,在一个Open Source的代码库中,寻找一个变量的出现位置,并且能够找出到底是哪个文件包含了这个变量的使用
    • 如何删除某个目录下所有以.bak结尾并且修改时间在n天内的所有文件
  • 细谈文本配置,文本配置是"Everything in Unix is a file"的一个重要体现,对应于Windows的注册表,文本化的配置文件大大简化了*nix系统管理工作,这篇主要会介绍:
    • *nix系统中一些重要的配置文件
    • 以及相关的配置文件的配置格式
    • 配置文件跨系统的迁移和保存
    • 以XML/JSON/YAML为例介绍下常见的几种文件配置格式,有可能的话,初步介绍下Lisp中"Code is Data"的扩展概念
  • Shell之道,初步介绍下*nix Shell编程的一些入门要点,并直接转入Shell编程的精华——管道。可能的话,会在此基础上展开探讨下进程间通信的一些思考。

敬请期待!

--

Footnotes:

1 参考Operating Systems & Commands,这篇文章详细对比了*nix和Windows两种系统之间的差异。

2 参考《软件随想录》(阮一峰译),P65,《在耶鲁大学的演讲》。

3 以上言论,多有戏谑成分,众位看官一笑而过,切莫当真。

4 关于Linux中FUSE模块的设计思路,可以参考徐宥写的编程珠玑番外篇-K. Plan 9 的故事(修订版),徐宥写的这一系列文章水平很高,趣味盎然,强烈推荐。

5 参考MountableHDFS

6 参考sshfs

7 参考curlftpfs

8 参考GmailFS

 

打造高效的工作环境(1):Why Windows Sucks

1 缘起

这两天我的ArchLinux系统碰到了一个十分诡异的问题,就是电脑无法待机、关机,也无法重启,更令人拍案叫绝的是,电脑在关机重启的过程中,当硬盘停止转动后,整个系统就Hang住了,而屏幕终端还在,只是不再响应任何请求。解决这个问题的唯一办法就是强制关机,但是这种方法实在有失水准,有伤大雅。在尝试了增删内核模块、更新驱动的等多种方法后,我终于在ArchLinux BBS上找到了解决方案

Google了几个来回,再看一些关于操作系统IT历史的八卦,半个下午就耗掉了,从某种意义上来说,这是在浪费时间。而事实上,如果不算辞掉工作更换电脑被迫地系统调优的那次,我已经至少半年没有进行过OS和软件层面的Tweak工作了。这其中的缘由,大概是由于电脑折腾久了,就会折腾出一套适合自己口味的解决方案,这套解决方案,就是接下来一系列文章的主题——打造高效的工作环境。

打造高效的工作环境,Wow,多么宏大的一个主题啊,不过我见识有限,就这个话题,我只能谈谈电脑相关的知识,和我个人的理解,我不会讲到:

  • 桌上要放几盆草
  • 要不要听轻音乐
  • 开放式的办公空间

等与电脑毫不相关的话题。除此之外,还有一个前提,那就是我的文章主要针对Linux和Mac用户,对Windows用户的参考价值不大。

Why Not Windows?Why Linux?Why Mac?

我100%地相信,在中国,100%的人是通过Windows系统进入电脑的世界的,我也是。但是我也100%地相信,如果你是一个程序员Geek,用Linux或者Mac,会让你的生活变得更美好;如果你只是一个普通的电脑使用者,用Mac或者Linux,至少不会让你的生活变得更差。

说到这里,很多人会跳出来争辩,多数论调是:

  • Linux的驱动如何如何不好
  • Linux的桌面如何如何烂
  • Linux下的软件如何如何不完善
  • Linux下的游戏如何如何匮乏

我的回应是,对于一件事情,对于一件事情,我认为,人的认知有四种状态,分别是:

  • You know you know.
  • You Know you don't know.
  • You don't know you know.
  • You don't know you don't know.

"You know you know"说的是类似于1+1=2这类的常识,首先是你知道"1+1=2"这个知识点,进一步讲,你知道"1+1=2"这个知识点是一个认知事实,而你自己对于这个认知事实也是知晓的,所以归结下来是"You know you know",说的通俗点,就是“你是知道‘你本人是大学文化,所以会算1+1=2’这个事实的”。

"You know you don't know"说的是我这样的Coder,知道自己水平不够,功力尚浅,不懂得AI,不懂得数据库,不会算法,但好在还有自知之明,所为“吾生而有涯,而知也无涯”,"You know you don't know",学吧,学到白头学到老。

"You don't know you know"的情况很少见,这种情况常见于某些天赋异禀而不自知的人,就好比练成了九阳神功的张无忌,明明已经武功盖世,却不自知,见到阿猫阿狗也会心底害怕。

"You don't know you don't know",这句话用来形容那些狂妄自大目中无人之辈真是再合适不过。不过对于常人,我们能否从这句话中得到一些启示呢?当然可以。 事实上,小到一个生活常识,大到一门学科领域,如果你对它不甚了解,甚至完全不知,那么这种"You don't know"有很大的概率是"You don't know you don't know",而不是"You know you don't know"。仔细想想,这句话揭露了一个可怕的事实,那就是,随着知识爆炸的进行,人类在自己探索创建的辉煌文明成果面前,变得越来越无知;另一方面,人类的的知识再以指数级别的速度增长,但是培养人才的方式却没有本质的进步,这也就意味着现代人才的培养会越来越难1

扯远了,说了这么多,就一个意思,在你对一个领域、一个知识有充分的调研学习之前,审行慎言。这也是“为什么上帝给了我们两只耳朵却只给了一张嘴巴2”。我个人曾经有过3年的用Linux做主力桌面的经验,其中有50%的时间是整个电脑上只有一个Linux系统,其余双系统并用的时间,98%的时间也是在Linux上,所以对于Linux桌面的情况,我还算有些发言权:

  • Linux的驱动确实是一个软肋,不过情况较2000年左右Redhat 9.0横行的年代已经改善了很多,在这方面,Ubuntu绝对是一个集大成者,现在已经很少找到装上Ubuntu驱动不能用的电脑了,其余的发行版,经过简单配置,也完全可以搞定驱动问题。
  • Linux的桌面已经非常完善了,Linux 并不是只有一个黑黑的令人敬畏的终端。KDE 4.8的设计和整合已经非常完美,各种软件的集成性比Mac有过之而无不及。
  • Linux下的软件如果不比Windows多,至少不会比Windows少。很多优秀的软件诸如Amarok、Digikam、Emacs等等,都是以Linux为首要支持平台的,甚至有的软件只支持Linux,很多工业级别的软件,诸如Hadoop、MySQL、Apache等等,无一不是以Linux为最佳运行平台。
  • Linux下的游戏比较匮乏,这点是不争的事实。

So,说了这么多,信也好,不信也罢,接下来谈谈:

2 Why Not Windows?

作为一个Coder,每次用Windows,我都有一种想要砸掉电脑的冲动。所以毕业设计时,在Windows上运行VMware里面跑着Mac OS X,启动Xcode写Win32 Style风格的程序,那可真是痛不欲生、终身难忘的事前黑暗时代。我搞了首打油诗:

  • 文件系统多盘拼,文件命名大小混 :Windows是多根文件系统,每个根称作一个盘,而*nix的系统是单根文件系统,新来磁盘只需要在文件系统树上新增个挂载点即可;Windows文件的命名和组织从来没有任何规律,而*nix的文件系统则有一个统一的FHS标准,并且,在Linux下,几乎所有的文件名都是小写字母,并且不含有空格,这对脚本批处理是一个大大的方便之处。
  • 权限控制小烦躁,命令终端很废柴 :Windows下的文件权限很困惑,我从来没搞明白,好像获得一个文件的某种特殊权限,还要去点击属性窗口;用户权限就更加混乱了,一个Administrator,后来Vista和7又加入了貌似“家长模式”等等,太乱了;*nix下的权限控制则非常简单明了,三条命令如chmod, chgrp, sudo就可以全部搞清楚;Windows下的传统cmd.exe简直废柴的不能再废柴了, 谁能告诉我为什么cmd窗口无法最大化? 真不明白这到底是哪门子的设计。
  • 弹出窗口满天飞,后台进程到处藏 :在Windows下还有一点非常让我难受,就是无论是搜狗输入法、迅雷下载,还是QQ、360等,这些软件无一例外,都有一个爱好,就是首先把自己加入系统的启动项,然后呢,在你写代码看片练葵花宝典乾坤大挪移到了关口的时刻,“啪!”的一下给你整几个弹出窗口,放几条八卦新闻……还有那废柴的任务管理器,从来都是杀不掉进程,自己倒先莫名其妙地卡死了,哪里像*nix上的killall -9,手起刀落,快刀展乱麻,痛快痛快。
  • 一家独大搞垄断,格式兼容已败北 :在格式兼容方面,从来都是*nix下的软件想尽办法兼容Windows的软件,但是Windows一家独大,对于兼容别的系统的软件,从来不屑一顾,举例?OpenOffice,ntfs-3g,数不胜数啊。
  • 病毒木马禁不止,杀毒软件赚钱忙 :每次我去帮别人修理Windows系统,别人的第一想法都是让我先替他们杀杀毒,可见,病毒和Windows故障一样,在人们的心中难解难分。
  • 硬盘整理除碎片,系统臃肿找管家 :Windows系统有一个特点,那就是任何系统装好后,都需要“深度优化”,然后才能用得比较舒畅,其中的优化包括但不限于硬盘碎片整理、软件增删、装机必备等等,这也是 为什么各种优化大师、超级兔子、碎片整理等软件“屡禁不止”的原因吧。
  • 万年IE不升级,银行网商耍流氓 :IE 7.0+新增加了多标签的特性,但是呢,这个多标签特性默认情况下是只启动20%的——除非手工指定,否则点开的链接依然是在新窗口中。退一步讲,就算是手工新开个标签页,但是这个空白标签页的打开简直比乌龟还慢,至少要5秒钟,正是让人“屎可忍,而尿不可忍啊”。至于万年不变的IE6,已经国内众网商网银流氓们的ActiceX插件,我已经无力吐槽了,历史会证明,一个不支持跨平台浏览器的银行网商,绝对会是软件史上的一个笑话,或者说,这是中国银行业的奇耻大辱。
  • 多情自古空余恨,聪明反被聪明误 :Windows下的很多软件都喜欢自作聪明,典型例子就是Microsoft Word。且不说各种软硬回车,最简单的一个列表,回车之后默认又是一个列表项,但是如果我想新开段落呢?很多人就不知道怎么办了,于是就各种暴力手段地搞排版,排出来的东西,可想而知。我只能说,这种自作聪明,有时候不是真的聪明,是蛮横的自作主张,是对用户意志赤裸裸的强奸啊。

个人吐槽到此结束,详情请进一步参考:

3 Save your life

在接下来的系列文章里面,我会分门别类地介绍我在Linux桌面使用上的一些日常经验,分享自己的一些心得。这些经验之谈对于刚刚踏入Linux大门的同志,以及对于初级Mac用户,甚至部分喜爱折腾的Windows用户,都有很大的参考价值。我觉得,在信息时代,电脑将伴随着我们的一生,高效地使用电脑,就能够在更短的时间内处理更复杂的事情,从而为自己节省出宝贵的时间,去做更有意义的事情,这是一种正向循环;而如果每天纠结于杀毒、木马、弹出窗口、软件破解,则会使你的思维受阻、降低你的工作效率,这是一种负向循环。

这一系列的读者群将以Linux用户为主(重点是Coder),高级Mac用户可以作为参考,对于Windows用户,理解起来可能会有些困难。不过话又说回来,“不经一番寒彻骨,哪得梅花扑鼻香”。我给自己定下如下两个目标:

  • 在键盘上舞蹈
  • 思维不会受阻

至于主题,我初步想了分为如下几个

  • 高效的文件管理
  • Just Find it:Findutils
  • 细谈文本配置
  • Shell之魂:管道
  • Screen:it not a screen
  • Zsh:终极Shell
  • VIM:键盘上跳舞
  • CLI Tools:把玩终端
  • 时光机:版本控制
  • 抛弃Office:LaTeX
  • KDE系列:
    • Kwin
    • Dolphin & Konqueror
    • Konsole & Yakuake
    • Krunner

敬请期待!

Footnotes:

1 阮一峰博客:什么是博士

2 这是西方的一句谚语,寓意在于告诫人们要多聆听,少说话

 

关于创业

hand in hand我有个习惯,学习或者看书的时候,总会习惯性得拿出一支笔,在一个本子上写写画画。眨眼间入职百度实习已经整整一月,32开软皮小本,潦草不堪,记录着自己一点一滴的成长。这个月还是学了很多东西,虽然不是很系统,虽然这让我更加知道了自己的无知和浅薄:

我以为,知识的学习正如图论中的搜索,分为深度优先和广度优先。而专业的学习往往是在这两种方式之间找一个平衡点。另一方面,知识的广度和深度也是相辅相成的。没有一个大的视野,对深度的钻研往往容易走进死胡同,只见树木不见森林,正如中国的中学数学教育,讲究奇技淫巧,殊不知一些所谓的奇技淫巧到了高等数学只是一个简单的公式而已;但是广度没有深度,之后成为博而不精的庸才。现在的我,广度尚且不足,深度更是有限。

学习之余,更多的是胡思乱想,思考着自己的方向。

比如创业,我认为创业必须有一个前提,那就是创业之初,你的心里必须有一种“原始的赤裸裸的冲动”,就是一种“如国现在不去做这件事情,以后想起来会后悔一辈子”这样的冲动。但是这种冲动,所谓“原始的赤裸裸的”,就好比性高潮一样,但也不完全一样–多数人都能体会到性高潮,但是多数人一辈子也不会有这种“随千万人,吾往矣”的冲动。两者本质的区别在于,性冲动是先天注定的,创业的冲动则需要自己去寻找去挖掘。

关于坚持,我认为,坚持的必要条件是你坚持的这件事情一定是你喜欢的。否则坚持的时间和你的痛苦是成正比的–当然这需要你有一根足够敏感的神经,否则你连痛苦都感受不到,就更不要说坚持了。假定你喜欢的事情作为坚持的前提条件和正向因素,日后的阻力、压力、失败、挫折作为坚持的负向因素,当正向因素和负向因素相抵,而你还能保持乐观的心态前进的方向奋斗不息的动力,我认为,这,才是真正的坚持。

当然,坚持并不等同于成功。创业也不仅仅是坚持这么简单的体力活。我们常常可以看到“某某公司上市产生了几百个百万千万富翁–连司机都成百万富翁了”这样的故事,比如前些天上市的优酷。岂不知,这样的报道就像报道傻子吃馒头一样–“今天吃了四个馒头,没饱,又吃了一个,终于饱了,哎,算了,好笨啊,以后直接吃第五个馒头好了”,可笑至极。罗马不是一天建成的,任何事情都是一个积累的过程,量变导致的质变。说白了,就两个字,迭代。快速迭代,越变越美。

很多人看到了马云的成功,却看不到他背后的东西:

  • 马云中学期间就经常去西湖给老外当导游,锻炼自己的英语–好的英语给了他一份谋生的职业(大学教师),给了他扩展国际视野的资本和前提,给了他一个创业到条件(翻译社)。
  • 马云高考考了三次,第一次数学1分,第二次10+分,第三次不到80–看到了吗?这叫厚脸皮承受挫折的能力。
  • 马云爱读武侠小说,戏说江湖醒人世,拈花一笑万山横–一个公司创始者的灵魂常常会永久地留在这个公司,笑傲江湖,看马云见招拆招。
  • 马云的人脉,人格魅力–十八罗汉,在马云家帮哦那个,自己租房,条件是任何时候只要有需要五分钟内必须赶到马云家中;蔡崇信,耶鲁博士,放弃70w美元的年薪跟着马云领每个月500元的工资。
  • 马云的创业经验–杭州的翻译社,中国黄页。
  • 马云的自信与霸气–“五年后,北京就不会这样对我”。
  • 马云的创业理念和社会责任–服务于中国广大的中小企业,创办淘宝给社会解决就业问题,坚决不做网游不投资房地产。

所以有时我在想,什么时候会去创业?但是我一直想不明白。我觉得我有创业者的潜质和基因,我很幸运地有过三次“原始的赤裸裸的冲动”,那就是高中的化学竞赛,预科时杭州到承德的骑行,大一暑假杭州到拉萨的漂泊。每次都是筹划良久偷偷摸摸,每次都是顶风作案瞒着父母亲人顶着各方的反对,每次都是风吹日晒独自一人永不停歇,每次都是废寝忘食撕破脸皮人生豪迈大不了从头再来,每次还都比较幸运,都做成了。

每个人的心中都有几捆干柴,但是不是每个人都能找到自己的火种,将干柴变成烈火。我,在寻找我的下一个火种。

CLI派视频音频转码工具用法小结(ffmpeg)1

1 ffmpeg 264编码支持

2 ffmpeg 参数选项简要说明

2.1 main options

  • -i filename: 指定输入文件
  • -y: Overwrite output files
  • -target: Specify target file type ("vcd", "svcd", "dvd", "dv", "dv50", "pal-vcd", "ntsc-svcd", … ). All the format options (bitrate, codecs, buffer sizes) are then set automatically. It is one of the most useful options of ffmpeg. It instructs ffmpeg to just "do what it takes" for the target file to be usable.

2.2 视频剪辑相关参数

  • -ss: 设定剪辑开始时间[支持[hh:mm:ss[.xxx]]格式
  • -t: 设定剪辑长度[支持[hh:mm:ss[.xxx]]格式
  • -fs: 设定文件大小限制

2.3 video options

  • -b bitrate: 设定比特率(默认为200kb/s)
  • -r fps: frame rate(默认为25)
  • -s size: set frame size
    • wxh(width x height) or
    • abbreviations(qcif(176x144), vga(640x480), wvga(852x480)
  • -aspect aspect: 设定aspect ratio(4:3, 16:9, 30:9, 1:3 or 1.333, 1.777 etc.)
  • -sameq: use same video quality as source (implies VBR).
  • -vcodec: codec: force video codec to codec. Use the copy special value to tell that the raw codec data must be copied as is.
  • -newvideo: add a new video stream to the current output stream.
  • -pass n 选择处理遍数(1或者2)。两遍编码非常有用。第一遍生成统计信息,第二遍生成精确的请求的码率
  • -map inputstreamid[:syncstreamid]: Set stream mapping from input streams to output streams.
  • -itsoffset offset Set the input time offset in seconds. "[-]hh:mm:ss[.xxx]" syntax is also supported. This option affects all the input files that follow it.

2.3.1 crop options(视频剪裁选项说明)

  • -crop x:y:width:height: Crop the input video to x:y:width:height.
  • -croptop
  • -cropbottom
  • -cropleft
  • -cropright

2.3.2 pad and filter options

  • -vf filter_graph
  • -vf pad=width:height:x:y:color(这个命令可以给裁剪后的视频增加上下两个pad,形成电影似的效果)

2.4 audio options

  • -ar freq: set the audio sampling frequency(default=44100Hz)
  • -ab bitrate: 设定比特率(默认为64K)
  • -aq q: set the audio quality
  • -ac channels: set the number of audio channels(default=1)
  • -acodec codec: force audio codec to codec. Use the copy special value to specify that the raw codec data must be copied as is.
  • -newaudio: add a new audio track to the output file. If you want to specify parameters, do so before -newaudio (-acodec, -ab, etc..).

2.5 subtitle options

  • -scodec codec: force subtitle codec ('copy' to copy stream).
  • -newsubtitle: add a new subtitle stream to the current output stream.

2.6 disable options

  • -an: disable audio recording.
  • -vn: disable video recording.
  • -sn: disable subtitle recording.

2.7 frames

  • -dframes number: set the number of data frames to record
  • -vframes number: set the number of video frames to record
  • -aframes number: set the number of audio frames to record

2.8 preset files

  • -vpre
  • -apre
  • -spre
  • -fpre

3 ffmpeg 用法示例(see http://www.catswhocode.com/blog/19-ffmpeg-commands-for-all-needs for more examples)

  • Basic Usage: ffmpeg [input options] -i [input file] [output options] [output file]
  • Normally the minimum one should specify in an ffmpeg command line would be something like: ffmpeg -i INFILE -acodec ACODEC -ab 96k -vcodec VCODEC -b 500k OUTFILE …replacing the capitalised values as appropriate. When using x264, we need to add some extra bits as the defaults are bad.
  • Getting infos from a video file: ffmpeg -i video.avi
  • Turn X images to a video sequence: ffmpeg -f image2 -i image%d.jpg video.mpg
  • Turn a video to X images: ffmpeg -i video.mpg image%d.jpg
  • Extracting sound from a video, and save it as Mp3: ffmpeg -i source_video.avi -vn -ar 44100 -ac 2 -ab 192 -f mp3 sound.mp3
  • Convert .avi video to .mpg: ffmpeg -i video_origine.avi video_finale.mpg
  • Convert .avi to animated gif(uncompressed): ffmpeg -i video_origine.avi -pix_fmt rgb24 gif_anime.gif
  • Mix a video with a sound file: ffmpeg -i son.wav -i video_origine.avi video_finale.mpg
  • Compress .avi to VCD mpeg2 NTSC format: ffmpeg -i video_origine.avi -target ntsc-vcd video_finale.mpg
  • Multi-pass encoding with ffmpeg: ffmpeg -i fichierentree -pass 2 -passlogfile ffmpeg2pass fichiersortie-2
  • Crop top 30 pixels and bottom 30 pixels to get a new video file: ffmpeg -i input_file.flv -croptop 30 -cropbottom 30 -target ntsc-dvd -aspect 16:9 output_file.mpg
  • Delaying the audio or the video: ffmpeg -i input1 -itsoffset 00:00:03.5 -i input2 ………..

4 ffmpeg learning resources

5 Related tools

5.1 transcode

5.2 mencode(from mplayer)

6 yamdi给视频增加关键帧

  • Yet Another MetaData Injector, see http://yamdi.sourceforge.net/
  • options:
    • -i: 输入文件
    • -o: 输出文件
    • -x: An XML file with the resulting metadata information.
    • -l: Adds the onLastSecond event(?).
  • other tools:
    • flvtool2: written by Ruby, slow, need more memory
    • flvmdi: not open source

7 ffmpegthumbnailer截取视频的thumbnail

  • ubuntu: sudo apt-get install ffmpegthumbnailer
  • options:
    • -i<s>: input file
    • -o<s>: output file
    • -s<n>: thumbnail size (default: 128)
    • -q<n>: image quality (0 = bad, 10 = best) (default: 8) (only for jpeg)
    • -c<s>: override image format (jpeg or png) (default: determined by filename)
    • -t<n|s>: time to seek to (percentage or absolute time hh:mm:ss) (default: 10%)
    • -a: ignore aspect ratio and generate square thumbnail
    • -f: create a movie strip overlay

8 Youku的一些探索

  • Youku网站上的大部分视频都是分段的,一般每段视频在5-10分钟之内
  • 目前Youku网上的视频格式大概有三种:
    • 高清mp4格式(h264编码)
    • 高清flv格式(h264编码)
    • 普通flv格式(应该是h263编码)

Author: Lox Freeman <xiaohanyu1988@gmail.com>

HTML generated by org-mode 6.21b in emacs 23




Host by is-Programmer.com | Power by Chito 1.3.3 beta | © 2007 LinuxGem | Design by Matthew "Agent Spork" McGee