JavaScript appears to be disabled. We recommend you enable JavaScript while visiting this site.

(All original content on this site is licensed under the Creative Commons License Attribution-Noncommercial-No Derivative Works 3.0.)

Installing WordPress 2.9.2 on Windows Server 2003 using Microsoft's Web Platform Installer

I recently had need to install and test WordPress for some possible work. While I was tempted to go the Linux route, shortly after the OS was setup I decided to skip that and stick with Windows. Since Microsoft has released a platform that supposedly makes it easy to install Web-related applications, I decided to give it a try to determine just how simple it was.

What follows is an overview of the setup process to install WordPress 2.9.2 on Windows Server 2003, using Microsoft's Web Platform Installer.

Web Platform Installer

The Microsoft Web Platform Installer can be downloaded from Microsoft.com and acts as middle-ground between all of the various applications that it covers, which is fairly robust (a full listing is available).

As you can see in Figure 1, WordPress is available along with a handful of other blogging applications. Upon selecting this and pressing Install, you're presented with the listing of dependencies and other applications that may be required (Figures 2, 3, and 4).

While I was going to install MySQL on a dedicated virtual machine, and was able to deselect that, for ease I've kept in selected here. At this time I'm not sure (yet) of how that would impact the installation process.

Since MySQL was being installed, I was prompted, right away before anything was downloaded, for an administrator password, as seen in Figure 5. Even though I thought I had everything installed for IIS, I was also prompted, as shown in Figure 6, for a Windows Server 2003 disc.

Figure 7 alludes to the fact that the individual requirements are downloaded and installed, moving right into the setup of any Web sites as required, as seen in Figure 8. In this case I kept the defaults. Additional WordPress setups are shown in Figures 9, 10, 11, and 12, where the database is setup. It's been a while since I've installed MySQL, so how this relates to that installation is unknown.

Once all components have been installed, you're presented with a nice little screen, like Figure 13. You can then launch WordPress and go through the setups necessary (Figures 14 and 15), log in (Figure 16) and view the administrative interface (Figure 17) and home page (Figure 18).

Thoughts on the Platform Installer

While I initially didn't think much of the installer, having actually used it, I'm pleasantly surprised. It's an extremely simple process, similar to how one might install applications through, say, Ubuntu.

It takes a lot of the guess-work out of the process, which is rather nice. On the other hand, while I can get going with WordPress at this point (and I was able to do my testing fairly quickly), the disadvantage of this is that I don't know any of the complexities of the setup process. I haven't installed WordPress (or PHP, or MySQL), but rather an installer has. But, I like the challenge of figuring things out on my own.

Which is why while I like the Installer, and will definitely use it when I need to quickly test something, for the most part I'll probably stick with old-fashioned methods of installation.

(All original content on this site is licensed under the Creative Commons License Attribution-Noncommercial-No Derivative Works 3.0.)

Web Application Development Guidelines

While Web application development is just as complex as other application development, if not more so, it's fairly difficult to find information on best practices while doing Web development.

In order to move towards implementation of Subversion, I needed to write up documentation on how we'd use it. After a couple drafts, which I ended up scrapping almost completely, I came up with the below.

In the interest of sharing, I've included the full document below, after removing the few instances where I had to specify a non-Subversion application (our help desk application). Comments and suggestions are appreciated.


Web application development guidelines

Purpose

The purpose of this document is to outline the development process for all Web applications.

Any concerns that arise that are not covered by this document should be brought to the attention of the core development team, analyzed and answered, and added to this document.

Contents

  • Overview of development process for new or upgraded functionality
  • Server usage - Development/Staging/Production
  • Development planning and steps
  • Code testing procedures
  • Version control usage
  • Bug collection and fixing
  • Finalizing code and pushing to production
  • Revision history

Overview of development process for new or upgraded functionality

  • New or changed functionality outlined
    • If the changed functionality is a bug fix to production code, the normal process of reporting bugs (see Bug collection and fixing) should be followed. See also steps 10 to 14 below.
    • Otherwise if the changes are a project, before any development can begin, the following must be created and approved; an official written request for a change to existing functionality, or new functionality, and wireframe(s) containing all displayed elements and functionality,
    • Based on the approved request and wireframes a project plan will be created that includes pieces of functionality that will be created and timelines for creating them.
    • Once the project plan has been approved, actual development can begin.
  • Development planning
    • While already outlined during step 1, actual planning of data and design should begin at this point.
    • When possible, the data should be the first point of reference, with the data access being the next point, and output for the user being the last.
    • Any changes to elements contained in step 1 at or after this point will necessitate that development restart at this point again, with a re-evaluation of the existing plan.
  • Create a new branch for development
    • As it’s always possible for changes to need to be made to existing functionality while new functionality is being developed, generally a new branch should be created for projects. This insures that in case production is lost, we can easily re-build it from source control.
    • An abbreviated version of the project name should be used when creating the branch.
    • Generally all users can use the same branch for development, as ideally nothing should be moved into production until everything is.
      • Exceptions are allowed, such as in the case of the data structure, once it has been finalized. However, realistically this should be done only for completely new functionality (as opposed to updating a table), since moving back to step 1 is always a possibility.
  • Write code
    • Develop code for a set piece of functionality.
      • Code includes all dynamic and static code, such as HTML, ASP.NET, CSS, JavaScript, SQL queries, and etcetera.
      • Whenever possible data should be chunked into the smallest testable part possible.
  • Initial test of code on development server
    • A quick test of code should be performed to insure that it builds (if applicable) and works. If it does not, return to step 4.
    • All testing should be done on the development server only.
  • Code check-in
    • Once functionality has been written and works at a basic level, code must be checked into source control.
  • Write additional code
    • Return to step 5 for each functionality item that must be created before robust testing can occur.
  • Testing on staging server
    • Once functionality has been written and initial tests have passed to an acceptable level, code should be published to the staging server for user testing.
  • Bug collection
    • All user feedback from step 8 should be collected, preferably by a single source, and perused by the development team as a whole.
    • Bugs should be categorized by priority, with those impacting functionality by default having a higher priority than all other concerns.
    • When possible, bugs should be broken into functional groups and tested separately.
  • Bug fixes on development server
    • Bugs are corrected and new versions of the application are pushed to the development server for testing.
  • Code check-in
    • Once bugs have been corrected and testing has occurred, code must be checked into version control.
  • Testing on staging server (iteration x)
    • Code is once again published to the staging server for user testing once again. General testing should once again be performed, in addition to bug fix testing.
    • Return to step 9 as needed.
  • Release finalized
    • Once testing has finished, and all bugs have been squashed, release should be finalized.
    • If the new functionality is sufficient in scope, the release code should be uniquely tagged.
    • The go-live date should be discussed and finalized, with a soft-launch preferred when possible.
  • Functionality pushed to production server(s)
    • On the go-live date the new functionality should be published to production.
    • The first part of the publication process is to merge the branch used for development into the main trunk of code. At that point that can be used to publish to the production server(s).
      • If desired, the release currently on production can be tagged first, to ease on rolling back.
    • If more than one production server is involved, code should be pushed to one server at a time.
    • Testing should occur immediately after the push and any bugs should be evaluated for severity. If necessary, production servers can be removed from rotation, or a previous version published.

Server usage – Development/Staging/Production

To insure that development can occur without impacting existing processes, the following server guidelines should be followed.

Development server

A development server should be used for development of new or updated functionality. A development server should be accessible to only those who develop this functionality or those who perform early testing. In practice, this should only be internal staff on the Web team.

Staging server

A staging server should be used once developed functionality is ready for final user testing. A staging server should be accessible to any users who will need to test functionality before it can be pushed to production, and therefore this server should be accessible outside the organization.

Access to the code directories should be accessible only to the smallest subset of developers.

Changes should never be made on, or pushed to, the staging server without first being tested on the development server, no matter how minor (this includes changes to images that are part of the template).

Production server

A production server contains the finalized version of all code. Production servers are accessible to all users and may contain new content or data.

Like a staging server, the code directories should be accessible only to the smallest subset of developers.

Changes can be pushed to the production server without going through development and staging, but only in the case of static content like user edited images and content. This content should be limited, however, to pre-determined locations, and should be copied down to the development server on a regular basis.

Development planning and steps

Planning

Once the requirements, wireframe(s) (if necessary for the project) and project plan have all been approved, general development planning can begin.

Generally planning should move from the data to the display. This suggest that generally the necessary data storage and procedures should be setup first, objects and methods should be built on top of that, output should be created next, and finally the output should be styled.

If possible, a discussion on display should be done early, based on the wireframe(s) provided.

Development steps

Again, assuming that development will move from the data to the display of that data, the following will be the general flow of development.

  • A new branch should be created for the code. All code in the following steps will be placed within this branch.
    • By creating a branch we insure that all changes are tied together and can be made without impacting any other changes.
    • The branch should be named using an abbreviated version of the project name, with expanded notes entered when creating the branch.
  • If applicable, the requirements and wireframes should be reviewed in order to determine the data structure that makes the most sense. This should also include any SQL views and procedures necessary to interact with the data.
    • In order to be finalized, the views and procedures should be fully tested.
    • Scripts to setup the tables, views, procedures, and etcetera should be saved and placed under source control, in the branch created in step 1.
  • Once the data structure and interactivity with this structure has been finalized, the objects and methods the Web application will implement should be setup.
    • Whenever possible this functionality should be created in such a way that it can be tested via a test page or application. Such a page/application should be used for testing only, and should not be re-purposed for production usage (but can remain for testing purposes).
    • Once this functionality has been finalized, the code for it should be placed under source control.
  • As soon as the objects and methods to interactive with the data have been created, and basic testing has been performed, the user display should be evaluated from the wireframe(s) and outlined.
    • Styles, classes, and ids do not generally need to be determined at this time, but higher-level elements (block versus inline) should be.
  • With a basic understanding of how the output will be styled, development on displaying the data can begin.
    • Whenever possible, functionality should be broken up into smaller chunks and tested, so that it can be checked into source control as soon as possible.
  • Once the necessary data is displaying, the display should be styled per the wireframe(s), following styling standards.
  • Once all data is displaying and styled correctly, the code should be published to the staging server and testing can begin.
  • Once testing results have been received, compiled, and evaluated, any necessary bug fixes should be made.
    • Again, whenever possible changes should be made to self-contained blocks and tested, with the changes checked into source control.
  • Previous steps should repeat until all bugs have been fixed or deferred.
  • Once all bugs have been resolved a go-live date should be set.
  • Shortly before the go-live date is reached an evaluation should be made on whether changes impact the project’s branch. If so, these changes should be merged into the branch before the go-live date.
  • When the go-live date is reached, the branch should be merged into the trunk, a tag (snapshot) should be created if necessary, and changes should be published to production.

Code testing procedures

Testing of code occurs during the development process on the development server, as well as by users on the staging server.

For code that is part of a project, the specific testing needs should be determined based upon the wireframe and requirements guide, and on previously reported bugs, when applicable. Even if initial testing has already been performed, each test should touch upon the already tested functionality to insure future changes have not changed other aspects of the code.

To aid in this, breaking changes up by function should be a key goal of development.

Version control usage

Version control system and tools to be used

Based on our environment and requirements, Subversion is to be used as the core version control system. All tools used must operate with Subversion without decreasing the level of security of the system. This requires that all new tools be fully vetted before being made a part of our system.

At this time the allowed components are CollabNet Subversion Server and TortoiseSVN.

General repository considerations

Repositories should be treated as separate products. Generally this means that completely distinct Web applications should be stored in their own repositories. On the other hand, if there’s a need to tie changes made to one project to another, the projects should be in the same repository. If in doubt, projects should be stored within the same repository, and user access should be setup as needed.

Submitting commits

Ultimately the purpose of version control is to make it easy to roll back changes to systems, as well as to track changes so that they can all be tied together as one larger change.

Since experimentation is an essential part of development, it is important that all changes be put under version control as soon as possible, and that they contain detailed, but concise notes, leaning towards too much data as opposed to too little.

For purposes of our usage, functional code should always be checked into version control as soon as possible, which realistically means immediately after it has been tested at a basic level. If changes depend upon each other (for example, a table change impacting procedures that update it) these changes should be checked in at the same time, as a single update, in order to minimize breaking changes.

Additionally, a branch should be created for purely experimental pieces of functionality. Generally, unless the code can be lost without harm, code should be placed into version control.

System setups

Specifics will be determined once a server is available for installation of Subversion and testing can begin.

Generally, a single Windows server will be used for Subversion, which will run on top of Apache, on a port other than 80 (allowing for IIS to continue running on the server). Generally this means a port in the 8000s.

Apache will be setup so that all access is logged, and so that only those individuals absolutely required access to the repositories will have access. Each individual will have their own account and password, and these same users will have tools installed to their machines to allow access to these repositories.

Scheduled tasks will be setup to perform normal maintenance on the repositories, including daily backups of all repositories.

On a regular basic, new versions of server and client tools are to be checked for, and as needed, tested and installed.

System maintenance

Because of the importance of version control, regular maintenance should be performed on both the core systems as well as individual developer’s machines. This maintenance includes regular backups and upgrades to relevant software.

Backups are to be tested on at least a monthly basis to insure the repositories can be recreated if necessary. They should also be stored on a different system, as well as potentially in a different physical location.

Upgrades to relevant software should be tested before being rolled out. Testing can include the migration of a copy of the repository to an environment with the new software, if needed.

Bug collection and fixing

General considerations

In general, bugs concerning the data should be the primary concern, with display being secondary.

Bugs that are obviously bugs should be fixed as soon as possible, but should still be tested on development and staging. If in doubt, especially as concerns ‘display bugs,’ issues should be reported back to the development team for analysis and prioritization.

Bugs in production code

With the exception of user-added content, bugs in production code should be solved and tested in development before being moved to production. If needed, the code or data should be removed completely, instead of pushing into place a hasty revision.

With the exception of bugs resulting from still-active projects, the normal process of reporting bugs should be used.

Often, for issues of a small scope, such as minor changes to display (padding), full testing on staging can be skipped, but should still be pushed to staging.

Bugs arising from development

As new functionality is created, or existing functionality is updated, the possibility of bugs being introduced is high.

Since all user testing is performed against a staging server, users will never test against a currently-in-development version of code, but will instead test against ready-for-production code.

Because of this, all bugs during development will be reported to a single source. That individual will collect all reported bugs and generally categorize them into a few basic categories, including whether the bug is with functionality or display (if determinable) and priority. The categorized listing of bugs will be reported back to a larger group for analysis and final prioritization.

Assuming there is a collection of bugs, and they are to be fixed before the changes are pushed to production, these issues will be fixed on the development server, an initial round of testing will be performed, and the changes will be pushed back to the staging server for another round of testing.

This process is to repeat until such a time when all bugs are fixed and no additional bugs are reported, or it is determined that the reported bugs will be fixed in the next version of the code.

Finalizing code and pushing to production

Once new code has gone through the necessary rounds of testing on the development and staging servers, and all bugs have been resolved or otherwise tabled for later resolution, a date should be set for pushing the changes to production.

Once the go-live date is reached, the branch initially created for development should be merged. If any changes need to be made because of this merge, they should be made, and if needed, additional testing on the development and staging server should be performed before the code is published to production.

Generally if more than one production server is involved, code should be pushed to one server at a time. Additionally, data should be pushed before any code that works on that data.

Terminology

Branch

In source control, a branch can be considered as “a line of development that exists independently of another line, yet still shares a common history if you look far enough back in time. A branch always begins life as a copy of something, and moves on from there, generating its own history.” [Source]

Typically the life-span of a branch is relatively short, as branches are generally merged back into the trunk, or core code, once the code developed within it is final.

Repository

In source control, a repository is “a central store of data. The repository stores information in the form of a filesystem tree—a typical hierarchy of files and directories. Any number of clients connect to the repository, and then read or write to these files. By writing data, a client makes the information available to others; by reading data, the client receives information from others.” [Source]

Tag

In source control, a tag is “just a “snapshot” of a project in time.” [Source]

Most source control systems have built-in revisions. In Subversion, whenever code is committed the revision number is increased by 1, and allows one to refer to the state of all code at that time. Tags allow you to refer to a particular revision not by number (revision 514), but rather by name (Internal_ad_rotation_1).

Revision history

January 28, 2010 – James Skemp: Guidelines started
February 10, 2010 – James Skemp: Guidelines updated and expanded with initial feedback

Tags:

Categories: article

(All original content on this site is licensed under the Creative Commons License Attribution-Noncommercial-No Derivative Works 3.0.)

iPod Touch, netbooks, laptops, and desktops

For the last handful of months I've been thinking about accessing the Internet, and otherwise being productive, while on the go.

A number of months back I picked up an HP device with Windows Mobile, unfortunately, after a few months the short battery life and inability to run the applications I wanted/needed to be truly productive forced me to sell it and start looking elsewhere ...

iPod Touch

The iPhone had been out for a while when I started looking at what an iPod Touch could offer. I already own an 80GB iPod Classic, so unless it offered enough room to store my music collection (at the time under 40 GB), I wasn't going to be interested.

Of course, while I kept telling myself that, part of me knew that I didn't regularly listen to my entire collection, and I could therefore get away with a smaller size. Nonetheless, price was one of the first things I looked at.

Currently we're looking at third generation models of 8, 32, and 64 GB, at (Amazon pricing, rounded up) $190, $270, and $360. The 8GB made no sense to purchase, which leaves pricing at $3-400. A little pricing when I could just get an 160GB iPod Classic for $230.

Netbook

I had looked at netbooks in the past. More real-estate, and able to run a real operating system, netbooks are made for portablility and some level of productivity.

However, the screen size is pretty harsh, but comes with the above benefits. Overall, I'd pretty much excluded netbooks as an option.

After Jeff Atwood wrote about netbooks (A Democracy of Netbooks) I started giving them another look. According to him, a $400 netbook (give or take) is about equal, in certain ways, to a $5-600+ laptop.

And that's about what you're looking to pay; $3-400 for a relatively good netbook. Unfortunately, the operating system I wanted - Windows 7 compared to Windows XP - seems to only be the Starter edition. While that's certainly not horrible, I really didn't want to be forced to a sub-par machine, performance-wise, that would limit that productivity applications I'd be able to run.

And have you seen the screen size on netbooks? I'm hardly that old, but my glass-covered eyes shrieked when I saw them.

Laptop

So it basically seems that a laptop is what I really wanted. Why didn't I just decide on a laptop in the first place? Ambitions.

I last purchased a laptop around the turn of the century. (Not often I get to use that phrase.) At that time laptops were pretty basic, but I still enjoyed mine. I'd owned nothing but desktops before, and with the exception of the last one, they were all hand-me-downs. I spec'd out the machine approximately to what I wanted (I would have gone higher, but cost was an issue) and ended up paying around a grand, if I remember correctly. (Might have been around $900 ... I have the receipt somewhere.)

It lasted me through the rest of college, until right around my last semester when it finally crapped out. I went out a picked up a KOGi monitor (which I still have and use today on my main machine) and hooked up an older desktop to make things work. Later I got it running again, but it crapped out yet again and I gave up.

Two or three years wasn't too bad, but in the coming years I stayed away from purchasing another laptop and stuck with desktops, getting more powerful machines for less money. And of course there's the ease of upgrading a desktop. First simply memory, then media drives, to hard drives.

Now I wasn't completely away from laptops during those years. I was involved in the purchase of two laptops, both of which have served their owners fairly well as they've owned them (the first is nearing the end of it's life). With this last, which got upgraded to Windows 7 shortly after it came out, I was strongly tempted to give laptops another chance. After all, a lot had changed in almost a decade.

But when I started pricing out laptops, as I wanted them, I started seeing numbers on par with what my last desktop cost, with two widescreen monitors. Did I really want to pay around a grand for a laptop?

Desktop

Which brought me back to desktops. Why pay a grand when I could get a really nice machine for less than that? Isn't that what I really wanted, so that I could replace my 4 year old HP that runs approximately 24/7, but which was still fairly good, thanks to me buying a nice machine and maxing out the RAM over time? Heck, the only thing I don't like about it is that I can't install Windows 7 on it because of the hardware that's in it, and I don't yet feel comfortable completey replacing it.

But with a desktop I lose the portability, which got me on this entire line of research.

iPad

A short while ago Apple started talking about the iPad, which they place between an iPhone (iPod Touch in my mind, since I'm happy with U.S. Cellular and don't feel like paying even more a month for Internet access) a laptop or desktop. Not to mention the various other tablet devices that are already out, or coming out. And of course, the iPad is better than a netbook.

The problem is this generally seem single-purpose, as the netbook does. Not only that, but, like the Touch/iPhone, you're forced to go through the Apple app store. That's a heavy price to pay when I can purchase a netbook running Windows and either download (for no cost) or build an application to solve a need. With Apple now going after apps which show a little skin, or T & A, it's difficult to give up control on what applications (as compared to apps) I can run on my machine.

So ...

So what I ended up doing was just looking at low-end laptops. I had gone full circle, so the only solution I saw was to purchase a laptop, but one with a relatively low cost. After a good deal of research, I kept coming back to the HP Compaq Presario CQ60-615DX.

At a little under $400, we have some amazing features; 250 GB hard drive, Windows 7 Home Premium 64-bit, a modest 2.2GHz with 2 GB of RAM (and only around $100 to max it out to a full 4 GB).

While I'm still a little 'eh' about the Compaq brand (another lasting opinion from the last century), every machine I've purchased, excluding the one Dell laptop, has been an HP. I like HP machines, and I like that all that I've purchased can still be plugged in and fired up; even the one that's got Windows Me on it.

And on BestBuy.com, I believe I even saw a reviewer suggesting graphic card models that could be swapped in to replace the one it came with, at an extremely low cost.

A co-worker also purchased one of these, if not a similar model, and when I asked him of it, said he was still happy with it. That was the last nudge I needed.

I've been mostly busy with side work, which means I might not even consider this a purchase using part of my tax refund, but which also means that I haven't had much time over the last week to really use the laptop. But having finally gotten the majority of applications that I want on it, and having spent the last 50 minutes writing this article (although a few minutes of that was doing research for this article and leaning over to choose music on my iPod), I'm still happy with my purchase, and am looking forward to continuing to use it. (In fact, I should be watching some Netflix streaming tonight on it.)

In fact, seeing as how my sister is in desperate need of a computer, I've strongly recommended this machine to her, and may be lending the money so that she can purchase one.

Full review coming shortly, but hopefully the above is of some benefit to someone else, trying to make the same decision as I was.