That’s pretty much all you need to know. yED lets you stick polygons graphically into blank space, label them, and draw connections between them haphazardly, then click a single menu to automatically reorganize the jumble you made in any order you like – hierarchical, tree, organic, circle, UML, etc. It also supports import of existing data. Cross-platform, open-source, awesome.

Open Source Billing Software

Like it says on the tin, I’m an IT consultant. One of the things I need to do my job is a decent invoicing system – and, importantly, one that’s internet-friendly – I need to be able to access it from anywhere via the internet, and I need to be able to email invoices. Because of the very agile nature of a small IT consulting business, I absolutely need the ability to write one-off invoices “on the fly” as well, without depending on inventory or long look-up tables of specific parts or services.

That said, I do also offer monthly and annual service and/or hosting agreements to customers, which I have been (actually, my lovely bookkeeper has been) banging out manually each month/year/whatever until now. And some parts and services change infrequently enough that it would be nice to just pick those from a list – particularly if I can override the default pricing set if I need to. So it would be a giant plus for my invoicing application to gracefully handle recurring billing and pre-configured line items as well as one-offs.

There are quite a lot of subscription services which do this kind of thing as a hosted service, but being who I am, I much prefer to host it myself – and if at all possible, I prefer an open source solution as well. Unfortunately, while there are quite a lot of them to choose from, they’re all pretty flawed in one way or another. Listed below are the results of my search, with the one I eventually settled on listed last.

Argentum – unsuitable for me, because of how much labor you need to go through in order to create an invoice – you need to create a client, create a project for that client, then create a ticket for that project for that client… which you can then add to an “invoice” which has no details within it; it’s just a collection of “tickets” which have been marked complete. I’m sure this works for some business models, but it doesn’t work for mine.

Billwerx – unsuitable for me, because it has no support whatsoever for on-the-fly invoice items. Any item invoiced must be selected from a table of possible invoice items with preset prices; neither prices nor descriptions can be set or overridden invividually on particular invoices.

Agilebill – this is a formerly commercial and rather large product which has been open sourced. Support remaining is dubious at best, and it was too large and complicated to suit what I needed. If a large community (including developers!) ever coalesces around this as an open source project, it might look better… though still probably not so great for me, as it’s not really “agile” enough for what I do.

BambooInvoice – Usable; in fact I used it for two years. If what you want is the ability to write an invoice on-the-fly, with whatever price you feel like setting for each line item, then generate (and email) PDF invoices, and enter payments later, this will work. However, it’s got problems – it’s open source, but sort of grudgingly (the author has griped numerous times about people forking the code), it uses a “framework” that I’ve only seen one other place (CodeIgniter), the release schedule is glacial at best, and it’s missing a lot of features. The problems that finally made me get up and leave were lack of support for reports based on payments rather than invoice amounts (I actually shelled into my server to run raw SQL queries from the mysql client each year to give totals to my CPA!) and the fact that the only view you have of the invoices only shows the last [x] invoices (I forget the number – 60?) with no way to skip back further. So if an invoice disappears off the screen, you have no way of getting to it – it’s still in the database, but you can’t find it in the program. I manually changed that number to 9999, which worked well enough for me NOW with only a few hundred invoices in the db, but obviously that “solution” won’t last forever. Also, Bamboo is missing an option for recurring billing, which sucks hard if you do a lot of that. Bamboo is usable, and it looks fantastic, but there are just too many itches like this.

MyClientBase – See BambooInvoice. This program basically IS BambooInvoice, complete with the dependency on CodeIgniter, and complete with the long laundry list of essential missing features – in fact, the author is a former BambooInvoice user, who decided to roll his own competitor; the dependence on CodeIgniter makes me think it’s probably a fork to some degree or another (redacted – see comments). The missing features list is somewhat different than BambooInvoice, but it’s of a similar length. I skipped over this one pretty quickly because it was just more of the same – looks quite usable, and it’s more attractive than most of the others on this list, but it’s just missing too many basic features. It’s also missing an option for recurring billing. If you’re willing to consider BambooInvoice, you should probably also consider MyClientBase. Otherwise, keep looking.

P-Books – demo is radically broken, which made me not look for long. At all.

CitrusDB – unsuitable for me, because it has no real provision for off-the-cuff invoices. CitrusDB is a popular product, and if all you do is offer hosting or other monthly services, it will probably work well for you. But if you need the ability to sit down and bang out a single invoice for an arbitrary thing you just did or sold, it’s not going to work for you.

Black Sheep Invoices – line items are too ludicrously simple. If you ever need several lines to describe one item in an invoice (for example, running down the parts in a computer, or the exact services performed in a 10 hour block of service), this just isn’t going to work for you, because the input form does not support carriage returns and only shows 30 characters or so at a time. Show stopper for me; I didn’t look any further.

SimpleInvoices – This is what I am migrating to from BambooInvoice.
The pros: supports both off-the-cuff line items AND out-of-a-table line items, as well as allowing you to override the price on any given line item. Has reporting based on both invoice amount AND payment amount, as well as reports grouping on invoice age, individual clients, etc etc. Plain-jane PHP: no weird “framework” that it depends on that you 1. need to learn if you want to modify it and 2. have to worry about as a dependency, should that “framework” fall off the face of the earth. Supports recurring payments!

The cons: the author clearly doesn’t know much about databases; all tables are MyISAM with *no indexes at all*, resulting in very slow performance unless you fix that yourself. All the reports, invoices, etc look EXTREMELY basic to the point of “did somebody make this on a typewriter?” and the web interface is quirky enough that you will have to hunt for things fairly hard for your first hour or so using it. The author’s site is also pretty quirky and hard-to-navigate, making it more difficult than necessary to find support for bugs / report bugs / etc.

The mitigating factors: Since the code is so very simple, it’s MUCH easier to find and fix bugs yourself than would be the case for any of the above applications (it took me a ridiculously long time just to find where the variable defining the number of invoices shown on the front page was in BambooInvoice, for example). The performance issues can be solved VERY easily simply by adding a few indexes to the database tables (and, optionally, converting them to InnoDB). For that matter, the code is simple and straightforward-enough that future updates to PHP itself are much less likely to break things, making you that much less reliant on support from the author in the future.

setting locale to UTF-8 in Debian

If you have to deal with foreign languages and character sets (Cyrillic, Katakana, Hiragana, Kanji, etc) you need to have UTF support on your server. If you don’t already have it, here’s how you get it:

1. nano /etc/default/locale.gen and uncomment the line with en_US.UTF-8 (assuming your default language should be English)
2. locale-gen
3. edit /etc/profile and /etc/bash.bashrc and add the following: export LANG=en_US.UTF-8

When you next start a shell (exit, call bash manually, run sudo -s, whatever) you should then see UTF support available:

me@box:~$ locale

And you’re done.

RDP Client under Ubuntu

The performance of the built-in RDP clients in Ubuntu as of 10.04-LTS Lucid Lynx (and previous) is plagued with difficulties – Windows machines, among other things, frequently have events which refresh the local desktop every second or so which Windows’ native RDP client doesn’t trigger on, but for some reason the TS Client and Remote Desktop Viewer in Ubuntu does, making using same to control a Windows box a real hassle.

Fortunately, there’s a solution – as of 11.04 (Natty Narwhal?), Ubuntu will be migrating to Remmina as its RDP and VNC client. Better yet, Remmina is already available in the repos for 10.04 Lucid Lynx!

me@box:~$ sudo apt-get update && sudo apt-get install remmina remmina-gnome

After installation, you’ll find Remmina in Applications->Internet. Be sure to turn on the performance features “enable bitmap caching” and “enable compression”, they make a big difference. Also, you’ll find that Remmina supports transferring sound (leave it off if you don’t need it!), sharing local printers, and even sharing local drives! Pretty sweet. I’ve been very impressed with it so far. I haven’t experimented with the sound / folder / printer share options, but the performance difference is night and day.

setting a mail smarthost in exim on a Cpanel box

add a Router block to the end of /etc/exim.conf.local:

                driver = manualroute
                domains = !+local_domains
                transport = remote_smtp
                route_list = * host.name.of.smart.host.server

then run the scripts to update configuration and restart exim:

root@box:~$ /scripts/buildeximconf  
root@box:~$ /scripts/restartsrv_exim  

You’re done.

Using APC cache on Magento 1.4

First, of course make sure APC is installed. On Debian or a Debian-derived system (like Ubuntu), you can do this with sudo apt-get install php-apc. Once you’ve got APC installed and working, add the following snippet to app/etc/local.xml under your Magento site, in between the <global> and </global> tags:


“SOMETHINGUNIQUE” should be just what it says – something unique to the site you’re caching. This is a prefix that lets the webserver figure out what bits of cache go with what sites; so if you’ve got two different sites running, both with the same APC prefix set, you will have serious problems later. I recommend using your domain name, without the periods – so if your site is mystore.com, your prefix would be MYSTORE_ in the snippet above.

Make sure cache is enabled under System/Cache Management, and refresh it. You’re done.

Perspectives on Open Source: The Three P’s

Yesterday and today I attended POSSCON, the Palmetto Open Source Software Conference.  They’ve got a pretty great speaker lineup this year – Chris Wanstrath, one of the co-founders of GitHub, was particularly inspiring.  It’s also pretty interesting to me, as a consultant, to see just who shows up for this kind of thing – an open source conference in a town not particularly known for being a giant mecca for open source.  (In fact, the POSSCON speakers and promoters went out of their way to praise Columbia for opening itself up to the conference – but that’s not the same thing as being someplace like SF or NY, a lodestone that accumulates OSS devs and culture whether it likes it or not.)

So who does show up for an OSS conference in a mid-sized Southern town?  A pretty randomized mix of “suits”, hobbyists, and developers.

The thing that these three basic types of attendant have in common, of course, is that one way or another, they’re interested in open source software – and for the most part, they’re “for it”.  But the reasons vary pretty wildly, and they vary in ways that don’t necessarily match up evenly with the three “obvious” divisions that you’re most likely to see at first glance.

So, if you’re “for” open source software, and you’re interested in actively promoting it, it helps to understand not only why you like it yourself, but why others might – and how their perspectives and yours can dovetail, even if they aren’t the same.  I like to think of these perspectives as “The Three P’s”:

  • Philosophy
  • Pragmatism
  • Paranoia

First, let’s talk about philosophy.  There are a lot of folks – yours truly included – who can get pretty excited about the basic philosophy of open source.  The idea that we’re all contributing to a permanent increase in the sum of human knowledge and capability is pretty heady, and ultimately, that’s what the OSS philosophy is all about.  Proprietary software and knowledge can very easily go away and be lost forever (until somebody reinvents it all over again), but OSS is a lot more likely to survive changes in underlying technologies, organizations, and motivations to remain available for whoever might need it.  Additionally, the reduction of the barrier-to-entry to effectively nil means that a lot of people get empowered further than their monetary income or social circumstances would normally allow.  When somebody talks disparagingly (or affectionately) about “open source hippies”, this is what they’re talking about!

But maybe you don’t care about that.  Maybe you’re a hard-headed realist – and that’s where pragmatism comes into play.  There may be things that you simply can’t do with closed source software, but you’ve found open source software projects that let you do them, or let you do them more easily and cheaply.  If what you want to do is create a collaborative documentation project, then you probably can’t find anything better than Mediawiki on an open source software stack to do it.  Or perhaps you’re a developer, and you want easy access to the sheer volume of peer review, in-the-field testing, and free QA and contributions that open sourcing your project can provide.  Or maybe you’re a small business – or a small cog in a very large business – and it’s easier to get the motivation to put a project together than the approval for budget to pay for software licensing for it.  Ultimately, though, this P is about a hardheaded, realistic intention to get a job done, and OSS just happens to be the tool that makes it possible for you… or not.  People who fall into this category are the most likely to have “mixed source” infrastructure, where OSS tools sit side-by-side with closed-source, proprietary tools; whatever gives the best ROI is what gets used, period.

Finally, we have paranoia.  This one’s a little misleading; the word has negative connotations, but as the old saying goes “you’re not paranoid if they really are out to get you.”  Someone primarily motivated by the third P is worried not just about the current situation, but about what can happen tomorrow.  They might be worried about what’s “hidden in the code” in proprietary applications – what if they left a backdoor in the code?  Can they get at my private data?  Might they disable functionality and potentially shut down my business because some automated check “thinks I’m a pirate?” – or they might be worried about the changing motivations and viability of other organizations – anybody who started creating documents in the 80s has probably been through at least one horrified realization “I still have the data from that old app, but I don’t have anything that will open it!”  Corporate mergers can also create some pretty nasty situations for the end-user; big orgs frequently swallow small orgs with the express purpose of getting access to the smaller org’s customer base… and putting them in a “forced switch” situation where the app the end-user originally installed is no longer available or supported, so now the end-user has to migrate to something that may cost more money, may not have the desired feature set, or may for whatever reason “just not fit”.

Conversely, all three P’s can be viewed the other way: someone might think “it’s my work, I don’t want to give it away!” or “things are only as good as what you pay for them” or “how can I control it if I don’t have to budget for it?” and be philosophically in opposition.  They might believe that the documentation isn’t sufficient, or that the support structure isn’t rigid enough, etc. and be pragmatically opposed.  Or, they might cling fiercely to the idea “it’s not safe if there isn’t somebody I can sue” or “I don’t want the whole world to know intimate details of how my systems work!” and be opposed on grounds of paranoia.

It’s important to think about these “three P’s”, and how they apply to you, to others around you, and to each other.  If you’re advocating OSS and want to see it more widely used in your community, understand your own motivations for it, and understand the motivations of the folks who you’d like to spread it to.  If you’re curious about OSS and trying to figure out how or why you should use it (or care), understand your own motivations, and go from there.  And if you, or someone you’re discussing OSS with, are primarily motivated by only one or another of the three P’s, be sure to address how the other two P’s inform the one that’s the primary concern, rather than wasting your time flogging philosophy to a pragmatist, or pragmatism to a paranoiac.

Solid State Drives

If you’ve never seen a machine equipped with a good Solid State Drive (SSD)… they’re pretty impressive.  In this clip, I’m putting an Ubuntu 9.10 workstation with an Intel SSD through its paces.

Some of the reason that machine is so fast is Ubuntu – the newest release has some pretty significant disk speed related enhancements – but the vast majority of it is the solid state drive.  (For those of you not familiar with Linux, it might help you to think of GiMP as “Photoshop” – both because it does pretty much the same job, and because both are notorious for being EXTREMELY slow to start up.)

You do have to be careful when you’re buying an SSD, though – they’re not all created equal.  In fact, some of them are absolutely atrocious, with significantly worse performance than conventional hard drives… so you need to know what you’re doing (or trust who you’re buying from) when you go that route.  In particular, anything with a jMicron controller in it is better taken out back and shot than put in a production machine.  You also need to be aware that you’re going to pay a lot more per megabyte for solid state – an 80GB SSD costs about as much as two 1.5 terabyte conventional hard drives.  So you probably don’t want SSDs (yet) for tasks involving large amounts of bulk storage.

But, as the video demonstrates… if what you need is performance, there’s nothing else in the same league; a few hundred bucks spent on a good SSD will give you more real-world performance benefit for most tasks than several thousand dollars spent otherwise.

It’s also worth noting that the current generation of SSDs are generally 2.5″ form factor, meaning they fit interchangeably in notebooks, netbooks, or desktop computers.  You typically won’t see as much of the top-end performance on a notebook or netbook – their SATA controllers usually bottleneck at a third of the top-end speed of the best SSDs – but they’re just as much (if not more) worth the upgrade, because conventional laptop HDDs perform much more poorly than full-size HDDs, so the speed boost is even more of a blessing.


Today I was telling my friend Chris about setting up Xrdp on Ubuntu Linux, and he said “you know, you really ought to write a blog for all the business stuff you do.” At first, it seemed redundant – I’ve been running technical wiki sites for years now – but after I thought about it for a while, it struck me as a really good idea. Wikis work well as a repository of knowledge, when you already know what you’re looking for and where to look, but introducing new ideas isn’t one of the format’s strengths.

So what will you see here? Day-to-day problems and solutions, covering most of the major platforms, with an emphasis on the needs you run across servicing power users and small-to-medium businesses.

Thanks for stopping by!