Skip to content

The Wise Old Geek Posts

Getting things done with attention deficiency

People see me as an efficient and productive developer, but as many people I am very easily distracted and this productivity is only the visible outcome of an internal war that has been spaning several decacades.

If you also find yourself struggling with guilt of not getting things done fast enough, I hope some of this may help you in your fight.

Sleep well

Super cheesy I know. So much to do, not enough time in the day, right? What years of sleep deprivation taught me is that “nothing good ever got done after 22:00”.
Go to sleep on a decent time, (I didn’t say early, because I’m unable to go to sleep early myself) and treat you a good 7-8h of sleep per day. Do it for a few days, and witness yourself getting super powers:

  • you will remember what you read more vividly (e.g. while reading documentation)
  • your ideas will flow faster and clearer
  • your attention to details will rise up (e.g. preventing typos)

Get a few sleep-less days, and you’ll get back in the constant haze of brain numbness, not remembering what you were doing 10 minutes ago, staring at your screen blankly, your idea well dry as hell.

Procrastination as a red flag

Society likes to point fingers at slackers and procrastinators, while it seems two very different beasts to me.
Over the years, I identified a few activities as things I would always postpone:

  • social activities such as making business phone calls
  • paperwork
  • writing documentation
  • providing negative feedback to people

Anything else I would gladly do, but I couldn’t be bothered to do any item on my todo list, and no amount of reminders was motivating me.

Then I realized they all shared some similarities:

  • they were mandatory
  • they made me uncomfortable

Mandatory, obviously, otherwise I would have just scratched them off from my todo and it would have been the end of the story.
But uncomfortable? I’m a serious introvert, so people-related activities take me a lot of energy to deal with, and often leave me exhausted. I also suffer from dyscalculia, and this has made my life complicated at many levels, including accounting and invoicing, and all paperwork that includes numbers in general. Finally, writing documentation using frameworks like sphinx involves a lot of time-consuming setup and were not fun at all.

How to deal with these then? Well, I have to do achieve the goals, but maybe the means are wrong:

  • phone calls and hard discussions have to be made, but I don’t have to do them all in a row. I need to recover some of my “people” energy in between calls, and stop when my energy is low
  • I hired an assistant to do my paperwork for me
  • I moved from full-fledged documentation to just writing a README in Markdown, for which I see immediate results without having to re-compile the project and deal with ToC warnings

When the guilt is gone, only remain pain points that you need to address so you can move on being efficient again. Procrastination was just the red flag to show you something was off.

Remove distractions

I was raised doing my homework next to the TV, then moved on to listening to songs while studying, and my memorisation skills were terrible back then. I would remember everything from class, but couldn’t work straight back home. Then one day I decided I needed extra focus on something, dropped the headphones and remained in total silence while working. I was able to get in the zone, and focus for longer stretches, with less mistakes, and less daydreaming.

Since then, whenever I’m doing something that requires just a bit of concentration, I just remain in total silence, and it makes all the difference from even music droning in the background, etc.

I also disabled all notifications on my computer and my phone, because I figured out they would properly screw up my focus and get me out of the zone constantly. My phone only now rings for actual phone calls, but otherwise I can forget about the rest of the world for as long as I want while I’m working, and whatever I’m doing has my complete attention for as long as needed.

Make sure you also inform your family, room mates, etc. that you need concentration, since they might be used to bug you all the time and not understand (or not take it seriously) any restriction you could put in place. Remind them that when you’re at work, you’re not in a good setting for being social.

Practice your will

I think that’s where most people give up. When you find yourself being distracted, it’s important to regain control of yourself and push through it. Don’t guilt-trip yourself to “do your job”, but encourage yourself “ok, I just need to re-focus for the next 2 minutes to get back in the zone”. Before you figure it out, you’re focused again.

Start from the cheese

One tip that I often give to aspiring developers, is to start from the end goal and reconstruct your way to there. Instead of starting from the problem definition, start from the expected outcome, and walk backward, asking yourself, ok, to get to step Z, I will need output of Y, then Y need output from X, and X needs output from V and W, … all the way to A, the problem definition.

This is very easy to put in place when you do TDD, you just describe your desired output as your assertions, then walk backwards to your original inputs.

Fine your productive times of the day

We all have our routine, but also tiles during the day when our energy is more suited to different activities. For me:

  • Morning is for meetings, reports, simple code reviews, emails
  • Lunch break is for lunch, keeping up with news, watching shows on Netflix
  • Afternoon is for uninterrupted work, creative activities or complex code reviews
  • Dinner is for family time
  • Evening is for learning, playing with new technology, or just playing games

It’s because I’m usually waking up late, so morning flies by, and I’m not fully awake before lunch. Afternoon can stretch until early night if I need to get something out of my system,and I know I can’t sleep well if I’m not done with my ideas, this is why I’m putting learning at the end of the day.

This is my routine because this is how I live and feel good. You need to figure out when you have the best energy for each activity in your routine and even if it’s unusual, go for it.

All work and no play …

As you may have understood, work takes up a large part of my day, often overflowing over the weekend. At some point, even enjoyable activities get me cranky for no reason, and I contemplate switching careers.

Obviously in these days, my productivity is a flat zero.

Know yourself

At the end of the day, these are just personal reflections from many years of living and working with attention deficit. I’m not a doctor, I didn’t read anything about the topic, I’m just describing how I work around this myself, and how I managed to both use my hyper-focus as a booster, and reduce the amount of distractions through the day. I hope this may help anyone in the same situation, in any case you are not alone 

Comments closed

Buildling a Kubernetes cluster in my basement

For some recent customer work I had to deploy some Docker images on Kubernetes, but didn’t want to setup a full-fledged cluster (nor pay for one) as it was going to be a temporary environment anyway. I therefore dusted off an old PC I had laying around in my basement, and decided I would use it as the base of my cluster.

What I needed

  • At least 3 VMs to install Kubernetes (1 master + 2 nodes)
  • One VM to host GitLab + GitLab Registry
  • One VM to run a GitLab Runner (for pipelines)

Setting up the host

After some back-and-forth discussions with my colleague Kenny van de Maele I went on using Centos 7 to host the VMs, mostly because I was already proficient with Centos and very happy with the platform.

After booting Centos Minimal ISO, I was able to quickly set up the host machine, then I just had to enable my network card (which was not enabled by default) using nmcli d and nmtui as described in the following blog post: https://lintut.com/how-to-setup-network-after-rhelcentos-7-minimal-installation/

Building the VMs

Google was good to me by putting this link in the top results, which was exactly what I was looking for: https://www.cyberciti.biz/faq/how-to-install-kvm-on-centos-7-rhel-7-headless-server/

Since I was going to repeat the process a few times, I just gathered all the bits from the blog post into a single script, and ran it multiple times after altering the $VM variable where the vm name is set. You could also remove it completely from the script itself, and run the script like this:

$ VM=centos7-vm1 ./build_vm.sh

D=/var/lib/libvirt/images
VM=centos7-vm1 ## vm name ##
mkdir -vp $D/$VM
cd $D/$VM
echo "instance-id: $VM" >> meta-data
echo "local-hostname: $VM" >> meta-data
cd $D/$VM
cat >user-data << EOF
#cloud-config
 
# Hostname management
preserve_hostname: False
hostname: $VM
fqdn: $VM.oasis.local
 
# Users
users:
    - default
    - name: eric
      groups: ['wheel']
      shell: /bin/bash
      sudo: ALL=(ALL) NOPASSWD:ALL
      ssh-authorized-keys:
        - <the authorized-keys fingerprint for my private key>
 
# Configure where output will go
output:
  all: ">> /var/log/cloud-init.log"
 
# configure interaction with ssh server
ssh_genkeytypes: ['ed25519', 'rsa']
 
# Install my public ssh key to the first user-defined user configured
# in cloud.cfg in the template (which is centos for CentOS cloud images)
ssh_authorized_keys:
  - <the authorized-keys fingerprint for my private key>
 
# set timezone for VM
timezone: Europe/Brussels
 
# Remove cloud-init 
runcmd:
  - systemctl stop network && systemctl start network
  - yum -y remove cloud-init
EOF
cd $D/$VM
cp /var/lib/libvirt/boot/CentOS-7-x86_64-GenericCloud.qcow2 $VM.qcow2
cd $D/$VM
export LIBGUESTFS_BACKEND=direct
qemu-img create -f qcow2 -o preallocation=metadata $VM.new.image 20G
virt-resize --quiet --expand /dev/sda1 $VM.qcow2 $VM.new.image
cd $D/$VM
mv $VM.new.image $VM.qcow2
mkisofs -o $VM-cidata.iso -V cidata -J -r user-data meta-data
virsh pool-create-as --name $VM --type dir --target $D/$VM
cd $D/$VM
virt-install --import --name $VM \
--memory 1024 --vcpus 1 --cpu host \
--disk $VM.qcow2,format=qcow2,bus=virtio \
--disk $VM-cidata.iso,device=cdrom \
--network bridge=virbr0,model=virtio \
--os-type=linux \
--os-variant=centos7.0 \
--graphics spice \
--noautoconsole
cd $D/$VM
virsh change-media $VM hda --eject --config
rm meta-data user-data $VM-cidata.iso

If you want to configure the VM memory and CPU count, you can do so by editing the command starting by virt-install [...] --memory 1024 --vcpus 1

Configuring bridge networking

After I was done with setting up the VMs, I realized KVM was hosting them on a separate network subnet than the rest of my LAN, which is perfectly fine, but was preventing me from connecting directly to the VMs. Since I’m using Ansible to configure my VMs, I need to be able to SSH directly into them, and I didn’t want to bother with using the host as a jump-host.

It only required 2 configuration changes on the host and adding a permanent route in my router:

Disabling the host firewall

# service firewall disable

I tried several fixes to have iptables not drop packets aimed at the VMs subnet, but unfortunately my experience editing rules was too rudimentary and I didn’t want to spend too much time securing a temporary platform hosted in my basement and only accessible from my LAN.

Enabling IP forwarding

This can be done by editing /etc/sysctl.conf and setting the parameter
net.ip_forwading = 1

Afterwards, a simple call to /sbin/sysctl -p will persist the parameter.

Adding the route

My LAN subnet is 192.168.1.0, and the VMs subnet is 192.168.122.0, so I had to use the host (which has IP 192.168.1.223 on my network) as gateway to brige both networks. Be sure to give your host a fixed IP if you want to set up a permanent route on your LAN.

“Oasis” is the name of the host, I was careful to assign it a fixed IP so I could add a permanent route
Your mileage may vary depending on your network solution vendor, but for me it looked like this on my Ubiquiti controller when I was done

I now realize this is already a lot to process, I will most likely make a second blog post on the actual Kubernetes install, stay tuned.

Comments closed

Powerslide SUV Next Renegade 125 Review

Unboxing and first look

I remember when the Rollerblade Coyote commercials aired in 1997, I was really into skating at the time, and lived in a small town surrounded by forests and dirt paths. The idea of skating on uneven surfaces was a dream of mine, but the price tag was crazy high for the teenager I was so it remained a dream for a long time.

Fast forward a few summers, and I’m now an adult with a bit more disposable income, living in Belgium (known for its waffles and broken-beyond-repaid sidewalks). Combined with the all-year-long wet weather, it’s not the most welcoming place to be skating.

Early June, out of curiosity, I wanted to check whether those off-road skates were still a thing, and realised they still were, and that several other manufacturers started their own lines of off-road skates.

I spent a few days reading reviews and watching videos, and crossed my fingers while purchasing my first pair.

Most reviews are a few years old and it wasn’t easy to cross-reference opinions about these skates, since the branding and models have evolved a bit over time. Here is a 2020 review of the SUV Next Renegade 125 skates by PowerSlide.

Here are a few videos I watched that convinced me to purchase:


James Mackey has several other reviews of the Imperial SUV
This one convinced me on the 125mm when I was also hesitating with 150mm

I ordered the skates from https://www.der-rollenshop.de/, which provides a good choice and reasonable prices. Shopping experience was quite good and they were kind enough to let me know that my order would be delayed because the bottle of anti-rust lubricant I ordered together with the skates was out of stock.

The box contains the skates and a Torx tool, so no need to order a separate one. I also ordered a nordic tire pump from Powerslide with an integrated gauge, since I had read that inflating had to be precise in order to have the best skating conditions without risking to blow a tire.

Size-wise, I do a 10 UK, ordered the 44-45 size and they fit perfectly, even without using the head moulding.

Comparison with Fitness skates

I started skating as a teen with street/agressive skates (my beloved K2 Fatty), but later on I moved to fitness models that I thought would be more comfortable to wear on the long run. I now own a pair of Fila Primo Evo that served me well, but are still not very practical on broken roads and pavements, and I managed to fall badly at least once due to gravel.

Compared to fitness skates, the Renegade 125 are massive. I read reviews, and kinda expected this, but they feel much heavier. The impression might also come from the hard boot, but they feel stiff and bulky.

The wheel train length is also something to pay attention to. You can see on the pictures below that the wheels extend beyond the boot by a good 5cm, so you need to be careful when crossing skates.

125mm vs 80mm

Skating experience

I’ll say it again, the Renegade 125 feel heavy when worn, and you’ll quickly feel it in your butt and knees.

I read people complaining about acute pain on the arch of the left foot when used for some time. I did experience it on the first run, but for me it was a fold in the liner that was too rigid and rubbing hard against the top of my left foot. I re-did the lacing so it would fit the curve of my foot top better, and on the second run I didn’t experience any pain, even after riding for 1h.

Tires add a huge lot of friction to the skates, to a point it feels like skating on a … bike. It is not possible to do any kind of slide with them on, so if you try a power slide or power stop, you’ll end up flying in the air.

As a result, a lot of your kinetic energy will be dissipated in the ground, and if you start to skate you’ll quickly slow down and stop. I think it’s a double-edged situation, because if you’re riding on hard surface where you’d probably pickup a lot of speed, then you don’t really need SUV skates. On the other hand, this offers much more control and stability when riding off-road, so you don’t accidentally end up in a tree because you couldn’t break quick enough. Just stop skating and you’ll stop within a few meters.

They are surprisingly manoeuvrable for their size and weight, I was able to make (relatively) short turns, and overall riding in the city was very smooth. I never had the impression I was riding skis for example.

The real deal here is the fact you can get a smooth skating experience over every type of surface. I went over pavements, broken sidewalks, manholes, road, tarmac, gravel and even small potholes and not only I couldn’t feel the difference (vibrations are well absorbed by the inflatable tires), but I kept control in all situations. Not once I felt like I was going to tip or have my wheel stuck in anything, while it was a constant concern when riding my fitness skates.

Accelerating on broken pavement? Sure. Jumping on gravel? Yep. I didn’t try riding on wet surfaces yet, but given the grip they have, I am not worried anymore of clouds passing by.

Update: real-life review

Most video reviews feature paid pro-skaters who use them as skis to go down slopes, but this is not what I had in mind when I bought them. Here is a small video I took on a sunny afternoon, and how they perform on the kind of surfaces I am usually skating over.

Summary

The Renegade 125 skates are a niche product, for people who are tired of only skating 10 days per year when the roads are empty, clean and dry. They require a strong lower body to operate, and can appear frustrating if you expect the “fitness” experience on all surfaces. You’ll get a lot of freedom, but you’ll have to sweat for it.

I think it’s a good compromise between the “nordic” skates and regular fitness skates, and the first few rides were very pleasing. I’ll soon try a longer trail with some forest path to really test them out, but since my original reason for purchasing them was all-weather skating on the Belgian roads, so far I’m very pleased.

Comments closed

Goodbye BitBucket

Around 2008-2009, I had the chance to work together with Python pioneers at Logilab when at a customer.
They are great supporters of the Python ecosystem and used (at least then) Mercurial for all their code versioning needs.
Coming from a CVS/Subversion heritage, I quickly found Mercurial to be a vastly superior solution and embraced it enthusiastically.

As a result, in 2010, when I started to work on openpyxl, Mercurial was the obvious choice to me. At that time, git (boosted by the GitHub platform launched in 2008) was already growing fast and was the “popular” option. However, its arcanic CLI was a joke in comparison to the beginner-friendly, no-nonsense experience Mercurial was providing.

Finding hosting for the project was not easy, since while git experience itself was no fun, GitHub was really setting the standard for code hosting platforms. After a few experiments (including running my own repository, exploring GNU Savannah, Google Code, …) I finally settled with BitBucket.

The rest is part of openpyxl’s history, and while I often got told “WhY U No UsIng GiHUb??!”, mercurial was the VCS I knew the best, and as the main developer, it seemed to me that my efficiency was the main driver.

When Charlie joined on the project, and later took it over completely, he also shared the idea that the main developer experience is the most important, and remained attached to hg, and BitBucket as a result.

This era now comes to an end, with what Charlie describes, and I agree, as “an absolute disgrace” from Atlassian to sunset support of Mercurial in their hosting offering.

I’m no longer actively involved in the project, and while I keep it on my radar, I don’t yet know what are Charlie’s plans. From what I can see, Heptapod (founded by former Logilab and Mercurial core dev Pierre-Yves David and his pals at Octobus) could offer a way out. Combining Mercurial with GitLab would definitely be a great alternative, bridging the best hosting experience with the most robust VCS.

I’m really looking forward to Heptapod to gain the traction it deserves (while I also agree that GitHub got a significant head start, and developers seem to put hype before practicality nowadays).

Regardless of where Openpyxl will live on, I’m fully trusting Charlie to make the right call for the project, and will be updating this post once he has made a decision.

Comments closed

openpyxl repository change

Hi everyone, today I have decided to move the official openpyxl repository to a new location:

http://bitbucket.org/openpyxl/openpyxl

Why the change ?

Because I am no longer the main contributor on the project, and I felt that I did not have anymore the privilege to have the project tied to my sole name.

Also, as I’m not the only one to work on the project, I started to make pull requests and fork my own repository, which felt a bit awkward.

Finally, I hope that untying the project from me will encourage the growth of an ecosystem around openpyxl. I’ve already written a few tools based on openpyxl who have a live of their own (xlsx-diff for example), and I dream that more people start doing the same, and releasing them as open-source projects that could end up under the openpyxl umbrella.

Will I stay involved in the project ?

Of course, I’ll keep contributing features, based on user requests and needs I find in my daily work. I’m an avid openpyxl user, and most of my contributions solve issues I’m facing personally.

I’ll also keep advocating for openpyxl and its siblings, provide the CI infrastructure for openpyxl, participate in conferences, and write about the project.

Will the previous repository remain online ?

I’m keeping it online for the moment, as I’m sure that it is hardcoded in many people configuration files, makefiles, … but it will eventually be dropped for the reasons I mentioned at the beginning of this post.

My current timeframe is August 1st, 2014.

I have a fork, will I be able to merge it back to the new repository ?

I didn’t find the way to do it automatically using bitbucket, so what I did with my own forks was:

  1. checkout the fork on my laptop
  2. delete the fork from bitbucket
  3. make a new fork, with the same name, based on the new repository
  4. push my local repository to the fork
  5. make a pull request

Will it change again in the future ?

I don’t think so. We set up the openpyxl team on bitbucket, and Atlassian granted it with an academic licence, allowing for an permanent, unlimited amount of contributors.

 

1 Comment

openpyxl @ fosdem 2014

Thanks to Stéphane Wirtel and his team for all his hard work on the Python FOSDEM dev room which successfully demonstrates that you can pack 200 geeks in a room designed for 90 standing people maximum, every year.

(and hello to the poor guys who were left outside and had to watch my back through the window during the whole session)

Comments closed

Openpyxl 2.0.0

This is a very important milestone for the project as version 2.0.0 is now tagged. This means we are confident enough to have it tested in the wild, despite the few changes required to enjoy it fully (mainly in styles department).

As you might have noticed, even though we are sometimes backporting fixes to the lower release branches, development is going on 2.x branch now, and fixes are most likely to occur in the latest version.
We take tests and benchmarks seriously, so you are not on the frontline for bugfinding, hence we encourage you to get started with 2.x as soon as you can as this will become the new default version in a few days.

1.8.6 will remain our last 1.x branch, and will remain on PyPI for the moment, allowing a smooth(er) transition to 2.x. However, as we will focus our work on 2.x, do not expect changes to happen on that branch from our side, but feel free to contribute backports as pull requests if you need them on that version for a reason.

On a different note, I’d like to thank everyone involved on the project since its inception, in a few days from now, version 1.0 will be FOUR years old (see it here). I’d never expect this project to become what it is now, because I didn’t imagine there were so many nice contributors willing to give their time, energy, resources, to make an open source project succeed.
At last, I’d like to thank once more Charlie Clark for his devoted work, and for being our current champion at improving the ECMA standard ruling the OOXML format 😉 Good luck with that Charlie !

 

Comments closed

Upcoming changes for openpyxl

I’m announcing the last (or at least what I believe to be the last) 1.x release of openpyxl to be imminent. I’ll try to quickly fix all compatibility issues that arose since the last release so people can start using the development branch in other python versions than 2.7.5 …

2.x versions will then follow, starting with non-backward compatible changes in the styles department.

I’m also announcing I will no longer lead the project alone, as I can’t find as much time as I should to code, reply on the mailing list and review pull requests. For now, Charlie from Clark Consulting has accepted to help me on the 2.x serie.

Happy coding ! 🙂

2 Comments

Openpyxl 1.6.2 has been released

This is the first post-sickness release of the year ! \o/

Major changes include :

  • bugfixes (many)
  • improved documentation
  • new image inclusion support, using optional dependency on PIL
  • improved robustness for the charts module (still a work in progress, due to the size of the module)
  • data validation module

Once again, this is the release with the most external contributions so far, I’m really happy to see people interested in making the library go further, and providing such quality code, with tests and even documentation. I can’t thank you enough.

However, several pull request remain open, for various reasons from difficulty to merge with the current state of the code, to open question on the benefits of the change. Anyway, if a pull request didn’t make it into this release, it will probably be in the next 😉

Thank you as well for reporting issues you find on the bug tracker, the issues keep piling up so I still need as much help as possible to solve them, but that also means people are using the library 😉

I have now decided to stop using the Bitbucket Wiki page and instead use the ReadTheDocs documentation mini-site, which is better structured and more readable. I tried for a few hours to hide the wiki page, but it was only causing errors while installing openpyxl using pip, so I reverted my change and the wiki is still online for the moment, but won’t be updated anymore.

Here it is, don’t hesitate to give it a try and report errors if you find any 😉

Happy coding !

2 Comments

Why openpyxl development is stalled for now

I thought that I could communicate a bit more on why things haven’t seemed to move too much since my last announcement about how openpyxl development was going to rock in 2013.
In January, I turned 30, but I also became pretty sick, and what was first diagnosed as simple cold was in fact a severe viral disease, that left me and my liver in pretty bad shape. I’m now recovering from the virus (while my antibodies count is still hitting the ceiling) but for a whole month I was unable to focus for more than a few hours a day, and even then, only thanks to high doses of drugs to keep the fever at sustainable levels. I chose to invest all the time I had to do my day job and also to try my best to support my wife who is taking care of the kids (I unfortunately failed at the latter :-p).

I’m since then undergoing weekly blood analysis and have a MRI scheduled next month to see how bad my liver is and how to make it recover fully, and in the meantime I’m starting to feel better, but I’m definitely feeling like a cranky 80 years old man after 4PM, and this might last for a period ranging from a few weeks to a few months.

I’ll try to review as many pull requests as my strength enables me to in the coming days, but please bear with me, as everything will get in, but maybe not very fast 😉

4 Comments