<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>Dimitris Dranidis</title><link>https://dranidis.gr/</link><description>Recent content on Dimitris Dranidis</description><generator>Hugo -- 0.146.0</generator><language>en-us</language><lastBuildDate>Fri, 13 Sep 2024 19:24:15 +0300</lastBuildDate><atom:link href="https://dranidis.gr/index.xml" rel="self" type="application/rss+xml"/><item><title>API changes should be Backward Compatible until all clients use the updated version</title><link>https://dranidis.gr/posts/backwards-compatible-apis/</link><pubDate>Fri, 13 Sep 2024 19:24:15 +0300</pubDate><guid>https://dranidis.gr/posts/backwards-compatible-apis/</guid><description>&lt;p>Whether you are in the middle of the development, or in the maintenance of a project involving several services, you should never introduce a &amp;ldquo;breaking&amp;rdquo; change in the way that systems interact. Instead, you should keep all clients working by providing an API with changes that are backward compatible, marking old usage as deprecated, so both &amp;lsquo;old&amp;rsquo; and &amp;rsquo;new&amp;rsquo; clients can use the API without issues. Once all the clients use only the new API, then and only then you can remove the deprecated parts of the API.&lt;/p></description></item><item><title>Where do interfaces belong? Clients or implementations?</title><link>https://dranidis.gr/posts/where-do-interfaces-belong/</link><pubDate>Thu, 14 Mar 2024 13:50:16 +0200</pubDate><guid>https://dranidis.gr/posts/where-do-interfaces-belong/</guid><description>&lt;p>I was recently involved, once again, in a debate about:&lt;/p>
&lt;blockquote>
&lt;p>&amp;ldquo;&lt;em>Where do interfaces belong? With their clients or their implementations?&lt;/em>&amp;rdquo;.&lt;/p>&lt;/blockquote>
&lt;p>Searching the Internet for the same question displays many results and presents different opinions about the topic. In many cases, the answer is the usual one: &amp;ldquo;&lt;em>It depends!&lt;/em>&amp;rdquo;. I will try to present &amp;ldquo;my&amp;rdquo; personal view about the topic. Of course, my view is not unbiased; I am certainly influenced by the suggestions of many experts in the field, but my personal work on projects comes to solidify this opinion.&lt;/p></description></item><item><title>Immutability increases Code Simplicity</title><link>https://dranidis.gr/posts/immutability-increases-code-simplicity/</link><pubDate>Sun, 21 Jan 2024 15:15:02 +0200</pubDate><guid>https://dranidis.gr/posts/immutability-increases-code-simplicity/</guid><description>&lt;p>&lt;img alt="mutation" loading="lazy" src="https://dranidis.gr/posts/mutability.png">&lt;/p>
&lt;p>Immutability has many advantages, as many functional programming proponents will argue. Just to mention a few, immutable classes are side effect free and are easily testable. I am not going to go into the details of listing all the advantages of immutability in this short article. I will focus mainly on the effects on code simplicity and code comprehension.&lt;/p>
&lt;p>Recently, I revisited one of my older projects and by examining the code, I found that a class could be immutable, or its objects could be value objects using Domain Driven Development (DDD) terminology. According to Martin Fowler, who probably came up first with the term, a value object is:&lt;/p></description></item><item><title>Test coverage reports are not only for reporting coverage percentages</title><link>https://dranidis.gr/posts/test-coverage/</link><pubDate>Tue, 09 Jan 2024 15:35:58 +0200</pubDate><guid>https://dranidis.gr/posts/test-coverage/</guid><description>&lt;h2 id="what-is-a-test-coverage-report">What is a test coverage report?&lt;/h2>
&lt;p>A test coverage report provides information about the extent to which a software application has been tested. It measures the code coverage achieved by a set of test cases, indicating which parts of the code have been executed during testing and which parts remain untested.&lt;/p>
&lt;p>Test coverage is often expressed as a percentage and can refer to various aspects of the code, such as statements, branches, functions, etc. Here are some common types of test coverage:&lt;/p></description></item><item><title>Define your Fluent Interface (DSL) to improve the readability of your tests</title><link>https://dranidis.gr/posts/define-your-dsl-for-tests/</link><pubDate>Wed, 20 Dec 2023 14:06:46 +0200</pubDate><guid>https://dranidis.gr/posts/define-your-dsl-for-tests/</guid><description>&lt;p>Although everybody agrees that automated testing is essential for achieving high software quality, writing tests cases is not always easy. Especially, setting up the test scenarios that involve the initialization of many objects can be difficult. I recently started using the concepts of fluent interfaces and DSL languages for writing my tests in such cases. Using this approach, tests become easier to write and more importantly much easier to read understand.&lt;/p></description></item><item><title>Load testing Socket.IO servers using msgpack-parser with Gatling</title><link>https://dranidis.gr/posts/gatling-socketio-msgpack/</link><pubDate>Sat, 18 Nov 2023 14:39:05 +0200</pubDate><guid>https://dranidis.gr/posts/gatling-socketio-msgpack/</guid><description>&lt;p>In this post I will show how we can connect with Gatling to a Socket.IO server which uses a custom parser using the MessagePack serialization format.&lt;/p>
&lt;p>This is the second post about Socket.IO testing with Gatling.
In the first post:&lt;/p>
&lt;ul>
&lt;li>&lt;a href="https://dranidis.gr/posts/gatling-socketio">Load testing Socket IO with Gatling&lt;/a>&lt;/li>
&lt;/ul>
&lt;p>I showed an example of connecting to a Socket.IO server using the default parser which uses text messages.&lt;/p>
&lt;h2 id="what-is-messagepack">What is MessagePack?&lt;/h2>
&lt;p>MessagePack is a binary serialization format. It has the advantage that payloads are usually smaller especially if they contain many numbers. The disadvantage is that Socket.IO messages serialized with MessagePack are harder to debug in the Network tab of the browser.&lt;/p></description></item><item><title>JSXM</title><link>https://dranidis.gr/projects/jsxm/</link><pubDate>Sun, 12 Nov 2023 19:22:34 +0200</pubDate><guid>https://dranidis.gr/projects/jsxm/</guid><description>&lt;p>JSXM (&lt;a href="http://jsxm.org/">http://jsxm.org/&lt;/a>) is a model-based testing tool developed in Java. One needs to provide a model specification of a system and the generated test cases reveal all functional inconsistencies in the implementation of the system.&lt;/p>
&lt;p>The tool provides the following functionalities:&lt;/p>
&lt;ul>
&lt;li>Model animation&lt;/li>
&lt;li>Test generation&lt;/li>
&lt;li>Test transformation&lt;/li>
&lt;/ul>
&lt;h2 id="model-animation">Model animation&lt;/h2>
&lt;p>Animation of the model means execution of the model or simulation of the modeled software. Interactive or batch animation allow the model designer to validate the specification, i.e. ensure that the correct functionality is modeled.&lt;/p></description></item><item><title>StudentUML</title><link>https://dranidis.gr/projects/studentuml/</link><pubDate>Sun, 12 Nov 2023 19:22:34 +0200</pubDate><guid>https://dranidis.gr/projects/studentuml/</guid><description>&lt;p>StudentUML is a UML diagram tool for students. The main characteristics of the tool are:&lt;/p>
&lt;ul>
&lt;li>simplicity&lt;/li>
&lt;li>consistency checking&lt;/li>
&lt;/ul>
&lt;p>The tool has been developed by several CITY college students and then maintained and further developed by me.&lt;/p>
&lt;p>StudentUML is written in Java as a Swing desktop application. Prolog is used for declaring the rules for consistency checking.&lt;/p>
&lt;h2 id="download-studentuml">Download StudentUML&lt;/h2>
&lt;p>StudentUML can be downloaded from &lt;a href="https://github.com/dranidis/studentuml">github&lt;/a>.&lt;/p></description></item><item><title>Load testing Socket IO with Gatling</title><link>https://dranidis.gr/posts/gatling-socketio/</link><pubDate>Sun, 12 Nov 2023 16:08:41 +0200</pubDate><guid>https://dranidis.gr/posts/gatling-socketio/</guid><description>&lt;p>This article will hopefully save you some of the trouble I had, when I tried to use Gatling for Socket.IO sockets. Gatling has support for web sockets but one has to do a lot of research and workarounds in order to make it work with Socket.IO sockets.&lt;/p>
&lt;h1 id="what-are-gatling-and-socketio">What are Gatling and Socket.IO?&lt;/h1>
&lt;p>Gatling is a powerful load-testing solution for applications, APIs, and microservices (&lt;a href="https://gatling.io/)">https://gatling.io/)&lt;/a>.&lt;/p>
&lt;p>Socket.IO is a library that enables low-latency, bidirectional and event-based communication between a client and a server (&lt;a href="https://socket.io/docs/v4/)">https://socket.io/docs/v4/)&lt;/a>. The Socket.IO connection can be established with different low-level transports and one of them are web sockets. Socket.IO uses the web socket protocol as one of the underlying protocols for bidirectional communication.&lt;/p></description></item><item><title>Creating my personal page with Hugo</title><link>https://dranidis.gr/posts/hugo/</link><pubDate>Sun, 12 Nov 2023 12:11:12 +0200</pubDate><guid>https://dranidis.gr/posts/hugo/</guid><description>&lt;p>Today I decided to FINALLY create my personal page (the page you are reading right now) with a static page creation tool. I picked &lt;a href="https://gohugo.io/">Hugo&lt;/a> after some research. I liked the facts that it is fast, written in Go (I like Go!), it offers full customization and you don&amp;rsquo;t need to install anything apart from the application itself which is available in all platforms.&lt;/p>
&lt;p>In the rest of the post, I want to share with you some of the instructions I have followed while creating the site.&lt;/p></description></item><item><title>Who am I?</title><link>https://dranidis.gr/about/</link><pubDate>Sat, 11 Nov 2023 16:08:41 +0200</pubDate><guid>https://dranidis.gr/about/</guid><description>&lt;p>I am &lt;strong>Dimitris Dranidis&lt;/strong>, a Principal Software Engineer, Quality Architect, and a Computer Science Educator.&lt;/p>
&lt;p>Passionate about quality, I focus on clean architecture, test-driven development, model-based and contract testing, and continuous improvement. I have extensive experience refactoring complex systems, integrating quality monitoring platforms, and building tools that enhance reliability, maintainability, and developer productivity. As a mentor and collaborator, I cultivate a cross-team quality culture, support professional growth, and contribute to both open-source software and academic research, consistently delivering maintainable, high-quality solutions across enterprise and educational environments.&lt;/p></description></item><item><title>Database is not memory - ORM - JPA</title><link>https://dranidis.gr/posts/database-is-not-memory-orm-jpa/</link><pubDate>Sat, 24 Oct 2009 12:42:16 +0200</pubDate><guid>https://dranidis.gr/posts/database-is-not-memory-orm-jpa/</guid><description>&lt;blockquote>
&lt;p>Note&lt;/p>
&lt;p>This is a really old article I have written in blogger.com.
It appears as it has been posted. Probably many things are different not at the time of editing (Nov 2024)&lt;/p>&lt;/blockquote>
&lt;p>This post discusses experiences gathered and realizations made while trying to implement &lt;strong>Object-Relational Mapping&lt;/strong> (ORM) for a Java application using &lt;a href="http://wiki.eclipse.org/EclipseLink">EclipseLink JPA&lt;/a> (Java Persistence API).&lt;/p>
&lt;p>The application is a Java implementation of the Payroll case study found in the &lt;strong>&amp;ldquo;Agile Software Development&amp;rdquo;&lt;/strong> book by R.C. Martin.&lt;/p></description></item></channel></rss>