viernes, 24 de octubre de 2014

Yosemite, Apache y MySQL

Al actualizar el sistema de OS X Mavericks a  Yosemite, me he encontrado con el pequeño inconveniente de que Apache y MySQL han dejado de funcionar.

Apache

El problema del servidor Apache es que la instalación de Yosemite machaca el archivo httpd.conf, con lo cual se pierde toda la configuración anterior. Afortunadamente esa información está guardada en httpd.conf~previous. De esta forma he editado httpd.conf, cambiado los parámetros necesarios. En mi caso, el directorio raíz de la web local, los usuarios, activación del módulo de PHP, apertura de los puertos de escucha, ya que tengo 5 webs independientes. Todo eso está en el directorio "/etc/apache2". Se hacen los cambios y reiniciamos el servidor web: sudo apachectl restart.

MySQL

MySQL no responde. Una vez pulsado el botón del pánico porque creía que había perdido mis bases de datos, compruebo que el servicio MySQL no estaba iniciado. Se arranca y todo va bien... bueno... casi bien... ¡MySQL no arranca automáticamente al iniciar el ordenador!

La solución es sencilla y se encuentra en esta dirección: https://stackoverflow.com/questions/26461173/autostart-mysql-server-on-mac-os-x-yosemite/26465743#26465743

miércoles, 2 de julio de 2014

Selección aleatoria con pesos

Tenemos el siguiente problema: Tenemos un conjunto y hemos de seleccionar aleatoriamente (función de probabilidad uniforme) un elemento de dicho conjunto, lo que ocurre es que cada elemento tiene un peso que lo hace más elegible es decir, tiene más papeletas.

La solución la tenemos en https://stackoverflow.com/questions/6737283/weighted-randomness-in-java

Item[] items = ...;

// Compute the total weight of all items together
double totalWeight = 0.0d;
for (Item i : items)
{
    totalWeight += i.getWeight();
}
// Now choose a random item
int randomIndex = -1;
double random = Math.random() * totalWeight;
for (int i = 0; i < items.length; ++i)
{
    random -= items[i].getWeight();
    if (random <= 0.0d)
    {
        randomIndex = i;
        break;
    }
}
Item myRandomItem = items[randomIndex];
Si vamos a usar reiteradamente Math.random(), es más eficiente usar el objeto Random y llamar a nextDouble(), pues Math.random() usa internamente Random.nextDouble();

Más sobre esto en:
http://www.aprenderaprogramar.es/...
https://stackoverflow.com/questions/738629/math-random-versus-random-nextintint

viernes, 20 de junio de 2014

hashcode

Cuando usamos interfaces tipo Set,  necesitamos que los objetos de la colección tengan el método hashcode() correctamente funcionando. Con los objetos clave del interface Map ocurre lo mismo. Esto es porque para localizar los objetos, o las claves, dentro de la colección se utiliza el hashcode en su optimizado algoritmo de búsqueda.

¿Qué es el hashcodehashcode es un entero más o menos único para cada objeto, y se suele obtener a partir de los campos del objeto.

http://www.ibm.com/developerworks/java/library/j-jtp05273/index.html

Por otro lado, ciertos entornos de desarrollo como Eclipse nos puede generar un hashcode si así se lo requerimos, eligiendo qué campos son los significativos.

Finalmente, hemos de comprobar siempre que equals() y hashcode() actúen en sintonía, como bien dice el artículo.

martes, 29 de abril de 2014

lunes, 14 de abril de 2014

ConcurrentModificationException

En Yoching me he tropezado con un problema de la implementación de Iterable<T>: mientras leo una lista otro hilo intenta modificarla y se produce una excepción de concurrencia.

Leyendo el estupendo artículo de Pankaj (http://www.javacodegeeks.com/2011/05/avoid-concurrentmodificationexception.html), la solución es fácil, pues si bien una parte del programa "lee" la lista para monitorizar el proceso, la otra está "modificando" los datos. Es decir, en la lectura sólo necesito la información para tomar una foto del momento, y la sincronización con la lista mutante no es crítica.

Me basta copiar los datos en un array, mostrar el array y destruirlo, mientras yoching sigue a lo suyo con la lista original.

Cabala, validar email y teléfono desde el cliente

Expresiones regulares: validación de entradas


Para validar textos en el lado del cliente, javascript tiene herramientas muy simples de usar. Sólo hace falta dedicarle unos minutos para entender su funcionamiento:

http://ismaelgsan.com/validar-un-email-con-javascript-de-forma-rapida-y-sencilla/

Extrapolando a un teléfono

Siguiendo el ejemplo el patrón para un teléfono con/sin prefijo de país, con/sin extensión

+349588777#555

/^([+])?([0-9])*(([#])?([0-9])*)*$/

Más información en
http://www.w3schools.com/jsref/jsref_obj_regexp.asp

jueves, 6 de marzo de 2014

Subidas y bajadas: plupload y uploadify

De vuelta a "Revelaciones" y tras varias vueltas, finalmente descarto el uso de uploadify y me quedo con plupload. Esta librería es más versátil en su utilización, es más fácil de integrar y ofrece soluciones alternativas, y opacas para el programador, según los distintos sistemas y navegadores, usando flash, html4, html5 o silverlight según sea necesario.

Respecto a la integración, puedo evitar el uso de un botón que esté siempre visible durante la subida, lo cual me permite hacer la web más fluida. Cuando uploadify, y cualquier elemento basado en flash, se oculta, por ejemplo haciendo un JQuery.hide(), el motor de adobe oculta y deshabilita el objeto, paralizando cualquier proceso que esté ejecutando en ese momento. Y si no queremos ocultar el objeto por estas razones, es prácticamente imposible engañar al sistema cambiando el tamaño del botón flash.

Quizás sea piquismiquis, pero es horroroso tener un control incontrolable. plupload entra en Revelaciones y sale uploadify.