<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-3087498582530016155</id><updated>2011-11-27T15:59:39.858-08:00</updated><category term='dark'/><category term='fs'/><category term='emacs programming'/><category term='抄袭 知识产权'/><category term='design interface'/><category term='时钟 源代码 qt3'/><category term='C'/><category term='大观园 世界公园 北京'/><category term='中国人'/><category term='八皇后'/><category term='CMU'/><category term='android eabi'/><category term='Job'/><category term='minix'/><category term='两会'/><category term='计算机算法'/><category term='电影'/><category term='emerald'/><category term='git'/><category term='python'/><category term='randy'/><category term='算法'/><category term='c++ parser open source compilar'/><category term='情怀'/><category term='电影 色戒'/><category term='emacs lucida wenquanyi 编程字体'/><category term='linux'/><category term='person'/><category term='ssh openssh linux'/><category term='emacs'/><category term='日常琐事'/><category term='music'/><category term='world'/><category term='dream'/><category term='离别 毕业 工作 家乡'/><category term='fs note'/><category term='emacs git git-mode'/><category term='firefox wqy ubuntu fonts'/><category term='Open Source'/><category term='pausch'/><category term='73729'/><category term='生活'/><category term='未来'/><category term='android'/><category term='blogger'/><category term='software'/><category term='color'/><category term='compilar'/><category term='小女孩 火柴 文涛拍案 大雪 春运 杜登勇'/><category term='bison c++ 康师傅'/><category term='design'/><category term='北京 恭王府 北海公园 旅游'/><category term='ubuntu'/><category term='西岭雪山'/><title type='text'>Start Shift</title><subtitle type='html'>Recording some thinging about programming, and work note.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default?start-index=101&amp;max-results=100'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>116</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-719518452970372443</id><published>2010-03-10T05:43:00.000-08:00</published><updated>2010-03-10T05:43:50.018-08:00</updated><title type='text'>Forward</title><content type='html'>这个博客停止更新， 请到 &lt;a href="http://www.thinksrc.com/"&gt;www.thinksrc.com&lt;/a&gt; 查看最新的内容。&lt;br /&gt;&lt;br /&gt;This blogger is stop update, please go &lt;a href="http://www.thinksrc.com/"&gt;www.thinksrc.com&lt;/a&gt; for updates.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-719518452970372443?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/719518452970372443/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=719518452970372443' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/719518452970372443'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/719518452970372443'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2010/03/forward.html' title='Forward'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-6400489851328916776</id><published>2009-11-29T13:56:00.000-08:00</published><updated>2010-03-05T20:28:13.184-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='fs'/><category scheme='http://www.blogger.com/atom/ns#' term='minix'/><title type='text'>一个c语言小技巧，摘自minix fs</title><content type='html'>&lt;p&gt;我说的小技巧就是最后的那句 err |= minix_sync_inode(inode);&lt;/p&gt; &lt;p&gt;真是懒的可以，Linus真是惜行如jing啊， 前面的错误检测和后面的都一并检查了，不过这里也有一个前提，就是 sync_mapping_buffers错误了，调用minix_sync_inode也不会导致更严重的问题。&lt;/p&gt; &lt;p&gt;学习学习。。。&lt;/p&gt; &lt;br/&gt;&lt;pre&gt;&lt;br/&gt;&lt;br/&gt;int minix_sync_file(struct file * file, &lt;br/&gt;struct dentry *dentry, int datasync)&lt;br/&gt;{&lt;br/&gt; struct inode *inode = dentry-&amp;gt;d_inode;&lt;br/&gt; int err;&lt;br/&gt;&lt;br/&gt; err = sync_mapping_buffers(inode-&amp;gt;i_mapping);&lt;br/&gt; if (!(inode-&amp;gt;i_state &amp;amp; I_DIRTY))&lt;br/&gt;  return err;&lt;br/&gt; if (datasync &amp;amp;&amp;amp; !(inode-&amp;gt;i_state &amp;amp; I_DIRTY_DATASYNC))&lt;br/&gt;  return err;&lt;br/&gt; &lt;br/&gt; err |= minix_sync_inode(inode);&lt;br/&gt; return err ? -EIO : 0;&lt;br/&gt;}&lt;br/&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-6400489851328916776?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/6400489851328916776/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=6400489851328916776' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/6400489851328916776'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/6400489851328916776'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/11/cminix-fs.html' title='一个c语言小技巧，摘自minix fs'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-5652011249670985129</id><published>2009-11-29T10:00:00.000-08:00</published><updated>2010-03-05T20:28:13.175-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='算法'/><category scheme='http://www.blogger.com/atom/ns#' term='fs note'/><title type='text'>About File system logging</title><content type='html'>&lt;p&gt;This is a note @MIT OCW 6.824 Lecture 7:&lt;/p&gt; &lt;p&gt;The main point of a log is make complex operations atomic.&lt;/p&gt; &lt;p&gt;I.e. operations that involve many individule writes. You want all writes or none, even if a crash in the middle.&lt;/p&gt; &lt;p&gt;A "transaction" is multi-write operation that should be atomic. The logging system needs to know which set of write from a transication.&lt;/p&gt; &lt;p&gt;Re-do with checkpoint:&lt;/p&gt; &lt;p&gt;Most logs work like this, e.g. FSD, &lt;br/&gt;allows much faster recovery: ca use on-disk data &lt;br/&gt;write-ahead rule:&lt;/p&gt; &lt;blockquote style="MARGIN-RIGHT: 0px" dir="ltr"&gt; &lt;p&gt;delay flushing dirty block from in-memory data cache until corresponding commit recore is on disk&lt;/p&gt; &lt;/blockquote&gt; &lt;p style="MARGIN-RIGHT: 0px" dir="ltr"&gt;Check point rules:&lt;/p&gt; &lt;blockquote style="MARGIN-RIGHT: 0px" dir="ltr"&gt; &lt;p style="MARGIN-RIGHT: 0px" dir="ltr"&gt;all data writes before check point must be stable on disk checkpoint may not advance beyond first uncommitted Begin&lt;/p&gt; &lt;/blockquote&gt; &lt;p style="MARGIN-RIGHT: 0px" dir="ltr"&gt;Recovery:&lt;/p&gt; &lt;blockquote style="MARGIN-RIGHT: 0px" dir="ltr"&gt; &lt;p style="MARGIN-RIGHT: 0px" dir="ltr"&gt;for each block mentioned in the log &lt;br/&gt;find the last xaction that wrote that block &lt;br/&gt;if committed: re-do &lt;br/&gt;if not committed: un-do&lt;/p&gt; &lt;/blockquote&gt; &lt;p style="MARGIN-RIGHT: 0px" dir="ltr"&gt;Why is logging fast:&lt;/p&gt; &lt;blockquote style="MARGIN-RIGHT: 0px" dir="ltr"&gt; &lt;p style="MARGIN-RIGHT: 0px" dir="ltr"&gt;group commit -- batched log writes. &lt;br/&gt;could delay flushing log -- may lost committed transactions but at least you have a prefix.&lt;/p&gt; &lt;p style="MARGIN-RIGHT: 0px" dir="ltr"&gt;Single seek to implement a transaction. &lt;br/&gt;maybe less if no intervening disk activity, or group commit&lt;/p&gt; &lt;p style="MARGIN-RIGHT: 0px" dir="ltr"&gt;Write-behind of data allows batched/schedules. &lt;br/&gt;one data block may reflect many transactions, i.e. create many files in a directory. &lt;br/&gt;don't have to be so careful since the log is the real infomation.&lt;/p&gt; &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-5652011249670985129?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/5652011249670985129/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=5652011249670985129' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5652011249670985129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5652011249670985129'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/11/about-file-system-logging.html' title='About File system logging'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-1825725373388658275</id><published>2009-11-29T09:09:00.000-08:00</published><updated>2010-03-05T20:28:13.165-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='算法'/><category scheme='http://www.blogger.com/atom/ns#' term='fs note'/><title type='text'>How can we avoid delete/create inconsistency?</title><content type='html'>&lt;p&gt;This is a file system note: @MIT 6.824 2006 Lecture 6&lt;/p&gt; &lt;p&gt;Think this satiation,&lt;/p&gt; &lt;p&gt;unlink("f1"); &lt;br/&gt;create("f2"); &lt;br/&gt;Create happens to re-use the i-node freed by the unlink. &lt;br/&gt;suppose only create write goes to disk, but none of the unlink's writes.&lt;/p&gt; &lt;p&gt;Crash.&lt;/p&gt; &lt;p&gt;After re-start, what does recovery see?&lt;/p&gt; &lt;p&gt;The file system looks correct! Nothing to fix! &lt;br/&gt;But file f1 actually has file f2's contents!&lt;/p&gt; &lt;p&gt;Serious *undetected* inconsisency.&lt;/p&gt; &lt;p&gt;This is *not* a state the file system counld have been in if the crash had occured slightly earlier or later. And fsck did not notify the user there was an unfixable problem!&lt;/p&gt; &lt;p&gt;&lt;em&gt;How can we avoid this delete/create inconsistency?&lt;/em&gt;&lt;/p&gt; &lt;p&gt;Observation: We only care about what's visible in the file system tree.&lt;/p&gt; &lt;p&gt;Goal: on-disk directory entry must always point to correct on-disk i-node.&lt;/p&gt; &lt;p&gt;Unlink Rule: remove dirent *on disk* before freeing i-node.&lt;/p&gt; &lt;p&gt;Create Rule: initialize new i-node *on disk* before creating directory entry.&lt;/p&gt; &lt;p&gt;In general, directory entry writes should be commit points. &lt;br/&gt;Crash just before leves us with unused allocated i-node. &lt;br/&gt;Crash just after is fine.&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-1825725373388658275?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/1825725373388658275/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=1825725373388658275' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/1825725373388658275'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/1825725373388658275'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/11/how-can-we-avoid-deletecreate.html' title='How can we avoid delete/create inconsistency?'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-6486482141303169258</id><published>2009-11-15T23:56:00.000-08:00</published><updated>2010-03-05T20:14:31.986-08:00</updated><title type='text'>感冒了，翻墙了</title><content type='html'>冬天气温降的很快，就连以往冬天不那么冷的广东，这次都很冷很冷了。我都感冒了， 不过不是猪流感。&lt;br /&gt;&lt;br /&gt;还有一件事就是使用ssh tunnel翻墙了，很爽阿。&lt;br /&gt;&lt;br /&gt;赞一个OpenSSH。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-6486482141303169258?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/6486482141303169258/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=6486482141303169258' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/6486482141303169258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/6486482141303169258'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/11/blog-post.html' title='感冒了，翻墙了'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-4256854459882136568</id><published>2009-10-29T03:51:00.000-07:00</published><updated>2010-03-05T20:28:13.151-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>real world FIND usage</title><content type='html'>from http://www.wagoneers.com/UNIX/FIND/find-usage.html&lt;br/&gt;&lt;br/&gt;&lt;br/&gt; sudo find / -type f -name *.jpg  -exec cp {} . \;&lt;br/&gt;&lt;br/&gt;find . -type f -size +10000 -exec ls -al {} \;&lt;br/&gt;find . -atime +1 -type f -exec mv {} TMP \; # mv files older then 1 day to dir TMP&lt;br/&gt;find . -name "-F" -exec rm {} \;   # a script error created a file called -F &lt;br/&gt;find . -exec grep -i "vds admin" {} \;&lt;br/&gt;find . \! -name "*.Z" -exec compress -f {} \;&lt;br/&gt;find . -type f \! -name "*.Z" \! -name ".comment" -print | tee -a /tmp/list&lt;br/&gt;find . -name *.ini&lt;br/&gt;find . -exec chmod 775 {} \;&lt;br/&gt;find . -user xuser1 -exec chown -R user2 {} \;&lt;br/&gt;find . -name ebtcom*&lt;br/&gt;find . -name mkbook&lt;br/&gt;find . -exec grep PW0 {} \;&lt;br/&gt;find . -exec grep -i "pw0" {} \;&lt;br/&gt;find . -atime +6&lt;br/&gt;find . -atime +6 -exec ll | more&lt;br/&gt;find . -atime +6 -exec ll | more \;&lt;br/&gt;find . -atime +6 -exec ll \;&lt;br/&gt;find . -atime +6 -exec ls \;&lt;br/&gt;find . -atime +30 -exec ls \;&lt;br/&gt;find . -atime +30 -exec ls \; | wc -l&lt;br/&gt;find . -name auth*&lt;br/&gt;find . -exec grep -i plotme10 {};&lt;br/&gt;find . -exec grep -i plotme10 {} \;&lt;br/&gt;find . -ls -exec grep 'PLOT_FORMAT 22' {} \;&lt;br/&gt;find . -print -exec grep 'PLOT_FORMAT 22' {} \;&lt;br/&gt;find . -print -exec grep 'PLOT_FORMAT' {} \;&lt;br/&gt;find . -print -exec grep 'PLOT_FORMAT' {} \;&lt;br/&gt;find ./machbook -exec chown 184 {} \;&lt;br/&gt;find . \! -name '*.Z' -exec compress {} \;&lt;br/&gt;find . \! -name "*.Z" -exec compress -f {} \;&lt;br/&gt;find /raid/03c/ecn -xdev -type f -print&lt;br/&gt;find /raid/03c/ecn -xdev -path -type f -print&lt;br/&gt;find / -name .ssh* -print | tee -a ssh-stuff&lt;br/&gt;find . -name "*font*"&lt;br/&gt;find . -name hpmcad*&lt;br/&gt;find . -name *fnt*&lt;br/&gt;find . -name hp_mcad* -print&lt;br/&gt;find . -grep Pld {} \;&lt;br/&gt;find . -exec grep Pld {} \;&lt;br/&gt;find . -exec grep Pld {} \;&lt;br/&gt;find . -exec grep PENWIDTH {} \; | more&lt;br/&gt;find . -name config.pro&lt;br/&gt;find . -name config.pro&lt;br/&gt;find /raid -type d ".local_sd_customize" -print&lt;br/&gt;find /raid -type d -name ".local_sd_customize" -print&lt;br/&gt;find /raid -type d -name ".local_sd_customize" -ok cp /raid/04d/MCAD-apps/I_Custom/SD_custom/site_sd_customize/user_filer_project_dirs {} \;&lt;br/&gt;find /raid -type d -name ".local_sd_customize" -exec cp /raid/04d/MCAD-apps/I_Custom/SD_custom/site_sd_customize/user_filer_project_dirs {} \;&lt;br/&gt;find . -name xeroxrelease&lt;br/&gt;find . -exec grep xeroxrelease {} \;&lt;br/&gt;find . -name xeroxrelease&lt;br/&gt;find . -name xeroxrelease* -print 2&gt;/dev/null&lt;br/&gt;find . -name "*release*" 2&gt;/dev/null&lt;br/&gt;find / -name "*xerox*" 2&gt;/dev/null&lt;br/&gt;find . -exec grep -i xeroxrelease {} \;&lt;br/&gt;find . -print -exec grep -i xeroxrelease {} \;&lt;br/&gt;find . -print -exec grep -i xeroxrelease {} \; &gt; xeroxrel.lis&lt;br/&gt;find . -exec grep -i xeroxrel {} \;&lt;br/&gt;find . -print -exec grep -i xeroxrel {} \;&lt;br/&gt;find . -print -exec grep -i xeroxrel {} \; | more&lt;br/&gt;find /raid/03c/inwork -xdev -type f -print &gt;&gt; /raid/04d/user_scripts/prt_list.tmp&lt;br/&gt;find . -exec grep '31.53' {} \;&lt;br/&gt;find . -ls -exec grep "31/.53" {} \; &gt; this.lis&lt;br/&gt;find . -print -exec grep "31/.53" {} \; &gt; this.lis&lt;br/&gt;find . -print -exec grep 31.53 {} \; &gt; this.lis&lt;br/&gt;find . -exec grep -i pen {} /;&lt;br/&gt;find . -exec grep -i pen {} \;&lt;br/&gt;find . -print -exec grep -i pen {} \; | more&lt;br/&gt;find . -exec grep -i pen {} \;&lt;br/&gt;find . -atime +6 -exec ll | more \;&lt;br/&gt;find . -atime +6 -exec ll \;&lt;br/&gt;find . -atime +6 -exec ls \;&lt;br/&gt;find . -atime +30 -exec ls \;&lt;br/&gt;find . -atime +30 -exec ls \; | wc -l&lt;br/&gt;find . \! -name '*.Z' -exec compress -f {} \;&lt;br/&gt;find . -name 'cache*' -depth -exec rm {} \;&lt;br/&gt;find . -name 'cache*' -depth -print | tee -a /tmp/cachefiles&lt;br/&gt;find . -name 'cache[0-9][0-9]*' -depth -print | tee -a /tmp/cachefiles&lt;br/&gt;find . -name 'hp_catfile' 'hp_catlock' -depth -print | tee -a /tmp/hp.cats&lt;br/&gt;find . -name 'hp_catfile' -name 'hp_catlock' -depth -print | tee -a /tmp/hp.cats&lt;br/&gt;find . -name 'hp_cat*' -depth -print | tee -a /tmp/hp.cats&lt;br/&gt;find . -name 'hp_cat[fl]*' -depth -print | tee -a /tmp/hp.cats&lt;br/&gt;find /raid -name 'hp_cat[fl]*' -depth -print&lt;br/&gt;find . \! -name '*.Z' -exec compress -f {} \;&lt;br/&gt;find . -name '*' -exec compress -f {} \;&lt;br/&gt;find . -xdev -name "wshp1*" -print&lt;br/&gt;find . -xdev -name "wagoneer*" -print&lt;br/&gt;find . -name "xcmd" -depth -print&lt;br/&gt;find /usr/contrib/src -name "xcmd" -depth -print&lt;br/&gt;find /raid -type d -name ".local_sd_customize" -exec ls {} \; &lt;br/&gt;find /raid -type d -name ".local_sd_customize" \&lt;br/&gt;   -exec cp /raid/04d/MCAD-apps/I_Custom/SD_custom/site_sd_customize/user_filer_project_dirs {} \;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-4256854459882136568?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/4256854459882136568/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=4256854459882136568' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4256854459882136568'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4256854459882136568'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/10/real-world-find-usage.html' title='real world FIND usage'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-8035550459382643484</id><published>2009-10-20T06:28:00.000-07:00</published><updated>2010-03-05T20:28:12.873-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>All about container_of</title><content type='html'>对一个这个宏的不理解导致了几个晚上的熬夜。写代码的时候一定不能迷糊阿！&lt;br/&gt;&lt;br/&gt;这个是Linux kernel里面的宏， 作用大概如下， 现在你有一个&lt;br/&gt;&lt;br/&gt;&lt;pre&gt;&lt;br/&gt;struct big{ &lt;br/&gt;struct small sname_in_big; &lt;br/&gt;int some_else&lt;br/&gt;};&lt;br/&gt;&lt;br/&gt;struct small｛｝&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;&lt;br/&gt;然后有一个函数， 传入参数只有一个＊small， 比如&lt;br/&gt;&lt;pre&gt;&lt;br/&gt;void some_func(struct small *s);&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;&lt;br/&gt;在这个函数里面， 你想作这么一件事情， 想得到那个int some_else的值是多少， 而你的函数只有一个struct small* 的参数， 所以kernel里面就有这么一个函数可以帮你获得 struct big的指针。&lt;br/&gt;就是container_of&lt;br/&gt;在这个函数里面可以这样用：&lt;br/&gt;&lt;pre&gt; void some_func(struct small *s) {&lt;br/&gt;struct big *b;&lt;br/&gt;b = container_of (s, struct big, sname_in_big);&lt;br/&gt;}&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;不过， 还有一个更重要的前提。 就是， 这个函数的参数的这个s，必须是struct big的一部分。 也就是说， 必须有这样一个步骤， struct big a; a.sname_in_big = some_small.&lt;br/&gt;some_func(&amp;a.sname_in_big);&lt;br/&gt;才可以找到big的正确的地址。 &lt;br/&gt;&lt;br/&gt;这里的解释更详细：&lt;br/&gt;http://www.kroah.com/log/linux/container_of.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-8035550459382643484?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/8035550459382643484/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=8035550459382643484' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8035550459382643484'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8035550459382643484'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/10/all-about-containerof.html' title='All about container_of'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-934057459874515785</id><published>2009-10-15T05:51:00.000-07:00</published><updated>2010-03-05T20:28:12.860-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>一个世纪前《纽约时报》对李鸿章的采访</title><content type='html'>&lt;h2 class="entry-title"&gt;&lt;a class="entry-title-link" href="http://bloooooooogger.blogspot.com/2009/09/blog-post_9632.html" target="_blank"&gt;一个世纪前《纽约时报》对李鸿章的采访&lt;/a&gt;&lt;/h2&gt;&lt;br/&gt;&lt;div class="entry-author"&gt;&lt;span class="entry-source-title-parent"&gt;from &lt;a class="entry-source-title" href="https://www.google.com/reader/view/feed/http%3A%2F%2Ffeeds.feedburner.com%2Fbloooooooogger" target="_blank"&gt;8个圈圈的Blogger&lt;/a&gt;&lt;/span&gt; &lt;span class="entry-author-parent"&gt;by &lt;span class="entry-author-name"&gt;坚硬的泡沫&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;br/&gt;---------- Forwarded message ----------&lt;br/&gt;From:&lt;br/&gt;tombkeeper的和谐Blog&lt;br/&gt;&lt;br/&gt;via &lt;a href="http://hi.baidu.com/" target="_blank"&gt;hi.baidu.com&lt;/a&gt; on 9/23/09&lt;br/&gt;一个世纪前《纽约时报》对李鸿章的采访&lt;br/&gt;2009-09-24 08:58&lt;br/&gt;&lt;br/&gt;离开在欧洲考察访问的最后一站英国后，大清帝国前直隶总督兼北洋大臣李鸿章乘"圣-路易斯"号邮轮于当地时间&lt;br/&gt;1896年8月28日抵达美国纽约，开始对美国进行访问。李鸿章在美国受到了美国总统克利夫兰的接见，并和美国一些要员及群众见面，受到了"史无前例的礼遇"（《纽约时报》）。9月2日上午9时许，李鸿章在纽约华尔道夫饭店接受了记者的采访。&lt;br/&gt;&lt;br/&gt;●美国记者：尊敬的阁下，您已经谈了我们很多事情，您能否告诉我们，什么是您认为我们做得不好的事的呢？&lt;br/&gt;&lt;br/&gt;●李鸿章：我不想批评美国，我对美国政府给予我的接待毫无怨言，这些都是我所期待的。只是一件事让我吃惊或失望，那就是你们国家有形形色色的政党存在，而我只对其中一部分有所了解。其他政党会不会使国家出现混乱呢？你们的报纸能不能靠国家利益将各个政党联合起来呢？&lt;br/&gt;&lt;br/&gt;●美国记者：那么阁下，您在这个国家的所见所闻中什么最使您最感兴趣呢？&lt;br/&gt;&lt;br/&gt;●李鸿章：我对我在 美国见到的一切都很喜欢，所有事情都让我高兴。最使我感到惊讶的是20层或更高一些的摩天大楼，我在中国和欧洲从没见过这种高楼。这些楼看起来建得很牢&lt;br/&gt;固，能抗任何狂风吧？但中国不能建这么高的楼房，因台风会很快把它吹倒，而且高层建筑若没有你们这样好的电梯配套也很不方便。&lt;br/&gt;&lt;br/&gt;●美国记者：阁下，您赞成贵国的普通百姓都接受教育吗？&lt;br/&gt;&lt;br/&gt;●李鸿章：我们的习惯是送所有男孩上学。我们有很好的学校，但只得付得起学费的富家子弟才能上学，穷人家的孩子没有机会上学。但是，我们现在还没有你们这么多的学校和学堂，我们计划将来在国内建立更多的学校。&lt;br/&gt;&lt;br/&gt;●美国记者：阁下，您赞成妇女接受教育吗？&lt;br/&gt;&lt;br/&gt;●李鸿章（停顿一会 儿）：在我们清国，女孩在家中请女教师提供教育，所有有经济能力的家庭都会雇请女家庭教师。我们现在还没有女子就读的公立学校，也没有更高一级的教育机&lt;br/&gt;构。这是由于我们的风俗习惯与你们（包括欧洲和美国）不同，也许我们应该学习你们的教育制度，并将最适合我们国情的那种引入国内，这确是我们所需要的。&lt;br/&gt;&lt;br/&gt;●记者：总督阁下，您期待对现存的排华法案进行任何修改吗？&lt;br/&gt;&lt;br/&gt;●李鸿章：我知道， 你们又将进行选举了，新政府必然会在施政上有些变化。因此，我不敢在修改法案前发表任何要求废除《格利法》的言论，我只是期望美国新闻界能助清国移民一臂&lt;br/&gt;之力。我知道报纸在这个国家有很大的影响力，希望整个报界都能帮助清国侨民，呼吁废除排华法案，或至少对《格利法》进行较大修改。&lt;br/&gt;&lt;br/&gt;●美国记者：阁下，您能说明选择经加拿大而非美国西部回国路线的理由吗？是不是您的同胞在我国西部一些地区没有受到善待？&lt;br/&gt;&lt;br/&gt;●李鸿章：我有两个原因不愿经过美国西部各州。&lt;br/&gt;&lt;br/&gt;第一，当我在清国北方港口城市担任高官时，听到了很多加州清国侨民的抱怨。这些抱怨表明，清国人在那里未能获得&lt;br/&gt;美国宪法赋予他们的权利，他们请求我帮助他们使他们的美国移民身份得到完全承认，并享受作为美国移民所应享有的权利。而你们的《格利法》不但不给予他们与&lt;br/&gt;其他国家移民同等的权利，还拒绝保障他们合法的权益，因此我不希望经过以这种方式对待我同胞的地方，也不打算接受当地华人代表递交的要求保证他们在西部各&lt;br/&gt;州权益的请愿信。&lt;br/&gt;&lt;br/&gt;第二，当我还是一名优秀的水手时，就知道必须学会自己照顾自己。我比别人年纪要大好多岁，从温哥华回国的航程要比从旧金山出发更短些。我现在才知道，清国"皇后号"船体宽阔舒适，在太平洋的所有港口都难以找到如此之好的远洋客船。&lt;br/&gt;&lt;br/&gt;排华法案是世界上最不公平的法案。所有的政治经济学家都承认，竞争促使全世界的市场迸发活力，而竞争既适用于商&lt;br/&gt;品也适用于劳动力。我们知道，《格利法》是由于受到爱尔兰裔移民欲独霸加州劳工市场的影响，因为清国人是他们很强的竞争对手，所以他们想排除华人。如果我&lt;br/&gt;们清国也抵制你们的产品，拒绝购买美国商品，取消你们的产品销往清国的特许权，试问你们将作何感想呢？不要把我当成清国什么高官，而要当成一名国际主义&lt;br/&gt;者，不要把我当成达官贵人，而要当作清国或世界其他国家一名普通公民。请让我问问，你们把廉价的华人劳工逐出美国究竟能获得什么呢？廉价劳工意味着更便宜&lt;br/&gt;的商品，顾客以低廉价格就能买到高质量的商品。&lt;br/&gt;&lt;br/&gt;你们不是很为你们作为美国人自豪吗？你们的国家代表着世界上最高的现代文明，你们因你们的民主和自由而自豪，但&lt;br/&gt;你们的排华法案对华人来说是自由的吗？这不是自由！因为你们禁止使用廉价劳工生产的产品，不让他们在农场干活。你们专利局的统计数据表明，你们是世界上最&lt;br/&gt;有创造力的人，你们发明的东西比任何其他国家的总和都多。在这方面，你们走在了欧洲的前面。因为你们不限制你们在制造业方面的发展，搞农业的人不限于搞农&lt;br/&gt;业，他们还将农业、商业和工业结合了起来。你们不象英国，他们只是世界的作坊。你们致力于一切进步和发展的事业。在工艺技术和产品质量方面，你们也领先于&lt;br/&gt;欧洲国家。但不幸的是，你们还竞争不过欧洲，因为你们的产品比他们的贵。这都是因为你们的劳动力太贵，以致生产的产品因价格太高而不能成功地与欧洲国家竞&lt;br/&gt;争。劳动力太贵，是因为你们排除华工。这是你们的失误。如果让劳动力自由竞争，你们就能够获得廉价的劳力。华人比爱尔兰人和美国其他劳动阶级都更勤俭，所&lt;br/&gt;以其他族裔的劳工仇视华人。&lt;br/&gt;&lt;br/&gt;我相信美国报界能帮助华人一臂之力，一取消排华法案。&lt;br/&gt;&lt;br/&gt;●美国记者：美国资本在清国投资有什么出路吗？&lt;br/&gt;&lt;br/&gt;●李鸿章：只有将货币、劳动力和土地都有机地结合起来，才会产生财富。清国政府非常高兴地欢迎任何资本到我国投资。我的好朋友格兰特将军曾对我说，你们必须要求欧美资本进入&lt;br/&gt;清国以建立现代化的工业企业，帮助清国人民开发利用本国丰富的自然资源。但这些企业的管理权应掌握在清国政府手中。我们欢迎你们来华投资，资金和技工由你&lt;br/&gt;们提供。但是，对于铁路、电讯等事物，要由我们自己控制。我们必须保护国家主权，不允许任何人危及我们的神圣权力。我将牢记格兰特将军的遗训，所有资本，&lt;br/&gt;无论是美国的还是欧洲的，都可以自由来华投资。&lt;br/&gt;&lt;br/&gt;●美国记者：阁下，您赞成将美国的或欧洲的报纸介绍到贵国吗？&lt;br/&gt;&lt;br/&gt;●李鸿章：中国办有 报纸，但遗憾的是中国的编辑们不愿将真相告诉读者，他们不像你们的报纸讲真话，只讲真话。中国的编辑们在讲真话的时候十分吝啬，他们只讲部分的真实，而且&lt;br/&gt;他们的报纸也没有你们报纸这么大的发行量。由于不能诚实地说明真相，我们的报纸就失去了新闻本身的高贵价值，也就未能成为广泛传播文明的方式了。&lt;br/&gt;________________________________&lt;br/&gt;一个世纪，对个人来说差不多就是永远；而对人类社会的巨大惯性来说，百年时间所提供的摩擦力又是多么有限。&lt;br/&gt;类别：网文收集 copy and paste 浏览(171) 评论 (3)&lt;br/&gt;&lt;br/&gt;网友评论：&lt;br/&gt;1&lt;br/&gt;网友:underclass.h&lt;br/&gt;2009-09-24 09:42 回复&lt;br/&gt;我 只是以非常中立观点发表这个评论,其实末代中兴大臣,都有缺一个领袖.胡适曾指出：中国形成一个领袖不容易，如果因张学良出现不幸，中国将倒退20年， 是"国家民族之罪人".不过这的确成就另一个领袖,只是,一将功成万骨枯,正好你所说,摩擦力是有限的,要改变的终究改变了,现在不比以往的时代差.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-934057459874515785?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/934057459874515785/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=934057459874515785' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/934057459874515785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/934057459874515785'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/10/blog-post_15.html' title='一个世纪前《纽约时报》对李鸿章的采访'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-828065075386839714</id><published>2009-10-14T12:40:00.000-07:00</published><updated>2010-03-05T20:28:12.847-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='中国人'/><title type='text'>[转]叮叮整理：《动物农庄》人物情节对照</title><content type='html'>&lt;h1&gt;&lt;span&gt; &lt;a href="http://www.douban.com/people/1739354/" target="_blank"&gt;来自，叮叮&lt;/a&gt;&lt;br/&gt;&lt;/span&gt;&lt;/h1&gt;&lt;br/&gt;故事梗概：农场里的一头猪在提出了“人类剥削牲畜，牲畜须革命”的理论之后死去，若干年后农场里掀起了一场由猪领导的革命，原来的剥削者——农场主被赶 走，牲畜们实现了“当家作主”的愿望，尝到了革命果实的甘美，农场更名为“动物庄园”并且制定了庄园的宪法——七戒。但不久领导革命的猪们发生了分裂，一 头猪被宣布为革命的敌人，此后，获取了领导权的猪拥有了越来越大的权力和越来越多的特别待遇，逐渐脱离了其他动物，最终蜕变成为和人类完全一样的牲畜剥削 者，动物庄园的名字也被放弃。&lt;br/&gt;&lt;br/&gt;　　长者（Old Major）——猪，提出了动物主义的思想，向动物们启蒙，要他们为动物的解放奋斗影射马克思恩格斯和列宁&lt;br/&gt;　　雪球（Snowball）——猪，动物庄园革命的领导者之一，后被驱逐并宣布为革命的敌人，影射托洛斯基&lt;br/&gt;　　拿破仑（Napoleon）——猪，动物庄园革命的领导者之一，后来成为庄园的领袖，影射斯大林&lt;br/&gt;　　拳击手（Boxer）——马，动物主义理念的忠实追随者，积极响应革命领袖的号召，后被拿破仑卖给宰马商，象征着相信“革命理论”的广大善良群众及工人阶级。&lt;br/&gt;　　本杰明（Benjamin）——驴，对拿破仑的所作所为始终抱有怀疑但明哲自保，象征有独立思想对极权主义有所怀疑但明哲保身的知识分子&lt;br/&gt;　　无名的很多狗（dogs）——拿破仑在动物庄园实施暴力统治的工具，象征极权主义国家的各种暴力机构。内务部、克格勃。&lt;br/&gt;　　琼斯先生（Mr Jones）——沙皇尼古拉二世。被动物赶出庄园，反扑过一次，影射苏联内战。&lt;br/&gt;　　母鸡（hens）——农民阶级。小说中拿破仑强迫鸡群每天多下几百个蛋，可以看作比喻斯大林的农业合作化。&lt;br/&gt;　　莫莉（Mollie）——革命前的中上层阶级。莫莉在革命刚几天就逃跑可以看作俄罗斯旧贵族和上层在革命后&lt;br/&gt;　　纷纷流亡的映射。&lt;br/&gt;　　尖嗓子（squealer）——拿破仑的发言人。指斯大林政策导向的维护者、以正统的舆论麻痹人民的走狗。&lt;br/&gt;　　渡鸦摩西（raven Moses）——东正教廷&lt;br/&gt;　　羊群（sheep）——盲目迷信斯大林的人，包括党员与普通人&lt;br/&gt;　　猫（cats）——投机者的形象，而没有具体的原形。&lt;br/&gt;　　温普尔先生（Mr. whymper）——替斯大林向西方宣传的知识分子。&lt;br/&gt;　　四只小猪——共产党内不服从斯大林，并在大清洗中被处决的一批人。主要代表为布哈林等。四只小猪在审判时毫不抗拒、完全认罪在《&lt;strong style="color: black; background-color: #ffff66;"&gt;动物农场&lt;/strong&gt;》里缺乏情节上的合理性，可以认定是按照当时莫斯科三次审判写成的。这三次审判里所有被告均当堂认罪，痛骂自己、赞扬斯大林。&lt;br/&gt;&lt;br/&gt;　　　琼斯先生被赶出农场——沙皇尼古拉二世被赶出俄国&lt;br/&gt;　　　摩西在琼斯被赶走以后失踪——东正教廷在苏联建立后被压制、毁灭。&lt;br/&gt;　　　拿破仑赶走雪球——斯大林赶走托洛茨基&lt;br/&gt;　　　拿破仑建议积极保卫农场 – 雪球建议在全英国策动动物暴动：——斯大林建议积极建设保卫苏联，托洛茨基建议在全世界策动共产主义革命。&lt;br/&gt;　　　雪球建议修建风车——托洛茨基建议建设第一个五年计划&lt;br/&gt;　　　拿破仑修改历史，让动物们相信是他提议修建风车：——斯大林修改历史，说是他第一个提出五年计划。&lt;br/&gt;　　　拿破仑妖魔化雪球，把一切罪责推到雪球身上，在动物中间抓内奸——斯大林妖魔化托洛茨基，在苏联以反对托派为名镇压异己。&lt;br/&gt;　　　拿破仑修改历史，一次次给雪球的罪行加码——斯大林修改历史，先说托洛茨基是“犯了错误”，然后说他1935年投靠德国，再说托洛茨基从1921就是德国间谍。&lt;br/&gt;　　　摩西回到农场——斯大林对德作战期间利用东正教廷作为动员士气的工具。刘晓波据此写的有一篇文章，专论斯大林对宗教的实用主义政策。&lt;br/&gt;　　　拿破仑修改七条约定——斯大林不断修改历史。被清洗掉的人和事往往从所有记录里消失。&lt;br/&gt;　　　拿破仑与猪们住进屋子——革命胜利后苏联G_c_D不断腐化，专为领导特供的商店、汽车、住房。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-828065075386839714?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/828065075386839714/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=828065075386839714' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/828065075386839714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/828065075386839714'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/10/blog-post_14.html' title='[转]叮叮整理：《动物农庄》人物情节对照'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-8676562791329080209</id><published>2009-10-08T09:59:00.000-07:00</published><updated>2010-03-05T20:28:12.832-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>Google Picasa访问浏览的另类方法</title><content type='html'>[转自 http://www.hzhjun.cn/post/googlePicasa.html]&lt;br/&gt;&lt;br/&gt;关于gg被和谐的事，相信很多人都晓得，但受祸的不止是gg，还有其用户。&lt;br/&gt;&lt;br/&gt;前段时间突然找不到右上角的登录链接，着实郁闷了下，虽然我不常登录，但需要的时候却没了，后来才知道进入其他频道是可以登录的；再就是Picasa网络相册，前脚上传了照片，紧接着就不让看，莫名其妙的打不开链接。。。&lt;br/&gt;&lt;br/&gt;好在网络上传出了一种方法，通过配置Hosts可以在本地查看，操作如下：&lt;br/&gt;&lt;br/&gt;在C:\WINDOWS\system32\drivers\etc找到hosts文件，将下面内容复制粘贴：&lt;br/&gt;&lt;pre&gt;203.208.39.104 picadaweb.google.com&lt;br/&gt;203.208.39.104 lh1.ggpht.com&lt;br/&gt;203.208.39.104 lh2.ggpht.com&lt;br/&gt;203.208.39.104 lh3.ggpht.com&lt;br/&gt;203.208.39.104 lh4.ggpht.com&lt;br/&gt;203.208.39.104 lh5.ggpht.com&lt;br/&gt;203.208.39.104 lh6.ggpht.com&lt;/pre&gt;&lt;br/&gt;保存后即可正常使用，不过只能在本地访问；欲知效果如何，那就赶快动手一试。。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-8676562791329080209?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/8676562791329080209/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=8676562791329080209' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8676562791329080209'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8676562791329080209'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/10/google-picasa.html' title='Google Picasa访问浏览的另类方法'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-5272855731395356252</id><published>2009-10-08T04:27:00.000-07:00</published><updated>2010-03-05T20:28:12.426-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>有一个误传甚广的故事</title><content type='html'>&lt;h2 class="item-title"&gt;&lt;br/&gt;&lt;div&gt;&lt;a href="http://www.google.com/reader/item/tag:google.com,2005:reader/item/49d6701dee83771e"&gt;有一个流传甚广的故事 &lt;/a&gt;&lt;/div&gt;&lt;/h2&gt;&lt;br/&gt;&lt;div class="item-info"&gt;by &lt;a class="f" href="http://www.google.ca/reader/shared/02003065472464080742"&gt;Akkad&lt;/a&gt; on 07/09/09&lt;/div&gt;&lt;br/&gt;有一个流传甚广的故事： 美国航天部门首次准备将宇航员送上太空，但他们很快接到报告，宇航员在失重状态下用圆珠笔、钢笔根本写不出字来。于是，他们用了10年时间，花费120亿 美圆，科学家们终于发明了一种新型圆珠笔。这种笔适用于失重状态、身体倒立、水中、任何平面物体，甚至在摄氏零下300度也能书写流利。 而俄罗斯人在太空中一直使用铅笔。”&lt;br/&gt;&lt;br/&gt;这个故事想告诉人们，有时看上去很复杂的问题，其实有极简单的现成解决办法。这当然是很有教育意义的，可惜它是捏造出来的。总结一下这个故事的错误：&lt;br/&gt;1，美国宇航员也用过铅笔。&lt;br/&gt;2，铅笔并不适合太空中使用，尖头有危险，易燃，书写产生的石墨残渣容易进入宇航员的胸腔、眼睛，更容易使电子设备短路（石墨是良导体）。&lt;br/&gt;3，太空笔是一家私人企业发明的，据说耗资一百多万美元。&lt;br/&gt;4，这种太空笔不但能在失重的情况下使用，还能在极端温度下使用。&lt;br/&gt;5，失重笔不但想出了用氮气产生压力，而且还改革了油墨和笔尖，使得这种笔不写的时候不漏油。&lt;br/&gt;6，太空笔发明出来以后，无论是美国宇航局还是俄罗斯宇航局都购买了。&lt;br/&gt;7，找不到零下300摄氏度这样的环境（开尔文0度达不到-300摄氏度），这个杜撰的故事本身就有科学错误。&lt;br/&gt;&lt;br/&gt;早期的宇航员都使用铅笔，并不是因为接受了小学生的建议，而是因为钢笔、圆珠笔在失重条件下都无法使用，铅笔是惟一的选择。但是铅笔笔芯有时候会断，在失 重的环境中飘浮，会飘进鼻子、眼睛中，或飘进电器中引起短路，成了危险品。此外，铅笔的笔芯和木头在纯氧的环境中还会极易燃烧。 因发明了圆珠笔通用笔芯而发了大财的保罗·费舍尔，意识到宇航员使用安全、可靠的书写工具的迫切性，自掏腰包进行研制，花了两年时间和约两百万元费用后， 于1965年研制成了能在太空环境下使用的圆珠笔———太空笔。其原理很简单，采用密封式气压笔芯，上部充有氮气(氮气是不活跃气体，一般条件下不会助 燃)，靠气体压力把油墨推向笔尖。经过严格的测试后，太空笔被美国宇航局采用。1967年12月，费舍尔以每枝2.95美元的价格把400枝太空笔卖给美 国宇航局。 1969年7月20日，太空笔跟随阿姆斯特朗和奥尔德林上了月球，并救了他们的命。阿姆斯特朗和奥尔德林在月球表面完成历史性漫步，回到登月舱准备离开 时，发现发动机的塑料手动开关被宇航服的背囊碰断，无法启动发动机向地面指挥中心求援。他们需要拨动开关中一个细小的金属条，为了减轻重量，他们已抛弃了 所有的工具。地面指挥中心的一名工程师灵机一动，建议他们用太空笔试试。奥尔德林掏出太空笔，缩回笔芯，用笔的中空尾端拨动了开关，成功地启动了登月舱的 发动机。 太空笔是全天候的圆珠笔，除了太空环境，还可在其他各种极端恶劣(如寒冷的高山上和深海底)的条件下使用，如油污、潮湿、粗糙、光滑的表面，并适用于各种 角度书写，使用寿命长达几十年，深受登山运动员、户外活动者、技工、士兵、警察的欢迎。目前在美国市场上8美元即可买到一枝最简单的费舍尔太空笔。&lt;br/&gt;&lt;br/&gt;奇怪的是这个富有传奇色彩的太空笔却成了谣言的对象，备受嘲笑，成了愚蠢的象征。有人说美国人花巨资开发太空笔完全没有必要，不如像前苏联宇航员那样简单 地使用铅笔(实际上，前苏联宇航员后来也改用费舍尔太空笔)。还有人干脆说太空笔从来就没有研制出来过。直到最近，还有人在学术会议上把这个谣言进行添油 加醋，开发费用被他们夸大了5000倍： “‘为了研究在太空环境下圆珠笔能出水，竟使科学家花费了100亿美元，终了却毫无结果。最后得知，铅笔在太空环境下就能写出字。’11月3日，在中国农 业大学召开的‘2004年全国农林研究生教育发展论坛’上，一位专家将这则黑色幽默娓娓道来，各大学领导和专家对‘研究要切合实际，尤其是以前沿研究为主 的研究生教育更是如此’的观点表示认同。”(《中国农大研究生教育创新性“学科群落”质高多产》，《中国教育报》2004年11月7日第1版) 《光明日报》也刊登过“美国科学家花费巨资研究太空笔居然没想到用铅笔”这样的笑话。 费舍尔太空笔中国市场上也买得到，叫“飞梭太空笔”，许多城市的百货大楼、礼品店均有销售，与会专家竟然没有一个人见过、听说过？“研究要切合实际”，说 得一点也不错，首先就要从自己做起。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-5272855731395356252?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/5272855731395356252/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=5272855731395356252' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5272855731395356252'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5272855731395356252'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/10/blog-post.html' title='有一个误传甚广的故事'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-3809443177747736298</id><published>2009-08-21T13:41:00.000-07:00</published><updated>2010-03-05T20:28:09.885-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>和谐的VirtualBox</title><content type='html'>&lt;img class="alignnone size-large wp-image-646027" title="混合" src="http://kzjeef.yo2.cn/wp-content/uploads/121/12128/2009/08/screenshot-1-1024x640.png" alt="混合" width="574" height="358" /&gt;&lt;br/&gt;&lt;br/&gt;ubuntu, emacs,git, win xp, IE7, firefox, 飞信， 注意到这个截图里面有win的部分， 有ubuntu的部分， 并且是几乎无缝的， 这就是～～ 来自sun的VirtualBox 虚拟机， 真是太人性化了， 效率很好， 比KVM要高的多， 可惜了sun阿。可怜的sun阿。。。&lt;br/&gt;&lt;br/&gt;Win下的google输入法是我最留恋的。 ：D&lt;br/&gt;&lt;br/&gt;最近这几天给team里面搭了svn， 因为svn 可以控制权限， 谁知道上司就把权限想的很死， 结果那个authz文件都快到100行了， SCM又不熟悉， 经常犯了错误就把我拉出来了。 真是手里拿着锤子，看什么都像钉子阿。。。&lt;br/&gt;&lt;br/&gt;最近的生活很单调。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-3809443177747736298?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/3809443177747736298/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=3809443177747736298' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3809443177747736298'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3809443177747736298'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/08/virtualbox.html' title='和谐的VirtualBox'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-5396231088577465462</id><published>2009-08-07T08:20:00.000-07:00</published><updated>2010-03-05T20:28:09.874-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='日常琐事'/><title type='text'>Feel sad</title><content type='html'>Today is a sad day.&lt;br/&gt;&lt;br/&gt;The someone  doesn't speak any words to me, I don't know what should  do.&lt;br/&gt;&lt;br/&gt;And, with my stupid hand, I broken my new gotted develope Ben nanobook.&lt;br/&gt;&lt;br/&gt;It's a sad day really.&lt;br/&gt;&lt;br/&gt;Hope tomorrow is better.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-5396231088577465462?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/5396231088577465462/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=5396231088577465462' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5396231088577465462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5396231088577465462'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/08/feel-sad.html' title='Feel sad'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-8607313285640729339</id><published>2009-08-05T11:30:00.000-07:00</published><updated>2010-03-05T20:28:09.866-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Open Source'/><title type='text'>Step the first step</title><content type='html'>Well, today is a happy day. I meet  with Wolfgang Spraul last evening, the first real person that play with Linux and Open Source. I asked my confuse about the format and organization&lt;strong&gt; &lt;/strong&gt;of Linux world, He said:" You always saw Linux elsewhere, but you are the Linux, Linux is every individual". It's encourage me very much.&lt;br/&gt;&lt;br/&gt;I said that I'm just the listener of the mail-list, never being an active guy like others, and he said this is the problem of most of Chinese software engineer, even they are very good at skill, but they never step out, and do something, they are waiting for some one else to ask passive. I think he is right, I have same problem, but the core of this problem is NOT who you are, but the how you do it. The rule in the Open Source world is you take a semi-finished things, show to others, and then ask them help, clear about you request, so the others can understand what help can they offer, and finish it together.&lt;br/&gt;Another problem of Chinese software engineer is language, the Open Source world is a English world, and communicate with mail-list/IRC/IM, all these way is in English, for example, He is a German,but he still have to learn &amp;amp; speak English(I heard that English is too simple to German). The most of people use mail-list, but wirte a clear mail is a challenge.&lt;br/&gt;&lt;br/&gt;Anyway, I decide to conquer and learn my English well. So I practice my English here.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-8607313285640729339?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/8607313285640729339/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=8607313285640729339' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8607313285640729339'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8607313285640729339'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/08/step-first-step.html' title='Step the first step'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-8987796017989261771</id><published>2009-07-28T03:35:00.000-07:00</published><updated>2010-03-05T20:28:09.857-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>推荐，上twitter的好武器</title><content type='html'>1. 配置一下你的HOST文件，帖子在&lt;a href="http://www.dreamfreeblog.com/bbs/topic/81"&gt;这里&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;2. 这个adobe AIR 软件可以，　你可能需要先安装　AIR 平台，　地址在&lt;a href="http://get.adobe.com/cn/air/"&gt;这里&lt;/a&gt;。&lt;br/&gt;&lt;br/&gt;然后可以去&lt;br/&gt;http://www.twhirl.org/&lt;br/&gt;下载这个应用，就可以上twitter了。&lt;br/&gt;&lt;br/&gt;赞一个 adobe AIR.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-8987796017989261771?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/8987796017989261771/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=8987796017989261771' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8987796017989261771'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8987796017989261771'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/07/twitter.html' title='推荐，上twitter的好武器'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-7088397025960997240</id><published>2009-07-27T16:01:00.000-07:00</published><updated>2010-03-05T20:28:09.847-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='情怀'/><title type='text'>画的自己。</title><content type='html'>申明： 这个是我技术不到位， 真人要帅些。&lt;br/&gt;&lt;br/&gt;[caption id="attachment_645608" align="alignnone" width="302" caption="自己"]&lt;img class="size-full wp-image-645608" title="self" src="http://kzjeef.yo2.cn/wp-content/uploads/121/12128/2009/07/sendpix2.jpg" alt="自己" width="302" height="281" /&gt;[/caption]&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-7088397025960997240?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/7088397025960997240/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=7088397025960997240' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/7088397025960997240'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/7088397025960997240'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/07/blog-post_27.html' title='画的自己。'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-4070488970706128095</id><published>2009-07-25T18:12:00.000-07:00</published><updated>2010-03-05T20:28:09.836-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='music'/><title type='text'>分享一个吉他视频</title><content type='html'>&lt;object width="420" height="363" data="http://www.tudou.com/v/qhzvI_g9sZ8" type="application/x-shockwave-flash"&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="wmode" value="opaque" /&gt;&lt;param name="src" value="http://www.tudou.com/v/qhzvI_g9sZ8" /&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-4070488970706128095?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/4070488970706128095/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=4070488970706128095' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4070488970706128095'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4070488970706128095'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/07/blog-post_25.html' title='分享一个吉他视频'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-5614642405659766365</id><published>2009-07-12T16:55:00.000-07:00</published><updated>2010-03-05T20:28:09.827-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>希望</title><content type='html'>&lt;p&gt;投了Ubuntu的JOB，在这里希望可以通过，这样我就可以在你身边了。&lt;/p&gt; &lt;p&gt;（只能把yo2当twitter了，习惯了，没办法）&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-5614642405659766365?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/5614642405659766365/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=5614642405659766365' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5614642405659766365'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5614642405659766365'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/07/blog-post_12.html' title='希望'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-4957338038207576096</id><published>2009-07-10T15:27:00.000-07:00</published><updated>2010-03-05T20:28:09.818-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>心情不好画画很丑</title><content type='html'>&lt;p&gt;到头来还是不能摆脱， 加班， 上网受限， 不被相信的这些东西。&lt;/p&gt; &lt;p&gt;刚两天的好心情，逐渐回到了正常的坏心情。像一个在高飞的肥皂泡，始终会有破掉的一天。&lt;/p&gt; &lt;p&gt;我的要求不高，一个皮椅子就好。&lt;/p&gt; &lt;p&gt;画不好看了，真的是那句，心情不好的时候，画出来的画很丑。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-4957338038207576096?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/4957338038207576096/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=4957338038207576096' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4957338038207576096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4957338038207576096'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/07/blog-post.html' title='心情不好画画很丑'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-1847996765445996521</id><published>2009-06-13T11:01:00.000-07:00</published><updated>2010-03-05T20:28:09.809-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>Numbers should knows</title><content type='html'>from google&lt;br/&gt;&lt;br/&gt;L1 cache reference                                                                               0.5 ns&lt;br/&gt;Branch mispredict                                                                                    5 ns&lt;br/&gt;L2 cache reference                                                                                   7 ns&lt;br/&gt;Mutex lock/unlock                                                                             100 ns&lt;br/&gt;Main memory reference                                                                  100 ns&lt;br/&gt;Compress 1K bytes with Zippy                                               10,000 ns&lt;br/&gt;Send 2K bytes over 1 Gbps network                                    20,000 ns&lt;br/&gt;Read 1 MB sequentially from memory                            250,000 ns&lt;br/&gt;Round trip within same datacenter                                  500,000 ns&lt;br/&gt;Disk seek                                                                                10,000,000 ns&lt;br/&gt;Read 1 MB sequentially from network                      10,000,000 ns&lt;br/&gt;Read 1 MB sequentially from disk                              30,000,000 ns&lt;br/&gt;Send packet CA-&amp;gt;Netherlands-&amp;gt;CA                       150,000,000 ns&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-1847996765445996521?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/1847996765445996521/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=1847996765445996521' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/1847996765445996521'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/1847996765445996521'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/06/numbers-should-knows.html' title='Numbers should knows'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-1434228175910604170</id><published>2009-05-23T08:21:00.000-07:00</published><updated>2010-03-05T20:28:09.798-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='ssh openssh linux'/><title type='text'>Ssh without typing passwd</title><content type='html'>&lt;p&gt;Blogspot被墙了，只好发到这里了。&lt;/p&gt; &lt;p&gt;在公司的时候，总是有这样的需求：你需要ssh或者scp东西到别人的机器上面，有时候会比较频繁，但是每次都得你的目标机的人过来输一下密码，很麻烦，效率也很低。&lt;/p&gt; &lt;p&gt;在看一篇hadoop的&lt;a href="http://www.ibm.com/developerworks/cn/opensource/os-cn-hadoop3/"&gt;文章&lt;/a&gt;的时候看到了一些ssh，和公钥的用法（唉，没办法，比较土，现在才知道），可以避免输密码。&lt;/p&gt; &lt;p&gt;我这里就直接抄下来了，版权都在原作者.&lt;/p&gt; &lt;blockquote style="MARGIN-RIGHT: 0px" dir="ltr"&gt; &lt;p&gt;使用三台机器，机器名分别为 homer06, homer07, homer08，均安装 Redhat Enterprise Linux 5.0 (其它 Linux 发行版亦可), 确保各台机器之间网络畅通，机器名与 IP 地址之间解析正确，从任一台机器都可以　ping 通其它机器的机器名。如有机器名的解析问题，可通过设置 /etc/hosts 文件解决，当然更好的解决方法是在你的网络中配置 DNS 服务器。此外，需要在三台机器上创建相同的用户帐号，如 caoyuz, 或直接使用 root 帐号亦可。&lt;/p&gt; &lt;p&gt;在 Hadoop 分布式环境中，Name Node (主节点) 需要通过 SSH 来启动和停止 Data Node (从结点)上的各类进程。我们需要保证环境中的各台机器均可以通过 SSH 登录访问，并且 Name Node 用 SSH 登录 Data Node 时，不需要输入密码，这样 Name Node 才能在后台自如地控制其它结点。可以将各台机器上的 SSH 配置为使用无密码公钥认证方式来实现。&lt;/p&gt; &lt;p&gt;现在流行的各类 Linux 发行版一般都安装了 SSH　协议的开源实现 OpenSSH, 并且已经启动了 SSH 服务, 即这些机器缺省应该就是支持 SSH 登录的。如果你的机器缺省不支持 SSH, 请下载安装 OpenSSH。&lt;/p&gt; &lt;p&gt;以下是配置 SSH 的无密码公钥认证的过程。首先，在 homer06 机器上执行命令，如代码清单 1 所示：&lt;/p&gt; &lt;p&gt;&lt;br/&gt;&lt;a name="listing3" id="listing3"&gt;&lt;strong&gt;代码清单1&lt;/strong&gt;&lt;/a&gt; &lt;br/&gt;&lt;/p&gt; &lt;table cellpadding="0" width="100%" border="0" cellspacing="0"&gt; &lt;tbody&gt; &lt;tr&gt; &lt;td class="code-outline"&gt; &lt;br/&gt;&lt;pre class="displaycode"&gt;&lt;br/&gt;                &lt;br/&gt;homer06: $ ssh-keygen -t rsa&lt;br/&gt;Generating public/private rsa key pair.&lt;br/&gt;Enter file in which to save the key (/home/caoyuz/.ssh/id_rsa):  &lt;br/&gt;Enter passphrase (empty for no passphrase):&lt;br/&gt;Enter same passphrase again:&lt;br/&gt;Your identification has been saved in /home/caoyuz/.ssh/id_rsa.&lt;br/&gt;Your public key has been saved in /home/caoyuz/.ssh/id_rsa.pub.&lt;br/&gt;The key fingerprint is:&lt;br/&gt;2e:57:e2:bf:fd:d4:45:5c:a7:51:3d:f1:51:3c:69:68 root@krusty04&lt;br/&gt;&lt;/pre&gt;&lt;br/&gt;&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt; &lt;/table&gt;  &lt;br/&gt;&lt;p&gt;这个命令将为 homer06 上的当前用户 caoyuz 生成其密钥对，密钥对的保存路径使用缺省的 /home/caoyuz/.ssh/id_rsa, 要求输入 passphrase 的时候，直接回车。这样生成的证书以及公钥将存储在 /home/caoyuz/.ssh 目录，形成两个文件 id_rsa，id_rsa.pub。然后将 id_rsa.pub 文件的内容复制到每一台机器(包括本机 homer06)的　 /home/caoyuz/.ssh/authorized_keys　文件的尾部，如果机器上不存在　 /home/caoyuz/.ssh/authorized_keys 文件，可以自行创建一个。请注意 id_rsa.pub 文件的内容是长长的一行，复制时需注意，不要遗漏字符或混入了多余换行符。&lt;/p&gt; &lt;p&gt;接下来可以做一下 SSH 连接测试，从 homer06 分别向 homer06, homer07, homer08 发起 SSH 连接请求，确保不需要输入密码就能 SSH 连接成功。注意第一次 SSH 连接时会出现如下提示信息：&lt;/p&gt; &lt;p&gt;The authenticity of host [homer06] can't be established. The key fingerprint is: 74:32:91:f2:9c:dc:2e:80:48:73:d4:53:ab:e4:d3:1a Are you sure you want to continue connecting (yes/no)?&lt;/p&gt; &lt;p&gt;请输入 yes, 这样 OpenSSH 会把连接过来的这台主机的信息自动加到 /home/caoyuz/.ssh/know_hosts 文件中去，第二次再连接时，就不会有这样的提示信息了。&lt;/p&gt; &lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-1434228175910604170?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/1434228175910604170/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=1434228175910604170' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/1434228175910604170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/1434228175910604170'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/05/ssh-without-typing-passwd.html' title='Ssh without typing passwd'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-3003778205817483528</id><published>2009-05-20T13:22:00.000-07:00</published><updated>2010-03-05T20:28:09.789-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='Job'/><title type='text'>Leaving Cellon - The First Job</title><content type='html'>&lt;p&gt;Mark for the quit the first Job, Cellon ShenZhen. The moment I write the last mail to everyone I know, I feel hard. I want to tpying many words, but it's too hard to typing, since I want make this leaving normal, make this leaving like adult. Finally, I wrote a short message to obtain the wishes. The most impressive is from Jimmy.Liu, the boss of my boss, said, I was the youngest but the best member in Smart Phone SW team. We touch very few times, but he knows me. I'm gratified and encouraged.&lt;/p&gt; &lt;p&gt;It's hard to leaving. I have been with this team for almost one year, we was failed on the O8K project. But the lastest half-year, we can see the hope, the project like my child, growing up by our hands. For now, I just with my best wishes to the project, and to everyone.&lt;/p&gt; &lt;p&gt;This year also my working in a remote city, far from my family, my lover, It's very hard also. I hope the stituation will be better, I can together with my lover soon.&lt;/p&gt; &lt;p&gt;We are so young! We fighting! Fighting for our dream!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-3003778205817483528?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/3003778205817483528/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=3003778205817483528' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3003778205817483528'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3003778205817483528'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/05/leaving-cellon-first-job.html' title='Leaving Cellon - The First Job'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-4773290533877059216</id><published>2009-05-06T08:45:00.000-07:00</published><updated>2009-05-06T10:56:49.595-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Linux hard link</title><content type='html'>You may confused what the hard link is, and why the delete file use the unlink(2) system call. this example will help you somehow.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;assumption, there is a file in /tmp/a.txt&lt;br /&gt;&lt;br /&gt;$ cat /tmp/a.txt&lt;br /&gt;hello, i'm a.txt&lt;br /&gt;&lt;br /&gt;then, we write this test.c&lt;br /&gt;test.c:&lt;br /&gt;&lt;div style="text-align: justify;"&gt;&lt;span style="font-family: lucida grande;"&gt;#include &lt;unistd.h&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;int main(void)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;    link("/tmp/a.txt", "/tmp/new_a.txt");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;    /* in this moment, the a.txt have same content with new_a.txt */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;    unlink("/tmp/a.txt");&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;   /* in this moment, a.txt will be delete */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;}&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;we compile the test.c&lt;br /&gt;$gcc test.c&lt;br /&gt;&lt;br /&gt;and run it&lt;br /&gt;$./a.out&lt;br /&gt;&lt;br /&gt;$ cat /tmp/new_a.txt&lt;br /&gt;hello, i'm a.txt&lt;br /&gt;&lt;br /&gt;Use hard link is the simplest and the fastest way move files within the same filesystem, since hard link cann't across filesystem.&lt;br /&gt;&lt;br /&gt;More infomation you need check the link(2) or the unix filesystem design.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-4773290533877059216?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/4773290533877059216/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=4773290533877059216' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4773290533877059216'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4773290533877059216'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/05/linux-hard-link.html' title='Linux hard link'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-8328788344790003762</id><published>2009-05-03T12:23:00.000-07:00</published><updated>2010-03-05T20:28:09.780-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>【转】必胜客沙拉吃法</title><content type='html'>转自: http://food.poco.cn/sitologyDetail.htx&amp;amp;id=5969&lt;br/&gt;&lt;br/&gt;&lt;span style="color: #cc0000;"&gt;&lt;strong&gt;我原本对必胜客一无所知，但是最近和一个在必胜客做兼职的朋友聊天，发现了许多经济实惠的吃法，与大家分享：&lt;/strong&gt;&lt;/span&gt;&lt;br/&gt;&lt;br/&gt;　　自助沙拉&lt;br/&gt;&lt;br/&gt;　　自助沙拉28元一份，要想实惠，盛沙拉者的水平是很重要的。我的建议是首先用老玉米或者你们喜欢的豆类把沙拉碗盛满，盛到与碗沿平起，然后依据我的口 味，我喜欢用黄瓜片和菠萝片交叉叠放在一起，同样是要沿着碗沿的，中间可以放如你们喜欢的其他的水果，我喜欢黄桃，而且成本高哦，呵呵！然后在放上一些坚 果，最后再弄一圈沙拉酱。注意，如果只是初去者，不要太贪心，码得太高,要知道要是弄洒了是很现眼的哦！最好是挑一个离沙拉吧近的位置，这个一进必胜客就 能向服务员要求的！&lt;br/&gt;&lt;br/&gt;　　上次去必胜客，某女生站在沙拉台差不多半小时，小心奕奕的摆着沙拉，最底一层是生菜，往上装点别的，在快和碗边平高的时候再在碗边铺一层黄瓜片或比较大块的水果，成莲花状，如是者一层又一层，最后该盘沙拉足有25公分高！！决不            bt！！然后，该mm捧起碗，小心奕奕的走到距离沙拉台最远的角落位置坐下，途中无任何的沙拉掉下，干脆利落，整个必胜客的服务生和顾客看的眼睛都不眨一下......&lt;br/&gt;&lt;br/&gt;　　今天在必胜客见到的，碗上周圈的绿色是黄瓜片，摆的非常整齐漂亮，要不是被店员制止垒得还能更高。从我进去开始盛沙拉（当时黄瓜片已经落了6层）到我卖单时（被服务员制止）为时将近1小时。&lt;br/&gt;&lt;br/&gt;　　但我不明白必胜客既然有此沙拉自助的规 矩又为什么制止此位高手的行为，也许是怕他和他的客人吃不完？不明白。要是换我定会在能吃完的前提下找他们理论一番。因为在必胜客看谁沙拉盛的多已成为一种风尚，不是贪小便宜的概念，我如果是老板还会定期举办盛沙拉比赛。&lt;br/&gt;&lt;br/&gt;　　中午去 必胜客 吃PIZZA,我一进门就看见一个女的在那里盛沙拉,我就坐在沙拉台旁边,从我进来到吃完饭,那个女的就一直在那里站着,因为她一直背对着我,我就没太            注意她在干什么,然后我就一直看着她,因为长时间低着头,她的脖子好像酸了,所以一侧身抬起脑袋晃了晃,随后我就看见桌子上摆着的东西。&lt;br/&gt;&lt;br/&gt;　　当时我都傻了,惊讶的:啊?了一声,当时声音挺大,旁边吃饭的人都看我,但我的眼睛一直看着桌子上的东西,吃饭的人也顺着我的目光看了过去,他们看见了也一口同声"啊?"当时那场面特逗,弄的那女孩都不好意思了,其实她还想接着盛,但是太不好意思了,            就要走,然后我就拿起手机,走到沙拉台前,照了这张照片。后来我注意了一下她,她是和另外一个女孩来的,别的没要,就花了28要了一个沙拉~~~真够战士的~~&lt;br/&gt;&lt;br/&gt;我 给你讲一下要诀。虽然我现在已经不干这事了。周边的辣椒圈和洋葱圈要交错环排，白绿相间，如叶似瓣，记得要交错排列，中间部位的最上面浇满了如白雪般的沙 拉酱，其上还布洒着五颜六色的花花豆豆，沙拉酱相当于水泥，用许多螺旋状的胡萝卜条插在表面，根根直立，起钢筋的作用。&lt;br/&gt;&lt;br/&gt;　　最重要的是，充分发挥了食品建筑工程学的基本原理，大量使用黄桃这一优质建材，不但结构坚实具有良好的直立性，而且还不易出水溃塌。如果没有了它，一切都是歇菜。&lt;br/&gt;&lt;br/&gt;　 　外国人去必胜客是去吃比萨饼，而不是去吃沙拉的，说白了，人家没把沙拉当回事儿，到我们这儿，偏偏就把沙拉当回事。这是文化的不同，此外还有经济实力的 不同。100多元吃一顿比萨饼对大部分的中国人来说还有些奢侈，就容易拿'免费'的沙拉找平衡。打个比方，国外吃比萨饼白给沙拉，就像我们喝粥给咸菜一 样，你说我们素质低吗？可咸菜我们并没多盛啊！&lt;br/&gt;偶跟一个同事堆过一次超强的。。。&lt;br/&gt;&lt;br/&gt;纯属吃饱了没事干。。。&lt;br/&gt;&lt;br/&gt;当时我们端着那盘沙拉堡垒一路走到座位上&lt;br/&gt;&lt;br/&gt;半个厅的人都看着我们&lt;br/&gt;&lt;br/&gt;然后。。。&lt;br/&gt;&lt;br/&gt;听到很多人在喊：给我们加一份沙拉。。。&lt;br/&gt;&lt;br/&gt;一个个跃跃欲试很兴奋滴样子&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="6" width="690" align="center" bgcolor="#eeeeee"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td class="chinese9ptmain" width="6%" valign="top"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="0" align="center"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td class="chinese9ptmain" height="118" align="middle"&gt;&lt;br/&gt;&lt;div&gt;&lt;br/&gt;&lt;table border="0" cellspacing="1" cellpadding="0" bgcolor="#e1e1e1"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="1" cellpadding="0" bgcolor="#d7d7d7"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td width="220" bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table style="height: 124px;" border="0" cellspacing="1" cellpadding="0" width="165" bgcolor="#b2b2b2"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="8" width="100%"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="1" width="100%"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td align="middle" bgcolor="#808080"&gt;&lt;img src="http://food.poco.cn/special/040326/bsk_6.jpg" border="0" alt="" /&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/div&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="6" width="690" align="center" bgcolor="#eeeeee"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td class="chinese9ptmain" width="6%" valign="top"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="0" align="center"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td class="chinese9ptmain" height="118" align="middle"&gt;&lt;br/&gt;&lt;div&gt;&lt;br/&gt;&lt;table border="0" cellspacing="1" cellpadding="0" bgcolor="#e1e1e1"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="1" cellpadding="0" bgcolor="#d7d7d7"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td width="220" bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table style="height: 124px;" border="0" cellspacing="1" cellpadding="0" width="165" bgcolor="#b2b2b2"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="8" width="100%"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="1" width="100%"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td align="middle" bgcolor="#808080"&gt;&lt;img src="http://food.poco.cn/special/040326/bsk_5.jpg" border="0" alt="" /&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/div&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="6" width="690" align="center" bgcolor="#eeeeee"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td class="chinese9ptmain" width="6%" valign="top"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="0" align="center"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td class="chinese9ptmain" height="118" align="middle"&gt;&lt;br/&gt;&lt;div&gt;&lt;br/&gt;&lt;table border="0" cellspacing="1" cellpadding="0" bgcolor="#e1e1e1"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="1" cellpadding="0" bgcolor="#d7d7d7"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td width="220" bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table style="height: 124px;" border="0" cellspacing="1" cellpadding="0" width="165" bgcolor="#b2b2b2"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="8" width="100%"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="1" width="100%"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td align="middle" bgcolor="#808080"&gt;&lt;img src="http://food.poco.cn/special/040326/bsk_2.jpg" border="0" alt="" /&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/div&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="6" width="690" align="center" bgcolor="#eeeeee"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td class="chinese9ptmain" width="6%" valign="top"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="0" align="center"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td class="chinese9ptmain" height="118" align="middle"&gt;&lt;br/&gt;&lt;div&gt;&lt;br/&gt;&lt;table border="0" cellspacing="1" cellpadding="0" bgcolor="#e1e1e1"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="1" cellpadding="0" bgcolor="#d7d7d7"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td width="220" bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table style="height: 124px;" border="0" cellspacing="1" cellpadding="0" width="165" bgcolor="#b2b2b2"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="8" width="100%"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="1" width="100%"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td align="middle" bgcolor="#808080"&gt;&lt;img src="http://food.poco.cn/special/040326/bsk_9.jpg" border="0" alt="" /&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/div&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="6" width="690" align="center" bgcolor="#eeeeee"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td class="chinese9ptmain" width="6%" valign="top"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="0" align="center"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td class="chinese9ptmain" height="118" align="middle"&gt;&lt;br/&gt;&lt;div&gt;&lt;br/&gt;&lt;table border="0" cellspacing="1" cellpadding="0" bgcolor="#e1e1e1"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="1" cellpadding="0" bgcolor="#d7d7d7"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td width="220" bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table style="height: 124px;" border="0" cellspacing="1" cellpadding="0" width="165" bgcolor="#b2b2b2"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="8" width="100%"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="1" width="100%"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td align="middle" bgcolor="#808080"&gt;&lt;img src="http://food.poco.cn/special/040326/bsk_8.jpg" border="0" alt="" /&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/div&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="6" width="690" align="center" bgcolor="#eeeeee"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td class="chinese9ptmain" width="6%" valign="top"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="0" align="center"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td class="chinese9ptmain" height="118" align="middle"&gt;&lt;br/&gt;&lt;div&gt;&lt;br/&gt;&lt;table border="0" cellspacing="1" cellpadding="0" bgcolor="#e1e1e1"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="1" cellpadding="0" bgcolor="#d7d7d7"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td width="220" bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table style="height: 124px;" border="0" cellspacing="1" cellpadding="0" width="165" bgcolor="#b2b2b2"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="8" width="100%"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="1" width="100%"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td align="middle" bgcolor="#808080"&gt;&lt;img src="http://food.poco.cn/special/040326/bsk_4.jpg" border="0" alt="" /&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/div&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="6" width="690" align="center" bgcolor="#eeeeee"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td class="chinese9ptmain" width="6%" valign="top"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="0" align="center"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td class="chinese9ptmain" height="118" align="middle"&gt;&lt;br/&gt;&lt;div&gt;&lt;br/&gt;&lt;table border="0" cellspacing="1" cellpadding="0" bgcolor="#e1e1e1"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="1" cellpadding="0" bgcolor="#d7d7d7"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td width="220" bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table style="height: 124px;" border="0" cellspacing="1" cellpadding="0" width="165" bgcolor="#b2b2b2"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td bgcolor="#ffffff"&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="8" width="100%"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td&gt;&lt;br/&gt;&lt;table border="0" cellspacing="0" cellpadding="1" width="100%"&gt;&lt;br/&gt;&lt;tbody&gt;&lt;br/&gt;&lt;tr&gt;&lt;br/&gt;&lt;td align="middle" bgcolor="#808080"&gt;&lt;img src="http://food.poco.cn/special/040326/bsk_3.jpg" border="0" alt="" /&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/div&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;/td&gt;&lt;br/&gt;&lt;/tr&gt;&lt;br/&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br/&gt;&lt;img src="http://food.poco.cn/special/040326/bsk_7.jpg" border="0" alt="" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-8328788344790003762?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/8328788344790003762/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=8328788344790003762' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8328788344790003762'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8328788344790003762'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/05/blog-post.html' title='【转】必胜客沙拉吃法'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-1132228011361754367</id><published>2009-04-26T09:56:00.000-07:00</published><updated>2010-03-05T20:28:09.771-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>在twitter上被某位大师flow</title><content type='html'>&lt;p&gt;今日睡醒闲来无事，上twitter上浪费时间，忽然发现了da lai la ma 的twitter，于是好奇的就flow了， 没想到几分钟后被大师flow，激动的同时又生出了会不会被和谐掉的担忧，毕竟他的名字出现的地方就特别容易和谐。那样我的邮箱等等一系列都不能上课怎么办啊。 :D&lt;/p&gt; &lt;p&gt;PS， twitter 的flow的意思呢，不好解释，大概就是我博客上发的东西会自动出现在他的HOME页面上，看来以后多用英语发帖了，&lt;/p&gt; &lt;p&gt;PS2, twitter是一种微型博客，一般几句话而已。但是有一种flow和被flow的机制，翻译成跟随差不多吧，别人跟随(flowing)我的，就可以看到我更新的东西，我(flow) 别人呢，就可以看到别人发的帖子和他对别人评论。&lt;/p&gt; &lt;p&gt;PS3,玩这玩着我就想起我没学好的图算法了。。。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-1132228011361754367?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/1132228011361754367/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=1132228011361754367' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/1132228011361754367'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/1132228011361754367'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/04/twitterflow.html' title='在twitter上被某位大师flow'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-6134226448832024366</id><published>2009-04-08T17:05:00.000-07:00</published><updated>2010-03-05T20:28:09.222-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>小病</title><content type='html'>&lt;p&gt;发烧两天，很脆弱。用自己当作筹码，我知道很不光彩，但是你包容我了。你说我很不成熟，我想是的吧。我现在就只想抱着你，什么都不说。&lt;/p&gt; &lt;p&gt;晚安。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-6134226448832024366?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/6134226448832024366/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=6134226448832024366' title='2 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/6134226448832024366'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/6134226448832024366'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/04/blog-post.html' title='小病'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-6417053853393023371</id><published>2009-04-03T00:06:00.000-07:00</published><updated>2009-04-03T00:10:07.964-07:00</updated><title type='text'>使用libjpeg直接转换YUV420图像到JPEG</title><content type='html'>&lt;span style="font-family: arial;"&gt;这篇文章主要介绍如何把yuv420的图像（当然也可以是422p的图像，但是如果不是planner格式的YUV数据，就不能直接作转换）用libjpeg转换成jpeg的图像。在网上看到许多介绍如何压缩jpeg图像的文章都是通过现把yuv数据转换成rgb格式，然后再通过libjpeg来压缩。但是jpeg内部是基于yuv的颜色空间的，所以这样会进行2次多余的颜色空间转换，这些都是不必要的。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;看了jpeg的spec以后和libjpeg,还有mjpg-streamer的代码以后，自己尝试作一个能够转换的小程序。 现在把这个程序贡献出来给大家作为参考，有兴趣的可以下来代码看看， 100多行代码，很简单的。&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;source code: http://sites.google.com/site/kzjeef/files/still.bz2?attredirects=0&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;$ tar jxvf still.bz2&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;$ cd yuv2jpg&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;"&gt;$ make&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;建议先阅读 README, 经过转换的图像放在/tmp/still.jpg &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: arial;"&gt;谢谢。&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-6417053853393023371?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/6417053853393023371/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=6417053853393023371' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/6417053853393023371'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/6417053853393023371'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/04/libjpegyuv420jpeg.html' title='使用libjpeg直接转换YUV420图像到JPEG'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-638267686751601425</id><published>2009-03-14T05:28:00.000-07:00</published><updated>2010-03-05T20:28:09.202-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>[转] 一些佛学中的道理</title><content type='html'>“我不信佛，现在还达不到那种虔诚，但是看了这个帖子以后觉得佛学中的有些道理很好，至于是哪些道理，我觉得每个人的看法都不一样， 所以就不标出来了，有兴趣的欣赏一下”&lt;br/&gt;&lt;br/&gt; 下面是转贴：&lt;br/&gt;&lt;br/&gt;转自：&lt;a href="http://bloooooooogger.blogspot.com/2009/03/108buddhism-108-truth-in-life.html"&gt;有信佛的参考吧@&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;&lt;span style="font-family: arial; font-size: 13px; line-height: normal; border-collapse: collapse" class="Apple-style-span"&gt;via metababy by metababy on 3/12/09&lt;br/&gt;&lt;br/&gt;总是认为，自己看了《心经》就什么都清楚了，明白了，不再有任何的困惑。但总得给更多的朋友宣传这种想法吧，可他们总是不感兴趣，原因是我没有将其"翻译"成通俗的东西。今天在一朋友的QQ空间上看到了这文章，特别转过来，由于她也是转的，也不知道原文从哪来的。总之，在此感谢本文的原创作者，感谢他为世人所作的贡献！谢谢您让大家能学习到这么好的心态。&lt;br/&gt;&lt;br/&gt;佛学的108条做人的道理&lt;br/&gt;　 一、人之所以痛苦，在于追求错误的东西。&lt;br/&gt;　　二、与其说是别人让你痛苦，不如说自己的修养不够。&lt;br/&gt;　　三、如果你不给自己烦恼，别人也永远不可能给你烦恼。因为你自己的内心，你放不下。&lt;br/&gt;　　四、好好的管教你自己，不要管别人。&lt;br/&gt;　　五、不宽恕众生，不原谅众生，是苦了你自己。&lt;br/&gt;　　六、别说别人可怜，自己更可怜，自己修行又如何？自己又懂得人生多少？&lt;br/&gt;　　七、学佛是对自己的良心交待，不是做给别人看的。&lt;br/&gt;　　八、福报不够的人，就会常常听到是非；福报够的人，从来就没听到过是非。&lt;br/&gt;　　九、修行是点滴的工夫。&lt;br/&gt;　　十、在顺境中修行，永远不能成佛。&lt;br/&gt;　　十一、你永远要感谢给你逆境的众生。&lt;br/&gt;　　十二、你随时要认命，因为你是人。&lt;br/&gt;　　十三、你永远要宽恕众生，不论他有多坏，甚至他伤害过你，你一定要放下，才能得到真正的快乐。&lt;br/&gt;　　十四、这个世界本来就是痛苦的，没有例外的。&lt;br/&gt;　　十五、当你快乐时，你要想，这快乐不是永恒的。当你痛苦时你要想这痛苦也不是永恒的。&lt;br/&gt;　　十六、认识自己，降伏自己，改变自己，才能改变别人。&lt;br/&gt;　　十七、今日的执著，会造成明日的后悔。&lt;br/&gt;　　十八、你可以拥有爱，但不要执著，因为分离是必然的。&lt;br/&gt;　　十九、不要浪费你的生命在你一定会后悔的地方上。&lt;br/&gt;　　二十、你什么时候放下，什么时候就没有烦恼。&lt;br/&gt;&lt;span style="white-space: pre" class="Apple-tab-span"&gt;	&lt;/span&gt;二一、内心没有分别心，就是真正的苦行。&lt;br/&gt;　　二二、学佛第一个观念，永远不去看众生的过错。你看众生的过错，你永远污染你自己，你根本不可能修行。&lt;br/&gt;　　二三、你每天若看见众生的过失和是非，你就要赶快去忏悔，这就是修行。&lt;br/&gt;　　二四、业障深重的人，一天到晚都在看别人的过失与缺点，真正修行的人，从不会去看别人的过失与缺点。&lt;br/&gt;　　二五、每一种创伤，都是一种成熟。&lt;br/&gt;　　二六、当你知道迷惑时，并不可怜，当你不知道迷惑时，才是最可怜的。&lt;br/&gt;　　二七、狂妄的人有救，自卑的人没有救。&lt;br/&gt;　　二八、你不要一直不满人家，你应该一直检讨自己才对。不满人家，是苦了你自己。&lt;br/&gt;　　二九、一切恶法，本是虚妄的，你不要太自卑你自己。一切善法，也是虚妄的，你也不要太狂妄你自己。&lt;br/&gt;　　三十、当你烦恼的时候，你就要告诉你自己，这一切都是假的，你烦恼什么？&lt;br/&gt;　　三一、当你未学佛的时候，你看什么都不顺。当你学佛以后，你要看什么都很顺。&lt;br/&gt;　　三二、你要包容那些意见跟你不同的人，这样子日子比较好过。你要是一直想改变他，那样子你会很痛苦。要学学怎样忍受他才是。你要学学怎样包容他才是。&lt;br/&gt;　　三三、承认自己的伟大，就是认同自己的愚疑。&lt;br/&gt;　　三四、修行就是修正自己错误的观念。&lt;br/&gt;　　三五、医生难医命终之人，佛陀难渡无缘的众生。&lt;br/&gt;　　三六、一个人如果不能从内心去原谅别人，那他就永远不会心安理得。&lt;br/&gt;　　三七、心中装满着自己的看法与想法的人，永远听不见别人的心声。&lt;br/&gt;　　三八、毁灭人只要一句话，培植一个人却要千句话，请你多口下留情。&lt;br/&gt;&lt;span style="white-space: pre" class="Apple-tab-span"&gt;	&lt;/span&gt;三九、当你劝告别人时，若不顾及别人的自尊心，那么再好的言语都没有用的。&lt;br/&gt;　　四十、不要在你的智慧中夹杂着傲慢。不要使你的谦虚心缺乏智慧。&lt;br/&gt;　　四一、根本不必回头去看咒骂你的人是谁？如果有一条疯狗咬你一口，难道你也要趴下去反咬他一口吗？&lt;br/&gt;　　四二、忌妒别人，不会给自己增加任何的好处。忌妒别人，也不可能减少别人的成就。&lt;br/&gt;　　四三、永远不要浪费你的一分一秒，去想任何你不喜欢的人。&lt;br/&gt;　　四四、多少人要离开这个世间时，都会说出同一句话，这世界真是无奈与凄凉啊！&lt;br/&gt;　　四五、恋爱不是慈善事业，不能随便施舍的。感情是没有公式，没有原则，没有道理可循的。可是人们至死都还在执著与追求。&lt;br/&gt;　　四六、请你用慈悲心和温和的态度，把你的不满与委屈说出来，别人就容易接受。&lt;br/&gt;　　四七、创造机会的人是勇者。等待机会的人是愚者。&lt;br/&gt;　　四八、能说不能行，不是真智慧。&lt;br/&gt;　　四九、多用心去倾听别人怎么说，不要急着表达你自己的看法。&lt;br/&gt;　　五十、同样的瓶子，你为什么要装毒药呢？同样的心理，你为什么要充满着烦恼呢？&lt;br/&gt;　　五一、得不到的东西，我们会一直以为他是美好的，那是因为你对他了解太少，没有时间与他相处在一起。当有一天，你深入了解后，你会发现原不是你想像中的那么美好。&lt;br/&gt;　　五二、这个世界只有圆滑，没有圆满的。&lt;br/&gt;　　五三、修行要有耐性，要能甘于淡泊，乐于寂寞。&lt;br/&gt;　 五四、活着一天，就是有福气，就该珍惜。当我哭泣我没有鞋子穿的时候，我发现有人却没有脚。&lt;br/&gt;　　五五、多一分心力去注意别人，就少一分心力反省自己，你懂吗？&lt;br/&gt;五六、眼睛不要老是睁得那么大，我且问你，百年以后，那一样是你的。&lt;br/&gt;　　五七、欲知世上刀兵劫，但听屠门夜半声。不要光埋怨自己多病，灾祸横生，多看看横死在你刀下的众生又有多少？&lt;br/&gt;　　五八、憎恨别人对自己是一种很大的损失。&lt;br/&gt;　　五九、每一个人都拥有生命，但并非每个人都懂得生命，乃至于珍惜生命。不了解生命的人，生命对他来说，是一种惩罚。&lt;br/&gt;　　六十、自以为拥有财富的人，其实是被财富所拥有。&lt;br/&gt;　　六一、情执是苦恼的原因，放下情执，你才能得到自在。&lt;br/&gt;　　六二、随缘不是得过且过，因循苟且，而是尽人事听天命。&lt;br/&gt;　　六三、不要太肯定自己的看法，这样子比较少后悔。&lt;br/&gt;　　六四、当你对自己诚实的时候，世界上没有人能够欺骗得了你。&lt;br/&gt;　　六五、用伤害别人的手段来掩饰自己缺点的人，是可耻的。&lt;br/&gt;　　六六、世间的人要对法律负责任。修行的人要对因果负责任。&lt;br/&gt;　　六七、在你贫穷的时候，那你就用身体去布施，譬如说扫地、洒水、搬东西等，这也是一种布施。&lt;br/&gt;　　六八、内心充满忌妒，心中不坦白，言语不正的人，不能算是一位五官端正的人。&lt;br/&gt;　　六九、默默的关怀与祝福别人，那是一种无形的布施。&lt;br/&gt;　　七十、多讲点笑话，以幽默的态度处事，这样子日子会好过一点。&lt;br/&gt;　　七一、与人相处之道，在于无限的容忍。&lt;br/&gt;　　七二、不要刻意去猜测他人的想法，如果你没有智慧与经验的正确判断，通常都会有错误的。&lt;br/&gt;　　七三、要了解一个人，只需要看他的出发点与目的地是否相同，就可以知道他是否真心的。&lt;br/&gt;　　七四、人生的真理，只是藏在平淡无味之中。&lt;br/&gt;　　七五、不洗澡的人，硬擦香水是不会香的。名声与尊贵，是来自于真才实学的。有德自然香。&lt;br/&gt;七六、与其你去排斥它已成的事实，你不如去接受它，这个叫做认命。&lt;br/&gt;　　七七、佛菩萨只保佑那些肯帮助自己的人。&lt;br/&gt;　　七八、逆境是成长必经的过程，能勇于接受逆境的人，生命就会日渐的茁壮。&lt;br/&gt;　　七九、你要感谢告诉你缺点的人。&lt;br/&gt;　　八十、能为别人设想的人，永远不寂寞。&lt;br/&gt;　　八一、如果你能像看别人缺点一样，如此准确般的发现自己的缺点，那么你的生命将会不平凡。&lt;br/&gt;　　八二、原谅别人，就是给自己心中留下空间，以便回旋。&lt;br/&gt;　　八三、时间总会过去的，让时间流走你的烦恼吧！&lt;br/&gt;　　八四、你硬要把单纯的事情看得很严重，那样子你会很痛苦。&lt;br/&gt;　　八五、永远扭曲别人善意的人，无药可救。&lt;br/&gt;　　八六、人不是坏的，只是习气罢了，每个人都有习气，只是深浅不同罢了。只要他有向道的心，能原谅的就原谅他，不要把他看做是坏人。&lt;br/&gt;　　八七、说一句谎话，要编造十句谎话来弥补，何苦呢？&lt;br/&gt;　　八八、其实爱美的人，只是与自己谈恋爱罢了。八九、世界上没有一个永远不被毁谤的人，也没有一个永远被赞叹的人。当你话多的时候，别人要批评你，当你话少的时候，别人要批评你，当你沈默的时候，别人还是要批评你。在这个世界上，没有一个不被批评的。&lt;br/&gt;　　九十、夸奖我们，赞叹我们的，这都不是名师。会讲我们，指示我们的，这才是善知识，有了他们我们才会进步。&lt;br/&gt;　　九一、你目前所拥有的都将随着你的死亡而成为他人的，那为何不现在就布施给真正需要的人呢？&lt;br/&gt;　　九二、为了赞美而去修行，有如被践踏的香花美草。&lt;br/&gt;　　九三、白白的过一天，无所事事，就像犯了窃盗罪一样。&lt;br/&gt;&lt;span style="white-space: pre" class="Apple-tab-span"&gt;	&lt;/span&gt;九四、能够把自己压得低低的，那才是真正的尊贵。&lt;br/&gt;　　九五、广结众缘，就是不要去伤害任何一个人。&lt;br/&gt;　　九六、沈默是毁谤最好的答覆。&lt;br/&gt;　　九七、对人恭敬，就是在庄严你自己。&lt;br/&gt;　　九八、拥有一颗无私的爱心，便拥有了一切。&lt;br/&gt;　　九九、仇恨永远不能化解仇恨，只有慈悲才能化解仇恨，这是永恒的至理。&lt;br/&gt;　　一００、你认命比抱怨还要好，对于不可改变的事实，你除了认命以外，没有更好的办法了。&lt;br/&gt;　　一０一、不要因为众生的愚疑，而带来了自己的烦恼。不要因为众生的无知，而痛苦了你自己。&lt;br/&gt;　　一０二、别人讲我们不好，不用生气、难过。说我们好也不用高兴，这不好中有好，好中有坏，就看你会不会用？&lt;br/&gt;　　一０三、如果你自己明明对，别人硬说你不对，你也要向人忏悔，修行就是修这些。你什么事都能忍下来，才会进步。就是明明是你对，你也要向他人求忏悔，那就是修行了。&lt;br/&gt;　　一０四、当你的错误显露时，可不要发脾气，别以为任性或吵闹，可以隐藏或克服你的缺点。&lt;br/&gt;　　一０五、不要常常觉得自己很不幸，世界上比我们痛苦的人还要多。&lt;br/&gt;　　一０六、愚痴的人，一直想要别人了解他。有智慧的人，却努力的了解自己。&lt;br/&gt;　　一０七、别人永远对，我永远错，这样子比较没烦恼。&lt;br/&gt;　　一０八、来是偶然的，走是必然的。所以你必须，随缘不变，不变随缘。&lt;br/&gt;&lt;br/&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-638267686751601425?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/638267686751601425/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=638267686751601425' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/638267686751601425'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/638267686751601425'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/03/blog-post.html' title='[转] 一些佛学中的道理'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-8121554924599992995</id><published>2009-02-02T13:34:00.000-08:00</published><updated>2010-03-05T20:28:09.191-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>过年-漫长的旅程</title><content type='html'>有一个大年，以前过年都是从四川回家，坐40个小时的火车+2小时的火车；现在的过年是2个小时的和谐号+36个小时的火车。 没办法， 我的家比较遥远。在一些大背景的阴影的笼罩下，还有自己的一些小事务的影响下， 显得今年特别的不同。&lt;br/&gt;&lt;br/&gt;到了广州，瞎转悠了几下， 就赶快去传说中的“春运时候的广州火车站”，原来大大的站前广场前面都是布满了车棚一样的“临时候车室”，里面是由 行李+人+武警 组成的， 我自己背了个包， 在熙熙攘攘的行李中找到了我的通道， 几下就进去了， 然后就在车站里面的候车室等了2个小时。 很后悔这么早就来了，应该多在广州逛一逛的。在深圳呆了这么长时间了，来了广州还是觉得自己是从乡下进了城里。&lt;br/&gt;&lt;br/&gt;漫长的等待过后，终于开始上车了，我被挤在的那个地方竟然被第一时间放了进去。我很从容的上了车坐了位子，等了很久别人才上了车， 心里那个爽阿。呵呵， 哪知道我做错了位置。。。24号看成了25号。再到我的位置上以后发现行李空间已经没有了。 汗真的来的早也没用阿。车上都是人，说河南话的人居多。其中还有个小插曲，我旁边那个哥们的箱子的拉杆坏了，无法缩进去，放在行李架上之后就把他那长长的拉杆露在外边，挺突兀的感觉。列车员看见了很不爽，说你再不把你的拉杆弄进去我就得让你把箱子放下来了， 那哥们一脸苦相，说坏了没办法阿。 这时候一位“老乡”挺身而出， 随手拿出一个制作很精致的木板凳，看来这兄弟是很少能买到有坐的火车票，说：“我用这个帮你砸进去？怕给你砸坏”， 我旁边那哥们说，没事你砸吧。 话音刚落，那哥们拿起板凳很夸张的一砸，那拉杆就进去了，让我感叹农民工大哥其实也是很可爱的。 呵呵。&lt;br/&gt;&lt;br/&gt;硬座的晚上比较难熬，中间醒来很多次，不过幸亏我还是最靠里的一个位置，还有一点点的桌子可以趴着睡，至于最边上的和在过道里边的就要倒霉许多了，不过最可怜的应该是过道里面的人了， 因为车上有2个卖货的一晚上竟来过来了7-8次，每一个听到“矿泉水，可乐，香肠，碗面”的声音想起，车厢里面就像鸟群起飞一样，在过道里面睡觉的人都骂骂咧咧的站了起来，这一来一回， 看来大家都不容易阿。又一次大家都在等待那个卖东西的回去以后再睡觉， 没想到那个卖东西直接在停站的时候从车厢外边推着车走了，让我想起一个老奶奶的“另外一支鞋"的那个笑话。&lt;br/&gt;&lt;br/&gt;到了集宁，半夜4点多， 爸爸在接站，然后就去旅店里面热乎的睡了一觉。真是舒服。回家第一件事情就是帮PP摸摸姐姐的肚肚，呵呵， 圆鼓鼓的好像里面冲了气一样， 很是不同。今年的年过的少了一个人，龙龙在沈阳没有回家， 听说他们工厂也裁员了，他现在跑到沈阳找了份工作，祝愿他好运吧。初一的时候给了爷爷奶奶钱，作为我赚了钱的红包，还给了姐姐和姐夫，不过他们后来给我的更多。&lt;br/&gt;&lt;br/&gt;后来和几个同学重聚了一下，去工作的人呢， 都变了，也有些人很久没有出现现在来寻找机会了，还有就是感觉这些人还是玩不到一块了，都自己的事情一大堆，不过还是玩的很开心。&lt;br/&gt;&lt;br/&gt;然后很快， 就要从家走了，真的是很快。上了车，一直就睡觉，到现在我才发现，我在车上一句话都没有说。 肯定很口臭，：）&lt;br/&gt;下了车以后去了杨熙家，这一次见都已经是结了婚了人了，没感觉出有啥不同，但是能看得到对他媳妇的照顾是很细心阿。 在他们家被照顾的很好，有吃好的又玩好的，很是感动。不过更加感叹的是他们一家都是学习型的，妈妈也看书学习，妹妹看的都是TOLEF的书，他媳妇更是诗词不离口。&lt;br/&gt;&lt;br/&gt;明天就要上班了，有一些陌生的感觉，很想很想离开了， 这一次回家的经历让我更加清晰了要离开的念头。 只不过要看下一次面试的成绩了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-8121554924599992995?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/8121554924599992995/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=8121554924599992995' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8121554924599992995'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8121554924599992995'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/02/blog-post.html' title='过年-漫长的旅程'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-7063626041011621258</id><published>2009-01-21T16:11:00.000-08:00</published><updated>2010-03-05T20:28:08.701-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='情怀'/><title type='text'>Copmlete the Cycle.</title><content type='html'>明天就要坐上回家的火车了， 今天一天搞定了Wi-Fi， 晚上Li Ling 请客吃烧烤， 如果有机会， 准备换工作了-换一个行业。 还记得半年前刚到深圳时候的狼狈样， 因为这个人的签了这份工作。刚来第一天就落的很狼狈的下场， 今天， 在老王的帮助下， 总算见到了当初要来深圳的一个原因，算是一个圆满了。&lt;br/&gt;&lt;br/&gt;此时的感觉呢， 生活真是有意思。 一个循环， 又回到初始的位置， 希望能在去首都再次开始打工的生活。&lt;br/&gt;&lt;br/&gt;不过此时此刻， 很想念， 你。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-7063626041011621258?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/7063626041011621258/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=7063626041011621258' title='2 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/7063626041011621258'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/7063626041011621258'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/01/copmlete-cycle.html' title='Copmlete the Cycle.'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-4871059903475201868</id><published>2009-01-19T16:40:00.000-08:00</published><updated>2010-03-05T20:28:07.510-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='未来'/><category scheme='http://www.blogger.com/atom/ns#' term='dark'/><category scheme='http://www.blogger.com/atom/ns#' term='color'/><title type='text'>Dark Color</title><content type='html'>早上起床， 把已经穿了多日的黑色毛衣换下， 换上黑色卫衣， 忽然想起办公室的黑色马克杯， 以及黑色的Thinkpad， 还有我黑色的咖啡机。 环顾四周， 暗色居多了， 开始思考， 什么时候黑色的成分这么多了呢？&lt;br/&gt;&lt;br/&gt; 本人还喜欢黑色电影， 黑色照片， 黑色幽默， 除了黑色的夜以外。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-4871059903475201868?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/4871059903475201868/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=4871059903475201868' title='4 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4871059903475201868'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4871059903475201868'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/01/dark-color.html' title='Dark Color'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-3010210769854250939</id><published>2009-01-12T13:48:00.000-08:00</published><updated>2010-03-05T20:28:07.491-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>[转]内部交易令火车票一票难求-实拍视频</title><content type='html'>经济学家&lt;a href="http://zh.wikipedia.org/wiki/%E6%9D%A8%E5%B0%8F%E5%87%AF"&gt;杨小凯&lt;/a&gt;对 内生交易成本的定义是“自利决策之间的冲突，或激励不相容引起的扭曲”，这句话听起来有几分令人不解，但简单的意思就是在没有约束的情况下，每一个人都会 想方设法获取最大利益。特殊的国情让中国灰色的内生交易成本远高于外生交易成本，相比较之下美国则是外生交易成本远高于内生交易成本。&lt;em&gt; 公共运输部门如铁路基本上为政府所垄断，而&lt;a href="http://zh.wikipedia.org/wiki/%E6%98%A5%E8%BF%90"&gt;春运&lt;/a&gt;是一年一度的最大旺季，火车票一票难求的情景为何年年如此，年年无法得到改观？信息不透明的内生垄断决定了这一切，但同样信息传播迅速的互联网或许能产生一点约束力。有人将拍摄的火车站内部刷票的视频公布在网上，我们所能做的就是加大传播（&lt;a href="http://www.youtube.com/watch?v=ZBUDaQ4-l1w"&gt;视频一&lt;/a&gt;，&lt;a href="http://www.youtube.com/watch?v=jw3gygstnBg"&gt;二&lt;/a&gt;，&lt;a href="http://www.youtube.com/watch?v=WGTPU6jatUY"&gt;三&lt;/a&gt;）。&lt;/em&gt;&lt;br/&gt;&lt;br/&gt;转自： http://society.solidot.org/article.pl?sid=09/01/11/0722246&amp;amp;from=rss&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-3010210769854250939?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/3010210769854250939/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=3010210769854250939' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3010210769854250939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3010210769854250939'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2009/01/blog-post.html' title='[转]内部交易令火车票一票难求-实拍视频'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-3216088568361883741</id><published>2008-12-30T17:00:00.000-08:00</published><updated>2010-03-05T20:28:06.971-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>难忘2008-磨砺与灾难</title><content type='html'>今天是二〇〇〇八的最后一天， 我身在深圳的一间还有1个月就到期的出租房内， 身边的摆设有一台刚刚买的二手9成新自行车； 一台黑色伊莱克斯咖啡机；电脑桌上摆着一罐喝了一半的蜂蜜、一个自己用水溶C100饮料做的笔筒还有一本我想看却一直没看完的TAOCP，  自己坐在一间买了还没洗过但是还很干净的床单上，在一台联想-(减号) IBM 的笔记本上用短粗的手指打下这些文字。&lt;br/&gt;&lt;br/&gt;这个开头有些烦人的冗长，也许正是在纪念2008之前给人的心理准备吧， 很多人都没有预料到这一年会有这么多事情发生。说明8这个数字也不是什么时候都是吉利的， 就是在这个会发的年份里， 有太多的人破产到一无所有。 就是这个被人们赋予无限希望的2008， 却成为多灾多难的一个代表。&lt;br/&gt;&lt;br/&gt;今年发生了太多太多的大事，今天在这个浅薄的帖子中就不讨论这些了， 有些不重要的我们讨论的再多也会有一天想不起， 而那些刻苦铭心的事即使我们不愿提及，却能够从几个回眸之间了解全部所想。你一定猜到了我想说什么---- 5 1 2 ~_^~_~^_^^&amp;amp;&amp;amp;,时隔半年多了， 你那里的大地还在颤抖， 抖的人心里发毛。 今天坐在沙发上听到有一些隆隆的声音， 竖起耳朵仔细听，忽然想起了那一天在教室里面相同的情景， 和仓惶之间的逃跑。以及接下来的那几天， 讨厌的雨和颤抖的大楼我们从地板上一跃而起还有在晃完之后又回去。学校的操场上的露营还有已经各奔东西兄弟们的促膝长谈。 还记得在一个暴雨的夜晚，去女生宿舍宿舍里面和你一起出来避难的那次， 可爱的同学们抱着被子满布学校的露宿， 和那宿舍一楼大厅睡满人的壮观场景。 最重要的是在那些患难的日子里面体验到的真情。想起这些就觉得自己幸福多了， 因为我们现在还有吃还有穿不冷也不饿， 明天还能打着飞的去见面。 还能硬着头皮多请假，尽管在一个小时前我还在满腹的抱怨， 但是想着这些我觉得幸福多了。&lt;br/&gt;&lt;br/&gt;2008还有一件事情就是大事-我工作了。想起在匆匆的离开学校， 匆匆的和你告别， 想起闲散的北京的几日游...一直想到现在。。。 还记得第一天到深圳有杨熙两口子（第一个领证的，NB）当向导， 还是吃了个狗屎， 公司竟然没有接的人。 这是我对赛龙的一次印象 ，绝对深刻， 而且深圳这个城市和我的想象只有一点可以符合， 那就是物价确实很贵。 其他诸如祖国的特区之类的没有特别的感觉， 也不过那样而已，同时也觉得深圳有些铜钱味道的俗气。 刚到公司就感觉到自己选错地方了， 这种感觉直到现在还没有减小-杂乱的前台， 到处都是乱放的东西， 狭小的办公空间， 和精神有些呆滞的人们。 而自己呢， 也被啥都不懂的HR分到了自己从来不愿意去的一个部门，同时暂时住在一间被用作办公室的毛坯房里面， 这样持续了一个星期。 一个星期之后， 我提出了换部门， 那个Bob（这个人的名字和我实习的时候那个经理一样）-当时我的上级还想说服我留下， 在第二天， 我写了一份很正式、诚恳的E-mail给他之后， 他同意让我转到当初选的部门。&lt;br/&gt;&lt;br/&gt;那以后， 我就在我住的毛坯房里面上班了， 吃住都在那里了， 晚上还有一个很大的空调斥候着， 不亦乐乎。。。不过最终我还是找到了一个住处， 就是现在的住处-一件很小， 却很精致的房间。&lt;br/&gt;就这样开始了， 开始一个做自己喜欢的职业-写程序的人（而不是这份工作）。&lt;br/&gt;&lt;br/&gt;其实， 最最最重要的， 就是明天，就是PHR。&lt;br/&gt;&lt;br/&gt;Without You, noting really make sense.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-3216088568361883741?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/3216088568361883741/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=3216088568361883741' title='2 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3216088568361883741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3216088568361883741'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/12/2008.html' title='难忘2008-磨砺与灾难'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-8947723592618232913</id><published>2008-11-20T17:12:00.000-08:00</published><updated>2010-03-05T20:28:06.960-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>分享一首歌Plain White T's - Hey There Delilah</title><content type='html'>&lt;object width="425" height="344"&gt;&lt;param name="movie" value="http://www.youtube.com/v/EbJtYqBYCV8&amp;hl=zh_CN&amp;fs=1"&gt;&lt;/param&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/param&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/EbJtYqBYCV8&amp;hl=zh_CN&amp;fs=1" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="344"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-8947723592618232913?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/8947723592618232913/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=8947723592618232913' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8947723592618232913'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8947723592618232913'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/11/plain-white-t-hey-there-delilah.html' title='分享一首歌Plain White T&amp;#39;s - Hey There Delilah'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-2502833531109434721</id><published>2008-11-20T16:57:00.000-08:00</published><updated>2010-03-05T20:28:06.947-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='未来'/><title type='text'>许愿</title><content type='html'>许个愿, 希望我们可以更加丰富， 希望我们可以更加深度， 希望我们的生活都丰富多彩。&lt;br/&gt;&lt;br/&gt;&lt;img src="http://fineartamerica.com/images-medium/colorful-venice-daniel-wall.jpg" width="450" height="300" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-2502833531109434721?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/2502833531109434721/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=2502833531109434721' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/2502833531109434721'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/2502833531109434721'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/11/blog-post_20.html' title='许愿'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-3345348233622788398</id><published>2008-11-09T16:10:00.000-08:00</published><updated>2010-03-05T20:28:06.931-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>金正日：身正不怕影斜（图）</title><content type='html'>&lt;img src="file:///C:/DOCUME%7E1/kzj/LOCALS%7E1/Temp/moz-screenshot.jpg" /&gt;&lt;a href="http://kzjeef.yo2.cn/wp-content/uploads/121/12128/2008/11/5361535356385337931.jpg" title="身正不怕影子歪"&gt;&lt;img src="http://kzjeef.yo2.cn/wp-content/uploads/121/12128/2008/11/5361535356385337931.jpg" alt="身正不怕影子歪" /&gt;&lt;/a&gt;&lt;br/&gt;&lt;br/&gt;作者： http://hexieshangan.blog.163.com/blog/static/89918497200810553251966&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-3345348233622788398?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/3345348233622788398/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=3345348233622788398' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3345348233622788398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3345348233622788398'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/11/blog-post_09.html' title='金正日：身正不怕影斜（图）'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-934761433626149641</id><published>2008-11-08T20:50:00.000-08:00</published><updated>2008-11-08T21:14:36.372-08:00</updated><title type='text'>About Prelink &amp; Enable prelink in Unbuntu</title><content type='html'>&lt;p  style="font-family:arial;"&gt;  &lt;span style="font-size:130%;"&gt;&lt;span class="header"&gt;What is Prelinking?&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;p face="arial"&gt;&lt;/p&gt;&lt;blockquote&gt; &lt;p face="arial"&gt;&lt;br /&gt;Prelinking is a process that allows you to speed up the process of dynamic  linking. What it does is, through a process of magic that is incredibly  complex, but basically  it speeds up the relocation process, in loading   shared libraries.. by setting preferred load addresses.&lt;/p&gt;&lt;p face="arial"&gt;What is he talking about, you ask? Well, here's how it goes. Dynamically linked libraries (often referred to as DSO's or in the windows world DLLs) are libraries which are loaded at runtime. The advantage of shared libraries versus static libraries is, that it reduces the size of executables, since each program doesn't need its libraries built in, but will dynamically locate and use it at run time. This adds some overhead, because the address space of the library, instead of being known in advance, has to be mapped at runtime. Another advantage of shared libraries is that due to the magic of copy-on-write, you can save memory when you have multiple programs sharing the same library (though it's not as simple as that.. it is pretty complicated) &lt;/p&gt;   &lt;p style="font-family: arial;"&gt; Pre-linking sets preferred address space for the libraries to be loaded at. Note they are _preferred_ spaces, and if that address space is not available, then it will use relocation to load it dynamically.. hence pre-linking is not 100% foolproof.&lt;span style="font-weight: bold;font-size:130%;" class="header" &gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: arial;"&gt;&lt;span style="font-weight: bold;font-size:130%;" class="header" &gt;&lt;blockquote&gt;&lt;/blockquote&gt;What do I need to prelink?&lt;blockquote&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/p&gt;&lt;p style="font-family: arial;"&gt;&lt;br /&gt;To prelink, you need at least:&lt;br /&gt;- glibc 2.3.1 or greater&lt;br /&gt;- libelf or elfutils 0.7, though 0.8 is preferred. Latest version as of this writing is 0.84&lt;br /&gt;- Your shared libraries have to be compiled with -fPIC&lt;br /&gt;- the prelink program from &lt;a href="ftp://people.redhat.com/jakub/prelink"&gt;ftp://people.redhat.com/jakub/prelink&lt;/a&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;p style="font-family: arial;"&gt;&lt;a href="ftp://people.redhat.com/jakub/prelink"&gt;&lt;/a&gt; &lt;/p&gt;&lt;br /&gt;&lt;sp  style="font-family:arial;"&gt;&lt;span style="font-size:130%;"&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;HOWTO: Enable prelink&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;Prelink is in universe. I use it on my Ubuntu system without issues, but do google about Prelink and do your research before trying it out.&lt;br /&gt;&lt;br /&gt;How to enable prelink:&lt;br /&gt;&lt;br /&gt;1. Activate Ubuntu universe sources. The procedure is well-documented by Ubuntu.&lt;br /&gt;2. use apt-get or synaptic to install prelink.&lt;br /&gt;3. Open /etc/default/prelink with your favorite editor, as sudo/root.&lt;br /&gt;4. Change PRELINKING=unknown from unknown to yes.&lt;br /&gt;5. Adjust the other options if you know what the heck you're doing. Defaults work well.&lt;br /&gt;6. To start the first prelink (the longest one!), run sudo /etc/cron.daily/prelink&lt;br /&gt;&lt;br /&gt;In the future, prelink performs a quick prelink (a less-than-1-minute procedure on most systems) daily, usually at midnight. Every 14 days, or whatever you changed it to be, a full prelink will run.&lt;br /&gt;&lt;br /&gt;If you just did a major apt-get upgrade that changed systemwide libraries (i.e. libc6, glibc, major gnome/X libs, etc etc etc) and experience cryptic errors about libs, rerun step 6.&lt;br /&gt;&lt;br /&gt;To undo prelink, change step 4 from yes to no, then rerun step 6.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;WARNING:&lt;br /&gt;An amd64 users in another thread (http://ubuntuforums.org/showpost.php...3&amp;amp;postcount=16) reports having experienced trouble with AMD64 prelinking. I have NOT tried prelinking on anything other than an i386!&lt;/sp&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-934761433626149641?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/934761433626149641/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=934761433626149641' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/934761433626149641'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/934761433626149641'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/11/about-prelink-enable-prelink-in-unbuntu.html' title='About Prelink &amp; Enable prelink in Unbuntu'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-4853913372970829308</id><published>2008-11-05T06:02:00.000-08:00</published><updated>2008-11-08T21:02:38.105-08:00</updated><title type='text'>移植 tslib 到Android 的注意事项</title><content type='html'>tslib是这样的结构， tslib只是一个上层， 他主要是调用它的那些插件来处理从驱动那里得到的点，&lt;br /&gt;插件的顺序是你的 ts.conf 里面的插件的顺序。&lt;br /&gt;昨天发现能够从/dev/input/event1里面读出东西来， 却不能够用ts_test来响应，原来是驱动送上来的点不符合规则， （更搞笑的是他还没意识到这点， 坚持说自己是对的）， 我用的插件是 input 插件， 找到问题以后就好办了， 改configure.ac里面， 给自己加一个插件， 就叫ac97吧， 然后创建文件 tslib_src/plugins/ac97-raw.c ， 把你“特殊”的驱动加进去就可以了。&lt;br /&gt;&lt;br /&gt;测试的时候， 发现很慢， 奇怪驱动送上来的点是很快的啊， 结果发现是因为我在读入每个点之后都打印了调试信息， 所以导致tslib的延迟， 如果你的系统也存在同样的问题， 最好去掉debug试一试， 毕竟终端是比较慢的设备。&lt;br /&gt;&lt;br /&gt;其实把tslib放入Android里面首先要解决的问题是Android的编译系统， 你要把tslib， 和那些你用到的插件们都编译成动态库的形式， 可以参考其他库的Android.mk文件来编写， 还有就是你要把ts_test, ts_calebrate编译成可执行文件， 同样是编写Android.mk。&lt;br /&gt;&lt;br /&gt;因为Android是从/dev/input/event0读入鼠标事件， 我们的想法就是不要去改动他的代码， 在后台运行一个daemon， 它就是把 /dev/input/event1中读出来的坐标（经过校准的），inject到event0里面， 这样一来就可以不修改Android的代码， 而加入我们的东西。&lt;br /&gt;我在想， 要不要把tslib的东西checkin到Android的baseline中呢。 这是一个好想法。 毕竟不是所有人都用电容触摸屏的。&lt;br /&gt;&lt;br /&gt;移植进入Android里面可能会有这样的问题， 就是点击触摸屏和键盘会没有反应， 其实这是因为电源管理相关的东西导致的， 如果你也遇到同样的问题， 那么请屏蔽掉 _android_src_/hardware/libhardware/power.c中的函数（关键是最后一个函数， 函数名我忘了呵呵）。&lt;br /&gt;&lt;br /&gt;PS：fprintf到stderr上严重影响性能， 用打log调试确实不是一个好的方法， 在tiny loop和相应用户事件的地方不要大量的打log， 这也是为什么让我体会到了Android中的logger设备的优点啊。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-4853913372970829308?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/4853913372970829308/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=4853913372970829308' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4853913372970829308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4853913372970829308'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/11/tslib-android.html' title='移植 tslib 到Android 的注意事项'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-8442549480551362128</id><published>2008-11-02T03:02:00.000-08:00</published><updated>2010-03-05T20:28:06.916-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='情怀'/><title type='text'>苍白</title><content type='html'>早上起来， 睁开眼睛。 发觉自己如同关在一个烤炉里散失这水分。原来是没有开窗户。 外面传来工地和机械的嘈杂声， 想着昨天一夜之间我失去了什么。 想着那些话， 那些现在已经开始的话，&lt;br/&gt;&lt;br/&gt;后脑有些镇痛， 大概是熬夜加刺激的原因， 看着房间里面的家具， 竟然和昨天完全不一样， 于是也重新拾起了被我遗弃已久的博客。&lt;br/&gt;&lt;br/&gt;我醒着吗？ 感觉它们都是一个个静物，我变成了素描画。除了我没有定格， 其他的东西都已经和我没有关系，黑白色。尽管他们有很多都已经不是原来的颜色， 但是现在看到的都是黑白色。 不，只有白色的色调变化而已。&lt;br/&gt;&lt;br/&gt;有风轻轻吹入房间， 原来是我已经打开了窗户， 管着的房门也因为风的缘故发出一些响声， 奇怪， 这些都是我熟悉的。 为何如此陌生了。&lt;br/&gt;&lt;br/&gt;一个， 两个脚直接踏在地板上，  也许以前不经常这么做吧， 或许我发觉了我的身体或者说皮囊已经开始和我的灵魂有些偏移， 重影有些错位， 就像没有印刷好的一张照片。 去看看小可，也许会让我好些。&lt;br/&gt;&lt;br/&gt;对了， 我很无知， 原来这个季节已经没有台风了。  所以计划赶不上变化。&lt;br/&gt;&lt;br/&gt;我才发觉， 有许多我没有关注的事情， 尤其是她的细微感受。&lt;br/&gt;&lt;br/&gt;“世界非常安静&lt;br/&gt;需要深呼吸 才能呼吸”&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-8442549480551362128?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/8442549480551362128/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=8442549480551362128' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8442549480551362128'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8442549480551362128'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/11/blog-post.html' title='苍白'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-269734222110073208</id><published>2008-10-21T17:27:00.000-07:00</published><updated>2010-03-05T20:28:06.325-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='android'/><title type='text'>无趣，即使对于android</title><content type='html'>对android了解的越多， 当初的兴趣就慢慢的没那么浓厚了。 感觉差距很大啊， 鸿沟一样。 而我们还在用着陈旧的方法，低级的手段， 做这样的开发让我感觉很累。 很无趣。 让人感觉不到希望。&lt;br/&gt;&lt;br/&gt;这行， 我算了解很多了。&lt;br/&gt;&lt;br/&gt;要想办法转行了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-269734222110073208?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/269734222110073208/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=269734222110073208' title='2 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/269734222110073208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/269734222110073208'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/10/android.html' title='无趣，即使对于android'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-1525056944434536863</id><published>2008-10-21T09:18:00.000-07:00</published><updated>2008-10-21T09:20:19.240-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='android eabi'/><title type='text'>android eabi lib</title><content type='html'>Android SDK里面所带的二进制库生成全部是EABI兼容的， 那么什么是EABI？ 对&lt;br /&gt;我们有什么意义呢？&lt;br /&gt;&lt;br /&gt;1.这里现介绍一下什么是EABI（Embedded Application Binary Interface）&lt;br /&gt;&lt;br /&gt;       EABI最早是从powerPC 在 UNIX V5 的ABI（Application Binary&lt;br /&gt;       Interface）的补充的基础上构建的， 他的木表示减少内存使用和优化执&lt;br /&gt;       行速度， 而且这些都是特别针对于嵌入式系统软件的。&lt;br /&gt;       EABI规定了一下几个内容：&lt;br /&gt;             * 文件的格式&lt;br /&gt;             * 数据类型和对齐&lt;br /&gt;             * 寄存器用法的规定&lt;br /&gt;             * 堆栈布局和组织&lt;br /&gt;             * 函数参数传递顺序&lt;br /&gt;             * 小数据区域(data area)的用法和组织&lt;br /&gt;&lt;br /&gt;2. 对我们有什么意义呢？&lt;br /&gt;       EABI兼容的二进制库除了在速度上有所优化以外， 它还保证了一样东&lt;br /&gt;       西。&lt;br /&gt;       就是让软件开发着可以混合使用EABI兼容的不同厂商之间的二进制库，&lt;br /&gt;       只要他们是EABI兼容的， 并且开发者的软件也是用EABI兼容的编译起编&lt;br /&gt;       译的， 就可以正确的一起使用。&lt;br /&gt;&lt;br /&gt;       这样， 我们就可以在不能拿到代码， 或者是专门为本平台编译过的二进&lt;br /&gt;       制库的情况下来使用这些二进制库。&lt;br /&gt;&lt;br /&gt;       就近来讲， 就是Android SDK 里面带的.so文件， 有一些我们可以不必&lt;br /&gt;       要拿到代码，或者重新编译。 但是为了能够正确的使用这些库。 可能还&lt;br /&gt;       是需要一些支持工作。 比如这些库和驱动之间的接口之类的。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-1525056944434536863?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/1525056944434536863/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=1525056944434536863' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/1525056944434536863'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/1525056944434536863'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/10/android-eabi-lib.html' title='android eabi lib'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-4282422305104566254</id><published>2008-10-08T00:38:00.000-07:00</published><updated>2008-10-08T00:49:44.858-07:00</updated><title type='text'>[转贴] Pointers to C++ Member Functions</title><content type='html'>&lt;h1&gt;&lt;a name="title"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/h1&gt;&lt;p&gt;&lt;i&gt;这篇文章很好的讲述了指向成员函数的指针怎么用， 后面对性能做了分析很精彩。&lt;br /&gt;&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;i&gt;A tutorial on a useful yet poorly understood language feature, useful as a cache or to enable a different sort of polymorphism.&lt;/i&gt;&lt;/p&gt;&lt;p&gt;&lt;a href="http://www.goingware.com/tips/"&gt;Michael D. Crawford&lt;/a&gt;&lt;br /&gt;&lt;a href="mailto:crawford@goingware.com"&gt;crawford@goingware.com&lt;/a&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;!-- Copyright (C) 2002 Michael D. Crawford --&gt;&lt;p&gt;Copyright © 2002 Michael D. Crawford.&lt;/p&gt;&lt;p&gt;&lt;!-- Creative Commons License --&gt;&lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/2.5/"&gt;&lt;img alt="Creative Commons License" src="http://creativecommons.org/images/public/somerights20.gif" /&gt;&lt;/a&gt;&lt;br /&gt;This work is licensed under a &lt;a rel="license" href="http://creativecommons.org/licenses/by-sa/2.5/"&gt;Creative Commons Attribution-ShareAlike 2.5 License&lt;/a&gt;.&lt;!-- /Creative Commons License --&gt;&lt;!--&lt;rdf:rdf xmlns="http://web.resource.org/cc/" dc="http://purl.org/dc/elements/1.1/" rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"&gt;&lt;work about=""&gt;   &lt;dc:title&gt;Pointers to C++ Member Functions&lt;/dc:title&gt;   &lt;dc:date&gt;2002&lt;/dc:date&gt;   &lt;dc:description&gt;A tutorial on a useful yet poorly understood language feature, useful as a cache or to enable a different sort of polymorphism.&lt;/dc:description&gt;   &lt;dc:creator&gt;&lt;agent&gt;      &lt;dc:title&gt;Michael D. Crawford&lt;/dc:title&gt;   &lt;/agent&gt;&lt;/dc:creator&gt;   &lt;dc:rights&gt;&lt;agent&gt;      &lt;dc:title&gt;Michael D. Crawford&lt;/dc:title&gt;   &lt;/agent&gt;&lt;/dc:rights&gt;   &lt;dc:type resource="http://purl.org/dc/dcmitype/Text"&gt;   &lt;dc:source resource="http://www.goingware.com/tips/member&amp;#45;pointers.html"&gt;   &lt;license resource="http://creativecommons.org/licenses/by-sa/2.5/"&gt;&lt;/work&gt;&lt;license about="http://creativecommons.org/licenses/by-sa/2.5/"&gt;   &lt;permits resource="http://web.resource.org/cc/Reproduction"&gt;   &lt;permits resource="http://web.resource.org/cc/Distribution"&gt;   &lt;requires resource="http://web.resource.org/cc/Notice"&gt;   &lt;requires resource="http://web.resource.org/cc/Attribution"&gt;   &lt;permits resource="http://web.resource.org/cc/DerivativeWorks"&gt;   &lt;requires resource="http://web.resource.org/cc/ShareAlike"&gt;&lt;/license&gt;&lt;/rdf:RDF&gt;--&gt;&lt;/p&gt;&lt;/blockquote&gt;&lt;h2&gt;&lt;a name="abstract"&gt;Abstract&lt;/a&gt;&lt;/h2&gt;&lt;p&gt; &lt;i&gt;Pointers to Member Functions&lt;/i&gt; are one of C++'s more rarely used features, and are often not well understood even by experienced developers. This is understandable, as their syntax is necessarily rather clumsy and obscure.&lt;/p&gt;&lt;p&gt; While they do not have wide applicability, sometimes member function pointers are useful to solve certain problems, and when they do apply they are often the perfect choice, both for improved performance and to make the code sensible. They work very well to cache the result of a frequently made decision, and to implement a different sort of polymorphism.&lt;/p&gt;&lt;p&gt;I discuss what member function pointers are, how to declare and use them, and give some examples of problems that they solve very well.&lt;/p&gt;&lt;h2&gt;&lt;a name="contents"&gt;Contents&lt;/a&gt;&lt;/h2&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://linuxquality.sunsite.dk/articles/memberpointers/#abstract"&gt;Abstract&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://linuxquality.sunsite.dk/articles/memberpointers/#introduction"&gt; Introduction&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://linuxquality.sunsite.dk/articles/memberpointers/#not-addresses"&gt; Member Function Pointers Are Not Just Simple Addresses&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://linuxquality.sunsite.dk/articles/memberpointers/#decision-cache"&gt; Caching the Outcome of a Decision&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://linuxquality.sunsite.dk/articles/memberpointers/#performance"&gt; The Performance of Member Function Pointers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://linuxquality.sunsite.dk/articles/memberpointers/#details"&gt; Details About Using Member Function Pointers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://linuxquality.sunsite.dk/articles/memberpointers/#polymorphism"&gt; A Different Sort of Polymorphism&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h2&gt;&lt;a name="introduction"&gt;Introduction&lt;/a&gt;&lt;/h2&gt;&lt;p&gt; I don't have any hard numbers on how frequently member function pointers are used. While Ido see others mention them sometimes in Usenet and mailing list posts, I have yet to find someoneelse use one in code I have worked with, so my impression is that they are not commonly applied.&lt;/p&gt;&lt;p&gt; Member function pointers are important because they provide an efficient way to cache the outcome of a decision over which member function to call. They can save time, and in some cases, provide a design alternative that avoids the need to implement such decision caching through memory allocation. I will return to this further on.&lt;/p&gt;&lt;p&gt; Member function pointers allow one to call one of several of an object's member functions indirectly. Each of the functions whose "address" is stored must share the same signature. &lt;/p&gt; &lt;p&gt; I put "address" in quotes because the information stored in a member function pointer is not simply the memory address of the start of the member function's code; conceptually it is an offset into the list of functions declared by the class, and in the case of virtual functions will include a real offset into the &lt;code&gt;vtbl&lt;/code&gt;, or table of virtual function pointers.&lt;/p&gt;&lt;p&gt; Member function pointers cannot be dereferenced (have their function called) directly by themselves. They must be called on behalf of some object, that then provides the "this" pointer for use by the member functions.&lt;/p&gt;&lt;p&gt; To illustrate how to declare and call a member function pointer, I will start by giving an example ofdeclaring and dereferencing an ordinary pointer to a non-member function. You declare a functionpointer by giving the prototype of a function it can point to, with the name of the function replacedby &lt;code&gt;(*pointerName)&lt;/code&gt;.  Regular function pointers share the same syntax between C and C++:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;void Foo( int anInt, double aDouble );void Bar(){       &lt;strong&gt; void (*funcPtr)( int, double ) = &amp;Foo;&lt;/strong&gt;        &lt;strong&gt;(*funcPtr)( 1, 2.0 );&lt;/strong&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt; For regular function pointers, it is optional to use the address-of operator &lt;code&gt;&amp;amp;&lt;/code&gt; when taking the address of a function, but it is required for taking the address of member functions. g++ will compile source that leaves it out, but emits a warning.&lt;/p&gt;&lt;p&gt; To declare a pointer to member function, you give the prototype of a function it can point to, as before, but the name of this function is replaced by a construction that scopes the pointer - you give it the name of the class whose member functions it can point to, as &lt;code&gt;(ClassName::*pointerName)&lt;/code&gt;. Note that a given member function pointer can only point to functions that are members of the class it was declared with. It cannot be applied to an object of a different class even if it has member functions with the same signature.&lt;/p&gt;&lt;p&gt; You dereference a member function pointer by using &lt;code&gt;.*&lt;/code&gt; or &lt;code&gt;-&gt;*&lt;/code&gt;, supplying a reference or pointer to an object on the left, as appropriate, and the function pointer on the right.&lt;/p&gt;&lt;p&gt; Here is a simple example:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;class Foo{       &lt;br /&gt;public:&lt;br /&gt;              double One( long inVal );&lt;br /&gt;              double Two( long inVal );&lt;br /&gt;};&lt;br /&gt;void main( int argc, char **argv )&lt;br /&gt;{	&lt;strong&gt;&lt;br /&gt;   double (Foo::*funcPtr)( long ) = &amp;amp;Foo::One;&lt;/strong&gt; 	&lt;br /&gt;      Foo aFoo;&lt;br /&gt;	&lt;strong&gt;double result =(aFoo.*funcPtr)( 2 );&lt;br /&gt; &lt;/strong&gt;return 0;&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt; Declaring a member function pointer is clumsy at best and is hard to get right until you have used them for a while. Rather than declaring them using the full prototype each time, it is helpful to use a &lt;code&gt;typedef&lt;/code&gt; as I show in the example below.&lt;/p&gt;&lt;h2&gt;&lt;a name="not-addresses"&gt;Member Function Pointers Are Not Just Simple Addresses&lt;/a&gt;&lt;/h2&gt;&lt;p&gt; Most C and C++ programmers know that it is bad style to assume that a pointer is the same size as an int, although this may often be the case. What is less well known is that pointers of different types may not be the same size as each other. For example, in 16-bit x86 programming near pointers and far pointers may have different sizes, where the far pointers consist of the segment and offset together, while near pointers just have the offset. Member function pointers are generally small structures, that encode information about a function's virtualness, multiple inheritance and so on.&lt;/p&gt;&lt;p&gt; In the case of the example shown below, compiled with g++ 2.95.2 on a PowerPC G3 Mac OS X iBook, I found that the size of the member function pointer I created was eight bytes.&lt;/p&gt;&lt;p&gt; This can result in surprises to the user. For example, Microsoft Visual C++ 6 allows the programmer to make an optimization (which is apparently enabled by default) which can cause member function pointers that are intended to be the same type but are declared in different circumstances to have different sizes. Using the wrong setting for your project may result in an apparently gross code generation bug, because a member function pointer returned by a function that supplies them may have a different size than the recipient function expects, causing bogus data to be overwritten on the stack.&lt;/p&gt;&lt;p&gt; There is an item in VC++'s settings labeled "representation" that has a choice between "best case always" and "most general always". If you work with member function pointers in Visual C++, check the documentation for what these settings do and select the right one; if in doubt, select "most general always".&lt;/p&gt; &lt;h2&gt;&lt;a name="decision-cache"&gt;Caching the Outcome of a Decision&lt;/a&gt;&lt;/h2&gt;&lt;p&gt; One of the best uses for member function pointers is caching the outcome of a decision over which ofseveral member functions should be called in a particular circumstance. If a decision is always going to yield the same result, then it may be faster and even cleaner to make the decision just once ahead of time, then store the outcome in the form of a member function pointer. This is especially advantageous when the decision will be made repeatedly in a loop.&lt;/p&gt;&lt;p&gt; Here is an admittedly silly (but hopefully clear) example, that shows a member function pointer being used to store the outcome of a decision. It also illustrates the use of &lt;code&gt;typedef&lt;/code&gt;:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;#include &lt;stdlib.h&gt;&lt;br /&gt;#include &lt;iostream&gt;&lt;br /&gt;class Test{&lt;br /&gt; public:&lt;br /&gt; Test( long inVal )&lt;br /&gt; : mVal( inVal )&lt;br /&gt;{}&lt;br /&gt; long TimesOne() const;&lt;br /&gt; long TimesTwo() const;&lt;br /&gt; long TimesThree() const;&lt;br /&gt; private:	&lt;br /&gt;	long mVal;&lt;br /&gt;};&lt;br /&gt;&lt;strong&gt;&lt;br /&gt;typedef long (Test::*Multiplier)() const;&lt;/strong&gt;&lt;br /&gt;int main( int argc, char **argv )&lt;br /&gt;{&lt;br /&gt; using std::cerr;&lt;br /&gt; using std::endl;&lt;br /&gt; using std::cout;&lt;br /&gt; if ( argc != 3 ){&lt;br /&gt; cerr  &lt;&lt; "Usage: PtrTest value factor"  &lt;&lt; endl;&lt;br /&gt; return 1;&lt;br /&gt; }&lt;br /&gt; &lt;strong&gt;Multiplier funcPtr;&lt;/strong&gt;&lt;br /&gt; switch( atol( argv[ 2 ] ) ){&lt;br /&gt; case 1:&lt;br /&gt; &lt;strong&gt;funcPtr = &amp;amp;Test::TimesOne;&lt;/strong&gt;&lt;br /&gt; break;&lt;br /&gt; case 2:			&lt;strong&gt;&lt;br /&gt;funcPtr = &amp;amp;Test::TimesTwo;&lt;/strong&gt;&lt;br /&gt; break;		&lt;br /&gt;case 3:			&lt;strong&gt;&lt;br /&gt;funcPtr = &amp;amp;Test::TimesThree;&lt;/strong&gt;&lt;br /&gt; break;		&lt;br /&gt;default:			&lt;br /&gt;cerr &lt;&lt; "PtrTest: factor must range from 1 to 3"  &lt;&lt; endl;			&lt;br /&gt;return 1;	&lt;br /&gt;}	&lt;br /&gt;cout  &lt;&lt; "sizeof( funcPtr )="  &lt;&lt; sizeof( funcPtr )  &lt;&lt; endl;&lt;br /&gt; Test myTest( atol( argv[ 1 ] ) );&lt;br /&gt; cout &lt;&lt; "result="  &lt;&lt; &lt;strong&gt;(myTest.*funcPtr)()&lt;/strong&gt;  &lt;&lt;endl;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;long Test::TimesOne() const{&lt;br /&gt; return mVal;&lt;br /&gt;}&lt;br /&gt;long Test::TimesTwo() const{&lt;br /&gt; return 2 * mVal;&lt;br /&gt;}&lt;br /&gt;long Test::TimesThree() const{&lt;br /&gt; return 3 * mVal;&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt; Now I present an example that does not perform as well as it could because performs a &lt;code&gt;switch&lt;/code&gt; decision many times inside a loop, always reaching the same decision. It is a good candidate to refactor by using a pointer to member function. Again it is a silly example but I wanted to be very clear:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;#include &lt;exception&gt;class Test{&lt;br /&gt; public:	&lt;br /&gt;	Test( long inFactor )	&lt;br /&gt;		: mFactor( inFactor ){}&lt;br /&gt; long TimesOne( long inToMultiply ) const;&lt;br /&gt; long TimesTwo( long inToMultiply ) const;&lt;br /&gt; long TimesThree( long inToMultiply ) const;	&lt;br /&gt;	long MultiplyIt( long inToMultiply ) const;&lt;br /&gt; private:	&lt;br /&gt;	long mFactor;};&lt;br /&gt;long Test::MultiplyIt( long inToMultiply ) const{&lt;br /&gt; &lt;strong&gt;switch( mFactor ){&lt;br /&gt; // decision made repeatedly that always yields the same result&lt;/strong&gt;		&lt;br /&gt;&lt;br /&gt;case 1:			&lt;br /&gt;return TimesOne( inToMultiply );			&lt;br /&gt;break;		&lt;br /&gt;case 2:	&lt;br /&gt;		return TimesTwo( inToMultiply );		&lt;br /&gt;break;		&lt;br /&gt;case 3:			&lt;br /&gt;return TimesThree( inToMultiply );		&lt;br /&gt;	break;		&lt;br /&gt;default:			&lt;br /&gt;throw std::exception();	&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;void MultiplyThem( long inFactor )&lt;br /&gt;{	&lt;br /&gt;Test myTest( 2 );	&lt;br /&gt;	long product;	// Call a function that makes the same decision many times	&lt;br /&gt;&lt;br /&gt;for ( long i = 0; i &lt; 1000000; ++i )		&lt;br /&gt;product = myTest.MultiplyIt( i );&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt; In most cases where an identical decision is made inside a loop, it is better to refactor the code so that thedecision is outside the loop, and the loop is repeated in each branch of the loop (or packaged inside a subroutine):&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;void Foo( long value ){	for ( long i = 0; i &lt; 1000000; ++i ){	&lt;br /&gt;	&lt;strong&gt;switch( value ){	&lt;br /&gt;	// BAD CODE: always reaches the same decision&lt;/strong&gt;		&lt;br /&gt;		case 1:				//...			&lt;br /&gt;	break;			case 2:			&lt;br /&gt;	//...				break;			&lt;br /&gt;case 3:				//...				&lt;br /&gt;break;		}&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt; Instead we place the switch outside the loop:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;void Foo( long value ){	&lt;strong&gt;switch( value ){	&lt;br /&gt;	// BETTER CODE: decision made only once&lt;/strong&gt;	&lt;br /&gt;	case 1:		&lt;br /&gt;	for ( long i = 0; i &lt; 1000000; ++i ){	&lt;br /&gt;			//...			&lt;br /&gt;}			&lt;br /&gt;break;		&lt;br /&gt;case 2:			&lt;br /&gt;for ( long i = 0; i &lt; 1000000; ++i ){			&lt;br /&gt;	//...		&lt;br /&gt;	}		&lt;br /&gt;	break;		&lt;br /&gt;//...&lt;br /&gt; }&lt;br /&gt;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt; If you want to avoid repeating the loop implementations and each branch of the decision has similar code, you can place them inside subroutines.&lt;/p&gt;		&lt;p&gt; &lt;i&gt;Member function pointers are the best solution when it is not practical to refactor this way.&lt;/i&gt; Onereason might be that the loop and the decision are in code that belongs to different classes, and you do not want to expose the implementation of the class that makes the decision. Here is the &lt;code&gt;MultiplyIt&lt;/code&gt; code above, refactored to use a pointer to member function:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;#include &lt;exception&gt;class Test{	public:		Test( long inFactor );		long TimesOne( long inToMultiply ) const;		long TimesTwo( long inToMultiply ) const;		long TimesThree( long inToMultiply ) const;		long MultiplyIt( long inToMultiply ) const;	private:		&lt;strong&gt;typedef long (Test::*Multiplier)( long inToMultiply ) const;&lt;/strong&gt;		long       mFactor;		&lt;strong&gt;Multiplier mMultFuncPtr;		static Multiplier GetFunctionPointer( long inFactor );&lt;/strong&gt;};Test::Test( long inFactor )	: mFactor( inFactor ),	 &lt;strong&gt; mMultFuncPtr( GetFunctionPointer( mFactor ) )&lt;/strong&gt;{	return;}&lt;strong&gt;Test::Multiplier Test::GetFunctionPointer( long inFactor )&lt;/strong&gt;{	&lt;strong&gt;switch ( inFactor ){	// Decision only made once!&lt;/strong&gt;		case 1:			&lt;strong&gt;return &amp;amp;Test::TimesOne;&lt;/strong&gt;			break;		case 2:			&lt;strong&gt; return &amp;amp;Test::TimesTwo;&lt;/strong&gt;			break;		case 3:			&lt;strong&gt; return &amp;amp;Test::TimesThree;&lt;/strong&gt;			break;			default:			throw std::exception();	}}			long Test::MultiplyIt( long inToMultiply ) const{	&lt;strong&gt;// Using cached decision result	return (this-&gt;*mMultFuncPtr)( inToMultiply );	&lt;/strong&gt;}void MultiplyThem( long inFactor ){	Test myTest( 2 );		long product;	for ( long i = 0; i &lt; product =" myTest.MultiplyIt("&gt;&lt;/blockquote&gt;&lt;h2&gt;&lt;a name="performance"&gt;The Performance of Member Function Pointers&lt;/a&gt;&lt;/h2&gt;&lt;p&gt; Unfortunately, calling a member function by dereferencing a member function is more complicated than simply doing a subroutine jump off a register. The pointers are actually small structures and a little bit of work is required to find the actual address of the subroutine to jump to.&lt;/p&gt; &lt;p&gt; I'm afraid I do not have the g++ source code at hand or I could show you the implementation. I know that in tracing through calls via member function pointers in &lt;a href="http://www.metrowerks.com/"&gt;Metrowerks&lt;/a&gt; CodeWarrior for Windows, I found that a call would run a small piece of assembly code provided by CodeWarrior's library. This is pretty fast code, and will run very fast in a tight loop if it stays in the CPU's L1 cache, but it is not as fast as a simple compare and conditional branch.&lt;/p&gt;&lt;p&gt; If the decision your code is making repeatedly is very quick to run, it may not be to your advantage to use a member function pointer. A simple &lt;code&gt;if&lt;/code&gt; statement that compares two numeric values, or checks the value of a &lt;code&gt;bool&lt;/code&gt;, or possibly a &lt;code&gt;switch&lt;/code&gt; statement whose alternatives are all contained in a small range (so it is easy for the compiler to build a jump table) may be quicker than dereferencing a member function pointer.&lt;/p&gt;&lt;p&gt; However, if the decision is complicated or lengthy to arrive at, like string comparison or searching some data structure, then using a pointer to member function may be a big win.&lt;/p&gt;&lt;h2&gt;&lt;a name="details"&gt;Details About Using Member Function Pointers&lt;/a&gt;&lt;/h2&gt;&lt;p&gt; You may understand the reasons for implementing pointers to member functions as structures if you see that they can be assigned to the addresses of routines with different kinds of implementations, as long as they have the same calling convention:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;class Different{	public:		inline void InlineMember();		virtual void VirtualMember();		void OrdinaryMember();		static void StaticMember();		typedef void (Different::*FuncPtr)();};void Test(){	Different::FuncPtr ptr = &amp;amp;Different::InlineMember;	ptr = &amp;amp;Different::VirtualMember;	ptr = &amp;amp;Different::OrdinaryMember;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt;(You may be surprised to see me creating a pointer to an inline function, but this is perfectly normal. If you do this, the compiler will place a normal subroutine version of the inline's implementation in an object file and give you the address of that, so the function pointer does not really point to an inline function at all.)&lt;/p&gt;&lt;p&gt; However, although a static member function may appear to have the same calling convention, it really does not because it is not passed the &lt;code&gt;this&lt;/code&gt; pointer - &lt;code&gt;this&lt;/code&gt; is passed to your member functions just like any other parameter, but it is not given explicitly in the member function's prototype. You cannot use pointers to member functions to store the address of a static function (use an ordinary, non-member function pointer for that):&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;void Fails(){      &lt;br /&gt;Different::FuncPtr ptr = &amp;amp;Different::StaticMember;}&lt;br /&gt;&lt;br /&gt;mike% c++ different.cppdifferent.cpp: In function `void Fails()':different.cpp:24: initialization to `void (Different::*)()' from `void (*)()'&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt; Pointers to virtual member functions work just like calling a virtual member function directly - the type whose member function gets called is the dynamic type of the object it is called on behalf of, not the static type of the member function pointer:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;#include &lt;iostream&gt;class Base{	public:		virtual void WhoAmI() const;		&lt;strong&gt;typedef void (Base::*WhoPtr)() const;&lt;/strong&gt;};class Derived: public Base{	public:		virtual void WhoAmI() const;};void Base::WhoAmI() const{	std::cout &lt;&lt; "I am the Base" &lt;&lt;&gt;Base::WhoPtr func = &amp;amp;Base::WhoAmI;&lt;/strong&gt;	Base theBase;	&lt;strong&gt;(theBase.*func)();&lt;/strong&gt;	Derived theDerived;	&lt;strong&gt;(theDerived.*func)();&lt;/strong&gt;	return 0;}&lt;/pre&gt;&lt;/blockquote&gt;&lt;p&gt; Running the above program yields the following output:&lt;/p&gt;&lt;blockquote&gt;&lt;pre&gt;mike% ./virtual&lt;strong&gt;I am the BaseI am the Derived&lt;/strong&gt;&lt;/pre&gt;&lt;/blockquote&gt;&lt;h2&gt;&lt;a name="polymorphism"&gt;A Different Sort of Polymorphism&lt;/a&gt;&lt;/h2&gt;&lt;p&gt; Polymorphism in C++ is usually regarded as always implemented in the form of class heirarchies containing virtual member functions. &lt;/p&gt;&lt;p&gt; An object of a derived class can be supplied to create a pointer or reference to what is apparently the base class; a function pointer lookup in the &lt;code&gt;vtbl&lt;/code&gt; is done when calling a virtual member function off a pointer or reference, so that the function called will be based on the dynamic type that the pointer or reference denotes - that is, it will be from the actual type of the object that was allocated, rather than the static type that the base class pointer or reference is declared as.&lt;/p&gt;&lt;p&gt; However, the concept of polymorphism can take a more general meaning than that, and I have seen mailing list postings advocating that it should also include the use of templates that allow source code with identical syntax to be applied to objects of unrelated types. This &lt;code&gt;std::vector&lt;/code&gt; can be regarded as a polymorphic container that is parameterized by the type supplied as a parameter when a vector object is declared.&lt;/p&gt;&lt;p&gt; Pointers to member functions can be used to implement a different kind of polymorphism. In the regular type, we determine which member function ultimately gets called by allocating objects of different types, that are related members in an inheritance tree. This is implemented by having the &lt;code&gt;vptr&lt;/code&gt; that is a hidden member of the object point at the appropriate &lt;code&gt;vtbl&lt;/code&gt;.&lt;/p&gt;&lt;p&gt; In this other form you create objects that are always of the same type, but determine which member function gets called by choosing which member function's address gets assigned to a member function pointer. One interesting advantage is that you can change the behaviour of an object during its lifetime without having to allocate a new one of a different type as you would with the regular sort of inheritance-based polymorphism.&lt;/p&gt;&lt;p&gt;[&lt;a href="http://linuxquality.sunsite.dk/"&gt;Linux Quality Database&lt;/a&gt;][&lt;a href="http://linuxquality.sunsite.dk/articles/"&gt;Articles&lt;/a&gt;][&lt;a href="http://linuxquality.sunsite.dk/articles/memberpointers/#title"&gt;Top&lt;/a&gt;]&lt;/p&gt;  &lt;p&gt;    &lt;a href="http://validator.w3.org/check/referer"&gt;&lt;img src="http://www.w3.org/Icons/valid-xhtml10" alt="Valid XHTML 1.0!" height="31" width="88" /&gt;&lt;/a&gt;  &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-4282422305104566254?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/4282422305104566254/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=4282422305104566254' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4282422305104566254'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4282422305104566254'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/10/pointers-to-c-member-functions.html' title='[转贴] Pointers to C++ Member Functions'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-7886309146606888192</id><published>2008-09-20T16:25:00.000-07:00</published><updated>2010-03-05T20:28:06.302-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='software'/><title type='text'>懂得承认失败</title><content type='html'>今天过了很休闲的一天。 虽然失去了与大家玩的机会， 但是却又意外的收获。&lt;br/&gt;&lt;br/&gt;先看了本《programming Lua》见识了这个小巧的lisp似的C语言的精巧的语言的威力，同时也对tail recurion有了新的见地。 还有多了些 lambda 的理解。&lt;br/&gt;&lt;br/&gt;其实最重要的收获还是， 对性格上的理解。&lt;br/&gt;事情是这样的， 上网查到了书店的关门时间是晚上9：00， 于是在拿起第二本书《梦断代码》的时候，预先估计了一下时间，当时是7：40。 因为第一本书看完了， 想再更宏伟一点， 看完第二本书。 长时间盯着那么近的东西，无论是计算机屏幕还是书本， 我的眼睛都会受不了， 会有眩晕的感觉。看这本书显然没有看第一本书那么快， 因为第一本书相对来说很熟悉， 看得很快。 而第二本书就不同了，很多新鲜的东西，所以看得很慢。&lt;br/&gt;&lt;br/&gt;书中讲述Chandler[1]这个项目的发展。看似和人性没什么关系。但是却发现很多共通的地方， 毕竟这些东西都是人做的嘛。&lt;br/&gt;&lt;br/&gt;看着看着时间已经到了9：00了， 书店似乎还没有关门的迹象， 可是我的眼睛却有些支撑不住了， 开始有些眩晕。 眼看完不成自己定的任务了。于是在短暂的休息之后， 我和自己说尽快看， 于是看的速度表面上提高了。&lt;br/&gt;&lt;br/&gt;Chandler 的进展和我现在的状态有相似之处， 自己给自己设定的期限快到了， 眼看就完不成了， 于是在开始疯狂的提高表面速度。&lt;br/&gt;&lt;br/&gt;可是在真正的关门时间到来的时候， 我的第一个想法是， 再快点再快点。 可是书还有100多页。 接下来我意识到了自己的问题：强迫症。&lt;br/&gt;于是， 我放下了书， 放松的走出了书店。相对于看完一本书， 我得到了更多的东西。 有些时候， 你必须不能着急。 就像9：00以后我看过的东西基本上没有在脑子里面留下印象，更别说思考了。 所以， 那种逼迫的情况下做了一些无意义的东西。 这些事可能成为以后的麻烦（当然这件事中不存在）。&lt;br/&gt;&lt;br/&gt;更深层一点考虑，结合现在所发生在社会上的一些事。 得出一个结论：学会承认失败。&lt;br/&gt;在已经彻底失败的时候， 还抱有幻想并且歇斯底里往往会使事情更糟。 更好的做法是，痛定思痛， 冷静下来思考错在哪里。有时甚至需要扔掉这个已经错误的尝试， 想改经它可能是一个噩梦（这更符合git的观点）。&lt;br/&gt;&lt;br/&gt;软件如此，人生如此。&lt;br/&gt;&lt;br/&gt;注记&lt;br/&gt;&lt;br/&gt;【1】：Chandler 是一个由Mitch Kapor（莲花软件公司的创始人）领导的"信息管理软件"，如果这个名字听起来有些不着边际，不妨参照Wired 的说法，叫它"Outlook 杀手"  .这个软件的开发在2002年就已经正式了， 但是现在2007年的时候还未完成。一个由像Mitch Kapor 这样的软件行业的传奇人物领导的团队为什么到现在还不能拿出一个相对完整的版本， 不得不让人好奇。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-7886309146606888192?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/7886309146606888192/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=7886309146606888192' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/7886309146606888192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/7886309146606888192'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/09/blog-post_20.html' title='懂得承认失败'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-6574937674755182682</id><published>2008-09-11T05:55:00.001-07:00</published><updated>2008-09-11T05:58:56.542-07:00</updated><title type='text'>如何成为一名Hacker</title><content type='html'>&lt;b&gt;摘自大教堂与集市&lt;br /&gt;&lt;br /&gt;附录A 如何成为一名Hacker&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;目录&lt;/b&gt;&lt;br /&gt;-----------------&lt;br /&gt;为什么会有这份文档？&lt;br /&gt;什么是黑客？&lt;br /&gt;黑客应有的态度&lt;br /&gt;黑客的基本技能&lt;br /&gt;黑客文化中的地位&lt;br /&gt;黑客和书呆子（Nerd）的联系&lt;br /&gt;风格的意义&lt;br /&gt;其它资源&lt;br /&gt;FAQ（常问问题解答）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;为什么会有这份文档？&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　作为《Jargon File》的编辑和一些其他有名的类似性质文章的作者，我经常收到充满热情的网络新手的email提问（确实如此）“我如何才能成为一名出色的黑客？”非 常奇怪的是似乎没有任何的FAQ或者Web形式的文档来说明这个十分重要的问题，因此我写了一份。&lt;br /&gt;&lt;br /&gt;　　如果你现在读的是这份文档的离线拷贝，那么请注意当前最新版本（英文版）在 &lt;a target="_blank" href="http://www.tuxedo.org/%7Eesr/faqs/hacker-howto.html"&gt;http://www.tuxedo.org/~esr/faqs/hacker-howto.html&lt;/a&gt; 可以得到。&lt;br /&gt;&lt;br /&gt;　　注意：在这份文档最后有FAQ（常问问题解答）。请在向我提出任何关于这份文档的疑问之前读两遍。&lt;br /&gt;&lt;br /&gt;　　目前这份文档有很多翻译版本：保加利亚语，简体中文，繁体中文，丹麦语，荷兰语，法语，德语，匈牙利语，印尼语，日语，朝鲜语，葡萄牙语，俄语及瑞典语。注意由于这份文档时有修正，所以以上翻译版本可能有不同程度的过时。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;什么是黑客？&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　《Jargon File》包含了一大堆关于“hacker”这个词的定义，大部分与技术高超和热衷解决问题及超越极限有关。但如果你只想知道如何成为一名黑客，那么只有两件事情确实相关。&lt;br /&gt;&lt;br /&gt;　　这可以追溯到几十年前第一台分时小型电脑诞生，ARPAnet实验也刚展开的年代，那时有一个由程序设计专家和网络名人所组成的，具有分享特 点的文化社群。这种文化的成员创造了“hacker”这个名词。黑客们建立了Internet。黑客们发明出了现在使用的UNIX操作系统。黑客们使 Usenet运作起来，黑客们让WWW运转起来。如果你是这个文化的一部分，如果你对这种文化有所贡献，而且这个社群的其它成员也认识你并称你为 hacker，那么你就是一位黑客。&lt;br /&gt;&lt;br /&gt;　　黑客精神并不仅仅局限在软件的黑客文化中。有人用黑客态度对待其它事情，如电子学和音乐——事实上，你可以在任何最高级别的科学和艺术活动中 发现它。精于软件的黑客赞赏这些在其他领域的同类并把他们也称作黑客——有人宣称黑客天性是绝对独立于他们工作的特定领域的。但在这份文档中，我们将注意 力集中在软件黑客的技术和态度，以及发明了“黑客”一词的以共享为特征的文化传统之上。&lt;br /&gt;&lt;br /&gt;　　有一群人大声嚷嚷着自己是黑客，但他们不是。他们（主要是正值青春的少年）是一些蓄意破坏计算机和电话系统的人。真正的黑客把这些人叫做“骇 客”（cracker），并不屑与之为伍。多数真正的黑客认为骇客们又懒又不负责任，还没什么大本事。专门以破坏别人安全为目的的行为并不能使你成为一名 黑客，正如用铁丝偷开走汽车并不能使你成为一个汽车工程师。不幸的是，很多记者和作家往往错把“骇客”当成黑客；这种做法一直使真正的黑客感到恼火。&lt;br /&gt;&lt;br /&gt;　　根本的区别是：黑客搞建设，骇客搞破坏。&lt;br /&gt;&lt;br /&gt;　　如果你想成为一名黑客，请接着读下去。如果你想做一个骇客，去读alt.2600新闻组，并在意识到你并不像自己想象的那么聪明后去坐五到十次监狱。关于骇客，我只想说这么多。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;黑客应有的态度&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　黑客们解决问题，建设事物，同时他们崇尚自由和无私的双向帮助。要被他人承认是一名黑客，你的行为得体现出你好像具备了这种态度一般。而要想做得好象你具备这种态度一般，你就得切切实实坚持它。&lt;br /&gt;&lt;br /&gt;　　但是如果你认为培养黑客态度只是一条在黑客文化圈中得到承认的路子，那就大错特错了。成为具备这些特质的这种人对你自己非常重要——有助于你 学习，及给你提供源源不断的动力。同所有创造性的艺术一样，成为大师的最有效方法就是模仿大师的精神——不仅从智力上，也要从感情上进行模仿。&lt;br /&gt;&lt;br /&gt;　　或许，下面这首现代的禅诗很好的阐述了这个意思：&lt;br /&gt;&lt;br /&gt;　　　　To follow the path:（沿着这样一条道路：）&lt;br /&gt;　　　　look to the master,（寻找大师，）&lt;br /&gt;　　　　follow the master,（跟随大师，）&lt;br /&gt;　　　　walk with the master,（与大师通行，）&lt;br /&gt;　　　　see through the master,（洞察大师，）&lt;br /&gt;　　　　become the master.（成为大师。）&lt;br /&gt;&lt;br /&gt;　　嗯，如果你想成为一名黑客，反复读下面的事情直至你相信它们：&lt;br /&gt;&lt;br /&gt;&lt;b&gt;　　1. 世界充满了待解决的迷人问题&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　做一名黑客会有很多乐趣，但却是要费很多气力方能得到的乐趣。这些努力需要动力。成功的运动员从锻炼身体、超越自我极限的愉悦中得到动力。同样，做黑客，你得能从解决问题，磨练技术及锻炼智力中得到基本的乐趣。&lt;br /&gt;&lt;br /&gt;　　如果你还不是天生的这类人又想做黑客，你就要设法成为这样的人。否则你会发现，你的黑客热情会被其他分心的事物吞噬掉——如金钱、性和社会上的虚名。&lt;br /&gt;&lt;br /&gt;　　（同样你必须对你自己的学习能力建立信心——相信尽管当你对某问题近乎一无所知，但只要你一点一点地试验、学习，最终会掌握并解决它。）&lt;br /&gt;&lt;br /&gt;&lt;b&gt;　　2. 一个问题不应该被解决两次&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　聪明的脑袋是宝贵的有限的资源。当世界还充满非常多有待解决的有趣的新问题时，它们不应该被浪费在重新发明轮子这类事情上。&lt;br /&gt;&lt;br /&gt;　　作为一名黑客，你必须相信其他黑客的思考时间是宝贵的——因此共享信息，解决问题并发布结果给其他黑客几乎是一种道义，这样其他人就可以去解决新问题而不是不断地忙于对付旧问题。&lt;br /&gt;&lt;br /&gt;　　（你不必认为一定要把你所有的发明创造公布出去，但这样做的黑客是赢得大家极度尊敬的人。卖些钱来养家糊口，租房买计算机甚至发大财和黑客价值观也是相容的，只要你别忘记你还是个黑客。）&lt;br /&gt;&lt;br /&gt;&lt;b&gt;　　3. 无聊和乏味的工作是罪恶&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　黑客（泛指具有创造力的人们）应该从来不会被愚蠢的重复性劳动所困扰，因为当这种事情发生时就意味着他们没有在做只有他们才能做的事情——解决新问题。这样的浪费伤害每一个人。因此，无聊和乏味的工作不仅仅是令人不舒服而已，而且是罪恶。&lt;br /&gt;&lt;br /&gt;　　作为一个黑客，你必须坚信这点并尽可能多地将乏味的工作自动化，不仅为你自己，也为了其他人（尤其是其他黑客们）。&lt;br /&gt;&lt;br /&gt;　　（对此有一个明显的例外。黑客有时也做一些在他人看来是重复性或枯燥的工作以进行“脑力休息”，或是为了获得某种技能，或是获得一些除此以外无法获得的特别经验。但这是自愿的——有脑子的人不应该被迫做无聊的活儿。）&lt;br /&gt;&lt;br /&gt;&lt;b&gt;　　4. 自由万岁&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　黑客们是天生的反独裁主义者。任何能向你发命令的人能够迫使你停止解决令你着迷的问题，同时，按照独裁者的一般思路，他通常会给出一些极端愚昧的理由。因此，不论何处，任何独裁主义的作法，只要它压迫你和其他黑客，你就要和它斗到底。&lt;br /&gt;&lt;br /&gt;　　（这并非向所有权威挑战。儿童需要监护，罪犯要被看管起来。如果服从命令得到某种东西比起用其他方式得到它更节约时间，黑客可以同意接受某种形式的权威。但这是一个有限度的，有意的交易；那种权威想要的个人服从不是你应该同意给予的。）&lt;br /&gt;&lt;br /&gt;　　权威喜欢审查和保密。他们不信任自愿的合作和信息的共享——他们只喜欢由他们控制的所谓“合作”。因此，作为一个黑客，你得对审查、保密，以及使用武力或欺骗去压迫有行为能力的人们的做法有一种本能的敌意。同时你要有为此信念斗争的意愿。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;　　5. 态度不能替代能力&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　作为一名黑客，你必须培养起这些态度。但只具备这些态度并不能使你成为一名黑客，也不能使你成为一个运动健将和摇滚明星。成为一名黑客需要智力，实践，奉献精神和辛苦工作。&lt;br /&gt;&lt;br /&gt;　　因此，你必须学会怀疑，并尊重各种各样的能力。黑客们不会为那些装模做样的人浪费时间，但他们却非常尊重能力——尤其是从事黑客工作的能力，不过任何能力总归是好的。具备很少人能具备的那些方面的能力尤其好，其中具备涉及脑力、技巧和专注方面能力的当然最好。&lt;br /&gt;&lt;br /&gt;　　尊敬能力，你就会享受到提高自己能力的乐趣——辛苦的工作和奉献会变成一种高度娱乐而非苦差事。要想成为一名黑客，这一点非常重要。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;黑客的基本技能&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　黑客态度重要，但技术更加重要。态度无法替代技术，在你被别的黑客称为黑客之前，有一些基本的技术你必须掌握。&lt;br /&gt;&lt;br /&gt;　　这些基本技术随着新技术的出现和老技术的过时也随时间在缓慢改变。例如，过去内容包括使用机器语言编程，而直到最近才包括了HTML。总的来说现在主要包括以下技术：&lt;br /&gt;&lt;br /&gt;&lt;b&gt;　　1. 学习如何编程&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　这当然是最基本的黑客技能。如果你还不会任何编程语言，我建议你从Python开始。它设计清晰，文档齐全，合适初学者入门。它是一门很好的 入门语言，并且不仅仅只是个玩具；它非常强大、灵活，也适合做大型项目。我有一篇Python评价详细说明这点。好的教程可以在Python网站得 到。（译者：比较好的中文Python站点可能是http://pythonrecord.51.net。）&lt;br /&gt;&lt;br /&gt;　　Java也是好的入门语言。它比Python难得多，但是生成的代码速度也快得多。它同时也是一种优秀的计算机语言，不止是用来入门。&lt;br /&gt;&lt;br /&gt;　　但是注意，如果你只会一两门语言，你将不会达到黑客所要求的技术水平，甚至也不能达到一个程序员的水平——你需要学会如何以抽象的方式思考编 程问题，独立于任何语言。要做一名真正的黑客，你需要学会在几天内通过一些手册，结合你现在所知，迅速掌握一门新语言。这意味着你应该学会几种截然不同的 语言。&lt;br /&gt;&lt;br /&gt;　　如果要做一些重要的编程工作，你将不得不学习C语言，Unix的核心语言。C++与C非常其他类似；如果你了解其中一种，学习另一种应该不难。但这两种都不适合编程入门者学习。而且事实上，你越避免用C编程，你的工作效率会越高。&lt;br /&gt;&lt;br /&gt;　　C非常有效率，节约你的机器资源。不幸的是，C的高效是通过你手动做很多底层的管理（如内存）来达到的。底层代码都是复杂极易出现bug的， 会使你花极多的时间调试。如今的机器速度如此之快，这通常是得不偿失——比较明智的做法是使用一种运行较慢、较低效率，但大幅节省你的时间的语言。因此， 选择Python。&lt;br /&gt;&lt;br /&gt;　　其他对黑客而言比较重要的语言包括Perl和LISP。Perl实用，值得一学；它被广泛用于动态网页和系统管理，因此即便你从不用Perl 写程序，至少也应该学会看。许多人使用Perl的理由和我建议你使用Python的理由一样，都是为了避免用C完成那些不需要C高效率的工作。你会需要理 解那些工作的代码的。&lt;br /&gt;&lt;br /&gt;　　LISP值得学习的理由不同——最终掌握了它时你会得到丰富的启迪和经验。这些经验会使你在以后的日子里成为一个更好的程序员，即使你实际上很少使用LISP本身。&lt;br /&gt;&lt;br /&gt;　　当然，实际上你最好五种都会（Python，Java，C/C++，Perl和LISP）。除了是最重要的黑客语言外，它们还代表了截然不同的编程思路和方法，每种都会让你受益非浅。&lt;br /&gt;&lt;br /&gt;　　这里我无法给你完完全全的指导教会你如何编程——这是个复杂的技能。但我可以告诉你，书本和上课也不能作到（最好的黑客中，有许多，也许几乎 都是自学成材的）。你可以从书本上学到语言的特点——只是一些皮毛，但要使书面知识成为自身技能只能通过实践和虚心向他人学习。因此要作到（一）读代码及 （二）写代码。&lt;br /&gt;&lt;br /&gt;　　学习如何编程就象学习用优美的自然语言写作一样。最好的做法是读一些大师的名著，试着自己写点东西，再读些，再写点，再读些，再写点……如此往复，直到你的文章达到你体会到的范文的简洁和力量。&lt;br /&gt;&lt;br /&gt;　　过去找到适合阅读的好的代码是困难的，因为几乎没有大型程序的源代码能让新手练手。这种状况已经戏剧性地发生变化；开放源代码软件，编程工具和操作系统（全都由黑客写成）现在已经随处可见。让我们在下一个话题中继续讨论……&lt;br /&gt;&lt;br /&gt;&lt;b&gt;　　2. 得到一个开放源代码的Unix并学会使用、运行它&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　我假设你已经拥有或者能使用一台个人电脑（今天的孩子们真幸福 :-））。新手们能够朝学习黑客技能迈出的最基本的一步就是得到一份Linux或BSD-Unix的一种，安装在个人电脑上，并运行它。&lt;br /&gt;&lt;br /&gt;　　没错，这世界上除了Unix还有其他操作系统。但它们都是以二进制形式发布的——你无法读到它的源代码，也不可能修改它。尝试在运行DOS或Windows或MacOS的机器上学习黑客技术，就象是带着脚镣学跳舞。&lt;br /&gt;&lt;br /&gt;　　除此之外，Unix还是Internet的操作系统。你可以学会上网却不知道Unix，但你不了解Unix就无法成为一名Internet黑 客。因此，今天的黑客文化在很大程度上是以Unix为中心的。（这点并不总是真的，一些很早的黑客对此一直很不高兴，但Unix和Internet之间的 联系已是如此之强，甚至连Microsoft也无可奈何。）&lt;br /&gt;&lt;br /&gt;　　所以，安装一套UNIX——我个人喜爱LINUX但还有其他种类的（是的，你可以同时安装Linux及DOS/Windows在同一电脑 上）。学习它，使用它，配置它。用它在Internet上冲浪。阅读它的源代码。修改它的源代码。你会得到比在Microsoft操作系统上更好的编程工 具（包括C，LISP，Python及Perl）。你会觉得乐趣无穷，学到在你成为大师之前意识不到的更多的知识。&lt;br /&gt;&lt;br /&gt;　　想知道更多关于学习Unix的信息，访问The Loginataka。&lt;br /&gt;&lt;br /&gt;　　想知道如何得到一份Linux，访问我在哪里可以获得Linux。（译者：对于中文读者来讲，最简单的方式未过于前往附近的D版/正版光盘店。）&lt;br /&gt;&lt;br /&gt;　　你可以在www.bsd.org找到BSD Unix的求助及其他资源。&lt;br /&gt;&lt;br /&gt;　　我有写一篇关于Unix和Internet基础的入门文章。&lt;br /&gt;&lt;br /&gt;　　（注：如果你是一个新手，我不推荐自己独立安装Linux或者BSD。安装Linux的话，寻求本地Linux用户组的帮助；或联系Open Projects Network。LISC维护着一些IRC频道，在那里你可以获得帮助。）&lt;br /&gt;&lt;br /&gt;&lt;b&gt;　　3. 学会如何使用WWW和写HTML&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　黑客文化建造的大多东西都在你看不见的地方发挥着作用，帮助工厂、办公室和大学正常运转，表面上很难看到它对非黑客的普通人的生活的影响。 Web是一个大大的例外。即便政客也同意，这个巨大耀眼的黑客玩具正在改变整个世界。单是这个原因（还有许多其它的），你就需要学习掌握Web。&lt;br /&gt;&lt;br /&gt;　　这并不是仅仅意味着如何使用浏览器（谁都会），而是要学会如何写HTML，Web的标记语言。如果你不会编程，写HTML会教你一些有助于学习的思考习惯。因此，先完成一个主页。（网上有很多好的教程；这是一个。）&lt;br /&gt;&lt;br /&gt;　　但仅仅拥有一个主页不能使你成为一名黑客。Web里充满了各种网页。大多数是毫无意义的，零信息量垃圾——界面时髦的垃圾，注意，垃圾的水准都类似（更多信息访问The HTML Hell Page）。&lt;br /&gt;&lt;br /&gt;　　要想有价值，你的网页必须有内容——它必须有趣或对其它黑客有帮助。这是下一个话题所涉及的……&lt;br /&gt;&lt;br /&gt;&lt;b&gt;　　4. 如果你不懂实用性的英语，学习吧&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　作为一个美国人和一个以英语为母语的人，我以前很不情愿提到这点，免得成为一种文化上的帝国主义。但相当多以其他语言为母语的人一直劝我指出这一点，那就是英语是黑客文化和Internet的工作语言，你需要懂得以便在黑客社区顺利工作。&lt;br /&gt;&lt;br /&gt;　　这一点千真万确。大概1991年的时候我就了解到许多黑客在技术讨论中使用英语，甚至当他们的母语都相同，英语对他们而言只是第二语言的时 候；据我知道的报导，当前英语有着比其他语言丰富得多的技术词汇，因此是一个对于工作来说相当好的工具。基于类似的原因，英文技术书籍的翻译通常不令人满 意（如果有翻译的话）。&lt;br /&gt;&lt;br /&gt;　　Linus Torvalds，一个芬兰人，用英语注释他的代码（很明显这对他来说不是凑巧）。他流利的英语成为他能够管理全球范围的Linux开发人员社区的重要因素。这是一个值得学习的例子。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;黑客文化中的地位&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　象大部分不涉及金钱的文化一样，黑客王国靠声誉运转。你设法解决有趣的问题，但它们到底多有趣，你的解法有多好，是要由那些和你具有同样技术水平的人或比你更厉害的人去评判的。&lt;br /&gt;&lt;br /&gt;　　相应地，当你在玩黑客游戏时，你得认识到你的分数主要靠其他黑客对你的技术的评价给出（这就是为什么只有在其它黑客称你为黑客时，你才算得上 是一名黑客）。这个事实常会被黑客是一项孤独的工作这一印象所减弱；也会被另一个黑客文化的禁忌所减弱（现在逐渐减弱但仍强大）：拒绝承认自我或外部评估 与一个人的动力有关系。&lt;br /&gt;&lt;br /&gt;　　特别地，黑客王国被人类学家们称为一种奉献文化。在这里你不是凭借你对别人的统治来建立地位和名望，也不是靠美貌，或拥有其他人想要的东西，而是靠你的奉献。尤其是奉献你的时间，你的创造和你的技术成果。&lt;br /&gt;&lt;br /&gt;　　要获得其他黑客的尊敬，基本上有五种事情你可以干：&lt;br /&gt;&lt;br /&gt;&lt;b&gt;　　1. 写开放源代码软件&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　第一个（也是最集中的和传统的）是写些被其他黑客认为有趣或有用的程序，并把程序源代码提供给整个黑客文化使用。&lt;br /&gt;&lt;br /&gt;　　（过去我们称之为“free software（自由软件）”，但这却使很多不知free的精确含义的人感到困惑。现在我们很多人，根据搜索引擎网页内容分析至少有2：1的比率，使用“open-source”software（开放源代码软件）这个词）。&lt;br /&gt;&lt;br /&gt;　　黑客王国里最受尊敬的偶像是那些写了大型的、好用的、具有广泛用途的软件， 并把它们公布出去，使得每人都在使用他软件的人。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;　　2. 帮助测试并调试开放源代码软件&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　黑客也尊敬那些使用、测试开放源代码软件的人。在这个并非完美的世界上，我们不可避免地要花大多数的开发时间在调试阶段。这就是为什么任何有 头脑的开放源代码的作者都会告诉你好的beta测试员（知道如何清楚描述出错症状，很好地定位错误，能忍受快速发布中的bug，并且愿意使用一些简单的诊 断工具）象红宝石一样珍贵。甚至他们中的一个能判断出哪个测试阶段是延长的，哪个是令人精疲力尽的噩梦，哪个只是一个有益的小麻烦。&lt;br /&gt;&lt;br /&gt;　　如果你是个新手，试着找一个你感兴趣的正在开发的程序，做一个好的beta测试员。你会自然地从帮着测试，进步到帮着抓臭虫，到最后帮着改程序。你会从中学到很多，并且与未来会帮你的人结下友谊。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;　　3. 公布有用的信息&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　另一个好事是收集整理有用有趣的信息做成网页或文档如FAQ列表，且让他们容易获得。&lt;br /&gt;&lt;br /&gt;　　主要技术FAQ的维护者受到几乎同其他开放源代码的作者一样多的尊敬。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;　　4. 帮助维护基础设施的运转&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　黑客文化（还有Internet的工程方面的发展，就此而言）是靠自愿者运转的。要使Internet能正常工作，就要有大量枯燥的工作不得不去完成——管理邮件列表，新闻组，维护大型软件库，开发RFC和其它技术标准等等。&lt;br /&gt;&lt;br /&gt;　　做这类事情的人会得到很多尊敬，因为每人都知道这些事情是十分花时间又不象编程那样好玩。做这些事情需要奉献精神。&lt;br /&gt;&lt;br /&gt;&lt;b&gt;　　5. 为黑客文化本身服务&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　最后，你可以为这个文化本身做宣传（例如，象我这样，写一个“如何成为黑客”的正面的教程 :-））（译者：不知道Barret把它翻成中文算不算？）。这并非一定要在你已经在这个圈子呆了很久，因以上四点中的某点而出名，有一定声誉后才能去做。&lt;br /&gt;&lt;br /&gt;　　黑客文化没有领袖。精确地说，它确实有些文化英雄、部落长者、历史学家和发言人。若你在这圈内呆的够长，你或许成为其中之一。记住：黑客们不 相信他们的部落长者的自夸的炫耀，因此大举追求这种名誉是危险的。与其奋力追求，不如先摆正自己的位置等它自己到你的手中——那时则要做到谦虚和优雅。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;黑客和书呆子（Nerd）的联系&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　同流行的迷思相反，做一名黑客并不一定要你是个书呆子。但它确实有帮助，而且许多黑客事实上是书呆子。做一个深居简出的人有助于你集中精力进行十分重要的事情，如思考和编程。&lt;br /&gt;&lt;br /&gt;　　因此，很多黑客都愿意接受“书呆子”这个外号，更有甚者使用更尖刻的“geek（怪人）”一词并引以为豪——这是一种宣布他们独立于主流社会的声明方式。访问The Geek Page参加更多的讨论。&lt;br /&gt;&lt;br /&gt;　　如果你能集中足够的精力做好黑客工作同时还能有正常的生活，这很好。现在作到这一点比我在1970年代是新手的时候要容易的多；如今主流文化对技术怪人要友善的多。甚至有越来越多的人意识到黑客通常是很好的恋人和配偶的材料。&lt;br /&gt;&lt;br /&gt;　　如果你因为生活上不如意而迷上做黑客，那也没什么——至少你不会分神了。或许以后你会找到自己的另一半。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;风格的意义&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　重申一下，作为一名黑客，你必须进入黑客精神之中。当你不在计算机边上时，你仍然有很多对黑客工作有帮助的事情可做。它们并不能替代真正的编程（没有什么能），但很多黑客都那么做，并感到它们与黑客的本质存在某些基本的连系。&lt;br /&gt;&lt;br /&gt;　　学会流畅地用母语写作。尽管程序员不能写好文章的错误看法相当普遍，但是有令人惊讶数目的黑客（包括所有我知道的最棒的）都是不错的作家。&lt;br /&gt;&lt;br /&gt;　　阅读科幻小说。参加科幻小说讨论会。（一个碰到黑客和未来会成为黑客的人的好方法）&lt;br /&gt;&lt;br /&gt;　　学禅，并且/或者练功习武。（精神修炼看来是惊人相似。）&lt;br /&gt;&lt;br /&gt;　　练就能分析音乐的听觉，学会鉴赏特别的音乐。学会玩某种乐器，或唱歌。&lt;br /&gt;&lt;br /&gt;　　提高对双关语、文字游戏的鉴赏能力。&lt;br /&gt;&lt;br /&gt;　　这些事情，你已经做的越多，你就越是天生做黑客的材料。至于为什么偏偏是这些事情，原因并不完全清楚，但它们都涉及用到左－右脑能力的综合，这似乎是关键所在（黑客们既需要清晰的逻辑思维，有时又需要偏离逻辑跳出问题的表象）。&lt;br /&gt;&lt;br /&gt;　　最后，还有一些不要去做的事情。&lt;br /&gt;&lt;br /&gt;　　不要使用愚蠢的，哗众取宠的ID或昵称。&lt;br /&gt;&lt;br /&gt;　　不要卷入Usenet（或其他地方的论坛）的骂战。&lt;br /&gt;&lt;br /&gt;　　不要自称为“cyberpunk（网络叛客）”，也不要浪费时间和那些人打交道。&lt;br /&gt;&lt;br /&gt;　　不要让你寄出的Email或张贴的帖子充满错误的拼写和乱七八糟的语法。&lt;br /&gt;&lt;br /&gt;　　做以上的事情，只会招来嘲笑。黑客们个个记忆超群——你将需要数年的时间让他们忘记你犯下的错误。&lt;br /&gt;&lt;br /&gt;　　网名的问题值得深思。将身份隐藏在虚假的名字后是骇客、解密者、d00dz及其他低等生物幼稚愚蠢的行为特点。黑客不会做这些事；他们对他们所作的感到骄傲，而且乐于人们将作品与他们的真名相联系。因此，若你现在用假名，放弃它。在黑客文化里它会令你你失败的。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;其它资源&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;　　Peter Seebach维护着一个非常好的Hacker FAQ，专给那些不懂如何与黑客打交道的经理看的。如果Peter的站点不能访问，下面这个Excite搜索应该有一份拷贝。&lt;br /&gt;&lt;br /&gt;　　我也著有“黑客文化简史”。&lt;br /&gt;&lt;br /&gt;　　我写了一份“大教堂与市集”，对于Linux及开放源代码文化现象有详细的解释。我也在这个话题上进一步阐述导致的结局——“开拓智域”。&lt;br /&gt;&lt;br /&gt;　　Rick Moen写了一份很好的关于如何运转一个Linux用户组的文档。&lt;br /&gt;&lt;br /&gt;　　我和Rick Moen合作完成了另一份关于“提问的智慧”的文章，可以让你事半功倍的获得帮助。&lt;br /&gt;&lt;br /&gt;　　如果你想知道PC、UNIX及Internet基本概念和工作原理，参考The Unix and Internet Fundamentals HOWTO。&lt;br /&gt;&lt;br /&gt;　　当你释放出一个软件或为其打补丁，试着按“软件发行惯例HOWTO”去做。（以上的提到的文章的中文版大多都可以在www.aka.org.cn和www.linuxforum.net找到。）&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;b&gt;FAQ（常问问题解答）&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;问：你能教我做黑客吗？&lt;br /&gt;&lt;br /&gt;答：自从第一次发布这份文档，我每周都会收到一些请求，（频繁的话一天几封）要我“教会他们做黑客”。遗憾的是，我没有时间和精力来做这个；我自己的黑客项目，及我作为一个开放源代码倡导者的四处奔波已经占用了我110%的时间。&lt;br /&gt;&lt;br /&gt;即便我想教你，黑客也依然基本上是一项自行修炼的的态度和技术。当真正的黑客想帮助你的时候，如果你乞求他们一汤匙一汤匙“喂”你的话，你会发现他们不会尊重你。&lt;br /&gt;&lt;br /&gt;先去学一些东西。显示你在尝试，你能靠自己去学习。然后再去向你遇到的黑客请教特殊的问题。&lt;br /&gt;&lt;br /&gt;如果你发E-mail给一位黑客寻求他的帮助，这是两件首要记住的事情。第一，写出来的文字显得懒且粗心的人通常非常懒于思考且非常马大哈，不能 成为好黑客——因此注意拼写正确，使用正确的语法及发音，否则你可能会无人理睬。第二，不要试图要求回复到一个ISP帐号，而那个帐号与你的发信地址不 同。这样做的人一般是使用盗用帐号，不会有人有兴趣为虎作伥帮助窃贼的。&lt;br /&gt;&lt;br /&gt;问：那么，我要如何开始？&lt;br /&gt;&lt;br /&gt;答：对你而言最佳的入门方式也许是去参加LUG（Linux用户组）的聚会。你可以找到在LDP的综合Linux信息页面上找到类似的组织；也许 有一个在你家附近的，而且非常有可能与一所大学或学校挂钩。如果你提出要求，LUG成员兴许会给你一套Linux，当然此后会帮你安装并带你入门。&lt;br /&gt;&lt;br /&gt;问：我得什么时候开始学？现在会不会太迟了？&lt;br /&gt;&lt;br /&gt;答：你有动力学习的时候就是好时候。大多数人看来都是在15－20岁之间开始感兴趣的，但据我所知，在此年龄段之外的例外也是有的。&lt;br /&gt;&lt;br /&gt;问：要学多久才能学会黑客道？&lt;br /&gt;&lt;br /&gt;答：这取决于你的聪明程度和努力程度。大多数人只要他们专注，就能在18个月到2年之间学会一套令人尊敬的技能。但是，不要以为就此结束了；如果你是一个真正的黑客，你要用你的余生来学习和完善你的技术。&lt;br /&gt;&lt;br /&gt;问：Visual Basic及Delphi是好的入门语言吗？&lt;br /&gt;&lt;br /&gt;答：不，因为他们不是可移植的。他们不是那些语言的开放源代码实现，所以你被限制在厂商选择支持的那些平台里。接受这样一种垄断局面不是黑客的态度。&lt;br /&gt;&lt;br /&gt;Visual Basic特别糟糕。它是Microsoft的私有语言这个事实就足够让它脸面全无，不像其他的Basic，它是一种设计糟糕的语言会教给你坏的编程习惯。&lt;br /&gt;&lt;br /&gt;其中一个坏习惯是会依赖于单一厂商的函数库、控件及开发工具。一般而言，任何不能够支持至少Linux或者一种BSD，或其他第三方操作系统的语言，都是一种不适合应付黑客工作的语言。&lt;br /&gt;&lt;br /&gt;问：你能帮我“黑”掉一个站点吗？或者教我怎么黑它？&lt;br /&gt;&lt;br /&gt;答：No。任何读完这份FAQ后还问这个问题的人，都是无可救药的蠢材，即使有时间指教我也不会理睬。任何发给我的此类E-mail都会被忽略或被痛骂一顿。&lt;br /&gt;&lt;br /&gt;问：我怎么样才能得到别人帐号的密码？&lt;br /&gt;&lt;br /&gt;答：这是骇客行为。滚得远远的，白痴。&lt;br /&gt;&lt;br /&gt;问：我如何入侵/查看/监视别人的Email？&lt;br /&gt;&lt;br /&gt;答：这是骇客行为。在我面前消失，混蛋。&lt;br /&gt;&lt;br /&gt;问：我如何才能在IRC聊天室里偷到频道op的特权？&lt;br /&gt;&lt;br /&gt;答：这是骇客行为。去S吧，冥顽不灵的家伙。&lt;br /&gt;&lt;br /&gt;问：我被黑了。你能帮我避免以后再被攻击吗？&lt;br /&gt;&lt;br /&gt;答：不行。目前为止，每次问我这个问题的，都是一些运行Microsoft Windows的菜鸟。不可能有效的保护Windows系统免受骇客攻击；太多缺陷的代码和架构使保护Windows的努力有如隔靴搔痒。唯一可靠的预防 来自转移到Linux或其他设计得至少足够安全的系统。&lt;br /&gt;&lt;br /&gt;问：我的Windows软件出现问题了。你能帮我吗？&lt;br /&gt;&lt;br /&gt;答：当然。进入DOS方式，然后键入“format c:”。你遇到的任何问题将会在几分钟之内消失。&lt;br /&gt;&lt;br /&gt;问：我在哪里能找到可以与之交流的真正的黑客？&lt;br /&gt;&lt;br /&gt;答：最佳办法是在你附近找一个Unix或Linux的用户组，参加他们的聚会。（你可以在Metalab的LDP站点找到一些指向用户组的链接。）&lt;br /&gt;&lt;br /&gt;我过去曾说过不能在IRC上找到真正的黑客，但我发觉现在情况有所改变。显然一些真正的黑客的社区像GIMP及Perl，也有IRC频道了。）&lt;br /&gt;&lt;br /&gt;问：你能推荐一些有关黑客的好书吗？&lt;br /&gt;&lt;br /&gt;答：我维护着一份Linux Reading List HOWTO，也许你会觉得有用。Loginataka也很有意思。&lt;br /&gt;&lt;br /&gt;关于Python的介绍，请访问在Python站点上的入门资料。&lt;br /&gt;&lt;br /&gt;问：成为一名黑客我需要擅长数学吗？&lt;br /&gt;&lt;br /&gt;答：不用。黑客道很少使用常规的数学或算术，不过你绝对需要能逻辑性地思考和进行精密的推理。&lt;br /&gt;&lt;br /&gt;尤其是你不会用到微积分或电路分析（我们把这些留给电子工程师们 :-））。一些有限数学（包括布尔代数，集合论，组合数学，图论）的背景知识会有帮助。&lt;br /&gt;&lt;br /&gt;问：我该从那种语言学起？&lt;br /&gt;&lt;br /&gt;答：HTML——如果你还不懂的话。市面上有一大堆的封面精美，宣传得天花乱坠的糟糕的HTML书籍，不幸的是很少有好的。我最喜欢的是HTML: The Definitive Guide。&lt;br /&gt;&lt;br /&gt;但HTML不完全是一种编程语言。当你准备开始编程时，我推荐从Python起步。你会听到一大群人推荐Perl，并且Perl依然比Python流行得多，但是难学得多且（以我之见）设计得不是很好。&lt;br /&gt;&lt;br /&gt;C确实重要，但它要比Python或Perl难多了。不要尝试先学C。&lt;br /&gt;&lt;br /&gt;Windows用户不要满足于Visual Basic。它会教给你坏习惯，而且它不可以移植，只能在Windows下运行。避免它。&lt;br /&gt;&lt;br /&gt;问：我需要什么样的机器配置？&lt;br /&gt;&lt;br /&gt;答：过去个人电脑能力相当不够并且内存小，结果给黑客的学习过程设置了人为的障碍。不过一段时间以前开始就不是这样了；任何配置比一台Intel 486DX50好的机器都有足够的能力进行开发工作，X，及Internet通讯，同时你现在买的最小的磁盘都大得富足了。（依Barret之见，现在要 至少Pentium 166MMX才够。）&lt;br /&gt;&lt;br /&gt;选择用来学习的机器时重要的一点是注意配件是否是Linux兼容的（或BSD兼容，如果你选择学BSD）。同刚才提到的一样，大多数现在的机器都是符合的；唯一的值得注意的区域在于modem和打印机；有些具备为Windows设计的配件的机器不会在Linux下工作。&lt;br /&gt;&lt;br /&gt;关于硬件兼容性有一个FAQ；最新版本在这里。&lt;br /&gt;&lt;br /&gt;问：我得因此憎恨和反对Microsoft吗？&lt;br /&gt;&lt;br /&gt;答：不，你不必如此。不是因为Microsoft不令人讨厌，而是因为黑客文化早在Microsoft出现之前就存在了，且将在 Microsoft成为历史后依然存在。你耗费在憎恨Microsoft的任何力气不如花在爱你的技术上。写好的代码——那会相当有效地打击 Microsoft又不会让你得到恶报应。&lt;br /&gt;&lt;br /&gt;问：但开放源代码软件不会使程序员丢饭碗吗？&lt;br /&gt;&lt;br /&gt;答：看起来不太可能——目前为止，开放源代码软件产业似乎创造了更多的就业机会而不是减少就业机会。如果写一个程序比起不写来是纯经济收益的话， 那么在写完后，程序员应该得到报酬不管程序是否是开放源代码。并且，无论写出多么“免费自由”的软件，都存在更多对新的，定制的软件的需求。我有这方面更 多的论述，放在开放源代码网站资料中。&lt;br /&gt;&lt;br /&gt;问：我要如何开始？哪里有免费的Unix？&lt;br /&gt;&lt;br /&gt;答：在本份文档的某个地方我已经提到过何处可以得到最常用的免费Unix。要做一名黑客，你需要自立自强，以及自学能力。现在开始吧……&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-6574937674755182682?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/6574937674755182682/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=6574937674755182682' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/6574937674755182682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/6574937674755182682'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/09/hacker.html' title='如何成为一名Hacker'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-623035175203142361</id><published>2008-09-07T17:35:00.000-07:00</published><updated>2010-03-05T20:28:02.615-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><title type='text'>高质量 必须高质量</title><content type='html'>开始工作一个多月了， 现在已经逐渐进入轨道， 当然是自己铺的一条轨道。 通向哪里呢， 我也不知道。 边走边折腾吧。&lt;br/&gt;&lt;br/&gt;奥运期间得到了两个双休的周末， 所以现在这三周，就成了连轴转。很累。 甚至有一天， 趴在床上， 我一下也不想动。 可是那边还是有牵挂的人啊。 睡了一会爬起来打打精神陪我的人儿去。  生活就这样继续着，其实我比较害怕它进入一个平衡期，因为怕自己逐渐被同化， 满足于现状。 应付他人， 也应付自己。&lt;br/&gt;&lt;br/&gt;所以，今天早上很早就起来，因为睡不着了，老是想着这些事。 拾起了很久没碰过的简历，觉得以前自己写的太多了， 应该大删特删才对。 现在都还没达到那种地步的嘛。 投了份简历，没报希望。 不过为自己订了写目标。 还看了《大教堂与集市》、读了ar和atrun的代码。 忽然觉得很充实。 也许，我需要的不是整天晃晃不安， 而是去阅读，填充自己。&lt;br/&gt;&lt;br/&gt;目前来说，只有尽全力把自己的工作的部分做好。 不辜负自己。&lt;br/&gt;&lt;br/&gt;地震， 从四川出来以后反而比人在当时更害怕地震了。 你去了绵阳，看过你们宿舍和教学楼的破损情况， 触目惊心。 今天你被吓倒了，我多么多么希望就像以前我们在一起那样。 现在这样分开在两地， 我反而很怀念我们一起落难的那段时光。&lt;br/&gt;&lt;br/&gt;10.1 快了。 快了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-623035175203142361?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/623035175203142361/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=623035175203142361' title='12 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/623035175203142361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/623035175203142361'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/09/blog-post_07.html' title='高质量 必须高质量'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-4498635634642639945</id><published>2008-09-06T21:50:00.000-07:00</published><updated>2008-09-07T01:46:08.459-07:00</updated><title type='text'>大教堂与集市中的经典语录</title><content type='html'>&lt;ul&gt;&lt;li&gt;当你在开发中碰到死胡同时——当你绞尽脑汁要超越下一个补丁的时候——一般来讲你&lt;br /&gt;这时该问的不是你的答案对不对，而是你的问题对不对。或许你的问题需要重新定义。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;说明了什么道理？在不损失效率的情况下，不要犹豫把多余的功能扔掉。&lt;/li&gt;&lt;li&gt;“设计达到完美的时候，不是增加得不能再增加了、而是减少得不能再减少了”。 &lt;/li&gt;&lt;li&gt;任何一个工具都应该达到预期的用处，但是一个真正优秀的工具会带来预期不到的&lt;br /&gt;用处。 &lt;/li&gt;&lt;li&gt;在写任何接口软件的时候，花点功夫尽可能不要干扰数据流——除非用户强迫你，&lt;br /&gt;永远不要扔掉任何信息！ &lt;/li&gt;&lt;li&gt;一个安全系统的安全性取决于其秘密的安全性。小心伪秘密。&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;　我认为项目主持人能否想出杰出灿烂的设计不是很关键，但绝对关键的是，他必须能够&lt;br /&gt;慧眼识别出他人的优秀设计或想法。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;但是在软件设计里表现聪明和创造力的问题在于它会形成一种坏习惯——当你应该保持&lt;br /&gt;代码稳固和简单的时候，你开始放任地把它们搞得好玩和复杂。&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;要建设一个开发社区，你需要吸引人群，让他们对你所做的感兴&lt;br /&gt;趣，并且让他们对自己的工作量舒心。要做到这一点，高超的专业技能会起很大的作用，但&lt;br /&gt;远远不是故事的全部，你所展现的人格也很重要。 &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-4498635634642639945?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/4498635634642639945/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=4498635634642639945' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4498635634642639945'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4498635634642639945'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/09/blog-post_2528.html' title='大教堂与集市中的经典语录'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-5534717573177916379</id><published>2008-09-06T21:18:00.000-07:00</published><updated>2008-09-06T21:20:59.850-07:00</updated><title type='text'>大教堂与集市</title><content type='html'>经典！ 必读！&lt;br /&gt;&lt;a href="http://www.linuxforum.net/forum/showflat.php?Cat=&amp;amp;Board=linuxtalk&amp;amp;Number=654373&amp;amp;page=0&amp;amp;view=collapsed&amp;amp;sb=5&amp;amp;o=0&amp;amp;fpart="&gt;&lt;br /&gt;http://www.linuxforum.net/forum/showflat.php?Cat=&amp;amp;Board=linuxtalk&amp;amp;Number=654373&amp;amp;page=0&amp;amp;view=collapsed&amp;amp;sb=5&amp;amp;o=0&amp;amp;fpart=&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;摘抄的一部分&lt;br /&gt;&lt;br /&gt;“　在发现继续开发Multics是做白工时，Bell Labs很快的退出了（後来有一家公司Honeywell出售Multics，赔的很惨）。Ken Thompson很喜欢Multics上的作业环境，於是他在实验室里一台报废的DEC PDP-7上胡乱写了一个操作系统， 该系统在设计上有从Multics抄来的也有他自己的构想。他将这个操作系统命名Unix，用来反讽Multics。&lt;br /&gt;&lt;br /&gt;　　※译：其实是Ken Thompson写了一个游戏“Star Travel” 没地方跑，就去找一台的报废机器PDP-7来玩。他同事Brian Kernighan嘲笑Ken Thompson说：「你写的系统好逊哦，乾脆叫Unics算了。」（Unics发音与太监的英文eunuches 一样），後来才改为Unix。”&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-5534717573177916379?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/5534717573177916379/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=5534717573177916379' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5534717573177916379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5534717573177916379'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/09/blog-post_06.html' title='大教堂与集市'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-3945828297732096271</id><published>2008-09-05T05:21:00.000-07:00</published><updated>2008-09-05T09:36:04.684-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='时钟 源代码 qt3'/><title type='text'>一个用手指波动指针调整的时钟的QT3实现</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_AVbdO906nR8/SMFf6CAC-jI/AAAAAAAACnQ/xQSCXrmfiTE/s1600-h/Screenshot-qt-test.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://2.bp.blogspot.com/_AVbdO906nR8/SMFf6CAC-jI/AAAAAAAACnQ/xQSCXrmfiTE/s320/Screenshot-qt-test.png" alt="" id="BLOGGER_PHOTO_ID_5242576891810085426" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;有一天OPPO的人拿来多普达的手机让我看一个触摸屏拖动指针来调时钟的功能。&lt;br /&gt;看了以后觉得很NB， 不过一直不服， 就在想怎么自己写一个。&lt;br /&gt;&lt;br /&gt;昨天看了atan2函数以后就想到了办法，&lt;br /&gt;今天对时钟的稳定性做了调整。&lt;br /&gt;这个程序即使把调整时间的API换成WIN的也不能正常在WIN下工作。 所以这个小程序就不支持win了。 在linux下正常。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;这个程序直接：&lt;br /&gt;qmake -project&lt;br /&gt;qmake&lt;br /&gt;make&lt;br /&gt;就可以运行了。&lt;br /&gt;不过要在ROOT权限下运行哦~&lt;br /&gt;&lt;br /&gt;有啥BUG发给我哈。&lt;br /&gt;&lt;br /&gt;&lt;code&gt;&lt;br /&gt;#include &amp;lt;qapplication.h&amp;gt;&lt;br /&gt;#include &amp;lt;qpushbutton.h&amp;gt;&lt;br /&gt;#include &amp;lt;qslider.h&amp;gt;&lt;br /&gt;#include &amp;lt;qlcdnumber.h&amp;gt;&lt;br /&gt;#include &amp;lt;qfont.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;qpoint.h&amp;gt;&lt;br /&gt;#include &amp;lt;qpainter.h&amp;gt;&lt;br /&gt;#include &amp;lt;qdatetime.h&amp;gt;&lt;br /&gt;#include &amp;lt;qtimer.h&amp;gt;&lt;br /&gt;&lt;br /&gt;#include &amp;lt;qvbox.h&amp;gt;&lt;br /&gt;#include &amp;lt;qwidget.h&amp;gt;&lt;br /&gt;#include &amp;lt;cmath&amp;gt;&lt;br /&gt;#include &amp;lt;qcanvas.h&amp;gt;&lt;br /&gt;int degreen(double a) ;&lt;br /&gt;&lt;br /&gt;class MyWidget : public QWidget&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt;MyWidget( QWidget *parent=0, const char *name=0 );&lt;br /&gt;&lt;br /&gt;protected:&lt;br /&gt;void paintEvent (QPaintEvent *);&lt;br /&gt;void mouseMoveEvent (QMouseEvent *e);&lt;br /&gt;void mouseReleaseEvent (QMouseEvent *) ;&lt;br /&gt;&lt;br /&gt;private:&lt;br /&gt;&lt;br /&gt;double rotate_angle_minute;   // minute rotate angle&lt;br /&gt;bool in_move;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;MyWidget::MyWidget( QWidget *parent, const char *name )&lt;br /&gt;: QWidget( parent, name )&lt;br /&gt;{&lt;br /&gt;bool in_move = false;&lt;br /&gt;QTimer  *timer = new QTimer (this);&lt;br /&gt;&lt;br /&gt;connect ( timer, SIGNAL(timeout()), this, SLOT(update()));&lt;br /&gt;timer-&amp;gt;start(500);&lt;br /&gt;&lt;br /&gt;resize(200, 200);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int degreen(double a) {&lt;br /&gt;return a * 180 / M_PI;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;#include &amp;lt;sys/time.h&amp;gt;&lt;br /&gt;#include &amp;lt;time.h&amp;gt;&lt;br /&gt;#include &amp;lt;errno.h&amp;gt;&lt;br /&gt;&lt;br /&gt;void adjustTime (int , int min, int )&lt;br /&gt;{&lt;br /&gt;struct  timeval cur_val;&lt;br /&gt;struct  timezone cur_zone;&lt;br /&gt;int ret;&lt;br /&gt;static int last_min = 0;&lt;br /&gt;int delta = min - last_min;&lt;br /&gt;qDebug("delta: %d", delta);&lt;br /&gt;// ignore too large time adjust&lt;br /&gt;if ( delta &amp;lt; -5 || delta &amp;gt; 10) {&lt;br /&gt;last_min = min;&lt;br /&gt;return;&lt;br /&gt;} else {&lt;br /&gt;delta = min - last_min;&lt;br /&gt;last_min = min;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;gettimeofday(&amp;amp;cur_val, &amp;amp;cur_zone);&lt;br /&gt;&lt;br /&gt;time_t new_time;&lt;br /&gt;new_time = delta * 60;&lt;br /&gt;cur_val.tv_sec += new_time;&lt;br /&gt;&lt;br /&gt;ret = settimeofday(&amp;amp;cur_val, &amp;amp;cur_zone);&lt;br /&gt;qDebug( "time add %d seconds, ret is :%d ", (int)new_time, ret);&lt;br /&gt;if (errno != 0)&lt;br /&gt;perror("can't set time");&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void&lt;br /&gt;MyWidget::mouseMoveEvent( QMouseEvent *e) {&lt;br /&gt;static int count = 0;&lt;br /&gt;if (count++ &amp;lt; 5)  // also for let adjust smoothly&lt;br /&gt;  return;&lt;br /&gt;else&lt;br /&gt;  count = 0;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;int angle;&lt;br /&gt;angle = degreen(atan2(100 -  e-&amp;gt;pos().y()  ,  100 - e-&amp;gt;pos().x() ));&lt;br /&gt;&lt;br /&gt;qDebug(" X:%3d Y:%3d  angle :%3d  -- the minute angle :%d  ",&lt;br /&gt; e-&amp;gt;pos().x(),&lt;br /&gt; e-&amp;gt;pos().y(),&lt;br /&gt; angle,&lt;br /&gt; (int)rotate_angle_minute);&lt;br /&gt;if (!in_move)&lt;br /&gt;angle = rotate_angle_minute; // for avoid minute pin jump&lt;br /&gt;in_move = true;&lt;br /&gt;&lt;br /&gt;int current_minute = (angle/ 6);&lt;br /&gt;&lt;br /&gt;QString old_time = QTime::currentTime().toString();&lt;br /&gt;&lt;br /&gt;adjustTime (0, current_minute - QTime::currentTime().minute(), 0);&lt;br /&gt;&lt;br /&gt;QString new_time_str = QTime::currentTime().toString();&lt;br /&gt;qDebug("old time: %s \n", old_time.latin1());&lt;br /&gt;qDebug("new time: %s \n", new_time_str.latin1());&lt;br /&gt;update();&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;void MyWidget::mouseReleaseEvent (QMouseEvent *) {&lt;br /&gt;in_move = false;  // just for minute pin don't jump&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;void MyWidget::paintEvent (QPaintEvent *) {&lt;br /&gt;QPointArray hourhand(3);&lt;br /&gt;QPointArray minutehand(3);&lt;br /&gt;&lt;br /&gt;hourhand.putPoints (0, 3, 7, 8, -7, 8, 0, -40);&lt;br /&gt;minutehand.putPoints (0, 3, 7, 8, -7, 8, 0, -70);&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;QPointArray secondhand(3);&lt;br /&gt;secondhand.putPoints(0, 3, 3, 4, -3, -4, 0, -90);&lt;br /&gt;&lt;br /&gt;QColor hourColor(127, 0, 127);&lt;br /&gt;QColor minuteColor(0, 127, 127);&lt;br /&gt;QColor secondColor (127, 127, 0);&lt;br /&gt;&lt;br /&gt;int side = (width() &amp;lt; height()) ? width() : height() ;&lt;br /&gt;QTime time = QTime::currentTime();&lt;br /&gt;&lt;br /&gt;QPainter painter(this);&lt;br /&gt;painter.translate(width() / 2, height() / 2);&lt;br /&gt;painter.scale(side / 200.0, side / 200.0);&lt;br /&gt;&lt;br /&gt;painter.setPen(Qt::NoPen);&lt;br /&gt;painter.setBrush(hourColor);&lt;br /&gt;&lt;br /&gt;painter.save();&lt;br /&gt;painter.rotate(30.0 * ((time.hour() + time.minute() / 60.0)));&lt;br /&gt;painter.drawConvexPolygon(hourhand);&lt;br /&gt;painter.restore();&lt;br /&gt;&lt;br /&gt;painter.setPen(hourColor);&lt;br /&gt;&lt;br /&gt;for (int i = 0; i &amp;lt; 12; ++i) {&lt;br /&gt;painter.drawLine(88, 0, 96, 0);&lt;br /&gt;painter.rotate(30.0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;painter.setPen(Qt::NoPen);&lt;br /&gt;painter.setBrush(minuteColor);&lt;br /&gt;&lt;br /&gt;painter.save();&lt;br /&gt;rotate_angle_minute = ( 6.0 * (time.minute() + time.second() / 60.0));&lt;br /&gt;painter.rotate(rotate_angle_minute);&lt;br /&gt;&lt;br /&gt;painter.drawConvexPolygon(minutehand);&lt;br /&gt;painter.restore();&lt;br /&gt;&lt;br /&gt;painter.save();&lt;br /&gt;painter.setPen(secondColor);&lt;br /&gt;painter.rotate( 6.0 * (time.second() + time.msec() / 1000));&lt;br /&gt;painter.drawConvexPolygon(secondhand);&lt;br /&gt;painter.restore();&lt;br /&gt;&lt;br /&gt;painter.setPen(minuteColor);&lt;br /&gt;&lt;br /&gt;for (int j = 0; j &amp;lt; 60; ++j) {&lt;br /&gt;if ((j % 5) != 0)&lt;br /&gt;painter.drawLine(92, 0, 96, 0);&lt;br /&gt;painter.rotate(6.0);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int main( int argc, char **argv )&lt;br /&gt;{&lt;br /&gt;QApplication a( argc, argv );&lt;br /&gt;&lt;br /&gt;MyWidget w;&lt;br /&gt;a.setMainWidget( &amp;amp;w );&lt;br /&gt;w.show();&lt;br /&gt;return a.exec();&lt;br /&gt;}&lt;br /&gt;&lt;/code&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-3945828297732096271?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/3945828297732096271/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=3945828297732096271' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3945828297732096271'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3945828297732096271'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/09/blog-post.html' title='一个用手指波动指针调整的时钟的QT3实现'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_AVbdO906nR8/SMFf6CAC-jI/AAAAAAAACnQ/xQSCXrmfiTE/s72-c/Screenshot-qt-test.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-1535755237235545934</id><published>2008-08-19T09:34:00.000-07:00</published><updated>2008-08-19T09:37:10.553-07:00</updated><title type='text'>google 输入法怎么猜测英文</title><content type='html'>睡觉前想到的逻辑， 在你的输入的一长串字符的时候， 当词库此时找不到最长的匹配词以后， 就会去从英语字典里面查找，而且这个字典可以做的很小， 而且查英文比查中文快多了吧。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-1535755237235545934?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/1535755237235545934/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=1535755237235545934' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/1535755237235545934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/1535755237235545934'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/08/google.html' title='google 输入法怎么猜测英文'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-8927795837940774888</id><published>2008-08-16T23:27:00.000-07:00</published><updated>2008-08-17T01:55:03.861-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs lucida wenquanyi 编程字体'/><title type='text'>为emacs替换编程字体（linux下的编程字体）</title><content type='html'>&lt;span style="font-family:lucida grande;"&gt;一款好的编程字体对于职业程序员来说非常重要， 查了许多著名的帖子， 也实验了许多字体后， 还是用上了 《Code reading》 和《Code Quaility》中的字体 Lucida Sans Typewriter-9  大小比较适合， 而且又不是win下面的专利字体。 所以非常合适。 （这个字体好像是JAVA SDK中带的字体， 也算开源的吧？）&lt;br /&gt;到&lt;a href="http://www.esnips.com/nsdoc/db410219-4de8-458e-892f-79e71823d9fb"&gt;这里 &lt;/a&gt;把这个字体下载下来， 放到你的~/.fonts/目录下（放到这个目录以后只能当前用户来访问，不过在你没有root权限的时候就有用了）&lt;br /&gt;fc-cache -fv&lt;br /&gt;然后CTRL＋ALT＋BACKSPACE重起X以后， 这个字体就生效了。&lt;br /&gt;&lt;br /&gt;然后是为emacs替换字体， emacs下面如果在编译的时候没有加上 --with-xft 选项的话， 就只有几个字体选项可以选， 而且那几个字体说实话不怎么的。&lt;br /&gt;&lt;br /&gt;所以我们下面就把刚才下载的字体设置为你的默认字体，&lt;br /&gt;在你的 .emacs 文件中加入&lt;br /&gt;&lt;br /&gt;(set-default-font "Lucida Sans Typewriter-9")&lt;br /&gt;(set-fontset-font (frame-parameter nil 'font)&lt;br /&gt;         'han '("WenQuanYi Zen Hei" . "unicode-bmp"))&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;第一行就是把你的默认字体换成 Lucida~的 9 号字， 第二行是用来设定字体集的， 具体我也不太清楚， 但是有一点可以确定的是， 你把中间 “WenQuanYi Zen Hei" 这个位置换成 fc-list  中的中文字体可以避免显示中文时出现的好几种字体的现象。  具体参数意思还请知道的告诉我一声， 谢谢了。&lt;br /&gt;&lt;br /&gt;这样emacs的字体配置就完成了&lt;br /&gt;&lt;br /&gt;Engoy it!&lt;br /&gt;&lt;br /&gt;ref:  &lt;a href="http://blog.htmlor.com/2007/10/14/good_programming_fonts/"&gt;几种不错的编程用字体&lt;/a&gt;&lt;br /&gt;     &lt;a href="http://www.kuro5hin.org/story/2004/12/6/11739/5249"&gt;finding the best programmer's font&lt;/a&gt;&lt;/span&gt;&lt;a href="http://www.kuro5hin.org/story/2004/12/6/11739/5249"&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="down" style="display: block;" id="formatbar_CreateLink" title="链接" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;img src="img/gl.link.gif" alt="链接" border="0" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/a&gt;&lt;span style="font-family:lucida grande;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-8927795837940774888?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/8927795837940774888/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=8927795837940774888' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8927795837940774888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/8927795837940774888'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/08/emacslinux.html' title='为emacs替换编程字体（linux下的编程字体）'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-5264097913137660504</id><published>2008-08-12T07:11:00.001-07:00</published><updated>2008-08-12T07:11:58.974-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs git git-mode'/><title type='text'>在emacs中使用git（翻译)</title><content type='html'>&lt;p id="s9yt" class="contents"&gt; 原文地址：http://xtalk.msk.su/~ott/en/writings/emacs-vcs/EmacsGit.html&lt;/p&gt; &lt;p&gt;最近git越来越流行了， 这里就转一篇介绍使用git的文章吧。git在dict.cn的解释是&lt;/p&gt; &lt;p id="s9yt25" class="mut_jies"&gt;&lt;b id="s9yt26"&gt;n. 饭桶，无用的人, a foolish or worthless person&lt;/b&gt;&lt;/p&gt; &lt;p id="s9yt27" class="mut_jies"&gt; 这样的解释有很强的黑色幽默气质。 呵呵。 它是非常优秀的版本控制软件， 一开始是为linux kernel开发的，后来渐渐被很多项目所使用， 它特别适合分布式开发中的软件版本管理。&lt;/p&gt; &lt;p id="s9yt28"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p id="s9yt40"&gt;我们可以用Emacs中的版本控制包-VC或者DVC来使用git，或者是使用git.el和emacs-git. 前者使用VC和DVC的标准接口，后者实现了一些供开发者完全使用git功能的接口。&lt;/p&gt; &lt;h2 id="s9yt42"&gt;&lt;a class="mceItemAnchor" title="sec1" name="sec1" id="sec1"&gt;&lt;/a&gt;git.el 包&lt;/h2&gt; &lt;h3 id="s9yt43"&gt;&lt;a class="mceItemAnchor" title="sec2" name="sec2" id="sec2"&gt;&lt;/a&gt; 安装git.el包&lt;br /&gt;&lt;/h3&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p id="uenp"&gt;安装git.el非常的简单， 它放在git源文件的contrib/emacs子目录下。 主要进入这个目录运行make命令就可以编译它。 同样你也可以运行make install 来安装它，它默认安装在$HOME/share/emacs/site-lisp下， 当然你也可以通过传参数emacslispdir给make来改变目录， 或者把全部文件copy到emacs目录下。 &lt;br /&gt;&lt;/p&gt; &lt;p id="j-q40"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;可以通过在.emacs文件中加入来默认启动它。&lt;/p&gt; &lt;pre id="s9yt54" class="src"&gt;(&lt;span id="s9yt55" style="color: rgb(160, 32, 240);"&gt;require&lt;/span&gt; '&lt;span id="s9yt56" style="color: rgb(0, 0, 139);"&gt;git&lt;/span&gt;)&lt;/pre&gt; &lt;h3 id="s9yt58"&gt;&lt;a class="mceItemAnchor" title="sec3" name="sec3" id="sec3"&gt;&lt;/a&gt; Work with git.el    用git.el来工作&lt;/h3&gt; &lt;p id="of97" class="first"&gt;在emacs中首先都是通过执行 git-status 命令， 它会询问用户Git仓库（repository)的目录名，并且分析仓库的状态。 分析状态后， 它会创建一个 *git-status*的buffer， 这个buffer用来在文件上执行git命令。 下面的图片是这个buffer的一个示例（图片的底部是diff命令的输出）。 这个buffer内使用的是git-status-mode， 这个mode里定义了许多命令和对应的快捷键（他们有很多快捷键和PCL-CVS包的快捷键相同）。所有的命令只是在这个mode里面有效。&lt;/p&gt; &lt;p id="of97" class="first"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p id="screenshot"&gt; &lt;img src="http://xtalk.msk.su/%7Eott/common/writings/emacs-vcs/git-status.png" mce_src="http://xtalk.msk.su/%7Eott/common/writings/emacs-vcs/git-status.png" id="s9yt67" /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p id="vhdk0"&gt;用户可以在这个buffer内容过方向键来查看文件， 或者用命令 git-next-file(n或者SPC）和 git-prev-file(p键)来查看前一个文件或者后一个。 就像emacs的很多命令一样， 用户可以为他们定义数字前缀来改变命令的行为。 &lt;br /&gt;&lt;/p&gt; &lt;p id="pfj-0"&gt;默认的， 所有的命令都在光标所在的文件上执行。 当然， 用户也可以通过选择多个文件来让命令执行在多个文件上。 选择主要通过下面的命令和快捷键来执行：m键（git-mark-file）标 记当前文件并且把光标下移一行；M键（git-mark-all）来标记buffer中的所有文件。取消标记用键u（git-unmark-file）或 者DEL键（git-unmark-file-up），两个键的区别是， 第一个键在取消标记光标所在的文件之后往下移动一样， 而后一个命令则往上移动一行。 取消当前buffer中所有的选择标记通过命令git-unmark-all（M-DEL快捷键）来实现。 你还可以通过git-toggle-all-marks（T键）来反选你现在的选择情况。 &lt;br /&gt;&lt;/p&gt; &lt;p id="vhdk2"&gt;&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p id="vhdk4"&gt;就像在PCL-CVS中， 用户可以通过命令git-find-file（回车键或者f）来打开当前光标所在的文件。 用过v键(git-view-file）来查看文件。 如果你遇到冲突以后， 可以通过 git-resolve-file（R键）来解决冲突。 &lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p id="g_wg1"&gt;你可以通过 git-add-file 命令（a键），或者 git-remove-file （r键）来像代码库里面添加或者删除一个文件。 如果有的文件你已经不需要了，却不想这个删除命令影响到代码库， 你可以把它们放在忽略文件列表中， 通过 git-ingore-file（i键）来执行。 提交代码通过 c键（git-commit-file）， 回滚（reverting）改变通过U键（git-revert-file)。 你可以通过l键（git-log-file）来查看修改日志。&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt; &lt;p id="lj5-"&gt;d键是和改变(diff)有关的所有命令的前缀。 他们中最重要的要数 git-diff-file 命令了， 你可以功过=或者 d = 键来调用它。 命令 git-diff-file-base(键 d b）可以用列出当前文件和仓库中的文件的不同的地方。 命令 git-diff-file-idiff （键 d e)可以用emacs中的 idiff 来互动的查看改变。 而命令git-find-file-imerge （键 d E) 允许用户以互动的方式来合并代码。 &lt;br /&gt;&lt;/p&gt; &lt;p id="ckom2"&gt;其他的命令有查看那这个分支（branch）和主分支（main branch）差别 — git-diff-file-merge-head 命令（d h)， 在文件合并之间的相关的版本 — git-diff-file-mine 命令 （d m)， 刷新git状态buffer的命令 git-refresh-status命令（g键），退出git状态buffer命令 git-status-quit (q），从列表中删除处理过的文件 git-remove-handled 命令 （x）， 详细的命令请查看这个mode的帮助（C-h m）。&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-5264097913137660504?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/5264097913137660504/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=5264097913137660504' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5264097913137660504'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5264097913137660504'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/08/emacsgit.html' title='在emacs中使用git（翻译)'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-172347632329296983</id><published>2008-08-12T07:07:00.000-07:00</published><updated>2008-08-12T07:11:09.541-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs programming'/><title type='text'>Emacs的日常生活（转）</title><content type='html'>&lt;h1 class="chapter"&gt;&lt;p align="center"&gt;robinhOctober 15, 2003&lt;/p&gt; &lt;p class="chapterheading"&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_1" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_1"&gt;Chapter 1&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_1" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_1"&gt;前言&lt;/a&gt;&lt;/p&gt;&lt;/h1&gt; &lt;p&gt;有 很多很多现成的文章介绍 Emacs 的。大致有那么两种：一种介绍说， Emacs 是一个无比强大的文本编辑器，但是不管谁用了一下都会觉得，这个文本编辑器真是难用了，所有的命令都是组合出来的怪物。甚至 Emacs 自己的帮助文档里面也说，用 Emacs 多的了用户会希望终端的输入设备加上两个脚踏板）；另一种介绍说 Emacs 是一个无比强大的 IDE ，但是对于象我们这样见过 Visual Studio 之类市面的新新人类来说，这“无比强大”大致上和“刀枪不入”是一个档次的广告。&lt;/p&gt; &lt;p&gt;Emacs 在我的概念中到底是个什么样的呢？它是一个环境。 Emacs 可以什么都是，也可以什么都不是，因为环境本身不创造什么。 Emacs 的强大是因为前人已经在这个环境中作了很多尝试，所以你不用从头发明轮子。 Emacs的强大是因为它能够将各种软件统一到同样一个界面底下来，你就可以以相仿的方式，操作各种其实并不相仿的程序。 Emacs的最强大之处在于它本身并不强迫你接受什么，不就是个Lisp程序嘛，不满意的地方你可以改，哪怕你其实不怎么懂Lisp。&lt;/p&gt; &lt;p&gt;以下的文字，说起来有一些混乱，因为我常常引用一些在介绍的同时并没有给出说明的概念。这又有什么关系呢？Lisp不是C++，它并不要求你在真正开始用这个概念之前就已经掌握了它的实际含义。而你真正想到用这个概念的时候，你肯定已经掌握了它。&lt;/p&gt; &lt;h1 class="chapter"&gt; &lt;p class="chapterheading"&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_2" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_2"&gt;Chapter 2&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_2" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_2"&gt;Emacs基础&lt;/a&gt;&lt;/p&gt;&lt;/h1&gt; &lt;p&gt;Emacs最好的入门教材，不是 Emacs 自己带的 toturial 。实际上就是这个 tutorial 给好多人非常恶劣的印象， Emacs 是一个操作复杂的变态编辑器。人性化一点的 Emacs 教材，大致有这一些：&lt;/p&gt; &lt;ol&gt;&lt;li&gt;Sams Teach Yourself Emacs in 24 Hours ，可以从这里下载。&lt;/li&gt;&lt;li&gt;《如何使用Emacs编辑器》，这是已经出了中文版的了，不过不值得推荐，因为是在是太贵太陈旧了。&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;关 于 Elisp 的入门教材是《GNU Emacs Lisp编程入门》，这本书实际上就是elisp introduction这个info文件的翻译，翻译质量不错，而且纸版的书看起来确实比较舒服。Emacs自带的有一个Elisp手册，真的就只能当 手册用，全无可读性可言。&lt;/p&gt; &lt;p&gt;使用Emacs的技巧在&lt;a href="http://www.emacswiki.org/" mce_href="http://www.emacswiki.org/"&gt;http://www.emacswiki.org&lt;/a&gt; 上有很多，常去翻翻很长见识。&lt;/p&gt; &lt;p&gt;因 为 Emacs 是一个单线程的应用程序，所以有可能一个操作占用了太长的时间，让使用者觉得很不爽。实际上很多 Emacs 的使用者，同时都起若干个 Emacs 进程，其中一个专门做一些耗时的操作，比如收信。如果你只愿意起一个进程，并且实在不耐烦等下去，C-g可以直接将进行到一半的操作停止下来。 Emacs 里面所有作到一半的事情，只要 Emacs 没有崩溃，就可以用C-g停止掉。&lt;/p&gt; &lt;p&gt;Emacs 对自己的描述非常完备，C-h可以带你进入 Emacs 的文档世界。常见比如：&lt;/p&gt; &lt;ol&gt;&lt;li&gt;C-h k可以告诉你按下某一键的时候到底有什么函数被调用；&lt;/li&gt;&lt;li&gt;C-h m可以告诉你当前的模式到底有什么特别之处；&lt;/li&gt;&lt;li&gt;C-h f可以告诉某一个函数到底有一些什么作用。&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;习惯这一些你会发现， Emacs 里面查帮助其实比 MSDN 还要方便。&lt;/p&gt; &lt;h1 class="chapter"&gt; &lt;p class="chapterheading"&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_3" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_3"&gt;Chapter 3&lt;/a&gt;&lt;/p&gt; &lt;p&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_3" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_3"&gt;如何安装Emacs&lt;/a&gt;&lt;/p&gt;&lt;/h1&gt; &lt;p&gt;是 的是的，我知道你会有自己安装 Emacs 的方法。你要是 RedHat 的用户，你肯定是下载 rpm 包回来装；你要是用的 debian ，你多半是apt-get；你要是用 gentoo ，你就 emerge 一把；你要是用 Windows ，你会上网去找安装文件；你要是用BSD的，你多半就去make port了；再大不了你会用 cvs 把最新的 Emacs 代码拉回来，然后在自己的机器上重新编译。&lt;/p&gt; &lt;p&gt;但是，这些方法只能帮助你安装 Emacs 本身。 Emacs 绝不仅仅是一个大大的tar包，或者是一个大大的安装文件能够包括的。你下回来的 Emacs ，相当于是一个Java的虚拟机，你真正面对的，是互联网上elisp资源的汪洋大海。所以我们关心的，其实是怎么安装这些零零碎碎从网络上 download 回来的资源。&lt;/p&gt; &lt;p&gt;Emacs 的软件，一般都是一个压缩包。因为 Emacs 没有象 Python 那样完善的安装机制，所以这个安装过程一般都要看着说明文档自己一步一步来。作为一个 Emacs  平台下的软件，它总得有这样几个组成部分：&lt;/p&gt; &lt;ol&gt;&lt;li&gt;有部分是用 elisp 写的，不然的话没法给 Emacs 用；&lt;/li&gt;&lt;li&gt;可能有部分是平台相关的代码，一般都是些可执行的二进制文件或者脚本。&lt;/li&gt;&lt;li&gt;可能还有一些info格式的相关文档。&lt;/li&gt;&lt;/ol&gt; &lt;p&gt;可执行的二进制文件只要放在$PATH环境变量所包含的目录下，就可以被调用了，这和一般的程序并无区别。&lt;/p&gt; &lt;p&gt;而 elisp写就的 Emacs 软件则稍微有一些不同。你如果想在 Emacs 里面调用一个函数，你得先有这个函数的定义；为了有这个函数的定义，你必须显式地将拥有函数定义的elisp文件载入 Emacs 环境；为了将 elisp文件正确载入 Emacs ， Emacs 会在&lt;code class="scheme"&gt;&lt;span class="variable"&gt;&lt;span style="font-family:新宋体;"&gt;load-path&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;这个变量所包含的所有目录下寻找同名文件。所以，说到底，安装elisp软件的过程，就是将它拷贝到某一个 &lt;code class="scheme"&gt;&lt;span class="variable"&gt;&lt;span style="font-family:新宋体;"&gt;load-path&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;目录下，并且在.emacs文件显式载入这个文件的过程。&lt;/p&gt; &lt;p&gt;一 般FAQ上给出的建议，是将自己下回来的elisp包，放在某一个名叫 site-lisp的目录之中。这是个不错的建议，不过问题在于大多数Linux的发布版厂商，习惯把他们自己维护的一些elisp资源包也扔到 site-lisp这个目录里面去，这造成的结果就是，有一天你突然想备份自己的Emacs资源的时候，你突然发现分不清那些是自己想要的，哪些是不小心 让系统装上去的垃圾。&lt;/p&gt; &lt;p&gt;所以，建议你还是在自己的$HOME目录底下建一个专门给Emacs用的目录，名字嘛，可以就叫 emacs。$HOME/emacs这个目录里面至少可以分出两个子目录来，一个是config，我们从此就可以把所有Emacs配置的内容放到这个目录 底下，并且分门别类起来；另一个叫package，里面就可以堆放各种从网络上下载回来的elisp资源。&lt;/p&gt; &lt;p&gt;所有扔到site-lisp目录里面的elisp文件夹，在emacs起动的时候都会自动被加入load-path列表，这是site-lisp/subdirs.el的功劳。我们的package/subdirs.el也要有这个功能。&lt;/p&gt; &lt;p align="left"&gt; &lt;/p&gt; &lt;pre class="scheme"&gt;(&lt;span class="keyword"&gt;defun&lt;/span&gt; &lt;span class="variable"&gt;my-add-subdirs-to-load-path&lt;/span&gt; (&lt;span class="variable"&gt;dir&lt;/span&gt;)&lt;br /&gt;(&lt;span class="keyword"&gt;let&lt;/span&gt; ((&lt;span class="variable"&gt;default-directory&lt;/span&gt; (&lt;span class="variable"&gt;concat&lt;/span&gt; &lt;span class="variable"&gt;dir&lt;/span&gt; &lt;span class="selfeval"&gt;"/"&lt;/span&gt;)))&lt;br /&gt; (&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;load-path&lt;/span&gt; (&lt;span class="variable"&gt;cons&lt;/span&gt; &lt;span class="variable"&gt;dir&lt;/span&gt; &lt;span class="variable"&gt;load-path&lt;/span&gt;))&lt;br /&gt; (&lt;span class="variable"&gt;normal-top-level-add-subdirs-to-load-path&lt;/span&gt;)))&lt;br /&gt;&lt;br /&gt;(&lt;span class="variable"&gt;my-add-subdirs-to-load-path&lt;/span&gt; &lt;span class="selfeval"&gt;"~/emacs/packages"&lt;/span&gt;)&lt;/pre&gt; &lt;p&gt;然后在.emacs文件中显式载入这个文件。&lt;/p&gt; &lt;p align="left"&gt; &lt;/p&gt; &lt;pre class="scheme"&gt;(&lt;span class="variable"&gt;load&lt;/span&gt; &lt;span class="selfeval"&gt;"~/emacs/packages/subdirs"&lt;/span&gt;)&lt;/pre&gt; &lt;pre class="scheme"&gt;&lt;br /&gt;&lt;h1 class="chapter"&gt;&lt;br /&gt;&lt;p class="chapterheading"&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_4" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_4"&gt;Chapter 4&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_4" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_4"&gt;让Emacs变得轻快&lt;/a&gt;&lt;/p&gt;&lt;/h1&gt;&lt;br /&gt;&lt;br /&gt;Emacs最为人诟病的一点，就是它起动太慢。也难怪，光看可执行文件的尺寸，一个 emacs 差不多就是一个 vim 的5倍了，起动起来能快得了嘛。更何况大多数人都把以前用 vi 的习惯照搬到用 emacs 的情况下面来，每次要编辑一个文件的时候，就起动一个新的 Emacs 进程。您要是也习惯这种 Vi 风格，那您用 Emacs 可就得慢慢等着啦。因为 Emacs 的风格，是所有事情都在 Emacs  里面完成，包括浏览目录，打开文件。当然， Emacs 也不是完全排斥 Vi 风格，至少  Unix 环境下的 Emacs 就自带了一个叫 emacsclient 的程序，是个完全轻量级的东东，让你可以象起动 vi 那样轻松起动 emacs 。还有一个独立的程序，叫 gnuserv 的，更尽一步，支持 Windows 平台下的 Emacs ，而且功能也更多一些。反正是要用，干脆就用个好的吧。&lt;br /&gt;&lt;br /&gt;Unix下的gnuserv可以从  &lt;a href="http://www-uk.hpl.hp.com/people/ange/gnuserv/" mce_href="http://www-uk.hpl.hp.com/people/ange/gnuserv/"&gt;http://www-uk.hpl.hp.com/people/ange/gnuserv/&lt;/a&gt; 下载， Windows下的gnuserv建议在  &lt;a href="http://www.wyrdrune.com/gnuserv.html" mce_href="http://www.wyrdrune.com/gnuserv.html"&gt;http://www.wyrdrune.com/gnuserv.html&lt;/a&gt; 里面找。 gnuserv的安装并不复杂，无非是将几个可执行文件放到%PATH%变量提及的地方，然后将 gnuserv.el 放到 load-path 所包含的目录中去，最后在配置文件中加入两句配置：&lt;br /&gt;&lt;p align="left"&gt;&lt;br /&gt;&lt;/p&gt;&lt;pre class="scheme"&gt;(&lt;span class="builtin"&gt;require&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;&lt;span class="variable"&gt;gnuserv&lt;/span&gt;)&lt;br /&gt;(&lt;span class="variable"&gt;gnuserv-start&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;这是Emacs安装插件的标准做法。以下还有一些代码，是从David Vanderschel的帖子上抄来的，偶一般将其中的dv-close-client-frame绑定到C-&lt;img src="http://teren.itpub.net/daily-emacs-Z-G-1.gif" mce_src="http://teren.itpub.net/daily-emacs-Z-G-1.gif" alt="[daily-emacs-Z-G-1.gif]" border="0" /&gt;上，估计也会有人喜欢绑定到C-F4上。&lt;/p&gt;&lt;br /&gt;&lt;p align="left"&gt; &lt;/p&gt;&lt;br /&gt;&lt;pre class="scheme"&gt;(&lt;span class="keyword"&gt;defvar&lt;/span&gt; &lt;span class="variable"&gt;dv-initial-frame&lt;/span&gt;&lt;br /&gt; (&lt;span class="variable"&gt;car&lt;/span&gt; (&lt;span class="variable"&gt;frame-list&lt;/span&gt;))&lt;br /&gt; &lt;span class="selfeval"&gt;"Holds initial frame."&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;(&lt;span class="keyword"&gt;defun&lt;/span&gt; &lt;span class="variable"&gt;dv-focus-frame&lt;/span&gt; (&lt;span class="variable"&gt;frame&lt;/span&gt;)&lt;br /&gt; &lt;span class="selfeval"&gt;"pop to top and give focus"&lt;/span&gt;&lt;br /&gt; (&lt;span class="variable"&gt;make-frame-visible&lt;/span&gt; &lt;span class="variable"&gt;frame&lt;/span&gt;)&lt;br /&gt; (&lt;span class="variable"&gt;raise-frame&lt;/span&gt; &lt;span class="variable"&gt;frame&lt;/span&gt;)&lt;br /&gt; (&lt;span class="variable"&gt;select-frame&lt;/span&gt; &lt;span class="variable"&gt;frame&lt;/span&gt;)&lt;br /&gt; (&lt;span class="variable"&gt;w32-focus-frame&lt;/span&gt; &lt;span class="variable"&gt;frame&lt;/span&gt;))&lt;br /&gt;&lt;br /&gt;(&lt;span class="keyword"&gt;defvar&lt;/span&gt; &lt;span class="variable"&gt;dv-mail-frames&lt;/span&gt; ()&lt;br /&gt; &lt;span class="selfeval"&gt;"Frames created by dv-do-mailto"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;(&lt;span class="keyword"&gt;defun&lt;/span&gt; &lt;span class="variable"&gt;dv-focus-initial-frame&lt;/span&gt; ()&lt;br /&gt; &lt;span class="selfeval"&gt;"Make the initial frame visible"&lt;/span&gt;&lt;br /&gt; (&lt;span class="variable"&gt;dv-focus-frame&lt;/span&gt; &lt;span class="variable"&gt;dv-initial-frame&lt;/span&gt;))&lt;br /&gt;&lt;br /&gt;(&lt;span class="keyword"&gt;defun&lt;/span&gt; &lt;span class="variable"&gt;dv-do-mailto&lt;/span&gt; (&lt;span class="variable"&gt;arg&lt;/span&gt;)&lt;br /&gt; &lt;span class="selfeval"&gt;"For handling mailto URLs via gnudoit"&lt;/span&gt;&lt;br /&gt; (&lt;span class="variable"&gt;dv-focus-frame&lt;/span&gt; (&lt;span class="variable"&gt;make-frame&lt;/span&gt;))&lt;br /&gt; (&lt;span class="variable"&gt;message-mail&lt;/span&gt; (&lt;span class="variable"&gt;substring&lt;/span&gt; &lt;span class="variable"&gt;arg&lt;/span&gt; &lt;span class="selfeval"&gt;7&lt;/span&gt;))&lt;br /&gt; (&lt;span class="variable"&gt;delete-other-windows&lt;/span&gt;)&lt;br /&gt; (&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;dv-mail-frames&lt;/span&gt;&lt;br /&gt;   (&lt;span class="variable"&gt;cons&lt;/span&gt; (&lt;span class="variable"&gt;selected-frame&lt;/span&gt;) &lt;span class="variable"&gt;dv-mail-frames&lt;/span&gt;)))&lt;br /&gt;&lt;br /&gt;(&lt;span class="keyword"&gt;defun&lt;/span&gt; &lt;span class="variable"&gt;dv-close-client-frame&lt;/span&gt; ()&lt;br /&gt; &lt;span class="selfeval"&gt;"Close frame, kill client buffer."&lt;/span&gt;&lt;br /&gt; (&lt;span class="variable"&gt;interactive&lt;/span&gt;)&lt;br /&gt; (&lt;span class="keyword"&gt;if&lt;/span&gt; (&lt;span class="keyword"&gt;or&lt;/span&gt; (&lt;span class="variable"&gt;not&lt;/span&gt; (&lt;span class="variable"&gt;member&lt;/span&gt; (&lt;span class="variable"&gt;selected-frame&lt;/span&gt;) &lt;span class="variable"&gt;dv-mail-frames&lt;/span&gt;))&lt;br /&gt;         (&lt;span class="keyword"&gt;and&lt;/span&gt; (&lt;span class="variable"&gt;&gt;&lt;/span&gt; (&lt;span class="variable"&gt;length&lt;/span&gt; (&lt;span class="variable"&gt;buffer-name&lt;/span&gt;)) &lt;span class="selfeval"&gt;4&lt;/span&gt;)&lt;br /&gt;              (&lt;span class="variable"&gt;equal&lt;/span&gt; (&lt;span class="variable"&gt;substring&lt;/span&gt; (&lt;span class="variable"&gt;buffer-name&lt;/span&gt;) &lt;span class="selfeval"&gt;0&lt;/span&gt; &lt;span class="selfeval"&gt;5&lt;/span&gt;)&lt;br /&gt;                     &lt;span class="selfeval"&gt;"*mail"&lt;/span&gt;)&lt;br /&gt;              (&lt;span class="variable"&gt;not&lt;/span&gt; (&lt;span class="variable"&gt;buffer-modified-p&lt;/span&gt;))))&lt;br /&gt;     (&lt;span class="variable"&gt;kill-buffer&lt;/span&gt; (&lt;span class="variable"&gt;current-buffer&lt;/span&gt;)))&lt;br /&gt; (&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;dv-mail-frames&lt;/span&gt;&lt;br /&gt;       (&lt;span class="variable"&gt;delete&lt;/span&gt; (&lt;span class="variable"&gt;selected-frame&lt;/span&gt;) &lt;span class="variable"&gt;dv-mail-frames&lt;/span&gt;))&lt;br /&gt; (&lt;span class="keyword"&gt;if&lt;/span&gt; (&lt;span class="variable"&gt;equal&lt;/span&gt; (&lt;span class="variable"&gt;selected-frame&lt;/span&gt;) &lt;span class="variable"&gt;dv-initial-frame&lt;/span&gt;)&lt;br /&gt;     (&lt;span class="variable"&gt;iconify-frame&lt;/span&gt;)&lt;br /&gt;   (&lt;span class="variable"&gt;delete-frame&lt;/span&gt;)))&lt;br /&gt;&lt;br /&gt;(&lt;span class="keyword"&gt;defun&lt;/span&gt; &lt;span class="variable"&gt;dv-paste-to-temp&lt;/span&gt; ()&lt;br /&gt; &lt;span class="selfeval"&gt;"Load clipboard in a temp buffer"&lt;/span&gt;&lt;br /&gt; (&lt;span class="variable"&gt;dv-focus-frame&lt;/span&gt; (&lt;span class="variable"&gt;make-frame&lt;/span&gt;))&lt;br /&gt; (&lt;span class="variable"&gt;switch-to-buffer&lt;/span&gt; (&lt;span class="variable"&gt;generate-new-buffer&lt;/span&gt; &lt;span class="selfeval"&gt;"temp"&lt;/span&gt;))&lt;br /&gt; (&lt;span class="variable"&gt;clipboard-yank&lt;/span&gt;))&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;再如果，你和我一样是个win32底下的懒人，那么估计你还需要这个。&lt;/p&gt;&lt;br /&gt;&lt;p align="left"&gt; &lt;/p&gt;&lt;br /&gt;&lt;pre class="scheme"&gt;(&lt;span class="keyword"&gt;defun&lt;/span&gt; &lt;span class="variable"&gt;w32-restore-frame&lt;/span&gt; (&lt;span class="variable"&gt;&amp;amp;optional&lt;/span&gt; &lt;span class="variable"&gt;arg&lt;/span&gt;)&lt;br /&gt;   &lt;span class="selfeval"&gt;"Restore a minimized frame"&lt;/span&gt;&lt;br /&gt;    (&lt;span class="variable"&gt;interactive&lt;/span&gt;)&lt;br /&gt;    (&lt;span class="variable"&gt;w32-send-sys-command&lt;/span&gt; &lt;span class="selfeval"&gt;61728&lt;/span&gt; &lt;span class="variable"&gt;arg&lt;/span&gt;))&lt;br /&gt;(&lt;span class="keyword"&gt;defun&lt;/span&gt; &lt;span class="variable"&gt;w32-maximize-frame&lt;/span&gt; (&lt;span class="variable"&gt;&amp;amp;optional&lt;/span&gt; &lt;span class="variable"&gt;arg&lt;/span&gt;)&lt;br /&gt;   &lt;span class="selfeval"&gt;"Maximize the current frame"&lt;/span&gt;&lt;br /&gt;    (&lt;span class="variable"&gt;interactive&lt;/span&gt;)&lt;br /&gt;    (&lt;span class="variable"&gt;w32-send-sys-command&lt;/span&gt; &lt;span class="selfeval"&gt;61488&lt;/span&gt; &lt;span class="variable"&gt;arg&lt;/span&gt;))&lt;br /&gt;(&lt;span class="variable"&gt;w32-maximize-frame&lt;/span&gt;)&lt;br /&gt;(&lt;span class="variable"&gt;add-hook&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;&lt;span class="variable"&gt;after-make-frame-functions&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;&lt;span class="variable"&gt;w32-maximize-frame&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;这可以使得每一个新打开的frame都自动最大化。&lt;/p&gt;&lt;br /&gt;&lt;h1 class="chapter"&gt;&lt;br /&gt;&lt;p class="chapterheading"&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_5" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_5"&gt;Chapter 5&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_5" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_5"&gt;安排自己的时间&lt;/a&gt;&lt;/p&gt;&lt;/h1&gt;&lt;br /&gt;&lt;p&gt;如果你已经是一个善于管理自己时间的人，那么Emacs的这些功能可能就全都没有必要了。不过，如果你和我一样在这个方面拎不清，Emacs 就显得很帮忙了。&lt;br /&gt;&lt;br /&gt;以下的内容加入到.emacs文件中，会有不少帮助。&lt;/p&gt;&lt;br /&gt;&lt;p align="left"&gt; &lt;/p&gt;&lt;br /&gt;&lt;pre class="scheme"&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;display-time-24hr-format&lt;/span&gt; &lt;span class="variable"&gt;t&lt;/span&gt;)&lt;br /&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;display-time-day-and-date&lt;/span&gt; &lt;span class="variable"&gt;t&lt;/span&gt;)&lt;br /&gt;(&lt;span class="variable"&gt;display-time&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;todo-file-do&lt;/span&gt; &lt;span class="selfeval"&gt;"~/emacs/todo/do"&lt;/span&gt;)&lt;br /&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;todo-file-done&lt;/span&gt; &lt;span class="selfeval"&gt;"~/emacs/todo/done"&lt;/span&gt;)&lt;br /&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;todo-file-top&lt;/span&gt; &lt;span class="selfeval"&gt;"~/emacs/todo/top"&lt;/span&gt;)&lt;br /&gt;&lt;br /&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;diary-file&lt;/span&gt; &lt;span class="selfeval"&gt;"~/emacs/diary"&lt;/span&gt;)&lt;br /&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;diary-mail-addr&lt;/span&gt; &lt;span class="selfeval"&gt;"you@your.email.address"&lt;/span&gt;)&lt;br /&gt;(&lt;span class="variable"&gt;add-hook&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;&lt;span class="variable"&gt;diary-hook&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;&lt;span class="variable"&gt;appt-make-list&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;将所有emacs里面用到的文件都放到~/emacs目录中去，偶觉得是个好习惯。&lt;br /&gt;&lt;br /&gt;对于大多数预期要做的事情，使用todo模式是最方便的，偶的习惯是访问do文件的时候，作一个bookmark(使用M-x bookmark-set命令)，这样以后访问起来就很方便了。bookmark是Emacs很有用的功能，偶一般就把 list-bookmark绑定到F12上去，随手就能钩着。想起什么事情的时候，随手就切到todo那边去，找一个catalog，用I命令插入一个新的entry；做完了一件事情，随手切到todo那边去，用d或者f就能把entry去掉。每个星期结束的时候，看看done文件，就会有“日子过得好充实阿”酱紫的感叹。&lt;br /&gt;&lt;br /&gt;也有的事情没有那么重要，写不成todo的。这个时候就用 appointment 。用 &lt;code class="scheme"&gt;&lt;span style="font-family:新宋体;"&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;appt-issue-message&lt;/span&gt; &lt;span class="variable"&gt;t&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;确认打开了约会提醒功能，然后用appt-add命令就可以加入新的约会提醒。比如在电话里和mm吵架了，挂了电话以后，在 Emacs 里面使用&lt;code class="verbatim"&gt;&lt;span style="font-family:新宋体;"&gt;M-x appt-add&lt;/span&gt;&lt;/code&gt;命令加一条记录，估计一下半个小时以后，给mm打个电话赔礼道歉。半个小时以后， Emacs 就会跳出一个小框来提醒说，该打电话了。当然，如果半个小时之内，mm主动打电话回来修好，那就用 &lt;code class="verbatim"&gt;&lt;span style="font-family:新宋体;"&gt;M-x appt-delete&lt;/span&gt;&lt;/code&gt;命令删掉提醒好了。&lt;br /&gt;&lt;br /&gt;对于那些周期性比较长的事情，可以用diary。我刚开始用diary的时候，以为diary是用来帮助写日记的，所以试了一下觉得好难用阿。仔细看看，发现diary其实是用来做行程管理的。&lt;br /&gt;&lt;br /&gt;单独用 diary 没什么意思的，所以info里面 diary 也是和 calendar 放在一起的。偶把 calendar 绑定到F8上 &lt;code class="scheme"&gt;&lt;span style="font-family:新宋体;"&gt;(&lt;span class="variable"&gt;global-set-key&lt;/span&gt; [(&lt;span class="variable"&gt;control&lt;/span&gt; &lt;span class="variable"&gt;f8&lt;/span&gt;)] &lt;span class="keyword"&gt;'&lt;/span&gt;&lt;span class="variable"&gt;calendar&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;。启动calendar会出现一个小窗口，显示当前日历。calendar 模式底下命令很多，但是常用的就那么几个，.命令可以跳回当今天，o命令可以跳到某一个月。g系列命令表示goto，可以跳到指定的某一天，g d 是跳到某年某月某日，g c是跳到某年某星期的星期几，g C可以跳到阴历的某一天。p系列命令表示print，可以按照某格式显示当前日期，比如p C就可以显示当前的阴历日期。偶们现在比较关心的是i系列命令，i d是加入当前这一天的行程安排，d表示的是day，显然依此类推还有m，y，w。&lt;br /&gt;&lt;br /&gt;比如mm打个电话来说，星期天要陪她去颐和园。用Emacs记一下吧，免得忘了。打开calendar，跳到星期天上面，i d，陪mm去颐和园。又比如老板说，以后每个星期一都给我交一份报告上来，打开calendar，跳到某个星期一上面，i w，交报告给老板。还有一个常用的，比如mm生日是 9/29，打开calendar，跳到9/29，i a，a代表anniversary，mm生日。养成用diary的习惯以后，经常性的打开calendar，跳到某一天，按一下d，就可以看那一天有哪些安排了。相比之下，h命令对偶来说就很垃圾。&lt;br /&gt;&lt;br /&gt;diary文件里面可以写一些更详细的内容，比如直接把一个约会提醒写到diary里面，偶觉得这个不是很方便。diary文件不过是一个纯文本，有什么不满意的话，可以直接去修改，记得打开diary文件的时候，切回基本模式，不然很多东西是看不到啦。&lt;br /&gt;&lt;br /&gt;有的更完整一些的模式，比如plan模式，需要额外从网上下载，可以将作出的plan转换成pp的个人主页。不过我是不会用的啦。&lt;/p&gt;&lt;br /&gt;&lt;h1 class="chapter"&gt;&lt;br /&gt;&lt;p class="chapterheading"&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_6" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_6"&gt;Chapter 6&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_6" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_6"&gt;用Emacs写东西&lt;/a&gt;&lt;/p&gt;&lt;/h1&gt;&lt;br /&gt;&lt;p&gt;虽然写程序也叫做写东西，可是我们现在要讨论的不是它。我们大部分的时间里写的，是拿到bbs上灌的，是留到以后查的。Emacs有一些不错的特点，可以方便上面说的这些事情。&lt;br /&gt;&lt;br /&gt;大部分的时间里，我们要写的文章写成T&lt;small&gt;E&lt;/small&gt;X挺困难，因为不是那么有条理；但是直接当纯文本处理，似乎又太没有条理。这种时候，用Emacs 的outline-mode就很合适。outline模式最大的好处是简单：只要在行首放上几个星号“*”，就可以表达文章的条理关系。比如，看《爱丽丝漫游奇境》是做一点摘录，先打开一个新文件C-x C-f；然后打开outline模式M-x outline-mode；再然后呢，第一章的内容，先来一个*吧，写上第一章的题目；第一章的写完了，C-c C-c就可以把前面写的内容都折起来，只留下一个标题，看起来很是清爽。过一段时间想起来翻查的时候，C-x C-f打开文件，还是进入outline-mode，C-c C-o就把所有内容都折起来了，只留下标题，文件里面到底有些什么内容，也都一目了然了。&lt;br /&gt;&lt;br /&gt;这样做有一个缺点，就是很容易把所有内容都堆到同一个文件里面，眼看着文件越来越大，很容易就要上兆了。不过Emacs是支持直接编辑压缩文件的，用auto-compression-mode就可以。&lt;br /&gt;&lt;br /&gt;另外一个经常让人头疼的问题，就是文章的排版。特别是要拿到bbs 上贴的文章，bbs虽然号称支持自动换行，但是那也只是个聊胜于无的东西，要想给人看，还是得手动换行才行。Emacs可以把一句长长的话自动分成若干行，而且这个效果一般都很让人满意。只要把point移动到需要重新整理的段落之中，M-q，就可以完成排版的工作。如果这样还嫌麻烦，那么做成宏也是个不错的注意。如果文章是自己在写，那么打开 auto-fill-mode，是个不错的注意。auto-fill模式可以在写的同时，帮你做换行的工作。&lt;br /&gt;&lt;br /&gt;如果写的东西大部分是英文的，还可以考虑打开flyspell-mode。不过这个东西需要后面有ispell支持。win32底下有一个native的ispell v4，不过用起来挺不爽的：v4是一个已经放弃的版本，这是一；和现有的其他模式搭配也不愉快，这是二。v3里面现成的win32版本有两个，建议装一个 cygwin。 另外也有一个win32 native的，可以从  &lt;a href="http://www.fsci.fuk.kindai.ac.jp/%7Ekakuto/win32-ptex/web2c75-e.html" mce_href="http://www.fsci.fuk.kindai.ac.jp/%7Ekakuto/win32-ptex/web2c75-e.html"&gt;http://www.fsci.fuk.kindai.ac.jp/ kakuto/win32-ptex/web2c75-e.html&lt;/a&gt;  找到，日本人做的，我也没有试过。打开flyspell-mode之后，写东西的过程当中，ispell认为写错了的单词，就会自动高亮，很是显眼。 &lt;code class="verbatim"&gt;&lt;span style="font-family:新宋体;"&gt;M-$&lt;/span&gt;&lt;/code&gt;可以让Emacs提示你写错的单词到底应该怎么拼。win32的Emacs 21还没支持 tooltip，所以有些看起来很炫的功能不能用。不过偶觉得就上面说的几种模式，一般过日子也就足够了。&lt;br /&gt;&lt;br /&gt;尝试过 wiki 的同学，也可以试用一下 Emacs 下的 wiki 模式，不过偶以为 wiki 模式不适合给说中文的人用。&lt;/p&gt;&lt;br /&gt;&lt;h1 class="chapter"&gt;&lt;br /&gt;&lt;p class="chapterheading"&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_7" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_7"&gt;Chapter 7&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_7" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_7"&gt;管理自己的地盘&lt;/a&gt;&lt;/p&gt;&lt;/h1&gt;&lt;br /&gt;&lt;p&gt;我习惯没事情干的时候，就逛自己的硬盘。相信很多人有和我类似的毛病，上网的时候看到好的文章就存下来，时间一长，硬盘的各个角落里面就堆满了各种各样的html，txt文件。只能常常抽空遍历一下自己的目录，看看又多了一些什么东西。这件事情用cmd.exe可以做，用资源管理器也能做，不行话还有wincmd，totalcmd之类的软件。当然用惯命令行的还是觉得用sh.exe最好。&lt;br /&gt;&lt;br /&gt;Emacs既然是个八卦，就会八卦到底，它至少提供了另外两种选择，  eshell 和 dired 。&lt;br /&gt;&lt;br /&gt;eshell 看起来就很象一个 shell 了，不过拿它就做一个 shell 那也太委屈它了， eshell 带的 pcomplete 自动补全功能比 bash 之类的shell，还是有差距的。但是eshell的特长在于，可以直接使用 emacs lisp 的函数做命令。比如偶比较喜欢的 &lt;code class="scheme"&gt;&lt;span style="font-family:新宋体;"&gt;(&lt;span class="variable"&gt;defalias&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;&lt;span class="variable"&gt;vi&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;&lt;span class="variable"&gt;find-file&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;  （前提是系统里面没有vi的可执行文件），这样在eshell里面，vi一个文件，就会弹出一个新的 emacs buffer 。充分发挥想象力吧。唯一要注意的是， eshell 里面不能用C-c取消一个输入了一半的命令，我的做法一般是C-a C-k，其实也不太麻烦的。&lt;br /&gt;&lt;br /&gt;说到自动补全，不知道什么时候开始，突然发现几乎所有的shell，所有的编辑器都支持用tab来做自动补全了。Emacs当然也可以这样设定，不过有的时候，我们还是会怀念用tab来indent，不是吗？用这样一个函数吧：&lt;/p&gt;&lt;br /&gt;&lt;p align="left"&gt; &lt;/p&gt;&lt;br /&gt;&lt;pre class="scheme"&gt;(&lt;span class="keyword"&gt;defun&lt;/span&gt; &lt;span class="variable"&gt;my-indent-or-complete&lt;/span&gt; ()&lt;br /&gt; &lt;span class="selfeval"&gt;"如果在词尾，那就hippie-expand，否则就indent"&lt;/span&gt;&lt;br /&gt; (&lt;span class="variable"&gt;interactive&lt;/span&gt;)&lt;br /&gt; (&lt;span class="keyword"&gt;if&lt;/span&gt; (&lt;span class="variable"&gt;looking-at&lt;/span&gt; &lt;span class="selfeval"&gt;"&gt;"&lt;/span&gt;)&lt;br /&gt;     (&lt;span class="variable"&gt;hippie-expand&lt;/span&gt; &lt;span class="variable"&gt;nil&lt;/span&gt;)&lt;br /&gt;   (&lt;span class="variable"&gt;indent-for-tab-command&lt;/span&gt;)&lt;br /&gt;   ))&lt;br /&gt;(&lt;span class="variable"&gt;global-set-key&lt;/span&gt; [(&lt;span class="variable"&gt;tab&lt;/span&gt;)] &lt;span class="keyword"&gt;'&lt;/span&gt;&lt;span class="variable"&gt;my-indent-or-complete&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;hippie-expand虽然已经很不错了，不过我们可以让它更强一点的，&lt;/p&gt;&lt;br /&gt;&lt;p align="left"&gt; &lt;/p&gt;&lt;br /&gt;&lt;pre class="scheme"&gt;(&lt;span class="variable"&gt;autoload&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;&lt;span class="variable"&gt;senator-try-expand-semantic&lt;/span&gt; &lt;span class="selfeval"&gt;"senator"&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;然后再&lt;/p&gt;&lt;br /&gt;&lt;p align="left"&gt; &lt;/p&gt;&lt;br /&gt;&lt;pre class="scheme"&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;hippie-expand-try-functions-list&lt;/span&gt;&lt;br /&gt;     &lt;span class="keyword"&gt;'&lt;/span&gt;(&lt;br /&gt;       &lt;span class="variable"&gt;senator-try-expand-semantic&lt;/span&gt;&lt;br /&gt;       &lt;span class="variable"&gt;try-expand-dabbrev&lt;/span&gt;&lt;br /&gt;       &lt;span class="comment"&gt;;;........&lt;/span&gt;&lt;br /&gt;       ))&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;当然前提是要装一个semantic，这个以后再说。&lt;br /&gt;&lt;br /&gt;Dired看起来就更象一个wincmd。常用的命令也就是v（查看），e （编辑），d（标记删除），x（执行删除）。以前一度，我喜欢再dired里面做el文件的byte compile，只要在需要compile的文件上面按B就可以了，不过现在发现，那样还不如用这样一行命令合算：&lt;/p&gt;&lt;br /&gt;&lt;p align="left"&gt; &lt;/p&gt;&lt;br /&gt;&lt;pre class="scheme"&gt;(&lt;span class="variable"&gt;byte-recompile-directory&lt;/span&gt; &lt;span class="selfeval"&gt;"/path/to/somewhere"&lt;/span&gt; &lt;span class="selfeval"&gt;0&lt;/span&gt; &lt;span class="variable"&gt;t&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;自动重新编译一个目录下面所有的el文件。Emacs和python不一样， elc 和el执行速度会差的很多，mule-ucs就是一个典型，编译之前启动一次要半分钟，编译之后启动就是一眨眼的事情了。当然编译也是一个很费时的事情。真是的。&lt;br /&gt;&lt;br /&gt;&lt;a class="mceItemAnchor" title="node_chap_8" name="node_chap_8"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;h1 class="chapter"&gt;&lt;br /&gt;&lt;p class="chapterheading"&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_8" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_8"&gt;Chapter 8&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_8" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_8"&gt;用Emacs写程序&lt;/a&gt;&lt;/p&gt;&lt;/h1&gt;&lt;br /&gt;&lt;p&gt;Emacs号称是一个强大的IDE，可是往往被人误解。甚至常常有人以为，让VS.net的热键设置和Emacs一样，VS.net就算可以模仿Emacs了，这个基本上是比天只小一点点的笑话。&lt;br /&gt;&lt;br /&gt;还是从写还是吧。&lt;br /&gt;&lt;br /&gt;基本上那些常见的编程语言，Emacs都有支持。我们现在说的支持，基本上就限于有一种对应于这种语言的major mode。最常见的就是cc-mode了，甚至还专门拿出来，在sourceforge上做了一个项目的说。cc-mode可以不错的支持各种语法上有些类似c的语言，甚至于idl。&lt;br /&gt;&lt;br /&gt;不过， cc-mode 不支持c Sharp 。 google 上能搜到一些给 Emacs 用的 c sharp major mode ，我觉得  &lt;a href="http://davh.dk/script" mce_href="http://davh.dk/script"&gt;http://davh.dk/script&lt;/a&gt;上的那个不错；别的大都需要对  Emacs 自带的 cc-mode 做替换，让人觉得很不爽。前面提到的那个，在 Emacs 21.3.xx上可能需要作一点小的修改，大概621行左右的位置，  &lt;code class="scheme"&gt;&lt;span style="font-family:新宋体;"&gt;(&lt;span class="variable"&gt;c-common-init&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt;改成&lt;code class="scheme"&gt;&lt;span style="font-family:新宋体;"&gt;(&lt;span class="variable"&gt;c-common-init&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;&lt;span class="variable"&gt;c-mode&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt; ，大致如此。&lt;br /&gt;&lt;br /&gt;Python mode需要到&lt;a href="http://www.python.org/" mce_href="http://www.python.org/"&gt;http://www.python.org&lt;/a&gt;上去下载。&lt;br /&gt;&lt;br /&gt;有了这些以后，基本上不愁写程序的时候的语法加亮的问题了。（其实本来也没什么好愁的，毕竟这是最基本的要求）。&lt;br /&gt;&lt;br /&gt;有人偏爱ue那样，把当前行高亮的样子，那就先打开&lt;code class="verbatim"&gt;&lt;span style="font-family:新宋体;"&gt;M-x hl-line-mode&lt;/span&gt;&lt;/code&gt;。&lt;br /&gt;&lt;br /&gt;有人看到 ThisIsASimpleVarInJava 就觉得郁闷，那就打开 &lt;code class="verbatim"&gt;&lt;span style="font-family:新宋体;"&gt;M-x glasses-mode&lt;/span&gt;&lt;/code&gt; 。&lt;br /&gt;&lt;br /&gt;关于补全，上次提到过，hippie-expand加上semantic是现在最好的选择了。dabbrev-expand完全不懂语义的，常常给扩展出一些莫名其妙的内容来，semantic就不一样了。它至少是懂的语义的，expand的结果看起来就合理的多，有的时候甚至能够认出某一个变量的类型来，让我激动了老半天，当然，只是有时候阿。semantic可以从 &lt;a href="http://sf.net/projects/cedet" mce_href="http://sf.net/projects/cedet"&gt;http://sf.net/projects/cedet&lt;/a&gt;上下载。别的还有一些东西，比如jde或者ecb都是建立在semantic的基础上的，写java的话，也可以用jde，比elipse之类当然是要轻的多了。ecb偶没用过。 &lt;a href="http://www.xref-tech.com/" mce_href="http://www.xref-tech.com/"&gt;http://www.xref-tech.com&lt;/a&gt;上的xref 支持更出色，不过那就不是自由软件的范畴了。&lt;br /&gt;&lt;br /&gt;关于宏，c语言最麻烦的可能是宏了。常常是面对嵌套了若干层的宏，看不出一个所以然来。 这个时候，可以直接用C-c C-e，对已经选定的区域做预处理，预处理的结果会显是在另外的buffer里面。这项工作缺省使用cpp来做，不过只要编译器支持从标注输入读入代码，好像都可以正常工作。另外有一些简单的宏，比如用来做平台选择的，直接用 hide-ifdef-mode就可以摆平，都免去了调用预处理器的麻烦。&lt;br /&gt;&lt;br /&gt;关于代码隐藏，其实偶一般只用一个C-c @ C-c，hs-troggle-hiding。基本上能够满足要求了。 不过用之前记得先打开M-x hs-minor-mode。&lt;br /&gt;&lt;br /&gt;关于文件，有一个很方便的命令。取个名字叫my-find-related-file。这个命令可以打开当前.c文件中所有include了的文件。&lt;/p&gt;&lt;br /&gt;&lt;p align="left"&gt; &lt;/p&gt;&lt;br /&gt;&lt;pre class="scheme"&gt;(&lt;span class="keyword"&gt;defun&lt;/span&gt; &lt;span class="variable"&gt;my-find-related-file&lt;/span&gt; ()&lt;br /&gt; &lt;span class="selfeval"&gt;"Find all related files in this buffer"&lt;/span&gt;&lt;br /&gt; (&lt;span class="variable"&gt;interactive&lt;/span&gt;)&lt;br /&gt; (&lt;span class="variable"&gt;save-excursion&lt;/span&gt;&lt;br /&gt;   (&lt;span class="keyword"&gt;let&lt;/span&gt; ((&lt;span class="variable"&gt;my-buffer&lt;/span&gt; (&lt;span class="variable"&gt;current-buffer&lt;/span&gt;)))&lt;br /&gt;   (&lt;span class="variable"&gt;goto-char&lt;/span&gt; (&lt;span class="variable"&gt;point-min&lt;/span&gt;))&lt;br /&gt;   (&lt;span class="variable"&gt;while&lt;/span&gt; (&lt;span class="variable"&gt;search-forward-regexp&lt;/span&gt; &lt;span class="selfeval"&gt;" *# *include"&lt;/span&gt; (&lt;span class="variable"&gt;point-max&lt;/span&gt;) &lt;span class="variable"&gt;t&lt;/span&gt;)&lt;br /&gt;     (&lt;span class="variable"&gt;progn&lt;/span&gt;&lt;br /&gt;       (&lt;span class="variable"&gt;ff-find-other-file&lt;/span&gt;)&lt;br /&gt;       (&lt;span class="variable"&gt;switch-to-buffer&lt;/span&gt; &lt;span class="variable"&gt;my-buffer&lt;/span&gt;)&lt;br /&gt;     )))))&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;还有就是注意，ff-search-directories早一点设定，用过一次ff函数以后，再setq就晚了。 ;-) 以上。&lt;br /&gt;&lt;br /&gt;关于查看帮助，有的选的有info和woman。woman可以用来看man能查到的帮助。一般可以把下面这点代码绑定到f1上。&lt;/p&gt;&lt;br /&gt;&lt;p align="left"&gt; &lt;/p&gt;&lt;br /&gt;&lt;pre class="scheme"&gt;(&lt;span class="variable"&gt;global-set-key&lt;/span&gt; [(&lt;span class="variable"&gt;f1&lt;/span&gt;)] (&lt;span class="keyword"&gt;lambda&lt;/span&gt;()&lt;br /&gt;                (&lt;span class="variable"&gt;interactive&lt;/span&gt;)&lt;br /&gt;                (&lt;span class="keyword"&gt;let&lt;/span&gt; ((&lt;span class="variable"&gt;woman-topic-at-point&lt;/span&gt; &lt;span class="variable"&gt;t&lt;/span&gt;))&lt;br /&gt;                (&lt;span class="variable"&gt;woman&lt;/span&gt;))))&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;也可以用C-h C-i在info里面查看函数。这些都很简单了。如果你还不满足，那就直接google吧，可以考虑利用browser-url。 ;-)&lt;br /&gt;&lt;br /&gt;关于自动排版。自动排版算是一个比较重要的功能，特别是对于那些版式和程序结构没有影响的语言，让代码的排版比较迎合个人的喜好，这个不过分吧。对于整个文件做重排，一般要C-x h选定整个buffer，然后 C-M-&lt;img src="http://teren.itpub.net/daily-emacs-Z-G-2.gif" mce_src="http://teren.itpub.net/daily-emacs-Z-G-2.gif" alt="[daily-emacs-Z-G-2.gif]" border="0" /&gt;重新排版。 这个一般比较耗时间，如果代码文件确实很长的话。折中的做法是在一个代码端开始的地方，就是{处，用C-c C-q，酱紫可以排版一个代码段。排版的风格可以用c-set-style来设定，偶一般用 stroustrup，表达偶对他的仰慕。如果对于具体的某一个设置不满意，可以在不满意的地方用C-c C-s看一下，这里缩进的设置是取决于什么的；然后可以用C-c C-o修改之。&lt;br /&gt;&lt;br /&gt;关于移动。程序代码里面移动来移动去，也是一个问题。最直接的办法当然是用鼠标了。不过各种模式里面一般也都会对常见的移动键位做修订，可以自己试一试，找出比较常用的键来。几乎所有的模式都会支持以函数定义为单位移动，这个一般都很好用。&lt;br /&gt;&lt;br /&gt;关于tag，Emacs附带的etags可以用来生成TAGS文件。在某个源文件中 M-.，Emacs会询问访问哪一个TAGS文件，这个基本上和vi差不多。更强悍一点的是ebrowser，生成一个BROWSER文件，只要find-file这个文件，就会进入ebrowser的模式，有一点类似于cscope。speedbar在这个时候可以来帮忙，试试看就知道了，不过好不好使就完全是一个见仁见智的问题。上次说到的ecb（sf.net/projects/ecb），也着眼于解决这一类问题，有兴趣试试？&lt;br /&gt;&lt;br /&gt;关于grep，Emacs自己没有grep功能（ft）。不过好在grep这个东西不管哪个平台都有，win32底下叫做findstr（ft again）。可以尝试一下 grep，grep-find。 前者是直接把参数传递给grep的，后者是把参数传递给find + grep，两者都会在当前buffer对应文件所在的目录下面进行。反正和直接在console下面玩没什么两样的。&lt;br /&gt;&lt;br /&gt;关于diff，ediff模式很不错的。比较爽的做法是在eshell里面用。 ediff a.c.orig a.c。 特别注意的是，ediff的session控制区是一个小窗口，那个小窗口关掉，就算是退出ediff了哦。ediff可以忽略空格的。对应的epatch较之直接用patch的优点就在于，patch完了以后就直接进入 ediff模式，什么地方做了改动一目了然。&lt;br /&gt;&lt;br /&gt;关于注释，虽然最简单的做法是用C-c C-c注释掉整块已经选定的区域，但是这种做法不一定是最好的。如果是想将暂时不需要的代码抹掉，还是用&lt;code class="verbatim"&gt;&lt;span style="font-family:新宋体;"&gt;#if 0/#endif&lt;/span&gt;&lt;/code&gt;比较合适，因为我一般用flyspell-prog-mode来检查注释里面有没有单词拼写错误。如果你不想看到代码里面被指出很多拼写错误来，那还是不要滥用C-c C-c的好。&lt;br /&gt;&lt;br /&gt;xref 是一个用起来挺不错得 refactory 包，它也可以用来完成大多数例如 symbol 补全一类得工作。唯一让人觉得有点不爽的是，它是一个版权软件，是需要 license 的。 当然，它也提供了免费试用版本下载的；同时也提供了源代码下载，你也可以试着用xref重构它自己的代码。&lt;/p&gt;&lt;br /&gt;&lt;h1 class="chapter"&gt;&lt;br /&gt;&lt;p class="chapterheading"&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_9" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_9"&gt;Chapter 9&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_9" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_9"&gt;编译你的程序&lt;/a&gt;&lt;/p&gt;&lt;/h1&gt;&lt;br /&gt;&lt;p&gt;如果Emacs只能拿来写东西，那是不够的。至少，因为Emacs可以通过 M-!直接运行外部程序，所以理论上我们是可以在Emacs里面做一切事情的。嗯，理论上。&lt;br /&gt;&lt;br /&gt;写了一点代码以后就会急急忙忙的去考虑该编译一下了。 &lt;code class="verbatim"&gt;&lt;span style="font-family:新宋体;"&gt;M-x compile&lt;/span&gt;&lt;/code&gt;  就可以了。 compile 缺省命令是make -k， Emacs 会在 minibuffer  里面跳出来问，compile的命令到底应该用什么呢？如果把  compilation-read-command 设成nil，它就不会那么罗嗦了。compile使用的命令是由 compile-command ，这个变量可以自己调整。有的IDE习惯每次文件存盘的时候就会做一次编译，比如 eclipse ；如果你也有这样的偏好的话，可以吧 compile 命令放到 after-save-hook 里面去。&lt;br /&gt;&lt;br /&gt;编译一切顺利那当然很好了，不过一般都不会是酱紫的。这个时候用 C-x `就可以跳到错误地点。 Emacs是通过对错误信息做正则匹配来找相关信息的，所以让Emacs支持特定某一个编译器是比较容易的。比如为了让 Emacs支持csc，就是csharp的compile，我们只需要：&lt;/p&gt;&lt;br /&gt;&lt;p align="left"&gt; &lt;/p&gt;&lt;br /&gt;&lt;pre class="scheme"&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;compilation-error-regexp-alist&lt;/span&gt;&lt;br /&gt;  (&lt;span class="variable"&gt;append&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;;;; tt.cs(5,14): error CS1585: Member modifier 'static' must precede the member type and name&lt;/span&gt;&lt;br /&gt;   (&lt;span class="variable"&gt;cons&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;(&lt;span class="selfeval"&gt;"(.*)(([0-9]+),([0-9]+)): (error|warning) CS[0-9]+:"&lt;/span&gt; &lt;span class="selfeval"&gt;1&lt;/span&gt; &lt;span class="selfeval"&gt;2&lt;/span&gt; &lt;span class="selfeval"&gt;3&lt;/span&gt;) ())&lt;br /&gt;    &lt;span class="variable"&gt;compilation-error-regexp-alist&lt;/span&gt;&lt;br /&gt;  )&lt;br /&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;注意到其中的1，2，3；分别表示的是文件名，行号，列号。&lt;br /&gt;&lt;br /&gt;Compile命令的扩展能力几乎是不受约束的，想得到的，就能支持的到。偶的想象能力比较贫乏，这里留白给更有研究精神的人来补全吧。&lt;/p&gt;&lt;br /&gt;&lt;h1 class="chapter"&gt;&lt;br /&gt;&lt;p class="chapterheading"&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_10" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_10"&gt;Chapter 10&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_10" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_10"&gt;电子邮件&lt;/a&gt;&lt;/p&gt;&lt;/h1&gt;&lt;br /&gt;&lt;p&gt;&lt;a class="mceItemAnchor" title="node_sec_10.1" name="node_sec_10.1"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_sec_10.1" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_sec_10.1"&gt;10.1  收邮件，发邮件&lt;/a&gt;&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;邮件系统很早就在Emacs里面占有重要地位了。从最早的 rmail 到 vm 到  gnus ，各种各样的 mail mode ，乱花迷人眼。VM似乎是界面最友好的了，还记得第一次用 xemacs 的时候，那还是4年前，VM就已经支持很好看的图标按钮了。虽然如此，我当时对 xemacs 是如此白痴，还是没法把VM好好的用起来。&lt;br /&gt;&lt;br /&gt;不过我转回到Emacs收信也是最近的事情了。要知道能让我从becky转过来，这个诱惑一定要不一般才可以。&lt;br /&gt;&lt;br /&gt;gnus就提供了这样的诱惑。这个号称世界上最好的news客户端，也能作一个世界上最好的maillist客户端。如果你不上news，不混maillist，那么gnus的强大对你来说并没有意义，不如早点放弃吧。hehe&lt;br /&gt;&lt;br /&gt;设置用gnus收信，或者发信，其实是很容易的。gnus支持多个pop3服务器， Emacs 支持smtp发信认证（需要升级你的 Emacs lisp 部分，21.3.1的还没包括这部分的内容），如果你希望 pop3 收信的时候不删除服务器上的邮件，Emacs现在还不行，你要自己动手去安装一个 epop3.el 的扩展。偶没用装过，因为偶没有这样的需求。在开始&lt;code class="verbatim"&gt;&lt;span style="font-family:新宋体;"&gt;M-x gnus&lt;/span&gt;&lt;/code&gt;之前，记得在.emacs文件里面添上一些东西：&lt;/p&gt;&lt;br /&gt;&lt;p align="left"&gt; &lt;/p&gt;&lt;br /&gt;&lt;pre class="scheme"&gt;(&lt;span class="builtin"&gt;require&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;&lt;span class="variable"&gt;gnus-load&lt;/span&gt;)&lt;br /&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;gnus-startup-file&lt;/span&gt; &lt;span class="selfeval"&gt;"~/emacs/config/newsrc"&lt;/span&gt;)&lt;br /&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;gnus-init-file&lt;/span&gt; &lt;span class="selfeval"&gt;"~/emacs/config/gnus-config"&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;把gnus-config从.emacs中分出来的做法比较清楚，因为你以后会经常有改gnus-config的需要的。在gnus-config中需要加上这些内容：&lt;/p&gt;&lt;br /&gt;&lt;p align="left"&gt; &lt;/p&gt;&lt;br /&gt;&lt;pre class="scheme"&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;gnus-select-method&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;(&lt;span class="variable"&gt;nnfolder&lt;/span&gt; &lt;span class="selfeval"&gt;""&lt;/span&gt;))&lt;br /&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;gnus-secondary-select-methods&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;((&lt;span class="variable"&gt;nntp&lt;/span&gt; &lt;span class="selfeval"&gt;"news.gnus.org"&lt;/span&gt;)))&lt;br /&gt;(&lt;span class="variable"&gt;add-to-list&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;&lt;span class="variable"&gt;gnus-secondary-select-methods&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;(&lt;span class="variable"&gt;nntp&lt;/span&gt; &lt;span class="selfeval"&gt;"perl.org"&lt;/span&gt; (&lt;span class="variable"&gt;nntp-address&lt;/span&gt; &lt;span class="selfeval"&gt;"nntp.perl.org"&lt;/span&gt;)))&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;上面的第一行指明的是gnus对邮件使用的backend，偶觉得nnfloder比较好，你可以先这样用着，反正backend以后还是可以换的，等你熟悉了 gnus以后。然后就可以给secondary-select-methods加各色的news服务器了，&lt;/p&gt;&lt;br /&gt;&lt;p align="left"&gt; &lt;/p&gt;&lt;br /&gt;&lt;pre class="scheme"&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;mail-sources&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;(&lt;br /&gt;                    (&lt;span class="variable"&gt;pop&lt;/span&gt; &lt;span class="selfeval"&gt;:server&lt;/span&gt; &lt;span class="selfeval"&gt;"263.net"&lt;/span&gt; &lt;span class="selfeval"&gt;:user&lt;/span&gt; &lt;span class="selfeval"&gt;"huxwcn"&lt;/span&gt; &lt;span class="selfeval"&gt;:password&lt;/span&gt; &lt;span class="selfeval"&gt;"pighead"&lt;/span&gt;)&lt;br /&gt;                    (&lt;span class="variable"&gt;pop&lt;/span&gt; &lt;span class="selfeval"&gt;:server&lt;/span&gt; &lt;span class="selfeval"&gt;"knight.6test.edu.cn"&lt;/span&gt; &lt;span class="selfeval"&gt;:user&lt;/span&gt; &lt;span class="selfeval"&gt;"huxw"&lt;/span&gt; &lt;span class="selfeval"&gt;:password&lt;/span&gt; &lt;span class="selfeval"&gt;"pighead"&lt;/span&gt;)&lt;br /&gt;                    ))&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;然后设置 backend 去哪里收信，除了 pop3 ，还支持 imap ，或者本地的  maildir 之类的冬冬，以此类推，还能加很多。还有就是希望你不会naive 的以为上面的密码是真的。&lt;br /&gt;&lt;br /&gt;最后，就是发信的设置。&lt;/p&gt;&lt;br /&gt;&lt;p align="left"&gt; &lt;/p&gt;&lt;br /&gt;&lt;pre class="scheme"&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;smtpmail-auth-credentials&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;((&lt;span class="selfeval"&gt;"smtp.263.net"&lt;/span&gt; &lt;span class="selfeval"&gt;25&lt;/span&gt; &lt;span class="selfeval"&gt;"huxwcn"&lt;/span&gt; &lt;span class="variable"&gt;nil&lt;/span&gt;)))&lt;br /&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;smtpmail-smtp-server&lt;/span&gt; &lt;span class="selfeval"&gt;"smtp.263.net"&lt;/span&gt;)&lt;br /&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;user-full-name&lt;/span&gt; &lt;span class="selfeval"&gt;"Robin Hu"&lt;/span&gt;)&lt;br /&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;user-mail-address&lt;/span&gt; &lt;span class="selfeval"&gt;"huxw@knight.6test.edu.cn"&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;前两行是说发信服务器的位置，后两行是给收信人看的。人家回信就会回到那个user-mail-address 上去。以后会看到这种东西都可以很灵活的修改。&lt;br /&gt;&lt;br /&gt;这些都搞定的时候，你就可以尝试开始gnus之旅了。我最后offer一点不好的消息，你要是觉得不爽的话，现在停止尝试gnus还来得及。因为 Emacs不是一个多线程的程序，而gnus也没有打算和别的程序合作，你打开 gnus的时候，Emacs的所有frame都会失去相应一段时间，时间的长短视 gnus把所有的邮件收回来需要的时间而定；如果你在家慢慢拨号的话，而且信有很多的话，这段时间可能会长达15分钟。事实上，news.gnus.org里面的同学似乎都是开了两个Emacs的，一个专门起gnus，另一个干活，酱紫。&lt;br /&gt;&lt;br /&gt;好了，如果你连这个也不在乎的话，那就开始吧。M-x gnus。你会什么也看不见。这是因为gnus缺省以为，你收的邮件，都是属于某一个列表的，就好像bbs上的版面一样，你不订阅，就什么也看不见。订阅很容易，用^可以进入&lt;code class="verbatim"&gt;&lt;span style="font-family:新宋体;"&gt;*Server Buffer*&lt;/span&gt;&lt;/code&gt;，在nnfolder上按RET，看到mail.misc以后按u就可以订阅它。 缺省所有没有分类的邮件都会跑到mail.misc里面去。你以后在慢慢改吧。&lt;br /&gt;&lt;br /&gt;&lt;a class="mceItemAnchor" title="node_sec_10.2" name="node_sec_10.2"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_sec_10.2" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_sec_10.2"&gt;10.2  删除邮件&lt;/a&gt;&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;如何删除邮件，是GNUS的一个特点。&lt;br /&gt;&lt;br /&gt;我们上bbs的时候，帖子怎么处理，不是我们说了算的，而是版主说了算了的。换句话说，帖子的生命周期是不受你掌握的，如果你想保存某一封帖子，你得把它下载到你自己的硬盘上去。gnus认为邮件也是酱紫的。在gnus里面，主动删除邮件是不提倡的，你应该让gnus自己处理邮件，被称为过期（expire）。&lt;br /&gt;&lt;br /&gt;在缺省的设置中，你可以在一封邮件上按E，告诉gnus，这封邮件，过期了。 但是过期并不等同于删除，gnus会将这封邮件放入expire的队列中，然后等待一个特定的时间，差不多就是你真的已经忘了这封邮件的时候，gnus悄悄的删除了它。&lt;br /&gt;&lt;br /&gt;你也可以采用auto expire模式，gnus会认为，所有你“读”过的信都是过期的，于是那些信都悄悄的自动进了过期队列，等着被删除。你还可以采用total expire模式，gnus会认为，所有你“标记为读”的信，都是过期的，于是那些信也都悄悄的进了过期队列，等着被删除。&lt;br /&gt;&lt;br /&gt;这样的做法看起来比较诡异，但是处理邮件列表的时候却让人觉得非常自然。 所有看过就忘的信，不用去管什么时候要删除它，而且这些信在被删除之前，不会主动跳出来骚扰你；如果看到列表中某一个thread，记不起来之前这个thread到底是怎么样的，可以把这个thread没有真正删除的邮件都翻出来，显示一个完整的thread。相当于说，你总能在本地保留这个maillist最近若干天的snapshot。&lt;br /&gt;&lt;br /&gt;对于其他信件，处理也是一样的。除非是mm发给你的一万年都不能删除的信件，别的信都可以让它自己悄悄跑进过期队列，悄悄消失。你甚至可以改变那些过期邮件的去向，不删除他们，而是把他们按时期打个包，已备若干年后写回忆录用(joking)。如果你万分肯定，这封信必须当即删除，比如不能给mm看到的别人写给你的情书，那就B del，不过这个情况很少很少，而且会导致gnus一些诡异的行为，以后再说。&lt;br /&gt;&lt;br /&gt;罗里罗嗦了很多。expire具体的设置，都和邮件的分类联系在一起，下次再说吧，手累了。 ;-(&lt;br /&gt;&lt;br /&gt;&lt;a class="mceItemAnchor" title="node_sec_10.3" name="node_sec_10.3"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_sec_10.3" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_sec_10.3"&gt;10.3  邮件分类&lt;/a&gt;&lt;/h2&gt;&lt;br /&gt;&lt;p&gt;收到很多信的时候，需要分一下类。所有能用的mail客户端都支持对收到的mail做分类，包括gnus。在gnus当中，你可以通过指定的规则，将某一些邮件归成一类；在gnus看来，这样的一类邮件，基本上等同于news 服务器上的一个讨论组。&lt;br /&gt;&lt;br /&gt;给邮件分组的工作，是通过设置nnmail-split-methods来实现的。 gnus里面所有的设置名字都很长，容易敲错，一个简单的判别方法，是在变量上面C-h v看看有没有文档。 有文档的至少能够说明这个变量名没有敲错。&lt;br /&gt;&lt;br /&gt;我推荐使用nnmail-split-fancy来实现邮件分类，因为从个人经验来看，用fancy分类，至少可以把判别规则写的好看一点。这里先给一个sample。&lt;/p&gt;&lt;br /&gt;&lt;p align="left"&gt; &lt;/p&gt;&lt;br /&gt;&lt;pre class="scheme"&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;nnmail-split-fancy&lt;/span&gt;&lt;br /&gt;     &lt;span class="keyword"&gt;'&lt;/span&gt;(|&lt;br /&gt;&lt;span class="comment"&gt;;;      (: gnus-group-split-fancy)&lt;/span&gt;&lt;br /&gt;       (&lt;span class="variable"&gt;any&lt;/span&gt; &lt;span class="selfeval"&gt;".*-?current@(freebsd|FreeBSD).org"&lt;/span&gt; &lt;span class="selfeval"&gt;"maillist.freebsd.current"&lt;/span&gt;)&lt;br /&gt;       (&lt;span class="variable"&gt;any&lt;/span&gt; &lt;span class="selfeval"&gt;".*-?ipfw@(freebsd|FreeBSD).org"&lt;/span&gt; &lt;span class="selfeval"&gt;"maillist.freebsd.ipfw"&lt;/span&gt;)&lt;br /&gt;       (&lt;span class="variable"&gt;any&lt;/span&gt; &lt;span class="selfeval"&gt;"emacs-devel@gnu.org"&lt;/span&gt; &lt;span class="selfeval"&gt;"maillist.emacs.emacs-devel"&lt;/span&gt;)&lt;br /&gt;       &lt;span class="selfeval"&gt;"mail.misc"&lt;/span&gt;))&lt;br /&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;nnmail-split-methods&lt;/span&gt; &lt;span class="keyword"&gt;'&lt;/span&gt;&lt;span class="variable"&gt;nnmail-split-fancy&lt;/span&gt;)&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;其实就是一些正则表达式。需要注意的是，如果将 nnmail-crosspost设置为nil，那么就不会出现“一稿多投”的情况，也就是说一封邮件在这些判别规则上遇到符合的就会直接break了。还有就是不建议在这里用太复杂的正则表达式，偶曾经试图在一行里面对所有 freebsd的邮件列表进行分类，结果死的挺难看的。&lt;br /&gt;&lt;br /&gt;一旦邮件分类了。你应该也期望对不同类别的邮件作出区别对待。林林总总的需要都可以通过设置group parameter完成。对group parameter 的设置可以在gnus里面完成，使用G p或者G c：前者是字符界面的，后者是能跳出一个类似于cunstomize的界面来。也可以通过setq gnus-parameters，在.gnus文件里面手工设定。典型的例子比如：&lt;/p&gt;&lt;br /&gt;&lt;p align="left"&gt; &lt;/p&gt;&lt;br /&gt;&lt;pre class="scheme"&gt;(&lt;span class="variable"&gt;setq&lt;/span&gt; &lt;span class="variable"&gt;gnus-parameters&lt;/span&gt; &lt;span class="comment"&gt;;;别写错了名字&lt;/span&gt;&lt;br /&gt;     &lt;span class="keyword"&gt;'&lt;/span&gt;(&lt;br /&gt;       (&lt;span class="selfeval"&gt;"maillist.freebsd.(.*)$"&lt;/span&gt;&lt;br /&gt;        (&lt;span class="variable"&gt;to-list&lt;/span&gt; . &lt;span class="selfeval"&gt;"1@freebsd.org"&lt;/span&gt;)&lt;br /&gt;        (&lt;span class="variable"&gt;posting-style&lt;/span&gt;&lt;br /&gt;         (&lt;span class="variable"&gt;name&lt;/span&gt; &lt;span class="selfeval"&gt;"Me me me"&lt;/span&gt;)&lt;br /&gt;         (&lt;span class="variable"&gt;address&lt;/span&gt; &lt;span class="selfeval"&gt;"me2@whoami.com"&lt;/span&gt;)&lt;br /&gt;         (&lt;span class="variable"&gt;signature&lt;/span&gt; &lt;span class="selfeval"&gt;"Smile and Retain Smile."&lt;/span&gt;)) &lt;span class="comment"&gt;;;签名档也可以是文件&lt;/span&gt;&lt;br /&gt;        (&lt;span class="variable"&gt;total-expire&lt;/span&gt; . &lt;span class="variable"&gt;t&lt;/span&gt;)&lt;br /&gt;        (&lt;span class="variable"&gt;expiry-wait&lt;/span&gt; . &lt;span class="selfeval"&gt;7&lt;/span&gt;)&lt;br /&gt;        (&lt;span class="variable"&gt;broken-reply-to&lt;/span&gt; . &lt;span class="variable"&gt;t&lt;/span&gt;)&lt;br /&gt;        (&lt;span class="variable"&gt;subscribed&lt;/span&gt; . &lt;span class="variable"&gt;t&lt;/span&gt;))&lt;br /&gt;))&lt;/pre&gt;&lt;br /&gt;&lt;p&gt;注意，这里也可以用正则表达式哦 ;-)&lt;br /&gt;&lt;br /&gt;group parameter 中的 to-list ，可以被自动收集起来；酱紫如果你在  nnmail-split-fancy 里面用 gnus-group-split-fancy 来自动分类，免去自己重写一遍分类规则的麻烦。不过设置gnus-parameters，是没办法利用这种能力。&lt;br /&gt;&lt;br /&gt;设置好了 group parameter 能够简化很多事情。比如现在在 freebsd 的某个list里面按一下a，收件人地址就自动设成to-list了。很多时候比 bbdb还要方便的多。&lt;br /&gt;&lt;br /&gt;&lt;a class="mceItemAnchor" title="node_sec_10.4" name="node_sec_10.4"&gt;&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_sec_10.4" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_sec_10.4"&gt;10.4  SCORING&lt;/a&gt;&lt;/h2&gt;&lt;br /&gt;&lt;h1 class="chapter"&gt;&lt;br /&gt;&lt;p class="chapterheading"&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_11" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_11"&gt;Chapter 11&lt;/a&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;a href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_11" mce_href="http://teren.itpub.net/daily-emacs-Z-H-1.html#node_toc_node_chap_11"&gt;支持中文&lt;/a&gt;&lt;/p&gt;&lt;/h1&gt;&lt;br /&gt;&lt;p&gt;何曾几时，中文支持是Emacs的强项。在Emacs里面开一个shell上水木几乎是我唯一的选择。 时代变了，Emacs的中文支持就渐渐的落后了。&lt;br /&gt;&lt;br /&gt;Emacs内部有一套表示多国的方法，就是所谓的emacs-mule。我们能够在同一个emacs buffer里面能够同时看中日韩文字，能够同时看到阿拉伯文，能够同时看到德文，丹麦文；这都拜emacs-mule所赐。不幸的是 emacs-mule并没有成为事实上的编码标准。emacs-mule除了emacs自己能够认识以外，其他的编辑器都不支持。所以Emacs必须在和其他文本处理器交互的时候重新编码内部的emacs-mule。这里没有必要谈太多的细节， Emacs是一个self-document的编辑器，上面这些细节都可以在 coding.[ch]和charset.[ch]中找到。&lt;br /&gt;&lt;br /&gt;为了能和键盘交互（可以认为键盘是一个文本处理器，Emacs从键盘中读入文本），Emacs将从键盘中读入的文本“解码”为emacs-mule（我们这里说到编码解码，都是从Emacs的角度来看），为了文件能被其他的文本编辑器打开，比如vi，Emacs在存盘的时候将emacs-mule编码为 chinese-iso-8bit。这就是我们平常用到的各种coding system起到的作用。&lt;br /&gt;&lt;br /&gt;为了让Emacs支持gbk，我们需要做的，就是让所有的gbk编码字符，都能够在emacs-mule中找到自己的座位。虽然实际上emacs-mule里面所有的座位都已经被人坐满了，我们还是可以假设那些很少有人出现的座位依然是空的。前面给出的chinese-gbk就强占了cns11643-5, 6, 7的座位。这些座位的汉字几乎不可能出现在我们这些人的屏幕上，所以这种做法基本上是可行的。所以如果有一天，你在使用chinese-gbk的时候，又试图用 cns11643的编码来保存，还请你回到这里来想想可能会发生的事情。&lt;br /&gt;&lt;br /&gt;因为Emacs已经开始支持unicode了，所以让utf-8或者utf-16编码的 gbk汉字的文件在Emacs中显示并不是麻烦。而且Emacs已经在这里预留了 hook，只需要给一个 translate-table ，那就一切ok了。&lt;br /&gt;&lt;br /&gt;让 Emacs 支持从X拷贝过来的gbk汉字，很难直接在 lisp 代码中实现。因为X和 emacs 一样是个历史悠久的软件，所以它同样也有一套自己的多字节编码格式。在 Emacs 中，缺省是采用 compound-text-with-extension 来处理这种编码格式的。从作者当初开发的思路来看，我们让它支持gbk编码，只需要添加一项 &lt;code class="scheme"&gt;&lt;span style="font-family:新宋体;"&gt;(&lt;span class="selfeval"&gt;"GBK-0"&lt;/span&gt; . &lt;span class="variable"&gt;chinese-gbk&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt; 到 non-standard-icccm-encodings-alist中去，就可以简单的扩展支持gbk编码了。然而，因为实现上bug，和X本身的问题，这终究只是一个美好的愿望。如果你坚持的话，可以尝试一下这个补丁。注意这个时候就不能再使用 compound-text-with-extensions 作为 selection 的 coding system 了，而应该用chinese-gbk。&lt;/p&gt;&lt;br /&gt;&lt;pre class="verbatim"&gt;--- /home/huxw/src/Resp/emacs/src/xselect.c     2003-04-07 04:35:06.000000000 +0800&lt;br /&gt;+++ xselect.c   2003-05-26 11:17:42.966829744 +0800&lt;br /&gt;@@ -1496,6 +1496,11 @@&lt;br /&gt;     Lisp_Object target_type;  /* for error messages only */&lt;br /&gt;     Atom selection_atom;      /* for error messages only */&lt;br /&gt;{&lt;br /&gt;+       // by huxw start here&lt;br /&gt;+       XTextProperty text_prop;&lt;br /&gt;+       char** local_list;&lt;br /&gt;+       int local_number = 0;&lt;br /&gt;+       // by huxw end here&lt;br /&gt;  Atom actual_type;&lt;br /&gt;  int actual_format;&lt;br /&gt;  unsigned long actual_size;&lt;br /&gt;@@ -1554,12 +1559,70 @@&lt;br /&gt;&lt;br /&gt;  /* It's been read.  Now convert it to a lisp object in some semi-rational&lt;br /&gt;     manner.  */&lt;br /&gt;+  //by huxw start here&lt;br /&gt;+  if (XSupportsLocale()) {&lt;br /&gt;+         int local_status;&lt;br /&gt;+&lt;br /&gt;+         text_prop.value = (char*)data;&lt;br /&gt;+         text_prop.encoding = actual_type;&lt;br /&gt;+         text_prop.format = actual_format;&lt;br /&gt;+         text_prop.nitems = actual_size;&lt;br /&gt;+&lt;br /&gt;+         local_status = XmbTextPropertyToTextList(display, &amp;amp;text_prop, &amp;amp;local_list, &amp;amp;local_number);&lt;br /&gt;+         if (local_status &lt; Success || !local_number || !*local_list ) {&lt;br /&gt;+         } else {&lt;br /&gt;+                 xfree((char*)data);&lt;br /&gt;+                 data = strdup(*local_list);&lt;br /&gt;+                 XFreeStringList(local_list);&lt;br /&gt;+         }&lt;br /&gt;+  } else {&lt;br /&gt;+  }&lt;br /&gt;+  //by huxw end here&lt;br /&gt;+&lt;br /&gt;+#if 0&lt;br /&gt;  val = selection_data_to_lisp_data (display, data, bytes,&lt;br /&gt;                                    actual_type, actual_format);&lt;br /&gt;+#else&lt;br /&gt;+       val = selection_data_to_lisp_data (display, data, strlen(data), actual_type, actual_format);&lt;br /&gt;+#endif&lt;br /&gt;&lt;br /&gt;  /* Use xfree, not XFree, because x_get_window_property&lt;br /&gt;     calls xmalloc itself.  */&lt;br /&gt;-  xfree ((char *) data);&lt;br /&gt;+&lt;br /&gt;+  // by huxw start here&lt;br /&gt;+//  xfree ((char *) data);&lt;br /&gt;+  if (local_number == 0) { // Xmb is not used or not successed&lt;br /&gt;+         xfree((char*)data);&lt;br /&gt;+  } else {&lt;br /&gt;+         free(data);&lt;br /&gt;+  }&lt;br /&gt;+  // by huxw end here&lt;br /&gt;  return val;&lt;br /&gt;}Windows的国际化一向做的很好，可是Emacs没有打算依赖它。在 Windows里面跑的Emacs看起来很像在X里面跑的Emacs，很像，还是有一些要注意的地方。&lt;br /&gt;&lt;br /&gt;Windows 里只定义了 &lt;code class="verbatim"&gt;&lt;span style="font-family:新宋体;"&gt;GB2312_CHARSET&lt;/span&gt;&lt;/code&gt; ，这把Emacs搞糊涂了。如果在 Emacs里面列出可用的所有字体，会发现没有字体是以gbk结尾的，这也使得Emacs无法处理所有gbk编码的汉字，只能显示一个方框代替。处理方法一样简单，只要把 &lt;code class="scheme"&gt;&lt;span style="font-family:新宋体;"&gt;(&lt;span class="selfeval"&gt;"gbk"&lt;/span&gt; &lt;span class="variable"&gt;w32-charset-gb2312&lt;/span&gt; . &lt;span class="selfeval"&gt;936&lt;/span&gt;)&lt;/span&gt;&lt;/code&gt; 加到  &lt;code class="scheme"&gt;&lt;span class="variable"&gt;&lt;span style="font-family:新宋体;"&gt;w32-charset-info-alist&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; 中去就可以了。另外一个问题是Emacs有时无法正确处理字体名称中的中文编码，这种时候很是少见，找出问题之前，绕开就是了。&lt;br /&gt;&lt;br /&gt;Windows下的粘贴拷贝并没有额外的编码，所以把  &lt;code class="scheme"&gt;&lt;span class="variable"&gt;&lt;span style="font-family:新宋体;"&gt;clipboard-coding-system&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; 设成 &lt;code class="scheme"&gt;&lt;span class="variable"&gt;&lt;span style="font-family:新宋体;"&gt;chinese-gbk&lt;/span&gt;&lt;/span&gt;&lt;/code&gt; 就可以了，没有X底下的困扰。&lt;br /&gt;&lt;br /&gt;Emacs的中文支持虽然看起很繁琐，但是它却是最完善的。比如我们知道动感超人的口号是“啊哈&lt;img src="http://teren.itpub.net/daily-emacs-Z-G-3.gif" mce_src="http://teren.itpub.net/daily-emacs-Z-G-3.gif" alt="[daily-emacs-Z-G-3.gif]" border="0" /&gt;{6,8&lt;img src="http://teren.itpub.net/daily-emacs-Z-G-4.gif" mce_src="http://teren.itpub.net/daily-emacs-Z-G-4.gif" alt="[daily-emacs-Z-G-4.gif]" border="0" /&gt;}”，这种正则表达除了在Emacs里面，还能在哪里用呢？&lt;br /&gt;&lt;br /&gt;以上所说，都是针对FSF Emacs，而不是XEmacs。XEmacs的X11版本虽然也是用的 mule，但是做法稍有不同。而对于XEmacs的win32版本则根本不支持中文。XEmacs的新版本中会有不小改进，请拭目以待。&lt;/pre&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-172347632329296983?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/172347632329296983/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=172347632329296983' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/172347632329296983'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/172347632329296983'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/08/emacs.html' title='Emacs的日常生活（转）'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-6064060794566582617</id><published>2008-08-09T15:07:00.000-07:00</published><updated>2010-03-05T20:28:02.592-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='git'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>在emacs中使用git（翻译)</title><content type='html'>&lt;p id="s9yt" class="contents"&gt; 原文地址：http://xtalk.msk.su/~ott/en/writings/emacs-vcs/EmacsGit.html&lt;/p&gt;&lt;br/&gt;最近git越来越流行了， 这里就转一篇介绍使用git的文章吧。git在dict.cn的解释是&lt;br/&gt;&lt;p id="s9yt25" class="mut_jies"&gt;&lt;strong id="s9yt26"&gt;n. 饭桶，无用的人, a foolish or worthless person&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;&lt;p id="s9yt27" class="mut_jies"&gt; 这样的解释有很强的黑色幽默气质。 呵呵。 它是非常优秀的版本控制软件， 一开始是为linux kernel开发的，后来渐渐被很多项目所使用， 它特别适合分布式开发中的软件版本管理。&lt;/p&gt;&lt;br/&gt;&lt;p id="s9yt28"&gt;&lt;br id="ew7y" /&gt;&lt;/p&gt;&lt;br/&gt;&lt;p id="s9yt40"&gt;我们可以用Emacs中的版本控制包-VC或者DVC来使用git，或者是使用git.el和emacs-git. 前者使用VC和DVC的标准接口，后者实现了一些供开发者完全使用git功能的接口。&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;h2 id="s9yt42"&gt;&lt;a title="sec1" name="sec1" id="sec1"&gt;&lt;/a&gt;git.el 包&lt;/h2&gt;&lt;br/&gt;&lt;h3 id="s9yt43"&gt;&lt;a title="sec2" name="sec2" id="sec2"&gt;&lt;/a&gt; 安装git.el包&lt;br id="ew7y0" /&gt;&lt;/h3&gt;&lt;br/&gt;&lt;br id="ta41" /&gt;&lt;br/&gt;&lt;p id="uenp"&gt;安装git.el非常的简单， 它放在git源文件的contrib/emacs子目录下。 主要进入这个目录运行make命令就可以编译它。 同样你也可以运行make install 来安装它，它默认安装在$HOME/share/emacs/site-lisp下， 当然你也可以通过传参数emacslispdir给make来改变目录， 或者把全部文件copy到emacs目录下。 &lt;br id="j-q4" /&gt;&lt;/p&gt;&lt;br/&gt;&lt;p id="j-q40"&gt;&lt;br id="j-q41" /&gt;&lt;/p&gt;&lt;br/&gt;可以通过在.emacs文件中加入来默认启动它。&lt;br/&gt;&lt;pre id="s9yt54" class="src"&gt;(&lt;span id="s9yt55" style="color: #a020f0"&gt;require&lt;/span&gt; '&lt;span id="s9yt56" style="color: #00008b"&gt;git&lt;/span&gt;)&lt;/pre&gt;&lt;br/&gt;&lt;h3 id="s9yt58"&gt;&lt;a title="sec3" name="sec3" id="sec3"&gt;&lt;/a&gt; Work with git.el    用git.el来工作&lt;/h3&gt;&lt;br/&gt;&lt;p id="of97" class="first"&gt;在emacs中首先都是通过执行 git-status 命令， 它会询问用户Git仓库（repository)的目录名，并且分析仓库的状态。 分析状态后， 它会创建一个 *git-status*的buffer， 这个buffer用来在文件上执行git命令。 下面的图片是这个buffer的一个示例（图片的底部是diff命令的输出）。 这个buffer内使用的是git-status-mode， 这个mode里定义了许多命令和对应的快捷键（他们有很多快捷键和PCL-CVS包的快捷键相同）。所有的命令只是在这个mode里面有效。&lt;/p&gt;&lt;br/&gt;&lt;p id="of97" class="first"&gt;&lt;br id="of970" /&gt;&lt;/p&gt;&lt;br/&gt;&lt;p id="screenshot"&gt; &lt;img src="http://xtalk.msk.su/%7Eott/common/writings/emacs-vcs/git-status.png" id="s9yt67" /&gt;&lt;/p&gt;&lt;br/&gt;&lt;br id="a-6n" /&gt;&lt;br/&gt;&lt;p id="vhdk0"&gt;用户可以在这个buffer内容过方向键来查看文件， 或者用命令 git-next-file(n或者SPC）和 git-prev-file(p键)来查看前一个文件或者后一个。 就像emacs的很多命令一样， 用户可以为他们定义数字前缀来改变命令的行为。 &lt;br id="pfj-" /&gt;&lt;/p&gt;&lt;br/&gt;&lt;p id="pfj-0"&gt;默认的， 所有的命令都在光标所在的文件上执行。 当然， 用户也可以通过选择多个文件来让命令执行在多个文件上。 选择主要通过下面的命令和快捷键来执行：m键（git-mark-file）标 记当前文件并且把光标下移一行；M键（git-mark-all）来标记buffer中的所有文件。取消标记用键u（git-unmark-file）或 者DEL键（git-unmark-file-up），两个键的区别是， 第一个键在取消标记光标所在的文件之后往下移动一样， 而后一个命令则往上移动一行。 取消当前buffer中所有的选择标记通过命令git-unmark-all（M-DEL快捷键）来实现。 你还可以通过git-toggle-all-marks（T键）来反选你现在的选择情况。 &lt;br id="vhdk1" /&gt;&lt;/p&gt;&lt;br/&gt;&lt;p id="vhdk2"&gt;&lt;br id="es9d0" /&gt;&lt;/p&gt;&lt;br/&gt;&lt;br id="a-6n0" /&gt;&lt;br/&gt;&lt;p id="vhdk4"&gt;就像在PCL-CVS中， 用户可以通过命令git-find-file（回车键或者f）来打开当前光标所在的文件。 用过v键(git-view-file）来查看文件。 如果你遇到冲突以后， 可以通过 git-resolve-file（R键）来解决冲突。 &lt;br id="vhdk5" /&gt;&lt;/p&gt;&lt;br/&gt;&lt;br id="a-6n1" /&gt;&lt;br/&gt;&lt;p id="g_wg1"&gt;你可以通过 git-add-file 命令（a键），或者 git-remove-file （r键）来像代码库里面添加或者删除一个文件。 如果有的文件你已经不需要了，却不想这个删除命令影响到代码库， 你可以把它们放在忽略文件列表中， 通过 git-ingore-file（i键）来执行。 提交代码通过 c键（git-commit-file）， 回滚（reverting）改变通过U键（git-revert-file)。 你可以通过l键（git-log-file）来查看修改日志。&lt;br id="g_wg2" /&gt;&lt;/p&gt;&lt;br/&gt;&lt;br id="a-6n2" /&gt;&lt;br/&gt;&lt;p id="lj5-"&gt;d键是和改变(diff)有关的所有命令的前缀。 他们中最重要的要数 git-diff-file 命令了， 你可以功过=或者 d = 键来调用它。 命令 git-diff-file-base(键 d b）可以用列出当前文件和仓库中的文件的不同的地方。 命令 git-diff-file-idiff （键 d e)可以用emacs中的 idiff 来互动的查看改变。 而命令git-find-file-imerge （键 d E) 允许用户以互动的方式来合并代码。 &lt;br id="ckom" /&gt;&lt;/p&gt;&lt;br/&gt;&lt;p id="ckom2"&gt;其他的命令有查看那这个分支（branch）和主分支（main branch）差别 — git-diff-file-merge-head 命令（d h)， 在文件合并之间的相关的版本 — git-diff-file-mine 命令 （d m)， 刷新git状态buffer的命令 git-refresh-status命令（g键），退出git状态buffer命令 git-status-quit (q），从列表中删除处理过的文件 git-remove-handled 命令 （x）， 详细的命令请查看这个mode的帮助（C-h m）。&lt;br id="fsep1" /&gt;&lt;/p&gt;&lt;br/&gt;&lt;br id="a-6n3" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-6064060794566582617?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/6064060794566582617/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=6064060794566582617' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/6064060794566582617'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/6064060794566582617'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/08/emacsgit_09.html' title='在emacs中使用git（翻译)'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-7175076827111586398</id><published>2008-08-01T17:24:00.000-07:00</published><updated>2010-03-05T20:28:01.661-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Emacs的日常生活（转）</title><content type='html'>&lt;p align="left"&gt;robinhOctober 15, 2003&lt;br/&gt;&lt;br/&gt;Chapter 1&lt;br/&gt;&lt;br/&gt;前言&lt;br/&gt;&lt;br/&gt;有 很多很多现成的文章介绍 Emacs 的。大致有那么两种：一种介绍说， Emacs 是一个无比强大的文本编辑器，但是不管谁用了一下都会觉得，这个文本编辑器真是难用了，所有的命令都是组合出来的怪物。甚至 Emacs 自己的帮助文档里面也说，用 Emacs 多的了用户会希望终端的输入设备加上两个脚踏板）；另一种介绍说 Emacs 是一个无比强大的 IDE ，但是对于象我们这样见过 Visual Studio 之类市面的新新人类来说，这“无比强大”大致上和“刀枪不入”是一个档次的广告。&lt;br/&gt;&lt;br/&gt;Emacs 在我的概念中到底是个什么样的呢？它是一个环境。 Emacs 可以什么都是，也可以什么都不是，因为环境本身不创造什么。 Emacs 的强大是因为前人已经在这个环境中作了很多尝试，所以你不用从头发明轮子。 Emacs的强大是因为它能够将各种软件统一到同样一个界面底下来，你就可以以相仿的方式，操作各种其实并不相仿的程序。 Emacs的最强大之处在于它本身并不强迫你接受什么，不就是个Lisp程序嘛，不满意的地方你可以改，哪怕你其实不怎么懂Lisp。&lt;br/&gt;&lt;br/&gt;以下的文字，说起来有一些混乱，因为我常常引用一些在介绍的同时并没有给出说明的概念。这又有什么关系呢？Lisp不是C++，它并不要求你在真正开始用这个概念之前就已经掌握了它的实际含义。而你真正想到用这个概念的时候，你肯定已经掌握了它。&lt;br/&gt;&lt;br/&gt;Chapter 2&lt;br/&gt;&lt;br/&gt;Emacs基础&lt;br/&gt;&lt;br/&gt;Emacs最好的入门教材，不是 Emacs 自己带的 toturial 。实际上就是这个 tutorial 给好多人非常恶劣的印象， Emacs 是一个操作复杂的变态编辑器。人性化一点的 Emacs 教材，大致有这一些：&lt;br/&gt;&lt;br/&gt;1. Sams Teach Yourself Emacs in 24 Hours ，可以从这里下载。&lt;br/&gt;2. 《如何使用Emacs编辑器》，这是已经出了中文版的了，不过不值得推荐，因为是在是太贵太陈旧了。&lt;br/&gt;&lt;br/&gt;关 于 Elisp 的入门教材是《GNU Emacs Lisp编程入门》，这本书实际上就是elisp introduction这个info文件的翻译，翻译质量不错，而且纸版的书看起来确实比较舒服。Emacs自带的有一个Elisp手册，真的就只能当手册用，全无可读性可言。&lt;br/&gt;&lt;br/&gt;使用Emacs的技巧在http://www.emacswiki.org 上有很多，常去翻翻很长见识。&lt;br/&gt;&lt;br/&gt;因 为 Emacs 是一个单线程的应用程序，所以有可能一个操作占用了太长的时间，让使用者觉得很不爽。实际上很多 Emacs 的使用者，同时都起若干个 Emacs 进程，其中一个专门做一些耗时的操作，比如收信。如果你只愿意起一个进程，并且实在不耐烦等下去，C-g可以直接将进行到一半的操作停止下来。 Emacs 里面所有作到一半的事情，只要 Emacs 没有崩溃，就可以用C-g停止掉。&lt;br/&gt;&lt;br/&gt;Emacs 对自己的描述非常完备，C-h可以带你进入 Emacs 的文档世界。常见比如：&lt;br/&gt;&lt;br/&gt;1. C-h k可以告诉你按下某一键的时候到底有什么函数被调用；&lt;br/&gt;2. C-h m可以告诉你当前的模式到底有什么特别之处；&lt;br/&gt;3. C-h f可以告诉某一个函数到底有一些什么作用。&lt;br/&gt;&lt;br/&gt;习惯这一些你会发现， Emacs 里面查帮助其实比 MSDN 还要方便。&lt;br/&gt;&lt;br/&gt;Chapter 3&lt;br/&gt;&lt;br/&gt;如何安装Emacs&lt;br/&gt;&lt;br/&gt;是 的是的，我知道你会有自己安装 Emacs 的方法。你要是 RedHat 的用户，你肯定是下载 rpm 包回来装；你要是用的 debian ，你多半是apt-get；你要是用 gentoo ，你就 emerge 一把；你要是用 Windows ，你会上网去找安装文件；你要是用BSD的，你多半就去make port了；再大不了你会用 cvs 把最新的 Emacs 代码拉回来，然后在自己的机器上重新编译。&lt;br/&gt;&lt;br/&gt;但是，这些方法只能帮助你安装 Emacs 本身。 Emacs 绝不仅仅是一个大大的tar包，或者是一个大大的安装文件能够包括的。你下回来的 Emacs ，相当于是一个Java的虚拟机，你真正面对的，是互联网上elisp资源的汪洋大海。所以我们关心的，其实是怎么安装这些零零碎碎从网络上 download 回来的资源。&lt;br/&gt;&lt;br/&gt;Emacs 的软件，一般都是一个压缩包。因为 Emacs 没有象 Python 那样完善的安装机制，所以这个安装过程一般都要看着说明文档自己一步一步来。作为一个 Emacs 平台下的软件，它总得有这样几个组成部分：&lt;br/&gt;&lt;br/&gt;1. 有部分是用 elisp 写的，不然的话没法给 Emacs 用；&lt;br/&gt;2. 可能有部分是平台相关的代码，一般都是些可执行的二进制文件或者脚本。&lt;br/&gt;3. 可能还有一些info格式的相关文档。&lt;br/&gt;&lt;br/&gt;可执行的二进制文件只要放在$PATH环境变量所包含的目录下，就可以被调用了，这和一般的程序并无区别。&lt;br/&gt;&lt;br/&gt;而 elisp写就的 Emacs 软件则稍微有一些不同。你如果想在 Emacs 里面调用一个函数，你得先有这个函数的定义；为了有这个函数的定义，你必须显式地将拥有函数定义的elisp文件载入 Emacs 环境；为了将 elisp文件正确载入 Emacs ， Emacs 会在load-path这个变量所包含的所有目录下寻找同名文件。所以，说到底，安装elisp软件的过程，就是将它拷贝到某一个 load-path目录下，并且在.emacs文件显式载入这个文件的过程。&lt;br/&gt;&lt;br/&gt;一 般FAQ上给出的建议，是将自己下回来的elisp包，放在某一个名叫 site-lisp的目录之中。这是个不错的建议，不过问题在于大多数Linux的发布版厂商，习惯把他们自己维护的一些elisp资源包也扔到 site-lisp这个目录里面去，这造成的结果就是，有一天你突然想备份自己的Emacs资源的时候，你突然发现分不清那些是自己想要的，哪些是不小心让系统装上去的垃圾。&lt;br/&gt;&lt;br/&gt;所以，建议你还是在自己的$HOME目录底下建一个专门给Emacs用的目录，名字嘛，可以就叫 emacs。$HOME/emacs这个目录里面至少可以分出两个子目录来，一个是config，我们从此就可以把所有Emacs配置的内容放到这个目录底下，并且分门别类起来；另一个叫package，里面就可以堆放各种从网络上下载回来的elisp资源。&lt;br/&gt;&lt;br/&gt;所有扔到site-lisp目录里面的elisp文件夹，在emacs起动的时候都会自动被加入load-path列表，这是site-lisp/subdirs.el的功劳。我们的package/subdirs.el也要有这个功能。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(defun my-add-subdirs-to-load-path (dir)&lt;br/&gt;(let ((default-directory (concat dir "/")))&lt;br/&gt;(setq load-path (cons dir load-path))&lt;br/&gt;(normal-top-level-add-subdirs-to-load-path)))&lt;br/&gt;&lt;br/&gt;(my-add-subdirs-to-load-path "~/emacs/packages")&lt;br/&gt;&lt;br/&gt;然后在.emacs文件中显式载入这个文件。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(load "~/emacs/packages/subdirs")&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Chapter 4&lt;br/&gt;&lt;br/&gt;让Emacs变得轻快&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Emacs最为人诟病的一点，就是它起动太慢。也难怪，光看可执行文件的尺寸，一个 emacs 差不多就是一个 vim 的5倍了，起动起来能快得了嘛。更何况大多数人都把以前用 vi 的习惯照搬到用 emacs 的情况下面来，每次要编辑一个文件的时候，就起动一个新的 Emacs 进程。您要是也习惯这种 Vi 风格，那您用 Emacs 可就得慢慢等着啦。因为 Emacs 的风格，是所有事情都在 Emacs  里面完成，包括浏览目录，打开文件。当然， Emacs 也不是完全排斥 Vi 风格，至少  Unix 环境下的 Emacs 就自带了一个叫 emacsclient 的程序，是个完全轻量级的东东，让你可以象起动 vi 那样轻松起动 emacs 。还有一个独立的程序，叫 gnuserv 的，更尽一步，支持 Windows 平台下的 Emacs ，而且功能也更多一些。反正是要用，干脆就用个好的吧。&lt;br/&gt;&lt;br/&gt;Unix下的gnuserv可以从  http://www-uk.hpl.hp.com/people/ange/gnuserv/ 下载， Windows下的gnuserv建议在  http://www.wyrdrune.com/gnuserv.html 里面找。 gnuserv的安装并不复杂，无非是将几个可执行文件放到%PATH%变量提及的地方，然后将 gnuserv.el 放到 load-path 所包含的目录中去，最后在配置文件中加入两句配置：&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(require 'gnuserv)&lt;br/&gt;(gnuserv-start)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;这是Emacs安装插件的标准做法。以下还有一些代码，是从David Vanderschel的帖子上抄来的，偶一般将其中的dv-close-client-frame绑定到C-[daily-emacs-Z-G-1.gif]上，估计也会有人喜欢绑定到C-F4上。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(defvar dv-initial-frame&lt;br/&gt;(car (frame-list))&lt;br/&gt;"Holds initial frame.")&lt;br/&gt;&lt;br/&gt;(defun dv-focus-frame (frame)&lt;br/&gt;"pop to top and give focus"&lt;br/&gt;(make-frame-visible frame)&lt;br/&gt;(raise-frame frame)&lt;br/&gt;(select-frame frame)&lt;br/&gt;(w32-focus-frame frame))&lt;br/&gt;&lt;br/&gt;(defvar dv-mail-frames ()&lt;br/&gt;"Frames created by dv-do-mailto")&lt;br/&gt;&lt;br/&gt;(defun dv-focus-initial-frame ()&lt;br/&gt;"Make the initial frame visible"&lt;br/&gt;(dv-focus-frame dv-initial-frame))&lt;br/&gt;&lt;br/&gt;(defun dv-do-mailto (arg)&lt;br/&gt;"For handling mailto URLs via gnudoit"&lt;br/&gt;(dv-focus-frame (make-frame))&lt;br/&gt;(message-mail (substring arg 7))&lt;br/&gt;(delete-other-windows)&lt;br/&gt;(setq dv-mail-frames&lt;br/&gt;(cons (selected-frame) dv-mail-frames)))&lt;br/&gt;&lt;br/&gt;(defun dv-close-client-frame ()&lt;br/&gt;"Close frame, kill client buffer."&lt;br/&gt;(interactive)&lt;br/&gt;(if (or (not (member (selected-frame) dv-mail-frames))&lt;br/&gt;(and (&amp;gt; (length (buffer-name)) 4)&lt;br/&gt;(equal (substring (buffer-name) 0 5)&lt;br/&gt;"*mail")&lt;br/&gt;(not (buffer-modified-p))))&lt;br/&gt;(kill-buffer (current-buffer)))&lt;br/&gt;(setq dv-mail-frames&lt;br/&gt;(delete (selected-frame) dv-mail-frames))&lt;br/&gt;(if (equal (selected-frame) dv-initial-frame)&lt;br/&gt;(iconify-frame)&lt;br/&gt;(delete-frame)))&lt;br/&gt;&lt;br/&gt;(defun dv-paste-to-temp ()&lt;br/&gt;"Load clipboard in a temp buffer"&lt;br/&gt;(dv-focus-frame (make-frame))&lt;br/&gt;(switch-to-buffer (generate-new-buffer "temp"))&lt;br/&gt;(clipboard-yank))&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;再如果，你和我一样是个win32底下的懒人，那么估计你还需要这个。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(defun w32-restore-frame (&amp;amp;optional arg)&lt;br/&gt;"Restore a minimized frame"&lt;br/&gt;(interactive)&lt;br/&gt;(w32-send-sys-command 61728 arg))&lt;br/&gt;(defun w32-maximize-frame (&amp;amp;optional arg)&lt;br/&gt;"Maximize the current frame"&lt;br/&gt;(interactive)&lt;br/&gt;(w32-send-sys-command 61488 arg))&lt;br/&gt;(w32-maximize-frame)&lt;br/&gt;(add-hook 'after-make-frame-functions 'w32-maximize-frame)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;这可以使得每一个新打开的frame都自动最大化。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Chapter 5&lt;br/&gt;&lt;br/&gt;安排自己的时间&lt;br/&gt;&lt;br/&gt;如果你已经是一个善于管理自己时间的人，那么Emacs的这些功能可能就全都没有必要了。不过，如果你和我一样在这个方面拎不清，Emacs 就显得很帮忙了。&lt;br/&gt;&lt;br/&gt;以下的内容加入到.emacs文件中，会有不少帮助。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(setq display-time-24hr-format t)&lt;br/&gt;(setq display-time-day-and-date t)&lt;br/&gt;(display-time)&lt;br/&gt;&lt;br/&gt;(setq todo-file-do "~/emacs/todo/do")&lt;br/&gt;(setq todo-file-done "~/emacs/todo/done")&lt;br/&gt;(setq todo-file-top "~/emacs/todo/top")&lt;br/&gt;&lt;br/&gt;(setq diary-file "~/emacs/diary")&lt;br/&gt;(setq diary-mail-addr "you@your.email.address")&lt;br/&gt;(add-hook 'diary-hook 'appt-make-list)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;将所有emacs里面用到的文件都放到~/emacs目录中去，偶觉得是个好习惯。&lt;br/&gt;&lt;br/&gt;对于大多数预期要做的事情，使用todo模式是最方便的，偶的习惯是访问do文件的时候，作一个bookmark(使用M-x bookmark-set命令)，这样以后访问起来就很方便了。bookmark是Emacs很有用的功能，偶一般就把 list-bookmark绑定到F12上去，随手就能钩着。想起什么事情的时候，随手就切到todo那边去，找一个catalog，用I命令插入一个新的entry；做完了一件事情，随手切到todo那边去，用d或者f就能把entry去掉。每个星期结束的时候，看看done文件，就会有“日子过得好充实阿”酱紫的感叹。&lt;br/&gt;&lt;br/&gt;也有的事情没有那么重要，写不成todo的。这个时候就用 appointment 。用 (setq appt-issue-message t)确认打开了约会提醒功能，然后用appt-add命令就可以加入新的约会提醒。比如在电话里和mm吵架了，挂了电话以后，在 Emacs 里面使用M-x appt-add命令加一条记录，估计一下半个小时以后，给mm打个电话赔礼道歉。半个小时以后， Emacs 就会跳出一个小框来提醒说，该打电话了。当然，如果半个小时之内，mm主动打电话回来修好，那就用 M-x appt-delete命令删掉提醒好了。&lt;br/&gt;&lt;br/&gt;对于那些周期性比较长的事情，可以用diary。我刚开始用diary的时候，以为diary是用来帮助写日记的，所以试了一下觉得好难用阿。仔细看看，发现diary其实是用来做行程管理的。&lt;br/&gt;&lt;br/&gt;单独用 diary 没什么意思的，所以info里面 diary 也是和 calendar 放在一起的。偶把 calendar 绑定到F8上 (global-set-key [(control f8)] 'calendar)。启动calendar会出现一个小窗口，显示当前日历。calendar 模式底下命令很多，但是常用的就那么几个，.命令可以跳回当今天，o命令可以跳到某一个月。g系列命令表示goto，可以跳到指定的某一天，g d 是跳到某年某月某日，g c是跳到某年某星期的星期几，g C可以跳到阴历的某一天。p系列命令表示print，可以按照某格式显示当前日期，比如p C就可以显示当前的阴历日期。偶们现在比较关心的是i系列命令，i d是加入当前这一天的行程安排，d表示的是day，显然依此类推还有m，y，w。&lt;br/&gt;&lt;br/&gt;比如mm打个电话来说，星期天要陪她去颐和园。用Emacs记一下吧，免得忘了。打开calendar，跳到星期天上面，i d，陪mm去颐和园。又比如老板说，以后每个星期一都给我交一份报告上来，打开calendar，跳到某个星期一上面，i w，交报告给老板。还有一个常用的，比如mm生日是 9/29，打开calendar，跳到9/29，i a，a代表anniversary，mm生日。养成用diary的习惯以后，经常性的打开calendar，跳到某一天，按一下d，就可以看那一天有哪些安排了。相比之下，h命令对偶来说就很垃圾。&lt;br/&gt;&lt;br/&gt;diary文件里面可以写一些更详细的内容，比如直接把一个约会提醒写到diary里面，偶觉得这个不是很方便。diary文件不过是一个纯文本，有什么不满意的话，可以直接去修改，记得打开diary文件的时候，切回基本模式，不然很多东西是看不到啦。&lt;br/&gt;&lt;br/&gt;有的更完整一些的模式，比如plan模式，需要额外从网上下载，可以将作出的plan转换成pp的个人主页。不过我是不会用的啦。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Chapter 6&lt;br/&gt;&lt;br/&gt;用Emacs写东西&lt;br/&gt;&lt;br/&gt;虽然写程序也叫做写东西，可是我们现在要讨论的不是它。我们大部分的时间里写的，是拿到bbs上灌的，是留到以后查的。Emacs有一些不错的特点，可以方便上面说的这些事情。&lt;br/&gt;&lt;br/&gt;大部分的时间里，我们要写的文章写成TEX挺困难，因为不是那么有条理；但是直接当纯文本处理，似乎又太没有条理。这种时候，用Emacs 的outline-mode就很合适。outline模式最大的好处是简单：只要在行首放上几个星号“*”，就可以表达文章的条理关系。比如，看《爱丽丝漫游奇境》是做一点摘录，先打开一个新文件C-x C-f；然后打开outline模式M-x outline-mode；再然后呢，第一章的内容，先来一个*吧，写上第一章的题目；第一章的写完了，C-c C-c就可以把前面写的内容都折起来，只留下一个标题，看起来很是清爽。过一段时间想起来翻查的时候，C-x C-f打开文件，还是进入outline-mode，C-c C-o就把所有内容都折起来了，只留下标题，文件里面到底有些什么内容，也都一目了然了。&lt;br/&gt;&lt;br/&gt;这样做有一个缺点，就是很容易把所有内容都堆到同一个文件里面，眼看着文件越来越大，很容易就要上兆了。不过Emacs是支持直接编辑压缩文件的，用auto-compression-mode就可以。&lt;br/&gt;&lt;br/&gt;另外一个经常让人头疼的问题，就是文章的排版。特别是要拿到bbs 上贴的文章，bbs虽然号称支持自动换行，但是那也只是个聊胜于无的东西，要想给人看，还是得手动换行才行。Emacs可以把一句长长的话自动分成若干行，而且这个效果一般都很让人满意。只要把point移动到需要重新整理的段落之中，M-q，就可以完成排版的工作。如果这样还嫌麻烦，那么做成宏也是个不错的注意。如果文章是自己在写，那么打开 auto-fill-mode，是个不错的注意。auto-fill模式可以在写的同时，帮你做换行的工作。&lt;br/&gt;&lt;br/&gt;如果写的东西大部分是英文的，还可以考虑打开flyspell-mode。不过这个东西需要后面有ispell支持。win32底下有一个native的ispell v4，不过用起来挺不爽的：v4是一个已经放弃的版本，这是一；和现有的其他模式搭配也不愉快，这是二。v3里面现成的win32版本有两个，建议装一个 cygwin。 另外也有一个win32 native的，可以从 http://www.fsci.fuk.kindai.ac.jp/ kakuto/win32-ptex/web2c75-e.html 找到，日本人做的，我也没有试过。打开flyspell-mode之后，写东西的过程当中，ispell认为写错了的单词，就会自动高亮，很是显眼。 M-$可以让Emacs提示你写错的单词到底应该怎么拼。win32的Emacs 21还没支持 tooltip，所以有些看起来很炫的功能不能用。不过偶觉得就上面说的几种模式，一般过日子也就足够了。&lt;br/&gt;&lt;br/&gt;尝试过 wiki 的同学，也可以试用一下 Emacs 下的 wiki 模式，不过偶以为 wiki 模式不适合给说中文的人用。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Chapter 7&lt;br/&gt;&lt;br/&gt;管理自己的地盘&lt;br/&gt;&lt;br/&gt;我习惯没事情干的时候，就逛自己的硬盘。相信很多人有和我类似的毛病，上网的时候看到好的文章就存下来，时间一长，硬盘的各个角落里面就堆满了各种各样的html，txt文件。只能常常抽空遍历一下自己的目录，看看又多了一些什么东西。这件事情用cmd.exe可以做，用资源管理器也能做，不行话还有wincmd，totalcmd之类的软件。当然用惯命令行的还是觉得用sh.exe最好。&lt;br/&gt;&lt;br/&gt;Emacs既然是个八卦，就会八卦到底，它至少提供了另外两种选择， eshell 和 dired 。&lt;br/&gt;&lt;br/&gt;eshell 看起来就很象一个 shell 了，不过拿它就做一个 shell 那也太委屈它了， eshell 带的 pcomplete 自动补全功能比 bash 之类的shell，还是有差距的。但是eshell的特长在于，可以直接使用 emacs lisp 的函数做命令。比如偶比较喜欢的 (defalias 'vi 'find-file) （前提是系统里面没有vi的可执行文件），这样在eshell里面，vi一个文件，就会弹出一个新的 emacs buffer 。充分发挥想象力吧。唯一要注意的是， eshell 里面不能用C-c取消一个输入了一半的命令，我的做法一般是C-a C-k，其实也不太麻烦的。&lt;br/&gt;&lt;br/&gt;说到自动补全，不知道什么时候开始，突然发现几乎所有的shell，所有的编辑器都支持用tab来做自动补全了。Emacs当然也可以这样设定，不过有的时候，我们还是会怀念用tab来indent，不是吗？用这样一个函数吧：&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(defun my-indent-or-complete ()&lt;br/&gt;"如果在词尾，那就hippie-expand，否则就indent"&lt;br/&gt;(interactive)&lt;br/&gt;(if (looking-at "&amp;gt;")&lt;br/&gt;(hippie-expand nil)&lt;br/&gt;(indent-for-tab-command)&lt;br/&gt;))&lt;br/&gt;(global-set-key [(tab)] 'my-indent-or-complete)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;hippie-expand虽然已经很不错了，不过我们可以让它更强一点的，&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(autoload 'senator-try-expand-semantic "senator")&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;然后再&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(setq hippie-expand-try-functions-list&lt;br/&gt;'(&lt;br/&gt;senator-try-expand-semantic&lt;br/&gt;try-expand-dabbrev&lt;br/&gt;;;........&lt;br/&gt;))&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;当然前提是要装一个semantic，这个以后再说。&lt;br/&gt;&lt;br/&gt;Dired看起来就更象一个wincmd。常用的命令也就是v（查看），e （编辑），d（标记删除），x（执行删除）。以前一度，我喜欢再dired里面做el文件的byte compile，只要在需要compile的文件上面按B就可以了，不过现在发现，那样还不如用这样一行命令合算：&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(byte-recompile-directory "/path/to/somewhere" 0 t)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;自动重新编译一个目录下面所有的el文件。Emacs和python不一样， elc 和el执行速度会差的很多，mule-ucs就是一个典型，编译之前启动一次要半分钟，编译之后启动就是一眨眼的事情了。当然编译也是一个很费时的事情。真是的。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Chapter 8&lt;br/&gt;&lt;br/&gt;用Emacs写程序&lt;br/&gt;&lt;br/&gt;Emacs号称是一个强大的IDE，可是往往被人误解。甚至常常有人以为，让VS.net的热键设置和Emacs一样，VS.net就算可以模仿Emacs了，这个基本上是比天只小一点点的笑话。&lt;br/&gt;&lt;br/&gt;还是从写还是吧。&lt;br/&gt;&lt;br/&gt;基本上那些常见的编程语言，Emacs都有支持。我们现在说的支持，基本上就限于有一种对应于这种语言的major mode。最常见的就是cc-mode了，甚至还专门拿出来，在sourceforge上做了一个项目的说。cc-mode可以不错的支持各种语法上有些类似c的语言，甚至于idl。&lt;br/&gt;&lt;br/&gt;不过， cc-mode 不支持c Sharp 。 google 上能搜到一些给 Emacs 用的 c sharp major mode ，我觉得 http://davh.dk/script上的那个不错；别的大都需要对 Emacs 自带的 cc-mode 做替换，让人觉得很不爽。前面提到的那个，在 Emacs 21.3.xx上可能需要作一点小的修改，大概621行左右的位置， (c-common-init)改成(c-common-init 'c-mode) ，大致如此。&lt;br/&gt;&lt;br/&gt;Python mode需要到http://www.python.org上去下载。&lt;br/&gt;&lt;br/&gt;有了这些以后，基本上不愁写程序的时候的语法加亮的问题了。（其实本来也没什么好愁的，毕竟这是最基本的要求）。&lt;br/&gt;&lt;br/&gt;有人偏爱ue那样，把当前行高亮的样子，那就先打开M-x hl-line-mode。&lt;br/&gt;&lt;br/&gt;有人看到 ThisIsASimpleVarInJava 就觉得郁闷，那就打开 M-x glasses-mode 。&lt;br/&gt;&lt;br/&gt;关于补全，上次提到过，hippie-expand加上semantic是现在最好的选择了。dabbrev-expand完全不懂语义的，常常给扩展出一些莫名其妙的内容来，semantic就不一样了。它至少是懂的语义的，expand的结果看起来就合理的多，有的时候甚至能够认出某一个变量的类型来，让我激动了老半天，当然，只是有时候阿。semantic可以从 http://sf.net/projects/cedet上下载。别的还有一些东西，比如jde或者ecb都是建立在semantic的基础上的，写java的话，也可以用jde，比elipse之类当然是要轻的多了。ecb偶没用过。 http://www.xref-tech.com上的xref 支持更出色，不过那就不是自由软件的范畴了。&lt;br/&gt;&lt;br/&gt;关于宏，c语言最麻烦的可能是宏了。常常是面对嵌套了若干层的宏，看不出一个所以然来。 这个时候，可以直接用C-c C-e，对已经选定的区域做预处理，预处理的结果会显是在另外的buffer里面。这项工作缺省使用cpp来做，不过只要编译器支持从标注输入读入代码，好像都可以正常工作。另外有一些简单的宏，比如用来做平台选择的，直接用 hide-ifdef-mode就可以摆平，都免去了调用预处理器的麻烦。&lt;br/&gt;&lt;br/&gt;关于代码隐藏，其实偶一般只用一个C-c @ C-c，hs-troggle-hiding。基本上能够满足要求了。 不过用之前记得先打开M-x hs-minor-mode。&lt;br/&gt;&lt;br/&gt;关于文件，有一个很方便的命令。取个名字叫my-find-related-file。这个命令可以打开当前.c文件中所有include了的文件。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(defun my-find-related-file ()&lt;br/&gt;"Find all related files in this buffer"&lt;br/&gt;(interactive)&lt;br/&gt;(save-excursion&lt;br/&gt;(let ((my-buffer (current-buffer)))&lt;br/&gt;(goto-char (point-min))&lt;br/&gt;(while (search-forward-regexp " *# *include" (point-max) t)&lt;br/&gt;(progn&lt;br/&gt;(ff-find-other-file)&lt;br/&gt;(switch-to-buffer my-buffer)&lt;br/&gt;)))))&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;还有就是注意，ff-search-directories早一点设定，用过一次ff函数以后，再setq就晚了。 ;-) 以上。&lt;br/&gt;&lt;br/&gt;关于查看帮助，有的选的有info和woman。woman可以用来看man能查到的帮助。一般可以把下面这点代码绑定到f1上。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(global-set-key [(f1)] (lambda()&lt;br/&gt;(interactive)&lt;br/&gt;(let ((woman-topic-at-point t))&lt;br/&gt;(woman))))&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;也可以用C-h C-i在info里面查看函数。这些都很简单了。如果你还不满足，那就直接google吧，可以考虑利用browser-url。 ;-)&lt;br/&gt;&lt;br/&gt;关于自动排版。自动排版算是一个比较重要的功能，特别是对于那些版式和程序结构没有影响的语言，让代码的排版比较迎合个人的喜好，这个不过分吧。对于整个文件做重排，一般要C-x h选定整个buffer，然后 C-M-[daily-emacs-Z-G-2.gif]重新排版。 这个一般比较耗时间，如果代码文件确实很长的话。折中的做法是在一个代码端开始的地方，就是{处，用C-c C-q，酱紫可以排版一个代码段。排版的风格可以用c-set-style来设定，偶一般用 stroustrup，表达偶对他的仰慕。如果对于具体的某一个设置不满意，可以在不满意的地方用C-c C-s看一下，这里缩进的设置是取决于什么的；然后可以用C-c C-o修改之。&lt;br/&gt;&lt;br/&gt;关于移动。程序代码里面移动来移动去，也是一个问题。最直接的办法当然是用鼠标了。不过各种模式里面一般也都会对常见的移动键位做修订，可以自己试一试，找出比较常用的键来。几乎所有的模式都会支持以函数定义为单位移动，这个一般都很好用。&lt;br/&gt;&lt;br/&gt;关于tag，Emacs附带的etags可以用来生成TAGS文件。在某个源文件中 M-.，Emacs会询问访问哪一个TAGS文件，这个基本上和vi差不多。更强悍一点的是ebrowser，生成一个BROWSER文件，只要find-file这个文件，就会进入ebrowser的模式，有一点类似于cscope。speedbar在这个时候可以来帮忙，试试看就知道了，不过好不好使就完全是一个见仁见智的问题。上次说到的ecb（sf.net/projects/ecb），也着眼于解决这一类问题，有兴趣试试？&lt;br/&gt;&lt;br/&gt;关于grep，Emacs自己没有grep功能（ft）。不过好在grep这个东西不管哪个平台都有，win32底下叫做findstr（ft again）。可以尝试一下 grep，grep-find。 前者是直接把参数传递给grep的，后者是把参数传递给find + grep，两者都会在当前buffer对应文件所在的目录下面进行。反正和直接在console下面玩没什么两样的。&lt;br/&gt;&lt;br/&gt;关于diff，ediff模式很不错的。比较爽的做法是在eshell里面用。 ediff a.c.orig a.c。 特别注意的是，ediff的session控制区是一个小窗口，那个小窗口关掉，就算是退出ediff了哦。ediff可以忽略空格的。对应的epatch较之直接用patch的优点就在于，patch完了以后就直接进入 ediff模式，什么地方做了改动一目了然。&lt;br/&gt;&lt;br/&gt;关于注释，虽然最简单的做法是用C-c C-c注释掉整块已经选定的区域，但是这种做法不一定是最好的。如果是想将暂时不需要的代码抹掉，还是用#if 0/#endif比较合适，因为我一般用flyspell-prog-mode来检查注释里面有没有单词拼写错误。如果你不想看到代码里面被指出很多拼写错误来，那还是不要滥用C-c C-c的好。&lt;br/&gt;&lt;br/&gt;xref 是一个用起来挺不错得 refactory 包，它也可以用来完成大多数例如 symbol 补全一类得工作。唯一让人觉得有点不爽的是，它是一个版权软件，是需要 license 的。 当然，它也提供了免费试用版本下载的；同时也提供了源代码下载，你也可以试着用xref重构它自己的代码。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Chapter 9&lt;br/&gt;&lt;br/&gt;编译你的程序&lt;br/&gt;&lt;br/&gt;如果Emacs只能拿来写东西，那是不够的。至少，因为Emacs可以通过 M-!直接运行外部程序，所以理论上我们是可以在Emacs里面做一切事情的。嗯，理论上。&lt;br/&gt;&lt;br/&gt;写了一点代码以后就会急急忙忙的去考虑该编译一下了。 M-x compile 就可以了。 compile 缺省命令是make -k， Emacs 会在 minibuffer 里面跳出来问，compile的命令到底应该用什么呢？如果把 compilation-read-command 设成nil，它就不会那么罗嗦了。compile使用的命令是由 compile-command ，这个变量可以自己调整。有的IDE习惯每次文件存盘的时候就会做一次编译，比如 eclipse ；如果你也有这样的偏好的话，可以吧 compile 命令放到 after-save-hook 里面去。&lt;br/&gt;&lt;br/&gt;编译一切顺利那当然很好了，不过一般都不会是酱紫的。这个时候用 C-x `就可以跳到错误地点。 Emacs是通过对错误信息做正则匹配来找相关信息的，所以让Emacs支持特定某一个编译器是比较容易的。比如为了让 Emacs支持csc，就是csharp的compile，我们只需要：&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(setq compilation-error-regexp-alist&lt;br/&gt;(append&lt;br/&gt;;;; tt.cs(5,14): error CS1585: Member modifier 'static' must precede the member type and name&lt;br/&gt;(cons '("(.*)(([0-9]+),([0-9]+)): (error|warning) CS[0-9]+:" 1 2 3) ())&lt;br/&gt;compilation-error-regexp-alist&lt;br/&gt;)&lt;br/&gt;)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;注意到其中的1，2，3；分别表示的是文件名，行号，列号。&lt;br/&gt;&lt;br/&gt;Compile命令的扩展能力几乎是不受约束的，想得到的，就能支持的到。偶的想象能力比较贫乏，这里留白给更有研究精神的人来补全吧。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Chapter 10&lt;br/&gt;&lt;br/&gt;电子邮件&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;10.1 收邮件，发邮件&lt;br/&gt;&lt;br/&gt;邮件系统很早就在Emacs里面占有重要地位了。从最早的 rmail 到 vm 到 gnus ，各种各样的 mail mode ，乱花迷人眼。VM似乎是界面最友好的了，还记得第一次用 xemacs 的时候，那还是4年前，VM就已经支持很好看的图标按钮了。虽然如此，我当时对 xemacs 是如此白痴，还是没法把VM好好的用起来。&lt;br/&gt;&lt;br/&gt;不过我转回到Emacs收信也是最近的事情了。要知道能让我从becky转过来，这个诱惑一定要不一般才可以。&lt;br/&gt;&lt;br/&gt;gnus就提供了这样的诱惑。这个号称世界上最好的news客户端，也能作一个世界上最好的maillist客户端。如果你不上news，不混maillist，那么gnus的强大对你来说并没有意义，不如早点放弃吧。hehe&lt;br/&gt;&lt;br/&gt;设置用gnus收信，或者发信，其实是很容易的。gnus支持多个pop3服务器， Emacs 支持smtp发信认证（需要升级你的 Emacs lisp 部分，21.3.1的还没包括这部分的内容），如果你希望 pop3 收信的时候不删除服务器上的邮件，Emacs现在还不行，你要自己动手去安装一个 epop3.el 的扩展。偶没用装过，因为偶没有这样的需求。在开始M-x gnus之前，记得在.emacs文件里面添上一些东西：&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(require 'gnus-load)&lt;br/&gt;(setq gnus-startup-file "~/emacs/config/newsrc")&lt;br/&gt;(setq gnus-init-file "~/emacs/config/gnus-config")&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;把gnus-config从.emacs中分出来的做法比较清楚，因为你以后会经常有改gnus-config的需要的。在gnus-config中需要加上这些内容：&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(setq gnus-select-method '(nnfolder ""))&lt;br/&gt;(setq gnus-secondary-select-methods '((nntp "news.gnus.org")))&lt;br/&gt;(add-to-list 'gnus-secondary-select-methods '(nntp "perl.org" (nntp-address "nntp.perl.org")))&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;上面的第一行指明的是gnus对邮件使用的backend，偶觉得nnfloder比较好，你可以先这样用着，反正backend以后还是可以换的，等你熟悉了 gnus以后。然后就可以给secondary-select-methods加各色的news服务器了，&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(setq mail-sources '(&lt;br/&gt;(pop :server "263.net" :user "huxwcn" :password "pighead")&lt;br/&gt;(pop :server "knight.6test.edu.cn" :user "huxw" :password "pighead")&lt;br/&gt;))&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;然后设置 backend 去哪里收信，除了 pop3 ，还支持 imap ，或者本地的 maildir 之类的冬冬，以此类推，还能加很多。还有就是希望你不会naive 的以为上面的密码是真的。&lt;br/&gt;&lt;br/&gt;最后，就是发信的设置。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(setq smtpmail-auth-credentials '(("smtp.263.net" 25 "huxwcn" nil)))&lt;br/&gt;(setq smtpmail-smtp-server "smtp.263.net")&lt;br/&gt;(setq user-full-name "Robin Hu")&lt;br/&gt;(setq user-mail-address "huxw@knight.6test.edu.cn")&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;前两行是说发信服务器的位置，后两行是给收信人看的。人家回信就会回到那个user-mail-address 上去。以后会看到这种东西都可以很灵活的修改。&lt;br/&gt;&lt;br/&gt;这些都搞定的时候，你就可以尝试开始gnus之旅了。我最后offer一点不好的消息，你要是觉得不爽的话，现在停止尝试gnus还来得及。因为 Emacs不是一个多线程的程序，而gnus也没有打算和别的程序合作，你打开 gnus的时候，Emacs的所有frame都会失去相应一段时间，时间的长短视 gnus把所有的邮件收回来需要的时间而定；如果你在家慢慢拨号的话，而且信有很多的话，这段时间可能会长达15分钟。事实上，news.gnus.org里面的同学似乎都是开了两个Emacs的，一个专门起gnus，另一个干活，酱紫。&lt;br/&gt;&lt;br/&gt;好了，如果你连这个也不在乎的话，那就开始吧。M-x gnus。你会什么也看不见。这是因为gnus缺省以为，你收的邮件，都是属于某一个列表的，就好像bbs上的版面一样，你不订阅，就什么也看不见。订阅很容易，用^可以进入*Server Buffer*，在nnfolder上按RET，看到mail.misc以后按u就可以订阅它。 缺省所有没有分类的邮件都会跑到mail.misc里面去。你以后在慢慢改吧。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;10.2 删除邮件&lt;br/&gt;&lt;br/&gt;如何删除邮件，是GNUS的一个特点。&lt;br/&gt;&lt;br/&gt;我们上bbs的时候，帖子怎么处理，不是我们说了算的，而是版主说了算了的。换句话说，帖子的生命周期是不受你掌握的，如果你想保存某一封帖子，你得把它下载到你自己的硬盘上去。gnus认为邮件也是酱紫的。在gnus里面，主动删除邮件是不提倡的，你应该让gnus自己处理邮件，被称为过期（expire）。&lt;br/&gt;&lt;br/&gt;在缺省的设置中，你可以在一封邮件上按E，告诉gnus，这封邮件，过期了。 但是过期并不等同于删除，gnus会将这封邮件放入expire的队列中，然后等待一个特定的时间，差不多就是你真的已经忘了这封邮件的时候，gnus悄悄的删除了它。&lt;br/&gt;&lt;br/&gt;你也可以采用auto expire模式，gnus会认为，所有你“读”过的信都是过期的，于是那些信都悄悄的自动进了过期队列，等着被删除。你还可以采用total expire模式，gnus会认为，所有你“标记为读”的信，都是过期的，于是那些信也都悄悄的进了过期队列，等着被删除。&lt;br/&gt;&lt;br/&gt;这样的做法看起来比较诡异，但是处理邮件列表的时候却让人觉得非常自然。 所有看过就忘的信，不用去管什么时候要删除它，而且这些信在被删除之前，不会主动跳出来骚扰你；如果看到列表中某一个thread，记不起来之前这个thread到底是怎么样的，可以把这个thread没有真正删除的邮件都翻出来，显示一个完整的thread。相当于说，你总能在本地保留这个maillist最近若干天的snapshot。&lt;br/&gt;&lt;br/&gt;对于其他信件，处理也是一样的。除非是mm发给你的一万年都不能删除的信件，别的信都可以让它自己悄悄跑进过期队列，悄悄消失。你甚至可以改变那些过期邮件的去向，不删除他们，而是把他们按时期打个包，已备若干年后写回忆录用(joking)。如果你万分肯定，这封信必须当即删除，比如不能给mm看到的别人写给你的情书，那就B del，不过这个情况很少很少，而且会导致gnus一些诡异的行为，以后再说。&lt;br/&gt;&lt;br/&gt;罗里罗嗦了很多。expire具体的设置，都和邮件的分类联系在一起，下次再说吧，手累了。 ;-(&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;10.3 邮件分类&lt;br/&gt;&lt;br/&gt;收到很多信的时候，需要分一下类。所有能用的mail客户端都支持对收到的mail做分类，包括gnus。在gnus当中，你可以通过指定的规则，将某一些邮件归成一类；在gnus看来，这样的一类邮件，基本上等同于news 服务器上的一个讨论组。&lt;br/&gt;&lt;br/&gt;给邮件分组的工作，是通过设置nnmail-split-methods来实现的。 gnus里面所有的设置名字都很长，容易敲错，一个简单的判别方法，是在变量上面C-h v看看有没有文档。 有文档的至少能够说明这个变量名没有敲错。&lt;br/&gt;&lt;br/&gt;我推荐使用nnmail-split-fancy来实现邮件分类，因为从个人经验来看，用fancy分类，至少可以把判别规则写的好看一点。这里先给一个sample。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(setq nnmail-split-fancy&lt;br/&gt;'(|&lt;br/&gt;;;      (: gnus-group-split-fancy)&lt;br/&gt;(any ".*-?current@(freebsd|FreeBSD).org" "maillist.freebsd.current")&lt;br/&gt;(any ".*-?ipfw@(freebsd|FreeBSD).org" "maillist.freebsd.ipfw")&lt;br/&gt;(any "emacs-devel@gnu.org" "maillist.emacs.emacs-devel")&lt;br/&gt;"mail.misc"))&lt;br/&gt;(setq nnmail-split-methods 'nnmail-split-fancy)&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;其实就是一些正则表达式。需要注意的是，如果将 nnmail-crosspost设置为nil，那么就不会出现“一稿多投”的情况，也就是说一封邮件在这些判别规则上遇到符合的就会直接break了。还有就是不建议在这里用太复杂的正则表达式，偶曾经试图在一行里面对所有 freebsd的邮件列表进行分类，结果死的挺难看的。&lt;br/&gt;&lt;br/&gt;一旦邮件分类了。你应该也期望对不同类别的邮件作出区别对待。林林总总的需要都可以通过设置group parameter完成。对group parameter 的设置可以在gnus里面完成，使用G p或者G c：前者是字符界面的，后者是能跳出一个类似于cunstomize的界面来。也可以通过setq gnus-parameters，在.gnus文件里面手工设定。典型的例子比如：&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;(setq gnus-parameters ;;别写错了名字&lt;br/&gt;'(&lt;br/&gt;("maillist.freebsd.(.*)$"&lt;br/&gt;(to-list . "1@freebsd.org")&lt;br/&gt;(posting-style&lt;br/&gt;(name "Me me me")&lt;br/&gt;(address "me2@whoami.com")&lt;br/&gt;(signature "Smile and Retain Smile.")) ;;签名档也可以是文件&lt;br/&gt;(total-expire . t)&lt;br/&gt;(expiry-wait . 7)&lt;br/&gt;(broken-reply-to . t)&lt;br/&gt;(subscribed . t))&lt;br/&gt;))&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;注意，这里也可以用正则表达式哦 ;-)&lt;br/&gt;&lt;br/&gt;group parameter 中的 to-list ，可以被自动收集起来；酱紫如果你在 nnmail-split-fancy 里面用 gnus-group-split-fancy 来自动分类，免去自己重写一遍分类规则的麻烦。不过设置gnus-parameters，是没办法利用这种能力。&lt;br/&gt;&lt;br/&gt;设置好了 group parameter 能够简化很多事情。比如现在在 freebsd 的某个list里面按一下a，收件人地址就自动设成to-list了。很多时候比 bbdb还要方便的多。&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;10.4 SCORING&lt;br/&gt;&lt;br/&gt;&lt;br/&gt;Chapter 11&lt;br/&gt;&lt;br/&gt;支持中文&lt;br/&gt;&lt;br/&gt;何曾几时，中文支持是Emacs的强项。在Emacs里面开一个shell上水木几乎是我唯一的选择。 时代变了，Emacs的中文支持就渐渐的落后了。&lt;br/&gt;&lt;br/&gt;Emacs内部有一套表示多国的方法，就是所谓的emacs-mule。我们能够在同一个emacs buffer里面能够同时看中日韩文字，能够同时看到阿拉伯文，能够同时看到德文，丹麦文；这都拜emacs-mule所赐。不幸的是 emacs-mule并没有成为事实上的编码标准。emacs-mule除了emacs自己能够认识以外，其他的编辑器都不支持。所以Emacs必须在和其他文本处理器交互的时候重新编码内部的emacs-mule。这里没有必要谈太多的细节， Emacs是一个self-document的编辑器，上面这些细节都可以在 coding.[ch]和charset.[ch]中找到。&lt;br/&gt;&lt;br/&gt;为了能和键盘交互（可以认为键盘是一个文本处理器，Emacs从键盘中读入文本），Emacs将从键盘中读入的文本“解码”为emacs-mule（我们这里说到编码解码，都是从Emacs的角度来看），为了文件能被其他的文本编辑器打开，比如vi，Emacs在存盘的时候将emacs-mule编码为 chinese-iso-8bit。这就是我们平常用到的各种coding system起到的作用。&lt;br/&gt;&lt;br/&gt;为了让Emacs支持gbk，我们需要做的，就是让所有的gbk编码字符，都能够在emacs-mule中找到自己的座位。虽然实际上emacs-mule里面所有的座位都已经被人坐满了，我们还是可以假设那些很少有人出现的座位依然是空的。前面给出的chinese-gbk就强占了cns11643-5, 6, 7的座位。这些座位的汉字几乎不可能出现在我们这些人的屏幕上，所以这种做法基本上是可行的。所以如果有一天，你在使用chinese-gbk的时候，又试图用 cns11643的编码来保存，还请你回到这里来想想可能会发生的事情。&lt;br/&gt;&lt;br/&gt;因为Emacs已经开始支持unicode了，所以让utf-8或者utf-16编码的 gbk汉字的文件在Emacs中显示并不是麻烦。而且Emacs已经在这里预留了 hook，只需要给一个 translate-table ，那就一切ok了。&lt;br/&gt;&lt;br/&gt;让 Emacs 支持从X拷贝过来的gbk汉字，很难直接在 lisp 代码中实现。因为X和 emacs 一样是个历史悠久的软件，所以它同样也有一套自己的多字节编码格式。在 Emacs 中，缺省是采用 compound-text-with-extension 来处理这种编码格式的。从作者当初开发的思路来看，我们让它支持gbk编码，只需要添加一项 ("GBK-0" . chinese-gbk) 到 non-standard-icccm-encodings-alist中去，就可以简单的扩展支持gbk编码了。然而，因为实现上bug，和X本身的问题，这终究只是一个美好的愿望。如果你坚持的话，可以尝试一下这个补丁。注意这个时候就不能再使用 compound-text-with-extensions 作为 selection 的 coding system 了，而应该用chinese-gbk。&lt;br/&gt;&lt;br/&gt;--- /home/huxw/src/Resp/emacs/src/xselect.c     2003-04-07 04:35:06.000000000 +0800&lt;br/&gt;+++ xselect.c   2003-05-26 11:17:42.966829744 +0800&lt;br/&gt;@@ -1496,6 +1496,11 @@&lt;br/&gt;Lisp_Object target_type;  /* for error messages only */&lt;br/&gt;Atom selection_atom;      /* for error messages only */&lt;br/&gt;{&lt;br/&gt;+       // by huxw start here&lt;br/&gt;+       XTextProperty text_prop;&lt;br/&gt;+       char** local_list;&lt;br/&gt;+       int local_number = 0;&lt;br/&gt;+       // by huxw end here&lt;br/&gt;Atom actual_type;&lt;br/&gt;int actual_format;&lt;br/&gt;unsigned long actual_size;&lt;br/&gt;@@ -1554,12 +1559,70 @@&lt;br/&gt;&lt;br/&gt;/* It's been read.  Now convert it to a lisp object in some semi-rational&lt;br/&gt;manner.  */&lt;br/&gt;+  //by huxw start here&lt;br/&gt;+  if (XSupportsLocale()) {&lt;br/&gt;+         int local_status;&lt;br/&gt;+&lt;br/&gt;+         text_prop.value = (char*)data;&lt;br/&gt;+         text_prop.encoding = actual_type;&lt;br/&gt;+         text_prop.format = actual_format;&lt;br/&gt;+         text_prop.nitems = actual_size;&lt;br/&gt;+&lt;br/&gt;+         local_status = XmbTextPropertyToTextList(display, &amp;amp;text_prop, &amp;amp;local_list, &amp;amp;local_number);&lt;br/&gt;+         if (local_status &amp;lt; Success || !local_number || !*local_list ) {&lt;br/&gt;+         } else {&lt;br/&gt;+                 xfree((char*)data);&lt;br/&gt;+                 data = strdup(*local_list);&lt;br/&gt;+                 XFreeStringList(local_list);&lt;br/&gt;+         }&lt;br/&gt;+  } else {&lt;br/&gt;+  }&lt;br/&gt;+  //by huxw end here&lt;br/&gt;+&lt;br/&gt;+#if 0&lt;br/&gt;val = selection_data_to_lisp_data (display, data, bytes,&lt;br/&gt;actual_type, actual_format);&lt;br/&gt;+#else&lt;br/&gt;+       val = selection_data_to_lisp_data (display, data, strlen(data), actual_type, actual_format);&lt;br/&gt;+#endif&lt;br/&gt;&lt;br/&gt;/* Use xfree, not XFree, because x_get_window_property&lt;br/&gt;calls xmalloc itself.  */&lt;br/&gt;-  xfree ((char *) data);&lt;br/&gt;+&lt;br/&gt;+  // by huxw start here&lt;br/&gt;+//  xfree ((char *) data);&lt;br/&gt;+  if (local_number == 0) { // Xmb is not used or not successed&lt;br/&gt;+         xfree((char*)data);&lt;br/&gt;+  } else {&lt;br/&gt;+         free(data);&lt;br/&gt;+  }&lt;br/&gt;+  // by huxw end here&lt;br/&gt;return val;&lt;br/&gt;}Windows的国际化一向做的很好，可是Emacs没有打算依赖它。在 Windows里面跑的Emacs看起来很像在X里面跑的Emacs，很像，还是有一些要注意的地方。&lt;br/&gt;&lt;br/&gt;Windows 里只定义了 GB2312_CHARSET ，这把Emacs搞糊涂了。如果在 Emacs里面列出可用的所有字体，会发现没有字体是以gbk结尾的，这也使得Emacs无法处理所有gbk编码的汉字，只能显示一个方框代替。处理方法一样简单，只要把 ("gbk" w32-charset-gb2312 . 936) 加到  w32-charset-info-alist 中去就可以了。另外一个问题是Emacs有时无法正确处理字体名称中的中文编码，这种时候很是少见，找出问题之前，绕开就是了。&lt;br/&gt;&lt;br/&gt;Windows下的粘贴拷贝并没有额外的编码，所以把  clipboard-coding-system 设成 chinese-gbk 就可以了，没有X底下的困扰。&lt;br/&gt;&lt;br/&gt;Emacs的中文支持虽然看起很繁琐，但是它却是最完善的。比如我们知道动感超人的口号是“啊哈[daily-emacs-Z-G-3.gif]{6,8[daily-emacs-Z-G-4.gif]}”，这种正则表达除了在Emacs里面，还能在哪里用呢？&lt;br/&gt;&lt;br/&gt;以上所说，都是针对FSF Emacs，而不是XEmacs。XEmacs的X11版本虽然也是用的 mule，但是做法稍有不同。而对于XEmacs的win32版本则根本不支持中文。XEmacs的新版本中会有不小改进，请拭目以待。&lt;br/&gt;&lt;h1 class="chapter"&gt;&lt;br/&gt;&lt;p class="chapterheading"&gt;&amp;nbsp;&lt;/p&gt;&lt;br/&gt;&lt;/h1&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-7175076827111586398?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/7175076827111586398/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=7175076827111586398' title='5 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/7175076827111586398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/7175076827111586398'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/08/emacs_01.html' title='Emacs的日常生活（转）'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-44299134713156658</id><published>2008-07-10T16:06:00.000-07:00</published><updated>2010-03-05T20:28:01.644-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='离别 毕业 工作 家乡'/><category scheme='http://www.blogger.com/atom/ns#' term='情怀'/><title type='text'>leaving hometown</title><content type='html'>5号到家，11号走，没在家住几天。就要去公司了，今天和同学吃了个饭以后发现大家都是各走各的路了，包括今天早上想联系王志平也联系不上。大学真的是一散就真的散了。 看到他在博客里写走的那天窗户只开了一点点小窗户的感觉真的很伤心。我不懂这些礼仪这些的，我认为只要心意在那里就可以了，可是我知道我错了，有时候会伤了别人的心。&lt;br/&gt;&lt;br/&gt;今天家里的叔叔姑姑们给我和龙哥饯行，喝酒的时候我很后悔在毕业饭的时候没有喝多，回去还那么清醒。现在距离才多长时间，兄弟们都已经天南地北各奔东西了。现在我只能说，兄弟走好。。。多联系。&lt;br/&gt;&lt;br/&gt;Different life, not same world, not same dream!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-44299134713156658?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/44299134713156658/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=44299134713156658' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/44299134713156658'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/44299134713156658'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/07/leaving-hometown.html' title='leaving hometown'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-7429851748383961256</id><published>2008-07-04T01:20:00.000-07:00</published><updated>2010-03-05T20:28:01.306-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='大观园 世界公园 北京'/><title type='text'>毕业游-北京第三天</title><content type='html'>&lt;title&gt;ZoundryDocument&lt;/title&gt;今天决定去大观园和世界公园，天气很热，那上那张AFC保障的牌子就去地铁站了。到了地铁站傻里傻气的找不见进的地方，而且小门也没开，只好假装自己是保障AFC的人去问在哪里进。如果真的是作AFC的人这么久了怎么会不知道在哪里进阿，而且俺也没贴照片。不过怕什么，钱花的差不多了能省就省点吧。有惊无险的坐上了地铁，在前门下车。在路上花了很长时间才到了大观园，好远的路程阿。在路上看到几乎所有的胡同和砖房外面都堆着沙子和砖头，这次我们不是在"拆那"，而是在翻新，一开始的想法是既然那是老房子，老胡同，是不是就应该保持他原来的哪种样子，现在修的这么新是不是不太好，太假了？  后来又想想，老祖宗的房子也应该是翻修过多少次的了。过个多少年，哪些胡同就应该又老了。可是如果想要去找原来胡同哪种老味道，可能因为时代的原因找不回来了。（不过让我不能参观胡同，还是有点不爽的）&lt;br/&gt;&lt;br/&gt;大观园里面人不是很多，大概也是因为天气太热了大家都不原意出来把。首先看到的是花冢，就是一个小土丘，而且上面的树木也没多少，但是我记得宝玉去找黛玉的时候是走了很远的两边都是树林的路的。看来被导演给忽悠了。然后可以看到一个池子，上面有一个凉亭，很是漂亮，但我也说不出那是什么地方，对面还有一个水帘洞，洞里面安了一个绿色的大灯泡很杀风景。&lt;br/&gt;&lt;br/&gt;接下来比较显眼的地方就应该是怡紅院了，来这个院子算是比较先看的一个地方，也觉得没什么。等我把所有其他的住处都看完以后，确实这贾家的儿子的院落确实是比较豪华的了，比其他的院落大气许多，院子中间放着一块巨大的时候，倒是不像其他女儿家们那么多花花草草的。&lt;br/&gt;&lt;br/&gt;大观园中间那个巨大的池子很漂亮，水池的尽头是他们家做了娘娘回来探亲的"省亲别墅"，那里面我没去不过应该是比较豪华的吧。今天的天气热的莲花都开了，坐在亭子里狂拍了几张含苞的还有已经开放的莲花，然后坐在那里和妞发了一会短信，闭上眼想象一下那个繁华年代曾经在这里发生的事情。&lt;br/&gt;&lt;br/&gt;从亭子里出来以后朝着比较远的一个院落走去，结果撞进了史湘云的住所，听了广播里面放的讲解以后休息了一会就走了。在园子里面乱逛的时候觉得有点破，可能是年久失修的缘故吧。在乱晃的时候觉得中国的园林真的是很美妙，很有味道。所以丫头你去苏杭二州的时候一定要好好参观一下那里的园林哦～&lt;br/&gt;&lt;br/&gt;薛宝钗的住处里面一点花都没有，全是假山加上藤蔓的植物。真是能够反映这位冷美人的特点的。不过听到后面的人生几乎是在守活寡的时候又非常替她惋惜。不过我只能说这应该不是曹雪芹的原意了～呵呵。&lt;br/&gt;&lt;br/&gt;黛玉的潇湘馆也非常有特色，小溪流过整个院落，非常的幽静。我个人比较喜欢这个地方，院子里的竹子非常的茂密，身在此处好像归隐于山中的感觉一样。&lt;br/&gt;&lt;br/&gt;这时候的时间已经差不多三点了，想一想去世界公园还得走好长时间就赶快撤了。出来以后就是找不到自己查到资料的那些站牌，在烈日下面找了半个小时终于坐上了车。在车上都睡了两觉了才到。&lt;br/&gt;&lt;br/&gt;看到世界公园的时候让我忽然想起了犀浦的那个已经破烂不堪的世界乐园。再加上￥65的门票，对这里首先的映像就不太好。不过都跑的半死的来了这里，就还是进来看看吧。进入大门以后首先看到的是一个多层的大理石样子的台，台的正前方放置着希腊神话中的诸神，不过像是用石膏托出来的，没有那种美感。费了很大力气爬上了那台子以后，发现这是一个找不到原型也找不到原因的混合建筑，最上面放置着维纳斯和大卫的雕像，觉得有一点荒唐和滑稽。&lt;br/&gt;&lt;br/&gt;让我很感叹的是德国的白天鹅城堡，虽然我看得是缩小版，但是他的结构给我很深的映像，而且从世界公园的仿制品上面都能显示出很有气势，无法想象真正的这个城堡的威严与雄伟。&lt;br/&gt;&lt;br/&gt;美国的华盛顿纪念碑一定很高，因为这个仿品已经非常高了，真品好像比它要大8倍。恩，这个地方以后一定要去看看。&lt;br/&gt;英国的塔桥一定非常的精美，值得一去。&lt;br/&gt;巴黎圣母院，这个我远远的就认出来了，这个仿品好像有点失修了，不过可以凭着这个仿制品来想象一下真的巴黎圣母院的美丽与壮观。&lt;br/&gt;圣彼得大教堂，圆顶，走廊，还有广场中间的方尖塔设计的非常好，这种微缩版看到的更清楚。&lt;br/&gt;其他的就是埃及的那几个神庙一定伟岸的不能再伟岸了，30：1的微缩版都那么雄伟，不知道这个真的建筑有多大，我也开始怀疑是不是地球人造的了。～呵呵。也许是猛犸象帮忙的？&lt;br/&gt;日本的院落很漂亮，他们在院落里面放的白石头显得院落很素雅，不过我不知道那是世界公园为了模仿下雪的情景还是日本的院子里面真的是放的白石头。&lt;br/&gt;还是得说说我们国家建筑NB的地方，虽然这么多年来我们都是模仿美国或者清真寺的风格来建楼房，而且模仿的也不伦不类不怎么好看。但是我发现中国的园林的可以设计的非常的漂亮，而且现代也有这种能力，还是应该发扬我们这方面的优势，不过这么多人城市都放不下了不可能弄那么多地来建园林了。倒是可以在山里面建，如果让我选择我还是会选择住园林的（大家不要打我）。&lt;br/&gt;&lt;br/&gt;最后再八卦一下北京城，在朱家皇帝建北京城的时候可真会选地方，中间那么大一个湖给它当游玩和水的资源，在这个上面建造了这么一座大的城邦。真是很费心机啊。我们在建造城邦的园林方面很有能力，这些是非常一流的水平的，但愿这些东西不会流失吧。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-7429851748383961256?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/7429851748383961256/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=7429851748383961256' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/7429851748383961256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/7429851748383961256'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/07/blog-post_04.html' title='毕业游-北京第三天'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-6594455894087889040</id><published>2008-07-03T03:31:00.000-07:00</published><updated>2010-03-05T20:28:01.294-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='北京 恭王府 北海公园 旅游'/><title type='text'>毕业游-北京第二天</title><content type='html'>&lt;title&gt;ZoundryDocument&lt;/title&gt;第二天了，他们早早的就走了，这年头工作都不容易啊。今天决定去和绅的家（恭王府）去看看，然后去大观园看看。到了恭王府附近以后发现北海公园就在对面，想了想从和绅家去大观园得坐公交，估计大半天的时间就都得浪费在路上了，就取消了。&lt;br/&gt;&lt;br/&gt;先从找和绅家开始把，做2号线地铁到了阜成门内上了地面，然后就顺着大街走。先找到一个邮局，然后就找到了郭沫若的故居，我没什么文化修养，就没进去。其实主要原因是没有学生票之后买全票觉得很贵。&lt;br/&gt;&lt;br/&gt;这个地方（什刹海）大概是北京胡同比较多的地方吧，门口有很长的黄包车长龙。而且老外也很多，那些拉黄包车的人的英语真够NB的，出来的时候看到有一个拉车的拦住两个外国美眉，一跺脚，一叉腰，大声喊道：HI,  pretty girls, can i drive  you。。。等等一大串，说的很多我都听不懂，而且相当的快。他的表现如此之好，引来了所有人的目光。一定把老外吓到了，都不敢坐他的车。&lt;br/&gt;路边每隔几米就会有一个社区的那种健身器材，出来的时候看到一位老大爷半眯着眼睛在哪里非常享受的按摩他的背，两只胳膊都耷拉在器材上面，看起来非常的猥亵。呵呵。着实让我替我们国家的形象捏了把汗，我还是很在乎外国鬼子or朋友怎么看待我们的，虽然有点俗气～&lt;br/&gt;&lt;br/&gt;问了一次路，还是没走到那个地方，肚子已经饿的咕咕叫了，应该是叫都叫不出来了。看到一家包子馆，比较了一下兰州拉面还是选择了包子铺虽然我不怎么爱吃包子。进去以后就感觉不一样，好像比较NX的一家店。店里面的招牌有句说是"吃四方街，还吃庆丰包子"，就点了笼包子和一碗凉皮，凉皮这东西我从小就爱吃，只不过小时候觉得吃到这个特带劲。长大了吃的多了反而觉得不如小的时候巷子里面沿街叫卖的人做的好吃了。不过价格还挺贵的，真的是让我吃惊了一下。他们的经营方式和成都的那些小吃店类似。。。包子上来以后，咬了一口，里面竟然有海带！这也是比较让我吃惊的一点了。不过吃第二个的时候就发现它的好处了，就是没有普通包子那么腻。我没有吃完一笼包子就已经撑到不行了，所以赶快撤离，要不然就撑到哈儿了～呵呵。&lt;br/&gt;&lt;br/&gt;出来以后又问了一次路，这次终于找到了，结果发现只是和绅家的后花园开放，他的宅院在翻修吧，出来的时候看到们里面用水泥盖砖房，有一点失望，觉得这些古建筑差不多都已经翻新城现在的砖头和水泥了吧。&lt;br/&gt;好，买票进门了～首先看到的是一串觉得很像现在城市修的二层房屋的建筑，偷听了别人导游的讲解之后才知道那是和绅的藏宝楼，他的特色呢就是长143米，共有99一房间，二楼的房间的窗户每个都不一样，传说那是用来区分里面放的什么东西的，因为和大人的东西太多了。汗，真是有钱人，估计他的钱比沙特国王的都多吧。毕竟当了大清朝23年的总理呢，不过我个人觉得和绅应该没有王刚那么丑吧，毕竟他应该是一开始确实比较受欢迎，后来才能那么权倾朝野的吧。&lt;br/&gt;一进西洋门看到的是一个立着的时候，导游说像条鱼，我仔细看了看还真像条鱼。然后导游转了一个方向，说像一个女人抱着一个婴儿，我又仔细一看，也确实像。看来我的想象力真的是很差。因为在导游说之前我就已经观察过这块石头了，就是想不出为啥要立在这里，不过立在这里也挺好的。&lt;br/&gt;这块送子石的后面是一个蝙蝠展翅形状的小池子，用来吉祥的用处，这时候我就到旁边长廊里边去歇着了，和绅家的花园确实很凉快，左边有一个方形的水池，是和绅用来养鱼的，导游说这个池子里面的水使用的是皇帝喝水用的泉喷出来的水。我看了一下好像现在都换自来水了吧，池子里有管子在喷水呢。这个池子中间有一个凉亭，最后的时候我坐在凉亭上看池子里面的喷泉，后边的水面上有几只鸭子在水上面，挺惬意的。&lt;br/&gt;&lt;br/&gt;传说和绅家有个唱戏的戏台，和一般戏台不一样的是那个戏台坐的越远听得越清楚，当然应该不如5.1环绕立体声的音效好~说是台子下面有镂空的石头拍成V字形，所以那样才会音效好。原来是这样～&lt;br/&gt;这个花园里面基本上布满了假山和水池，叫有山有水嘛。到处的导游都在推销一个"福"字的纪念品，传说是乾隆写给孝庄的，说是有多少多少用，20块钱就能买一个开光的。我看了一下，觉得是忽悠就走了。&lt;br/&gt;在方池的后边有一个二层小楼，是恭亲王发泄郁闷的地方，一楼放了一块超级大的玉石，叫金香玉，让我想起武林外传里面的金镶玉了，还真有来头，那这样佟（铜）湘玉应该是遍的了吧。&lt;br/&gt;上了一下和绅家的茅房，非常小。不够气派。：） 看来和大人拉屎的时候也和普通人一样不是享受啊～不过这一点我们可能比和大人做的好吧～&lt;br/&gt;接着我就把院子里面所有能爬的假山都爬了一次之后就奔向北海公园了，出来的时候那种福字纪念品都卖10块钱两个了，看来行货和水货的差价还真够大的。&lt;br/&gt;&lt;br/&gt;好，穿过地安门大街，就到了北海公园的北门了。&lt;br/&gt;首先进去的是一条两边是竹林的小径，非常的幽静和凉爽，于是我就在小路末端的亭廊上边靠着坐了一会，我的后边是一个小池子，靠着柱子我的腿有一点显示出酸的感觉了。那是好像你啊，要是你在我们就可以一起在这上边八卦皇帝的院子了。继续开动了，听见一个导游说我旁边那个房子是太子们看书的地方，结构比较简单，中间好像是个佛堂，左边有一个炕，右边是一个书房。觉得在这里读书安逸的地方就是发呆的时候看到的景色很幽静典雅，不知道皇子们会不会这样觉得。&lt;br/&gt;&lt;br/&gt;先后看了静心斋、九龙壁。九龙壁看着比以前要苍老了许多，或许是我现在特别去关注建筑的裂纹的原因吧。静心斋外边有个钟，我上去为我的亲人和丫头敲了9下，差点把耳朵震坏，那家伙确实够厉害的。后来走到一个叫快雪厅的地方，传说里面的墙上刻着许多名书法作品。参观了一下，什么也没买就出去了。&lt;br/&gt;从快雪厅出来以后看见一个特别新的大殿，金碧辉煌的。进去以后差点叫出来，一个非常非常宏伟的佛像，里面包括了玉皇大帝的上苍的景象，好多个菩萨什么的都在上面。而且石头全是绿色的，很印象深刻。这时一个说着北京话的老奶奶就对我说"多了不起啊～以前的这些皇帝，这得极多少德啊"说这话的人不是疯了也应该快了吧。不过这老奶奶一直在自言自语，应该是差不多了，一直在感叹这些东西的伟大，感叹北京的美好。不过这些建筑在那些皇帝在位的几百年好像都不是给我们这些庶民来修的吧。再说这个佛教好像政治意义也非常的明显--用来拉拢蒙族和藏族的汉人的心的吧。结果那老太太在我出来以后还一直在感叹着，感叹大殿周围养的鱼的好，说红鱼好啊,最吉利了，你看还排着队呢。是好，不过那是锦鲤吧。赶快离得远一点，呵呵，她不会是观世音菩萨下凡来考验我的吧～呵呵。&lt;br/&gt;这时候走的已经很累了，想找个地方休息一会，结果每个亭子都有演出，相声，唱歌的，跳舞的，什么都有，于是就像坐船去看白塔，不去白塔誓不回～我刚走到码头，就发现船已经开走了，看来我慢了几步。大船已经飞驰而去了，想划船到对岸呢～想了想一个人划船有点凄凉，所以就决定徒步上白塔。绕着北海转了一小圈，已经累的，休息了好长时间才站起来，期间偷听了几个外国人在哪里商量他们的逛公园的计划，当作是联系听力了吧。&lt;br/&gt;终于走到了白塔下面，其实就几步路，两层楼那么高吧，我已经要站在那里休息很久了，看来回家以后要坚持游泳了，呵呵。上白塔还要买一次票，原来北海公园的票是只管观看白塔，还真会忽悠人。于是又买了张票，上了白塔，上白塔还要买次票，一次两块，我都怀疑是不是他们拦路强行收费呢。&lt;br/&gt;上了白塔前面的万佛X以后可以看到故宫，还有国家大剧院的银色顶子。觉得不白话这两块钱，看到的景色确实很迷人。&lt;br/&gt;这个时候差不多要关门了，就只有急着往出赶，我出来以后那个看门的就把前门给锁了，我就不知道我多买的那张门票多了点什么。汗死。今天的白塔之旅就到这里了～&lt;br/&gt;&lt;br/&gt;又到了下班高峰期了，得赶快赶路公交去地铁那边去。咱再享受一下这世界上最便宜地铁带来的方便吧。明天我就带着AFC保障的牌子去免费乘车了～呵呵&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-6594455894087889040?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/6594455894087889040/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=6594455894087889040' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/6594455894087889040'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/6594455894087889040'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/07/blog-post_03.html' title='毕业游-北京第二天'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-2294781310219540834</id><published>2008-07-02T03:34:00.000-07:00</published><updated>2010-03-05T20:28:01.283-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='日常琐事'/><title type='text'>毕业游-北京第一日</title><content type='html'>今天是在北京的第一天的结束了，想回想一下昨天和今天的事情，留个纪念。 这几天的心情让人特别想去纪念什么东西，一些像时间一样抓不住的东西。今天的话题尽量鲜亮一点吧，只要想起那样的情绪就不能自已的悲伤。&lt;br/&gt;&lt;br/&gt;话说在那个忙的像狗的早上，妞送我到了机场，然后她不得不就坐了车回去了。 我们都多么想多留对方一下，哪怕是登记前的那短短的几分钟。自己独自推着行李车，换登机牌，在托运行李的时候说我的行李超重5公斤，要交100多块钱。于是我就想自己背着了，那个机场的人看我是穷学生就放了我一马。于是赶快拉着行李去安检了。结果没5分钟就OK了，我还以为要等1个多小时呢。在等飞机的时候，一直和妞保持着电话，在我还没有等到电话的时候，她已经回到了学校。我们都不想挂掉这电话，我们都知道这个联通的免费电话可能只能多大这么一个小时了。&lt;br/&gt;&lt;br/&gt;但是时间总是不停止的，到了上飞机的时候了，是自己一个人第一次坐飞机。想坐一个靠窗子的位置，看看成都的天空上面是否是万里无云。可是我那个座位好像不是靠窗户的，于是上机以后就问乘务员换，结果正好有个人晕机，说不要靠窗户的位置可以不，然后空姐笑的很开心的对我们让我们自行调配。昏死，原来坐飞机也和坐火车一样，可以自己商量的换座位（算我孤陋寡闻了）。结果我的那个位置虽然是边上的，结果我旁边正好没有窗户，也不是应急门，就是没有窗户。 不过在飞的时候还是看到了云层之上的那种景色，很漂亮。&lt;br/&gt;&lt;br/&gt;下了飞机，我是到北京的南苑机场。一下飞机发现只有我们一辆飞机在机场里， 那个机场的出口和入口都只有一个。大有临时机场的味道。 真的小的可以的。本来以为会在国际机场的，结果完全不是，还说要见识一下首都现在的保安状况呢～结果这个机场就没见什么保安！&lt;br/&gt;&lt;br/&gt;出了机场，马上被一群出租车司机围住，被很热情的问来问去。怕了他们了。坐上机场大巴前往西单。路上的时候实验了一下N95的route66 导航系统，还真好用的，不过还是很不准。司机的选路经常让route66晕头转向。不过我更相信司机叔叔一些。&lt;br/&gt;&lt;br/&gt;到西单下车，等了大概半个小时，终于等到了王波同学，现在好像比以前更壮了。他带着我走下了西单地铁的入口，结果他掏出一张AFC保障的牌子，直接从小门进去了。然后我刷他的卡进站。新地铁给我的感觉不错，不过真的比以前只有3根线的时候复杂多了。在里面晕头转向的。在地铁里面看到有带着“文明督导员”袖章的人指挥我们排队。还听说公交的文明督导员还要帮忙让你进入，先是把人推进公交，等公交的车门关不到的时候，就直接上脚踹，和他们胳膊上的袖章形成了鲜明的对比。很讽刺啊。&lt;br/&gt;坐了大概1一小时的地铁，我们到了王波住的地方。是一个环境很差，差的很北方的小村村，在北京的5环外了都。&lt;br/&gt;路很泥，还有地方在修房子，不过都是3-4层的自建房，不过自从地震以后就觉得这样的房子很不可靠。&lt;br/&gt;&lt;br/&gt;网上和他们宿舍一起的兄弟一起吃了饭之后，就赶快睡觉了。他们睡的确实比较早，不过都是刚出来混，比较不容易吧。晚上查了很晚的资料，关于第二天去什么地方玩得资料，决定去北京的那个欢乐谷去玩。&lt;br/&gt;&lt;br/&gt;第二天起来以后，天气还是灰蒙蒙的，要下雨似的，两个人商量了一下决定去别的地方，不去欢乐谷了， 想去离地铁比较近的地方，最后想起了去雍和宫，然后回来的路上去清华大学看看。于是马上上路，今天我没带行李，直接跟在他后边就进入了地铁站的员工通道，感叹北京地铁的便宜啊，两块钱想去哪就去哪？国家拨了大笔的money来支持啊，一般刚拨款以后很快就用完了。玩模拟城市的时候就深刻的体会到了地铁的贵！呵呵。&lt;br/&gt;&lt;br/&gt;到了雍和宫，好多好多老外，买了张票以后进去发现这个地方很眼熟，好像以前来北京的时候来过。到了这种地方没有导游我们只是瞎逛，最后只是从地铁的报站里面得到信息——雍和宫是一个喇嘛庙呵呵。老外看的津津有味，我们却显得很无聊，于是决定吃饭然后去清华。&lt;br/&gt;&lt;br/&gt;中午吃得杂碎，北京这边叫卤煮。味道和家里的不怎么一样，一点都不辣，很咸。北京的吃的卖的比较贵，不过只是 那些主城区是这样，在我住的地方还是不贵。不想成都是郊区卖的比市区都黑～当然大概只是犀浦镇是这样的吧。&lt;br/&gt;&lt;br/&gt;随后乘坐地铁赶赴清华，坐车迷迷糊糊的到了清华科技园的门口，但是却找不到清华的门。忽然王波说那是google的大楼，激动啊～赶快到google的门口照了张相，自己就不照进去了，等以后如果能进去再照～呵呵。于是非常羡慕+嫉妒清华的同学们，门口就这么多NB公司，太方便了。还看到sohu的公司等～没怎么激动，穿过了一个复杂的长廊，来到了清华西门的门口，进去以后发现自行车很多，不过从这个门出来的大多数都是汽车，这个门出去便可以到中关村的嘛～&lt;br/&gt;&lt;br/&gt;具体怎么转悠的就不多说了，说说自己对清华的感受吧。&lt;br/&gt;&lt;ol&gt;&lt;br/&gt;	&lt;li&gt;自行车多，对自行车的支持也好，每个宿舍楼的1楼都是自行车的车棚，那样自行车被偷的状况应该会下降许多把。&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;毕业捐衣服，这应该是他们社团办的一个活动，但是看到他们在车棚里面一件一件的检查每一件衣服的情况觉得确实做事很细心。其实我们做事也可以这么细心的。&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;建筑很有特色，我说的是新建的那些建筑。宿舍楼都建的很有波浪曲线，大概是某研究生的项目吧～呵呵&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;像公园一样的大学，清华有很多的绿地和公园，荷花池我都见了3个，还养着几只孔雀，里面还有几只白孔雀。出门的时候看见某同学拿着好几根在白孔雀的羽毛。汗！&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;旅游的人多。。。&lt;/li&gt;&lt;br/&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-2294781310219540834?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/2294781310219540834/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=2294781310219540834' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/2294781310219540834'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/2294781310219540834'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/07/blog-post_02.html' title='毕业游-北京第一日'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-5727593966919264142</id><published>2008-07-01T02:08:00.000-07:00</published><updated>2010-03-05T20:28:00.908-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='emerald'/><title type='text'>毕业了，离开了。</title><content type='html'>&lt;meta http-equiv="Content-Type" content="text/html; charset=utf-8" /&gt;&lt;meta name="ProgId" content="Word.Document" /&gt;&lt;meta name="Generator" content="Microsoft Word 11" /&gt;&lt;meta name="Originator" content="Microsoft Word 11" /&gt;&lt;br/&gt;&lt;link href="file:///C:%5CDOCUME%7E1%5CADMINI%7E1%5CLOCALS%7E1%5CTemp%5Cmsohtml1%5C01%5Cclip_filelist.xml" rel="File-List" /&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:WordDocument&gt;   &lt;w:View&gt;Normal&lt;/w:View&gt;   &lt;w:Zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:PunctuationKerning/&gt;   &lt;w:DrawingGridVerticalSpacing&gt;7.8 磅&lt;/w:DrawingGridVerticalSpacing&gt;   &lt;w:DisplayHorizontalDrawingGridEvery&gt;0&lt;/w:DisplayHorizontalDrawingGridEvery&gt;   &lt;w:DisplayVerticalDrawingGridEvery&gt;2&lt;/w:DisplayVerticalDrawingGridEvery&gt;   &lt;w:ValidateAgainstSchemas/&gt;   &lt;w:SaveIfXMLInvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:IgnoreMixedContent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:AlwaysShowPlaceholderText&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:Compatibility&gt;    &lt;w:SpaceForUL/&gt;    &lt;w:BalanceSingleByteDoubleByteWidth/&gt;    &lt;w:DoNotLeaveBackslashAlone/&gt;    &lt;w:ULTrailSpace/&gt;    &lt;w:DoNotExpandShiftReturn/&gt;    &lt;w:AdjustLineHeightInTable/&gt;    &lt;w:BreakWrappedTables/&gt;    &lt;w:SnapToGridInCell/&gt;    &lt;w:WrapTextWithPunct/&gt;    &lt;w:UseAsianBreakRules/&gt;    &lt;w:DontGrowAutofit/&gt;    &lt;w:UseFELayout/&gt;   &lt;/w:Compatibility&gt;   &lt;w:BrowserLevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:LatentStyles DefLockedState="false" LatentStyleCount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;br/&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face 	{font-family:宋体; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-alt:SimSun; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 135135232 16 0 262145 0;} @font-face 	{font-family:"\@宋体"; 	panose-1:2 1 6 0 3 1 1 1 1 1; 	mso-font-charset:134; 	mso-generic-font-family:auto; 	mso-font-pitch:variable; 	mso-font-signature:3 135135232 16 0 262145 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal 	{mso-style-parent:""; 	margin:0cm; 	margin-bottom:.0001pt; 	text-align:justify; 	text-justify:inter-ideograph; 	mso-pagination:none; 	font-size:10.5pt; 	mso-bidi-font-size:12.0pt; 	font-family:"Times New Roman"; 	mso-fareast-font-family:宋体; 	mso-font-kerning:1.0pt;}  /* Page Definitions */  @page 	{mso-page-border-surround-header:no; 	mso-page-border-surround-footer:no;} @page Section1 	{size:612.0pt 792.0pt; 	margin:72.0pt 90.0pt 72.0pt 90.0pt; 	mso-header-margin:36.0pt; 	mso-footer-margin:36.0pt; 	mso-paper-source:0;} div.Section1 	{page:Section1;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt;&lt;br/&gt;&lt;style&gt;  /* Style Definitions */  table.MsoNormalTable 	{mso-style-name:普通表格; 	mso-tstyle-rowband-size:0; 	mso-tstyle-colband-size:0; 	mso-style-noshow:yes; 	mso-style-parent:""; 	mso-padding-alt:0cm 5.4pt 0cm 5.4pt; 	mso-para-margin:0cm; 	mso-para-margin-bottom:.0001pt; 	mso-pagination:widow-orphan; 	font-size:10.0pt; 	font-family:"Times New Roman"; 	mso-fareast-font-family:"Times New Roman"; 	mso-ansi-language:#0400; 	mso-fareast-language:#0400; 	mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;&lt;span style="font-size: 10pt; font-family: 宋体"&gt;你说让我说几句祝福的话，我不知道该说什么，当时已经泪花花的了，我只能&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;“&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 宋体"&gt;恩&lt;/span&gt;&lt;span style="font-size: 10pt"&gt;”&lt;/span&gt;&lt;span style="font-size: 10pt; font-family: 宋体"&gt;着答应，我怕我哭出声来。&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;br/&gt;&lt;p class="MsoNormal" style="margin-right: -3.7pt; text-align: left" align="left"&gt;&lt;span style="font-size: 10pt; font-family: 宋体"&gt;离开的好匆忙，有惊无险的办好了毕业证和学位证之后。就得离开学校了。毕业证就是一张纸，真的是体会到了这句话的力量了，学位证其实也一样。我甚至都没有看他们上边具体些的什么东西，只是注意了一下校长和院长的签名。&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p class="MsoNormal" style="margin-right: -3.7pt; text-align: left" align="left"&gt; &lt;span style="font-size: 10pt; font-family: 宋体"&gt;回宿舍，走人了。王志平、大杨、严制都来送我，还有周浩他们一个宿舍的人，还有小潘他们都来送我，浩浩荡荡一大群人，我和妞走在最前面，我摩挲着她的肩膀，怕她难受，其实自己也是强忍着眼泪，舍不得这群兄弟，舍不得这个破学校，舍不得和妞分开。但是还是提着行李箱坐着野租出了学校，都不忍和大家告别，但是已经毕业了。除了我们相互留恋，没有人要留我们。学校的行为让我想起了母老虎在小老虎长大以后就会把她的孩子用一种近乎于野蛮的方式赶出去。也许，这更是一种历练吧。&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p class="MsoNormal" style="margin-right: -3.7pt; text-align: left" align="left"&gt;&lt;span style="font-size: 10pt; font-family: 宋体"&gt;上飞机前，一直在和你打电话。可是我不能仔细想，每当我想你的时候，眼泪就会不由我控制的滴落下来。更别说我们在一起这一年三个月的时间发生的那么多的事。把可的资料放在我贴身的包里面，我会好好照顾好她的。&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p class="MsoNormal" style="margin-right: -3.7pt; text-align: left" align="left"&gt;&lt;span style="font-size: 10pt; font-family: 宋体"&gt;飞机上的声音很大，也许我正在翅膀旁边吧，我的耳朵经常会很难受。这样快速的离开不符合我的性格，好像还没有反应过来就已经发生了，已经离开。各自奔前程，总会有天再聚的，虽然不能还像现在那样，但人生的路总要向前，兄弟们，加油啊。以后可得考自己了。&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p class="MsoNormal" style="margin-right: -3.7pt; text-align: left" align="left"&gt;&lt;span style="font-size: 10pt; font-family: 宋体"&gt;飞机餐果然很难吃，打开铝箔纸的时候看到那个所谓的汉堡，我想起了集中营里面的窝窝头。咬上一口，果然超级难吃，还是吃了3/4，实在是饿死了。还吃了点面包，喝了杯热咖啡，随后便困意袭来。也应该困了，只睡了三个小时，还跑上跑下的。再不困就是小宇宙爆发了。&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p class="MsoNormal" style="margin-right: -3.7pt; text-align: left" align="left"&gt;&lt;span style="font-size: 10pt; font-family: 宋体"&gt;妞，你现在一定在和老大小居吃饭吧。吃饱饭以后想你不会流眼泪了，不过眼睛还是有点疼。&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p class="MsoNormal" style="margin-right: -3.7pt; text-align: left" align="left"&gt;&lt;span style="font-size: 10pt; font-family: 宋体"&gt;其实，这次比我想象中的要伤感很多，多少次大口喘气来控制眼泪不让它呼啦啦的流下来。多少次只想抓住你的手，静静的望着你，不过这可能让你不舒服。还是你觉得不习惯呢？只想抱着你，感受你的温暖，呼吸有你味道的空气，就那样沉醉着睡着。怀念那些交织在一起的年华，怀念那些在一起的日日夜夜。&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p class="MsoNormal" style="margin-right: -3.7pt; text-align: left" align="left"&gt;&lt;span style="font-size: 10pt; font-family: 宋体"&gt;在成都的这几年，特别是我们在一起以后，已经渐渐习惯，习惯那灰蒙蒙的天空，回到家里，回到北方，我想一下适应不过来吧。湿润的空气，暖暖的有你陪伴。听你的娇声细语。&lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p class="MsoNormal" style="margin-right: -3.7pt; text-align: left" align="left"&gt;&lt;span style="font-size: 10pt; font-family: 宋体"&gt;不能想了，再想就把咖啡补得水全部流出去了。 &lt;/span&gt;&lt;/p&gt;&lt;br/&gt;&lt;p class="MsoNormal" style="margin-right: -3.7pt; text-align: left" align="left"&gt;&lt;span style="font-size: 10pt; font-family: 宋体"&gt;妞，想你，不言中，你也再想我吧。&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-5727593966919264142?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/5727593966919264142/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=5727593966919264142' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5727593966919264142'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5727593966919264142'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/07/blog-post.html' title='毕业了，离开了。'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-7038255105800824902</id><published>2008-04-19T18:35:00.000-07:00</published><updated>2010-03-05T20:28:00.408-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emerald'/><category scheme='http://www.blogger.com/atom/ns#' term='情怀'/><title type='text'>几起几落，更坚定</title><content type='html'>日出日落， 几次动摇再加几次坚持， 漆黑中指出黑暗以及伤痛， 白昼恢复光泽与荣耀，同时又更加坚固， 如果这样就放弃了， 那么这么长的时间的努力就一文不值了， 对于我们的梦想， 就没有了， 当然， 该改正的还是要努力改， 但是记得一定要像亲人一样分享。 不够朦胧， 写给我们。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-7038255105800824902?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/7038255105800824902/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=7038255105800824902' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/7038255105800824902'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/7038255105800824902'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/04/blog-post_19.html' title='几起几落，更坚定'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-2293673480380470598</id><published>2008-04-13T01:43:00.000-07:00</published><updated>2010-03-05T20:28:00.393-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='情怀'/><title type='text'>苍白的一天， 毁了一切！</title><content type='html'>失去了才懂得珍惜， 说出来。please!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-2293673480380470598?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/2293673480380470598/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=2293673480380470598' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/2293673480380470598'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/2293673480380470598'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/04/blog-post_13.html' title='苍白的一天， 毁了一切！'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-2044454734964351067</id><published>2008-04-02T15:27:00.000-07:00</published><updated>2010-03-05T20:28:00.375-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='中国人'/><title type='text'>有人反对你， 并不自然代表你的耻辱</title><content type='html'>标题是许子东在锵锵三人行中的一句话， 也许无论是自身或者我们的社会都应该更多的容纳一些反对者的声音。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-2044454734964351067?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/2044454734964351067/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=2044454734964351067' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/2044454734964351067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/2044454734964351067'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/04/blog-post.html' title='有人反对你， 并不自然代表你的耻辱'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-3423825519711803393</id><published>2008-03-25T13:39:00.000-07:00</published><updated>2010-03-05T20:28:00.360-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='emerald'/><title type='text'>我的生活有时候很乱</title><content type='html'>快毕业了，和丫头也快一年了， 好像很快的样子， 工作找到了， 驾照也快考到了， 毕设也快做出来了， 貌似一切都很圆满都很好， 可是我却感觉很累， 可能是身体很久没运动过了， 也可能是生活太单调了， 爱情呢， 好像越来越平淡了， 妞的生日也过得让我觉得很对不住她， 而且平时也让她觉得我不关心她， 而且自己经常精神恍惚， 不能专注精神， 有点累， 一旦我们之间不高兴了， 一定是我又做错了什么， 可是我记得也有很多次你说我对你很好啊， 也有几次说你突然对我这么好干什么， 不适应， 看来我平时是不关心她。 我想关心， 可是我找不到一个出口， 我还停留在那个可以有自己的地盘， 有一个自己的房间的地方来显示我的关心， 走在这个校园， 在这个地方， 我找不到关心的地方， 要不就是我自己的问题， 因为你说过关心人是不用想的， 你爱她自然就会关心他， 我总是抱怨环境， 总是在找借口， 不去面对， 从什么时候开始， 我的生活开始变得这么单调，乏味， 让人厌烦。 最让我感到讨厌的是我们的关系进入一个怪圈， 似乎不在床上， 而且平时总是想起那事， 其实也不多， 但是这正常吗？ 我又在幻想， 我决定了， 给你买个你喜欢的MP3。 然后在我们一年的时候送给你， 可是我在想， 我想买nano可是却给你买了一个低一档次的staffer， 这样不好吧。 可是如果我给你买了nano， 钱就不够再买一个了， 我还是学不会攒钱， 我想浪漫， 可是却让你很疲惫， 听到你说你很烦的时候真想砍掉自己的手， 我喜欢摸你的肚肚就像你喜欢摸你妈妈的肚肚一样， 也许这让你反感了， 对不起， 以后我不了， 你现在在洗澡吧。 你现在一定也在想我们的事情吧， 我不想你选择妥协， 因为那样不是你。 是我的后知后觉后动让你这样了吧，也许我可以躲藏在自己的性格后面说这是性格的原因吧， 但是我想争取， 我想做事利落一点， 不再瞻前顾后， 犹犹豫豫。 这就是为什么把一开始说给自己的话，后来说给你。 这是我这几天全部想的。 我想他们不要扰乱我们， 我想我不再被一些小事困扰（不是说我们的事，我们的事没小事） ， 我不想精神恍惚， 我想干干脆脆， 我想我们开开心心， 甜甜蜜蜜， 我想你&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-3423825519711803393?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/3423825519711803393/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=3423825519711803393' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3423825519711803393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3423825519711803393'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/03/blog-post_25.html' title='我的生活有时候很乱'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-5739991022260743010</id><published>2008-03-23T04:44:00.000-07:00</published><updated>2010-03-05T20:28:00.342-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='中国人'/><category scheme='http://www.blogger.com/atom/ns#' term='两会'/><title type='text'>2008年“两会”部分精彩言论摘录</title><content type='html'>1、全国政协委员、国资委副主任王瑞祥：“对于所谓垄断要科学界定，比如电信行业，固话业务、移动业务都有竞争，怎么能算垄断企业呢？当然不是。”　　　　 2、全国人大代表、北京铁路局常务副局长罗金保：“春运期间铁路一票难求的现象始终得不到缓解，根本原因在于铁路票价太低。”&lt;br/&gt;&lt;br/&gt;3、全国人大代表、铁道部副部长陆东福：“铁路部门在雪灾中的表现，至少打90分，不足的10分中，有七八分是失在我们运输能力不足造成的，另外两三分失在抗灾预案的估计不足。”&lt;br/&gt;&lt;br/&gt;4、全国政协委员、中国气象局局长郑国光：“春运混乱为什么要气象局道歉？这要说明白，为什么要气象局道歉？”&lt;br/&gt;&lt;br/&gt;5、全国人大代表、贵州省省长林树森：“雪灾是一场自然灾害，除了部分擅自离岗、渎职等情况外，贵州省的干部表现得还比较好，不存在问责的问题。”&lt;br/&gt;&lt;br/&gt;6、全国人大代表、陕西省省长袁纯清（当被问到华南虎事件时）： “在两会上，我们应该把精力主要放在审议政府工作报告上。”&lt;br/&gt;&lt;br/&gt;7、全国政协委员、陕西海星集团董事长荣海：“（华南虎事件）政府最初的愿望可能是好的。”&lt;br/&gt;&lt;br/&gt;8、全国人大代表、世界银行副行长兼首席经济学家林毅夫：“《政府工作报告》中所提出的4.8%的物价涨幅预期目标是合适的，即便是到5%，也是可以的。”&lt;br/&gt;&lt;br/&gt;9、全国政协委员、玖龙纸业公司董事长张茵：“降低富人税负，把月薪10万元以上的最高累进税率从45%减至30%。”&lt;br/&gt;&lt;br/&gt;10、全国政协委员、北京兆泰房地产开发有限公司董事长穆麒茹：“钉子户为了他个人的利益，损害了包括开发商在内的多数人的利益！这也是房价上涨的原因之一。”“虽然房地产产业对国民经济作出了贡献，但总体仍受到了不甚公正的待遇。”&lt;br/&gt;&lt;br/&gt;12、全国政协委员、星河湾地产董事长黄文仔：“房价高其实没关系，政府可以通过税收形成良性循环，这样对大家都有利。”&lt;br/&gt;&lt;br/&gt;13、全国政协委员、祈福房产董事长彭磷基：“如果你还没有买房的话，快点去买，现在是一个很好的价格。”&lt;br/&gt;&lt;br/&gt;14、全国政协委员、信息产业部电信研究院副院长曹淑敏：“手机通话费不是高收费。”&lt;br/&gt;&lt;br/&gt;15、全国人大代表、吉林省副省长陈晓光：“现在老百姓所反映的‘上学难、上学贵’的论调是不对的，我们从来没有过‘上学难’，也没有过‘上学贵’，我国也不存在‘上学难、上学贵’的问题。”&lt;br/&gt;&lt;br/&gt;16、政协列席、国家新闻出版总署署长柳斌杰：“如果实行分级管理，等于承认淫秽色情可以大量出版。”&lt;br/&gt;&lt;br/&gt;17、政协委员、广州市卫生局副局长曾其毅：“所谓看病难看病贵，我走遍全世界，看病最不难是中国，看病最不贵是中国。”“其实在中国看病并不贵，是人们的价值观念问题。”&lt;br/&gt;&lt;br/&gt;18、全国政协委员、西北大学经济管理学院副院长韦苇：“国内旅游是省域之间互掏腰包，不会增加社会财富总量，反而污染环境，消耗能源，损坏文物，所以要控制国内游的规模。”&lt;br/&gt;&lt;br/&gt;19、全国人大代表、山东济宁市长张振川：“允许有争论，但是标志城肯定要建。”(在回应108个政协委员签名反对在山东济宁建设“中华文化标志城”一事时张振川如是表示。2004年做过的一次预算认为，建造这个标志城将耗资300亿元人民币）&lt;br/&gt;&lt;br/&gt;20、全国政协委员李晓东、王二虎、周一波、王西林联名提交提案：“每年清明节黄帝陵祭祖活动由全国人大、国务院、全国政协共同主办，陕西省政府或国内各 省轮流承办，国家主要领导人担当主祭，各省负责人率团、港澳台代表、海外各国华人代表共同参加祭祀，电视全球转播，把祭祀黄帝上升为国家级的大典。”&lt;br/&gt;&lt;br/&gt;来源于&lt;a href="http://www.google.cn/search?q=2008%E5%B9%B4%E2%80%9C%E4%B8%A4%E4%BC%9A%E2%80%9D%E9%83%A8%E5%88%86%E7%B2%BE%E5%BD%A9%E8%A8%80%E8%AE%BA%E6%91%98%E5%BD%95&amp;amp;sourceid=navclient-ff&amp;amp;ie=UTF-8&amp;amp;rlz=1B3GGGL_zh-CNCN257CN258" target="_blank"&gt;互联网&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-5739991022260743010?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/5739991022260743010/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=5739991022260743010' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5739991022260743010'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5739991022260743010'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/03/2008.html' title='2008年“两会”部分精彩言论摘录'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-245264591783898189</id><published>2008-03-21T07:14:00.000-07:00</published><updated>2010-03-05T20:28:00.327-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='bison c++ 康师傅'/><category scheme='http://www.blogger.com/atom/ns#' term='73729'/><title type='text'>好多冲突，好艰巨的任务哦。</title><content type='html'>写了一天， 终于the c++ programming language后面带的C++语法全部转换成了bison。&lt;br/&gt;编译以后你猜有多少个冲突？&lt;br/&gt;&lt;br/&gt;8000多个R/s 9000多个 R/r冲突。。。 看来消除这些冲突真是一件艰巨的任务阿！&lt;br/&gt;&lt;br/&gt;C++的语法真是太美妙了， 不过也是我自己的水平不行。。。&lt;br/&gt;&lt;br/&gt;先吃点东西休息一下。。。&lt;br/&gt;&lt;br/&gt;ps: 怪事！ 打开了一个没有开封的桶状康师傅方便面， 里面的蔬菜包竟然已经被倒进了面里面，其他的料包都还完好。。。。 该不该吃呢。。。算了吧。 说不定装配这个方便面的工人还吐了口水进去。。。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-245264591783898189?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/245264591783898189/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=245264591783898189' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/245264591783898189'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/245264591783898189'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/03/blog-post_21.html' title='好多冲突，好艰巨的任务哦。'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-7021948013405864447</id><published>2008-03-20T04:33:00.000-07:00</published><updated>2010-03-05T20:28:00.306-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='firefox wqy ubuntu fonts'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>firefox浏览器使用wqy字体以后变满的解决办法</title><content type='html'>某同学的抱怨ubuntu下面firefox反应超慢， 其实是字体的原因了， wqy字体采用的是压缩的PCM字体， 就是在每次调用字体的时候就要解压缩来找这个东西， 所以在有大量文字的网页firefox就好像被卡住一样。 好了， 现在说解决的办法把。&lt;br/&gt;cd /path/to/wqy/font/    #在我的ubuntu7.10上面是 /usr/share/X11/fonts/misc/&lt;br/&gt;&lt;span onclick="tagshow(event)" class="t_tag"&gt;sudo&lt;/span&gt; gunzip wenquanyi*pcf.gz&lt;br/&gt;sudo rm fonts.dir fonts.scale fonts.cache*&lt;br/&gt;sudo mkfontdir .&lt;br/&gt;sudo cp fonts.dir fonts.scale&lt;br/&gt;sudo fc-cache -fv&lt;br/&gt;&lt;br/&gt;然后 CTRL＋ALT＋BACKSPACE重启X以后， 打开FF就会发现浏览速度和飞一样拉。 爽！&lt;br/&gt;&lt;br/&gt;ref:http://www.linuxdiyf.com/bbs/thread-82090-1-1.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-7021948013405864447?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/7021948013405864447/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=7021948013405864447' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/7021948013405864447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/7021948013405864447'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/03/firefoxwqy.html' title='firefox浏览器使用wqy字体以后变满的解决办法'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-3492657547822467454</id><published>2008-03-17T04:18:00.000-07:00</published><updated>2010-03-05T20:28:00.276-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='design interface'/><category scheme='http://www.blogger.com/atom/ns#' term='design'/><title type='text'>【转】Top-10 Application-Design Mistakes</title><content type='html'>&lt;p class="maintext"&gt;&amp;nbsp;&lt;/p&gt;&lt;br/&gt;&lt;p class="overline"&gt; &lt;strong&gt;&lt;a href="http://www.useit.com/jakob/" title="Author biography"&gt;Jakob Nielsen&lt;/a&gt;'s Alertbox, February 19, 2008:&lt;/strong&gt;&lt;/p&gt;&lt;br/&gt;&lt;br/&gt;&lt;h1&gt;Top-10 Application-Design Mistakes&lt;/h1&gt;&lt;br/&gt;&lt;blockquote style="background-color: #ffffdd"&gt; &lt;strong&gt;Summary:&lt;/strong&gt;&lt;br/&gt;Application usability is enhanced when users know how to operate the UI and it guides them through the workflow. Violating common guidelines prevents both.&lt;/blockquote&gt;&lt;br/&gt;It's hard to write a general article about application design mistakes because the very &lt;strong&gt;worst mistakes are domain-specific&lt;/strong&gt; and idiosyncratic. Usually, applications fail because they (a) solve the &lt;strong&gt;wrong problem&lt;/strong&gt;, (b) have the &lt;strong&gt;wrong features&lt;/strong&gt; for the right problem, or (c) make the right features too &lt;strong&gt;complicated&lt;/strong&gt; for users to understand.&lt;br/&gt;&lt;br/&gt;Any of these three mistakes will doom your app, and yet I still can't tell you what to do. What's the right problem? What are the right features? What complicating curlicues can safely be cut from those features? For each domain and user category, these questions have specific and very different answers.&lt;br/&gt;&lt;br/&gt;The only generalizable advice is this: rather than &lt;a href="http://www.useit.com/alertbox/genius-designers.html" title="Alertbox: The Myth of the Genius Designer" class="old"&gt;rely on your own best guesses&lt;/a&gt;, &lt;strong&gt;base your decisions on user research&lt;/strong&gt;:&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;Conduct field studies and task analysis before deciding what your app should do.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://www.nngroup.com/reports/prototyping/" title="Nielsen Norman Group: 32-minute training video on Paper Prototyping " class="new"&gt;Paper prototype&lt;/a&gt; your initial ideas before doing any detailed design — and definitely before wasting resources implementing something you'd have to change as soon as you get user feedback.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://www.useit.com/papers/iterative_design/" title="Jakob Nielsen: 4 case studies of iterative design" class="old"&gt;Design iteratively&lt;/a&gt;, conducting many rounds of &lt;a href="http://www.useit.com/alertbox/20000319.html" title="Alertbox: Why You Only Need to Test With 5 Users" class="old"&gt;quick user testing&lt;/a&gt; as you refine your features.&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;Of course, people don't want to hear me say that they need to &lt;em&gt;test&lt;/em&gt; their UI. And they definitely don't want to hear that they have to actually move their precious butts to a customer location to watch real people do the work the application is supposed to support.The general idea seems to be that real programmers can't be let out of their cages. My view is just the opposite: no one should be allowed to work on an application unless they've spent a day observing a few end users.&lt;br/&gt;&lt;br/&gt;(Whatever you do, at least promise me this: Don't just implement feature requests from "user representatives" or "business analysts." The most common way to get usability wrong is to &lt;a href="http://www.useit.com/alertbox/20010805.html" title="Alertbox: First Rule of Usability? Don't Listen to Users " class="old"&gt;listen to what users &lt;em&gt;say&lt;/em&gt;&lt;/a&gt; rather than actually watching what they &lt;em&gt;do&lt;/em&gt;. &lt;strong&gt;Requirement specifications are always wrong&lt;/strong&gt;. You must prototype the requirements quickly and show users something concrete to find out what they really need.)&lt;br/&gt;&lt;br/&gt;All that said, there are still plenty of general guidelines for application UIs — so many, in fact, that we have a hard time cramming the most important into our &lt;a href="http://www.nngroup.com/services/workshops/application-design.html" title="Nielsen Norman Group training tutorial: Application Usability" class="new"&gt;two-day course&lt;/a&gt;. Here's my list of 10 usability violations that are both particularly egregious and often seen in a wide variety of applications.&lt;br/&gt;&lt;h2&gt;1. Non-Standard GUI Controls&lt;/h2&gt;&lt;br/&gt;Basic GUI widgets — &lt;a href="http://www.useit.com/alertbox/command-links.html" title="Alertbox: Command Links" class="old"&gt;command links&lt;/a&gt; and buttons, &lt;a href="http://www.useit.com/alertbox/20040927.html" title="Alertbox: Checkboxes vs. Radio Buttons" class="old"&gt;radio buttons and checkboxes&lt;/a&gt;, scrollbars, close boxes, and so on — are the lexical units that form &lt;strong&gt;dialog design's vocabulary&lt;/strong&gt;. If you change the appearance or behavior of these units, it's like suddenly injecting foreign words into a natural-language communication. Det vil gøre læserne forvirrede (or, to revert to English: &lt;em&gt;Doing so will confuse readers&lt;/em&gt;). For some reason, homemade design's most common victims are &lt;a href="http://www.useit.com/alertbox/20050711.html" title="Alertbox: Scrolling and Scrollbars" class="old"&gt;scrollbars&lt;/a&gt;. For years, we've encountered non-standard scrollbars in our studies, and they almost always cause users to &lt;strong&gt;overlook some of their options&lt;/strong&gt;. We're &lt;a href="http://www.useit.com/alertbox/user-skills.html" title="Alertbox: User Skills Improving, But Only Slightly" class="old"&gt;seeing this again this year&lt;/a&gt;, in the studies we're conducting to update our course on &lt;a href="http://www.nngroup.com/events/tutorials/usability.html" title="Nielsen Norman Group: outline of full-day training course" class="new"&gt;Fundamental Guidelines for Web Usability&lt;/a&gt;. (The linked article includes screenshots of offending scroll controls.)&lt;br/&gt;&lt;br/&gt;Some of the world's best interaction designers have refined the standard look-and-feel of GUI controls over 30 years, supported by thousands of user-testing hours. It's unlikely that you'll invent a better button over the weekend.&lt;br/&gt;&lt;br/&gt;But even if your homemade design, seen in isolation, were hypothetically better than the standard, it's &lt;strong&gt;never seen in isolation&lt;/strong&gt; in the real world. Your dialog controls will be used by people with years of experience operating standard GUIs.&lt;br/&gt;&lt;br/&gt;If &lt;strong&gt;Jakob's Law&lt;/strong&gt; is "users spend most of their time on &lt;em&gt;other&lt;/em&gt; websites," then &lt;strong&gt;Jakob's Second Law&lt;/strong&gt; is even more critical: "Users have several thousand times more experience with standard GUI controls than with any individual new design."&lt;br/&gt;&lt;br/&gt;Users will most likely fail if you deviate from expectations on something as basic as the controls to operate a UI. And, even if they don't fail, they'll expend substantial brainpower trying to operate something that shouldn't require a second thought. Users' cognitive resources are better spent understanding how your application's features can help them achieve their goals.&lt;br/&gt;&lt;h3&gt;1.a. Looking Like a GUI Control Without Being One&lt;/h3&gt;&lt;br/&gt;The opposite problem — having something that looks like a GUI control when it isn't one — can reduce usability even more. We often see text and headlines that look like links (by being &lt;span style="color: blue"&gt;colored&lt;/span&gt; or &lt;span style="text-decoration: underline"&gt;underlined&lt;/span&gt;, for example) but aren't clickable. When users click these look-alikes and nothing happens, they think the site is broken. (So please comply with guidelines for &lt;a href="http://www.useit.com/alertbox/20040510.html" title="Alertbox: Guidelines for Visualizing Links" class="old"&gt;visualizing links&lt;/a&gt;.) A similar problem occurs when something &lt;strong&gt;looks like a button but doesn't initiate an action&lt;/strong&gt;, or looks like a radio button but isn't a choice. We found an example of this in our current round of studies.&lt;br/&gt;&lt;br/&gt;To design a custom-tailored shirt on Liste Rouge Paris, you must provide your measurements. As the following screenshot shows, there are two different paths through the application here, depending on whether your measurements are already on file with the tailor.&lt;br/&gt;&lt;p style="text-align: center"&gt; &lt;img src="http://www.useit.com/alertbox/listerouge-buttons-as-headings.gif" alt="Partial screenshot of ordering process for custom-tailored shirts at www.listerouge-paris.com" height="521" width="529" /&gt;&lt;/p&gt;&lt;br/&gt; Our test user clicked incessantly on the &lt;em&gt;New Customer&lt;/em&gt; button to indicate that he was indeed a new customer. Unfortunately, this screen element was not a button at all, but rather a non-clickable heading.&lt;br/&gt;&lt;br/&gt;He was the only user to test this site because he encountered it during a task in which users could choose a site to visit (usually from a search listing). In this case, the user eventually overcame the confusion and proceeded to enter his measurements. If we had tested more users, a small percentage would have likely failed at this point. Each small error in dialog design reduces usage only by a small amount, but most UIs contain &lt;strong&gt;bundles of errors&lt;/strong&gt;, and the &lt;strong&gt;number of lost customers adds up&lt;/strong&gt;.&lt;br/&gt;&lt;br/&gt;As an aside, this screen also uses radio buttons incorrectly. In theory, all five choices are mutually exclusive, which does call for radio buttons. But in the user's mental model of the workflow, there are actually &lt;em&gt;two issues&lt;/em&gt; here: (a) new vs. old customers, and (b) how to provide the measurements for your situation. You should use a single set of radio buttons only when users will choose between options for a single issue.&lt;br/&gt;&lt;br/&gt;So, in the case above, a better design would first ask users to decide the new/existing customer question, and then reveal the relevant radio buttons for the option they choose.&lt;br/&gt;&lt;h2&gt;2. Inconsistency&lt;/h2&gt;&lt;br/&gt;Non-standard GUI controls are a special case of the general problem of inconsistent design.Confusion results when applications use different words or commands for the same thing, or when they use the same word for multiple concepts in different parts of the application. Similarly, users are confused when things move around, violating &lt;strong&gt;display inertia&lt;/strong&gt;.&lt;br/&gt;&lt;br/&gt;Using the &lt;strong&gt;same name for the same thing in the same place&lt;/strong&gt; makes things easy.&lt;br/&gt;&lt;br/&gt;Remember the double-D rule: &lt;strong&gt;differences are difficult&lt;/strong&gt;.&lt;br/&gt;&lt;br/&gt;Another example from our current study: Expedia pops up a two-month calendar view when users specify the departure or return date for a trip. The composite screenshot below was taken in February and shows what happens when you want to book a trip that starts on March 10 and ends on March 15.&lt;br/&gt;&lt;p style="text-align: center"&gt; &lt;img src="http://www.useit.com/alertbox/expedia-inconsistent-calendar.gif" alt="Two screenshots of date-selection widget (calendar) at Expedia.com" height="219" width="798" /&gt;&lt;/p&gt;&lt;br/&gt;In the second pop-up, the month of March has moved to the left, leaving room for April to appear on the right. This may seem like a convenient shortcut, since there's no way the user would want a February return date when traveling out in March.&lt;br/&gt;&lt;br/&gt;In reality, however, the user is looking for March 15 in the same spot where it appeared in the first pop-up calendar: in the right-most column.&lt;br/&gt;&lt;br/&gt;In our testing, the inconsistent placement of the months in the second pop-up caused confusion and delays, but users ultimately figured it out. We tested only a few users with this site, but if you observe this kind of &lt;strong&gt;almost-miss error&lt;/strong&gt; in user testing, it's usually a sign that a few users will make the mistake for real during actual use.&lt;br/&gt;&lt;br/&gt;Booking the wrong return date can have disastrous consequences — customers could arrive at the airport without a ticket for their expected flight. If a site has &lt;a href="http://www.useit.com/alertbox/20031208.html" title="Alertbox: Confirmation Email, Automated Customer Service Email, and Transactional Messages" class="old"&gt;good confirmation emails&lt;/a&gt;, users might discover the problem before departure, but even that will cause aggravation and expensive customer support calls to resolve the situation.&lt;br/&gt;&lt;br/&gt;Even if people eventually use the calendar correctly, it &lt;strong&gt;takes more time to ponder the inconsistent design&lt;/strong&gt; than the time users save by not having to click the next-month button for April departures.&lt;br/&gt;&lt;br/&gt;The shortcut that moves the months around saves time only for very frequent users who learn how to efficiently operate this part of the UI. So, an application for professional travel agents should probably use Expedia's calendar design. A site targeting average consumers should not.&lt;br/&gt;&lt;h2&gt;3. No Perceived Affordance&lt;/h2&gt;&lt;br/&gt;"Affordance" means what you can do to an object. For example, a checkbox affords turning on and off, and a slider affords moving up or down. "&lt;em&gt;Perceived&lt;/em&gt; affordances" are actions you understand just by &lt;em&gt;looking&lt;/em&gt; at the object, before you start using it (or feeling it, if it's a physical device rather than an on-screen UI element). All of this is discussed in Don Norman's book &lt;a href="http://www.amazon.com/dp/0465067107?tag=useitcomusablein" title="Amazon.com: info about this book" class="old"&gt;&lt;cite&gt;The Design of Everyday Things&lt;/cite&gt;&lt;/a&gt;. Perceived affordances are especially important in UI design, because all screen pixels afford clicking — even though nothing usually happens if you click. There are so many visible things on a computer screen that users don't have time for a &lt;strong&gt;mine sweeping&lt;/strong&gt; game, clicking around hoping to find something actionable. (Exception: &lt;a href="http://www.useit.com/alertbox/children.html" title="Alertbox: Kids' Corner - Website Usability for Children" class="old"&gt;small children&lt;/a&gt; sometimes like to explore screens by clicking around.)&lt;br/&gt;&lt;br/&gt;&lt;strong&gt;Drag-and-drop&lt;/strong&gt; designs are often the worst offenders when it's not apparent that something can be dragged or where something can be dropped. (Or what will happen if you do drag or drop.) In contrast, simple checkboxes and command buttons usually make it painfully obvious what you can click.&lt;br/&gt;&lt;br/&gt;Common &lt;strong&gt;symptoms&lt;/strong&gt; of the lack of perceived affordances are:&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;Users say, "What do I do here?"&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Users don't go near a feature that would help them.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;A profusion of screen text tries to overcome these two problems. (Even worse are verbose, multi-stage instructions that disappear after you perform the first of several actions.)&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;When I tested some of the first Macintosh applications in the mid-1980s, users were often stumped by the empty screen that appeared when they launched, say, MacWrite. &lt;em&gt;What do I do here&lt;/em&gt;, indeed. The first step was supposed to be to create a new document, but that command was not shown anywhere in the otherwise highly visible Macintosh UI unless you happened to pull down the &lt;em&gt;File&lt;/em&gt; menu. Later application releases opened up with a blank document on the screen, complete with an inviting, blinking insertion point that provided the perceived affordance for "start typing."&lt;br/&gt;&lt;h3&gt;3.a. Tiny Click Targets&lt;/h3&gt;&lt;br/&gt;An associated problem here is click targets that are so small that users miss and click outside the active area. Even if they originally perceived the associated affordance correctly, users often change their mind and start believing that something isn't actionable because they think they clicked it and nothing happened. (Small click zones are a particular problem for &lt;a href="http://www.useit.com/alertbox/seniors.html" title="Alertbox: Usability for Senior Citizens" class="old"&gt;old users&lt;/a&gt; and users with motor skill &lt;a href="http://www.useit.com/alertbox/20011111.html" title="Alertbox: Beyond Accessibility - Treating Users with Disabilities as People" class="old"&gt;disabilities&lt;/a&gt;.)&lt;br/&gt;&lt;h2&gt;4. No Feedback&lt;/h2&gt;&lt;br/&gt;One of the most basic guidelines for improving a dialog's usability is to provide feedback:&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;Show users the system's current state.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Tell users how their commands have been interpreted.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Tell users what's happening.&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;Sites that keep quiet leave users guessing. Often, they guess wrong. (For an example of the problems with poor feedback, see the screenshot of VW's car configurator toward the bottom of my recent &lt;a href="http://www.useit.com/alertbox/user-skills.html" title="Alertbox: User Skills Improving, But Only Slightly" class="old"&gt;article reporting on our current round of testing&lt;/a&gt;: Because users couldn't tell which tire was selected, they had trouble designing their preferred car.)&lt;br/&gt;&lt;h3&gt;4.a. Out to Lunch Without a Progress Indicator&lt;/h3&gt;&lt;br/&gt;A variant on lack of feedback is when a system fails to notify users that it's taking a long time to complete an action. Users often think that the application is broken, or they start clicking on new actions. If you can't meet the recommended &lt;a href="http://www.useit.com/papers/responsetime.html" title="Jakob Nielsen: Response Times - The Three Important Limits" class="old"&gt;response time limits&lt;/a&gt;, say so, and keep users informed about what's going on:&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;If a command takes more than &lt;strong&gt;1 second&lt;/strong&gt;, show the &lt;strong&gt;"busy" cursor&lt;/strong&gt;. This tells users to hold their horses and not click on anything else until the normal cursor returns.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;If a command takes more than &lt;strong&gt;10 seconds&lt;/strong&gt;, put up an explicit &lt;strong&gt;progress ba&lt;/strong&gt;r, preferably as a percent-done indicator (unless you truly can't predict how much work is left until the operation is done).&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;h2&gt;5. Bad Error Messages&lt;/h2&gt;&lt;br/&gt;Error messages are a special form of feedback: they tell users that something has gone wrong. We've known the &lt;a href="http://www.useit.com/alertbox/20010624.html" title="Alertbox: Error Message Guidelines" class="old"&gt;guidelines for error messages&lt;/a&gt; for almost 30 years, and yet many applications still violate them. The most common guideline violation is when an error message simply says something is wrong, without &lt;strong&gt;explaining why and how&lt;/strong&gt; the user can fix the problem. Such messages leave users stranded.&lt;br/&gt;&lt;br/&gt;Informative error messages not only help users fix their current problems, they can also serve as a &lt;strong&gt;teachable moment&lt;/strong&gt;. Typically, users won't invest time in reading and learning about features, but they will spend the time to understand an error situation if you explain it clearly, because they want to overcome the error.&lt;br/&gt;&lt;br/&gt;On the Web, there's a second common problem with error messages: people overlook them on most Web pages because they're buried in masses of junk. Obviously, having simpler pages is one way to alleviate this problem, but it's also necessary to &lt;strong&gt;make error messages more prominent&lt;/strong&gt; in Web-based UIs.&lt;br/&gt;&lt;h2&gt;6. Asking for the Same Info Twice&lt;/h2&gt;&lt;br/&gt;Users shouldn't have to enter the same information more than once. After all, computers are pretty good at remembering data. The only reason users have to repeat themselves is because programmers get lazy and don't transfer the answers from one part of the app to another.&lt;br/&gt;&lt;h2&gt;7. No Default Values&lt;/h2&gt;&lt;br/&gt;Defaults help users in many ways. Most importantly, defaults can:&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;speed up&lt;/strong&gt; the interaction by freeing users from having to specify a value if the default is acceptable;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;teach, by example&lt;/strong&gt;, the type of answer that is appropriate for the question; and&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;strong&gt;direct novice users&lt;/strong&gt; toward a safe or common outcome, by letting them accept the default if they don't know what else to do.&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;Because I used Liste Rouge Paris as a bad example under Mistake #1a, I thought I'd play nice and use them as a good example here. The tailor offers 15 different collar styles (among many other options) for people ordering custom-designed shirts. Luckily, they also provide good defaults for each of the many choices. In testing, this proved helpful to our first-time user, because the defaults steered him toward the most common or appropriate options when he didn't have a particular preference.&lt;br/&gt;&lt;br/&gt;&lt;p style="text-align: center"&gt; &lt;img src="http://www.useit.com/alertbox/listerouge-default-collar.jpg" alt="Partial screenshot of customization screen in the shirt design application on www.listerouge-paris.com" height="158" width="434" /&gt;&lt;br/&gt;&lt;em&gt;Dialog to specify your shirt's collar on www.listerouge-paris.com (3 of 15 styles shown).&lt;/em&gt;&lt;br/&gt;&lt;h2&gt;8. Dumping Users into the App&lt;/h2&gt;&lt;br/&gt;Most Web-based applications are &lt;a href="http://www.useit.com/alertbox/20021125.html" title="Alertbox: Ephemeral Web-Based Applications" class="old"&gt;ephemeral applications&lt;/a&gt; that users encounter as a by-product of their surfing. Even if users deliberately seek out a new app, they often approach it without a &lt;strong&gt;conceptual model&lt;/strong&gt; of how it works. People don't know the workflow or the steps, they don't know the expected outcome, and they don't know the basic concepts that they'll be manipulating.For traditional applications, this is less of a problem. Even if someone has never used PowerPoint, they've probably seen a slide presentation. Thus, a new PowerPoint user will typically have at least a bare-bones understanding of the application before double-clicking the icon for the first time.&lt;br/&gt;&lt;br/&gt;For mission-critical applications, you can often assume that most users have tried the app many times before. You can also often assume that new users will get some training before seeing the UI on their own. At the minimum, they'll usually have nearby colleagues who can give them a few pointers on the basics. And a good boss will give new hires some background info as to &lt;em&gt;why&lt;/em&gt; they're being asked to use the application and &lt;em&gt;what&lt;/em&gt; they're supposed to accomplish with it.&lt;br/&gt;&lt;br/&gt;Sadly, none of these aides to understanding apply for most Web-based applications. They don't even apply for many ephemeral &lt;a href="http://www.nngroup.com/reports/intranet/guidelines/applications.html" title="Nielsen Norman Group report: Intranet Usability Guidelines, vol. 10 - Killer Apps" class="new"&gt;intranet applications&lt;/a&gt;.&lt;br/&gt;&lt;br/&gt;Usability suffers when users are dumped directly into an application's guts without any set-up to give them an idea of what's going to happen. Unfortunately, most &lt;a href="http://www.useit.com/alertbox/9710a.html" title="Alertbox: How Users Read on the Web" class="old"&gt;users won't read&lt;/a&gt; a lot of upfront instructions, so you might have to offer them in a short bulleted list or through a single image that lets them grok the application's main point in one view.&lt;br/&gt;&lt;br/&gt;As an example, our test user who was trying to order a custom-tailored shirt was highly confused when the first screen in Hamilton Shirts' "Create Your Shirt" process displayed a fully designed shirt with an "Add to Bag" button. This screen mixed two metaphors: a configurator and an e-commerce product screen.&lt;br/&gt;&lt;p style="text-align: center"&gt; &lt;img src="http://www.useit.com/alertbox/hamilton-create-your-shirt-step1.jpg" alt="Screenshot of the upper part of the screen for the first step of Hamilton's shirt-design application" height="382" width="500" /&gt;&lt;/p&gt;&lt;br/&gt;This is a case where a default value isn't helpful: people who want to design their own shirt are unlikely to want to buy a pre-designed shirt on the first screen.&lt;br/&gt;&lt;br/&gt;(This screen also suffers from Mistake #1: non-standard GUI controls. In addition to its non-standard drop-down selection menus in a tabbed dialog that doesn't &lt;a href="http://www.useit.com/alertbox/tabs.html" title="Alertbox: Tabs, Used Right" class="old"&gt;look enough like tabs&lt;/a&gt;, the screen has a non-standard way of paging through additional fabric swatches. Users are less likely to understand how to select fabrics when the controls are presented in this manner.)&lt;br/&gt;&lt;br/&gt;Our test user never understood the process of designing his own shirt on this site and ultimately took his business elsewhere.&lt;br/&gt;&lt;h2&gt;9. Not Indicating How Info Will Be Used&lt;/h2&gt;&lt;br/&gt;The worst instance of forcing users through a workflow without making the outcome clear is worth singling out as a separate mistake: Asking users to enter information without telling them what you'll use it for.A classic example is the "nickname" field in the registration process for a bulletin board application. Many users don't realize the nickname will be used to identify them in their postings for the rest of eternity — so they often enter something inappropriate.&lt;br/&gt;&lt;br/&gt;As another example, we once tested an e-commerce site that smacked users with a demand for their ZIP code before they could view product pages. This was a big turn-off and many users left the site due to privacy concerns. People hate snoopy sites. An alternative design worked much better: It explained that the site needed to know the user's location so it could state shipping charges for the very heavy products in question.&lt;br/&gt;&lt;h2&gt;10. System-Centric Features&lt;/h2&gt;&lt;br/&gt;Too many applications expose their dirty laundry, offering features that reflect the system's internal view of the data rather than users' understanding of the problem space.In our current study, one user wanted to reallocate her retirement savings among various investments offered by her company's plan (for example, to invest more in bonds and less in stocks). She thought she did this correctly, but in fact she had changed only the allocation of &lt;em&gt;future additions&lt;/em&gt; to her retirement account. Her existing investments remained unchanged.&lt;br/&gt;&lt;br/&gt;As far as the mutual funds company is concerned, new investments and current investments are treated differently. Reallocating future additions means changing the funds they'll buy when the employer transfers money into the account. Reallocating current investments means selling some of the holdings in existing mutual funds and using the proceeds to buy into other funds.&lt;br/&gt;&lt;br/&gt;The key insights here?&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;Our test user didn't have this distinction between new and old money; she simply wanted her retirement savings allocated according to her revised investment strategy.&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;Even users who understand the distinction between new and old money might prefer to treat their retirement savings as a single unit rather than make separate decisions (and issue separate commands) for the new and old money.&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;It would probably be better to offer a prominent feature for changing the entire account's allocation, and use &lt;a href="http://www.useit.com/alertbox/progressive-disclosure.html" title="Alertbox: Progressive Disclosure" class="old"&gt;progressive disclosure&lt;/a&gt; to reveal expert settings for users who want to make the more detailed distinction between the two classes of money.&lt;br/&gt;&lt;h2&gt;Bonus Mistake: &lt;em&gt;Reset&lt;/em&gt; Button on Web Forms&lt;/h2&gt;&lt;br/&gt;This mistake relates to Web forms, but because so many applications are rich in forms, I'll mention it here: It's almost always &lt;a href="http://www.useit.com/alertbox/20000416.html" title="Alertbox: Reset and Cancel Buttons" class="old"&gt;wrong to have a &lt;em&gt;Reset&lt;/em&gt; button on a Web form&lt;/a&gt;.The reset button clears the user's entire input and returns the form to its pristine state. Users would want that only if they're repeatedly completing the same form with completely different data, which almost never happens on websites. (Call center operators are a different matter.)&lt;br/&gt;&lt;br/&gt;Making it easy for users to &lt;strong&gt;destroy their work in a single click&lt;/strong&gt; violates one of the most basic usability principles, which is to respect and protect the user's work at almost any cost. (That's why you need &lt;strong&gt;confirmation dialogs&lt;/strong&gt; for the most destructive actions.)&lt;br/&gt;&lt;h2&gt;Design Competition&lt;/h2&gt;&lt;br/&gt;Have you designed a great application UI for a substantial real-life problem? Submit it for the &lt;a href="http://www.nngroup.com/reports/applications/design/" title="Nielsen Norman Group: list of requirements for submitting an application for the design competition" class="new"&gt;Application Design Annual 2008&lt;/a&gt; and get a chance to win the glory you deserve. Deadline: &lt;strong&gt;February 29&lt;/strong&gt;.&lt;br/&gt;&lt;h2&gt;Learn More&lt;/h2&gt;&lt;br/&gt;Full-day courses    at the   &lt;a href="http://www.nngroup.com/events/" title="Conference program and list of usability training tutorials" class="new"&gt;Usability Week 2008 conference&lt;/a&gt; in New York, San Francisco, London, and Melbourne:&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://www.nngroup.com/events/tutorials/application_usability.html" title="Nielsen Norman Group: detailed course outline for training tutorial" class="new"&gt;Application Usability 1: Page-Level Building Blocks for Feature Design&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://www.nngroup.com/events/tutorials/application_usability2.html" title="Nielsen Norman Group: detailed course outline for training tutorial" class="new"&gt;Application Usability 2: Dialog and Workflow Design&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;&lt;h3&gt;Other Top-10 Lists&lt;/h3&gt;&lt;br/&gt;&lt;ul&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://www.useit.com/alertbox/9605.html" title="Updated list of the top-10 mistakes of all time" class="new"&gt;Worst Web design mistakes&lt;/a&gt; of all time&lt;br/&gt;Summary based on the main elements of the other lists&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://www.useit.com/alertbox/high-roi.html"&gt;10 High-Profit Redesign Priorities&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://www.useit.com/alertbox/film-ui-bloopers.html"&gt;Usability in the Movies&lt;/a&gt; — Top 10 Bloopers&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://www.useit.com/alertbox/20031110.html" title="Alertbox Nov. 2003" class="old"&gt;Most violated homepage guidelines&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://www.useit.com/alertbox/20020512.html" title="Alertbox May 2002" class="old"&gt;Top homepage usability guidelines&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://www.useit.com/alertbox/991003.html" title="Alertbox Oct. 1999" class="old"&gt;Good deeds in Web design&lt;/a&gt;&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://www.useit.com/alertbox/designmistakes.html" title="Alertbox Oct. 2005" class="old"&gt;Web design mistakes&lt;/a&gt; (2005)&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://www.useit.com/alertbox/20031222.html" title="Alertbox Dec. 2003" class="old"&gt;Web design mistakes&lt;/a&gt; (2003)&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://www.useit.com/alertbox/20021223.html" title="Alertbox Dec. 2002" class="old"&gt;Web design mistakes&lt;/a&gt; (2002)&lt;br/&gt;With cartoons&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://www.useit.com/alertbox/990530.html" title="Alertbox May 1999" class="old"&gt;Web design mistakes&lt;/a&gt; (1999)&lt;/li&gt;&lt;br/&gt;	&lt;li&gt;&lt;a href="http://www.useit.com/alertbox/9605a.html" title="Alertbox May 1996" class="old"&gt;Web design mistakes&lt;/a&gt; (1996)&lt;/li&gt;&lt;br/&gt;&lt;/ul&gt;&lt;br/&gt;See also: &lt;a href="http://www.useit.com/alertbox/20030825.html" title="Alertbox Aug. 2003" class="old"&gt;Usability 101: Introduction to Usability&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-3492657547822467454?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/3492657547822467454/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=3492657547822467454' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3492657547822467454'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3492657547822467454'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/03/top-10-application-design-mistakes.html' title='【转】Top-10 Application-Design Mistakes'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-4393782376715596657</id><published>2008-03-17T03:56:00.000-07:00</published><updated>2010-03-05T20:28:00.251-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='software'/><category scheme='http://www.blogger.com/atom/ns#' term='person'/><title type='text'>好牛的妈妈</title><content type='html'>今天看邮件列表， 有一个人在问学习C++需要多大的勇气。 这种问题好像已经腐朽了， 不过回答的人还是很多。&lt;br/&gt;忽然又问兄台这样回答&lt;br/&gt;&lt;blockquote&gt; &lt;font style="background-color: #ffffff" color="#0000ff"&gt; 给个现实的例子。俺五十八岁的老母亲退休在家，这个月刚学会Ja&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;span style="background-color: #ffffff"&gt; &lt;/span&gt;&lt;/font&gt;&lt;wbr style="background-color: #ffffff"&gt;&lt;/wbr&gt;&lt;font style="background-color: #ffffff" color="#0000ff"&gt;va的SWT和JFace，现在开始摸Python&lt;/font&gt;&lt;wbr style="background-color: #ffffff"&gt;&lt;/wbr&gt;&lt;font style="background-color: #ffffff" color="#0000ff"&gt;，每天一两个小程序玩得不亦乐乎，她&lt;/font&gt;&lt;br/&gt;&lt;font style="background-color: #ffffff" color="#0000ff"&gt; 老人家说：“就是那么回事，搞明白基本的机制，剩下都是语法细节&lt;/font&gt;&lt;wbr style="background-color: #ffffff"&gt;&lt;/wbr&gt;&lt;font style="background-color: #ffffff" color="#0000ff"&gt;，用的时候到书上查，到网上google就可以了”&lt;/font&gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;p id="1eox" class="ArwC7c ckChnd"&gt;&lt;font style="background-color: #ffffff" color="#0000ff"&gt;&lt;br/&gt;&lt;/font&gt;&lt;br/&gt;&lt;blockquote&gt;&lt;font style="background-color: #ffffff" color="#0000ff"&gt; 呵呵，恕我直言，只不过是一门编程语言，别搞得和苦行僧出家一样&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;span style="background-color: #ffffff"&gt; &lt;/span&gt;&lt;/font&gt;&lt;wbr style="background-color: #ffffff"&gt;&lt;/wbr&gt;&lt;font style="background-color: #0000ff" color="#0000ff"&gt;&lt;span style="background-color: #ffffff"&gt;，如果真的那么痛苦不学也罢，学了也不容易学好:)&lt;/span&gt;&lt;/font&gt;&lt;/blockquote&gt;&lt;br/&gt;&lt;p class="Ih2E3d"&gt;&lt;font color="#0000ff"&gt;&lt;br/&gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;&lt;font color="#0000ff"&gt;&lt;font color="#000000"&gt;真是好牛的妈妈！！厉害厉害。 &lt;/font&gt;&lt;/font&gt;&lt;br/&gt;&lt;br/&gt;另外， 论坛的地址是： &lt;a href="http://groups.google.com/group/pongba/topics?hl=zh-CN" target="_blank"&gt;http://groups.google.com/group&lt;wbr&gt;&lt;/wbr&gt;/pongba/topics?hl=zh-CN&lt;/a&gt;有兴趣可以看一看。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-4393782376715596657?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/4393782376715596657/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=4393782376715596657' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4393782376715596657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/4393782376715596657'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/03/blog-post.html' title='好牛的妈妈'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-7769028767395569246</id><published>2008-03-01T08:20:00.000-08:00</published><updated>2010-03-05T20:27:59.955-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='compilar'/><category scheme='http://www.blogger.com/atom/ns#' term='c++ parser open source compilar'/><title type='text'>恶毒的C＋＋语法</title><content type='html'>这几天在写毕设相关的东西， 得写一个C＋＋的解析器(parser), 发现开源的这个东西不多， 而且都还挺复杂。 拿到一份文法表， 光文法就有14页之巨。看了这些东西才真正的体会到C＋＋语法的恶毒。 真是巨大阿。。。&lt;br/&gt;&lt;br/&gt;如果有幸能完成， 一定开源给大家用。 写这个东西真是个硬差使。&lt;br/&gt;&lt;br/&gt;还是LISP的语法简单阿。。。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-7769028767395569246?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/7769028767395569246/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=7769028767395569246' title='1 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/7769028767395569246'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/7769028767395569246'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/03/c.html' title='恶毒的C＋＋语法'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-5406404068129988102</id><published>2008-02-27T15:31:00.000-08:00</published><updated>2010-03-05T20:27:59.904-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='生活'/><category scheme='http://www.blogger.com/atom/ns#' term='emerald'/><category scheme='http://www.blogger.com/atom/ns#' term='情怀'/><title type='text'>刹车</title><content type='html'>在爱情上， 丫头就像是刹车， 我就像油门， 缺一不可。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-5406404068129988102?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/5406404068129988102/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=5406404068129988102' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5406404068129988102'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/5406404068129988102'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/02/blog-post_27.html' title='刹车'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-3597250326182704351</id><published>2008-02-26T11:06:00.000-08:00</published><updated>2010-03-05T20:27:59.880-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='抄袭 知识产权'/><category scheme='http://www.blogger.com/atom/ns#' term='中国人'/><title type='text'>《大国崛起》中的录像抄袭</title><content type='html'>经常发现国内的电视节目引用别的地方，特别是电脑游戏中的录像， 但是却不说明出处。 今天看到大国崛起04里面，关于英国水晶宫的那段录像，想起这就是《文明IV》中的录像， 为什么引用的时候不能加个注脚呢？这种事情似乎凤凰电视台做的很好， 在锵锵三人行里面不管是引用照片还是录像，都会在右上角说明出处，尊重产权是一种意识，正式因为英国的专利政策，才会刺激那么多发明家去发明，正是这些发明， 才使得英国在工业时代的世界中站在第一的位置。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-3597250326182704351?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/3597250326182704351/comments/default' title='帖子评论'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=3087498582530016155&amp;postID=3597250326182704351' title='0 条评论'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3597250326182704351'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/3087498582530016155/posts/default/3597250326182704351'/><link rel='alternate' type='text/html' href='http://kzjeef-learning.blogspot.com/2008/02/blog-post_26.html' title='《大国崛起》中的录像抄袭'/><author><name>Anson</name><uri>http://www.blogger.com/profile/13640137916199839414</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-3087498582530016155.post-4537099262216917557</id><published>2008-02-20T15:32:00.000-08:00</published><updated>2010-03-05T20:27:59.863-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='日常琐事'/><title type='text'>最后一个假期结束了</title><content type='html'>两天的时间走遍了所有曾经想起的地方，即将离开这个熟悉的地方和那熟悉的心情，以后的心情绝对不同，走向社会。。&lt;br/&gt;&lt;br/&gt;走过以前走过的路，翻过的山，藏过得山窝窝，跑过的石头堆，还有植树节挖过的树坑，现在看有那么近，可以以前想的很遥远吧。&lt;br/&gt;&lt;br/&gt;长大了。。。奋斗！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/3087498582530016155-4537099262216917557?l=kzjeef-learning.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://kzjeef-learning.blogspot.com/feeds/4537099262216917557/co
