<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Software-Development on Blogarious</title>
    <link>https://blogarious.kairopath.net/categories/software-development/</link>
    <description>Recent content in Software-Development on Blogarious</description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Wed, 29 Apr 2026 08:56:45 +0800</lastBuildDate>
    <atom:link href="https://blogarious.kairopath.net/categories/software-development/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Old project rewrite</title>
      <link>https://blogarious.kairopath.net/posts/20260429-old-project-rewrite/</link>
      <pubDate>Wed, 29 Apr 2026 08:56:45 +0800</pubDate>
      <guid>https://blogarious.kairopath.net/posts/20260429-old-project-rewrite/</guid>
      <description>&lt;p&gt;Recently, I rewrote my 11-year-old project, Linux &lt;a href=&#34;https://github.com/allencch/med&#34;&gt;memory editor&lt;/a&gt;, with AI. Some people reject AI; some embrace it. I treat AI as the tool to do the task, but I know AI output is not 100% work. Nevertheless, AI has better knowledge than I do. But still, AI doesn&amp;rsquo;t have my specific knowledge, experience, and context; that&amp;rsquo;s why AI is just a complementary tool for humans to finish the task.&lt;/p&gt;&#xA;&lt;h2 id=&#34;memory-editor&#34;&gt;Memory editor&lt;/h2&gt;&#xA;&lt;p&gt;When I play games, I don&amp;rsquo;t like to spend time grinding (leveling up, collecting items, etc.). As a result, I use memory editing to make the gameplay faster. I created a Linux memory editor years ago. I started with GTK for the UI widget and used C++. However, GTK is less convenient for C++, so I switched to Qt. That&amp;rsquo;s how far it went.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Hobby project using fly.io</title>
      <link>https://blogarious.kairopath.net/posts/2023-03-29-hobby-project-using-fly-io/</link>
      <pubDate>Wed, 29 Mar 2023 00:00:00 +0000</pubDate>
      <guid>https://blogarious.kairopath.net/posts/2023-03-29-hobby-project-using-fly-io/</guid>
      <description>&lt;p&gt;Just tried &lt;code&gt;fly.io&lt;/code&gt;. It is super nice, because it allows to &amp;ldquo;run small application for free&amp;rdquo;. Since I have a hobby project (bible related), I dockerize it and deploy on fly.io. And it works well. Here is the &lt;a href=&#34;https://biblicious-web.fly.dev/&#34;&gt;link&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;The hobby project above now only supports &lt;a href=&#34;https://en.wikipedia.org/wiki/Studium_Biblicum_Version&#34;&gt;Studium Biblicum&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Software engineer&#39;s soft skills</title>
      <link>https://blogarious.kairopath.net/posts/2022-06-25-software-engineers-soft-skills/</link>
      <pubDate>Sat, 25 Jun 2022 00:00:00 +0000</pubDate>
      <guid>https://blogarious.kairopath.net/posts/2022-06-25-software-engineers-soft-skills/</guid>
      <description>&lt;p&gt;As a software engineer, he/she needs to have the hard skills especially writing source code, debugging. He/she needs to know multiple programming languages (eg C, C++, C#, JavaScript, Python, etc). It will be even better if he/she can write tests, adopt TDD, write clean code, do refactoring, know how to implement various algorithms (search algorithm, sort algorithm, dynamic programming, etc), review code. These are all hard skills.&lt;/p&gt;&#xA;&lt;p&gt;However, in order to perform well in the working environment, software developers are recommended to adopt several soft skills. These skills will help the team to improve the productivity.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Godot Mono and tests</title>
      <link>https://blogarious.kairopath.net/posts/2022-02-04-godot-mono-and-tests/</link>
      <pubDate>Fri, 04 Feb 2022 00:00:00 +0000</pubDate>
      <guid>https://blogarious.kairopath.net/posts/2022-02-04-godot-mono-and-tests/</guid>
      <description>&lt;p&gt;In my previous post, I mentioned about using &lt;a href=&#34;https://blogarious.kairopath.net/posts/2019-11-26-godot-and-c/&#34;&gt;C# for Godot Mono&lt;/a&gt;. However, recently I found that, due to MonoDevelop is inactive, it causes my personal project not able to be built. As a result, I have to change the build tool to &lt;strong&gt;dotnet CLI&lt;/strong&gt;. This can be set through&lt;/p&gt;&#xA;&lt;p&gt;Godot (Mono) &amp;gt; Editor &amp;gt; Editor Settings &amp;gt; Mono &amp;gt; Builds &amp;gt; Build Tool&lt;/p&gt;&#xA;&lt;p&gt;Besides that, I also changed the External Editor from MonoDevelop to &lt;strong&gt;Visual Studio Code&lt;/strong&gt;. Visual Studio Code is nice for the C# project. It has autocompletion and able to find function definition and function references.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Med (Linux Memory Editor) version 3.7</title>
      <link>https://blogarious.kairopath.net/posts/2021-05-31-med-linux-memory-editor-version-3-7/</link>
      <pubDate>Mon, 31 May 2021 00:00:00 +0000</pubDate>
      <guid>https://blogarious.kairopath.net/posts/2021-05-31-med-linux-memory-editor-version-3-7/</guid>
      <description>&lt;p&gt;&lt;a href=&#34;https://github.com/allencch/med/releases/tag/3.7&#34;&gt;Med version 3.7&lt;/a&gt; released.&lt;/p&gt;&#xA;&lt;p&gt;The custom search feature now allows other scan types (int8, int16, &amp;hellip;, int64, float32, float64), including the operators. Now also supports int64 scan type, which can be found in 64-bit games.&lt;/p&gt;&#xA;&lt;p&gt;Besides that, there is new operator &amp;ldquo;&lt;del&gt;&amp;rdquo;, which acts like &amp;ldquo;search within&amp;rdquo;. I use it as a shortcut for search within, especially search the float number we see in the game, 999, which may be 998.999 or 999.1111. By using &amp;ldquo;&lt;/del&gt;&amp;rdquo;, it will translate to search within [998, 1000]. It allows second argument, as &amp;ldquo;± x&amp;rdquo;. Without second argument, it is &amp;ldquo;± 1&amp;rdquo;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Simple music generator</title>
      <link>https://blogarious.kairopath.net/posts/2021-05-24-simple-music-generator/</link>
      <pubDate>Mon, 24 May 2021 00:00:00 +0000</pubDate>
      <guid>https://blogarious.kairopath.net/posts/2021-05-24-simple-music-generator/</guid>
      <description>&lt;p&gt;I just revived my very old hobby project, &lt;a href=&#34;https://github.com/allencch/musgen&#34;&gt;Musgen&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;p&gt;I was interested in artificial creativity, was intended to advanced my study of doctorate on this topic. However, due to lack of the expertise in the local universities, I didn&amp;rsquo;t advance my study on artificial creativity.&lt;/p&gt;&#xA;&lt;p&gt;Imagine that, if I can generate musics, then I can create my own game with any random background musics.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Med (Linux memory editor) version 3.6.1</title>
      <link>https://blogarious.kairopath.net/posts/2020-06-01-med-linux-memory-editor-version-3-6-1/</link>
      <pubDate>Mon, 01 Jun 2020 00:00:00 +0000</pubDate>
      <guid>https://blogarious.kairopath.net/posts/2020-06-01-med-linux-memory-editor-version-3-6-1/</guid>
      <description>&lt;p&gt;I released version &lt;a href=&#34;https://github.com/allencch/med/releases/tag/3.6.1&#34;&gt;3.6.1&lt;/a&gt; for my hobby project, &lt;a href=&#34;https://github.com/allencch/med&#34;&gt;Med (Linux Memory Editor)&lt;/a&gt;. There are several great changes in UI (since 3.5), especially the larger window, due to more components in the UI.&lt;/p&gt;&#xA;&lt;h4 id=&#34;named-scans&#34;&gt;Named scans&lt;/h4&gt;&#xA;&lt;p&gt;Now it supports named scans (the bottom part of the window).&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;images/CGvLdwp.png&#34; alt=&#34;New UI&#34;&gt;&lt;/p&gt;&#xA;&lt;p&gt;I create this named scans feature because sometimes I need to scan for several values of interested. For example, a game character A&amp;rsquo;s experience point and character B&amp;rsquo;s experience point. By using named scans, I can scan these two values without destroying the scan result of each others. This makes my (game cheating) life become much easy.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Brave and Chromium</title>
      <link>https://blogarious.kairopath.net/posts/2020-05-03-brave-and-chromium/</link>
      <pubDate>Sun, 03 May 2020 00:00:00 +0000</pubDate>
      <guid>https://blogarious.kairopath.net/posts/2020-05-03-brave-and-chromium/</guid>
      <description>&lt;p&gt;I have switched my primary web browser to Brave. But also found that Chromium (or any alternative web browser) is necessary. Since I am a software developer, sometimes need to implement ads related feature. Brave will block ads by default. That&amp;rsquo;s why I need an alternative web browser that I can freely to turn off the adblock. Though I can turn off the adblock in Brave, it will affect my browsing experience. As a result, using an alternative web browser for development on ads related feature is necessary.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Godot and C#</title>
      <link>https://blogarious.kairopath.net/posts/2019-11-26-godot-and-c/</link>
      <pubDate>Tue, 26 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://blogarious.kairopath.net/posts/2019-11-26-godot-and-c/</guid>
      <description>&lt;p&gt;In my previous post, I wrote about &lt;a href=&#34;https://blogarious.kairopath.net/posts/2019-08-11-godot-and-hobby-project/&#34;&gt;my hobby project with Godot&lt;/a&gt;.&lt;/p&gt;&#xA;&lt;h4 id=&#34;limitations-of-gdscript&#34;&gt;Limitations of GDScript&lt;/h4&gt;&#xA;&lt;p&gt;But I personally feel that, Godot script, namely GDScript, is not my favourite. Though GDScript is good enough to do anything, it is not what I like. Firstly, it is Python-like language. In my opinion, using indentation as scope is annoying, because I cannot auto-indent using Emacs. Due to my first programming language is C, and heavy use on JavaScript, braces (curly brackets {}) are easier to read.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Best web application framework I like</title>
      <link>https://blogarious.kairopath.net/posts/2019-11-11-best-web-application-framework-i-like/</link>
      <pubDate>Mon, 11 Nov 2019 00:00:00 +0000</pubDate>
      <guid>https://blogarious.kairopath.net/posts/2019-11-11-best-web-application-framework-i-like/</guid>
      <description>&lt;p&gt;So far, in my opinion, Ruby on Rails is the best web application framework that I have used. Compared to others, it is very complete (by installing extra gems) and mature, provides everything that I need.&lt;/p&gt;&#xA;&lt;h3 id=&#34;version-manager&#34;&gt;Version manager&lt;/h3&gt;&#xA;&lt;p&gt;There are two version managers: &lt;code&gt;rvm&lt;/code&gt; and &lt;code&gt;rbenv&lt;/code&gt;. I prefer &lt;code&gt;rvm&lt;/code&gt;. It allows to work on different projects with different Ruby versions. Node has similar manager, &lt;code&gt;nvm&lt;/code&gt;. Python has similar feature, but acts differently, using &lt;code&gt;venv&lt;/code&gt; or &lt;code&gt;virtualenv&lt;/code&gt;. In Python, we need to install the specific version, and create the environment by specifying our Python version. Contrarily, &lt;code&gt;rvm&lt;/code&gt; or &lt;code&gt;nvm&lt;/code&gt; will download and build the corresponding version.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Godot and hobby project</title>
      <link>https://blogarious.kairopath.net/posts/2019-08-10-godot-and-hobby-project/</link>
      <pubDate>Sat, 10 Aug 2019 00:00:00 +0000</pubDate>
      <guid>https://blogarious.kairopath.net/posts/2019-08-10-godot-and-hobby-project/</guid>
      <description>&lt;h2 id=&#34;game-engine&#34;&gt;Game engine&lt;/h2&gt;&#xA;&lt;p&gt;Previously I found a game engine &lt;a href=&#34;https://love2d.org/&#34;&gt;LOVE&lt;/a&gt; (Lua language). Then I planned to learn about it. But then I read about &lt;a href=&#34;https://godotengine.org/&#34;&gt;Godot&lt;/a&gt;, which uses GDScript with similar syntax like Python. So, I choose Godot over LOVE because I have better experience in Python.&lt;/p&gt;&#xA;&lt;p&gt;I planned to work on edutainment project since long time ago. Since I have extra time recently, so I invested little time on my hobby project. Using Godot, I revived my &lt;a href=&#34;https://sourceforge.net/projects/yetanotherbrick/&#34;&gt;old project&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bash history for each project</title>
      <link>https://blogarious.kairopath.net/posts/2018-10-26-bash-history-for-each-project/</link>
      <pubDate>Fri, 26 Oct 2018 00:00:00 +0000</pubDate>
      <guid>https://blogarious.kairopath.net/posts/2018-10-26-bash-history-for-each-project/</guid>
      <description>&lt;p&gt;Previously, I tried to use &lt;code&gt;zsh&lt;/code&gt; when I am working, so that my default &lt;code&gt;bash&lt;/code&gt; history will not be filled with project related commands, especially &lt;code&gt;git&lt;/code&gt; commands. Because some of my bash history are useful like &lt;code&gt;ffmpeg&lt;/code&gt; related commands. So, I tried to distinct project work and non-project work with &lt;code&gt;zsh&lt;/code&gt; and &lt;code&gt;bash&lt;/code&gt;, so that they have different shell histories.&lt;/p&gt;&#xA;&lt;p&gt;However, there are two problems when I use &lt;code&gt;zsh&lt;/code&gt;,&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;All my projects use the same zsh history. The old history may be lost if I have too many commands (depends on &lt;code&gt;HISTSIZE&lt;/code&gt; variable).&lt;/li&gt;&#xA;&lt;li&gt;zsh is slow with &lt;code&gt;git&lt;/code&gt; auto-completion.&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;However, zsh has one thing better than bash, that is, auto-completion navigation. Let&amp;rsquo;s say your directory has various sub-directories, double tab will bring to directory navigation that can be controlled with arrow keys. This is useful for me to navigate to non-alphabetic directories, like the directory with CJK characters.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Firefox batch download extension: DownloadSelected</title>
      <link>https://blogarious.kairopath.net/posts/2018-07-02-firefox-batch-download-extension-downloadselected/</link>
      <pubDate>Mon, 02 Jul 2018 00:00:00 +0000</pubDate>
      <guid>https://blogarious.kairopath.net/posts/2018-07-02-firefox-batch-download-extension-downloadselected/</guid>
      <description>&lt;p&gt;In my previous post, I mentioned about &lt;a href=&#34;https://blogarious.kairopath.net/posts/2017-12-02-firefox-legacy-version-56-0-2/&#34;&gt;DownThemAll on Firefox 56&lt;/a&gt;. Now the latest release of Firefox is version 61, but there is no update of DownThemAll for Firefox Quantum support. Using older unsupported version like Firefox 56 is not a good idea, because there will have no security update. Firefox ESR 52 is slower than Firefox 56 as I have mentioned.&lt;/p&gt;&#xA;&lt;p&gt;Since I have spare time recently, I spent some days to write a Firefox extension, &lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/downloadselected/&#34;&gt;DownloadSelected&lt;/a&gt;, to solve my problem.&lt;/p&gt;</description>
    </item>
    <item>
      <title>C&#43;&#43; Unit Test and Dependency Injection</title>
      <link>https://blogarious.kairopath.net/posts/2017-12-04-c-unit-test-and-dependency-injection/</link>
      <pubDate>Mon, 04 Dec 2017 00:00:00 +0000</pubDate>
      <guid>https://blogarious.kairopath.net/posts/2017-12-04-c-unit-test-and-dependency-injection/</guid>
      <description>&lt;p&gt;TDD (test driven development) is widely adopted in modern development such as web development. Because it allows the developers to test the solution robustly in order to produce a more stable product.&lt;/p&gt;&#xA;&lt;p&gt;Higher level programming languages like JavaScript and Ruby allows the developers to easily mock the functions and data to test the target specification. However, programming language like C++ is not designed for TDD. It will be more complex if you want to mock functions.&lt;/p&gt;</description>
    </item>
    <item>
      <title>How to solve C/C&#43;&#43; memory leaking (in Linux)?</title>
      <link>https://blogarious.kairopath.net/posts/2017-12-04-how-to-solve-c-c-memory-leaking-in-linu/</link>
      <pubDate>Mon, 04 Dec 2017 00:00:00 +0000</pubDate>
      <guid>https://blogarious.kairopath.net/posts/2017-12-04-how-to-solve-c-c-memory-leaking-in-linu/</guid>
      <description>&lt;p&gt;My hobby project &lt;a href=&#34;https://github.com/allencch/med&#34;&gt;Med&lt;/a&gt; is written in C++. A lot of implementations need to use dynamic memory allocation and instantiation. Because complex data is impractical to be passed by value, like the case of JavaScript object and array. Since C++ doesn&amp;rsquo;t have garbage collection, it is possible that the developer doesn&amp;rsquo;t free/delete the dynamically created memory properly.&lt;/p&gt;&#xA;&lt;p&gt;As in my project &lt;strong&gt;Med&lt;/strong&gt;, the program will retrieve the memory from other process. That means, it needs to make a copy of the scanned memory. And this will involve creating dynamic memory (using &lt;code&gt;new&lt;/code&gt; operator). When using the program to filter the memory to get the target result, it needs to get a new copy of memory with the updated values, then compare with the previous copy. The unmatched will need to be discarded (free/delete); the matched will need to replace the old one (also free/delete the old one, because the new one is dynamically allocated).&lt;/p&gt;</description>
    </item>
    <item>
      <title>Complexity and simplicity</title>
      <link>https://blogarious.kairopath.net/posts/2017-09-16-complexity-and-simplicity/</link>
      <pubDate>Sat, 16 Sep 2017 00:00:00 +0000</pubDate>
      <guid>https://blogarious.kairopath.net/posts/2017-09-16-complexity-and-simplicity/</guid>
      <description>&lt;p&gt;When we are developing a solution or a system, we are prone to choose a simple solution. Because simple solution is just better than complex solution. However, most of the time, we choose a simple solution inappropriately, and this causes more troubles gradually when the system is growing.&lt;/p&gt;&#xA;&lt;p&gt;The complexity of a solution, should depend on the complexity of the problem itself, not the other way round. For example, we cannot create an operating system with a single line of programming statement. We also cannot create an operating system with just a single source file. Because an operating system is very complex (managing devices, memory, process, etc), no simple solution can fulfil the requirements.&lt;/p&gt;</description>
    </item>
  </channel>
</rss>
