<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">

  <title><![CDATA[Ben Ramsey]]></title>
  
  <link href="http://benramsey.com/" />
  <updated>2013-04-23T13:22:32-05:00</updated>
  <id>http://benramsey.com/</id>
  <author>
    <name><![CDATA[Ben Ramsey]]></name>
    
  </author>
  <generator uri="http://octopress.org/">Octopress</generator>

  
  <feedburner:info uri="ramsey" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nd/2.0/" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://benramsey.com/feed/" /><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.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><entry>
    <title type="html"><![CDATA[Introducing array_column() in PHP 5.5]]></title>
    <link href="http://benramsey.com/blog/2013/03/introducing-array-column-in-php-5-dot-5/" />
    <updated>2013-03-20T16:48:00-05:00</updated>
    <id>http://benramsey.com/blog/2013/03/introducing-array-column-in-php-5-dot-5</id>
    <content type="html">&lt;p&gt;Earlier today, &lt;a href="http://blog.experimentalworks.net/"&gt;David Soria Parra&lt;/a&gt; declared a &lt;a href="https://twitter.com/dsp_/status/314021877565755393"&gt;feature freeze on PHP 5.5&lt;/a&gt; and &lt;a href="https://github.com/php/php-src/tree/php-5.5.0beta1"&gt;tagged php-5.5.0beta1&lt;/a&gt;, but not before merging in &lt;a href="https://github.com/php/php-src/pull/257"&gt;pull request #257&lt;/a&gt;, which includes my humble addition to the PHP programming language: &lt;code&gt;array_column()&lt;/code&gt;.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;The story of &lt;code&gt;array_column()&lt;/code&gt; begins at PHP Tek in 2008. As I recall, it was &lt;a href="https://twitter.com/spooons"&gt;Spooons&lt;/a&gt; who suggested it to me. It is functionality that nearly every developer has to implement in user-land code at some point in their careers, so I felt it only natural that it be built into the language, so I did just that.&lt;/p&gt;

&lt;p&gt;My original patch for &lt;code&gt;array_column()&lt;/code&gt; was written for PHP 5.2, but it sat around collecting dust for many years, until April of last year, when &lt;a href="http://www.php.net/archive/2012.php#id2012-03-20-1"&gt;PHP moved to git and GitHub&lt;/a&gt;. That&amp;#8217;s when it became easy enough to apply the patch and send a pull request, which I did. It wasn&amp;#8217;t quite that simple, though, since I had to follow the &lt;a href="https://blogs.oracle.com/opal/entry/the_mysterious_php_rfc_process"&gt;official PHP project RFC process&lt;/a&gt;, but it wasn&amp;#8217;t a pain either.&lt;/p&gt;

&lt;p&gt;My goal for &lt;code&gt;array_column()&lt;/code&gt; was simplicity. Many implement the functionality in different ways, and many call the function by other names (such as &amp;#8220;pluck&amp;#8221;), but I wanted to keep it simple and recognizable. It follows this function signature:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;array array_column(array $input, mixed $columnKey[, mixed $indexKey])&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Given a multi-dimensional array of data, &lt;code&gt;array_column()&lt;/code&gt; returns the values from a single column of the input array, identified by the &lt;code&gt;$columnKey&lt;/code&gt;. Optionally, you may provide an &lt;code&gt;$indexKey&lt;/code&gt; to index the values in the returned array by the values from the &lt;code&gt;$indexKey&lt;/code&gt; column in the input array.&lt;/p&gt;

&lt;p&gt;For example, using the following array of data, we tell &lt;code&gt;array_column()&lt;/code&gt; to return an array of just the last names, indexed by their record IDs.&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='line'&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$records&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2135&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="s1"&gt;&amp;#39;first_name&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;John&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="s1"&gt;&amp;#39;last_name&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Doe&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;3245&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="s1"&gt;&amp;#39;first_name&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Sally&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="s1"&gt;&amp;#39;last_name&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Smith&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5342&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="s1"&gt;&amp;#39;first_name&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Jane&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="s1"&gt;&amp;#39;last_name&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Jones&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;),&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="k"&gt;array&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;5623&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="s1"&gt;&amp;#39;first_name&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Peter&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;        &lt;span class="s1"&gt;&amp;#39;last_name&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;Doe&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;    &lt;span class="p"&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nv"&gt;$lastNames&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;array_column&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nv"&gt;$records&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;last_name&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;id&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;If we call &lt;code&gt;print_r()&lt;/code&gt; on &lt;code&gt;$lastNames&lt;/code&gt;, you&amp;#8217;ll see a resulting array that looks a bit like this:&lt;/p&gt;

&lt;figure class='code'&gt;&lt;figcaption&gt;&lt;span&gt;&lt;/span&gt;&lt;/figcaption&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='text'&gt;&lt;span class='line'&gt;Array
&lt;/span&gt;&lt;span class='line'&gt;(
&lt;/span&gt;&lt;span class='line'&gt;    [2135] =&amp;gt; Doe
&lt;/span&gt;&lt;span class='line'&gt;    [3245] =&amp;gt; Smith
&lt;/span&gt;&lt;span class='line'&gt;    [5342] =&amp;gt; Jones
&lt;/span&gt;&lt;span class='line'&gt;    [5623] =&amp;gt; Doe
&lt;/span&gt;&lt;span class='line'&gt;)
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;And that&amp;#8217;s all there is to it. I hope you find my little addition to the PHP language helpful. I had a lot of fun writing it, and following the PHP RFC process was a great learning experience.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/Qs90_FEuV8Y" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Ideas of March]]></title>
    <link href="http://benramsey.com/blog/2013/03/ideas-of-march/" />
    <updated>2013-03-16T13:58:00-05:00</updated>
    <id>http://benramsey.com/blog/2013/03/ideas-of-march</id>
    <content type="html">&lt;p&gt;Twitter pretty much killed blogging for me. When I signed up for the service six years ago, I was blogging quite a bit, but Twitter&amp;#8217;s rapid-fire, ultra-short status updates have given me a 140-character attention span. Not only did I stop blogging, but I stopped reading blogs, too. Reading and writing became a chore. While I could fire off a message on Twitter within minutes or seconds of crafting it, blogging was an endeavor that took much longer—hours or even days, at times.&lt;/p&gt;

&lt;!-- more --&gt;


&lt;p&gt;You see, the thing is: I care about the words I write. Probably too much. But with Twitter, I stopped caring. Its ephemeral nature means I don&amp;#8217;t have to care. &lt;a href="http://blog.twitter.com/2013/02/now-showing-older-tweets-in-search.html"&gt;Until recently&lt;/a&gt;, even searching for posts on Twitter only went back so far. When I blog, I have to read and re-read the words I have written, over and over. This doesn&amp;#8217;t stop after I finally decide to publish a post. Instead, I continue to pore over my post, reading it in its published form and eagerly awaiting potential comments. I&amp;#8217;m doing it even as I write this. It can be stressful.&lt;/p&gt;

&lt;p&gt;When Google announced this week their &lt;a href="http://googleblog.blogspot.com/2013/03/a-second-spring-of-cleaning.html"&gt;decision to shut down Google Reader&lt;/a&gt;, it stirred up unresolved emotions in me. I know that sounds silly, but while I haven&amp;#8217;t been reading or writing blog posts very much over the last six years, the concept of the blog still holds a dear place in my heart. Blogs are important communication and knowledge-sharing tools. They have revolutionized the way we spread information (or mis-information). I believe they are still important and have a continuing part to play in how we communicate with each other. Without the concept of the blog, it would have been impossible for many of the folks we consider leaders in our various technology communities to have had a platform to share their voices and ideas.&lt;/p&gt;

&lt;p&gt;Earlier this year, I made a resolution to myself to begin reading blogs again. I returned to the Google Reader account I had set up long ago and connected it to NetNewsWire on my desktop and phone. I have been pretty good about reading things, and I have tried to treat it a bit like I treat Twitter; if I get behind on reading, I just &amp;#8220;mark as read&amp;#8221; and continue on, without stressing over it. Some of the things I&amp;#8217;m reading have been inspiring me to write again, and I felt it was only a matter of time before this incessant writer&amp;#8217;s block was broken and the words began flowing freely again. I believe that time is now.&lt;/p&gt;

&lt;p&gt;This isn&amp;#8217;t a post to discuss the ramifications of Google&amp;#8217;s decision to pull the plug on Google Reader. Nor do I want to consider whether blogs are dying. Those are thoughts better left to other bloggers. What I do want you to think about, however, is how blogging has affected you, whether through your own blog or the blogs of others. Has it helped you be more successful? The answer for me is &amp;#8220;yes,&amp;#8221; and for this reason, I resolve to read even more, be liberal with my comments on others&amp;#8217; blogs, and write without fear.&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Thanks goes to &lt;a href="http://shiflett.org/"&gt;Chris Shiflett&lt;/a&gt; for inspiring this post. Be sure to take time and read his original &lt;a href="http://shiflett.org/blog/2011/mar/ideas-of-march"&gt;Ideas of March post from 2011&lt;/a&gt;, as well as his &lt;a href="http://shiflett.org/blog/2013/mar/ideas-of-march"&gt;most recent one&lt;/a&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/wRyjBnxpl-8" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Writing an Effective Talk Proposal]]></title>
    <link href="http://benramsey.com/blog/2012/11/writing-an-effective-talk-proposal/" />
    <updated>2012-11-30T15:16:00-06:00</updated>
    <id>http://benramsey.com/blog/2012/11/writing-an-effective-talk-proposal</id>
    <content type="html">&lt;p&gt;Earlier today, I was asked &amp;#8220;Any tips on how to write a proposal for a major conf?&amp;#8221; I&amp;#8217;ve never shared tips on this, and since the calls for proposals for &lt;a href="http://sunshinephp.com/"&gt;Sunshine PHP&lt;/a&gt; and &lt;a href="http://www.midwestphp.com/"&gt;Midwest PHP&lt;/a&gt; both end tomorrow, I thought it would be a good idea to share my approach to writing conference proposals.&lt;/p&gt;

&lt;!--more--&gt;


&lt;p&gt;Remember those &lt;a href="http://en.wikipedia.org/wiki/Five_paragraph_essay"&gt;standard, five-paragraph essays&lt;/a&gt; you used to write in high school? Remember how you thought they sucked and wouldn&amp;#8217;t provide any practical benefit to your life? Well, it turns out they do have some redeeming qualities.&lt;/p&gt;

&lt;p&gt;In case you&amp;#8217;ve forgotten, a standard, five-paragraph essay comprises three main parts:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;The first paragraph is the introduction, where you introduce your topic and state the thesis or central argument.&lt;/li&gt;
&lt;li&gt;The next three paragraphs provide support and development of the argument.&lt;/li&gt;
&lt;li&gt;The final paragraph concludes the argument by summarizing the points and linking the individual points to the overall thesis.&lt;/li&gt;
&lt;/ol&gt;


&lt;p&gt;When I write talk proposals, I typically follow the pattern of the introductory paragraph of this essay structure. Usually, the introduction begins with a &lt;a href="http://en.wikipedia.org/wiki/Narrative_hook"&gt;narrative hook&lt;/a&gt;, something to grab the reader&amp;#8217;s attention. This is usually a single, punchy sentence. Sometimes it&amp;#8217;s a shocking but true statement. On the other hand, it may be hyperbolic. This is often the most difficult part of the proposal to write, but it&amp;#8217;s also the most important, so you may want to write the rest of the proposal first and come back to this.&lt;/p&gt;

&lt;p&gt;Following the hook, you need to introduce the topic and identify the problem you want to discuss. This usually involves several sentences, starting out broadly and narrowing the focus. Finally, end the proposal by making a claim or expressing an opinion that will form the basis of your talk. This is your thesis. You may also include an organizational sentence linked to this thesis, which provides a general outline of your topic.&lt;/p&gt;

&lt;p&gt;Here&amp;#8217;s a contrived example I&amp;#8217;ve written that uses this structure with the ubiquitous concept of widgets:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;Last year alone, over 498,000 servers were deployed with broken widgets. Widgets, long a staple of secure server deployments for the past decade, have recently come under fire for not being as secure as once thought. Running secure servers is crucial, so finding a better alternative for these faulty widgets is critical. Gadgets provide a stable, more secure alternative to widgets, and in this talk, Ben Ramsey introduces gadgets, shows where to find trustworthy gadget repositories, and explains how to set up and maintain server gadgets.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;A final word of advice: don&amp;#8217;t talk down to your audience. Steer clear of negative language. Statements that demean or vilify members of the audience or products/practices they use are not well-received and can hurt your chances of being accepted. I also like to stay away from absolutes or groupings that I can&amp;#8217;t back up with real data. After writing my proposals, if I have phrases that begin with &amp;#8220;most people&amp;#8221; or similar inclusive statements, I try to reword them.&lt;/p&gt;

&lt;p&gt;So, that&amp;#8217;s my general approach to writing talk proposals for conferences. I hope this helps, but keep in mind that this isn&amp;#8217;t the only way to write an effective talk proposal. It&amp;#8217;s just one way. What are some of your tips for writing effective talk proposals?&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/pboaqlHsFx8" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[The Era of PHP Testing]]></title>
    <link href="http://benramsey.com/blog/2012/11/the-era-of-php-testing/" />
    <updated>2012-11-21T13:29:00-06:00</updated>
    <id>http://benramsey.com/blog/2012/11/the-era-of-php-testing</id>
    <content type="html">&lt;p&gt;Over the past decade, the PHP community has progressed through a handful of distinct &lt;em&gt;eras&lt;/em&gt; that have each been marked by a focus on specific best practices. This is most evident in the types of talks presented at conferences and user groups and in the articles published by &lt;a href="http://www.phparch.com/"&gt;php|architect&lt;/a&gt; magazine, &lt;a href="http://phpdeveloper.org/"&gt;PHPDeveloper.org&lt;/a&gt;, and the blogs of those whose feeds are distributed through &lt;a href="http://www.planet-php.net/"&gt;Planet PHP&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;In thinking through this, I&amp;#8217;ve come up with the following eras I think we, the PHP community, have had over the last ten years. These are in a general order, but eras overlap, and some have lasted longer than others, so there&amp;#8217;s not a distinct beginning or end to each.&lt;/p&gt;

&lt;!--More--&gt;


&lt;ul&gt;
&lt;li&gt;Object-oriented programming and design patterns&lt;/li&gt;
&lt;li&gt;Web application security&lt;/li&gt;
&lt;li&gt;Frameworks&lt;/li&gt;
&lt;li&gt;Coding standards and code organization&lt;/li&gt;
&lt;li&gt;Testing and continuous integration&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;OOP and Design Patterns&lt;/h2&gt;

&lt;p&gt;PHP 5.0.0 Beta 1 was released on June 29, 2003. The &lt;a href="http://en.wikipedia.org/wiki/Development_stage#Release"&gt;GA release&lt;/a&gt; came out on July 13, 2004. While PHP 4 had support for objects, inheritance, encapsulation, etc., it was during this time that the community began promoting best practices for object-oriented programming and the use of design patterns. &lt;a href="https://twitter.com/sweatje"&gt;Jason Sweat&amp;#8217;s&lt;/a&gt; &lt;em&gt;&lt;a href="http://www.amazon.com/php-architects-Guide-Design-Patterns/dp/0973589825"&gt;php|architect&amp;#8217;s Guide to PHP Design Patterns&lt;/a&gt;&lt;/em&gt; was published in 2005, and there were many talks and articles published on good OOP practices and design.&lt;/p&gt;

&lt;h2&gt;Security&lt;/h2&gt;

&lt;p&gt;It was also during this time that lots of folks began talking about web application security. Most notably, &lt;a href="https://twitter.com/shiflett"&gt;Chris Shiflett&lt;/a&gt; launched the &lt;a href="http://phpsec.org/"&gt;PHP Security Consortium&lt;/a&gt; and later published &lt;a href="http://phpsecurity.org/"&gt;Essential PHP Security&lt;/a&gt;, while &lt;a href="https://twitter.com/i0n1c"&gt;Stefan Esser&lt;/a&gt; pushed for greater visibility and focus on fixing security issues deep in the PHP core, contributing the &lt;a href="http://www.suhosin.org"&gt;Suhosin extension&lt;/a&gt;, part of the Hardened-PHP Project. Other books were published, and we saw many talks on security at conferences. Recently, &lt;a href="https://twitter.com/enygma"&gt;Chris Cornutt&lt;/a&gt; has raised the PHP security banner once again with &lt;a href="http://websec.io/"&gt;websec.io&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Frameworks&lt;/h2&gt;

&lt;p&gt;OOP and design patterns best practices led to increased awareness and focus on the &lt;a href="http://en.wikipedia.org/wiki/Model%E2%80%93view%E2%80%93controller"&gt;MVC design pattern&lt;/a&gt;. Many frameworks following this pattern—or variations on it—sprung up. Early frameworks &lt;a href="http://www.xisc.com/"&gt;Prado&lt;/a&gt; and &lt;a href="http://cakephp.org/"&gt;CakePHP&lt;/a&gt; preceded &lt;a href="http://symfony.com/"&gt;Symfony&lt;/a&gt; and &lt;a href="http://framework.zend.com/"&gt;Zend Framework&lt;/a&gt;. There are too many others to name here, but all have contributed to where we are today. We&amp;#8217;ve learned a lot from this proliferation of frameworks. It has allowed the community to try many different approaches, rather than settling on one particular way of doing things.&lt;/p&gt;

&lt;h2&gt;Coding Standards and Code Organization&lt;/h2&gt;

&lt;p&gt;The proliferation of frameworks brought us to where we are today with the &lt;a href="http://www.php-fig.org/"&gt;PHP Framework Interoperability Group&lt;/a&gt; and the community standards &lt;a href="https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-0.md"&gt;PSR-0&lt;/a&gt;, &lt;a href="https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-1-basic-coding-standard.md"&gt;PSR-1&lt;/a&gt;, and &lt;a href="https://github.com/php-fig/fig-standards/blob/master/accepted/PSR-2-coding-style-guide.md"&gt;PSR-2&lt;/a&gt;. The frameworks are all working together, many following some of the same patterns, allowing components of frameworks to be used together. Componentization has taken hold, with &lt;a href="https://twitter.com/funkatron"&gt;Ed Finkler&amp;#8217;s&lt;/a&gt; &lt;a href="http://microphp.org/"&gt;Micro PHP Manifesto&lt;/a&gt; being a rally cry for the use of smaller libraries that focus on doing one thing well, a variation on the &lt;a href="http://en.wikipedia.org/wiki/Single_responsibility_principle"&gt;single responsibility principle&lt;/a&gt;. &lt;a href="http://getcomposer.org/"&gt;Composer&lt;/a&gt; has arisen from the Symfony community, providing PHP libraries and applications a way to specify and manage external dependencies. PHP code is looking a lot better—just take a look at some of the repositories on GitHub.&lt;/p&gt;

&lt;h2&gt;Testing&lt;/h2&gt;

&lt;p&gt;This brings us to the era of testing. This is where we are today, but it&amp;#8217;s not the first time anyone has ever talked or written about testing. &lt;a href="https://twitter.com/s_bergmann"&gt;Sebastian Bergmann&lt;/a&gt; has been doing this for years, but I think the community and ecosystem around PHP is now at a level of maturity where it&amp;#8217;s become a major focus of developers and development shops. We not only care about what we build and getting the job done. We also care about the code we write and are treating it more and more as a craft. Testing goes hand-in-hand with treating code as craft. &lt;a href="https://twitter.com/grmpyprogrammer"&gt;Chris Hartjes&amp;#8217;s&lt;/a&gt; grumpy persona is leading the charge from his blog, Twitter account, and books, &lt;em&gt;&lt;a href="http://grumpy-testing.com/"&gt;Guide to Building Testable PHP Applications&lt;/a&gt;&lt;/em&gt; and &lt;em&gt;&lt;a href="http://grumpy-phpunit.com/"&gt;PHPUnit Cookbook&lt;/a&gt;&lt;/em&gt;, as well as his recent talks and keynotes at PHP conferences.&lt;/p&gt;

&lt;p&gt;With the coming of the testing era, I&amp;#8217;m seeing a lot of maturity in our community. The code we write is getting better. We&amp;#8217;re following standards and best practices. We&amp;#8217;re implementing a lot of good design principles. Many folks can explain what &lt;a href="http://en.wikipedia.org/wiki/Cross-site_scripting"&gt;XSS&lt;/a&gt;, &lt;a href="http://en.wikipedia.org/wiki/Cross-site_request_forgery"&gt;CSRF&lt;/a&gt;, and &lt;a href="http://en.wikipedia.org/wiki/SQL_injection"&gt;SQL injection&lt;/a&gt; are, and they can tell you how to protect against them. We&amp;#8217;re writing libraries and components that work well together. And we&amp;#8217;re starting to test—and automating those tests.&lt;/p&gt;

&lt;p&gt;I think the decade since PHP 5 was released has brought us to a great place as a community. We&amp;#8217;ve seen a lot of trends, and these have helped us mature as developers and have helped us establish community-supported best practices. With each new era, we can&amp;#8217;t forget what we&amp;#8217;ve learned, though. We must continue teaching and revising these best practices as we learn more.&lt;/p&gt;

&lt;p&gt;I wonder what the next era of PHP development best practices will be.&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/rJCnLQM29xQ" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[On the Rise of Community Conferences]]></title>
    <link href="http://benramsey.com/blog/2012/10/on-the-rise-of-community-conferences/" />
    <updated>2012-10-05T04:02:00-05:00</updated>
    <id>http://benramsey.com/blog/2012/10/on-the-rise-of-community-conferences</id>
    <content type="html">&lt;p&gt;The PHP world is exploding with community conferences. In fact, web development technologies in general are seeing a wide range of community-driven conferences springing up around the world. I think there are many reasons for the proliferation of these conferences, and in this post, I present my opinion on how this trend came to be, along with a definition of what I think constitutes a technology-focused community conference.&lt;/p&gt;

&lt;!--more--&gt;


&lt;h2&gt;What is a Community Conference?&lt;/h2&gt;

&lt;p&gt;In the technology world, a community conference is organized by members of the technology community for which the conference is themed, rather than a corporation that organizes the conference as a product offered to its customers. This appears to be a distinction that is common among community conferences. Many community conferences do have a corporation formed to run the conference. Some of these are set up as non-profit organizations. This is not a requirement for a community conference, however.&lt;/p&gt;

&lt;p&gt;There&amp;#8217;s nothing wrong with the conference-as-a-product approach, though. In fact, many corporations with conference products run their conferences much like community conferences. The organizers, while usually employees of the corporation, are often active members of the technology community. So, what else puts the &amp;#8220;community&amp;#8221; in community conferences?&lt;/p&gt;

&lt;h2&gt;The Unconference Phenomenon&lt;/h2&gt;

&lt;p&gt;At this point, I think it&amp;#8217;s important to mention the unconference phenomenon. &amp;#8220;An unconference is a participant-driven meeting&amp;#8221; (&lt;a href="http://en.wikipedia.org/w/index.php?title=Unconference&amp;amp;oldid=514980316"&gt;Wikipedia&lt;/a&gt;). According to Wikipedia, the term can be applied to any number of conferences that attempt to &amp;#8220;avoid one or more aspects of a conventional conference, such as high fees, sponsored presentations, and top-down organization.&amp;#8221; I believe the community conference is the marriage of the attitude of the unconference to the professionalism and structure of the traditional conference.&lt;/p&gt;

&lt;p&gt;Unconferences became popular by the middle of the last decade, allowing conference participants the power to drive the agenda of the conference while giving the finger to more traditional conference establishments. While the unconference movement was reactionary and subversive to traditional conferences, community conferences have embraced both the openness of the unconference and the structure of the traditional conference, to varying degrees.&lt;/p&gt;

&lt;p&gt;A few years back, traditional conferences took note and began adopting traits of the unconference, including tracks dedicated to open discussion and ad hoc presentations. These alternate tracks were often referred to as &amp;#8220;camps&amp;#8221; or &amp;#8220;unconferences,&amp;#8221; and they were implemented at a number of popular technology conferences. &lt;a href="http://www.oscon.com/"&gt;OSCON&lt;/a&gt;, the largest open source technology conference in the US, hosted OSCamp, while in the PHP world, &lt;a href="http://zendcon.com/"&gt;ZendCon&lt;/a&gt; and &lt;a href="http://tek.phparch.com/"&gt;php|tek&lt;/a&gt; both hosted unconference tracks, all run by members of the technology community. I believe it is this trend that led to the birth of the modern community conference.&lt;/p&gt;

&lt;h2&gt;Putting the &amp;#8220;Community&amp;#8221; in Community Conferences&lt;/h2&gt;

&lt;p&gt;So, what puts the &amp;#8220;community&amp;#8221; in community conferences? I submit that there are three essential elements to a community conference:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Community organizers&lt;/li&gt;
&lt;li&gt;Focus on developers&lt;/li&gt;
&lt;li&gt;Proper attitude&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I think it&amp;#8217;s important that the organizers of a community conference be members of the technology community for which they are organizing the conference. While there are many different ways to organize a community conference, its organizers must be from the community. If the conference doesn&amp;#8217;t have this, then it will fail to meet the needs of the community for which it is designed. The good news is that most conferences, traditional and community alike, are organized by members of the community.&lt;/p&gt;

&lt;p&gt;A focus on developers is also important. A prevalent conception of traditional conferences is that they are too focused on companies. The good news is that this is often resolved by having community organizers. Recently, friends of mine organized &lt;a href="http://nashville.coderfaire.com/"&gt;CoderFaire&lt;/a&gt;, a local developer conference in Nashville, and required that their sponsors send programmers and developer evangelists instead of sales people to meet with attendees and show off their tech. Their focus was on developers, and to enhance the experience of their attendees, they wanted their sponsors to also focus on developers.&lt;/p&gt;

&lt;p&gt;Attitude matters. It is crucial. I think this is primarily what sets apart a community conference. It&amp;#8217;s also the hardest element to pin down and define. Every community conference is different, but the attitude is a little bit &amp;#8220;punk rock&amp;#8221; for each one. Attitude encompasses focus, intent, and passion. My friends at &lt;a href="https://brooklynbeta.org/"&gt;Brooklyn Beta&lt;/a&gt; have crafted a conference that has a particular attitude, setting them apart from other conferences. It&amp;#8217;s embodied in their tagline, &amp;#8220;Make Something You Love,&amp;#8221; and permeates their talks, events, and even the name badges. Every community conference has a particular attitude that sets it apart from traditional conferences, and it makes all the difference.&lt;/p&gt;

&lt;h2&gt;What Do You Think?&lt;/h2&gt;

&lt;p&gt;Defining what it means to be a community conference is not easy. I wrote this post out of my own thoughts and experiences running and organizing the &lt;a href="http://phpcon.org/"&gt;PHP Community Conference&lt;/a&gt;. I also have many friends within various technology communities who run community conferences for their favored technologies/regions. As a result, I am no unbiased bystander, and these thoughts are wholly subjective.&lt;/p&gt;

&lt;p&gt;How do you define &amp;#8220;community conference?&amp;#8221; What do you think are important elements of a community conference? Can a corporation run a community conference? (Based on my definition, I think it can.) I welcome your comments.&lt;/p&gt;

&lt;p&gt;Finally, I&amp;#8217;d be remiss if I didn&amp;#8217;t point out two upcoming community conferences you should check out: &lt;a href="http://codeconnexx.com/"&gt;CodeConnexx&lt;/a&gt; in Indianapolis and &lt;a href="http://truenorthphp.ca/"&gt;True North PHP&lt;/a&gt; in Toronto. They&amp;#8217;re both going to be awesome!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/kESnK9wloIU" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Build PHP 5.4 on CentOS 6.2]]></title>
    <link href="http://benramsey.com/blog/2012/03/build-php-54-on-centos-62/" />
    <updated>2012-03-05T13:30:00-06:00</updated>
    <id>http://benramsey.com/blog/2012/03/build-php-54-on-centos-62</id>
    <content type="html">&lt;p&gt;In case you haven&amp;#8217;t heard the news, the PHP project &lt;a href="http://www.php.net/archive/2012.php#id2012-03-01-1" title="PHP 5.4.0 release announcement"&gt;released version 5.4.0 last Thursday&lt;/a&gt;. Naturally, I decided it was time to install and give it a try. I chose to install to a clean and bare-bones &lt;a href="http://www.centos.org/" title="CentOS"&gt;CentOS 6.2&lt;/a&gt; virtual machine using &lt;a href="https://www.virtualbox.org/" title="Oracle VM VirtualBox"&gt;VirtualBox&lt;/a&gt;. I did this for two reasons: 1) I wanted a clean environment for the build, and 2) I wanted to play with CentOS. At the time of this writing, there are not yet any official CentOS RPMs for PHP 5.4, so I had to build PHP from source. What follows are the notes I took during the installation and build process. I hope you find them helpful.&lt;/p&gt;

&lt;!--more--&gt;


&lt;h2&gt;Set up a CentOS virtual machine&lt;/h2&gt;

&lt;p&gt;First of all, go grab the &lt;a href="http://www.centos.org/modules/tinycontent/index.php?id=30" title="CentOS mirrors"&gt;CentOS 6.2 netinstall ISO&lt;/a&gt;. Depending on the mirror, it will likely be located somewhere like &lt;code&gt;centos/6.2/isos/x86_64/CentOS-6.2-x86_64-netinstall.iso&lt;/code&gt; (note that I&amp;#8217;m using the 64-bit version). Following that, create a new basic VirtualBox VM (512 MB RAM, 8 GB HDD, 12 MB video RAM) for your CentOS installation (use &amp;#8220;Red Hat (64 bit)&amp;#8221; as the Version) and follow these &lt;a href="http://www.if-not-true-then-false.com/2011/centos-6-netinstall-network-installation/" title="CentOS 6.2 Netinstall Guide"&gt;instructions for a CentOS 6.2 netinstall&lt;/a&gt;. I chose the 64-bit version, using the netinstall URL of &lt;code&gt;http://mirror.centos.org/centos/6.2/os/x86_64/&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Since the VirtualBox video RAM selected is only 12 MB, it won&amp;#8217;t boot into the graphical mode shown in the netinstall installation guide. Don&amp;#8217;t worry about this. Also, it will make some assumptions (e.g. it won&amp;#8217;t install Gnome or KDE), since you aren&amp;#8217;t in graphical mode. What you&amp;#8217;ll have at the end is a very bare-bones server installation.&lt;/p&gt;

&lt;p&gt;After installation, I like to power down the VM and adjust my settings to set up port forwarding so that I can shell into my VM from my Mac terminal. Feel free to configure things as you like. See the screenshot for an example of forwarding ports in Virtual Box. Once set up, you can boot the VM and then use your favorite local terminal to SSH to the instance:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;ssh -p 2222 root@localhost
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;You&amp;#8217;ll probably want to create a user for yourself, so that you&amp;#8217;re not using root all the time, but since this is a VM on your local machine, it&amp;#8217;s not a huge deal. If this was a box out in the open, I&amp;#8217;d recommend locking it down and creating a user with much more restricted permissions.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://files.benramsey.com/images/blog/2012-03-05_virtualbox-network-port-forwarding.png" title="'VirtualBox Port Forwarding'" &gt;&lt;/p&gt;

&lt;h2&gt;Install packages needed for PHP&lt;/h2&gt;

&lt;p&gt;Once logged in to the VM, you&amp;#8217;ll need to install some basic build stuff, like gcc, etc.&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;yum install man wget
&lt;/span&gt;&lt;span class='line'&gt;yum groupinstall &lt;span class="s2"&gt;&amp;quot;Development Tools&amp;quot;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Next, update iptables to allow connections to the VM over ports 80 and 8000.&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;sed -i &lt;span class="s1"&gt;&amp;#39;/22/ i -A INPUT -m state --state NEW -m tcp -p tcp --dport 80 -j ACCEPT&amp;#39;&lt;/span&gt; /etc/sysconfig/iptables
&lt;/span&gt;&lt;span class='line'&gt;sed -i &lt;span class="s1"&gt;&amp;#39;/22/ i -A INPUT -m state --state NEW -m tcp -p tcp --dport 8000 -j ACCEPT&amp;#39;&lt;/span&gt; /etc/sysconfig/iptables
&lt;/span&gt;&lt;span class='line'&gt;/etc/init.d/iptables restart
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;For the PHP configuration that I&amp;#8217;m using, install the following packages. There will be a bunch of dependencies it will ask you to install. Just say yes to them all.&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;yum install &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;libxml2-devel &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;httpd-devel &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;libXpm-devel &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;gmp-devel &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;libicu-devel &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;t1lib-devel &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;aspell-devel &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;openssl-devel &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;bzip2-devel &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;libcurl-devel &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;libjpeg-devel &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;libvpx-devel &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;libpng-devel &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;freetype-devel &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;readline-devel &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;libtidy-devel &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;libxslt-devel
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;For some reason, libmcrypt isn&amp;#8217;t available in the main CentOS repositories, so &lt;a href="http://wiki.centos.org/AdditionalResources/Repositories/RPMForge#head-f0c3ecee3dbb407e4eed79a56ec0ae92d1398e01" title="RPMForge for CentOS 6"&gt;add the RPMForge repo to install it&lt;/a&gt;.&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;wget http://packages.sw.be/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm
&lt;/span&gt;&lt;span class='line'&gt;rpm --import http://apt.sw.be/RPM-GPG-KEY.dag.txt
&lt;/span&gt;&lt;span class='line'&gt;rpm -K rpmforge-release-0.5.2-2.el6.rf.*.rpm &lt;span class="c"&gt;# Verifies the package&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;rpm -i rpmforge-release-0.5.2-2.el6.rf.*.rpm
&lt;/span&gt;&lt;span class='line'&gt;yum install libmcrypt-devel
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now, the environment is all ready for building PHP 5.4!&lt;/p&gt;

&lt;h2&gt;Build PHP 5.4.0&lt;/h2&gt;

&lt;p&gt;All that&amp;#8217;s left is to get the PHP 5.4.0 release package and build it. &lt;a href="http://www.php.net/get/php-5.4.0.tar.bz2/from/a/mirror" title="PHP download mirrors"&gt;Choose a mirror closest to you&lt;/a&gt; and run the following commands to configure, make, and install PHP.&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;wget http://www.php.net/get/php-5.4.0.tar.bz2/from/this/mirror
&lt;/span&gt;&lt;span class='line'&gt;tar jxf php-5.4.0.tar.bz2
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;cd &lt;/span&gt;php-5.4.0/
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;What you want to enable and build into your PHP installation will vary, but here&amp;#8217;s the configure line that I used for this build:&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;span class='line-number'&gt;8&lt;/span&gt;
&lt;span class='line-number'&gt;9&lt;/span&gt;
&lt;span class='line-number'&gt;10&lt;/span&gt;
&lt;span class='line-number'&gt;11&lt;/span&gt;
&lt;span class='line-number'&gt;12&lt;/span&gt;
&lt;span class='line-number'&gt;13&lt;/span&gt;
&lt;span class='line-number'&gt;14&lt;/span&gt;
&lt;span class='line-number'&gt;15&lt;/span&gt;
&lt;span class='line-number'&gt;16&lt;/span&gt;
&lt;span class='line-number'&gt;17&lt;/span&gt;
&lt;span class='line-number'&gt;18&lt;/span&gt;
&lt;span class='line-number'&gt;19&lt;/span&gt;
&lt;span class='line-number'&gt;20&lt;/span&gt;
&lt;span class='line-number'&gt;21&lt;/span&gt;
&lt;span class='line-number'&gt;22&lt;/span&gt;
&lt;span class='line-number'&gt;23&lt;/span&gt;
&lt;span class='line-number'&gt;24&lt;/span&gt;
&lt;span class='line-number'&gt;25&lt;/span&gt;
&lt;span class='line-number'&gt;26&lt;/span&gt;
&lt;span class='line-number'&gt;27&lt;/span&gt;
&lt;span class='line-number'&gt;28&lt;/span&gt;
&lt;span class='line-number'&gt;29&lt;/span&gt;
&lt;span class='line-number'&gt;30&lt;/span&gt;
&lt;span class='line-number'&gt;31&lt;/span&gt;
&lt;span class='line-number'&gt;32&lt;/span&gt;
&lt;span class='line-number'&gt;33&lt;/span&gt;
&lt;span class='line-number'&gt;34&lt;/span&gt;
&lt;span class='line-number'&gt;35&lt;/span&gt;
&lt;span class='line-number'&gt;36&lt;/span&gt;
&lt;span class='line-number'&gt;37&lt;/span&gt;
&lt;span class='line-number'&gt;38&lt;/span&gt;
&lt;span class='line-number'&gt;39&lt;/span&gt;
&lt;span class='line-number'&gt;40&lt;/span&gt;
&lt;span class='line-number'&gt;41&lt;/span&gt;
&lt;span class='line-number'&gt;42&lt;/span&gt;
&lt;span class='line-number'&gt;43&lt;/span&gt;
&lt;span class='line-number'&gt;44&lt;/span&gt;
&lt;span class='line-number'&gt;45&lt;/span&gt;
&lt;span class='line-number'&gt;46&lt;/span&gt;
&lt;span class='line-number'&gt;47&lt;/span&gt;
&lt;span class='line-number'&gt;48&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;./configure &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-libdir&lt;span class="o"&gt;=&lt;/span&gt;lib64 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--prefix&lt;span class="o"&gt;=&lt;/span&gt;/usr/local &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-layout&lt;span class="o"&gt;=&lt;/span&gt;PHP &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-pear &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-apxs2 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--enable-calendar &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--enable-bcmath &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-gmp &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--enable-exif &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-mcrypt &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-mhash &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-zlib &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-bz2 &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--enable-zip &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--enable-ftp &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--enable-mbstring &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-iconv &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--enable-intl &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-icu-dir&lt;span class="o"&gt;=&lt;/span&gt;/usr &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-gettext &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-pspell &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--enable-sockets &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-openssl &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-curl &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-curlwrappers &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-gd &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--enable-gd-native-ttf &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-jpeg-dir&lt;span class="o"&gt;=&lt;/span&gt;/usr &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-png-dir&lt;span class="o"&gt;=&lt;/span&gt;/usr &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-zlib-dir&lt;span class="o"&gt;=&lt;/span&gt;/usr &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-xpm-dir&lt;span class="o"&gt;=&lt;/span&gt;/usr &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-vpx-dir&lt;span class="o"&gt;=&lt;/span&gt;/usr &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-freetype-dir&lt;span class="o"&gt;=&lt;/span&gt;/usr &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-t1lib&lt;span class="o"&gt;=&lt;/span&gt;/usr &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-libxml-dir&lt;span class="o"&gt;=&lt;/span&gt;/usr &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-mysql&lt;span class="o"&gt;=&lt;/span&gt;mysqlnd &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-mysqli&lt;span class="o"&gt;=&lt;/span&gt;mysqlnd &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-pdo-mysql&lt;span class="o"&gt;=&lt;/span&gt;mysqlnd &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--enable-soap &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-xmlrpc &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-xsl &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-tidy&lt;span class="o"&gt;=&lt;/span&gt;/usr &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--with-readline &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--enable-pcntl &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--enable-sysvshm &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--enable-sysvmsg &lt;span class="se"&gt;\&lt;/span&gt;
&lt;/span&gt;&lt;span class='line'&gt;--enable-shmop
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Assuming the configure script ran perfectly, you&amp;#8217;re ready to make and install PHP.&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;make &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; make install
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now, you&amp;#8217;ve got a fully-functioning build of PHP 5.4.0 on CentOS 6.2!&lt;/p&gt;

&lt;h2&gt;Trying out the build&lt;/h2&gt;

&lt;p&gt;Now, that PHP is installed, it&amp;#8217;s time to try out a few things. Create a simple &lt;code&gt;phpinfo()&lt;/code&gt; script, make sure Apache knows to parse &lt;code&gt;.php&lt;/code&gt; files as PHP, and start Apache.&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;lt;?php phpinfo();&amp;quot;&lt;/span&gt; &amp;gt; /var/www/html/phpinfo.php
&lt;/span&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; -e &lt;span class="s2"&gt;&amp;quot;&amp;lt;FilesMatch \\.php$&amp;gt;\nSetHandler application/x-httpd-php\n&amp;lt;/FilesMatch&amp;gt;&amp;quot;&lt;/span&gt; &amp;gt; /etc/httpd/conf.d/php.conf
&lt;/span&gt;&lt;span class='line'&gt;/etc/init.d/httpd start
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;Now, assuming your VM port forwarding is set up correctly, from your local machine visit &lt;code&gt;http://localhost:8080/phpinfo.php&lt;/code&gt;. You should see the output of &lt;code&gt;phpinfo()&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;One cool new PHP 5.4 feature is the &lt;a href="http://php.net/commandline.webserver" title="PHP 5.4 built-in web server"&gt;built-in web server&lt;/a&gt; for development testing. You can try it out with this build. The following commands tell PHP to run the built-in web server using the current directory as the web root, while listening on port 8000 to all interfaces (not recommended on a public machine, but necessary for the request to the VM to work).&lt;/p&gt;

&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='bash'&gt;&lt;span class='line'&gt;&lt;span class="nb"&gt;cd&lt;/span&gt; /var/www/html
&lt;/span&gt;&lt;span class='line'&gt;php -S 0.0.0.0:8000
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;


&lt;p&gt;From your local machine, visit &lt;code&gt;http://localhost:8000/phpinfo.php&lt;/code&gt;. Note that the Server API line will say &amp;#8220;Built-in HTTP server.&amp;#8221; Of course, we&amp;#8217;ve also set up Apache, so using the built-in HTTP server may not be of much value now, but in the future, if developing locally, the built-in web server can be a handy way to quickly try out things that typically need a web server.&lt;/p&gt;

&lt;h2&gt;Wrapping up&lt;/h2&gt;

&lt;p&gt;There you have it, and it only takes about an hour to work through these installation and build steps, most of which is taken up by waiting on things to finish installing, configuring, or building. I hope these steps have been helpful. Feel free to let me know of your own experiences installing PHP 5.4 and leave any tips or tricks in the comments.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/GxhZ07qL4Bw" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Revamping my development toolchain]]></title>
    <link href="http://benramsey.com/blog/2012/02/revamping-my-development-toolchain/" />
    <updated>2012-02-06T01:42:00-06:00</updated>
    <id>http://benramsey.com/blog/2012/02/revamping-my-development-toolchain</id>
    <content type="html">&lt;p&gt;It used to be that once a year I would take a good, hard look at the tools I used and endeavor to learn something new or change my workflow with those tools. However, I&amp;#8217;ve been living the &lt;a href="https://twitter.com/#!/search?q=%23startuplife" title="#startuplife"&gt;#startuplife&lt;/a&gt; for the past two years, so it&amp;#8217;s been about three years since I last addressed my development toolchain. I decided to come up for air and take some time this weekend to rectify that by addressing five main areas: my terminal emulator, my shell, my terminal multiplexer, my IRC client, and my color scheme—yes, even my color scheme! In addition, I decided to push out my updated &lt;a href="http://octopress.org/" title="Octopress"&gt;Octopress&lt;/a&gt;-powered blog, even though things are still a little rough around the edges.&lt;/p&gt;

&lt;!--more--&gt;


&lt;h2&gt;Switching to iTerm2&lt;/h2&gt;

&lt;p&gt;I&amp;#8217;ve been a long-time user of &lt;a href="http://en.wikipedia.org/wiki/Terminal_%28Mac_OS_X%29" title="Terminal.app"&gt;Terminal.app&lt;/a&gt;, but I had been hearing good things about &lt;a href="http://www.iterm2.com" title="iTerm2"&gt;iTerm2&lt;/a&gt;. I actually used iTerm (version 1) years ago, but I switched back to Terminal.app for reasons I cannot recall. Nevertheless, iTerm2 has come a long way, and I wanted to take advantage of some of its functionality like split panes, better full-screen support, etc. So, that was the first major change I made to my tools.&lt;/p&gt;

&lt;h2&gt;Ditching bash for zsh&lt;/h2&gt;

&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Bash_%28Unix_shell%29" title="Bash"&gt;Bash&lt;/a&gt; has been my favored shell since I began using Linux about fourteen years ago. I&amp;#8217;d never given much thought to using a different shell, and to be honest, switching shells always seemed a daunting task. I thought I&amp;#8217;d have to relearn my way around the shell, and everything I took for granted with Bash would be non-existent in a different shell. Fortunately, this is not true. As it turns out, &lt;a href="http://en.wikipedia.org/wiki/Z_shell" title="Z shell"&gt;zsh&lt;/a&gt; &amp;#8220;can be thought of as an extended Bourne shell with a large number of improvements, including some features of bash, ksh, and tcsh&amp;#8221; (&lt;a href="http://en.wikipedia.org/w/index.php?title=Z_shell&amp;amp;oldid=469321626" title="Z shell, Wikipedia at 14:18, 3 January 2012"&gt;Wikipedia&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;I was able to switch to zsh without ditching my knowledge of bash. As a result, I&amp;#8217;ve gained all the advantages of zsh, which include advanced customization and scripting capabilities, while continuing to provide most (if not all) the same functionality and commands I&amp;#8217;m used to in bash. I have much more to learn, though, so if you have tips and tricks, please share.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re interested in switching to zsh, I recommend checking out &lt;a href="https://github.com/robbyrussell/oh-my-zsh" title="oh-my-zsh"&gt;oh-my-zsh&lt;/a&gt;. It&amp;#8217;s a framework for managing your zsh configuration, and it contains lots of goodies. In addition, there are great posts by &lt;a href="http://zanshin.net/2011/08/12/oh-my-zsh/" title="Oh My Zsh! by Mark H. Nichols"&gt;Mark Nichols&lt;/a&gt; and &lt;a href="http://intridea.com/2011/5/18/its-not-enough-to-bash-in-heads-youve-got-to-bash-in-minds-with-zsh?blog=company" title="It's not enough to bash in heads, you've got to bash in minds…with ZSH by Jon Kinney"&gt;Jon Kinney&lt;/a&gt; that will get you quickly up-to-speed with oh-my-zsh. The latter post has the awesome title &lt;a href="http://www.youtube.com/watch?v=VqCXXMvMm6g#t=77s" title="Everyone's A Hero from Dr. Horrible's Sing-Along Blog"&gt;&amp;#8220;It&amp;#8217;s not enough to bash in heads, you&amp;#8217;ve got to bash in minds…with ZSH&amp;#8221;.&lt;/a&gt;&lt;/p&gt;

&lt;h2&gt;Using tmux instead of screen&lt;/h2&gt;

&lt;p&gt;Generally, I&amp;#8217;ve really only used &lt;a href="http://en.wikipedia.org/wiki/GNU_Screen" title="GNU Screen"&gt;screen&lt;/a&gt; when I started noticing that my connection to a remote development machine was getting sluggish or I wanted to keep a constant connection to IRC, but &lt;a href="http://tmux.sourceforge.net/" title="tmux"&gt;tmux&lt;/a&gt; has opened my eyes to so many more possibilities that a multiplexer can offer. I&amp;#8217;ve just only started using it, so I can&amp;#8217;t say much about it, but I encourage you to read &lt;a href="http://blog.hawkhost.com/2010/06/28/tmux-the-terminal-multiplexer/" title="TMUX – The Terminal Multiplexer"&gt;Hawk Host&amp;#8217;s two-part post on tmux&lt;/a&gt;.&lt;/p&gt;

&lt;h2&gt;Moving back to irssi&lt;/h2&gt;

&lt;p&gt;I used &lt;a href="http://irssi.org/" title="irssi"&gt;irssi&lt;/a&gt; in a screen session for years. Then, I decided I needed &lt;a href="http://growl.info/" title="Growl"&gt;Growl&lt;/a&gt; notifications from my IRC client. I quit using irssi in favor of &lt;a href="http://conceitedsoftware.com/products/linkinus"&gt;Linkinus&lt;/a&gt;. I&amp;#8217;ve used Linkinus for about two years—together with the IRC bouncer &lt;a href="http://wiki.znc.in/ZNC"&gt;znc&lt;/a&gt; for some of that time—but I&amp;#8217;ve continued to miss the flexibility and functionality of irssi. On a whim, I decided to switch back to irssi, but it wasn&amp;#8217;t without some searching. I needed to find a way to make &lt;a href="http://justindow.com/2010/03/26/irssi-screen-and-growl-oh-my/"&gt;irssi work with growl&lt;/a&gt;, as well as a way to make &lt;a href="http://www.denis.lemire.name/2009/07/07/prowl-irssi-hack/"&gt;irssi send notifications to my phone when I was marked as &amp;#8220;away.&amp;#8221;&lt;/a&gt; Finding solutions to both of these—as well as the switch to tmux—helped make the transition back to irssi much easier.&lt;/p&gt;

&lt;h2&gt;Using the Solarized color scheme&lt;/h2&gt;

&lt;p&gt;Finding the perfect, universal color scheme doesn&amp;#8217;t sound so important until you&amp;#8217;ve found it. Somehow, I stumble upon the &lt;a href="http://ethanschoonover.com/solarized"&gt;Solarized project&lt;/a&gt;. This project has a color scheme designed for gui and terminal applications. It has been tested in a variety of lighting conditions, and it&amp;#8217;s very clear and easy to read. Using the fixed-width Menlo font face, I quickly fell in love with Solarized. They have color schemes for &lt;a href="https://github.com/altercation/solarized/tree/master/iterm2-colors-solarized"&gt;iTerm2&lt;/a&gt;, &lt;a href="https://github.com/altercation/solarized/tree/master/textmate-colors-solarized"&gt;TextMate&lt;/a&gt;, &lt;a href="https://github.com/altercation/solarized/tree/master/vim-colors-solarized"&gt;vim&lt;/a&gt;, &lt;a href="https://github.com/seebi/tmux-colors-solarized"&gt;tmux&lt;/a&gt;, &lt;a href="https://github.com/huyz/irssi-colors-solarized"&gt;irssi&lt;/a&gt;, &lt;a href="https://github.com/seebi/dircolors-solarized"&gt;GNU ls&lt;/a&gt;, and many more.&lt;/p&gt;

&lt;h2&gt;Wrapping up&lt;/h2&gt;

&lt;p&gt;I&amp;#8217;ve put all my configuration into a &lt;a href="https://github.com/ramsey/dotfiles"&gt;dotfiles repository on GitHub&lt;/a&gt; to help me keep track of things. Feel free to play with my configuration and suggest improvements to it. You&amp;#8217;ll need to install zsh, rubygems, and rake first. Then, clone my repo and run &lt;code&gt;rake install&lt;/code&gt;. If you&amp;#8217;re not already running zsh, change your shell to zsh with &lt;code&gt;chsh -s zsh&lt;/code&gt;. You&amp;#8217;ll probably want to install the Solarized theme for your terminal emulator first, too.&lt;/p&gt;

&lt;p&gt;I know I haven&amp;#8217;t provided a very deep dive into these tools, but I hope I&amp;#8217;ve skimmed the surface just enough to provide you with the information you need to find out what works best for you.&lt;/p&gt;

&lt;p&gt;Thanks for reading!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/-2yB4vP9CLQ" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[A Different Kind of Conference: the PHP Community Conference]]></title>
    <link href="http://benramsey.com/blog/2011/01/php-community-conference/" />
    <updated>2011-01-18T16:46:13-06:00</updated>
    <id>http://benramsey.com/blog/2011/01/php-community-conference</id>
    <content type="html">&lt;p&gt;For those who have been following along, you&amp;#8217;ll know that I helped organize
&lt;a href="http://benramsey.com/archives/php-appalachia-announced/"&gt;a mini-conference for PHP&lt;/a&gt;, along with &lt;a href="http://twitter.com/elizabethn"&gt;Elizabeth Naramore&lt;/a&gt;,
in the Fall of 2006. It was little more than an excuse for a small group of
people to get together, &lt;em&gt;&lt;a href="http://koa.com/"&gt;kamp&lt;/a&gt;&lt;/em&gt;, talk shop, and have fun—and it was a
lot of fun. It was so much fun, in fact, that Elizabeth and &lt;a href="http://twitter.com/caseysoftware"&gt;Keith&lt;/a&gt;
&lt;a href="http://www.naramore.net/blog/php-appalachia-2008"&gt;organized it again in 2008&lt;/a&gt;. That was &lt;a href="http://phpappalachia.org/"&gt;PHP Appalachia&lt;/a&gt;.
It was the &lt;a href="http://www.phpdeveloper.org/news/11234"&gt;stuff&lt;/a&gt; of
&lt;a href="http://www.flickr.com/photos/calevans/2940902001/"&gt;legends&lt;/a&gt;.&lt;/p&gt;

&lt;!--more--&gt;


&lt;p&gt;I&amp;#8217;ve long wanted to organize a community-driven PHP conference, as far back as
2004, when &lt;a href="http://benramsey.com/archives/atlanta-php/"&gt;I helped form the Atlanta PHP user group&lt;/a&gt;. Back then, I
think my conference dreams were loftier, but I&amp;#8217;ve since attended twenty-something
conferences and given nearly sixty talks. I&amp;#8217;ve seen conferences as both a speaker
and an attendee, and from conversations with many other speakers and attendees,
I knew it was time for something different. Unfortunately, I didn&amp;#8217;t know exactly
what &amp;#8220;different&amp;#8221; should mean.&lt;/p&gt;

&lt;p&gt;Then, just over a year ago, I received an email from Elizabeth. She wrote:&lt;/p&gt;

&lt;blockquote&gt;&lt;p&gt;&lt;a href="http://opensourcebridge.org/"&gt;OSBridge&lt;/a&gt; showed that a community-driven conference can be successful
and readily accepted. I know the economy is tight, but I think there is room
for a conference that has no other purpose than to be an educational and fun
experience for attendees. […] We&amp;#8217;ve had a &lt;em&gt;ton&lt;/em&gt; of people asking about PHP
Appalachia, so maybe that kind of &amp;#8220;retreat&amp;#8221; versus &amp;#8220;conference&amp;#8221; idea holds merit
as well.&lt;/p&gt;&lt;/blockquote&gt;

&lt;p&gt;Thus began a long thread of messages back-and-forth with a small group: Elizabeth,
&lt;a href="http://twitter.com/preinheimer"&gt;Paul&lt;/a&gt;, &lt;a href="http://twitter.com/shiflett"&gt;Chris&lt;/a&gt;, &lt;a href="http://twitter.com/coates"&gt;Sean&lt;/a&gt;, &lt;a href="http://twitter.com/funkatron"&gt;Ed&lt;/a&gt;, and myself; each one wholly committed to
the idea of a community-driven conference. But I was still unsure. My uncertainty
had nothing to do with whether we could run a PHP conference but, rather, what
it would be that makes our conference different. I was tapped by the group to lead
the effort, so I started some planning, but everything I did looked like the same
ol&amp;#8217; conference. I was talking to hotels, looking at traditional venues, and
thinking too much inside the box. All of that was about to change, though, with
&lt;a href="http://brooklynbeta.org/"&gt;Brooklyn Beta&lt;/a&gt; on the horizon.&lt;/p&gt;

&lt;p&gt;With its simple narrative of &amp;#8220;make something you love,&amp;#8221; Brooklyn Beta showed it
was possible to craft &lt;a href="http://thisisapipe.com/short-stories/a-friendly-web-conference"&gt;a friendly web conference&lt;/a&gt; that was as intimate
as it was inspiring. Chris himself is an inspiration to me because he views just
about everything he does as a craft, something to hone and perfect. He takes
great care and pride with everything he touches. The &amp;#8220;make something you love&amp;#8221;
narrative was not just the theme of the conference, but Chris and &lt;a href="http://twitter.com/fictivecameron"&gt;Cameron&lt;/a&gt;
put it into practice with the care they put into organizing Brooklyn Beta. They
made a conference they loved, and it showed—boy, did it show!&lt;/p&gt;

&lt;p&gt;At last, I had the inspiration I needed, and with the catalyst provided by
Elizabeth, Paul, Chris, Sean, and Ed, I was ready to start … but not quite.
Left to myself, I would fail, and by myself, I was failing. Working for a
start-up does not leave much time to craft a conference. That&amp;#8217;s not a complaint;
it&amp;#8217;s just a reality. Help would come in the form of two other Brooklyn Beta
attendees, members of the PHP community, and friends of mine: &lt;a href="http://twitter.com/lisamusing"&gt;Lisa Denlinger&lt;/a&gt;
and &lt;a href="http://twitter.com/nicksloan"&gt;Nicholas Sloan&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;As I recall, Lisa and Nick were both interested in helping create a
community-driven PHP conference, so Chris put them in touch with me back in
October. The rest, as they say, is history. Things began to move fast, now that
we had a small team to accomplish the work needed. Lisa visited venues and put
together our budget. Nick began working with a designer to create our website
and branding. It&amp;#8217;s been a lot of hard work, and we still have more hard work
ahead of us, but we&amp;#8217;re making something we love, and I think that&amp;#8217;s the
important part.&lt;/p&gt;

&lt;p&gt;During one of our many planning conversations, Nick voiced what would become,
for me, the narrative of our conference: &lt;strong&gt;PHP Community Conference is a
conference for people who care about PHP and the code they write with it.&lt;/strong&gt;
That&amp;#8217;s really what I want this conference to be about, and I&amp;#8217;ll keep coming
back to that theme repeatedly over the next few months and throughout the course
of the conference itself. You, the PHP community, care about PHP and the code
you write with it. I want to hear your stories!&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://phpcon.org/"&gt;PHP Community Conference&lt;/a&gt; exists for you to share your stories.
Tell us about an inspiring project you&amp;#8217;re working on and why it&amp;#8217;s important. We
don&amp;#8217;t want to focus on the details of the code itself, but rather on how your
project solves a problem or fills a need.&lt;/p&gt;

&lt;p&gt;There are a lot of speakers out there. I know many of you, and we all know the
drill. We reuse a lot of the same talks at many different conferences. Use this
opportunity, though, to stretch yourself. Craft a new talk. Craft a different
talk. This time, don&amp;#8217;t just tell us how to do something with PHP, tell us what
you&amp;#8217;re working on with PHP. What does it do? Why is it important? These are the
things that matter to the community, and this is part of what makes the PHP
Community Conference a different kind of conference.&lt;/p&gt;

&lt;p&gt;There are other reasons the PHP Community Conference is different, but I&amp;#8217;ve
given you quite a bit to chew on for one blog post, so I&amp;#8217;ll leave the rest for
later and for others to share. Still, since this conference is community-driven,
I need your help. Even though our tickets haven&amp;#8217;t gone on sale yet, I want you
to &lt;a href="http://phpcon.org/"&gt;save the dates&lt;/a&gt;! Put them on your calendar and commit to attend.
(Ticket prices will be very reasonable, but we&amp;#8217;re still working out those
details at the moment.) Write a blog post about your decision to attend and why
you&amp;#8217;re looking forward to the conference. Tweet about it (#phpcomcon). Follow
&lt;a href="http://twitter.com/phpcomcon"&gt;@phpcomcon&lt;/a&gt; on Twitter. Talk about it on IRC. Submit a proposal for
a talk. Please spread the word, anyway you can.&lt;/p&gt;

&lt;p&gt;Finally, if you have ideas for other ways you can help, feel free to
&lt;a href="mailto:hosts@phpcon.org"&gt;let me know&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;I&amp;#8217;m looking forward to seeing you at the &lt;a href="http://phpcon.org/"&gt;PHP Community Conference&lt;/a&gt;!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/nD6Zqlar_eo" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Moontoast Is Hiring Senior PHP Developers]]></title>
    <link href="http://benramsey.com/blog/2010/04/moontoast-is-hiring-senior-php-developers/" />
    <updated>2010-04-28T00:16:51-05:00</updated>
    <id>http://benramsey.com/blog/2010/04/moontoast-is-hiring-senior-php-developers</id>
    <content type="html">&lt;p&gt;&lt;em&gt;&lt;a href="http://moontoast.com/"&gt;Moontoast&lt;/a&gt;, the company &lt;a href="http://benramsey.com/archives/blasting-off-with-moontoast/"&gt;where I now work&lt;/a&gt;, is looking for senior &lt;span class="caps"&gt;PHP&lt;/span&gt; developers. This is an on-site (Nashville, TN), contract position that could potentially develop into a full-time position. If you&amp;#8217;re interested, let me know, and send your resume to &lt;strong&gt;hr [at] moontoast.com&lt;/strong&gt;.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;!--more--&gt;&lt;/p&gt;
&lt;p&gt;Moontoast is a social commerce network for people to pursue and promote their passions through personal relationships. Moontoast simply connects &lt;em&gt;those who know, with those who want to know&lt;/em&gt;.&lt;/p&gt;
&lt;p&gt;Moontoast is seeking passionate, senior &lt;span class="caps"&gt;PHP&lt;/span&gt; developers—who want to pursue and promote their passion for writing high quality code—to enhance the Moontoast social commerce platform. We are looking for self-motivated individuals with the right attitude and excellent skills who can hit the ground running in a fast-paced web startup. Ideal candidates will thrive in a tight-knit team environment, promoting their passion for software design by leading product teams and mentoring our growing development team.&lt;/p&gt;
&lt;p&gt;The main responsibilities of a senior &lt;span class="caps"&gt;PHP&lt;/span&gt; developer include:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Working with the senior developers and architects to provide leadership in technical design and architecture of the Moontoast platform&lt;/li&gt;&lt;li&gt;Setting estimates and expectations for new product development and implementing new features, tracking on target deadlines&lt;/li&gt;&lt;li&gt;Mentoring and leading developers by example through writing clean, well-documented, maintainable code and enforcing standards and best practices&lt;/li&gt;&lt;li&gt;Participating as an active Moontoast Guide in the Moontoast Developer Community&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Requirements&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;We are looking for:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;5+ years of experience with &lt;span class="caps"&gt;PHP&lt;/span&gt;&lt;/li&gt;&lt;li&gt;8+ years of experience with web development&lt;/li&gt;&lt;li&gt;Deep understanding of browsers and &lt;span class="caps"&gt;HTTP&lt;/span&gt;&lt;/li&gt;&lt;li&gt;Experts at object-oriented programming concepts and design patterns&lt;/li&gt;&lt;li&gt;Demonstrated ability to design and develop complex web services&lt;/li&gt;&lt;li&gt;Extensive experience with the Symfony framework and Doctrine&lt;/li&gt;&lt;li&gt;Working knowledge of version control systems (Subversion, Git, etc.)&lt;/li&gt;&lt;li&gt;BS in Computer Science/Engineering or equivalent experience&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;We would like to see:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;A passion for web development and an interest in sharing that with others&lt;/li&gt;&lt;li&gt;Independent thinkers with strong leadership qualities&lt;/li&gt;&lt;li&gt;Demonstrated ability to develop large-scale websites&lt;/li&gt;&lt;li&gt;Experience with service-oriented architectures, web services, and Cloud technologies&lt;/li&gt;&lt;li&gt;Knowledge of advanced data organization concepts, such as sharding&lt;/li&gt;&lt;li&gt;Experience with other &lt;span class="caps"&gt;PHP&lt;/span&gt; frameworks utilizing the &lt;span class="caps"&gt;MVC&lt;/span&gt; design pattern&lt;/li&gt;&lt;li&gt;Expert Linux development skills, from the command prompt to the web server&lt;/li&gt;&lt;li&gt;Open source project development experience&lt;/li&gt;&lt;li&gt;Developer community involvement (blogging, speaking, articles, Twitter, etc.)&lt;/li&gt;&lt;li&gt;Zend &lt;span class="caps"&gt;PHP&lt;/span&gt; 5 Certification&lt;/li&gt;&lt;li&gt;MS in Computer Science&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;We invite interested candidates to send resumes to &lt;strong&gt;hr [at] moontoast.com&lt;/strong&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/yKe3MXxv1G0" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Rebooting Nashville PHP]]></title>
    <link href="http://benramsey.com/blog/2010/04/rebooting-nashville-php/" />
    <updated>2010-04-26T22:29:41-05:00</updated>
    <id>http://benramsey.com/blog/2010/04/rebooting-nashville-php</id>
    <content type="html">&lt;p&gt;&lt;em&gt;I recently moved to Nashville, and as part of that transition, I&amp;#8217;ve taken the helm as the new organizer for the &lt;a href="http://nashvillephp.org/"&gt;Nashville &lt;span class="caps"&gt;PHP&lt;/span&gt; user group&lt;/a&gt;. I posted what follows to the Nashville &lt;span class="caps"&gt;PHP&lt;/span&gt; mailing list, but I thought it would be a good blog post. Enjoy!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://benramsey.com/archives/atlanta-php/"&gt;Six years ago&lt;/a&gt;, I founded the &lt;a href="http://atlantaphp.org/"&gt;Atlanta &lt;span class="caps"&gt;PHP&lt;/span&gt; user group&lt;/a&gt; (along with a few others), and I&amp;#8217;ve been organizing it since then. It&amp;#8217;s been a lot of hard work to grow and develop the &lt;span class="caps"&gt;PHP&lt;/span&gt; community in the Atlanta area, but it&amp;#8217;s also been rewarding to meet so many great people and to see them take interest in and become invested in the continued success of their &lt;span class="caps"&gt;PHP&lt;/span&gt; user group. I&amp;#8217;m proud to have been a part of building that community to the point where it can sustain itself without my involvement.&lt;/p&gt;
&lt;p&gt;Now, I&amp;#8217;m in Nashville. A few months ago, I moved here to &lt;a href="http://benramsey.com/archives/blasting-off-with-moontoast/"&gt;pursue a job with a local web start-up&lt;/a&gt;. I never had any intention of running the local &lt;span class="caps"&gt;PHP&lt;/span&gt; user group, but &lt;a href="http://www.willfitch.com/"&gt;Will Fitch&lt;/a&gt;, the former Nashville &lt;span class="caps"&gt;PHP&lt;/span&gt; organizer, contacted me to see if I would be interested in taking over the reins. He had moved out of the area and was no longer able to devote the time necessary to keep the group growing. I humbly accepted the torch, and that&amp;#8217;s why I&amp;#8217;m now the Nashville &lt;span class="caps"&gt;PHP&lt;/span&gt; organizer.&lt;/p&gt;
&lt;p&gt;There have been several incarnations of &lt;span class="caps"&gt;PHP&lt;/span&gt; user groups in the Nashville area over the past ten years, all with varied success. It is my hope to build on those successes and to grow a sustained community of members who are personally invested in seeing a vibrant and active &lt;span class="caps"&gt;PHP&lt;/span&gt; community in the Middle Tennessee area.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s a lofty goal that will require a lot of hard work, so I&amp;#8217;ll need your help. Nevertheless, I&amp;#8217;m up for the challenge, and I hope you&amp;#8217;ll join me in growing this community.&lt;/p&gt;
&lt;p&gt;First of all, a few matters of business:&lt;/p&gt;
&lt;ul&gt;&lt;li&gt;Nashville &lt;span class="caps"&gt;PHP&lt;/span&gt; will hold regular monthly meetings on the &lt;strong&gt;second Tuesday&lt;/strong&gt; of every month at 7pm at the same location each month. I am currently solidifying this location, and I&amp;#8217;ll let you know when details are finalized.&lt;/li&gt;&lt;li&gt;&lt;strong&gt;June 8 at 7pm&lt;/strong&gt; will be our first meeting. Location and topic &lt;span class="caps"&gt;TBA&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;Nashville &lt;span class="caps"&gt;PHP&lt;/span&gt; will continue to use &lt;a href="http://www.meetup.com/nashville-php/"&gt;Meetup.com&lt;/a&gt; as our central place for membership and meeting announcements and RSVPs.&lt;/li&gt;&lt;li&gt;I&amp;#8217;m dropping the discussion forums on Meetup.com in favor of a Google Group for discussions and job postings. Please join the &lt;a href="http://groups.google.com/group/nashvillephp"&gt;Nashville &lt;span class="caps"&gt;PHP&lt;/span&gt; Google Group&lt;/a&gt;.&lt;/li&gt;&lt;li&gt;Follow &lt;a href="http://twitter.com/NashvillePHP"&gt;@NashvillePHP&lt;/a&gt; on Twitter for community status updates. Also, if you have a Twitter account and you want to be listed on the &lt;a href="http://twitter.com/NashvillePHP/nashvillephp-devs"&gt;nashvillephp-devs&lt;/a&gt; list, let me know. I&amp;#8217;ll add you.&lt;/li&gt;&lt;li&gt;Join me on Freenode &lt;span class="caps"&gt;IRC&lt;/span&gt; in the #nashvillephp channel. If you&amp;#8217;re new to &lt;span class="caps"&gt;IRC&lt;/span&gt;, &lt;a href="http://en.wikipedia.org/wiki/Wikipedia:IRC/Tutorial"&gt;read this basic &lt;span class="caps"&gt;IRC&lt;/span&gt; tutorial&lt;/a&gt; to get started.&lt;/li&gt;&lt;li&gt;Employers and recruiters are welcome to post job opportunities to our discussion list. Before posting, please &lt;a href="http://groups.google.com/group/nashvillephp/web/posting-job-opportunities"&gt;read the rules&lt;/a&gt;.&lt;/li&gt;&lt;/ul&gt;
&lt;p&gt;Welcome to the new Nashville &lt;span class="caps"&gt;PHP&lt;/span&gt;! I hope you&amp;#8217;ll join me in making this community a success.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/dgOUohCx0Mo" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Blasting Off with Moontoast]]></title>
    <link href="http://benramsey.com/blog/2010/04/blasting-off-with-moontoast/" />
    <updated>2010-04-26T03:58:25-05:00</updated>
    <id>http://benramsey.com/blog/2010/04/blasting-off-with-moontoast</id>
    <content type="html">&lt;p&gt;Since I &lt;a href="http://twitter.com/ramsey/status/7412730762"&gt;announced on Twitter&lt;/a&gt; that January 15 would be my last day at &lt;a href="http://www.schematic.com/"&gt;Schematic&lt;/a&gt;, I&amp;#8217;ve received many positive responses and much encouragement. The biggest question, though, was where I would be going next.&lt;/p&gt;
&lt;p&gt;My decision not to be very public about where I was going had nothing to do with being secretive or stealthy. Instead, I wanted to make sure I could effectively communicate the business when I finally did announce where I was going. However, as time wore on, I put off blogging, over and over, to the point where it has been four months since I joined my new company, and I&amp;#8217;ve yet to blog about anything.&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s time to break my silence.&lt;/p&gt;
&lt;p&gt;Let me introduce you to &lt;a href="http://moontoast.com/" title="Moontoast: Together We Know Everything"&gt;Moontoast, the Social Commerce Network&lt;/a&gt;.&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://moontoast.com/" title="Moontoast: Together We Know Everything"&gt;&lt;img src="http://benramsey.com/media/img/moontoast_logo400.png" width="400" height="131" border="0" style="border:none;width:400px;height:131px;" alt="Moontoast: Together We Know Everything" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Moontoast is a &lt;strong&gt;social commerce network&lt;/strong&gt;. A social commerce network is a marketplace where businesses and people come together to pursue and promote their passions through personal relationships.&lt;/p&gt;
&lt;p&gt;Moontoast has three kinds of users:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Explorers&lt;/strong&gt; use Moontoast to pursue their passions and learn more by interacting with real-life people who have the knowledge, experience, and products Explorers are looking for. Moontoast allows Explorers to find, connect with, and create relationships with Guides, other Explorers, and Branded Communities.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Guides&lt;/strong&gt; use Moontoast to build a business and personal brand around their particular area(s) of expertise. Moontoast provides tools and resources to help Guides connect with their customers and market their ideas, skills, and products to the Moontoast Social Commerce Network and beyond.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Businesses&lt;/strong&gt; use Moontoast to build &lt;strong&gt;branded communities&lt;/strong&gt;. A Moontoast Branded Community generates new leads and creates new selling environments for businesses, and businesses can turn their employees, affiliates, fans, and members into revenue-generating branded Guides.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s Moontoast in a nutshell. While all of this might sound like boilerplate marketing verbiage, it&amp;#8217;s actually my own words about what Moontoast is.&lt;/p&gt;
&lt;p&gt;Moontoast is a startup, and we&amp;#8217;re still in the early stages. As with all startups, there are risks and considerations that must be made prior to joining one, as &lt;a href="http://caseysoftware.com/blog/joining-a-startup"&gt;Keith has outlined&lt;/a&gt;. As such, I didn&amp;#8217;t take my decision to join lightly, but I firmly believe this is the right opportunity at the right time and place. I&amp;#8217;ve moved to Nashville, TN to make this possible. My family is still behind in Atlanta, but they&amp;#8217;ll be moving to join me later this year.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve joined Moontoast as the Senior Software Architect, joining the team at a crucial stage in its development. Moontoast is built on top of a &lt;acronym title="Linux, Apache, MySQL, and PHP"&gt;&lt;span class="caps"&gt;LAMP&lt;/span&gt;&lt;/acronym&gt; stack, a tried-and-true platform for scalable websites, but we still have a lot of hard work ahead of us to ensure that we remain stable as our traffic increases, and that&amp;#8217;s part of my job. I&amp;#8217;ll also be focused on all the things that most software architects do: team leadership, mentoring, code quality, standards and practices, task management, performance tuning, security and hardening, data modeling, &lt;span class="caps"&gt;UML&lt;/span&gt; diagraming, lots of white-boarding, etc., etc.&lt;/p&gt;
&lt;p&gt;After just four months with Moontoast, I&amp;#8217;m still very excited to be a part of the team, and I believe we have a bright future ahead. I&amp;#8217;m also very fortunate to have the opportunity to work with &lt;a href="http://marcuswhitney.com/"&gt;Marcus Whitney&lt;/a&gt;, our &lt;span class="caps"&gt;CTO&lt;/span&gt; and co-founder—and fellow &lt;span class="caps"&gt;PHP&lt;/span&gt; community member. Marcus is a dynamic and charismatic individual who is dedicated to the advancement of a strong technology community in the Nashville and Middle Tennessee region. He&amp;#8217;s the primary reason I&amp;#8217;m here and the reason I&amp;#8217;m excited about the future of web technology in Nashville.&lt;/p&gt;
&lt;p&gt;You&amp;#8217;ll be hearing more from me in the days ahead, blogging and &lt;a href="http://twitter.com/ramsey"&gt;tweeting&lt;/a&gt; about things I&amp;#8217;m doing and learning as software architect at Moontoast. I hope you&amp;#8217;ll check out Moontoast and see what we&amp;#8217;re doing. I think many of you would make excellent Moontoast Guides and will find it very helpful in advancing your consulting offerings. We still have a lot of work ahead of us to make things painless, effortless, and full-featured for all users, but you can help by being an early-adopter and testing the platform and offering your suggestions for improvement and new features.&lt;/p&gt;
&lt;p&gt;Finally, I hope you&amp;#8217;ll also check out Nashville, TN. It&amp;#8217;s a great place to live and work!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/35d11nQvVR0" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[PHP Advent 2009]]></title>
    <link href="http://benramsey.com/blog/2009/12/php-advent-2009/" />
    <updated>2009-12-18T05:34:39-06:00</updated>
    <id>http://benramsey.com/blog/2009/12/php-advent-2009</id>
    <content type="html">&lt;p&gt;&lt;em&gt;Six years ago, I became aware of the &lt;span class="caps"&gt;PHP&lt;/span&gt; community. I joined it three years prior to that.&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m privileged to be a part of the 2009 edition of &lt;a href="http://phpadvent.org/2009"&gt;&lt;span class="caps"&gt;PHP&lt;/span&gt; Advent&lt;/a&gt;. This year, &lt;a href="http://phpadvent.org/2009/phps-not-just-a-language-by-ben-ramsey"&gt;my post is about the &lt;span class="caps"&gt;PHP&lt;/span&gt; community&lt;/a&gt;. If you have any comments, feel free to leave them here.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/ArI56MAeiB4" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Microsoft Web Dev Summit 2009]]></title>
    <link href="http://benramsey.com/blog/2009/12/microsoft-web-dev-summit-2009/" />
    <updated>2009-12-01T06:30:23-06:00</updated>
    <id>http://benramsey.com/blog/2009/12/microsoft-web-dev-summit-2009</id>
    <content type="html">&lt;p&gt;For the past three years, Microsoft has hosted the Microsoft Web Development Technology Summit, inviting a small group of community leaders, project developers, and prominent members of the &lt;span class="caps"&gt;PHP&lt;/span&gt; community, primarily for the purpose of eliciting feedback on how to better support &lt;span class="caps"&gt;PHP&lt;/span&gt; on Windows. I&amp;#8217;m privileged and honored to be invited back for a third year to the fourth annual edition of this summit.&lt;/p&gt;
&lt;p&gt;This is the first time I&amp;#8217;ve ever blogged about the event, though I&amp;#8217;ve taken &amp;#8220;live&amp;#8221; notes during the &lt;a href="http://tools.benramsey.com/dokuwiki/conferences:mswd07"&gt;2007&lt;/a&gt; and &lt;a href="http://tools.benramsey.com/dokuwiki/conferences:mswd08"&gt;2008&lt;/a&gt; summits. &lt;a href="http://tools.benramsey.com/dokuwiki/conferences:mswd09"&gt;I&amp;#8217;ll be taking notes again this year&lt;/a&gt;, if you&amp;#8217;d like to follow along, but I&amp;#8217;ll also be devoting several blog posts this week to the event because I think it&amp;#8217;s important.&lt;/p&gt;
&lt;p&gt;As I said, this is the Microsoft Web Development Technology Summit, but perhaps it&amp;#8217;s not very aptly named, since it could best be termed as the Microsoft &lt;span class="caps"&gt;PHP&lt;/span&gt; Summit. Then again, one could argue that &lt;span class="caps"&gt;PHP&lt;/span&gt; really is the server-side technology of the Web, so calling this a web development summit is appropriate, and I think Microsoft understands that. This is the first reason I think this summit is important: Microsoft recognizes the importance of &lt;span class="caps"&gt;PHP&lt;/span&gt; to web development.&lt;/p&gt;
&lt;p&gt;The second reason it&amp;#8217;s important follows closely on the heels of the first. Because &lt;span class="caps"&gt;PHP&lt;/span&gt; is important, Microsoft wants &lt;span class="caps"&gt;PHP&lt;/span&gt; to work as best as it possibly can in a Windows Server environment, eliminating all performance arguments in comparisons between Windows/&lt;span class="caps"&gt;IIS&lt;/span&gt; and Linux/Apache. This reduces the platform choice argument to one of subjective preference with no basis in objective analysis. This is good for Microsoft because many &lt;span class="caps"&gt;PHP&lt;/span&gt; developers continue to use Windows as their local development platform, while deploying to *NIX systems. All performance arguments out of the way, if developers can deploy to the same platform they use for development, would they?&lt;/p&gt;
&lt;p&gt;Other barriers for developers include cost and even open source philosophy (but mostly cost). Microsoft is eliminating this obstacle with their &lt;a href="http://www.microsoft.com/web/websitespark/"&gt;WebSite Spark&lt;/a&gt; and &lt;a href="http://www.bizspark.com/"&gt;BizSpark&lt;/a&gt; programs. The philosophy argument is addressed by licensing some Microsoft tools and libraries under Microsoft open source licenses (which include &lt;a href="http://opensource.org/licenses/ms-pl.html"&gt;&lt;span class="caps"&gt;BSD&lt;/span&gt;-like&lt;/a&gt; and &lt;a href="http://opensource.org/licenses/ms-rl.html"&gt;&lt;span class="caps"&gt;GPL&lt;/span&gt;-like&lt;/a&gt; licenses).&lt;/p&gt;
&lt;p&gt;There are many other reasons why this summit is good for Microsoft, but I&amp;#8217;ll end with a third one for this post. In the spirit of openness and transparency, open source communities tend to be very vocal and honest, often brutally honest. So, why would Microsoft invite a room full of &lt;span class="caps"&gt;PHP&lt;/span&gt; developers, where the common laptop present will be running Mac OS X, with a few Linux laptops sprinkled in the room, and even fewer Windows laptops? Our community doesn&amp;#8217;t hold back with our opinions. That&amp;#8217;s why. Each person in the room has ideas of how Microsoft can be better community citizens, provide better and easier to use products for developers, and improve support for &lt;span class="caps"&gt;PHP&lt;/span&gt; on Windows. We may not use that platform, but we all have ideas for how it can be better. I don&amp;#8217;t think Microsoft is kidding itself that it will convert us to its platform, but I do think they value our opinions and presence because our feedback will make their products better and we&amp;#8217;ll communicate the experience back to the greater &lt;span class="caps"&gt;PHP&lt;/span&gt; community (i.e. through blog posts such as this), improving their image.&lt;/p&gt;
&lt;p&gt;Do I think Microsoft has done anything positive with our feedback? You bet. In the years since the Web Dev Summit was first held in 2006, we&amp;#8217;ve seen improvements to &lt;a href="http://php.iis.net/"&gt;FastCGI in &lt;span class="caps"&gt;IIS&lt;/span&gt;&lt;/a&gt; and the introduction of the &lt;a href="http://www.codeplex.com/SQLSRVPHP"&gt;open source &lt;span class="caps"&gt;SQL&lt;/span&gt; Server native driver for &lt;span class="caps"&gt;PHP&lt;/span&gt;&lt;/a&gt;. I believe these improvements are direct results of the Web Dev Summit. And there are others. This year, the focus appears to be on developer tools, so we&amp;#8217;ll be having in-depth discussions on typical workflow and processes for developing a &lt;span class="caps"&gt;PHP&lt;/span&gt; project from start to finish. If you have suggestions for how Microsoft can improve their tools for &lt;span class="caps"&gt;PHP&lt;/span&gt; developers, let me know, and I&amp;#8217;ll pass them along.&lt;/p&gt;
&lt;p&gt;Finally, I&amp;#8217;ll leave you with this thought. Microsoft has seen many changes over the years. They are a behemoth of a company, and my perspective now is that there are two types of people in the company: the big company corporate types who are still convinced that closed and proprietary is the way to protect their products, brand, and customers and, on the other hand, the newer generation of product managers and developer evangelists who are making genuine attempts to be more open and transparent and finding ways to interact with the open source community to promote Microsoft as a good community citizen. Both are real faces of Microsoft. Don&amp;#8217;t discount one for the other.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/K_iqZWRlUgM" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CodeWorks Wrap-up]]></title>
    <link href="http://benramsey.com/blog/2009/12/codeworks-wrap-up/" />
    <updated>2009-12-01T00:36:42-06:00</updated>
    <id>http://benramsey.com/blog/2009/12/codeworks-wrap-up</id>
    <content type="html">&lt;p&gt;I never wrote about days 13 &amp;amp; 14 of &lt;a href="http://cw.mtacon.com/"&gt;CodeWorks&lt;/a&gt;, nor did I post the slides on
October 7, like I promised to attendees of my talks. After CodeWorks, my website
underwent weird spikes in traffic, causing it to be extremely slow. I thought
the problem was &lt;a href="http://www.dreamhost.com/"&gt;DreamHost&lt;/a&gt;, so I moved everything to a slice at &lt;a href="http://www.slicehost.com/"&gt;Slicehost&lt;/a&gt;.
Long story short, my slice kept crashing, so I moved everything back to DreamHost
after several weeks of intermittent uptime to let them deal with the problems.
That&amp;#8217;s what delayed my posting, and I apologize to those who have been looking
for the slides.&lt;/p&gt;

&lt;p&gt;To sum up &lt;a href="http://cw.mtacon.com/schedule/city/new-york"&gt;CodeWorks New York&lt;/a&gt;, I would have to say that the
energy and enthusiasm at the New York conference was, by far, the best of all
seven cities. The turn out was great, and the hallway track was the best yet,
with myriad discussions extending from the talks. I&amp;#8217;m not sure what made the
difference, but it was definitely the best stop.&lt;/p&gt;

&lt;p&gt;Seven cities in fourteen days. CodeWorks was a whirlwind tour, and I was
privileged to be a part of it. It was a pleasure to meet PHP developers in each
city and to talk with those who lead user groups, are starting a group, or are
thinking of starting one. And the talks were excellent, presented by some of the
best and brightest in the PHP community. It was an awesome experience, and I&amp;#8217;m
glad we were able to take the conference to developers rather than expecting the
developers to come to the conference. Though some cities had low attendance, the
quality of each event was never lessened. If the conference continues next year,
I think we&amp;#8217;ll see more attendees in each city.&lt;/p&gt;

&lt;p&gt;Yes, I would do it all again. So, I hope &lt;a href="http://blog.tabini.ca/"&gt;Marco&lt;/a&gt; sees fit to organize it next
year, or at least, every other year.&lt;/p&gt;

&lt;p&gt;I blogged every city we visited. If you&amp;#8217;re interested, here are those posts:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://benramsey.com/archives/codeworks-days-1-2/"&gt;Days 1 &amp;amp; 2: San Francisco&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://benramsey.com/archives/codeworks-days-3-4/"&gt;Days 3 &amp;amp; 4: Los Angeles&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://benramsey.com/archives/codeworks-days-5-6/"&gt;Days 5 &amp;amp; 6: Dallas/Ft. Worth&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://benramsey.com/archives/codeworks-days-7-8/"&gt;Days 7 &amp;amp; 8: Atlanta&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://benramsey.com/archives/codeworks-days-9-10/"&gt;Days 9 &amp;amp; 10: Miami&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://benramsey.com/archives/codeworks-days-11-12/"&gt;Days 11 &amp;amp; 12: Washington&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Days 13 &amp;amp; 14: New York (this post)&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;As promised, here are the slides for my presentations (finally):&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/u/ramsey/p/atompub-codeworks09"&gt;Web Service Design with AtomPub&lt;/a&gt; [&lt;a href="http://files.benramsey.com/talks/2009/codeworks/bramsey-atompub-codeworks09.pdf"&gt;download pdf&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/u/ramsey/p/http-codeworks09"&gt;Hidden Gems in HTTP&lt;/a&gt; [&lt;a href="http://files.benramsey.com/talks/2009/codeworks/bramsey-http-codeworks09.pdf"&gt;download pdf&lt;/a&gt;]&lt;/li&gt;
&lt;li&gt;&lt;a href="https://speakerdeck.com/u/ramsey/p/bramsey-memcache-codeworks09"&gt;Give Your Site a Boost with Memcache&lt;/a&gt; [&lt;a href="http://files.benramsey.com/talks/2009/codeworks/bramsey-memcache-codeworks09.pdf"&gt;download pdf&lt;/a&gt;]&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;I hope to see you next year!&lt;/p&gt;
&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/gq6fqY9vgzA" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[POST vs. PUT]]></title>
    <link href="http://benramsey.com/blog/2009/11/post-vs-put/" />
    <updated>2009-11-09T16:07:24-06:00</updated>
    <id>http://benramsey.com/blog/2009/11/post-vs-put</id>
    <content type="html">&lt;p&gt;This morning, &lt;a href="http://weierophinney.net/matthew/archives/228-Building-RESTful-Services-with-Zend-Framework.html"&gt;Matthew&lt;/a&gt; writes about building &lt;a href="http://www.ics.uci.edu/~fielding/pubs/dissertation/top.htm"&gt;RESTful&lt;/a&gt; services with the Zend Framework. I have a lot of thoughts on his post, and I might blog more about it later, but right now, I want to focus on &lt;a href="http://weierophinney.net/matthew/archives/228-Building-RESTful-Services-with-Zend-Framework.html#c24586"&gt;David&amp;#8217;s comment&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think the next thing you should cover is how to retrieve put parameters and maybe even attempt to start a discussion on the different school of thoughts about &lt;span class="caps"&gt;POST&lt;/span&gt; vs &lt;span class="caps"&gt;PUT&lt;/span&gt; (Especially in the &lt;span class="caps"&gt;PHP&lt;/span&gt; world).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I know I&amp;#8217;m even guilty of mentioning different schools of thought on &lt;span class="caps"&gt;POST&lt;/span&gt; vs. &lt;span class="caps"&gt;PUT&lt;/span&gt; in my talks, but the truth is that &lt;span class="caps"&gt;REST&lt;/span&gt; doesn&amp;#8217;t specify what to use for what actions. These are defined by &lt;span class="caps"&gt;HTTP&lt;/span&gt; and not by &lt;span class="caps"&gt;REST&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://roy.gbiv.com/untangled/2009/it-is-okay-to-use-post"&gt;Roy Fielding&lt;/a&gt; has this to say about the use of &lt;span class="caps"&gt;HTTP&lt;/span&gt; verbs in RESTful applications:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Some people think that &lt;span class="caps"&gt;REST&lt;/span&gt; suggests not to use &lt;span class="caps"&gt;POST&lt;/span&gt; for updates. Search my dissertation and you won’t find any mention of &lt;span class="caps"&gt;CRUD&lt;/span&gt; or &lt;span class="caps"&gt;POST&lt;/span&gt;. The only mention of &lt;span class="caps"&gt;PUT&lt;/span&gt; is in regard to HTTP’s lack of write-back caching. The main reason for my lack of specificity is because the methods defined by &lt;span class="caps"&gt;HTTP&lt;/span&gt; are part of the Web’s architecture definition, not the &lt;span class="caps"&gt;REST&lt;/span&gt; architectural style. Specific method definitions (aside from the retrieval:resource duality of &lt;span class="caps"&gt;GET&lt;/span&gt;) simply don’t matter to the &lt;span class="caps"&gt;REST&lt;/span&gt; architectural style, so it is difficult to have a style discussion about them. The only thing &lt;span class="caps"&gt;REST&lt;/span&gt; requires of methods is that they be uniformly defined for all resources (i.e., so that intermediaries don’t have to know the resource type in order to understand the meaning of the request). As long as the method is being used according to its own definition, &lt;span class="caps"&gt;REST&lt;/span&gt; doesn’t have much to say about it.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The &lt;span class="caps"&gt;POST&lt;/span&gt; vs. &lt;span class="caps"&gt;PUT&lt;/span&gt; debate, however, does rage on in different communities, and some protocols have defined their usage. For example, the Atom Publishing Protocol (&lt;a href="http://tools.ietf.org/html/rfc5023"&gt;&lt;span class="caps"&gt;RFC&lt;/span&gt; 5023&lt;/a&gt;) explicitly states in section 4.3 that &amp;#8220;&lt;span class="caps"&gt;POST&lt;/span&gt; is used to create&amp;#8221; and &amp;#8220;&lt;span class="caps"&gt;PUT&lt;/span&gt; is used to edit.&amp;#8221;&lt;/p&gt;
&lt;p&gt;The important thing to note is that &lt;span class="caps"&gt;REST&lt;/span&gt; doesn&amp;#8217;t care how the &lt;span class="caps"&gt;HTTP&lt;/span&gt; verbs are used, as long as they are used properly according to how they are defined in the protocol you are using.&lt;/p&gt;
&lt;p&gt;For those interested, &lt;span class="caps"&gt;HTTP&lt;/span&gt; (&lt;a href="http://tools.ietf.org/html/rfc2616"&gt;&lt;span class="caps"&gt;RFC&lt;/span&gt; 2616&lt;/a&gt;) defines &lt;span class="caps"&gt;POST&lt;/span&gt; by saying:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &lt;span class="caps"&gt;POST&lt;/span&gt; method is used to request that the origin server accept the entity enclosed in the request as a new subordinate of the resource identified by the Request-&lt;span class="caps"&gt;URI&lt;/span&gt; in the Request-Line. […] The actual function performed by the &lt;span class="caps"&gt;POST&lt;/span&gt; method is determined by the server and is usually dependent on the Request-&lt;span class="caps"&gt;URI&lt;/span&gt;. The posted entity is subordinate to that &lt;span class="caps"&gt;URI&lt;/span&gt; in the same way that a file is subordinate to a directory containing it, a news article is subordinate to a newsgroup to which it is posted, or a record is subordinate to a database.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;&lt;span class="caps"&gt;PUT&lt;/span&gt; is defined as:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The &lt;span class="caps"&gt;PUT&lt;/span&gt; method requests that the enclosed entity be stored under the supplied Request-&lt;span class="caps"&gt;URI&lt;/span&gt;. If the Request-&lt;span class="caps"&gt;URI&lt;/span&gt; refers to an already existing resource, the enclosed entity &lt;span class="caps"&gt;SHOULD&lt;/span&gt; be considered as a modified version of the one residing on the origin server. If the Request-&lt;span class="caps"&gt;URI&lt;/span&gt; does not point to an existing resource, and that &lt;span class="caps"&gt;URI&lt;/span&gt; is capable of being defined as a new resource by the requesting user agent, the origin server can create the resource with that &lt;span class="caps"&gt;URI&lt;/span&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With this line of thinking, you might come to the conclusion that &lt;span class="caps"&gt;POST&lt;/span&gt; is used for creation of a subordinate resource, while &lt;span class="caps"&gt;PUT&lt;/span&gt; could be used for both creation or modification of a resource. The important distinction is that &lt;span class="caps"&gt;POST&lt;/span&gt; identifies the resource for which the entity should be considered a subordinate; &lt;span class="caps"&gt;PUT&lt;/span&gt; does not.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/av0Nzykyf-s" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[Building Titanium with PHP]]></title>
    <link href="http://benramsey.com/blog/2009/10/building-titanium-with-php/" />
    <updated>2009-10-05T19:48:41-05:00</updated>
    <id>http://benramsey.com/blog/2009/10/building-titanium-with-php</id>
    <content type="html">&lt;p&gt;Several months ago, I started the process of embedding &lt;span class="caps"&gt;PHP&lt;/span&gt; into the &lt;a href="http://www.appcelerator.com/products/titanium-desktop/"&gt;Titanium platform&lt;/a&gt;. After several sprints of work, the Appcelerator team was finally ready to merge my work into their &lt;a href="http://github.com/appcelerator/titanium_desktop"&gt;master branch&lt;/a&gt;, and Martin Robinson worked to bring the implementation to maturity. The current release of Titanium Developer does not yet have the &lt;span class="caps"&gt;PHP&lt;/span&gt; support built in to the bundled &lt;span class="caps"&gt;SDK&lt;/span&gt;, and I&amp;#8217;m not sure when it will be released, so I thought I&amp;#8217;d share how to get a development version built with &lt;span class="caps"&gt;PHP&lt;/span&gt; support so you can start playing with it and even help the Appcelerator team by catching bugs in the implementation.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re not familiar with Titanium, it&amp;#8217;s a development platform that allows you to build native desktop applications for Windows, Mac OS X, and Linux using the Web technologies we use on a daily basis: &lt;span class="caps"&gt;HTML&lt;/span&gt;, JavaScript, &lt;span class="caps"&gt;CSS&lt;/span&gt;, Python, Ruby, and now &lt;span class="caps"&gt;PHP&lt;/span&gt;. Titanium is built on top of &lt;a href="http://webkit.org/"&gt;WebKit&lt;/a&gt;, and it includes a micro-kernel called Kroll that does all of the pre-processing and runtime processing of the code. Languages are modules in Kroll and are first-class citizens in the runtime environment. So, when using the runtime, you can pass objects back and forth between JavaScript, &lt;span class="caps"&gt;PHP&lt;/span&gt;, Python, and Ruby. This, however, can&amp;#8217;t be done when using pre-processing mode, but in that case, your &lt;span class="caps"&gt;PHP&lt;/span&gt; scripts will work just like you&amp;#8217;re used to them working on a web server.&lt;/p&gt;
&lt;p&gt;Since it may still be a while before the next release of Titanium that includes &lt;span class="caps"&gt;PHP&lt;/span&gt;, I&amp;#8217;ve decided to provide instructions here on how to build the &lt;span class="caps"&gt;SDK&lt;/span&gt; from the master branch and connect it to the Titanium Developer application. Sorry, but I don&amp;#8217;t have instructions for Windows; these work on Mac or Linux.&lt;/p&gt;
&lt;ol&gt;&lt;li&gt;Download (and install) Titanium Developer from &lt;a href="http://www.appcelerator.com/products/download/"&gt;http://www.appcelerator.com/products/download/&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Launch Titanium Developer and let it do its thing (you&amp;#8217;ll have to create an acct)&lt;/li&gt;&lt;li&gt;Now you may close it&lt;/li&gt;&lt;li&gt;You should now have a Titanium directory with the &lt;span class="caps"&gt;SDK&lt;/span&gt; in it at either:&lt;ul&gt;&lt;li&gt;&lt;code&gt;/Library/Application\ Support/Titanium/&lt;/code&gt; (Mac)&lt;/li&gt;&lt;li&gt;&lt;code&gt;~/.titanium/&lt;/code&gt; or &lt;code&gt;/opt/titanium/&lt;/code&gt; (Linux)&lt;/li&gt;&lt;p&gt;&lt;/ul&gt;&lt;/li&gt;&lt;li&gt;Now, build the development &lt;span class="caps"&gt;SDK&lt;/span&gt; to use with Titanium Developer. You&amp;#8217;ll need &lt;a href="http://python.org/"&gt;Python&lt;/a&gt;, &lt;a href="http://www.scons.org/"&gt;scons&lt;/a&gt;, a compiler, and possibly &lt;a href="http://github.com/appcelerator/titanium_desktop/blob/master/README"&gt;other prerequisites&lt;/a&gt;.&lt;br /&gt;
&lt;div class='bogus-wrapper'&gt;&lt;notextile&gt;&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;$&gt; git clone git://github.com/appcelerator/titanium_desktop.git
&lt;/span&gt;&lt;span class='line'&gt;$&gt; cd titanium_desktop/
&lt;/span&gt;&lt;span class='line'&gt;$&gt; git submodule update --init
&lt;/span&gt;&lt;span class='line'&gt;$&gt; scons dist&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/notextile&gt;&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;&lt;li&gt;Unzip the built &lt;span class="caps"&gt;SDK&lt;/span&gt; to some location. I like to use &lt;code&gt;~/.titanium-dev/&lt;/code&gt;&lt;br /&gt;
&lt;div class='bogus-wrapper'&gt;&lt;notextile&gt;&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;$&gt; unzip build/osx/dist/sdk-0.7.0.zip -d ~/.titanium-dev/&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/notextile&gt;&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;&lt;li&gt;Move Titanium Developer &lt;span class="caps"&gt;SDK&lt;/span&gt; out of the way and point to your build &lt;span class="caps"&gt;SDK&lt;/span&gt;&lt;br /&gt;
&lt;div class='bogus-wrapper'&gt;&lt;notextile&gt;&lt;figure class='code'&gt;&lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;span class='line-number'&gt;2&lt;/span&gt;
&lt;span class='line-number'&gt;3&lt;/span&gt;
&lt;span class='line-number'&gt;4&lt;/span&gt;
&lt;span class='line-number'&gt;5&lt;/span&gt;
&lt;span class='line-number'&gt;6&lt;/span&gt;
&lt;span class='line-number'&gt;7&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class=''&gt;&lt;span class='line'&gt;$&gt; cd /Library/Application\ Support/Titanium/
&lt;/span&gt;&lt;span class='line'&gt;$&gt; mv modules/ modules-old/
&lt;/span&gt;&lt;span class='line'&gt;$&gt; mv runtime/ runtime-old/
&lt;/span&gt;&lt;span class='line'&gt;$&gt; mv sdk/ sdk-old/
&lt;/span&gt;&lt;span class='line'&gt;$&gt; ln -s ~/.titanium-dev/modules modules
&lt;/span&gt;&lt;span class='line'&gt;$&gt; ln -s ~/.titanium-dev/runtime runtime
&lt;/span&gt;&lt;span class='line'&gt;$&gt; ln -s ~/.titanium-dev/sdk sdk&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/notextile&gt;&lt;/p&gt;
&lt;p&gt;&lt;/li&gt;&lt;li&gt;Now relaunch Titanium Developer.&lt;/li&gt;&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;You&amp;#8217;re now ready to build a project with &lt;span class="caps"&gt;PHP&lt;/span&gt;!&lt;/p&gt;
&lt;p&gt;Click Create to generate a stub project. I&amp;#8217;ll cover more about development with &lt;span class="caps"&gt;PHP&lt;/span&gt; in Titanium in the future, but let&amp;#8217;s get started by showing a &lt;a href="http://php.net/phpinfo"&gt;phpinfo()&lt;/a&gt; page.&lt;/p&gt;
&lt;p&gt;Open the &lt;code&gt;index.html&lt;/code&gt; file in the Resources directory of your project and add the following anywhere in the page:&lt;/p&gt;
&lt;p&gt;&lt;div class='bogus-wrapper'&gt;&lt;notextile&gt;&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='html'&gt;&lt;span class='line'&gt;&lt;span class="nt"&gt;&amp;lt;p&amp;gt;&amp;lt;a&lt;/span&gt; &lt;span class="na"&gt;href=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;phpinfo.php&amp;quot;&lt;/span&gt; &lt;span class="na"&gt;style=&lt;/span&gt;&lt;span class="s"&gt;&amp;quot;color:gray;&amp;quot;&lt;/span&gt;&lt;span class="nt"&gt;&amp;gt;&lt;/span&gt;See the phpinfo()&lt;span class="nt"&gt;&amp;lt;/a&amp;gt;&amp;lt;/p&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/notextile&gt;&lt;/p&gt;
&lt;p&gt;In the Resources folder, create the &lt;code&gt;phpinfo.php&lt;/code&gt; script and add the following to that script:&lt;/p&gt;
&lt;p&gt;&lt;div class='bogus-wrapper'&gt;&lt;notextile&gt;&lt;figure class='code'&gt; &lt;div class="highlight"&gt;&lt;table&gt;&lt;tr&gt;&lt;td class="gutter"&gt;&lt;pre class="line-numbers"&gt;&lt;span class='line-number'&gt;1&lt;/span&gt;
&lt;/pre&gt;&lt;/td&gt;&lt;td class='code'&gt;&lt;pre&gt;&lt;code class='php'&gt;&lt;span class='line'&gt;&lt;span class="cp"&gt;&amp;lt;?php&lt;/span&gt; &lt;span class="nb"&gt;phpinfo&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="cp"&gt;?&amp;gt;&lt;/span&gt;&lt;span class="x"&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;/figure&gt;&lt;/div&gt;&lt;/notextile&gt;&lt;/p&gt;
&lt;p&gt;Now, go back to Titanium Developer, click the Test &amp;amp; Package tab for your project, then click the Launch tab. To build and run your application for testing, click the Launch App button.&lt;/p&gt;
&lt;p&gt;You should now see a dark gray test page with the &amp;#8220;See the phpinfo()&amp;#8221; link you created. Click that link, and it should take you to the &lt;code&gt;phpinfo.php&lt;/code&gt; script you created with the proper &lt;code&gt;phpinfo()&lt;/code&gt; output. Congratulations!&lt;/p&gt;
&lt;p&gt;Visit the &lt;a href="http://www.codestrong.com/"&gt;Appcelerator Codestrong&lt;/a&gt; developer center for more information on building Titanium applications. Visit &lt;code&gt;#titanium_app&lt;/code&gt; on Freenode &lt;span class="caps"&gt;IRC&lt;/span&gt; to ask questions about application development. If you want to help develop the project and contribute &lt;span class="caps"&gt;PHP&lt;/span&gt; tests to it, join &lt;code&gt;#titanium_dev&lt;/code&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/mzMaE--gtkw" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CodeWorks Days 11 & 12 (Washington)]]></title>
    <link href="http://benramsey.com/blog/2009/10/codeworks-days-11-12/" />
    <updated>2009-10-03T21:51:07-05:00</updated>
    <id>http://benramsey.com/blog/2009/10/codeworks-days-11-12</id>
    <content type="html">&lt;p&gt;Departing Miami, I gazed upon the Atlantic Ocean as we cut through the clouds, making our way farther from the shore, and the thought occurred to me that this tour &amp;#8212; these two weeks &amp;#8212; has taken me from sea to shining sea across this great country. What a fitting thought to have as this next leg of the tour took us to Washington, DC.&lt;/p&gt;
&lt;p&gt;I have traveled the country and have engaged the &lt;span class="caps"&gt;PHP&lt;/span&gt; community face-to-face all across it. It has been a great experience and an excellent opportunity to connect with the &lt;span class="caps"&gt;PHP&lt;/span&gt; community at all ends of the United States. Perhaps a tour to other parts of the world is in order, to connect with the community on a global scale. If I&amp;#8217;m ever afforded that opportunity and privilege, then I will be certain to evangelize the &lt;span class="caps"&gt;PHP&lt;/span&gt; Community in each location, hoping to grow our community, bringing in new faces and new ideas.&lt;/p&gt;
&lt;p&gt;As I mentioned, our next stop was Washington, DC. Some of us took advantage of free time we had on the afternoon and evening of the tutorial day to visit the city and walk the Mall of the United States capitol. We walked from the Washington Monument to the World War II Memorial, along the Reflection Pool to the Lincoln Memorial, along the Viet Nam Wall, around &lt;a href="http://en.wikipedia.org/wiki/President%27s_Park#The_Ellipse"&gt;the Ellipse&lt;/a&gt;, and to the White House. &lt;a href="http://zmievski.org/"&gt;Andrei&lt;/a&gt; remarked that he was using this opportunity to &amp;#8220;consumate his &amp;#8221;https://twitter.com/a/status/3115337537&amp;quot;&amp;gt;citizenship&lt;/a&gt;.&amp;quot; Finally, we had dinner at the &lt;a href="http://www.ebbitt.com/"&gt;Old Ebbitt Grill&lt;/a&gt;, apparently the oldest saloon in Washington.&lt;/p&gt;
&lt;p&gt;After dinner, our small group met up with some of the other speakers and conference attendees at &lt;a href="http://www.lovethebeer.com/brickskeller.html"&gt;The Brickskeller&lt;/a&gt;, where we enjoyed each other&amp;#8217;s company and some great beer &amp;#8212; they have other 1000 beers.&lt;/p&gt;
&lt;p&gt;The session day went well. After some technical difficulties with my &lt;span class="caps"&gt;HTTP&lt;/span&gt; presentation, I managed to get started, and one of the attendees even remarked that he thinks my talk is perhaps the most important one at the conference. That&amp;#8217;s the best compliment I&amp;#8217;ve ever received. Everyone stayed for the end of my talk, which ran fifteen minutes late, eating into the lunch period. My AtomPub talk later in the day was much smoother in delivery.&lt;/p&gt;
&lt;p&gt;As I wrap up in Washington, I&amp;#8217;m left wishing that I had more time to explore the capitol, but now it&amp;#8217;s time to move on to New York and the last leg of our tour. I&amp;#8217;m one step closer to going home, and while I&amp;#8217;ve had a great time on the tour meeting new people, giving presentations, and hanging out with old friends, I&amp;#8217;m ready to go home to my family.&lt;/p&gt;
&lt;p&gt;I hope to see you at &lt;a href="http://cw.mtacon.com/schedule/city/new-york"&gt;New York CodeWorks&lt;/a&gt;!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/sfMRsypyHwA" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CodeWorks Days 9 & 10 (Miami)]]></title>
    <link href="http://benramsey.com/blog/2009/10/codeworks-days-9-10/" />
    <updated>2009-10-03T19:49:52-05:00</updated>
    <id>http://benramsey.com/blog/2009/10/codeworks-days-9-10</id>
    <content type="html">&lt;p&gt;&lt;a href="http://cw.mtacon.com/schedule/city/miami"&gt;Miami CodeWorks&lt;/a&gt;, so far, was the smallest conference but I still think some important connections were made, especially with regard to user group contacts.&lt;/p&gt;
&lt;p&gt;At the Microsoft happy hour on the second day of the conference in Miami, I was able to meet Brendon Van Heyzen, who is interested in starting up a &lt;span class="caps"&gt;PHP&lt;/span&gt; user group in Boca Raton. It seems that the Miami &lt;span class="caps"&gt;PHP&lt;/span&gt; user group has quietened down and gone silent, and he&amp;#8217;s interested in starting up a group for the Boca Raton &lt;span class="caps"&gt;PHP&lt;/span&gt; community. We had a great discussion, and I offered him some points of advice on how to start a group, and this reminded me of the user group starter package I&amp;#8217;ve discussed with &lt;a href="http://www.rafaeldohms.com.br/en/"&gt;Rafael&lt;/a&gt; and &lt;a href="http://www.dragonbe.com/"&gt;Michelangelo&lt;/a&gt;. I really need to push the &lt;a href="http://phpgroups.org/"&gt;&lt;span class="caps"&gt;PHP&lt;/span&gt; Groups&lt;/a&gt; initiative to get started on this.&lt;/p&gt;
&lt;p&gt;The two main pieces of advice I offered were to start a mailing list and then to find adequate meeting space. The mailing list is important to get discussion going and to see what kind of group the people in your area want to have. It will inform your search for meeting space so you can find the kind of space that will work best for the type of meetings you want to have.&lt;/p&gt;
&lt;p&gt;So, CodeWorks has been an excellent way to reach out to local leaders and people who want to start groups in their areas. If you&amp;#8217;re interested in starting a group, join the &lt;a href="http://phpgroups.org/"&gt;&lt;span class="caps"&gt;PHP&lt;/span&gt; Groups&lt;/a&gt; mailing list and introduce yourself.&lt;/p&gt;
&lt;p&gt;Rounding out our visit to Miami, I enjoyed some great Cuban food at &lt;a href="http://www.yelp.com/biz/puerto-sagua-restaurant-miami-beach"&gt;Puerto Sagua&lt;/a&gt;, and we actually managed to find some good beer at &lt;a href="http://www.theotheroom.com/"&gt;The Room&lt;/a&gt; in Miami Beach. It was a beer oasis in the midst of a desert filled with mojito sand.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/XkUwgFS0RJI" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CodeWorks Days 7 & 8 (Atlanta)]]></title>
    <link href="http://benramsey.com/blog/2009/10/codeworks-days-7-8/" />
    <updated>2009-10-01T15:48:18-05:00</updated>
    <id>http://benramsey.com/blog/2009/10/codeworks-days-7-8</id>
    <content type="html">&lt;p&gt;Atlanta was the mid-point stop on the &lt;a href="http://cw.mtacon.com/"&gt;CodeWorks&lt;/a&gt; tour, and since it&amp;#8217;s my home, I decided to use it as an opportunity to spend time with my family before heading off on the second half of the tour. As such, there was very little hallway track activity for me, but I did get a chance to make it to a few events.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m told that Atlanta has had the largest CodeWorks crowd yet. I took a quick look around at each of the rooms, and I believe it. Each presentation was well-attended, and I&amp;#8217;m proud to say that the &lt;a href="http://atlantaphp.org/"&gt;Atlanta &lt;span class="caps"&gt;PHP&lt;/span&gt; user group&lt;/a&gt; was well-represented this year; I saw lots of familiar faces.&lt;/p&gt;
&lt;p&gt;Speaking of Atlanta &lt;span class="caps"&gt;PHP&lt;/span&gt;, we had a good crowd at the &lt;a href="http://meetup.atlantaphp.org/calendar/11165442/"&gt;Meet the Speakers&lt;/a&gt; dinner on Monday night. Many of the speakers attended, as well as attendees and Atlanta &lt;span class="caps"&gt;PHP&lt;/span&gt; members. I want to thank &lt;a href="http://blogs.msdn.com/glengordon/"&gt;Glen Gordon&lt;/a&gt; and Microsoft for sponsoring the dinner. I think it was a great success, and we couldn&amp;#8217;t have done it without Glen&amp;#8217;s help. The only problem I have is that many people apparently treat &lt;a href="http://meetup.atlantaphp.org/"&gt;meetup.com&lt;/a&gt; &amp;#8220;yes&amp;#8221; RSVPs as mere suggestions. If there&amp;#8217;s a chance you&amp;#8217;re not going to make it, please &lt;span class="caps"&gt;RSVP&lt;/span&gt; &amp;#8220;maybe&amp;#8221; or &amp;#8220;no.&amp;#8221;&lt;/p&gt;
&lt;p&gt;I also want to thank &lt;a href="http://tetraboy.com/"&gt;Jeff Jones&lt;/a&gt; for hosting an after party as his place for many of the speakers. It was a lot of fun, and the beer was great.&lt;/p&gt;
&lt;p&gt;Now we&amp;#8217;re in Miami, and I&amp;#8217;m a bit behind on blogging,  but I&amp;#8217;ll post about the Miami CodeWorks stop later today.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/LmDLVTOBLBY" height="1" width="1"/&gt;</content>
  </entry>
  
  <entry>
    <title type="html"><![CDATA[CodeWorks Days 5 & 6 (Dallas)]]></title>
    <link href="http://benramsey.com/blog/2009/09/codeworks-days-5-6/" />
    <updated>2009-09-27T19:13:49-05:00</updated>
    <id>http://benramsey.com/blog/2009/09/codeworks-days-5-6</id>
    <content type="html">&lt;p&gt;Yesterday, the &lt;a href="http://cw.mtacon.com/"&gt;CodeWorks&lt;/a&gt; B-Team (the session day team, a.k.a. Team Awesome) ran into a bit of a travel snafu that actually worked out better for us. On the way to the airport in Los Angeles, we got stuck in traffic caused by an overturned cement mixer truck. And by overturned, I literally mean the cement mixer was lying flat on its back across the barrier separating the north bound from the south bound lanes. I&amp;#8217;m not sure how it was even possible, but there it was. &lt;a href="http://derickrethans.nl/"&gt;Derick&lt;/a&gt; took some video of the accident that he may or may not post later.&lt;/p&gt;
&lt;p&gt;The traffic caused our team to be late to the airport, missing our flight. However, we were able to quickly book standby tickets for the following flight, giving us extra time at the airport to eat, placing us on a plane that had WiFi access (our original flight did not), and giving many of us exit row seats. So, it all worked out in the end.&lt;/p&gt;
&lt;p&gt;The evening was short, due to our late arrival, but we still made it out to &lt;a href="http://www.laharanch.com/lahaciendaranch/"&gt;La Hacienda Ranch&lt;/a&gt;, apparently the home of the original frozen margarita. A highlight of the evening was being able to meet some of the gang from &lt;a href="http://dallasphp.org/"&gt;Dallas &lt;span class="caps"&gt;PHP&lt;/span&gt;&lt;/a&gt;, including Tim Stiles, whom I&amp;#8217;ve conversed with online but have never met. Afterwards, a few of us ventured into Fort Worth to have a few beers at &lt;a href="http://www.beerknurd.com/"&gt;The Flying Saucer&lt;/a&gt;. Special thanks to &lt;a href="http://blogs.msdn.com/joshholmes/"&gt;Josh Holmes&lt;/a&gt; of Microsoft for driving us around.&lt;/p&gt;
&lt;p&gt;As an aside, we &amp;#8212; &amp;#8220;we&amp;#8221; being the speakers and community leaders attending CodeWorks &amp;#8212; have been making lots of new friends with the Microsoft developer evangelists who have been in attendance. It seems that Microsoft has a new breed or new generation of dev evangelists who are genuinely interested in the &lt;span class="caps"&gt;PHP&lt;/span&gt; community, listening to us, and hanging out and having fun with us. For me, it&amp;#8217;s a welcome improvement, and I&amp;#8217;m not saying this as a surprise change I&amp;#8217;ve only observed this week; it&amp;#8217;s something I&amp;#8217;ve been seeing over the last few years.&lt;/p&gt;
&lt;p&gt;There have been a lot of great talks in &lt;a href="http://cw.mtacon.com/schedule/city/dallas"&gt;Dallas&lt;/a&gt;. In addition to the set of CodeWorks touring speakers, the local speakers from Dallas &lt;span class="caps"&gt;PHP&lt;/span&gt; have provided some excellent presentations. I was able to enjoy &lt;a href="http://blog.phpdeveloper.org/"&gt;Chris Cornutt&amp;#8217;s&lt;/a&gt; &lt;a href="http://joind.in/talk/view/719"&gt;B.S.T, Easy as 1-2-3&lt;/a&gt; presentation, and now I&amp;#8217;m sitting in Vance Lucas&amp;#8217;s &lt;a href="http://joind.in/talk/view/722"&gt;Object Oriented Apologetics&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The venue in Dallas is also excellent. We&amp;#8217;re staying at the &lt;a href="http://www.aa-conference-center-dolce.com/"&gt;American Airlines Training &amp;amp; Conference Center&lt;/a&gt;, and while it&amp;#8217;s not the fanciest of hotels, I think it has been the best hotel experience we&amp;#8217;ve had, with some of the best food and best WiFi we have seen yet. But we&amp;#8217;re not even half-way through the tour, so there is plenty of opportunity for this to change and for me to be wowed even more.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m heading home this evening. My home is Atlanta, and Atlanta is the next stop on our tour, so I&amp;#8217;ve scheduled a little family time during the tour, but I&amp;#8217;ll be joining the CodeWorks crew each day, tomorrow for the &lt;a href="http://meetup.atlantaphp.org/calendar/11165442/"&gt;Atlanta &lt;span class="caps"&gt;PHP&lt;/span&gt; Meet the Speakers Happy Hour&lt;/a&gt; and on Tuesday for my presentation.&lt;/p&gt;
&lt;p&gt;I hope to see you in &lt;a href="http://cw.mtacon.com/schedule/city/atlanta"&gt;Atlanta&lt;/a&gt;!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/ramsey/~4/cKvsORdE2Mk" height="1" width="1"/&gt;</content>
  </entry>
  
</feed>
