<?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-19542362</id><updated>2011-12-04T00:02:03.665+08:00</updated><category term='UNIX'/><category term='Reading'/><category term='i18n'/><category term='GOOGLE'/><category term='Telecomm'/><category term='IT'/><category term='Perl'/><category term='Windows'/><category term='Java'/><category term='blog'/><category term='WEB'/><category term='Life'/><category term='VoIP'/><category term='shell'/><category term='Mozilla'/><category term='Database'/><category term='Linux'/><category term='Develop'/><category term='network'/><category term='VIM'/><category term='NORTEL'/><category term='JavaScript'/><category term='CXX'/><category term='LISP'/><category term='Erlang'/><title type='text'>闲来无事 / Nothing to Do with</title><subtitle type='html'>耐心生活，
小心生活，
关心生活，
粗心生活，
生活生活~</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>94</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-19542362.post-7717297389706820717</id><published>2011-05-06T11:47:00.002+08:00</published><updated>2011-05-06T11:53:21.089+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>How to create a MS Windows local account by program</title><content type='html'>There are several ways to make it happen:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;PowerShell solution: &lt;a href="http://stackoverflow.com/questions/383390/create-local-user-with-powershell-windows-vista"&gt;http://stackoverflow.com/questions/383390/create-local-user-with-powershell-windows-vista&lt;/a&gt;&lt;/li&gt;&lt;li&gt;.Net solution: &lt;a href="http://msdn.microsoft.com/en-us/library/bb384369.aspx#Y200"&gt;http://msdn.microsoft.com/en-us/library/bb384369.aspx#Y200&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Using Active Directory Service Interfaces (ADSI) COM: &lt;a href="http://msdn.microsoft.com/en-us/library/aa705985%28v=vs.85%29.aspx"&gt;http://msdn.microsoft.com/en-us/library/aa705985(v=vs.85).aspx&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-7717297389706820717?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/en-us/library/bb384369.aspx' title='How to create a MS Windows local account by program'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/7717297389706820717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=7717297389706820717' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7717297389706820717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7717297389706820717'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2011/05/how-to-create-ms-windows-local-account.html' title='How to create a MS Windows local account by program'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-169956043295205849</id><published>2011-04-22T17:25:00.000+08:00</published><updated>2011-04-22T17:26:11.136+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CXX'/><title type='text'>Pointers to class member functions are always interesting</title><content type='html'>This FAQ show us lot of interesting things.&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-169956043295205849?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.parashift.com/c++-faq-lite/pointers-to-members.html' title='Pointers to class member functions are always interesting'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/169956043295205849/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=169956043295205849' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/169956043295205849'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/169956043295205849'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2011/04/pointers-to-class-member-functions-are.html' title='Pointers to class member functions are always interesting'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-2888640743320878393</id><published>2011-04-20T14:12:00.002+08:00</published><updated>2011-04-20T14:14:30.370+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>Celerbrate my StackOverflow.com account get over 500 reputations</title><content type='html'>费尽九牛二虎之力 终于让我在StackOverflow的账号reputation 过了500!!!&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-2888640743320878393?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://stackoverflow.com/users/235797/roumao' title='Celerbrate my StackOverflow.com account get over 500 reputations'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/2888640743320878393/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=2888640743320878393' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2888640743320878393'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2888640743320878393'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2011/04/celerbrate-my-stackoverflowcom-account.html' title='Celerbrate my StackOverflow.com account get over 500 reputations'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-2391513871340188892</id><published>2011-02-28T11:27:00.002+08:00</published><updated>2011-02-28T11:40:44.245+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Reading'/><title type='text'>List of freely available programming books</title><content type='html'>&lt;p&gt;&lt;strong&gt;Meta-List&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.htdp.org/2003-09-26/Book/" rel="nofollow"&gt;How to Design Programs: An Introduction to Computing and Programming&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.coderholic.com/25-free-computer-science-books/" rel="nofollow"&gt;25 Free Computer Science Ebooks&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.freetechbooks.com/" rel="nofollow"&gt;Free Tech Books&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mindviewinc.com/Books/" rel="nofollow"&gt;MindView Inc&lt;/a&gt; (List of Free Books)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikibooks.org/wiki/Category%3aComputer_programming" rel="nofollow"&gt;Wikibooks: Programming&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://refcardz.dzone.com/" rel="nofollow"&gt;Cheat Sheets (Free)&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blogs.msdn.com/wriju/archive/2009/01/07/free-ebooks-at-codeplex.aspx" rel="nofollow"&gt;CodePlex List of Free E-Books&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.booktraining.net/" rel="nofollow"&gt;Book Training - On Video!&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.spmn.com/products_guidebooks.html" rel="nofollow"&gt;Sofware Program Managers Network - Free EBooks&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.linbai.info/" rel="nofollow"&gt;EBook Share @ linbai.info&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.freebooksclub.net/" rel="nofollow"&gt;FreeBooksClub.Net&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://theassayer.org/" rel="nofollow"&gt;Theassayer.org&lt;/a&gt; (Free Online books)&lt;/li&gt;&lt;li&gt;&lt;a href="http://oreilly.com/openbook/" rel="nofollow"&gt;O'Reilly's Open Books Project&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.techbooksforfree.com/" rel="nofollow"&gt;TechBooksForFree.com&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.galileocomputing.de/katalog/openbook" rel="nofollow"&gt;Galileo Computing&lt;/a&gt; (Free Downloadable German Books)&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Graphics Programming&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;Nvidia &lt;a href="http://http.developer.nvidia.com/GPUGems/gpugems_part01.html" rel="nofollow"&gt;GPU Gems 1&lt;/a&gt; &lt;/li&gt;&lt;li&gt;Nvidia &lt;a href="http://http.developer.nvidia.com/GPUGems2/gpugems2_part01.html" rel="nofollow"&gt;GPU Gems 2&lt;/a&gt; &lt;/li&gt;&lt;li&gt;Nvidia &lt;a href="http://http.developer.nvidia.com/GPUGems3/gpugems3_part01.html" rel="nofollow"&gt;GPU Gems 3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.gamedev.net/reference/articles/article1698.asp" rel="nofollow"&gt;Graphics Programming Black Book&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Wolfgang Engel &lt;a href="http://tog.acm.org/resources/shaderx/" rel="nofollow"&gt;ShaderX&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Language Agnostic&lt;/strong&gt;:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://stackoverflow.com/questions/194812/list-of-freely-available-programming-books/4342778#4342778"&gt;Object-Oriented Reengineering Patterns&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://codebetter.com/files/folders/codebetter_downloads/entry179694.aspx" rel="nofollow"&gt;Foundations of Programming&lt;/a&gt; by Karl Seguin &lt;/li&gt;&lt;li&gt;&lt;a href="http://scpd.stanford.edu/knuth/index.jsp" rel="nofollow"&gt;Computer Musings&lt;/a&gt; (Lectures by Donald Knuth)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.catb.org/esr/writings/cathedral-bazaar/" rel="nofollow"&gt;The Cathedral and the Bazaar&lt;/a&gt; (Introduction to Open Source Software)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.codeplex.com/AppArchGuide" rel="nofollow"&gt;Patterns and Practices: Application Architecture Guide 2.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cl.cam.ac.uk/%7Erja14/book.html" rel="nofollow"&gt;Security Engineering&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.dspguide.com/" rel="nofollow"&gt;Digital Signal Processing For Engineers and Scientists&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://gettingreal.37signals.com/" rel="nofollow"&gt;Getting Real&lt;/a&gt; (Courtesy &lt;a href="http://37signals.com/" rel="nofollow"&gt;37 Signals&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://mitpress.mit.edu/sicp/" rel="nofollow"&gt;Structure and Interpretation of Computer Programs&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.infoq.com/minibooks/domain-driven-design-quickly" rel="nofollow"&gt;Domain Driven Design Quickly&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://homepage.mac.com/s_lott/books/oodesign.html" rel="nofollow"&gt;OO Design&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://smartbear.com/codecollab-code-review-book.php" rel="nofollow"&gt;Best Kept Secrets of Peer Code Review&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.scribd.com/doc/7181362/NASA-Software-Measurement-Guidebook" rel="nofollow"&gt;NASA Software Measurement Handbook&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://homepages.inf.ed.ac.uk/dts/pm/Papers/nasa-manage.pdf" rel="nofollow"&gt;NASA Manager Handbook for Software Development&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cl.cam.ac.uk/teaching/Lectures/funprog-jrh-1996/" rel="nofollow"&gt;Introduction to Functional Programming&lt;/a&gt; - Class Lectures and Slides&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.htdp.org/" rel="nofollow"&gt;How to Design Programs&lt;/a&gt; - MIT Press&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.computer.org/portal/web/swebok" rel="nofollow"&gt;Guide to the Software Engineering Body of Knowledge&lt;/a&gt; - IEEE Computer Society Press&lt;/li&gt;&lt;li&gt;&lt;a href="http://ocw.mit.edu/OcwWeb/web/home/home/index.htm" rel="nofollow"&gt;Online Course Materials&lt;/a&gt; - MIT&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cs.berkeley.edu/%7Evazirani/algorithms.html" rel="nofollow"&gt;Algorithms&lt;/a&gt; (Draft Copy)&lt;/li&gt;&lt;li&gt;&lt;a href="http://dotnetslackers.com/projects/Data-Structures-And-Algorithms/" rel="nofollow"&gt;Data Structures and Algorithms&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.agileskills.org/download.html.en" rel="nofollow"&gt;Essential Skills for Agile Development&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cs.brown.edu/%7Esk/Publications/Books/ProgLangs/" rel="nofollow"&gt;Programming Languages: Application and Interpretation&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://pine.fm/LearnToProgram/" rel="nofollow"&gt;Learn to Program&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.dreamsongs.com/Files/PatternsOfSoftware.pdf" rel="nofollow"&gt;Patterns of Software: Tales from the Software Community&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mindprod.com/jgloss/unmain.html" rel="nofollow"&gt;How to write Unmaintainable Code&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://catb.org/esr/writings/taoup/html/" rel="nofollow"&gt;The Art of Unix Programming&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nexus.realtimepublishers.com/dgbcq.php" rel="nofollow"&gt;The Definitive Guide to Building Code Quality&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://openbookproject.net/thinkcs/cpp.php" rel="nofollow"&gt;How to Think Like a Computer Scientist&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://planning.cs.uiuc.edu/" rel="nofollow"&gt;Planning Algorithms&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://greenteapress.com/semaphores/" rel="nofollow"&gt;The Little Book of Semaphores&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ii.uib.no/%7Emichal/und/i227/book/book.pdf" rel="nofollow"&gt;Mathematical Logic - an Introduction&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cse.ohio-state.edu/%7Egurari/theory-bk/theory-bk.html" rel="nofollow"&gt;An Introduction to the Theory of Computation&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://devshaped.com/book" rel="nofollow"&gt;Developers Developers Developers Developers&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.iecc.com/linker/" rel="nofollow"&gt;Linkers and loaders&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://beej.us/guide/bgnet/" rel="nofollow"&gt;Beej's Guide to Network Programming&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.infoq.com/minibooks/domain-driven-design-quickly" rel="nofollow"&gt;Domain Driven Design Quickly&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://compilers.iecc.com/crenshaw/" rel="nofollow"&gt;Let's Build a Compiler&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://producingoss.com/" rel="nofollow"&gt;Producing Open Source Software&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.lindaspaces.com/book/" rel="nofollow"&gt;How to Write Parallel Programs&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.neildavidson.com/dontjustrollthedice.html" rel="nofollow"&gt;Don't Just Roll the Dice&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programmer.97things.oreilly.com/" rel="nofollow"&gt;97 Things Every Programmer Should Know&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.fastchip.net/howcomputerswork/p1.html" rel="nofollow"&gt;How Computers Work&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://nlp.stanford.edu/IR-book/information-retrieval-book.html" rel="nofollow"&gt;Introduction to Information Retrieval&lt;/a&gt; - Cambridge University Press. 2008.&lt;/li&gt;&lt;li&gt;&lt;a href="http://kernel.org/pub/linux/kernel/people/paulmck/perfbook/perfbook.html" rel="nofollow"&gt;Is Parallel Programming Hard, And, If So, What Can You Do About It?&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.jjj.de/fxt/#fxtbook" rel="nofollow"&gt;Matters Computational&lt;/a&gt; - Springer, 2010&lt;/li&gt;&lt;li&gt;&lt;a href="https://www.cs.kent.ac.uk/people/staff/sjt/TTFP/" rel="nofollow"&gt;Type Theory and Functional Programming&lt;/a&gt; - Addison-Wesley, 1991&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;ASP.NET MVC&lt;/strong&gt;:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://weblogs.asp.net/scottgu/archive/2009/03/10/free-asp-net-mvc-ebook-tutorial.aspx" rel="nofollow"&gt;NerdDinner Walkthrough&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Assembly Language&lt;/strong&gt;:&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://download.savannah.gnu.org/releases/pgubook/ProgrammingGroundUp-1-0-booksize.pdf" rel="nofollow"&gt;ProgrammingGroundUp&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://drpaulcarter.com/pcasm/" rel="nofollow"&gt;Paul Carter's Tutorial on x86 Assembly&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.agner.org/optimize/" rel="nofollow"&gt;Software optimization resources by Agner Fog&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Bash&lt;/strong&gt;  &lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://tldp.org/LDP/abs/html/" rel="nofollow"&gt;Advanced Bash-Scripting Guide&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mywiki.wooledge.org/BashGuide" rel="nofollow"&gt;Lhunath's Bash Guide&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;C/C++&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.knosof.co.uk/cbook/cbook.html" rel="nofollow"&gt;The new C standard - an annotated reference&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://publications.gbdirect.co.uk/c_book/" rel="nofollow"&gt;The C book&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mindview.net/Books/TICPP/ThinkingInCPP2e.html" rel="nofollow"&gt;Thinking in C++, Second Edition&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://cppannotations.sourceforge.net/" rel="nofollow"&gt;C++ Annotations&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.agner.org/optimize/" rel="nofollow"&gt;Software optimization resources by Agner Fog&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://cartan.cas.suffolk.edu/oopdocbook/opensource/index.html" rel="nofollow"&gt;Introduction to Design Patterns in C++ with Qt 4&lt;/a&gt; (Open Publication License)  (&lt;a href="http://www.informit.com/store/product.aspx?isbn=0131879057" rel="nofollow"&gt;PDF&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;C#&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;See &lt;strong&gt;.NET&lt;/strong&gt; below&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Django&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://djangobook.com/" rel="nofollow"&gt;Djangobook.com&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Erlang&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://learnyousomeerlang.com/" rel="nofollow"&gt;Learn You Some Erlang For Great Good&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;F#&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ctocorner.com/fsharp/book/ch0.aspx" rel="nofollow"&gt;F#&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Forth&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://home.iae.nl/users/mhx/sf.html" rel="nofollow"&gt;Starting Forth&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://thinking-forth.sourceforge.net/" rel="nofollow"&gt;Thinking Forth&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Git&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://progit.org/book/" rel="nofollow"&gt;Pro Git&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://book.git-scm.com/index.html" rel="nofollow"&gt;The Git Community Book&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Grails&lt;/strong&gt;  - &lt;a href="http://www.infoq.com/minibooks/grails-getting-started" rel="nofollow"&gt;Getting Start with Grails&lt;/a&gt;&lt;/p&gt;  &lt;p&gt;&lt;strong&gt;Haskell&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://learnyouahaskell.com/chapters" rel="nofollow"&gt;Learn You a Haskell&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://book.realworldhaskell.org/read/" rel="nofollow"&gt;Real World Haskell&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;HTML&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://diveintohtml5.org/" rel="nofollow"&gt;Dive Into HTML5&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Java&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://java.sun.com/docs/books/tutorial/" rel="nofollow"&gt;Sun's Java Tutorials&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mindview.net/Books/TIJ/" rel="nofollow"&gt;Thinking in Java&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://openbookproject.net/thinkcs/java.php" rel="nofollow"&gt;How to Think Like a Computer Scientist&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.redbooks.ibm.com/redbooks/SG245118.html" rel="nofollow"&gt;Java Thin-Client Programming&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://njbartlett.name/files/osgibook_preview_20091217.pdf" rel="nofollow"&gt;OSGi in Practice&lt;/a&gt; (CreativeCommons Attribution Non-commercial Share Alike License)&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;JavaScript&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://eloquentjavascript.net/" rel="nofollow"&gt;Eloquent JavaScript&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.crockford.com/javascript/" rel="nofollow"&gt;Crockford's JavaScript&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.rebeccamurphey.com/jqfundamentals/" rel="nofollow"&gt;jQuery Fundamentals&lt;/a&gt; (starts with JavaScript basics)&lt;/li&gt;&lt;li&gt;&lt;a href="https://developer.mozilla.org/en/JavaScript/Guide" rel="nofollow"&gt;JavaScript Guide&lt;/a&gt; (Mozilla Developer Network)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.addyosmani.com/resources/essentialjsdesignpatterns/book/" rel="nofollow"&gt;Essential Javascript &amp;amp; jQuery Design Patterns for Beginners&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Linux&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.advancedlinuxprogramming.com/" rel="nofollow"&gt;Advanced Linux Programming&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Lisp&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.gigamonkeys.com/book/" rel="nofollow"&gt;Practical Common Lisp&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.paulgraham.com/onlisp.html" rel="nofollow"&gt;On Lisp&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.paulgraham.com/acl.html" rel="nofollow"&gt;ANSI Common Lisp&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cs.cmu.edu/Groups/AI/html/cltl/mirrors.html" rel="nofollow"&gt;Common Lisp the Language, 2nd Edition&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://psg.com/%7Edlamkins/sl/contents.html" rel="nofollow"&gt;Successful Lisp&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://letoverlambda.com/index.cl/toc" rel="nofollow"&gt;Let Over Lambda - 50 Years of Lisp&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Lua&lt;/strong&gt;  &lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.lua.org/pil/" rel="nofollow"&gt;Programming In Lua&lt;/a&gt; (for v5 but still largely relevant)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.lua.org/gems/" rel="nofollow"&gt;Lua Programming Gems&lt;/a&gt; not entirely free, but has a lot of free chapters and accompanying code. &lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Maven&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.maestrodev.com/better-build-maven" rel="nofollow"&gt;Better Builds with Maven&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sonatype.com/books/mvnex-book/reference/public-book.html" rel="nofollow"&gt;Maven by Example&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sonatype.com/books/mvnref-book/reference/public-book.html" rel="nofollow"&gt;Maven: The Complete Reference&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sonatype.com/books/nexus-book/reference/" rel="nofollow"&gt;Repository Management with Nexus&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.sonatype.com/books/m2eclipse-book/reference/" rel="nofollow"&gt;Developing with Eclipse and Maven&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Mercurial&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://hgbook.red-bean.com/" rel="nofollow"&gt;Mercurial: The Definitive Guide&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://hginit.com/" rel="nofollow"&gt;HGInit - Mercurial Tutorial by Joel Spolsky&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;.NET (C#)&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.programmersheaven.com/2/CSharpBook" rel="nofollow"&gt;Free C# Book&lt;/a&gt; Covers C#1.0 and 2.0 (Courtesy of &lt;a href="http://www.programmersheaven.com/" rel="nofollow"&gt;Programmers Heaven&lt;/a&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.infoq.com/minibooks/vsnettt" rel="nofollow"&gt;Visual Studio Tips and Tricks&lt;/a&gt; (VS 2003-2005 only)&lt;/li&gt;&lt;li&gt;&lt;a href="http://weblogs.asp.net/zeeshanhirani/archive/2008/12/05/my-christmas-present-to-the-entity-framework-community.aspx" rel="nofollow"&gt;Entity Framework&lt;/a&gt; (514 pages)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.charlespetzold.com/dotnet/index.html" rel="nofollow"&gt;Charles Petzold's .NET Book 0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.albahari.com/threading/" rel="nofollow"&gt;Threading in C#&lt;/a&gt; &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.csharpcourse.com/" rel="nofollow"&gt;C# Yellow Book&lt;/a&gt;  (Intro to programming)&lt;/li&gt;&lt;li&gt;&lt;a href="http://en.wikibooks.org/wiki/C_Sharp_Programming" rel="nofollow"&gt;C# Programming - Wikibook&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.techotopia.com/index.php/C_Sharp_Essentials" rel="nofollow"&gt;C# Essentials&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.brpreiss.com/books/opus6/" rel="nofollow"&gt;Data Structures and Algorithms with Object-Oriented Design Patterns in C# &lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://downloads.red-gate.com/ebooks/DotNet/illustratedcsharp2008.zip" rel="nofollow"&gt;Illustrated C# 2008&lt;/a&gt; (Download) (&lt;strong&gt;.ZIP&lt;/strong&gt;) [dead link]&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.red-gate.com/products/ants_performance_profiler/be_ahead_of_the_game_ebook.htm?utm_source=simpletalk&amp;amp;utm_medium=email&amp;amp;utm_content=nlv_aheadofgame-ebook&amp;amp;utm_campaign=antsperformanceprofiler" rel="nofollow"&gt;O'Reilly's C# Pocket Reference Manual&lt;/a&gt; (&lt;em&gt;Free Ebook courtesy of &lt;a href="http://red-gate.com/" rel="nofollow"&gt;Red Gate Software&lt;/a&gt;&lt;/em&gt;) [dead link]&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;NoSQL&lt;/strong&gt;  &lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://books.couchdb.org/relax/" rel="nofollow"&gt;CouchDB: The Definitive Guide&lt;/a&gt;  &lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Objective-C&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://developer.apple.com/DOCUMENTATION/Cocoa/Conceptual/ObjectiveC/" rel="nofollow"&gt;The Objective-C Programming Language&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Oracle Server&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;Oracle &lt;a href="http://tahiti.oracle.com/" rel="nofollow"&gt;Guides and Manuals&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Oracle PL/SQL&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://download.oracle.com/docs/cd/E11882_01/appdev.112/e17126/toc.htm" rel="nofollow"&gt;PL/SQL Language Reference&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://download.oracle.com/docs/cd/E11882_01/appdev.112/e16760/toc.htm" rel="nofollow"&gt;PL/SQL Packages and Types Reference&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.toadworld.com/Knowledge/DatabaseKnowledge/StevenFeuersteinsPLSQLObsession/tabid/153/Default.aspx" rel="nofollow"&gt;Steven Feuerstein's PL/SQL Obsession - Videos and Presentations&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Parrot / Perl 6&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://github.com/perl6/book/" rel="nofollow"&gt;Perl 6&lt;/a&gt; (Work in progress)  &lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Perl&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://hop.perl.plover.com/book/" rel="nofollow"&gt;Higher-Order Perl&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.greenteapress.com/perl/" rel="nofollow"&gt;Perl The Hard Way&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.extremeperl.org/bk/home" rel="nofollow"&gt;Extreme Perl&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://linkmingle.com/list/13-plus-List-of-Free-Great-Perl-Books-available-Online-freebooksandarticles" rel="nofollow"&gt;Perl Free Online EBooks&lt;/a&gt; &lt;strong&gt;Meta-List&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.masonbook.com/book/" rel="nofollow"&gt;The Mason Book&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://modperlbook.org/" rel="nofollow"&gt;Practical mod_perl&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.perl.org/books/beginning-perl/" rel="nofollow"&gt;Beginning Perl&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.masonbook.com/book/" rel="nofollow"&gt;Embedding Perl in HTML with Mason&lt;/a&gt; (Open Publication License)  &lt;/li&gt;&lt;li&gt;&lt;a href="http://lwp.interglacial.com/index.html" rel="nofollow"&gt;Perl &amp;amp; LWP&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.globalspin.com/thebook/" rel="nofollow"&gt;Perl for the Web&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://oreilly.com/openbook/webclient/" rel="nofollow"&gt;Web Client Programming with Perl&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.onyxneon.com/books/modern_perl/index.html" rel="nofollow"&gt;Modern Perl 5&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;PHP&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.tuxradar.com/practicalphp" rel="nofollow"&gt;Practical PHP Programming&lt;/a&gt; (Wiki that contains O'Reilly's &lt;em&gt;PHP In a Nutshell&lt;/em&gt;)&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.survivethedeepend.com/" rel="nofollow"&gt;Zend Framework: Survive the Deep End&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;PowerShell&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://powershell.com/cs/blogs/ebook/" rel="nofollow"&gt;Mastering PowerShell&lt;/a&gt;  &lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Prolog&lt;/strong&gt;  &lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.amzi.com/ExpertSystemsInProlog/" rel="nofollow"&gt;Building Expert Systems in Prolog&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.amzi.com/AdventureInProlog/advfrtop.htm" rel="nofollow"&gt;Adventure in Prolog&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://computing.unn.ac.uk/staff/cgpb4/prologbook/" rel="nofollow"&gt;Prolog Programming A First Course&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ida.liu.se/%7Eulfni/lpp/" rel="nofollow"&gt;Logic, Programming and Prolog (2ed)&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.j-paine.org/prolog/mathnotes/files/pms/pms.html" rel="nofollow"&gt;Introduction to Prolog for Mathematicians&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.learnprolognow.org/" rel="nofollow"&gt;Learn Prolog Now!&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://cs.union.edu/%7Estriegnk/courses/nlp-with-prolog/html/" rel="nofollow"&gt;Natural Language Processing Techniques in Prolog&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://bookboon.com/int/student/it/prolog-techniques-applications-of-prolog" rel="nofollow"&gt;Prolog techniques&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://bookboon.com/int/student/it/applications-of-prolog" rel="nofollow"&gt;Applications of Prolog&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.cs.bris.ac.uk/%7Eflach/SimplyLogical.html" rel="nofollow"&gt;Simply logical&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;PostgreSQL&lt;/strong&gt;  &lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.commandprompt.com/ppbook/" rel="nofollow"&gt;Practical PostgreSQL&lt;/a&gt;  &lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Python&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://diveintopython.org/" rel="nofollow"&gt;Dive Into Python&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://diveintopython3.org/" rel="nofollow"&gt;Dive Into Python 3&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.swaroopch.com/notes/Python" rel="nofollow"&gt;Byte of Python&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://homepage.mac.com/s_lott/books/python.html" rel="nofollow"&gt;Building Skills in Python Version 2.5&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://linkmingle.com/list/List-of-Free-Online-Python-Books-freebooksandarticles" rel="nofollow"&gt;Python Free Online Ebooks&lt;/a&gt; &lt;strong&gt;Meta-List&lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://openbookproject.net/pybiblio/" rel="nofollow"&gt;Python Bibliotheca&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.greenteapress.com/thinkpython/thinkpython.pdf" rel="nofollow"&gt;Think Python&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.brpreiss.com/books/opus7/html/book.html" rel="nofollow"&gt;Data Structures and Algorithms in Python&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.greenteapress.com/thinkpython/thinkCSpy/" rel="nofollow"&gt;How to Think Like a Computer Scientist: Learning with Python&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.openbookproject.net/py4fun/" rel="nofollow"&gt;Python for Fun&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://inventwithpython.com/" rel="nofollow"&gt;Invent Your Own Computer Games With Python&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://learnpythonthehardway.org/" rel="nofollow"&gt;Learn Python The Hard Way&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.mindview.net/Books/TIPython/" rel="nofollow"&gt;Thinking in Python&lt;/a&gt;    &lt;/li&gt;&lt;li&gt;&lt;a href="http://djangobook.com/" rel="nofollow"&gt;The Django Book&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.briggs.net.nz/log/writing/snake-wrangling-for-kids/" rel="nofollow" title="SWFK"&gt;Snake Wrangling For Kids&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.nltk.org/book" rel="nofollow"&gt;Natural Language Processing with Python (nltk-book)&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Ruby&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.ruby-doc.org/docs/ProgrammingRuby/" rel="nofollow"&gt;Programming Ruby&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://mislav.uniqpath.com/poignant-guide/" rel="nofollow"&gt;Why's (Poignant) Guide to Ruby&lt;/a&gt; (&lt;a href="http://www.scribd.com/doc/2236084/Whys-Poignant-Guide-to-Ruby" rel="nofollow"&gt;Mirror&lt;/a&gt; via &lt;a href="http://www.scribd.com/" rel="nofollow"&gt;Scribd&lt;/a&gt;)  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.humblelittlerubybook.com/" rel="nofollow"&gt;Mr. Neighborly's Humble Little Ruby Book&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rubybestpractices.com/" rel="nofollow"&gt;Ruby Best Practices&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://macruby.labs.oreilly.com/" rel="nofollow"&gt;MacRuby: The Definitive Guide&lt;/a&gt;  &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.railstutorial.org/" rel="nofollow"&gt;Ruby on Rails Tutorial: Learn Rails By Example&lt;/a&gt;    &lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Scala&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.scala-lang.org/docu/files/ScalaTutorial.pdf" rel="nofollow"&gt;A Scala Tutorial for Java programmers&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.scala-lang.org/docu/files/ScalaByExample.pdf" rel="nofollow"&gt;Scala By Example&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://programming-scala.labs.oreilly.com/index.html" rel="nofollow"&gt;Programming Scala&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://github.com/leithaus/XTrace/tree/monadic/src/main/book/content/" rel="nofollow"&gt;Xtrace&lt;/a&gt; (Github)&lt;/li&gt;&lt;li&gt;&lt;a href="http://github.com/tjweir/liftbook" rel="nofollow"&gt;List&lt;/a&gt; (Github)&lt;/li&gt;&lt;li&gt;&lt;a href="http://github.com/leithaus/XTrace/tree/monadic/src/main/book/content/" rel="nofollow"&gt;Pro Scala: Monadic Design Patterns for the Web&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://exploring.liftweb.net/" rel="nofollow"&gt;Exploring Lift&lt;/a&gt; (published earlier as "The Definitive Guide to Lift", &lt;a href="http://groups.google.com/group/the-lift-book" rel="nofollow"&gt;pdf&lt;/a&gt;)&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Scheme&lt;/strong&gt;  &lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.scheme.com/tspl4/" rel="nofollow"&gt;The Scheme Programming Language (Edition 4)&lt;/a&gt;  &lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Smalltalk&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://stephane.ducasse.free.fr/FreeBooks.html" rel="nofollow"&gt;Smalltalk Free Ebooks&lt;/a&gt; &lt;em&gt;Courtesy of Stéphane Ducasse&lt;/em&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.squeakbyexample.org/" rel="nofollow"&gt;Squeak By Example&lt;/a&gt; (Smalltalk IDE)&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Subversion&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.phptr.com/content/images/0131855182/downloads/Nagel_book.pdf" rel="nofollow"&gt;Subversion Version Control: Using the Subversion Version Control System in Development Projects&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://svnbook.red-bean.com/" rel="nofollow"&gt;Version Control with Subversion&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;SQL (Implementation agnostic)&lt;/strong&gt;&lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.cs.arizona.edu/people/rts/publications.html" rel="nofollow"&gt;Developing Time-Oriented Database Applications in SQL&lt;/a&gt;,Richard T. Snodgrass&lt;/li&gt;&lt;li&gt;&lt;a href="http://use-the-index-luke.com/" rel="nofollow"&gt;Use The Index, Luke!&lt;/a&gt;  - A guide to SQL database performance for developers&lt;/li&gt;&lt;/ul&gt;  &lt;p&gt;&lt;strong&gt;Vim&lt;/strong&gt;  &lt;/p&gt;  &lt;ul&gt;&lt;li&gt;&lt;a href="http://www.swaroopch.com/notes/Vim" rel="nofollow"&gt;A Byte of Vim&lt;/a&gt;  &lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-2391513871340188892?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://stackoverflow.com/questions/194812/list-of-freely-available-programming-books/392926#392926' title='List of freely available programming books'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/2391513871340188892/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=2391513871340188892' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2391513871340188892'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2391513871340188892'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2011/02/list-of-freely-available-programming.html' title='List of freely available programming books'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-5272960682110527897</id><published>2011-01-28T11:04:00.003+08:00</published><updated>2011-01-28T11:12:49.374+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network'/><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Access Ubuntu GPG Keyserver behind restrict firewall</title><content type='html'>Ubuntu PPA is a very good apt source-list expansion mechanism, but it requires to install new GPG public key for the PPA repository. It isn't a big problem for user without a restrict firewall. &lt;br /&gt;&lt;br /&gt;ubuntu keyserver is using standard GPG keyserver port keyserver.ubuntu.com:11371. It will be blocked by restrict firewall. While Ubuntu.com has enable the 80 on the keyserver, we should add some options to let gpg to use hkp:80 to access the keyserver. &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For my example, &lt;br /&gt;&lt;blockquote&gt;gpg --ignore-time-conflict --no-options --no-default-keyring --secret-keyring /etc/apt/secring.gpg --trustdb-name /etc/apt/trustdb.gpg --keyring /etc/apt/trusted.gpg --primary-keyring /etc/apt/trusted.gpg &lt;span style="font-weight:bold;"&gt;--keyserver hkp://keyserver.ubuntu.com:80 --keyserver-options http-proxy=http://webproxy.yourdomain.com:80&lt;span style="font-style:italic;"&gt;&lt;/span&gt;&lt;/span&gt; --recv 36E81C9267FD1383FCC4490983FBA1751378B444&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;We will be able to retrieve the GPG key through restrict firewall. :)&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-5272960682110527897?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.webupd8.org/2011/01/install-libreoffice-in-ubuntu-from.html' title='Access Ubuntu GPG Keyserver behind restrict firewall'/><link rel='enclosure' type='' href='https://answers.launchpad.net/ubuntu-website/+question/79193' length='0'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/5272960682110527897/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=5272960682110527897' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/5272960682110527897'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/5272960682110527897'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2011/01/access-ubuntu-gpg-keyserver-behind.html' title='Access Ubuntu GPG Keyserver behind restrict firewall'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-1064448229548671821</id><published>2010-10-18T18:47:00.002+08:00</published><updated>2010-10-18T18:58:36.727+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>A shell script to extract JDK/JRE .pack files under MSYS</title><content type='html'>&lt;pre&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;if [ ! -x $1/bin/unpack200.exe ];then&lt;br /&gt;    echo "Usage: $0 &amp;lt;java_home_dir&amp;gt;"&lt;br /&gt;    exit 1&lt;br /&gt;fi&lt;br /&gt;&lt;br /&gt;for i in `find $1 -name '*.pack'`;do&lt;br /&gt;    echo $i&lt;br /&gt;    $1/bin/unpack200.exe $i ${i/%.pack/.jar}&lt;br /&gt;    rm -f $i&lt;br /&gt;done&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-1064448229548671821?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://java.sun.com' title='A shell script to extract JDK/JRE .pack files under MSYS'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/1064448229548671821/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=1064448229548671821' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1064448229548671821'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1064448229548671821'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2010/10/shell-script-to-extract-jdkjre-pack.html' title='A shell script to extract JDK/JRE .pack files under MSYS'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-7821090115526847604</id><published>2010-09-06T18:56:00.003+08:00</published><updated>2010-09-06T19:00:54.301+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><title type='text'>How to Crack Excel VBA Password</title><content type='html'>&lt;p&gt;Let's make it faster! I did a Perl script to handle the string replacement for you!&lt;/p&gt;&lt;br /&gt;&lt;style type="text/css"&gt;&lt;!-- pre { font-family: monospace; color: #c0c0c0; background-color: #000040; } .Comment { color: #80a0ff; } .Identifier { color: #40ffff; } .Special { color: #ffa500; } .Constant { color: #ffa0a0; } .Statement { color: #ffff60; } .PreProc { color: #ff80ff; } --&gt;&lt;/style&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span class="PreProc"&gt;#!/usr/bin/perl -W&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;use strict&lt;/span&gt;;&lt;br /&gt;&lt;span class="Statement"&gt;use warnings&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;use &lt;/span&gt;IO::File;&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="Constant"&gt;"&lt;/span&gt;&lt;span class="Constant"&gt;Reset .XLA Password AS: ZZZZXXXX&lt;/span&gt;&lt;span class="Special"&gt;\n&lt;/span&gt;&lt;span class="Constant"&gt;"&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;&lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;$fname&lt;/span&gt;;&lt;br /&gt;&lt;span class="Statement"&gt;while&lt;/span&gt; (&lt;span class="Identifier"&gt;$fname&lt;/span&gt; = &lt;span class="Statement"&gt;shift&lt;/span&gt;) {&lt;br /&gt;  &lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;$fh&lt;/span&gt; = new IO::File;&lt;br /&gt;  &lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;$fx&lt;/span&gt; = new IO::File;&lt;br /&gt;&lt;br /&gt;  &lt;span class="Comment"&gt;# backup&lt;/span&gt;&lt;br /&gt;  &lt;span class="Comment"&gt;#qx(copy $_ $_.orig) if [ -f $_ ];&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;  &lt;span class="Comment"&gt;# open file&lt;/span&gt;&lt;br /&gt;  &lt;span class="Statement"&gt;if&lt;/span&gt; (&lt;span class="Identifier"&gt;$fh&lt;/span&gt;&lt;span class="Identifier"&gt;-&amp;gt;open&lt;/span&gt;(&lt;span class="Constant"&gt;"&lt;/span&gt;&lt;span class="Constant"&gt;&amp;lt; &lt;/span&gt;&lt;span class="Identifier"&gt;$fname&lt;/span&gt;&lt;span class="Constant"&gt;"&lt;/span&gt;)) {&lt;br /&gt;      &lt;span class="Identifier"&gt;$fh&lt;/span&gt;&lt;span class="Identifier"&gt;-&amp;gt;binmode&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;      &lt;span class="Identifier"&gt;$fx&lt;/span&gt;&lt;span class="Identifier"&gt;-&amp;gt;open&lt;/span&gt;(&lt;span class="Constant"&gt;"&lt;/span&gt;&lt;span class="Constant"&gt;&amp;gt; &lt;/span&gt;&lt;span class="Identifier"&gt;$fname&lt;/span&gt;&lt;span class="Constant"&gt;.new&lt;/span&gt;&lt;span class="Constant"&gt;"&lt;/span&gt;) || &lt;span class="Statement"&gt;die&lt;/span&gt; &lt;span class="Constant"&gt;qq(&lt;/span&gt;&lt;span class="Constant"&gt;unable to create &lt;/span&gt;&lt;span class="Identifier"&gt;$fname&lt;/span&gt;&lt;span class="Constant"&gt;.new! &lt;/span&gt;&lt;span class="Identifier"&gt;$@&lt;/span&gt;&lt;span class="Special"&gt;\n&lt;/span&gt;&lt;span class="Constant"&gt;)&lt;/span&gt;;&lt;br /&gt;      &lt;span class="Identifier"&gt;$fx&lt;/span&gt;&lt;span class="Identifier"&gt;-&amp;gt;binmode&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;      &lt;span class="Statement"&gt;my&lt;/span&gt; &lt;span class="Identifier"&gt;$l&lt;/span&gt;;&lt;br /&gt;      &lt;span class="Statement"&gt;while&lt;/span&gt; (&lt;span class="Identifier"&gt;$l&lt;/span&gt; = &amp;lt;&lt;span class="Identifier"&gt;$fh&lt;/span&gt;&amp;gt;) {&lt;br /&gt;          &lt;span class="Identifier"&gt;$l&lt;/span&gt; =~ &lt;span class="Statement"&gt;s/&lt;/span&gt;&lt;span class="Constant"&gt;CMG="&lt;/span&gt;&lt;span class="Special"&gt;\w&lt;/span&gt;&lt;span class="Special"&gt;+&lt;/span&gt;&lt;span class="Constant"&gt;"&lt;/span&gt;&lt;span class="Statement"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;CMG="C2C06EAE34B234B230B630B6"&lt;/span&gt;&lt;span class="Statement"&gt;/&lt;/span&gt;;&lt;br /&gt;          &lt;span class="Identifier"&gt;$l&lt;/span&gt; =~ &lt;span class="Statement"&gt;s/&lt;/span&gt;&lt;span class="Constant"&gt;DPB="&lt;/span&gt;&lt;span class="Special"&gt;\w&lt;/span&gt;&lt;span class="Special"&gt;+&lt;/span&gt;&lt;span class="Constant"&gt;"&lt;/span&gt;&lt;span class="Statement"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;DPB="848628F028AF45AF4550BBB0458ED7A55404135266B71BBB11B340F5CB0445BD26CDE2C6BA5A"&lt;/span&gt;&lt;span class="Statement"&gt;/&lt;/span&gt;;&lt;br /&gt;          &lt;span class="Identifier"&gt;$l&lt;/span&gt; =~ &lt;span class="Statement"&gt;s/&lt;/span&gt;&lt;span class="Constant"&gt;GC="&lt;/span&gt;&lt;span class="Special"&gt;\w&lt;/span&gt;&lt;span class="Special"&gt;+&lt;/span&gt;&lt;span class="Constant"&gt;"&lt;/span&gt;&lt;span class="Statement"&gt;/&lt;/span&gt;&lt;span class="Constant"&gt;GC="4644EA326E363137313731"&lt;/span&gt;&lt;span class="Statement"&gt;/&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;          &lt;span class="Comment"&gt;# write into new file.&lt;/span&gt;&lt;br /&gt;          &lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="Identifier"&gt;$fx&lt;/span&gt; &lt;span class="Identifier"&gt;$l&lt;/span&gt;;&lt;br /&gt;      }&lt;br /&gt;&lt;br /&gt;      &lt;span class="Identifier"&gt;$fh&lt;/span&gt;&lt;span class="Identifier"&gt;-&amp;gt;close&lt;/span&gt;();&lt;br /&gt;      &lt;span class="Identifier"&gt;$fx&lt;/span&gt;&lt;span class="Identifier"&gt;-&amp;gt;close&lt;/span&gt;();&lt;br /&gt;&lt;br /&gt;      &lt;span class="Comment"&gt;# rename&lt;/span&gt;&lt;br /&gt;      &lt;span class="Constant"&gt;qx(&lt;/span&gt;&lt;span class="Constant"&gt;ren &lt;/span&gt;&lt;span class="Identifier"&gt;$fname&lt;/span&gt;&lt;span class="Constant"&gt; &lt;/span&gt;&lt;span class="Identifier"&gt;$fname&lt;/span&gt;&lt;span class="Constant"&gt;.orig&lt;/span&gt;&lt;span class="Constant"&gt;)&lt;/span&gt;;&lt;br /&gt;      &lt;span class="Constant"&gt;qx(&lt;/span&gt;&lt;span class="Constant"&gt;ren &lt;/span&gt;&lt;span class="Identifier"&gt;$fname&lt;/span&gt;&lt;span class="Constant"&gt;.new &lt;/span&gt;&lt;span class="Identifier"&gt;$fname&lt;/span&gt;&lt;span class="Constant"&gt;)&lt;/span&gt;;&lt;br /&gt;&lt;br /&gt;      &lt;span class="Comment"&gt;# print ok&lt;/span&gt;&lt;br /&gt;      &lt;span class="Statement"&gt;print&lt;/span&gt; &lt;span class="Constant"&gt;"&lt;/span&gt;&lt;span class="Identifier"&gt;$fname&lt;/span&gt;&lt;span class="Constant"&gt; ... done!&lt;/span&gt;&lt;span class="Special"&gt;\n&lt;/span&gt;&lt;span class="Constant"&gt;"&lt;/span&gt;;&lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-7821090115526847604?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.ehow.com/how_5965583_crack-excel-vba-password.html' title='How to Crack Excel VBA Password'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/7821090115526847604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=7821090115526847604' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7821090115526847604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7821090115526847604'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2010/09/how-to-crack-excel-vba-password.html' title='How to Crack Excel VBA Password'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-1688285397785112486</id><published>2010-05-20T18:17:00.000+08:00</published><updated>2010-05-20T18:17:15.075+08:00</updated><title type='text'>Google I/O 2010 Keynote, pt. 1</title><content type='html'>&lt;object style="background-image:url(http://i2.ytimg.com/vi/mbVVDDu8f9k/hqdefault.jpg)"  width="480" height="295"&gt;&lt;param name="movie" value="http://www.youtube.com/v/mbVVDDu8f9k&amp;amp;hl=en_US&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowscriptaccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/mbVVDDu8f9k&amp;amp;hl=en_US&amp;amp;fs=1" width="480" height="295" allowScriptAccess="never" allowFullScreen="true" wmode="transparent" type="application/x-shockwave-flash"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-1688285397785112486?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.youtube.com/GoogleDevelopers' title='Google I/O 2010 Keynote, pt. 1'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/1688285397785112486/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=1688285397785112486' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1688285397785112486'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1688285397785112486'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2010/05/google-io-2010-keynote-pt-1.html' title='Google I/O 2010 Keynote, pt. 1'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-7701833200678627296</id><published>2010-03-15T11:23:00.003+08:00</published><updated>2010-03-15T11:30:09.130+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>My First Perl XS module</title><content type='html'>In recent days, I created my first Perl XS module -- Perl Win32::Oleaccxs.&lt;br /&gt;Win32::Oleaccxs is a module which depended on &lt;a href="http://msdn.microsoft.com/en-us/library/dd317990%28v=VS.85%29.aspx"&gt;Microsoft Active Accessibility UI&lt;/a&gt; API to go through all the GUI widgets in Microsoft Windows system. This module is just a simple wrapper to the client APIs. By using this module, you can navigate most of the Windows GUI widgets by using Perl.&lt;br /&gt;&lt;br /&gt;This is very early version -- v0.01, It is undocumented yet. I will finish the document and upload it to CPAN some times later. :)&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-7701833200678627296?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://code.google.com/p/perl-win32-oleaccxs/' title='My First Perl XS module'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/7701833200678627296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=7701833200678627296' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7701833200678627296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7701833200678627296'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2010/03/my-first-perl-xs-module.html' title='My First Perl XS module'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-5009473183693824028</id><published>2010-03-15T11:13:00.002+08:00</published><updated>2010-03-15T11:23:30.029+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network'/><title type='text'>TCP 状态混淆</title><content type='html'>看图说话： &lt;a href="http://img.ly/images/152662/full"&gt;http://img.ly/images/152662/full&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;客户端在收到服务器的 SYN+ACK 响应之后，注入一个非法的RST 和另一个非法的ACK包， 服务器端会针对这个非法的ACK报文发出RST报文。 这样从中间人的角度看， 客户端和服务器都通过RST结束了TCP通讯。 &lt;br /&gt;&lt;span style="font-weight:bold;"&gt;太强大了~~~&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-5009473183693824028?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blog.youxu.info/2010/03/14/west-chamber/' title='TCP 状态混淆'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/5009473183693824028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=5009473183693824028' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/5009473183693824028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/5009473183693824028'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2010/03/tcp.html' title='TCP 状态混淆'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-6850272617365845256</id><published>2010-02-08T16:43:00.003+08:00</published><updated>2010-02-08T16:59:45.802+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NORTEL'/><title type='text'>《后来》 北电2010年年会版</title><content type='html'>感慨中......&lt;br /&gt;&lt;br /&gt;《后来》&lt;br /&gt;&lt;blockquote&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;如果当时我们能不聘用MikeZ&lt;br /&gt;现在也不至于破产&lt;br /&gt;让我如何拯救你&lt;br /&gt;你的Logo被摘去&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;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-6850272617365845256?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.tudou.com/programs/view/TEwi1iW_vLs/' title='《后来》 北电2010年年会版'/><link rel='enclosure' type='' href='http://hefei-wherefly.spaces.live.com/blog/cns!C3958584A50E1F6A!637.entry' length='0'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/6850272617365845256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=6850272617365845256' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6850272617365845256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6850272617365845256'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2010/02/2010_08.html' title='《后来》 北电2010年年会版'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-4550184166966253509</id><published>2010-02-08T10:43:00.005+08:00</published><updated>2010-02-08T10:58:37.459+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>sub GetTreeViewItemRect of Win32::GuiTest functions</title><content type='html'>&lt;p&gt;Win32::GuiTest is a powerful tool for Windows GUI testing. I love it! This is a small function which allow GuiTest to send Mouse Events to the item inside TreeCtrl. &lt;/p&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#ff80ff"&gt;#!/usr/bin/perl&lt;/font&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;## Initially generated by Win32-GuiTest Recorder (v1.03)&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;## Pragmas/Directives&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;use strict&lt;/font&gt;;&lt;br /&gt;&lt;font color="#ffff60"&gt;use warnings&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;use &lt;/font&gt;&lt;font color="#ffa0a0"&gt;5.010&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;## Imports&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;use &lt;/font&gt;Win32::GuiTest &lt;font color="#ffa0a0"&gt;qw/&lt;/font&gt;&lt;font color="#ffa0a0"&gt;:ALL&lt;/font&gt;&lt;font color="#ffa0a0"&gt;/&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&lt;font color="#40ffff"&gt;$Win32::GuiTest::debug&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffa0a0"&gt;0&lt;/font&gt;; &lt;font color="#80a0ff"&gt;# Set to &amp;quot;1&amp;quot; to enable debug output.&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;use &lt;/font&gt;constant {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;TVM_EXPAND&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;=&amp;gt; &lt;font color="#ffa0a0"&gt;0x1100&lt;/font&gt;&amp;nbsp;+ &lt;font color="#ffa0a0"&gt;2&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;TVM_GETITEMRECT&amp;nbsp;&amp;nbsp; &lt;/font&gt;=&amp;gt; &lt;font color="#ffa0a0"&gt;0x1100&lt;/font&gt;&amp;nbsp;+ &lt;font color="#ffa0a0"&gt;4&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;TVM_GETNEXTITEM&amp;nbsp;&amp;nbsp; &lt;/font&gt;=&amp;gt; &lt;font color="#ffa0a0"&gt;0x1100&lt;/font&gt;&amp;nbsp;+ &lt;font color="#ffa0a0"&gt;10&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;TVM_SELECTITEM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;/font&gt;=&amp;gt; &lt;font color="#ffa0a0"&gt;0x1100&lt;/font&gt;&amp;nbsp;+ &lt;font color="#ffa0a0"&gt;11&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;TVM_GETITEM&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;/font&gt;=&amp;gt; &lt;font color="#ffa0a0"&gt;0x1100&lt;/font&gt;&amp;nbsp;+ &lt;font color="#ffa0a0"&gt;12&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;TVM_ENSUREVISIBLE &lt;/font&gt;=&amp;gt; &lt;font color="#ffa0a0"&gt;0x1100&lt;/font&gt;&amp;nbsp;+ &lt;font color="#ffa0a0"&gt;20&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;TVGN_ROOT&amp;nbsp;&amp;nbsp; &lt;/font&gt;=&amp;gt; &lt;font color="#ffa0a0"&gt;0&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;TVGN_NEXT&amp;nbsp;&amp;nbsp; &lt;/font&gt;=&amp;gt; &lt;font color="#ffa0a0"&gt;1&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;TVGN_CHILD&amp;nbsp;&amp;nbsp;&lt;/font&gt;=&amp;gt; &lt;font color="#ffa0a0"&gt;4&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;TVGN_CARET&amp;nbsp;&amp;nbsp;&lt;/font&gt;=&amp;gt; &lt;font color="#ffa0a0"&gt;9&lt;/font&gt;,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;TVE_EXPAND&amp;nbsp;&amp;nbsp;&lt;/font&gt;=&amp;gt; &lt;font color="#ffa0a0"&gt;2&lt;/font&gt;,&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;=item&lt;/font&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Helper function to go through Items inside TreeCtrl.&lt;/font&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;It is as same as the internal function of Win32::GuiTest&lt;/font&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;But it allows to use REGEX as the item name&lt;/font&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;=cut&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;sub&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#40ffff"&gt;xTVPathWalk&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; = &lt;font color="#ffff60"&gt;shift&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$tvitem&lt;/font&gt;&amp;nbsp;&amp;nbsp; = &lt;font color="#ffff60"&gt;shift&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$text_buf&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffff60"&gt;shift&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$hItem&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= &lt;font color="#ffff60"&gt;shift&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$max_buf&lt;/font&gt;&amp;nbsp;&amp;nbsp;= &lt;font color="#ffff60"&gt;shift&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$delay&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= &lt;font color="#ffff60"&gt;shift&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;@parts&lt;/font&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;= &lt;font color="#40ffff"&gt;@_&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SendMessage( &lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;, TVM_ENSUREVISIBLE(), &lt;font color="#ffa0a0"&gt;0&lt;/font&gt;, &lt;font color="#40ffff"&gt;$hItem&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;while&lt;/font&gt;( &lt;font color="#40ffff"&gt;$hItem&lt;/font&gt;&amp;nbsp;!= &lt;font color="#ffa0a0"&gt;0&lt;/font&gt;&amp;nbsp;){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$str_long&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffff60"&gt;pack&lt;/font&gt;( &lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;L L L L L L L L L L&lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;0x41&lt;/font&gt;, &lt;font color="#80a0ff"&gt;#mask (TVIF_TEXT | TVIF_CHILDREN)&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;$hItem&lt;/font&gt;, &lt;font color="#80a0ff"&gt;#hItem&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;, &lt;font color="#80a0ff"&gt;#state&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;, &lt;font color="#80a0ff"&gt;#stateMask&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;$text_buf&lt;/font&gt;-&amp;gt;{ &lt;font color="#ffa0a0"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;ptr&lt;/font&gt;&lt;font color="#ffa0a0"&gt;'&lt;/font&gt;&amp;nbsp;}, &lt;font color="#80a0ff"&gt;#pszText&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;100&lt;/font&gt;, &lt;font color="#80a0ff"&gt;#cchTextMax&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;, &lt;font color="#80a0ff"&gt;#iImage&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;, &lt;font color="#80a0ff"&gt;#iSelectedImage&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;, &lt;font color="#80a0ff"&gt;#cChildren&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#80a0ff"&gt;#lParam &lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToVirtualBuffer( &lt;font color="#40ffff"&gt;$tvitem&lt;/font&gt;, &lt;font color="#40ffff"&gt;$str_long&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SendMessage( &lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;, TVM_GETITEM(), &lt;font color="#ffa0a0"&gt;0&lt;/font&gt;, &lt;font color="#40ffff"&gt;$tvitem&lt;/font&gt;-&amp;gt;{ &lt;font color="#ffa0a0"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;ptr&lt;/font&gt;&lt;font color="#ffa0a0"&gt;'&lt;/font&gt;&amp;nbsp;} ); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$text&lt;/font&gt;&amp;nbsp;= ReadFromVirtualBuffer( &lt;font color="#40ffff"&gt;$text_buf&lt;/font&gt;, &lt;font color="#40ffff"&gt;$max_buf&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;$text&lt;/font&gt;&amp;nbsp;=~ &lt;font color="#ffff60"&gt;s/&lt;/font&gt;&lt;font color="#ffa500"&gt;\0&lt;/font&gt;&lt;font color="#ffa500"&gt;.+&lt;/font&gt;&lt;font color="#ffa0a0"&gt;$&lt;/font&gt;&lt;font color="#ffff60"&gt;//&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$struct&lt;/font&gt;&amp;nbsp;= ReadFromVirtualBuffer( &lt;font color="#40ffff"&gt;$tvitem&lt;/font&gt;, &lt;font color="#ffa0a0"&gt;40&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;@fields&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffff60"&gt;unpack&lt;/font&gt;( &lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;L10&lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;, &lt;font color="#40ffff"&gt;$struct&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$titlere&lt;/font&gt;&amp;nbsp;= &lt;font color="#40ffff"&gt;$parts&lt;/font&gt;[&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;];&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;if&lt;/font&gt;( &lt;font color="#40ffff"&gt;$text&lt;/font&gt;&amp;nbsp;=~&lt;font color="#ffff60"&gt;&amp;nbsp;/&lt;/font&gt;&lt;font color="#40ffff"&gt;$titlere&lt;/font&gt;&lt;font color="#ffff60"&gt;/i&lt;/font&gt;&amp;nbsp;){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SendMessage( &lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;, TVM_EXPAND(), TVE_EXPAND(), &lt;font color="#40ffff"&gt;$hItem&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#80a0ff"&gt;#&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#80a0ff"&gt;# Give the node some time to expand...&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#80a0ff"&gt;#&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;select&lt;/font&gt;(&lt;font color="#ffff60"&gt;undef&lt;/font&gt;, &lt;font color="#ffff60"&gt;undef&lt;/font&gt;, &lt;font color="#ffff60"&gt;undef&lt;/font&gt;, &lt;font color="#40ffff"&gt;$delay&lt;/font&gt;) &lt;font color="#ffff60"&gt;if&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$delay&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;if&lt;/font&gt;( &lt;font color="#40ffff"&gt;@parts&lt;/font&gt;&amp;nbsp;== &lt;font color="#ffa0a0"&gt;1&lt;/font&gt;&amp;nbsp;){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;return&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$hItem&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;if&lt;/font&gt;( &lt;font color="#40ffff"&gt;$fields&lt;/font&gt;[ &lt;font color="#ffa0a0"&gt;8&lt;/font&gt;&amp;nbsp;] ){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$hChild&lt;/font&gt;&amp;nbsp;= SendMessage( &lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TVM_GETNEXTITEM(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; TVGN_CHILD(),&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#40ffff"&gt;$hItem&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;shift&lt;/font&gt;( &lt;font color="#40ffff"&gt;@parts&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;return&lt;/font&gt;&amp;nbsp;xTVPathWalk( &lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#40ffff"&gt;$tvitem&lt;/font&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#40ffff"&gt;$text_buf&lt;/font&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#40ffff"&gt;$hChild&lt;/font&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#40ffff"&gt;$max_buf&lt;/font&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#40ffff"&gt;$delay&lt;/font&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;font color="#40ffff"&gt;@parts&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;font color="#ffff60"&gt;else&lt;/font&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;$hItem&lt;/font&gt;&amp;nbsp;= SendMessage( &lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TVM_GETNEXTITEM(), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;TVGN_NEXT(), &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;$hItem&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;return&lt;/font&gt;&amp;nbsp;&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;;&lt;br /&gt;}&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;=item GetTreeViewItemRect&lt;/font&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;&amp;nbsp;Return the RECT of Item related to Screen.&lt;/font&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;&amp;nbsp;Parameters are as same parameters as SelTreeViewItem&lt;/font&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;=cut&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;sub&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#40ffff"&gt;GetTreeViewItemRect&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffff60"&gt;shift&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$path&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffff60"&gt;shift&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$max_buf&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffff60"&gt;shift&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$delay&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffff60"&gt;shift&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;if&lt;/font&gt;( !&lt;font color="#40ffff"&gt;$max_buf&lt;/font&gt;&amp;nbsp;){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;$max_buf&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffa0a0"&gt;124&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;if&lt;/font&gt;( !&lt;font color="#40ffff"&gt;$delay&lt;/font&gt;&amp;nbsp;){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;$delay&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffa0a0"&gt;0.50&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;@parts&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffff60"&gt;split&lt;/font&gt;( &lt;font color="#ffff60"&gt;/&lt;/font&gt;&lt;font color="#ffa500"&gt;\|&lt;/font&gt;&lt;font color="#ffff60"&gt;/&lt;/font&gt;, &lt;font color="#40ffff"&gt;$path&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$tvitem&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;eval&lt;/font&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;$tvitem&lt;/font&gt;&amp;nbsp;= AllocateVirtualBuffer( &lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;, &lt;font color="#ffa0a0"&gt;50&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;if&lt;/font&gt;( &lt;font color="#40ffff"&gt;$@&lt;/font&gt;&amp;nbsp;){&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;die&lt;/font&gt;&amp;nbsp;&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;Allocation failed with message ---&amp;gt; &lt;/font&gt;&lt;font color="#40ffff"&gt;$@&lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$text_buf&lt;/font&gt;&amp;nbsp;= AllocateVirtualBuffer( &lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;, &lt;font color="#40ffff"&gt;$max_buf&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$item_rect&lt;/font&gt;&amp;nbsp;= AllocateVirtualBuffer( &lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;, &lt;font color="#ffa0a0"&gt;16&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$hItem&lt;/font&gt;&amp;nbsp;= SendMessage( &lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;, TVM_GETNEXTITEM(), TVGN_ROOT(), &lt;font color="#ffa0a0"&gt;0&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;$hItem&lt;/font&gt;&amp;nbsp;= xTVPathWalk( &lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;$tvitem&lt;/font&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;$text_buf&lt;/font&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;$hItem&lt;/font&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;$max_buf&lt;/font&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;$delay&lt;/font&gt;, &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;@parts&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SendMessage( &lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;, TVM_SELECTITEM(), TVGN_CARET(), &lt;font color="#40ffff"&gt;$hItem&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;@rect&lt;/font&gt;&amp;nbsp;= (&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;, &lt;font color="#ffa0a0"&gt;0&lt;/font&gt;, &lt;font color="#ffa0a0"&gt;0&lt;/font&gt;, &lt;font color="#ffa0a0"&gt;0&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;if&lt;/font&gt;&amp;nbsp;(&lt;font color="#40ffff"&gt;$hItem&lt;/font&gt;) {&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#80a0ff"&gt;# TVM_GETITEMRECT = 0x1104&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;say &lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;Got the item: &lt;/font&gt;&lt;font color="#40ffff"&gt;$hItem&lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SendMessage( &lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;, TVM_ENSUREVISIBLE(), &lt;font color="#ffa0a0"&gt;0&lt;/font&gt;, &lt;font color="#40ffff"&gt;$hItem&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;WriteToVirtualBuffer( &lt;font color="#40ffff"&gt;$item_rect&lt;/font&gt;, &lt;font color="#ffff60"&gt;pack&lt;/font&gt;(&lt;font color="#ffa0a0"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;L L L L&lt;/font&gt;&lt;font color="#ffa0a0"&gt;'&lt;/font&gt;, &lt;font color="#40ffff"&gt;$hItem&lt;/font&gt;, &lt;font color="#ffa0a0"&gt;0&lt;/font&gt;, &lt;font color="#ffa0a0"&gt;0&lt;/font&gt;, &lt;font color="#ffa0a0"&gt;0&lt;/font&gt;));&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;if&lt;/font&gt;&amp;nbsp;(SendMessage ( &lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;, TVM_GETITEMRECT(), &lt;font color="#ffa0a0"&gt;1&lt;/font&gt;, &lt;font color="#40ffff"&gt;$item_rect&lt;/font&gt;-&amp;gt;{ &lt;font color="#ffa0a0"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;ptr&lt;/font&gt;&lt;font color="#ffa0a0"&gt;'&lt;/font&gt;&amp;nbsp;} ) ) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;@rect&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffff60"&gt;unpack&lt;/font&gt;(&lt;font color="#ffa0a0"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;L4&lt;/font&gt;&lt;font color="#ffa0a0"&gt;'&lt;/font&gt;, ReadFromVirtualBuffer( &lt;font color="#40ffff"&gt;$item_rect&lt;/font&gt;, &lt;font color="#ffa0a0"&gt;16&lt;/font&gt;&amp;nbsp;) );&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FreeVirtualBuffer( &lt;font color="#40ffff"&gt;$item_rect&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FreeVirtualBuffer( &lt;font color="#40ffff"&gt;$tvitem&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;FreeVirtualBuffer( &lt;font color="#40ffff"&gt;$text_buf&lt;/font&gt;&amp;nbsp;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;@rect&lt;/font&gt;[&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;,&lt;font color="#ffa0a0"&gt;1&lt;/font&gt;] = ClientToScreen( &lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;, &lt;font color="#40ffff"&gt;$rect&lt;/font&gt;[&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;], &lt;font color="#40ffff"&gt;$rect&lt;/font&gt;[&lt;font color="#ffa0a0"&gt;1&lt;/font&gt;] ); &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;@rect&lt;/font&gt;[&lt;font color="#ffa0a0"&gt;2&lt;/font&gt;,&lt;font color="#ffa0a0"&gt;3&lt;/font&gt;] = ClientToScreen( &lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;, &lt;font color="#40ffff"&gt;$rect&lt;/font&gt;[&lt;font color="#ffa0a0"&gt;2&lt;/font&gt;], &lt;font color="#40ffff"&gt;$rect&lt;/font&gt;[&lt;font color="#ffa0a0"&gt;3&lt;/font&gt;] ); &lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;return&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;@rect&lt;/font&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;=item SendMouseToTreeViewItem($hwndTreectrl, $path, $mouseevents)&lt;/font&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$hwndTrectrl - the HWND of TreeCtrl&lt;/font&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$path - full path of TreeCtrl item&lt;/font&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;$mouseevents - mouse events, please refer to Win32::GuiTest::SendMouse&lt;/font&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;=cut&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;sub&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#40ffff"&gt;SendMouseToTreeViewItem&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;nbsp;&lt;/font&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffff60"&gt;shift&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$path&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffff60"&gt;shift&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;@rect&lt;/font&gt;&amp;nbsp;= GetTreeViewItemRect(&lt;font color="#40ffff"&gt;$hwnd&lt;/font&gt;, &lt;font color="#40ffff"&gt;$path&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;if&lt;/font&gt;&amp;nbsp;(&lt;font color="#40ffff"&gt;$rect&lt;/font&gt;[&lt;font color="#ffa0a0"&gt;2&lt;/font&gt;] - &lt;font color="#40ffff"&gt;$rect&lt;/font&gt;[&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;] != &lt;font color="#ffa0a0"&gt;0&lt;/font&gt;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;MouseMoveAbsPix(&lt;font color="#40ffff"&gt;$rect&lt;/font&gt;[&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;] + &lt;font color="#ffa0a0"&gt;1&lt;/font&gt;, &lt;font color="#40ffff"&gt;$rect&lt;/font&gt;[&lt;font color="#ffa0a0"&gt;1&lt;/font&gt;] + &lt;font color="#ffa0a0"&gt;1&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;SendMouse(&lt;font color="#ffff60"&gt;shift&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;}&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Here is a exameple. It will find the first `Windows Explorer' window, &lt;br /&gt;&lt;pre&gt;&lt;br /&gt;my @windows = FindWindowLike(undef,undef,"ExploreWClass");&lt;br /&gt;if (scalar @windows) {&lt;br /&gt;  SetForegroundWindow($windows[0]);&lt;br /&gt;  SetActiveWindow($windows[0]);&lt;br /&gt;  my ($treectl) = FindWindowLike($windows[0], undef, 'SysTreeView32');&lt;br /&gt;  if ($treectrl) {&lt;br /&gt;    SendMouseToTreeViewItem($treectl, 'desktop|my computer|c:|perl', '{leftclick}{leftclick}') &lt;br /&gt;  }&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-4550184166966253509?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://search.cpan.org/dist/Win32-GuiTest/' title='sub GetTreeViewItemRect of Win32::GuiTest functions'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/4550184166966253509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=4550184166966253509' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/4550184166966253509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/4550184166966253509'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2010/02/sub-gettreeviewitemrect-of-win32guitest.html' title='sub GetTreeViewItemRect of Win32::GuiTest functions'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-3704210091949469084</id><published>2010-01-22T15:48:00.002+08:00</published><updated>2010-01-22T16:35:28.289+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='CXX'/><title type='text'>Windows Side-by-side Assemblies</title><content type='html'>From Visual Studio 2005, WinSxS became a mandatory things for Windows application. Especially when you depends on some common DLL components, for example, Common Controls, MS VC CRT, MS GdiPlus.  All this need to be specified with the MANIFEST file.&lt;br /&gt;It is a little noisily to generate the MANIFEST manually. So Microsoft do this for you.  Indeed, the MANIFEST file was created by `link.exe'. In the C/C++ header file, it is using #pragma instrument to specify the DLL dependency explicitly.&lt;br /&gt;&lt;br /&gt;For example MSVCRT: it is specified by 'crtdefs.h' and 'crtassem.h'.&lt;br /&gt;Inside crtdefs.h, it defines the linker comment, like below:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#ifdef _DEBUG&lt;br /&gt;#pragma comment(linker,"/manifestdependency:\"type='win32' "            \&lt;br /&gt;        "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".DebugCRT' "         \&lt;br /&gt;        "version='" _CRT_ASSEMBLY_VERSION "' "                          \&lt;br /&gt;        "processorArchitecture='x86' "                                  \&lt;br /&gt;        "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")&lt;br /&gt;#else&lt;br /&gt;#pragma comment(linker,"/manifestdependency:\"type='win32' "            \&lt;br /&gt;        "name='" __LIBRARIES_ASSEMBLY_NAME_PREFIX ".CRT' "              \&lt;br /&gt;        "version='" _CRT_ASSEMBLY_VERSION "' "                          \&lt;br /&gt;        "processorArchitecture='x86' "                                  \&lt;br /&gt;        "publicKeyToken='" _VC_ASSEMBLY_PUBLICKEYTOKEN "'\"")&lt;br /&gt;#endif&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;and all the variants, e.g. __LIBRARIES_ASSEMBLY_NAME_PREFIX, __VCASSEMBLY_PUBLICKEYTOKEN, were defined inside `crtassem.h'.&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-3704210091949469084?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/en-us/library/aa376307%28VS.85%29.aspx' title='Windows Side-by-side Assemblies'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/3704210091949469084/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=3704210091949469084' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/3704210091949469084'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/3704210091949469084'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2010/01/windows-side-by-side-assemblies.html' title='Windows Side-by-side Assemblies'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-7500600501139837276</id><published>2010-01-20T14:01:00.005+08:00</published><updated>2010-01-20T14:16:00.520+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><title type='text'>Perl regular expression tip: return all the matched things</title><content type='html'>&lt;style type="text/css"&gt;pre.verbatim ol {background-color:#D8D8D8;color:#3F3F3F;margin-bottom:0;margin-top:0;} pre.verbatim ol li {-moz-background-clip:border;-moz-background-inline-policy:continuous;-moz-background-origin:padding;background:#EEEEDD none repeat scroll 0 0; color:#262626;padding-bottom:2px;padding-left:5px;&lt;/style&gt;&lt;br /&gt;&lt;p&gt;Perl的正则表达式异常强悍，介绍一个不太引人注意但是又非常有用的功能：那就是返回所有匹配到的内容：“使用 //g 匹配”。 这时 $var =~ /regex/g 将会返回一个array，里面有所有匹配到的内容。如果在正则表达式中定义了group，就返回所有的groups；如果没有定义group，就返回所有匹配到的内容。&lt;/p&gt;&lt;p&gt;In list context, &lt;code class="inline"&gt;&lt;span class="q"&gt;//g&lt;/span&gt;&lt;/code&gt;  returns a list of matched groupings, or if there are no groupings, a list of matches to the whole regexp.  So if we wanted just the words, we could use&lt;/p&gt; &lt;pre class="verbatim"&gt;&lt;ol&gt;&lt;li&gt;    &lt;span class="i"&gt;@words&lt;/span&gt; = &lt;span class="s"&gt;(&lt;/span&gt;&lt;span class="i"&gt;$x&lt;/span&gt; =~ &lt;span class="q"&gt;/(\w+)/g&lt;/span&gt;&lt;span class="s"&gt;)&lt;/span&gt;&lt;span class="sc"&gt;;&lt;/span&gt;  &lt;span class="c"&gt;# matches,&lt;/span&gt;&lt;/li&gt;&lt;li&gt;                                &lt;span class="c"&gt;# $word[0] = 'cat'&lt;/span&gt;&lt;/li&gt;&lt;li&gt;                                &lt;span class="c"&gt;# $word[1] = 'dog'&lt;/span&gt;&lt;/li&gt;&lt;li&gt;                                &lt;span class="c"&gt;# $word[2] = 'house'&lt;/span&gt;&lt;/li&gt;&lt;/ol&gt;&lt;/pre&gt;需要注意，需要在一个 list context。说简单一点，就像上面的例子做就好。把匹配的结果赋值给一个array。&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-7500600501139837276?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://perldoc.perl.org/perlretut.html#Using-regular-expressions-in-Perl' title='Perl regular expression tip: return all the matched things'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/7500600501139837276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=7500600501139837276' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7500600501139837276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7500600501139837276'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2010/01/tip-perl-regular-expression-return-all.html' title='Perl regular expression tip: return all the matched things'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-7468741947409510828</id><published>2009-12-21T10:48:00.004+08:00</published><updated>2009-12-23T17:14:51.234+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><title type='text'>Perl Threads</title><content type='html'>&lt;p&gt;不得不说，perl 在M$ windows 下面实现的模拟fork真的是不堪一用，有很多限制，比如说: 不能fork 超过64次。也不能怪Perl，windows 对进程的处理就跟 Unix 大不相同！不过好在对于Thread的支持 Windows倒是没什么大问题。&lt;/p&gt;&lt;br /&gt;&lt;p&gt;给一个Windows下Perl多线程编程的小例子，自己留着慢慢用:) 里面用到：线程同步，变量共享。（需要Perl 5.8或者以上版本来支持 threads模块； say 这个好像是 Perl 5.10的feature, 其实就就print自动帮你加一个回车换行！）&lt;/p&gt;&lt;br /&gt;&lt;pre bgcolor="#000040" text="#c0c0c0"&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;use strict&lt;/font&gt;;&lt;br /&gt;&lt;font color="#ffff60"&gt;use warnings&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;use &lt;/font&gt;feature &lt;font color="#ffa0a0"&gt;qw(&lt;/font&gt;&lt;font color="#ffa0a0"&gt;switch say&lt;/font&gt;&lt;font color="#ffa0a0"&gt;)&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;use &lt;/font&gt;threads;&lt;br /&gt;&lt;font color="#ffff60"&gt;use &lt;/font&gt;threads::shared;&lt;br /&gt;&lt;font color="#ffff60"&gt;use &lt;/font&gt;Thread::Semaphore;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$n&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffa0a0"&gt;9&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;# shared variant across threads&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$arg&lt;/font&gt;&amp;nbsp;:shared;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;sub&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#40ffff"&gt;thread_proc&lt;/font&gt;&lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$sem&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffff60"&gt;shift&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;for&lt;/font&gt;&amp;nbsp;(&lt;font color="#ffa0a0"&gt;1.&lt;/font&gt;.&lt;font color="#40ffff"&gt;$n&lt;/font&gt;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#80a0ff"&gt;# &lt;/font&gt;&lt;span style="background-color: #1248d1"&gt;&lt;font color="#d14a14"&gt;TODO&lt;/font&gt;&lt;/span&gt;&lt;font color="#80a0ff"&gt;: prepare works.&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;sleep&lt;/font&gt;(&lt;font color="#ffa0a0"&gt;1&lt;/font&gt;); &lt;font color="#80a0ff"&gt;# dummy &lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#80a0ff"&gt;# wait until main thread wait me up!&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;$sem&lt;/font&gt;-&amp;gt;down;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#80a0ff"&gt;# &lt;/font&gt;&lt;span style="background-color: #1248d1"&gt;&lt;font color="#d14a14"&gt;TODO&lt;/font&gt;&lt;/span&gt;&lt;font color="#80a0ff"&gt;: Do my business~~~&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;say &lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;thread: &lt;/font&gt;&lt;font color="#40ffff"&gt;$arg&lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;; &lt;font color="#80a0ff"&gt;# dummy task&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;sleep&lt;/font&gt;(&lt;font color="#ffa0a0"&gt;1&lt;/font&gt;);&amp;nbsp;&amp;nbsp; &lt;font color="#80a0ff"&gt;# dummy&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;say &lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;thread_proc is over&lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$sem&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffff60"&gt;new&lt;/font&gt;&amp;nbsp;Thread::Semaphore();&lt;br /&gt;&lt;font color="#ffff60"&gt;my&lt;/font&gt;&amp;nbsp;&lt;font color="#40ffff"&gt;$thr&lt;/font&gt;&amp;nbsp;= threads-&amp;gt;create(&lt;font color="#ffa0a0"&gt;'&lt;/font&gt;&lt;font color="#ffa0a0"&gt;thread_proc&lt;/font&gt;&lt;font color="#ffa0a0"&gt;'&lt;/font&gt;, &lt;font color="#40ffff"&gt;$sem&lt;/font&gt;);&lt;br /&gt;&lt;font color="#40ffff"&gt;$sem&lt;/font&gt;-&amp;gt;down; &lt;font color="#80a0ff"&gt;# Lock the semaphore&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;# Main thread&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;for&lt;/font&gt;(&lt;font color="#ffa0a0"&gt;1.&lt;/font&gt;.&lt;font color="#ffa0a0"&gt;9&lt;/font&gt;)&lt;br /&gt;{&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#80a0ff"&gt;# &lt;/font&gt;&lt;span style="background-color: #1248d1"&gt;&lt;font color="#d14a14"&gt;TODO&lt;/font&gt;&lt;/span&gt;&lt;font color="#80a0ff"&gt;: prepare works&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;$arg&lt;/font&gt;&amp;nbsp;= &lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#40ffff"&gt;$_&lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;nbsp;String &lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;. (&lt;font color="#40ffff"&gt;$_&lt;/font&gt;&amp;nbsp;* &lt;font color="#ffa0a0"&gt;1273&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;say &lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;main: &lt;/font&gt;&lt;font color="#40ffff"&gt;$arg&lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#80a0ff"&gt;# Wait up the thread&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#40ffff"&gt;$sem&lt;/font&gt;-&amp;gt;up;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#80a0ff"&gt;# &lt;/font&gt;&lt;span style="background-color: #1248d1"&gt;&lt;font color="#d14a14"&gt;TODO&lt;/font&gt;&lt;/span&gt;&lt;font color="#80a0ff"&gt;: Do some other works.&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;sleep&lt;/font&gt;(&lt;font color="#ffa0a0"&gt;3&lt;/font&gt;); &lt;font color="#80a0ff"&gt;# dummy task;&lt;/font&gt;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;# wait for the thread to die&lt;/font&gt;&lt;br /&gt;&lt;font color="#40ffff"&gt;$thr&lt;/font&gt;-&amp;gt;&lt;font color="#ffff60"&gt;join&lt;/font&gt;();&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;print&lt;/font&gt;&amp;nbsp;&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;end &lt;/font&gt;&lt;font color="#ffa500"&gt;\n&lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;;&lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-7468741947409510828?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://perldoc.perl.org/threads.html' title='Perl Threads'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/7468741947409510828/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=7468741947409510828' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7468741947409510828'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7468741947409510828'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/12/perl-threads.html' title='Perl Threads'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-8199196450678812600</id><published>2009-12-14T11:29:00.008+08:00</published><updated>2009-12-14T11:51:39.279+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Develop'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>通过虚拟机进行 Windows Kernel Debug</title><content type='html'>&lt;div style="text-align: left;"&gt;文介绍了硬件方式，这次来个更快的，通过虚拟机进行 Windows Kernel Debug。现在计算机硬件如此强大，我们完全可以把Target运行在一个虚拟机内，然后通过宿主机来调试。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;首先，target——也就是虚拟机，也要进行同样的启动配置，让它进入debug模式。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;其次，配置虚拟机程序，让它把target的COM端口 映射到一个命名管道。&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); "&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_6w4ImPfz71k/SyW2BhRzU0I/AAAAAAAABU4/asuwD0YhXmY/s1600-h/vpc2007.JPG"&gt;&lt;img src="http://1.bp.blogspot.com/_6w4ImPfz71k/SyW2BhRzU0I/AAAAAAAABU4/asuwD0YhXmY/s400/vpc2007.JPG" border="0" alt="" id="BLOGGER_PHOTO_ID_5414934264212050754" style="text-align: left;display: block; margin-top: 0px; margin-right: auto; margin-bottom: 10px; margin-left: auto; cursor: pointer; width: 400px; height: 283px; " /&gt;&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: left;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div style="text-align: center;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 238); -webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;以Virtual PC2007为例子，需要把Target的端口映射成一个 命名管道。其他的虚拟及程序如 VMWare 以及 VirtualBox也都有相应的设置。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;然后，修改 windbg的参数，通过命名管道连接target &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Verdana, Arial, Helvetica, sans-serif;font-size:11px;"&gt;&lt;strong&gt;&lt;/strong&gt;&lt;blockquote&gt;&lt;strong&gt;windbg &lt;/strong&gt;&lt;strong&gt;-k&lt;/strong&gt; &lt;strong&gt;com:pipe,port=\\.\pipe\&lt;i&gt;&lt;span class="Apple-style-span"  style="color:#CC0000;"&gt;com2&lt;/span&gt;&lt;/i&gt;&lt;/strong&gt;&lt;strong&gt;,resets=0&lt;/strong&gt;&lt;strong&gt;,reconnect&lt;/strong&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Verdana, Arial, Helvetica, sans-serif;font-size:11px;"&gt;&lt;strong&gt;&lt;span class="Apple-style-span"   style=" font-weight: normal;  font-family:Georgia, serif;font-size:16px;"&gt;连接搞定！！！&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Verdana, Arial, Helvetica, sans-serif;font-size:11px;"&gt;&lt;strong&gt;&lt;span class="Apple-style-span"   style=" font-weight: normal;  font-family:Georgia, serif;font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Verdana, Arial, Helvetica, sans-serif;font-size:11px;"&gt;&lt;strong&gt;&lt;span class="Apple-style-span"   style=" font-weight: normal;  font-family:Georgia, serif;font-size:16px;"&gt;效果和使用一个 单独的target计算机一样 :D&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Verdana, Arial, Helvetica, sans-serif;font-size:11px;"&gt;&lt;strong&gt;&lt;span class="Apple-style-span"   style=" font-weight: normal;  font-family:Georgia, serif;font-size:16px;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="-webkit-text-decorations-in-effect: underline; "&gt;&lt;span class="Apple-style-span"   style="  ;font-family:Verdana, Arial, Helvetica, sans-serif;font-size:11px;"&gt;&lt;strong&gt;&lt;span class="Apple-style-span"   style=" font-weight: normal;  font-family:Georgia, serif;font-size:16px;"&gt; &lt;/span&gt;&lt;/strong&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-8199196450678812600?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/en-us/library/cc266372.aspx' title='通过虚拟机进行 Windows Kernel Debug'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/8199196450678812600/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=8199196450678812600' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/8199196450678812600'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/8199196450678812600'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/12/windows-kernel-debug_14.html' title='通过虚拟机进行 Windows Kernel Debug'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_6w4ImPfz71k/SyW2BhRzU0I/AAAAAAAABU4/asuwD0YhXmY/s72-c/vpc2007.JPG' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-6464676760611921931</id><published>2009-12-14T10:22:00.004+08:00</published><updated>2009-12-14T11:28:37.233+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Develop'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Windows Kernel Debug</title><content type='html'>Debug 对于程序开发来说是非常非常重要的手段。一个良好的Debug开发环境会让开发工作无往而不利。 对于 Microsoft Windows这样的庞然大物，内核开发的调试工作是非常有挑战性的。Windows 驱动程序开发，这些都需要进行内核级别的调试。当然，Microsoft的同志们，感触肯定比我们要多，因为他们每天都要在上面工作。&lt;div&gt;Microsoft实际上也已经作了大量的工作，对于Windows内核开发而言，内核的调试其实还是很简单的。 &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;1， 硬件环境准备&lt;/div&gt;&lt;div&gt;进行windows内核调试，原则上需要两台计算机：一个运行测试代码叫做target；另一个运行debugger 叫做 Host。在Target与Host之间需要 通讯连接。目前比较常见的有三种： 串口，USB， 和1394。 串口是最常见的，下面就以串口为例。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;img src="http://www.wd-3.com/archive/REMOTEDBG_0.gif" alt="Figure 1 Target and Host." /&gt;&lt;/div&gt;&lt;div&gt;(from &lt;a href="http://www.wd-3.com/archive/RemoteDbg.htm"&gt;http://www.wd-3.com/archive/RemoteDbg.htm&lt;/a&gt;, Author: Jolyon Wright)&lt;/div&gt;&lt;div&gt;可以把 Host COM1 连接 Target COM1；也可以 Host COM2 连 Target COM1。&lt;/div&gt;&lt;div&gt;连接的时候不需要 一一对应。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2，Target 设置&lt;/div&gt;&lt;div&gt;所谓Target设置，其实就是打开Target计算机 Windows操作系统的调试选项。Windows都是内置内核调试功能的， 但是缺省关闭的。需要通过修改启动参数 （boot option） 打开。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;对于Windows server 2003/XP/2000 操作系统，可以修改 Boot.ini  在启动项的后面加上&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="color:#CC0000;"&gt;“/debug /debugport=COM2 /baudrate=115200”&lt;/span&gt;&lt;/div&gt;&lt;div&gt;看起来就象下面这样： &lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: nowrap;"&gt;&lt;nobr&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;&lt;/span&gt;&lt;/i&gt;&lt;/nobr&gt;&lt;/span&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="white-space: nowrap;"&gt;&lt;nobr&gt;&lt;i&gt;&lt;span class="Apple-style-span" style="font-size: small;"&gt;multi(0)disk(0)rdisk(0)partition(1)\WINDOWS="Windows XP Debug1" /fastdetect /debug /debugport=COM1 /baudrate=115200&lt;/span&gt;&lt;/i&gt;&lt;/nobr&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;这里 debugport 可以用COM1/2, Baudrate也可以作相应的调整 115200是不错的选择。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;对于Windows Vista/2008/7 操作系统，需要使用 bcdedit来设置。这里需要两步：&lt;/div&gt;&lt;div&gt;第一： 打开debug &lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, mono; color: rgb(102, 0, 0); white-space: nowrap; "&gt; bcdedit /debug &lt;i&gt;&lt;id&gt;&lt;/i&gt; [on | off]&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Courier New', Courier, mono;color:#660000;"&gt;&lt;span class="Apple-style-span" style="white-space: nowrap;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: Georgia, serif; white-space: normal; "&gt;第二： 设置debug参数  &lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:'Courier New', Courier, mono;color:#660000;"&gt;&lt;span class="Apple-style-span" style="white-space: nowrap;"&gt;&lt;span class="Apple-style-span" style="color: rgb(0, 0, 0); font-family: Georgia, serif; white-space: normal; "&gt;  &lt;span class="Apple-style-span" style="font-family: 'Courier New', Courier, mono; color: rgb(102, 0, 0); white-space: nowrap; "&gt;bcdedit /dbgsettings SERIAL DEBUGPORT:2 BAUDRATE:115200&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;第二步其实可以跳过，系统缺省使用串口COM1,  速率：115200。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;然后重新启动Target，进入调试模式。 其实在调试模式下，如果没有连上Debugger，系统运行起来就跟普通的系统差不多，可能会慢一些。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;3, Host调试软件&lt;/div&gt;&lt;div&gt;Host 需要安装 Debugging Tools for Windows (&lt;a href="http://www.microsoft.com/whdc/devtools/downloads.mspx"&gt;http://www.microsoft.com/whdc/devtools/downloads.mspx&lt;/a&gt;)&lt;/div&gt;&lt;div&gt;安装完毕后，就可以使用Windbg连接 target。建议使用 6.11或更高的版本。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;运行参数： &lt;/div&gt;&lt;div&gt;&lt;nobr&gt;&lt;b&gt;windbg&lt;/b&gt; &lt;b&gt;-k com:port=&lt;/b&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="color:#CC0000;"&gt;Com1&lt;/span&gt;&lt;/i&gt;&lt;b&gt;,baud=&lt;i&gt;&lt;span class="Apple-style-span" style="font-weight: normal;"&gt;&lt;span class="Apple-style-span"  style="color:#CC0000;"&gt;115200&lt;/span&gt;&lt;/span&gt;&lt;/i&gt;&lt;/b&gt; &lt;/nobr&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Windbg启动后应该显示：&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 11px; "&gt;&lt;div class="codeblock_unnumbered" style="padding-right: 5px; padding-left: 5px; font-size: 14px; padding-bottom: 5px; padding-top: 5px; font-family: 'Courier New'; background-color: rgb(238, 238, 238); "&gt;Microsoft (R) Windows Debugger Version 6.1.0017.2&lt;br /&gt;Copyright (c) Microsoft Corporation. All rights reserved.&lt;br /&gt;Opened \\.\com1&lt;br /&gt;Waiting to reconnect...&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 16px; "&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Target连接成功后应该显示：&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;div class="codeblock_unnumbered" style="padding-right: 5px; padding-left: 5px; font-size: 14px; padding-bottom: 5px; padding-top: 5px; font-family: 'Courier New'; background-color: rgb(238, 238, 238); "&gt;Connected to Windows XP 2600 x86 compatible target, ptr64 FALSE&lt;br /&gt;Kernel Debugger connection established.&lt;br /&gt;Symbol search path is: \\Sysphus\softshared\symbols\KillerApp\sym;SRV*\\Sysphus\softshared\symbols\SymStore*http://msdl.microsoft.com/download/symbols&lt;br /&gt;Executable search path is:&lt;br /&gt;Windows XP Kernel Version 2600 MP (1 procs) Checked x86 compatible&lt;br /&gt;Built by: 2600.xpsp1.020828-1920&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 16px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 16px; "&gt;显示的内容会随着Target运行软件的版本而有些不同。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;在windbg 通过 ctrl+break键 来中断 target，进入调试交互状态，这时候Target就像死了一样，别紧张，这是因为你再通过debugger来 控制它。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 16px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 16px; "&gt;4, Host 配置Symbol Path&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 16px; "&gt;调试中有一个很重的步骤就是 Symbol，没有Symbol 在调试中寸步难行，我们只能面对一堆二进制代码。微软提供的Symbol支持方案配置很灵活，可以有本地symbol 也可以通过Symbol server, symbol cache。 关于symbol 在 Debugging Tools for Windows的 帮助文件中 专门有一个章节介绍： Debuggers &gt;&gt; Symbols &lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;比较快捷的办法：下载 Windows Symbol Files；同时配置 Microsoft的symbol server。&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;A, 下载相应版本的 Windows Symbol Files &lt;span class="Apple-style-span" style="font-family: Verdana; font-size: 11px; "&gt;&lt;a href="http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx#f"&gt;http://www.microsoft.com/whdc/devtools/debugging/symbolpkg.mspx&lt;/a&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;安装到 一个位置：如　C:\WinSymbols&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;B,  在Windbg中设置 Symbol paths: File--&gt; Symbol File Path  快捷方式(Ctrl+S)&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;设置path 为: &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px;"&gt;&lt;blockquote&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;C:\WinSymbols;&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#CC0000;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;d:\OtherPath\To\the\build\pdb&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;;srv*&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FF6600;"&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;D:\Symbols&lt;/span&gt;&lt;/span&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;*http://msdl.microsoft.com/download/symbols&lt;/span&gt;&lt;/blockquote&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 16px; "&gt;这里D:\Symbols 是用来保存从 Microsoft symbol服务器下载回来的 pdb。&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span" style="font-family: Georgia, serif; font-size: 16px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;剩下的工作就是学习如何使用 windbg了。 :) &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"   style="font-family:Georgia, serif;font-size:130%;"&gt;&lt;span class="Apple-style-span" style="font-size: 16px; "&gt;Goood luck~~~&lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-6464676760611921931?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.microsoft.com/whdc/devtools/wdk/default.mspx' title='Windows Kernel Debug'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/6464676760611921931/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=6464676760611921931' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6464676760611921931'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6464676760611921931'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/12/windows-kernel-debug.html' title='Windows Kernel Debug'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-6888460211965846024</id><published>2009-11-30T16:32:00.003+08:00</published><updated>2009-11-30T16:47:27.690+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GOOGLE'/><category scheme='http://www.blogger.com/atom/ns#' term='network'/><title type='text'>如果安装 Chrome OS 的系统免费怎样？</title><content type='html'>关于Google Chrome OS的讨论已经很多了，有人说好，有人说滥。总的来说 Chrome OS 的核心问题还是PC的味道还不足！怎么都还是一个 Internet 的终端，虽然它也许能够在浏览器中执行 native code，但是再怎么搞也还不是全功能的 PC，不能与 Microsoft Windows 抗衡。&lt;br /&gt;&lt;br /&gt;但是如果 安装了 Chrome OS 的netbook 免费送给你那会怎样？ 你会不会想要一个？ 比较可能的方案是： 将Chrome OS上网本与无线运营商的宽带服务绑定， 签一个 2年的每月 $30 的合约，白送你一个 Chrome OS 上网本！WIFI 自然是由Google 自家提供！ Chrome OS 功能虽然弱，比起手机啥的还是要强大很多了吧？&lt;br /&gt;&lt;br /&gt;这可以制造一个传统PC完全不同的用户体验，完全不一样的应用环境，完全不同的商业模式。如果用户完全适应了这样的 应用环境，还有谁会去买Windows？ 微软的用户优势将当然无存！ 有点耸人听闻?  :)  &lt;br /&gt;&lt;br /&gt;也许这就是将来的互联网， 就如同 Sun Microsystem 的口号：网络就是计算机！&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-6888460211965846024?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.chromium.org/chromium-os' title='如果安装 Chrome OS 的系统免费怎样？'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/6888460211965846024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=6888460211965846024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6888460211965846024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6888460211965846024'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/11/chrome-os.html' title='如果安装 Chrome OS 的系统免费怎样？'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-302170711283969738</id><published>2009-11-20T10:54:00.003+08:00</published><updated>2009-11-20T12:00:12.659+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GOOGLE'/><title type='text'>Google Chromium OS 那点儿事儿</title><content type='html'>Google 要做操作系统了！ 哦，怎么又是Chromium? 不是已经有了一个Google Chrome了？&lt;br /&gt;&lt;br /&gt;Google Chromium OS 的口号就是 “浏览器就是你的操作系统”！&lt;br /&gt;&lt;object height="344" width="425"&gt;&lt;param name="movie" value="http://www.youtube.com/v/0QRO3gKj3qw&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=en_US&amp;amp;feature=player_embedded&amp;amp;fs=1"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://www.youtube.com/v/0QRO3gKj3qw&amp;amp;color1=0xb1b1b1&amp;amp;color2=0xcfcfcf&amp;amp;hl=en_US&amp;amp;feature=player_embedded&amp;amp;fs=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" height="344" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;很明显，Chromium的目标就是上网本。NVIDIA 在这里也后很多动作，特别是她们的 Tegra SoC芯片，在这个完全以浏览器为核心的平台上，用户尽可以忘掉自己用的是 Intel, AMD, X86, AMD64, or ARM。 其实这也符合Google的利益， 很难有x86的CPU卖到 20美元以下，而最贵的ARM CPU也就是20美元。 ARM架构的上网本，无疑会极大程度的推动 上网本的价格 更平民化。 越多的人拥有 上网本，就为Google提供了更多的用户。&lt;br /&gt;&lt;br /&gt;这里的潜台词就是：“您上internet吗？ 如果上internet就用Google吧！我们是最好的！”  听到这个，微软 一定要昏倒了。不过也不必反映过度，这终究只是一个新兴的领域。谁工作做的更到位，谁就会领先。 微软要加油了！&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-302170711283969738?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://developer.nvidia.com/object/ChromiumOS.html' title='Google Chromium OS 那点儿事儿'/><link rel='enclosure' type='' href='http://www.chromium.org/chromium-os' length='0'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/302170711283969738/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=302170711283969738' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/302170711283969738'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/302170711283969738'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/11/google-chromium-os.html' title='Google Chromium OS 那点儿事儿'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-7809945403819178894</id><published>2009-10-23T16:20:00.001+08:00</published><updated>2009-10-23T16:20:59.732+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Linus and Windows7</title><content type='html'>Enjoy it!&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-7809945403819178894?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://blogs.zdnet.com/perlow/?p=11403' title='Linus and Windows7'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/7809945403819178894/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=7809945403819178894' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7809945403819178894'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7809945403819178894'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/10/linus-and-windows7.html' title='Linus and Windows7'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-6027254020597804016</id><published>2009-10-02T10:12:00.001+08:00</published><updated>2009-10-02T10:12:26.288+08:00</updated><title type='text'>从Graphic PU走向General PU</title><content type='html'>&lt;div xmlns='http://www.w3.org/1999/xhtml'&gt;&lt;p&gt;G300 作为 nVidia 的下一代GPU，3引入很多变化: 512 CUDA Cores, L1/L2 cache, GigaThread, ECC memory controller. 看起来都更像是一个General Processing Unit.&lt;br/&gt;&lt;br/&gt;nVidia 还是有雄心壮志的，对于nVidia而言，这是一个大胆的尝试。&lt;wbr/&gt;从架构上看，确实可以被称为下一代。&lt;/p&gt;in reference to: &lt;a href='http://www.nvidia.com/object/fermi_architecture.html'&gt;Next Generation CUDA Architecture, Code Named Fermi&lt;/a&gt; (&lt;a href='http://www.google.com/sidewiki/entry/ilinux/id/ZbTJMWikLwsQFd8i400_9WgLRGM'&gt;view on Google Sidewiki&lt;/a&gt;)&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-6027254020597804016?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/6027254020597804016/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=6027254020597804016' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6027254020597804016'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6027254020597804016'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/10/graphic-pugeneral-pu.html' title='从Graphic PU走向General PU'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-2003932561376617287</id><published>2009-09-28T10:18:00.003+08:00</published><updated>2009-09-28T10:40:20.498+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GOOGLE'/><category scheme='http://www.blogger.com/atom/ns#' term='VoIP'/><title type='text'>Google Voice and bandwidth.com</title><content type='html'>It isn't a secret that the land line provided by Google Voice is ordered from Bandwidth.com -- The 4st fastest growing privately held company in U.S.A.  Bandwidth.com is a company in RTP, North Carolina.&lt;br /&gt;&lt;br /&gt;The small high-tech company always be the source of creatures! Why we don't have these in China? //sigh&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-2003932561376617287?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.bandwidth.com/' title='Google Voice and bandwidth.com'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/2003932561376617287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=2003932561376617287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2003932561376617287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2003932561376617287'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/09/google-voice-and-bandwidthcom.html' title='Google Voice and bandwidth.com'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-1969555917468595545</id><published>2009-09-02T09:56:00.002+08:00</published><updated>2009-09-02T10:14:03.548+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><title type='text'>VIM Wiki</title><content type='html'>非常不错的网站 介绍了很多VIM的技巧。今天用到了一个小技巧，如何在VIM内排序。在VIM7.0&lt;br /&gt;这个非常简单，可以直接使用内置的`:sort' 命令。当然，还可以剔除重复的 `:sort u'.&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-1969555917468595545?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://vim.wikia.com/wiki/Main_Page' title='VIM Wiki'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/1969555917468595545/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=1969555917468595545' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1969555917468595545'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1969555917468595545'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/09/vim-wiki.html' title='VIM Wiki'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-4975448750625062947</id><published>2009-08-13T12:30:00.002+08:00</published><updated>2009-08-13T12:33:27.041+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='i18n'/><title type='text'>What's Byte Order Mark (BOM) in Unicode</title><content type='html'>When a BOM is used, is it only in             16-bit Unicode text?            &lt;p class="a"&gt;A: No, a BOM can be used as a signature no matter how the          Unicode text is transformed: UTF-16, UTF-8, UTF-7, etc. The exact bytes          comprising the BOM will be whatever the Unicode character FEFF is          converted into by that transformation format. In that form, the BOM          serves to indicate both that it is a Unicode file, and which of the          formats it is in. Examples:&lt;/p&gt;                                            &lt;table border="1" cellpadding="2" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;               &lt;th width="50%"&gt;Bytes&lt;/th&gt;               &lt;th width="50%"&gt;Encoding Form&lt;/th&gt;             &lt;/tr&gt;             &lt;tr&gt;               &lt;td width="50%"&gt;00 00 FE FF&lt;/td&gt;               &lt;td width="50%"&gt;UTF-32, big-endian&lt;/td&gt;             &lt;/tr&gt;             &lt;tr&gt;               &lt;td width="50%"&gt;FF FE 00 00&lt;/td&gt;               &lt;td width="50%"&gt;UTF-32, little-endian&lt;/td&gt;             &lt;/tr&gt;             &lt;tr&gt;               &lt;td width="50%"&gt;FE FF&lt;/td&gt;               &lt;td width="50%"&gt;UTF-16, big-endian&lt;/td&gt;             &lt;/tr&gt;             &lt;tr&gt;               &lt;td width="50%"&gt;FF FE&lt;/td&gt;               &lt;td width="50%"&gt;UTF-16, little-endian&lt;/td&gt;             &lt;/tr&gt;             &lt;tr&gt;               &lt;td width="50%"&gt;EF BB BF&lt;/td&gt;               &lt;td width="50%"&gt;UTF-8&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;链接是 UTF系列问题的权威解答FAQ，强烈建议阅读！&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-4975448750625062947?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://unicode.org/faq/utf_bom.html' title='What&apos;s Byte Order Mark (BOM) in Unicode'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/4975448750625062947/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=4975448750625062947' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/4975448750625062947'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/4975448750625062947'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/08/whats-byte-order-mark-bom-in-unicode.html' title='What&apos;s Byte Order Mark (BOM) in Unicode'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-6000676721652700024</id><published>2009-08-13T12:16:00.006+08:00</published><updated>2009-08-13T14:59:32.936+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><title type='text'>VIM unicode</title><content type='html'>在 MS Windows 下面由于受 Byte Order Mark (BOM) 的控制， 需要对GVIM 做一些配置才能正常工作。 这包括 tenc, enc, fencs, guifont, guifontwide。 这样一来，vim就可以自动 根据BOM做出正确的显示了，同时也可以自动识别GBK和BIG5。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color:#ffff60;"&gt;if&lt;/span&gt; &lt;span style="color:#40ffff;"&gt;has&lt;/span&gt;&lt;span style="color:#ffff60;"&gt;(&lt;/span&gt;&lt;span style="color:#ffa0a0;"&gt;"multi_byte"&lt;/span&gt;&lt;span style="color:#ffff60;"&gt;)&lt;/span&gt;&lt;br /&gt;  &lt;span style="color:#ffff60;"&gt;set&lt;/span&gt; &lt;span style="color:#ff80ff;"&gt;encoding&lt;/span&gt;=unicode&lt;br /&gt;  &lt;span style="color:#ffff60;"&gt;let&lt;/span&gt; &amp;amp;termencoding &lt;span style="color:#ffff60;"&gt;=&lt;/span&gt; &amp;amp;encoding&lt;br /&gt;&lt;span style="color:#80a0ff;"&gt;  " Set default encoding as UTF-8 with BOM&lt;/span&gt;&lt;br /&gt;  &lt;span style="color:#ffff60;"&gt;setglobal&lt;/span&gt; &lt;span style="color:#ff80ff;"&gt;fileencoding&lt;/span&gt;=utf-8 &lt;span style="color:#ff80ff;"&gt;bomb&lt;/span&gt;&lt;br /&gt;&lt;span style="color:#80a0ff;"&gt;  " Auto detect the file encoding BOM unicode, utf-8, GBK, Big5, Latin1&lt;/span&gt;&lt;br /&gt;  &lt;span style="color:#ffff60;"&gt;set&lt;/span&gt; &lt;span style="color:#ff80ff;"&gt;fileencodings&lt;/span&gt;=ucs-bom&lt;span style="color:#ffff60;"&gt;,&lt;/span&gt;utf-8&lt;span style="color:#ffff60;"&gt;,&lt;/span&gt;cp936&lt;span style="color:#ffff60;"&gt;,&lt;/span&gt;cp950&lt;span style="color:#ffff60;"&gt;,&lt;/span&gt;latin1&lt;br /&gt;&lt;br /&gt;&lt;span style="color:#80a0ff;"&gt;  " Walkaround the encoding problem for fenc=utf-8 &amp;amp;&amp;amp; enc=ucs-2&lt;/span&gt;&lt;br /&gt;  &lt;span style="color:#ffff60;"&gt;augroup&lt;/span&gt; i18n&lt;br /&gt;      &lt;span style="color:#ffff60;"&gt;autocmd&lt;/span&gt;!&lt;br /&gt;      &lt;span style="color:#ffff60;"&gt;autocmd&lt;/span&gt; &lt;span style="color:#60ff60;"&gt;BufReadPost&lt;/span&gt; * &lt;span style="color:#ffff60;"&gt;if&lt;/span&gt; &amp;amp;fileencoding &lt;span style="color:#ffff60;"&gt;==&lt;/span&gt; &lt;span style="color:#ffa0a0;"&gt;"utf-8"&lt;/span&gt; | &lt;span style="color:#ffff60;"&gt;let&lt;/span&gt; &amp;amp;encoding &lt;span style="color:#ffff60;"&gt;=&lt;/span&gt; &amp;amp;fileencoding | &lt;span style="color:#ffff60;"&gt;endif&lt;/span&gt;&lt;br /&gt;  &lt;span style="color:#ffff60;"&gt;augroup&lt;/span&gt; END&lt;br /&gt;&lt;span style="color:#ffff60;"&gt;endif&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 160, 255);"&gt;" Enable the Chinese characters&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(128, 160, 255);"&gt;"set guifont=Bitstream\ Vera\ Sans\ Mono:h10:cANSI,NSimSun:h11:cGB2312&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 255, 96);"&gt;set&lt;/span&gt; &lt;span style="color: rgb(255, 128, 255);"&gt;guifont&lt;/span&gt;=Consolas&lt;span style="color: rgb(255, 255, 96);"&gt;:&lt;/span&gt;h11&lt;span style="color: rgb(255, 255, 96);"&gt;:&lt;/span&gt;cANSI&lt;span style="color: rgb(255, 255, 96);"&gt;,&lt;/span&gt;NSimSun&lt;span style="color: rgb(255, 255, 96);"&gt;:&lt;/span&gt;h11&lt;span style="color: rgb(255, 255, 96);"&gt;:&lt;/span&gt;cGB2312&lt;br /&gt;&lt;span style="color: rgb(255, 255, 96);"&gt;set&lt;/span&gt; &lt;span style="color: rgb(255, 128, 255);"&gt;guifontwide&lt;/span&gt;=NSimSun&lt;span style="color: rgb(255, 255, 96);"&gt;:&lt;/span&gt;h11&lt;span style="color: rgb(255, 255, 96);"&gt;:&lt;/span&gt;cGB2312&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-6000676721652700024?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://vim.wikia.com/wiki/Working_with_Unicode' title='VIM unicode'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/6000676721652700024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=6000676721652700024' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6000676721652700024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6000676721652700024'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/08/vim-unicode.html' title='VIM unicode'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-6207030212088616028</id><published>2009-08-12T14:29:00.002+08:00</published><updated>2009-08-12T14:40:59.264+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GOOGLE'/><title type='text'>Google Wave Sandbox</title><content type='html'>This is the first time for me to use Google Wave. It looks a little strange as a fresh user.  We MUST fully understand "what is a WAVE?"&lt;br /&gt;&lt;ul&gt;&lt;li&gt;IM?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Word?&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Blog?&lt;/li&gt;&lt;li&gt;twitter?&lt;br /&gt;&lt;/li&gt;&lt;li&gt; SNS?&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;Are you understanding this? It might be better if there are some others in my Wave. I need to take a look at the Google Wave API to find more.&lt;br /&gt;&lt;br /&gt;It just likes someone said, "It looks more like a Microsoft product, not Google!" I think, it still takes time to figure out "What's a Wave?"&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-6207030212088616028?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='https://wave.google.com/a/wavesandbox.com/' title='Google Wave Sandbox'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/6207030212088616028/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=6207030212088616028' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6207030212088616028'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6207030212088616028'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/08/google-wave-sandbox.html' title='Google Wave Sandbox'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-1782144144439274379</id><published>2009-07-14T14:28:00.002+08:00</published><updated>2009-07-14T15:41:35.893+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><title type='text'>Hex string to ASCII string in Perl</title><content type='html'>If you want to convert a string "ABCDEFG" to Hex mode like "07,41,42,43,44,45,46,47" -- a length prefix with all the others in HEX mode. How to do it in Perl?&lt;br /&gt;&lt;br /&gt;You can do&lt;br /&gt;&lt;pre&gt;$to = join(",", map { unpack('H2', $_) } chr(length($from)), split(/(?=.)/, $from));&lt;/pre&gt;&lt;br /&gt;or &lt;pre&gt;$to = join(",", map { unpack('H2', $_) } split(/(?=.)/, pack('W/a', $from)));&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;How to do the reverse??? A question for you :P&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-1782144144439274379?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://perldoc.perl.org/functions/pack.html' title='Hex string to ASCII string in Perl'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/1782144144439274379/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=1782144144439274379' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1782144144439274379'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1782144144439274379'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/07/hex-string-to-ascii-string-in-perl.html' title='Hex string to ASCII string in Perl'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-528398775471851318</id><published>2009-06-30T15:56:00.006+08:00</published><updated>2009-06-30T16:03:02.570+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WEB'/><category scheme='http://www.blogger.com/atom/ns#' term='GOOGLE'/><title type='text'>An English-to-Chinese Dictionary based on the evil Google Suggest Quries</title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#40ffff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#40ffff"&gt;SearchPlugin&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#60ff60"&gt;xmlns&lt;/font&gt;=&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;a href="http://www.mozilla.org/2006/browser/search/"&gt;http://www.mozilla.org/2006/browser/search/&lt;/a&gt;&amp;quot;&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#40ffff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#40ffff"&gt;ShortName&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;gt;&lt;/font&gt;gDictionary&lt;font color="#40ffff"&gt;&amp;lt;/ShortName&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#40ffff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#40ffff"&gt;Description&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;gt;&lt;/font&gt;Google English-Chinese Dictionary&lt;font color="#40ffff"&gt;&amp;lt;/Description&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#40ffff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#40ffff"&gt;InputEncoding&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;gt;&lt;/font&gt;UTF-8&lt;font color="#40ffff"&gt;&amp;lt;/InputEncoding&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#40ffff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#40ffff"&gt;Image&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#60ff60"&gt;width&lt;/font&gt;=&lt;font color="#ffa0a0"&gt;&amp;quot;16&amp;quot;&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#60ff60"&gt;height&lt;/font&gt;=&lt;font color="#ffa0a0"&gt;&amp;quot;16&amp;quot;&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;gt;&lt;/font&gt;data:image/png;base64,AAABAAEAEBAAAAEAGABoAwAAFgAAACgAAAAQAAAAIAAAAAEAGAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADs9Pt8xetPtu9FsfFNtu%2BTzvb2%2B%2Fne4dFJeBw0egA%2FfAJAfAA8ewBBegAAAAD%2B%2FPtft98Mp%2BwWsfAVsvEbs%2FQeqvF8xO7%2F%2F%2F63yqkxdgM7gwE%2FggM%2BfQA%2BegBDeQDe7PIbotgQufcMufEPtfIPsvAbs%2FQvq%2Bfz%2Bf%2F%2B%2B%2FZKhR05hgBBhQI8hgBAgAI9ewD0%2B%2Fg3pswAtO8Cxf4Kw%2FsJvvYAqupKsNv%2B%2Fv7%2F%2FP5VkSU0iQA7jQA9hgBDgQU%2BfQH%2F%2Ff%2FQ6fM4sM4KsN8AteMCruIqqdbZ7PH8%2Fv%2Fg6Nc%2Fhg05kAA8jAM9iQI%2BhQA%2BgQDQu6b97uv%2F%2F%2F7V8Pqw3eiWz97q8%2Ff%2F%2F%2F%2F7%2FPptpkkqjQE4kwA7kAA5iwI8iAA8hQCOSSKdXjiyflbAkG7u2s%2F%2B%2F%2F39%2F%2F7r8utrqEYtjQE8lgA7kwA7kwA9jwA9igA9hACiWSekVRyeSgiYSBHx6N%2F%2B%2Fv7k7OFRmiYtlAA5lwI7lwI4lAA7kgI9jwE9iwI4iQCoVhWcTxCmb0K%2BooT8%2Fv%2F7%2F%2F%2FJ2r8fdwI1mwA3mQA3mgA8lAE8lAE4jwA9iwE%2BhwGfXifWvqz%2B%2Ff%2F58u%2Fev6Dt4tr%2B%2F%2F2ZuIUsggA7mgM6mAM3lgA5lgA6kQE%2FkwBChwHt4dv%2F%2F%2F728ei1bCi7VAC5XQ7kz7n%2F%2F%2F6bsZkgcB03lQA9lgM7kwA2iQktZToPK4r9%2F%2F%2F9%2F%2F%2FSqYK5UwDKZAS9WALIkFn%2B%2F%2F3%2F%2BP8oKccGGcIRJrERILYFEMwAAuEAAdX%2F%2Ff7%2F%2FP%2B%2BfDvGXQLIZgLEWgLOjlf7%2F%2F%2F%2F%2F%2F9QU90EAPQAAf8DAP0AAfMAAOUDAtr%2F%2F%2F%2F7%2B%2Fu2bCTIYwDPZgDBWQDSr4P%2F%2Fv%2F%2F%2FP5GRuABAPkAA%2FwBAfkDAPAAAesAAN%2F%2F%2B%2Fz%2F%2F%2F64g1C5VwDMYwK8Yg7y5tz8%2Fv%2FV1PYKDOcAAP0DAf4AAf0AAfYEAOwAAuAAAAD%2F%2FPvi28ymXyChTATRrIb8%2F%2F3v8fk6P8MAAdUCAvoAAP0CAP0AAfYAAO4AAACAAQAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAACAAQAA&lt;font color="#40ffff"&gt;&amp;lt;/Image&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#40ffff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#40ffff"&gt;Url&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#60ff60"&gt;type&lt;/font&gt;=&lt;font color="#ffa0a0"&gt;&amp;quot;application/x-suggestions+json&amp;quot;&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#60ff60"&gt;method&lt;/font&gt;=&lt;font color="#ffa0a0"&gt;&amp;quot;GET&amp;quot;&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#60ff60"&gt;template&lt;/font&gt;=&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;a href="http://suggestqueries.google.com/complete/search?client=suggest"&gt;http://suggestqueries.google.com/complete/search?client=suggest&lt;/a&gt;&lt;/font&gt;&lt;font color="#60ff60"&gt;&amp;amp;&lt;/font&gt;&lt;font color="#ffff60"&gt;amp&lt;/font&gt;&lt;font color="#60ff60"&gt;;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;hjson=t&lt;/font&gt;&lt;font color="#60ff60"&gt;&amp;amp;&lt;/font&gt;&lt;font color="#ffff60"&gt;amp&lt;/font&gt;&lt;font color="#60ff60"&gt;;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;ds=d&lt;/font&gt;&lt;font color="#60ff60"&gt;&amp;amp;&lt;/font&gt;&lt;font color="#ffff60"&gt;amp&lt;/font&gt;&lt;font color="#60ff60"&gt;;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;hl=zh-CN&lt;/font&gt;&lt;font color="#60ff60"&gt;&amp;amp;&lt;/font&gt;&lt;font color="#ffff60"&gt;amp&lt;/font&gt;&lt;font color="#60ff60"&gt;;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;q={searchTerms}&amp;quot;&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;lt;/Url&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#40ffff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#40ffff"&gt;Url&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#60ff60"&gt;type&lt;/font&gt;=&lt;font color="#ffa0a0"&gt;&amp;quot;text/html&amp;quot;&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#60ff60"&gt;method&lt;/font&gt;=&lt;font color="#ffa0a0"&gt;&amp;quot;GET&amp;quot;&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#60ff60"&gt;template&lt;/font&gt;=&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;a href="http://www.google.com/dictionary?aq=f"&gt;http://www.google.com/dictionary?aq=f&lt;/a&gt;&lt;/font&gt;&lt;font color="#60ff60"&gt;&amp;amp;&lt;/font&gt;&lt;font color="#ffff60"&gt;amp&lt;/font&gt;&lt;font color="#60ff60"&gt;;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;langpair=en|zh-CN&lt;/font&gt;&lt;font color="#60ff60"&gt;&amp;amp;&lt;/font&gt;&lt;font color="#ffff60"&gt;amp&lt;/font&gt;&lt;font color="#60ff60"&gt;;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;hl=en&lt;/font&gt;&lt;font color="#60ff60"&gt;&amp;amp;&lt;/font&gt;&lt;font color="#ffff60"&gt;amp&lt;/font&gt;&lt;font color="#60ff60"&gt;;&lt;/font&gt;&lt;font color="#ffa0a0"&gt;q={searchTerms}&amp;quot;&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;gt;&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;lt;/Url&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#40ffff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#40ffff"&gt;SearchForm&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;gt;&lt;/font&gt;&lt;a href="http://www.google.com/dictionary"&gt;http://www.google.com/dictionary&lt;/a&gt;&lt;font color="#40ffff"&gt;&amp;lt;/SearchForm&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#40ffff"&gt;&amp;lt;/SearchPlugin&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-528398775471851318?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='https://addons.mozilla.org/en-US/firefox/collection/firebug_addons' title='An English-to-Chinese Dictionary based on the evil Google Suggest Quries'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/528398775471851318/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=528398775471851318' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/528398775471851318'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/528398775471851318'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/06/english-to-chinese-dictionary-based-on.html' title='An English-to-Chinese Dictionary based on the evil Google Suggest Quries'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-866320264660679347</id><published>2009-06-29T14:36:00.003+08:00</published><updated>2009-06-29T14:48:53.733+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>Small Skills of Command Prompt for Windows</title><content type='html'>There are some useful skills for CMD.exe in Windows.&lt;br /&gt;&lt;br /&gt;1, How to do a substring in the CMD.exe -- &lt;b&gt;%VAR_NAME:~POS&lt;/b&gt;&lt;start_pos&gt;&lt;b&gt;,LEN&lt;/b&gt;&lt;length&gt;&lt;b&gt;%&lt;/b&gt;&lt;br /&gt;for example&lt;/length&gt;&lt;/start_pos&gt;&lt;div&gt;&lt;i&gt;&lt;/i&gt;&lt;/div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;i&gt;set name=fingercat&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;echo %name:~6,3%&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;div&gt;This will give you a "cat" ;)&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;2, How to get the input of user as a string? &lt;/div&gt;&lt;div&gt;On windows 2000 or later. It is simple. &lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;div&gt;&lt;i&gt;set /p answer=Prompt Message Here&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;i&gt;echo %answer%&lt;/i&gt;&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/blockquote&gt;&lt;/div&gt;&lt;div&gt;This will give you the input stirng of user. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Windows Command Prompt (.bat) file never suppose to be a powerful shell. But Microsoft really give it more an more power until a real PowerShell came into place. &lt;span class="Apple-tab-span" style="white-space:pre"&gt; &lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-866320264660679347?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.terminally-incoherent.com/blog/2006/10/27/substrings-in-windows-batch-files/' title='Small Skills of Command Prompt for Windows'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/866320264660679347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=866320264660679347' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/866320264660679347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/866320264660679347'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/06/small-skills-of-command-prompt-for.html' title='Small Skills of Command Prompt for Windows'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-1337322135009347119</id><published>2009-06-10T10:42:00.002+08:00</published><updated>2009-06-10T10:52:02.808+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>Inside the Erlang VM - focus on SMP</title><content type='html'>It discussed the current status and possible future of SMP enabled Erlang VM.&lt;br /&gt;It is worth to read!&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-1337322135009347119?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.erlang.se/euc/08/euc_smp.pdf' title='Inside the Erlang VM - focus on SMP'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/1337322135009347119/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=1337322135009347119' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1337322135009347119'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1337322135009347119'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/06/inside-erlang-vm-focus-on-smp.html' title='Inside the Erlang VM - focus on SMP'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-7191877775775339648</id><published>2009-04-22T16:39:00.002+08:00</published><updated>2009-05-26T15:37:46.262+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><title type='text'>VIMRC file</title><content type='html'>&lt;pre&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;source&lt;/font&gt;&amp;nbsp;&lt;font color="#ff80ff"&gt;$VIMRUNTIME&lt;/font&gt;/vimrc_example&lt;font color="#ffff60"&gt;.&lt;/font&gt;&lt;font color="#ffff60"&gt;vim&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;source&lt;/font&gt;&amp;nbsp;&lt;font color="#ff80ff"&gt;$VIMRUNTIME&lt;/font&gt;/gvimrc_example&lt;font color="#ffff60"&gt;.&lt;/font&gt;&lt;font color="#ffff60"&gt;vim&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;set&lt;/font&gt;&amp;nbsp;&lt;font color="#ff80ff"&gt;nobackup&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;set&lt;/font&gt;&amp;nbsp;&lt;font color="#ff80ff"&gt;ch&lt;/font&gt;=1&lt;br /&gt;&lt;font color="#ffff60"&gt;set&lt;/font&gt;&amp;nbsp;&lt;font color="#ff80ff"&gt;tabstop&lt;/font&gt;=4&lt;br /&gt;&lt;font color="#ffff60"&gt;set&lt;/font&gt;&amp;nbsp;&lt;font color="#ff80ff"&gt;shiftwidth&lt;/font&gt;=4&lt;br /&gt;&lt;font color="#80a0ff"&gt;&amp;quot;set softtabstop=4&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;set&lt;/font&gt;&amp;nbsp;&lt;font color="#f80ff"&gt;expandtab&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;colorscheme&lt;/font&gt;&amp;nbsp;darkblue&lt;br /&gt;&lt;font color="#80a0ff"&gt;&amp;quot;colorscheme oceandeep&lt;/font&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;&amp;quot; Enable the Chinese characters&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;set&lt;/font&gt;&amp;nbsp;&lt;font color="#ff80ff"&gt;guifont&lt;/font&gt;=Bitstream\ Vera\ Sans\ Mono&lt;font color="#ffff60"&gt;:&lt;/font&gt;h10&lt;font color="#ffff60"&gt;:&lt;/font&gt;cANSI&lt;font color="#ffff60"&gt;,&lt;/font&gt;NSimSun&lt;font color="#ffff60"&gt;:&lt;/font&gt;h12&lt;font color="#ffff60"&gt;:&lt;/font&gt;cGB2312&lt;br /&gt;&lt;font color="#ffff60"&gt;set&lt;/font&gt;&amp;nbsp;&lt;font color="#ff80ff"&gt;guifontwide&lt;/font&gt;=NSimSun&lt;font color="#ffff60"&gt;:&lt;/font&gt;h12&lt;font color="#ffff60"&gt;:&lt;/font&gt;cGB2312&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;&amp;quot; display the syntax name under the cursor&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;map&lt;/font&gt;&amp;nbsp;&lt;font color="#ffa500"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#ffa500"&gt;F12&lt;/font&gt;&lt;font color="#ffa500"&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;:echo synIDattr(synIDtrans(synID(line(&amp;quot;.&amp;quot;), col(&amp;quot;.&amp;quot;), 1)), &amp;quot;name&amp;quot;)&lt;font color="#ffa500"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#ffa500"&gt;CR&lt;/font&gt;&lt;font color="#ffa500"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;&amp;quot; We can navigate the list by using the &amp;lt;F3&amp;gt; and &amp;lt;S-F3&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;map&lt;/font&gt;&amp;nbsp;&lt;font color="#ffa500"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#ffa500"&gt;F3&lt;/font&gt;&lt;font color="#ffa500"&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;:cnext&lt;font color="#ffa500"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#ffa500"&gt;CR&lt;/font&gt;&lt;font color="#ffa500"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;map&lt;/font&gt;&amp;nbsp;&lt;font color="#ffa500"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#ffa500"&gt;S-F3&lt;/font&gt;&lt;font color="#ffa500"&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;:cprevious&lt;font color="#ffa500"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#ffa500"&gt;CR&lt;/font&gt;&lt;font color="#ffa500"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;&amp;quot; Let's help the tab navigation a little&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;map&lt;/font&gt;&amp;nbsp;&lt;font color="#ffa500"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#ffa500"&gt;F9&lt;/font&gt;&lt;font color="#ffa500"&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;:tabprevious&lt;font color="#ffa500"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#ffa500"&gt;CR&lt;/font&gt;&lt;font color="#ffa500"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;map&lt;/font&gt;&amp;nbsp;&lt;font color="#ffa500"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#ffa500"&gt;S-F9&lt;/font&gt;&lt;font color="#ffa500"&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;:tabnext&lt;font color="#ffa500"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#ffa500"&gt;CR&lt;/font&gt;&lt;font color="#ffa500"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;&amp;quot; Tlist&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;map&lt;/font&gt;&amp;nbsp;&lt;font color="#ffa500"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#ffa500"&gt;F5&lt;/font&gt;&lt;font color="#ffa500"&gt;&amp;gt;&lt;/font&gt;&amp;nbsp;:Tlist&lt;font color="#ffa500"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#ffa500"&gt;CR&lt;/font&gt;&lt;font color="#ffa500"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;set&lt;/font&gt;&amp;nbsp;&lt;font color="#ff80ff"&gt;tags&lt;/font&gt;=./tags&lt;font color="#ffff60"&gt;,&lt;/font&gt;../tags&lt;font color="#ffff60"&gt;,&lt;/font&gt;../../tags&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-7191877775775339648?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.vim.org' title='VIMRC file'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/7191877775775339648/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=7191877775775339648' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7191877775775339648'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7191877775775339648'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/04/vimrc-file.html' title='VIMRC file'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-9196349091008556819</id><published>2009-03-15T21:14:00.002+08:00</published><updated>2009-03-15T22:03:48.803+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CXX'/><title type='text'>C++ reinterpret_cast</title><content type='html'>&lt;p&gt;说起 C++ 的类型转换，一共有四种：&lt;/p&gt;&lt;div&gt;&lt;ul&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;dynamic_cast&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;static_cast&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;reinterpret_cast&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;const_cast&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div&gt;其中 reinterpret_cast 是很有意思的，它可以被看作是 C 语言中强制类型转换的功能，它是一种非检查的暴力转换手段。通过它，我们可以把 指向 int* 转换为 double* 。&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;当然也可以用来做函数指针的转换，比如：&lt;/div&gt;&lt;div&gt;&lt;/div&gt;&lt;/div&gt;&lt;pre&gt;&lt;br /&gt;void FuncA(char *src, int len, int *pLen)&lt;br /&gt;{&lt;br /&gt; *pLen = len;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;int _tmain(int argc, _TCHAR* argv[])&lt;br /&gt;{&lt;br /&gt; bool (*func_ptr) (char*, int);&lt;br /&gt;&lt;br /&gt; func_ptr = reinterpret_cast&amp;lt;bool (*)(char*, int)&amp;gt;(&amp;amp;FuncA);&lt;br /&gt;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;当然了也可以用来转换 类成员函数，如：&lt;div&gt;&lt;/div&gt;&lt;pre&gt;&lt;br /&gt;class ObjectA&lt;br /&gt;{&lt;br /&gt;public:&lt;br /&gt; void FuncA(char *src, int len, int *pLen)&lt;br /&gt; {&lt;br /&gt;  *pLen = len;&lt;br /&gt; }&lt;br /&gt;&lt;br /&gt; bool FuncB(char *src, int len, int *pLen)&lt;br /&gt; {&lt;br /&gt;  *pLen = len;&lt;br /&gt;  return false;&lt;br /&gt; }&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;class ObjectB&lt;br /&gt;{&lt;br /&gt;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;int _tmain(int argc, _TCHAR* argv[])&lt;br /&gt;{&lt;br /&gt; bool (ObjectB::*func_ptr) (char*, int);&lt;br /&gt;&lt;br /&gt; //ObjectA obj;&lt;br /&gt; func_ptr = reinterpret_cast&amp;lt;bool (ObjectB::*)(char*, int)&amp;gt;(&amp;amp;ObjectA::FuncB);&lt;br /&gt;&lt;br /&gt; return 0;&lt;br /&gt;}&lt;br /&gt;&lt;/pre&gt;&lt;p&gt;但是不能在普通函数和类成员函数之间转换。&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-9196349091008556819?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/en-us/library/e0w9f63b(VS.80).aspx' title='C++ reinterpret_cast'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/9196349091008556819/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=9196349091008556819' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/9196349091008556819'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/9196349091008556819'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/03/c-reinterpretcast.html' title='C++ reinterpret_cast'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-330228934040853629</id><published>2009-02-25T11:56:00.004+08:00</published><updated>2009-06-09T09:51:31.765+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WEB'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>Install Safari4 without installation on Windows</title><content type='html'>&lt;div&gt;First, Extract the Safari.cab into a folder. The Safari.cab is from Safari.msi of SafariSetup.exe, you can open the .exe and .msi by using 7-zip tool. :D&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;Second, put the file into the right folder. If you have MinGW or Cygwin, you can use this script to move all the files into the right folder. &lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;for i in *; do  fp=${i//_/\/}; echo $fp; f=$(basename $fp); eval "p=\${fp%$f}"; if [ $fp != $f ];then if [ ! -d $p ];then mkdir -p $p; fi; mv $i $fp; fi; done&lt;/span&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;span class="Apple-style-span"  style="font-family:'courier new';"&gt;&lt;span class="Apple-style-span" style="font-family: Georgia; "&gt;Now ready to go! Safari4 beta is a green software. &lt;/span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-330228934040853629?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.apple.com/safari/' title='Install Safari4 without installation on Windows'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/330228934040853629/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=330228934040853629' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/330228934040853629'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/330228934040853629'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/02/install-safari4-without-installation-on.html' title='Install Safari4 without installation on Windows'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-7033657572412758402</id><published>2009-02-16T17:07:00.002+08:00</published><updated>2009-02-16T17:10:38.167+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='NORTEL'/><title type='text'>NORTEL 幽默</title><content type='html'>NORTEL 从来就不缺乏有才华的人，这个我曾经工作过的百年老店今天已经是风雨飘摇。&lt;br /&gt;看看这些 NORTEL 员工们制作的讽刺剧吧！&lt;br /&gt;&lt;br /&gt;我不得不赞叹，太油菜了！&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-7033657572412758402?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.youtube.com/watch?v=Te7za5upSWk' title='NORTEL 幽默'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/7033657572412758402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=7033657572412758402' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7033657572412758402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7033657572412758402'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/02/nortel.html' title='NORTEL 幽默'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-7567645249853160577</id><published>2009-01-20T11:27:00.002+08:00</published><updated>2009-01-20T11:39:16.430+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Java'/><title type='text'>Java GUI Effectives</title><content type='html'>Java gets widely usage on Server side, while the client technology is still evolution continuously. Since Java 5.0, more and more interesting GUI feature are added into the JVM. They are:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;OpenGL-based render pipeline&lt;br /&gt;As you know, Swing renders all the widgets by itself, that's the reason why some case the Java GUI looks so strange. :) Previously on Microsoft Windows, the DirectDraw and Direct3D was the only choice. But now you can use OpenGL pipeline as well.&lt;br /&gt;It is disabled by default, but it can enabled by setting&lt;br /&gt;&lt;pre&gt;-Dsun.java2d.opengl=true&lt;br /&gt;&lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Font Anti-Aliasing&lt;br /&gt;It is an important feature for the font anti-aliasing. Now it is possible for Java application to specify the Font Anti-Aliasing feature by itself with system property:&lt;br /&gt;&lt;code&gt;&lt;a name="aaFonts"&gt;-Dawt.useSystemAAFontSettings=lcd&lt;/a&gt;&lt;/code&gt;&lt;br /&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Metal and Nimbus Look and Feel&lt;br /&gt;Metal (from Java 5.0) and Nimbus (from Java 6.0u10) are available in standard JRE distribution. &lt;/li&gt;&lt;/ul&gt;Really hope Java could be better and better~~~&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-7567645249853160577?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://java.sun.com/javase/6/docs/technotes/guides/2d/flags.html' title='Java GUI Effectives'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/7567645249853160577/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=7567645249853160577' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7567645249853160577'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7567645249853160577'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/01/java-gui-effectives.html' title='Java GUI Effectives'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-4599541441226573700</id><published>2009-01-16T14:00:00.005+08:00</published><updated>2009-01-16T17:13:52.476+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CXX'/><title type='text'>C++ vtable</title><content type='html'>在 C++ 的OO模型中，很重要的一个特性是运行时多态。运行时多态是通过类的虚方法实现的。看下面这个例子：&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#60ff60"&gt;struct&lt;/font&gt;&amp;nbsp;IObject {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;virtual&lt;/font&gt;&amp;nbsp;&lt;font color="#60ff60"&gt;void&lt;/font&gt;&amp;nbsp;MethodA() = &lt;font color="#ffa0a0"&gt;0&lt;/font&gt;;&amp;nbsp;&amp;nbsp;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;virtual&lt;/font&gt;&amp;nbsp;&lt;font color="#60ff60"&gt;int&lt;/font&gt;&amp;nbsp;&amp;nbsp;MethodB(&lt;font color="#60ff60"&gt;char&lt;/font&gt;&amp;nbsp;*) = &lt;font color="#ffa0a0"&gt;0&lt;/font&gt;;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;font color="#60ff60"&gt;class&lt;/font&gt;&amp;nbsp;A : &lt;font color="#ffff60"&gt;public&lt;/font&gt;&amp;nbsp;IObject {&lt;br /&gt;&lt;font color="#ffff60"&gt;public&lt;/font&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;virtual&lt;/font&gt;&amp;nbsp;&lt;font color="#60ff60"&gt;void&lt;/font&gt;&amp;nbsp;MethodA() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::cout &amp;lt;&amp;lt; &lt;font color="#ffa0a0"&gt;&amp;quot;method A&amp;quot;&lt;/font&gt;&amp;nbsp;&amp;lt;&amp;lt; std::endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;virtual&lt;/font&gt;&amp;nbsp;&lt;font color="#60ff60"&gt;int&lt;/font&gt;&amp;nbsp;MethodB(&lt;font color="#60ff60"&gt;char&lt;/font&gt;&amp;nbsp;*p) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::cout &amp;lt;&amp;lt; &lt;font color="#ffa0a0"&gt;&amp;quot;method B &amp;quot;&lt;/font&gt;&amp;nbsp;&amp;lt;&amp;lt; p &amp;lt;&amp;lt; std::endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;return&lt;/font&gt;&amp;nbsp;&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;;&lt;br /&gt;&amp;nbsp;&amp;nbsp;};&lt;br /&gt;&lt;br /&gt;&lt;font color="#ffff60"&gt;public&lt;/font&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;int&lt;/font&gt;&amp;nbsp;MethodC(&lt;font color="#60ff60"&gt;int&lt;/font&gt;&amp;nbsp;c) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;std::cout &amp;lt;&amp;lt; &lt;font color="#ffa0a0"&gt;&amp;quot;method C non-virtual&amp;quot;&lt;/font&gt;&amp;nbsp;&amp;lt;&amp;lt; std::endl;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;return&lt;/font&gt;&amp;nbsp;++c;&lt;br /&gt;&amp;nbsp;&amp;nbsp;}&lt;br /&gt;&lt;font color="#ffff60"&gt;private&lt;/font&gt;:&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;int&lt;/font&gt;&amp;nbsp;mem_;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;font color="#60ff60"&gt;int&lt;/font&gt;&amp;nbsp;main(&lt;font color="#60ff60"&gt;int&lt;/font&gt;&amp;nbsp;argc, cahr *argv[]) &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;IObject *pObj = &lt;font color="#ffff60"&gt;new&lt;/font&gt;&amp;nbsp;A;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;pObj-&amp;gt;MethodA();&lt;br /&gt;&amp;nbsp;&amp;nbsp;pObj-&amp;gt;MethodB(&lt;font color="#ffa0a0"&gt;NULL&lt;/font&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#80a0ff"&gt;// &lt;/font&gt;&lt;span style="background-color: #1248d1"&gt;&lt;font color="#d14a14"&gt;FIXME&lt;/font&gt;&lt;/span&gt;&lt;font color="#80a0ff"&gt;: This is a compile error!&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;pObj-&amp;gt;MethodC(&lt;font color="#ffa0a0"&gt;1&lt;/font&gt;); &lt;font color="#80a0ff"&gt;// error&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;delete&lt;/font&gt;&amp;nbsp;A;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;return&lt;/font&gt;&amp;nbsp;&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;;&lt;br /&gt;};&lt;br /&gt;&lt;/font&gt;&lt;/pre&gt;&lt;br /&gt;C++ 运行时多态， 在执行代码中，主要通过 vtable 实现。让我们用C来重新描述上面的例子。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;// VTABLE of class IObject&lt;/font&gt;&lt;br /&gt;&lt;font color="#60ff60"&gt;struct&lt;/font&gt;&amp;nbsp;I_IObject {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;void&lt;/font&gt;&amp;nbsp;*pMethodA(&lt;font color="#60ff60"&gt;void&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;int&lt;/font&gt;&amp;nbsp;&amp;nbsp;*pMethodB(&lt;font color="#60ff60"&gt;char&lt;/font&gt;&amp;nbsp;*);&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;// Instance variant type of IObject&lt;/font&gt;&lt;br /&gt;&lt;font color="#60ff60"&gt;struct&lt;/font&gt;&amp;nbsp;IObject {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;struct&lt;/font&gt;&amp;nbsp;I_IObject *vtable_this;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;// VTABLE of class A&lt;/font&gt;&lt;br /&gt;&lt;font color="#60ff60"&gt;struct&lt;/font&gt;&amp;nbsp;A;&lt;br /&gt;&lt;font color="#60ff60"&gt;struct&lt;/font&gt;&amp;nbsp;I_A {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;void&lt;/font&gt;&amp;nbsp;*pDtor(A*) &lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;// Instance object variant type of class A&lt;/font&gt;&lt;br /&gt;&lt;font color="#60ff60"&gt;struct&lt;/font&gt;&amp;nbsp;A {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;struct&lt;/font&gt;&amp;nbsp;I_IObject *vtable_IObject;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;struct&lt;/font&gt;&amp;nbsp;I_A *vtable_this;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;int&lt;/font&gt;&amp;nbsp;*pMethodC(&lt;font color="#60ff60"&gt;int&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;int&lt;/font&gt;&amp;nbsp;mem_;&lt;br /&gt;};&lt;br /&gt;&lt;br /&gt;&lt;font color="#60ff60"&gt;void&lt;/font&gt;&amp;nbsp;A_MethodA (&lt;font color="#60ff60"&gt;void&lt;/font&gt;) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;printf(&lt;font color="#ffa0a0"&gt;&amp;quot;method A&lt;/font&gt;&lt;font color="#ffa500"&gt;\n&lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;); &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color="#60ff60"&gt;int&lt;/font&gt;&amp;nbsp;&amp;nbsp;A_MethodB (&lt;font color="#60ff60"&gt;char&lt;/font&gt;&amp;nbsp;*p) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;printf(&lt;font color="#ffa0a0"&gt;&amp;quot;method B &lt;/font&gt;&lt;font color="#ffa500"&gt;%s&lt;/font&gt;&lt;font color="#ffa500"&gt;\n&lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;, p);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color="#60ff60"&gt;int&lt;/font&gt;&amp;nbsp;&amp;nbsp;A_MethodC (&lt;font color="#60ff60"&gt;int&lt;/font&gt;&amp;nbsp;c) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;printf(&lt;font color="#ffa0a0"&gt;&amp;quot;method C non-virtual&lt;/font&gt;&lt;font color="#ffa500"&gt;\n&lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;/font&gt;);&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;return&lt;/font&gt;&amp;nbsp;++c;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color="#60ff60"&gt;void&lt;/font&gt;&amp;nbsp;A_dtor(&lt;font color="#60ff60"&gt;struct&lt;/font&gt;&amp;nbsp;A *_this) {&lt;br /&gt;&amp;nbsp;&amp;nbsp;free(_this);&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color="#60ff60"&gt;struct&lt;/font&gt;&amp;nbsp;A *A_ctor() {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#60ff60"&gt;struct&lt;/font&gt;&amp;nbsp;A *p = malloc(&lt;font color="#ffff60"&gt;sizeof&lt;/font&gt;(&lt;font color="#60ff60"&gt;struct&lt;/font&gt;&amp;nbsp;A));&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#80a0ff"&gt;// Non-virtual function will be assign the value directly.&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;p.pMethodC = &amp;amp;A_MethodC;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#80a0ff"&gt;/////////////////////////////////////////////////&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#80a0ff"&gt;// vtable initialization code&lt;/font&gt;&lt;br /&gt;&lt;font color="#ff80ff"&gt;#ifdef A_MethodA&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;p.vtable_IObject-&amp;gt;pMethodA = &amp;amp;A_MethodA;&lt;br /&gt;&lt;font color="#ff80ff"&gt;#else&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;p.vtable_IObject-&amp;gt;pMethodA = &amp;amp;IObject_MethodA; &lt;font color="#80a0ff"&gt;// Warning!&lt;/font&gt;&lt;br /&gt;&lt;font color="#ff80ff"&gt;#endif&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#ff80ff"&gt;#ifdef A_MethodB&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;p.vtable_IObject-&amp;gt;pMethodB = &amp;amp;A_MethodB;&lt;br /&gt;&lt;font color="#ff80ff"&gt;#else&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;p.vtable_IObject-&amp;gt;pMethodB = &amp;amp;IObject_MethodB; &lt;font color="#80a0ff"&gt;// Warning!&lt;/font&gt;&lt;br /&gt;&lt;font color="#ff80ff"&gt;#endif&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#80a0ff"&gt;// vtable of A itself&lt;/font&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;p.vtable_self-&amp;gt;pDtor = &amp;amp;A_dtor;&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;return&lt;/font&gt;&amp;nbsp;p;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;font color="#60ff60"&gt;int&lt;/font&gt;&amp;nbsp;main(&lt;font color="#60ff60"&gt;int&lt;/font&gt;&amp;nbsp;argc, &lt;font color="#60ff60"&gt;char&lt;/font&gt;&amp;nbsp;*argv[]) &lt;br /&gt;{&lt;br /&gt;&amp;nbsp;&amp;nbsp;IObject *pObj = (IObject*) A_ctor();&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;pObj-&amp;gt;vtable_self-&amp;gt;pMethodA();&lt;br /&gt;&amp;nbsp;&amp;nbsp;pObj-&amp;gt;vtable_self-&amp;gt;pMethodB(&lt;font color="#ffa0a0"&gt;NULL&lt;/font&gt;);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;A_dtor(pObj);&lt;br /&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&lt;font color="#ffff60"&gt;return&lt;/font&gt;&amp;nbsp;&lt;font color="#ffa0a0"&gt;0&lt;/font&gt;;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;C的定价物确实有些繁琐，不过基本的结构就是这样了。具体说来是这样：&lt;br /&gt;1，如果一个类 virtual function, 这些 virtual funciton 就会被统一在一个 vtable 中；&lt;br /&gt;2，包含 virtual function 的class 都会有一个指向 vtable structure的指针，如果当前类重写了 virtual function, 在对象初始化的时候相应的虚函数指针就会被替换；&lt;br /&gt;3，虚函数的调用一律通过vtable定位，因为存在vtable这一层中继，就可以保证在运行态可以通过父类的指针执行指向子类对象的方法，因为类对象初始化的时候正确的重写了vtable的内容。 &lt;br /&gt;4，一个对象多一个包含virtual function的基类，就会在类变量的结构中多引入一个指向父类vtable structure的指针。在类对象初始化的时候，就需要更多的 vtable 初始化代码。:D&lt;br /&gt;&lt;br /&gt;多重继承会导致 vtable 膨胀， Microsoft ATL 引入了一个 ATL_NO_VTABLE __declspec(novtable) C++ 扩展。关于这个，下回再说~~~&lt;br /&gt;&lt;br /&gt;其实这个例子里面还有一个小问题, 不知道大家能不能看出来啊!&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-4599541441226573700?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn.microsoft.com/en-us/magazine/cc301398.aspx' title='C++ vtable'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/4599541441226573700/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=4599541441226573700' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/4599541441226573700'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/4599541441226573700'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/01/c-vtable.html' title='C++ vtable'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-203904781278336014</id><published>2009-01-15T12:13:00.001+08:00</published><updated>2009-01-15T12:15:26.998+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Telecomm'/><title type='text'>Nortel files for bankruptcy</title><content type='html'>百年老店终于也挺不住了， NT的问题是积重难返，如果没有本质性的改变，估计会就此消失了。即便能恢复回来，估计也就不剩什么了~~~ :(&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-203904781278336014?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.reuters.com/article/technologyNews/idUSTRE50C7RV20090115?sp=true' title='Nortel files for bankruptcy'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/203904781278336014/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=203904781278336014' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/203904781278336014'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/203904781278336014'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2009/01/nortel-files-for-bankruptcy.html' title='Nortel files for bankruptcy'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-7413642176188435861</id><published>2008-12-18T14:39:00.005+08:00</published><updated>2009-01-16T18:12:49.395+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><title type='text'>VIM is so cool</title><content type='html'>VIM is really cool, you can increase/decrease a number in the text directly by with CTRL-A and CTRL-X!&lt;br /&gt;&lt;br /&gt;&lt;pre style="background: rgb(40, 40, 120); font-family: monospace; padding: 5px; font-color: rgb(20, 20, 10);"&gt;&lt;br /&gt;&lt;b&gt;&lt;span style="color:PURPLE;"&gt;Adding and subtracting &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;&lt;br /&gt;       *&lt;a name="CTRL-A"&gt;&lt;/a&gt;&lt;b&gt;CTRL-A&lt;/b&gt;*&lt;br /&gt;&lt;a href="http://www.vim.org/htmldoc/change.html#CTRL-A"&gt;CTRL-A&lt;/a&gt;   Add &lt;a href="http://www.vim.org/htmldoc/intro.html#%5Bcount%5D"&gt;[count]&lt;/a&gt; to the number or alphabetic character at&lt;br /&gt;   or after the cursor.  {not in Vi}&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;       *&lt;a name="CTRL-X"&gt;&lt;/a&gt;&lt;b&gt;CTRL-X&lt;/b&gt;*&lt;br /&gt;&lt;a href="http://www.vim.org/htmldoc/change.html#CTRL-X"&gt;CTRL-X&lt;/a&gt;   Subtract &lt;a href="http://www.vim.org/htmldoc/intro.html#%5Bcount%5D"&gt;[count]&lt;/a&gt; from the number or alphabetic&lt;br /&gt;   character at or after the cursor.  {not in Vi}&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.vim.org/htmldoc/change.html#CTRL-A"&gt;CTRL-A&lt;/a&gt; and &lt;a href="http://www.vim.org/htmldoc/change.html#CTRL-X"&gt;CTRL-X&lt;/a&gt; commands work for (signed) decimal numbers, unsigned&lt;br /&gt;octal and hexadecimal numbers and alphabetic characters.  This depends on the&lt;br /&gt;&lt;a href="http://www.vim.org/htmldoc/options.html#%27nrformats%27"&gt;'nrformats'&lt;/a&gt; option.&lt;br /&gt;- When &lt;a href="http://www.vim.org/htmldoc/options.html#%27nrformats%27"&gt;'nrformats'&lt;/a&gt; includes "alpha", Vim will change the alphabetic character&lt;br /&gt;under or after the cursor.  This is useful to make lists with an alphabetic&lt;br /&gt;index.&lt;br /&gt;- When &lt;a href="http://www.vim.org/htmldoc/options.html#%27nrformats%27"&gt;'nrformats'&lt;/a&gt; includes "hex", Vim assumes numbers starting with '0x' or&lt;br /&gt;'0X' are hexadecimal.  The &lt;a href="http://www.vim.org/htmldoc/change.html#case"&gt;case&lt;/a&gt; of the rightmost &lt;a href="http://www.vim.org/htmldoc/options.html#letter"&gt;letter&lt;/a&gt; in the number&lt;br /&gt;determines the &lt;a href="http://www.vim.org/htmldoc/change.html#case"&gt;case&lt;/a&gt; of the resulting hexadecimal number.  If there is no&lt;br /&gt;&lt;a href="http://www.vim.org/htmldoc/options.html#letter"&gt;letter&lt;/a&gt; in the current number, Vim uses the previously detected &lt;a href="http://www.vim.org/htmldoc/change.html#case"&gt;case&lt;/a&gt;.&lt;br /&gt;- When &lt;a href="http://www.vim.org/htmldoc/options.html#%27nrformats%27"&gt;'nrformats'&lt;/a&gt; includes "octal", Vim considers numbers starting with a '&lt;a href="http://www.vim.org/htmldoc/motion.html#0"&gt;0&lt;/a&gt;'&lt;br /&gt;to be octal.  Other numbers are decimal and may have a preceding minus sign.&lt;br /&gt;If the cursor is on a number, the commands apply to that number; otherwise&lt;br /&gt;Vim uses the number to the right of the cursor.&lt;br /&gt;&lt;br /&gt;For numbers with leading zeros (including all octal and hexadecimal numbers),&lt;br /&gt;Vim preserves the number of characters in the number when possible.  &lt;a href="http://www.vim.org/htmldoc/change.html#CTRL-A"&gt;CTRL-A&lt;/a&gt; on&lt;br /&gt;"0077" results in "0100", &lt;a href="http://www.vim.org/htmldoc/change.html#CTRL-X"&gt;CTRL-X&lt;/a&gt; on "0x100" results in "0x0ff".  Note that&lt;br /&gt;when &lt;a href="http://www.vim.org/htmldoc/options.html#%27nrformats%27"&gt;'nrformats'&lt;/a&gt; includes "octal", decimal numbers with leading zeros are&lt;br /&gt;impossible because they are indistinguishable from octal numbers.&lt;br /&gt;&lt;br /&gt;The &lt;a href="http://www.vim.org/htmldoc/change.html#CTRL-A"&gt;CTRL-A&lt;/a&gt; command is very useful in a &lt;a href="http://www.vim.org/htmldoc/map.html#macro"&gt;macro&lt;/a&gt;.  Example: Use the following&lt;br /&gt;steps to make a numbered list.&lt;br /&gt;&lt;br /&gt;1. Create the first list entry, make sure it starts with a number.&lt;br /&gt;2. qa      - start &lt;a href="http://www.vim.org/htmldoc/repeat.html#recording"&gt;recording&lt;/a&gt; into buffer '&lt;a href="http://www.vim.org/htmldoc/insert.html#a"&gt;a&lt;/a&gt;'&lt;br /&gt;3. &lt;a href="http://www.vim.org/htmldoc/change.html#Y"&gt;Y&lt;/a&gt;      - &lt;a href="http://www.vim.org/htmldoc/change.html#yank"&gt;yank&lt;/a&gt; the entry&lt;br /&gt;4. &lt;a href="http://www.vim.org/htmldoc/change.html#p"&gt;p&lt;/a&gt;      - put a copy of the entry below the first one&lt;br /&gt;5. &lt;a href="http://www.vim.org/htmldoc/change.html#CTRL-A"&gt;CTRL-A&lt;/a&gt;    - increment the number&lt;br /&gt;6. &lt;a href="http://www.vim.org/htmldoc/repeat.html#q"&gt;q&lt;/a&gt;      - stop &lt;a href="http://www.vim.org/htmldoc/repeat.html#recording"&gt;recording&lt;/a&gt;&lt;br /&gt;7. &lt;count&gt;@a - repeat the &lt;a href="http://www.vim.org/htmldoc/change.html#yank"&gt;yank&lt;/a&gt;, put and increment &lt;a href="http://www.vim.org/htmldoc/map.html#%3Ccount%3E"&gt;&lt;count&gt;&lt;/count&gt;&lt;/a&gt; times&lt;br /&gt;&lt;/count&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-7413642176188435861?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.vim.org/htmldoc/change.html' title='VIM is so cool'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/7413642176188435861/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=7413642176188435861' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7413642176188435861'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7413642176188435861'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/12/vim-is-so-cool.html' title='VIM is so cool'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-2990028396762913361</id><published>2008-12-11T11:55:00.009+08:00</published><updated>2009-01-16T18:05:57.708+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><category scheme='http://www.blogger.com/atom/ns#' term='network'/><title type='text'>Mapping remote TCP port to local via HTTPS Proxy</title><content type='html'>&lt;p&gt;上次说的Perl代码供大家参考&lt;/p&gt;&lt;p&gt;功能：把远端的应用服务端口通过HTTPS代理服务器映射成本地端口。这对于那些不支持HTTPS代理的TCP应用还有点儿小用处！ :D&lt;/p&gt;&lt;pre style="background-color: rgb(0, 0, 80);"&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;font color="#ee0000"&gt;#!/usr/bin/env perl&lt;/font&gt;&lt;br&gt;&lt;font color="#ee0000"&gt;#&lt;/font&gt;&lt;br&gt;&lt;font color="#ee0000"&gt;# Use remote HTTPS PROXY to tunnel the remote service to local!&lt;/font&gt;&lt;br&gt;&lt;font color="#ee0000"&gt;# Author: Yi Zhao&lt;/font&gt;&lt;br&gt;&lt;font color="#ee0000"&gt;#&amp;nbsp;&amp;nbsp; Blog: linuxyz.blogspot.com&lt;/font&gt;&lt;br&gt;&lt;font color="#ee0000"&gt;#&lt;/font&gt;&lt;br&gt;&lt;font color="#ee0000"&gt;# Based on original &amp;quot;ssltunnel.pl&amp;quot; by Alex Hornby &amp;lt;alex@hornby.org.uk&amp;gt;&lt;/font&gt;&lt;br&gt;&lt;font color="#ee0000"&gt;# $Id: ssltunnel.pl,v 1.17 2003/06/10 14:54:16 alex Exp $&lt;/font&gt;&lt;br&gt;&lt;font color="#ee0000"&gt;#&lt;/font&gt;&lt;br&gt;&lt;font color="#ee0000"&gt;# This program is free software; you can redistribute it and/or&lt;/font&gt;&lt;br&gt;&lt;font color="#ee0000"&gt;# modify it under the same terms as Perl itself.&lt;/font&gt;&lt;br&gt;&lt;font color="#ee0000"&gt;#&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;package&lt;/b&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;&amp;nbsp;httpsproxy;&lt;/b&gt;&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;use strict&lt;/b&gt;&lt;/font&gt;;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$VERSION&lt;/font&gt;=&lt;font color="#00cd00"&gt;1.0&lt;/font&gt;;&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;use &lt;/b&gt;&lt;/font&gt;IO::File;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;use &lt;/b&gt;&lt;/font&gt;IO::Select;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;use &lt;/b&gt;&lt;/font&gt;IO::Socket;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;use &lt;/b&gt;&lt;/font&gt;Net::SSL;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;use &lt;/b&gt;&lt;/font&gt;Getopt::Long;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;use &lt;/b&gt;&lt;/font&gt;MIME::Base64;&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;%options&lt;/font&gt;&amp;nbsp;= (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00cd00"&gt;proxyport&lt;/font&gt;=&amp;gt;&lt;font color="#00cd00"&gt;443&lt;/font&gt;,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00cd00"&gt;reproxyport&lt;/font&gt;=&amp;gt;&lt;font color="#00cd00"&gt;8080&lt;/font&gt;,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00cd00"&gt;localaddr&lt;/font&gt;=&amp;gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;127.0.0.1&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00cd00"&gt;localport&lt;/font&gt;=&amp;gt;&lt;font color="#00cd00"&gt;8080&lt;/font&gt;,&lt;br&gt;);&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;sub&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#008b8b"&gt;usage&lt;/font&gt;&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;STDERR&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;lt;&amp;lt;EOF&lt;/font&gt;&lt;font color="#00cd00"&gt;;&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;usage: perl httpsproxy.pl [options] [remote-host:port] &lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;Tunnels a TCP/IP connection through an http proxy using SSL.&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;WARNING: Only use this if you have the proxy administrator&lt;/font&gt;&lt;font color="#ff1493"&gt;\'&lt;/font&gt;&lt;font color="#00cd00"&gt;s permission&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;WARNING: The authors of this package offer no warranty&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;options:&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--help&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;This help&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--proxyhost 1.2.3.4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Mandatory proxy host port (default 443)&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--proxyport 443&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Optional proxy host port (default 443)&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--proxyuser &amp;lt;username&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Optional proxy user name&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--proxypasswd pass&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Optional proxy pass word&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--useragent agent&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Optional user agent name&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--reproxyhost 1.2.3.4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Optional intermediate http proxy host&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--reproxyport 123&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Optional intermediate http proxy host port (default 8080)&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--reproxyuser &amp;lt;username&amp;gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Optional intermediate http proxy user name&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--reproxypasswd pass&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;Optional intermediate http proxy pass word&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--localaddr 1.2.3.4&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Optional local addr to listen on (default 127.0.0.1)&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;--localport 123&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; Optional local port to listen on (default 8080)&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;e.g. To run a local http proxy to the remote HTTPS proxy&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;./httpsproxy.pl --proxyhost 10.1.1.80 \&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;--proxyport 443 --localport 80&amp;nbsp;&amp;nbsp;www.abc.com:80&lt;/font&gt;&lt;br&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;EOF&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;exit&lt;/b&gt;&lt;/font&gt;(&lt;font color="#00cd00"&gt;1&lt;/font&gt;);&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;font color="#ee0000"&gt;# Parse command line arguments&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;sub&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#008b8b"&gt;parseArgs&lt;/font&gt;&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;GetOptions(&lt;font color="#008b8b"&gt;\%options&lt;/font&gt;, &lt;font color="#00cd00"&gt;qw/&lt;/font&gt;&lt;font color="#00cd00"&gt;dumpfile=s &lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; proxyhost=s proxyport=i proxyuser=s proxypasswd=s useragent=s&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; reproxyhost=s reproxyport=i reproxyuser=s reproxypasswd=s reuseragent=s&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; localaddr=s localport=i &lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; debug! help!&lt;/font&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; log-file=s pidfile=s&lt;/font&gt;&lt;font color="#00cd00"&gt;/&lt;/font&gt;);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{help} ) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;usage();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(&lt;font color="#008b8b"&gt;@ARGV&lt;/font&gt;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(&lt;font color="#0000ff"&gt;&lt;b&gt;m/&lt;/b&gt;&lt;/font&gt;&lt;font color="#00cd00"&gt;^&lt;/font&gt;&lt;font color="#ff1493"&gt;([^:]*)&lt;/font&gt;&lt;font color="#00cd00"&gt;:&lt;/font&gt;&lt;font color="#ff1493"&gt;(.*)&lt;/font&gt;&lt;font color="#00cd00"&gt;$&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;/&lt;/b&gt;&lt;/font&gt;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$options&lt;/font&gt;{desthost} = &lt;font color="#008b8b"&gt;$1&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$options&lt;/font&gt;{destport} = &lt;font color="#0000ff"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;(&lt;font color="#008b8b"&gt;$2&lt;/font&gt;) || &lt;font color="#0000ff"&gt;&lt;b&gt;getservbyname&lt;/b&gt;&lt;/font&gt;(&lt;font color="#008b8b"&gt;$2&lt;/font&gt;, &lt;font color="#00cd00"&gt;'&lt;/font&gt;&lt;font color="#00cd00"&gt;tcp&lt;/font&gt;&lt;font color="#00cd00"&gt;'&lt;/font&gt;) || &lt;font color="#0000ff"&gt;&lt;b&gt;die&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;unknown port&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;Mapping &lt;/font&gt;&lt;font color="#008b8b"&gt;$options&lt;/font&gt;&lt;font color="#00cd00"&gt;{desthost}:&lt;/font&gt;&lt;font color="#008b8b"&gt;$options&lt;/font&gt;&lt;font color="#00cd00"&gt;{destport} as &lt;/font&gt;&lt;font color="#008b8b"&gt;$options&lt;/font&gt;&lt;font color="#00cd00"&gt;{localaddr}:&lt;/font&gt;&lt;font color="#008b8b"&gt;$options&lt;/font&gt;&lt;font color="#00cd00"&gt;{localport}&lt;/font&gt;&lt;font color="#ff1493"&gt;\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( !&lt;font color="#0000ff"&gt;&lt;b&gt;defined&lt;/b&gt;&lt;/font&gt;(&lt;font color="#008b8b"&gt;$options&lt;/font&gt;{proxyhost}) ) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;STDERR&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;error: You must give a proxyhost&lt;/font&gt;&lt;font color="#ff1493"&gt;\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;usage();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;font color="#ee0000"&gt;# This is really inefficient, but we only use it for reading the proxy response&lt;/font&gt;&lt;br&gt;&lt;font color="#ee0000"&gt;# so that does not really matter.&lt;/font&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;sub&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#008b8b"&gt;xgetline&lt;/font&gt;&lt;font color="#008b8b"&gt;($)&lt;/font&gt;&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;&amp;nbsp;= &lt;font color="#0000ff"&gt;&lt;b&gt;shift&lt;/b&gt;&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$val&lt;/font&gt;=&lt;font color="#00cd00"&gt;&amp;quot;&amp;quot;&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$buf&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;do&lt;/b&gt;&lt;/font&gt;&amp;nbsp;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;-&amp;gt;&lt;font color="#0000ff"&gt;&lt;b&gt;read&lt;/b&gt;&lt;/font&gt;(&lt;font color="#008b8b"&gt;$buf&lt;/font&gt;, &lt;font color="#00cd00"&gt;1&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$val&lt;/font&gt;&amp;nbsp;.= &lt;font color="#008b8b"&gt;$buf&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;font color="#0000ff"&gt;&lt;b&gt;until&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(&lt;font color="#008b8b"&gt;$buf&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;eq&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ff1493"&gt;\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$val&lt;/font&gt;;&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;sub&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#008b8b"&gt;httpProxy&lt;/font&gt;&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;, &lt;font color="#008b8b"&gt;$desthost&lt;/font&gt;, &lt;font color="#008b8b"&gt;$destport&lt;/font&gt;, &lt;font color="#008b8b"&gt;$proxyuser&lt;/font&gt;, &lt;font color="#008b8b"&gt;$proxypasswd&lt;/font&gt;&amp;nbsp;) = &lt;font color="#008b8b"&gt;@_&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ee0000"&gt;# Force flushing of socket buffers&lt;/font&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ee0000"&gt;# The actual connect&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;-&amp;gt;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;(&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;CONNECT &lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;.&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$desthost&lt;/font&gt;&amp;nbsp;. &lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;:&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$destport&lt;/font&gt;&amp;nbsp;. &lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;HTTP/1.0&lt;/font&gt;&lt;font color="#ff1493"&gt;\r\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{debug} ) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;STDERR&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;CONNECT &lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;.&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$desthost&lt;/font&gt;&amp;nbsp;. &lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;:&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$destport&lt;/font&gt;&amp;nbsp;. &lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;HTTP/1.0&lt;/font&gt;&lt;font color="#ff1493"&gt;\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ee0000"&gt;# Basic auth if needed&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;$proxyuser&lt;/font&gt;&amp;nbsp;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$auth&lt;/font&gt;&amp;nbsp;= encode_base64(&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$proxyuser&lt;/font&gt;&amp;nbsp;. &lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;:&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;. &lt;font color="#008b8b"&gt;$proxypasswd&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;-&amp;gt;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;(&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;Proxy-authorization: Basic &lt;/font&gt;&lt;font color="#008b8b"&gt;$auth&lt;/font&gt;&lt;font color="#ff1493"&gt;\r\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{debug} ) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;STDERR&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;Proxy-authorization: Basic &lt;/font&gt;&lt;font color="#008b8b"&gt;$auth&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ee0000"&gt;# User agent name if needed&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{useragent} ) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;-&amp;gt;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;(&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;User-Agent: &lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;. &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{useragent} . &lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ff1493"&gt;\r\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{debug} ) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;STDERR&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;User-Agent: &lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;. &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{useragent} . &lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ff1493"&gt;\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ee0000"&gt;# end of headers&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;-&amp;gt;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;(&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ff1493"&gt;\r\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$status&lt;/font&gt;;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ee0000"&gt;# Wait for HTTP status code, bail out if you don't get back a 2xx code.&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ee0000"&gt;#$_ = $proxy-&amp;gt;getline();&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ee0000"&gt;#$_ = $proxy-&amp;gt;getchunk();&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$_&lt;/font&gt;&amp;nbsp;= xgetline(&lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;next&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;&amp;nbsp;/&lt;/b&gt;&lt;/font&gt;&lt;font color="#00cd00"&gt;^[&lt;/font&gt;&lt;font color="#ff1493"&gt;\r&lt;/font&gt;&lt;font color="#00cd00"&gt;]&lt;/font&gt;&lt;font color="#ff1493"&gt;*&lt;/font&gt;&lt;font color="#00cd00"&gt;$&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;/&lt;/b&gt;&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;(&lt;font color="#008b8b"&gt;$status&lt;/font&gt;) = (&lt;font color="#0000ff"&gt;&lt;b&gt;split&lt;/b&gt;&lt;/font&gt;())[&lt;font color="#00cd00"&gt;1&lt;/font&gt;];&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;die&lt;/b&gt;&lt;/font&gt;(&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;Received a bad status code &lt;/font&gt;&lt;font color="#ff1493"&gt;\&amp;quot;&lt;/font&gt;&lt;font color="#008b8b"&gt;$status&lt;/font&gt;&lt;font color="#ff1493"&gt;\&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;from proxy server&lt;/font&gt;&lt;font color="#ff1493"&gt;\n&lt;/font&gt;&lt;font color="#008b8b"&gt;$_&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;) &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#0000ff"&gt;&lt;b&gt;int&lt;/b&gt;&lt;/font&gt;(&lt;font color="#008b8b"&gt;$status&lt;/font&gt;/&lt;font color="#00cd00"&gt;100&lt;/font&gt;) != &lt;font color="#00cd00"&gt;2&lt;/font&gt;&amp;nbsp;);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/font&gt;(&lt;font color="#008b8b"&gt;$_&lt;/font&gt;&amp;nbsp;= xgetline(&lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;)) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;chomp&lt;/b&gt;&lt;/font&gt;;&amp;nbsp;&amp;nbsp; &lt;font color="#ee0000"&gt;# Strip &amp;lt;LF&amp;gt;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;last&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;&amp;nbsp;/&lt;/b&gt;&lt;/font&gt;&lt;font color="#00cd00"&gt;^[&lt;/font&gt;&lt;font color="#ff1493"&gt;\r&lt;/font&gt;&lt;font color="#00cd00"&gt;]&lt;/font&gt;&lt;font color="#ff1493"&gt;*&lt;/font&gt;&lt;font color="#00cd00"&gt;$&lt;/font&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;/&lt;/b&gt;&lt;/font&gt;;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ee0000"&gt;# Empty line or a single &amp;lt;CR&amp;gt; left&lt;/font&gt;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{debug} ) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;STDERR&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;Got extra data [&lt;/font&gt;&lt;font color="#008b8b"&gt;$_&lt;/font&gt;&lt;font color="#00cd00"&gt;]&lt;/font&gt;&lt;font color="#ff1493"&gt;\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$status&lt;/font&gt;;&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;sub&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#008b8b"&gt;connectProxy&lt;/font&gt;&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{reproxyhost} ) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ee0000"&gt;# proxy support&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$ENV&lt;/font&gt;{HTTPS_PROXY} = &lt;font color="#00cd00"&gt;qq(&lt;/font&gt;&lt;font color="#00cd00"&gt;&lt;a href="http://"&gt;http://&lt;/a&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;$options&lt;/font&gt;&lt;font color="#00cd00"&gt;{reproxyhost}:&lt;/font&gt;&lt;font color="#008b8b"&gt;$options&lt;/font&gt;&lt;font color="#00cd00"&gt;{reproxyport}&lt;/font&gt;&lt;font color="#00cd00"&gt;)&lt;/font&gt;;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ee0000"&gt;# proxy_basic_auth&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$ENV&lt;/font&gt;{HTTPS_PROXY_USERNAME} = &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{reproxyuser} &lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$options&lt;/font&gt;{reproxyuser};&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$ENV&lt;/font&gt;{HTTPS_PROXY_PASSWORD} = &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{reproxypass} &lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$options&lt;/font&gt;{reproxypass};&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ee0000"&gt;# debugging (SSL diagnostics)&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$ENV&lt;/font&gt;{HTTPS_DEBUG} = &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{debug} ? &lt;font color="#00cd00"&gt;1&lt;/font&gt;&amp;nbsp;: &lt;font color="#00cd00"&gt;0&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp; &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;&amp;nbsp;= &lt;font color="#0000ff"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt;&amp;nbsp;Net::SSL (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00cd00"&gt;PeerAddr &lt;/font&gt;=&amp;gt; &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{proxyhost},&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00cd00"&gt;PeerPort &lt;/font&gt;=&amp;gt; &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{proxyport},&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00cd00"&gt;Proto &lt;/font&gt;=&amp;gt; &lt;font color="#00cd00"&gt;'&lt;/font&gt;&lt;font color="#00cd00"&gt;tcp&lt;/font&gt;&lt;font color="#00cd00"&gt;'&lt;/font&gt;,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;die&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;Error connecting to proxy host &lt;/font&gt;&lt;font color="#008b8b"&gt;$options&lt;/font&gt;&lt;font color="#00cd00"&gt;{proxyhost} &lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;. &lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;port &lt;/font&gt;&lt;font color="#008b8b"&gt;$options&lt;/font&gt;&lt;font color="#00cd00"&gt;{proxyport}: &lt;/font&gt;&lt;font color="#008b8b"&gt;$!&lt;/font&gt;&lt;font color="#ff1493"&gt;\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;unless&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ee0000"&gt;# Force flushing of socket buffers&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;-&amp;gt;autoflush(&lt;font color="#00cd00"&gt;1&lt;/font&gt;);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ee0000"&gt;# only if the remote host are speficied&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;httpProxy(&lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;, &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{desthost}, &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{destport},&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$options&lt;/font&gt;{proxyuser}, &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{proxypasswd} )&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{desthost} );&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;return&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;;&lt;br&gt;}&lt;br&gt;&lt;br&gt;&lt;font color="#0000ff"&gt;&lt;b&gt;sub&lt;/b&gt;&lt;/font&gt;&lt;font color="#008b8b"&gt;&amp;nbsp;&lt;/font&gt;&lt;font color="#008b8b"&gt;connectLocal&lt;/font&gt;&lt;br&gt;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$listen&lt;/font&gt;&amp;nbsp;= &lt;font color="#0000ff"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt;&amp;nbsp;IO::Socket::INET (&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00cd00"&gt;Listen&lt;/font&gt;=&amp;gt; &lt;font color="#00cd00"&gt;5&lt;/font&gt;,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00cd00"&gt;LocalAddr &lt;/font&gt;=&amp;gt; &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{localaddr},&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00cd00"&gt;LocalPort &lt;/font&gt;=&amp;gt; &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{localport},&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00cd00"&gt;Proto &lt;/font&gt;=&amp;gt; &lt;font color="#00cd00"&gt;'&lt;/font&gt;&lt;font color="#00cd00"&gt;tcp&lt;/font&gt;&lt;font color="#00cd00"&gt;'&lt;/font&gt;,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#00cd00"&gt;Reuse &lt;/font&gt;=&amp;gt; &lt;font color="#00cd00"&gt;1&lt;/font&gt;,&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;die&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;can't listen on &lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;. &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{localaddr} . &lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;:&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;. &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{localport} &lt;font color="#0000ff"&gt;&lt;b&gt;unless&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$listen&lt;/font&gt;;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;STDERR&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;Accepting network clients on &lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;.&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$options&lt;/font&gt;{localaddr} . &lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;:&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;.&lt;font color="#008b8b"&gt;$options&lt;/font&gt;{localport} . &lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ff1493"&gt;\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;%client2proxy&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;%proxy2client&lt;/font&gt;;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$s&lt;/font&gt;&amp;nbsp;= IO::Select-&amp;gt;&lt;font color="#0000ff"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$s&lt;/font&gt;-&amp;gt;add(&lt;font color="#008b8b"&gt;$listen&lt;/font&gt;);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$dumpfh&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;$options&lt;/font&gt;{dumpfile} ) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$dumpfh&lt;/font&gt;&amp;nbsp;= &lt;font color="#0000ff"&gt;&lt;b&gt;new&lt;/b&gt;&lt;/font&gt;&amp;nbsp;IO::File(&lt;font color="#008b8b"&gt;$options&lt;/font&gt;{dumpfile}, &lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;w&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;)&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;or&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;die&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;could not open dump file &lt;/font&gt;&lt;font color="#008b8b"&gt;$_&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$dumpfh&lt;/font&gt;-&amp;gt;autoflush(&lt;font color="#00cd00"&gt;1&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;while&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#00cd00"&gt;1&lt;/font&gt;&amp;nbsp;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;@res&lt;/font&gt;&amp;nbsp;= IO::Select::&lt;font color="#0000ff"&gt;&lt;b&gt;select&lt;/b&gt;&lt;/font&gt;(&lt;font color="#008b8b"&gt;$s&lt;/font&gt;, &lt;font color="#0000ff"&gt;&lt;b&gt;undef&lt;/b&gt;&lt;/font&gt;, &lt;font color="#0000ff"&gt;&lt;b&gt;undef&lt;/b&gt;&lt;/font&gt;, &lt;font color="#00cd00"&gt;3600&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;@res&lt;/font&gt;&amp;nbsp;== &lt;font color="#00cd00"&gt;0&lt;/font&gt;&amp;nbsp;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;STDERR&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;got select error&lt;/font&gt;&lt;font color="#ff1493"&gt;\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;last&lt;/b&gt;&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(&lt;font color="#008b8b"&gt;$read&lt;/font&gt;, &lt;font color="#008b8b"&gt;$write&lt;/font&gt;, &lt;font color="#008b8b"&gt;$error&lt;/font&gt;) = &lt;font color="#008b8b"&gt;@res&lt;/font&gt;;&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ee0000"&gt;# Check for disconnect&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$fh&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;@$error&lt;/font&gt;&amp;nbsp;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;STDERR&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;socket &lt;/font&gt;&lt;font color="#008b8b"&gt;$fh&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;nbsp;is in error&lt;/font&gt;&lt;font color="#ff1493"&gt;\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$s&lt;/font&gt;-&amp;gt;remove(&lt;font color="#008b8b"&gt;$fh&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;exit&lt;/b&gt;&lt;/font&gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ee0000"&gt;# Process handles ready to read;&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;for&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$fh&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;@$read&lt;/font&gt;&amp;nbsp;&amp;nbsp;) {&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;$fh&lt;/font&gt;&amp;nbsp;== &lt;font color="#008b8b"&gt;$listen&lt;/font&gt;&amp;nbsp;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$client&lt;/font&gt;&amp;nbsp;= &lt;font color="#008b8b"&gt;$listen&lt;/font&gt;-&amp;gt;&lt;font color="#0000ff"&gt;&lt;b&gt;accept&lt;/b&gt;&lt;/font&gt;();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$client&lt;/font&gt;-&amp;gt;autoflush(&lt;font color="#00cd00"&gt;1&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$s&lt;/font&gt;-&amp;gt;add(&lt;font color="#008b8b"&gt;$client&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;&amp;nbsp;= connectProxy();&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$s&lt;/font&gt;-&amp;gt;add(&lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;STDERR&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;New connection from &lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&amp;nbsp;. &lt;font color="#008b8b"&gt;$client&lt;/font&gt;-&amp;gt;peerhost() . &lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#ff1493"&gt;\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$client2proxy&lt;/font&gt;{&lt;font color="#008b8b"&gt;$client&lt;/font&gt;} = &lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$proxy2client&lt;/font&gt;{&lt;font color="#008b8b"&gt;$proxy&lt;/font&gt;} = &lt;font color="#008b8b"&gt;$client&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;font color="#0000ff"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/font&gt;&amp;nbsp;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$destfh&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$isclient&lt;/font&gt;&amp;nbsp;= &lt;font color="#00cd00"&gt;0&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#0000ff"&gt;&lt;b&gt;exists&lt;/b&gt;&lt;/font&gt;( &lt;font color="#008b8b"&gt;$client2proxy&lt;/font&gt;{&lt;font color="#008b8b"&gt;$fh&lt;/font&gt;} ) ) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$destfh&lt;/font&gt;&amp;nbsp;= &lt;font color="#008b8b"&gt;$client2proxy&lt;/font&gt;{&lt;font color="#008b8b"&gt;$fh&lt;/font&gt;};&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$isclient&lt;/font&gt;&amp;nbsp;= &lt;font color="#00cd00"&gt;1&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;font color="#0000ff"&gt;&lt;b&gt;elsif&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#0000ff"&gt;&lt;b&gt;exists&lt;/b&gt;&lt;/font&gt;( &lt;font color="#008b8b"&gt;$proxy2client&lt;/font&gt;{&lt;font color="#008b8b"&gt;$fh&lt;/font&gt;} ) ) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$destfh&lt;/font&gt;&amp;nbsp;= &lt;font color="#008b8b"&gt;$proxy2client&lt;/font&gt;{&lt;font color="#008b8b"&gt;$fh&lt;/font&gt;};&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;my&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;$num&lt;/font&gt;&amp;nbsp;= &lt;font color="#0000ff"&gt;&lt;b&gt;sysread&lt;/b&gt;&lt;/font&gt;(&lt;font color="#008b8b"&gt;$fh&lt;/font&gt;, &lt;font color="#008b8b"&gt;$_&lt;/font&gt;, &lt;font color="#00cd00"&gt;4096&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;$num&lt;/font&gt;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;syswrite&lt;/b&gt;&lt;/font&gt;(&lt;font color="#008b8b"&gt;$destfh&lt;/font&gt;, &lt;font color="#008b8b"&gt;$_&lt;/font&gt;, &lt;font color="#008b8b"&gt;$num&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#ee0000"&gt;# Optional dump of traffic&lt;/font&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;$dumpfh&lt;/font&gt;&amp;nbsp;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;(&lt;font color="#008b8b"&gt;$isclient&lt;/font&gt;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$dumpfh&lt;/font&gt;-&amp;gt;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;(&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;client[&lt;/font&gt;&lt;font color="#008b8b"&gt;$_&lt;/font&gt;&lt;font color="#00cd00"&gt;]&lt;/font&gt;&lt;font color="#ff1493"&gt;\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;font color="#0000ff"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/font&gt;&amp;nbsp;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$dumpfh&lt;/font&gt;-&amp;gt;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;(&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;proxy[&lt;/font&gt;&lt;font color="#008b8b"&gt;$_&lt;/font&gt;&lt;font color="#00cd00"&gt;]&lt;/font&gt;&lt;font color="#ff1493"&gt;\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;font color="#0000ff"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/font&gt;&amp;nbsp;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$s&lt;/font&gt;-&amp;gt;remove(&lt;font color="#008b8b"&gt;$fh&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#008b8b"&gt;$s&lt;/font&gt;-&amp;gt;remove(&lt;font color="#008b8b"&gt;$destfh&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;&amp;nbsp;( &lt;font color="#008b8b"&gt;$isclient&lt;/font&gt;&amp;nbsp;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;STDERR&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;client disconnected&lt;/font&gt;&lt;font color="#ff1493"&gt;\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;delete&lt;/b&gt;&lt;/font&gt;(&lt;font color="#008b8b"&gt;$client2proxy&lt;/font&gt;{&lt;font color="#008b8b"&gt;$fh&lt;/font&gt;});&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;delete&lt;/b&gt;&lt;/font&gt;(&lt;font color="#008b8b"&gt;$proxy2client&lt;/font&gt;{&lt;font color="#008b8b"&gt;$destfh&lt;/font&gt;});&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;} &lt;font color="#0000ff"&gt;&lt;b&gt;else&lt;/b&gt;&lt;/font&gt;&amp;nbsp;{&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;STDERR&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;proxy disconnected&lt;/font&gt;&lt;font color="#ff1493"&gt;\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;delete&lt;/b&gt;&lt;/font&gt;(&lt;font color="#008b8b"&gt;$client2proxy&lt;/font&gt;{&lt;font color="#008b8b"&gt;$destfh&lt;/font&gt;});&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;delete&lt;/b&gt;&lt;/font&gt;(&lt;font color="#008b8b"&gt;$proxy2client&lt;/font&gt;{&lt;font color="#008b8b"&gt;$fh&lt;/font&gt;});&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;close&lt;/b&gt;&lt;/font&gt;(&lt;font color="#008b8b"&gt;$fh&lt;/font&gt;);&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;close&lt;/b&gt;&lt;/font&gt;(&lt;font color="#008b8b"&gt;$destfh&lt;/font&gt;);&lt;br&gt;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;if&lt;/b&gt;&lt;/font&gt;(&lt;font color="#008b8b"&gt;%proxy2client&lt;/font&gt;&amp;nbsp;== &lt;font color="#00cd00"&gt;0&lt;/font&gt;&amp;nbsp;) {&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&lt;font color="#0000ff"&gt;&lt;b&gt;print&lt;/b&gt;&lt;/font&gt;&amp;nbsp;&lt;font color="#008b8b"&gt;STDERR&lt;/font&gt;&amp;nbsp;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;&lt;font color="#00cd00"&gt;last client disconnected&lt;/font&gt;&lt;font color="#ff1493"&gt;\n&lt;/font&gt;&lt;font color="#00cd00"&gt;&amp;quot;&lt;/font&gt;;&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;}&lt;br&gt;}&lt;br&gt;&lt;br&gt;parseArgs();&lt;br&gt;connectLocal();&lt;br&gt;&lt;br&gt;&lt;font color="#00cd00"&gt;0&lt;/font&gt;;&lt;br&gt;&lt;br&gt;&lt;font color="#ee0000"&gt;__END__&lt;/font&gt;&lt;br&gt;&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-2990028396762913361?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/2990028396762913361/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=2990028396762913361' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2990028396762913361'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2990028396762913361'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/12/usrbinenv-perl-use-remote-https-proxy.html' title='Mapping remote TCP port to local via HTTPS Proxy'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-1521856178594377450</id><published>2008-12-11T11:36:00.003+08:00</published><updated>2008-12-11T11:49:48.860+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><title type='text'>copy and paste in VIM</title><content type='html'>VIM have multiple clipboard which allows you copy and save different content at the same time. The register can be any of &lt;span style="font-size:85%;"&gt;{a-zA-Z0-9.%#:-"}&lt;/span&gt;. It is really interesting thing which I never notice before.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;blockquote  style="font-family:courier new;"&gt;&lt;span style="font-size:85%;"&gt;"{a-zA-Z0-9.%#:-"}   Use register {a-zA-Z0-9.%#:-"} for next delete, yank&lt;br /&gt;                  or put (use uppercase character to append with&lt;br /&gt;                  delete and yank) ({.%#:} only work with put).&lt;br /&gt;&lt;br /&gt;:reg[isters]         Display the contents of all numbered and named&lt;br /&gt;                  registers.  {not in Vi}&lt;br /&gt;&lt;br /&gt;:reg[isters] {arg}   Display the contents of the numbered and named&lt;br /&gt;                  registers that are mentioned in {arg}.  For example:&lt;br /&gt;&lt;br /&gt;["x]y{motion}        Yank {motion} text [into register x].  When no&lt;br /&gt;                  characters are to be yanked (e.g., "y0" in column 1),&lt;br /&gt;                  this is an error when 'cpoptions' includes the 'E'&lt;br /&gt;                  flag.&lt;br /&gt;&lt;br /&gt;["x]p                Put the text [from register x] after the cursor&lt;br /&gt;                  [count] times.  {Vi: no count}&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;I forgot there is another register *, it is as same as the system clipboard. So you can yank some text into register *, it will be in the system clipboard also. :D&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-1521856178594377450?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://vimdoc.sourceforge.net/' title='copy and paste in VIM'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/1521856178594377450/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=1521856178594377450' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1521856178594377450'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1521856178594377450'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/12/copy-and-paste-in-vim.html' title='copy and paste in VIM'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-6717311516439918360</id><published>2008-12-04T21:34:00.006+08:00</published><updated>2008-12-11T11:54:49.002+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network'/><title type='text'>Apache HTTPD as Proxy server</title><content type='html'>由于条件限制，平时网络只能用http代理，其他任何应用都必须通过这个代理。可是这个代理只能支持http以及https应用，不支持CONNECT remote-host:443以外的其他端口，除了浏览网页根本不能用于其它代理。&lt;br /&gt;为此，用Apache自建了一个HTTPS代理，这样就能够利用这个二次代理做一些其他的应用。&lt;br /&gt;&lt;br /&gt;Apache HTTPD 真是强悍啊！首先在 httpd.conf 打开mod_proxy；&lt;div&gt;然后添加下面的语句：&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;&lt;/blockquote&gt;&lt;div&gt;&lt;directory&gt;&lt;br /&gt;    ProxyRequests On&lt;/div&gt;&lt;div&gt;    ProxyVia On&lt;br /&gt;&lt;/div&gt;&lt;div&gt;    &lt;directory&gt;&lt;br /&gt;&lt;/directory&gt;&lt;/div&gt;&lt;div&gt;    Order deny,allow&lt;br /&gt;&lt;/div&gt;&lt;div&gt;    Deny from all&lt;/div&gt;&lt;div&gt;    Allow from .mydomain.com&lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;/directory&gt;   &lt;br /&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;赶紧试验一下SSH! TLS握手都完成了，貌似就应该能工作了不？ &lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;可是实际上不行！:(&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;每次用 CONNECT 方法来连接服务器的时候总是被403踢下来。感觉应该是访问控制的问题，于是改成没有访问控制；再试过一样403 Forbidden~~~~ 郁闷啊!&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;看了半天Apache的文档才发现，原来还有一个 AllowCONNECT 指令，并且缺省只打开443和563端口，难怪连22 端口的时候被踢~~~~~&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;赶紧加上这句：&lt;/div&gt;&lt;div&gt;&lt;blockquote&gt;AllowCONNECT 21 22 23 80 443&lt;/blockquote&gt;再试，Working...  高喊：“Apache 太强悍了~~~”&lt;/div&gt;&lt;div&gt;&lt;br /&gt;&lt;/div&gt;&lt;div&gt;题外话：&lt;span class="Apple-style-span" style="font-weight: bold;"&gt;这个二次代理的转换程序是用Perl写的，目前还有些小问题，啥时候时候搞好了也放上来！&lt;/span&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-6717311516439918360?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://httpd.apache.org/docs/1.3/mod/mod_proxy.html#allowconnect' title='Apache HTTPD as Proxy server'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/6717311516439918360/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=6717311516439918360' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6717311516439918360'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6717311516439918360'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/12/apache-httpd-as-proxy-server.html' title='Apache HTTPD as Proxy server'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-2789769104776866915</id><published>2008-10-08T10:16:00.006+08:00</published><updated>2008-10-14T21:57:48.021+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><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;img src="http://www.lifestyletip.com/sites/ehennessy/_files/Image/living%20a%20healthy%20lifestyle%20-%20food_pyramid.JPG" /&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-2789769104776866915?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.ccthere.com/article/1825515' title='健康饮食'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/2789769104776866915/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=2789769104776866915' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2789769104776866915'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2789769104776866915'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/10/blog-post.html' title='健康饮食'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-7647251743083479064</id><published>2008-09-27T20:34:00.003+08:00</published><updated>2008-09-27T20:36:35.804+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GOOGLE'/><title type='text'>关于Google Chrome以及Android</title><content type='html'>Google Android 对于Google这种依靠高增长率赚钱的公司，如何保持高的增长率是很关键的，Android对于Google来说是开拓新的增长点，这跟当年Microsoft进入报表生成软件领域是一个道理。进入这样的领域所花费的投资，对于Google而言绝对可以忽略，效果则是明显的，就算失败了也不会有什么损失。当然了这次Google跳得有点儿远~~~ 当然了，Google 只用了一年多的时间就能做成这样确实还是很强悍的，虽然大多数东西都是基于已有的技术开发~~~&lt;br /&gt;&lt;br /&gt;Google Chrome的感觉有些奇怪，浏览器领域在此之前基本已经尘埃落定，IE保持老大地位，firefox作为老而保持sexy的形象，老三大量的IE内核的克隆产品，然后是Opera以及Safari。从本质上来说，Google应该是不关心浏览器的，但是Microsoft开始进入Google的领域，说实话，谁都要提防Microsoft自说字画的搞乱浏览器市场。Google培育Mozilla就是这样的目的，可以说只要Mozilla没有走到绝对优势的地位，Google就不会停止对Mozilla的支持。当然了这次Google自己赤膊上阵恐怕也抱着同样的目的，那就是：在浏览器市场纠缠Microsoft，增加话语权，同时让Microsoft走到W3C的标准圈子内，不论是Microsoft的Silverlight，还是Adobe的Flash/Flex/Air。 对Google来说，都不是他想看到的，对于Google这种Internet信息服务提供者来说，最好在客户端领域是群雄争霸，决不能一枝独秀。另一方面Chrome真正目的应该是成为Google的桌面应用平台，看看Chrome强调的JavaScript速度，独立进程管理，哪个都像是在给桌面应用开发作准备。&lt;br /&gt;&lt;br /&gt;总的来说，Google作为后来者，她要做的就是不断搞出新的东西，不断进入新的Internet或者信息服务相关的外延领域。不论成功或失败，总要在别人的家里打仗才好。&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-7647251743083479064?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://code.google.com/p/chromium/' title='关于Google Chrome以及Android'/><link rel='enclosure' type='' href='http://code.google.com/p/android' length='0'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/7647251743083479064/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=7647251743083479064' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7647251743083479064'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7647251743083479064'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/09/google-chromeandroid.html' title='关于Google Chrome以及Android'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-3359119887200638909</id><published>2008-09-26T10:14:00.005+08:00</published><updated>2008-09-27T20:46:35.204+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><title type='text'>VIM Tips</title><content type='html'>I am running in a English version Windows XP in office. The default encoding of the OS is english! While I still want to be able to work with some Chinese document in VIM, how can I make it happen?&lt;br /&gt;That's simple, put this line into your vimrc file&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="color: rgb(204, 0, 0);font-family:courier new;" &gt;set guifont=Bitstream\ Vera\ Sans\ Mono:h10:cANSI&lt;br /&gt;set guifontwide=NSimSun:h11:cGB2312&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;VIM will be using NSimSun to display the Chinese characters. :)&lt;br /&gt;And "Bitstream Vera Sans Mono" to be used for ANSI characters.&lt;br /&gt;&lt;br /&gt;Indeed this option can be set locally for each individual files by using the VIM modeline&lt;br /&gt;&lt;blockquote&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="color: rgb(204, 0, 0);font-family:courier new;" &gt;vim:ts=4:sw=4:expandtab:enc=utf8&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;All the VIM option can be changed locally. Don't forget to put this modeline into the comments :D&lt;br /&gt;&lt;br /&gt;VIM is fantastic cool~~~&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-3359119887200638909?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://vim.sourceforge.net' title='VIM Tips'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/3359119887200638909/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=3359119887200638909' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/3359119887200638909'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/3359119887200638909'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/09/vim-tips.html' title='VIM Tips'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-5101445239622193803</id><published>2008-09-23T10:45:00.003+08:00</published><updated>2008-09-23T10:51:26.484+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='JavaScript'/><category scheme='http://www.blogger.com/atom/ns#' term='WEB'/><title type='text'>强力推荐JavaScript 高级教程</title><content type='html'>超级牛人 &lt;a href="http://ejohn.org/about/" class="name"&gt;&lt;strong&gt;John&lt;/strong&gt; Resig&lt;/a&gt; （在 Mozilla.org 工作，jQuery的作者） 捉刀制作！！！ Web 开发必读~~~&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family: lucida grande;"&gt;Learning Advanced JavaScript&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;1) Our Goal&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;2) Defining Functions&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;3) Named Functions&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;4) Functions as Objects&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;5) Context&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;6) Instantiation&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;7) Flexible Arguments&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;8) Closures&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;9) Temporary Scope&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;10) Function Prototypes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;11) Instance Type&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;12) Inheritance&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;13) Built-in Prototypes&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;14) Enforcing Function Context&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: lucida grande;"&gt;15) Bonus: Function Length&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-5101445239622193803?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://ejohn.org/apps/learn/' title='强力推荐JavaScript 高级教程'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/5101445239622193803/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=5101445239622193803' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/5101445239622193803'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/5101445239622193803'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/09/javascript.html' title='强力推荐JavaScript 高级教程'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-6876946381615713249</id><published>2008-08-28T14:30:00.001+08:00</published><updated>2008-08-28T14:33:39.108+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>逐鹿蓝天</title><content type='html'>《逐鹿蓝天》 —— 美国民航业的经营管理&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-6876946381615713249?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.ccthere.com/tags/%D6%F0%C2%B9%C0%B6%CC%EC/2' title='逐鹿蓝天'/><link rel='enclosure' type='' href='http://www.ccthere.com' length='0'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/6876946381615713249/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=6876946381615713249' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6876946381615713249'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6876946381615713249'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/08/blog-post_28.html' title='逐鹿蓝天'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-6643823337625754857</id><published>2008-08-28T10:25:00.002+08:00</published><updated>2008-08-28T10:31:53.665+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WEB'/><title type='text'>Web 2.0</title><content type='html'>以前一直对所谓的 Web2.0 不敢冒， 主要还是因为对 Web2.0 的概念不了解。 今天在 西西河 看到铁手老大的帖子： 对Web2.0的描述简明扼要，重点突出，很有感觉&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;span style="color: rgb(51, 51, 153);"&gt;一般而言，谈论WEB2.0时，我们的概念基本上是，1、用户贡献的内容。2、方便的交互环境。和以前的网站概念不同，WEB2.0主要是依靠用户的参 与。用户的直接参与和内容提供，这是大家都能看到的WEB2.0的核心要素。好的WEB2.0，是在于能够有比较清楚的定位，吸引特定的人群，并在技术上 方便用户的参与。比如MYSPACE更注重社交功能，三教九流，五花八门都可以找到或者建立自己的朋友圈子，内容并不重要。&lt;/span&gt;&lt;br /&gt;&lt;/blockquote&gt;从这个意义上说，digg.com del.icio.us 才有那么点儿Web2.0的意思。 :)&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-6643823337625754857?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.ccthere.com/thread/1041891' title='Web 2.0'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/6643823337625754857/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=6643823337625754857' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6643823337625754857'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6643823337625754857'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/08/web-20.html' title='Web 2.0'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-6662092740423487276</id><published>2008-08-25T15:36:00.005+08:00</published><updated>2008-08-25T16:14:34.609+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UNIX'/><category scheme='http://www.blogger.com/atom/ns#' term='shell'/><title type='text'>重温 shell 编程的 变量操作</title><content type='html'>Shell编程的时候，总会觉得字符串的处理很麻烦！ 其实人家也觉得麻烦，ksh/bash中自有一套办法来帮助你，只是很多时候我们都不知道或者没注意而已！&lt;br /&gt;特别是有正则表达式&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;The character &lt;/span&gt;&lt;b style="font-family: courier new;"&gt;$&lt;/b&gt;&lt;span style="font-family:courier new;"&gt; is used to introduce substitutable &lt;/span&gt;&lt;i style="font-family: courier new;"&gt;parameters&lt;/i&gt;&lt;span style="font-family:courier new;"&gt;.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:courier new;font-size:130%;"  &gt;${&lt;i&gt;parameter&lt;/i&gt;}&lt;/span&gt;&lt;br /&gt;&lt;p style="padding-left: 2cm; font-family: courier new;"&gt;The  shell reads all the characters from &lt;b&gt;${&lt;/b&gt; to the matching &lt;b&gt;}&lt;/b&gt; as part of the same word even if it contains braces or  metacharacters.   The value, if any, of the parameter is substituted.  The braces are required when &lt;i&gt;parameter&lt;/i&gt;  is  followed  by  a  letter, digit,  or  underscore  that is not to be interpreted as part of its name, when the variable name contains a &lt;b&gt;.&lt;/b&gt;.  The  braces  are also  required  when a variable is subscripted unless it is part of an Arithmetic Expression or  a  Conditional  Expression.   If &lt;i&gt;parameter&lt;/i&gt;  is one or more digits then it is a positional parameter.  A positional parameter of more  than  one  digit  must  be enclosed  in braces.  If &lt;i&gt;parameter&lt;/i&gt; is &lt;b&gt;*&lt;/b&gt; or &lt;b&gt;@&lt;/b&gt;, then all the positional parameters, starting with &lt;b&gt;$1&lt;/b&gt;, are substituted  (separated by  a  field  separator character).  If an array &lt;i&gt;vname&lt;/i&gt; with subscript &lt;b&gt;*&lt;/b&gt; or &lt;b&gt;@&lt;/b&gt; is used, then the value for each of  the  elements is substituted, separated by the first character of the value of &lt;b&gt;IFS&lt;/b&gt;.&lt;/p&gt;&lt;br /&gt;&lt;span style="font-weight: bold; font-family: courier new;font-family:courier new;" &gt;&lt;span style="font-size:130%;"&gt;${#&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family: courier new;font-family:courier new;font-size:130%;"  &gt;&lt;i style="font-weight: bold;"&gt;parameter&lt;/i&gt;&lt;span style="font-weight: bold;"&gt;}&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="padding-left: 2cm; font-family: courier new;"&gt;If &lt;i&gt;parameter&lt;/i&gt; is &lt;b&gt;*&lt;/b&gt; or &lt;b&gt;@&lt;/b&gt;, the number of positional  parameters  is substituted.   Otherwise, the length of the value of the &lt;i&gt;parame&lt;/i&gt;&lt;i&gt;ter&lt;/i&gt; is substituted.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:courier new;font-size:130%;"  &gt;&lt;b&gt;${#&lt;/b&gt;&lt;i&gt;vname&lt;/i&gt;&lt;b&gt;[*]}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-family:courier new;font-size:130%;"  &gt;&lt;b&gt;${#&lt;/b&gt;&lt;i&gt;vname&lt;/i&gt;&lt;b&gt;[@]}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="padding-left: 2cm; font-family: courier new;"&gt;The number of elements in the array &lt;i&gt;vname&lt;/i&gt; is substituted.&lt;/p&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:130%;" &gt;&lt;b&gt;${!&lt;/b&gt;&lt;i&gt;vname&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="padding-left: 2cm; font-family: courier new;"&gt;Expands to the name of the variable referred to by &lt;i&gt;vname&lt;/i&gt;.   This will be &lt;i&gt;vname&lt;/i&gt; except when &lt;i&gt;vname&lt;/i&gt; is a name reference. &lt;/p&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:130%;" &gt;&lt;b&gt;${!&lt;/b&gt;&lt;i&gt;vname&lt;/i&gt;&lt;b&gt;[&lt;/b&gt;&lt;i&gt;subscript&lt;/i&gt;&lt;b&gt;]}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="padding-left: 2cm; font-family: courier new;"&gt;Expands  to  name  of  the subscript unless &lt;i&gt;subscript&lt;/i&gt; is &lt;b&gt;*&lt;/b&gt; or &lt;b&gt;@&lt;/b&gt;. When &lt;i&gt;subscript&lt;/i&gt; is &lt;b&gt;*&lt;/b&gt;, the list of array subscripts for  &lt;i&gt;vname&lt;/i&gt;  is generated.   For a variable that is not an array, the value is 0 if the variable is set.  Otherwise it is null.   When  &lt;i&gt;subscript &lt;/i&gt;is  &lt;b&gt;@&lt;/b&gt;,  same  as  above, except that when used in double quotes, each array subscript yields a separate argument. &lt;/p&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:130%;" &gt;&lt;b&gt;${!&lt;/b&gt;&lt;i&gt;prefix&lt;/i&gt;&lt;b&gt;*}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="padding-left: 2cm; font-family: courier new;"&gt;Expands to the names of the variables  whose  names  begin  with &lt;i&gt;prefix&lt;/i&gt;.&lt;/p&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:130%;" &gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;:-&lt;/b&gt;&lt;i&gt;word&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="padding-left: 2cm; font-family: courier new;"&gt;If  &lt;i&gt;parameter&lt;/i&gt;  is set and is non-null then substitute its value; otherwise substitute &lt;i&gt;word&lt;/i&gt;.&lt;/p&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:130%;" &gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;:=&lt;/b&gt;&lt;i&gt;word&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="padding-left: 2cm; font-family: courier new;"&gt;If &lt;i&gt;parameter&lt;/i&gt; is not set or is null then  set  it  to  &lt;i&gt;word&lt;/i&gt;;  the value  of the parameter is then substituted.  Positional parameters may not be assigned to in this way. &lt;/p&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:130%;" &gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;:?&lt;/b&gt;&lt;i&gt;word&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="padding-left: 2cm; font-family: courier new;"&gt;If &lt;i&gt;parameter&lt;/i&gt; is set and is non-null then substitute  its  value; otherwise,  print  &lt;i&gt;word&lt;/i&gt; and exit from the shell (if not interactive).  If &lt;i&gt;word&lt;/i&gt; is omitted then a standard message is printed. &lt;/p&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:130%;" &gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;:+&lt;/b&gt;&lt;i&gt;word&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="padding-left: 2cm; font-family: courier new;"&gt;If &lt;i&gt;parameter&lt;/i&gt; is set and is non-null then substitute &lt;i&gt;word&lt;/i&gt;; otherwise substitute nothing.&lt;/p&gt;&lt;p style="padding-left: 2cm; font-family: courier new;"&gt;In the above, &lt;i&gt;word&lt;/i&gt; is not evaluated unless it is to be used as the substituted string, so that, in the following  example,  &lt;b&gt;pwd&lt;/b&gt;  is  executed only if &lt;b&gt;d&lt;/b&gt; is not set or is null:&lt;br /&gt;&lt;br /&gt;&lt;em&gt;print ${d:-$(pwd)}&lt;/em&gt;&lt;br /&gt;&lt;br /&gt; If  the  colon  (  &lt;b&gt;:&lt;/b&gt;  &lt;b&gt;)&lt;/b&gt; is omitted from the above expressions, then the shell only checks whether &lt;i&gt;parameter&lt;/i&gt; is set or not. &lt;/p&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:130%;" &gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;:&lt;/b&gt;&lt;i&gt;offset&lt;/i&gt;&lt;b&gt;:&lt;/b&gt;&lt;i&gt;length&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:130%;" &gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;:&lt;/b&gt;&lt;i&gt;offset&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="padding-left: 2cm; font-family: courier new;"&gt;Expands to the portion of the value of &lt;i&gt;parameter&lt;/i&gt; starting at the character (counting from &lt;b&gt;0&lt;/b&gt;) determined by expanding &lt;i&gt;offset&lt;/i&gt; as an arithmetic expression and consisting of the number of characters determined  by  the arithmetic expression defined by &lt;i&gt;length.&lt;/i&gt;  In the second form, the remainder of the value is used.  If A negative  &lt;i&gt;offset&lt;/i&gt;  counts  backwards from the end of &lt;i&gt;parameter&lt;/i&gt;.&lt;br /&gt;Note that one or more &lt;i&gt;blank&lt;/i&gt;s is required in front of a minus sign  to prevent  the  shell  from  interpreting  the operator as &lt;b&gt;:-&lt;/b&gt;.  If &lt;i&gt;parameter&lt;/i&gt; is &lt;b&gt;*&lt;/b&gt; or &lt;b&gt;@&lt;/b&gt;, or is an array name indexed by &lt;b&gt;*&lt;/b&gt; or &lt;b&gt;@&lt;/b&gt;, then &lt;i&gt;offset&lt;/i&gt;  and  &lt;i&gt;length&lt;/i&gt;  refer to the array index and number of elements respectively.  A negative &lt;i&gt;offset&lt;/i&gt; is taken relative to  one greater  than  the  highest  subscript  for indexed arrays.  The            order for associate arrays is unspecified. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:130%;" &gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;#&lt;/b&gt;&lt;i&gt;pattern&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:130%;" &gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;##&lt;/b&gt;&lt;i&gt;pattern&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="padding-left: 2cm; font-family: courier new;"&gt;If the shell &lt;i&gt;pattern&lt;/i&gt; matches  the  beginning  of  the  value  of &lt;i&gt;parameter&lt;/i&gt;,  then the value of this expansion is the value of the &lt;i&gt;parameter&lt;/i&gt; with the matched portion deleted; otherwise the  value of  this &lt;i&gt;parameter&lt;/i&gt; is substituted.  In the first form the smallest matching pattern is deleted  and  in  the  second  form  the largest matching pattern is deleted.  When &lt;i&gt;parameter&lt;/i&gt; is &lt;b&gt;@&lt;/b&gt;, &lt;b&gt;*&lt;/b&gt;, or an array variable with subscript &lt;b&gt;@&lt;/b&gt; or &lt;b&gt;*&lt;/b&gt;, the substring operation is applied to each element in turn. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:130%;" &gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;%&lt;/b&gt;&lt;i&gt;pattern&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:130%;" &gt;&lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;%%&lt;/b&gt;&lt;i&gt;pattern&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="padding-left: 2cm; font-family: courier new;"&gt;If  the shell &lt;i&gt;pattern&lt;/i&gt; matches the end of the value of &lt;i&gt;parameter&lt;/i&gt;, then the value of this expansion is the value of  the  &lt;i&gt;parameter &lt;/i&gt;with the matched part deleted; otherwise substitute the value of &lt;i&gt;parameter&lt;/i&gt;.  In the first form the smallest matching  pattern  is deleted  and  in the second form the largest matching pattern is deleted.  When &lt;i&gt;parameter&lt;/i&gt; is &lt;b&gt;@&lt;/b&gt;, &lt;b&gt;*&lt;/b&gt;, or an array variable with subscript  &lt;b&gt;@&lt;/b&gt;  or &lt;b&gt;*&lt;/b&gt;, the substring operation is applied to each element in turn. &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new;font-size:130%;" &gt;       &lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;/&lt;/b&gt;&lt;i&gt;pattern&lt;/i&gt;&lt;b&gt;/&lt;/b&gt;&lt;i&gt;string&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;br /&gt; &lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;//&lt;/b&gt;&lt;i&gt;pattern&lt;/i&gt;&lt;b&gt;/&lt;/b&gt;&lt;i&gt;string&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;br /&gt; &lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;/#&lt;/b&gt;&lt;i&gt;pattern&lt;/i&gt;&lt;b&gt;/&lt;/b&gt;&lt;i&gt;string&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;br /&gt; &lt;b&gt;${&lt;/b&gt;&lt;i&gt;parameter&lt;/i&gt;&lt;b&gt;/%&lt;/b&gt;&lt;i&gt;pattern&lt;/i&gt;&lt;b&gt;/&lt;/b&gt;&lt;i&gt;string&lt;/i&gt;&lt;b&gt;}&lt;/b&gt;&lt;/span&gt;&lt;br /&gt;&lt;p style="padding-left: 2cm; font-family: courier new;"&gt;Expands &lt;i&gt;parameter&lt;/i&gt; and replaces the longest match of &lt;i&gt;pattern&lt;/i&gt; with the  given  &lt;i&gt;string.&lt;/i&gt;  Each occurrence of &lt;b&gt;\&lt;/b&gt;&lt;i&gt;n&lt;/i&gt; in &lt;i&gt;string&lt;/i&gt; is replaced by the portion of &lt;i&gt;parameter&lt;/i&gt; that matches the  &lt;i&gt;n&lt;/i&gt;-th  sub-pattern. In  the  first  form,  only  the  first occurrence of &lt;i&gt;pattern&lt;/i&gt; is replaced.  In  the  second  form,  each  match  for  &lt;i&gt;pattern&lt;/i&gt;  is replaced by the given &lt;i&gt;string.&lt;/i&gt;  The third form restricts the pat-&lt;br /&gt;        tern match to the beginning of the string while the fourth  form restricts  the  pattern  match  to  the end of the string.  When &lt;i&gt;string&lt;/i&gt; is null, the &lt;i&gt;pattern&lt;/i&gt; will be deleted and the &lt;b&gt;/&lt;/b&gt;  in  front&lt;br /&gt;        of  &lt;i&gt;string&lt;/i&gt;  may be omitted.  When &lt;i&gt;parameter&lt;/i&gt; is &lt;b&gt;@&lt;/b&gt;, &lt;b&gt;*&lt;/b&gt;, or an array variable with subscript &lt;b&gt;@&lt;/b&gt; or &lt;b&gt;*&lt;/b&gt;, the  substitution  operation  is applied  to each element in turn.  In this case, the &lt;i&gt;string&lt;/i&gt; portion of &lt;i&gt;word&lt;/i&gt; will be re-evaluated for each element. &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-6662092740423487276?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://kornshell.com/' title='重温 shell 编程的 变量操作'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/6662092740423487276/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=6662092740423487276' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6662092740423487276'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6662092740423487276'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/08/shell.html' title='重温 shell 编程的 变量操作'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-7257827204221902092</id><published>2008-08-25T14:25:00.000+08:00</published><updated>2008-08-25T14:26:11.272+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>邓稼先传</title><content type='html'>缅怀一下~~~~ 做个书签！&lt;br /&gt;&lt;br /&gt;http://www.tektalk.cn/2008/07/28/%E9%82%93%E7%A8%BC%E5%85%88%E4%BC%A0/&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-7257827204221902092?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.tektalk.cn/wp-content/uploads/2008/07/djx.pdf' title='邓稼先传'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/7257827204221902092/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=7257827204221902092' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7257827204221902092'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7257827204221902092'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/08/blog-post_9567.html' title='邓稼先传'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-2205268526951836973</id><published>2008-08-25T14:09:00.000+08:00</published><updated>2008-08-25T14:13:44.002+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>学海无涯</title><content type='html'>在&lt;a href="http://www.ccthere.com"&gt;西西河&lt;/a&gt;看到的！&lt;br /&gt;做学问难啊！  做学问还要打好基础~~~&lt;br /&gt;斗争要有理有利有节！！！&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ccthere.com/article/1106147"&gt;【原创】化学博士后的经历（1）---隐忧&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ccthere.com/article/1106207"&gt;【原创】化学博士后的经历（2）---艰难&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ccthere.com/article/1107479"&gt;【原创】化学博士后的经历（3）---醒悟&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ccthere.com/article/1109012"&gt;【原创】化学博士后的经历（4）---反击前哨战&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ccthere.com/article/1110513"&gt;【原创】化学博士后的经历（5）---当众摊牌&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ccthere.com/article/1112165"&gt;【原创】化学博士后的经历（6）---舌战&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ccthere.com/article/1115910"&gt;【原创】化学博士后的经历（7）---终于轻松了&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ccthere.com/article/1117561"&gt;【原创】化学博士后的经历（8）---最后的不厚道&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-2205268526951836973?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.ccthere.com/board/%BF%C6%BC%BC%CC%BD%CB%F7/' title='学海无涯'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/2205268526951836973/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=2205268526951836973' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2205268526951836973'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2205268526951836973'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/08/blog-post_25.html' title='学海无涯'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-728448027260466114</id><published>2008-08-24T19:25:00.001+08:00</published><updated>2008-08-24T19:27:38.665+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IT'/><title type='text'>看看什么叫做工作中的有理有利有节</title><content type='html'>&lt;table width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;看看萨老的原创：原载于 &lt;a href="http://www.ccthere.com"&gt;西西河&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.ccthere.com/article/830849"&gt;【原创】东瀛坑熊记 上&lt;/a&gt;&lt;span class="pNUM"&gt; &lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr valign="top"&gt;&lt;td colspan="1"&gt;&lt;a href="http://www.ccthere.com/article/831181"&gt;【原创】东瀛坑熊记 下&lt;/a&gt;&lt;br /&gt;&lt;a href="http://www.ccthere.com/article/830853"&gt;【原创】东瀛坑熊记 中&lt;/a&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-728448027260466114?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.ccthere.com/article/830849' title='看看什么叫做工作中的有理有利有节'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/728448027260466114/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=728448027260466114' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/728448027260466114'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/728448027260466114'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/08/blog-post_4842.html' title='看看什么叫做工作中的有理有利有节'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-8100745275974279208</id><published>2008-08-24T17:02:00.002+08:00</published><updated>2008-08-24T17:17:39.852+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Telecomm'/><title type='text'>香农极限 带宽计算公式</title><content type='html'>今天在西西河看到了 有人讲香农公式 &lt;a href="http://www.ccthere.com/article/696151"&gt;http://www.ccthere.com/article/696151&lt;/a&gt;&lt;br /&gt;不禁要感慨这人太牛了。给我们呈现了一种物理学中简单的美~~~&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: left;"&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://upload.wikimedia.org/math/5/d/a/5da4ee296242ff06ad38fd97d1911cb3.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: left; cursor: pointer;" src="http://upload.wikimedia.org/math/5/d/a/5da4ee296242ff06ad38fd97d1911cb3.png" alt="" border="0" /&gt;&lt;/a&gt;具体来说&lt;br /&gt;&lt;ul&gt;&lt;li&gt;If S/N &gt;&gt; 1, then&lt;/li&gt;&lt;/ul&gt; &lt;dl&gt;&lt;dd&gt; &lt;dl&gt;&lt;dd&gt;&lt;img class="tex" alt=" C \approx 0.332 \cdot B \cdot \mathrm{SNR (in \ dB)} " src="http://upload.wikimedia.org/math/e/f/1/ef1f03d5c739731bcd7be5d1cf6c25ec.png" /&gt;&lt;/dd&gt;&lt;/dl&gt; &lt;/dd&gt;&lt;dd&gt;where &lt;dl&gt;&lt;dd&gt; &lt;dl&gt;&lt;dd&gt;&lt;img class="tex" alt="\mathrm{SNR (in \ dB)} = 10\log_{10}{S \over N} " src="http://upload.wikimedia.org/math/e/d/c/edc481f6e0dbc1eae4141eff0eecaedb.png" /&gt;&lt;/dd&gt;&lt;/dl&gt; &lt;/dd&gt;&lt;/dl&gt; &lt;/dd&gt;&lt;/dl&gt; &lt;ul&gt;&lt;li&gt;Similarly, if S/N &lt;&lt;&gt;&lt;/ul&gt; &lt;dl&gt;&lt;dd&gt; &lt;dl&gt;&lt;dd&gt;&lt;img class="tex" alt=" C \approx 1.44 \cdot B \cdot {S \over N}" src="http://upload.wikimedia.org/math/0/4/1/0414750712bcb92229a69dd6f83c3e79.png" /&gt;&lt;/dd&gt;&lt;/dl&gt; &lt;/dd&gt;&lt;/dl&gt; &lt;dl&gt;&lt;dd&gt;In this low-SNR approximation, capacity is independent of bandwidth if the noise is white, of &lt;a href="http://en.wikipedia.org/wiki/Spectral_density" title="Spectral density"&gt;spectral density&lt;/a&gt; &lt;span class="texhtml"&gt;&lt;i&gt;N&lt;/i&gt;&lt;sub&gt;0&lt;/sub&gt;&lt;/span&gt; watts per hertz, in which case the total noise power is &lt;img class="tex" alt="B \cdot N_0" src="http://upload.wikimedia.org/math/9/c/0/9c0363540507e7610d6483e13c4b5c76.png" /&gt;.&lt;/dd&gt;&lt;/dl&gt; &lt;dl&gt;&lt;dd&gt; &lt;dl&gt;&lt;dd&gt;&lt;img class="tex" alt=" C \approx 1.44  \cdot {S \over N_0}" src="http://upload.wikimedia.org/math/e/d/2/ed21c493a6e6ed392d7f5b4ce604d90e.png" /&gt;&lt;/dd&gt;&lt;/dl&gt; &lt;/dd&gt;&lt;/dl&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-8100745275974279208?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://en.wikipedia.org/wiki/Shannon-Hartley_theorem' title='香农极限 带宽计算公式'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/8100745275974279208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=8100745275974279208' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/8100745275974279208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/8100745275974279208'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/08/blog-post_24.html' title='香农极限 带宽计算公式'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-8350797400748743813</id><published>2008-08-21T16:24:00.001+08:00</published><updated>2008-08-21T16:25:44.874+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>苏联笑话</title><content type='html'>火车停了 &lt;br /&gt;话说列宁,斯大林,赫鲁晓夫,勃列日涅夫,戈尔巴乔夫五人同坐一列社会主义号火车前进, 突然火车停了,车长过来报告,前面铁路断了,列宁:"说发动一次星期六义务劳动把它修好",斯大林一瞪眼:"一定有阶级敌人搞破坏,抓起来枪毙",赫若有 所思 "前面不通,就倒车吧",勃列日涅夫:"找几个人下车摇火车就行了,乘客感到车在动就以为在前进",只有戈尔巴桥夫最绝:"把火车拆了,每人扛一件零件前 进, 到有铁轨的地方再装起来"于是拆了火车, ... &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;斯大林的烟斗 &lt;br /&gt;斯大林喜欢夜间工作，有一次他凌晨 3点迷迷糊糊就睡着了，把最喜欢的烟斗忘在了沙发缝里。第二天早上起来发现找不到烟斗了，就让贝利亚去处理这件事。第二天贝利亚揭露出了一个“利用偷烟斗 进行暗杀活动的托洛茨基组织”，10多名罪犯全被枪决，但是还是没找到那个烟斗。最后是苏斯洛夫坐这个沙发觉得塥的慌，打开一看才找到的。   &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;原 苏联共产党中央第一书记赫鲁晓夫（1891--1971年）在愤怒遣责联合国阻挠苏调停刚果战后独立危机的行为不久，又向联合国秘书长哈马金尔德发去一封 礼节性的邀请书，请他参加苏联的国宴。赫鲁晓夫非常热情地欢迎哈马金尔德的到来。有人问他，为什么对前不久遣责过的人表现得如此热忱。赫鲁晓夫反问道： “你知道我国高加索地区人民的传统习惯吗？敌人在你家里作客，与你分享面包和食盐时，你要殷勤款待；一旦敌人跨出了你的家门，你就可以豁断他的喉管。”  &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;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-8350797400748743813?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.newsmth.net/bbstcon.php?board=MilitaryJoke&amp;gid=25687' title='苏联笑话'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/8350797400748743813/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=8350797400748743813' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/8350797400748743813'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/8350797400748743813'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/08/blog-post_21.html' title='苏联笑话'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-1737263741014250822</id><published>2008-08-15T10:25:00.002+08:00</published><updated>2008-08-15T10:45:59.504+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IT'/><title type='text'>Open Souce 的版权终于得以正名</title><content type='html'>&lt;h3 id="news_title"&gt;&lt;span style="font-size:100%;"&gt;&lt;/span&gt;&lt;/h3&gt;&lt;a href="http://www.cnbeta.com/articles/62360.htm"&gt;Jacobsen v. Katzer：开源运动的一个重大胜利&lt;/a&gt; http://www.cnbeta.com/articles/62360.htm&lt;br /&gt;&lt;a href="http://en.wikipedia.org/wiki/Jacobsen_v._Katzer"&gt;Jacobsen v. Katzer 的诉讼&lt;/a&gt; http://en.wikipedia.org/wiki/Jacobsen_v._Katzer&lt;br /&gt;&lt;br /&gt;案件大致情况是：&lt;br /&gt;2006年，Bob Jacobsen起诉Matt Katzer，声称后者的软件没有遵守开源协议，标明源代码的出处和作者，要求法院认定这是侵犯著作权行为。但是，当时的旧金山联邦地区法院驳回了这个请 求，认为这只是“违反契约”（a breach of the licensing agreement），而不是“侵犯著作权”（copyright infringement）。 在美国通常“违法契约”诉讼人只能申请经济上的补偿， 而“侵犯著作权”则可以申请禁止令要求侵权人停止损害。&lt;br /&gt;2008年8月，美国联邦上诉法院(Court of Appeals for the Federal Circuit)判决：“‘开源协议’ 是一种著作权协议，违反协议就是侵权行为。”  法官还表示 "Open source licensing has become a widely used method of creative collaboration that serves to advance the arts and sciences in a manner and at a pace that few could have imagined just a few decades ago,"&lt;br /&gt;&lt;br /&gt;对于实行判例法系的美国，这将是法律体系对开源版权的确认！&lt;br /&gt;&lt;br /&gt;PC Magazine 的报道: &lt;a href="http://www.pcmag.com/article2/0,2817,2328027,00.asp"&gt;http://www.pcmag.com/article2/0,2817,2328027,00.asp&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-1737263741014250822?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://lessig.org/blog/2008/08/huge_and_important_news_free_l.html' title='Open Souce 的版权终于得以正名'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/1737263741014250822/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=1737263741014250822' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1737263741014250822'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1737263741014250822'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/08/open-souce.html' title='Open Souce 的版权终于得以正名'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-963754470862954804</id><published>2008-08-15T10:22:00.001+08:00</published><updated>2008-08-15T10:25:24.392+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>研究的精神</title><content type='html'>兴趣是最好的老师， 世界上没有完美的系统，电子车票系统也是如此。 这个PDF里讲述了一个MIT的三位学生发现了波士顿地铁电子车票系统的漏洞的故事。&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;国内的这种研究的精神似乎少了一些！ 我们的教育导向太死板了！&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-963754470862954804?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www-tech.mit.edu/V128/N30/subway/Defcon_Presentation.pdf' title='研究的精神'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/963754470862954804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=963754470862954804' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/963754470862954804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/963754470862954804'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/08/blog-post.html' title='研究的精神'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-1225768446539671659</id><published>2008-08-14T10:24:00.004+08:00</published><updated>2008-08-14T10:53:41.388+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IT'/><title type='text'>低价 PC or 低功耗 PC</title><content type='html'>随着Intel Atom的诞生， 低价PC或者低功耗PC的大潮开始涌动了！ 回过头来说，低功耗PC也许还不错，但是低价PC这也许又不是Intel真正想要给我们这些消费者的！ 看看 ccthere.com 上的文章！&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;a href="http://www.ccthere.com/article/1719886"&gt;&lt;span style="font-weight: bold;"&gt;【原创】如何普及低成本笔记本电脑 1. 为什么手机比笔记本更便宜&lt;/span&gt;&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;&lt;a href="http://www.ccthere.com/article/1723051"&gt;【原创】如何普及低成本笔记本电脑 2. 尝试与挫折&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;特别是下面的这段文字：&lt;br /&gt;&lt;blockquote&gt;“Intel每年销售1亿多片CPU，销售额为350-400亿美元，平均每片价格为200多美元，毛利润150美元以上。假设Intel为低成本电脑推 出价格为20美元左右的CPU，毛利润为每片5美元左右，每年销售2亿片，销售额为40亿美元，毛利润为10亿美元。如果这2亿片低成本芯片的销售不影响 原来的1亿多片的芯片销售，则Intel是愿意做的；但如果由于这2亿片低成本芯片的销售使得其他处理器的销售减少了2000万片，则Intel销售额减 少40亿美元，利润减少30亿美元。”（《&lt;a href="http://www.ict.ac.cn/diffusive/channel/detail4157.asp"&gt;龙芯之火，可以燎原&lt;/a&gt;》，2007年12月）&lt;/blockquote&gt;市场经济，利益至上 Intel Atom 的低功耗，低廉的价格，低下的性能都是Intel所期望的！ Intel从一开始就没有打算用 Atom 来作为低价PC的CPU来销售，她的目标是低功耗PC。以至于Atom在这个领域内热卖的时候，Intel不但没有增加产量，而是控制产量提高售价，因为Intel比谁都清楚Atom的毛利太低，卖的太多不赚钱，既然它热卖那就索性提价提高毛利！&lt;br /&gt;&lt;br /&gt;AMD也有他自己的应对策略。AMD比不了Intel，她没有太多的研发实验室，没有太多的工厂，不能像Intel那样同时搞很多的不同设计，既然不能用新的对应的产品和你比，那就用已经有的老产品改头换面来跟你比，反正最终的效果是一样的。 当然了，不是在低价PC，AMD的价格已经够低了； 只能在低功耗方面做文章， 这个Mini-780G就是一个不错的模式！&lt;br /&gt;&lt;blockquote&gt;“功耗吗确实是你Intel Atom低，但是我的总功耗也不高，也就是个70/80W（比Atom高30W），但是性能比你强1倍，1080p完全没问题，不像你720p都吭吭哧哧的！为了看高清又有谁会在乎多点这一个灯泡呢？”&lt;br /&gt;&lt;/blockquote&gt;博弈啊！！！&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-1225768446539671659?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.pcpop.com/doc/0/319/319122.shtml' title='低价 PC or 低功耗 PC'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/1225768446539671659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=1225768446539671659' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1225768446539671659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1225768446539671659'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/08/pc-or-pc.html' title='低价 PC or 低功耗 PC'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-2386656529942855136</id><published>2008-08-07T09:44:00.006+08:00</published><updated>2008-08-07T11:12:39.372+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Develop'/><title type='text'>How to Write a Good Technical Documentation</title><content type='html'>&lt;span style=";font-family:verdana;font-size:130%;"  &gt;&lt;span style="font-size:100%;"&gt;Writing good documentation always hard! But you can make it better.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;DO:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Fully understand the situation, and know the 5 W's:&lt;br /&gt;"Who, What, Where, When, and Why". &lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;KISS: Keep It Simple and Stupid&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Write agenda before you start&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family: verdana;"&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family: verdana;"&gt;Keep the technical integrity&lt;/span&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Add reference links for all the shared knowledge&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:verdana;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Use diagram to show the complex logical&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Use table to show the structured information&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Compare the different design alternatives&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Use bulletin and numbered list to express the idea&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Write a good looking document&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Have a good template&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Use named style to control the format&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Always do spelling/grammar check &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Tidy your documentation&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Ask for comments from others&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Track changes between the reversions&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style=";font-family:verdana;font-size:130%;"  &gt;DON'T:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Write long sentence or paragraph &lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Be afraid to delete some pieces&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Be afraid to reconstruct sections&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Be afraid to spend more time&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;span style=";font-family:verdana;font-size:130%;"  &gt;Miscellanea:&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Ask for others' help, and help others&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-family:verdana;"&gt;Eats your own dog food&lt;br /&gt;Read it once more when you feel it were finished&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-2386656529942855136?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.kuro5hin.org/story/2003/9/29/104212/112' title='How to Write a Good Technical Documentation'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/2386656529942855136/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=2386656529942855136' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2386656529942855136'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2386656529942855136'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/08/how-to-write-good-technical.html' title='How to Write a Good Technical Documentation'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-5788959361099613977</id><published>2008-07-15T09:44:00.004+08:00</published><updated>2008-07-16T07:40:51.187+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blog'/><title type='text'>The smallest C program to print the biggest prime number</title><content type='html'>&lt;p&gt;这个世界上，令人敬仰的人太多了~~~~ &lt;a href="http://en.wikipedia.org/wiki/Fabrice_Bellard"&gt;Fabrice Bellard&lt;/a&gt; 就是一个这个就是他的小程序，用来计算目前已知的最大质数的程序一共只有475字节，是一个一行程序。&lt;br /&gt;可以通过任何C编译器编译。&lt;/p&gt;&lt;br /&gt;&lt;PRE&gt;&lt;br /&gt;int m=754974721,N,t[1&amp;lt;&amp;lt;24],a,*p,i,e=16804127,j,s,c,U;f(d){for(s=1&amp;lt;&amp;lt;24;s/=2;d=d*1&lt;br /&gt;LL*d%m)if(s&amp;lt;N)for(p=t;p&amp;lt;t+N;p+=s)for(i=s,c=1;i;i--)a=*p+p[s],p[s]=(m+*p-p[s])*1L&lt;br /&gt;L*c%m,*p++=a%m,c=c*1LL*d%m;for(j=0;i&amp;lt;N-1;){for(s=N/2;!((j^=s)&amp;amp;s);s/=2);if(++i&amp;lt;j)&lt;br /&gt;a=t[i],t[i]=t[j],t[j]=a;}}main(){*t=2;U=N=1;while(e/=2){N*=2;U=U*1LL*(m+1)/2%m;f&lt;br /&gt;(362);for(p=t;p&amp;lt;t+N;p++)*p=*p*1LL**p%m*U%m;f(415027540);for(a=0,p=t;p&amp;lt;t+N;)a+=*p&lt;br /&gt;&amp;lt;&amp;lt;(e&amp;amp;1),*p++=a%10,a/=10;}while(!*--p);t[0]--;while(p&amp;gt;=t)printf("%d",*p--);}&lt;br /&gt;&lt;/PRE&gt;&lt;br /&gt;&lt;br /&gt;格式化之后，它看起来这样：&lt;br /&gt;&lt;div style="background-color:Navy;"&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 128, 255);"&gt;#include &lt;/span&gt;&lt;span style="color: rgb(255, 160, 160);"&gt;&amp;lt;stdio.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 128, 255);"&gt;#include &lt;/span&gt;&lt;span style="color: rgb(255, 160, 160);"&gt;&amp;lt;stdlib.h&amp;gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(96, 255, 96);"&gt;int&lt;/span&gt; m=&lt;span style="color: rgb(255, 160, 160);"&gt;754974721&lt;/span&gt;,N,t[&lt;span style="color: rgb(255, 160, 160);"&gt;1&lt;/span&gt;&amp;lt;&amp;lt;&lt;span style="color: rgb(255, 160, 160);"&gt;24&lt;/span&gt;],a,*p,i,e=&lt;span style="color: rgb(255, 160, 160);"&gt;16804127&lt;/span&gt;,j,s,c,U;&lt;br /&gt;f(&lt;span style="color: rgb(96, 255, 96);"&gt;int&lt;/span&gt; d){&lt;br /&gt; &lt;span style="color: rgb(255, 255, 96);"&gt;for&lt;/span&gt;(s=&lt;span style="color: rgb(255, 160, 160);"&gt;1&lt;/span&gt;&amp;lt;&amp;lt;&lt;span style="color: rgb(255, 160, 160);"&gt;24&lt;/span&gt;;s/=&lt;span style="color: rgb(255, 160, 160);"&gt;2&lt;/span&gt;;d=d*&lt;span style="color: rgb(255, 160, 160);"&gt;1LL&lt;/span&gt;*d%m)&lt;br /&gt;     &lt;span style="color: rgb(255, 255, 96);"&gt;if&lt;/span&gt;(s&amp;lt;N)&lt;br /&gt;         &lt;span style="color: rgb(255, 255, 96);"&gt;for&lt;/span&gt;(p=t;p&amp;lt;t+N;p+=s)&lt;br /&gt;             &lt;span style="color: rgb(255, 255, 96);"&gt;for&lt;/span&gt;(i=s,c=&lt;span style="color: rgb(255, 160, 160);"&gt;1&lt;/span&gt;;i;i--)&lt;br /&gt;                 a=*p+p[s],p[s]=(m+*p-p[s])*&lt;span style="color: rgb(255, 160, 160);"&gt;1LL&lt;/span&gt;*c%m,*p++=a%m,c=c*&lt;span style="color: rgb(255, 160, 160);"&gt;1LL&lt;/span&gt;*d%m;&lt;br /&gt; &lt;span style="color: rgb(255, 255, 96);"&gt;for&lt;/span&gt;(j=&lt;span style="color: rgb(255, 160, 160);"&gt;0&lt;/span&gt;;i&amp;lt;N-&lt;span style="color: rgb(255, 160, 160);"&gt;1&lt;/span&gt;;){&lt;br /&gt;     &lt;span style="color: rgb(255, 255, 96);"&gt;for&lt;/span&gt;(s=N/&lt;span style="color: rgb(255, 160, 160);"&gt;2&lt;/span&gt;;!((j^=s)&amp;amp;s);s/=&lt;span style="color: rgb(255, 160, 160);"&gt;2&lt;/span&gt;);&lt;br /&gt;     &lt;span style="color: rgb(255, 255, 96);"&gt;if&lt;/span&gt;(++i&amp;lt;j)&lt;br /&gt;         a=t[i],t[i]=t[j],t[j]=a;&lt;br /&gt; }&lt;br /&gt;}&lt;br /&gt;main(){&lt;br /&gt; *t=&lt;span style="color: rgb(255, 160, 160);"&gt;2&lt;/span&gt;;&lt;br /&gt; U=N=&lt;span style="color: rgb(255, 160, 160);"&gt;1&lt;/span&gt;;&lt;br /&gt; &lt;span style="color: rgb(255, 255, 96);"&gt;while&lt;/span&gt;(e/=&lt;span style="color: rgb(255, 160, 160);"&gt;2&lt;/span&gt;){&lt;br /&gt;     N*=&lt;span style="color: rgb(255, 160, 160);"&gt;2&lt;/span&gt;;&lt;br /&gt;     U=U*&lt;span style="color: rgb(255, 160, 160);"&gt;1LL&lt;/span&gt;*(m+&lt;span style="color: rgb(255, 160, 160);"&gt;1&lt;/span&gt;)/&lt;span style="color: rgb(255, 160, 160);"&gt;2&lt;/span&gt;%m;&lt;br /&gt;     f(&lt;span style="color: rgb(255, 160, 160);"&gt;362&lt;/span&gt;);&lt;br /&gt;     &lt;span style="color: rgb(255, 255, 96);"&gt;for&lt;/span&gt;(p=t;p&amp;lt;t+N;p++) *p=*p*&lt;span style="color: rgb(255, 160, 160);"&gt;1LL&lt;/span&gt;**p%m*U%m;&lt;br /&gt;     f(&lt;span style="color: rgb(255, 160, 160);"&gt;415027540&lt;/span&gt;);&lt;br /&gt;     &lt;span style="color: rgb(255, 255, 96);"&gt;for&lt;/span&gt;(a=&lt;span style="color: rgb(255, 160, 160);"&gt;0&lt;/span&gt;,p=t;p&amp;lt;t+N;) a+=*p&amp;lt;&amp;lt;(e&amp;amp;&lt;span style="color: rgb(255, 160, 160);"&gt;1&lt;/span&gt;),*p++=a%&lt;span style="color: rgb(255, 160, 160);"&gt;10&lt;/span&gt;,a/=&lt;span style="color: rgb(255, 160, 160);"&gt;10&lt;/span&gt;;&lt;br /&gt; }&lt;br /&gt; &lt;span style="color: rgb(255, 255, 96);"&gt;while&lt;/span&gt;(!*--p);&lt;br /&gt; t[&lt;span style="color: rgb(255, 160, 160);"&gt;0&lt;/span&gt;]--;&lt;br /&gt; &lt;span style="color: rgb(255, 255, 96);"&gt;while&lt;/span&gt;(p&amp;gt;=t)printf(&lt;span style="color: rgb(255, 160, 160);"&gt;"&lt;/span&gt;&lt;span style="color: rgb(255, 165, 0);"&gt;%d&lt;/span&gt;&lt;span style="color: rgb(255, 160, 160);"&gt;"&lt;/span&gt;,*p--);&lt;br /&gt;}&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;计算输出的结果有 9M 之巨。 &lt;br /&gt;另外说一句，这个哥哥 72年出生，今年36岁。&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-5788959361099613977?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://bellard.org/mersenne.html' title='The smallest C program to print the biggest prime number'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/5788959361099613977/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=5788959361099613977' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/5788959361099613977'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/5788959361099613977'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/07/smallest-c-program-to-print-biggest.html' title='The smallest C program to print the biggest prime number'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-745267611163806144</id><published>2008-06-27T10:47:00.003+08:00</published><updated>2008-08-02T17:12:32.783+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network'/><title type='text'>RPC forever / 永远的 RPC</title><content type='html'>I put the RPC (Remote Procedure Call) as title, but it didn't exactly talking about the RPC. :) Sorry! Indeed it is talking about the distribution computing, but this one is too large, sometimes, it just causes confusing. ;)&lt;br /&gt;When the computer networks born in 1970s, distribution computing was coming in the vision, from that time to now. Variety of RPC/IPC mechanism were invited into the world. I think at least some of them are very familiar with you:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;BSD Socket&lt;br /&gt;&lt;/li&gt;&lt;li&gt;telnet&lt;br /&gt;&lt;/li&gt;&lt;li&gt;FTP&lt;/li&gt;&lt;li&gt;SMTP/POP3/IMAP&lt;/li&gt;&lt;li&gt;NNTP&lt;/li&gt;&lt;li&gt;RSH/RLOGIN&lt;/li&gt;&lt;li&gt;ONC-RPC / DEC-RPC&lt;/li&gt;&lt;li&gt;NFS&lt;br /&gt;&lt;/li&gt;&lt;li&gt;HTTP&lt;/li&gt;&lt;li&gt;XMPP&lt;/li&gt;&lt;li&gt;SSH&lt;/li&gt;&lt;li&gt;CORBA/IIOP/GIOP&lt;/li&gt;&lt;li&gt;DCOM/COM&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Java/RMI&lt;br /&gt;&lt;/li&gt;&lt;li&gt;SOAP/Web Service&lt;/li&gt;&lt;li&gt;XML-RPC&lt;/li&gt;&lt;li&gt;JSON&lt;/li&gt;&lt;/ul&gt;And so one! In the computer worlds, people do the similar things time and time again.&lt;br /&gt;Because the IT industry always need the fresh blood!!!&lt;br /&gt;Something else changed, you also want to change yours. :)&lt;br /&gt;&lt;br /&gt;人都是喜新厌旧的！&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-745267611163806144?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://en.wikipedia.org/wiki/Remote_procedure_call' title='RPC forever / 永远的 RPC'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/745267611163806144/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=745267611163806144' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/745267611163806144'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/745267611163806144'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/06/rpc-forever-rpc.html' title='RPC forever / 永远的 RPC'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-9124872956761736750</id><published>2008-06-10T09:41:00.004+08:00</published><updated>2008-06-10T10:08:20.061+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IT'/><title type='text'>iPhone 3G  is coming! 智能手机们都该洗洗睡了</title><content type='html'>Apple (TM) iPhone (TM) 3G 版本 Zippy 2008年6月9日在旧金山发布。 &lt;br /&gt;&lt;object style="width: 100%" type="application/x-shockwave-flash" data="http://www.reuters.com/resources/flash/includevideo.swf?edition=US&amp;videoId=84315" width="344" height="320"&gt;&lt;param name="wmode" value="transparent" /&gt;&lt;param name="movie" value="http://www.reuters.com/resources/flash/includevideo.swf?edition=US&amp;videoId=84315" /&gt;&lt;embed src="http://www.reuters.com/resources/flash/includevideo.swf?edition=US&amp;videoId=84315" type="application/x-shockwave-flash" wmode="transparent" width="344" height="320"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;看看这次 Steve Jobs 给我们带来了什么？  8G内存的版本价格为 $199 = ￥1400 : 3G UMTS, Wifi, Apple's design. &lt;br /&gt;我看所有高高在上智能手机都该洗洗睡了！ &lt;br /&gt;&lt;br /&gt;Apple 打得起这个价格战， 早就有分析人士估计过 iPhone的成本价格， 不过一百多刀。 那还是市面上的元器件价格， 就凭Apple的议价能力，还有进一步的利润空间。 即便保持当前的这个价格水平， Apple 仍旧能有 40%左右的毛利。 而iPhone 的研发成本早就通过第一批 iPhone $499 的暴利赚个八九不离十。 目前Apple要做的就是铆足力气，甩开所有潜在的竞争对手， 进而利用 iPhone 这个平台展开其他的增值业务。  最直接的说就是进入企业应用市场，iPhone 直接支持Microsoft Exchange Server, 支持iChat,  BlackBerry 这次真的危了！&lt;br /&gt;&lt;br /&gt;但从所谓高端智能手机这个层面来说，$199 的价格，不但让 Nokia, BlackBerry, SonyEricsson, Samsung, Motorola, LG 等厂商汗颜，恐怕就连那些国内的黑手机，山寨兄弟们也要卧倒一大片了。  &lt;br /&gt;&lt;br /&gt;市场规律就是这样， 技术优势总是属于后来者的， 就看你能不能把握了！&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-9124872956761736750?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.reuters.com/article/technologyNews/idUSN0945884320080610?sp=true' title='iPhone 3G  is coming! 智能手机们都该洗洗睡了'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/9124872956761736750/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=9124872956761736750' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/9124872956761736750'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/9124872956761736750'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/06/iphone-3g-is-coming.html' title='iPhone 3G  is coming! 智能手机们都该洗洗睡了'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-6283516812143221662</id><published>2008-06-05T20:41:00.002+08:00</published><updated>2008-06-05T21:14:01.902+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WEB'/><title type='text'>不得不说的  Safari + WebKit</title><content type='html'>WebKit 引擎的发展在 Apple 的催动下，简直是一日千里。 随着 Safari for WindowsXP 的发布，M$ Windows用户也能感受一把 WebKit 的快感。&lt;br /&gt;&lt;br /&gt;感觉上 Safari 本身并没有什么特别之处， 从应用程序框架的角度来说远不如 Mozilla Firefox 来的灵活。但是 WebKit 引擎确实不得不让人刮目相看。简单来说，WebKit 有如下的优势：&lt;br /&gt;1， 浏览速度快&lt;br /&gt; 特别是  SquirrelFish 的 JavaScript 引擎发布之后，Safari简直跟飞一样。 而且下载的速度也巨快！&lt;br /&gt;&lt;br /&gt;2，字体渲染效果好&lt;br /&gt;所有的字体显示都采用了 anti-aliasing, 当然不是所有人都喜欢这样的字体效果，八成会说它显示的模糊。不过目前来说确实能够和内嵌点阵字体的SimSun一争高下。&lt;br /&gt;&lt;br /&gt;3， 标准&lt;br /&gt; 当前的 Safari 3.1.1 + WebKit r34367 可以顺利通过所有的 &lt;a href="http://www.acidtests.org/"&gt;acidtests&lt;/a&gt;, 特别是 Acidtest3 这个高难度动作， WebKit 不但可以全部完成而且运行飞快：&lt; 2s 令人惊叹啊！ &lt;br /&gt;&lt;br /&gt;4， 超炫的 Web Inspector &lt;br /&gt; Safari 内置的 Inspector 简直就是一个综合的 Web 应用集成开发工具。&lt;br /&gt;&lt;br /&gt;不过也有些缺点：&lt;br /&gt;1， Plugin 支持的问题还比较多&lt;br /&gt;基本能工作，但是不稳定！&lt;br /&gt;&lt;br /&gt;2，第三方应用太少&lt;br /&gt;&lt;br /&gt;3， Safari 的 tab 功能一般&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-6283516812143221662?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/6283516812143221662/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=6283516812143221662' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6283516812143221662'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6283516812143221662'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/06/safari-webkit.html' title='不得不说的  Safari + WebKit'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-724114997029002273</id><published>2008-05-29T23:13:00.002+08:00</published><updated>2008-05-29T23:15:28.471+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IT'/><title type='text'>Motorola 的王朝</title><content type='html'>商务周刊的强文~&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-724114997029002273?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.it.com.cn/f/news/085/29/602511.htm' title='Motorola 的王朝'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/724114997029002273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=724114997029002273' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/724114997029002273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/724114997029002273'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/05/motorola.html' title='Motorola 的王朝'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-3500744178428599643</id><published>2008-05-13T16:48:00.003+08:00</published><updated>2008-05-13T17:04:55.055+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><title type='text'>Using :vimgrep inside VIM</title><content type='html'>Grep is really power tool under the UNIX domain. From Vim 7, an internal `grep` was provided by Vim.&lt;br /&gt;&lt;br /&gt;Using `:vimgrep` is fairly easy, just in command mode, type in&lt;br /&gt;&lt;pre&gt;:vim[grep][!] /{pattern}/[g][j] {file} ...&lt;br /&gt;&lt;/pre&gt;The `grep` result will be put into the `quickfix` list. The `:cnext`, and `:cprevious` can be used to navigate the `quickfix` list.&lt;br /&gt;&lt;br /&gt;Let's do something to help us! Put this into your ~/.vimrc file.&lt;br /&gt;&lt;pre&gt;" We can navigate the list by using the &lt;f3&gt; and &lt;s-f3&gt;&lt;br /&gt;map &amp;lt;F3&amp;gt; :cnext&lt;cr&gt;&lt;br /&gt;map &amp;lt;S-F3&amp;gt; :cprevious&lt;/cr&gt;&lt;/s-f3&gt;&lt;/f3&gt;&lt;/pre&gt;&lt;br /&gt;After that, you will be able to use the &amp;lt;F3&amp;gt; and &amp;lt;shift&amp;gt;-&amp;lt;F3&amp;gt; navigate the `quickfix` list  easily. :D&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-3500744178428599643?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.vim.org/htmldoc/quickfix.html' title='Using :vimgrep inside VIM'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/3500744178428599643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=3500744178428599643' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/3500744178428599643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/3500744178428599643'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/05/using-vimgrep-inside-vim.html' title='Using :vimgrep inside VIM'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-1057743908967198959</id><published>2008-05-09T13:17:00.006+08:00</published><updated>2008-05-13T17:06:58.312+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><title type='text'>Tip for trouble shooting the VIM syntax highlight</title><content type='html'>It is easy to do a VIM syntax highlight file, while it is a little difficult for you to do the trouble shooting, especially when you do a recursive pattern match with `contains`, `nextgroup` keywords.&lt;br /&gt;&lt;br /&gt;Here is a small tip can help you a little bit.&lt;br /&gt;&lt;br /&gt;put this into your ".vimrc" file&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;" display the syntax name under the cursor&lt;br /&gt;map &amp;lt;F12&amp;gt; :echo synIDattr(synIDtrans(synID(line("."), col("."), 1)), "name")&lt;/pre&gt;&lt;br /&gt;For the next time, when you met some syntax highlight error, you can key in &amp;lt;F12&amp;gt; at the error place, VIM will tell you "what kind syntax ID that it is thing under the given position".&lt;br /&gt;&lt;br /&gt;Keep fun! :)&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-1057743908967198959?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://vimdoc.sourceforge.net/htmldoc/eval.html#functions' title='Tip for trouble shooting the VIM syntax highlight'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/1057743908967198959/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=1057743908967198959' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1057743908967198959'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1057743908967198959'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/05/tip-for-trouble-shooting-vim-syntax.html' title='Tip for trouble shooting the VIM syntax highlight'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-155725452057538714</id><published>2008-04-08T13:01:00.001+08:00</published><updated>2008-04-08T13:04:46.068+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>必须了解的"时间管理"原则</title><content type='html'>&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;1、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;相等分配。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;任何人都没有足够的时间，然而每一个人又拥有自己的全部时间。这就是著名的“时间悖论”。时间是一种被相等地分配给所有人的资源。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-size:180%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;2、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;错误的感觉。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;管理者的时间很少花费在他自己想要花费的地方。这种想法捉弄了时间的所有者，使他错误地认为，他的时间正用于该用的地方。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;3、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;时间分析。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;每日活动记录至少持续一周，每过&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;15&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;分钟填写一次，这作为有效时间分析的基础是必要的。这种活动至少每半年应该重复一次，以免回复低劣的时间管理方式。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-size:180%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;4、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;预料。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;事先有所准备的活动一般来说比事后补救的活动更为有效。小洞不补，大洞吃苦。避免发生以外的最好办法就是预料可能发生的以外事件，并为其制订应急措施。我们假定，如果事情要出错，那就无法避免。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-size:180%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;5、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;计划。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;绝大多数难题都是由未经认真考虑的行动引起的。在制定有效的计划中每花费一小时，在实施计划中就可能节省&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;3-4&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;小时，并会得到更好的结果。如果你没有认真作计划，那么实际上你正计划着失败。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-size:180%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;6、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;每日计划。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;每日计划对于有效地利用个人时间是必不可少的，它应该于前一天下午或当天开始时制订出来，并与近期的目标和活动相一致。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-size:180%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;7、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;目标。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;较有效的结果一般是通过对既定目标的刻意追求来达到的，而不是依靠机会。目标管理的基本概念就来源于这个已被证实的原则。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-size:180%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;8、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;优先次序。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;应该按照优先次序对各项任务进行时间预算或分配。不同的是很多管理人员花费时间的数量往往与他们任务的重要性成反比。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-size:180%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;9、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;最后时限。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;给自己规定最后时限并实行自我约束，持之以恒就能帮助管理者克服优柔寡断、犹豫不决和拖延的弊病。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-size:180%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;10、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;集中。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;在人们有组织的努力中，少数关键性的努力（大约&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;20&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;％）通常能够产生绝大多数结果（大约&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;80&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;％）。这条原则也称为“&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;20/80&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;定律”。有效的管理人员，总是把他们的努力集中在能够产生重大结果的那些“关键性的少数活动上”。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-size:180%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;11、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;效能与效率。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;假如执行的是错误任务的话，或者把任务放在错误的时间里去执行，以及毫无目的的行动，无论效率怎样高，最终都将导致无效的结果。效率可以理解为正确地做工作。效能可以理解为正确地做正确的工作。所谓有效的活动，就是指用最少的资源，包括时间，来得到最大的效果。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;12、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;活动与效果。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;管理人员往往忽视目标，或者忘记预期的效果，而把精力完全集中在活动上。终日忙忙碌碌渐渐成为他们的目标。这些管理人员趋向于活动型而不是效果型。他们不是去支配工作，而是往往被工作所左右。他们把动机误作成就，把活动误作效果。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;13、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;最佳效果。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;用最小的努力获得最大的收益，这就是最佳效果。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-size:180%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;14、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;不切实际的时间预算。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;管理人员往往对完成任务所需要的时间抱乐观态度。他们也往往希望别人能够更快地完成任务。所以有了墨菲的第二定律“每件事情做起来都比原来想象的要多花时间”。可见，管理人员更倾向于自己接受和期望别人做出不切实际的时间预算。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-size:180%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;15、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;实现的可能性。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;预期事件出现的可能性直接伴随实现它的有计划的努力而增加。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;16、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;紧急任务专制。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;管理人员常常处于紧急任务与重要任务互相推挤的状态中。紧急任务要求立即行动，就使得他们没有时间来考虑重要任务。管理人员就是这样不知不觉地被紧急任务所左右，并承受着时间的无休无止的重压，这使他们忽视了搁置重要任务所带来的更为严重的长期的后果。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-size:180%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;17、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;危机管理（反应过度）。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;管理人员往往低估问题，不善预料问题的复杂性，或者遇到所有问题都反应过度，彷佛碰到危机。这种危机管理和消防式工作的倾向往往造成过分忧虑，削弱判断力，导致仓促决策和浪费时间精力。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-size:180%;" &gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;18、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;选择忽略（有限反应）。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;对各种问题和需求的反应要切合实际，并要受制于情况的需要。有些问题如果你置之不理，他们消失了。通过有选择地忽略那些可以自行解决的问题，大量的时间和精力就可以保存起来，用于更有用的工作。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;19、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;机动性。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;安排个人时间的程度上应有机动性，以便于应付个人无法控制的力量。总之，时间安排不要过满，也不要过松。&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(51, 0, 51); font-family: arial;font-family:Impact ;" &gt;&lt;span style="font-size:180%;"&gt;&lt;span style="font-size: 12pt;"&gt;20、&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;问题分析。&lt;/span&gt;&lt;span style="font-size: 12pt;"&gt;不区分问题的原因和现象，结果必然丢失实质性问题，而把时间和精力耗费在表面问题上。&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-155725452057538714?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://school.para360.com/manage/time/2007114/3398.Html' title='必须了解的&quot;时间管理&quot;原则'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/155725452057538714/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=155725452057538714' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/155725452057538714'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/155725452057538714'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/04/blog-post.html' title='必须了解的&quot;时间管理&quot;原则'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-5905030226328176308</id><published>2008-04-07T21:45:00.002+08:00</published><updated>2008-04-07T22:12:38.516+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='IT'/><title type='text'>Intel Atom</title><content type='html'>当初 &lt;span style="font-style: italic;"&gt;Intel&lt;/span&gt; 在 2006年6月，果断地卖掉了移动处理器 &lt;a href="http://en.wikipedia.org/wiki/XScale"&gt;XScale&lt;/a&gt; 以及相关业务，就给人一种感觉—— &lt;span style="font-style: italic;"&gt;Intel&lt;/span&gt; 要有新的动作了！ 在蛰伏了一年零十个月之后 &lt;span style="font-style: italic;"&gt;Intel&lt;/span&gt; 带着 &lt;span style="font-style: italic;"&gt;Atom&lt;/span&gt;（原子）处理器， 又重新回到了手持移动计算领域！&lt;br /&gt;&lt;br /&gt;Atom 处理器与 &lt;span style="font-style: italic;"&gt;XScale &lt;/span&gt;处理器不同，&lt;span style="font-style: italic;"&gt;XScale&lt;/span&gt; 是一个基于&lt;a href="http://en.wikipedia.org/wiki/ARM_architecture"&gt;ARM&lt;/a&gt;5 的高端智能手机以及PDA的处理器，它是一颗基于ARM架构的RISC处理器&lt;span style="font-style: italic;"&gt;，&lt;/span&gt;在这单生意中 &lt;span style="font-style: italic;"&gt;&lt;span style="font-style: italic;"&gt;Intel&lt;/span&gt;&lt;/span&gt; 不过是一个购买了 &lt;a href="http://www.arm.com/"&gt;&lt;span style="font-style: italic;"&gt;ARM Ltd.&lt;/span&gt;&lt;/a&gt; 公司专利的生产商。而 &lt;span style="font-style: italic;"&gt;Atom &lt;/span&gt;的则是 Intel 自家的x86架构，在x86架构占据统治地位的PC领域，Intel可谓顺风顺水！这一次 Intel 利用自己 45nm的先进生产工艺， 把x86带入了 Mobile Internet Devices (MIDs) 领域。&lt;br /&gt;&lt;br /&gt;于此相呼应的， Microsoft 已经延长了 Windows XP 的支持时间到 2010年， 这纯粹是为了 x86 的 MID 设备加料啊~~~&lt;br /&gt;&lt;br /&gt;看看 Intel Atom 都带了些啥：&lt;br /&gt;&lt;br /&gt;• Supports Hyper-Threading Technology 2-threads&lt;br /&gt;• Support for IA 32-bit architecture&lt;br /&gt;• Intel® Virtualization Technology (Intel® VT)&lt;br /&gt;• Intel® Streaming SIMD Extensions 2 and 3 (Intel® SSE2 and Intel® SSE3) and Supplemental Streaming SIMD Extensions 3 (SSSE3) support&lt;br /&gt;&lt;br /&gt;俨然是一个 Pentium4!&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-5905030226328176308?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.intel.com/technology/atom/' title='Intel Atom'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/5905030226328176308/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=5905030226328176308' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/5905030226328176308'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/5905030226328176308'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/04/intel-atom.html' title='Intel Atom'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-1480849322173699126</id><published>2008-04-02T14:56:00.004+08:00</published><updated>2008-04-02T15:03:10.234+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='network'/><title type='text'>Wireshark 1.0 released</title><content type='html'>In my mind, Wireshark ( and its predecessor -- Ethereal) kept in version 0.9x.x for a very long time.  Now the Wireshark v1.0 were release finally at Mar 31, 2008.  Check the &lt;a href="http://www.wireshark.org/news/20080331.html"&gt;http://www.wireshark.org/news/20080331.html&lt;/a&gt; for details.&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-1480849322173699126?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.wireshark.org/' title='Wireshark 1.0 released'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/1480849322173699126/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=1480849322173699126' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1480849322173699126'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1480849322173699126'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/04/wireshark-100-released.html' title='Wireshark 1.0 released'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-2872047891846519004</id><published>2008-01-08T22:30:00.000+08:00</published><updated>2008-01-08T22:36:00.158+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Database'/><title type='text'>Oracle Database PL/SQL User's Guide and Reference</title><content type='html'>非常不错的PL/SQL的介绍，文字虽然不多，但是足可以让你对PL/SQL的基本功能和语法有了大致的了解。抽象水平非常高啊~~~&lt;br /&gt;&lt;br /&gt;下回打印一份随身携带阅读！&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-2872047891846519004?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://download.oracle.com/docs/cd/B19306_01/appdev.102/b14261/overview.htm' title='Oracle Database PL/SQL User&apos;s Guide and Reference'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/2872047891846519004/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=2872047891846519004' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2872047891846519004'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2872047891846519004'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2008/01/oracle-database-plsql-users-guide-and.html' title='Oracle Database PL/SQL User&apos;s Guide and Reference'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-5915083478251666765</id><published>2007-07-13T14:37:00.000+08:00</published><updated>2007-07-13T14:41:14.216+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>The new life</title><content type='html'>Today it the second day for my enter the new company~~~&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-5915083478251666765?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/5915083478251666765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=5915083478251666765' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/5915083478251666765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/5915083478251666765'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2007/07/new-life.html' title='The new life'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-3336065176393433296</id><published>2007-06-21T13:52:00.000+08:00</published><updated>2007-06-21T13:59:21.082+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Installation Debian/Ubuntu over SSH</title><content type='html'>By using the &lt;a href="http://packages.debian.org/stable/admin/debootstrap"&gt;debootstrap&lt;/a&gt;, it is possible for us to install the Debian or Ubuntu inside an Linux machine without a booting from Floppy/CD/USB/Net. It is really funny.&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-3336065176393433296?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://wiki.ubuntu.org.cn/index.php?title=UbuntuHelp:Installation/OverSSH&amp;variant=zh-tw' title='Installation Debian/Ubuntu over SSH'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/3336065176393433296/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=3336065176393433296' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/3336065176393433296'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/3336065176393433296'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2007/06/installation-debianubuntu-over-ssh.html' title='Installation Debian/Ubuntu over SSH'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-8245036030901226173</id><published>2007-05-07T21:34:00.000+08:00</published><updated>2007-05-07T22:00:44.622+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='WEB'/><title type='text'>Yahoo! UI Library (YUI)</title><content type='html'>Yahoo! UI Library (YUI) an BSD licensed JavaScript UI library released by Yahoo!.&lt;br /&gt;&lt;br /&gt;I play with it for a while, at the first glance, it looks like a &lt;a href="http://dojotoolkit.org/"&gt;Dojo Toolkit&lt;/a&gt;. But unlike the Dojo, all the functions are very well documented with JSDoc. For all the sub-modules, full/debug/min versions are provided for purposes. But it only provides a subset features of Dojo. :)&lt;br /&gt;&lt;br /&gt;So YUI is:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Well documented;&lt;/li&gt;&lt;li&gt;Well organized object hierarchy;&lt;/li&gt;&lt;li&gt;Less features&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-8245036030901226173?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://developer.yahoo.com/yui/' title='Yahoo! UI Library (YUI)'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/8245036030901226173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=8245036030901226173' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/8245036030901226173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/8245036030901226173'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2007/05/yahoo-ui-library-yui.html' title='Yahoo! UI Library (YUI)'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-6258403715611933073</id><published>2007-05-06T23:12:00.000+08:00</published><updated>2007-05-06T23:32:49.580+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Perl'/><title type='text'>Perl 5.8 PerlIO feature</title><content type='html'>With the new PerlIO feature and Unicode support in Perl 5.8, it is possible to do the internal encoding change with only a few lines of code.&lt;br /&gt;&lt;br /&gt;Please check the code below. It will be able to read the GBK input from STDIN and convert it to UTF-8 to STDOUT.  :)&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;#!/usr/bin/perl -W&lt;br /&gt;&lt;br /&gt;use encoding "gbk", STDOUT =&gt; "utf8";&lt;br /&gt;while(&lt;&gt;){print};&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;Power and Simple.  :D&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-6258403715611933073?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://perldoc.perl.org/encoding.html' title='Perl 5.8 PerlIO feature'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/6258403715611933073/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=6258403715611933073' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6258403715611933073'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6258403715611933073'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2007/05/perl-58-encoding-perlio-feature.html' title='Perl 5.8 PerlIO feature'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-8029609094422756369</id><published>2007-05-06T23:06:00.000+08:00</published><updated>2007-05-06T23:09:17.642+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>又长了一岁~~~</title><content type='html'>又长了一岁，为自己庆祝一下！ :D&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-8029609094422756369?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/8029609094422756369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=8029609094422756369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/8029609094422756369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/8029609094422756369'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2007/05/blog-post.html' title='又长了一岁~~~'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-7401598508682885769</id><published>2007-04-09T22:26:00.000+08:00</published><updated>2007-04-09T22:42:18.464+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>Waltzing with Bears</title><content type='html'>最近每天坐在城铁上，就会翻看几页 《与熊共舞》 其中第14章，&lt;span style="font-style: italic;"&gt;风险发现的详细过程&lt;/span&gt; ，里面对企业里使人们对风险三缄其口的原因。 说起来这确实是很普遍存在的。&lt;br /&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;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;/ol&gt;说起来大致如此......&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-7401598508682885769?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.systemsguild.com/GuildSite/DandL/WWB.html' title='Waltzing with Bears'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/7401598508682885769/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=7401598508682885769' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7401598508682885769'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7401598508682885769'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2007/04/waltzing-with-bears.html' title='Waltzing with Bears'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-8325145736272707417</id><published>2007-02-28T13:15:00.000+08:00</published><updated>2007-02-28T14:17:04.673+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>Erlang 的运行时更新</title><content type='html'>Erlang 作为电信级开发语言，在设计之初就有了在运行时自动更新程序，也就是不停机打patch的能力。 首先这种功能对于电信级别的程序来说，是非常必要的，如果不能做到这个5个9基本上就是空谈了。&lt;br /&gt;&lt;br /&gt;然而对于传统的使用C/C++或者Java开发的程序而言，全面支持这种能力是非常复杂的，这种复杂性主要是有由于C/C++ 语言的自身特性所决定的。由C语言开发的程序的运行态，在地址空间中一般都具有4个以上的sections:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;text/代码段 就是程序本身&lt;/li&gt;&lt;li&gt;data/数据段 用来保存全局变量，静态变量，以及未初始化的变量；&lt;/li&gt;&lt;li&gt;stack/程序堆栈 用来保存当前线程的临时变量 对于C/C++ 来说它保存了程序的运行状态；&lt;/li&gt;&lt;li&gt;heap/堆  用来保存程序运行中分配的临时变量；&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;text 在连接程序完成之后就确定的，对于同一份源程序产生的都是完全一样的。&lt;br /&gt;data 在程序的连接完成之后，它在内存中的位置也已经确定，但是内容可能会随运行态改变。&lt;br /&gt;stack 和 heap 则是完全动态的，而一个运行程序的stack数量和他所具有的thread数量相对应。基本上可以认为这两个段不能够采用认可以预定义——简单替换的方式进行更新，它们的内容对于非运行系统而言是不可知的。&lt;br /&gt;&lt;br /&gt;因此为一个处在正在运行中的应用打补丁，需要：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;不改变text代码段中的函数的入口地址。因为在stack中会保存这些函数的入口地址，如果改变了它们的地址，必将导致程序跑飞。&lt;/li&gt;&lt;li&gt;不能改变text代码段中所有已有函数的参数或者调用方式。&lt;br /&gt;&lt;/li&gt;&lt;li&gt;不能在中间增加数据段中全局变量。因为这将改变已有的全局变量的地址，使代码引用错误的变量。&lt;/li&gt;&lt;li&gt;不能简单替换数据段中的变量内容，即不能随意修改源程序中非const全局变量的内容。&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;然而对于C/C++程序而言，如果需要不停机打patch，这是最基本的要求。而在实际工作中，很难要求所有的fix都满足上面的要求!  其实也能做，但是代价太高了~~~。&lt;br /&gt;&lt;br /&gt;Erlang 只有代码段，没有数据段，所有数据都动态，实现这样的功能确实要简单很多。而且 Erlang 又是已虚拟机的方式运行，替换代码段的难度又有所降低。&lt;br /&gt;&lt;br /&gt;对于 Erlang 而言，运行时程序更新，这样的功能就算是水到渠成吧！&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-8325145736272707417?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://211.90.241.130:22366/view.asp?file=116' title='Erlang 的运行时更新'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/8325145736272707417/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=8325145736272707417' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/8325145736272707417'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/8325145736272707417'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2007/02/erlang_28.html' title='Erlang 的运行时更新'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-7143774682530004604</id><published>2007-02-11T20:04:00.000+08:00</published><updated>2007-02-11T22:00:55.597+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Erlang'/><title type='text'>关于 Erlang</title><content type='html'>在国内小程序员的圈子里，高水平的不多，但是跟风的水平还是不低的，C/C++, VB, Delphi, Java, C#, Perl, Python, PHP, Lua, JavaScript, Rudy, Haskell, Erlang...... 随风而来。不才也跟了一把风 Erlang 了一把！ 说起这个 Erlang 真正令我感兴趣的地方是——它是由 Ericsson 开发出来的用于电信级应用程序开发的语言。说来惭愧现在也算是在电信圈子里面（当然不在Ericsson） 讨生活的菜鸟吧！  不由自主地对别人如何做同样的东西有兴趣。 算起来也在上面画了N个小时了，有点感受也记录下来总也不算是枉费了这些时间。&lt;br /&gt;  &lt;br /&gt;首先，&lt;a href="http://www.erlang.org/faq/x1138.html#AEN1144"&gt;Erlang 诞生于于1980年代，在 Ericsson Computer Science Laboratory&lt;/a&gt;，虽然没有官方的说明，当时我个人感觉，Erlang的根本源于LISP，虽然语法上作了一些变化，但是语言的本质上确是不可回避的LISP风骨：函数语言，自动内存管理，原子概念，LIST/表操作，不一而足，虽然从语法上作了一些改变，摒弃了繁复的"()", 引入了 &lt;code&gt;"-&gt;", ",", ";", "." &lt;/code&gt; 这样只是更加突出了函数的定义和使用时的方便性。 &lt;br /&gt;&lt;br /&gt;其次，为了函数语言能够在工程实践中具有实际应用，Erlang在语言层次上引入了许多辅助的功能。1）Erlang从语法层次上定义了一种引入副作用（side effect）的方法进程间消息的发送—— &lt;code&gt;Pid ! Message &lt;/code&gt;, 与接收 &lt;code&gt;Receive&lt;/code&gt;。这与 Erlang 虚拟机的轻量级进程相结合，无疑是提供了一个颇具工程价值的强悍的函数式语言；2）引入的模块(module)，函数输出/输入定义(export/import)，引入宏； 3）增强的 Term 匹配； 4)引入异常处理机制(try/catch)，5）引入 tuple 以及 record 数据类型。 &lt;br /&gt;不过坦白的讲，除了第一点进程间消息的发送与接受具有些实质上的意义之外，异常及其处理机制，tuple数据类型，感觉上却有些画蛇添足之感，这些变化只是让程序设计的复杂性有所增加，并没有什么实质性的提高。&lt;br /&gt;特别是异常这样的东西，很有可能是受了这些年 C++/Java语言的毒害吧，就结构化程序而言，我们还可以异常可以简化程序的正常流程，增加可读性。可是对于函数式语言除了需要多些try/catch这样的另类语法，我们又得到了什么呢？赫赫，只能是仁者见仁智者见智了！&lt;br /&gt;&lt;br /&gt;还有，Erlang/OTP 为程序开发人员提供了一个相当完善的，可以李可使用的程序库 OTP。在当前的这个软件开发时代。一个高质量，高易用性的 library 对于语言的发展有着非常大的推动作用，Java语言，也正是凭借着功能丰富，充分文档化的Java API在当今程序设计领域占据着重要地位的。对于一个电信设备专用语言而言，OTP已经为我们提供了，SNMP Agent, CORBA, CORBA IDL, CORBA Event, 数据库。确实极大的方便了设备开发人员的工作。&lt;br /&gt;&lt;br /&gt;再就是 Erlang 的 &lt;a href="http://www.erlang.org/faq/x1138.html#SOFT-REALTIME"&gt;soft real-time&lt;/a&gt; 特性。 以及 Erlang 的虚拟机。基本上可以认为Erlang编译出来的程序式平台无关的, Erlang设计的程序可以运行在Linux/Windows/Solaris平台。 这样就可以构造 Linux + Erlang 德超强组合。也算是开拓了电信设备设计的一种新思路吧！&lt;br /&gt;&lt;br /&gt;Ericsson 会把这样的东西放出来还真是很有意思的，就如同在 Erlang 的 &lt;a href="http://www.erlang.org/faq/x1138.html#AEN1152"&gt;FAQ&lt;/a&gt; 中写的&lt;br /&gt;&lt;quote&gt;&lt;br /&gt;10.4. Why is Ericsson giving away Erlang?&lt;br /&gt;(The following is my personal impression. I don't speak for Ericsson!)&lt;br /&gt;&lt;br /&gt;Nothing to lose: Ericsson's core business is telecommunications products, selling programming tools is not really a business Ericsson is interested in.&lt;br /&gt;&lt;br /&gt;Stimulate adoption: Erlang is a great language for many sorts of systems. Releasing a good, free development environment is likely to make Erlang catch on faster.&lt;br /&gt;&lt;br /&gt;Generate goodwill: Giving away cool software can only improve Ericsson's image, especially given the current level of media attention around "open software". &lt;br /&gt;&lt;/quote&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-7143774682530004604?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.erlang.org/' title='关于 Erlang'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/7143774682530004604/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=7143774682530004604' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7143774682530004604'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7143774682530004604'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2007/02/erlang.html' title='关于 Erlang'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-6904281520141623523</id><published>2007-02-03T20:33:00.000+08:00</published><updated>2007-02-03T20:53:19.210+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='LISP'/><title type='text'>Common Lisp HyperSpec</title><content type='html'>曾经在研究生阶段上过一门计算机系开设的人工智能基础的课程。&lt;br /&gt;在课程的最后还用clisp完成了一个寻找最佳乘车路线的程序作为课程设计。&lt;br /&gt;当时对clisp真的没什么感觉，就是一堆的括号 (((((...).(...)))))&lt;br /&gt;CLISP 就是 Common List 是 ANSI X3J13 标准化之后的Lisp语言&lt;br /&gt;这也算是我对Lisp的一点儿初步的认识吧！&lt;br /&gt;&lt;br /&gt;说起来 LISP 也算是自成一派的人工智能语言， 函数语言的基础。&lt;a href="http://daiyuwen.freeshell.org/gb/rol/roots_of_lisp.html"&gt;&lt;br /&gt;Lisp之根源中文版&lt;/a&gt;，以及&lt;a href="http://www.paulgraham.com/rootsoflisp.html"&gt;英文原版 The Root of Lisp&lt;/a&gt; 可以算是Lisp入门必读了吧！&lt;br /&gt;&lt;br /&gt;看到Lisp就会感觉到人类智慧的伟大！ &lt;br /&gt;于lisp相比 XML就有点儿太丑陋了！&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-6904281520141623523?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.lisp.org/HyperSpec/FrontMatter/Chapter-Index.html' title='Common Lisp HyperSpec'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/6904281520141623523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=6904281520141623523' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6904281520141623523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6904281520141623523'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2007/02/common-lisp-hyperspec.html' title='Common Lisp HyperSpec'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-2812990060539575880</id><published>2007-01-31T21:45:00.000+08:00</published><updated>2007-02-03T20:32:46.065+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>Bash新手指南</title><content type='html'>今天又看到了 BASH 的新手指南，网络上中文的东西越来越多了！&lt;br /&gt;只不过又是翻译作品，希望今后有越来越多的中文原创！&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-2812990060539575880?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://xiaowang.net/bgb-cn/index.html' title='Bash新手指南'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/2812990060539575880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=2812990060539575880' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2812990060539575880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2812990060539575880'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2007/01/bash.html' title='Bash新手指南'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-2070249089773644934</id><published>2007-01-30T21:15:00.000+08:00</published><updated>2007-01-30T21:19:19.317+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><title type='text'>VIM syntax for JavaScript 0.7.2 released</title><content type='html'>Today I do update the JavaScript syntax script for VIM to 0.7.2. &lt;br /&gt;&lt;br /&gt;Until now PRC 2007.01.30-21:37 my script got: &lt;br /&gt;Rating 332/99, Downloaded by 1684&lt;br /&gt;&lt;br /&gt;I do like more feature, but I like the accuracy much more. :D&lt;br /&gt;Without the context based parser, it can't highlight the JavaScript properly.&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-2070249089773644934?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.vim.org/scripts/script.php?script_id=1491' title='VIM syntax for JavaScript 0.7.2 released'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/2070249089773644934/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=2070249089773644934' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2070249089773644934'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2070249089773644934'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2007/01/vim-syntax-for-javascript-072-released.html' title='VIM syntax for JavaScript 0.7.2 released'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-2745921063293892961</id><published>2007-01-17T19:26:00.000+08:00</published><updated>2007-01-17T20:42:20.997+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Develop'/><category scheme='http://www.blogger.com/atom/ns#' term='Windows'/><title type='text'>Hack the IDLE.DLL of Yahoo Messenger</title><content type='html'>Yahoo Messenger is very nice IM software. But it used the very old window HOOK functions to detect the user idle time through IDLE.DLL. The idle.dll is a 6k DLL file which created with Microsoft VC 7.1 and linked with MSVCR71.DLL. In this way, the IDLE.DLL will be injected to all the user applications, and hook the message queue of all applications, and it will also injects the MSVCR71.DLL into the user applications. Please refer MSDN for details about the &lt;a href="http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/hooks/hookreference/hookfunctions/setwindowshookex.asp"&gt;Windows HOOK function&lt;/a&gt;. &lt;br /&gt;&lt;br /&gt;Yahoo Messenger 是一个很不错的IM软件。但是它是用了一个非常陈旧的Windows Hook功能,因此制造了一个idle.dll 用来来检测用户的发呆时间。这个IDLE.DLL 文件看起来并不大，只有6k，其实它是一个用VC7.1编译产生的动态链接库并且动态链接到MSVCR71.DLL。 由于HOOK函数需要把 IDLE.DLL 注入到所有的用户程序中，MSVCR71.DLL 也会被注入到所有的用户程序中。 而且这个IDLE.DLL 会进入所有用户程序的消息循环。在所有的程序中都有这个 idle.dll 实在是让人不爽。 ;)&lt;br /&gt;&lt;br /&gt;Let's check the IDLE.DLL&lt;br /&gt;下面就让我们看看这 IDLE.DLL&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;C:\Program Files\Yahoo!\Messenger&gt;dumpbin /exports idle.dll&lt;br /&gt;Microsoft (R) COFF/PE Dumper Version 8.00.50727.42&lt;br /&gt;Copyright (C) Microsoft Corporation.  All rights reserved.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Dump of file idle.dll&lt;br /&gt;&lt;br /&gt;File Type: DLL&lt;br /&gt;&lt;br /&gt;Section contains the following exports for idle.dll&lt;br /&gt;&lt;br /&gt;  00000000 characteristics&lt;br /&gt;  450867C8 time date stamp Thu Sep 14 04:19:20 2006&lt;br /&gt;      0.00 version&lt;br /&gt;         1 ordinal base&lt;br /&gt;         3 number of functions&lt;br /&gt;         3 number of names&lt;br /&gt;&lt;br /&gt;  ordinal hint RVA      name&lt;br /&gt;&lt;br /&gt;        1    0 00001016 ?IdleUIGetLastInputTime@@YAKXZ&lt;br /&gt;        2    1 000010C3 ?IdleUIInit@@YAHXZ&lt;br /&gt;        3    2 0000111C ?IdleUITerm@@YAXXZ&lt;br /&gt;&lt;br /&gt;Summary&lt;br /&gt;&lt;br /&gt;      1000 .data&lt;br /&gt;      1000 .rdata&lt;br /&gt;      1000 .reloc&lt;br /&gt;      1000 .rsrc&lt;br /&gt;      1000 .text&lt;br /&gt;      1000 Y_IDLE&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;It has 3 C++ functions defined, and a customized data section "Y_IDLE", I think it is the shared data section which used to store the latest user active time stamp. While what's the function protocol for these 3 function? I found a very good documentation for the C++ name mangling of different compilers at URL http://www.agner.org/optimize/ &lt;a href="http://www.agner.org/optimize/calling_conventions.pdf"&gt;Calling conventions for different C++ compilers and operating systems&lt;/a&gt;&lt;br /&gt;它定义了三个输出函数，同时自定义了一个程序段 Y_IDLE 相比这应该是一个数据段，用来记录从各个应用程序收集到的最新的用户消息发出的时间。 而这三个函数应该是用C++的命名规则输出的，但是这三个函数的原型是什么呢？幸好发现了一个非常好的文档，详细地描述了各种编译器的 C++ name mangling 也就是符号标的转换规则。参见 http://www.agner.org/optimize/ &lt;a href="http://www.agner.org/optimize/calling_conventions.pdf"&gt;Calling conventions for different C++ compilers and operating systems&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;In fact, from the Windows 2000, WIN_VER&gt;=0x500 there is a new function GetLastInputInfo in user32.dll, it will provide the Last user input time stamp quickly.&lt;br /&gt;其实从Window2000开始，微软在 User32.dll 就提供了一个新的函数 GetLastInputInfo 它就可以用来返回用户的最后输入的时间。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/**&lt;br /&gt; * This is used to hack the Yahoo Messenger.&lt;br /&gt; * compiled with VC7.1 as:&lt;br /&gt; *  cl -W3 -O1sy -LD -MD -D_WIN32_WINNT=0x0500 idle.cpp -Feidle.dll User32.lib&lt;br /&gt; */&lt;br /&gt;&lt;br /&gt;#include &lt;windows.h&gt;&lt;br /&gt;&lt;br /&gt;#pragma section("Y_IDLE",read,write)&lt;br /&gt;__declspec(allocate("Y_IDLE"))&lt;br /&gt;int Y_IDLE = 0;&lt;br /&gt;&lt;br /&gt;#define DllExport   __declspec( dllexport )&lt;br /&gt;&lt;br /&gt;DllExport DWORD IdleUIGetLastInputTime() &lt;br /&gt;{&lt;br /&gt;    LASTINPUTINFO lii; &lt;br /&gt;    lii.cbSize = sizeof(lii);&lt;br /&gt;    GetLastInputInfo(&amp;lii);&lt;br /&gt;    return lii.dwTime;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;DllExport INT IdleUIInit() &lt;br /&gt;{&lt;br /&gt;    return TRUE;&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;DllExport VOID IdleUITerm() &lt;br /&gt;{&lt;br /&gt;    return;   &lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;This will be able to create a new IDLE.DLL&lt;br /&gt;这样就可以知道一个新的 idle.dll , 而且它也再也不会被注入到其他的程序中了。&lt;br /&gt;替换原来的 IDLE.DLL 还真不错~~~~ 工作正常。&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;写在后面&lt;/h2&gt;&lt;br /&gt;在找到 IDLE.DLL 输出函数的原型还真花了些时间。后来才发现其实微软已经给我们提供了一个很方便的工具，那就是随Platform SDK 分发的 Dependency Walker (depends.exe) 里面有一个 Undecorate C++ functions 的功能，我们只需要用Dependency Walker 打开 IDLE.DLL 就可以看到输出函数的原型了。 &lt;br /&gt;&lt;br /&gt;&lt;br /&gt;其实&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-2745921063293892961?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.agner.org/optimize/' title='Hack the IDLE.DLL of Yahoo Messenger'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/2745921063293892961/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=2745921063293892961' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2745921063293892961'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/2745921063293892961'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2007/01/hack-idledll-of-yahoo-messenger.html' title='Hack the IDLE.DLL of Yahoo Messenger'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-6568370513063172686</id><published>2006-12-25T11:12:00.000+08:00</published><updated>2006-12-25T13:26:25.815+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CXX'/><title type='text'>最简化的Nmake Makefile</title><content type='html'>&lt;pre&gt;&lt;br /&gt;!include &amp;lt;win32.mak&amp;gt; &lt;br /&gt;&lt;br /&gt;## Link with MSVCRT and MSVCP&lt;br /&gt;#.cpp.exe:&lt;br /&gt;#    cl -nologo -MD -W3 -O1y -EHsc -I. $**&lt;br /&gt;&lt;br /&gt;.cpp.exe:&lt;br /&gt;    cl -nologo -W3 -O1y -EHsc -I. $**&lt;br /&gt;&lt;br /&gt;clean:&lt;br /&gt;    del /q /f *.exe *.obj&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-6568370513063172686?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://msdn2.microsoft.com/zh-cn/library/dd9y37ha(VS.80).aspx' title='最简化的Nmake Makefile'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/6568370513063172686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=6568370513063172686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6568370513063172686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6568370513063172686'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2006/12/nmake-makefile.html' title='最简化的Nmake Makefile'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-8112186494077617523</id><published>2006-12-25T11:04:00.000+08:00</published><updated>2006-12-25T13:26:47.420+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='CXX'/><title type='text'>最简化的GNUMakefile</title><content type='html'>&lt;pre&gt;&lt;br /&gt;## GNU Makefile with MinGW/MSYS&lt;br /&gt;## MinGW 下面简化的Makefile 需要 MSYS&lt;br /&gt;## It can be invoked like `mingw32-make hello.exe`&lt;br /&gt;## This will compile the hello.cpp to hello.exe&lt;br /&gt;&lt;br /&gt;CXXFLAGS=-I. -O3&lt;br /&gt;&lt;br /&gt;## 没有下面这条指令, 后缀通配指令不能识别 .cpp.exe&lt;br /&gt;.SUFFIXES: .exe&lt;br /&gt;&lt;br /&gt;.cpp.exe:&lt;br /&gt;    g++ -Wall $(CXXFLAGS) -o $@ $&lt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;.PHONY : clean&lt;br /&gt;clean:&lt;br /&gt;    rm -f *.exe *.obj *.o&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-8112186494077617523?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.gnu.org/software/make/manual/make.html' title='最简化的GNUMakefile'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/8112186494077617523/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=8112186494077617523' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/8112186494077617523'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/8112186494077617523'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2006/12/gnumakefile.html' title='最简化的GNUMakefile'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-5974410621873444204</id><published>2006-12-09T22:25:00.000+08:00</published><updated>2006-12-09T22:27:50.939+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GOOGLE'/><title type='text'>到这里都一年了~~~</title><content type='html'>算起来到这里已经一年多了， 中间断断续续当然了也包括一些可观的原因，一共也没有放多少东西上来。&lt;br /&gt;总算还有两片篇幅较长的原创，也算是聊以自慰了。&lt;br /&gt;&lt;br /&gt;再接再厉好了！希望自己能够百尺竿头更进一步~~~&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-5974410621873444204?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/5974410621873444204/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=5974410621873444204' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/5974410621873444204'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/5974410621873444204'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2006/12/blog-post.html' title='到这里都一年了~~~'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-7285916963045439087</id><published>2006-12-01T22:00:00.000+08:00</published><updated>2006-12-25T13:28:36.663+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mozilla'/><title type='text'>"Hello World" XUL application with XULRunner</title><content type='html'>Today, I do spend some hours with the &lt;a href="http://developer.mozilla.org/en/docs/XULRunner" title="XULRunner"&gt;XULRunner&lt;/a&gt; -- a Mozilla runtime package which can be used to bootstrap XUL+XPCOM applications that are as rich as Firefox and Thunderbird. I will create a "Hello World" XUL application step by step, just to remind myself. I will be very glad if it is also helpful for you. :)&lt;br /&gt;今天，闲暇无事，花了几个小时玩耍了一下 &lt;a href="http://developer.mozilla.org/en/docs/XULRunner" title="XULRunner"&gt;XULRunner&lt;/a&gt; -- 一个 Mozill 运行库，以及 XUL+XPCOM 应用程序的启动器，利用它可以构建 Firefox 和 Thunderbird 一样的应用程序。我用它写了一个简单的 "Hello World" XUL 应用程序，在这里我把程序创建的过程一步一步地记录下来，主要是对自己的学习做一个笔记。希望它也能对其他人有所帮助。&lt;br /&gt;&lt;h2&gt;   About XULRunner &lt;/h2&gt; &lt;b&gt;XULRunner&lt;/b&gt; is a Mozilla runtime package that can be used to bootstrap XUL+XPCOM applications that are as rich as Firefox and Thunderbird. It will provide mechanisms for installing, upgrading, and uninstalling these applications. XULRunner will also provide libxul, a solution which allows the embedding of Mozilla technologies in other projects and products. [Ref: http://developer.mozilla.org/en/docs/XULRunner]&lt;br /&gt;&lt;a href="http://developer.mozilla.org/en/docs/XULRunner:What_XULRunner_Provides" title="Main features"&gt;Main features&lt;/a&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;     &lt;a href="http://developer.mozilla.org/en/docs/XPCOM" title="XPCOM"&gt;XPCOM&lt;/a&gt;&lt;/li&gt;&lt;li&gt;     Networking&lt;/li&gt;&lt;li&gt;     Gecko rendering engine&lt;/li&gt;&lt;li&gt;     DOM editing and transaction support (no UI)&lt;/li&gt;&lt;li&gt;     Cryptography&lt;/li&gt;&lt;li&gt;     &lt;a href="http://developer.mozilla.org/en/docs/XBL" title="XBL"&gt;XBL&lt;/a&gt; (XBL2     planned)&lt;/li&gt;&lt;li&gt;     &lt;a href="http://developer.mozilla.org/en/docs/XUL" title="XUL"&gt;XUL&lt;/a&gt;&lt;/li&gt;&lt;li&gt;     &lt;a href="http://developer.mozilla.org/en/docs/SVG" title="SVG"&gt;SVG&lt;/a&gt;&lt;/li&gt;&lt;li&gt;     &lt;a href="http://developer.mozilla.org/en/docs/XSLT" title="XSLT"&gt;XSLT&lt;/a&gt;&lt;/li&gt;&lt;li&gt;     XML Extras (&lt;code&gt;&lt;a href="http://developer.mozilla.org/en/docs/XMLHttpRequest" title="XMLHttpRequest"&gt;XMLHttpRequest&lt;/a&gt;&lt;/code&gt;, &lt;code&gt;&lt;a href="http://developer.mozilla.org/en/docs/DOMParser" title="DOMParser"&gt;DOMParser&lt;/a&gt;&lt;/code&gt;, etc.)&lt;/li&gt;&lt;li&gt;     Web Services (SOAP)&lt;/li&gt;&lt;li&gt;     Auto-update support &lt;i&gt;(not yet complete)&lt;/i&gt;&lt;/li&gt;&lt;li&gt;     Type ahead find toolbar&lt;/li&gt;&lt;li&gt;     History implementation (the places implementation in the 1.9 cycle)&lt;/li&gt;&lt;li&gt;     Accessibility support&lt;/li&gt;&lt;li&gt;     IPC services for communication between gecko-based apps &lt;i&gt;(not yet     complete)&lt;/i&gt;&lt;/li&gt;&lt;li&gt;     &lt;a href="http://developer.mozilla.org/en/docs/Storage" title="Storage"&gt;Storage&lt;/a&gt;/sqlite     interfaces &lt;i&gt;(not yet turned on by default)&lt;/i&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;h2&gt;   Installation &lt;/h2&gt; For current 1.8.0.x release, XULRunner only available in ZIP format, you can download it and unzip at any place you want.&lt;br /&gt;Refer: &lt;a href="http://developer.mozilla.org/en/docs/XULRunner:Deploying_XULRunner_1.8" title="http://developer.mozilla.org/en/docs/XULRunner:Deploying_XULRunner_1.8"&gt;http://developer.mozilla.org/en/docs/XULRunner:Deploying_XULRunner_1.8&lt;/a&gt; &lt;h2&gt;   Skeletons of a XUL Application &lt;/h2&gt; I name my "Hello World" application as HelloWorldApp or helloworldapp,&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;/&lt;em&gt;HelloWorldApp&lt;/em&gt;&lt;br /&gt;/chrome&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;      - &lt;/span&gt;&lt;em style="color: rgb(255, 0, 0);"&gt;app files ...&lt;/em&gt;&lt;br /&gt;    chrome.manifest&lt;br /&gt;/defaults&lt;br /&gt;   /preferences&lt;br /&gt;      prefs.js&lt;br /&gt;application.ini&lt;/pre&gt; All the folders/files are necessary for a XUL application, "app files..." will be variant, it depends on your application itself.&lt;br /&gt;&lt;h2&gt;   Define the XUL application.ini &lt;/h2&gt; This is the application.ini of the helloworldapp:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;[App]&lt;br /&gt;; This field specifies your organization's name.  This field is recommended,&lt;br /&gt;; but optional.&lt;br /&gt;Vendor=MozillaTest&lt;br /&gt;;&lt;br /&gt;; This field specifies your application's name.  This field is required.&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);"&gt;Name&lt;/span&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;=&lt;span style="font-style: italic;"&gt;HelloWorldApp&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;;&lt;br /&gt;; This field specifies your application's version.  This field is optional.&lt;br /&gt;Version=0.0.1&lt;br /&gt;;&lt;br /&gt;; This field specifies your application's build ID (timestamp).&lt;br /&gt;; This field is required.&lt;br /&gt;BuildID=20061030&lt;br /&gt;;&lt;br /&gt;; This field specifies a compact copyright notice for your application.  This&lt;br /&gt;; field is optional.&lt;br /&gt;Copyright=Copyright (c) 2004 Mozilla.org&lt;br /&gt;;&lt;br /&gt;; This ID is just an example.  Every XUL app ought to have it's own unique ID.&lt;br /&gt;; You can use the microsoft "guidgen" or "uuidgen" tools, or go on&lt;br /&gt;; irc.mozilla.org and /msg botbot uuid.  This field is optional.&lt;br /&gt;ID={CAB1E5C0-1E38-44c3-B153-754AD72E898B}&lt;br /&gt;&lt;br /&gt;[Gecko]&lt;br /&gt;;&lt;br /&gt;; This field is required.  It specifies the minimum Gecko version that this&lt;br /&gt;; application requires.&lt;br /&gt;MinVersion=1.8&lt;br /&gt;;&lt;br /&gt;; This field is optional.  It specifies the maximum Gecko version that this&lt;br /&gt;; application requires.  It should be specified if your application uses&lt;br /&gt;; unfrozen interfaces.&lt;br /&gt;MaxVersion=1.9&lt;br /&gt;&lt;/pre&gt; &lt;br /&gt;You must specify the [App] name. It will be used for XULRunner to find the relevant prefs.js .&lt;br /&gt;App::name 必须要指定，因为它将影响 XULRunner 如何读取 prefs.js 。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;   Define the prefs.js (helloworldapp-prefs.js) / 定义应用程序的 Preferences.&lt;br /&gt;&lt;/h2&gt; After the application.ini is defined, it is necessary to have a &lt;appname&gt;-prefs.js under ${APP_ROOT}/defaults/preferences&lt;br /&gt;Here is the helloworldapp-prefs.js&lt;br /&gt;定义了 application.ini 之后， 下一步就是指定 &lt;appname&gt;-prefs.js ， 在这里我们的 &lt;appname&gt; 是 helloworldapp, 因此我们需要在 ${APP_ROOT}/defaults/preferences目录下面建一个 helloworldapp-prefs.js JavaScript 文件，文件的内容如下： &lt;/appname&gt;&lt;/appname&gt;&lt;/appname&gt;&lt;pre style="border: thin solid black; padding: 6px; width: 700px;"&gt;pref("&lt;span style="font-weight: bold;"&gt;toolkit.defaultChromeURI&lt;/span&gt;", "&lt;span style="font-weight: bold;"&gt;chrome://helloworldapp/content/helloworld.xul&lt;/span&gt;");&lt;br /&gt;pref("general.useragent.extra.helloworldapp", "HelloWorld/0.1");&lt;/pre&gt; It define "toolkit.defaultChromeURI" to "chrome://helloworldapp/content/helloworld.xul" .&lt;br /&gt;其中最主要的部分就是定义了，"toolkit.defaultChromeURI" ， 它就是 XUL 程序的缺省启动页面。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;   Setting up chrome.manifest / 设定 chrome.manifest&lt;br /&gt;&lt;/h2&gt; &lt;p&gt;   This file performs the mapping between a   &lt;span style="font-weight: bold;"&gt;chrome://&lt;/span&gt; url and your application   files: &lt;/p&gt; &lt;p&gt;   这个文件主要用来实现 XUL 程序中使用的 chrome:// scheme 和你自己编写的应用程序文件的对应。 &lt;/p&gt;&lt;br /&gt;&lt;p&gt;   This is the chrome.manifest of "Hello World" application.&lt;br /&gt;&lt;/p&gt; &lt;p&gt;   Hello World 程序的 chrome.manifest 文件的内容如下：&lt;br /&gt;&lt;/p&gt; &lt;pre style="border: thin solid black; padding: 6px; width: 700px;"&gt;content &lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;helloworldapp &lt;/span&gt;file:&lt;span style="color: rgb(204, 0, 0);"&gt;helloworldapp&lt;/span&gt;/&lt;br /&gt;&lt;/pre&gt;This institution tells XULRunner to look at &lt;span style="font-style: italic;"&gt;${APP_ROOT}/chrome/hellowworldapp&lt;/span&gt;&lt;em&gt;&lt;/em&gt;/ when it encounters a chrome://&lt;em&gt;helloworldapp&lt;/em&gt;/content/ URI. The change of the application name and folder name will impact the URI looking up of XULRunner.&lt;br /&gt;通过这个指令，我们告诉 XULRunner，当程序中 URI 为 chrome:://helloworldapp/content/ 的时候，就到  &lt;span style="font-style: italic;"&gt;${APP_ROOT}/chrome/hellowworldapp&lt;/span&gt;&lt;em&gt;&lt;/em&gt;/ -- 应用程序的chrome目录下面的helloworldapp 目录下面去寻找相应的文件。 我们也可以相应的改变 上面的语句中的 application name 以及目录的名字，但是这个改变将影响 XULRunner 如何解释以 chrome:// 为类型的 URI 的定位。 进一步的内容可以参考 ITArt 同志的Blog &lt;a title="http://itart.wordpress.com/2005/12/05/mozext-ch3/" href="http://itart.wordpress.com/2005/12/05/mozext-ch3/"&gt;http://itart.wordpress.com/2005/12/05/mozext-ch3/&lt;/a&gt;  第3.6章。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Chromes / 全金属外壳&lt;br /&gt;&lt;/h2&gt;To make it easy for the development, we are using the plain folder/files for the chrome.&lt;br /&gt;为了方便进行开发和调试，在这直接使用文件和目录来保存 chrome 文件。&lt;br /&gt;&lt;br /&gt;&lt;p&gt;   Most XUL applications are distributed as a .jar file, rather than a   subfolder of chrome/ with all the files scattered about. When you do want to   deploy it as a jar: &lt;/p&gt; &lt;ol&gt;&lt;li&gt;     Zip up your /chrome/&lt;em&gt;applicationName&lt;/em&gt; folder, put the     &lt;em&gt;applicationName&lt;/em&gt;.zip in the /chrome directory.&lt;/li&gt;&lt;li&gt;     Rename &lt;em&gt;applicationName&lt;/em&gt;.zip to &lt;em&gt;applicationName&lt;/em&gt;.jar&lt;/li&gt;&lt;li&gt;     Change the &lt;code&gt;chrome.manifest&lt;/code&gt; to point to &lt;em&gt;applicationName&lt;/em&gt;.jar:     &lt;pre class="Code"&gt;content &lt;em&gt;applicationName&lt;/em&gt; jar:&lt;em&gt;applicationName&lt;/em&gt;.jar!/&lt;span style="font-family:Verdana;"&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/li&gt;&lt;/ol&gt; The "jar:" protocol tells XULRunner that this is a jar file. With "jar:filename.jar!/uri/folder/", XULRunner will look for the resource under the give folder "/uri/folder/" in the JAR file.&lt;br /&gt;"jar:" 协议，用来通知 XULRunner 所需要要得资源文件都被包裹在 JAR 文件中。"jar:filename.jar!/uri/folder/" 为 XULRunner 指名相应的资源需要去 filename.jar 文件的 /uri/folder/ 目录下面寻找。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Build the GUI with XUL / 使用XUL来构建 GUI &lt;/h2&gt;In the perfs.js, the toolkit.defaultChromeURI was defined as "chrome://helloworldapp/content/helloworld.xul", it will be the default GUI of this Hello World application.&lt;br /&gt;在 perfs.js 中， 我们将 toolkit.defaultChromeURI 定义为 "chrome://helloworldapp/content/helloworld.xul", 它就是我们这个Hello World 应用程序的缺省 GUI.&lt;br /&gt;&lt;br /&gt;The XULRunner looks up the URI -- "chrome://helloworldapp/content/helloworld.xul" at the ${APP_ROOT}/chrome/helloworld/helloworld.xul . So helloworld.xul will be the main GUI file.&lt;br /&gt;对于 URI -- "chrome://helloworldapp/content/helloworld.xul"， XULRunner 将会翻译成 ${APP_ROOT}/chrome/helloworld/helloworld.xul 并且试图使用这个XUL文件作为主 GUI 文件。&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;&amp;lt;?&lt;/font&gt;&lt;font color="#60ff60"&gt;xml&lt;/font&gt;&lt;font color="#60ff60"&gt; &lt;/font&gt;&lt;font color="#60ff60"&gt;version&lt;/font&gt;=&lt;font color="#ffa0a0"&gt;&amp;quot;1.0&amp;quot;&lt;/font&gt;&lt;font color="#80a0ff"&gt;?&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#80a0ff"&gt;&amp;lt;?&lt;/font&gt;&lt;font color="#60ff60"&gt;xml-stylesheet&lt;/font&gt;&lt;font color="#60ff60"&gt; &lt;/font&gt;&lt;font color="#60ff60"&gt;href&lt;/font&gt;=&lt;font color="#ffa0a0"&gt;&amp;quot;chrome://global/skin/&amp;quot;&lt;/font&gt;&lt;font color="#60ff60"&gt; &lt;/font&gt;&lt;font color="#60ff60"&gt;type&lt;/font&gt;=&lt;font color="#ffa0a0"&gt;&amp;quot;text/css&amp;quot;&lt;/font&gt;&lt;font color="#80a0ff"&gt;?&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;&lt;font color="#40ffff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#40ffff"&gt;window&lt;/font&gt;&lt;br /&gt;&lt;font color="#40ffff"&gt;  &lt;/font&gt;&lt;font color="#60ff60"&gt;id&lt;/font&gt;&lt;font color="#40ffff"&gt;     &lt;/font&gt;=&lt;font color="#40ffff"&gt; &lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;helloworldapp&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;font color="#40ffff"&gt;  &lt;/font&gt;&lt;font color="#60ff60"&gt;title&lt;/font&gt;&lt;font color="#40ffff"&gt;  &lt;/font&gt;=&lt;font color="#40ffff"&gt; &lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;Hello World!&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;font color="#40ffff"&gt;  &lt;/font&gt;&lt;font color="#60ff60"&gt;width&lt;/font&gt;&lt;font color="#40ffff"&gt;  &lt;/font&gt;=&lt;font color="#40ffff"&gt; &lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;300&amp;quot;&lt;/font&gt;&lt;font color="#40ffff"&gt; &lt;/font&gt;&lt;font color="#60ff60"&gt;height&lt;/font&gt;&lt;font color="#40ffff"&gt; &lt;/font&gt;=&lt;font color="#40ffff"&gt; &lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;200&amp;quot;&lt;/font&gt;&lt;br /&gt;&lt;font color="#40ffff"&gt;  &lt;/font&gt;&lt;font color="#60ff60"&gt;xmlns&lt;/font&gt;&lt;font color="#40ffff"&gt;  &lt;/font&gt;=&lt;font color="#40ffff"&gt; &lt;/font&gt;&lt;font color="#ffa0a0"&gt;&amp;quot;&lt;a href="http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul"&gt;http://www.mozilla.org/keymaster/gatekeeper/there.is.only.xul&lt;/a&gt;&amp;quot;&lt;/font&gt;&lt;font color="#40ffff"&gt;&amp;gt;&lt;/font&gt;&lt;br /&gt;  &lt;font color="#40ffff"&gt;&amp;lt;&lt;/font&gt;&lt;font color="#40ffff"&gt;button&lt;/font&gt;&lt;font color="#40ffff"&gt; &lt;/font&gt;&lt;font color="#60ff60"&gt;label&lt;/font&gt;=&lt;font color="#ffa0a0"&gt;&amp;quot;Hello World&amp;quot;&lt;/font&gt;&lt;font color="#40ffff"&gt; &lt;/font&gt;&lt;font color="#60ff60"&gt;onclick&lt;/font&gt;=&lt;font color="#ffa0a0"&gt;&amp;quot;window.alert('Hello World!');&amp;quot;&lt;/font&gt;&lt;font color="#40ffff"&gt;/&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;font color="#40ffff"&gt;&amp;lt;/window&amp;gt;&lt;/font&gt;&lt;br /&gt;&lt;/pre&gt;This is a very simple XUL file which defined a frame window, and there is only a button on it. When the button is clicked, there will be a prompt alert. It just works like HTML.&lt;br /&gt;这是一个非常简单的XUL文件，它只定义了一个主窗口，在主窗口中只有一个按钮控建，我们还定义了一个onclick事件的JavaScript程序，当按钮被点击就会弹出一个警告窗口，这一部分就和普通的HTML没有什么区别。&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;Ready and Go / 预备跑&lt;/h2&gt;Ok, it is time to go. Open a Command Processor window,  cd into the ${APP_ROOT}, assuming the ${APP_ROOT} is "HelloWorld", and it is located within the XULRunner's folder, for me, the XULRunner is installed at "e:\devel\xulrunner". We can launch the Hello World application in this way.&lt;br /&gt;好了，该出发了！ 请打开一个命令行窗口，并且进入 XULRunner的安装目录， 比如说 XULRunner 被安装在 e:\devel\xulrunner ，HelloWorld应用程序的目录就在 XULRunner的安装目录中。我们就可以按照下面的命令来运行 HelloWorld。&lt;br /&gt;&lt;pre style="border: thin solid black; padding: 6px; width: 700px;"&gt;e:\devel\xulrunner&gt;xulrunner.exe HelloWorld\application.ini &lt;/pre&gt; in other words:&lt;br /&gt;&lt;pre style="border: thin solid black; padding: 6px; width: 700px;"&gt;${XULRUNNER_HOME}\xulrunner.exe ${APP_ROOT}\application.ini&lt;br /&gt;&lt;/pre&gt; 当然也可以使用上面的方法来运行，这里 ${XULRUNNER_HOME} 和 ${APP_ROOT} 应该被替换成她们实际的全路径名。&lt;br /&gt;&lt;br /&gt;We got it, isn't it?&lt;br /&gt;&lt;img style="height: 200px; width: 300px;" title="Hello World Screenshot" src="http://docs.google.com/File?id=dpzm4fb_5gm6v9z" border="1" /&gt;&lt;br /&gt;&lt;br /&gt;Have Fun~~~&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-7285916963045439087?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://developer.mozilla.org/en/docs/XULRunner' title='&quot;Hello World&quot; XUL application with XULRunner'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/7285916963045439087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=7285916963045439087' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7285916963045439087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7285916963045439087'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2006/12/hello-world-xul-application-with.html' title='&quot;Hello World&quot; XUL application with XULRunner'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-3801645751557398060</id><published>2006-10-25T15:59:00.000+08:00</published><updated>2006-10-25T16:09:07.193+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Mozilla'/><title type='text'>FireFox 2 发布了!</title><content type='html'>Congratulation!  &lt;br /&gt;&lt;br /&gt;不过看起来，FireFox 用的内存越来越多了, :(  只打开了, Blogger一个网页就已经用了60M多内存了.  加内存吧~~~~&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-3801645751557398060?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://www.mozilla.com/en-US/press/mozilla-2006-10-24.html' title='FireFox 2 发布了!'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/3801645751557398060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=3801645751557398060' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/3801645751557398060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/3801645751557398060'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2006/10/firefox-2.html' title='FireFox 2 发布了!'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-1803539683761935804</id><published>2006-10-24T16:31:00.000+08:00</published><updated>2006-10-24T20:55:28.846+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>802.1X is working under my Ubuntu Linux</title><content type='html'>Finally the my Ubuntu linux is authenticated with the Windows IAS 802.1x RADIUS server.  Thanks Xsupplicant, thanks Open1x project to provide us a such great too.&lt;br /&gt;今天， 我的 Ubuntu Linux 终于可以通过公司的 802.1X 端口认证了。非常感谢 Xsupplicant, 感谢 &lt;a href="http://open1x.sourceforge.net/"&gt;Open1X &lt;/a&gt;小组为我们提供的工具。&lt;br /&gt;&lt;br /&gt;Before configure your Linux box, you should be look at your windows configuration carefully.  In fact M$ windows  didn't support too much authentication methods. For Windows 2000 with the Wireless authentication patch, it do only support 3 type of EAP, (PEAP, MD5-Challenge, and Smart-card or Certificate). The MD5-Challenge is too weak, and the smart-card isn't deployed widely. So the PEAP is the proper, maybe only choice for Windows.&lt;br /&gt;在开始配置你的 Linux 前，我们需要仔细察看 Windows 中802.1X的协议设置。实际上，在 Window 系统中，对以太网卡并不支持很多的认证方法。对于应用了微软无线认证补丁的 Windows 2000 中只支持三种 EAP 方法（PEAP, MD5-Challenge, and Smart-card or Certificate）。实际上基于 MD5 的认证方式实在是太脆弱了，而 Smart-Card 的应用实际上也不广泛。因此 PEAP 实际上是可以使用的唯一选择。&lt;br /&gt;&lt;br /&gt;Under the Linux, there are some tricks for the Xsupplicant configurations. See the sample PEAP-example.conf below:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# This is an example configuration file for xsupplicant versions after 0.8b.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;### GLOBAL SECTION&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# network_list: defines all of the networks in this file which &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;#      should be kept in memory and used.Comma delimited list or "all"&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;#      for keeping all defined configurations in memory. For efficiency,&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;#      keep only the networks you might roam to in memory.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;#      To avoid errors, make sure your default network is always&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;#      in the network_list.  In general, you will want to leave this set to &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;#      "all".&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;network_list = all&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;#network_list = default, test1, test2&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# default_netname: some users may actually have a network named "default".&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;#      since "default" is a keyword in the network section below, you can&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;#      change which is to be used as the replacement for this keyword&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;default_netname = default&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;#default_netname = my_defaults&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# When running in daemon, or non-foreground mode, you may want to have the&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# output of the program.  So, define a log file here.  Each time XSupplicant&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# is started, this file will be replaced.  So, there is no need to roll the&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# log file.&lt;/span&gt;&lt;br /&gt;logfile = /var/log/xsupplicant.log&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# The auth_period, held_period, and max_starts modify the timers in the state&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# machine.  (Please reference the 802.1x spec for info on how they are used.)&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# For most people, there is no reason to define these values, as the defaults&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# should work.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;#auth_period = 30&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;#held_period = 30&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;#max_starts = 3&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;###  NETWORK SECTION&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# The general format of the network section is a network name followed&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# by a group of variables.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# Network names may contain the following characters: a-z, A-Z, 0-9, '-', &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# '_', '\', '/'&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# Those interested in having an SSID with ANY character in it can use&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# the ssid tag within the network clause. Otherwise, your ssid will&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;# be the name of the network.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;## The default network is not a network itself. These values are &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;## the default used for any network parameters not overridden &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;## in another section. If it's not in your network configuration&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;## and not in your default, it won't work!!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;default&lt;br /&gt;{&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # type: the type of this network. wired or wireless, if this value is not&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # set, xsupplicant will attempt to determine if the interface is wired or&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # wireless.  In general, you should only need to define this when&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # xsupplicant incorrectly identifies your network interface.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  type = wire # For your Ethernet card.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # wireless_control: If this profile is forced to wired, this will not do&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # anything.  However, if the interface is forced, or detected to be wireless&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # XSupplicant will take control of re/setting WEP keys when the machine &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # first starts, and when it jumps to a different AP.  In general, you won't&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # need to define, or set this value.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # wireless_control = yes&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # allow_types:  describes which EAP types this network will allow.  The&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # first type listed will be requested if the server tries to use something&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # not in this list.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # allow_types = eap_tls, eap_md5, eap_gtc, eap-otp&lt;/span&gt;&lt;br /&gt; allow_types = all&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # identity:  what to respond with when presented with an EAP Id Request&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  #   Typically, this is the username for this network. If this is a string&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # that does not contain any spaces, or unusual characters, it can be listed&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # plain.  Otherwise, it should be enclosed in quotes.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;  identity = "DOMAIN\USERID" # For window based 802.1X RADIUS, it should be DOMAIN\USER&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # Force xsupplicant to send it's packets to this destination MAC address.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  # In most cases, this isn't needed, and shouldn't be defined.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;  #dest_mac = 00:aA:bB:cC:dD:eE&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;eap-peap {&lt;br /&gt;&lt;span style="font-weight: bold; color: rgb(255, 0, 0);"&gt;     inner_id = USERID  &lt;span style="color: rgb(204, 204, 204);"&gt;# Only UserID &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;     # As in tls, define either a root certificate or a directory&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;     # containing root certificates. If the path contains spaces, or unusual&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;     # characters, enclose it in quotes.&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 102);"&gt;     # Trusted root cert can be exported from windows &lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 153, 102);"&gt;     # as DER format, and translate to PEM format by using openssl&lt;br /&gt;    # under Linux:&lt;br /&gt;    # &lt;span style="font-weight: bold;"&gt;openssl x509 -inform DER &lt;root_ca&gt;.cer -outform PEM -out root.crt&lt;/root_ca&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 102);"&gt;     root_cert = /path/to/root/certificate&lt;br /&gt;&lt;/span&gt;     root_dir = "/path /to /root /certificate /dir"&lt;br /&gt;    crl_dir = /path/to/dir/with/crl&lt;br /&gt;    chunk_size = 1398&lt;br /&gt;&lt;span style="color: rgb(255, 153, 102);"&gt;     random_file = /dev/random              # /dev/random will work for most case.&lt;br /&gt;&lt;br /&gt;    # If you don't know the CN name of your RADIUS server,&lt;br /&gt;    # You can make the cnexact = no&lt;br /&gt;    # While the RADIUS server name can be saw in "&lt;span style="font-weight: bold;"&gt;Xsupplicant -d A&lt;/span&gt;" mode&lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;     cncheck = myradius.radius.com         &lt;br /&gt;&lt;/span&gt;&lt;span style="color: rgb(255, 153, 0);"&gt;     cnexact = yes                          # Should it be an exact match?&lt;/span&gt;&lt;br /&gt;    session_resume = yes&lt;br /&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;     #Currently 'all' is just mschapv2&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 204, 204);"&gt;     #If no allow_types is defined, all is assumed&lt;/span&gt;&lt;br /&gt;     allow_types = all # where all = MSCHAPv2, MD5, OTP, GTC, SIM&lt;br /&gt;    #allow_types = eap_mschapv2&lt;br /&gt;&lt;br /&gt;    eap-mschapv2 {&lt;br /&gt;&lt;span style="color: rgb(255, 102, 0);"&gt;        # ntpwdhash was generated by using "&lt;span style="font-weight: bold;"&gt;xsup_ntpwdhash &lt;pwd&gt;&lt;/pwd&gt;&lt;/span&gt;" command&lt;/span&gt;&lt;br /&gt;       ntpwdhash = E653E6452753C97E46792567DFF599B6&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;        # Don't put your password here, use the ntpwdhash instead.&lt;/span&gt;&lt;br /&gt;       #password = "phase2 mschapv2 pass"&lt;br /&gt;    }&lt;br /&gt;}&lt;br /&gt;}&lt;br /&gt;&lt;br /&gt;# TIP:&lt;br /&gt;#&lt;br /&gt;# 1. Use the foregroup mode to debug your configure.&lt;br /&gt;# It will show you all the things.&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;# /usr/sbin/xsupplicant -i eth0 -d A -f &lt;/span&gt;&lt;br /&gt;#&lt;br /&gt;# 2. Remove all the unnecessary data cleaned&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-1803539683761935804?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://open1x.sourceforge.net' title='802.1X is working under my Ubuntu Linux'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/1803539683761935804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=1803539683761935804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1803539683761935804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1803539683761935804'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2006/10/8021x-is-working-under-my-ubuntu-linux.html' title='802.1X is working under my Ubuntu Linux'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-5251353932892962327</id><published>2006-10-23T20:47:00.000+08:00</published><updated>2006-10-23T20:54:50.663+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Linux'/><title type='text'>802.1X under Linux</title><content type='html'>The IS department reqired the 802.1X port authentication in the new campus, it really hurt me -- as a Linux fun. After I swithed to my Ubuntu, the network port will be blocked after 30 minutes. &lt;br /&gt;&lt;br /&gt;Oh, I found the xsupplicant of Open1X project, it looks like a feasible way to have my Linux box running under the company's 802.1X network.&lt;br /&gt;&lt;br /&gt;But there are still some problems need to be solved. Let's do it tomorrow. :) ...&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-5251353932892962327?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://open1x.sourceforge.net/' title='802.1X under Linux'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/5251353932892962327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=5251353932892962327' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/5251353932892962327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/5251353932892962327'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2006/10/8021x-under-linux.html' title='802.1X under Linux'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-1548330564493203682</id><published>2006-10-23T20:16:00.000+08:00</published><updated>2006-12-25T13:30:18.197+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><title type='text'>keepend instruction in VIM syntax file</title><content type='html'>In the VIM "syntax region" instruction, there is a special parameter "keepend". In the VIM tutorial, the given sample is a inline comments. Somehow it give me a misleading that the *keepend* will be only used to match the end of line '$'.  While it's totally wrong. :(&lt;br /&gt;在VIM的 "syntax region" 语法中，支持一个特殊的 "keepend"  参数。 在 VIM 的介绍中, 对 keepend 用法的介绍是通过一个行内注释，以及可以在注释内出现的语法来讲解的。因此我已开始对 keepend 的用法也产生了错觉，认为它就是用来匹配行尾 "$" 的。但是实际上，这样的认识是完全错误的。&lt;br /&gt;&lt;br /&gt;Let's take a look at this example.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;syntax region xDocLink       start="{" end="}" contained&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;syntax region xDocComment   start="/\*\*" end="\*/"&lt;br /&gt;                           \ contains=xDocLink&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;syntax region xBlock         start="{" end="}"&lt;br /&gt;                           \ contains=xDocComment &lt;span style="color: rgb(255, 0, 0); font-weight: bold;"&gt;keepend&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;if the "keepend" is defined in xBlock, the follows messge will be highlighted in wrong way.&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;span style="color: rgb(0, 0, 0);font-family:courier new;" &gt;{&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(204, 0, 0);font-family:courier new;" &gt;    &lt;span style="color: rgb(102, 0, 204);"&gt;/**&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;&lt;span style="color: rgb(204, 0, 0);"&gt;&lt;span style="color: rgb(102, 0, 204);"&gt;     * The comments {@links&lt;/span&gt;}&lt;/span&gt;    &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;     */&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:courier new;"&gt;    Block;&lt;/span&gt;&lt;br /&gt;&lt;span style="color: rgb(255, 0, 0);font-family:courier new;" &gt;}&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The xBlock will be terminated at the "}" inside the xDocComment. Even the the first "{" are matched as xDocLink, the "}" is still consided as the end of xBlock. It is the side effect of "keepend" instruction of xBlock.&lt;br /&gt;&lt;br /&gt;The really meanings of "keepend" is to match the end of region, even it has already matched with its nested regions, whatever what's the pattern of end, in most case, it is "$", but it can be anything there.&lt;br /&gt;其实 "keepend" 语句的实际意义是：尽可能匹配 region 所指定的 end pattern, 即便 这个pattern实际上已经被它的内联region所匹配了。这里的 keepend 实际上是指 end pattern，而不管这个 pattern 到底是什么，尽管大多数时候它都是 "$"。&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-1548330564493203682?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://vimdoc.sourceforge.net/htmldoc/usr_44.html' title='keepend instruction in VIM syntax file'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/1548330564493203682/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=1548330564493203682' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1548330564493203682'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/1548330564493203682'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2006/10/keepend-instruction-in-vim-syntax-file.html' title='keepend instruction in VIM syntax file'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-6297041479539358686</id><published>2006-10-23T20:05:00.000+08:00</published><updated>2006-10-23T20:16:45.316+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><title type='text'>Search pattern in VIM</title><content type='html'>The search pattern of VIM is little different with Perl. There is one thing I igonred at the beginning, and it made me confused for a long time. That is the group pattern can't be used inside the "[]"&lt;br /&gt;&lt;br /&gt;In &lt;a href="http://vimdoc.sourceforge.net/htmldoc/usr_27.html#27.6"&gt;http://vimdoc.sourceforge.net/htmldoc/usr_27.html#27.6&lt;/a&gt;&lt;br /&gt;&lt;pre&gt;&lt;b&gt;&lt;span style="color:purple;"&gt; item matches   equivalent &lt;/span&gt;&lt;/b&gt;&lt;br /&gt;\d digit   [0-9]&lt;br /&gt;\D non-digit  [^0-9]&lt;br /&gt;\x hex digit  [0-9a-fA-F]&lt;br /&gt;\X non-hex digit  [^0-9a-fA-F]&lt;br /&gt;\s white space  [  ]     (&lt;tab&gt; and &lt;a href="http://vimdoc.sourceforge.net/htmldoc/motion.html#%3CSpace%3E"&gt;&lt;space&gt;&lt;/space&gt;&lt;/a&gt;)&lt;br /&gt;\S non-white characters [^  ]     (not &lt;a href="http://vimdoc.sourceforge.net/htmldoc/motion.html#%3CTab%3E"&gt;&lt;tab&gt;&lt;/tab&gt;&lt;/a&gt; and &lt;a href="http://vimdoc.sourceforge.net/htmldoc/motion.html#%3CSpace%3E"&gt;&lt;space&gt;&lt;/space&gt;&lt;/a&gt;)&lt;br /&gt;\l &lt;a href="http://vimdoc.sourceforge.net/htmldoc/change.html#lowercase"&gt;lowercase&lt;/a&gt; alpha  [a-z]&lt;br /&gt;\L non-lowercase alpha [^a-z]&lt;br /&gt;\u &lt;a href="http://vimdoc.sourceforge.net/htmldoc/change.html#uppercase"&gt;uppercase&lt;/a&gt; alpha  [A-Z]&lt;br /&gt;\U non-uppercase alpha [^A-Z]&lt;/tab&gt;&lt;/pre&gt;Using this predefined ranges works a lot faster than the character range it stands for.&lt;br /&gt;But they can't be used inside the "[]" .&lt;br /&gt;&lt;br /&gt;:-)&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-6297041479539358686?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://vimdoc.sourceforge.net/htmldoc/usr_44.html' title='Search pattern in VIM'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/6297041479539358686/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=6297041479539358686' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6297041479539358686'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/6297041479539358686'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2006/10/tips-in-vim-syntax-file.html' title='Search pattern in VIM'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-8128863183564909982</id><published>2006-10-18T15:09:00.000+08:00</published><updated>2006-10-18T15:25:07.010+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><title type='text'>VIM JavaScript syntax updated to 0.6</title><content type='html'>We have been there 0.5.1 for some monthes. Today, we will move to 0.6 :) The mainly changed part is &lt;a href="http://jsdoc.sf.net/"&gt;JSDoc&lt;/a&gt; introduction.&lt;br /&gt;&lt;br /&gt;The syntax file has been downloaded by &lt;span style="font-weight: bold;"&gt;1019&lt;/span&gt;, it's rating &lt;b&gt;256/77&lt;/b&gt; at 2006-10-17.&lt;br /&gt;It is the 4th rated syntax file at &lt;a href="http://vim.sourceforge.net/scripts/script_search_results.php?keywords=&amp;script_type=syntax&amp;amp;order_by=rating&amp;direction=descending&amp;amp;search=search"&gt;VIM site&lt;/a&gt;.  Please vote me, if it is helpful :)&lt;br /&gt;&lt;br /&gt;I hope it can come into the offical VIM package in the near later.&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-8128863183564909982?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://vim.sourceforge.net/scripts/script.php?script_id=1491' title='VIM JavaScript syntax updated to 0.6'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/8128863183564909982/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=8128863183564909982' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/8128863183564909982'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/8128863183564909982'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2006/10/vim-javascript-syntax-updated-to-06.html' title='VIM JavaScript syntax updated to 0.6'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-7309301342172108535</id><published>2006-10-18T14:03:00.000+08:00</published><updated>2006-10-18T15:43:53.842+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><title type='text'>VIM 参考手册 （中文版）</title><content type='html'>网络上面勤劳的同志好多啊！居然看到了中文翻译版本的 VIM 参考手册，而且还是最新的 7.0 版本，本来曾经有念头作这个事情的，已经被人先行一步了。&lt;br /&gt;&lt;br /&gt;赞叹中~~~&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-7309301342172108535?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://vimcdoc.sourceforge.net/' title='VIM 参考手册 （中文版）'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/7309301342172108535/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=7309301342172108535' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7309301342172108535'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/7309301342172108535'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2006/10/vim.html' title='VIM 参考手册 （中文版）'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-4398985479984283356</id><published>2006-10-14T17:36:00.000+08:00</published><updated>2006-10-18T15:03:48.676+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='VIM'/><title type='text'>VIM syntax for JavaScript</title><content type='html'>This is my first VIM syntax file. Personaly, I think it is better than the Javascript syntax packaged with the VIMRUNTIME packages.  Original version from  Claudio Fleiner.&lt;br /&gt;这是我制作的第一个 VIM syntax 文件， 其实也是在 Claudio Fleiner  原有的版本上改进而来的。自我感觉这个 syntax 比 VIM 发行版中自带的要好。:D  &lt;span style="font-size:85%;"&gt;&lt;span style="font-style: italic;"&gt;是不是有点自我吹捧了 xixi&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;It supports these lexcial elements in JavaScript: 可以识别的 JavaScript 语法类型：&lt;br /&gt;&lt;ul&gt;&lt;li&gt;String in "" or '';&lt;/li&gt;&lt;li&gt;Regex string&lt;/li&gt;&lt;li&gt;Number&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Code comments in C/C++ style&lt;br /&gt;&lt;/li&gt;&lt;li&gt;TODO FIXME XXX TBD hightlight in the comments&lt;/li&gt;&lt;li&gt;JavaScript keywords&lt;/li&gt;&lt;li&gt;Global Ojbects: &lt;span style="font-style: italic; font-weight: bold;font-family:courier new;" &gt;Array Boolean Date Error Function java JavaArray JavaClass JavaObject JavaPackage Math netscape Number Object Packages RegExp String&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Bracket matches, including '{} [] ()'&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;claudio at="" com=""&gt;&lt;/claudio&gt;&lt;claudio at="" com=""&gt;&lt;br /&gt;&lt;/claudio&gt;&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-4398985479984283356?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://vim.sourceforge.net/scripts/script.php?script_id=1491' title='VIM syntax for JavaScript'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/4398985479984283356/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=4398985479984283356' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/4398985479984283356'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/4398985479984283356'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2006/10/vim-syntax-for-javascript.html' title='VIM syntax for JavaScript'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-116063062243041978</id><published>2006-10-12T13:23:00.000+08:00</published><updated>2006-10-14T18:55:39.821+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='GOOGLE'/><title type='text'>Google Docs &amp; Spreadsheets</title><content type='html'>&lt;a href="http://docs.google.com/"&gt;Google Docs &amp;amp; Spreadsheets&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Google的集成工作做得真好，在这里编辑的东西可以无缝地发布到Blogger中。&lt;br /&gt;如果再能集成到桌面就好了。 也许这个功能已经集成在了 GDS 中，&lt;br /&gt;但是 Google Desktop Search 现在实在是有点沉重，不符合我的口味了 :(&lt;br /&gt;&lt;br /&gt;期待简单~~~&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-116063062243041978?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='related' href='http://docs.google.com/' title='Google Docs &amp; Spreadsheets'/><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/116063062243041978/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=116063062243041978' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/116063062243041978'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/116063062243041978'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2006/10/google-docs-spreadsheets.html' title='Google Docs &amp; Spreadsheets'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-19542362.post-113361562066580125</id><published>2005-12-03T21:12:00.000+08:00</published><updated>2006-10-14T18:55:56.691+08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='Life'/><title type='text'>新的一天~~~</title><content type='html'>新的一天开始了，虽然有些寒冷，但是它是崭新的一天。&lt;br /&gt;&lt;br /&gt;2005年12月3日&lt;div class="blogger-post-footer"&gt;This is life, This is RouMao~~~&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/19542362-113361562066580125?l=linuxyz.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://linuxyz.blogspot.com/feeds/113361562066580125/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=19542362&amp;postID=113361562066580125' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/113361562066580125'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/19542362/posts/default/113361562066580125'/><link rel='alternate' type='text/html' href='http://linuxyz.blogspot.com/2005/12/blog-post.html' title='新的一天~~~'/><author><name>Yi Zhao</name><uri>https://profiles.google.com/112825992960083702312</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='//lh3.googleusercontent.com/-IhDA8SFGJiw/AAAAAAAAAAI/AAAAAAAABy8/2vcmB2GVuvc/s512-c/photo.jpg'/></author><thr:total>0</thr:total></entry></feed>
