giovedì 4 dicembre 2014

MongoDB - Script per rigenerare _id

Alle volte capita che per sbaglio vengano inseriti dei valori non generati da mongo per _id.

es:

{"_id":1, "a":1},
{"_id":2, "a":3}.. etc..etc



Mongo non prevede l'unset del _id
uno script del genere

 db.events.update({},{$set : {_id:new ObjectId()}},{multi:true});

ritorna questo errore:

After applying the update to the document {_id: 4 , ...}, the (immutable) field '_id' was found to have been altered to _id: ObjectId('54801ec49103c90347485eaf')


il modo migliore è quello di prendere tutti i valori ribaltarli su una collection di appoggio (eliminando il vecchio _id) e rinominare la collection in quella sorgente.

lunedì 17 novembre 2014

Client Retrofit - Problemi con java.util.Date

Nell'ultimo periodo sto utilizzando Retrofit per creare client di accesso a api rest.

Un problema comune è quando si vuole passare nella richiesta in @Body in post un parametro con un modello di classe che contenga un campo java.util.Date. Il problema nasce dalla conversione in Json per il client che si aspetta tutti dati in json in ingresso e a sua volta restituisce un json.

Ho risolto il problema configurando il serializzatore e deserializzatore per il client okclient:


 private static RestAdapter buildClientRestAdapter(String uri) {

final OkHttpClient okHttpClient = new OkHttpClient();
okHttpClient.setReadTimeout(ClientDispatcher.timeout, TimeUnit.MILLISECONDS);
okHttpClient.setConnectTimeout(ClientDispatcher.timeout, TimeUnit.MILLISECONDS);
final OkClient httpClient = new OkClient(okHttpClient);

final GsonBuilder builder = new GsonBuilder();
builder.setDateFormat(DateFormat.MILLISECOND_FIELD);

builder.registerTypeAdapter(Date.class, new JsonDeserializer<Date>() {
   @Override
   public Date deserialize(JsonElement json, Type typeOfT, JsonDeserializationContext context) throws JsonParseException {
return new Date(json.getAsJsonPrimitive().getAsLong());
   }

});


builder.registerTypeAdapter(Date.class, new JsonSerializer<Date>() {
   @Override
   public JsonElement serialize(Date src, Type typeOfSrc, JsonSerializationContext  context) {
     return src == null ? null : new JsonPrimitive(src.getTime());
   }
 });

final Gson gson = builder.create();

return new RestAdapter.Builder().setEndpoint(uri).setLogLevel(RestAdapter.LogLevel.FULL).setConverter(new GsonConverter(gson)).setClient(httpClient).build();
    }

giovedì 13 novembre 2014

MongoDB - Script per profile su tutto il server

Abilita il profile per tutti i db del mongo server esclusi local e admin.


per interrogare tutti i profile con l'elenco delle ultime 5 query che superano i 5 millis

lunedì 21 luglio 2014

MongoDB - Script to check Collections Size

Script di utils per recuperare la collection size di ogni db del vostro mongo.

da lanciare con: mongo mongo check_collection_size.js

permette di ottenere la size delle collection di tutti i db in modo da poterla monitorare con qualche app tipo jmeter o nagios.

il risultato:


[ {
"name" : "meteoArpa",
"collections" : [
{
"name" : "data",
"storageSize" : "680.00 KB",
"size" : "510.89 KB",
"count" : 519
},
{
"name" : "pluvio",
"storageSize" : "21.46 MB",
"size" : "19.97 MB",
"count" : 20779
},
{
"name" : "system.indexes",
"storageSize" : "8.00 KB",
"size" : "336 B",
"count" : 3
},
{
"name" : "temperature",
"storageSize" : "21.46 MB",
"size" : "20.00 MB",
"count" : 20807
}
]
},
{
"name" : "pcat",
"collections" : [
{
"name" : "products",
"storageSize" : "8.00 KB",
"size" : "3.58 KB",
"count" : 11
},
{
"name" : "system.indexes",
"storageSize" : "8.00 KB",
"size" : "112 B",
"count" : 1
}
]
},
{
"name" : "admin",
"collections" : [ ]
}
]





giovedì 24 aprile 2014

MongoDB - esempi di scripting

In questo file potete trovare vari esempi di scripting per mongo divisi in classi/metodi js

L'uso è semplice

mongo --host localhost
> load("global.js")

a questo punto avete caricato gli script e potete usarli es: meteolog.extract();

Gli script sono molto utili per seguire fix o altri tipi di operazioni massive lato db. molto più veloce che realizzarle sulle app client.

Un classico esempio è quello di estrarre i dati dopo averli elaborati in tempo reale csv o simili.

meteolog = {};

var dbMeteo = db.getSisterDB("Meteo");

meteolog.extract = function(){
        var coll = dbMeteo.Meteolog;

var count = coll.count();
print("Tot record :" + count);

var cursor = coll.find();

var line = "";
cursor.forEach(function(logData) {
 line += logData.n + ", " + logData.time;
 print(line);
});
}



mercoledì 23 aprile 2014

sabato 8 marzo 2014

Raspberry Rover + Accelerometro


Proseguono gli sviluppi sul progetto RaspiRoverDuinio. 

Integrato accelerometro MPU6050



Accelerometro collegato al GPIO del Raspberry PI MPU6050


Il prossimo passo è l'integrazione del sensore di prossimità HC-SR04.

tutto i sorgenti sempre disponibili su github


venerdì 7 febbraio 2014

Droidcon Italy 2014

Due giorni intesi di Android a Torino con il Droidcon Italia 2014

Qui gli appunti delle due giornate, sono appunti!! prendeteli come tali!!!





giovedì 30 gennaio 2014

NodeJs - Oracle - No Bind Variables - "Error: ORA-01756: quoted string not properly terminated"


il problema della codifica con nodejs + oracle npm.

La soluzione è sempre quella di utilizzare le Bind Variables.

In alcuni casi dove non è possibile si procede con turn around:

var query = "UPDATE test SET  DESC_RISPOSTA = 'á';

oracle.connect(dbOracleConnection, function(err, connection) {
connection.execute(query, [], function(err, results) {
console.log(err);
console.log(results);
});
});

si ottiene questo errore :  Error: ORA-01756: quoted string not properly terminated

la soluzione più semplice è quella di utilizzare due funzionalità js per encodare correttamente la stringa

var query = unescape(encodeURIComponent("UPDATE test SET  DESC_RISPOSTA = 'á'));

giovedì 16 gennaio 2014

Rover + Nodejs + Socket.io

Prosegue la parte di sviluppo del piccolo rover con Raspberry Pi + Arduino e Dagu 5.
Nella prossima fase prevede l'integrazione del giroscopio MPU5060

La parte di gestione da browser adesso utilizza Express.io appunto con le chiamate in socket. Molto più veloce rispetto alle classiche chiamate ajax.

Sulla sinistra i comandi principali per muovere il rover sulle 4 ruote motrici. In basso a sinistra il controllo del Tilt pannel della RaspiCam

Sulla destra lo stream della camera.





tutti i sorgente e le foto sul gitHub

lunedì 13 gennaio 2014

Encoding - NodeJs + Oralce

Qualche problem sulle codifiche di Encoding con NodeJS + Oracle utilizzano la npm oracle ?

Su debian (il server dove è installato il client Oracle e la app di NodeJs) risolto inserendo nel file /etc/environment  la stringa

NLS_LANG=.UTF8

naturalmente il db di riferimento è in UTF8.


[via github]