<?xml version="1.0" encoding="utf-8"?>
<!-- generator="FeedCreator 1.7.2-ppt DokuWiki" -->
<?xml-stylesheet href="https://dmitryfrank.com/lib/exe/css.php?s=feed" type="text/css"?>
<rdf:RDF
    xmlns="http://purl.org/rss/1.0/"
    xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#"
    xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
    xmlns:dc="http://purl.org/dc/elements/1.1/">
    <channel rdf:about="/var/www/dmitryfrank.com/lib/plugins/feed/feed.php">
        <title>Blog Blog · Dmitry Frank</title>
        <description></description>
        <link>https://dmitryfrank.com/</link>
        <image rdf:resource="https://dmitryfrank.com/lib/images/favicon.ico" />
       <dc:date>2025-10-26T16:02:31+00:00</dc:date>
        <items>
            <rdf:Seq>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2025/0512_implementing_a_radically_simple_alternative_to_graylog#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2023/0611_rust_module_system_encourages_poor_practices_comparing_to_go#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2023/0527_connect_four_3d#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2022/1218_treating_email_more_like_a_password_manager#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2022/0309_bulgaria_freelance_taxes_detailed_breakdown#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2021/0930_mocking_time_and_testing_event_loops_in_go#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2018/0815_reliable_secure_and_universal_backup_for_u2f_token#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2018/0302_why_not_improve_error_handling_in_our_go_projects#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2018/0302_here_s_why_i_love_go#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2017/0228_mongoose_embedded_networking_library_on_nrf51_and_nrf52#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2016/1211_i_am_tired_of_makefiles#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2016/0801_docker_printable_quick_reference_card#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2016/0718_let_s_run_lisp_on_a_microcontroller#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2016/0127_heap_on_embedded_devices_analysis_and_improvement#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2015/1009_why_we_still_don_t_have_any_standard_interface_between_a_text_editor_and_an_ide#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2015/1007_auto-program_with_pickit3_mdb_fails_but_i_got_it_working#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2015/1005_unit-testing_embedded_c_applications_with_ceedling#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2015/0921_how_i_ended_up_writing_new_real-time_kernel#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2015/0917_testing_socket.io_with_authentication_by_passport.socketio#"/>
                <rdf:li rdf:resource="https://dmitryfrank.com/blog/2015/0909_how_do_javascript_closures_work_under_the_hood#"/>
            </rdf:Seq>
        </items>
    </channel>
    <image rdf:about="https://dmitryfrank.com/lib/images/favicon.ico">
        <title>Dmitry Frank</title>
        <link>https://dmitryfrank.com/</link>
        <url>https://dmitryfrank.com/lib/images/favicon.ico</url>
    </image>
    <item rdf:about="https://dmitryfrank.com/blog/2025/0512_implementing_a_radically_simple_alternative_to_graylog#">
        <dc:format>text/html</dc:format>
        <dc:date>2025-05-12T19:19:03+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>Implementing a Radically Simple Alternative to Graylog</title>
        <link>https://dmitryfrank.com/blog/2025/0512_implementing_a_radically_simple_alternative_to_graylog#</link>
        <description>Implementing a Radically Simple Alternative to Graylog

Back in 2022, my team and I were working on a service which was printing a fairly sizeable amount of logs from a distributed cluster of 20+ hosts: about 2-3 million log messages per hour in total. We were using Graylog, and querying those logs for an hour was taking no more than 1-3 seconds, so it was pretty quick.</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2023/0611_rust_module_system_encourages_poor_practices_comparing_to_go#">
        <dc:format>text/html</dc:format>
        <dc:date>2023-06-11T19:31:57+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>Rust Module System Encourages Poor Practices (Comparing to Go)</title>
        <link>https://dmitryfrank.com/blog/2023/0611_rust_module_system_encourages_poor_practices_comparing_to_go#</link>
        <description>Rust Module System Encourages Poor Practices (Comparing to Go)

Note that I'm not gonna be saying that it's confusing, hard to understand etc. Those things would be subjective, and even if I agree that it's not too intuitive, it's still totally learnable and not a big deal. In this article I'm gonna be talking about matters which are more objective.</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2023/0527_connect_four_3d#">
        <dc:format>text/html</dc:format>
        <dc:date>2023-05-27T14:07:23+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>Connect Four 3D</title>
        <link>https://dmitryfrank.com/blog/2023/0527_connect_four_3d#</link>
        <description>Connect Four 3D

There is a board game called “Connect Four 3D”, in real life it looks like this:



And as part of my efforts to learn Rust in 2023, I implemented a virtual version of it.</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2022/1218_treating_email_more_like_a_password_manager#">
        <dc:format>text/html</dc:format>
        <dc:date>2022-12-18T16:49:49+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>Treating Email More Like a Password Manager</title>
        <link>https://dmitryfrank.com/blog/2022/1218_treating_email_more_like_a_password_manager#</link>
        <description>Treating Email More Like a Password Manager

There is a natural tendency that communication tools, which never meant to be security devices, end up being used heavily for security purposes. This happened to both emails and mobile phones. You know, SMS to a mobile phone is still sometimes the only option for a second factor authentication, despite a lot of evidence that in real life it 's a very bad idea due to SIM swap attacks (check e.g.</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2022/0309_bulgaria_freelance_taxes_detailed_breakdown#">
        <dc:format>text/html</dc:format>
        <dc:date>2022-03-09T09:22:27+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>Bulgaria Freelance Taxes Detailed Breakdown</title>
        <link>https://dmitryfrank.com/blog/2022/0309_bulgaria_freelance_taxes_detailed_breakdown#</link>
        <description>Bulgaria Freelance Taxes Detailed Breakdown

In the past few years I've been living in Bulgaria, working remotely as a software engineer (technically, “consultant”) for foreign companies (both European and US), and by now I have a pretty good idea about all the taxes and other business-related expenses one has to pay in this setup. Since it's ridiculously hard to find a good and detailed breakdown like that (most often you'll find that income tax is 10%, and dividend tax is 5%, which is accurate…</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2021/0930_mocking_time_and_testing_event_loops_in_go#">
        <dc:format>text/html</dc:format>
        <dc:date>2021-09-30T09:15:42+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>Mocking time and testing event loops in Go</title>
        <link>https://dmitryfrank.com/blog/2021/0930_mocking_time_and_testing_event_loops_in_go#</link>
        <description>Mocking time and testing event loops in Go

Initially I wanted to write articles on those two topics separately (mocking time and testing event loops), but during the process I realized that the things I want to talk about are too interrelated: when I need to mock time, it's usually to test some event loop with it, and when I test event loops, typically mocked time is also involved in that.</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2018/0815_reliable_secure_and_universal_backup_for_u2f_token#">
        <dc:format>text/html</dc:format>
        <dc:date>2018-08-15T09:54:55+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>Reliable, Secure and Universal Backup for U2F Token</title>
        <link>https://dmitryfrank.com/blog/2018/0815_reliable_secure_and_universal_backup_for_u2f_token#</link>
        <description>Reliable, Secure and Universal Backup for U2F Token

I really love the security level U2F provides, but together with security, we have to think carefully about the backup and recovery plan. It would totally suck to get locked out of my accounts if something happens with my U2F token. At the same time, it doesn't make sense to have a backup which compromises U2F security.</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2018/0302_why_not_improve_error_handling_in_our_go_projects#">
        <dc:format>text/html</dc:format>
        <dc:date>2018-03-02T10:14:33+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>Why not improve error handling in our Go projects?</title>
        <link>https://dmitryfrank.com/blog/2018/0302_why_not_improve_error_handling_in_our_go_projects#</link>
        <description>Why not improve error handling in our Go projects?

As I was saying already, I love Go, I really do. And in particular I like the minimalistic approach to error handling: no exceptions, each caller should check the error explicitly and deal with it as it wants.</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2018/0302_here_s_why_i_love_go#">
        <dc:format>text/html</dc:format>
        <dc:date>2018-03-02T10:12:20+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>Here's why I love Go</title>
        <link>https://dmitryfrank.com/blog/2018/0302_here_s_why_i_love_go#</link>
        <description>Here's why I love Go

Many years ago, I've been waiting for a language like Go. Back then, I was primarily working with C (for microcontrollers), and C++/Java/Python/etc (for bigger machines). These are great tools, but still I was longing for compiled, statically typed, memory-safe (and garbage collected) language, which compiles for the target platform machine code, and has a big enough community.</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2017/0228_mongoose_embedded_networking_library_on_nrf51_and_nrf52#">
        <dc:format>text/html</dc:format>
        <dc:date>2017-02-28T00:13:04+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>Mongoose Embedded Networking Library on nRF51 and nRF52 (Bluetooth)</title>
        <link>https://dmitryfrank.com/blog/2017/0228_mongoose_embedded_networking_library_on_nrf51_and_nrf52#</link>
        <description>Mongoose Embedded Networking Library on nRF51 and nRF52 (Bluetooth)

The article is hosted at hackster.io: &amp;lt;https://www.hackster.io/dfrank/mongoose-embedded-networking-library-on-nrf51-and-nrf52-547b15&amp;gt;.

programming embedded bluetooth</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2016/1211_i_am_tired_of_makefiles#">
        <dc:format>text/html</dc:format>
        <dc:date>2016-12-11T17:33:03+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>I'm Tired of Makefiles</title>
        <link>https://dmitryfrank.com/blog/2016/1211_i_am_tired_of_makefiles#</link>
        <description>I'm Tired of Makefiles

At Cesanta, we use Makefiles to build our firmwares, libraries, and perform other things. But the more I use make, the less I like it. I want my incremental builds to be reliable, and I want to be able to reuse my Makefiles as needed.</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2016/0801_docker_printable_quick_reference_card#">
        <dc:format>text/html</dc:format>
        <dc:date>2016-08-01T12:59:48+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>Docker Printable Quick Reference Card</title>
        <link>https://dmitryfrank.com/blog/2016/0801_docker_printable_quick_reference_card#</link>
        <description>Docker Printable Quick Reference Card

I use Docker, but not often enough to memorize even basic Dockerfile instructions and CLI commands. After all I got so annoyed by being unable to quickly sketch some Dockerfile or to do something with the existing containers occasionally, so I decided to write a concise cheat sheet which I can print once and constantly keep on my desktop:</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2016/0718_let_s_run_lisp_on_a_microcontroller#">
        <dc:format>text/html</dc:format>
        <dc:date>2016-07-18T17:11:15+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>Let's Run Lisp on a Microcontroller</title>
        <link>https://dmitryfrank.com/blog/2016/0718_let_s_run_lisp_on_a_microcontroller#</link>
        <description>Let's Run Lisp on a Microcontroller

embedded c lisp programming</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2016/0127_heap_on_embedded_devices_analysis_and_improvement#">
        <dc:format>text/html</dc:format>
        <dc:date>2016-01-26T21:16:53+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>Heap on Embedded Devices Analysis and Improvement</title>
        <link>https://dmitryfrank.com/blog/2016/0127_heap_on_embedded_devices_analysis_and_improvement#</link>
        <description>Heap on Embedded Devices Analysis and Improvement

The heap on a device is usually a kind of black box: heap API rarely provides anything more than just returning free space size, and quite often it doesn't provide even that (since C standard doesn't oblige it to). We have little idea of the fragmentation (in particular, we're interested in longest contiguous free chunk of memory) and the behaviour of the allocator in general. But in the resource-limited circumstances we're highly concerned abou…</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2015/1009_why_we_still_don_t_have_any_standard_interface_between_a_text_editor_and_an_ide#">
        <dc:format>text/html</dc:format>
        <dc:date>2015-10-09T17:56:15+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>Standard interface between a text editor and an IDE?</title>
        <link>https://dmitryfrank.com/blog/2015/1009_why_we_still_don_t_have_any_standard_interface_between_a_text_editor_and_an_ide#</link>
        <description>Standard interface between a text editor and an IDE?

You may probably consider this a rant post.

UPD 2023 actually, the rant is now irrelevant. These days, we have LSP (Language Server Protocol), which is exactly what I was talking about back in 2015. Still, I'll leave the rest of the text below unchanged.</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2015/1007_auto-program_with_pickit3_mdb_fails_but_i_got_it_working#">
        <dc:format>text/html</dc:format>
        <dc:date>2015-10-07T00:05:19+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>Microchip PICkit3, Don't Halloo Till You Are Out of the Wood</title>
        <link>https://dmitryfrank.com/blog/2015/1007_auto-program_with_pickit3_mdb_fails_but_i_got_it_working#</link>
        <description>Microchip PICkit3, Don't Halloo Till You Are Out of the Wood

Microchip has a tool called MDB: Microchip command-line debugger. It's a very nice idea: we can automatize things; at least, we can program a hex from a script. Implementation, however, is far from perfect, but, well, it works somehow.</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2015/1005_unit-testing_embedded_c_applications_with_ceedling#">
        <dc:format>text/html</dc:format>
        <dc:date>2015-10-05T15:12:39+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>Unit-testing (embedded) C applications with Ceedling</title>
        <link>https://dmitryfrank.com/blog/2015/1005_unit-testing_embedded_c_applications_with_ceedling#</link>
        <description>Unit-testing (embedded) C applications with Ceedling

Just like a lot of other embedded software engineers, I used to ship my embedded applications to production without testing them properly. Only some manual tests were done. I was under the impression that there's no real way to test them: you know, embedded applications run in a custom hardware and interact with this specific hardware heavily, which makes them not so easy to test automatically.</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2015/0921_how_i_ended_up_writing_new_real-time_kernel#">
        <dc:format>text/html</dc:format>
        <dc:date>2015-09-20T22:02:17+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>How I ended up writing new real-time kernel</title>
        <link>https://dmitryfrank.com/blog/2015/0921_how_i_ended_up_writing_new_real-time_kernel#</link>
        <description>How I ended up writing new real-time kernel

I work with embedded stuff for several years: our company develops and manufactures car trip computers, battery chargers, and other car-related electronic devices. 



The processors used for our designs are primarily 16- and 32-bit Microchip MCUs, with RAM from 8 to 32 KB, and ROM from 128 to 512 KB, without any kind of MMU. Sometimes, there are even more modest 8-bit chips.</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2015/0917_testing_socket.io_with_authentication_by_passport.socketio#">
        <dc:format>text/html</dc:format>
        <dc:date>2015-09-17T01:29:07+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>Testing Socket.io with authentication by Passport.socketio</title>
        <link>https://dmitryfrank.com/blog/2015/0917_testing_socket.io_with_authentication_by_passport.socketio#</link>
        <description>Testing Socket.io with authentication by Passport.socketio

The usage of real-time socket connection with authentication data seems quite regular thing to me. And, personally, I find it very strange that this topic receives so little interest.

programming javascript web socketio</description>
    </item>
    <item rdf:about="https://dmitryfrank.com/blog/2015/0909_how_do_javascript_closures_work_under_the_hood#">
        <dc:format>text/html</dc:format>
        <dc:date>2015-09-09T07:45:52+00:00</dc:date>
        <dc:creator>Dmitry Frank</dc:creator>
        <title>How do JavaScript closures work under the hood</title>
        <link>https://dmitryfrank.com/blog/2015/0909_how_do_javascript_closures_work_under_the_hood#</link>
        <description>How do JavaScript closures work under the hood

From my experience, a lot of JavaScript programmers, mine included, learned how to use closures without having clear understanding of how closures actually work, and what exactly is going on behind the scenes when we use them. What the closure actually is, to begin with? When it is created and deleted? What the implementation should look like?</description>
    </item>
</rdf:RDF>
