header image
 

Off to China

After a long hiatus, I have some free time to post. Finally. :-)

My life seems to be in turbo mode recently. I’m not sure if it’s a good thing or a bad thing, but I’ve quickly become responsible for a large portion of the imager code in MEDL. It’s interesting, challenging, and enjoyable work, but time intensive. Everything is under heavy development, and the hardware and the OS are constantly changing. Both the team writing the Openmax components I’m interfacing with, as well as the camera application team who is using MEDL extensively, are located in Beijing, which further complicates things. Conference calls have to be done either early in the morning or late at night, and there is often a day long turnaround time between sending an email and getting a response. At the start of the month, I was integrating a large restructuring of the imager code base, composed of thousands upon thousands of lines of code, and the delay between sending an email and receiving a response combined with the terrible quality of the conference call system overseas made important discussions with the Beijing teams nearly impossible. On a Thursday I mentioned, half jokingly, to my boss that “It would be much easier to get my changes integrated if I could talk to the Beijing teams face to face.” The next Tuesday morning, I was on a flight to Beijing.

Beijing is an interesting city. It’s much more modern than I expected, and much more vibrant. It’s also growing at an incredible rate, probably too quickly for its own good. There are buildings going up everywhere, and for a three day period the smog was so bad it was difficult to see further than a few hundred meters. Still, the whole trip turned out to be quite fun and surprisingly productive. The Beijing engineers were exceptionally friendly to a crazy capitalist foreigner like me. The lunches and dinners were especially enjoyable. Despite their limited English, and my nonexistent Mandarin, we managed to have a great time. I’d love to post a detailed log of every day I spent in Beijing, but it’s the first day of my vacation, and I fly home to Boise tomorrow. Maybe I’ll post an update later. Without further ado, some pictures:

Walking towards Motorola:
Walking towards Motorola Beijing

Motorola Beijing, right next to HP:
Motorola Beijing

Friendly locals visiting people in the “Happy Times” van:
guards

I had a weekend free, and did some touristy things, like the forbidden city:
Forbidden City

And of course, the great wall:
Great Wall

Now, off to make a pot of coffee, and get my life in order before leaving town again. :)

Life in Libertyville

Well, it’s been six weeks since I moved up to Libertyville and started at Motorola. The time has absolutely flown by, which may or may not be a good thing. I never quite understood how big a chunk of time a real job takes out of your day. On the weekdays I have to rush just to get dinner made and hit the gym before I get to bed. Weekends are fun, but I spend a lot of time getting errands done that I don’t have time to do during the week. Oddly enough, I don’t mind that much. Working at Motorola is turning out to be a lot more interesting than I imagined. Although sometimes I do have to spend the entire day getting a meeting set up and tracking down the people I need to attend, or a day reading through boring, dry technical documents, and end up going home drained and exhausted, most days I get to hack away at interesting problems and engage in lively technical “discussions” (more of friendly arguments really) among my coworkers, and go home inspired and full of energy. The project I’m working on, MEDL, is incredibly well designed, and a pleasure to code for. It’s also being developed primarily for the next-gen Linux phones, so I get to work with Linux. I really am a nerd at heart. I love this stuff. The fact I get paid for it is nice too.

Outside of work I’ve become something of a fitness geek. I always have been, even through college (well, somewhat…), but now that I have the money to spend to really concentrate on my fitness and health, I’m doing so. Although I’m not really a complete health food nut, the majority of the food I eat now is organic, and all of it is fresh. I haven’t touched the microwave in a month (cue shocked gasps from my two college flatmates).

The only real downside to being here, and it is really is a pretty serious downside, is that Libertyville is an awfully boring place. It’s like suburb hell. Everything is in a strip mall. Hell, my gym looks like it should be a Bestbuy. Although I ordered a bike (not coming until the middle of September, sadly), there’s not much in the way of hills in Libertyville. It’s flat, flat, flat, as far as the eye can see. A mountain bike would be useless here. I decided against a pure road bike as well, due to the fact I plan on putting panniers on, carrying gear, and going for longer trips on my time off.

The bike I ordered:
New bike

There are some fairly decent places to ride, even if changing gears isn’t necessary for 5 miles at a time, and I plan to explore as much as possible before winter hits. Still, I’m not staying in Libertyville longer than a couple of years. Motorola is turning out great, and so far I’m working enough that I don’t really have the time to be bothered by the fact I live in suburbia, but I don’t want to settle down here. If I can get a position within Motorola somewhere out west, that would be ideal. If not, the experience from working at Motorola should be a great help in finding a decent job located someplace I really want to be.

Where I work (I didn’t take this picture, hence the random guy walking in):
Workplace

The office is seperated from the main Motorola campus by a couple hundred meters, and houses just the Multimedia and Application Framework teams. After visiting the main campus a couple of times to get paperwork filled out, I’m glad for the seperation. It’s not as hectic, and everyone seems more relaxed. Oh yeah, and the projects are cooler too. ;)

8:00 AM - 6:00 PM

It’s been a while since my last post. Since graduation I’ve biked through the northern part of France, driven from Boise to Libertyville, and started my job at Motorola. I’m hoping to post more about everything in the next day or two. In summary, spending two weeks in France was wonderful, driving the ~1900 miles to Libertyville was actually a lot more fun than it sounds, and having a full time job has a way of eating up your free time. I’m currently working on the next-gen multimedia engine for the Linux Java platform at Motorola, which will eventually power all of their phones. Lots of C/C++ coding, lots of Solaris, lots of Vim, lots of Linux, but also a lot of hours. Having money to spend and a kitchen I can cook in without fear of picking up some sort of rare disease helps make up for the hours I spend at work. :)

Biking through France:

From coast:
Coast

Through the center:
Center

To coast:
Coast

And back!:
Coast

I’m done…

I just received my grades for spring quarter, and it seems I managed to pass all of my classes with room to spare, thermodynamics included, which means I am really, truly done with my undergraduate education. It’s amazing to me how quickly college has gone by. It really does seem like just yesterday that I was staring out the window of my tiny room in Foster Walker complex, wondering what my first day of classes would be like. I still don’t quite believe that I won’t be attending classes next year. I never thought I would be unhappy about the possibility of not having any more classes here, but I felt a sharp pang of regret when I walked out of Tech L158 last Wednesday knowing that it was the likely the last time I’d ever feverishly switch between a calculator, pencil, and book, writing calculations down even as the professor took the blue book from my hand.

The way things are working out now, after graduation my family and I are going to spend two weeks in France on a bike trip. I’m hoping it will give me a little bit of time to relax. My life recently seems to have been speeding by entirely too fast. After France, and a short trip back home to Boise, I’m headed up to Libertyville, and off to Motorola to start my job as a software engineer for the multimedia team of the mobile devices wing. Exciting work, great money and benefits, family close by, and the apartment I have in Libertyville is an absolutely beautiful one bedroom in an old remodeled hotel, but I don’t know whether I’ll ever really be able to call Libertyville ‘home’. I guess we’ll see. Currently my plan is to work at Motorola for five years, then reevaluate and travel for a while with my parents and sister. Eventually I want to move back west, hopefully to the coast, then maybe start some dorky open source software company. :)

On a random note, I saw an absolutely huge spider walking across the wall a few days ago, and I grabbed a photo of it:

Spider! Yar!

Yeah!

The optimist!

I thinks this qualifies for the daily wtf…

The encrypted hard drive project I was working on last quarter for my ECE 347 class is continuing into this quarter, as the other group member and I ran into some last minute issues with the hard drive (turned out to be a loose SATA cable) which prevented us from finishing the code. We were running into a huge number of bugs with my groupmate’s code, and when the hard drive disappeared from the system we called it a night. The other group member, who shall remain nameless, left Northwestern this quarter (no, it wasn’t Kurt ;)), and so I’m continuing the project on my own. As such, it was necessary for me to start modifying his portion of the code written for the project.

It is far and away the worse code I have ever seen. Every couple of lines, I find what seems to be a snippet of code specifically designed to win the “daily wtf of the year award.” After reading through the first page or two of some of his code, I decided to rewrite everything from scratch. I’m usually the type to try to keep as much code as possible, so I’m valiantly trying to incorporate as much of his code as possible, but there’s not anything salvageable in this mess.

The guy who wrote the code I’m rewriting was an interesting fellow. He certainly seemed bright. My suspicion that he wasn’t the sharpest knife in the drawer began after I pointed him towards a couple of papers to read for a (unrelated to the hard drive encryption project) mixed-mode placement algorithm we were working on. After a couple of days, he approached me and said he had spent “hours reading them” and that he knew enough to be comfortable starting to develop an algorithm. At this point, I was very impressed. I had read the papers quite a few times, and still didn’t quite know which methods I wanted to incorporate into our algorithm. I started into a technical discussion of my initial ideas, and he seemed to listen to and understand what I was saying. I was hoping that he would be able to provide some feedback on my ideas, indicate any obvious errors I was making, and maybe put forward some of his ideas. No such luck. His responses to my questions for feedback were limited to “That sounds good…”, “Should be fine…”, and “Yeah, just do that…” No problem, I thought, he’s just a bit timid, and doesn’t want to completely smash my silly ideas. I decided to get him to be a little more forthcoming by asking him to give me a quick rundown of what impressions he got from the different papers.

Utter. Disaster.

Although he had “read the papers for hours”, not only did he not understand the content of the papers, he did not understand the mixed-mode placement problem itself. As we had been working on this project for weeks, I was more than slightly dismayed. How could he have felt okay working on the project without understanding the problem we were trying to solve? Eventually, I ended up sitting down with him and developing an algorithm (a quite decent one too, I might add). At each step, I explained what I was doing, and asked for any feedback, criticism, or other ideas. All I got was blank stares. I did the writeup on the final algorithm, and sent it to him with an explanation of areas I’d like expanded on, in a last ditch effort to get him to contribute something. He replaced a few instances of the phrase “high quality solution” with “rather good answer”, added a diagram (an incorrect one), and sent it in. Although he sent in what was essentially a partially incorrect version of my first draft (without consulting me), we received an A on the project, which was a pleasant surprise. Despite the good grade, his complete lack of participation (in fact, his harmful participation) caused me to worry about his performance on his part of the encrypted hard drive project, with good reason as it turned out.

I wish I could post all of the code from the project here, but it would be an absolute chore to read. He seems to have an uncanny knack for introducing complexity where an obvious, concise solution exists. One of the simpler examples (there are much, much worse examples, but they are far too long to post here) of this is in his function to check whether the usb key is inserted or not.

He wrote the following:
checkusbkeyin = "sh usbtest.sh"
line1 = int(0)
while line1 != int(1):
# wait one second before trying again
# don't even think of taking this out to gain speed; benchmarking it without makes it up to 1 second faster but adds constant requests
time.sleep(1)
if line1 != int(1):
# Puts "1" in the file /mnt/usbkeyin if usbkey inserted and "0" if not
os.system(checkusbkeyin)
f = open("/mnt/usbkeyin")
line1 = int(f.readline())
f.close()

Which calls this shell script to generate the file queried by the python script:
if ! mount /mnt/usbdisk 2>/dev/null; then
echo "0" > /mnt/usbkeyin
else
echo "1" > /mnt/usbkeyin
fi

Here was my replacement:
mountkey = "mount /mnt/usbdisk"
# Now wait for key insertion
keyin = False
while keyin != True:
# Check for key
if os.system(mountkey) == 0:
keyin = True
# Don't want constant mount requests
time.sleep(0.1)

One of the first frightening sections I came across was his “unique” method of generating text output. Using Python like this should be a criminal offense. This guy really, really likes copy and paste coding:

Pregenerated output (Why? Who knows? There were 30 lines of this):
password00char = "/bin/lcd 2 ''"
password01char = "/bin/lcd 2 '*'"
password02char = "/bin/lcd 2 '**'"
password03char = "/bin/lcd 2 '***'"
password04char = "/bin/lcd 2 '****'"
password05char = "/bin/lcd 2 '*****'"
password06char = "/bin/lcd 2 '******'"
...continues...

The actual display output:
# do the star display
dispstar = keycounter % 15
if dispstar == 0 and keycounter > 0:
os.system(cpassword01char)
elif dispstar == 0:
os.system(password00char)
elif dispstar == 1 and keycounter > 1:
os.system(cpassword02char)
elif dispstar == 1:
os.system(password01char)
elif dispstar == 2 and keycounter > 2:
os.system(cpassword03char)
elif dispstar == 2:
os.system(password02char)
elif dispstar == 3 and keycounter > 3:
os.system(cpassword04char)
elif dispstar == 3:
os.system(password03char)
elif dispstar == 4 and keycounter > 4:
os.system(cpassword05char)
elif dispstar == 4:
os.system(password04char)
elif dispstar == 5 and keycounter > 5:
os.system(cpassword06char)
elif dispstar == 5:
os.system(password05char)
elif dispstar == 6 and keycounter > 6:
os.system(cpassword07char)
elif dispstar == 6:
...continues...

His ability to mangle code extends beyond Python however. I checked some of the C code he wrote, and was appalled at some of the errors I found. Again, there are far too many to post here, but here’s a very simple example:
char tty[9];
strcpy(tty, "/dev/ttyS0");

I can only assume he doesn’t understand C’s null termination of strings, and also doesn’t understand that, while arrays do start from 0, allocating an array of size 9 does exactly that, ie: indices 0 through 8 in the array are valid. He’s putting 11 characters into an array which can fit 9. Nearly every line of his code has bugs like this. I’m petrified that I’ll see his name as a contributor for an open source project.

In addition to this, the actual authentication method he used for the usb key doesn’t actually check the the usb key at all. Since he decided to store the keyfile on the hard drive itself, you can insert any old usb key and it will work just fine. His menu code is structured such that the smallest bug in any subsystem of the entire device will cause a complete meltdown. In fact, when we were about to present the rather nifty menu system we managed to complete to our professor when he insisted on making “a few quick changes.” I advised him to not touch anything, but he went ahead and “fixed up” some of the code. By the time our professor showed up, nothing was working. He just shrugged, and told our professor to write him a check for the money he spent in parts (including the $80 for the LCD screen he shorted out, and its replacement which he nearly destroyed before I had a chance to mount it).

He has since ceased responding to email, which could have been a problem, as he set a BIOS password for some reason. Luckily, clearing the CMOS also cleared the password, allowing me access to the BIOS setup. I worked on the new code a bit today, and it’s coming together quite nicely. It’s functional, fast, and a bug in one section won’t cause any problems outside of it’s own little area of functionality. I plan on posting the code, and pictures of the actual encrypted hard drive (taken with my new camera), when it’s completed.

The usual random notes:

  • I’m taking a “human computer interaction” course this quarter, which I’m looking forward to. Since it’s likely I’ll be doing some multimedia GUI development, it’ll be good to have some UI design experience.
  • I’m also taking a VHDL class, and the professor is great. Should be a lot of fun, and quite useful.
  • Suse 10.0 is still running strong, with 61 days of uptime now, and 30638 remote SSH attempts.
  • Why the sudden departure from NU, Kurt? Any specific reason for leaving?
  • I am now running Wordpress 2.0. Amazingly easy upgrade. Took about 10 minutes.
  • The weather here is awful.

Merry Christmas!

Dinner is finally over and all the guests have cleared out, so I figured I’d take a few minutes to post, and hopefully get back in the “post fairly often, even if it’s entirely random” groove. Our family had a very relaxed Christmas this year, with very few gifts. None of us could think of anything to ask for, since we don’t really need/want anything, which is a very nice feeling.

Despite the fact that nobody asked for/bought very much, my dad made surprised me with a new digital camera (nothing better than a cool gift you didn’t expect :D), in the hopes I would get some photos of places and people at Northwestern before I graduate, so if you see me snap a picture, just ignore it. Photos usually aren’t my thing, but it’ll be nice to show them to my family, and I figure I will probably completely forget most of the places I frequent 10 years from now unless I have visual documentation, and it’s probably a good idea to start now.

The actual camera is a Pentax Optio S45, which definitely isn’t designed for professional use, but is just about perfect for what I’m going to use it for (snapshots of places/people). It’s small, compact, and has quite good image quality plus all the features I anticipate needing. Although there’s no viewfinder, the large LCD screen ensures it’s still possible to compose decent shots, and it makes it easier to snap photos on the fly. While I’ve been away my dad seems to have actually gained a decent amount of technical competence. Seems he actually listened to the responses I would give to his rather random computer/gadget questions. Who knew?

Here’s the camera itself:

Camera Front
Camera Back

The rest of my gifts consisted of clothing, money, and the usual odds and ends that my family likes to exchange. I think my favorite gift (other than the camera, obviously) is a paper card from my sister for “Fashion Advice”. I’m not quite sure what to make of that one.

We hosted Christmas dinner at our house, and I got to see some people I haven’t seen in way too long. Long story short, a grand time was had by all. There’s much more I could ramble on about, but I’m bored of typing, and I have a book I want to finish. Merry Christmas.

Oh, random notes:

  • I received my team assignment for Motorola. I’m on the Multimedia team. I’ll probably expand on this later, but in short, I’ll be working on the audio/video functionality of Motorola cell phones. Very neat stuff. :)
  • Theme is slightly updated, should look almost identical, but function a tad better.
  • Up to 28087 ssh login attempts. The sad part is, I’m getting more attempts. People, choose good passwords.
  • Uptime: 1:49am up 51 days 5:54, 4 users, load average: 2.37, 1.46, 1.16.
  • Suse 10.0 is turning out to be pretty much rock solid after I upgraded the kernel to 2.6.14. Very impressed.

“Intelligent” Design…

I’ve been following the recent intelligent design trial in Dover fairly closely, as it’s an issue I feel particularly strongly about. I have no problem with someone being religious, I can deal with people believing in crackpot ideas like intelligent design, young Earth creationism, or the healing power of crystals, but it scares me that such an obviously fallacious idea as intelligent design is even being considered as appropriate for inclusion in science classes. Thankfully, the judge in the case, Judge John Jones, saw past the numerous lies and falsifications the intelligent design supporters put forward, and issued an excellent ruling (available here) which was both comprehensive, fair, and extremely well thought out. I was not worried about the outcome of the case, but I was expecting a limp ruling which would be a light slap on the hand to intelligent design. This ruling is a complete smackdown, and has exceeded all of my expectations. If you have time, I recommend reading it through. It’s both interesting and very insightful.

One of the constant factors during the trial was the willingness of the intelligent design supporters to lie, falsify information, and completely ignore any evidence which conflicted with their “research”. I would have thought things had changed since the days of Tennessee vs. John Scopes, but evidently they haven’t. It amazes me that they claim moral superiority, and yet continually resort to such low, deceitful tactics. I hope this is not become the norm in the fundamentalist religious community. The intelligent design supporters’ behavior on the stand is, in my opinion, not a result of pure malice, but caused by a desperate attempt to cling to beliefs they know to be false . They support what they want to believe, not what the overwhelming majority of available data points to. They have mastered the art of deception, both of themselves and others. If they truly wish to be considered seriously, they need to argue their point logically and truthfully, while also presenting their findings and theories to the scientific community for peer review. I get the feeling the following is all too true:

Evolution cartoon

In this vein, a couple of quotes from the ruling struck me as particularly interesting:

The citizens of the Dover area were poorly served by the members of the Board who voted for the ID Policy. It is ironic that several of these individuals, who so staunchly and proudly touted their religious convictions in public, would time and again lie to cover their tracks and disguise the real purpose behind the ID Policy.

Plaintiffs’ science experts, Drs. Miller and Padian, clearly explained how ID proponents generally and Pandas specifically, distort and misrepresent scientific knowledge in making their anti-evolution argument.

The immune system is the third system to which Professor Behe has applied the definition of irreducible complexity. Although in Darwin’s Black Box, Professor Behe wrote that not only were there no natural explanations for the immune system at the time, but that natural explanations were impossible regarding its origin. (P-647 at 139; 2:26-27 (Miller)). However, Dr. Miller presented peer-reviewed studies refuting Professor Behe’s claim that the immune system was irreducibly complex. Between 1996 and 2002, various studies confirmed each element of the evolutionary hypothesis explaining the origin of the immune system. (2:31 (Miller)). In fact, on cross-examination, Professor Behe was questioned concerning his 1996 claim that science would never find an evolutionary explanation for the immune system. He was presented with fiftyeight peer-reviewed publications, nine books, and several immunology textbook chapters about the evolution of the immune system; however, he simply insisted that this was still not sufficient evidence of evolution, and that it was not “good enough.” (23:19 (Behe).

The one [one!] article referenced by both Professors Behe and Minnich as supporting ID is an article written by Behe and Snoke entitled “Simulating evolution by gene duplication of protein features that require multiple amino acid residues.” (P-721). A review of the article indicates that it does not mention either irreducible complexity or ID. In fact, Professor Behe admitted that the study which forms the basis for the article did not rule out many known evolutionary mechanisms and that the research actually might support evolutionary pathways if a biologically realistic population size were used.

Some other, more general quotes from the decision:

In addition, Professor Behe agreed that for the design of human artifacts, we know the designer and its attributes and we have a baseline for human design that does not exist for design of biological systems. Professor Behe’s only response to these seemingly insurmountable points of disanalogy was that the inference still works in science fiction movies.

To be sure, Darwin’s theory of evolution is imperfect. However, the fact that a scientific theory cannot yet render an explanation on every point should not be used as a pretext to thrust an untestable alternative hypothesis grounded in religion into the science classroom or to misrepresent well-established scientific propositions.

First, defense expert Professor Fuller agreed that ID aspires to “change the ground rules” of science and lead defense expert Professor Behe admitted that his broadened definition of science, which encompasses ID, would also embrace astrology. Moreover, defense expert Professor Minnich acknowledged that for ID to be considered science, the ground rules of science have to be broadened to allow consideration of supernatural forces.

We find that ID fails on three different levels, any one of which is sufficient to preclude a determination that ID is science. They are: (1) ID violates the centuries-old ground rules of science by invoking and permitting supernatural causation; (2) the argument of irreducible complexity, central to ID, employs the same flawed and illogical contrived dualism that doomed creation science in the 1980’s; and (3) ID’s negative attacks on evolution have been refuted by the scientific community.

Another theme throughout the case was the idea that religion and evolution are entirely incompatible, a view I do not understand. Evolution has nothing to do with the existence (or lack thereof) of God. The following quote cuts to the heart of the issue, this perceived incompatibility between evolution and religion:

Both Defendants and many of the leading proponents of ID make a bedrock assumption which is utterly false. Their presupposition is that evolutionary theory is antithetical to a belief in the existence of a supreme being and to religion in general. Repeatedly in this trial, Plaintiffs’ scientific experts testified that the theory of evolution represents good science, is overwhelmingly accepted by the scientific community, and that it in no way conflicts with, nor does it deny, the existence of a divine creator.

And finally, one rather frightening quote (The last one, I promise! There’s just so many good ones!):

In the midst of this panoply, there arose the astonishing story of an evolution mural that was taken from a classroom and destroyed in 2002 by Larry Reeser, the head of buildings and grounds for the DASD. At the June 2004 meeting, Spahr asked Buckingham where he had received a picture of the evolution mural that had been torn down and incinerated. Jen Miller testified that Buckingham responded: “I gleefully watched it burn.” Buckingham disliked the mural because he thought it advocated the theory of evolution, particularly common ancestry.

In an all too predictable turn of events, the intelligent design backers are now claiming that this is a free speech issue, and that “Intelligent design has been banned from schools!”. This is, again, an outright lie. Intelligent design can still be taught in schools, but in an appropriate setting, such as a philosophy or religion class, where it belongs. The good folks at the “Discovery Institute” have already issued a press release regarding their loss in the trial. I find it to be angry and illogical. You be the judge.

It’s hard for me to believe that in this age of rapidly expanding scientific boundaries, we still have people clinging to 15th century beliefs. I don’t know whether to blame the American science education system (we are falling far behind other countries, and the fact trials such as these even make it to court has made us the laughingstock of the international community), or human nature itself. Whatever the reason, this ruling will hopefully cause some thought and reflection among those in the intelligent design movement. In a rather ironic twist, two days after the ruling was released, the journal Science declared evolution 2005’s top scientific breakthrough.

Despite the loud voices of the intelligent design community, the vast majority of the coverage I’ve read has been in support of the decision. Headlines such as “‘Design’ ruling shows sound judgment“, “Intelligent decision on intelligent design“, “An intelligent decision“, and (my favorite) “Threw the Book at ‘Em” from the good old Scientific American abound. Maybe America isn’t doomed after all.

More tech stuff…

I’ve been rather busy for the past week (or two), so I haven’t had a chance to post, but I’ve got a little free time today. Who knows why, but I was contacted by Microsoft with an offer for a flyout. (actually, they kept calling my parents over a period of two days, evidently they don’t understand the difference between Home and School addresses on a resume)

Considering I spent 30 minutes acting like this, I’m somewhat perplexed:

Interviewer: So today I’ll be aski…
Me: Listen, before you start, I have a few questions for you.
*awkward silence*
Interviewer: Okay…
Me: So, what development team did you work on during your time at Microsoft?
Interviewer: Uh… Visual Studio.
*I start very obviously taking notes while frowning*
Me: Huh. Interesting. Did you do anything there particularly noteworthy?”
Interviewer: I.. I… I wrote a batch system for building Visual Studio quicker!
Me: So, you mean like make? Cause someone else wrote that.
*I scribble wildly on my paper and frown even more*
Interviewer: Uh… Well, it’s for Visual Studio.
Me: Right. It’s make. I once used make.
Me: Back when I was porting my main frame to ARM hyperorthogonal mode with a floating point matrix loop iterator exception.
Interviewer: That… That doesn’t make any sense!
Me: Yes, it does!
Interviewer: I’m sorry.
Interviewer: Okay, how about this. I’m going to give you a quick programming problem to solve. Okay?
*I stare for at him for a moment, blinking my left eye rapidly*
Me: Is it a problem that I don’t have any experience using Microsoft products?
Me: Like .NET.
Me: I once searched for C# on google, but that’s about it.
Interviewer: …
Me: I didn’t find much.
Interviewer: Well, we are looking for C/C++ programmers.
Me: Yeah, I can do that. I don’t use pointers though. They’re buggy.
Interviewer: …Okay…, nice talking to you, I’ll let you know what happens.
Me: What? It’s been thirty minutes? I’ve been having so much fun I lost track of time!
Me: Listen, I’m going to need a decision within 3 days. Oh, and I won’t work anywhere but the kernel development team.
Interviewer: Uh… That’s going to be tough.
Me: Yeah, I’ve used make before. Back when I was … (I just start spouting random jargon)
*Interviewer gets up and walks out of the room while I’m sitting in the chair, talking and gesturing towards a now empty desk*

Crazily enough, they met my demands and seem really eager to interview me. I guess we know what kind of candidates they’re looking for…

I’ve accepted the Motorola position, and can’t wait to see what I’ll be working on. I’m doing a bit of reading in my free time to refresh my C knowledge, as well as learn Java. So far, my reaction to Java is … mixed. I suppose I’ve been spoiled by Python, but Java seems like a mix of C++ syntax and Python capabilities, that’s designed entirely for OO programming (unlike both Python and C++). Not necessarily a bad thing, but it’s taking some getting used to, especially with the recent changes in Java 1.5 (or Java 5, as the marketing droids like to call it). One thing I can definitely say though is that the default libraries are awesome (just like python), and threading is great (again, just like python). There’s a builtin way to do almost anything you can think of. Still, programming in a language that looks a lot like C/C++, and has no pointers just feels weird. I didn’t realize how dependent I was on pointers until I started programming in Java.

Update on my Python stock market analysis program (uses FANN internally to predict prices), which I’ve had email me a set of stock recommendations each morning for the past week or so:

Total Value % Chg Gain / Loss
$22,770.00 +0.26% +$60.00
$49,910.00 +2.15% +$1,050.00
$23,900.00 +2.75% +$640.00
$20,468.00 +3.77% +$743.25
Total: $117,048.00 +2.23% +$2,493.25

Not bad for a little over a week’s time and 130 lines of Python.

Every time I post I seem to drift towards writing about the technical side of things, since that’s what tends to be on my mind in the midst of all these projects. I’ll start posting slightly less technical things soon… Maybe. :)

I’m a real engineer!

This past Thursday and Friday I interviewed at Motorola for the mobile devices team. On Thursday, there was a welcome reception and dinner, then on Friday, a tour around the Libertyville location, presentations about Motorola, product demonstrations, and most importantly, three interviews (two technical and one behavioral). One of the coolest products I got to play around with was the newest PEBL phone (a very impressive piece of technology):

SLVR

Motorola made the entire interview process as painless as possible, but twelve hours of critical evaluation is still astoundingly gruelling. I was barely concious on the bus ride home, and in my red eyed unshaven state, probably looked like I had stolen the suit I was wearing. Despite this, I was excited at the remote possibility of actually getting a job doing exactly what I want to do (programming in C, close to the hardware, running Linux). Motorola did a very good job of selling itself as an awesome place to work. The projects are really cool, the outlook for the future is excellent (especially with some of the new products under development), the benefits are awesome, and every engineer I met there was very intelligent. Still, I tried not to let myself get too excited, as during the welcome reception, it was made clear to us that the candidates chosen were strictly the best and brightest, and that we should consider it an honor to even be offered an interview. The average GPA in the room was leagues above mine, and most of the applicants had extensive (two years plus) previous experience at high profile tech firms, so I ranked my chances of getting an actual job as little to none.

Today, despite my less than optimistic outlook, I received a call that I was being offered a position. I’m almost certain I’m going to accept. It’s a great offer, both in terms of salary and benefits, and I’m still in a bit of shock that I actually received it. Seems spending so much time messing around with Linux and using and loving C/C++ has finally paid off. :)

I have until November 18th to decide whether I will accept the position or not. Just enough time to go in for the Microsoft interview and see what they have to offer, although the chance Microsoft will:

  1. Pay me as much.
  2. Give me such awesome benefits.
  3. Let me actually code new and interesting things.
  4. Let me play with such cool technology.
  5. Let me work on the Linux kernel.

is pretty much nill, so unless they pull something I’m not expecting (like Windows Vista will actually be Linux under the hood, and every bit of it released under the GPL), I’m pretty much sold on Motorola.

Although I’d like to elaborate a bit more on the actual interview process, as well as some of the products they have under development, I have (as always it seems), a double whammy coming up on Wednesday (project and midterm). Hell, maybe one of these days I’ll have time to post something that’s not a job search update…

Three out of three…

I had my Wolverine Trading phone interview Friday, and as expected, it went well. It seems most of these initial interviews are just to make sure you’re not a psycho, and can interact with a human being without breaking into tears. Less than a minute after hanging up the phone, I had an email offering a more extended interview over the course of a day downtown. They want me to bring a code sample and my driver’s license. Both are a bit worrying, as most of the code I’ve written is modifications of existing software which I can’t claim I really wrote, and they won’t even let me buy booze with my expired drivers license, so I can’t imagine they’ll let me use it to prove my eligibility for employment. Guess I’ll find out…

Shortly after receiving my Wolverine offer, I got a response from Microsoft. They want me to come in for the “psycho filter” interview, and I’m going for it. Even more surprising, they ignored my request for a coding position, and have recommended me for a project manager position. Oddly enough, I think my skill set fills the requirements for this job better than that of a rank and file coder. I guess we’ll see if Microsoft agrees. If so, expect a damn sight better code quality in my division… If nothing else I’ll come out with a couple of new logic questions to mull over. If all goes well you’ll see me at the right hand of this man in the near future:

Billy boy!

I’ve been continuing my work with Python and Myghty, and both have continued to impress me greatly. The last time I dabbled in web design and web services, HTML was a horrifically ugly amalgamation of content and presentation, and writing code to generate it was liking trying to herd cats. Until recently, I thought nothing had changed. After the last couple of weeks relearning HTML, learning CSS, and seeing the power of Python in a production environment, I realized how wrong I was. Though not perfect, writing HTML is actually enjoyable, and programming a web framework is even more fun. Call out the nerd patrol if you wish, but it’s the truth. I’m having a ton of fun messing around in Myghty’s internals, and designing an architecture for the Threshold project (of which I’ll explain more later, when we have an actual prototype to play around with). Python truly is an amazing language. Polymorphism runs throughout the entire design of the language, and it shows. 95% of the time, you don’t even need to think about implementing polymorphic behavior, it happens naturally as a result of the way you express classes in Python. Unlike C++, there’s no need for virtual functions, since every function is a virtual function, and can be overridden as such. A class hierarchy just seems to flow together, and fighting the language to get the structure you want is the last thing on your mind. The only real “problem” I’ve found is that Python tends to place into stark contrast any poor program architecture choices. If you mess up the design, it’s easy to see (and, thankfully, nearly as easy to fix).

The power of functions simply being an identifier and an object in Python is nearly impossible to overstate. Want to generate a list of completely dynamic functions, in the middle of execution, on the fly? Done, in a few lines of code. It’s trivially easy to develop a program which will adapt to nearly anything passed to it. Dictionaries (know as hashes in most other languages), are also exceptionally powerful, and having them as a very fast built in type is a great thing. Frustrated by the lack of a switch statement in Python? No problem. Just use a switch statement implemented through a dictionary. :)

result = {'option1': function1,
'option2': function2,
'option3': function3,
'option4': function4}[value]()

In another tech sidenote (this one’s a bit shorter, I promise), I submitted my first really serious bug report for an open source product. You can see it here (Suse’s bugzilla seems to be down recently, so the link might not work). Although I thought I had tracked down the memory leak in Suse 10.0 to Beagle, it turned out it was actually a kernel bug in the orinoco driver that resulted in it allocating, and not releasing, ’size-64′ objects from the slab. I compiled a custom version of the just released 2.6.14 kernel, using a nearly identical config to the kernel Suse had provide (thank you /proc/config.gz), and the problem has gone away completely. Suse’s version of mkinitrd is actually really neat. It automatically detected that I had just compiled a new kernel, what modules I needed to boot my system, packed them up, and put the appropriate initrd in my /boot directory. The kernel worked perfectly on the first boot, and I haven’t needed to restart the machine since. I’ve left a detailed breakdown of the problem on the bug report I submitted to Suse, as well as an explanation of the solution. Hopefully they include a fix when they next issue a kernel patch. Regardless of whether they do or not, an uptime measured in months, here we come!

This weekend has been a great end to a very stressful week of midterms and interviews. I finally caught up on my sleep, enjoyed the great weather, and even had some time to read a bit. I can’t help but thinking of this as my last quarter here, even if I do have to take some classes next quarter. Although I didn’t do much work for class (ECE 357 especially), it shouldn’t matter, since things next week won’t be quite as crazy as this past week. Up until Thursday that is. Here’s to hoping Motorola and I get along as well as we did during the research presentation…

Another interview, and random nerd stuff

Today was the day to end all days. I woke up, showered, and immediately put on my suit and headed over to the interview center, where I had an interview with SWRI scheduled. The interview went reasonably well, considering that I was preoccupied by my English exam directly afterwards. SWRI is based out of Texas, and does a lot of contracting work (about 60% government and 40% private). They obviously are really interested in new engineering blood, as they offered to match any other job offers I got (within reason). Directly after my interview I headed over and took my English midterm. Although my essay wasn’t exactly … coherent, I’m hoping it’ll at least fall amidst the rest of the class’s answers in quality…

I spent most of the rest of the day thinking about/working on my CS339 databases project in the FoMo Tomorrow Lab, and I’ve come to a couple of conclusions:

  • Python is great.
  • Designing an efficient, complete, and extensible data model for an application is HARD!
  • FoMo has awesome labs in the sub-basement. A room full of computers with Ubuntu installed, a fridge chock full of caffeine infused liquid, and a nerf gun. What more could you ask for? (no Dan, you can’t have any sexbots)
  • Starting to actually implement a really neat idea for a highly dynamic, social, and complex website is a lot of fun!
  • Myghty (the python equivalent of HTML::Mason) is exceptionally powerful, well designed, and has a very bright future ahead of it (in our project especially).

To give you an idea of the complexity of the data model for just our simple prototype, here’s a PNG of the E/R diagram (click for a full sized version):

Little ER

Although there’s much more that I’d like to elaborate on about the project, upcoming interviews, and various other events, I’m going to have to cut this post short so I can finally get a little bit of sleep. Hopefully when I get a bit more free time I can write a decent synopsis of the two projects I’m involved in, and the prominent use of Python in both of them.

Motorola offer

I’m posting this from one of the computers in the main library (first time here this quarter!), so this’ll be a quick update. I received an interview offer from Motorola, which is nice, and the actual position would be challenging and in the area I’m interested in, but I was a bit disappointed to see that the position would be here in Illinois.

Dear Andrew,
I would like cordially to invite you to Motorola on Friday, November 4th to interview with our Mobile Devices Team in Libertyville, IL (20 miles north of Chicago). Mobile Devices designs, manufactures, sells and services wireless subscriber and server equipment for cellular systems, portable energy storage products and systems, servers and software solutions and related software and accessory products. This team handles all of the design of our top cell phones including the RAZR, ROKR etc. We will have a small reception Thursday night at the hotel, and will bring you on-site on Friday to interview with our management team. We have several openings that we will be looking to fill, and offers will be sent out the following week.

I guess I’ll see what happens. If I do get a good offer, I may have to rethink (or delay) my decision to live on the west coast.

I guess I’m awesome

Yesterday was the SWE job fair, and although this year the number of companies attending that I cared about was rather low, I still managed to put on the old suit and tie and drop by and hand out my resume. The first stop I made was the Microsoft booth (don’t judge). They asked me a couple of fairly easy logic questions, and we talked for a while about projects I did in the past, and projects I’m currently involved in. I’m not so sure they were happy when I elaborated on the elegance, simplicity, and stability of my embedded linux encrypted hard drive solution, as well as my constant drive to write highly portable code.

Still however, the representatives were intelligent, well-spoken, and the jobs available were both interesting and paid well. If I do in fact get an interview and a posh job offer, I may very well end up selling my mortal soul and working for Microsoft (stop crying Kurt). Oh, yeah, they also gave me a free shirt! Free stuff is always good, even if it comes from Bill Gates.

The Motorola booth was also enjoyable, and they really loved the fact I had received the Motorola Undergraduate Research Grant (big surprise). One of the engineers there was working with C on embedded devices, which is almost exactly what I want to do. I’m definitely hoping for an interview.

Although I didn’t plan to visit any other companies, as I was walking around looking at the other booths I was pulled aside by a girl around my age who had a booth in a corner, facing the wall. She was a software engineer at a company called “Wolverine Trading”. Evidently they run a large variety of stock bots that manage to earn a lot of money. I talked to her for a bit about my programming experience, then elaborated on my own little Python+FANN based attempt to predict stock trends. They’re doing similar things, except actually putting them into full use with millions of dollars. I just recieved an email from them desiring a phone interview (to London), so I guess she was reasonably impressed. The job actually sounds quite exciting, but when she mentioned they were in the process of updating a lot of their old Visual Basic code, alarm bells went off. I’d love to work on a production stock bot, but there’s no way I’m going to port Visual Basic code to C++. Maybe I can convince them to use Python… If I do take the job, I’d probably end up working in London, which would mean I could ride around on those double decker busses, which counts for mega bonus points in the final decision. I mean seriously, who wouldn’t want to ride to work in a vehicle like this:

The bus of awesomeness!

All in all, everything went extremely well, and I’m guessing all three will result in an interview. Seems I might be employable after all…

On a random server note: I had to reboot after only 10 days of uptime, since some sort of memory leak took up a massive amount of memory (I’m guessing and hoping that it was Beagle that caused it since if not, Suse 10.0 needs serious fixing). Also, I’m up to 7,930 SSH login attempts. To any bots out there: My login name wasn’t ‘test’ or ‘guest’ the first time, and it’s not going to be after the 10,000th time either so STOP!

Whaaaa…?

Dan and Jeff happened to be in town simultaneously this weeked, so on Friday Kurt and I met up with them for dinner, and the following day Kurt, Amanda, and I met up with Dan for dinner again. Although we had a great time, it’s odd thinking that Kurt, Jeff, and I will be entering “the real world” in a couple of months, and even weirder, Dan is already there. Dan was in town on business. I’ll repeat that for emphasis. Dan was in town on business! If anyone was destined to remain the perpetual college student, always around to crack jokes at the expense of minorities and women, it was Dan. I still can’t grasp the fact that he actually has a job (two in fact). As much as I look forward to gainful employment and a paycheck (and escape from NU), it’s still not something that seems real.

After arriving back at the apartment after such a great weekend, I was horrified to realize I had completely forgotten about my ECE 357 (VLSI design algorithms) homework which was due the next day, complete with programming project. Although normally homework would be no cause for concern, in ECE 357 there are 5 assignments, counting for a total of 30% of our grade, and no curve. In the resulting fury at the realization that I’d probably have to drop the class, I managed to stab a mechanical pencil through my desk (it’s now classily taped over with packing tape). Thankfully, the next day I managed to complete most of the assignment, but there’s still no guarantee that I will be able to keep the class. Good job me.

There was however, one bright spot amidst my disappointment at the prospect of taking only three classes. Since I was so crunched for time, I decided to do the programming project in Python. In an hour, I had gone from not understanding the algorithm involved, to a short, efficient Python program which took in a polish notated set of chip sizes and orientations, and output an optimized floorplan for it. Throughout the process, I only had to look at my Python book once. Even though I am far more proficient with C and C++ than Python, I would have to have the book open on my desk the entire time had I used C/C++. The more I use Python (and the more I use Perl, ugh), the more impressed I am with it. It’s easy to understand, and I am able to write functional code nearly as fast as I can think.

Due to how much Python has impressed me, I’ve decided to do my CS 339 (databases) project in it instead of Perl. The project is self defined, and my current idea is a simple fitness tracker for multiple users. It will allow the user to enter weight, body fat percentage and graph them by date, as well as allow the user to enter the nutritional information of food they commonly eat, and track fat/protein/carbohydrate ratios and the number of calories consumed each day. This isn’t something I anticipate a huge demand for, since there are commercial websites that do the same essential thing in a much flashier, more feature complete, and more complex way, but I’ve always wanted a simple web accessible way to keep track of how my training is progressing, and how my diet is. I’m definitely open to other ideas, so if you have any other project suggestions, let me know (or ideas for features to make my existing idea cooler).

I’ve been using Ubuntu steadily over the past week, and it’s still been performing great. I have however, had some serious driver issues again, this time related to my ATI radeon 9500 video card. Trying to install the newest ATI drivers proved to be a harrowing process. Although I was able to install the drivers and compile the kernel module necessary to access those drivers (stupid proprietary drivers), every time the system booted it would replace the new module in /lib/modules/2.6.12-9-686/volatile with the old one from restricted-modules. This resulted in a version mismatch, which disabled 3D acceleration. If I copied over the module and restarted X, the new ATI drivers worked fine, but as soon as the system restarted the module was clobbered again, and I couldn’t figure out how. There was no trace of the old module until after bootup. Eventually, I gave up and used the slightly older ATI drivers that Ubuntu includes, only to be confronted by periodic X freezes (the system was still running, X just wouldnt’ respond to anything, including kill commands). Now I’m running the open source ‘radeon’ driver that I started with, and image quality is better, and everything is perfectly stable. No 3D acceleration, but I don’t play games so it’s not much of a loss.

Every experience I’ve had with proprietary binary drivers under Linux has been poor. They’re unstable, poorly written, and nearly impossible to install reliably. Although this in part due to Linux’s lack of a static driver interface, most of the blame lies at the feet of the manufacturers. In the open source world, when you write code you know that dozens of very skilled eyes will be looking over it, and if your code sucks, you’ll get harshly criticized for it. In the proprietary world, code quality doesn’t really matter. No one is going to see it anyway, so why bother make it extensible, portable, clean, readable, or efficient? If it works most of the time, is completed by the deadline, and is good enough to sell the product, why make it better? I think the reason a lot of these companies refuse to open source their drivers is because they can’t, they’re so poorly organized, completely unportable, and horribly hackish. Sure, they work, but they’re written to work only within a very very specific environment. Wonder why so much software broke with Service Pack 2, and why it took so long for companies to come out with patches (I’m talking to you, Netgear)? It’s this same “profit above anything else” philosophy. Open source coders are reverse engineering hardware and writing far better drivers than the manufacturers who designed the hardware. Sadly, I don’t see any indication that the vast majority of the hardware industry will ever start concentrating on driver quality. It seems that as operating systems finally become stable, hardware companies are taking up the “lets make computers unusable!” torch.

In a very loosely related rant, this weekend I attempted to buy a bottle of Southern Comfort at Jewel and was rejected based upon the fact I have an expired driver’s license. I was less than impressed. My birthdate doesn’t suddenly become invalid in conjunction with my drivers license doing so. Although I can understand why they do it (some stupid kid “borrowing” an expired license to buy booze), it seems to be the way Evanston operates, ie: complete and total control. Everywhere I go in this town, something like this seems to happen. I can’t buy booze despite the fact that I’m 21 years old, I can’t buy the movies in Blockbuster, I can’t use a video camera in Blockbuster, I can’t get the printer cartridges off the wall in CVS without an employee to do it for me, I can’t use the computer in Radioshack without an employee watching to make sure I don’t “take it to one of those hacker sites with the spywares and stuff”, I can’t look at TV show DVDs at Borders without someone to open the case for me, and so on. Over the past four years, I’ve been working up a sketch of the political orientation of the usual Evanston resident. Here it is:

Evanston Resident

I’m going to be happy to leave this town.

Ralph Nader eats at Clarke’s?!? (and updated Ubuntu impressions!)

In an amazing show of literary genius, I managed to hammer out a three page paper that rambled on about a vague connection between the natural world, Titania, Oberon, and the changeling boy. Never before has such tripe been committed to paper. If nothing else, my TA may give me a couple points for making him laugh (although that’s unlikely after my comment in discussion today about the french being “cheese eating surrender monkeys”). Turns out he’s the one person in the world who doesn’t find the French funny. Great.

The day took an upward turn after coming back from the gym (amazing workout). Mike called me up and we headed to Clarke’s for dinner. While we were eating I noticed an old guy in a suit looking in, about to head through the door. He looked kind of shady so I gave him my best evil eye. He looked confusedly at me for a second before heading on in. He ended up standing behind me waiting for a table, and Mike took the opportunity to whisper “Don’t look now, but Ralph Nader is standing behind you.” In spite of Mike’s advice, I turned around, and sure enough this man was standing directly behind me:

Ralph Nader

Yes, the third part candidate who uttered such wisdom as the following was standing within striking distance:

“If they don’t close these [nuclear] reactors down, we’ll have civil war in five years.” — Ralph Nader in 1977

Jay Leno: “What do you do for fun?” Nader: “Strawberries” — The Tonight Show

Mike and I sat while the couple next to us sidled up to Nader and asked stupid questions until Nader gave them both business cards to get them to go away. What the hell would someone do with Nader’s business card? Call him for advice on how to sabotage the election for the party closest to your own views? I’ll pass, thanks. Nader then proceeded to his table and ordered a milkshake (Mike went to the bathroom on a little reconnaissance mission to find this out). How utterly boring. Mike and I were hoping he had ordered all natural tree juice or some such appropriately wacky thing (green party, ha… ha…). I decided to go on a little trip to the bathroom and stab a fork in Nader’s leg to liven things up a bit, but Mike managed to persuade me not to. I’m beginning to regret listening to him, since this would have been a much more interesting story if I hadn’t.

Since dinner I’ve been continuing my testing of Ubuntu, and I’m still very impressed by what it has to offer. It took almost no time to set up everything to my liking, complete with all the applications I use on a regular basis, and I have no stability issues, except one. My network card, as usual, is capable of singlehandedly wreaking havoc on the entire system. I have a Pentium 4 processor with hyperthreading, so a SMP enabled kernel would provide significant performance improvements, especially in multitasking scenarios. After a quick recompile of ndiswrapper (on a sidenote, it does in fact require gcc-3.4, as I suspected), I attempted to insert the module, when *BAM*, hardlock. Turns out that under a SMP system, through the ndiswrapper translation layer, my network card and its drivers are capable of instantly freezing a Linux system. Joy. Netgear, I hate you. Go drown yourself in a well. The world will be better off. In the end, I settled for the 686 kernel, and it’s been rock solid. The entire process, while not something I enjoyed doing, was made significantly less painful by Synaptic. A huge number of useful packages are available (especially if you edit sources.list to include the “universe” repositories), and they are well described, easy to install, and dependencies are handled supremely well. It also handles complex uninstalls very well, which made removing all traces of the SMP kernel from my system which interacted so poorly with my network card a process involving a couple of clicks.

Since getting everything up and stabilized, I’ve been watching episodes of Lost (using VLC, an astoundingly good crossplatform media player), securing this server (over 2000 remote SSH attacks already) over TightVNC, listening to music, and doing a wide variety of other day to day computing tasks. For the first time I am seriously considering completely switching over to Linux on my desktop machine. The only remaining application that does not exist under Linux is an apple lossless encoder so that I can stream music to the living room stereo system, but I can make do without it (and if necessary, write my own encoder, or run the command line encoder in WINE).

Here’s a picture of my current desktop (click for full size image):

Little screen shot

Suse 10.0 is performing excellently in its server role, proving itself to be very stable and secure, while Ubuntu is turning out to be very functional, fast, and surprisingly, quite easy to use. Definitely two great Linux distributions worth looking into.

OpenSuse
Ubuntu

Check them out, you won’t regret it.

A stick in Shakespeare’s eye…

In usual form, I’m putting off writing my English paper that is due tomorrow and testing out the latest version of Ubuntu (5.10) which just happens to have been released today. I used Ubuntu 5.04 for a while, and although it was impressive, I had a continuing issue with hardlocks under heavy network+cpu load. My Netgear 802.11g card, the wg311v2, is only slighty more stable under Windows, and although it doesn’t fully lock the machine, it often irreversably loses connectivity.

Texas Instruments, who make (made) the wireless chip (ACX111), seem to have completely abandoned the product. Good decision on their part, since it’s a rancid, steaming, worthless pile of transistors, and probably has a cocaine habit and at least one STD. People like me who actually bought, and still own, the product are completely screwed. Great job folks. I could design a better chip with no arms and a team of trained dolphins.

Yet another problem with my network card is the support (or lack thereof) in Linux. TI evidently closely guards any documentation of the ACX111 as a ‘trade secret’. I’m half guessing they either never bothered to actually develop documentation, or are too embarrassed to release it. Regardless, Ubuntu impressed me by actually detecting the card, and installing the correct (albeit too old) driver for it as well. Although the driver cannot actually get the card to work, the fact that Ubuntu even saw the thing bodes well for their hardware support. Every other piece of hardware in my computer was detected flawlessly. Ubuntu definitely has their shit together detection wise.

Upon initial bootup, Ubuntu proceeded to quickly install and set up the packages it had previously copied to the harddrive. The process was quick and painless, and when it finished, I was greeted by a clean and functional gdm skin. Videocard and monitor detection were perfect, and I did not have to make a single change to xorg.conf (scrollwheels are enabled by default too, which is pretty nifty). I’m not a fan of the brown colorscheme of Ubuntu, but changing everything to blue was quite easy. My initial impressions of speed are excellent. Everything is fast and responsive. Stability is of course, excellent.

Since Ubuntu’s network driver for my card didn’t work, I installed ndiswrapper so I could use the Windows drivers. I was happy to discover that Ubuntu includes ndiswrapper by default, but it’s a rather old version (1.1, the current is 1.4). After getting Ubuntu’s provided package to work, I decided to install the newest version. After downloading the source, I quickly realized that not a single development package was installed. Although I can understand why they made this choice, it’s still a bit of a shock every time I try to compile something on a new Ubuntu install. After installing the development packages for C,C++, and Python, as well as the kernel headers, I ran make again, only to be confronted with the following error:

andy@neverwhere:~/Desktop/Downloads/ndiswrapper-1.4$ make
make -C driver
make[1]: Entering directory `/home/andy/Desktop/Downloads/ndiswrapper-1.4/driver'
make -C /lib/modules/2.6.12-9-386/build SUBDIRS=/home/andy/Desktop/Downloads/ndiswrapper-1.4/driver \
DRIVER_VERSION=1.4
/usr/src/linux-headers-2.6.12-9-386/scripts/gcc-version.sh: line 11: gcc-3.4: command not found
/usr/src/linux-headers-2.6.12-9-386/scripts/gcc-version.sh: line 12: gcc-3.4: command not found
make[2]: gcc-3.4: Command not found

It turns out that, although the default compiler for Ubuntu is gcc-4.0, the kernel headers are linked to gcc-3.4. Definitely not good. As a quick and dirty fix I created a symbolic link for /usr/bin/gcc-3.4 to /usr/bin/gcc-4.0, and although it compiled without complaint, modprobe complained that the resulting module was in ‘an invalid format’. I’m not sure whether the kernel is in fact compiled with gcc-3.4 or not, or whether I’m doing something wrong. I would be very dissapointed if I had to keep gcc-3.4 installed to compile anything that used the kernel headers. Eventually I decided to return to the stock Ubuntu version of ndiswrapper, and so far it’s working perfectly.

Although these are just my quick and dirty first impressions, I feel comfortable saying Ubuntu 5.10 is one of the most polished Linux distributions on the market, a very impressive feat for such a young distribution. The default selection of packages is excellent, and for anyone who needs more advanced functionality, it’s easy to add. The install is easy, fast, and hardware detection is excellent. Gnome 2.12.1 is well configured, clean, and surprisingly quick (and will probably improve in speed in the near future). Although not problem-free, Ubuntu is still an absolutely fantastic distribution, especially for desktop users who are new to Linux.

The Warriors just started on Spike TV, and as inspiration for my English paper I’m going to watch it. Maybe my topic will be “Gang Warfare and Mime Attacks in Shakespeare’s A Midsummer Night’s Dream”.

Warriors!

CAAAAAAAAN YOU DIG IT!?!?

My TA will love it.

I’m boned!

In a fit of madness, I just attempted to start my three week project in CS 339 (databases), almost two days before it is actually due (Friday). Although I’ve encountered both Perl and SQL before, I’ve done no serious hacking with either of them, and hence I was kind of hoping to use this as a trial by fire of my ability to synthesize a new language and implement a solution quickly. Sounds like a great plan, right?

Heh, turns out the joke is on me. We’re using Oracle 10g as the backend for this project, and although Oracle Corporation used to like to say “Can’t break it, can’t break in.” (until they realized that hackers took that slogan as a challenge), it seems too many CS/ECE students implementing a rather pitifully nonfunctional blog in perl are able to do just that. Upon trying to log in to my own blog, I got the not so encouraging message:

ERROR:
ORA-01034: ORACLE not available
ORA-27101: shared memory realm does not exist
Linux Error: 2: No such file or directory

After a bit of investigation, I discovered the problem. Oracle is no longer running. Turns out we (the CS class), have managed to crash it. Repeatedly. Yet another product I can chalk off of my “I respect these guys!” list. While searching for reasons why too many “connect by” statements at once would turn the server into a segfaulting time bomb, this came up on my screen, almost like a slap in the face.

The short bus

I sure wouldn’t take a ride on that bus…

The upside of all this is that I get to go back to recreationally coding python, and messing with this server. Suse 10.0, despite not having marginal GUI configuration tools that like to nuke any custom config files (sadly still far better than most *cough* Mandriva), has proved to have quite decent defaults, good performance, great stability, and no big surprises.

Third time’s the charm

After a few days of configuration at the expense of time that should have been spent on projects due this Friday, I’ve finally gotten my server back up and running Suse 10.0. Every other time I’ve done this the server has been sacrificed to the demonic Windows centric gods of Northwestern University. This time however, it’s not running on the PC I actively work on, so there’s a chance it may actually stay up, and since I’m not telling anyone it’s back up, I may actually post. If you happen across this, and happen to know me, don’t expect any real form or reason to the posts. This is essentially acting as an outlet for thoughts which doesn’t involve hunting bums. You have been warned.