Saturday, February 6, 2010

Blog Moved

I've moved my blog over to http://bradley-holt.com/. If you subscribe to my feed then please update the feed URL to http://feeds.feedburner.com/bradley-holt (it should redirect automatically but it's not a bad idea to resubscribe using the new URL). Unfortunately I'm not able to redirect the posts themselves.

Sunday, January 31, 2010

Bootstrapping Zend Framework Applications

See Bootstrapping Zend Framework Applications at its new home on bradley-holt.com.

In my previous post I talked about how the Front Controller pattern is implemented in Zend Framework. We saw how every application request can go through the public/index.php script. Everything that your application does is then eventually called from either the bootstrap() or run() method in Zend_Application.

One of the constructor arguments passed to Zend_Application specified the configuration file to use. In the case of the demo blogging application, Postr, you'll see that the configuration file used is application/configs/application.ini. If you look at this configuration file you'll see that there are four sections: production, staging, testing, and development. The staging, testing, and development sections all inherit from production meaning that they will inherit all of its settings, unless overridden (as is the case, for example, with the phpSettings.display_errors setting in testing and development).

The other constructor argument passed to Zend_Application specified the application's environment. For those paying close attention, the environment was actually the first argument and the configuration file was the second argument passed to the constructor of Zend_Application. By default, the demo application is set to run in development mode. This means that the development section from application/configs/application.ini will be used. Remember, development inherits from production so any settings not explicitly overridden from production would be inherited and used.

There's quite a bit that can be setup in the configuration file. However, some things may be easier to (or only possible to) setup programmatically. This is where application/Bootstrap.php comes in. In your Bootstrap class you can write initializers for various parts of your application. These methods should be protected and their names should begin with _init. Let's look at the initializers I've written in the demo application:

  • _initViewHeadTitle() first makes sure that the "view" resource has been bootstrapped and then gets this resource, which we happen to know is an object of type Zend_View_Abstract. We then set the separator used by the HeadTitle view helper to " :: ". This means that each head title appended or prependend will be separated by this string. Next, a title of "Postr" is prepended so that this title will be used on every page.
  • _initPagination() simply sets the partial view script to be used by Zend_Paginator (I plan on further explaining Zend_Paginator in another blog post).
  • _initNavigation() sets up our navigation structure using Zend_Navigation (I plan on further explaining Zend_Navigation in another blog post as well).

In my next post in this series I plan on taking a look at the Model-View-Controller pattern in Zend Framework.

Friday, January 29, 2010

Front Controller Pattern in Zend Framework

See Front Controller Pattern in Zend Framework at its new home on bradley-holt.com.

I recently gave a Zend Framework Introduction presentation at our local PHP Users Group. I built a demo blogging application called Postr that I used as an example throughout the presentation. There was way too much material to cover in the time available so I plan on writing a series of blog posts, each covering a specific area of Zend Framework. Here is the first (and hopefully not the last!) post in this series based on the presentation and demo application.

Like many other frameworks, Zend Framework provides an implementation of the Front Controller pattern. This means that all HTTP requests can be sent through a centralized point. This allows you to take advantage of Zend Framework's routing and Model-View-Controller (MVC) components, if you so choose. By default this is the public/index.php file (click to see the source code). Note that in Zend Framework only the public directory is accessible to website visitors, all of your other directories should be outside of your document root. You'll see several things happening in the public/index.php script:

  1. The APPLICATION_PATH constant is defined. This is the full path to the application directory. You'll see this constant used later.
  2. The APPLICATION_ENV constant is defined. This will typically be either production, staging, testing, or development. This will be used to determine which configuration section to use.
  3. The library directory is added to the include path. This is so that the Zend library code (if you decide to place it in your library directory) or any other libraries used can be found.
  4. A new instance of Zend_Application is created. Two arguments are passed to its constructor: the application environment (defined in 2) and the location of the configuration file. Typically this is application/configs/application.ini. The application path (defined in 1) is used to provide the absolute path to the configuration file.
  5. The application is then bootstrapped and run. It may seem odd to those used to writing PHP scripts, but everything that happens in your application is subsequently called from either the bootstrap() or run() method in Zend_Application. In fact, this is the essence of the Front Controller pattern.

By itself, public/index.php can't make sure that all HTTP requests go through it. If you're using Apache as your web server then you can use its rewrite module to do this (other web servers have equivalent functionality). This is typically done in public/.htaccess. There are several things happening in this file:

  1. First the application environment is set so the application knows if it's running in production, staging, testing, or development mode.
  2. In the demo application, I set the default character set to utf-8.
  3. Some environments require you to set a rewrite base. If needed, this is usually the first part of the URI (e.g. just / if your application is the only thing on the web server or /postr/ if your application is in a subdirectory named "postr").
  4. Turn on the rewrite engine.
  5. Don't rewrite if the requested file is a regular file with size greater than zero, is a symbolic link, or is a directory. This way static files such as images, CSS files, and JavaScript files aren't rewritten.
  6. Otherwise, rewrite the request to index.php.

In my next post in this series I plan on taking a look at what happens during the bootstrapping phase of your Zend Framework application.

Zend Framework Introduction

See Zend Framework Introduction at its new home on bradley-holt.com.

Slides from last night's Zend Framework Introduction at the Burlington, Vermont PHP Users Group are now available online:

The presentation is available under a Creative Commons license.

As I mentioned earlier, there's also a demo blogging application called Postr available on GitHub. The application is available under a free/open source New BSD License so feel free to use, redistribute, and/or modify it however you'd like.

Thursday, January 28, 2010

Learn Zend Framework

See Learn Zend Framework at its new home on bradley-holt.com.

At tonight's (Thursday, January 28, 2010) Burlington, Vermont PHP Users Group meeting I'll be giving a Zend Framework Introduction presentation. I'll be covering how to use several features of Zend Framework and common patterns including:

I've created a demo blogging application called Postr that I'll be using as an example throughout the presentation. Thanks to Jason there is some CSS that makes the application much more usable. I will post the presentation to my SlideShare account after tonight's meeting.

The meeting is from 6:00 PM - 8:00 PM at Office Squared in Burlington, Vermont. If you're in the area and interested in attending then you can register for free on Eventbrite.

Wednesday, January 20, 2010

Open Source and Open Standards Bill

See Open Source and Open Standards Bill at its new home on bradley-holt.com.

The other day there was a discussion on the VAGUE mailing list about an open source and open standards bill (H.516) [PDF] recently introduced in the Vermont General Assembly (a.k.a. legislature). It's technically an amendment to an existing act and has the following stated purpose:

This bill proposes to require the department of information and innovation to advise against the acquisition by a state agency of proprietary software or software that operates by means of proprietary protocols when acceptable functionality can be achieved with open source software and open standard protocols and to ensure that the expected total life-cycle costs of software are fully evaluated prior to acquisition.

Overall I see this as a positive move for the State of Vermont. It does not seem to put the requirement for open source and open standards ahead of the particular business needs at hand since it only "advise[s] against the acquisition by a state agency of proprietary software or software that operates by means of proprietary protocols when acceptable functionality can be achieved with open source software and open standard protocols." However, Mitch Lieberman points out:

@BradleyHolt functionality does not directly = biz value IMHO, biz value needs to include ROI of functions, thus includes TCO

I agree with Mitch that the bill could do a better job of addressing not just functionality, but also return on investment (ROI) and total cost of ownership (TCO). These should be the primary considerations of any responsible organization in deciding what software to use. However, since it is the public's money being used to purchase this software it is worth considering whether our resources are being used to further entrench proprietary software and standards, or whether we are instead enriching the public commons by supporting open source software and open standards.

In addition to the above, there are some details of the bill that demonstrate some possible misunderstandings of how open source software works. While it's not anywhere in its text, the bill is described as being "An act relating to comparing the costs and benefits of downloading free open source software with purchasing proprietary computer software." There are a couple of misconceptions in this one statement. First, cost should not always be the primary motivation behind using open source software: the freedoms it gives you are just as important. In fact, not all proprietary software costs money and not all open source software is available free of charge. Second, "downloading" is simply a means of distributing software. Proprietary software can often be downloaded. Open source software is sometimes distributed on a physical medium.

It's not stated explicitly in the bill, but people sometimes think that if they release their own software under an open source license they are somehow giving up control of the licensed software project. While there are many benefits of giving up control (which are outside the scope of this blog post), it's worth noting that you don't have to. When you license your software you still own the copyright on that software. You can still do whatever you want with that software, including release it under a different license later. Once you accept outside contributions then you need to honor whatever license has been given to you be your contributors (unless they agree to transfer copyright to you, but this can be tricky). It's your choice whether or not to accept those contributions in the first place. You are still completely in control (as long as you want to be) and have simply given others the possibility of benefiting from your work.

Monday, January 11, 2010

Zend Framework Route Context Plugin

See Zend Framework Route Context Plugin at its new home on bradley-holt.com.

I want to share a simple, yet very useful, custom Zend Framework plugin that we use on almost all of our projects. The plugin (and associated code in the layout file) provides the Zend Framework route context as CSS classes on the body element. This allows us to change the design (using CSS) and/or behavior (using unobtrusive JavaScript) on the page based on the Zend Framework route. For example if the module name was default, the controller name was news, and the action was get then the opening of the body element would like this:

<body class="default news get">

There are some limitations. For example, you need to be careful not to overlap module, controller, or action names. If this is a problem for you then you could preface the class names (e.g. module-default, controller-news, action-get).

The RouteContext plugin hooks into the preDispatch event and creates an array of route context strings. This example simply uses the module, controller, and action names as the route context. Often I'll add other contextual strings to this array as needed. This array is then assigned to the view. The layout view script then simply implodes this array into the value of the class attribute using a space character as the glue.

Sunday, January 10, 2010

Phing Build Script

See Phing Build Script at its new home on bradley-holt.com.

I've been experimenting with using Phing to automate building and deploying web applications. I want to share one of my build scripts and perhaps get some feedback from anyone with more experience using Phing. The requirements for the build script are fairly simple:

  • It will not handle deployment. This particular web application is deployed by the client's IT department.
  • It will create a ZIP file (it could just as easily create a tar.gz file) that the client's IT department can extract and deploy.
  • It will rename the document root since the document root is a different directory name in the client's production environment then it is in our development and testing environments.

Next, an outline of what the build does:

  1. Prompt for Subversion credentials (I'd rather not store these in a file).
  2. Prompt for the Subversion tag to build from.
  3. Delete the source directory if it exists.
  4. Export the given tag to the source directory.
  5. Rename the document root.
  6. Create a ZIP file, named after the version, of the source directory's contents.
  7. Clean up after itself by deleting the source directory.

Both of the build files are in the project's root directory (in my project, this is one directory above the document root). The build.properties file defines three properties: document root (so we can rename it to this new name), the source directory (the place to export to and then manipulate folders/files), and the URL to the repository's tags directory.

The build.xml file is the actual build script, performing the actions outlined above. I've obfuscated the project name to be "acme". I could not find a way to create a prompt that hides the Subversion password as it is entered (anyone?). For renaming the document root, I used the exec task to execute a move (mv) command since the move task failed for me (so this script will not work as-is on Windows).

Executing this script is as easy as running phing build-tag (once Phing is installed) from within the project's root directory. Please let me know if you have any questions or see any room for improvement.

Thursday, January 7, 2010

Marketing Is Not Dead

See Marketing Is Not Dead at its new home on bradley-holt.com.

Forrester Research claims that 2010 is the year marketing dies. I mostly agree with the article and its conclusions. However, I do not think that marketing is dead: I just do not think it means what you think it means. The article conflates three distinct concepts: marketing, media, and advertising (although media, advertising, and public relations do overlap). It assumes that media exists to serve advertising and that advertising in turn exists to serve marketing. The second part (advertising serving marketing) is fairly accurate since advertising is a marketing tactic. The first part has mostly been true in the past (media serving advertising). I think it would have been more accurate to say that 2010 is the year we decouple marketing from advertising and advertising from media.

The cost of producing and distributing media has become much cheaper in the digital world. It is no longer assumed that media cannot be produced or distributed without advertisers footing the bill. The decoupling of media from advertising has opened up the door for all sorts of creativity (and arguably a lot of garbage, too). Public, educational, and governmental media have been producing and distributing content free from advertising for years.

On the flip side, it is no longer assumed that marketers need to spend a lot of money on advertising to get their messages in front of eyeballs (or ears or whatever). If you have a good message then people can hear that message without the need for paid media gatekeepers. Word-of-mouth has long been an effective marketing technique which requires no media buys. With the Internet, Web 2.0, social media, or whatever you want to call it today word-of-mouth marketing takes on a whole new dimension.

Sure, if you have a product or message that does not resonate with people then you may still need old media and advertising to get your product and message in front of them. Of course, once people try your product and are disappointed with it they will share their thoughts about your product with other people. I hope that 2010 is the year that old media and advertising wanes and that good old word-of-mouth has a resurgence in influence. This is the kind of marketing we focus on at Found Line: marketing as a form of communication and education. As the Forrester Research post concluded, "Marketing is dead. Long live marketing!"

Wednesday, January 6, 2010

TEK·X PHP Conference

See TEK·X PHP Conference at its new home on bradley-holt.com.

I registered today for the upcoming TEK·X PHP conference in Chicago. I attended both ZendCon '08 and '09 but this will be my first TEK·X experience. I have heard that TEK·X is more of a community conference while ZendCon has a reputation for being more corporate. The schedule has not been announced yet (which is why I was able to get my ticket for 35% off). However, several people who have seen the schedule have said that there are some excellent sessions lined up. This year they are replacing the Unconference with a Hack Track which sounds like a lot of fun (even though I am a big fan of unconferences). Hope to see you there!

Saturday, January 2, 2010

Web Design and Web Development

See Web Design and Web Development at its new home on bradley-holt.com.

Back in October, Jeffrey Zeldman tweeted something that I strongly agree with:

Real web designers write code. Always have, always will. #aea

This sparked many conversations including these two tweets from Chris Shiflett:

According to @zeldman, real web designers write code. (I think he means HTML and CSS, not PHP, Perl, and Python.) What do you think?

I’ve now asked, separately, whether developers and designers should know HTML and CSS. In both cases, most think they should. Interesting.

To which I responded (brackets added):

@shiflett IMHO, the demarcation between web developers and web designers should be POSH [Plain Old Semantic HTML]. That's what both need to know.

I have a pretty strong opinion about this. You could say that I have the luxury of working with an excellent designer who implements all of his own CSS—even tackling much of the JavaScript coding on websites we build. To be clear: he is a designer, not a developer—working in both print (which is more technical than you might think) and web.

The typical process is summarized well in Marco Tabini's PHP Advent 2009 post on CSS and Other People:

From a developer’s perspective, “design work” means having to deal with the often hated, sometimes impossible, and always challenging task of translating a designer’s comp into a combination of HTML and CSS that will render properly on browsers that are often at complete odds with one another.

In my opinion, that process is broken. Why is it assumed that because HTML and CSS are "code" it should be a developer's job to implement these? Any decent designer is already familiar with the concept of separating presentation and content with style sheets (which are supported in Adobe InDesign, QuarkXPress, and even PageMaker and Microsoft Word). Is learning HTML and CSS, both declarative languages, considered too hard for designers?

Let's take a look at comps and the dreaded "s" word—slicing. As Marco pointed out, trying to "slice" a comp into HTML and CSS is "sometimes impossible" and "always challenging." If a designer is only providing a comp, and not the HTML and CSS, it is very likely that the designer does not have a solid understanding of things like progressive enhancement, browser compatibility, and even what is possible on the web.

The use of a comp generally assumes that design is purely visual and that all representations of the web page should look exactly like the comp. How should the content be presented to screen readers, to mobile devices, and in print? Sure, you could provide comps for each of these scenarios but this is not scalable and you quickly risk violating the "One Web" concept. Thinking of a web page through the lens of only one specific visual representation of that page is very limiting.

Do you agree that the typical process is broken? If so, what are the barriers to fixing this process? Do we need better trained web designers? Do organizations need to be educated on how to better structure their web teams? This problem will eventually self-correct. My prediction is that teams with web designers that know HTML and CSS will create better websites and web applications and be more successful than teams using the old process.

Friday, January 1, 2010

Year In Review

See Year In Review at its new home on bradley-holt.com.

Being the first day of 2010, I thought it would be a good time to take a look back at 2009…

Burlington, VT PHP Users Group

2009 was the second full year of the Burlington, VT PHP Users Group. We had some fun meetings and presentations including:

January
Jason Pelletier gave a presentation on CSS for Developers.
February
Aaron Carlino demonstrated SilverStripe, an open source CMS/framework built in PHP.
March
Special guest Paul Reinheimer gave a presentation called "Easy Problems are the Hard Problems" taking an in-depth look at the easy/hard parts of building web applications.
April
Rob Riggen gave a talk on website performance optimization.
May
Rene Churchill gave a presentation on MySQL database optimization.
July
Matthew Weier O'Phinney gave his Play-Doh: Modelling Your Objects presentation.
August
Matthew Weier O'Phinney presented again in August, this time giving a hands-on unit testing crash course [ODP].
September
September's meeting was a casual get-together instead of a formal meeting and presentation—a change of pace from the typical meeting format.
October
I gave a talk geared towards PHP beginners.
November
November's meeting fell on one of Zend Framework's Bug Hunt Days. Held monthly, Bug Hunt Days are designed to encourage the community to help triage and resolve issues in the framework. Matthew Weier O'Phinney guided us through effective bug reporting and taught us how to contribute patches. As part of Bug Hunt Days, my first Zend Framework patch was accepted, a small addition to the documentation.
December
December marked the second birthday of our local PHP Users Group and that month's meeting turned out to be a fun social event.

Our users group also won a free pass to ZendCon '09, and Jase Roberts was the lucky recipient. He joined fellow Vermonters Matthew Weier O'Phinney, John Valance, and me at the annual PHP conference.

The Browser

Jonathan Butler started a program on our local community radio station called The Browser. It's "a show about the people who bring the world wide web to [Burlington, VT]." Jason and I were on the show twice—once in February and again in August.

Town Meeting Day Vermont, ACM-NE, and Tagnabit

The first Tuesday of March was Town Meeting Day here in Vermont. Citizens throughout Vermont gathered together to elect local officers and vote on budgets. As an experiment we put together a website, tmdvt.net/09, to aggregate content from social media sites around Town Meeting Day Vermont '09. If you used the appropriate tags in your tweets, Flickr uploads, blog posts (if indexed by Technorati), YouTube uploads, and bookmarks on Delicious, then your content showed up on the website. I wrote a post recapping some things we learned from the experiment.

As a result of that project, Bill Simmon and Seth Mobley from Vermont Community Access Media (VCAM) approached us about doing something similar for the Alliance for Community Media Northeast Region (ACM-NE) conference they were organizing here in Burlington, VT. We built acmne.net/09 for the conference and it was a big hit. I spoke on a social media panel (which Liz Schlegel moderated) and helped with a social media workshop at the conference. Colin Rhinesmith, who was on the panel with me and also helped with the workshop, posted a good summary of the conference on his blog.

We then took the idea from Town Meeting Day Vermont and ACM-NE a step further, creating Tagnabit—aggregating tweets, photos, blog posts, videos, and bookmarks for any arbitrary tag. Bill Simmon wrote a good blog post on how Tagnabit could be used.

Jelly/Coworking

I was excited to see Jen Mincar open up a coworking space, Office Squared (o²), here in Burlington, VT in 2009. I think it will help bring more cohesiveness to the local technology community since many of her customers work in technology-related industries. As a precursor to its opening, we hosted a Jelly at Found Line in July, inviting entrepreneurs and freelancers to work in our studio for an afternoon. Here are some photos from the Jelly and another one at the Burlington Free Press.

Vermont Code Camp

September saw the first ever Vermont Code Camp, bringing together people from local technology communities around .NET, PHP, Ruby, and Python. The event was a huge success with 85 attendees and 19 sessions. I had a small part in organizing the event but the real credit goes to Rob Hale, Julie Lerman, and everyone else who organized, volunteered, and presented. I also gave a presentation on Resource-Oriented Web Services as part of the code camp.

ZendCon

ZendCon is the biggest conference of the PHP community, and this year's event was my second ZendCon. What can I say? The talks were excellent. The people were even better. I ended up co-presenting at the UnCon with Michelangelo van Dam and Anna Filina on the role of a PHP user group.

Moving On

2009 seemed to be the year for people in the PHP community to change jobs. Following that trend, I made the move to Found Line full time last month, leaving Vermont Oxford Network. As I said before I'm very happy to have more time to focus on our clients' projects and to work with free/open source software and open standards full time.

Work

2009 was a busy year. Some of the work included:

Phew—a lot to say! I hope you had a good 2009, and have an even better 2010.

Wednesday, December 23, 2009

Common Good Vermont

See Common Good Vermont at its new home on bradley-holt.com.

The other day we launched the first iteration of the Common Good Vermont website. From the about page:

Vermont (pop. 621,000) is a small, tightly knit rural state proud of its independent spirit and high levels of civic engagement. Vermont's independent sector (3000+ organizations, $4 billion annual revenue) plays a primary role in the delivery of human and cultural services and in the preservation of the state's cherished natural resources. Most social services—food, shelter, healthcare and education—are delivered within local and regional community settings.

Often separated by geography (mountains, rivers, lakes), Vermont's 251 towns and 14 counties are increasingly knit together by broadband "build-out". Common Good Vermont leverages these electronic networks to bridge the barriers of Vermont's geography and the "beaten paths" of its hyper-local networks. New human and electronic networking activities will support the delivery of information and innovation to the state's community builders: project volunteers and professionals who, by virtue of their civic and nonprofit roles and responsibilities, are the lifeblood of the "green mountain state". Common Good's place-based and community virtual events are designed to improve the capacity of so many "small networks" that, improve Vermont's unique "quality of life".

Common Good Vermont aggregates content for (and from) Vermont independents and nonprofits by pulling in RSS and Atom feeds including blogs, news sources, social bookmarks, and event calendars. The goal is to serve as an information hub encouraging knowledge sharing and increasing cross-organization communication. Content is currently organized by a combination of taxonomy (categories defined by Common Good Vermont staff) and folksonomy (tags from the feeds themselves). Our goal is to eventually remove the taxonomy layer and have all content organized completely by broad and, to a lesser extent, narrow folksonomy. However, the taxonomy layer is there for now to allow a certain amount of curation while we seek out, connect, and aggregate additional sources of information.

Common Good Vermont is built using Zend Framework and hosted on Rackspace Cloud Sites. Components from Zend Framework used include its MVC system, Zend_Application, Zend_Feed_Reader, Zend_Tag_Cloud, Zend_Search_Lucene, Zend_Paginator, Zend_Db, Zend_Date, Zend_Auth, Zend_Acl, and Zend_Form. Stay tuned for future iterations to the website!

Wednesday, December 16, 2009

Moving On

See Moving On at its new home on bradley-holt.com.

Today is my last day at Vermont Oxford Network and I will now be working at Found Line full time. This was not a decision I took lightly. Vermont Oxford Network is a great place to work and they've got an excellent team. For the last four and half years I've been developing software that improves health care for newborn infants. I feel like I've made a contribution beyond just the work. However, it's time to move on to something different.

Jason and I started Found Line almost five years ago and I'm looking forward to helping him and Liz continue to grow the business. We've got some really great clients and I'm very happy to have more time to focus on their projects. I'm also excited about the opportunity to work with free/open source software and open standards full time. So, time to go catch up on some work!

Wednesday, December 2, 2009

RedEye Universal Remote Control

See RedEye Universal Remote Control at its new home on bradley-holt.com.

Today one of our clients, ThinkFlood, launched their RedEye Universal Remote Control for the iPhone and iPod touch. The device and application combination allows you to "use your iPhone or iPod touch to control your TV, stereo, cable box, DVD player, and many other devices that receive standard (infrared) signals." The product launch got some great press coverage including from CrunchGear, Gizmodo, Macworld, iPodNN, Engadget, TUAW, and Wired’s Gadget Lab. Our work with ThinkFlood has included developing their brand identity, packaging, and website.

The latest iteration of the website includes eCommerce functionality allowing ThinkFlood to sell their RedEye device directly to consumers. The eCommerce section includes a shopping cart and an easy-to-use two page checkout process. While the checkout process is simple for end users, there's quite a lot happening behind the scenes with the integration of multiple APIs. The website is built using Zend Framework and thanks to Rackspace Cloud Sites everything has remained running smoothly even with all of the press coverage and associated traffic.

Wednesday, November 18, 2009

Bug Hunting

See Bug Hunting at its new home on bradley-holt.com.

If you are a PHP developer in the Burlington, Vermont area then you should come to tomorrow (11/19) evening's PHP Users Group meeting at the newly opened Office Squared coworking space in downtown Burlington. This month we will be learning how to find and fix bugs in free and open source projects. From the meeting description:

Each third Thursday and Friday of the month, Zend Framework has Bug Hunt Days in which the community helps triage issues and resolve them. These efforts include everything from fixing typos in documentation to creating reproduce cases and capturing them in unit tests to actual creation of patches resolving reported bugs.

Since this month's meeting falls on the third Thursday, Matthew Weier O'Phinney, Project Lead for Zend Framework, thought we could join in on this effort or help contribute to other projects. He will be providing a short presentation on effective bug reporting and triage, after which we will jump into some actual bug hunting on projects you, the attendees, are interested in.

So come with your laptops ready, and let's fix some bugs!

PHP developers of all skill levels are welcome. There are many types of contributions needed to keep free and open source projects moving forward. You will likely have something you can contribute — and you'll learn a lot doing it!

Wednesday, November 11, 2009

Rackspace Cloud Sites

See Rackspace Cloud Sites at its new home on bradley-holt.com.

We've been a Rackspace Cloud Sites (formerly Mosso) customer for about three years. In fact, I signed up as a beta tester when it was originally called "the system beats the machine." I doubt many people that work at Rackspace even know that it once had that rather odd name. Honestly, it was very rocky at the beginning (even after it was officially out of beta) but today it's a very solid platform. I've been a fan of Rackspace for years and would recommend them to anyone who needs dedicated and managed servers, virtual servers, storage delivery, our cloud hosting.

As much as I like Rackspace, the point of this blog post isn't to praise them. They've been making a big marketing push on their cloud offerings lately but I get the impression that Cloud Sites (the service we use) is the, "oh, yeah, we offer that too" service. They seem to be unaware of the potential of one of their own service offerings and push people who need a "serious" solution to Cloud Servers. Cloud Sites is an excellent platform as a service for people running PHP or .NET web applications who have better things to do with their time than manage the hardware or software layers below their PHP or .NET applications. Sure, Cloud Servers takes away the hardware layer management but you still have to manage the software layer (operating system, PHP or .NET, MySQL, etc.) yourself and deploy individual virtual servers if you need more capacity.

Part of this impression comes from Rackspace's recent marketing efforts around their cloud offerings. Some of it also comes from the technology behind Cloud Sites. For example, one of the big pain points (for me) with Cloud Sites is lack of support for features that would make application deployments easier. I understand why ssh isn't supported since there is no single machine to remote into. They do support sshfs which is useful and solves part of that problem. However, support for public key authentication and symlinks (symlinks work but aren't officially supported) would go a long way towards making application deployments less painful. It's my impression that features like these aren't included in Cloud Sites because Rackspace thinks that people who want them should use Cloud Servers instead. If that is what they think, then they're missing the point of how dead simple and awesome an application platform Cloud Sites could be.

Beginner PHP Code Examples

See Beginner PHP Code Examples at its new home on bradley-holt.com.

At last month's Burlington, VT PHP Users Group meeting I presented a session on beginner PHP. The code examples can be downloaded (or forked) from GitHub. The talk was geared towards complete beginners and covered the basic structure of a PHP script, variables, comments, data types, arrays (enumerative, associative and multi-dimensional), operators, conditionals, iterative constructs, functions, scope, web forms and database access. I've licensed the code examples under the New BSD license in case anyone wants to use and/or modify them for their own beginner PHP talk.

Wednesday, October 28, 2009

The PHP Community

See The PHP Community at its new home on bradley-holt.com.

Last week I was at ZendCon, the largest yearly event of the PHP community. One thing that I've been thinking about lately, and something that many other people have talked about, is how unique the PHP community is. People are generally friendly and welcoming. Rarely do you run into someone who thinks he or she is somehow better than anyone else. Sure, you'll get the occasional RTFM on a mailing list but ask anyone who's interacted with the PHP community and they'll probably have something nice to say.

I'm relatively new to the PHP community myself. Sure, I've been a PHP developer for about eight years but I hadn't really been involved in the community until I started our local PHP users group two years ago. There I met many talented local PHP developers including Matthew Weier O'Phinney, now project lead for Zend Framework. I had actually started using Zend Framework a little while before I met Matthew not realizing that one of the developers lived here in Vermont. I then went to ZendCon '08 which was my introduction to the international PHP community.

I think one of the things that makes the PHP community so strong is that we've had to build the community ourselves (my part in building the PHP community has been relatively tiny). Having had some involvement in other technology communities, I've seen the kind of support that companies like Microsoft can provide to strengthen their respective communities. During the "Meet the Zend Team" session at this year's ZendCon, Keith Casey asked what Zend was going to do to further support user groups. I was very happy to hear this question asked.

I'd like to see Zend do more to support user groups — although I don't have any room to talk with Matthew being a regular attendee and presenter at our local user group. In fact, as a response to Keith's question Matthew reiterated his offer to present at other user groups if he was in the area (which, frankly, was a much better answer than the rest of the Zend team gave). Chris Cornutt published a blog post today asking what role should companies take in the developer community ecosystem. I don't think it's any one company or organization's job to support the PHP community. Help is most certainly welcome but I think our strength is in doing it ourselves.

Thursday, October 15, 2009

Beginner PHP

See Beginner PHP at its new home on bradley-holt.com.

The Burlington, VT PHP Users group has been going strong for almost two years now. We've had lots of great presentations and some really experienced PHP developers at the meetings. However, I've been concerned that we might scare away PHP beginners with many of the meetings being on advanced topics. So, our next meeting topic will be Beginner PHP:

Have you recently started using PHP? Don't use PHP but want to learn more about it? The topic of this month's Burlington, VT PHP Users Group meeting will be, "Beginner PHP." Learn the basics and some tips and tricks from experienced PHP developers. Are you an experienced PHP developer? Then come to the meeting and help out some beginners! We were all beginners at some point.

Refreshments will be provided, and you'll have the chance to network and connect with fellow PHP developers. Meetings are open to the public via RSVP.