Wednesday, December 31, 2008

Preoptimization in real life.

So yesterday I went down to my local Subway (we actually have 2, but I don't go to one of them because it's a pain traffic-wise), and got in line. I had plenty of time to decide what I wanted; about two minutes since the small family in front of me was taking their time.

No sweat, even though I picked out what I wanted in about 10 seconds.

I spent the rest of the time thinking about how to phrase the sentence,

"I want a foot-long Subway Club on wheat."

But then I thought to myself, "If I say I want a foot long wheat Subway Club," she'll be able to get the sub bread before I finish speaking. Then I realized that, although that sentence is understandable, it is not very "correct." Would she understand immediately, or would it introduce a further delay in my sub making adventure? On the other hand, even if she did understand it immediately, would she even be able to react in time before I finished the sentence? Was the optimization even worth it?

I totally wasn't paying attention by then, so when she said "What do you want?" I kinda jerked in place and replied,

"Uh, a subway club. On wheat. Foot long wheat."

Tuesday, December 30, 2008

Importing OpenOffice files into Google Documents: Don't.

OR: what to do when Google Docs screws up your formatting (see end)
Seriously, don't do it.

First of all, the file upload size is much too small -- there's some ridiculously small cap, like 500kb. I got a document here, 1.1MB -- all text -- that just can't be imported. So now I got some documents in Google Docs, some documents out.

Secondly, and most importantly, Google Docs totally fucks up imported styles. Witness:

Now dude, I love me some Google Docs, but that just isn't fun. The only way to fix it, as far as I can tell, is to just "rewrite" those particular lines all over again. But I've got an entire document full of them and it ain't pretty business.

If I could do it all over again I'd just do a massive C/P job, which seems to preserve the formatting.

Still, it's not enough to make me give up Google Documents, which is excellent. I just hope they keep better backups than I do.

UPDATE:

I've cleverly deduced that for some parts of the document, Google Docs doesn't have a font set -- eg, you click into a paragraph and the 'font' drop-down is empty. If you select all of the document contents and set the font to something like Veranda for the whole document, it seems to correct the graphical glitches. Of course now the document doesn't look quite right, and it's still missing the linebreaks that the original document had, but at least now it's readable -- and, editable.

Saturday, December 27, 2008

Flex file uploads: no custom HTTP headers for you!

Stubbed my toe on this recently.

For some reason (unexplained, and it seems unlikely that this is an actual security issue) you can't have custom HTTP headers for file uploads in Flex 3.2 (possibly Flash as a whole). They state it in the documentation, to their credit, but it's more of an aside, tucked away at the end of an irrelevant paragraph, than a big red "HEY WE JUST CHOPPED OUT SOME FUNCTIONALITY YOU'D NORMALLY EXPECT TO BE THERE" warning.

For half a minute I thought I was in ruby and said to myself, "I'll just override this and inject the custom headers myself," then I realized where I was and went "D'oh!"

Monday, December 22, 2008

Aptana: Changing Ruby Interpreter on a per-project basis?

Anyone know of a way to change the Ruby Interpreter in Aptana for each individual project?

I've been wanting to give it another test drive and see how the latest version compares, but for the life of me I couldn't make this one simple thing happen. I've got multiple projects in both Ruby and jRuby, so not being able to easily switch is a big big pain.

I got as far as the "build path" bits, but I couldn't make those dance the way I wanted so I gave up and went back to NetBeans 6.5. Which works perfectly, but I'm not a fan of the default directory structure. If you use the "files" view instead of "projects" you lose a lot of functionality. :/

EDIT: "why not post on the Aptana forums?"

Because I forgot my username and password. And you can't get your password without supplying your username for some fucked up reason. So, basically I'm locked out of the forums. :)

"The Chrome."

That's what my mother's started calling The Internet ever sinced I set her up with a copy of Chrome.

She says, "Hey, have you been on The Chrome? Why don't you put The Chrome on dad's laptop, too?"

She misses one feature: auto-fill for forms. She found a toolbar somewhere that did it all by herself, and now she really mimsses it.

That and Hotmail support. She is not happy she has to go back to using "the blue one" for Hotmail.

Thursday, December 18, 2008

ThoughtBot Shoulda -- It Whups the RSpec's ass.

Anyone remember that?!

Heh, heh. Yeah, back when people used WinAMP... I guess they still might. I switched to WMP (gawd, I know), but then to Songbird when it finally stopped sucking (still sucks a little, to be honest).

Anyway, for newer Rails projects, I've completely replaced RSpec with Shoulda. It's nice, clean, readable, doesn't add anything extra to the Rails folder hierarchy, and best of all, it is filled with sweet-as-hell macros that take a lot of pressure off'a my tired fingers.

For non-Rails projects (I do those too!), they offer a gem, but I haven't used it yet.

It seems like every day that something exciting and awesome happens in the Ruby / Rails area, and everyone moves up to the next big thing... but I think that's because the next big thing is better than the thing you happen to be using at the moment.

Wednesday, December 17, 2008

SaaS RailsKit: I've hit my first WTF, and I don't think it will be my last.

(an hour in)

WTF #1: the way the database is boot-strapped.
WTF #2: "accounts.full_domain" -- ?! Yay for adding, requiring, and building code around things that not every SaaS app is going to need!
WTF #3: rdoc, motherfuckers. Get some.

Update:

Ugh. This thing was clearly modelled around 37signal-style SaaS. I can probably use most of it and just use dummy values to satisfy the bits that won't be used, but still.

Tuesday, December 16, 2008

"She's dead, Jim."

Awhile ago if you had asked me about free, super-easy Rails hosting, I would have blown your mind by mentioning Heroku -- cloud-based Rails hosting. FREE cloud-based Rails hosting.

Lately, though, I'm not so sure.

Check out the Heroku Google Group. There are a lot of complaints there, and no one from Heroku is talking. Seeing "my website has been down for 4 days," and then seeing another say "mine too" without any response from the Heroku team is enough to put you on edge. But, maybe these issues are getting handled, and they back-and-forth just isn't taking place on the group. If so, maybe Heroku should think about having their own ticket system or something in place, because as it stands now, all the unaswered complaints are casting a bad light on the service as a whole.

All that considered, if you're looking for an extremely easy way to deploy a trivial little app, Heroku might be for you. I've got my own VPS, but lord knows using Heroku would be a lot easier... but I'll wait until they come out of beta for that.

Monday, December 15, 2008

Using jQuery with Dojo?

Can someone come up with a really good reason for me not to use jQuery with Dojo?

Because the way I see it, jquery + jquery-ui is pretty fantastic, so throwing in dojo when I need something a bit more powerful (dojox.gfx anyone?) seems like it could be a good fit.

Dojo seems to keep their stuff locked tight in the "dojo" namespace, so I don't see any collisions happening, but I've given it just a glance.

Saturday, December 13, 2008

Rails Plugin developers: *PLEASE* don't use Prototype's $() syntax in your plugins!

One of the very first things I like to do when starting a project from scratch in Rails is to throw out Prototype and bring in jQuery via jRails. Look, I love me some Rails, but I hate me some Prototype -- it's like someone spilled their goddamn Java over my sparkling Ruby somehow.

Not cool, man.

Anyway, the thrust of this post is about not using Prototype's shorthand syntax when developing plugins that include UI elements. I name no names, but a few plugins take for granted that you'll be using Prototype throughout your project, and so use $() with reckless abandon. That's fine and all except when you're not using Prototype everywhere, and are trying to use jQuery's sweet ass $() shorthand instead.

I realize that jQuery comes with a no-conflict mode for situations like this, but it'd be cooler if plugins kept themselves as abstract as possible, or just stuck to Rails Javascript generating code instead.

Thursday, December 11, 2008

Feeling stuck? Self-loathing? Shoe-gazing?

Think life can't get any worse?

Have a good read through the Black Hat SEO forum.

If you're in a REALLY bad mood, time-travel back to the last time Google nuked a swatch of spammers from their index and read through the complete hysterical narrative.

I mean, I was feeling pretty crappy earlier, but when you read about some guy about to go homeless because Dreamhost busted their account for spamming, well, you know, it puts things in perspective.

I guess if you're a sadist you'll enjoy the fact that most of these people spend 2-3x the effort making 1/3rd the money most people make doing a regular job, but whatever.

Wednesday, December 10, 2008

Flex / Adobe AIR == Ninja / Pirate

I didn't know, until I downloaded Tour De Flex, just how badass this technology was.

Browsing through the sample demos, I realized you could really build a regular desktop application using these technologies. I mean, I've hammered-out plenty of C# applications that could have easily been Flex + Adobe AIR applications if they had been around back then.

And the install badges for AIR applications? It is, literally, out of this world. I haven't seen an install system look and feel so fluid since 3-4 years ago when I was looking at mockups of web-based Linux package installers (Autopackage?).

The big "killer" is the lack of a freely available IDE. Since Flex's MXML can be done by hand, and ActionScript is basically Javascript with a few nice add-ons, you don't really need anything advanced -- a nice text editor can do wonders. But since Flex has to be combiled into a SWF, it makes web-style development harder: kiss the iterative "code, refresh page, repeat" process goodbye.

Still, all in all, it looks like a pretty solid set of technologies, and the development process is fairly similar to web design / programming. Could be an extremely valuable asset to pick up in the future.

Tuesday, December 09, 2008

zomg, are you sure?

Recently heard during development of an API:

"we don't need error codes" (paraphrased).

Thursday, December 04, 2008

Fun experiences with JavaFX.

UPDATE: Yes, I updated to Java 6 Update 10 after #1.

Had a peek at some JavaFX demos earlier -- have been evaluating XUL, Flash, and Silverlight lately, looking for a good, free, easy to target platform for enriching some sites. You know, giving them some *umph*. You know, a richer experience for those who can afford it (someone cue rimshot!).

Here's how JavaFX played out:

  1. Crashed the browser when I visited a JavaFX applet running an older version of Java (1.6 update 7). The *WHOLE* browser. All of it. Thanks, Sun.
  2. Viewing the demos on javafx.com, they all repeatedly bitched about needing to use an "older" version of Java. Hit cancel, dialog pops up again -- FOREVER.
  3. Jarring, incredibly annoying browser-wide freeze for about 6 seconds while Java sloughed itself into memory.
So far, typical Java.

After I got the JavaFX demos up-and-running, they looked OK, but the demos aren't really reassuring.

XUL's a good'un, but that's only for Firefox browsers. However, for an intranet setting, XUL would win out completely. Some Firefox plugins are freaking *awesome* -- and they're all pure XUL + Javascript.

The whole javascript + svg + css + etc combo is in theory great but in reality minor browser differences are a big 'go fuck yourself.'

Silverlight actually looks really good in the respect that it can be driven by JS and written with plain XML, but it's a downer, same as XUL, for people not running Windows and IE7. Yeah, they say there's Mac and Firefox support, but I haven't found a good sample that works aside from Netflix's Instant Viewing (that only ran in Firefox, by the way).

Wednesday, December 03, 2008

Google Friend Connect vs Facebook Connect

Which should you use?
VS MODE

Google Friend Connect is really just a handful of widgets that let viewers have a "presence" on your site. Basically, within these widgets, Google / Yahoo users can talk to each other, discuss articles on the site, share pictures, etc, etc.

This is the solution you want if you're looking to add a "no touch" social networking angle to your site: you just drop in the widget code where you want it to appear, and off you go. The sites using Google Friend Connect right now are pretty lackluster looking; the best integration you'll find is Billboard for The People. This is programming-free social networking at its laziest.

Facebook Connect on the other hand, is for people who really want to dig in deep and have a much more fluid integration story. TechCrunch (see this story) is doing it right -- you can connect your Facebook account to TechCrunch, and never have to enter your name / email / website ever again. You even get the option of publishing your comment to your profile, if you feel it's good enough. There's probably oodles more they could do, but I'm not much of a man for oodles, so I'll pretend I never said that.

Since TechCrunch can perform deep integration using Facebook Connect, when you leave a comment as a Facebook user, the end result is fluid: the only difference anonymous comments and authenticated comments is the Facebook profile picture that shows up. It's got a funny blue 'F' in the lower right corner. Can't miss it.

SHORTER VS

Use Google Friend Connect if you've got a blog or regular static website and just want to slap on some pretty regular social networking features.

Use Facebook Connect if you need or want much better integration with your current site flow.

C'mon, Firefox, what's the deal?

Look, Firefox, I love you, man, but I've been using Chrome recently and the way you compare in speed is just BS.

I mean, I only had two tabs open and you were using 400MB -- WTF?

And, I closed you about 2 minutes ago, and only now has the firefox.exe actually gone away -- although it was fun watching the "memory countdown" so to speak.

Seriously, bro, if Chrome offered even a sliver of the add-ons you did, I might be using it on a more permanent basis.

Thursday, November 20, 2008

Testing file uploads in Rails.

zomg, there are like no Google hits for this. This or 'test file upload in rails.' Whatever. Same deal.

I was doing it "the hard way" earlier, until I stumbled across this while looking for something else entirely...

# fixture_file_upload uses /fixtures as its base directory
post :foo_bar, :file => fixture_file_upload('/files/test_file.txt', 'text/plain', :binary)
Automatically does the multipart stuff, so you can add in extra normal parameters (:user_id => 1, etc).

Wednesday, November 19, 2008

Damn, sometimes I hate software.

I burned like four hours tonight because, when upgrading to Ubuntu 8.10 through VirtualBox, I had somehow hosed my graphics. I mean, really hosed. Imagine someone cuts your monitor into puzzle-shaped pieces, then scatters the pieces everywhere, but somehow the thing still works When you glide your mouse to the edge of a puzzle piece, it suddenly appears on the opposite side of the screen.

Yeah.

That kinda hosed.

The problem was, things were only borked in Ubuntu -- terminal worked fine. So I rage for awhile, make sure I'm running the latest version of VirtualBox, blow away my xorg.conf file repeatedly until I'm sure that's not the problem -- even circumnavigate the globe via the jigsawed Ubuntu to re-install the VirtualBox guest additions, because I totally forgot how to mount cdroms via the command line. >:(

The culprit?

As it turns out, something caught my eye on the settings screen -- the number "9."

"Video memory: 9."

Thinking about it for a moment, I quickly created a new, blank virtual machine to inspect its default settings: identical, except for one area. "Video memory: 8."

Yeah. Guess what started working again once I modified my Ubuntu virtual machine's video memory to 8 megs instead of 9?

It's no surprise my Googling was fraught with much peril and little treasure. I bet practically nobody modifies the video memory setting, much less modifying it to an uneven number. Why does VirtualBox that let you put in uneven values for memory, anyway? Seems like a booby-trap waiting to happen.

I had a backup of the virtual machine from earlier this morning (a literal backup), but damn, I had spent almost 2 hours upgrading Ubuntu to 8.10, and a part of me just didn't want to let it go.

Well, I caught my white whale for this week.

Wednesday, November 12, 2008

Left 4 Dead: Get It Now.

Seriously. Left 4 Dead. Get it now. GET IT RIGHT NOW.

Do you remember, a long time ago, playing games that were fun even when you were losing?

Imagine playing a game like that with 3 other people, with randomized levels so nobody can memorize the pattern and just blow through them without a struggle.

Grab the demo if you still need to be convinced. It's only got one chapter, but I played it for like 6 hours straight. There were enough changes each play through to make it an incredible experience.

Left 4 Dead -- xbox 360
Left 4 Dead -- PC

Sorry ps3 people, ain't no party for you.

Also, it's like 6 bucks off right now, so I'd pull the trigger and use the left-over cash to buy yourself a happy meal or something.

Monday, November 10, 2008

"odesk test answers?" Are you serious?

I just noticed that %5 of my blog visits are for the keywords "odesk test answers" and "odesk + rails + test."

What the hell, man? If you can't pass any of those tests without cheating, I think you need a bit of work to do.

Friday, November 07, 2008

Fable 2 vs Fallout 3: it's all about the choices, baby.

(contains affiliate links.)

Today I just finished Fable II (Fable 2). It's a fantasy adventure where you mold your Hero; good or evil, pure or corrupt -- your morality affects your standing, while your purity affects your physical appearance. At first it seems exciting, the concept of being able to mold your Hero, and through them, the world around you. The game is about choice: do good, do evil, the world shaped through your selfless sacrifices or diabolical deeds.

You're given a lot of choices to make -- some of them drastically alter the world of Albion. If you've played Fable I (Fable 1), you've probably gathered by now that there's an event in the game where a lot of time passes. This time-lapse let's you really get the breadth and weight of your actions. There's only one small problem: you don't really seem to care.

First, the changes that come about from your choices aren't really all that surprising: good intentions, good results. There's no subtly here, and maybe that's intentional, in the sense that Fable II is trying to weave a "traditional" fairy tale where good is good and evil is evil. That's OK.

The second problem is more grievous: you just don't care. For the life of me, I just wasn't able to care about the choices I was forced to make during the game. At first, I played the game as a noble hero, because I was fresh and inspired. Then there came a point where I was simply playing the good guy so that if I played through the game again, as the most dastardly villain the world has ever known, there would at least be fresh results.

In the end, I felt as if I was just sloughing through the game to finish it: I rushed through all good/evil quests, skipping from town-to-town rather than walking there, all so that I could get to the last main event. I'm a completionist in the sense that I wanted to see all the "good" choices, even though most of them were pretty obvious.

Adding insult to injury, after I started the last main event, something happened that immediately made me care, for the first time, about what was going on, and I began to anticipate the next time I would be able to make a "choice." ... Except you're not able to make a choice. You have absolutely no control, and it is maddening, because at that moment, it was all I could think about. It was incredibly frustrating. You'll know what I'm talking about if you've just beaten the game, and if you haven't, you'll know it when you see it.

Anyway, shortly after that, the short fight that followed, and the very anti-climatic ending that was the finale', I was done. I recall reading about new quests that can only be completed once you're done with the main plot, but I just don't care enough about the experience any more to bother. I'll play through it again, of course, 6 months from now or maybe more, for the achievements if nothing else, but it's not something I'm feeling excited about, so I set it aside the minute I was done with it and popped in Fallout 3.

And God, what a difference.

Fallout 3 is a post-apocalyptic RPG by the makers of Oblivion, which was a generic medieval RPG. Unlike Oblivion, however, Fallout 3 is fun. =D

There are choices to be made in Fallout 3, just like Fable II; this game too revolves around the concept of influencing the world around you by your actions, but the choices you make here are more immediate, meaningful, and by no stretch of the word, fun as hell.


During the first hour, the game's introduction, you're introduced to a few characters: the love interest, the leader, the crazy bastard, the friend, the mysterious main plot... you know, the typical stuff. The characters are recognizable and easily related to, you may even get attached if you take your time.

Anyway, as they're setting up the plot, The Friend gets murdered by The Crazy Bastard, by the order of The Leader. You're told this, confidentially, by The Love Interest, who is the daughter of The Leader. She of course says there's nothing you can do, you gotta escape now, before it's too late!

So you're on the move, creeping through the underground vault trying to avoid The Leader and his goons, and you come across The Friend's corpse. And, shortly after, you also come across The Crazy Bastard and The Leader interrogating a frightened young lady. And here, the game gives you a choice: go inside the room, ignoring the fact that there are guards nearby looking for you and will hear any commotion, and make a mess.

So, being me and no one else, I charged into the room, and put two shots in the back of The Crazy Bastard's head before he could do anything. Then I aimed at The Leader, and... paused. Because, for a moment, I wasn't sure what to do. The game was actually going to let me kill him; I knew it the moment the targeting reticule went red. But I knew if I killed him I'd upset The Love Interest.

I realized at that moment the game gave me a very interesting, very personal choice: ruin my relationship with The Love Interest to avenge The Friend, or spare The Leader to spare The Love Interest. I had already killed The Crazy Bastard, but The Leader was complicit in his death. But I asked myself, "Do I really want to risk it? She might never forgive me if I do it."

So I let his old crazy ass run away.

There was no "good" or "evil" choice here. Picking one over the other had no apparent tangible benefits. It was all about how you felt about the situation. Did I want to satisfy the thirst for vengeance and turn The Leader inside out? Did I want to spare him, if only for the sake of The Love Interest, his daughter? Hell, I could've just smacked him around until he was unconcious, but could I resist not finishing him off?

I think, in my opinion, that's where Fable 2 failed and Fallout 3, so far, succeeds: the nature of the choice.

In Fable 2, there's a good choice, and an evil choice, and no matter which you pick, you get a reward of some kind: morality points, purity points, gold or weapons or loot up to your eyebrows.

But in Fallout 3, sometimes the choice has no benefit other than how it makes you feel.

And it makes you feel good.

Thursday, November 06, 2008

IE7 blows.

Sorry, just felt the need to reiterate the obvious since I've got something that works in every browser but IE again.

Yay, IE!

Tuesday, October 21, 2008

"Go dance with the angels old man!"

Ace Combat 6: Fires of Liberation is one of those classic games that make you scream "YES!" "NO!" "You motherfuckers, you'll pay for that!" at your TV. I can't help but get really into it, even after having it for almost a year now.




The story is cliche and the dialogue classically RPG-like in the way it is delivered.

But it's effin' GREAT, man.

Don't bother getting the flight stick, though. No other game uses it. Too expensive.

Saturday, October 18, 2008

Is your site OpenID enabled? If so, don't make me register.

I made my first comment on StackOverflow. It's a site for questions and answers for the developer community at large.

The only thing that compelled me to try (and succeed!) leaving a comment was their OpenID support: I am so done with creating a new user/pass for sites that I only bother with it if I feel I'll be using it a lot. Not so good for drive-by comments and contributions.

However, some OpenID enabled sites demand you register and create a user/pass for that site in addition. I understand why -- account recovery if your OpenID provider vanishes -- but in my mind that negates the the value add-in for OpenID. I wouldn't be using OpenID if I thought my provider was just going to ninja-vanish on me. If stackoverflow.com had done that to me, I probably would have left without bothering. It's just one comment after all, and I only visit the site once every few weeks, max.

Still, nice to know someone gets it.

Friday, October 17, 2008

Does Steve Gilmor come with subtitles?

Does Steve Gilmor come with subtitles?

http://www.techcrunchit.com/author/steve/

Seriously. Homeboy needs to take a deep, deep breather and burn his little black book of euphemisms 'cuz they just ain't working.

I think he's going for some kinda high-brow thing, but, uh, what comes out is generally unreadable.

Does he talk like that in real life?

Tuesday, October 14, 2008

Silverlight 2: still no webcam + mic support.

An alternative workaround that is frequently suggested is using Flash, and pushing the captured data to Silverlight.

In my mind, a better alternative: just use Flash.

Update:

Added bonus -- most Silverlight 2 demos don't work in Firefox, even though the plugin installs fine.

Update 2:

Fantastic -- one of the demos crashed the entire browser. Think I will be avoiding Silverlight for a few versions.

Tuesday, September 23, 2008

Ubiquity Command: urlencode

I just hacked up this quick Ubiquity command because I was cuttin' and pastin' URLs all over the place, and I needed some of them url encoded...

Ubiquity, by the way, is totally sweet.

Run "command editor" and paste the block of Javascript below somewhere in the text field.

That's all you need to do. It auto-saves.


CmdUtils.CreateCommand({
name: "urlencode",
takes: {"what": noun_arb_text},
preview: function(pblock, what) { pblock.innerHTML = CmdUtils.renderTemplate(escape(what.text)) },
execute: function(what) { CmdUtils.setSelection(escape(what.text)); }

Wednesday, September 17, 2008

Jaiku: still in beta. I blame GAE.

(this is a rambling rant about Jaiku and Google App Engine.)
(I'm probably totally, totally wrong.)
(but I like to hear myself talk.)
(er, type.)

If you've heard of Twitter, you've probably heard of Jaiku at some point in your life, then immediately forgot about it when you realized it was invite-only. Or maybe you did some begging for invites, then tried to invite your friends on to the service, only to realize you didn't have enough invites for them all.

Or maybe you were like me and just said, "fuck it, I'm not begging for invites."

Whatever.

Anyway, something -- I'm not sure what it was -- brought Jaiku to my attention again. This is the fourth time it's caught my eye: the first time was when it was announced as a serious, but closed, competitor to Twitter. The second time was when Google bought it, and the world was a twitter with sugary dreams of sweet sweet integration. That, of course, failed to happen, which was a major disappointment. The third time was... fuck, months ago, I think, when they announced their move over to Google App Engine. I'm sure your first thought on hearing that was, "finally, in a few months we'll see how Jaiku does in The Real World."

That, much to your overwhelming surprise I'm sure, also failed to happen.

Jaiku's development team just finished up the port to Google App Engine a month or two ago, according to an official blog post. Well, team? Maybe it's just one guy working really long hours: the public perception of Jaiku's slow development + lack of blog updates makes me wonder if any one person is at the helm of that bad boy, much less a team.

Anyway.

To celebrate this momentous occasion, they... uncapped invites.

Yes.

They uncapped invites. So now you can invite all your friends!

But you can't sign up for an account by your lonesome.

So, I'm going to hit you with a big WTF now: is GAE not scalable?

They did about 6-8 months of development porting Jaiku over to Google App Engine, and yet they're clearly not quite ready to unleash this thing on The Public At Large. Why not? What's the missing piece of the puzzle? Scalability? Wasn't Google App engine built for scalability?

I won't say that Compete is the Definitive Source for information, but take a look at this:



The numbers (you'll see'em if you click through the image) are:

jaiku.com: 98,106
appspot.com: 182,747

I'm going to move with the assumption that Jaiku is the single biggest GAE user. It's convienent for me to do so. (Am I wrong? Man, who knows. I think it's a safe assumption to make, but if you know otherwise let me know.)

So, looking at those paltry numbers (I'd have put Twitter on there, but it TOTALLY fucks up the graph) I have to ask, can GAE scale? I'm really grasping for a reason as to why Jaiku hasn't finally opened its doors for one and all yet. If you mention Jaiku you will inevitably be hit with a deluge of comments in the form of: "goddamn it, it's been X-months/years and they haven't added a single feature / fixed this outstanding bug / stopped sucking!" I think it's reasonable to extrapulate from that either they're "done" with the user experience, for now, or that it's hit the point of "good enough" and at the moment they're not really interested in fucking with it. I mean, it's not really reasonable, but I'm saying it is because I don't want to have to add a bunch of conditionals to every fucking sentance I make here.

They've been bought by Google. They've moved to Google technologies. They're ready, right? Why aren't they opening their doors and screaming "COME GET SOME!" to the Internet at large? Getting ready for a marketing push, maybe? Preparing some ninja-style corporate espionage against Twitter?

Or is the ultimate answer something much simpler? Maybe moving Jaiku over to Google App Engine -- the database-like bits of it, specifically -- has surfaced some critical flaws. Knowing this, they can't just throw open the doors, because the moment they do there will be the usual flood of users going, "Google product? Must have!" It'd be total embarrassment for Google to have the same kind of uptime problems Twitter suffered, you know, what with them being the mighty infallible Google and all.

Saying that GAE can't scale for Jaiku seems like a bit of a stretch, but the architecture of a messaging system (Twitter-like microblogging, etc) is very different from the architecture of a standard website; if you've been following the finally resolved up-and-down saga of Twitter then you're sure to know that by now. Different strokes, different folks, or something punny like that.

Now, we all know that Google's BigTable database (the same database that powers GAE sites) can scale, otherwise Google wouldn't exist as we know it. It scales quite nicely, actually, for it's problem domain. But does it scale well for Jaiku's problem domain: messaging?

Short version: Did Google try to shove the square peg into the round circle and leverage BigTable in a way that can't scale gracefully for Jaiku's messaging needs?

Well, I just got bored writing this, so now's a good time to kill this post:

KUNG-FU CHOP OF DEATH!

Sidenote: Blogger's rich editor totally blows. Someone replace this thing, STAT.

Friday, September 12, 2008

Capistrano + Git: fatal: 'origin': unable to chdir or not a git archive

Getting that error?

Short answer: you fucked up, then Capistrano fucked up right behind you.

SSH into your deploy target, go into shared, and then frag the shared_cache directory.

Then, cap deploy:cold.

Why?

It normally happens when you try to set your repository as a local filesystem path. Capistrano populates shared_cache with an empty Git repo, and then tries to pull in your repository, which it can't reach... but it doesn't frag shared_cache, so the next time Capistrano looks, it's there, and goes, "Hey, we've already built the repository cache, let's just call git fetch and update it!"

Good luck.

Capistrano + Git: Host key verification failed.

Getting 'Host Key verification' failed when you're trying to do this? You might be trying to deploy source in a Git repo, and the Git repo is accessed via SSH.

cap deploy:cold


Do this: ssh into your target machine (the one codes getting deployed on), and then ssh into the Git repo machine -- or just do a 'git clone' if that's not possible. Accept the key, and then you're golden.

Deploying Git over SSH (username, password) with Capistrano

This one bit me.

Hard.

If your Git repo is accessed via SSH using a username and password instead of a public key, you're probably having problems getting it to work. Notably, the password prompt isn't prompting you for your goddamn password.

Do this in your deploy file:

default_run_options[:pty] = true
set :scm_password, Proc.new { Capistrano::CLI.password_prompt "SCM Password: "}


Using Capistrano 2.5.

default_run_topions[:pty] will fuck up your output, but it's necessary for reasons I don't fully grasp and after about 3 hours don't care to.

Friday, August 22, 2008

map.resources + has_one + form_for = surprise, mofo!

If you've got a route like

map.resources :cars, :has_one => :driver


You're probably expecting to use form_for like this:

form_for([@car, @driver])


That won't work. It'll complain about not being able to find the function, 'car_drivers_path' instead of 'car_driver_path'

Fix:

form_for(@driver, :url => car_driver_path(@car))


Hopefully in Rails 2.1.1 this will be fixed using a different, less crazy syntax:

http://rails.lighthouseapp.com/projects/8994/tickets/461-fixed-polymorphic_url-to-be-able-to-handle-singleton-resources

That is all.

Friday, August 08, 2008

The Grind.

Back to working full time again. Let some bills pile up, and now it's time to ninja-fu my way out of them.

I'm angling for some more Rails-based jobs than ASP.NET jobs, which means a slight pay-hit until I can amass a treasure-trove of my RoR proficiencies.

Not that I don't have plenty already that many, but they're mostly firewalled / intranet style. Need some public, grade-A consumer-facing sites to make this happen.

Thursday, July 24, 2008

Winner!

Recently had to decide between Silverlight vs Flash for a project.

Silverlight pros:

* Fast.
* 2.0 would support IronRuby
* Easy
* Already have development tools

Flash & Flex pros:

* Installed everywhere.
* Tons of resources
* Lots of preexisting stuff I can look at.
* Similar to JavaScript

Since I already had the MS tools and Flex builder would have cost me some extra change, I was leaning to Silverlight -- until I found out it doesn't support Webcam / Audio!

When deciding on which major technology to use, always determine that all prospective contenders support your required features!

Wednesday, June 25, 2008

SproutCore?

I am thoroughly unimpressed with SproutCore, but this is only based on the very rough demo application they host.

I tend to judge a platform's ceiling by the farthest someone has taken it... so, any real life examples of SproutCore out there in the wild that don't suck?

Sunday, May 25, 2008

Google Gears vs Adobe AIR: the way I see it.

Google Gears: easily add offline support to WEB PAGES.

Good scenario: user browsing your site, internet connection drops, Google Gears can be used to save all the data until the connection is re-established and can be uploaded to the server. The website mostly functions as the user expects it to, with only minimal degradation of functionality.

Bad scenario: user is offline, using your site, and their browser crashes... as far as I understand it, there's no way for them to get back to the offline version of the website without being online. They're basically 'stuck' until they can re-establish a connection.

UPDATE: Google Gear's LocalServer works at a lower level than I thought, so you can actually hit the offline version of a website without actually having to visit the online version first.

Adobe AIR
: easily add value to existing web-sites with desktop application + integration.

Good scenario: user is browsing a site that lets him chat with other users. However, he has to restart his browser for some reason (FireFox 2 is being a memory-pig again, or he just installed a cool new add-in). He launches the Adobe AIR application that lets him continue chatting with his friends even as the browser is closed. He can also leave the application open to chat with his friends so he has one less browser window / tab to keep an eye on, get updates to his friend's statuses on his desktop, etc.

Bad scenario: user sees some exciting new features on your chat website, enjoys using them, but they haven't been added to the Adobe AIR application yet, since an Adobe AIR application is an application that requires updates, bug fixes, and new feature integration separate from your website.

That's how I see it, anyway.

Wednesday, May 21, 2008

Ugh. Amazon's POS MP3 downloader

Amazon's mp3 downloader crashed.

Again.

So far it's crashed every time I've bought an album.

And, every time, I have to email customer service, get them to reactivate the download, and then hope the Amazon MP3 player doesn't crash this time.

I think this is pretty much my last purchase from the Amazon MP3 store for a long, long time.

Thursday, May 08, 2008

undefined method 'time_zone=' error?

undefined method 'time_zone='

Got that error?

Run this in your console:

gem sources -r http://gems.rubyonrails.org/
That's for bleeding edge developer gems. It was probably put in your gem repository list when you upgraded to Rails 2.0 and then forgot about until now.

Saturday, May 03, 2008

ExtJS alternatives?

Now that there's a big kerfluffle about ExtJS, one question:

What are people using now? I've heard some people mention Dojo but also mention that it has really bad documentation.

Suggestions?

Wednesday, April 16, 2008

The opposite of sweet.

** RANT ON **
(if your a client of mine, wouldn't recommend reading this -- this could be about you!)

Ugh. Heading into "bitter client" territory again. Happens a lot, mostly because I'm the "guru" -- and you only hire a guru when you don't have one. If you have a company without gurus, you tend to have problems: a company I began working with had no Subversion or source control system at all (!). That changed pretty quickly due to necessity + there was no way I was going to do the "hey stop editing files on the ftp server so I can get your changes!" dance I've read about at TheDailyWTF. Not *even* if they were willing to pay for me to sit around and twiddle my thumbs.

Another more serious problem I just noticed was that they don't have any kind of QA system in place. Oooh, yeah, I had a cloud full of "?!?!" Metal Gear Solid-style over my head when I realized one of the designers was testing a product. Bug reports were sporadic, didn't include steps to reproduce, and some bugs were missed entirely (but I fixed those anyway). All the bugs tend to be pretty minor (formatting issues, form validations) because I've got a keen eye and typically kill the "big" bugs as I'm writing the code. But, nobody writes bug-free code. That's why you need QA -- a bunch of motherfuckers that try to wreck your shit, and when they do, can give you a very detailed process on how they did it.

You ever get told there's an "error?"

Yeah.

"Error."


(I've always wanted to use this image!)

Anyway, I can't blame them too much. It's the typical growing pains of a software company -- one that has been working on small projects for most of its lifetime, then deciding to branch out into mid-sized projects.

But.

One thing that seriously annoys me is how clients are handled. For awhile (I don't know if they still are) they were pretty hands off with clients, meaning they weren't pushed for solid answers, or made to walk through the entirety of the site, or whatever causes a client to, the day before the site goes into production, go, "hey, this is all wrong, what were you doing?!"

This only affects me because that shit rolls downhill, so all of the sudden it's "hey man SUPER EMERGENCY #24241, we have stuff to do that should have been done a week ago but the client never bothered t o peek at the site until just now and we didn't really want to press the issue but anyone now you have to GO GO GO GADGET RANGERS."

Man. I never dreamed I'd be making that many relatively untested changes to a system that was due to go into production the next day.

I should have introduced them to weekly cycles and feature freezes. If you make any significant changes, deployment to production is pushed back a cycle -- that's enough time for QA, and for the client to make more outrageous demands in the meantime. Make sure the customers know about it, so you can finger them as the delay when it happens (and it will).

Anyway, RANT / OVER.

Tuesday, April 01, 2008

Just remembered why I hate CSS.

Read this, immediately remembered why I hate the current state of CSS:

CSS Swag: Multi Column Lists

What's funny about that article is that the solutions get progressively worse the farther down you go, instead of better.

Sometimes I just want to grab Web browsers by the neck and scream, "PUT THE ELEMENT HERE, RIGHT HERE AND NO WHERE ELSE YOU JACKASS."

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?