Blog

  • How AI made leaving Evernote finally worth it

    How AI made leaving Evernote finally worth it

    For about 15 years, Evernote was one of the few apps I genuinely loved. I started with notes, then shifted to using it heavily for tasks and reminders as well.

    (more…)
  • Is the SaaSpocalypse real, or is it just a squeeze?

    Is the SaaSpocalypse real, or is it just a squeeze?

    There is a lot of noise right now about the SaaSpocalypse. Depending on who you listen to, AI is either about to destroy the software industry as we know it, or this is just another market panic dressed up as a technology story.

    I’ve spent close to 30 years building software, and much of that time has been spent building and managing products used by millions of people. So I’m not particularly interested in looking at this as a stock market story, or making dramatic predictions about every large SaaS company suddenly disappearing. I’m more interested in looking at it from the builder’s side.

    (more…)
  • What if the next programming language isn’t for us?

    What if the next programming language isn’t for us?

    We’ve spent decades optimizing programming languages for humans. Nicer syntax, higher-level abstractions, better type systems and better tooling, all in service of human authors. But something is shifting. Increasingly, we describe what we want and AI writes the code.

    If that continues, there’s a question I can’t shake:

    If AI becomes the primary author of software, why would the next programming language still be designed for us humans?

    (more…)
  • Four things wrong with the Evernote Android widget

    Four things wrong with the Evernote Android widget

    I’ve been a paying Evernote user since May 2010. For most of that time I’ve been happy with it. But almost all of my day-to-day use goes through the Android widget rather than the app itself, and the widget hasn’t kept up.

    Four things bother me. None of them are dramatic on their own. Together they add up.

    (more…)
  • How to trigger and run Firebase scheduled functions from localhost

    How to trigger and run Firebase scheduled functions from localhost

    Every wonder how to trigger Firebase scheduled (pubsub) functions directly from localhost during development? It’s actually quite easy, but for some reason not very well documented.

    Start by installing Firebase CLI:

    npm install -g firebase-tools

    Setup local Firebase emulators:

    firebase init emulators

    Make sure that your firebase.json has a pubsub port defined.

    "emulators": {
      ...
      "pubsub": {
        "port": "8085"
      }
    

    Start your local emulators:

    firebase emulators:start

    Shell into the running Firebase emulator instance

    firebase functions:shell

    You can now trigger any functions.pubsub.schedule directly from this prompt. E.g:

    scheduleNotifier();

    You’re now able to significantly improve your firebase function development, since you can trigger the scheduled functions interactively.

    firebase > scheduleNotifier();
    'Successfully invoked function.'
    firebase > >  No matching documents.
    >  Notifier done: 0
    
  • How to check a DNS TXT record using OSX Terminal

    A lot of services today authenticate DNS via TXT records and i find myself looking for web-services that checks those values for me. However, doing this will only give me the DNS record(s) for the DNS where the service is running, not actually my local DNS response.

    Doing this via the Mac/OSX Terminal (command line) is trivially easy:

    dig -t txt domain.com

    Which will give you the TXT record for the specified domain. You can change the “txt” part to any other DNS parameters.

  • Updating PHP to 7.2 on OSX using Homebrew

    Updating PHP to 7.2 on OSX using Homebrew

    PHP 7.2 provides several critical security updates and it’s important for any PHP developer to make sure that they leave the 5.x branch and jump on the 7.x branch as soon as possible.

    Updating to PHP 7.2 is a breeze If you’re on OSX and using Homebrew.

    Start by making sure that brew is up to date:

    brew update && brew upgrade

    Unlink any previous PHP installation (this may vary, so you might need to replace the php71 accordingly):

    brew unlink php71

    Install PHP 7.2:

    brew install php72

    Once done, you can verify that PHP 7.2 was installed by using php -v

    Happy coding!

  • How to fix “Unprotected Private Key File!”-errors when trying to connect to a EC2 machine

    Most Amazon EC2-users run in the to pesky “Permissions XXXX for ‘xxx.pem’ are too open. It is required that your private key files are NOT accessible by others.”-problem from time to time. And the solution is surprisingly simple.

    Since you are trying to access a machine using a private key, SSH requires that this key is only readable by the current user. This is to ensure that no-one else on the system can access this file and use it.

    Simply change the permission of the .pem file to 400, which means that it’s only accessible by your user and the problem will be fixed:

    chmod 400 xxx.pem

  • Getting the PHP runtime for App Engine to run on Ubuntu

    AppEngine + PHPExciting news out of Google I/O 2013 reveals PHP support on Google AppEngine. As a php and a appengine-nerd, this is great news. And setting up the local development environment on Ubuntu (13.04) was a breeze.

    The PHP runtime for AppEngine requires the cgi-version of php 5.4 (and above) and python  2.7 (and above). Most Ubuntu-installations have python installed, but i’ll cover those steps as well, feel free to skip those if they are redundant for you.

    Installing Python

    sudo apt-get install python

    Installing php5-cgi
    (this should be safe to install even if you currently have a php-version installed since it’s the cgi version)

    sudo apt-get install php5-cgi

    Grabbing the AppEngine for PHP SDK

    wget http://commondatastorage.googleapis.com/appengine-php/appengine-php-sdk-1.8.0.zip
    unzip appengine-php-sdk-1.8.0.zip

    Starting a local AppEngine instance using php5-cgi

    ./dev_appserver.py /path/to/your/app –php_executable_path=/usr/bin/php5-cgi

    Your app should now be serving on http://localhost:8080/.

    More details can be found in the official documentation:
    https://developers.google.com/appengine/docs/php/gettingstarted/

  • How to re-enable workspaces on Ubuntu 13.04 Raring Ringtail


    enableworkspacesCanonical (the makers of Ubuntu) decided to remove the highly useful workspaces on default Ubuntu installations. But have no fear, this guide re-enables the workspaces within a minute or so.

    It’s actually a lot easier than i thought, so ignore below and just open Settings -> Appearance and click on Behavior. Now you can re-enable workspaces with the “Enable Workspaces”-checkbox.

    I’ve also updated the screenshot to better illustrate this.

    ———–

    First off we need to install unity-tweak-tool, either click on the link or type in the following commands in a Terminal (Ctrl + Alt + T)

    sudo apt-get install unity-tweak-tool

    Now open unity-tweak-tool using the Terminal:

    unity-tweak-tool

    In the window, click the “Workspace Settings”-icon (check the picture above) and flip “Workspace Switcher” to “On”.

    Workspaces have now been re-enabled on your machine and it’s a persistent settings, so you don’t need to redo this if you reboot your machine.