Sunday, September 30, 2007

NetBank fails and goes under

NetBank, one of the first online-only banks, has officially failed and is now being controlled by the FDIC.  Unprofitable since 2005, it has lost a total of $300 million in the last two years.

ING Direct is taking over the insured consumer deposits.

AnywhereCD closing September 30

AnywhereCD will be closing its doors as of September 30th.  Music CDs are on sale for $7. 

I'm only posting it here because because Michael Roberston's blog entry gives the details of the business venture and why if failed (and presents an interesting snapshot of the music industry):

...One insanely asked me if I would embed the purchaser's credit card number in the song files they bought. (I pointed out as politely as I could that no one would shop at Barnes and Noble if they printed your credit card number on every page of every book you bought. And, um, oh yeah, I'd be breaking a variety of federal and state laws!)

Friday, September 28, 2007

GrandCentral - One Number fo Life

GrandCentral is a Google owned service that uses VoIP to link a customer's phone numbers together. Simply stated, you get a free phone number ("for life") , coupled with a web-based unified communications platform that allows you to to forward calls to another number, ring multiple numbers simultaneously, and provides voice mail.

While it doesn't have all the functionality of a virtual PBX, the price is right: it is currently free. And it works.

I've been trying it out for a while and felt comfortable enough to make it the publicly listed phone number for my business. When I'm mobile, I forward the number to my cell phone. When I am at home, it is forwarded to my VoIP phone line. When at a client site, it is forwarded to the most convenient desk phone.

When I can't answer the phone, a voice mail is emailed to me.

Powered by ScribeFire.

Labels: , ,

Thursday, September 27, 2007

HTTP GET, POST, and PUT with curl

Curl is one of those swiss army knife type command line utilities for developers who need to develop web services or network software. I keep forgetting the command line syntax using curl, so I thought I would post it here in its artful simplicity.

HTTP GET to a URL:

curl http://www.domain.com/index.html

HTTP PUT a file to a URL:


curl -X -d @mytestfile.xml http://www.domain.com/script.php

HTTP POST a string to a URL:

curl -d "String to post" http://www.domain.com/script.php

HTTP POST a file to a URL:

curl -d @file_to_post.xml http://www.domain.com/script.php

Enjoy.

Mis-posted by ScribeFire and corrected by hand.

Labels:

Monday, September 24, 2007

Agave Mountain, Inc. Privacy Policy

Below is the privacy policy that I hammered out tonight.  Although certainly not required, I felt it necessary to tell our customers that we hold their personal information as something to be fiercely protected.

This Privacy Policy describes how we handle your personal information for our services on the Agave Websites. It applies generally to the AgaveMountain.com website and other related websites where this policy appears in the footer of the page. Some websites we operate may be governed by separate privacy policies. The policy that applies on any of our domains or subdomains is always the policy that appears in the footer of each website.

Our subsidiaries’ and joint ventures’ privacy practices are similar to those described in this Privacy Policy. Subject to the requirements of applicable law, we strive to provide a consistent set of privacy practices. By accepting the Privacy Policy and the User Agreement in registration, you expressly consent to our collection, storage, use and disclosure of your personal information as described in this Privacy Policy. This Privacy Policy is effective upon acceptance for new users and is otherwise effective on September 27, 2007.

Collection of Information

You can browse our sites without telling us who you are or revealing any personal information about yourself.  However, once you give us your personal information, you are no longer anonymous to us. If you choose to provide us with personal information, you consent to the transfer and storage of that information on our servers located in the United States.

We may collect and store the following personal information:

  • email address, physical contact information, and (depending on the service used) sometimes financial information, such as credit card or bank account numbers;
  • transactional information based on your activities on the sites;
  • shipping, billing and other information you provide to purchase or ship an item;
  • community discussions, chats, dispute resolution, correspondence through our sites, and correspondence sent to us;
  • other information from your interaction with our sites, services, content and advertising, including computer and connection information, statistics on page views, traffic to and from the sites, ad data, IP address and standard web log information;

Marketing

We don't sell or rent your personal information to third parties for their marketing purposes.

Disclosure of Your Information

We may disclose personal information to respond to legal requirements, enforce our policies, respond to claims content violates the rights of others, or protect anyone's rights, property, or safety.

We may also share your personal information with:

  • Members of our corporate family to help detect and prevent potentially illegal acts and provide joint content and services (for example, registration, transactions and customer support).
  • Service providers under contract who help with our business operations (such as fraud investigations, and bill collection).
  • Other third parties to whom you explicitly ask us to send your information (or about whom you are otherwise explicitly notified and consent to when using a specific service).
  • Law enforcement or other governmental officials, in response to a verified request relating to a criminal investigation or alleged illegal activity. In such events, we will disclose information relevant to the investigation, such as name, city, state, zip code, telephone number, email address, User ID history, account history, and IP address.
  • Other business entities, should we plan to merge with or be acquired by that business entity. (Should such a combination occur, we will require that the new combined entity follow this privacy policy with respect to your personal information. If your personal information will be used contrary to this policy, you will receive prior notice.)

Without limiting the above, in an effort to respect your privacy, we will not otherwise disclose your personal information to law enforcement, other government officials, or other third parties without a subpoena, court order or substantially similar legal procedure, except when we believe in good faith that the disclosure of information is necessary to prevent imminent physical harm or financial loss or to report suspected illegal activity.

Security

Your information is stored on our servers located in the United States. We treat data as an asset that must be protected and use lots of tools (encryption, passwords, physical security, etc.) to protect your personal information against unauthorized access and disclosure.  All personal information is encrypted for transport, and data which is deemed of a sensitive nature is also encrypted before storage to mitigate any damage that might be done in the unlikely event that hardware is stolen or our security systems are breached.  

Conflict with Laws

Should any part of this policy come in conflict with the laws of the United States, States where we are qualified to do business and transacting business, or Countries where we are actively engaged in business, those laws will take precedence and we will comply to the fullest extent.

Privacy Policy Amendment

We may amend this Privacy Policy at any time by posting the amended terms on this site. All amended terms automatically take effect 30 days after they are initially posted on the Site. In addition, we will notify you through email. If your questions are not answered online, you may write to us at: Agave Mountain, Inc. Attn: Global Privacy Practices, 1695 E County RD D #112, Maplewood, MN 55109.

Sunday, September 23, 2007

Cleaning up a "new" PC

I just reformatted and reinstalled the system restore CDs for my HP desktop.  However, before I could get back to working, I had to slog through all of the promotional software that popped up asking for me to register, help me choose an Internet Service Provider, and register for updates. 

Frustrated, I downloaded the "PC Decrapifier."  The PC Decrapifier is a free utility that recognizes over 50 commonly pre-installed applications and will automatically uninstall them.  Some of the software that many manufacturers ship their computers with, from demo DVD burners to trial antiviral software is nearly impossible to uninstall (Symantec Internet Security is pretty difficult to uninstall.  Last time I had to resort to their custom super secret uninstaller, which didn't work).  The PC Decrapifier uninstalled if flawlessly. 

While it cleaned up most of the garbage-ware, it left behind some stuff I had to manually delete.  Microsoft Works? Gone.  Trial of Microsoft Office 2003? Gone.  Otto? Deleted.  DISCover? Uninstalled.  PC-Doctor? Scrubbed.  Wild tangent and a collection of games I will never play? Off to the recycle bin.

After finally removing all of that junk, I was finally able to get down to the business of using my system without being slowed down by adware and demo software.

Oops.  Time to reboot for the fourth time. 

Thursday, September 20, 2007

Tax Issues for Nomadic Consultants

Today Fortune small business columnist Anne Fisher posted a column entitled, "What tax issues face nomadic workers?" (Ask FSB).  The column was answering a reader's question regarding packing up his wife and kids into and RV and working whereever and whenever.
 
I chuckled because I am a technical mercinary and I know first hand about some of the issues.  I go where the best opportunities are; maybe three months here and six months there.  You jump into a quagmire of state and federal laws, rules, and regulations. To comply with the legal and tax issues is tedious. 
 
I should know, I had to learn the hard way by asking for advice and researching.
 
A Simple Example
 
I took a contract working for a body shop (as a W2 employee) that was located in Florida.  They did my payroll from their office in Maine.  I was working for a client in Connecticut.  My residence was still in Texas.  My car was registered in Texas, but I derived all of my income while I was physically working in CT. 
 
Here are some issues that came up.  I will post the answers in other posting if anyone is interested:
 
Did I have to file an income tax return in CT?  Am I required to have state income taxes withheld from my paycheck? 
 
My (Texas) car inspection and registration expired while I was in CT.   What do you do when your car registration expires and you are out of state?   
 
My drivers license is about to expire.  Which state do I get it in? 
 
If you file for unemployment which state do you collect from?
 

Tuesday, September 18, 2007

Google Docs adds PowerPoint

Google today launched a "very basic" PowerPoint clone that lets you create Presentations inside the web browser. Other than creating presentations from scratch, you can also upload your existing PPT and PPS slideshows into Google PowerPoint. The new feature is available at documents.google.com (or docs.google.com). The feature also integrates with Google Talk - where a presentation can be delivered live online with chat.

Labels: ,

Monday, September 17, 2007

C++: Pragmatically Generating a Back Trace/Stack Dump

When you work on a very large embedded project with multiple developers on different continents, all dumping code into a project, it becomes very difficult to figure out what is broken and more importantly, who is the best person to go fix it. One way is to generate core dumps and then use gdb and the bt command to print the back trace, but core files can become large and not everyone knows how to analyze a back trace. So invariably, one or two developers end up being called in on every problem where they guestimate where it may be, and assign the bug. Arguments ensue and time is wasted. It can turn into a tremendous waste of time. If things get bad enough, I will add C++ code that will generate a back trace (sometimes referred to as a stack trace) in a human readable format. With that I can quickly say which part of the application broke, and go find the owner to assign the bug to. If you are using Linux/gcc/glibc you can generate a back trace with the backtrace() and backtrace_symbols() function calls. Below is an example:


#include <stdio.h>
#include <execinfo.h>

void backtrace(void)
{
void *addresses[10];
char **strings;

int size = backtrace(addresses, 10);
strings = backtrace_symbols(addresses, size);
printf("Stack frames: %d\n", size);
for(int i = 0; i < size; i++)
{
printf("%d: %X\n", i, (int)addresses[i]);
printf("%s\n", strings[i]);
}
free(strings);
}

Labels: ,

Sunday, September 16, 2007

Paperless Office - Scan Forward

The easiest way to begin a paperless office is to implement a "scan forward" approach.  The idea is simple: purchase a scanner, and then pick a cut-off date, after which all new documents will be electronic.

The benefit to this approach is that you only scan existing paper records if they're used.  If documents don't get scanned after a year they can be archived or destroyed.

Choosing a Scanner

For obvious reasons, the scanner is the most important component to a paperless office setup.  Look for a scanner with the following options:

  • ADF - Automatic Document Feeder/Automatic Sheet Feeding.  Using a flat bed scanner is tedious since you will have to manually swap out the paper. 
  • Duplex - In addition, you want a scanner with duplex -- the ability to read both sides of documents.  Some software packages are smart enough to merge two one sided scans into a single pdf file, but it is way more convenient if your scanner does this automatically.

I can't tell you how nice it is to load up the scanner with a 25 page, double-sided document and walk away.

I could only find two scanners with these features in my budget: the HP N6010 ScanJet (poorly rated on Amazon) and the Fujitsu S500M.

I ended up purchasing the Fujitsu S500M ScanSnap.  It is a duplex, color scanner capable of 18 pages per minute.  So far it works wonderfully, even with credit card receipts. 

Choosing Shredder

I wouldn't waste too much time dickering about which kind of shredder is best.  The following features are pretty much a necessity for me:

  • "Confetti" cut.  Smaller pieces are better.  
  • The ability to shred credit cards and CDs, and eat staples.  If you can shred a credit card, a few sheets of paper won't bother it.

Also, unless you want to shred as you go, I suggest staged shredding.  I have a plastic file box that I dump papers to be shredded.  When it gets full or enough time goes by, I shred them at one sitting.

How to Begin

Next, start to define and create your own process for dealing with paper.  I would suggest something similar to what I do.

I now open my mail next to a 50 gallon trash can.  I try to throw away as much as possible.  Envelopes, catalogs, flyers, brochures and advertisements are immediately and automatically thrown away.  The application part of the credit card solicitations are separated to be shredded.  Roughly 90% of my mail now ends up immediately in the trash or shredded.

Next take the remaining paper and decide what to do, and then take action.  I view each piece of paper on my desk is something I haven't done yet.  When it is done, it is in the trash or shredded.

  1. Scan an pay bills and invoices (I usually scribble the date and check # before scanning);   
  2. Bank statements and credit card statements should be scanned and reconciled immediately.
  3. For magazines, I will take some time to read them, or set them aside.  I started putting a purge date on the front with permanent marker.  If I don't read them within two weeks they are gone. 

Also, for reciepts:

  • The IRS says you don't need receipts for purchases under $75.  B.S.  Scan them in and save them.  One day you may (possibly) thank me. 
  • Every business purchase receipt is scanned in and organized after I purchase.
  • Other receipts, grocery, gas, restaurant, credit card receipts are thrown away unless it is a major purchase or a reimbursable expense.

Labels: , , , ,

Paperless Office for Small Offices

I implemented a paperless office several years ago, which was successful for a short period of time.  I even went so far as to purchase an early HP tablet PC.  For a short period of time it was extremely effective, and I was very happy. 

At the zenith of my paperless office experiment I was able to get word document (a contract) in an email, digitally sign it with the tablet PC, print it to a virtual PDF printer, and email the signed document back as if I had printed, signed, scanned and emailed the contract.  I was enthusiastic and efficient.

However, ultimately the experiment failed -- because I concentrated on maintaining a paperless office and not taming the paper flow.  I scanned everything, even magazine clippings.   I would spend too much time scanning, renaming files, and organizing them. 

Worse yet, I backed up the files onto CD-Rs, but didn't close out the sessions (I think you know where this is going to go...).  Over time, the CDRW drive burned out, followed by a hard drive failure.  As many of you know, when you attempt to open a multisession CDR on a CDRW drive from another manufacturer... Lets just say I was anxious until I was able to recover the data.

Now I am older and wiser and going to start again, and along the way I will keep the readers updated with my progress.

Paperless Office Goals:

  1. I'm keeping the filing cabinet.  My goal isn't be come fully, 100% paperless.  That would be absurd.  Contracts, leases, legal documents, etc., should be preserved in their original state.
  2. Should cost no more than $700.  Assuming you already have a computer, $700 is more than enough to put together a paperless office setup.  The most expensive component is the scanner.  
  3. Convenience is paramount. I failed the first time because it was too much of a hassle to scan, organize, or retrieve documents.  Compounding this, I originally attempted to scan every scrap of paper I encountered.  This time I will place more emphasis on workflow.
  4. Secure.  I will be using GPG for encryption.
  5. Robust.  I will be using subversion for a repository.
  6. Platform Independent.  I am using several variants of Linux and Windows.  I need a solution that can be implemented on both sides of the OS fence.

Friday, September 14, 2007

Ameritrade

More information about the TD Ameritrade breach is slowly dribbling out. Even thought TD Ameritrade had been receiving complaints about spam (users would create special email addresses unknown to anyone but Ameritrade), since 2006, it wasn't until a lawsuit was filed by lawyer Scott A. Kamber which forced the company to investigate. According to the lawsuit, Ameritrade's servers were vulnerable as far back as October (and reportedly fixed July 18th).
The plaintiffs in the lawsuit had wanted the court to order Ameritrade to tell its customers about the data problem, but Ameritrade issued its release before a hearing could be held. The plaintiffs are also seeking damages and are trying to qualify as a class-action lawsuit. "They preferred putting out a press release with their own language in it rather than have the court order them to put out a release with our language," Kamber said.
I am totally stunned that a public company would display so many ethical traits that I despise.

Powered by ScribeFire.

Labels:

Installation of Xilinx ISE/EDK for Redhat 4.0

Prerequisites

 

You will need to build the USB drivers for the Xilinx Platform Cable USB device, hence, you must have the kernel headers/sources for your system available.

 

Note: Red Hat 4 does not come with a kernel sources rpm.  You can install the kernel headers with the kernel-devel-2.6.9-34.EL rpm.

 

Install ISE

 

Mount up the CD and run the installer to install ISE.

 

# mount /dev/cdrom /mnt/cdrom

# cd /mntrom

# ./setup

 

Select /opt/xilinx for the destination directory.

 

If you don't work with Red Hat Enterprise 3.0, Kernel 2.4, you better deselect Platform Cable USB Driver and Parallel Cable Drivers.

 

Install EDK

 

# mount /dev/cdrom /mnt/cddrom

# cd /mnt/cdrom

# ./setup

 

Select /opt/edk for the destination directory.

 

Apply ISE patch

 

# unzip 8_1_03i_lin.zip

# ./setup

 

Apply EDK patch

 

# unzip EDK_8_1_02i_lin.zip

# ./setup

 

Apply Final ISE patch

 

# cp ise_81i_ip_update1.zip /opt/Xilinx

# cd /opt/Xilinx

# unzip ise_81i_ip_update.zip

 

Create Script/Setup Files

 

Next, we need to create a script or two.  Don’t forget to chmod +x these scripts.

 

start_ise.sh

 

Creat a start_ise.sh script.    This script will initialize the variables and create a personal .xilinx directory for you.

 

#!/bin/bash
XILINX_DIR=/opt/xilinx
XILINX_USER_DIR=~/.xilinx

if [ ! -d ${XILINX_USER_DIR} ]; then
mkdir ${XILINX_USER_DIR}
fi
cd ${XILINX_USER_DIR}

. ${XILINX_DIR}/settings.sh

${XILINX_DIR}/bin/lin/ise

 

start_edk.sh

 

Create a start_edk.sh script.  This script will initialize the variables and create a personal .xilinx directory for you.

 

#!/bin/bash

# start_edk.sh

#


XILINX_DIR=/opt/xilinx
EDK_DIR=/opt/edk
XILINX_USER_DIR=~/.xilinx

if [ ! -d ${XILINX_USER_DIR} ]; then
mkdir ${XILINX_USER_DIR}
fi
cd ${XILINX_USER_DIR}

. ${XILINX_DIR}/settings.sh
. ${EDK_DIR}/setup.sh

${EDK_DIR}/bin/lin/xps

 

setup.sh

 

Create a file in /opt/edk named setup.sh and place the following text in it:

 

          # /opt/edk/setup.sh

export XILINX_EDK=/opt/edk
export LD_LIBRARY_PATH=${XILINX_EDK}/bin/lin:${LD_LIBRARY_PATH}
export PATH=${XILINX_EDK}/bin/lin:${XILINX_EDK}/gnu/microblaze/lin/bin:\
${XILINX_EDK}/gnu/powerpc-eabi/lin/bin:${PATH}

 

 

Install WinDriver and Xilinx driver

 

Download the WinDriver package from Xilinx:

 

ftp://ftp.xilinx.com/pub/utilities/M1_workstation/linuxdrivers.2.6.tar.gz

 

Fedora 6 Note:  You will have to create a /usr/src/linux link to your kernel source.  In my case it was:

 

# ln –s /usr/src/linux /usr/src/kernels/2.6.18-1.2798.fc6-i586


# tar zxvf linuxdrivers.2.6.tar.gz
# cd linuxdrivers.2.6
# cd windrvr
# ./configure
# make
# make install
# dmesg

If you see the following line, then you have installed the driver correctly:

 

[...]
WinDriver v7.00 Jungo (c) 1997 - 2005 Build Date: Apr 26 2005 X86 loaded

 

To load the driver:

 

# modprobe windrvr6

 

Next, build the xpc4drvr driver:

 

# cd ..

# cd xpc4drvr

# ./configure

# make

# make install

 

You will receive the following error:

 

Loading /lib/modules/2.6.16/kernel/drivers/misc/xpc4drvr.ko
ERROR: Module xpc4drvr does not exist in /proc/modules

 

# depmod


Register the drivers with USB hotplug system

 

# cd path_to_ise_installation/bin/lin/
# touch /etc/hotplug/usb.usermap
# sh setup_pcusb

 

Troubleshooting

 

If you are having problems connecting and downloading, follow the next steps:


1. Login with root permission and open a terminal.
2. Verify that the "windrvr6" module is loaded and running.

cat /proc/modules

If it is installed, the "windrvr6" module will appear in the generated list. If the module is not loaded, refer to (Xilinx Answer 22648) for instructions on how to install and load the module.

3. Change the current directory to "<InstallDir>/bin/lin", where "<InstallDir>" is the location of the previously installed Xilinx design tools:

cd <InstallDir>/bin/lin

4. Download the "xusbdfwu.hex" firmware file from the following link to this directory:
ftp://ftp.xilinx.com/pub/utilities/fpga/xusbdfwu-1025.zip
5. Disconnect the USB cable from the PC.
6. Enter the following command to run the installation script:

source ./setup_pcusb

7. Reconnect the USB cable.

 

Finished

 

Reboot.  All of the software is installed and configured.  

 

# ~/start_driver.sh

# ~/start_edk

 

The Xilinx JTAG box should now have an amber light on (or green if the board is attached and powered).

Labels: , ,

TD Ameritrade Hacked.

I just received this email from TD Ameritrade (below) and I'm fuming mad.   Let me parse and summarize the email I recieved:  Someone breached TD Ameritrade's security, and left behind some "unauthorized code," and made off with social security numbers, email addresses, ACH account numbers, and more. 
 
Interestingly enough, I found a postings from 2006 which suggest that this has been going on for more than a year (here too), before they caught on and disclosed the problem.  They have denied the problem or blamed it as an "industry wide problem".  
 
Dear Joe Turner,

Let me tell you why I am sending you this email. While investigating client reports about the industry-wide issue of investment-related SPAM, we recently discovered and eliminated unauthorized code from our systems. This code allowed certain client information stored in one of our databases, including email addresses, to be retrieved by an external source.

Please be assured that UserIDs and passwords are not included in this database, and we can confirm that your assets remain secure at TD AMERITRADE.

What we want you to know:
  • Once we discovered the unauthorized code, we took immediate action to eliminate it. We are confident that we have identified the means by which the information was accessed and have taken appropriate steps to prevent this from reoccurring.
  • You continue to be covered by our Asset Protection Guarantee, which protects you and your assets from any unauthorized activity that may occur in your account through no fault of your own. If you lose cash or securities as a result of such activity, we will reimburse you for the cash or shares of securities you lost.
While Social Security Numbers are stored in this particular database, we have no evidence to establish that they were retrieved or used to commit identity theft. To further protect you, we have hired ID Analytics, which specializes in identity risk, to investigate and monitor potential identity theft. ID Analytics provides identity risk services to many of the country's largest banks and telecommunication companies, as well as government agencies. Following its initial evaluation, ID Analytics found no evidence of identity theft as a result of this data breach. We will retain its services on an ongoing basis to support your TD AMERITRADE accounts and to monitor for evidence of identity theft. We will alert and advise you if any is found. As always, we encourage you to remain alert in guarding your personal information, regularly review your account statements and monitor your credit activity from the major reporting agencies.

For more information on protecting yourself against the possibility of security threats, please visit our online Security Center.

We sincerely apologize to you for this situation and want to assure you that protecting the security and privacy of your assets and information remains a top priority. We have made and will continue to make significant investments in security software, systems and procedures, and we will remain vigilant about protecting you.

We want to answer any questions and address any concerns that you may have about this matter. For more information, including a list of Frequently Asked Questions (FAQs) and an additional message from me, please go to www.amtd.com or contact Client Services. Please note that we are anticipating increased call volume during this period, which may lead to long wait times. We encourage you to review the FAQs and, if you have a question, to log on to your account and send us a secure email. Once again, please be assured that your assets are secure at TD AMERITRADE.

Sincerely,
[image]
Joe Moglia
CEO
TD AMERITRADE

Labels:

Thursday, September 13, 2007

MontaVista Vision 2007 DevCon

MontaVista is the first and largest vendors of embedded linux development tools.  They have created a devcon, named "Vision 2007."  I decided to go and check it out. 
 
Touted speakers and events include:
  • Andrew Morton, lead maintainer of the Linux kernel, on "The relationship between kernel.org development and the use of Linux for embedded applications"
  • Christopher Hallinan, author of Embedded Linux Primer, the number one-selling book on embedded Linux, on "Debugging embedded Linux: tools and strategies"
  • Jonathan Corbet, editor of LWN.net, on "The state of the kernel"
  • Dirk Hondel, CTO of Intel's Open Source Technology Center, on "Developing in open source for embedded devices"
  • Joe Rigazio, Texas Instruments general manager of DSP catalog and EEE digital signal processors, on "Driving the future of digital video"
  • Open source licensing authority Jason Wacha on "Open Source licensing review"
  • Mobilinux expert Kevin Hillman on "Dynamic power management for mobile devices"
  • A dinner performance by technical comedian Don McMillan
  • A multiplayer interactive gaming tournament powered by six Sun Ultra 20 workstations
  • A display of the 250-horsepower Intel Chopper, built by Intel and Orange County Choppers to showcase Intel embedded technology. Features "a digital dashboard, GPS navigation, wireless connectivity, fingerprint recognition for security, and digital cameras that replace rear-view mirrors," MontaVista says
Details and registration forms can be found here.
 

Labels: , ,

Wednesday, September 12, 2007

Xynergi from Fairlight

For the princely sum of only 28k, you can have the nicest keyboard on the block:

Labels:

Thursday, September 6, 2007

Around the Web

I get a lot of email messages, newsletters, and notifications hyping new web services, new utilities, and add-ons. Most are a prolific waste of time, but a precious few are good enough to make me take notice.

Utilities/Add-Ons

2007 Microsoft Office Add-in: Microsoft Save as PDF or XPS. Save files as PDF files.

Desktop Alert for Google Apps Email. Although this utility is not from Google, it is officially recognized as a Google Enterprise Partner.

Websites

Art of Office - this an interesting and slightly strange social website for Microsoft Office users where they can upload Word, Powerpoint, and Excel documents. Some interesting PowerPoint presentations can be found there.

MSDN Magazine: Build Your Own Windows Vista Sidebar Gadget. Interesting article on building Visa desktop gadgets.

Podcast/Radiocast

TechNet Radio – Tune in, Geek out.

“How Do I” Videos — ASP.NET

Powered by ScribeFire.

How Not to Implement Serialization in C++

I spent most of the day knocking out a nice PowerPoint slide deck to walk a customer's developers through a large swath of code I just checked into their subversion repository.  I hammered out a framework that would improve productivity and implementation.  With a littel luck, the project would be back on schedule. 
 
The framework included serialization, complements of the Boost serialization library. However, the principle architect balked at using Boost serialization -- I should have used the persistence mechanism that was coded by their developers.  I argued, but when the person who signs my timesheets agreed with the architect, the battle was over. The customer is always right. 
 
With that, I needed to revamp my code to use the persistence mechanism (which used blocks of memory that were flushed to disk or flash memory), but make it more usable.  Hundreds of lines of, "if (p) p->write(sizeof(x), &x, 1)" are not acceptable to me.  There has to be a better, more developer friendly way. 
 
I immediately turned to Google for help.  Surely a developer out there had a simular interest in rolling their own serialization scheme.  Amazingly, I found several "tutorials" on serialization that had the exact same theme.
 
The number one serialization tutorial was the "<ahref="http://www.functionx.com/cpp/articles/serialization.htm" functionx C++ Object Serialization tutorial</a>. It should be entitled, "How NOT to Implement Object Serialization." 
 
Take the following example:
#include <fstream>
#include <iostream>
using namespace std;

class Student
{
public:
    char   FullName[40];
    char   CompleteAddress[120];
    char   Gender;
    double Age;
    bool   LivesInASingleParentHome;
};

int main()
{
 Student one;

  strcpy(one.FullName, "Ernestine Waller");
  strcpy(one.CompleteAddress, "824 Larson Drv, Silver Spring, MD 20910");
  one.Gender = 'F';
  one.Age = 16.50;
  one.LivesInASingleParentHome = true;

  ofstream ofs("fifthgrade.ros", ios::binary);
  ofs.write((char *)&one, sizeof(one));

  return 0;
}
So what is wrong with doing this?  It is an extremely poor solution that will only work on the same compiler/platform reliably.
 
Also, the pointer to the class one doesn't necessarily point to the first data item, public or private within this class.  I spent several days tracking down and squashing a bug in an embedded system because of assumptions like that.  In my case, the original developer cast the class to a char *, then wrote the class to a socket.  Unfortunately for the developer, who assumed that the pointer to the class would point to the private data, he did not consider that this might be compiler dependent.  After looking at network traces I quickly figured out the problem.  One compiler was injecting some extra bytes, causing problems.
 
Next, what happens when you save a class that contains pointers to other classes?  Kaboom.
 
 

Labels: ,

Free Dr. Dobbs Journal and MSDN Magazines

Developers can register to subscribe to digital editions of Microsoft MSDN Magazine and Dr. Dobb's Journal for free. Simply login HERE using your Windows Live ID (formerly called passport) account and subscribe.
  • A sample of Dr. Dobb's Magazine can be found HERE

  • A Sample of MSDN Magazine can be found HERE.



Powered by ScribeFire.

Labels: ,

Wednesday, September 5, 2007

Dealing with C++ "Unused Parameter" Warnings

Generally, when I am working with clients I try to get everyone on the team to agree to a "no compiler warnings" policy and immediately turn on the "warnings as errors" switch. Thereafter, any compiler warning is automatically treated like an error and the build will fail. Unfortunately, when stepping into a project where most of the code was written long ago, there may be hundreds if not thousands of compiler warnings. The only solution is to investigate and fix (or suppress) each one. So how do you suppress the unused parameter warnings when you legitimately don't use the argument? There are three ways: 1. #pragma unused. #pragmas are compiler specific and should be avoided. However, if your compiler supports it, you can use it as follows:

void my_function(int32 foo)
{
#pragma unused foo;
}

2. Comment the Argument. Additionally, you can comment out the argument. The compiler will not give you an unused warning:

void myfunction(int /* arg */)
{
}

3. Cast to void. Casting an unused variable to void will always
stop the warning.

#define UNUSED_ARGUMENT(x) (void)x
void myfunction(int arg )
{
UNUSED_ARGUMENT(arg);
}

Labels: ,

Tuesday, September 4, 2007

PayPal Subscriptions Outage Finally Resolved

PayPal's subscription payment service went down hard last week. The problem was reported on the PayPal Developer Community, and later on TechCrunch. The issue was reportedly resolved on September 2nd. For those keeping score, that was several days where businesses were not getting payments, and worse, PayPal was canceling subscription accounts, leaving small business owners furious. Worse, customers were reporting that technical support personnel were denying any problems and PayPal never once notified customers of the outage. This mirrors similar outages in April, and June.

Powered by ScribeFire.

Labels: ,

Saturday, September 1, 2007

Web Based Power Point Presentations

Sharing PowerPoint presentations is a headache. Sending the presentations via email is simply not the most efficient way to do it. Often it is better to embed the presentation in your blog or web page. You can do this by converting the PowerPoint to an embedded flash presentation.

If you use OpenOffice, this is a very simple process – Just open the presentation, click on File.. Export... then export the presentation to the Flash (*.swf) file format.

However, for the droves of people who don't want to do that, there are web services (scribd, Spashcast, slideaware, slideshare, etc) that will take your PowerPoint and turn it into an embedded flash presentation (much like a YouTube video). Here are the two best (in my opinion) services:

Slideshare produces some of the best looking embedded flash/PowerPoint presentations for the web. It is also modeled around the social web concept, so you can share, comment on, digg, etc., or post directly from the website to your blog.

SlideAware is another service. This one has the added bonus of providing viewer stats.

Powered by ScribeFire.

Labels: