Noticias Weblogs Foros Wiki Código
Sponsors:

Meta-Info

¿Que es?

Planeta Código es un agregador de weblogs sobre programación y desarrollo en castellano. Si eres lector te permite seguirlos de modo cómodo en esta misma página o mediante el fichero de subscripción.

rss subscripción

Sponsors

Anunciarse aquí

PlanetaCódigo en inglés

Puedes utilizar las siguientes imagenes para enlazar PlanetaCodigo:
planetacodigo

planetacodigo

Si tienes un weblog de programación y quieres ser añadido aquí, envíame un email solicitándolo.

Idea: Juanjo Navarro

Diseño: Albin

¿El núcleo de Linux independiente de SMP?

Noviembre 30th, 2005 - [Enlace local]

Hoy Ubunto Dapper Drake nos tenía reservado una sorpresa. Una nueva versión del núcleo, la 2.6.15-5. Hace tiempo que no sigo el desarrollo del núcleo de Linux, pero para mí que esa versión del núcleo está todavía en desarrollo. El caso es que ha funcionado después de hacer algunos cambios en los ficheros (por ejemplo, entre otras cosas, no encontraba el firmware de la inalámbrica ipw2100). Una vez que ha arrancado, sin embargo, he encontrado una cosa curiosa. Al principio del dmesg encuentro:

CPU0: Intel(R) Pentium(R) M processor 1500MHz stepping 05
SMP motherboard not detected.
Local APIC not detected. Using dummy APIC emulation.
Brought up 1 CPUs
smp2up: Dynamically optimizing SMP kernel code for UP operation...
smp2up: Made 3887 modifications to 'kernel'.

Esto es, al principio intenta detectar si la placa o el procesador es SMP. Si no es así, lo que parece que hace es optimizar el núcleo para que funcione mejor en una única CPU. Al menos eso es lo que creo que hace (por otro lado no parece ni tan complicado ni tan descabellado). Al intentar buscar «smp2up» en google, la página sale vacía. Extrañísimo, lo cual da la idea de lo nuevo de esta cuestión. Voy a bucear un poco en el código a ver si lo encuentro y puedo determinar qué hace. Publicaré una actualización cuando lo vea.

Actualización: Increíble. He revisado todo el código del núcleo de Linux (incluyendo los parches -git y -mm) y no he encontrado absolutamente ninguna referencia a ese “smp2up”. Estoy realmente intrigado. ¿Alguien puede dar algo de luz?

» Leer más, comentarios, etc...

Mejorando los procesos

Noviembre 30th, 2005 - [Enlace local]

En el blog WX Punto Net me encontré con este interesante artículo Procesos Ligeros derivados de RUP, al parecer el proceso de desarrollo de software sigue adoptando propuestas agilistas, todo sea en beneficio de la industria y como siempre la clave es el equilibrio.

» Leer más, comentarios, etc...

La luna ilumina por igual a culpables e inocentes

Drools I. Introducción a los motores de reglas de negocios.

Noviembre 30th, 2005 - [Enlace local]

Saludos.

Drools (http://drools.org) es una implementación libre de un motor de reglas de negocio compatible con la especificación JSR-94 Rules Engine API (http://www.jcp.org/en/jsr/detail?id=94). ¿Y qué es un motor de reglas de negocio?. Es un componente que, a partir de una información inicial y un conjunto de
reglas, detectas qué reglas deben aplicarse en un instante determinado y cuáles son los resultados de esas reglas.

Uno de los puntos fuertes de los motores de reglas de negocios es que hablan el mismo lenguaje que el dominio del problema. Un ejemplo típico: supongamos que estamos hablando con un cliente para el desarrollo de una tienda virtual.
Algunas de las cosas que nuestro cliente nos pediría pudieran ser:

Si la cuantía del pedido supera cierta cantidad o si es un cliente de confianza, entonces se le aplica un descuento. Si se compra más de N productos del mismo tipo se le aplica un descuento. Entre las fechas X e Y, un producto está en oferta y, si se lleva 2, se le añade un 3º gratis

En una aplicación normal, todo lo anterior deberíamos codificarlo en métodos de clases que se ejecutaran al procesar un pedido, lo cual no siempre es sencillo. Con un motor, solo tenemos que indicarle las reglas de negocio, e ir indicándole los hechos. En este ejemplo, tendríamos que suministrarle al motor la información sobre los pedidos, clientes y productos mediante clases JavaBean.

Otra ventaja es a la hora de realizar cambios o mantenimiento. Si nuestro cliente desea cambiar el descuento por pedido, o el descuento por número de productos, o las fechas o tipos de productos (o quitar todos los descuentos), con un motor de reglas de negocio sólo es necesario cambiar las reglas, sin necesidad de modificar código, recompilar, ni siquiera de parar la aplicación.

Básicamente un motor de reglas de negocio está compuesto de tres elementos: un conjunto de reglas, el espacio de trabajo (o el conocimiento que tiene), y el procesador de reglas. Las reglas son sentencias de la forma IF-THEN, de tal manera que si se cumplen todas las condiciones del IF se ejecutan todas las acciones del THEN. El espacio de trabajo es donde se guarda el conocimiento (objetos Java) que el motro utilizará para decidir que reglas deben activarse.

Dentro de las reglas pueden existir conflictos. Un conflicto es cuando varias reglas distintas pueden activarse para el mismo conjunto de hechos y, la aplicación de dichas reglas, pueden tener resultados contradictorios. Algunas de las estrategias para resolver conflictos son: asignarle una prioridad a cada regla, estrategias FIFO o LIFO, aplicarlas en el orden en que se declararon o aplicarlas en orden aleatorio.

Existen otros motores de reglas de negocio para java, por ejemplo JESS (http://herzberg.ca.sandia.gov/jess/), Mandarax (http://mandarax.sourceforge.net/) o OpenRules (http://java-source.net/open-source/rule-engines/openrules). También hay
motores de reglas de negocio para plataforma .NET como Quick Rules, JRules o Blaze.

Los motores de reglas de negocio pueden utilizarse, por ejemplo, para desarrollar prototipos rápidos o, incluso, para implementar la lógica de la aplicación. También pueden utilizarse como parte de un sistema de workflow.

En el próximo mensaje pondré un ejemplo de como implementar el caso práctico que hemos visto.

» Leer más, comentarios, etc...

La luna ilumina por igual a culpables e inocentes

Drools I. Introducción a los motores de reglas de negocios.

Noviembre 30th, 2005 - [Enlace local]

Saludos.

Drools (http://drools.org) es una implementación libre de un motor de reglas de negocio compatible con la especificación JSR-94 Rules Engine API (http://www.jcp.org/en/jsr/detail?id=94). ¿Y qué es un motor de reglas de negocio?. Es un componente que, a partir de una información inicial y un conjunto de
reglas, detectas qué reglas deben aplicarse en un instante determinado y cuáles son los resultados de esas reglas.

Uno de los puntos fuertes de los motores de reglas de negocios es que hablan el mismo lenguaje que el dominio del problema. Un ejemplo típico: supongamos que estamos hablando con un cliente para el desarrollo de una tienda virtual.
Algunas de las cosas que nuestro cliente nos pediría pudieran ser:

Si la cuantía del pedido supera cierta cantidad o si es un cliente de confianza, entonces se le aplica un descuento. Si se compra más de N productos del mismo tipo se le aplica un descuento. Entre las fechas X e Y, un producto está en oferta y, si se lleva 2, se le añade un 3º gratis

En una aplicación normal, todo lo anterior deberíamos codificarlo en métodos de clases que se ejecutaran al procesar un pedido, lo cual no siempre es sencillo. Con un motor, solo tenemos que indicarle las reglas de negocio, e ir indicándole los hechos. En este ejemplo, tendríamos que suministrarle al motor la información sobre los pedidos, clientes y productos mediante clases JavaBean.

Otra ventaja es a la hora de realizar cambios o mantenimiento. Si nuestro cliente desea cambiar el descuento por pedido, o el descuento por número de productos, o las fechas o tipos de productos (o quitar todos los descuentos), con un motor de reglas de negocio sólo es necesario cambiar las reglas, sin necesidad de modificar código, recompilar, ni siquiera de parar la aplicación.

Básicamente un motor de reglas de negocio está compuesto de tres elementos: un conjunto de reglas, el espacio de trabajo (o el conocimiento que tiene), y el procesador de reglas. Las reglas son sentencias de la forma IF-THEN, de tal manera que si se cumplen todas las condiciones del IF se ejecutan todas las acciones del THEN. El espacio de trabajo es donde se guarda el conocimiento (objetos Java) que el motro utilizará para decidir que reglas deben activarse.

Dentro de las reglas pueden existir conflictos. Un conflicto es cuando varias reglas distintas pueden activarse para el mismo conjunto de hechos y, la aplicación de dichas reglas, pueden tener resultados contradictorios. Algunas de las estrategias para resolver conflictos son: asignarle una prioridad a cada regla, estrategias FIFO o LIFO, aplicarlas en el orden en que se declararon o aplicarlas en orden aleatorio.

Existen otros motores de reglas de negocio para java, por ejemplo JESS (http://herzberg.ca.sandia.gov/jess/), Mandarax (http://mandarax.sourceforge.net/) o OpenRules (http://java-source.net/open-source/rule-engines/openrules). También hay
motores de reglas de negocio para plataforma .NET como Quick Rules, JRules o Blaze.

Los motores de reglas de negocio pueden utilizarse, por ejemplo, para desarrollar prototipos rápidos o, incluso, para implementar la lógica de la aplicación. También pueden utilizarse como parte de un sistema de workflow.

En el próximo mensaje pondré un ejemplo de como implementar el caso práctico que hemos visto.

» Leer más, comentarios, etc...

Métricas Web

Consejos para el desarrollo en C en sistemas UNIX

Noviembre 30th, 2005 - [Enlace local]

Hace poco me tuve que enfrentar al desarrollo de un pequeño servidor de "servicios" en UNIX (un programa similar a un servidor web). Os pongo aquí algunas observaciones y consejos que tuve en cuenta en el momento del desarrollo, por si os pueden ayudar.

- Gestión del log de la aplicación:

Crear un buffer de línea para el log:

setvbuf(access_log, (char *) NULL, _IOLBF, 0); (acces_log es el descriptor del fichero de log que abrimos siempre con los flags de concatenación)

Con este buffer nos aseguramos que en cuanto se llene una línea esta se escriba inmediatamente al fichero.

Podemos redirigir la salida estándar de errores al log de error mediante dup2 (duplicación de descriptores de fichero)

dup2(error_log, STDERR_FILENO) Todo lo que valla al STDERR_FILENO (la salida de error) irá a nuestro log cuyo descriptor es error_log

También lo podemos hacer para la salida estandar mediante: STDOUT_FILENO

Otro truco, si no queremos que el programa imprima nada por las salidas estándar, es abrir el fichero /dev/null asignándole, por ejemplo, el descriptor dev_null y hacer lo siguiente:

dup2(dev_null, 1); dup2(dev_null, 2);

Para escribir en el log conviene utilizar fputs antes que fprintf ya que en sistemas SOLARIS si escribís algo NULL podéis tener problemas con fprintf.

También podemos poner el flag Close on exec a TRUE:
fcntl(acces_log, F_SETFD, 1)
... si vamos a utilizar cualquier función de la familia exec, de esta forma no se heredan los descriptores de fichero abiertos.


- Lanzar el programa como un demonio (si está destinado a ese fin).

Podemos utilizar fork() de la siguiente forma al inicio del proceso para que se nos ponga en background.

if (fork())
exit(0) // terminamos el proceso padre

setsid(); // El hijo ahora no tiene terminal asociado y es el nuevo lider del grupo de procesos

if (fork())
exit(0) // terminamos el proceso padre

Gracias a Jim por avisar en los comentarios que faltaba el segundo fork

- Cuestiones de seguridad.

Nada más iniciar el programa podemos crearle una jaula chroot mediante la función:

chroot(/directorio/aplicacion)

De esta forma el proceso tomará como directorio "/" el /directorio/aplicación y no podrá salir de dicho directorio para leer o modificar otros ficheros.

Podemos cambiar el uid del proceso a uno sin privilegios mediante setuid. Si hemos lanzado el proceso con privilegios de root, por ejemplo, y nos interesa poder volver a ser root cuando queramos podemos utilizar seteuid.

Por ejemplo:
seteuid(852)
abrir un fichero o hacer algo
seteuid(0) // volvemos a ser root

Si hacemos un seteuid antes de un fork, el proceso hijo tendrá el uid indicado por el seteuid.

Establecer la máscara de creación de ficheros: mediante la función umask definimos los permisos con los que se crearán los nuevos ficheros.


- Capturar las señales que lleguen al programa.

Mediante la biblioteca sigaction podemos capturar todas las señales (exceptor SIGKILL o SIGSTOP) y asignarles un controlador. Esto es útil para poder cerrar los descriptores de ficheros, indicar en los logs que se está reiniciando, abortando el programa o realizar cualquier acción.


- Fijar los límites de consumo del programa.

Mediante la llamada al sistema setrlimit(); podemos fijar límites de consumo al proceso. Por ejemplo, el número máximo de descriptores de fichero que puede abrir (útil si trabajamos con sockets), también podemos limitar el uso de cpu etc... Para más información, este link.


- Obtener los parámetros de entrada al programa.

Os recomiendo utilizar la función getopt. En bulma tenéis un excelente tutorial para ello.


- Autoconf y Automake.

Con estas herramientas podemos hacer que nuestra aplicación siga el proceso de instalación estándar de GNU. Además, nos chequean el sistema antes de la instalación para ver que no falta ninguna biblioteca además de crearnos los makefiles para compilarlo. Os recomiendo leer Autobook


Seguro que me dejo algún truquito más en el tintero, agradezco comentarios y críticas (positivas o negativas) y ,por supuesto, mención a cualquier error que haya cometido en el artículo.



» Leer más, comentarios, etc...

MonoTella

Noviembre 30th, 2005 - [Enlace local]

Despues de pasar cerca de 2 semanas metido en windows para poder terminar un trabajo de Dinamica de Sistemas, y casi pelearme con todo el mundo (Es increible como te cambia el humor despues de pasar mas de 8 horas en windows), al fin logre terminar el bendito curso. Y convencido como estoy que nadie mas en el mundo debe tener que soportar usar windows para poder pasar curso alguno, decidi embarcarme en la construccion de monotella que hasta donde tengo entendido seria el primer programa libre para desarrollar diagramas de forrester (tanta era mi deseperacion que hubiera usado un programa hecho en java o incluso uno de KDE :S).

Esta basado como no en mono y gtk, de momento estoy revisando el trabajo de CeronMan y MarioC en el canvas de monouml. Pienso que puedo tomar eso como base y evitarme mucho trabajo.

Para los que no sepan que un diagrama de forrester ahi les dejo unas pantallas. :D

Si alguien estuviera interesado (o interesada) en participar comuniquese conmigo cualquier ayuda es bienvenida.


Diagrama de Forrester

» Leer más, comentarios, etc...

Desarrollo con Ruby on Rails en Mac OSX (IV): Comenzando el desarrollo

Noviembre 30th, 2005 - [Enlace local]

Pues ya sólo falta probar la instalación por completo generando el modelo para la aplicación e intentando conectar a la misma. Lo primero será, por tanto, generar el modelo.

GenerarModelo.jpg

Como puede verse en la siguiente imagen, la estructura del proyecto es clara y bien organizada. Cada cosa está en su sitio.

UbicacionModelo.jpg

El siguiente paso, es generar el controlador:

GenerarControlador.jpg

Para tener una aplicación mínimamente funcional, en la que están implementadas ya las cuatro operaciones básicas (alta, baja, modificación y consulta) tan sólo hay que editar el controlador de mi aplicación, regalo_controller.rb, y añadir una línea:

scaffold.jpg

¡Y ya está!. Alta, baja, modificación y consulta, en dos minutos. Sobre decir que ahora es cuando debe comenzar el trabajo de verdad, pero ya tenemos un prototipo visible, a los pocos minutos de comenzar el desarrollo. ¿Somos ágiles o no?.

Para comenzar a introducir registros, hay que atacar la url http://localhost/test/regalo/new, y comenzar a toquetear:

primerListado.jpg

Resumiendo: he instalado Rails (media hora más o menos), he instalado MySQL (un poco más largo, por los problemas con las herramientas de administración, pero en total ha sido una hora), he compilado el binding para MySQL (varias horas de google y unos minutos de resolución) y he realizado la primera iteración del desarrollo propiamente dicho (¡cinco minutos!).

Ahora empieza lo bueno…

» Leer más, comentarios, etc...

Turbo C++ 3 con 128 Kb de memoria

Noviembre 29th, 2005 - [Enlace local]

¿Te imaginas poder ejecutar Turbo C++ 3 para DOS con solamente 128 Kb de memoria?

Al menos eso es lo que asegura Borland en la página de producto de Turbo C++ Suite.

Turbo C++ 3 para DOS es capaz de funcionar con solamente 128 Kb de RAM (1 Megabit).

Turbo C++ 4.5 para Windows 3.1, se conforma con solamente 2,5 Mb de espacio en disco (20 Megabit).

Juraría que las cantidades correctas estaban entorno a 8 veces más… porque si la memoria no me falla, ya el Turbo C++ 1.0 requería al menos 512 Kb de memoria.

Por supuesto la confusión se debe a un error de transcripción, indicando las unidades en bits, cuando se quiere decir bytes.

Cuando esta errata ocurre en una empresa que desarrolla software para desarrolladores, el asunto se torna considerablemente más grave. Quizás estoy dando demasiada importancia a los tecnicismos… Imaginaros por un momento que el error hubiera sido poner el precio en pesetas en vez de euros.

¡Malentendidos mucho mayores he visto por cosas muchísimo más pequeñas!

» Leer más, comentarios, etc...

Turbo C++ 3 con 128 Kb de memoria

Noviembre 29th, 2005 - [Enlace local]

¿Te imaginas poder ejecutar Turbo C++ 3 para DOS con solamente 128 Kb de memoria?

Al menos eso es lo que asegura Borland en la página de producto de Turbo C++ Suite.

Turbo C++ 3 para DOS es capaz de funcionar con solamente 128 Kb de RAM (1 Megabit).

Turbo C++ 4.5 para Windows 3.1, se conforma con solamente 2,5 Mb de espacio en disco (20 Megabit).

Juraría que las cantidades correctas estaban entorno a 8 veces más… porque si la memoria no me falla, ya el Turbo C++ 1.0 requería al menos 512 Kb de memoria.

Por supuesto la confusión se debe a un error de transcripción, indicando las unidades en bits, cuando se quiere decir bytes.

Cuando esta errata ocurre en una empresa que desarrolla software para desarrolladores, el asunto se torna considerablemente más grave. Quizás estoy dando demasiada importancia a los tecnicismos… Imaginaros por un momento que el error hubiera sido poner el precio en pesetas en vez de euros.

¡Malentendidos mucho mayores he visto por cosas muchísimo más pequeñas!

» Leer más, comentarios, etc...

Entrevista en Radio Creswin

Noviembre 29th, 2005 - [Enlace local]

El proximo jueves, 1 de diciembre, a las 18:30 horas en Mexico ( 1:30 horas del viernes 2 de diciembre en España), seré entrevistado en Radio Creswin sobre temas de SQL. Para formular preguntas, enviad un correo a radiocreswin@hotmail.com indicando…

» Leer más, comentarios, etc...

Páginas y controles compilados al vuelo con ASP.NET

Noviembre 29th, 2005 - [Enlace local]

A la hora de desarrollar páginas web en .NET es posible hacer que las páginas y los controles estén compilados y con toda la lógica en una DLL, o hacer que las páginas y los controles se compilen al vuelo conforme se van solicitando por los usuarios, quedando disponibles a partir de entonces para sucesivas peticiones. Dentro de la opción de compilación al vuelo podemos tener la lógica y la presentación (HTML) juntas en un mismo archivo, o en diferentes. Voy a tratar únicamente la forma basada en archivos independientes, ya que es la opción predeterminada en Visual Studio, SharpDevelop, además de propiciar una mayor separación entre lógica y presentación, lo cual incrementa la mantenibilidad del proyecto.

Ambas aproximaciones, compilación estática o al vuelo, tienen sus puntos fuertes así como algunos inconvenientes. La opción de tener toda la lógica compilada nos aporta una mayor velocidad desde el momento inicial en el que se arranca la aplicación, pero en contra nos obliga a tener que recompilar la aplicación o alguna parte de ella y generar una nueva DLL cada vez que se realiza un cambio, implicando un reinicio de la aplicación con el coste que ello supone.

Por contra la opción basada en compilación al vuelo, on the fly en inglés, nos permite modificar la lógica de cualquier página y control sin tener que recompilar la aplicación ni tener que reiniciar la aplicación. Sin embargo tiene como desventaja que el arranque de la aplicación será algo más pesado, ya que ninguna página o control estará compilado y por lo tanto será necesario compilarlos conforme se vayan solicitando, incrementando los requisitos del servidor en esos momentos.

En lo que a mi respecta, la mayoría de los proyectos que realizo últimamente los hago utilizando compilación al vuelo, a pesar de que al comienzo utilizaba la compilación estática. El motivo principal que propició este cambio fue la facilidad de mantenimiento que aporta la compilación al vuelo, aunque en ningún caso debería debería tomarse esto como una regla ya que cada proyecto es un mundo.

A continuación voy a explicar cómo hacer que las páginas y controles se compilen al vuelo, detallando algunos problemas con los que nos podemos encontrar y posibles soluciones.

» Leer más, comentarios, etc...

Las 10 reglas de una Start-up

Noviembre 29th, 2005 - [Enlace local]

Posiblemente muchos no conocereis a Evan Williams, pero es una de esas personas que han creado una start-up exitosa, y que va camino de la segunda si tiene suerte. Recientemente ha publicado una lista de las 10 reglas (+1 de bonus) que toda start-up debería seguir.







Continua leyendo “Las 10 reglas de una Start-up”

» Leer más, comentarios, etc...

knocte :: MonoTema

Mozilla Firefox 1.5 ya está en la calle

Noviembre 29th, 2005 - [Enlace local]

Nos lo cuenta stripTM antes que nadie en BarraPunto. Bueno, pues tras mucho testeo, mucho commit de última hora y mucho bug cosmético pendiente de aplicar para una posible versión 1.5.0.1, ¡Firefox ya está en la calle! Y además en español desde la portada de Mozilla Corporation desde su primer día de lanzamiento (es-ES). Tengo que agradecer a todos los miembros de NAVE por su apoyo en hacerme

» Leer más, comentarios, etc...

Software Guru No. 6 en circulación

Noviembre 28th, 2005 - [Enlace local]

Siempre alabo los artículos que en cada número de la revista de Software Guru se publican, pero especialmente en este he encontrado artículos muy interesantes, destaco los siguioentes:





La revista la pueden descargar del sitio de Software Guru.

» Leer más, comentarios, etc...

Delphi vs Visual Basic

Noviembre 28th, 2005 - [Enlace local]

Eterno dilema que lenguaje será mejor Delphi o Visual Basic los adoradores de Microsoft seguramente dirán que VB y se preguntarán Delphi? que es eso?. La realidad es que Delphi es un lenguaje muy potente que en muchos aspectos supera a VB, pero la gran ventaja de VB es todo el entorno .NET y el acobijamiento y Marketing de MicroSoft. Por ejemplo aqui en México es dificil encontrar libros de Delphi de la versión 6 o superior, eso habla del mercado enorme de las herramientas de MicroSoft. Aqui un comparativo de los lenguajes.

» Leer más, comentarios, etc...

Tres horas por un link

Noviembre 28th, 2005 - [Enlace local]

Aitor se reirá, porque sé que se va a reir, pero siguiendo con la serie de post que inició Ibon sobre errores comunes, voy a añadir uno hoy.







Continua leyendo “Tres horas por un link”

» Leer más, comentarios, etc...

MonoDevelop 0.9

Noviembre 28th, 2005 - [Enlace local]

Revisando el blog de Miguel veo que ya ha salido una nueva version de MonoDevelop y tiene características nuevas muy interesantes; las notas de esta version estan aqui.

Aunque yo uso Vim :P para programar, pero es bueno ver los avances que se hacen con la IDE de MonoDevelop.

Ahi los vidrios :) .

» Leer más, comentarios, etc...

Thefull

T-Gtk + Eagle1

Noviembre 28th, 2005 - [Enlace local]

T-Gtk + Eagle1 bajo GNU/Linux

» Leer más, comentarios, etc...

knocte :: MonoTema

eXtreme Programming: La chispa adecuada

Noviembre 27th, 2005 - [Enlace local]

Estos días he estado desempolvando una carpeta de mis marcadores titulada "Lecturas pendientes". Son enlaces que en su día me parecieron interesantes pero demasiado largos de leer en ese momento (una idea similar a lo que son los FIXMEs en el código). Uno de los enlaces a los que he llegado ha sido extremadamente interesante. Tanto, que los enlaces dentro de éste me han hecho abrir pestañas y

» Leer más, comentarios, etc...

vnsjava

programar para el nuevo procesador Cell

Noviembre 27th, 2005 - [Enlace local]

En developerworks hay un articulo sobre como programar para el nuevo procesador Cell de IBM,
espero que lo disfruten.

» Leer más, comentarios, etc...

vnsjava

Sobre JavaWebStart

Noviembre 27th, 2005 - [Enlace local]

Si de java también, otra tecnología

Es un lanzador de aplicaciones via un navegador web. Creo que el grafico es muy explicito.

ventajas:
Desventajas: tener un JRE mayor a 1.2 ( no creo que sea un problema pues es una aplicación de java :-)

para más información:
http://java.sun.com/products/javawebstart/

también este artículo:
http://www.javahispano.org/article

» Leer más, comentarios, etc...

CMM - CMMI Nivel 2

Noviembre 26th, 2005 - [Enlace local]

Para aquellos que ya tengáis una noción de lo que es el Modelo de calidad CMM-CMMI y queráis profundizar un poco en el nivel 2 de CMM-CMMI os recomiendo esta lectura.

» Leer más, comentarios, etc...

Escalabilidad. Parte 1. El autobús.

Noviembre 26th, 2005 - [Enlace local]

Imaginemos que hay una parte del mundo donde no hay luz de ningún tipo. En ese mundo, solo existe una linterna por grupo de habitantes. Para no hacerse daño, ningún habitante se mueve sin la linterna, por lo que se la ceden amablemente tras haber andado un tiempo y después permanecen quietos hasta que la vuelven a recibir.




Al entrar en un autobús, con el fin de no matarte intentando sentarte, has de esperar a que el conductor te sitúe en tu asiento. Como no es posible saber que asientos están vacíos o no, en cada autobús hay un señor, llamado amablemente GC (Garbage Collector), que se dedica a pasar por los asientos viendo cuales están libres e informando al conductor de que están disponibles. De esta forma, cada cierto tiempo se cede la linterna al señor GC para que recorra el autobús en busca de asientos libres.




En circunstancias normales, el asiento queda libre en cada parada, y al señor GC le da tiempo a recorrerse todos los asientos antes de llegar a la siguiente parada. Y en el caso de que no le de tiempo, el señor GC se siente seguro al ceder la linterna a un viajero para que pueda sentarse, porque en circunstancias normales suelen quedar asientos libres que ya han sido comprobados por el señor GC.




Pero ahora el señor GC está de suerte, porque va a realizar su trabajo en un gran trasatlántico. El señor GC está encantado, porque en un trasatlántico existen multitud de asientos libres –piensa- y aunque tarde casi 30 minutos en recorrer todo el barco con la linterna, puede ceder la linterna cada pocos segundos a otro pasajero para que este pueda moverse por el barco, y así contribuir a que nadie se mate.




Un día, 6000 personas deciden subir al barco. Las personas no dejan de moverse por el barco, de sentarse y levantarse, por lo que el señor GC se encuentra con un inmenso problema: no es capaz de recorrer todo el barco y comprobar cuantos asientos libres hay, así que pasa la mayor parte del tiempo corriendo de arriba a abajo por el barco, acaparando todo el tiempo de linterna. En el mejor de los casos, la mayoría de pasajeros simplemente se quedará inmóvil la mayor parte del crucero, con lo que esto supone. En algunos casos extremos, en aguas del pacífico, se dice que algún barco naufrago a causa de que todos los pasajeros corrieron presa del pánico.





Primera regla barata de la escalabilidad: El recolector de basura te evita lidiar con los punteros, devuélvele el favor e intenta no darle mucha faena entre petición. En una aplicación para 40 clientes puede funcionar, pero “crujirse un crucero� con el GC es más fácil de lo que parece.

» Leer más, comentarios, etc...

Pointer to (void)

Branching como apoyo a la configuración

Noviembre 25th, 2005 - [Enlace local]

Una de las ventajas de los sistemas de control de versiones es la posibilidad de mantener distintas líneas de código abiertas (branches o ramas). La acción de derivar código de una línea a otra es lo que en diveka (y en medio mundo) denominamos branching. Generalmente, cada línea tiene una política de desarrollo distinta, que establece que tipos de cambios se realizan sobre el producto. Utilizando esta breve definición, ya podemos sacar dos ventajas:

Podeis encontrar una buena tipología de branching en el siguiente artículo: SCM Branching Models (PDF), aunque obviamente es posible otro tipo de configuraciones en función del producto.

Así pues, introducidos en el tema, hoy me gustaría exponer el modelo de branching que utilizamos en Empresa Solidaria, y como este modelo flexibiliza nuestra producción.

En el repositorio de Empresa Solidaria existe una línea principal, a la que llamamos cariñosamente Main, donde se introducen nuevas características. La política de versiones que hemos trazado, establece que se libera una versión por mes y una serie de releases internas durante ese mes.

Por lo tanto, disponemos de líneas de versión sobre la rama de release de la Conselleria de Bienestar Social, que nos permiten configurar el producto para la Conselleria e ir integrando en esta rama todos los cambios que vayamos incorporando al producto. Es más, como trabajamos con secciones atómicas de código, en alguna ocasión hemos tenido que liberar cambios pertenecientes a una versión de release y tirar atrás algunos de ellos (en ese momento es en el que puedo justificar el coste de desarrollo del sistema de build :) ).

Para aquellas características que han sido ya implementadas, el equipo de QA puede dedicarse a testearlas en la correspondiente rama de QA. Una vez se completa, y se determina que el producto es suficientemente estable, se pasa a la rama de release. De igual forma, en el proceso de build se recoge código de otros componentes de desarrollo propio de diveka, que obviamente se utilizan en diversos productos. Cada componente, incorpora la información de cómo debe construirse, y el sistema de build es capaz de indicar qué tipo de configuración es necesaria para ese componente en el producto actual.

Afortunadamente, el sistema de build es capaz de generar una versión (y cuando decimos versión, es una release en toda regla, con instalador, documentación, pruebas unitarias, etc.) de forma automática, a partir de cualquier rama del producto, ya que estas están configuradas para contener la información de generación. ¿Quién dijo que era una pérdida de tiempo dedicarse a esto?

» Leer más, comentarios, etc...

Pointer to (void)

Branching como apoyo a la configuración

Noviembre 25th, 2005 - [Enlace local]

Una de las ventajas de los sistemas de control de versiones es la posibilidad de mantener distintas líneas de código abiertas (branches o ramas). La acción de derivar código de una línea a otra es lo que en diveka (y en medio mundo) denominamos branching. Generalmente, cada línea tiene una política de desarrollo distinta, que establece que tipos de cambios se realizan sobre el producto. Utilizando esta breve definición, ya podemos sacar dos ventajas:
Podeis encontrar una buena tipología de branching en el siguiente artículo: SCM Branching Models (PDF), aunque obviamente es posible otro tipo de configuraciones en función del producto.

Así pues, introducidos en el tema, hoy me gustaría exponer el modelo de branching que utilizamos en Empresa Solidaria, y como este modelo flexibiliza nuestra producción.

En el repositorio de Empresa Solidaria existe una línea principal, a la que llamamos cariñosamente Main, donde se introducen nuevas características. La política de versiones que hemos trazado, establece que se libera una versión por mes y una serie de releases internas durante ese mes.

Por lo tanto, disponemos de líneas de versión sobre la rama de release de la Conselleria de Bienestar Social, que nos permiten configurar el producto para la Conselleria e ir integrando en esta rama todos los cambios que vayamos incorporando al producto. Es más, como trabajamos con secciones atómicas de código, en alguna ocasión hemos tenido que liberar cambios pertenecientes a una versión de release y tirar atrás algunos de ellos (en ese momento es en el que puedo justificar el coste de desarrollo del sistema de build :) ).

Para aquellas características que han sido ya implementadas, el equipo de QA puede dedicarse a testearlas en la correspondiente rama de QA. Una vez se completa, y se determina que el producto es suficientemente estable, se pasa a la rama de release. De igual forma, en el proceso de build se recoge código de otros componentes de desarrollo propio de diveka, que obviamente se utilizan en diversos productos. Cada componente, incorpora la información de cómo debe construirse, y el sistema de build es capaz de indicar qué tipo de configuración es necesaria para ese componente en el producto actual.

Afortunadamente, el sistema de build es capaz de generar una versión (y cuando decimos versión, es una release en toda regla, con instalador, documentación, pruebas unitarias, etc.) de forma automática, a partir de cualquier rama del producto, ya que estas están configuradas para contener la información de generación. ¿Quién dijo que era una pérdida de tiempo dedicarse a esto?

» Leer más, comentarios, etc...