jueves, 21 de febrero de 2013

howto detect date collisions or conflicts

Today during a test of a client's app I found an interesting problem, how to detect date collisions or conflicts?
Suppose you have to create an agenda app, that allows it's users to create meetings or appointments and it must not allow two events to happen at the same time, for simplicity let's just say "all events created must not be in schedule conflict with other events"
It seems simple to resolve at first glance, but allow me to show you some examples of why it is not: Suppose you have two events A which last 60 minutes and B which last 90 minutes.
There are so many ways that we can create this two events in our agenda so that there will be a schedule conflict (date collision)
  1. Setting A to start and same time as B http://screencloud.net/v/ChX3
  2. Setting A to start a few minutes before B http://screencloud.net/v/73vI
  3. Setting B to start a few minutes before A http://screencloud.net/v/uyaG
  4. Setting A to start a few minutes later of B http://screencloud.net/v/lpLg
  5. ...

If you try to list all possible combinations in which A and B are in conflict your code may become pretty big and very difficult to maintain for something as simple as "detect date collisions", luckily there is another way more simple: Instead of search all possible conditions in which A and B are in conflict lets search for the possibles situations in which they are not
  1. A starts and ends before B http://screencloud.net/v/hEXt
  2. B starts and ends before A http://screencloud.net/v/tR6X

We can use this conditions and some boolean logic to create for example a mysql query:
I hope this is useful for anyone of you.
Regards
Spanish version

Detectar colisiones o conflictos de fechas

Hoy mientras probaba una aplicación para un cliente encontré un problema interesante y es ¿cómo validar colisiones de fechas para un calendario? Supongan que tienen que crear una agenda que permita crear eventos como citas o reuniones y deben detectar que dos eventos no ocurran al mismo tiempo, por simplicidad solo digamos que "todos los eventos que sean creados no deben estar en conflicto de horario con los demás" Parece simple de resolver a simple vista pero permítanme mostrar unos ejemplos del motivo por el que no lo es: Supongan que tienen dos eventos A que dura 60 minutos y B que dura 90 minutos. Hay muchas formas en las que podemos crear estos eventos en nuestra agenda de manera que crean un conflicto de horario
  1. Haciendo que A y B inicien a la vez http://screencloud.net/v/ChX3
  2. Haciendo que A inicie unos minutos antes que B http://screencloud.net/v/73vI
  3. Haciendo que B inicie unos minutos antes que A http://screencloud.net/v/uyaG
  4. Haciendo que A inicie unos minutos despues de B http://screencloud.net/v/lpLg
  5. ...
Si tratan de identificar todas las posibles combinaciones en las que A y B entran en conflicto su código puede volverse bastante enorme y problemático a la hora de darle mantenimiento para algo tan simple como "encontrar conflictos de horario", por suerte hay otra forma más sencilla que explico a continuación: En lugar de encontrar las posibles condiciones en las que A y B entran en conflicto busquemos las posibles situaciones en las que no lo están
  1. A inicia y termina antes que B http://screencloud.net/v/hEXt
  2. B inicia y termina antes que A http://screencloud.net/v/tR6X
Podemos usar estas dos condiciones antes mencionadas y un poco de lógica booleana para hacer, por ejemplo una consulta en mysql: Bueno espero que esto les sea de ayuda

sábado, 16 de febrero de 2013

Actualizar ubuntu server desde la consola de comandos

A manera de recordatorio para mi mismo y si acaso le sirve a alguien más pues mejor, dejo hoy esta mini guía de como actualizar ubuntu server.

Lo primero que necesitamos hacer es instalar update-manager-core
sudo apt-get install update-manager-core
Luego ejecutamos el asistente para instalación/actualización
sudo do-release-upgrade Seguimos los pasos respondiendo a las preguntas que nos va haciendo el proceso de actualización y si todo sale bien al final reiniciamos.
Eso sería todo, el proceso es bastante simple y lo único que podría complicarse es si la actualización encuentra conflictos en los archivos de configuración, pero para eso te ofrece un serie de opciones como instalar la versión que viene con el paquete, conservar la existente (por defecto), entre otras.
Hasta la próxima.
Saludos.

Encontrar quien está haciendo qué en GNU/Linux

Aunque estos comandos solo los he probado en Ubuntu 12.04, deberían funcionar en otros SO GNU/Linux, solo hace falta tener instalado lsof y ps.
En mi experiencia ps siempre está presente, pero extrañamente lsof no estaba presente en el servidor donde ejecuté estos pasos aunque esto se soluciona simplemente instalándolo. Ubuntu o Debian instalamos lsof ejecutando el siguiente comando:
sudo aptitude install lsof

Ahora supongamos que queremos averiguar ¿cual servidor de correo está corriendo actualmente? Lo más simple sería preguntar al que lo instaló, pero si por alguna razón eso no es posible...
Partimos de que sabemos que el puerto donde está escuchando el servidor de correo es el 25 y listamos los archivos abiertos relacionados:

del resultado anterior nos interesa tomar el valor del PID y lo usamos para filtrar la salida del comando ps -ef:
En el resultado de ejecutar el comando ps vemos que es postfix el que lanzó el proceso 2446, por lo tanto  nuestro servidor de correo es el ya mencionado postfix.

De forma similar se pueden verificar otros servicios por ejemplo ¿quién está escuchando en el puerto http(80)?
sudo lsof -i tcp:80

El comando lsof y la forma como usarlo para determinar el comando que invocó el mail server encontré en: http://ubuntuforums.org/showthread.php?t=871508

Espero les sea de ayuda.

Hasta la próxima.

Aprender a jugar ajedrez en Ubuntu GNU/Linux

Desde que tengo memoria siempre me ha resultado interesante el ajedrez, las jugadas posibles, los famosos grandes maestros y los campeonatos pero por mucho tiempo me limité solo a juegos ocasionales con GNU Chess. No fue hasta el 2012 que supe un poco más acerca de este mundo gracias a unos colegas, entonces me interesé un poco más en ese mundo y todo lo que abarca, descubrí algunos libros interesantes que planeo comprar. Hace poco surgió un tema de conversación tomando café :D ¿qué programas existen para ayudarnos (profesionales y principiantes) a mejorar la forma como jugamos ajedrez? En dicha conversación aprendí que existen motores y bases de datos de jugadas que permiten entrenarnos en posibles escenarios de partidas reales y bueno como dicen el dicho "la practica hace al maestro". Con la duda sobre estas herramientas me puse a investigar un poco por mi cuenta, en especial algo que pudiera usar en Ubuntu para practicar y encontré este tutorial creado por Justin Mcclure en su blog Attacking Chess que está dedicado al ajedrez como podrán deducir por el nombre :D . Justin Mcclure menciona dos herramientas interesantes:
  • SCID
    Web site: http://scid.sourceforge.net/
    Detalles: Scid ("Shane's Chess Information Database"), una aplicación de base de datos de ajedrez que funciona en Windows, Linux y Mac OS. Con Scid puedes mantener una base de datos de juegos de ajedrez, hacer búsquedas por muchos criterios, estudiar tus partidas usando programas de análisis compatibles con Xboard o UCI, estudiar finales con tablas base de finales (endgame tablebases) y mucho más.
  • Stockfish
    Web site: http://stockfishchess.org/
    Detalles: Un poderoso motor de ajedrez software libre, disponible bajo licencia GPL 3 (GPLv3).
    De acuerdo con su web site no se debe tomar a la ligera a este motor pues juega al mismo nivel que algunos motores comerciales como Rybka 4 y Houdini 2, además de ser el más poderoso en la rama de los motores de ajedrez de software libre en el mundo. (fuentes IPON y CCRL)
La instalación me resultó un poco más simple de lo que indica Justin, en lugar de descargar y compilar todo yo mismo opté por usar los paquetes ya existentes, aparte de ser más sencillo tuve algunos problemas tratando de compilar Scid. Despues de instalar necesitamos configurar Stockfish en Scid:
  1. En una terminal ejecutamos scid
    scid
  2. En el menú, clic en Tools y luego Analysis Engine...
  3. Creamos un nuevo motor de ajedrez: clic en el botón New...
  4. En el nombre ingresamos Stockfish
  5. En el comando tenemos que colocar el ejecutable de stockfish, en mi caso el valor correcto es /usr/games/stockfish, pueden por ejemplo usar el comando "whereis stockfish" para buscar en su SO
  6. El campo Directory debe asignarse el valor . para indicar que el directorio a usar debe ser el mismo en el que se encuentra el ejecutable.
  7. Clic en el botón Configure UCI Engine.
  8. En la ventana que se abrió para configurar el motor, existen muchas opciones, de las cuales Justin recomienda colocar el valor del campo book como book.bin y establecer el valor del campo Multiple variations a 4.
Eso es todo por el momento, ya que Justin no ha publicado la segunda parte de su tutorial y yo aún estoy aprendiendo a usar estos programas y jugar ajedrez :D Hasta pronto