<?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-232089650532799094</id><updated>2011-10-27T18:30:08.740-07:00</updated><category term='articles'/><category term='UTS short Course'/><category term='definition'/><category term='quantum cryptography'/><category term='security'/><category term='web design'/><title type='text'>Abeo Tech Lab</title><subtitle type='html'>This blog created for technical writing and stuff relates to my major as Software Engineer.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://abeo-tech.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/232089650532799094/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://abeo-tech.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Abeo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_eLLXlRUPXes/Sbx2_u1UqEI/AAAAAAAAAHc/9T2mlKf3KpI/S220/ava.jpg'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>8</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-232089650532799094.post-1200610705080426538</id><published>2009-06-03T16:49:00.000-07:00</published><updated>2009-06-03T16:56:45.980-07:00</updated><title type='text'>The Entrepreneur’s Handbook – 59 Resources For First Time Entrepreneurs</title><content type='html'>&lt;span class="Apple-style-span"  style="color: rgb(17, 17, 17);  font-size:10px;"&gt;&lt;h1 class="entry-title"  style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px;  font-weight: normal; line-height: 1.364em; font-size:2.2em;"&gt;&lt;span class="Apple-style-span"  style=" line-height: 22px; font-size:14px;"&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;&lt;span class="Apple-style-span" style="color: rgb(17, 17, 17); font-size: 14px; "&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;As a first time entrepreneur you probably have tons of questions. And every time you do a Google search for an answer you are bombarded with too much information and in some cases that information contradicts other things you have heard. Due to this, I have created a list of 54 resources that should help you out.&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;&lt;span id="more-739" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;/span&gt;&lt;/span&gt;&lt;/p&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Legal &amp;amp; Accounting&lt;/span&gt;&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Legal and accounting issues may not seem important when you are starting your company, but they are. Legal and accounting mistakes that you make early on can haunt you for years and can be expensive to fix. So if you are going to start a company you should do things right from the get go.&lt;/span&gt;&lt;/p&gt;&lt;ul style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 1.571em; list-style-type: square; list-style-position: initial; list-style-image: initial; "&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.powerhomebiz.com/vol136/structure.htm" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;S Corp. vs. LLC: Which Structure is Right for Your Business&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Determining the type of legal structure for a new business can be daunting for entrepreneurs and small business owners. Learn more about S Corporations and Limited Liability Companies (LLC), and decide if one of these business structures is right for you.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.legalzoom.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Legal Zoom&lt;/a&gt; – &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;a cheap way to get incorporated.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.findlaw.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Findlaw&lt;/a&gt; – &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;a directory of all the lawyers throughout the US.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.understand-accounting.net/debitsandcredits.html" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Bookkeeping 101: Debits and Credits&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Ac&lt;/span&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;counting ends with score keeping but begins with record keeping. The first task of accounting is to accurately record transactions. Transactions are events that change the composition of a firm’s assets, liabilities, and equity.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.accountingcoach.com/online-accounting-course/60Xpg01.html" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; font-weight: normal; "&gt;Accounting Basics&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;This explanation of accounting basics will introduce you to some basic accounting principles, accounting concepts, and accounting terminology.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.docstoc.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; font-weight: normal; "&gt;Docstoc&lt;/a&gt; – &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;A free place to get legal documents and templates which can drastically help reduce your legal fees and in some cases allow you to do some legal stuff yourself.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.missouribusiness.net/docs/youve_been_sued.asp" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;You’ve Been Sued: What Do You Do?&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Everything you wanted to know about being sued.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://homebusiness.about.com/od/getstarted/a/business_bank.htm" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Opening a Business Bank Account&lt;/a&gt; –&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; Business bank accounts and your identity.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.entrepreneur.com/management/legalcenter/article60230.html" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Closing Down Your Business Permanently&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;If you’re shuttering your business for good, there’s more to it than drawing the blinds.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.alllaw.com/articles/legal/article15.asp" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Legal Issues to Consider When Starting Your Business&lt;/a&gt; -&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; There are a multitude of legal issues to think about when it comes to starting your business. Everything from your business name to its structure to its operation has legal implications.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Web Design&lt;/span&gt;&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Design is something we tend to take for granted. Not only is important for your website to look good, but you also want to make sure it is usable and converts.&lt;/span&gt;&lt;/p&gt;&lt;ul style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 1.571em; list-style-type: square; list-style-position: initial; list-style-image: initial; "&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.useit.com/alertbox/9605.html" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Top Ten Mistakes in Web Design &lt;/a&gt;- &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;The ten most egregious offenses against users. Web design disasters and HTML horrors are legion, though many usability atrocities are less common than they used to be.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.google.com/websiteoptimizer/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; font-weight: normal; "&gt;Google Website Optimizer&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;A free tool that will help you maximize your conversions.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://alvit.de/handbook/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; font-weight: normal; "&gt;Web Developers Handbook&lt;/a&gt; -&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; Everything you need to know about web design and development.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://cssvault.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;CSS Vault&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Web design inspiration.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.mezzoblue.com/archives/2004/04/30/a_roadmap_to/index.php" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;A Roadmap to Web Standards&lt;/a&gt; -&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; Before you start designing your website, make sure you are complying with web standards.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.37signals.com/svn/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Signal vs Noise&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;A design and usability blog by 37signals.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.crazyegg.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Crazy Egg&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;A simple tool that shows you how website visitors interact with your website.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.freshleafmedia.co.uk/blog/how-to-choose-a-website-design-agency/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;How to choose a website design agency&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Choosing the right web design shop can be a tricky thing.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Internet Marketing&lt;/span&gt;&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;You can have a great product or service, but if no one sees it you will never make any money. Now this doesn’t mean you have to hire a marketing firm to help you out, but you could learn some basic things about Internet marketing.&lt;/span&gt;&lt;/p&gt;&lt;ul style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 1.571em; list-style-type: square; list-style-position: initial; list-style-image: initial; "&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.seomoz.org/article/beginners-guide-to-search-engine-optimization" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Beginner’s Guide to Search Engine Optimization&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;The basics of search engine optimization.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.marketingpilgrim.com/2008/04/social-media-marketing-beginners-guide.html" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Social Media Marketing Beginner’s Guide&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Interested in leveraging the social web? Here is what you need to know first.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.techcrunch.com/2005/09/08/top-ten-things-you-can-do-to-get-blogged/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Top Ten Things You Can Do To Get Blogged On&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Getting bloggers to blog on your company isn’t an easy thing. If you flow these rules and you should be successful at it.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.quicksprout.com/2009/02/02/how-to-optimize-your-blog-for-search-engines/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;How to Optimize Your Blog for Search Engines&lt;/a&gt; -&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; What you need to know if you want your corporate blog to get traffic.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.webanalyticshour.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; font-weight: normal; "&gt;Web Analytics: An Hour A Day&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Google’s analytics guru, Avinash Kaushik, breaks down web analytics and the tracking needs you may need for your website.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.dullest.com/blog/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Dullest&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;The blog of Google’s main search engineer, Matt Cutts. Before you get into search engine optimization, you probably want to read his blog.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.mailchimp.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; font-weight: normal; "&gt;MailChimp&lt;/a&gt; &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;- Sending high quantities of emails isn’t an easy thing to do. In most cases your emails won’t go through unless you use a service like MailChimp.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.sitepoint.com/article/basics-create-ads-work/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Banner Basics: Create Ads That Work&lt;/a&gt; &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;- Banner advertising isn’t dead… you just have to learn how to effectively use them.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Hiring Employees&lt;/span&gt;&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;When you don’t have much cash in the bank, you can’t afford to make hiring mistakes. Sooner or later you are going to have to hire a few employees, so you better know what to look for.&lt;/span&gt;&lt;/p&gt;&lt;ul style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 1.571em; list-style-type: square; list-style-position: initial; list-style-image: initial; "&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://askfsb.blogs.fsb.cnn.com/2008/07/09/the-first-employee/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;When to hire your first employee&lt;/a&gt; -&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; if you are considering hiring an employee, you should read this first.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.microsoft.com/smallbusiness/resources/management/recruiting-staffing/5-tips-for-hiring-your-first-employee.aspx#tipsforhiringyourfirstemployee" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;5 tips for hiring your first employee&lt;/a&gt; -&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; Microsoft breaks down some useful tips for new companies.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://accidental-hr.com/hiring/9-steps-before-you-hire/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;9 Steps Before You Hire&lt;/a&gt; &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;- 9 good tips for first time business owners&lt;/span&gt;.&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.adp.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;ADP&lt;/a&gt; -&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; Payroll can be a hassle. ADP provides good payroll solutions for a very affordable price.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.allbusiness.com/human-resources/workforce-management-termination/1340-1.html" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;How to Fire an Employee&lt;/a&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; - If you hire a bad employee you better learn to fire them.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://trainingpd.suite101.com/article.cfm/when_to_fire_an_employee" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;When to Fire an Employee&lt;/a&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; - Analyzing when it is time to accept that a performance improvement will not happen.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.npost.com/2009/03/30/fully-baked-the-real-cost-of-adding-a-new-employee/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Fully-Baked: The real cost of adding a new employee&lt;/a&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; - Employees cost more than just their salaries.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://books.google.com/books?id=64_sALufiUEC&amp;amp;printsec=frontcover&amp;amp;dq=problems+employees+can+cause&amp;amp;source=gbs_summary_r&amp;amp;cad=0" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;201 ways to turn any employee into a star performer&lt;/a&gt; -&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; A book that you should read if you want to maximize your employees output.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.tsheets.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Tsheets&lt;/a&gt; -&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; Employee time tracking software.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.rescuetime.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;RescueTime&lt;/a&gt; &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;- Employee time tracking and time management software.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Raising Venture Capital&lt;/span&gt;&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Raising money can be a pain in the ass, especially if you have never done it before. If you want to raise money, you need to know the basic terminology that venture capitalists use, how to create a pitching deck, and how to get in front of venture capitalists.&lt;/span&gt;&lt;/p&gt;&lt;ul style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 1.571em; list-style-type: square; list-style-position: initial; list-style-image: initial; "&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.vfinance.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Vfinance&lt;/a&gt; -&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; A directory of venture capitalists, angel investors, and business plan templates.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.forbes.com/lists/2009/99/midas09_The-Midas-List_Rank.html" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; font-weight: normal; "&gt;Forbes Midas List&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;A list of the top 100 venture capitalists for the year 2009.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://blog.guykawasaki.com/2005/12/the_102030_rule.html" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;The 10/20/30 Rule of PowerPoint&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Before you make a powerpoint that showcases your company and how much money you are raising, you should read this.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.quicksprout.com/2009/01/21/how-to-raise-venture-capital/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;How to Raise Venture Capital&lt;/a&gt; &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;- An detailed overview on how you can raise money.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://venturehacks.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Venture Hacks&lt;/a&gt; -&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; A blog for entrepreneurs that discusses everything about venture capital.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.thefunded.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;The Funded&lt;/a&gt; &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;- An online community of entrepreneurs to research, rate, and review funding sources worldwide.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.startupwhisperer.com/2008/06/guest-post-by-w.html" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;How To Raise Venture Dollars&lt;/a&gt; &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;- Ben Elowitz who has raised over 40 million dollars breaks down the tricks to raising money.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.paulgraham.com/articles.html" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; font-weight: normal; "&gt;Paul Graham&lt;/a&gt; &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;- Awesome essays about venture capital and entrepreneurship.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;General Business Advice&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Other entrepreneurs have already solved many of the problems you are going to face. So when you run to into these generic problems, here are some websites you can turn to.&lt;/span&gt;&lt;/p&gt;&lt;ul style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 1.571em; list-style-type: square; list-style-position: initial; list-style-image: initial; "&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.inspiredstartup.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Inspired Startup &lt;/a&gt;- &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Successful entreprenuer Andy Liu breaks down how to take your startup to the next level.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://business.timesonline.co.uk/tol/business/industry_sectors/media/article1923706.ece" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;The 50 best business blogs&lt;/a&gt; &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;- There are thousands of business blogs, but here are the 50 best according to Times.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.youngentrepreneur.com/blog/2008/02/06/the-top-10-mistakes-people-make-when-starting-a-business/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;The Top 10 Mistakes People Make When Starting A Business&lt;/a&gt; &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;- You don’t want to make any of these mistakes.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.quicksprout.com/2008/09/18/10-timeless-business-tips-from-10-millionaires/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;10 Timeless Business Tips From 10 Millionaires&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;If you want to be a millionaire then you better learn from them.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.entrepreneur.com/leadership/solvingyourbusinessproblems/archive158424.html" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Solving Your Business Problems&lt;/a&gt; -&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; Start solving your problems before they even take place.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://strugglingentrepreneur.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Struggling Entrepreneur&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;The Struggling Entrepreneur is a free podcast series that deals with the issues, challenges and problems of the individual who wants to be an entrepreneur, but who encounters a somewhat difficult path and appears to be struggling.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.smarta.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Smarta&lt;/a&gt; &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;- A support community for entrepreneurs.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://litemind.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; font-weight: normal; "&gt;Litemind&lt;/a&gt; -&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; Exploring ways to use your mind more efficiently.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://mixergy.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Mixergy&lt;/a&gt; -&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; Successful CEOs share their experiences with the masses.&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Living The Frugal Life&lt;/span&gt;&lt;/h3&gt;&lt;p style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 0px; "&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Although it may sound sexy to be an entrepreneur, most entrepreneurs don’t make a ton of money. You are going to have to learn to live a frugal life so that you can continue to do what you love and not worry about paying your mortgage.&lt;/span&gt;&lt;/p&gt;&lt;ul style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 1.571em; margin-left: 1.571em; list-style-type: square; list-style-position: initial; list-style-image: initial; "&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.thesimpledollar.com/2008/02/06/little-steps-100-great-tips-for-saving-money-for-those-just-getting-started/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Little Steps: 100 Great Tips For Saving Money For Those Just Getting Started&lt;/a&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.doughroller.net/2007/11/06/51-painless-money-saving-tips/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;75 Painless Money-Saving Tips&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;Saving money can be painful, but here are 75 ways that are painless.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.quicksprout.com/2009/02/26/strapped-for-cash-sign-up-for-billshrink/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Strapped For Cash? Billshrink Can Save You Thousands!&lt;/a&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.bargaineering.com/articles/high-yield-savings-accounts-at-20-largest-banks.html" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;High Yield Savings Accounts at 20 Largest Banks&lt;/a&gt; - &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;If you are going to keep your money with a bank, might as well be a bank that has high yield savings accounts.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://scroogestrategy.com/" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;Scrooge Strategy&lt;/a&gt; -&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt; 1 premium tip every week that helps you save money.&lt;/span&gt;&lt;/li&gt;&lt;li style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; "&gt;&lt;a href="http://www.ehow.com/how_4905253_reduce-rent.html" style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 0px; margin-right: 0px; margin-bottom: 0px; margin-left: 0px; color: rgb(108, 162, 81); text-decoration: none; "&gt;How to Reduce Rent&lt;/a&gt; &lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;- Rent is probably your biggest expense, here are a few ways to reduce it&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;h3 style="padding-top: 0px; padding-right: 0px; padding-bottom: 0px; padding-left: 0px; margin-top: 1.833em; margin-right: 0px; margin-bottom: 0.611em; margin-left: 0px; font-size: 1.286em; font-weight: normal; line-height: 1.222em; "&gt;&lt;i&gt;&lt;span class="Apple-style-span"  style="color:#FFFFFF;"&gt;This articled is adapted from Neil Partel (quicksprout.com)&lt;/span&gt;&lt;/i&gt;&lt;/h3&gt;&lt;/span&gt;&lt;p&gt;&lt;/p&gt;&lt;/span&gt;&lt;/h1&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/232089650532799094-1200610705080426538?l=abeo-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abeo-tech.blogspot.com/feeds/1200610705080426538/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=232089650532799094&amp;postID=1200610705080426538' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/232089650532799094/posts/default/1200610705080426538'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/232089650532799094/posts/default/1200610705080426538'/><link rel='alternate' type='text/html' href='http://abeo-tech.blogspot.com/2009/06/entrepreneurs-handbook-59-resources-for.html' title='The Entrepreneur’s Handbook – 59 Resources For First Time Entrepreneurs'/><author><name>Abeo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_eLLXlRUPXes/Sbx2_u1UqEI/AAAAAAAAAHc/9T2mlKf3KpI/S220/ava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-232089650532799094.post-2345456132171001996</id><published>2008-12-12T22:25:00.000-08:00</published><updated>2008-12-12T22:57:36.034-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web design'/><category scheme='http://www.blogger.com/atom/ns#' term='articles'/><title type='text'>High-Performance Web Site</title><content type='html'>&lt;span style="font-weight: bold;"&gt;Frontend Performance Best Practices&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;span style="font-style: italic;"&gt;1. Make fewer HTTP requests&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;- Most browsers only download two resources at a time from a given hostname&lt;br /&gt;-Several techniques exist for reducing the number of HTTP requests without reducing&lt;br /&gt;page content:&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Combine multiple scripts into a&lt;/span&gt; single script.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Combine multiple stylesheets into&lt;/span&gt; a single stylesheet.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span&gt;Combine multiple CSS background &lt;/span&gt;images into a single image called a CSS sprite (see http://alistapart.com/articles/sprites).&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-style: italic;"&gt;2. Use a content delivery network (CDN)&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;A content delivery network (CDN) is a collection of distributed Web servers used to deliver content to users more efficiently. Examples include Akamai Technologies, Limelight Networks, SAVVIS, and Panther Express. The main performance advantage provided by a CDN is delivering static resources from a server that is geographically closer to the end user. Other benefits includebackups, caching, and the ability to better absorb traffic spikes.&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;3. Add an Expires header&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;When a user visits a Web page, the browser downloads and caches the page’s resources. The next time the user visits the page, the browser checks to see if any of the resources can be served from its cache, avoiding time-consuming HTTP requests. The browser bases its decision on the resource’s expiration date. If there is an expiration date, and that date is in the future, then the resource is read from disk. If there is no expiration date, or that date is in the past, the browser issues a costly HTTP request. Web developers can attain this performance gain by specifying an explicit expiration date in the future. This is done with the Expires HTTP response header, such as the following:&lt;br /&gt;Expires: Thu, 1 Jan 2015 20:00:00&lt;br /&gt;GMT&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;4. Gzip components&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;The amount of data transferred over the network affects response times, especially for users with slow network connections. For decades developers have used compression to reduce the size of files. This same technique can be used for reducing the size of data sent over the Internet. Many Web servers and Web hosting services enable compression of HTML documents by default, but compression shouldn’t stop there. Developers should also compress other types of text responses, such as scripts, stylesheets, XML, JSON, among others. Gzip is the most popular compression technique. It typically reduces data sizes by 70%.&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;5. Put stylesheets at the top&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Stylesheets inform the browser how to format elements in the page. If stylesheets are included lower in the page, the question arises: What should the browser do with elements that it can render before the stylesheet has been downloaded? One answer, used by Internet Explorer, is to delay rendering elements in the page until all stylesheets are downloaded. But this causes the page to appear blank for a longer period of time, giving users the impression that the page is slow. Another answer, used by Firefox, is to render page elements and redraw them later if the stylesheet changes the initial formatting. This causes elements in the page to “flash” when  they’re redrawn, which is disruptive to the user. The best answer is to avoid including stylesheets lower in the page, and instead load them in the HEAD of the document.&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;6. Put scripts at the bottom&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;External scripts (typically, “.js” files) have a bigger impact on performance&lt;br /&gt;than other resources for two reasons. First, once a browser starts downloading&lt;br /&gt;a script it won’t start any other parallel downloads. Second, the browser won’t&lt;br /&gt;render any elements below a script until the script has finished downloading.&lt;br /&gt;Both of these impacts are felt when scripts are placed near the top of the&lt;br /&gt;page, such as in the HEAD section. Other resources in the page (such as images)&lt;br /&gt;are delayed from being downloaded and elements in the page that already exist&lt;br /&gt;(such as the HTML text in the document itself) aren’t displayed until the earlier&lt;br /&gt;scripts are done. Moving scripts lower in the page avoids these problems.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;7. Avoid CSS expressions&lt;br /&gt;&lt;/span&gt;&lt;span&gt;&lt;br /&gt;CSS expressions are a way to set CSS properties dynamically in Internet Explorer. They enable setting a style’s property based on the result of executing JavaScript code embedded within the style declaration. The issue with CSS expressions is that they are evaluated more frequently than one might expect—potentially thousands of times during a single page load. If the JavaScript code is inefficient it can cause the page to load more slowly.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;8. Make JavaScript and CSS external&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;JavaScript can be added to a page as an inline script  &lt;script type="”text/javascript”"&gt;&gt;var foo=”bar”;&lt;br /&gt;&lt;/script&gt;&lt;br /&gt;or as an external script:&lt;br /&gt;&lt;script src="%E2%80%9Dfoo.js%E2%80%9D" type="”text/"&gt;&lt;/script&gt;&lt;br /&gt;Similarly, CSS is included as either an inline style block or an external stylesheet. Which is better from a performance perspective? HTML documents typically are not cached because their content is constantly changing. JavaScript and CSS are less dynamic, often not changing for&lt;br /&gt;weeks or months. Inlining JavaScript and CSS results in the same bytes (that haven’t changed) being downloaded on every page view. This has a negative impact on response times and increases the bandwidth used from your data center. For most Web sites, it’s better to serve JavaScript and CSS via external files, while making them cacheable with a far future Expires header as explained in Rule 3.&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;9. Reduce DNS lookups&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;The Domain Name System (DNS) is like a phone book: it maps a hostname to an IP address. Hostnames are easier for humans to understand, but the IP address is what browsers need to establish a connection to the Web server. Every hostname that’s used in a Web page must be resolved using DNS. These DNS lookups carry a cost; they can take 20–100 milliseconds each. Therefore, it’s best to reduce the number of unique hostnames used in a Web page.&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;10. Minify JavaScript&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;As described in Rule 4, compression is the best way to reduce the size of text files transferred over the Internet. The size of JavaScript can be further reduced by minifying the code. Minification is the process of stripping unneeded characters (comments, tabs, new lines, extra white space, and so on) from the code. Minification typically reduces the size of JavaScript by 20%. External scripts should be minified, but inline scripts also benefit from this size reduction&lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;11. Avoid redirects&lt;/span&gt;&lt;span&gt;&lt;br /&gt;&lt;br /&gt;Redirects are used to map users from one URL to another. They’re easy to implement and useful when the true URL is too long or complicated for users to remember, or if a URL has changed. The downside is that redirects insert an extra HTTP roundtrip between the user and her content. In many cases, redirects can be avoided with some additional work. If a redirect is truly necessary, make sure to issue it with a far future Expires header (see Rule 3), so that on future visits the user can avoid this delay.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;12. Remove duplicate scripts&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;If an external script is included multiple times in a page, the browser has to parse and execute the same code multiple times. In some cases the browser will request the file multiple times. This is inefficient and causes the page to load more slowly. This obvious mistake would seem uncommon, but in a review of U.S. Web sites it could be found in two of the top 10 sites. Web sites that have a large number of scripts and a large number of developers are most likely to&lt;br /&gt;suffer from this problem.&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;13. Configure ETags&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;Entity tags (ETags) are a mechanism used by Web clients and servers to verify that a cached resource is valid. In other words, does the resource (image, script, stylesheet, among others) in the browser’s cache match the one on the server? If so, rather than transmitting the entire file (again), the server simply returns a 304 Not Modified status telling the browser to use its locally cached copy. In HTTP/1.0, validity checks were based on a resource’s Last-Modified date: if&lt;br /&gt;the date of the cached file matched the file on the server, then the validation succeeded. ETags were introduced in HTTP/1.1 to allow for validation schemes based on other information, such as version number and checksum.&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;ETags don’t come without a cost. They add extra headers to HTTP requests and responses. The default ETag syntax used in Apache and IIS makes it likely that the validation will erroneously fail if the Web site is hosted on multiple servers. These costs impact performance, making pages slower and increasing the load on Web servers. This is an unnecessary loss of performance,&lt;br /&gt;because most Web sites don’t take advantage of the advanced features of ETags, relying instead on the Last- Modified date as the means of validation. By default, ETags are enabled in popular Web servers (including Apache and IIS). If your Web site doesn’t utilize ETags, it’s best to turn them off in your Web server. In Apache, this is done by simply adding “FileETag none” to your&lt;br /&gt;configuration file&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;"&gt;14. Make Ajax cacheabl&lt;/span&gt;e&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span&gt;Many popular Web sites are moving to Web 2.0 and have begun incorporating Ajax. Ajax requests involve fetching data that is often dynamic, personalized, or both. In the Web 1.0 world, this data is served by the user going to a specified URL and getting back an HTML docu&lt;/span&gt;&lt;span&gt;ment. Because the HTML document’s URL is fi xed (bookmarked, linked to, and so on), it’s necessary to ensure the response is not cached by the browser. This is not the case for Ajax responses. The URL of the Ajax request is included inside the HTML document; it’s not bookmarked or linked to. Developers have the freedom to change the Ajax request’s URL when they generate the page. This allows developers to make Ajax responses cacheable. If an updated version of the Ajax data is available, the cached version is avoided by adding a dynamic variable to the Ajax URL. For example, an Ajax request for the user’s address book could include the time it was last edited as a parameter in the URL, “&amp;amp;edit=1218050433.” As long as the user hasn’t edited their address book, the previously cached Ajax response can continue to be used, making for a faster page.&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;SOurce:&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;This  is a short version of " High-Performance Web Site" article published in ACM communication issue 12 by Steve Souders&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-style: italic;font-size:85%;" &gt;Steve Souders &lt;/span&gt;&lt;span style="font-style: italic;"&gt;&lt;span style="font-size:85%;"&gt;(http://stevesouders.com) works at Google on Web performance and open source initiatives. He is the author of High Performance Web Sites and the creator of YS low, Cuzillion, and Hammerhead. He teaches at Stanford and is the co-founder of the Firebug Working Group&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/232089650532799094-2345456132171001996?l=abeo-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abeo-tech.blogspot.com/feeds/2345456132171001996/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=232089650532799094&amp;postID=2345456132171001996' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/232089650532799094/posts/default/2345456132171001996'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/232089650532799094/posts/default/2345456132171001996'/><link rel='alternate' type='text/html' href='http://abeo-tech.blogspot.com/2008/12/high-performance-web-site.html' title='High-Performance Web Site'/><author><name>Abeo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_eLLXlRUPXes/Sbx2_u1UqEI/AAAAAAAAAHc/9T2mlKf3KpI/S220/ava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-232089650532799094.post-2582317859152027214</id><published>2008-12-10T17:50:00.000-08:00</published><updated>2008-12-10T17:53:42.534-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='quantum cryptography'/><category scheme='http://www.blogger.com/atom/ns#' term='definition'/><category scheme='http://www.blogger.com/atom/ns#' term='articles'/><title type='text'>Quantum Cryptography</title><content type='html'>Key to the quantum industry&lt;br /&gt;&lt;br /&gt;Technology that exploits the strange rules of quantum mechanics to guarantee the security of encrypted messages is the first product of a new quantum-information industry to reach the market, as Andrew Shields and Zhiliang Yuan explain&lt;br /&gt;&lt;br /&gt;As theories go, quantum mechanics has certainly been successful. Despite its many counterintuitive predictions, it has provided an accurate description of the atomic world for more than 80 years. It has also been an essential tool for designing today's computer chips and hard-disk drives, as well as the lasers used in the fibre-optic communications of the Internet. Now, however, the ability to manipulate the quantum states of individual subatomic particles is allowing us to exploit the strange properties of quantum theory much more directly in information technology.&lt;br /&gt;Key to the quantum industry&lt;br /&gt;Key to the quantum industry&lt;br /&gt;&lt;br /&gt;We are used to thinking of information as being abstract, but in fact all information requires a physical medium for its processing, storage and communication. The basic unit of information – a bit that is either "0" or "1" – can be represented physically by, for example, the current in a circuit or light in an optical fibre. As information is represented by ever smaller physical systems, quantum effects become increasingly important. The ultimate limit comes when bits are represented by the quantum state of a single particle, such as the polarization of a photon.&lt;br /&gt;&lt;br /&gt;Applied to information, quantum theory throws up some very odd predictions. These are not only interesting as a test of quantum mechanics, but can also bring us practical applications that are simply impossible with "classical" information technology. For example, a quantum computer would work with bits that can be both "0" and "1" at the same time, allowing it to solve certain mathematical problems – such as factorizing very large numbers – that are virtually intractable using an ordinary computer.&lt;br /&gt;&lt;br /&gt;Although practical quantum computers will take many years to develop, one manifestation of quantum information technology is already a reality: quantum cryptography. This ultra-secure way of sending messages is based on the fundamental postulate that measuring a quantum state will, in general, alter it. Thus, if we encode messages in individual quantum states, such as the phase of photons whizzing down an optical fibre, an eavesdropper who tries to intercept the message cannot avoid changing it. We can therefore test if the message has been read before it reaches the intended recipient – something that is impossible using classical signals.&lt;br /&gt;&lt;br /&gt;The commercial potential of quantum cryptography has attracted private investment in several start-up companies in the US and Europe. The firm id Quantique, for example, spun out from pioneering research at the University of Geneva; while in the US, commercial developments are led by MagiQ Technologies, based in New York and Massachusetts. Recently a third start-up called SmartQuantum has been established in Brittany, France, and major corporate players such as HP, IBM, Mitsubishi, NEC, NTT and Toshiba all have active quantum-cryptography programmes. With several quantum-cryptography products already on the market, the quantum information industry has arrived.&lt;br /&gt;The key to security&lt;br /&gt;&lt;br /&gt;Cryptography is a vital part of today's computer and communication networks, protecting everything from business e-mails to bank transactions and Internet shopping. Information is generally kept secret using a mathematical formula called an encryption algorithm, together with a secret "key" that the sender uses to scramble a message into a form that cannot be understood by an eavesdropper. The recipient then uses the same key – typically a long binary number – with a decryption algorithm to read the message.&lt;br /&gt;&lt;br /&gt;Although modern algorithms such as the Advanced Encryption Standard (AES) are very hard to break without the key, this system suffers from an obvious weakness: the key must be known to both parties. Thus the problem of confidential communication reduces to that of how to distribute these keys securely – the encrypted message itself can then safely be sent along a public channel (figure 1). A common method is to use a trusted courier to transport the key from sender to receiver.&lt;br /&gt;Figure 1&lt;br /&gt;Figure 1&lt;br /&gt;&lt;br /&gt;However, any distribution method that relies on humans is vulnerable to the key being revealed voluntarily or under coercion. In contrast, quantum cryptography, or more accurately quantum key distribution (QKD), provides an automated method for distributing secret keys using standard communication fibres. The revolutionary feature of QKD is that it is inherently secure: assuming that the laws of quantum theory are correct, we can prove that the key cannot be obtained by an eavesdropper without the sender and recipient's knowledge. Furthermore, QKD allows the key to be changed frequently, reducing the threat of key theft or "cryptanalysis", whereby an eavesdropper analyses patterns in the encrypted messages in order to deduce the secret key.&lt;br /&gt;&lt;br /&gt;The first method for distributing secret keys encoded in quantum states was proposed in 1984 by theoretical physicists Charles Bennett at IBM and Gilles Brassard at the University of Montreal. In their "BB84" protocol, a bit of information is represented by the polarization state of a single photon – "0" by horizontal and "1" by vertical, for example. The sender (Alice) transmits a string of polarized single photons to the receiver (Bob) and by carrying out a series of quantum measurements and public communications they are able to establish a shared key and to test whether an eavesdropper (Eve) has intercepted any bits of this key en route.&lt;br /&gt;&lt;br /&gt;The BB84 protocol allows us not only to test for eavesdropping, but also to guarantee that Alice and Bob can establish a secret key even if Eve has determined some of the bits in their shared binary sequence, using a technique called "privacy amplification". Imagine, for example, that Eve knows 10% of the key bits shared by Alice and Bob. Being aware of this, Alice and Bob could then publicly agree to add together (using modular arithmetic) each adjacent pair of bits to form a new sequence of half the length. Eve may also do this, but since she will need to know both bits in a pair in order to correctly determine their sum, she will find that she now shares a much lower fraction of the new bit sequence with Alice and Bob.&lt;br /&gt;&lt;br /&gt;So much for the principle. In practice, generating the pulses of single photons required for BB84 is not easy. Despite recent progress using single atoms or semiconductor quantum dots to generate single photons (see Physics World February 2003 "Single photons on demand"), most practical QKD systems use weak laser pulses to send the bits that make up the key. This method has an Achilles heel: the laser will sometimes generate pulses containing two or more photons, each of which will be in the same quantum state. As a result, Eve could split off one of these photons and measure it, while leaving the other photons in the pulse undisturbed, thus determining part of the key while remaining undetected. Even worse, by blocking the single-photon pulses and allowing only the multi-photon pulses to travel through to Bob, Eve could determine the entire key.&lt;br /&gt;&lt;br /&gt;Until true single-photon sources become available commercially, the most common defence is to strongly attenuate the laser to limit the rate of multi-photon pulses. However, this also means that many pulses contain no photons at all, reducing the rate at which the key can be transmitted. In 2003 a new trick to get round this problem was proposed by Hoi-Kwong Lo at the University of Toronto and Xiang-Bin Wang at the Quantum Computation and Information Project in Tokyo, based on earlier work by Won-Young Hwang at Northwestern University in the US.&lt;br /&gt;&lt;br /&gt;Their idea was to intersperse the signal pulses randomly with some "decoy pulses" that are weaker on average and so very rarely contain a multi-photon pulse. If Eve attempts a pulse-splitting attack, she will therefore transmit a lower fraction of the decoy pulses to Bob than the signal pulses. Thus by monitoring the transmission of the decoy and signal pulses separately, Eve's attack can be detected. This means that stronger laser pulses may be used securely – for instance, last year at Toshiba we demonstrated a 100-fold increase in the rate that keys can be transmitted securely over a 25 km fibre. The decoy-pulse protocol has caused great excitement in the QKD community, with four independent groups having just reported experimental demonstrations of the technique.&lt;br /&gt;&lt;br /&gt;Weak laser pulses are not the only way to carry out quantum cryptography. For example, QKD using a true single-photon source has recently been demonstrated at Stanford University, the CNRS in Orsay and Toshiba. Furthermore, in 1991 Artur Ekert, while a PhD student at the University of Oxford, described an alternative to the BB84 protocol that exploits another counterintuitive prediction of quantum mechanics: entanglement. Pairs of entangled photons have quantum states that are strongly correlated, such that measuring one photon affects the measurement of the other. If Alice and Bob each have one of the pair, they can therefore use their measurements to exchange information. This technique has been demonstrated by researchers at the University of Vienna, the Los Alamos National Laboratory and the University of Geneva, and was even used in 2004 to transfer money between Vienna City Hall and an Austrian bank. However, weak-laser QKD is the most mature approach, and the basis of the commercial QKD systems that are now coming on the market.&lt;br /&gt;Practical QKD&lt;br /&gt;&lt;br /&gt;Information can be encoded in the quantum state of photons in several different ways. The first laboratory demonstration of QKD by Bennett and Brassard in 1989 over 30 cm of air used the polarization state of photons. However, transmitting photons along an optical fibre can randomize their polarization, so a better approach pioneered by Paul Townsend, formerly of BT Labs in the UK, is to alter the phase of the photon. In this method, weak laser pulses are injected into an interferometer by Alice. By applying different voltages to a "phase modulator" in one arm of the interferometer, Alice can encode bits as a phase difference between the two emergent pulses sent to Bob – for example with 0° representing "0" and 180° representing "1". Bob then passes the pulses through another interferometer and determines which of his two detectors, corresponding to "0" and "1", they emerge at (see figure 2).&lt;br /&gt;Figure 2&lt;br /&gt;Figure 2&lt;br /&gt;&lt;br /&gt;For this scheme to work, we must keep the relative lengths of the interfering paths in Alice and Bob's interferometers stable to a few tens of nanometres. However, temperature changes of just a fraction of a degree are enough to upset this balance. An ingenious solution to this problem was introduced by the Geneva group in 1997, which led to the first QKD system suitable for use outside the lab. The idea is to send the laser pulses on a round trip from Bob to Alice and then back to Bob so that any changes in the relative arm lengths are cancelled out. A QKD system based on this design is currently available for about €100,000 from the University of Geneva spin-out company id Quantique.&lt;br /&gt;&lt;br /&gt;At the Toshiba lab in Cambridge, we have developed an alternative compensation technique that allows pulses to be sent just one way, by sending an unmodulated reference pulse along with each signal pulse. These reference pulses are used as a feedback signal to a device that physically stretches the fibre in one of the two arms of the interferometer to compensate for any temperature-induced changes. In trials with the network operator Verizon, the one-way QKD system was continuously operated for over a month without requiring any manual adjustment.&lt;br /&gt;&lt;br /&gt;We can assess the performance of QKD systems by the rate at which secure bits can be exchanged. The faster the secure-bit rate, the more frequently the key can be changed, thus inhibiting cryptanalysis. Typical secure-bit rates for complete QKD systems are in the range 10–50 kbit s–1 for a 20 km fibre link. Although this may seem low compared with the rate data are transferred in optical communications (typically 1–40 Gbit s–1), it is enough for up to 200 AES encryption keys (each of which comprises 256 bits) to be sent per second – sufficient for most cryptographic applications.&lt;br /&gt;&lt;br /&gt;The secure-bit rate that can be achieved decreases with the length of the optical link due to the scattering of photons from the fibre. For this reason, the best performance is usually achieved using photons with a wavelength of 1.55 µm, at which standard optical fibre is most transparent. Even so, when the fibres get so long that the signal rate becomes comparable to the rate of false counts in Bob's photon detector, sending a secure key is no longer possible. For the standard indium gallium arsenide (InGaAs) semiconductor detectors used to detect 1.55 µm photons, this distance is currently about 120 km. Recently the Los Alamos group has used low-noise superconducting detectors to extend secure key distribution to fibres 150 km in length. Significantly, these distances are long enough for almost all the spans found in today's fibre networks.&lt;br /&gt;&lt;br /&gt;Although the risk of cryptanalysis is mitigated by using QKD to frequently refresh the encryption key, it is not eliminated entirely. However, this can be achieved by encrypting the message using a "one-time pad", which requires a random key that contains the same number of bits as the message. Each bit of the message is then encrypted by adding it to the corresponding bit in the key using modular arithmetic. Provided that the key distribution is unconditionally secure, as it is using QKD, and that the key is never reused, the one-time pad is completely immune to attack. The downside is the length of the key that must be exchanged. QKD bit rates are already sufficient to allow unconditionally secret voice communication using the one-time pad. In the future, higher bit rates will allow this security to be extended to other forms of data.&lt;br /&gt;&lt;br /&gt;Today's secure-bit rates are limited by how often the InGaAs detectors can detect a photon   currently once every 100 ns. Silicon-based photon detectors can operate almost 1000 times faster, but they are only sensitive to shorter-wavelength photons. As the quality of InGaAs detectors improves over the next few years, we can expect their frequency to catch up with that of silicon, leading to QKD bit rates that are orders of magnitude higher. In the interim, there are encouraging results showing that non-linear crystals may be used to shift 1.55 µm photons to shorter wavelengths for which the faster silicon detectors may be used. Higher detection rates have also been demonstrated using superconducting nanowire detectors, and recent advances with detectors based on quantum dots are also encouraging.&lt;br /&gt;Towards a quantum network&lt;br /&gt;&lt;br /&gt;One of the first real-life applications of QKD has been to secure fibre links between corporate sites in a city. Companies are increasingly using high-bandwidth optical connections between offices, data centres, server farms and disaster-recovery sites to obtain the speed and convenience of a local area network over a larger geographical area. In the early days of fibre deployment, immunity to "tapping" of sensitive data was often cited as a key advantage of fibre over copper cable. But in fact, eavesdropping on optical fibres can be accomplished by simply introducing a small bend in the fibre to extract a portion of the light; and, in the absence of quantum cryptography, it is almost impossible to detect.&lt;br /&gt;&lt;br /&gt;At Toshiba, we have developed a "link encryptor" that can send data at 1 Gb s–1 between corporate sites, combining AES data encryption with secure key distribution using one-way QKD (figure 3). Meanwhile, id Quantique announced that it will install its "Vectis" link encryptor between the two centres of data-hosting company IX Europe in Zurich. In the US, MagiQ Technologies has recently developed its own encrypted link, targeted at government applications including the military, intelligence gathering and homeland security.&lt;br /&gt;Figure 3&lt;br /&gt;Figure 3&lt;br /&gt;&lt;br /&gt;An important next step will be extending QKD from single point-to-point links into a "quantum network" for key distribution. Networks allow a company to connect multiple sites securely and to add new sites for an incremental cost. Moreover, they allow the range of QKD to be increased from the length of a single fibre link to any distance covered by the network, and safeguard against outages of individual links by automatically routing traffic around them.&lt;br /&gt;&lt;br /&gt;In October 2003 BBN Technologies set up a primitive but pioneering QKD network in Cambridge, Massachusetts, linking their site with Harvard and Boston Universities. The firm showed that it was possible to direct the stream of single photons between different receiving units using an optical switch, and it also introduced the idea of "key relay" along a chain of trusted nodes. Here, each pair of adjacent nodes in the chain stores its own local key. A global key may then be sent from one end of the chain to the other, over any distance, by using the local keys and a one-time pad to encrypt each hop.&lt;br /&gt;&lt;br /&gt;A more sophisticated system is currently under development by the European SECOQC consortium, a collaboration of academic and industrial QKD researchers, classical cryptographers and telecoms engineers. It is developing the protocols required for routing, storage and management of keys within a meshed network that could in principle be very large. A trial implementation of the quantum net is planned in 2008 that will allow any two users at several sites across Vienna to establish a shared key.&lt;br /&gt;&lt;br /&gt;These QKD networks assume that the intermediate nodes are secure, which is realistic if the network is operated by a single service provider. In the future, however, we can relax this condition using a device called a "quantum repeater". Quantum repeaters are based on the principle of quantum "teleportation", whereby a quantum state is transferred from one location to another, in principle over an arbitrary distance, using a pair of entangled particles. Recent developments such as a semiconductor device for generating entangled photon pairs and the teleportation of quantum states between photons and atoms bring the quantum repeater closer to becoming a reality.&lt;br /&gt;&lt;br /&gt;Meanwhile, an alternative to using a fibre-optic network to send quantum keys over long distance may be to use free-space links to low-orbit communication satellites. In 2006 a collaboration between researchers at the universities of Vienna, Munich and Bristol implemented a free-space link over 144 km between Tenerife and La Palma.&lt;br /&gt;Selling quantum cryptography&lt;br /&gt;&lt;br /&gt;From the first laboratory demonstrations over 30 cm of air to the latest fibre-based systems operating over 100 km, QKD has certainly come a long way in the last two decades. The technology has shrunk into compact units the size of typical network equipment and is fully automated. But despite the technical progress there are significant barriers to the adoption of new cryptographic technologies.&lt;br /&gt;&lt;br /&gt;A particular problem for QKD is selling technology based on quantum mechanics to clients who often know little about physics and are used to traditional cryptography. Another hurdle is the lack of a security certification process for the equipment. Users need reassurance not only that QKD is theoretically sound, but also that it has been securely implemented by the vendors. It is encouraging that there are several initiatives under way to establish common security standards for QKD.&lt;br /&gt;&lt;br /&gt;As the market for QKD develops, we can expect that the price of equipment will drop significantly. Within 10 years we may see QKD used not only in corporate and government networks, but also in networks serving home users. Optical fibres are already used to deliver television, phone and Internet services to domestic users in several countries. Although current QKD systems are too expensive for such applications, they may become viable if miniaturization to microchip-scale and mass-production lead to the expected price reductions. The days when the products of the quantum-information industry serve every household may not be too distant.&lt;br /&gt;The BB84 protocol&lt;br /&gt;The BB84 protocol&lt;br /&gt;The BB84 protocol&lt;br /&gt;&lt;br /&gt;Quantum cryptography is a way of generating a shared secret key that can be used to encrypt and decrypt messages, for example by encoding information in the polarization state of individual photons. In the BB84 protocol, the sender (Alice) transmits photons to the recipient (Bob) in one of four different polarization states: horizontal (H), vertical (V), diagonal (D, 45°) and anti-diagonal (A, –45°). For each photon she sends, Alice randomly selects one of these polarizations, with H or D representing the bit value "0" (red) and V or A representing "1" (blue), depending on the "basis" she chooses. To measure the photons, Bob is equipped with an analyser that can distinguish either between H and V (+) or between A and D (×). He randomly (and independently from Alice) chooses which analyser he will use to measure each photon. If Bob selects the analyser that is compatible with Alice's choice (top), he will determine the photon's polarization, and thus the bit value, with certainty. If, on the other hand, Bob measures with the "wrong" analyser (middle), he will obtain a random result.&lt;br /&gt;&lt;br /&gt;It seems problematic that half of Bob's measurements result in a random bit value. However, Alice and Bob have a cunning solution. After Bob's measurements have taken place, he reveals the sequence of analysers that he used. Alice then tells him which times he used the correct analyser, without revealing the bit that she sent. They can then discard all the measurements for which Bob used the wrong analyser, ensuring that they share the same bit sequence without any errors (in the absence of noise or imperfections).&lt;br /&gt;&lt;br /&gt;This post-selection leaves an eavesdropper (Eve) at a disadvantage since she must guess which analyser to use to measure each photon (bottom). Inevitably Eve will sometimes select an analyser that is incompatible with Alice's choice of polarization, and thus may obtain a result that differs from the bit Alice sent. The key to the secrecy of quantum cryptography is that by making this measurement, Eve inevitably changes the quantum state of the photon. Therefore, when Bob receives the photon, he will sometimes determine an erroneous bit value even when he and Alice used compatible measurements. By examining a small sample of their bit sequence for errors, Alice and Bob can therefore determine whether an eavesdropper was present.&lt;br /&gt;At a Glance: Quantum cryptography&lt;br /&gt;&lt;br /&gt;    * The quantum states of individual subatomic particles can be used to encode information, opening up applications in communication and computing&lt;br /&gt;    * The most mature application of quantum theory to information processing is quantum cryptography, with products already on the market&lt;br /&gt;    * Quantum cryptography, also known as quantum key distribution, allows us to send encrypted messages the secrecy of which can be guaranteed by allowing an eavesdropper to be detected&lt;br /&gt;    * Secure messages have been sent over distances in excess of 100 km using quantum cryptography with photons carried by optical fibres&lt;br /&gt;    * The next step will be to establish a "quantum network" that could allow quantum cryptography to cover cities and eventually the globe&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/232089650532799094-2582317859152027214?l=abeo-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abeo-tech.blogspot.com/feeds/2582317859152027214/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=232089650532799094&amp;postID=2582317859152027214' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/232089650532799094/posts/default/2582317859152027214'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/232089650532799094/posts/default/2582317859152027214'/><link rel='alternate' type='text/html' href='http://abeo-tech.blogspot.com/2008/12/quantum-cryptography.html' title='Quantum Cryptography'/><author><name>Abeo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_eLLXlRUPXes/Sbx2_u1UqEI/AAAAAAAAAHc/9T2mlKf3KpI/S220/ava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-232089650532799094.post-2580014602463103829</id><published>2008-12-09T23:30:00.000-08:00</published><updated>2008-12-10T04:23:00.662-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>.htaccess File</title><content type='html'>Stronger Security&lt;br /&gt;&lt;br /&gt;We set the access on your public_html directory so that the files inside public_html could be read by the web server, in fact the files are quite exposed. It is possible for other students to read the contents of your directory and steal your work.&lt;br /&gt;&lt;br /&gt;When you use the chmod command to allow the web server access to files in your public_html directory, you are also allowing other students to view the files in your public_html directory as well. This is because the chmod command treats the web server user ("wwwsrv") and other students usernames as the same (i.e. they both fall into the "other" category for chmod).&lt;br /&gt;&lt;br /&gt;What you really want to do is just allow the web server to be able to read your public_html directory and its contents, not all of the other students. New versions of Unix provide a mechanism called ACLs (Access Control Lists) to allow you to give permissions for specific users to access files/directories.&lt;br /&gt;Protecting your Files - ACLs (Access Control Lists) and .htaccess&lt;br /&gt;&lt;br /&gt;This procedure to set up acl protection is entirely optional. You don't have to do it if you don't want to. However, it is recommended that you do it.&lt;br /&gt;&lt;br /&gt;There is a supplementary mechanism for protecting html files involving a file called .htaccess. The .htaccess procedure acts to protect your files and should also be used as well as setfacl. An outline of how to use .htaccess protection is detailed in the next section.&lt;br /&gt;If you want your files to be completely protected you need acl and htaccess protection&lt;br /&gt;The easiest way to set up ACL Protection&lt;br /&gt;&lt;br /&gt;ACLs in their native form are quite complex. At FIT we have created a program that makes using ACLs easier.&lt;br /&gt;&lt;br /&gt;     (a) First clear all ACLs on your home directory and public_html.&lt;br /&gt;         "c" means "clear"&lt;br /&gt;         "r" means "recursive"&lt;br /&gt;&lt;br /&gt;           acl -c ~&lt;br /&gt;           acl -cr ~/public_html&lt;br /&gt;   &lt;br /&gt;&lt;br /&gt;     (b) Set the normal Unix permissions back to protected/safe ones&lt;br /&gt;         using the chmod command:&lt;br /&gt;&lt;br /&gt;           chmod 700 ~&lt;br /&gt;           chmod -R 700 ~/public_html&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     (c) Allow the "wwwsrv" user only to access your public_html&lt;br /&gt;         directory, and don't allow it to write to your public_html&lt;br /&gt;         directory either, only read/execute ("rx" permission).&lt;br /&gt;         "a" means "add"&lt;br /&gt;         "r" means "recursive"&lt;br /&gt;&lt;br /&gt;           acl -a wwwsrv=rx ~&lt;br /&gt;           acl -r -a wwwsrv=rx ~/public_html&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;     (d) Check the ACL and it should show that the wwwsrv user has&lt;br /&gt;         read and execute permission, the user/owner has all permissions,&lt;br /&gt;         but the group and others have none.&lt;br /&gt;         If you provide no parameters to the "acl" command it just&lt;br /&gt;         shows you what the current ACL is.&lt;br /&gt;&lt;br /&gt;           acl ~&lt;br /&gt;           acl ~/public_html&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;For protecting your work, particularly when doing assignments that require creating web pages, the best approach is to use chmod to make sure all access for other people are removed, then use ACLs to selectively grant access to the files/directories you want to make public (and to specific users like 'wwwsrv').&lt;br /&gt;&lt;br /&gt;Note that when you use ACLs to protect your web content, it means that the other users cannot open your files by changing directory into your public_html directory and opening them up in a text editor. However it does not stop other students from viewing your pages on the web, through a browser.&lt;br /&gt;Setfacl - An alternative way to set up ACL protection&lt;br /&gt;&lt;br /&gt;The procedure will not alter the visibility of your pages to web browsers, but it will mean that the contents of protected directories will not be able to be read by normal command line unix procedures by anyone other than the owner of the files. It's a better arrangement than the existing one.&lt;br /&gt;&lt;br /&gt;OK here's what you need to do to set up setfacl:&lt;br /&gt;&lt;br /&gt;(1) logon to your account on charlie using ssh. (from the FIT Labs, work, or home it doesn't matter).&lt;br /&gt;&lt;br /&gt;(2) Decide which directories and files in your public_html directory you want to protect. Let's say for the sake of example that you want to protect them all. (That's probably the best policy)&lt;br /&gt;&lt;br /&gt;(3) run the command:&lt;br /&gt;&lt;br /&gt;chmod 700 public_html&lt;br /&gt;&lt;br /&gt;This will change the access to your public_html directory to owner can read, write and execute, but no-one else can do anything. So your files are completely inaccessible to anyone other than you.&lt;br /&gt;&lt;br /&gt;(4) The Apache web Server on charlie needs access however. This can be done by running the command:-&lt;br /&gt;&lt;br /&gt;setfacl -r -m u:wwwsrv:r-x public_html&lt;br /&gt;&lt;br /&gt;This allows the user wwwsrv to also have access to the public_html directory as well as the files inside. wwwsrv is the system user for the Apache Web server running on charlie.&lt;br /&gt;&lt;br /&gt;Note also that the permissions of the files and directories inside public_html don't have to be changed.&lt;br /&gt;&lt;br /&gt;(5) Check that you can still access the web pages inside your public_html directory by pointing a browser at your home pages.&lt;br /&gt;&lt;br /&gt;OK, that's all you have to do. If you are really interested in what's happening you can have a look at the man page for setfacl on charlie. An alternative way of setting up acl protection is outlined below. This alternative method was provided by Dr Wayne Brookes.&lt;br /&gt;Setting up htaccess protection&lt;br /&gt;&lt;br /&gt;If you have implemented the acl mechanism correctly, then your public_html directory cannot be accessed by other users from the command line. However, there is still a problem. Users can point their web browser at your home page and view your source html by using the view source option on the browser. One way to plug this security hole is to use the .htaccess mechanism.&lt;br /&gt;&lt;br /&gt;You have to create two files. One in the directory that you want to restrict access to. This file is called .htaccess (Note the full stop at the start of the filename - it's important). So if you wanted to restrict access to your public_html directory the .htaccess file will be in your public_html directory.&lt;br /&gt;&lt;br /&gt;The format of the file is :-&lt;br /&gt;&lt;br /&gt;AuthName "Enter user name and password for access"&lt;br /&gt;AuthUserFile /home/jsmith/misc/.allowed.users&lt;br /&gt;AuthType Basic&lt;br /&gt;require user test xyz abc&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Please note that in the above .htaccess file, there are three authorised users. These are test, xyz and abc. There is no user called "user".&lt;br /&gt;&lt;br /&gt;The last line shows the login names of the users that you are allowing to access the dirctory. The AuthUserFile directive specifies the location and name of the file containing the passwords of the three authorised users test, xyz and abc. In the example above the password file is .allowed.users and it's in the directory /home/jsmith/misc/ directory. You have to create this password file. This can be done easily by typing in :-&lt;br /&gt;&lt;br /&gt;cd&lt;br /&gt;mkdir misc&lt;br /&gt;cd misc&lt;br /&gt;touch .allowed.users&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Once you have created this file you have to add encrypted passwords. You can do this by using the utility htpasswd.&lt;br /&gt;&lt;br /&gt;You execute this command with 2 arguments. These are the path and name of the file to contain the passwords and the name of the user you want to add to the file. So, to continue our example, you would enter :&lt;br /&gt;&lt;br /&gt;htpasswd /home/jsmith/misc/.allowed.users test&lt;br /&gt;&lt;br /&gt;This will prompt you for the password for test. You can add in the other&lt;br /&gt;users abc and xyx by substituting abc and xyz for test when you call&lt;br /&gt;htpasswd.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;The last thing to do is set the permissions on .htaccess and .allowed.users. You can do this by using the chmod 644 .allowed.users and chmod 644 .htaccess You should also make sure you chmod 755 the misc directory.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/232089650532799094-2580014602463103829?l=abeo-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abeo-tech.blogspot.com/feeds/2580014602463103829/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=232089650532799094&amp;postID=2580014602463103829' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/232089650532799094/posts/default/2580014602463103829'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/232089650532799094/posts/default/2580014602463103829'/><link rel='alternate' type='text/html' href='http://abeo-tech.blogspot.com/2008/12/htaccess-file.html' title='.htaccess File'/><author><name>Abeo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_eLLXlRUPXes/Sbx2_u1UqEI/AAAAAAAAAHc/9T2mlKf3KpI/S220/ava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-232089650532799094.post-8608567698312291154</id><published>2008-12-09T18:16:00.000-08:00</published><updated>2008-12-09T18:17:13.385-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='UTS short Course'/><title type='text'>UTS short Course</title><content type='html'>Java Programming Advanced (J2EE)&lt;br /&gt;&lt;br /&gt;Advanced Java Programming teaches some of the foundation skills required for building medium to large scale web-based applications, with a B2B e-commerce focus.&lt;br /&gt;&lt;br /&gt;For further information and registration please click here or contact Francoise Ware on 9514 2154 or email fware@it.uts.edu.au&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/232089650532799094-8608567698312291154?l=abeo-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abeo-tech.blogspot.com/feeds/8608567698312291154/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=232089650532799094&amp;postID=8608567698312291154' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/232089650532799094/posts/default/8608567698312291154'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/232089650532799094/posts/default/8608567698312291154'/><link rel='alternate' type='text/html' href='http://abeo-tech.blogspot.com/2008/12/uts-short-course.html' title='UTS short Course'/><author><name>Abeo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_eLLXlRUPXes/Sbx2_u1UqEI/AAAAAAAAAHc/9T2mlKf3KpI/S220/ava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-232089650532799094.post-8978684317080505489</id><published>2008-12-09T05:14:00.000-08:00</published><updated>2008-12-09T05:21:24.433-08:00</updated><title type='text'>My Career</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_eLLXlRUPXes/ST5weEu4UDI/AAAAAAAAAHE/DjCDSfJ2X2I/s1600-h/My+Career.png"&gt;&lt;img style="cursor:pointer; cursor:hand;width: 320px; height: 227px;" src="http://1.bp.blogspot.com/_eLLXlRUPXes/ST5weEu4UDI/AAAAAAAAAHE/DjCDSfJ2X2I/s320/My+Career.png" border="0" alt=""id="BLOGGER_PHOTO_ID_5277779475293556786" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/232089650532799094-8978684317080505489?l=abeo-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abeo-tech.blogspot.com/feeds/8978684317080505489/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=232089650532799094&amp;postID=8978684317080505489' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/232089650532799094/posts/default/8978684317080505489'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/232089650532799094/posts/default/8978684317080505489'/><link rel='alternate' type='text/html' href='http://abeo-tech.blogspot.com/2008/12/my-career.html' title='My Career'/><author><name>Abeo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_eLLXlRUPXes/Sbx2_u1UqEI/AAAAAAAAAHc/9T2mlKf3KpI/S220/ava.jpg'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_eLLXlRUPXes/ST5weEu4UDI/AAAAAAAAAHE/DjCDSfJ2X2I/s72-c/My+Career.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-232089650532799094.post-5215559536384978391</id><published>2008-12-02T03:16:00.000-08:00</published><updated>2008-12-02T03:21:29.583-08:00</updated><title type='text'>Apature</title><content type='html'>Link: http://www.apture.com&lt;br /&gt;&lt;br /&gt;I came across the video about new web service which use wikipedia and other webservice to serve an article.&lt;br /&gt;&lt;br /&gt;I'm gonna use it for vds-nsw.com&lt;br /&gt;&lt;br /&gt;tuanbkit@gmail.com&lt;br /&gt;Pw: MyHoney09&lt;br /&gt;&lt;br /&gt;&lt;script id='aptureScript' type="text/javascript" src="http://www.apture.com/js/apture.js?siteToken=hHI66cN" charset='utf-8'&gt;&lt;/script&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/232089650532799094-5215559536384978391?l=abeo-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abeo-tech.blogspot.com/feeds/5215559536384978391/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=232089650532799094&amp;postID=5215559536384978391' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/232089650532799094/posts/default/5215559536384978391'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/232089650532799094/posts/default/5215559536384978391'/><link rel='alternate' type='text/html' href='http://abeo-tech.blogspot.com/2008/12/apature.html' title='Apature'/><author><name>Abeo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_eLLXlRUPXes/Sbx2_u1UqEI/AAAAAAAAAHc/9T2mlKf3KpI/S220/ava.jpg'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-232089650532799094.post-8618917345689559841</id><published>2008-11-15T00:39:00.001-08:00</published><updated>2008-11-15T00:49:51.786-08:00</updated><title type='text'>Code Spelunking: Exploring Cavernous Code Bases</title><content type='html'>&lt;span class="content"&gt;&lt;b&gt;&lt;i&gt;by George V. Neville-Neil, Consultant&lt;/i&gt;&lt;/b&gt;&lt;/span&gt; &lt;h5&gt;Code diving through unfamiliar source bases is something we do far more often than write new code from scratch--make sure you have the right gear for the job.&lt;/h5&gt;&lt;p&gt; Try to remember your first day at your first software job. Do you recall what you were asked to do, after the human resources people were done with you? Were you asked to write a piece of fresh code? Probably not. It is far more likely that you were asked to fix a bug, or several, and to try to understand a large, poorly documented collection of source code.&lt;/p&gt;&lt;p&gt; Of course, this doesn't just happen to new graduates; it happens to all of us whenever we start a new job or look at a new piece of code. With experience we all develop a set of techniques for working with large, unfamiliar source bases. This is what I call code spelunking.&lt;/p&gt;&lt;p&gt; Code spelunking is very different from other engineering practices because it is done long after the initial design and implementation of a system. It is a set of forensic techniques used after the crime has been committed.&lt;/p&gt;&lt;p&gt; There are several questions that code spelunkers need to ask, and tools are available to help them answer these questions. I will look at some of these tools, addressing their shortcomings and pointing out possible improvements.&lt;/p&gt;  &lt;h4&gt; SIZE DOES MATTER &lt;/h4&gt;  &lt;p&gt; Source bases are already large, and getting larger all the time. Table 1 shows the sizes of some popular open source software. The Linux kernel, with support for 17 different processor architectures, is made up of 642 directories, 12,417 files, and more than 5 million lines of code. A complex network server such as Apache is made up of 28 directories and 471 files--encompassing over 158,000 lines of code--whereas an application such as the nvi editor contains 29 directories, 265 files, and over 77,000 lines of code. I believe that these examples are fairly honest representations of what people are confronted with when they start a job.&lt;/p&gt;&lt;p&gt; Of course, even larger systems exist for scientific, military, and financial applications, but those shown in table 1 are more familiar and should help convey an instinctive feeling for the complexity involved in systems that we all come in contact with every day.&lt;/p&gt;&lt;p&gt; Unfortunately, the tools we have to work with often lag behind the code we are trying to explore. There are several reasons for this, but the primary one is that very few companies have been able to build a thriving business on tools. It is much easier to make money selling software that appeals to a broad audience, which software tools do not.&lt;/p&gt;  &lt;!--pagebreak--&gt;  &lt;p&gt; &lt;strong&gt;Static vs. dynamic.&lt;/strong&gt; We can use two scales to compare code spelunking tools and techniques. The first one ranges from static analysis at one end to dynamic analysis at the other. In static analysis you're not observing a running program but are examining only the source code. A clear example is using the tools find, grep, and wc to give you a better idea of the size of the source code (as was done to produce table 1). A code review is an example of a static technique. You print the code, sit down at a table with it, and begin to read.&lt;/p&gt;  &lt;p&gt; On the dynamic end of the scale are tools such as debuggers. Here you run the code on real data, using one program (the debugger) to examine another as it executes. Another dynamic tool is a software oscilloscope, which displays a multithreaded program as a series of horizontal time lines--like those on a real oscilloscope--to find deadlocks, priority inversions, and other bugs common to multithreaded programs. Oscilloscopes are used mostly in embedded systems.&lt;/p&gt;&lt;p&gt; &lt;strong&gt;Brute force vs. subtlety.&lt;/strong&gt; The second type of scale measures the level of finesse that is applied to spelunking. At one extreme is a brute-force approach, which often consumes a lot of CPU time or which might generate a large amount of data. An example of brute force is attempting to find a bug by using grep to locate a message that prints out near to where the error occurs.&lt;/p&gt;  &lt;br /&gt;  &lt;table border="0" cellpadding="3" cellspacing="0" width="480"&gt; &lt;tbody&gt;&lt;tr&gt; &lt;td colspan="5"&gt;&lt;strong&gt;Table 1 Sizes of Popular Software&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;&lt;strong&gt;Program&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;Version&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;Directories&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;Files&lt;/strong&gt;&lt;/td&gt; &lt;td&gt;&lt;strong&gt;Lines&lt;/strong&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt; Apache Web Server&lt;/td&gt; &lt;td&gt;1.3 &lt;/td&gt; &lt;td&gt;28&lt;/td&gt; &lt;td&gt;471 &lt;/td&gt; &lt;td&gt;158,332&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;DB &lt;/td&gt; &lt;td&gt;1.4.25 &lt;/td&gt; &lt;td&gt;176 &lt;/td&gt; &lt;td&gt;234 &lt;/td&gt; &lt;td&gt;99,836&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Emacs &lt;/td&gt; &lt;td&gt;21 &lt;/td&gt; &lt;td&gt;43 &lt;/td&gt; &lt;td&gt;2586 &lt;/td&gt; &lt;td&gt;1,317,915&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;FreeBSD Kernel &lt;/td&gt; &lt;td&gt;5.1 &lt;/td&gt; &lt;td&gt;420 &lt;/td&gt; &lt;td&gt;4758 &lt;/td&gt; &lt;td&gt;2,140,517&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Linux Kernel &lt;/td&gt; &lt;td&gt;2.4.20-8 &lt;/td&gt; &lt;td&gt;642 &lt;/td&gt; &lt;td&gt;12,417 &lt;/td&gt; &lt;td&gt;5,223,290&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Nvi &lt;/td&gt; &lt;td&gt;1.81.5 &lt;/td&gt; &lt;td&gt;29&lt;/td&gt; &lt;td&gt; 265 &lt;/td&gt; &lt;td&gt;77,176&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td&gt;Python &lt;/td&gt; &lt;td&gt;2.2.3 &lt;/td&gt; &lt;td&gt;245 &lt;/td&gt; &lt;td&gt;1158 &lt;/td&gt; &lt;td&gt;356,314&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt; &lt;td colspan="5"&gt;Note: Every attempt was made to disregard documentation or other files not directly related to the source code.&lt;/td&gt; &lt;/tr&gt; &lt;/tbody&gt;&lt;/table&gt;  &lt;p&gt; At the other end of the finesse scale is subtlety. A subtle approach to finding a string within a program involves a tool that builds a database of all the interesting components of a code base (e.g., function name, structure definitions, and the like).You then use that tool to generate a fresh database each time you update your source from the code repository. You would also use it when you want to know something about the source, as it already has the information you need at its virtual fingertips.&lt;/p&gt;&lt;p&gt; &lt;strong&gt;Plotting your method.&lt;/strong&gt; You can use both of these scales to create a two-dimensional graph in which the x-axis represents finesse and the y-axis runs from static to dynamic. You can then plot tools and techniques on this graph so that they can be compared (see figure 1). None of the terms used implies value judgments on the techniques. Sometimes a static, brute-force approach is just what you want. If it would take just as long (or longer) to set up a tool to do some subtle analysis, a brute-force approach makes sense. You don't often get points for style when code spelunking; people just want results. &lt;/p&gt; &lt;p&gt; One thing to keep in mind when code spelunking is the Scout motto, "Be prepared." A little effort spent up front getting your tools in place will always save time in the long run. After a while, all engineers develop a stable of tools that they use to solve problems. I have a few tools that I always keep on hand when code spelunking, and I make sure to prepare the ground with them whenever I start a project. These tools include Cscope and global, which I'll discuss in more detail later.&lt;/p&gt;  &lt;!--pagebreak--&gt;  &lt;p&gt; A very common scenario in code spelunking is attempting to fix a bug in an unfamiliar piece of code. Debugging is a highly focused task: You have a program, it runs, but not correctly. You must find out why it does this, where it does this, and then repair it. What's wrong with the program is usually your only known quantity. Finding the needle buried in the haystack is your job, so the first question must be, "Where does the program make a mistake?"&lt;/p&gt; &lt;p&gt; You can approach the problem in several ways, many of which are shown in figure 1. The approach you choose depends on the situation. If the program is a single file, you could probably find the bug through inspection, but as table 1 demonstrates, any truly useful application is much larger than a single file.&lt;br /&gt;&lt;/p&gt; &lt;p&gt; Let's take a theoretical example. Jack takes a job with the Whizzo Company, which produces WhizzoWatcher, a media player application that can play and decode many types of entertainment content. On his first day at work (after he has signed up for health insurance, the stock plan, and 401K) Jack's boss e-mails him two bug reports to deal with.&lt;/p&gt;&lt;p&gt; The two bugs that Jack has just been assigned are as follows:&lt;/p&gt; &lt;ul&gt;&lt;li&gt; Bug 1: When WhizzoWatcher opens a file of type X it immediately crashes with no output except a core file.&lt;/li&gt;&lt;li&gt; Bug 2: While watching a long movie on DVD (The Lord of the Rings, The Two Towers) the audio sync is lost after about two hours. This does not happen at any particular frame; it varies.&lt;/li&gt;&lt;/ul&gt; &lt;p&gt; WhizzoWatcher 1.0 is a typically organic piece of software. Originally conceived as a "prototype," it wowed the VPs and investors and was immediately rushed into production over the objections of the engineers who had written it. It has little or no design documentation, and what exists is generally inaccurate and out of date. The only real source of information on the program is the code itself. Because this was a prototype, several pieces of open source software were integrated into the larger whole and were expected to be replaced when the "real system" was funded. The total system now consists of about 500 files that spread over 15 directories, some of which were written in-house and some of which were integrated.&lt;/p&gt;  &lt;!--pagebreak--&gt;  &lt;p&gt; &lt;strong&gt;Bug 1.&lt;/strong&gt; This is the easiest bug for Jack to work on; the program crashes when it starts. He can run it in the debugger, and the offending line will be found at the next crash. In terms of code spelunking, he doesn't have to look at much of the code at first, although becoming generally familiar with the code base will help him in the long run.&lt;/p&gt; &lt;p&gt; Unfortunately, Jack finds that although the reason for the immediate crash is obvious, what caused it is not. A common cause of crashes in C code is dereferencing a null pointer. At this point in the debugger, Jack doesn't have the previous states of the program, only the state at the moment it crashed, which is actually a very small amount of data. A common technique is to visually inspect the code while stepping up the stack trace to see if some caller stomped on the pointer. &lt;/p&gt;&lt;p&gt; A debugger that could step backward, even over a small number of instructions, would be a boon in this situation. On entry into a function the debugger would create enough storage for all of the function's local variables and the application's global variables so that they could be recorded, statement by statement, throughout the function. When the debugger stopped (or the program crashed), it would be possible to step backward up to the start of the function to find out which statement caused the error. For now, Jack is left to read the code and hope to stumble across the real cause of the error.&lt;/p&gt;&lt;p&gt; &lt;strong&gt;Bug 2.&lt;/strong&gt; Attacking Bug 2, where the code doesn't crash but only produces incorrect results, is more difficult because there isn't a trivial way to get a debugger to show you when to stop the program and inspect it. If Jack's debugger supports conditional breakpoints and watchpoints, then these are his next line of defense. A watchpoint or a conditional breakpoint tells the debugger to stop when something untoward happens to a variable, and allows Jack to inspect the code at a point closest to where the problem occurs.&lt;/p&gt; &lt;p&gt; Once Jack has found the problem, it's time to fix it. The key is to fix the bug without breaking anything else in the system. A thorough round of testing is one way to address this problem, but he'll feel more comfortable making a fix if he can find out more about what it affects in the system. Jack's next question ought to be, "Which routines call the routine I want to fix?"&lt;/p&gt;&lt;p&gt; Attempting to answer this question with the debugger will not work, because Jack cannot tell from the debugger all the sources that will call the offending routine. This is where a subtle, static approach bears fruit. The tool Cscope builds a database out of a chunk of code and allows him to do the following:&lt;/p&gt; &lt;ol&gt;&lt;li&gt; Find a C symbol&lt;/li&gt;&lt;li&gt; Find a global definition&lt;/li&gt;&lt;li&gt; Find functions called by a function&lt;/li&gt;&lt;li&gt;Find functions calling a function&lt;/li&gt;&lt;li&gt; Find a text string&lt;/li&gt;&lt;li&gt; Change a text string&lt;/li&gt;&lt;li&gt; Find an egrep pattern&lt;/li&gt;&lt;li&gt; Find a file&lt;/li&gt;&lt;li&gt; Find all files that #include this file&lt;/li&gt;&lt;/ol&gt; &lt;p&gt; You will note that item 4, "Find functions calling a function," answers his question. If the routine he's about to fix modifies nonlocal variables or structures, he must next answer the question, "With which functions does my function share data?" This would never come up in a "properly designed program" (i.e., one written from scratch). Jack would never use a horde of global variables to control his program, because he knows what a nightmare it would be to maintain. Right?&lt;/p&gt;&lt;p&gt; Of course, this is code spelunking, so Jack is already past that point. Using a subtle tool such as Cscope again is tempting, but this turns out to be a case where brute force is his best hope. Generating a list of all the global references in a program (file name and line number) is certainly possible for a compiler, but none of them do this. Although this option would hardly be used in the creation of new code, it would make the process of debugging old code far easier. Jack will have to make do with a combination of find and grep to figure out where all these variables reside in the program.&lt;/p&gt;  &lt;!--pagebreak--&gt;  &lt;p&gt; Code spelunking isn't something you do only when debugging; it's how you perform a good code review, reverse-engineer a design document, and conduct a security audit.&lt;/p&gt;&lt;p&gt; During an age when many people use computers for financial and personal transactions, auditing code for security holes has (or should) become commonplace. In order to close these security holes, you have to know what the common attacks are, as well as which sections of the code are vulnerable to attack. Although the attacks are updated almost daily on the Bugtraq mailing list (&lt;a href="http://www.securityfocus.com/"&gt;http://www.securityfocus.com&lt;/a&gt;), what we're concerned with is finding them.&lt;/p&gt; &lt;p&gt; Consider the following example. Jill takes a job with a large bank that serves most of its customers electronically, over the Internet. On her first day her boss tells her that the bank is doing a security audit of its entire system, which is implemented on several different types of hardware and operating systems. One set of Unix servers handles incoming Web traffic and then makes requests to a mainframe backend that actually manages the real money.&lt;/p&gt;&lt;p&gt; One possible security hole occurs when a program stores a user's private data in a way that makes it available to anyone with access to the machine. An example of this is storing a password as plain text in a file or registry key. If Jill had written the software, or had access to the person who did, she could quickly find out where the program stores passwords simply by asking. Unfortunately, the person who wrote the login scripts was laid off when the bank moved its headquarters six months ago. Jill will have to find out how this is done without the author's help.&lt;/p&gt;&lt;p&gt; Unlike in the debugging case, few tools are available to tell Jill something as specific as, "Where does the program store data X?" Depending on the structure of the program, this could happen anywhere--and often does. Jill can tackle this problem with either a brute-force or a subtle approach. To do the former she would litter the code with debugging statements (i.e., printfs or language equivalent) to find out where the program stores the password. She probably has a few guesses to narrow the field from the entire program down to a few or a dozen locations, but this is still a good deal of work.&lt;/p&gt;&lt;p&gt; A more subtle approach would be to run the program in the debugger, attempt to stop the program right after the user enters a password, and then follow the execution until the program performs the storage operation.&lt;/p&gt;&lt;p&gt; A typical way to attack a program is to give it bad input. To find these vulnerabilities, Jill must ask the question, "Where does the program read data from an untrustworthy source?" Most people would immediately think that any code dealing with network data would be vulnerable, and they would be right--in part. With the advent of networked file systems, the fact that the code is executing a read() statement does not imply that it is reading from a local (i.e., trustable) source.&lt;/p&gt;&lt;p&gt; Whereas Jack's debugging in my earlier example attempted to zero in on a problem, Jill's code audit is more of a "fan-out." She wants to see as much of the code as possible and understand how it interacts both with its own modules ("How is data passed around?") and with external entities ("Where do we read and write data?"). This can be an even more daunting task than finding a needle in a haystack, and may be more like labeling all the individual straws. In this case, the most important thing for Jill to do is to find the most likely places that will cause problems--that is, the places that are executed most often.&lt;/p&gt;&lt;p&gt; There is a tool that, although not originally intended for this purpose, can help to focus Jill's efforts: a code profiler. For example, gprof was originally written to tell an engineer which routines within the program are using up all the CPU time and are, therefore, candidates for optimization. The program is run with a workload (let a user bang on it or have it service requests from the network), and then the output is analyzed. A profiler will tell Jill which routines are being called most often. These are obviously the routines to check first. There is no reason for Jill to pore over the large portion of the code that is called infrequently while the routines called most often may have gaping holes.&lt;/p&gt;&lt;p&gt; Routines that pass bad arguments to system calls are another common security problem. This is most often exploited against network servers in an effort to gain control over a remote machine. Several commercial tools attempt to discover these kinds of problems. A quick and dirty approach is to use a system call tracer, such as ktrace or truss, to make a record of what system calls are executed and what their arguments are. This can give you a good idea of where possible errors lie.&lt;/p&gt;  &lt;!--pagebreak--&gt;  &lt;p&gt; Code spelunking is about asking questions. The challenge is to get your fingers around the right parts of the code and find the answers without having to look at every line (which is a near impossibility anyway). There is one tool I haven't yet mentioned in this article, and that's the one sitting inside your head. You can begin applying good engineering practices even though they weren't used to create the code you're spelunking. &lt;/p&gt;&lt;p&gt; Keeping a journal of notes on what you've found and how things work will help you to create, and keep in mind, a picture of how the software you're exploring works. Drawing pictures is also a great help; these should be stored electronically along with your notes. Good experiment design of the type you may have learned--and then promptly forgotten--in physics class is also helpful. Just beating on a piece of code until it works is not an efficient way of figuring it out. Setting up an experiment to see why the code behaves a certain way may take a lot of thought, but usually very little code. &lt;/p&gt;&lt;p&gt; Finally, one of my favorite tools is the "stupid programmer trick." You get a colleague to look at the code and then you attempt to explain to him or her what the code does. Nine times out of ten your colleague won't even need to say anything. Fairly quickly you realize what's going on, smack yourself on the forehead, say thank you, and go back to work. Through the process of systematically explaining the code out loud, you have figured out the problem. &lt;/p&gt;&lt;p&gt; There is no one tool that will make understanding large code bases easier, but I hope that I've shown you a few ways to approach this task. I suspect you'll find more on your own. &lt;/p&gt;  &lt;!--pagebreak--&gt;  &lt;p&gt; &lt;a href="http://www.gnu.org/software/global/"&gt;Global&lt;/a&gt; &lt;/p&gt;  &lt;p&gt; This is the tool I apply to every source base that I can. Global is really a pair of tools: gtags and htags. The first, gtags, builds a database of interesting connections based on a source tree in C, C++, Java, or Yacc. Once the database is built, you can use your editor (both Emacs and vi are supported) to jump around within the source. Want to know where the function you're calling is defined? Just jump to it. The second tool is htags, which takes the source code and the database generated by gtags and creates an HTML-browsable version of the source code in a subdirectory. This means that, even if you don't use Emacs or vi, you can easily jump around the source code finding interesting connections. Building the database is relatively speedy, even for large code bases, and should be done each time you update your sources from your source-code control system. &lt;/p&gt;  &lt;p&gt; &lt;a href="http://cscope.sourceforge.net/"&gt;Cscope&lt;/a&gt; &lt;/p&gt;  &lt;p&gt; Cscope was originally written at AT&amp;amp;T Bell Labs in the 1970s. It answers many questions, such as: Where is this symbol? Where is something globally defined? Where are all the functions called by this function? Where are all the functions that call this function? Like Global, it first builds a database from your source code. You can then use a command-line tool, Emacs, or one of a few GUIs written to work with the system to get your questions answered. &lt;/p&gt;  &lt;p&gt; &lt;a href="http://www.gnu.org/manual/gprof-2.9.1/gprof.html"&gt;gprof&lt;/a&gt; &lt;/p&gt;  &lt;p&gt; This is the standard profiling tool on most open source Unix systems. Its output is a list of routines ordered by how often they were called and how much of the program's CPU time was spent executing them. This can be useful in figuring out where to start looking for security holes in a program. &lt;/p&gt;  &lt;p&gt; ktrace &lt;/p&gt;  &lt;p&gt; This is a standard tool on open source operating systems. The name stands for "kernel trace." It will give you a listing of all the system calls made by a program. The output includes the arguments and return values given to and received from the calls. You use ktrace by running a program under it and then dumping the output with kdump. It is available on all open source Unix operating systems. &lt;/p&gt;  &lt;p&gt; &lt;a href="http://wwws.sun.com/software/solaris/programs/abi/"&gt;truss&lt;/a&gt; &lt;/p&gt; &lt;p&gt; This is available only on Solaris. It is the Solaris version of ktrace--basically the same tool, with different arguments. &lt;/p&gt;  &lt;p&gt; &lt;a href="http://www.codespelunking.org/"&gt;code spelunking&lt;/a&gt; &lt;/p&gt; &lt;p&gt; This Web site contains a TWiki collaboration page dedicated to code spelunking.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;Link: &lt;a href="http://www.codespelunking.org/"&gt;Code Spelunking&lt;/a&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/232089650532799094-8618917345689559841?l=abeo-tech.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://abeo-tech.blogspot.com/feeds/8618917345689559841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=232089650532799094&amp;postID=8618917345689559841' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/232089650532799094/posts/default/8618917345689559841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/232089650532799094/posts/default/8618917345689559841'/><link rel='alternate' type='text/html' href='http://abeo-tech.blogspot.com/2008/11/technical-blog.html' title='Code Spelunking: Exploring Cavernous Code Bases'/><author><name>Abeo</name><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='27' height='32' src='http://1.bp.blogspot.com/_eLLXlRUPXes/Sbx2_u1UqEI/AAAAAAAAAHc/9T2mlKf3KpI/S220/ava.jpg'/></author><thr:total>0</thr:total></entry></feed>
