Blog

Markdown Kanban with Obsidian Janne Kemppainen |

I like to organize my blog around Obsidian which is a Markdown-based note taking application with emphasis on internal linking and note discovery. I want to manage my blog posts as tasks, so I’ve implemented a custom Kanban-like workflow with Obsidian. In this post I will share my setup, and the alternatives that I’ve looked at.

AWS Security Groups Explained Janne Kemppainen |

When you create an EC2 instance it can be added to up to five security groups. But what are they actually and how do they work?

Analytics Addiction is a Thing Janne Kemppainen |

So you started a blog, wrote a few articles, configured Google Analytics, and now find yourself constantly checking if anyone is visiting your site? I know how you feel, I’ve felt the urge to check my stats basically every day since my blog went online. In this post I’m going to share how I changed my mindset to overcome this huge time sink.

Comparing Markdown-based Note Taking Software Janne Kemppainen |

Services like Roam Research or Notion have made note taking really trendy recently. The problem with hosted services is that you don’t own the platform and the content there, so what do you do if they go out of service or increase their prices?

Show a Progress Bar in Python Janne Kemppainen |

Python is a great language for writing command line scripts. When you need to run long running processes it is polite to indicate the overall progress to your user. You don’t want the user to think that your script has hanged and terminate the execution after a minute. Luckily, adding a progress indicator is really easy!

What is the Switch-Case Equivalent in Python? Janne Kemppainen |

Historically, the Python syntax hasn’t had a switch-case statement. In 2006 Guido van Rossum, the original author of Python, proposed different alternatives for the switch-case syntax in PEP 3103 but they all seemed to have some problems and the idea didn’t gain enough popular support. The proposal was therefore rejected. Python version 3.10 changes this.

In the Flow Janne Kemppainen |

I’ve been investigating different methods of personal note management, and I’ve come to the conclusion that I want to keep my notes as plaintext Markdown files for the best future compatibility. One of the tools that I’ve been trying out is Obsidian. At some point I will probably write a comparison of the different software I’ve been trying out, but this post is actually about getting into the flow state of writing.

Manage GCP Resources with GitHub Actions Janne Kemppainen |

You can manage Google Cloud resources pretty easily with the gcloud command-line tool, but automating that stuff can be even more fun! In this post we’ll see how to use GitHub Actions to perform actions on GCP.

Move a Git Tag Janne Kemppainen |

Normally when you create a Git tag you should just let it be and not alter the history after the fact. But if you really need to move a tag forward how can it be done?

Create Self-destructing VM Instances on Google Cloud Janne Kemppainen |

When you run temporary workloads you may not want to leave old machine instances lingering behind. Preemptible VM instances let you run at a significantly discounted price but they are shut down automatically after 24 hours, or earlier if Google needs those resources. The instances will still remain there in shut down state and they can still be turned back on later. What if you wanted to delete the machines automatically when you’re done with them?

Do More with Workflow Commands for GitHub Actions Janne Kemppainen |

If you’ve read my Gentle Introduction to GitHub Actions you should already have a good understanding of the GitHub Actions basics. Creating a workflow is usually quite simple as long as you can find suitable action implementations for your steps. In some cases you may need to write your own actions, but you can actually get quite far with workflow commands.

Return Many Values as Attributes in Python Janne Kemppainen |

When you need to return complex data from a function you typically think of two options:

  1. put the values in a dictionary
  2. create a new object/class

The first option is simple to implement but you need to access the individual values by their keys. The second option allows you to access data via attributes and do custom calculations behind the scenes, but then you need to implement yet another class.

Is there something in Python that could give us easy attribute access without having to bother with custom classes?