Archivo para 13/04/10

Tip: Probar la nueva versión del Editor de Google Docs

Via | Bitelia

Iron Sky Trailer

1945, El ejercito del tercer reich conquista la luna y alli ocultos, ajenos a lo que ocurre en la tierra, crean una colonia. En el 2018, los nazis deciden regresar…

Mas informacion | GizModo

Cheat-sheets.org, el paraiso de las chuletas

Muchas..muchas..pero que muchas tarjetas de referencia, guias, chuletas,y fichas para direferentes lenguajes de programación. Todas las podeis consultar desde: Cheat-sheets.org

Introducción a la base de datos NoSQL MongoDB: Instalación, primeros pasos y ejemplo de conexión con Java

Como bien comenta el sitio web de MongoDB:  Combining the best features of JSON databases, key-value stores, and RDBMSes.

MongoDB es una base de datos NoSQL, asi que olvidate de tablas y relaciones entre tablas, en MongoDB lo más parecido que encontraremos a una tabla son las colecciones, que vienen a ser una especie de listas donde vamos almacenando los diferentes objetos y sus atributos.  Se abandona el enfoque relacional por bases de datos mas orientadas a objetos y de esta manera es como se procesa la información.

Tal y como se comenta en BarraPunto:

«Una reunión en San Francisco fue la inauguración de la comunidad de NoSQL, un grupo de personas que comparten la idea de destronar la tiranía de las bases de datos relaciones, costosas y lentas, en favor de una alternativa mucho más eficiente y barata para manipular datos. “Las bases de datos relacionales nos ofrecen demasiado. Nos fuerzan a adaptar nuestros objetos para adaptarlos a una RDBMS (sistema de gestión de bases de datos relacional)”, dice Jon Travis, uno de los principales ingenieros en SpringSource, y uno de los 10 presentadores en la reunión de NoSQL. Las alternativas basadas en NoSQL “te ofrecen sólo lo que necesitás”, dice Travis».

Estas bases de datos son bastantes eficientes en entornos de clustering.

De hecho plataformas como Digg ya están empleandolas. Segun comentan en el Blog de la empresa, abandonaron las Bases de datos relacionales por las limitaciones que estas tienen cuando se escalan grandes volumenes de datos.
Además de las ventajas cuando se tienen que añadir o reemplazar nodos caidos sin ningun downtime ((sin tener que apagar el hardware/servers/datacenters, ni el software/DBs).

Hay muchisimas bases de datos NoSQL (p.ej Cassandra, Redis, entre otras), cada una con diferentes propositos: Unas a almacenar documentos,otras: objetos, grafos, claves/valor, etc. Si me preguntas cual es mejor o peor no te lo podre decir ahora mismo (pues no he tenido la ocasión de probar todas y cada una), si escribo este tutorial acerca de MongoDB es sencillamente porque es la primera por la que he empezado ^^.

INSTALACION DE MONGODB

Las instrucciones de instalación las encontramos en el propio site de MongoDB.

Para el caso de Linux 32:

# creamos  un directorio por defecto para los datos
$ sudo mkdir -p /data/db

# usamos curl, para obtener la ultima versión:
$ curl -O http://downloads.mongodb.org/linux/mongodb-linux-i686-latest.tgz

# desempaquetamos en el directorio deseado y listo.
$ tar xzf mongodb-linux-i686-latest.tgz

EJECUCION

# Es mejor ejecutar la base de datos en background -  usando un terminal separado para testing
./mongodb-xxxxxxx/bin/mongod &

# ejecutamos  el shell mongo.  por defecto se conectara a localhost. Nota: reemplaza xxxxx por el número de version correspondiente que estes utilizando:
./mongodb-xxxxxxx/bin/mongo

# Vamos ahora a hacer una insercion, Guardando una entrada del tipo a=1
> db.foo.save( { a : 1 } )

# Imprime el contenido de las keys almacenadas
> db.foo.find()

# chachi!!

Output al arrancar:

Al iniciar la base de datos, obtendremos una salida similar a la siguiente:

root@soledad:~/Escritorio/mongodb-linux-i686-2010-04-06/bin#./mongod &
[1] 21996
root@soledad:~/Escritorio/mongodb-linux-i686-2010-04-06/bin#./mongod
--help for help and startup options
Wed Apr  7 10:44:21 Mongo DB : starting : pid = 21996 port = 27017
dbpath = /data/db/ master = 0 slave = 0  32-bit
****
WARNING: This is development version of MongoDB.  Not recommended for
production.
****

** NOTE: when using MongoDB 32 bit, you are limited to about 2 gigabytes of data
**       see http://blog.mongodb.org/post/137788967/32-bit-limitations for more

Wed Apr  7 10:44:21 db version v1.5.0-pre-, pdfile version 4.5
Wed Apr  7 10:44:21 git version: 418c926354f9d4a77068963923386ad21eacbe7d
Wed Apr  7 10:44:21 sys info: Linux domU-12-31-39-01-70-B4
2.6.21.7-2.fc8xen #1 SMP Fri Feb 15 12:39:36 EST 2008 i686
BOOST_LIB_VERSION=1_37
Wed Apr  7 10:44:21 waiting for connections on port 27017
Wed Apr  7 10:44:21 web admin interface listening on port 28017

Ejemplo de uso desde consola:

jose@soledad:~/Escritorio/mongodb-linux-i686-2010-04-06/bin$./mongo
MongoDB shell version: 1.5.0-pre-
url: test
connecting to: test
type "help" for help
> help
HELP
show dbs                     show database names
show collections             show collections in current database
show users                   show users in current database
show profile                 show most recent system.profile entries
with time >= 1ms
use <db name>                set curent database to <db name>
db.help()                    help on DB methods
db.foo.help()                help on collection methods
db.foo.find()                list objects in collection foo
db.foo.find( { a : 1 } )     list objects in foo where a == 1
it                           result of the last line evaluated; use
to further iterate
> show dbs
admin
local
> show collections
> db.foo.save ( { a : 1 } )
> db.foo.find()
{ "_id" : ObjectId("4bbc46724cd1cb4fecc45ff6"), "a" : 1 }
> exit
bye

Ejemplo de uso en Java:

Lo primero es descargar e añadir al classpath el driver .jar necesario para poder conectar a la base de datos. Os dejo a continuacion un ejemplo de conexion a la base de datos y de diferentes acciones (inserciones, consulta) sobre la misma, el ejemplo esta basado en la documentación oficial , está lo suficientemente comentado y espero sirva de base para vuestros futuros desarrollos.


/**
 * Hay que añadir mongo-XX.jar al classpath
 * 
 * EJEMPLO extraido de:
 http://vsbabu.org/mt/archives/2010/03/02/simple_mongodbjava_example.html
 y
 * Tutorial MONGO:
 http://www.mongodb.org/display/DOCS/Java+Tutorial#JavaTutorial-Introduction
 */

import java.util.List;
import java.util.Set;
import java.util.logging.*;
import java.net.UnknownHostException;
import java.util.regex.Pattern;
import com.mongodb.*;

public class NoSQLDB {

	public static void main(String[] args) {

       Logger log = Logger.getLogger("NoSQLDb");

       try
       {

                                       log.info("iniciado");

                                       // Conectar a bd y recuperar una
										// coleccion
                           Mongo m = new Mongo("localhost", 27017);
                           DB db = m.getDB("sampledb");
                           DBCollection coll = db.getCollection("people");
                           log.info("collection es: " + coll);

                           // Recuperar lista de colecciones de la base de
							// datos
                           Set<String> colls = db.getCollectionNames();

                           System.out.println("<<<<<<<<<< Colecciones de la BD
>>>>>>>>>>>>");
                           for (String s : colls) {
                               System.out.println(s);
                           }


                           DBCollection docs = db.getCollection("docs");
                           log.info("collection docs is : " + docs);

                           // limpiando la coleccion previa de datos
                           DBCursor cur2 = docs.find();
                           while (cur2.hasNext())
                                        docs.remove(cur2.next());

                           // insertando algunos docs de pruebas
                           insertDoc(docs,1,100,200);
                           insertDoc(docs,2,0,0);

                           // recuperando el primero de la coleccion
                           DBObject myDoc = docs.findOne();
                           System.out.println(myDoc);

                           // insertando 100 items simples del tipo { i=valor}
							// a la coleccion

                           for (int i=0; i < 100; i++) {
                               docs.insert(new BasicDBObject().append("i",
i).append("inverso",100-i));
                           }

                           // Contando numero de elementos
                           System.out.println(docs.getCount());

                           // imprimir todos
                          cur2 = docs.find();

                           while(cur2.hasNext()) {
                               System.out.println(cur2.next());
                           }

                           // consulta simple
                           BasicDBObject query = new BasicDBObject();

                           query.put("i", 71);

                           cur2 = docs.find(query);

                           while(cur2.hasNext()) {
                               System.out.println("----consulta id=71--------"+cur2.next());
                           }

                           // consulta compuesta
                           query = new BasicDBObject();

                           query.put("i", new BasicDBObject("$gt",
95).append("$lte", 97));  // e.g. find all where i > 50

                           cur2 = docs.find(query);

                           while(cur2.hasNext()) {
                               System.out.println(" mayor de 95 y menorigual
97:"+cur2.next());
                           }

                           // crear un indice
                           docs.createIndex(new BasicDBObject("i", 1));  // create
index on "i", ascending

                           // ver lista indices coleccion
                           List<DBObject> list = coll.getIndexInfo();

                           for (DBObject o : list) {
                               System.out.println(o);
                           }

                           // ver todas las bases de datos
                           m = new Mongo();

                           for (String s : m.getDatabaseNames()) {
                               System.out.println(s);
                           }

                           // Borrar una base de datos
                          // m.dropDatabase("my_new_db");


                           // limpiar entradas si hay alguna
                           DBCursor cur = coll.find();
                           while (cur.hasNext())
                                        coll.remove(cur.next());

                           // crear indice e insertar algunas entradas en la
							// coleccion
                           coll.ensureIndex(new BasicDBObject("id",
1).append("unique", true));
                           coll.createIndex(new BasicDBObject("name", 1));
                           coll.insert(makePersonDocument(6655, "James", "male"));
                           coll.insert(makePersonDocument(6797, "Bond", "male"));
                           coll.insert(makePersonDocument(6643, "Cheryl", "female"));
                           coll.insert(makePersonDocument(7200, "Scarlett", "female"));
                           coll.insert(makePersonDocument(6400, "Jacks", "male"));

                           log.info("Total Records : " + coll.getCount());

                           // imprimir todos
                           cur = coll.find();
                           printResults(cur, "Find All Records");

                           // buscando por id (no hay SQL son bases de datos
							// como
orientadas a objetos)
                           cur = coll.find(new BasicDBObject("id", 6655));
                           printResults(cur, "Find id = 6655");

                           // buscando los items con id menor ($lte) a 6700
                           cur = coll.find(new BasicDBObject().append("id", new
BasicDBObject("$lte", 6700)));
                            printResults(cur, "Find id <= 6700");

                           // buscando los items con id menor que 6700 y genero
igual a masculino
                           cur = coll.find(new BasicDBObject()
                                              .append("id", new BasicDBObject("$lte", 6700))
                                              .append("gender", "male"));
                                      printResults(cur, "Find id <= 6700 and gender = male");

                            // Buscando los items cuyo name empiece por ja y
							// acabe
en s, y ordenarlos de manera inversa (seria el LIKE 'ja%s')
                            cur = coll.find(new BasicDBObject()
                                               .append("name",
Pattern.compile("^ja.*?s$", Pattern.CASE_INSENSITIVE)))
                                               .sort(new BasicDBObject("name", -1));
                                       printResults(cur, "Find name like Ja%s and
sort reverse by name");

                            // ejempo de actualizacion, recorre todos, y reduce
							// el
id en 10 unidades (operador $inc -10), ademas si es masculino añade
Sir al nombre, y si es femenino añade Mme
                            cur  = coll.find();
                                                  while(cur.hasNext()) {
                                                      BasicDBObject set = new
BasicDBObject("$inc", new BasicDBObject("id", -10));
                                                      if
("male".equals(cur.next().get("gender")))
                                                          set.append("$set", new
BasicDBObject("name", "Sir ".concat((String)
cur.curr().get("name"))));
                                                      else
                                                          set.append("$set", new
BasicDBObject("name", "Mme ".concat((String)
cur.curr().get("name"))));
                                                      coll.update(cur.curr(), set);
                                                  }
                                                  cur  = coll.find();
                                                  printResults(cur, "All, after id
and name update");

                           log.info("finalizado");

       }
       catch(Exception e)
       {
               e.printStackTrace();
       }

       }

	private static BasicDBObject makePersonDocument(int id, String name,
			String gender) {
		BasicDBObject doc = new BasicDBObject();
		doc.put("id", id);
		doc.put("name", name);
		doc.put("gender", gender);
		return doc;
	}

	private static void insertDoc(DBCollection coll, int count, int x, int y) {
		BasicDBObject doc = new BasicDBObject();

		doc.put("name", "MongoDB");
		doc.put("type", "database");
		doc.put("count", count);

		BasicDBObject info = new BasicDBObject();

		info.put("x", x);
		info.put("y", y);

		doc.put("info", info);

		coll.insert(doc);

	}

	private static void printResults(DBCursor cur, String message) {
		System.out.println("<<<<<<<<<< " + message + " >>>>>>>>>>>>");
		while (cur.hasNext()) {
			System.out.println(cur.next().get("id") + ","
					+ cur.curr().get("name") + "," + cur.curr().get("gender"));
		}
	}

}

UpToDown: Top de Descargas de Marzo

Este es el top de descargas de Marzo:

Se ha metido en el top la aplicación de Adobe Air Photo Uploader for Facebook, que sirve, entre otras cosas, para subir fotos a Facebook de forma masiva. No suelo subir fotos a esta red, así que no se si ha podido ser debido a algún error en la web de Facebook, ya que la aplicación me parece poco llamativa. PiTiVi ha subido puestos y parece que se consolida en el top. Por lo demás, pocas novedades con respecto al mes pasado.





¿Es compatible tu equipo con Ubuntu?


( Muchos fondos de pantalla, aqui )

DESCARGATE SCIFI LIFE

365 Dias de Soledad
Me debes los sueños, las promesas y las noches rotas. Me debes la paz, la sonrisa y la esperanza robadas. Me debes la sangre, las lágrimas y el sudor vertido. Me debes las noches vacías, los abrazos anhelados. Me debes un beso de ajenjo de tu amarga boca.

The Ubuntu Counter Project - user number # 11961
Geo Visitors Map

Archivos

abril 2010
L M X J V S D
 1234
567891011
12131415161718
19202122232425
2627282930  

Blog Stats

  • 31.085.301 hits