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.

SnipIt.me Upgrade

Added comments to SnipIt.me using Intense Debate.  So you can now comment on photo’s, code samples, and URL’s (via the preview method instead of the redirect method).  They’re hidden by default to keep the interface minimal, they can be displayed by simply clicking the View Comments link near the bottom.

SnipIt.me

This past weekend was pretty busy development wise.  First I launched WordPressEasily.com.  I also put together SnipIt.me.  SnipIt.me is basically a sharing service of various sorts, URL Shortening, Image Sharing, and Code Sharing.

The URL Shortening is pretty standard.  You can put in a long URL, and it makes it into a smaller URL for pasting in things like Twitter, Email, whatever.  It gives you the option of just one URL that just automatically redirects the user you send it to and another option that will show the URL to the user so they can see where you’re about to send them.

Image sharing is pretty simple.  You can upload a small image (less then 1MB) and it gives you a nice short URL to send to someone, that once visited, displays your image.  The service hosts the image for you :)

Code Sharing is pretty spiffy.  You can paste in a block of code, or an entire file, then choose the language it was written in and it gives you a nice short URL you can send to someone.  Once the visitor goes to the URL the code is displayed with syntax highlighting (syntax highlighting provided by Alex’s Syntax Highlighter).

The goal of the site over all is to be very minimalistic.  It’s focusing on doing its job and doing it well, not bells and whistles.  That pretty much shows through in the interface (it takes minimalism seriously). It’s not that there aren’t other services that do these things, but none of them really did all 3 items, and they mostly had small things I didn’t like.  For instance, most of the syntax highlighting services put the code in a small column that forces you to scroll left and right even for small pieces of code.  This is not the case with SnipIt.me.  It uses the full width of the browser window to display the code.

Anyhow, hopefully you can find a use for the service.  I’m constantly trying to enhance it in little ways while staying true to it being minimalistic.  Let me know if you have any ideas for the service :)

PHP->User Released

I’ve released a generic open source User class for PHP.  It still has a ways to go before it’s everything I want it to be, but it is in a usable state now.  The general idea is that you can just drop it in place, then begin making use of it in your code.  This allows you to quickly jump over the hurdle of setting up your own user system in your web application or website.  It tries to be as flexible as possible by allowing the developer to add fields to the users table, then the class handles both retrieving those fields and saving to them for the developer (without having to modify the class).  It also supports groups to handle group based authentication (for instance, you could assign a user to an “Admin” group and test for it before allowing a user access to administrative functionality).

Anyhow, I’ve taken the time to setup a page for it on Google Code and there’s more detailed documentation there, so if you want to know more, visit the PHP->User page.

Note: At the moment, it’s only available via Subversion checkout.  Once things get cemented a little more I’ll start offering .zip downloads from the project page.

WordPress Filter v1.3.1 Released

WordPress Filter v1.3.1 has been released and contains a couple bug fixes dealing with categories and editing filters.  It is recommended that users upgrade to obtain these fixes.  The latest version can always be downloaded from the WordPress Filter page.

WordPress Filter on Plugin Directory

WordPress Filter is now listed on the WordPress Plugin Directory.  So you’ll be able to get your 1-click upgrade goodness and all that fun stuff.  Just figured it was worth mentioning :)

Announcing: WordPress Filter

I’m happy to annouce WordPress Filter v1.0 (Release Candidate 1).  I decided to make this just RC1 because I would like to have some folks help test it out before I move it securely into v1.0.  What is WordPress Filter you ask? Well, continue reading for the introduction then check out the project page.

Introduction

WordPress Filter is a comprehensive post filtering system. It allows the user to define a set of simple “Catches” to be met by a post, and then have a set of “Actions” applied to the post. This plugin takes action whenever a Post is saved inside of WordPress (including Posts coming in via XMLRPC). It can be used for many tasks, including creating your own mini plugins without ever having to leave your WordPress administration area.

Example Usage

Let’s assume you want to participate in Project 365 but want to make it as easy as possible. You would like to take a picture with your camera phone and send it to your flickr2blog email address with the title “potd”. To do this, you could use WordPress Filter in this way:

Define the Catch:

  • If Post Title: Equals “potd”

Apply the Actions:

  • Title: Replace “Picture of the Day
  • Tag(s): Add “potd_%%year%%, photo
  • Content: Append “<br/><br/>This photo is part of my Picture of the Day Series for %%year%%.

It’s fairly self explanatory, but when the post arrives at your blog: it would add the tags “potd_2008, photo”, add a short bit of text to the end of the content, and change the post title to “Picture of the Day”.

%%year%% is a substitution that will be made by WordPress Filter at the time the post is saved. It inserts the current four digit year. There are other SystemSubstitutions as well.

[Continue reading on the project page]

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.