Anders Brownworth

Technology and Disruption

Clay Christensen in "The Innovator's Dilemma"

"Generally, disruptive technologies underperform established products in mainstream markets. But they have other features that a few fringe (and generally new) customers value. Products based on disruptive technologies are generally cheaper, simpler, smaller and, frequently, more convenient to use."

Two words: republic wireless.

A Platform is a Promise

There is an implied contract that contains not just the product being sold but the promise of a future with that platform. Bare minimum for a platform these days is 100 million users.

With thanks to Horace Dediu.

Notes on Buying a Company

When you buy a company, you are buying:

* Resources / Assets <- easy to assimilate
* Processes <- hard to assimilate
* Values / Priorities / Vision <- nearly impossible to assimilate

Buying IP is like buying a lottery ticket - you never know if it will pay off.

With thanks to Horace Dediu.

Notes on the HTML5 and App Economies

The app economy works because it has a clear pricing signal. The HTML5 economy may dominate the free and possibly some of the fremium end of the spectrum but, because it doesn't have clear pricing feedback, the app economy will always dominate the high end of the market.

Prices are a gauge. You read pricing signals to see where the market is and you use them to make decisions about how to bring something new to the market. If you don't have a pricing signal, you have to guess. This makes investment in the market very inefficient. If you don't have investment, the market won't last. So prices are critical in closing the information loop allowing investment. That's why I'm a believer in the App Economy.

With thanks to Horace Dediu.

Google Docs Changed to Google Drive

At some point in the last week or so, Google seems to have renamed Google Docs. Two things strike me with this:

1. The focus seems to be off of competing with Microsoft's Office

2. This bucks the trend away from drives toward the cloud

I haven't had Office installed on a computer I use since roughly 2006.* I have been a fan of Google Docs as an Office competitor and have been cheering each improvement. The functionality is still there but it would seem the desire to have a Dropbox competitor has caused Google to rename the product belying a change of focus. It is just a name but I don't think of a drive as the fundamental product here.

The term "drive" used to refer to a physical disk drive. Flash memory such as USB sticks took the legacy name "drive" as well because of the way they showed up in operating systems. Solid state "drives" have suffered the same fate. Cloud services like Amazon's S3 and Dropbox (which generally term things a "shared folder") have finally gotten away from the name. To see Google take the name Drive seems like an unnecessary throwback.

* I used Apple's iWork productivity suite to bridge the gap between Office and a more capable Google Docs.

The New Face of JavaScript

By far the most popular language on the planet is JavaScript. Just about every computer has some implementation of it because it is included in almost every web browser out there. And as you might imagine, JavaScript has matured as a front-end language because of this pedigree.

But there is a promising new future for JavaScript. It was picked as the web's UI language because it is event based. JavaScript in the browser sits in a run loop and responds to events such as mouse-over and click events as they happen. But the other side of the web experience can benefit from an event based design as well.

Boiled down to it's simplest state, web servers just sit around in run loops responding to HTTP requests as they come in. Wouldn't it make sense to use the same event based design on the web server as well? There has been a growing trend toward event based design for some time. One example would be the migration away from thread-based web servers such as Apache's http server toward event based web servers such as nginx. But server-side development generally remained focused around "thread-centric" languages.

Then node.js came out. (yes, that is an entire paragraph)

Combining Google's V8 JavaScript engine and the missing server-focused routines, node.js presents a complete event-driven server-side JavaScript environment. For all the coders out there that already know JavaScript from their work within the browser, server-side coding is now only a short step away. For example, here is a complete webserver written in node.js:

var http = require('http');
http.createServer(function (req, res) {
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World
');
}).listen(8080, '127.0.0.1');
console.log('Server running at http://127.0.0.1:8080/' );

Additionally, passing objects back and forth between the browser and the server becomes trivial because the server is written in the same language as the client. What is available in one is almost always available in the other.

Here's why this is very exciting to me. Back in the day I thought Java virtual machines might become the hardware agnostic "lowest common denominator" of the computing world. For a time it was on it's way toward happening. But probably because of the need to access things within proprietary operating systems such as Windows, the lowest common denominator of computing became the X86 architecture. Virtualized environments such as Amazon's EC2 could run Windows instances right alongside Linux and the game was over for the Java virtual machine.

But I see the whole race taking off once again. With node.js, the virtualized environment question is open again, at least within the web world. Why pay for a virtualized OS when all you need is a web server that likely sits there idle most of the time? Why take on the headache of operating system administration just to keep a fairly well defined web application running? I think JavaScript on the server is poised to redefine the "lowest common denominator" of web programming.

It could go back to Java but so many more people already know JavaScript, and there isn't a byte compile step so the workflow is smoother. Additionally, Java requires a good deal of foreknowledge about classes, paths and naming just to get started that JavaScript doesn't require.

Additionally, there is less of a need to let a proprietary system dictate the entire environment these days because almost everything is API accessible. The impact of this will take some time to show it's fruit but I think the tide will eventually prove irresistible.

If you haven't checked out node.js, give it a look. It is still young (particularly in things like binary processing and MVC frameworks with database access) but it is coming on strong. It heralds a new paradigm that I think will be important to follow.

ZFS on Mac with Thunderbolt Drives

Licensing is to blame for ZFS not being more popular, particularly within the Linux world. However the open source combined filesystem / volume manager originally from Sun is coming on strong these days. While you might traditionally think of ZFS in a server context, the combination of Thunderbolt drive enclosures and the MacZFS project suddenly make for some tantalizing opportunities for the Mac user. Let's just think this through.

Thunderbolt gives you a 10Gb/s pathway to your drives which they can't come close to filling. There is also a good chance that once you have some Thunderbolt drives, you will want to add more in the future. Rather than just adding more and more volumes to your machine and splitting your data amongst them, you could use ZFS and grow a single volume as you add drives instead. Oh, and did I mention you also get the data integrity, copy on write, snapshots, continuous integrity checking and automatic repair that come with ZFS as well? I digress.

Admittedly the Thunderbolt drive options are few and far between these days but they will come. We are just starting to see Thunderbolt enclosures that allow you to snap in any old bare drive, and Thunderbolt PCIe cards can't be far off either.

So how would you format a ZFS volume? Here's a practical example.

I have a 4 drive external enclosure where drives show up as /dev/disk5, /dev/disk6, /dev/disk7 and /dev/disk8. I know this by plugging it in, turning it on and running diskutil in a terminal:

---
diskutil list
---

I partition each disk with a GPT (GUID Partition Table) rather than the standard APM. (Apple Partition Map)

---
diskutil partitiondisk /dev/disk5 GPTFormat ZFS %noformat% 100%
diskutil partitiondisk /dev/disk6 GPTFormat ZFS %noformat% 100%
diskutil partitiondisk /dev/disk7 GPTFormat ZFS %noformat% 100%
diskutil partitiondisk /dev/disk8 GPTFormat ZFS %noformat% 100%
---

Next I will create a RAID-Z out of all the second partitions on each disk. (by default, the second partition is marked ZFS on each disk - see the output of diskutil list)

---
zpool create Data raidz disk5s2 disk6s2 disk7s2 disk8s2
---

You should be left with a mounted RAID-Z volume called Data.

Lastly I'm going to disable Spotlight indexing on that volume because Spotlight is incompatible with ZFS. (Spotlight is created to be used on HFS+ (normal Mac) volumes)

---
mdutil -i off /Volumes/Data
---

So we're good to go. You can now use the volume like any other Mac volume, reading and writing as usual.

You can see how your ZFS storage pools are doing with:

---
zpool status
---

At some point, you might have a drive failure. To replace /dev/disk5, you would:

---
zpool offline disk5

(physically replace the disk)

zpool replace Data disk5
---

In the future, you also might want to add more drives to your setup. Currently you can't just add single disks to a RAID-Z to increase it's size. What you want to do to grow the filesystem is add another group of disks to create a new virtual device which ZFS will use to expand the filesystem. As a rule of thumb, you want to keep the groups of disks to similar size or you will end up using whatever set is bigger a little more than the others. To add the new disks, it is very similar to how you initially created your initial RAID-Z:

---
zpool add Data raidz disk9s2 disk10s2 disk11s2 disk12s2
---

Now notice zpool status shows you two virtual RAID-Z devices and your Data volume magically grew to twice it's size!

Additional Reading:
Mac ZFS - Getting Started
Solaris ZFS Administration Guide
ZFS Best Practices Guide

Design Redux

I've updated the design of Anders.com once again - this time stripping out a good deal of the little links to this and that. The thought here is to focus on the content primarily. The really important things are really big and I've axed a whole pile of stuff that was doing more harm than good to the focus of the site.

http://Anders.com/ is here for things that are a bit too long to tweet or are things I want to have stick around longer than a blip on someone's timeline. http://AndersBrownworth.com/ remains a link page - something similar to an About.me profile. LinkedIn remains my professional resume and @Anders94 my primary "short thoughts" medium. For all else, there is http://Anders.com/.

FreeSWITCH: mod_sms Patch for Simple Logging Capability

Here's a patch for FreeSWITCH to add a simple logging capability to mod_sms. Basic usage is:

<action application="log" data="${_body}"/>

which will log the body of the SMS message. Don't forget that this should be part of the chatplan:

<section name="chatplan" description="Regex/XML Chatplan">
<context name="default">
<extension name="public_dids">
<condition field="to" expression="^(.*)$">
<action application="log" data="SMS Body:[${_body}]"/>
</condition>
</extension>
</context>
</section>

http://anders.com/1offs/freeswitch-mod_sms-logging.diff

Thoughts on Entrepreneurialism

I'm not passionate about building a great company, I'm passionate about creating a great product. Great companies come from great products.

Almost anything you build has been tried before. It may have been only the timing that was bad.

Meander some in your work. The best ideas come out of left field.

Creativity is both an intensely independent and massively collaborative process. Forgetting one or the other leaves you at a disadvantage.