The Group 'W' Bench

"I don’t think you should hesitate, Nothing comes to those who wait
Once I heard a saint’s complaint, He said, good things come to those who ain’t"
- John Gorka
This is the official blog of Dustin Aleksiuk. I'm a professional software maker.

26 May

.NET 2.0 Makes Me Feel Good

It's been a long time since I've bothered to write anything here. I had some technical difficulties (my server wasn't tough enough to run the DB and everything else I do, and e-mail/DNS were more important than the blog).

Not that anyone cares.

Anyway, for those of you who haven't gotten all wacky over Ruby, you may or may not have discovered the ConvertAll method on the Generic List class.

I was all proud of myself the other day for using anonymous delegates to loop through a list of something and churn out a list of something else. My coworker, the handsome Eric Liu, pointed out this method to me.

Shout out to my old friend Jim Arnold in jolly olde, who will be sure to find something wrong with this post.

05:47:09 - Dustin - 4 comments

23 May

I've got Mono and it Hurts so Good

So I have a small webapp I wanted to write. It's kind of a simple productivity tool for me. I'm sure I could have downloaded something, but I wanted to play around with some web technologies.

I started out with Ruby. I read some great intro documentation and installed both Ruby and Rails in about 10 minutes. That's on Linux, doing everything from source as is my habit. Both the documentation and the software were pure ease and delight to get going.

So instead of using that, I decided to check out what the Mono project is doing with ASP.NET. Some context: I'm a pretty experienced linux user. I run my own DNS, MySQL server and web server. I've been using UNIX variants for a long time. I build my own kernel about every month of so (blah, blah, blah, etc). It took me about a week and a half (light evening work, mind you) to get mono running ASP.NET pages which grab data from the MySQL database and put it on the screen.

I just kept running into problems. Getting the Mono runtime and and C# compiler going didn't take too long. Getting mod_mono (the Apache module that handles .aspx requests) to not segfault took a couple of hours. Incidentally, this is one of the few times I've taken advantage of open source and put my own debugging messages in the code to solve a problem. That was kind of nice, in the same way Apple users drool about customer care when their stupid computers break due to faulty design. In my defense, the main problem with mod_mono wasn't getting it going, it was getting it to find my own DLLs when the codebehind auto-compiles my aspx.cs at request time (more on that Mono quirk some other time).

The MySql ADO.NET data libraries helpfully (please read the sarcasm) put their documentation in .chm files. That's compressed HTML and is easily readable by Visual Studio. Reading that stuff in Linux would take another evening of faffing about so I didn't bother.

The biggest annoyance for me was the Mono documentation. The online stuff is fine, but I have this weird dark spot on my home wireless network where I sit when my kids are having trouble going to bed. So I tried to build the mono help reader thingy. That was a huge mistake. I lost an entire evening understanding the long and painful history of the gtk-help libraries and why I'm better off using the source as my documentation (which I do now when I'm away from the network).

Anyway, doing C# on linux is a lot of fun. I love C# and .NET, and I love linux so it works out for me. The amount of work that has gone into Mono is amazing and it seems to be really quality work. Part of my problem is probably that I prefer to build everything from source. My Gnome version is 2.10 which is a bit cutting edge and maybe that's why I'm having GTK lib issues. In fact, in retrospect it was easy to get the bare framework going. It was the getting my ASP pages to work the way I wanted that was tricky.

It's kind of funny that mono, as well as being Spanish for monkey, is short for "infectious mononucleosis". That's a nasty infection that makes you really tired for a long time.

Point is, it works now, but it was a bit of a painful process that probably could have been solved by me buying a book rather than relying on Google which is normally enough. I guess this blog entry is a way of getting closure on a number of evenings faffing. I would be happy to help any other poor suckers out there get their own installation going.



20:27:19 - Dustin - 1 comment

06 April

You Are Possibly Very Annoying

Have you ever met someone who is difficult to be around? Maybe this annoying person is angry all the time. Maybe she just goes on and on and on and on about stuff that you just don't care about. Maybe he smells bad.

There's something interesting about this person. This person has NO IDEA that he is annoying to others. Your polite hints aren't working. Social cues are not registering.

Here's the problem: this person walks around all day being annoying, but not knowing he is annoying. You and I walk around all day thinking that we're not annoying too. Other people are crossing the street to avoid having to listen to us prattle on about some nonsense, and we don't know. To us, we are just fine.

You (and I) are possibly very annoying.

It's like having a bit of food on your face. This is especially difficult if you are in a position of authority or respect. Nobody wants to tell the boss she has food on her face. She gets to walk around having food on her face. If I were her, I would want to know.

This is why I'm a believer in company feedback reviews of employees, especially in a company that hires outspoken computer programmers. I want to know if I've got food on my face, because I really can't tell.
08:01:10 - Dustin - 4 comments

23 March

VB.NET ruined my day: Part 2

I wouldn't share this stuff with anyone except that I found out that there are a few people actually interested in it. Thanks to you folks for giving me something to rave about.

Two instances of day ruinedness:

1. VB.NET ruined my day a while go by surprising me with some weird typing behavior. Imagine, if you will, a function that takes a string as a parameter. Imagine that you turn option strict on, because you refuse to be associated with those unwashed VB programmers who have the audacity to leave it off. Turn option explicit on too, because even though you can't remember what it does it sounds like a good idea. Then pass in a character array into that function. It will work.

I know!

I was not amused. A string is different than a char[]. I think it must be a backwards compatibility thing.

2. VB.NET ruined by day yet again recently, and Jim Arnold (my evil nemesis) doesn't believe me about this one, even though I showed it to him in the profiler. We had some code that looked roughly like this:

Dim someString as String = nothing

For index As Integer = 0 to 2500
someString = " trim me "
someString = Trim(someString)
Next

The thing you should be looking at is the Trim method. This is in a .NET module called Strings. It would have been written in VB.NET and provides some VB string functions for those who want them.

Thing is, for some reason, it is SLOOOOOW. Instead of doing that, do this:

Dim someString as String = nothing

For index As Integer = 0 to 2500
someString = " trim me "
someString = someString.Trim()
Next

The first loop took 65% of my .EXE's processing time. The second took 3%. I'm curious why. I decompiled them to try to understand why. The version on the String class does a call to an internal CLR TrimHelper function. The Microsoft.VisualBasic stupid slow version does a bunch of checks and then calls the String version. Not that much different.

I've found the same thing with other Microsoft.Visualbasic String functions like ToUpper. Very slow. The application we're working has a ton of this stuff. Ideally we would just make it better so we don't do so much string processing in loops.

Update: Jim denies being my evil nemesis.

Update again: ok. Jim showed me that my benchmark was stupid. We had reason to believe that it was slower when we came across it in the original code. I need to look at it more because we had cases where that was ALL we changed and we saw a marked improvement over large lists of strings.Anyway, I should have clicked down a few more levels in the profiler execution tree. Don't lose hope though! Stay tuned for MORE exciting (and correct) VB.NET insights.
12:36:52 - Dustin -

04 March

Non-Obvious .NET for n00bz: BindingContext

My way of knowing if something is noteworthy is whether or not my superhardcore .NET programmer coworkers know the answer. If one of them doesn't, then it's worth talking about.

Recently I needed three independent ComboBox instances all displaying the same 3 lists of cities. I made an IList field in my class and loaded it up with the cities. I then set the DataSource property to the IList instance.

The behavior was initially a bit strange to me. When I selected a value in one ComboBox it changed the value in all of them.

The reason is this: there is a BindingContext object which appears to be shared for all objects that inherit from the Control class. It manages a bunch of BindingManagerBase objects.

One way around this is to assign a new BindingContext to the control's BindingContext property:

myCoolComboBox.BindingContext = new BindingContext();


The other way around it is to not use the same datasource for your three comboboxes.

The MSDN says this: "The CurrencyManager is necessary because data sources do not necessarily maintain a current-item pointer. For instance, arrays and ArrayList objects can be data sources, but they do not have a property that returns the current item. To get the current item, use the Current property."

This doesn't make sense to me. I would think that it's up to the control, not the data, to decide which item is current. Data is just data. Perhaps it will become clear, or someone who cares enough to read this can comment.

On a side note, I'm annoyed that SortedList doesn't implement IList, so I can't bind a SortedList to a CombBox. Silly.

ps. Java's for wimps.
15:00:34 - Dustin - 3 comments

03 March

A first look at reading Windows PE files using .NET managed code - Finding out when a File was Compiled

I wanted to learn a bit about Windows PE files because some guy on usenet was asking how to tell when a file was compiled and I thought there whould be a simple solution. PE stands for "Portable Executable" and is the format for both .NET (the headers at least) and standard windows executables. You would think that there would be a standard API making it simple to grab this info, but I couldn't find it.

The first 64 bytes in a PE file is the MS-DOS header. It seems kind of useless except for the last 4 bytes which contain an offset to the "new" header. The struct IMAGE_DOS_HEADER in WINNT.h describes the contents of this first 64 bytes. The other interesting thing about that struct is the first element, e_magic, which when converted to ASCII is the initials of the guy who created this stuff. I imagine he needed to round out the struct to 64 bytes.

Between the IMAGE_DOS_HEADER and the GOOD_STUFF is a BUNCH_OF_CRAP, including the error message you get if you run one of these PEs on 16 bit DOS.

So I wanted the offset to the good stuff in the other header, which is called IMAGE_NT_HEADERS32. I got at that by reading in the raw bytes and grabbing the 60th to 64th byte and putting them into an integer:


byte[] fileData = new byte[2048];

using(Stream fileStream = new FileStream(path, FileMode.Open, FileAccess.Read))
{
fileStream.Read(fileData, 0, 2048);
}

byte byte0 = fileData[OFFSET_TO_e_lfanew];
byte byte1 = fileData[OFFSET_TO_e_lfanew + 1];
byte byte2 = fileData[OFFSET_TO_e_lfanew + 2];
byte byte3 = fileData[OFFSET_TO_e_lfanew + 3];

int offset = ConvertBigEndianBytesToInt(byte0, byte1, byte2, byte3);


I had to write a quick function to switch the byte order and make an int since Intel machines are big endian. The last time I had to care about that stuff was on a little endian machine which is a bit nicer for stuff like this. Here is a great summary of byte orderings and the corresponding religious debate.

Note that I could have done this in unsafe code or in C++ by simply casting those 64 bytes to the IMAGE_DOS_HEADER struct. Since the exercise was to do this without unmanaged code I didn't go that route.

Now that we know what the offset is we can grab the IMAGE_NT_HEADERS32 info. It looks like this:


typedef struct _IMAGE_NT_HEADERS
{
DWORD Signature;
IMAGE_FILE_HEADER FileHeader;
IMAGE_OPTIONAL_HEADER OptionalHeader;
} IMAGE_NT_HEADERS,


The important part is the IMAGE_FILE_HEADER because it has a field called TimeDateStamp which is the compilation date in seconds since midnight of 1970.

You can grab it out like this:

offset += OFFSET_TO_DATESTAMP;

byte0 = fileData[offset];
byte1 = fileData[offset + 1];
byte2 = fileData[offset + 2];
byte3 = fileData[offset + 3];

int secondsSince1970 = ConvertBigEndianBytesToInt(byte0, byte1, byte2, byte3);

DateTime exeCompilationDate = _standardWindowsDateStartPoint.AddSeconds(secondsSince1970


Notepad.exe on this computer was linked on August 17th, 2001 at 8:52pm.

Update: Here's the code and the program if anyone cares. Maybe that usenet guy will go googling. If you ever actually find this stupid little program useful let me know because I would get all warm and happy. The code has Jim's mad skillz code changes too.

Update: A nice fellow named Jeff Atwood tried this code out and blogged about it. Scroll to find his April 14th entry. He discovered that my code always returns the time in GMT, which I didn't notice because I live in England, which at that time of year is GMT (BST right now). He has a fix on his website, which involves adding an offset to the original date. It's too bad I didn't wait a month or two to write that code or I would have noticed that I was an hour off due to BST.
12:49:26 - Dustin - 3 comments

25 February

VB.NET ruined my day: Part 1

I felt like writing a bit about the differences between VB.NET and C#. I used to think that it would be easy to go back and forth between the languages. It still is, for the most part. However there are a number of subtle gotchas that can really ruin your day. I'm flabbergasted, yes flabbergasted, at how different VB.NET is from C#. They really are totally different languages.

My apologies if this is boring, but you .NET programmers who occasionally have to sully your C# purity with the occasional VB.NET stint would be well advised to read on.

I discovered recently, much to my shock and dismay, that Visual Basic .NET rounds the results when you cast a double to an integer. I always assumed that because casting in VB was a compiler keyword there was some kind of CLR standard for casting.

There isn't.

Doing a CInt(myBigFatDouble) in VB.NET is the same as calling Math.Round(myBigFatDouble) on it and then converting it to an int.

I'll show you how smart I am by laying down some IL that you'll probably ignore:


IL_000b: call float64 [mscorlib]System.Math::Round(float64)
IL_0010: conv.ovf.i4


That's from a CInt cast in a VB.NET program. It gets worse though. System.Math.Round always rounds to the NEAREST EVEN NUMBER! So 1.5 rounds to 2, and 2.5 rounds to 2.

So what do you do if you want your CInt to truncate like a reasonable cast should? It's obvious. You use the Microsoft.VisualBasic.Fix function. Pass fix a double and it will spit out a truncated int.

Like all strange VBisms, this one has a historical reason for existing. It's because historically VB was created by a bunch of drunken monkeys.
14:57:20 - Dustin -

11 February

Changing a .NET MDI Form's background colour

While rewriting an app using .NET that was originally in VB6 we come across interesting problems because things you used to do in VB6 are no longer supported.

We needed to change the colour of the MDIParent form because that's how the way they show certain warnings to the user. The problem is that you can't set the background colour of the MDI form. It has no property to do it, and it wants to use the same colour as the Windows system background.

Some Googling found some documentation explaining that there is a "secret" form of type MdiClient which is stored as one of the controls in the main form which acts as the MDI parent. We copied some nasty code which uses Win32 calls to find it. I just noticed right now that my coworker Jim rewrote to make it 100 times better.

So to set the colour of an MDI form, find it's MdiClient and set its BackColor property. Jim's code below, in beautiful VB.NET:


For Each ctrl As Control In Me.Controls
If ctrl.GetType() Is GetType(Windows.Forms.MdiClient) Then
ctrl.BackColor = newColour
Exit For
End If
Next


Simple, but not at all obvious.
16:55:26 - Dustin - 2 comments

08 February

Operation Completed Successfully Exception.

I love .NET. I mean it. It's fun.

I was pairing with Swellsie the other day and we got a sweet exception. It was a System.ComponentModel.Win32Exception and the message was, "Operation Completed Successfully".

It made my day. I love that the system was throwing an exception to tell us that it completed successfully. I'm sure some crusty old Windows programmer knows exactly what it is.

We don't know what caused it. We were working on some code that had been badly generated from Microsoft's VB6 to VB.NET wizard. We rewrote it to be better, and the exception went away.

20:46:22 - Dustin -

21 January

Kenesaw Mountain Landis and distributed projects

I've always thought that if a development team is going get stuff done, they have to be in the same room. Lots of people think this. Nothing new here. Since companies can save money by splitting people up and putting them in far off places with cheap currency (like India and the United States) a lot of work has been done to figure out how to get teams productive when they're scattered all over. We've done work on this at ThoughtWorks, and a guy in Calgary named Frank Maurer studies this stuff too. His team does MASE, which is a tool for organizing distributed projects using agile methods.

Still though, having a team in one place is really the way to go. People generally seem to agree on that. My question then is this: why are the big open source projects so successful? There are big projects, like GNOME, Linux, gcc (and many, many others) which are of an amazing complexity and quality. Why does this work?

Enter Kenesaw Mountain Landis.

Kenesaw Mountain Landis was the Baseball chairman in the US starting in the 1920s. He's the one who got Shoeless Joe kicked out of baseball and took the game back from the mafia. He cleaned things up. The cool thing about Kennesaw, in my opinion, is that when they offered him the job of chairman, he wouldn't take it unless they offered him "absolute power". He was a man of integrity. He knew it, and he wasn't going to waste his time with bureaucracy.

Open source projects seem to have a Kenesaw Mountain landis running the show. I know they tend to get complicated, and I've read some of the funnier scandals on the mailing lists, but there still often tends to be someone who runs the show. With Linux it seems to have been split in to a few different Kenesaws, but the idea is the same.

If Kenesaw likes your patch, it goes in. If not, try again.

Maybe this is a good idea. It's a bit of a change from what we normally do on teams using XP. Frank Maurer, the guy I mention above, once said that one think they KNOW works in software engineering is code reviews. XP depends on this through pairing. If you're not in the same room, get Kenesaw there to make sure your code doesn't suck.

There are lots of reasons why open source works so well. The programmers have passion. They work on smaller teams (side note: I think almost all development teams are at least twice as big as they actually need to be).

Finally, they have Kenesaw Mountain Landis there and he isn't going to take any crap.
09:20:20 - Dustin - 2 comments

12 January

The Great Apple Conspiracy and the Jar of Dirt Theory

I've always been suspicious of Macintosh computers. Back when the Mac Classic was the shiznit it was just too hot for its own good. I remember being all excited about Lode Runner on the PC and then going over to my friends house and seeing some classy animated game which was just better.

Then after a while Macintosh computers began to suck. They hung. They had weird obscure key combinations on boot to help debug issues (probably still do). There were as expensive as a holiday in London. Where was AUTOEXEC.BAT and CONFIG.SYS? Not to mention the embarrassing game selection down at the local software store.

They then moved on to fancy colourful cases, but the OS was still crap. My most vivid memory of Macintosh computers sucking was at a dot-com startup company I worked at. Our designer, who is also a friend of mine, would often have to reboot his computer because it was hanging all the time. Thing was, the power switch didn't work quite right so he would have to get down under the desk with his rear sticking out and unplug the stupid thing. He'd wait a bit, and plug it back in. I looked up to find that rear-end sticking up at me quite often.

My father-in-law is a wonderful man. He's a university professor in Calgary. He has a passion for making the world a better place. He's also been sucked in to the vortex of the Macintosh cult worse than just about anyone I know. Like many Macintosh lovers, he doesn't just use the things, he tries to get everyone else to as well. It's an expensive addiction.

I bring up my father-in-law because like many Mac people, his loyalty hasn't been repaid. One of his 2 G4 powerbooks has a known design flaw. From hours of resting his hands on that great big space between the edge of the computer and the space bar, that originally celebrated super-thin titanium or aluminium or kryptonite or whatever shell pushed into the inner workings and they no longer work. The solution? Buy a new laptop. That laptop was originally purchased for roughly the same amount as my motorcycle. I can't imagine throwing my motorcycle away because a hose was burnt through.

This brings me to my "jar of dirt" theory. I believe that if Apple filled a nice white plastic jar full of dirt (iDirt?), hooked a mouse and keyboard to it, and branded it with a nice big Apple symbol, people would buy it. They wouldn't just buy it, they would get up at 2:30 AM and patiently shiver in line at the new Apple store on Regent Street for it. They would talk about how no other company has such high quality dirt in their jars. They would even believe the hype about it being non-exportable Super-Dirt.

Sure, it's got a UNIX variant under the hood. Sure it's RISC (ooo! Reduced instruction set!). They even look good. Their iLife stuff is pretty cool. We get an amazing DVD with carefully edited home movies of our kids every year from the aforementioned father-in-law. Ok, Garage band is sweet too. Dang.

Now for the thing that REALLY annoys me. I went to Apple.com after chatting with a friend last night (in the evangelical Macintosh war, he would be a General). I saw that new G4 for a super low price.

And I wanted one.
09:12:23 - Dustin - 2 comments

06 January

Consistency is often better than being "right"

So I'm sitting here avoiding household chores and thinking about how I need to eventually get outside and tip over that shopping trolly that's blowing around noisily outside. It's probably seconds away from putting a nice dent in the neighbour's BMW.

Here's my opinion: In software, and possibly other things, consistency is more important then bring "right".

In the milestone book "The Mythical Man Month," the bloke shares a bit of an allegory. Please accept my poor paraphrasing of it. He talks about certain cathedrals which were build over hundreds of years with the help of many different architects. The new architect would come along with his newer and "better" methods and change the design. Apparently you know these cathedrals because they look like crap. You can see the different styles and the conflict between the short-sighted jerks who imposed their design on the existing system, um, cathedral.

I'm talking about architectural changes, not small refactorings.

I believe that consistency is better than being right. It takes a great deal of humility to continue with someone else's existing method. If you are going to make a change think:

  1. Is it really going to be better when I'm done? Could my efforts be better spent refactoring the current design, rather than making a new one?

  2. Do I have time and project budget to see this change all the way though?

  3. Is introducing Ruby/Python/Lisp/ML/My-Pet-Language really such a good idea when I'm the only one who cares about it and I'll be gone in 6 months leaving a long legacy of people swearing at me?

  4. Consider that you have no idea what the long term implications of your decision are. It's a bigger change than you think. Yes it is.


How many times have you gone into a software project and been so much smarter than the people who have started it? If *I* had been there, we wouldn't have done it THAT way, because it's obviously a stupid way to do it.

I know that those of us who love XP jabber on about the concept of courage. I'm saying this: have the courage to continue with an idea that's not as bad as you think.

I have to go get that stupid shopping trolly.
21:37:34 - Dustin -

22 December

Shiny new blog software

Well it looks like I started a blog. I wanted to wait for two things. First, I needed to install the blog software and serve it myself. That set me back a while. I actually about half wrote a blog engine in C++ on Linux but then my fingers got tired and I gave up. Secondly I needed to have something to blog about. I really enjoy technical blogs. I love it when someone learns something cool and then shares it. That's what I hope to do. The stuff I care about right now (in a technical sense) includes Microsoft .NET, agile methods, and the easiest way to make money quickly. I know the last one isn't especially technical.

For those that care, this is running on Nucleus (link on the left) which is written in PHP. It is served on Apache 1.3 on Slackware Linux. The same server hosts some of my DNS, my email and other stuff.

Below is a conversation my brother and I had recently. In it he shares the "double bam" method to financial happiness. I was also trying to set up this stupid blog at the same time.

alexianismo: Oh. Sheesh. I think everyone should give up this whole capitalism thing, forget the industrial revolution, and just have gardens.
dustinaleksiuk: I love it.
dustinaleksiuk: Oh yeah.
dustinaleksiuk: You and I are are going to go back to school and become fund managers.
alexianismo: You don't even like funds! I think my mutual fund has been doing really well recently.
dustinaleksiuk: Not a mutual fund manager. Call it a portfolio or whatever.
alexianismo: And why go back to school? Learn by doing, that's what I say. What's a portfolio manager?
alexianismo: Diversity, diversity, diversity. That's what I tell my clients.
dustinaleksiuk: I think they manage a portfolio of stuff. Bonds, stock, currency. Options! Options!
dustinaleksiuk: Derivatives!
dustinaleksiuk: Try blog.signaleleven.com
dustinaleksiuk: I can't get it to work from here.
alexianismo: Yeah, but for who? Regular people?
dustinaleksiuk: For us.
alexianismo: Oh, so we're just full-time investors?
dustinaleksiuk: We need to have our own investment bank.
dustinaleksiuk: We'll be partners.
dustinaleksiuk: Yes. We have to start small. When we have a few million in the portfolio we can hire some people, get some good trades going.
alexianismo: I'll change my last name to Hisbro so we can be "Aleksiuk & Hisbro"
dustinaleksiuk: Good idea!
alexianismo: OK, I'm in. Buy low, sell high. Cut your losses.
dustinaleksiuk: Aleksiuk and Aleksiuk
dustinaleksiuk: You got it! And hedge.
dustinaleksiuk: You have to hedge.
alexianismo: And maybe we could buy some real estate after we earn some money. A duplex.
dustinaleksiuk: I don't see why property can't be a part of our portfolio. I'm going to specialize in options. What are you going to specialize in?
dustinaleksiuk: My TCPL stock is doing grrreat.
alexianismo: We'll do some research into companies. Wait patiently until the right time, and BAM -- buy it up. Then later, BAM -- sell. It's what I call the double bam method.
alexianismo: I'm going to specialize in eastern philosophy.
alexianismo: And stocks.
dustinaleksiuk: I'm still laughing about the double bam method.
dustinaleksiuk: I'm going to blog about that when I have a blog.
dustinaleksiuk: did you try blog.signaleleven.com yet?
alexianismo: No, don't tell anybody about our secret method!
alexianismo: I'll try it right now.
alexianismo: It's a bit dull.
alexianismo: I'm less than impressed.
alexianismo: What am I supposed to be looking at?
dustinaleksiuk: does it say blog.signaleleven.com?
dustinaleksiuk: It won't even resolve for me.
alexianismo: It does say blog.signaleleven.com.
dustinaleksiuk: ARG! I can't get it to work for me here.
dustinaleksiuk: It works for you and Ade.
alexianismo: Yeah. It's "working" real well. If you're that impressed about your site, I'm not sure we should start this investment thing together.
dustinaleksiuk: I just wanted to know if the DNS was working for you.
dustinaleksiuk: Once I can see that message, I'll put up the blog.
alexianismo: Oh. In that case, I'm still in on the investment thing. BAM!
alexianismo: If it helps, DNS stands for Dynamic Name Server.
dustinaleksiuk: didn't help.

23:56:32 - Dustin - 3 comments