<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Index on Blog</title><link>https://blog.ubavic.rs/</link><description>Recent content in Index on Blog</description><generator>Hugo</generator><language>en</language><lastBuildDate>Sun, 01 Mar 2026 16:00:11 +0100</lastBuildDate><atom:link href="https://blog.ubavic.rs/index.xml" rel="self" type="application/rss+xml"/><item><title>Administracija servera uz ličnu kartu</title><link>https://blog.ubavic.rs/18/</link><pubDate>Sun, 01 Mar 2026 16:00:11 +0100</pubDate><guid>https://blog.ubavic.rs/18/</guid><description>&lt;p&gt;Tokom prethodnih godinu dana, radio sam na kreiranju &lt;a href="https://github.com/ubavic/srb-id-pkcs11"&gt;PKCS#11 modula&lt;/a&gt; otvorenog koda za srpske lične karte. Motivacija za kreiranje modula bila je pre svega omogućavanje Linux i macOS korisnicima da se uloguju na državne portale poput eUprave ili ePoreza. Međutim, kako je PKCS#11 standard veoma rasprostranjen, neki načini upotrebe otvorili su se o kojima i nisam razmišljao kada sam počeo da radim na modulu. Pre svega, to je potpisivanje (PDF, XML,&amp;hellip;) dokumenata, za koje se ispostavilo da radi bez bilo kakvih problema.&lt;/p&gt;</description></item><item><title>Reimplementing PKCS#11 module</title><link>https://blog.ubavic.rs/17/</link><pubDate>Wed, 01 Oct 2025 14:27:16 +0200</pubDate><guid>https://blog.ubavic.rs/17/</guid><description>&lt;p&gt;It has been more than two years since I released &lt;a href="https://github.com/ubavic/bas-celik/"&gt;Baš Čelik&lt;/a&gt;, software for reading serbian smart-card documents. After the past two years I implemented everything I originally planned (and more), but one feature was always missing and users kept asking for it: the ability to use the personal certificate from the ID card to sign data. A driver for such functionality exists for Windows, but not for Linux or macOS.&lt;/p&gt;</description></item><item><title>CV Tips from Someone Who Actually Reads Them</title><link>https://blog.ubavic.rs/16/</link><pubDate>Mon, 09 Jun 2025 17:40:30 +0100</pubDate><guid>https://blog.ubavic.rs/16/</guid><description>&lt;p&gt;Our team was recently looking for a new developer, and I was tasked with reviewing CVs and conducting technical interviews. I’ve done technical interviews before, but this time I first had to go through around 100 CVs and pick the most promising ones.&lt;/p&gt;&#10;&lt;p&gt;As we are working with fairly unknown technology (a domain-specific language called &lt;a href="https://en.wikipedia.org/wiki/C/AL"&gt;AL&lt;/a&gt;), we were open to candidates of all levels. In candidates, we look for general backend knowledge and motivation to work on ERP software. Since our search was broad, we got a wide selection of CVs from people with different experiences. However, I noticed &amp;ldquo;mistakes&amp;rdquo; that people make no matter if they have 10 years of experience or no experience (most mistakes come from candidates with no experience).&lt;/p&gt;</description></item><item><title>Windows sucks</title><link>https://blog.ubavic.rs/15/</link><pubDate>Sat, 08 Feb 2025 17:40:30 +0100</pubDate><guid>https://blog.ubavic.rs/15/</guid><description>&lt;p&gt;Microsoft Windows operating system sucks. Unfortunately, I am forced to use it at work. It sucks as a day-to-day operating system, and it sucks as a development environment. Every day, it sucks more and more.&lt;/p&gt;&#10;&lt;p&gt;It takes me &lt;em&gt;at least&lt;/em&gt; twice as long to compile the same Go code on Windows as on Linux. My Github actions run &lt;a href="https://github.com/ubavic/bas-celik/actions/runs/12221236302"&gt;8 times slower on Windows runners than Linux runners&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;It takes 30 seconds for Outlook to open (my 6 year iPhone can open the Mail application in second or less). Excel startup is equally slow.&lt;/p&gt;</description></item><item><title>The Second Dumbest Way to Solve a Maze</title><link>https://blog.ubavic.rs/14/</link><pubDate>Sun, 12 Jan 2025 11:46:32 +0100</pubDate><guid>https://blog.ubavic.rs/14/</guid><description>&lt;p&gt;You’re probably familiar with &lt;a href="https://www.youtube.com/watch?v=BvwgdrC8vlE"&gt;The Dumbest Way To Solve A Maze&lt;/a&gt;: a method involving the simulation of gas diffusion through the maze&amp;rsquo;s hallways. I’d like to introduce what is likely the second dumbest way to solve a maze. While this method isn’t inherently dumb (in fact, it involves math that is far from &amp;lsquo;dumb&amp;rsquo;), it’s so impractical for actual use that it’s simply &amp;lsquo;dumb&amp;rsquo; to apply it to maze-solving.&lt;/p&gt;&#10;&lt;h2 id="the-riemann-mapping-theorem"&gt;The Riemann mapping theorem&lt;/h2&gt;&#10;&lt;p&gt;&lt;a href="https://en.wikipedia.org/wiki/Riemann_mapping_theorem"&gt;The Riemann mapping theorem&lt;/a&gt; states that for a non-empty, simply connected open subset $U \subset \mathbb {C}$ there exists a biholomorphic function $f\colon U \to \mathbb D$, where $\mathbb D$ is the open unit disk. We call this function &lt;em&gt;Riemann mapping&lt;/em&gt; &lt;sup id="fnref:1"&gt;&lt;a href="#fn:1" class="footnote-ref" role="doc-noteref"&gt;1&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;</description></item><item><title>Some Tips on Building Business Central Reports</title><link>https://blog.ubavic.rs/13/</link><pubDate>Sun, 05 Jan 2025 11:40:51 +0100</pubDate><guid>https://blog.ubavic.rs/13/</guid><description>&lt;p&gt;I’ve noticed that many of my colleagues don’t enjoy creating Business Central reports, which is a shame because building a good, non-trivial report can be very interesting and requires more skill the some would admit.&lt;/p&gt;&#10;&lt;p&gt;Here, I’ve listed a few things I’ve noticed others often overlook when creating reports (whether out of a lack of knowledge or interest). Some tips are straightforward, some are opinionated, but most are not sufficiently explained in books or blogs.&lt;/p&gt;</description></item><item><title>Pen plotter</title><link>https://blog.ubavic.rs/12/</link><pubDate>Mon, 16 Dec 2024 21:49:43 +0100</pubDate><guid>https://blog.ubavic.rs/12/</guid><description>&lt;p&gt;The idea of having a pen plotter has been living in my head for some time, and this month I finally decided to bite the bullet. I had initially planned to build a brand-new plotter from custom parts, but an opportunity arose, and I purchased a heavily modified Ender 3 V2 at a good price.&lt;/p&gt;&#10;&lt;p&gt;The Ender has a working area of only 220mm x 220mm, which is insufficient for A4 paper. Nevertheless, it’s enough for my current plotting needs. I &lt;strong&gt;do&lt;/strong&gt; plan to disassemble the Ender and assemble a completely new, bigger, architecture at some point.&lt;/p&gt;</description></item><item><title>Building Galaksija, 40 years later</title><link>https://blog.ubavic.rs/11/</link><pubDate>Fri, 16 Aug 2024 13:09:58 +0200</pubDate><guid>https://blog.ubavic.rs/11/</guid><description>&lt;p&gt;&lt;em&gt;Galaksija&lt;/em&gt; (Galaxy) is a single-board Z80 computer, constructed in the early 1980s in Yugoslavia by Voja Antonić. It was publicly announced as a DIY project in the magazine &lt;em&gt;Računari u vašoj kući&lt;/em&gt; (Computers in Your Home) in January 1984, complete with schematics and building instructions. There are countless blog posts, forum threads, magazine articles, and videos about this computer and its influence on the computer scene in socialist Yugoslavia (there is even a nice &lt;a href="https://www.youtube.com/watch?v=RxzgW-WP13I"&gt;documentary movie&lt;/a&gt; released this year).&lt;/p&gt;</description></item><item><title>Writing GUI apps doesn't have to be painful</title><link>https://blog.ubavic.rs/10/</link><pubDate>Sun, 07 Jul 2024 13:09:58 +0200</pubDate><guid>https://blog.ubavic.rs/10/</guid><description>&lt;p&gt;Recently, I came across the article &lt;a href="https://tulach.cc/writing-gui-apps-for-windows-is-painful/"&gt;&lt;em&gt;Writing GUI apps for Windows is painful&lt;/em&gt;&lt;/a&gt; which resonated with me. Just over a year ago, I was in a similar position as the author. I was just starting a new project and was looking for a GUI library with the following requirements:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;Should support Linux&lt;/li&gt;&#10;&lt;li&gt;Should be easy to set up for development&lt;/li&gt;&#10;&lt;li&gt;The compiled binary should be small and easy for the end user to use (minimal dependencies)&lt;/li&gt;&#10;&lt;/ul&gt;&#10;&lt;p&gt;The project I was starting was a &lt;a href="https://github.com/ubavic/bas-celik"&gt;reader for smart card documents&lt;/a&gt; (like personal identification cards). As the project was new, and the GUI would be an important part of it, I decided to remain open to solutions in different languages. Therefore, I was looking for a language and UI library combination that would give me an environment in which I could easily develop the new application (note that my new application doesn&amp;rsquo;t have big requirements from the UI library: labels, images, message boxes, and buttons are enough). Also, I wanted an environment that would be easy for others to set up. I didn&amp;rsquo;t want to lose contributors just because my library required dozens of obscure dev packages, black magic, and hours of configuration and compilation (cough, Qt, cough). These were the alternatives I explored at the time:&lt;/p&gt;</description></item><item><title>Porting the GCLC to the web</title><link>https://blog.ubavic.rs/9/</link><pubDate>Fri, 29 Mar 2024 18:22:08 +0100</pubDate><guid>https://blog.ubavic.rs/9/</guid><description>&lt;p&gt;This week, Professor &lt;a href="http://poincare.matf.bg.ac.rs/~predrag.janicic/"&gt;Predrag Janičić&lt;/a&gt; and I released the &lt;a href="https://poincare.matf.bg.ac.rs/~predrag.janicic/gclc/gclc-web/"&gt;web version&lt;/a&gt; of &lt;a href="https://poincare.matf.bg.ac.rs/~predrag.janicic/gclc/"&gt;GCLC&lt;/a&gt;.&lt;/p&gt;&#10;&lt;p&gt;If you are not a mathematician, chances are that you never heard of GCLC. GCLC is a programming language/compiler for mathematical illustrations. The first version was created in 1995 by Professor Janičić, and since then the program has been constantly expanded with new features. Comparing it to some more popular tools, it sits somewhere between &lt;a href="https://github.com/pgf-tikz/pgf"&gt;TikZ&lt;/a&gt; and &lt;a href="https://www.geogebra.org/?lang=en"&gt;Geogebra&lt;/a&gt;: users create illustrations by programming in custom Turing-complete language (just like in TikZ), but users also can move free points or play animations (just like in Geogebra). In its long tradition, GCLC has been used in countless mathematical publications.&lt;/p&gt;</description></item><item><title>Don't worry, your Parser is a functor</title><link>https://blog.ubavic.rs/8/</link><pubDate>Sat, 30 Sep 2023 22:25:48 +0200</pubDate><guid>https://blog.ubavic.rs/8/</guid><description>&lt;p&gt;If you start learning about applicative parsers, at the very start you&amp;rsquo;ll encounter the following abstract type (or something similar):&lt;/p&gt;&#10;&lt;pre&gt;&lt;code class="language-haskell"&gt;newtype Parser a = P (String -&amp;gt; Maybe (String, a))&#10;&lt;/code&gt;&lt;/pre&gt;&#10;&lt;p&gt;This type represents a function that takes an input string and &lt;em&gt;maybe&lt;/em&gt; produces a pair containing the parsed token with the rest of the string.&lt;/p&gt;&#10;&lt;p&gt;Once you&amp;rsquo;ve grasped the concept of the &lt;code&gt;Parser&lt;/code&gt; type, you can explore how to make it a functor. Defining the &lt;code&gt;Functor&lt;/code&gt; instance for &lt;code&gt;Parser&lt;/code&gt; is a straightforward task:&lt;/p&gt;</description></item><item><title>Reading Serbian ID cards with Golang</title><link>https://blog.ubavic.rs/7/</link><pubDate>Fri, 04 Aug 2023 21:09:02 +0200</pubDate><guid>https://blog.ubavic.rs/7/</guid><description>&lt;p&gt;I am a little bit late with this post, but I feel it is good to publish it nevertheless.&lt;/p&gt;&#10;&lt;p&gt;Three weeks ago, I released the &lt;a href="https://github.com/ubavic/bas-celik"&gt;Baš Čelik&lt;/a&gt;, a program for reading ID cards issued by the government of Serbia. This program can read data from an ID card, and save it as a PDF which looks the same as a PDF produced by the official application. And believe me, in Serbia for some reason you need this PDF (or print of it) quite often.&lt;/p&gt;</description></item><item><title>Lambda calculus and differential geometry</title><link>https://blog.ubavic.rs/6/</link><pubDate>Mon, 24 Jul 2023 22:10:30 +0200</pubDate><guid>https://blog.ubavic.rs/6/</guid><description>&lt;p&gt;You can perfectly demonstrate the essence of &lt;a href="https://en.wikipedia.org/wiki/Currying"&gt;currying&lt;/a&gt; in almost any modern language, but there are some phenomena that are only revealed to programmers who program in ML/Lisp languages. I want to say something about that.&lt;/p&gt;&#10;&lt;p&gt;Take for example &lt;code&gt;map&lt;/code&gt; function in Haskell. Its type is &lt;code&gt;(a - &amp;gt; b) -&amp;gt; ([a] -&amp;gt; [b])&lt;/code&gt; (often written as &lt;code&gt;(a - &amp;gt; b) -&amp;gt; [a] -&amp;gt; [b]&lt;/code&gt;). This type can be interpreted in two different ways:&lt;/p&gt;</description></item><item><title>Proggy-buggy 2023</title><link>https://blog.ubavic.rs/5/</link><pubDate>Thu, 25 May 2023 23:36:54 +0200</pubDate><guid>https://blog.ubavic.rs/5/</guid><description>&lt;p&gt;Today I participated in the online programming contest &lt;a href="https://proggy-buggy.com"&gt;Proggy-buggy 2023&lt;/a&gt;, organized by Ukrainian company &lt;a href="https://www.dataart.com/"&gt;DataArt&lt;/a&gt;. This is my first programming contest, so I am excited to share impressions.&lt;/p&gt;&#10;&lt;p&gt;We were presented with 13 programming problems and had 42 minutes to solve them. Problems were indeed very simple: for example, the first one could be solved by multiplying two numbers given in &lt;code&gt;stdin&lt;/code&gt;, and the second one was a classical &lt;a href="https://en.wikipedia.org/wiki/Look-and-say_sequence"&gt;&lt;em&gt;look-and-say&lt;/em&gt;&lt;/a&gt; problem (given one iteration, deduce the next iteration). At least two of the problems were trivial: the first had a &lt;em&gt;huge&lt;/em&gt; introduction but required program to return constant, and the second required program to return any triple $(a,b,c)$ such that equality $a^n+b^n=c^n$ holds for some $n&amp;gt;2$.&lt;/p&gt;</description></item><item><title>Restoring addresses with Haskell</title><link>https://blog.ubavic.rs/4/</link><pubDate>Mon, 01 May 2023 09:42:26 +0200</pubDate><guid>https://blog.ubavic.rs/4/</guid><description>&lt;p&gt;Leetcode has a very nice problem called &lt;a href="https://leetcode.com/problems/restore-ip-addresses/description/"&gt;&lt;em&gt;Restore IP Addresses&lt;/em&gt;&lt;/a&gt;. The task is that for given string &lt;code&gt;s&lt;/code&gt; containing only digits, we find all possible valid IPv4 addresses that can be formed by inserting dots into &lt;code&gt;s&lt;/code&gt;. For example, from &lt;code&gt;&amp;quot;25525511135&amp;quot;&lt;/code&gt; we can form only addresses &lt;code&gt;255.255.11.135&lt;/code&gt; and &lt;code&gt;255.255.111.35&lt;/code&gt;.&lt;/p&gt;&#10;&lt;h2 id="solution-in-16-lines"&gt;Solution in 16 lines&lt;/h2&gt;&#10;&lt;p&gt;First, we will construct three functions of type &lt;code&gt;String -&amp;gt; [(Int, String)]&lt;/code&gt;. These functions from the start of a given string try to parse a single-digit, a two-digit, or a three-digit number. If parsing is successful, a singleton list is returned. The only element of the list is a pair of the parsed number and the rest of the string. If parsing fails, an empty list is returned.&lt;/p&gt;</description></item><item><title>Chaos game</title><link>https://blog.ubavic.rs/3/</link><pubDate>Sun, 26 Mar 2023 00:30:20 +0100</pubDate><guid>https://blog.ubavic.rs/3/</guid><description>&lt;p&gt;Today I released the &lt;a href="https://ubavic.rs/chaos_game/"&gt;interactive demonstration&lt;/a&gt; of iterated function system know as &lt;em&gt;Chaos game&lt;/em&gt;. You can read more about Chaos game on the &lt;a href="https://en.wikipedia.org/wiki/Chaos_game"&gt;Wikipedia&lt;/a&gt;, but long story short, we fix a plane polygon $\Pi = \{V_1, \dots V_m\}$ and choose an arbitrary plane point $P_0$. Then we iteratively generate orbit $\mathcal O = \{P_0, P_1, P_2, &amp;hellip;\}$ by using formula&#10;$$ \vec P_{i+1} = \frac12\left(\vec P_i+\vec V\right),$$&#10;where $V$ is at each iteration chosen randomly from $\{V_1, \dots V_m\}$.&lt;/p&gt;</description></item><item><title>Setting up the minimal blog</title><link>https://blog.ubavic.rs/1/</link><pubDate>Thu, 16 Mar 2023 23:23:13 +0100</pubDate><guid>https://blog.ubavic.rs/1/</guid><description>&lt;p&gt;I found countless nicely designed blogs that have a single post, a post about setting up a blog (there is a popular &lt;a href="https://rakhim.org/honestly-undefined/19/"&gt;meme&lt;/a&gt; about this). Some of these blogs had been in such state for years, suggesting that the author often didn&amp;rsquo;t find inspiration past the first post. I am not sure why is that, but yesterday I found out why they even publish that first post.&lt;/p&gt;&#10;&lt;p&gt;You see, setting up your blog with a static generator is a very rewarding process. And not because you finally see your minimal CSS being rendered. And definitely not because you are proud of your words. It is because you finally managed to get your static generator working, after spending hours reading materials on the web (most of which are outdated or generally represent a bad practice). This also explains why are so many static generators out there. Often writing a static generator seems easier than taming an existing one.&lt;/p&gt;</description></item></channel></rss>