<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
<channel>
<author><name>Sebastian Ardelean</name></author>
<title>Bending bits...</title>
<description>Blog posts feed</description>
<generator>Emacs webfeeder.el</generator>
<link>https://sebastianardelean.codeberg.page</link>
<atom:link href="https://sebastianardelean.codeberg.page/rss/feed.xml" rel="self" type="application/rss+xml"/>
<lastBuildDate>Wed, 19 Nov 2025 12:07:37 +0200</lastBuildDate>
<item>
  <title>Safe call Guile functions from C++</title>
  <description><![CDATA[<div id="content"> <p>
While working on a C++ project in which I want to embedd Guile I needed to implement way to safe load and call Guile functions. Guile has a great and easy to use (in my opinion) C API and is easy to embedd
it applications. Therefore, a perfect candidate for a scripting language to embedd in my C++ project. Therefore, I needed to implement a layer that loads Guile scripts and call functions, as safe as possible.
</p>

 <p>
The project structure is as follows:
</p>
 <pre>├── CMakeLists.txt
├── scripts
│   └── test.scm
└── src
    ├── CMakeLists.txt
    ├── guile_loader.hpp
    └── main.cpp</pre>

 <p>
where in  <code>scripts/test.scm</code> are the scripts to be loaded and executed and  <code>src/guile_loader.hpp</code> is the header-only layer that loads Guile. I won’t go into details about the code, it’s use is pretty straightforward.
The  <code>CMakeLists.txt</code> files may be a little cumbersome, but I extracted them from some templates that I use.
</p>
 <h2> <a id="root-cmake" class="anchor" href="#root-cmake">¶</a>Root CMake</h2> <div class="outline-text-2" id="text-org749c7a0">
 <pre># Minimum CMake version required
cmake_minimum_required(VERSION 3.20)

# Project name and version
project(cpp_guile VERSION 1.0)
set(PROJECT_NAME cpp_guile)

# Set the C standard to C99 (or C11 if preferred)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_STANDARD_REQUIRED True)

set(CMAKE_CXX_STANDARD 23)
set(CMAKE_CXX_STANDARD_REQUIRED ON)
set(CMAKE_CXX_EXTENSIONS OFF)

add_library(project_options INTERFACE)

option(ENABLE_DEBUG "Enable Debug build" ON)

if (CMAKE_CXX_COMPILER_ID STREQUAL "Clang")
  # using Clang
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "GNU")
  target_compile_options(project_options INTERFACE -Wall -Wextra -O2)
  target_compile_options(project_options INTERFACE -Wall -Wextra -g)
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "Intel")
  # using Intel C++
elseif (CMAKE_CXX_COMPILER_ID STREQUAL "MSVC")
  target_compile_options(project_options INTERFACE /W4 /Zi /utf-8)
  target_link_options(project_options INTERFACE /subsystem:console)
endif()



find_package(PkgConfig REQUIRED)
pkg_check_modules(GUILE REQUIRED guile-3.0)

option(ENABLE_PCH "Enable Precompiled Headers" ON)

if(ENABLE_PCH)
  target_precompile_headers(
    project_options
    INTERFACE
    <print>
    <memory>
    <exception>
    )
endif()



add_subdirectory("src")</pre>
</div>
 <h2> <a id="srccmakeliststxt" class="anchor" href="#srccmakeliststxt">¶</a>src/CMakeLists.txt</h2> <div class="outline-text-2" id="text-orgebbc830">
 <pre>include_directories(${GUILE_INCLUDE_DIRS} ${PROJECT_SOURCE_DIR}/src/)

add_executable(${PROJECT_NAME} main.cpp)


target_link_libraries(
    ${PROJECT_NAME} PRIVATE
    project_options
    ${GUILE_LIBRARIES}
)</pre>
</div>
 <h2> <a id="srcguile_loaderhpp" class="anchor" href="#srcguile_loaderhpp">¶</a>src/guile_loader.hpp</h2> <div class="outline-text-2" id="text-orgc44f581">
 <pre> <span class="org-preprocessor">#pragma</span> once
 <span class="org-preprocessor">#include</span>  <span class="org-string"><libguile.h></span>

 <span class="org-keyword">namespace</span>  <span class="org-constant">safe</span>:: <span class="org-constant">scm</span> {
     <span class="org-keyword">class</span>  <span class="org-type">ScmException</span>:  <span class="org-keyword">public</span>  <span class="org-constant">std</span>:: <span class="org-type">runtime_error</span> {
     <span class="org-keyword">public</span>:
         <span class="org-keyword">explicit</span>  <span class="org-function-name">ScmException</span> ( <span class="org-keyword">const</span>  <span class="org-constant">std</span>:: <span class="org-type">string</span> & <span class="org-variable-name">msg</span>):  <span class="org-constant">std</span>:: <span class="org-function-name">runtime_error</span>(msg) {
        }

    };

     <span class="org-keyword">template</span> < <span class="org-keyword">typename</span>  <span class="org-type">Func</span>>
     <span class="org-keyword">auto</span>  <span class="org-function-name">call</span>( <span class="org-type">Func</span>  <span class="org-variable-name">func</span>) ->  <span class="org-type">SCM</span> {
         <span class="org-keyword">auto</span>  <span class="org-variable-name">func_ptr</span> =
             <span class="org-constant">std</span>::make_shared< <span class="org-type">Func</span>>( <span class="org-constant">std</span>::move(func));

         <span class="org-keyword">struct</span>  <span class="org-type">Context</span> {
             <span class="org-constant">std</span>:: <span class="org-type">shared_ptr</span>< <span class="org-type">Func</span>>  <span class="org-variable-name">func</span>;
        };
         <span class="org-type">Context</span>  <span class="org-variable-name">ctx</span>{func_ptr};

         <span class="org-keyword">auto</span>  <span class="org-variable-name">run</span> = []( <span class="org-type">void</span> * <span class="org-variable-name">data</span>) -> SCM {
             <span class="org-keyword">auto</span>*  <span class="org-variable-name">ctx</span> =  <span class="org-keyword">static_cast</span>< <span class="org-type">Context</span>*>(data);
             <span class="org-keyword">return</span> (*(ctx->func))();
        };

         <span class="org-keyword">auto</span>  <span class="org-variable-name">error</span> = []([[maybe_unused]]  <span class="org-type">void</span> * <span class="org-variable-name">data</span>, [[maybe_unused]]  <span class="org-type">SCM</span>  <span class="org-variable-name">key</span>,  <span class="org-type">SCM</span>  <span class="org-variable-name">args</span>) -> SCM {

             <span class="org-type">SCM</span>  <span class="org-variable-name">msg_scm</span> = ::scm_simple_format(
                SCM_BOOL_F,
                ::scm_from_utf8_string( <span class="org-string">"Guile error: ~A"</span>),
                ::scm_list_1(args)
                );


             <span class="org-type">char</span> * <span class="org-variable-name">msg</span> = ::scm_to_locale_string(msg_scm);
             <span class="org-constant">std</span>:: <span class="org-type">string</span>  <span class="org-variable-name">errString</span>(msg);
            free(msg);
             <span class="org-keyword">throw</span> ScmException(errString);
        };

         <span class="org-keyword">return</span> ::scm_c_catch(
            SCM_BOOL_T,
            run,
            &ctx,
            error,
             <span class="org-constant">nullptr</span>,
             <span class="org-constant">nullptr</span>,
             <span class="org-constant">nullptr</span>);
    }

};




 <span class="org-keyword">class</span>  <span class="org-type">GuileLoader</span> {
 <span class="org-keyword">public</span>:
     <span class="org-function-name">GuileLoader</span>( <span class="org-keyword">const</span>  <span class="org-constant">std</span>:: <span class="org-type">string</span>&  <span class="org-variable-name">scriptPath</span>)  <span class="org-keyword">try</span>:
        sScriptPath(scriptPath)
        {
            scm_init_guile();
             <span class="org-constant">safe</span>:: <span class="org-constant">scm</span>::call([=] {
                 <span class="org-keyword">return</span> scm_c_primitive_load(scriptPath.c_str());
            });
        }
     <span class="org-keyword">catch</span> ( <span class="org-keyword">const</span>  <span class="org-constant">safe</span>:: <span class="org-constant">scm</span>:: <span class="org-type">ScmException</span>&  <span class="org-variable-name">e</span>){
         <span class="org-constant">std</span>::println( <span class="org-string">"Failed to load Guile script: {}"</span>,e.what());
    }



     <span class="org-keyword">template</span>< <span class="org-keyword">typename</span>  <span class="org-type">T</span>>
     <span class="org-keyword">auto</span>  <span class="org-function-name">Execute</span>( <span class="org-constant">std</span>:: <span class="org-type">string_view</span>)-> <span class="org-constant">std</span>:: <span class="org-type">optional</span>< <span class="org-type">T</span>>;


 <span class="org-keyword">protected</span>:
 <span class="org-keyword">private</span>:
     <span class="org-constant">std</span>:: <span class="org-type">string</span>  <span class="org-variable-name">sScriptPath</span>;
};


 <span class="org-keyword">template</span>< <span class="org-keyword">typename</span>  <span class="org-type">T</span>>
 <span class="org-keyword">auto</span>  <span class="org-constant">GuileLoader</span>:: <span class="org-function-name">Execute</span>( <span class="org-constant">std</span>:: <span class="org-type">string_view</span>  <span class="org-variable-name">function_name</span>) ->  <span class="org-constant">std</span>:: <span class="org-type">optional</span>< <span class="org-type">T</span>> {
     <span class="org-keyword">try</span> {
        :: <span class="org-type">SCM</span>  <span class="org-variable-name">script_function</span> =  <span class="org-constant">safe</span>:: <span class="org-constant">scm</span>::call([&] {
             <span class="org-keyword">return</span> scm_c_lookup(function_name.data());
        });
        :: <span class="org-type">SCM</span>  <span class="org-variable-name">script_function_ref</span> =  <span class="org-constant">safe</span>:: <span class="org-constant">scm</span>::call([&] {
             <span class="org-keyword">return</span> scm_variable_ref(script_function);

        });

        :: <span class="org-type">SCM</span>  <span class="org-variable-name">result</span> =  <span class="org-constant">safe</span>:: <span class="org-constant">scm</span>::call([&] {
             <span class="org-keyword">return</span> scm_call_0(script_function_ref);
        });
         <span class="org-keyword">if</span>  <span class="org-keyword">constexpr</span> ( <span class="org-constant">std</span>:: <span class="org-type">is_same_v</span>< <span class="org-type">T</span>,  <span class="org-type">int</span>>) {
             <span class="org-keyword">return</span>  <span class="org-constant">std</span>::optional< <span class="org-type">int</span>>(::scm_to_int(result));
        }
         <span class="org-keyword">if</span>  <span class="org-keyword">constexpr</span> ( <span class="org-constant">std</span>:: <span class="org-type">is_same_v</span>< <span class="org-type">T</span>,  <span class="org-type">double</span>>) {
             <span class="org-keyword">return</span>  <span class="org-constant">std</span>::optional< <span class="org-type">double</span>>(::scm_to_double(result));
        }
         <span class="org-keyword">if</span>  <span class="org-keyword">constexpr</span> ( <span class="org-constant">std</span>:: <span class="org-type">is_same_v</span>< <span class="org-type">T</span>,  <span class="org-type">float</span>>) {
             <span class="org-keyword">return</span>  <span class="org-constant">std</span>::optional< <span class="org-type">float</span>>( <span class="org-keyword">static_cast</span>< <span class="org-type">float</span>>(::scm_to_double(result)));
        }
         <span class="org-keyword">if</span>  <span class="org-keyword">constexpr</span> ( <span class="org-constant">std</span>:: <span class="org-type">is_same_v</span>< <span class="org-type">T</span>,  <span class="org-constant">std</span>:: <span class="org-type">string</span>>) {
             <span class="org-type">char</span> * <span class="org-variable-name">cstr</span> = ::scm_to_utf8_string(result);
             <span class="org-constant">std</span>:: <span class="org-type">string</span>  <span class="org-variable-name">s</span>(cstr);
            free(cstr);
             <span class="org-keyword">return</span>  <span class="org-constant">std</span>::optional< <span class="org-constant">std</span>:: <span class="org-type">string</span>>(s);
        }

    }  <span class="org-keyword">catch</span>( <span class="org-keyword">const</span>  <span class="org-constant">safe</span>:: <span class="org-constant">scm</span>:: <span class="org-type">ScmException</span>&  <span class="org-variable-name">e</span>) {
         <span class="org-constant">std</span>::println( <span class="org-string">"Failed to execute Guile script: {}"</span>,e.what());
         <span class="org-keyword">return</span>  <span class="org-constant">std</span>::nullopt;
    }

}</pre>
</div>
 <h2> <a id="srcmaincpp" class="anchor" href="#srcmaincpp">¶</a>src/main.cpp</h2> <div class="outline-text-2" id="text-org9be79f1">
 <pre> <span class="org-preprocessor">#include</span>  <span class="org-string">"guile_loader.hpp"</span>

 <span class="org-keyword">auto</span>  <span class="org-function-name">main</span>( <span class="org-type">int</span>  <span class="org-variable-name">argc</span>,  <span class="org-type">char</span> ** <span class="org-variable-name">argv</span>) ->  <span class="org-type">int</span>
{

     <span class="org-type">GuileLoader</span>  <span class="org-variable-name">loader</span>{ <span class="org-string">"../scripts/test.scm"</span>};

     <span class="org-keyword">auto</span>  <span class="org-variable-name">result</span> = loader.Execute< <span class="org-type">int</span>>( <span class="org-string">"test"</span>);

     <span class="org-constant">std</span>::println( <span class="org-string">"Result is {}"</span>, result.value());

     <span class="org-keyword">return</span> 0;
}</pre>
</div>
 <h2> <a id="scriptstestscm" class="anchor" href="#scriptstestscm">¶</a>scripts/test.scm</h2> <div class="outline-text-2" id="text-orgfa28354">
 <pre>(define (test-function)
  (number->string (+ 2 3)))


(define (test)
  5)</pre>
</div>
</div>]]></description>
  <link>https://sebastianardelean.codeberg.page/posts/2025-11-19-cpp-safe-call-guile/index.html</link>
  <guid isPermaLink="false">https://sebastianardelean.codeberg.page/posts/2025-11-19-cpp-safe-call-guile/index.html</guid>
  <pubDate>Wed, 19 Nov 2025 08:00:00 +0200</pubDate>
</item>
<item>
  <title>Simple Linux char driver</title>
  <description><![CDATA[<div id="content"> <p>
This is the second blog post from a series dedicated to Linux drivers that started with  <a href="https://sebastianardelean.codeberg.page/posts/2025-10-19-linux-drivers-cross-compile">Linux drivers and cross compilation</a>. I aim to publish some skeletons of drivers for different interfaces and modules. I’m not a Linux kernel developer so I can’t say that
I will strictly follow the best practices in kernel development, but I have years of experience in bare-metal embedded driver development. Thus, I will follow the best practices in C programming
and make the best use of my knowledge in electronics and embedded. Those being said, this series will not be a tutorial in Linux driver development.
</p>

 <p>
In this blog post, I will start with the implementation of 2 simple char drivers that do nothing, except of logging parameters in kernel log. To build the drivers, I use a busybox and a minimalistic Linux kernel built
according to the steps form the aforementioned blog post. The kernel, busybox and the drivers are built using the ARM aarch64-linux-gnu compiler. I will use the following Makefile
</p>


 <pre>ifneq ($(KERNELRELEASE),)
obj-m += simple.o
else
KDIR := /home/mihai/qemu/linux-6.12.54
PWD := $(shell pwd)
CROSS=/bin/aarch64-linux-gnu-

default:
        @echo '   Building driver for kernel 6.12'
        $(MAKE) -C $(KDIR) M=$(PWD) ARCH=arm64 CROSS_COMPILE=$(CROSS) modules

clean:
        make -C $(KDIR) M=$(PWD) clean

endif</pre>

 <p>
to build the drivers. Between blog posts, the only changes will be in the variable  <code>obj-m</code> which contain the name of object. The  <code>KDIR</code> should point to the location of your built Linux kernel (feel free to change the path accordingly),
while  <code>CROSS</code> points to the location of the compiler. On my Debian machine, the arm compiler is in  <code>/bin</code>. If on your machine is in another location, just change path.
</p>
 <h2> <a id="simple-hello-world-driver" class="anchor" href="#simple-hello-world-driver">¶</a>Simple hello world driver</h2> <div class="outline-text-2" id="text-org62b4920">
 <pre> <span class="org-preprocessor">#include</span>  <span class="org-string"><linux/init.h></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><linux/module.h></span>


MODULE_LICENSE( <span class="org-string">"GPL"</span>);
MODULE_AUTHOR( <span class="org-string">"Sebastian Ardelean"</span>);
MODULE_DESCRIPTION( <span class="org-string">"A simple hello world Linux char driver"</span>);
MODULE_VERSION( <span class="org-string">"0.1"</span>);


 <span class="org-keyword">static</span>  <span class="org-type">int</span>  <span class="org-variable-name">__init</span> simple_init( <span class="org-type">void</span>)
{
    printk(KERN_INFO  <span class="org-string">"Simple: Hello World!\n"</span>);
     <span class="org-keyword">return</span> 0;
}

 <span class="org-keyword">static</span>  <span class="org-type">void</span>  <span class="org-variable-name">__exit</span> simple_exit( <span class="org-type">void</span>)
{
    printk(KERN_INFO  <span class="org-string">"Simple: Goodbye world! :(\n"</span>);
}

 <span class="org-function-name">module_init</span>(simple_init);
 <span class="org-function-name">module_exit</span>(simple_exit);</pre>

 <p>
After built, to test the driver run the command  <code>sudo insmod simple.ko</code> to insert the driver. In kernel logs (run  <code>dmesg</code>) one should see the line  <code>[ 2696.101472] Simple: Hello World!</code>. To remove the driver
run the command  <code>sudo rmmod simple</code> and in kernel logs one should see the message  <code>[ 2772.318862] Simple: Goodbye world! :(</code>.
</p>
</div>
 <h2> <a id="simple-hello-world-driver-with-parameters" class="anchor" href="#simple-hello-world-driver-with-parameters">¶</a>Simple hello world driver with parameters</h2> <div class="outline-text-2" id="text-org0c115fa">
 <p>
This driver is similar to the previous one, the only difference is that it uses module parameters.
</p>

 <pre> <span class="org-preprocessor">#include</span>  <span class="org-string"><linux/init.h></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><linux/module.h></span>


MODULE_LICENSE( <span class="org-string">"GPL"</span>);
MODULE_AUTHOR( <span class="org-string">"Sebastian Ardelean"</span>);
MODULE_DESCRIPTION( <span class="org-string">"A simple hello world Linux char driver"</span>);
MODULE_VERSION( <span class="org-string">"0.1"</span>);

 <span class="org-keyword">static</span>  <span class="org-type">char</span> * <span class="org-variable-name">message</span> =  <span class="org-string">"world"</span>;
 <span class="org-function-name">module_param</span>(message, charp, S_IRUSR | S_IWUSR);
 <span class="org-function-name">MODULE_PARM_DESC</span>(message,  <span class="org-string">"message parameter"</span>);


 <span class="org-keyword">static</span>  <span class="org-type">int</span>  <span class="org-variable-name">__init</span> simple_init( <span class="org-type">void</span>)
{
    printk(KERN_INFO  <span class="org-string">"Simple: Hello %s!\n"</span>, message);
     <span class="org-keyword">return</span> 0;
}

 <span class="org-keyword">static</span>  <span class="org-type">void</span>  <span class="org-variable-name">__exit</span> simple_exit( <span class="org-type">void</span>)
{
    printk(KERN_INFO  <span class="org-string">"Simple: Goodbye %s! :(\n"</span>, message);
}

 <span class="org-function-name">module_init</span>(simple_init);
 <span class="org-function-name">module_exit</span>(simple_exit);</pre>

 <p>
If you insert the driver with the command  <code>sudo insmod simple.ko message="SOMETHING"</code> followed by the command to remove it, in kernel logs one should see the lines
</p>
 <pre>[ 3190.552534] Simple: Hello SOMETHING!
[ 3201.806278] Simple: Goodbye SOMETHING! :(</pre>
</div>
</div>]]></description>
  <link>https://sebastianardelean.codeberg.page/posts/2025-10-23-simple-linux-char-driver/index.html</link>
  <guid isPermaLink="false">https://sebastianardelean.codeberg.page/posts/2025-10-23-simple-linux-char-driver/index.html</guid>
  <pubDate>Thu, 23 Oct 2025 08:00:00 +0300</pubDate>
</item>
<item>
  <title>Linux drivers and cross compilation</title>
  <description><![CDATA[<div id="content"> <p>
Some years ago, probably too many, I liked to implement drivers for my Beaglebone Black board. Nothing too fancy,
just some char drivers that measured a pwm signal using Input-Capture, or toggled some GPIOS. All those drivers were compiled and tested directly on the target. I know is not the best practice, but
I didn’t have the time to build the kernel, launch an emulation in QEMU and so on.
</p>

 <p>
A few days ago I found a Raspberry Pi kit, with fan, grills, and an official box. Pretty nice, but I didn’t liked the fan, because there was no way to control it and it was really loud (continuosly ran at full rpm). The first idea was
to implement a user space application in C or probably Python to control somehow the fan. So, took a NPN transistor and a 1k resistor, connected everything together and it works. Then I thought, what if
I make it a kernel driver. There is no single benefit to make it a driver, probably is even better if I keep it as a userspace application, but I wanted to play with the kernel APIs. So, start the Raspberry,
ssh on it and write the driver? No, definitely no!
</p>

 <p>
My plan:
</p>
 <ol class="org-ol"> <li>cross compile the kernel</li>
 <li>do some voodoo magic and launch Qemu</li>
 <li>develop and test the driver.</li>
</ol> <h2> <a id="cross-compiling-the-kernel" class="anchor" href="#cross-compiling-the-kernel">¶</a>Cross compiling the kernel</h2> <div class="outline-text-2" id="text-orgdd9129b">
 <p>
First try was a disaster, but I found 2 nice guides which I will link at the end of this post.
</p>
</div>
 <h3> <a id="preparing-the-environment" class="anchor" href="#preparing-the-environment">¶</a>Preparing the environment</h3> <div class="outline-text-3" id="text-org4de77c2">
 <ol class="org-ol"> <li>Install the cross compiler for arm64  <code>sudo apt install gcc-aarch64-linux-gnu g++-aarch64-linux-gnu</code></li>
 <li>Install Qemu  <code>sudo apt install qemu-system-arm</code></li>
 <li>Download the kernel (when I wrote this article, the longterm version was 6.12.53 )  <code>wget https://cdn.kernel.org/pub/linux/kernel/v6.x/linux-6.12.53.tar.xz</code> and untar it.</li>
 <li>Download BusyBox  <code>wget https://busybox.net/downloads/busybox-1.37.0.tar.bz2</code> and untar it.</li>
 <li>Download a Raspberry Pi OS from  <a href="https://www.raspberrypi.com/software/operating-systems/#raspberry-pi-os-64-bit">Raspi OS</a>.</li>
</ol></div>
 <h3> <a id="building-the-kernel" class="anchor" href="#building-the-kernel">¶</a>Building the kernel</h3> <div class="outline-text-3" id="text-orgdf10c36">
 <ol class="org-ol"> <li>Change directory into the kernel source code  <code>cd linux-6.12.53</code></li>
 <li>Create a config file  <code>ARCH=arm64 CROSS_COMPILE=/bin/aarch64-linux-gnu- make defconfig</code></li>
 <li>Create a kvm_guest config  <code>ARCH=arm64 CROSS_COMPILE=/bin/aarch64-linux-gnu- make kvm_guest.config</code></li>
 <li>Build the kernel  <code>ARCH=arm64 CROSS_COMPILE=/bin/aarch64-linux-gnu- make -j8</code></li>
</ol></div>
 <h3> <a id="preparing-the-os" class="anchor" href="#preparing-the-os">¶</a>Preparing the OS</h3> <div class="outline-text-3" id="text-org663f993">
 <ol class="org-ol"> <li> <p>
Calculate the offset of the first (512 bytes * 16384) device by inspecting the partitions:
</p>
 <pre>fdisk -l 2025-10-01-raspios-trixie-arm64-lite.img
Disk 2025-10-01-raspios-trixie-arm64-lite.img: 2.73 GiB, 2927624192 bytes, 5718016 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disklabel type: dos
Disk identifier: 0x7351b90c

Device                                    Boot   Start     End Sectors  Size Id Type
2025-10-01-raspios-trixie-arm64-lite.img1        16384 1064959 1048576  512M  c W95 FAT32 (LBA)
2025-10-01-raspios-trixie-arm64-lite.img2      1064960 5718015 4653056  2.2G 83 Linux</pre></li>
 <li> <p>
Mount the image:
</p>
 <pre>sudo mkdir /mnt/rpi
sudo mount -o loop, <span class="org-variable-name">offset</span>=8388608 2025-10-01-raspios-trixie-arm64-lite.img /mnt/rpi</pre></li>
 <li>Create a file named  <code>ssh</code>:  <code>cd /mnt/rpi && sudo touch ssh</code></li>
 <li>Create a file  <code>userconf</code>:  <code>sudo touch userconf.txt</code></li>
 <li> <p>
Generate a password and save it to userconf:
</p>
 <pre>openssl passwd -6                                      <span class="org-comment-delimiter"># </span> <span class="org-comment">Generate the <hashed-password>
</span> <span class="org-builtin">echo</span>  <span class="org-string">'pi:<hashed-password>'</span> | sudo tee userconf.txt    <span class="org-comment-delimiter"># </span> <span class="org-comment">Put them inside `userconf.txt`</span></pre></li>
 <li>Unmount:  <code>sudo umount /mnt/rpi</code></li>
</ol></div>
 <h3> <a id="build-a-minimalistic-linux-system" class="anchor" href="#build-a-minimalistic-linux-system">¶</a>Build a minimalistic Linux system</h3> <div class="outline-text-3" id="text-org5c8a44f">
 <ol class="org-ol"> <li>Defconfig the busybox:  <code>ARCH=arm64 CROSS_COMPILE=/bin/aarch64-linux-gnu- make defconfig</code></li>
 <li>Enable static link and dissable the use of special instructions for SHA. (The options are in Busybox Settings):  <code>ARCH=arm64 CROSS_COMPILE=/bin/aarch64-linux-gnu- make menuconfig</code></li>
 <li>Build busybox:  <code>ARCH=arm64 CROSS_COMPILE=/bin/aarch64-linux-gnu- make -j8</code></li>
 <li>And install it:  <code>ARCH=arm64 CROSS_COMPILE=/bin/aarch64-linux-gnu- make install</code></li>
</ol> <p>
Now, we must create a  <code>rootfs</code> directory and populate it.
</p>

 <ol class="org-ol"> <li>Create rootfs:  <code>mkdir rootfs</code></li>
 <li>Copy the content from busybox/install into rootfs:  <code>cp -av busybox-1.24.2/_install/* rootfs/</code></li>
 <li>Create a symlink to busybox  <code>ln -s bin/busybox init</code>.</li>
 <li>Create the required directories:  <code>mkdir -pv rootfs/{bin,sbin,etc,proc,sys,mnt,var/{log},usr/{bin,sbin}}</code></li>
 <li> <p>
Create the required  <code>/dev</code> with  <code>mem</code> and  <code>ttys</code>:
</p>
 <pre>mkdir dev &&  <span class="org-builtin">cd</span> dev
sudo mknod -m 660 mem c 1 1
sudo mknod -m 660 tty2 c 4 2
sudo mknod -m 660 tty3 c 4 3
sudo mknod -m 660 tty4 c 4 4</pre></li>
 <li>Use the content of this directory as initram disk, thus, from rootfs directory we run:  <code>find . -print0 | cpio --null -ov --format=newc | gzip -9 > ../rootfs.cpio.gz</code></li>
</ol></div>
 <h3> <a id="emulate-the-minimalistic-linux-system" class="anchor" href="#emulate-the-minimalistic-linux-system">¶</a>Emulate the minimalistic Linux system</h3> <div class="outline-text-3" id="text-orgccd23d5">
 <ol class="org-ol"> <li>Launch Qemu:   <code>qemu-system-aarch64 -machine virt -cpu cortex-a72 -smp 6 -m 4G -kernel Image -initrd rootfs.cpio.gz -serial stdio -append "root=/dev/mem serial=ttyAMA0" -virtfs local,id=hostshare,path=/home/share,mount_tag=hostshare,security_model=none</code></li>
 <li>Inside Qemu shell create the  <code>/mnt/hostshare</code> directory  <code>mkdir /mnt/hostshare</code> and mount it  <code>mount -t 9p -o trans=virtio,version=9p2000.L hostshare /mnt/hostshare</code>.</li>
</ol></div>
 <h3> <a id="emulate-raspberry-pi-in-qemu" class="anchor" href="#emulate-raspberry-pi-in-qemu">¶</a>Emulate Raspberry Pi in Qemu</h3> <div class="outline-text-3" id="text-orgb658bc1">
 <p>
To emulate the Raspberry Pi in Qemu, just run the following command:
</p>

 <pre>qemu-system-aarch64 -machine virt -cpu cortex-a72 -smp 6 -m 4G  <span class="org-sh-escaped-newline">\</span>
    -kernel Image -append  <span class="org-string">"root=/dev/vda2 rootfstype=ext4 rw panic=0 console=ttyAMA0"</span>  <span class="org-sh-escaped-newline">\</span>
    -drive  <span class="org-variable-name">format</span>=raw, <span class="org-variable-name">file</span>=2023-05-03-raspios-bullseye-arm64.img, <span class="org-variable-name">if</span>=none, <span class="org-variable-name">id</span>=hd0, <span class="org-variable-name">cache</span>=writeback  <span class="org-sh-escaped-newline">\</span>
    -device virtio-blk, <span class="org-variable-name">drive</span>=hd0, <span class="org-variable-name">bootindex</span>=0  <span class="org-sh-escaped-newline">\</span>
    -netdev user, <span class="org-variable-name">id</span>=mynet, <span class="org-variable-name">hostfwd</span>=tcp::2222-:22  <span class="org-sh-escaped-newline">\</span>
    -device virtio-net-pci, <span class="org-variable-name">netdev</span>=mynet  <span class="org-sh-escaped-newline">\</span>
    -monitor telnet:127.0.0.1:5555,server,nowait</pre>
 <p>
and connect with the ssh as  <code>ssh -l pi localhost -p 2222</code>.
</p>
</div>
 <h2> <a id="creating-the-driver" class="anchor" href="#creating-the-driver">¶</a>Creating the driver</h2> <h3> <a id="preparing-the-makefile" class="anchor" href="#preparing-the-makefile">¶</a>Preparing the Makefile</h3> <div class="outline-text-3" id="text-org27ac449">
 <p>
Now, the problem is that we want to cross-compile the driver using the Linux kernel we built. Thus, we have to define a simple Makefile that use the kernel sources, checks them, and use the cross-compiler:
</p>

 <pre>ifneq ($(KERNELRELEASE),)
obj-m += rpifan.o
else
KDIR := ../cross_compile/linux-6.12.53
PWD := $(shell pwd)
CROSS=/bin/aarch64-linux-gnu-

default:
   @echo '   Building RPI fan driver for kernel 6.12.'
   $(MAKE) -C $(KDIR) M=$(PWD) ARCH=arm64 CROSS_COMPILE=$(CROSS) modules

install:
   sudo insmod ./rpifan.ko

clean:
   make -C $(KDIR) M=$(PWD) clean

uninstall:
   sudo rmmod rpifan
endif</pre>
</div>
 <h3> <a id="building-the-driver" class="anchor" href="#building-the-driver">¶</a>Building the Driver</h3> <div class="outline-text-3" id="text-orge323fcd">
 <p>
We will try to build and insert the following char driver:
</p>
 <pre> <span class="org-preprocessor">#include</span>  <span class="org-string"><linux/init.h></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><linux/module.h></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><linux/kernel.h></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><linux/fs.h></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><linux/uaccess.h></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><linux/device.h></span>



 <span class="org-preprocessor">#define</span>  <span class="org-variable-name">DEVICE_NAME</span>  <span class="org-string">"rpifan"</span>
 <span class="org-preprocessor">#define</span>  <span class="org-variable-name">CLASS_NAME</span>  <span class="org-string">"rpi"</span>

MODULE_LICENSE( <span class="org-string">"GPL"</span>);
MODULE_AUTHOR( <span class="org-string">"Sebastian Ardelean"</span>);
MODULE_DESCRIPTION( <span class="org-string">"A Linux Driver for fan controlling on RPi."</span>);
MODULE_VERSION( <span class="org-string">"0.1"</span>);

 <span class="org-keyword">static</span>  <span class="org-type">char</span> * <span class="org-variable-name">name</span> =  <span class="org-string">"world"</span>;

 <span class="org-function-name">module_param</span>(name, charp, S_IRUGO);
 <span class="org-function-name">MODULE_PARM_DESC</span>(name,  <span class="org-string">"The name to display"</span>);


 <span class="org-keyword">static</span>  <span class="org-type">int</span>  <span class="org-variable-name">__init</span> rpifan_init( <span class="org-type">void</span>) {

  printk(KERN_INFO  <span class="org-string">"RpiFan: Initializing\n"</span>);
   <span class="org-keyword">return</span> 0;
}

 <span class="org-keyword">static</span>  <span class="org-type">void</span>  <span class="org-variable-name">__exit</span> rpifan_exit( <span class="org-type">void</span>) {
  printk(KERN_INFO  <span class="org-string">"RpiFan: Goodbye! :(\n"</span>);
}


 <span class="org-function-name">module_init</span>(rpifan_init);
 <span class="org-function-name">module_exit</span>(rpifan_exit);</pre>
 <p>
There are probably more include statements that needed but, I extracted this skeleton from a working driver, and adjusted it.
</p>

 <p>
And Happy development!
</p>

 <p>
Thank you to the authors of the following resources:
</p>
 <ol class="org-ol"> <li> <a href="https://gist.github.com/cGandom/23764ad5517c8ec1d7cd904b923ad863">Emulating Raspberry Pi 4 with QEMU</a></li>
 <li> <a href="https://lukaszgemborowski.github.io/articles/minimalistic-linux-system-on-qemu-arm.html">Minimalistic Linux system on qemu ARM</a></li>
</ol></div>
</div>]]></description>
  <link>https://sebastianardelean.codeberg.page/posts/2025-10-19-linux-drivers-cross-compile/index.html</link>
  <guid isPermaLink="false">https://sebastianardelean.codeberg.page/posts/2025-10-19-linux-drivers-cross-compile/index.html</guid>
  <pubDate>Sun, 19 Oct 2025 08:00:00 +0300</pubDate>
</item>
<item>
  <title>Barenco decomposition without ancilla qubits, in CL</title>
  <description><![CDATA[<div id="content"> <p>
Sick of using Qiskit for the implementation of quantum circuits—they change and broke the APIs with each release—
I decided to implement a CL library that allows the definition of quantum circuits and translates the code into
openQASM v2.0. The library  <a href="https://codeberg.org/sebastianardelean/clq">CLQ</a> is already almost 2 years old but, being occupied with other things, I didn’t use
it in big projects; just some minor circuits like 4 qubits adders, 4 qubits Grover and so on. From the development I noticed a
weak point in not having  <i>n</i>-qubits Toffoli gates. And somehow, I avoided the library until I decided to implement
a quantum genetic algorithm using it.
</p>

 <p>
A  <i>n</i>-qubits Toffoli gate is relatively easy to implement using ancilla qubits. I won’t dive into the circuit, but the basic
idea is to use CCNOT gates to change the state of the ancilla qubits, and finally, use a CNOT with the last ancilla qubit as control. But this technique requires a lot of qubits and,
in my circuit, to implement a simple knapsack solver it required over 32 qubits, with most of them being ancilla. That’s a waste and one cannot simulate that on a machine using Qiskit, QVM (my new favourite), or others.
</p>

 <p>
Thus, welcome to the  <a href="https://arxiv.org/pdf/quant-ph/9503016">Barenco et all. Elementary gates for quantum computation</a>. After studying the paper, I started to write
some qasm to define a base case, and after defining CNOTS with 2 control qubits, I jumped to 3 control qubits and so on. 
</p>


 <p>
Therefore, using  <b>CLQ</b> library I implemented the decomposition for a CCNOT gate:
</p>

 <pre>( <span class="org-keyword">defun</span>  <span class="org-function-name">barenco-decomposition</span> (qc ctrl-reg-0 ctrl-0 ctrl-reg-1 ctrl-1 target-reg targ)
  (clq:hgate qc target-reg targ)
  (clq:cxgate qc ctrl-reg-1 ctrl-1 target-reg targ)
  (clq:tdggate qc target-reg targ)
  (clq:cxgate qc ctrl-reg-0 ctrl-0 target-reg targ)
  (clq:tgate qc target-reg targ)
  (clq:cxgate qc ctrl-reg-1 ctrl-1 target-reg targ)
  (clq:tdggate qc target-reg targ)
  (clq:cxgate qc ctrl-reg-0 ctrl-0 target-reg targ)
  (clq:tgate qc ctrl-reg-1 ctrl-1)
  (clq:tgate qc target-reg targ)
  (clq:hgate qc target-reg targ))</pre>

 <p>
and then I started to think about how to use 3,4,5,etc. controls. (By the way, LLMs are pretty stupid, I would say quite idiots, at implementing it, giving the same incorrect code over and over again.)
</p>

 <pre>( <span class="org-keyword">defun</span>  <span class="org-function-name">mcx-no-ancilla</span> (qc ctrl-reg ctrl-pos target-reg targ)
  ( <span class="org-keyword">let</span> ((len (length ctrl-pos)))
    ( <span class="org-keyword">cond</span> ((= len 0)
           (clq:xgate qc target-reg targ))
          ((= len 1)
           (clq:cxgate qc ctrl-reg (car ctrl-pos) target-reg targ))
          ((= len 2)
           (barenco-decomposition qc
                                  ctrl-reg
                                  (nth 0 ctrl-pos)
                                  ctrl-reg
                                  (nth 1 ctrl-pos)
                                  target-reg
                                  targ))
          ((> len 2)
           ( <span class="org-keyword">dotimes</span> (i (- len 2))
             (barenco-decomposition qc
                                    ctrl-reg
                                    (nth i ctrl-pos)
                                    ctrl-reg
                                    (nth (+ i 1) ctrl-pos)
                                    target-reg
                                    targ))
           (clq:cxgate qc ctrl-reg (car (last ctrl-pos)) target-reg targ)
           ( <span class="org-keyword">dotimes</span> (i (- len 2))
             (barenco-decomposition qc
                                    ctrl-reg
                                    (nth i ctrl-pos)
                                    ctrl-reg
                                    (nth (+ i 1) ctrl-pos)
                                    target-reg
                                    targ))))))</pre>

 <p>
Finally, we can define the circuit as
</p>

 <pre>( <span class="org-keyword">defun</span>  <span class="org-function-name">build-circuit</span> ()
  ( <span class="org-keyword">let*</span> ((qreg (clq:make-qregister 8  <span class="org-string">"qr"</span>))
         (creg (clq:make-cregister 8  <span class="org-string">"cr"</span>))
         (qc (clq:make-qcircuit (list qreg)
                                (list creg))))
    ( <span class="org-keyword">dotimes</span> (i 7)
      (clq:xgate qc qreg i))
    (mcx-no-ancilla qc qreg (list 0 1 2 3 4 5 6) qreg 7)
    ( <span class="org-keyword">dotimes</span> (i 8)
      (clq:measure qc qreg i creg i))
    
    (clq:save-openqasm-to-file qc  <span class="org-string">"test.qasm"</span>)</pre>

 <p>
And simulate it using QVM or Qiskit (YAC!) or other simulators. 
</p>
 <h2> <a id="later-edit" class="anchor" href="#later-edit">¶</a>Later edit</h2> <div class="outline-text-2" id="text-org9dd027c">
 <p>
Furthermore, we can define different multi-controlled gates, like for the H,S,T gates.
</p>

 <pre>( <span class="org-keyword">defun</span>  <span class="org-function-name">mch-no-ancilla</span> (qc ctrl-reg ctrl-pos target-reg targ)
  ( <span class="org-keyword">let</span> ((len (length ctrl-pos)))
    ( <span class="org-keyword">cond</span> ((= len 0)
           (clq:hgate qc target-reg targ))
          ((= len 1)
           (clq:chgate qc ctrl-reg (car ctrl-pos) target-reg targ))
          ((= len 2)
           (clq:cchgate qc ctrl-reg (car ctrl-pos) ctrl-reg (car (cdr ctrl-pos)) target-reg targ))
          ((> len 2)
           ( <span class="org-keyword">dotimes</span> (i (- len 2))
             (barenco-decomposition qc
                                    ctrl-reg
                                    (nth i ctrl-pos)
                                    ctrl-reg
                                    (nth (+ i 1) ctrl-pos)
                                    target-reg
                                    targ))
           (clq:chgate qc ctrl-reg (car (last ctrl-pos)) target-reg targ)
           ( <span class="org-keyword">dotimes</span> (i (- len 2))
             (barenco-decomposition qc
                                    ctrl-reg
                                    (nth i ctrl-pos)
                                    ctrl-reg
                                    (nth (+ i 1) ctrl-pos)
                                    target-reg
                                    targ))))))

( <span class="org-keyword">defun</span>  <span class="org-function-name">mcs-no-ancilla</span> (qc ctrl-reg ctrl-pos target-reg targ)
  ( <span class="org-keyword">let</span> ((len (length ctrl-pos)))
    ( <span class="org-keyword">cond</span> ((= len 0)
           (clq:sgate qc target-reg targ))
          ((= len 1)
           (clq:csgate qc ctrl-reg (car ctrl-pos) target-reg targ))
          ((= len 2)
           (barenco-decomposition qc
                                  ctrl-reg
                                  (nth 0 ctrl-pos)
                                  ctrl-reg
                                  (nth 1 ctrl-pos)
                                  target-reg
                                  targ))
          ((> len 2)
           ( <span class="org-keyword">dotimes</span> (i (- len 2))
             (barenco-decomposition qc
                                    ctrl-reg
                                    (nth i ctrl-pos)
                                    ctrl-reg
                                    (nth (+ i 1) ctrl-pos)
                                    target-reg
                                    targ))
           (clq:csgate qc ctrl-reg (car (last ctrl-pos)) target-reg targ)
           ( <span class="org-keyword">dotimes</span> (i (- len 2))
             (barenco-decomposition qc
                                    ctrl-reg
                                    (nth i ctrl-pos)
                                    ctrl-reg
                                    (nth (+ i 1) ctrl-pos)
                                    target-reg
                                    targ))))))
           
  
( <span class="org-keyword">defun</span>  <span class="org-function-name">mct-no-ancilla</span> (qc ctrl-reg ctrl-pos target-reg targ)
  ( <span class="org-keyword">let</span> ((len (length ctrl-pos)))
    ( <span class="org-keyword">cond</span> ((= len 0)
           (clq:tgate qc target-reg targ))
          ((= len 1)
           (clq:ctgate qc ctrl-reg (car ctrl-pos) target-reg targ))
          ((= len 2)
           (barenco-decomposition qc
                                  ctrl-reg
                                  (nth 0 ctrl-pos)
                                  ctrl-reg
                                  (nth 1 ctrl-pos)
                                  target-reg
                                  targ))
          ((> len 2)
           ( <span class="org-keyword">dotimes</span> (i (- len 2))
             (barenco-decomposition qc
                                    ctrl-reg
                                    (nth i ctrl-pos)
                                    ctrl-reg
                                    (nth (+ i 1) ctrl-pos)
                                    target-reg
                                    targ))
           (clq:ctgate qc ctrl-reg (car (last ctrl-pos)) target-reg targ)
           ( <span class="org-keyword">dotimes</span> (i (- len 2))
             (barenco-decomposition qc
                                    ctrl-reg
                                    (nth i ctrl-pos)
                                    ctrl-reg
                                    (nth (+ i 1) ctrl-pos)
                                    target-reg
                                    targ))))))</pre>
</div>
</div>]]></description>
  <link>https://sebastianardelean.codeberg.page/posts/2025-09-25-lisp-barenco-decomposition/index.html</link>
  <guid isPermaLink="false">https://sebastianardelean.codeberg.page/posts/2025-09-25-lisp-barenco-decomposition/index.html</guid>
  <pubDate>Thu, 25 Sep 2025 08:00:00 +0300</pubDate>
</item>
<item>
  <title>C++ signal dispatcher</title>
  <description><![CDATA[<div id="content"> <pre> <span class="org-comment-delimiter">//</span> <span class="org-comment">main.cpp
</span> <span class="org-preprocessor">#include</span>  <span class="org-string"><iostream></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><thread></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><csignal></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string">"sig.hpp"</span>

 <span class="org-keyword">auto</span>  <span class="org-function-name">handler</span>( <span class="org-type">int</span>  <span class="org-variable-name">signum</span>) ->  <span class="org-type">void</span> {
     <span class="org-constant">std</span>::cout<< <span class="org-string">"SIGALRM\n"</span>;
}

 <span class="org-keyword">auto</span>  <span class="org-function-name">main</span>( <span class="org-type">void</span>) ->  <span class="org-type">int</span> {
   <span class="org-type">bool</span>  <span class="org-variable-name">stop</span> =  <span class="org-constant">false</span>;
   <span class="org-constant">sig_handler</span>::setHandler(SIGINT, [& <span class="org-variable-name">stop</span>] ( <span class="org-type">int</span>) { stop =  <span class="org-constant">true</span>; });
   <span class="org-constant">sig_handler</span>::setHandler(SIGALRM, &handler);

   <span class="org-keyword">while</span> ( <span class="org-negation-char">!</span>stop) {
     <span class="org-constant">std</span>:: <span class="org-constant">this_thread</span>::sleep_for( <span class="org-constant">std</span>:: <span class="org-constant">chrono</span>::seconds(1));
    raise(SIGALRM);
  }
   <span class="org-constant">std</span>::cout <<  <span class="org-string">"Bye"</span> <<  <span class="org-constant">std</span>::endl;
   <span class="org-keyword">return</span> 0;
}</pre>


 <pre> <span class="org-comment-delimiter">// </span> <span class="org-comment">sig.cpp
</span> <span class="org-preprocessor">#include</span>  <span class="org-string"><cstring></span>  <span class="org-comment-delimiter">// </span> <span class="org-comment">strsignal
</span> <span class="org-preprocessor">#include</span>  <span class="org-string"><csignal></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><string></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><stdexcept></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><unordered_map></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><mutex></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string">"sig.hpp"</span>

 <span class="org-keyword">namespace</span>  <span class="org-constant">sig_handler</span> {

   <span class="org-constant">std</span>:: <span class="org-type">timed_mutex</span>  <span class="org-variable-name">signalHandlersMutex</span>;
   <span class="org-constant">std</span>:: <span class="org-type">unordered_map</span>< <span class="org-type">int</span>,  <span class="org-constant">std</span>:: <span class="org-type">function</span>< <span class="org-type">void</span>( <span class="org-type">int</span>)>>  <span class="org-variable-name">signalHandlers</span>;

   <span class="org-keyword">auto</span>  <span class="org-function-name">dispatcher</span>( <span class="org-type">int</span>  <span class="org-variable-name">signal</span>) ->  <span class="org-type">void</span> {
     <span class="org-constant">std</span>:: <span class="org-type">unique_lock</span>< <span class="org-constant">std</span>:: <span class="org-type">timed_mutex</span>>  <span class="org-variable-name">lock</span>(signalHandlersMutex,  <span class="org-constant">std</span>::defer_lock);
     <span class="org-keyword">if</span> ( <span class="org-negation-char">!</span>lock.try_lock_for( <span class="org-constant">std</span>:: <span class="org-constant">chrono</span>::seconds(1))) {
       <span class="org-comment-delimiter">// </span> <span class="org-comment">unable to get the lock. should be a strange case
</span>       <span class="org-keyword">return</span>;
    }
     <span class="org-keyword">auto</span>  <span class="org-variable-name">it</span> = signalHandlers.find(signal);
     <span class="org-keyword">if</span> (it != signalHandlers.end()) {
      it->second(signal);
    }
  }

   <span class="org-keyword">auto</span>  <span class="org-function-name">registerHandler</span>( <span class="org-type">int</span>  <span class="org-variable-name">signal</span>,  <span class="org-keyword">const</span>  <span class="org-constant">std</span>:: <span class="org-type">function</span>< <span class="org-type">void</span>( <span class="org-type">int</span>)>&  <span class="org-variable-name">handler</span>) ->  <span class="org-type">void</span> {
     <span class="org-constant">std</span>:: <span class="org-type">lock_guard</span>< <span class="org-constant">std</span>:: <span class="org-type">timed_mutex</span>>  <span class="org-variable-name">lock</span>(signalHandlersMutex);
    signalHandlers.emplace(signal, handler);
  }


   <span class="org-keyword">auto</span>  <span class="org-function-name">setHandler</span>( <span class="org-type">int</span>  <span class="org-variable-name">signal</span>,  <span class="org-keyword">const</span>  <span class="org-constant">std</span>:: <span class="org-type">function</span>< <span class="org-type">void</span>( <span class="org-type">int</span>)>&  <span class="org-variable-name">handler</span>,  <span class="org-type">int</span>  <span class="org-variable-name">flags</span>) ->  <span class="org-type">void</span> {

     <span class="org-keyword">struct</span>  <span class="org-type">sigaction</span>  <span class="org-variable-name">action</span>;
     <span class="org-keyword">if</span> (sigfillset(&action.sa_mask) == -1) {
       <span class="org-keyword">throw</span>  <span class="org-constant">std</span>::runtime_error( <span class="org-string">"sigfillset failed"</span>);
    }
    action.sa_flags = flags;
    action.sa_handler = dispatcher;

     <span class="org-comment-delimiter">// </span> <span class="org-comment">set handler for the signal
</span>     <span class="org-keyword">if</span> (sigaction(signal, &action,  <span class="org-constant">nullptr</span>) == -1 && signal < __SIGRTMIN) {
       <span class="org-keyword">throw</span>  <span class="org-constant">std</span>::runtime_error( <span class="org-string">"Fail at configuring handler for signal: "</span> +  <span class="org-constant">std</span>::string(strsignal(signal)));
    }
    registerHandler(signal, handler);
  }

}</pre>


 <pre> <span class="org-comment-delimiter">//</span> <span class="org-comment">sig.hpp
</span> <span class="org-preprocessor">#if</span> <span class="org-negation-char"> <span class="org-preprocessor">n</span></span> <span class="org-preprocessor">def</span> SIG_HPP
 <span class="org-preprocessor">#define</span>  <span class="org-variable-name">SIG_HPP</span>

 <span class="org-preprocessor">#include</span>  <span class="org-string"><functional></span>

 <span class="org-keyword">namespace</span>  <span class="org-constant">sig_handler</span> {

         <span class="org-keyword">auto</span>  <span class="org-function-name">setHandler</span>( <span class="org-type">int</span>  <span class="org-variable-name">signal</span>,  <span class="org-keyword">const</span>  <span class="org-constant">std</span>:: <span class="org-type">function</span>< <span class="org-type">void</span>( <span class="org-type">int</span>)>&  <span class="org-variable-name">handler</span>,  <span class="org-type">int</span>  <span class="org-variable-name">flags</span>=0) ->  <span class="org-type">void</span>;

}

 <span class="org-preprocessor">#endif</span></pre>
</div>]]></description>
  <link>https://sebastianardelean.codeberg.page/posts/2025-01-22-cpp-signal-handler/index.html</link>
  <guid isPermaLink="false">https://sebastianardelean.codeberg.page/posts/2025-01-22-cpp-signal-handler/index.html</guid>
  <pubDate>Wed, 22 Jan 2025 08:00:00 +0200</pubDate>
</item>
<item>
  <title>Decimal to binary in Clojure</title>
  <description><![CDATA[<div id="content"> <pre>(defn convert-to-binary [value bits]
  (letfn [(to-binary [value bits] 
            (-> value (Integer/toString 2)
                (Integer/parseInt) (->> (format (str "%0" bits "d")))))]
    (let [binary-value (to-binary value bits) result-size (count binary-value)
          default-value (apply str (repeat bits 1))]
      (if (not= result-size bits) default-value  binary-value))))</pre>
</div>]]></description>
  <link>https://sebastianardelean.codeberg.page/posts/2024-08-21-decimal-to-binary-in-clojure/index.html</link>
  <guid isPermaLink="false">https://sebastianardelean.codeberg.page/posts/2024-08-21-decimal-to-binary-in-clojure/index.html</guid>
  <pubDate>Wed, 21 Aug 2024 08:00:00 +0300</pubDate>
</item>
<item>
  <title>Decorator design pattern</title>
  <description><![CDATA[<div id="content"> <pre> <span class="org-type">include</span> <iostream>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><string></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><memory></span>
 <span class="org-doc">/**
 * The base Component interface 
 */</span>
 <span class="org-keyword">class</span> Component {
  <span class="org-keyword">public</span>:
   <span class="org-function-name">Component</span>(){ <span class="org-constant">std</span>::cout<< <span class="org-string">"[Constructor] Component\n"</span>;}
   <span class="org-keyword">virtual</span> ~ <span class="org-function-name">Component</span>(){ <span class="org-constant">std</span>::cout<< <span class="org-string">"[Destructor] Component\n"</span>;}
   <span class="org-keyword">virtual</span>  <span class="org-type">void</span>  <span class="org-function-name">Operation</span>() = 0;
};
 <span class="org-doc">/**
 * Concrete Components 
 */</span>
 <span class="org-keyword">class</span>  <span class="org-type">ConcreteComponent</span> :  <span class="org-keyword">public</span>  <span class="org-type">Component</span> {
  <span class="org-keyword">public</span>:
   <span class="org-function-name">ConcreteComponent</span>(){ <span class="org-constant">std</span>::cout<< <span class="org-string">"[Constructor] ConcreteComponent\n"</span>;}
  ~ <span class="org-function-name">ConcreteComponent</span>(){ <span class="org-constant">std</span>::cout<< <span class="org-string">"[Destructor] ConcreteComponent\n"</span>;}
   <span class="org-type">void</span>  <span class="org-function-name">Operation</span>()  <span class="org-keyword">override</span> {
     <span class="org-constant">std</span>::cout<< <span class="org-string">"ConcreteComponent"</span>;
  }
};

 <span class="org-keyword">class</span>  <span class="org-type">Decorator</span> :  <span class="org-keyword">public</span>  <span class="org-type">Component</span> {

  <span class="org-keyword">protected</span>:
   <span class="org-constant">std</span>:: <span class="org-type">unique_ptr</span>< <span class="org-type">Component</span>>  <span class="org-variable-name">component_</span>;

  <span class="org-keyword">public</span>:
  
   <span class="org-function-name">Decorator</span>(  <span class="org-constant">std</span>:: <span class="org-type">unique_ptr</span>< <span class="org-type">Component</span>>  <span class="org-variable-name">component</span>)  {
      component_= <span class="org-constant">std</span>::move(component);
       <span class="org-constant">std</span>::cout<< <span class="org-string">"[Constructor] Decorator\n"</span>;
  }
  ~ <span class="org-function-name">Decorator</span>(){ <span class="org-constant">std</span>::cout<< <span class="org-string">"[Destructor] Decorator\n"</span>;}
  
 
   <span class="org-type">void</span>  <span class="org-function-name">Operation</span>()   <span class="org-keyword">override</span> {
     <span class="org-keyword">this</span>->component_->Operation();
  }
};

 <span class="org-keyword">class</span>  <span class="org-type">ConcreteDecorator</span> :  <span class="org-keyword">public</span>  <span class="org-type">Decorator</span> {
  
  <span class="org-keyword">public</span>:
  
   <span class="org-function-name">ConcreteDecorator</span>(  <span class="org-constant">std</span>:: <span class="org-type">unique_ptr</span>< <span class="org-type">Component</span>>  <span class="org-variable-name">component</span>) : Decorator( <span class="org-constant">std</span>::move(component)) {
       <span class="org-constant">std</span>::cout<< <span class="org-string">"[Constructor] ConcreteDecorator\n"</span>;
  }
  ~ <span class="org-function-name">ConcreteDecorator</span>() { <span class="org-constant">std</span>::cout<< <span class="org-string">"[Destructor] ConcreteDecoratorA\n"</span>;}
   <span class="org-type">void</span>  <span class="org-function-name">Operation</span>()   <span class="org-keyword">override</span> {
     <span class="org-constant">std</span>::cout<<  <span class="org-string">"ConcreteDecorator("</span>;  <span class="org-constant">Decorator</span>::Operation();  <span class="org-constant">std</span>::cout<< <span class="org-string">")"</span>;
  }
};


 <span class="org-type">int</span>  <span class="org-function-name">main</span>() {
 
   <span class="org-constant">std</span>:: <span class="org-type">unique_ptr</span>< <span class="org-type">Component</span>>  <span class="org-variable-name">simple</span>= <span class="org-constant">std</span>::make_unique< <span class="org-type">ConcreteComponent</span>>();
   <span class="org-constant">std</span>::cout <<  <span class="org-string">"Client: I've got a simple component:\n"</span>;
  simple->Operation();
   <span class="org-constant">std</span>::cout <<  <span class="org-string">"\n\n"</span>;

    <span class="org-constant">std</span>:: <span class="org-type">unique_ptr</span>< <span class="org-type">Component</span>>  <span class="org-variable-name">decorator</span> =  <span class="org-constant">std</span>::make_unique< <span class="org-type">ConcreteDecorator</span>>( <span class="org-constant">std</span>::move(simple));
    <span class="org-constant">std</span>::cout <<  <span class="org-string">"Client: Now I've got a decorated component:\n"</span>;
   decorator->Operation();
    <span class="org-constant">std</span>::cout <<  <span class="org-string">"\n"</span>;

   

   <span class="org-keyword">return</span> 0;
}</pre>
</div>]]></description>
  <link>https://sebastianardelean.codeberg.page/posts/2024-08-21-decorator-design-pattern-in-cpp/index.html</link>
  <guid isPermaLink="false">https://sebastianardelean.codeberg.page/posts/2024-08-21-decorator-design-pattern-in-cpp/index.html</guid>
  <pubDate>Wed, 21 Aug 2024 08:00:00 +0300</pubDate>
</item>
<item>
  <title>Flask API served using Gunicorn and Nginx</title>
  <description><![CDATA[<div id="content"> <h2> <a id="dependencies" class="anchor" href="#dependencies">¶</a>Dependencies</h2> <div class="outline-text-2" id="text-org3d74b5a">
 <pre>sudo apt install python3-pip python3-dev python3-venv nginx</pre>
</div>
 <h2> <a id="python-environment" class="anchor" href="#python-environment">¶</a>Python environment</h2> <div class="outline-text-2" id="text-org4141f81">
 <pre>python3 -m venv env
 <span class="org-builtin">source</span> env/bin/activate
pip3 install flask gunicorn</pre>
</div>
 <h2> <a id="python-application" class="anchor" href="#python-application">¶</a>Python Application</h2> <div class="outline-text-2" id="text-org5b973c0">
 <pre> <span class="org-comment-delimiter">#</span> <span class="org-comment">~/project/app.py
</span> <span class="org-keyword">from</span> flask  <span class="org-keyword">import</span> Flask
 <span class="org-variable-name">app</span>  <span class="org-operator">=</span> Flask( <span class="org-builtin">__name__</span>)
 <span class="org-type">@app.route</span>( <span class="org-string">"/"</span>)
 <span class="org-keyword">def</span>  <span class="org-function-name">hello</span>():
     <span class="org-keyword">return</span>  <span class="org-string">"Welcome to Flask Application!"</span>
 <span class="org-keyword">if</span>  <span class="org-builtin">__name__</span>  <span class="org-operator">==</span>  <span class="org-string">"__main__"</span>:
    app.run(host <span class="org-operator">=</span> <span class="org-string">'0.0.0.0'</span>)

 <span class="org-comment-delimiter">#</span> <span class="org-comment">~/project/wsgi.py
</span> <span class="org-keyword">from</span> app  <span class="org-keyword">import</span> app
 <span class="org-keyword">if</span>  <span class="org-builtin">__name__</span>  <span class="org-operator">==</span>  <span class="org-string">"__main__"</span>:
  app.run()</pre>

 <p>
And deactivate the environment.
</p>
</div>
 <h2> <a id="systemd-service" class="anchor" href="#systemd-service">¶</a>Systemd Service</h2> <div class="outline-text-2" id="text-orga88e093">
 <pre> <span class="org-comment-delimiter">#</span> <span class="org-comment">vi /etc/systemd/system/flask.service
</span>[Unit]
 <span class="org-variable-name">Description</span>=Gunicorn instance to serve Flask
 <span class="org-variable-name">After</span>=network.target
[Service]
 <span class="org-variable-name">User</span>=root
 <span class="org-variable-name">Group</span>=www-data
 <span class="org-variable-name">WorkingDirectory</span>=/home/<user>/project
 <span class="org-variable-name">Environment</span>= <span class="org-string">"PATH=/home/<user>/project/env/bin"</span>
 <span class="org-variable-name">ExecStart</span>=/home/<user>/project/env/bin/gunicorn --bind unix:/home/<user>/project/request.sock wsgi:app
[Install]
 <span class="org-variable-name">WantedBy</span>=multi-user.target</pre>

 <pre>chown -R root:www-data /home/<user>/project
chmod -R 775 /home/<user>/project
systemctl daemon-reload
systemctl start flask
systemctl enable flask
systemctl status flask</pre>
</div>
 <h2> <a id="nginx-as-reverse-proxy" class="anchor" href="#nginx-as-reverse-proxy">¶</a>Nginx as reverse proxy</h2> <div class="outline-text-2" id="text-org84f4a9b">
 <pre>> vim /etc/nginx/sites-available/flask.conf
server {
  listen <server_ip>:5002 ssl http2;
  listen <server_ip>:5001;

  ssl_certificate /home/<user>/project/cert.pem;
  ssl_certificate_key /home/<user>/project/key.pem;

  access_log /home/<user>/project/rest_api.access.log;
  error_log /home/<user>/project/rest_api.error.log;



  location / {
    include proxy_params;
    proxy_pass http://unix:/home/<user>/project/request.sock;
   }

}
> vim /etc/nginx/nginx.conf
stream {
    upstream http {
        server <server_ip>:5001;
    }

    upstream https {
        server <server_ip>:5002;
    }

    map $ssl_preread_protocol $upstream {
        default https;
        "" http;
    }

    # SSH and SSL on the same port
    server {
        listen 5000;

        proxy_pass $upstream;
        ssl_preread on;
    }
}</pre>

 <pre>sudo ln -s /etc/nginx/sites-available/flask.conf /etc/nginx/sites-enabled
nginx -t
systemctl restart nginx</pre>
</div>
</div>]]></description>
  <link>https://sebastianardelean.codeberg.page/posts/2024-08-21-flask-server-setup/index.html</link>
  <guid isPermaLink="false">https://sebastianardelean.codeberg.page/posts/2024-08-21-flask-server-setup/index.html</guid>
  <pubDate>Wed, 21 Aug 2024 08:00:00 +0300</pubDate>
</item>
<item>
  <title>Fractals implemented in Clojure</title>
  <description><![CDATA[<div id="content"> <h2> <a id="fractal-canopy" class="anchor" href="#fractal-canopy">¶</a>Fractal canopy</h2> <div class="outline-text-2" id="text-orgac4f8d2">
 <pre>(ns fractals.core
  (:gen-class))

(def tree-fractal-file "tree.svg")


(defn append-to-file
  "Uses spit to append to a file specified with its name as a string, or
   anything else that writer can take as an argument.  s is the string to
   append."     
  [file-name s]
  (spit file-name s :append true))



(def header-xml "<?xml version=\"1.0\"?>")
(def header-svg "<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">")
(def footer "\" stroke=\"black\" stroke-width=\"1\"/>\n</svg>")



(defn map-y-coordinate [y]
  (- 600 y))

(defn draw-line [x y x1 y1 file]
  (append-to-file file (str " M " x " " (map-y-coordinate y)))
  (append-to-file file (str " L " x1 " " (map-y-coordinate y1)))
  )

(defn draw-tree [x y angle depth len fork-angle]
  (if (> depth 0)
    (let [x2 (- x (* (Math/sin (Math/toRadians angle)) depth len))
          y2 (- y (* (Math/cos (Math/toRadians angle)) depth len))]
      (draw-line x y x2 y2 tree-fractal-file)
      (draw-tree x2 y2 (- angle fork-angle) (- depth 1) len fork-angle)
      (draw-tree x2 y2 (+ angle fork-angle) (- depth 1) len fork-angle)
      )))


(defn run-tree []
  (let [content "<path d=\""
        
        ]
    (append-to-file tree-fractal-file header-xml)
    (append-to-file tree-fractal-file header-svg)
    (append-to-file tree-fractal-file content)
    (draw-tree 600 50 180 10 10 20)
    (append-to-file tree-fractal-file footer)
    ))

(defn -main
  [& args]
  ;;  (run 0.0 0.0 729.0 )
  (run-tree)
  )</pre>
</div>
 <h2> <a id="vicsek-fractal" class="anchor" href="#vicsek-fractal">¶</a>Vicsek fractal</h2> <div class="outline-text-2" id="text-org1fd9006">
 <pre>(def header-xml "<?xml version=\"1.0\"?>")
(def header-svg "<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">")
(def footer "\"/>\n</svg>")

(defn append-to-file
  [file-name s]
  (spit file-name s :append true))



(defn print-line [x y len file]
  (append-to-file file (str "M " x " " y))
  (append-to-file file (str "h " len))
  (append-to-file file (str "v " len))
  (append-to-file file (str "h " (- 0 len)))
  (append-to-file file (str "v -" len))  
  )

(defn fractal-cross [x y len file]
  (if (< len 3)
    (print-line x y len file)
    (let [l3 (/ len 3.0) l23 (* l3 2)]
      (fractal-cross x y l3 file)
      (fractal-cross (+ x l23) y l3 file)
      (fractal-cross (+ x l3) (+ y l3) l3 file)
      (fractal-cross x (+ y l23) l3 file)
      (fractal-cross (+ x l23) (+ y l23) l3 file))))

(defn run [x,y,len file]
  (let [content "<path d=\""]
    (append-to-file file header-xml)
    (append-to-file file header-svg)
    (append-to-file file content)
    (fractal-cross x y len file)
    (append-to-file file footer)))


(run 0.0 0.0 729.0 "test.svg")(def header-xml "<?xml version=\"1.0\"?>")
(def header-svg "<svg version=\"1.1\" xmlns=\"http://www.w3.org/2000/svg\">")
(def footer "\"/>\n</svg>")

(defn append-to-file
  [file-name s]
  (spit file-name s :append true))



(defn print-line [x y len file]
  (append-to-file file (str "M " x " " y))
  (append-to-file file (str "h " len))
  (append-to-file file (str "v " len))
  (append-to-file file (str "h " (- 0 len)))
  (append-to-file file (str "v -" len))  
  )

(defn fractal-cross [x y len file]
  (if (< len 3)
    (print-line x y len file)
    (let [l3 (/ len 3.0) l23 (* l3 2)]
      (fractal-cross x y l3 file)
      (fractal-cross (+ x l23) y l3 file)
      (fractal-cross (+ x l3) (+ y l3) l3 file)
      (fractal-cross x (+ y l23) l3 file)
      (fractal-cross (+ x l23) (+ y l23) l3 file))))

(defn run [x,y,len file]
  (let [content "<path d=\""]
    (append-to-file file header-xml)
    (append-to-file file header-svg)
    (append-to-file file content)
    (fractal-cross x y len file)
    (append-to-file file footer)))


(run 0.0 0.0 729.0 "test.svg")</pre>
</div>
</div>]]></description>
  <link>https://sebastianardelean.codeberg.page/posts/2024-08-21-fractals-implemented-in-clojure/index.html</link>
  <guid isPermaLink="false">https://sebastianardelean.codeberg.page/posts/2024-08-21-fractals-implemented-in-clojure/index.html</guid>
  <pubDate>Wed, 21 Aug 2024 08:00:00 +0300</pubDate>
</item>
<item>
  <title>Latex Diff</title>
  <description><![CDATA[<div id="content"> <p>
Command to diff latex code when pictures/tables are inside a frame  <code>latexdiff --append-safecmd=subfile --config="PICTUREENV=(?:picture|DIFnomarkup|align|tabular)[\w\d*@]*" draft.tex revision.tex --flatten > diff_new.tex</code>
</p>
</div>]]></description>
  <link>https://sebastianardelean.codeberg.page/posts/2024-08-21-latexdiff/index.html</link>
  <guid isPermaLink="false">https://sebastianardelean.codeberg.page/posts/2024-08-21-latexdiff/index.html</guid>
  <pubDate>Wed, 21 Aug 2024 08:00:00 +0300</pubDate>
</item>
<item>
  <title>Create maps of member functions</title>
  <description><![CDATA[<div id="content"> <pre> <span class="org-preprocessor">#include</span>  <span class="org-string"><iostream></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><string></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><memory></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><functional></span>
 <span class="org-preprocessor">#include</span>  <span class="org-string"><map></span>
 <span class="org-keyword">class</span>  <span class="org-type">SomeObj</span>
{
     <span class="org-keyword">public</span>:
        <span class="org-type">void</span>  <span class="org-function-name">Run</span>(){
            <span class="org-type">fct_t</span>  <span class="org-variable-name">funct</span>;
            <span class="org-keyword">for</span> ( <span class="org-keyword">auto</span>  <span class="org-variable-name">entry</span>:functionsMap) {
               funct = entry.second;
               funct( <span class="org-string">"some string"</span>);
           }
       }
     <span class="org-keyword">private</span>:
         <span class="org-type">void</span>  <span class="org-function-name">myFunction</span>( <span class="org-keyword">const</span>  <span class="org-constant">std</span>:: <span class="org-type">string</span> & <span class="org-variable-name">str</span>)
        {
             <span class="org-constant">std</span>::cout<<str;
        }
         <span class="org-keyword">using</span>  <span class="org-type">fct_t</span> =  <span class="org-constant">std</span>:: <span class="org-type">function</span>< <span class="org-type">void</span>( <span class="org-keyword">const</span>  <span class="org-constant">std</span>:: <span class="org-type">string</span> &)>;
         <span class="org-keyword">const</span>  <span class="org-constant">std</span>:: <span class="org-type">map</span>< <span class="org-type">int</span>, <span class="org-type">fct_t</span>>  <span class="org-variable-name">functionsMap</span> = 
        {
                {1, <span class="org-constant">std</span>::bind(& <span class="org-constant">SomeObj</span>::myFunction,  <span class="org-keyword">this</span>,
                   <span class="org-constant">std</span>:: <span class="org-constant">placeholders</span>::_1)},
        };
};

 <span class="org-type">int</span>  <span class="org-function-name">main</span>() {
     <span class="org-type">SomeObj</span>  <span class="org-variable-name">obj</span>;
    obj.Run();

   <span class="org-keyword">return</span> 0;
}</pre>
</div>]]></description>
  <link>https://sebastianardelean.codeberg.page/posts/2024-08-21-maps-of-member-functions-in-cpp/index.html</link>
  <guid isPermaLink="false">https://sebastianardelean.codeberg.page/posts/2024-08-21-maps-of-member-functions-in-cpp/index.html</guid>
  <pubDate>Wed, 21 Aug 2024 08:00:00 +0300</pubDate>
</item>
<item>
  <title>Metaprogramming in Cpp</title>
  <description><![CDATA[<div id="content"> <h2> <a id="metaprogramming-collatz-conjecture" class="anchor" href="#metaprogramming-collatz-conjecture">¶</a>Metaprogramming Collatz conjecture</h2> <div class="outline-text-2" id="text-org0fccab1">
 <pre> <span class="org-keyword">template</span> < <span class="org-constant">std</span>:: <span class="org-type">uint64_t</span>,  <span class="org-constant">std</span>:: <span class="org-type">uint64_t</span>,  <span class="org-constant">std</span>:: <span class="org-type">uint64_t</span>>  <span class="org-keyword">struct</span>  <span class="org-type">CollatzHelper</span>;

 <span class="org-keyword">template</span>< <span class="org-constant">std</span>:: <span class="org-type">uint64_t</span>  <span class="org-type">A</span>,  <span class="org-constant">std</span>:: <span class="org-type">uint64_t</span>  <span class="org-type">B</span>>
 <span class="org-keyword">struct</span>  <span class="org-type">CollatzHelper</span>< <span class="org-type">A</span>, <span class="org-type">B</span>,1>: <span class="org-keyword">public</span>  <span class="org-type">CollatzHelper</span><(A*3+1), <span class="org-type">B</span>+1,(( <span class="org-type">A</span>*3+1)%2)>{};

 <span class="org-keyword">template</span>< <span class="org-constant">std</span>:: <span class="org-type">uint64_t</span>  <span class="org-type">A</span>,  <span class="org-constant">std</span>:: <span class="org-type">uint64_t</span>  <span class="org-type">B</span>>
 <span class="org-keyword">struct</span>  <span class="org-type">CollatzHelper</span>< <span class="org-type">A</span>, <span class="org-type">B</span>,0>: <span class="org-keyword">public</span>  <span class="org-type">CollatzHelper</span><(A/2), <span class="org-type">B</span>+1,(( <span class="org-type">A</span>/2)%2)>{};


 <span class="org-keyword">template</span> < <span class="org-constant">std</span>:: <span class="org-type">uint64_t</span>  <span class="org-type">B</span>>  <span class="org-keyword">struct</span>  <span class="org-type">CollatzHelper</span><1, <span class="org-type">B</span>,1>
{
     <span class="org-keyword">static</span>  <span class="org-keyword">constexpr</span>  <span class="org-constant">std</span>:: <span class="org-type">uint64_t</span>  <span class="org-variable-name">conj</span> = B;
};

 <span class="org-keyword">template</span>< <span class="org-constant">std</span>:: <span class="org-type">uint64_t</span>  <span class="org-type">A</span>>  <span class="org-keyword">struct</span>  <span class="org-type">Collatz</span>:  <span class="org-keyword">public</span>  <span class="org-type">CollatzHelper</span>< <span class="org-type">A</span>,0,A%2>{};</pre>
</div>
 <h2> <a id="metaprogramming-factorial" class="anchor" href="#metaprogramming-factorial">¶</a>Metaprogramming Factorial</h2> <div class="outline-text-2" id="text-orgda81661">
 <pre> <span class="org-keyword">template</span> < <span class="org-constant">std</span>:: <span class="org-type">uint64_t</span>  <span class="org-variable-name">N</span>>
 <span class="org-keyword">struct</span>  <span class="org-type">Fact</span>
{
     <span class="org-keyword">static</span>  <span class="org-keyword">constexpr</span>  <span class="org-constant">std</span>:: <span class="org-type">uint64_t</span>  <span class="org-variable-name">val</span> = N *  <span class="org-constant">Fact</span><N-1>::val;
};

 <span class="org-keyword">template</span><>
 <span class="org-keyword">struct</span>  <span class="org-type">Fact</span><0>
{
     <span class="org-keyword">static</span>  <span class="org-keyword">constexpr</span>  <span class="org-constant">std</span>:: <span class="org-type">uint64_t</span>  <span class="org-variable-name">val</span> = 1;
};</pre>
</div>
 <h2> <a id="metaprogramming-fibonacci" class="anchor" href="#metaprogramming-fibonacci">¶</a>Metaprogramming Fibonacci</h2> <div class="outline-text-2" id="text-orge9add6c">
 <pre> <span class="org-keyword">template</span>< <span class="org-constant">std</span>:: <span class="org-type">uint64_t</span>  <span class="org-variable-name">I</span>>
 <span class="org-keyword">struct</span>  <span class="org-type">Fib</span>
{
     <span class="org-keyword">static</span>  <span class="org-keyword">constexpr</span>  <span class="org-constant">std</span>:: <span class="org-type">uint64_t</span>  <span class="org-variable-name">val</span> =  <span class="org-constant">Fib</span><I-1>::val +  <span class="org-constant">Fib</span><I-2>::val;
};

 <span class="org-keyword">template</span> <>
 <span class="org-keyword">struct</span>  <span class="org-type">Fib</span><0>
{
     <span class="org-keyword">static</span>  <span class="org-keyword">constexpr</span>  <span class="org-constant">std</span>:: <span class="org-type">uint64_t</span>  <span class="org-variable-name">val</span> = 0;
};

 <span class="org-keyword">template</span> <>
 <span class="org-keyword">struct</span>  <span class="org-type">Fib</span><1>
{
     <span class="org-keyword">static</span>  <span class="org-keyword">constexpr</span>  <span class="org-constant">std</span>:: <span class="org-type">uint64_t</span>  <span class="org-variable-name">val</span> = 1;
};</pre>
</div>
</div>]]></description>
  <link>https://sebastianardelean.codeberg.page/posts/2024-08-21-metaprogramming-in-cpp/index.html</link>
  <guid isPermaLink="false">https://sebastianardelean.codeberg.page/posts/2024-08-21-metaprogramming-in-cpp/index.html</guid>
  <pubDate>Wed, 21 Aug 2024 08:00:00 +0300</pubDate>
</item>
<item>
  <title>Monte Carlo algorithms in OCaml</title>
  <description><![CDATA[<div id="content"> <h2> <a id="monte-carlo-integration" class="anchor" href="#monte-carlo-integration">¶</a>Monte Carlo Integration</h2> <div class="outline-text-2" id="text-org0507819">
 <pre>module type MonteCarlo_type=sig
  val initializePRNG:unit->unit
  val getRandomNumber:unit->float
  val approximate:(float->float)->float->float->int->int->float->float  
end

let rec approximate f a b n index value=
    if index=(n-1) then
      ((b-.a)/.(float_of_int index))*.value
    else
      let randVal=getRandomNumber() in
      let inInterval=a+.randVal*.(b-.a) in
      let fVal=f inInterval in
      approximate f a b n (index+1) (value+.fVal)

open Random
open MonteCarlo_type

module MonteCarlo:MonteCarlo_type=struct
  let initializePRNG ()=Random.self_init()
  let getRandomNumber ()=Random.float 1.0
  
  let rec approximate f a b n index value=
    if index=(n-1) then
      ((b-.a)/.(float_of_int index))*.value
    else
      let randVal=getRandomNumber() in
      let inInterval=a+.randVal*.(b-.a) in
      let fVal=f inInterval in
      approximate f a b n (index+1) (value+.fVal)
end

open MonteCarlo

let pi = 4.0 *. atan 1.0;;
let func (x:float)=sin x
let () = 
  MonteCarlo.initializePRNG();
  print_float (MonteCarlo.approximate func 0.0 pi 100000 0 0.0)</pre>
</div>
 <h2> <a id="monte-carlo-pi-estimation" class="anchor" href="#monte-carlo-pi-estimation">¶</a>Monte Carlo PI Estimation</h2> <div class="outline-text-2" id="text-org3cf4a4b">
 <p>
Formula to determine PI:
</p>

\begin{equation}
PI=4.0*\frac{hits}{darts thrown}
\end{equation}

 <pre>let rnd=System.Random(System.DateTime.Now.Millisecond)

let genRandomNumbers (count:int) =
    List.init count (fun _ -> rnd.NextDouble ())

let isInside (x:double) (y:double)=(sqrt (x*x+y*y))<1.0

let sum (x:^a list)=
    match (isInside (x.Head*2.0-1.0) (x.Tail.Head*2.0-1.0)) with
        | false->0
        | true-> 1

let rec computePi (numThrows:int) (hits:int) (idx:int)=
    if numThrows=idx then
        4.0*((double)hits/(double)numThrows)
    else
          computePi numThrows (hits+(genRandomNumbers 2 |> sum)) (idx+1)

[<EntryPoint>]
let main argv = 
    let l=computePi 1000000000 0 0
    printfn "%F" l
    0</pre>
</div>
</div>]]></description>
  <link>https://sebastianardelean.codeberg.page/posts/2024-08-21-monte-carlo-algorithms/index.html</link>
  <guid isPermaLink="false">https://sebastianardelean.codeberg.page/posts/2024-08-21-monte-carlo-algorithms/index.html</guid>
  <pubDate>Wed, 21 Aug 2024 08:00:00 +0300</pubDate>
</item>
<item>
  <title>Polynomial values in Haskell</title>
  <description><![CDATA[<div id="content"> <p>
For a polynomial  <b>p</b> of degree  <b>N</b>, this function returns the value:
</p>

\begin{equation}  
p_{0}*x^{N-1}+p_{1}*x^{N-2}+...+p_{N-2}*x+p_{N-1}
\end{equation}

 <pre>evalPoly::Double->[Double]->Double
evalPoly n xs=sum $ map (\e->e*n**fromIntegral ((length xs)-1-(fromJust $ elemIndex e xs))) xs</pre>

 <p>
Usage:
</p>

 <pre>>evalPoly 3 [-19,7,-4,6]
-456.0
>evalPoly 5 [3,0,1]
76.0</pre>
</div>]]></description>
  <link>https://sebastianardelean.codeberg.page/posts/2024-08-21-polynomial-values-in-haskell/index.html</link>
  <guid isPermaLink="false">https://sebastianardelean.codeberg.page/posts/2024-08-21-polynomial-values-in-haskell/index.html</guid>
  <pubDate>Wed, 21 Aug 2024 08:00:00 +0300</pubDate>
</item>
<item>
  <title>Simple GA in Clojure</title>
  <description><![CDATA[<div id="content"> <p>
Based on the implementation presented by  <a href="https://gist.github.com/lspector/1291789?fbclid=IwAR3NHmrqQVDgmPrtKg6L_nPCc70KCK2xsZ2h98k5-Cw7bN-2R96a0t6S6kc">Lee Spector</a>.
</p>

 <pre>(defn new-individual
                  "Function used for creating a new individual"
                  [genome-length]
                  {:genome (vec (repeatedly genome-length #(rand-int 2))) :fitness 0}
                  )
            (defn fitness-function 
                [genome, target]
                (Math/abs (- (reduce + genome) target))
            )

            (defn calculate-fitness
              [population, target]
              (letfn [(fitness-function-helper 
                  [individual, target]
                  (assoc individual :fitness (fitness-function (individual :genome) target))
              )]
                      (map (fn [individual] (#(fitness-function-helper individual target))) population)
              )

          )
          (defn get-best-individual [population]
                        (letfn [(better [i1 i2]
                                                (< (i1 :fitness) (i2 :fitness))
                                        )]
                                (first (sort better population))
                        )
        )
        (defn crossover
              [first-individual, second-individual, crossover-rate, target]
              (let [new-genome (mapv (fn [i1,i2] (let [crossover-probability (rand)]
                                              (cond
                                                  (<= crossover-probability crossover-rate) i1
                                                  :else i2
                                              )
                                          )
                                  ) 
                  (first-individual :genome) (second-individual :genome)
                      )]
                  {:genome new-genome :fitness (fitness-function new-genome target)}
              )

      )
      (defn mate-individuals [population, population-size, crossover-rate, target, tournament-size]
            (letfn [(tournament-selection [population, population-size, tournament-size, target]
                                    (loop [steps 0 new-population ()]
                                            (if (< steps tournament-size)
                                                    (recur (inc steps) (conj new-population (nth population ((comp rand-int -) population-size 2))))
                                                    (get-best-individual (calculate-fitness new-population target))
                                            )
                                    )
                    )]
                                    (loop [steps 0 new-population ()]
                                            (if (< steps population-size)
                                                    (let [i1 (tournament-selection population population-size tournament-size target)]
                                                            (let [i2 (tournament-selection population population-size tournament-size target)]
                                                                    (let [offs (crossover i1 i2 crossover-rate target)]
                                                                            (recur (inc steps) (conj new-population offs))
                                                                    )
                                                            )
                                                    )
                                                    new-population
                                            )
                                    )
            )
    )
    (defn mutate-population [population, population-size, genome-length, target]

                          (letfn [(mutate [individual, genome-length, target]
                                          (let [new-genome (assoc (individual :genome) (rand-int genome-length) (rand-int 2))]
                  {:genome new-genome :fitness (fitness-function new-genome target)}
                          )
                                  )]
                                  (loop [steps 0 new-population ()]
          (if (< steps population-size)
                  (recur (inc steps) (conj new-population (mutate (nth population steps) genome-length target)))
                  new-population
          )

      )

                          )


  )
  (defn evolve [population-size, genome-length, target, number-of-generations, crossover-rate, tournament-size]
(loop [generation 0 population (calculate-fitness (repeatedly population-size #(new-individual genome-length)) target) best {}]
        (if (and (< generation number-of-generations) (not= 0 (best :fitness)))


                                (let [offsprings (mate-individuals population population-size crossover-rate target tournament-size)]
                                        (let [new-population (mutate-population offsprings population-size genome-length target)]
                                                (let [best-individual (get-best-individual new-population)]
                                                        (do
                                                                (printf "Generation %s -> best individual %s%n" generation best-individual)

                                                                (recur (inc generation) new-population best-individual)
                                                        )
                                                )
                                        )

                                )
                                best
        )

)
)

(println (evolve 100 100 1 100 0.3 10))</pre>
</div>]]></description>
  <link>https://sebastianardelean.codeberg.page/posts/2024-08-21-simple-ga-in-clojure/index.html</link>
  <guid isPermaLink="false">https://sebastianardelean.codeberg.page/posts/2024-08-21-simple-ga-in-clojure/index.html</guid>
  <pubDate>Wed, 21 Aug 2024 08:00:00 +0300</pubDate>
</item>
<item>
  <title>Thread-safe Singleton Design Pattern</title>
  <description><![CDATA[<div id="content"> <pre> <span class="org-keyword">class</span>  <span class="org-type">Singleton</span> {
 <span class="org-keyword">public</span>:
   <span class="org-keyword">static</span>  <span class="org-constant">std</span>:: <span class="org-type">shared_ptr</span>< <span class="org-type">Singleton</span>> & <span class="org-function-name">GetInstance</span>() {
     <span class="org-keyword">static</span>  <span class="org-constant">std</span>:: <span class="org-type">shared_ptr</span>< <span class="org-type">Singleton</span>>  <span class="org-variable-name">instance</span> =  <span class="org-constant">nullptr</span>;
     <span class="org-keyword">if</span> ( <span class="org-negation-char">!</span>instance) {
       <span class="org-constant">std</span>:: <span class="org-type">lock_guard</span>< <span class="org-constant">std</span>:: <span class="org-type">mutex</span>>  <span class="org-variable-name">lock</span>( <span class="org-constant">Singleton</span>::_mutex);

       <span class="org-keyword">if</span> ( <span class="org-negation-char">!</span>instance) {
        instance.reset( <span class="org-keyword">new</span>  <span class="org-type">Singleton</span>());
      }

    }
     <span class="org-keyword">return</span> instance;
  }
 
  ~ <span class="org-function-name">Singleton</span>() {}
 <span class="org-keyword">private</span>:
     <span class="org-function-name">Singleton</span>() {
    }
   <span class="org-function-name">Singleton</span>( <span class="org-keyword">const</span>  <span class="org-type">Singleton</span> &) =  <span class="org-keyword">delete</span>;
   <span class="org-function-name">Singleton</span>( <span class="org-type">Singleton</span> &&) =  <span class="org-keyword">delete</span>;
   <span class="org-type">Singleton</span> & <span class="org-keyword">operator</span> <span class="org-function-name">=</span>( <span class="org-keyword">const</span>  <span class="org-type">Singleton</span> &) =  <span class="org-keyword">delete</span>;
   <span class="org-type">Singleton</span> & <span class="org-keyword">operator</span> <span class="org-function-name">=</span>( <span class="org-type">Singleton</span> &&) =  <span class="org-keyword">delete</span>;
   <span class="org-keyword">static</span>  <span class="org-constant">std</span>:: <span class="org-type">mutex</span>  <span class="org-variable-name">_mutex</span>;
};

 <span class="org-constant">std</span>:: <span class="org-type">mutex</span>  <span class="org-constant">Singleton</span>:: <span class="org-variable-name">_mutex</span>;</pre>
</div>]]></description>
  <link>https://sebastianardelean.codeberg.page/posts/2024-08-21-thread-safe-singleton-design-pattern-in-cpp/index.html</link>
  <guid isPermaLink="false">https://sebastianardelean.codeberg.page/posts/2024-08-21-thread-safe-singleton-design-pattern-in-cpp/index.html</guid>
  <pubDate>Wed, 21 Aug 2024 08:00:00 +0300</pubDate>
</item>
</channel>
</rss>
