<?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-33878916</id><updated>2011-12-02T02:15:38.190-08:00</updated><category term='linux 紧急恢复'/><category term='python 计算机语言'/><category term='python'/><category term='unix linux tools'/><category term='utf-8 gbk code page unicode'/><category term='programming'/><category term='算法 algorithms'/><category term='ubuntu 7.04 azureus vmware'/><category term='计算机科学，入门'/><category term='UML OOA／D'/><category term='algorithm design'/><category term='linux c 汇编 i386'/><category term='algorithms'/><category term='算法'/><category term='c++'/><category term='算法设计'/><title type='text'>补锅匠的小屋</title><subtitle type='html'>What gets us into trouble is not what we don't know, it's what we know for sure that just ain't so.
                                                               - Mark Twain</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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>31</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-33878916.post-878012462727057941</id><published>2011-12-01T18:37:00.001-08:00</published><updated>2011-12-02T02:15:06.461-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Excerpt from “Computers，People and Programming”，chapter 1 of 《Programming--principles and practice using C++》</title><content type='html'>General characteristics of software:&lt;br /&gt;correctness,reliability,relevant,good designed,affordable and maintainability&lt;br /&gt;&lt;br /&gt;Keep in mind features which can be appreciated from outside by non-programmers;&lt;br /&gt;&lt;br /&gt;The structures of program must be such that other programmers who didn't write it can understand it and make changes to it.To be maintainable,a program must be simple relative to its requirements and code must directly represent the idears expressed.Complexity can be intrinsic to a problem, but can also arise from&amp;nbsp; poor expressions of idear in code.&lt;br /&gt;&lt;br /&gt;Programming is understanding. If we can program a task,we fully understand it.Conversely,we can see programming as part of the effort to thoroughly understand a problem.A program is a precise representation of our understanding of a topic.&lt;br /&gt;&lt;br /&gt;4 stages of programming&lt;br /&gt;&lt;ul&gt;&lt;li&gt;analyze:what's the problem? what does the user want? what does the user need? what can the user afford? what reliability do they need?&lt;/li&gt;&lt;li&gt;design: how to solve the problem? what's the overall structure of the problem? which parts dose it consist of? How do they communicate with each other? How dose the system communicate with its user?&lt;/li&gt;&lt;li&gt;programming: express the solution of the problem in code. Write the code in a way that meet all the constraints(time,space,money,reliability and etc).The code must be correct and maintainable.&lt;/li&gt;&lt;li&gt;testing:make sure the system work correctly under all circumstances required by systematically trying it out.&lt;/li&gt;&lt;/ul&gt;We learn from experiences and modify our behaviour based on what we learn. So the crucial concept here is feedback.&lt;br /&gt;Try to explain the design ideas to others&amp;nbsp; before coding, no matter weather they know software and business or not.&lt;br /&gt;And while coding, from time to time, to think about the problem, articulate the idears or problems to others.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Much of problem solving is recognizing a known problem and apply a known solution technique.&lt;br /&gt;&lt;br /&gt;This book focuse on expressing idears clearly in code.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-878012462727057941?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/878012462727057941/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=878012462727057941' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/878012462727057941'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/878012462727057941'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2011/12/excerpt-from-helloworld-chapter-2-of.html' title='Excerpt from “Computers，People and Programming”，chapter 1 of 《Programming--principles and practice using C++》'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-4087833713316314534</id><published>2011-11-15T00:46:00.001-08:00</published><updated>2011-11-15T01:23:30.909-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='计算机科学，入门'/><title type='text'>Structure and Interpretation of Computer Program初探</title><content type='html'>本书是麻省理工计算机科学的入门级教材&lt;br /&gt;昨天花了点时间读了序言和作者的两版前言，感觉只能看懂初版的前言，篇幅不长，几乎字字珠玑，摘录如下：&lt;br /&gt;&lt;ul&gt;&lt;li&gt; a computerlanguage is not just a way of getting a computer to perform operationsbut rather that it is a novel formal medium for expressing ideas aboutmethodology.  Thus, programs must be written for people to read, andonly incidentally for machines to execute.&amp;nbsp;&lt;/li&gt;&lt;li&gt;the essential material to be addressed by a subject at this level isnot the syntax of particular programming-language constructs, norclever algorithms for computing particular functions efficiently, noreven the mathematical analysis of algorithms and the foundations ofcomputing, but rather the techniques used to control the intellectualcomplexity of large software systems.&lt;/li&gt;&lt;li&gt; students should have command of the major techniques for controllingcomplexity in a large system.&lt;/li&gt;&lt;li&gt;``computer science'' is not a science and that its significance haslittle to do with computers.  The computer revolution is a revolutionin the way we think and in the way we express what we think.  Theessence of this change is the emergence of what might best be called&lt;em&gt;procedural epistemology&lt;/em&gt; -- the study of the structure ofknowledge from an imperative point of view, as opposed to the moredeclarative point of view taken by classical mathematical subjects.Mathematics provides a framework for dealing precisely with notions of``what is.''  Computation provides a framework for dealing preciselywith notions of ``how to.'' &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt; 所谓控制复杂度的主要技术包括：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;We control complexity by building abstractions that hidedetails when appropriate.&lt;/li&gt;&lt;li&gt;  We control complexity by establishingconventional interfaces that enable us to construct systems bycombining standard, well-understood pieces in a ``mix and match'' way.&lt;/li&gt;&lt;li&gt;We control complexity by establishing new languages for describing adesign, each of which emphasizes particular aspects of the design anddeemphasizes others.&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;几乎与目录中各章对应起来：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;过程抽象&lt;/li&gt;&lt;li&gt;数据抽象、&lt;/li&gt;&lt;li&gt;模块、对象及状态&lt;/li&gt;&lt;li&gt;元语言（metalinguistic ？）抽象&lt;/li&gt;&lt;li&gt;用寄存器机器计算&lt;/li&gt;&lt;/ol&gt;从前言的字里行间，可以看出作者对LISP/Scheme的激赏；只是时至今日，该门课程所使用的语言已经换成了Python，由此可见，理论与现实间的差距还是巨大的。&lt;br /&gt;&lt;br /&gt;该门课程的视频在&lt;a href="http://ocw.mit.edu/courses/electrical-engineering-and-computer-science/6-001-structure-and-interpretation-of-computer-programs-spring-2005/video-lectures/" target="_blank"&gt;这里&lt;/a&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/33878916-4087833713316314534?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/4087833713316314534/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=4087833713316314534' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/4087833713316314534'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/4087833713316314534'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2011/11/structure-and-interpretation-of.html' title='Structure and Interpretation of Computer Program初探'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-7106416062440774808</id><published>2011-11-11T00:44:00.001-08:00</published><updated>2011-11-11T01:38:24.636-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='c++'/><title type='text'>C++之父的妙论</title><content type='html'>因为喜欢&lt;a href="http://mindhacks.cn/" target="_blank"&gt;pongba&lt;/a&gt;博客的缘故，去他csdn上的&lt;a href="http://blog.csdn.net/pongba" target="_blank"&gt;老巢&lt;/a&gt;拜访了一下；看了其中关于c++语言的几篇博文，颇有些旧情复炽。顺手捎带，拜读了Bill Venners对Bjarne Stroustroup的&lt;a href="http://www.artima.com/intv/goldilocks.html" target="_blank"&gt;访谈&lt;/a&gt;（一共4部分），一读之下，惊为天人。&lt;br /&gt;Bjarne的语言朴实无华，但是味道极深，有时需要慢慢品味，趁自己还记得住，赶紧贴几句：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size: small;"&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Century Gothic&amp;quot;;"&gt;&lt;strong&gt;Just because you don’t need OOP or GP for a project doesn’t imply that C is better for that.&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;&lt;strong&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Century Gothic&amp;quot;; font-size: 12pt;"&gt;&lt;span style="font-family: inherit; font-weight: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;strong&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Century Gothic&amp;quot;; font-size: 12pt;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/b&gt;&lt;strong&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Century Gothic&amp;quot;; font-size: 12pt;"&gt;&lt;span style="font-family: inherit; font-weight: normal;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/strong&gt;&lt;b&gt;&lt;strong&gt;&lt;span lang="EN-US" style="font-family: &amp;quot;Century Gothic&amp;quot;; font-size: 12pt;"&gt;&lt;/span&gt;&lt;/strong&gt;"I wouldn't like to build a tool that could only do what I had been able to imagine for it."&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;Design tools don't give you much feedback, so therefore I tend towards the view that you should build a smaller system and grow it into a bigger one. There is a rule of thumb that says that every successful large system is a development of a slightly smaller working system. You apply that rule recursively.&amp;nbsp;&lt;strong&gt;&lt;span lang="EN-US" style="font-size: 12pt;"&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;"I wouldn't like to build a tool that could only do what I had been able to imagine for it."&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;li&gt;&lt;b&gt;To quote Kristen Nygaard, programming is understanding. The meaning is: if you don't understand something, you can't code it, and you gain understading trying to code it.&amp;nbsp;&amp;nbsp;&lt;/b&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div style="font-family: inherit;"&gt;&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;从访谈内容来看，在兼顾开发效率和运行效率上，c++似乎做得不错。&lt;/div&gt;&lt;div style="font-family: inherit;"&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-7106416062440774808?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/7106416062440774808/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=7106416062440774808' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/7106416062440774808'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/7106416062440774808'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2011/11/c.html' title='C++之父的妙论'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-8599660339520287170</id><published>2011-11-09T23:48:00.000-08:00</published><updated>2011-11-11T00:44:05.448-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='算法'/><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><title type='text'>TAOCP Vol1 3rd Edtion 之蜻蜓点水</title><content type='html'>阅读Knuth的书有一种愉悦感，即使是前言，即便仅限于前言；&lt;br /&gt;老先生的技术水准当如泰山北斗，非我辈可以置喙，可贵的是：文笔清晰流畅，态度诚恳，间或还小幽默一句，读之不禁让人莞尔；&lt;br /&gt;本书内容囊括非数值类算法分析中最为经典的部分，计划出7卷，目前出到第四卷（以分册形式）；&lt;br /&gt;老先生写作本书的目的有二：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;是对算法各领域的知识进行总结，属参考手册类（reference）&lt;/li&gt;&lt;li&gt; 作为教材使用，配备了大量习题和答案（出乎我的意料）&lt;/li&gt;&lt;/ul&gt;全书总体结构如下&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li style="color: red;"&gt;基本算法&lt;/li&gt;&lt;li style="color: red;"&gt;半数值算法&lt;/li&gt;&lt;li style="color: red;"&gt;排序和搜索&lt;/li&gt;&lt;li style="color: magenta;"&gt;组合算法&lt;/li&gt;&lt;li&gt;句法算法&lt;/li&gt;&lt;li style="color: blue;"&gt;语言理论&lt;/li&gt;&lt;li&gt;&lt;span style="color: blue;"&gt;编译器&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&amp;nbsp;前言特别指出：本书对读者的数学水平要求不高，掌握初等代数即可应付本书的大部分内容；此外，只对编程感兴趣的读者可将数学推导及证明略去不看，但要记住结论；&lt;a href="http://mindhacks.cn/" target="_blank"&gt;pongba&lt;/a&gt;似乎不赞同这一说法；&lt;br /&gt;可将本书第一卷视为3类教材的合集：数据结构、离散数学以及机器语言编程（是描述计算机体系结构、还是介绍MIX编程，还是兼而有之？&lt;span style="color: red;"&gt;存疑&lt;/span&gt;）&lt;br /&gt;&lt;br /&gt;由前言后的流程图可知：本卷为&lt;span style="color: red;"&gt;必读&lt;/span&gt;卷，是后续各卷的基石，后续各卷则可独立阅读。&lt;br /&gt;&lt;br /&gt;此外，本书的独特之处在于：算法描述采用的计算机语言为MIX（后续有MMIX，见第一卷第1分册），以一种虚拟计算机为模型构建，可谓胆大包天、匠心独具；回顾起来，这一抽象还真摆脱了对历史的依附。在其所罗列的6点理由中，我尤其对a与f印象深刻，a充分点出计算机语言在人与机器间所处的两难境地（虽然此处是站在机器和算法的角度来表述的，换言之，在语言的设计中，不是简单的选队、站队问题，而是复杂的折中、权衡问题）；f则是历史更迭的必然产物；&lt;br /&gt;&lt;br /&gt;本书习题含有各种标记：0~50的分数、M/HM标记以及箭头&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-8599660339520287170?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/8599660339520287170/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=8599660339520287170' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/8599660339520287170'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/8599660339520287170'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2011/11/taocp-vol1-3rd-edtion.html' title='TAOCP Vol1 3rd Edtion 之蜻蜓点水'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-7377103364402083741</id><published>2011-11-02T19:49:00.000-07:00</published><updated>2011-11-02T19:53:37.643-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='算法'/><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><title type='text'>《Introduction to Algorithms 3rd Edition》结构初探</title><content type='html'>从前言来看，作者的雄心很大：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;自诩为“自助餐”和“大杂烩”，可成为大学任意学习阶段的教材（从本科的算法入门到研究生的算法设计）&lt;/li&gt;&lt;li&gt;算法手册&lt;/li&gt;&lt;/ol&gt;对读者的要求：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;初具编程经验&lt;/li&gt;&lt;li&gt;具备一定数学知识（本书第1和第8部分的数学知识+初等代数知识）&lt;/li&gt;&lt;/ul&gt;特点：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;内容丰富&lt;/li&gt;&lt;li&gt;注重数学证明和算法分析&lt;/li&gt;&lt;li&gt;采用伪代码，但强调：易于以其他计算机语言实现&lt;/li&gt;&lt;li&gt;内容的编排上，将问题域和算法设计技术混排&lt;/li&gt;&lt;li&gt;有专门的网站，同时公布了部分习题的答案&lt;/li&gt;&lt;li&gt;网上还有教学录像(2nd ed)和高手的&lt;a href="http://www.catonmat.net/"&gt;学习笔记网站&lt;/a&gt;&amp;nbsp;&amp;nbsp; &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/33878916-7377103364402083741?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/7377103364402083741/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=7377103364402083741' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/7377103364402083741'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/7377103364402083741'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2011/11/introduction-to-algorithms-3rd-edition.html' title='《Introduction to Algorithms 3rd Edition》结构初探'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-946528905139225785</id><published>2011-11-01T20:02:00.000-07:00</published><updated>2011-11-02T06:39:48.812-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='算法'/><category scheme='http://www.blogger.com/atom/ns#' term='algorithms'/><title type='text'>《Algorithms 4th Edition》 和《Algorithms in C++ 3rd Edition》结构初探</title><content type='html'>以下内容根据两书的前言和目录进行总结&lt;br /&gt;首先谈谈二者的共同点：&lt;br /&gt;1、都声称罗列了计算机科学中最为重要的算法&lt;br /&gt;2、数学内容有限（自含推导或标记为不在本书范围之内进行论述）&lt;br /&gt;3、使用实际代码，而非伪代码&lt;br /&gt;4、均有相关网站&lt;br /&gt;再说说二者间的差异&lt;br /&gt;1、按作者自己的表述，《algorithms》更适合作为入门教程；而《algorithms in C++》则更高级一些，可以适应多种教学(数据结构和算法导论、算法设计、甚至编程)和学习要求（作为参考大全）；&lt;br /&gt;2、从目录上看，前者更聚焦，后者内容更多，范围更广&lt;br /&gt;3、前者以java实现，后者以C++实现&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/33878916-946528905139225785?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/946528905139225785/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=946528905139225785' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/946528905139225785'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/946528905139225785'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2011/11/algorithms-4th-edition-algorithms-in-c.html' title='《Algorithms 4th Edition》 和《Algorithms in C++ 3rd Edition》结构初探'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-5279593363930497727</id><published>2011-11-01T18:20:00.001-07:00</published><updated>2011-11-01T19:48:11.263-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='算法设计'/><category scheme='http://www.blogger.com/atom/ns#' term='algorithm design'/><title type='text'>《The Algorithm Design Manual》结构初探</title><content type='html'>&lt;div id="article_body"&gt;    &lt;div id="article_content"&gt; 本书是“算法设计”方面的手册，分为两部分：&lt;br /&gt;1、&lt;span style="color:red;"&gt;如何分析算法，如何设计算法&lt;/span&gt;&lt;br /&gt;2、参考大全：针对现有算法问题按类别给出具体解法，附带的网址链接指向以各种计算机语言对算法的具体实现&lt;br /&gt;作者强调：设计算法最为关键的环节在于&lt;span style="color:red;"&gt;建模&lt;/span&gt;&lt;br /&gt;描述算法时采用：贴近解题者的思维方式，试错、调整，验证。。。，比之一般教材似乎更易于理解&lt;br /&gt;对数学证明和推导只是非正式的讨论，尽可能多的采用真实代码（这两点似乎与Nutshell相似），另外强化了作业和练习&lt;br /&gt;总结：似乎需要对算法和数学知识有一点了解，并非算法的入门书籍，可作为参考书籍，但不能作为阅读主线。&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-5279593363930497727?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/5279593363930497727/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=5279593363930497727' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/5279593363930497727'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/5279593363930497727'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2011/11/algorithm-design-manual.html' title='《The Algorithm Design Manual》结构初探'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-2054575580031056497</id><published>2011-11-01T18:12:00.001-07:00</published><updated>2011-11-01T19:46:48.860-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='算法 algorithms'/><title type='text'>《algorithms in a nutshell》结构初探</title><content type='html'>&lt;strong&gt;缘起&lt;/strong&gt;：为了一偿学习算法的夙愿，把手头以算法为主题的书籍搜罗了一下，准备逐一研读一下各书的序言和目录，再着手制订具体的学习计划——初步的想法还是以各书为主线、相互穿插着进行主题阅读，同时结合读书笔记、习题和实际代码，以期达到好的效果；&lt;br /&gt;具体书单如下：&lt;br /&gt;Introduction to Algorithms 3rd Edition (CLRS)&lt;br /&gt;Algorithms In A Nutshell&lt;br /&gt;Algorithms in C++&lt;br /&gt;Algorithms&lt;br /&gt;The Art of Computer Programming&lt;br /&gt;The Algorithm Design Manual&lt;br /&gt;正文：&lt;br /&gt;昨天阅读了Algorithms in A Nutshell的前言，浏览了其目录，试总结如下：&lt;br /&gt;读者对象应为有经验的程序员，阅读目的有二：&lt;br /&gt;1、发现解决问题的算法，或&lt;br /&gt;2、改善现有算法性能&lt;br /&gt;本书遵循原则有四：&lt;br /&gt;1、本书试图针对程序员每天所面临的&lt;span style="color:red;"&gt;实际问题&lt;/span&gt;而提供以&lt;span style="color:red;"&gt;真实代码&lt;/span&gt;实现的&lt;span style="color:red;"&gt;真实算法&lt;/span&gt;；&lt;br /&gt;2、将算法与实际问题分离&lt;br /&gt;3、对数学点到为止，不做深究&lt;br /&gt;4、提供性能测试方法，为算法性能的数学分析提供感性支持&lt;br /&gt;本书分为4部分：&lt;br /&gt;1、了解算法所需的数学知识导论&lt;br /&gt;2、算法介绍（即本书主体部分）&lt;br /&gt;3、进阶阅读：其它方法失效时的应对策略、方法论&lt;br /&gt;4、性能测试方法&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-2054575580031056497?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/2054575580031056497/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=2054575580031056497' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/2054575580031056497'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/2054575580031056497'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2011/11/algorithms-in-nutshell.html' title='《algorithms in a nutshell》结构初探'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-235964497910065566</id><published>2007-11-07T00:03:00.000-08:00</published><updated>2007-11-08T00:18:27.389-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux c 汇编 i386'/><title type='text'>i386体系下Linux系统C语言与汇编的对应关系</title><content type='html'>1、intel的i386堆栈在入栈时的栈顶寄存器sp是由高地址向低地址增长&lt;br /&gt;2、c语言函数的局部变量，经过查阅汇编代码，实际是通过sp-x来分配，由基指针寄存器bp-n(n为偏移量)来定位存取的&lt;br /&gt;3、main入口的堆栈排列（从高地址到低地址直至SP分别为：char **env, char **argv和int argc以及main的offset）&lt;br /&gt;4、在c语言调用函数时，参数按从右至左的顺序入栈，即最左边的参数在栈顶（SP）&lt;br /&gt;&lt;br /&gt;另外，&lt;a href="http://linuxgazette.net/issue84/hawk.html"&gt;这里&lt;/a&gt;是一篇好文章，gazette了不起！对c语言的main函数怎么在linux下面跑起来说得很透彻。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-235964497910065566?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/235964497910065566/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=235964497910065566' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/235964497910065566'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/235964497910065566'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2007/11/i386linuxc.html' title='i386体系下Linux系统C语言与汇编的对应关系'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-2252858927441909862</id><published>2007-08-28T01:31:00.000-07:00</published><updated>2007-08-28T01:59:33.949-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python 计算机语言'/><title type='text'>Learning Python 第2版 读后乱谈</title><content type='html'>应该说，书的构思还是很精致的，由简入繁，层层深入，对语言各种特点的理解也很准确（从作者的描述可以推断出他们对python实现源码是很熟悉的），描述地很细致，甚至到了琐碎的地步（也许掌握python就是要对这些细节都很了解），但是这也给我造成了一种印象：无聊，不引人入胜；无疑，这不是技术类书籍的必备要素，但一本500多页的书如果味同嚼蜡的话，读起来带来的痛苦可想而知。有时候，我在想python是不是该瘦身了，简化点功能，内涵（语言特性）少一些，外延（模块）大一点，让自己更容易上手、掌握，把繁杂的工作交给模块？也许作为一个通用的计算机语言，语言特性的繁复是不可避免的吧？当然，要不要掌握python所有主流的语言特性还是因人而异的，这也能算是python灵活性的一种体现吧。。。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-2252858927441909862?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/2252858927441909862/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=2252858927441909862' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/2252858927441909862'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/2252858927441909862'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2007/08/learning-python-2.html' title='Learning Python 第2版 读后乱谈'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-1269165744226996166</id><published>2007-08-07T08:01:00.000-07:00</published><updated>2007-08-07T08:20:56.084-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='python'/><title type='text'>python中递归import的问题</title><content type='html'>见《learning Python》第2版18章288页的描述&lt;br /&gt;个人感觉from在import中最好避免使用，虽然可以少敲几个字符，可是带来麻烦的可能性却非常高：1，递归 2，污染namespace,容易引起混淆&lt;br /&gt;对于下述的例子：&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;recur1.py:&lt;/span&gt;&lt;br /&gt;x=1&lt;br /&gt;import recur2&lt;br /&gt;y=2&lt;br /&gt;print 'hello!'&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;recur2.py：&lt;/span&gt;&lt;br /&gt;from recur1 import x&lt;br /&gt;print 'hello from recur2!'&lt;br /&gt;from recur1 import y&lt;br /&gt;&lt;br /&gt;直接import recur1和直接运行recur2.py都会报错&lt;br /&gt;直接import recur2和直接运行recur1.py却不会&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;记住：&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;无论import还是from都会触发对尚未执行的该module的执行，python可以容忍一个尚未完整的namespace，却绝对不能容忍对一个不完整namespace中未运行的变量的引用：这就是import和from为什么会因为递归而可能产生冲突的原因&lt;/li&gt;&lt;li&gt;运行一个程序和在该程序里面由于嵌套获递归的原因而重新import它是不同的，后者仍然需要被执行&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/33878916-1269165744226996166?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/1269165744226996166/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=1269165744226996166' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/1269165744226996166'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/1269165744226996166'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2007/08/pythonimport.html' title='python中递归import的问题'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-3206380050253021802</id><published>2007-05-16T00:24:00.000-07:00</published><updated>2007-05-16T00:45:44.454-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML OOA／D'/><title type='text'>Applying UML and Patterns 第五章</title><content type='html'>演进化的需求&lt;br /&gt;观点一：需求由模糊到清晰是个演进的过程&lt;br /&gt;观点二：需求管理是发现、记录、组织和跟踪需求的系统性的方法&lt;br /&gt;观点三：需求分类 FURPS+方法&lt;br /&gt;观点四：UP的需求制品包括：用例模型、补充说明、术语表（包含数据字典的功能）、愿景描述、业务规则（通指凌驾于本应用系统之上的行业标准或法律法规）&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/33878916-3206380050253021802?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/3206380050253021802/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=3206380050253021802' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/3206380050253021802'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/3206380050253021802'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2007/05/applying-uml-and-patterns_16.html' title='Applying UML and Patterns 第五章'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-6213567728250167784</id><published>2007-05-08T07:52:00.000-07:00</published><updated>2007-05-08T10:09:40.789-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML OOA／D'/><title type='text'>Applying UML and Patterns第四章</title><content type='html'>inception&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;不是&lt;/span&gt;需求阶段&lt;br /&gt;&lt;br /&gt;项目策划阶段要关注的事情：&lt;br /&gt;在inception（初始）阶段，需要以受众（投资方、用户、开发方）为关注对象，对项目的整体愿景、范围、business case（侧重于成本、收益方面以及技术、组织可行性的分析报告）、需求（功能性和非功能性的）、可行性（技术、时间、资源（人、财、物）和市场等诸方面）、潜在风险及应对进行&lt;span style="font-weight: bold;"&gt;统筹考虑&lt;/span&gt;，&lt;span style="font-weight: bold;"&gt;达成共识&lt;/span&gt;，并决定项目是否继续实施；&lt;br /&gt;做什么？需求、范围&lt;br /&gt;为什么要做？愿景和business case&lt;br /&gt;能做好吗？风险&lt;br /&gt;怎么做？下次迭代的计划和对elaboration（细化）阶段时间、成本的粗略估计&lt;br /&gt;&lt;br /&gt;本阶段制品（&lt;span style="font-weight: bold;"&gt;举例&lt;/span&gt;）：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;共同愿景和business case（描述总体目标和制约）&lt;/li&gt;&lt;li&gt;用例模型（只对其中的%10做详细描述和分析，一般为文字形式）&lt;/li&gt;&lt;li&gt;补充需求说明（针对会影响整体架构的非功能性的需求）&lt;/li&gt;&lt;li&gt;术语（在业务领域与客户达成&lt;span style="font-weight: bold;"&gt;一致&lt;/span&gt;的手段之一）&lt;/li&gt;&lt;li&gt;风险列表和风险管理计划&lt;/li&gt;&lt;li&gt;原型和概念验证目的的代码（澄清需求和验证技术假设）&lt;/li&gt;&lt;li&gt;迭代计划（针对&lt;span style="font-weight: bold;"&gt;下一次&lt;/span&gt;迭代）&lt;/li&gt;&lt;li&gt;阶段计划和软件开发计划（对elaboration（细化）阶段时间、成本的粗略估计）&lt;/li&gt;&lt;li&gt;开发建议（对项目UP阶段和制品定制的描述）&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;要点：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;只选择真正有价值的制品文档&lt;/li&gt;&lt;li&gt;制品在初始阶段是模糊的、粗略的，随着迭代而逐步精化&lt;/li&gt;&lt;li&gt;强调&lt;span style="font-weight: bold;"&gt;思考的过程&lt;/span&gt;而非文档&lt;/li&gt;&lt;li&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/33878916-6213567728250167784?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/6213567728250167784/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=6213567728250167784' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/6213567728250167784'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/6213567728250167784'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2007/05/applying-uml-and-patterns_08.html' title='Applying UML and Patterns第四章'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-4576282805967523740</id><published>2007-05-06T00:36:00.000-07:00</published><updated>2007-05-06T00:47:40.553-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML OOA／D'/><title type='text'>Applying UML and Patterns 第三章</title><content type='html'>Case Studies&lt;br /&gt;&lt;ol&gt;&lt;li&gt;本书的重点关注应用软件开发中的&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;应用逻辑层&lt;/span&gt;的OOA/D，对UI层主要关注该层和其他层的接口设计；&lt;/li&gt;&lt;li&gt;本书在迭代式开发过程的描述中（三次迭代），层层深入，逐步引入分析和设计的相关主题；&lt;/li&gt;&lt;li&gt;本书的开发案例一个是POS机软件，一个是Monopoly游戏（类似于大富翁）；&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-4576282805967523740?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/4576282805967523740/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=4576282805967523740' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/4576282805967523740'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/4576282805967523740'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2007/05/applying-uml-and-patterns_06.html' title='Applying UML and Patterns 第三章'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-7488334585689138127</id><published>2007-05-04T07:54:00.000-07:00</published><updated>2007-05-04T10:23:01.977-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML OOA／D'/><title type='text'>Applying UML and Patterns 第二章</title><content type='html'>Iterative,Evolutionary and Agile&lt;br /&gt;本章论述了传统瀑布开发模式的严重缺陷，强调了迭代开发、敏捷开发的优势和重要性&lt;br /&gt;为适应软件开发领域充满变数和难以预测的固有特性，迭代式开发出现了；&lt;br /&gt;迭代式开发的每次迭代成果都是以&lt;span style="font-weight: bold;"&gt;最终实际产品的一个子集&lt;/span&gt;为实现目标，通过迭代与迭代之间不断向用户、出资方和设计者，编码人员以及测试人员等这些产品受众处收集&lt;span style="font-weight: bold;"&gt;反馈&lt;/span&gt;信息（诸如需求、设计、编码等方面的变化和改进要求），将这些变化纳入到后续的迭代过程中加以适应和实现；这样，每次迭代都是在上次迭代成果基础上的一次&lt;span style="font-weight: bold;"&gt;有价值&lt;/span&gt;的改进和递增，&lt;span style="font-weight: bold;"&gt;渐进式&lt;/span&gt;地逼近最终的&lt;span style="font-weight: bold;"&gt;真实需求和产品&lt;/span&gt;；&lt;br /&gt;UP(统一过程)是迭代演进式开发的一种，具体分为4个阶段（phrases）,inception,elaboration,construction,transition，每个阶段都包含了由固定时间间隔（一般不超过6周）的多次迭代，每次迭代都涵盖软件开发的几乎每个领域（discipline），如业务建模、分析、设计、编码、测试、部署、配置管理以及项目管理等等；&lt;br /&gt;&lt;ol&gt;&lt;li&gt;inception，可行性研究阶段，并最终决定实施还是下马；&lt;/li&gt;&lt;li&gt;elaboration，每次迭代从用例中挑选对整体结构有重要意义的、最具商业价值的以及高风险的少量加以分析，并实现和测试这些用例中的关键部分（&lt;span style="font-weight: bold;"&gt;场景&lt;/span&gt;？），多次迭代后初步形成最终系统的架构雏形，规避了高风险因素，识别了大部分需求和作用范围，同时对项目有了更实际的估计；&lt;/li&gt;&lt;li&gt;construction，通过多次迭代逐步实现用例中其他低风险和相对简单的部分，并准备部署&lt;/li&gt;&lt;li&gt;transition，beta测试和部署&lt;/li&gt;&lt;/ol&gt;综上所述，UP是&lt;span style="font-weight: bold;"&gt;风险驱动&lt;/span&gt;和&lt;span style="font-weight: bold;"&gt;客户驱动&lt;/span&gt;的迭代式开发过程，首先解决的是软件系统架构性和高风险的部分；另外需要注意的是：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;每个阶段中迭代对不同领域的关注程度是不同的，例如：elaboration阶段的迭代会侧重于业务建模、分析、设计，而construction阶段的迭代则会偏重于实现和测试多一些；&lt;/li&gt;&lt;li&gt;前面迭代开发中所强调的对反馈的收集和对变化的适应在上述4个阶段的迭代中是&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;贯彻始终&lt;/span&gt;的&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;本书的结构是基于UP的，侧重于前两个阶段，并且elaboration的迭代为3次，每次侧重于分析设计的一个不同层次（为不同对象分配职责，运用模式设计，架构分析和框架设计）&lt;br /&gt;&lt;br /&gt;敏捷建模：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;必须建模&lt;br /&gt;&lt;/li&gt;&lt;li&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;/li&gt;&lt;/ul&gt;敏捷UP：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;强调采用尽可能少但有价值的UP实践和工作制品；&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;/ul&gt;&lt;br /&gt;思考：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;UP中架构性和高风险用例的挑选不好拿捏，书中也不打算给出这方面的实例&lt;/li&gt;&lt;li&gt;敏捷建模对编码人员的要求变高了，要求有设计能力，更多的所谓“简单”设计权力都下放到了编码期间；同时，由于对设计文档角色的弱化和建模覆盖面的缩小，对代码的可读性有了更高的要求，同时是不是需要加强注释的规范化？有没有技术上的可行性？doxygen？&lt;/li&gt;&lt;li&gt;收集反馈在迭代式开发中至关重要，我们的pp和reqm／rd人员需要说服用户去适应这种变化&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-7488334585689138127?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/7488334585689138127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=7488334585689138127' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/7488334585689138127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/7488334585689138127'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2007/05/applying-uml-and-patterns.html' title='Applying UML and Patterns 第二章'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-3143813787419937993</id><published>2007-05-03T01:03:00.000-07:00</published><updated>2007-05-03T01:59:43.443-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu 7.04 azureus vmware'/><title type='text'>升级ubuntu 7.04 问题</title><content type='html'>我的本本原来跑的是ubuntu 6.06，要直接升级到7.04会有很大的风险，慎重起见，先在一个分区上直接装了7.04体验一下，新系统的速度给了我深刻的印象；不由自主地决定升级；&lt;br /&gt;&lt;ol&gt;&lt;li&gt;首先查阅文档，建议都是先升到6.10, 再从6.10升级到7.04；&lt;/li&gt;&lt;li&gt;升到6.10时，（update-manager -c）,升级程序提示删除一些程序包，我居然同意了，没想到删了很多我的最爱：mplayer、azureus、amule等等，很麻烦，害得我又补装了半天&lt;/li&gt;&lt;li&gt;升到7.04时(update-manager -d)，比较棘手的是azureus，总是跑一会就崩，再运行就怎么也起不来了；后来把java设成gcj就好了（ &lt;span style="font-weight: bold;"&gt;sudo update-alternatives --config java &lt;/span&gt;），我还是倾向于sun的java，所以就改了azureus的shell，把java换成gcj版本的java&lt;/li&gt;&lt;li&gt;另一个问题就是grub，7.04的2.6.20的内核不知道怎么把分区认成/dev/sda&lt;span style="color: rgb(255, 0, 0);"&gt;x&lt;/span&gt;格式，而2.6.15版本则还是认hdx，这个很折腾人（主要是grub命令kernel的root参数设置），升级的时候给了一个uuid好像是为了解决这个问题的，可是在我的机器上面好像不灵，而且即使grub的menu.lst你设对了，还有个问题：checkfs在扫描/etc/fstab的时候会挂掉，因为fstab中分区的设备（hda或者sda）只能适应一种内核，如果下次启动的时候你换个内核就出事了（听起来没必要，是不是？我是因为vmware的缘故）&lt;/li&gt;&lt;li&gt;接着就是vmware了，升到7.04，vmware的module要重新生成，本来还想偷懒（向上面说的）用低版本的内核起，结果发现这个所谓的低版本也是6.10带过来的，对应的头文件在6.10的源里面都没有，而且这个该死的内核是用gcc4.03编译生成的，而目前机器里面只有4.04的gcc，vmware要求编译module和内核的编译器版本要严格匹配,同时头文件版本和内核版本也要完全相同，只好试试2.6.20的内核，编译器是4.10，和我机器上面的gcc版本匹配，头文件在源里面也有，可是vmware似乎还没有正式支持2.6.20的内核，幸亏&lt;a href="http://kb.barnoid.com/?p=18"&gt;这篇文章&lt;/a&gt;救了我，module顺利编译成功，我的windows虚拟机顺畅运转！&lt;/li&gt;&lt;/ol&gt;第5点具体做法我转载一下：&lt;br /&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div class="post-content"&gt;You need to -&lt;br /&gt;* Make a backup of /usr/lib/vmware/modules/source/vmmon.tar&lt;br /&gt;* Untar /usr/lib/vmware/modules/source/vmmon.tar into a temporary directory&lt;br /&gt;* Modify vmmon-only/include/compat_kernel.h, and change:&lt;br /&gt;&lt;br /&gt;#define __NR_compat_exit __NR_exit&lt;br /&gt;static inline _syscall1(int, compat_exit, int, exit_code);&lt;br /&gt;&lt;br /&gt;to:&lt;br /&gt;&lt;br /&gt;#define __NR_compat_exit __NR_exit&lt;br /&gt;#if LINUX_VERSION_CODE &lt; KERNEL_VERSION(2,6,19)&lt;br /&gt;static inline _syscall1(int, compat_exit, int, exit_code);&lt;br /&gt;#endif&lt;br /&gt;&lt;br /&gt;* Finally, tar the modified module source back up, and replace the vmmon.tar in /usr/lib/vmware/modules/source/&lt;br /&gt;&lt;pre&gt;&lt;/pre&gt;&lt;strong&gt; &lt;/strong&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-3143813787419937993?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/3143813787419937993/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=3143813787419937993' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/3143813787419937993'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/3143813787419937993'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2007/05/ubuntu-704.html' title='升级ubuntu 7.04 问题'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-6955574604044928237</id><published>2007-04-23T22:32:00.000-07:00</published><updated>2007-04-24T00:21:57.473-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UML OOA／D'/><title type='text'>applying UML and patterns 第一章</title><content type='html'>本书最重要的学习目标：为&lt;span style="font-weight: bold;"&gt;软件对象&lt;/span&gt;分配&lt;span style="font-weight: bold;"&gt;职责&lt;/span&gt;的技巧&lt;br /&gt;OOA:需求分析，弄清楚需求或者要解决的问题 ，具体做法：&lt;span style="font-weight: bold;"&gt;分析和识别现实世界业务领域的对象和概念，do the right thing&lt;/span&gt;&lt;br /&gt;OOD:提出满足需求的概念化的解决方案而非具体实现 ，具体做法：&lt;span style="font-weight: bold;"&gt;依据现实世界业务领域的对象和概念，识别出软件对象，围绕用例，找出方法和属性，do the thing right&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;OOA／D的大致步骤：&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;定义use case&lt;/li&gt;&lt;li&gt;定义业务模型&lt;/li&gt;&lt;li&gt;定义交互图&lt;/li&gt;&lt;li&gt;定义类图&lt;/li&gt;&lt;/ol&gt;其中，1，2属于OOA，3，4属于OOD;第3步，在初步确定软件类的前提下，围绕着&lt;span style="font-weight: bold;"&gt;用例&lt;/span&gt;找出相关的&lt;span style="font-weight: bold;"&gt;方法&lt;/span&gt;和&lt;span style="font-weight: bold;"&gt;属性&lt;/span&gt;，是行之有效的；&lt;br /&gt;&lt;br /&gt;需要指出的是：在OOA和OOD中都可以借助UML来描述类或对象，这是容易引起混淆的地方！&lt;br /&gt;为此，在本书中设定：业务领域内的类称为概念类，设计领域内的类称为软件类，实现代码中的类称为实现类；概念类是软件类产生的依据，但2者没有严格的对应关系，软件类的取舍由设计者基于实现和需求来权衡，但软件类的命名常与现实业务模型中的概念类相同或相近似，这主要是为了便于设计者或编程人员理解业务领域和设计之间的关系。&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-6955574604044928237?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/6955574604044928237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=6955574604044928237' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/6955574604044928237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/6955574604044928237'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2007/04/applying-uml-and-patterns.html' title='applying UML and patterns 第一章'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-6982574039422149596</id><published>2007-02-24T05:47:00.000-08:00</published><updated>2007-02-24T06:12:42.478-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='utf-8 gbk code page unicode'/><title type='text'>utf-8 和gbk，code page、显示乱码的思考</title><content type='html'>utf-8是unicode的一种实现方式,为ubuntu linux所采用&lt;br /&gt;code page是把非unicode字符和unicode字符集中字符对应起来的一个对照表，mount对vfat的选项就提供了code page&lt;br /&gt;gbk主要是微软对code page的扩展（加入了存在于现实中而又没有被纳入GB2312的字符）&lt;br /&gt;mount命令对vfat分区有一个iocharset选项，将其设置为utf8则意味着将&lt;span style="color: rgb(255, 0, 0);"&gt;8&lt;/span&gt;位字符转换为16位unicode编码时采用utf-8方式来实现&lt;br /&gt;其实，code page和utf-8解决的是正常显示这个问题的两个方面：&lt;br /&gt;iocharset处理的是8位字符编码在unicode环境下正常显示的问题&lt;br /&gt;code page解决的是尚未被unicode纳入的某个区域字符在unicode环境下显示的问题（只是过渡！）&lt;br /&gt;应该说，绝大多数汉字的unicode编码和gbk或者国标编码是重叠和一致的；但是由于&lt;span style="color: rgb(255, 0, 0);"&gt;实现方式&lt;/span&gt;的区别，（比如utf-8）也会影响最终的解码结果，从而会影响最终的&lt;span style="color: rgb(255, 0, 0);"&gt;显示&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-6982574039422149596?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/6982574039422149596/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=6982574039422149596' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/6982574039422149596'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/6982574039422149596'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2007/02/utf-8-gbkcode-page.html' title='utf-8 和gbk，code page、显示乱码的思考'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-6779095607499567482</id><published>2007-02-24T04:51:00.000-08:00</published><updated>2007-02-26T19:07:44.819-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux 紧急恢复'/><title type='text'>ubuntu紧急恢复</title><content type='html'>下午在xp下面把本本的一个fat32分区删掉了，希望扩大ubuntu的硬盘空间；结果grub启动时报error code 22&lt;br /&gt;恢复步骤如下：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;从ubuntu 6.06 cd启动&lt;/li&gt;&lt;li&gt;在mnt目录下创建目录root，再把/dev/hdan这个原来的根设备mount起来&lt;/li&gt;&lt;li&gt;sudo -s&lt;/li&gt;&lt;li&gt;grub-install --root-directory=/mnt/root /dev/hda&lt;/li&gt;&lt;li&gt;reboot&lt;/li&gt;&lt;/ol&gt;重启后正常&lt;br /&gt;问题的原因很可能是因为删除了一个分区后引发/dev/hdan的n序号混乱（我的原根分区设备hda8现在就变成hda7），导致grub找不到根目录设备和内核；但是&lt;span style="color: rgb(255, 0, 0);"&gt;奇怪&lt;/span&gt;的是，我的fstab配置文件还是调整前的样子，系统mount后却没有什么问题,至少根目录mount的正确，没有发现像grub那样的惨剧！&lt;br /&gt;另外 ，&lt;a href="http://kuv-sisyphus.blogspot.com/index.html"&gt;Sisyphus&lt;/a&gt;建议了&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;更简单&lt;/span&gt;的方法，当然是在grub的shell下&lt;br /&gt;&lt;span style=""&gt;&lt;span style="font-size:100%;"&gt;解决方法:使用grub的命令,首先 root (hdX,Y),然后 setup (hdX),hdX指的是grub安装的磁盘,一般是hd0,Y表示linux分区的位置,如你安装在hda5,那么Y=4.你还可以通过"cat (hdX,Y)/路径"查看磁盘上的文件.比如"cat (hd0,5)/boot/grub/menu.lst",查看启动配置.&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-6779095607499567482?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/6779095607499567482/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=6779095607499567482' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/6779095607499567482'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/6779095607499567482'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2007/02/ubunt.html' title='ubuntu紧急恢复'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-7324993976547857462</id><published>2007-02-19T07:16:00.000-08:00</published><updated>2007-03-03T07:37:15.472-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='unix linux tools'/><title type='text'>学习unix和linux</title><content type='html'>最近一直在学习linux和unix方面的各种工具，这篇准备专门记录这方面的事情，算是流水帐吧！2月19号从&lt;a href="http://enterprise.linux.com/article.pl?sid=07/02/09/1918259&amp;from=rss"&gt;这里&lt;/a&gt;学到几个工具：&lt;span style="font-weight: bold;"&gt;strace&lt;/span&gt;/&lt;span style="font-weight: bold;"&gt;ltrace&lt;/span&gt;/&lt;span style="font-weight: bold;"&gt;hexdump&lt;br /&gt;&lt;br /&gt;tar&lt;/span&gt;&lt;span&gt;的-p开关，-C开关和-c以及-x开关&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;touch&lt;/span&gt;的&lt;span style="font-weight: bold;"&gt;-t&lt;/span&gt;开关与&lt;span style="font-weight: bold;"&gt;find&lt;/span&gt;配合的妙用&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;xargs&lt;/span&gt; 与&lt;span style="font-weight: bold;"&gt;find -exec&lt;/span&gt;的区别在于：前者知道其后的cmd&lt;span style="color: rgb(255, 0, 0);"&gt;最多&lt;/span&gt;可以带多少个参数，而后者一次只能一次操作一个参数,所以&lt;span style="font-weight: bold;"&gt;xargs&lt;/span&gt;可以有效降低命令执行的负载&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;xargs&lt;/span&gt;与&lt;span style="font-weight: bold;"&gt;find&lt;/span&gt;中&lt;span style="font-weight: bold;"&gt;-exec&lt;/span&gt;选项的区别在于前者可以一次操作x个参数（&lt;span style="font-weight: bold;"&gt;-n&lt;/span&gt;&lt;span style="font-style: italic;"&gt;x&lt;/span&gt;）&lt;br /&gt;处理带空格的文件名时，&lt;span style="font-weight: bold;"&gt;xargs&lt;/span&gt;会产生问题，因为其缺省分割符是空格，但gnu版本的&lt;span style="font-weight: bold;"&gt;-0&lt;/span&gt;选项与gnu版本&lt;span style="font-weight: bold;"&gt;find&lt;/span&gt;的&lt;span style="font-weight: bold;"&gt;-print0&lt;/span&gt;选项配合，可以以'\0'为分隔符，我试验了一下，的确如此，使用&lt;span style="font-weight: bold;"&gt;xargs&lt;/span&gt;的&lt;span style="font-weight: bold;"&gt;-d&lt;/span&gt;'\n'开关和find的&lt;span style="font-weight: bold;"&gt;-print&lt;/span&gt; 配合可以达到同样的目的；&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;xargs&lt;/span&gt;的&lt;span style="font-weight: bold;"&gt;-i&lt;/span&gt;选项指定由&lt;span style="font-weight: bold;"&gt;find&lt;/span&gt;传递过来参数在命令中的位置（缺省是在最后），参数本身由&lt;span style="font-weight: bold;"&gt;｛｝&lt;/span&gt;指代；&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;find&lt;/span&gt;的要点：&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;find&lt;/span&gt;就是一个&lt;span style="font-weight: bold;"&gt;逻辑表达式&lt;/span&gt;（由无数与／或／非组成）无论是筛选文件的一系列条件(如-name,-user,-newer,-inum...)还是相应的动作(-exec,-print,-ls,-xdev...)都是逻辑表达式的一部分，find会把指定路径下的文件逐一交给这一逻辑表达式来校验，遵从&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;短路原则&lt;/span&gt;：对&lt;span style="font-weight: bold;"&gt;与&lt;/span&gt;操作，碰到第一个false就返回，否则继续校验；对&lt;span style="font-weight: bold;"&gt;或&lt;/span&gt;操作，碰到第一个true就返回，否则继续校验；对find程序本身而言，它是不区分条件和动作的；&lt;br /&gt;&lt;br /&gt;find的&lt;span style="font-weight: bold;"&gt;-prune&lt;/span&gt;参数：&lt;br /&gt;这是比较浑人的一个知识点，主要有两点含义：&lt;br /&gt;&lt;/span&gt;&lt;ol&gt;&lt;li&gt;&lt;span&gt;总是返回true（当-depth参数存在时，本参数失效）&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span&gt;如果满足条件的文件是目录时，作为一个副作用，find会跳过目录内的内容（&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;即使把-prune取反，如”! -prune“，还是这样！&lt;/span&gt;）&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;span&gt;find . \! -type d -prune -o -ls这条命令的意图是列出当前目录下除目录外的所有类型，但实际输出为空，原因就是 &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;"."也是个路径&lt;/span&gt;，由于prune的副作用，当前路径会被跳过，所以输出为空；&lt;br /&gt;真正要达到愿意，需要这样：&lt;br /&gt;find . -type d \! -name "." -prune -o -ls&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;-wholename&lt;/span&gt;参数不对"/"和"."作特殊处理，认为这是路径的自然组成部分，和-prune搭配，可以很好的忽略对一些目录层级内容（不包括这些目录本身）的处理！&lt;br /&gt;例如：&lt;br /&gt;&lt;/span&gt; find . -xdev -wholename "./download/*/pollini/*" -prune -o -ls |grep -i pollini&lt;br /&gt;只会输出：&lt;br /&gt;./download/Chopin/pollini&lt;br /&gt;而该目录下的文件则被忽略，另外要指出，虽然中间的目录（Chopin）用*替代，但find还是顺利的找到，其实，目录层次再多点，全都用*替换，也没有问题！&lt;br /&gt;&lt;span&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/33878916-7324993976547857462?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/7324993976547857462/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=7324993976547857462' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/7324993976547857462'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/7324993976547857462'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2007/02/unixlinux.html' title='学习unix和linux'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-5461082206653773330</id><published>2007-02-12T22:29:00.000-08:00</published><updated>2007-02-12T23:04:21.626-08:00</updated><title type='text'>code reading 读后小结</title><content type='html'>早上终于把code reading看完，头绪很多，先把能想到的写下来，以后可以慢慢补充&lt;br /&gt;看代码方面：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;unix的一些工具软件一定要熟，像grep、find、sed、awk、perl，再有就是正则表达式&lt;/li&gt;&lt;li&gt;unix的编辑工具，vi、emacs&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt; 开发方面：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;熟练掌握开发工具，如gcc／gdb／gprofile／splint／ctag／cvs／make／automake／autoconf。。。&lt;/li&gt;&lt;li&gt;算法：考虑结合算法导论的书／录像和算法c实现以及knuth的巨著好好补补算法和数据结构&lt;/li&gt;&lt;/ol&gt;从最后一章作者的尝试可以看出，挫折是必然的，想解决问题，平和积极的心态是关键&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-5461082206653773330?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/5461082206653773330/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=5461082206653773330' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/5461082206653773330'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/5461082206653773330'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2007/02/code-reading.html' title='code reading 读后小结'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-5409669801261990406</id><published>2007-02-05T19:49:00.000-08:00</published><updated>2007-02-05T20:10:02.767-08:00</updated><title type='text'>ubuntu6.06设置中棘手问题的解决方案</title><content type='html'>最近在Sisyphus的鼓动下，终于把desktop迁移到linux下面，我选的是Ubuntu 6.06,下面是几个疑难问题的记录：&lt;br /&gt;1、pptpconfig的配置问题,vpn远程拨号，需要两边linux的/etc/ppp下的配置严格匹配，尤其是认证方式，以我当前机器的认证机制，需要加入require chap,而图形界面下在加密的tab面板里面什么都不要选，而在其余面板的pppd选项配置应为mtu 1404，解决大文件传输失败的问题；&lt;br /&gt;2、为解决ubuntu中iptables的配置问题（使用guarddog），nfs中debian系统配置需要固定的侦听端口：在Debian3.1下/etc/default/nfs-kernel-server中加入绑定端口的开关项，"-p xxxx"&lt;br /&gt;3、在gnome图形界面下执行sudo的程序是gksudo&lt;br /&gt;4、psi-translation好像有bug，安装后传输文件，psi就会崩溃&lt;br /&gt;5、解决vfat和ntfs中文乱码的方法：&lt;span style="font-size: 13px;"&gt;mount -t vfat /dev/xxx /mnt/xxx -o codepage=936,iocharset=utf8，NTFS是&lt;/span&gt;&lt;span style="font-size: 13px;"&gt;mount -t ntfs /dev/xxx /mnt/xxx -o iocharset=utf8&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/33878916-5409669801261990406?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/5409669801261990406/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=5409669801261990406' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/5409669801261990406'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/5409669801261990406'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2007/02/ubuntu606.html' title='ubuntu6.06设置中棘手问题的解决方案'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-7298933608704721376</id><published>2006-12-25T22:26:00.000-08:00</published><updated>2007-01-11T18:39:13.503-08:00</updated><title type='text'>《code reading》阅读笔记之四</title><content type='html'>第六章：&lt;br /&gt;大型软件开发项目的关注点：&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;编码规范&lt;/li&gt;&lt;li&gt;构建过程&lt;/li&gt;&lt;li&gt;测试流程&lt;/li&gt;&lt;li&gt;配置方法&lt;/li&gt;&lt;li&gt;版本控制&lt;/li&gt;&lt;li&gt;文档编写&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;gcc的-M选项可以产生源文件的详细依赖列表，包括头文件&lt;/p&gt;&lt;p&gt;给出了cvs的一些经典用法&lt;/p&gt;&lt;p&gt;项目特定工具的用法：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;生成构建时的配置信息或makefile&lt;/li&gt;&lt;li&gt;生成源代码&lt;/li&gt;&lt;li&gt;生成文档&lt;/li&gt;&lt;li&gt;作为测试产品性能的测试包，还可以集成到makefile里面&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;待深入研究的有：&lt;/p&gt;&lt;ol&gt;&lt;li&gt;错误消息的管理策略：见参考文档&lt;/li&gt;&lt;li&gt;断言的使用：检查输入、输出、前置、后置条件的合法性，编写测试用例&lt;/li&gt;&lt;li&gt;域语言的引入：见参考文档&lt;/li&gt;&lt;li&gt;cvs中关键字的使用&lt;/li&gt;&lt;/ol&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/33878916-7298933608704721376?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/7298933608704721376/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=7298933608704721376' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/7298933608704721376'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/7298933608704721376'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2006/12/code-reading.html' title='《code reading》阅读笔记之四'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-9038162754204775279</id><published>2006-11-27T22:05:00.000-08:00</published><updated>2006-12-08T00:37:15.472-08:00</updated><title type='text'>《code reading》阅读笔记之三</title><content type='html'>第四章，C数据结构&lt;br /&gt;&lt;ol&gt;&lt;li&gt;警惕for循环体&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;内部&lt;/span&gt;对循环条件变量的操作；&lt;/li&gt;&lt;li&gt;使用memset之类的函数时，对所操作内存的字节数最好不使用常量而使用sizeof;&lt;/li&gt;&lt;li&gt;使用memcpy函数时，源和目的内存重叠或者源和目的内存的类型不符时，其结果未定义，使用前必须额外验证已避免此类情况；同时，结合第2点，sizeof的参数应该取目的地址&lt;/li&gt;&lt;li&gt;尽量避免使用gets/strcpy/strcat/sprintf/vsprintf（容易导致缓存溢出的错误），用fgets/strncpy/strncat/snprintf/vsnprintf替换；&lt;/li&gt;&lt;li&gt;在循环的实现中，对范围采用不对称边界的校验策略，即包括下限（＝），小于上限&lt;/li&gt;&lt;li&gt;c语言中指针的一种用法很是让我&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;惊奇&lt;/span&gt;：用指针当数组用：struct vcol *pv = malloc(n*sizeof(struct vcol));cnt=&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;pv&lt;/span&gt;[xx].cnt;除了在内存中的实际分配机理与数组不同之外，如果在栈中直接声明该结构的数组的话，cnt=&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;pv&lt;/span&gt;[xx].cnt;这句在不同的情况下功能完全一样哦！而动态分配的情况下pv+=xx;cnt=pv-&gt;cnt;和上面那句话的作用也一样！换言之，动态分配的内存指针所指向的实际结构可以用数组形式来表征和操作（*就用一维数组来表征，**就用二维数组来表征,以此类推...）；&lt;/li&gt;&lt;li&gt;栈，LIFO，经常用来处理语言中的括号匹配／undo命令／中断；&lt;/li&gt;&lt;li&gt;抽象数据类型，ADT，通过提供一组接口将具体实现和使用隔离开来，对栈来说，重要的属性是&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;栈指针&lt;/span&gt;：表明下一个要入栈或出栈（注意：&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;二者是不同的&lt;/span&gt;！）的元素在栈中的位置，栈操作要注意的一个问题就是&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;上溢出&lt;/span&gt;和&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;下溢出&lt;/span&gt;；&lt;/li&gt;&lt;li&gt;队列，FIFO，经常用来处理两个软件系统间的交互（如gui应用程序和window系统之间、操作系统和收到的网络数据包之间）以及软硬件系统间的交互（网卡、硬盘、打印机的请求和操作系统之间）；基本操作有两个：&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;出队&lt;/span&gt;和&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;入队&lt;/span&gt;；基本属性有两个：&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;头指针&lt;/span&gt;（指向出队元素）和&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;尾指针&lt;/span&gt;（指向入队元素）；出队和入队时需要防止两种溢出：&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;入队&lt;/span&gt;时的&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;上溢出&lt;/span&gt;（队列满状态，针对数组实现，即尾指针＋1＝头指针），&lt;span style="color: rgb(0, 0, 0);"&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;出队&lt;/span&gt;时的&lt;/span&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;下溢出&lt;/span&gt;（队列空，即头尾指针相同）&lt;/li&gt;&lt;li&gt;maps：在能预先确定内容和数量的前提下，map可以用基于下标的数组来实现，以追求高的存取效率；提到了表格驱动编程，来避免大量的if；如用包含key和函数指针的数据结构数组来作字典，通过key的匹配来调用不同的函数（简单一点的可以省略函数指针，但一样是流程化的操作）；另外，数组包含元素的数量可以用sizeof(x)/sizeof(x[0])来表示，这是一个编译时已经确定的常量；&lt;/li&gt;&lt;li&gt;hash:对一动态集合，要求支持三种操作：插入、删除和搜索；当集合内元素少时，可直接采用数组实现；当集合的可能元素数量相当巨大时，需要运用hash函数产生&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;键&lt;/span&gt;，去确定相应&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;值&lt;/span&gt;；这样做的目的是用经济的空间以较小的代价来存取元素；hash要避免或者解决的问题是&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;碰撞&lt;/span&gt;：即两个元素产生同一个&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;键&lt;/span&gt;；&lt;/li&gt;&lt;li&gt;C语言的隐喻：a&gt;&gt;3等同于a/8; a&lt;&lt;3等同于a*8;a &amp; 7等同于a%8;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;对图而言，一直没有统一的实现，经常的实现方式有指针数组、链表等;鉴于在遍历图的元素时可能会出现循环，一个避免的手段时对已经访问过的节点置“已访问”的标志；&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-9038162754204775279?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/9038162754204775279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=9038162754204775279' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/9038162754204775279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/9038162754204775279'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2006/11/code-reading_27.html' title='《code reading》阅读笔记之三'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-6358522694857542561</id><published>2006-11-26T22:02:00.000-08:00</published><updated>2006-11-26T23:15:32.662-08:00</updated><title type='text'>《code reading》阅读笔记之二</title><content type='html'>第三章：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;volatile：表示该变量会被本程序之外的实体所使用，避免编译器对其存取操作做优化&lt;/li&gt;&lt;li&gt;char* a和char p[]的区别，p即代表该字符串的首地址，没有为其分配内存，只是一种&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;表征&lt;/span&gt;；而a是被分配的一个内存单元，其内容是一个指向某字符串的指针；&lt;/li&gt;&lt;li&gt;gdb中&lt;span style="font-weight: bold;"&gt;x&lt;/span&gt;后跟的参数是地址，即后面所跟表达式的&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;内容&lt;/span&gt;被当作&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;地址&lt;/span&gt;，打印的是内存中该地址处包含的内容（视格式不同）&lt;/li&gt;&lt;li&gt;struct中对bit field的应用，多半与硬件有关，还需要考虑大小编码的问题，即在内存中分布的问题：intel为小编码（little endian），高位在高地址（8位一个单位），低位在低地址，例如：0x12345678在内存中按地址从低到高排列的顺序应该是78 56 34 12；反之，大编码（big endian）如ibm power risc和motorola的cpu，则是高位在低地址，低位在高地址，在内存中按地址由&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;低地址到高地址&lt;/span&gt;的排列应该是12 34 56 78&lt;/li&gt;&lt;li&gt;union的应用之一：对同一组数据用两种方式来解释&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-6358522694857542561?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/6358522694857542561/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=6358522694857542561' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/6358522694857542561'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/6358522694857542561'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2006/11/code-reading_26.html' title='《code reading》阅读笔记之二'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-9026450207923522887</id><published>2006-11-23T17:22:00.000-08:00</published><updated>2006-11-26T16:58:33.221-08:00</updated><title type='text'>《code reading》阅读笔记之一</title><content type='html'>开始读第二章了，值得关注的有：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;编译器的告警开关全部打开，且对告警信息按照错误处理（gcc还有些告警选项是在优化开关打 开后才能生效，如警告使用了未初始化的变量就是这种情况，即使使用了-Wall也没用；我暂时得出的结论是打开-Wall -Wuninitialized -Werror -O1 -g会比较严谨；注意，gcc允许既带调试信息，同时加以优化！intel的编译器没有上述问题）&lt;/li&gt;&lt;li&gt;使用支持语言语法加亮的编辑器，更早的暴露代码的问题&lt;/li&gt;&lt;li&gt;代码的排版很重要，可以采用indent之类的工具，但对一些具体问题（如8个？的解决方案），可考虑手工排版:&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;越是复杂的语句，越要使语句的主干得到清晰的展现&lt;/span&gt;&lt;/li&gt;&lt;li&gt;变量的命名能反映其实际含义&lt;/li&gt;&lt;li&gt;熟悉了一下gdb的使用，常用命令file,run,info breakpint,breakpoint &lt;span style="font-style: italic;"&gt;n&lt;/span&gt;,print &lt;span style="font-style: italic;"&gt;v&lt;/span&gt;,watch &lt;span style="font-style: italic;"&gt;v&lt;/span&gt;,list,enable &lt;span style="font-style: italic;"&gt;n&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;/span&gt;（断点号）,clear &lt;span style="font-style: italic;"&gt;n&lt;/span&gt;(行号)，next，step，x;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;不理解为什么netbsd的二分法查询这么别扭，下面的代码可读性更好（参考R Sedgewick Algorithms in  C，被注释掉的是原来的实现）&lt;/li&gt;&lt;/ol&gt;int main(int argc, char *argv[])&lt;br /&gt;{&lt;br /&gt;int * pi,pl,pr;&lt;br /&gt;int * pbase;&lt;br /&gt;int i[10]={0,1,2,3,4,5,6,7,8,9};&lt;br /&gt;int lim=10;&lt;br /&gt;int key;&lt;br /&gt;pl=pbase=i;&lt;br /&gt;pr=lim-1;&lt;br /&gt;&lt;br /&gt;key=atoi(argv[1]);&lt;br /&gt;&lt;br /&gt;while (pr&gt;=pl){&lt;br /&gt;   int m=(pr+pl)/2;&lt;br /&gt;   int cur_value=*(i+m);&lt;br /&gt;   if (key == cur_value){&lt;br /&gt;       printf("at index %d found value %d\n",m,key);&lt;br /&gt;       return 0;&lt;br /&gt;   }&lt;br /&gt;   if (key &gt; cur_value)&lt;br /&gt;       pl=m+1;&lt;br /&gt;   else&lt;br /&gt;       pr=m-1;&lt;br /&gt;   }      &lt;br /&gt;/*for (;lim!=0;lim&gt;&gt;=1)&lt;br /&gt;{&lt;br /&gt;       pi=pbase+(lim&gt;&gt;1);&lt;br /&gt;               printf("lim value is %d\n",lim);&lt;br /&gt;               if (*pi==key){&lt;br /&gt;                       printf("at index %d got %d!\n",(pi-i),key);&lt;br /&gt;                       return;&lt;br /&gt;                       }&lt;br /&gt;               if (key&gt;*pi){&lt;br /&gt;                       &lt;span style="color: rgb(255, 0, 0);"&gt;pbase=pi+1; 虽然结果正确，可惜看不懂&lt;/span&gt;&lt;br /&gt;                       &lt;span style="color: rgb(255, 0, 0);"&gt;lim--;&lt;/span&gt;&lt;br /&gt;                       }&lt;br /&gt;&lt;br /&gt;}*/&lt;br /&gt;printf("not got u!\n");&lt;br /&gt;return 0;&lt;br /&gt;}&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-9026450207923522887?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/9026450207923522887/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=9026450207923522887' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/9026450207923522887'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/9026450207923522887'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2006/11/code-reading.html' title='《code reading》阅读笔记之一'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-116073163436109460</id><published>2006-10-13T02:03:00.000-07:00</published><updated>2006-10-13T08:21:38.979-07:00</updated><title type='text'>大师的召唤</title><content type='html'>在slashdot上偶然听说了位老兄的&lt;a href="http://sztywny.titaniumhosting.com/2006/07/23/stiff-asks-great-programmers-answers/"&gt;blog&lt;/a&gt;，这位仁兄给大师们发了份mail，上面是些他感兴趣的问题。居然都回了：虽然有的回复有些心不在焉，可绝大部分答案还是保持了高水准，我把回答简单翻译了一下，做了个表格在&lt;a href="http://spreadsheets.google.com/ccc?key=pcPFvGaoj66gxKXZNtJsJTg"&gt;这里&lt;/a&gt;，有兴趣的可以去看看。&lt;br /&gt;从这份答案里，我总结了些成为优秀程序员的必备素质，虽然我的理解不一定准确，也不一定能做到，但这毕竟是目标：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;有热情，投入、专注&lt;/li&gt;&lt;li&gt;掌握离散数学&lt;br /&gt;&lt;/li&gt;&lt;li&gt;良好的沟通技巧（书面和口头）&lt;/li&gt;&lt;li&gt;思维清晰；强烈的价值观，分清事情的轻重缓急，洞悉事务的关键所在 ，并能简化复杂的问题&lt;/li&gt;&lt;/ul&gt;推荐的好书：&lt;br /&gt;&lt;a href="http://mitpress.mit.edu/sicp/"&gt;SCIP&lt;/a&gt;&lt;br /&gt;K&amp;amp;R C编程语言&lt;br /&gt;编程珠玑&lt;br /&gt;目前使用的工具：&lt;br /&gt;操作系统：Unix&lt;br /&gt;解释型语言：ruby、python、perl、LISP、TCL、Lua、Awk、Bash、make&lt;br /&gt;开发语言：Java&lt;br /&gt;编辑器：Emacs vim Netbeans&lt;br /&gt;版本控制：svn/cvs&lt;br /&gt;数据库：mysql postgre&lt;br /&gt;浏览器：firefox&lt;br /&gt;排版工具：TextMate/TEX&lt;br /&gt;&lt;br /&gt;自我感觉需要掌握的还有：算法、数据结构、C/C++&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-116073163436109460?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/116073163436109460/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=116073163436109460' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/116073163436109460'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/116073163436109460'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2006/10/blog-post.html' title='大师的召唤'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-115934533100783647</id><published>2006-09-27T00:57:00.000-07:00</published><updated>2006-10-13T08:21:38.908-07:00</updated><title type='text'>O_APPEND/lseek/pwrite</title><content type='html'>在读Marc Rochkind的Advanced Unix Programming(AUP),2.14节在描述pwrite和O_APPEND的时候，觉得简单了一点:&lt;br /&gt;如果以O_APPEND打开文件，pwrite的行为和write完全一致，offset参数完全被忽略&lt;br /&gt;但是，文件描述符指向的文件描述中的实际偏移呢？由于参数offset和实际偏移都用了英文offset表述，我产生了混淆，写了个程序e，测试了一下：&lt;br /&gt;#include &amp;lt  unistd.h  &amp;gt&lt;br /&gt;#include &amp;lt  sys/types.h  &amp;gt&lt;br /&gt;#include &amp;lt  fcntl.h  &amp;gt&lt;br /&gt;#include &amp;lt  errno.h  &amp;gt&lt;br /&gt;#include &amp;lt  sys/stat.h  &amp;gt&lt;br /&gt;#include &amp;lt  stdlib.h  &amp;gt&lt;br /&gt;&lt;br /&gt;int main(int argc,char* argv[])&lt;br /&gt;{&lt;br /&gt;    int fd;&lt;br /&gt;    off_t where;&lt;br /&gt;    ssize_t size;&lt;br /&gt;    if ((fd=open("tt",O_WRONLY|&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;O_APPEND&lt;/span&gt;))==-1){&lt;br /&gt;            perror("open failed!");&lt;br /&gt;            exit(-1);&lt;br /&gt;    }&lt;br /&gt;    if ((where=&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;lseek&lt;/span&gt;(fd,0,SEEK_CUR))==-1){&lt;br /&gt;            perror("lseek failed!");&lt;br /&gt;            exit(-1);&lt;br /&gt;    }&lt;br /&gt;    printf("current pos is %ld\n",where);&lt;br /&gt;    if ((size=&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;pwrite&lt;/span&gt;(fd,"0123456789",10,&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;))==-1){&lt;br /&gt;            perror("write failed!");&lt;br /&gt;            exit(-1);&lt;br /&gt;    }&lt;br /&gt;    if ((where=&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;lseek&lt;/span&gt;(fd,0,SEEK_CUR))==-1){&lt;br /&gt;            perror("lseek failed!");&lt;br /&gt;            exit(-1);&lt;br /&gt;    }&lt;br /&gt;    printf("current pos is %ld\n",where);&lt;br /&gt;    exit(0);&lt;br /&gt;}&lt;br /&gt;设tt是个含0123456789\n的字符文件，在linux和aix环境中其结果如下&lt;br /&gt;#cat tt&lt;br /&gt;0123456789&lt;br /&gt;#./e&lt;br /&gt;current pos is 0&lt;br /&gt;current pos is 0&lt;br /&gt;#cat tt&lt;br /&gt;0123456789&lt;br /&gt;0123456789#&lt;br /&gt;据此得出的结论：&lt;br /&gt;1、即使以O_APPEND方式打开文件，文件描述符指向的当前偏移位置仍为&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;，只是write在操作这种文件时隐含调用了lseek将文件偏移位置移至文件尾部&lt;br /&gt;2、pwrite在操作以O_APPEND方式打开的文件时，与write一样，从尾部开始写，同时，pwrite的offset参数不起任何作用，且文件描述符指向的当前偏移位置也不受任何影响&lt;br /&gt;如果将&lt;br /&gt;    if ((size=pwrite(fd,"0123456789",10,0))==-1){&lt;br /&gt;改成&lt;br /&gt;    if ((size=&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;write&lt;/span&gt;(fd,"0123456789",10))==-1){&lt;br /&gt;起结果为&lt;br /&gt;#cat tt&lt;br /&gt;0123456789&lt;br /&gt;#./e&lt;br /&gt;current pos is 0&lt;br /&gt;current pos is 21&lt;br /&gt;#cat tt&lt;br /&gt;0123456789&lt;br /&gt;0123456789#&lt;br /&gt;印证了结论1&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-115934533100783647?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/115934533100783647/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=115934533100783647' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/115934533100783647'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/115934533100783647'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2006/09/oappendlseekpwrite.html' title='O_APPEND/lseek/pwrite'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-115919832200270231</id><published>2006-09-25T05:26:00.000-07:00</published><updated>2006-10-13T08:21:38.848-07:00</updated><title type='text'>EOF是什么？</title><content type='html'>和同事讨论起一个问题：什么是EOF？&lt;br /&gt;也许你会说：表示文件结束呗！是的，可是它是什么，一个状态？一个文件尾部的特殊字符？或者一个控制符？（不管在unix还是dos下，大家都有输入时按Ctrl+d或者Ctrl+z的经历吧？）&lt;br /&gt;维基给的定义如下：In &lt;a href="http://en.wikipedia.org/wiki/Computing" title="Computing"&gt;computing&lt;/a&gt;, &lt;b&gt;end-of-file&lt;/b&gt;, commonly abbreviated &lt;b&gt;EOF&lt;/b&gt;, is a condition in a computer &lt;a href="http://en.wikipedia.org/wiki/Operating_system" title="Operating system"&gt;operating system&lt;/a&gt; where no more data can be read from a data source. The data source is usually called a &lt;i&gt;file&lt;/i&gt; or &lt;i&gt;stream&lt;/i&gt;.－－是种情况或者状态，操作系统不能从文件或者流里&lt;span style="color: rgb(255, 0, 0);"&gt;再&lt;/span&gt;读出数据；&lt;br /&gt;是附着在文件尾部的一个特殊字符嘛？应该不是：&lt;br /&gt;unix下创建个小文件t，包含数字0～9，ls -l 看到字节长度为11，od -ch t,结果如下：&lt;br /&gt;0000000   0   1   2   3   4   5   6   7   8   9  \n  \0&lt;br /&gt;                  3130 3332 3534 3736 3938 000a&lt;br /&gt;0000013&lt;br /&gt;dos下的copy con也是一样，ultraeditor二进制看一下，也没有多余的其他字符。&lt;br /&gt;&lt;br /&gt;问题是：谁通知的？EOF是谁提出的概念呢？&lt;br /&gt;我的理解：EOF是C Standard Library提出的，对系统调用来说，不存在这一概念，是标准c库对系统调用的封装，用来通知应用程序；比如：当输入中出现EOF的时候，就通知程序已经到达了文件的尾部；EOF&lt;span style="color: rgb(255, 0, 0);"&gt;本身&lt;/span&gt;不会被看作文件的最后一个字节而被写入文件本身或者读到内存中；&lt;br /&gt;至于ctrl+d和ctrl+z不过是shell和cmd对输入中流结束的约定罢了（glibc对EOF的定义为“-1”）&lt;br /&gt;&lt;br /&gt;SUS3在对系统调用read的规范里描述说：&lt;br /&gt;No data transfer shall occur past the current end-of-file. If the starting position is at or after the end-of-file, &lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt; shall be returned.&lt;br /&gt;在glibc2.4对fread的实现里，有如下代码（摘自glibc-2.4/libio/fileops.c中1452行函数_IO_file_xsgetn）：&lt;br /&gt;     count = _IO_SYSREAD (fp, s, count);&lt;br /&gt;     if (count &lt;= 0)         {           if (count == 0)         fp-&gt;_flags |= _IO_EOF_SEEN;&lt;br /&gt;         else&lt;br /&gt;       fp-&gt;_flags |= _IO_ERR_SEEN;&lt;br /&gt;&lt;br /&gt;         break;&lt;br /&gt;       }&lt;br /&gt;其中的_IO_SYSREAD可以理解为系统调用read，与SUS3的规范相互印证，EOF是种状态，无数据可读了，就把fp的状态置成_IO_EOF_SEEN，即到达文件尾部。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-115919832200270231?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/115919832200270231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=115919832200270231' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/115919832200270231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/115919832200270231'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2006/09/eof.html' title='EOF是什么？'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-115915516628335859</id><published>2006-09-24T19:41:00.000-07:00</published><updated>2006-10-13T08:21:38.790-07:00</updated><title type='text'>（）的厉害！</title><content type='html'>昨天用C语言写了个程序，老是报错，程序是这样的&lt;br /&gt;&lt;br /&gt; 2 #include &lt; unistd.h &gt; &lt;br /&gt; 3 #include &lt; sys/types.h &gt; &lt;br /&gt; 4 #include &lt; fcntl.h &gt; &lt;br /&gt; 5 #include &lt; errno.h &gt; &lt;br /&gt; 6 #include &lt; sys/stat.h &gt; &lt;br /&gt; 7 #include &lt; stdlib.h &gt; &lt;br /&gt;&lt;br /&gt;9 int main(int argc, char* argv[])&lt;br /&gt;10 {&lt;br /&gt;11         int fd;&lt;br /&gt;12         off_t where;&lt;br /&gt;13         char c;&lt;br /&gt;15         if ((fd=open("tt",O_RDONLY)==-1))&lt;br /&gt;16                         {&lt;br /&gt;17                         printf("sth wrong while opening file!\n");&lt;br /&gt;18                         exit(-1);&lt;br /&gt;19                         }&lt;br /&gt;25         if ((where = lseek(fd, 1, SEEK_CUR)==-1))&lt;br /&gt;26         {&lt;br /&gt;27                 perror("lseek failed!");&lt;br /&gt;28                 exit(-1);&lt;br /&gt;29         }&lt;br /&gt;30         printf("current pos is %ld\n",where);&lt;br /&gt;31         exit(0);&lt;br /&gt;32 }&lt;br /&gt;&lt;br /&gt;编译好运行的时候输出从25行的分支出去了，老是“lseek failed！”顺便声明，文件是存在的哦，用gdb调试，15行的fd打开后为&lt;span style="color: rgb(255, 0, 0);"&gt;0&lt;/span&gt;，就是&lt;span style="color: rgb(255, 0, 0);"&gt;stdin&lt;/span&gt;，看来看去，才发现是==比＝的优先级高，而我的括号又打错了地方，实际上是15行和25行都写错了，正确的写法是：&lt;br /&gt;15         if ((fd=open("tt",O_RDONLY))==-1)&lt;br /&gt;25         if ((where = lseek(fd, 1, SEEK_CUR))==-1)&lt;br /&gt;&lt;br /&gt;c语言总是认为你是正确的，而往往你不是这样 :)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/33878916-115915516628335859?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/115915516628335859/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=115915516628335859' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/115915516628335859'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/115915516628335859'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2006/09/blog-post_24.html' title='（）的厉害！'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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-33878916.post-115743793780269127</id><published>2006-09-04T23:28:00.000-07:00</published><updated>2006-10-13T08:21:38.719-07:00</updated><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/33878916-115743793780269127?l=tsisusr.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://tsisusr.blogspot.com/feeds/115743793780269127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=33878916&amp;postID=115743793780269127' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/115743793780269127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/33878916/posts/default/115743793780269127'/><link rel='alternate' type='text/html' href='http://tsisusr.blogspot.com/2006/09/blog-post.html' title='开张手记'/><author><name>dodo</name><uri>http://www.blogger.com/profile/01106142307159701465</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></feed>
