Archive for the ‘Geekdom’ Category

Eat it Cingular

Thursday, October 26th, 2006

I don’t know why, but Cingular apparently does not want me paying my bill. When I log into my account to pay online, I was taken to an intermediate page where I was asked, in a mandatory fashion, for my email address. I’m not a big fan of giving that sucker out for no reason, so I simply clicked the ‘Continue’ button. Unfortunately, the button was a link whose href was the lovely octothorpe.

This of course meant I was going nowhere by means of that button. I was quite peeved at this point because, not only did I not get an explanation from the page telling my why my email was required, but I also had no explanation for why the continue button failed to do so. The age-old adage, “Fail to communicate with me properly once, you suck; fail twice, now I’m pissed” came to mind.

So what’s a web geek to do? Obviously search the page’s javascript for the form submission line and execute it directly through Firebug commandline! Should any Cingular users get frustrated as well, get Firebug (and Firefox, which I have to mention since Google Analytics tells me the internets are alive with IE users still – shame on you all), and execute this line of code:

document.updateRequiredRegisteredInfoActionForm.submit();

Not only did this forward me on to my account page, but it also bypassed the need to fill in my email for no good reason. I get enough spam as it is. So there it is my friends; simple, one-liner to defeat Cingular’s attempts to be poor communicators. A silver lining here, besides getting in, is the lesson learned from Cingular’s mistake: Don’t suck at communicating with your users!

So long, and thanks for all the fish.

mp3 to wav conversion

Thursday, September 28th, 2006

Looking to convert those “legally” purchased mp3 files to wav so you can play them in your boombox? Here’s a handy dandy little shell script to facilitate the conversion process:

for i in *.mp3;
do lame –decode $i `basename $i .mp3`.wav;
done

The obvious usage:

Navigate to the directory where your mp3 files are located. Run this script in the directory, and viola, all the mp3 files will be converted to wavs  with matching filenames and the .wav extension. Perfect for burning to CD!

Do note that this requires lame and basename to execute properly. Enjoy those “legal” mp3s!

Collabofit is live (kinda)

Thursday, September 14th, 2006

We pushed collabofit.com live the other day, restricting access to personal invites for the time being. Interested in the experience? Want to be an early adopter? Shoot me a mail and I’ll set you up. Check out Katanaa and the collabofit blog for more information.

Holidays are here

Wednesday, September 13th, 2006

Ah, its nice to be on holiday. What holiday is on September 13th you ask? Programmer’s Day, of course!!! Internationally recognized as ‘the’ holiday of choice, Programmer’s Day is all about celebrating the fun of being a geek. So come on everybody, live it up!

That’s so rufus

Friday, September 8th, 2006

In the quest to continually update our language and give it new forms of expression, and because I === geek, I am going to help promote an alternative to the geeky “you got owned” and its various l33t spellings, one that should hopefully appeal to a broader audience.

Now, instead of getting “owned”, its “you just got Mario-ed!”. This is short hand notation for saying “You got one-upped”, and as we all remember, 1-ups were fairly elusive in the original Mario Bros. So there you go, inspired by xkcd, I challenge you to let people know when you’ve Mario-ed them.

Linux-Fu For File Deletion

Monday, August 14th, 2006

Having setup a backup server for work and home, I was looking into how to remove archives that were a week or older. Initially, I wrote a simple script to search a path for files that matched a naming convention and whose creation dates exceeded the week limit. This was fine and dandy but not the most elegant and didn’t really increase my linux-fu. So I decided to delve deeper and find a good one-liner that embraces the linux way of life. My result:

rm `find /path/to/backups/ -mtime +7 -name ‘*.bz2′`

The breakdown:

  1. rm – remove files, any n00b knows that…
  2. the ` mark surrounding the argument passed to rm denotes that the shell should use the result of executing the command(s) inside the ticks as the arguments to rm. This tick can be found to the left of the number one.
  3. find does that, finds files and lists them to stdout, generally the screen.
  4. /path/to/backups is the path find begins its search from…
  5. -mtime +7 says find files who’s modification time is more than 7*24 hours ago, effectively a week or more in the past.
  6. -name ‘*.bz2′ matches any file ending in with the .bz2 extension.

Slap that sucker into a cron job and you have yourself an automated way to maintain a certain number of files that do not exceed a certain time frame. find is enormously useful and has so many wonderful options to assist you in your file searching. So there you have it, a simple one-liner to remove files based on their timestamp.

Darth Vader

Thursday, August 3rd, 2006

Via BoingBoing, a video remix of a scene in Empire Strikes Back, making Lord Vader appear as a smart ass. Great stuff.

The Green Is Spreading

Thursday, July 27th, 2006

It seems like, in a lot of instances, that geeks begin to embrace a technology and slowly, over time, the general population adopts the technology too, the Internets being the recent example. So it was to my delight that I found a geek’s blog totally centered on green living! Just perusing his recent articles, I found several that got the tinkering juices flowing and that I’d like to try out in the near future.

I am definitely going to keep an eye on this blog and do my best to help spread the word about green living. Hopefully society will begin to take the green approach seriously.

New Webserver To Play With

Saturday, July 22nd, 2006

So what’s a guy to do on Friday night / Saturday? Probably look for something really nerdy to do, right??!?? That’s probably the response of most guys right? Okay, maybe not; but when your significant other is still playing in Florida, and the movie theatre is running on partial power and not showing movies, it is easy to become absorbed by something new and shiny. My new toy: YAWS, (Yet Another WebServer for those not in the know).

I am a web developer and as such spend a healthy chunk of time leveraging the Apache webserver to serve up the web applications I develop. So when another web server makes performance claims like this (thoughput ( load(x-axis) vs KBytes/second(y-axis)):

Apache vs YAWS performance

Our figure shows the performance of a server when subject to parallel load. This kind of load is often generated in a so-called “Distributed denial of service attack”.

Apache dies at about 4,000 parallel sessions. Yaws is still functioning at over 80,000 parallel connections.

Intruiged, I upgraded my version of erlang, got myself YAWS up and running, and am now delving into the world of erlang web development. I think I’ll write a simple application in both erlang/YAWS and PHP/Apache and run some benchmarks to test these claims myself. To see my YAWS development, tune your browser to my compy. Currently it only has the default site, as my erlang fu is in development.

The graph is non-trivial and if it proves to be true, even partially true, that YAWS can handle 20x the number of parallel requests Apache can, that may be just the advantage we need over our competition.

More to come…

Ah Ha!

Wednesday, July 19th, 2006

Continuations…frequently referred to by Paul Graham as, to paraphrase, awesome. With all the reading I’ve done regarding continuations, I’ve never really seen the big deal about them.  Turns out its because I didn’t get it. Imagine that… Fortunately for me, I have continued to read about them and finally had the “ah ha” moment. Reading this page describing fuctional programming, the author explains continuations in way that finally made it click:

A “continuation” is a parameter we may choose to pass to our function that specifies where the function should return. The description may be more complicated than it sounds. Take a look at the following code:

int i = add(5, 10);
int j = square(i);

The function add returns 15 to be assigned to i, the place where add was originally called. After that the value of i is used to call square. Note that a lazy compiler can’t rearrange these lines of code because the second line depends on successful evaluation of the first. We can rewrite this code block using Continuation Passing Style or CPS, where the function add doesn’t return to the original caller but instead returns its result to square.

int j = add(5, 10, square);

In this case add gets another parameter – a function that add must call with its result upon completion. In this case square is a continuation of add. In both cases j will equal 225.

So if you redefine your functions to take an optional last parameter that points to where the function should return to, suddenly you have some serious flexibility regarding what happens at the end of functions. The brilliance behind this method is shown a little further in the article:

Once we convert a program to CPS it becomes clear that every instruction has some continuation, a function it will call with the result, which in a regular program would be a place it must return to. Let’s pick any instruction from above code, say add(5, 10). In a program written in CPS style it’s clear what add‘s continuation is – it’s a function that add calls once it’s done. But what is it in a non-CPS program? We could, of course, convert the program to CPS, but do we have to?

It turns out that we don’t. Look carefully at our CPS conversion. If you try to write a compiler for it and think about it long enough you’ll realize that the CPS version needs no stack! No function ever “returns” in the traditional sense, it just calls another function with the result instead. We don’t need to push function arguments on the stack with every call and then pop them back, we can simply store them in some block of memory and use a jump instruction instead. We’ll never need the original arguments – they’ll never be used again since no function ever returns!

So, programs written in CPS style have no stack but have an extra argument with a function to call. Programs not written in CPS style have no argument with a function to call, but have the stack instead. What does the stack contain? Simply the arguments, and a pointer to memory where the function should return. Do you see a light bulb? The stack simply contains continuation information! The pointer to the return instruction in the stack is essentially the same thing as the function to call in CPS programs! If you wanted to find out what continuation for add(5, 10) is, you’d simply have to examine the stack at the point of its execution!

Continuations are particularly well-suited to web programming because of the stateless nature of the web. A request for a page could come at anytime, and what happened before  that page request will not matter. However, this is not always desirable. With continuations, we can simulate state, even in a stateless environment. For more on that subject, start with this article. An interesting alternative to MVC.
This is a whole new paradigm from the one I was taught in school and I think rightfully so. It is a tough concept to wrap your mind around at first. Now that I’ve had the “ah ha” moment, I look forward to implementing these ideas in my future work.