miércoles, 23 de mayo de 2012

Instalación de MongoDB

A continuación veremos como instalar MongoDB en Mac OS X y en Ubuntu.Primero comenzaremos con  Mac OS X.Desde nuestra terminal hacemos lo siguiente, tomando en cuenta que tenemos nuestro gestor de paquetes de Homebrew:


$ brew update
$ brew install mongodb

Desde Ubuntu:

$ sudo apt-get install mongodb

Ahora crearemos una carpeta, debido a que algunos usuarios con Lion tienen muchos problemas con los permisos, así que les recomiendo que creen la siguiente carpeta de esta manera:


$ brew update
$ sudo mkdir -p /data/db
$ sudo chown `id -u` /data/db

Para comenzar el servidor tecleamos lo siguiente:


$ brew update
$ mongod
MongoDB starting : pid=4932 port=27017 dbpath=/data/db/ 64-bit
...


Para entrar a la consola de MongoDB hacemos lo siguiente:

$ brew update
$ mongo
MongoDB shell version: 1.8.3
>


Sitios de referencia:

http://www.hacksparrow.com/how-to-install-mongodb-on-mac-os-x.html
http://www.hacksparrow.com/install-mongodb-on-ubuntu.html

Reporte #16

Ahora hablaremos de MongoDB, para complementarlo con la entrada anterior en la que hablabamos sobre cuales son las ventajas de usarlo. Para ello dejaré la liga a esa entrada sobre MongoDB.


Entenderemos que es un shard, un shard es uno o mas servidores en un cluster que son responsables para almacenar subconjunto de datos. Cuando hay más de un server en un shard, cada servidor tiene una copia identica de cada subconjunto de datos como en el ejemplo que verán debajo.


Los datos estan eventualmente distribuidos por shards y MongoDB mueve un subconjunto de datos desde shard a otro.Imagina que nosotros usamos una colección de datos y tomamos como base el campo de nombre.MongoDB divide los datos en pequeñas partes dandoles un rango por ejemplo.

 ["a", "g"]

Para dividir en ciertas partes MongoDB hace cosas como lo siguiente:

(a, b), donde x  es mayor que a y menor que b

(a, b], donde x es mayor que a y menor igual a b

[a, b), donde x es mayor igual que a y menor que b

[a, b], donde x es mayor igual que a y menor igual que b

Ahora digamos que tenemos un rango de [a, h). Entonces decimos que "Carlos", "Hilario" y "Alejandro" pueden estar dentro del rango por que si comparamos sus iniciales donde a < a < "Alejandro" < "Carlos" < " Hilario" < h.

La manera en la que MongoDB distribuye los datos a traves de cada shard para que estos sean responsables de cada rango de datos, por ejemplo si nosotros tenemos 4 shards, asumiendo el ejemplo anterior esto podría distribuirse de la siguiente manera.


Supongamos que muchos nombres se registraron entre [a, f), lo cual hizo más el shard 1 por lo tanto tomamos parte del shard 1 al shard 2. Con solamente ajustar los rangos digamos que shard 1 [a ,c) y shard 2 [c, n).


Supongamos que shard 1 y 2 tienen 500GB de datos, mientras que el 3 y 4 solamente tienen 300GB cada uno de ellos.Suponiendo que hacemos copias en cascada donde movemos 100GB de shard 1 a shard 2, de shard 2 pasamos 200GB a shard 3 y de shard 3 pasamos a shard 4 100GB; en total nosotros movimos 400GB. 

 
Ahora si agregamos un nuevo shard y 500 GB, entonces tendremos que mover 400GB desde nuestro shard 4 a shard 5, 300GB desde nuestro shard 3 a el shard 4, 200GB desde nuestro shard 2 a shard 3 y 100GB desde nuestro shard 1 al 2. En conclusión nosotros movimos 1TB lo cual no es muy eficiente.


MongoDB no hace esto, en lugar de ello en cada shard contiene multiples rangos. Ahora consideremos que tenemos el mismo ejemplo que fue utilizado en el primero en donde shard 1 y 2 tiene 500GB, shard 3 y 4 tiene 300GB. Recordando que MongoDB hace que se divida en multiples rangos explicaremos lo siguiente, shard 1 hacemos que cambie a dos rangos donde uno es 400GB donde digamos que [a, d) y 1 de 100GB [d, f). Ahora diremos que hacemos lo mismo con shard 2 donde [f, j) y [j, n). Luego migramos  100GB [d, f) de shard 1 a shard 3 y del shard 2 [j, n) al shard 4. A cada rango de dato le llamamos chunk.Como observarán solamente movimos 200GB.


Ahora imaginemos que agregamos otro shard lo único que haremos es partir cada chunk y le daremos partes de ello para que sea de forma distribuida este partirá de cada shard 100GB para que sea un total de movimiento de 400GB.

Esta es la manera en la que se comporta un shard en MongoDB.


jueves, 17 de mayo de 2012

Basic Concepts

Gateway 

A gateway is a link between two computer programs or systems such as Internet Forums. A gateway acts as a portal between two programs allowing them to share information by communicating between protocols on a computer or between dissimilar computers.

Reply 

A reply is respond by some action, performance in computing terms.

Gossip 

A gossip protocol is a style of computer-to-computer communication protocol inspired by the form of gossip seen in social networks. Modern distributed systems often use gossip protocols to solve problems that might be difficult to solve in other ways, either because the underlying network has an inconvenient structure, is extremely large, or because gossip solutions are the most efficient ones available.
Stress 

Refers to tests that determine the robustness of software by testing beyond the limits of normal operation, commonly put a greater emphasis on robustness, availability, and error handling under a heavy load, than on what would be considered correct behavior under normal circumstances.


Sources:

Gateway
http://en.wikipedia.org/wiki/Gateway_%28computer_program%29 
Reply
http://dictionary.reference.com/browse/reply
Gossip
http://en.wikipedia.org/wiki/Gossip_protocol
Stress
http://en.wikipedia.org/wiki/Stress_testing_%28software%29

Tutorial del uso de Subversion parte 2

Continuaremos con el tema de Subversion, antes de comenzar dejaré un link del tutorial de la parte 1:


Para comenzar hablaremos de revert, esto nos sirve para recuperar los archivos una versión anterior a la actual de igual manera nos sirve con las carpetas y copias de trabajo.La manera de usarlo es la siguiente:

svn revert Nombre del archivo

svn revert -R Carpeta

Para recuperar carpeta de trabajo, tenemos que estar dentro de ella y hacer lo siguiente:

svn revert -R

A veces es necesario ignorar algunas carpetas y archivos sobretodo para los que están encargados se cierto componente del proyecto en el que no están trabajando, para ignorar archivos y carpetas lo que debemos hacer es lo siguiente:

svn propset svn:ignore  Nombre del archivo

svn propset svn:ignore Nombre de la carpeta

Para guardar los nombres de los archivos y carpetas en un .txt hacemos esto:

svn propset svn:ignore -F svnignorado.txt

Para ignorar toda la carpeta:

svn propedit svn:ignore .

Siempre necesitamos estar actualizandonos de las modificaciones que se hay hecho en tiempo real, asi que para eso hacemos un update, la manera de utilizarlo es estando en nuestra carpeta de trabajo necesitamos hacer lo siguiente en la línea de comandos:

svn update

Ahora hablaremos como manejar conflictos, con esto queremos decir que svn entra en conflicto cuando dos usuarios hacen un cambio de algún archivo en la misma parte y en el mismo archivo.

Svn nos provee de varias opciones para resolver este tipo de conflictos y para cada conflicto nos da a escoger las siguientes opciones:

p     Pospone el arreglado del conflicto, y guarda el archivo con la marca de conflicto.

df    Nos muestra el orden en el han sido hechas las modificaciones de los archivos.

     Edita el archivo usando tu editor predeterminado.

r       Hace una marca al conflicto como resuelto, aceptando cualquier edición hecha.

mf    Ignora todo cambio de la carpeta de trabajo y usa la version del archivo actual que tienes.

tf      Ignora todos tus cambios y usa la version del archivo actual del que edito el otro usuario.

l        Usa una herramienta externa de ordenamiento para ordenar los cambios.

Esto nos puede aparecer cuando hay un conflicto, después de haber hecho un update:


 Para marcar como conflicto resuelto lo que debemos hacer es lo siguiente:

svn resolved Nombre del archivo

Nosotros nos gusta tener un control de quienes entran a nuestro proyecto osea quienes hacen commits.Para ello svn maneja el siguiente comando:

svn log

Y veremos una lista de toda la actividad :


Svn maneja un comando llamado blame para saber que personas han modificado cada línea de código de algún cierto archivo y con ello sabemos quién hizo dicho error en el código y llegar a algún acuerdo con el usuario que lo hizo.Para usarlo debemos hacer lo siguiente:

svn blame Nombre del archivo

Y podríamos ver algo como esto:


Nominaciones de la Semana:

Gaby por su traducción de algunas entradas
Emmanuel por su entrada de Benchmark
Juan Carlos y Rafael por su aportación en el monitoreo del cluster
Abraham sobre su explicación de el cluster en la medicina
Victor y Pedro por la explicación de  la red.

miércoles, 9 de mayo de 2012

Tutorial del uso de Subversion parte 1

En este tutorial haremos una explicación sobre Subversion en sí este te permite administrar proyectos complejos desde una sola persona a muchas personas, ahora según wikipedia:

"Subversion es un sistema de control de versiones, software libre bajo una licencia de tipo Apache/BSD y se le conoce también como svn por ser el nombre de la herramienta utilizada en la línea de comando.

Una característica de Subversion es que todo el repositorio tiene un único número de versión que identifica un estado común de todos los archivos del repositorio en un instante determinado del repositoro que se esta trabajando. Se puede acceder al repositorio a través de redes, lo que le permite ser usado por personas que se encuentran en distintas computadoras y con la posibilidad de que varias personas puedan modificar y administrar el mismo conjunto de datos desde sus respectivas ubicaciones fomenta la colaboración."

Ahora que hemos entendido que es un Subversion nos iremos a nuestra terminal y teclearemos:

svn --version
 
Esto nos sirve para saber si tenemos instalado el Subversion y sí es así, que version tenemos.

En caso de no tenerlo instalado debemos de teclear los siguiente.
Para Mac OS X:
  
      Con MacPorts
         sudo port install subversion
       Con Fink
       sudo fink install svn-client
Para Ubuntu:
                                                               sudo apt-get install subversion

Para comenzar a crear un repositorio e inicializarlo necesitamos hacer lo siguiente.

mkdir /var/share/svn/Repositorio

svnadmin create /var/share/svn/Repositorio

En la cual creamos una carpeta llamada Repositorio, para después crear con los comandos de Subversion un nuevo repositorio para nuestro sistema de control de versiones.Tiene que estar dentro de /var/share/~ para que este pueda ser compartido con los usuarios.

Una vez hecho lo anterior pasaremos a modificar dentro de la carpeta creada encontraremos otra carpeta llamada conf, donde encontraremos a svnserve.conf el cual descomentaremos lo siguiente.

anon-access=read                    //Acceso anónimo con permiso a lectura
auth-access=write                   //Acceso de autentificación con permiso a escritura
realm= My First Repository  //Nombre del repositorio
password-db=passwd            //Toma password de default


Con lo visto, tenemos que resaltar que ya no es necesario entrar a esta carpeta, ya que existe un comando llamado svn checkout que nos importa en una carpeta que hayamos creado un proyecto, esto lo veremos mas adelante.

Subversion usa los directorios como unidad básica de organización, el cual divide el repositorio en diferentes proyectos.Por conveniencia todas las subversiones de los proyectos deben de tener directorios llamados trunk(tronco), tags(etiquetas) y branches(ramas).Como por ejemplo:
  • /Proyecto1/trunk
  • /Proyecto1/tags
  • /Proyecto1/branches
  • /Proyecto2/trunk
  • /Proyecto2/tags
  • /Proyecto2/branches
Donde trunk es un directorio donde se hacen todas las acciones principales del desarrollo y es el directorio que vas a verificar si tu quieres trabajar en el proyecto.

El directorio tags es usado para capturar pequeñas capturas del proyecto, por ejemplo cuando liberan una nueva producción de algún tipo de componente, el equipo etiquetará el código que será liberado.Esto ayuda al equipo  cuando encuentra un error en el código y encontrar la posible solución a ello.

El directorio branches es usado cuando quieres seguir diferentes líneas de desarrollo, el desarrollo en esta carpeta se centra en el desarrollo estable mientras que en la carpeta de trunk se utiliza para desarrollo de nuevas funciones.

Para crear un directorio base para nuestro proyecto hacemos lo siguiente.

svn mkdir /usr/share/svn/proyecto

Para crear las carpetas trunk, tags y branches.


  svn mkdir /usr/share/svn/proyecto/trunk

svn mkdir /usr/share/svn/proyecto/tags

        svn mkdir /usr/share/svn/proyecto/branches

Para importar algún directorio de un proyecto ya existente hacemos esto.

svn import URL o Ruta

Para empezar con una copia de un proyecto hacemos.

svn checkout URL o Ruta

Para ver el estado de cada archivo necesitamos saber que es cada letra de indicación, entre las que tiene Subversion son las siguientes:

A  Se agregó en tu copia de trabajo.
C  Existe un conflicto por un update o una combinación.
Eliminado en tu copia de trabajo.
Combino cambios desde un repositorio
   Ignorado desde tu copia de trabajo.
M  Modificado en tu copia de trabajo.
R   Reemplazado en tu copia de trabajo.
?    No está bajo en control de versiones.
!    Se olvido algo desde tu copia de trabajo o esta incompleto

Para ver que archivos fueron cambiados en tu copia de trabajo.

svn status

*Tienes que estar dentro de la carpeta donde tienes la carpeta de trabajo.

Y veremos algo como esto.


Donde se dice que se agregó hola.py y prueba en la copia de trabajo.

Para ver como nuestros archivos han cambiado.

svn diff

*De igual manera tienes que estar dentro de la carpeta de trabajo.

Y veremos algo como esto.


Donde los "+" indican que se han agregado algunas líneas nuevas al archivo, el "-" indica que han sido removido esas líneas.Sí huvieron cambios severos veremos una gran cantidad de mas y menos.

Ahora para enviar un archivo modificado hacemos lo siguiente.

svn add archivo

*Tenemos que estar en la carpeta de trabajo.

Para hacer un update de las modificaciones hechas hacemos lo siguiente.

svn commit archivo

Y veremos algo como esto.


Para eliminar algún archivo.

svn delete archivo

Y después hacemos un "svn commit archivo" como en lo anterior.


Para renombrar un archivo.

svn mv archivo archivomodificado

Luego de eso hacemos un "svn commit archivo".


Para modificar un archivo.

svn mv ruta/proyecto/algo.py src/app/proyecto/

Y después hacemos un commit.

Para la siguiente semana hablaremos sobre el uso de Rever, Blame, Manejar conflictos y hacer update.

Nominación de la semana:

-Sergio Hernández apoyo moral
-Pedro por su entrada sobre Brenchmarks
-Victor por su intento de Geekbench
-Alex por su explicación de Malla
-Avendaño por su explicación Malla
-Obed por su expliación de PVM

jueves, 3 de mayo de 2012

Reporte #13

Se vió sobre MongoDB que es un sistema de base de datos multiplataforma orientado a documentos, de esquema libre, con esto nos referimos a que puede tener un esquema de datos diferente, con atributos o columnas que no tienen por que repetirse de un registro a otro.Una de las principales características que más destaca de MongoDB son su velocidad y su sencillo sistema de consulta.

MongoDB tiene un método llamado Sharding que es usado para una gran colección de datos en varios servidores, que comúnmente lo llamamos clúster.Ahora la gran diferencia entre los demás tipos de esquemas que se usan comúnmente es que en MongoDB hace casi todo de forma automática, una vez que le dices a MongoDB que distribuya datos, el mismo se ocupará de mantener un cierto equilibrio entre los datos de los servidores.Una vez que agregas un nuevo servidor al clúster, MongoDB se encargará de que reciba la misma cantidad de datos.

Sharding fue diseñado para cumplir con tres objetivos:

Hacer el clúster "invisible".Con esto queremos decir sí hacemos un programa, que no nos interesa que este tenga idea con quien se comunica solamente queremos darle la información de la consulta.

MongoDB viene con un proceso de enrutamiento especial llamado mongos, este reenvía las solicitudes al servidor correcto o los servidores del clúster, para luego reunir sus respuestas y enviarlas de vuelta al cliente.De esta manera se cumple ese objetivo, el cliente no tiene que saber que se está hablando hacía un clúster o un solo servidor.

Hacer el clúster siempre disponible para lectura y modificaciones.Habrá veces en el que un clúster no te podrá garantizar que siempre va estar disponible, sin embargo nunca debería de haber un momento en que los usuarios no pueden leer o escribir datos.El clúster deberá permitir a tantos nodos como sea posible para fallar antes de que su funcionalidad notablemente degrade.

MongoDB nos asegura el máximo tiempo en un par de maneras diferentes, cada parte de un clúster puede y debe tener por lo menos algunos procesos redundantes que se ejecunten en otros equipos de manera que si un proceso, máquina ó centro de datos se cae los otros inmediatamente responden y se mantienen adelante.

Permitir al clúster crecer fácilmente.Con esto nos referimos a que el clúster necesitará más espacio o recursos y nosotros deberíamos ser capaz de agregarla.MondoDB nos permite aumentar la capacidad de todo lo que se necesita, e incluso eliminar.

Vistos los anteriores objetivos nos daremos cuenta que un clúster debe ser fácil de usar y administrar.MongoDB nos permite hacer que nuestras aplicaciones crezcan de forma robusta y sencilla.

Nominación:
Alex V. por su explicación de algunos puntos a tomar al momento de programar en Cuda
Victor por su explicación de procesadores vectoriales
Raúl por su explicación a fondo de supercomputadoras
Pepe Gzz. por su explicación de OpenPBS

Fuente:

¿Qué es MongoDB?
http://www.genbetadev.com/bases-de-datos/una-introduccion-a-mongodb

Libro Scaling MondoDB O'Reilly por Kristina Chodorow

lunes, 30 de abril de 2012

Reporte #12

Esta semana investigué sobre dRuby que es un sistema de objetos distribuidos, en el cual es mas preciso para la llamada remota de metodos(RMI).Tambien te permite facilmente llamar objetos en otros procesos.

La gran diferencia que existe entre dRuby y Ruby es en que es relativamente muy facil usar un sistema de objetos distribuido en dRuby.Por ejemplo en Ruby tu puedes usar un método con una secuencia mientras que en dRuby puedes elegir de manera dinamica como enviar un objeto de manera remota, y con esto tu no tienes que describir una interfaz o un método de transportación.

dRuby puede cambiar la manera de desarrollar nuestras apps ya que toma importancia de la capa compleja de comunicacion entre procesos, y una manera fácil de comenzar a escribir.

Aquí un código ejemplo

Cliente.rb


Server.rb




Lo que hace el cliente es llamar al método get_current_time del servidor y con ello obtiene el tiempo actual como resultado de ello.


Está semana nomino a Juan Carlos por escribir los scripts que están siendo de gran ayuda.


Fuentes:

Información

http://pragprog.com/book/sidruby/the-druby-book

Código ejemplo

http://www.java-samples.com/showtutorial.php?tutorialid=1112