lunedì 23 dicembre 2013

Dati Meteo Arpa Piemonte + MongoDB

Dopo diversi tentativi riesco a scoprire come usare i dati meteo dell'Arpa Piemonte forniti da un WebService. Avevo richiesto all'Arpa piemonte dei dati storici per effettuare delle comparazioni con il mio sito del meteo http://mbmeteo.marcoberri.it. Alla richiesta l'Arpa piemonte mi segnala che gli archivi si pagano!!! Allora decido di iniziare ad archiviare i dati della stazione meteo di Vercelli attraverso un piccolo software in java inserito in cron ogni 10 minuti che semplicemente scarica i dati e registra dentro ad un db di MongoDB. Quando avrò raggiunto una buona mole di dati inizierò ad eseguire una comparazione.

Questo è l'esempio di chiamata per ottenere i dati :

http://webgis.arpa.piemonte.it/free/rest/services/climatologia-meteorologia-atmosfera/Misure_Temperatura_tempo_reale/MapServer/find?searchText=vercelli&searchFields=&sr=32632&layers=0&f=pjson

Il piccolo software per eseguire le operazione potete trovarlo sul gitHub.

Arduino + Raspberry PI + Dagu 5 Rover + Node.js



Dopo un lungo periodo di esperimenti e di fatica finalmente sono arrivato alla prima fase del piccolo progetto.

Dai questo video il rover che muove i suoi primi passi in casa... con qualche problema..
L'hw è un mix di arduino per il controllo dei motori edella tilt pan per la Cam, Raspberry che gestisce lo streaming della cam sulla rete, e la parte web con node.js. Mancano alcuni dettagli che sistemerò a giorni.




Tutti i sorgenti, le specifiche e l'hw potete trovarlo sul GitHub



 

  










link on GitHub Site

mercoledì 4 dicembre 2013

Telnet Starwars Animation


Incredibile!!Starwars Animation in ASCII sul telnet!

telnet towel.blinkenlights.nl 23




domenica 1 dicembre 2013

Raspberry Pi - Dagu 5 - Primi Passi

UPDATE: la gestione hardware è stata demandata ad Arduino.Il Raspberry comanderà arduino. Nel prossimo post altri dettagli.

Proseguono gli esperimenti con il Raspberry PI, preso da una frenesia di acquisti notturni ho comprato questo spettacolare rover con la scheda di controllo per i motori.




Hardware


Per il Raspberry Utilizzo la distribuzione standard presente sul sito, ho tolto X ed aggiunto la java-openjdk per utilizzare appunto java più alcune utility (joe, htop, etc), tutto comodamente utilizzando apt-get install.

La comunicazione avviene tramite wifi applicando una chiavetta al raspberry in modo da mantenerlo autonomo da cavo di rete.

Prima problema.. mi sono accorto che l'uscita digitale GPIO del Rapsberry è a 3.3V invece la scheda di controllo dei motori del  dagu funziona su un segnale a 5 volt like Arduino. Quindi devo cercare un convertitore di segnale.. eccolo!!! Tindie converter gpio da 3 a 5v


Primi test.

Dopo vari esperimenti e ricerche trovo questa schedina che converte tutti i segnali del gpio a 5v. Proprio quello che serve per il controller del rover.

I primi esperimenti veloci dell'hardware sono con Nodejs e una piccola lib node-gpio semplice e veloce.


Materiale

Cavetti
Raspberry pi





ecco il tutto montato e pronto:







Primi esperimenti con python e nodejs... subito salta fuori il problema della programmazione parallela del gpio non molto semplice da risolvere. Se non risolvo la cosa sarà facile che passerò ad Arduino.... ufff....




giovedì 7 novembre 2013

Oracle - Query - Paginated result with row_number()

Query per eseguire un subset delle row su oracle senza intaccare i parametri di orderby


SELECT *
FROM
  (SELECT FIELDA,
    FIELDB,
    FIELDC,
    ROW_NUMBER() OVER (ORDER BY FIELDC) R
  FROM TABLE_NAME
  WHERE FIELDA = 10
  )
WHERE R >= 10
AND R   <= 15;





lunedì 14 ottobre 2013

MongoDB + Java + Query + java.util.Date() Range

eseguendo questo codice:

final DBObject query = new BasicDBObject("field_1", new BasicDBObject("$exists", false))
.append("field_2", new BasicDBObject("$exists", true))
.append("field_3", new BasicDBObject("$exists", true))
.append("time", new BasicDBObject("$gte", new Date()));


System.out.println("----> query " + query.toString());

vi restituirà:

{ "field_1" : { "$exists" : false} , "field_2" : { "$exists" : true} , "field_3" : { "$exists" : true} , "time" : { "$gte" : { "$date" : "2013-10-09T15:53:18.649Z"}}}

e invece la query viene eseguita correttamente, se voi prende questa query e la lanciate dalla shell di mongo non funziona.... ma in realtà eseguita dai driver di mongo funziona!!!!

Quindi la query visualizzata vi sta mentendo!!!!

scusate sono impazzito 2 ore per capirlo....














martedì 24 settembre 2013

MongoDB + Morphia + Model to Map/Reduce Result with complex id

Alle volte capita di avere una collection risultante da una Map Reduce con un field id complesso.
Dopo varie ricerche ed esperimenti la soluzioni si trova agganciando come id una classe in embed:

la collection risultante della mapReduce:

{
"_id" : {
"time" : "2011-03",
"url" : "www.test.it",
"fast" : "c80"
},
"value" : 12
}



la classe di modello di result:

@Entity(value = "Stats.CountSingleUrl", noClassnameStored = true)
public class MRResult {

    @Id
    @Embedded
    @Indexed(value = IndexDirection.ASC, unique = true, dropDups = true)
    private IdObject id;
    private String value;

   ///... GETTER e SETTER

    public static class IdObject {

        private String time;
        private String url;
        private String fast;

     ///... GETTER e SETTER
    }
}

domenica 25 agosto 2013

martedì 23 luglio 2013

Oracle + Procedure + Tomcat + Connection Pool + Ibatis



Utilizzando il connection pool di tomcat via app attrraverso ibatis/mybatis  alcune chiamate a Store Procedure Oracle generavano errore
Caused by: java.lang.RuntimeException: unexpected invocation exception: unexpected invocation exception: null at oracle.ucp.jdbc.proxy.PreparedStatementProxyFactory.invoke(PreparedStatementProxyFactory.java:138) at oracle.ucp.jdbc.proxy.CallableStatementProxyFactory.invoke(CallableStatementProxyFactory.java:101) at $Proxy17.getResultSet(Unknown Source) at com.ibatis.sqlmap.engine.execution.SqlExecutor.getFirstResultSet(SqlExecutor.java:337) at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleMultipleResults(SqlExecutor.java:299) at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQueryProcedure(SqlExecutor.java:283) at com.ibatis.sqlmap.engine.mapping.statement.ProcedureStatement.sqlExecuteQuery(ProcedureStatement.java:34) at com.ibatis.sqlmap.engine.mapping.statement.GeneralStatement.executeQueryWithCallback(GeneralStatement.java:173)

La soluzione è semplicemente NON chiamare le procedure con ibatis.callProcedure() ma con ibatis.update()


[via]

venerdì 12 luglio 2013

Certificazioni MongoDB 10gen

Sono disponibili i corsi gratuiti della 10gen con relativa certificazione di MongoDB.





mercoledì 1 maggio 2013

MongoDB Index


Visualizzare gli indici presenti sul db

use test;
db.system.indexes.find();

Visualizzare gli indici presenti sulla colection

db.<collection_name>.getIndexes()

Crea l' indice univoco eliminando le chiavi duplicate

db.accounts.ensureIndex( { username: 1 }, { unique: true, dropDups: true )

Creare un indice su elementi che possono anche non esserci nell'elenco dei documenti

db.addresses.ensureIndex( { "size": 1 }, { unique: true, sparse: true } )

Index Size

db.<collection_name>.indexSize();

Forzare l'uso di uno specifico indice

db.users.find().hint( { age: 1 } )

Elimina l'uso degli indici

db.people.find().hint({$natural:1})
Note:
  • l'indice _id per default è sempre univoco anche se non specificato sulla getIndexes()
  • L'indice di default viene creato di tipo BTREE
  • In caso di utilizzo di query su indice sparse le query default non ritornano i documenti che non posseggono quel field.




martedì 23 aprile 2013

MongoDB Shell


Alcune info prese dal corso di Mongo sulla Mongo University


Ritorna la funzionalità:


PRIMARY> db.names.save
function (obj) {
    if (obj == null || typeof obj == "undefined") {
        throw "can't save a null";
    }
    if (typeof obj == "number" || typeof obj == "string") {
        throw "can't save a number or string";
    }
    if (typeof obj._id == "undefined") {
        obj._id = new ObjectId;
        return this.insert(obj);
    } else {
        return this.update({_id:obj._id}, obj, true);
    }
}


Uso di variabili assegnate:

> db.names.save({name:"furetto"});
> db.names.find();
{ "_id" : ObjectId("515ea7d69f97aede503daa70"), "name" : "furetto" }
> var f = db.names.findOne();
> f;
{ "_id" : ObjectId("515ea7d69f97aede503daa70"), "name" : "furetto" }
> f.name2 = "pippo";
pippo
> f;
{
"_id" : ObjectId("515ea7d69f97aede503daa70"),
"name" : "furetto",
"name2" : "pippo"
}
> db.names.save(f);
> db.names.find();
{ "_id" : ObjectId("515ea7d69f97aede503daa70"), "name" : "furetto", "name2" : "pippo" }

Dati Testi con Javascript:

> for(i=0;i<1000;i++){db.scores.insert({"score":i})};


Escludere _id dalle query:

> db.names.find({"name2":"pippo"},{"_id:" 0, "name2":1});
{  "name2" : "pippo" }


Query tra estremi anche di caratteri:

>db.names.find({"name2":{$gte : "p", $lte:"z"}})

Query per tipologia di campo (per le tipologie di field vedi specifiche json):

> db.names.find({"name2": {$type : 2})


martedì 19 marzo 2013

Raspberry Pi - configurare - NetGear 150N - RTL8188CUS


Preso il Rapsberry PI direttamente da RS. Chiavetta USB WI-FI  - NetGear150N.

Configurato in dhcp sulla mia rete interna.

Inserire la chiavetta nel Raspberry,

lsusb e vedete se la chiavetta viene vista dal sistema

NetGear, Inc. WNA1000M 802.11bgn [Realtek RTL8188CUS]

le configurazioni di

/etc/network/interfaces


auto lo

iface lo inet loopback
iface eth0 inet dhcp

allow-hotplug wlan0
iface wlan0 inet dhcp
wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf


il file wpa-conf /etc/wpa_supplicant/wpa_supplicant.conf


ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
network={
ssid="xxxxx"
proto=RSN
key_mgmt=WPA-PSK
pairwise=CCMP TKIP
group=CCMP TKIP
psk="xxxxxxxxx"
}



riavviare e togliere il cavo di rete.



[via omer.me ]

sabato 2 marzo 2013

MongoDB - Rename Database

Non è possibile rinominare un database di mongo. Il metodo possibile è copiare il db e poi eliminare quello vecchio.

db.copyDabatase("original","newdb","localhost");

use original;
db.dropDatabase();

se abbiamo db molto grosso dobbiamo tenere conto della necessità di parecchio spazio su disco per eseguire l'operazione.