<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	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/"
	>

<channel>
	<title>The Incurable Geek &#187; Development</title>
	<atom:link href="http://nicolasrosental.com/category/development/feed/" rel="self" type="application/rss+xml" />
	<link>http://nicolasrosental.com</link>
	<description>Web Development, Coworking and 42</description>
	<lastBuildDate>Fri, 03 Sep 2010 18:46:42 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>5 Reasons To Love CodeIgniter</title>
		<link>http://nicolasrosental.com/2010/09/03/5-reasons-to-love-codeigniter/</link>
		<comments>http://nicolasrosental.com/2010/09/03/5-reasons-to-love-codeigniter/#comments</comments>
		<pubDate>Fri, 03 Sep 2010 13:36:35 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[CodeIgniter]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[atlantaphp]]></category>
		<category><![CDATA[codeingiter]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://nicolasrosental.com/?p=376</guid>
		<description><![CDATA[This is the presentation I gave at the AtlantaPHP September meet-up. It&#8217;s a showcase of five useful features included in CodeIgniter. You can download the slides or pdf. The slides have embedded videos in slides 11, 17, and 22 so if you get the PDF you&#8217;ll have blank pages instead. You can still watch the demos [...]]]></description>
			<content:encoded><![CDATA[<p>This is the presentation I gave at the AtlantaPHP September meet-up. It&#8217;s a showcase of five useful features included in CodeIgniter. You can download the <a href="http://nicolasrosental.com/wp-content/uploads/2010/09/atlantaphp.pptx">slides</a> or <a href="http://nicolasrosental.com/wp-content/uploads/2010/09/atlantaphp.pdf">pdf</a>. The slides have embedded videos in slides 11, 17, and 22 so if you get the PDF you&#8217;ll have blank pages instead. You can still watch the demos below.</p>
<p>Big thanks to <a title="Danny Mustafic" href="http://twitter.com/dmustafic">Danny Mustafic</a> for recording the presentation (which should be available here in a few days) and to <a href="http://twitter.com/cspruck">Chris Spruck</a> and Kevin Roberts for putting the event together.</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="480" height="350" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="src" value="http://blip.tv/play/AYH6klwC" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="480" height="350" src="http://blip.tv/play/AYH6klwC" allowfullscreen="true"></embed></object></p>
<p><span id="more-376"></span></p>
<p>Form validation demo</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/3IQVQSlq_-w?hl=en&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/3IQVQSlq_-w?hl=en&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<p>Pagination demo</p>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/xaileCcJE9w?hl=en&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/xaileCcJE9w?hl=en&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div id="__ss_5122075" style="width: 425px;">Image manipulation demo</div>
<p><object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="344" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowscriptaccess" value="always" /><param name="src" value="http://www.youtube.com/v/AJa0U8iPCpk?hl=en&amp;fs=1" /><param name="allowfullscreen" value="true" /><embed type="application/x-shockwave-flash" width="425" height="344" src="http://www.youtube.com/v/AJa0U8iPCpk?hl=en&amp;fs=1" allowscriptaccess="always" allowfullscreen="true"></embed></object></p>
<div style="width: 425px;"><strong><a title="5 Reasons To Love CodeIgniter" href="http://www.slideshare.net/nicdev/5-reasons-to-love-codeigniter-5122075">5 Reasons To Love CodeIgniter</a> </strong><object id="__sse5122075" classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"><param name="allowFullScreen" value="true" /><param name="allowScriptAccess" value="always" /><param name="src" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=atlantaphp-100903080352-phpapp02&amp;stripped_title=5-reasons-to-love-codeigniter-5122075" /><param name="name" value="__sse5122075" /><param name="allowfullscreen" value="true" /><embed id="__sse5122075" type="application/x-shockwave-flash" width="425" height="355" src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=atlantaphp-100903080352-phpapp02&amp;stripped_title=5-reasons-to-love-codeigniter-5122075" name="__sse5122075" allowscriptaccess="always" allowfullscreen="true"></embed></object></div>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d376').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d376" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fnicolasrosental.com%2F2010%2F09%2F03%2F5-reasons-to-love-codeigniter%2F&amp;submitHeadline=5+Reasons+To+Love+CodeIgniter&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F09%2F03%2F5-reasons-to-love-codeigniter%2F&amp;title=5+Reasons+To+Love+CodeIgniter" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F09%2F03%2F5-reasons-to-love-codeigniter%2F&amp;title=5+Reasons+To+Love+CodeIgniter" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fnicolasrosental.com%2F2010%2F09%2F03%2F5-reasons-to-love-codeigniter%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fnicolasrosental.com%2F2010%2F09%2F03%2F5-reasons-to-love-codeigniter%2F&amp;title=5+Reasons+To+Love+CodeIgniter" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F09%2F03%2F5-reasons-to-love-codeigniter%2F&amp;bm_description=5+Reasons+To+Love+CodeIgniter" rel="nofollow" title="Add to&nbsp;Mister Wong"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Add to&nbsp;Mister Wong" alt="Add to&nbsp;Mister Wong" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http%3A%2F%2Fnicolasrosental.com%2F2010%2F09%2F03%2F5-reasons-to-love-codeigniter%2F&amp;T=5+Reasons+To+Love+CodeIgniter" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F09%2F03%2F5-reasons-to-love-codeigniter%2F&amp;title=5+Reasons+To+Love+CodeIgniter" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F09%2F03%2F5-reasons-to-love-codeigniter%2F&amp;title=5+Reasons+To+Love+CodeIgniter" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fnicolasrosental.com%2F2010%2F09%2F03%2F5-reasons-to-love-codeigniter%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F09%2F03%2F5-reasons-to-love-codeigniter%2F" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+5+Reasons+To+Love+CodeIgniter+@+http%3A%2F%2Fnicolasrosental.com%2F2010%2F09%2F03%2F5-reasons-to-love-codeigniter%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fnicolasrosental.com%2F2010%2F09%2F03%2F5-reasons-to-love-codeigniter%2F&amp;t=5+Reasons+To+Love+CodeIgniter" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d376').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d376').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://nicolasrosental.com/2010/09/03/5-reasons-to-love-codeigniter/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>PHP Closes Its Source</title>
		<link>http://nicolasrosental.com/2010/04/01/php-closes-its-source/</link>
		<comments>http://nicolasrosental.com/2010/04/01/php-closes-its-source/#comments</comments>
		<pubDate>Thu, 01 Apr 2010 04:01:20 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[News]]></category>
		<category><![CDATA[omg]]></category>
		<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://nicolasrosental.com/?p=284</guid>
		<description><![CDATA[In a very unexpected turn of events, the PHP Wordlwide Consortium has decided to turn PHP into a closed source proprietary project and has sold the rights to the code base to Danish software company Løøf Lirpa. The company has said it&#8217;ll start collecting royalties from functioning PHP installations within sixty days. Dum Vittighed, VP [...]]]></description>
			<content:encoded><![CDATA[<p>In a very unexpected turn of events, the PHP Wordlwide Consortium has decided to turn PHP into a closed source proprietary project and has sold the rights to the code base to Danish software company L<strong>ø</strong><strong>ø</strong>f Lirpa. The company has said it&#8217;ll start collecting royalties from functioning PHP installations within sixty days. Dum Vittighed, VP of Sales at L<strong>ø</strong><strong>ø</strong>f Lirpa said &#8220;We care about the community, but you can&#8217;t expect us to wok for free. We&#8217;ll set the license price at about one Danish Kroner per one hundred CPU cycles.&#8221;<a title="Professional Translation Services" onclick="openlingoz(this);return false;" href="http://translation.babylon.com/lib/modalbox/_ajax_content.php"></a></p>
<p>Lasmus Rerdorf was quoted saying &#8220;What do you expect? With the upcoming release of Facebook&#8217;s R&amp;B PHP there&#8217;s no way we can compete; PHP cannot continue to exist in its current form.&#8221;</p>
<p>Unsurprisingly, the community received the news with anger. In an unprecedented show of solidarity and unity, Ruby and Python developers joined forces with PHP enthusiats and flooded the streets of major cities worldwide under the slogan &#8220;We are all PHP.&#8221; Still, not everyone is in agreement. One very well known community leader that asked to remain anonymous said &#8220;It&#8217;s time to turn this over to a handful of engineers that can do the right  thing, the community has ran its course.&#8221;</p>
<p>It seems that the only way of avoiding the fees is renaming any publicly accessible .php files as .rff (royalty free file), yet it hasn&#8217;t been fully tested against L<strong>ø</strong><strong>ø</strong>f Lirpa&#8217;s fee-collection script. Alternatively developers can opt to downgrade to PHP 3 or earlier as it will remain open source for the foreseeable future.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d284').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d284" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fnicolasrosental.com%2F2010%2F04%2F01%2Fphp-closes-its-source%2F&amp;submitHeadline=PHP+Closes+Its+Source&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F04%2F01%2Fphp-closes-its-source%2F&amp;title=PHP+Closes+Its+Source" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F04%2F01%2Fphp-closes-its-source%2F&amp;title=PHP+Closes+Its+Source" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fnicolasrosental.com%2F2010%2F04%2F01%2Fphp-closes-its-source%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fnicolasrosental.com%2F2010%2F04%2F01%2Fphp-closes-its-source%2F&amp;title=PHP+Closes+Its+Source" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F04%2F01%2Fphp-closes-its-source%2F&amp;bm_description=PHP+Closes+Its+Source" rel="nofollow" title="Add to&nbsp;Mister Wong"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Add to&nbsp;Mister Wong" alt="Add to&nbsp;Mister Wong" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http%3A%2F%2Fnicolasrosental.com%2F2010%2F04%2F01%2Fphp-closes-its-source%2F&amp;T=PHP+Closes+Its+Source" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F04%2F01%2Fphp-closes-its-source%2F&amp;title=PHP+Closes+Its+Source" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F04%2F01%2Fphp-closes-its-source%2F&amp;title=PHP+Closes+Its+Source" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fnicolasrosental.com%2F2010%2F04%2F01%2Fphp-closes-its-source%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F04%2F01%2Fphp-closes-its-source%2F" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+PHP+Closes+Its+Source+@+http%3A%2F%2Fnicolasrosental.com%2F2010%2F04%2F01%2Fphp-closes-its-source%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fnicolasrosental.com%2F2010%2F04%2F01%2Fphp-closes-its-source%2F&amp;t=PHP+Closes+Its+Source" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d284').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d284').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://nicolasrosental.com/2010/04/01/php-closes-its-source/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>PHP Logging Is Your Friend</title>
		<link>http://nicolasrosental.com/2010/03/22/php-logging-is-your-friend/</link>
		<comments>http://nicolasrosental.com/2010/03/22/php-logging-is-your-friend/#comments</comments>
		<pubDate>Mon, 22 Mar 2010 14:34:02 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[logging]]></category>
		<category><![CDATA[logs]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://nicolasrosental.com/?p=272</guid>
		<description><![CDATA[There are many ways of debugging PHP and it&#8217;s mainly a matter of preference; however I&#8217;m amazed at how little attention is given to error logging in favor of error displaying. Not only is the latter method more inefficient, it also leads to sloppy sites that reveal a great deal about their coding and organization [...]]]></description>
			<content:encoded><![CDATA[<p>There are many ways of debugging PHP and it&#8217;s mainly a matter of preference; however I&#8217;m amazed at how little attention is given to error logging in favor of error displaying. Not only is the latter method more inefficient, it also leads to sloppy sites that reveal a great deal about their coding and organization to the Internet.</p>
<p>We&#8217;ll do a quick walk-through to get started with error logging.</p>
<p><span id="more-272"></span></p>
<h2>Prepare php.ini</h2>
<p>There are a few options that need to be set in php.ini to make proper logging possible. If you don&#8217;t have access to php.ini you can attempt to set the options at runtime (your mileage may vary.) An alternative to using php.ini is setting directives in an .htaccess file, but I won&#8217;t be discussing it in this post.</p>
<pre>error_reporting  =  E_ALL
display_errors = Off
log_errors = On
error_log = /file/writeable/by/web/server/
</pre>
<p>Let&#8217;s look at this options a bit closer to understand what they do. <strong>error_reporting </strong>can take a number or different settings that grant an entire discussion all their own. I like using <strong>E_ALL </strong>which can be a little chatty at times, but can help to write better code. With PHP 5 <strong>E_STRICT </strong>has also been included, and has to be declared explicitly (not included in E_ALL.) This setting doesn&#8217;t provide additional logging, but gives recommendations to write even cleaner code.</p>
<p><strong>display_errors</strong> is usually turned on during development, and turned off when going into production. If you are using logging, you&#8217;ll soon realize that it&#8217;s not necessary to turn this on at all.</p>
<p><strong>log_errors</strong> is almost self explanatory, but could cause a newcomer to wonder why log files aren&#8217;t being written. This is the first place you should look if you aren&#8217;t getting logging information.</p>
<p><strong>error_log </strong>has to be set to the path of a file writable by the web server; this is the second place you should look if your logs aren&#8217;t working. File ownership and permissions aren&#8217;t as daunting as they seem and you&#8217;ll be doing yourself a huge favor by learning how to apply them properly. If log_errors isn&#8217;t turned on, then this setting will have no  effect whatsoever.</p>
<h2>Set Up Your Box</h2>
<p>This is where the rubber meets the road. Once you have all your settings in place and you&#8217;ve verified that errors are written to the log, it&#8217;s time to start using it. Open a terminal (command line as some folks call it) and give it the following command:</p>
<pre>tail -f /log/file
</pre>
<p>The <strong>tail</strong> command retrieves the last 10 lines of a given file, the <strong>-f</strong> switch tells it to do it in real time. That is to say, that the display will be updated each time there&#8217;s a new entry in the log as opposed to having to run the command each time you want to see what&#8217;s going on. Leave this terminal running at all times and make it the first thing you glance at when something isn&#8217;t working right.</p>
<h2>Talk To The Log, It Listens</h2>
<p>So far you are able to view errors generated by PHP which is incedibly useful, but how about sending your own messages to the log? Enter <strong>error_log</strong>. This function allows you (in its simplest form) to send a custom message to the log. Let&#8217;s see an example, enter the following bit of code in a file and access it with your browser.</p>
<pre>&lt;?php
if ( 1 &gt; 0 )
{
    error_log('it would be weird to NOT get this message');
}
?&gt;
</pre>
<p>Now the log in the terminal (that&#8217;s ALWAYS open) will display something like</p>
<pre>[22-Mar-2010 06:54:05] it would be weird to NOT get this message
</pre>
<p>This function also provides several other options such as being able to send the message via e-mail, or to a TCP port. So you can imagine the possibilities for customizing responses to different situations are endless. Here&#8217;s a list of useful resources that will help you in your logging quests.</p>
<ul>
<li><a title="error_log PHP Manual" href="http://php.net/manual/en/function.error-log.php">error_log &#8211; Manual</a></li>
<li><a href="http://php.net/manual/en/errorfunc.configuration.php">Errors and Logging Configuration Options &#8211; Manual</a></li>
<li><a title="Error handling and logging - Added Bytes" href="http://www.addedbytes.com/drafts/php-ini-guide/php-ini-guide-error-handling-and-logging/">php.ini Guide: Error Handling and Logging &#8211; Added Bytes</a></li>
<li><a href="http://unixhelp.ed.ac.uk/CGI/man-cgi?tail">tail () &#8211; Unix man pages</a> (if you have *nix system available just type &#8216;man tail&#8217; <img src='http://nicolasrosental.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  )</li>
</ul>
<p>This post only covers the very basics of logging PHP, but it&#8217;s intended as a starting point. I&#8217;m very interested in learning how you use logging or what debugging techniques you&#8217;ve developed. Don&#8217;t be shy and leave a comment.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d272').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d272" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F22%2Fphp-logging-is-your-friend%2F&amp;submitHeadline=PHP+Logging+Is+Your+Friend&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F22%2Fphp-logging-is-your-friend%2F&amp;title=PHP+Logging+Is+Your+Friend" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F22%2Fphp-logging-is-your-friend%2F&amp;title=PHP+Logging+Is+Your+Friend" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F22%2Fphp-logging-is-your-friend%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F22%2Fphp-logging-is-your-friend%2F&amp;title=PHP+Logging+Is+Your+Friend" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F22%2Fphp-logging-is-your-friend%2F&amp;bm_description=PHP+Logging+Is+Your+Friend" rel="nofollow" title="Add to&nbsp;Mister Wong"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Add to&nbsp;Mister Wong" alt="Add to&nbsp;Mister Wong" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F22%2Fphp-logging-is-your-friend%2F&amp;T=PHP+Logging+Is+Your+Friend" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F22%2Fphp-logging-is-your-friend%2F&amp;title=PHP+Logging+Is+Your+Friend" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F22%2Fphp-logging-is-your-friend%2F&amp;title=PHP+Logging+Is+Your+Friend" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F22%2Fphp-logging-is-your-friend%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F22%2Fphp-logging-is-your-friend%2F" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+PHP+Logging+Is+Your+Friend+@+http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F22%2Fphp-logging-is-your-friend%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F22%2Fphp-logging-is-your-friend%2F&amp;t=PHP+Logging+Is+Your+Friend" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d272').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d272').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://nicolasrosental.com/2010/03/22/php-logging-is-your-friend/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Of Salts and Hashes</title>
		<link>http://nicolasrosental.com/2010/03/05/of-salts-and-hashes/</link>
		<comments>http://nicolasrosental.com/2010/03/05/of-salts-and-hashes/#comments</comments>
		<pubDate>Fri, 05 Mar 2010 20:36:42 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[security]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://nicolasrosental.com/?p=257</guid>
		<description><![CDATA[Managing passwords for a web site or web application has always been an area where developers have taken liberties with varying degrees of success. Sometimes what might seem like a convenience to the user can create a series of unnecessary security risks. Let&#8217;s take the example of a web site that has a &#8216;forgot your [...]]]></description>
			<content:encoded><![CDATA[<p>Managing passwords for a web site or web application has always been an area where developers have taken liberties with varying degrees of success. Sometimes what might seem like a convenience to the user can create a series of unnecessary security risks. Let&#8217;s take the example of a web site that has a &#8216;forgot your password&#8217; feature that sends an e-mail with the forgotten password. The obvious risk is that the password is now being communicated through an insecure medium (e-mail) and could potentially be read by someone other than he intended user. However, there&#8217;s a bigger and much more urgent issue, the site owner and/or administrator should not have access to said password under any circumstance; if there was an issue where the credentials had been misused, anyone with access to them would immediately be suspect.</p>
<p><span id="more-257"></span></p>
<p>So what&#8217;s the solution? We will use a &#8216;hash&#8217; to store password validation. Without getting scientific a hash is the result of a transformation applied to the password string. This transformation is very likely one of the better known cryptographic methods such as <a title="Wikipedia - MD5" href="http://en.wikipedia.org/wiki/Md5">MD5</a> or <a title="Wikipedia - SHA1" href="http://en.wikipedia.org/wiki/Sha1">SHA1</a>.</p>
<p>Let&#8217;s see it in practical terms. The user provides a password of  &#8221;abc123&#8243; , once hashed with SHA1 it looks like 6367c48dd193d56ea7b0baad25b19455e529f5ee. A hexadecimal number 40 characters in length. The process of hashing is one way only, so it&#8217;s not possible (for regular folks) to guess the password by looking at the hash. Next time the user logs in, the system will hash the password entered and compare it to the stored hash to validate the credentials.</p>
<p>So far so good, except that &#8220;abc123&#8243; is a fairly easily guessable password, and it would probably be included in a dictionary based attack using <a title="Wikipedia - Rainbow Tables" href="http://en.wikipedia.org/wiki/Rainbow_tables">rainbow tables</a>. A rainbow table is a lookup table containing hashes based on a dictionary of possible passwords; &#8220;password&#8221;, &#8220;Password&#8221;, &#8220;root&#8221;, etc. would be the kind of passwords that you might find in said tables, and of course &#8220;abc123&#8243; would make the list as well. So, in this case even though it&#8217;s harder to do, it&#8217;s still possible to reveal the actual password from the hash. As usual, using had-to-guess passwords mitigates this risk.</p>
<p>The solution to this issue is to use a &#8216;salt&#8217; which is a random value attached to the password. By appending the salt, the rainbow table becomes useless, as the number of possible combinations makes it nearly impossible to guess using this method.</p>
<div>
<div class="wp-caption alignnone" style="width: 510px"><a href="http://www.flickr.com/photos/phyrephox/"><img title="Salt" src="http://farm4.static.flickr.com/3031/2657845769_45f9ddd8fc.jpg" alt="" width="500" height="375" /></a><p class="wp-caption-text">Photo by PhyrePh0X</p></div>
</div>
<p>Let&#8217;s tie all the pieces. The user signs up and picks a password, we take the password salt it with a random value, hash it, then store the hash and the salt. In PHP it might look somewhat like this:</p>
<pre>$password = 'password';</pre>
<pre>$salt = sha1(rand()); //According to PHP.net some systems such as Windows will use a max number of 32768 unless explicitly specified</pre>
<pre>$hash = sha1($salt.$password); //Hash the concatenated string of the password and the hashed random salt</pre>
<pre>//Store values</pre>
<p><a title="Example of salt and hash" href="http://nicolasrosental.com/saltnhash.php">See the output of this example</a></p>
<p>Going back to the original example, you wouldn&#8217;t be a able to e-mail the exact password back to the forgetful user at this point, instead, send him a link to a password reset page where they can enter a new one, and you can store it in the form of a new hash.</p>
<p>As usual this is only a little something to get you started and not an in-depth production ready sample. Use common sense when dealing with security and user experience issues. It&#8217;s possible that you work in an industry that has certain requirements regarding storing passwords and such, make sure you always check what&#8217;s appropriate for the particular project you are working on.</p>
<p>Do you use any of these methods in your projects? What else do you do to ensure security and a good user experience?</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d257').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d257" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F05%2Fof-salts-and-hashes%2F&amp;submitHeadline=Of+Salts+and+Hashes&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F05%2Fof-salts-and-hashes%2F&amp;title=Of+Salts+and+Hashes" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F05%2Fof-salts-and-hashes%2F&amp;title=Of+Salts+and+Hashes" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F05%2Fof-salts-and-hashes%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F05%2Fof-salts-and-hashes%2F&amp;title=Of+Salts+and+Hashes" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F05%2Fof-salts-and-hashes%2F&amp;bm_description=Of+Salts+and+Hashes" rel="nofollow" title="Add to&nbsp;Mister Wong"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Add to&nbsp;Mister Wong" alt="Add to&nbsp;Mister Wong" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F05%2Fof-salts-and-hashes%2F&amp;T=Of+Salts+and+Hashes" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F05%2Fof-salts-and-hashes%2F&amp;title=Of+Salts+and+Hashes" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F05%2Fof-salts-and-hashes%2F&amp;title=Of+Salts+and+Hashes" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F05%2Fof-salts-and-hashes%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F05%2Fof-salts-and-hashes%2F" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Of+Salts+and+Hashes+@+http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F05%2Fof-salts-and-hashes%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fnicolasrosental.com%2F2010%2F03%2F05%2Fof-salts-and-hashes%2F&amp;t=Of+Salts+and+Hashes" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d257').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d257').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://nicolasrosental.com/2010/03/05/of-salts-and-hashes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Why Some PHP Folks Hate WordPress</title>
		<link>http://nicolasrosental.com/2010/02/24/why-some-php-folks-hate-wordpress/</link>
		<comments>http://nicolasrosental.com/2010/02/24/why-some-php-folks-hate-wordpress/#comments</comments>
		<pubDate>Wed, 24 Feb 2010 04:41:55 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[wp]]></category>

		<guid isPermaLink="false">http://nicolasrosental.com/?p=236</guid>
		<description><![CDATA[I love WordPress. I said it, that wasn&#8217;t too hard, was it? Well, it wasn&#8217;t hard because I&#8217;m sitting all by myself, but the times I uttered those words in the company of PHP developers I ended up with a long drawn out discussion full of sentiment and little substance. I heard many arguments why [...]]]></description>
			<content:encoded><![CDATA[<p>I love WordPress. I said it, that wasn&#8217;t too hard, was it? Well, it wasn&#8217;t hard because I&#8217;m sitting all by myself, but the times I uttered those words in the company of PHP developers I ended up with a long drawn out discussion full of sentiment and little substance.</p>
<p>I heard many arguments why some PHP folks don&#8217;t like WordPress and I&#8217;ve heard counter-arguments to those reasons; but I never quite got the essence of why WordPress doesn&#8217;t get the respect it deserves from a large part of the PHP community.</p>
<p><span id="more-236"></span></p>
<p>Let&#8217;s go down the checklist to clarify things a bit</p>
<blockquote><p>Hater: WordPress security sucks!</p>
<p>Lover: The community does an awesome job at plugging holes quickly.</p>
<p>Hater: It&#8217;s PHP 4!</p>
<p>Lover: Yes, I concede on that one, but the more WP users and developers continue pushing for a full PHP 5 core the sooner we&#8217;ll get it (<a href="http://codex.wordpress.org/Switching_to_PHP5">maybe. some day.</a>)</p>
<p>Hater: It&#8217;s just for blogs!</p>
<p>Lover: That&#8217;s just dumb. How long has it been since you visited the intarwebs?</p>
<p>Hater: It&#8217;s a little toy for people that don&#8217;t know how to code.</p>
<p>Lover: It can be, but it can also help you create very powerful stuff. The tools are there for you to use, and they won&#8217;t get in the way if you don&#8217;t.</p></blockquote>
<p>So you get the picture. There are valid arguments, but the truth is some PHP developers hate WordPress because it isn&#8217;t coded like the applications they are used to working on. As easy as it is to get started coding for WordPress, for someone that is used to building sites from scratch, or even using a framework, being subjected to <a href="http://codex.wordpress.org/Plugin_API">&#8216;actions&#8217;, &#8216;filters&#8217;</a>, &#8216;<a href="http://codex.wordpress.org/The_Loop">The Loop</a>&#8216; and other WordPress idiosyncrasies causes some discomfort.</p>
<p>If you are the PHP developer I describe here, don&#8217;t get offended. Give WordPress a try. Don&#8217;t just install it, but actually get your hands dirty with a theme or plugin. It&#8217;s weird at first, but once you get past the initial annoyance you&#8217;ll find an extremely powerful platform that just might be the wrench you&#8217;re missing in your toolbox.</p>
<p>A great place to answer your questions is the <a href="http://codex.wordpress.org/Main_Page">Codex</a>, but there are a million and one resources out there. If you are in the mood for reading a book I recommend the <a href="http://technosailor.com/the-wordpress-bible/">WordPress Bible</a> by Aaron Brazell, truly an awesome resource (which you might just end up buying.)</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d236').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d236" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fnicolasrosental.com%2F2010%2F02%2F24%2Fwhy-some-php-folks-hate-wordpress%2F&amp;submitHeadline=Why+Some+PHP+Folks+Hate+WordPress&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F02%2F24%2Fwhy-some-php-folks-hate-wordpress%2F&amp;title=Why+Some+PHP+Folks+Hate+WordPress" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F02%2F24%2Fwhy-some-php-folks-hate-wordpress%2F&amp;title=Why+Some+PHP+Folks+Hate+WordPress" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fnicolasrosental.com%2F2010%2F02%2F24%2Fwhy-some-php-folks-hate-wordpress%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fnicolasrosental.com%2F2010%2F02%2F24%2Fwhy-some-php-folks-hate-wordpress%2F&amp;title=Why+Some+PHP+Folks+Hate+WordPress" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F02%2F24%2Fwhy-some-php-folks-hate-wordpress%2F&amp;bm_description=Why+Some+PHP+Folks+Hate+WordPress" rel="nofollow" title="Add to&nbsp;Mister Wong"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Add to&nbsp;Mister Wong" alt="Add to&nbsp;Mister Wong" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http%3A%2F%2Fnicolasrosental.com%2F2010%2F02%2F24%2Fwhy-some-php-folks-hate-wordpress%2F&amp;T=Why+Some+PHP+Folks+Hate+WordPress" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F02%2F24%2Fwhy-some-php-folks-hate-wordpress%2F&amp;title=Why+Some+PHP+Folks+Hate+WordPress" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F02%2F24%2Fwhy-some-php-folks-hate-wordpress%2F&amp;title=Why+Some+PHP+Folks+Hate+WordPress" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fnicolasrosental.com%2F2010%2F02%2F24%2Fwhy-some-php-folks-hate-wordpress%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F02%2F24%2Fwhy-some-php-folks-hate-wordpress%2F" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Why+Some+PHP+Folks+Hate+WordPress+@+http%3A%2F%2Fnicolasrosental.com%2F2010%2F02%2F24%2Fwhy-some-php-folks-hate-wordpress%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fnicolasrosental.com%2F2010%2F02%2F24%2Fwhy-some-php-folks-hate-wordpress%2F&amp;t=Why+Some+PHP+Folks+Hate+WordPress" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d236').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d236').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://nicolasrosental.com/2010/02/24/why-some-php-folks-hate-wordpress/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>One API to Rule Them All &#8211; Ping.fm</title>
		<link>http://nicolasrosental.com/2010/01/15/one-api-to-rule-them-all-ping-fm/</link>
		<comments>http://nicolasrosental.com/2010/01/15/one-api-to-rule-them-all-ping-fm/#comments</comments>
		<pubDate>Fri, 15 Jan 2010 05:34:51 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[APIs]]></category>
		<category><![CDATA[Development]]></category>

		<guid isPermaLink="false">http://nicolasrosental.com/?p=199</guid>
		<description><![CDATA[If you&#8217;ve read this blog you get the idea that I really like RESTful API&#8217;s. But as much as I&#8217;d like to learn each one of them out there, there are times when you have to take shortcuts. Enter Ping.fm. This service allows you to make one post and have it update all your accounts [...]]]></description>
			<content:encoded><![CDATA[<p>If you&#8217;ve read this blog you get the idea that I really like RESTful API&#8217;s. But as much as I&#8217;d like to learn each one of them out there, there are times when you have to take shortcuts. Enter <a title="Ping.fm" href="http://ping.fm/">Ping.fm</a>. This service allows you to make one post and have it update all your accounts at once. You can both do this from their page, or implement it in a variety of ways. We&#8217;ll see how to use cURL (as usual) and the Ping.fm API.</p>
<p>First of all you&#8217;ll want to set up your Ping.fm service right to update the feeds of your choice, as well as create the necessary permissions to post to each service. Log in to your account and select Add More Networks; now make your selection.</p>
<p style="text-align: center;"><a href="http://nicolasrosental.com/wp-contents/uploads/2010/01/Screen-shot-2010-01-15-at-12.06.54-AM.png"><img class="size-medium wp-image-200 aligncenter" title="Screen shot 2010-01-15 at 12.06.54 AM" src="http://nicolasrosental.com/wp-contents/uploads/2010/01/Screen-shot-2010-01-15-at-12.06.54-AM-300x151.png" alt="" width="300" height="151" /></a></p>
<p style="text-align: center;">Now that your account is set up you need to gather your api key and a user key. I found this point to be the most confusing of the entire set up. Apparently the user app key is no longer necessary, but I couldn&#8217;t find an explanation of what the new method is.</p>
<p>If you take a look in the footer there&#8217;s a <a href="http://ping.fm/developers/">&#8216;developers&#8217;</a> section that has all the information necessary to get the keys and such.</p>
<p>Now you can go ahead and send your updates from your web app.</p>
<pre>&lt;?php

 $api_key = ''; //Don't forget your keys
 $user_app_key = '';
 //$api_call = 'http://api.ping.fm/v1/system.services'; //Good test
 $api_call = 'http://api.ping.fm/v1/user.post';

 //I assume you are pulling this content from a database, a feed, or some other automated method. But it's not important for this example.
 $title = "Something really witty";
 $content = "Your awesome post";

 //Set up the connection and pass the options required by the API.
 $curl_conn = curl_init();
 curl_setopt($curl_conn, CURLOPT_URL, $api_call); //URL to connect to
 curl_setopt($curl_conn, CURLOPT_POST, 1); //Use POST
 curl_setopt($curl_conn, CURLOPT_HEADER,1); //Get the header. This is key to getting the response code!
 curl_setopt($curl_conn, CURLOPT_RETURNTRANSFER, 1); //Return the result as string.

 //Check out all the options in the Ping.fm documentation
 $options = array('api_key' =&gt; $api_key, 'user_app_key' =&gt; $user_app_key, 'post_method' =&gt; 'blog', 'title' =&gt; $title, 'body' =&gt; $content);
 curl_setopt($curl_conn, CURLOPT_POSTFIELDS, $options);
 $output = curl_exec($curl_conn);

 echo $output; //See what you get

 ?&gt;
</pre>
<p>Here&#8217;s an example of posting to a Facebook page.</p>
<p style="text-align: center;"><a href="http://nicolasrosental.com/wp-contents/uploads/2010/01/Screen-shot-2010-01-15-at-12.45.10-AM.png"><img class="size-medium wp-image-209 aligncenter" title="Screen shot 2010-01-15 at 12.45.10 AM" src="http://nicolasrosental.com/wp-contents/uploads/2010/01/Screen-shot-2010-01-15-at-12.45.10-AM-300x53.png" alt="" width="300" height="53" /></a></p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d199').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d199" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fnicolasrosental.com%2F2010%2F01%2F15%2Fone-api-to-rule-them-all-ping-fm%2F&amp;submitHeadline=One+API+to+Rule+Them+All+%26%238211%3B+Ping.fm&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F01%2F15%2Fone-api-to-rule-them-all-ping-fm%2F&amp;title=One+API+to+Rule+Them+All+%26%238211%3B+Ping.fm" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F01%2F15%2Fone-api-to-rule-them-all-ping-fm%2F&amp;title=One+API+to+Rule+Them+All+%26%238211%3B+Ping.fm" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fnicolasrosental.com%2F2010%2F01%2F15%2Fone-api-to-rule-them-all-ping-fm%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fnicolasrosental.com%2F2010%2F01%2F15%2Fone-api-to-rule-them-all-ping-fm%2F&amp;title=One+API+to+Rule+Them+All+%26%238211%3B+Ping.fm" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F01%2F15%2Fone-api-to-rule-them-all-ping-fm%2F&amp;bm_description=One+API+to+Rule+Them+All+%26%238211%3B+Ping.fm" rel="nofollow" title="Add to&nbsp;Mister Wong"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Add to&nbsp;Mister Wong" alt="Add to&nbsp;Mister Wong" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http%3A%2F%2Fnicolasrosental.com%2F2010%2F01%2F15%2Fone-api-to-rule-them-all-ping-fm%2F&amp;T=One+API+to+Rule+Them+All+%26%238211%3B+Ping.fm" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F01%2F15%2Fone-api-to-rule-them-all-ping-fm%2F&amp;title=One+API+to+Rule+Them+All+%26%238211%3B+Ping.fm" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F01%2F15%2Fone-api-to-rule-them-all-ping-fm%2F&amp;title=One+API+to+Rule+Them+All+%26%238211%3B+Ping.fm" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fnicolasrosental.com%2F2010%2F01%2F15%2Fone-api-to-rule-them-all-ping-fm%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http%3A%2F%2Fnicolasrosental.com%2F2010%2F01%2F15%2Fone-api-to-rule-them-all-ping-fm%2F" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+One+API+to+Rule+Them+All+%26%238211%3B+Ping.fm+@+http%3A%2F%2Fnicolasrosental.com%2F2010%2F01%2F15%2Fone-api-to-rule-them-all-ping-fm%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fnicolasrosental.com%2F2010%2F01%2F15%2Fone-api-to-rule-them-all-ping-fm%2F&amp;t=One+API+to+Rule+Them+All+%26%238211%3B+Ping.fm" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d199').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d199').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://nicolasrosental.com/2010/01/15/one-api-to-rule-them-all-ping-fm/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Twitter Response Codes Simplified</title>
		<link>http://nicolasrosental.com/2009/11/10/twitter-response-codes-simplified/</link>
		<comments>http://nicolasrosental.com/2009/11/10/twitter-response-codes-simplified/#comments</comments>
		<pubDate>Tue, 10 Nov 2009 20:16:48 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[APIs]]></category>
		<category><![CDATA[Development]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[api]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[responsecodes]]></category>
		<category><![CDATA[rest]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://nicolasrosental.com/?p=146</guid>
		<description><![CDATA[I recently attended an AtlantaPHP meet-up where Ben Ramsey talked about &#8220;The Hidden Gems in HTTP&#8221;. That gave me the idea to explain the response codes you might see when using the Twitter API, and give some practical examples too. We will be using PHP and cURL to access the API. If you aren&#8217;t too [...]]]></description>
			<content:encoded><![CDATA[<p>I recently attended an <a title="AtlantaPHP - PHP User Group" href="http://atlantaphp.org/">AtlantaPHP</a> meet-up where <a href="http://twitter.com/ramsey">Ben Ramsey</a> talked about &#8220;The Hidden Gems in HTTP&#8221;. That gave me the idea to explain the response <a href="http://apiwiki.twitter.com/HTTP-Response-Codes-and-Errors?SearchFor=http+code&amp;sp=1">codes</a> you might see when using the Twitter API, and give some practical examples too.</p>
<p>We will be using PHP and cURL to access the API. If you aren&#8217;t too familiar, please read <a href="http://nicolasrosental.com/?p=42">this post.</a></p>
<p>Each heading is exactly what you will find in the<a title="Response Codes and Errors" href="http://apiwiki.twitter.com/HTTP-Response-Codes-and-Errors"> Twitter API documentation</a>, along with my own explanation and some examples.</p>
<h3><strong>200 OK</strong>: Success!</h3>
<p>Let&#8217;s say I want to get a list of my followers, I can use the code example below, and if I get a <strong>200 OK </strong>return code I know that my request has been successful.</p>
<pre>//Create the connection handle</pre>
<pre>$curl_conn = curl_init();</pre>
<pre>//Set up the URL to query Twitter
$user_followers = "https://twitter.com/statuses/followers/nicdev.xml";</pre>
<pre>//Set cURL options</pre>
<pre>curl_setopt($curl_conn, CURLOPT_URL, $user_followers); //URL to connect to
curl_setopt($curl_conn, CURLOPT_GET, 1); //Use GET method
curl_setopt($curl_conn, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); //Use basic authentication
curl_setopt($curl_conn, CURLOPT_USERPWD, 'username:password'); //Set u/p
curl_setopt($curl_conn,CURLOPT_HEADER,1); //Get the header. This is key to getting the response code!&lt;strong&gt;&lt;/strong&gt;</pre>
<pre>curl_setopt($curl_conn, CURLOPT_RETURNTRANSFER, 1); //Return the result as string.</pre>
<pre>// Result from querying URL. Will parse as xml
$output = curl_exec($curl_conn);</pre>
<pre>// close cURL resource. It's like shutting down the water when you're brushing your teeth.
curl_close($curl_conn);</pre>
<pre>echo $output;</pre>
<p>If you are following along you will now have a pretty messy screen full of information about your followers. The part of the response we are interested in, it&#8217;s in the first line.</p>
<pre>HTTP/1.1 200 OK Date: Tue, 10 Nov 2009
13:51:56 GMT Server: hi X-RateLimit-Limit:
20000 X-Transaction: 1257861116-80037-4182
Status: 200 OK</pre>
<p>The 200 OK code let&#8217;s us know it&#8217;s all good, and our request has been successfully processed.</p>
<h3><strong>304 Not Modified</strong>: There was no new data to return.</h3>
<p>This one is a bit trickier. In short, a 304 code means that there is no new data to a request. I attempted to send the request repeatedly through a &#8220;for loop&#8221; but I got a <strong>200 OK </strong>every time. I tried to search for bug reports so I could try to reproduce it, but no dice. Maybe they don&#8217;t really provide 304&#8242;s? If you know a way of getting it to reply 304, please comment.</p>
<h3><strong>400 Bad Request</strong>: The request was invalid.  An accompanying error message will explain why. This is the status code will be returned during <span style="color: #000000;">rate limiting.</span></h3>
<p>Well, Twitter imposes all sorts of limits on the amount of API calls you can make, and this is a good thing. The limits imposed are workable, and can be increased if you are a developer and <a href="http://twitter.com/help/request_whitelisting">ask nicely</a>. The default limit is 150/hour on any given account, so it was easy to reproduce.</p>
<p>Change the script as follows, and refresh the page.</p>
<pre>//Replace the line  $output = curl_exec($curl_conn); with the following block of code.</pre>
<pre>for($i = 0; $i &lt; 160; $i++)
{
    $output = curl_exec($curl_conn);
    $output = substr($output, 0, 200);
    echo $output."&lt;br /&gt;";
}</pre>
<p>You will probably get a lot of<strong> 200 </strong>codes followed by <strong>400&#8242;s.</strong></p>
<pre>HTTP/1.1 400 Bad Request Date: Tue, 10 Nov
2009 14:43:40 GMT Server: hi
X-RateLimit-Limit: 150 Status: 400 Bad
Request X-RateLimit-Remaining: 0
X-Runtime: 0.01104 Content-Type:
application/xml;</pre>
<h3><strong>401 Not Authorized</strong>: Authentication credentials were missing or incorrect.</h3>
<p>Does as it says, and there&#8217;s a great way of testing it out, the <strong>verify_credentials </strong>method. Simply pass it a bad username and password and you&#8217;ll have a <strong>401</strong> error to call your own.</p>
<pre>//Change this part in the original script.</pre>
<pre>//Set up the URL to query Twitter</pre>
<pre>$user_followers = "http://twitter.com/account/verify_credentials.xml";</pre>
<pre>//Don't forget to change the credentials to something invalid</pre>
<p>Here&#8217;s the result</p>
<pre>HTTP/1.1 401 Unauthorized Date: Tue, 10 Nov
2009 15:16:24 GMT Server: hi Status: 401
Unauthorized</pre>
<h3><strong>403 Forbidden</strong>: The request is understood, but it has been refused.  An accompanying error message will explain why. This code is used when requests are being denied due to update limits.</h3>
<p>You simply tweet too much! Again, you hit a rate limit that is pretty forgiving for most people. The following piece of code will actually post just one tweet to your account, which will most likely get a <strong>200 OK</strong> code; I&#8217;m posting in in case you were looking for a short script to post updates to Twitter. The second one will actually try to post more messages than it&#8217;s allowed in order to purposely get a <strong>403</strong> code.</p>
<p>Please note that because Twitter checks you aren&#8217;t sending the exact same message repeatedly, I&#8217;m changing the text in every post.</p>
<p>One tweet:</p>
<pre>//Create the connection handle</pre>
<pre>$curl_conn = curl_init();</pre>
<pre>//Set up the URL to query Twitter</pre>
<pre>$api_call = "http://twitter.com/statuses/update.xml";
$options = "status=This is a test status made with PHP"; //The actual message is a required parameter</pre>
<pre>//Set cURL options</pre>
<pre>curl_setopt($curl_conn, CURLOPT_URL, $api_call); //URL to connect to
curl_setopt($curl_conn, CURLOPT_POST, 1); //Use POST
curl_setopt($curl_conn, CURLOPT_POSTFIELDS, $options);
curl_setopt($curl_conn, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); //Use basic authentication
curl_setopt($curl_conn, CURLOPT_USERPWD, 'username:password..'); //Set u/p
curl_setopt($curl_conn, CURLOPT_HEADER,1); //Get the header. This is key to getting the response code!</pre>
<pre>curl_setopt($curl_conn, CURLOPT_RETURNTRANSFER, 1); //Return the result as string.</pre>
<pre>// Result from querying URL. Will parse as xml</pre>
<pre>$output = curl_exec($curl_conn);</pre>
<pre>echo $output;</pre>
<pre>// close cURL resource. It's like shutting down the water when you're brushing your teeth.
curl_close($curl_conn);</pre>
<p>Many, many tweets.</p>
<pre>//Create the connection handle</pre>
<pre>$curl_conn = curl_init();</pre>
<pre>//Set up the URL to query Twitter</pre>
<pre>$api_call = "http://twitter.com/statuses/update.xml";</pre>
<pre>//Set cURL options</pre>
<pre>curl_setopt($curl_conn, CURLOPT_URL, $api_call); //URL to connect to
curl_setopt($curl_conn, CURLOPT_POST, 1); //Use POST
curl_setopt($curl_conn, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); //Use basic authentication
curl_setopt($curl_conn, CURLOPT_USERPWD, 'username:password'); //Set u/p
curl_setopt($curl_conn, CURLOPT_HEADER,1); //Get the header. This is key to getting the response code!</pre>
<pre>curl_setopt($curl_conn, CURLOPT_RETURNTRANSFER, 1); //Return the result as string.</pre>
<pre>for($i=0;$i &lt; 160;$i++)
{
    $options = "status=This is a test status made with PHP to reach a 403".md5($i); //Change the message on each iteration
    curl_setopt($curl_conn, CURLOPT_POSTFIELDS, $options);
    $output = curl_exec($curl_conn);
    $output = substr($output,0,200);
    echo $output;
}</pre>
<pre>// close cURL resource. It's like shutting down the water when you're brushing your teeth.
curl_close($curl_conn);</pre>
<p><img class="size-full wp-image-158 alignnone" title="Twitter SPAM" src="http://nicolasrosental.com/wp-contents/uploads/2009/11/Screen-shot-2009-11-10-at-2.05.13-PM.png" alt="Twitter SPAM" width="191" height="164" /></p>
<pre>HTTP/1.1 403 Forbidden Date: Tue, 10 Nov
 2009 18:54:52 GMT Server: hi
X-Transaction: 1257879292-55915-20315
Status: 403 Forbidden
Last-Modified: Tue, 10..</pre>
<p>In case you haven&#8217;t noticed this is spamming, and it uses a lot of resources unnecessarily, so don&#8217;t do it, please.</p>
<h3><strong>404 Not Found</strong>: The URI requested is invalid or the resource requested, such as a user, does not exist.</h3>
<p>This one is very simple. You&#8217;re looking for something that&#8217;s just not there. To try it out, go to the original script and change the request to a user you know doesn&#8217;t exist. For example @nicdev1232342</p>
<pre>$user_followers = "https://twitter.com/statuses/followers/nicdev1232342.xml";</pre>
<pre>HTTP/1.1 404 Not Found Date: Tue, 10 Nov
 2009 19:16:49 GMT Server: hi
X-RateLimit-Limit: 150 X-Transaction:
 1257880609-95984-9773 Status:
404 Not Found</pre>
<p><strong>406 Not Acceptable</strong>: Returned by the Search API when an invalid format is specified in the request.</p>
<p>Either the dpcumentation is wrong, or I&#8217;m too slow to understand. I tried making a request for followers using an non-existing format of .noformat, and all I got was a lousy <strong>403</strong>. Again, if someone knows how to get this one to fire, please let me know and I&#8217;ll update the post.</p>
<pre>$user_followers = "https://twitter.com/statuses/followers/nicdev.noformat";</pre>
<p>I wanted a <strong>406</strong>!</p>
<pre>HTTP/1.1 403 Forbidden Date: Tue, 10
 Nov 2009 19:23:03 GMT Server: hi
 X-Transaction: 1257880983-50850-
1216 Status: 403 Forbidden</pre>
<p><strong>500 Internal Server Error</strong>: Something is broken.  Please post to the group so the Twitter team can investigate.</p>
<p>This one you can&#8217;t reproduce at will, but if you play with the Twitter API long enough you&#8217;re bound to run into it.</p>
<p><strong>502 Bad Gateway</strong>: Twitter is down or being upgraded.</p>
<p><img class="alignnone size-full wp-image-165" title="Fail Whale" src="http://nicolasrosental.com/wp-contents/uploads/2009/11/failwhale.png" alt="Fail Whale" width="330" height="225" /><br />
<strong>503 Service Unavailable</strong>: The Twitter servers are up, but overloaded with requests. Try again later. The search and trend methods use this to indicate when you are being rate limited.</p>
<p>The following script will run a search for the term &#8220;argentina&#8221; against the Twitter search API. Search limits are independent of other limits, and will return a <strong>503</strong> as opposed to a <strong>403</strong> when reaching the rate limit.</p>
<pre>$curl_conn = curl_init();</pre>
<pre>//Set up the URL to query Twitter</pre>
<pre>$api_call = "http://search.twitter.com/search.json?&amp;amp;amp;amp;amp;amp;amp;amp;amp;q=argentina";</pre>
<pre>//Set cURL options</pre>
<pre>curl_setopt($curl_conn, CURLOPT_URL, $api_call); //URL to connect to
curl_setopt($curl_conn, CURLOPT_GET, 1); //Use GET
curl_setopt($curl_conn, CURLOPT_HTTPAUTH, CURLAUTH_BASIC); //Use basic authentication
curl_setopt($curl_conn, CURLOPT_USERPWD, 'username:password'); //Set u/p
curl_setopt($curl_conn, CURLOPT_HEADER,1); //Get the header. This is key to getting the response code!</pre>
<pre>curl_setopt($curl_conn, CURLOPT_RETURNTRANSFER, 1); //Return the result as string.</pre>
<pre>for($i=0;$i &lt; 160;$i++)
{
    $output = curl_exec($curl_conn);
    $output = substr($output,0,200);
    echo $output."&lt;br /&gt;";
}</pre>
<pre>// close cURL resource. It's like shutting down the water when you're brushing your teeth.
curl_close($curl_conn);</pre>
<p>This one was a true surprise. While running the script that loops around 160 times I received many <strong>200&#8242;s</strong>, followed by a <strong>502 Bad Gateway</strong>, followed by a <strong>503 Service Unavailable</strong> (what I was expecting), and then again by a bunch of <strong>200&#8242;s</strong>. It seems to me that the rate limit on search is very forgiving.</p>
<pre>HTTP/1.1 200 OK Date: Tue, 10 Nov 2009 19:49:38
HTTP/1.1 502 Bad Gateway Date: Tue, 10 Nov 2009 19:49:42</pre>
<pre>HTTP/1.0 503 Service Unavailable</pre>
<pre>HTTP/1.1 200 OK Date: Tue, 10 Nov 2009 19:50:01</pre>
<p>I hope you enjoyed the post and that it&#8217;ll help you when writing applications for Twitter, or any other app that relies on response codes. To finish here are some great resources.</p>
<ul>
<li><a title="Twitter API doc" href="http://apiwiki.twitter.com/Twitter-API-Documentation">Twitter API Documentation</a> &#8211; Good docs and a great community built around it.</li>
<li><a title="Scripting Twitter with cURL" href="http://www.sakana.fr/blog/2007/03/18/scripting-twitter-with-curl/">Scripting Twitter With cURL &#8211; Tech@Sakana</a></li>
</ul>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d146').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d146" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fnicolasrosental.com%2F2009%2F11%2F10%2Ftwitter-response-codes-simplified%2F&amp;submitHeadline=Twitter+Response+Codes+Simplified&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F11%2F10%2Ftwitter-response-codes-simplified%2F&amp;title=Twitter+Response+Codes+Simplified" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F11%2F10%2Ftwitter-response-codes-simplified%2F&amp;title=Twitter+Response+Codes+Simplified" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fnicolasrosental.com%2F2009%2F11%2F10%2Ftwitter-response-codes-simplified%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fnicolasrosental.com%2F2009%2F11%2F10%2Ftwitter-response-codes-simplified%2F&amp;title=Twitter+Response+Codes+Simplified" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F11%2F10%2Ftwitter-response-codes-simplified%2F&amp;bm_description=Twitter+Response+Codes+Simplified" rel="nofollow" title="Add to&nbsp;Mister Wong"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Add to&nbsp;Mister Wong" alt="Add to&nbsp;Mister Wong" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http%3A%2F%2Fnicolasrosental.com%2F2009%2F11%2F10%2Ftwitter-response-codes-simplified%2F&amp;T=Twitter+Response+Codes+Simplified" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F11%2F10%2Ftwitter-response-codes-simplified%2F&amp;title=Twitter+Response+Codes+Simplified" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F11%2F10%2Ftwitter-response-codes-simplified%2F&amp;title=Twitter+Response+Codes+Simplified" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fnicolasrosental.com%2F2009%2F11%2F10%2Ftwitter-response-codes-simplified%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F11%2F10%2Ftwitter-response-codes-simplified%2F" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Twitter+Response+Codes+Simplified+@+http%3A%2F%2Fnicolasrosental.com%2F2009%2F11%2F10%2Ftwitter-response-codes-simplified%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fnicolasrosental.com%2F2009%2F11%2F10%2Ftwitter-response-codes-simplified%2F&amp;t=Twitter+Response+Codes+Simplified" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d146').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d146').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://nicolasrosental.com/2009/11/10/twitter-response-codes-simplified/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Prevent Form Spam Without CAPTCHA</title>
		<link>http://nicolasrosental.com/2009/06/08/prevent-form-spam-without-captcha/</link>
		<comments>http://nicolasrosental.com/2009/06/08/prevent-form-spam-without-captcha/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 12:00:26 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[captcha]]></category>
		<category><![CDATA[forms]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[spam]]></category>
		<category><![CDATA[tricks]]></category>

		<guid isPermaLink="false">http://nicolasrosental.com/?p=136</guid>
		<description><![CDATA[If you use the Web, you most definitely run into CAPTCHA authentication at one point or another. I personally dislike it and try to avoid using it in my projects as much as possible. Unfortunately there aren&#8217;t many ways in which to avoid spammers running bots against your forms and submitting SPAM. If you also [...]]]></description>
			<content:encoded><![CDATA[<p>If you use the Web, you most definitely run into <a href="http://en.wikipedia.org/wiki/Captcha">CAPTCHA</a> authentication at one point or another. I personally dislike it and try to avoid using it in my projects as much as possible. Unfortunately there aren&#8217;t many ways in which to avoid spammers running bots against your forms and submitting SPAM.</p>
<p>If you also hate CAPTCHA but still want to avoid SPAM, here&#8217;s a trick that I learned from my buddy Reece. It&#8217;s extremely simple to implement, and works like a charm. All you have to do is create an input field that is invivisible to the user. When the form is submitted you can check for the value of that field, if it&#8217;s not empty, it&#8217;s more than likely a spambot.</p>
<p>Here&#8217;s a code sample to clarify.</p>
<p><strong>The Form</strong></p>
<pre>&lt;form action="process_form.php" method="post"&gt;
&lt;ul&gt;
	&lt;li&gt;Name:
&lt;input name="name" type="text"&gt; &lt;/li &gt;
	&lt;li&gt;Last name:
&lt;input name="last_name" type="text"&gt; &lt;/li&gt;
&lt;ul&gt;
&lt;div style="visibility: hidden;"&gt; &lt;input name="bot_catcher" type="text" /&gt; &lt;div&lt;
&lt;input type="submit" value="Submit" /&gt; &lt;form&gt;
</pre>
<p><strong>The PHP</strong></p>
<pre>//I'm only showing how to look for the invisible field, not how to process the entire form

if($_POST['bot_catcher'] != '')

{

echo "No bots allowed"; //This is for illustration purposes,you're better off not giving any response

exit(); //Stop processing

}
</pre>
<p>Loved it, hated it? Please leave a comment to let me know.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d136').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d136" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fnicolasrosental.com%2F2009%2F06%2F08%2Fprevent-form-spam-without-captcha%2F&amp;submitHeadline=Prevent+Form+Spam+Without+CAPTCHA&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F06%2F08%2Fprevent-form-spam-without-captcha%2F&amp;title=Prevent+Form+Spam+Without+CAPTCHA" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F06%2F08%2Fprevent-form-spam-without-captcha%2F&amp;title=Prevent+Form+Spam+Without+CAPTCHA" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fnicolasrosental.com%2F2009%2F06%2F08%2Fprevent-form-spam-without-captcha%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fnicolasrosental.com%2F2009%2F06%2F08%2Fprevent-form-spam-without-captcha%2F&amp;title=Prevent+Form+Spam+Without+CAPTCHA" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F06%2F08%2Fprevent-form-spam-without-captcha%2F&amp;bm_description=Prevent+Form+Spam+Without+CAPTCHA" rel="nofollow" title="Add to&nbsp;Mister Wong"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Add to&nbsp;Mister Wong" alt="Add to&nbsp;Mister Wong" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http%3A%2F%2Fnicolasrosental.com%2F2009%2F06%2F08%2Fprevent-form-spam-without-captcha%2F&amp;T=Prevent+Form+Spam+Without+CAPTCHA" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F06%2F08%2Fprevent-form-spam-without-captcha%2F&amp;title=Prevent+Form+Spam+Without+CAPTCHA" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F06%2F08%2Fprevent-form-spam-without-captcha%2F&amp;title=Prevent+Form+Spam+Without+CAPTCHA" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fnicolasrosental.com%2F2009%2F06%2F08%2Fprevent-form-spam-without-captcha%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F06%2F08%2Fprevent-form-spam-without-captcha%2F" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Prevent+Form+Spam+Without+CAPTCHA+@+http%3A%2F%2Fnicolasrosental.com%2F2009%2F06%2F08%2Fprevent-form-spam-without-captcha%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fnicolasrosental.com%2F2009%2F06%2F08%2Fprevent-form-spam-without-captcha%2F&amp;t=Prevent+Form+Spam+Without+CAPTCHA" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d136').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d136').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://nicolasrosental.com/2009/06/08/prevent-form-spam-without-captcha/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Easy jQuery AJAX For Backend Developers</title>
		<link>http://nicolasrosental.com/2009/03/09/easy-jquery-ajax-for-backend-developers/</link>
		<comments>http://nicolasrosental.com/2009/03/09/easy-jquery-ajax-for-backend-developers/#comments</comments>
		<pubDate>Mon, 09 Mar 2009 18:06:36 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[jQuery]]></category>
		<category><![CDATA[ajax]]></category>
		<category><![CDATA[php]]></category>
		<category><![CDATA[tutorial]]></category>

		<guid isPermaLink="false">http://nicolasrosental.com/?p=112</guid>
		<description><![CDATA[There used to be a time when the backend had most of the power. Us PHP coders and other server-oriented life forms used to say &#8220;JavaScript? No, that&#8217;s for adding lame tricks that don&#8217;t work half the time.&#8221; But that was then, in the past few years AJAX and JavaScript in general exploded. All of [...]]]></description>
			<content:encoded><![CDATA[<p>There used to be a time when the backend had most of the power. Us PHP coders and other server-oriented life forms used to say &#8220;JavaScript? No, that&#8217;s for adding lame tricks that don&#8217;t work half the time.&#8221; But that was then, in the past few years AJAX and JavaScript in general exploded. All of a sudden it isn&#8217;t okay to re-load the page every time we needed to get new data.</p>
<p>I figured it couldn&#8217;t be that hard, but for some reason I was struggling to get AJAX to work like I wanted, and in talking to other developers I found out I wasn&#8217;t alone. For all of you that can relate to my story, here&#8217;s quick tutorial.</p>
<h3>The Setup</h3>
<p>We need a simple HTML page with a block element, with an id of  &#8220;element&#8221;. This page will also have the Jquery/Javascript needed to make the magic happen ( Usually you&#8217;d like to have most of your scripts in a separate file.) Later on we&#8217;ll add more to it, but this is all we need to get started.</p>
<pre>
&lt;!-- import jQuery wherever it is, in this case it's the same dir --&gt;

&lt;script src="jquery.js" type="text/javascript"&gt; &gt;/script&gt; &lt;!-- This is the secret sauce --&lt;
&lt;script type="text/javascript"&gt;
    $(document).ready(function ()
    {
        $('#element').load('output.php');
    });
&lt;/script&gt;
    &gt;div id="element" &gt;/div>
</pre>
<p>Let&#8217;s take a minute to explain the code above. First we need to import jQuery. Then we run our little script which says <em>when the DOM is ready grab the output from output.php and attach it to #element </em>(that is the div with id &#8216;element&#8217;.) The best part of the <strong>load </strong>function is that it expects a piece of HTML to attach to the given selector. It&#8217;s simple, rudimentary, and exactly what backend developers need.</p>
<p>Of course, we also need a very simple PHP script to give us the output we want to bring in via AJAX; I&#8217;ll name the file output.php. Again, we&#8217;ll add some complexity in latter examples.</p>
<pre>
&lt;?php
echo "Hello AJAX";
?&gt;
</pre>
<p>At first sight this example seems as if the &#8220;Hello Ajax!&#8221; message is just part of the page we&#8217;re viewing, so we&#8217;re going to modify the scripts a bit to show that is actually making a call to the script. Alternatively you can use the <a href="http://getfirebug.com/">Firebug</a> console to view the request and script information (highly recommended.)</p>
<h3>Wait for me!</h3>
<p>This time around, instead of making the request as soon as the DOM is ready, we&#8217;re going to do it at the push of a button.</p>
<pre>
&lt;script src="jquery.js" type="text/javascript"&gt;&lt;/script&gt; &lt;!-- import jQuery wherever it is --&gt; &lt;!-- This is the secret sauce --&gt;
&lt;script type="text/javascript"&gt;
    $(document).ready(function ()
    {
        $("#btn").click(function ()
        {
            $("#element").load('output.php');
        });
    })
&lt;/script&gt;
&lt;div id="element"&gt;&lt;/div&gt;
&lt;input id="btn" type="submit" /&gt;
</pre>
<p>This time around we told the function to wait for the button with id of &#8216;btn&#8217; to be clicked before fetching the output. We do so by using the <strong>click</strong> function of javascript. The same could be accomplished by adding <strong>onClick </strong>to the button in the HTML.</p>
<h3>The Final Act</h3>
<p>In the last example, I&#8217;ll show you how to combine the the power of jQuery and PHP to bring in real HTML to the page. Grab good &#8216;ole output.php and modify it as follows</p>
<pre>

//output.php

echo '&lt;h1&gt;Hello AJAX&lt;/h1&gt;';
echo '&lt;p&gt;This is a paragraph right after the Hello Ajax title&lt;/p&gt;';
</pre>
<p>When you click on the button now, you get properly formatted HTML. Yay AJAX!</p>
<p>Please keep in mind that there are much more advanced ways of doing this (witin and without jQuery) that allow for much more granular control, yet this is an extremely simple but powerful way to get some AJAX rolling.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d112').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d112" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fnicolasrosental.com%2F2009%2F03%2F09%2Feasy-jquery-ajax-for-backend-developers%2F&amp;submitHeadline=Easy+jQuery+AJAX+For+Backend+Developers&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F03%2F09%2Feasy-jquery-ajax-for-backend-developers%2F&amp;title=Easy+jQuery+AJAX+For+Backend+Developers" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F03%2F09%2Feasy-jquery-ajax-for-backend-developers%2F&amp;title=Easy+jQuery+AJAX+For+Backend+Developers" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fnicolasrosental.com%2F2009%2F03%2F09%2Feasy-jquery-ajax-for-backend-developers%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fnicolasrosental.com%2F2009%2F03%2F09%2Feasy-jquery-ajax-for-backend-developers%2F&amp;title=Easy+jQuery+AJAX+For+Backend+Developers" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F03%2F09%2Feasy-jquery-ajax-for-backend-developers%2F&amp;bm_description=Easy+jQuery+AJAX+For+Backend+Developers" rel="nofollow" title="Add to&nbsp;Mister Wong"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Add to&nbsp;Mister Wong" alt="Add to&nbsp;Mister Wong" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http%3A%2F%2Fnicolasrosental.com%2F2009%2F03%2F09%2Feasy-jquery-ajax-for-backend-developers%2F&amp;T=Easy+jQuery+AJAX+For+Backend+Developers" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F03%2F09%2Feasy-jquery-ajax-for-backend-developers%2F&amp;title=Easy+jQuery+AJAX+For+Backend+Developers" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F03%2F09%2Feasy-jquery-ajax-for-backend-developers%2F&amp;title=Easy+jQuery+AJAX+For+Backend+Developers" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fnicolasrosental.com%2F2009%2F03%2F09%2Feasy-jquery-ajax-for-backend-developers%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F03%2F09%2Feasy-jquery-ajax-for-backend-developers%2F" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Easy+jQuery+AJAX+For+Backend+Developers+@+http%3A%2F%2Fnicolasrosental.com%2F2009%2F03%2F09%2Feasy-jquery-ajax-for-backend-developers%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fnicolasrosental.com%2F2009%2F03%2F09%2Feasy-jquery-ajax-for-backend-developers%2F&amp;t=Easy+jQuery+AJAX+For+Backend+Developers" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d112').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d112').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://nicolasrosental.com/2009/03/09/easy-jquery-ajax-for-backend-developers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Practical Introduction to Firebug</title>
		<link>http://nicolasrosental.com/2009/02/23/practical-introduction-to-firebug/</link>
		<comments>http://nicolasrosental.com/2009/02/23/practical-introduction-to-firebug/#comments</comments>
		<pubDate>Mon, 23 Feb 2009 16:46:26 +0000</pubDate>
		<dc:creator>nic</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[firebug]]></category>
		<category><![CDATA[tools]]></category>
		<category><![CDATA[web development]]></category>

		<guid isPermaLink="false">http://nicolasrosental.com/?p=103</guid>
		<description><![CDATA[Firebug is a very well known add-on for Firefox (it also works on other browsers) which allows web developers analyze, troubleshoot, and improve their sites. There&#8217;s a huge collection of documents and tutorials to teach you how to use it, how to debug different languages with it, and even how to cook dinner with Firebug [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://getfirebug.com/">Firebug</a> is a very well known add-on for Firefox (it also works on other browsers) which allows web developers analyze, troubleshoot, and improve their sites. There&#8217;s a huge collection of documents and tutorials to teach you how to use it, how to debug different languages with it, and even how to cook dinner with Firebug (not really).</p>
<p>This quick intro is intended to give you a taste of how it works, the different sections, and give you enough of a kickstart to allow you to discover on your own. We&#8217;ll walk through the interface, and try out a few practical examples to give you a taste of the bug. Best of all, you can do all of it while reading this post.</p>
<p>First of all you need to <a href="http://getfirebug.com/">install it.</a></p>
<p>Open it with F12, or click on the little bug at the bottom right corner of the browser.</p>
<p style="text-align: center;"><img class="size-full wp-image-105 aligncenter" title="firebug_html" src="http://nicolasrosental.com/wp-contents/uploads/2009/02/firebug_html.jpg" alt="Firebug HTML menu" width="149" height="88" /></p>
<p>Select <strong>HTML</strong> from the top bar and hover over the different elements. Notice how they are highlighted as you move from one to the next.</p>
<p>Select the <strong>CSS </strong>(right next to HTML), you can double-click any entry to modify it, or right-click and select &#8216;edit&#8217;. For example, look for the <strong>a </strong>selector and change <strong>text-decoration :   none</strong> to <strong>underline</strong> and see all the links suddenly change. Also, note that it auto-completes the property (fancy).</p>
<div id="attachment_106" class="wp-caption aligncenter" style="width: 467px"><img class="size-full wp-image-106" title="firebug_dom" src="http://nicolasrosental.com/wp-contents/uploads/2009/02/firebug_dom.jpg" alt="" width="457" height="215" /><p class="wp-caption-text">Firebug DOM menu</p></div>
<p>The <strong>DOM </strong>section is very useful, but also complicated to navigate if you don&#8217;t know what you are looking for. We&#8217;ll look at more of the DOM later on.</p>
<p>The <strong>Net </strong>section is simply cool. It might be disabled when you first click on it, but it&#8217;ll give you the option to enable if that&#8217;s the case. The initial subsection is <strong>All </strong>which shows a graphical representation of the aggregate of time it took to download each element on the page. You can also view the other sub-sections for CSS, Javascript, etc. Click on &#8216;clear&#8217; at the top left of the Firebug pane, then refresh the page and see the section populate in real time.</p>
<p>Let&#8217;s give a second look at the HTML section. Look at the HTML tree and open up to the entry <strong>&lt;div class=&#8221;container&#8221;&gt;</strong> (html -&gt; body -&gt; div).  On the right pane you can see the CSS styles affecting the page, under <strong>Laytout </strong>there&#8217;s an on-the-fly box model (awesome for troubleshooting margins, padding, etc.) In the <strong>DOM</strong> section you can check out the DOM properties for each particular element.</p>
<p style="text-align: center;"><img class="size-full wp-image-107 aligncenter" title="dom_edit_firebug" src="http://nicolasrosental.com/wp-contents/uploads/2009/02/dom_edit_firebug.jpg" alt="dom_edit_firebug" width="463" height="214" /> For exmaple, on the left side select the  <strong>&lt;title&gt;</strong>tag (html -&gt; head -&gt; title). In the right panel look for the <strong>text</strong> entry and double-click on it. Change the title to the one of your choice and see the page renamed.</p>
<p>Saving the best for last, try the following. Click on <strong>Console</strong>, at the very bottom you should have a prompt that looks like<strong> &gt;&gt;&gt;</strong>. Right there type &#8220;alert(&#8220;Hello NicDev&#8221;);&#8221; without the quotes, and press enter. Your script has just been run, you can imagine how handy this is to try JS on the fly.</p>
<p>Well, there&#8217;s a whole lot more to Firebug than what we went over today, but hopefully you feel comfortable enough to go tackle some of those tutorials and start churning out some awesome sites.</p>
<!-- Social Bookmarks BEGIN -->
<div class="social_bookmark">
<a title="Click me to see the sites." href="#" onclick="$$('div.d103').each( function(e) { e.visualEffect('slide_down',{duration:2.5}) }); return false;"><strong><em>Bookmark It</em></strong></a>
<br />
<div class="d103" style="overflow:hidden">
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://buzz.yahoo.com/submit?submitUrl=http%3A%2F%2Fnicolasrosental.com%2F2009%2F02%2F23%2Fpractical-introduction-to-firebug%2F&amp;submitHeadline=Practical+Introduction+to+Firebug&amp;submitSummary=" rel="nofollow" title="Add to&nbsp;Buzz"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/buzz.png" title="Add to&nbsp;Buzz" alt="Add to&nbsp;Buzz" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://del.icio.us/post?url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F02%2F23%2Fpractical-introduction-to-firebug%2F&amp;title=Practical+Introduction+to+Firebug" rel="nofollow" title="Add to&nbsp;Del.icio.us"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/delicious.png" title="Add to&nbsp;Del.icio.us" alt="Add to&nbsp;Del.icio.us" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://digg.com/submit?phase=2&amp;url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F02%2F23%2Fpractical-introduction-to-firebug%2F&amp;title=Practical+Introduction+to+Firebug" rel="nofollow" title="Add to&nbsp;digg"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/digg.png" title="Add to&nbsp;digg" alt="Add to&nbsp;digg" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.facebook.com/sharer.php?u=http%3A%2F%2Fnicolasrosental.com%2F2009%2F02%2F23%2Fpractical-introduction-to-firebug%2F" rel="nofollow" title="Add to&nbsp;Facebook"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/facebook.png" title="Add to&nbsp;Facebook" alt="Add to&nbsp;Facebook" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.google.com/bookmarks/mark?op=edit&amp;output=popup&amp;bkmk=http%3A%2F%2Fnicolasrosental.com%2F2009%2F02%2F23%2Fpractical-introduction-to-firebug%2F&amp;title=Practical+Introduction+to+Firebug" rel="nofollow" title="Add to&nbsp;Google Bookmarks"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/google.png" title="Add to&nbsp;Google Bookmarks" alt="Add to&nbsp;Google Bookmarks" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.mister-wong.com/index.php?action=addurl&amp;bm_url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F02%2F23%2Fpractical-introduction-to-firebug%2F&amp;bm_description=Practical+Introduction+to+Firebug" rel="nofollow" title="Add to&nbsp;Mister Wong"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/misterwong.png" title="Add to&nbsp;Mister Wong" alt="Add to&nbsp;Mister Wong" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.netscape.com/submit/?U=http%3A%2F%2Fnicolasrosental.com%2F2009%2F02%2F23%2Fpractical-introduction-to-firebug%2F&amp;T=Practical+Introduction+to+Firebug" rel="nofollow" title="Add to&nbsp;Netscape"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/netscape.png" title="Add to&nbsp;Netscape" alt="Add to&nbsp;Netscape" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://reddit.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F02%2F23%2Fpractical-introduction-to-firebug%2F&amp;title=Practical+Introduction+to+Firebug" rel="nofollow" title="Add to&nbsp;reddit"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/reddit.png" title="Add to&nbsp;reddit" alt="Add to&nbsp;reddit" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.stumbleupon.com/submit?url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F02%2F23%2Fpractical-introduction-to-firebug%2F&amp;title=Practical+Introduction+to+Firebug" rel="nofollow" title="Add to&nbsp;Stumble Upon"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/stumbleupon.png" title="Add to&nbsp;Stumble Upon" alt="Add to&nbsp;Stumble Upon" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://www.technorati.com/faves?add=http%3A%2F%2Fnicolasrosental.com%2F2009%2F02%2F23%2Fpractical-introduction-to-firebug%2F" rel="nofollow" title="Add to&nbsp;Technorati"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/technorati.png" title="Add to&nbsp;Technorati" alt="Add to&nbsp;Technorati" /></a>
<br />
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://tipd.com/submit.php?url=http%3A%2F%2Fnicolasrosental.com%2F2009%2F02%2F23%2Fpractical-introduction-to-firebug%2F" rel="nofollow" title="Add to&nbsp;Tip'd"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/tipd.png" title="Add to&nbsp;Tip'd" alt="Add to&nbsp;Tip'd" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://twitter.com/home/?status=Check+out+Practical+Introduction+to+Firebug+@+http%3A%2F%2Fnicolasrosental.com%2F2009%2F02%2F23%2Fpractical-introduction-to-firebug%2F" rel="nofollow" title="Add to&nbsp;Twitter"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/twitter.png" title="Add to&nbsp;Twitter" alt="Add to&nbsp;Twitter" /></a>
<a onclick="window.open(this.href, '_blank', 'scrollbars=yes,menubar=no,height=600,width=750,resizable=yes,toolbar=no,location=no,status=no'); return false;" href="http://myweb2.search.yahoo.com/myresults/bookmarklet?u=http%3A%2F%2Fnicolasrosental.com%2F2009%2F02%2F23%2Fpractical-introduction-to-firebug%2F&amp;t=Practical+Introduction+to+Firebug" rel="nofollow" title="Add to&nbsp;Yahoo My Web"><img class="social_img" src="http://nicolasrosental.com/wp-content/plugins/social-bookmarks/images/yahoo.png" title="Add to&nbsp;Yahoo My Web" alt="Add to&nbsp;Yahoo My Web" /></a>
<br />
<a style="font-size:90%;text-align: right; " title="Click me to hide the sites." href="#" onclick="$$('div.d103').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); return false;">Hide Sites</a>
</div>
</div>
<!-- Social Bookmarks END -->
<script type="text/javascript">$$('div.d103').each( function(e) { e.visualEffect('slide_up',{duration:0.5}) }); </script>]]></content:encoded>
			<wfw:commentRss>http://nicolasrosental.com/2009/02/23/practical-introduction-to-firebug/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->