Linux - 行者无疆 始于足下 - 行走,思考,在路上
打造高效的工作环境(番外篇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
3 虚拟机
- What:虚拟机大概是最常用也最方便的方式了吧,虽然虚拟机本身的水非常深。我第一次接触虚拟机的概念还是在大一上,那个时候自己还在熟悉怎样更好更快地安装Windows操作系统,Virtual PC自然而然就成了我的好伙伴,而我也为能在Virtual PC下顺利安装一个MS DOS 7.1感到欣喜不已。后来接触到了VMware,它有两个显著的特性,一大特性是强,另一大特性就是卡。VirtualBox是我的最爱,轻量快速,乃居家旅行杀人越货必备良品。
-
How:准备10G硬盘空间就OK。
-
VirtualBox有一些非常给力的特性:
- 支持和宿主机单向共享文件
- 安装VirtualBox Addtions后支持全屏
- 折腾好的话可以支持USB接口
- 再NB一点的话甚至可以启动真实磁盘上的系统,impossible is nothing。
-
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本身的安装还是要非一番周折的。幸运的是,万能的社区提供了两个打包好的一键安装方案,那就是andLinux和Topologilinux。我只用过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。
--
打造高效的工作环境(2): 高效的文件管理
Table of Contents
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
-
Windows 7下的C盘:
- 合理的文件结构组织和文件命名,对于自动脚本处理是非常重要的,譬如,如果一个文件名称为"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你想得到想不到的很多东西:
- 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 的故事(修订版),徐宥写的这一系列文章水平很高,趣味盎然,强烈推荐。
打造高效的工作环境(1):Why Windows Sucks
Table of Contents
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。且不说各种软硬回车,最简单的一个列表,回车之后默认又是一个列表项,但是如果我想新开段落呢?很多人就不知道怎么办了,于是就各种暴力手段地搞排版,排出来的东西,可想而知。我只能说,这种自作聪明,有时候不是真的聪明,是蛮横的自作主张,是对用户意志赤裸裸的强奸啊。
个人吐槽到此结束,详情请进一步参考:
- http://www.antiwindowscatalog.com/
- https://sites.google.com/site/imterry/computer/windowssucks
- http://en.windows7sins.org/
- Google: "Why Windows Sucks"
- Google: "Anti Windows"
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
敬请期待!
–
x86-64 Arch Linux on ThinkPad x220i
去年换x201i的时候,曾经折腾出一篇《x86-64 Arch Linux on ThinkPad x201i》,后来x201i陪我度过了毕业半年最为艰难的岁月,表现可圈可点,配合我自己调制的ArchLinux,系统非产高效,让我在4个月的时间内搞定了8门课程、毕业设计,还看了不下二十部电影和纪录片。
说起操作系统重装,我也算究竟沙场了。基本上每半年会重装一次操作系统,从XP,Vista,RedHat 9.0,Fedora,到Ubuntu 8.x,转向ArchLinux、Gentoo,甚至在华数淘宝实习的时候还装了4台PC和2台Dell的PC Server。最长的一次要属第一次接触Gentoo的那次,装操作系统装了有2个星期,折腾了两个月,终于发现这个东西不符合低碳节能的基本要求,再一次不小心的fsck误操作中彻底结束了Gentoo之旅,回到了Ubuntu和Arch的怀抱。
来到百度第一天领到的新笔记本,x220i,好家伙,上网一搜,居然是今年最新款的X系列ThinkPad。CPU是新一代的SNB架构。默认系统的十年前的XP。本来我想另辟空间再装个Linux来个双系统,后来XP实在用着不爽,遂全盘格式化,全部分给ArchLinux。
我一直有一个疑问:为什么Windows的命令行,无论是CMD还是PowerShell,不能实现最简单的窗口最大化功能?
OS版本用的是Arch Linux 2010.05,在mirrors.sohu.com上下载支持 32 位及 64 位架构的 Dual 映像,用UltraISO刻录硬盘镜像到U盘上。本以为ArchLinux的安装会像以前一样轻车熟路,不曾想这次却遇到了以前从来没有遇到的一个大麻烦:网卡无法识别!!!
不能上网就意味着不能装X,不能装X就意味着没有Firefox,没有Firefox就意味我不能上网来写这篇博客。无奈之下,去同事的机器上下载了最新的Linux Mint 11,痛快装好,网卡这次能用了。
Google搜索,发现Arch Linux 2010.05是2.6.32的内核,而Linux Mint 11是2.6.38的内核,因此我怀疑是不是ArchLinux内核比较老而x220i架构比较新的原因。搜索的过程中发现了一个叫做ArchBoot的项目,说白了就是半官方的ArchLinux滚动更新ISO。热切的下载了最新的ArchBoot刻录安装,但是不幸的是这个ArchBoot在我的笔记本上根本无法启动。
怎么办?要不重新叫IT部门的人重装下XP?还是先用一段时间的Mint,等下一个ArchLinux的官方安装版?
但我终究是忍不住的。电脑之于黑客,相当于宝剑之于剑客。没有顺手的系统,自然没有高效的工作和良好的心情。
于是不得不换一种思路:尝试手动去下载Intel网卡的驱动,然后编译安装,搞定网卡驱动后再联网升级到新的内核。事实证明这个策略是奏效的,所需要的网卡驱动程序可以在Intel的网站上下载。安装过程不再赘述,按照安装包里的说明即可。装好驱动后升级内核,装X,装KDE,简单配置下字体,一切顺理成章,不亦乐乎。
最后的两个问题依然是驱动相关。一个是显卡的问题,这个可以通过更新内核来搞定。一个是thinkpad风扇的问题,x201i上的方案迁移到x220i上并不奏效,tpfand基本不可用。好在有thinkfan,通过yaourt安装下。设置主要参考这里,但是原文中所设置的:
sensor /proc/acpi/ibm/thermal (0, 3, 3, 2, 10, 0, 10, 0, 2, 2)
并不存在。在x220i上的/etc/thinkfan.conf设置为:
# I use this on my T61p: #sensor /proc/acpi/ibm/thermal (0, 10, 15, 2, 10, 5, 0, 3, 0, 3) # (0, 0, 55) # (1, 48, 60) # (2, 50, 61) # (3, 52, 63) # (4, 56, 65) # (5, 59, 66) # (7, 63, 32767) sensor /sys/class/hwmon/hwmon0/temp1_input (0, 3, 3, 2, 10, 0, 10, 0, 2, 2) (0, 0, 45) (1, 45, 48) (2, 48, 55) (3, 55, 58) (4, 58, 60) (5, 60, 63) (6, 63, 65) (7, 65, 32767)
经过此番修整,x220i终于被我调教的舒舒服服,服服贴贴。至于旧爱x201i,简单修整了一下给妞用了。
最后许个愿望吧:希望在未来可见的三年内不要再折腾操作系统了。同时遥祝远在Singapore的阿黎早日搞定MacBook上的Ubuntu,整好MitSIM,顺利毕业。嘿。
万方学位论文pdf合并脚本v0.1
古人云:天下文章一大抄。整个三月,浙江大学CS开题报告热火朝天,其中各种纠结与不解、各种困惑与混乱、各种word/tex模版纷争,不再详述。23号提交论文,但时至此刻,我刚刚Google Translate了一片水文搞定了外文翻译,修改了学院bug百出的latex模版,搞定了开题报告的格式,至于剩下的3500字,尚无着落,痛苦不堪,心慌也。
废话少说,今天晚上去万方数据库校内镜像下载学位论文,岂知万方这个财主极其抠门猥琐,不但很多有价值的学术论文无法下载,可以下载的论文也是一个zip压缩包,然后里面几十到上百个pdf不等……看一篇完整的学位论文要打开几十个pdf,莫说是我,就是我的x201i,也该累死了……
一个典型的万方学位论文zip压缩包目录结构如下:
lox >>> tree IPTV机顶盒GUI子系统的研究与实现 IPTV机顶盒GUI子系统的研究与实现 ├── default.htm ├── Images │ ├── ball.gif lox >>> tree -L 3 -p -N | grep '\[d' └── [drwxrwxr-x] wanfang ├── [drwxrwxr-x] IPTV机顶盒GUI子系统的研究与实现 │ ├── [drwxrwxr-x] Images │ └── [drwxrwxr-x] Paper ├── [drwxrwxr-x] Tools设计与实现 │ ├── [drwxrwxr-x] Images │ ├── [drwxrwxr-x] Paper ├── [drwxrwxr-x] 基于QtEmbedded的图形用户界面移植 │ ├── [drwxrwxr-x] Images │ ├── [drwxrwxr-x] Paper ├── [drwxrwxr-x] 基于嵌入式Linux智能手机GUI平台的研究与实现 │ ├── [drwxrwxr-x] Images │ ├── [drwxrwxr-x] Paper ├── [drwxrwxr-x] 基于消息通信机制嵌入式GUI的研究与实现 │ ├── [drwxrwxr-x] Images │ ├── [drwxrwxr-x] Paper ├── [drwxrwxr-x] 嵌入式Linux图形用户界面的研究与开发 │ ├── [drwxrwxr-x] Images │ ├── [drwxrwxr-x] Paper ├── [drwxrwxr-x] 嵌入式uGUI的研究与实现 │ ├── [drwxrwxr-x] Images │ ├── [drwxrwxr-x] Paper ├── [drwxrwxr-x] 嵌入式系统轻量化GUI框架的设计与实现 │ ├── [drwxrwxr-x] Images │ ├── [drwxrwxr-x] Paper └── [drwxrwxr-x] 面向数字家电产品的GUI框架的设计与实现 ├── [drwxrwxr-x] Images ├── [drwxrwxr-x] Paper │ ├── bg.gif │ ├── folder.gif │ ├── H.gif │ ├── I.gif │ ├── L.gif │ ├── nfolder.gif │ ├── ofolder.gif lox >>> tree IPTV机顶盒GUI子系统的研究与实现 IPTV机顶盒GUI子系统的研究与实现 ├── default.htm ├── Images │ ├── ball.gif │ ├── bg.gif │ ├── folder.gif │ ├── H.gif │ ├── I.gif │ ├── L.gif │ ├── nfolder.gif │ ├── ofolder.gif │ └── T.gif └── Paper └── pdf ├── d0447950001.pdf ├── d0447950002.pdf ├── d0447950003.pdf ├── d0447950004.pdf ├── d0447950005.pdf ├── d0447950006.pdf ├── d0447950007.pdf ├── d0447950008.pdf ├── d0447950009.pdf ├── d044795wz.pdf ├── d044795zye.pdf ├── fm.htm ├── index.htm ├── iptv.pdf ├── left.htm ├── ml.htm └── single_merged_pdf.pdf 3 directories, 28 files
所有的pdf文档在./Paper/pdf目录下,并且必有一个xxxxwz.pdf和一个xxxxzye.pdf文件,剩下的pdf文件基本上内容顺序和编号顺序一致,但是不排除有页码重叠的状况。
想到的办法就是找CLI工具,将这些pdf合并成一份完整的论文。Archlinux下:pacman -Ss pdf,结合Google,得到几个相关的pdf工具:
- pdfedit
- ghostscript
- pdftk
- poppler
pdfedit是图形化的pdf edit(编辑)工具,显然不符合CLI自动化处理的要求。而且看界面是基于QT3.x的,编辑功能应该是很强大的。具体可以看pdfedit的Screenshots。不过这与本文无关了。
ghostscript is an interpreter for the PostScript language。linuxtoy给出了一种合并pdf方法,我尝试了一下,但是万方本身的pdf是加密的,直接转换会出现莫名其妙的错误,所以这种方法最终失败。
pdftk是一个十分强大的pdf工具,按照官方的说法,pdftk可以用来:
- Merge PDF Documents
- Split PDF Pages into a New Document
- Rotate PDF Pages or Documents
- Decrypt Input as Necessary (Password Required)
- Encrypt Output as Desired
- Fill PDF Forms with FDF Data or XFDF Data and/or Flatten Forms
- Apply a Background Watermark or a Foreground Stamp
- Report on PDF Metrics such as Metadata, Bookmarks, and Page Labels
- Update PDF Metadata
- Attach Files to PDF Pages or the PDF Document
- Unpack PDF Attachments
- Burst a PDF Document into Single Pages
- Uncompress and Re-Compress Page Streams
- Repair Corrupted PDF (Where Possible)
可以用pdftk 1.pdf 2.pdf 3.pdf cat output 123.pdf的方式来合并pdf,但是由于万方pdf的特殊加密,用pdftk合并时,会出现"OWNER PASSWORD REQUIRED"的失败提示。所以成功合并pdf的最关键问题就是去掉万方pdf加密。
幸运的是,我在townx找到了解决方法,感谢万能的Google。剩下的任务,就是Shell Script的天地了。
至于Shell Script,已经好久没有摆弄,很多写法已经生疏,好在半年前在华数淘宝写的脚本还在,打开浏览了下,照葫芦画瓢,倒也没有遇到太大困难。完整的脚本如下:
#!/usr/bin/env bash ################################################################################ # Purpose: Merge pdf file downloaded from Wanfang dissertation database # (http://g.wanfangdata.com.cn/) # Author: Xiao Hanyu(xiaohanyu1988@gmail.com) # Depends: # pdftk: merge multiple pdf files, pdftk is also a useful pdf # manipulation tools # ps2pdf/pdftops: pdf --> ps then ps --> pdf to remove encryption ################################################################################ function usage { cat << EOF `basename $0`: A utility to merge encryted pdf files into one single pdf Usage: `basename $0` [Options] Example: `basename $0` -f "file1.pdf file2.pdf" -o merged.pdf `basename $0` -d input_pdf_dir -o merged.pdf `basename $0` -d input_pdf_dir Options: -f: set the input pdf file list -d: set the input pdf directory -o: set the output pdf filename -h: show this help EOF } function merge_pdfs { echo "######## Convert begin!! ########" for pdf in $pdf_list do ## do not use pdf_name = `basename $pdf .pdf` ## since basename will remove the directory prefix of $pdf pdf_name=`echo $pdf | sed -e "s/\.pdf//"` ## add some animation ^_^ echo -n "$pdf_name.pdf ---->> $pdf_name.ps " pdftops $pdf_name.pdf $pdf_name.ps echo "---->> $pdf_name.pdf" ps2pdf $pdf_name.ps $pdf_name.pdf rm -rf $pdf_name.ps done echo "######## Convert end!! ########" echo "######## Merge begin!! ########" pdftk $pdf_list cat output $pdf_merge echo "######## Merge success, open $pdf_merge to see the result. Bye!! ########" } while getopts "d:f:o:h" arg do case $arg in d) pdf_dir=$OPTARG pdf_list=`ls $pdf_dir/*pdf` ;; f) pdf_list=$OPTARG ;; o) pdf_merge=$OPTARG ;; h) usage exit 0 ;; ?) echo "!!Wrong command options" usage exit 1 ;; esac done # if pdf_dir is not set yet, then it's set to default(that is, current directory) pdf_dir=${pdf_dir:-"."} # set default output pdf filename, plus $pdf_dir prefix pdf_merge="${pdf_dir}/${pdf_merge:-"single_merged_pdf.pdf"}" merge_pdfs
脚本结构还是很简单的:
- 参数解析采用bash内置的getopts,暂时只支持短选项;
- 有一个帮助说明函数function usage{};
- 关键函数是function merge_pdfs{},尤其需要注意目录名和文件名的处理;
调用方法如function usage{}里面所示:
- ./wanfang_pdf_merge.sh -d pdf_dir
- ./wanfang_pdf_merge.sh -d . -o merged_pdf.pdf
- ./wanfang_pdf_merge.sh -f "dir1/pdf1.pdf dir2/pdf2.pdf" -o output/merged_pdf.pdf
测试:
在这个基础脚本上进一步封装下,比如,对于如下的目录结构:
lox >>> tree -L 3 -p -N | grep '\[d' └── [drwxrwxr-x] wanfang ├── [drwxrwxr-x] IPTV机顶盒GUI子系统的研究与实现 │ ├── [drwxrwxr-x] Images │ └── [drwxrwxr-x] Paper ├── [drwxrwxr-x] Tools设计与实现 │ ├── [drwxrwxr-x] Images │ ├── [drwxrwxr-x] Paper ├── [drwxrwxr-x] 基于QtEmbedded的图形用户界面移植 │ ├── [drwxrwxr-x] Images │ ├── [drwxrwxr-x] Paper ├── [drwxrwxr-x] 基于嵌入式Linux智能手机GUI平台的研究与实现 │ ├── [drwxrwxr-x] Images │ ├── [drwxrwxr-x] Paper ├── [drwxrwxr-x] 基于消息通信机制嵌入式GUI的研究与实现 │ ├── [drwxrwxr-x] Images │ ├── [drwxrwxr-x] Paper ├── [drwxrwxr-x] 嵌入式Linux图形用户界面的研究与开发 │ ├── [drwxrwxr-x] Images │ ├── [drwxrwxr-x] Paper ├── [drwxrwxr-x] 嵌入式uGUI的研究与实现 │ ├── [drwxrwxr-x] Images │ ├── [drwxrwxr-x] Paper ├── [drwxrwxr-x] 嵌入式系统轻量化GUI框架的设计与实现 │ ├── [drwxrwxr-x] Images │ ├── [drwxrwxr-x] Paper └── [drwxrwxr-x] 面向数字家电产品的GUI框架的设计与实现 ├── [drwxrwxr-x] Images ├── [drwxrwxr-x] Paper
我们的封装脚本命令如下:
for pdf_dir in `tree wanfang -ipNf | grep '\[d' | grep 'pdf' | awk '{print $2}'` do ~/tools/wanfang_pdf_merge.sh -d $pdf_dir done
接下来喝咖啡!!!
咖啡喝完后,我们来看一下结果:
lox >>> tree -ipNf | grep 'single' [-rw-rw-r--] ./wanfang/IPTV机顶盒GUI子系统的研究与实现/Paper/pdf/single_merged_pdf.pdf [-rw-rw-r--] ./wanfang/Tools设计与实现/Paper/pdf/single_merged_pdf.pdf [-rw-rw-r--] ./wanfang/Tools设计与实现/Paper/pdf/single_merged_pdf.ps [-rw-rw-r--] ./wanfang/基于QtEmbedded的图形用户界面移植/Paper/pdf/single_merged_pdf.pdf [-rw-rw-r--] ./wanfang/基于嵌入式Linux智能手机GUI平台的研究与实现/Paper/pdf/single_merged_pdf.pdf [-rw-rw-r--] ./wanfang/基于消息通信机制嵌入式GUI的研究与实现/Paper/pdf/single_merged_pdf.pdf [-rw-rw-r--] ./wanfang/嵌入式Linux图形用户界面的研究与开发/Paper/pdf/single_merged_pdf.pdf [-rw-rw-r--] ./wanfang/嵌入式uGUI的研究与实现/Paper/pdf/single_merged_pdf.pdf [-rw-rw-r--] ./wanfang/嵌入式系统轻量化GUI框架的设计与实现/Paper/pdf/single_merged_pdf.pdf [-rw-rw-r--] ./wanfang/面向数字家电产品的GUI框架的设计与实现/Paper/pdf/single_merged_pdf.pdf
大功告成!!!
接下来的任务是:
写论文!!!!!!!!!!