On Boards and Cards

Unless you’ve been living under a rock, you’ve doubtless noticed the current trend in project management tools involving “boards full of cards.”  Trello is probably the most well known (and cheapest, being free, which might have something to do with its popularity) of this archetype.  Other, more elaborate (and expensive) enterprise tools have implemented “agile” boards as part of their offerings.

Personally, I think most of these tools are well suited for their intended use case:  Agile project management.  However, as someone who’s tried to use Trello as a more, erm, general purpose tool, I’ve found it lacking (shopping lists? No.  Notes? No).  Which is fine, it’s a specialized tool designed for a particular set of use cases, which just so happen to not align with my needs.  Most of these PM tools assume the following:

1.)  You are managing projects (duh).  Which are temporary efforts with a definite start and end date.  Thus, boards are meant to be used temporarily.

2.)  You’re using some sort of Agile (or perhaps Kanban) Project Management methodology.  You may not like Agile, or it may not suit your particular effort.

3.) They’re not geared toward long term knowledge management, you’ll need a completely separate tool (such as a wiki) for this.

Issues 1 and 3 are related.  You want to store lessons learned, institutional knowledge and other “knowledge” artifacts created during the course of a project.  The traditional answer to this is to make your engineers enter this knowledge into a wiki, as the project board that was so nice for organizing and tracking tasking turns out not to be so great when it comes to organizing and archiving information for long term usage.  This, of course, introduces yet another ‘chore’ for engineers who would rather be building things.  And it boils down to the fact that taking the time to enter information into a wiki takes people out of their normal workflow.  Thus, it is frequently forgotten and/or skipped when deadlines loom.  I, for one, have never seen a corporate wiki that was well maintained and kept up-to-date 🙂

So, I think a worthy goal should be to keep information together as much as possible.  Place notes, design artifacts, project planning documents, meeting minutes, miscellaneous documentation, etc. in the same system you also place your tasking “cards,” thus folding “updating the wiki” into your normal workflow.  The trick, of course, is to keep this vast pile of information from turning into an unmanageable, unsearchable, and unusable mess 🙂

That’s the idea I’ve been pursuing with my latest project, which I’ve named Contabulo.

Half wiki, half board

contabulo_screenshot1

An example Contabulo project board

From the screenshot, at first blush, Contabulo looks similar to an agile board.  Unlike Trello and friends, however, these cards aren’t organized into lists.  In fact, there’s not a set ordering or arrangement at all as the interface assumes (at least on a well-populated board) that you’re going to be making use of that search bar to find the cards you seek.  The search feature is powered by Elasticsearch on the backend, so it does a fairly decent job (the ‘main’ database is PostgreSQL).  As you can see from the graphic, cards can be assigned different colors, and you can assign a board background image, which I know is pure vanity.

Cards

contabulo_donut_card

A Contabulo card with a header image

Contabulo cards are designed to be flexible, and contain anything from a quick note to an entire ‘wiki’-esque article.  The editing format is Markdown (specifically, Commonmark with a few extensions), and I don’t know about you, but I much prefer Markdown to the Wikitext format you’ll find in MediaWiki based wikis 🙂  As you can see from the image above, you can also attach files (including images), and can specify a card image to appear in the header.

Card_in_edit_mode

A card being edited using Markdown – at some point I’ll add a rich editor

In addition to the card body and attachments, you can add special ‘content’ blocks to a card.  As of this writing, checklists are supported, but it is easy to imagine adding many other types of useful content: maps (think – directions to events), discussion/comment sections, integrations with third party apps, etc.  You can also add ‘tags’ to cards, which of course are optional, but the search index does use to improve results.

Groups

Contabulo has the concept of ‘groups’ in order to control access to different boards.  Each user can have ‘personal’ boards which are either totally private, or can be given public read-only access for outsiders.  “Group” boards can likewise be visible only to the group, or additionally be read-only to non-group members (one notional use of a public read-only board could be a job board).  Each group member can be assigned read-only, editor, or admin-level access.

group_screen

Managing groups in Contabulo

Tech

For the curious, I’ll give a brief overview of the Contabulo “tech stack” (I think that’s what the kids are calling it these days).  I’ve been building Contabulo in my spare time (evenings and weekends), since right now I have to keep a day job in order to eat and pay the mortgage.  Thus, the need to maximize my personal productivity was definitely a major factor in selecting tools and technologies.  The backend is written primarily in Clojure, which is in the Lisp family of languages and runs on the Java Virtual Machine.  I chose Clojure because:

  1. I Like Lisp, and think it’s an amazingly productive language
  2. I have a large amount of familiarity with the JVM and the Java ecosystem in general (and there are a *huge* number of helpful Java libraries which you can easily call from Clojure), even if I may not care much for the Java language itself 🙂

I briefly flirted with the idea of writing the backend services in Haskell after working through Learn You a Haskell (great book, btw), but then the fever broke and I got better.

So, I’ve split up my backend into several Clojure services (not quite as fine-grained as ‘microservices‘ would be, but I don’t care), and one little database maintenance/housekeeping utility I wrote in Golang that runs once an hour so.  interprocess communication is largely using RabbitMQ, though some services call each other using HTTP when synchronous communication is needed.  I’m using my favorite webserver, Nginx, as a load-balancer (and also for SSL termination), and all of my backend services are stateless so that running multiple instances of each shouldn’t be a problem.  I’ve tried to lay the foundation for a scalabe architecture which will hopefully prove necessary.  I suppose I could have probably just spun up a Ruby on Rails app much more quickly, but where is the fun in that? 🙂

As I mentioned earlier, the main database is PostgreSQL, and search is powered by Elasticsearch (though a Clojure ‘search’ service sits in front of the Elasticsearch service, since ES, as with any database, shouldn’t be directly exposed to the Internet).

For the web application, I used ES6 with the Mithril microframework and Bootstrap, along with a plethora of smaller Javascript libraries, of course. I’m not the most experienced or skilled frontend developer in the world, but I think I do ok 🙂

Conclusion

Contabulo isn’t my first attempt at a Software-as-a-Service (SaaS) offering, but I feel pretty good about this one.  I find it useful, in any case, and will continue to use it (and keep it updated) for my own needs.  My focus right now is to complete testing and squash any show-stopping bugs so I can launch this thing and hopefully start getting some paying users 🙂  I have a long list of features I want to implement, but I think Contabulo is far enough along it’s time to start getting user feedback in order to guide its future direction.  If you’d like to receive updates (i.e., to be notified when Contabulo is live), please sign up for the mailing list!

Rhino SchoolTracker

rhinoman_face_rightI suppose it’s time I wrote a bit about my latest project, Rhino SchoolTracker, which I finally put up on the web a few days ago.  I’ve been working on this application for the last 6 months, and it’s definitely the largest ‘side’ project I’ve done (at least in Ruby on Rails).

The concept is fairly simple.  Last year, my wife was homeschooling two of our children and was using a collection of spreadsheets, word documents, and good ‘ol pencil and paper to keep track of everything, to include attendance, lesson plans, grades, etc.  Being a software engineer and thus a problem-solver by nature, I figured there had to be a decent software solution out there to handle the needs of homeschool educators.  Well, there are a few solutions out there, but we found them to be quite sub-par — a motley collection of windows 95-era desktop applications (we don’t use windows at the Adam house, aside from IE testing, of course) and a couple of uninspired web based offerings that looked overly complicated with dated, dreary UIs.

I thought I could do better, so I did (I hope).  I created a new Rails project, opened a fresh repository on GitHub, and got to work.  Most of my early UI concepts were sketched out on graph paper with #2 stubby pencil, which seemed to suit me better than any of the software-based UI layout tools I tried (the strength of which is most likely the team collaboration features… useless to a team of one).

I started out using a combination of Blueprint CSS and jQuery UI for the frontend, but was never really happy with it.  Searching for a solution, I happened upon Twitter Bootstrap, a great CSS/Javascript UI framework that puts jQuery UI to shame.  The bootstrap gem for RoR integrated seamlessly into my project, and within a few days I had ripped jQuery UI and Blueprint from my app and substituted bootstrap.

master_schedule_small

After I had decided on the frameworks and toolkits I’d be using on the project, I settled in for many a late night and weekend in front of my computer coding.  The result, Rhino SchoolTracker, is a complete record keeping system for homeschool parents.  Lesson Plans, Attendance, Grades, etc.  I also needed to give my application the ability to generate printable reports, espcecially attendance sheets and transcripts.  The PDF format was a natural choice, and I chose a ruby library called Prawn for the task of report generation.  It’s pretty nice, and I highly recommend it for any ruby project involving PDF creation.

In a lot of ways, this project was a great learning experience.  I delved much deeper into the Ruby language and the Rails framework than I had in the past, and I also picked up a little CoffeeScript and SCSS skills along the way.  As much fun as learning new things is, I must admit there was/is always a financial motivation to many of my projects.  I intended to make a great product, yes, but I also wanted to make a bit of money doing so.  Thus, as I was nearing the end of development on Rhino SchoolTracker, I had to think about how I was going to process the innumerable monthly subscription payments that were sure to come pouring in (maybe).  My only experience with processing payments online has been with PayPal (ick), so I was looking for something better this time around.  I wanted a simple way to manage monthly subscriptions to Rhino SchoolTracker, but without the hassles of PCI compliance or the cheesiness of tossing my users out to a third party site to input their credit card information.  Enter Stripe.  It’s absolutely perfect for small software shops that want quick, (relatively) painless payment processing.  Using their API, I can create payment forms on my site, but all of the sensitive credit card information and such is sent to stripe for processing and never touches my server, alleviating the need for PCI compliance.

paymentform

Stripe does require your site to use SSL.  However, if your web application has users entering private information (such as a school record keeping system), you’ll be using SSL anyway (I would hope).

After much testing and bug fixing (always get another person to test your app, ideally a non-programmer if you have one around — my wife was happy to assist me with this), I took Rhino SchoolTracker live a few days ago.  I’ve registered an LLC with my state (Caffeinated Rhino, LLC), and I’m actually envisioning a small side business focusing on educational software, so I’m hoping to come up with other products in the future.

P.S. Navigating the byzantine laws and regulations required to start a business in Virginia is not nearly as straightforward as building a quality web application from scratch.  It’s something I’ll write about in the future, after I feel I have a decent handle on it (possibly never).

 

In-app purchase scams

A few weeks ago, my wife’s iPhone 4 started to give out.  You see, she’s very abusive when it comes to cell phones (other items subject to her abuse include laptop computers, automobiles, my ego, and geese).  Her iPhone 3G found itself at the bottom of bathtubs, sinks, etc. more than once, and it wasn’t more than two months after she received her iPhone 4 that I was performing an LCD transplant on it.  So, now that her contract with AT&T was up, I decided to look for something a bit more durable.

My search yielded this thing:

galaxy-rugby-pro

The Samsung Rugby Pro.  A supposedly ruggedized smartphone running Android.  Since I’ve been in a bit of an anti-Apple mood lately, I managed to sell my wife on trying an Android phone.

The phone arrived in the mail, I activated it, did some initial setup (email, wifi, etc., all quite easy) and handed it to her with a “Here you go.”  The hardware itself is actually pretty good.  Android is snappy, and I personally love the customization options.  Problems soon arose, however, with her Google PlayStore account.

Within a few days, I noticed several large charges appearing on our credit card.  $50 here, $30 here, etc., all supposedly going through the Google PlayStore and associated with an app development company called Team Lava.  I immediately called my bank, canceled and reissued our credit cards, and reported the fraudulent charges.

A bit of research on these jokers at Team Lava revealed some interesting results.  Complaints against them are legion (they have a grade of F with the Better Business Bureau, for one).  Apparently their business model consists of creating free games and crafting them such that they trick users into making in-app purchases.  Large ones.  I mean, who would spend upwards of $200 to get ahead in a silly, casual game made for smartphones?

I searched my wife’s smartphone for any apps made by these Team Lava cretins and found one.  I deleted it immediately and advised my wife  to never install anything by TeamLava ever again.  Not sure what happened here, but she swore she hadn’t made the purchases (at least not knowingly), so that’s good enough for me.  I also set a PIN on her phone for in-app purchases.  Which leads me to…

Why are in-app purchases enabled by default if they are so easy for unscrupulous developers to abuse?  Android has been around for years now, so why hasn’t this been fixed?  Also, given TeamLava’s reputation, why are they still permitted to sell their scamware on Google’s PlayStore?  I would say that reflects rather poorly on Google.  Though, given my previous interactions with Google from a ‘paying customer’ perspective (Adwords, etc.) I’m not really surprised.

I’ll probably get an Android phone myself when my iPhone 4 gives out, though I’m not sure I’ll be trusting Google with my credit card information again anytime soon.  I will give Apple this, my family and I have been using iOS devices for years (and iTunes for even longer than that) and have never had mysterious charges show up on our account.  That could just be luck, since this sort of thing has been a problem with iOS as well.

Why I’m Switching from Mac to Linux

tux2I started using Macs shortly after the release of OS X back in 2001. Not being a lifelong Mac user, I tended to view Macs running OS X as UNIX boxes with a great UI and the ability to run some mainstream software.

I’ve spent most of my career in software development working on various UNIX platforms, so I used my Macs more as UNIX workstations (lots of terminal windows and X11 apps open at any time) than as consumer machines. Since I have a dislike for all-in-one computers, my machine of choice for the longest time had been the PowerMac. Despite the top end Apple tower being a multi-processored monster, there was always a low-end model available that, while not as awesome, was always just as expandable, easy to work on, and reasonably priced. My first Mac was a second-hand PowerMac G3, followed several years later by a G4. Finally, I splurged and bought a mid-range dual processor G5 Tower. All were great machines, in fact, the G4 is still being put to use as a test server running Debian.

That changed when Apple switched processor architectures from PowerPC to x86. The PowerMac was replaced with the

Mac Pro, a machine crammed with server grade components that is unjustifiably expensive for all but the most demanding (and

macintosh_g3_dt

My first Macintosh.

wealthy) users. In order to fill the gap, Apple beefed up their iMacs, which now sport large IPS screens, quad-core processors, and decent (though not high-end) GPUs. Priced out of my preferred machine configuration of tower-plus-dual-monitors, I decided to buy a 27″ quad-core iMac, a machine which proceeded to validate all of my long-held negative opinions regarding all-in-one computers, while shattering my long-suffering brand loyalty towards Apple.

A few months after bringing home my new iMac, I noticed a problem. Dark smudges were appearing INSIDE the LCD. Since the machine was under a year old, I took it to the nearest Apple Store. I lost the machine for several days, thus illustrating my number 1 beef against all-in-ones — no user-serviceable components. If the monitor (or any other part) dies, you can’t just swap it out for another and keep working, you get to take the whole machine in for service, causing you to get behind on whatever project you’re working on at the time. Anyway, I got the machine back with a new LCD, and figured it was just a defective component.

Next, the optical drive quit. I was in the middle of working on a project, and so decided not to take it back to the Apple Store right away (I was forced to dig an old external USB CD-R drive out of my closet). Not long after this however, the LCD started dying again in the same manner. So, back to the Apple store I went, and after about a week I had my machine back, with another new LCD.  Since I was now nearing the end of my 1-year warranty, I purchased AppleCare for the first time in my Mac-using life.

At this point, I had a serious conversation with myself about why I was spending so much money on Apple products when the quality had clearly become sub-par. I also asked myself what I could do on a Mac that I couldn’t do on a Linux box, and the answer was: not much. Maybe Photoshop, but that can be run on Windows, either via WINE or a Windows install on a virtual machine (or if the performance wasn’t good enough with the aforementioned options, I could always install both Linux and Windows on one machine and dual-boot).

For the time being, however, I had a once-again operational Mac so the issue wasn’t pressing. Then, it happened again. LCD number THREE bit the dust. Same failure. I walked into the Apple Store and had to fight back the urge to hurl the thing in the general direction of the “Genius” Bar and walk out. But alas, I just walked up to the counter, plopped my POS iMac down, and demanded a full-replacement. The “Genius” behind the counter gave me a quick deer-in-the-headlights look, then went to fetch the store manager.

I explained to the manager that my iMac had had its LCD replaced TWICE, it’s clearly an unreliable machine, and I need to get a new one. He then suggested that the damage was due to environmental factors and asked me if I smoke. I explained that I don’t smoke, that I use my computers in a suburban home office setting (with a few non-Apple LCDs that have never had a problem), and that no, I can’t set up a class-1 cleanroom in my house in which to use my Apple products.

After some back-and-forth, he told me that they can’t replace the machine, but they’ll happily replace the LCD again. I then told the “Genius” that after 10 years as a loyal Mac user, I would be moving my work flow to Linux, and that this iMac would be the last Mac I ever bought. But, as a matter of principle, I’m going to bring the machine back every few months for another $700 LCD replacement since I had purchased AppleCare. I left, went directly to a PC parts shop, and bought all the components I needed to build a nice Linux workstation.

tux-eating-an-appleI’m pretty sure Apple doesn’t care about users like me, as they seem to have turned their focus toward producing products for the consumer market while systematically dismantling their professional user base. The recent Final Cut Pro X introduction fiasco is a good example of this. There are even rumors circulating that Apple is considering killing the Mac Pro — they already killed the XServe (without warning), basically exiting the enterprise market and screwing over whatever corporate customers they had. The uncertainty over Apple’s future plans is driving away a lot of professional users. It’s kinda sad to watch, but I guess it won’t be my problem anymore.

Two Weeks with a Standing Desk

standing_desk2If many of the recent studies on the subject are to be believed, sitting all day is horrible for you. Regardless of how much we may exercise when we aren’t chained to our desks, sitting for long periods places us at greater risk for various cancers, obesity, and diabetes, not to mention neck and back problems.

Unfortunately for most of us, we don’t have much of a choice in the matter. I’m currently working a full time job that requires me to sit in a veal-fattening pen all day writing code. I also spend several hours a day at home, seated in front of my iMac, working on web development projects. I do my best to get up an move around as much as possible, but I’m definitely spending several hours a day more than I should with my butt parked in a chair.

There isn’t much I can do about my work environment at the office (Clearly, The Man is trying to kill me). At home, however, I figure I can do whatever I want (subject to the approval of my wife) so after reading about the new ‘standing desk’ fad in Silicon Valley, I decided to be Mr. Trendy and try it for myself.

My first thought was to price a few desks online, where I discovered much to my dismay that standing desks have a way of costing two to three times more than regular old sitting desks. I’m sure this is partly due to the new-found popularity of standing desks and partly due to the fact that standing desks either need to be customized to the height of the intended user (For some reason, human beings can vary quite a bit in the height department), or be made ‘adjustable’, which surely adds to manufacturing costs. I did find several good adjustable-height desks online, but the prices pretty much eliminated them from consideration.

Undeterred, I pulled out a piece of notebook paper and began sketching a design for a standing desk I could build myself. I took a few measurements, and decided on a height of 42″ for my desk (about an inch below my elbows). Then I realized another issue: While 42″ may be a good height for my keyboard and mouse, it would definitely be too low for my monitor.

According to OSHA’s ergonomic guidelines, the top of a monitor should be about at eye level. Personally, I can’t STAND that, but I’m a bit apple_iiodd in that I like my monitors to be set high. At the office, my monitor is set on top of a stack of books, and I still don’t think I have it high enough. I unconsciously tend to slouch in my chair until the center of the screen is at or slightly above eye level. It’s possible this is due to the fact that I spent the formative years of my computing experience as a child sitting in an adult-sized chair at an adult-sized desk, peering up at a tiny Apple monochrome monitor that sat perched atop an Apple ][ and a set of chunky Disk ][ drives. I chose not to fight my subconscious conditioning and decided to build a split-level desk, with my 27-inch iMac sitting on a second platform about 6 inches above the keyboard/mouse platform.

So, sketches and measurements in hand, I headed over to Lowe’s to buy supplies. The legs of the table consisted of four 48″ 2x4s and two 42″ 2x4s. I decided on a width of 30 inches and a depth of 24, so I bought a 72×12 piece of pine board, cutting it into two 30×12 pieces to serve as the desktops for my two platforms. For bracing, I bought a few 1x3s, cutting two 30″ pieces to brace the back, and four 24″ pieces (two for each side) to brace the sides. To support the back of the keyboard platform, I bought two metal L-brackets, attaching one side of each bracket to the front legs of the monitor platform, and the other side to the bottom of the pine board serving as the keyboard platform. I also bought a box of 2-inch wood screws, and some half-inch ones for attaching the L-brackets.
After putting it all together, the result was better than I expected. Kinda ugly, but sturdy:

I’ve got this set up in the little home office corner of my bedroom (my wife forbade me to put in the living room), and have been using it constantly for the last two weeks. I’ll admit it took a lot of getting used to, as after a few hours my feet started to burn and my calves started to ache. The discomfort faded as the weeks went by and now, I can say, I much prefer this to sitting in front of a desk for hours on end. Standing helps keep me alert and focused on the task at hand, and when I get into a flow, pounding out code or intently focused on a design, I hardly notice that I’ve been standing for a long period of time. I do, however, have a bar stool that I occasionally use when I’m too tired to stand after a hard leg workout.

standing_desk1

So, my recommendation: Get a standing desk. If you have the money to spend and are concerned about aesthetics, go out and buy one. If you’re cheap like me, build one; at least you’ll be able to try out the experience at a low cost and decide if you want to shell out the big money for a nicer desk later.