• 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.

    Wireless

    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.

    Power


  • 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.

    Mesa

    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.

    Lift

    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:

    #!/bin/bash
    
    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 http://192.168.65.131:31340/api/v1/add_func
    
    ... INFO ... - List known Func Bundles: curl -v http://192.168.65.131:31340/api/v1/known_funcs
    ... INFO ... - Enable a Func Bundle: curl -v -H "Content-Type: application/json" -d '{"sha":"THE-SHA-HERE", "props": {"key": "value"}}' -X POST http://192.168.65.131:31340/api/v1/enable
    ... INFO ... - Frontend at http://192.168.65.60:14009
    

    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)).
              toList
    
          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:

    http://<FRONTEND_SERVER>:<FE_PORT>/sample/scala/simple/42?cool=yes
    

    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.

    Yay!

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

    Have fun!

    And please join the Funcatron community.

    Thanks!!


  • 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 23.23.179.154 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."


  • Dell Precision 5510: Not a Linux Machine

    November 4, 2016

    Dell, What Are you Thinking?

    After the whole dust-up about the Apple MacBook Pros not being much of an advance, I decided to look for a development laptop that was not a MacBook Pro.

    Dell sells a Precision 5510 with Ubuntu installed and supported and that supports 32GB of RAM. That seemed like a really good idea. I love Ubuntu and the hardware was definitely the right spec.

    So, I ordered a Precision 5510. It arrived and it's been a complete horror show.

    First, doing a apt-get update to update package on the box leaves it in a mode where one cannot log in via the GUI. Why?


  • Apple Disappoints... Strategically

    September 8, 2016

    The iPhone 7 Launch is the new Apple

    I'm an Apple fan. Not a fan-boy... but a fan.

    I've got an Apple logo (6 color) tattooed on my arm.

    I've been using Apple products since 1978.

    I was also a NeXT developer so I grew up with what is now iOS.

    The iPhone 7 launch yesterday is, in my mind, the harbinger of Apple's new strategy and direction: more is more.

    The New Black

    One of the big things that Steve Jobs brought to Apple on his return in the 90s was the idea that less is more.

    Fewer product lines was less easier both internally and for the customer.

    Focus on what people did with computers (and computing devices) was what Apple built their products and marketing around.


  • Docker Not Ready for Prime Time

    August 27, 2016

    Not in large scale production

    I love Docker. It's so freakin' useful for distributing predictable runtime environments.

    Using it during development means radically less time configuring my dev machine. Using it during development means I can "install" different versions of PostgreSQL, Redis, etc. for different projects.

    In this way, Docker is very useful.

    Not in production

    But in production, Docker has a ton of problems.

    Each version of the CLI is incompatible with the last version of the CLI.

    I mean, WTF. This means that if I have Docker 1.9 in production someplace, I have to have a machine with a Docker 1.9 CLI installed in order to control that machine.


  • Eating our way through Rhode Island

    August 6, 2016

    Lots of Meals, Some Tasty

    I spent a week in Rhode Island on vacation. I grew up here. When I lived here, there were some pretty good restaurants, but nothing like the dining scene that Providence currently hosts. Here's a partial list of the meals we've had and some thoughts on each.

    Twin Oaks

    In the 80s, Twin Oaks was one of the most awesome dining experiences in Rhode Island. The food was good quality, huge portions, and just plain tasty. The drinks were liberal. The service was amazing.

    Fast forward... Twin Oaks is competing with a number of high end and "traditional" restaurants and changed the formula a bit... for the worse.


  • A couple of weeks with Window 10

    April 30, 2016

    It's 2016, WiFi should work

    Microsoft announced Bash on Windows. Basically, it's user-space Ubuntu that proxies kernel-space syscalls through a proxy... what it means is you get something that executes Linux binaries on Windows with little or no performance penalty. Cool.

    Given that I'm a sucker for new toys and new stuff, I went out and bought a Yoga 900 to try Windows 10, Bash, etc.

    The Hardware

    The Yoga 900 is quite a nice piece of hardware. Compared to my 13" MacBook Pro, the Yoga is competitive. It's similar in size, weight, and feel (solid). Is the Yoga as good as the MacBook Pro? No. Is it in the same league, yes.

    Windows 10

    Windows 10 sucks far less than Windows 8.

    But...


  • I'm Joining Kiva.org

    December 18, 2015

    Yay!

    I have been doing technology for a very long time... professionally since 1978.

    I have seen technology grow and evolve... software is eating the world... developers are the new king-makers...

    And we as humans have a choice of how we use technology.

    We can use it for marginal personal gain where we offer something that make's someone else's life much better but take a substantial portion of the betterment for ourselves. For example, taking a 30% cut for brokering between a driver and a passenger may be a passable transaction, but is also a radical wealth transfer to the broker.


  • Twitter Revenue by Solving the Lunch Problem

    September 3, 2015

    My Opinion

    Like many other humans, I have an opinion about how Twitter could significantly increase its revenue. We can start down the discussion with lunch...

    The Lunch Problem

    It's coming up on noon... where do I go for lunch?

    This is a non-trivial problem. It's a choice problem. It's a social problem. It's a commerce opportunity.

    Any time there's a choice problem that has social components and commerce, it's an opportunity for Twitter to make money. But I'm getting ahead of myself...

    The Choice Problem

    There are 25+ lunch spots in walking distance of my office. I've fallen into a rut. I'm at Cassava where I've ordered the curry meatballs. Like I do at least once a week. Why?


  • Apple Watch Thoughts

    August 3, 2015

    Drawer-ware

    I spent a week with the Apple Watch. It's in the drawer with my Android watch and my Pebble.

    The hardware

    The Apple Watch is one of the nicest pieces of physical hardware I've ever put on my wrist. I've got a Rolex and a Tudor... a bunch of Seiko watches, and others. My favorite watch is a Traser... but that's mostly because it's very practical.

    I got the 38mm, Black Sport Watch. The physical feel of the Apple Watch is superb. The materials are amazing. The silicon band is the first silicon band I felt comfortable wearing for 12+ hours.

    I would gladly pay $500+ for a watch built like the Apple Watch with a quartz movement and tritium hands.