C++ creare un array di oggetti usando std::vector

Creare array di oggetti in c++ crea sempre qualche problema nella gestione della memoria e nella chiamata ai costruttori.

Infatti una definizione del tipo

Oggetto array[100];

creerà un array di puntatori a 100 oggetti del tipo Oggetto richiamando per ciascuno di essi il costruttore senza parametri. Questo non è sempre corretto. Un’alternativa sarebbe definire l’array come array di puntatori, come di seguito:

Oggetto *array[100]

Questa istruzione creerà un array di puntatori a aree di memoria non inizializzate con nessun oggetto. Con un ciclo si dovranno poi costruire gli oggetti a uno a uno.

Questo schema prevede una gestione della memoria manuale, con il rischio di leak di memoria.

Le nuove specifiche richiedono di utilizzare i contenitori standard, in particolare std::vector. Questo contenitore richiede un po’ di gestione in più, con i relativi costruttori di copie e gli operatori move.

Ovviamente si potrà usare un’istruzione del tipo:

std::vector<Oggetto> array;

creando poi i vari oggetti a uno a uno. In alternativa si può usare un contenitore di puntatori, facendo attenzione che siano puntatori smart.

Suggerimenti per evitare in modo sicuro perdite di memoria

Piuttosto che utilizzare un std::vector di puntatori nudi, utilizzare una raccolta di oggetti std::unique_ptr:
//THIS CREATES VECTOR
std::vector<std::unique_ptr<combustion_car>> combustion_car_list;

  1. Creare l’oggetto temporaneo utilizzando una chiamata a std::make_unique e trasferirne la proprietà al contenitore utilizzando std::move:
    //THIS IS CREATING AND PUSHING THE OBJECT
    std::unique_ptr<combustion_car> temporary=std::make_unique<combustion_car>(); temporary->create();
    combustion_car_list.push_back(std::move(temporary));
    std::cout<<"Object added"<<std::endl;
  2. Rimuovere l’elemento in combustion_car_list[choice] (choice-1 non è corretto, ma anche pericoloso perché potrebbe produrre un valore dell’iteratore che è precedente )
    combustion_car_list.begin();
    //THIS DELETES OBJECT FROM VECTOR combustion_car_list.erase(combustion_car_list.begin() + choice);

Programmare Raspberry PI Pico con Arduino IDE

La programmazione di Raspberry pico può essere fatta dall’IDE arduino.

Per farlo è necessario predisporre il modulo nella modalità bootloader. Infatti, di default il modulo è predisposto per funzionare con python e quindi va resettato.

Per farlo è sufficiente tenere premuto il pulsante bootloader mentre si fornisce alimentazione e così facendo si aprirà una scheda di risorse del computer con il contenuto della memoria del raspberry.

Per fare l’upload del codice è necessario selezionare la porta che incomincia con u2f. Non va scelta la porta com4.

installazione openvino su raspberry pi 3

IN realtà è preferibile seguire la seguente procedura, come descritto al link Installing OpenVino for Movidius NCS2 on Raspberry Pi 4 – Intel Community

Cross-Compiling OpenVINO™ Toolkit and NCS2 Plugin Using… (intel.com)

Quando si giunge alla fase in cui è necessario installare docker, seguire la seguente guida:

Install Docker Engine on Raspbian | Docker Documentation

Nella documentazione di cui sopra, c’è un piccolo punto da correggere. Quando fa riferimento alle righe da cambiare in un file sh, in particolare, le seguenti:

77 checkSrcTree $OPENCV_HOME https://github.com/opencv/opencv.git 4.5.5-openvino-2022.1

Va aggiunto uno zero in fondo, in quanto non esistono tags di quella libreria con quel nome. Quindi la stringa corretta è la seguente:

77 checkSrcTree $OPENCV_HOME https://github.com/opencv/opencv.git 4.5.5-openvino-2022.1.0

La compilazione delle demos di model_zoo

Per compilare le demos contenute in openvino_dist/extras/open_model_zoo/demos si deve lanciare il solito openvino_dist/setupvars.sh e poi andare nel direttorio demos e lanciare il comando:

./build_demos.sh

Per farlo, c’è bisogno di scaricare il progetto thirdparty, che stranamente non compare nel progetto base.

Questo si scarica andando nel direttorio vuoto demos/thirdparty e lanciando:

git clone https://github.com/gflags/gflags.git

che è un progetto che è in dipendenza da demos.

Si può compilare anche un solo progetto demos, indicando il parametro –target=”nomeprogetto”.

Per eseguire le demos realizzate in python è necessario preliminarmente lanciare il seguente comando:

pip install <omz_dir>/demos/common/python

e successivamente installare i seguenti pacchetti:

sudo apt install libatlas-base-dev
sudo pip3 install pybind11
pip3 install scipy

Prima di eseguire i comandi python ricordarsi di eseguire il source seguente:
source (home)/openvino_dist/setupvars.sh

Per installazione su sistemi diversi da raspberry, si può seguire la guida ufficiale, come di seguito.

Per l’installazione è necessario usare pip.

Step 1: Create virtual environment

python -m venv openvino_env

Step 2: Activate virtual environment

source openvino_env\bin\activate

Step 3: Upgrade pip to latest version

python -m pip install --upgrade pip

Step 4: Download and install the package

pip install openvino-dev==2022.3.1

Vedere le istruzioni alternative in:

Install OpenVINO™ toolkit for Raspbian* OS — OpenVINO™ documentation — Version(2021.4)

La pagina con istruzioni alternative (a mo’ di tutorial) si trova qui:

OpenVINO, OpenCV, and Movidius NCS on the Raspberry Pi – PyImageSearch

Mancano i file per eseguire il tutorial, ma si possono eseguire altri tutorial presi in altre pagine.

Per caricare i models di openvino, fare riferimento alla seguente pagina:

Install OpenVINO™ Runtime for Raspbian OS — OpenVINO™ documentation — Version(2022.1)

Per installare il development tools, usare il seguente link:

openvino-dev · PyPI

Quando si esegue il comando

pip install openvino-dev[tensorflow2,mxnet,caffe]

questo non funziona a causa di un issue (PyPI .tar.gz missing editdistance/bycython.pyx · Issue #105 · roy-ht/editdistance (github.com)), con la libreria editdistance, che nella versione 0.6.2 non contiene il file editdistance/bycython.pyx

A questo punto, procedere con l’installazione manuale della libreria editdistance, scaricando il file che si trova nelle Releases (che sono misteriosamente corrette), al seguente link:

Release Release v0.6.2 · roy-ht/editdistance (github.com)

e poi lanciare pip install file.tgz

Composer: auto update from github

Quando si crea un repository dentro packagist.org è necessario tenerlo aggiornato con le modifiche apportate su github. In caso contrario le modifiche non verranno apportate ai progetti che utilizzano la libreria packagist.

Per farlo è sufficiente inserire un webhook in github.

Le istruzioni dettagliate si possono trovare alla pagina: Packagist .

La via semplificata è, tuttavia, quella indicata nei passaggi seguenti:

You can configure a GitHub webhook manually by using the following values:

  • Payload URL: https://packagist.org/api/github?username=pzavoli
  • Content Type: application/json
  • Secret: your Packagist API Token
  • Which events? Just the push event is enough.

Il token da inserire nel webhook si trova alla pagina: Packagist, cliccando “Your Api Token”.

Per arrivare al webhook, in github, è sufficiente accedere al proprio repository e cliccare la rotellina “Settings”.

All’interno della pagina si trova il bottone Web Hooks.

Creare un nuovo repository per Composer

Per il corretto funzionamento di progetti php è necessario, normalmente, adoperare librerie esterne.

Per farlo si utilizza sovente composer.

Questo è un gestore di dipendenze di librerie che consente di indicare quali librerie utilizzare e il programma composer le scaricherà in automatico dal proprio repository.

Le librerie vengono indicate in un file chiamato composer.json.

Un esempio di questo file è il seguente, utilizzato in un progetto con yii2:

{
    "name": "yiisoft/yii2-app-advanced",
    "description": "Yii 2 Advanced Project Template",
    "keywords": ["yii2", "framework", "advanced", "project template"],
    "homepage": "https://www.yiiframework.com/",
    "type": "project",
    "license": "BSD-3-Clause",
    "support": {
        "issues": "https://github.com/yiisoft/yii2/issues?state=open",
        "forum": "https://www.yiiframework.com/forum/",
        "wiki": "https://www.yiiframework.com/wiki/",
        "irc": "irc://irc.freenode.net/yii",
        "source": "https://github.com/yiisoft/yii2"
    },
    "minimum-stability": "stable",
    "require": {
        "php": ">=7.4.0",
        "yiisoft/yii2": "~2.0.45",
        "yiisoft/yii2-bootstrap5": "~2.0.2",
        "yiisoft/yii2-symfonymailer": "~2.0.3",
        "yiisoft/yii2-jui": "~2.0.0",
        "pzavoli71/yii2-widget-datetimepicker": "*",
        "yiisoft/yii2-bootstrap5": "@dev"
    },
    "require-dev": {
        "yiisoft/yii2-debug": "~2.1.0",
        "yiisoft/yii2-gii": "~2.2.0",
        "yiisoft/yii2-faker": "~2.0.0",
        "phpunit/phpunit": "~9.5.0",
        "codeception/codeception": "^5.0.0 || ^4.0",
        "codeception/lib-innerbrowser": "^3.0 || ^1.1",
        "codeception/module-asserts": "^3.0 || ^1.1",
        "codeception/module-yii2": "^1.1",
        "codeception/module-filesystem": "^2.0 || ^1.1",
        "codeception/verify": "^2.2",
        "symfony/browser-kit": "^6.0 || >=2.7 <=4.2.4",
        "yiisoft/yii2-jui": "~2.0.0",
        "pzavoli71/yii2-widget-datetimepicker": "dev-master",   
        "kartik-v/yii2-datecontrol": "dev-master",
        "kartik-v/yii2-widgets": "@dev",
        "kartik-v/yii2-widget-datepicker": "dev-master",
        "twbs/bootstrap-icons":"*" ,        
        "yiisoft/yii2-bootstrap5": "@dev"
    },
    "autoload-dev": {
        "psr-4": {
            "common\\tests\\": ["common/tests/", "common/tests/_support"],
            "backend\\tests\\": ["backend/tests/", "backend/tests/_support"],
            "frontend\\tests\\": ["frontend/tests/", "frontend/tests/_support"]
        }
    },
    "config": {
        "allow-plugins": {
            "yiisoft/yii2-composer" : true
        },
        "process-timeout": 1800,
        "fxp-asset": {
            "enabled": false
        }
    },
    "repositories": [
        {
            "type": "composer",
            "url": "https://asset-packagist.org"
        }
    ]
}

La parte più importante è quella indicata con “require” che contiene l’elenco delle librerie con le relative versioni.

Può capitare di dover utilizzare una libreria non fornita, oppure di doverne utilizzare una modificata da una libreria esistente.

Composer preleva le librerie da progetti github, pertanto se si deve modificare una libreria già esistente è necessario effettuarne un fork.

Nel repository github corrispondente è necessario inserire un file denominato composer.json, così fatto:

{
    "name": "pzavoli71/yii2-widget-datetimepicker",
    "description": "An updated version of kartik-v datetimepicker to enable dd/mm/yyyy hh:ii format datetime",
    "keywords": [
        "yii2",
        "extension",
        "widget",
        "select2",
        "form",
        "datetime",
        "picker",
        "jquery",
        "plugin"
    ],
    "homepage": "https://github.com/pzavoli71/yii2-widget-datetimepicker",
    "type": "yii2-extension",
    "license": "BSD-3-Clause",
    "authors": [
        {
            "name": "Paride Zavoli",
            "email": "paride.zavoli71@gmail.com",
            "homepage": "https://fattodate.org"
        }
    ],
    "require": {
        "kartik-v/yii2-krajee-base": ">=3.0.4"
    },
    "autoload": {
        "psr-4": {
            "kartik\\datetime\\": "src"
        }
    },
    "extra": {
        "branch-alias": {
            "dev-master": "1.5.x-dev"
        }
    }
}

Successivamente si deve caricare il progetto nuovo nel repository di composer che si trova nel sito Packagist.org.

Qui è necessario registrarsi e successivamente premere su https://packagist.org/packages/submit indicando nel campo di testo il path del progetto github che contiene la libreria e il file composer.json.

A quel punto il progetto è pronto per essere utilizzato come libreria.

Reset password di root di MySql

Ogni tanto capita di dimenticare la password di root di MySql.

In tal caso viene a mancare la possibilità di accedere al server per fare manutenzione, restore, backup dei database.

Per ripristinare una password di accesso come root è necessario effettuare le seguenti operazioni:

  1. Scrivere il seguente comando in un file di testo e salvarlo in un file denominato mysql-init.txt:
    ALTER USER 'root'@'localhost' IDENTIFIED BY 'MyNewPass';
  2. Chiudere il servizio MySql dalla maschera dei servizi di windows.
  3. Quando il server viene eseguito potrebbe utilizzare un file di dati non standard. In tal caso è necessario conoscere la posizione di questo file altrimenti il processo mysqld non si avvierà. La posizione del file si può trovare guardando il comando che viene lanciato dal servizio. Se questo comando contiene il parametro —defaults-file= allora è necessario copiare la posizione di questo file prima di eseguire il comando successivo.
  4. Aprire il command prompt in modalità “Esegui come amministratore“.
  5. Eseguire il comando seguente impostando i valori dei due file come da istruzioni precedenti:
    mysqld --defaults-file="C:\ProgramData\MySQL\MySQL Server 8.0\my.ini" --init-file=c:\tmp\mysql-init.txt
  6. Fermare l’esecuzione del comando con CTRL+C.
  7. A questo punto il server è pronto per essere eseguito con il nuovo utente di root.

Creazione progetto yii2

Per la creazione di un nuovo progetto yii2 si può utilizzare il comodo comando composer.

Il problema è che composer funziona, attualmente, con la versione di php fino alla 8.1, pertanto se qualcuno avesse installato la versione più recente, questa non funzionerà per la creazione di un nuovo progetto.

Si può ovviare a questo facendo in modo di lanciare composer con una versione di php precedente.

Per farlo, è sufficiente posizionarsi all’interno del direttorio dove si intende generare il progetto e poi dare il seguente comando:

c:\php\php7.4.33\php.exe c:\ProgramData\ComposerSetup\bin\composer.phar create-project yiisoft/yii2-app-advanced advanced

intendendo che php sia nel direttorio c:\php\php7.4.33.

Questo farà sì che composer usi la versione precedente di php e il tutto funzionerà.

p.s. un comando per aggiornare la versione di composer è il seguente:

composer self-update --1

Per ripristinare composer alla nuova versione:

composer self-update --2

Per creare un progetto secondo nuovi std si può usare come template di progetto il seguente:

composer create-project pzavoli71/yii2-app-advanced -s dev provina

il quale creerà il progetto nel direttorio “provina”.

Una volta eseguito il comando ci si dovrà spostare nel direttorio “provina” e lanciare il seguente comando:

php init

il quale si limiterà a generare alcuni file di servizio che non vengono salvati nel repository (params-local.php, ecc.) che andranno configurati per l’accesso al db,per la e-mail, ecc.

Prima di lanciare il comando che creerà le tabelle di base nel DB è necessario assicurarsi che quando si lancino comandi console, questi non utilizzino parametri legati al WEB. In particolare, è necessario rimuovere il richiamo al main.php dentro al file yii, commentando la relativa riga:

$config = yii\helpers\ArrayHelper::merge(
//require DIR . '/common/config/main.php',
require DIR . '/common/config/main-local.php',
require DIR . '/console/config/main.php',
require DIR . '/console/config/main-local.php'
);

Infatti nel file main.php c’è solitamente il parametro che configura la request, che in modalità console non funziona:

    'request' => [
        'parsers' => [
            'multipart/form-data' => 'yii\web\MultipartFormDataParser'
        ],
    ],

Ora si possono creare le tabelle di base che serviranno per la gestione degli utenti e dei permessi, lanciando il comando:

php yii migrate

il quale si limiterà a cercare comandi nel direttorio console/migrations e li lancerà uno per volta.

Un po’ di scherzosa allegria

Per un po’ di sano divertimento vi consiglio di visitare la pagina YouTube di Marco, mio figlio.

Nel video seguente, Marco sfida l’Atalanta, squadra di serie A, con la ben più modesta, ma mitica, F.C. San Marino.

Come andrà a finire?

Fifa 23, Marco prova l’impossibile: Atalanta contro San Marino in Coppa Italia – YouTube