Welcome to Tap Consulting
My name is Aaron Barker and this website is dedicated to displaying the freelance IT work that I do.
I live on California's central coast and service clients all over the west coast.
The concept behind Tap Consulting is very simple... To help business's "Tap" into their full potential
by implementing the correct IT solutions. My specialty is developing, hosting, and implementing Web based applications.
Please check out the site and feel free to
contact me with any questions.
My primary services include:
Programming/Web Development
and
Web Hosting (over 50 satisified clients).
A couple of weeks ago I was having issues tracking down a particularly confusing performance issue with Velowear.com. Since Velowear.com utilizes asp.net and webcom to work with the Ecometry order management system I could not use the built in Cassini web server to run and debug the web site. For the last two years I'd do all my coding on my own computer and upload the changes to a test server to see if everything would compile and run as expected. This worked ok, but it did not allow me to easily debug things, plus it was a pain if two people were trying to work on the web site at the same time... I realized I needed to get the debugging features working to be able to solve this performance issue.
Turns out this was easier than I thought (originally I tried to get remote debugging to work).
The basic steps to do proper Visual Studio development for a .net based Ecometry web site are the following:
- Install webcom.dll on your local machine
- setup IIS on your development computer and use the default web site
- Use the IIS feature in Visual Studio to run/debug the web site
Here are more detailed Steps using screen-shots from Windows Vista (IIS 7):
- Install webcom.dll on your computer. This can be accomplished 2 ways:
- Run the webcom setup that comes with your EcomPak (this will also install the sample asp templates on to your c:)
- Copy the version specific webcom.dll to you %windir%/system32 folder and then running regsvr32 %windir%/system32/webcom.dll
- Install IIS on you local computer (must be running windows XP Pro or Vista Business or better). If running vista make sure you install the IIS Metabase and IIS 6 Configuration compatibility.
- Install Visual Studio (Express Edition should work just fine).
- Configure your default web app using IIS (InetMgr.exe in Vista). Create a copy of your Ecometry web site on your local machine and in the IIS management tool point your default web site to it. In Vista go to actions on the right column and choose "basic settings".
- Start IIS if it's not running.
- Open Visual Studio, got the file menu->open web site and choose IIS. Select your default site.
- Hit the play button and see if your web site compiles and runs.
- Use breakpoints to step through your code.
- You are now debugging your Ecometry/.net based web site!
author: Aaron Barker | posted @ Tuesday, November 18, 2008 8:14 PM |
Website: www.voler.com
Background
I've been working at Voler full time for over two years now. In those two years I have redone their other related sites (Velowear.com, Semi-custom Design Studio, and Voler.com). Voler.com was the last on the list. It is primarily a marketing site for custom apparel for cycling teams and was a much easier project then redoing velowear.com or the semi-custom side of things.
Purpose
To create a new marketing site for Voler custom team apparel and clarify the different cycling apparel markets Voler services.
Technical
Voler.com offers information about how to place a custom team order, design specs, and full product catalog. You'll also notice what I call the pre-header at the top of all of Voler.com and Velowear.com. We want to make it clear to our customers the three different types of products we offer: full custom, off the shelf, and sem-custom.

author: Aaron Barker | posted @ Saturday, November 01, 2008 11:14 AM |
Background
I use ArrayList heavily to load datasets into memory to minimize database queries. This creates huge performance increases, especially for retail oriented sites with lots of product browsing. I had implemented sorting and searching prior to LINQ but doing this involved somewhat archaic means (IComparer, and foreach loops)
I knew there had to a better way to filter an ArrayList than using a foreach loop so I looked into the LINQ functionality. I found this MSDN article that explained most of what I wanted. I also wanted to put the data back into an ArrayList so I had to figure that out too. This was very easy turns out that there is an ArrayList constructor that excepts a generic list and a LINQ query has a ToList() method.
Example
In the example below I wanted to create a method that took an ArrayList of Product Objects and returned only the active products as an ArrayList (Product has a bool Active property):
public static ArrayList getActiveProducts(ArrayList ProductList)
{
var query = from Product p in ProductList
where p.Active == true
select p;
return new ArrayList(query.ToList());
}
This code is much cleaner and efficient than using a foreach loop to copy the matching items into a new ArrayList. There is a bit of a learning curve with LINQ but it is a great tool because it is so flexible and works with any imaginable data-source. By the way there are also order by statement in LINQ, so I could have re-ordered my list very easily too w/o having to extend IComparer.
author: Aaron Barker | posted @ Tuesday, September 16, 2008 10:17 AM |
Background
Ecometry is the order managment system we use at Velowear.com (one of my responsibilities as Voler's IT Manager). Ecometry has many features for locating duplicates; but it does not include the ability to search through the entire customer data-set to find possible duplicates. Given this limitation I was assigned the task to find/merge duplicates using a third party tool (I was working for Velowear as a consultant at this time).
Details
I could not locate a third party tool so I decided to create my own system. Step one was to generate a view in SQL Server that would perform the heavy data crunching. Access than looks at this view and uses VBA to find possible matches. The Access database then presents these possible matches to the user who can override them as they wish. The final product is a merge file that Ecometry uses to actually merge the customer records. The Access database doesn't actually modify the Ecometry database at all, it just looks at it and then generate the merge file.
Instructions
Note: these instructions are intended to be used for someone that is knowledgeable with SQL Server and Access.
This process should work with Oracle as well, but slight modifications may be required to get it to work. This "software" is provided w/o any warranty expressed or implied and should be used at your own/company's risk. Let me know if I missed a step in the instructions below, or if I need to make things clearer...
- Download zip file containing Access database and SQL for creating database Views.
- Create the following three views in your Ecometry database: EmailAddressView, CustomerEmailListngView, DuplicateCustFinderView (SQL attached in zip file)
- Copy the Access database to the location you want to run it from (we have it on network drive we run Ecometry from, but it can be on any machine that has network access to the database and the Ecometry Pub folder.
- Change the default field values for DB, UID, PW, and pub location (in Access open form in design mode and change default value to what it should be).
- To actually run the merge follow steps 1,2,3. Play around with it a little but using your test database, but don't accidentally put your test merge file into your live database pub folder...
Note: If your database server is under load, or you customer data-set is too large to handle you may get a timeout during step 1. To solve you need to increase the timeout settings, or look at optimizing the provided SQL queries as these are what are taking too long to execute.
author: Aaron Barker | posted @ Monday, September 08, 2008 10:16 AM |
Background
One of my first IT/IS jobs was implementing a Time and Attendance system and the interfacing it with the payroll system. This sounds easy but it involved integrating home grown system developed in Access by the warehouse manager and implementing 3 new timeclocks at two different facilities and over 400 employees during the busy season. Through this project I learned much about Time Keeping systems and told myself I could create better system that was accessible via the web.
Fast forward a couple of years and I was looking for side work and I found a posting on the Cal Poly Help Wanted Forum requesting a timekeeping system for a small Bay area Landscape Company. I eventually bid and got the contract for the job and implemented the first version of what I now call Tap Time.
Tap Time is now in its third version and is actively being used by a Local San Luis Obispo Based government agency and other local businesses. The program has grown to include many project management/budgeting features that are key for Government work. It is entirely web based and includes payroll export features and numerous management reports.
Purpose
Provide acurrate and easy to use web based time keeping with advanced budgeting project management features.
Technical
- Developed in ASP.net 2.0
- SQL Server 2000 backend
- Advanced Budgeting Features
- Ability to Bill hours to a project
- Customizable for individual clients
- Available as either on on site install or hosted solution
- Export to Payroll feature
author: Aaron Barker | posted @ Monday, July 07, 2008 4:18 PM |
Background
This is a project that I started over a year ago and have continued to make numerous small improvements to. The database is currently in use at one Chinese restaurant based in the Bay Area. They have two terminals each with receipt printers and one printer for the kitchen. Prior to using this software the restaurant took all of their orders manually with pen and paper and added up totals using a calculator. Implementation of the software also included installing 2 computers and touch screens (done by Cortex Computer).
I'm thinking about releasing a version of this database as a sort of Open Source project as I think many other small restaurants could easily alter the program to fit their own needs.
Purpose
An easy to use Point Of Sale Program (Unicode compatible - meaning it will display and print Mandarin Characters) for a small resturant. The program is capably of printing reciepts applying discounts, free drinks (and still apply the tax) and many other features. Since it is implemented in Microsoft Access is relatively easy to alter it or build off of.
Technical
- Microsoft Access Database (2000 Format)
- VBA Code for all events
- Unicode Compatible
- Ability to Manage Items
- Screen design done by editing Access forms
- Touch screen Compatible
Update! POSimple released as open source:
See this article to for more info and to download.
author: Aaron Barker | posted @ Monday, July 07, 2008 3:54 PM |
One of the email options I offer to my clients is the ability to use what Google calls Google Apps which is a business version of their Gmail, Calendaring, and other various services. The GMAIL service offers the IMAP protocol to synchronize email with various mail clients (Outlook, IPhone, Web...). The benefit of IMAP is that you will have same version of your mail wherever you access it from.
One of the biggest hang-ups people have with using this is the whole paradigm of archiving messages vs. deleting messages. Using the IMAP interface the delete command is interpreted as Archive to delete a message you have to move that message into your [GMAIL]/trash (where it will be automatically deleted after 30 days).
One of my bosses at my day job kept pestering me about the ability to delete various marketing email that she had no desire to archive and felt that moving the messages to trash was too much of a hassle. After trying to convince her that it wasn't too much of a hassle I realized that it was in fact a pain in the butt and there had to be a better way. So with my expert Google skills I set out to find a solution and I did.
http://www.kilpo.net/FixOutlook.html outlines 2 specific Outlook idioms, one being the IMAP move to trash issue discussed above. The code presented there is not specific to GMAIL, so I took his code and made some minor changes to get it to work with a standard Outlook Gmail Setup. I have tested with multiple account in Outlook 2007 and appears to work as expected.
To implement the what I'm calling the "Trash" feature follow these instructions (USE AT YOUR OWN RISK)
- Open up Outlook
- In the menu bar go to tools->Macros->Visual Basic Editor (or hit alt+F11)
- Locate ThisOutlookSession Macro and open it
- Copy the code below into the Code Area
- Save and Close the VBA Window
- Create a Toolbar item by going to the menu bar View->Toolbars->Customize
- Locate Macros in the Category (left pane)
- And Drag the Project1.ThisOutlookSession.TrashMessages up to your toolbar (I put mine next to the X - delete command).
- You can give the Trash toolbar item a more friendly name an icon and even assign a hotkey by going back to the Customize Command window and then Rearrange Commands. Use this article on Windows IT Pro Adding Hotkeys and Toolbar Buttons if you need more help with this.
- That's it I hope you find this useful!
Below is the VBA s code:
Sub TrashMessages()
Set myOlApp = CreateObject("Outlook.Application")
Dim myNameSpace As NameSpace
Set myNameSpace = myOlApp.GetNamespace("MAPI")
Dim myExplorer As Explorer
Set myExplorer = myOlApp.ActiveExplorer
'Get the folder type, expected type is 0 i.e. mail folder. If other type of folder
'being used then abort macro as it should only be used with mail folders.
folderType = myExplorer.CurrentFolder.DefaultItemType
'Check that folder is mail folder
If TypeName(myExplorer) = "Nothing" Or folderType <> 0 Then
GoTo invalidMailbox
End If
'Locate root folder for this account
Set thisFolder = myExplorer.CurrentFolder
Do Until thisFolder.Parent = myNameSpace
Set thisFolder = thisFolder.Parent
Loop
Set accountFolder = thisFolder
'Identify selected messages
Dim selectedItems As Selection
Set selectedItems = myExplorer.Selection
Dim currentMailItem As MailItem
Dim iterator As Long
'Move messages to Deleted Items folder
Set trashFolder = accountFolder.Folders("[GMAIL]")
Set trashFolder = trashFolder.Folders("Trash")
Count = selectedItems.Count
For iterator = Count To 1 Step -1
On Error Resume Next
Set currentMailItem = selectedItems.Item(iterator)
currentMailItem.Move (trashFolder)
Next
Exit Sub
invalidMailbox:
MsgBox ("Macro configured only to work with mail folders! ")
Exit Sub
End Sub
author: Aaron Barker | posted @ Friday, June 20, 2008 11:06 AM |
I have been working diligently on implementing some new features into Velowear.com. One of these features is an in-page image popup. Originally I had coded it a an asp.net control within an AJAX panel, but found that this approach was not as flexible as just using pure Javascript. The only problem was that I wanted to perform some server side checking if the image existed before triggering the in-page popup. Most of what I had read said this was impossible to do via Javascript, but I knew there had to be a way...
Luckily I stumbled across some Javascript code that uses the XMLHttpRequest Object (this is the core of how AJAX works BTW) that performs this tasks with relative ease. It uses the
XMLHttpRequest object to try and download the file (str) passed into the isFile function. Supposedly this only works when calling the server that originated the request.
I hope this helps you out as much as it helped me.
Here is the code:
function isFile(str){
var O= AJ();
if(!O) return false;
try
{
O.open("HEAD", str, false);
O.send(null);
return (O.status==200) ? true : false;
}
catch(er)
{
return false;
}
}
function AJ()
{
var obj;
if (window.XMLHttpRequest)
{
obj= new XMLHttpRequest();
}
else if (window.ActiveXObject)
{
try
{
obj= new ActiveXObject('MSXML2.XMLHTTP.3.0');
}
catch(er)
{
obj=false;
}
}
return obj;
}
This code was buried in the middle of the following thread found here:
http://www.codingforums.com/archive/index.php?t-98182.html
author: Aaron Barker | posted @ Wednesday, May 14, 2008 12:50 PM |
New Website:
www.JohnBalfanzHomes.com
Background
John Balfanz Homes wanted a complete remodel and fresh look for their new website.
Purpose
The new website showcases available spec homes, the bella-vista development, and custom designer homes.
Technical
This website uses the latest and greatest .net framework 3.5 and SQL Server 2005 back-end. There is an admin section of the website that allows the client to update their listings of spec homes.
Smooth gallery is used to showcase housing pictures.
author: Aaron Barker | posted @ Sunday, April 06, 2008 7:57 PM |
New Website: www.chamblin-landes.com
Background
Chamblin-Landes Construction of Paso Robles, California wanted a new website to highlight their varied projects.
Purpose
The new website showcases construction projects based on specific categories.
Technical
This website uses the latest and greatest .net framework 3.5 and SQL Server 2005 back-end. There is an admin section of the website that allows the client to update their listings of spec homes.
author: Aaron Barker | posted @ Friday, February 08, 2008 11:01 AM |