Thursday, July 16, 2009

Recovering a Business Contact Manager database

The biggest headache I've had this week has been trying to restore my BCM database to my desktop. I hadn't backed it up recently, but the .mdf and .ldf files for it were recovered from my old disk drive. I thought it would be easy enough, but I was wrong.

Just trying to replace a new BCM database on the desktop with the old files didn't work. I tried so many things, including changing my login name to match my old computer. Then changing my computer name to match the old computer. Nothing was working.

Finally, I followed directions I found here for restoring the database, and after messing around with file permissions for what seemed like ages, I finally got the script to work without giving me an Error 5 Access Denied message. But then it still wasn't showing up in Outlook when I tried to configure BCM. Eventually I read something about starting Outlook as an Administrator, and then the database showed up! I selected it and there was all my data. So far so good. But when I tried to share the database for access from another computer where my niece does contact entry for me, it wouldn't work. It just gave me an error about how it couldn't complete the last action.

Finally, I found a post where someone said it was a problem with permissions on Vista, and that the directions in the link above work for XP. My other computer has XP, so I tried it there. Lo and behold, it worked the first time. I was excited. That worked for me as long as I could share it with the desktop. So I went to Share Database from the BCM menu. And was promptly told that I could not share the database from Windows XP Home Edition. I had forgotten it was Home Edition. I briefly looked into upgrading to XP Pro.

Then I had a flash of insight. Since it was working for local access on the XP, I performed a backup of the database. Then I restored the database on the desktop. Success! Then I shared the database on the desktop with the username I use to login from my other computer. Then I went to the other computer and selected the shared database.

It only took the better part of 4 days.

Computer Crash


My 18 month old HP Pavillion dv9500 died on Monday. I came back to the office and the screensaver looked like this. I could access the ctrl-alt-delete menu, but when I tried to launch Task Manager or to reboot, it just returned to this screen, with maybe another black rectangle somewhere. I have not been able to boot up since. Not even in safe mode. Check disk reported error #10009 and said Replace disk. Eventually, we couldn't even get into the BIOS so something is seriously wrong

Thom, acting as my IT manager has been up late several nights investigating. He thinks I have a video problem, as well as a hard disk problem. Or it could be the mother board. If it is the mother board, repairing it could be 1/2 as much as buying a comparable new Sony Vaio. This is my first HP and I'm not planning to buy another. The built in video camera hasn't worked in at least 8 months and many hours trying to trouble-shoot that were wasted.

In the meantime, I've been trying to get up and running on my Dell desktop that I bought last year for testing. Fortunately I had checked all my source code into source control before the computer crashed. And we have a USB 2.0 to IDE cable that we were able to use to hook up the 2 hard drives from the HP to the Dell. The data is all there, so I didn't lose anything, other than all my time in dealing with the crashed laptop.

Thursday, October 16, 2008

New Developments

It's been awhile since I've posted because I've been bogged down in trying to get a release out. I keep running into technical problems with the API I am using for my former company's product. I finally gave up and have written a parser to get some of the information from their text file that I cannot access through the API. I don't know why I didn't do it sooner. It's very liberating not to be at their mercy.

Recently, several good developments have come up. A few weeks ago, I was asked to write an article for a new trade publication that is focused on users of the application I develop for. This is great publicity for me and thanks to Thom, I pitched a great idea for the article that was well received.

The publication will debut at a trade conference later this year that I am hoping to attend. I can't afford a booth or even full conference attendance, but I can get tickets just to the exhibit hall which would give me a great chance to network. Some of the guys who have helped with beta testing my add-in will be there, along with other key players, such as resellers that I am hoping to forge relationships with to help sell my software. I just need to work out childcare with Thom and Kim for the time I'd be gone. Hopefully I can work it out, especially since I hope to have my release out by then, so the timing would be great. Plus I can grab extra copies of the trade publication with my article.

Another great development is that I am talking to a woman who wants to work with me. She is a former colleague of Thom's and he speaks highly of her. She is looking to work part-time from home, which works perfectly for me. She is a developer and has project management experience and could be a huge help in getting the company off the ground. She has so much more experience than I do, including experience working with start-ups, so I am just thrilled she is interested. She hasn't developed in C# before, but she is getting up to speed now. We'll see how things go, but after our initial talk a couple weeks ago, I have a good feeling that we can work together.

And just this week, I lined up another contract job that will help continue to fund the company until I can get sales revenues coming in.

Now I need to go write that article and finish my release.

Thursday, August 14, 2008

Copy Protection Follow-up

If you saw my post last month on copy protection you know I was a bit frustrated with Aladdin. And in the heat of my frustration, I vented. I still stand by my comments on their documentation and lack of support for 64-bit Vista, but now that I've calmed down, and made some headway in implementing their copy protection solution, I wanted to elaborate on why I chose them.

One reason I went with Aladdin is my sales rep, Krista McCormack. I met her years ago at an Aladdin presentation that I was invited to when I was with my old company (who was a client). She was our sales rep for years and I always enjoyed talking to her. So when I needed a copy protection solution, I thought of her as much as I thought of Aladdin. She is helpful in making sure I get the answers I need. And not long after my ranting post, we talked and knowing how upset I was, she made sure I got the technical support I needed. And I've been relying on that support as I get ready for my release. (I probably could have avoided some headaches by just calling Krista in the first place.)

But the main reason I went with Aladdin's SRM solution is that it offers the flexibility I'm looking for. Although it does have a quick "wrapper" type of technology where you can just "wrap" your compiled project up without making any API calls, that is not what I wanted. I have a bunch of .NET dlls being called from a 3rd party program and I wanted to use an API to control my copy protection from the inside. I didn't want a simple run/don't run solution. I wanted to copy protect individual features. And the SRM API gives me that ability, that detailed control.

Aladdin also provides APIs for all of their functionality - not just the runtime copy protection. They have a separate API for license activation so I can create a way for users to activate new licenses right from inside my application without having to rely on an out-of-the box solution (although if their out-of-the-box solution for this had been less kludgy, I may have used it initially to get to market sooner). And there are a few other APIs that I haven't needed yet.

I also like the flexibility when it comes to licensing. Although I don't want to use hardware locks, I have that option down the road. I know from past experience that some companies prefer a hardware lock and I might want to offer that option someday, and with SRM I can do that without having to change my application. But for now, I am going to offer node-locked licenses and network or floating licenses. And my application will come with a 30-day trial by default. There are even more options that I plan to use, and I like that it is so flexible.

I spent a lot of time doing technical support at my last job related to copy protection, which is why I'm trying to make sure I make it as easy on my users as possible and give them ample licensing options to suit their needs. Which means using some of the more advance features of SRM. Which means running into the shortcomings in their documentation as I'm trying to figure out how to do more advanced things. The downside of having so many ways to customize their product is that it requires a lot of documentation. And unfortunately, documentation doesn't seem to be their strong suit.

The good news is that the support person I'm working with now is a HUGE help. She has all the right answers and has been very responsive. Ideally, though, they would overhaul their documentation so I don't HAVE to rely on support to get my job done.

I'm still not ready for release. I'm still struggling with my implementation of floating licenses and installation of the runtime dlls, but I'm making progress. And in the end, I think it will pay off. Or Krista will never hear the end of it...

Wednesday, July 16, 2008

CA Franchise Tax Board

I'm ready to pull my hair out. I got a notice in the mail Monday from the CA FTB saying I owe $48.80 in penalties. It is for the tax year ending 12/31/07. I formed my LLC on August 13, 2007. CA charges a minimum annual tax of $800, even if you don't make any money in that tax year (I did make a little). Normally the tax is due by April 15th, same as income taxes, but when you form a new LLC, the tax is due the 15th day of the 4th month following the formation of the entity. Four months from August 13th is December, so I paid $800 by December 15th.

Now, 6 months later, I get a notice that shows my payment of $800 and shows that I owe a Monthly Penalty of $4, and Underpayment Penalty of $40, and Interest Due on that of $4.80. It doesn't say when my taxes were due or when I paid them.

I am assuming that either this is a mistake, or my taxes were due on November 15th, not December 15th. When I formed my LLC, I never received a tax notice with a specific due date, I just knew I had to pay by the 15th of the 4th month following formation of the LLC.

So I'm trying to call the FTB to find out why I got this bill. The first time I call, I don't even get the automated system, just a message that all circuits are busy. Today I called again and got through to the automated system, went through the menu options and then was told the estimated wait time was 28 minutes. Sigh. So I've got it on speaker phone and I'm resigned to wait it out. But then a recorded voice tells me that they are experiencing a high volume of calls and to please call back later. They apologize for the inconvenience, blah, blah, blah. Click.

So I don't even have the option to wait half an hour. Maybe that is how they cut down on complaints about the long wait on hold - they just don't let you do it. I might be less frustrated, but after waiting 6 months to tell me I underpaid, I only have 10 days from the time I got the bill to when it has to be paid. And if I don't pay it on time, they are threatening to assess a $187 collection fee - on top of additional penalties and interest that will accrue.

Which makes me wonder if they just send out these bills in the $50 range hoping people will just pay them rather than try to get through to their obviously understaffed phone lines.

P.S. I just heard back from my accountant (who I e-mailed when I couldn't get through to the FTB) and he said I should have counted August as the first month. So I did pay a month late. Maybe that is what the Monthly Penalty was for - I was one month late with payment.

Friday, July 11, 2008

Copy Protection

If I wasn't planning to copy protect my software, I'd have released my paid version by now.

At my old company, we used hardware locks, aka "dongles". I am planning to provide my software electronically, so I don't want to have to ship locks around. Especially since a good number of my clients will be overseas and shipping costs can really add up.

So I decided to go with a software solution. I chose Aladdin's HASP SRM solution. I had worked with their hardware locks before and trust the HASP technology. I also considered Crypkey and not a day goes by that I wonder if I wouldn't have been better off doing that. But I already invested in Aladdin, so I'm stuck with it for now. And based on past experience with copy protection, I suspect I'd just have different problems with Crypkey.

There are other solutions out there. A lot of high-end expensive solutions. But my products are going to start in the $200-300 range and I can't afford an expensive solution. Not to mention I have a limited start up budget. And I didn't want to go with the quick and dirty solution of just requiring a license key on installation because it is too easy for someone to share that around the office without some kind of an online verification system. Which seems to get back into the expensive solutions. Not to mention I don't have my own server.

So I went with Aladdin since I trust them and they are familiar. Or at least I thought they were. The SRM technology is a generation newer than what I worked with before. The API is different and the process for issuing licenses seems more confusing to me. So I'm procrastinating, looking at everything else I need to do besides getting the copy protection set up, even though that is the highest risk item.

Not only is it more confusing, but their documentation is in need of an overhaul. I'm a developer. I've worked with a lot of APIs and read a lot of API documentation. And Aladdin's leaves something to be desired. And suddenly, their technical support, which was great a few years ago, has been a big disappointment. A couple of times, when I've followed up on an issue, even though the same guy is replying, the response doesn't sound like he reviewed the original issue I'm following up on!

And don't get me started on their lack of support for 64-bit Windows Vista. The copy protection will work on 64-bit Vista machines, but don't try to develop on them.

My latest frustration is that the tool they provide to activate end-user licenses is so kludgy that I feel forced to use their separate activation API to write my own. But that API only comes with an unmanaged C++ sample. Which I couldn't even get to compile in VS 2005! (It was created in VS 2003 and the release notes says that they have tested the converted version in VS 2005 and VS 2008, but they couldn't bother to include those versions). Their main runtime library comes with samples in many languages, including C#, which is what I use, so why not the activation API?

I did find a .NET activation sample on their website, but when I asked their support team about it, they seemed clueless. I am now in the process of trying to incorporate an activation dialog into my product, borrowing from this seemingly unauthorized .NET activation sample I found on their site. I just hope this hassle pays for itself in the number of licenses I sell because I'm starting to wonder if copy protection is worthwhile..

Thursday, July 3, 2008

Business Contact Manager for Outlook 2007

It's been awhile since I posted. I've been spending all my time looking for a new nanny, but I think I've found someone who will last for awhile. (More on that in my other blog).

At work I've been busy learning Business Contact Manager for Outlook. It came with my free copy of Office and since I already had it, I decided to give it a try for contact management.

My process so far: Every time someone registers on my website, I get an e-mail notification with their contact details. I then use anagram (a very cool tool by Textual to create new Outlook items like contacts and calendar events from highlighted text) to create a new Outlook contact from the information. Then I go to my website to see what programs that user has downloaded and then set categories on the contact to indicated which of the 2 free programs they have downloaded, and another category to indicate whether they have indicated they want to receive notifications of updates and new product offerings. I've had well over 200 people register on the site that I've created contacts for, so the contacts are quickly adding up. (There is also a backlog of registrations I haven't added.)

This process has a couple of limitations. One is that I cannot easily find all of the people who downloaded product X AND want to receive product updates. There is also no way to add new fields for storing things like the username they created for the site (that data just goes in the comments field) and there is no way to track sales once I get to that point.

This is where Business Contact Manager (BCM) comes in. It's nice because I already use Outlook and it is built right in. I bought myself a book to learn more about it - Business Contact Manager for Dummies. I have found it very helpful for looking up things I need to learn, rather than sitting down and reading right through it.

So far, I have customized my contact form by adding checkboxes to indicate if someone wants product updates and whether or not they have downloaded the free products. Then I added a number field for tracking the number of licenses they buy of my first product (hopefully coming out in a couple of months). I also added a text field for their username.

The next step was to drag all of my regular Outlook contacts into my Business Contacts folder. This turns them into business contacts with all of the extra information that comes with BCM, plus my custom fields. I also was able to set up anagram so that new contacts I create will automatically be created as business contacts.

Now, I need to go through all of those existing contacts and set the new fields based on the categories I had set. So if the Update category was set, I need to check the box for wanting product update notifications. I also need to take the username from the comments box and put it in the new text box. And there are a few other fields I need to set.

I have already created custom searches so once my contacts are set up correctly I can quickly find everyone who wants update notifications AND has downloaded product X. So when the paid version of product X comes out, I can quickly find those contacts and send an e-mail announcement to them. (I think this also might be what is called a "marketing campaign" - something BCM can help manage).

The next problem is that I have so much to do, I haven't found the time to go through all those contacts to set the new fields and I've had nearly 100 new users register in the past 6 weeks that I haven't even created new contacts for. So I've been trying to figure out how to share my BCM database so I can find someone to help me out (my niece or nephew perhaps?) Although I'm hoping that I can share the database over a VPN connection (so someone can work from home, or a dorm room), I first tested it out with my old laptop. My Dummies book came in handy, but I followed the directions there and when I went to connect to the shared database from my old laptop, I got a message that it couldn't connect to the database.

So I searched online and found lots of suggestions about making sure my BCM computer was online (duh!), making sure my Windows Firewall settings were set properly, and several other things that did not help.

Finally, I wondered if it was just using the default login for that computer to try to connect (I had to add specific users to BCM when I set it up to be shared). I have Liz as a user on my computer and my login on the old laptop was Liz. But I didn't have a password on the laptop and I did have a password set for user Liz on my computer. So in desperation, I went to my Control Panel on the old laptop and changed the password for my Liz login. Lo and Behold! Now I was able to connect to the shared BCM database. How is it that no one has come across this simple problem before?