<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/rss2full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Ben Ramsey</title>
	
	<link>http://benramsey.com</link>
	<description>PHP and Other Techno-babble</description>
	<pubDate>Fri, 07 Nov 2008 15:54:37 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.5.1</generator>
	<language>en</language>
			<creativeCommons:license>http://creativecommons.org/licenses/by-nd/2.0/</creativeCommons:license><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" href="http://benramsey.com/feed/" type="application/rss+xml" /><feedburner:feedFlare href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Fbenramsey.com%2Ffeed%2F" src="http://us.i1.yimg.com/us.yimg.com/i/us/my/addtomyyahoo4.gif">Subscribe with My Yahoo!</feedburner:feedFlare><feedburner:feedFlare href="http://www.newsgator.com/ngs/subscriber/subext.aspx?url=http%3A%2F%2Fbenramsey.com%2Ffeed%2F" src="http://www.newsgator.com/images/ngsub1.gif">Subscribe with NewsGator</feedburner:feedFlare><feedburner:feedFlare href="http://feeds.my.aol.com/add.jsp?url=http%3A%2F%2Fbenramsey.com%2Ffeed%2F" src="http://o.aolcdn.com/favorites.my.aol.com/webmaster/ffclient/webroot/locale/en-US/images/myAOLButtonSmall.gif">Subscribe with My AOL</feedburner:feedFlare><feedburner:feedFlare href="http://www.rojo.com/add-subscription?resource=http%3A%2F%2Fbenramsey.com%2Ffeed%2F" src="http://blog.rojo.com/RojoWideRed.gif">Subscribe with Rojo</feedburner:feedFlare><feedburner:feedFlare href="http://www.bloglines.com/sub/http://benramsey.com/feed/" src="http://www.bloglines.com/images/sub_modern11.gif">Subscribe with Bloglines</feedburner:feedFlare><feedburner:feedFlare href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fbenramsey.com%2Ffeed%2F" src="http://www.netvibes.com/img/add2netvibes.gif">Subscribe with Netvibes</feedburner:feedFlare><feedburner:feedFlare href="http://fusion.google.com/add?feedurl=http%3A%2F%2Fbenramsey.com%2Ffeed%2F" src="http://buttons.googlesyndication.com/fusion/add.gif">Subscribe with Google</feedburner:feedFlare><feedburner:feedFlare href="http://www.pageflakes.com/subscribe.aspx?url=http%3A%2F%2Fbenramsey.com%2Ffeed%2F" src="http://www.pageflakes.com/ImageFile.ashx?instanceId=Static_4&amp;fileName=ATP_blu_91x17.gif">Subscribe with Pageflakes</feedburner:feedFlare><item>
		<title>Speaking At php|works In Atlanta</title>
		<link>http://feeds.feedburner.com/~r/ramsey/~3/445600008/</link>
		<comments>http://benramsey.com/archives/speaking-at-phpworks-in-atlanta/#comments</comments>
		<pubDate>Fri, 07 Nov 2008 15:54:37 +0000</pubDate>
		<dc:creator>Ben Ramsey</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[atlanta]]></category>

		<category><![CDATA[atlphp]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[phpworks]]></category>

		<category><![CDATA[pyworks]]></category>

		<guid isPermaLink="false">http://benramsey.com/?p=258</guid>
		<description><![CDATA[	Next week, I&#8217;ll be speaking at php&#124;works and PyWorks in Atlanta on Representational State Transfer (REST). My talk is in the general track this time, so it&#8217;s good for both the PHP and Python audiences who will be attending the conference.

	

	I&#8217;ve already invited the Atlanta PHP community, and if you&#8217;ll be in the Atlanta area, [...]]]></description>
			<content:encoded><![CDATA[	<p>Next week, I&#8217;ll be speaking at <a href="http://phpworks.mtacon.com/">php|works</a> and <a href="http://pyworks.mtacon.com/">PyWorks</a> in Atlanta on Representational State Transfer (REST). My talk is in the general track this time, so it&#8217;s good for both the PHP and Python audiences who will be attending the conference.</p>

	<p style="text-align:center;"><a href="http://phpworks.mtacon.com/" title="php|works"><img src="http://benramsey.com/media/img/phpworks_08_Speaker_button.jpg" height="106" width="150" alt="php|works 2008: Explore the Possibilities" /></a></p>

	<p>I&#8217;ve already <a href="http://www.atlantaphp.org/archive/86">invited the Atlanta PHP community</a>, and if you&#8217;ll be in the Atlanta area, you should come, too. I can&#8217;t say it enough: the <a href="http://phpworks.mtacon.com/c/p/signup">price of this conference</a> compared to the value you receive from the talks and networking is a steal! In addition, if you sign up for the tutorials, you get a <a href="http://phpworks.mtacon.com/c/p/phpworks,specials">free training course at <em>php|architect</em></a>. You really can&#8217;t get a better deal at any other conference. I guarantee you&#8217;ll be glad you attended.</p>


 <div class="feedflare">
<a href="http://feeds.feedburner.com/~f/ramsey?a=C91TN"><img src="http://feeds.feedburner.com/~f/ramsey?i=C91TN" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=isSJn"><img src="http://feeds.feedburner.com/~f/ramsey?i=isSJn" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=CpbaN"><img src="http://feeds.feedburner.com/~f/ramsey?i=CpbaN" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=RRxsN"><img src="http://feeds.feedburner.com/~f/ramsey?i=RRxsN" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ramsey/~4/445600008" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://benramsey.com/archives/speaking-at-phpworks-in-atlanta/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=ramsey&amp;itemurl=http%3A%2F%2Fbenramsey.com%2Farchives%2Fspeaking-at-phpworks-in-atlanta%2F</feedburner:awareness><feedburner:origLink>http://benramsey.com/archives/speaking-at-phpworks-in-atlanta/</feedburner:origLink></item>
		<item>
		<title>Atlanta PHP 11/08 Meeting</title>
		<link>http://feeds.feedburner.com/~r/ramsey/~3/441364355/</link>
		<comments>http://benramsey.com/archives/atlanta-php-1108-meeting/#comments</comments>
		<pubDate>Mon, 03 Nov 2008 20:41:20 +0000</pubDate>
		<dc:creator>Ben Ramsey</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[atlanta]]></category>

		<category><![CDATA[atlphp]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[phpworks]]></category>

		<category><![CDATA[pug]]></category>

		<category><![CDATA[pyworks]]></category>

		<category><![CDATA[user-group]]></category>

		<guid isPermaLink="false">http://benramsey.com/?p=257</guid>
		<description><![CDATA[	I usually don&#8217;t announce Atlanta PHP meetings from my blog, but given the short notice, I figured that greater exposure would be best, so here we go&#8230;

	When: Thursday, November 6, 2008&#8212;7pm-9pm
Where: Consulate General of Canada

	November Topic: Got a problem? We&#8217;ve got answers!

	Got a bug that&#8217;s been nagging you for hours? How about a feature that [...]]]></description>
			<content:encoded><![CDATA[	<p>I usually don&#8217;t announce Atlanta PHP meetings from my blog, but given the short notice, I figured that greater exposure would be best, so here we go&#8230;</p>

	<p><strong>When:</strong> Thursday, November 6, 2008&#8212;7pm-9pm<br />
<strong>Where:</strong> <a href="http://www.atlantaphp.org/directions-canadian-consulate/">Consulate General of Canada</a></p>

	<h3>November Topic: Got a problem? We&#8217;ve got answers!</h3>

	<p>Got a bug that&#8217;s been nagging you for hours? How about a feature that you just can&#8217;t seem to implement? This month at Atlanta PHP, we&#8217;re diverging from our usual presentation format and opening the floor for a &#8220;round table&#8221; discussion about development problems you are facing.</p>

	<p>So, feel free to bring your coding problems to us, and as a group, we&#8217;ll come up with the solutions. Bring your laptop or a thumb drive containing snippets/samples of your code or application, so we can look at it as a group. This is sure to be a learning experience for us all.</p>

	<p>Our meeting takes place at the Consulate General of Canada at 100 Colony Square in Midtown Atlanta (at the corner of Peachtree and 14th Streets). <a href="http://www.atlphp.org/directions-canadian-consulate/">Click here for directions.</a> <span style="color:red;;">You will need to see the concierge in order to gain access to the 17th floor.</span></p>

	<h3>PHP Basics at the Atlanta Web Design Group Meetup on November 11</h3>

	<p>On November 11 at 7:00pm, Matthew Turland will speak to the Atlanta Web Design Group about PHP, covering basics of the language and best practices from a designer&#8217;s perspective. This will include basic output, variables, conditional branches, loops, output modularization using includes, coding style, and escaping output for security purposes.</p>

	<p>Matthew is the Lead Programmer for a Web application service provider, is Zend PHP Certified, and works with PHP and MySQL on a daily basis. He&#8217;s also a member of the PHP Community organization and serves as an organizer for the Acadiana Open Source Group. You can also read his blog at <a href="http://ishouldbecoding.com/">http://ishouldbecoding.com/</a>.</p>

	<p>There will be a 30-40 minute presentation followed by Q&#38;A and discussion.</p>

	<p>You must <a href="http://www.meetup.com/atlantawebdesign/calendar/8933355/">RSVP at Meetup.com</a> for this meeting.</p>

	<h3>php|works and PyWorks in Atlanta November 12-14!</h3>

	<p><div class="aligncenter"><a href="http://phpworks.mtacon.com" style="background: none;"><br />
<img border="0" style="border: none;" src="http://phpworks.mtacon.com/mat/mediasponsor.png" width="150" height="106" alt="php|works &#038; PyWorks 2008 Conference" /></a></div></p>

	<p><a href="http://www.atlantaphp.org/archive/86">Atlanta PHP invites you to join us at php|works and PyWorks</a> in Atlanta, GA November 12 through 14!</p>

	<p><strong>Atlanta PHP user group members receive $100 off the price of registration!</strong></p>

	<p>The publishers of <a href="http://www.phparch.com/"><em>php|architect</em></a> and <a href="http://pymag.phparch.com/"><em>Python Magazine</em></a>, are proud to invite you to <a href="http://phpworks.mtacon.com/">php|works</a> and <a href="http://pyworks.mtacon.com/">PyWorks</a>, two great conferences that will take place in Atlanta, GA, USA, between November 12 and November 14.</p>

	<p>With over 65 talks in 5 tracks, 10 tutorials and great networking events and parties, php|works and PyWorks represent a unique opportunity to not only hone your technical skills, but also meet and interact with members of a vibrant community of developers from all walks of life. And remember&#8212;your attendance fee covers access to both conferences!</p>


 <div class="feedflare">
<a href="http://feeds.feedburner.com/~f/ramsey?a=HLPIN"><img src="http://feeds.feedburner.com/~f/ramsey?i=HLPIN" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=jjwin"><img src="http://feeds.feedburner.com/~f/ramsey?i=jjwin" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=p5QJN"><img src="http://feeds.feedburner.com/~f/ramsey?i=p5QJN" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=KC5uN"><img src="http://feeds.feedburner.com/~f/ramsey?i=KC5uN" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ramsey/~4/441364355" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://benramsey.com/archives/atlanta-php-1108-meeting/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=ramsey&amp;itemurl=http%3A%2F%2Fbenramsey.com%2Farchives%2Fatlanta-php-1108-meeting%2F</feedburner:awareness><feedburner:origLink>http://benramsey.com/archives/atlanta-php-1108-meeting/</feedburner:origLink></item>
		<item>
		<title>ZendCon 2008 Slides</title>
		<link>http://feeds.feedburner.com/~r/ramsey/~3/394646055/</link>
		<comments>http://benramsey.com/archives/zendcon-2008-slides/#comments</comments>
		<pubDate>Tue, 16 Sep 2008 23:25:10 +0000</pubDate>
		<dc:creator>Ben Ramsey</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[atom]]></category>

		<category><![CDATA[atompub]]></category>

		<category><![CDATA[http]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[presentations]]></category>

		<category><![CDATA[rest]]></category>

		<category><![CDATA[talks]]></category>

		<category><![CDATA[zendcon]]></category>

		<category><![CDATA[zendcon08]]></category>

		<guid isPermaLink="false">http://benramsey.com/?p=256</guid>
		<description><![CDATA[	See below for the slides from my Distribution and Publication With Atom Web Services talk given at the 2008 Zend PHP Conference and Expo in Santa Clara, CA.

	As we move toward &#8220;Web 3.0,&#8221; the Web is slowly transforming into a platform upon which massively distributed applications run. Rich clients turn personal computers into thin clients, [...]]]></description>
			<content:encoded><![CDATA[	<p>See below for the slides from my Distribution and Publication With Atom Web Services talk given at the 2008 Zend PHP Conference and Expo in Santa Clara, CA.</p>

	<p>As we move toward &#8220;Web 3.0,&#8221; the Web is slowly transforming into a platform upon which massively distributed applications run. Rich clients turn personal computers into thin clients, not storing or processing any data locally but, rather, connecting to a web service where the data resides. These services may target intranets, extranets, or the global Web community, but to work they need a common language. One such language is the Atom Publishing Protocol.</p>

	<p>Since its inception as a draft recommendation in 2003, the Atom Syndication Format (RFC 4287) has been used as an alternative to Really Simple Syndication (RSS) feeds on blogs throughout the blogosphere. Most have understood Atom as just another feed format, but the publication of the Atom Publishing Protocol (RFC 5023) opens the door for far more uses of the Atom format as both a means for distribution of data, as well as publication.</p>

	<p>Ben Ramsey will introduce the Atom Syndication Format and Atom Publishing Protocol, explaining in depth how these can form the foundation of any web service for publication and distribution of data in any environment, from the enterprise right down to the small business level. Ramsey will also discuss RESTful design principles as they relate to the Atom Publishing Protocol.</p>

	<p><div style="width:425px;text-align:left" id="__ss_446935"><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=bramseyatompubzendcon08-1221606678405890-8&#38;stripped_title=distribution-and-publication-with-atom-web-services-presentation"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=bramseyatompubzendcon08-1221606678405890-8&#38;stripped_title=distribution-and-publication-with-atom-web-services-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"><a href="http://www.slideshare.net/?src=embed"><img src="http://static.slideshare.net/swf/logo_embd.png" style="border:0px none;margin-bottom:-5px" alt="SlideShare"/></a> | <a href="http://www.slideshare.net/benramsey/distribution-and-publication-with-atom-web-services-presentation" title="View Distribution and Publication With Atom Web Services on SlideShare">View</a> | <a href="http://benramsey.com/media/talks/bramsey-atompub-zendcon08.pdf" title="Download Distribution and Publication With Atom Web Services">Download</a></div></div></p>


 <div class="feedflare">
<a href="http://feeds.feedburner.com/~f/ramsey?a=VkIwL"><img src="http://feeds.feedburner.com/~f/ramsey?i=VkIwL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=4hZtl"><img src="http://feeds.feedburner.com/~f/ramsey?i=4hZtl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=tmZWL"><img src="http://feeds.feedburner.com/~f/ramsey?i=tmZWL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=om2BL"><img src="http://feeds.feedburner.com/~f/ramsey?i=om2BL" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ramsey/~4/394646055" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://benramsey.com/archives/zendcon-2008-slides/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=ramsey&amp;itemurl=http%3A%2F%2Fbenramsey.com%2Farchives%2Fzendcon-2008-slides%2F</feedburner:awareness><feedburner:origLink>http://benramsey.com/archives/zendcon-2008-slides/</feedburner:origLink></item>
		<item>
		<title>Heading To ZendCon</title>
		<link>http://feeds.feedburner.com/~r/ramsey/~3/392515934/</link>
		<comments>http://benramsey.com/archives/heading-to-zendcon/#comments</comments>
		<pubDate>Sun, 14 Sep 2008 19:06:31 +0000</pubDate>
		<dc:creator>Ben Ramsey</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[zendcon]]></category>

		<category><![CDATA[zendcon08]]></category>

		<guid isPermaLink="false">http://benramsey.com/?p=254</guid>
		<description><![CDATA[	As I write this post, I&#8217;m sitting at about 38,000 ft on a Boeing 757-200, flying high above the now tropical storm Ike. My destination is Santa Clara, CA and the Zend PHP Conference and Expo.

	This year, I&#8217;m giving a talk at the main conference, as well as moderating a discussion at the ZendCon Unconference, [...]]]></description>
			<content:encoded><![CDATA[	<p>As I write this post, I&#8217;m sitting at about 38,000 ft on a Boeing 757-200, flying high above the now tropical storm Ike. My destination is Santa Clara, CA and the <a href="http://www.zendcon.com/">Zend PHP Conference and Expo</a>.</p>

	<p>This year, I&#8217;m giving a talk at the main conference, as well as moderating a discussion at the <a href="http://www.zendcon.com/ZendCon08/public/wiki/UnCon_Home">ZendCon Unconference</a>, coinciding with the main conference. While it&#8217;s a shame that Zend does not open up the Uncon&#8212;perhaps even for a small fee&#8212;to the general public (you must be a registered ZendCon attendee to attend the Uncon), it is good that they&#8217;re opening up the space for anyone attending the conference to share ideas through presentation and discussion in an open forum. The Uncon is the community space and <em>the</em> place to be if you want to engage the PHP Community while at ZendCon.</p>

	<p>The &#8220;round-table&#8221; discussion I&#8217;m moderating at the Uncon is titled&#8212;with tongue firmly planted in cheek&#8212;&#8220;PHP Developers’ Groups: Cat Herding 101.&#8221; User group leaders and volunteers will likely agree with me that organizing meetings often feels like herding cats.  This discussion is primarily for user group leaders and volunteers, but it&#8217;s not exclusive. It&#8217;s open to everyone who would like to listen, learn, and participate in discussion about planning for user group meetings and events, and how to reach out and communicate with your user group members and the local developer community in your area. If you&#8217;ve ever had an interest in starting a user group, by all means, please be sure to attend! <strong>The user group discussion will take place on Wednesday, September 17th at 5:15pm in the Uncon space.</strong></p>

	<p>At the conference proper, I&#8217;ll be giving my &#8220;Distribution and Publication With Atom Web Services&#8221; presentation. This is the second time I will have given this talk, and it has been greatly improved since I gave it at DC PHP earlier this year. The previous incarnation of this talk was geared more towards developers, but this time, I think the presentation will be of interest to both programmers and managers alike, since I not only describe in technical detail how Atom works, but I also give high-level information explaining how Atom Web Services may be beneficial to your business or organization. I make the case for why Atom is important for any application that distributes or publishes content.</p>

	<p>As for the remainder of the day today, I&#8217;ll be hanging out in sunny California, possibly taking a day trip into San Francisco to walk around and sight-see.</p>

	<p>Hope to see you at the conference!</p>


 <div class="feedflare">
<a href="http://feeds.feedburner.com/~f/ramsey?a=sQaeL"><img src="http://feeds.feedburner.com/~f/ramsey?i=sQaeL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=8hjrl"><img src="http://feeds.feedburner.com/~f/ramsey?i=8hjrl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=oI6kL"><img src="http://feeds.feedburner.com/~f/ramsey?i=oI6kL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=BztBL"><img src="http://feeds.feedburner.com/~f/ramsey?i=BztBL" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ramsey/~4/392515934" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://benramsey.com/archives/heading-to-zendcon/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=ramsey&amp;itemurl=http%3A%2F%2Fbenramsey.com%2Farchives%2Fheading-to-zendcon%2F</feedburner:awareness><feedburner:origLink>http://benramsey.com/archives/heading-to-zendcon/</feedburner:origLink></item>
		<item>
		<title>PHP Groups Mailing List Moves To PHP.net</title>
		<link>http://feeds.feedburner.com/~r/ramsey/~3/387958274/</link>
		<comments>http://benramsey.com/archives/php-groups-mailing-list-moves-to-phpnet/#comments</comments>
		<pubDate>Tue, 09 Sep 2008 19:55:44 +0000</pubDate>
		<dc:creator>Ben Ramsey</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[phpcommunity]]></category>

		<category><![CDATA[phpgroups]]></category>

		<category><![CDATA[pug]]></category>

		<category><![CDATA[user-group]]></category>

		<guid isPermaLink="false">http://benramsey.com/?p=253</guid>
		<description><![CDATA[	After a long hiatus and a very quiet mailing list and forum, I am delighted to announce that the main communication channel for PHP Groups is moving to the official PHP project at php.net!

	You may recall PHP Groups being created over a year ago for the purpose of networking together the leaders and organizers of [...]]]></description>
			<content:encoded><![CDATA[	<p>After a long hiatus and a very quiet mailing list and forum, I am delighted to announce that the main communication channel for <a href="http://phpgroups.org/">PHP Groups</a> is moving to the official PHP project at php.net!</p>

	<p>You may recall PHP Groups being created over a year ago for the purpose of networking together the leaders and organizers of PHP user groups around the world. I&#8217;ve been very bad about keeping things moving on this front, but I want to pick things back up and get us talking again. I also want to get us back on track for the mission of this group:</p>

	<blockquote>
		<p>PHP Groups networks PHP user groups into a tighter community, provides a means to share information and resources among its community members, and aids in the formation of new PHP user groups.</p>
	</blockquote>

	<p>In the near future, we&#8217;ll have more discussion about what we can do to progress toward fulfilling this mission.</p>

	<p>In the meantime, if you help with the organization of your local PHP user group in any way, feel free to join the ug-admins mailing list or subscribe to the ug.admin news group at php.net:</p>

	<p>ug-admins-subscribe [ at ] lists.php.net<br />
<a href="news://news.php.net/ug.admins">news://news.php.net/ug.admins</a></p>

	<p>Also, look to this list for announcements about meet-ups of user group leaders and organizers at upcoming conferences!</p>

	<p>And, as always, I&#8217;m lurking in <a href="irc://irc.freenode.net/phpgroups">#phpgroups</a> on Freenode IRC, so feel free to join me, if you like. </p>


 <div class="feedflare">
<a href="http://feeds.feedburner.com/~f/ramsey?a=WkHSL"><img src="http://feeds.feedburner.com/~f/ramsey?i=WkHSL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=chCil"><img src="http://feeds.feedburner.com/~f/ramsey?i=chCil" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=gaTLL"><img src="http://feeds.feedburner.com/~f/ramsey?i=gaTLL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=txsrL"><img src="http://feeds.feedburner.com/~f/ramsey?i=txsrL" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ramsey/~4/387958274" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://benramsey.com/archives/php-groups-mailing-list-moves-to-phpnet/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=ramsey&amp;itemurl=http%3A%2F%2Fbenramsey.com%2Farchives%2Fphp-groups-mailing-list-moves-to-phpnet%2F</feedburner:awareness><feedburner:origLink>http://benramsey.com/archives/php-groups-mailing-list-moves-to-phpnet/</feedburner:origLink></item>
		<item>
		<title>OSCON 2008: Slides</title>
		<link>http://feeds.feedburner.com/~r/ramsey/~3/345102084/</link>
		<comments>http://benramsey.com/archives/oscon-2008slides/#comments</comments>
		<pubDate>Thu, 24 Jul 2008 23:38:54 +0000</pubDate>
		<dc:creator>Ben Ramsey</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[memcache]]></category>

		<category><![CDATA[memcached]]></category>

		<category><![CDATA[oscon]]></category>

		<category><![CDATA[oscon08]]></category>

		<category><![CDATA[presentation]]></category>

		<category><![CDATA[talk]]></category>

		<guid isPermaLink="false">http://benramsey.com/?p=252</guid>
		<description><![CDATA[	Here are my slides for the memcached presentation I gave at OSCON this year. I experimented with a new slide template, which turned out for the worst, since the contrast of the type on the screen was very poor, making it difficult for attendees to read. I apologize for this. In addition, I was completely [...]]]></description>
			<content:encoded><![CDATA[	<p>Here are my slides for the <a href="http://www.danga.com/memcached/">memcached</a> presentation I gave at <a href="http://en.oreilly.com/oscon2008/">OSCON</a> this year. I experimented with a new slide template, which turned out for the worst, since the contrast of the type on the screen was very poor, making it difficult for attendees to read. I apologize for this. In addition, I was completely distracted during my entire talk by loud music coming from the room next door. Nevertheless, the majority of my audience was still around even after I ran 5-10 minutes over schedule, eating into their free beer time, so I suppose that says something and that they were learning. <img src='http://benramsey.com/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </p>

	<p>Thanks to all who attended!</p>

	<h2>Give Your Site a Boost With Memcache</h2>

	<p>Today&#8217;s high-traffic websites must implement performance-boosting measures that reduce data processing and reduce load on the database, while increasing the speed of content delivery. One such method is the use of a cache to temporarily store whole pages, database recordsets, large objects, and sessions. While many caching mechanisms exist, memcached provides one of the fastest and easiest-to-use caching servers. This talk will cover memcached and the memcache extension for PHP from setting up a memcached server to using it to provide a variety of caching solutions, including the use of memcached as a session data store.</p>

	<p><div style="width:425px;text-align:left" id="__ss_446935"><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=bramseymemcacheoscon08-1216941345919509-8"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=bramseymemcacheoscon08-1216941345919509-8" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"><a href="http://www.slideshare.net/?src=embed"><img src="http://static.slideshare.net/swf/logo_embd.png" style="border:0px none;margin-bottom:-5px" alt="SlideShare"/></a> | <a href="http://www.slideshare.net/benramsey/give-your-site-a-boost-with-memcache-527212?src=embed" title="View Give Your Site A Boost With Memcache on SlideShare">View</a> | <a href="http://benramsey.com/media/talks/bramsey-memcache-oscon08.pdf" title="Download Give Your Site A Boost With Memcache">Download</a></div></div></p>


 <div class="feedflare">
<a href="http://feeds.feedburner.com/~f/ramsey?a=IzJ3TJ"><img src="http://feeds.feedburner.com/~f/ramsey?i=IzJ3TJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=UDBTtj"><img src="http://feeds.feedburner.com/~f/ramsey?i=UDBTtj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=I28k2J"><img src="http://feeds.feedburner.com/~f/ramsey?i=I28k2J" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=6H9KlJ"><img src="http://feeds.feedburner.com/~f/ramsey?i=6H9KlJ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ramsey/~4/345102084" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://benramsey.com/archives/oscon-2008slides/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=ramsey&amp;itemurl=http%3A%2F%2Fbenramsey.com%2Farchives%2Foscon-2008slides%2F</feedburner:awareness><feedburner:origLink>http://benramsey.com/archives/oscon-2008slides/</feedburner:origLink></item>
		<item>
		<title>OSCON 2008: Day One</title>
		<link>http://feeds.feedburner.com/~r/ramsey/~3/342015399/</link>
		<comments>http://benramsey.com/archives/oscon-2008-day-one/#comments</comments>
		<pubDate>Mon, 21 Jul 2008 23:50:48 +0000</pubDate>
		<dc:creator>Ben Ramsey</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[closures]]></category>

		<category><![CDATA[erlang]]></category>

		<category><![CDATA[memcached]]></category>

		<category><![CDATA[opensource]]></category>

		<category><![CDATA[oscon]]></category>

		<category><![CDATA[oscon08]]></category>

		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://benramsey.com/?p=250</guid>
		<description><![CDATA[	I find myself once again in Portland, OR at the O&#8217;Reilly Open Source Convention. This year, I&#8217;m giving a talk on memcached. The talk is on the PHP track, but the concepts can apply in any of the other languages represented at OSCON, so if you&#8217;re interested in memcached and how to use it, stop [...]]]></description>
			<content:encoded><![CDATA[	<p>I find myself once again in Portland, OR at the <a href="http://en.oreilly.com/oscon2008/">O&#8217;Reilly Open Source Convention</a>. This year, I&#8217;m giving a talk on <a href="http://en.wikipedia.org/wiki/Memcached">memcached</a>. The talk is on the PHP track, but the concepts can apply in any of the other languages represented at OSCON, so if you&#8217;re interested in memcached and how to use it, <a href="http://en.oreilly.com/oscon2008/public/schedule/detail/2751">stop by on Wednesday at 5:20pm</a>.</p>

	<p>In previous years at OSCON, I&#8217;ve stuck mainly to the PHP track. This is because I have a lot of friends who are speakers, and so I&#8217;ve attended their talks to learn from and support them. This year, though, I&#8217;ve decided to focus on some of the other languages represented here, particularly Python and Erlang. This morning, for example, I attended Steve Holden&#8217;s <a href="http://en.oreilly.com/oscon2008/public/schedule/detail/2488">Python In 3 Hours</a> tutorial. Tomorrow, I&#8217;ll be attending the <a href="http://en.oreilly.com/oscon2008/public/schedule/detail/3373">Practical Erlang Programming</a> tutorial, and later this week, I&#8217;ll get <a href="http://en.oreilly.com/oscon2008/public/schedule/detail/3050">Just Enough C for Open Source Projects</a>.</p>

	<p>So, today, one of the more interesting features I learned that Python supports is the concept of <a href="http://en.wikipedia.org/wiki/Closure_(computer_science)">closures</a>. Here&#8217;s a simple example from the tutorial:</p>

	<p><div class="hl-surround" ><div class="hl-main"><pre><span class="hl-comment"># Closures example</span><span class="hl-code">
 
</span><span class="hl-reserved">def</span><span class="hl-code"> </span><span class="hl-identifier">adder</span><span class="hl-brackets">(</span><span class="hl-identifier">n</span><span class="hl-brackets">)</span><span class="hl-code">:
  </span><span class="hl-reserved">def</span><span class="hl-code"> </span><span class="hl-identifier">add</span><span class="hl-brackets">(</span><span class="hl-identifier">m</span><span class="hl-brackets">)</span><span class="hl-code">:
    </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-identifier">m</span><span class="hl-code">+</span><span class="hl-identifier">n</span><span class="hl-code">
  </span><span class="hl-reserved">return</span><span class="hl-code"> </span><span class="hl-identifier">add</span><span class="hl-code">
  
</span><span class="hl-identifier">add20</span><span class="hl-code"> = </span><span class="hl-identifier">adder</span><span class="hl-brackets">(</span><span class="hl-number">20</span><span class="hl-brackets">)</span><span class="hl-code">
 
</span><span class="hl-reserved">print</span><span class="hl-code"> </span><span class="hl-identifier">add20</span><span class="hl-brackets">(</span><span class="hl-number">2</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-comment"># should print 22</span><span class="hl-code">
 
</span><span class="hl-identifier">l</span><span class="hl-code"> = </span><span class="hl-brackets">[</span><span class="hl-brackets">]</span><span class="hl-code">
</span><span class="hl-reserved">for</span><span class="hl-code"> </span><span class="hl-identifier">i</span><span class="hl-code"> </span><span class="hl-reserved">in</span><span class="hl-code"> </span><span class="hl-builtin">range</span><span class="hl-brackets">(</span><span class="hl-number">100</span><span class="hl-brackets">)</span><span class="hl-code">:
  </span><span class="hl-identifier">l</span><span class="hl-code">.</span><span class="hl-identifier">append</span><span class="hl-brackets">(</span><span class="hl-identifier">adder</span><span class="hl-brackets">(</span><span class="hl-identifier">i</span><span class="hl-brackets">)</span><span class="hl-brackets">)</span><span class="hl-code">
 
</span><span class="hl-reserved">print</span><span class="hl-code"> </span><span class="hl-identifier">l</span><span class="hl-brackets">[</span><span class="hl-number">13</span><span class="hl-brackets">]</span><span class="hl-brackets">(</span><span class="hl-number">22</span><span class="hl-brackets">)</span><span class="hl-code"> </span><span class="hl-comment"># should print 35</span></pre></div></div></p>

	<p>FYI: There&#8217;s been some <a href="http://aspn.activestate.com/ASPN/Mail/Message/php-dev/3640369">discussion</a> surrounding a recent <a href="http://wiki.php.net/rfc/closures">patch proposal to add closures and lambda functions to PHP</a>.</p>

	<p>At any rate, it&#8217;s good to be back at OSCON this year, catching up with old friends, making new friends, and expanding my knowledge of open source languages.</p>

	<p>By the way, I&#8217;ve brought along with me 10 <a href="http://flickr.com/groups/elephpants/pool/">elePHPants</a> who need good homes. If you want one, it&#8217;s yours. You just have to find me in person and let me know. They&#8217;re first-come, first-serve.</p>


 <div class="feedflare">
<a href="http://feeds.feedburner.com/~f/ramsey?a=unjhIJ"><img src="http://feeds.feedburner.com/~f/ramsey?i=unjhIJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=E5EC8j"><img src="http://feeds.feedburner.com/~f/ramsey?i=E5EC8j" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=s6CFJJ"><img src="http://feeds.feedburner.com/~f/ramsey?i=s6CFJJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=vHa8lJ"><img src="http://feeds.feedburner.com/~f/ramsey?i=vHa8lJ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ramsey/~4/342015399" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://benramsey.com/archives/oscon-2008-day-one/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=ramsey&amp;itemurl=http%3A%2F%2Fbenramsey.com%2Farchives%2Foscon-2008-day-one%2F</feedburner:awareness><feedburner:origLink>http://benramsey.com/archives/oscon-2008-day-one/</feedburner:origLink></item>
		<item>
		<title>HTTP Status: Redirection</title>
		<link>http://feeds.feedburner.com/~r/ramsey/~3/341000105/</link>
		<comments>http://benramsey.com/archives/http-status-redirection/#comments</comments>
		<pubDate>Sun, 20 Jul 2008 22:58:44 +0000</pubDate>
		<dc:creator>Ben Ramsey</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[http]]></category>

		<category><![CDATA[rest]]></category>

		<category><![CDATA[rfc2616]]></category>

		<category><![CDATA[standards]]></category>

		<guid isPermaLink="false">http://benramsey.com/?p=249</guid>
		<description><![CDATA[	I&#8217;ve been rather uninspired and, therefore, uninterested in blogging lately, which is why I&#8217;ve neglected to continue my series on HTTP status codes. However, while trying to figure out a quick and easy way to delete tons of received direct messages from my Twitter account, I stumbled across one of my HTTP pet peeves coupled [...]]]></description>
			<content:encoded><![CDATA[	<p>I&#8217;ve been rather uninspired and, therefore, uninterested in blogging lately, which is why I&#8217;ve neglected to continue <a href="http://benramsey.com/archives/http-status-100-continue/">my series on HTTP status codes</a>. However, while trying to figure out a quick and easy way to delete tons of received direct messages from my <a href="http://twitter.com/">Twitter</a> account, I stumbled across one of my HTTP pet peeves coupled with the odd use of a 3xx status code, which inspired me to launch into a short rant followed by a discussion on the redirection series of status codes.</p>

	<p>First, the pet peeve: I cannot stand it when someone uses a GET request to modify information. I don&#8217;t care how secure it is because you&#8217;re checking my session and login details, sending a GET request to /direct_messages/destroy/30264861 should not do anything other that retrieve the resource located there. If using GET, the user agent thinks it&#8217;s a safe action and will not know that it should warn me that the action I&#8217;m about to take could modify information. <a href="http://shiflett.org/articles/cross-site-request-forgeries">CSRF anyone?</a></p>

	<p>Come on, people! GET is a <a href="http://tools.ietf.org/html/rfc2616#section-9.1">safe method</a>. Client-side developers (among others) would do well to learn this.</p>

	<p>Consequently, there is no resource at that location, and that also peeves me. Instead, I get a weird <code>302 Moved Temporarily</code> HTTP redirect that also includes a <code>Status: 302 Found</code> header. WTF? Come on! It&#8217;s 2008. <a href="http://tools.ietf.org/html/rfc2616">RFC 2616</a> has been out for nine years now. Is there anyone using Twitter on a user agent old enough that it only works for <a href="http://tools.ietf.org/html/rfc1945">HTTP 1.0</a>? (I&#8217;ll wager that I&#8217;ll get responses from people about how some mobile browsers only understand HTTP 1.0.)</p>

	<p>This leads me to the second thing I want to discuss: HTTP redirections.</p>

	<p>Historically (in HTTP 1.0), HTTP had two status codes for redirection: <code>301 Moved Permanently</code> and <code>302 Moved Temporarily</code>. However, 302 became misused and abused by user agents that didn&#8217;t follow the spec, which stated: &#8220;If the 302 status code is received in response to a request using the POST method, the user agent must not automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.&#8221; Instead, user agents would often simply use a GET request on the value of the Location header, redirecting the user without warning.</p>

	<p>Take a moment now to think about this. Why would the user agent send a GET request for the value of the Location header without asking the user if it&#8217;s okay? Because the user agent thinks it&#8217;s safe to do so. Remember my earlier rant?</p>

	<p>Nevertheless, the user agents weren&#8217;t supposed to be behaving this way, but developers used <code>302 Moved Temporarily</code> as the common method for redirecting after POST actions, and following the spec would make for a cumbersome user experience, especially if I had to approve every single redirect that occurs after I POST something. (This actually happens on mobile browsers quite frequently, since the mobile browser&#8212;on my phone, at least (a RAZR)&#8212;properly implements the expected behavior, thus making a crappy experience for me.)</p>

	<p>So, to rectify the situation, HTTP 1.1 introduced <code><a href="http://tools.ietf.org/html/rfc2616#section-10.3.4">303 See Other</a> </code> and then later <code><a href="http://tools.ietf.org/html/rfc2616#section-10.3.8">307 Temporary Redirect</a> </code> (changing the meaning of <a href="http://tools.ietf.org/html/rfc2616#section-10.3.3">302 to <em>Found</em></a>).</p>

	<p>The <code>303 See Other</code> status code unambiguously states that the value of the Location header &#8220;SHOULD be retrieved using a GET method&#8221; and that the &#8220;new URI is not a substitute reference for the originally requested resource.&#8221; That is, if the user agent originally used POST to send data, then the server can tell the user agent to safely redirect to another resource using GET, and the new resource should not be expected to act on the data sent in the original POST request.</p>

	<p>Likewise, the <code>307 Temporary Redirect</code> status code unambiguously states that if it is &#8220;received in response to a request other than GET or HEAD, the user agent MUST NOT automatically redirect the request unless it can be confirmed by the user, since this might change the conditions under which the request was issued.&#8221; So, if I POST a form to a server that sends back a <code>307 Temporary Redirect</code>, then the user agent should ask me whether I want to proceed. If I say &#8220;yes,&#8221; then the user agent will proceed to POST the data to the URI identified by the Location header.</p>

	<p>So, a couple rules of thumb: <code>302 Found</code> is still the de-facto redirection method, though it may not mean what you want it to mean or behave properly on all user agents. If you want to process a POST request and then safely redirect the user agent using GET, use <code>303 See Other</code>. If you want to redirect a POST request (that is, send the posted data to a different location), use <code>307 Temporary Redirect</code>. If the original request was GET or HEAD, and you simply want to redirect the user agent, then either <code>302 Found</code> or <code>307 Temporary Redirect</code> are proper, though I prefer the 307.</p>

	<p>To explicitly tell user agents (and particularly search engines and proxies) that something has moved permanently and that they should update their links, use <code><a href="http://tools.ietf.org/html/rfc2616#section-10.3.2">301 Moved Permanently</a> </code>.</p>


 <div class="feedflare">
<a href="http://feeds.feedburner.com/~f/ramsey?a=m9ZUcJ"><img src="http://feeds.feedburner.com/~f/ramsey?i=m9ZUcJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=Glc6Vj"><img src="http://feeds.feedburner.com/~f/ramsey?i=Glc6Vj" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=6TfHjJ"><img src="http://feeds.feedburner.com/~f/ramsey?i=6TfHjJ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=SIIruJ"><img src="http://feeds.feedburner.com/~f/ramsey?i=SIIruJ" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ramsey/~4/341000105" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://benramsey.com/archives/http-status-redirection/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=ramsey&amp;itemurl=http%3A%2F%2Fbenramsey.com%2Farchives%2Fhttp-status-redirection%2F</feedburner:awareness><feedburner:origLink>http://benramsey.com/archives/http-status-redirection/</feedburner:origLink></item>
		<item>
		<title>DCPHP 2008 Slides</title>
		<link>http://feeds.feedburner.com/~r/ramsey/~3/304658056/</link>
		<comments>http://benramsey.com/archives/dcphp-2008-slides/#comments</comments>
		<pubDate>Wed, 04 Jun 2008 16:32:57 +0000</pubDate>
		<dc:creator>Ben Ramsey</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[atom]]></category>

		<category><![CDATA[atompub]]></category>

		<category><![CDATA[dcphp]]></category>

		<category><![CDATA[memcache]]></category>

		<category><![CDATA[memcached]]></category>

		<category><![CDATA[php]]></category>

		<category><![CDATA[presentation]]></category>

		<category><![CDATA[rest]]></category>

		<category><![CDATA[roa]]></category>

		<category><![CDATA[talk]]></category>

		<guid isPermaLink="false">http://benramsey.com/?p=248</guid>
		<description><![CDATA[	As promised to the attendees of my talks, I have posted the slides for my presentations on SlideShare.

	Distribution and Publication With Atom Web Services

	The Web is transforming into a platform for distributed applications. Rich clients connect to web services to retrieve and store data. The Atom Publishing Protocol provides a common language for these services. [...]]]></description>
			<content:encoded><![CDATA[	<p>As promised to the attendees of my talks, I have posted the slides for my presentations on <a href="http://www.slideshare.net/benramsey/">SlideShare</a>.</p>

	<h2>Distribution and Publication With Atom Web Services</h2>

	<p>The Web is transforming into a platform for distributed applications. Rich clients connect to web services to retrieve and store data. The Atom Publishing Protocol provides a common language for these services. Ben Ramsey introduces AtomPub, explaining how it can form the foundation of any web service for publication and distribution of data for enterprises down to small businesses.</p>

	<p><div style="width:425px;text-align:left" id="__ss_446956"><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=bramseydcphpatom-1212596376790986-8"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=bramseydcphpatom-1212596376790986-8" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"><a href="http://www.slideshare.net/?src=embed"><img src="http://static.slideshare.net/swf/logo_embd.png" style="border:0px none;margin-bottom:-5px" alt="SlideShare"/></a> | <a href="http://www.slideshare.net/benramsey/distribution-and-publication-with-atom-web-services?src=embed" title="View Distribution and Publication With Atom Web Services on SlideShare">View</a> | <a href="http://benramsey.com/media/talks/bramsey-dcphp-atom.pdf" title="Download Distribution and Publication With Atom Web Services">Download</a></div></div></p>

	<h2>Give Your Site a Boost With Memcache</h2>

	<p>Today&#8217;s high-traffic websites must implement performance-boosting measures that reduce data processing and reduce load on the database, while increasing the speed of content delivery. One such method is the use of a cache to temporarily store whole pages, database recordsets, large objects, and sessions. While many caching mechanisms exist, memcached provides one of the fastest and easiest-to-use caching servers. This talk will cover memcached and the memcache extension for PHP from setting up a memcached server to using it to provide a variety of caching solutions, including the use of memcached as a session data store.</p>

	<p><div style="width:425px;text-align:left" id="__ss_446935"><object style="margin:0px" width="425" height="355"><param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=bramseydcphpmemcache-1212595631783090-9"/><param name="allowFullScreen" value="true"/><param name="allowScriptAccess" value="always"/><embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=bramseydcphpmemcache-1212595631783090-9" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"></embed></object><div style="font-size:11px;font-family:tahoma,arial;height:26px;padding-top:2px;"><a href="http://www.slideshare.net/?src=embed"><img src="http://static.slideshare.net/swf/logo_embd.png" style="border:0px none;margin-bottom:-5px" alt="SlideShare"/></a> | <a href="http://www.slideshare.net/benramsey/give-your-site-a-boost-with-memcache?src=embed" title="View Give Your Site A Boost With Memcache on SlideShare">View</a> | <a href="http://benramsey.com/media/talks/bramsey-dcphp-memcache.zip" title="Download Give Your Site A Boost With Memcache">Download</a></div></div></p>


 <div class="feedflare">
<a href="http://feeds.feedburner.com/~f/ramsey?a=JvSRLI"><img src="http://feeds.feedburner.com/~f/ramsey?i=JvSRLI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=ayv9ti"><img src="http://feeds.feedburner.com/~f/ramsey?i=ayv9ti" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=pPWZiI"><img src="http://feeds.feedburner.com/~f/ramsey?i=pPWZiI" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=qxv1II"><img src="http://feeds.feedburner.com/~f/ramsey?i=qxv1II" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ramsey/~4/304658056" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://benramsey.com/archives/dcphp-2008-slides/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=ramsey&amp;itemurl=http%3A%2F%2Fbenramsey.com%2Farchives%2Fdcphp-2008-slides%2F</feedburner:awareness><feedburner:origLink>http://benramsey.com/archives/dcphp-2008-slides/</feedburner:origLink></item>
		<item>
		<title>php|tek 2008 Wrap Up</title>
		<link>http://feeds.feedburner.com/~r/ramsey/~3/296961995/</link>
		<comments>http://benramsey.com/archives/phptek-2008-wrap-up/#comments</comments>
		<pubDate>Sat, 24 May 2008 02:08:21 +0000</pubDate>
		<dc:creator>Ben Ramsey</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[php-community]]></category>

		<category><![CDATA[phpc]]></category>

		<category><![CDATA[phpcommunity]]></category>

		<category><![CDATA[phptek]]></category>

		<category><![CDATA[tek08]]></category>

		<guid isPermaLink="false">http://benramsey.com/?p=245</guid>
		<description><![CDATA[	So, my first conference of this year&#8217;s conference &#8220;season&#8221; has come to a close, and as a wrap-up post for the conference, I&#8217;d like to do something a bit different. I&#8217;m not going to discuss the sessions I attended or talk about the keynotes. Instead, I&#8217;d like to approach this post from the community aspect.

	As [...]]]></description>
			<content:encoded><![CDATA[	<p>So, my first conference of this year&#8217;s conference &#8220;season&#8221; has come to a close, and as a wrap-up post for the conference, I&#8217;d like to do something a bit different. I&#8217;m not going to discuss the sessions I attended or talk about the keynotes. Instead, I&#8217;d like to approach this post from the <em>community</em> aspect.</p>

	<p>As a speaker at conferences, what often interests me most is in meeting with people, making new friends, and catching up with those I only get to see a few times a year (if that many) at conferences. I&#8217;m fortunate to have played a small role in helping to start and keeping alive the <a href="http://phpcommunity.org/">PHP Community</a> project through the <a href="irc://irc.freenode.net/phpc">#phpc IRC channel</a> on Freenode, and it is the members of the Community that I&#8217;m so proud to see attending conferences, taking initiative in organizing impromptu extra-curricular events at conferences, and even welcoming in new faces and new ideas. The Community ranges from end-users of PHP to core developers who take part in making decisions regarding the future of our beloved language.</p>

	<p>At this year&#8217;s <a href="http://tek.phparch.com/">php|tek</a>, I saw the Community come together in an exciting way, and, really, I think they provided a lot of the energy and enthusiasm that took us through the whole week, getting even the other attendees excited about the things going on at the conference and in the greater PHP community. From <a href="http://nexdot.net/blog/">Christian Flickinger&#8217;s</a> <a href="http://www.etsy.com/view_listing.php?listing_id=11765822">homemade buttons</a> to Damien Seguy&#8217;s new batch of <a href="http://www.nexen.net/articles/dossier/18339-elephpants,_2008_generation.php">PHP and Oracle elePHPants</a> to the #phptek channel on Freenode to <a href="http://summize.com/search?q=phptek">tons and tons of Twitter updates</a> to nightly trips to Shoeless Joe&#8217;s (and even the conference <a href="http://en.wikipedia.org/wiki/Meme">meme</a> of changing the name of the bar on each new <a href="http://en.wikipedia.org/wiki/Tweet">tweet</a>), the Community played a large part in providing the conference with a fun and exciting atmosphere, and I commend Marco, Sean, Paul, and Arbi at php|architect for allowing and even encouraging the Community to involve themselves in this way. <a href="http://www.flickr.com/photos/24223350@N03/2513237508/">You guys truly rock!</a></p>

	<p>The Community members who attend are really the unsung heroes of the conference, in my opinion. They aren&#8217;t necessarily speakers (though some are). They aren&#8217;t the PHP thought leaders (again, some are). Their companies don&#8217;t often pay their way to conferences. They make do however they can by organizing road trips, sharing rooms, etc. so that they can attend the conferences. I think this creates even more camaraderie and a closer bond between Community members. Without their presence, the conference dynamic would be terribly lacking.</p>

	<p>So, while I&#8217;m now back home with my family, who I dearly missed while away, I raise my glass to the PHP Community members and to the organizers of php|tek. You know who you are. You all made this conference truly memorable for me.</p>

	<p>Thank you, and I hope to see you again soon at another conference. <img src='http://benramsey.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>


 <div class="feedflare">
<a href="http://feeds.feedburner.com/~f/ramsey?a=EXoXtH"><img src="http://feeds.feedburner.com/~f/ramsey?i=EXoXtH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=y383eh"><img src="http://feeds.feedburner.com/~f/ramsey?i=y383eh" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=0dG3VH"><img src="http://feeds.feedburner.com/~f/ramsey?i=0dG3VH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=Xee2EH"><img src="http://feeds.feedburner.com/~f/ramsey?i=Xee2EH" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ramsey/~4/296961995" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://benramsey.com/archives/phptek-2008-wrap-up/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=ramsey&amp;itemurl=http%3A%2F%2Fbenramsey.com%2Farchives%2Fphptek-2008-wrap-up%2F</feedburner:awareness><feedburner:origLink>http://benramsey.com/archives/phptek-2008-wrap-up/</feedburner:origLink></item>
		<item>
		<title>HTTP Status: 204 No Content and 205 Reset Content</title>
		<link>http://feeds.feedburner.com/~r/ramsey/~3/285043049/</link>
		<comments>http://benramsey.com/archives/http-status-204-no-content-and-205-reset-content/#comments</comments>
		<pubDate>Wed, 07 May 2008 02:08:40 +0000</pubDate>
		<dc:creator>Ben Ramsey</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[http]]></category>

		<category><![CDATA[rest]]></category>

		<category><![CDATA[rfc2616]]></category>

		<category><![CDATA[standards]]></category>

		<guid isPermaLink="false">http://benramsey.com/?p=244</guid>
		<description><![CDATA[	The 200 range of HTTP status codes represents successful requests. I&#8217;ve already covered 201 Created and 202 Accepted and 206 Partial Content. Today, I&#8217;ll wrap up my discussion of the 200 range by talking about 204 No Content and 205 Reset Content. The 200 OK response is probably the status with which most are familiar, [...]]]></description>
			<content:encoded><![CDATA[	<p>The 200 range of HTTP status codes represents successful requests. I&#8217;ve already covered <a href="http://benramsey.com/archives/http-status-201-created-vs-202-accepted/"><code>201 Created</code> and <code>202 Accepted</code></a> and <a href="http://benramsey.com/archives/206-partial-content-and-range-requests/"><code>206 Partial Content</code></a>. Today, I&#8217;ll wrap up my discussion of the 200 range by talking about <a href="http://tools.ietf.org/html/rfc2616#section-10.2.5"><code>204 No Content</code></a> and <a href="http://tools.ietf.org/html/rfc2616#section-10.2.6"><code>205 Reset Content</code></a>. The <code>200 OK</code> response is probably the status with which most are familiar, and I&#8217;ll discuss it later when covering the HTTP verbs.</p>

	<p>The <code>204 No Content</code> response is useful in a web service when you want to return a success message but do not want to return a message in the body or do not have a body to return. In my personal experience, I use this when <code>DELETE</code> requests are sent to an Atom web service. If the resource is successfully deleted, the service returns a <code>204 No Content</code> status message. This tells the client that the deletion was successful, and that&#8217;s really all the client needs to know. There&#8217;s nothing to return because it was deleted.</p>

	<p>However, even outside of the web services realm, the <code>204 No Content</code> status actually means something to a user agent (browser). The HTTP specification (<a href="http://tools.ietf.org/html/rfc2616">RFC 2616</a>) states the following about the <code>204 No Content</code> status code:</p>

	<blockquote>
		<p>If the client is a user agent, it SHOULD NOT change its document view from that which caused the request to be sent. This response is primarily intended to allow input for actions to take place without causing a change to the user agent&#8217;s active document view, although any new or updated metainformation SHOULD be applied to the document currently in the user agent&#8217;s active view.</p>
	</blockquote>

	<p>This means that, if I have an HTML form and submit it, then, if the server returns a 204 status code, the browser should not refresh the form or take me to another page. The document view does not change, and I remain at the form. All of the data I entered remains unchanged. All browsers I tested support this, but, in practice, it is not very useful since there&#8217;s no indication to a user that anything happened on the server side. </p>

	<p>However, consider the use of <code>204 No Content</code> in an <a href="http://en.wikipedia.org/wiki/Ajax_%28programming%29">Ajax</a> application. If the Ajax library used simply looks for a success message of 204 in response to the requests it sends, then it can present a success message to the user without changing any of the UI elements, as this response intends. This is also useful because the service doesn&#8217;t need to send back any data; it needs only tell the client that the request was successful.</p>

	<p>On the other hand, with a <code>205 Reset Content</code> response, the intent is to tell the client to clear the content from the form or to refresh the UI. That is, I could fill out a form, click the submit button, and the form I am currently working on would refresh to its default values if the client receives a 205 response. According to the HTTP spec, a 205 response means:</p>

	<blockquote>
		<p>The server has fulfilled the request and the user agent SHOULD reset the document view which caused the request to be sent. This response is primarily intended to allow input for actions to take place via user input, followed by a clearing of the form in which the input is given so that the user can easily initiate another input action.</p>
	</blockquote>

	<p>The problem is that I have not found a browser yet that supports this behavior. Browsers either treat a 205 like it&#8217;s a 204, or they simply treat it as a 200. This does not mean, though, that Ajax applications cannot properly respect a 205 response. In an Ajax application, if the client receives a 205 response (instead of a 204 response), then the UI elements should change back to their default state.</p>

	<p>In <a href="http://books.google.com/books?id=_qwcAAAACAAJ"><em>RESTful Web Services</em></a>, Richardson and Ruby make this distinction between 204 and 204:</p>

	<blockquote>
		<p>In data entry terms: 204 is good for making a series of edits to a single record; 205 is good for entering a series of records in succession.</p>
	</blockquote>

	<p>In my simple browser test to see what browsers supported 204 and 205 on forms (without using any Ajax), here&#8217;s what I found:</p>

	<p><div class="hl-surround" style="height:280px;"><div class="hl-main"><pre>Firefox 2.0.0.14
  - 204 - supported
  - 205 - treated like 204

Safari 3.1.1
  - 204 - supported
  - 205 - treated like 200

Opera 9.27
  - 204 - supported
  - 205 - treated like 200

Internet Explorer 7 (7.0.5730.13)
  - 204 - supported
  - 205 - treated like 200

Internet Explorer 8 beta 1 (8.0.6001.17184)
  - 204 - supported
  - 205 - treated like 200

Firefox 3 beta 5
  - 204 - supported
  - 205 - treated like 204</pre></div></div></p>

	<p>Since I know I&#8217;ll be asked this question, to send back a 204 or 205 response with PHP, see the PHP manual on the use of the <a href="http://php.net/header"><code>header()</code> function</a>. <img src='http://benramsey.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>


 <div class="feedflare">
<a href="http://feeds.feedburner.com/~f/ramsey?a=JfYXAH"><img src="http://feeds.feedburner.com/~f/ramsey?i=JfYXAH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=kDL9ph"><img src="http://feeds.feedburner.com/~f/ramsey?i=kDL9ph" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=wlgK9H"><img src="http://feeds.feedburner.com/~f/ramsey?i=wlgK9H" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=GGo3iH"><img src="http://feeds.feedburner.com/~f/ramsey?i=GGo3iH" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ramsey/~4/285043049" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://benramsey.com/archives/http-status-204-no-content-and-205-reset-content/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=ramsey&amp;itemurl=http%3A%2F%2Fbenramsey.com%2Farchives%2Fhttp-status-204-no-content-and-205-reset-content%2F</feedburner:awareness><feedburner:origLink>http://benramsey.com/archives/http-status-204-no-content-and-205-reset-content/</feedburner:origLink></item>
		<item>
		<title>HTTP Status: 206 Partial Content and Range Requests</title>
		<link>http://feeds.feedburner.com/~r/ramsey/~3/283630345/</link>
		<comments>http://benramsey.com/archives/206-partial-content-and-range-requests/#comments</comments>
		<pubDate>Mon, 05 May 2008 02:17:34 +0000</pubDate>
		<dc:creator>Ben Ramsey</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[http]]></category>

		<category><![CDATA[rest]]></category>

		<category><![CDATA[rfc2616]]></category>

		<category><![CDATA[standards]]></category>

		<guid isPermaLink="false">http://benramsey.com/?p=243</guid>
		<description><![CDATA[	Akki commented on my 100 Continue post, asking:

	
		I was wondering if there was a response status to allow a large file to be &#8220;served&#8221; in parts and in just one response?
	

	While I&#8217;ve never done this myself, I did some research to see how it might be done, and I&#8217;ve come up with a solution that [...]]]></description>
			<content:encoded><![CDATA[	<p><a href="http://benramsey.com/archives/http-status-100-continue/#comment-172476">Akki commented</a> on my <a href="http://benramsey.com/archives/http-status-100-continue/">100 Continue post</a>, asking:</p>

	<blockquote>
		<p>I was wondering if there was a response status to allow a large file to be &#8220;served&#8221; in parts and in just one response?</p>
	</blockquote>

	<p>While I&#8217;ve never done this myself, I did some research to see how it might be done, and I&#8217;ve come up with a solution that I wish I could call clever, innovative, and many other words that make me sound like I came up with a smart solution, but the reality of it is that HTTP was made to support this behavior, so I&#8217;ll just tell you how to do it with standard HTTP.</p>

	<p>First of all, let&#8217;s create a scenario. Say I want to request a very large file from a service, but before I do so, I want to find out exactly how large it is and whether the service supports &#8220;range requests.&#8221; To do this, I make a <code><a href="http://tools.ietf.org/html/rfc2616#section-9.4">HEAD</a> </code> request to the large resource I want to retrieve. The <code>HEAD</code> method is a standard HTTP method that acts as if I&#8217;ve made a <code>GET</code> request, but it returns only the headers and not the body. This allows me to find out some information about the resource without actually taking the time or using the bandwidth to download it. For example, I can read the Content-Length header and determine the size of the resource.</p>

	<p>Another header of great importance is the <a href="http://tools.ietf.org/html/rfc2616#section-14.5">Accept-Ranges</a> header. If it&#8217;s present, it may contain a value of &#8220;bytes.&#8221; If so, I know that I can make a <code>GET</code> request and request a byte range to retrieve only those bytes. This is the first important key component:</p>

	<p><strong>If you are building a service that accepts byte range requests, let clients know by providing the Accept-Ranges header in response to <code>GET</code> and <code>HEAD</code> requests.</strong></p>

	<p>So, now, I know I can make a range request to the service, which I do by sending a standard <code>GET</code> request including a <a href="http://tools.ietf.org/html/rfc2616#section-14.35.2">Range</a> header that specifies the range of bytes I&#8217;m requesting, like so: <code>Range: bytes=0-999</code>. The service should then respond with with a <code><a href="http://tools.ietf.org/html/rfc2616#section-10.2.7">206 Partial Content</a> </code> status code, a <a href="http://tools.ietf.org/html/rfc2616#section-14.16">Content-Range</a> header, and the requested range of bytes. This is the second key component:</p>

	<p><strong>If a client makes a request of your service with a Range header, return a <code>206 Partial Content</code> response containing a Content-Range header and the requested range of bytes for the resource in the body. The Content-Length value should be the length of what is actually returned and not the full length of the resource.</strong></p>

	<p>From then on, it&#8217;s a matter of the client continuing to make requests until it has retrieved all of the bytes it wishes to get from the resource. If the client makes a range request that is out of bounds&#8212;that is, none of the range values overlap the extent of the resource&#8212;the service should respond with a <code><a href="http://tools.ietf.org/html/rfc2616#section-10.4.17">416 Requested Range Not Satisfiable</a> </code> status.</p>

	<p>I should note that the service cannot force the client to make a range request. It is entirely up to the client to make such requests, so the service should honor all standard <code>GET</code> requests that do not contain a Range header by sending back the full representation of the requested resource. If your service allows range requests, it is to your benefit to tell the client with an Accept-Ranges header. If you want to explicitly tell the client that you do not allow range requests, send a value of &#8220;none&#8221; back with the Accept-Ranges header.</p>

	<p>Since I learn best by looking at real-life examples, I&#8217;ll provide one for you. Here&#8217;s a real example making range requests with Flickr. I&#8217;ve removed some of the headers for simplicity and clarity.</p>

	<p><div class="hl-surround" style="height:280px;"><div class="hl-main"><pre>HEAD /2390/2253727548_a413c88ab3_s.jpg HTTP/1.1
Host: farm3.static.flickr.com

HTTP/1.0 200 OK
Date: Mon, 05 May 2008 00:33:14 GMT
Server: Apache/2.0.52 (Red Hat)
Accept-Ranges: bytes
Content-Length: 3980
Content-Type: image/jpeg

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GET /2390/2253727548_a413c88ab3_s.jpg HTTP/1.1
Host: farm3.static.flickr.com
Range: bytes=0-999

HTTP/1.0 206 Partial Content
Date: Mon, 05 May 2008 00:36:57 GMT
Server: Apache/2.0.52 (Red Hat)
Accept-Ranges: bytes
Content-Length: 1000
Content-Range: bytes 0-999/3980
Content-Type: image/jpeg

{binary data}

~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~

GET /2390/2253727548_a413c88ab3_s.jpg HTTP/1.1
Host: farm3.static.flickr.com
Range: bytes=1000-

HTTP/1.0 206 Partial Content
Date: Mon, 05 May 2008 00:37:54 GMT
Server: Apache/2.0.52 (Red Hat)
Accept-Ranges: bytes
Content-Length: 2980
Content-Range: bytes 1000-3979/3980
Content-Type: image/jpeg

{binary data}</pre></div></div></p>


 <div class="feedflare">
<a href="http://feeds.feedburner.com/~f/ramsey?a=gzl1JH"><img src="http://feeds.feedburner.com/~f/ramsey?i=gzl1JH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=L9kl3h"><img src="http://feeds.feedburner.com/~f/ramsey?i=L9kl3h" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=ZhnnJH"><img src="http://feeds.feedburner.com/~f/ramsey?i=ZhnnJH" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=24d9wH"><img src="http://feeds.feedburner.com/~f/ramsey?i=24d9wH" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ramsey/~4/283630345" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://benramsey.com/archives/206-partial-content-and-range-requests/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=ramsey&amp;itemurl=http%3A%2F%2Fbenramsey.com%2Farchives%2F206-partial-content-and-range-requests%2F</feedburner:awareness><feedburner:origLink>http://benramsey.com/archives/206-partial-content-and-range-requests/</feedburner:origLink></item>
		<item>
		<title>Umbrello UML Modeler</title>
		<link>http://feeds.feedburner.com/~r/ramsey/~3/278384213/</link>
		<comments>http://benramsey.com/archives/umbrello-uml-modeler/#comments</comments>
		<pubDate>Sat, 26 Apr 2008 17:56:59 +0000</pubDate>
		<dc:creator>Ben Ramsey</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[howto]]></category>

		<category><![CDATA[software]]></category>

		<category><![CDATA[uml]]></category>

		<guid isPermaLink="false">http://benramsey.com/archives/umbrello-uml-modeler/</guid>
		<description><![CDATA[	Special thanks to all the twitterites who recommended UML modeling tools. Umbrello UML Modeler appears to be the one I was looking for. Here are a couple of quick notes about what I had to do to get it running on my Mac, mainly for my own future reference, but I hope these also help [...]]]></description>
			<content:encoded><![CDATA[	<p>Special thanks to all the <a href="http://twitter.com/">twitterites</a> who recommended UML modeling tools. <a href="http://uml.sourceforge.net/">Umbrello UML Modeler</a> appears to be the one I was looking for. Here are a couple of quick notes about what I had to do to get it running on my Mac, mainly for my own future reference, but I hope these also help someone else.</p>

	<ol>
		<li>First, make sure you have the <a href="http://developer.apple.com/mac/">Apple Xcode</a> tools installed, along with X11.app.<br />
<br />
</li>
		<li>Since Umbrello requires KDE, you&#8217;ll have to install KDE. You can follow these instructions to <a href="http://techbase.kde.org/index.php?title=Projects/KDE_on_Mac_OS_X/KDE_3">install KDE with either Fink or MacPorts</a>. I chose to go with <a href="http://www.macports.org/">MacPorts</a>, and the command is simple:<br />
<br />
<code>$ sudo port install kde</code><br />
<br />
The KDE installation can take quite a while, depending on your system. On my PowerBook G4, it took well over 7 hours. My Intel iMac was considerably shorter, but still took a couple of hours.<br />
<br />
</li>
	</ol>
	<ol>
		<li>Once KDE is installed, you should have all the necessary libraries to build Umbrello. <a href="http://uml.sourceforge.net/download.php">Download the Umbrello source</a> and get to work:

	<p><div class="hl-surround" ><div class="hl-main"><pre>$ wget http://prdownloads.sourceforge.net/uml/umbrello-1.5.8.tar.bz2?download
$ tar jxf umbrello-1.5.8.tar.bz2
$ cd umbrello-1.5.8
$ ./configure --prefix=/opt/local --with-qt-includes=/opt/local/include/qt3/ \
&gt; --with-qt-libraries=/opt/local/lib/qt3/ --with-extra-libs=/opt/local/lib \
&gt; --with-extra-includes=/opt/local/include --without-arts
$ make
$ sudo make install</pre></div></div></p>

	<p>Umbrello is now ready to run. To run it, just open X11.app and enter the command:</p>

<code>/opt/local/bin/umbrello</code>

	<p>That&#8217;s all there is to it!</p>

	<p>Umbrello seems to be just the tool I needed. It appears to be a much more intuitive and easier-to-use UML modeling program than any others I have tried, and it will generate PHP 5 code. It doesn&#8217;t generate everything quite as well as I had hoped, but it gets the class stubs in place, and I can go back in and correct things for my coding standards and update the comment blocks as needed.</p>

	<p>Also, another observation: applications built using the KDE libraries (i.e. Umbrello) do not appear to run as <em>clunky</em> on the Mac through X11 as those using GTK. They actually run quite smoothly.</p>


 <div class="feedflare">
<a href="http://feeds.feedburner.com/~f/ramsey?a=d9DzsoG"><img src="http://feeds.feedburner.com/~f/ramsey?i=d9DzsoG" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=PBAX6Ig"><img src="http://feeds.feedburner.com/~f/ramsey?i=PBAX6Ig" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=Sbl9B9G"><img src="http://feeds.feedburner.com/~f/ramsey?i=Sbl9B9G" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=1hRUqBG"><img src="http://feeds.feedburner.com/~f/ramsey?i=1hRUqBG" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ramsey/~4/278384213" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://benramsey.com/archives/umbrello-uml-modeler/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=ramsey&amp;itemurl=http%3A%2F%2Fbenramsey.com%2Farchives%2Fumbrello-uml-modeler%2F</feedburner:awareness><feedburner:origLink>http://benramsey.com/archives/umbrello-uml-modeler/</feedburner:origLink></item>
		<item>
		<title>HTTP Status: 201 Created vs. 202 Accepted</title>
		<link>http://feeds.feedburner.com/~r/ramsey/~3/277788094/</link>
		<comments>http://benramsey.com/archives/http-status-201-created-vs-202-accepted/#comments</comments>
		<pubDate>Fri, 25 Apr 2008 18:48:55 +0000</pubDate>
		<dc:creator>Ben Ramsey</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[http]]></category>

		<category><![CDATA[rest]]></category>

		<category><![CDATA[rfc2616]]></category>

		<category><![CDATA[standards]]></category>

		<guid isPermaLink="false">http://benramsey.com/archives/http-status-201-created-vs-202-accepted/</guid>
		<description><![CDATA[	Continuing my series on HTTP status codes, I&#8217;d like to talk today about the use of the 201 Created  and 202 Accepted  codes.

	I should make a point of clarification first, though. When I&#8217;m discussing the use of status codes, I have in mind Web services applications with perhaps rich clients that interface with [...]]]></description>
			<content:encoded><![CDATA[	<p>Continuing my <a href="http://benramsey.com/archives/http-status-100-continue/">series on HTTP status codes</a>, I&#8217;d like to talk today about the use of the <code><a href="http://tools.ietf.org/html/rfc2616#section-10.2.2">201 Created</a> </code> and <code><a href="http://tools.ietf.org/html/rfc2616#section-10.2.3">202 Accepted</a> </code> codes.</p>

	<p>I should make a point of clarification first, though. When I&#8217;m discussing the use of status codes, I have in mind Web services applications with perhaps rich clients that interface with them and not necessarily standard, browser-based Web apps. Browsers should be able to handle these status codes, but they are not necessarily the richest clients to use as an interface to your Web service, so they may not be able to handle the responses as intended.</p>

	<p>Moving along&#8230;</p>

	<p>Recently, while designing an application that uses the <a href="http://tools.ietf.org/html/rfc5023">Atom Publishing Protocol</a>, I found myself using the <code>201 Created</code> status code as a response to successful <code>POST</code> requests for creation of new content in the service. In the body of the response, I would return a full representation of the newly created resource, and I would include a Location header with a URI that points to the location of the newly created resource. (Instead of returning a full representation of the created resource, you may return a list of URIs pointing to locations for the resource(s) created.)</p>

	<p>In general, this is a good practice, though most of us find ourselves returning the standard <code>200 OK</code> code. (Using <code>200 OK</code> is still acceptable, though I&#8217;ll have more to say on that in a future post.) However, I ran into a problem when I realized that the resource itself does not yet exist, nor might it ever exist; it all depends on our business rules, which require various processes to occur before we &#8220;publish&#8221; the content. So, the <code>201 Created</code> response is misleading to the client because nothing has been created yet, and the representation of the resource is inaccurate since the resource does not yet exist. The resource is really in a pending state.</p>

	<p>Enter the <code>202 Accepted</code> status code.</p>

	<p>I decided to use the <code>202 Accepted</code> status code as the more proper response to these types of requests. <code>202 Accepted</code> means that the service successfully accepted the request and there are, as of yet, no problems with it (i.e. no immediate data validation problems), but it can&#8217;t create the resource until it does further processing. This response does not promise that the resource will be created, though. So, it&#8217;s perfect for pending requests, since a pending request could be rejected while it&#8217;s being processed.</p>

	<p>The HTTP spec says that a <code>202 Accepted</code> response SHOULD include an indication of the request&#8217;s current status. To this end, for our service, I have it return an Atom Entry Document with content that describes what&#8217;s going on, i.e. the request succeeded but requires further processing before it can be published. It may also be beneficial to clients to include a Location header with a URI that can be used later to check on the status of the request. </p>

	<p>When the client checks the status URI later, if the item is still pending then the status URI might return a <code>200 OK</code> response with an entity body describing this. If the resource has been created, then perhaps the status URI would return a <code>201 Created</code> response with a Location header pointing to the location of the new resource. If the item was not created for some reason, then perhaps the status URI would return a <code>410 Gone</code> response. In this case, you should include an entity body explaining why the resource is gone, i.e. &#8220;We were unable to create this resource due to processing errors.&#8221; A <code>404 Not Found</code> response would also be acceptable, but the <code>410 Gone</code> response implies permanence; the requested resource is gone for good. </p>

	<p>The status URI described here is a temporary URI used only for checking on the status of the request. It would eventually be unavailable after the resource has been created or rejected, but the time frame for this is up to you.</p>


 <div class="feedflare">
<a href="http://feeds.feedburner.com/~f/ramsey?a=HNTnaKG"><img src="http://feeds.feedburner.com/~f/ramsey?i=HNTnaKG" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=Yxl8zFg"><img src="http://feeds.feedburner.com/~f/ramsey?i=Yxl8zFg" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=kA2AFRG"><img src="http://feeds.feedburner.com/~f/ramsey?i=kA2AFRG" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=y0goLBG"><img src="http://feeds.feedburner.com/~f/ramsey?i=y0goLBG" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ramsey/~4/277788094" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://benramsey.com/archives/http-status-201-created-vs-202-accepted/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=ramsey&amp;itemurl=http%3A%2F%2Fbenramsey.com%2Farchives%2Fhttp-status-201-created-vs-202-accepted%2F</feedburner:awareness><feedburner:origLink>http://benramsey.com/archives/http-status-201-created-vs-202-accepted/</feedburner:origLink></item>
		<item>
		<title>HTTP Status: 100 Continue</title>
		<link>http://feeds.feedburner.com/~r/ramsey/~3/275647430/</link>
		<comments>http://benramsey.com/archives/http-status-100-continue/#comments</comments>
		<pubDate>Tue, 22 Apr 2008 20:26:57 +0000</pubDate>
		<dc:creator>Ben Ramsey</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[http]]></category>

		<category><![CDATA[rest]]></category>

		<category><![CDATA[rfc2616]]></category>

		<category><![CDATA[standards]]></category>

		<guid isPermaLink="false">http://benramsey.com/archives/http-status-100-continue/</guid>
		<description><![CDATA[	As a self-described HTTP status code pedant and an architect of RESTful Web services, I&#8217;ve spent a great deal of time researching and thinking about the proper use of HTTP status codes in Web applications. It occurs to me that many people use status codes in their applications in ways that I find improper, so [...]]]></description>
			<content:encoded><![CDATA[	<p>As a self-described HTTP status code <a href="http://dictionary.reference.com/browse/pedant">pedant</a> and an architect of <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer">RESTful</a> Web services, I&#8217;ve spent a great deal of time researching and thinking about the proper use of HTTP status codes in Web applications. It occurs to me that many people use status codes in their applications in <a href="http://benramsey.com/archives/http-response-code-musings/">ways that I find improper</a>, so I&#8217;ve decided to start up a series of blog posts to talk about select status codes and how they might appropriately fit within your Web applications, specifically in a RESTful manner. Consider these &#8220;Ben&#8217;s HTTP Status Codes Best Practices.&#8221;</p>

	<p>I won&#8217;t be covering these status codes in any particular order. However, the first code up is <code><a href="http://tools.ietf.org/html/rfc2616#section-10.1.1">100 Continue</a> </code> merely because I&#8217;ve been thinking about it lately.</p>

	<p>The <code>100 Continue</code> status code is an informational response that tells the client application it can continue sending the request. In short, the client can make an abbreviated request of the service to check whether or not it should continue making the full request. The service can then respond either &#8220;yes&#8221; (<code>100 Continue</code>) or &#8220;no&#8221; (<code>417 Expectation Failed</code>) with an explanation of why not. In <a href="http://books.google.com/books?id=_qwcAAAACAAJ"><em>RESTful Web Services</em></a>, Richardson and Ruby refer to this as a &#8220;look-before-you-leap&#8221; (LBYL) request.</p>

	<p>This is helpful in situations where the client might want to post or put a very large file to the service but wants to ensure that the service will accept it before actually sending the file. Consider the following request:</p>

	<p><div class="hl-surround" ><div class="hl-main"><pre>POST /content/videos HTTP/1.1
Host: media.example.org
Content-Type: video/mp4
Content-Length: 105910000
Authorization: Basic bWFkZTp5b3VfbG9vaw==
Expect: 100-continue</pre></div></div></p>

	<p>In this case, the client is attempting to post an MPEG-4 video that is 101MB. The client sends this request to your service without the video in the body, and it includes the <code>Expect: 100-continue</code> header. Let&#8217;s say your service limits uploads to 100MB. In that case, you would return a <code>417 Expectation Failed</code> including a reason for the failure in the body of the response.</p>

	<p>By now, you can probably see how this can be extended to apply to any of the other headers. For example, a client can try a <code>POST</code> or a <code>PUT</code> request first just to see if its authorization succeeds. If it does, your service would return 100, letting the client know it may proceed with the request. Likewise, the client might want to determine whether the service will accept a <code>video/mp4</code> file before sending it. The list goes on.</p>

	<p>It should be noted that the service shouldn&#8217;t require the client to use a LBYL request, but it can be helpful to a client so that it doesn&#8217;t attempt to send something that would fail at the service anyway.</p>

	<p>I&#8217;m considering implementing these kinds of responses in a service I&#8217;m building, so I&#8217;ll let you know how it goes. <img src='http://benramsey.com/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>


 <div class="feedflare">
<a href="http://feeds.feedburner.com/~f/ramsey?a=QoSXcUG"><img src="http://feeds.feedburner.com/~f/ramsey?i=QoSXcUG" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=INO0eog"><img src="http://feeds.feedburner.com/~f/ramsey?i=INO0eog" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=y5mFphG"><img src="http://feeds.feedburner.com/~f/ramsey?i=y5mFphG" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/ramsey?a=NFNymWG"><img src="http://feeds.feedburner.com/~f/ramsey?i=NFNymWG" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/ramsey/~4/275647430" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://benramsey.com/archives/http-status-100-continue/feed/</wfw:commentRss>
		<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetItemData?uri=ramsey&amp;itemurl=http%3A%2F%2Fbenramsey.com%2Farchives%2Fhttp-status-100-continue%2F</feedburner:awareness><feedburner:origLink>http://benramsey.com/archives/http-status-100-continue/</feedburner:origLink></item>
	<feedburner:awareness>http://api.feedburner.com/awareness/1.0/GetFeedData?uri=ramsey</feedburner:awareness></channel>
</rss>
