Monday, March 24, 2008

Assorted bitches about ASP.NET and Ruby on Rails.

(all text belong is my opinion, not yours. Keep your goddamn hands off my opinion if you know what's good for you, buddy.)

ASP.NET is my wife, Rails my mistress

Little background: people consider me a .NET guru. I'm not, really. I'm just not as stupid as most of the ASP.NET developers you'll encounter in certain environments.

You can get any old average joe to start a new project and fuck it up from the get-go, but it takes a special breed of programmer to go back and fix the fucked-up project without trashing the parts of it that works. So it stands to reason that most of the contracts I get are dealing with fixing the sins of mysterious "precursor" developers.

The Precursors are a race of highly advanced developers, who shun the trivialities of modern day development as we understand them.

For instance, here is some world-revolutionizing code I found buried deep within the bowels of a project I inherited:

/* the following code has been anonymized; seeing it in it's true form might be too much for your eyes. */

public string IsValid() {
/* ... snip ... */
string is_false;
if ((bool)data["is_false"])
is_false = "0";
else
is_false = "1";
return is_false;
}
/* The only consumer of IsValid is buried deep, deep within another function. Here is the relevant bits */

bool is_valid = false;
string result = IsValid();
if (result == "0")
is_valid = false;
else
is_valid = true;
Zen.

Now, imagine an entire project architected more-or-less in the same fashion, and you'll know what most of my work-life is like.

That's half the problem. The other half of the problem is that I've used Ruby on Rails.

Don't get me wrong. I like ASP.NET. We get along fine. But I love Rails. The "run away to France with her" kind of love.

Have you ever been sitting there, hacking away in ASP.NET, watching this block of C# code get longer and longer... then, for a moment -- just a brief, fragment of a moment -- think about how you would have done it in Ruby. That, friend, is a moment of utter infuriation, a moment in which you realize that Ruby + Rails would have been 2 lines of code, max (4 if you have a brain-exploison) and you're on your 20th or 30th line of query-string manipulating twisted logic because the people who created ASP.NET haven't actually used it for any extended period of time outside of the "PetShop" scenario.

That's the only way I can explain why some of the ASP.NET framework is the way it is: they designed first, used second. Designed for programmers by someone else.

ASP.NET: "Making the easy things hard, and the hard things possible."

Yeah, OK. Whatever.

Don't get me wrong. ASP.NET isn't awful. A lot of sites run ASP.NET. Like, uh, MySpace. I just find that when you know what you want to do, you can't just go for it. There's always some stumbling block in your way. It's like being in front of your destination, but walking 2 blocks to the left, taking one block forward, then walking the two blocks to the right to get there. Uncool.

But, that's my opinion. Your mileage may vary, and probably does. I get 45/48 miles to the gallon, though! WOO HOO!

By the way:

CodeSmith, what the fuck?
CodeSmith is apparently some kind of code generation utility. People make templates for it and crap -- shit I've never really cared about until some developer I was working with but not monitoring closely enough ("He's a big boy, what's the worst that could happen?") decided he was going to use a proprietary solution for our project's ORM stuff.

Specifically he used .netTiers, which is free, but since .netTiers can only be used via CodeSmith,
it is essentially proprietary.

I only discover this a month or two later when a million thousand bugs crop up because the developer has left but forgot to update the DAL / etc before he left. Yeah, that's totally my bad. Whatever, though, right? All I have to do is run the generation utility. I download .netTiers, find this CodeSmith thing and then realize it's a closed-source application we didn't have a license for.

Part of that is my bad -- he was jumping up and down going ".netTiers is the BEST!" and I was like, "whatever dude, just get it done." In retrospect, considering the damage he's done, if I could go back and change it all I'd start by throwing my car at him if I thought it would go the distance.

Anyway, CodeSmith has a 30 day trial -- no big deal, we only need to regenerate once for now, and we can migrate to a free solution later: the .netTiers crap is way too convoluted for a project this size anyway.

What happened next totally blew my mind.

OK, OK, wait, alright, first the program hung for about 5 minutes before spitting out a raw exception on what is easily the most base and obvious error you'd expect an application to catch, and display nicely, but the mind blowing happens right after.

BUT RIGHT AFTER THAT

The program's generation suddenly stops, politely informing me that my 30 day trial only works with sample databases.

Yes, you heard that right...

Someone went to all the effort and dedication to make an application run off a 30 day trial, but then restricted the 30 day trial to sample databases, so actually trying it out is impossible.

How. Useless. Is. That.

It took me a few minutes to figure out why they did this: essentially it appears that people use CodeSmith because the guy before them used CodeSmith and the guy before THAT guy used CodeSmith -- generational crap, basically. I've read stories about it and stuff but never walked face-first into it before until now.

For those of you slow on the draw, or not really sure of what I'm talking about:

Imagine downloading a game demo. After installing it, you eagerly double click the icon.
However, instead of being plunged into ZOMBIE SMASHING MAYHEM, the splash screen politely asks you to buy the full game if you're really interested in zombie fun, and then starts playing a low-resolution video of other people playing the game.

Yeah, it's that stupid.

Anyway, I just bucked up and spent 20 minutes tweaking the generated files by hand. We'll be ripping out all the .netTiers stuff and replacing it with SubSonic or w/e at some point in the future no doubt.

Monday, March 17, 2008

RSS vs Atom

So, who won?

And what about Media RSS? It looks useful, but is there broad support for consuming it?

Man, Google has never failed me more. Seems like no one is talking about Media RSS.

Sunday, March 16, 2008

My six hours is your eight -- or, why my working hours are better than yours. :3

Snazzy title, eh?

So, just a few months ago I had someone quizzically ask me why I was only billing 30 hours a week -- while their salaried employees clocked a steady 9 to 5, 40hrs/wk. Wasn't I being unproductive by almost 10 hours less?!

Well, as the title states, that's because my six hour workday is equivalent to your office's eight hour workday.

Let's answer this question with some math.

First, your employees have lunch breaks, right? How long is that? 30-45 minutes?

So, really, right from jump your employees are only working 7:15 a day instead of 8.

But they clock in at 9 and leave at 5, right? If they're not overachievers (nothing wrong with you guys xD), that means they came in at 9:00AM and left at 5:00PM. So, how long did it take them to get up and running, getting setup, etc, etc? 5, 10 minutes? Likewise, they have to get ready before they go -- that's another 5, 10 minutes, to shut down their computers, clean up their desk, put away their things.

So, we're down to about 7 hours of work in an 8 hour workday.

Except it's not a straight 7 hours of work, is it?

Your workers take frequent breaks throughout the day. Sometimes they get up and go to the water cooler and talk for 5 or 10 minutes. Sometimes they just zone in-and-out throughout the day because you won't stop bothering them (stop bothering them, seriously, they'll do their TPS report later). What about when they take breaks to stretch and clear their head? Or when they need something from a co-worker that's busy with something else?

Before you know it, your fabled 8 hour workday is really 6 hours of work and 2 hours of interruptions, breaks, lunch, and snacks.

Now, consider 6 hours of work for a contractor -- 6 hours of uninterrupted work. Well, it is interrupted, by lunch, dinner, and assorted breaks, but we're not billing you for that, are we? I don't think you'd be too happy with seeing "LUNCH BREAK (BRK/LNCH)-- 1 HOUR" on your weekly invoice anyway.

When the invoice hits your inbox and it says your contractor "only" worked 6 hours a day (30hrs/wk remember?) that means we're working more-or-less the same amount of time your salaried employees do, except it probably cost you less.

So, there you go!

PS.
The numbers might be slightly exaggerated. That's because I'm terrible at math.


Saturday, March 15, 2008

ATTN: AMAZON.COM

Get with the program already and let me pre-order mp3 releases and other digital downloads.

I can't put them in a wishlist, I can't "favorite" them somehow so I get alerted when they're released. It's totally not cool. I want this techno album that's not available until the 18th, but I keep forgetting it exists. ;(

Wednesday, March 12, 2008

Rails IDEs: NetBeans vs Apatana RadRails, take 2

If you're like me, you stopped using Aptana RadRails right around the point they went closed source and started rolling with NetBeans instead, which at the time was an arguably superior IDE that was also free, cash-wise. I guess most of us figured that RadRails wouldn't be getting any serious love after it's acquisition / whatever.

Well, let's time-travel to March 11th, 2008, where, suprisingly, Aptana RadRails 1.0 was released.

This is completely subjective opinionated review of NetBeans + Ruby vs Aptana RadRails, free version vs free version. I don't particularly care about what's a part of Eclipse or what's all Aptana, FYI, so take that in mind. In fact, I'm writing it up as I use it on a project right now.

Some stuff I like about Aptana RadRails:
  1. * Faster than NetBeans. Waaaay faster. Loads faster, runs faster.
  2. * Less memory usage than NetBeans.
  3. * Faster, "locks up" less than NetBeans. Also, no "Mystery of the Disappearing Cursor / Caret" issues.
  4. * Visual unit test results.
  5. * Immediate window during debugging! Wah-hoo!
  6. * Error checking puts a red 'X' next to files that have errors in them. Baffo!
  7. * Subversion interface is better than NetBeans by a long mile. It's Subclipse, but whatever, it rocks.
  8. * Sweet toolbar menu that lets you jump to view / test / model / controller associated with a file at the click of a button.
  9. * "Outline" view is a bit better than NetBeans.
  10. * Tag matching in HTML files works better than it does in NetBeans, which often just gives up without warning.
  11. * Love the Servers view.
  12. * Love the Rails Console stuff.

Some stuff I hate about Aptana RadRails:
  1. * Migrations suck. NetBeans gives you a killer database migrations context menu where you can select the version number for quick up/down migrations.
  2. * No clear way to import an existing Rails project (I only figured it out because I had used Aptana RadRails at one point in the past).
  3. * Immediate window during debugging needs some serious, serious polish. Seriously.
  4. * Have to press a button and wait like 20 seconds before the help text for a rake task appears. Would rather seem that text inline or somewhere easy to glance over.
  5. * Have no idea how the Rails Plugin tab is supposed to work. Looks pretty, though.
  6. * By default, Ruby Explorer view shows active gems... clutters up the UI quite a bit when you're dealing with a non-trivial project.
  7. * NetBeans has way better string editing support. Highlight a string in NetBeans and press " and the entire selection will be surrounded by quotation marks (foo bar --> "foo bar"). Highlight inside of a string and press # and you'll get insta interpolation ("foo bar" --> "foo #{bar}").
  8. * Some syntax highlighting isn't as nice as it is in NetBeans. Navigate to the end of a paraenthesis or an "end" statement; both do highlighting in NetBeans, but Aptana only handles the former. That's a pain when you're trying to sync up "end" statements after a long night of work.
  9. * Doesn't open up files generated by script/generate by default, which is annoying, because why wouldn't I be ready to edit the files I just generated?!
  10. * Still a really annoying issue of certain lines being highlighted in gray for no apparent reason.
  11. * In general, colorization inside of Aptana RadRails sucks. Out of the box, NetBeans is much better at this. NetBeans is easily the best if you go for the optional ruby colorization plugin recently offered. I'm poking through syntax coloring options right now for RadRails 1.0 and it doesn't seem like there's any way to extensively customize it into something less sucky.
  12. * Error checking is hit-or-miss. Doesn't seem to refresh fast enough -- if I make a modification to a file that causes an error and quickly fix it, occasionally the error tag never goes away -- or it changes to report an error on perfectly valid syntax.
  13. * I just got a freakin' exception as it tried to perform code completion ("Content Assist"). Man, 3rdRail did that shit too. SWALLOW YOUR EXCEPTIONS. Log them somewhere or something. I was busy coding something when you the exception popped up. Not cool.

That's about it.

RadRails is OK, but I think it needs polish in general. As I understand it RadRails 1.0 was a one-man mission; not trying to harsh on the guy's work, just spittin' it as I see it.

I've gotten so used to NetBeans 6.0 and its creature comforts that I find coding in Aptana RadRails to be a real style-cramping exercise (I just finished up what I was doing in RadRails so I could switch back to NetBeans just now).

Your mileage may vary.

If you're using NetBeans 6 for Rails development, seriously consider getting the "Extra Ruby Color Themes." The Dark Pastels theme is a winner.

Friday, February 15, 2008

Jangl needs some work.

Jangl is a site / service for free web calls without divulging your personal phone number.

Just tried to use a site that partnered with Jangl to facilitate free but anonymous phone calls, was not impressed.

I didn't even get past the setup -- hooking up with Jangl requires you to call their number, which is a super wtf in and of itself -- it's the only phone-based authorization system I've ever seen where you have to initiate the process. It also introduces a number of errors into the process, which is why I never got past the setup.

If you own a mobile phone you'll notice that sometimes your number shows up on caller ID / etc as missing the "1" in front of it, etc, if you're making a call to a number in the same country. This completely breaks Jangl's setup process, which tries to identify the phone you're calling them with using "1-555-555-5555" while your phone shows up as "555-555-5555" if you're both in the same country. That is why most phone verification systems call or text you -- easy work around, same result.

I've only encountered one other system that worked like Jangl does, and that was my credit card company -- it is a very bad one, if you're wondering.

Also, OH MY GOD WHAT IS THAT MUSIC ON THEIR HOME PAGE?


Anyway, rant /off.

Tuesday, February 12, 2008

ActiveRecord + Legacy DB + Ruby script: what you need to know

Some things you should know when you're going to be using ActiveRecord in a generic Ruby script:

  1. Make sure to require 'rubygems' <-- I forget that part a lot for some reason.
  2. You MUST set ActiveRecord::Base#logger to an instance of the any Logger class. ActiveRecord won't take care of setting ActiveRecord::Base#logger to an empty dummy class -- you'll get a bunch of Nil-based errors if you forget this.
  3. ActiveRecord::Base#establish_connection --> takes the same parameters you'll find in a database.yml.
  4. If you want to mess with SQL Server, make sure to grab the latest adapter: gem install activerecord-sqlserver-adapter.
  5. If your legacy table is a_details, the ActiveRecord model will be ADetail.
  6. If you want to access the column RelationID, it is ADetail#RelationID <-- easy.
  7. If your legacy DB has a wonky naming scheme for primary keys (and it will), you need to use set_primary_key in your ActiveRecord model.
That's it. Who said you can't talk to legacy databases with Rails?

Happy sailing, yo.

UPDATE:
For the LOVE OF GOD don't forget gotapi -- it is a big bucket of win.

Friday, February 01, 2008

Attack of the Social Networks.

I never really was a fan of social networking, but a few weeks ago I just couldn't resist it anymore.

I actually got a Facebook and a Pownce account. Also have a LinkedIn account as well.

What happened? No, freakin', idea. It was just a strange compulsion I got one day. "HEY WHY NOT?" is how it went, or something like that. I think I have enough accounts to quell myself, though...

Wednesday, January 30, 2008

Skynet vs Starling?

Trying to understand the difference between the two and what scenarios it'd be best to use them in.

Any help?

I'd get a Pownce or Twitter account but I don't have any friends. ;)

EDIT -- looks like I figured it out myself. ;)

Put SkyNet on top of Starling and off to the races you go.

SkyNet can be configured to use different message queue systems. Starling is just such a message queue system, apparently robust enough to run Twitter (or not, when Twitter's down).

linkage:

SkyNet -- implementation of an algorithm Google uses for distributed computing.
Starling -- what Twitter uses.

Wednesday, January 23, 2008

Good old Internet Explorer to the rescue!

Making canvas-based Identicons work in Firefox: 15 minutes.

Making canvas-based Identicons work in Internet Explorer: 3 hours, 25 minutes.

I was - - > < -- close to just dropping IE support for the feature, too!

Thursday, January 10, 2008

The browser giveth, and the Silverlight taketh away

I've been learning about Silverlight recently. One issue has been bugging me, though, and that's what I called my post on the silverlight.net forums:

Enhancing websites with Silverlight without crippling functionality.


As a quick example of this, check out the Silverlight homepage. If you've got Silverlight 1.0 installed, there's a really neat menu -- slick and usable. However, you can't: drag and drop any links on the menu to a new tab, can't right click it to get The Usual Suspects (Open in New Window, Open in Tab), and you definitely can't right click it to open the links in the background.

So, the menu is aesthetically pleasing, but it's lost a lot of functionality I've come to take for granted. The worst part is, this menu could have been implemented using some rich Javascript -- it would have been a lot more harder, but it still could be done, and you'd still have all the browser-based capabilities you're used to.

Flash has the same annoying limitations, too.

The ultimate solution in my opinion would be better integration with existing HTML elements -- you'd tell Silverlight or Flash, "this region should be treated as an anchor-tag," and when the plugin finishes processing, it adds an invisible anchor-tag to the page, layered on top of the specified region. The browser sees it as a generic anchor tag with absolute positioning, so gives you the standard options when interacting with it, the user sees it as whatever the hell you wanted it to look like in the first place.

Win-win for everyone, right?

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?

Maybe.

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
Run
gem update --system
first.

Then run
gem install rails -y --source http://gems.rubyonrails.org
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.