Perl语言的效率及其他
上周偶然与fcicq讨论到一个关于perlcc的优化问题。 据说用perlcc将perl程序编译成C程序后再用gcc -O3进行优化,速度可能会快一些。 于是就测了测,顺便试了试其他语言的情况。
测试程序是Ackermann函数。 也许用它来做benchmark不太合适,但毕竟这是个纯数学+多次递归+耗时的运算,也能反映一定问题吧。
上周偶然与fcicq讨论到一个关于perlcc的优化问题。 据说用perlcc将perl程序编译成C程序后再用gcc -O3进行优化,速度可能会快一些。 于是就测了测,顺便试了试其他语言的情况。
测试程序是Ackermann函数。 也许用它来做benchmark不太合适,但毕竟这是个纯数学+多次递归+耗时的运算,也能反映一定问题吧。
在delicious上看到一篇去年的文章: How to recognise a good programmer。 正好这段时间一直在为面试发愁,看看这篇文章很有帮助。原文篇幅很长,这里就不逐字逐句地翻译了, 只把要点和看过之后的体会写出来,希望能给同样是为寻找程序员而头疼的同仁们提供帮助。
优秀程序的几个必要条件:
要有热情
企业中有这样一种人:职业程序员。他们之所以做IT是因为IT是个好工作,而不是因为对技术充满热情。这些人回家后绝对不会写程序。 对于他们来说,编程是每天必须的工作,公司为他们提供技术培训也是理所应当的。 这种人缺乏热情,也不会是好的程序员。
其实这类人相当相当多,随手一抓就能抓出一大把。他们自己也有电脑,但那是用来上网看电影打游戏的,不是用来搞开发的。 开发环境、编辑器甚至连Office都没有。这样的人也很难期待他是优秀程序员。
会自学,爱自学
大家都知道IT行业更新很快,不会主动学习的人很快就会被淘汰。有些人你要他们学习某项技术时他会说“公司给我培训我就学”。 当然,在找工作时他们有可能在家里学习必要的技术,但那不是主动的自学。好的程序员热爱学习新技术, 对于他们来说学技术纯粹是好玩,纯粹是个人兴趣。有些人还会制定出完善的学习计划。 这样的程序员根本不用培训。
聪明
也许程序员都给人以不善交际的印象,但其实他们不是。好的程序员都是智商奇高的人, 不可能不善交际。而事实上的确在某些场合他们不善言辞,那是因为他们的兴趣不在那里。 一旦讨论到他们感兴趣的技术话题,他们就会扯开话匣子说个不停。
在招聘时可以试着去谈论一些他可能感兴趣的技术话题,看他能侃到什么程度。 如果问一句说一句或者说不出来什么,那就不用再抱希望了。
隐藏的经验
优秀程序员或多或少都有些“课外活动”,如参加开源社区,为处理日常生活的事情而写的小程序, 个人网站,或者纯粹为了好玩而做的小东西。而面试时这些东西是不会写在简历上的, 因为他们觉得这些根本算不上简历要求的“经验”。
我经常看到有些应聘者的简历上把大学时做的小学期作业都写在上面。这种人就不必考虑了—— 连作业都自认为是“经验”的人可以想到他的水平有多高。
所以,优秀程序员的简历通常都很简短,不过你可以去问问他们,除了简历上写的东西之外, 工作之外有无技术经验,即使完全和工作无关也行。如果他答不出,那即使简历有20页长,他也不会是优秀程序员。
广博的技术知识
这一点很简单,学得技术越多水平越高。不一定要完全精通,但了解许多毫不相关的知识对个人水平有很大帮助。 但同样,优秀程序员不会把他知道的东西全都写上,那些他不精通的东西会认为不值得一写。
不过有一点要注意。如果简历上写到“精通Java、J2EE、Ant、XML、SQL、Hibernate、Spring、Struts、EJB”, 就要小心了,这个人不一定优秀。因为这些技术都属同一个领域,关联性太强。 但当你对这些技术一无所知时,如何分辨呢?你可以让他讲讲这些技术有什么联系。 精通一个领域的技术的人经验丰富,但他很可能不是个优秀程序员。
为什么需要有广博的技术知识?我个人认为,即使是毫不相关的技术,其实也是能融会贯通的。 学得技术多了、杂了,看到不懂的问题自然而然地就能想出最合适的解决办法来。
不过有一点要注意,如果他关心的技术中有尖端技术,如今天的AIR、Flex之类, 那你就可以考虑录用他。
另外优秀的程序员对技术很敏感,他能判断出某项技术是否适合于完成工作。 如果被迫使用一种他认为不适合的技术去工作,他会觉得很不爽的。
资格证书
资格证书、学位等不是优秀程序员的必要条件,但至少不是个反面信号。优秀程序员大都有计算机科学的学位。 也有很多人没有,但这并不能说明他不优秀。专业资格认证如MCSE、CCNA等也是, 这些只是用来证明这个人已经学会了相关知识,企业在招聘的时候就可以省去考核的麻烦, 并不能证明程序员有多么优秀。如果你的企业确确实实需要非常优秀的程序员, 那就别去理会这些认证,而是把精力花在实际能力的考察上吧。
如果将优秀程序员的条件按条列出的话,可以得到如下内容:
很短很好用,不过自己老是忘,干脆写下来吧。
当你有一大篇文字,没有换行(或者行宽太宽、太窄),并且段落之间用空行分开, 那么可以使用以下的技巧来重新分行。
:set tw=100 " textwidth,设置文本行宽度
:set fo+=mM " formatoptions,设置自动换行的条件
gggqG
exaile是一个基于GTK+的媒体播放器, 类似于KDE下的Amarok。在gentoo下可以很方便地安装:
# emerge exaile
但试图播放mp3时,会报告这样的错误:
You do not have the appropriate Gstreamer plugin installed to play this file:
google之后才知道,播放mp3需要安装gstreamer的插件 gst-plugins-mad。 你可以用下面的命令查看已经装了哪些插件:
# emerge -s gst-plugins
安装完 exaile 之后,gst-plugins-base、gst-plugins-bad、gst-plugins-good三项 应该是已安装好的。执行下面的命令:
# emerge gst-plugins-mad
装好后重新启动exaile,这样就可以播放mp3了。
gentoo xeffects项目主要是研究如何在gentoo下使用compiz和compiz fusion,xgl的ebuild文件就来自xeffects layout。 但是最近(2008/1/6前后),xeffects项目的开发者声明他们决定中止该项目的开发。(文章末尾引用了他们的官方声明。)
官方网站gentoo-xeffects.org的域名也已经停止使用,在gentoo下通过 layman -a xeffects 会说找不到域名。 不过好在xeffects作者公开了他们的开发成果,你可以通过git下载。
# emerge dev-util/git
$ git clone git://git.overlays.gentoo.org/dev/jmbsvicetto.git
最后附上开发者的官方声明。
lex (nesl247) and I decided we no longer were interested in keep running the gentoo-xeffects server and agreed to not renew its subscription after the end of December. Thus, the gentoo-xeffects overlay is no longer available. I’ve put all the ebuilds in the xeffects overlay under my git dev overlay on http://git.overlays.gentoo.org/gitweb/ where I plan to keep them for at least the next 15 days. If you want to get any of the ebuilds, you can use the gitweb interface to get it or you can clone the overlay with git clone git://git.overlays.gentoo.org/dev/jmbsvicetto.git. I have a local copy of all files that were available under http://distfiles.gentoo-xeffects.org so if someone is interested, drop me a note here, on IRC or through any of my contacts.
So, what’s next? I didn’t wanted to keep the server running because I wasn’t available to keep the financial commitment, but I’m still interested in compiz, compiz-fusion and related packages. As such, I’m starting a new overlay with Ingmar Vanhassel (ingmar/ingmarv) and Wulf C. Krueger (philantrop) that will be named desktop-effects and will also be available from http://git.overlays.gentoo.org/. As indicated by its new name, this overlay will have a different scope and will start with a subset of the xeffects ebuilds. Expect more details to follow in the US forum and or in the #gentoo-xeffects irc channel.
I want to thank everyone that worked on the coffee_buzz / gentoo-xeffects overlay for their hard work. In particular, I want to thank coffee_buzz, nesl247 and roderick. Without you and your work, the rest of us wouldn’t had / be having so much fun with compiz / compiz-quinnstorm / beryl / compcomm / compiz-fusion and friends.
昨天在fcicq的推荐下安装了gentoo。安装过程没什么好说的,按照gentoo手册一步步来, 都挺顺利,但在最后安装grub时出了点问题。
我的机器有两块硬盘,一块是SATA的(/dev/sda), 一块是IDE的(/dev/hdb),gentoo的/boot装在了 /dev/sda8,/装在了/dev/sda10上。 grub使用hd0、hd1等方式来指定硬盘,但同时有SATA和IDE的情况下就很难分辨谁是hd0谁是hd1了。 所以我先启动grub然后通过它的命令行补齐功能,查明hdb -> hd0, sda -> hd1, 于是就按照这个设置写好了grub.conf,并加上了splashimage。
但是重新起动后grub说找不到分区,并且屏幕变花,几乎什么都看不见。 在菜单里按e然后c进入命令行,想通过命令行补齐来启动系统,但由于看不见显示而失败了。
没办法再次使用gentoo安装盘启动系统。猜测可能是由于splashimage找不到导致花屏, 于是编辑grub.conf去掉了splash,重启,这次能看到错误信息了。进入grub的命令行尝试补齐, 发现sda居然是hd0!
这下情况明朗了,通过命令行指定好正确的root和kernel,启动系统后修改grub.conf,重启,成功。
为什么安装时和启动时的硬盘编号不一致?后来看到手册上说,硬盘编号一般是先IDE再SCSI(SATA), 但当BIOS设置从SCSI启动时,SCSI设备会变成hd0。原来如此,安装时由于是从光盘启动, 所以IDE优先于SATA成了hd0;但重启系统后由于从SATA启动,所以SATA就变成了hd0。
最后建议在配置grub.conf时,不要一开始就加上splashimage,应当等全部调试通过之后再添加,避免出现花屏问题影响调试。
最近看了一些Linux命令行的文章,在系统信息查看方面学到不少命令。 想起以前写过的一篇其实Linux这样用更简单, 发现这些系统信息查看命令也可以总结出一篇小小的东西来了。
另外这里还有非常多的命令, 可以作为参考。
# uname -a # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue # 查看操作系统版本
# cat /proc/cpuinfo # 查看CPU信息
# hostname # 查看计算机名
# lspci -tv # 列出所有PCI设备
# lsusb -tv # 列出所有USB设备
# lsmod # 列出加载的内核模块
# env # 查看环境变量
# free -m # 查看内存使用量和交换区使用量
# df -h # 查看各分区使用情况
# du -sh <目录名> # 查看指定目录的大小
# grep MemTotal /proc/meminfo # 查看内存总量
# grep MemFree /proc/meminfo # 查看空闲内存量
# uptime # 查看系统运行时间、用户数、负载
# cat /proc/loadavg # 查看系统负载
# mount | column -t # 查看挂接的分区状态
# fdisk -l # 查看所有分区
# swapon -s # 查看所有交换分区
# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE # 查看启动时IDE设备检测状况
# ifconfig # 查看所有网络接口的属性
# iptables -L # 查看防火墙设置
# route -n # 查看路由表
# netstat -lntp # 查看所有监听端口
# netstat -antp # 查看所有已经建立的连接
# netstat -s # 查看网络统计信息
# ps -ef # 查看所有进程
# top # 实时显示进程状态
# w # 查看活动用户
# id <用户名> # 查看指定用户信息
# last # 查看用户登录日志
# cut -d: -f1 /etc/passwd # 查看系统所有用户
# cut -d: -f1 /etc/group # 查看系统所有组
# crontab -l # 查看当前用户的计划任务
# chkconfig --list # 列出所有系统服务
# chkconfig --list | grep on # 列出所有启动的系统服务
# rpm -qa # 查看所有安装的软件包
刚刚看到一篇好文(原文链接), 对Javascript中的delete操作符分析得很透彻。在这里简单地介绍一下内容。
虽然是一个小小的delete操作符,其行为却异常复杂。
感谢fcicq,他的new 30 days系列为我们带来了不少好文章。
今天想分析的是这篇Bash Pitfalls, 介绍了一些bash编程中的经典错误。fcicq说可能不适合初学者,而我认为, 正是bash编程的初学者才应该好好阅读一下这篇文章。
下面就逐个分析一下这篇文章中提到的错误。不是完全的翻译,有些没用的话就略过了, 有些地方则加了些注释。
最近工作中用到的一些Linux小技巧,比较零散,所以没有分类整理,可能看起来比较麻烦。
查询某个RPM包依赖的包。-qR这么有用的参数rpm --help
里面居然没有写!(仅写了长格式 --requires
)
rpm -qR coreutils
创建RPM包时的两个有用的设置:
# 防止创建带调试信息的RPM包
%define debug_package %{nil}
# 打包之前不要对目标文件做strip(如打包脚本时没必要strip)
%define __os_install_post %{nil}
# 禁止自动搜索依赖关系
Autoreq: no
Autoprov: no
关于sed:sed正则表达式中的 . 符号匹配对象并不是“任意字符”而是“任意可显示的英文字符”, 包括英文字母、数字、特殊符号、空白等,但不包括0-31的控制字符和127以后的特殊字符。 因此在匹配非英文字符时要当心,虽然多语言版能匹配绝大部分的非英文字符,但也有特例。 目前发现 euc-jp 编码下的日文字符大部分都不能被匹配。例如:
$ cat japanese
テスト
test 添付ファイル
$ sed -e 's/.*/__&__/' < japanese
____テスト
__test 添__付ファイル
另一个使用sed的简单脚本,实现类似grep的功能,但它将匹配的行用特殊颜色显示:
# cat mgrep
#!/bin/sh
sed -e "/$1/s/.*/\x1b[0;30;43m&\x1b[m/"
如何将文件比较结果直接输出到vim中(因为vim有语法高亮):
$ diff foo bar | vi -
另外Fenng最近提到的一篇关于防止 rm -rf / 的文章也很有参考价值。