Pandora alternative: Jango


Tired of constant Pandora ads and pressure to pay for a subscription?  Me too.  Having difficulty wading through all the lame commercial Spotify,, Google Play, etc. etc. etc.?  Save yourself the trouble and just head over to Jango.

You're welcome  :)

AWS - a retelling of The Emperor's New Clothes


Most of us are familiar with Hans Christian Andersen's classic tale The Emperor's New Clothes where an emperor is swindled into thinking he has received a beautiful new suit when in fact he gets nothing and no one is brave enough to admit it.

My experience with Amazon Web Services (AWS) and other major cloud vendors feels like déjà vu.  With so much hype and management pressure and sales pitches with promises of free tiers and effortless scaling, I naively drank the punch like everyone else.

Slowly, painfully, the reports and the realization started to sink in.

I've been wanting to summarize my experience for some time but have found it challenging to describe exactly why the emperor's clothing from AWS seems so removed from reality.  Fortunately, I recently came across this fantastic article by Pedro Sostre that describes it perfectly!  READ IT before committing to any cloud provider!

...whew!  my civic duty and conscience are now complete.

Wasabi - new cloud storage king in town?


Wasabi (code named BlueArchive), a cloud storage provider from the creators of Carbonite, came out of stealth mode today swinging hard at Amazon S3:

Wasabi's storage price point of $.0039 per gigabyte per month and $.04 per gigabyte of network egress (downloads) is significantly cheaper than the large cloud providers and even dethrones the current object storage price champion, Backblaze:

Now, the real question is... can they follow through with their promises?

Welcome to the Borg


"Imagine a world where we're no longer looking up at Tech Titans such as Apple, Google, Microsoft, Amazon, and Facebook, and wondering what it would be like to operate at their extraordinary scale -- because we're one of them."
- LinkedIn (in their merger announcement with Microsoft)

MTG cards for learning about computers


My sons really enjoy the Magic The Gathering card game so I thought it would be fun to reference it while teaching them a bit about computers:



You can print them out using these instructions (make sure to change layout to landscape before printing).


  • computer case provides electricity (sun mana)
  • you can overclock a CPU for more power but you risk system damage (negative toughness)
  • solid state drives (SSD) are superior to standard SATA/SAS HDD but they cost more
  • a hard drive's top priority is reliability (hence higher toughness over power)
  • the hard drive quote also references the difference between hard drive persistence vs. ephemeral memory
  • memory special ability references scalability of adding more memory to a system to improve performance
  • motherboard is what pulls all the systems together
  • a video card offers "flying" speed and GPU processing is more powerful than CPU processing but at a higher cost

Lubuntu 17.04 lands tomorrow!


Let the countdown begin!

The return of SSI


Single System Image (SSI), sometimes referred to as a distributed operating system and not to be confused with Server Side Includes, is a compute cluster technology that was assumed dead many years ago.  It hails from prehistoric roots where mainframes ruled among dinosaurs and monolithic architectures were the norm.  In our snazzy modern society where diminutive microservice mammals like Docker have evolved to dominate the landscape and pets are not allowed, it would seem logical that ancient behemoths would simply fade away into historical obscurity.  The gradual die-off of most SSI solutions would certainly support that theory.  

However, one hope remains: Stateful Big Data

Microservices work well for stateless horizontal scaling.  Need more umph?  Add a node (or 50).  Easy!

Things get trickier when you add state to the equation.  User sessions, personalized dashboards, ad-hoc queries...  Fortunately, load balancers can do clever things like sticky sessions and state can often be offloaded to scalable architectures like object storage and NewSQL databases.

So we're good, right?  Not quite.

Unfortunately, load balancers and offloading state won't help you if you run into a situation where a given operation requires more than a single node's resources can handle.  At that point you generally have two choices: scale vertically or break the operation into smaller tasks that can be processed in parallel.

Scaling vertically is much easier nowadays with big beefy cloud instance types and the ability to snapshot images or live migration.  However, there is a practical limit to how far you can scale vertically (>2TB memory, for example).  There's also additional risk if a node goes down and complexity when you need to upgrade versions or move to another server.

Accordingly, many companies hoping to data mine, or troll their data lake (or whatever hip analogy is in vogue nowadays), turn to distributed MapReduce-based cluster solutions like Hadoop.  This architecture allows you to process and analyze massive amounts of data efficiently.  However, older non-cloud-ready applications cannot take advantage of this new computing paradigm and often require a significant code rewrite to do so.  It also requires more staffing overhead as DevOps need to familiarize themselves with new, complex tools.

So, when it comes to stateful big data, SSI really begins to outshine the competition.  SSI provides both horizontal and vertical cluster scaling but exposes those resources in a way that to the end user it appears to be a single server.  This is in contrast to other cluster architectures that simply manage a cluster of machines as separate entities.  As more nodes are added to the cluster, that single virtual server appears to magically grow more powerful.  All the complexity regarding memory management, load balancing, file management, etc. is handled for you transparently!  Since the interface appears to be a single server, user interaction is as intuitive as working on a local tower under your desk.  It also supports a far broader array of applications, including legacy applications not originally designed for cloud scalability.

So what's the catch?  Well, it's hard to do so most people either give up trying or attempt to sell/license it.  Currently, the most active communities for SSI are:
Only LVS is open source but it's more like a loose collection of tools and methodologies than a single installable product.  The HP and IBM solutions are very complex and include vendor/hardware lock-in.  MOSIX appears to be the most user-friendly but its closed source, lack of high availability, Australian proprietary license, and failed commercial attempt have hampered community interest.

Bountysource payment process (backer tutorial)


UPDATE: Bountysource has poor customer support, expensive fees, and a non-intuitive workflow.  Use FreedomSponsors instead


original article for historical documentation...

Bountysource is a helpful service that allows companies, groups, and individuals to incentivize specific development tasks via bounties and fundraisers.  Many big companies have used the service, including IBM, Facebook, GitHub, and Adobe.  Although the process is fairly straightforward, there are areas for improvement -- especially the payment process.  Here's the "missing manual":

0. If you haven't already, create a free Bountysource account

1. On the Bountysource homepage, find the Post section and submit the issue tracker URL for an issue you want to incentivize.  Bountysource currently supports GitHub, Bugzilla, Google Code, Jira, Trac, LaunchPad, and Pivotal issue trackers.

2. Click the Post button

3. Select a pre-determined amount or enter your desired bounty amount:

4. Select a payment option and checkout to complete the order:

Once processed, Bountysource displays the new bounty on their homepage.  You can also post a link to the bounty on the target issue's tracker or other advertising means, like social media.

Bountysource holds the funds until the issue is marked closed and awaits a bounty claim by a developer.  Simple, right?

Well, what happens when a developer claims the bounty?  The Bountysource FAQ describes a straightforward process: The backer(s) receive email notifications indicating a claim has been filed.  They can either accept the claim, refute the claim within two weeks, or if a claim goes uncontested for two weeks the claim is automatically paid.

Easy...until you try to accept the claim.  The FAQ states:

"If all Backers vote to accept the claim, it is processed immediately and the developer is awarded the bounty."

But how do I "accept the claim"?  There's no button that says accept and the link emailed to backers doesn't explain it or provide an accept button either.  It turns out the solution is a non-intuitive three-step process:

1. Click the thumbs-up button to vote your approval:

2. Once all the backers vote their approval, an Accept button will appear which you should click:

3. The backers will be notified of the successful payment via an online message and email:

Not hard if you know the process, but super confusing if you don't!

Tutorial: Install LineageOS 14.1 (Nougat) on Verizon HTC 10


Now that LineageOS pre-official nightlies are available for the HTC 10, I thought I'd take it for a test drive...


0. Important: this process will wipe your internal storage so transfer all desired settings and files to your external SD card or PC beforehand!

1. To ensure you have the latest official Verizon firmware, make sure your HTC 10 is fully up to date (Settings > Software updates > Check now).  If the OTA update via your phone fails, you can also update using the HTC Sync Manager wizard (recommended) or manually by downloading the latest Verizon HTC 10 RUU zip file here and following the instructions for installing it here.

2. Gain root access (similar to "jailbreak" on iOS devices) and install the latest TWRP recovery by following this guide.

3. Copy the latest LineageOS image onto the phone's external SD card.

4. Copy your preferred variant of GAPPS 7.1 ARM64 onto your external SD card -- I like the micro version but you can pick the one that best suits you (...and yes, this step is required).

5. Charge your phone to 100%

6. Boot into TWRP recovery by holding the Volume-down and Power keys simultaneously until the device powers off (about 15 seconds) and then remove finger from power key as soon as it powers off but keep pressing Volume-down until the boot menu appears.  Press the Volume-down key multiple times until "reboot to bootloader" is selected and then press the Power key.  Press the Volume-down key multiple times until "BOOT TO RECOVERY MODE" is selected and then press the Power key.

8. After the backup completes, in the TWRP menu choose "Mount" and uncheck "System" if it is checked

9. From the TWRP menu, press "Wipe" and Swipe to Factory Reset

10. Press "Back"

11. Press "Format Data", type yes and press the blue checkmark button on the screen keyboard to continue (note: this step will NOT wipe your external SD card contents)

12. Press the home icon (house-shaped icon at the bottom of the screen)

13. Press "Reboot"

14. Press "Recovery"

15. On the TWRP menu choose "Install" and select the zip of LineageOS, then press "Add more Zips" and select the zip of GAPPS.  Swipe to confirm Flash (note: if you see "E:unknown command [log]" in red twice during the flash process you can safely ignore it; when the process completes you should see "done").

16. Press the "Wipe cache/dalvik" button and Swipe to Wipe

17. Press the "Reboot System" button

18. It will take about 5 minutes upon first boot so be patient if it just displays the generic "android" screen for a while...

19. After your phone boots, follow the wizard prompts and then go to "Settings > About" to verify the version.


LineageOS replaces CyanogenMod


In case you didn't see it elsewhere, CyanogenMod has ceased operations and its spiritual successor is LineageOS.