MattWalters.net Rebuild: Step 1

I recently relaunched my website using some best practices I’ve learned over recent years. This is the first part of a post series detailing some of the steps I took and why.

The first step of rebuilding my website was to get the structure set up.  I had run WordPress itself off of a checkout from Subversion for a while, but I typically took it a step further on client sites and wanted to do that with my site.  The real trick here is to setting it up in a way that you maximize external repositories, while still being able to support your theme and other supporting materials inside a version control service.  As I mentioned, Subversion supports what are known as “externals.”  These are references to other source code repositories.  They are ones that you support or that another developer maintains and makes publicly available.

The first step is to set up a repository of your own.  I run a subversion server on one of my servers.  But you can also find hosted services that offer repositories such as http://svnrepository.com/.  This will allow you to check out a local working copy and start building your site.  The next step is to do some minor setup in your repository.

WordPress has a Subversion repository which follows the standard practice of tagging versions.  You can think of a tag as a snapshot of code.  Many plugins are also hosted by WordPress.org which offers plugin/theme hosting.  Theme and plugin authors check in their code to a subversion repository and once you know the basic URL structure, anyone can check it out anonymously.  The themes and plugins also typically follow the branch/tag/trunk structure.  However, for your theme, I would not recommend referencing it as an external.  You wouldn’t be able to check your changes into your repository.  It would be better to download it and add it to your repository or to export it into your sites directory structure and add it to your repository.  If you were going to build a child theme off it, referencing it as an external might make sense.  It all depends on what you need to do.

Here are the basic steps I take to set up a site:

  1. Create subversion repository
  2. Check out repository on my local machine
  3. Add branch/tags/trunk folders
  4. Create “database”, “graphics”, “providedItems”, and “src” directories inside the trunk directory
    1. Database stores content/structure dumps of my local development database
    2. Graphics stores design assets from the sites designer or my PSD files created for the site
    3. Provided Items stores things like copy, and other misc items related to the site
    4. Src will be the site root
  5. Move into src directory
  6. Create external reference to WordPress subversion tag for a folder called something like “wp”
    1. You can do it however you would like, but cannot install WordPress in the root.  It’s ok though because you can put an index.php in the site root that will include WordPress and use WordPress’s configuration settings so that the wp directory doesn’t display in your sites URL.
  7. Create content directory, then inside of content, themes, plugins, uploads
    1. This is basically a recreation of the wp-content folder.  You use one outside of the WordPress folder because WordPress is now an external reference, and you can’t check items into WordPress’s repository.  By moving the wp-content directory, you can check in things like your themes/plugins into your repository and still enjoy version control.
  8. Create a folder in /content/themes/ for my theme and add in the theme I will be building from
    1. I have maintained a fork of the Sandbox theme for a while now, but have never made it publicly available, I may do that sometime soon.  But it’s basically a very generic theme that offers lots of CSS classes/ID’s and has some customizations I’ve made to it to make certain things easier (like including page specific JS/CSS, etc).
  9. Back in the site root, create index.php, add a favicon.ico, robots.txt
    1. You should always include a favicon.ico file, even if it is just a blank one.  Browsers automatically request it, and if it does not exist then WordPress still “spins up” to serve a 404 error, increasing server load.  You can also block favicon.ico requests at the .htaccess level if you prefer.
  10. Create a wp-config.php in the site root and do configuration edits, setup database, etc
    1. One of the key edits here will be telling WordPress that you have moved the wp-content folder.  The WordPress Codex has a pretty good write-up on edits you can make to wp-config.php.
  11. Go through install process with WordPress
  12. In the /content/plugins/ directory, I add external references for any plugins I plan to use for the site which point at the latest release tag for that plugin
    1. I have some standard plugins I always include in installs, but you can include any other plugins that you would like.  Some of the default ones I always install are the Google XML SiteMap generator, All In One SEO Pack, and WordPress File Monitor.
  13. Activate plugins in the WordPress admin
  14. Activate theme in the WordPress admin
  15. Perform any default settings in WordPress admin
  16. Export data/structure of database and add to the /trunk/database/ folder
  17. Develop theme

At certain points you might need to commit your changes to Subversion so that you can do an “svn update” and get all the files for the external references you setup, but this post isn’t really meant to be a full Subversion how-to.  Feel free to ask questions if you need to in comments and I’ll try to help out.  In the end you end up with a structure something like this:

  • Repository Root/
    • branches/
    • tags/
    • trunk/
      • database/ – Store database exports here
      • graphics/
      • providedItems/
      • src/
        • content/
          • plugins/
            • Plugin 1 – svn:externals reference
            • Plugin 2 – svn:externals reference
            • Plugin 3 – svn:externals reference
            • <etc>
          • themes/
            • <Your Theme>/
          • uploads/
        • wp/ – svn:externals reference
        • index.php
        • favicon.ico
        • wp-config.php

I think that pretty much covers the setup, but if something doesn’t make sense, feel free to ask questions.  Once you have this structure setup, you’re free to develop your theme and check it into your repository / enjoy source code versioning.  Once you’re ready to launch the site, you can either export your repository and upload it to the server, or if you want to be fancy you can check the repository out on your server and let the site run off it so that if you need to do updates later, all you’ll have to do is log in to the server and run an “svn update” to deploy.

New Site

If you see this post, the new site should be up, feel free to take a look :)

I still need to do some work on it, but I figured it is ready enough to be live.  I’m working on figuring out exactly what I want the homepage to be, and some of the overall site needs some finesse, but this is definitely a step in the right direction.

I interrupt this silence to bring you an important message …

Those of you that have been around me, any at all, over the past 6-8 months know that I’ve been working hard on educating folks in the area about WordPress1.  For whatever reason it is something that I really have a passion about and for once in a really long time I’ve been pursuing that passion.  It all started earlier this year.  I had been reading a lot about WordCamp’s and really wished one was happening closer by.  So I sent out this tweet:

You would not believe how hard it was to find this tweet ...

You would not believe how hard it was to find this tweet ...

From there, the train started rolling and there was no stopping it.  Folks started replying.  I started getting ideas for topics and before I knew it WordCamp Richmond was born.  I have many people to thank for helping me make this happen, Chris Gatewood of Hirschler Fleischer, Andrew Miller of Your Search Advisor, Eddie O’Leary of CoLaB Multimedia, Business Bullpen, and all of the speakers that gave up their time to prepare presentations and then gave up an entire Saturday to share their knowledge with all those in attendance.  I am grateful to all of them, and all those who attended.

Over the past months I have been busy helping individuals with their WordPress sites, building some sites for clients of my own and expanding my knowledge around WordPress as a whole.  Many people in the area seek me out when they have a question about WordPress, and that makes me happy.  I’m glad that I’m able to give back some to the community that I have taken so much from.

It has become quite hectic these past couple of months.  I’ve been rolling multiple freelance projects at a time, small things here and there, but they’ve been slowly and steadily growing in complexity and size.  I’ve come to the realization that it’s time for me to take the next step in this evolutionary process.  I have decided to start my own business (after much prodding from my friends).  I recently was told by my lawyer (Chris Gatewood of Hirschler Fleischer by the way) that the formation of my LLC has been made official.  We’re just waiting for the SCC to send the certificate in the mail.

I am excited beyond belief at the idea of this.  I have met with an accountant and lawyer to make sure my ducks are in a row.  I’m signing up for insurance for the business to make sure I’m all official and protected.  I’ve gone through almost all of the motions needed at this point.  I’m also excited about continuing to give back to the community.  WordCamp Richmond will continue to be an annual event, I will continue to help folks, develop plugins and hopefully much more.

So what’s left you might ask?  Well, I’m still in the process of getting my website built.  I am teaming up with studioSavvy to have a design produced for the site.  We’ve worked together on a couple of projects now and I look forward to many more with them.  They’re fantastic if you ever need design work done :)

Other then that though, my plan is to continue working my current full time job and continue to grow the business.  Once I finally reach that tipping point I hope to be able to securely walk away from working for someone else and never look back.  This is something that I know I can make happen, and I can be very “dangerous” once I’ve made up my mind about something.

I will be releasing more information about my new company in the near future, and hopefully will have the website ready to launch by the end of the year.   But that doesn’t mean I’m not open for business right now :)  So if you’re in the need of some custom WordPress work (theme development, plugin development, or anything else), please think of me and please refer your friends to me.  I promise not to let you down.


1 Oddly enough though … I rarely find time to blog my thoughts ;) I hope to change that.

WordPress File Monitor gets a little "press"

As some of you may know, one of the plugins I’ve written for WordPress is WordPress File Monitor.  It basically keeps a listing of the files on your website and sends you an email alert as well as displaying an optional dashboard alert whenever a change is detected (a change is defined as a file being added, deleted, or modified).

Recently, Brad Williams included it in his WordPress security presentation at WordCamp Montreal.  You can view the slide deck from his presentation on SlideShare.  WordPress File Monitor is listed under Recommended Security Plugins on slide 37.

Custom Fields in WordPress

While working on a site recently, a common problem was run into using WordPress as a full fledged CMS. The issue was needing to have multiple content areas within the same Page. For a developer (front end or back end) this typically isn’t an issue, even inside of WordPress. Since the content area allows you to insert custom HTML a developer can just flip to HTML view and position things on the screen how they see fit. However, that’s not always a viable option when handing over content management to your client. The client may not have the knowledge nor the desire to learn HTML on their own. This can leave the theme creator in a difficult position. Luckily WordPress provides Custom Fields as one way to help get around this predicament.

Custom Fields in WordPress can be used for many things:

  • Assigning images to Posts (featured image or thumbnail)
  • Serving as a data source for content to be loaded via Ajax
  • Providing multiple content areas for a Page (custom sidebar for instance)

One “gotcha” of using Custom Fields to solve this issue is that the size of the input area is limited. There are possible ways around this limitation, but they’re outside the scope of this Post so we’ll save that for another time. Putting that all aside though, they can definitely help get you to where you need to be.

Custom Fields have two components, “Name” and “Value.” If you’re of the developer mindset, think of it as a simple key-value pair. You can have multiple identical keys even on the same Page/Post. Once you have used a key once it then becomes available from the select box on future Posts/Pages, making it easier to reuse custom fields for similar operations on other pages. You can use get_post_meta() anytime the WordPress core has been loaded for the Page view and you have access to a Post or Page ID.

Let’s take the third example, providing multiple content areas for a Page, as an example in using Custom Fields in your theme. We’ll be using get_post_meta(). Here are some basic steps to move towards putting this all together:

  • Edit a Page you would like to add a unique sidebar to
  • Add a custom field name of “sidebar”
  • Add any content you would like to the value field
  • Save your Page
  • Create a Page template file inside your theme directory
  • At the top of the template file add this PHP code:
$sidebar_content = get_post_meta($post->ID, 'sidebar', false);

Some explanation:

  • $post->ID feeds the primary key of the Post or Page that is being displayed by your theme
  • ’sidebar’ is the “Name” or key for the custom field you added to your Page in the WordPress Admin
  • false tells get_post_meta() to return an array of key-value pairs for the requested key. If set to true, it would return a single result as a string.

From here, adding the extra content to your Page template is fairly simple. Perhaps you have a sidebar container you would like to place it into. You could use this PHP code to do that:

foreach ($sidebar_content as $content) {
  echo '<p>' . $content . '</p>';
}

The above example would loop through each Custom Field you had added with the name ’sidebar’ and would display its content wrapped in a paragraph tag.

Using this overall approach you can now add custom content areas to specific Pages or expand upon the idea to perform other customizations such as easily formatting a thumbnail for a Post/Page. By using a custom field for the thumbnail, you can then format the thumbnail differently based on the context it is being displayed in, as opposed to just inserting it into the copy area of the Post/Page. For instance, if you wanted to wrap the copy around the image when displaying it as a full Post or Page you could do so, but if you wanted to display recent Posts on your homepage with the copy blocked to the right of the image, that now becomes easy as well (it’s just a matter of html/css markup at that point).

WordPress File Monitor

I’ve released a new WordPress plugin called WordPress File Monitor.  Essentially, it keeps track of what files are installed in your WordPress install (or site) and watches for files being added/deleted/changed.  One catch is that it does rely on WordPress being able to load in order to do its work.  So if the malicious individual totally brings your site down, or removes WordPress from loading somehow, it won’t work.  However, a lot of the hackers out there have gotten to where they like inserting code into your WordPress pages, sometimes code that you can’t even see because they make it only show up to search engines.  This plugin will help protect you against that by alerting you when the changes are made or a file of theirs is added to your system.

Currently for tracking changes to files, it is just comparing the modified date of the file.  Eventually I hope to make this more robust.  Another note is that there is an option to exclude paths from what is being monitored by the plugin.  If you use a plugin like WP Super Cache, it is highly recommended that you exclude its cache directory from being scanned.  Otherwise you will constantly be notified of changes made to the cache files.  In a future release I hope to make it auto detect WP Super Cache and not monitor those files.  I also would not set it to scan more then every 15 minutes or so.  Otherwise you run the risk of the plugin scanning your entire site every time someone visits your site, and that’s unnecessary load on the server.

Additionally, keep in mind, this is currently a pre-release beta.  So if you find bugs, please let me know on the plugin page.

One final note … you should always be aware of what is on your site.  This plugin will not replace you doing periodic scans of your site to make sure files haven’t been added or changed.  I make no promises whatsoever of its ability to catch all changes to your site.  In the end that responsibility rests with you and you alone.  So keep an eye on your site, and hopefully this plugin will help you with that job.

Ask Matt: Question from Bobby

Bobby asks:

What is the best web language today?
What is the worst web language?
Does the practice of one vs another show the capabilities of the developer, or the limitations of the task?

Those are some tough questions to answer.  I’ve somewhat talked about this before.  I would probably say that the problem is the question is too broad.  I’d really need to ask back, “better in what way?”

My personal opinion, and I point out that it’s merely my opinion because I’ve been pulled into debates with folks that disagree on this, is that the visitor/end-user’s experience is what matters the most (you have to draw your line in the sand somewhere, that’s where mine is).  I feel that most of the currently popular web languages are capable of producing the same result to the end user, so the developer should use what they’re most comfortable with, whether that be .NET, PHP, Ruby, etc.  You’re going to be able to find clients that will let you develop in any of those languages, so that’s not a sticking point to me.  It’s difficult to go much further beyond that without more definition around the question.  For instance if you wanted to take it down to OOP, one language might start shining compared to another, or if it was an issue of smallest learning curve, another language might take the spotlight.

I know some other folks that argue it’s whoever the client is might dictate the language, and I see merit to the argument, however I’ve also found that you can lead a client towards a particular language under many circumstances, aside from them already having an internal environment setup that they want you to develop for (although I’ve also had clients willing to setup an environment just for what I’m building them).  So, all that to say, there’s a lot of exceptions/gray area.

I personally prefer PHP for web development.  It has a low learning curve, outstanding centralized/maintained documentation (seriously … it blows the rest out of the water when it comes to documentation in my opinion), and an amazingly strong community behind it.  It’s also a strongly proven language for web development.  All one has to do is look at Facebook, Wikipedia, Digg, WordPress, etc, and you can see it hard at work.  Yahoo! also has a strong presence in the PHP community which has led to some great API’s for search, geocoding, mapping, etc.  Most of their services have an API, and most of those API’s will return results in serialized PHP, making developing on top of them very easy.

As for the second question, which is worst, I’m not sure I can answer that for many of the reasons I outlined above.  There are some horrible ones out there, but they likely started to scratch an itch, you can’t necessarily blame the language if it got bent out of it’s original purpose.

The third question is an interesting one.  I think I would likely argue that it would show the capabilities of the developer.  Given that I view choosing the correct language as what the developer is most comfortable with, I’m not sure that I could answer any other way.  I’ve yet to see a webapp/website built on a language such as Ruby on Rails/.NET/etc that I couldn’t replicate in PHP.  I might not be able to replicate something made in .NET in Ruby/on Rails, however that is not a fault of Ruby, it’s a fault of my knowledge of the language.

Anyhow, sorry it took so long for me to write an answer, it’s been a busy week.  Hope that at least somewhat answers how I feel about the questions.

This post is part of Episode 6 of the weekly Ask Matt Series.

Front End Web Development Best Practices

I’ve been doing lots of research lately on efficiencies you can put in place on your website to make it more efficient from a load time perspective, which gives a better experience for your visitors.  The problem is none of the sources I’ve been reading from seem to want to put it all together in one place.  I’m hoping to do that here.  We’ll work from the ground up.  Here are some things that every user should be able to do, even in a shared hosting environment where you don’t have direct control over the server configuration.

One thing I will not be doing is giving Web Dev 101 instructions.  Even though any user should be able to do this, for some of the items, you should have a basic understanding of things such as what an .htaccess file is and basically how it works.  None of this is too terribly advanced however, so don’t worry too much if you’re still learning these things.

.htaccess
There are several items you can typically control with your .htaccess file to provide for a slip streamed experience when visiting your website:

Expires Headers:
In general, it’s fine to let the visitor cache your site.  By properly setting your content expiration, you can prevent the visitor from having to re-download content that their browser has already received:

<IfModule mod_expires.c>
  ExpiresActive on
  ExpiresDefault "access plus 10 years"
</IfModule>

Gzip JavaScript and CSS:
With sites offering richer experiences these days, the number and size of the JavaScript and CSS files are starting to get unwieldy. Luckily it’s rather easy to compress these types of components, allowing them to be downloaded more quickly:

<IfModule mod_deflate.c>
  <FilesMatch "\.(js|css)$">
    SetOutputFilter DEFLATE
  </FilesMatch>
</IfModule>

Configure ETags:
Yahoo! probably does a better job explaining the ETag situation then I can. But the basics of it are that, especially in a scenario where multiple servers serve your content, the ETag check (which helps the browser figure out if an item is cached or not) can end up needlessly costing more time when requesting data. It’s fairly easy to turn off:

FileETag none

CSS
Minify CSS and use a <link> to include it at the TOP of the page: Minifying your CSS will reduce the overall file size allowing it to be more quickly downloaded. Basically the idea is to remove spaces/tabs/linebreaks. Browsers don’t need those things in order to interpret the files. So for instance, instead of having:

#my_wrapper {
    border: 1px solid #000;
    padding: 0px 10px;
    color: #FF0000;
}

You would instead have:

#my_wrapper {border: 1px solid #000; padding: 0px 10px; color #FF0000;}

Many stylings have shorthand versions you can make use of. For instance instead of:

#my_padding {padding-top: 5px; padding-right: 10px; padding-bottom: 5px; padding-left: 10px;}

This can be simplified to:

#my_padding {padding: 5px 10px 5px 10px;}

Actually, with the shorthand, you can take it one step further:

#my_padding {padding: 5px 10px;}

For the padding style, it basically works like this:

padding: 5px; /* Apply 5px to all 4 sides */
padding: 5px 10px; /* Apply 5px to top and bottom, 10px to right and left */
padding: 5px 10px 15px; /* Apply 5px to top, 10px to right and left, 15px to bottom */
padding: 5px 10px 15px 20px; /* 5px to top, 10px to right, 15px to bottom, 20px to left */

JavaScript
Minify JavaScript and include it at the BOTTOM of the page. JavaScript can notoriously slow down the loading of a page. Basically, if the browser complies with the standards, it can only request two items to parallel download from a site. By including it at the bottom of the page, the browser won’t start trying to fetch it until towards the end, allowing your page to be largely (if not completely) rendered. Minifying the JavaScript is largely the same idea as it is with CSS. There are also some tools to help minify your JavaScript online.

Images
Typically you’ll be presented with the option of saving images either as GIF or JPG. If you’re using a tool like Photoshop (which you probably should be), you can usually preview the image as both JPG or GIF. I’d highly recommend viewing it as both and look in the lower left of the Save for Web screen. It will tell you the size of the image you are previewing. You want to achieve a good balance between the quality of the image and the size of the file. It’s not too hard to do.

One thing worth mentioning is that if you have multiple background images, you might want to try putting them all in one file (assuming you don’t need it to endlessly repeat along the x or y axis). By doing this (and then hiding the portions of the image you don’t need in a particular area on the page) you lower the number of HTTP requests that the visitors browser needs to issue to get all your background images. This can decrease the page load time.

GIF Format:
GIF is a non-lossy storage format for images. Unfortunately it is limited to 256 colors, however can be a great format if the image you are wanting to serve to your visitors meets some basic criteria. Since it is non-lossy, the image will be viewed exactly as it was originally saved. It also supports transparency and animations. I’m not big on the animations part, but as a web developer, transparency in images is basically a necessity with some of the layouts we have to pull off at times. If you’re using Photoshop as mentioned above, you can experiment with adding or removing colors that will be available in the saved image, but I find Photoshop typically does a pretty good job on its own of determining the best palette to serve with the image.

JPG Format:
When you have more then 256 colors and need to really compress them down, you might have to go JPG. JPG supports millions of colors, making it good for photographs as an example. JPG’s should give you an option for Quality when saving them (usually in percentage points). Using Photoshop, you can play with different Quality settings and preview each. This has a lot to do with what I mentioned before where you’re wanting to achieve a balance between quality and size of the saved file.

Anyone have any other tips for efficiencies or see any corrections I need to make in my post? I would love to grow this post into a great resource for this kind of thing.

Development Environment up

Well, I decided to install Leopard not too long ago. When I did it, I decided to go with a clean install, which meant basically destroying my development environment. So I finally went through and got everything setup so I can have local URL’s for sites I’m working on, MySQL, Apache/PHP, etc. I have to admit, I am pretty impressed with how it’s all come together. I feel like I could really get some things done with this setup.

I’ve also improved with my SVN knowledge recently, and have even been investigating git, which I must say, has some neat features.  I’m just not sure that it’s the route I want to go at the moment. Actually, a repository of some sort is the only thing I’m really lacking at the moment. Where I’m hosting my website runs a SVN server, so I can setup repositories there. But, I’ve sort of become a trac junkie, and they don’t have that installed and hooked up to SVN. I know of a decently priced service that makes the whole SVN/Trac thing so easy, but I don’t really have enough going on at the moment to make it worth spending money on for personal stuff.

I could always go for github, which is an option, but I really enjoy having trac.

Anyhow, sadly I have pretty much zero freelance work at the moment (I’ve been turning it down for the most part, except for some really small projects), and I don’t have any ideas for things I’d like to make. So I suppose now that I have this all setup and figured out … all I really need is an idea. /sigh

I’ve been considering trying to get into the WP community, but I guess I’m somewhat nervous about the idea to be honest. I’ve never really contributed to an open source project, certainly not one as massive as WP has become. I’m not even sure where I’d begin, heh. It would be cool to solve a bug or something and have it committed. There’d be a feeling of accomplishment there.

My language is better then yours … (Part 2)

Jim decided to respond to my post regarding language vs. language debates, specifically looking at PHP and Ruby / Ruby on Rails. He makes some good points, but there is some stuff that I’d like to respond to and clarify…

To say that one language is better than the other is meaningless. Better in what way? The question should always be asked in a particular context.

I definitely agree, in general, I’m just tired of language vs. language debates … more on that in a moment.

I don’t want to talk about the ads, though, because they have their own agenda and it certainly doesn’t match mine.

Works for me, but keep in mind that most of my original post was working towards making the point that the video’s were doing an apples to oranges comparison of PHP (minus framework) to Ruby on Rails. Jeremy and I disagreed on the validity of this comparison.

For me, that’s why I am using open-source tools in the first place.

For me, the bulk of my language preference comes from language philosophy.

but for my tastes, I appreciate the additional power that Ruby metaprogramming allows.

These are some key points that I can agree with, but again, more on that in a moment…

PHP =~ COBOL is not an analogy I would make, but at the same time I’d urge you to consider your claim “You’ll always be taking over a Java project or a .NET project or a PHP project” in light of COBOL, or FORTRAN, or VAX or any other platform that’s been a dominant success in the past. Current popularity is no guarantee of future popularity. In our industry, better mousetraps are ruthlessly adopted.

I totally agree, as I even said, I can see PHP going by the wayside one day, but today is not that day, and I still believe it’s extremely premature to be concerning myself with but so much. It seemed Jeremy was arguing that Ruby on Rails projects are more easily taken over, so my counterpoint was simply that RoR, like any other language, is not likely to be so widely adopted that his point would ever really become something you could rely on. Just to be sure I’m clear, I’m saying that it is unlikely that RoR will become so widespread that you can count on commonly taking over other RoR projects. This is not me slamming RoR, the same statement could be made in the direction of PHP, .NET, etc. You’ll always be taking over projects built on other platforms. Even as a PHP developer I experience this commonly. Just the other day I had to take over a .NET project and we chose to redo it in PHP for various reasons. I hope that’s clear, and if it’s not I wish someone would ask the questions I need to answer to make it clear.

If your focus, like in your last paragraph, is only on user experience (by which I think you mean developer experience), then language preference may truly not matter. But if your focus as a developer is on avoiding future “forced” language changes, then it might make more sense to attempt to determine which new technologies might eventually usurp the old. My claim is that Ruby and Rails are better positioned to do so that PHP and its framework set.

Ok, finally to the point I kept putting off above. I actually was not speaking of developer experience. I was speaking of end-user experience, the folks that visit our websites. THEIR experience is what matters in the end. PHP, RoR, .NET, etc are all capable of providing similar, if not identical user experiences. So if I prefer to provide that user experience with PHP, using mainly procedural based programming, then why not? If you want to do so with RoR, or any other platform, then more power to you. As you indicated, there are things about RoR that make you prefer it over PHP. I see no problem with that. But to say those ways are better then mine, if achieving a particular user experience is the ultimate measure, is sort of pointless, unless you disagree that the languages are capable of producing similar/identical experiences.

I also want to comment on the fact that it seems in these conversations I keep getting pegged as being resistant to change, not eager to learn new languages, etc. To be blunt, it’s pissing me off. I’ve lost count of the languages that at some point I’ve been well-versed in, let alone the languages I’ve “dabbled” in. Just because I’m not actively learning RoR at the moment, does not mean that I think PHP is Gods gift to programming nor does it mean that I am resistant to new languages as a whole. PHP has its flaws. One day it will be replaced (just like .NET, RoR, and even Java) but I don’t think that day is tomorrow or the day after, so I don’t feel pressure to move on yet. I think RoR is doing some great things for the development community as a whole. Some things I see in RoR, I adopt in PHP. That kind of thing is good for all of us. But again, just because I don’t choose to use RoR, doesn’t mean that if something else came along I wouldn’t take the time to consider how it might could benefit me. At some point I’m sure I’ll re-assess RoR, and who knows, maybe I’ll dive in. Right now, it just doesn’t make sense for me to.