Google Code Jam 2009 (Qualification)

书接上篇

1. [84%/84%] Alien Language:给定pattern,求辞典中满足pattern的词的个数。

这道题,题目吓一跳,以为是和practise一样的,结果是另外一道。

内容再次吓一跳,perl代码简单到爆。直接把'(‘、’)’换成'[‘、’]’,当作字符类编译成正则,然后挨个匹配计数就行了。

2. [88%/86%] Watersheds:给定地图和高度,求有几个水凼凼。

这道题遍历每个cell,判断水流,由链表确定等价类,最后从小到大标号既可。

3. [88%/56%] Welcome to Code Jam:给定目标,求子串。

这道题一看,大量操作单个字符,选c会比perl有优势,所以用c。

简单的动态规划即可,有大量重复子问题。当前text中包含target的数量,等于当前text中,所有的target[0]其后的子串,所包含的target[1~end]的数量之和。

由于结果只需要4位,所以用int表示结果已经足够,计数的时候,超过9999,则减去10000。

可惜这道题的大数据集,我还是超时了,因为小数据集我time了一下,只用了0.001s,所以偷懒了一下,没有加缓存,准备直接用机器硬抗大数据集,等了近5分钟,居然还没算出结果,这时再更改程序加缓存、编译、上传就来不及了。

加入4行代码的缓存之后,大数据集time结果如下:

real    0m0.031s
user   0m0.028s
sys    0m0.000s

不到0.1s,很难想像加入缓存会有如此大的区别,真是遇鬼了。

GCJ 2009 Qualification Solution Download

Google Code Jam 2009 (Practise)

去年做了做Google Code Jam的入围题,挺好玩的。今年早早的就收到了邮件,并且还附上了四道练习题。

1. [74%/80%] Alien Number:给定源语言以及目标语言,要求翻译一个数字。

这题按最自然的思路就行了。为方便起见,把源数字先转换成十进制,然后再用和十进制转二进制相同的辗转相除法,求得目标数字的表示。

2. [80%/84%] Always Turn Left:给定总是左转的规则及实际路线,要求实际的迷宫。

如果你身陷迷宫,“总是左转”的规则,或者说“手不离墙,摸着墙走”的规则,兴许能救你一命。

其实,这道题中,我们能得到的所有讯息,都在来回走的路径里面。所以只要跟着路径实际来回走一遍,并沿路,总结迷宫信息,最后得到的便是整个迷宫。

对于左右转及方向的表示,一堆if-else,时空都坏;归纳到一个表里面查表,空间效率也不高;其实就四个方向,如果NESW分别表示为0123的话,简单的加减取模,就能实现左右转了。至于walk through的坐标处理,选择一个简单的闭包最为理想。

另外,在处理路径的时候,维护一个x、y坐标的最大、最小值,以便于最后输出迷宫。

在输出迷宫的时候,不用先存储那张转换表,而直接把YES当成1,NO当成0,作为4位的二进制数,再表示为16进制,刚好就是那张表。

==== 从题目前括号里表示的人们的成功率上来看,前两题比较简单,后两题比较困难 ====

3. [68%/49%] Egg Drop:给定某个可解扔蛋问题的三个参量,在保持可解的情况下,求每个参量的极大值或极小值

这道题有很自然的思路,那便是Fmax的递推式:

设想现在在第 i 层扔蛋,那么第 i 层扔了,就能确定状态,因此本身算一层 ( 1 );
如果蛋没碎,往上验,最多还能验F( D – 1, B )层[ 因为第 i 层扔了一次,D减1;蛋没碎,B不变 ];
如果蛋碎了,往下验,最多还能验F( D – 1, B – 1 )层[ 因为第 i 层扔了一次,D减1;蛋碎了,B也减1 ]。

由于每次验证,蛋只能处于碎或不碎状态中的一种,所以二者并不互相影响。故:

F(D, B) = 1 + F( D – 1, B ) + F( D – 1, B – 1 )

接下来如何计算这个递推式,是个问题。如果这个问题解决了,那么要找到最小的D和B,直接查表既可。

容易看出,递推式中有大量重复的子问题,动态规划应该效果不错。不过,我们还是先来看看数据膨胀速度如何:

[B]
1 3 7 15
1 3 7 14
1 3 6 10
1 2 3 4   [D]

左上部分不用计算,就是对角线上的数字,因为能打碎的数量,如果超过总的实验次数,多出来的这部分就没意义了。故:

F( D, B ) = F( D, D ) if( B > D )

直接观察对角线上的数字,容易看出,对角线上的数字为 2^D – 1。

即使没有看出来,也可以推出来。只用由F(D, B)的递推式和上面B>D的性质,得出递推式 A(n)=2A(n-1)+1,并求解既可。

由此可见,这张表的数字膨胀速度相当快(2^n)。因此,我们得充分利用一个很不起眼的条件,那便是F有2^32的大小限制。

B再大,在应用上面B>D的性质后,也不会超过32。整张表的纵向高度就限制得很小了。

但整张表的横向高度依然可以很大,比如F( 2000000000, 1 ),这种情况即使动态规划会很吃苦头。

观察每一列,都是从 D ~ (2 ^ D – 1),之间的每个数的差值,刚好是杨辉三角。

1—————–0
1          1————-1
1          2       1———–2
1        3         3        1——-3
1        4         6        4        1—-4
0Cr4 1Cr4 2Cr4 3Cr4 4Cr4

15 – 1 = 14
14 – 4 = 10
10 – 6 = 4

所以,从D开始往上累加各个组合数,既可得出某一位的值。而这个累加过程,一旦大于2 ^ 32便可退出。

算出了Fmax,Bmin可以直接挨个找,因为表的纵向高度有限。而Dmin,则需要一个简单的折半查找,以应对F( 2000000000, 1 )类似的情况。

4. [64%/31%] Shopping Plan:给定商店、油费和要买的东西,求最低花费

31%的大数据集通过率,可见这道题的时间或者空间复杂度比较高。

这道题乍看之下,容易让人想起Dijkstra算法[王选貌似还谈论过Dijkstra这个人]。但我很难想到简单的一个数,来指征当前选择的优劣。因为要考虑的因素,实在很多,离家的远近、当前购买物的价格、路径、还有买了是否需要立刻回家等等。

另外,最优子结构的寻找,也颇为困难。因为容易理解,买abcd的最佳路径不一定包括买abc的最优路径。

在这种情况下,我们不得不增强条件。我们以a. 从某个商店出发,b. 买完某些商品,c. 并且当前是否需要回家为基准计算最小值。

这里面依然可以看出,有大量的重复子问题,可以动态规划。

我们遍历当前商店里能买到的并且当前需要购买的商品,买之,然后再遍历所有商店作为下一个商店,并且考虑当前买的商品是否需要立刻放回家。如果已经买完了,则立刻回家。

这里有一个想法很诱惑,那便是走过的商店便不需要再走。因为非perishable的商品始终能顺带带走,perishable的商品始终要立刻回家,也不需要第二次光顾来买。所以,如果以空间换时间,在过程中排除掉某些商店,效果应该不错。但再仔细想想就会发现,这里的空间开销很大,即使用bit set,也需要2 ^50。而所换来的时间并不多,因为我们依然得处理这个比特集。

这样实现的一个perl脚本的性能如下:

[小数据集 100 cases] – 工作很好

real  0m0.297s
user 0m0.260s
sys  0m0.040s

[大数据集 20 cases] – 严重超时

real   35m4.110s
user  34m20.661s
sys    0m42.387s

0.297s已经是对perl脚本做性能调校之后的结果,所以不更改算法或者更改编程语言,很难有所提高了。这里我选择了后面一种方式,用纯C实现了一个相同的算法:

由于perl处理文本始终还是方便很多,所以先用preprocess.pl脚本把input文本解析为利于C解析的格式。[这里是每行一个数字,并处理掉商品名称]

然后用纯C的程序读入处理后的文本,并输出,[ $gcc –O3 run.c –lm ]下面是一些性能数据:

[小数据集 100 cases]

real    0m0.223s
user   0m0.220s
sys    0m0.004s

完全没有缓存的版本,已然比perl的要好,接下来为算路费的函数添加缓存:

real    0m0.128s
user   0m0.124s
sys    0m0.004s

再为递归函数添加缓存:

real    0m0.004s
user   0m0.004s
sys    0m0.000s

这里就已经相当理想了,可以预见大数据集性能也不会差。

[大数据集 20 cases]

real    0m16.551s
user   0m16.501s
sys    0m0.048s

16s,算是很完美的性能了。同样的算法,动态脚本和纯C还是没法比啊,呵呵。即使在极限情况,50个商店,15个待购商品的case,也能在0m12.260s内解决。

GCJ 2009 Practise Solution Download

Oh…Twitter

云南真是避暑胜地,闭关一周安安静静看看书,其实也挺不错的。

言归正传,一直以来因为公司提供了很多VPN,所以也没有特别关注翻墙的问题。但今天突然发现博客首页的flash twitter插件没法用了。所以干脆就直接换成javascript的,然后开始翻墙。

翻墙基本原理是拿我这台博客服务器做代理,php不太熟,其间还google了一下“php if statement”:

https://blog.axqd.net/wp-content/themes/emplode/axqd.php?callback=TWTR.Widget.receiveCallback&count=50&since_id=2769255170&clientsource=TWITTERINC_WIDGET

<?php
if( $_GET[ ‘since_id’ ] && preg_match( ‘/^[0-9]+$/’, $_GET[ ‘since_id’ ] ) )
  echo file_get_contents("http://twitter.com/statuses/user_timeline/axqd.json?callback=TWTR.Widget.receiveCallback&count=50&clientsource=TWITTERINC_WIDGET&since_id=".$_GET[ ‘since_id’ ]);
else
  echo file_get_contents("http://twitter.com/statuses/user_timeline/axqd.json?callback=TWTR.Widget.receiveCallback&count=50&clientsource=TWITTERINC_WIDGET");
?>

搞定之后,可以选择自己处理这个json对象。不过既然已经有现成的,为什么不用呢?于是比照博客皮肤,在twitter官方配色了一个JS版本的client。

接下来转换资源地址有点麻烦:

先啃容易的骨头,VPN出去,下载相应的静态资源,比如style sheet,js file,还有几个png、gif啥的,然后修改其中一些资源里面的引用地址,再通通一股脑传到服务器上。

接下来改js文件,可惜的是,这个js文件是混淆过的,也不太知道怎么还原。好在混淆器大多像下面这样,在后面搞得像是符号表似的:

‘||||this|function|return||if|var||||||||||||||||||||||||||||||||||||||twtr|false|div|id|else|true|tweet||user|class|net|http|call|results…’

我试着替换其中某些字符串,在本地多尝试几遍,居然找到一个可用的替换。

当然这种方式也有不太爽的地方,细心的你会发现到twitter.com的链接全都被换成了blog.axqd.net。:P

不过反正放这个插件的目的在于展示,而不在于收集reply,所以也就懒得处理这个问题了,呵呵。

ESXi Update 2…囧rz

ESXi Update 2真的让人郁闷,安装的时候硬盘驱动就有够费事的了。
这下想升Update 3,备份个镜像也麻烦死人。

本来挺好用的Datastore Browser,一传大文件就报’I/O error occurred’。
官网上看到有新版本的VI Client,懒得查release notes,直接升级。
结果VI Updater又有问题,总是croak ‘no update available’。
手动下patch包:http://support.vmware.com/selfsupport/download/
Self Support,网址ZTMD取得好。郁闷的是,升级后,VI Client问题依旧。

网上又说可以开ESXi Server的SSH daemon,结果拜我升级所赐,SSH和FTP也没有了。

算了,还算以前看到一篇文章,提到过ESXi Datastore的Web Access:

https://(ip address)/folder?dcPath=ha-datacenter&dsName=datastore1

于是cygwin + wget解决问题(WGet for Windows居然还不支持带用户名、密码的URL 囧rz…):

wget -m –no-check-certificate https://(username):(passwd)@(ip address)/folder?dcPath=ha-datacenter&dsName=datastore1

最后有点小插曲,就是URL Encode,由于密码里用了’@’,所以不转成%40会有歧义:

SPACE %20 [ %5B
< %3C ] %5D
> %3E ` %60
# %23 ; %3B
% %25 / %2F
{ %7B ? %3F
} %7D : %3A
| %7C @ %40
%5C = %3D
^ %5E & %26
~ %7E $ %24

Beautiful Code

<Beautiful Code>一书不算薄,里面的38位作者,也算得上个顶个的牛。但总的来说,信息量却不太大。

耐着性子看到最后一章:<Writing Programs for “The Book” by Brian Hayes>,却突然有眼前一亮的感觉。

我对Brian这个人不太熟悉,从书后的介绍中得知,Brian是<American Scientist>计算机专栏的作者。比起其他几篇文章,这篇在文字上,明显要自然流畅一些。

Brian在本书中讨论的问题,其实很简单—判断三点共线。

我们人在判断这个问题的时候,自然可以简单的进行目测。当目测不足以区分的时候,可以连接任意两点,接着看另外一点是否在那条直线上。

放到程序里,最自然的思路莫过于,过同一点计算并比较斜率。然而,诚如书中所言,计算斜率的方法有一个边界条件—平行于Y轴的直线斜率不存在。对于这些边界条件,不得不加上条件跳转去处理。更为糟糕的是,如果三个点中,有两个点都是原点,那么这三点肯定是共线的,但这两个原点的斜率,却可以为任意值。

我们注意到,很多边界条件是由坐标系带来的。因此,如果我们选择计算三个点两两之间的距离,并且比较短边长度之和与长边长度。我们可以绕过很多泥沼,代码也因此变得简洁。

然而,这样做依然存在一个固有的问题—有理数的点之间,可以有无理数的距离。这当然是计算距离时,开根号给闹的。无理数距离的问题在于,这种精度问题,并不是由问题的输入带来,而是由中间步骤产生的。

Brian最后给出Jonathan Shewchuk的方案是,计算三点所构成三角形的面积,并与0作比较。

计算面积比起计算边长的优势在于,面积可以通过同顶点两个矢量的叉乘来计算(如下图所示)从而避免了开根号。也由此把精度问题,限制于输入数据的精度。

|x1-x3 y1-y3|
|x2-x3 y2-y3|

最终代码如下(三个点分别为p, q, r):

(defun area-collinear (px py qx qy rx ry)
(= (* (- px rx) (- qy ry)) (* (- qx rx) (- py ry))))

这个例子虽然极其简单,但把它稍稍一般化,就能反映出很多问题:

大部分情况下,我们会写出类似于计算斜率的直觉算法。更糟糕的是,我们甚至可能漏掉斜率不存在,或者斜率为任意值的边界。
DEV CC之后,QA一测,发现了斜率不存在的问题,于是代码里加上一句if条件分支,注释上bug号。
Beta之后,用户complain如此明显的,原点斜率不存在的bug,大家开会聒噪一番,DEV和QA相互指责一番,于是乎又多了一句if。
ZB之后,大家怀着忐忑的心情RTM,指望CRT不要过来抱怨,用户报了一堆bug,又得加班。

于是在质量保障指引下,代码距离美丽的标准渐行渐远。直到某一天,performance真正成了问题。

牛人大笔一挥,升级算法为计算边长,更新产品名称为XXX 2009(Engine Updated)。
不久,挑剔而又无聊的客户开始抱怨精度问题,大家讨论一番,牛人决定By Design回去,并且在Readme里面的Known Issues里加上一句说明。
当时间沉淀了计算边长的代码,这段代码也就成了不朽的丰碑和牛人津津乐道的谈资。

这时候,偏有不喑世事的小屁孩说,为什么我们不计算面积呢?
牛人说,我呸…哪凉快哪待着去…

牛人就是牛人,小屁孩暂时还不明白一个道理。如果你写了计算面积的代码,你就作出了一个假定—人们都知道用叉乘来计算面积。
小屁孩以为自己的长篇注释,能够把问题说清楚。然而,忙碌的人们谁会想听你一个小屁孩的教导。
这时候,小屁孩不得不感叹思科电话设计的完美,即使你把听筒拿起来,依然能有人打爆小屁孩的电话,要他亲自,一遍又一遍的解释。

世界的完美,往往就体现在对于完美的求不得与不可求。

Hotkey Power

一直想找到一个合适的Embeded Language,只因为厌恶tcl的语法…

这个Hotkey程序整合了几个我喜欢的脚本,并用AutoHotKey生成exe,可以直接运行。

傻瓜步骤:

1. 下载并双击运行 – 会生成一个Config.ini配置文件
2. 右键点tray icon,然后点Help看看帮助
3. 更改Config.ini文件,然后重新双击运行,加载配置

源码清单:
http://github.com/axqd/HotKeyCombination

视频教程:
https://blog.axqd.net/2009/10/17/camtasia-studio-6/

What The C*nt…

其他方面不知道,但UI让我只晃了一眼,就求饶不想再看另一眼的,恐怕也非Windows 2k8 Server Core Edition莫属了。

乍看之下,像是中毒之后,explorer被cmd换掉的产物。

唉,工作了就是惨。见过烂的,没见过这么烂的…

一道面试题

最近帮某公司出了一道面试题,由于面试官技术参差不齐。所以,题目要求:上手容易(不然冷场了,面试官不易处理),还有就是不怎么暴露面试官的无知。

题目内容比较open,没有标准答案,只是要求用伪码实现简化版的windows计算器标准模式,相信大家上手应该都不成问题。

然而实际效果,这道题目区分度还是蛮大的。正是因为按键少,上手就写程序,很容易就成为意大利面条式的代码。甚至有人电话面试的时候,没到5分钟,就直接压了电话。

按键设定为只有以下18个:
0 1 2 3 4 5 6 7 8 9 . + – * / = C +/-

由于对一切乱七八遭的输入,都要能够接受,不做异常处理,我们有下面一些约定:
1. 忽略前置0: 000000 => 0;
2. 忽略多个.:1…..23 => 1.23;
3. 多个操作符(包括=)取最后一个(这与windows的版本有细微出入):*/2 => /2;

最后,是一些考量:
1. 有限状态机在这里是比较自然的思路;
2. 初始计算前加入0+的计算,可以与后面的情况合并处理;
3. Clear和+/-可以不进入状态机处理,而提前解决掉;
4. 一般都能把数字”0~9″和”.”、”+-*/”和”=”统一处理;但问题在于,用了大量的if来别扭的处理”=”,其实”=”之所以别扭,就是因为他和”+-*/”最大的不同,在于它是unary operator,而其他的是binary operator。如果考虑到这里,那么对于后续问题。例如,如何加入对于sin/cos/开根号等的支持,也能作出较好的回答;
5. 还有一个小陷阱,除0的考虑;

总之,简单的一道题目,但在面试的特殊环境下,能够较好的区分出应聘者的设计水平。

为了更好的在面试的时候说明题目,我用flex实现了一个界面(因为只起演示作用,所以有个已知的bug就是超长的输入数字,或者回显的超长数字结果,会使程序的显示产生未定义行为)[Updated: 加了个限长为10,现在可以忽略这句话了]。

附件里有代码和状态转换图,有兴趣的可以下来看看。有更好的考量,还望多多指教。

http://www.axqd.net/calculator/

Google Code Jam 2008

邮件提示通知,先前注册的Google Code Jam开始了,于是登进去做做题。
Qualification Round总共三题。大致看了一下,最后一题—‘苍蝇拍’,没啥自然的思路,感觉算起来比较麻烦,于是就选了其他两题。这两题倒都还有比较明显的思路。

其实,从Google Code Jam设置的方式来看,Qualification Round的题都不难,但通过大、小输入数据集来考察程序员对于各个边界条件的处理。

第一题,’拯救宇宙’;
由于’Queries must be processed in the order they’re received.’,所以简单的标记,然后找大块就可以算出转换次数,如果需要,也可以得出其中一个可行的转换路径。时间复杂度O(N)。

需要注意的地方是:
1. Base case查询个数可能为0;

我在第一次试验Small Input的时候Fail掉,是由于忘了清空标记的时候,把缓存的标记计数也一并清0。
改正后,Small/Large Input结果均正确。

郁闷的是,这题Large Input在上传结果的时候,不知是Firefox缓存还是Google Code Jam系统的问题,Large Output依然为前一次上传的Small Output的文件。以后大家一定要注意检查一下上传结果。

第二题,’火车时刻表’;
A、B两边分别按时间排序后,各自顺序统计一遍,也很简单,时间复杂度依然为O(N)。

需要注意的地方是:
1. 如何组织录入数据。我采用的是以时间为key的两个哈希表。
2. 时间可能重叠。这是比较明显的一个问题。重叠的时间在key上通过+1、-1来相互抵消。这样在录入数据的时候,就把重叠时间的问题解决了。
3. 时间超过24小时的问题也很明显。但由于’All arrivals and departures occur on the same day.’,所以反而让我忽略了这个问题。但其实这个问题依然存在于类似’23:52’ + ’20 mins turn around time’的情况里。我后来加上了对这种情况的ignore的处理。

总之,如果有心情的话,做做Code Jam的题还蛮不错的。

下载Saving The Universe相关文件

下载Train Timetable相关文件

Debian常用命令

查看软件xxx安装内容
dpkg -L xxx

查找软件
apt-cache search 正则表达式

查找文件属于哪个包
dpkg -S filename
apt-file search filename

查询软件xxx依赖哪些包
apt-cache depends xxx

查询软件xxx被哪些包依赖
apt-cache rdepends xxx

增加一个光盘源
apt-cdrom add

系统升级
apt-get update
apt-get upgrade
apt-get dist-upgrade

清除所有删除包的残余配置文件
dpkg -l |grep ^rc|awk ''{print $2}'' |tr ["n"] [" "]|sudo xargs dpkg -P -

编译时缺少h文件的自动处理
auto-apt run ./configure

查看安装软件时下载包的临时存放目录
ls /var/cache/apt/archives

备份当前系统安装的所有包的列表
dpkg --get-selections | grep -v deinstall > ~/somefile

从上面备份的安装包的列表文件恢复所有包
dpkg --set-selections < ~/somefile dselect

清理旧版本的软件缓存
apt-get autoclean

清理所有软件缓存
apt-get clean

删除系统不再使用的孤立软件
apt-get autoremove

查看包在服务器上面的地址
apt-get -qq --print-uris install ssh | cut -d'' -f2

查看内核
uname -a

查看Ubuntu版本
cat /etc/issue

查看内核加载的模块
lsmod

查看PCI设备
lspci

查看USB设备
lsusb

查看网卡状态
ethtool eth0

查看CPU信息
cat /proc/cpuinfo

显示当前硬件信息
lshw

查看硬盘的分区
fdisk -l

查看IDE硬盘信息
hdparm -i /dev/hda

查看STAT硬盘信息
hdparm -I /dev/sda

apt-get install blktool
blktool /dev/sda id

查看硬盘剩余空间
df -h
df -H

查看目录占用空间
du -hs 目录名

优盘没法卸载
sync
fuser -km /media/usbdisk

查看当前的内存使用情况
free -m

查看当前有哪些进程
ps -aux

中止一个进程
kill 进程号
或 killall 进程名

强制中止一个进程
kill -9 进程号
或 killall -9 进程名

查看当前进程的实时状况
top

查看进程打开的文件
lsof -p

配置 ADSL
pppoeconf

ADSL手工拨号
pon dsl-provider

激活 ADSL
/etc/ppp/pppoe_on_boot

断开 ADSL
poff

查看拨号日志
plog

根据IP查网卡地址
arping IP地址

查看当前IP地址
ifconfig eth0

查看当前监听80端口的程序
lsof -i :80

查看当前网卡的物理地址
arp -a | awk ''{print $4}''
ifconfig eth0 | head -1 | awk ''{print $5}''

立即让网络支持nat
echo 1 > /proc/sys/net/ipv4/ip_forward
iptables -t nat -I POSTROUTING -j MASQUERADE

查看路由信息
netstat -rn
route -n

手工增加删除一条路由
route add -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1
route del -net 192.168.0.0 netmask 255.255.255.0 gw 172.16.0.1

修改网卡MAC地址的方法
ifconfig eth0 down #关闭网卡
ifconfig eth0 hw ether 00:AA:BB:CC:DD:EE #然后改地址
ifconfig eth0 up #然后启动网卡

统计当前IP连接的个数
netstat -na|grep ESTABLISHED|awk ''{print $5}''|awk -F: ''{print $1}''|sort|uniq -c|sort -r -n
netstat -na|grep SYN|awk ''{print $5}''|awk -F: ''{print $1}''|sort|uniq -c|sort -r -n

统计当前20000个IP包中大于100个IP包的IP地址
tcpdump -tnn -c 20000 -i eth0 | awk -F "." ''{print $1"."$2"."$3"."$4}'' | sort | uniq -c | sort -nr | awk '' $1 > 100 ''

屏蔽IPV6
echo "blacklist ipv6" | tee /etc/modprobe.d/blacklist-ipv6

添加一个服务
update-rc.d 服务名 defaults 99

删除一个服务
update-rc.d 服务名 remove

临时重启一个服务
/etc/init.d/服务名 restart

临时关闭一个服务
/etc/init.d/服务名 stop

临时启动一个服务
/etc/init.d/服务名 start

配置默认Java使用哪个
update-alternatives --config java

修改用户资料
chfn userid

给apt设置代理
export http_proxy=http://xx.xx.xx.xx:xxx

修改系统登录信息
vi /etc/motd

转换文件名由GBK为UTF8
apt-get install convmv
convmv -r -f cp936 -t utf8 --notest --nosmart *

批量转换src目录下的所有文件内容由GBK到UTF8
find src -type d -exec mkdir -p utf8/{} ;
find src -type f -exec iconv -f GBK -t UTF-8 {} -o utf8/{} ;
mv utf8/* src
rm -fr utf8

转换文件内容由GBK到UTF8
iconv -f gbk -t utf8 $i > newfile

转换 mp3 标签编码
apt-get install python-mutagen
find . -iname “*.mp3” -execdir mid3iconv -e GBK {} ;

控制台下显示中文
apt-get install zhcon
使用时,输入zhcon即可

快速查找某个文件
whereis filename
find 目录 -name 文件名

查看文件类型
file filename

显示xxx文件倒数6行的内容
tail -n 6 xxx

让tail不停地读地最新的内容
tail -n 10 -f /var/log/apache2/access.log

查看文件中间的第五行 ( 含 ) 到第 10 行 ( 含 ) 的内容
sed -n ''5,10p'' /var/log/apache2/access.log

查找包含xxx字符串的文件
grep -l -r xxx .

查找关于xxx的命令
apropos xxx
man -k xxx

通过ssh传输文件
scp -rp /path/filename username@remoteIP:/path #将本地文件拷贝到服务器上
scp -rp username@remoteIP:/path/filename /path #将远程文件从服务器下载到本地

查看某个文件被哪些应用程序读写
lsof 文件名

把所有文件的后辍由rm改为rmvb
rename ''s/.rm$/.rmvb/'' *

把所有文件名中的大写改为小写
rename ''tr/A-Z/a-z/'' *

删除特殊文件名的文件,如文件名:--help.txt
rm -- --help.txt 或者 rm ./--help.txt

查看当前目录的子目录
ls -d */. 或 echo */.

将当前目录下最近30天访问过的文件移动到上级back目录
find . -type f -atime -30 -exec mv {} ../back ;

将当前目录下最近2小时到8小时之内的文件显示出来
find . -mmin +120 -mmin -480 -exec more {} ;

删除修改时间在30天之前的所有文件
find . -type f -mtime +30 -mtime -3600 -exec rm {} ;

查找guest用户的以avi或者rm结尾的文件并删除掉
find . -name ''*.avi'' -o -name ''*.rm'' -user ''guest'' -exec rm {} ;

查找的不以java和xml结尾,并7天没有使用的文件删除掉
find . ! -name *.java ! -name ‘*.xml’ -atime +7 -exec rm {} ;

统计当前文件个数
ls /usr/bin|wc -w

统计当前目录个数
ls -l /usr/bin|grep ^d|wc -l

显示当前目录下2006-01-01的文件名
ls -l |grep 2006-01-01 |awk ''{print $8}''

解压缩 xxx.tar.gz
tar -zxvf xxx.tar.gz

解压缩 xxx.tar.bz2
tar -jxvf xxx.tar.bz2

压缩aaa bbb目录为xxx.tar.gz
tar -zcvf xxx.tar.gz aaa bbb

压缩aaa bbb目录为xxx.tar.bz2
tar -jcvf xxx.tar.bz2 aaa bbb

特殊 URI 地址
* computer:/// - 全部挂载的设备和网络
* network:/// - 浏览可用的网络
* burn:/// - 一个刻录 CDs/DVDs 的数据虚拟目录
* smb:/// - 可用的 windows/samba 网络资源
* x-nautilus-desktop:/// - 桌面项目和图标
* file:/// - 本地文件
* trash:/// - 本地回收站目录
* ftp:// - FTP 文件夹
* ssh:// - SSH 文件夹
* fonts:/// - 字体文件夹,可将字体文件拖到此处以完成安装 * themes:/// - 系统主题文件夹

详细显示程序的运行信息
strace -f -F -o outfile

设置日期
date -s mm/dd/yy

设置时间
date -s HH:MM

将时间写入CMOS
hwclock --systohc

读取CMOS时间
hwclock --hctosys

从服务器上同步时间
ntpdate time.nist.gov
ntpdate time.windows.com

从mysql中导出和导入数据
mysqldump 数据库名 > 文件名 #导出数据库mysqladmin create 数据库名 #建立数据库
mysql 数据库名 < 文件名 #导入数据库

忘了mysql的root口令怎么办
/etc/init.d/mysql stop
mysqld_safe --skip-grant-tables &
mysqladmin -u user password ''newpassword''''
mysqladmin flush-privileges

修改mysql的root口令
mysqladmin -uroot -p password ''你的新密码''

下载网站文档
wget -r -p -np -k http://www.21cn.com
· -r:在本机建立服务器端目录结构;
· -p: 下载显示HTML文件的所有图片;
· -np:只下载目标站点指定目录及其子目录的内容;
· -k: 转换非相对链接为相对链接。

如何删除Totem电影播放机的播放历史记录
rm ~/.recently-used