RSI & Keyboards

I’ve suffered from RSI since 2003 and have used a variety of keyboards over the years to varying results. I was originally diagnosed with tendonitis in both wrists. Over the next five years my symptoms moved all the way up my arms into my shoulders. Your nerves branch at the shoulder down your arm and your ribcage. On bad days, my nerves were so inflamed I could scratch my elbow and it felt like somebody was touching my side.

I’ve since gotten more than 90% better through drastic diet changes, but until I reached that point I tried a lot of keyboards. If you have suffered from RSI or just like trying out weird keyboards, read on.

Microsoft Natural MultiMedia

Well-used Microsoft Natural MultiMedia keyboard

Let’s be clear, the Microsoft Natural MultiMedia is trash if you are suffering from serious RSI, but it (or something similar) is what many people start with. It’s about the only “ergonomic” option you can find in brick-and-mortar stores. I got one in college (sometime in the 2004-2005 range) and had good results initially. That is a pattern with many ergonomic devices. It isn’t so much that the device is ergonomic; it’s that you are exercising different tendons/ligaments/muscles around the strain. Different angles and positions stress different ligaments and tendons, so your injuries get some much needed relief. Unfortunately, for many people the underlying cause isn’t being treated and they eventually develop similar problems with the new keyboard.

Kinesis Advantage Pro

Well-used Kinesis Advantage Pro keyboard

I graduated from college in 2007 and my RSI quickly got worse with a 40 hour work week. The Microsoft Natural MultiMedia just wasn’t cutting it anymore, so I swallowed hard and spent $260 on a Kinesis Advantage Pro.

The transition was rough and I was worried I had made a terrible mistake. I remember huddling over my desk in more extreme pain than ever after only a couple days of use. I stuck it out though and, after an adjustment period (and a lot of ice), it served me well for years.

The layout of the Advantage Pro is amazing. Your thumbs are amazing appendages, but the standard keyboard layout wastes them by only using them for the space bar. The Advantage Pro moves a bunch of commonly used keys to two keypads in the center of the keyboard. This lets you use your thumbs for Backspace, Delete, Super, Alt, Home, End, Page Up, Page Down, and Space. The key wells are spaced far enough apart that your arms can stay naturally at your sides and the keys are stacked vertically instead of staggered. This required some adjustment, but was amazing once I got used to it. The keys are Cherry MX low-force, tactile switches, which feel amazing and helped with the impact of bottoming out. You can also remap keys (useful for programmers who make regular use of symbol keys that are seldom used by the general population), setup macros (something I never got in the habit of using), and there is an optional foot switch that is commonly used for modifier keys (never tried it).

At some point (maybe in 2008?) I switched to Dvorak. I’m not sure if this really made any difference, but it was fun. I switched back and forth between QWERTY and Dvorak for a couple of days before fully committing because I was having problems learning by going back and forth. I kept with Dvorak for a couple of years before switching back to QWERTY because I was tired of not being able to type on any other keyboard.

Kinesis Freestyle Ascent

Kinesis Freestyle Ascent keyboard

I used the Kinesis Advantage Pro until sometime in 2011 when my RSI started getting worse. It just wasn’t cutting it anymore. At that point, after years of toying the idea, I bit the bullet and went vertical with a Kinesis Freestyle 2. (The 20″ cable between the sections is necessary if you want to go vertical.)

It took about two weeks until I could type at a reasonable enough speed to be productive. You could probably adapt faster if you can switch over full time immediately. I switched back and forth for a little while so I could actually get some work done.

The Freestyle itself is far inferior to the Advantage Pro, but I can’t use the Advantage vertically. That is the selling point. Otherwise, it’s a pretty average keyboard.

But going vertical made it all worth it. Being able to type with your hands still in a neutral handshake position is amazing and I doubt any horizontal keyboard will ever be able to compete with vertical (at least in my case).

DIY Kinesis Freestyle Ascent keyboard

The Ascent is the vertical mount for the keyboard. It actually can be used at many different angles, but I’ve only used it at the full 90°.It is an extremely well made (and extremely over priced) adjustable steel stand that the Freestyle screws onto. But you don’t actually need it. For the first couple of years I actually used a DIY stand from some scrap wood and attached the keyboard with velcro. I’ve since relented and actually bought the Ascent (it’s much better for travel), but you don’t actually need it.

The Future

Right now, I’m in a good place and don’t feel a need to switch to anything else. There aren’t that many options for vertical keyboards and there isn’t much interesting innovation elsewhere that I have seen. I don’t expect anyone to run out and try a vertical keyboard, but don’t be afraid to try it if nothing else is working. Or if you just want to be the guy in the office who always gets odd looks and has to explain their setup.

Test Driving the Microsoft Band SDK

TL;DR: The Band SDK is currently very much a preview and you should wait if you want to do anything serious with it. You’re very limited in functionality.


I use my Band on a day-to-day basis with my Nexus 5. I had never paired it to a Windows Phone. I had to factory reset my Band to get it to sync with my Lumia 635. I’m hopeful this is not a common issue when switching between platforms. I had no problem getting the band to pair back to my Nexus 5 when I was done. If it is an issue, then cross-platform development would be significantly easier if you had a separate Band for each platform. That may be true anyways to avoid constant re-pairing when testing multiple platforms at once.


I was using the 1.3.10219-preview build from NuGet. Currently, you can

  • Read sensor data in real-time
  • Create tiles and send notifications to them
  • Change themes
  • Change the main tile background image

I was mainly interested in sensor data. My goal was to create a simple app that would post your steps for the day to Slack (I have a lot of Slack code from a Windows Phone Slack client I started and didn’t finish). Ideally, the user would be able to tap a tile on the Band and a message would be sent to Slack. Unfortunately, the SDK does not support anything like that. You can send notifications to a tile, but you can’t trigger code on the phone from a tile. My backup plan was to have a timer background task that read step data from the Band, but that didn’t work either. Apparently, the SDK does not work in background tasks right now . I settled for the user having to tap a button in the app.

PCL Support

While I was working on Windows Phone, a co-worker was playing with the SDK on Android using Xamarin. We were disappointed to see that the NuGet package does not support Profile259, which would include iOS and Android. It only supports net45+win+wpa81. Long-term, I hope to see the interfaces separated into a separate assembly so that they can be referenced by the PCL. Otherwise, I would need to wrap almost the entire SDK myself to use it with MVVM. Or hope that Xamarin does it for them with their component.


  • Bluetooth is flaky. You will get IO errors. Be ready for them.
  • I was also surprised that the pedometer sensor gives the total number of steps the device has seen overall, not just for the current day. Since you can’t run in a timer background task right now, there is no reliable way to get just your steps for the day.
  • Be careful managing the lifetime of your IBandClient objects. When it gets disposed, all of your open connections to the Band will be closed. This is perfectly reasonable, but I wasn’t thinking about it at first. If you’re wondering why your ReadingChanged event never fires, this is probably why.

Mapping View Model Dependencies with MvvmCross and AutoMapper

AutoMapper is one of those amazing tools that I wish I was better with. It’s incredibly flexible, but I often throw in the towel and map things myself when it starts getting complicated. A recent pain point has been view models in a MvvmCross project.

MvvmCross is a nice C# implementation of the MVVM pattern. I use it on a daily basis to write mobile apps. It’s very common to use it with AutoMapper to map from Model -> View Model. However, my view models often have constructor dependencies, which AutoMapper can’t handle with the default configuration.

Solution (On GitHub)

MvvmCross is able to supply these dependencies. We just need to make sure everything is registered and tell AutoMapper how to get them. My demo is a simple app that displays different types of tiles.

You can see that TileViewModel has a dependency on ITileService. Because of this, AutoMapper can’t instantiate a TileViewModel. We need to let AutoMapper know how to supply this dependency, which we can do through configuration.

The default App.cs for MvvmCross already registers all interfaces that end with “Service”, so we just need to register the view model.

Now, we just need to tell AutoMapper to use the service locator when mapping to TileViewModel

And the magic is complete. Now, we can use AutoMapper as usual.

When we map to TileViewModel, each instance is resolved with Mvx.Resolve, which knows how to supply an implementation of ITileService. You can see a complete demo app at

Startup Founders & Risk

Real Life Sciences (RLS) failed for many reasons. The tech team consisted of me and one of the co-founders. (And for the first few months it was just me.) The tool we built was functional, but not spectacular. We used a lot of tech we weren’t familiar with, which slowed progress. The team was distributed across four cities, and none of us had experience working remotely. Consequently, communication was poor. The only funding came from a family member of one of the co-founders.

But I think the biggest reason for failure was risk imbalance among the founders (and me).

I was initially brought in as a full-time consultant to build the first version of the product. At this point, the four co-founders were all working part-time in various capacities. After a few months, the technical co-founder lost her day job when that startup went under and she shifted over full-time to RLS. Two other founders were working on finding funding and the fourth founder did… something. I never was quite sure what he did.

At this point we had four founders in the following situations

  • The technical co-founder was working with me full-time building the product.
  • The two business/sales co-founders were working with our alpha customer and trying to secure funding, but only part-time.
  • The fourth co-founder was doing… something.

We were now in a situation where the people responsible for securing funding had little to no risk compared to the technical people. Both of them had good jobs and no incentive to quit them. It’s unclear what level of success would have even been required to bring them in full-time. I’m not blameless either. I enabled the situation by continuing to work for equity after the money ran out. It doesn’t matter how much of the pie you own when there is no pie.

I know it is almost impossible to be part of a startup where all co-founders take on an equal risk. There are too many circumstances outside of work for that to be possible, but don’t make the same mistakes I made.  If you see a situation where the risk is extremely lopsided, bring it up. And if nothing changes, look for your exit.

Knowing When To Quit

Note: I started this post in October 2012 after quitting my previous job at the end of February 2012. I never posted it, but feel it is appropriate now that the company exists in name only. I’ve made slight changes, but most of the post exists as I originally wrote it.

I haven’t been paid since August. The only co-worker I see on a daily basis is my cat, who always thinks it’s her turn with the keyboard. I would love to have a week of physical interaction with the rest of my team. And even with all of that, my new job is still awesome.


I’m not a quitter by nature, but in February I actually did it. I quit. I had been trying to make it work. I really was. Eventually though, I had to accept that sometimes a job just isn’t right for you. The tech may not be interesting. Maybe the pay is mediocre. Possibly your main project has no direction. And sometimes all of these converge into one… what? I mean, it’s not terrible. You can live with it. After all, they are giving you money to write code, right? And your co-workers are all really nice.

But what if you don’t need the money? Or you spend a good chunk of your time wondering why you came to work today? Or every time you look something up on StackOverflow you get distracted by the Careers 2.0 postings along the right side. That’s where I found myself this winter, so I quit.


I wrote an email on a Friday, slept on it over the weekend, and then sent it first thing on Monday morning. By mid-morning, I knew that I was going to be unemployed in two days. I had no plan, just the usual “exploring opportunities” and “researching startup ideas”. But I didn’t need the money and I felt amazing. The happiest I had been about my career in awhile.

Moving Forward

And then everything just fell into place. Former co-workers and classmates heard I was available and within days I had multiple options. I decided to work remotely for a former classmate’s startup. And when the money ran out I just kept working.

I get to work with an up to date stack on a greenfield project (the first true greenfield of my career). I get serious input into the architecture. I get the freedom to work whatever hours I want, from wherever I want. And, right now, I don’t get paid. Sometimes though, it pays to be a quitter.


It’s now May 2014. That startup never did get any more funding. I continued to work on it intermittently, but cut my hours back significantly. I got a lot of equity thrown at me, but even 100% of zero is still zero. Amusingly, I was so underpaid before, that even though I didn’t get paid for the last five months of work, I still made almost as much as I had the previous year.

I was already having doubts that funding was coming around the time I wrote this post, but I didn’t have anything else on the table at the time, so I stuck with it. I need to collect my thoughts, but for now I’ll just say that you should avoid a startup where there is an extreme risk imbalance among the founders.

Two Year Recap

The short recap of where I’ve been for the past 2 years.

On February 29, 2012, I quit my job at Summersault working on I was struggling with RSI and the work wasn’t fulfilling. The backend was a mess and the project had no direction. I had butted heads with other developers over some issues repeatedly and no progress was being made. My plan was to take some time off to rest my arms and look at some startup ideas.

That plan literally lasted one day. On March 1 an old college friend contacted me asking if I wanted to come work at her new startup. Over the next 6 months we made progress, but funding dried up and the product died in a private beta. Professionally, the best things to come out of it were that I got to say I was a professional Ruby developer and that I had experience working remote.

From there, I transitioned into my current role as a remote developer for InfernoRed Technology. I’m back in the .NET world, which still feels weird. I hadn’t owned a single machine running Windows since 2008. Now I’m writing Windows 8.1 apps. It also broke my streak of not having professional experience with a new job’s primary language. I went from C# -> Perl -> Ruby -> Python -> C#. (Yeah, there was a brief Python foray in there.)

The real purpose of this post was to get back into the swing of writing and publishing. Over the past couple of years I have started writing several posts, but never finished. I’m a creature of habit, and if I don’t include writing in my regular routine, it just doesn’t happen. Hopefully this is a new start.

CodeMash 2012

I had the good fortune of attending my first CodeMash a couple of weeks ago. CodeMash is a conference in Sandusky, OH in the middle of winter at an indoor waterpark/convention center. All 1200 tickets were sold out in 20 minutes and the registration rush brought EventBrite’s servers to their knees. There weren’t any Perl talks (maybe I’ll submit one next year), but there was a wide range of topics to choose from.

Building For the Cloud at Netflix

Carl Quinn from Netflix gave an excellent talk on how Netflix uses Amazon Web Services. They have a really slick setup where a deployment involves simply firing up a new, pre-baked instance and redirecting traffic to it through the load balancer. The new version runs alongside the old version and a rollback simply involves telling the load balancer to send all traffic back to the old version. By pre-baking images they avoid having to do any scripting on the instance as part of deployment. Pretty slick. And their so redundant with their Cassandra instances, they put them on ephemeral storage, which means that the data disappears if the instance is shutdown.

Becoming a Ruby Gemcutter

I only caught the second half of Nick Quaranto’s talk on building ruby gems, but what I did see was a good outline of best practices for creating and managing your own gems. I was also interested to learn of GemTesters, which is basically CPAN Testers for Ruby. I often hear Perl mongers mention that no other community has something like CPAN Testers and that makes Perl better. Well, Ruby has it.

Cooking Environments With Chef

I was really looking forward to this talk by Colin Gemmell and wasn’t disappointed. Colin went over the basics of knife, roles, recipes, and cookbooks, while making it all seem so easy. I’ve even started playing around with Chef at work already and am hoping to automate a good chunk of our infrastructure management with it. Nothing like a developer pretending to be a sysadmin. I think we call that devops now.

Cross-Platform Mobile Apps With jQuery Mobile

I had the misfortune of fumbling around with jQTouch this summer, so I was looking forward to hearing about how the 1.0 release of jQuery Mobile was working out. Apparently a lot has changed since the summer and it is now on a path to becoming the dominant browser-based mobile framework. It’s even got Visual Studio 2010 and Dreamweaver CS5 integration, which indicates some serious momentum to me. I’m hoping to get the opportunity to play around with this some more on a side project.

Information Overload

Scott Hanselman is one of the best speakers you will ever see at a tech conference and this talk did not disappoint. He went over how to deal with information overload. Scott gets hundreds of emails a day and can never hope to give everybody the slice of his time that they wish they could have. Dealing with this has led to him developing a number of techniques for coping. For example, he splits his inbox by whether the message was sent to him or he was just CC’d. If you CC him on an email, he may never read it. If it was important you would have sent it to him. The talk was a blend of many time management and organization techniques and I highly encourage you to check it out once it’s up on InfoQ within the next few months.

Beautiful Front End Code With Backbone.js and CoffeeScript

Backbone.js and CoffeeScript are two tools that I’ve been interested in, but have not had the motivation to actually check out. I’ve been through the quagmire of trying to understand jQuery eventing gone wild. And I’ve been the one writing the code. At some point ad-hoc event handlers just gets to be too much to manage and that is where a tool like Backbone.js comes in handy. Backbone.js is just a client-side MVC framework. That’s it. And coupled with the expressiveness of CoffeeScript you can get a lot done with just a little bit of code. I see myself using this judiciously in the future. For many sites it would be overkill, but even those sites often have certain pages which are more JS-heavy than others.

It was a great conference. Many attendees consider CodeMash to be the best conference they attend every year. I was just about the only Perl guy there, but it was great being immersed with developers with a wide variety of skills. And it’s very satisfying to play in a waterpark in January while it snows outside.

The Wow Factor

One thing that I find Perl to be lacking is a “wow” factor. Something so easy and awesome that within 5 minutes you’re sold on it. I was reminded of these after starting a side project with Ruby on Rails and Heroku.

This is my 3rd foray into Rails. I briefly worked on the initial version of OrgSync in 2007 with Rails 1.2. I came back to do a small website (since switched to WordPress) in 2009 using Rails 2.3. Now I’m back on the train in 2011 with 3.0.7. Every time I’ve ventured in I’ve come out deeply impressed and this time it is even more so because of Heroku. I went from never having read anything about it to having an app up and running in hours. And a lot of that time was spent just browsing their documentation. I could have done it in 15 minutes. The pain of Rails hosting I experienced in the past is simply gone. And it is free to get started. Everything about the process is designed to minimize the amount of friction a new user experiences, all the way from creating a Rails app, creating some scaffolds, and installing it on Heroku.

Maybe Stackato or DotCloud can provide some “wow” for Perl. Until then I’m pretty stoked to be riding the Rails again.

Perl From The Outside

I’ve been a Perl developer for almost 6 months now, so I thought it would be good to step back and document what the community looks like to an outsider. Before moving to Perl I worked professionally with C# as my primary language for 3+ years, so I have a bit of a different background compared to the average Perl monger. I also have varying amounts of experience with JavaScript, Python, Scala, Ruby, Java, and C/C++. Keep that in mind. You’re journey to Perl has probably been different then mine. Also keep in mind that this is what the community looks like to an outsider, not what it actually is.

People Still Write Web Sites in Perl?

If you’re heavily invested in Perl and the surrounding community, I probably already angered you with that statement. Unfortunately, that is the prevailing view of amongst my developer friends. Most of them use C# as their primary language on the job, but have also used VB6, Java, C++, JavaScript, Python, and PHP (and probably more I don’t know about) at some point in their professional career. It was also the first thought I had when I saw a job posting for a Perl web developer. I had been looking for two months and that was the first one I could remember coming across. I didn’t match the requirements, but it was local and I knew I could learn a language quickly. I didn’t know any C# before my first job. Why not go into my second not knowing any Perl?

One rebuttal to the “nobody writes web sites in Perl” argument among Perl mongers is that pigeon holing the use of the language to only how prevalent they are in web programming is unfair. I sympathize with them, but that doesn’t change the fact that the perception of a language among young developers is almost entirely driven by its adoption (and the visiblity of that adoption) on the web. Currently, when a fresh graduate enters the workforce most job postings are very web-centric. The hobby projects most students have usually involve games or web programming, two areas where Perl has struggled to gain traction.

The Learning Process

Back to my learning process, I got an interview and afterwards drove straight to the library to pick up Programming Perl (the camel book). I didn’t know anything about Perl, but I knew the camel book was the de facto guide. Unfortunately, the camel book hasn’t been updated since 2000, but outside the Perl community it is really the only book anybody is familiar with. Combined with the lack of new Perl books in general and their absence from bookstore shelves, this is a big contributor to Perl appearing dead to an outsider. I have heard rumors that an update is on the way, but I couldn’t find any confirmation on O’Reilly’s website.

So, beyond the camel book, what other resources does a newbie come across? Coming from C#, StackOverflow had become my standard reference for any .NET question. The site is written in .NET and the team behind it is well known in the .NET community. Unfortunately, the Perl community hasn’t been as enthusiastic in its embrace of StackOverflow. There are several good reasons for this, most having to do with the community already having established mailing lists and the prior existence of PerlMonks. For the outside developer though who already uses StackOverflow as a standard reference for a multitude of languages and tools, the dearth of Perl questions gives the impression of little use. A quick glance at the StackOverflow tags page lets us see that there are ~17x more questions tagged with C# then Perl. Is C# usage really 17x greater than Perl? Probably not, but the initial perception it gives is not good.


Perl has embraced the motto “there’s more than way to do it” since it’s beginnings and in many ways the philosophy was served it well. The language itself is very extensible and that extensibility has encouraged many developers to have the hubris to think “I can do X better”. This philosophy has given us diversity in things like OO frameworks, where you are free to choose from several excellent choices depending on your needs. However, it also creates a sense of chaos and the lack of any sort of ranking system on CPAN makes it difficult to know which modules to actually use. The worst example I have seen with this is error handling.

Perl predates the widespread adoption of exceptions as the de facto way to handle errors and many developers have stepped forward with modules to fill this void. The problem for the Perl newbie is that there is no easy way to determine which one to use. The fact that such a fundamental, and in other languages simple, question is complicated by so many choices is overwhelming when learning the language. A newbie is confronted with at least the following choices:

There is no easy way for someone just learning Perl to choose between them. The first result from Google for the search “perl error handling” is an article from 2002 for the now deprecated Error module. It’s a shame that such a concept that is so easy to pick up in other languages can be so frustrating to a new Perl monger. I ended up just using the built-in handling, which felt (and continues to feel) clunky compared to the ease of exception management I was used to.

They Can’t Even Ship a New Version!

At some early point in my learning process I started hearing about Perl 6, a subject that seems to cause confusion even within the Perl community. Unsurprisingly, this confusion is magnified for newbies. I now know that Perl 6 is to be treated as an entirely separate language, but outsiders do not know this. To them the decade long (and still going) process to create a production quality implementation seems like a joke. When an outsider sees the names “Perl 5” and “Perl 6”, the completly natural assumption is that “Perl 6” is the next version of Perl. And the natural conclusion after seeing that Perl 6 was announced over a decade ago and has very little adoption, is that Perl is a dead language. I have read that Larry has spoken the final word on this issue, but that doesn’t mean it was the correct word. It just means the issue has been closed for debate. The name Perl 6 will continue to hurt the perception of the community from the outside.

Beating the Java Strawman

Most developer communities have a favorite whipping boy. Perl (like many) has chosen Java, but seems to have thrown the baby out with the bath water by vilifying everything associated with Java as well. Now, I’m not here to defend Java. The language has serious warts (crippled generics anybody?) and the late 90’s “enterprise” framework rush crippled the Java community in ways it is still struggling to break away from. But I found the wholesale rejection of everything associated with Java distasteful in many ways. First, it felt childish, but more importantly it has left the community behind the curve in many ways, most notably in object oriented architecture and standard design patterns. As a developer with a strong background in these areas this was a bit of shock. My fears were at least partially eased when I discovered Moose, but overall the Perl community comes off as too cavalier in its dismissal of these ideas.

On a related note, yes, I know that many important OO design principles did not originate in the Java community, but it’s status as the dominant enterprise language at the time the internet took off put it in a unique position to be a test bed for many design ideas on large projects as businesses rushed to retool their infrastructure.. Consequently, most influential architecture and design books released in that time period generally assume Java.

Shaking Things Up

At this point, outside developers have little interest in learning Perl. Any exciting new developments tend not to break out of the Perl echo chamber. For example, the fact that Perl now has several nice OO framework implementations is nice, but doesn’t attract any new Perl developers (although it does seem to have brought some old Perl developers back into the fold).

Looking in from the outside, I see two possibilities for attracting widespread interest in Perl again. One is widespread adoption of Perl 6. It doesn’t really matter if anything is gained technically from this. As I stated above it would remove the specter of decay that surrounds the community. The buzz from some notable adoption of Perl 6 could be the push some developers need to take a look at Perl. In a similar fashion, for the lack of a better comparison, Perl needs it’s killer app/framework. The best example of this in the past decade has been Ruby on Rails. Ruby is a very nice language, but Rails gave it the momentum it needed. I, and many others, would never have given it a chance without Rails. I have no idea what this project would be for Perl, but it wouldn’t hurt to take chromatic’s recent advice and brag about interesting Perl projects.


Overall, my journey to Perl has been worthwhile. I had been concerned about being typecast as a .NET programmer and getting stuck in Microsoft-land for my entire career. Being able to program in multiple paradigms (static vs. dynamic in this case) has certainly made me a better programmer and expanded how I approach certain problems. Plus, it confirmed to me that I can learn and become productive in a new language in a very short period.

However, the problems with the perception of the Perl community aren’t going away and at this point it is probably too much to hope that they ever will. The community itself is too fragmented and pulled in too many different directions to expand it’s core niche as a text processing language. Perl certainly isn’t dead and does seem to be gaining some momentum internally, but none of this has reached the outside world. Until it does the community will not grow in any significant way


After much gnashing of teeth, I got Games::Tetravex working earlier this week. This a Perl implementation of tetravex using SDL and MooseX::Declare. As my first foray into both SDL and Moose, as well as the first game programming I have done since college, I thought it would be useful to lay out my impressions.


I’m pretty ignorant when it comes to graphics libraries. I did a little bit of game design in college in Java, but nothing with any depth. My crowning achievement was a half-working, four player, networked pong that I wrote in a two night code flurry. Then we got our grade and I never looked at the code again. With such little experience my first task was locating some tutorials. Luckily, I stumbled on SDL_Manual which, while not great, gave me enough of a primer to get started.

As far as actually using SDL for Games::Tetravex, it was pretty easy. It required me to start thinking in terms of (x, y) coordinates again, but, armed with some scrap paper, I was able plot out most of my canvas fairly quickly. It’s by no means pretty, but it does the job. I was quite happy with the SDLx::App and SDLx::Controller wrapper modules, as these made writing the actual game loop a piece cake. It becomes as simple as creating the app, registering some event callbacks, and calling run. Very nice.

Games::Tetravex screenshot


To me, Moose is what gives Perl a future. Without a full featured OO framework it will be difficult to attract young developers to the language and Moose delivers the goods. My usage in this project is primitive, but I still came away with a good impression. I started the project as just one big script until I got a handle on what exactly I wanted to do. At that point I started refactoring using MooseX::Declare and was very pleased with the final result. In truth, the use of MooseX::Declare was complete overkill for a project of this size, but I figured I might as well jump into the deep end of the pool and see what happens.

It wasn’t all fun though. The big issue is the stack traces MooseX::Declare returns whenever you have some sort of parse error. They’re awful. Very rarely did they give any information about where the parse failed. I had to resort to commenting out large blocks of code until the program would run again. That was the only pain point I ran into, but it was a doozy. I’m sure there is useful information buried in there, but a stack trace of over a hundred lines with no useful summary is a problem.

To Do

There is still a lot left to do. The big one is that you can only play a 3×3 grid. After that it needs a lot of spit and polish, such as

  • timers
  • configuration
  • top times
  • better piece swapping animations
  • improved graphics

and a bunch more I’m forgetting right now. We’ll see how much I actually get to before my eye starts wandering to some new piece of shiny I want to learn.

Code available on github at–Tetravex.