sábado, 23 de agosto de 2008

Choques de horarios en SQL Server

El problema era el siguiente: para el desarrollo de un sistema que controla los horarios de clases, los posibles choques de horarios y aulas que pueden existir entre diferentes actividades, es decir, saber cuando se programe el calendario de una actividad no choque con otra actividad ya que esta otra pueda estar usando el mismo aula, a la misma hora en el mismo dia.

Por ejemplo, si ingreso al sistema una actividad "A" que son los lunes, miercoles y viernes de 4pm a6pm del 1 de agosto al 15 de agosto utilizando el aula ABC, al momento que se intente de ingregar una actividad "B" que sean los martes, miercoles y sabados, de 5pm a 7pm utilizando el aula ABC del 10 al 20 de agosto no me permita hacerlo, ya que para la actividad "A" los miercoles cochan una hora en especial (coinciden de 5pm a 6pm) y comparten comparten 5 dias en comun (del 10 al 15 de agosto) y dentro de esos 5 dias hay un miercoles de por medio.

En pocas palabras la sentencia SQL deseada debe tomar encuenta todas estas variables: aula, dia, horas, fechas de duracion de los cursos y determinar si todas estas variables coinciden en algun momento por mas pequeña que sea la coincidencia (el choque).

Googleando un poco no encontre nada, absolutamente nada que me diera una idea, asi que me puse mano a la obra y aqui esta un store procedure que logra esto. El secreto esta en determinar dichos choques al momento de que definimos cada uno de los bloque de dias-horas por separados.

Yo poseo una tabla por cada elemento: Aulas, dias, actividad (descripciones de las diferentes actividades), actividad-calendario-encabezado (donde asigno la actividad y la fecha de duracion) y actividad-calendario-detalle (donde asigno los dias, el aula y las horas a cada renglon)

La horas debe ser en formato militar, es decir 12, 13, 14, etc., en vez de usar 12pm, 1pm, 2pm. De esta forma podemos crear el campo de hora como tipo numeric(4,3) para lograr nuestros objetivos.

CREATE PROCEDURE [dbo].[sp_horario_aula_choque]
@dia tinyint,
@aula int,
@ini numeric(4,2),
@fin numeric(4,2),
@fini datetime,
@ffin datetime

AS
BEGIN

SET NOCOUNT ON;

select * from dbo.vw_horario_aula_choque where aula_id = @aula and dia_id = @dia and
((@ini >= det_hini and @ini <> det_hini and @fin <>
(@ini <= det_hini and @fin >= det_hfin)) and
((@fini >= enc_fhinicio
and @fini <= enc_fhfinal) or (@ffin > enc_fhinicio and @ffin <= enc_fhfinal)
or (@fini <= enc_fhinicio and @ffin >= enc_fhfinal))
END

vw_horario_aula_choque es una vista que contiene la relacion de todas las tablas ya mencionadas.

Si el store procedure devuelve algun resultado existe un choque y este sera lo que nos presentara el SP.


jueves, 17 de abril de 2008

La tecnologia como base fundamental de una empresa

En la actualidad la tecnología se ha convertido en la base fundamental del éxito de casi cualquier empresa organizada, una buena aplicación y automatización informática de casi todos los procesos internos pueden dar como resultado una alta calidad de los servicios y productos producidos, una precisa toma de decisión y un absoluto control de todo lo que pasa en la empresa ayudando así detectar cualquier carencia o necesidad a ser mejorada en los procesos o en los empleados.


Una empresa con un alto grado de automatización informática es un sinónimo de calidad y profesionalismo. Existen tipo de empresas que por su naturaleza, la dependencia del factor tecnológico es critico en los días de hoy, como por ejemplo, los bancos, grandes supermercados, negocios de una alta concurrencia de ventas o movimientos, estas empresas mientras mas perfeccionado tienen el elemento tecnológico, mas grande es el control de sus operaciones y mas precisa sus acciones a tomar para mejorar el servicio y ser mas productivos. En cambio existen otras empresas que por su naturaleza, la dependencia del factor tecnológico no es tan fuerte que a veces carecen del mismo, ignoran de su importancia y creen llevar el control eficientemente con rudimentarias técnicas de medición. Pero si de verdad estas empresas se comienzan a convertir en una verdadera maquinaria de producción, comienza a expandirse, se encontrara con la realidad absoluta que para seguir compitiendo y no desplomarse, es ir de la mano con la tecnología.

En los países desarrollados, principalmente los Estados Unidos, casi todas las empresas basan toda su confianza en la automatización informática de todos sus procesos, es su pilar principal. Casi todos los servicios ofrecidos directamente a los clientes pueden sostenerse por medios informáticos y más aun con el auge de la Internet. Desde esta ultima casi cualquier empresa puede publicar sus servicios, captar mas clientes, darle un plus adicional a la calidad de sus servicios, establecer directamente oportunidades de negocio y un sin fin de beneficios.

Para establecer una estructura ideal informática para controlar todos los procesos de la empresa y para que estos mismos procesos puedan estar conectados entre si por un medio tecnológico y llevar un continuo desarrollo ininterrumpido de mejoramiento es necesario tener una autonomía e independencia de todos los software y hardware, es decir, que no estén en la tutela de terceros, sino por la misma empresa. Solo así se puede tener un total dominio y flexibilidad para hacer e implementar todo lo que se desee libremente. A parte de esto, el personal técnico informático completo debe ser propio y no externo, solo así se puede garantizar una constante ampliación de los sistemas, un constante desarrollo y mejoramiento de los procesos y por ende un mayor crecimiento en la productividad.

En este sentido he categorizado a las empresas según el grado de tecnología aplicada:

Tipo A - Características.

1. Son empresas que tiene un nivel tecnológico muy alto.
2. Autonomía - Autodependencia: Todo lo concerniente a software y hardware son administrado por personales propio de la empresa, el hardware (servidores de todas las índoles) se encuentran físicamente en las instalaciones de la empresa.
3. El 90% o mas de los procesos están automatizados por medios de sistemas informáticos.
4. Todos los procesos automatizados pueden comunicarse entre si en un sistema informático común. Aunque existen procesos que por su naturaleza nunca se comunicaran con otros, pero si en algún momento dado esto pueda ocurrir, no pueden existir barreras técnicas que lo puedan impedir.
5. Servicios en línea: (en caso de que la naturaleza del negocio de la empresa aplique), todos sus servicios o productos puedan publicarse vía Internet e interactuar directamente con los clientes, poder realizar operaciones o transacciones que puedan afectar directamente los sistemas informáticos internos, que se pueda asistir a un cliente por medio de la Internet, entre otras.

Tipo B - Características.

1. Son empresas que tiene un nivel tecnológico alto o medio.
2. autonomía media: Tienen personal técnico informático, pero dependen de terceros para realizar algunas tareas. No todos los servidores están o pertenecen a la empresa (por ejemplo los webhosting contratados), algunos o todos los sistemas informáticos desarrollados por terceros.
3. entre el 50% al 90% de los procesos automatizados por medios informáticos.
4. No todos los procesos automatizados pueden ser conectado entre si, porque están desarrollados en plataformas tecnológicas diferentes (base de datos diferentes, lenguajes de programación diferentes, etc.), no existe un sistema informático base que conjugue todos los procesos de manera automática.
5. Servicio en línea: no se puede conectar directamente los sistemas informáticos internos con los servicios en líneas, ya sea porque se utiliza un webhosting contratado, o se desarrollo con una tecnología diferente a los sistemas existentes, etc. Los servicios online ofrecidos son intermedios.

Tipo C - Características.

1. Son empresas que tienen un nivel tecnológico medio o pobre.
2. autonomía casi nula: casi todas las tareas informáticas de cualquier nivel (instalación de redes, instalación de sistema operativo, soporte técnico, desarrollo de sistemas, etc.) deben ser realizadas por terceros. Poseen pocos (uno o dos) o ningún servidor.
3. Los procesos automatizados no alcanzan el 50%
4. Sistemas dispersos de diferentes índoles por la empresa, todos desarrollados por terceros, no se conectan ninguno entre si.
5. Carecen de servicios en línea, en caso de poseer algún webhosting contratado es meramente para uso informativo.

Tipo D - Características.

1. Son empresas que tienen un nivel tecnológico pobre o nulo.
2. autonomía nula.
3. Procesos automatizados por debajo del 25% o nulos.
4. Pocos o ningún sistema informático, los pocos existentes no se conectan entre si.
5. Servicios en línea nulo, no poseen webhosting.

Cuando se refiere a sistemas informaticos, solo se esta tomando en consideracion los sistemas operacionales o de toma de decision, no los paquetes de oficina (office) o sistemas operativos.

miércoles, 26 de marzo de 2008

HTTP 401.3 - Access denied by ACL on resource

Moviendo, borrando y copiando carpetas de aplicaciones web dentro del IIS, me aparecio este error al momento de ejecutar algunas de las aplicaciones en cuestion.

Cuando hacemos estos tipos de operaciones (moviendo, eliminando carpetas) se pierden los permisos de lectura o/y escrituras de algunos usuarios que utiliza el IIS. La solucion es verificar los permisos de dichas carpetas y asignarle privilegios de lectura (como minimo) al usuario que utiliza el IIS (por lo general IUSR_NOMBREDELEQUIPO) y al usuario ASPNET en caso de que sean aplicaciones .Net.

miércoles, 19 de marzo de 2008

Mono: error CS0433: The imported type `XXXXX' is defined multiple times

Intentando de correr una aplicacion en Mono obtuve el siguiente mensaje de error:

Compilation Error

Description: Error compiling a resource required to service this request. Review your source file and modify it to fix this error.

Error message:

/var/tmp/www-temp-aspnet-0/a9e8b93/759bb5af.0.cs(28,41) : error CS0433: The imported type `_Default' is defined multiple times


A simple vista parece un error de compilacion ocasionado por nosotros mismos al desarrollar la aplicacion, algo que esta definido varias veces en un mismo contexto, por lo cual si es un error de esa naturaleza, pues compilarlo en Visual Studio deberia de dar el mismo error o algo parecido, pero no es asi, en el FrameWork.Net de windows trabaja sin ningun problema.

Buscando en la red, no encontre nada parecido, ni una pista, perdi mucho tiempo indagando y en la red no estaba la solucion. Ya estaba por pensar que la implementacion de Mono no estaba muy acabada como para migrar y correr aplicaciones rubustas desarrollada en .Net de Windows (claro, sin incluir componentes o recursos de terceros que solo trabajan en un ambiente win)


Pues bien, observando detenidamente el error, me fijaba que el problema estaba en la declaracion de una pagina (_Default) que unicamente contenia un masterpage y luego en su interior estaba totalmente vacia. Pero la aplicacion completa contenia unos 6 masterpage adicionales, porque concretamente esta es la del problema? o quizas todas tenian el mismo problema y esta era la primera en detectarse? que rompecabezas :S

Pero la solucion era tan sencilla que era muy dificil de imaginar: la pagina que se daba como referencia en el error, es una pagina que estaba repetida varias veces dentro de otras carpetas, o sea, identica, mismos nombres, mismas declaraciones en el codebehind. El Framework de windows pasa desapersivido esto, pero Mono no.

Pagina 1:
public partial class _Default : System.Web.UI.Page

Pagina 2:
public partial class _Default : System.Web.UI.Page

No pueden existir dos clases con los mismos nombres en un mismo contexto, aunque esten ubicados fisicamente en sitios diferentes.

Solucion: eliminar las paginas repetidas o renombrar sus declaraciones en el codebehind


martes, 18 de marzo de 2008

Mono - HTTP 500. System.DllNotFoundException: gdiplus.dll



Intentando de correr una aplicacion en Mono+FreeBSD obtuve el siguiente mensaje de error:

HTTP 500. System.DllNotFoundException: gdiplus.dll

Y en otras paginas tambien obtuve este error:

Parser Error: Color Red is not a valid color



Ambos errores son relacionados y se resuelven con la misma medicina.

Ahora bien, detallemos que sucede, el primer error me habla que me falta una dll llamada gdiplus.dll, pero que es esto ?

Microsoft GDI+ (gdiplus.dll) es una librería que contiene funciones básicas relacionadas con el sistema de interfaz gráfico de Windows (GDI) Graphical Device Interface. Gracias a este sistema Windows puede crear y mostrar objetos en 2D.

Si nuestra aplicacion web esta usando librerias de manejo de imagenes, para manipular su
tamaño, preservar la calidad al momento de desplegarla utilizando otras dimensiones, etc.
Nuestra aplicacion esta haciendo un llamado a esta libreria. En mi caso, mi proyecto .net
hace algunas de estas cosas

En FreeBSD esta libreria no viene con la instalacion de Mono, tenia que instalarla primero antes
mapiar la DLL. La libreria esta ubicada en /usr/ports/X11/x11-toolkit/libgdiplus

procedemos a instalar
make install clean

Pero me encontre con una sorpresa, existia un conflicto de instalacion

/usr/X11R6 exists, but it is not a symlink. Installation cannot proceed.
This looks like an incompletely removed old version of X. In the current version, /usr/X11R6 must be a symlink if it exists at all.Please read /usr/ports/UPDATING (entry of 20070519) for the procedure to upgrade X.org related ports.
*** Error code 1

Al parecer, segun el mensaje de error, nos manda actualizar las X, pero al ver las dependencias del paquete libgdiplus dice que la version de X es la misma que tengo instalada, ademas me parecio problematico actualizar las X ya que otros paquetes dependian de esta misma version y adicional a esto el mensaje de error da una pista de como resolver el problema sin tener que actualizar: /usr/X11r6 debe ser un enlace de sistema, no un directorio real.

Solucion: mover todo el contenido de /usr/X11R6 a /usr/local

cd /usr/X11r6
find -d . -print | cpio -pvdam /usr/local

Entonces borrar X11r6 y crearlo como un enlace de sistema apuntando a /usr/local

rm -r /usr/X11R6 && ln -s /usr/local /usr/X11R6

luego de esto, por fin instalar la libreria sin mas inconveniente

cd /usr/ports/X11/x11-toolkit/libgdiplus && make install clean

viernes, 14 de marzo de 2008

Firebird en FreeBSD: inet server err: setting KEEPALIVE socket option

Al observar que mi base de datos esta lista para iniciar no termina de arrancar, verificando el /var/db/firebird/firebird.log me encuentro con el siguiente mensaje:

inet server err: setting KEEPALIVE socket option

Solucion:

Firebird trata de utilizar un metodo llamado "Nagle algorithm" para las conecciones tcp/ip
y en FreeBSD esto es posible trabajarlo solo con un usuario con suficientes privilegios "ROOT"

En la linea agregada para iniciar la base de datos en el inetd.conf debemos cambiar el usuario firebird por el root:

gds_db stream tcp nowait root /usr/local/sbin/fb_inet_server fb_inet_server

En caso de que no deseemos correr el servicio de la db con root, entonces deshabilitamos el uso del Nagle en el archivo de configuracion de la base de datos:

edit /usr/local/etc/firebird/firebird.conf
TcpNoNagle = 0 # indicando el valor cero

Segun una documentacion encontrada por el internet, pero lo probe y no funciono, quizas algo me falto hacer.

jueves, 13 de marzo de 2008

FbMembershipProvider.CreateUser - validation error for column ISONLINE, value *** null ***

Migrando un membership a FireBird me encontre con un #@$@#$# error que me llevo casi todo un dia descubrir lo que sucedia:

validation error for column ISONLINE, value "*** null ***"

Este error me era arrojado en el event view de windows al fallar la creacion de un nuevo usuario.

Despues de revisar el store procedure que inserta un nuevo usuario, pasarme casi toda la mañana verificando la DB, los tipos de datos de los campos y hacer algunas pruebas insertando directamente con el mismo SP, me di cuenta que todo estaba bien, y que el error provenia de la clase FbMembershipProvider.

Busque por google exactamente el mensaje que me arrojaba y nada! Pero si encontre que habian algunos errores con la creacion de usuarios en algunas versiones mas viejas del FbMembershipProvider. Verificando el codigo fuente del Provider.Net de FireBird, observe que habian dos clases FbMembershipProvider y FbMembershipProvider2, esta ultima es mas completa y terminada. Cambie mi referencia en el web.config del MembershipProvider:

type="FirebirdSql.Web.Providers.FbMembershipProvider,FirebirdSql.Web.Providers, Version=2.0.0.0,Culture=neutral,PublicKeyToken=3d06a02581b682f8"

a:

type="FirebirdSql.Web.Providers.FbMembershipProvider2,FirebirdSql.Web.Providers, Version=2.0.0.0,Culture=neutral,PublicKeyToken=3d06a02581b682f8"

Todo era porque no estaba usando la version la version "2"

La verdad es que la documentacion es muy pobre, hay que buscarsela e ingeniarsela a no mas poder con esto para dar con la solucion. Incluso, si la version 1 tiene Bugs que se corrigen con la 2, no veo cual es el sentido de tener las dos disponibles, lo cual puede prestar a confunsion, ya que los pocos ejemplo que podemos encontrar para la implementacion del FbMembershipProvider no hace mension de la version corregida FbMembershipProvider2

miércoles, 12 de marzo de 2008

Arrancar FireBird al iniciar el sistema en FreeBSD


La instalacion de Firebird2 desde los ports no deja el sistema listo para arrancar la base de datos en la proxima reiniciada, hay que hacerlo manual:

agregar en /etc/services la siguente linea:
gds_db 3050/tcp # FireBird DataBase

agregar en /etc/inetd.conf la siguiente linea:
gds_db stream tcp nowait firebird /usr/local/sbin/fb_inet_server fb_inet_server

Luego reiniciar servicios para tener nuestro Firebird listo para trabajar:
/etc/rc.d/inetd restat

O reiniciar el sistema para comprobar que esta iniciando:
reboot

Instalacion de FireBird en FreeBSD

Instalando Firebird desde los ports en FreeBSD 6.2. Primer error encontrado en la instalacion:

===> Building for firebird-client-2.0.1
==> Please do not build firebird as 'root' because this may cause
conflicts with SysV semaphores of running services.
*** Error code 1

Stop in /usr/ports/databases/firebird2-client.
*** Error code 1

Stop in /usr/ports/databases/firebird2-server.

Solucion

Dar permisos necesarios a un usuario no root a las carpetas de
firebird2-client y firebird2-server estando logueado como root

chown -R usuario /usr/ports/databases/firebird2-server
chown -R usuario /usr/ports/databases/firebird2-client

entrar como el usuario con los nuevos privilegios

su usuario
cd /usr/ports/databases/firebird2-server
make

volver como root y terminar de instalar

exit
make install clean