Monday, December 31, 2007

Defensio: smarter than the average troll.

So, I've been using the Defensio API lately. There's a "Defensio on Rails" plugin that I've had success implementing (with a few hacks specifically for the site using it, thank God for open source).

I've always been meaning to integrate Defensio into the anonymous blogging site I run, since I figured that sooner or later someone was going to target it for spam.

And I was right.

But the spam that eventually came wasn't your every-day automated "buy viagra now" spam. What the site got hit with was curious hybridization of trolling and spam; it was spam, no doubt, but it was clearly posted by actual people attempting to troll the site. Let's call the phenomenon "Troll Spam" for now.

After swatting away the first few posts by hand, I quickly looked into Akismet and Defensio's APIs. I was on a "short schedule" since I hadn't planned on spending my entire day implementing an anti-spam filter or doing the filtering by hand.

I eventually chose Defensio, and had it up and running in less than 2 hours. Why?

* Good API documentation: even though I was using the Defensio on Rails plugin (see above), I still needed to know the mechanics. Going through the Defensio API page was a breeze.

* RSS feed for "innocent" and "spam" pages. This was incredibly convenient for checking the results of the Defensio on the production site. I have my own little admin section that looks like it came out from a cracker-jack box, but Defensio's RSS feeds make it much better to monitor, real-time, what's ham and what's spam on the production site.

* Statistics. Tells me how the system is working. Not useful now, but fun to watch!

But by far the most important feature was that Defensio learns. The Troll Spam all had a similar theme, but different content. If you've ever seen a "raid" by 4chan or Something Awful goons, you'll know what I mean. Certain words, phrases, etc, repeated together. After training Defensio to HULK-SMASH the next few bursts of Troll Spam it's caught on to my intentions and started filtering out the bull-shit while still letting in the good-shit.

Meanwhile, the site continues to operate normally, the regulars not even realizing there's a Secret War happening!

Now, I know I could have spent 20 minutes creating my own filter that would have whacked posts that had these phrases in them, but this is so much better: Defensio has even started marking other posts by these trolls as spam as well. One of them thought they were going to be clever and posted an entire 3-page "ABC REPORTS" article. Never hit the front-page.

At the time of this writing they've basically just given up and started posting a long stream of obscenities (which is easier for them I guess), but none of it is getting through...

Statistically, Defensio has about a 50% accuracy, but it's been implemented less than 24 hours and its learning very, very quickly.

Smells like victory to me.

My only regret is that I didn't get Defensio implemented sooner -- I missed out on a lot of good learning data.

HTML5's Canvas tag: are we using it?

Dear Lazy Web (all 6 of you that read my blog in other words),

Are we still using the Canvas tag? I've been researching it, looking for a "cheap" way to do some simple graphics manipulation for Firefox-based browsers, and as I did I came across Apple pulling the patent card for Canvas. I remember seeing some radically awesome stuff done using Canvas but if there's a chance that it'll be pulled from the browser in the future because of the patent I'll be looking to use something else.

So, we using it or not?

PS: Blogger's fucked up Rich HTML editor doesn't escape HTML tags when you type them into the editor, so guess what happened when I posted this the first time?

Friday, December 14, 2007

The tools! Use the oDesk tools!

Wow, I totally cannot stress this enough: monitor your providers. If the job is really important, hire a project manager.

I was browsing through this thread on the oDesk community forums; posted a few months ago, but it recently surfaced again when someone posted a little ditty on "Providers that lie" further down the thread.

One problem both buyers encountered was the assumption that they didn't need to monitor their providers at all. It is vital to communicate constantly and ask for tangible updates from your provider when starting a new relationship. You don't know him, he doesn't know you. He might think he's doing "OK work" and in your eyes it's garbage. He might be trying to cheat you and sweet-talk his way out of it. You might not have explained your project clearly and now the provider is wandering astray.

oDesk has plenty of tools -- the work diary, the time analyzer, etc -- to keep you and your provider on the same page, but you have to use them to be an effective buyer. This is less of an issue once you and your provider have established a bond of trust, but before then you're just tenuous associates.

Another problem both buyers faced was not knowing the difference between the hourly model and the fixed-price model.

The hourly model is based on labor: they work, you pay them. This is similar to hiring a contractor to come paint your house. You pay him by the hour, he paints. If you're going over-budget, you can stop paying him, but that means he'll stop working -- even if he's only painted half the house.

The fixed-price model is based on the tangible end-result. You're not paying for the labor involved in creating the product

With both the hourly model and the fixed-price model, you have the same goal: completing the product. However, in the hourly model you pay for the labor to complete the product, where-as in the fixed-price model you're paying for the product itself.

By now, I'm sure you're wondering what this has to do with the thread I mentioned earlier. Here's the answer.

You can't refund labor.

You can't turn back the clock and give the provider his hours back. If he's been working on your project for 6 hours straight and suddenly you decide you don't like how it's turning out, you can't just straight gank his cash -- you can ask for a refund, and they may feel obligated to give you one out of a sense of professional courtesy (this happened to me with one provider), but not necessarily.

Ah, but what about fraud, right? What happens to cheaters?

First we have to distinguish the difference between fraud and disputed hours. Fraud means the provider was "cheating" -- they said they were working, but they weren't. No labor, no pay. However, disputed hours can stem from a few issues: maybe the provider was working on your project, but he wasn't working diligently because he was too busy chatting with his girlfriend by IM in the background. Maybe he was working, but doing it abnormally slow, trying to bill extra hours.

oDesk has policies in place for dealing with disputed hours and fraud. I've never dealt with disputed hours myself, but oDesk publishes their dispute policy online.

You're probably asking yourself right about now why you should bother with the hourly model at all. After all, isn't it safer to work with a fixed price project?


For complex projects, an hourly model is the way to go. When you use fixed-price, the more time a provider spends working on your project, the less they make an hour. So it's in the providers best interest to take short-cuts and be messy. For a smaller project, such as a personal website, fixed-price is much more suitable: the provider has plenty of time to finish the assignment. No need to rush or be sloppy.

An hourly model assures the provider that he has time to work on polishing your project and making sure everything is going as smoothly as possible. If a serious issue comes up without warning, he has the option of fixing it the correct way instead of the fast way.

To sum it up, let's say you're going to a restaurant:

The restaurant employs the hourly model to pay the chefs to cook food for the customers.
The restaurant is paying for the labor.

The customers employ the fixed-price model to pay the restaurant for their delicious meal.
The customer is paying for the product.

I hope that analogy made more sense to you than it did to me.

Anyway, use the tools. Keep an eye on your provider. Ask for tangible goods -- screenshots aren't good enough. If the provider says he isn't ready to set it up the project for you yet, ask the provider to use oDesk Share. oDesk Share allows you to view a provider's desktop in real time.

oDesk will connect you with qualified (and sometimes not) providers: it's up to you to manage them. If that sounds like hard, try to hire a project manager who will micromanage everything for you.

Man, I love me some bold text. Bold, yet smooth.

Wednesday, December 12, 2007

Logins! Logins! Logins!

A few days ago I received the IT equivalent of a battlefield promotion and suddenly found myself tasked with commanding and conquering a team of developers that I had to first assemble. I was given end-to-end hiring responsibilities, and since we decided to use oDesk to search for talented developers, it meant that I now had three accounts: provider, buyer, and now the enigmatic "Company User."

Also, there's this reality-bending feat:

Yeah, that's two of me. As if one weren't bad enough.

Frankly, what I need right now is some kind of keychain. I've got 3 logins for oDesk alone, and God knows how many more for various sites on the Internet. Hotmail, Yahoo!, Google... I know there's software out there to "coalesce" the experience, but that software doesn't integrate with the browser at all, isn't stored in the cloud so I can easily move from one computer to another seamlessly, doesn't have an easy-to-use every day interface...

Hey, I'm a PROGRAMMER! Maybe I'll make a website and Firefox Addin that does just that and become a millionaire. Man can dream, can't he?

Hm, I'll probably post more about the oDesk hiring experience later. Seems like good blog fodder, don't you think?

Saturday, December 08, 2007

oDesk Team Software vs Privacy Concerns.

You know, when I first started using oDesk Team (that's the software that monitors your keyboard / mouse activity and periodically took screenshots), I used to be super paranoid about what kind of pictures it was taking.

I was always staring at my Work Diary screenshots, mumbling to myself when I accidentally tabbed to the wrong browser window and oDesk Team happened to take a screen-shot right at that very moment.

Hasn't been like that for months, to be honest. Months? More like a year. Christ, how long have I been on oDesk? Feels like forever.

One thing I learned about the Work Diary's screenshots: Nobody cares. Nobody. Not unless you're cheating the buyer, or the buyer thinks you're cheating him, or the buyer's new to the system and is staring in wonderment at the screenshots page.

The real appeal must be that "safety-net" feeling for both buyers and providers: the buyer can't cheat you because you've got proof (work diary) that you worked those 8 hours, and the provider can't cheat the buyer because the buyer has proof the provider wasn't working at all (again, work diary to the rescue).

Don't get me wrong, providers try every once in awhile: you'll see an angry buyer posting on the community forums because some guy in Urbekestianiza was running a simple mouse macro and stole about $1k from this guy, followed shortly by oDesk personnel announcing they're "handling the issue." I suspect they've got some guy that just monitors the forums all day, waiting for those kinds of posts to crop up so he can alert the rest of the A-Team.

Honestly, I'm surprised at the number of "cheats" that still try to make some quick illegitimate cash. There's, like, a 2 week lag time before the money is actually available for withdrawl in your account, and then there's another 3-5 days for the withdrawl to be posted and end up on your Payoneer MasterCard or ACH-enabled bank account.

There are way easier, way more successful ways to scam someone out of money than trying to fool them on oDesk. The company is just way too alert and quick when handling these kinds of issues.

Back to the issue of privacy: eh? Seriously, what are you doing while you're working that makes you feel as if your privacy is being invaded? Typically when I'm working that's all I'm doing -- working. Not chatting, maybe listening to music, definitely not video-camming nubile young women.

Of course, maybe it is because I have another, dedicated work computer -- the one I'm typing on right now has a billion different windows I wouldn't want anyone to see. My work computer is completely clean: some dev tools, that's it.

This post went on way too long.

From the past, a blast.

Here's a post someone made about 6 years back: "Why Trillian Sucks"

Not all things open source go the way of, say, Ruby on Rails.

Right now when I see Jabber instant messaging mentioned I'm looking at an "ecosystem" of poorly written clients that, aside from the Google Talk system, haven't gained much tracton. I suspect that Google Talk hits the sweet spot because it integrates email contacts with live IM, voice calling (which, apparently, no other Jabber client has), reliable file transfer, and the fact that it was integrated into an existing product, which means at launch it had a few million users.

As I see it, the instant messaging world has stopped moving forward. No major, innovative improvements have happened for a few years. So, why is Jabber so far behind? They apparently still don't have a video / audio chat standard, or if they do there's no thrust to get them implemented into popular clients.

I guess what Jabber needs is an innovator: someone to blast into the Jabber instant messaging space, and drop all those features people are waiting for (audio, video, emoticons -- features regular consumers are waiting for) and leave the rest of the Jabber community in shambles.

Things on the 'net seem to work best that way. Firefox's destructive (marketplace-wise) rampage across the Internet is a testament to that. For the first time in a long time Microsoft started ramping up Internet Explorer development when they realized Firefox was here to stay. Why not the same with Jabber?

For now, though, I'm comfortable using three separate instant messaging clients. I got the resources to spare, and I gave up on Trillian a long time ago.

Friday, December 07, 2007

Having problems updating to Rails 2.0 under Windows XP?

Seeing this error while trying to install Rails 2.0?
ERROR: While executing gem … (Zlib::BufError) buffer error
gem update --system

Then run
gem install rails -y --source
and you're all set!

Yeah, I didn't know my RubyGems was that far out of date, either.

Wednesday, November 28, 2007

RSS advertising -- Google Adsense vs... that other guy.

In the TechCrunch RSS feed, there's an ad. Go ahead, have a peak.

That thing that looks like broken HTML is, in actuality, a Shockwave ad. It's some kind of mis-shapen video-player. Sometimes the splash-screen of the player hints at the video's contents, sometimes its just a big, black, empty rectangle. If you're curious enough to click the miniature 'play' button you'll be treated with a completely irrelevant video short that's too small and non-contextual to be interesting.

Now, check out Xbox 360 Fanboy's feed very carefully. Near the bottom. It's a Google Adsense unit, and it's blended so well you'd think it was part of the feed's content rather than an ad if it weren't for "Ads by Google." The ads aren't well targeted, but given the content that's to be expected. However, one thing the ads all share in common is the subject: they are all about Xbox 360s. All of them. They are appropriately in sync with the feed's overall content.

The ads running in the TechCrunch feed (I don't know whose they are -- they're just anonymous out of place blobs with no markings what-so-ever) are not.

It doesn't take a fool to see that the click-through rates on the Google Adsense units are going to be higher -- much higher, if only by the virtue of them being relevant to what the reader is interested in.

That's not what I want to talk about, though. The real question that's burning in my mind is why: why would you do that?

The blanket carpet-bombing style approach of advertising in TechCrunch's feeds is just a way to burn money. It's a swing and maybe-you'll-hit-maybe-you-won't. Since the videos don't even auto-play (god save whoever decides that's a good idea), it doesn't even work as a branding approach.

It's so... ancient. It smacks of old-school media who haven't caught up with the rest of the world. Did someone out there just forget about what made Google Adsense work? The contextual relevance? The small, unobtrusive ad elements that are easy to blend into content?

I mean someone really, seriously, honestly thought this was a great idea.

"Let's put video units in RSS feeds", they said.

"Let's make them tiny and hard to watch," added another.

"We'll make sure that there's no interesting splash screen on the player!" someone jubilantly shouted.

A part of me feels really bad -- I know they're not getting any airtime aside from the curious, "did someone really just do that?" viewer. Is this some kind of experiment? Do they want to see how many people will watch anyway?

I need to know. It's *EATING* me.

Someone tell me -- please!

Sunday, November 25, 2007

Hilarious blog that I've been keeping secret...

...but there's no need to keep it a secret now that the farce is over. In fact, since he's supposedly stopped blogging, it's only a matter of time until the hosting goes down and this precious gem is lost forever!

Here it is:

BeerCo Software Blog

If you're wondering what makes it so hilarious, jump back a few pages into their archive and start reading. I've been trying to express some of the funnier part into a few short sentences, but its impossible. You really have to experience it to get the funny.

The guy is basically a complete fruit-cake. It goes way beyond Linux fanaticism into "I'm gonna destroy Google with my mini-search!!!!" to dramatic pleas of, "I can't do all this alone! I need... more... power..."

Direct links of awesomeness:
* Talking about Rory Blyth of Microsoft Fame: "He worked 4 hours per day, then decided it was too grueling and quit."

* Begging Rory to help him complete his Google-crushing "mini-search" right after insulting his talents. Oh, he's not willing to pay Rory, though: "I can not afford to pay cash for a team to do this right now so you would have to do it based on earnings in December and so on from the time billing starts."

* His 'RentACoder Whitepaper' experiment -- I'd link to the actual RAC project, but he changed the description text so it's no longer half-way as xenophobic was it was before. (hint: before the change, he asked bidders to be ready to describe how poor they were and what it felt like having to 'dumpster dive' since they couldn't possibly live on 3k a month). Although, in the comments, he does say this about outsourced workers: "You never give something of high worth to desperately poor people. I’m sorry if that offends you."

* His last blog post is about the Canadian Government trying to destroy him. Alright, maybe I embellished a bit, but that certainly does come across in the way he writes it.

Anyway, have fun -- don't stay too long, it's funny but it'll waste your whole Sunday if you're not careful.

Thursday, November 22, 2007

Reminder to myself: Don't use LiteSpeed.

LiteSpeed: Crazy EULA; don't trust people who will model technology licenses around moral issues; might do something stupid and screw you in the future.

Also, dedicated server options: apache, lighttpd, nginx (prefer lighttpd if they ever support apache-style .htaccess). apache, mod_proxy, mod_proxy_balancer + mongrel looks good for Rails.

(why do I keep forgetting this?!)

Wednesday, November 21, 2007

VS2008 + .NET 3.5 is out!

Wow. I had no idea... I wasn't even tracking VS2008, and its already been released (RTM on the 19th of this month).

It includes .NET. 3.5 (which is apparently a 127MB download), which has LINQ, ASP.NET AJAX built-in, and some other stuff...

Well, that's pretty much everything I have to say about that. I'm still good with .NET 2.0 and Ruby (sometimes on Rails!) for my current projects. I probably won't upgrade / update unless a client specifically requests it.

I might take a better look at 3.5 when ASP.NET's MVC framework is released.

Monday, November 05, 2007

Using oDesk as a buyer: the other side of the coin

So, I recently created an oDesk Buyer's account -- I wanted someone to redesign the front-end of a website. I don't have the time, skills, or aesthetics sense to do it myself as quickly as I want, and so like all great Americans, I'm willing to throw money at the problem until it goes away. =D

I chose oDesk because I'm comfortable with how it works from the provider's point of view. There's a few downsides to having both types of accounts (they're not tied together Single Sign On style): you can't use the same email address you use as a provider, although if you're using gmail you can use an address like and it'll work.

Signing up was pretty easy -- took me about a minute, 30 seconds of which was trying to figure out whether it was a + or a - in the trick I just described above.

Lots of candidates, but I've noticed some providers just spray and pray -- not reading the cover letter is a good example of this, but inviting a provider to an interview and then having them cancel a day later due to them trying to "maintain their job application quota" is kinda like, "omg wtf?"

I've narrowed it down to about 3 providers -- I know for sure I'll pick one of them, so I wish I could close or hide the job entry so new applicants can't waste their time applying to it.

Also, interestingly, one of the provider's emails went straight to gmail's spam box. The weird thing is, nothing in the email seems like it would have marked it as spam.

Anyway, so far so good. It's kind of a pain working at oDesk + buying from oDesk, since I keep having to sign out of one account and into another, but, besides that, big thumbs up, yo.

Thursday, November 01, 2007


Just saw ScratchBack featured in this TechCrunch post. I just wanted to check it out, but it only took about 1 minute from account creation to having a fully-fledged widget! Not one to waste'em, I slapped one into my dashboard.

I doubt I'll get any tips, but ScratchBack seems like a nice way for more high profile bloggers to earn a little extra income on the side.

Thursday, October 25, 2007

Chumby - they're still doing that?

A couple of years ago I saw a device, somewhere, somehow -- some kind of digital wifi toy called a 'Chumby.' It was essentially a very small appliance that could display a variety of Flash-based widgets via wifi. Don't know what I'm talking about? Take a look at your Vista / Google Desktop Sidebar, and imagine those widgets being displayed on an LCD screen next to your bed.

Better yet, click on the link to visit their homepage - currently they've got a "live demo" up and a picture is worth a 1,000 words.

Pretty cute! But, I was honestly surprised to find the website still up. I first heard of the Chumby about two years ago (rough guess -- can't remember) and they still haven't started selling them to the public. Even now, they've got a live demo up to entice people, but there's no ETA on a release date -- just a big orange "contact me when they're available!" button in the upper right corner.

The Chumby to me seems like an impulse buy -- another gadget to play with. I would have bought one then, if they were available, and I would have bought one just now, if they were available, but they're not, and by the time they are I probably won't, because the idea will have lost its shine. (The urge to buy one just now was much, much less than what it was when I first heard of the Chumby).

Even stranger, though, is that their website looks like they're pitching the device hard. They've got a "store," their sidebar is pitching new and updated widgets... they even have a link to activate the Chumby they're not even selling to the public yet. Kind of surreal. Is this some kind of clique-only thing?


Either way, I'm bored talking about it now. See you when I see you.

Wednesday, October 17, 2007

By the way:

When I started working on my anonymous blogging platform / site / delicious sandwich, I switched in the middle of development from using Aptana to NetBeans 6. It wasn't supposed to be a permanent switch - more of a "feel out the waters" of a new IDE, but it worked very well despite its hungry-hungry hippo's approach to memory usage. Some obvious bugs -- Subversion commit message dialog barfs if you try to use quotation marks (" "), uses jRuby by default for its interpretor... but aside from that, very good user experience.

Thursday, October 11, 2007

My first public Rails site!

It's been awhile since I blogged about anything technical, so I thought I'd talk about a site I just prototyped.

It's a Rails-driven site. Top to bottom, its a pretty simple design, but I went through a lot (a LOT) of iterations before I found a design (front/back) that I found acceptable. Thankfully, Rails made this very easy. Ruby is as straight-forward as it can get, and so is the Rails framework. C#/ASP.NET feels a little wooden and artificial now, in comparison.

Speaking of C#/ASP.NET, I didn't really miss it when developing FearlessBlogging. I didn't have a moment where I thought "damn it, this would be easier in C#" or, "How come ASP.NET provides this but Rails doesn't?!"

Then again, the site I ended up deploying as pretty simple. I cut back on a lot of cool-sounding features that really weren't all that useful.

Oh, man, deployment was FUN.

Learning Capistrano before-hand was not. There seriously, seriously needs to be an updated Capistrano 2.0 tutorial for Rails.

I managed to hodge-podge it together from a bunch of incomplete Capistrano 2.0 blog posts and inferring some stuff from Capistrano 1.x, but still, was not the most pleasant of experiences.

After I got everything setup and stuff I could deploy the site with just a "cap deploy:cold" and it worked like a dream. I've updated the site several times since then and its always gone flawlessly. Using XP Pro, SP2, and no bugs reared up, so that was a relief.

Other than that, great experience: A++++, would work with again!

Yeah, I'm a dork.

Tuesday, October 02, 2007

Attack of the killer corporations.

(rant inbound - profanity - watch your six!)

This is a special blog post: it goes out to the McKibbon Hotel Group, Special Masters McMotherfucker, and anyone else who had a hand in trying to steal my parent's real estate.

First, let me address you old douchebags at the McKibbon Group, or the McKibbon Hotel Group, or whatever you merry band of motherfuckers go by.

For the purpose of exposition, I'm going to drop a backstory on the reader that is almost epic in its absurdity.

About six months ago, you greedy bastards appeared on my farther's door-step with a contract and a check for $7,000 dollars. You wanted a thin slice of property in Savannah that was easily worth a quarter of a million dollars – that's $250k, of which you were offering him, what, 1/35th?

Now, my father is old; he's a 60-something war vet who dodged every bullet but the ones hidden in every pack of cigarettes the government gave him. However, being old, black, and with emphysema doesn't make him stupid or desperate, which is what I'm sure you were banking on.

That DOES makes you racist, by the way.

However, being equally old and stubborn, you cranky douchebags came back with an offer he couldn't refuse -- $9,000! A generous, $2,000 increase! I'm sure one of you was wringing your old, crinkled hands as you cackled “LOL BLACK PEOPLE,” right?

Move forward.

First, you hit him with a lawsuit, because, apparently unwilling to pay market-value for property like every other self-respecting business on the planet, you were going to try and fucking STEAL IT FROM MY OLD INFIRMED FATHER.

Of course, after his lawyer (yes, he had one of those, as I'm sure you were VERY surprised to find out) hit you up with his response, you immediately tried to settle. A little better this time -- $103k, only 1/3th market value this time (property value only goes up with time!). Closer, but after all the hassle they put my father through, he wasn't willing to go a dollar lower than what it was worth – market value, not tax value.

I'll admit the next fuck-up was his lawyers fault – you wanted to use Special Masters McMotherfucker, and his lawyer, after consulting several other lawyers, then pouring over Special masters McMotherfucker's history, saw no reason to argue against it. That should have been her first clue something was wrong, but she seems like the naïve “this lawsuit is bullshit so there's nothing to worry about” type, so I don't blame her too much.

The ruling was in your favor – Special Masters McMotherfucker performed his task beautifully, recommending you be awarded the property with 1 legally vague reason padded by 2 bullshit made-up-on-the-spot arguments (arguing for things that aren't even required by law) that completely blew my father's lawyer's mind. Like I said, she's a bit naïve. Combine that with a judge that apparently rubber-stamps anything that comes across her desk, and you've got a slam dunk!

Yes, clearly he put a lot of thought into that judgment. I can't prove it, but I know what you did there, Special Masters McMotherfucker, I know.

Of course, they're appealing the decision – trying to take it out of the McKibbon Hotel Group's area of influence and somewhere impartial, which is good.

But, no matter what happens – win, lose, or settlement – this blog post is going to be on the Internet. Every time someone googles “McKibbon Hotel Group” or “McKibbin Hotel Group” or however you spell your awful company name, this blog post is going to come up. People are going to read all about how you tried to fuck over my parents, and it's going to leave a bad mental imprint in their minds.

It's going to be a testament to you thieving motherfuckers, and it's going to last forever.

Oh, and PS:

Go fuck yourselves.

Saturday, September 29, 2007

Rails plugin: optional parameters for partial views

Just "published" my very first Ruby on Rails plugin today.

Been using it in a personal project of mine for awhile.

Basically, its optional parameters for partial views, to make it a bit more clean.

render :partial => 'post', :locals => { :post => @post}, :opts => { :show_comments => true }

<% if opts.with_default(:show_comments, false) %>
Yadda yadda
<% end %>

Not much code, but its a simple idiom I found myself repeating (a lot) so I wrapped it up into a plugin.

Arron's rails plugins

Tuesday, September 25, 2007

Amazon Mp3: DRM-free music - I just popped my mp3 consumer cherry

Amazon MP3: DRM-free music. That means it works on any mp3 player. I approve!

Prices are competitive with iTunes.

Launched today. Lots of good music (my opinion, YMMV).

This is the first time I've actually bought an mp3 - I grabbed an MC Lars single, Hipster Girl.

I've never really been willing to buy an mp3 before because of the hassles dealing with the DRM if I wanted to back it up or anything (I go through more computers and MP3 players than I'm comfortable with), but since it was DRM-free grabbing some MC Lars tracks was obvious.

The experience was really good - the Amazon MP3 downloader was optional, but I wanted to give it a try anyway, and it was a really smooth downlolad, install, and launch.

Think I'll go back and grab some more tracks later on today, after I'm finished working. Amazon Mp3's prices are that sweet-spot where its just cheap enough to be a convenient way of grabbing mp3s. The DRM-free bit is what sealed the deal, because there's no way I'm dealing with that kind of hassle for more than 5 minutes.

Tuesday, September 18, 2007

An hour with CodeGear's 3rdRail product

I've been waiting for this one to come out -- sort of. It's been on my periphery, but I hadn't kept up with it until I got an email in my inbox touting the release.

First impression: weird name. Not very Google friendly, either.

Second impression: Looks like Aptana / RadRails. A lot. Mostly because they're based on Eclipse, but still.

So, I downloaded it about two hours ago, got it set up and everything -- they ask you to register for a trial key, but the software apparently will run for 5 days without a trial key.

I managed to slough through the whole 21 minute web video of 3rdRail in action before-hand. A lot of impressive stuff, but a few telling signs when the narrator quickly pages away from 3rdRail's RHTML editor. There's a good reason for that: the RHTML editor, like RadRails by default, is really quite awful. More on that later.

So, I've got the IDE cracked open in front of me. All Rails IDEs can handle the newbish "create project from scratch" scenario, so I ignored that completely and went straight to File --> Import. They're clearly expecting this: there's a wizard for importing an existing Rails project into 3rdRail with a few clicks.

On the initial run you've got to set up your Ruby interpretor, which should have been a straight-forward process (check c:\ruby\ first please, sheesh), but wasn't. Setting up the Ruby interpretor also required me to set up the "Interpreter system libraries," which it should have been able to parse from the Ruby installation directory, but didn't, so whatever, k-thx. It doesn't tell you exactly what it means by that, either, so I just picked some random directory and hit 'OK.'

I went back to check on it a few minutes later and the system libraries grid was filled with all the correct values -- apparently auto-detected after I clicked on the 'OK' button. Whatever.

The project import process is dog-slow: apparently 3rdRails does something "special," and by "special" I mean they need to consume about 100MB and waste 5 minutes before making the project available.

The IDE is pretty impressive at first glance: they've got a Rails-centric view of the project, where everything is neatly tucked away; you've got "layouts" (all your layouts), "models" (all your models), etc. Kind've like the raw folder structure, except inside, say, Models, you can drill down into a particular model and get all sorts of good information, like a model's attributes, the model's members, its associations and aggregations, too.

When you jump into a model / class, on the right pane there's an "inbound" and "outbound" section. Outbound shows what attributes / models / etc this model references, and inbound shows what attributes / models / etc in this model is referenced externally. When it worked (once), it worked great.

Unfortunately, this feature appears to be very buggy -- I've got a perfectly valid production site running on Rails. The 3rdRails kept vomiting up the most basic error of all: "java.lang.NullPointerException."



Check your freakin' nullables.

I get the error every time I "click through" source code, which makes it pretty hard to use the IDE.

On the upside, code completion is pretty good.

On the downside again, RHTML editing is crap.

No joke: you've basically got templates for common Rails idioms, but that's it. It's no good -- I gotta keep my head in HTML as much as I have to keep it in Ruby, so what they're giving me is just half the tools. But, surprisingly, 3rdRail's CSS editor is actually OK. Not sure what's up with that.

Aptana's RadRails ships with two editors for HTML: the default (god awful) RHTML, but also the most delicious HTML editor I've ever used in a free product. Change the default editor for .RHTML files to Aptana's, and you're kickin' ass and taking names. The CSS editor is, as well, pretty sweet. I would totally recommend stealing their HTML editor and integrating it into 3rdRail instead of what they're using right now. Take Aptana's CSS editor too, while you're at it.

Overall, it stacks up pretty fairly against Aptana, except for one problem: price.


Too much.

I would pay maybe $59.99, $69.99 for this software. It'd be a different answer if Aptana / RadRails wasn't available, and it is, and that's the problem - aside from Code Completion, Aptana has most of 3rdRail's touted features, all for the wonderful price of "free." That pushes Aptana into the "good enough" category for most developers, of which I am one.

Anyway, that's it. If anything interesting crops up before the trial times out, I'll probably blog about it in furious rage.

Back to hacking.


Friday, September 14, 2007

Blocking OpenID providers?

Oh, geez. I just saw this HILARIOUS nugget on someone's blog as I was surfing for information on OpenID (I'm implementing it for a website as a secondary login scheme).

This post is relatively meaningless; it's just some dude's vendetta against some other dude, so he blocks the guy's OpenID provider from using his blog. Whatever. The blog post is completely irrelevant because its all misshapen and skewed anyway, but thankfully that's not the important part.

The gold nugget, the priceless, sterling jewel of the post is in the comments section, where some commenters basically ask,

Isn't banning OpenID providers against the spirit of OpenID?

To which the author replies, verbatim,

How would the general users (i.e. non-geeks) know the particular provider/company is evil (which I believe is a good reason), unless they have problems using its services/products?

Thank God.

A moral authority for OpenID.

I mean, look, I can see blocking an OpenID provider for technical reasons like spam -- that day will eventually come -- but blocking one because you've got a beef, an arguably subjective beef at that, with the guy who runs the provider?

Man, come on, be serious. That is some serious high-school level drama there.

Even better, its not like people using the banned provider are going to be, "LULZ, MUST SWITCH PROVIDER."

Does he seriously, seriously think a "non-geek" is going to get another OpenID somewhere else, and now be using TWO OpenID providers? TWO? Now we're back to the whole problem of a different login for each site, because some motherfucker blocked another motherfucker, and started an iNuclearWinter.

At that point the value of having an OpenID (and actually USING it) quickly approaches 0, and we're back to jump again.

Thursday, September 13, 2007

WTF is with Windows Live?

I used to use Windows Live Writer on a semi-regular basis until they stopped updating it (publically) and its bugs / glitches became more and more of a chore to deal with every passing day.

But now it's been about a year, year and a half, and now I'm ready to give it a spin. I've got some things to write about on another casual blog I maintain, and I hate the web-based interface for writing on it, so I thought I'd give Windows Live Writer another spin.

So I go to download WLW (Windows Live Writer), but instead I get a generic Windows Live suite installer that insists on installing Windows Live Messenger (that I already have installed) and Windows Live Desktop Mail (that I already have installed).

All I wanted was the goddamn WLM software. Was that really so hard for Microsoft to do? There's no way to cancel any of the other items to keep them from installing; hell, the only things it prompts you for is, "Do you want to install our awful toolbar and equally bad bullshit homepage ? ? ?"

That aside, some of the Windows Live software is really useful, but I don't know why they even bothered with the ridiculous branding. None of the software interoperates in any way. In fact, I think the only thing they have in common besides the name is the toolbar flair.

Sometimes I wonder what it's like to work at Microsoft. From the outside looking it, it's as if the teams there can pretty much do whatever they want and the end result doesn't matter. Microsoft Max, a suite of software that doesn't work as a suite, Vista...

Well, that's it for now.

Thursday, September 06, 2007

Umbraco: Why, God, why?

Will someone please tell me what's the deal with everyone raving about this CMS?

I've spent about 6 hours with it and already I want to claw my eyes out.

I'm using 3.0 RC1 (the "recommended" version), and it's chock full of bugs that make the interface unusable with Firefox, and, thanks to good coding practices, about 2 crossbrowser UI bugs. How long has it been since you've seen a "modal dialog window," the unresizable kind, where form elements are actually out of view? Apparently not long enough, for Umbraco.

After surrendering to the inevitable and firing up IE7, I began to -- slowly very slowly -- enjoy Umbraco. You know, some rough edges aside, it's an OK CMS.

And then I tried to embed an image into a template.

Oh, yeah. I knew the programming gods had a grudge against me when I tried to perform one of the most simple tasks for a CMS and it failed miserably. Quickly, Google to the rescue! All over the web you find this: "well, you'll have to write an XSLT to get the image url and output an img tag, and then you just create a macro to call the XSLT and presto!"

No, my friends, no fucking PRESTO here. This is a CMS, the whole purpose of using one is so I don't have to hard-code shit everywhere. For some reason they let you pick out "Media" (images, files, etc) as a valid property type, but don't provide access, in templates, for you to grab the various attributes of the property, like, oh, I don't know, THE GODDAMN URL.

Seriously, why are you going to give me the ID of a JPG. What the fuck am I supposed to do with that? Really, what? How did you get to version 3.0 of a software product and decide that yes, that was a really, really good idea.

How does a CMS make it to version 3.0 like that? I'd like to say, "magic," but fuck all if magic explains why when I try to move a content node, the pop-up dialog closes but the content tree doesn't refresh.

I'm staring down the barrel of goddamn-what-the-fuck, and its name is "Umbraco 3.0"

But wait, there's more! Just when I thought it couldn't get any stupider: you can't turn off debugging on production mode.

Yeah, you heard me write (write, get it?!), you can't turn of debugging. A helpful work around includes doing some URL-rewriting if the user tries to hit the debug url, claims some page some where that conveniently isn't on the main Umbraco site.

In other words, Umbraco sucks.

This is all without including a ton of minor bitches I have, including:
  • the fact that the Rich HTML editor doesn't fucking Rich HTML,
  • something I like to call, "The Mystery of the Disappearing Quotation Marks" inside of the template editor (which, ironically, also sucks),
  • and what I tentatively refer to as, "An Awful User Interface: Are You Prepared?" when visiting the "Member's" section of Umbraco
What's funny was, the wizard for installing and setting up Umbraco was pretty decent. It's unfortunate that the rest of the CMS isn't as polished.

link juice:

Thursday, August 30, 2007

Dell Customer Support: at least they mean well.

Twice in the past two months my family has actually had to use Dell's customer support.

The first was for my HDTV -- the one I had was broken. It was a painless procedure; they verified my warranty was valid, overnighted me a replacement HDTV, and let me ship the old one back in the same box. Even was able to get DHL to pick up the heavy-ass box at my doorstep.

Good deal!

My mother recently ordered her two grandchildren mp3 players from Dell -- they were those new Creative Zen Stone, the Plus version. The mp3 players came to our house, first, then she mailed them off to the grandchildren with a birthday card, etc. However, after that, my mom decided to get them a Napster subscription so their mother, my sister, wouldn't go broke buying them music.

Except that the Stone mp3 players don't support subscription music.

So she rings up Napster and asks; they try to sell her on the pay-per-mp3 model. Then she rings up Dell, explains her situation; says she needs some MP3 players that support Napster's subscription music, that she needs them overnighted to the children so they arrive by their birthdays, and that she needs to return the other Mp3 players -- which are now located in Texas, a million miles away.

Dell is surprisingly helpful! The shipping is free; they'll overnight it to my sister to save time, and they even schedule a pick-up with UPS so that all my sister has to do is give the old mp3 players (in the box, with all accessories included) to some dude in a brown shorts when he comes to the door, and all will be well.

Well, unfortunately it didn't work out that way. The package arrived here, instead of in Texas (so now it'll get there late) and my dopey sister didn't have the packages ready to be picked up by the UPS guy.

Compared to what I've heard about Dell support, it was a pretty good experience.

Wednesday, August 29, 2007

I feel the need... alert you to the fact that Blogger's rich HTML editor is by far the worst I've ever used.

I'm lazy, and you should be too!

(rant inbound)

I just saw this post in my RSS reader (not sure where it originated from). It's a little ditty about how lazy some developers are, and how the Pyro desktop project had to change from Bazaar to Subversion because people were unwilling to install the Bazaar command-line client.


No, seriously, SURPRISE!

I'm lazy, and you should be too, because we've both got shit to do.

I've got work, you've got work. I've got hobbies, you've got hobbies.

In the small amount of free time I've got, do you really think its realistic that I'll learn a new technology to possibly contribute to a project that I might find interesting? Getting interest in the project is a stretch, but you want me to devote time and energy to something else entirely (another version control system)?

Better yet, the guy harkens back to a time when you'd check something out of source control and the build would be broken. Harkens. Maybe I'm too young -- I'm only 24 -- but the very thought of trying to get contributors for a project that won't even build straight from source control is ridiculous. I don't find the concept of ME having to fix YOUR mess because you were too lazy to make sure it works fun or productive at all. That concept is not enamoring, no.

Then again, I'm a firm subscriber to keeping your broken shit in branches and making sure every check-in to trunk works de-facto.

Anyway, back to the point of my rant, if it had one: unless the technology in question is so amazingly awesome you were going to pick it up sooner or later anyway, why should you have to bother? It's not my idea of fun, to be honest.

I've had very little free time to myself this year, so when I decided to pick up a new web development language/framework, I wanted something I could actually use without having to pick up a bunch of extra baggage along the way -- that's why I chose Rails instead of, say, Seaside or whatever that clusterfuck of parenthesis is. Rails, and Ruby, being the extremely straight-forward beasts they are, were a perfect fit: no extra bullshit to set things up, no extra bullshit to get started. You hit the ground running and it feels good.

If I can't hit the ground running with a OSS project, I'm not interested in contributing to it.


I always wanted to end a blog post like that!

Monday, August 13, 2007

Rails, Rails, and oh, what's that, Rails?

I can't stress this enough: Rails is _awesome_.

Recently I've been doing a lot of development in it and everything just works -- and when it doesn't, finding out where and how is infinitely easier than doing the same with ASP.NET.

Of course there are a few features from ASP.NET 2.0 I find missing in Rails -- the nested master-pages concept is one of them -- but not enough to keep me away.

The biggest thing I find lacking is of course a decent IDE. I've actually used quite a few: Aptana, Komodo, jEdit w/ Ruby plugins, SapphireOnSteel, etc.

I'm currently using Aptana a lot right now -- it feels really good to me. All of the important Rails features are exposed via the user interface, all Rake tasks have a description in the Rake panel for instance, and it supports debugging Mongrel and WEBrick servers via the debug-mode UI.

One thing that makes me kind of uncomfortable is the lack of any good intellisense -- typically I find myself paging back to Firefox for Ruby documentation. I'm used to "exploring" an API via Visual Studio / SharpDevelop's excellent intellisense features.

I don't need anything super special or super accurate, but it would make things a lot easier.

Aptana's "RHTML" editor sucks, by the way -- change it so that "RHTML" files are opened in Aptana's HTML editor instead, you'll thank me for it later. Do the same for "RJS" javascript files as well.

Really, the IDE just needs some polish (a bit rough around the edges, colorization occasionally fucks up when you're editing Ruby files) and it'll be a strong free offering in the IDE space, for whatever my word's worth.

Regarding Komodo, I gave it a few tries but I really wasn't feeling it. It sort of feels like the Ruby on Rails support has been tacked on to the IDE; a bunch of macros tacked onto the UI to run tasks, for instance.

Ruby in Steel felt a bit similar. It has great colorization support and its intellisense actually seems pretty accurate (the fact that it has it at all? SUGOI!). There's debugging support but, uh, I think everyone does that by now. The extent of its Rails integration seems to be one toolbar with a few sparse options, and some panels. I uninstalled the 30 day trial right after the "Rake" panel started appearing when I cracked open C# projects.

Ruby in Steel seemed to generate its own files -- database.yml, for instance, wasn't populated with the typical rails new app comments and etc. Oh, and it required me to input some database information before I could even create a project -- what the fuck? Annoying.

Aptana just feels like a right fit, even though work on its Ruby on Rails stuff seems to be going abysmally slow. We'll see what other commercial offerings start popping up in the future, and then you'll see me post something like this again -- but with much, much more bitching. ;)

Link Juice:
jEdit, jEdit Ruby Stuff
Ruby in Steel

Saturday, July 21, 2007

StreamReader: annoying design decisions in the .NET framework

You would be surprised the simple things that people forget to include in APIs that make using them very annoying.

Here's an example: StreamReader. Intelligently, StreamReader buffers, for performance reasons, input from the stream, so while you may only call ReadBlock() for 14 characters, StreamReader has read ahead 50 characters.

That's great and all, except they forgot to *support their own features*.

The most obvious problem is seeking: they didn't add buffer-aware seeking functions to StreamReader itself. So you have to dig around the underlying BaseStream to make the magic happen. Except that StreamReader doesn't actually check the current position of the base stream before it reads from its buffer.

So, when you try to seek on BaseStream, and then do a read, StreamReader happily (and very blindly) reads from its invalid buffer, thus fucking your shit up.

Apparently someone, somewhere, was vaguely aware of this, and provided "DiscardBufferedData()" -- one call to this and the buffer is emptied, so reading from StreamReader will pull the fresh data instead of the old data.

Except DiscardBufferedData() doesn't update the underlying stream's position. Oops!

So while you think you've read 540 bytes and the stream should be at 540, its actually at 560, because StreamReader buffered an extra 20 bytes for performance.

No big deal, though, right? We'll just see how much data was in the StreamReader buffer, and seek backwards that amount.

Or, we would, if DiscardBufferedData() had been designed properly so the discarded buffer size was the return value.

No biggie, we'll just check out the BufferSize property that the developers decided wasn't worth including as a class member. Shoot.

Of course, this isn't an insurmountable problem: you just have to keep tabs, manually, on where the stream position *SHOULD BE*, and then do your seeking calculations with those numbers in mind.

But, being able to work-around it isn't the problem: the fact that you *HAVE* to work around it is the big annoyance here. It's a "WTF PLZ" that shouldn't even be in the framework, much less having survived three iterations of .NET RTM.

There was a time where I would have sent that up as a feature request, but every time I visit Connect I see a whole bunch of feedback issues with the same replies from "Microsoft": "we can't fix this in time for X,Y,Z, but we'll keep an eye on it for future releases (not really)!"

I think I'll actually do it this time, though.

I'm a bit curious to see if or how they'll dodge it.

Thursday, July 12, 2007

Convert FLV's from YouTube into audio-only mp3 files.

Took me awhile to figure out how to make VLC do this right due to its clunky UI, but whatever.

You'll find this useful if, like me, you want to take a particularly long YouTube file with you on the go but you need it to play on your mp3 player as audio only (space concerns, the video on your media player sucks, whatever).

For your enjoyment:

You'll need:

  • VLC Media Player
  • Some way to grab FLV files -- I recommend VideoDownloader since that's the easiest way to get the FLV from a site like YouTube -- what's up with the VideoDownloader URL? I don't really know.
Download, and install VLC Media Player, and make sure it doesn't mess with your file associations.

Now, by default, VLC Media Player will attempt to always encode the video of an FLV and there's no way to change this behavior via the GUI, which is stupid, so we have to work around it using the command line -- don't worry, its really easy.

Make a new short-cut to the VLC Media Player by copying the short-cut on your desktop or if you're savvy navigating to %Program Files%\VideoLan\VLC\vlc.exe and right clicking + 'create new shortcut.'
Next, edit the short-cut. In the "Target" field, outside -- OUTSIDE -- of the quotations that contain the path to the VLC Media Player, type in "--no-video" (no quotation marks), save the short-cut, then rename the short-cut to "VLC Media Player -- No Audio" so you don't get it confused with the fully functional version.

Download a FLV and open it in VLC Media Player to make sure that everything's working. You should hear audio but see no video -- if so, you're a winner. If not, start over from step 1 and try again.

Now, open your FLV in VLC Media Player once you're ready to rock and roll -- either drag and drop it onto the VLC Player or open it via File --> Quick Open.

Click File --> "Wizard"

Select "Transcode / Save File" then click Next.

Select an Existing Playlist Item, select the FLV you just started playing, and click Next.

Check "Transcode Audio" and from the drop down list select "MP3" -- don't mess with the "bit-rate" option, even though I'm sure you want to. Click Next.

Select "RAW" on this screen and select "Next" again.

Click browse, enter a file name -- don't forget the .mp3 extension, that is IMPORTANT because VLC Media Player won't do this for you -- and click "Finish."

The VLC GUI will seem like its playing a file called "Streaming...", that's the transcoding process, don't touch the player at all until its finished. Yeah, I know it looks stupid. But, it works.

Your new mp3 file has been created. Congrats!

Sunday, June 03, 2007

Developer to Microsoft: WTF?

Profanity inbound: be careful.
(information gleaned from various blog posts -- hell, it might just be plain old _wrong_)

So, the saga of Jamie Cansdale's TestDriven.NET vs Microsoft pretty much hit its zenith with this post:
The license attached to their first letter was the one for "Visual Studio 2005 Standard and Academic Editions". It didn't matter that the license wasn't the Express SKU license because the wording is the same. What if it turns out that the reason I can't add buttons to Express SKU also applies to Visual Studio 2005? I would then be forced to take down TestDriven.NET entirely. What if it also means I can't use PopFly Explorer for Visual Studio Express? :-(

Typical check-mate move. I've actually followed the entire saga, even though I've been using VS2005 Standard; I knew that whoever at Microsoft running the operation against Jamie was having difficulty when they refused to name the clause that he was breaking; it was almost inconclusive when the argument suddenly shifted from "you're breaking the eula" to "you're destroying your business model" in a desperate attempt to create a rapport with him. That is not an avenue you explore when you've got the ability to move every Zig on your enemy -- talk about shifting goal posts!

Anyway, Microsoft's behavior up to this point had just been a gimmie: a clever coder had found something in the Visual Studio 2005 API that hadn't been removed from the Visual Studio Express editions and had used it to slip through the crack team of ninjas guarding the front gate, enabling a few very basic features on the way in... right?

Oh, wrong.

Oh, how GOD AWFUL WRONG I was.

Dan Fernandez wrote in a post made this post on Friday:
Some examples of these technical limitations are that there is no Macros IDE, there is no Add-In manager, and registered Add-In’s and Packages are not loaded at startup.
Let me normalize that for those in the audience whose bullshit detectors are broken:

"We removed the user interface for addins."

This is when I've realized that everything I've read about this situation was horribly, horribly wrong.

In a product distributed to MILLIONS OF PROGRAMMERS, they LEFT IN, excuse me, let me say that a little bit louder, they LEFT IN THE EXTENSIBILITY API.

This wasn't just a case of a clever hack that enabled some sparse functionality in the Express Edition products, this was a case of gross incompetence at Microsoft: they genuinely, sincerely thought that by removing the user interface they disabled access to Visual Studio's extensibility features. Somebody LOOKED AT IT, they EXAMINED IT, and then they gave it The Big Thumbs Up; a goddamn SEAL OF APPROVAL for a job well done. Right now, even as we speak, there's a "task issue" somewhere for the Express Edition products with a big green checkmark next to "Disable Visual Studio Extensibility API"

To be honest, when I read that part of his blog post my nuts almost fell off.

You know what that is?

You're developing the World's Greatest WebApp. It's a fucking, uh, I don't know, it brings the dead back to life. Now, somewhere during the development cycle, you add a link to the page that takes you to the Life or Death administrative page. I mean, you don't want anyone resurrecting Hitler or any of those douche-bags, right?

A few weeks later you're told to remove the functionality; you're going to host the administrative functions off-site so you can control who has access to it. Maybe you want to make the administrative panel a "for-pay" kind of deal. That's cool, right?

Now, if you're Microsoft, and you see "Disable admin interface" on your task list, what are you going to do?

Easy: you're going to go into a *.css file and set the link's style to display: none, and presto, problem solved.

Except the functionality still exists. People can find it browsing the HTML source, they can find it by guessing randomly; whatever the case, they can cut-and-paste the url into their browser and hit the administrative module without a damn thing to stop them.

Now, the worst part of this is, they (whoever is command and conquering the Visual Studio team) are saying that Jamie Cansdale is breaking a "technical limitation" of the Express products.

What the fuck? They left the functionality in the product. Their only technical limitations were:

  • Not allowing the user to the addin manager.
  • Not allowing addins to start-up using the addin registration "do-hicky" cuz it ain't there.
That's IT, that's the whole kit-fucking-kaboodle. The hell? They LEFT HIM a PUBLIC API. A PUBLIC, DOCUMENTED, UNRESTRICTED API.

It's a goddamn TREASURE, a hill of gold doubloons and jewel-encrusted chests strewn in the middle of a wasteland with a door -- just a door -- guarded by Steve Balmer and his bag of never-ending office chairs.

Sure, Steve will ward you off with some hard plastic to the face if you get too close to the door, but since Microsoft forgot to build a wall around its treasure, nothing stops you from avoiding Steve and his Door of Mystical Wonders entirely and just approaching from another angle.

The worst part? Nothing stopped Microsoft from just gutting the API or adding one single, simple line to the EULA that says, "You are not allowed to use the Extensibility API under any circumstances."

That's it. That's all it takes. Doing some goddamn work or paying your lawyers to do it for you.

"Oh shit, let's try and use this clause of the EULA that doesn't really apply because we were too fucking lazy to actually lock-down the extensibility API" is the worst, the absolute worst, you could ever do, because this is the Internet, it's 2007 and WE ARE WATCHING YOU IN REAL TIME.

And yet, because they are Microsoft, there is a very, very good chance that the next generation of Express Edition products will still have the API in place, the EULA won't have changed one word, and two years from now we'll be seeing this issue again because nothing will have changed.

Wednesday, May 16, 2007

Ruby on Rails.

I love it!

Seriously, I just got my first taste of RoR almost a week ago. It's an awesome framework -- I love the freshing 'it just works' mantra that it seems to be built on. Crafting an interactive website with Rails is _really, really easy_. The enforced MVC doesn't bother me much because it all flows together perfectly.

Only thing I wish for now is a robust IDE -- I'm using Aptana after having laughed off Komodo 4.0's lackluster attempts at a Rails IDE. I hear CodeGear is coming out with a good one, but the Komodo people called K4 'the first true Ruby on Rails IDE' so its probably not a good idea to judge a product by the marketing spin.

I have a project coming up that doesn't require any particular technology, so I think I'm going to give it a spin with RoR and see how it works when I have to use it for Serious Business. :)

Saturday, April 14, 2007

Visual Studio 2005 -- refactoring? What's that?

So, I'm sitting here, staring at a shiny new version of Visual Studio 2005 Professional, and I'm wondering what the hell is going on with the refactoring support?

First of all, the UI for them is awful: even though there's only a handful of them available, that's no excuse for them to always be visible in the context menu. Smart IDE? How is this smart?

Yes, that's real smart. Even better: try to select any of the invalid options. For "Reorder Parameters," you'll get the completely mysterious "The member is defined in meta-data."

I think it really meant to say, "DURRR, I'm sorry, I can't perform this refactoring because that's impossible and I'm _stupid_ for even giving you the option."

The worst part? SharDevelop 2.0's refactory options -- a free, OPEN-SOURCE .NET IDE, built by people in their spare time -- are just, in a word, superior. First of all, all the refactorings are context sensitive, which means I don't have to navigate an ugly morass when I'm trying to find the only applicable refactorings.

Secondly, there are more of them -- more and _useful_.

Witness SharpDevelop's refactoring options for an interface, for instance:

The options you don't see for the IStuff interface are: "Move to file IStuff.cs," "Rename," "Find Derived Classes," and "Find References."

SharpDevelop has TONS of useful refactorings that really put Visual Studio 2005 Professional's over-priced ass to SHAME. For instance, the whole 'PropertyChanged' event idiom for data-binding? SharpDevelop has a refactoring for that -- right click on a property and you'll have the option, "Create Changed-event," which will not only create a PropertyChanged event, but insert the code to invoke it at the end of the property's set method!

Then, right click on the event that SharpDevelop just created and you can create an On-Event wrapper.

See, that really pisses me off -- for as pricey as the IDE is, it doesn't come with a fraction of the useful refactorings some "hobby" IDE like SharpDevelop ships with out of the box.

If I even want to come close to those kind of refactorings I've got to drop almost $300 on ReSharper. Seriously -- the IDE is, what, $800, plus the extra $300 just to make it as functional as a freeware solution like SharpDevelop? Christ almighty, is there something _wrong_ with the Visual Studio team, to think that this level of functionality was good enough?

All that money and it doesn't even support Unit Testing and Code Coverage out of the box -- unlike, say it with me now, 'SharpDevelop!'

The only reason I even have Visual Studio 2005 right now is because one of my clients has developed an ASP.NET solution as a Web Application Project, which SharpDevelop doesn't support correctly atm.

Geez, Open Source sure has changed the playing field a lot. It used to be that commercial products were superior to their free counter-parts in every way, a reason why you'd consider the investment in a heartbeat.* But now, with projects like SharpDevelop closing the gap in terms of functionality with a price-tag of $0, it feels a little queasy to be spending $800+ on a product that only offers minimal improvements over the free alternatives.

Well, that's enough ranting for now -- let's hope the Visual Studio team aims a little (a lot, way a lot) higher for the Orcas release of Visual Studio.

* I've got a copy of Visual Studio 6 lying around here; back when I bought it nothing else could compare.

Wednesday, February 28, 2007

Up, up and to Vista!

I just ordered a new laptop w/Vista Home Premium installed.

To be honest I'm not particularly enthused about Windows Vista at all, but I have to have it for two reasons:

* comes with the laptop
* will have to develop for it sooner or later.

I considered Vista Ultimate for about 30 seconds, then saw this and decided not to bother.

Sunday, February 25, 2007

Thanks a lot, Debian!

I spent half an hour trying to get Ubuntu into 'CLI-only' mode. The first 15 minutes were logging out and looking perplexed as I realized there was no button on the login splash UI that dropped me to the CLI. I've never actually seen anything on Linux actually TAKE something from you. Hide it? Sure. Straight out TAKE IT AWAY? Yeah, that's new on me.

I spent the other 15 minutes setting up GRUB to boot into good old runlevel 2 so I could just arbitrarily boot into the CLI or the GUI if I wanted to, except that good-old Ubuntu gave me the "fuck-you" salute no matter what runlevel I put it on.

Then, joy upon joy, I find out that Ubuntu completely ignores whatever runlevel you set it to boot into!

Thank God for Ubuntu, without it I might have actually spent that half-hour doing something productive!


Fuck you Ubuntu.

Wednesday, February 14, 2007

SourceSafe is SourceSuck


Shit, I have had the extreme displeasure of having to fuck with SourceSafe via SourceOffsite which, let me tell you friends, after having used Subversion is like being fucked with a rusty butterknife.

There is simply no other way to describe the sheer agony of having to use this tool.

Do you know that its possible to do a project-wide diff and see all of the project files not in the repository, and YET THERE IS NO WAY TO ADD THEM FROM THIS VERY INTERFACE?


Just using it makes me feel like I've been blown back to the stone age of computing.

Oh, god, file locks. File locks. I can't EDIT this file because someone else MIGHT BE using it -- MIGHT BE. They might have locked it just because they weren't sure if they might need to edit the file, so they locked it anyway just in case.


Thank God for Subversion and TortoiseSVN.

tags: , , , ,

Thursday, January 25, 2007

Trillian rides into the sunset!

Well, on my computer at least. Today I work up, turned on the computer, and realized that although the AIM module connects properly, my buddylist doesn't show up, etc, etc, etc.

So today I'm officially "done" with Trillian unless their mythical new version pops out of nowhere in the next day and a half.

I'll give credit where credit is due: like 2, 3 years ago Trillian was tops. It really was the best thing in IM aggregation: file transfers, buddy icons, video / audio chat -- basically it blew everyone else out of the water, because of the features it had.

But networks evolve. So too should the client software, but not Trillian.

"Hey, let's share photos over Yahoo!"

"Sorry, can't do that."

Then I realized that it's a load of shit and I shouldn't be cramping my style just because Cerulean Studios isn't keeping up.

So I disabled the Yahoo! module in Trillian and logged into Yahoo Messenger.

"Hey, did you get my last MSN message?"


Trillian's been sproadically dropping MSN messages for as long as I can remember. The original client never does that. Why should I deal with a client that does? I installed Windows Live Messenger.

That left just ICQ and AIM. But now I've got AIM 6.0 running on my system because Trillian3 flaked out on me, and that just leaves the client running ICQ... a medium I never use but only keep because I might need to find someone from my deep dark past.

Here's the part where a voice in my head goes "CHECK OUT GAIM IT'LL BE AWESOME LOL" even though I should know better by now. Gaim is a minimalist client that supports only shared features across the networks. It's not really an option because I'm a social chatter; I use all those "stupid" features like audio chat, video chat, file transfers, etc. Obviously Gaim aims for a particular set of users that I'm not among. The same with Miranda-IM and the rest of the All-In-One instant messaging suites.

So I've gone full circle: I'm back to running almost all the original clients again. Different UIs, different styles... but for all that, they still work.

tags: ,

Monday, January 22, 2007

Another seemingly useless oDesk post

Been working on oDesk for awhile, mostly part-time stuff -- its proving to be working out better than the equivilent RentACoder experience (not to harsh on the RAC guys, but things get weird [for me] once you start doing $500+ projects).

oDesk turns out to be a lot more soothing a work-environment than the fixed-bid system of Rent A Coder, since it emulates "real life" in that specification changes don't make my face explode.

One downside is that there are not many one-off jobs on oDesk that might take ~1 week to complete. That's not really a problem for me since I'm not picky if a job is long-term or short-term; just as long as I get paid, you know? Small hit-and-run jobs would have been pretty useful when I was just starting out on oDesk, though. I'm not particularly interested in them now that I've established a "quality" (for online, anyway) pay-rate, but, you know.

Let's see, back in September I landed an ASP.NET 2.0 job that serves up $25/hr. Quoth the buyer, "Since you were already light years ahead ... in simply understanding the project..."

Great buyer, by the way -- knows exactly what he wants and where he wants it and how he wants it.

I applied to another job at the same time as the one I have currently, and the guy riddled me with a bunch of .NET API questions like he was trying to strafe a battleship with his Japanese Zero fighter-craft. He totally sunk my battleship because my brain just isn't In The Code unless I'm in front of an IDE or something. Also, he kept asking questions which implied he though I was mainly a WinForms guy (dunno where he got that from).

Curiously, he popped up a couple of times on Skype afterwards asking for a resume' I didn't have (in retrospect, should have linked him to my oDesk profile) and wanting to know if I did WinForms / etc work. I didn't really expect much from him at this point and didn't really persue the issue after answering a few questions.

The job he opened never closed (but he still appears to be interviewing coders after 4 months?!). I never got rejected from the job, either, although 34 other people haven't been so lucky. He seems to be trying to get Professional Quality Work at McDonald's Quality Prices, which in my opinion doesn't really work.

I like exciting and innovative stuff as much as the next guy, but I'm only going to work as much as you pay me too, you know? Still, these guys -- what are they, Styler Design? -- had a pretty awesome setup for their ASP.NET website. I'm still scratching my head and wondering why their tiered an XML layer on top of the ORM (Gentle.NET, NHibernate) layer, but other than that it sounded really sweet.

Outside of oDesk, been working sporadically as I deal with some personal stuff. Trying to get my groove back, but the funk-u-lator is totally busted.

For some reason I'm in popular demand, so I've been thinking of wrangling up my coding homies (still in college / high-school) and pimping them out. We could have an awesome name for an affiliate group; they'd work uber-cheap to get their names out there and attached to some quality work and I'd Get Rich Quick.

Oh, this is a cute story I'll share: worked with a small, recently started firm that was looking for some QuickBooks .NET API integration work. At first all they wanted out of me was research, prep-work as it were, so I pulled a few hours for them, reported back to The Mothership. Then... ... ... nothing happened. Four months passed, incommunicado, and then he pops out of nowhere and startles me with, "You still available for the QuickBooks integration stuff?"

I had to let him down easy with an, "Uh, that was four months ago, I've got priority jobs right now." He seemed genuinely surprised, as if he couldn't understand why I didn't reserve time to work with them on this project, even though four months had passed since we talked about it last. What, my professional life on hold for him?

Anyway, I suppose I miffed him because he Ninja Vanish'd on me and I haven't heard from him since, but I'm not really expecting to.

The firm still has an outstanding balance of $150, but I don't think I'll chase it.

Anyway, that's my blog post.

Deal with it.