viernes, 31 de octubre de 2008

Me han vuelto a timar

"Si me engañas una vez es culpa tuya.
Si me engañas dos veces, es culpa mía"
Anaxágoras.-


Me han vuelto a timar. Y mira que juré y perjuré que no me volvería a pasar, pero nada. Debe ser mi piedra particular, esa que según la canción siempre está dispuesta en que tropiece con ella.

Todo empezó cuando, estando con una compañía de teléfono, recibimos una llamada de otra distinta -es decir, spam- para ofrecernos el oro y el moro si nos cambiábamos con ella.

Nos íbamos a ahorrar un dinerito cada mes a costa de perder muchos megas de bajada, pero es que ya no gasto. Pero es el precio final, ¿verdad? Si si, lo que vais a pagar al mes es 34 todo incluido. Pues bueno, pues vale, pues me cambio.

El primer mosqueo es que mandaron a través de mensajero, con urgencia, premeditación y alevosía, el papel para firmar la portabilidad. Llamada de teléfono: Oye, que no me ha llegado el contrato para ver las condiciones. Bueno, ya llegará mañana o pasado. Si, pero es que hasta que no lo tenga y vea las condiciones por escrito no voy a firmar nada. Ya, bueno, pero tenemos una grabación diciendo que te cambias, y con eso nos vale; además, si no firmas la portabilidad te quedas 15 días sin internet porque en vuestra antigua compañía ya se ha cursado la baja. Llamada a la OCU y nos confirman que es verdad, que si por teléfono hemos dicho que si, que eso vale.

Ale, primer gol por la escuadra. A firmar la dichosa portabilidad, y en menos de lo que canta un gallo ya estamos cambiados.

Después de eso llega la primera factura y el segundo mosqueo: Mucha más pasta de la que nos dijeron en la oferta por teléfono. Tras rápida consulta y sin contar con los dedos llegamos a la conclusión de que la diferencia es el famoso mantenimiento de la línea. No fastidies, si por teléfono nos dijeron que el precio total ya contenía ese mantenimiento.

Pues nada, a consultar nuevamente con la OCU a ver qué hay que hacer para ponerles una denuncia por lo civil y otra por lo criminal, porque a esto no hay derecho. Y yo que dije que estos no me iban a volver a timar...

miércoles, 29 de octubre de 2008

La importancia de las Claúsulas

Así que era tan fácil, y los malos sin saberlo. Resulta que cuando haces algo de dudosa legalidad, o abiertamente ilegal, todo lo que tienes que hacer para asegurarte el pellejo es poner una clausula bien clarita en la que prohíbes a los miembros de carácter gubernamental entrar en tu blog porque tu lo quieres.

Suena a broma, ¿verdad? Pues lo mejor es que va en serio, y si no aquí está en enlace y la captura -porque no creo que duren mucho en el aire-:


Con un par. Ya estoy viendo a todas las organizaciones de malos seguir este maravilloso ejemplo de creatividad, colgando carteles de "Propiedad Privada: No se permite la entrada de la pasma por expreso deseo del Boss".

Es casi tan bueno como ese otro que va, escanea un suplemento calentito calentito, lo cuelga de su blog y le planta su dirección web para demostrar que ha plantado una pica en Flandes. Este es el comentario que le pusieron, comentario posteriormente calzado y del que ahora mismo no queda ni el rastro -casualidades que le tengo sindicados también los comentarios-. Seguro que ahora tiene los comentarios moderados:

Escaneado como el culo. A caballo regalado no le mires el diente, pero si no sirve... no sirve (no se distinguen ni las letras).

Encima le metes publicidad de la web para que quede claro qué sitio hay que cerrar. Ahora lo típico de que si es copia para los que tienen el original, que si pim que si pam... ni os habeis molestado en leer la política de privacidad de GW.

Un mes (que el papeleo es lento) y blog cerrado. Ale

- GW - Staff


Me recuerdan a ese viejo chiste -y malo, muy malo- del tío al que echan de la piscina por mearse en ella. Pero si todo el mundo lo hace -alega él-. Si, pero no desde el trampolín.

De verdad, no se si estos tipos son unos iluminados o unos cretinos. Bueno, en realidad creo que si lo se y lo sabemos todos.

lunes, 27 de octubre de 2008

Celiaquía

La enfermedad celíaca (EC) viene a ser una intolerancia a una mísera proteína: El Gluten. La pena es que esta proteína está en el trigo, cebada, avena y centeno, con lo que todos los alimentos que tengan estos cereales son contraproducentes para un celíaco.

No son muchos, pero son muy llamativos: Pan, bollos, pasta (espaguetis, macarrones, etc) y cerveza, además de multitud de otros que sin tener nada que ver con ellos, sufren lo que se llama "contaminación cruzada", es decir, que el mismo recipiente en el que hacen los bollos, después lo utilizan para transportar guisantes o cocer mermelada, con lo que éstos quedan con trazas de aquellos -y los celíacos fastidiados, por no poner otra palabra-.

Sin embargo, siendo una enfermedad crónica, desde mi punto de vista tampoco es tan grave ya que no hay que estar toda la vida tomando medicamentos ni se padecen grandes periodos convalecientes. Tan sólo hay que quitar de la dieta todos aquellos productos que la causan, y quitarlos de por vida.

Por suerte, hoy en día encontramos productos sin gluten en multitud de sitios, y se hacen panes y pastas utilizando harinas de arroz y maíz -que sí los pueden tomar los celíacos-. Mención especial merecen dos cadenas de grandes almacenes con multitud de productos sin gluten: Mercadona y Eroski.

Para terminar el rollo unos enlaces interesantes -los iré ampliando-:

Una buena definición de la celiaquía en la wikipedia
Federación de Asociaciones de celíacos de España (FACE)
Blog El Rincón del Celíaco
Blog Vida sin Gluten


Fdo: Un padre de una pequeñaja a la que le acaban de diagnosticar la celiaquía.

viernes, 17 de octubre de 2008

vs2008: CheckForIllegalCrossThreadCalls

Introducción

El mundo de la programación es más o menos sencillo hasta que nos metemos en berengenales como el multi-hilo. Aquí la cosa se complica ligeramente, y si tratamos de seguir programando como si fuese programación mono-hilo, antes o después tenemos un error del depurador que viene a decir que un hilo está tratando de tocar datos que tiene otro hilo.


La Chapuza

Además, nos da una solución rápida en plan "que no se note", como es cambiar la propiedad CheckForIllegalCrossThreadCalls a false. En la edad media se cortaba una mano por cosas mucho más leves que esta. Eso es como si está sonando la alarma de incencido y le desactivamos el timbre para que no moleste. ¿No es mas razonable -además de otras muchas cosas- solucionar la causa?


La Solución Elegante

Por fin he entendido cómo hay que hacer las llamadas asíncronas a procesos síncronos en Windows Forms y los famosos métodos Delegados, así que voy a intentar explicarlo por aquí, aun a riesgo de meter la pata -vaya por delante que según la documentación, esta forma que voy a poner no termina de ser la mejor posible-.

En un escenario ideal, creamos un formulario que tiene unos componentes y unos métodos, y éstos cambian el estado de aquellos a discrección. Esto es lo habitual cuando un proceso va poniendo en pantalla información sobre lo que va haciendo, y no es ningún problema cuando se trata de una aplicación mono-hilo, de esas que van haciendo cosas una detrás de otra -en la mayoría de los casos dejando el interface frito- hasta que terminan.


Ponemos algo en un TextBox
de la forma tradiccional


Sin embargo, más tarde o más temprano se nos ocurrirá la feliz idea de evitar el famoso "no responde" en el Administrador de Tareas, e incluso -y esto ya es para nota- el botón de cancelar que de verdad cancele el proceso en ejecución. Y para hacer esto no hay nada que nos complique más la vida que lanzar ese proceso pesado en otro hilo distinto al utilizado por el interface.


El ojo hábil habrá notado que estoy llamando a otro método,
pero a estas alturas podría seguir siendo PonTexto.


Y justo aquí es donde llegamos a nuestro problema, ya que cuando ese subproceso trate de comunicarse con el proceso que lo ha creado -por ejemplo para indicar el estado en el que está en un TextBox-, tendremos esa excepción que dice que:


Operación no válida a través de subprocesos: Se tuvo acceso al
control 'textBox1' desde un subproceso distinto a aquel en que lo creó.


La solución a esto recuerda a la recursividad pero cambiándole el nombre -Microsoft, si no le cambia el nombre a las cosas, no puede decir que lo ha inventado-. La cuestión está en que si cuando vamos a modificar el control detectamos que no estamos en el hilo "padre" lo que hacemos es llamar al mismo método pero del hilo correcto -es decir, el hilo que creó el subproceso en el que estamos-. Más o menos.

La forma en la que sabemos si estamos en el hilo correcto es tan sencillo como consultar la propiedad InvokeRequired del control. Esta nos dirá si podemos modificar el control, o si por el contrario tenemos que "invocar" al método que lo creó. Realmente, la complicación está en realizar esta "invocación", ya que desde mi punto de vista no es nada intuitiva.

[Actualización 22/10/2008: Los dos siguientes párrafos, lejos de ser correctos, tienen errores importantes respecto a lo que es un delegado -la ignorancia es atrevida-. No obstante, los dejo tal y como los publiqué originalmente a la espera de escribir una entrada en la que hable de los mismos]

En primer lugar, para llamar a Invoke necesitamos un delegado del método que vamos a utilizar. ¿Y qué es un Delegado? Se trata de un método con la misma firma que el método a delegar. ¿Y qué significa tener la misma firma? Pues viene a significar que tiene el mísmo número de parámetros, y que éstos son del mismo tipo, incluido el tipo devuelto por el método ¿Por qué? Porque si.

En nuestro caso, la definición -olvidaba decir que un delegado no tiene implementación- del método delegado viene a ser algo sencillo como esto:



Y por fin, para hacer esta llamada segura, lo que nos queda es definir una variable de este delegado y llamar al proceso Invoke. He creado un proceso nuevo llamado PonTextoSeguro para mantener las dos formas de hacerlo. Así, esta es la implementación del nuevo método:



Resumen

De esta forma, lo que hacemos es:

1º La aplicación crea un hilo para ejecutar un proceso pesado.
2º El proceso manda información a la aplicación indicando dónde va (por ejemplo un texto a mostrar en textBox1).
3º El método que va a escribir en textBox1 detecta que está en un subproceso, así que se llama a sí mísmo pero en el proceso de la aplicación.
4º Después de la llamada, cuando ya si estamos en el proceso correcto, escribimos en textBox1.

Así hacemos llamadas asíncronas de una forma sencilla y sin chapuzas innecesarias. Naturalmente el ejemplo es lo más sencillo que se puede imaginar. La cosa se complica un poco cuando el método (PonTextoSeguro) recibe parámetros, pero sólo un poco.

martes, 14 de octubre de 2008

Octality

Esta es otra entrada de esas de publicidad de los colegas. Publicidad que, dado el abanico de lectores que tengo no tiene mucho sentido, pero en cualquier caso me apetece ponerla.

Resulta que el bueno de Álvaro López Ortega, como se aburría siendo un megajefe -o casi- de Sun encargado de coordinar las características de la nueva versión de OpenSolaris, ha decidido montar su propia empresa con este bonito logo:


Este es el anuncio oficial en su blog, y esta la web de Octality.

Por cierto, ¿queréis ver un ordenador de verdad, y no esos anuncios del Medialeches? Pues mirar esto.

Así que nada Alo -y compañía-, que buena suerte, buen viento y buena caza.

jueves, 9 de octubre de 2008

Sinergia sin control

Descubrí la página de Sinergia sin control hace un par de días, a través de La masa, el ladrillo, la bota, el bocadillo... -a pesar de ese nombre tiene unos artículos técnicos muy interesantes-. Es de lo mejorcito que he visto en mucho tiempo, y sino, juzguen ustedes mismos -pincha para ampliar-:


Sobra decir que ya la tengo sindicada y añadida al panel lateral de las viñetas.