Sunday, November 16, 2008

Using Endnote with LaTeX and BibTeX

[Updated: 31 March 2008] Important Update: There was a problem with the ens file that I uploaded earlier, If for some reason you havent got things to work try again. Thanks to Christian Milzow (Zurich) for noticing this error.


I wrote this guide because I had many references in Endnote that I wanted to use in my LaTeX documents. I had to figure all this out the hard way — by lots of trial and error. If you follow this guide it should be easy for you.

There are a few points to make: I have used every Endnote version since 4, but when I did my thesis I used version 9. This guide should work for other versions but I’m not sure. I also use MikTeX and WinEdt on Windows. I don’t have a clue about other configurations but they should still work with this guide.

In LaTex use natbib. It is by far the best referencing package. Put ''\usepackage{natbib}'' in your header. Then in your document where you want the Bibliograpy to appear add:

\bibliographystyle{plainnat}
\bibliography{name of your bib file}

I find plainnat pretty ugly so I wrote a better one bevbib4 you can use this, or write your own with custombib. Note don’t type in the file name extension in the LaTeX document. It will figure it out.

For all this to work you need a unique ID for every paper you cite, it is best to be consistent and keep it simple, for example my unique ID for my paper here is Weir04. This will print out as (Weir et al, 2004) [depending on the style used of course]. Your entries in your bib file should look like this:

@article{Weir04,
Author = {Weir, B. S. and Turner, S. J. and Silvester, W. B. and Park, D.-C. and Young, J. M.},
Title = {Unexpectedly diverse \emph{Mesorhizobium} strains and \emph{Rhizobium leguminosarum} nodulate native legume genera of New Zealand, while introduced legume weeds are nodulated by \emph{Bradyrhizobium} species},
Journal = {Applied and Environmental Microbiology},
Volume = {70},
Number = {10},
Pages = {5980-5987},
Year = {2004} }

Now the guide begins. I assume you have an endnote database (*.enl), back this up before continuing.

Preparing Endnote

  • To use my file " BibTeX_Export-custom.ens " you need to make these changes below. Or you can use the default file " BibTeX_Export.ens " (that I have made a couple of changes to) but you will need to use the "Label" field to type your unique ID. This may conflict with some websites that export references.
  • In Endnote go to: Edit -> Preferences -> Reference types.
  • For each type of reference you use click "modify reference types" scroll down and add "BibTeX" under the "custom 1" field. (don't do this bit if you are using the "Label" version)
  • Go to "display fields" and make Column 4 to display "Custom1" give it the title "BibTeX" (if you are using the Label version make the Column show "Label")
  • Go back to view your library. When you edit a reference by double clicking, a new field will appear (near the bottom) called "BibTeX" (or "Label"). In this field you type the unique ID (i.e. Weir04). Alternatively if you have a huge database you could use "Jabref" to automatically add these to your final BibTeX database. This software is also generally useful for managing your data once in BibTeX format.

Export the file as a BibTeX (*.bib) database

  1. Get my export filter style (Label version) or export filter style (Custom1 version) and save in the "Styles" directory of endnote. Then select that file using the style manager in: Edit -> Output Styles. Make sure this style is selected in the main view window.
  2. Go to: File -> Export. Save the file as a text (*.txt) file. Move this file to your LaTeX directory you are working with and rename to a *.bib file.
  3. Now when you cite a reference use the command \citep{Weir04} or \citet{Weir04} to get a parenthesis or text citation respectively (just try it out to see what happens)
  4. Run LaTeX or pdfTeX on your file twice then run bibtex then LaTeX or pdfTeX again a few times. Repeat if required. Or just use Texify. You should only have to run BibTeX again if you make a new *.bib file.
  5. With some luck the citation should be inserted and referenced at the end.

The fiddly bit is going back to those references and using proper LaTeX commands where necessary i.e. using \emph{Species name} (type this into the Endnote field) . This will of course look like rubbish if you use the same endnote database for MS Word documents. I keep two databases.

Notes on using the Style file

  • For electronic references I used the "book" reference type, and in the notes field add the url in this form: "URL: \url{http://www.example.com}" . Yes this is a hack. The note field in other reference types will not be used (see below).
  • When you add authors make sure they are in this format: "Sandberg, A. M." note the spaces, this is important. You can use full names (see below), but again: spaces.
  • Don't worry about en-dashes in the page ranges, this is taken care of automatically.

@book{Irwin05,
Author = {Irwin, Geoff and Walrond, Carl},
Title = {When was New Zealand first settled?},
Publisher = {Ministry for Culture and Heritage},
Address = {Wellington},
Series = {Te Ara -- The Encyclopedia of New Zealand},
Note = {URL: \url{http://www.TeAra.govt.nz/NewZealanders/MaoriNewZealanders/WhenWasNewZealandFirstSettled/en}},
Year = {2005} }

EndNote Export was not listed on your Output Styles menu?

If "EndNote Export" is not listed in the Edit -> Output Styles menu:

  • Select Open Style Manager.
  • Find the "EndNote Export" style and check it ON. Close this window.
  • Make sure that "EndNote Export" is now checked in the Edit -> Output Styles menu.
  • Select the references you want to transfer.
  • Choose File -> Export. . Make sure you are exporting the references as Text file Only, then click on OK.
Thanks to Nora Lieske for this tip.

Other Websites

The information on this page may not be exactly what you are looking for, some other websites which might be of help are:

Original Link: http://www.rhizobia.co.nz/latex/convert.html

Friday, September 12, 2008

Google出世(演义)

早期的搜索引擎,基本原理是关键词匹配。
http://www.ccthere.com/article/1751696譬如用户输入关键词"奥运会",搜索引擎的任务是查找与奥运会相关的网页。如果恰好有一篇网页,内容无他,"奥运会,奥运会,。。。",连说100遍。早 期的搜索引擎肯定把这个网页放在结果的首页,说不定还置顶,因为, 1. 网页内容中,"奥运会"这个关键词出现的频率非常高,2. 没有出现与奥运会不相干的内容。
早期搜索引擎的问题很明显,但是如何解决,却是仁者见仁智者见智。
http://www.ccthere.com/article/17516961996年,刚刚入学Stanford计算机系的Larry Page和Sergey Brin哥俩儿觉得,提高搜索引擎的准确性,或许可以从网页与网页之间的相互链接入手。譬如,网页A中提到奥运会时,给了一个链接,指向网页甲,那么网页 甲的内容很可能与奥运会相关。如果不仅网页A有这样的链接,而且网页B,C,D等等,都有类似的链接,那么网页甲的内容与奥运会相关的可能性就极高。
批评者说,这不是三人成虎吗?Larry心里也没谱,就跑去问他的导师,Terry Winograd。
http://www.ccthere.com/article/1751696导师外形很像爱因斯坦,想了一想,说,"先把Stanford校园网内所有网页收集下来,验证一下你们的想法。然后扩大到更大范围,再验证一下。如果验证 的结果不错,就把全世界互联网的所有网页,统统收集下来,做一个搜索引擎,上线,让全世界的人用,让全世界的人都来验证你们的猜想。"
两年后,1998年,Google上线了,三人成虎的猜想被实践证明是行之有效的。
http://www.ccthere.com/article/1751696Terry导师大手一挥,"把全世界互联网的所有网页,统统收集下来",可把Larry和Sergey哥俩儿忙坏了。互联网上有多少网页,统统收集下来, 需要占用多少硬盘空间?Larry和Sergey当时是博士班一年级学生,囊中羞涩,买不起那么多设备,没办法,开始四处讨钱。
托了七大姑八大姨,拐弯抹角找到了一个大款,名叫Andy Bechtolsheim。此公早年在CMU拿了EE的硕士后,跑到Stanford读CS/EE博士。没来得及拿到博士学位,就伙同Scott McNealy和Vinod Khosla,下海开公司去了,这个公司就是大名鼎鼎的SUN Microsystems。 Scott McNealy任SUN的CEO长达20多年,而Andy Bechtolsheim功成身退,跳出SUN自己开了一个小公司,后来这个小公司卖给了Cisco。
http://www.ccthere.com/article/1751696坊间传说,Larry和Sergey拜访Andy的时候,Andy正在电话上。冗长的电话,Larry和Sergey两个小伙子血气方刚,哪里耐得住这份性子,抬腿告辞。因为是朋友介绍,Andy有点过不去,就追到门口。问,"二位上门,有何需求?"
Larry和Sergey铁青着脸,说,"也没什么大事,就是想找点钱,做一个大规模文件系统。"
http://www.ccthere.com/article/1751696Andy问,"多大规模呢?存储什么数据?"
Larry和Sergey,"打算把互联网上所有网页都下载,然后建一个搜索索引。"
http://www.ccthere.com/article/1751696Andy,"把互联网上所有网页统统下载?!需要多大空间?几个Giga不行吧,几个Tera也不行吧,几个Peta,几个Zetta?。。。嗯,我看几个Googol也许才能撑得住。知道Googol吗?就是10的100次方,就是一个1后面拖100个0!"
Larry和Sergey,"是的,我们的确就是打算处理海量数据。"
http://www.ccthere.com/article/1751696Andy,"你们打算怎么做?买个EMC?那玩意儿很贵的哟,我可没那么多钱让你们烧。"
Larry和Sergey,"我们打算自己动手,用一堆PC做一个分布式集群。"
http://www.ccthere.com/article/1751696Andy,"PC?死机了怎么办?干嘛不用工作站,干嘛不用NFS?"
Larry和Sergey,"工作站比PC贵太多,NFS的不是很切合我们的需要。。。"
http://www.ccthere.com/article/1751696Andy挤出一点笑容,"好吧,小伙子们,给朋友一个面子,而且年轻人探险也是值得鼓励的。给你们10万吧,省着点花啊!"
Andy掏出支票本,一边签名一边问,"你们的公司叫什么?"
http://www.ccthere.com/article/1751696Larry和Sergey面面相觑,那时候他们还没来得及给公司取名。"要不就叫Googol吧?","Googol不太好拼写,要不改一改,叫Google吧。" Google这个名字从此诞生。

Monday, September 1, 2008

如何保持SSH链接不因IDLE时间过长而中断?

1. 修改/etc/ssh/sshd_config:
ClientAliveInterval 60
2. 重启SSH服务:
/sbin/service sshd reload
详细说明如下:
Using an OpenSSH server's ClientAliveInterval, it is possible for the ssh server to send periodic "keep alive" messages to the ssh client, keeping the connection open indefinitely. This is useful when a firewall or other packet filtering device drops idle connections after a certain period of time. Note that this is different from the KeepAlive directive in ssh_config.

From the sshd_config manpage:

ClientAliveInterval
Sets a timeout interval in seconds after which if no data has
been received from the client, sshd will send a message through
the encrypted channel to request a response from the client. The
default is 0, indicating that these messages will not be sent to
the client. This option applies to protocol version 2 only.


Example (send "keep alive" messages every 5 minutes) on Red Hat Linux:

1. Add ClientAliveInterval 300 to /etc/ssh/sshd_config

2. Reload the sshd server configuration with /sbin/service sshd reload

Note: you may want to configure the ClientAliveCountMax value in sshd_config to set the number of times that "keep alive" messages are sent. If ClientAliveCountMax number of "keep alive" messages are not acknowledged by the ssh client, the connection is terminated by the ssh server. The default value of 3 should be sufficient for most users.

Friday, August 29, 2008

傅立叶变换的意义与卷积

(一)傅立叶变换的物理意义

傅立叶变换是数字信号处理领域一种很重要的算法。但是该算法到底有何意义呢?

要知道傅立叶变换算法的意义,首先要了解傅立叶原理的意义。傅立叶原理表明:任何连续测量的时序或信号,都可以表示为不同频率的正弦波信号的无限叠加。而根据该原理创立的傅立叶变换算法利用直接测量到的原始信号,以累加方式来计算该信号中不同正弦波信号的频率、振幅和相位。

和傅立叶变换算法对应的是反傅立叶变换算法。该反变换从本质上说也是一种累加处理,这样就可以将单独改变的正弦波信号转换成一个信号。

因此,可以说,傅立叶变换将原来难以处理的时域信号转换成了易于分析的频域信号(信号的频谱),可以利用一些工具对这些频域信号进行处理、加工。最后还可以利用傅立叶反变换将这些频域信号转换成时域信号。

从现代数学的眼光来看,傅里叶变换是一种特殊的积分变换。它能将满足一定条件的某个函数表示成正弦基函数的线性组合或者积分。在不同的研究领域,傅里叶变换具有多种不同的变体形式,如连续傅里叶变换和离散傅里叶变换。

傅立叶变换属于调和分析的内容。"分析"二字,可以解释为深入的研究。从字面上来 看,"分析"二字,实际就是"条分缕析"而已。它通过对函数的"条分缕析"来达到对复杂函数的深入理解和研究。从哲学上看,"分析主义"和"还原主义", 就是要通过对事物内部适当的分析达到增进对其本质理解的目的。比如近代原子论试图把世界上所有物质的本源分析为原子,而原子不过数百种而已,相对物质世界 的无限丰富,这种分析和分类无疑为认识事物的各种性质提供了很好的手段。

在数学领域,也是这样,尽管最初傅立叶分析是作为热过程的解析分析的工具,但是其 思想方法仍然具有典型的还原论和分析主义的特征。"任意"的函数通过一定的分解,都能够表示为正弦函数的线性组合的形式,而正弦函数在物理上是被充分研究 而相对简单的函数类,这一想法跟化学上的原子论想法何其相似!奇妙的是,现代数学发现傅立叶变换具有非常好的性质,使得它如此的好用和有用,让人不得不感 叹造物的神奇:

1. 傅立叶变换是线性算子,若赋予适当的范数,它还是酉算子;

2. 傅立叶变换的逆变换容易求出,而且形式与正变换非常类似;

3. 正弦基函数是微分运算的本征函数,从而使得线性微分方程的求解可以转化为常系数的代数方程的求解.在线性时不变的物理系统内,频率是个不变的性质,从而系统对于复杂激励的响应可以通过组合其对不同频率正弦信号的响应来获取;

4. 著名的卷积定理指出:傅立叶变换可以化复杂的卷积运算为简单的乘积运算,从而提供了计算卷积的一种简单手段;

5. 离散形式的傅立叶变换可以利用数字计算机快速的算出(其算法称为快速傅立叶变换算法(FFT))。

正是由于上述的良好性质,傅里叶变换在物理学、数论、组合数学、信号处理、概率、统计、密码学、声学、光学等领域都有着广泛的应用。

在图象处理上的应用
傅立叶变换是图像处理中最常用的变换。它是进行图像处理和分析的有力工具。

傅立叶变换的数学定义
传统的傅立叶变换是一种纯频域分析,它可将一般函数f(x)表示为一簇标准函数的加权求和,而权函数亦即f的傅立叶变换。设f是R上的实值或复值函数,则f为一能量有限的模拟信号,具体定义如下:

2、图像傅立叶变换的物理意义

图像的频率是表征图像中灰度变化剧烈程度的指标,是灰度在平面空间上的梯度。 如:大面积的沙漠在图像中是一片灰度变化缓慢的区域,对应的频率值很低;而对于地表属性变换剧烈的边缘区域在图像中是一片灰度变化剧烈的区域,对应的频率 值较高。傅立叶变换在实际中有非常明显的物理意义,设f是一个能量有限的模拟信号,则其傅立叶变换就表示f的谱。从纯粹的数学意义上看,傅立叶变换是将一 个函数转换为一系列周期函数来处理的。从物理效果看,傅立叶变换是将图像从空间域转换到频率域,其逆变换是将图像从频率域转换到空间域。换句话说,傅立叶 变换的物理意义是将图像的灰度分布函数变换为图像的频率分布函数,傅立叶逆变换是将图像的频率分布函数变换为灰度分布函数。

(二) 卷积的意义
参见剑桥的课件,写得很好。

傅立叶级数与傅立叶变换之间的关系

傅立叶级数是用来对周期函数进行展开的,如果原函数的频率为w,则展开的各项中,除了常数项,其他的都是w的整数倍。 当原函数为非周期函数的时候,则可以看成周期无穷大,频率w无穷小的情况,同样通过傅立叶级数进行展开,可是这时候可以看到,每一项前面的系数都开始趋于无穷小,但是这个原函数确实是由各种频率分量组合而成的,只不过每一个分量的作用都非常小。
这时候为了看到各种频率分量之间的关系,前辈们在以上这个无穷小的系数上除了一个无穷小量w,这样得到了一般意义上的傅立叶变换,每个频率分量代表着各自的相对大小。所以当对周期函数这样的含有纯频率的函数进行傅立叶变换时就会出现冲击函数了。

Sunday, July 27, 2008

心目中的编程高手

Bill Joy MIT BBS上说微软电话面试的一道题就是“Who do you think is the best coder, and why?”。我觉得挺有意思的,也来凑个热闹。排名不分先后。

Bill Joy,前任Sun的首席科学家
当年在Berkeley时主持开发了最早版本的BSD。他还是vi和csh的作者。当然,Csh Programming Considered Harmful是另一个话题乐。据说他想看看自己能不能写个操作系统,就在三天里写了个自己的Unix, 也就是BSD的前身。当然是传说了,但足见他的功力。另一个传说是,1980年初的时候,DARPA让BBN在Berkeley Unix里加上BBN开发的TCP/IP代码。但当时还是研究生的B伯伯怒了,拒绝把BBN TCP/IP加入BSD,因为他觉得BBN的TCP/IP写得不好。于是B伯伯出手了,端的是一箭封喉,很快就写出了高性能的伯克利版TCP/IP。当时 BBN和DARPA签了巨额合同开发TCP/IP Stack,谁知他们的代码还不如一个研究生的好。于是他们开会。只见当时B伯伯穿个T-shirt出现在会议室(当时穿T-shirt不象现在,还是相 当散漫的哈)只见BBN问:你怎么写出来的?而B伯伯答:简单,你读协议,然后编程就行了。最令偶晕倒的是,B伯伯硕士毕业后决定到工业界发展,于是就 到了当时只有一间办公室的Sun, 然后他就把Sparc设计出来乐... 象这种软硬通吃的牛人,想不佩服都不行的说。据Bill Joy的同事说,一般开会的时候B伯伯总是拿一堆杂志漫不经心地读。但往往在关键之处,B伯伯发言,直切要害,提出漂亮的构想,让同事们彻底崩溃。对了,他还是Java Spec和JINI的主要作者之一。

John Carmack,ID Software的founder和Lead Programmer
上个月和一个搞图形的师兄聊天,他竟然不知道John Carmack, 也让偶大大地晕了一把。不过也许搞研究的和搞实战的多少有些隔吧。想必喜欢第一人称射击游戏的都知道J哥哥。90年代初只要能在PC上搞个小动画都能让人 惊叹一番的时候,J哥哥就推出了石破天惊的Castle Wolfstein, 然后再接再励,doom, doomII, Quake...每次都把3-D技术推到极致。J哥哥的简历上说自己的专长是"Exhaust 3-D technology",真是牛人之言不我欺的说。做J哥哥这样的人是很幸福的,因为各大图形卡厂家一有了新产品就要向他“进贡”,不然如果他的游戏不支 持哪种卡,哪种卡基本就会夭折乐。当初MS的Direct3D也得听取他的意见,修改了不少API。当然,J哥哥在结婚前十数年如一日地每天编程14小时 以上,也是偶们凡人望尘莫及的。,J哥哥高中肆业(?!),可以说是自学成才。不过呢,谁要用这个例子来为自己学习不好辩护,就大错特错了。那 Leonardo Da Vinci还是自学成才呢(人是私生子,不能上学)。普通人和天才还是有区别的。对了,其实偶们叫“达分奇”是相当不对的,因为Vinci是地名,而Da Vinci就是从Vinci来的人的意思。换句话说,Leonardo Da Vinci就是“从Vinci来的Leonardo”的意思。叫别人“Da Vinci”就不知所谓乐。嗯,扯远了,打住。

David Cutler,VMS 和Windows NT的首席设计师
去微软前号称硅谷最牛的kernel开发员。当初他和他的手下在微软一周内把一个具备基本功能的bootable kernel写出来,然后说:"who can't write an OS in a week?",也是牛气冲天的说。顺便说一句,D爷爷到NT3.5时,管理1500名开发员,自己还兼做设计和编程,不改coder本色啊。D爷爷天生脾 气火爆,和人争论时喜欢双手猛击桌子以壮声势。:-) 日常交谈F-word不离口。他面试秘书时必问:"what do you think of the word '***'?",让无数美女刹羽而归。终于有一天,一个同样火爆的女面对这个问题脱口而出:"That's my favorite word"。于是她被录取乐,为D爷爷工作到NT3.5发布。

Donald E. Knuth
高爷爷其实用不着偶多说。学编程的不知道他就好像学物理的不知道牛顿,学数学的不知道欧拉,学音乐的不知道莫扎特,学Delphi的不知到Anders Hejlsberg,或者学Linux不知道Linus Torvalds一样,不可原谅啊。:-) 为了让文章完整,就再罗唆几句吧。高爷爷本科时就开始给行行色色的公司写各种稀奇古怪的编译器挣外快了。他卖给别人时收一两千美元,那些公司拿了 code,加工一下卖出去就是上万上十万。不过也没见高爷爷不爽过,学者本色的说。想想那可是60年代初啊,高爷爷写编译器写多了,顺带就搞出了个 Attribute Grammar和LR(k),大大地造福后人啊。至于高爷爷在CalTech的编程比赛(有Alan Kay得众多高高手参加)总是第一,写的Tex到86年就code freeze,还附带2^n美分奖励等等都是耳熟能详,偶就不饶舌乐。顺便说一下,高老大爷是无可争议的写作高手。他给Concrete Mathematics写的前言可谓字字铿锵,堪为前言的典范。他的技术文章也是一绝,文风细致,解释精当,而且没有学究气,不失轻快跳脱。记得几年前读 Concrete Mathematics,时不时开怀大笑,让老妈极其郁闷,觉得我nerdy到家,不可救药。其实呢,子非鱼,安知鱼之乐,更不知那完全是高爷爷的功劳。 说到写作高手,不能不提Stephen A. Cook。他的文章当年就被我们的写作老师极力推荐,号称典雅文风的样本。库爷爷一头银发,身材颀长,总是面带谦和的微笑,颇有仙风道骨,正好和他的仙文 相配的说。高爷爷其实还是开源运动的先驱。虽然他没有象Richard Stallman那样八方奔走,但他捐献了好多作品,都可以在网上看到,比如著名的Mathematical Writing,MMIXWare,The Tex Book等,更不用说足以让他流芳百世的Tex乐。

Ken Thompson,C 语言前身B语言的作者,Unix的发明人之一
(另 一个是Dennis M. Riche老大,被尊为DMR),Belle(一个厉害的国际象棋程序)的作者之一,操作系统Plan 9的主要作者(另一个是大牛人Rob Pike, 前不久被google挖走了)。Ken爷爷也算是计算机历史上开天辟地的人物了。1969年还是计算机史前时代,普通人都认为只有大型机才能运行通用的操 作系统,小型机只有高山仰止的份儿。至于用高级语言来写操作系统,更是笑谈。Ken爷爷自然不是池中物,于是他和DMR怒了,在1969年到1970间用 汇编在PDP-7上写出了UNIX的第一个版本。他们并不知道,一场轰轰烈烈的UNIX传奇由此拉开了序幕。Ken爷爷在1971年又把Unix用C重 写,于是C在随后20年成就了不知多少豪杰的梦想和光荣。Ken爷爷还有段佳话:装了UNIX的PDP-11最早被安装在Bell Lab里供大家日常使用。很快大家就发现Ken爷爷总能进入他们的帐户,获得最高权限。Bell Lab里的科学家都心比天高,当然被搞得郁闷无比。于是有高手怒了,跳出来分析了UNIX代码,找到后门,修改代码,然后重新编译了整个UNIX。就在大 家都以为“这个世界清净了”的时候,他们发现Ken爷爷还是轻而易举地拿到他们的帐户权限,百思不解后,只好继续郁闷。谁知道这一郁闷,就郁闷了14年, 直到Ken爷爷道出个中缘由。原来,代码里的确有后门,但后门不在Unix代码,而在编译Unix代码的C编译器里。每次C编译器编译UNIX的代码, 就自动生成后门代码。而整个Bell Lab的人,都是用Ken爷爷的C编译器。

Rob Pike, AT&T Bell Lab前Member of Technical Staff
现在google研究操作系统。罗伯伯是Unix的先驱,是贝尔实验室最早和Ken Thompson以及Dennis M. Ritche开发Unix的猛人,UTF-8的设计人。他还在美国名嘴David Letterman的晚间节目上露了一小脸,一脸憨厚地帮一胖子吹牛搞怪。让偶佩服不已的是,罗伯伯还是1980年奥运会射箭的银牌得主。他也是个颇为厉 害的业余天文学家,设计的珈玛射线望远镜差点被NASA用在航天飞机上。他还是两本经典,The Unix Programming Environment 和 The Practice of Programming 的作者之一。如果初学者想在编程方面精益求精,实在该好好读这两本书。它们都有中文版的说。罗伯伯还写出了Unix下第一个基于位图的窗口系统,并且是 著名的blit终端的作者。当然了,罗伯伯还是号称锐意革新的操作系统,Plan9,的主要作者。可惜的是,Plan9并没有引起多少人的注意。罗伯伯一 怒之下,写出了振聋发聩的雄文 Systems Software Research is Irrelevant,痛斥当下系统开发不思进取,固步自封的弊病。虽然这篇文章是罗伯伯含忿出手,颇有偏激之词,但确实道出了系统开发的无奈:开发周期 越来越长,代价越来越大,用户被统一到少数几个系统上,结果越来越多的活动是测量和修补,而真正的革新越来越少。就在罗伯伯郁闷之极的时候,google 登门求贤来乐。如果说现在还有一家大众公司在不遗余力地把系统开发推向极致的话,也就是google乐。随便看看google的成果就知道了。具有超强容 错和负载平衡能力的分布式文件系统GFS(现在能够用100,000台廉价PC搭起一个巨型分布系统,并且高效便宜地进行管理的系统也不多哈),大规模机 器学习系统(拼写检查,广告匹配,拼音搜寻。。。哪个都很牛的说),更不用说处理海量并行计算的各式google服务了。Rob在System Software Research is Irrelevant里萧瑟地说现在没有人再关心系统研究的前沿成果了。想不到他错了,因为google关心。google网络了大批功成名就的牛人,还 有大量初生牛犊般博士做开发,显然不是没事耍酷,而是因为它们的开发总是试图吸取系统研究的最新成果。想必Rob Pike在google很幸福。愿他做出更棒的系统。

Dennis M. Ritchie
既然Ken Thompson是我的偶像,新闻组上人称DMR的Dennis M. Ritchie自然也是,毕竟两人共同缔造了UNIX,而Dennis几乎独力把C搞大(当然,C的前身是B,而B是Ken Thompson一手做出来的)。J D两人1983年分享图灵奖,是有史以来少数几个因工程项目得奖的工程师(本来是唯一的一对儿,但Alan Kay才因为SmallTalk得奖,所以就成了唯二的乐)。一个人一生能做出一个卓越的系统已经不易,DMR的C和UNIX长盛不衰近30年,至今生机 勃勃,DMR此生可以无憾的说。D爷爷也算有家学渊源:他老爸在AT&T贝尔实验室工作了一辈子,并在电路设计方面卓有成就,还出了本颇有影响的 书The Design of Switching Circuits,据说在交换理论和逻辑设计方面有独到的论述。当然,D爷爷和他老爸是不同时代的人:他老爸的研究成形于晶体管发明之前,而D爷爷的工作 离了晶体管就玩儿不转乐。:-D不要看D爷爷搞出了C,其实他最爱的编程语言是Alef,在Plan9上运行,支持并行编程。Alef的语法和C相似,但 数据类型和执行方式都和C大大不同。说到语言,D爷爷对后来人有非常中肯的建议:抱着学习的目的来开发你自己的语言,不要冀望于它被众人接受。这个建议不 光对语言开发有用,也适用于其它大型系统的开发。别的不说,DMR后来领导自己的团队在1995年和1996分别推出了Plan9和Inferno操作系 统,又用多少人知道呢?其实,D爷爷当初也没想过C会风行世界。他开发C的初衷和Eric S. Raymond在Cathedral and Bazaar里阐述的一样,就是要消除自己对现有工具的不爽之处。谁知D爷爷无心插柳,C竟然受到众多程序员的狂热拥戴,连D爷爷自己都大惑不解。在一次 采访中D爷爷说大概那是因为C的抽象程度碰巧既满足了程序员的要求,又容易实现。当然C一度是Unix上的通用语言也是原因。但不管怎么说,D爷爷对编程 语言出色的审美意识奠定了C广为流传的基础。最后八卦一下。D爷爷的业余爱好和NBA大牛Karl Malone一样:开卡车。不过D爷爷更喜欢开NASCAR,而KM独爱巨无霸。J D爷爷自称心中不供偶像,如果一定要说一个,那就是Ken Thompson了。现在Ken爷爷退休当飞机教练去了,而D爷爷当了贝尔实验室系统开发部的头,整日忙于开支票。他俩合作20年,屡屡创造历史。这段令 人神往的佳话,也就长留你我心中乐。P.S.,很多人都以为Brian W. Kernighan是C的作者。其实BWK只是写了那本经典K&R C。据D爷爷说,他,Ken和Kernighan三人中,Kernighan最能写文章,他次之,而Ken写得最少;但说到编程,Ken爷爷才是当之无愧 的老大。

Edsger Wybe Dijkstra
对,就是E.W. Dijkstra. 一提到EWD,很多人就会想起找最短路径的Dijkstra Algorithm,就好像一提到Sir. Tony Hoare,就想起Quick Sort一样。其实这些个算法不过是两个牛人在他们职业生涯中最琐碎的贡献。比如Dijkstra算法,无非是戴爷爷在1956年为了展示新计算机 ARMAC的计算能力,初试身手的成果,属于他的算法处女作。据戴爷爷自述,他搞出最短路径算法的时候连纸笔都没用。当时他和他老婆在阿姆斯特丹一家咖啡 厅的阳台上晒太阳喝咖啡,突然就把这个算法想出来乐。而且当时的算法研究还比较原始,牛人们忙着用计算机搞数值计算,对离散算法不屑一顾。那时连一个象样 的专注于离散算法的专业期刊都没有。戴爷爷于是推迟发表这个算法。直到1959年,他才把这个算法发表在Numerische Mathematik的创刊号上,权为捧场。:-) EWD在多个领域牛气冲天,端的是理论和编程两手硬的高手。只不过他的很多工作比较深刻,学校的老先生们觉得本科生接受不了,不给本科生讲而已。戴爷爷大 概因为最短路径算法一战成名,于是有人请他参加另一台计算机X1的设计工作,并且把设计实时中断系统的任务派给了他。现在看来实时中断也许不算什么,但要 知到,X1前根本就没有实时中断的概念。实现它简直就是一场豪赌。戴爷爷起初还不情愿,但经不住项目负责人Bram和Carel的轮番“吹捧”:我们知道 实时中断让您工作变得非常困难,但象您这样的牛人肯定能做出来的说。结果戴爷爷被糖衣炮弹彻底击穿,接下了这个烫手山芋。两三年后,他不仅搞出了实时中 断,还围绕这个写出了自己的博士论文,顺利戴上博士帽。让戴爷爷真正成名立万的还是在X1上开发的Algo60,最早的高级语言之一。戴爷爷没日没夜地工 作了8个月,就搞出了Algo60,也因此获得了1972年的图灵奖。因为Algo60,戴爷爷发表了一篇石破天惊的文章:Recursive Programming,于是人们才知道,原来高级语言也可以高效地实现递归,原来从此以后,所有程序员都不可避免地和戴爷爷发明的一个词(应该说是概 念)打交道:堆栈。而且Algo60还让戴爷爷深入地思考多道程序设计的问题,最终发明了每个系统程序员都绕不开的概念:semaphore。当然,戴爷 爷总是把他发明的概念严格形式化,极具科学家本色的说。和这些成就想比,他提出的吃饭的哲学家问题,也就没什么好说的了。说来好笑,当时的大学(忘了哪所 了)还是觉得戴爷爷没有受过正统的数学训练,也不是专门搞数值分析的,所以最后不太情愿地给了他一个教职。这种小挫折并不能妨碍象戴爷爷这样的牛人创造历 史。他一边教数值分析(:-D),一边开始开发一个新的操作系统,并培养计算机科学家。几年后,THE Multiprogramming System横空出世。THE是第一个支持松散耦合,显式同步的进程并由此使得严格证明系统没有死锁变得容易的操作系统。可惜戴爷爷任职的系不识货,还强 行解散了他的研究小组(1972年戴爷爷给他的系主任说他得了图灵奖,系主任的第一反应是你们搞计算机就喜欢乱发奖)。这让戴爷爷相当郁闷,得了抑郁症。 在极度郁闷之中,戴爷爷决定用写作来治疗自己的抑郁症。于是经典就诞生乐:Notes on Structured Programming。戴爷爷从此被尊为结构化编程的奠基人,而且他的抑郁症也被治好乐。EWD太牛,结果他的故事也太多。先到这里吧。1973起,他 的故事就在美国发生了。

Anders Hejlsberg, 微软.NET的首席架构师,编程语言设计和实现的顶尖高手
他一手做出了Turbo Pascal,也是Delphi, J++(尤其是WFC),C#和.NET的主要作者。这些作品的名字足以为他立传。作为一个程序员,我在这样的大师面前实在无语。生子当如Anders的 说。李维的《Borland传奇》里已详细讲述了Anders的传奇故事,我就不用费舌了:http://java.mblogger.cn/iexploiter/posts/1505.aspx。Artima上有Anders谈C#的系列访谈。MSDN上有一段Anders导游的录像。有兴趣可以去看看牛人的丰采。

最近10年计算机专业图书中的50强

美国著名图书频道Book Pool集结最权威的62位作者评选出了最近10年计算机专业图书中的50强。

光这62位作者阵营就非常强大,我们熟悉的就有:
  • Francesco Balena《Microsoft.NET框架程序设计——Visual Basic.NET语言描述》作者)
  • Bert Bates《Head First Design Patterns》作者)
  • Joshua Bloch《Effective Java》作者)
  • Kalen Delaney《Microsoft SQL Server 2000技术内幕》作者)
  • Stephen C. Dewhurst《C++ Gotchas》作者)
  • Bill Evjen《Visual Basic.NET宝典》作者)
  • Dino Esposito《构建Web解决方案——应用ASP.NET和ADO.NET、Microsoft .NET XML程序设计》作者)
  • Andy HuntPragmatic Programmer系列图书作者)
  • Gary McGraw《Exploiting Software: How to Break Code》作者)
  • Steve McConnell《Code Complete》作者)
  • Christian Nagel《Enterprise Services with the .NET Framework》作者)
  • Arnold Robbins《Linux程序设计》作者)
  • Tim O'Reilly(O'Reilly媒体集团创始人)
  • Chris Sells《Windows Forms程序设计、.NET本质论》作者)
  • Stephen Walther《设计模式——可复用面向对象软件的基础》作者)
  • John Vlissides《ASP.NET揭秘》作者)
由此可见这次评选的权威性,还是让我们来看看这50本书的分布吧:

软件工程类

按照现代计算机技术的发展,《人月神话》应该称得骨灰级图书了,计算机图书能够流行30年,Frederick Brooks确实让人刮目相看。这种现象往往出现在软件工程类和算法类的图书上,这些理论和技术往往经久不衰。比如:
  • 《设计模式:可复用面向对象软件的基础》1994年出版(多位大师创作)
  • 《人件》1987年出版(Tom DeMarcoTimothy Lister
Martin FowlerKent Beck是软件工程领域最有名的技术作家,剩下的4本上榜图书全部是他们所写:
  • 《企业应用架构模式》Martin Fowler
  • 《重构——改善既有代码的设计》Martin Fowler
  • 《解析极限编程》Kent Beck
  • 《UML精粹:标准对象建模语言简明教程》Martin Fowler
看看这个领域还漏掉哪些经典:
Robert C. Martin《敏捷软件开发:原则、模式与实践》或者是其他?

C/C++类

C语言的设计者Brian W. Kernighan《C程序设计语言》确实经典,超过C++之父Bjarne Stroustrup《C++程序设计语言》进入名单榜中。

此外,Scott Meyers《Effective C++》众望所归,他的《More Effective C++》《Effective STL》也同样精彩。

Stan Lippman《C++ Primer》不在榜单,有点可惜。

Java类

不 知道什么原因,Java类图书的排名比较靠后,《Head First Java》是一本不错的教材,不过国内好像还未引进,《Java 2核心技术 卷I:基础知识》已经出第7版了,可见受欢迎的程度。Sun的Joshua Bloch《Effective Java》采用Scott Meyers的风格,使本书成为真正的Effective Java Book。

不过《Java编程思想》《J2EE核心模式》《Contributing to Eclipse》《Expert One-on-One J2EE Development without EJB》落榜有点意外。

Windows/.NET类

Charles Petzold《Windows程序设计》是尽人皆知的Win32 API编程经典,也称为“Petzold Book”。由Anders Hejlsberg来写《C#编程语言详解 》,谁说不是经典?不过《ADO.NET实用指南》上榜有点出乎我的意料,为什么不是Jeffrey Richter《Microsoft .NET框架程序设计》

Linux/Unix类

这类只有一本《UNIX环境高级编程》,漏掉了《UNIX 编程艺术》是否可惜?

Web开发类

有3本书上榜,Perl之父Larry Wall《Perl语言编程》是经典的教程,《网站重构》上榜在情理之中,Jeffrey Zeldman一直走在Web标准制定的最前沿。

ASP.NET Page Framework负责人Nikhil Kothari《ASP.NET服务器控件与组件开发》讲解ASP.NET模式非常清晰,不过,如果是ASP.NET入门的话,我倒是推荐另外一本——《ASP.NET揭秘》

还有没有漏掉什么啦?《JavaScript权威指南》是不是也很好?

网络通讯类

这类图书上榜比较多,TCP/IP如此的重要,《TCP/IP详解 卷I:协议》《TCP/IP路由技术(第一卷)》同时上榜。其他的还有《Internet路由结构》《计算机网络(第四版)》《DNS与BIND》

数据库类

数据库类评选结果不太好评点,《Transact-SQL权威指南》是一本标准的T-SQL教材,进一步实践,还是建议看邹建最新出版的中文版《SQL Server 2000 开发与管理应用实例》

其 他上榜的都没有中文版:《A First Look at SQL Server 2005 for Developers》(FirstLook系列过时太快,基本上没有引进)、《Expert Oracle, Signature Edition (One-on-One)》(2005年的新书,作者Thomas Kyte是Oracle的VP)、《Joe Celko's SQL for Smarties : Advanced SQL Programming》(作者Joe Celko是ANSI SQL标准委员会成员)。

安全类

网络社会没有比安全更重要的了,这类图书上榜就有5本,分别是: 《编写安全的代码》《黑客大曝光》《信息安全工程》《网络信息安全的真相》《应用密码学》。 后2本都是国际公认密码和信息安全专家Bruce Schneier的大作。

算法和代码类

提到算法,没有人不想到Donald E. Knuth《计算机程序设计艺术》,据说Bill Gates曾放言,做对该书所有习题就能到微软来报到上班,可见此书探讨算法的深度。相比Donald的巨著,《算法导论》更适合做为算法教材。

《代码大全》上榜在预料之中,这本书曾经有过中文版,不过现在已经绝版了,有点可惜。

综合类

不 好归类的都叫综合类吧,《程序员修炼之道》书名翻译不太恰当,《Pragmatic Programmer》代表注重实效的程序员,程序员如何注重实效?全书就围绕这个话题在谈。不过,因为这本书出版时间较早(1999年),我更愿意看《Joel说软件》,这种Blog的写作风格更加通俗易懂。

《编程珠玑》《程序设计实践》是2本讲解编程技巧的图书,如果说软件是工艺的话,你对这门手艺掌握的如何了?

Merrill R. Chapman作为老资格的程序员、销售主管,在《IT大败局》中以事件亲历的方式来剖析Ashton-Tate等公司的失败案例的时候显得特别具有说服力。前车之鉴、后车之师,何必自己花钱买教训呢?

综合类还有很多好书,比如,Gerald M.Weinberg《你的灯亮着吗?》David Kushner《DOOM启世录》都值得一读。国内的读者还不应该放过李维《Borland传奇》蔡学镛《爪哇夜未眠》

其他一些上榜图书没有中文版,不太好点评,分别是:
  • 《Microsoft SharePoint: Building Office 2003 Solutions》
  • 《Group Policy, Profiles, and IntelliMirror for Windows 2003, Windows XP, and Windows 2000》
  • 《Don't Make Me Think》
  • 《The Design of Everyday Things》
  • 《The Code Book: The Science of Secrecy from Ancient Egypt to Quantum Cryptography》
  • 《Mac OS X: The Missing Manual, Panther Edition》
  • 《The Elements of Style, 4th Edition》
  • 《Godel, Escher, Bach: An Eternal Golden Braid》

Thursday, July 24, 2008

Enable Math Rendering in MediaWiki

1. Install OCaml.
2. Install texlive-latex
3. Download and install AMS-latex:
ftp://ftp.ams.org/pub/tex/amslatex.zip
ftp://ftp.ams.org/pub/tex/amsrefs/amsrefs-tds.zip
3. Install texvc (/wiki/math/README)
4. edit LocalSettings.php:
$wgMathPath = "../images/math";
$wgMathDirectory = "{$IP}/images/math";
$wgTmpDirectory = "{$IP}/images/tmp";
$wgUseTeX = true;


Thursday, July 17, 2008

Oracle 10g Installation

Groups:
  • oinstall, gid=2000
  • dba, gid=3000
  • oper, gid=4000
User:
  • oracle, password=orapass, g=oinstall, G=dba,oper, uid=2001
Directories:
  • Oracle Base Directory=/u00/app/oracle
  • Database File Directory = /u01/oradata
  • Recovery File Directory = /u02/oradata
  • Inventory Directory=/home/oracle/oraInventory
Evironment Variables:
  • ORACLE_BASE=/u00/app/oracle
  • ORACLE_SID=vrlab
  • Installation Name=OraDb10g_home1, Installation Path=/u00/app/oracle
Database:
  • Global Database Name=cad
  • System Identifier(SID)=cad
  • Server Parameter Filename=/u00/app/oracle/dbs/spfilecad.ora
  • Dababase Accounts=SYS, SYSTEM, DBSNMP, SYSMAN/orapass
  • iSQL*Plus URL=http://<host_name>:5560/isqlplus
  • iSQL*Plus DBA URL=http://<host_name>:5560/isqlplus/dba
  • Database Control URL=http://<hostname>:1158/em

Monday, July 14, 2008

Install WordPress & MediaWiki

1. Create the group and user for mysql users:
# groupadd -g 1000 mysql
# useradd -G mysql -d /home/mysql -m -u 1001 mysql
# passwd mysql
New Password: mypass
Reenter New Password: mypass
2.
# gzip -d mysql-5.0.51a-linux-i686-icc-glibc23.tar.gz
# tar -xvf mysql-5.0.51a-linux-i686-icc-glibc23.tar
# mv mysql-5.0.51a-linux-i686-icc-glibc23 mysql
# mv mysql /usr/local
3.
# cd /usr/local/mysql
# chown -R mysql .
# chgrp -R mysql .
# scripts/mysql_install_db --user=mysql
Installing MySQL system tables...
OK
Filling help tables...
OK

To start mysqld at boot time you have to copy
support-files/mysql.server to the right place for your system

PLEASE REMEMBER TO SET A PASSWORD FOR THE MySQL root USER !
To do so, start the server, then issue the following commands:
./bin/mysqladmin -u root password 'new-password'
./bin/mysqladmin -u root -h opensuse password 'new-password'

Alternatively you can run:
./bin/mysql_secure_installation

which will also give you the option of removing the test
databases and anonymous user created by default. This is
strongly recommended for production servers.

See the manual for more instructions.

You can start the MySQL daemon with:
cd . ; ./bin/mysqld_safe &

You can test the MySQL daemon with mysql-test-run.pl
cd mysql-test ; perl mysql-test-run.pl

Please report any problems with the ./bin/mysqlbug script!

The latest information about MySQL is available on the web at
http://www.mysql.com
Support MySQL by buying support/licenses at http://shop.mysql.com
# chown -R root .
# chown -R mysql data
4. Start the MySQL server.
# bin/mysqld_safe --user=mysql &
5. Accounts with the username root are created. These are superuser accounts that can do anything. The initial root account passwords are empty, so anyone can connect to the MySQL server as root — without a password — and be granted all privileges.
On Unix, both root accounts are for connections from the local host. Connections must be made from the local host by specifying a hostname of localhost for one of the accounts, or the actual hostname or IP number for the other.
Two anonymous-user accounts are created, each with an empty username. The anonymous accounts have no password, so anyone can use them to connect to the MySQL server.
On Unix, both anonymous accounts are for connections from the local host. Connections must be made from the local host by specifying a hostname of localhost for one of the accounts, or the actual hostname or IP number for the other. These accounts have all privileges for the test database and for other databases with names that start with test_.

1) remove the anonymous accounts:
# mysql -u root
mysql> drop user '';
Query OK, 0 rows affected (0.00 sec)
mysql> drop user ''@'localhost';
Query OK, 0 rows affected (0.00 sec)
mysql> drop user ''@'opensuse';
Query OK, 0 rows affected (0.00 sec)
2) assign passwords to the root accounts:
# mysql -u root
mysql> set password for 'root'@'localhost' = password( 'mypass' );
Query OK, 0 rows affected (0.00 sec)
mysql> set password for 'root'@'opensuse' = password( 'mypass' );
Query OK, 0 rows affected (0.00 sec)
mysql> set password for 'root'@'127.0.0.1' = password( 'mypass' );
Query OK, 0 rows affected (0.00 sec)
3) allow root account connecting from any host:
# mysql -u root -p
Enter password: mypass
mysql> create user 'root'@'%';
Query OK, 0 rows affected (0.00 sec)
mysql> set password for 'root'@'%' = password( 'mypass' );
Query OK, 0 rows affected (0.00 sec)
4) grant privileges to root@%
mysql> GRANT ALL PRIVILEGES ON *.* TO 'root'@'%' IDENTIFIED BY PASSWORD '*CDC006E5FCB22B379747AF6E75DF97FB503F11B3' WITH GRANT OPTION
6. Use mysqladmin to verify that the server is running.
# bin/mysqladmin version - p
Enter password: mypass
bin/mysqladmin Ver 8.41 Distrib 5.0.51a, for redhat-linux-gnu on i686
Copyright (C) 2000-2006 MySQL AB
This software comes with ABSOLUTELY NO WARRANTY. This is free software,
and you are welcome to modify and redistribute it under the GPL license

Server version 5.0.51a
Protocol version 10
Connection Localhost via UNIX socket
UNIX socket /tmp/mysql.sock
Uptime: 3 hours 18 min 27 sec

Threads: 2 Questions: 300 Slow queries: 0 Opens: 24 Flush tables: 1 Open tables: 17 Queries per second avg: 0.025
# bin/mysqladmin variables -p
+---------------------------------+----------------------------------------+
| Variable_name | Value |
+---------------------------------+----------------------------------------+
| auto_increment_increment | 1 |
| auto_increment_offset | 1 |
| automatic_sp_privileges | ON |
| back_log | 50 |
| basedir | /usr/local/mysql/ |
| binlog_cache_size | 32768 |
| bulk_insert_buffer_size | 8388608 |
| character_set_client | latin1 |
| character_set_connection | latin1 |
| character_set_database | latin1 |
| character_set_filesystem | binary |
| character_set_results | latin1 |
| character_set_server | latin1 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/mysql/charsets/ |
......
| tmp_table_size | 33554432 |
| tmpdir | /tmp/ |
| transaction_alloc_block_size | 8192 |
| transaction_prealloc_size | 4096 |
| tx_isolation | REPEATABLE-READ |
| updatable_views_with_limit | YES |
| version | 5.0.51a |
| version_comment | MySQL Community Server (GPL) |
| version_compile_machine | i686 |
| version_compile_os | redhat-linux-gnu |
| wait_timeout | 28800 |
+---------------------------------+----------------------------------------+
7. Verify that you can shut down the server:
# bin/mysqladmin -u root shutdown -p
Enter password: mypass
8. Verify that you can start the server again. Do this by using mysqld_safe or by invoking mysqld directly. For example:
# bin/mysqld_safe --user=mysql --log &
[1] 27927
opensuse:/usr/local/mysql # nohup: ignoring input and redirecting stderr to stdout
Starting mysqld daemon with databases from /usr/local/mysql/data
9. Run some simple tests to verify that you can retrieve information from the server. The output should be similar to what is shown here:
# bin/mysqlshow -p
# bin/mysqlshow mysql -p
# bin/mysql -e "select * from user" mysql -p
10.
# gzip -d httpd-2.2.9.tar.gz
# tar -xvf httpd-2.2.9.tar
# cd httpd-2.2.9
# ./configure --enable-so
# make
# make install
Now you have httpd-2.2.9 available under /usr/local/apache2, configured with loadable module support and the standard MPM prefork. To test the installation use your normal procedure for starting the Apache server, e.g.:
# /usr/local/apache2/bin/apachectl start
and stop the server to go on with the configuration for PHP:
# /usr/local/apache2/bin/apachectl stop.
11.
# gzip -d php-5.2.6.tar.gz
# tar -xvf php-5.2.6.tar
# cd php-5.2.6
Now, configure your PHP. This is where you customize your PHP with various options, like which extensions will be enabled. Do a ./configure --help for a list of available options. In our example we'll do a simple configure with Apache 2 and MySQL support. Your path to apxs may differ, in fact, the binary may even be named apxs2 on your system.
# ./configure --with-apxs2=/usr/local/apache2/bin/apxs --with-mysql=/usr/local/mysql
# make
# make install
If you decide to change your configure options after installation, you only need to repeat the last three steps. You only need to restart apache for the new module to take effect. A recompile of
Apache is not needed.
Note that unless told otherwise, 'make install' will also install PEAR, various PHP tools such as phpize, install the PHP CLI, and more.

12. Setup your php.ini
# cp php.ini-dist /usr/local/lib/php.ini
You may edit your .ini file to set PHP options. If you prefer having php.ini in another location, use --with-config-file-path=/some/path in step 11.
If you instead choose php.ini-recommended, be certain to read the list of changes within, as they affect how PHP behaves.
13. Edit your httpd.conf to load the PHP module. The path on the right hand side of the LoadModule statement must point to the path of the PHP module on your system. The make install from above may have already added this for you, but be sure to check.
For PHP 4:
LoadModule php4_module modules/libphp4.so
For PHP 5:
LoadModule php5_module modules/libphp5.so
14. Tell Apache to parse certain extensions as PHP. For example, let's have Apache parse .php files as PHP. Instead of only using the Apache AddType directive, we want to avoid potentially dangerous uploads and created files such as exploit.php.jpg from being executed as PHP. Using this example, you could have any extension(s) parse as PHP by simply adding them. We'll add .phtml to demonstrate.
SetHandler application/x-httpd-php
Or, if we wanted to allow .php, .php2, .php3, .php4, .php5, .php6, and .phtml files to be executed as PHP, but nothing else, we'd use this:

SetHandler application/x-httpd-php
And to allow .phps files to be executed as PHP source files, add this:
SetHandler application/x-httpd-php-source
15.
DirectoryIndex index.php index.html
16. Use your normal procedure for starting the Apache server, e.g.:
# /usr/local/apache2/bin/apachectl start
- OR -
# service httpd restart
17.
1) Download and unzip the WordPress package, if you haven't already.
2) Create a database for WordPress on your web server, as well as a MySQL user who has all privileges for accessing and modifying it.

mysql> create database wordpress character set gbk collate gbk_chinese_ci;
Query OK, 1 row affected (0.02 sec)

mysql> create user 'wordpress'@'%';
Query OK, 0 rows affected (0.00 sec)

mysql> set password for 'wordpress'@'%' = password( 'wordpress' );
Query OK, 0 rows affected (0.00 sec)

mysql> grant all on wordpress.* to 'wordpress'@'%';
Query OK, 0 rows affected (0.04 sec)

3) Rename the wp-config-sample.php file to wp-config.php.
4) Open wp-config.php in your favorite text editor and fill in your database details.
5) Place the WordPress files in the desired location on your web server:

* If you want to integrate WordPress into the root of your domain (e.g. http://example.com/), move or upload all contents of the unzipped WordPress directory (but excluding the directory itself) into the root directory of your web server.
* If you want to have your WordPress installation in its own subdirectory on your web site (e.g. http://example.com/blog/), rename the directory wordpress to the name you'd like the subdirectory to have and move or upload it to your web server. For example if you want the WordPress installation in a subdirectory called "blog", you should rename the directory called "wordpress" to "blog" and upload it to the root directory of your web server.

Hint: If your FTP transfer is too slow read how to avoid FTPing at : Step 1: Download and Extract.

6) Run the WordPress installation script by accessing wp-admin/install.php in your favorite web browser.

* If you installed WordPress in the root directory, you should visit: http://example.com/wp-admin/install.php
* If you installed WordPress in its own subdirectory called blog, for example, you should visit: http://example.com/blog/wp-admin/install.php

18. Change the password for admin: <default>

19. Install MediaWiki:

1) Install ImageMagick:
# gzip -d ImageMagick-6.4.2-3.tar.gz
# tar -xvf ImageMagick-6.4.2-3.tar
# cd ImageMagick-6.4.2
# ./configure
# make
# make install
2) Prepare the Directories:
# chmod 777 config
3) Use your web browser to browse to the main wiki page. Click on the link to begin the configuration script.
* PHP 5.2.6 installed
* Found database drivers for: MySQL
* PHP server API is apache2handler; ok, using pretty URLs (index.php/Page_Title)
* Have XML / Latin1-UTF-8 conversion support.
* Warning: A value for session.save_path has not been set in PHP.ini. If the default value causes problems with saving session data, set it to a valid path which is read/write/execute for the user your web server is running under.
* PHP's memory_limit is 128M.
* Couldn't find Turck MMCache, eAccelerator, APC or XCache; cannot use these for object caching.
* Found GNU diff3: /usr/bin/diff3.
* Found ImageMagick: /usr/bin/convert; image thumbnailing will be enabled if you enable uploads.
* Installation directory: /usr/local/apache2/htdocs
* Script URI path:
* Installing MediaWiki with php file extensions
* Environment checked. You can install MediaWiki.
*** Admin Username: WikiSysop
*** Password: mediawiki

*** Database Name: wikidb
*** DB Username: wikiuser
*** DB Password: mediawiki

Wednesday, June 18, 2008

远程重启Windows XP

shutdown -r -t 0

Firefox 3.0

Firefox 3.0正式发布了,24小时内被疯狂下载了800多万次,创了新的世界纪录。
我也下载下来试用了一下,也许是因为用了主题的缘故,感觉跟以前无异,希望BUG少些,和IE的兼容性也好些。
速度似乎挺快。
Firefox 3

Monday, June 16, 2008

Zeitgeist, the Movie

http://www.zeitgeistmovie.com/main.htm

Sunday, May 4, 2008

Change color of CStatic object.

.h file
(add this function to your class)
afx_msg HBRUSH OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor);
// Called to change color of text
.cpp file
(add this to your message map)
ON_WM_CTLCOLOR()
(add this to the file too)
HBRUSH CYourDialog::OnCtlColor(CDC* pDC, CWnd* pWnd, UINT nCtlColor)
{
// Call original functions
HBRUSH hbr = CDialog::OnCtlColor(pDC, pWnd, nCtlColor);

// Create a blue color
COLORREF textColor = RGB(0, 0, 255);

// Set text color
if (pWnd->GetDlgCtrlID() == yourstatic)
{
pDC->SetTextColor(textColor);

}

// Return result of original function
return hbr;

}

Tuesday, April 22, 2008

麻烦的OCCI

在Windows环境下用OCCI编程真是一件很麻烦的事情,尽管到目前为止,我还没有在UNIX环境下测试过OCCI,数据库厂商(尤其是这种大型数据库)对于UNIX环境的重视和支持程度要远远超过了Windows环境,料想不会有太大的问题。

我用的环境是Windows XP SP2 5.1.2600,Oracle 10g 10.2.0.1.0,Visual C++ 2005(VS8)。按照惯例,在VS8里面添加了include路径(通常是%ORACLE_HOME%\oci\include),以及新的链接路径(通常是%ORACLE_HOME%\oci\lib)。编译通过、链接通过,运行时出现异常,通过try - catch机制捕获到的异常为“ORA-24960: 属性OCI_ATTR_USERNAME的长度大于最大允许长度255。”在各个论坛上以及OTN上对这个问题讨论的很多,感觉很大程度上这个问题似乎与VC++和Oracle的版本匹配有关。于是从OTN(Oracle C++ Call Interface - Downloads)上可以下载到用于Visual C++ 2005(VS8)上的相关库文件,并且按照安装说明把这些库文件解压缩在%ORACLE_HOME%\oci\lib\MSVC\vc8目录中,重新编译通过、链接通过,运行时出现了同样的问题(ORA-24960: 属性OCI_ATTR_USERNAME的长度大于最大允许长度255。)

此时注意到安装文件中提示在DEBUG编译模式中要使用oraocci10d.lib而不是oraocci10.lib作为链接库。调整以后出现了新的问题,首先是说找不到oraocci10d.dll,把该目录加入环境变量PATH之后(这时要注意一点,必须重新启动VS,系统的环境变量才会生效,换句话说,VS只在开始运行时检查一下环境变量。),又说找不到MSVCR80D.dll。而此时注意到Release版本的编译已经没有问题了,但是用Release版本会给调试过程带来很多麻烦,很不甘心。

如果直接把$(VCInstallDir)VC\redist\Debug_NonRedist\x86\Microsoft.VC80.DebugCRT加入PATH,编译链接通过,报错没有通过manifest加载动态链接库,于是耐心地阅读了MSDN相关文章,将Porject->Properties中的Configuration Properties\C/C++\Code Generation\Runtime Library设置为/MDd (Multi-threaded Debug DLL),出现新错误,/MDd选项与静态链接MFC库选项矛盾,于是在stdafx.h中添加“#define _AFXDLL”,最终所有问题得到解决。

所以尽管经过很多尝试,过程极其复杂,但结论总结起来十分简单:
1、不要选择使用静态链接MFC;
2、从OTN(Oracle C++ Call Interface - Downloads)下载VC8的OCCI库文件;
3、将OCCI库文件安装到%ORACLE_HOME%\oci\lib\MSVC\vc8目录中,将该目录加入环境变量;
4、Debug编译版本中选择oraocci10d.lib作为链接库文件,并使用/MDd编译选项。Release版本中选择oraocci.lib作为链接库文件,并使用/MD编译选项。

Sunday, April 20, 2008

OCCI with Visual Studio 2005

只写了一句:
Environment *env;

编译错误:
1>d:\documents\visual studio 2005\projects\oci_test\oci_test\oci_testdlg.h(16) : error C2143: syntax error : missing ';' before '*'
1>d:\documents\visual studio 2005\projects\oci_test\oci_test\oci_testdlg.h(16) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int
1>d:\documents\visual studio 2005\projects\oci_test\oci_test\oci_testdlg.h(16) : error C4430: missing type specifier - int assumed. Note: C++ does not support default-int

解决方法:
using namespace oracle::occi;

Friday, April 18, 2008

回到Firefox

Apple的Safari 3.1不仅有了Windows版本,而且号称“世界上最快的浏览器”。它的出现让我有了些动摇,然而试用了不到一周,我就又回到了熟悉的Firefox。Safari的界面很酷,但是不仅不快,而且内存占用高达200~300M,许多插件无法使用,更无法容忍的是Bug太多!Apple,盛名之下,其实难副。

Sunday, April 6, 2008

Using GDI+ in MFC Applications

1. In Visual C++ 2005 go to Project->Properties, Type gdiplus.lib into the Configuration Properties/Linker/Input/Additional Dependencies.
2. Add the following line to stdafx.h:
#include <gdiplus.h>

using namespace Gdiplus;
#pragma comment(lib, "gdiplus.lib")
3. Intialize the GDI+ resources. Add this to your CWinApp derived class as member:
GdiplusStartupInput gdiplusStartupInput;
ULONG_PTR gdiplusToken;
At InitInstance(), add:
GdiplusStartup(&gdiplusToken, &gdiplusStartupInput, NULL);

// note: GdiplusStartup() should be added before the
// following sentence:
CWinApp::InitInstance();
4. Your application is ready to consume GDI+ now.
5. Upon exit, release GDI+ resources. Add the following line to ExitInstance():
GdiplusShutdown(gdiplusToken);

Thursday, April 3, 2008

Pidgin


Pidgin是一个能同时支持多个IM协议的即时通讯软件客户端,即可以使用它来同时登陆MSN、Yahoo!、Google Talk、ICQ、Sametime 等的即时通讯服务,而且可以同时登陆多个同类型的帐号。Pidgin的前身是鼎鼎大名的Gaim,它一直是Linux系统中最受欢迎的IM客户端,Pidgin不仅有Linux版,而且还有Windows版,所以Windows的用户同样可以享用这个很棒的、免费的、而且没有任何广告的软件。

使用中文版Pidgin

在Windows中第一次启动Pidgin的时候,会发现显示的都是英文,而且找不到设置中文的地方,但只要简单地配置一下,就能把中文显示出来。
  1. 设置环境变量:PIDGINLANG=zh_CN
  2. 运行regedit进入Windows注册表,找到HKEY_CURRENT_USER\Software\pidgin,将Installer Language键设置为2052即可(通常初始值为1033)。
解决Pidgin中文显示乱码问题

在使用中,有可能会发现中文显示成乱码的现象,可以下载gtkrc.zh_CN.utf-8,将它解压后放在x:Program Files\Common Files\GTK\2.0\etc\gtk-2.0文件夹下即可。而如果收到的消息是乱码,只要在主窗口菜单“工具”->“首选项”对话框中选中“对话”选项卡,取消“收到的消息显示格式”选项就可以了。

关于用Pidgin登陆QQ

Pidgin登录QQ时,有时会遇到中文输入变慢,甚至整个系统都会变慢,接收消息时更是显得系统接近崩溃。虽然这种情况并不是每次都会发生,但对于QQ爱好者无疑是一个噩梦。幸好我已经很久不用QQ了。

Pidgin 更新的速度还是很快的,所以以上的问题也许很快就会随着新版本的推出而消失,以后使用pidgin会变得更加容易。

Monday, March 31, 2008

Constructor Initialization List

Look at this piece of code, is it strange to you?
class A
{
private:
size_t i_;

public:
A( size_t i ): i_( i ) { };
};
Does the constructor look strange? In fact, it has no problem at all. It's different to the following constructor:
A( size_t i )
{
i_ = i;
}
Because in the first case the value of i_ will be set before entering constructor, while in the second case the value of i_ will be undetermined when the constructor is created.
You should always use a constructor list if possible as it is much more efficient than constructing ( ie default constructor) and then assigning. One important thing to remember is that the elements in your constructor list are initialized in the order that they were declared, NOT the order you write them, so:
class A
{
private:
int i_;
int j_;

public:
A( int i ): j_( i ), i_( 2 * j_ ) { }
};
It is undefined behaviour since i_ is constructed before j_, so at the point the program executes 2 * j_, j_ does not exist. However,
class A
{
int i_;
int j_;

public:
A( int i ): j_( 2 * i_ ), i_( i ) { }
};
It is absolutely fine, but it is confusing for a human to read, because it looks like it is being done in the wrong order. Because of this, when writing constructors, an excellent habit to get in to is to write the variables in the same order as you have declared them. Most of the time it makes no difference, but every now and again it will save you from creating a rather subtle bug.