In this article, I’d like to share my setup for writing notes in Markdown with mathematical formulas using LaTeX syntax. I use vim and neuron for that. I mostly work on Mac, but the setup for my Linux laptop doesn’t differ significantly.
neuron implements a note-taking approach called Zettelkasten. There’s a lot to be said about this great tool (including that it’s soon going to be superseded by even cooler Emanote). But for this article, I’m only focusing on its ability to generate neat HTML pages with mathematical formulas based on Markdown and LaTeX syntax.
This article is written after an evaluation of trunk-based development and feature toggles for my project. It might be opinionated, but I tried to present a holistic explanation of why you might want to move from feature branching to trunk-based development and how you can do that using a set of different techniques and best practices.
Feature branching is an approach where you create a branch in your repository for every task or feature. Depending on the size of your features, implementing them may take weeks and even months. …
A hidden gem in the standard Java library is the RuleBasedCollator class. It allows you to define custom collation — a set of rules for comparison between different characters in a string — in a flexible way. Your use cases might be one of the following:
Disclaimer: debugging is one of the most important techniques in the toolbox of every software developer. Investigating issues in your code by interspersing it with “print” statements or slightly changing it until it works is rarely a good solution, so “learn how to debug” is the best advice you can give to a less experienced developer.
And here I am, saying that you should stop debugging. Yes, as soon as you learn how to debug, you have to immediately start to un-learn it.
Debugging is a great technique, but it should be used sparingly. If you blindly jump into a…
In this article, I’ll describe a cool concept of functional programming, type classes, on the example of the Haskell programming language. I’ll start by providing some Java examples and go through the limitations of the Java language and its object-oriented paradigm. I will then describe how those limitations are lifted when moving into the functional programming world.
The article is targeted mostly at Java developers, but knowledge of any object-oriented language will do. You don’t need to have any prior experience in Haskell before you read the article. However, I would be happy if you become interested in this wonderful…
In this article, I’ll describe a trick from the Jackson JSON parsing library that allows parsing non-typical JSON with greater flexibility.
Sometimes you can’t influence the structure of JSON that you get — for instance, you work with legacy data or consume it from another system. When parsing a record of a person, you usually expect something like this:
"name" : "Jane Smith",
"rate" : 4.2,
"age" : 42
However, you might get all properties of a person just as elements of an array, without property names:
The first element of the…
Whether you support an open-source repository and need to accept PRs once in a while, or are involved in the code review process for your company’s project, doing a good code review is hard. Depending on your dedication, it may take up to half of the time that was spent by the author of the code on the actual implementation.
Here are some principles that should help you make the code review effective and productive and provide the best output for the author and yourself.
A lot of the things typically checked during the code review are easily automatable. Linters…
GnuPG (gpg) is a great utility that is usually available both on Linux and Mac. It can be used for generating encryption and signing keys and using them to encrypt and decrypt your sensitive data. Here’s a quick cheat sheet for basic usage scenarios.
Generate a new gpg key:
The utility will ask some questions, for most of them the default values are fine:
In this article, I’ll explain in detail the solution for the “Strange Printer” coding problem. It’s featured on multiple coding exercise websites, you may have encountered it at LeetCode by the number of 664.
Suppose you have a printer whose purpose is to generate a string of lowercase English characters. The limitation of the printer is that at each step, it can only print a string containing the same character, e.g.
The trick is that the printer doesn’t print out the steps in sequence, but rather can start printing at any place, possibly overwriting the results…
Sometimes you may want to move or advance a tag as part of your GitHub Actions pipeline.
First, make sure you know what you’re doing — moving tags in a git repository is generally a bad idea, since it may mess with other people’s repositories and incur non-reproducible build and deployment issues. However, there are some workflows and cases that justify moving tags.
For instance, you may have a
latest, or a
nightly tag in your repository, which you use to execute a nightly build.
If you want to manually move a tag using your local development environment, this would…