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…
You may wonder how long a particular line of Java code executes. If this line is part of your code, it’s easy to find out by putting
System.currentTimeMillis() calls before and after the line and finding the difference. But what if this line of code is part of a library or a framework? You could use a profiler, but a quicker and easier way might be to use breakpoints in IDEA.
Put a breakpoint on the line you want to profile (e.g. …
Encrypting an existing user home folder in Ubuntu should be a single-command task, but it got tricky for me with some complications. I’ll try to explain what issues I had and how I fixed them. I used the latest LTS 20.04.1 version of Ubuntu.
First off, you’ll probably want to encrypt the whole drive instead, since some sensitive data may reside not only in your home folder but also outside of it. …
The Kotlin programming language has two distinct features that may be used for similar purposes. Those are inline classes and type aliases. You could use them to improve code clarity and type safety, but what’s the difference between them? This is the topic of this article.
Type aliases first appeared in Kotlin version 1.1. They effectively allow you to declare a new name for any existing type. This declaration doesn’t create a new type, and you can pass the aliased type wherever the alias is expected (something that’s called assignment compatibility):
typealias Str = Stringval s: Str = "Hello"
If your work as a software developer is not directly related to open source (i.e. you don’t spend most of your working time supporting or contributing to an open-source project), your GitHub profile may be blank, except for some study projects and test assignments.
This is not necessarily bad, and it doesn’t make you a bad developer. But probably you’d like to create outside visibility of your work and boast some green tiles on your GitHub contributions timeline. So here’s a couple of tips to get you started.
Woah, this is certainly not about sneakily hacking on open source projects…
Technical project lead @ CRX Markets. I mostly write about Java and microservice architecture. Occasional rants on software development in general.