• Adventures in AI: From Boredom to Binary

    Free tools and programs you can use today to jump into AI.
  • Memory Management Demanded from the Very Top

    Is your favourite programming language a security risk? The White House thinks so.
  • GitHub Pages

    I'm tired of running my own server just to host a blog, and GitHub seems like the perfect place to store all these thoughts.
  • Winter 2021 Reading List

    Here is what I have been reading so far this winter:

  • Coast to Coast

    I didn’t want to end the year without posting at least once.

  • 12 Months of Agile

    I keep running into folks with cool job titles like Advanced Agile Scrum Master, or business leaders bragging about how their company is “doing Agile”. And I used to crack jokes about how we practice “Agency Agile” - where you don’t plan anything but just accept and work through orders in the form of tickets whenever your project manager comes up with them.

  • Decennial

    Hard to believe I’ve been running this blog for 10 years now. So much has changed, but the really important stuff (people) is the same year after year. I am constantly reminded that the focus should always be the opportunities we create through tech, not the tech itself.

  • Speed Up Page Load By Tricking the Browser

    Nettiquette is built into web browsers. When you go to download a page, its contents will load in at a max of 2 files at a time (by default). So if there are 12 CSS and JS files, you’ll only get 2 at a time until you load them all.

  • Fun With Amazon X-Ray

    While riding on the train the other day, I was watching The Man in the High Castle on Prime and thought I recognized the actor on screen. “Too bad they only show the main actors. It would be nice if we could get a listing of who is in each scene,” I thought to myself. Imagine my surprise when I found out the app does exactly that.

  • Don't Trust Your App to Node.js

    One of the most common questions I get is around my bullishness toward Node.js. People assume because I wrote two books about it, I should be an expert in all things Node (nope!) or at least a major cheerleader for it (hah!).

  • 5 Ways to Keep Your Web Server Secure

    Equifax recently revealed that they were hacked and exposed the personal information of over 143 million people. You may not be sitting on such identity-theft rich material, but keeping your server secure is absolutely a must for any business. Fortunately it really isn’t very hard to achieve and maintain a decent level of protection.

  • Reverse Proxy with IIS and Elastic Beanstalk

    Suppose your main website is a .NET/IIS stack running on AWS Elastic Beanstalk, and you decided to add a WordPress blog to the mix. Instead of having http://blog.yourdomain.com and http://www.yourdomain.com, you want to host the blog from a subdirectory at http://www.yourdomain.com/blog. There are a few ways you can go about this; this post will go through how to set up a reverse proxy to a dedicated blog server.

  • Automate Squarespace Development with Expect

    We have a love/hate relationship with Squarespace’s developer platform. I think they really need to decide whether they’re a design company or a web hosting platform and stop doing 50% of each. But anyway…

  • Speed up Deployments in Azure Web Apps

    Is it possible to speed up deployments in Azure Web Apps? Without resorting to temporary fixes?

  • Serverless Contact Forms with AWS Lambda

    Servers are a pain to run. They break, get hacked, need updating, and generally need your constant attention or that site you posted two years ago won’t work when you need to make a change. Static sites are a beautiful dream, but what do you do when you need user input? You don’t want to use a third-party service just to get rare contact forms from your visitors. It’s stupid to run a web server to handle this; that completely eliminates the whole purpose of creating a static site. What you need are serverless contact forms.

  • HTTPS on Static Sites using Cloudfront

    It seems like every time I log into my AWS account there are a ton of new services waiting to be discovered. (Not to mention dozens in early preview that don’t even show up in the main list.) I feel like keeping up with what’s going on in that space is becoming a full-time job all by itself. The most exciting new update is the Certificate Manager - pushing us one step closer to “https everywhere”.

  • Malware in the iTunes Store - 500M Users Affected

    People rely on their app stores to provide safe and high quality software for their phones and tablets. With iTunes in particular, we trust Apple’s strict review standards will raise the bar for quality and protect us from the shady apps and trojans we might find on file sharing services and third party app stores. What happens when that trust is misplaced?

  • Always Get AppleCare

    I never buy warranties for my purchases - if someone is expensive enough it should go on your home insurance policy. If it’s cheap enough, just replace it - we live in a society of garbage anyway. Getting serviced when things break is more often than not a huge waste of time. AppleCare is different.

  • Standing Desk Experiment

    Over the past year I experimented with working at a standing desk. My setup was a converted “regular” sitting desk with the computer monitor lifted on a set of rubbermaid bins. It wasn’t the most beautiful rig but the ergonomics were right and the screens were at an appropriate level for my height. Unfortunately I didn’t take any pictures of the contraption.

  • That's Not My Job

    Most companies seem to have a group of people who gravitate to either front-end or back-end development. I’ve been struggling to wrap my head around this because it doesn’t seem like a useful dichotomy.

  • Native Languages are Best for Mobile Development

    Like it or not your clients want mobile and if you are a developer without experience in this realm you are behind the curve.

  • Case-insensitive string comparison in PHP

    This is a common situation: I needed to compare two strings with unknown capitalization - “country” versus “Country”. Since these words should be considered equal even though the second “Country” has a capital “C”, we can’t do a straight comparison on the two - we need to do a case-insensitive comparison.

  • Tweeting with Buffer

    I continue to have an on and off relationship with Twitter. It’s been fun to talk with other developers and reach people directly, but a huge part of the network is sorting through the signal-to-noise echo chamber. It doesn’t make sense to sit on Twitter all day trying to respond to everything; work needs to be done too!

  • 2012 in Review

    This has been one of my busiest and most productive years, but you wouldn’t know it from the infrequency of my blog updates.

  • Observations From Mobile Development

    With just a single mobile release under my belt now, I’m hardly what you might call an expert on the subject. What I can say for certain is the past year has been an eye opener in terms of understanding the capabilities and limitations of mobile platforms in general.

  • Using DateTime in the Play! Framework

    Which data type should you use for time information on your Java models? The Date class is mostly deprecated, pushing us into the direction of the heavyweight Calendar class. Storing the milliseconds since Epoch in a Long is both database-friendly and easy to perform math on and convert at runtime. But if you really want a good experience, you are using Joda Time.

  • Re-Learning How to Write

    In just two weeks, Node: Up and Running will be released by O’Reilly Media. Writing a book has been a lot of hard work but also a terrific learning experience that I would love to repeat.

  • log4php Performance

    We can take for granted that whenever we introduce a library or framework to our application, we incur an overhead cost. The cost varies depending on what we’re trying to do, but we generally accept that the lost performance is worth it for the increased maintainability, functionality or ease of use.

  • Setting up Wordpress with nginx and FastCGI

    All web site owners should feel a burning need to speed. Studies have shown that viewers waiting more than 2 or 3 seconds for content to load online are likely to leave without allowing the page to fully load. This is particularly bad if you’re trying to run a web site that relies on visitors to generate some kind of income - content is king but speed keeps the king’s coffers flowing.

  • HP Releases Enyo 2.0

    Now that WebOS is being made open source, HP has released a new version of the Enyo JavaScript framework. Whereas the first version of the framework only supported Webkit-based environments (like the HP Touchpad, or Safari or Chrome), the newer version has expanded support for Firefox and IE9 as well. Developers who created apps with the old framework will have to wait a little while longer before all of the widgets and controls from Enyo 1.0 are ported over.

  • 4 Year Blogiversary

    It’s hard to believe but this site is four years old. Wow! Time has flown, and I’ve learned a lot - hopefully these years have been helpful for you too!

  • Humans.txt - the Anti-Robots.txt

    If you don’t want a search engine to read some or all of the files on your site, you can create a robots.txt file. (Looking through the blog archive, I realize I’ve never gone through the construction and contents of that important file, so this is a promise to one day return and fix that!)

  • 2011 In Review

    This year started off with a foray into Rails, an experience I won’t be rushing to complete. Most of my time was spent building a small application during the Christmas break in 2010, but in 2011 I moved that site into production and wrote a little bit about separating production and development values (a feat I repeated for the Play! framework, which I actually like, later in the year). I think the only thing I really like from Rails, and this is a bit of a stretch, is the database migrations.

  • Using FastCGI with Nginx for Performance on a VM

    This weekend I decided to play around with the configuration on my Rackspace Cloud Server. Since our various websites have been doing well lately, the relatively low-powered machine I am running on is starting to fill up its available RAM. So far so good but as everyone quickly learns - running out of memory and hitting the swap space is a performance killer. Since I want my sites to continue to do well, I decided to take action before they hit the RAM limit and start swapping to disk.

  • Node.js 0.6 Released

    The Node.js team has released version 0.6. Although much of the core was re-written, the most noteworthy change has to be the support for native Windows installation. Whereas previously it was possible to run node.js on Windows using Cygwin, the native compilation means its performance will be comparable to Linux equivalents.

  • Multiple Development Environments

    Hopefully when you do web work, you’re not developing code on the same server your users are accessing. Most organizations have at least some kind of separation for their development and production code, but it’s possible to go far further. Separating environments allows you to achieve multiple threads of continuous integration for all kinds of cool.

  • Adobe Aquires Typekit

    Today Adobe announced its acquisition of Typekit, a web font hosting service that allows designers to use any typeface with their sites rather than relying on standard “safe” font families.

  • How to Get Recommendations on LinkedIn

    Used properly, LinkedIn is an incredible tool for finding new opportunities and connecting with potential employers. As your network grows over time and people move on to bigger and better things, the connections you make in the early days can easily be worth hundreds of thousands of dollars in terms of salary and other business opportunities.

  • How to Upgrade Firefox using Ubuntu

    So I got tired of using Firefox 3.6 in my Ubuntu machine and decided to upgrade to the newest version (5.0). It’s understandable that the package maintainers responsible for Ubuntu don’t put bleeding-edge cutting-edge releases in the distribution due to the possibility of introducing unstable elements into the user experience. But Firefox 4 has been out for over a year, and the migration to 5 is well underway.

  • MySQL Pulled From Mac OS X Lion

    Apple-based LAMP developers be warned: the new version of OS X does not include MySQL, which was formerly part of the developer tools shipped with the operating system. In its place look for deliciously Oracle-free PostgreSQL. Of course, developers can and will continue to download MySQL and install it themselves, but the out-of-box experience moving forward will be with PostgreSQL.

  • Windows Azure Thoughts - First Six Months

    Having played with Windows Azure for about six months or so, I think I have a good handle on its pros and cons for the tasks I’ve been trying to do. I definitely have a lot of positive conclusions about the platform as a whole, and a few pain points I can see Microsoft working hard to eliminate.

  • Accessing Configuration Parameters using Play Framework's Template Engine

    Suppose we are building a Facebook application and have a variable called fb.appId containing our Application’s ID. We want to use that to initialize an FBJS call, but obviously don’t want to hard-code it into our page’s template.

  • Finding Your Ubuntu Version

    Apart from the login screen, if you are using a Ubuntu computer and want to know the version number:

  • Pint-Sized Mobile Devices

    Lately I’m fascinated by the Dell Streak and am thinking it would be fun to get one. But really, what is the use case? Do tablets have a place in everyday life?

  • It's not a four letter word

    Sometimes it seems we have an un-natural fear of the word “no”. This might be rooted in childhood memory: when I tell my son “no”, I am preventing him from doing something that he wants to do. As a responsible adult, I know the limits I place upon him are for his own protection. As a toddler, he sees “no” as a limiter, something that ends a course of inquiry.

  • Protect Your SSH Server with RSA Keys

    If it’s possible to log into your web server over SSH with a username and password, you may not be properly secured. Even if root access is impossible, a username and password combination can be broken with brute force; once your server has been compromised it’s only a matter of time before a rootkit installation attempt is successful.

  • Ensure SLA with Multiple Web Role Instances on Windows Azure

    As I dig deeper into the Windows Azure platform, I am becoming more and more impressed by the potential it offers. Microsoft has put a lot of money and resources into developing their infrastructure and have done an incredible job at creating an interesting and powerful architecture. If anything, their major fault is in advertising - with so many different technologies with ever-changing names, it’s hard for a newcomer to wrap their mind around the services. It is pricier than some options so it’s hard to really experiment in much depth, although they do offer a free option for developers to dig in and try the services.

  • Azure Table Storage vs Azure SQL

    There is a lot of debate among newcomers to Azure whether to use Azure SQL or file-based Table Storage for data persistence. Azure itself does not make the differences very clear, so let’s take a closer look at each option and try to understand the implications of each.

  • Surviving Cloud Failures

    Amazon is in the news today for the failure their Elastic Block Storage (EBS) service suffered, resulting in loss of service and/or extreme latency for hundreds of sites including some of their largest customers like Foursquare and reddit. AWS has been widely regarded as the most stable and overall leader of the cloud providers, so it was a great shock to many observers that they were able to suffer such a large failure.

  • Rely on Continuous Integration

    If your testing process involves copying files over to a development environment and hoping you have the most up-to-date version of everything, stop now. There is a better way, and it is continuous integration.

  • Accelerate Your Site with a Content Delivery Network

    The best way to keep visitors engaged in your website is by delivering your experience in as little time as possible. The average visitor will only stick around for a few seconds, so it is important to get them interacting with your content fast. The first thing to check for, of course, is any bottlenecks in the initial page generation. Once the web page is being generated quickly, we can turn our attention to the next biggest culprit: the connection to your client.

  • Database Migrations

    Maintaining database schemas across development environments (especially in teams) and in production can be a real nightmare. Fortunately there are a number of solutions which make database management easier.

  • Tracking Down Website Speed Problems

    There are a few common culprits behind website speed issues. When diagnosing problems, the best bet is to start at the worst performers and move up.
  • Using Memcache with MySQL

    MySQL+Memcache have been bedfellows for awhile and at this point are the de facto standard for highly-available, scalable websites. Even with other SQL and NoSQL solutions starting to become popular, this pair holds on as the winner for LAMP programmers. Is the complexity of working with this technology pair worth the investment?

  • How to Win at Work

    It isn’t really hard to do well in a job; you just have to apply yourself and put the work first. Just like during the interview, your boss or employer’s motivation is not to give you a hard time or to make your life difficult; all they really want is to get the work done and make money.

  • Small Site, Big Footprint

    I like redundancy, to a fault. Part of it goes to my need for comprehensive backup - as long as you have a backup prepared, you are less likely to lose anything. So it stands to reason that if you have two identical copies of your web site running, you are more tolerant to all kinds of failures - from your web server going down to an unexpected surge in traffic.

  • Backup Through Time

    No matter what I do, I never feel fully covered against a disastrous data loss. Despite paranoid backup strategies across many different kinds of media, there is always something missing. I haven’t h ad a hard drive failure yet, but I know it’s a matter of when, not if, it will happen.

  • How to Blog for a Living

    The title is misleading. Although I know a small number of people are making enough money from their blogs to generate a living income, the truth is the majority of people who try to blog for profit will fail to produce substantial revenue. That doesn’t mean the blog won’t be a critical part of their money-making strategy, it just means that a bigger strategy is needed; one in which blogging is just part of the equation.

  • The Interview Process

    Can you be accurately summed up after a short conversation with a complete stranger? Do you think it’s fair that your entire career and work essence is judged within seconds?

  • Performance Tuning Apache

    One of my favourite aspects of the cloud is the ease with which we can create new VMs to test our wacky architecture theories. It’s so easy (and cheap!) to spin up a small server cluster for some serious load testing, and then destroy it again when done.

  • How Play Framework Saves the World

    Play framework must be the best-kept secret in the Java world. If you haven’t had a chance to see their totally awesome demonstration video where they build a full app before your eyes in a matter of minutes, go - go now. Then come back.

  • Memcache as MySQL's Hero

    It’s hard not to love memcache. As soon as you manage a web site that has more than a few concurrent visitors, the performance benefit of caching becomes immediately obvious. MySQL is a fast database and can outperform a lot of its competitors, but no matter how quickly it can pull results it can never outperform the retrieval speed of the server’s RAM.

  • Memcached as Session Handler

    By default PHP loads and saves sessions to disk. Disk storage has a few problems:

  • Command and Control Social Media

    From a branding perspective, social media is about joining the conversation rather than trying to constantly send out broadcasts. Any idea worth discussing is already being talked about - if you ignore social media you aren’t just failing to get your message out into the wild; you are, in fact, allowing your voice to be absent from the existing discussion. There is a seismic shift occurring in the way brands and their respective owners are thinking about engaging their target audience. It isn’t good enough to just get the message out anymore - more attention is being placed into measuring the effectiveness of that message.

  • Overwork and the Creative Work Ethic

    The massive amount of time required to improve at your craft is one aspect of creative work that is hard for outsiders to understand. When you stake your career and reputation on everything you do, it’s not a job that you work at from 9 to 5, “put in” your hours, then shut off and go home. Your entire existence is invested in succeeding and improving, not just for the paycheque (although, let’s be honest, a great salary is a definite motivator).

  • Cloud Computing Is Not Magical

    Back in 2009 I was tired of hearing the phrases “cloud computing” and “in the cloud”. These days I’m so numb to their meaninglessness that it doesn’t even phase me anymore. Somewhere along the way marketers took over the internet and ‘social media’ became a job position.

  • Drizzle - MySQL for the Cloud

    Drizzle - a lightweight fork of MySQL - has reached general availability. Drizzle’s design goals are to create a highly performant and module database engine tailored for cloud computing.

  • Defaulting Null Variables

    One of the things I miss most about C# is the expressive ways in which it handles variable defaults. The ‘double ?’ - ?? - operator is especially useful for checking whether a value is NULL and providing a default object:

  • Displaying Production-Only Markup in Rails

    If you are running something like Google Analytics on your website, you probably don’t want its associated JavaScript code to appear in your web browser while you’re developing (it would skew your statistics). In Rails, it is incredibly simple to block off a segment of markup for specific environments by using the Rails.env variable.

  • How to Use Rails Generators with MongoDB

    The MongoDB classes do not come with default generators for Rails applications. In order to use the rails generate commands, you can use the indirect rails3-generators project available at https://github.com/indirect/rails3-generators/#readme

  • Getting Site Info using BuiltWith

    There are better tools that give more information than this one, but I wanted to point out the reports generated by BuiltWith.

  • Use a PHP Accelerator to Speed Up Your Website

    I like PHP because it makes it really easy to quickly build a website and add functionality, and is generally lightning fast when executed without needing to wait for compilation as with ASP.NET or Java (Yes, we always pre-compile those languages prior to putting our applications into production, but with PHP we don’t even have to do that).

  • Cheap File Replication: Synchronizing Web Assets with fsniper

    Awhile ago I wrote about how I was using nginx to serve static files rather than letting the more memory-intensive Apache handle the load for files that don’t need its processing capabilities. The basic premise is that nginx is the web-facing daemon and handles static files directly from the file system, while shipping any other request off to Apache on another port.

  • Part-Time Programming Work

    Here’s a thought: is it possible for a computer programmer to work part-time? It’s a serious question because programming is not like other trades - once you build a house, for example, it’s built; there is no going back and re-pouring the foundation and moving to make it a better, more efficient house. When a programmer is given a problem to solve, they can continue to improve, optimize and re-factor their solution nearly indefinitely.

  • Give Apache a Break with nginx

    One of the things I’ve learned about Apache is that as good as it is, it suffers from its monolithic “do-everything” nature. The modules and tuning required for effective operation just doesn’t fit into a lean, quick package. That said, I find it beats out the alternatives hands-down when it comes to running web applications of any complexity.

  • Life in Linux

    So I wiped my hard drive and installed Ubuntu. After struggling with the decision to switch from Windows for some time, I finally resolved to move.

  • Installing Git on Ubuntu 10.04

    Here’s how to install Git on Ubuntu 10.04

  • Thinking About Switching to Ubuntu

    In the last number of weeks I have been seriously considering taking the plunge and wiping my Windows laptop clean in order to switch to Ubuntu as my primary machine. Although Windows 7 has gone a long way toward smoothing over the problems Vista brought, it isn’t perfect.

  • Resumes Are Better Without Alphabet Soup

    You can spot them a mile away - resumes that look like someone loaded up a Microsoft Word template, punched in their information, then sent it to every job posting they could find.

  • Tethering the Internet, Week One

    So I’ve been tethering my phone and using it as a backup Internet connection for just over a week now and so far I have been pretty happy with the results.

  • Using a Cell Phone as Backup Internet

    Since we live in the country and rely on line-of-sight Internet for our connectivity, I’ve been increasingly frustrated with service quality and uptime programs. There are a lot of reasons I want to move to a denser population area but access to a proper Internet connection is high on my list.

  • Display Class Objects in CheckedListBox

    If you want to use anything more complex than a list of strings in a ListBox, you’re in luck because the control accepts all types of objects.

  • CSS Sanity: Remember Best Practices When Using New Tools

    Now that the rebellion against IE6 has hit mainstream, a brave new world of CSS3 and HTML5 has been opened to web professionals.

  • iTunes - The Future, or Just a Toy?

    Following iTunes’ development has been an interesting experience. We’re moving toward a world in which physical packages of music is a thing of a past; in the meantime we’re stuck with a middling service.

  • Wamp Server Crashes Installing X-Cart

    When running a default installation, WAMP Server’s Apache crashes when installing X-Cart. The error happens immediately after setting up the MySQL tables and is caused by the curl extension in PHP.

  • A Simple Makefile for the Go Language

    Hey folks, it’s been awhile!

  • 279 Days to Overnight Success

    Chris Guillebeau offers his e-book 279 Days to Overnight Success for free on his blog. This is a great piece of writing that debunks the popular myths about “making it” blogging.

  • Google Launches Its Own Programming Language

    Google has taken another step toward world domination with the launch of an experimental new programming languages aptly named “Go”. Go promises to pick up where C and Python left off, providing programmers with a new garbage-collecting low level languages suited to efficient server programming.

  • Microsoft to Xbox Owners: Don't Mod Your Consoles

    The BBC just discovered that Microsoft has been banning the Xbox Live accounts for users it discovers attempting to play using modified Xbox consoles. According to Microsoft, modified consoles are an enormous problem because they are often used to play pirated games, costing the video game industry more than $1B annually. Mod enthusiasts counter that they have every right to make alterations to hardware they have purchased legitimately.

  • When You Focus on Getting Better

    It seems like correcting Seth Godin is a favourite pastime enjoyed by folks online. Sorry to break from the group, but I happen to think he is a deep well of relevant information.

  • VISTA: How to fix SQL Server Express Error - CREATE DATABASE permission denied in database 'master'

    If you’re using SQL Server Management Studio Express under Windows Vista and see either of these errors:

  • The Traditional "Waterfall" Software Development Lifecycle

    You can still see ghosts of the traditional “waterfall” method of software development in modern agile practices. The traditional model involved long periods of planning followed by development and extended maintenance periods – ideal for long-lived systems (I’m shuddering and thinking of COBOL apps running on mainframes).

  • Valleywag

    I have to admit, reading Valleywag was a bit of a guilty pleasure. The online publication, which was part of Gawker Media, is akin to the tech world’s Perez Hilton. Gossip about silicon’s celebrities is dished up daily and served to geeks’ RSS feeds everywhere.

  • LimitlessUnits.com

    LimitlessUnits.com is an interesting little blog that shares many of my own morals. I wish Tony updated more but the posts he puts up are always thoughtful and fleshed out. Design-wise the site is simple in an elegant and usable way. If programming and video games are up your alley, go on over and subscribe.

  • Friendly Fridays

    I’ve decided to start using Fridays to reflect on the state of my RSS reader. Starting on Friday of next week I plan to showcase blogs that I think are well written, technically marvelous, or just plain cool.

  • Minesweeper: The Movie

  • What is PictureFreakz?

    Did you get an MSN message that looks like this?

  • C#: using Statement

    One of my absolute favourite statements in C# is the using statement (not to be confused with the using directive, which is what we use to import libraries like System.Web into our projects).

  • Prevent Link Rot From Suffocating Your Blog or Web Site

    Link rot occurs when a page linked to from within your web site becomes invalid. Visitors to your site who click on that link will receive a 404 “Not Found” message rather than the quality content they were expecting to find. This matters to you as a web site operator because:

  • If Only Ignoring Pirates Made Them Go Away

    I’m sure they’re not unique in their philosophy, but StarDock games is a terrific example of a company which has taken the high road in the battle against software piracy. In principal, the company believes that if someone would steal/pirate their software, that person would not have likely bought it anyway if piracy wasn’t an option. To that end, the company stands against putting DRM measures - which they feel only serve to detract from the experience of legitimate customers - into its products.

  • How Useful is Windows Without a Web Browser?

    The EU wants to stop Microsoft from bundling Internet Explorer with its operating system. In today’s day and age, how does this make sense? The charge is led by Opera, who claims that having Internet Explorer ship with Windows unfairly limits competitors from getting through to customers.

  • Everything Sounds Better With Spin

    You have to shake your head every time someone goes off about “netbooks”, those wonderful, tiny, cute computers that don’t cost very much. When you look at them, what do you really see? How about a crappy laptop that can barely run Windows. The thing is cheap in more ways than one - but somehow marketers have been able to spin that as a good thing and make big profits off useless hardware without needing to develop anything new.

  • Twitter Won't Overtake Facebook

    I started writing this entry before Facebook switched to its new look. At the time there were a lot of people praising Twitter and predicting that it would soon replace Facebook as the network of choice for connecting the Internet’s middle class together; that coveted position on the totem pole between the MySpace Ghetto and LinkedIn (the professional’s pick).

  • How to Move a Wordpress Database

    One of the most common requirements for web developers is the ability to switch code from development servers to live production environments. This can be tricky if you’re working with Wordpress; moving the files is dead simple, but since Wordpress uses canonical URLs you have to be careful if you are trying to transfer any of your database content.

  • Facebook Breaks, But Photos Not Lost

    Over the weekend Facebook suffered a multiple hardware failure that caused its photo service to fail. Up to 15% of the site’s multiple-_billion_ photos displayed as nothing more than a question mark on Sunday night.

  • Flex 3: Downloading URL after Clicking on Button

    Suppose you have a button in your Flex program. When the user clicks on your button, they are prompted to choose where they would like to download a file. But… the file never comes:

  • The Fragile World Internet

    In December 2008, a “fault” in three of the undersea cables under the Mediterranean Sea denied Internet service to thousands of subscribers in Egypt, India and the Middle East.

  • Implementing Lazy Load Using a Proxy Class

    Lazy load is a design pattern wherein an object is not instantiated until the last possible minute. This is very handy when working with lists of items whose contents are expensive to retrieve from the data store.

  • Facebook, Privacy and Drunken Photos

    As a user of Facebook (not to mention a longtime net citizen) I am well aware of the slimy feeling one gets when their image is bared for all to see. The owned application comes to mind first - strangers ‘bidding’ for your uploaded photos on Facebook, with the owner of the ‘purchased’ photograph receiving an obnoxious “you’ve been bought by X” email. I haven’t posted any compromising photos of myself (that would be silly) but the thought of my image being a component of someone’s “collection” is creepy to me.

  • Technorati Improves Blog Crawling Engine

    Anyone who has done their homework in regards to blogging knows that Technorati is a major player in that space. At one point, one could not have considered their blog truly launched until they were present in the service’s database - being part of that directory meant you had made it. Now there are so many sites vying for attention that simply adding oneself isn’t enough, but it is still an important step in an overall marketing plan.

  • atoi in Flex/ActionScript - Converting Strings to Numbers

    It couldn’t be easier to convert a string to a number in Flex Actionscript. The language doesn’t have (or need) an atoi() function as seen in languages like C - it’s as simple as creating a cast:

  • Six Flavours of Windows 7

    I’m starting to get enthused about Windows 7. Not so excited that I would stand in a line overnight to be the first to own a copy, mind, but I may actually be putting a PC back in the running for my next computer. One thing I am not so thrilled about is the six different versions to choose between.

  • GoDaddy Hit by DoS Attack

    Until recently, Always Get Better was hosted by GoDaddy. We moved in November so I could have better control of the various web sites I am running. I can say that I was not unhappy with the service offered by GoDaddy - I just outgrew it.

  • Get Your Boss to Do What You Want

    Communication Overtones asks “What do you do when you are sure you are right about something but your boss won’t listen to you?” Any manager worth his salt knows to surround himself with talent that will compliment his own skills - he will draw from the experts around him to formulate his plans and direction.

  • W3C MobileOK Checker

    The mobile web is finally starting to be taken seriously. Trying to access the Internet on a 2” screen is torturous at best; only rare gems like GMail actually bother to display content optimized for hand-held devices. Forget trying to access JavaScript - or worse, Flash - menus. Any image wider than 100 pixels causes the text-wrapping to fail forcing the user to scroll vertical and horizontally.

  • RIAA Changes Tactics

    The RIAA has had an interesting few years. Their business model is dying and they have been fighting to save it by suing evil music thieves like single mothers on disability pay, deceased grandmothers and, most heinous of all, families who do not own computers.

  • Python file upload

    I recently needed to handle file uploads from a Flash form post using CGI and Python. I made two discoveries:

  • Create Directory in Python

    I needed to learn how to create directories using Python and found this great resource (digression: check out this author’s page headers - way cool!)

  • Looking Out My Back Door 2008

    Good-bye 2008, you have been good to me. Over the course of the past 12 months I have learned a great deal about who I am and what I can accomplish, leaving me in fine form to hit the ground running in 2009.

  • People Cost More Than Equipment

    Much of the professional world has switched over to a two-monitor setup. I can’t even begin to imagine how I ever did with just one since I am now so used to having a help or a search open just outside of my main viewing area. Having reference material in my peripheral vision but accessible just by turning my head is much faster and less disruptive than having the fumble around the task bar and switch the focus of my attention.

  • Lenovo Thinkpad Laptop Boasts Second Screen

    Switching to a dual monitor setup has been the major paradigm shift in my productivity. The size of the second screen doesn’t matter a great deal to me because it only typically holds reference manuals and programming API documentation.

  • Love My Chrome

    Having worked with Online Applications for a number of years, I am rarely happy to be introduced to a new web browser. A new web browser means another test case - every line of code has to be verified against all of the major browsers before going into production. Another browser means new faults to watch for and program around, which translates to longer time to market. When I first heard about Google Chrome I thought to myself “great. Here we go again.”

  • Gmail for Company Mail

    Even though it is a search engine, Google has done a fantastic job delivering a bewildering array of services over the past several years. Between its Android platform, Office Suite, Mail Services, Blog Hosting and Video acquisition, there is no field untouched by Google’s reach. Today I want to talk a little about my experience using Gmail for corporate email.

  • Post-Dating Blog Entries in Wordpress (or, the Absent-Minded Blogger)

    Wordpress is a great tool; I am looking forward to version 2.7 although I find myself hard-pressed to try to imagine how the WP team is going to improve upon the existing platform. One of my favourite functions of the Wordpress software is the ability to post-date entries. Often I will get a burst of inspiration and write four or five articles.  Rather than releasing them all at once I will set them to automatically publish into the future so there is a steady stream of content always appearing on my home page.

  • GoToMyPC vs Remote Desktop (RDP)

    For some time now, I have been using both Remote Desktop (RDP) and GoToMyPC to connect to the various Windows machines I am responsible for. I present here a summary of the differences I have found between the two applications:

  • Ontario Government Builds Rural Internet Infrastructure

    The Ontario government has a program designed to provide funding for the purposes of building broadband internet infrastructure in rural communities. The Rural Connections Broadband Program has earmarked millions of dollars to build new infrastructure, which will bring high-speed Internet to communities where low population densities preclude the construction of more traditional networks (such as cable).

  • Work from Home as a Blogger

    Several months ago I wrote about the pros and cons of working from home.  At the time I focused on the employee working from their home for an employer.  Working from home for yourself is a totally different ball game; right now many people are experimenting with the idea of working from home by writing posts for online publishers, especially blogs.

  • Apple is Having Babies

    We rented Baby Mama this weekend. I was happily surprised to find PC Guy in the role of the fertility doctor - perhaps a nod to Mac Guy’s film appearances. It warms my heart to see those references transitioning into the cultural lexicon. All this got me thinking about Apple’s “Get a Mac” campaign; there have been some funny ads circulating around the net lately, including some Flash videos seemingly spreading between ad spots (how do they do that?).

  • The Net is Recession-Proof; Hire a Blogger

    An interesting article at the Silicon Alley Insider today - recession winners are designers and SEO experts.  Advertising is tricky for businesses because dollars spent can’t always be tracked to dollars earned.  When it comes to designing a web site I like to go with the analogy of a salesperson.  A web site is like an employee who works 24/7, can serve unlimited numbers of customers, and remembers everything they are told about every product.  Every dollar spent on a corporate web site is returned to the company passively over time - and as the site ages and grows in traffic, its value continues to increase.

  • Improving Wordpress Page Titles

    Anyone half-serious about running a large blog knows that search engine ranking is critical to getting properly indexed. Over 90% of the traffic to Always Get Better originates from search engine traffic - therefore the ease of which Google (among others) is able to index this site is the life-blood of its continued success.

  • Losing Weight with Wii Fit

    Let’s start with the conclusion - I lost weight with Wii Fit.  We bought the system in September and my progress has gone like this:

  • Removed Login Link from Drupal Site

    In Drupal it is possible to remove the login option from the site template by using the Blocks tool in the administration.  If you do this, you won’t be able to log in from the regular page template.

  • Slogan Not Appearing on Drupal Site

    A common issue faced by theme developers is that of the site slogan not appearing even when the variable $site_slogan is present.

  • Drupal Stuck at Database Configuration

    When configuring Drupal 6.6 on a Windows XP/Apache/MySQL box, I ran into an issue whereby I would enter the database information on the Database Configuration screen, press the advance button, but be constantly redirected back to the Database Configuration screen.

  • And We're Back!

    I recently transferred AlwaysGetBetter.com from GoDaddy to MediaTemple. Although their administrative interface was somewhat, I found GoDaddy’s hosting service decent enough to meet my needs so the move has nothing to do with dissatisfaction in their service.

  • Can't Change Country of Adobe Account

    Aside the from the bloated abomination that is Acrobat Reader, I can confess that I am a proponent of software from Adobe.  As a long time user of Photoshop and Illustrator, I have always found their products to be powerful and usable.

  • Accessing the stage in Flex

    When creating components in Flex, designers sometimes need to attach events to the main stage. Unless the application has reached creationComplete, the **stage **property of custom components will be null.

  • ASP.NET "Service Unavailable"

    If you have threaded processes called by your ASP.NET code, and those processes crash, your site may start giving Service Unavailable errors.

  • CommandEventHandler Event Won't Fire for Button in ASP.NET Custom Control

    Problem: I created a custom control with a dynamic button and attached an event handler to that button.  When I run the control, clicking the button causes a postback but the event is not fired.

  • FlexBuilder: Flash for Programmers

    Since I’m not a designer (an obvious conclusion anyone will reach after taking one look at the design of this site), I’ve never had much use for the Flash development environment, nor any real desire to learn it.

  • The 8 Month Mark

    Since this blog has been running for the past 8 months, I thought I might take a step back and consider the journey so far.  How did my original expectations stack up against reality?

  • JavaScript & Ajax Visual Quickstart Guide

    One day last year my client decided we needed to incorporate AJAX into their web site. AJAX was considered the big thing, and by not having “it” we were going to fall behind some of our competitors.

  • Internet Explorer URL Character Limit is 2,083

    Today I learned that Internet Explorer limits the site of GET requests to 2,083 characters.  Any URL longer than this cannot be used by the web browser.

  • ASP.NET: A potentially dangerous Request.Form value was detected from the client

    This error is caused by the presence of HTML in the fields returned by a form post.  In many cases, for example page management tools, you may want to allow your users to enter text formatted with HTML.  By default, ASP.NET doesn’t like this.

  • What I Learned from MUDs

    The first bit of code I ever worked on was ROM 2.4, a text-based MUD server written in C.  At the time I didn’t know the first thing about programming, but through trial and error I was able to feel my way around the source code and slowly learn how the language worked and how to make the program do what I wanted.  Some experienced programmers called me the “snippet king” because I used a lot of pre-written additions to expand m game, but I see it as part of the learning process.  If I were to work on a MUD again, I now have the knowledge to do all of the programming myself - but if it weren’t for my baby steps back then I may never have become a programmer at all.

  • Cuil not so Cool

    Jumped on the bandwagon and tried out Cuil today.  The verdict - more development time needed.

  • Reboot Windows Server 2003 Using Remote Desktop (RDP)

    Since Microsoft updated their Windows Server 2003 software, administrators relying on their Remote Desktop Connection are having difficulties rebooting.

  • Getting Real Power in Vista

    Windows Vista hides the administrator user. In order to access it, open a command prompt and issue the command:

  • Optimize SQL Queries by Using Aliases

    When joining tables in SQL, we often use aliases to shorten table names. Consider this query joining order lines (details) with orders inside the database:

  • Replacing / Adding Line Breaks in GridView Text

    The GridView is a powerful control for quickly and easily displaying tables of data. However, a raw dump of information is not always good - when displayed by a web browser, normal line breaks are simply rendered as spaces.

  • Take Yourself Less Seriously, Manage Scope Creep

    Given the oportunity, your boss and your client would add so many requirements to your project that your only hope to meet your deadline was to forsake your personal life and donate your evenings and weekends to your job.

  • Blow Out the Candles for Spam's Birthday

    Kudos to this article for acknowledging MUDs as the source of the term “SPAM”: A very unhappy birthday to spam, age 30

  • "Connection to Server Reset" when Installing Drupal

    Has anyone else had this issue?

  • C#: Using Suffixes to Declare Data Literals

    This isn’t new, but handy to have.  In order to tell the compiler which data type we’re using, we use suffix notation as follows:

  • Form Trumps Function

    One (sad?) truth I have learned through the past several years is this: Form Trumps Function, every time. You can write the most elegant code in the world, produce an application that meets requirements 100%, but if it isn’t pretty to look at, your time has been wasted.

  • C#: Finding the Number of Days Between Two DateTime Items

    One very common requirement is for the number of days elapsed since a particular Date and Time. In C# this can be accomplished through the use of the TimeSpan class.

  • Handling Relative Paths Programmatically In ASP.NET

    One of the nicest features in ASP.NET is its out-of-box support for relative paths in hyper links and other controls. This is very important for developers whose code resides within the root of their testing environment but within a sub-directory of the production server.

  • Technorati PostClaim

    Technorati Profile

  • Apache: Enabling mod_rewrite on Windows 2003 Server

    Recently I had to set up a Wordpress blog on a Windows 2003 server, which involved installing Apache, PHP and MySQL.  Everything went pretty well - except for the typical PHP.ini problems I shall write about later.

  • Editing the HOSTS file in Windows Vista

    Windows Vista keeps the HOSTS file locked down so only users with elevated permission can edit it.  I found the fastest way to add lines to this file in my own system was:

  • 404 Errors when Accessing ASPX Pages on Windows 2003

    By default, windows 2003 Server is locked down and won’t display ASP.NET pages.

  • SELECT TOP N in Oracle

    Being used to SQL Server, I get messed up when moving to Oracle. For reference, here are equivalent top N queries in both environments:

  • How to SUM Bit Fields in SQL

    By default, SQL Server doesn’t allow an operation like this:

  • C#: Instantiating a class of Unknown Type

    The project I am currently working on has several dozen different types of Form classes, each of which is accessible from a common menu strip. Rather than repeatedly instantiating each of the forms from the menu item handlers, I wanted to funnel the request to a single function.

  • C#: Form.Close() vs Form.Dispose()

    When working with a Windows GUI, it may seem unclear whether to use Form.Close() or Form.Dispose() to get rid of a dialog at runtime.

  • How To Send Ctrl+Alt+Delete Using Terminal Services

    In order to change my password on a remote Windows 2003 server, I recently needed to send a Ctrl+Alt+Del sequence to the host. By default, doing this sends that sequence to your own machine.

  • Creating Install Programs with Tools You Didn't Know You Had

    I never knew about this little program until I found Alfred’s Tech Blog.  If you want to quickly make install files and are running Windows, just go to Start->Run… and type iexpress.

  • Google Finds Evil and Protects us from it

    As confident as we may be that we’re the only ones using our computers, the truth is we can’t ever be completely safe. For my own part, I was smug in the knowledge that because I ran an up-to-date antivirus program, didn’t hang around the web’s so-called “red light districts”, and didn’t download software I was unsure of, I had nothing to fear from those nasty virus things.

  • Programming Doesn’t Mix With Family

    Back in 2006, George Alexander detailed a great list of traits essential for successful computer programmers. In this entry, we will look at those traits and see how they apply (or not) to the family life of a computer programmer.

  • SQL Connections in ASP.NET - What you learned is WRONG!

    When we learn how to open and use a database connection with ASP.NET, as with any other programming concept in any other programming language, the simplified version used to explain what’s going on is not truly representative of the quality professional code we will one day be expected to write. Opening and Closing Connections

  • How to Create Full Text Search Using mySQL

    Search is one of the most basic features visitors expect when they come to a web site. This is especially true in e-commerce where your ability to make a sale is directly related to your customer’s ability to find the product they’re looking for.

  • Maintaining SQL Connections in ASP.NET

    There is a lot of conflicting advice with regard to the proper way of using SQL connections in web work.  The two main schools of thought are:

  • Breaking Java's Rules: Instantiating an Interface

    Here’s a geeky party trick:

  • Are You Thinking About Working from Home?

    For many employees, the idea of working from home is like the promise of living in a dream; free from the trials of office culture, and hovering managers.   The ability to wake up in the morning and skip the commute to work seems like such a wonderful and alien concept.

  • A Beginning

    I had been running a short-lived site dedicated to the ins and outs of website scripting languages when I realized something about myself: I don’t know nearly as much as I once thought I did.

  • How To Format Dates Using DataFormatString

    During a recent project I was setting up a DetailsView control for a record’s tombstone information [note: this logic is the same in DataGridView, GridView, and anywhere else that DataFormatString is used].

  • Blank Screen Loading GMail

    I noticed lately that I’ve been having issues accessing my GMail account.  These issues have come and gone in the past but in the last several days it’s turned into an occurrence every time I log into my account.