Blog

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

    (more…)
  • Navigating Evernote’s UI Hurdles: The Android Widget Experience

    Navigating Evernote’s UI Hurdles: The Android Widget Experience

    As a dedicated Evernote premium user since May 2010, I’ve witnessed its evolution and have largely benefitted from its robust note-taking and task management capabilities. However, a significant portion of my interaction with Evernote is through its Android widget, which, I’ve found, is not keeping pace with user needs, particularly in terms of its UI/UX design and functionality.

    This post delves into the specific issues I’ve faced, highlighting areas where Evernote could improve to meet the demands of its long-term users.


    Syncing Issues with the Android Widget

    One of the core issues I’ve encountered is the widget’s inconsistency in updating tasks. Unlike the seamless sync we expect in today’s app ecosystems, the Evernote widget often falls out of sync. This discrepancy means tasks updated within the app itself don’t always reflect on the widget, or the other way around. For someone who relies on immediate updates for reminders and tasks, this lag is not just inconvenient; it’s a deal-breaker.

    Clunky Task Addition Process via the Widget

    The process of adding tasks through the widget is far from intuitive. An evident example is the inability to set due dates directly when adding a task from the widget. This oversight forces a two-step process: you add the task via the widget and then have to open the app, locate the task, and edit it to set the due date. This cumbersome process undermines the very efficiency that a task management tool should offer.

    Lack of Customization in Task Display

    The widget lacks essential filtering options. It displays all todo-items, regardless of their due date status. This “all or nothing” approach leads to a cluttered and overwhelming widget view, especially for users who have numerous tasks, some of which might not be immediately relevant. The absence of filters to tailor what appears on the widget means you can’t easily focus on the tasks that require your attention for the day or week.

    Need for a More Condensed Design

    The current design of the Evernote widget is too spaced out, taking up valuable real estate on the home screen. A more condensed design would allow for more information to be displayed, enhancing the widget’s utility in a limited space. This is especially crucial for users who depend on a quick glance to stay informed and organized.


    The issues mentioned above with the Android widget reflect a broader concern: the gap between Evernote’s core functionality and its adaptability to user-specific needs, especially for those who, like myself, have shifted to a widget-centric workflow.

    While I’ve been a satisfied customer for over a decade, these UX and UI limitations are pushing me to reconsider my reliance on Evernote. It’s crucial for productivity tools to evolve with user habits, and in this aspect, Evernote’s widget seems to be lagging.

    As a call to action, I urge Evernote to address these concerns, ensuring that its widget is not just an extension but a fully functional and integral part of the Evernote experience. The potential for improvement is immense, and it’s in areas like these that Evernote can truly enhance its value for dedicated Android users.

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

  • How to fix Unity And Compiz not showing after Ubuntu 13.04 upgrade

    Ubuntu 13.04 Raring RingtailAfter upgrading my installation of 12.10 Quantal Quetzal to Ubuntu 13.04 raring ringtail Unity decided to go in to hiding mode. Not sure why this happened, but resetting Unity And Compiz solved the issue for me.

    Resetting Unity and Compiz is exactly what it sounds like. It will reset all customizations and configurations you’ve done to Unity and Compiz. So make sure that you backup any settings you wish to keep. Your mileage may vary.

    Before resetting we need to install dconf-tools on your machine:

    sudo apt-get install dconf-tools

    Now run the following command to reset Unity and Compiz:

    dconf reset -f /org/compiz/

    All you need to do now is to logout and login and Unity should re-appear on you brand spanking fresh version of Ubuntu. Enjoy!