<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss'><id>tag:blogger.com,1999:blog-8931429962005689173</id><updated>2009-09-01T12:26:14.708-04:00</updated><title type='text'>Driscoll Web Development Blog</title><subtitle type='html'>Get information, tools, news, tips, and more from the expert web developers at Driscoll Web Development.</subtitle><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default'/><link rel='alternate' type='text/html' href='http://blog.driscollwebdev.com/dwdblog.html'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://www.driscollwebdev.com/weblog/feed/rss.xml'/><author><name>Driscoll Web Development</name><uri>http://www.blogger.com/profile/06367536569287150653</uri><email>noreply@blogger.com</email></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>11</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-8931429962005689173.post-6763268024612503620</id><published>2009-02-23T09:58:00.003-05:00</published><updated>2009-02-23T10:20:17.917-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web development'/><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='social networks'/><category scheme='http://www.blogger.com/atom/ns#' term='iamguiltyof.com'/><title type='text'>Driscoll Web Development Launches iamguiltyof.com: the social confessional</title><content type='html'>On February 19, 2009, we launched &lt;a href="http://iamguiltyof.com"&gt;iamguiltyof.com: the social confessional&lt;/a&gt;. As the name of the site might imply, the purpose of iamguiltyof.com is to allow people to make anonymous confessions of guilt and follow others' confessions in real-time.&lt;br /&gt;&lt;br /&gt;We're very happy with how our first weekend went: iamguiltyof.com drew over 1,000 visits from over 700 unique visitors in just 4 days. In order to keep the momentum going we've added a Twitter bot into the mix so that users can tweet their confessions and see them posted on iamguiltyof.com AND get updates on their confessions and others' confessions via the bot's timeline (for more information on the iamguiltyof.com Twitter bot, &lt;a href="http://bit.ly/10qsXu"&gt;read this&lt;/a&gt;).&lt;br /&gt;&lt;br /&gt;Some of our users have drawn comparisons between iamguiltyof.com and similar sites, but most (if not all) have cited that iamguiltyof.com offers a distinct advantage with its real-time delivery of confessions to users. That, we believe, along with multiple points of entry to the application and a clean and simple interface not unlike that of Twitter, makes iamguiltyof.com a leader in the social confession / gossip space.&lt;br /&gt;&lt;br /&gt;But, don't take our word for it: we strongly encourage all readers to &lt;a href="http://iamguiltyof.com"&gt;go to iamguiltyof.com&lt;/a&gt; and check it out for themselves. Furthermore, we'd love to hear your feedback on the site, either via comments to this post or via the feedback form that is available on iamguiltyof.com&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931429962005689173-6763268024612503620?l=blog.driscollwebdev.com%2Fdwdblog.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/6763268024612503620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.driscollwebdev.com/2009/02/driscoll-web-development-launches.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/6763268024612503620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/6763268024612503620'/><link rel='alternate' type='text/html' href='http://blog.driscollwebdev.com/2009/02/driscoll-web-development-launches.html' title='Driscoll Web Development Launches iamguiltyof.com: the social confessional'/><author><name>Driscoll Web Development</name><uri>http://www.blogger.com/profile/06367536569287150653</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09666294476741314919'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931429962005689173.post-7243400629572141970</id><published>2009-01-29T12:45:00.006-05:00</published><updated>2009-09-01T12:26:14.735-04:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='VB'/><category scheme='http://www.blogger.com/atom/ns#' term='bitlyxapi'/><category scheme='http://www.blogger.com/atom/ns#' term='CodeProject'/><category scheme='http://www.blogger.com/atom/ns#' term='bit.ly'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><title type='text'>Why Use the BitlyXAPI?</title><content type='html'>&lt;span style="font-family:arial;"&gt;As you most likely saw in my &lt;a href="http://bit.ly/2yLj"&gt;last post&lt;/a&gt;, I've just released the BitlyXAPI .NET Library. I created this library for two reasons: first, it is my entry to the &lt;a href="http://bit.ly/1DHS1e"&gt;bit.ly API Contest&lt;/a&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;; second, I wanted to have some fun with my .NET chops while at the same time doing something helpful for the web development community. The BitlyXAPI .NET Library is free under the terms of the &lt;/span&gt;&lt;a style="FONT-FAMILY: arial" href="http://bit.ly/9LFqL"&gt;GNU GPL&lt;/a&gt;&lt;span style="font-family:arial;"&gt;, so clearly I'm not looking to make a profit off this nor am I attempting to prevent other developers from deriving their own libraries from it.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;So, if you're a .NET developer and you're reading this, you're most likely wondering what the BitlyXAPI Library can do for you - which is not a topic that I've previously addressed in-depth. I wanted to spend some time highlighting what I believe to be the key advantages to using this library in a project that implements the &lt;/span&gt;&lt;a style="FONT-FAMILY: arial" href="http://bit.ly/"&gt;bit.ly&lt;/a&gt;&lt;span style="font-family:arial;"&gt; API.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:arial;" &gt;The BitlyXAPI Library is &lt;span style="FONT-STYLE: italic"&gt;Fast&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Due in no small part to the fact that the bit.ly API itself is quite speedy, I've done my best to keep the BitlyXAPI Library's overhead low so that there is little (if any) perceptible difference between using the Library and calling the bit.ly API directly.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:arial;" &gt;The BitlyXAPI Library is &lt;span style="FONT-STYLE: italic"&gt;Open &lt;/span&gt;and &lt;span style="FONT-STYLE: italic"&gt;Adaptable&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;I'm not a huge fan of most API wrappers because they often limit what you can do, so I purposefully set out to write a library that would allow developers to leverage the bit.ly API without necessarily being put into lock-step with the API's implementation. Rather, developers can use the BitlyXAPI Library as it fits into their applications rather than build applications that strictly adhere to the functionality of the library (which is, unfortunately, the case with most API wrappers). Granted, this level of adaptability does have its drawbacks; for instance, one might notice that none of the bit.ly API methods are defined in the BitlyXAPI Library - meaning that one would have to write one's own Shorten() method in their application should they choose to do so. However, I feel that the aforementioned example highlights why the BitlyXAPI Library is so great, because it potentially allows developers to easily write complex methods with the BitlyXAPI Library. &lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;font-family:arial;" &gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;br /&gt;&lt;span style="FONT-STYLE: italic"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style="FONT-WEIGHT: bold;font-family:arial;" &gt;The BitlyXAPI Library is &lt;span style="FONT-STYLE: italic"&gt;Event-based&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;I took an asynchronous, or event-based, model into account when I wrote the BitlyXAPI Library. It allowed me to write lean, granular, and easily maintained code in the Library itself. However, it also gives developers the advantage of writing lean, granular, and easily maintained code in their own applications. And, the event-based model gives developers the assurance that their application won't hang if a method call doesn't return a result.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:arial;" &gt;The BitlyXAPI Library &lt;/span&gt;&lt;span style="FONT-STYLE: italic;font-family:arial;" &gt;&lt;span style="FONT-WEIGHT: bold"&gt;Handles Menial Tasks&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-family:arial;"&gt;For most, creating an application that imports data from an external resource is excruciating because so many lines of code must be dedicated to checking that the application has network access, then checking that the application can access the specified resource, then cleaning up when the resource is no longer needed, etc. Internally the BitlyXAPI checks with every call to the bit.ly API that the API is accessible to the application, and throws a BitlyException if the service is unavailable for any reason. The BitlyXAPI also performs its own garbage collection on the resources that it uses. Therefore, the developer can focus more on developing a solid application and spend less time writing code to perform menial tasks.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:arial;" &gt;The BitlyXAPI Library is &lt;span style="FONT-STYLE: italic"&gt;Well-documented&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Another one of my pet peeves about many (but not all) API wrappers out there is their lack of documentation and/or working samples. Upon decompressing the BitlyXAPI Library archive a developer will notice the ReadMe.txt file along with a small sample class and console application. The ReadMe.txt file provides full documentation for the BitlyXAPI Library, while the sample class and console application allows the developer to see the BitlyXAPI Library at work - right out of the box.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="FONT-WEIGHT: bold;font-family:arial;" &gt;The BitlyXAPI Library is &lt;span style="FONT-STYLE: italic"&gt;Free&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;By "free" I don't mean "no-cost", although the BitlyXAPI Library is provided at no-cost as well. Rather, I mean that because the BitlyXAPI Library is licensed under the GNU GPL, developers are free to request and obtain the Library's source code so that they may alter it to better meet their needs, or to create an extended library from it. The only thing I request is that out of respect developers acknowledge &lt;/span&gt;&lt;a style="FONT-FAMILY: arial" href="http://driscollwebdev.com/"&gt;Driscoll Web Development&lt;/a&gt;&lt;span style="font-family:arial;"&gt; and/or Brian Driscoll (me) in their applications - and that they provide a link to the &lt;/span&gt;&lt;a style="FONT-FAMILY: arial" href="http://bit.ly/gnBS"&gt;original BitlyXAPI Library&lt;/a&gt;&lt;span style="font-family:arial;"&gt; somewhere in their application's documentation.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Now that you've read this (and assuming you're a .NET developer who's interested in the bit.ly API), I hope that you'll consider using the BitlyXAPI Library in your project. If you create an application with the BitlyXAPI Library I invite you to comment on this post with a link to your work.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;The library is available for download &lt;/span&gt;&lt;a style="FONT-FAMILY: arial" href="http://bit.ly/gnBS"&gt;here&lt;/a&gt;&lt;span style="font-family:arial;"&gt;.&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931429962005689173-7243400629572141970?l=blog.driscollwebdev.com%2Fdwdblog.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/7243400629572141970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.driscollwebdev.com/2009/01/why-use-bitlyxapi.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/7243400629572141970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/7243400629572141970'/><link rel='alternate' type='text/html' href='http://blog.driscollwebdev.com/2009/01/why-use-bitlyxapi.html' title='Why Use the BitlyXAPI?'/><author><name>Driscoll Web Development</name><uri>http://www.blogger.com/profile/06367536569287150653</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09666294476741314919'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931429962005689173.post-5081397195654369621</id><published>2009-01-27T09:52:00.003-05:00</published><updated>2009-01-27T09:58:23.912-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web development'/><category scheme='http://www.blogger.com/atom/ns#' term='.NET'/><category scheme='http://www.blogger.com/atom/ns#' term='VB'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><category scheme='http://www.blogger.com/atom/ns#' term='bit.ly'/><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><category scheme='http://www.blogger.com/atom/ns#' term='C#'/><category scheme='http://www.blogger.com/atom/ns#' term='downloads'/><title type='text'>Now Available: The BitlyXAPI Library for .NET Development</title><content type='html'>&lt;span style="font-family:arial;"&gt;Introducing: the BitlyXAPI library for .NET development!&lt;/span&gt;&lt;span style="font-family:arial;"&gt;&lt;br /&gt;&lt;br /&gt;This library allows .NET developers who wish to leverage the Bitly API in their applications a way of quickly implementing the Bitly API in their libraries/apps without having to worry about the plumbing, constructing calls, etc.&lt;br /&gt;&lt;br /&gt;The zip file includes the BitlyXAPI DLL, a sample application (with source code), and documentation.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;Download the BitlyXAPI package here:&lt;/span&gt;&lt;br /&gt;&lt;a href="http://bit.ly/gnBS"&gt;http://bit.ly/gnBS&lt;/a&gt;&lt;br /&gt;&lt;a href="http://driscollwebdev.com/downloads/BitlyXAPI/BitlyXAPI_1.0.zip"&gt;http://driscollwebdev.com/downloads/BitlyXAPI/BitlyXAPI_1.0.zip&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931429962005689173-5081397195654369621?l=blog.driscollwebdev.com%2Fdwdblog.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/5081397195654369621/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.driscollwebdev.com/2009/01/now-available-bitlyxapi-library-for-net.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/5081397195654369621'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/5081397195654369621'/><link rel='alternate' type='text/html' href='http://blog.driscollwebdev.com/2009/01/now-available-bitlyxapi-library-for-net.html' title='Now Available: The BitlyXAPI Library for .NET Development'/><author><name>Driscoll Web Development</name><uri>http://www.blogger.com/profile/06367536569287150653</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09666294476741314919'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931429962005689173.post-5739248023101317093</id><published>2009-01-16T13:21:00.009-05:00</published><updated>2009-01-16T17:03:25.960-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips and advice'/><category scheme='http://www.blogger.com/atom/ns#' term='flash components'/><category scheme='http://www.blogger.com/atom/ns#' term='actionscript'/><category scheme='http://www.blogger.com/atom/ns#' term='numericstepper'/><title type='text'>Creating a Read-Only Numeric Stepper Component in Flash/Actionscript 2.0</title><content type='html'>&lt;span style="font-family:arial;"&gt;While working on a project recently I spent some time getting to know the Numeric Stepper component. Anyone who has worked with the component most likely knows about its most obvious shortcoming: the text field within the component is &lt;strong&gt;read/write&lt;/strong&gt;! Of course, the actual value associated with the component only changes in response to events fired by the Mouse or Key (up/down arrow) objects, but nonetheless our client wasn't happy with the fact that a user could type in the text field. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;So, I set about trying to make the text field &lt;strong&gt;read only.&lt;/strong&gt; Based on my research I gathered quickly that this has been attempted before with varying results. One of the key issues that makes the proposition of "tweaking" a component difficult is the fact that a component class cannot be subclassed; otherwise, it would be fairly straightforward to create a new class that inherits from NumericStepper and simply add the necessary properties and methods to support read/write and read only modes for instances derived from the subclass.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;With subclassing out of the question most of the developers' blogs I encountered suggested overriding methods of the mx.core.mx_internal namespace (from which the enabled property of the NumericStepper.inputField object is derived), however that's a bit cumbersome and a complex solution to what seems to be a relatively straight-forward problem.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;Luckily for me, I've been playing around a bit with coding ActionScript Communication scripts, which are (more or less) ActionScript 1.0 scripts. In these scripts, the "easy" way to add properties and methods to a built-in class is to use the prototype object (i.e.: &lt;em&gt;ClassName&lt;/em&gt;.prototype.&lt;strong&gt;someNewFunction&lt;/strong&gt; = function(){...}). With that concept in mind I tried to see if I could use the prototype object to extend the capabilities of my NumericStepper component... and it worked! What follows is the code that allows you to do this for yourself:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;strong&gt;&lt;span style="font-family:Arial;"&gt;1. Create a new Flash document. &lt;/span&gt;&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;2. Open the Components panel and drag two instances of the NumericStepper component onto the stage. Give the two steppers instance names of &lt;/strong&gt;"myStepper1" &lt;strong&gt;and &lt;/strong&gt;"myStepper2&lt;strong&gt;", respectively.&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;strong&gt;3. Add the following code to the Main Timeline of your document:&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;&lt;iframe style="WIDTH: 416px; HEIGHT: 410px; BACKGROUND-COLOR: #ccc" src="http://blog.driscollwebdev.com/NumericStepperExtension.as.txt" href="NumericStepperExtension.as.txt"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;So, what does this code do, exactly? Well, the draw() method overrides the draw() method of the NumericStepper class. The only "new" functionality we've added is within the if-block; we test the instance's &lt;strong&gt;editable&lt;/strong&gt; property, and if that property has a value of "false" then the component's text field is disabled. Otherwise, the text field is enabled (which is the default). All of the code that follows the if-block is the same as the NumericStepper's native draw() method.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;The next two functions, &lt;strong&gt;setEditStatus &lt;/strong&gt;and &lt;strong&gt;getEditStatus&lt;/strong&gt; are simply getter/setter functions for the &lt;strong&gt;editable&lt;/strong&gt; property.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;Finally, I register the &lt;strong&gt;editable&lt;/strong&gt; property with the component using the AS1-style &lt;strong&gt;addProperty&lt;/strong&gt; method. &lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;That's all there is to it! Now, to see this new property in action simply create a new layer on your main timeline and add the following code:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;myStepper1.editable = true;&lt;br /&gt;myStepper2.editable = false;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;Go ahead and test out your movie. One instance (myStepper1) should have an editable text field, while the other (myStepper2) should not.&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;Happy coding!&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:Arial;"&gt;(Download the source script for the extended NumericStepper here: &lt;a href="http://blog.driscollwebdev.com/NumericStepperExtension.as"&gt;http://blog.driscollwebdev.com/NumericStepperExtension.as&lt;/a&gt;)&lt;/span&gt;&lt;br /&gt;&lt;a href="http://blog.driscollwebdev.com/NumericStepperExtension.as.txt"&gt;NumericStepperExtension.as.txt&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931429962005689173-5739248023101317093?l=blog.driscollwebdev.com%2Fdwdblog.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/5739248023101317093/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.driscollwebdev.com/2009/01/creating-read-only-numeric-stepper.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/5739248023101317093'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/5739248023101317093'/><link rel='alternate' type='text/html' href='http://blog.driscollwebdev.com/2009/01/creating-read-only-numeric-stepper.html' title='Creating a Read-Only Numeric Stepper Component in Flash/Actionscript 2.0'/><author><name>Driscoll Web Development</name><uri>http://www.blogger.com/profile/06367536569287150653</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09666294476741314919'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931429962005689173.post-1896061749050827841</id><published>2008-04-10T08:51:00.007-04:00</published><updated>2008-04-10T09:16:43.987-04:00</updated><title type='text'>Freshening Up</title><content type='html'>Things have certainly been busy here, so we apologize for the long delay since the last post. Here are how things are going from our end:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;4 Out of 5 Stars&lt;br /&gt;&lt;/span&gt;We're really excited that &lt;a href="http://www.builtwith.com"&gt;BuiltWith.com&lt;/a&gt; has given us &lt;a href="http://www.builtwith.com/?DriscollWebDev.com"&gt;&lt;/a&gt;&lt;a href="http://builtwith.com/?DriscollWebDev.com"&gt;4 out of 5 stars&lt;/a&gt; for Technology and Site Optimization. Of course, having a standards-compliant website that plays nice with search engines doesn't guarantee visitors, but it does go a long way to ensure that our site is accessible from a multitude of different browsers and computer/monitor configurations.&lt;span style="font-weight: bold;"&gt;&lt;br /&gt;&lt;br /&gt;Q1 Results&lt;br /&gt;&lt;/span&gt;We finished Q1 2008 about 7% short of our revenue target. However we were able to put enough pennies in our piggy bank to write our bottom line number in black. It's pretty scary out there these days for most businesses, however we've been lucky to have steady work so far this year. We just hope we didn't jinx ourselves by saying that...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;New Look&lt;br /&gt;&lt;/span&gt;We've been looking long and hard at our &lt;a href="http://www.quantcast.com/driscollwebdev.com"&gt;analytics reports&lt;/a&gt; over the last few months, and the picture hasn't been great. Upon closer inspection we realized that we were putting our visitors to sleep with our rather lengthy and text-heavy homepage. So, we've  reorganized our top landing page and &lt;a href="http://www.driscollwebdev.com/home.php"&gt;restated our purpose&lt;/a&gt; to more accurately and more concisely state what it is that we do. We've also changed some other things here and there throughout the site, but it's hardly worth mentioning. You'll just have to check out the whole thing for yourself!&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;What We're Up To...&lt;br /&gt;&lt;/span&gt;We're still toiling away with a rather large client, and it has been quite a lot of fun. We began working with the firm in December, and although initially we were assigned some web development projects, we've recently begun to geek out on object-oriented ActionScript code for their Flash-based content. It's really an exciting time for us, and we're thrilled to be kept on the ride.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;(Sort of) New Year's Resolution&lt;br /&gt;&lt;/span&gt;April 1 used to be the start of the New Year, so by our logic it's not too late for a resolution. Although we're busy with clients (and hope to stay that way), we're resolving to keep our site (and this blog, specifically) more up-to-date going forward. For those who read it, that is hopefully good news.&lt;br /&gt;&lt;br /&gt;So, until next time...&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931429962005689173-1896061749050827841?l=blog.driscollwebdev.com%2Fdwdblog.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/1896061749050827841/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.driscollwebdev.com/2008/04/freshening-up.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/1896061749050827841'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/1896061749050827841'/><link rel='alternate' type='text/html' href='http://blog.driscollwebdev.com/2008/04/freshening-up.html' title='Freshening Up'/><author><name>Driscoll Web Development</name><uri>http://www.blogger.com/profile/06367536569287150653</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09666294476741314919'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931429962005689173.post-8757131742709620163</id><published>2008-02-18T14:22:00.007-05:00</published><updated>2008-02-18T16:44:14.549-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='tips and advice'/><category scheme='http://www.blogger.com/atom/ns#' term='domain name registration'/><title type='text'>Is Your Registrar's Multi-year Deal Worth It?</title><content type='html'>Almost every domain name registrar out there is offering a deal these days: pay up front to register your domain name over a multi-year period and save money. The question that my clients and colleagues alike invariably ask is whether or not these deals are worth it.&lt;br /&gt;&lt;br /&gt;My answer: Maybe.&lt;br /&gt;&lt;br /&gt;Realistically, whether or not a multi-year registration is worth the cost depends on a lot of variables. For instance, the first question I ask is "Will you still have a website in 5 years? What about in 10?", and, "If so, do you think your business' name will be the same as it is now?"&lt;br /&gt;&lt;br /&gt;Usually the blank stare is enough to tell me that a 10 year deal is probably not a good investment. But let's assume for a second that my client knows for sure that her online venture will still be up and running 5 or 10 years from now. Is it still a good deal? Well, then it all comes down to finances.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Common Knowledge and Misconceptions&lt;/span&gt;&lt;br /&gt;Of course it's your registrar's duty to make you think that you're making out like a bandit when you opt-in to a multi-year deal, which is why it likes to tell you what percentage you're saving if you take the multi-year option: "Save 50% with a 10 year plan!"&lt;br /&gt;&lt;br /&gt;50% of what? Indeed, that is the question. By making some quick calculations it's usually pretty easy to see that you're saving when compared to 10 years at the full price (whatever that may be). What your registrar doesn't want you to know is that you may not be saving as much as you think.&lt;br /&gt;&lt;br /&gt;Anyone who has been subjected to a collegiate finance course can tell you that $1 is worth more in the future than it is today. How is that possible? Well, imagine that you have $1 right now, and you put it into a high-yield savings account that has a 4% annual yield. A year from now your $1 will be worth $1.04. Hence, your $1 will be worth 4 cents more a year from now than it is today.&lt;br /&gt;&lt;br /&gt;We can use a similar approach to figure out what $1 in the future is worth today. Again, let's imagine that the current annual interest rate on a high-yield savings account is 4%. We would like to know how much to deposit today in order to have $1 a year from now.&lt;br /&gt;&lt;br /&gt;$1/1.04 = $0.96*&lt;br /&gt;(*rounded to two decimal places)&lt;br /&gt;&lt;br /&gt;So, we'd need to deposit 96 cents into our high-yield savings account in order to withdraw $1 a year from now. $0.96 is the &lt;span style="font-weight: bold;"&gt;&lt;span style="font-style: italic;"&gt;present value&lt;/span&gt;&lt;/span&gt; of $1 in one year if the current interest rate is 4%.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Multi-year Discounts and Present&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;Values&lt;/span&gt;&lt;br /&gt;Now let's use what we know about present values to determine whether or not we're getting a good deal.&lt;br /&gt;&lt;br /&gt;As of today, &lt;a href="http://www.register.com"&gt;Register.com&lt;/a&gt; is offering multi-year registration of top-level domains at the following prices:&lt;br /&gt;&lt;br /&gt;1 year: $35&lt;br /&gt;2 years: $70&lt;br /&gt;5 years: $149&lt;br /&gt;10 years: $249&lt;br /&gt;&lt;br /&gt;Clearly, the alternative to purchasing one of these packages is to simply pay the regular price of $35 per year. But, as we already know, $35 is worth less today than it will be in the future, so we need to know what the &lt;span style="font-style: italic;"&gt;&lt;span style="font-weight: bold;"&gt;present value&lt;/span&gt;&lt;/span&gt; of making a $35 annual payment is over several years, keeping in mind that we'll be making our payment &lt;span style="font-weight: bold;"&gt;at the start of each annual period&lt;/span&gt;. The current annual yield of a business savings account with &lt;a href="http://www.ingdirect.com"&gt;ING Direct&lt;/a&gt; is 3.75%, so the present value of $35 paid annually with an interest rate of 3.75% is:&lt;br /&gt;&lt;br /&gt;1 year: $35&lt;br /&gt;2 years: $68.73&lt;br /&gt;5 years: $162.80&lt;br /&gt;10 years: $298.23&lt;br /&gt;&lt;br /&gt;From this we can see a few things:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;We will indeed save money if we opt for the 5 or 10 year plan. However, we are not saving as much as Register.com would like us to believe (for instance, we're really only saving $49.23 rather than $101 by going with the 10 year plan).&lt;/li&gt;&lt;li&gt;We actually lose money by taking the 2-year plan. &lt;/li&gt;&lt;/ol&gt;Point #2 is important to note, as most of us would simply think that paying $70 for 2 years up-front is the same as paying $35 now and $35 a year from now, but it is not. Instead, we could pay $35 now and put $33.73 into a high-yield savings account earning 3.75% interest. In a year we'd have $35 which we could use to pay for another 1-year contract. Thus, our second year really only costs $33.73 rather than $35. &lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Deal or No Deal&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;In this case we see that the longer-term deals (5 and 10 years) with Register.com are certainly money-savers &lt;span style="font-style: italic;"&gt;right now&lt;/span&gt;, but will they always be? Maybe, maybe not.&lt;br /&gt;&lt;br /&gt;In our analysis above we assumed two things:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The annual registration fee will remain constant at $35 over the next 10 years.&lt;/li&gt;&lt;li&gt;The annual interest rate of our high-yield savings account will remain constant at 3.75% over the next 10 years.&lt;/li&gt;&lt;/ol&gt;If both of our assumptions remain true over the next 5 or 10 years, then we know that we've saved money by taking the multi-year deal. But what if we take the multi-year deal and one (or both) of our assumptions prove to be false? Let's find out what happens...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;What happens if the annual registration fee changes?&lt;/span&gt;&lt;br /&gt;If we take the multi-year deal and the registration fee changes then we may not have made a good deal. If the annual fee goes up, then clearly we'll have saved even more than we'd initially thought over the contract term. However, if the annual registration fee goes down, then it's certain that we're saving less than we initially thought, and it's possible that we're actually losing money over the course of the contract. It all depends on how much the annual fee goes down and how far into the contract term we are. Generally speaking, smaller price changes will have a greater impact earlier in the contract than they will later.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;What happens if the annual savings yield changes?&lt;/span&gt;&lt;br /&gt;Similarly, if we take the multi-year deal and the annual yield of the savings account changes, then it is possible that we've not made a good deal. Generally speaking, if the interest rate goes down then we'll have saved more money with our long-term contract than we initially thought. But, if the interest rate goes up then it's certain that we're saving less than we initially thought, and it's possible that we're actually losing money. Again, this depends on how much the interest rate goes up and how far into the contract term we are. And, just like price changes, smaller interest rate changes earlier in the contract will have a greater impact than the same changes later in the contract.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;What happens if both the interest rate and the registration fee change?&lt;/span&gt;&lt;br /&gt;Once again, the extent to which our potential savings is affected depends on how much each changes. If the interest rate goes up AND the registration fee goes down, then the two effectively compound and we'll have saved far less money than we initially thought when we signed the multi-year contract. However, if the interest rate goes up but the registration fee also goes up (or if they both go down), then it's possible that the two changes will simply cancel each other, and the net savings will be comparable to the deal we had initially.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Other Risks of Multi-year Deals&lt;/span&gt;&lt;br /&gt;There are certainly other risks associated with multi-year domain registration contracts that go beyond interest rates and registration fees. Chief among your concerns should be the longevity of your potential registrar, however there are other things to consider as well. Be sure to read your contract carefully, as there may be additional fees incurred for certain services, and the terms of the contract might make it painfully difficult and costly for you to get out of the deal if it goes south (or if you find a better deal...).&lt;br /&gt;&lt;br /&gt;At the end of the day, the question of whether or not you should engage in a multi-year domain name registration will depend largely on your firm's goals over the next 2 to 10 years, while the financial implications of a long-term deal may not be the first thing that comes to mind. Nonetheless, it is important to take those financial concerns into consideration! If you're unsure about it right now, stick with a yearly renewal plan. After all, you can always decide at a later date to go with a long-term commitment.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931429962005689173-8757131742709620163?l=blog.driscollwebdev.com%2Fdwdblog.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/8757131742709620163/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.driscollwebdev.com/2008/02/is-your-registrars-multi-year-deal.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/8757131742709620163'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/8757131742709620163'/><link rel='alternate' type='text/html' href='http://blog.driscollwebdev.com/2008/02/is-your-registrars-multi-year-deal.html' title='Is Your Registrar&apos;s Multi-year Deal Worth It?'/><author><name>Driscoll Web Development</name><uri>http://www.blogger.com/profile/06367536569287150653</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09666294476741314919'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931429962005689173.post-5467495564683875037</id><published>2008-02-12T11:35:00.003-05:00</published><updated>2008-02-13T09:14:13.972-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web development'/><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='syndicated content'/><title type='text'>Piping Up About Yahoo! Pipes</title><content type='html'>Syndicated content is, in my opinion, the boon of the Web 2.0 age. Both casual and power internet users incorporate feeds into their daily lives - some without even realizing it. Syndication allows us to quickly and easily get the up-to-date information that we want or need with a minimum of effort (given readily available consumption mediums such as desktop readers, mobile devices, web browsers, and email clients).&lt;br /&gt;&lt;br /&gt;Of course, syndication does have its downsides. One problem is that of "over-subscription", meaning that a feed consumer is subscribed to more feeds than he can possibly read in a reasonable amount of time. Couple with this problem the fact that many feeds contain the same (or very similar) content, and it's easy to see why the novelty wears off for most users. Add, just for fun, the fact that most people who subscribe to syndicated content do so through different consumption media, and the world of syndicated content consumption becomes a mess rather quickly.&lt;br /&gt;&lt;br /&gt;Take my father-in-law, a devout New England sports fan, for example. A recent inspection of his home computer revealed that he is subscribed to several different sports-related feeds, including: 1 feed for score updates, 1 feed for news, and 2 editorial blog feeds. I suspect that my father-in-law has also subscribed to these same four feeds on his computer at work. So, in total, he has loaded eight separate URLs and clicked on a "subscribe" link (or icon) eight separate times in order to get his daily sports fix, which seems like a lot of work.&lt;br /&gt;&lt;br /&gt;Shouldn't there be an &lt;em&gt;easier&lt;/em&gt; way?&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;Enter Yahoo! Pipes&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;If you've never heard of &lt;a href="http://pipes.yahoo.com/"&gt;Yahoo! Pipes&lt;/a&gt;, you're probably wondering what it is exactly. Put simply, it's a way to aggregate (and/or manipulate) content from multiple sources, and output that content to a single source. Anyone with a Yahoo! account can create new Pipes, and the surprisingly intuitive drag-and-drop interface makes it as easy as can be to aggregate content from multiple sources.&lt;br /&gt;&lt;br /&gt;For my father-in-law, I fetched the sports news feed from &lt;a href="http://www.espn.go.com/"&gt;ESPN&lt;/a&gt;, scores from &lt;a href="http://www.totallyscored.com/"&gt;totallyscored.com&lt;/a&gt;, and his hometown team blogs from the &lt;a href="http://www.boston.com/sports"&gt;Boston Globe&lt;/a&gt;. With the data in hand, I filtered the ESPN feed to include only news for his teams and sorted all of the data by date (most recent first). Then, I simply saved and published my new Pipe, and it was all ready to go. But, to make my new Pipe easy to remember, I used Yahoo's convenient pipe naming feature... so now I can always find it at &lt;a href="http://pipes.yahoo.com/driscollwebdev/newenglandsports"&gt;http://pipes.yahoo.com/driscollwebdev/newenglandsports&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;So now my father-in-law only has to put one address into his feed reader in order to get caught up on his teams' news, scores, and editorials. Truthfully, though, I haven't even gotten to the part where Pipes shines.&lt;br /&gt;&lt;br /&gt;Let's say that my father-in-law decides that he wants to add another blog and another news feed to his syndicated content. Under the old regime, he would have to subscribe to each in all of his feed readers, meaning that he would have to type the URI into his browser and then click 'Subscribe' at least twice (four times if we assume that he'll do it at work too).&lt;br /&gt;&lt;br /&gt;But with Pipes, all he has to do is log in and add the URI to the list of feeds already aggregated in his Pipe... and that's it. There's nothing else to subscribe to because he's already subscribed to the Pipe - so the new data will just start flowing in to all of his reader applications!&lt;br /&gt;&lt;br /&gt;From a developer's perspective, Pipes is a great shortcut for the kind of work that would normally take up quite a bit of time. Rather than spending time creating the code to filter, sort, and format syndicated content from multiple sources, we can simply retrieve our new Pipe's RSS feed and use the pre-formatted, pre-sorted, and pre-filtered data in whatever manner we choose. This allows us to focus more on building a cool application (a Boston-sports-skinned SpringWidget perhaps), and less time worrying about data cleanliness.&lt;br /&gt;&lt;br /&gt;I've only really scratched the surface here of what Yahoo! Pipes can do - I highly recommend that you give it a try for yourself. If you want to see some examples of our Pipes, you can check them out at &lt;a href="http://pipes.yahoo.com/driscollwebdev"&gt;http://pipes.yahoo.com/driscollwebdev&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Brian&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931429962005689173-5467495564683875037?l=blog.driscollwebdev.com%2Fdwdblog.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/5467495564683875037/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.driscollwebdev.com/2008/02/piping-up-about-yahoo-pipes.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/5467495564683875037'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/5467495564683875037'/><link rel='alternate' type='text/html' href='http://blog.driscollwebdev.com/2008/02/piping-up-about-yahoo-pipes.html' title='Piping Up About Yahoo! Pipes'/><author><name>Driscoll Web Development</name><uri>http://www.blogger.com/profile/06367536569287150653</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09666294476741314919'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931429962005689173.post-2299838627415932885</id><published>2008-02-02T12:30:00.000-05:00</published><updated>2008-02-02T17:57:33.703-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web 2.0'/><category scheme='http://www.blogger.com/atom/ns#' term='tips and advice'/><category scheme='http://www.blogger.com/atom/ns#' term='online marketing'/><category scheme='http://www.blogger.com/atom/ns#' term='social networks'/><title type='text'>It's a Web 2.0 World, baby, and you'd better get on the bus now before you (and your revenue generating properties) miss out!</title><content type='html'>&lt;div style="text-align: justify;"&gt;You're a small business owner. Your business has a website. You have children.&lt;br /&gt;&lt;br /&gt;You could learn a thing or two from your children about how to make the most of your company's presence on the web.&lt;br /&gt;&lt;br /&gt;How?&lt;br /&gt;&lt;br /&gt;First, an aside: you've probably heard about this whole "Web 2.0" business the last couple of years. But how many times have you heard it defined? Do you really know what Web 2.0 is? Do you know what it stands for?&lt;br /&gt;&lt;br /&gt;In its simplest sense, the term Web 2.0 simply conveys the message that the World Wide Web has come a long way since its humble beginnings. From a developer's perspective, Web 2.0 defines websites that are standards-compliant and optimized for interoperability (there's a lot that goes into both aspects, but we'll skip that for now). From a user's perspective, Web 2.0 defines the ability to create and share content from multiple sources, whether it be a blog, a news feed, photos, music, or just about anything else that can be served up online.&lt;br /&gt;&lt;br /&gt;It's probably no big surprise that the 18-24 demographic represents the largest proportion of visitors to Web 2.0 sites like &lt;a href="http://www.youtube.com/"&gt;YouTube&lt;/a&gt;, &lt;a href="http://www.flickr.com/"&gt;Flickr&lt;/a&gt;, and &lt;a href="http://www.wikipedia.org/"&gt;Wikipedia&lt;/a&gt; according to &lt;a href="http://www.hitwise.com/"&gt;Hitwise&lt;/a&gt;, a market data research firm that specializes in internet marketing. Further, research from &lt;a href="http://www.avenuea-razorfish.com/"&gt;Avenue A | Razorfish&lt;/a&gt; suggests in its Digital Consumer Behavior Study that 55% of online consumers rely on user reviews to determine whether a product or service is worth purchasing.&lt;br /&gt;&lt;br /&gt;Of course, many big companies have taken advantage of the opportunities to reach the wide audiences of the aforementioned sites, as well as social networks such as &lt;a href="http://www.myspace.com/"&gt;MySpace&lt;/a&gt; and &lt;a href="http://www.facebook.com/"&gt;Facebook&lt;/a&gt;. Smaller outfits that lack the advertising budgets of the retail giants have used sites like YouTube, MySpace, Facebook, and Flickr to their advantage by creating profiles, uploading "soft" ad videos, uploading photos of new products (or even better, uploading photos of people using those products), and creating social groups around their products and services. And, many companies have also managed to attract a following of Friends on social networking sites.&lt;br /&gt;&lt;br /&gt;The true advantage of these types of sites is that they allow users to leave comments for other users pertaining to photos, blog entries, videos, you name it... so, it's likely that a user who has purchased a product from a certain company will leave a comment for that company on its social networking profile. And, it's likely that the comment will be an ad-hoc review of the product. With the assumption that the review is positive, this will serve effectively as a public endorsement for your product. Collect a few such comments, and don't be surprised when traffic to your company's website begins to pick up.&lt;br /&gt;&lt;br /&gt;Of course, in order to take full advantage of all the marketing opportunities that this Web 2.0 world has to offer, you have to have the time and ability to create your own user-created content on Web 2.0 sites. This is where your kids (or your neighbor's kids) come in: chances are that they are well-versed in the &lt;span style="font-style: italic;"&gt;lingua franca&lt;/span&gt; of these sites already, and they could probably give you quite a tutorial.&lt;br /&gt;&lt;br /&gt;-DWD Staff&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931429962005689173-2299838627415932885?l=blog.driscollwebdev.com%2Fdwdblog.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/2299838627415932885/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.driscollwebdev.com/2008/02/its-web-20-world-baby-and-youd-better.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/2299838627415932885'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/2299838627415932885'/><link rel='alternate' type='text/html' href='http://blog.driscollwebdev.com/2008/02/its-web-20-world-baby-and-youd-better.html' title='It&apos;s a Web 2.0 World, baby, and you&apos;d better get on the bus now before you (and your revenue generating properties) miss out!'/><author><name>Driscoll Web Development</name><uri>http://www.blogger.com/profile/06367536569287150653</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09666294476741314919'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931429962005689173.post-5360556400418898744</id><published>2007-12-21T19:59:00.000-05:00</published><updated>2007-12-21T22:42:11.207-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web development'/><category scheme='http://www.blogger.com/atom/ns#' term='news'/><title type='text'>Technology for the Holidays</title><content type='html'>So in case you haven't heard, Christmas is right around the corner - which means 2008 is coming up fast. We're gearing up for a new year at DWD, and we have some pretty cool prospects in front of us for oh-eight.&lt;br /&gt;&lt;br /&gt;First and foremost, we're all-in on a consulting contract with one of the Philly area's leading WBT/E-Learning software development firms. We've spent a few weeks with the folks at this growing company, and so far it has been a blast. We're looking forward to working with them throughout 2008.&lt;br /&gt;&lt;br /&gt;"Hey, what's with the title?!? I thought this post was supposed to be about technology?", you might be wondering aloud.&lt;br /&gt;&lt;br /&gt;Well, fear not, we have some juicy tidbits for you from inside the walls of DWD!&lt;br /&gt;&lt;br /&gt;As part of our contract with the aforementioned E-Learning firm, we've been looking into new ways to develop and deliver the firm's software. What did we find? We found the Flex 3 beta SDK and Adobe AIR, of course! After unzipping everything and flying through the code in the sample apps, we put together a few POCs for our client. All told, it was a lot of fun playing around with Flex and AIR, and we already have some ideas for some desktop RIAs that we plan to work on in our spare time.&lt;br /&gt;&lt;br /&gt;While we wouldn't qualify this as a review of either Flex or AIR, they do have their downside - most notably the fact that Adobe has opted not to support Flex or AIR development in pre-CS3 versions of Dreamweaver and Flash. This is not very surprising, of course, as Adobe is doing everything it can to bring users of the Macromedia product line into the CS3 fold. However, it would be nice if Adobe gave some consideration to those who purchased Macromedia Suite 8.0 just before the merger was announced.&lt;br /&gt;&lt;br /&gt;Seeking an IDE that would support both Flex and AIR development, we came across Aptana Studio 1.0. At first seemingly lightweight, we found some pleasant surprises in Aptana Studio's plugins to support AIR, PHP, AJAX, and Ruby on Rails development. We were also quite happy to find that we could build in support for Flex development simply by specifying the Flex compiler. What's more, Aptana Studio includes several Javascript libraries for RIA development - including Scriptaculous, Yahoo! UI, MooTools, and several others. Best of all, Aptana Studio supports iPhone application development via plugin, which is really exciting (almost as exciting as an iPhone under the tree).&lt;br /&gt;&lt;br /&gt;As you can see, we have a lot to look forward to in the new year, and we hope you do as well. Happy and Safe Holidays from us to you... We'll see you in 2008!&lt;br /&gt;&lt;br /&gt;Brian Driscoll&lt;br /&gt;Owner, Driscoll Web Development&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931429962005689173-5360556400418898744?l=blog.driscollwebdev.com%2Fdwdblog.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/5360556400418898744/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.driscollwebdev.com/2007/12/technology-for-holidays.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/5360556400418898744'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/5360556400418898744'/><link rel='alternate' type='text/html' href='http://blog.driscollwebdev.com/2007/12/technology-for-holidays.html' title='Technology for the Holidays'/><author><name>Driscoll Web Development</name><uri>http://www.blogger.com/profile/06367536569287150653</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09666294476741314919'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931429962005689173.post-8027080978606895314</id><published>2007-11-30T10:02:00.000-05:00</published><updated>2007-11-30T17:14:42.498-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='web development'/><category scheme='http://www.blogger.com/atom/ns#' term='tips and advice'/><category scheme='http://www.blogger.com/atom/ns#' term='security'/><title type='text'>4 Ways to Keep Your Forms Safe</title><content type='html'>&lt;div style="text-align: justify;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:100%;"&gt;It's every webmaster's deepest fear, and as developers we hear about it more and more each day: brute force attacks on online forms that litter websites, databases, blogs, forums, and inboxes with unwanted Spam. From the webmaster's perspective it's both tedious and costly to remove database records and blog/forum comments that promise everything from free Viagra to... well, things we won't even mention here. And, not only do these Spam attacks cause eyesores in visual content, they also eat up bandwidth and storage space - both precious commodities these days.&lt;br /&gt;&lt;br /&gt;Here are some ideas for webmasters and web developers to implement in order to keep their forms from becoming targets for Spam attacks.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;1. Validate Form Input on the Server&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;This seems like an obvious step to take, but there are still so many websites out there that do not implement server-side validation of form input. Web developers often complain that server-side input validation impedes usability and page flow by adding an additional step to the form-filling process, but the rise of &lt;a href="http://developer.mozilla.org/en/docs/AJAX"&gt;AJAX&lt;/a&gt; has rendered that complaint all but obsolete. Current technologies such as AJAX make communicating with the server in real-time (as the form is being filled) possible, thus form inputs can easily be validated on the server without causing headaches for the end-user. We recommend using &lt;a href="http://www.opengroup.org/onlinepubs/009695399/basedefs/xbd_chap09.html"&gt;Regular Expressions&lt;/a&gt; to search for unwanted input.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;2. Implement CAPTCHA Verification on Your Form&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;CAPTCHA, short for "Completely Automated Public Turing test to tell Computers and Humans Apart", is quickly becoming the de-facto standard for protecting forms against brute force attacks. The method typically involves the use of an image that contains heavily distorted text on a "noisy" background (see image below). The way in which the image appears prevents computers from successfully solving the problem of identifying the character sequence, however to a human it's easy to see that the words are "following" and "finding."&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://www.driscollwebdev.com/weblog/uploaded_images/290px-Modern-captcha-710751.jpg"&gt;&lt;img style="cursor: pointer;" src="http://www.driscollwebdev.com/weblog/uploaded_images/290px-Modern-captcha-710749.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:85%;"&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;We subscribe to the DRTW principle when it comes to this topic, so we highly recommend implementing a third-party CAPTCHA solution on your form rather than trying to code it yourself (freeCap, available from &lt;a href="http://www.puremango.co.uk/"&gt;pureMango&lt;/a&gt;, is our favorite). However, if you're really in an ultra-nerd mood and want to see how it's done, we recommend taking a look at &lt;a href="http://www.sitepoint.com/article/toughen-forms-security-image"&gt;this article.&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;3. Make Your Form Un-searchable&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;If the page that contains your form shows up in search engine results, you're pretty much asking to be spammed. There are four things that you can do to get your forms out of search engine results:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:arial;"&gt;Add a &lt;a href="http://www.robotstxt.org/meta.html"&gt;&lt;span style="font-family:courier new;"&gt;&amp;lt;meta&amp;gt;&lt;/span&gt;&lt;/a&gt;  tag to the &lt;span style="font-family:courier new;"&gt;&amp;lt;head&amp;gt;&lt;/span&gt; of the page to keep search engines from indexing your form page.&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style=";font-family:arial;font-size:100%;"  &gt;Create a &lt;a href="http://www.robotstxt.org/robotstxt.html"&gt;robots.txt&lt;/a&gt; file and upload it to the root directory of your web server to keep search engines from indexing your form page.&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:arial;"&gt;Remove all &lt;span style="font-family:courier new;"&gt;&amp;lt;url&amp;gt;&lt;/span&gt; elements from your sitemap that contain references to your form page.&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-size:100%;"&gt;&lt;span style="font-family:arial;"&gt;Request that the specific URL for your form page be omitted from search results (See &lt;a href="http://siteexplorer.search.yahoo.com/"&gt;Yahoo! SiteExplorer&lt;/a&gt; and/or &lt;a href="http://www.google.com/webmastertools"&gt;Google Webmaster Tools&lt;/a&gt; for more information on this).&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-size:85%;"&gt;&lt;span style="font-family:arial;"&gt;&lt;span style="font-size:100%;"&gt;Of course, many webmasters and business owners bristle at the idea of making their forms "invisible" to the eyes of potential visitors, but in our opinion the benefits of doing this outweigh the risks of being spammed.&lt;br /&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:130%;"&gt;&lt;span style="font-weight: bold;"&gt;4. Make Your Form Load Dynamically&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;The idea of loading page content dynamically from a database or script when the page loads is certainly not a new one. However, when it comes to forms, most developers hard-code form elements into the page. A dynamically loaded page is nearly impossible to cache, making it nearly impossible for attackers to find (the attacker's user-agent would have to load the page in order to discover the form).&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;It is difficult to guarantee the safety of online forms against malicious attacks. As much as we use new technologies and coding practices in our work, those who seek to do us harm are learning those same technologies in an attempt to find ways to exploit them. So, while these 4 tips will help you a great deal to keep Spam attacks from occurring on your website, you should always be looking for new and different ways to secure your form from attacks.&lt;br /&gt;&lt;br /&gt;-DWD Staff&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931429962005689173-8027080978606895314?l=blog.driscollwebdev.com%2Fdwdblog.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/8027080978606895314/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.driscollwebdev.com/2007/11/4-ways-to-keep-your-forms-safe.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/8027080978606895314'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/8027080978606895314'/><link rel='alternate' type='text/html' href='http://blog.driscollwebdev.com/2007/11/4-ways-to-keep-your-forms-safe.html' title='4 Ways to Keep Your Forms Safe'/><author><name>Driscoll Web Development</name><uri>http://www.blogger.com/profile/06367536569287150653</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09666294476741314919'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-8931429962005689173.post-2690062062921653434</id><published>2007-11-27T13:11:00.000-05:00</published><updated>2007-11-27T13:22:48.063-05:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='introduction'/><category scheme='http://www.blogger.com/atom/ns#' term='welcome'/><title type='text'>Welcome from Driscoll Web Development</title><content type='html'>Hello there!&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: justify;"&gt;Welcome to the official blog of &lt;a href="http://www.driscollwebdev.com/"&gt;Driscoll Web Development.&lt;/a&gt; In the future you will find all sorts of helpful  information and tips about how to put the resources of the world wide web to the best use for your small business website.&lt;br /&gt;&lt;br /&gt;We plan to update this blog on a regular basis, and hope that you'll enjoy reading our articles, reviews, tutorials, and general musings as much as we love writing them.&lt;br /&gt;&lt;br /&gt;In the meantime, if you have any suggestions for topics please &lt;a href="mailto:weblog@driscollwebdev.com"&gt;email&lt;/a&gt; them to us! We're looking forward to hearing from you!&lt;br /&gt;&lt;br /&gt;-DWD Staff&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/8931429962005689173-2690062062921653434?l=blog.driscollwebdev.com%2Fdwdblog.html'/&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/2690062062921653434/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://blog.driscollwebdev.com/2007/11/welcome-from-driscoll-web-development.html#comment-form' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/2690062062921653434'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/8931429962005689173/posts/default/2690062062921653434'/><link rel='alternate' type='text/html' href='http://blog.driscollwebdev.com/2007/11/welcome-from-driscoll-web-development.html' title='Welcome from Driscoll Web Development'/><author><name>Driscoll Web Development</name><uri>http://www.blogger.com/profile/06367536569287150653</uri><email>noreply@blogger.com</email><gd:extendedProperty xmlns:gd='http://schemas.google.com/g/2005' name='OpenSocialUserId' value='09666294476741314919'/></author><thr:total xmlns:thr='http://purl.org/syndication/thread/1.0'>0</thr:total></entry></feed>