Instalación de Redis en Linux Centos

mayo 8th, 2012

Si estas intentando compilar redis en Linux Centos de 32 bits es probable que obtengas algunos errores, para solucionar esto es necesario editar el archivo src/.make-settings.

nano src/.make-settings
## Modificar la variable OPT asi.
OPT=-O2 -march=i686

Ahora descargamos el código fuente de Redis y compilamos

cd /usr/src
wget  http://redis.googlecode.com/files/redis-2.6.0-rc3.tar.gz
tar -xvf redis-2.6.0-rc3.tar.gz
cd redis-2.6.0-rc3
make && make install

Creamos las carpetas necesarias para Redis y el archivo de configuración.

mkdir /etc/redis /var/lib/redis
sed -e "s/^daemonize no$/daemonize yes/" -e "s/^dir \.\//dir \/var\/lib\/redis\//" -e "s/^loglevel debug$/loglevel notice/" -e "s/^logfile stdout$/logfile \/var\/log\/redis.log/" redis.conf > /etc/redis/redis.conf

Y por ultimo instalamos el servicio.

wget https://raw.github.com/gist/257849/9f1e627e0b7dbe68882fa2b7bdb1b2b263522004/redis-server
sed -i "s/usr\/local\/sbin\/redis/usr\/local\/bin\/redis/" redis-server
chmod u+x redis-server
mv redis-server /etc/init.d
/sbin/chkconfig --add redis-server
/sbin/chkconfig --level 345 redis-server on
/sbin/service redis-server start

Fuente: http://www.ebrueggeman.com

Closure y Scope

abril 24th, 2012

Esta mañana aproveché que tenia unas horillas libres para leer algo sobre Closure.

En pocas palabras.. Los closure son porciones de código que pueden ser pasados como argumento a una función. Esto en C# es ampliamente soportado gracias a los delegados y las lambda expressions.

Un ejemplo clásico de Closure es crear una función dentro de otra, y lo mas importante es que la función que esta dentro puede acceder a las variables que están en la función contenedora.

Otra cosa muy importante es que las variables de la función contenedora mantiene el estado aunque esta función se haya terminado.

Para que quede mas claro les muestro un ejemplo simple de Closure:

static void Main(string[] args)
{
	var func = SumarFunc();

	Console.WriteLine(func(1));
	Console.WriteLine(func(2));
	Console.WriteLine(func(3));
	Console.ReadKey();

}

public static Func<int, int> SumarFunc()
{
	var a = 1;
	return delegate(int b)
			{
				a = a + 1;
				return a + b;
			};
}

Y esto es la salida en consola:

Instalación de MONO desde el repositorio

abril 21st, 2012

Instalación de MONO

cd /usr/src
git clone git://github.com/mono/mono.git
cd mono
./autogen.sh --prefix=/usr/local
make
make install

Instalación de XSP

cd /usr/src
git clone git://github.com/mono/xsp.git
cd xsp
git checkout 2.10.2
 ./configure --prefix=/usr/local --with-runtime=/usr/local/bin/mono
make
make install

Para poner en marcha fastcgi mono:

fastcgi-mono-server4 /applications=/:/var/www/asptest /socket=tcp:127.0.0.1:9002 &

(De este modo arrancamos manualmente, si queres evitar esto y que lo haga automáticamente, deberías incluir este comando en /etc/rc.local)

Configuración MONO con NGINX

http://quepagina.es/linux/aspnet-en-linux-nginx-mono-xsp.html

Monitoreando NGINX con Nodejs

enero 2nd, 2012

Hace unos meses en Genwise, empresa en donde trabajo, lanzaron un desafio al equipo, que consistía en crear un pequeño monitor para una aplicación que desarrolla la empresa. Este desafio era personal, a cada programador se le daba como meta desarrollar una aplicación de monitoreo con una serie de especificaciones sobre las tecnologías a utilizar.

A mí me tocó desarrollar con PhoneGap para Android (utilizando librerías Jquery y Jquery Mobile). En ese momento se me ocurrió que quizás sería importante realizar una aplicación de monitoreo en tiempo real. Pero luego de discutirlo con el equipo, llegamos a la conclusión de que utilizar tecnologías como websockets no resultaban necesarias.

Y como desde hace un tiempo, vengo leyendo sobre nodejs, quise crear algo similar al monitor de Genwise pero para nginx (un server web para linux).

Decidí llamar a la aplicación Nginx Monitoring Tool que, por supuesto, es open source.

Básicamente -como ya les comente- su principal tarea será monitorear en tiempo real un server nginx.

¿Qué debemos monitorear?

La idea es monitorear un server web Nginx, y para esto deberemos habilitar la opción de status que se hace de la siguiente manera.

location /nginx_status {
  stub_status  on;
  access_log   off;
  allow SOME.IP.ADD.RESS;
  deny all;
}

Faye para el server

Primero debía crear el server Faye, en donde pueda implementar los distintos canales de monitoreo. Crear un server FAYE en nodejs es muy fácil. Miren estas líneas.

var Faye = require('faye'),
jsdom = require('jsdom'),
server = new Faye.NodeAdapter({mount: '/'});

server.listen(1337, "localhost");

console.log("Server faye corriendo...");

Con eso ya tenemos un server faye corriendo en el puerto 1337, pero esto no es todo. Debemos crear los distintos canales de monitoreo (visitas, lecturas, esperas, etc.) que veremos más adelante. También vamos a obtener los fuentes del status de nginx y realizar un pequeño “parseo”.

setInterval(sendData, 3000);

function sendData(){
        jsdom.env(
                "http://localhost/nginx_status",
                [ 'http://code.jquery.com/jquery-1.5.min.js' ],
                function (errors, window){
                        var $ = window.jQuery;

                        var lines = $('body').text().split("\n");

                        //visits (active connections)
                        var visitsPieces = lines[0].split(" ");
                        var visits = visitsPieces[visitsPieces.length - 2];

                        server.getClient().publish('/act', {
                          text:       visits
                        });
                        //

                        var lastLinePieces = lines[3].split(" ");

                        //Readings
                        var readings = lastLinePieces[1];

                        server.getClient().publish('/rea', {
                          text:       readings
                        });

                        //Writing
                        var writing = lastLinePieces[3];

                        server.getClient().publish('/wri', {
                          text:       writing
                        });

                        //Wainting
                        var waiting = lastLinePieces[5];

                        server.getClient().publish('/wai', {
                          text:       waiting
                        });

                }
        );
}

El cliente

Los datos obtenidos del server lo representaremos en forma de gráficos estadísticos, usando una librería javascript muy utilizada llamada jqplot.

También necesitaremos la librería browser de Faye para poder inscribirnos a los distintos canales de monitoreo. Ver codigo completo del archivo client.js

Conclusión:

Si bien existen muchas cosas por solucionar y mejorar en Nginx Monitoring Tool. Podemos decir que se encuentra en una fase pre-alpha ;) . Nunca pensé que diría esto, pero JS me está gustando mucho. Y todo gracias a nodejs :P

Como actualizar TAR en Centos 5.7

diciembre 10th, 2011

Hoy cuando quería instalar socket.io utilizando el siguiente comando…

npm install socket.io

.. solo obtenía un error y es porque Centos 2.7 tiene una versión vieja de la aplicación TAR (una del 2004!). Bueno, para solucionar esto hay que actualizar TAR.

Estos son los pasos necesarios para actualizar TAR.

wget http://ftp.gnu.org/gnu/tar/tar-1.26.tar.gz
gunzip tar-1.26.tar.gz
tar -xvf tar-1.26.tar
cd tar-1.26
./configure FORCE_UNSAFE_CONFIGURE=1
make
make install
cp -f src/tar /usr/local/bin/tar

Ahora el comando npm debería funcionar ;)

Configuración NHibernateProfiler en 2 pasos

noviembre 17th, 2011

Paso 1:

Agrega una referencia a la dll HibernatingRhinos.Profiler.Appender.dll

Paso 2:

Arranca el profiler agregando la siguiente linea de código.

NHibernateProfiler.Initialize(
	new NHibernateAppenderConfiguration
	{
		Port = 22897,
		HostToSendProfilingInformationTo = "127.0.0.1"
	}
);

Web: http://nhprof.com/

Truquillos Oracle

noviembre 10th, 2011

Aquí van algunos truquillos Oracle que a mi me sirven mucho.

¿Como crear una conexión a una base de datos remota?

CREATE DATABASE LINK serverremoto
   CONNECT TO USERDB IDENTIFIED BY PASSDB
   USING 'serverremoto';

¿Como puedo copiar los datos de una tabla en un server remoto a una tabla local?

//Primero crear DatabaseLink..(ver arriba)
insert into tablalocal
select * from tablaremota@serverremoto

¿Como ver rápidamente las columnas y propiedades de una tabla?

desc nombretabla;

¿Como hacer un select de todos los nombres de una tabla?

select COLUMN_NAME from user_tab_columns
where table_name='NOMBRETABLA';

Mapeando DTOs con AutoMapper

mayo 30th, 2011

Todo programador debería adorar AutoMapper porque cuando lo utilizamos evitamos escribir muchas líneas de código.

Uno de los ambientes ideales para la utilización de AutoMapper es en los proyectos donde es necesaria la utilización de DTOs para transportar datos entre distintas capas de aplicación, por ejemplo entre un servicio y el cliente.

Con solo 2 lineas de código Automapper asignará nuestro DTO de forma automática.

Ahora les mostraré un ejemplo sencillo, primero vemos el modelo.

public class Cliente
{
    public string Nombre { get; set; }
}

public class Factura
{
    public int Numero { get; set; }
    public Cliente Cliente { get; set; }
    public DateTime Fecha { get; set; }
    public List<FacturaRenglon> Renglones { get; set; }
    public int TraerTotal()
    {
        var query = from r in Renglones
                    select r;
        return query.Sum<FacturaRenglon>(a => a.TotalRenglon);
    }
}

public class FacturaRenglon
{
    public FacturaRenglon(int cantidad, string producto, int totalrenglon)
    {
        Cantidad = cantidad;
        Producto = producto;
        TotalRenglon = totalrenglon;
    }

    public int Cantidad { get; set; }
    public string Producto { get; set; }
    public int TotalRenglon { get; set; }
}

El DTO para factura:

public class FacturaDTO
{
    public string ClienteNombre { get; set; }
    public int Numero { get; set; }
    public DateTime Fecha { get; set; }
    public int TraerTotal { get; set; }
    public List<FacturaRenglon> Renglones { get; set; }
}

Y ahora el Tests:

[TestFixture]
public class automappertests
{
    public Cliente cliente;
    public Factura factura;
    [SetUp]
    public void SetUp()
    {
        cliente = new Cliente();
        cliente.Nombre = "Distribuidora El Caniche";
        factura = new Factura();
        factura.Renglones = new List<FacturaRenglon>();
        Mapper.CreateMap<Factura, FacturaDTO>();
    }

    [Test]
    public void Mapeo_dto_factura_test()
    {
        //Arrange
        factura.Fecha = DateTime.Today;
        factura.Cliente = cliente;
        factura.Numero = 1;
        factura.Renglones.Add(new FacturaRenglon(1, "Televisor Samsung HD 42", 4000));
        factura.Renglones.Add(new FacturaRenglon(3, "Notebook Dell I5 4GB", 3000));

        //Act
        var dto = Mapper.Map<Factura, FacturaDTO>(factura);

        //Assert
        dto.ClienteNombre.Should().Be.Equals("Distribuidora El Caniche");
        dto.Renglones.Count.Should().Be.Equals(2);
        dto.TraerTotal.Should().Be.Equals(7000);
    }
}

Más simple imposible. ¿No? ;)

Web: http://automapper.codeplex.com/