Introduzione
openFrameworks è un toolkit c++ che offre molte risorse per il creative coding e risulta molto utile per la visualizzazione di dati attraverso modelli dinamici e/o interattivi. Il toolkit ha una struttura che permette la creazione e la condivisione di librerie dette “addon” utili per interfacciare openFrameworks con altri software o hardware: questo rende oF una delle librerie più efficaci poiché offre la possibilità di realizzare file eseguibili indipendenti da terze parti e multipiattaforma (a differenze della maggior parte dei framework dedicati al settore multimediale), è open-source, offre un elevato livello di customizzazione e controllo ed è supportata da una comunità molto attiva e ristretta se paragonata a quelle di altri settori ma rilevante nell’ambito del creative coding.

Di recente Studio RF si è dedicato allo sviluppo di un software touch screen di Data Visualization per LOCCIONI che si occupa di progettazione e realizzazione di  sistemi di misura e controllo per migliorare la qualità, la sicurezza e la sostenibilità di processi e prodotti industriali.

I progetti di data visualization, soprattutto se realizzati con poca esperienza o tempo, possono incontrare un ostacolo molto serio costituito dai dati stessi soprattutto durante la fase di creazione e progettazione il designer trascura l’analisi dei dati e dell’accesso agli stessi per concentrarsi sulla visualizzazione degli stessi e delle relazioni tra loro. Questo è abbastanza frequente per vari motivi: i dati sono “dappertutto” e sono sempre accessibili tramite servizi di accesso e gestione (di solito costituiti da API o driver), la progettazione viene sempre basata su “mock” (dati finti che simulano quelli reali) e quindi rimanda alla fase di sviluppo la valutazione dell’accesso ai dati. I problemi di accesso ai dati quindi insorgono a progettazione finita, spesso durante la fase di implementazione del progetto e possono trasformarsi in fattori killer. In questo senso openFrameworks permette, grazie alla struttura modulare, multipiattaforma e open source, di creare librerie di accesso e gestione dei dati indipendenti dalla visualizzazione e utilizzabili secondo necessità. A differenza di molti frameworks proprietari, quindi, non si è limitati dal produttore del software e non bisogna ricorrere a soluzioni di tipo “wrap” (realizzare per esempio un programma che si occupa di accedere ai dati secondo un protocollo e di “girarli” al framework proprietario secondo un altro protocollo). L’implementazione delle librerie esterne all’interno di “addons” non è comunque un processo semplice perchè può richiedere conoscenze che non c’entrano nulla con il creative coding ma riguardano semmai la conoscenza dei sistemi operativi e dei compilatori, oltre che delle librerie relative al software o hardware da includere: in effetti il successo di alcuni framework è anche dovuto al fatto che gran parte degli utenti “creative coders” accede a risorse software e hardware senza doversi preoccupare di come farlo. Il caso preso in considerazione riguarda uno dei DBMS (sistema di gestione di basi di dati) più utilizzati al mondo, MongoDB . MongoDB rientra nella sfera di interesse di chi si occupa di data visualization perché, se progettato correttamente, permette di accedere ai dati in modo molto più veloce rispetto ad altri database  e quindi è spesso il DBMS attraverso cui accedere ai dati relativi al progetto. MongoDB inoltre può essere una scelta molto efficace in termini di tempo di sviluppo e efficacia qualora il progetto di data visualization debba creare e gestire i dati stessi al posto di richiederli ad altre fonti.

Workflow
Sono disponibili varie librerie client (dette “driver”) per accedere ad un server MongoDB , tutte installabili su diversi sistemi operativi oppure compilate sugli stessi a partire dal sorgente. Il nostro obiettivo ideale potrebbe essere quello di disporre di un client verso MongoDB come Addon di openFrameworks:

  • Multipiattaforma
  • Scritta in C , C++
  • Aggiornabile secondo le versioni di MongoDB
  • Aggiornabile secondo le necessità di accesso e elaborazione dei dati

Spesso i progetti di visualizzazione devono essere consegnati al cliente come computer standalone e il sistema operativo preferito per l’elevato livello di affidabilità e customizzazione è Ubuntu. Abbiamo quindi testato i driver C e C++ su una macchina di sviluppo con OS Debian 9. Come spesso accade, alcune librerie sono disponibili per le differenti distribuzioni di Linux come “pacchetti precompilati” ma poichè uno degli obiettivi è l’utilizzo della addon su diversi sistemi operativi dobbiamo utilizzare i sorgenti e compilarli nei vari sistemi operativi.
Abbiamo seguito le istruzioni di installazione per il driver C
http://mongoc.org/libmongoc/current/index.html
compilando librerie statiche:

e successivamente per il driver C++

https://mongodb.github.io/mongo-cxx-driver/mongocxx-v3/installation/

A questo punto le librerie sono installate nel sistema operativo e possiamo scegliere di includerle nell’addon oppure di far utilizzare all’addon le librerie installate nel sistema: ci sono alcune differenze importanti:
Se includiamo le librerie (statiche o dinamiche) nell’addon bisogna anche includere i file header del sorgente (in pratica servono al compilatore per sapere come utilizzare le librerie che abbiamo incluso), ma possono esserci problemi relativi ai path di inclusione o relativi al linker e le soluzioni possono essere diverse a seconda del sistema operativo o dell’IDE utilizzato:

  • se includiamo le librerie (statiche o dinamiche) nell’addon bisogna anche includere i file header del sorgente (in pratica servono al compilatore per sapere come utilizzare le librerie che abbiamo incluso), ma possono esserci problemi relativi ai path di inclusione o relativi al linker e le soluzioni possono essere diverse a seconda del sistema operativo o dell’IDE utilizzato
  • se non includiamo le librerie nell’addon bisogna installarle in ogni macchina e configurare la addon per  “trovarle” in ogni OS utilizzato
  • se includiamo le librerie nella addon dovremo aggiornare la addon se cambia la versione delle librerie utilizzate oltre al caso in cui siamo noi a modificare la addon stessa (per esempio aggiungiamo un metodo)
  • se non includiamo le librerie nella addon potremo aggiornare le librerie sulla macchina in modo indipendente dalla addon

Nel caso in esame abbiamo preferito non includere le librerie nella addon per i seguenti motivi:

  • i test fatti per l’inclusione dei sorgenti nell’addon hanno creato parecchi problemi di inclusione e del linker
  • le librerie richiedono a loro volta altre librerie (per esempio il driver C++ richiede le librerie mongo C o a seconda del sistema operativo sono richieste o meno librerie esterne, per esempio boost per WIndows
  • a livello progettuale è molto probabile che una addon di questo tipo venga utilizzata per accedere a dati su un server mongo remoto, pertanto la macchina dovrà essere configurata appositamente ed è probabile che venga dotata di client di accesso a mongoDB per necessità di accesso ai dati e configurazione. E’ quindi più comodo separare l’installazione delle librerie client dall’uso delle stesse.
  • la compilazione e installazione delle librerie è differente per i diversi OS e richiede una certa attenzione: è quindi più conveniente separare l’installazione delle librerie dall’uso delle stesse.

OSX

A differenza di Linux, in cui non abbiamo usato IDE  per gestire le dipendenze e il build della addon, in ambiente OSX abbiamo utilizzato XCODE e a

Todo

Da qui in poi il workflow prevede:

  • implementazione dei metodi sorgenti nella addon
    Seguendo le classi e gli esempi forniti con il driver C++ bisogna aggiungere dei metodi che permettano all’app oF di utilizzare il client mongoDB: in una prima fase basterà aggiungere i metodi principali per eseguire le query più comuni, poi si potrà valutare se inserire metodi più complessi o se attendere future necessità
  • test della addon su OSX
    Compilare, installare e verificare le librerie in ambiente OSX.
    Aggiungere all’addon la configurazione per utilizzare le librerie (aggiungere una sezione OSX al file addon_config.mk). E’ probabile che si debba creare un progetto XCode da fornire come esempio.

GITHUB PAGE E DOCUMENTAZIONE 

Per un dettagliato approfondimento tecnico potete seguire la pagina github relativa al mio Addon

Introduction

ofxMongo is an OpenFrameworks addons that allows you to connect with mongoDB server

alt text

This is a work in progress project, actually the addons allows you to connect to the mongoDB and insert the records. I will porting others function soon. Tested on OSX 10.13 and Linux Debian/Ubuntu created by Roberto Fazio Studio 2018

Including ofxMongo

Create a new project with PG (Project Generator) and add ofxMongo. Open the project file in your IDE.

Inside your ofApp.h you will need to include:

#include "ofxMongo.h"

Declare the mongoclient object

ofxMongo mongoclient;

setup path

    string host = "localhost";
    string port = "27017";
    string uri = "mongodb://" + host + ":" + port;
    string db_name = "openFrameworksDB";
    string collection_name = "of_collection";

Inside your ofApp.cpp

Make a connection to MongoDB with the default URI "mongodb://localhost:27017"

void ofApp::setup()
{
    mongoclient.init(host, port);
}

mongoclient.insert

void ofApp::keyPressed(int key)
{
        // insert
        int rnd = ofRandom(0.0f, 100000.0f);
        mongoclient.insert(db_name, collection_name, "myRandomField", ofToString(rnd));
}

example-MongoDB_connection

Use the example-MongoDB_connection Xcode ( Work in progress )

alt text

Installing MongoDB Community Edition

Just follow the official MongoDB instruction

MongoDB installation

Installing MongoDB Compass

In addiction, if you want a GUI for MongoDB install MongoDB Compass for Mac, Linux, Win

MongoDB Compass

Dependencies

LINUX : mongo-c , mongo-cxx MAC : mongo-c , mongo-cxx , Cyrus , Snappy WIN : not yet tested

** Linux **

Prerequisites

mongo driver installation

Install mongo-c

http://mongoc.org/libmongoc/current/installing.html version: 1.12.0 built on Debian 4.9.110-1

according to "Build from tarball" instructions:

$ wget https://github.com/mongodb/mongo-c-driver/releases/download/1.12.0/mongo-c-driver-1.12.0.tar.gz
$ tar xzf mongo-c-driver-1.12.0.tar.gz
$ cd mongo-c-driver-1.12.0
$ mkdir cmake-build
$ cd cmake-build

build command for static libraries:

$ cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF -DCMAKE_BUILD_TYPE=Release -DENABLE_STATIC=ON ..
$ make
$ sudo make install

Install mongocxx

https://mongodb.github.io/mongo-cxx-driver/mongocxx-v3/installation/

version: 3.2.x built on Debian 4.9.110-1

according to instructions:

$ git clone https://github.com/mongodb/mongo-cxx-driver.git \
--branch releases/stable --depth 1
$ cd mongo-cxx-driver/build

build command for static libraries:

$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_SHARED_LIBS=OFF ..
$ sudo make EP_mnmlstc_core
$ make
$ sudo make install

/usr/local/include/* headers and /usr/local/lib/* static libraries are linked through the ADDON_PKG_CONFIG_LIBRARIES directive (addon_config.mk)

** Mac OSX 10.12.6 **

Prerequisites

Build Cyrus

https://cyrusimap.org/sasl/sasl/installation.html#quick-install-guide

in my case I've installed cyrus-sasl-2.1.27-rc8

ftp://ftp.cyrusimap.org/cyrus-sasl/cyrus-sasl-2.1.27-rc8.tar.gz

cd (directory it was untarred into)
./configure
make
sudo make install
ln -s /usr/local/lib/sasl2 /usr/lib/sasl2

Install mongo-c

http://mongoc.org/libmongoc/current/installing.html

version: 1.12.0

according to "Building on Mac OS X" instructions, install XCode CLI

$ xcode-select --install

install Homebrew

https://brew.sh/

install cmake:

$ brew install cmake

Download and build:

$ curl -LO https://github.com/mongodb/mongo-c-driver/releases/download/1.12.0/mongo-c-driver-1.12.0.tar.gz
$ tar xzf mongo-c-driver-1.12.0.tar.gz
$ cd mongo-c-driver-1.12.0
$ mkdir cmake-build
$ cd cmake-build

build command for static libraries:

$ cmake -DENABLE_AUTOMATIC_INIT_AND_CLEANUP=OFF -DCMAKE_BUILD_TYPE=Release -DENABLE_STATIC=ON ..
$ make
$ sudo make install

Install mongocxx

https://mongodb.github.io/mongo-cxx-driver/mongocxx-v3/installation/

version: 3.2.x

according to instructions:

$ git clone https://github.com/mongodb/mongo-cxx-driver.git \
--branch releases/stable --depth 1
$ cd mongo-cxx-driver/build

build command for static libraries:

$ cmake -DCMAKE_BUILD_TYPE=Release -DCMAKE_INSTALL_PREFIX=/usr/local -DBUILD_SHARED_LIBS=OFF ..
$ sudo make EP_mnmlstc_core
$ make
$ sudo make install

Install Snappy

Snappy is a compression/decompression library https://github.com/google/snappy

$ git clone https://github.com/google/snappy.git

Build Snappy - You need CMake 3.4 or above to build

$ mkdir build cd build && cmake ../ && make

**mongo driver installation note **

The headers included in this addon were copied from:

/usr/local/include/bsoncxx/v_noabi/bsoncxx /usr/local/include/mongocxx/v_noabi/mongocxx /usr/local/include/libbson-1.0 /usr/local/include/libmongoc-1.0 /usr/local/opt/openssl/include/openssl

The static libraries included in this addon were copied from:

/usr/local/lib/ /usr/local/opt/openssl/lib/libcrypto.a /usr/local/opt/openssl/lib/libssl.a

If you need/want to build your own libraries, follow steps above then copy the files from OS into the addon.

XCode Version 9.2 (9C40b) Mac OSX 10.12.6 Project Configuration Set-up

Use projectGenerator adding ofxMongo. Once you have installed all the libs you have to add the frameworks to Xcode project

in Xcode under Build Phase -> Linked Frameworks and Libraries

Add Cyrus SASL : libsasl2.tbd

Add resolv : libresolv.9.tbd

Add Snappy : libsnappy.a

alt text

You should already see headers included in Build Settings>Header Search Paths as ../../../addons/ofxMongo/src ../../../addons/ofxMongo/include

alt text

addon_config.mk

alt text