domingo, 31 de octubre de 2010

Revista Comunicados de la ACM (Octubre 2010)

Parte del desarrollo de un Ingeniero en Sistemas Computaciones, es mantenerse informado no sólo desde el punto de vista de usuario sino también desde el punto de vista científico. Por ejemplo, además de saber que Microsoft acaba de liberar Windows 7 Mobile o que Google ha estado realizando pruebas reales con un automóvil autónomo; es bueno saber cómo algunas compañías están explotando la información en Internet para poder predecir el futuro (ver artículo).

Mejor aún es mantenerse informado de avances científicos. Una buena fuente de información es la revista Comunicados de la ACM. La ACM (Association for Computing Machinery) es una sociedad cuyo objetivo es ayudar a compartir recursos (artículos, conferencias, bolsa de trabajo) que promuevan el progreso de las ciencias de la computación. La revista es mensual y la pueden descargar en pdf (Comunicados de la ACM).

El artículo que ocupa la portada del mes de octubre es acerca de sistemas P2P. La tecnología P2P no se utiliza sólo para distribuir archivos (ej. torrents); es usada también en aplicaciones científicas para donar ciclos de CPU en la investigación de enfermedades, el calentamiento global, entre otros. El artículo menciona estrategias empleadas para encontrar y distribuir contenido en un sistema P2P. Además habla de los retos y oportunidades relacionados a esta tecnología.

Comparte en los comentarios tu opinión acerca de los artículos de la Revista Comunicados de la ACM (Octubre 2010).

Nota: ya se encuentra también disponible la versión del mes de noviembre.

martes, 19 de octubre de 2010

Fallece Benoit Mandelbrot

 Hace algun tiempo cuando actualicé la imagen de mi avatar, publiqué un artículo acerca de fractales. Pues bien, el padre de los fractales, Benoit Mandelbrot, falleció el pasado 14 de Octubre víctima de cáncer en un hospital en Cambridge, Massachusetts a la edad de 85 años.

Mandelbrot era un genio de las matemáticas que descubrió la propiedad que tienen algunas figuras de estar compuestas por partes que son idénticas al todo pero en una escala menor que se prolonga hasta el infinito. De familia judía, emigró a París para escapar de los Nazis. Trabajó durante mucho tiempo para IBM y después se convirtió en profesor de ciencias matemáticas en la universidad de Yale.

El concepto de fractales ha permitido a los científicos medir figuras que se consideraban demasiado difíciles de medir debido a su aspecto aparentemente irregular. Las matemáticas de los fractales también han hecho contribuciones importantes en las áreas de la música digital y la compresión de imágenes. Además, el uso de fractales se ha extendido significativamente en forma de arte moderno a través de la creación de hermosos diseños que siguen el comportamiento típico de los fractales descubierto por Mandelbrot.

Pocos son los grandes genios que viven una vida tan larga y fructífera como lo fue la vida de Benoit Mandelbrot. Recientemente, apareció dando una plática dentro de las famosas TED Talks (Technology, Entertainment, Design Talks, por sus siglas en inglés) demostrando una vitalidad y una frescura de ideas impresionantes. A continuación se muestra el video de dicha plática. Merece la pena verla.

domingo, 17 de octubre de 2010

Practicando SQL (Parte 4)

Te encuentras en la cuarta parte de la serie "Practicando SQL":
  1. Configurando ambiente de trabajo y consultas básicas
  2. Consultas con más de una tabla
  3. Consultas con agrupados
  4. Consultas anidadas

Supongamos que deseamos saber con cuáles actores han trabajado con cierto actor (en este ejemplo usaremos al actor Christopher West que tiene como actor_id = 163). Para ello, primero debemos obtener una lista de todos los films en los que ha trabajado Christopher. De esta lista de films, obtendremos todos los actores que han trabajado en esos films (y por lo tanto han trabajado con Christopher). Un detalle que hay que cuidar, es que un actor puede aparecer más de una vez, por lo que sólo hay que mostrarlo una vez.

La siguiente consulta regresa todos los films en los que ha trabajado Christopher:

mysql> SELECT film_id
  -> FROM film_actor
  -> WHERE actor_id=163;

Ahora podemos obtener los actores que han trabajado en esas películas con:

mysql> SELECT actor.actor_id, first_name, last_name
  -> FROM actor
  ->   INNER JOIN film_actor ON (actor.actor_id=film_actor.actor_id)
  -> WHERE film_id IN
  -> (SELECT film_id FROM film_actor WHERE actor_id=163);

Como pueden ver las primeras tres filas de la consulta ya son familiares: obtienen en qué películas han trabajado todos los actores. La última fila (consulta anidada) es igual a la primer consulta mostrada arriba. El truco es que usamos los resultados de la consulta anidada para mostrar sólo los actores que hayan participado en esos films. También noten que usamos la palabra clave IN, ya que podemos tener más de una película. Podemos leer las últimas dos líneas de la consulta como: si el film_id de la fila de la consulta externa se encuentra en la lista de films regresados por la consulta interna, entonces esa fila pertenece al resultado final.

Como Christopher pudo haber trabajado en más de una película con el mismo actor, esto causa actores repetidos en el resultado. Eso lo podemos solucionar fácilmente usando la palabra clave DISTINCT. Además, la siguiente consulta también excluye al mismo Christopher.

mysql> SELECT DISTINCT actor.actor_id, first_name, last_name
   -> FROM actor
   ->   INNER JOIN film_actor ON (actor.actor_id=film_actor.actor_id)
   -> WHERE actor.actor_id<>163 AND film_id IN
   -> (SELECT film_id FROM film_actor WHERE actor_id=163);

Muy bien! Con esto cerramos esta introducción a SQL. Sin embargo, de vez en cuando publicaré alguna consulta que resulte interesante. Por último los dejo con una trivia.

Trivia

Requisitos para participar

  1. Ser seguidor de este blog
  2. Ser estudiante del Instituto Tecnológico de Toluca (credencial vigente)
  3. Poner la respuesta en los comentarios de este post
  4. Fecha límite: 31 de Octubre de 2010 a las 23:59:59

Premio

Un mouse que se encuentra en muy buenas condiciones. Es similar al que pueden ver aquí. El ganador será el primer comentario con la respuesta correcta.

Pregunta

Mostrar la consulta y el resultado que obtenga el par de actores que han trabajado en más films juntos. Por ejemplo, quizá Cristopher y Bela Walken han trabajado en 50 films. La consulta debe regresar a los dos actores y el número de films. NOTA: Cristopher no es necesariamente parte de la respuesta, puede ser cualquier par de actores.

La respuesta a la trivia la puedes encontrar en el siguiente post.

domingo, 10 de octubre de 2010

Practicando SQL (Parte 3)

Te encuentras en la tercer parte de la serie "Practicando SQL":
  1. Configurando ambiente de trabajo y consultas básicas
  2. Consultas con más de una tabla
  3. Consultas con agrupados
  4. Consultas anidadas

Continuemos esta serie. Ahora veremos como generar resultados que tengan agrupados. La siguiente consulta obtiene en cuántos films ha participado cada actor:

mysql> SELECT actor.actor_id, first_name, last_name, COUNT(*)
    -> FROM actor
    ->   INNER JOIN film_actor ON (actor.actor_id=film_actor.actor_id)
    -> GROUP BY actor.actor_id, first_name, last_name;

El resultado tiene 200 filas:

Lo relacionado a la cláusula FROM ... INNER JOIN ... ON lo revisamos en la parte 2, esto nos regresa todos los actores con los ids de sus films. NOTA: en la parte 2, usamos tres tablas actor, film_actor, film porque queríamos desplegar el nombre de la película; en este caso sólo necesitamos saber si participó en una película (pero no el nombre de la misma) por ello sólo usamos actor y film_actor.

La claúsula GROUP BY junta todos las filas que tengan el mismo valor en las columnas especificadas. En este caso junta todas las filas que tengan el mismo id del actor, nombre y apellido. Ahora, en conjunto con GROUP BY estamos usando COUNT(*) que cuenta todas las filas que fueron agrupadas en una sóla fila.

Veamos esto con un poco más de detalle. Como pueden ver en la figura de arriba el actor con id=1 tiene 19 films. Sin usar GROUP BY podemos ver los ids de sus 19 films.

mysql> SELECT actor.actor_id, first_name, last_name, film_id
    -> FROM actor
    ->   INNER JOIN film_actor ON (actor.actor_id=film_actor.actor_id)
    -> WHERE actor.actor_id=1;

Cuando usamos GROUP BY en la consulta de arriba, las 19 filas se consolidan en una sola, pero COUNT(*) nos permite saber cuántas filas fueron agrupadas en una sola.

Junto con la cláusula GROUP BY podemos usar otras operaciones como SUM o AVG (promedio). Para calcular cuánto ha gastado un cliente en renta de películas podemos usar SUM: primero relacionamos un cliente con todos sus pagos; después agrupamos las filas por cliente; y finalmente sumamos todas las cantidades (amount) para cada cliente.

mysql> SELECT customer.customer_id, first_name, last_name, SUM(amount)
    -> FROM customer
    ->  INNER JOIN payment ON (customer.customer_id=payment.customer_id)
    -> GROUP BY customer.customer_id, first_name, last_name;

Preguntas

¿Por qué usamos customer.customer_id en la lista de columnas de SELECT, en lugar de sólo customer_id?

Cuando unimos dos o más tablas en FROM, existe la posibilidad que haya columnas con el mismo nombre entre las tablas. En caso de haber más de una columna con el mismo nombre, debemos especificar la tabla para evitar ambigüedades. Por ejemplo, si en el último ejemplo cambiamos customer.customer_id por sólo customer_id en el SELECT, obtendremos el siguiente error:

ERROR 1052 (23000): Column 'customer_id' in field list is ambiguous

En el resultado de la primera consulta, la última columna tiene como nombre COUNT(*), ¿puedo cambiarle el nombre a num_films?

Para renombrar el nombre de una columna puedes usar la palabra clave AS. En este ejemplo, en la primer consulta puedes cambiar el primer renglón por:

SELECT actor.actor_id, first_name, last_name, COUNT(*) AS num_films

Siguiente post...

Cerraremos esta serie con un ejemplo de consulta anidada.

jueves, 7 de octubre de 2010

Instalando ADempiere para Windows con PostgreSQL


ADempiere es un proyecto desarrollado gracias a la participación colectiva y cuya organización estructural dista de los proyectos tradicionales. El uso del Internet juega un papel primordial en los avances de este sistema ERP.

   Para poder comenzar a utilizar un sistema como ADempiere es necesario conocer algunas definiciones básicas, entre ellas el concepto de ERP. Un ERP (Enterprise Resource Planning, por sus siglas en inglés) es un sistema de cómputo integrado utilizado para administrar los recursos de una empresa (tanto internos como externos) entre los cuales se pueden incluir los recursos financieros, materiales y humanos. Es un software cuya arquitectura permite facilitar el flujo de información entre todas las funciones que lleva a cabo un negocio dentro de los límites de una organización y permite además, administrar las conexiones con accionistas externos. Un ERP está constituido típicamente por una base de datos centralizada, es decir, que la información se concentra en una ubicación geográfica específica dentro de un servidor y normalmente utiliza una plataforma de cómputo común. Los sistemas ERP facilitan las tareas que provienen de las operaciones de negocios dentro de una organización.

   Ahora bien, ¿qué es ADempiere?. ADempiere es un sistema ERP de código abierto (open source) que permite la contribución de sus usuarios a fin de que el proyecto (que se originó en el 2006) siga creciendo y fortaleciéndose. La palabra "adempiere" proviene del italiano y significa entre otras cosas "completar, alcanzar, realizar tareas, practicar, honrar y respetar". Existe mucha información relativa a ADempiere, sin embargo, para esta serie de posts, utilizaré como principal referencia la Wiki de ADempiere.

   La instalación que estaré manejando es la instalación para Windows que utiliza como base de datos a la base PostgreSQL.  PostgreSQL es una base de datos relacional de código abierto muy poderosa y personalizable. Tiene más de 15 años de haberse comenzado a desarrollar y es capaz de correr bajo todos los sistemas operativos de mayor importancia (Windows, Linux, UNIX, MacOs, etc). También puede utilizarse la base de datos de Oracle XE, sin embargo, en este tutorial, me enfocaré en la utilización de PostreSQL.

   Existen básicamente dos maneras de instalar ADempiere en Windows: la instalación automática (utilizando un instalador que provee una interfaz gráfica similar a la que estamos acostumbrados a utilizar en la mayoría del software) y la instalación manual. Cabe aclarar que yo realicé la instalación manual.

   A continuación se muestran los enlaces a las posts que componen este tutorial. Es importante que lo enriquezcan con comentarios y sugerencias a fin de que se mejore su contenido y sea lo más didáctico posible. Conforme vaya terminando los posts, iré activando los links a ellos:

*Cómo familiarizarse con ADempiere antes de su instalación (ADempiere en línea)
1. Instalando ADempiere para Windows con PostgreSQL: instalador de Windows
2. Instalando ADempiere para Windows con PostgreSQL: introducción a la instalación manual
3. Instalando ADempiere para Windows con PostgreSQL: Instalación de PostgreSQL
4. Instalando ADempiere para Windows con PostgreSQL: Instalación y configuración de ADempiere
5. Instalando ADempiere para Windows con PostgreSQL: Instalación de los datos de ADempiere
6. Instalando ADempiere para Windows con PostgreSQL: Ejecutando la aplicación

domingo, 3 de octubre de 2010

Tabs en Firefox

BarTab y Tab Mix Plus son mis plugins favoritos para el manejo de tabs en Firefox. Tab Mix Plus ofrece varias opciones para personalizar el comportamiento de los tabs, las dos características por las que lo uso son: A) Firefox (al menos hasta 3.6) abre un tab en blanco cuando creamos un nuevo tab. Tab Mix Plus permite configurar lo que queremos en un nuevo tab: tab en blanco, la página de inicio del navegador, una página en específico, entre otros. Yo lo configuré para que abra la página de búsqueda de Google, ya que la mayor parte del tiempo requiero esa página en un nuevo tab. Podría usar la barra de búsqueda de Firefox, pero he notado que las recomendaciones de búsqueda son más completas en la página principal de Google. Además, con el lanzamiento de búsqueda instantánea tengo un motivo más para ir a esta página. B) La lista de tabs cerrados recientemente de Tab Mix Plus es muy útil cuando por accidente cerramos uno o cuando nos damos cuenta de que necesitábamos más información de un sitio a los 5 minutos de haber cerrado el tab. Por último, lo que NO uso de Tab Mix Plus es el administrador de sesiones porque tiene conflictos con BarTab, así que uso el administrador default de sesiones de Firefox. Veamos ahora a BarTab. Frecuentemente dejo algunas páginas abiertas para revisarlas después - las podría poner en los bookmarks, pero una vez ahí es muy fácil que no les ponga atención y las olvide. Cuando reinicio Firefox normalmente cargaría todos los tabs que deje abiertos la última vez, lo cual puede ser muy tardado dependiendo del número de tabs y de su contenido. Aquí es donde BarTab entra, este plugin sólo carga los tabs cuando los visitamos; al inicio sólo carga el tab que estaba activo cuando cerramos el navegador. Como pueden ver en la imagen, la última vez dejé 5 tabs abiertos, pero al reiniciar Firefox sólo un tab fue cargado. Los otros 4 tabs aparecen semi-transparentes, y serán cargados hasta que los seleccione. Eso es todo por el momento, compartan en los comentarios qué plugins usan para el manejo de tabs y cómo los ayudan en sus tareas diarias.