Welkom bij "Scanframe"

With over 20 years of experience, I am a highly skilled and driven application developer. I've worked with a wide range of platforms, frameworks, languages, and tools, and there are few programming challenges I can’t tackle. I have taken responsibility for every stage of application development, from requirements gathering to testing and user training. I'm known for my dedication—I don’t stop until I am completely satisfied with the result.


What I enjoy most is learning new things, combining them, and applying them to benefit the projects I’m working on. As a self-taught professional, I often adopt effective methods from others, enhancing both my efficiency and that of those who rely on my work.

I always keep the bigger picture in mind when working. With everything I do, I ensure it’s transferable, which benefits me when I need to revisit my own work and may not remember all the details.

In my experience, efficiency in the work process is often lacking. Even with an Agile Scrum process in place, there is often a lack of, or incomplete, documentation and conventions for handling epics and tasks. Establishing clear conventions for coding, directory structures, code styling, and in-code documentation is crucial to improving both efficiency and transferability.


Expertise in Software Development

Over the years I gained experience in some subjects.

  • C/C++/C++17/C++20 (JetBrains CLion, VSCode, Eclipse, Borland C++ Builder)
  • C++ Qt, STL libraries
  • CMake/CTest/CPack(3.27) with presets
  • Git, GitLab, Subversion version management
  • GitLab CI/CD-pipeline and Runners configuration
  • Docker building images for GitLab-runner
  • Pascal (Delphi, Pegasus)
  • PHP(4/5/7/8) (Eclipse / JetBrains PhpStorm)
  • HTML5 / CSS3 (less/sass)
  • JavaScript (TypeScript, jQuery, React, Babel)
  • Python 3.8/3.10
  • SQL (MySQL/MSSQL/SQLite)
  • SOAP/REST
  • SVG/GDI 2D graphical data presentation/reporting
  • Apache/nginx/IIS Web-servers + SSL
  • Java (Eclipse IDE/IntelliJ)
  • C# (Windows/Linux Mono / JetBrains Rider)
  • LDAP (OpenLDAP)
  • TCP/UDP IPX/SPX Sockets (Linux/Windows)
  • C++ Multi-threaded applications
  • OpenGL 3D calculations/presentation
  • Linux and Windows OS
  • Data acquisition devices/digitizers interfacing and development
  • Ultrasonic testing (UT) technology and analysis
  • Eddy current testing (ET) technology and analysis
  • Motion controllers for 3D manipulator
  • Agile Scrum

Inspection Systems

Inspection systems need to follow the TO (Technical Order) set by the manufacturers of the parts. Calibration of the system before and after a part inspection are essential for a successful result. This is fully automated and operators start an inspection project and respond to system requests only to change heads for example. After the inspection analysis of the data is also automated. The operator confirms found defects by moving allowing the system to automatically move to a defect position to finding its highest amplitude.

Double bridged Ultrasonic and Eddy-current scanning system for jet engine parts

Eddy-current inspection system for jet engine parts

Ultrasonic inspection system for jet engine parts

Ultrasonic inspection system for jet engine parts

Ultrasonic inspection system for jet engine parts

Hydraulic test stand for F16 fighter jet parts


Applications

Web Applications

Wen I started out programming using in PHP4 there where no real frameworks that suited. So I developed my own framework that is using PHP7 now which has:

  • Fields used i.e. in databases, dialogs and presentations are described in a single location and referred to by all parts of the application that uses the field. Described field properties are: long-name, short-name, unit, format (date, euro), minimum, maximum, rounding, states and description et cetera.. States are predefined named values combinations out of which it can be selected by using a radio button or dropdown list. Translation is also performed by the field interface.
  • Database query results are easily presented in tables and are able to paginate and queried on client side. Client side queries are configuring client side column filters and then performed server side.
  • Input dialogs/wizards are easily created using only the reference of a field to create inputs in a form.

C++ Applications

I started out programming C++ for MS-DOS operating system using Borland C++ 3.1 IDE and compiler. Over the years Windows was introduced and moved to Borland C++ 5.0 using its OWL (Object Windows Library) in a time where Microsoft still had to develop its MFC library. Gradually I moved to Borland C++ Builder which was Borland Delphi under the hood.

The legacy application I worked on were intended for inspection systems and adding a single setting in an application took a few month of programming and testing which was unacceptable. So I set out to develop a settings interface in which all information about each setting could be retrieved by a referencing identifier.

A setting in an application was provided by server and used by a client like edit control on screen. The interface also provided in a transport of the value from client to server and vice versa in an event driven way. Doing so writing and reading settings in the application was just iterating in the settings list of the application. A newly introduced setting by a server module in the application was automatically saved in the settings file. Because of the interface a side effect was module separation/isolation. This made recompiling the code after a change much faster.

Settings alone was not sufficient as for data that was still as spaghetti linking almost each part of the code. For this I developed a similar event driven interface where servers add data entries to referenced by an identifier.

At the time system memory was limited and using large pre allocated chucks of memory made a system sluggish. So having that in mind, clients are able to access the data through the interface on request to the server if the requested data part is not yet accessible. The server which can be an acquisition module in case of an acquisition application or file reading module in case of an analysis application. The underlying mechanism uses file mapping to only have that part of memory available which is needed. The result is that a system with only 200MB of memory available to the application was able to acquire a multiple of that size.

Having realized both interfaces modules for transforming/filtering the data like FFT (Fast Fourier Transform) for instance to generate spectrum data from time sample data. A filter module has settings and result data as client input and data and settings as server output which can then be linked to presentation controls on screen.

Finally the screen layout needed to be modular and configurable as well. Borland C++ Builder/Delphi VCL made this possible. It allowed to save and load a design forms at run-time. This meant creating all controls needed for acquisition and analysis applications. Controls for settings like: Edit, Multi-line Edit, Dropdown, Edit Combo. As for the resulting data controls for an A-scan (Amplitude), B-scan (Color coded amplitude), C-scan (Color coded max amplitude/time-of-flight).

Since all the code mentioned is written for Borland C++ (Builder) and so bound to Windows only, I started to see if it is conceptually possible to use the cross-platform Qt6 library to build an application for Linux as well as Windows.

This resulted in an open source Git repository (documentation).
The project uses a common Git-module to share the burden of DevOps on C++ projects.
A tiny 'Hello World' (documentation) project is created as boilerplate/skeleton project also to test all its features:

  • Docker image compiling and testing Qt for Linux and Windows (Wine)
  • CMake presets and workflows
  • CLang format check on commits and merge requests
  • GitLab pipeline triggering child pipelines
  • Coverage reporting and upload to Nexus
  • Linux APT/RPM packaging and versioned upload to the Nexus APT-repository
  • Windows ZIP/EXE packaging and versioned upload to the Nexus shared raw repository
  • Minio S3 pipeline caching between jobs.
  • Semantic versioning using conventional commits to version bump
  • Versioning of dynamic librairies using appropriate release version tag
  • Console build script with optional selection menu.

Some of the project are also mirrored from my hosted GitLab into GitHub.

  • sf-cmake: Library for each C++ project which automates use of CMake, CTest & CPack with presets. Provides Qt project linking and offers code manual generation using DoxyGen . .
  • sf-docker-runner: Scripts to run a GitLab-Runner using Docker in Docker and MinIO self-hosted caching server.
  • sf-gitlab-devops: DevOps trail/template project with CI/CD pipeline.
  • sf-mod-app: Modular concept application in C++ and Qt.
  • SingleInstance: Qt6 replacement of QtSingleApplication for Qt5 with support for instance communication.
  • sf-cygwin-bin: Cygwin bash shell scripts for making things easier using git, ssh and an X11 server for remote X11 applications. Used by cloning into '~/bin'. See this demo video.
  • dev-tools: Development tools written in Python.
    Featuring a tool to cleaning up (removing) GitLab pipeline jobs and a tool to version bump according conventional commits using the GitLab API.

I created a Wiki to store mainly information on application configuration and organisation issues (document management).

To be able to find pages in the wiki or manual everything a private search engine is available.


Contact

U kunt mij bereiken door mij een e-mail te sturen of te bellen.
info@scanframe.nl
036-5230283 / 06-57786444
LinkedIn.

Mijn adres is:
Valetaweg 42
1326MD Almere.