Recent Posts
-
Dijkstra’s algorithm to find the shortest path
Let’s imagine you and your best friend live quite far apart, you haven’t seen him for a while, your best friend is organizing a party at his house and you’re […]
-
An Introduction to Term Frequency – Inverse Document Frequency (tf-idf)
tf-idf is one of the most fundamental concepts in information retrieval. It’s the product of 2 statistics, the term frequency (tf), which is the numeric value representing how many times […]
-
Implementing retries with exponential backoff
Making a call to an external service might fail for a lot of reasons, sometimes it’s due to network failure, sometimes it’s because the external service is too busy, or […]
-
Executing tasks with the Executor Framework in Java
Java offers us many ways to write multi-threading applications, at the early stage, we probably create a new thread for each task by manually extending the Thread class, this seems […]
-
AOC 2022 – Day 5: Supply Stacks
You can read the full description for day 5 here. In summary for part 1, we have been provided a number of stacks, each stack may contain a number of […]
-
WebRTC – Go beyond the APIs Part 1: Signaling and Connecting
We were in the middle of the pandemic. Many of us have to get accustomed to the new norm, stay at home to work and study, etc.…We are separated and […]
-
Avoiding NullPointerException in Java
NullPointerException is one of the most hideous exceptions in Java. It can silently stop the execution of one thread, or it can, fatally terminate the execution of the whole program. […]
-
Introduction to Trie Data Structure
Trie is a data structure that is not so popular but is particularly useful when you have to work a lot with strings. It also has different names like a […]
-
Instrumenting Applications with Prometheus
Monitoring is an integral part of any non-trivial system, by the monitoring process, we then have an insight into the application performance and status, such as RPM, CPU usage, and […]
-
Covariance and Contravariance (Java)
Many programming languages support subtyping, for example, MechanicalKeyboard can be a subtype of Keyboard, and according to the Liskov substitution principle, the MechanicalKeyboard instance should be substitutable everywhere the Keyboard […]