sábado, junio 30, 2012

EasyFiles Mirror

Como sabrán los que me vienen siguiendo de hace tiempo, hasta hace un par de semanas estuve haciendo prácticas de programación en la Freie Universität Berlin como último módulo del ciclo formativo que estaba realizando. Allí me mandaron un proyecto bastante interesante que me gustaría describir aquí (siempre guardando la confidencialidad de los documentos de la universidad, los cuales no mostraré en ningún momento) ya que en un tiempo, probablemente, comience a distribuir dicho programa por internet, obviamente modificado (esta versión es muy específica para el trabajo que ellos realizaban) y mejorado.
Primero os pongo en situación: donde yo trabajaba, el servicio técnico de la universidad, se dedicaban a hacer de intermediarios entre los distintos departamentos de la universidad y las empresas que vendían productos informáticos tanto de hardware como de software. Esto provocaba que tuvieran una gran cantidad de documentos, todos con nombres largos y formados por largas cadenas de letras y números y, encima, que se parecían mucho entre ellos. Por supuesto, hacer una búsqueda entre tanto archivo parecido era un tanto complejo así que necesitaban un DMS (Data Management System) con capacidad de búsqueda que se encargara de simplificar el asunto. De este modo, el programa debía permitir subir archivos y separarlos por categorías, ya que dependiendo de qué tipo de archivo estuviéramos hablando necesitaríamos buscar distintos datos. No me preguntéis sobre qué significaban los distintos tipos de archivo porque realmente no llegué a entender nunca del todo cómo funcionaba ese sistema, y tampoco era algo que necesitara saber para llevar a cabo el proyecto, así que no me preocupé más de lo necesario.
En esta universidad generalmente trabajan con aplicaciones web para evitar tener problemas con los distintos sistemas operativos, de modo que la aplicación que hice fue hecha de dicha manera. De este modo, y para dar un par de datos técnicos antes de empezar a describir la aplicación, para llevarla a cabo usé los cinco lenguajes webs de licencia gratuita más habituales (HTML, CSS, JavaScript, PHP y MySQL), con algunas librerías y técnicas extra (sobre todo en JavaScript, al que le sumé JSON, Ajax y JQuery), todo sobre una arquitectura basada en un patrón Modelo-Vista-Controlador. Sé que muchos de lo que leáis esto entenderéis poco o nada de esto, pero ya acaba la parte "técnica".
Al estar basado en web, y aunque en un comienzo se supone que la aplicación la usará sólo el responsable de este proceso, en mi opinión me pareció interesante crear un sistema de usuarios por el que cualquier nuevo usuario que accediera al sistema debería crear una nueva cuenta y "loguearse" correctamente para acceder al sistema. De esta manera, pueden existir tres tipos de usuarios en la aplicación: los usuarios normales, los administradores y los "super usuarios". Como es evidente, un usuario nuevo que se registre sería en un comienzo un usuario normal, y los usuarios "con privilegios" serían los encargados de decidir a cuales de ellos promover, además de tener otros evidentes privilegios como acceso a todos los archivos del sistema (los cuales los usuarios normales sólo tendrían acceso a aquellos subidos por ellos mismos o a los que se les haya concedido permiso).
Cuando accedemos (en las capturas de pantalla estamos usando la cuenta "admin" que, en realidad, es un super usuario) vemos una estructura de carpetas que refleja exactamente la estructura de carpetas que hay en un directorio en particular en el servidor, de modo que cualquier cambio que hagamos en la estructura de la página (como vemos en las capturas podemos crear, subir, mover, eliminar o renombrar archivos o carpetas) se verán reflejados en dicho directorio del servidor, y viceversa, si alguien accede al servidor y cambia los archivos, estos se verán reflejados en la página, aunque para ello se necesitaría volver a sincronizar (lo cual ocurre automáticamente cuando un usuario se loguea, pero como no podemos contar siempre con que haya usuarios logueándose, hay un botón "Sincronizar" en esta página principal).
Hasta el momento la cosa es relatívamente fácil. Trabajosa, pero fácil. El mayor problema ocurrió a la hora de tener que leer la información de los archivos. El sistema trabaja sin problema con ficheros "pdf" y "txt", y en la última semana lo adapté para que funcionara también con "doc", "docx" y "rtf", aunque la falta de tiempo y recursos para hacer pruebas me impidió estar completamente seguro de que funcione perfecto con estos tipos de archivos. Lo cierto es que, si se añaden archivos de forma manual al directorio del servidor y luego se sincroniza, los archivos se registrarán cono sin categoría. Sin embargo, al subirlos a través del formulario de la aplicación podremos seleccionar la categoría a la que queremos que pertenezca. Esto, de todos modos, importa poco, ya que una vez dentro del programa podemos usar la opción "Cambiar categoría" que, como su nombre indica, cambiará la categoría del archivo.
De este modo, para cualquier archivo se pueden hacer búsquedas genéricas de cualquier texto que se encuentre en su interior, pero para aquellas que tengan unas categorías determinadas se pueden hacer búsquedas de distintos campos (aquellos que me especificó el encargado de este asunto). Además, en la búsqueda genérica, también por petición del encargado, podemos introducir un código especial de estos archivos para que los encuentre, a pesar de que el código no siempre aparecía de la misma manera en los archivos. Es un poco complejo de explicar sin revelar ningún dato de la universidad, pero de todos modos, todo lo que aparece en este párrafo desaparecerá de la versión que publique proximamente, ya que es la parte más específica de todo el asunto, y evidentemente fuera del contexto de esta universidad servirá de poco o nada esta búsqueda.
Lo cierto es que el sistema de búsqueda fue una de las cosas más complejas y que, de hecho, me ha llevado a plantearme cómo hacer un sistema de búsqueda preciso pero al mismo tiempo que valga para muchos tipos de aplicaciones. Tengo unas cuantas ideas, pero tendré que estudiar las posibilidades que hay. Sea como sea, sigo explicando cómo funciona este programa.
El resto de características del programa son bastante más genéricas. Por un lado tenemos un sistema de mensajería entre usuarios sin ninguna peculiaridad especial, pero que, aunque no era la primera vez que desarrollaba un sistema de mensajería en PHP (en proyectos de clase ya había tenido que hacer alguno), siempre sorprende ver cómo algo que parece tan simple es a la vez tan complejo de programar.
Por otro lado, está la sección de "Configuración", la cual mostrará 1, 3 ó 4 pestañas depende del tipo de usuario que seamos. El usuario básico sólo podrá modificar sus propias preferencias, pudiendo cambiar su contraseña, su e-mail, el idioma en el que desea ver la página (algo de lo cual también estoy bastante orgulloso, aunque intentaré dejarlo aún mejor para la versión final), opciones de visionado de la página, e incluso borrar su propia cuenta.
Los administradores además podrán hacer gestión de usuarios y grupos, pudiendo borrar usuarios, promoverlos a administradores, crear, renombrar y borrar grupos y cambiar a usuarios de un grupo a otro. Finalmente, el super usuario también puede promover a otros usuarios a super usuario y añadir categorías y nuevos idiomas.
Por supuesto, el programa tiene muchas más características para que los usuarios puedan compartir archivos o carpetas unos con otros, campos que se autorellenan para darnos pistas de nombres de usuarios, (si vamos a mandarles un mensaje o a compartir un archivo), de grupos (idem) o de carpetas (si vamos a mover un archivo de una carpeta a otro), control a la hora de borrar un usuario, posibilidad de hacer una recuperación de contraseña usando el e-mail introducido al registrarse, etc.
Resumiendo, una aplicación de la que estoy muy orgulloso, por la que me llevé muchas alabanzas por parte del encargado del sistema (casi me sonrojo con la encuesta de evaluación que tuvo que rellenar el último día) y la cual, como digo, pienso mejorar para, con el tiempo, publicar como mi primer trabajo profesional. Ya recibiréis noticias.

viernes, junio 29, 2012

(Reseña de película) El Caballero Osscuro

A menos de un mes del estreno de la nueva película de la saga, termino de hacer mi repaso de las películas sobre Batman estrenadas en las dos últimas décadas. Esta última, titulada originalmente The Dark Knight, fue estrenada en 2008 tras el éxito de Batman Begins de Christopher Nolan, repitiendo por ello tanto el director como el reparto (salvo por Katie Holmes que fue sustituída por Maggie Gyllenhaal).
Un nuevo mafioso, Salvatore Maroni, ha tomado el relevo de Falcone como jefe del crimen organizado de Gotham City. Sin embargo, no es Batman, ni el ahora ascendido a detective Jim Gordon, ni el nuevo, estricto e idealista fiscal del distrito Harvey Dent los que le pondrán contra las cuerdas, sino un maniaco que se hace llamar el Joker que ha decidido sembrar el caos en la ciudad enemistándose con todo el mundo aunque controlando siempre la situación. El trío antes mencionado se aliará para intentar detener a ambos criminales, no sin pagar un alto precio.
En esta película, Nolan se arriesga a hacer algo que no hizo en la primera: introducir villanos que ya hubieran aparecido en las películas de Burton y Schumacher. Y es que tal vez la actuación de Tomy Lee Jones como Dos Caras en Batman Forever no fuera la más espectacular (aunque recordemos que a Harvey Dent también lo interpretó Billy Dee Williams en Batman), pero superar el Joker de Jack Nicholson era sin duda un reto a tener en cuenta. Sin embargo, tanto Nolan como el actor, Heath Ledger, hacen un trabajo estupendo con el personaje, de modo que todos lamentamos que el actor falleciera poco antes del estreno de la película, ya que no podrá repetir su papel en futuras entregas. Los demás actores también hacen un papel excelente, igual que ocurría con la primera entrega, pero Ledger destaca por las evidentes comparaciones.
La historia es una auténtica joya. A pesar de lo larga que es la película, no se vuelve pesada en ningún momento e incluso da pena que se acabe. Todas las tramas están muy bien llevadas y lo único que se llega a lamentar es lo poco que podemos disfrutar de Dos Caras una vez ha recibido su malformación, aunque por otro lado tiene completamente sentido y cuadra perfectamente dentro de la película. Además, el asesinato de cierto personaje, además de determinadas citas sacadas casi literalmente de The Killing Joke, ayuda a crear el antagonismo entre Batman y su archienemigo, algo que Burton sólo logró haciendo que "Jack Napier" (la identidad que le dio al Joker) sustituyera a Joe Chill como asesino de los padres de Bruce.
Los efectos especiales, como ocurría con la anterior (aunque olvidé mencionarlo) son también geniales, destacando sobre todo la malformación de Dos Caras que da bastante mal rollo. También destacar que, como en la película anterior, la referencia a distintos cómics del murciélago: al ya mencionado The Killing Joke (cuyas referencias abundan, sobre todo si sustituimos al Gordon del cómic con el Harvey Dent de la película) se le suman The Long Halloween o, tal vez menos notoria pero a tener en cuenta, A Death in the Family.
Otra película que nos hace amar a Christopher Nolan y que nos hace esperar que la última entrega, The Dark Knight Rises, sea bestial. Para que luego digan que segundas partes nunca fueron buenas.

jueves, junio 28, 2012

Cebollinazo Rock 2012

Una de las pocas iniciativas de hacer festivales con ambiente alternativo que se ha mantenido en el archipiélago canario es el festival conocido como el "Cebollinazo Rock". Desde su primera edición por allá por 2008, ha sido una cita obligatoria para muchos rockeros, punkys y miembros de otras tribus urbanas que habitan las islas. Tras haber visto pasar a grupos como Boikot, Barón Rojo o Soziedad Alkoholika, este año se verán en el municipio de Gáldar, como todos los años, las siguientes bandas:

-Broken Arm (Canarias)
-Metrabate (Canarias)
-Tronsky Trío (Canarias)
-Sin Moska (Canarias)
-Segismundo Toxicómano (País Vasco)
-Koma (Navarra)

Por 12 € podréis conseguir entrada anticipada en los puntos que podréis encontrar en la página web oficial del festival, y por 15 € la obtendréis en la propia entrada del recinto. El festival se llevará a cabo el próximo sábado día 30 de junio de 2012, abriendo sus puertas a las 18:30 y comenzando media hora más tarde. Yo, personalmente, no pienso perdérmelo. ¿Qué dicen ustedes?

miércoles, junio 27, 2012

(Reseña de cómic) The New 52: Action Comics #1-8

Ya he mencionado algunas veces la iniciativa de DC Comics de reiniciar todas sus series desde el agosto pasado, y tras haber reseñado las primeras tramas de Justice League y Batwoman, ahora le toca el turno a Action Comics, una de las series más emblemáticas de DC por ser la colección que en su día vió nacer a Superman y que desde entonces ha publicado ininterrumpidamente historias del personaje (de hecho, su numeración superaba los 900 números antes del reinicio). Como no podía ser de otra manera, el reinicio de Action Comics también nos trajo nuevas historias de Superman, teniendo como equipo creativo en estos primeros 8 números a Grant Morrison y Rags Morales además de algunos artistas invitados para algunas historias cortas al final de algunos números.
Esta serie nos lleva a las primeras hazañas de Superman, cuando todavía era temido más que amado en Metrópolis, trabajaba en el Daily Star y desconocía sus raíces kriptonianas. Sus acciones, un tanto violentas, para intentar llevar ante la justicia al mafioso Glen Glenmorgan provocan que el ejército busque la manera de detenerlo, por lo que contratan al científico Lex Luthor para ello. Tras un primer intento fallido de detenerlo, Luthor hace un pacto con una extraña entidad mientras somete al soldado John Corben a un experimento que lo convertirá en medio máquina, aunque todo se descontrolará y el superhéroe será el único capaz de detenerlo, sin sospechar que, en su base secreta, algo extraño está ocurriendo.
Lo voy a decir, y se me echarán muchos al cuello, pero lo voy a decir: no me gusta Grant Morrison. O sea, no, sus historias siempre son un lío demasiados complejas para comprender y para mí, sinceramente, eso no lo hacen un "guionista de calidad", sino lo contrario, es un guionista que no sabe manejar su historia y al final hace un caos. Y es lo que ocurre en esta trama. Los primeros cuatro números son bastante buenos, no me gusta cómo muestra a Luthor, pero es interesante ver cómo presenta al nuevo Superman (el cual, por cierto, no es tan "nuevo", ya que recuerda mucho al primer Superman creado por Joe Shuster y Jerry Siegel) y los elementos que incluye, haciendo guiños a los fans clásicos del personaje (la misma "rivalidad" entre los reporteros del Daily Star y del Daily Planet es una referencia a agradecer), pero luego se vuelve loco. Los quinto y sexto números no pintan para nada con el resto de la historia, están para rellenar e incluir algunos datos del personaje que, probablemente, no sabía cómo incluir de otro modo y, tal vez, para hacer una pequeña referencia a la otra colección del personaje. Pero es que esa trama, que dura esos dos números, es tan extraña que cuesta horrores entenderla (yo no he terminado de pillarla). Finalmente, los dos últimos números vuelven a la trama original y recuperamos un poco de coherencia. Pero, para mí, los números 5 y 6 deberían desaparecer por completo.
Por otro lado, el arte de Rags Morales es bastante bueno y no sólo nos permite reconocer bastante bien a los personajes, sino que les da un aspecto bastante acorde. El aspecto más juvenil de este Superman es adecuado con la supuesta edad que tiene en este cómic, y sobre todo me gusta cómo dibuja las posturas de los personajes. Eso sí, una vez más, no me gusta su Luthor: demasiado gordo.
Un reinicio del personaje que puede resultar interesante, pero que le falta centrarse y contar una buena historia en vez de intentar contar varias y dejarlas tan confusas, pero bueno, ese es el sello de Morrison.

martes, junio 26, 2012

Curso de desarrollo web, Parte XXXVIII: Código en archivos externos

¡Hola otra semana más! Sí, sé que sigo sin corregir el asunto de los post anteriores, pero prometo que acabaré haciéndolo... tarde o temprano. Podría poner cientos de excusas (y todas son verdad), pero también reconozco que me ha dado vagueza. Pero acabaré arreglándolo.
Bueno, recordaréis que, cuando comenzamos a estudiar JavaScript, les comenté que, al igual que ocurría con el CSS, existen varios modos de introducir JavaScript en nuestra página, no sólo con el método de la escritura directa mediante la etiqueta <script>, y que con el tiempo os los enseñaría. Pues bien, ese momento ha llegado y aquí estamos listos para aprender un segundo método. Aviso de que esta entrada va a ser corta, pero no por ello con poco contenido.
Este segundo método es increiblemente simple y es el de poner nuestro código en un archivo externo, en lugar de directamente en la página web. Para ello, crearemos un nuevo archivo con extensión "js" en el que incluiremos nuestro código. Como hasta ahora, no necesitaremos ningún programa especial para trabajar con este tipo de archivo, sino que el blog de notas (o cualquier editor de texto plano, como el Komodo Edit del que os hablé hace ya unos meses) nos valdrá.
Para este ejemplo vamos a crear un archivo llamado "pagina-principal.html" y otro llamado "javascript-externo.js". Ahora en el archivo "js" escribiremos lo siguiente:

alert("Ésto está escrito en un archivo externo.");

Recordad escribir sólo esa línea. Sin etiquetas <script> ni nada por el estilo. Sólo ese pequeño código. Si intentamos abrir el archivo "js" veremos que no tiene ningún resultado visible. De hecho, a menos que lo hayamos asociado con alguno de los editores que estamos usando, es muy probable que no nos deje abrirlo o nos pida que elijamos un programa para abrirlo. Así que ahora empieza la magia.
En el archivo "pagina-principal.html" haremos una página básica (ya sabéis, "doctype", "html", "head", "body"...) y, en el lugar donde normalmente habríamos puesto la etiqueta "script" (recordemos que podía ser tanto en el "head" como en el "body"), ahora incluiremos el siguiente código:

<script type="text/javascript" src="javascript-externo.js"></script>

Como véis, la etiqueta sigue siendo la etiqueta "script", aunque esta vez no tiene nada en su contenido, sino que le hemos añadido un nuevo atributo, el atributo "src", que ya habíamos usado en la etiqueta "img". ¿Qué resultado tendrá esto? Comprobémoslo: abramos la página "pagina-principal.html" y veamos su resultado.
¿Lo habéis hecho? ¿Qué ha ocurrido? En efecto, el código escrito en el archivo externo ha sido ejecutado como si lo hubiéramos escrito en el propio archivo HTML. Y tal vez os preguntéis: ¿de qué nos puede servir esto?
Igual que ocurría con el CSS, habrá veces en que necesitemos un mismo código que se ejecute en varias páginas. Sobre todo para incluir una misma función en distintas páginas. Por ejemplo, ¿recordáis la función  "esBisiesto()" que creamos la semana pasada? ¿No estaría bien poder usarla en varias páginas sin tener que estar escribiéndola una y otra vez? Pues sólo nos hace falta escribirla en un archivo externo y cargarla mediante el atributo "src" de la etiqueta "script".
Como anotación, debemos recordar que si en una etiqueta "script" le colocamos un atributo "src" NO podremos usar la misma etiqueta para introducir código nuevo. Por ejemplo:

<script type="text/javascript" src="javascript-externo.js">
alert("Ésto está escrito en el propio archivo.");
</script>

Este código estaría mal y, de hecho, el navegador ignorará las instrucciones escritas entre ambas etiquetas "script". Para que funcionara, debería ser escrito así:

<script type="text/javascript" src="javascript-externo.js"></script>
<script type="text/javascript">
alert("Ésto está escrito en el propio archivo.");
</script>

Este último código sí sería correcto.
Pues bien, por esta semana es todo. Tal vez parezca poco, pero prefiero que esto quede claro y que se queden rumiándolo esta semana antes que saturarles con más cosas. La semana que viene veremos el tercero de los métodos y nos meteremos en un tema bastante interesante: los eventos. Mientras tanto: ¡ejercicios!

EJERCICIO

Esta semana nuestro ejercicio consistirá en crear tres páginas webs que estén enlazadas entre ellas. En cada una de las páginas, el programa preguntará mediante "prompt":
¿Qué año es?
 ¿En qué año naciste?
¿Cual ha sido tu mejor año?
Una vez el usuario ha introducido un año, se mostrará por pantalla si el año fue bisiesto o no. La única pega es que la función "esBisiesto()" debe ir (como no) en un archivo externo.
Si queréis un reto aún mayor, tampoco se puede llamar a la función "esBisiesto()" desde los archivos "html". reduciendo a una línea el código JavaScript que puede haber en dichos archivos. Suerte con ello.

lunes, junio 25, 2012

Desentrañando... Blade

Tara Brooks era una prostituta del Soho que tuvo la mala suerte de, cuando se puso de parto de su primer hijo, se topó con el vampiro Deacon Frost, quien, haciéndose pasar por médico, se alimentó y mató a la mujer, aunque no logró acabar con el pequeño, quien, por las extrañas circunstancias de su nacimiento, heredó algunas de las habilidades de los vampiros.
El pequeño Eric Brooks, que más tarde sería conocido como Blade, creció en el burdel donde trabajaba su madre, hasta que se enfrentó a unos vampiros descubriendo sus habilidades y conociendo al cazavampiros Jamal Afari, quien lo instruiría en dicha profesión, a partir de lo cual empezaría a aliarse con otros cazavampiros, pero pronto descubriría que sus aliados, mucho más frágiles que él en su mayoría, caerían fácilmente víctima de los vampiros. Incluso el mismo Afari sería asesinado por Drácula, quien desde entonces se convertiría en uno de los archienemigos de Blade.
A lo largo de su carrera, Blade no sólo se ha aliado con otros cazavampiros sino también con superhéroes, como Spiderman o el Doctor Extraño, aunque siempre con el objetivo de cazar a algún vampiro, entre otro el propio Frost, a quien Blade consiguió asesinar vengando a su madre, sólo para que tiempo más tarde regresara de entre los muertos.
Otro a veces aliado a veces enemigo de Blade es el vampiro no-mágico Morbius, quien en una ocasión, bajo el control mental del vampiro Ulysses Sojourner, mordió a Blade, siendo el único mordisco de vampiro que ha tenido algún efecto en Blade (debido a la especial condición de Morbius), otorgándole nuevas habilidades y, al mismo tiempo, librándole de algunas debilidades.

domingo, junio 24, 2012

The CubesPaper, Número XXXIII (24/06/2012)

Semana bastante pobre en noticias, al menos las que he podido localizar yo. Pero bueno, algo es algo, así que aquí van:

George Takei aparecerá en los cómics de Archie
El actor famoso por su papel en Star Trek aparecerá en la serie Kevin Keller.
Más información: ComicsAlliance

Retrasada la película de las TMNT
La producción de la película ha sido momentáneamente suspendida.
Más información: ComicsAlliance

sábado, junio 23, 2012

Guiándoles en... Berlín

En la Puerta de Brandenburgo
Como ya muchos sabréis, los dos últimos meses he estado residiendo en Berlín, capital de Alemania, mientras hacia unas prácticas de empresa como final del ciclo formativo que estaba realizando (Desarrollo de Aplicaciones Informáticas). Como durante estos dos meses, por limitaciones del portátil (bastante viejo) que me llevé para allí, no pude mostrar fotos, he decidido hoy hacer una guía-resumen de lo que ví allí para, también de paso, dar pistas a los que decidan ir a visitar la ciudad conocida por el muro que la dividió.
  • Recién llegados: el transporte
El edifico del Reichstag
Acabais de llegar a Berlín, ¿qué hacer? Hayáis llegado como hayáis llegado (por avión a alguno de los aeropuertos de la ciudad, o por tren o bus a cualquiera de las estaciones), todo está muy bien comunicado por tren, metro o bus. Ahora bien, antes de montaros en cualquier transporte, deberéis buscar una máquina de billetes, las cuales se pueden poner en español, para comprar el vuestro. Tenéis diversas opciones para comprar billetes que durarán desde dos horas hasta un mes, pasando por uno, dos o siete días (y seguramente alguna otra opción más). Señalar el hecho de que todos los transportes de la empresa BVG, lo cual significa todos los transportes públicos que funcionen dentro de Berlín (metros, buses, tranvías y trenes no interregionales), funcionan con los mismos billetes.
El Monumento al Holocausto
También es importante tener en cuenta para comprar vuestro billete que Berlín está dividido en tres zonas, clasificadas como A, B y C, en forma de "círculos concéntricos". El centro de Berlín es la zona A, lo rodea la zona B como un anillo intermedio y finalmente, las afueras de la ciudad conforman la zona C. Probablemente a lo largo de vuestra estancia sólo necesitéis billetes de las zonas A y B (a menos que hayáis llegado al aeropuerto de Brandenburgo, que a día de hoy aún no está abierto pero que debería estarlo en menos de un año, y que se encuentra en zona C). De hecho, salvo para visitas puntuales como el campo de concentración de Sachsenhausen o Potsdam, no necesitaréis billete de zona C para nada, de modo que recomendaría comprar billetes únicamente de zonas A y B. Pero, como les digo, todo dependerá de cómo queráis montaros el viaje (a lo mejor habéis ido exclusivamente a ver el campo de concentración, vete tú a saber).
La Topografía del Terror
Existen también algunos descuentos para los menores de 14 años y, en caso de que hayáis ido a estudiar a Berlín, cuando tengáis un carnet que os acredite como estudiantes de una institución berlinense podréis ir a una de las tiendas de la BVG para pediros un carnet de estudiante, con lo cual el billete mensual os saldrá muy (mucho) económico (bajando de los 70 a los 27 €), con lo que os recomiendo estar pendientes a esta opción.
Finalmente, la mayoría de los billetes deben de ser picados en algunas máquinas que encontraréis en las estaciones de metro o en el interior de algunos buses, así que no os depistéis y hacedlo si la máquina de compra de billetes así os lo indica (si la habéis puesto en español os dirá algo así como "Deprecie el ticket antes de iniciar el viaje"). La multa por no tener billete o por llevar el billete sin picar es de 40 €, y los revisores no son raros de ver, así que no recomiendo intentar colarse.
  • ¿Qué ver?
Checkpoint Charlie
Bien, ya hemos podido llegar a la ciudad, probablemente antes de nada queráis pasar por vuestro hotel o donde sea que os vayáis a quedar a lo largo de vuestra estancia, pero que probablemente sea en zona A o B. Después, supongo que querrán ir a hacer algo de turismo. Berlín es una ciudad enorme y en cada esquina se esconde una historia, por lo que simplemente con salir a vagar desde donde sea que estéis alojados probablemente encontréis un montón de cosas interesantes, pero supongo que les parecerá más interesante ir un poco "a tiro hecho" y visitar aquellos lugares que puedan ser más interesantes. Por ello, a continuación les voy a dejar una lista de lugares interesantes en Berlín, ordenados en el orden en que yo creo que deberían darle "prioridad de visita". Pero como ustedes lo vean. Allá va:
  • Mitte: En alemán, "Mitte" significa "medio" o "centro", así que el distrito de Mitte, uno de los 12 que forman la ciudad, es, evidentemente, el central, y por lo tanto, el que más cosas interesantes tendrán por ver. Por supuesto, decirles que visiten "Mitte" es muy vago, pero es un punto de partida interesante para lo que puede ser todo un día de paseo. Ahora unas cuantas pistas de cosas interesantes por Mitte:
      Hombres Molécula en el Spree
    • Brandenburg Tor: Asumidlo: si no habéis visitado la Puerta de Brandenburgo, no habéis estado en Berlín, tan simple como eso. Incluso los cristales de los metros están decorados con la imagen de este monumento, y es que casi que es el centro absoluto de la ciudad y que ha visto casi todos los acontecimientos importantes de la ciudad. Además, al cruzar la puerta (en dirección "de entrada", o sea, viendo a la Cuádriga de frente) accederéis al parque de Tiergarten, un precioso parque con unos cuantos monumentos que merecen la pena ver, como la Columna de la Victoria (Siegessäule) o el Monumento Soviético de Tiergarten.
    • Reichstag: En los alrededores de Tiergarten podréis encontrar el actual Parlamento alemán (Bundestag) en el edificio del Reichstag, característico por su cúpula de cristal, un clásico del skyline de Berlín.
    • Monumento al Holocausto: Una interesante plaza llena de bloques que, en su exterior, parecen estar todos a más o menos la misma altura, pero una vez nos adentramos en ella, vemos cómo el suelo cada vez va descendiendo más a medida que nos aproximamos al centro de la plaza, con lo que pronto los bloques, que en su exterior nos llegarían a la rodilla, ahora nos sacan un metro de altura. Esta simple pero impresionante construcción intenta recrear la ansiedad que los judíos sentían durante la época más oscura de Alemania.
    • Checkpoint Charlie: El muro de Berlín que dividía toda la ciudad tenía en realidad pequeños pasajes, todos controlados por un punto de control (o checkpoint). El Checkpoint Charlie, uno de los que unían la zona soviética con la americana, todavía sigue en pie y con un par de actores disfrazados de los soldados de ambas naciones para hacerse fotos con los turistas por 2 € (personalmente, me parece una estafa).
    • Topographie des Terrors: El siglo XX no fue un siglo agradable para Berlín, de modo que "Topografía del Terror" es un nombre que viene al pelo al repaso que, en los cimientos de un fragmento aún en pie del famoso Muro de Berlín, se le da a la historia de la ciudad. Muy interesante y encima escrito en inglés (además de alemán y, si no recuerdo mal, ruso), aunque probablemente necesitaréis todo un día si queréis leerlo todo.
    • Sony Center: Si ya estáis un poco abrumados por la clase de lugares que acabo de ir mencionando, el Sony Center de Potsdamer Platz es una buena opción para relajarse. Construído en la localización del antiguo "Grand Hotel Esplanade" y característico por la cantidad de eventos internacionales que se llevan a cabo en él, el "Sony Center" es uno de los centros de ocio más importantes de Berlín. Además, en su "CineStar Event" podréis disfrutar de los últimos estrenos en versión original, así que aunque no sepáis alemán, no tenéis excusa para perderos las películas que queráis ver. Como anotación, la descarga ilegal en Alemania se penaliza con multas de 1000 €, así que ir al cine no es tan mala idea...
    • Alexanderplatz: A lo largo de todo el día paseando por Mitte os fijaréis en una enorme torre de la radio que podréis ver casi desde cualquier punto (de hecho, desde la mayoría de Berlín se puede ver dicha torre). Dicha torre es la Fernsehturm (Torre de la Televisión), la estructura más alta de toda Alemania con 368 metros, aunque sólo se puede subir, como máximo, hasta los 207. Aunque tengáis vértigo (como yo), recomiendo subir: son sólo 11 € y desde arriba tendréis una vista de toda la ciudad.

East Side Gallery
  • East Side Gallery: Ya alejándonos de Mitte, si nos bajamos en la estación Ostbahnhof podremos encontrarnos una larga sección del muro aún en pie y toda graffiteada. La mayoría de los graffitis tienen unas simbologías bastante interesantes, así que recomiendo no dejar de visitarlo. Además, al finalizar el muro hay un puente en cuyo intermedio, si vais de noche, podréis ver unos simpáticos leds que van jugando al "piedra, papel, tijeras" representando los dos lados del muro.
  • Treptower Park: Si seguís el río una vez terminéis el East Side Gallery podréis encontraros a los "Hombres Molécula", una enorme estatua que se ha construído en distintas partes del muro, una de ellas, evidentemente, Berlín. Eso será indicación de que estamos cerca de Treptower Park, un enorme y precioso parque dentro del cual podréis encontrar otro Monumento Soviético, el más grande de todos los que hay en Berlín.
  • Campo de Concentración de Sachsenhausen: Situado en el norte de Berlín, para visitar este terrible lugar deberéis comprar un billete de zona C, aunque se compensa con que la entrada es completamente gratuita, e incluso hay tours en español gratuitos. Probablemente vuestra visita dure entre 5 ó 6 horas (o incluso más si os lo tomáis con paciencia) así que si queréis visitar este lugar reservad todo un día para él. Eso sí, preparaos para descubrir lo horrible que puede llegar a ser la humanidad.
  • Museo de Historia Natural / Großplanetarium / Tierpark / ...: Si os gusta la ciencia y/o la naturaleza, en Berlín tenéis una gran oferta de lugares a los que asistir. En primer lugar, Berlín tiene dos grandes zoológicos (Tierpark y Zoologischen Garten) además de poder disfrutar de animales tanto actuales como extintos en el museo de historia natural (Museum für Naturkunde). Además, si os gusta la astronomía, podréis visitar el Großplanetarium aunque, desgraciadamente, todas las funciones son en alemán.
  • Museuminsel: Aunque no visité ninguno de estos museos por falta de tiempo, además de que las entradas son algo caras (rondando los 15 € con descuento de estudiante), la "Isla de los Museos" (Museuminsel) se caracteriza por... precisamente eso... ser una isla en medio del Spree en la cual hay varios museos. Destacar la puerta de Ishtar en el Museo de Pérgamo, que se han traído piedra por piedra desde Babilonia.
  • Potsdam: Finalmente, si tenéis uno o varios días sobrantes, la ciudad vecina de Potsdam (a la cual podéis acceder con un billete de zona C, el cual también os servirá para el transporte de allí) es una opción interesante, aunque para hablar de Potsdam necesitaría todo un artículo entero propio.

Entrada al Campo de Concentración de Sachsenhausen
Berlín tiene muchos más sitios interesantes, como es evidente, pero esos son los lugares que más interesantes me parecieron, y que en una estancia corta en Berlín, probablemente no podáis ver mucho más que eso.
  • ¿Qué comer?
Alemania no se caracteriza por su comida, y de hecho salvo las Currywurst (salchichas con curry), no conocí ninguna otra comida típica. Eso sí, no sólo podréis disfrutar de todo tipo de restaurantes de todas las nacionalidades, sino que también encontraréis restaurantes de comida rápida en cada esquina. Eso sí, no podéis iros sin probar una de las Currywurst que venden los vendedores ambulantes o ir a un kebab, ya que Berlín está plagado de ellos. Si tenéis posibilidad de cocinar o, al menos, tenéis un horno, supermercados como el Lidl o el Aldi se pueden encontrar en casi todos los puntos de la ciudad, son baratísimos y se especializan en precocinados, así que no tenéis excusa para no comer.
Yo junto a un braquiosaurio en el Museo
de Historia Natural
Por otro lado, lo típico de Alemania es la cerveza, y os chocará por el contraste con España, pero allí es perfectamente normal ver a gente con una cerveza en la mano por la calle o en los transportes públicos (menos en los buses, ahí está prohibido) a cualquier hora del día. Tenéis una gran variedad de cervezas para escoger, por lo general barata y muy buena, y recordad que al entregar el envase de casi cualquier bebida te devuelven parte del precio, así que, ¡a reciclar se ha dicho!
  • ¿Por dónde salir?
Como capital que es, Berlín consta con una gran cantidad de lugares interesantes donde salir de fiesta, y se mueven muchos tipos de ambiente. Los locales suelen abrir temprano por la tarde (el que más tarde abre a las 10 de la noche) y suelen tener el concepto de Open End, con lo cual normalmente mientras haya ambiente la fiesta continúa. Eso sí, las entradas de la mayoría de los locales tienen una pinta un tanto extraña, pero recomiendo que no les eche para atrás, ya que no suele haber problemas (en general, la ciudad es muy tranquila).
Locales interesantes a los que fuí incluyen:
Frente al Palacio de Sanssouci en Potsdam
  • K17: Si os gusta la música metal, gótica o alternativa en general, y preferís estar bailando las canciones a estar sentados en una mesa chupando birra, este es vuestro club. El K17 es un complejo de discotecas con cinco salas (una para conciertos) y dos jardines situado en el distrito de Friedrichshain. Para llegar a él sólo tendréis que llegar a la estación de S-Bahn de Frankfurter Allee y, desde su entrada, caminar por la calle que hay recto hasta que encontréis la calle Pettenkoferstraße. A partir de ahí, girais a la derecha entrando en esa calle y subiréis una cuesta durante unos 5-10 minutos hasta que encontréis un enorme edificio que dirá "K17 - Der Club". Entrad en el callejón que veréis a dicha altura (es el número 17 de la calle, de ahí el nombre del local) y acabaréis encontrando al portero que, tras el registro de rigor, os dejará entrar. Como anotación, las discotecas están a mano derecha, a la izquierda es la sala de conciertos, para ahorraros el intentar entrar en el lugar equivocado (como me pasó a mí). La entrada es gratuita antes de las 11, luego pasa a ser de 6 €.
  • Matrix: Bajo la estación del U-Bahn de Warschauer Straße encontraréis un local típico de Berlín, ya que es muy normal en esa ciudad convertir antiguos túneles debajo de los puentes de las vías del tren en discotecas. En este caso, se trata de la Matrix, una discoteca con tres ambientes, dos de ellos más electrónicos y uno de ellos completamente aleatorio donde podréis escuchar desde Aqua a Bon Jovi pasando por King Africa o Britney Spears... Antes de las 12, la entrada es gratuita, luego son 6 € también en este caso.
  • Green Mango Karaokebar: Si os gusta cantar en público, el Green Mango es una opción bastante interesante. Los djs son de lo más amables y te hacen sentir bastante "en casa", y tienen una gran variedad de canciones en muchos idiomas (entre ellos, español). para llegar al local deberéis encontrar la estación Bülowstraße y buscar el número 56. Tendréis que entrar en un aparcamiento y dentro de él habrá un edificio donde encontraréis un gimnasio y este bar. Una vez más, un exterior bastante extraño pero que no tiene nada que ver con el interior. Entre semana, la entrada es gratuita, los findes cuesta 4 €.
  • Rock und Wikingerbar / Halford: Dos locales de música metal en la zona de Samariterstraße, el primero en Dolziger Straße 24 y el segundo en Dircksen Straße 99. Son el contrario del K17, son bares para sentarse a hablar o ponerse a jugar al billar, y donde la música no suele estar muy alta. Pero para salir a tomarse algo tranquilo, está genial, sobre todo porque la entrada siempre es gratuita.
El Monumento Soviético de Treptower Park
Y eso es un poco mi guía de Berlín. Hay mil cosas que podrían añadirse, esto no plantea ser una guía de viaje completa, todo lo contrario, son mis recomendaciones de a dónde asistir, ya que en muchas ocasiones las guías de viaje dan mucha información, pero no dan consejos de qué visitar primero o a qué darle prioridad. Espero que les sea útil.
La Torre de la Televisión de Berlín

viernes, junio 22, 2012

Trailer the "Dredd"

A pesar de haber siempre pertenecido a editoriales poco conocidas, el Juez Dredd no es un completo desconocido para el público en general, sobre todo gracias a la película protagonizada por Silvester Stallone que salió hará ya más de quince años (y que aún no he visto). Lo cierto es que este septiembre es posible que la popularidad del personaje vuelva gracias a la nueva película que se lanzará, esta vez protagonizada por Karl Urban, y de la que hoy les traigo el trailer. Veámoslo:
La verdad, he de reconocer que no conozco mucho del personaje, pero por lo que veo en este trailer, me da la impresión de que la película va a prestar más atención a la historia que al propio personaje, lo cual no me parece la mejor de las opciones en una película de este género. Además, el actor no me termina de cuadrar en ese papel. Pero bueno, me informaré más y leeré sobre el personaje para poder juzgar correctamente.

jueves, junio 21, 2012

(Reseña de película) Batman: Gotham Knight

Cuando reseñaba las películas que formaban la colección llamada las "Películas Animadas Originales del Universo DC" me salté la tercera de estas películas, publicada en 2008 justo una semana antes del estreno de The Dark Knight, la segunda de las películas de Christopher Nolan sobre el personaje de Batman, ya que, en teoría, era una especie de "introducción" a dicha película (aunque luego nos han revelado que no se debe considerar como parte de las películas).
La película consta de seis pequeños episodios de animación, cada uno desarrollado por un equipo distinto, en el que se nos muestran pequeñas aventuras del Caballero Oscuro, sobre todo envuelto en la guerra de bandas entre Sal Maroni (quien será uno de los antagonistas de la siguiente película) y otro mafioso conocido simplemente como "el Ruso". Pero, aparte de ellos, podemos disfrutar de la aparición de enemigos como el Espantapájaros, el Cocodrilo Asesino o Deadshot.
Las historias son bastante entretenidas y, en su mayoría, curiosas, sobre todo la primera, Have I Got a Story for You ("Tengo una historia que contarte", traduciendo no literalmente), en la que unos niños cuentan cómo se han topado con el Cruzado de la Capa y cada uno muestra sus impresiones. Pero ninguna de las mini-historias es para nada descartable.
La animación, la mayoría usando técnicas bastante alternativas, es bastante agradable a la vista, además de que la naturaleza casi experimental de la animación es bastante acorde al personaje y sus historias, con lo que ayuda a meterse en la historia.
Concluyendo, una película curiosa para echarle un vistazo, sobre todo ahora que estamos impacientes con la llegada de la última película en la trilogía Nolan. Lástima que se le haya dado tan "poca" publicidad.

miércoles, junio 20, 2012

(Reseña de cómic) The Amazing Spider-Man: One More Day

Algo a lo que estamos acostumbrados los lectores de cómics es al llamado retcon, que consiste en cambios retroactivos en historias de nuestros personajes: un guionista cambia un detalle del pasado de un personaje, un personaje que estaba muerto de repente aparece revelando que no era así... A lo que no estamos tan acostumbrados (aunque a veces pasa) es a que los personajes sean conscientes de esos retcon, aunque sea por un corto período (véase la famosa Crisis en Tierras Infinitas de DC Comics). Y esto fue lo que hizo hacer a J. Michael Straczynski su editor (y dibujante de la saga) Joe Quesada en los números 544 y 545 de The Amazing Spider-Man, 24 de Friendly Neighborhood Spider-Man y 41 de The Sensational Spider-Man en la saga conocida como One More Day.
Unos meses después de que Spiderman haya revelado su identidad secreta durante los eventos de Civil War, un francotirador contratado por Kingpin falla en su intento de acabar con el arácnido, disparando a su tía May en su lugar. El grave estado de la anciana y el fuerte sentimiento de culpabilidad de Peter le hacen buscar todo tipo de ayuda, sea científica o mística, para salvarla. Sin embargo, la solución vendrá de la mano de un terrible enemigo.
Aunque esta saga sea una excusa para hacer el retcon que eliminaría de la ecuación el matrimonio Peter-MJ y la identidad pública del trepamuros, hay que reconocer que Straczynski dio la talla para hacer un trabajo bastante bueno en una saga en la que lo que cuentan son unos diálogos muy fuertes. No se extiende más de lo que debe y deja bastante claro que Spiderman ha acabado muy desesperado para hacer un "pacto con el diablo" (literalmente) al final de la saga, respondiendo todas las dudas que se nos podrían haber quedado de "¿y por qué no hizo...?", todo con buen ritmo y adaptando al personaje a la situación en la que se encuentra.
Por su lado, el dibujo de Quesada es bastante bueno, aunque el hecho de que haya sido el "culpable" de los eventos ocurridos en esta saga hace que todos, quien más quien menos, le odiemos un poquito.
Una saga curiosa que no nos da el resultado que hubiéramos querido pero que es interesante de mirar. Eso sí, todos esperamos que, tarde o temprano, se "retconee el retcon" y volvamos a tener a Peter y MJ como pareja (no sé si a estas alturas ya ha ocurrido).

martes, junio 19, 2012

Curso de desarrollo web, Parte XXXVII: Las funciones

¡Bien! Aquí estamos, publicando el curso desde España de nuevo. Quien sea asíduo del blog habrá comprobado que aún la cosa está un poco caótica, ¡pero es que no estoy teniendo tiempo para casi nada! Aún así, aquí sigo al pie del cañón, sólo pido un poco de paciencia para arreglar los post anteriores y dejarlos correctamente. Pero, de momento, seguimos adelante con el curso de desarrollo web.
Vamos a tomar un caso hipotético. Recordaremos que hace unas semanas uno de los ejercicios consistía en crear una pequeña aplicación que descubriera si el año introducido era bisiesto o no. Aunque en su día no publiqué la resolución, sería algo como esto:
var anio = prompt("Introduzca un año:");

if((anio % 4 == 0 && anio % 100 != 0) || anio % 400 == 0)
{
document.write("Es bisiesto.");
}
else
{
document.write("No es bisiesto.");
}

Bueno, imaginemos ahora que nos vemos en la tesitura de que queremos usar en muchas ocasiones a lo largo de nuestra aplicación este código. ¿Qué hacemos? ¿Repetimos el código en cada ocasión? La verdad es que sería bastante latoso y, incluso aunque copypasteemos una y otra vez, nos quedaría un código enorme, y una de las cosas que intentaremos en nuestros programas es que los programas no se vean muy enrevesados. Entonces, ¿qué podemos hacer para no tener que estar repitiendo el código una y otra vez? La respuesta es la siguiente: funciones.
A lo largo de las anteriores entregas hemos ido hablando de distintas funciones y métodos que tiene el JavaScript, algunos como el alert o el prompt completamente independientes (funciones), y otros como el toString o el indexOf que venían acompañando a un objeto (métodos). Hoy vamos a aprender a hacer nuestras funciones personalizadas.
Para crear una función, primero tenemos que escribir su signatura. Para ello, escribiremos por ejemplo:

function esBisiesto(year)

Esas línea es la "signatura" de la función. En primer lugar viene la palabra reservada "function" que indica que vamos a empezar a escribir una función. Le sigue el nombre de la función, el cual, como podéis ver, puede ser cualquiera que se nos ocurre. Finalmente, entre paréntesis, indicaremos el número de parámetros que necesita la función que se le pase y unos nombres para identificarlos dentro de la función. De este modo, dentro de la función podremos usar el parámetro "year" como si fuera una variable, ya que se supone que, cuando llamemos a la función, le daremos un valor a "year".
Cabe destacar que, igual que ocurría con las funciones y métodos que ya hemos visto, las funciones personalizadas pueden tener más de un parámetro. Por ejemplo, podríamos tener:

function esBisiesto(year, month)

No tendría mucho sentido, ya que no necesitamos el mes para descubrir si un año es bisiesto, pero lo que quiero decir es que, con esa signatura, podremos usar dentro de la función tanto el valor de "year" como el valor de "month".
En segundo lugar, escribiremos el cuerpo de la función, que podrá ser algo así:

function esBisiesto(year)
{
   if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
   {
       return true;
    }
    else
    {
         return false;
    }
}

Vemos en primer lugar que, como ya había explicado con anterioridad, el usar espacios o tabuladores para ordenar nuestro código puede ser muy útil, ya que ahí ya vemos llaves "encadenadas" que nos pueden dar bastantes quebraderos de cabeza si no ordenamos el código.
En segundo lugar quiero que se fijen cómo, tras poner la signatura y abrir la llave que englobará la función completa, empezamos a usar el parámetro "year" como una variable.
Finalmente, depende de cual de las opciones se den, usamos la palabra reservada return para devolver un valor, en este caso un booleano, aunque podríamos haber devuelto un entero, una String o incluso un array si hubiéramos querido. Además, si incluímos la palabra return sin ningún valor detrás, sino seguido ded un punto y coma (return;), la función se acabará abruptamente sin devolver ningún resultado, algo que nos puede interesar en alguna ocasión.
De este modo, el código de arriba podría resumirse en el siguiente:


var anio = prompt("Introduzca un año:");


var check = esBisiesto(anio);

if(check)
{
document.write("Es bisiesto.");
}
else
{
document.write("No es bisiesto.");
}


Vemos cómo en la variable "check" recogemos el valor que devolverá la función "esBisiesto" cuando le pasamos como parámetro la variable "anio" (que, al entrar en la función, se convertiría en "year" en su interior). Pero también podríamos hacerlo más simple, así:


var anio = prompt("Introduzca un año:");

if(esBisiesto(anio))
{
document.write("Es bisiesto.");
}
else
{
document.write("No es bisiesto.");
}


No necesitamos ni siquiera guardar el valor en una variable, sino que podemos evaluarlo según salga de la función.
Y tal vez os estéis preguntando, ¿y esta función dónde estará en este código? Pues podría ser perfectamente así:


<script type="text/javascript">
var anio = prompt("Introduzca un año:");

if(esBisiesto(anio))
{
document.write("Es bisiesto.");
}
else
{
document.write("No es bisiesto.");
}



function esBisiesto(year)
{
   if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
   {
       return true;
    }
    else
    {
         return false;
    }
}
</script>


Cuando el navegador se encuentra la palabra reservada "function" ignora su interior y no lo ejecuta a menos que encuentre en algún lugar del documento una "llamada" a esa función (como el "esBisiesto(anio)" que tenemos ahí). Incluso la función, como vemos aquí, puede estar después de su llamada, ya que el navegador, al encontrarse con una llamada a la función, buscará por todo el documento dónde está dicha función para poder ejecutarla (y fallará en caso de no encontrarla).
Finalmente, dejar claro que las funciones no tienen por qué devolver algo siempre (o sea, usar la palabra "return"), al menos no en JavaScript, de modo que este código podría haber sido tan simple como:


<script type="text/javascript">
var anio = prompt("Introduzca un año:");

esBisiesto(anio);



function esBisiesto(year)
{
   if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
   {
       document.write("Es bisiesto.");
    }
    else
    {
         document.write("No es bisiesto.");
    }
}
</script>


En este código, "esBisiesto" lo que hace es escribir en pantalla si un código es bisiesto o no, dependiendo del valor que se le pase por parámetro. La función no devuelve un valor sino que es directamente ella la que escribe en pantalla. En ocasiones nos será más útil usar un método u otro, será cuestión del usuario decidirlo. Otra manera de conseguir el mismo resultado podría ser:


<script type="text/javascript">
var anio = prompt("Introduzca un año:");

document.write(esBisiesto(anio));



function esBisiesto(year)
{
   if((year % 4 == 0 && year % 100 != 0) || year % 400 == 0)
   {
       return "Es bisiesto.";
    }
    else
    {
         return "No es bisiesto.";
    }
}
</script>


Tal como dije, con "return" se puede devolver cualquier tipo de valor, no sólo booleanos, así que en esta opción, al devolver un String con el resultado que queremos, simplemente le diremos que escriba en pantalla el valor resultante de la función.
Y, de momento, esto es todo sobre las funciones. Aunque puedan parecer un poco liosas, os aseguro que os será más que útiles cuando empecéis a programar en serio.

EJERCICIO


Esta semana nuestro ejercicio será, como no podía ser de otro modo, programar una función. Cuando un usuario introduzca un nombre en nuestra página, llamaremos a una función que cambiará todas las letras de mayúsculas a minúsculas o viceversa. De este modo, "Hola" debería convertirse en "hOLA" y "Me llamo Eme" debería pasar a ser "mE LLAMO eME". Finalmente mostraremos por pantalla el resultado de la función.

Y eso es todo por esta semana. A ver si empiezo a publicar soluciones a lo largo de esta semana. ¡Ya les iré contando!

lunes, junio 18, 2012

Desentrañando... La Cosa del Pantano

Alec Holland era un científico que trabajaba en una fórmula bio-restaurativa capaz de convertir un desierto en un bosque, hasta que, en un intento de sabotaje industrial, se vio envuelto en productos químicos y hundido en un pantano, de donde resurgió como la criatura conocida como la Cosa del Pantano. Desde entonces, mientras intenta buscar la manera de volver a ser humano, la Cosa del Pantano se ha enfrentado a muchos enemigos como el Hombre Florónico o su archi-enemigo Anton Arcane, con cuya sobrina, Abigail, ha mantenido una muy estrecha relación la criatura.
Con el tiempo, la Cosa del Pantano descubriría que Alec Holland murió en el pantano, mientras que su conciencia se unió a la vegetación del pantano dándole vida a él. De hecho, él era sólo una más de tantas Cosas del Pantano que han existido hasta la historia, todas miembros del "Parlamento de los Árboles", también conocido como lo "Verde".
Desde entonces, comunmente ayudado por sus pocos amigos (Abigail, John Constantine o su propia hija, Tefé Holland, quien también ha demostrado poderes relacionados con la naturaleza), ha adquirido distintas habilidades hasta el punto de llegar en una ocasión a convertirse en amo y señor de todas las fuerzas elementales.
Sin embargo, el fin de esta Cosa del Pantano llegaría a su fin cuando absorbiera la conciencia del líder de los Linternas Negros, Nekron, y una nueva Cosa del Pantano, "construida" de acuerdo al cuerpo de Alec Holland, fuera creada por distintos héroes para detenerlo, convirtiéndose en la nueva Cosa del Pantano, y, probablemente, en la Cosa del Pantano definitiva.

domingo, junio 17, 2012

Tercera interrupción de The CubesPaper

Sintiéndolo mucho, como saben, esta semana ha sido muy ajetreada entre que he vuelto de Alemania y demás, así que no he tenido tiempo de recolectar noticias y preparárselas para este domingo. ¡Pero tranquilos! Esta semana la cosa vuelve a la normalidad por completo, ahora que estoy de nuevo en la isla.

sábado, junio 16, 2012

Un Cubo en Alemania, Semana X

Y llegamos al último de los episodios de "Un Cubo en Alemania", sobre todo porque esto lo estoy escribiendo ya desde mi ciudad natal, las Palmas, a la que llegué ayer a las 17:30. La experiencia ha sido muy enriquecedora y estoy deseando volver a esa magnífica ciudad. Pero bueno, ahora veamos lo que he hecho esta última semana.
En primer lugar, por supuesto, terminé de trabajar, ya entregué el proyecto completo (un programa llamado EasyFiles Mirror, registrado bajo licencia Creative Commons, del que tal vez tengáis noticias en un tiempo) recibiendo múltiples alabanzas del "cliente" del proyecto (lo llamo así ya que no era mi tutor directo, aunque sí que era uno de los encargados del servicio técnico de la universidad que necesitaba un programa y a mí fue a quien me mandaron la tarea de desarrollarlo). Desgraciadamente, no tuve tanta suerte en la búsqueda de empleo (para la cual tuve tiempo muy limitado). Aún así, no pierdo la esperanza.
Turismo también aproveché para hacer esta última semana. Esos últimos días conocí el Monumento Soviético de Treptower Park, además del propio parque en sí (que no era lo que yo había creído la primera vez que había estado en esa zona, sino un parque mucho mejor). Además, tuve la ocasión de subir a la Torre de la Televisión (Fernsehturm) de Berlín, 203 metros sobre el nivel de la ciudad, pudiendo contemplar la ciudad al completo. Aunque, claro, mi vértigo y el hecho de que, aunque levemente, la torre se zarandeara un poco, no fueron agradables, auqnue la experiencia es muy recomendable y no me arrepiento de haber subido allí arriba. Eso sí, ¡me lo pensaría antes de volver a hacerlo!
Aparte de todo eso, el último día tuve un ajetreado viaje teniendo que pasar por Bruselas antes de llegar a Madrid y finalmente poner los pies sobre territorio canario de nuevo. Ya anoche estuve saludando a unos cuantos y esta noche seguiré en mi recorrido para volver a ver a todo el mundo, a los que he de reconocer he echado bastante de menos. La semana que viene, de todos modos, escribiré un post donde resumiré lo más interesante de la ciudad y, por fin, mostraré algunas fotos del viaje. ¡Espero que les guste!

viernes, junio 15, 2012

Cerrado por descanso de personal

Pues eso, que acabo de llegar de tierras germanas sin casi haber dormido y no está hoy la cosa para hacer un post... Pero ya mañana volvemos a la programación habitual.

jueves, junio 14, 2012

Jon Lajoie - F**k Everything

El comediante canadiense Jon Lajoie es, probablemente, uno de los comediantes más irreverentes de la actualidad, teniendo respeto por poco o nada, lo cual demuestra en sus vídeos en los que puede pasar de hacer un comercial de teletienda pasando por vídeos de "concienciación" hasta videoclips. Este último es el caso del vídeo que les muestro en este post, F**k Everything ("Que le j***n a todo"), una divertida parodia de la mayoría de los raperos:

Yo others rappers claim to not give a fuck
Well step aside bitches 'cause I give the lowest amount of fuck humanly possible
WHAT!?


I don't give a fuck
About anything fuck everyone and fuck everything what
I don't give a fuck
I literally don't give a fuck about anything


I don't give fuck about motherfucking anything
People care about shit, I say fuck everything
Fuck you, fuck me, fuck the sky, fuck trees, fuck the sun
I don't need heat or vitamin D


And fuck toasters I don't need to cook my bread
And fuck coasters I use a little plate instead
And fuck roosters with your useless cock-a-doodle-doo
We invented alarm clocks we no longer need you


Don't give a fuck about chairs I prefer to stand
And fuck air conditioners I got a ceiling fan
And fuck the movie "The Fan" starring Wesley Snipes
"Demolition Man"'s the only Snipes movie I like


And fuck liking shit I don't even like the stuff that I like
Don't give a fuck about not liking all the shit I don't like
Like tissues fuck 'em I blow my nose on the couch
And fuck my nostrils and my sense of smell I breathe through my mouth


Don't give a fuck about seeing bitch fuck my eyes
Fuck visual perception yo I'd rather be blind
And fuck time seconds are too short and minutes are a joke
And hours are way too long they should be half and hour at most


And fuck coasts don't give a fuck about where water meets land
And fuck boats just 'cause you float you think you're so fucking bad
And fuck jokes I don't need to be funny all the time
My dog has a tumor and he's probably gonna die but


I don't give a fuck
About anything fuck everyone and fuck everything what
I don't give a fuck
I literally don't give a fuck about anything


Walked in to a coffee shop and ordered a cup
The girl said "Small, medium or large?"
I said "Bitch I don't give a fuck"
She said "I can't process your order if you don't pick a size"
I said "Fine I'll take a large but I still don't give a fuck alright?"


Don't give a fuck about beverage size options motherfucker
And I don't give a fuck about liquids either
They're all wet and shit and tend to spill all over the place
Like human semen when I get it all over my face
I'm not gay I just don't give a fuck about straight sex
And fuck my dick I'll pee and cum out of my mouth instead


Fuck biological functions
Fuck the human body
I'd prefer the body of a bat and the head of a coyote
I'd call myself batyote and I'd fight crime at night
I know it's similar to batman but motherfuck copyright
I plagiarize all the time I do it every day
'Cause I'm on the right track baby I was born this way


And fuck birth entering the world of space and time is a bitch
Searching for purpose in a random universe sucks dick
Is it deterministic or am I free to choose my way
Did I choose to not give a fuck about icecube trays
If I want ice I'll go to the fucking cornerstore and buy a bag
Filling you up and waiting for the water to freeze is a motherfucking drag
You know what fuck the word fuck I don't need to use it
I'll replace it with the word chainsaw for this chorus


I don't give a chainsaw
About anything chainsaw everyone and chainsaw everything what
I don't give a chainsaw
I literally don't give a chainsaw about anything


If there were a contest to see who doesn't give a fuck the most
I wouldnt win 'cause I don't give a fuck about winning, yo
I don't even give a fuck about not giving a fuck so I do give a fuck
Wait, what?


I give a fuck
About everything I love everyone and care about everything what
I give a fuck
I literally care about every motherfucking thing


Eh, otros raperos afirman que no les importa una mierda
Bien, haceos a un lado putas porque me importa la menor cantidad de mierda humanamente posible
¿¡QUÉ!?


Me importa una mierda
Nada, que le den a todos y que le den a todo, qué
Me importa una mierda
Literalmente me importa una mierda todo


No me importa una mierda ninguna puta cosa
La gente se preocupa por mierda, yo digo que le den a todo
Que te jodan, que me jodan, que le den al cielo, que le den a los árboles, que le den al sol
No necesito calor o vitamina-D


Y que le den a las tostadoras, no necesito cocinar mi pan
Y que le den a los posavasos, usaré un plato pequeño en su lugar
Y que le den a los gallos con vuestro inútil kikiriki
Inventamos los relojes con alarma, ya no os necesitamos


No me importan una mierda las sillas, prefiero quedarme de pie
Y que le den al aire acondicionado, tengo un ventilador de techo
Y que le den a la película "The Fan" protagonizada por Wesley Snipes
"Demolition Man" es la única película de Snipes que me gusta


Y que le den a gustarme cosas, ni siquiera me gustan las cosas que me gustan
No me importa una mierda que no me gusten todas las mierdas que no me gustan
Como los kleenex, que les den, me sueno en el sofá
Y que le den a mis orificios nasales y a mi sentido del olfato, respiraré por la boca


No me importa una mierda ver, que le den a mis ojos
Que le den a la pecepción visual eh, prefiero ser ciego
Y que le den al tiempo, los segundos son muy cortos y los minutos son un chiste
Y las horas son demasiado largas, deberían durar media hora como mucho


Y que le den a la costa, no me importa dónde el agua se encuentra con la tierra
Y que le den a los barcos, sólo porque flotáis creéis que sois la polla
Y que le jodan a los chistes, no necesito ser divertido todo el tiempo
Mi perro tiene un tumor y probablemente muera pero


Me importa una mierda
Nada, que le den a todos y que le den a todo, qué
Me importa una mierda
Literalmente me importa una mierda todo


Entré en una cafetería y pedí una copa
La chica dijo "¿Pequeño, mediano o grande?"
Dije "Puta, me importa una mierda"
Dijo "No puedo tramitar su pedido si no elige un tamaño"
Dije "Bien, cogeré uno grande pero sigue sin importarme una mierda, ¿está bien?"


Me importan una mierda las opciones de tamaño de la bebida, hijos de puta
Y me importan una mierda los líquidos también
Están todos mojados y mierda y tienden a derramarse por todo el lugar
Como el semen humano cuando lo tengo por toda mi cara
No soy gay, simplemente me importa una mierda el sexo heterosexual
Y que le den a mi polla, mearé y me correré por mi boca en su lugar


Que le den a las funciones biológicas
Que le den al cuerpo humano
Prefiero el cuerpo de un murciélago y la cabeza de un coyote
Me haré llamar batyote y lcuharé contra el crimen por las noches
Sé que es similar a Batman pero que le den al Copyright
Plagio todo el tiempo, lo hago todos los días
"Porque voy por el camino correcto, nena, nací así"


Y que le den a nacer, entrar en el mundo de espacio y tiempo es una zorra
Buscar un propósito en un universo aleatorio chupa pollas
Es determinista o soy libre de elegir mi camino
¿Elegí que me importen una mierda las cubeteras?
Si quiero hielo iré a la puta tienda y compraré una bolsa
Llenarte y esperar que el agua se congele es un puto coñazo
Sabes qué, que le den a la palabra "fuck", no necesito usarla
La reemplazaré por la palabra "motosierra" en este estribillo


Me importa una motosierra
Nada, que le motosierran a todos y que le motosierra a todo, qué
Me importa una motosierra
Literalmente me importa una motosierra todo


Si hubiera un concurso para ver a quién le importa más una mierda todo
No ganaría porque me importa una mierda ganar, eh
Hasta me importa una mierda que me importe una mierda así que me importa
Espera, ¿qué?


Me importa
Todo, amo a todo el mundo y me preocupa todo, qué
Me importa
Literalmente me importa toda puta cosa
Es una buena cantidad de letra y, la verdad, bastante difícil de traducir, sobre todo considerando la cantidad de juegos de palabras que usa, así que, si sois capaces de entender el inglés decentemente, recomendaría que viérais la letra original, que es mucho mejor.