<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"> <channel><title>SitePoint</title> <link>http://www.sitepoint.com</link> <description>News, opinion, and fresh thinking for web developers and designers. The official podcast of sitepoint.com.</description> <lastBuildDate>Mon, 27 Feb 2012 02:44:53 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.2.1</generator> <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/SitepointFeed" /><feedburner:info uri="sitepointfeed" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>Tried Value-Based Pricing? Try Value-Based Buying</title><link>http://feedproxy.google.com/~r/SitepointFeed/~3/T5Njpwu1KQQ/</link> <comments>http://www.sitepoint.com/tried-value-based-pricing-try-value-based-buying/#comments</comments> <pubDate>Sun, 26 Feb 2012 23:00:01 +0000</pubDate> <dc:creator>John Tabita</dc:creator> <category><![CDATA[Business]]></category> <category><![CDATA[Find Clients]]></category> <category><![CDATA[Get Started]]></category> <category><![CDATA[Sell Your Services]]></category> <category><![CDATA[Selling Web Design Services]]></category> <category><![CDATA[Web Pro Business]]></category> <category><![CDATA[Work Smarter]]></category> <category><![CDATA[clients]]></category> <category><![CDATA[freelance]]></category> <category><![CDATA[freelancing]]></category> <category><![CDATA[price quoting]]></category> <category><![CDATA[pricing]]></category> <category><![CDATA[sales]]></category> <category><![CDATA[selling]]></category> <category><![CDATA[selling your services]]></category> <guid isPermaLink="false">http://www.sitepoint.com/?p=51589</guid> <description><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/value-based-buying-50x50.jpg" class="attachment-thumbnail wp-post-image" alt="value-based-buying" title="value-based-buying" />Last week, I talked about four methods to avoid when setting your prices. So what should you base your pricing on? The answer, of course, is the ever-elusive value. The Case for Value-Based Pricing Value-based pricing is determining how much the project is worth to your client in revenue, or how much the problem is [...]]]></description> <content:encoded><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/value-based-buying-50x50.jpg" class="attachment-thumbnail wp-post-image" alt="value-based-buying" title="value-based-buying" /><p></p><p>Last week, I talked about <a
title="What Should You Charge? 4 Methods to Avoid" href="http://www.sitepoint.com/what-should-you-charge-4-methods-to-avoid/" target="_blank">four methods to avoid when setting your prices</a>. So what <em>should</em> you base your pricing on? The answer, of course, is the ever-elusive <em><strong>value</strong></em>.</p><h2>The Case for Value-Based Pricing</h2><p>Value-based pricing is determining how much the project is worth to your client in revenue, or how much the problem is costing, then charging a portion thereof. For example, if a client had an IT problem that had been costing him $10,000 month for the past six months, then charging him 25 percent of that would not seem unreasonable. Some people believe value-based pricing is an unrealistic ideal that never really worked in the “real” world—especially in today’s economy. Yet, there are many industries where value-based pricing is commonplace. <a
title="The Case for Value Based Fees in “Stubborn” Professions" href="http://www.contrarianconsulting.com/the-case-for-value-based-fees-in-stubborn-professions/" target="_blank">Alan Weiss</a> pioneered the concept in the early 90s and continues to use it today, so it’s difficult to write it off as “fantasy.” (Besides, it’s hard to argue with someone who holds a PhD.)<div
id='div-gpt-ad-1328644474660-10' style='width:728px; height:90px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-10'); });</script> </div></p><p>Can value-based pricing be implemented in the web industry? Weiss has taught accountants and architects how to bill based on value, so why not web designers? I never tried it, even after reading his book. I told myself it was too difficult to implement in the web industry because what we do is not unique. You&#8217;re free to learn how it’s done, or convince yourself it doesn’t work without even trying, as I did.</p><h2>Value-Based Buying</h2><p>Whether or not you embrace value-based pricing, you’ll be hard-pressed to successfully sell your services without <strong><em>value-based buying</em></strong>. That’s when clients choose to hire you based on no other criteria other than the value you provide.</p><blockquote><p>Pricing your product is actually simple, as long as you consider it from the buyer’s point of view. How much it costs you to make something is irrelevant. They don’t care …</p><p>- <a
title="Seth's Blog | The pricing formula" href="http://sethgodin.typepad.com/seths_blog/2012/01/the-pricing-formula-ss.html" target="_blank">Seth Godin</a></p></blockquote><p>When we consider it from <em>our</em> point of view, we look at our skillset and ask, “How can I sell this?” But the proper question is: “How does this serve the market?”</p><p>You see, up until now, the focus has been on pricing and selling: How do I price my services? How much should I charge? Let’s change the focus to <em>why people buy</em>.</p><blockquote><p>“Who do people buy?” is a thousand times more important than “How do I sell?” No, let me correct that … it’s one million times more important than “How do I sell?” No, let me correct that … it’s one billion times more important than “How do I sell?” Get the picture?</p><p>It never ceases to amaze me that companies will spend thousands of hours and millions of dollars teaching people “how to sell,” and not one minute or ten dollars on “why they buy.” And “why they buy” is all that matters.</p></blockquote><h3>Value First; Price Second</h3><p>That’s from Jeffrey Gitomer’s <a
title="Jeffrey Gitomer’s Little Red Book of Selling: 12.5 Principles of Sales Greatness" href="http://www.gitomer.com/Jeffrey-Gitomer-Little-Red-Book-of-Selling-pluLRB.html" target="_blank">Little Red Book of Selling</a>, in which he lists 12.5 reasons “why they buy,” such as:</p><ol><li>“I perceive a value in the product I am purchasing.”</li><li>“I perceive this product or service will increase my profit or productivity.”</li></ol><p>Any work for which someone’s willing to pay you <strong><em>must create value</em></strong>; and value <a
title="It Works!" href="http://www.sitepoint.com/%E2%80%9Cit-works%E2%80%9D/" target="_blank">isn’t always about money</a> &#8230; but it <em>is</em> always about <strong>increases</strong> or <strong>decreases</strong>. If you can increase or decrease something your prospect <em>wants</em> increased or decreased, you have the potential to create value.</p><p>Formula are great for determining a base price or “cost” you won’t go below, but there are some crucial steps you must follow before “coming up with a price” for the client:</p><ol><li>Ask yourself, <em>What value can I create?</em></li><li>Have <a
title="Understanding the Sales Cycle: Uncovering Needs" href="http://www.sitepoint.com/understanding-the-sales-cycle-uncovering-needs/" target="_blank">a fact-finding conversation</a> to discover what he wants increased and/or decreased.</li><li>Make sure you <a
title="Seven Questions You Aren’t Asking that Will Cost You the Sale" href="http://www.sitepoint.com/seven-questions-you-aren%E2%80%99t-asking-that-will-cost-you-the-sale/" target="_blank">ask the right questions</a>.</li><li>Do a <a
title="Sell Like a Third-Grader: How 2 + 2 Equals More Clients" href="http://www.sitepoint.com/sell-like-a-third-grader/" target="_blank">return on investment analysis</a> to show him the economic benefits he will get from your solution.</li><li>Once you know what he wants, show him how <a
title="Selling Yourself: What’s Your Secret Sauce?" href="http://www.sitepoint.com/selling-yourself-what%e2%80%99s-your-secret-sauce/" target="_blank">you are the one</a> who can help him get it.</li></ol><p>Then, and only then, should you talk about price.</p><p
style="text-align: right"><em><a
href="http://www.sxc.hu/profile/svilen001" target="_blank">Image credit</a></em></p><div
style='padding:20px 0px 50px 0px;'><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-1' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-1'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-2' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-2'); });</script> </div></div><div
style='clear:both'></div><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-3' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-3'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-4' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-4'); });</script> </div></div></div><div
style='clear:both'></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=T5Njpwu1KQQ:_zAI7k0bbSw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=T5Njpwu1KQQ:_zAI7k0bbSw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=T5Njpwu1KQQ:_zAI7k0bbSw:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?i=T5Njpwu1KQQ:_zAI7k0bbSw:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SitepointFeed/~4/T5Njpwu1KQQ" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://www.sitepoint.com/tried-value-based-pricing-try-value-based-buying/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://www.sitepoint.com/tried-value-based-pricing-try-value-based-buying/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=tried-value-based-pricing-try-value-based-buying</feedburner:origLink></item> <item><title>DesignFestival: CSS3 Animations, Photoshop Alternatives, and More</title><link>http://feedproxy.google.com/~r/SitepointFeed/~3/g87mHaxrz8I/</link> <comments>http://www.sitepoint.com/designfestival-css3-animations-photoshop-alternatives-and-more/#comments</comments> <pubDate>Sat, 25 Feb 2012 01:11:05 +0000</pubDate> <dc:creator>Aaron Osteraas</dc:creator> <category><![CDATA[Web Tech]]></category> <guid isPermaLink="false">http://www.sitepoint.com/?p=51746</guid> <description><![CDATA[Playing with Fire: Organic CSS3 Animation Create a flickering fire animation without the use of plugins or videos using this impressive tutorial. CSS3 animations can add a lot of aesthetic appeal for just a few small kilobytes of imagery and code How to Customize Your Google+ Profile to Match Your Brand Google+ won&#8217;t give you [...]]]></description> <content:encoded><![CDATA[<p></p><h2><a
href="http://designfestival.com/playing-with-fire-organic-css3-animation/">Playing with Fire: Organic CSS3 Animation</a></h2><p>Create a flickering fire animation without the use of plugins or videos using this impressive tutorial. CSS3 animations can add a lot of aesthetic appeal for just a few small kilobytes of imagery and code</p><hr
/><h2><a
href="http://designfestival.com/how-to-customize-your-google-plus-profile-to-match-your-brand/">How to Customize Your Google+ Profile to Match Your Brand</a></h2><p>Google+ won&#8217;t give you complete control of your page design, but with a few creative tricks and some brand images, you can craft a professional Google+ presence for your clients and colleagues.</p><hr
/><h2><a
href="http://designfestival.com/creating-seamless-background-patterns-for-the-web/">Creating Seamless Background Patterns for the Web</a></h2><p>Seamless textures and patterns are an easy way to enhance your design without bogging down your site with heavy, slow-loading background imagery. Learn how to make your own seamless background in this tutorial.</p><hr
/><h2><a
href="http://designfestival.com/implementing-cross-browser-video-playback-in-html5/">Implementing Cross-browser Video Playback in HTML5</a></h2><p>There are times when YouTube just won&#8217;t cut it for your specialized video needs. For greater control over your videos, host them yourself using HTML5 and fallback techniques for older browsers.<div
id='div-gpt-ad-1328644474660-10' style='width:728px; height:90px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-10'); });</script> </div></p><hr
/><h2><a
href="http://designfestival.com/5-tips-for-feminine-designs/">5 Tips for Feminine Designs</a></h2><p>A savvy designer will keep their audience in mind from the first sketch to the final pixel. Here you&#8217;ll find five tips for creating websites with feminine appeal</p><hr
/><h2><a
href="http://designfestival.com/have-you-tried-pixelmator/">Have you tried Pixelmator?</a></h2><p>Photoshop is as powerful as it is expensive. Using it for basic image work like cropping and adding text is probably overkill. But have you tried this affordable Photoshop alternative?</p><hr
/><div
style='padding:20px 0px 50px 0px;'><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-1' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-1'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-2' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-2'); });</script> </div></div><div
style='clear:both'></div><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-3' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-3'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-4' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-4'); });</script> </div></div></div><div
style='clear:both'></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=g87mHaxrz8I:tVev95vsU-w:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=g87mHaxrz8I:tVev95vsU-w:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=g87mHaxrz8I:tVev95vsU-w:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?i=g87mHaxrz8I:tVev95vsU-w:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SitepointFeed/~4/g87mHaxrz8I" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://www.sitepoint.com/designfestival-css3-animations-photoshop-alternatives-and-more/feed/</wfw:commentRss> <slash:comments>3</slash:comments> <feedburner:origLink>http://www.sitepoint.com/designfestival-css3-animations-photoshop-alternatives-and-more/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=designfestival-css3-animations-photoshop-alternatives-and-more</feedburner:origLink></item> <item><title>How to Create a CSS3-Only Horizontal Accordion Using the :target Selector</title><link>http://feedproxy.google.com/~r/SitepointFeed/~3/Gn0t43qKZXU/</link> <comments>http://www.sitepoint.com/css3-horizontal-accordion-using-target-selector/#comments</comments> <pubDate>Thu, 23 Feb 2012 14:46:51 +0000</pubDate> <dc:creator>Craig Buckler</dc:creator> <category><![CDATA[CSS Tutorials]]></category> <category><![CDATA[HTML & CSS]]></category> <category><![CDATA[HTML5]]></category> <category><![CDATA[CSS]]></category> <category><![CDATA[CSS3]]></category> <category><![CDATA[HTML5 Dev Center]]></category> <category><![CDATA[HTML5 Tutorials & Articles]]></category> <guid isPermaLink="false">http://www.sitepoint.com/?p=51076</guid> <description><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/637-css3-accordion-horz-50x50.png" class="attachment-thumbnail wp-post-image" alt="637-css3-accordion-horz" title="637-css3-accordion-horz" />Craig's latest tutorial demonstrates how to create a horizontal accordion using CSS3 alone with the power of the :target selector and transitions.]]></description> <content:encoded><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/637-css3-accordion-horz-50x50.png" class="attachment-thumbnail wp-post-image" alt="637-css3-accordion-horz" title="637-css3-accordion-horz" /><p></p><p>The <a
href="http://www.sitepoint.com/css3-target-selector/">CSS3 :target selector</a> is incredibly powerful and allows us to create attractive widgets which would have required ninja-like JavaScript skills a few years ago. We&#8217;ve already built a <a
href="http://www.sitepoint.com/css3-tabs-using-target-selector">tab control</a> and a <a
href="http://www.sitepoint.com/css3-vertical-accordion-using-target-selector">vertical accordion</a>. In this post, we&#8217;ll create a horizontal accordion using the same HTML5 markup.</p><p><a
href="http://blogs.sitepointstatic.com/examples/tech/css3-target/accordionhorz.html"><strong>View the demonstration page&hellip;</strong></a></p><p>The solution works in IE9, Chrome, Firefox, Safari and Opera and doesn&#8217;t require JavaScript or images. Again, it fails miserably in IE6, 7 and 8 so you either need a JavaScript shim such as <a
href="http://selectivizr.com/">selectivizr</a> or some other fallback.</p><h2>The HTML</h2><p>Here&#8217;s a reminder of the HTML5 code. It&#8217;s identical to our vertical accordion: there are a number of <code>section</code> elements with clickable headings contained in the initial <code>h2</code> tag:</p><pre><code>
&lt;article class=&quot;accordion&quot;&gt;
	&lt;section id=&quot;acc1&quot;&gt;
		&lt;h2&gt;&lt;a href=&quot;#acc1&quot;&gt;Title One&lt;/a&gt;&lt;/h2&gt;
		&lt;p&gt;This content appears on page 1.&lt;/p&gt;
	&lt;/section&gt;
	&lt;section id=&quot;acc2&quot;&gt;
		&lt;h2&gt;&lt;a href=&quot;#acc2&quot;&gt;Title Two&lt;/a&gt;&lt;/h2&gt;
		&lt;p&gt;This content appears on page 2.&lt;/p&gt;
	&lt;/section&gt;
	&lt;section id=&quot;acc3&quot;&gt;
		&lt;h2&gt;&lt;a href=&quot;#acc3&quot;&gt;Title Three&lt;/a&gt;&lt;/h2&gt;
		&lt;p&gt;This content appears on page 3.&lt;/p&gt;
	&lt;/section&gt;
	&lt;section id=&quot;acc4&quot;&gt;
		&lt;h2&gt;&lt;a href=&quot;#acc4&quot;&gt;Title Four&lt;/a&gt;&lt;/h2&gt;
		&lt;p&gt;This content appears on page 4.&lt;/p&gt;
	&lt;/section&gt;
	&lt;section id=&quot;acc5&quot;&gt;
		&lt;h2&gt;&lt;a href=&quot;#acc5&quot;&gt;Title Five&lt;/a&gt;&lt;/h2&gt;
		&lt;p&gt;This content appears on page 5.&lt;/p&gt;
	&lt;/section&gt;
&lt;/article&gt;
</code></pre><h2>The CSS</h2><p>The CSS is a little more complex but it&#8217;s worth it. First we style our outer <code>article</code> container:<div
id='div-gpt-ad-1328644474660-10' style='width:728px; height:90px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-10'); });</script> </div></p><pre><code>
article.accordion
{
	display: block;
	width: 43em;
	margin: 0 auto;
	background-color: #666;
	overflow: auto;
	border-radius: 5px;
	box-shadow: 0 3px 3px rgba(0,0,0,0.3);
}
</code></pre><p>Each section starts in its closed state; they&#8217;re floated to the left and have a width of 2em. Overflow is set to <em>hidden</em> and we&#8217;re also making the text color the same as the background so they effectively look like solid blocks without content:</p><pre><code>
article.accordion section
{
	position: relative;
	display: block;
	float: left;
	width: 2em;
	height: 12em;
	margin: 0.5em 0 0.5em 0.5em;
	color: #333;
	background-color: #333;
	overflow: hidden;
	border-radius: 3px;
}
</code></pre><p>Now for some nasty prefixed CSS3! Each <code>h2</code> title is rotated 90&deg; counter-clockwise using a transform and absolutely positioned over the closed <code>section</code>:</p><pre><code>
article.accordion section h2
{
	position: absolute;
	font-size: 1em;
	font-weight: bold;
	width: 12em;
	height: 2em;
	top: 12em;
	left: 0;
	text-indent: 1em;
	padding: 0;
	margin: 0;
	color: #ddd;
	-webkit-transform-origin: 0 0;
	-moz-transform-origin: 0 0;
	-ms-transform-origin: 0 0;
	-o-transform-origin: 0 0;
	transform-origin: 0 0;
	-webkit-transform: rotate(-90deg);
	-moz-transform: rotate(-90deg);
	-ms-transform: rotate(-90deg);
	-o-transform: rotate(-90deg);
	transform: rotate(-90deg);
}
article.accordion section h2 a
{
	display: block;
	width: 100%;
	line-height: 2em;
	text-decoration: none;
	color: inherit;
	outline: 0 none;
}
</code></pre><p>We can now &#8216;open&#8217; the active section using the :target selector. The <code>section</code> width and colors are changed and the title is moved back to the top:</p><pre><code>
article.accordion section:target
{
	width: 30em;
	padding: 0 1em;
	color: #333;
	background-color: #fff;
}
article.accordion section:target h2
{
	position: static;
	font-size: 1.3em;
	text-indent: 0;
	color: #333;
	-webkit-transform: rotate(0deg);
	-moz-transform: rotate(0deg);
	-ms-transform: rotate(0deg);
	-o-transform: rotate(0deg);
	transform: rotate(0deg);
}
</code></pre><p>That&#8217;s fine, but a CSS3 transition makes it look fantastic:</p><pre><code>
article.accordion section,
article.accordion section h2
{
	-webkit-transition: all 1s ease;
	-moz-transition: all 1s ease;
	-ms-transition: all 1s ease;
	-o-transition: all 1s ease;
	transition: all 1s ease;
}
</code></pre><p><a
href="http://blogs.sitepointstatic.com/examples/tech/css3-target/accordionhorz.html"><strong>View the demonstration page&hellip;</strong></a></p><p>It&#8217;s a shame IE6, 7 and 8 users can&#8217;t use the widget. IE9 users won&#8217;t see animation either. But you&#8217;d need a lot of time and patience to achieve the same effect using JavaScript! Have fun with it.</p><div
style='padding:20px 0px 50px 0px;'><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-1' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-1'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-2' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-2'); });</script> </div></div><div
style='clear:both'></div><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-3' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-3'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-4' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-4'); });</script> </div></div></div><div
style='clear:both'></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=Gn0t43qKZXU:GErILBLPA0s:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=Gn0t43qKZXU:GErILBLPA0s:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=Gn0t43qKZXU:GErILBLPA0s:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?i=Gn0t43qKZXU:GErILBLPA0s:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SitepointFeed/~4/Gn0t43qKZXU" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://www.sitepoint.com/css3-horizontal-accordion-using-target-selector/feed/</wfw:commentRss> <slash:comments>9</slash:comments> <feedburner:origLink>http://www.sitepoint.com/css3-horizontal-accordion-using-target-selector/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=css3-horizontal-accordion-using-target-selector</feedburner:origLink></item> <item><title>HTTP Debugging with Node and http-console</title><link>http://feedproxy.google.com/~r/SitepointFeed/~3/131JOcBF88E/</link> <comments>http://www.sitepoint.com/http-debugging-with-node-and-http-console/#comments</comments> <pubDate>Thu, 23 Feb 2012 03:29:23 +0000</pubDate> <dc:creator>Ian Oxley</dc:creator> <category><![CDATA[JavaScript]]></category> <category><![CDATA[javascript]]></category> <category><![CDATA[node.js]]></category> <category><![CDATA[nodejs]]></category> <guid isPermaLink="false">http://www.sitepoint.com/?p=51563</guid> <description><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2010/07/node-50x50.png" class="attachment-thumbnail wp-post-image" alt="node" title="node" />http-console is a Node module that gives you a command-line interface for executing HTTP commands. It&#8217;s great for debugging and seeing exactly what is going on with your HTTP requests, regardless of whether they&#8217;re made against a web server, web service, or even a database server. Installation To use http-console you&#8217;ll need to have Node [...]]]></description> <content:encoded><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2010/07/node-50x50.png" class="attachment-thumbnail wp-post-image" alt="node" title="node" /><p></p><p>http-console is a Node module that gives you a command-line interface for executing HTTP commands. It&#8217;s great for debugging and seeing exactly what is going on with your HTTP requests, regardless of whether they&#8217;re made against a web server, web service, or even a database server.</p><h2>Installation</h2><p>To use http-console you&#8217;ll need to have Node installed. If you haven&#8217;t got it installed either head over to <a
href="http://nodejs.org">http://nodejs.org</a> and download the installer for your operating system, or head over to the Node wiki if you&#8217;d prefer to <a
href="https://github.com/joyent/node/wiki/Installing-Node.js-via-package-manager">install via a package manager</a>.</p><p>Next, install http-console using <a
href="http://npmjs.org/">npm</a>:</p><pre><code>
$&gt; npm install http-console2 -g
</code></pre><p>A couple of things to note:</p><ul><li>We&#8217;re actually installing <a
href="https://github.com/mmalecki/http-console2">http-console2</a>, and not <a
href="https://github.com/cloudhead/http-console">http-console</a>. http-console2 is a fork of http-console, but includes a fix for a <a
href="https://github.com/cloudhead/http-console/pull/30">bug</a> caused by <code>require.paths</code> being deprecated in newer versions of Node. It&#8217;s published to npm as http-console2, but once installed you still run it as http-console.</li><li><p>We&#8217;re installing http-console2 with the <code>-g</code> global switch. This means you can call http-console from anywhere, as it&#8217;s installed in a location in your <code>$PATH</code>:<div
id='div-gpt-ad-1328644474660-10' style='width:728px; height:90px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-10'); });</script> </div></p><pre><code>
$&gt; type http-console
http-console is /usr/local/bin/http-console
</code></pre></li></ul><p>To start using http-console we just pass it the URL and port of whatever it is we want to connect to, and start issuing HTTP commands.</p><h2>Speaking HTTP</h2><p>Let&#8217;s connect to a server and issue some commands. We&#8217;ll keep things simple to start with and issue some <code>GET</code> requests to a web server. I&#8217;ll assume that, as you&#8217;re reading this, you&#8217;re a web developer. And, as you&#8217;re a web developer, you&#8217;ve probably got a web server running on <a
href="http://localhost">http://localhost</a>. Tell http-console to connect to it by typing in the following:</p><pre><code>$&gt; http-console http://localhost
&gt; http-console 0.6.1
&gt; Welcome, enter .help if you're lost.
&gt; Connecting to localhost on port 80.
</code></pre><p>Now you&#8217;re connected you can start issuing commands. Type in <code>GET /</code> at the prompt:</p><pre><code>http://localhost:80/&gt; GET /
HTTP/1.1 200 OK
Server: nginx/1.0.11
Date: Wed, 04 Jan 2012 08:40:04 GMT
Content-Type: text/html
Content-Length: 151
Last-Modified: Mon, 04 Oct 2004 15:04:06 GMT
Connection: keep-alive
Accept-Ranges: bytes
&lt;html&gt;
&lt;head&gt;
&lt;title&gt;Welcome to nginx!&lt;/title&gt;
&lt;/head&gt;
&lt;body bgcolor="white" text="black"&gt;
&lt;center&gt;&lt;h1&gt;Welcome to nginx!&lt;/h1&gt;&lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;
</code></pre><p>We get back the full HTTP response, including the HTTP headers, and the HTML itself. You can exit http-console by typing <code>.q</code></p><p>Let&#8217;s try another command. Recently I wrote about the <a
href="http://www.sitepoint.com/express-yourself/">express web framework for Node</a>, we created a page to display the ten most recent tweets mentioning Sitepoint. I wonder what would happen if we use http-console to query Twitter&#8217;s Search API for similar tweets?</p><pre><code>$&gt; http-console http://search.twitter.com
&gt; http-console 0.6.1
&gt; Welcome, enter .help if you're lost.
&gt; Connecting to search.twitter.com on port 80.
</code></pre><p>Now issue a <code>GET</code> request for <code>/search.json?q=sitepoint&amp;rpp=10</code>:</p><pre><code>http://search.twitter.com:80/&gt; GET /search.json?q=sitepoint&amp;rpp=10
HTTP/1.1 200 OK
Cache-Control: max-age=15, must-revalidate, max-age=300
Expires: Fri, 17 Feb 2012 22:04:02 GMT
Content-Type: application/json;charset=utf-8
Content-Length: 7749
Vary: Accept-Encoding
Date: Fri, 17 Feb 2012 21:59:02 GMT
X-Varnish: 2065334673
Age: 0
Via: 1.1 varnish
Server: tfe
{
    page: 1,
    since_id: 0,
    max_id_str: '170628259464216576',
    refresh_url: '?since_id=170628259464216576&amp;q=sitepoint',
    completed_in: 0.107,
    results: [
        {
            to_user_id_str: null,
            to_user_name: null,
            id: 170628259464216580,
            iso_language_code: 'en',
            ...
</code></pre><p>Again, we get back the HTTP headers, but this time we get the body of the HTTP response as JSON (the full JSON is omitted to save space).</p><p>But we&#8217;re not restricted to connecting to web servers and web services with http-console. We can also use it to connect to database servers that offer RESTful API&#8217;s, such as <a
href="http://couchdb.apache.org/">CouchDB</a>. (If you don&#8217;t have CouchDB installed, the easiest way to get up and running is to clone <a
href="https://github.com/iriscouch/build-couchdb">https://github.com/iriscouch/build-couchdb</a> and following the instructions in README.md).</p><p>Assuming CouchDB is running (if you installed via <a
href="https://github.com/iriscouch/build-couchdb">build-couchdb</a> starting CouchDB should be as simple as running <code>. ~/path/to/build-couchdb/build/env.sh</code>, then <code>couchdb</code>), connect http-console to it like so:</p><pre><code>$&gt; http-console http://127.0.0.1:5984
&gt; http-console 0.6.1
&gt; Welcome, enter .help if you're lost.
&gt; Connecting to 127.0.0.1 on port 5984.
</code></pre><p>We can then issue commands against the database. Let&#8217;s get a list of all the databases:</p><pre><code>http://127.0.0.1:5984/&gt; GET /_all_dbs
HTTP/1.1 200 OK
Server: CouchDB/1.1.1 (Erlang OTP/R15B)
Date: Wed, 04 Jan 2012 08:26:18 GMT
Content-Type: text/plain;charset=utf-8
Content-Length: 25
Cache-Control: must-revalidate
[ '_replicator', '_users' ]
</code></pre><p>How about creating a new database?</p><pre><code>http://127.0.0.1:5984/&gt; PUT /foodb
...
HTTP/1.1 201 Created
Server: CouchDB/1.1.1 (Erlang OTP/R15B)
Location: http://127.0.0.1/foodb
Date: Wed, 04 Jan 2012 09:19:05 GMT
Content-Type: text/plain;charset=utf-8
Content-Length: 12
Cache-Control: must-revalidate
{ ok: true }
</code></pre><p>Re-issue the <code>GET /_all_dbs</code> command, and we&#8217;ll see our new database listed:</p><pre><code>http://127.0.0.1:5984/&gt; GET /_all_dbs
HTTP/1.1 200 OK
Server: CouchDB/1.1.1 (Erlang OTP/R15B)
Date: Wed, 04 Jan 2012 09:19:18 GMT
Content-Type: text/plain;charset=utf-8
Content-Length: 33
Cache-Control: must-revalidate
[ '_replicator', '_users', 'foodb' ]
</code></pre><p>Now let&#8217;s add a document to the <code>foodb</code> database. We&#8217;ll need to set the Content-Type header to <code>application/json</code>, which is easily done by issuing the <code>.j</code> command (to see all available commands type <code>.help</code> at the http-console prompt):</p><pre><code>http://127.0.0.1:5984/&gt; .j
http://127.0.0.1:5984/&gt; POST /foodb
... { "name":"foo", "body":"bar" }
HTTP/1.1 201 Created
Server: CouchDB/1.1.1 (Erlang OTP/R15B)
Location: http://127.0.0.1/foodb/d4a833a173e9d22594b426fd300010a9
Date: Wed, 04 Jan 2012 09:36:30 GMT
Content-Type: text/plain;charset=utf-8
Content-Length: 95
Cache-Control: must-revalidate
{
    ok: true,
    id: 'd4a833a173e9d22594b426fd300010a9',
    rev: '1-de4f3804f6f3d2d3a393bec924951e5a'
}
</code></pre><p>We can issue <code>HEAD</code> requests to get info about documents, <code>DELETE</code> requests to delete documents, and <code>DELETE</code> requests to delete databases:</p><pre><code>http://127.0.0.1:5984/&gt; HEAD /foodb/d4a833a173e9d22594b426fd300010a9
HTTP/1.1 200 OK
Server: CouchDB/1.1.1 (Erlang OTP/R15B)
Etag: "1-de4f3804f6f3d2d3a393bec924951e5a"
Date: Wed, 04 Jan 2012 09:36:51 GMT
Content-Type: text/plain;charset=utf-8
Content-Length: 113
Cache-Control: must-revalidate
http://127.0.0.1:5984/&gt; DELETE /foodb/d4a833a173e9d22594b426fd300010a9?rev=1-de4f3804f6f3d2d3a393bec924951e5a
HTTP/1.1 200 OK
Server: CouchDB/1.1.1 (Erlang OTP/R15B)
Etag: "2-3ac7397737175948b7a3a6b7e95d2949"
Date: Wed, 04 Jan 2012 09:40:14 GMT
Content-Type: text/plain;charset=utf-8
Content-Length: 95
Cache-Control: must-revalidate
{
    ok: true,
    id: 'd4a833a173e9d22594b426fd300010a9',
    rev: '2-3ac7397737175948b7a3a6b7e95d2949'
}
http://127.0.0.1:5984/&gt; DELETE /foodb
HTTP/1.1 200 OK
Server: CouchDB/1.1.1 (Erlang OTP/R15B)
Date: Wed, 04 Jan 2012 09:41:49 GMT
Content-Type: text/plain;charset=utf-8
Content-Length: 12
Cache-Control: must-revalidate
{ ok: true }
</code></pre><p>So that was a quick look at using http-console to make and inspect HTTP requests. We made a simple GET requests to a web server, made an API call to Twitter&#8217;s Search API, and issued commands to a CouchDB server. Granted YMMV, but hopefully you&#8217;ll find it a useful addition to your web development tool belt.</p><div
style='padding:20px 0px 50px 0px;'><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-1' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-1'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-2' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-2'); });</script> </div></div><div
style='clear:both'></div><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-3' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-3'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-4' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-4'); });</script> </div></div></div><div
style='clear:both'></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=131JOcBF88E:uw_pNkZiHSY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=131JOcBF88E:uw_pNkZiHSY:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=131JOcBF88E:uw_pNkZiHSY:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?i=131JOcBF88E:uw_pNkZiHSY:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SitepointFeed/~4/131JOcBF88E" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://www.sitepoint.com/http-debugging-with-node-and-http-console/feed/</wfw:commentRss> <slash:comments>3</slash:comments> <feedburner:origLink>http://www.sitepoint.com/http-debugging-with-node-and-http-console/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=http-debugging-with-node-and-http-console</feedburner:origLink></item> <item><title>Recording Screencasts as Animated GIFs</title><link>http://feedproxy.google.com/~r/SitepointFeed/~3/3CXiHUnBjkY/</link> <comments>http://www.sitepoint.com/recording-screencasts-as-animated-gifs/#comments</comments> <pubDate>Thu, 23 Feb 2012 01:18:56 +0000</pubDate> <dc:creator>Lior Levin</dc:creator> <category><![CDATA[Web Tech]]></category> <category><![CDATA[animation]]></category> <category><![CDATA[GIF]]></category> <category><![CDATA[screencast]]></category> <guid isPermaLink="false">http://www.sitepoint.com/?p=51779</guid> <description><![CDATA[<img
width="50" height="33" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/screencast-50x33.png" class="attachment-thumbnail wp-post-image" alt="screencast" title="screencast" />With a bit of current interest in animated GIFs, now is a good time to look at the tools available to turn an item like a screencast into a faster loading animated GIF. Lior Levin looks at the options.]]></description> <content:encoded><![CDATA[<img
width="50" height="33" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/screencast-50x33.png" class="attachment-thumbnail wp-post-image" alt="screencast" title="screencast" /><p></p><p>Your customers and readers are inundated with text and images daily, and the challenge of every writer and marketer is to cut through the clutter to present something unique and useful. One way to quickly share information, examples, or a series of images is to create an animated GIF file that will load quickly.</p><p>At the same time, screencasts offer a way to show changes on a computer screen over time, a kind of movie that is especially useful for instructional online videos and the like. They can be quite large, taking time to load that might deter some users. Turning screencasts into animated GIF files is one way to address this and a few other issues.</p><p>Here are some of the most highly recommended GIF animation tools around that are easy to use clean and intuitive interfaces, inexpensive, and capable of creating high quality animations.</p><h3>Why Use GIF Animation Files?</h3><p>GIF animation is useful when you need to easily post short clips and animations that are highly compressed. Reviewer Amit Agarwal <a
href="http://www.labnol.org/software/create-animated-gif-screencasts/20224/">recommends</a> animated GIF files because “when the recording is short … an animated GIF would make more sense than a video based screencast. They load quickly, work across devices and you don’t have to hit play to watch the screencast.” This helps your website load faster and makes your screencast easier to share with users who work with a variety of connection speeds.<div
id='div-gpt-ad-1328644474660-10' style='width:728px; height:90px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-10'); });</script> </div></p><p>Businesses also regularly use animated GIF files for e-mail marketing campaigns, inserting an animated GIF screencast into the text of their messages. Rebecca Swayze of Aweber <a
href="http://www.aweber.com/blog/email-marketing/3-surefire-reasons-to-use-animated-gifs-in-your-email-marketing.htm">shares</a>, “It’s a double-duty move: it grabs readers’ attention and gets a variety of products face-time that wouldn’t be possible in a static email.”</p><p>Keep in mind that animated GIFs don’t support vector graphics, can be rather large as files, and don’t offer a wide range of colors. While animated GIFs are quite useful, they have their limitations. If you need higher quality images, more colors, or a higher recording quality, look into using a video, especially if you have an HD video camera handy.</p><h3>Free Online GIF Animation Tools</h3><p>Online tools such as <a
href="http://gickr.com/">Gickr</a>, <a
href="http://gifninja.com/">Gifninja</a>, and <a
href="http://www.makeagif.com/">Make a GIF</a> enable users to simply upload their images and then create animated GIF files. These are simple and free tools that provide an especially accessible point of entry if you’re new to imaging and video software.</p><p>You can also download a YouTube Video and use free online tools such as <a
href="http://www.zamzar.com/">Zamar</a> and Gifninja to convert a segment of the video into a GIF screencast. <a
href="http://www.makeuseof.com/tag/convert-youtube-clips-gif-animations-free-online/">MakeUseof.com</a> provides a thorough list of options for working with animated GIF files that are suitable for a variety of users.</p><h3>Free and Premium GIF Animation Tools</h3><p>If you’re creating a GIF screencast from scratch and need more features, there are several excellent tools available such as <a
href="http://www.screenr.com/">Screenr</a> and <a
href="http://www.screencast-o-matic.com/">Screencast-O-Matic</a>. They both offer free and premium versions. Screenr limits the video length to five minutes but doesn’t add a watermark to the final product. Screencast-O-Matic provides 15 minutes of recording time but also adds a watermark to the animation.</p><p>In a <a
href="http://mashable.com/2009/08/19/screenr/">review</a>, one editor remarked, “Screenr has to be one of the smartest ways we’ve seen anyone approach a screencasting product. It’s easy to use, nicely integrated with Twitter, and all around a solid web application.” Many users enjoy the way Screenr easily integrates with Twitter, allowing users to tweet their screencasts with a click.</p><p>If you’re starting with a video on a site such as YouTube, Screencast-O-Matic can also convert all or part of a video into a GIF file where the video file will be compressed into a series of animated GIF images. Watch <a
href="http://www.youtube.com/watch?v=eYcaQtJk6EY">this tutorial</a> about how to use Screencast-O-Matic’s simple drag and drop feature.</p><h3>Premium Tools</h3><p>If you need more features for creating GIF files, CNET highly recommends <a
href="http://download.cnet.com/Ulead-GIF-Animator/3000-2186_4-10002057.html">Ulead GIF Animator</a> because its “clean interface keeps you oriented among the multitude of tools, frames, and objects.” Though it carries a $50 price tag, it optimizes files for downloading and viewing.</p><p>Sometimes you can say more in a short animation than in a paragraph. If you need to say a lot in a small space, consider creating an animated GIF in order to effectively share your story, brand, or products with customers.</p><p>Keep in mind that there are plenty of animated GIF tools available, so this is not meant to be a comprehensive review, just a taste of some of the most popular options.</p><p>If you know of other options and tools, please add them in the comments below!</p><div
style='padding:20px 0px 50px 0px;'><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-1' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-1'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-2' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-2'); });</script> </div></div><div
style='clear:both'></div><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-3' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-3'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-4' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-4'); });</script> </div></div></div><div
style='clear:both'></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=3CXiHUnBjkY:zIboCbanozw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=3CXiHUnBjkY:zIboCbanozw:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=3CXiHUnBjkY:zIboCbanozw:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?i=3CXiHUnBjkY:zIboCbanozw:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SitepointFeed/~4/3CXiHUnBjkY" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://www.sitepoint.com/recording-screencasts-as-animated-gifs/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://www.sitepoint.com/recording-screencasts-as-animated-gifs/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=recording-screencasts-as-animated-gifs</feedburner:origLink></item> <item><title>Copycat Startups: When is it OK to Steal Ideas?</title><link>http://feedproxy.google.com/~r/SitepointFeed/~3/mBYhOJPHYno/</link> <comments>http://www.sitepoint.com/copycat-startups-when-is-it-ok-to-steal-ideas/#comments</comments> <pubDate>Wed, 22 Feb 2012 12:38:13 +0000</pubDate> <dc:creator>Brandon Eley</dc:creator> <category><![CDATA[Site Strategy]]></category> <category><![CDATA[Web Pro Business]]></category> <category><![CDATA[copyright]]></category> <guid isPermaLink="false">http://www.sitepoint.com/?p=51749</guid> <description><![CDATA[<img
width="50" height="41" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/copycat-50x41.png" class="attachment-thumbnail wp-post-image" alt="copycat" title="copycat" />Where is the line between inspiration and stealing an idea? How unique does an idea have to be to be original? And what does it mean when a copycat is more successful than the original? Brandon Eley poses the questions.]]></description> <content:encoded><![CDATA[<img
width="50" height="41" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/copycat-50x41.png" class="attachment-thumbnail wp-post-image" alt="copycat" title="copycat" /><p></p><p>There are differing opinions in our field when it comes to the fine line between using a website or idea as inspiration and blatant copyright infringement.</p><p>Some feel that getting inspired by other designs and utilizing elements of them in your own is completely natural, even necessary. Others argue that copying anything, even a fairly generic layout structure, is copyright infringement.</p><p>No matter which side you&#8217;re on, you can&#8217;t help but notice copycats in almost every successful new web service or social network that launches. In many cases, the copycats out-innovate and eventually become market leaders. Facebook wasn&#8217;t the first social networking website &#8230; there was Friendster (which actually patented social networking), MySpace, and then Facebook.</p><p>More recently, Pinterest has come under the spotlight as an innovative way to bookmark, categorize and share ideas, photos, and links. As Pinterest grew in popularity, copycats like Pinspire and Clipix have popped up, with almost exactly the same layout and functionality. Pinspire and OpenPin.org are almost pixel-for-pixel clones of Pinterest &#8212; at least Clipix tried to come up with original graphics.</p><h2>Where is the Line?</h2><p>Where is the line, and have Pinspire, OpenPin or Clipix crossed it? More importantly, if they have, why are they still up and running? I raise this question because I&#8217;m interested in where copying stops and innovation begins.<div
id='div-gpt-ad-1328644474660-10' style='width:728px; height:90px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-10'); });</script> </div></p><p>You may not think of Apple as a copycat, but they were never the first to market with any of the devices that they now dominate in market share. Smartphones and tables have been around for over a decade, and even the mouse was invented by Xerox PARC. Apple saw the &#8220;mouse&#8221; on a visit to Xerox and incorporated the idea into the Macintosh, believing it would revolutionize computing (which it did). They even borrowed heavily from the GUI (graphical user interface) concepts developed at Xerox, which Microsoft then famously copied to create Windows.</p><h2>Copy or Improve?</h2><p>Twitter has its share of competition as well, but most Twitter competitors that pop up aren&#8217;t carbon copies. They take the <em>concept</em> of a microblogging service and improve on, or alter, the idea somewhat. My favorite Twitter competitior was Pownce, which was very similar but allowed you to select different types of content to publish, such as a photo, link, video, or text update. Although Pounce has shut down, you can see its idea in the status update functionality of most social networking sites today, including Facebook and LinkedIn.</p><h2>Improve on Others&#8217; Ideas</h2><p>It&#8217;s too early to tell whether Pinterest (or its clones) will be successful. But competiton drives innovation, and I expect we&#8217;ll see both Pinterest and competitors in the space improving on the original &#8220;pin board&#8221; concept with new features and interface improvements.</p><p>Instead of just copying a website, service offering, or marketing message, think about how you can improve on the original idea. How can you make it your own? What&#8217;s missing &#8230; or what can be taken away?</p><div
style='padding:20px 0px 50px 0px;'><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-1' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-1'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-2' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-2'); });</script> </div></div><div
style='clear:both'></div><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-3' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-3'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-4' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-4'); });</script> </div></div></div><div
style='clear:both'></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=mBYhOJPHYno:1H9nYGAgcGE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=mBYhOJPHYno:1H9nYGAgcGE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=mBYhOJPHYno:1H9nYGAgcGE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?i=mBYhOJPHYno:1H9nYGAgcGE:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SitepointFeed/~4/mBYhOJPHYno" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://www.sitepoint.com/copycat-startups-when-is-it-ok-to-steal-ideas/feed/</wfw:commentRss> <slash:comments>18</slash:comments> <feedburner:origLink>http://www.sitepoint.com/copycat-startups-when-is-it-ok-to-steal-ideas/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=copycat-startups-when-is-it-ok-to-steal-ideas</feedburner:origLink></item> <item><title>Google’s Doodle and Why it Hertz my Brain!</title><link>http://feedproxy.google.com/~r/SitepointFeed/~3/vIjjsm3Oyi8/</link> <comments>http://www.sitepoint.com/googles-doodle-and-why-it-hertz-my-brain/#comments</comments> <pubDate>Wed, 22 Feb 2012 11:57:41 +0000</pubDate> <dc:creator>Alex Walker</dc:creator> <category><![CDATA[Web Tech]]></category> <guid isPermaLink="false">http://www.sitepoint.com/?p=51741</guid> <description><![CDATA[<img
width="50" height="33" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/googledoodle-50x33.png" class="attachment-thumbnail wp-post-image" alt="googledoodle" title="googledoodle" />How do we love Google Doodles? Let us count the ways. But when we noticed today's celebration of the great german physicist Heinrich Hertz, we all did a double take. Find out why.]]></description> <content:encoded><![CDATA[<img
width="50" height="33" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/googledoodle-50x33.png" class="attachment-thumbnail wp-post-image" alt="googledoodle" title="googledoodle" /><p></p><p>How do we love Google Doodles? Let us count the ways.</p><p>They&#8217;re brilliant. In fact, I even enjoy getting up every day knowing that somewhere in Mountain View there are probably people shouting &#8216;<em>Woohoo! It&#8217;s Robert Heinlein&#8217;s Dad&#8217;s birthday next week! I wanna make an animated rocket on Google today!</em>&#8216;</p><p>We all have our favorites. I loved the <a
href="http://www.google.com/doodles/30th-anniversary-of-pac-man">Pacman tribute</a>.  The <a
href="http://www.google.com/doodles/les-pauls-96th-birthday">playable Les Paul guitar</a>. The <a
href="http://www.google.com/doodles/jules-vernes-183rd-birthday">amazing deep-sea Jules Verne tribute</a>. It&#8217;s true, the bar has been set very high.</p><p><div
id="attachment_51742" class="wp-caption alignright" style="width: 440px"> <a
href="http://cdn.sitepoint.com/wp-content/uploads/2012/02/doodle-22feb.png"><img
class="size-full wp-image-51742" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/doodle-22feb.png" alt="" width="440" height="239" /></a><p
class="wp-caption-text">Google&#039;s tribute to Heinrich Hertz - February 22nd 2012</p></div></p><p>But when Dan Laidler pointed out <a
href="http://www.google.com/">today&#8217;s celebration</a> of the great German physicist <a
href="http://en.wikipedia.org/wiki/Heinrich_Hertz">Heinrich Hertz</a>, we all did a little doubletake.<div
id='div-gpt-ad-1328644474660-10' style='width:728px; height:90px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-10'); });</script> </div></p><p>Hertz&#8217;s work was centered around waves — from light to radio — so Google paid tribute to his 155th birthday by evolving their famous logo into a gently moving wave that echos the Google letter shapes.</p><p>That was a nice enough idea, but it was <em>how they made it wiggle</em> that had us scratching our collective heads.</p><p>For here we had (arguably) the most technically-adept web company on the planet choosing to animate the wave as <a
href="https://www.google.com/logos/2012/hertz-2011-hp.gif" target="_blank">a big-ass animated GIF</a>.</p><p>More precisely, a 197kb, 49 frame, kinda jerky animated GIF. Brows were furrowed.</p><p>The obvious question is &#8220;Why?&#8221; Sure, we all know support for animated GIFs is ubiquitous, and often the simple solution <em>is</em> the best solution. However, for a company that so vigorously champions the power of HTML5 in particular, and the web in general, it seems like a strange decision.</p><p>So rather than just bleat about it — though we enjoy that too — we had a quick play around with alternatives. Here are the results so far.</p><p><strong>The CSS3 Only Method</strong></p><p>Easily the quickest method to get something working is CSS3. We start out with the simplest imaginable HTML.</p><p>Note: For the sake of clarity, I&#8217;m only going to show the W3C standard below, but the example contains all the prefixed CSS required.</p><pre lang="html">&lt;div id="wavelength"&gt;&lt;/div&gt;</pre><p>The basic CSS setup isn&#8217;t much more complicated. We give the DIV width and height, and embed our wave graphic into the background.</p><pre lang="css">#wavelength{
width:380px;
height:223px;
margin: 100px auto;
border:1px #ddd dashed;
background: url(http://sitepointstatic.com/examples/css3/animation/hertz.png);
position:relative;
}</pre><p>The keyframe animation code simply slides the background image position from the default (0px 0px) to 380px to the left.</p><pre lang="css">@keyframes hertz {
    0% {background-position:0px 0px;}
    100% {background-position:-380px 0px;}
}​</pre><p>Then we just attach the animation to the #wavelength DIV.</p><pre lang="css">animation: hertz 4s infinite linear; /* w3c standard */</pre><p>As a final touch I&#8217;m using the <strong>:before</strong> and <strong>:after</strong> pseudo elements of the #wavelength DIV to provide the fluffy white edges that you see on the left and right sides of the original GIF.</p><p>Here are working demos on both <a
href="http://dabblet.com/gist/1885390">Dabblet</a> and <a
href="http://jsfiddle.net/xplo69/ZxuCY/16/">JSFiddle</a>.</p><p>Run side-by-side with the GIF, the CSS3 version is certainly much visually smoother and file sizes are slashed drastically. Our wave graphic is now under 3kb, meaning &#8212; and even accounting for multiple prefixes &#8212; we only need a little over 1400 characters of CSS. That&#8217;s a combined weight of just over 4kb or less than 3% of the original.</p><p>Of course, we can&#8217;t pretend that CSS3 doesn&#8217;t have its drawbacks.</p><p>Google&#8217;s audience is as broad as they come, so a method that doesn&#8217;t work on older Internet Explorers (pre IE10) probably isn&#8217;t an option. Nevertheless, if you ran the GIF as a fallback using something like <a
href="http://www.modernizr.com/">Modernizr</a> to taget older browsers, I think you&#8217;d have a very viable solution.</p><p><strong>The JQuery Method</strong></p><p>JQuery is the no-brainer way to target both old and new browsers with a single approach. There&#8217;s more than one way to do it, but here&#8217;s the simplest method we could think of (cheers Harley).</p><p>We&#8217;re starting with pretty much the same basic HTML and CSS as the previous example — minus the CSS animation code.</p><p>Next we create a simple function (<em>waveloop();</em>) that resets the our background X position to 0px.</p><pre>function waveloop(){
 $('#wavelength').css({'background-position-x': 0});
    });
}</pre><p>Then we need to animate the background position 380px to the left of screen (hence the minus) like this:</p><pre>function waveloop(){
 $('#wavelength').css({'background-position': 5});
    <strong>$('#wavelength').animate({'background-position': '-380px'},3700,'linear'; </strong>
    });
}</pre><p>We found 3700 milliseconds is a fairly close match to the GIF timing, though it varies slightly from computer to computer.</p><p>At this point our wave animates nicely to the left, but stops after the first pass. We want it to loop without us having to retrigger it each time. The easiest method is to get the function to trigger itself again when it finishes. This is a callback and we can call like this:</p><pre>function waveloop(){
 $('#wavelength').css({'background-position': 5});
    $('#wavelength').animate({'background-position': '-380px'},3700,'linear'<strong>, function(){ waveloop();</strong>
    });
}</pre><p>Finally we just need to call our function with jQuery&#8217;s document ready function.</p><pre>$(document).ready(function() {
   waveloop();
});</pre><p>And that&#8217;s it.</p><p>Here&#8217;s a working demo showing the Google GIF at the top as a comparison.</p><p><iframe
style="width: 100%; height: 600px" src="http://jsfiddle.net/xplo69/ZjbUJ/113/embedded/result,html,css,js" allowfullscreen="allowfullscreen" frameborder="0"></iframe></p><p>About half a dozen lines of code to a smoother, cross-browser, lower-bandwidth result. Granted, we need to include the minified jQuery library in the download, but even throwing in that 30kb file doesn&#8217;t get us anywhere near 40k, or a fifth of the GIF file size.</p><p>And jQuery is really overkill here — I just had other work to finish.</p><p>So, what do you think?</p><ul><li>Did Facebook poach the Google Doodlers?</li><li>Perhaps you&#8217;ve got an even better way to do it?</li><li>Am I under-estimating the power and beauty of the animated GIF?</li></ul><p>Or am I just being a little tough on the poor guys?</p><div
style='padding:20px 0px 50px 0px;'><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-1' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-1'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-2' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-2'); });</script> </div></div><div
style='clear:both'></div><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-3' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-3'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-4' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-4'); });</script> </div></div></div><div
style='clear:both'></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=vIjjsm3Oyi8:dtjen9yuUAU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=vIjjsm3Oyi8:dtjen9yuUAU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=vIjjsm3Oyi8:dtjen9yuUAU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?i=vIjjsm3Oyi8:dtjen9yuUAU:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SitepointFeed/~4/vIjjsm3Oyi8" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://www.sitepoint.com/googles-doodle-and-why-it-hertz-my-brain/feed/</wfw:commentRss> <slash:comments>31</slash:comments> <feedburner:origLink>http://www.sitepoint.com/googles-doodle-and-why-it-hertz-my-brain/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=googles-doodle-and-why-it-hertz-my-brain</feedburner:origLink></item> <item><title>7 Solutions to the CSS3 Vendor Prefix Crisis</title><link>http://feedproxy.google.com/~r/SitepointFeed/~3/aHSF4oPVL2s/</link> <comments>http://www.sitepoint.com/css3-vendor-prefix-crisis-solutions/#comments</comments> <pubDate>Tue, 21 Feb 2012 17:03:24 +0000</pubDate> <dc:creator>Craig Buckler</dc:creator> <category><![CDATA[Best Practices]]></category> <category><![CDATA[Discussion]]></category> <category><![CDATA[HTML & CSS]]></category> <category><![CDATA[HTML5]]></category> <category><![CDATA[apple]]></category> <category><![CDATA[browsers]]></category> <category><![CDATA[CSS]]></category> <category><![CDATA[CSS3]]></category> <category><![CDATA[Google Tutorials & Articles]]></category> <category><![CDATA[HTML5 Dev Center]]></category> <category><![CDATA[microsoft]]></category> <category><![CDATA[Mozilla]]></category> <category><![CDATA[opera]]></category> <category><![CDATA[vendor prefix]]></category> <guid isPermaLink="false">http://www.sitepoint.com/?p=51733</guid> <description><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/641-css-vendor-prefix-crisis-50x50.jpg" class="attachment-thumbnail wp-post-image" alt="641-css-vendor-prefix-crisis" title="641-css-vendor-prefix-crisis" />Can we prevent Microsoft, Mozilla and Opera supporting -webkit properties in their browsers? Craig looks at the problem and the pros and cons of each solution.]]></description> <content:encoded><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/641-css-vendor-prefix-crisis-50x50.jpg" class="attachment-thumbnail wp-post-image" alt="641-css-vendor-prefix-crisis" title="641-css-vendor-prefix-crisis" /><p></p><p>As we <a
href="http://www.sitepoint.com/w3c-css-webkit-prefix-crisis/">reported last week</a> Mozilla, Microsoft and Opera have become frustrated with sites which only target -webkit CSS3 properties. It makes their browser look bad even when it implements identical or better technology. To solve the issue, they propose adding -webkit prefix support to the non-webkit browsers.</p><p>While this is largely a marketing decision, it&#8217;s a real problem. The solution appalls many web developers but we deserve our share of the blame. In this article we&#8217;ll discuss the options, pros and cons.</p><h2>1. Nothing Changes</h2><p>Assume nothing is done to solve the browser prefix problem.</p><p><strong>PROS</strong></p><ul><li>Browsers continue to implement their own prefixes which you are free to use or ignore.</li><li>There&#8217;s nothing new to learn or test.</li><li>It feels right and the decision will please the majority of web developers.</li></ul><p><strong>CONS</strong></p><ul><li>We retain the four prefixed and one standard property. Stylesheets are larger than necessary and difficult to test.</li><li>Lazier or less experienced developers will continue to target webkit browsers only.</li><li>Chrome and Safari&#8217;s market share could rise to a point which makes other browsers redundant. We return to the days of single browser engine and innovation stagnates. The dark days of IE6-like dominance return.</li><li>Microsoft, Mozilla and Opera consider this to be a real problem: <em>doing nothing is not an option</em>.</li></ul><h2>2. Non-Webkit Browsers Support the Webkit Prefix</h2><p>Assume IE, Firefox and Opera support webkit-prefixed properties.<div
id='div-gpt-ad-1328644474660-10' style='width:728px; height:90px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-10'); });</script> </div></p><p>Microsoft had already implemented <code>-webkit-text-size-adjust</code> in the mobile version of IE. While it&#8217;s a non-standard property for Safari (there&#8217;s no <code>text-size-adjust</code>), they <a
href="http://blogs.msdn.com/b/iemobile/archive/2010/05/11/update-css-and-js-support-in-ie-mobile-for-windows-phone-7.aspx">listened to community feedback and pulled support</a>. That&#8217;s unlikely to happen again if Mozilla or Opera start adding webkit properties to their engines.</p><p><strong>PROS</strong></p><ul><li>It&#8217;s a quick and dirty solution which allows non-webkit browsers to render as well as Chrome or Safari.</li><li>There&#8217;s no need for developers to update their websites.</li><li>-webkit will become the dominant prefix; using -moz, -ms or -o will become unnecessary and CSS file sizes will reduce</li><li>It prevents webkit, Google and Apple becoming too powerful. If another vendor disagrees with an implementation, they can simply break it or provide an alternative. Developers may not be able to use the property in <em>any</em> browser.</li></ul><p><strong>CONS</strong></p><ul><li>It feels wrong: one browser should not need to masquerade as another.</li><li>It rewards sloppy development practices.</li><li>Differing browser implementations will make some properties unusable.</li><li>If developers retain webkit properties which fail in other browsers, more users will switch to Chrome and Safari. Other vendors will become increasingly irrelevant.</li></ul><h2>3. All Browsers Use a -beta Prefix</h2><p>Rather than separate prefixes, assume every browser implemented the same -beta prefix.</p><p><strong>PROS</strong></p><ul><li>Just one prefix to learn and use.</li><li>Stylesheet file sizes are reduced.</li><li>The property is obviously experimental; developers will be more cautious about using it.</li></ul><p><strong>CONS</strong></p><ul><li>As a solution, it&#8217;s little different to every vendor adopting the -webkit prefix.</li><li>Differing browser implementations may make some properties unusable.</li><li>Vendors are unlikely to remove their own prefixes; the situation won&#8217;t change.</li></ul><h2>4. Experimental CSS Properties Only Appear in Beta Browsers</h2><p>Assume prefixed properties are abolished in all browsers. Newer experimental properties would only be present in nightly and beta releases &#8212; and they would not require a prefix.</p><p><strong>PROS</strong></p><ul><li>It becomes impossible for developers to use prefixed code or target specific browsers in production websites.</li><li>Webkit-only sites are punished accordingly.</li><li>We all work to final standards &#8212; not future ones.</li></ul><p><strong>CONS</strong></p><ul><li>Far fewer developers will use and test experimental properties. It could lead to buggier implementations.</li><li>New properties may take several years to become standardized. Are we prepared to wait?</li><li>It&#8217;ll never happen. If a single vendor chooses to keep prefixes in their main release, they all will.</li></ul><h2>5. Vendor Prefixes are Dropped Following Final Implementation</h2><p>Once a property is stable and implemented without a prefix, all previous prefixed versions are removed from the browser.</p><p><strong>PROS</strong></p><ul><li>It&#8217;s a logical solution.</li><li>It removes unnecessary code. Library bloat is reduced and browsers become leaner and faster.</li><li>It rewards good development practices and punishes the bad.</li></ul><p><strong>CONS</strong></p><ul><li>It offers no immediate resolution for sites which only target webkit browsers.</li><li>It will break sites overnight &#8212; vendors will be reluctant to implement the policy.</li><li>Properties can take years to reach standardization and browser implementation schedules differ. Prefixes will break at different times so ongoing site testing and maintenance is required.</li></ul><h2>6. The W3C Agreement Process Becomes Faster</h2><p>Assume the W3C adopt quicker methods of standardization and publish schedules detailing when a property is expected to reach maturity.</p><p><strong>PROS</strong></p><ul><li>The existing process is too slow.</li><li>Developers will know when the final property can be used.</li><li>There&#8217;s less chance for vendor prefixes to gain widespread adoption.</li></ul><p><strong>CONS</strong></p><ul><li>The process is not intentionally slow. There will always be practical and logistical problems to overcome.</li><li>Vendors work at different speeds and it&#8217;s impossible to accurately estimate delivery times.</li><li>A faster approval process could lead to poorer implementations which negates the point of having a standardization process.</li></ul><h2>7. Better Evangelism and More Education in the Developer Community</h2><p>We would not be in this mess if developers wrote cross-browser code and understood best-practice techniques.</p><p><strong>PROS</strong></p><ul><li>It&#8217;s a good solution which we can implement today.</li><li>Anyone demonstrating example code with prefixed properties can provide browser support information with strong disclaimers.</li><li>Everyone can help. Fix your own code and contact sites which are not cross-browser compatible.</li></ul><p><strong>CONS</strong></p><ul><li>There&#8217;s no guarantee evangelists and developers will change their attitude.</li><li>Is it too late? Best-practice techniques are published but ignored.</li><li>There&#8217;s no definitive central information repository.</li><li>There will always be new, ignorant and sloppy developers. No one can become an expert overnight.</li></ul><p>There&#8217;s no single solution to the vendor prefix problem. Personally, I favor a quicker W3C process, dropping prefixes after implementation and better evangelism. But those require a major shift in mindset rather than technical changes.</p><p>Ultimately, developers caused this problem: it&#8217;s up to us to fix it. There won&#8217;t be an issue if we shun prefixed properties or use correct cross-browser fallbacks. If we don&#8217;t, there&#8217;s a risk the CSS3 properties we rely on today won&#8217;t work tomorrow.</p><div
style='padding:20px 0px 50px 0px;'><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-1' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-1'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-2' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-2'); });</script> </div></div><div
style='clear:both'></div><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-3' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-3'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-4' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-4'); });</script> </div></div></div><div
style='clear:both'></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=aHSF4oPVL2s:XGEVanBGRoo:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=aHSF4oPVL2s:XGEVanBGRoo:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=aHSF4oPVL2s:XGEVanBGRoo:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?i=aHSF4oPVL2s:XGEVanBGRoo:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SitepointFeed/~4/aHSF4oPVL2s" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://www.sitepoint.com/css3-vendor-prefix-crisis-solutions/feed/</wfw:commentRss> <slash:comments>35</slash:comments> <feedburner:origLink>http://www.sitepoint.com/css3-vendor-prefix-crisis-solutions/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=css3-vendor-prefix-crisis-solutions</feedburner:origLink></item> <item><title>RubySource: Ruby Heroes, Side-Effect Free Code, Service Oriented Architecture, and More</title><link>http://feedproxy.google.com/~r/SitepointFeed/~3/xPfL31A8SSA/</link> <comments>http://www.sitepoint.com/ruby-heroes-side-effect-free-code-service-oriented-architecture-and-more/#comments</comments> <pubDate>Tue, 21 Feb 2012 17:00:05 +0000</pubDate> <dc:creator>Aaron Osteraas</dc:creator> <category><![CDATA[Ruby News]]></category> <guid isPermaLink="false">http://www.sitepoint.com/?p=51744</guid> <description><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2011/03/rubysource-icon115x115-50x50.png" class="attachment-thumbnail wp-post-image" alt="rubysource-icon115x115" title="rubysource-icon115x115" />Don't miss out on the latest functional programming techniques, messaging systems, service-oriented architecture, a retro on Loccassions, and an interview with Konstantin Haase!]]></description> <content:encoded><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2011/03/rubysource-icon115x115-50x50.png" class="attachment-thumbnail wp-post-image" alt="rubysource-icon115x115" title="rubysource-icon115x115" /><p></p><h2><a
href="http://rubysource.com/functional-programming-techniques-with-ruby-part-i/">Functional Programming Techniques with Ruby</a></h2><p>Ruby is an interesting language in that it supports the use of multiple paradigms. One of these is the functional paradigm. In this series, we&#8217;ll visit each of these features one by one, and look at how you can use them to produce cleaner, more efficient, and better-structured code.</p><hr
/><h2><a
href="http://rubysource.com/introduction-to-messaging-systems-for-rubyists/">Introduction to Messaging Systems for Rubyists</a></h2><p>A couple of weeks ago, I wrote about Ruby Heroes. I thought I&#8217;d write a post about my Ruby Hero: Konstantin Haase. He is one of the busiest people I know in the Ruby community. His output is amazing – just check out his github profile!</p><hr
/><h2><a
href="http://rubysource.com/interview-with-konstantin-haase/">Interview With Konstantin Haase</a></h2><p>As the Ruby community matures and our applications grow, we seek new ways to manage complexity, reduce coupling, and improve scalability. Though REST services are a good solution for a broad spectrum of problems, the temporal coupling is becoming harder to manage. In this article we look into messaging options.</p><hr
/><h2><a
href="http://rubysource.com/soa-for-the-little-guys/">SOA for the Little Guys</a></h2><p>SOA, or Service-Oriented Architecture, is often tossed around as an enterprise-only term, used by companies no smaller than Amazon. Fear not, SOA can be used by the Little Guys too! Let’s break the mold.<div
id='div-gpt-ad-1328644474660-10' style='width:728px; height:90px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-10'); });</script> </div></p><hr
/><h2><a
href="http://rubysource.com/loccasions-retrospective/">Loccasions: Retrospective</a></h2><p>The Loccasions application now allows most of the basic functionality that I wanted to produce. Now it&#8217;s time to examine what went right, what went wrong, and what the next iteration is.</p><hr
/><div
style='padding:20px 0px 50px 0px;'><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-1' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-1'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-2' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-2'); });</script> </div></div><div
style='clear:both'></div><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-3' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-3'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-4' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-4'); });</script> </div></div></div><div
style='clear:both'></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=xPfL31A8SSA:zf6hzPtqzTk:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=xPfL31A8SSA:zf6hzPtqzTk:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=xPfL31A8SSA:zf6hzPtqzTk:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?i=xPfL31A8SSA:zf6hzPtqzTk:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SitepointFeed/~4/xPfL31A8SSA" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://www.sitepoint.com/ruby-heroes-side-effect-free-code-service-oriented-architecture-and-more/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://www.sitepoint.com/ruby-heroes-side-effect-free-code-service-oriented-architecture-and-more/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=ruby-heroes-side-effect-free-code-service-oriented-architecture-and-more</feedburner:origLink></item> <item><title>Express Yourself</title><link>http://feedproxy.google.com/~r/SitepointFeed/~3/YlmXWTVGxY0/</link> <comments>http://www.sitepoint.com/express-yourself/#comments</comments> <pubDate>Tue, 21 Feb 2012 03:28:29 +0000</pubDate> <dc:creator>Ian Oxley</dc:creator> <category><![CDATA[JavaScript]]></category> <category><![CDATA[Server Side Coding]]></category> <category><![CDATA[javascript]]></category> <category><![CDATA[node.js]]></category> <category><![CDATA[nodejs]]></category> <guid isPermaLink="false">http://www.sitepoint.com/?p=51553</guid> <description><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2010/07/node-50x50.png" class="attachment-thumbnail wp-post-image" alt="node" title="node" />Express is a web framework for Node, inspired by the Sinatra framework for Ruby. It boasts loads of features, high performance, and comes with a handy executable for creating applications quickly. In this article we&#8217;re going to look at how you can get up and running with express, what you get when you create a [...]]]></description> <content:encoded><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2010/07/node-50x50.png" class="attachment-thumbnail wp-post-image" alt="node" title="node" /><p></p><p><a
href="http://expressjs.com/" rel="external">Express</a> is a web framework for Node, inspired by the <a
href="http://www.sinatrarb.com/" rel="external">Sinatra framework for Ruby</a>. It boasts loads of features, high performance, and comes with a handy executable for creating applications quickly. In this article we&#8217;re going to look at how you can get up and running with express, what you get when you create a new express website, and finish with adding a route and view to display search results from Twitter.</p><h2>Installing Express</h2><p>Express can easily be installed via <a
href="http://npmjs.org/" rel="external">npm (Node Package Manager)</a>:</p><pre><code>
$&gt; npm install express -g
</code></pre><p>The <code>-g</code> switch on the end makes express available globally. This means we can run the express executable from anywhere to quickly create a new application. The express executable is called, unsuprisingly, express:</p><pre><code>
$&gt; type express
express is hashed (/usr/local/bin/express)
</code></pre><p>If you type in the command by itself, express will create a new application in the current directory. If the current directory isn&#8217;t empty, you&#8217;ll be prompted and asked if you want to continue:<div
id='div-gpt-ad-1328644474660-10' style='width:728px; height:90px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-10'); });</script> </div></p><pre><code>
$&gt; express
destination is not empty, continue?
</code></pre><p>Enter &#8216;y&#8217; if you want to carry on, or &#8216;n&#8217; to abort. You&#8217;re not restricted to creating new apps in the current directory, you just need to pass express the path to where you want your new application created. You can pass it other options as well:</p><ul><li><code>-s</code> to enable sessions</li><li><code>-t</code> or <code>--template &lt;engine&gt;</code> to specify your template engine (express uses jade by default)</li><li><code>-c</code> or <code>--css</code> to add stylus CSS support (the default is plain CSS)</li><li><code>-v</code> or <code>--version</code> to output the current version of express you&#8217;ve got installed</li><li><code>-h</code> or <code>--help</code> to output this help and exit</li></ul><p> A list of supported template engines is on the <a
href="http://expressjs.com/guide.html#template-engines" rel="external">express guide</a>, and also on the <a
href="https://github.com/visionmedia/express/wiki" rel="external">express wiki</a>. In this article we&#8217;ll use <a
href="https://github.com/visionmedia/ejs" rel="external">EJS</a>. Let&#8217;s create a new site called <code>myapp</code>:</p><pre><code>
$&gt; express -t ejs myapp
create : myapp
create : myapp/package.json
create : myapp/app.js
create : myapp/public
create : myapp/routes
create : myapp/routes/index.js
create : myapp/views
create : myapp/views/layout.ejs
create : myapp/views/index.ejs
create : myapp/public/javascripts
create : myapp/public/images
create : myapp/public/stylesheets
create : myapp/public/stylesheets/style.css
dont forget to install dependencies:
$&gt; cd myapp &amp;&amp; npm install
</code></pre><p>express creates a new site in the myapp folder for us. We get: a <code>package.json</code> file, an <code>app.js</code> file for application code, a routes directory for routes, a views directory for our view templates, and a public directory for our CSS, images and client-side JavaScript. Express also reminds us to install dependencies and gives us the command to do so. We might as well type that in now before we forget:</p><pre><code>
$&gt; cd myapp &amp;&amp; npm install
npm http GET https://registry.npmjs.org/express/2.5.5
npm http GET https://registry.npmjs.org/ejs
npm http 304 https://registry.npmjs.org/ejs
npm http 304 https://registry.npmjs.org/express/2.5.5
npm http GET https://registry.npmjs.org/mime
npm http GET https://registry.npmjs.org/qs
npm http GET https://registry.npmjs.org/mkdirp/0.0.7
npm http GET https://registry.npmjs.org/connect
npm http 304 https://registry.npmjs.org/mime
npm http 304 https://registry.npmjs.org/qs
npm http 304 https://registry.npmjs.org/mkdirp/0.0.7
npm http 304 https://registry.npmjs.org/connect
npm http GET https://registry.npmjs.org/formidable
npm http 304 https://registry.npmjs.org/formidable
ejs@0.6.1 ./node_modules/ejs
express@2.5.5 ./node_modules/express
├── mkdirp@0.0.7
├── qs@0.4.2
├── mime@1.2.5
└── connect@1.8.5
</code></pre><p> You should see something similar, although the exact output may differ depending on which versions of the dependencies are available via npm, and which you already have installed. If you now type in <code>node app.js</code> and browse to <a
href="http://localhost:3000/">http://localhost:3000</a> you should see the <em>Welcome to Express</em> page. Let&#8217;s have a look at the code express has generated and how it&#8217;s used to by the welcome page.</p><h2>app.js</h2><p><code>app.js</code> is where you configure your site, and define your routes. The <code>app</code> variable is our express server, and we call it&#8217;s <code>configure</code> function to tell express which view engine to use, where to find static resources, and how to handle errors. Look at the default app.js code you&#8217;ll see that <code>app.configure</code> is called three times:</p><ul><li>the first time it&#8217;s called <em>without</em> a name argument &ndash; this will apply the settings to every environment</li><li>the second time it&#8217;s called with <code>development</code> as the first argument &ndash; these <code>errorHandler</code> settings will only be applied in the development environment</li><li>the third time it&#8217;s called with <code>production</code> as the first argument &ndash; the <code>errorHandler</code> in the production environment will have exceptions dumps and stack traces turned off</li></ul><p>Now look at the last two lines in <code>app.js</code>:</p><pre><code>
app.listen(3000);
console.log("Express server listening on port %d in %s mode", app.address().port, app.settings.env);
</code></pre><p>This tells express which port to listen for connections on, then logs a message to the console confirming the port it&#8217;s listening on, as well as the current environment.</p><pre><code>
$ node app.js
Express server listening on port 3000 in development mode
</code></pre></p><p>By default <code>app.settings.env</code> is set to <code>development</code>. To change this to another environment, e.g. production, insert the following line above the call to <code>console.log</code>:</p><pre><code>
app.settings.env = 'production';
</code></pre><p>Restart the app <code>ctrl+c</code>, then type in <code>node app.js</code> again), and mode should have changed to production:</p><pre><code>
$ node app.js
Express server listening on port 3000 in production mode
</code></pre><h2>Routing</h2><p>Express exposes the 6 HTTP verbs as it&#8217;s API for defining routes, and lets you capture parameters via named parameters, wildcards, regular expressions, and combinations of all three. Captured values will be accessible via <code>req.params</code>:</p><pre><code>
// using a named parameter
app.get('/foo/:id', function(req, res) {
	var fooId = req.params.id;
	...
});
// using regular expressions
app.get(/^\/foo\/(\d+)/, function(req, res) {
	var fooId = req.params[1];
	...
});
// using a combination of the two
app.get('/foo/:id([0-9]+)', function(req, res) {
	var fooId = req.params.id;
	...
})
</code></pre><p>All three routes above show different ways of getting the <code>fooId</code> from the URL.</p><p>In <code>app.js</code> you&#8217;ll see the route defined for the welcome page. This handles GET requests to &#8216;/&#8217;: when a request is received for this path the callback function <code>routes.index</code> is fired.</p><p>.</p><p>The <code>routes.index</code> function is defined in <code>routes/index.js</code>. <code>routes/index.js</code> is a module that exports functions to be used as route handlers. If you open it up you&#8217;ll see the code that makes up the <code>routes.index</code> function:</p><pre><code>
exports.index = function(req, res){
  res.render('index', { title: 'Express' })
};
</code></pre><p>This tells express to render the index view. The object passed as the second argument to <code>render</code> is data that will be made available to the view.</p><h2>Views</h2><p>When we created <code>myapp</code> we told express to use the EJS template engine. If you look in the views folder, you&#8217;ll see that express created a couple of files for us: a layout.ejs file, and an index.ejs file. layout.ejs is where the bulk of the page layout HTML lives, with index.ejs containing page-specific HTML. If you open up layout.ejs you&#8217;ll see something like this:</p><pre><code>
&lt;!DOCTYPE html&gt;
&lt;html&gt;
  &lt;head&gt;
    &lt;title&gt;&lt;%= title %&gt;&lt;/title&gt;
    &lt;link rel="stylesheet" href="/stylesheets/style.css" /&gt;
  &lt;/head&gt;
  &lt;body&gt;
    &lt;%- body %&gt;
  &lt;/body&gt;
&lt;/html&gt;
</code></pre><p>Aside from the regular HTML, the <code>title</code> from the object we passed to the view gets output in the &lt;title&gt; tag, and content from page-specific templates (such as index.ejs) gets included via the <code>&lt;%- body %&gt;</code> line. Let&#8217;s open <code>index.ejs</code> to see what&#8217;s in there:</p><pre><code>
&lt;h1&gt;&lt;%= title %&gt;&lt;/h1&gt;
&lt;p&gt;Welcome to &lt;%= title %&gt;&lt;/p&gt;
</code></pre><p>Again we&#8217;re outputting the <code>title</code> from the object we passed to the view, first in the &lt;h1&amp;t; tag, and then in the &lt;p&gt; tag. If you change the value assigned to <code>title</code> in <code>routes/index.js</code> and restart the app, you should see the value change when you refresh your browser.</p><h2>Adding a New Route</h2><p>Let&#8217;s add a new route and view that&#8217;ll display the ten most recent tweets mentioning Sitepoint. We&#8217;ll need to add a route to <code>app.js</code>, a callback function for the route, and a view to display the tweets:</p><ol><li><p>Open <code>app.js</code> and add a route for the tweets page:</p><pre><code>
app.get('/twitter', routes.twitter);
</code></pre></li><li><p>Next, open up <code>routes/index.js</code> and add this line at the top to import the http module:</p><pre><code>
var http = require('http');
</code></pre></li><li><p>Stay in <code>routes/index.js</code> and add the following function:</p><pre><code>
/*
 * GET twitter search results
 */
exports.twitter = function(req, res) {
  var options = {
    host: 'search.twitter.com',
    port: 80,
    path: '/search.json?q=sitepoint&amp;rpp=10'
  };
  http.get(options, function(response) {
    var tweets = '';
    response.on('data', function(data) {
      tweets += data;
    }).on('end', function() {
      var tmp = JSON.parse(tweets),
        topTen = tmp.results;
      res.render('twitter', { title: 'Latest from Twitter', tweets: topTen });
    });
  }).on('error', function(e) {
    res.writeHead(500);
    res.write('Error: ' + e);
  });
}
</code></pre><p>Here we&#8217;re using <a
href="http://nodejs.org/docs/latest/api/http.html#http.get" rel="external"><code>http.get</code></a> to make a HTTP GET request to the <a
href="https://dev.twitter.com/docs/api/1/get/search" rel="external">Twitter Search API</a>. We pass <code>http.get</code> the <code>options</code> object, which tells it where to get the data from. We then define a couple of callback functions: <code>on('data', ...)</code> appends <code>data</code> to <code>tweets</code> each time some data is received; <code>on('end', ...)</code> is called when all data has been received, and sends the tweets to the twitter view.</p></li><li><p>Finally, create a <code>twitter.ejs</code> file in your views folder. Open the file and add the following:</p><pre><code>
&lt;h1&gt;&lt;%= title %&gt;&lt;/h1&gt;
&lt;% if (tweets.length) { %&gt;
  &lt;ul&gt;
    &lt;% tweets.forEach(function(t) { %&gt;
      &lt;li&gt;
        &lt;h2&gt;
          &lt;a href="http://twitter.com/&lt;%= t.from_user %&gt;" rel="external"&gt;
            &lt;%= t.from_user_name %&gt;
            &lt;span&gt;&lt;%= t.from_user %&gt;&lt;/span&gt;
          &lt;/a&gt;
        &lt;/h2&gt;
        &lt;blockquote&gt;
          &lt;p&gt;&lt;%= t.text %&gt;&lt;/p&gt;
        &lt;/blockquote&gt;
        &lt;a href="http://twitter.com/#!/&lt;%= t.from_user %&gt;/status/&lt;%= t.id %&gt;" rel="external"&gt;Open&lt;/a&gt;
      &lt;/li&gt;
    &lt;% }); %&gt;
  &lt;/ul&gt;
&lt;% } // endif %&gt;
</code></pre><p>After displaying the title, the view checks that we have some tweets to display. If we do, <code>forEach</code> iterates through each tweet, using the callback function to display the tweet&#8217;s text, and who the tweet was from.</p></li></ol><p>Restart the app, then browse to <a
href="http://localhost:3000/twitter">http://localhost:3000/twitter</a> and, if all went well, you&#8217;ll see a list of the ten most recent tweets mentioning Sitepoint.</p><p>So that was a quick introduction to creating a website in Node using the express web framework. We looked at what express gives you when you create a new express site, had a quick look at how it uses routing and views, and added a new route and view to display search results from Twitter. There&#8217;s a lot more that express is capable of, and a lot that we haven&#8217;t covered. If you&#8217;re interested in finding out more then head over to <a
href="http://expressjs.com/guide.html" rel="external">http://expressjs.com/guide.html</a>, and have a look at the <a
href="https://github.com/visionmedia/express/wiki" rel="external">express wiki</a>.</p><div
style='padding:20px 0px 50px 0px;'><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-1' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-1'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-2' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-2'); });</script> </div></div><div
style='clear:both'></div><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-3' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-3'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-4' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-4'); });</script> </div></div></div><div
style='clear:both'></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=YlmXWTVGxY0:iP-hFYtlcRU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=YlmXWTVGxY0:iP-hFYtlcRU:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=YlmXWTVGxY0:iP-hFYtlcRU:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?i=YlmXWTVGxY0:iP-hFYtlcRU:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SitepointFeed/~4/YlmXWTVGxY0" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://www.sitepoint.com/express-yourself/feed/</wfw:commentRss> <slash:comments>3</slash:comments> <feedburner:origLink>http://www.sitepoint.com/express-yourself/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=express-yourself</feedburner:origLink></item> <item><title>MySQL Master-Slave Replication: Starting Replication</title><link>http://feedproxy.google.com/~r/SitepointFeed/~3/YEHATIx7eEI/</link> <comments>http://www.sitepoint.com/mysql-master-slave-replication-starting-replication/#comments</comments> <pubDate>Mon, 20 Feb 2012 02:11:23 +0000</pubDate> <dc:creator>Panayotis Matsinopoulos</dc:creator> <category><![CDATA[Open Source]]></category> <category><![CDATA[PHP & MySQL Tutorials]]></category> <category><![CDATA[Web Tech]]></category> <guid isPermaLink="false">http://www.sitepoint.com/?p=51619</guid> <description><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/feature7-50x50.png" class="attachment-thumbnail wp-post-image" alt="feature" title="feature" />Panayotis Matsinopolouos continues his account of how his company set up a successful MySQL Master-Slave configuration. This is the second of two parts.]]></description> <content:encoded><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/feature7-50x50.png" class="attachment-thumbnail wp-post-image" alt="feature" title="feature" /><p></p><p>In my <a
href="http://www.sitepoint.com/mysql-master-slave-replication-setting-up/">last article</a>, I took you through Phase 1 of setting up the MySQL Master-Slave relationship.</p><p>Now, we have the Master SQL Server running and serving our clients, which connect using remote IPs. Also, the Master has a replication server id (e.g. “100”) and waits for the Slave connections with a user that is allowed replication (e.g. ‘repl’).</p><p>We also have Slave SQL Node almost ready to start.</p><p>What we are going to do now is the following:</p><ol><li>On Master,<ol
style="list-style-type:lower-alpha;"><li>get the Replication Master Binary Log Coordinates</li><li>create a data snapshot using mysqldump</li><li>transfer the data on Slave</li><p> &nbsp;</ol></li><li>On Slave,<ol
style="list-style-type:lower-alpha;"><li>Restore the data snapshot</li><li>Set the Slave to start replication.</li></ol></li></ol><h2>Detailed Actions</h2><h3>On Master</h3><p>During steps 1 and 2 below, your Master database will be set to read-only mode.</p><ol><li>Get Master Coordinates</p><ol
style="list-style-type:lower-alpha;"><li>Open a MySQL shell and give:<br
/>&nbsp;<br
/> <code>mysql&gt; FLUSH TABLES WITH READ LOCK;</code><br
/>&nbsp;</li><li><strong>IMPORTANT.</strong> Leave this shell open and create another mysql client shell, i.e. another session:<br
/> &nbsp;</li><li><strong>Hence, on another session</strong>, type in the following mysql command:<br
/>&nbsp;<br
/> <code>mysql&gt; SHOW MASTER STATUS;</code><br
/>&nbsp;</li></ol><p> Write down the values for the column FILE and POSITION. You will need them later when setting up the Slave to start replication</li><li>On a command prompt, get a data snapshot:<br
/>&nbsp;<br
/> <code>os-shell&gt; mysqldump --all-databases --master-data &gt; dbdump.db</code><br
/>&nbsp;</li><p> If you have a big database, this might take quite some time. In our case, for a 25Gb database, it took something like 15 minutes.<div
id='div-gpt-ad-1328644474660-10' style='width:728px; height:90px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-10'); });</script> </div></p><li>Release lock and allow your Master to play</li></ol><p>When your data dump finishes, just close the connection you opened on step 1 and your Master database server will resume serving transactions.</p><p>Now, you have a database file you can use on Slave to restore the database. You have to transfer this file to your Slave node.It might be a good idea to tar and gzip this file before transferring it and then untar and unzip it at the Slave node.</p><h3>On Slave</h3><p>Assuming that you have transferred your database dump file to Slave, you move on to work on this node as follows:</p><ol><li>Start MySQL server with <code>--skip-slave-start</code> option so that replication does not start. Here is the suggested way:</p><p>On your operating system command prompt:<br
/> &nbsp;<br
/> <code>os-shell&gt; mysqld_safe –-skip-slave-start</code><br
/> &nbsp;</li><li>Import the dump file:<br
/> &nbsp;<br
/> On another operating system command prompt:<br
/> &nbsp;<br
/> <code>os-shell&gt; mysql –u root –p &lt; dbdump.db</code><br
/> &nbsp;<br
/> This will start the import. It will take quite some time if your dump file is big.<br
/> &nbsp;<br
/> <strong>Important gotcha</strong>:: Before you start the import, make sure that you have enough space both on the datadir of MySQL and on the binary log directory too.<br
/> &nbsp;</li><li>Stop MySQL Server<br
/> &nbsp;<br
/> Assuming that import has finished successfully, and assuming that on step 1 above you started the MySQL Server skipping slave start, you need to stop this and make sure that MySQL server is not running.</p><h4>Some Problems that you might have now on Slave</h4><p>The problem that you have now is that you restored the system databases as well. These are coming from your Master server, which has a different IP. This will mean that ‘root’ user might not have any access to MySQL server now from the local Slave machine.</p><p>Also, ‘root’ might have different password. In Debian machine this is encrypted in the file <code>debian.cnf</code>” in your MySQL installation directory.</p><p>You can bring the <code>debian.cnf</code> file from your Master to your Slave machine. Or you can change/reset the ‘root’ password on your Slave machine.</p><p>Hint: You can change/reset the ‘root’ password on MySQL server as follows:</p><ul><li>Start MySQL so that it will not ask for password. Also, make sure it does not start replication:<br
/> &nbsp;<br
/> <code>os-shell&gt; mysqld_safe –-skip-slave-start –skip-grant-tables</code></li><li>Then connect with <code>mysql –u root</code> and issue a command to update ‘root’ password as follows:<br
/> &nbsp;<br
/> <code>mysql&gt; use mysql;</code><br
/> &nbsp;<br
/> <code>mysql&gt; update user set password=PASSWORD(‘new-password’) WHERE User = ‘root’;</code><br
/> &nbsp;<br
/> <code>mysql&gt; flush privileges;</code><br
/> &nbsp;</li><li>Stop MySQL Server that you started with skipping slave start and grant tables.</li></ul></li><p>&nbsp;</p><li>Start MySQL Server with skipping Slave Start<br
/> &nbsp;<br
/> <code>os-shell&gt; mysqld_safe –-skip-slave-start</code><br
/> &nbsp;</li><li>Set Master configuration on the Slave<br
/> &nbsp;<br
/> Execute the following command on a MySQL prompt:<br
/> &nbsp;<br
/> <code>mysql &gt; CHANGE MASTER TO MASTER_HOST=’10.100.10.80’, MASTER_USER=’repl’, MASTER_PASSWORD=’slavepassword’, MASTER_LOG_FILE=’mysql-bin.000003’, MASTER_LOG_POS=106; </code><br
/> &nbsp;<br
/> This is how you tell Slave how to connect to Master in order to replicate. Note the log coordinates. These are the coordinates you got from step 1 above.<br
/> &nbsp;</li><li>Stop MySQL that you have started on step 4 above.<br
/> &nbsp;</li><li>Start MySQL normally, e.g. on an OS shell:<br
/> &nbsp;<br
/> <code>os-shell&gt; /etc/ini.d/mysql start</code></li></ol><h2>Checking out that everything is OK</h2><p>Having started the slave MySQL node, you can log in and issue some commands to make sure that Slave is running OK.</p><ol><li>On mysql prompt, give the following command:<br
/> &nbsp;<br
/> <code>mysql&gt; show processlist;</code><br
/> &nbsp;<br
/> The output should be something similar to the following:</p><pre>
+----+-------------+-----------+-------+---------+------+-----------------------------------------------------------------------+------------------+
| Id | User        | Host      | db    | Command | Time | State                                                                 | Info             |
+----+-------------+-----------+-------+---------+------+-----------------------------------------------------------------------+------------------+
|  1 | system user |           | NULL  | Connect |  232 | Has read all relay log; waiting for the slave I/O thread to update it | NULL             |
|  2 | system user |           | NULL  | Connect |  232 | Waiting for master to send event                                      | NULL             |
| 39 | root        | localhost | mysql | Query   |    0 | NULL                                                                  | show processlist |
+----+-------------+-----------+-------+---------+------+-----------------------------------------------------------------------+------------------+
3 rows in set (0.00 sec)
</pre><p>&nbsp;<br
/> You can see the SQL thread that gets data from Master (in the above output is the thread with <code>Id 2</code>) and the SQL thread that executes the statements on Slave (in the output is the thread with <code>Id 1</code>).</li><li>On mysql prompt, give the following command<br
/> &nbsp;<br
/> <code>mysql&gt; show slave status;</code><br
/> &nbsp;<br
/> This will display the current status on slave. Pay attention to the <code>*_Errno</code> and <code>*_Error</code> columns. Normally, you shouldn’t see anything that indicates existence of errors there.<br
/> &nbsp;</li><li>On mysql prompt, give the following command<br
/> &nbsp;<br
/> <code>mysql&gt; show status like ‘Slave%’;</code><br
/> &nbsp;<br
/> You should see an output like the following:</p><pre>+----------------------------+-------+
| Variable_name              | Value |
+----------------------------+-------+
| Slave_open_temp_tables     | 0     |
| Slave_retried_transactions | 0     |
| Slave_running              | ON    |
+----------------------------+-------+
3 rows in set (0.00 sec)</pre><p>Pay attention to <code>Slave_running </code>being with value <code>ON</code>.</li></ol><h2>Important note on binary log time to live</h2><p>As we have said before, you can have Slave down and resynchronize as soon as you bring it up again. But do not put it out of service for quite long because, then it will be impossible to synchronize its content with Master. This is because the binary logs on Master do not leave forever.</p><p>There is the variable with name <code>expire_logs_days</code> that determines the number of days for automatic binary log file removal. Check this out. This should be 10, meaning that if you ever have your Slave down for 10 days or more, it will not be able to do replication as soon as you bring it up, and you will have to  everything from the beginning.</p><h2>Conclusion</h2><p>That was our story on how, more or less, we have implemented MySQL replication for our Fraudpointer application. The steps may not apply exactly to your particular case, but they can still give you a kick start and show you the way to implement replication the way it should work on your configuration.</p><p>Your comments are more than welcome. We want them. We need to improve this process and your feedback is absolutely valuable to us.</p><div
style='padding:20px 0px 50px 0px;'><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-1' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-1'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-2' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-2'); });</script> </div></div><div
style='clear:both'></div><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-3' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-3'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-4' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-4'); });</script> </div></div></div><div
style='clear:both'></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=YEHATIx7eEI:ZFazcD56ZDE:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=YEHATIx7eEI:ZFazcD56ZDE:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=YEHATIx7eEI:ZFazcD56ZDE:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?i=YEHATIx7eEI:ZFazcD56ZDE:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SitepointFeed/~4/YEHATIx7eEI" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://www.sitepoint.com/mysql-master-slave-replication-starting-replication/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <feedburner:origLink>http://www.sitepoint.com/mysql-master-slave-replication-starting-replication/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=mysql-master-slave-replication-starting-replication</feedburner:origLink></item> <item><title>What Should You Charge? 4 Methods to Avoid</title><link>http://feedproxy.google.com/~r/SitepointFeed/~3/dsNAQxr9aN0/</link> <comments>http://www.sitepoint.com/what-should-you-charge-4-methods-to-avoid/#comments</comments> <pubDate>Sun, 19 Feb 2012 23:00:03 +0000</pubDate> <dc:creator>John Tabita</dc:creator> <category><![CDATA[Best Practices]]></category> <category><![CDATA[Business]]></category> <category><![CDATA[Find Clients]]></category> <category><![CDATA[Get Started]]></category> <category><![CDATA[Getting Started]]></category> <category><![CDATA[Sell Your Services]]></category> <category><![CDATA[Selling Web Design Services]]></category> <category><![CDATA[Web Pro Business]]></category> <category><![CDATA[clients]]></category> <category><![CDATA[freelance]]></category> <category><![CDATA[freelancing]]></category> <category><![CDATA[price quoting]]></category> <category><![CDATA[pricing]]></category> <category><![CDATA[sales]]></category> <category><![CDATA[selling]]></category> <category><![CDATA[selling your services]]></category> <guid isPermaLink="false">http://www.sitepoint.com/?p=51574</guid> <description><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/scream-50x50.jpg" class="attachment-thumbnail wp-post-image" alt="scream" title="scream" />There are many ways to determine what to charge. Here are four to avoid.]]></description> <content:encoded><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/scream-50x50.jpg" class="attachment-thumbnail wp-post-image" alt="scream" title="scream" /><p></p><p>Selling a product is so much easier. You have a fixed cost at which you buy (called wholesale), so you figure out how much profit you’d like, and mark it up according. There’s even the MSRP (Manufacturer’s Suggested Retail Price) to make your life easier. But everyone who decides to sell their <em>services</em> will agonize over this question: “How much should I charge?”</p><p>There are many ways to answer that question. Let’s look at four to avoid.</p><h2>Formula-Based Pricing</h2><p>Many of us used a formula to answer that question:</p><ol><li>How much do I want to make a year?</li><li>How many hours a week do I want to work?</li></ol><p>So if it’s your dream to make $60,000 a year, working only 20 hours a week (including a two-week vacation), you do this:</p><p>$60,000 / 50 weeks / 20 hours = $60/hour</p><p>Next, determine the time it takes you to create a “basic” website (for me, that was a 5-10 page custom-designed static site, no programming). If that takes 35 hours, your pricing would start at $2,100. Or you could simply charge by the hour and the client pays what he pays.<div
id='div-gpt-ad-1328644474660-10' style='width:728px; height:90px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-10'); });</script> </div></p><p>Sounds great, except for one problem. Clients don’t care about your formulas.</p><blockquote><p>Pricing your product is actually simple, as long as you consider it from the buyer’s point of view. How much it costs you to make something is irrelevant. They don’t care …</p><p>- <a
title="Seth's Blog | The pricing formula" href="http://sethgodin.typepad.com/seths_blog/2012/01/the-pricing-formula-ss.html" target="_blank">Seth Godin</a></p></blockquote><p>Your formula has no bearing on what a client is or isn’t willing to pay. How would you justify $60 an hour if the client thinks that’s too expensive? Telling him you’re worth that because you want to make $60k a year working 20 hours a week isn’t going to convince him to hire you. Neither is telling the client “how long” it will take.</p><h2>Esteem-Based Pricing</h2><p>The second method to avoid is basing your price structure on what you “deserve” to make. I’ve read books that claim we’re not charging what we’re worth because of low self-esteem. If we improve our self-esteem, we’ll charge what we’re worth, what we deserve—and our clients will gladly pay it. Pardon me if I’m not quite convinced.</p><p>Your clients don’t care if you think you “deserve” $60 an hour because you have a computer science degree, 15 years of programming experience, hundreds of hours of formal web training, $10,000 worth of hardware and software, and a $50,000 student loan to repay, or because some self-help guru told you that you do. Clients buy for their own reasons, not yours.</p><h2>Comparison-Based Pricing</h2><p>Comparison-based pricing is when you set your prices based on what <em>you</em> think is too expensive. It usually happens after you arrive at some semblance of a price, but then you start thinking, “I don’t know, $1,000 is a lot of money; maybe I should charge $900 &#8230;” <em>You</em> might think $1,000 is a lot of money, but what are you comparing that to? Your car payment? Your rent? Your monthly income? I once suffered from this malady, but the first time a client paid three times above what I considered “a lot of money,” I was cured.</p><h2>Competitive-Based Pricing</h2><p>Researching the competition is generally considered valuable when starting a business. But I found that to be a tall order in the web industry. First of all, who’s your competition? ABC Interactive Agency, or the teenager with a cracked copy of Dreamweaver? Sure, you can scour the web or post a newbie <em>“How much should I charge?”</em> question on SitePoint’s forum, but most of us keep that pretty close to the vest. And the prices I <em>have</em> found are all over the map. Even <a
title="SitePoint Thread: Average Cost of Web Site" href="http://www.sitepoint.com/forums/showthread.php?18033-Average-Cost-of-Web-Site" target="_blank">fellow web designers can’t agree</a>. Although I did look at others’ prices when I first started out, it wasn’t a determining factor when setting my own.</p><p>So what <em>should</em> you base your pricing on? The answer lies in <em>why people buy</em>. Even established companies don’t always know why their customers are their customers. Remember, people buy for their reasons, not yours. If you don’t know what those reasons are, you’ll have a difficult time determining what to charge.</p><p
style="text-align: right"><em><a
href="http://www.sxc.hu/profile/livinus" target="_blank">Image credit</a></em></p><div
style='padding:20px 0px 50px 0px;'><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-1' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-1'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-2' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-2'); });</script> </div></div><div
style='clear:both'></div><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-3' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-3'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-4' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-4'); });</script> </div></div></div><div
style='clear:both'></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=dsNAQxr9aN0:JfMvXnhOqg4:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=dsNAQxr9aN0:JfMvXnhOqg4:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=dsNAQxr9aN0:JfMvXnhOqg4:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?i=dsNAQxr9aN0:JfMvXnhOqg4:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SitepointFeed/~4/dsNAQxr9aN0" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://www.sitepoint.com/what-should-you-charge-4-methods-to-avoid/feed/</wfw:commentRss> <slash:comments>32</slash:comments> <feedburner:origLink>http://www.sitepoint.com/what-should-you-charge-4-methods-to-avoid/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=what-should-you-charge-4-methods-to-avoid</feedburner:origLink></item> <item><title>Microsoft Reveals the New Windows 8 Logo</title><link>http://feedproxy.google.com/~r/SitepointFeed/~3/p1QodNtlRDE/</link> <comments>http://www.sitepoint.com/microsoft-new-windows-8-logo/#comments</comments> <pubDate>Sun, 19 Feb 2012 12:40:50 +0000</pubDate> <dc:creator>Craig Buckler</dc:creator> <category><![CDATA[Design]]></category> <category><![CDATA[Discussion]]></category> <category><![CDATA[graphic design]]></category> <category><![CDATA[Illustration]]></category> <category><![CDATA[Logo Design]]></category> <category><![CDATA[Windows Discussion]]></category> <category><![CDATA[logo]]></category> <category><![CDATA[microsoft]]></category> <category><![CDATA[windows]]></category> <guid isPermaLink="false">http://www.sitepoint.com/?p=51636</guid> <description><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/644-windows-logo-50x50.png" class="attachment-thumbnail wp-post-image" alt="644-windows-logo" title="644-windows-logo" />Microsoft's Windows 8 logo has been inspired by the clean lines and basic colors of the new Metro interface. It's the first redesign in 22 years so Craig takes a brief trip down memory lane...]]></description> <content:encoded><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2012/02/644-windows-logo-50x50.png" class="attachment-thumbnail wp-post-image" alt="644-windows-logo" title="644-windows-logo" /><p></p><p>Microsoft has revealed the new Windows 8 logo. I wouldn&#8217;t normally write an article about it but this is the first major redesign in 22 years. And since most of us use Windows every day, that&#8217;s a fairly big deal.</p><p>Are you ready? Here goes&hellip;</p><p><img
src="http://blogs.sitepointstatic.com/images/tech/644-windows-logo-8.png" width="500" height="97" alt="Windows 8 logo" class="center" /></p><p>While it&#8217;s no <a
href="http://www.sitepoint.com/london-2012-education-logo/">London 2012 logo</a>, I can&#8217;t help feeling a little underwhelmed.</p><p>Changing your brand is not something companies <em>(should)</em> do on a whim. <a
href="http://windowsteamblog.com/windows/b/bloggingwindows/archive/2012/02/17/redesigning-the-windows-logo.aspx">Microsoft state</a> the new logo reflects the re-imagination of the Windows operating system with clean lines, simple colors and the new Metro interface. They also admit the old logo was a flag rather than a window. <em>Did it ever confuse you?</em></p><p>I&#8217;m not totally convinced. The font is a little simplistic and why is the window icon shown in perspective when Windows 8 looks flat?</p><p>It&#8217;s a bold move that&#8217;s likely to divide user opinion. Much like Windows 8. So let&#8217;s take a brief trip through history to see how Microsoft reached this point&hellip;<div
id='div-gpt-ad-1328644474660-10' style='width:728px; height:90px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-10'); });</script> </div></p><h2>Windows Vista/7</h2><p>The semi-transparent full-color Aero theme had a big influence on the Vista/7 logo and start button:</p><p><img
src="http://blogs.sitepointstatic.com/images/tech/644-windows-logo-7.png" width="221" height="224" alt="Windows Vista/7 logo" class="center" /></p><p>It&#8217;s still recognizable as the Windows logo, but the highlights, shadows and gradients made it feel more modern.</p><h2>Windows XP</h2><p>XP remains the world&#8217;s most-used OS eleven years after its release. Again, the logo matched XP&#8217;s default theme and, while it looks a little basic today, it was a fairly radical step forward at the time&hellip;</p><p><img
src="http://blogs.sitepointstatic.com/images/tech/644-windows-logo-5.png" width="215" height="129" alt="Windows XP logo" class="center" /></p><h2>Windows 3+</h2><p>In the decade leading to XP, all versions of Windows including 3.x, NT, 95, 98, Millennium and 2000 used a variation of the flag with familiar motion trails:</p><p><img
src="http://blogs.sitepointstatic.com/images/tech/644-windows-logo-3.png" width="205" height="240" alt="Windows 3 logo" class="center" /></p><p>It looked fairly dated in the 1990s, but that&#8217;s the period Microsoft became the most dominant OS maker on the planet. The logo is business-like and businesses flocked to Windows.</p><h2>Windows 1.0</h2><p>Do you remember the original Windows logo from the 1980s? Me neither. Does it remind you of anything?&hellip;</p><p><img
src="http://blogs.sitepointstatic.com/images/tech/644-windows-logo-1.png" width="375" height="64" alt="Windows 1 logo" class="center" /></p><p>We&#8217;ve come full circle. Almost three decades of tweaks and redesigns has resulted in a logo which looks almost identical to the one first used in 1985. I think I prefer the original &#8212; although a sans-serif font would improve it.</p><p>Whatever your opinion, you better get used to it. The Windows 8 logo will appear everywhere in the lead up to the new OS release!</p><div
style='padding:20px 0px 50px 0px;'><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-1' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-1'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-2' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-2'); });</script> </div></div><div
style='clear:both'></div><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-3' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-3'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-4' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-4'); });</script> </div></div></div><div
style='clear:both'></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=p1QodNtlRDE:CRfdU_o9FYs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=p1QodNtlRDE:CRfdU_o9FYs:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=p1QodNtlRDE:CRfdU_o9FYs:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?i=p1QodNtlRDE:CRfdU_o9FYs:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SitepointFeed/~4/p1QodNtlRDE" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://www.sitepoint.com/microsoft-new-windows-8-logo/feed/</wfw:commentRss> <slash:comments>30</slash:comments> <feedburner:origLink>http://www.sitepoint.com/microsoft-new-windows-8-logo/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=microsoft-new-windows-8-logo</feedburner:origLink></item> <item><title>SitePoint Podcast #150: The Vendor Prefix Kerfuffle</title><link>http://feedproxy.google.com/~r/SitepointFeed/~3/OvIkyDAkP38/</link> <comments>http://www.sitepoint.com/podcast-150-the-vendor-prefix-kerfuffle/#comments</comments> <pubDate>Sat, 18 Feb 2012 10:12:01 +0000</pubDate> <dc:creator>Louis Simoneau</dc:creator> <category><![CDATA[Podcast]]></category> <category><![CDATA[Web Tech]]></category> <category><![CDATA[startup]]></category> <category><![CDATA[TLD sales]]></category> <category><![CDATA[venderprefixes]]></category> <guid isPermaLink="false">http://www.sitepoint.com/?p=51566</guid> <description><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2011/05/podcast-default-115x115-50x50.jpg" class="attachment-thumbnail wp-post-image" alt="podcast-default-115x115" title="podcast-default-115x115" />Episode 150 of The SitePoint Podcast is now available! This week the panel is made up of Louis Simoneau (@rssaddict), Kevin Dees (@kevindees), Stephan Segraves (@ssegraves) and Patrick O&#8217;Keefe (@ifroggy). Listen in Your Browser Play this episode directly in your browser &#8212; just click the orange “play” button below: Download this Episode You can download this episode [...]]]></description> <content:encoded><![CDATA[<img
width="50" height="50" src="http://cdn.sitepoint.com/wp-content/uploads/2011/05/podcast-default-115x115-50x50.jpg" class="attachment-thumbnail wp-post-image" alt="podcast-default-115x115" title="podcast-default-115x115" /><p></p><div><p>Episode 150 of The SitePoint Podcast is now available! This week the panel is made up of Louis Simoneau (<a
href="http://twitter.com/rssaddict">@rssaddict</a>), Kevin Dees (<a
href="http://twitter.com/kevindees">@kevindees</a>), Stephan Segraves (<a
href="http://twitter.com/ssegraves">@ssegraves</a>) and Patrick O&#8217;Keefe (<a
href="http://twitter.com/ifroggy">@ifroggy</a>).</p><h2>Listen in Your Browser</h2><p>Play this episode directly in your browser &#8212; just click the orange “play” button below:</p><p></p><h2>Download this Episode</h2><p>You can download this episode as a standalone MP3 file. Here’s the link:</p><ul><li><a
href="http://media.libsyn.com/media/sitepoint/sitepointpodcast150.mp3">SitePoint Podcast #150: The Vendor Prefix Kerfuffle</a> (MP3, 38:29, 35.3MB)</li></ul><h2>Subscribe to the Podcast</h2><p>The SitePoint Podcast is on iTunes! <a
href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewPodcast?id=296180681&amp;s=143441">Add the SitePoint Podcast to your iTunes player</a>. Or, if you don’t use iTunes, you can <a
href="http://www.sitepoint.com/blogs/?feed=podcast">subscribe to the feed directly</a>.</p><h2>Episode Summary</h2><p>Here are the main topics covered in this episode:</p><ul><li><a
href="http://css-tricks.com/tldr-on-vendor-prefix-drama/">TL;DR on Vendor Prefix Drama | CSS-Tricks</a></li><li><a
href="http://dnjournal.com/archive/domainsales/2011/2011-final-ytd-sales-charts.htm">2011 Top Level Domain Sales</a></li><li><a
href="http://www.kickstarter.com/blog/24-hours">24 Hours » The Kickstarter Blog — Kickstarter</a></li><li><a
href="http://techcrunch.com/2012/02/13/top-domains-visalus-dishes-out-825k-to-buy-challenge-com-vi-com/">Top Domains: ViSalus Dishes Out $825K To Buy “Challenge.com” and “Vi.com”\</a></li></ul><p>Browse the full list of links referenced in the show at <a
href="http://delicious.com/sitepointpodcast/150">http://delicious.com/sitepointpodcast/150</a>.<div
id='div-gpt-ad-1328644474660-10' style='width:728px; height:90px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-10'); });</script> </div></p><h2>Host Spotlights</h2><ul><li>Patrick: <a
href="http://www.crashthesuperbowl.com/#/?finalist=10925">Superbowl Ad Video (comedy)</a></li><li>Stephan: <a
href="http://yourls.org/">YOURLS: Your Own URL Shortener</a></li><li>Kevin: <a
href="http://matt.might.net/articles/ssh-hacks/">SSH tricks</a></li><li>Louis: <a
href="https://www.destroyallsoftware.com/">Subscribe — Destroy All Software Screencasts</a><br
/><a
href="https://www.destroyallsoftware.com/screencasts/catalog/how-and-why-to-avoid-nil">How and Why to Avoid Nil — Destroy All Software Screencasts</a></li></ul><h2>Interview Transcript</h2><p><strong>Louis:</strong> Hello and welcome to another episode of the SitePoint Podcast, I think it’s episode 150, is it not?</p><p><strong>Stephan:</strong> It is 150, I believe.</p><p><strong>Patrick:</strong> Everyone believes, no one knows, that’s how all opt-in we are (laughter).</p><p><strong>Louis:</strong> That&#8217;s how organized we are. So we’ve got a panel show this week; Patrick, Kevin and Stephan are all on the line, hi guys.</p><p><strong>Kevin:</strong> Howdy, howdy.</p><p><strong>Patrick:</strong> Hello.</p><p><strong>Louis:</strong> How you guys been?</p><p><strong>Stephan:</strong> Busy.</p><p><strong>Patrick:</strong> Pretty good; last show I was down in Orlando to record it with Kevin on his couch, and spend some time in Atlanta, spoke at CNN, and I’m actually drinking a Coke from a glass bottle right now, so, there’s that, I got it from the World of Coke in Atlanta. Which if you know me you know I love soda, and I love the World of Coke where you can drink over 60 different soft drinks from around the world, but also the new Coca-Cola Freestyle machine which dispenses another 100+, so, yes, it’s a great place.</p><p><strong>Kevin:</strong> I absolutely hate those Coke dispensers because they are not as carbonated as they should be, and it feels like a mixed drink that hasn’t been mixed thoroughly, so, you know, and you don’t want to mix a coke because then you lose all your carbonation, so it’s like you don’t have enough carbonation and then you mix it and they don’t have any carbonation anymore, so now you’re drinking a flat soda. Cool idea, bad implementation.</p><p><strong>Louis:</strong> (Laughs)</p><p><strong>Patrick:</strong> And then it turned into the soda show (laughter). No, I love the Freestyle, I love the Coca-Cola Freestyle, but I will say that there are some sodas, and it’s really like one or two that I prefer the standard mix versus the Freestyle, but the Freestyle is actually kind of new and kind of cool technology that our audience might appreciate because it dispenses the syrup and the carbonation and the water in like a precise formula so that the restaurant can’t change that and mess it up, so this is how it’s supposed to actually taste, so, I thought that was interesting.</p><p><strong>Louis:</strong> Years ago when I was traveling through the U.S. I was in a, um, I think it was a McDonald’s, and they served I think it was a Sprite where it was too much syrup, where they’d messed up the mix, and it was just like &#8212; it was just like liquid sugar with a little bit of water and a little bit of carbonation, it was awful.</p><p><strong>Patrick:</strong> Yeah.</p><p><strong>Louis:</strong> Anyway, I don’t do soda anymore, not because of that (laughter).</p><p><strong>Patrick:</strong> You came to America and America totally turned him off to soda because of that McDonald’s, shame on you.</p><p><strong>Louis:</strong> Yeah, no, that’s not how it happened. Anyway, so we should talk about things other than soda because I’m sure that, you know, that’s not what brings our audience to the SitePoint Podcast, although it may in the future; if you like hearing soda-related tidbits come back next week.</p><p><strong>Kevin:</strong> Soda-cast!</p><p><strong>Patrick:</strong> Yes!</p><p><strong>Louis:</strong> We should make a soda-cast. Anyway, so the major story this week, at least that crossed my radar, has been an ongoing kerfuffle, let’s call it that, at the CSS Working Group and W3C. So this all sort of came to light on Thursday of last week when Daniel Glassman, I hope I’m pronouncing that name correctly, wrote this blog post describing some of the goings on at the latest meetings of the CSS Working Group. And basically the rundown of the situation is that as many of you will know, recently as new CSS features make their way into browsers, a lot of browsers sort of testing the waters with their implementations, and they’re not exactly sure how &#8212; or the spec isn’t finalized yet, for example, so they’ve been using vendor prefixes, you’ll be familiar with a -webkit- property name, so like WebKit box shadow or a WebKit border radius, the Mozilla one is Moz, and the Opera one is just an O, so obviously developers have been using these pretty extensively; Kevin and Stephan you guys write some code, have you guys done a lot of work with vendor prefixes?</p><p><strong>Kevin:</strong> Too much.</p><p><strong>Louis:</strong> (Laughs)</p><p><strong>Kevin:</strong> To sum it up.</p><p><strong>Louis:</strong> Right. So, anyway, the goings on at the Working Group were that the other browser makers, that is to say not Google and Apple, have said, look, everyone’s just implementing the WebKit ones, web developers, that is to say, are writing sort of WebKit-only pages to sort of test these experimental features, even when those features are available in prefixed form, or even in non-prefixed form, you know, the browsers including mostly Firefox and Opera, but also for some properties I guess Internet Explorer. And what happened is that Firefox, or the makers of Firefox just sort of said, look, we are gonna start supporting the WebKit prefixed one, and that’s what everyone’s doing, and people don’t seem to know that in the case of some stable features they can just drop the prefixes, and in the case of other features there is a Mozilla equivalent; people are just writing the WebKit ones because they’re trying to support mainly IOS and Android on mobile, and also Chrome and Safari on the desktop; WebKit has a pretty big market share at the moment. So obviously this caused a bit of uproar, and Glazman wrote this big, I guess, call for action is what he calls it, saying look if we let this happen it’s pretty much the return to the days of proprietary features in IE6, and then everybody came out sort of in support of that. So, I wanted to get your guys’ read on this, maybe Kevin especially because you do a bit more front-end stuff.</p><p><strong>Kevin:</strong> Yeah, so, I mean prefixes are kind of the cola wars of browsers, in my opinion, you know it’s not as flamboyant as it was back in the IE5, IE6 days where everybody was just kind of up in arms, you know the Firefox one day just, well, just, you know, everything coming to a head, and the invention of Ajax and all that, so all those things were good, though, right, I mean that’s what brought us to the Web where are today. So, like I said, we have Ajax where we can do asynchronous calls to XML files, even JSON, you know, any kind of document we want. Now today it’s the prefix, right, and it’s been a big topic because it’s kind of a valid way of doing this because it’s in the CSS specification where you can &#8212; it’s basically set out that you can use vendor prefixes. And so to me that’s what makes it more of a cold war, right, because it’s legal everybody’s just kind of doing it under the table, doing their own thing. And so to other vendors picking up other vendors’ prefixes seems a little scary to me because that’s stepping outside of what the W3C had set out to do with these which was prevent that very thing from happening, like you had with the filter element in Internet Explorer, right. And so, yeah, you know, this doesn’t give me a good feeling, I like the idea of vendor prefixes, I think it’s great for expanding on ideas and trying out new things without effecting the way things can be implemented in the future, but at this point it looks like I think this is really a problem that’s been designer related, right; designers and developers have created this demand for these features, and since the W3C can’t move fast enough to feed the designers what they want, and the developers as well, I’m not trying to make this a one-sided argument or anything, I think that’s kind of what’s causing this issue is the impatience of developers, and that kind of thing. And so the only solution that browser makers can do, because nobody’s going to pitch their browser if they’re behind, right, I mean you can see there are a lot of things in play here, and so, yeah, I think it’s just a big, crazy mess, and the W3C has to figure something out to work with all these browsers, I mean it’s nothing &#8212; it’s hard to just make a small comment on because it’s so complex.</p><p><strong>Louis:</strong> Yeah. So, a couple of things related to some of what you just said, one of them is saying that developers are impatient for these features, and that’s true to some extent, and there are cases that are more similar to filter, in the case of, for example, WebKit Text Size Adjust is a property that was created in WebKit, and it’s used on IOS and Android but was never in the CSS specifications, but a lot of these things are properties that were in the specifications and either, well, first of all the CSS3 spec is still in progress, the browser didn’t want to lock down &#8211;</p><p><strong>Kevin:</strong> Exactly.</p><p><strong>Louis:</strong> &#8212; and create a version of that that might then be not backwards compatible. A good example of that is the original gradients and syntax that existed in WebKit is not the syntax that’s currently used in the W3C spec, and it’s not the syntax that was used by the other browsers. So currently if you do WebKit gradient that does something entirely different from the linear gradient and radial gradient properties, and the fact that it was boxed away into a vendor prefix form sort of protects us because we can now use the standardized form, and it won’t break on those older versions of Chrome and Safari, of which obviously there are a few because the browser upgrade cycles have improved as well. And then putting it back on the W3C, as you said, they have to come up with something; I don’t think it’s necessarily up to the Working Group and up to the browser makers, there’s not a lot they can do, and Eric Meyer wrote a good blog post sort of summing up what he sees as the browser makers positions here, so I’ll just quote briefly from his blog post, “As a vendor it may be the least bad choice available in every competitive marketplace, after all, if there were a few million sites that you could render as intended if only the authors used your prefix instead of just one, which would you rather: A) embark on a protracted massive awareness campaign that would probably be contradicted to death by people with their own axes to grind, or just support the prefix that people are using and move on with life?” So in this case he’s saying if you’re Mozilla, yes, the correct thing to do is to keep pushing the -moz- prefix and supporting a standardized non-prefixed form once the thing is stable and you feel like you’ve got a solid implementation, but if there are a million sites out there on the Web that look broken because they’ve only used WebKit, then for user browser makers your main prerogative is to serve your users and make the sties that they visit not look broken, right. I think it’s largely up to developers to really not be lazy about this, if you want to make a cool demo and you use Chrome and you have an iPhone that’s great, you can make a cool demo, but take the time to find out whether the property that you’re demoing actually exists in Firefox and exists in Opera, and chances are it probably does, and if it does don’t just do the WebKit one, right &#8212; right?</p><p><strong>Stephan:</strong> Right. (Laughter)</p><p><strong>Kevin:</strong> You know sometimes you have to stop and think about these kinds of things for a second, it’s hard to &#8212; because I mean it is a complex situation; you know right when you think web standards has won, you know, something like this comes out and happens and it’s a little scary, and something you have to be watchful of, it’s good that people are talking about it, you know, but at the end of the day web standards are just that, they’re standards, and you’re trying to create a unified language for everyone to use that way when, like you said, a browser gets updated your site doesn’t break. And so the danger that I see in this is, yeah, you’re gonna go and adopt this other prefix, let’s say you’re at Firefox, right, and you adopt the WebKit prefix, you go and do this but it doesn’t change people’s code, you know what I mean, it’s like it doesn’t help standards at all, it only hurts them.</p><p><strong>Louis:</strong> Absolutely. I’m not saying that this is a good thing for Mozilla to be doing, it’s a terrible, terrible idea, but from the perspective of a browser maker, like what Eric’s article was trying to say, is that it seems like it’s the logical thing for them to do, even though it’s the wrong thing objectively for the Web and for web standards going forward. I mean the last thing we want is for these WebKit properties to wind up in all browsers, and that sort of circumvents the W3C entirely, right, then it’s just whatever WebKit does other browsers decide to support if they like it, if they don’t they don’t, I guess, and then you don’t have a standards process, then you just have one browser maker controlled by a few ginormous companies that &#8212; or, to be clear, WebKit is open source but a large percentage of the contributions come from Google and Apple, you know, that’s definitely not the way we want to go.</p><p><strong>Kevin:</strong> You know because there are so many platforms in place, I mean you have Windows, Linux and Apple, right, right now, and those are kind of the big-time, I mean you have other proprietary operating systems, but those are like server software and that kind of thing, so you don’t really have browsers on them. But, uh, it’s something where I mea I know they’ve been fighting for this for a long time and we’re probably pulling this out, this conversation out a little bit, but it would be nice if everyone could just get together and say here is our one rendering engine, and I know this isn’t gonna happen because there is a certain amount of control that you need on an operating system to please, I mean it’s a business. At the end of the day what I’m trying to say is it’s a business, and whether you’re Firefox, Internet Explorer or Google your business is getting people to see your brand, and since everybody surfs the Web, the browser’s an excellent way to do that, and I think until that goes away we’re always going to have standard problems.</p><p><strong>Louis:</strong> Okay. So first of all I don’t think that’s a fair call because at least one of the rendering engines out there, which is to say Firefox from Mozilla, is not a business, it’s an open source project put out by a non-profit.</p><p><strong>Kevin:</strong> This is true.</p><p><strong>Louis:</strong> And to some extend WebKit also sort of falls in that realm, even though it’s championed by two very large companies, and those two very large companies another valid point is that they’re often at each other’s throats, so saying that they’re trying to push the browser engine WebKit to try and advance through an agenda is valid, but they’re also helping their competitor, right, so it doesn’t &#8212; it’s not just business, I don’t think that’s the only reason why the standards process is difficult, and I think it was actually kind of working, I mean these vendor prefixes were effective. One of the suggestions people have made is that the experimental ones shouldn’t still be there after the property is stabilized, so that means if you support box shadow in an un-prefixed form in your browser then there’s no reason to still support WebKit box shadow because you want to push developers towards using the standard form, right; these are only sort of an interim stopgap solution while you’re testing things.</p><p><strong>Kevin:</strong> Right. That still kind of breaks the Web in a way, though, because you lose future compatibility versus backward compatibility.</p><p><strong>Louis:</strong> Yeah. Another suggestion that I read that I really liked, I don’t remember who suggested this, but someone had mentioned that a good idea might be to have the vendor prefixed properties only exist in develop versions of the browsers. So if I’m using the nightly builds of WebKit then I can test around with these WebKit ones, but as soon as it goes to a full release where it’s pushed out into Chrome and Safari either you support the property or you don’t.</p><p><strong>Kevin:</strong> It’s an interesting idea.</p><p><strong>Louis:</strong> If you do then there’s no prefix, and if you don’t then it’s just out, which I think is probably &#8212; it seems on the surface of it like a good idea, I haven’t given it a whole bunch of thought, but it seems like it might sort of solve some of these problems where people are making websites out in the wild using these experimental properties and sort of tying their sites to one browser or one rendering engine.</p><p><strong>Kevin:</strong> Right. Yeah, I like that idea because at the end of the day what a lot of browser makers need is feedback from implementers, right, and so that would be an excellent way to do that, I think. Now, you wouldn’t get as many implementers because not everybody runs develop builds, but you would still get a good many.</p><p><strong>Louis:</strong> Yeah, and without necessarily running the risk of people developing production websites with experimental properties. Anyway, I just &#8212; it’s good to get a bit of a read on this, it’s been obviously a huge outroar on the Web, there have been blog post far and wide, SitePoint, long time SitePoint friend Rachel Andrew wrote a blog post decrying this action on the part of Mozilla and other &#8212; well, basically just saying look we’ve got to fix this, so people have come up with &#8212; there’s a petition and a pledge telling browser makers not to implement WebKit vendor prefix and promising to update the sites that you do control, so if you do feel like this is something that matters and you don’t want the other browser vendors to start standardizing around the WebKit form then there’s that option, there’s also a project started by Christian Heilmann, who’s of Mozilla, which is called Prefix The Web, I’ll put a link to that in the show notes, and that is people going around finding open source projects on GitHub and demos of CSS3 functionality that people have put on GitHub, and just patching that code to support other browsers where possible, so there’s a whole list of those of projects people have found and updated to be more cross-browser compliant, so a lot of things that, you know, a lot of people are jumping into this bandwagon and trying to get people up and angry about this, so that’s good, we’ll have to wait and see what happens though.</p><p><strong>Kevin:</strong> Yeah, it’s the nature of the Web, right, there’s always something crazy going on, it really is.</p><p><strong>Louis:</strong> Yeah, cool. Well, I guess that wraps that if someone wants to jump in with the next story.</p><p><strong>Kevin:</strong> So, I have an interesting article to get off the CSS train for a second and talk about the Kickstarter.</p><p><strong>Patrick:</strong> Yay. (Laughter)</p><p><strong>Louis:</strong> Yeah, what happened to the train, we haven’t heard the train yet today Kevin?</p><p><strong>Kevin:</strong> Yeah, yeah,</p><p><strong>Patrick:</strong> whoo whoo (laughs)</p><p><strong>Kevin:</strong> I’m sure it’ll be around later, I think it comes at 7:30, but maybe 7:45 today, we’ll see.</p><p><strong>Patrick:</strong> It’s running late from Albuquerque.</p><p><strong>Kevin:</strong> So, there’s a blog post up, it was posted on February 10th, about the last 24 hours, of course then, of Kickstarter and how they’ve made some giant leaps and bounds in what they’re doing. And I think Kickstarter is a worthy company and project to talk about because it helps other people work together to finance ideas and projects and that kind of thing. Basically what they have going on is basically a timeline on this blog post of all the things that have happened over 24 hours, it was a big day for Kickstarter and just all the different things between political efforts and some very large projects that they have going on; I believe Elevation Doc saw close to a million dollars for their project. And so I was wondering maybe if you guys had thoughts on a project like this that kind of takes off, like your opinions and stuff on maybe what other people could do to get involved in a project like this. Like how &#8212; I think, Patrick, you would probably have some opinions on this, but, you know, I’m sure you’ve heard of Kickstarter, but how would somebody go about getting involved not only in like one of these good projects, but also starting their own project. Like because I think on the cusp of something like this it’s good to kick into the imagination; I know I’m stumbling all over my words here, but, interesting I would say.</p><p><strong>Patrick:</strong> Kickstarter’s awesome, I mean I think I love the idea of it, it’s not like a complex idea, it’s a pretty simple idea, it’s a simple concept, and they’ve got the community and the traffic to make it a successful venture, and that’s really what it’s about, not necessarily the idea but the execution. And I think it’s great for them to hit this mark and to have projects that go over a million dollars, it really makes me think creatively about what I could do with the platform myself if I have different ideas for different projects that I want to fund, and to be able to get that funding before laying out the investment. Not that it really disrupts venture capital so much, I think that space is still kind of its own sort of country and has it’s own sort of norms and principles, but definitely this is a case where people can go out there and more simply get funding and maybe maintain more control of their idea by delivering it directly to the people who want their product or want to see them release whatever it is they are interested in putting out. So, to me it’s a great idea and it’s great to see them be successful, and it’s great to see so many different content creators and product developers look to Kickstarter to put out something; I notice a lot of web video channels, a lot of successful &#8212; YouTube channels especially, putting out Kickstarter campaigns or similar campaigns to fund their next big thing, or maybe they’ll want to do a movie or a longer feature, and so they’re using Kickstarter or something similar to fund it, mentioning people in their videos, having people pick elements of the video; there is a series called Beer and Board Games from Blame Society Films that is a lot of fun, and they have people who you can pick the beer, you can pick the game they play, and so they get the funding but then they make the people a part of the project as well, and I think that’s a lot of fun.</p><p><strong>Louis:</strong> Yeah, it’s an awesome thing, and it’s great for people who have ideas to be able to just kick it directly to their fans, especially if they’ve already got a following and just want to, like you said, do something a bit bigger and more ambitious. I have to say &#8212; I’m just gonna nerd this up a little bit; I was kind of disappointed because when I see these like, oh, we had this crazy 24 hours blog on a startup website I’m hoping for like our servers were getting hammered and here’s what we had to do, and all the nerdy technical details. And just so the listeners aren’t disappointed, there’s none of that, it’s all about successful and just how it blew up on social media, not about how they weathered the storm of all the increased traffic.</p><p><strong>Patrick:</strong> Right, no, none of that (laughter). It’s a mainstream blog post; we’ll put it that way.</p><p><strong>Louis:</strong> Yeah, maybe they have a technical blog as well; maybe I’m just not looking at the right place.</p><p><strong>Patrick:</strong> Yeah, it’s possible.</p><p><strong>Kevin:</strong> I think I’m a little biased to Kickstarter in a way because it’s such a good site, right, I mean I’ve seen really good things come out of it, there’s projects for like WordPress plugins, and that kind of thing, and I think even some iPad gear came out from this, and these are all just individuals who have an idea and want to get other people who like that idea, or have similar interests, to get involved so you can help create things that aren’t just blah, if you know what I mean, like it’s a quality product, right, because there is some investment, and you can put time behind the things, and I just love it, I think it’s great.</p><p><strong>Patrick:</strong> Yeah, it is, and have you funded anything, Kevin?</p><p><strong>Kevin:</strong> Yes, I have. So, one of my friends, he works with a lady and they do music albums, and so I supported them, it’s the Hannah Miller, you can look them up, I love that music, it’s good.</p><p><strong>Patrick:</strong> Okay, yeah, I haven’t funded anything myself, not yet anyway.</p><p><strong>Kevin:</strong> Right.</p><p><strong>Patrick:</strong> I want to, though, I will one day, I’m sure. Put your money where your mouth is, Patrick.</p><p><strong>Louis:</strong> That’s right. Yeah, let’s do it. Speaking of money, that’s a perfect segue.</p><p><strong>Patrick:</strong> So, speaking of money, I picked up a story on TechCrunch by Rip Empson, and he reported on the sale of two domain names, not your everyday sale, though, because it was challenge.com and vi.com, and challenge.com was sold for $500,000.00, while vi.com was sold for $325,000.00 to a company named Visalus Sciences, I believe. And that story linked me to bigger lists of the biggest domain name sales of 2011, so last year’s top 100 domain name sales by the actual cost of the domain name. So the number one domain name last year sold, the most expensive one was social.com, which was sold for 2.6 million dollars, then domainname.com, and dudu.com, I assume that means something to someone or in some other language, both sold for a million dollar each, and there’s this long list of names, 3d.com jumps out to me for $500,000.00, and for the kind of web dev technical audience that we have, datacenter.com sold for $352,500.00, and livecloud.com sold for $92,000.00, so, yeah, I’m always curious of what domain names are worth, so this helps to guide me; not that I have any that are worth half a million, of course.</p><p><strong>Louis:</strong> Yeah, I mean that stuff is kind of crazy, it’s really surprising to me to look at this because &#8212; and so what did you say social.com sold for, sorry?</p><p><strong>Patrick:</strong> 2.6 million. It was the most expensive by far, like the closest one was domainname.com for a million.</p><p><strong>Louis:</strong> Yeah, but I mean even let’s go with $500,000.00 and up, I find it difficult to imagine other than, you know, if it’s your brand, if it’s like hp.com or apple.com then obviously the value of that to you as a company could reach that kind of number, but I can’t possibly imagine anything that you could do with social.com that would reach anywhere near that level of investment that you couldn’t do with a different domain. Increasingly it seems like the domain name is less and less relevant in web ventures because everyone finds things via Google, or you’ve got a Facebook page or Twitter, I mean it’s easy to find anything. I think even as recent goings on with like, for example, Facebook login being the most commonly searched thing in Google, right, or it was at some point, or it was in the top ten of searches, right; people aren&#8217;t even entering Facebook.com to go to Facebook, so it seems like the domain name is kind of irrelevant, and especially something like social.com where it doesn’t have a strong branding, it’s just sort of this random word, it kind of baffles me.</p><p><strong>Patrick:</strong> Yeah, I mean I can understand that. There are two, you know, there’s a couple thoughts, domain names, branding, it can have an impact on getting funded, I’ve heard multiple people say this before that if you have a great pitch and great domain name you’ll go a lot farther than if you just have a great pitch. Is that fair? Is that vanity or cosmetic? Perhaps, but it is something that I’ve seen repeated multiple times, and so you do have as far as, like you said, people go to Google, the domain name does impact searches and results, what’s in the domain name. So, for example, domainname.com might have a decent chance at ranking for the search term domain name if you were starting now versus starting as eNom, let’s say eNom has built up links and they’ll get credit for that, but if you are one of those right now and you’re targeting that term, domainname.com is gonna put you head and shoulders above generic branding. But I can understand your point because that’s a point a lot of people make is that if you have a million to spend on a domain name then you have a million to spend on something else.</p><p><strong>Louis:</strong> It just seems to me like if you’ve got &#8212; let’s say I’ve got an idea for a website that is gonna be the next social network, right, I can either spend 2.6 million dollars hiring developers and designers and making a product, or I can buy social.com and then spend a thousand dollars hiring designers and developers making a product. And if feels to me, like my gut feeling is that the better product is a more worthwhile investment of my time, whether or not it’ll be more successful, and you mentioned funding, I mean the funding thing is crazy too, right, because that’s not an indication of actual success, as we’ve seen recently with Groupon and things like that, you know, getting funding isn’t an end in itself, right, it’s just another step along the way, and if you don’t have a business model or if you can’t turn a profit or if you don’t have a product then that’s not getting you any further than a good domain name is.</p><p><strong>Patrick:</strong> Yeah, and one thing that you might throw out there is that if you have the money to pay developers and you have the money to get a great domain name, then it’s maybe better to have both instead of one. But if you have to choose one then you want to be careful where you invest it.</p><p><strong>Louis:</strong> You know up to a point, I can understand if you’re starting a new venture that domain names you want aren’t necessarily available, right, or if somebody’s got them and you can get them for two or seven or even ten thousand dollars, if it’s part of a big business venture and you say this is the domain name, and I’m not expecting you to be able to start &#8212; I’m not saying that people can ‘I want to start a new website about whatever’ and the domain name is just gonna cost me the ten dollar registration, I don’t think that’s very common anymore because a lot of domain names are taken or squatted, right. So you might have to pay something for them, but it just seems to me like paying that much for them is kind of crazy. Again, part of it is coming from the perspective that I come from working at Flippa where we do a lot of sales of websites, established websites, and not a lot of sales of domains like Sedo, which is mentioned in this article, do more domain sales, but for us we’re seeing like when you’re looking at a website it’s all about traffic and links and even revenue, because these are real businesses, right, you’re buying something, not just a property, which is hard to quantify anything about other than it’s a dictionary word and it’s short and so it’s worth two million dollars, I don’t know, it baffles me. Clearly it doesn’t baffle people who have two million dollars, and maybe they’re smarter than me because that’s why they have two million dollars.</p><p><strong>Patrick:</strong> I don’t know if that’s the case, but domain names do have value, I think, at the end of the day, so that it’s kind of like that &#8212; the address or the real estate of the Web, there’s value there, and there’s different examples, like I could say Flippa, for example, if you search websites for sale Flippa is number one right now, flippa.com/buy, and that’s a great place to be. Of course Flippa has the SitePoint &#8211;</p><p><strong>Louis:</strong> The SitePoint bump.</p><p><strong>Patrick:</strong> &#8212; party limited. Yeah, the SitePoint bump, but if you go to the third site there, Websites for Sales, plural, is the third site listed there. And the site that I go to is nothing particularly nice let me tell ya. So, there is something to be said for that, but I do agree with you, and, you know, I think it’s an interesting discussion, and also one thing I wanted to point out also was country code domain names, the most expensive country code domain names, so non-.com, .net, .org, specific countries, was at Aktein.de which is stocks in German, that sold for $725,000.00, and on the web development note, or at least the Web note, internet.co sold for $40,000.00, seo.in sold for $18,500.00, servers.eu and addserver.d sold for $18,000 and $17,940 respectively.</p><p><strong>Louis:</strong> You know, of that I would have to say that seo.in sounds like that was a bargain, like it sounds like you would expect to pay more than $18,000 for that given the sort of explosion of SEO. So, in is India, right, I’m not getting that wrong?</p><p><strong>Patrick:</strong> I believe that is the case, yeah.</p><p><strong>Louis:</strong> Yeah, anyway, I think someone got a steal with that one, but, again, I don’t know anything because I don’t have two million dollars.</p><p><strong>Patrick:</strong> I wish I had lots of money. I would have many beautiful domain names. With that said, I think it’s time to talk about spotlights, and I will go first with my patented offbeat spotlight, Patrick’s offbeat spotlight corner, a regular series here on the SitePoint Podcast.</p><p><strong>Louis:</strong> Is Patricksoffbeatspotlight.com available? (Laughter)</p><p><strong>Patrick:</strong> It might be.</p><p><strong>Louis:</strong> Is that worth $18,000.00?</p><p><strong>Patrick:</strong> I think it’s worth the registration fee; might not even be worth that. But, so my spotlight is a commercial from the Superbowl called Man’s Best Friend, it was part of Doritos Crash the Superbowl website where people can submit different commercials, this one was by Jonathan Friedman, and the description is: while working in his yard a man observes a crime being covered up, but the culprit has a unique way of keeping the two witnesses quiet, and I kind of don’t want to talk about it because it’s 30 seconds, so if I describe it it’s ruined, so just check out the link and enjoy the commercial.</p><p><strong>Louis:</strong> Right. And the Superbowl is an American football competition, if I understand correctly.</p><p><strong>Patrick:</strong> Yes, yes, and assuming &#8212; it’s inconsequential to what we’re discussing here. Now, the one thing is, though, I’m hoping that people beyond U.S. will be able to see the commercial. I can’t guarantee that for sure, but hopefully that is the case.</p><p><strong>Louis:</strong> We’ll find out. Yep, I just tested it and it works here, so most likely it is available in all countries, or at least most countries.</p><p><strong>Patrick:</strong> That’s what they say about Australia, right, if you can make it here you can make it anywhere, isn’t that Australia?</p><p><strong>Louis:</strong> (Laughs) if you can see it here you can see it anywhere, that’s what they say about Australia on the Internet.</p><p><strong>Patrick:</strong> There we go. Down to the last minute. Stephan, what do you got?</p><p><strong>Stephan:</strong> I can go next. I’ve got this website called yourls, it’s y-o-u-r-l-s.org, and it’s a custom short URL creator, and it has a plugin for WordPress, so it’s a set of PHP scripts to create your own short URLs. I know we love those on this show, so I figured why not.</p><p><strong>Louis:</strong> Yeah, I mean I think we have talked about this before, and it is definitely cool to be able to have your URL shortner on a server you control so you have it in your own database, and it also does click tracking and statistics like Bit.ly does, yeah, it looks really cool.</p><p><strong>Stephan:</strong> Yeah, simple.</p><p><strong>Patrick:</strong> Do you use this, Stephan?</p><p><strong>Stephan:</strong> No, I don’t, I just found it today, so I thought it would be neat to share.</p><p><strong>Patrick:</strong> Yeah, I’m familiar with it, I just haven’t made the decision of what I want to use, like, and if I want to even do it, because I have ifrog.gy, so ifroggy but i-f-r-o-g.gy, and I’m not sure if I want to put it on bit.ly or if I want to use this, or what; if anyone has a recommendation leave it in the comments.</p><p><strong>Louis:</strong> What’s gy?</p><p><strong>Stephan:</strong> I think it’s Guyana.</p><p><strong>Patrick:</strong> That’s correct, Stephan, it is. Gee-yana, Guyana, something like that.</p><p><strong>Louis:</strong> Was Guyana fairly easy to deal with registration.</p><p><strong>Patrick:</strong> I paid via carrier pigeon.</p><p><strong>Louis:</strong> Like some of them you have to fax something in, some of them you have to prove you’re a business.</p><p><strong>Patrick:</strong> No, it’s a bad joke, but yeah, I mean it was a slow process, I had to register, like wait a month and wait for it to go through and them to email me, because the site that I registered through, 101domain.com, they’re a pretty well-known registrar, but I guess it was the actual person who manages the registry in that country that takes a long time, but once it’s set up and on the server I mean my assumption is that it should be okay, but that is part of my hesitation.</p><p><strong>Louis:</strong> Yeah, a friend of mine was trying to register at .ie, a domain name, which is Ireland, and apparently they just said, no, that’s not a website devoted to an Irish business, like you really have to demonstrate that you’re making an Ireland-related website or you’re an Irish business.</p><p><strong>Patrick:</strong> Yeah, yeah.</p><p><strong>Louis:</strong> You can’t just use it as part of a word like people do with ly or gy in your case.</p><p><strong>Patrick:</strong> Yeah, different countries have different restrictions as far as what you can do, and many of them do require you to at least maintain a presence in the country or in some cases even stricter than that.</p><p><strong>Louis:</strong> I’d maintain a presence in Guyana, I could get a little beach house.</p><p><strong>Patrick:</strong> (Laughs) I don’t know.</p><p><strong>Kevin:</strong> Carrier pigeon.</p><p><strong>Louis:</strong> Just for the domain name, of course.</p><p><strong>Patrick:</strong> Yeah, I’m looking at the Wikipedia page for a list of Internet top-level domains, and like Finland requires you to be a company or organization registered in Finland, or be a Finnish national, Guinea requires a local contact, so, yeah, it seems like &#8212; I don’t know how common that is or how restricted they are, but in some cases it definitely is the case. I mean they make less money, but I guess they maintain a more, how do I want to put this, pure domain pool, I don’t know.</p><p><strong>Louis:</strong> Yeah.</p><p><strong>Patrick:</strong> Kevin! What do you got?</p><p><strong>Kevin:</strong> I have an excellent article on SSH, since SSH is super exciting.</p><p><strong>Patrick:</strong> Yay.</p><p><strong>Louis:</strong> I’m really excited by SSH, I don’t know about anyone else, but I didn’t even take that sarcastically. (Laughter)</p><p><strong>Kevin:</strong> It actually is a very cool thing, in fact, it can be more cool for you if you’re using it for just secure &#8212; connecting to your server securely, connecting to a server; you can use it for a lot more, and this article covers just that, and so they cover why you should use SSH, and then also maybe executing remote commands, copying files, you know, so there’s a lot of really cool stuff in here you need to check out if you use SSH. I use SSH for everything; I use it to connect MySQL databases, I use it to &#8212; I mean if it has to do with a server I use SSH, and I think this is an excellent article on the topic.</p><p><strong>Louis:</strong> Yeah, I spend pretty much ten hours a day everyday shuffling through SSH because I develop on a virtual machine and I SSH to the terminal.</p><p><strong>Patrick:</strong> Ouch!</p><p><strong>Louis:</strong> Any little tips and tricks I definitely appreciate. Speaking of tips and tricks, see segue, man, we’re all about segues this week; my spotlight is a series of screencasts created by a guy called Gary Bernhardt, and they are called Destroy All Software. So, he bills it as screencasts for serious developers, they are not free, they’re a nine dollar a month subscription, but they’re great, we’ve collectively bought a subscription here at Flippa for our dev team, and I’ve been powering through them in the last couple of days, and they’re really good. So they’re kind of more advanced developer topics, so either UNIX command line stuff, test driven development, a lot of stuff about VIM and using VIM effectively, and Git for version control. The bits that are about development and software tend to focus on Ruby, but there are little tidbits and design patterns sort of useful in any language. But it’s one of those things where you’re watching them, and they’re very, very dense, he does a lot of stuff in 10 to 15 minutes per screencast, but just being blown away by how fast and how effective the guy is using his tools and understanding the code that he’s writing, and it really gives you a good insight into the stuff. So if you use any of these tools I recommend checking it out, there’s one of them that is available for free as a demo, and it is the one about avoiding nil or nul values in your code, why that’s important and how to do it, so I’ll put a link to the one that’s free as well in the show notes.</p><p><strong>Kevin:</strong> Interesting. See now you have me excited.</p><p><strong>Louis:</strong> Awesome (laughs).</p><p><strong>Kevin:</strong> It’s a good trade, it’s a good trade.</p><p><strong>Louis:</strong> That’s what we aim for. Alright, so that wraps it up for this week, and let’s just go around the table.</p><p><strong>Kevin:</strong> I’m Kevin Dees and you can find me at <a
href="http://kevindees.cc/">kevindees.cc</a>, and on Twitter as <a
href="http://twitter.com/kevindees">@kevindees</a>.</p><p><strong>Patrick:</strong> I’m Patrick O’Keefe for the iFroggy Network; I blog at <a
href="http://managingcommunities.com/">managingcommunities.com</a>, on Twitter <a
href="http://twitter.com/ifroggy">@ifroggy</a>, i-f-r-o-g-g-y.</p><p><strong>Stephan:</strong> I’m Stephan Segraves, you can find me on Twitter <a
href="http://twitter.com/ssegraves">@ssegraves</a>, and I blog at <a
href="http://badice.com/">badice.com</a>.</p><p><strong>Louis:</strong> And you can follow SitePoint on Twitter <a
href="http://twitter.com/sitepointdotcom">@sitepointdotcom</a>, that’s sitepointd-o-t-c-o-m, you can email us at podcast@sitepoint.com, and course you can go to <a
href="http://sitepoint.com/podcast/">sitepoint.com/podcast</a> to find all of our show, subscribe to the RSS, leave a comment, anything you want to do with the podcast will be at sitepoint.com/podcast. Thanks for listening, next week I hope to have maybe a little mini-panel of interviewees talking about the whole vendor prefix kerfuffle, so tune in next week; we should have a great show of some experts being able to comment on that.</p><p>Theme music by <a
href="http://www.belikewater.ca/">Mike Mella</a>.</p><p>Thanks for listening! Feel free to let us know how we’re doing, or to continue the discussion, using the comments field below.</p></div><div
style='padding:20px 0px 50px 0px;'><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-1' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-1'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-2' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-2'); });</script> </div></div><div
style='clear:both'></div><div
style='float:left;padding-left:40px;'><div
id='div-gpt-ad-1328644474660-3' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-3'); });</script> </div></div><div
style='float:right;padding-right:40px;'><div
id='div-gpt-ad-1328644474660-4' style='width:300px; height:100px;'> <script type='text/javascript'>googletag.cmd.push(function() { googletag.display('div-gpt-ad-1328644474660-4'); });</script> </div></div></div><div
style='clear:both'></div><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=OvIkyDAkP38:NRrfs8sIIMg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=OvIkyDAkP38:NRrfs8sIIMg:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/SitepointFeed?a=OvIkyDAkP38:NRrfs8sIIMg:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/SitepointFeed?i=OvIkyDAkP38:NRrfs8sIIMg:gIN9vFwOqvQ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/SitepointFeed/~4/OvIkyDAkP38" height="1" width="1"/>]]></content:encoded> <wfw:commentRss>http://www.sitepoint.com/podcast-150-the-vendor-prefix-kerfuffle/feed/</wfw:commentRss> <slash:comments>0</slash:comments> <enclosure url="http://media.libsyn.com/media/sitepoint/sitepointpodcast150.mp3" length="36960140" type="audio/mpeg" /> <feedburner:origLink>http://www.sitepoint.com/podcast-150-the-vendor-prefix-kerfuffle/?utm_source=rss&amp;utm_medium=rss&amp;utm_campaign=podcast-150-the-vendor-prefix-kerfuffle</feedburner:origLink></item> </channel> </rss><!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using memcached
Database Caching 15/17 queries in 0.021 seconds using memcached
Object Caching 2871/2871 objects using memcached
Content Delivery Network via cdn.sitepoint.com

Served from: www.sitepoint.com @ 2012-02-26 20:01:00 -->

