Monday, December 04, 2006

Not so Rational Rose

Apparently Rational Rose changes their file formats between minor versions. Because of this I just had to re-do a large amount of work.

This whole program is a piece of crap. Their UI is terrible, inconsistent, and feels like it was built for Windows 3.1. For example, how do you delete something from a model? The 'delete' key you say? Of course not! You use ^D! Did you make a change you didn't like? Would you like to undo it? Sorry! You can't! Delete the object and then add it again.

Yargh!

Thursday, November 30, 2006

Edgy Eft

Today I set out to install the latest version of Ubuntu, Edgy Eft (6.10). I've been an Ubuntu user since Warty Warthog (4.10) and a long time Debian user before that. I'm continually impressed with how they take the Debian base and polish it so well. I've always told people that Ubuntu "is like Debian with a better package set".

Since Dapper Drake (6.04) Ubuntu has had a new installer. It is more or less just an application that runs inside of a Live CD. The organization and feel of it is very similar to it's text based counterpart. I'm all in favor of a GUI installer but very disappointed with Ubuntu's. This post will detail the downfalls of it.

For the record, here is a summary of the hardware I was installing on:

  • IBM Thinkpad R51

  • 512MB PC2700 RAM

  • Intel Pentium M 1.5GHz CPU

  • Intel Pro Wireless 2200 a/b/g

  • CD-RW/DVD-ROM

  • 40GB Hard Drive

Wednesday, November 22, 2006

Thanksgiving

I've found out from a few people that Thanksgiving in the US is apparently a week long event. An online radio show I listen to is cancelled this week because of it and many others I know are not working this week.

When did Thanksgiving become a week long event?

Monday, November 20, 2006

Edumacation

Off and on for the past year I've been thinking off and on about getting a degree. Dave tells me that I should be in the BSD program and I know a few other people that think I should be at a University working towards a Masters. These thoughts cross my mind almost daily. I flip-flop on the issue for a couple reasons.

Money is the big one. Obvious, I know, but important. I am already indebted to OSAP -- and not a small amount. Every time I think about going another 30 or 40 thousand into debt I cringe. I have some money in an RESP but that is not going to last much longer. OSAP has recently told me that I'm in overpayment, too. I have a feeling I will be getting less and from them as time goes on, I will likely make more in 2007 than in 2006. So far I've avoided becoming the poor student who lives on ramen noodles and mustard sandwiches and I do _not_ want to become one. I also do not want to be paying of student loans until I'm 40.

Time is another big concern for me. By the time I've got my Diploma I will have been in school for 24 months straight. I will need at minimum an additional 4 semesters to get a Degree. This would probably be over the course of 2 full years. To get a Masters there would likely be 2 *more* years. I'm not sure I want to be in school until I'm 25.

I thought there was more reasons than just those two but it looks like that's it. I know I am academically capable of acheiving whatever I set forth to do...but in my head time and money are both really big barriers. I'm trying to gain a more balanced perspective on the situation by talking to people who *have* spent considerable time and money on school. People tell me that graduates with Degrees have a much higher starting salary. Would it be enough to get my loans paid off in a reasonable amount of time? Another advantage of a Degree is that I would probably be able to teach later on in my career if I wanted. Teaching is something I've been thinking about for nearly a year now. I don't think I'd want to do it right away, if at all, but I don't want to block myself from having the opportunity though.

Input, anyone?

Tuesday, November 07, 2006

"It's Frozen" -- The Story of My Day

I just went for my break to grab dinner.

First I wanted a veggie burger -- 20 minute delay because they are all frozen.
Then I wanted a pita with hummus -- the hummus was frozen!

Who the hell shuts down their kitchen at 5pm.
*grumble grumble*

Monday, November 06, 2006

FSOSS 2006 -- Now with more freedom!

I've just finished converting all of the video and audio from the Seneca Free Software and Open Source Symposium to Ogg Theora and Ogg Vorbis respectively. They are in the process of being mirrored right now. Check this page in a day or two to download them.

Friday, November 03, 2006

More Unit Testing


bhearsum@wesley:~/projects/mozilla/buildbot/buildbot-bonsai/buildbot/test$ trial test_bonsaipoller.py

Ran 9 tests in 0.061s

PASSED (successes=9)


So I've finished my first set of test cases, rejoice!

When I started writing them I thought it would be really easy, I didn't expect to spend more than a few hours on them. Boy, was I wrong. It's been over a week since I started and I probably spent 8 to 10 hours total on a 181 line file. I received help and advice along the way from Rob Helmer for which I am much appreciative.

Problems I encountered

  • My original code was more or less untestable

  • Python regular expressions were confusing

  • My original code used a mixture of exception and return values for error reporting

  • Comparing two objects by their data, _not_ their references



Very quickly I decided to do rewrite of the BonsaiPoller module. It was untestable, confusing, and just plain ugly. I had been planning to do a rewrite becausue of the ugliness alone, so it wasn't hard to reach this decision. This also gave me a chance to attempt some test-driven development. I was looking at _some_ of the old code while writing the test cases but by the end the BonsaiPoller and BonsaiParser worked quite a little differently internally. For reasons of simplicity I decided to keep the interface the same.

I found much of the test case writing very tedious. Just inputing all the data I needed was a chore. I thought it might be easier to input one "good" piece of data and base all of the broken ones off of it. This worked well enough while using the replace() method to do simple substituition but as soon as I needed regular expressions I was in a world of hurt. For some reason the Python developers seem to have decided that they don't want regular expressions as a built-in part of the language. For the life of me I don't know why. I was stuck carrying around a 're' (regular expression) object for most of the regular expressions I used. Compared to how they work in Perl it's a complete pain in the ass. Observe:
Python:

import re

data = "<blah><ci><f></f></ci></blah>"
myre = re.compile("<ci.*></ci.*>", re.DOTALL, re.MULTILINE)
newdata = re.sub(myre, "", data)

Perl:

$data = "<blah><ci><f></f></ci></blah>"
($newdata = $data) =~ s/<ci.*><\/ci>//;


Not such a big deal when doing one or two, like I was, but if you're doing heavy text parsing this would be an ugly nighmare.

In my original code I used a lot of 'return True' and 'return False' to indicate when there was no more data. Seeing as python is object oriented and throws lots of exceptions I wanted to be consistent. This made much of my code a _lot_ cleaner and it has a nicer "feel" to it. There's one part I'm still not happy with though.
Here's the code when I was using True/False:

data = BonsaiResult()
while self._nextCiNode():
ci = CiNode()
ci.log = self._getLog()
ci.who = self._getWho()
ci.date = self._getDate()
while self._nextFileNode():
fn = FileNode()
fn.revision = self._getRevision()
fn.filename = self._getFilename()
ci.files.append(fn)

data.nodes.append(ci)

return data

And with exceptions:

nodes = []
try:
while self._nextCiNode():
files = []
try:
while self._nextFileNode():
files.append(FileNode(self._getRevision(),
self._getFilename()))
except NoMoreFileNodes:
pass
except InvalidResultError:
raise
nodes.append(CiNode(self._getLog(), self._getWho(),
self._getDate(), files))

except NoMoreCiNodes:
pass
except InvalidResultError, EmptyResult:
raise

return BonsaiResult(nodes)


I tried to think of a way to use exceptions cleanly with while loops but drew blanks. If anyone can think of a way to improve the above code please let me know! The function works fine, however, so I shouldn't worry so much.

The last problem I ran into was comparison of my BonsaiResult objects. I didn't have this problem before writing the test cases because there was no point where I needed to compare them! This part wasn't too difficult once I figured out what I had to do -- but that took awhile. I was considering pulling the __cmp__() method before creating a diff but I don't think it hurts to leave it in.

Overall I am very pleased with my test cases and new BonsaiPoller module. As soon as I get the energy I will be submitting it to Brian.

Saturday, October 28, 2006

Firefox Party - A Smashing Success

As part of Club Moz at Seneca I was involved with running our Firefox 2.0 Launch Party after the FSOSS last night. After some bribery with stickers and t-shirts (thanks Asa!) and the promises of pop and chips we managed to drag quite a few people in. There was music, chit-chat, and some pictures taken. El Presidente, gave a quick speech thanking everyone for showing up. Given the short amount of time we had to plan this event I think it went very well. There's a lot we can do to make the next ones better and I've gotten some ideas from reading other blogs. So, you ain't seen nothing yet!

So thanks to everyone that helped out: Tom, Liz, Vanessa, Phil, Moe, Dave, Asa, Andrei, Seneca Student Federation, and of course John, for giving us the Club Moz idea in the first place.

Thank you to Mike Shaver and David Humphrey for telling me what a success the party was -- it was good to hear someone else thought so!

Tuesday, October 17, 2006

Update: Wireless Connection

So it seems I may have been to hasty in blaming the schols network for my wireless network issues. I started using wireless at home to see if the problem would happen there -- and it did. There's nothing more annoying than watching a movie and all of a sudden having it stop playing. Not being able to slack off at school is one thing, but this is a whole other issue.

I grep'ed through my logs and found all sorts of this stuff:

Oct 15 00:00:37 wesley dhclient: DHCPREQUEST on eth1 to 192.168.0.1 port 67
Oct 15 00:00:38 wesley dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 11
Oct 15 00:00:38 wesley dhclient: send_packet: Network is down
Oct 15 00:00:49 wesley dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 12
Oct 15 00:00:49 wesley dhclient: send_packet: Network is down
Oct 15 00:00:52 wesley dhclient: DHCPREQUEST on eth1 to 192.168.0.1 port 67
Oct 15 00:01:01 wesley dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 18
Oct 15 00:01:01 wesley dhclient: send_packet: Network is down
Oct 15 00:01:04 wesley dhclient: DHCPREQUEST on eth1 to 192.168.0.1 port 67
Oct 15 00:01:19 wesley dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 11
Oct 15 00:01:19 wesley dhclient: send_packet: Network is down
Oct 15 00:01:22 wesley dhclient: DHCPREQUEST on eth1 to 192.168.0.1 port 67
Oct 15 00:01:30 wesley dhclient: DHCPDISCOVER on eth0 to 255.255.255.255 port 67 interval 2
Oct 15 00:01:30 wesley dhclient: send_packet: Network is down
Oct 15 00:01:30 wesley dhclient: DHCPREQUEST on eth1 to 192.168.0.1 port 67


The times on that correspond *exactly* to when I was booted offline. 'dhclient' is the default dhcp client in Ubuntu Dapper. However I prefer 'pump', it's something I always install after a re-format. It seems that my manually usage of pump doesn't work so well with Ubuntu's automagic dhcp stuff'n'crap. I guess the two daemons fight for who will hold control over the lease -- I'm not sure. In any case, after doing an apt-get remove dhcp3-client the problem was solved! No more wireless issues, yey!

Now...if I could only get something to automatically login to bluesocket for me I would be even happier

Thursday, October 12, 2006

The little connection that couldn't.

The wireless internet at my school sucks. Since the start of the Fall semester is has been barely usable. My connection is dropped every 2 to 10 minutes. I've upgraded the drivers for my wireless card -- didn't help at all. It happens all over the damn school but not *all* the time.

It's hard to say exactly what it is. Between the summer and fall semesters I upgraded to Ubuntu Dapper, but I don't think that would cause these problems. Especially since I'm running a custom kernel and the latest drivers. Tom has similar issues. I think it's just the access points being overloaded with traffic.

It's really frustrating though, and defeats the purpose of having wireless access.

New Buildbot Patch

I've submitted my latest patch for the Buildbot. This one adds support for per-build comments akin to the Tinderbox feature.

This patch was a lot tougher than the previous ones. I went through implementation of a couple different ideas before I found a way that worked and wasn't an ugly hack. Right before creating the final diff I ended up not including my "user javascript" support. When I look at the patch now it has absolutely no code from my first attempt in it. I've read that this is often the case but I've never experienced it until now. Working on the Buildbot has really proved to me the need for some design before implementation. During my first two revisions of this patch I *did* do some design but I skimped out after getting the general idea and ended up tossing all of that code out.

Working with C++ for the past 8 months really turned me off of OOP, or so I thought. Working with the Buildbot has been a good experience for me. It's a mid-sized project, very highly designed, and very well implemented (at least from what I can tell). It has shown me that OOP doesn't have to suck, and that not all OOP languages suck.

Friday, October 06, 2006

On unit testing

I've been hacking on the Buildbot for a month or so now. I've released two patches for it, a Bonsai Poller and a Tinderbox Mail Notifier. I noticed recently that Buildbot has a lot of test cases in it's tree. I've heard the phrases "unit test" and "test case" before but I didn't know what they were until today. My patches are more or less complete and have been tested but I still think it would be nice to have test cases for them. The buildbot tree will change, bonsai and tinderbox may change, and this should be a relatively simple way to get me introduced to the concept of unit testing.

I spent an hour this afternoon reading Buildbot test cases and other unit testing documents. The Buildbot uses Twisted's unit testing framework for it's tests. I found the docs for those here. This went into the specifics of writing test cases with Twisted but after reading it I still didn't feel comfortable with the concept. There was a link to Dive Into Python on the Twisted page. This is an excellent read for anyone new to unit testing. It goes from no source to test case to working code.

I've done much of what is involved in making a test case without actually making a test case. One of the key things I like about unit testing is that it defines your API. I was chatting about this in #seneca and shaver said "that also has the nice effect of keeping you honest about what you really _need_". This is a very good thing for someone like me! I went through 3 or 4 revisions of my BonsaiPoller classes before coming to the final version. I don't think this is necessarily a bad thing but I know this happened because I didn't think enough about what it should look like before attempting to implement it. Before writing the final revision I actually wrote a script that defined how I was going to use the class. Looking back on it, that was a rudimentary test case. It wasn't well organized, it wasn't testing small pieces at a time, but from a design standpoint it accomplished the same thing.

I see lots of similarities to unit testing and things I've encountered in my classes. We often get "test mains" from professors to test our assignments before handing them in. These are often in the form of small tests to every part of our classes. In my systems course we just finished doing Scenarios. To me, a scenario seems like a test case for use case description. There is obvious differences but while a test case tests the validity of code, a scenario tests the validity of a use case description.

Unit testing is very interesting! I plan to adopt it whenever I can. I expect that I will go from idea to working code quicker if I do it right.

Thursday, October 05, 2006

More fun.

I just spent hours and hours trying to figure out why my RDP client couldn't connect to a Windows 2003 server that I setup. It's behind a NAT and port forwarded so maybe that was the problem?

Nope.

The encryption level was set too high. When I created the RDP service I must have used the 'FIPS Compliant' encryption level, which isn't supported by my client. Changing it down to "low" fixed it.

Wednesday, October 04, 2006

VMware, oh VMware.

Due to certain circumstances I've been attempting to forward ports from a NATed machine to a guest VM on that machine. What a hellacious experience.

The setup is as follows:


Router <-> VM host <-> VM guest
142.x.x.x 10.5.1.10 192.168.87.5
192.168.87.1




Normally I would use bridged mode with VMware but the DHCP server on our subnet will only hand out one IP per port, as far as I can tell. So NAT it is! This means that the VM guest OS is behind 2 levels of NAT, how ugly.

The goal here is to give ssh access to the VM guest. The VM host has a few ports forwarded to it, 5900 for example. This is what I'd like to do:



Router <-> VM host <-> VM guest
142.x.x.x:10900 -> 10.5.1.10:5900 -> 192.168.87.5:22



Very ugly, but that in and of itself should work. Should work, but it didn't. I was at a loss at this point. Luckily, I have a friend who works debugging network issues. We obtained network traces (dumps of all packets going through an interface) from the VM guest and VM host, and took a look at them. The first thing he noticed was a fishy MAC address. I checked the MAC of the VM host's eth0 and vmnet8 AND the MAC of the VM guest's eth0. Neither of them matched.

We tried again, but this time checked the ARP cache. AHA! There's the mysterious MAC address. It belongs to....192.168.87.2? What the hell is that? The VM host is 192.168.87.1 and the VM guest is 192.168.87.5. It's pingable, so it has to be _somewhere_. My buddy suggested checking the default gateway of the VM guest. Voila! 192.168.87.2.

The best we can determine VMware has some sort of internal router when using NAT mode. It's definently not accessible or configurable.

Nonetheless, a workaround was proposed. Simply changing the gateway from 192.168.87.2 (the internal VMware thingy) to 192.168.87.1 (the VM host) will get rid of that weird MAC. I did that.....and I could ssh to the VM guest! Hooray! But....I can't intiate any connections from the guest.

I originally thought that the NAT was done by the VM host. Now it seems more likely that it is done by the internal, non-configurable VMware NIC. If I actually setup a NAT between 10.5.1.0/24 and 192.168.87.0/24 I *think* it would work...but that's overkill for a temporary solution.

I decided to switch back to bridged mode and set the VM guest IP statically. This works fine for getting on the network and the Internet. I should be able to get the Powers in Charge to forward ports to them.

So what did I learn from all of this?
  • Network traces are very useful.
  • VMware NAT mode should only be used as a LAST resort.
  • Politics suck.

Monday, October 02, 2006

Frist Post!

I have a blog now. I may or may not continue to post.