Categories
Uncategorized

SourceGear Vault Review

Sourcegear Vault is a source control server that is designed to be a replacement for Visual Source Safe.

Rather than write a long review, I’ll list the major pros and cons:

Pros:
1. Client is very easy to use. Even with no training in any source control system I think most users can accomplish what they want with little direction. Perforce, by comparison (which is the next closest comparison) is very difficult to use and it is both possible and likely you will lose data because of this.
2. You can work by changing files locally and merging and checking them in. Or you can do the usual checkout / change / checkin method.
3. It doesn’t create files on your local harddrive (Perforce also has this benefit). CVS and Subversion both create files on your harddrive, which is really annoying when trying to make builds.
4. It has a command line Linux client.
5. It’s half the price of Perforce.
6. It uses a real database, rather than try to reinvent the wheel as does Perforce.
7. All but one of my support posts on the forum were answered quickly.

Cons:
1. It’s slow to connect to – takes about 10 seconds even on localhost with a fast computer.
2. The command line Linux client requires Mono, and my users indicate that is an unacceptable dependency. Perforce has better support for Linux.
3. While it comes with a web interface, the web interface is useless for anything other than looking at the directory structure.
4. Depends on Microsoft’s expensive SQL database, rather than MySQL, a free alternative. Microsoft has a free version of their database but it comes with restrictions. I heard you can purchase the SQL database from SourceGear cheaper, but this is unconfirmed.
5. Depends on Microsoft’s IIS, which is very difficult to configure and is inferior to Apache. In fact after 5 days I still don’t have it working right. “The Vault server could not be contacted to perform the operation. Your network connection to the server may have been interrupted. Please verify your network settings using the Options dialog under the Tools menu in the Vault GUI Client.The request failed with HTTP status 403: Access Forbidden.” This may be an IIS error, but I really consider it to be a Vault error, because Vault has a needless dependency on IIS and the only reason I installed IIS is because Vault depends on it.
6. My friend Jason told me it’s very slow with very large databases.

Categories
Uncategorized

Be Careful of Linksys Routers lock-in

I went to setup my Linksys NR041 router with dynamic DNS through DynDNS, which is a free service. But on the options page of the router there was only the option to use TZO, which is ridiculous because it is a subscription service for a market where there is a free alternative.

Linksys control panel

So I contact Linksys tech support for a firmware update. To their credit, I got someone on the line right away. But it seems like your only alternative is to junk the router that doesn’t support DynDNS.

Rachel (18676): Hi, my name is Rachel (18676). How may I help you?
Rachel (18676): Hello.
Kevin: hi, I have a linksys nr041 and want to use dynamic dns with a provider other than TZO
Kevin: In particular, I want to use dyndns.org

Rachel (18676): Is this working before?
Kevin: what do you mean?
Rachel (18676): Is this the first time you will use the dyndns?
Kevin: um well yeah with this router but I don’t see the relevance. On the configuration page the only option is to use TZO, which is a pay service. I should have the option of choosing the service to use, should I not? So my question is really how to I select an option other than TZO?
Rachel (18676): May I put you on hold for 5 minutes, so that I can verify this concern?

Kevin: ok
Rachel (18676): Thanks.
Kevin: DDNS (Dynamic DNS) allows assigning a domain name to a dynamic WAN IP address, making it easier to host Web, FTP, or other servers.
The Dynamic DNS service is powered by TZO.com.
Rachel (18676): Okay.
Rachel (18676): On which tab on the setup page are you seeing the TZO option?
Kevin: Under advanced options, DDNS
Rachel (18676): Okay.
Rachel (18676): One moment please.
Rachel (18676): Under the DDNS tab what are the options that you can see there?
Kevin: DDNS Service:
Enable Disable
To use the Dynamic DNS Services, please sign up for a free 30 day trial
To order the TZO service, click here
To manage your domain name and related services: Controlpanel.tzo.com
Kevin: The rest are the login / pass for TZO.com. Except that I want to use a dynamic dns provider other than TZO.com
Kevin: Other routers let you choose what provider you want to use
Rachel (18676): So, you want to use dyndns.org instead of TZO?
Kevin: yup
Rachel (18676): I see.
Rachel (18676): I believe you can choose “Dynamic DNS Services” to use dyndns.org.
Kevin: where is that/
Kevin: Are you referring to the line of text:
Kevin: To use the Dynamic DNS Services, please sign up for a free 30 day trial
Kevin: please sign up is hyperlinked
Rachel (18676): Yes.
Rachel (18676): If you click that what happened?
Kevin: Goes here:
Kevin: https://www.tzo.com/cgi-bin/Portal.cgi?PortalID=Linksys&/
Kevin: obviously I’m not going to be able to use dyndns from tzo.com 🙁
Rachel (18676): So, it is still TZO.com?
Kevin: yeah
Rachel (18676): Okay.
Rachel (18676): One moment please.
Rachel (18676): Kevin, I have verified this one already if the only option on the router for Dynamic DNS is TZO only, that is the only thing that you cannot use. The NR041 has no option to use dyndns.org.
Kevin: Hmm…. what should I buy then? Do all Linksys routers only support TZO.com for Dynamic DNS?
Rachel (18676): You can use a BEFSR41 v4.
Rachel (18676): It has an option for dyndns.org and TZO.com.
Kevin: hmm ok do you have the webpage for that?
Rachel (18676): Do you mean the setup page of the BEFSR41?
Kevin: nevermind I found it
Rachel (18676): Okay.
Kevin: No I just wanted to look at the webpage for it. By v4 you mean version 4 right? That is what they are selling in stores right now?
Rachel (18676): Yes, V4.
Kevin: ok thanks I’ll have to buy that I guess
Kevin: Thanks for the prompt support

Categories
Uncategorized

Wells Fargo Online Tech support

I can’t create an online account at Wells Fargo. So I call their online tech support. After a brief discussion, our conversation proceeds as follows:

Online Tech Support: You can create an account online
Me: [Thinking maybe there is a special URL I didn’t already try] OK what’s the URL?
Online Tech Support: …
Me: …
Online Tech Support: URL?
Me: Yes.
Online Tech Support: You mean like web address?
Me: [sighs] Yes…
Online Tech Support: wellsfargo.com
Me: Um, thanks.

Categories
Uncategorized

Wells Fargo is going to nickel and dime themselves out of business

I signed up with Wells Fargo for a business account for RakNet. At first everything looked good – I got a bunch of free checks, the service was nice, and they told me there were no monthly fees. But it seems like their business model is based on tricking people with upfront benefits and then sticking it to them later.

Almost every month for the 6 free months I had to call to cancel charges. I got charged $3 for a ‘returned check fee’ where they send checks I wrote back to me – although I never wrote checks. I got charged for it again even though I called the month before to cancel it. Then again. Then at 6 months I get charged $13 (if I remember right) just to have the account, although I was previously told there were no monthly fees. I contact the business banker and get this waived for 12 months, which is great except I was told up-front there were no monthly fees to begin with.

So I sign up for Authorize.net and they charge me $150 for the priveledge of taking my money off each transaction, and a $30 monthly fee. I thought they were going to send me a bill but they direct debited my account. So now my Wells Fargo Overdraft kicks in and they bill my credit card instead. Although it costs them nothing to do so, the $100 charge turns out to be $120 because of 3 different extra fees that occured due to the overdraft.

I go to the website to sign up for bill pay so I can pay the credit card fee. It says it’s free, except in small print it says it’s actually not free – after 2 months they charge you $10 a month (if I remember right). OK but there’s a waiver to avoid that fee – all I need to do is keep $25,000 in my account. Thanks…

So let me see if I get this right: I give them my money, they get interest on my money, I get no interest on that money, and with all the monthly fees I’m paying $30-$40 so they can make money on my money. What am I getting here exactly? I’d be better off just keeping the money under my pillow.

A friend told me NetBank is good. I’ll probably switch to them.

Categories
Game Development

I will never work for EA

After reading about the EA spouse settlement I’m glad I never went to work for EA.

About a year and a half ago EA contacted me after I sent in a resume. I was really excited by this because everything on the phone went very well. I spoke to a programming department head and we really hit it off. Over 3 days, the EA recruiter contacted me 3 times by phone and we worked out a (in hindsight, low) salary of $75,000 a year. I was all set to move down there. On a Thursday he said they’d buy me plane tickets to fly down on Monday and speak to them in-person. I never hear back regarding confirmation of the flight times so I write three times on Friday and call both him and the person I interviewed with on the phone. No response.

So Monday comes and goes and I assume they lost interest and rudely just stopped replying to my emails. But about two months later the recruiter sends me an email out of the blue, apologizing with the excuse that he had to fly out, told his staff to handle the arrangements, which they didn’t do.

That sounds like a bunch of crap to me. First of all, if he flew out, does that mean he stopped checking his email? This is a connected world. It’s not like I sent one email either. I sent multiple emails, ending with something to the effect of “Hey it’s Monday and I didn’t hear from you. If you lost interest please let me know.” And why would it take 2 months for him to follow up? Furthermore, I just wrote to him and got an answer like an hour before I sent in my inquiry about the plane ticket. Did he fly out in that short period of time, making no mention of this or that I should expect to hear from his staff?

If you don’t want to hire me, fine. If there is a canidate you want to try first, go for it. This is business. I do the same thing, where I have multiple job offers and go in order of preference. Don’t lie or jerk me around though. If you say “You are going to fly here on Monday” I will start packing, and if I don’t fly I will have wasted time and effort.

So a different recruiter contacted me about 4 months ago. I brought up EA spouse, and she said something to the effect that they made a lot of changes and things were different now. I didn’t answer though, because even if that were the case I will never work for EA after getting jerked around.

Categories
Game Development

Rant: How the unwashed masses have ruined computing

When I first started using the PC (mid-80s) there was only DOS. DOS wasn’t hard to use. My Dad, who bought the computer, installed some kind of shell where you could hit F7 or something to enter a directory, F6 to go back, and F5 to run the highlighted program. However, the shell actually ran the regular cd.. and cd [dir] commands. So I learned 80% of all the commands I would ever use in DOS in the first day, and 99% in the first month. I never used the shell again after about a week.

Then Windows came out, and it sucked. It was slower to get to my programs, took minutes to load, as opposed to seconds in DOS, ate up memory, and basically didn’t contribute anything to my ability to use the computer. Yet, over several revisions, it was popular. Eventually, application companies stopped supporting DOS and I was forced to upgrade my computer just to run Windows.

Most of what I did at the time on the computer was play games. Back in the DOS and early Windows days, there were no installers. On floppy disks there were unpackers. Early CD-ROM games just had the whole game on the CD-ROM and you could run it from there directly if you wanted to.

Things were good, because I had control over my harddrive. I knew were every file on my computer was and what it did because I put it there. If I wanted to backup, copy, or move a game I just did it. There was no registry or shared files to contend with. There was no crap left over or “Add/Remove” programs list where 1/4 of the programs in the list actually don’t exist but can’t be removed from the list.

Yet, companies started using installers, and they started using Add/Remove programs, and soon my harddrive was cluttered with crap. My computer was now slower, with wasted harddrive space, and I had to reformat every 6 months or else things got out of control. Even now I still reformat about once a year.

Fast forward a few years. The next version of Windows, Vista, takes half a gigabyte of RAM just to run. I complain about my work computer regularly, which runs XP. Yet it is an Intel 3 gigaherts. That ought to be fast enough to open a text editor right? But for various reasons it’s often not. Essentially, unless you have a top-of-the-line computer you can’t even run the OS anymore without frustration and slowdowns. Why is this? Because people want cute 3D windows, animated icons, and other crap that has nothing to do with the point of the OS, which is to run your programs.

This is the same reason why console gaming is more popular than PC gaming. Consoles are less powerful, harder and more expensive to develop for, and the games are more expensive. Yet they account for 3/4 of the market for two reasons: quality control and installation which consists of inserting a cartridge rather than clicking through a few windows on your PC.

Half the population has an IQ under 100. Better applications, which don’t support “click and drool” as a fundamental design feature, fall behind those that may be worse in every regard except the installation. Windows vs. Linux is arguably in this camp.

It’s important to end a rant with a lesson learned, since complaining isn’t going to change the reality of the situation. The lesson is to make your software so easy to use that your Grandma can use it. If you can do that, you’ll sell to the 50% of the population with an IQ under 100 that your competitor can’t sell to.

Categories
Game Development

Dynamic help is the Clippy of Visual Studio

Does anyone actually use Dynamic Help?

Dynamic Help = Snail Shit

It seems like the stupidest idea Microsoft has ever come up with. Well maybe behind Clippy and Microsoft Bob but not far behind. Within ass grabbing distance.

The problem with dynamic help is that it takes about 10 seconds to load on my snail slow work computer, and F1 is right next to the Escape key, which I hit all the time. And those fields are utterly useless. Do I really care what Microsoft thinks about my coding techniques and programming practices? 10 seconds is too short to go do something else, and too long to avoid breaking my concentration.

At least there’s no dog that comes up asking me what I want to search for.

Categories
Uncategorized

Assert Boy

When I was at my brief stint at Hypnotix, the programming owner there, who was the world’s biggest jackass, once called me “Assert Boy.” This was due to my habit of putting asserts all over my code – on a few occassions too many but mostly valid. So, when other programmers ran my code they’d sometimes hit asserts, which felt like a crash, and to a simpleminded observer (such as the programming owner), my code crashed a lot.

In fact, the only difference was that my code stopped early, where the problem was easy to fix, as opposed to late, someplace random in code, where the problem is very hard to fix.

In my opinion asserts are one of the most valuable debugging tools and should be used judiciously.

Categories
Game Development

Improving compile and link speeds of C++ projects

At work we have a very large codebase, in the millions of lines of code. Nobody understands all the code, and half the people who wrote it aren’t at the company anymore. So a lot of my time is spent experimentally – tracing through code to figure out how it works, or making small changes to fix unforeseen bugs. The problem is this requires a lot of recompiling small changes. Unfortunately, the code is designed in such a way that sometimes small changes result in the recompilation of hundreds of files.

I spend half my day not programming, nor thinking, but waiting for the compiler. This is by an order of magnitude the biggest hindrance towards my accomplishing anything meaningful. A single line of code change can take 15 minutes when you consider the time to build, the time to link, the time to regain my lost attention, and the time to do it all again for my second instance of Visual Studio (for network programming). Fortunately, I’ve learned a few things as the author of RakNet that can help with compile and link times. While they may be obvious to experienced programmers, even experienced programmers don’t consistently follow them so they are worth reviewing.

1. It’s bad to include header files in your cpp files. It’s exponentially bad to include header files in other header files

.cpp files increase the time to compile your project linearly. For example, if my cpp file includes “blah.h” then every time “blah.h” changes, then I have to recompile all cpp files that include that. That’s bad – but still far better than header files, which increase your total compile time exponentially. If files C.h and D.h include B.h, and B.h includes A.h, then anytime A.h changes we have to compile 4 header files – A.h, B.h, C.h, and D.h. But it’s not just 4 header files – we are now also rebuilding any cpp file that includes any of those header files.

2. Avoid, as much as possible, putting code in header files

Code is likely to change. Class definitions are much less likely to change. Furthermore, code in a cpp file is only included in that one place – that cpp. Code in a header file is included everywhere that header file is included. If you put code in a header file, that means that you are likely to change that header file and you are including the same code all over your program meaning it gets recompiled every time.

3. Split up your header into independent classes/structs/enums as much as possible.

It’s a hassle to add header files to a project. Oftentimes, when two kinds of interfaces, such as an enumeration and a structure, are both used with a class, it’s tempting to put both in the same header file.

Supermarket.h
enum Fruits {APPLE, ORANGE, GRAPE};
class Supermarket {Fruits GetType(Fruit *fruit);};

There are two problems with this. First, enumerations are likely to change. If we later add POMEGRANATE then every class that includes this needs to be recompiled. Secondly, every class that cares about Fruits now has to also include Supermarket, and vice-versa, resulting in unnecessary compiles.

4. If your class has complex types in the header, or is included by many other files, think about exposing an interface for that class.

Interfaces can be a hassle since you now have to maintain two copies of your class definition, rather than one. However, in some cases they can vastly cut down on compile times. Consider the following:

Database.h

#include "ComplexTemplatedList.h"
class Database
{
Rec* GetRecord();
ComplexTemplatedList recordsList;
};

DatabaseInterface.h

class Database
{
virtual Rec* GetRecord()=0;
};

In the second version, we got rid of all the implementation code yet every class that needs Database can still use it and now compile almost instantly.

Here’s another example:

class Logger
{
public:
void WriteLog(char *);
private:
char *logList;
int numLogs;
}

The logger will probably be included in a lot of places. If we were to add a field

int *logTimes;

then, even though the log times have nothing to do with the users of the log class, all those users will have to be recompiled. By using an interface, none of the member variables would be exposed, so adding or deleting member variables won’t cause recompiles of files that include this header.

5. Inside header files, include pointers to other classes rather than the classes themselves

CompileSlow.h

#include "CompositeClass.h"
class MyClass
{
CompositeClass a;
}

CompileFast.h

class CompositeClass;
class MyClass
{
CompositeClass *a;
}

Sorry if my last point is obvious, but it’s the easiest to do so is worth pointing out.

In conclusion, a few minutes of trouble today can save hours over the life of the project, not just for you but every other programmer that has to do builds.

Categories
Uncategorized

Someday…

There will be a day, not today, not tommorow, but at a time when you do not expect when I will come into power. On that day, I will run a publisher. I will bestow glory and ruin on the lives of development teams as well as their owners. I will sign and tear up million dollar deals as another man does toilet paper. And my decisions will be based not on quality of the demos or the solidarity or experience of teams. But on the color of shoes, the performance of my golf game, and if you remembered to bring a pen to sign my forms.

Don’t forget to bring your pen.