The Dell Saga

As those of you who follow me on twitter know I have been very disappointed with Dell’s handling of my new PC order, which ultimately ended up in me canceling the order. Below is my letter to the FTC explaining how I believe Dell is abusing the “Mail Order Rule.” Feel free to use it as a template if you feel that you’ve been a victim of this as well.

Matthew Walsh
(address removed
for privacy)

March 15, 2009

Federal Trade Commission
Consumer Response Center
600 Pennsylvania Avenue N.W.
Washington, DC 20580

Dear Sir or Madam:
I recently purchased a computer from Dell Inc. (One Dell Way, Mail Stop 8129, Round Rock, TX 78682). Two weeks after I placed my order they informed me through email that my order would be delayed another week. At the end of this week, they again informed my via email that my order would be delayed another week. This email also mentioned the FTC “Mail Order Rule” (Part 435) and gave me until 9pm that evening to respond or have my order canceled automatically.
I understand the nature of this rule, but I believe that Dell Inc. is using this to their advantage to keep from having to fulfill orders that they deem unreasonable.
First, I believe that the approximately 12 hours between when I received my second delay notification and the time I needed to contact them to continue my order was unusually short. This second email did not state that I would have the option to cancel up until the time that they ship my PC, if I had agreed to the delay. Because of this, I felt that I was being pressured into making a decision to wait indefinitely for my new PC, or cancel and loose out on the deal that I had waited to find through their web site.
Second, at the time of the second notification, the price for the PC I had ordered went up nearly $400 (per their web site), thus I believe they are using this rule as a way to ensure they maximize profits on each of their sales, by saving the components that would have gone into my PC for another customer who was paying more for it.
I have done business with Dell in the past, and have been very pleased with their products, but the handling of this particular delay, in my opinion, was very unsatisfactory.
My account information with Dell is as follows, if needed: (removed for privacy). Enclosed are my order confirmation, first and second delay notices.

Thank you for your time,
Matthew Walsh

Posted on March 15, 2009 at 6:39 pm by Matt Walsh · Permalink · 2 Comments
In: Blog

Vista 64-Bit, The First 24 Hours

My new computer with Vista-64 arrived yesterday, and now that I’ve got the majority of my data copied over and programs installed, I’m compiling my thoughts on both Vista and the 64-bit environment.

The first thing that I noticed is that you need to be careful to look for the 64-bit downloads for the software that you’re installing. I ended up downloading and re-installing things several times after I ran a program and realized that it was running in 32-bit mode.

How can you tell if something is running in 32-bit mode? Open up task manager and look at the processes tab, in the image name column look for a *32 after the name of the file. If it’s there, then it is running in 32-bit mode. I’ve also noticed that programs that run as services, such as backup and AV programs, run their configuration applications in 32-bit mode, but if you look at the all process tab, I’ve found that the underlying engine that actually does the scanning or backing up runs in 64-bit mode.

Here are some of the programs that I use regularly and their 64-bit status.

As for drivers, I was able to locate 64-bit drivers for my printer, scanner, bluetooth adapter and video card from their manufacturers’ without any problems. All of this hardware is under 3 years old. I would expect some problems finding updated drivers for hardware that is older.

Although it got a bad rap to start, I’m quite impressed with Vista overall. Some of my favorite features that I’ve found so far include:

Posted on March 14, 2009 at 6:14 pm by Matt Walsh · Permalink · Comments Closed
In: Blog

Syntax – Programming Series (3 of 3)

Syntax is structure of the programming language. It can be thought of as the verbs, nouns and parts of speech that make up English, or a foreign language. Syntax can typically fall under 3 different categories: High level, low level, and graphical.

High level is what is most common today. This includes languages such as C, Visual Basic, PHP and others. These languages use human-readable elements such as if, then, else, while and return to control the flow of a program. Many of these languages share enough common elements that a programmer familiar with one language can often look at code written in a different language an often have an understanding of what it accomplishes. However, each of these languages is unique and many of them are designed around a particular task or programming concept. A thorough understanding of this underlying concept can help a programmer to make a decision on which language to use to accomplish a particular task.

A graphical language is a high level language that is often represented in a flowchart form to facilitate human readability. Flowcharts are mainly made up of decision branches, and function blocks, not unlike ones that are used to describe a process in a user manual. These languages are typically programmed using drag and drop. Grab the block you need and drop it in the appropriate place on the screen. Each block often has a few parameters associated with it. For example a decision block will have a two input values and a comparison operator, not unlike an if statement in a text based language. From this block you can then branch to a yes or no function block. Function blocks, like decision blocks, also have inputs. A block that performs and addition function, for example, would have two inputs for the values being added, and one output for the result. These languages often become very complex to follow because it is often difficult to place comments within the flowchart structure to help another programmer understand exactly what is happening, unlike comments in a text based program which can be placed nearly anywhere. Additionally, as the program becomes more complex, the flow of the program can become very difficult to follow as it will quickly begin to cover several pages, and connecting blocks between these pages can often be a challenge depending on exact language used.

Another example of a graphical language is ladder logic. It is typically used in industrial control systems, and is based directly on electrical schematics that look a lot like rungs of a ladder. This design was intentional, as an electrician familiar with common electrical symbols could very easily transition to programming in a ladder language, as the symbols and functions of the symbols was essentially the same. Over time, the language has evolved to add instructions and symbols that do not have an electrical counterpart. Ladder based languages also have the distinction of running continuously, unlike the text languages also discussed in this section. Again, this design is intentional as it is modeled after electrical schematics and components, which behave like a continuously running program, as long as the machine is turned on.

Low level languages are ultimately what is run on a processor, and the other two types of languages discussed here are ultimately turned into a low level language before they are executed. Low level languages often use mnemonics that help to make the language readable to programmers. A few lines from a typical low level language might read as follows:

LD A, 10
INC A
JP A,Z

In the above example LD, INC and JP are all opcodes, and are actual instructions that the processor carries out. The values following the opcodes are parameters for each code. In this case A is a register, 10 is a constant and Z is a label to jump to. Each of these opcodes is turned into a binary value that is the actual sequence of bits that the processor must see to carry out the command entered. Even though this has been made easier to read through the use of mnemonics, at first glance it is not entirely clear that this code loads the value 10 into register A, increments the value in A by 1 and then jumps to label Z if A is not zero. Programming in an assembly language requires a good understanding of the actual architecture of the processor, how memory is laid out, what functions it can perform and how to combine the rather primitive functions provided into more common functions such as if-then-else statements.

Posted on March 11, 2009 at 11:00 am by Matt Walsh · Permalink · Comments Closed
In: Blog

Execution Style – Programming Series (2 of 3)

There are two basic ways that a program can be executed: continuously and event driven. The execution style is dictated by the programming language, and is almost always event driven.

In event driven code, nothing runs until there is a triggering event. This is often the user clicking a button, pressing a key, following a link on a web site, or it could be a machine generated event, such as data arrives on a port or a set amount of time has elapsed. In any case, once the triggering event happens, a portion of code is executed. In a calculator, for example, when the user presses the equals button, the corresponding portion of the program to add, subtract, multiply or divide is carried out.

Continuously executed programs run every line of code, from top to bottom, and then immediately begin executing at the top again. Every line of code has a distinct output that is updated on a more-or-less continuous basis, as long as the program and processor run sufficiently fast. The most basic type of this program is often referred to as “bit banging” and is often used in the programming of industrial equipment. It is called bit banging because these types of programs look at inputs from multiple single bit sources, often push buttons, position sensors or selector switches and based on the states of these inputs, turn on or off a single bit output. The code can often be broken down into several lines of if-then-else statements such as “if A or B are ON then turn ON C else turn OFF C.”

Interestingly, these two different styles of program execution, even though they are defined by the programming language, can be written in such a way that they behave as they other type of program. Consider the following lines of pseudo-code that are written in an event driven language:

Event (User Click)
While (1)
If A or B Then C Else D
If A and B Then E Else F
End While
End Event

The above program will execute continuously, even though the programming language is event driven. Strictly speaking, this code would “hang” the processor as it would be stuck in an infinite loop that only deals with inputs A and B. In reality, there is a supervisory program (an operating system in a computer, for example) that oversees everything that is going on and will pause the execution of this program and give processing time to other programs to keep everything running as expected.

Like the above example, a continuous execution program can be written to appear to execute as though it were event driven. Here is another pseudo-code example written in a continuous language.

If A then B
If B then C
If C then D

Even though all of these lines of code are executed over and over, the only way to get to D is to first trigger A, which triggers B and so on, in an event driven fashion.

One other interesting note, excluding the newer multi-core processor systems, any given processor can only execute one command at a time, and can only execute commands sequentially. The speed of a processor allows it to appear to handle multiple tasks at one.

Posted on March 9, 2009 at 11:00 am by Matt Walsh · Permalink · Comments Closed
In: Blog

Algorithm – Programming Series (1 of 3)

After several years of programming in various languages for several different platforms there are several things I’ve come to realize about programming. I’ve broken it down into 3 separate topics, each with their own discussion. Each discussion will be added over the next few days.

The heart of any program is the algorithm that actually performs a task at hand. There are often plenty of auxiliary functions that typically must also occur in a program, but what makes each and every piece of software unique is how these functions are tied together to perform a task. Often the algorithm is the piece of code that requires the most debugging, the most attention to detail, and most importantly, a new and often creative idea. Auxiliary functions frequently are written by a third party, or in the case of many high level languages, may actually be features of the language itself. In PHP, as an example, there are functions available to query a database, write HTTP headers to a browser, read data from a web page or sort an array. All of these functions typically require no more than a line or two of code for them to perform a lot of work more or less automatically.

Let’s apply these functions to a basic model of the Google search engine. Things start off with a web crawler, an auxiliary function that gets a web page. The crawler then finds links on the page, opens them and continues on indefinitely.

The crawler feeds its data to Google’s algorithm called Page Rank. This is the core of their process. It counts up the number of links to a given page, and what context the page is linked to. Note that there are no pre-defined functions to handle this task, thus it is the main algorithm because it contains the new and creative idea mentioned above.

Next we move back to some auxiliary functions. The data that is generated by Page Rank is then stored in a database, another built in function in many programming languages. Then, when a user does a search, the database is queried and returns a response that contains pages that match the user’s input. Finally, this data is then sent to the user’s web browser, all of which can be handled by various functions that are already built into a programming language.

Please understand that this is a very simplified analysis of Google, and it was intentionally designed to show how an algorithm is a small part of an overall program, but is what makes every program unique.

Posted on March 7, 2009 at 12:25 am by Matt Walsh · Permalink · Comments Closed
In: Blog