No voy a descubrir a nadie en este momento que Capa es uno de los grandes fotógrafos de lo que va de Historia (sí, con mayúscula). Es, además, y para quien aún no lo sepa, uno de los mejores fotógrafos de guerra, habiendo cubierto algunas de las más sangrientas del siglo XX, como la II Guerra Mundial o la Guerra Civil Española. Pues bien, interesado como suelo estar en el tema de la historia del siglo XX y en la fotografía y particularmente en la obra de Capa, me decidí a leer esta biografía sobre el mismo.
En primer lugar, me gustaría resaltar que se trata de un libro que engancha prácticamente desde la primera página. Realmente hacía tiempo que no leía un libro tan rápido y con tantas ganas. El autor, Alex Kershaw, consigue un ritmo trepidante, primero a ritmo de las balas y más tarde hablando sobre la bohemia vida de Capa. Sin embargo, tengo que reconocer que tiene también algunos defectos, como por ejemplo que no incluye ninguna fotografía hecha por el propio Capa. También existen algunas anécdotas difíciles de creer y que no resulta difícil encontrar por Internet. Otras anotaciones no quedan muy claras, o su sentido concreto al sacarlas de contexto... Y sin embargo, es un libro que tengo que decir que me alegro de haber leído.
En resumen, se trata de un libro muy entretenido y fácil de leer, que engancha, aunque algunos aspectos muy puntuales confundan un poco. Me parece especialmente recomendable para personas interesadas en la fotografía y la historia del siglo XX.
viernes, 17 de diciembre de 2010
domingo, 12 de diciembre de 2010
Séneca: sobre la brevedad de la vida (on the shortness of life)
Lee los clásicos. Es un consejo universal y cada día más manido en los inciertos tiempos que corren. Y no es un consejo vano. En cualquier tiempo. Lo cierto es que cuando vi este libro en una estantería me llamó la atención por el subtítulo. Una sencilla frase que hacía las veces de presentación y que ya era una perla en sí misma:
En resumen, me parece una lectura muy recomendable y bastante distinta a las más populares hoy día, especialmente porque invita a reflexionar sobre temas importantes y materializa muchos pensamientos que probablemente ya sean nuestros aunque todavía no les hayamos dado forma. Una invitación a disfrutar de la vida lejos de entretenimientos banales que en su día sería el circo y hoy, probablemente, la televisión, lejos de modas, de convenciones sociales y de todo tipo de ataduras.
Life is so long if you know how to use it. Tengo que reconocer que la lectura es algo lenta, debido tanto a la temática (filosofía) como al hecho de estar leyendo en inglés, pero con un pequeño esfuerzo fui acostumbrándome y fui entresacando varias ideas interesantes. Sorprendentemente, muchos de los temas que trata tienen completa vigencia actualmente y, en particular, la idea más interesante fue la siguiente:
de la persona que ha vivido más tiempo se puede decir que ha existido más pero no que ha vivido más. Hace unos pocos años, recuerdo en un foro que se debatía este mismo tema y cual fue mi sorpresa al ver que unos 2000 años antes ya se había encontrado una respuesta tan precisa. En realidad, no es tan sorprendente cuando se trata de un tema tan universal a los seres humanos de todos los tiempos como la vida y la muerte.
En resumen, me parece una lectura muy recomendable y bastante distinta a las más populares hoy día, especialmente porque invita a reflexionar sobre temas importantes y materializa muchos pensamientos que probablemente ya sean nuestros aunque todavía no les hayamos dado forma. Una invitación a disfrutar de la vida lejos de entretenimientos banales que en su día sería el circo y hoy, probablemente, la televisión, lejos de modas, de convenciones sociales y de todo tipo de ataduras.
viernes, 10 de diciembre de 2010
Cómo validar el NIF mediante los controles de validación de ASP.NET
Ayer publiqué una entrada con un script que servía para validar el NIF de una persona mediante un javascript genérico. Veamos hoy cómo hacerlo utilizando controles de validación específicos de .NET.
En primer lugar, se crea un web site y dentro de éste un archivo aspx, por ejemplo, Default.aspx. Dentro de Default.aspx se inserta un formulario (lo normal es que venga por defecto) y en él se incluye una etiqueta (label) y un campo de texto (edit), por ejemplo como sigue:
A continuación se añade un control de validación. Dado que el DNI es un tipo de validación muy específica que no puede validarse mediante expresiones regulares (recuerdo que la letra se calcula a partir de dividir el número en 23) debemos utilizar un Custom Validator, que añadiremos a continuación de lo anterior:
A continuación sólo nos falta añadir la función validanif al javascript de la página. Se recomienda que en un fichero externo y por los métodos habituales a tal efecto. El resultado sería:
Como puede verse prácticamente planchado al método de ayer. La única peculiaridad a comentar es que se valida la letra tanto si es minúscula como si es mayúscula, aspecto a considerar según la aplicación.
En primer lugar, se crea un web site y dentro de éste un archivo aspx, por ejemplo, Default.aspx. Dentro de Default.aspx se inserta un formulario (lo normal es que venga por defecto) y en él se incluye una etiqueta (label) y un campo de texto (edit), por ejemplo como sigue:
<asp:Label ID="etiquetaNIF" runat="server" Text="NIF:" AssociatedControlID="textoNIF"></asp:Label> <asp:TextBox ID="textoNIF" runat="server" />
A continuación se añade un control de validación. Dado que el DNI es un tipo de validación muy específica que no puede validarse mediante expresiones regulares (recuerdo que la letra se calcula a partir de dividir el número en 23) debemos utilizar un Custom Validator, que añadiremos a continuación de lo anterior:
<asp:CustomValidator ID="CustomValidatorNIF" runat="server" ErrorMessage="NIF incorrecto" ControlToValidate="textoNIF" ClientValidationFunction="validanif" />Como puede verse, los aspectos fundamentales son:
- El ID: debe asignarse un id también al control de validación
- Runat: debe asignarse al servidor
- ErrorMessage: es el mensaje que aparecerá cuando la validación falle
- ControlToValidate: el control a validar, en este caso textoNIF
- ClientValidationFunction: validanif
- OnServerValidate: En este caso no se ha utilizado un manejador de evento del lado del servidor porque el ejemplo está centrado en la parte del cliente, pero por motivos de seguridad se recomienda validar SIEMPRE en el lado del servidor las entradas de los usuarios
A continuación sólo nos falta añadir la función validanif al javascript de la página. Se recomienda que en un fichero externo y por los métodos habituales a tal efecto. El resultado sería:
///Calcula la letra del nif a partir del número function letranif(numero) { aLetras = new Array(); aLetras[0] = "T" ;aLetras[1] = "R" ;aLetras[2] = "W" ; aLetras[3] = "A" ;aLetras[4] = "G" ;aLetras[5] = "M" ; aLetras[6] = "Y" ;aLetras[7] = "F" ;aLetras[8] = "P" ; aLetras[9] = "D" ;aLetras[10] = "X" ;aLetras[11] = "B" ; aLetras[12] = "N" ;aLetras[13] = "J" ;aLetras[14] = "Z" ; aLetras[15] = "S" ;aLetras[16] = "Q" ;aLetras[17] = "V" ; aLetras[18] = "H" ;aLetras[19] = "L" ;aLetras[20] = "C" ; aLetras[21] = "K" ;aLetras[22] = "E" ; return aLetras[numero%23]; } ///Lleva a cabo la validación del nif function validanif(source, args) { //Validación básica de formato var validformat = /^\d{8}([A-Z]|[a-z])$/; var numero; if (!validformat.test(args.Value)) { args.IsValid = false; return; } //Entrando en detalle numero = parseInt(args.Value.substring(0,8)); //Si no es un número dar error if (isNaN(numero)) { args.IsValid = false; return; } //Se comparan ambos resultados para validarlos if (letranif(numero)==args.Value.substring(8,9).toUpperCase()) args.IsValid = true; else args.IsValid = false; }
Como puede verse prácticamente planchado al método de ayer. La única peculiaridad a comentar es que se valida la letra tanto si es minúscula como si es mayúscula, aspecto a considerar según la aplicación.
jueves, 9 de diciembre de 2010
Validar el NIF
Son múltiples los ejemplos existentes por internet de scripts que calculan la letra del DNI a partir del número. No así los scripts que realizan la validación. Así pues comparto mi encomiable esfuerzo :D por si a alguien le ahorra los 5 minutos que lleva hacerlo.
///Lleva a cabo la validación del nif function validanif(nif) { //Validación básica de formato var validformat = /^\d{8}([A-Z]|[a-z])$/; var numero; if (!validformat.test(nif)) return false; //Entrando en detalle numero = parseInt(nif.substring(0,8)); //Si no es un número dar error if (isNaN(numero)) return false; //Se comparan ambos resultados y se devuelve return (letranif(numero)==nif.substring(8,9).toUpperCase()); } ///Calcula la letra del nif a partir del número function letranif(numero) { aLetras = new Array(); aLetras[0] = "T" ;aLetras[1] = "R" ;aLetras[2] = "W" ; aLetras[3] = "A" ;aLetras[4] = "G" ;aLetras[5] = "M" ; aLetras[6] = "Y" ;aLetras[7] = "F" ;aLetras[8] = "P" ; aLetras[9] = "D" ;aLetras[10] = "X" ;aLetras[11] = "B" ; aLetras[12] = "N" ;aLetras[13] = "J" ;aLetras[14] = "Z" ; aLetras[15] = "S" ;aLetras[16] = "Q" ;aLetras[17] = "V" ; aLetras[18] = "H" ;aLetras[19] = "L" ;aLetras[20] = "C" ; aLetras[21] = "K" ;aLetras[22] = "E" ; return aLetras[numero%23]; }
Problema de compatibilidad de ASP.NET Ajax Toolkit con mis scripts
O al menos eso fue lo que en un principio pensaba cuando comprobé que al incluir mi propio script de validación se producía un error de javascript y fallaba toda la funcionalidad del toolkit. La peculiaridad es que todos los ejemplos que aparecen por la red son (cómo no) excesivamente sencillos y todos los scripts que se incluyen suelen ser "pegotes" en el código. Si en lugar de eso quieres utilizar un fichero js externo es cuando aparecen los problemas. Y lo cierto es que estaba a punto de intentar una solución relativamente desesperada cuando se me ocurrió que tal vez todo provenía del hecho de intentar incluir el script con una sola etiqueta. ¡Y efectivamente! Un pequeño despiste, fácilmente solucionable que me dejó una noche en vela y una mañana bastante cansada... Así que ya sabéis amigos, si queréis incluir vuestros scripts en una página, recordad usar 2 etiquetas: la de apertura y la de cierre:
<script type="text/javascript" src="miscript.js"></script>
El capitán salió a comer y los marineros tomaron el barco
Bajo este curioso título podemos encontrar la obra póstuma de Bukowski. Se trata de un diario de sus últimos años donde se narra, como siempre en primera persona, el día a día de una persona que ya no vive tan al límite como en otros tiempos (ahora está casado, tiene una casa, un buen coche, un jacuzzi...) pero sigue manteniendo la esencia de su escritura. Cambian los escenarios, los protagonistas, pero el estilo sigue siendo reconocible.
Por otro lado, al tratarse de un conjunto de capítulos inconexos entre sí, resulta menos ameno que otros, aunque es una buena manera de ocupar breves ratos libres, ya que la lectura es rápida.
En resumen: un libro imprescindible para los seguidores de las andanzas de Hank, aunque no lo recomendaría como primera lectura del autor.
Por otro lado, al tratarse de un conjunto de capítulos inconexos entre sí, resulta menos ameno que otros, aunque es una buena manera de ocupar breves ratos libres, ya que la lectura es rápida.
En resumen: un libro imprescindible para los seguidores de las andanzas de Hank, aunque no lo recomendaría como primera lectura del autor.
miércoles, 8 de diciembre de 2010
Discurso del Permio Nobel de Mario Vargas Llosa
Sin desperdicio alguno (aunque un poco largo para leer por pantalla), empieza así:
Aprendí a leer a los cinco años, en la clase del hermano Justiniano, en el Colegio de la Salle, en Cochabamba (Bolivia). Es la cosa más importante que me ha pasado en la vida.Sólo esas 2 frases valen la pena, pero te recomiendo que no dejes de leer el resto.
Suscribirse a:
Entradas (Atom)