Archive for April, 2009

Maintain Contact with Your Site Visitors

Monday, April 27th, 2009

The web has been around for a while now and if you’re a business owner, you’re probably already online with at least a basic website.  However, now that you’ve established a presence on the web, what comes next?  How else can you use the power and reach of the web to grow your business?

One of keys to success on the web is developing strategies to convert casual visitors to lifetime customers.  There are many simple tools that can help transform your static online presence into a dynamic and living entity that visitors return to again and again.

CORPORATE BLOG
Your business is always growing – changing as you adapt to new clients, customers, and opportunities.  Those changes are something worth talking about!  A corporate blog is an easy way to show your visitors that your business is alive and thriving.  Furthermore, using email notification and RSS, you can easily broadcast your news to a community of readers who care.

EMAIL NEWSLETTERS
Once you make a sale or finish a client’s project, your business moves on and without some effort, your customer/client may soon forget the details of their experiences with you.  Regular email newsletters are an invaluable way to keep in touch with your customers, clients, and colleagues and inform them of the most recent projects, products, and/or people in your organization.  You can even build the subscription process right into your website with a simple subscribe form.

These tools offer a powerful way to keep people aware of your business.  Even if there are no known future sales opportunities, they can help generate a buzz and build your brand through word of mouth.  At Gorges Web Sites, we’re passionate about finding ways to use the web to help grow your business!  There is a wealth of options and opportunities available and we’re excited to help develop and execute the right strategies for you.

Greg Kops is a project manager at GORGES. After a decade working as a database and systems programmer, Greg uses his skills and experience to help plan and manage our larger, long-term projects.

What is the best way to manage the content of a website?

Monday, April 20th, 2009

So you have or are considering a website for your business, and know that you need to manage the content, but what is the best way to do so?screenshot_1

In the old days of the web, content management was done using the same people who programmed the site.  They would open up the right file, edit the content, and ftp the new file up to the web server.

These days, that process is slow and error-prone, and the management of your content should be done by the business owners, product managers, editors, or marketing personnel.

Use of a content management system (CMS) is imperative if your site is going to function as a quality business growth tool for you.  You need a CMS that is easy to use and always accessible.  Search engines and human visitors both are looking for fresh, relevant and updated content.

Big budget publishing companies have sophisticated work flow software to manage the development of their content, allow editors to review this content, and publishing editors to approve for release.

But what is the small website owner to do? At Gorges Web Sites, we have been delivering special-purpose content management systems for years now.  At first, we used our own CMS, affectionately named ‘GoGorges’, which is a linux- and php-based development framework and content management system that we steadily improved over many projects.

More recently, though, the open-source content management systems have really come of age.

On recent projects, we have used:

Each of these systems have pros and cons, and through experience we have learned which one is most suited for a particular set of business and publishing needs.

The great news is that the use of these content management systems has lowered the cost for delivery of a sophisticated website.  You can get more functionality for less $ than ever before!

If you’d like to learn more about how one of these content management systems can help your business and improve your search engine optimization rankings, then fill out our quick form for your free consultation and we’ll jump on a call to discuss.

Chris Grant has been building Internet web sites and commerce applications since 1994, pioneering early database-driven Web application and e-commerce projects. He has been instrumental in the construction of hundreds of Internet projects, large and small.

Server Backups With Minimal Bandwidth

Friday, April 10th, 2009

Most of our production servers are at our main co-location facility.  All these servers have second ethernet cards so monitoring and between-server file transfers will not interfere with normal web and e-mail traffic. hard drive This “shadow network” is used for our nightly backups.

One server has a lot of disk capacity and is the backup device.  For years we did a monthly/weekly/daily archive of each server over the shadow network.

However we expanded to a second co-location facility, and also run a “grid” machine at a 3rd site.  Backups now started eating a lot of bandwidth, and the monthly backups were not completing during the overnight hours.

So what to do?  Web sites consist mostly of files that do not often change, so really most of the files do not have to be backed up daily.

Our solution was to have our backup system mirror the other server files, and then at night only copy over the changed files.  We used the rsync utility to determine and copy the changed files, and then a daily archive is created that compresses the files into a single archive.  This solution also means less processing on the production servers.

Once the files are synchronized on the backup server, then a compressed archive is created and stored away.

There is also a filtering done on the files so that we do not back up temporary files or non-critical system files.

The end result is that we use our bandwidth packets sparingly.  We have backup archives, without saturating our Internet connections getting them offsite.

Matt Clark worked in academia, corporate research labs and several technology startup companies prior to GORGES. His expertise is software architecture, database development, and system administration. Matt brings GORGES over 25 years experience developing fast and robust software on a multitude of platforms and languages.

To Agile or Not To Agile

Thursday, April 9th, 2009

Gorges has published our best practices methodology, but it does not mention agile development.  Why not?

First, what is agile development?  Agile development is a set of methodologies for creating software.  These methodologies include breaking projects into smaller tasks with minimal long-term planning.  Each task, or iteration, is treated at a mini-project with planning, design, coding, and testing cycles.  Collaboration is encouraged Agile Developmentamong team members, and face-to-face communication is prefered to written documentation.  The customer is expected to be available to make decisions on design, features, and prioritizing tasks.

The proclaimed benefits are faster development and higher customer satisfaction.

So why don’t we promote agile development on our web site?

We have found that it takes a certain type of client to make agile development work.  The client must be actively involved, willing to make quick decisions and not be adverse to compromise if we learn that certain features may be costly to implement.  The smaller cycles are called “sprints” and since the deadlines are fixed, decisions are continually made to prioritize the features and tasks to meet these deadlines.

Likewise this sort of development can be a challenge to developers who are used to fixed specifications and planning the entire project before starting programming.

Gorges has had some marvelous agile-development successes, but we have also learned to not push this style onto our customers.  Another reason we do not promote this methodology is that it is difficult to estimate the project size since the development is dependent upon the client’s feature selections.

Matt Clark worked in academia, corporate research labs and several technology startup companies prior to GORGES. His expertise is software architecture, database development, and system administration. Matt brings GORGES over 25 years experience developing fast and robust software on a multitude of platforms and languages.

Marketing your web site – do you need SEO?

Friday, April 3rd, 2009

Here at Gorges Web Sites, we receive many requests for information about web site promotion.  For most people, this seems to boil down to SEO (Search Engine Optimization), or more directly ‘how do I get good ranking on Google’?  If you are really and truly interesting in growing your online business, this blog article is for you.  And as you will see, it is about much more than just SEO.

If you would like to experience the most cost-effective growth possible for your site and your business, there are 5 areas to focus on, and SEO is NOT the first:

  1. Analytics: We can’t judge the effectiveness of any marketing effort, or evaluate growth without metrics.  We highly, highly recommend Google Analytics.  It is free, and easy to install on your site.  Get it on your site before taking any more steps.  You will be amazed at the wealth of data the Google sends your way.  This simple tool will tell you what pages on your site have the highest attention, where your viewers come from, which keywords are delivering traffic, the effectiveness of your paid advertising, and much more.  Get your analytics going BEFORE you undertake any additional steps.  Do it today.
  2. Social Marketing: Building your online business requires much more than optimizing content.  It is crucial that you engage and learn from your early customers.  Foster community, push your site, generate referrals, blog about your ideas everywhere, write content, post fliers at the coffee shop.  Use facebook, twitter, put a blog on your website, encourage your visitors to add content to your site via topical discussions.  Draw your audience into ongoing discussions on your web site.  Think outside the box, drive traffic.  Start now and keep it simple and low-cost.  You are the driving passion behind your idea and your web site, let the world hear your voice.
  3. Public Relations: This step is about your relationship with your broader community.  You need to lean on traditional PR to strengthen your brand and expertise.  Build a positive opinion about your company to your neighbors, partners, employees, the public, and potential investors.  Generate press releases, develop positive relationships with the media, and build your brand in the public’s mind.
  4. SEO: What you are reading this article to find out about is likely Search Engine Optimization.  A properly constructed web site takes SEO into consideration during the design and information architecture steps.  SEO should not be an ‘afterthought’ that you outsource to some agency.  SEO is the lifeblood of your site and needs to be planned in.  If your site is not architected well, you can ‘optimize’ keywords all day long without effect.  Traditional SEO has 2 components: 1) Your site content, structure, links, keywords, menus, etc, and 2) In-links from 3rd party sites.  If you have done #2 and #3 above, you are already building in-links (continue!).  If you have proper data analysis and analytics running on your site (from #1 above), you will have up-to-date metrics on how well your site is doing.  OK, so you’ve done all of the above, built the site correctly, have analytics installed, and are generating traffic through your own efforts, it is time to analyze and optimize your site.  In an SEO analysis, we look at menu structure, content structure, keywords, title tags, meta tags, your site map (you do have a site map don’t you?), and more.  Taking as input your desired list of keywords and key-phrases, we will tune one or more content pages to maximize exposure to the words that make most sense for your business.  When done, we will watch your analytics and encourage steps 2 and 3 above as ongoing traffic-building efforts.
  5. Paid Search: Now, with all of this in place, a paid search or adwords campaign can be constructed and tuned.  Start small, have a short list of keywords and reasonable budget.  This is not about branding, this is about driving traffic.  Determine your target cost per acquisition of new customers, and evaluate if your paid search is delivering.  Drop key phrase campaigns that aren’t delivering; turn the budget up on campaigns that are delivering.

Summary: The order above is crucially important.  Don’t spend a penny on paid search or paid advertising until you can track performance, have developed brand awareness, and are engaging your community about your business and areas of expertise.  Get this together and watch your business grow exponentially.

Chris Grant has been building Internet web sites and commerce applications since 1994, pioneering early database-driven Web application and e-commerce projects. He has been instrumental in the construction of hundreds of Internet projects, large and small.

Dynamic resource management in JavaScript

Wednesday, April 1st, 2009

One of the most important features of modern web sites overall, is their ability to respond quickly and come back with the information requested by the user. We live in an “attention economy” on the Web 2.0, and if your site does not respond pretty much instantly, the user will find a site that does.

One way that modern sites achieve this, is by loading in smaller increments – for example, loading the detailed content for an item on a list can be deferred using AJAX.

Another way to break down the loading of a web application into smaller chunks, is by loading various other resources, specifically JavaScript and CSS files, on demand.

Doing this in a compatible and clean way, can be tricky.

The Challenge

Let’s look at some of the requirements that a good solution to this problem must fulfill.

First of all, some of the JavaScript frameworks we work with, do provide some sort of resource management. But we work with many different frameworks, and sometimes with no framework at all, so our solution needs to be stand-alone as well as compatible with most major JavaScript frameworks.

Secondly, we target all modern browsers – and therefore, our solution must be fully cross browser , targeting Internet Explorer 6 through 8, Firefox, Opera and Chrome, and hopefully any other standards compliant future browsers.

JavaScript is (or can be) object-oriented, meaning that a class in one script could potentially extend a class in another script. Therefore, since we are going to load resource asynchronously, we must ensure that scripts are loaded and executed in order .

Another concern is notification of resource readiness. Since resources are loaded asynchronously, and sometimes have already been loaded once, our script needs to provide a callback-notification when the resource is ready and available.

And finally, we don’t want to write code for every project to keep track of what’s been loaded and what has not. In other words, we need a load-once method, so that classes, widgets and stylesheets can be automatically loaded the first time they are needed.

Limitations

We’re going to accept certain limitations of this script.

For one, we’re not going to attempt to do a lot of error handling – if a resource can’t be loaded, this is a problem that needs to be solved by the developer, and not really something you can provide a “pretty” solution for anyway.

And secondly, some resource management scripts attempt to inject scripts in a way that allows scripts from foreign domains to run without security limitations. This has certain other drawbacks that I won’t get into, but we’re going to assume that you’re loading scripts from your own domain.

Our Solution

Our script comes in the form of a classless singleton object, which provides two methods for loading resources on demand:

Loader.load( url, [callback-function], [context-object], [driver-name] );
Loader.once( url, [callback-function], [context-object], [driver-name] );

The Loader.load() method will allow you to load the same resource repeatedly – for example, you will be able to execute the same JavaScript more than once. Just keep in mind that duplicate class declarations, and duplicate initialization, for example, could cause problems. Most likely, you will only want to use this method if you want to intentionally overwrite existing variables.

The Loader.once() method will ensure that the same resource is only loaded once. Note that the callback will be called when the resource is ready , not only the first time when the resource actually loads.

Arguments for the two functions are identical:

  • url : required – relative (to your page) or absolute URL to a JavaScript or CSS resource.
  • callback-function : optional callback-function – called when the resource (and any resources requested before it) has loaded.
  • context-object : optional object to use as the context (this) for the callback-function. Use null (or leave out) if calling context is unimportant.
  • driver-name : optional driver-name, e.g. “css” or “js” – this determines how the loaded resource is handled. If unspecified, the loader will try to determine the driver by file-extension, but will default to “js” if the file extension at the end of the URL does not match “.css” or “.js”.

Conclusion

When you need to load a collection of resources, remember that they will be loaded in the order you request them. For example, loading components for a widget-based framework such as ExtJS is possible – you can load a component class declaration, and then load another class that extends it, but you must request them in order.

Another thing to keep in mind, when you need to know when a collection of resources are ready, you don’t need to attach a callback to every request – just attach your callback-function to the last request, as this won’t execute until all previously requested resources are ready.

Source Code

Finally, here is the source code for you to cut and paste:

/*

Version:   1.1
Developer: Rasmus Schultz
License:   GPL v3 <http://www.gnu.org/licenses/gpl-3.0-standalone.html>

Copyright 2009, Gorges Web Sites <http://www.GORGES.us>

Removing this notice from the source code would be bad karma.

*/

var Loader = {
q: [], // the Queue for pending items to be loaded
reg: {}, // a registry to ensure items are loaded only once
load: function(url, cb, context, driver, once) {
var dd = url.split('.').pop();
if (!Loader.drivers[dd]) dd = driver || 'js';
var p = new Loader.Proxy(
{ url: url, cb: cb || function(){}, reg: once, driver: dd, context: context }
);
Loader.q.push(p);
Loader.next();
return p;
},
once: function(url, cb, context, driver) {
this.load(url, cb, context, driver, 1);
},
next: function() {
for (i=0; i<Loader.q.length; i++) {
var l = Loader.q[i];
if (l.state == 1) return; // already loading
if (l.state == 0) return l.load(); // not loading (and not yet loaded)
}
}
}

Loader.Proxy = function(opt) {
this.driver = opt.driver;
this.context = opt.context || this;
this.url = opt.url;
this.reg = opt.reg;
this.state = 0; // inactive
this.cb = opt.cb;
this.load = function() {
if (this.reg &amp;amp;amp;amp;amp;&amp;amp;amp;amp;amp; Loader.reg[this.url]) return this.loaded(); // already loaded once
this.state = 1; // loading
var hd = document.getElementsByTagName("head")[0];
var el = Loader.drivers[this.driver](this, this.url + (this.url.indexOf('?') == -1 ? '?' : '&amp;amp;amp;amp;amp;') + new Date().getTime());
hd.appendChild(el);
}
this.loaded = function() {
this.state = 2; // loaded
if (this.reg) Loader.reg[this.url] = 1;
this.cb.call(this.context);
Loader.next();
}
}

Loader.drivers = {

js: function(proxy, url) {
var el = document.createElement('script');
el.type = 'text/javascript';
el.src = url;
var me = proxy;
if (el.attachEvent) { // IE
el.attachEvent('onreadystatechange', function() {
if (el.readyState == 'loaded' || el.readyState == 'complete') me.loaded();
});
} else { // DOM
el.onload = function() { me.loaded(); }
}
return el;
},

css: function(proxy, url) {
var el = document.createElement('link');
el.rel = 'stylesheet';
el.type = 'text/css';
el.href = url;
el.media = 'all';
new (function(link, proxy){
this.index = document.styleSheets.length;
this.link = link;
this.proxy = proxy;
var me = this;
this.check = function() {
try {
var s = document.styleSheets[me.index];
if ((s.rules || s.cssRules).length) { // DOM || FF
window.clearInterval(me.int);
me.proxy.loaded();
}
} catch (e) {};
}
this.int = window.setInterval(this.check, 100);
})(el, proxy);
return el;
}

}
Rasmus Schultz has worked for web development companies, advertising agencies and a music software company during his extensive development career. His main strengths are software development and database design. Rasmus has more than a decade of experience with many development platforms, languages and standards.