miércoles, 21 de abril de 2010

[Base datos MySQL] -> Problema con consultas consecutivas: ERROR [HY000] [MySQL][ODBC 3.51 Driver]Can't connect to MySQL server on 'localhost' (10048)

Este error suele ocurrir cuando se realizan gran cantidad de consultas consecutivas a la base de datos en un intervalo corto de tiempo.

La presentación de este error puede variar según el software utilizado, este ejemplo corresponde al generador generado tras conectarse a BBDD MySQL a través de ODBC con Microsoft Visual Studio .NET.

Otros síntomas:
  • La aplicación ha podido conectarse anteriormente a la base de datos sin problemas.
  • Tras esperar un cierto tiempo (por ejemplo 1 minuto o 2) la aplicación puede volver a conectarse a la BBDD.
  • El error parece manifestarse tras condiciones de gran exigencia, cuando el número de conexiones abiertas y cerradas en un corto espacio de tiempo son altas.
 Causa
El error no es causado por MySQL o el controlador ODBC de MySQL, sino por el comportamiento de Windows. Por motivos de rendimiento, Windows mantiene una conexión en un puerto TCP después de que este sea cerrado (por defecto) 4 minutos. La ventaja de esto es que si la conexión tiene que volver a abrirse se puede realizar a un costo menor. El problema es que bajo una carga pesada, cuando un gran número de conexiones se abren y se cierran, el sistema puede alcanzar el número máximo de conexiones permitidas (a pesar que en la aplicación las conexiones se hayan cerrado).

Solución

1. Para reducir la demora antes de que Windows lance una conexión TCP abierta, edite la siguiente entrada en el Registro de Windows:
 HKEY_Local_Machine\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters\TcpTimedWaitDelay

Este valor no existe por defecto y tendrá que ser creado. Debe ser de tipo DWORD. El rango válido es de 0x1E - 0x12C (30 segundos a 300 segundos), el valor predeterminado es de 0xF0 (240 segundos). 

La disminución de este valor debe ayudar, pero no puede resolver definitivamente el problema para un sistema ocupado (porque si el sistema está ocupado los límites también se verán afectados). 
 
2. Considere si es posible modificar la aplicación para que la conexión se re-utilice en lugar de cerrar y abrirla sucesivamente.

En teoría la agrupación de conexiones también podría resolver este problema. http://support.microsoft.com/default.aspx?scid=kb; EN-US; q169470

lunes, 5 de abril de 2010

[VB Net] --> Controles personalizados, asignación de propiedades

Para asignar categorías a las propiedades de un control personalizado para que aparezcan de forma ordenada y coherente, usaremos la siguientes instrucciones antes de la definición de la propiedad.

Por ejemplo, supongamos que nuestro control personalizado tiene la propiedad Titulo, y vamos a establecer sus parámetros:




De esta forma cuando añadamos nuestro control a un proyecto nos aparecerá la propiedad Titulo en la categoría Chart de la ventana de propiedades, con el valor por defecto indicado y se nos mostrará la información: Título del gráfico al pulsar sobre ellla.

sábado, 3 de abril de 2010

[Optimización] --> Recocido simulado / Simulated annealing

Introducción
El método de recocido simulado es una técnica de optimización no determinística o estocástica (con aleatoriedad en la búsqueda de soluciones) que presenta una analogía con el proceso químico de recocido de materiales metálicos.

Al someter un metal a altas temperaturas los átomos absorben energía, se rompen los enlaces químicos confiriendo a los átomos un mayor grado de libertad para moverse. En el método de recocido se somete el metal a un enfriamiento controlado (más o menos lento), conforme la temperatura va disminuyendo los átomos poseen menos libertad de movimiento y se logra una estructura química más resistente y ordenada. Los átomos tienen a posicionarse en lugares donde la energía es mínima.

Este tipo de métodos es empleado en problemas combinatorios complejos, por ejemplo en el diseño óptimo de ordenadores, algoritmos de transporte (TSP), etc.. donde existe un gran número de parámetros a optimizar y el número de mínimos locales es muy grande.

El algoritmo
Se basa en la metaheurística de la relación entre el proceso químico del recocido y la optimización combinatoria. La relación entre ambas se muestra a continuación:

  • Configuración cristalina => Solución factible.
  • Configuración cristalina de mínima energía => Solución óptima.
  • Energía de la configuración => Coste de la solución.
  • Temperatura => Parámetro de control.

Por ser un método iterativo necesita partir de una solución inicial, la elección de esta nos determinará el coste computacional del resultado obtenido, aunque al ser un método estocástico no será tan crítica como en los métodos directos como gradiente-conjugado o Newton.


La diferencia entre este algoritmo y el de Monte Carlo es que este último sólo acepta soluciones mejores, mientras que el SA acepta soluciones peores según una cierta probabilidad. Debido a esto evita quedarse estancado en óptimos locales tan fácilmente (Mecanismo hill-climbing).



Parámetros importantes
  • Temperatura inicial. Si dicha temperatura es demasiado alta serán necesarias más iteraciones y el método tardará más en converger, si por el contrario es baja no llegará al mínimo. La solución sería partir de una temperatura alta y realizar pasos pequeños pero el problema sería intratable computacionalmente. Debe ser seleccionada con la idea de que casi todas las transiciones entre los estados sean aceptadas.
  • Esquema de enfriamiento. Determina como se va a realizar el descenso de la temperatura. Normalmente es usado un descenso geométrico de la forma:  Tnew = k·Told   donde k toma valores entre 0.80 y 0.99.
  • Temperatura mínima. Tiene que ser suficientemente baja para permitir llegar al máximo global.
  • Tiempo antes de la disminución de temperatura. Normalmente se usan número de iteraciones entre cada descenso de temperatura.
  • Criterio de parada. Se pueden considerar 3 métodos:
    • Tolerancia. Suponiendo que se conoce teóricamente una solución.
    • Cantidad de iteraciones.
    • Cambios relativos entre sucesivas iteraciones.
  • Movimientos. Determina como se realizan los cambios de parámetros. Deben ser inteligentes, es decir, estudiados matemáticamente para cada caso en particular. También son usados mutaciones y cruces. Un método sencillo de implementar sería realizar pequeñas alteraciones en un parámetro aleatorio.
Aplicaciones
  • Asignación: como acomodar los componentes de un circuito, generalización de asignación de cuadrados.
  • TSP: Partir de A, visitando N ciudades una sola vez y llegar a A, trayectoria de longitud mínima.
  • Particionamiento de grafos.
  • Arboles de Steiner.
  • Clustering.
  • Problemas de planificación.
  • Problemas de Organización de la Producción.
  • Simulación de reacciones químicas.
  • Ajustes de curvas en n-dimensiones.

[Matlab] --> Manejador de funciones

En Matlab puedes crear un manejador de una función, esto es una variable que contiene la definición de una función. De esta forma puedes evaluarla simplemente llamando a la variable.

Por ejemplo la siguiente función:

Kelvin=@(celsius) (273.15+celsius);

Se crea el manejador Kelvin, al cual se le define un parámetros de entrada: celsius mediante el operador @. A continuación se define la función como la suma del parámetros de entrada más 273.15.

Para calcular un valor en grados Kelvin la llamaría de la siguiente forma:

Kelvin(25)

Cuyo resultado es 298.15

[C/C++] --> Introducción a los punteros

En la gestión estática de memoria es necesario conocer de antemano los tamaños y formas de las estructuras, sin embargo, hay muchos programas cuyas estructuras de datos pueden variar de forma y tamaño.

Las variables son estáticas en el sentido en que se declaran en el programa, se designan por medio del identificador declarado, y se reserva para ellas un espacio en memoria en tiempo de compilación. El contenido de la variable puede cambiar, pero no el tamaño de memoria reservado para ella.

Sin embargo C permite la posibilidad de crear o destruir variables en tiempo de ejecución, a medida que van siendo necesitadas, no tienen nombre y se denominan anónimas. La forma de acceder a ellas es el tipo puntero.

Un puntero es una variable cuyo valor es la dirección de memoria de otra variable. Esto quiere decir que un puntero se refiere indirectamente a un valor. Por tanto, no hay que confundir una dirección de memoria con el contenido de esa dirección de memoria.



Ejemplos de declaración de punteros:

int *contador; // puntero a una variable de tipo entero
char *caracter; // puntero a una variable de tipo carácter

La variable contador no contiene un valor entero, sino la dirección de memoria donde está almacenado un valor de tipo entero.

Para asignar un puntero usaremos el operador de dirección &.

int q,m; // q y m son variables de tipo entero
int *contador; // contador es un puntero a un entero

q=100;
m=200;
contador=&m; // contador contiene la dirección de m

En la última línea contador recibe la dirección de m.

Si quiero ahora almacenar en la variable q el contenido de la variable a la que apunta contador, lo haré de la siguiente forma:

q= *contador;

[Matlab] --> Encontrar elementos en matriz con una condición

Con la función find puedes encontrar los elementos de un vector o matriz que cumplan cierta condición. En el ejemplo siguiente se devuelven en los vectores i y j los índices de los elementos de la matriz A que son mayores que 0.5.

viernes, 2 de abril de 2010

[Windows] -> Icono para apagar rápido el sistema

Con este truco podrás apagar de forma inmediata el ordenador.

Sitúate en el escritorio, haz clic con el botón derecho del ratón y selecciona: Nuevo->Acceso directo, en la ventana que aparece teclea lo siguiente: shutdown -s -t 00 en el siguiente paso ponle un nombre, por ejemplo: Apagar sistema, pulsa Aceptar y ya tendrás tu icono para apagar el Sistema Operativo.

Si por el contrario deseas espear unos segundos de margen de confianza para cerrar tus programas antes de apagar en lugar de 00 indicar el valor en segundos, por ejemplo 10.

Finalmente podrás cambiarle el icono haciendo clic con el botón derecho del ratón: Propiedades y pinchando en Cambiar icono.

jueves, 1 de abril de 2010

[Windows] -> Acelerar arranque de Sistema Operativo

Algunas veces el arranque de nuestro ordenador se vuelve un problema, cuando tenemos bastantes programas instalados, algunos de ellos se cargan al inicio, con el consiguiente retraso y desesperación por parte nuestra.

Para desactivar la carga de los programas al inicio realiza las siguientes operaciones:

  1. Ve al menú: Inicio->Ejecutar teclea: msconfig y pulsa Enter
  2. En la ventana que aparece desplázate hasta la pestaña Inicio y desactiva los elementos que no quieras que se carguen al arrancar el SO (deberías dejar el Antivirus).