Monday, September 22, 2008

may the source be with you

节选自《算法的力量》 李开复

给程序员的七个建议

(1)练内功。不要只花功夫学习各种流行的编程语言和工具,以及某些公司招聘广告上要求的科目。要把数据结构、算法、数据库、操作系统原理、计算机体系结构、计算机网络,离散数学等基础课程学好。大家不妨试试高德纳所著The Art of Computer Programming里的题目,如果你能够解决其中的大部分题目,就说明你在算法方面有一定的功力了。

(2)多实战。通过编程的实战积累经验、巩固知识。很多中国大学毕业生缺乏编程和调试经验;学习C语言,考试过关就算学会了;课题项目中,只要程序能够编译,运行,并且输入输出满足要求就算了事。这些做法是不行的。写程序的时候,大家必须多想想如何把程序写得更加精炼、高效、高质量。建议大家争取在大学四年中积累编写十万行代码的经验。我们必须明白的是:好程序员是写出来的,不是学出来的。

(3)求实干。不要轻视任何实际工作,比如一些看似简单的编码或测试。要不懈追求对细节一丝不苟的实干作风与敬业精神。我发现不少程序员对于知识的掌握很肤浅,不求甚解,没有好奇心,不会刨根问底。比如,学会了C++,是否了解一个对象在编译后,在汇编代码中是如何被初始化的?这个对象的各个成员在内存中是如何存放的?当一个成员函数被调用时,编译器在汇编代码中加入了哪些额外的动作?虚函数的调用是如何实现的? 这些东西恐怕在编程语言或编译原理中都没有详细提到,只有通过踏实的实干才能真正掌握。

(4)重视数学学习。数学是思维的体操,数学无处不在。学计算机至少要学习离散数学、概率论、布尔代数、集合论和数理逻辑。这些知识并不难,但是对你未来的工作帮助会很大。 尤其当你对一些“数学密集型”的领域如视频、图像处理等有兴趣时,这些知识将成为你手中的利器。

(5)培养团队精神,学会与人合作。今天的软件工程早已经不是一个人可以单独操作的,而必须靠团队合作才能成功。不懂得合作的人是不能成大器的。大家要多去寻找可以与人一起做项目的机会。

(6)激励创新意识,培养好奇心,不要死记硬背。没有掌握某种算法技术的根本原理,就不会有应变和创新的能力。想成为一位好程序员(其实从事任何一个行业都是如此),重要的是要养成钻研,好奇,创新,动手,合作的优秀习惯,不满足于填鸭,不满足于考试交差,不满足于表象。这不是学几门课能够一蹴而就的。

(7)有策略地“打工”。在不影响学业的前提下,寻找真正有意义的暑期工作或兼职。去找一个重视技术的公司,在一个好的“老板”指导下完成真正会被用户使用的程序。

Sunday, September 21, 2008

这几天使用LaTeX的一些新感受

在学校找了个用LaTeX排版的差事, 也不知道能做多久, 不过花了3天时间排了本近60页的杂志, 还是很有成就感的, 嘿嘿~

期间也发现有一些遗忘的地方, 于是我这几天干的最多的一件事情就是在CTeX论坛上搜和在Google上搜, 对于以前的一些东西又有了新的理解.

先来说说代码显示吧, 以前用了一个很笨的方法来做出那种灰色背景的效果, 结果在排大猫的那段很长很长的代码时出现了问题. 那代码要跨页, 所以以前的表格方法不能把代码全部显示出来, 导致大量代码被丢弃了, 很显然这种方法已经行不通了. 于是上网去找解决方案, 找到一个listings的宏包, 看介绍不错, 还支持语法高亮呢. 然后就兴致勃勃地用上了, 实现灰色背景还是很简单的, 可一编译又发现了一个很严重的问题, 如果某行代码太长超过一行了, 虽然listings可以自动换行, 但那行就没有灰色背景了! 这样的效果可想而知, 于是我还很认真地花了一些时间去把listings的说明文档好好看了一遍, 想找找有没有什么解决的办法, 结果还是失败了, 不过看CTeX论坛上也是有些人遇到这种情况, 而有些人正常, 难道是人品问题 (- -)? 没办法, 为了好的代码显示效果, 只能另辟蹊径了. 恐怕我当初也不会想到, 最后的方法竟然如此简单, 仅仅是把代码放在一个shaded环境里就行了, 如下:
\usepackage{color}
\usepackage{framed}

\definecolor{shadecolor}{gray}{0.85}
放在导言区就行了, 然后像这样处理代码:
\begin{shaded}
\begin{verbatim}
...
\end{verbatim}
\end{shaded}
什么跨页, 什么换行, 一切都搞定, 哈哈~

然后还是讲讲代码, 当初我在排第一段代码的时候就遇到了困难, 因为这里面有中文注释... 以前从来没考虑过这种事情, 查了下, 是verbatim环境使用的字体Typewriter不支持显示中文的缘故, 这也是LaTeX默认用来显示代码的字体. 不过看别人用CJK的显示都是正常的, 看来CJK确实要高级些, 没办法, 谁叫咱用的是XeTeX, 毕竟现在还不是很成熟. 我想用xeCJK啊, 残念, 编译不出来就这样, 唉~ 然后在这里找到了解决办法:
\setsansfont{DejaVu Sans YuanTi Mono}
\makeatletter
\def\verbatim@font{\sffamily\small}
\makeatother
只好忍痛替换了tt字体, 用上了猪猪的强大字体, 等宽加中文都支持.

因为杂志的栏目分类不能出现编号, 所以默认的那种是不行的, 下面是解决:
\phantomsection % 让目录中的链接正确
\section*{\textcolor{darkgreen}{\textbf{本刊致谢}}} % 不显示编号, 并且不出现在目录中
\addcontentsline{toc}{section}{卷首语} % 添加到目录中
\sectionmark{卷首语} % 页眉

关于浮动环境, 这个以前真的是很头疼的, 往往它不会按照所设想的位置放置, 搞得某些图片直接占据了一整页. 然后某天在CTeX上看到一个很强大的回复, 可以把浮动环境放在任何你需要的地方, 一个字, 爽! 如下:
\usepackage{float}

\begin{figure}[H] % 就是这个神奇的H
...
\end{figure}

还有一个计数器的问题, 因为杂志有一个封面, 所以会占据掉一整页. 这样正文就是从第2页开始计数了, 虽然是个小问题, 不过还是希望能够符合习惯点. 解决也很简单的, 这还得归功于图书馆的那本强大的LaTeX书, 如下:
\setcounter{page}{0}
这句就将页码的计数器设置为0了, 所以放在第2页的代码前面就行了.

P.S. 因为杂志的缘故, 认识了joy, 牛逼的Emacs, Python, shell脚本使用者, 好好学习, 天天向上.

Wednesday, September 17, 2008

使用OO遇到的Java运行环境错误

没到Ob之前打开OO都不会有什么错误提示, 不过现在用终端了, 反而看到了一些错误提示, 也许是以前就有的, 只是看不到罢了. 错误提示如下:
javaldx: Could not find a Java Runtime Environment!
开始以为是Java的环境变量配置错误, 又按照Ubuntu Wiki上的设置重新检查了一次, 结果还是出现那个提示, 后来在Ubuntu官方论坛上找到了解决办法:
sudo apt-get install openoffice.org-java-common

Sunday, September 14, 2008

强大的终端电影

昨天在Ubuntu社区上看到的, 以前貌似听说过这么一个东西, 不过没见过, 见到了以后感觉的确很震撼. 当然, 你得要了解 Star Wars Episode IV: A New Hope 才行, 不然要理解其中的剧情还是有一定难度的, 毕竟这属于抽象派的. 话说这个有谁看完过?
telnet towel.blinkenlights.nl
下面是一些截图:

20th Fox
这个20世纪福克斯的的确很搞, - -

StarWars
Star Wars!

C-3PO & R2-D2
R2-D2 & C-3PO

Wednesday, September 10, 2008

URxvt & PyPanel & Openbox的一些配置

URxvt:
$ cat ~/.Xresources
! font
URxvt.font:xft:Bitstream Vera Sans Mono:pixelsize=13:antialias=true,
xft:WenQuanYi Zen Hei:pixelsize=13:antialias=true

! color
URxvt.foreground:#ffffff
URxvt.background:#2e3436
URxvt.color0:#2e3436
URxvt.color1:#cc0000
URxvt.color2:#4e9a06
URxvt.color3:#c4a000
URxvt.color4:#3465a4
URxvt.color5:#75507b
URxvt.color6:#06989a
URxvt.color7:#d3d7cf
URxvt.color8:#555753
URxvt.color9:#ef2929
URxvt.color10:#8ae234
URxvt.color11:#fce94f
URxvt.color12:#729fcf
URxvt.color13:#ad7fa8
URxvt.color14:#34e2e2
URxvt.color15:#eeeeec

! follow URL
URxvt.urlLauncher:firefox
URxvt.matcher.button:1
URxvt.perl-ext-common:matcher

! scrollbar
URxvt.scrollBar:True
URxvt.scrollBar_right:True
URxvt.scrollBar_floating:False
URxvt.scrollstyle:plain
URxvt.saveLines:500
PyPanel的部分配置, 只是把我修改过的贴了出来, 其它的都是默认的:
$ cat ~/.pypanelrc
#------------------------------------------------------------------------------
# Colors: Format is hex triplet - 0xrrggbb
#------------------------------------------------------------------------------
BG_COLOR = "0x000000" # Panel background and tinting color
TASK_COLOR = "0xffffff" # Normal task name color
FOCUSED_COLOR = "0x33ccff" # Focused task name color
SHADED_COLOR = "0x808080" # Shaded task name color
MINIMIZED_COLOR = "0x808080" # Minimized task name color
DESKTOP_COLOR = "0xffffff" # Desktop name color
CLOCK_COLOR = "0xffffff" # Clock text color
LINE_COLOR = "0x606060" # Vertical line color

#------------------------------------------------------------------------------
# Panel Spacing and Location Options: Measured in pixels
#------------------------------------------------------------------------------
P_LOCATION = 1 # Panel placement: 0 = top, 1 = bottom
P_WIDTH = 1400 # Panel width: 0 = Use full screen width
P_START = 20 # Starting X coordinate of the panel
P_SPACER = 0 # Spacing between panel objects
P_HEIGHT = 24 # Panel height

#------------------------------------------------------------------------------
# Panel Text Font: This option takes either a traditional or Xft font string
# Ex: "-schumacher-clean-medium-r-normal-*-12-*-*-*-*-*-*-*"
# "aquafont-8"
#------------------------------------------------------------------------------
FONT = "DejaVu Sans YuanTi-11"

#------------------------------------------------------------------------------
# Background Alpha/Shade Level: 0 (Fully Translucent) -> 255 (Fully Opaque)
# BG_COLOR is used for tinting
#------------------------------------------------------------------------------
SHADE = 255

#------------------------------------------------------------------------------
# Misc. Options: 1 = Enabled/Yes, 0 = Disabled/No
#------------------------------------------------------------------------------
ABOVE = 1 # Panel is always above other apps
APPICONS = 1 # Show application icons
AUTOHIDE = 0 # Autohide uses the CLOCK_DELAY timer above
SHADOWS = 0 # Show text shadows
SHOWLINES = 1 # Show object seperation lines
SHOWBORDER = 0 # Show a border around the panel

#------------------------------------------------------------------------------
# Panel Layout: -----------------------------------
# [ 1 ][ 2 ][ 3 ][ 4 ][ 5 ]
# -----------------------------------
#
# The panel layout is split into 5 sections numbered 1, 2, 3, 4 or 5 as shown
# in the diagram above. Each of the following objects can be enabled by
# assigning it a section number or disabled by assigning it 0:
#------------------------------------------------------------------------------
DESKTOP = 0 # Desktop name section
LAUNCHER = 0 # Application launcher section
TASKS = 3 # Task names section
TRAY = 4 # System tray section
CLOCK = 5 # Clock section
Openbox:
$ cat ~/.config/openbox/autostart.sh
#!/bin/bash

# PyPanel
if which pypanel > /dev/null; then
pypanel &
fi

# use feh to set the background
if [ -f $HOME/.fehbg ]; then
eval `cat $HOME/.fehbg` &
fi

# D-bus
if which dbus-launch >/dev/null && test -z "$DBUS_SESSION_BUS_ADDRESS"; then
eval `dbus-launch --sh-syntax --exit-with-session`
fi

# Make GTK apps look and behave how they were set up in the gnome config tools
if which gnome-settings-daemon >/dev/null; then
gnome-settings-daemon &
fi

# Preload stuff for KDE apps
if which start_kdeinit >/dev/null; then
LD_BIND_NOW=true start_kdeinit --new-startup +kcminit_startup &
fi

Arch Linux & Openbox

Openbox
花了两天下午折腾了下Arch和Openbox (以下简称Ob), Arch还是比较简单的, 具体安装到一些配置可以参考这篇Wiki, 那个启动速度的确很爽, 准备有时间了就把现在的电脑格了, 装上Arch.

Ob倒是花了些时间, 主要是以前对于DE和WM的区别不是很了解. 这个一定要装上ObConf, 我主要用来更换主题和更改字体. 那些菜单什么的配置, gtk主题的配置可以参考Toy的文章. panel用的是PyPanel, 稍微花了点时间配置, 主要是颜色, 对RGB不敏感啊... 用的ROX-Filer做的file manager, 这个看ee的介绍貌似很强大, 快捷键那是一套一套的, 不过还是鼠标点习惯点. 还有URxvt, 这个刚开始觉得也太难看了吧, 然后就Google了半天, 找到一些好的配置, 自己修改了一下, 主要把颜色改成GNOME中的Tango配色方案. 差不多就这些了, 我平时用的软件少, 暂时还没有遇到什么大的问题, 毕竟那是以后的事情了. 下篇会贴一些上面提到的一些软件的配置.

Tuesday, September 9, 2008

彩色man的less替代方案

今天突然想到猫猫的回帖, 于是去试了试, 的确很棒. 以前的那个用most来显示彩色man page的文章, 用了一段时间就会发现几个问题, 首先most不支持反向搜索, 也就是不能按N来反向搜索相同的关键字, 这也是我觉得最麻烦的一个地方. 其次在使用mark标记上, most不能自定义保存位置在某个寄存器上, 它只会保留一个标记点, 而且也不支持像Vim那样的使用两个单引号来在两个最近的标记点中跳转. 所以, 我换到了less, 不过今天在IRC上看到mOo说他用less查看普通文件是彩色的, 关于这个我还没找到该怎么办. 以下是修改.bashrc的部分:
# colorful man page
export PAGER="/usr/bin/less -s"
export BROWSER="$PAGER"
export LESS_TERMCAP_mb=$'\E[01;34m'
export LESS_TERMCAP_md=$'\E[01;34m'
export LESS_TERMCAP_me=$'\E[0m'
export LESS_TERMCAP_se=$'\E[0m'
export LESS_TERMCAP_so=$'\E[01;44;33m'
export LESS_TERMCAP_ue=$'\E[0m'
export LESS_TERMCAP_us=$'\E[01;33m'

Saturday, September 6, 2008

珍惜

今天进行了一次很诡异的谈话, 3个人, 那2个每一个对我来说都是很熟悉的人, 可我们3个在一起的时候我就不知道该干什么了. 想起暑假时和大坏、珍妮一起的时候, 也是他们两个一直在摆, 然后我在一边喝着饮料, 会不时地插上几句. 我对他们说我已经习惯这样了, 当一个安静的聆听者, 可今天又好像有点不一样, 也许是因为是兰在和另一个男生一直在那摆, 然后我又说不上什么. 他们理所当然地谈论到我, 一致的意见是我缺乏交际能力, 我嘴上没说什么, 可不免在心里念叨着. 我觉得干嘛要每个人都那样能说会道, 或者说花言巧语, 我不愿多说, 只想在热衷的技术上倾注更多的热情. 有时我也会话多, 不过一般都是在谈论技术的时候. 都说21世纪需要复合型人才, 看来我就是典型的不合格者了, 都不知道自己有时候太geek了是否是好事. 大家都是追求了钱才去追求精神上的提升, 而我不想在精神上堕落着. 以前对小马说我活着不是为了钱, 她有点不屑, 现在的我还是可以坚定地说出这句话, 不过钱这个字在我心中的比重的确比以前大了. 我不想让兰受苦, 她已经受够了, 如果继续在我身上延续的话, 那我只会成为又一个伤害她的人. 晚上兰给我发了条短信, 她说我给了别人不能给的东西. 我应该学着怎样更好地珍惜一个人了.