lunedì 14 dicembre 2015
MongoDB Tools 3.0.7 - mongorestore bug
Mongorestore bug:
mongorestore --drop --host <HOST> -v /dump/DB_FOLDER
Command result:
Failed: restore error: komparu_product_dev.product: error restoring from dump/<dbame>/>collection-name>.bson: insertion error: EOF
FIX:
mongorestore --drop batchSize=1 --host <HOST> -v /dump/DB_FOLDER
Ubicazione:
13048 Santhià VC, Italia
lunedì 19 ottobre 2015
MongoDB v.3 Memory Problem
Utilizzando un piccolo server (magari con più processi di mongod ) è possibile che per mancanza di risorse il processo venga killato dal SO.
Nel var/log/messages si trova questa cosa devastante...
Oct 15 02:00:33 <servername> kernel: [723954.577468] Out of memory: Kill process 18100 (mongod) score 368 or sacrifice child
Nel var/log/messages si trova questa cosa devastante...
Oct 15 02:00:33 <servername> kernel: [723954.577468] Out of memory: Kill process 18100 (mongod) score 368 or sacrifice child
la soluzione è semplicemente dosare correttamente la cache del wiredTiger nel file di configurazione
nel mio caso con un server (debian 8.1 con 16Gb di Ram) con 3 mongod in esecuzione in replica secondaria il parametro è settato a 3Gb per ogni mongod.
dopo una taratura i mongod non crollano più.
Etichette:
linux,
mongodb,
performance
Ubicazione:
13048 Santhià VC, Italia
mercoledì 30 settembre 2015
Mobius sul Quadcopter 250
Altro esperimento con il quadcopter con la camera Mobius
Etichette:
quadcopter
Ubicazione:
13048 Santhià VC, Italia
venerdì 18 settembre 2015
MongoDB - Script di MapReduce con uso di scope su map dinamico
Dovendo realizzare una MapReduce per il calcolo dei valori massimi e minimi in un determinato periodo (meteorologico) mi sono scontrato col il problema di passare ad una funzione di Map dei parametri dinamici provenienti da un ciclo.
Per risolvere questo problema bisogna utilizzare un parametro di scope quando si lancia l'esecuzione della MapReduce:
es:
var KEYS = {FIELD : 'test',PERIOD : 'Day'};
dbOne.rawdata.mapReduce(map,reduceMax,{out:{inline:1}, scope : {KEYS:KEYS}}).results;
e nella map posso usarlo:
var map = function(){
if(KEYS.PERIOD == 'Day')
...
emit(somefunction, this[KEYS.FIELD]);
};
Per risolvere questo problema bisogna utilizzare un parametro di scope quando si lancia l'esecuzione della MapReduce:
es:
var KEYS = {FIELD : 'test',PERIOD : 'Day'};
dbOne.rawdata.mapReduce(map,reduceMax,{out:{inline:1}, scope : {KEYS:KEYS}}).results;
e nella map posso usarlo:
var map = function(){
if(KEYS.PERIOD == 'Day')
...
emit(somefunction, this[KEYS.FIELD]);
...
};
esempio completo:
Etichette:
javascript,
MapReduce,
meteo,
mongodb,
script
Ubicazione:
13048 Santhià VC, Italia
mercoledì 9 settembre 2015
Spring MVC 4 - elenco chiamate REST
Ottimo controller REST per visualizzare l'elenco delle chiamate disponibili nel proprio MVC (tipo il file wsdl)
Ubicazione:
13048 Santhià VC, Italia
lunedì 20 luglio 2015
Camera Mobius sul quadcopter
Etichette:
mobius,
quadcopter
Ubicazione:
13048 Santhià VC, Italia
giovedì 25 giugno 2015
Integrazione app Meteo con La Crosse Technology WS1640
Dopo un buon periodo di inattività delle rilevazioni meteo causate dal malfunzionamento della vecchia stazione meteo, Cinzia mi regala un sistema completo nuovo sotto il 150 Euro una La Crosse Technology WS1640
Dopo aver installato la stazione sul balcone arriva la parte più interessante ovvero creare una app web e collegarci in tempo reale i risultati della stazione.
L'uscita usb della stazione è connesso ad un raspberry in wifi e alimentato da rete.
La stazione utilizza il cavo usb del raspberry per alimentarsi
Per prelevare i dati dalla stazione attraverso una piccola app in java sul Raspberry PI utilizzo questa libreria comoda e senza tanti fronzoli. La app in java preleva i dati e li invia ad una web-app sul server in formato json ogni tot minuti, oltre che alla sera scaricare tutto l'archivio sul dispositivo e rispedirlo al server in modo da prevedere eventuali buchi di rete durante la giornata.
La app è sul github.
Per la parte server il sitarello è realizzato con NodeJs compreso il servizio in ascolto del posto da parte del Raspberry PI qui il sorgente.
Seconda applicazione presente sul server è un piccolo batch per la generazione dei grafici con jfreechart. Visto che i dati sono molto non è possibile renderizzare tutto in tempo reale in javascript.
Naturalmente i dati sono tutti archiviati su MongoDB.
Questo è il sorgente del batch per i grafici.
Dopo aver installato la stazione sul balcone arriva la parte più interessante ovvero creare una app web e collegarci in tempo reale i risultati della stazione.
L'uscita usb della stazione è connesso ad un raspberry in wifi e alimentato da rete.
La stazione utilizza il cavo usb del raspberry per alimentarsi
Per prelevare i dati dalla stazione attraverso una piccola app in java sul Raspberry PI utilizzo questa libreria comoda e senza tanti fronzoli. La app in java preleva i dati e li invia ad una web-app sul server in formato json ogni tot minuti, oltre che alla sera scaricare tutto l'archivio sul dispositivo e rispedirlo al server in modo da prevedere eventuali buchi di rete durante la giornata.
La app è sul github.
Per la parte server il sitarello è realizzato con NodeJs compreso il servizio in ascolto del posto da parte del Raspberry PI qui il sorgente.
Seconda applicazione presente sul server è un piccolo batch per la generazione dei grafici con jfreechart. Visto che i dati sono molto non è possibile renderizzare tutto in tempo reale in javascript.
Naturalmente i dati sono tutti archiviati su MongoDB.
Questo è il sorgente del batch per i grafici.
Ubicazione:
13048 Santhià VC, Italia
Syma x5c con camera JJRC C3001-3 0.3MP HD Camera
Modificato il Syma x5c con la camera JJRC C3001-3 0.3MP HD Camera presa a pochi euro su Banggood.com.
ecco il primo video di test:
ecco il primo video di test:
Etichette:
modellismo,
quadcopter,
syma
Ubicazione:
13048 Santhià VC, Italia
lunedì 27 aprile 2015
Spring 4 MVC send response image
che fatica.
l'unica soluzione trovata per servire una immagine con spring 4 mvc senza impazzire...
l'unica soluzione trovata per servire una immagine con spring 4 mvc senza impazzire...
martedì 31 marzo 2015
OpenPilot problemi di aggiornamento della scheda CC3D
Sa qualche tempo mi stanno interessando i quadcopter. Dopo aver giocato con uno precostruito sto analizzando e studiando come realizzarne uno in casa utilizzando i componenti espandibili disponibili sul mercato.
Dopo varie ricerche per la scheda del gestore motore arrivo a trovare questo ottimo progetto open.
Compro una scheda CC3D su Hobbyking, scarico il software (disponibile sia Linux che Windows) dal sito di OpenPilot e tento di aggiornare la versione del firmware della scheda... disastro.. quando arrivo ad aggiornare mi segnala che non riesce a eseguire l'upgrade.
Alla fine risolvo con un semplice trick..
Inserisco la scheda, vado sulla parte firmware del software, in basso a sinistra scollego la scheda dal bottone. La scheda viene riconosciuta come CC3D. a questo punto stacco la usb di connessione, premo "update" il software mi chiede di inserire la usb, inserisco la usb e finalmente l'update del firmware funziona!!!
Dopo varie ricerche per la scheda del gestore motore arrivo a trovare questo ottimo progetto open.
Compro una scheda CC3D su Hobbyking, scarico il software (disponibile sia Linux che Windows) dal sito di OpenPilot e tento di aggiornare la versione del firmware della scheda... disastro.. quando arrivo ad aggiornare mi segnala che non riesce a eseguire l'upgrade.
Alla fine risolvo con un semplice trick..
Inserisco la scheda, vado sulla parte firmware del software, in basso a sinistra scollego la scheda dal bottone. La scheda viene riconosciuta come CC3D. a questo punto stacco la usb di connessione, premo "update" il software mi chiede di inserire la usb, inserisco la usb e finalmente l'update del firmware funziona!!!
Ubicazione:
13048 Santhià VC, Italia
lunedì 23 marzo 2015
Retrofit e Log4j
Retrofit è un ottimo client per gestire chiamate rest.
Utilizzo la libreria con successo sia su java app che su android.
Il problema è riuscire a wrappare i log su log4j usato comunemente su tutte le app java.
la soluzione dopo richiesta su stackoverflow arriva velocemente:
unico problema è che non è possibile differenziare il livello di logging.
[via]
Utilizzo la libreria con successo sia su java app che su android.
Il problema è riuscire a wrappare i log su log4j usato comunemente su tutte le app java.
la soluzione dopo richiesta su stackoverflow arriva velocemente:
unico problema è che non è possibile differenziare il livello di logging.
[via]
giovedì 12 marzo 2015
Migrazione a MongoDB 3
Finalmente è arrivato MongoDB 3.0 !!!
Eseguo subito qualche test di migrazione!!!
Per migrare alla versione 3 bisogna almeno prima passare le eventuali versioni 2.4 alla 2.6.
La migrazione è leggermente complessa, si tratta di cambiare l'engine di elaborazione su fs con http://www.wiredtiger.com/ azienda comprata da mongo per gestire in modo velocemente le transazioni e ottimizzare le risorse su disco.
- test di migrazione su db non in replica/cluster.
- Prendo un succoso dump da 21GB. Ripristinato su un mongo 2.6.6 (circa 2 ore di restore)
situazione di partenza:
DB1 0.5GB
DB2 27.4GB
DB3 0.03GB
DB4 2.49GB
local 0.03B
cartella di storage 40GB
- Cambio l'engine al mongo 3.0 e forzo il motore a quello standard:
/bin/mongod --dbpath /mongo/mongodatastandalone/ --logpath "standalone_3.0.log" --storageEngine mmapv1
la partenza è lenta esegue dei recovery del journal (40 secondi)
- Eseguo un dump dei dati (35 minuti circa) :
/mongodump --out /backup_mongo_3/
rimango basito... il mongodump adesso lavora con processi paralleli!!!
il dump generato è circa 21GB
- Start del mongo che punta ad una cartella di dati diversa da quella precedente specificando il motore di engine nuovo.
/bin/mongod --dbpath /mongo/mongodatastandalone_3/ --logpath "standalone_3.0.log" --storageEngine wiredTiger
- Eseguo la restore dei dati sul tiger (2 ore e 10 minuti circa):
mongorestore /backup_mongo_3/
siamo passati da uno storage su disco di 40GB ad uno di 17GB
il prossimo passo sarà di testare la migrazione delle repliche.
Per evitar di farmi una migrazione per ogni server replica si potrebbe eseguire tutto su un nodo singolo sganciando prima le repliche e poi attivare le repliche su nodi di mongo 3 pulito in modo da far replicare i dati in modo automatico dal mongo.
problema per le app:
il java driver attualmente è alla beta 3 - https://github.com/mongodb/ mongo-java-driver/releases
DB2 27.4GB
DB3 0.03GB
DB4 2.49GB
local 0.03B
cartella di storage 40GB
- Cambio l'engine al mongo 3.0 e forzo il motore a quello standard:
/bin/mongod --dbpath /mongo/mongodatastandalone/ --logpath "standalone_3.0.log" --storageEngine mmapv1
la partenza è lenta esegue dei recovery del journal (40 secondi)
- Eseguo un dump dei dati (35 minuti circa) :
/mongodump --out /backup_mongo_3/
rimango basito... il mongodump adesso lavora con processi paralleli!!!
il dump generato è circa 21GB
- Start del mongo che punta ad una cartella di dati diversa da quella precedente specificando il motore di engine nuovo.
/bin/mongod --dbpath /mongo/mongodatastandalone_3/ --logpath "standalone_3.0.log" --storageEngine wiredTiger
- Eseguo la restore dei dati sul tiger (2 ore e 10 minuti circa):
mongorestore /backup_mongo_3/
siamo passati da uno storage su disco di 40GB ad uno di 17GB
il prossimo passo sarà di testare la migrazione delle repliche.
Per evitar di farmi una migrazione per ogni server replica si potrebbe eseguire tutto su un nodo singolo sganciando prima le repliche e poi attivare le repliche su nodi di mongo 3 pulito in modo da far replicare i dati in modo automatico dal mongo.
problema per le app:
il java driver attualmente è alla beta 3 - https://github.com/mongodb/
Ubicazione:
13048 Santhià VC, Italia
venerdì 27 febbraio 2015
Alert when any site is down!
Ottimo script collegato al proprio calendar che manda sms per verificare se i nostri siti sono down o meno:
http://techawakening.org/?p=988
Piccola modifica per evitare di ricevere troppi messaggi di spam.
Il piccolo script prevede di mandare/creare l'evento di down solo quando il sito è offline e salva in tutti i casi il log sul foglio sul drive.
function isMySiteDown() {
var tot_site=5;
for (i=3;i<=tot_site;i++) {
// In cell E3 enter the URL of the site you want to monitor
var url = SpreadsheetApp.getActiveSheet().getRange("F"+i).getValue();
if(url.length) {
var response, error;
try {
response = UrlFetchApp.fetch(url);
} catch(error) {
insertData(error, -1, url, i, "Website down");
continue;
}
var code = response.getResponseCode();
if (code != 200) {
insertData(response.getContent()[0], code,url, i,"Website DOWN");
}else{
insertData(response.getContent()[0], code,url, i,"Website UP");
}
}
}
}
function insertData(error, code, url, i, msg) {
var sheet = SpreadsheetApp.getActiveSheet();
var email = sheet.getRange("F8").getValue();
var row = sheet.getLastRow() + 1;
var now = new Date().getTime();
sheet.getRange(row,1).setValue(new Date());
sheet.getRange(row,2).setValue(url);
sheet.getRange(row,3).setValue(error);
sheet.getRange(row,4).setValue(code);
if(code!=200){
CalendarApp.createEvent( url + ' is DOWN' , new Date(now+40000), new Date(now+40000)).addSmsReminder(0);
MailApp.sendEmail(email, msg, error);
}
}
http://techawakening.org/?p=988
Piccola modifica per evitare di ricevere troppi messaggi di spam.
Il piccolo script prevede di mandare/creare l'evento di down solo quando il sito è offline e salva in tutti i casi il log sul foglio sul drive.
function isMySiteDown() {
var tot_site=5;
for (i=3;i<=tot_site;i++) {
// In cell E3 enter the URL of the site you want to monitor
var url = SpreadsheetApp.getActiveSheet().getRange("F"+i).getValue();
if(url.length) {
var response, error;
try {
response = UrlFetchApp.fetch(url);
} catch(error) {
insertData(error, -1, url, i, "Website down");
continue;
}
var code = response.getResponseCode();
if (code != 200) {
insertData(response.getContent()[0], code,url, i,"Website DOWN");
}else{
insertData(response.getContent()[0], code,url, i,"Website UP");
}
}
}
}
function insertData(error, code, url, i, msg) {
var sheet = SpreadsheetApp.getActiveSheet();
var email = sheet.getRange("F8").getValue();
var row = sheet.getLastRow() + 1;
var now = new Date().getTime();
sheet.getRange(row,1).setValue(new Date());
sheet.getRange(row,2).setValue(url);
sheet.getRange(row,3).setValue(error);
sheet.getRange(row,4).setValue(code);
if(code!=200){
CalendarApp.createEvent( url + ' is DOWN' , new Date(now+40000), new Date(now+40000)).addSmsReminder(0);
MailApp.sendEmail(email, msg, error);
}
}
Etichette:
script
Ubicazione:
13048 Santhià VC, Italia
sabato 14 febbraio 2015
Raspberry Pi configurare due wifi dongle
Il primo dongle è un Tenda il secondo un piccolo Netgear, entrambi collegati alla stessa rete.
sudo apt-get purge ifplugd
file: /etc/network/interfaces
auto lo
iface lo inet loopback
iface eth0 inet dhcp
allow-hotplug wlan0
iface wlan0 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
iface default inet dhcp
allow-hotplug wlan1
iface wlan1 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
ifcae default inet dhcp
iface wlan1 inet manual
wpa-roam /etc/wpa_supplicant/wpa_supplicant.conf
ifcae default inet dhcp
file: /etc/wpa_supplicant/wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="Digicom_5B36"
psk="xxxxxxxxxxxxxx"
}
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="Digicom_5B36"
psk="xxxxxxxxxxxxxx"
}
Etichette:
bash,
linux,
RaspberryPI
Ubicazione:
13048 Santhià VC, Italia
mercoledì 4 febbraio 2015
MongoDB - Script di compact per tutto il server
Questo script esegue la compact su tutte le collection per tutti i db di tutto il server.
mongo --host <servername> compact.js
utile quando si prova a risparmia spazio su disco anche se non è sempre detto che funzioni...
mongo --host <servername> compact.js
utile quando si prova a risparmia spazio su disco anche se non è sempre detto che funzioni...
Etichette:
mongodb,
performance,
script
Ubicazione:
13048 Santhià VC, Italia
Iscriviti a:
Post (Atom)