martedì 6 febbraio 2024

When Delphi could be Case Sensitive?

 This morning, on compiling my Delphi source code, I received an hint:

Override method %s.%s should match case of ancestor %s.%s

The scenario that produces this hint, is the following:


In this case, Class2 inherits from Class1; in Class1, the Virtual Method is declared using a Pascal Case form. In Class2 the inherited method is writed in plain form. The Hint, says that is a good practice to use the same form on declaring method.

For info about this kind of hints, look at Embarcadero Delphi DocWiki

#codinglikeacoder

giovedì 18 gennaio 2024

Gli Algoritmi Genetici

 E' proprio il caso di dirlo: a volte ritornano!

In bit Time Professionals  ci siamo trovati a dover elaborare una strategia per risolvere uno annoso problema che spesso si presenta senza preavviso nella nostra vita di Informatici: l'ottimizzazione nella suddivisione delle risorse.

Come spesso accade, dopo analisi e confronti attorno a possibili soluzioni implementative, abbiamo individuato il processo risolutivo da implementare : sviluppiamo un algoritmo genetico!

E così è stato: è stato implementato un algoritmo genetico in Python e su questo si stanno facendo test, simulazioni e misurazioni, al fine di verificarne la 'bontà applicativa'.

Perchè 'a volte ritornano'?

Perchè Algoritmi Genetici è stata una delle materie del mio corso Universitario. E m'è piaciuta tanto. Conservo ancora il Floppy Disk con il progetto d'esame.




Spesso, ci si interrogava su quel che studiavamo e se quel che studiavamo l'avremmo un giorno applicato.

Ebbene si: quel giorno è arrivato!


Sul nostro blog aziendale di bit Time Professionals, c'è un articolo che introduce il lettore agli Algoritmi Genetici. 
Lo si trova qui: Algoritmi genetici e ottimizzazione delle risorse

Buona lettura!

#staytuned

#codinglikeacoder

mercoledì 8 novembre 2023

RAD Studio 12 and Skia

[UPDATE]

What I'm going to describe here is due to the fact that I had have installed the Skia version 5.
In Skia vers. 6, the units are been changed as in Rad Studio 12.

Thanks to Glenn Dufke for the info.

[END UPDATE] 

RAD Studio 12 has been released and one of the most important feature is the Skia integration in it.

I have a Delphi project that use some Skia animation; opening it with Rad Studio 12, it don't compile: Skia components (and libraries) are not recognized.

Cause the integration, something has changed: Skia's classes definition are been moved in new units:

from:  Skia.pas, Skia.Vcl.pas

to: System.Skia.pas, Vcl.Skia.pas

For my project, only this change has been necessary to solve my problem.

For a retro-compatibility, I, quickly, have only added this lines to my code:

{$IFDEF VER360}

  , System.Skia, Vcl.Skia

{$ELSE}

  ,  Skia, Skia.Vcl

{$ENDIF} 

That's all!


#codinglikeacoder

mercoledì 20 settembre 2023

[English] DMVCFramework Gotcha #1: Object Pool explained

 One aspect related to the performance of an application that is often overlooked is the overhead in the execution of specific tasks. Overhead is influenced by various factors. One of these factors, in the context of OOP (Object-Oriented Programming), is the time it takes to create an object: when we create an object, the process of creation and initialization can be more or less time-consuming depending on the complexity of the object and the initialization process of its attributes. The repeated creation and destruction of this object negatively impact the runtime of both the individual process and the entire application as a whole.

One possible solution to this problem would be to have pre-created objects available, for which we do not have to worry about their lifecycle.

One of the Design Patterns belonging to the category of Creational Design Patterns is the Object Pool. According to its definition:

The Object Pool is a creational design pattern, which is one of those patterns applicable to resolving performance issues related to the initialization process of the components (classes) that make up our system.

The underlying concept of the Object Pool can be summarized by describing a process in which a client, in need of an instance of a class, requests it from the Pool. The Pool, upon the request, 'checks' if it has an instance of that class available to fulfill the request. If the instance is available in the pool, it is returned; if the instance is not available, the Object Pool, which knows the method for creating the instance, creates a new one and returns it.

When the client finishes using the obtained instance, it returns that instance to the Pool, which does not destroy it but makes it available for future requests.

This process is cyclical and, in the best case scenario, helps reduce the overhead derived from creating an instance when it is already present in the pool.

DMVCFramework, the RESTful Framework, JSON-RPC, and ActiveRecord for Delphi maintained by Daniele Teti and the DMVCFramework team, has many small but important features that may be lesser-known. One of these is the implementation of the ObjectPool.

The unit MVCFramework.ObjectPool.pas, present in DMVCFramework, defines a class that implements the Object Pool as the pattern defines it:

```delphi

TObjectPool<T: class, constructor> = class(TInterfacedObject, IObjectPool<T>)

```

The (generic) class TObjectPool implements the IObjectPool<T: class, constructor> interface. IObjectPool requires the implementation of two specific methods for pooling:

```delphi

function GetFromPool(const RaiseExceptionIfNotAvailable: Boolean = False): T;

procedure ReleaseToPool(const Obj: T);

```

`GetFromPool()` is called to obtain an object from the Pool, and `ReleaseToPool()` is called to release and return the object instance to the Pool.

An instance of the TObjectPool class is obtained by invoking the class function `CreatePool()` of the TPoolFactory class, defined as follows:

Note the `Factory: TFunc<T>` parameter of `CreatePool()`: it represents the constructor of the class that specializes the pool. It will be used by the pool when it receives a request and no instances are available.

At this point, I will show in the following code an example of how this is applied:

1) Define a pool for the TClientDataset class:

           2) Utilizziamo l'istanza:

With these simple instructions, we have delegated the creation and management of the lifecycle of our objects to the Pool.

To complete this introduction, I would like to draw attention to two features of the Object Pool present in DMVCFramework:

- The Pool has a size: POOL_SIZE indicates the maximum number of instances maintained in the pool (however, instances consume memory!)

- A thread is implemented; it periodically cleans the pool of instances based on the configured Shrink values.

To conclude, it's worth noting that there is also the unit MVCFramework.IntfObjectPool, which similarly implements an ObjectPool for interfaces. 


#codinglikeacoder

sabato 16 settembre 2023

Lezione della settimana #1

 In questo sabato mattino, ho ancora in testa il progetto al quale sto lavorando. L'averlo ancora in testa è per me sintomo del fatto che non è ancora terminato e che quel che c'è da fare non è completamente definito nel mio cervellino.

Una riflessione l'ho fatta anche su ciò che questa settimana mi ha 'lasciato'.

Questa settimana ho imparato una (nuova, forse saputa e risaputa ma spesso dimenticata) lezioncina:

"basa quel che fai su ciò che è e non su ciò che potrebbe essere"

Sipario.

#codinglikeacoder

 

martedì 29 agosto 2023

DMVCFramework Gotcha #1: Object Pool explained

Uno degli aspetti relativi alle performance di un applicativo che spesso non viene attenzionato, è l'overhead nell'esecuzione di specifici task.
L'overhead è influenzato da diversi fattori. Uno di questi, in ambito OOP,  è il tempo di creazione di un oggetto: quando creiamo un oggetto, il processo di creazione e inizializzazione può risultare più o meno lungo in funzione della complessità dell'oggetto e del processo di inizializzazione dei suoi attributi. La ripetuta creazione e distruzione di questo oggetto, influenza negativamente il tempo di runtime di tutto il singolo processo e dell'intera applicazione nel suo complesso.

Una possibile soluzione a questo problema, sarebbe quella di avere a disposizione oggetti già creati e per i quali non dobbiamo preoccuparci del loro ciclo di vita.

Uno dei Design Patterns appartenente alla categoria dei Creational Design Pattern, è l'Object Pool.
Dalla sua definizione:

l'Object Pool è un creational design pattern, ovvero uno di quei pattern applicabile per la risoluzione di problematiche di performance legate al processo di inizializzazione delle componenti (classi) di cui il nostro sistema si compone.

Il concetto alla base dell'Object Pool si può sintetizzare descrivendo un processo durante il quale un client, che necessita una istanza di una classe, chiede al Pool di fornirgliela. Il Pool, alla richiesta, 'verifica' se ha una istanza di detta classe disponibile per soddisfare la richiesta. Se l'istanza è disponibile nel pool, viene restituita; se l'istanza non è disponibile, l'Object Pool, che conosce il metodo utile alla creazione dell'istanza, ne crea una nuova e la restituisce.
Quando il client termina l'utilizzo dell'istanza ottenuta, la restituisce al Pool che non la distrugge ma la rende disponibile per le future richieste.

Questo processo è ciclico e permette, nel migliore dei casi, di abbattere l'overhead derivato dalla creazione dell'istanza quando questa è già presente nel pool.

DMVCFramework, il Framework RESTfulJSON-RPC e ActiveRecord per Delphi mantenuto da Daniele Teti e il team di DMVCFramework,  ha tante piccole, ma importanti, features forse poco conosciute. Una di questa è l'implementazione dell'ObjectPool.

La unit MVCFramework.ObjectPool.pas presente in DMVCFramework definisce una classe che implementa l'Object Pool così come il pattern lo definisce:

TObjectPool<T: class, constructor> = class(TInterfacedObject, IObjectPool<T>)

La classe (generica) TObjectPool, implementa l'interfaccia IObjectPool<T: class, constructor>
IObjectPool richiede l'implementazione di due specifici metodi per il pooling:

function GetFromPool(const RaiseExceptionIfNotAvailable: Boolean = False): T;
procedure ReleaseToPool(const Obj: T);

GetFromPool() è invocata per ottenere un oggetto dal Pool; ReleaseToPool() è invocata per rilasciare e restituire l'istanza dell'oggetto al Pool.

L'istanza della classe TObjectPool è ottenuta invocando la class function CreatePool() della classe TPoolFactory definita così:

Da notare il parametro Factory : TFunc<T> della CreatePool(): esso rappresenta il costruttore della classe che specializza il pool. Esso sarà utilizzato dal pool quando riceverà una richiesta e non vi saranno istanze disponibili.

A questo punto, mostro nel codice che segue, l'applicazione di quanto descritto con un esempio:

1) Definiamo un Pool per la classe TClientDataset:

           2) Utilizziamo l'istanza:

Con queste semplici istruzioni, abbiamo delegato al Pool la creazione e la gestione del ciclo di vita dei nostri oggetti.

A completamento di questa introduzione, pongo l'attenzione su due caratteristiche dell'Object Pool presente in DMVCFramework:
 - Il Pool ha una dimensione: POOL_SIZE indica il numero massimo di istanze mantenute nel pool (le istanze, comunque, occupano memoria!)
 - E' implementato un thread che periodicamente interviene per ripulire il pool da istanze in funzione dei valori di Shrink impostati.

Per completare, è utile sapere che esiste anche la unit MVCFramework.IntfObjectPool che in maniera analoga implementa un ObjectPool per le Interfacce.

#codinglikeacoder



When Delphi could be Case Sensitive?

 This morning, on compiling my Delphi source code, I received an hint: Override method %s.%s should match case of ancestor %s.%s The scenari...