Articoli

Tutti gli articoli pubblicati sono in continua variazione e li uso come appunti. Spero che se sono capiti, possano essere utili. Per è come scrivere un diario di appunti pubblici di "lesson learned".

Rudy Azzan

ReactiveX in .NET core

pubblicato 25 lug 2017, 06:00 da Rudy Azzan   [ aggiornato in data 27 lug 2017, 06:18 ]

Installare da NuGet (namespace principali)

System.Reactive, System.Interactive, System.Interactive.Async

Che cosa è un Subject

Il subject è una sequenza osservabile che agisce anche come osservatore.
Siccome è un osservatore, può sottoscrivere uno o più osservabili.
Siccome è un osservabile, può attraversare gli elementi che osserva reimpostandoli e può anche emettere nuovi elementi.
Subject crea classi sequenze con il minimo sforzo indispensabile.

ReactiveX - Appunti C++ con RxCpp

pubblicato 13 apr 2017, 05:35 da Rudy Azzan   [ aggiornato in data 24 apr 2017, 10:31 ]

Operazione dopo periodo di tempo, con guardia

Questo codice esegue un operazione per N (repeats) volte quando passa un controllo di guardia (v > nextCheck), che viene effettuato una volta ogni secondo

int repeats = 4;
int nextCheck = 5;

auto period = chrono::milliseconds(1000);
auto values = rxcpp::observable<>::interval(period).filter([&](int v){
	return v > nextCheck;
}).take(repeats);

values.as_blocking().subscribe(
	[&](int v){ 
	    uni::Logger::WriteMessage(QString("OnNext: %1\n").arg(v).toStdString().c_str());
	    nextCheck += 5;
	},
	[](){
	    uni::Logger::WriteMessage("OnComplete\n");
	}
);

Gestione accensione e lettura barcode reader

In questo esempio, accendo un lettore barcode e lo spengo dopo 7000 millisecondi se non ha letto. In caso contrario, il lettore si spegne da solo

auto period = std::chrono::milliseconds(7000);
auto ints = rxcpp::observable<>::create<int>(
[](rxcpp::subscriber<int> s){
	s.on_next(1);
	s.on_completed();
}).delay(period, rxcpp::observe_on_event_loop());

auto promessa = ints.subscribe(
[](int v)
    {
        //LOG_DEBUG("OnNext: Eccolo");
        //Spegne lettore barcode
    });

//LOG_DEBUG("Esegue turnOn");
//Accende lettore barcode

//Se ha trovato un barcode, il thread viene liberato e uscendo dallo scope della funzione
//il lettore si spegne da solo, quindi annullo l'operazione di spegnimento programmata dopo 7000 millisecondi
promessa.unsubscribe();

ReactiveX - Operatori

pubblicato 7 dic 2016, 03:43 da Rudy Azzan   [ aggiornato in data 28 lug 2017, 13:55 ]

Glossario

Osservabile

Definisce l'azione da osservare

Osservatore

Colui che può abbonare all'osservabile

Sottoscrittore

Un abbonato che esegue l'azione

Creatori di osservabili

Operatori che creano nuovi osservabili

Create

Crea un osservabile da zero mediante una funzione, che esegue appena viene sottoscritto.

Defer

Non crea un osservabile fino a quando l'osservatore non si sottoscrive. Successivamente, creare un nuovo osservabile per ogni osservatore

Empty

Ritorna un osservabile che non manda niente ad un osservatore, ma si completa subito

Never

Ritorna un osservabile che non manda niente ad un osservatore e non termina mai

Throw

Ritorna un osservabile che non manda niente ad un osservatore ma va subito in errore

From

Converte vari oggetti e tipi di dato in osservabili

Interval

Ritorna un osservabile che emette una sequenza di interi ad un intervallo di tempo specificato

Just

Converte uno o più oggetti in un osservabile che emette tali oggetti

Range

Crea un osservabile che emette un range di sequenze di interi

Repeat

Crea un osservabile che emette un particolare elemento o una sequenza di elementi ripetutamente

Start

Crea un osservabile che emette il valore di ritorno di una funzione

Timer

Crea un osservabile che emette un solo elemento dopo un intervallo di tempo prestabilito

Trasformatori di osservabili

Operatori che trasformano gli elementi che sono emessi da un osservabile

Buffer

Raccoglie periodicamente elementi da un osservabile e li emette in gruppi invece che uno alla volta

FlatMap

Trasforma gli elementi emessi da un osservabile in osservatori. Successivamente compatta le emissioni in un singolo osservabile

GroupBy

Divide l'osservabile in insiemi di osservabili, ogni uno dei quali emette un gruppo di elementi differenti dall'osservabile originale organizzati per chiavi

Map

Trasforma gli elementi emessi da un osservabile applicando una funzione per ciascuno di essi

Scan

Applica una funzione ad ogni elemento emesso da un osservabile in maniera sequenziale. Il valore emesso è usato come input per un un nuovo osservabile ed il valore successivo della sequenza, fino a completarla tutta
(si può usare ad esempio per creare un calcolatore di totale di una fattura che lavora in real-time, come può fare anche una formula Excel per capirsi)

Window

Suddivide periodicamente, gli elementi da un osservabile in un gruppo di elementi osservabili ed emette questi gruppi, invece di emettere gli elementi uno alla volta

Applicazione fillti ad osservabili

Operatori che partendo da una sorgente osservabile, emettono elementi in maniera selettiva

Debounce

Emette solamente l'elemento di un osservabile se è passato un particolare lasso di tempo durante il quale non sono stati emessi altri elementi.
(ad esempio in uno stream di dati video a flusso molto veloce, si possono mostrare solamente le immagini che un umano può vedere a 30 fps)

Distinct

Blocca gli elementi duplicati che sono stati emessi da un osservabile

ElementAt

Emette solamente l'elemento n dell'osservabile

Filter

Emette solo gli elementi di un osservabile, che passano un determinato test

First

Emette da un osservabile, solo il primo elemento o il primo che passa un determinato test

IgnoreElements

Non emette nessun elemento da un osservabile, ma può mandare un segnale d'errore o di completamento

Last

Emette solamente l'ultimo elemento di un osservabile

Sample

Emette il più recente elemento emesso da un osservabile, con un intervallo di tempo periodico

Skip

Salta i primi n elementi emessi da un osservabile

SkipLast

Salta gli ultimi n elementi emessi da un osservabile

Take

Emette solo i primi n elementi emessi da un osservabile

TakeLast

Emette solo gli ultimi n elementi emessi da un osservabile

Combinazioni tra osservabili

Operatori che lavorano creand un singolo osservabile, da più sorgenti osservabili diverse

And/Then/When

Combina insiemi di elementi emessi da due o più osservabili, tramite l'applicazione di un modello e un piano d'intermediazione

CombineLatest

Quando un elemento è emesso da due osservabili, combina l'ultimo elemento emesso da ciascun osservabile con una funzione che emette elementi bastati sul risultato di tale funzione.
(In pratica fa un join di più fonti diverse)

Join

Combina gli elementi emessi da due osservabili, ogni volta che un elemento è emesso da un osservabile durante un intervallo di tempo prestabilito

Merge

Combina osservabili multipli in uno solo, fondendo le loro emissioni

StartWith

Fa emettere ad un osservabile una specifica sequenza di elementi, prima che inizi ad emettere quelli della sorgente osservabile

Switch

Converte un osservabile che emette osservabili in un singolo osservabile che emette elementi dal più recente emesso

Zip

Combina emissioni di osservabili multipli con una specifica funzione che emette un singolo elemento per ogni combinazione, basta sul risultato di questa funzione

Operatori di gestione errore

Operatori che aiutano a recuperare il flusso d'esecuzione, dalle notifiche d'errore di un osservabile

Catch

Recupera da una notifica d'errore: onError, continuando la sequenza senza errori

Retry

Se una sorgente osservabile manda una notifica d'errore: onError, si re-iscrive ad essa e riprova, sperando che venga completata senza errori

Operatori utili per l'osservabile

Una serie di strumenti utili per lavorare con gli osservabili

Delay

Sposta l'emissione di un osservabile in avanti, di un determinato intervallo di tempo

Do

Registra un azione, che verrà chiamata quando determinati eventi si svolgeranno su un osservabile. Le azioni verranno eseguite indipendentemente dal normale insieme di emissione di elementi associati all'osservabile

Materialize/Dematerialize

Rappresenta entrambi gli elementi emessi e le notifiche mandate agli elementi emessi, oppure inverte il processo

ObserveOn

Specifica lo scheduler con il quale un osservabile osserverà se stesso

Serialize

Forza l'osservabile ad eseguire chiamate serializzate, per contesti multithreading

Subscribe

Opera sulle emissioni e notifiche di un osservabile

SubscribeOn

Specifica lo scheduler che un osservabile deve usare quando esso viene sottoscritto

TimeInterval

Converte un osservabile che emette elementi in uno che emette indicazioni della quantità di tempo trascorso tra tali emissioni

Timeout

Emette gli elementi della sorgente osservabile, ma da una notifica d'errore se è passato un determinato periodo di tempo senza che sia stato emesso almeno un elemento

Timestamp

Allega un timestamp ad ogni elemento emesso da un osservabile

Using

Crea una risorsa che esiste assieme all'osservabile e viene distrutta quando esso viene distrutto

Conditional and Boolean Operators

Operators that evaluate one or more Observables or items emitted by Observables

All

Determine whether all items emitted by an Observable meet some criteria

Amb

Date due o più sorgenti osservabili, emette tutti gli elementi del solo osservabile che emette un elemento per primo.
(si può usare ad esempio per lanciare più eventi di calcolo con parametri diversi in parallelo e concentrarsi su quello che da per primo un risultato)

Contains

Determine whether an Observable emits a particular item or not

DefaultIfEmpty

Emit items from the source Observable, or a default item if the source Observable emits nothing

SequenceEqual

Determine whether two Observables emit the same sequence of items

SkipUntil

Discard items emitted by an Observable until a second Observable emits an item

SkipWhile

Discard items emitted by an Observable until a specified condition becomes false

TakeUntil

Discard items emitted by an Observable after a second Observable emits an item or terminates

TakeWhile

Discard items emitted by an Observable after a specified condition becomes false

Mathematical and Aggregate Operators

Operators that operate on the entire sequence of items emitted by an Observable

Average

Calculates the average of numbers emitted by an Observable and emits this average

Concat

Emit the emissions from two or more Observables without interleaving them

Count

Count the number of items emitted by the source Observable and emit only this value

Max

Determine, and emit, the maximum-valued item emitted by an Observable

Min

Determine, and emit, the minimum-valued item emitted by an Observable

Reduce

Apply a function to each item emitted by an Observable, sequentially, and emit the final value

Sum

Calculate the sum of numbers emitted by an Observable and emit this sum

Backpressure Operators

backpressure operators
Strategies for coping with Observables that produce items more rapidly than their observers consume them

Connectable Observable Operators

Specialty Observables that have more precisely-controlled subscription dynamics

Connect 

Instruct a connectable Observable to begin emitting items to its subscribers

Publish

Convert an ordinary Observable into a connectable Observable

RefCount

Make a Connectable Observable behave like an ordinary Observable

Replay

Ensure that all observers see the same sequence of emitted items, even if they subscribe after the Observable has begun emitting items

Operators to Convert Observables

To

Convert an Observable into another object or data structure


Google Cloud Client Terminal - gcloud

pubblicato 29 nov 2016, 14:37 da Rudy Azzan   [ aggiornato in data 24 apr 2017, 10:42 ]

Cambio utente corrente

gcloud auth login

Cambio progetto corrente

gcloud config set project [project name]

Quando si cambia utente di gcloud

rm ~/.appcfg_oauth2_tokens

SqlServer linux - Ubuntu

pubblicato 20 nov 2016, 05:49 da Rudy Azzan   [ aggiornato in data 24 apr 2017, 10:36 ]

Stato attuale del servizio SqlServer linux

systemctl status mssql-server

Avviare servizio SqlServer linux

sudo service mssql-server start

Dove sono i dati dei database per SqlServer linux?

/var/opt/mssql/data

Aprire porta firewall database per SqlServer linux

sudo firewall-cmd --zone=public --add-port=1433/tcp --permanent
sudo firewall-cmd --reload 

Creare nuovo database per SqlServer linux

USE master ;
GO
CREATE DATABASE Sales
ON
  ( NAME = Sales_dat,
  FILENAME = '/var/opt/mssql/data/saledat.mdf',
  SIZE = 10,
  MAXSIZE = 50,
  FILEGROWTH = 5 )
LOG ON
  ( NAME = Sales_log,
  FILENAME = '/var/opt/mssql/data/saledat.ldf',
  SIZE = 5MB,
  MAXSIZE = 25MB,
  FILEGROWTH = 5MB ) ;
GO

Eliminare database per SqlServer linux

DROP DATABASE saledat;

Ripristinare database per SqlServer linux

RESTORE DATABASE [AdventureWorks]
FROM DISK = N‘/var/opt/mssql/data/AdventureWorks2014.bak'
WITH MOVE 'AdventureWorks2014_Data' TO N'/var/opt/mssql/data/AdventureWorks2014_Data.mdf',
MOVE 'AdventureWorks2014_Log' TO N'/var/opt/mssql/data/AdventureWorks2014_Log.ldf';

Visual Studio Code Shortcuts

pubblicato 4 ago 2016, 13:36 da Rudy Azzan   [ aggiornato in data 24 apr 2017, 10:54 ]

Visualizzare i files .md

Ctrl + Shift + V

Appunti di Node.Js

pubblicato 21 mar 2016, 08:01 da Rudy Azzan   [ aggiornato in data 6 mar 2018, 05:53 ]

Update di NPM all'ultima versione


npm i -g npm

[sudo] npm install npm@latest -g

Update di tutti i package globali

[sudo] npm update -g

Update di node.js da npm

[sudo] npm install -g n (solo la prima volta)
[sudo] n lts

Appunti Google App Scripts

pubblicato 6 gen 2016, 11:53 da Rudy Azzan   [ aggiornato in data 24 apr 2017, 10:29 ]

Collegamento a librerie

Quando si collega una libreria script (file .gs) ad un altro file .gs, se la libreria viene modificata bisogna ricordarsi di aumentare il numero di versione e di collgare la nuova versione al file che ne farà uso, altrimenti le modifiche non vengono riportate.
In alternativa abilitate la modalità sviluppo quando le includete durente i vostri test

Copia file form e Spreadsheet risposte

Quando si copia uno Spreadsheet con un form collegato, va prima scollegato il form e dopo ricollegato alla fine, altrimenti lui genere una copia del form e nella cartella di destinazione il form copiato non è collegato a nulla

Creazione Ubuntu shortcut / launcher

pubblicato 21 dic 2015, 11:51 da Rudy Azzan   [ aggiornato in data 24 apr 2017, 10:38 ]

Creare un file in "/usr/share/applications":

sudo nano /usr/share/applications/adt.desktop

Con il seguente testo contenuto:

[Desktop Entry]
Name=ADT
Type=Application
Exec=/home/dusan/adt-bundle-linux-x86_64-20140321/eclipse/eclipse 
Terminal=false
Icon=/home/dusan/adt-bundle-linux-x86_64-20140321/eclipse/eclipse.xpm
Comment=Any comment
NoDisplay=false
Categories=Development;IDE
Name[en]=adt.desktop

Glossario informatico

pubblicato 18 dic 2015, 00:45 da Rudy Azzan   [ aggiornato in data 24 apr 2017, 10:37 ]

  • Operazione atomica

    Un'operazione è atomica quando si ha la certezza che, qualora essa venga effettuata, tutti i passaggi che devono essere compiuti per realizzarla verranno eseguiti senza possibilità di interruzione in una fase intermedia

  • Middleware

    In origine il termine era utilizzato per descrivere componenti software (di solito lato server) che connettevano due elementi tra loro, come un livello logico con un server database, un servizio di storage con moduli di applicazione e così via.
    Con il passare del tempo, invece, il termine è diventato più generico e adesso riguarda ogni software che connette due sistemi in qualsiasi modo, forma o dimensione.
    Ad esempio, i middleware utilizzati da connect di Express (Node.Js) sono in sostanza una collezione di moduli che permettono alle vostre app di integrarsi sia con il server, sia con il browser.

  • Deadlock

    Un deadlock si verifica quando due o più attività si bloccano a vicenda in modo permanente in quanto ognuna delle attività prevede un blocco su una risorsa che le altre attività stanno cercando di bloccare.

  • Accoppiamento

    In informatica, per accoppiamento o dipendenza si intende il grado con cui ciascuna componente di un programma fa affidamento su ciascuna delle altre componenti, dipendendo, appunto, da esso.
    Meglio classi con basso accoppiamento (poche classi indipendenti).

  • Coesione

    In informatica, la coesione è una misura di quanto strettamente correlate siano le varie funzionalità messe a disposizione da un singolo modulo. I metodi per misurare la coesione variano da misure qualitative, che classificano il codice sorgente del modulo in esame effettuandone la rubricazione seguendo un approccio ermeneutico, a misure quantitative che esaminano le caratteristiche testuali del codice sorgente per derivarne un valore numerico di coesione. La coesione è una misura ordinale ed è solitamente indicata nelle discussioni come "alta coesione" o "bassa coesione". Moduli con alta coesione sono solitamente preferibili in quanto l'alta coesione è spesso associata a varie caratteristiche desiderabili in un programma quali la robustezza, l'affidabilità, la riusabilità e la comprensibilità, mentre la bassa coesione è spesso associata a caratteristiche non desiderabili come il rendere difficoltose la manutenzione, le verifiche, la riusabilità e la comprensibilità.
    La coesione è solitamente messa in contrapposizione all'accoppiamento. Un alto grado di coesione corrisponde spesso ad un basso grado di accoppiamento e viceversa.
    Meglio classi con alta coesione (poche responsabilità e solo quelle che competono).

  • Data mining

    Il data mining è l'insieme di tecniche e metodologie che hanno per oggetto l'estrazione di un sapere o di una conoscenza a partire da grandi quantità di dati (attraverso metodi automatici o semi-automatici) e l'utilizzo scientifico, industriale o operativo di questo sapere.

  • Bower

    Gestore di librerie javascript font-end

  • Grunt

    Si occupa di eseguire script (NodeJs) di pre, post compilazione come fa ad esempio Ant

  • Yeoman

    Yeoman è un tool per generare lo scaffold di webapp.

  • Euristico

    In matematica, di procedimento non rigoroso che consente di prevedere un risultato, che dovrà poi essere convalidato.

  • Azione (UML) Computazione atomica (non interrompibile) (In EA: Cosa succede all'interno del metodo, chiamato dalla Activity)

  • Attività (UML) Computazione non atomica (interrompibile) associa a uno stato un insieme di azioni (In EA: Chiamata ad un metodo)
  • Invariante Il risultato rimane uguale prima e dopo avere eseguito delle operazioni

  • Covariante Posso assegnare ad un tipo derivato più generico ad uno meno generico (string a object)

  • Controvariante Posso assegnare ad un tipo meno generico ad uno derivato più generico (object  a string)
  • Business roles Necessità aziendali

1-10 of 34