My Favorite Quote

My favorite quote is from a text written by the Sanskrit writer Kālidāsa. I read it in a book about 3 years ago and it has stuck with me since then. It’s rare that I get “excited” about quotes, but this one really got me. I think about it often.

For yesterday is but a dream
And tomorrow is only a vision;
And today well-lived makes
Yesterday a dream of happiness
And every tomorrow a vision of hope

Things I’m reminded when reading this:

  1. Life is right now in this moment
  2. Worrying too much about the future isn’t very helpful

🕉

After Co-living

There are a bunch of people, probably around 30 to 40 to be more accurate, that I feel like I’ve known for years. They come from all around the world. They do completely different things for work. They look completely different. They are meat eaters, vegetarians, vegans, coaches, architects, programmers, investors, entrepreneurs, christians, muslims, atheists, surfers, travelers, students – you get the idea. They are different kinds of people.

The one thing they all have in common is that I’ve known them for less than a year.

These are some of the people I’ve met during the 3-4 months I’ve spent co-living at Sun & Co in the past year.

Sun & Co has been my second home in 2016 and my go-to-place, whenever I had a few weeks with nothing else on the schedule (that required my physical presence that is). I’m pretty sure I have the record for most time spent in the house.

I’ve seen a huge amount of people come and go. A lot of whom said their lives were transformed after trying co-living and meeting such a diversified and interesting group of people.

I had my first co-living experience in 2014, when I lived with a large group of “digital nomads” in a large apartment building in Chiang Mai, Thailand. Still we were living in our own studios. In 2015, I stayed for a few weeks at the famous Surf Office in Las Palmas, but still in shared flats with private rooms. Sun & Co was my first time living and working in a house full of people I didn’t know in advance.

One of the hosts at Sun & Co, and a good friend of mine, Jon, wrote a blog post about how co-living is a very accelerated version of co-working. It’s a great post, which does a great job explaining what I’m trying to say here: Living and working together with people is an extremely accelerated way of making new friends and connections. For me, one of the biggest part of co-living has been the friendships I’ve made that continued after co-living.

There are a ton of “how co-living changed my life” blog posts out there, so instead of doing yet another one, I thought I would share a few pictures of some of the “after co-living” memories I have from 2016.

The Sun & Co 1 year anniversary party – hosted by friend-of-the-house Alejandro on his amazing rooftop. A lot of people came back to connect with “old” friends!

A trip to the nearby market in Jesus Pobre with my girlfriend – made possible by Jon from Sun & Co, who let us take his motorbike! Trusting someone to drive your motorbike is much easier when you’ve lived together with them.

In Edinburgh, having lunch with Mohammed who I met at Sun & Co. Mo and his wife made us an amazing traditional Palestinian feast!

… And an amazing cup of Arabic coffee!

I spent 4 months “house sitting” this apartment in Copenhagen for a girl I met at Sun & Co (because she didn’t want to leave Javea). Again, trusting someone to stay at your place is a lot easier when you’ve lived together for a month.

Last meal in Sun & Co before roadtripping Andalucia. All my friends from Sun & Co and Javea came to the house to say goodbye and eat Burritos.

The Stairstep Approach to Proper Push Ups

5 or 6 years ago I couldn’t do a proper push up. Not a single one. I was overweight and believed I was too heavy to push up my own body weight.

Around that time, I implemented a lot of changes in my life. I began eating healthier and started exercising. I lost weight. I quit smoking. I took a year of leave from university to pursue some of my entrepreneurial dreams. I did a lot of things that gave me a lot more confidence in myself. I also started doing push ups – on the stairs leading down to the basement of my parent’s house where no one would see me.

In the beginning, I didn’t know how to tackle the push ups. I couldn’t even do one, so how would I get started? I remember reading about the “100 push ups challenge” online, but to get started you had to do a test session to see how many push ups you could do. The training program was based on that initial session. Useless in my case.

One of the ways people recommended getting started was doing push ups on your knees. I could do that without any problems, but I still couldn’t figure out how to move on to proper, real push ups.

One day I figured I’d try to do the push ups on stairs instead… I walked down the basement, put my hands on the 4th step up from the floor and I actually did a few “proper” push ups. It was a revelation. Seriously.

I decided my goal was to do 20 push ups on that step. Then move down 1 step. Do 20 push ups. Then continue doing that until I was doing 20 proper push ups on the floor. I don’t remember how long that took, but it worked. Every other day or so, I’d do a few sessions with as many push ups I could do. Slowly I worked my way down the stairs and in the end I had cracked the code and was doing 20 push ups on the floor.

The title of this blog post is a tribute to Rob Walling’s legendary “The Stairstep Approach to Bootstrapping” post, because the exact same principles apply. I think they apply to nearly everything. I honestly believe that no matter what skill you are trying to acquire, there’s always a way to stairstep it. No matter if you are literally doing your push ups on the stairs or you are trying to learn how to build and run a business.

💪

How I Listen To Podcasts

I’m addicted to podcasts.

On any given day I spend several hours listening to podcasts.

Podcasts about business. Podcasts about lifestyle. Podcasts about coding and technology. Podcasts about anything that I’m interested in. In fact, my podcast feed is a pretty good snapshot of what’s on my mind at the moment.

I’ve listened to podcasts for years. Probably 10. And I clearly remember the first podcast I ever listened to. It was a short podcast by Steve Pavlina called “How to Make Money Without a Job“. I downloaded it as a .mp3 file and put it on my MP3 player. It was the only podcast on my MP3 player and I listened to it countless times. I remember listening to it on the train on my way to school and while I was cleaning the windows in my parents’ house. It really inspired me. And I loved the audio format.

Since listening to Steve Pavlina on my MP3 player, my podcasting practice has evolved quite a bit. I thought it’d be fun to share it here.

The tech

There are quite a few different podcast players out there. The one I use is called Pocket Casts and I love it. It’s one of the apps on my phone I use the most. If you are just getting started with podcasts, I definitely recommend that you buy Pocket Casts.

Intermezzo: Why I (only) listen at 1x speed

When you get into the world of podcast consuming, it won’t take long before you are introduced to the practice of listening to podcasts at 1.5, 2 or even 3 times normal speed. Like spooling through a tape on your Walkman. By listening on double speed, you can consume the double amount of content.

I used to listen at 1.5x speed for a while and I got completely used to it. But honestly, whenever I was listening in the kitchen, or somewhere else where other people could hear it, I actually thought it was a bit embarrassing. It emphasized the fact that I was literally addicted to podcasts. I couldn’t get enough. I needed more. Faster.

The reason I stopped listening at 1.5x speed, though, was that it increased my levels of stress and anxiety. The walks I love taking with my podcasts were suddenly making me more stressed and anxious than I already was. And they are supposed to do the opposite!

If something isn’t worth your time at normal speed, don’t listen to it at all.

My advice if you listen at more than normal speed: Try not to for a while. Don’t treat your podcast feed as a todo list that you have to burn through as fast as possible. If something isn’t worth your time at normal speed, don’t listen to it at all.

How I find new podcasts

Pocket Casts has a discover area that you can use to find the first few podcasts to subscribe to. Just find a few podcasts on topics you are interested in and start listening. Honestly, I haven’t found a great place to find podcasts yet. Most podcasts I discover when they are mentioned on another podcast I listen to. It takes a while before you have a solid podcast feed.

The features I wish I had in my podcast player

If you are working on a podcast player and read this, here are my top most wanted features in my podcast player:

  • A way to take notes
  • A way to “highlight” parts of a podcast episode
  • A way to tag and sort podcasts

The listening

What I listen to changes a lot. I add and remove stuff to my podcast feed all the time. I very much use podcasts for inspiration. In many ways, it has replaced blog posts and industry news for me.

When I need inspiration for a new idea or project, I listen very intensely to business or entrepreneurship podcasts to get all fired up. When I need to get the actual work done, I listen a lot less (I can’t listen to podcasts while working) and often to more technical stuff that is related to the work I have to do.

When I listen to podcasts also changes a lot. Sometimes I have more time that others. I take long (5-10 km) walks almost every day where I listen to podcasts. I also like to listen while I drive, take planes, cook dinner or do cleaning. Actually, I even listen to podcasts with my girlfriend. Only, we don’t like the same podcasts. So if we are on a plane or a bus, we’ll sometimes listen to each our own podcast and both be totally cool with it.

That was a lot of words on how I listen to podcasts. If you read all the way to here, you must be a podcast geek too! I hope you found it interesting.

Postlude: My favorite podcasts

I have a lot of favorite podcasts, but here are a few that I have listened to for a long time* and that I will probably continue listening to for a long time.

* A few of these are actually new discoveries that I know I’ll keep listening too.

How To Also Be Productive Tomorrow: 1 Simple Idea

This very simple idea is one of the best productivity hacks I have heard in a long while. It is so simple to implement and it has the potential to really improve your workflow.

Last night, I was accidentally watching a show in TV, which I normally try to avoid. I usually find it to be a waste of time. But yesterday I ended up watching it anyways, because someone else put it on. In the end of the show, 3 celebreties, one of them a famous and controversial Danish poet, had to come up with a creative ending for the show.

When I’m writing, I make sure to always stop while I’m still in the zone. It makes it a lot easier to get started the next day.

Long story, short. At one point the poet, Jørgen Leth, said something that really resonated with me, but never occurred to me. He said: “When I’m writing, I make sure to always stop while I’m still in the zone. It makes it a lot easier to get started the next day.

Wow! There is a saying that you have to “strike while the iron is hot” and I always assumed that it applied to writing as well. I never questioned it. When I am in the zone, I don’t want to stop. I want to get as much done as possible, while I have the chance. However, getting into the zone has always been a mystery to me. After endless staring at the screen, all over sudden I end up in “the zone” without knowing why. At least sometimes. What if, once I am in the zone, I could just leave a door open for the next day, so to say?

There is a saying that you have to “strike while the iron is hot” and I always assumed that it applied to writing as well. I never questioned it.

Well, that would make it a lot more tempting to sit down and get something done. Imagine that right before you write down that really great idea you have, you postpone it until tomorrow. It will stay in your head and you simply can’t wait to get it “down on paper”. Next morning, you jump right into the zone.

To good to be true?

Why I’m Keeping The Free Version Of WP Pusher

This morning, while taking a run in Las Palmas, Gran Canaria (Yay! Location independence ftw!) I decided to no longer offer a free version of WP Pusher. This was quite a big decision for me and something that has been on my mind for a long time. 4 hours later, during my lunch break, I decided to keep the free version after all. Here is why.

Some Background

Throughout the (short) history of WP Pusher, I have had 3 business models. First, WP Pusher was meant as a Software as a Service business, where users paid a monthly fee to use it. This model was great because it allowed me to do stuff on my own server, instead of having to mess around too much on customers WordPress installs. However, when building the plugin, I kept making it simpler and simpler. In the end I felt like the SaaS model was overkill and decided to rewrite everything to be just a plugin. Business model #2 was a free version, available on WordPress.org and a paid version with some extra features.

Then I got this e-mail:
WP Pusher banned from WordPress.org

There went business model #2.

Business model #3 still involved the free version, but now that it wasn’t allowed on WordPress.org, I had to offer it through my own site. Actually, this wasn’t too bad, since this allowed me to collect e-mails from the people who wanted the free version so I could stay in touch.

Fast-forward to this morning.

For a while, I have been kind of upset with the free version. A lot of people are using it, so maintaining it, answering e-mails and the likes all takes up quite a bit of time. And then one more thing. People love the free version! Actually, most of the users I have been in touch with love the free version so much that they do not upgrade to the paid version. Actually, most people who paid to use the plugin did so from the beginning and never used the free version. There went business model #3. At least that was my conclusion this morning.

Why Keeping It Is A Great Idea

So, even though the conversion rate from “Free” to “Pro” is not as high as I would like it to be, I still decided to keep the free version. These are the “why’s”:

  • I have about 20 times as many people using the free version compared to the pro version. These users provide me with invaluable feedback that also relates to the pro version.
  • Most of the bug reports I have received are from people using the free version. I think that people using the free version are actually thankful that they get to use it for free, which encourages them to submit very detailed and useful bug reports.
  • I get to collect e-mail addresses from users of the free version, which means I can stay in touch with them, get their feedback and tell them about the pro version.
  • People using the free version will potentially talk about it and attract new potential customers. (I don’t know if this is valid as I haven’t tested it.)
  • Even though the numbers are not large enough, I still have people convert from free to pro. I think some people use the free version as a free trial before they decide to go pro.

The Unresolved Case

I am still left with a dilemma. I have concluded that either my free version is too good or the pro version needs to be even better.

Should I make the free version worse or should I come up with a better pro version? In my world, the Push-to-Deploy feature from the pro version is without doubt the best part of WP Pusher, but apparently that (and support for branches) is not enough to convert people from free to pro – in most cases.

The main issue is that the pain-relieve when going from not using WP Pusher to using the free version is pretty large. Somehow, I need to make the pain-relieve when going from free to pro equally large.

Anyways, I am keeping the free version for now because in the end, I think it gives me a lot of valuable feedback and user interaction that I otherwise would not have. It is a dilemma, since worsen the free version just does not feel right. At the same time, the free version was originally meant to be a teaser for the pro version – not a replacement. Personally, I think the pro version is killer. Maybe I need to communicate it better. Or maybe add an extra killer feature that users of the free version simply cannot resist.

I am trying to figure out if I need a business model #4.

3 Cool Things You Can Do With Arrays In PHP

PHP has a wide variety of functions for interacting with arrays. Some of them are more known than others. In this short blog, I will demonstrate 3 cool things you can do with arrays in PHP that you may or may not know about.

Turn variables into arrays

The first thing I want to show is how to use compact() to turn variables into an array. I never heard of it before using Laravel, but now I use it all the time – especially in my controllers when I need to pass variables to a view.

php > $name = 'Peter';
php > $email = 'peter@suhm.dk';
php > $array = compact('name', 'email');
php > var_dump($array);
array(2) {
  ["name"]=>
  string(5) "Peter"
  ["email"]=>
  string(13) "peter@suhm.dk"
}

Turn arrays into variables

The opposite of compact() is extract(), which lets you turn an array into a bunch of variables.

php > $array = array('name' => 'Peter', 'email' => 'peter@suhm.dk');
php > extract($array);
php > var_dump($name);
string(5) "Peter"
php > var_dump($email);
string(13) "peter@suhm.dk"

Implement ArrayAccess

Finally, I want to demonstrate the ArrayAccess interface that comes with PHP. It is really awesome and lets you take arrays to the next level. If you need inspiration, check out the Collection class from Laravel. By implementing ArrayAccess, your objects can be accessed like they were an array, which is pretty awesome.

class AwesomeClass implements ArrayAccess
{
    // Example from php.net
    // http://php.net/manual/en/class.arrayaccess.php
    private $container = [];

    public function offsetSet($offset, $value) {
        if (is_null($offset)) {
            $this->container[] = $value;
        } else {
            $this->container[$offset] = $value;
        }
    }

    public function offsetExists($offset) {
        return isset($this->container[$offset]);
    }

    public function offsetUnset($offset) {
        unset($this->container[$offset]);
    }

    public function offsetGet($offset) {
        return isset($this->container[$offset]) ? $this->container[$offset] : null;
    }
}

// Usage
$awesome = new AwesomeClass;

$awesome['name'] = 'Peter';

Resolving Controllers With Symfony And A DI Container

For a project I am working on at the moment, we are using Symfony’s great routing component. The other day, I had to set up the routes to work together with our controllers and stumbled upon something that I would like to document here.

By adding a _controller parameter, such as ‘PostsController::show‘, to a route, Symfony’s ControllerResolver can automatically resolve the controller class given a request object. The ControllerResolver is a part of the HttpKernel component, and also contains an interface, so you can implement it however you like. In my particular case, I actually needed to resolve the class from my DI container, and only needed the resolver to resolve the arguments of the method. I was not going to implement my own ControllerResolver, so here is what I did instead:

// First, fetch the controller string from the request
// Could be something like 'PostsController::show'
$controllerString = $app->request->attributes->get('_controller');

// Next, split the controller string and pass it to two variables
list($class, $method) = explode('::', $controllerString);

// Resolve the controller class out of the DI container
$controller = $app->get($class);

// And use the ControllerResolver to get the arguments
// of the method
$resolver = new ControllerResolver();
$arguments = $resolver->getArguments(
    $app->request,
    [$class, $method]
);

// Now that we have the class and the arguments, we
// can finally call the controller and have it return a response
$response = call_user_func_array(
    [$controller, $method],
    $arguments
);

How WordPress.org Did Me A Favour

In the beginning of this week, I wrote about my (non-existing) marketing strategy for WP Pusher, and boy, this week has gone by fast. The day after I wrote the blog, Sara Gooding decided to write an article about WP Pusher over at WP Tavern – a popular WordPress blog. I got pretty excited and realised how effective content marketing is. It works even before you start doing it!

In other news, I didn’t quite get the amount of traffic I would have expected from the Tavern. The day of the article, according to Google Analytics, 270 people stopped by my the landing page. Not quite a Hacker News kinda thing, but actually, I was pretty satisfied. See, out of those 270 visits, I got 50 free downloads which is almost 20 %.

Remember how WP Pusher is not allowed in the .org repository?

WP Pusher banned from WordPress.org

Since then, I have asked for people’s e-mail addresses upon download, so I can keep in touch and send them updates. Had WP Pusher still been on WordPress.org, 50 downloads in one day wouldn’t be anything exceptional, but think about it. 50 e-mails in one day. That’s not too bad and hence the title of this post. Maybe WordPress.org actually did me a favour by removing the plugin from the official repository.

To sum up the WP Tavern thing, I did not make any sales (that I could directly relate to the article) and I got roughly 100 downloads (the article was tweeted multiple times in the following days).

Content marketing it all

This week, I have been trying to work out how I am gonna strategically work with content marketing. I have been really busy with my clients, but every morning I have been reading articles, PDF’s and I have been jotting stuff down in a spreadsheet. I have also started a makeover of the WP Pusher Blog. At this point, I don’t think there is a lot of value in sharing the spreadsheet, but here is a recap of the most important things:

Main channel The WP Pusher Blog
Main focus Develop Thought Leadership
Target audience Freelance developers and agencies that work with version control on client projects.
Main Topics Deployment, version control and best practices

I think there is a demand for quality information about these topics, that hopefully the blog can help satisfy. I really believe that great content is the way to go. The article on WP Tavern was highly based on the few posts that are already on the blog, which leads me to an important point: Writers and journalists are busy people with deadlines. The easier you make it for them to write about you and your product, the more likely it is that they will do so. It’s really a great lesson for me that I will keep in mind.

Now that I have a better content strategy for the blog, and a fresh design, I’m ready to start creating some great content. Hopefully, that content will help drawing more attention to WP Pusher and ultimately more sales.

It has been almost a month since I launched and I am quite satisfied with the results so far. If I was still living in Chiang Mai, Thailand, WP Pusher would already pay for my rent and basic meals. That’s not quite the case here in Copenhagen, Denmark.

PHP, sendmail And Mandrill

One of the first things that has to happen when I start working on a new project, is to ensure that mail sending is handled by a third-party service. Preferably something like Mandrill or Mailgun. I have no desire to maintain mailservers, SMTP stuff and what not.

Today I had a challenge, when moving a lot of old code to a new Linode server. Most of the code was sending e-mails through a third party package, and was already configured to send through Mandrill. However, some of the code was still using mail(), so I had to somehow configure sendmail to run on the server, in order to not break the app. Just the name, sendmail, makes my palms sweaty.

In the end, I came up with a really simple solution that can easily run until that code has been refactored.

Step 1: Install sendmail

First of all, we need a sendmail binary. I’m writing ‘a’ and not ‘the’, since multiple Ubuntu packages can provide a sendmail binary. Take a look at this:

$ sendmail
The program 'sendmail' can be found in the following packages:
 * exim4-daemon-heavy
 * exim4-daemon-light
 * lsb-invalid-mta
 * postfix
 * citadel-mta
 * courier-mta
 * dma
 * esmtp-run
 * lsb-invalid-mta
 * masqmail
 * msmtp-mta
 * nullmailer
 * qmail-run
 * sendmail-bin
 * ssmtp
 * xmail
Ask your administrator to install one of them

The ‘trick’ here is to use nullmailer, which is a small program that can only forward e-mails to another MTA (message transfer agent). At least as far as I have understood. Anyways, installing nullmailer on Ubuntu is pretty pain-free:

$ sudo apt-get install nullmailer

Step 2: Configure nullmailer

While installing, you will be prompted for a few options. First thing, you need to provide the fully-qualified host name for the server. You will know better than me what this is! Next thing, nullmailer will allow you to specify a ‘smarthost’ to connect to. Here is the one I used for Mandrill:

smtp.mandrillapp.com smtp --user=[username] --pass=[password] --port=587

If at some point you want to edit this, you can do so in /etc/nullmailer/remotes.

Step 3: Test it out

To test it out, you can try to send a test e-mail from the server. First, create a text file with the e-mail:

# testmail.txt

Subject: Test mail from server

This is a test mail from sendmail.

Now, use sendmail to send the e-mail:

sendmail you@example.com < testmail.txt

You can check you mail queue to see if the message was sent:

$ mailq

And that’s it!