• Plastics, Computers, and mRNA

    March 24, 2022

    Maybe the next big thing

    Plastics was a thing in It's a Wonderful Life.

    Plastics was a thing in The Graduate.

    And for my generation, it was computers and the Internet. Just as jet engines and plastics led to world transformation, over the past 50 years, computers have fundamentally changed the way humans live and interact.

    And just as plastics made many things in our world safer (okay there are also huge safety costs associated with plastics) and created entirely new categories of products, computers have fundamentally changed how humans communicate and go about their days.

  • Dealing with the Asset Bubble

    January 8, 2022

    We have been growing an Asset Bubble since the 80s

    The absolute price of housing has been increasing since the 1980s.

    There are a lot of reasons for it, but declining interest rates are a key cause of increasing housing prices.

    For the United States, our estimates for the period from 1970 to the end of 1999 suggest that a 100 basis-point fall in the nominal short-term rate, accompanied by an equivalent fall in the real short-term rate, generated a 5 percentage point rise in real house prices, relative to baseline, after three years

    So it makes sense that people are apoplectic over inflation, but I suspect the underlying cause is...

  • Setting up Win10 and WSL2 for Development

    July 21, 2020

    Setting Up WSL 2 & Rust on Windows 10

    I've never been super-keen on doing development on Windows machines.

    With WSL aka Windows Subsystem for Linux, there's the possibility of developing on a Windows machine with Windows apps... but with all the Linux goodness.

    WSL 2 is the new-to-2020 version that uses the native Linux filesystem (very fast) and has a bunch of other goodies that makes the Windows 10/Linux integration really nice.

    I've also been working on Mesa X... a re-imagination of spreadsheets written in Rust (for the server) and TypeScript (front end).

    Here's my development setup.

    Install WSL 2

    First, you have to install WSL 2 on your Win10 machine.

  • Candygram for SARS-CoV-2

    May 3, 2020

  • What's the Future of Spreadsheets?

    November 17, 2019

    28 Years Ago

    On November 17th, 1991, I started coding a spreadsheet for NeXT called Mesa.

    I was a 27 year old, law school graduate and I wanted to write some cool software. I started a company, Athena Design, to publish Mesa.

    Well, technically, I founded Athena Design to create an application store for NeXT software because in 1989, the only way to distribute software for NeXT boxes was via optical media and the media itself cost more than $100 per disc... but I digress.

    Mesa became a "thing". Mesa beat out the incumbent spreadsheets from Lotus and Informix.

  • Oracle v. Google granted Certiorari

    November 16, 2019

  • Jaguar I-Pace vs. Tesla Model S 75D

    April 14, 2019

    A Comparison of 2019's two leading luxury EVs

    I owned a 2018 Tesla Model S 75D from May 2018 through March 2019. I purchased a 2019 Jaguar I-Pace First Edition in March 2019. This post is my thoughts comparing the two.

    tl;dr Lease the I-Pace

    In all important categories, the first year I-Pace is better than the Tesla Model S, which has been shipping for 6 years.

    However, with the velocity of change in the industry, lease, don't buy, an EV. And the I-Pace is the right luxury EV to lease.

    Build Quality

    If you're going to drive a luxury car, build quality and material quality distinguish cars from the EVs that provide basic transportation.

  • Whiteboard Coding Considered Harmful

    December 9, 2017

    And a Bad Way to Interview

    I'm seriously considering Full Time Employment mainly because one of my clients wants to convert me to FTE and I love working with the client. But, I want to understand what opportunities are available. So, I've been doing a fair bit of interviewing.

    Most of the interviews have at least some component of "whiteboard coding." "Whiteboard coding" is where the interviewer presents a problem and asks the interviewee to write code that solves the problem or implements to algorithm on a whiteboard.

    Let's step back and look at the purpose of and constraints around interviewing.

  • Windows 10... still suboptimal

    June 21, 2017

    It's just not good enough

    I've been buying and trying to use a number of Windows 10 machines. In the past year, I've bought a Yoga 910, ThinkPad T460p, and a Surface Pro 4 i7. I can't live with any of these machines like I live with my iPad or my Mac.

    It's mostly the little things.


    The Windows machines just seem to lose their wireless device. Once every week or two, I'll open the machine and the machine won't be able to find its wireless device. I have to reboot the device. I live in my apps (browser tabs, LastPass, IntelliJ, etc.) for long periods of time. If I have to reboot, I have to re-enter passwords, recreate REPL sessions, etc. It's a real productivity killer.


  • Migrate off 1Password

    March 19, 2017

    AgileBits is not a trustworthy company

    I have been an AgileBits/1Password customer for 4+ years. I support small companies that have laser focus and excellence... which is what AgileBits seemed to be.

    However, I've had a lurking concern that a proprietary software company secures my most guarded secrets with closed source software. Recently, AgileBits has demonstrated that they are not a trustworthy company.

    I will tell you the story. I am also moving off 1Password and recommend that if you're a 1Password user that you seriously consider moving to another password manager.

    The Backstory

  • Another Reason HRC Lost

    December 14, 2016

    Arrogance and Stupidity

    I have been a Clinton supporter since 1991 when I met Ira Magaziner.

    I actively support Hillary Clinton and I voted for Hillary Clinton in the 2016 Presidential Election.

    I thought and still think that HRC would make an excellent POTUS.

    But she royally screwed up her campaign.

    There were issues with the ground game.

    Which led to Clinton losing the Rust Belt.

    HRC didn't connect with workers.

    And it was no secret that a lot of voters were pissed and scared.

    I'm going to focus on HRC's web site because it's emblematic of the larger issue of the campaign not marketing Clinton.

    The Web Site

  • Funcatron Documentation Strategy

    December 13, 2016

    Long History of Crap for UI

    I've got a long history of building really crappy UIs.


    I wrote the first real-time spreadsheet: Mesa.

    Mesa ran on NextStep.

    NeXT had an enterprise license and used Mesa for most of its spreadsheet needs.

    And I'd get periodic complaints from Steve Jobs about how horrid the UI was. Rumor had it that he insisted that people export Mesa spreadsheets to 1-2-3 format, so Steve could look at the spreadsheets in Improv.

    I didn't care. I was a very self-assured 20-something and Mesa was fast and powerful... it powered automated trading systems and processed billions of dollars of buy/sell orders every day.


    I founded the Lift web framework project.

  • Funcatron on Mesos

    December 9, 2016

    It's alive

    I've been working on Funcatron for the last few months.

    What's Funcatron?

    Serverless for your cluster. If you're running Mesos or Kubernetes or Docker Swarm, you can get all the development simplification and autoscaling of Serverless, without getting locked into a particular cloud vendor.

    In November, I showed how Funcatron works in developer mode:

    Funcatron Developer Mode from bearfeeder on Vimeo.

    Funcatron on Mesos

    Based on feedback from testers, I've expanded Funcatron features to include database connections, improved logging, and more. And today, you can run Funcatron on your Mesos cluster.

    Set up a Mesos cluster

    First, set up a Mesos cluster. I used the dcos-vagrant tools to set up my cluster.

    Start Funcatron on your cluster

    You can use the handy script.

    The script:

    curl -v -X PUT -H "Content-type: application/json" -d "@start.json" "http://m1.dcos:8080/v2/groups"

    Which references a json description of what to deploy.

    For those of you who don't parse Mesos JSON, there are 4 components deployed:

    • A RabbitMQ message broker so the rest of the system can talk
    • A 'Tron' manager that knows about the rest of the system
    • An Nginx/OpenResty front end that takes the http request
    • A 'Runner' that executes the functions. Note you can scale your system by creating more runner and in future version, the Tron will tell the substrate (Mesos) to create more runners on demand

    And just like that, you've got a running Funcatron cluster.

    Where are the system components?

    The 'Tron' instance will print helpful messages at start-up telling you how to upload Func bundles and otherwise control the Funcatron cluster:

    ... INFO ... - Upload a Func Bundle: wget -q -O - --post-file=THE_UBERJAR
    ... INFO ... - List known Func Bundles: curl -v
    ... INFO ... - Enable a Func Bundle: curl -v -H "Content-Type: application/json" -d '{"sha":"THE-SHA-HERE", "props": {"key": "value"}}' -X POST
    ... INFO ... - Frontend at

    Creating/Running an Application

    Okay... so how do you create and run an app on Funcatron?

    Funcatron apps are called "Func Bundles." A Func Bundle is a combination of a Swagger document describing the HTTP endpoints and code that services each of those endpoints.

    There are some Java and Scala samples.

    For example, Scala code to handle POST and DELETE endpoints might look like:

    class PostOrDelete extends Func[Data] with DecoderOMatic[Data] {
      def apply(data: Data, context: Context) = {
        // we're guaranteed the 'cnt' path variable by the Swagger definition
        val cnt = context.getPathParams.get("cnt").asInstanceOf[Number]
        context.getMethod match {
          case "delete" =>
            new Data("Deleted " + cnt.longValue, cnt.intValue)
          case "post" =>
            (1 to cnt.intValue()).
              map(i => new Data(data.name + i, data.age + i)).
          case _ =>
            new MetaResponse() {
              def getResponseCode = 400
              override def getContentType = "text/plain"
              def getBody = ("Expecting a POST or DELETE, but got " + context.getMethod).getBytes("UTF-8")
      protected def ct: Class[Data] = classOf[Data]

    Once you've got your example code written, compile it.

    If you're doing the Scala example: sbt clean assembly

    And for the Java example: mvn clean package

    Upload and enable the code

    For the Scala code, you can upload it with:

    wget -q -O - --post-file=target/scala-2.11/scala_sample-assembly-1.0.jar http://<SERVER>:<PORT>/api/v1/add_func

    Note the sha that you get back from the server. To turn the code on:

    curl -v -H "Content-Type: application/json" \
       -d '{"sha":"<SHA>", "props": {"key": "value"}}' \
       -X POST http://<SERVER>:<PORT>/api/v1/enable

    Note the props field is a set of properties sent to the Runner and available to your function at runtime. The props field may also include descriptors such as JDBC information and access to other network resources. Because this is sent at deployment time, network resources (databases, caches, etc.) can be configured at enable-time.

    Trying out the code

    Based on the Frontend at message from the Tron, you can test your new function. for example:


    Will return something like:

    {"num-param":42,"bools":true,"numero":0.9112837757827404,"query-params":{"cool":"yes"},"time":"Fri Dec 09 20:31:31 UTC 2016"}

    Logging for forensics

    Take a look at the logs from the Runner:

    16-12-09 20:31:31 /sample/scala INFO [funcatron.scala_sample.SimpleGet:GIT:b1d92b7430fcc6ed05c38c22d57d2163f6e8bb88&REQ:db9d00abf61d9c67f4f0e755e96b8d0e] - In Scala 'SimpleGet... yay!

    See the GIT:b1d92b7430fcc6ed05c38c22d57d2163f6e8bb88 part? That's the git sha of the code that ran the function. This means for every log line, you can determine the exact version of the code that was running.

    See the REQ:db9d00abf61d9c67f4f0e755e96b8d0e part? This is a unique id of the request. It is shared across the Funcatron network so that you'll be able to trace and time requests and fan-outs related to requests across your Funcatron cluster.


    So, that's Funcatron running on your Mesos cluster.

    Have fun!

    And please join the Funcatron community.


  • Telegram site can be automatically SSL

    November 20, 2016

    Simple as changing your DNS

    I have a side project... a CMS system I rolled myself called Telegram. It's a simple way to write some stuff in Markdown or HTML, push it to GitHub, and it will automatically become a web site. Telegram hosts Lift's site this blog and lots of other sites.

    Google is moving Chrome towards supporting SSL only.

    And in general, secure browsing is a very good thing(tm).

    As of today, Telegram supports SSL for every hosted site. Telegram will continue to work as normal if you point the DNS of your web site to or CNAME to cname.telegr.am. Your site will continue to be served via HTTP.

  • Dell Precision: Works after a Fashion

    November 7, 2016

    Put on your Linux Wading Boots

    Last week, I took delivery of a Dell Precision 5510 "pre-loaded" with Linux. It did not work so well.

    The folks at Dell worked to provide support, but at the end of the day, the version of Ubuntu shipped with the Precision was too fragile and the standard Ubuntu installer couldn't create a boot loader.

    However, the Precision 5510 is very nice hardware and I have a significant need for a laptop with more than 16GB of RAM.

    I've also using Linux since 1996 and Linux on laptops since 2000. What I needed was a mind-set change. I needed to change my mind-set from "this should work like OS X, Windows, or Ubuntu on my XPS 13" to "it's possible to do... so go do it."