MongoDB, introducción a noSQL

Hoy en día se escucha mucho los sistemas NoSql, quizás hay dos que están pisando fuerte, MongoDB y  Cassandra.
Que es un NoSQL
Un sistema noSQL, como su nombre buenamente indica, es un sistema que no utiliza el lenguaje Sql para la consulta y normalmente no permite realizar joins. Normalmente son sistemas muy flexibles y que escalan en horizontal perfectamente, así que cuando por temas de rendimiento una sola máquina ya no es suficiente para almacenar algún tipo de dato, es muy probable que la solución sea un noSQL.
Soporte
Detrás de estas dos tecnologías hay empresas que dan soporte y dan la seguridad que ante un problema en un entorno de producción o dificultad a la hora de implementar soluciones, puedes encontrar ayuda de calidad. 
10gen
Es la empresa comercial de mongodb, en su web te puedes descargar mongoDB así como encontrar versiones para Windows Azure. Ofrecen varios productos, asesoramiento en un entorno de pre-produccion, formación, monitorización, consultoría,… Actualmente tienen oficina en Barcelona.
Datastax
En esencia ofrece lo mismo que 10gen cambiando la tecnología, esta vez sobre Cassandra.
MongoDB
Esta tecnología puede correr tanto en Linux como en Windows, o sistemas cloud como Windows Azure. La instalación es muy sencilla, una vez descargado el fichero, descomprimimos y ejecutamos el comando mongos. En la carpeta descomprimida veremos un conjunto de utilidades, mongo herramienta básica de conexión, momgostat, herramienta para el control de rendimiento, mongoimport y mongoexport entre otras muchas.
MongoDB, utiliza como tipo para el guardado de datos JSON. Y javascript como lenguaje de la banda de servidor. Incorpora replicación y sharding, así como un módulo de cálculos de agregados, capaz de ejecutar map-reduce con algunas diferencias para aquellos que estamos acostumbrados a lanzar map-reduce sobre Hadoop.
Dispone de una cantidad enorme de drivers de conexión para la gran mayoría de lenguajes de programación.
En breve, una pequeña guía de instalación.

Orientación a objetos con JavaScript

Hoy en dia es impesable una programación compleja sin una orientación a objetos, pudiendo delegar a estos una estructura (propiedades o atributos) y unas acciones a realizar (funciones). Pues llega la hora de aplicar este conocimiento a javascript, donde muchos de nosotros solemos hacer una programación más lineal y poco estructurada, pero hay momentos que por su complejidad es necesario aplicar esta.

Vamos a ver unos ejemplos de programación orientada a objetos con JavaScript:

Clase con 2 atributos:

function Clase() {

this.Atributo1 = 0;
this.Atributo2 = ”;
}
var ObjetoDeTipoClase = new Clase();
ObjetoDeTipoClase.Atributo1 =1;
alert(ObjetoDeTipoClase.Atributo2);

 

Clase con 2 atributos y 2 funciones:

function Clase() {

this.Atributo1 = 0;
this.Atributo2 = ”;
this.Accion1=funtion(){
this.Atributo2+=”Accion sin parametros”;
}
this.Accion2=function(Parametro1){
this.Atributo1=2*3;
}
}
var ObjetoDeTipoClase = new Clase();
ObjetoDeTipoClase.Atributo1 =1;
alert(ObjetoDeTipoClase.Atributo2);

Clase estática:

var Gestor= {

Delete: function(Id) {
itemActual = new Clase();
itemActual.Accion2();
 }
}
Gestor.Delete(1);

Espero que estos ejemplos os sean de utilidad.

SolR, the great search engine

Como ser tan rápido buscando como google, como poder realizar búsqueda semáticas sobre una gran cantidad de texto, y si encima quieres diferenciar el idioma, se te ocurre algún otro tipo de búsqueda, geografica, ya sea por radio o cuadrangular, saber a que distancia está el punto, y todo ello sin picar una línea de código, lo que buscas es SolR.

Desde hace más de dos años estoy trabajando con Lucene .Net que ofrecia muchas de estas características, pero debido a problemas a la hora de trabajar con indices grandes (>2Gb), principalmente lentitud a la hora de calcular “Facets” (típico group by de sql utilizado para búsquedas guiadas Ejemplo: 1223 articulos de .net / 233 articulos de java / 43 articulos de sql server…) se tuvo que empezar a investigar en otras tecnologias. SolR es un motor java que trabaja sobre Lucene versión java que siempre esta más actualizado que la versión .Net, sobre la cual podemos trabajar via peticiones http, casi como si fuera un Web Service. Vamos a describir rápidamente las ventajas y vamos a explicar como hacer el hello world de este tipo de búsquedas.

Caminando hacia el “Hello world de Solr”:

1. Descargar SolR (aquí)
2. Verifica que tienes java instalado, para ello ejecuta> “cmd” y dentro de la pantalla “java -version”, sino obtienes respuesta descargalo aquí.
3. Descomprime los ficheros de SolR
4. Ves al directorio example
5. Ejecuta “java -jar start.jar”
6. Ya puedes hacer una petición a tu SolR, fácil verdad: http://localhost:8983/solr/admin/

Serializar y Deserializar .Net

Serializar a xml y Deserializar a objetos es una acción muy útil en programación, pero lo que es muy útil, es tener un código que te permita realizar esta acción en todos tus objetos de .Net. La aplicación de este tipo de utilidades es muy útil para la comunicación cliente-servidor, guardar datos en disco de una manera estructura, o visualización de datos en estilo xml.

Aquí el código:

SERIALIZACIÓN

public static string Serialize(object pBenefit)

{

System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(pBenefit.GetType());

System.Text.StringBuilder sb = new System.Text.StringBuilder();

System.IO.StringWriter writer = new System.IO.StringWriter(sb);
ser.Serialize(writer, pBenefit);
return sb.ToString();
}

DESERIALIZACIÓN

public static object Deserialize(string lXml, Type lType)
{
System.Xml.XmlDocument doc = new System.Xml.XmlDocument();

doc.LoadXml(lXml);

System.Xml.XmlNodeReader reader = new System.Xml.XmlNodeReader(doc.DocumentElement);

System.Xml.Serialization.XmlSerializer ser = new System.Xml.Serialization.XmlSerializer(lType);

object obj = ser.Deserialize(reader);

return obj;

}

100% CPU w3wp.exe

Este es un problema al que alguna vez muchos de nosotros nos hemos tenido que enfrentar, yo hacia casi 3 años que no tenía este problema, pero este último mes ha resultado que me ha sucedido en 2 ocasiones en 2 proyectos totalmente diferentes, de empresas diferentes y ambos estables (1 lleva un año trabajando con una gran cantidad de usuarios y otro más de 4 sin dar ningún problema).

¿Como actuar? ¿Que hacer? ¿Es software o hardware? Estas son las preguntas típicas cuando detectamos este problema, voy a intentar describir unos pasos para poder determinar el porqué del problema.

Sintoma:
     El proceso w3wp.exe automenta el consumo de CPU, muchas veces sin ningun tipo de pauta, sube, baja pero siempre vuelve durante mucho rato a un excesivo uso de CPU.

Identificar que falla:
     1. Primeramente hemos de indentificar que site es la que nos esta dando problemas, para ello crearemos si no lo tenemos ya, un pool para cada una.
     2. Ejecutamos el comando ‘iisapp’ en caso de estar en un entorno Win 2003 o si estamos en un entorno Win 2008, nos vamos directamente al IIS y clicamos sobre Worker Process.
     3. Llegados a este punto sabemos que aplicación nos esta dando problemas.

     4. Ahora podriamos plantearnos si hemos realizado algún cambio reciente, o si este problema se ha originado a una hora concreta, debiendo revisar a que hora comenzo y con que proceso tiene relación.
     5. Utilizar una herramienta para determinar que esta haciendo subir la CPU, normalente, la CPU sube porque estamos haciendole hacer a la máquina más cálculos de los normales, o alguno de ellos tiene un coste excesivo. Encontrar donde se encuentra este fallo, es la dificultad. Yo he utilizado 2 herramientas, logparser y JetBrains para localizar el problema.

LOGPARSER:
Es una aplicación que nos permite parsear el log del IIS, pudiendo determinar que página es la que más le esta costando procesar, así como ver rápidamente si una IP nos esta haciendo un ataque de denegación de servicio, que podría ser una causa de este sintoma. También podemos comparar número de peticiones de otro día para ver si son coherentes los datos, o llegar a ver exactamente la petición que nos están realizando.

JETBRAINS DOTTRACER:
Esta es una aplicación muy interesante, de la cual encontramos diferentes versiones, una de ellas demo válida para 30 días, que ayudará más que la anterior. Su uso es bastante simple, iniciamos, indicamos que queremos hacer un Profiling de una aplicación web, y cuando deseemos obtenemos los resultados. Podremos llegar a ver que llamadas a realizado nuestro código, viendo el tanto por ciento de tiempo que se esta llevando cada proceso. El resultado nos puede ayudar a identificar que hay un bucle que esta quedandose colgado, o que estamos llamado demasiadas veces a un proceso muy costos.

Resolver el problema:
     En mi caso 1)
El problema vino debido a que en un bucle estaba llamando unas 200 veces a algo parecido a esto:

For i as Integer = 0 to 200
     Me.Label1.Text = Me.Label1.Text + “hola”
next

Esto que parece tan simple, tiene un coste exagerado para .Net (no se muy bien porque, si alguién lo tiene claro que me lo explique)

SOLUCIÓN:
   
   StringBuilder Aux = new StringBuilder()
      Aux.Append(Me.Label1.Text)
     For i as Integer = 0 to 200
             Aux.Append(“hola”)
     next

     En mi caso 2) El problema surgio debido a un proceso de caducidad, que hizo que un bucle no tuviese final, algo tan sencillo fueron más de 12 horas buscando el problema.

 

Espero que esta información os sirva de guia ante un caso similar, y sobretodo os aconsejo utilizar el Jet Brains.

Trabajando con Sql Server 2008 y XML

Desde la aparición de Sql Server 2005 y todas las funcionalidades para trabajar con XML, este se ha convertido en un recurso muy bueno en según que momentos del desarrollo de una aplicación. Poder guardar xml, sin tamaño fijo, estructurado y sobre el cual poder realizar búsquedas es un factor muy importante en el momento de decidir si trabajar con este tipo de datos.

En mi caso, lo utilizamos normalmente para tener una tabla desnormalizada, sobre el cual realizar una única lectura y obtener en una única lectura valores que obtendriamos en N lecturas debido a las relaciones 1 a N.

Ejemplo sencillo:

La complicación viene, cuando queremos efectuar diferentes operaciones sobre el xml, aquí van un par de ejemplos utiles:

XML Origen:

<ArrayOfVacancy_Benefits_Denormalized xmlns:xsi=http://www.w3.org/2001/XMLSchema-instance xmlns:xsd=http://www.w3.org/2001/XMLSchema>
  <
Vacancy_Benefits_Denormalized>
    <
IdVacancyBenefits>263716</IdVacancyBenefits>
    <
IdVacancy>1189680</IdVacancy>
    <
IdBenefits>16</IdBenefits>
    <
IdStatus>2</IdStatus>
    <
Benefits>Bônus por
resultado</Benefits>

  </
Vacancy_Benefits_Denormalized>
  <
Vacancy_Benefits_Denormalized>
    <
IdVacancyBenefits>263717</IdVacancyBenefits>
    <
IdVacancy>1189680</IdVacancy>
    <
IdBenefits>31</IdBenefits>
    <
IdStatus>2</IdStatus>
    <
Benefits>Vale-transporte</Benefits>
  </
Vacancy_Benefits_Denormalized>
</
ArrayOfVacancy_Benefits_Denormalized>

Consulta con where sobre el campo XML:

select Top 100 * from Vacancy where Benefits.exist(‘/ArrayOfVacancy_Benefits_Denormalized/Vacancy_Benefits_Denormalized[IdBenefits=16]’)=1

Como detalle, marcar que hay que igualar el resultado del exist a 1, ya que sino te indica que no es un resultado booleano (algo ilógico por su parte)

Select con subselect sobre el XML:

 

select cast(Benefits.query(‘for $i in
/ArrayOfVacancy_Benefits_Denormalized/Vacancy_Benefits_Denormalized//Benefits
return string($i)’
)as varchar(max))
from Vacancy


En este caso, como podemos tener N Vacancy_Benefits_Denormalized, concateno los Valores de Benefits y los devuelvo como una única columna.

Hola mundo, Hola geeks!!!

Hola a todos, aprovecho este primer post para presentarme y explicaros quien soy y cuales son los temas de los que tratará este blog.

Mi nombre es Marcos Palacios y soy Ingeniero Informático con casi 10 años de experiencia en tecnologias .Net, empezando por aquel olvidado ASP al hoy archimoderno Asp.Net con su framework 4.0 con vs2010.
Actualmente estoy trabajando en una de las empresas punteras en el sector de internet por lo que se refiere a España y Latinoamerica, Anuntis. En concreto en el departamento de Latinoamérica donde llevo a cabo diferentes tareas, estando al frente de los diferentes sistemas de búsquedas de los diferentes portales de Latinoamérica como son InfoJobs.com.br, Segundamano.com.mx, Segundamano.com.ar, Balcao.com y Autofoco.com.

En este blog, trataré de informar de todo aquello que sé y voy aprendiendo, mayormente con referencias a tecnologias microsoft pero siempre dejando un espacio para otros sistemas, ya que siempre hay que estar al corriente de todo lo que va surgiendo y nos puede ayudar a mejorar.

Este blog, también nace como prolongación de uno ya existente, http://blog.marcospalacios.com, en el cual he ido publicando durante estos 2 últimos años, diferentes artículos con la misma finalidad.

Sin más, un saludo a todos.

Marcos Palacios