Friday, August 20, 2010

The Upside of Apathy

I think it's finally time to record my thoughts on the new workplace (and in the process muse over some things that have been on my mind lately). And yeah, that bleak sounding title is the reason I'm about twice as satisfied here as I was back at I Love Rewards.

First things first, full disclosure, my first project here was in PHP. And they do their share of .NET programming (and I suspect that a lot of the driver work gets done in C or maybe even Assembly, but that's unverified). They interact with the Postscript standard a lot, but no one does it by hand. Because we serve the medical industry, there's also large parts of CCR and HL7 slung around on a regular basis. That's particularly bad if you understand what those acronyms mean. CCR is an XML-based standard circa 1998, and it exemplifies everything that eventually made sane minds give up that markup for today's light-weight formats. It's the only data standard I've seen that, and I promise I'm not making this up, you have to pay in order to get a copy of. It seems like that would defeat the purpose. HL7 is what you would expect out of a Unix shop from the early ninties. It's a pipe-delimited text stream whose definitions document runs to a hundred pages or so.

OS-wise, I'm in the minority with one other developer who thinks we ought to be using linux-based servers, and I'm actually the only one electing to go with Linux + Emacs for my desktop needs. The place is thick with MSVS and the like. Finally, I'm the only one who uses source control (and it's GIT, as if you had to ask by this point).

So why am I happy in the face of these conditions? It's because, for the most part, I've been hacking Scheme and Elisp through the past few months, and using whatever additional tools I wanted to.

Scheme? At a place that also potentially uses Assembly? Well, yeah. It turns out that no one outside of IT is religious in the least about what languages, tools or systems you choose to use. They really only care that the result is business-applicable in some way, cheap and fast. So as long as you hit those, they don't particularly care. I couldn't get away with this at many other places. Being a Linux-toting, Emacs-using Scheme hacker in the middle of a vast Windows ecology, I mean. There are remarkably few job openings in the field, especially in the bustling, skilled-programmer-metropolis of Toronto. If you want a capitol-J Job here, you need to know (and be willing to work with) Java or C#, the COBOLs of the modern world. Every once in a while someone wants a Python or PHP hacker for some contract work.

But apathy has an upside, like I said, and I'll take it.

It's really interesting to me that once again, passionate, caring (but woefully uninformed) MBAs seem to fuck everything up. If Ken was a hands-on leader, I'd probably have had to learn Java or C# too, or at the very least content myself with constant PHP. This is the Paul Graham effect in full swing; big companies use languages and tools that get sold to the management, not to the devs (and to be fair, if the devs got to pick, we'd all probably be working in C++ and it would be worse). Little companies use the juice that gives the the highest ratio of miles to millileters.

This is the crux of the problem though. The decisions here are such that most people have no idea what the right answer is. Most business people pick what's advertised; thay want to go with the flow. Most devs pick what's fastest in the machine sense; once they're done writing reams of code for their hello world, they want the machine to execute as fast as possible (Contractors seem to want what gives them as many billable hours as possible while not raising too many eyebrows, but that's far from unique to the IT business so I'm disregarding it). It's pretty obvious to the reasoned observer that neither are the correct answer. They might accidentally yield correct answers, but there's nothing about either thought process that makes the right answer more likely than (or even equally likely as) the wrong one. The specific answer depends on the specific situation, granted, but I put forth that in all cases, the correct answer is the most expressive language that will fit on the target hardware. You do want to optimize speed, but not from the machine's perspective. Code needs to be fast and easy to make and maintain, rather than run, which means that you want as little a gap between what you can express and what you want to express. The complaint that gets levelled at non-C languages is that they're slow, which is true until you consider that ~2.4 gH dual-cores and 6gb ram setups are now common on the home market. If you're working on the latest 8-bit IC from Atmel, ok, yes, use C or Forth and constrain yourself to either manual bit-twiddling or the stack. If you're on the desktop, or god help you, a fucking server cluster and still managing memory yourself, then someone (and it may have been you) has made a poor choice on your behalf. This is the sort of obsesive behaviour whose logical conclusion is hand-counting your cereal flakes every morning to make sure you're getting precisely 1024 of them. I think we can agree that the sane thing to do is fill the bowl, hoping the offsets average out in the long term, and getting on with your day.

It seems that democracy doesn't really work here either, because as I hinted above, I doubt that most programmers would pick the most expressive language. They'd either pick what they know just because they happen to know it already, or they'd pick a language that let them code as close to the metal as possible. So how do I know they're wrong, as opposed to me being wrong? Well, that's where the issue goes to shit. The reason I know they're wrong is that I've worked with the low-level languages (C and Forth), I've worked with what I'll call the mid-level languages (Python, Ruby, Java, C#, PHP), and I've worked with four or five LISPs (which I stereotypically place at the top of the progression). As per PG's Blub Paradox, I know that the non-lisps are missing some crucial features that I find myself using on a fairly regular basis (not even macros, interestingly. The prefix notation itself seems to pack a lot of the punch on its own). Also, I've clocked myself as "fast" with some of these languages and "slow" with others. The reason the issue goes to shit here is that this argument will only convince people who have already given several LISPs a fair try and have worked in some other languages from accross the continuum. Those people don't need convincing; if they've come that far, it's a good bet that they've stuck with LISP in some form, or that they're one of the few, vocal pessimists around, loudly proclaiming "all languages suck balls". The people that need convincing are the ones that are currently convinced that C# or Java alone represents the limits of "programming", or the ones that look upon learning new languages as procrastinating.

It's ironic to consider, but it seems like it might just be easier to sell Scheme to the managers and let the traditional pyramid bear the change out. Managers understand the argument "this way is faster", and don't particularly care about the rest as long as you can prove that. There's trouble this way too, though. You see, it's fairly easy to make the argument "this way makes me faster", as long as it's true and you can demonstrate this. But the argument "This will make you faster" is another matter entirely. For starters, in a shop of C programmers, it's patently false. It'll take months of genuine practice to get to a higher level of productivity if your team doesn't already know LISP. There's exactly one other way to go, and that's competing at the company level. In other words, start a bunch of Scheme/CL shops and watch them out-compete the ever-loving fuck out of the Algol descendants. Watch them driven before you, and blah blah blah. It seems like it would work, as long as we stop the AI winter thing from happening again, which looked like it was the result of promising too much, delivering too little, while focusing too much on the math and linguistics and not enough on the business end.

In other words, LISP for business logic instead of research. I think I can do it. I'm certainly in a position to. Even if not, I'll try my hardest and let you know how it goes.

Monday, August 2, 2010

(define (update-again)

Oh fer chrissake, ok.

I figure it's about time to update because I haven't lately. It turns out that you don't stop being busy just because you've stopped working for an employer that demands 20 overtime hour a week. You just get busy doing other stuff. I;m beginning to think that "busy" is either contagious or hereditary.

Mostly the stuff going on here is work on that clandestine project I mentioned a little while ago. Basically, I got to thinking that I really wanted to pick up D&D again. The really sad thing is that my group of friends is pretty geographically disparate, and we don't really feel like driving out for 6 hours to meet up for 8 hours of dice-rolling only to have to weather the drive back. That's not the type of ordeal you can undergo every two weeks.

My first thought was "ok, there has to be something that will let me and my friends play D&D online". I took a look around and found Virtual Tabletop (which has a pricing-system/website so bysantine that I rate their chances of putting together an intuitive in-game interface at very near zero), Open RPG (which has that typical open-source affliction of horrible UI, make-based installation and on top of that neglects OS X, which most of my friends use) and Web RPG (whose link doesn't go anywhere because the only evidence I could find of the project is a page talking about why, specifically, it sucks).

And that's the point at which I started hacking together my own little PLT Scheme app to let me play D&D with my friends. I've registered diecastgames.com (which currently goes to a godaddy parking page), and put together a development blog here in the meantime. It isn't at the point where I want anyone using it yet, but it should be up and running in beta form in the next little while. It'll be almost ugly as sin until I put the art together, at which point we're ready to go. Then I'll just have to convince one of my friends to DM.

Which shouldn't be hard, all things considered. If they get uppity about it, I can just point out that I built a friggin online D&D system from the ground up.)

Friday, June 11, 2010

Reflections

For the record, I have no idea how I got here.

Starting from a Windows-using Graphic Design graduate three years ago (who incidentally really really didn't want to learn about PHP and databases because it seemed too complicated), and ending up as a Netbook-toting, Linux-using, command-line slinging Scheme hacker who uses Emacs and Conkeror as his editor and browser respectively.

Which is not to say that I don't draw anymore. In fact (perhaps ironically?) I draw better now than I ever have ever. It actually took dropping comics to get further, which was fucking unexpected to say the least. Not in the sense of "grownups don't draw comics", in the sense that my mind needed change. Had I spent my entire childhood gleefully slinging oil-paints around, I'd need a change from that too. In the same way that it doesn't do to be an X programmer, it doesn't do to be an X-artist. You don't even see it while you are an X-artist, because it doesn't occur to you to think outside of your own experience, but it's amazing how constricting habits can start to feel after a while. Ironically, you'll only ever recognize the discomfort after you stretch your wings.

I know roughly ten billion times more than I did back when I was bitching about how JavaScript was too hard, and it's getting to the point where I'm realizing how little that actually is. I'm remembering incidents from not two years ago where I didn't even think to question a colleague of mine when he insisted that Photoshop actions were the best way of automating image-resizing (incidentally, they're not). I remember more recent arguments, still from the old office, about how we shouldn't use git because "there's nothing wrong with Subversion", or wondering how to programmtically generate buttons or CSS. Those don't seem like real problems anymore. I'd take a couple days to resolve each. At the outside.

After growing by leaps and bounds, I want to go farther. As weird and intense as the trip so far has been, I want to run faster. And I still think I can do it. Which gives me this eery feeling that I just don't know enough yet.

Conkering

On a completely different note, I started using a new browser, and it's fucking awesome.

I've sort of been looking for a browser to replace Chrome for a while now. It's good, and it maximizes screen real-estate (which is important because I use a certain netbook very often, and you want every milimeter of a 10 inch screen contributing). A while ago, Firefox started to bother me. I noticed that between the various bars and tool dealies they had, my browsing real-estate was reduced to unacceptably low levels. I switched to Chrome because it has exactly one line of tabs at the top (your favorites can be toggled with Ctrl-B, so you have them when you need 'em, and not otherwise). A few bugs started burning pretty badly lately, though. The number 1 being that (ironically) Chrome randomly fails to log into Gmail on Linux.

So here were my requirements:

1. Maximized screen real-estate

2. Intuitive shortcuts

3. Cross-platform

And last (but I really wasn't too hopeful here)

4. Decent keyboard browsing support. (so I could avoid using the trackpad)

First thing I looked at was W3 mode, because I've become quite the Emacs ardent since first discovering it. It's really not acceptable. It works ok if you just browse text-based sites, but most of the stuff I browse isn't text-based. I also discovered that I had additional requirements that hadn't been apparent earlier.

3b. It should be sufficient for testing websites/webapps

3c. It should handle graphic browsing

I also tried Konqueror, actually installing KDE on my netbook before realizing that it's not what I'm after. It has some good ideas, but it's heavy on the chrome, and I prefer my computer be fast rather than look cool. As I was searching around for Konqueror tutorials, trying to figure out whether I can at least use it for my desktop, I stumbled across a page mentioning Conkeror.

Firefox for Emacs users

...

Go on...

It turns out that Conkeror is a JavaScript-based, Emacs-like browser based on the XULRunner engine.

It's a clear win.

1. Check. It uses the whole screen (no address-bar, no favorites, no bullshit, just the familiar mini-buffer at the bottom).

2. Check. I realize they wouldn't be intuitive for everyone, but I already love and use Emacs, so it was a very easy transition to make. Two days in, it's as if I've been using it for years.

3. Check. Based on the XULRunner engine, and it runs on Windows, OS X and Linux (it even has apt-get support on Ubuntu).

3b. Check. It's as good as Firefox, and may actually be better for development/testing because it gives you full access to the DOM via JavaScript hooks.

3c. Check.

4. Oh you bet that's a Check. It chugs a bit when there's six billion links on a page, but otherwise fine.

So yeah. I'll be brushing up on my JavaScript a bit more because I now have reason to. I doubt I'll be customizing my browser anywhere near as much as my editor, but I've already made some edits for the sake of sanity.

minibuffer_auto_complete_default=true;
url_completion_use_bookmarks=false;
url_completion_use_history=true;
xkcd_add_title = true;

define_key(content_buffer_normal_keymap, "N", "follow-new-buffer");
define_key(content_buffer_normal_keymap, "V", "view-source");

define_key(default_base_keymap, "C-c", "cmd_copy");
define_key(default_base_keymap, "C-v", "cmd_paste");
define_key(default_base_keymap, "C-w", "kill-current-buffer");

define_webjump("youtube", "http://www.youtube.com/results?search_query=%s&aq=f");
define_webjump("stock", "http://www.sxc.hu/browse.phtml?f=search&txt=%s&w=1&x=0&y=0");
define_webjump("lang", "http://langnostic.blogspot.com");
define_webjump("plt", "http://docs.racket-lang.org/search/index.html?q=%s");

It's more verbose than the comparable code would be in Elisp, but there probably won't be as much of it total. One completely unexpected cool thing about this is that I now use my keyboard for everything, except starting Emacs and Conkeror. I'm definitely starting to get the attitude of "mouse use=cache miss", and I find myself wanting to eliminate it as much as possible. To that end, I'll be trying out Stumpwm when I get a little free time, just to eliminate those first two mouse clicks. Xmonad is tempting, but I'm really not sure I want to cram Haskell into my head at this point just to run a window manager. I already have Scheme, JavaScript, Elisp, PHP, Erlang, Python and Ruby competing for mindshare, and Common Lisp seems like it'd fit more comfortably. I still want to learn Haskell eventually, but I need some breathing room first. I'm sure there's a mental-indigestion point that I'm approaching, and I really don't want to spend a few weeks on the metaphorical shitter.

Sunday, May 16, 2010

Apache Blues and General Update

Apache.

Sucks.

Balls.

It took me about four hours today to figure out why the hell I couldn't use my localhost to test pages in my home directory. It's never come up before because every single other computer I've set this up on has just worked right off the bat. It turns out that what I had to do is run the command chmod o+x ./ in the home directory. So I guess this is actually an example of how Unix sucks balls? For the record, I realize that I'm a bit more ham-handed than the average server-admin at handling my OS and permissions, but I refuse to believe that it was all my damn fault. There's nothing anywhere that might have tipped me off to what was happening. A terribly generic error message, a completely useless error dump in the logs (literally more generic than the error message), and a bunch of documentation/discussion that gave flat-out incorrect responses, or pointed me in precisely the wrong direction. This is probably just because I spend so much of my time thinking about usability, but the affordance level here is awful.

You literally need to know about the magic button in order to fix a problem like this. There's nothing that indicates this disease given the symptom, and the solution is peripheral and non-obvious. This is quite possibly the worst way to design software, and all it really did was force me to redouble my efforts to learn about alternatives to this giant mud-ball called a server (not that AllegroServe is any better by most accounts, but's still worth a look if you're running your app in Common Lisp.

Other than that, pretty badass. Kicking ass and taking names at the new place. I've written up a draft of my thoughts, but I sort of deliberatly haven't published them yet. It seems like I'd need a bit more time to get the lay of the land around here before I can come to any conclusions on how things are going to go, or even whether I made the formally correct decision leaving I Love Rewards. I'm leaning towards "yes" on the latter, but we'll see. There's this objective affectation that I like to adopt, specifically because it's a bit tougher to think in those terms about stuff like major life decisions. I don't want to get into the endlessley self-reenforcing pattern that humans tend to display, but I also don't want to gimp my chances at a new place by assuming things are worse than they are.

For the moment, I'm looking at this as an excellent opportunity. It's a place that's just displaying a nascent hint of IT-centricness (in a good way), and I want to do absolutely everything in my power to make sure this place goes in the right direction. Not necessarily my direction, but I get the feeling I can ease a lot of growing pains if I make the right choices, and there are definitely leapfrog processes and technologies I can share.

The only thing I'm sure of is that it'll be interesting.

Thursday, April 29, 2010

On Managing Windows

So I've had my neutrino up and running for a few days now. It's been quite fine. Other than one or two random hiccups in the netbook remix of Ubuntu 9.10, it's been smooth sailing. Startup is easily three times as fast as my HP Mini was (due in no small part to the components the Neutrino can take). I'm still gobsmacked by how much actual difference the matte screen makes, by the way. My HP mini travelled with me quite a bit, and it tended to get a lot of gunk on its screen (judging by the pattern, it was being picked up off the keyboard when I closed it, despite the fact that I kept a cleaning cloth between the board and screen), it also reflected in all sorts of lighting conditions, to the point that I couldn't actually use it on the bus or streetcar a large part of the time. The Neutrino doesn't have either problem. The matte screen takes care of most reflections, and it's slightly inset, which means the surface never makes contact with the keyboard.

Sound and webcam are both much better on the new thing, though I don't have much occasion to use either in my daily activities. I also haven't gotten to testing out how it works with a second screen. Again, really no call for it. When I'm out and about, carrying a second monitor is impractical, and as comfortable as the neutrino is, when I'm at home I still prefer my desktop colossus.

What I have found is that Xmonad helps. I'm still not a haskeller, though it's quite tempting to drop everything and learn it given what I keep reading about its performance, and Xmonad may finally push me to pick it up. I doubt I'll ever use it on a desktop machine (or for that matter, on my netbook if I have it hooked up to multiple monitors). It's set up to be minimalistic. Which means that a whole bunch of things you take for granted in GNOME need to be done manually (like connecting to your local wireless network, or setting up keyboard shortcuts/switching out caps-lock, or setting up a way to launch programs other than the command line). It's really all stuff I should know anyway, but I don't need to with my usual routine.

Just to remind everyone, I live in exactly three applications (with two more coming out very rarely for specific purposes). The three are Emacs, GIMP and a browser (which one varies depending on what exactly I'm doing at the time). On some rare occasions, I bust out Inkscape (to edit vector images) and DrScheme (for the fantastic macro-stepper). Ok, yes, fair, I also use Klavaro for keyboard training and Rhythmbox for tunes. The first one gets run once per day, and the second is a fire-and-forget program.

You'll notice that Terminal is no longer in that list. That's because these days when I need to do something terminal related, I either whip up a quick Emacs function and bind it to an appropriate key-combination (if it's a command I find myself using a lot), or I use M-x term rather than hopping out of Emacs, possibly hitting C-x 3 first to get another vertical window fir my terminal session. In other words, the way I use my computer, Emacs is my window manager. GNOME is just there to take care of the background bullshit like connecting to wireless on my behalf, keeping the system clock ticking, and letting me know when there are updates to be had. Other than my Emacs monitor, all screens are taken up by exactly one window, and I tend to organize several workspaces (each oriented for a specific task) so that I can switch as seamlessly as possible.

So I don't see Xmonad usurping my window-manager of choice.

That said, it has one very real advantage to GNOME, and that's a lack of status and toolbars. That's two additional vertical lines of text. It doesn't sound like much, but it's worth quite a bit on a 10" screen. Since I never really connect to wireless nets while I'm on a bus/streetcar/subway, the advantages of GNOME make no difference there. So, while I'm on the go, Xmonad is a superior window manager for my netbook. Granted, all I do is run the one instance of Emacs, but that's all that's on my screen. No toolbars, no status bars, just one giant Emacs window with minibuffer. You'd be surprised how cool that feels if you're a big enough nerd.

Friday, April 23, 2010

On Neutrinos

I'm typing this on my badass new netbook, and ironically, hating every second of it. Not that it's a bad notebook, it's just that I haven't had the time to bend it to my will yet, so this is coming to you live from Windows 7's Notepad instead of my usual Ubuntu/Emacs combo.

So a comparison to my previous netbook of choice is in order (for those of you just tuning in, I used to tote an HP Mini 1035nr which my GF is now probably going to inherit).

In descending order of importance (to me anyway)

OCZ Neutrino:

  • Has a matte screen (so it's better than the HP right there as far as I'm concerned)
  • Takes standard 2.5 inch HDDs (not that it mattered, since the Ebay unit I got came with its own 64gb SSD)
  • Has standard VGA out
  • Easier to open up and tinker with
  • Has a better placed power button (where you'd expect, just above and to the left of the keyboard instead of on the front of the unit)

HP Mini 1035nr:

  • Has a bigger keyboard (not much bigger, but it still took me about an hour to get used to the switch)
  • Has evenly sized keys (the Neutrino does too, for the most part, but the punctuation keys in the lower right are all narrower than the rest. Again, nothing huge, but there is a noticeable difference to get used to, and it's a lot easier to accidentally type "./" instead of ".")
  • Lighter and smaller (the Neutrino has about a third of a pound on the HM Mini, and it's about a half-inch taller, presumably to keep such a roomy interior for mods)

The biggest loss I'll be taking is actually the keyboard. Not quite a huge deal, but enough for me to try checking out how easy it would be to do a keyboard transplant here. The gains are monstrous. More RAM, bigger (and much, MUCH faster) HDD, and a matte screen (didn't think it would make as much of a difference as it is, frankly). The only other difference is the track-pad, which I didn't put as an advantage or disadvantage for either. The Neutrino has the classic laptop-style pad with buttons directly blow it, while the HP mini has a button to either side of the trackpad. That lets them save some space, but it's also easier to use once you get used to it.

5 Keyboard Commandments

I've been kind of obsessed with keyboarding lately, and I've come up with a list of things that I've seen make up a good keyboard. I doubt I'll ever be in a position to design my own for mass-manufacture, so here's what I found out. Hopefully, people in a position to do something about it read this before it's too late.

1. Thou shalt not fuck with key sizes.

Except for the arrows/Tab/CTRL/Shift/Caps/Return (and F-keys if present), all keys should be the same size.

2. Thou shalt not squander the home row.

No one, including every office-drone I've ever observed (and I've had occasion to observe a LOT, across many demographics) ever EVER uses Caps Lock. I've seen it exactly once, and it was by accident. You'd think that those all-caps posts you see around the net owe their existence to the CapsLock. If you wanted to preserve that particular segment of our culture, rest assured that CapsLock has nothing to do with it; from observation, people tend to use their off hand to hold down shift and type with only their main hand. Seriously. There is no reason to crowd the home row with something no one uses. By all means, put your precious CapsLock somewhere, but make sure it's out of the way.

3. Thou shalt consider the wrists.

My one complaint about the Happy Hacking line of keyboards is that they necessitate the purchase of squishy wrist-pads. This is a big reason that I still have my MS Behemoth with me; it's built for all-round typing comfort. So I prefer that comfort when I know I'm typing for hours at a time, but I like the Happy Hacking for bursts of intense typing (because I can get a higher speed with the smaller keyboard area). Interestingly, laptops and netbooks solve this problem by default because the body of the unit tends to be much deeper than the keyboard, so you can comfortably rest your wrists on the remaining body. Apple keyboards try to solve the same problem by keeping the lowest possible profile, so that you can effectively rest your wrists on the surrounding desk space. It work or not depending on who you talk to.

4. Thou shalt not take up an acre.

Make the keyboard as small as possible (not smaller). Don't mess with key-sizes, and by all means make larger-keyed keyboards for people with giant hands, but as a rule, the keyboard should take up as little space as possible. This means no extraneous "Mail" or "Calculator" key, no number pad/arrow cluster where you can get away with it, and no extraneous space between keys. This works to make typing faster (because your fingers don't have as far to travel to the next keystroke), and it also takes away some of the pain of mouse/trackball use (because you can keep your pointing device closer to your keyboard, thus reducing the time it takes to switch). This also means avoiding the break where possible; that's a comfort optimization that costs speed.

5. Thou shalt assign Home, PgUp, PgDown, and End to the Fn-Arrows

This is simple. It makes sense. Fn+Left takes you to the beginning of a line, Fn+Right to the end, Fn+Up/Down move you up or down a page respectively. DO NOT BIND Fn+Arrows TO SOMETHING STUPID LIKE VOLUME CONTROL OR BRIGHTNESS. It's not clever, it sucks. And if you do it, YOU suck.

I'm tempted to say "6. Thou shalt not endorse the elephant-style return key", but that may actually be personal preference. I prefer the single-line-height key on the home row, but that's just because I'm used to it.

Saturday, April 17, 2010

What happened to the Neutrino?

I have absolutely no fucking idea.

There are reviews abound around the net of this cool little beast. There are at least two unboxing videos and various specs and product shots, and various onine stores list it (granted, as "out of stock", but still, it's not a ghost). No stores carry them. No online stores have them in stock. There were a grand total of two listed globally on Ebay (one of those is now sitting in the Canadian customs office in Toronto, waiting to get shipped to me next week).

OCZ's product page is, shall we say, unhelpful. The interesting bit is that they still have a press release circa 2009 that lists OCZ as a "DIY netbook solution", and contains a link to that product page I mentioned. Their DIY notebook section lists nothing, and their End Of Life products make no mention of the pint-sized hulk. There's plenty of noise on the OCZ Forum (including a guide for getting OS X running on the Neutrino, which doesn't surprise me because with the right extra gear, that netbook could actually be more powerful spec-wise than my iMac desktop).

That's it though. Had I not lucked out on Ebay, I wouldn't be able to get one of these, and I'm not sure why given that it doesn't seem to be discontinued.

Why the questions? I'm glad you asked. It's because this seems like such a badass idea that I have to support it. They made a netbook you could feed commodity parts. No special ram, none of this HP Mini expansion port bullshit where they try to sell you a $70 cable so that you can connect it to an external monitor, no 1.8 inch hard drives. It's all standard laptop gear, so if you're a computer nerd like me, you already have the components lying around to make it cool. The units come without RAM or HHD, but because it uses standard 2.5 inch SATA drives, you can use some standard laptop RAM and SSD and get the thing up to standard laptop performance level. It could democratize netbooks in a pretty fundamental way, and remove much of the need for traditional laptops, if people could get it.

So yeah. Here's hoping this isn't some sort of widely-spread but poorly-executed conspiracy to keep the Neutrino out of users' hands.

Thursday, April 15, 2010

(exit)

I haven't really had time to work on personal projects the past while. Other personal projects and various contract projects keep on getting in the way, which is sad, but necessary.

The reason for the title here isn't that I'm quitting any of them. Far from it. As of next week, my current employer will be my former employer. It was fun stuff for a little while, and it taught me a lot about development practices, about building systems, about maintaining systems, and about development methodologies. Mostly, it taught me what not to do, which is valuable in a sense. I'm off to another company that needs a hacker/UI guy, where if all goes well, I'll get to put together a few products and a team for them. I'll do my best not to repeat history in any of the fundamentally broken ways I've observed. It was a good job for a while though, I don't want to take that away from them. I enjoyed myself. The context switches were enough to keep me focused and engaged for a time. Problem is, really, there was a hard cap on how much I could grow for a bunch of woefully common reasons, most of which I've already blogged about here. Training was non-existent. So was downtime, but it never really got pitched that way so it was hard to admit from inside the vortex. At the cycle post-mortem, we had this ceremony of listing all the things that were good and all the things that were bad. There was always a note to the effect of "Good: team really stepped up and pulled together" (read: "the team worked truly excessive overtime to hit the obviously over-inflated goals which got handed down from on high"). After the third time, I stopped bothering to point out that this was a ridiculous assertion. That there was nothing Good about voluntary slavery, or massive overtime. That really, by planning only slightly more effectively, we could reduce the amount of work necessary while increasing the quality of output and completely obviate the need for "really stepping up". It's a hard position to take when your teammates are all utterly convinced that overtime is as inevitable as object-orientation and IDE addiction. Which says a thing or two about a thing or two.

I kept getting misty-eyed this week. They're my friends, of course, and that won't change just because I'm taking my skill to another employer. Why would I ever leave? Ohmygod, what have I done?! I loved it here! It's a land of gumdrops and rainbows and unicorns where nothing can possibly go wrong!! It was more or less at that point that I stumbled into our sprint-planning meeting about 15 minutes late. I took my seat quietly, and checked out the room. Yup, they were performing The Ritual, and they were onto "What went badly". Sure enough "Really stepped up/pulled together" was over on the "Good" side, and "Too many last-minute objective changes, not enough testing" was already listed under the bad pile. I watched a lot of the old problems get paraded out and discussed. Then we got to the what's up next slide. And I'll be goddamned if I didn't suddenly feel a rush of relief that it was my last week as I was staring at the four months worth of work (and counting) that we were expected to finish in the next month.

Someone once told me that I wouldn't make a good leader because I'm too negative. I always have the "Well, we're gonna take that hill, but die doin' it" attitude. I'm not sure anyone could blame me, because I've seen the death-march-inducing, motivation-sapping effects of over-optimism, and I'll stick to my way thanks. Pessimism keeps your team from getting killed.

Anyway, it's not my problem anymore. Perspective is kind of nice that way.

Hopefully next week, I get to get back to hacking. I'll need to update my resume and portfolio, and maybe re-jig my website now that I know more or less what the fuck I'm doing. I don't really feel like a Graphic Designer anymore. Not sure if I ever did, but it's even more obvious after that stint in IT. I need to make a shirt that reads

"Human, Chaotic Good
Illustrator 5/Programmer 4/Fighter 2"

Thursday, March 18, 2010

(define (more-ergonomics)

'(I got something new.

Pretty good as far as keyboard trays go, but I still find myself wanting one of those squishy wrist-rest pads. The default wrist bit on this tray isn't terribly uncomfortable, but it doesn't quite compress right. And for all the awesome work PFU did on this little beast in terms of key placement/spacing/spring system, they didn't put any effort at all into making the wrist comfortable. That's the one thing I miss from my old behemoth (which is now comfortably at the office). I still prefer the HHL2 for speed; the keys are actually spaced close enough together (and consistently sized enough) that I get a fairly significant boost just from using it (on average 5 wpm).

It's a +5 Keyboard of Speed. Together with my +1 Trackball of Accuracy and +2 Monitors of Insight, as well as the Hard Drive of Premonition, my home machine is now significantly better, in all ways, than my work setup.

Ahem.

There's this little slide-out sub-tray for the mouse, but since I have a tiny keyboard and a trackball, both of my peripherals fit comfortably on one half of the main area. I could use it for drinks I guess.

The only complaint I have is that Fellowes are fucking liars. In fact, anyone that tells you their keyboard tray has "easy installation" is a fucking liar, and you can tell them I said so. It was a pain in the ass. Granted, in this case it was worth it for the extra space and long-term comfort I got out of it, but there was significant short-term discomfort.))

(define (office-follow-up)

'(Almost done configuring my dev environment for work. It's been bearable for a few days actually, so I've managed to get some work done at least, but there's still kinks here and there. The current plan is to get everything I need together in one place (and for the record, it's about twice as much as the documentation would have me believe I need), then create a bootable flash-drive with a dev-environment shell script to take care of everything other than the OS installation. I should be able to announce a dev-environment-on-a-stick (with your choice of editor) next week.))

(define (update-emacs)

'(I'm still updating my .emacs and associated files. The other day, I finally got off my ass and installed nXhtml mode. Which I'm not using right now, incidentally, I prefer the vanilla html-mode for my everyday editing, but nXhtml provides a lot of much-needed functionality for editing PHP, JSP and mixed HTML/JS/CSS files (I try to minimize that last group, but you still run across them sometimes).

I'm also adding little convenience functions. Things like git-svn-fetch and git-svn-commit which let me seamlessley interoperate with my office-mates without giving me the giant headaches associated with Subversion use. I'm sure it's very nice for people that are used to CVS and VSS, but I grew up with GIT and Mercurial. If you think I'll go back to centralized source control without a fight, you've got another thing coming.

Other new stuff includes in no particular order ant-build-project, restart-tomcat, stop-tomcat, and deploy-static. That last one is actually a copy of a couple ant tasks we have, which essentially just copy a whole bunch of css, js, jpg and jsp static files from our local repo to our local tomcat deployment. The thing is, the build file copies in the naive sense, whereas my emacs function uses rsync, and is therefore about ten billion times faster.

Most of that last set wouldn't have been possible without a little help from StackOveflow. I guess no-one's really thought about it, so Emacs doesn't have a built-in sudo-shell-command. Meaning I had to write my own (which is still better than waiting for the maintainer of my IDE to patch their oversight). Here's what I came up with after consulting the overflow boards:

(defun sudo-shell-command (command)
  (shell-command (concat "echo " (read-passwd "Password: ") " | sudo -S " command)))

(defun chain-sudo-shell-command (command-list)
  (let ((prefix (concat "echo " (read-passwd "Password: ") " | sudo -S ")))
    (mapcar (lambda (a-command)
              (shell-command (concat prefix a-command)))
            command-list)))

I use the first one if I can because the second one is more dependant on side-effects, and it only shows the output from the last command it recieved (so if I misspelled something in command 3 of 6 that I pass to it, I'll never know until it screws up something I'd much rather not get screwed up).)))

Tuesday, March 9, 2010

(define (work) (

So lately, I've been thinking about my work setup for hacking, and it occurs that the environment is in need of an overhaul. I've been using Windows and Eclipse, for god's sake. That's not even really excuseable. I mean yeah, I can hide behind the fact that my business card says "Graphic Designer" and take the perspective that it's the responsibility of our lone network admin to figure shit out for me, but that seems less satisfactory than doing something about it. It's not really percieved as a big deal; the rest of the team uses windows too (and our resident x-programmer is at once a Windows and Java fanatic), so there's bound to be little help and perhaps a little resistance. Here are the big reasons I'm thinking about switching now:

  1. We're planning to upgrade OSes soon anyway; it'll probably end up being to Windows 7, but I think I can at least change a couple of minds in IT given that our production servers are in fact running on Linux anyway.
  2. Between Windows, the anti-virus software, outlook and some other utilities, my boot time is in the area of 4 minutes. That doesn't sound too bad, except that my home workstation (which is ostensibly just for fun) boots in under 20 seconds. Also, because it's windows ...
  3. ... I have to reboot it at least once a day or it starts getting sluggish to the point of unuseability. Just. Perfect.
  4. I get the feeling that our admin could fix this had he taken levels in programmer, but Linux is much more easily scriptable. Specifically, the setup process is scriptable. Because of the apt-get facility (and our particular mix of technologies), it's perfectly possible for me to write a shell-script to set up a Linux dev machine from scratch. It's basically the standard LAMP stack plus Tomcat and Java 6. Eclipse and Subversion might take a bit of configuring, but since I use GIT (which can seamlessly interoperate thanks to git-svn) and Emacs, my install is essentially apt-get emacs23 git-core git-svn. Hell, I've even got lines in there to do a full checkout of the trunk and latest branch once git is installed.
  1. The current "solution" is a base image (Windows with an unconfigured outlook, and printer drivers) which the dev then has to spend about a day (two or three the first time) prepping to get up and running. This leaves something to be desired. ))

(define (ping-emacs) (

What, you thought I only got one per post?

I haven't been doing any hardcore elisp hacking for the last few days, but I still make it a habit to eliminate inefficiencies. I ended up removing uniquify from my .emacs. It wasn't getting used (and I noticed a little note it came with to the effect that it has some slight conflicts with iswitchb mode, which I do make extensive use of). I also ripped out the option in smart-tab that has it use hippie-expand. It was much too overzealous in various places.

On the additions side, blog-mode now auto-closes tags when I type the ">" character (which is a behaviour I'm thinking about just hooking into HTML mode), and I set the otherwise undefined C-' to comment-or-uncomment-region. This is another one of those times where it would have served me quite well to read up on stuff as a first reflex. I ended up reading about comment-region and uncomment-region, then spending 20 minutes or so hacking together a woefully inadequate way of getting one key-press to toggle commented state for a given region, then I stumbled across comment-or-uncomment-region on an unrelated trip through apropos.

Bottom line is, I don't think I'll ever be done opimizing, but I'm ok with that. This is an advantage of Emacs which I'm happy to have.

A little while ago, while I was still using Gedit for my typing needs, I decided that I really wanted non-broken frames ("winows" in Emacs parlance) in my editor, and I spent a good two or three hours searching around for an addon to it that would do what I wanted. It's been a while so the situation might have changed, but as I recall, there was one add-on that added a single, secondary frame that basically got treated as a second instance of Gedit (except it didn't auto-save, or ask you to save any changes when you quit the main Gedit window), and a second add-on that did precisely what I wanted but wouldn't be available for another year and a half. This illustrates the common state of editors: they're great if you ignore their limitations or resign yourself to living with them.

Emacs is different; because hacking on it is central to the idea, there's very rarely a feature you could imagine that you can't also implement yourself with a few hours of typing. Even better than that, small changes are trivial to add. That tag-closing function I whipped up that auto-fires on my typing">"? That took about 40 seconds to add. And no, it's not done yet, I'll probably change its binding or behavior, but the fact that I can is awesome.

It feels very gratifying that the cycle of

  • Think up new feature
  • Code it
  • Test it
  • Use it

could be so fast.))

(define (addendum)

'(I decided to change up the interaction on that auto tag-close function to fire when I type "</" rather than ">" (which is to say, when I type "/", Emacs checks if the previous char is "<", and fires the tag-close event if it is, otherwise it just inserts "/" as usual).

Closing tags on ">" with a save-excursion is what Eclipse does as I recall, so I sort of assumed it would be the correct behavior. It turns out that if I have any say in the matter, it's vastly preferable to have my editor close that tag when I'm already half-way into it. I may change it back again later, depending on what I notice during actual use, but this way seems to grant me more control so far.))