jueves, mayo 31, 2012

(Reseña de cine) Jurassic Park III

Tras el éxito que supusieron las dos primeras entregas de Jurassic Park, y a pesar de que Chrichton no volvió a escribir sobre este concepto, en 2001 se estrenó una segunda secuela, esta vez titulada simplemente Jurassic Park III, en la que Steven Spielberg se mantuvo simplemente como productor, mientras que en esta ocasión la dirección sería llevada a cabo por Joe Johnston.
Después de un incidente en el que un hombre y un niño quedan atrapados en Isla Sorna, una pareja de aventureros millonarios se ponen en contacto por Alan Grant para que les dé un tour aéreo guiado a dicha isla, lo cual el paleontólogo acepta debido a la necesidad de dinero para su investigación. Sin embargo, una vez a bordo, acaba por descubrir que sus anfitriones no son lo que dicen ser... ni tampoco sus intenciones.
Hasta la hora la película más criticada de la saga, aunque básicamente es por sus dos fallos (enormes): el pobre desarrollo inicial (aunque tenga mucho sentido, no convence mucho lo fácil que Grant es persuadido para ir a la isla) y el completamente anticlimático final (cuando esperábamos la ya clásica escena épica con velocirraptores de cada película... los velocirraptores se van y se acaba). Sin embargo, durante la película, tanto el ritmo como los diálogos superan por mucho a la anterior entrega (El Mundo Perdido: Jurassic Park), siendo capaz de alternar escenas de sosiego con escenas de acción y siguiendo una trama bastante limpia en la que no notamos ninguna escena completamente sobrante. Aunque ninguna de las escenas de acción de esta película supera las grandes escenas de las dos anteriores, siguen siendo bastante buenas y dejándonos sin aliento en algún momento.
Esta película, por otro lado, hereda un problema de la anterior: la falta de muertes importantes. De hecho, en la anterior todavía alguna nos pudo doler, pero en esta película se nos presentan a unos (pocos) personajes desechables y a los auténticos protagonistas, los cuales salen (casi) indemnes por lo que al final de la película nos falta una pérdida de verdad. Otra cosa que nos puede dejar un poco frío es el hecho de repetir tramas de la anterior película, como la "bolsa de la suerte" o el depredador buscando recuperar a su cría.
En lo personal, la sustitución del tiranosaurio por el espinosaurio no me pareció la mejor de las ideas, en parte por mi devoción por el lagarto tirano rey, y en parte por la propia popularidad de dicho dinosaurio, cuya única escena lo hace quedar en bastante mal lugar frente al nuevo monstruo, del cual ni siquiera explican el origen (se dice que InGen no lo incluía en sus listas, pero luego esa trama se deja colgada). Por contra, es de agradecer la escena de los pteranodon, otros animales que gozan de gran popularidad y que hasta la fecha sólo habían tenido un pequeño cameo al final de la segunda parte. Lo cual en parte contradice esta película en la cual se supone que aún estaban encerrados.
Los efectos especiales, por desgracia, empeoran cada vez más, ya no sólo por el aumento del CGI sino porque algunas de las maquetas tienen bastante poco realismo (los dientes del espinosaurio cantan mucho a plástico).
Los actores en general lo hacen bastante bien, sorprendiendo que probablemente sea Sam Neill el que peor interprete, aunque me da que de esto tiene más culpa el guión que el propio actor. Pero incluso el joven Trevor Morgan interpretando al apañado Eric Kirby hace un trabajo excepcional, sin dejar de mencionar a William H. Macy, Téa Leoni o Alessandro Nivola.
Resumiendo, una película que, aunque no sea la mejor de la saga, se deja ver y entretendrá a todo aquel fan de estos animales. Yo estoy deseando que salga la cuarta parte, la cual se dice se estrenará el año que viene.

miércoles, mayo 30, 2012

(Reseña de cómic) The Ultimates Vol.3

Tras los dos primeros volúmenes de The Ultimates, Mark Millar y Bryan Hitch abandonaron la colección dejando paso a los veteranos Jeph Loeb y Joe Madureira, quienes crearon un tercer volumen que serviría como puente hacia el evento Ultimatum que sacudió todo el universo Ultimate en 2008.
Después de haber abandonado SHIELD, los Ultimates, liderados por la Avispa, descubren que alguien ha logrado hackear los ordenadores de Tony al publicar en internet un vídeo porno del multimillonario con la Viuda Negra, mientras son inexplicablemente atacados por Veneno y un misterioso asesino acaba con la vida de la Bruja Escarlata. A partir de entonces empezarán una investigación para intentar comprender estos hechos mientras Magneto no parece estar muy contento por el asesinato de su hija.
¿Recordáis cuando alguna vez he hablado de mi aversión por Jeph Loeb? Pues este cómic es el principal culpable. Esta historia no tiene por dónde agarrarse, el autor intenta seguir el estilo Millar y, si alguien decía anteriormente que Millar "sólo escribía sobre superhéroes cabreados", lo que ha hecho Loeb de verdad es eso, ya que parece que todos los Ultimates se van a tirar al cuello los unos a los otros durante los cinco números que dura la miniserie. El uso de clichés y de situaciones "maduras" demuestran un intento de crear la sorpresa y el escándalo fácil, sin lograrlo ya que lo único que logra transmitir es indignación por unos diálogos tan poco trabajados y una historia que no sólo se sostiene poco, sino que encima tiene demasiadas ramificaciones absurdas hasta el punto de que en cierto momento no tenemos ni idea realmente cual es el sentido de la historia.
Aparte, Loeb llega y decide borrar algunas de las cosas que Millar había dejado hechas, supongo que porque no le gustarían, e incluye excusas tan tontas como "ya que todos saben que de verdad soy el dios del trueno, puedo empezar a hablar de modo pedante como si del Thor del universo clásico me tratara". Por favor, Loeb.
El trabajo de Madureira, por otro lado, no es malo. Por supuesto, no se puede comparar con el magnífico trabajo de Bryan Hitch, aunque su estilo mucho más fresco que el del otro autor ayuda a la lectura, aunque hay que mencionar que a veces sus dimensiones son exageradas y que la estructura de viñetas de alguna que otra página es bastante liosa para seguir el hilo.
Definitivamente, esta es la historia de cómo alguien puede tomar un trabajo muy bueno y hundirlo en un sólo número (ya desde el primer número te das cuenta de que nada bueno puede salir de aquí). De hecho, el universo Ultimate, en mi opinión, no se ha recuperado desde esta serie.

martes, mayo 29, 2012

Tutorial de desarrollo web, Parte XXXIV: Arrays (I)

¡Segunda semana escribiendo el tutorial desde Alemania! Sé que en estos días no estoy respetando el formato habitual ni poniendo las soluciones ni nada, pero si miráis el resto de los posts, tampoco lo estoy haciendo, todo debido a las limitaciones del ordenador que tengo aquí. Pero prometo que, desde que vuelva a tener un ordenador decente (probablemente a partir del día 16 que estoy de nuevo en España hasta nuevo aviso, y tendré el ordenador que solía usar antes), editaré estos posts y los corregiré. Pero ahora, pasemos al curso.
¿Recordáis que, hace unos cuantos números, os enseñé los "tipos de datos básicos" (también conocidos como "tipos de datos simples"? Ya sabéis: enteros, reales, booleanos y caracteres. Además, desde el comienzo hemos hablado de las ristras o strings, y ya les he comentado que es un tipo de dato no básico, aunque su uso es tan habitual que muchos programadores lo consideran así. Además, es un tipo de datos bastante simple de entender, ya que por lo general forma palabras, frases o textos, algo a lo que estamos habituados (técnicamente para el navegador, todo este post es una string, pero ustedes lo leéis como un simple texto). Ahora bien, no todos los tipos de datos complejos son tan sencillos de entender (como su nombre bien indica), así que hoy vamos a empezar a trabajar con un tipo de datos complejo usado muy frecuentemente: los llamados vectores o arrays.
Hasta ahora las variables que hemos visto contenían sólo un valor cada una. Con esto quiero decir, por ejemplo:

var entero = 1;

La variable "entero" en este código, sólo tiene el valor "1". Si a posteriori incluyéramos otra línea...

var entero = 1;
entero = entero + 3;

En la segunda línea hemos modificado el valor de "entero", o sea, que ha pasado de valer 1 a valer 4, perdiéndose tanto el 1 como el 3. Si quisiéramos haber mantenido todos los valores, deberíamos haber creado otras variables, por ejemplo:

var entero = 1;
var segundoEntero = 3;
var resultado = entero + segundoEntero;
Ahora todos, el 1, el 3 y el 4, están almacenados, pero cada uno en una variable distinta.
Sin embargo, cuando hablábamos de caracteres, encontrábamos que podíamos guardar más de un caracter en una misma variable, así:

var caracter = "a";
var caracter = caracter + "b";

Con este código, ahora en caracter tenemos guardado el valor "ab" con lo que tenemos tanto la "a" como la "b". Sin embargo, ahora la variable "caracter" ya no es de tipo char sino de tipo string. Pero recordaremos que gracias a las distintas funciones de las strings (como las substrings) podemos acceder a cada uno de los caracteres.
Por esto es que el string es considerado un tipo de dato complejo, porque en su interior no contiene uno, sino varios valores (para el ordenador, cada uno de los caracteres es un valor individual, y la string lo que hace es agruparlos). Sin embargo, debido a lo frecuente de su uso, los lenguajes de programación han dotado a este tipo de datos de un modo de tratamiento bastante simple, de modo que su uso es casi igual al de un tipo de dato básico.
Pero, ¿cómo podemos tener una variable que almacene muchos enteros, reales o booleanos? No hace falta ser muy espabilado para pensar que podríamos guardarlas en una string como si fueran caracteres, aunque, evidentemente, no es el sistema más óptimo, sobre todo cuando los enteros y reales tengan más de una cifra, con lo que podría ser bastante confuso. Aunque existirían maneras de que eso funcionara de algún modo, ¡no se estresen! Eso no hace falta, para ello tenemos los arrays, variables que pueden contener en su interior varios valores, sea cual sea su tipo.
Vamos a poner un ejemplo entre comillas realista: tenemos un juego en nuestra web en la que, a lo largo del juego, el usuario va viendo su puntuación, la cual se va almacenando en una variable "score". Al terminar la partida, el usuario puede elegir jugar otra vez (tendremos un bucle que el usuario podrá interrumpir cuando decida no jugar más) y su última puntuación debe aparecer en pantalla para que el usuario intente superarla, al tiempo que va viendo su nueva puntuación (que empezará desde 0 nuevamente). Esto simplemente se puede hacer así:

do
{
   // Instrucciones del juego

   if(nueva_partida)
   {
      var puntuacion = score;
      var score = 0;
   }
   else
   {
      break;
   }
}
while(true)

Sencillo, ¿no? Bueno, imaginemos que el usuario juega una tercera partida. En esta versión, el usuario sólo vería la puntuación de la segunda partida, mientras que perdería la puntuación de la primera. Si nos interesa que sólo se guarde la puntuación más alta, simplemente habría que usar otro if para determinar si la última puntuación es más alta que la guardada. Pero, ¿en caso de que queramos guardarlas todas? Para eso, señores y señoras, existen los arrays. De este modo, antes del do deberíamos declarar un array, de esta manera:

var puntuaciones = new Array();

Bien, ese es uno de los métodos de declarar un array en JavaScript. Hasta ahora ninguno de los tipos de datos que habíamos aprendido necesitaba ser "declarado". Como mucho declarábamos la variable, pero no necesitábamos especificarle el tipo. Ahora, con los tipos de datos complejos (exceptuando el string que, como ya he dicho, se comporta como un tipo de dato simple), necesitamos especificar qué tipo de dato será. En realidad, no se trata de una declaración, sino de una inicialización, aunque de eso hablaremos más cuando expliquemos lo que son los objetos (a pesar de que los estamos usando, es un poco complejo explicarlo aún).
Ahora JavaScript sabe que tenemos una variable llamada "puntuaciones" en la cual hay almacenado un array. Sin embargo, el array puntuaciones, de momento, está vacío. Existen varios modos de introducir datos en un array. De momento, dentro del if interno, sustituiremos las dos líneas de código por estas siguientes:

puntuaciones[puntuaciones.length] = score;
score = 0;

¿Eh? ¿Qué ha ocurrido ahí? ¿Qué es eso? ¡Tranquilos, que no cunda el pánico! Es bastante más fácil de lo que parece.
Tal vez me he adelantado al colocar la propiedad length tan pronto. Vamos primero a saber simplemente cómo incluir datos en un array, saliéndonos fuera del ejemplo que teníamos hasta el momento. Veamos aquí este pequeño código:

var vector = new Array();
vector[0] = 3;
vector[1] = 5.2;
vector[2] = "casa";
vector[3] = 7;
vector[4] = true;

Sí, sé que sigue siendo bastante confuso, pero es algo más sencillo que lo anterior. ¿Podéis deducir lo que ha ocurrido aquí? ¿No? Bueno, tranquilos, para eso estamos aquí, yo para enseñar y ustedes para aprender, así que vamos a ver lo que es.
Como vimos antes, en la primera línea he especificado a JavaScript que en la variable "vector" se almacenará un nuevo array. Tal como explicamos antes, el nuevo array está ahora vacío hasta nuevo aviso, así que luego nos disponemos a llenarlo. Los arrays se componen de posiciones y estas posiciones se pueden llamar incluyendo un número entre corchetes justo después del nombre de la variable. De este modo, vector[0] es la primera posición del array "vector" (al igual que ocurría con los strings, la primera posición de un array es siempre la posición 0).
De este modo, en este código hemos asignado a cada una de las primeras 5 posiciones un valor, alternando entre enteros, reales, strings, booleanos... Realmente podemos incluir cualquier tipo de dato en una de las posiciones de un array, y el hecho de que el JavaScript sea un lenguaje no tipado permite incluso que en un mismo array hayan datos de distintos tipos (como es el caso de este array).
De todos modos, recomiendo en cada array sólo incluir siempre datos de un mismo tipo, no por riesgo de error sino por orden y facilidad a la hora de trabajar con nuestro propio código. En el futuro veremos maneras de usar tipos de datos complejos que almacenen datos de distintos tipos sin riesgo de darnos problemas.
Antes de continuar con nuestro ejemplo anterior, quiero enseñarles otros dos modos de crear un array, esta vez inicializándolo e introduciéndole datos en una misma línea.

var vector = new Array(3, 5.2, "casa", 7, true);

Como véis, esta manera de crear un array se parece a la que hicimos anteriormente, lo que al mismo tiempo que indicamos al navegador que "vector" va a ser un array, introducimos en el array los 5 datos separados por comas.

var vector = [3, 5.2, "casa", 7, true];

Esta peculiar manera es una pequeña ventaja que JavaScript da a los arrays debido a su frecuente uso, igual que ocurría con los strings. De este modo, como vemos, no tenemos que especificar que "vector" es un array, sino que con el dato que se le introduce, el lenguaje ya sabe que será un array. Por el resto, funciona exactamente igual que la anterior manera. Y, personalmente, no suelo usarla, no por ningun problema sino porque, como iremos viendo, no se parece a ninguna otra de las sintaxis del lenguaje, y se suele quedar en el olvido. Pero por mencionarla que no sea.
Bien, ahora que empezamos a ver de qué va esto de los arrays, volvamos a la línea de antes.

 puntuaciones[puntuaciones.length] = score;

Si recordáis los strings, recordaréis una propiedad de estos llamada length, que indicaba el número de caracteres que tenía el string. Pues los arrays tienen una propiedad casi idéntica, que devuelve el número de posiciones que tiene el array. Y, al igual que ocurría con los strings, al ser el primer índice (o posición) del array el número 0, la última posición del array se descubre con un puntuaciones.length - 1. Por eso, si en lugar de un número, entre los corchetes introducimos puntuaciones.length, se referirá a una nueva posición en el array. ¿Cómo funciona esto? Veámoslo un poco más gráfico:

Cuando el array esté recién creado, su length será 0 (no tiene ninguna posición). De este modo:
puntuaciones[puntuaciones.length] = score;
Sería lo mismo que escribir:
puntuaciones[0] = score;
Y tal como hemos visto, la posición 0 es la primera posición del array.

Ahora el array tiene un dato en su interior (en el índice 0). Así que:
puntuaciones[puntuaciones.length] = score;
Es lo mismo que:
puntuaciones[1] = score;
Y, como en ese índice no hay nada almacenado (ya que la única posición del array con un valor es la posición 0), se crearía un nuevo índice, por lo que el length del array será ahora de 2.

Y así sucesivamente.

Y, por hoy, eso es todo. La semana que viene veremos otras operaciones con arrays que nos podrán ser útiles. Pero ahora, ¡el ejercicio de la semana!

EJERCICIO

Esta semana crearemos una aplicación que vaya pidiendo al usuario una serie de números y los vaya almacenando en un array hasta que el usuario escriba "0". En este momento, la aplicación debe parar y mostrar por pantalla todos los números introducidos seguidos de un salto de línea.

El ejercicio es bastante simple, aunque cierta parte va a necesitar que uséis un poco la cabeza. ¡Suerte con ello y hasta la semana que viene!

lunes, mayo 28, 2012

Desentrañando... la Visión

Ultron, un robot creado por el superhéroe Chaqueta Amarilla que se rebeló contra él convirtiéndose en un temible enemigo de los Vengadores, en uno de sus intentos de acabar con su creador, fabricó lo que llamaba un "sintetizoide", usando los restos del androide conocido como la Antorcha Humana original e introduciéndole los patrones cerebrales del héroe Wonder Man. Sin embargo, esto último sería el error del robot, ya que su sintetizoide, que adoptó el nombre de la Visión, decidió unirse a los Vengadores, mimetizando a su creador al rebelarse también contra él. Sin embargo, esto no ha evitado que en ocasiones, Ultron haya conseguido controlar a su creación.
Miembro bastante importante del equipo de los Héroes Más Poderosos del Mundo, la Visión comenzó una relación sentimental con la Bruja Escarlata e incluso llegaron a tener dos hijos, Thomas y William, gracias a los poderes de la mutante. Desgraciadamente, ambos niños eran realmente fragmentos del demonio Mefisto, y después de que los niños fueran absorbidos de nuevo por el demonio, la hija de Magneto enloqueció, llegando incluso a asesinar en su locura a compañeros de su equipo.
En distintas ocasiones, además, la Visión ha sido destruida y, al ser reconstruida, ha perdido sus patrones cerebrales, y un resurrecto Wonder Man se ha negado a que sus patrones fueran usados de nuevo en su reconstrucción, de modo que en ocasiones, la Visión ha sido un androide frío y sin sentimientos, o ha tenido otros patrones cerebrales. Sin embargo, siempre, de algún modo, los patrones de Wonder Man resurgen de su interior, volviendo a ser el mismo.

domingo, mayo 27, 2012

The CubesPaper, Numero XXX (27/05/2012)

¡Hola a todos! Esta semana sí he revisado muchas más noticias, pero desgraciadamente, poco que valga la pena he encontrado. De todos modos, ahí va lo que he podido rescatar:

Shigeru Miyamoto gana un premio Príncipe de Asturias
El creador de Super Mario ha sido galardonado con dicho prestigioso premio.

Más información: Alt1040


Llegan  los "primeros X-Men"
A partir de agosto se publicará una miniserie de 5 números con dicha temática.
Más información: ComicBookResources

Actores confirmados para "Iron Man 3"
Jon Favreau regresa, al menos como actor, y también se le unen Ashley Hamilton y Wiliam Sadler.
Más información: ComicsAlliance


Serie de televisión de "El Exorcista"
Constará de 10 episodios y servirá como precuela de la película.
Más información: Alt1040

sábado, mayo 26, 2012

Un Cubo en Alemania, Semana VII

¡Hola en esta séptima entrega de "Un Cubo en Alemania"! Otra semana más vengo a contarles cómo me va por estas tierras germanas y así darles un poco de envidia (y si eso, animarles a que se vengan).
Últimamente, entre semana estoy haciendo bastante poco, la verdad. El hecho de que tarde una hora para ir y otra para volver del trabajo hace que llegue un poco cansado, y sobre todo ahora que se han estropeado los railes de una de las líneas que suelo coger, por lo que he tenido que estar haciendo un recorrido bastante más largo durante toda la semana. Curiosamente, eso me sirvió para ver sitios bastante curiosos de la ciudad en lo que trataba de encontrar el camino. Eso sí, ¡no me pregunten por dónde era!
Asi que esta semana, turismo bastante poco, sin embargo, puedo hablarles de los dos nuevos locales a los que he ido: el "Green Mango" y el "K17". El primero, al que fuí el sábado pasado tal como anuncié, es un karaoke en el que la verdad me divertí bastante, entre otras cosas porque soy aficionado de esta clase de locales. El otro, del que había leído bastantes veces pero hasta anoche no me había animado a ir, es un curioso complejo formado por dos edificios y dos terrazas, estas últimas con unas barbacoas. En uno de los edificios se celebran conciertos y el otro consta de 4 salas cada una en un piso (aunque la tercera y cuarta están en el mismo) con distintos ambientes de música rock, metal y electrónica (que además, varían depende de día). Bastante interesante.
Y, además, desde ayer hasta el lunes se celebra en Berlín el "Carnaval de las Culturas", un evento bastante lejos a lo que conocemos como "Carnaval" en España, sino que se trata de una serie de espectáculos mostrando distintos tipos de culturas de distintas partes del mundo (algo parecido al W.O.M.A.D. del que hablé hace unos meses por aquí). Ayer, por el cansancio, no pude asistir, pero hoy, que estoy escribiendo esta entrada por la mañana, después de comer iré a verlo, así que la semana que viene les contaré qué tal.
Y esta noche, de vuelta al "Green Mango". A seguir torturando los oídos de los alemanes.

viernes, mayo 25, 2012

(Reseña de juego) Theme Hospital

Después del éxito obtenido con su popular juego Theme Park, Bullfrog se animó a crear una serie de juegos de simulación empresarial en la misma línea que el anterior, siendo, sin duda, su mayor éxito el popular Theme Hospital, en el que el jugador debía de ponerse al frente de la gerencia de un hospital (o más bien, varios hospitales, aunque sólo uno cada vez).
Al comenzar cada nivel nos encontramos con un edificio vacío que tenemos que equipar con consultas de varios tipos y servicios para pacientes y médicos. De esta forma tendremos que colocar lavabos, asientos, calefacción, máquinas dispensadoras, etcétera. Todo para que nuestros pacientes y trabajadores se encuentren más cómodos (salvo por la recepcionista, que no se moverá en la vida de su puesto).
Ante nosotros se abrirá toda una gama de enfermedades de lo más absurdo, desde la Invisibilitis o la Lengua Caída, pasando por el Síndrome del Rey o el Peludismo, algunas de las cuales tienen una cura aún más absurda que la propia enfermedad, haciendo que nos despierte más de una sonrisa cuando las vamos encontrando.
En los primeros niveles, el juego es bastante básico: crear el hospital con aquellas instalaciones que nos permiten en un comienzo y mantenerlo financieramente estable. A medida que van avanzando los niveles, nuevas posibilidades se van abriendo ante nosotros gracias a las salas de investigación o de formación de médicos. Además, nuevos retos como la llegada de emergencias o terremotos que sacudan el hospital nos van poniendo cada vez más a prueba.
Por suerte, el juego va progresando y sumando nuevas opciones a un ritmo bastante bueno para ir adaptándonos poco a poco. Desgraciadamente, como suele ocurrir con la mayoría de los juegos de este tipo, hay puntos muy muertos en los que no sabemos qué hacer ya que tenemos que esperar a que nuestra economía mejore o a que nuestro departamento de investigación haga un descubrimiento. Pero, por lo general, mantiene mucha diversión.
Definitivamente, un juego que marcó época porque se lo merecía, divertido pero con bastantes retos para mantenernos pegados durante unas cuantas horas intentando sacar a flote nuestro hospital.

jueves, mayo 24, 2012

(Reseña de cine) El Mundo Perdido: Parque Jurásico II

Tras el éxito que supuso la adaptación al cine de la novela Jurassic Park, Michael Crichton se animó a escribir una secuela, la cual además adaptaba la popular novela The Lost World de Arthur Conan Doyle al universo de ciencia-ficción de la primera novela, por lo cual Crichton tomó prestado el nombre de la obra antes mencionada. Steven Spielberg, director de la primera película y uno de los principales culpables de que se escribiera esta secuela, dirigió también esta segunda parte.
Ian Malcolm es convocado por John Hammond una vez más, esta vez para que le ayude a preservar a los animales que aún sobre
viven en isla Sorna, la Zona-B de Jurassic Park, ante la tentativa de su sobrino, Peter Ludlow, de explotarlos una vez más. Aunque en un principio Malcolm es reacio a volver a poner los pies en una isla en la que hayan dinosaurios, el saber que su actual novia, Sarah Harding, ya ha partido para allá, le hace cambiar de parecer, pero al llegar se encuentra con que Ludlow ya ha puesto en marcha sus ideas.
Esta segunda película es bastante más floja que la primera, como suele ocurrir con muchas secuelas. De por sí, el guión es mucho más libre que en la primera película, donde a pesar de cambiar algunos segmentos e ignorar alguna de las tramas, seguía el mismo concepto. Sin embargo, en este caso no, y curiosamente, en esta película toman un par de elementos de la primera novela que no se incluyeron (de por sí, la escena inicial es sacada directamente de la primera novela). Los diálogos no son especialmente brillantes, la película es bastante atropellada y, llegado a un punto, se convierte en una sucesión de ataques de dinosaurios que no parece dejar un respiro a los protagonistas y que en muchos casos no aporta nada al desarrollo de la trama más que la muerte de algún personaje secundario. Lejos están esas escenas de calma sobre las copas de los árboles viendo comer a los braquiosaurios que te relajaban antes de la siguiente escena de acción, o esas conversaciones en el centro de visitantes preguntándose qué pueden hacer a continuación, esa película es simple y llanamente acción seguida de acción. Hasta los estegosaurios son violentos.
Aunque no hay mal que por bien no venga, ya que la acción por general es muy buena, y ver las escenas de acción por separado (verlas seguidas acaba saturando) es una experiencia genial. Sobre todo la escena de la caravana, en mi opinión una de las mejores escenas de la saga (aunque la primera escena del T-Rex y la de los raptores en la cocina de la primera película no se quedan muy atrás).
Y por esta escena recuerdo una muerte en particular que ocurre en esta escena, probablemente la muerte que más pena me ha dado en toda la saga, y he de mencionar que es realmente el único personaje "importante" que muere en esta película. Todos los demás son carne de cañón, incluso el último personaje en morir, que sí es importante, muere en la escena final, cuando ya no quedan ni cinco minutos de película.
Los efectos especiales, sorprendentemente, son peores que los de la primera película. El ordenador canta bastante más, en algún momento se nota el fondo verde, e incluso en un momento se nota perfectamente que un triceratops es sólo un ariete.
Respecto a las actuaciones, los únicos destacables son de nuevo Jeff Goldblum como Malcolm, Vince Vaugh como Nick Van Owen y Richard Schiff como Eddie Carr, y tal vez podamos salvar a Pete Postlethwaite como Roland Tembo o incluso a Arliss Howard como Peter Ludlow (aunque su papel es patético). Por el resto, ni Julianne More interpretando a Sarah Harding se salva de tener unas actuaciones entre mediocres y pobres.
Finalmente, hay que mencionar, por descontado, el fragmento final de la película. Sólo se me ocurre una palabra: ¿qué? O sea, sí, es un concepto muy divertido y todo lo que quieras, pero es un momento que básicamente ni siquiera sabes cómo enfocarlo. Al mismo tiempo es cómico y dramático, y no termina de convencer de ninguna de las dos maneras. Aunque, curiosamente, hay que reconocer que "adapta" una parte de la novela de Conan Doyle que Crichton no adaptó en su novela (aunque Conan Doyle usó un pterodáctilo, no un T-Rex...).
Concluyendo, una película entretenida, con muy buena acción pero que falla en muchos otros aspectos, por lo que queda muy lejos de su predecesora.

miércoles, mayo 23, 2012

(Reseña de cómic) The Ultimates, Vol.2

Tras el exitoso primer volumen de la serie The Ultimates, que mostraba una nueva versión de los Vengadores de Marvel, Mark Millar y Bryan Hitch siguieron trabajando juntos durante trece números más para traernos el volumen 2 de la misma serie desde 2005 a 2007.
Ha pasado un año desde que los Ultimates acabaran con la invasión Chitauri y están empezando a realizar misiones de seguridad nacional como liberar a presos políticos en el extranjero y similares, lo que provoca que Thor, en esta nueva versión muy anti-imperialista, abandone el equipo y empiece una campaña en contra de lo que hacen los héroes. Poco a poco, todos los miembros del equipo empiezan a ser sacados de escena de distintas maneras, y Thor intenta avisar de que es su hermanastro Loki, que se ha liberado de la Habitación Sin Puertas, pero nadie cree en los "desvaríos" del supuesto dios nórdico...
Este segundo volumen es, muy posiblemente, mejor que el primero. A diferencia del anterior, tiene un sólo arco argumental bastante largo, pero que no llega a ser aburrido aunque es cierto que se podría haber acortado y que algunas cosas sobran un poco (la versión Ultimate de los Defensores, sobre todo...). Pero en general, la  historia es muy buena y hay una buena cantidad de sorpresas y de giros de argumentos interesantes, además de dejar bastante a la imaginación del lector cuestiones sobre los personajes, muchas de ellas sin responderlas al final para que podamos hacernos nuestra propia opinión sobre cada uno (sobre todo respecto a Hank Pym y la forma de actuar a lo largo de los trece números en distintas ocasiones).
Bryan Hitch sigue en su misma línea de dibujo aunque se nota que para este segundo volumen le metieron más prisa, de modo que se le notan más errores, pero realmente no puedo decir nada nuevo sobre lo espectacular que es este autor y lo compatible que es con el guionista que comparte. Anque, por uspuesto, hay que destacar la viñeta a ocho páginas del número trece en el que podemos ver a la mayoría de los héroes junto a los héroes de Asgard luchando contra los ejércitos de Loki.
Una historia estupenda que nos dejó un muy buen sabor de boca a la partida de estos dos autores. Lástima que cuando regresaran ninguno de los dos nos pudiera mostrar algo tan grande como estos dos volúmenes.

martes, mayo 22, 2012

Tutorial de desarrollo web, Parte XXXIII: El bucle "for"

¡Hola otra vez! Ya el tiempo que llevo en Berlín se nota, que de hecho, hoy ya estoy escribiéndoles un artículo del tutorial desde aquí. Lamento no haber dejado las resoluciones a los ejercicios de este anterior mes y pico, pero como sabréis si habéis leído los posts de los sábados (o incluso los de los domingos), actualmente el internet no es el mayor fuerte que tengo aquí. ¡Pero prometo dejarlos todos desde que tenga mejor conexión!
Bueno, sigamos por dónde nos quedamos. La semana pasada vimos cómo la sentencia condicional podíamos "evolucionarla" a "else if" y "switch", dos formas alternativas de atajar esas situaciones, haciéndolo bastante más sencillo en algunas ocasiones. Esta semana vamos a hacer lo mismo, pero con los bucles.
En muchas ocasiones, antes de crear un bucle, sabremos cuantas veces querremos que se repita la misma acción. No es necesario que lo sepamos en el momento de la programación, pero sí al menos justo antes de entrar al bucle. Por ejemplo:

var x = prompt("Introduzca un número positivo:");

cont = 0;

while(cont <= x)
{
document.write(cont++ + '<br/>');
}

Este código, bastante simplón, le pide al usuario un número y luego escribe todos los números desde el 0 hasta el número en cuestión. Como vemos, antes de entrar en el bucle sabíamos que este se repetiría "x" veces, y hemos creado la variable "cont" para que vaya contando desde 0 hasta "x", sumándole uno en cada pasada. Pero hay una forma más simple de hacer esto: con el bucle for:

var x = prompt("Introduzca un número positivo:");

for(var i = 0; i <= x; i++)
{
document.write(i + '<br/>');
}

Este código haría exactamente lo mismo que el anterior. ¿Qué significa eso? Veámoslo por partes:
  • El bucle "for" divide su paréntesis en 3 partes. En la primera declara una variable que, por costumbre de programadores, se suele llamar "i", y se le asigna un valor inicial, que habitualmente suele ser 0, pero en alguna ocasión puede que nos interese empezar en otro número.
  • La segunda parte del bucle for expresa la condición, tal como hacíamos en el bucle "while". Le decimos que queremos que el bucle se repita mientras "i" tenga un valor menor o igual que "x".
  • Finalmente le decimos cómo queremos que se incremente "i". En nuestro caso, un valor cada vez (por lo cual usamos el incremento). Podríamos haber puesto "++i" ó "i + 1" sin ningún problema, pero lo habitual es usar el incremento. De hecho, este bucle "for" es muy típico y de forma muy habitual lo usaréis así sin casi modificarlo (como mucho la variable a comparar con i, o tal vez quitarle el "=" de la condición, dejándolo sólo como "menor que").
Bastante sencillo, ¿no? Pues les aseguro que vais a usar el "for" incluso más que el "while".
Por supuesto, hay situaciones en las que el "for" no será útil. Por ejemplo, imaginemos que queremos que el usuario adivine un número.

var x = 7;

var y = 0;

while(y != x)
{
y = prompt('Introduzca un número del 1 al 10:');
if(y == x)
{
alert('¡Muy bien!');
}
else
{
alert('¡Mal! ¡Inténtelo de nuevo!');
}
}

En este caso, evidentemente, al comenzar no sabemos cuánto va a tardar el usuario en adivinar que el número es el 7. Sin embargo, este ejemplo nos sirve para dar un par de ejemplos curiosos.
En primer lugar, imaginemos que el usuario sólo puede tener 5 intentos para adivinar el número. En ese caso el bucle for podría tener algún sentido, aunque...

var x = 7;

for(var i = 0; i < 5; i++)
{
y = prompt('Introduzca un número del 1 al 10:');
if(y == x)
{
alert('¡Muy bien!');
}
else
{
alert('¡Mal! ¡Inténtelo de nuevo!');
}
}

Nos damos cuenta de que, si el usuario acierta antes de lo 5 intentos, a pesar de darle la enhorabuena, el programa vuelve a pedirle que introduzca un número hasta que haya gastado los 5 intentos. ¿Qué podemos hacer para evitar eso? Pues usar una palabrita que aprendimos la semana pasada: la palabra reservada break.

var x = 7;

for(var i = 0; i < 5; i++)
{
y = prompt('Introduzca un número del 1 al 10:');
if(y == x)
{
alert('¡Muy bien!');
break;
}
else
{
alert('¡Mal! ¡Inténtelo de nuevo!');
}
}

La palabra "break" siempre nos sacará fuera de la sentencia en la que estemos en ese momento. De este modo, si introducimos el "break" en un bucle, interrumpirá el bucle y seguirá la ejecución del programa después del bucle.
Sigamos con alternativas de este juego. Imaginemos ahora que vayamos a darle al usuario un número ilimitado de intentos (como al comienzo). Tenemos que volver a usar el bucle "while", pero, ¿os dais cuenta de que en el bucle "while" tenemos que inicializar la "y" a 0 antes de entrar en el bucle, mientras que en el "for" no, ya que no evalúa esa condición hasta después de haber entrado en el bucle?
Intentando explicarlo más claro: en el bucle "for", la condición para ver si seguimos en el bucle es que "i" sea menor que 5, ya que la condición del bucle son los intentos del usuario y no si ha acertado o no. De esta manera, "y" no se inializa hasta que no se hace el primer "prompt".
Sin embargo, en el bucle "while", como la idea es que tenga intentos ilimitados y salga del bucle cuando lo adivine, la "y" sí está en la condición, y debe estar inicializada antes de ser evaluada, así que antes de empezar el bucle tenemos que inicializarla a 0 y luego, en el primer "prompt", cambiar su valor. ¿No se podría hacer algo más eficiente?
Pues, efectivamente, se puede. Porque hay un tercer tipo de bucle, el conocido como bucle "do...while".

var x = 7;

do
{
y = prompt('Introduzca un número del 1 al 10:');
if(y == x)
{
alert('¡Muy bien!');
}
else
{
alert('¡Mal! ¡Inténtelo de nuevo!');
}
}
while(y != x)

Como vemos, esta alternativa nos permite recorrer el contenido del bucle la primera vez sin haber evaluado ninguna condición. O sea, cuando el programa encuentra la palabra "do", entra y ejecuta lo que encuentre hasta que se encuentre, más abajo, con el "while", momento en el que evalúa si la condición es verdadera o no y decide si el bucle se repetirá una segunda o tercera o n-ésima vez. De este modo nos hemos librado de inicializar la "y" antes de entrar en el bucle, ya que cuando entra en el "do" no se evalúa ninguna condición.
Sin embargo, podemos comprobar que la misma condición se evalúa dos veces, ya que, aunque no exactamente iguales, pero la condición del "if" y del "while" vienen siendo lo mismo. ¿No hay otra manera de optimizar esto para no estar evaluando una y otra vez lo mismo? Pues, efectivamente, lo hay, aunque esto más que algo nuevo es un truco que podríais haber deducido por vuestra cuenta con los conocimientos que tenéis hasta el momento:

var x = 7;

do
{
y = prompt("Introduzca un número del 1 al 10:");
if(y == x)
{
alert('¡Muy bien!');
break;
}
alert('¡Mal! ¡Inténtelo de nuevo!);
}
}
while(true)

Analicemos el código poco a poco.
  • En primer lugar, inicializamos, como llevamos haciendo todo el rato, la "x" a 7, que será el valor que el usuario deberá adivinar.
  • En segundo lugar entramos en el bucle "do...while" sin evaluar ninguna condición, tal como es este tipo de bucle.
  • Pedimos al usuario por "prompt" que introduzca un número.
  • Ahora evaluamos la única condición real. En caso de que el usuario haya adivinado, lo felicitamos con un "alert" y salimos del bucle mediante el "break".
  • No necesitamos usar un "else" ya que, al tener el "break", si seguimos dentro del bucle significará que el usuario no adivinó el número, y le soltamos por "alert" que lo intente de nuevo.
  • Finalmente, recordemos que tanto para sentencias condicionales como para bucles, las condiciones son operaciones lógicas que acaban dando un resultado booleano, de modo que nos saltamos toda la operación y le introducimos directamente "true" dentro del "while". De esta manera, el bucle se ejecutará infinitamente hasta que encontremos un "break", o sea, cuando el usuario adivine el número. Como ya he comentado alguna vez, hay que tener MUCHO cuidado con los bucles infinitos, siempre hay que encontrar alguna forma de que se pueda salir (sea mediante condición o mediante un "break").
Y, de momento, eso es todo lo que necesitamos saber sobre los bucles. No son todos los que hay (igual que aún tampoco sabemos todas las sentenias condicionales) pero son los que más necesitaréis de momento. Y ahora, aunque no esté publicando sus resoluciones (todo caerá), de todos modos aquí van unos ejercicios, ¡ya que esto no se aprende si no se practica!

EJERCICIO 1

En primer lugar, el primer programa que tendremos que desarrollar esta semana pedirá al usuario un número del 1 al 10 y escribirá la tabla de multiplicar de dicho número, en un formato parecido al de los primeros ejercicios que hicimos.

EJERCICIO 2

En segundo lugar, modificaremos el anterior programa para ir escribiendo toda la tabla de multiplicar pero, a cada número, se pare a preguntar al usuario si quiere ver la siguiente línea. Mientras el usuario no diga que no, debe seguir escribiendo el siguiente número de la tabla infinitamente.

Y eso es todo por esta semana, la semana que viene esto empezará a ponerse realmente serio, así que recomendaría tener bastante claro todo lo que hemos dado hasta el momento, ya que lo necesitaréis. ¡Pásenlo bien!

lunes, mayo 21, 2012

Desentrañanado... Animal Man

El aventurero conocido como Animal Man obtuvo sus poderes cuando, de joven, se encontró una nave espacial cuya radiación le hizo conectarse con lo "Rojo", una fuerza que une a todos los animales del planeta. Desde entonces, Bernhard "Buddy" Baker ha actuado por épocas como el enmascarado superhéroe "Animal Man", lo cual no le ha impedido, en sus épocas de inactividad heróica, formar una familia con su novia del instituto, Ellen Frazier, con quien ha tenido dos hijos, Cliff y Maxine.
Las habilidades de Animal Man le conceden poder tomar "prestadas" por cortos plazos de tiempo las habilidades de cualquier animal, además de que su conexión a lo "Rojo" le hacen tener un gran apego por todas las formas de vida sentientes del planeta. Además, en una ocasión, Buddy llegó a ser completamente consciente de su existencia como personaje de cómic, incluso teniendo una conversación con su escritor, Grant Morrison.

domingo, mayo 20, 2012

The CubesPaper, Número XXIX (20/05/2012)

Sé que la semana pasada prometí que habrían más noticias... Las hay, en realidad, pero no muchas más. Lo siento, ¡pero también me escasea el tiempo! Bueno, a ver si puedo hacerlo mejor para la semana que viene. De momento, ¡esto es lo que tengo esta semana!

Se cancelan los "Marvel: Point One"
La falta de ventas ha llevado a la editorial a no publicar ningún cómic más de esta línea.

Fallece Emie Chan
A pocos días del fallecimiento de Tony Dezuñiga, otro popular autor filipino fallece.

Revelada fecha para la secuela de Sin City
Sin City: A Dame To Kill For será estrenada el 4 de octubre del año que viene.

Facebook sale a bolsa
La popular red social ha puesto 421.2 millones de acciones a la venta este pasado viernes.

sábado, mayo 19, 2012

Un Cubo en Alemania, Semana VI

6 6 6, the number of the beast!
Esto... que ya he emocionado. Eso, que ya es la sexta semana que escribo desde este país, aunque me cuesta creer que lleve tan poco tiempo aquí. Aunque al mismo tiempo parece que hace nada que les escribía desde Las Palmas. Sensaciones extrañas que tiene uno en estas situaciones.
¡Bueno! En esta semana he de reconocer que he trabajado bien poco. En parte debido a que el proyecto está casi terminado y la mayoría se basa en pruebas, en hacer pequeñas modificaciones y arreglos y en escaquearme un poco por la vagancia que da hacer esos últimos arreglos. Además de que, como lo termine, me mandarán hacer otra cosa, que todavía me quedan tres semanas más de trabajo, y el próximo proyecto seguro que no me da tiempo de terminarlo en lo que esté aquí.
Sin embargo, hay otros motivos por los que he trabajado poco esta semana. Uno de ellos es que el lunes, la escuela que nos aloja aquí, la OSZ IMT, nos convocaron para conocer por fin sus instalaciones, de modo que todos salimos antes del trabajo con dicho propósito. El otro es que este jueves fue el día de la Ascención del Señor, y, curiosamente, aquí en España ese día es festivo.
De este modo, el miércoles noche pude por fin acercarme a conocer el Halford, un local de metal bastante popular en esta ciudad que todavía no había sido capaz de encontrar, y que curiosamente no está muy lejos del Rock und Wikinger Bar, el sitio donde vengo parando desde que llegué. La verdad, poca diferencia entre ambos locales, aunque está bien siempre tener alternativas, y si están cerca entre ellas, mejor que mejor.
Y, finalmente, de turismo, además de algún paseo aleatorio que me he dado esta semana, hoy he visitado el Museo de Historia Natural de Berlín (Museum für Naturkunde), donde he podido ver montados esqueletos de animales tan extraordinarios como fueron el alosaurio, el diplodocus o (impresionante) el braquiosaurio.
Y nada, esta noche espero encontrar algún karaoke por la ciudad, porque hecho de menos berrear un poco, a ver qué ocurre. ¡Ya les contaré!

viernes, mayo 18, 2012

David Hasselhoff - Jump In My Car

El nombre de David Hasselhoff es uno de esos nombres que no suele dejar indiferente a nadie. Ya sea por Michael Knight en "El Coche Fantástico" o por Mitch Buchannon en "Los Vigilantes de la Playa" todo el mundo conoce a este actor que tantas pasiones despertó en los 80's. Lo que bastante menos gente sabe es que "Michael Knight" intentó también triunfar en el terreno musical, fallando estrepitosamente, aunque dejó tras de sí un par de discos que, si bien no son obras maestras, tampoco están tan mal. Entre estos discos destaca la canción Jump In My Car, cuyo vídeo musical encaja con la letra de la canción y que les incluyo ahora junto a la traducción:






Jump in my car
I wanna ta-ake you home
Come on and jump in my car
It's too far to walk on your ow-own


No thank you sir-ir
Ah, c'mon, I'm a trustworthy guy
No thank you sir-ir
Oh little girl I wouldn't tell you no lie
I know your ga-ame
How can you say that, we've only just met
You're all the sa-ame
Ooh, she's got me there, but I'll get her yet
I got you then
No you didn't, I was catchin' my breath 
And look it's startin' to rain and baby you'll catch your death
Well, I don't know-ow
Ah, come on it costs nothin' to try
And you'll arrive ho-ome nice and dry


ooh, jump in my car
I wanna ta-ake you home
jump in my car
it's too far to walk on your ow-own


jump in my car
I wanna ta-ake you home
C'mon and jump in my car
It's way too far to walk on your ow-own


Well maybe I wi-ill
Ah, that's better now, your talkin' sense
But you best keep still
Well, if you like I'll just put up a fence
No need to get smart
Well alright we'll soon be on our way
We better start
What for?
Because it's such a long way
Why, where d'you live?
I live down south, it's roughly eighty-four miles
Hey slow down, you must be jokin' there behind that cute smile
Oh, no I'm not
Well, if you're not there's only one thing to say
And what's that?
Get out the car, get on your way


Get out of my car
But you just said that you'd take me home
it's just too far
But there's no way that I can get there alone
I couldn't care less
Maybe I could see you next week
But you look a mess
But look who's talkin', you've got no right to speak
Get out of my car
You told me that you were a really nice guy
Well I aint
Yeah,get out of my car
Get out
Get out of my car


Salta a mi coche
Te quiero llevar a casa
Ven y salta a mi coche
Está muy lejos para andar por tu cuenta


No gracias señor
Ah, vamos, soy de fiar
No gracias señor
Oh pequeña yo no te mentiría
Conozco tu juego
Cómo puedes decir eso, nos acabamos de conocer
Todos sois iguales
Ooh, me ha pillado ahí, pero ya la pillaré yo
Te pillé entonces
No, no lo hiciste, estaba cogiendo aliento
Y fíjate está empezando a llover y, nena, te resfriarás a muerte
Bueno, no sé
Ah, vamos, no cuesta nada intentarlo
Y llegarás a casa a gusto y seca


Ooh, salta en mi coche
Te quiero llevar a casa
Salta en mi coche
Está muy lejos para andar por tu cuenta


Salta en mi coche
Te quiero llevar a casa
Vamos y salta en mi coche
Está muy lejos para andar por tu cuenta


Bueno, quizás lo haga
Ah, eso está mejor, estás entrando en razón
Pero más te vale mantener las distancias
Bueno, si lo prefieres montaré una valla
No hace falta hacerse el listillo
Bueno de acuerdo, pronto estaremos en camino
Mejor que empecemos
¿Por qué?
Porque es un camino muy largo
¿Por qué? ¿Dónde vives?
Vivo en el sur, a aproximadamente ochenta y cuatro millas
Eh para ahí, debes de estar bromeando detrás de esa linda sonrisa
Oh no, no estoy bromeando
Bien, si no lo estás haciendo sólo queda una cosa que decir
¿Y cuál es?
Sal del coche, vete por tu cuenta


Sal de mi coche
Pero acabas de decir que me llevarías a casa
Pero es muy lejos
Pero no hay manera en que pueda llegar sola
No me podría importar menos
Quizás podríamos vernos la semana que viene
Pero si estás echa un desastre
Mira quién habla, no tienes derecho para hablar
Sal de mi coche
Me dijiste que eras un chico realmente bueno
Bueno no lo soy
Sí, sal de mi coche
Sal
Sal de mi coche



Canción y vídeos muy divertidos y que demuestran una capacidad de autoparodia del actor bastante grande. Además, la canción es realmente pegadiza. Espero que lo hayan disfrutado.

jueves, mayo 17, 2012

(Reseña de cine) Los Vengadores

¡Primera reseña que escribo desde Alemania! O lo que es lo mismo, primera reseña desde que estoy aquí que no fue programada en los meses anteriores a venirme. Sea como sea, como ya les he contado en los post de los sábados, hace unas semanas aproveché para ir a ver la película The Avengers en un cine berlinense donde ponen las películas en versión original, y aquí está mi opinión.
Como supongo que todos sabéis, Marvel empezó a preparar el proyecto de la película que reuniría a los Héroes Más Poderosos de la Tierra en 2008 con el estreno de Iron Man. A esta película la sucederían El Increíble Hulk, Iron Man 2, Thor y Capitán América: El Primer Vengador para, por fin, dirigida por Joss Whedon, reunir a todos estos personajes en una misma cinta.
La película nos muestra como Loki ha hecho un trato con los skrulls (perdón, "chitauri") de entregarles el poder del Cubo Cósmico (perdón, el "teseracto") a cambio de ayudarle a subyugar la Tierra. Para lograrlo, Loki viaja hasta dicho planeta y somete la voluntad de algunos miembros de SHIELD, entre ellos Clint Barton (mejor conocido como Ojo de Halcón) para que le ayuden a conseguir dicho objeto. Pero el director de la organización espía lleva años preparándose para una situación así, por lo que sólo tiene que hacer unas cuantas llamadas y un equipo de resistencia está formado: los Vengadores.
Reconozco que tenía muy pocas expectativas de la película. De por sí todas las anteriores me habían parecido entre malas y aceptables, y el hecho de que Joss Whedon estuviera al mando tampoco me hacía mucha gracia, aparte de que los trailers no me decían demasiado tampoco. Al final la película ha estado entretenida, ha tenido momentos bastante guays y la acción ha sido estupenda. Además, ha llevado un ritmo bastante bueno por lo que no me dí cuenta de lo larga que era (a pesar de pasarme casi toda la película con ganas de ir al baño), aunque tarda un poco en coger dicho ritmo. Pero tiene dos grandes problemas. El primero es muy típico de Whedon: toda la película está llena de chascarrillos tontos, que unos cuantos chistes están bien, pero esta película parecía una comedia, y llegó un momento en el que cansaba. Además, la mayoría de esos chistes intentaban buscar la simpatía de los frikis, ya que muchos eran referencias al cómic. El segundo de los problemas es algo que esperaba que no hicieran en esta película, ya que lo han hecho en todas las que nos llevaban hasta ella, y es que no terminan de meter toda la carne en el asador, la película parece una versión light de lo que podrían haber hecho, siempre intentando dejar "algo" para una segunda parte. Y no digo que debieran haber metido a (censurado por SPOILER) en esta película en vez de dejarlo pendiente para la siguiente, ni haber metido a más enemigos o más héroes, no, nada de eso. A lo que me refiero es que tiene la pinta de un piloto de una serie de televisión, en la que te están preparando para en episodios futuros mostrarte lo bueno, más que de una película que, por el formato que es, debería ser autoconclusiva (aunque luego hagan secuelas). Y, como digo, lo podía aceptar en las cinco películas anteriores, pero ya empieza a aburrir.
Las actuaciones, la verdad, bastante malas en su mayoría. Mark Ruffalo no interpreta en toda la película (al menos Edward Norton, aunque no me gustara su Bruce Banner, interpretaba algo), Scarlett Johansson sólo sabe intentar ponerse muy sexy, Chris Evans ha perdido todo el respeto que le cogí en la anterior película e incluso Tom Hiddleston deja que desear después del genial papel que interpretó en Thor. RObet Downey, Jr. se hace bien al papel que le han dado, aunque para mí ese papel no es Tony Stark, el papel de Nick Furia es perfecto para Samuel L. Jackson, Chris Hemsworth mejora mucho su actuación como el dios del trueno y, para mí, la mayor sorpresa ha sido Cobie Smulders como Maria Hill, distanciándose completamente del único personaje que la había visto interpretar (Robin Scherbatsky en How I Met Your Mother). Y el resto, ni fu ni fa.
Los efectos especiales... Bien, pero nada del otro mundo. Incluso habiéndola visto en 3D, no me parecieron la cosa tan espectacular que debían de haber sido. Incluso Thor me impresionó más, y no la ví en 3D.
Finalmente, un cabreo personal, referente a los "chitauri". Cuarenta años de cómics, cuarenta malditos años de cómics, y porque Mark Millar haya decidido en un cómic que encima pertenece a una nueva continuidad llamarlos "chitauri", ¿y ahora para todo el mundo los "skrulls" se llaman "chitauri"? Que soy fan de la obra de Millar como el que más, pero me ha parecido francamente horrible, y sobre todo teniendo tan reciente cómics como la Secret Invasion, o el propio hecho de que Millar dejara claro con una pequeña referencia en un episodio que los chitauri eran la versión Ultimate de los skrulls (diciendo que, en otros planetas, los llamaban skrulls). Y bueno, lo de llamar "teseracto" al cubo cósmico, no sé de dónde ha venido...
En definitiva, una película interesante y amena, pero que falla en demasiadas cosas en que no debería fallar, sobre todo considerando el calibre del proyecto, un proyecto con el que deberían guardar hasta el mínimo detalle. Pero bueno, considerando la cantidad de frikis a los que les importaba bastante poco una buena historia y sólo querían ver a los "Vengadores" dando leches sin importar por qué, la mayoría de las expectativas han sido cubiertas y el éxito de taquilla estaba garantizado...

miércoles, mayo 16, 2012

(Reseña de cómic) The Ultimates Vol.1 #7-13: Homeland Security

Después del espectacular primer arco de esta serie en el que la versión definitiva de los Vengadores se enfrentaron al mismísimo increible Hulk, la serie continuó durante siete números más en un segundo arco llamado Homeland Security ("Seguridad nacional"), llevando al mismo equipo creativo.
Tras los acontecimientos ocurridos al final del anterior arco, Nick Furia intenta organizar a su equipo para hacer frente al primer enemigo real del grupo, unos alienígenas multiformes llamados "Chitauri" (mejor conocidos por los marvelitas como "skrulls") que en su día ayudaron a los nazis, pero las cosas se complican cuando el Capitán decide ir a ajustar las cuentas con el Hombre Gigante tras la paliza que el susodicho le ha dado a su esposa, la Avispa.
Este segundo arco se caracteriza, en su mayoría, por ser bastante más caótico que el primero. Salvo por la parte de los Chitauri, todo lo demás que ocurren son realmente simples consecuencias de los seis primeros números, y de hecho durante los primeros números de este arco la trama principal se ve muy relegada mientras ocurren estos acontecimientos. El estilo Millar sigue brillando aunque tal vez todo esto provoque que sea un poco menos interesante que los primeros seis números, aunque deja momentos memorables, como el papel de Hulk en esta historia. Además, el hecho de que se añadan nuevos héroes (en concreto los nuevos Vengadores del Capitán América: la Viuda Negra, Ojo de Halcón, Mercurio y la Bruja Escarlata) ayuda a que la historia se haga amena y entretenida.
El dibujo de Bryan Hitch sigue en la misma línea que en la anterior parte, siendo espectacular pero al mismo tiempo teniendo algunos pequeños problemas que no terminan de convencer, pero, al igual que en la primera parte, se perdona porque, en conjunción con el guión de Millar, da un resultado impecable.
Un arco que, si bien no es tan genial como el primero, no es para nada malo, y que ayudará a hacer las delicias de aquellos que gusten de combates superheróicos espectaculares.

martes, mayo 15, 2012

Tutorial de desarrollo web, Parte XXXII: Sentencia condicional "Switch"

Por mucho que la semana pasada haya dicho que ya sabéis todas las cosas básicas para programar, eso no significa que ya seáis expertos programadores. Lo siento, pero nada más lejos de la realidad, hoy empezamos ya a ver una serie de nuevos elementos que, como podréis comprobar, se podrán "traducir" a lo que ya sabemos hasta ahora, pero usándolo de estas nuevas maneras nos ahorrarán tiempo. Pero, antes de comenzar, los ejercicios de la semana pasada.
Bien, recordaréis que hace dos semanas dimos la sentencia condicional, en la cual podíamos decirle a nuestra aplicación que se ejecutara de una manera u otra dependiendo de si cumplía una determinada condición. De esta manera, podríamos ver uno de estos dos ejemplos:

// Ejemplo 1
if(edad > 18)
{
document.write("Bienvenido a nuestra página.");
}

// Ejemplo 2
if(edad > 18)
{
document.write("Bienvenido a nuestra página.");
}
else
{
document.write("Necesista autorización paterna para acceder.");
}

Antes de continuar, quiero aclarar que esas dos barras ("//") que estoy incluyendo en muchos fragmentos de código son comentarios en JavaScript (como cuando vimos los comentarios de HTML y de CSS). En JavaScript podemos hacer estos comentarios (que duran, como hemos visto hasta ahora, desde el momento en que se introducen hasta el final de la línea) o del mismo modo que en CSS (/* Los comentarios se incluirían aquí en medio */). Como recordaréis, los comentarios eran útiles no sólo para recordar qué estamos haciendo en ese momento, sino también para poder localizar facilmente distintas partes de un documento. Y ahora que estamos programando, le encontraremos mucha más utilidad.
Como podemos ver en esos ejemplos, podemos hacer sentencias condicionales en las que, si se cumple una condición ocurra algo, sin que ocurra nada en caso de no cumplirse la condición (ejemplo 1), o sentencias en las que, dependiendo de si se cumple la condición, ocurra una cosa o la otra (ejemplo 2). Por supuesto, gracias a la segunda manera de la estructura podríamos también  hacer algo así:

if(edad > 18)
{
document.write("Bienvenido a nuestra página.");
}
else if (edad < 2)
{
document.write("Usted es demasiado joven para navegar en internet.");
}
else
{
document.write("Necesita autorización paterna para acceder.");
}

Recordemos que hace dos semanas dijimos que las llaves ("{}") podían ser ignoradas en caso de que sólo se incluyera una sentencia dentro del "if" o del "else". Como una estructura condicional entera se considera una única sentencia (aunque contenga muchas sentencias en su interior, están agrupadas en una sóla) podemos crear lo que llamamos el "else if", en el cual creamos una segunda condición, que sólo se evaluará si la primera condición ha fallado. Veámoslo parte por parte:
  1. Para empezar, nuestra aplicación evalúa si "edad" es mayor que 18. En caso de ser positivo, el programa accederá al contenido del "if" y escribirá "Bienvenido a nuestra página". Siguiendo leyendo, el programa verá que hay un "else", pero como se ha cumplido la condición, decide saltarse el contenido de dicho "else". El contenido de dicho "else" es el segundo "if", así que saltará hasta el final del ejemplo, ignorándolo.
  2. En caso de que "edad" sea menor de 18, la aplicación saltará al "else" y se encontrará en este caso con un segundo "if", donde tendrá que evaluar si "edad" es menor que 2. En caso de ser así, entrará, escribirá "Usted es demasiado joven para navegar en internet." y se saltará el "else" que le corresponde, terminando la ejecución.
  3. Finalmente, si "edad" es mayor que 2, también se saltaría esta segunda condición y pasaría al segundo "else" (que corresponde a este segundo "if"), escribiendo "Necesita autorización paterna para acceder.".
Una práctica habitual entre programadores, que además la mayoría de los editores suelen ayudar a hacer, es mostrar la jerarquía mediante espacios o tabulaciones. Por ejemplo, el código anterior podría quedar así:

if(edad > 18)
{
   document.write("Bienvenido a nuestra página");
}
else if(edad < 2)
     {
         document.write("Usted es demasiado joven para navegar en internet.");
     }
     else
     {
         document.write("Necesita autorización paterna para acceder.");
     }

De este modo sabemos a qué "if" pertenece cada "else". Este caso no es muy habitual que se jerarquice así, ya que el "else if" (o "elseif" en algunos lenguajes) es ya considerada una estructura por sí misma, pero si os ayuda a aclararos, estaría bien colocarlo así.
Bien, de este modo, que con un poco de imaginación podríais haber inventado vosotros, está bien en situaciones en las que hay tres o cuatro situaciones. Pero, ¿os imagináis el coñazo que debe ser ir haciendo "else if" para una aplicación que, por ejemplo, reciba un número, y escriba el mes del año que le equivale? Por suerte, para esto tenemos una sentencia conocida como switch.
El "switch" es una sentencia condicional que evalúa el valor de una variable y, dependiendo de su valor, ejecutará unas instrucciones u otras. Por ejemplo:

var x = 3;


switch(x)
{
case 1:
document.write("Uno");
break;
case 2:
document.write("Dos");
break;
case 3:
document.write("Tres");
break;
default:
document.write("Número muy grande");
break;
}

No creo que les sea muy difícil deducir cómo funciona esta estructura, pero vamos a empezar a explicar. La estructura "switch" coge el valor de una variable (en nuestro caso "x") y lo evalúa. En nuestro ejemplo, la variable "x" vale 3, de modo que el "switch" saltará al caso 3 y ejecutará todas las instrucciones que se encuentren en su interior. En este caso, al entrar en el caso 3, el documento escribirá "Tres" y luego, al encontrarse con la instrucción "break" (la cual obliga a salir de la sentencia en la que se encuentra), se para la ejecución del "switch" y se continuará ejecutando lo que haya después de la llave de cerrado de esta sentencia.
Destacar que el "break" es importante ya que, en caso de no existir, el navegador seguiría ejecutando las instrucciones que encuentre debajo, aunque pertenezcan a otro caso. En nuestro ejemplo, si faltara el "break", el documento escribiría "Número muy grande" después de "Tres", ya que es la siguiente instrucción que se encuentra. En algún caso, esto puede resultarnos interesante, si tal vez queremos que varios casos hagan lo mismo, pero en principio recomiendo no olvidarse nunca del "break".
Finalmente hay que destacar el caso "default" el cual vendría a ser como el "else" del "switch": si se introduce un valor no contemplado por ninguno de los casos, se ejecutará lo que contenga el "default".
Para intentar entender mejor el "switch", voy a escribir la sentencia "if" equivalente al anterior código:

var x = 3;


if(x == 1)
{
document.write("Uno");
}
else if (x == 2)
{
document.write("Dos");
}
else if (x == 3)
{
document.write("Tres");
}
else
{
document.write("Número muy grande");
}

Como veis, usando la sentencia "switch" nos hemos ahorrado mucho lío de código con muchos "if" anidados. Y habrá casos en que esto sea una lista mucho más larga, por lo que será mucho más cómodo usar la sentencia "switch".
¿Cuándo usar "switch" y cuándo usar "if"? Realmente eso será a elección del usuario, pero es evidente que hay momentos en que el "switch" no se podrá usar. Como habéis visto hasta ahora, el "switch" sólo sirve para valores exactos, de modo que si queremos evaluar si un valor es "mayor" o "menor" que otro, la sentencia "switch" será bastante inútil.
También cabe destacar que la sentencia "switch" también admite otros valores distintos a los enteros (que son los que hemos usado hasta ahora). Por ejemplo, haciendo un caso inverso a lo que hicimos antes:


var x = 'Tres';


switch(x)
{
case 'Uno':
document.write(1);
break;
case 'Dos':
document.write(2);
break;
case 'Tres':
document.write(3);
break;
default:
document.write("Número muy grande");
break;
}


Simpático, ¿no?
Bien, pues de momento eso es todo lo que tenemos que saber sobre los "switch". La semana que viene empezaremos a ver alguna forma alternativa de los bucles.

EJERCICIO


Mencioné a lo largo del artículo un posible ejercicio en el que, al introducir un número, el ordenador devolviera el nombre del mes. ¿Os parece muy fácil? Bueno, el ejercicio que les voy a proponer es algo más difícil que esto:
A través de tres ventanas de prompt deberemos pedir al usuario un día del mes, un mes (del 1 al 12) y un año. En caso de que uno de los tres datos esté mal deberá salir un mensaje que diga "Escriba una fecha correcta", pero si está bien, deberá decir "Día DD del MMMM del YYYY" sustituyendo "DD" con el número del día, "MMMM" con el nombre del mes y "YYYY" con el año.
A la hora de comprobar si una fecha es correcta, recordemos que hay meses con 28, 30 y 31 días. Además, podemos aprovechar el ejercicio de la semana pasada para comprobar si el año introducido es bisiesto y, por tanto, febrero tiene 29 días.

Y con esto termina otra semana más de tutorial. La semana que viene, ¡más!

lunes, mayo 14, 2012

Desentrañando... Lobezno

James Howlett nació a finales del siglo XIX en Alberta, Canadá, hijo de John y Elizabeth Howlett, aunque su auténtico padre era Thomas Logan, el cuidador de las tierras de los Howlett, a quien James mató tras ver cómo mataba al que el creía su padre, manifestándose por primera vez su mutación, la cual le concedió unas garras de hueso que salían de sus manos.
Adoptando el nombre "Logan", James huyó con su amiga de la infancia Rose O'Hara, mientras el hijo legítimo de Thomas, "Dog"Logan, denunciaba la muerte de su padre, supuestamente a manos de la chica. Desgraciadamente, Dog los encontró e intentó acabar con la vida de ambos, aunque, en la pelea con James, Rose acabó muerta a manos del mutante al interponerse en medio de ambos, por lo cual "Logan" se autoimpuso el exilio y empezó a vivir con los lobos.
Adoptando por completo el nombre de Logan, el mutante conocería a Zorra Plateada, con quien mantuvo una relación hasta que Victor Creed, otro mutante con los mismos poderes que Logan, acabaría con la vida de la chica y derrotaría a su igual. Gran cantidad de peripecias le haría participar en ambas Guerras Mundiales, lo cual lo acabaría llevando a China, donde conocería a Itsu Akihiro, quien sería asesinada por el Soldado de Invierno, no sin antes haber concebido a un niño al que el mutante Romulus sacó del útero para salvarlo, creciendo para convertirse en Daken.
Con el tiempo, Logan acabaría trabajando para la CIA y luego enviado al Equipo X, donde sus memorias fueron parcialmente borradas. Finalmente fue secuestrado por el Programa Arma X, donde experimentaron con él, uniendo sus huesos a un metal indestructible llamado "adamantium" y borrando todos sus recuerdos, sustituyéndolos por recuerdos falsos, y donde le hicieron cometer atrocidades, hasta que consiguió escapar, matando a la mayoría de los miembros del proyecto.
Durante un tiempo, Logan vivió como un animal salvaje, hasta que fue encontrado por James y Heather Hudson, los cuales le devolverían su humanidad y lo convencerían para unirse al Departamento H de Canadá, donde formaría parte de "The Flight", un grupo de superhéroes. Junto a este grupo, Lobezno se enfrentó al mismísimo increíble Hulk, hasta que el Profesor-X, mentor de los X-Men, lo convenció para convertirse en un miembro de sus X-Men, donde se enamoraría de Jean Grey, por lo cual mantendría durante muchos años una fuerte rivalidad con Cíclope, el líder del grupo.
A lo largo de los años, Lobezno se ha convertido en uno de los miembros más notables de los X-Men y, a pesar de su natural recelo hacia todo, cree en el sueño de Xavier y es uno de los hombres en los que el profesor más confía, además de haber forjado gran amistad con miembros como Rondador Nocturno, Coloso o Bestia, además de ser una figura paternal para reclutas más jóvenes como Kitty Pride o Júbilo. Pero, a pesar de todo esto, y de todas las aventuras que el mutante ha corrido junto al grupo, Lobezno sigue siendo un lobo solitario y, como tal, le gusta luchar sus batallas solo, sobre todo cada vez que su pasado, el cual no recuerda, vuelve para atormentarle, destacando sobre todo su archienemigo Dientes de Sable, quien había asesinado a Zorra Plateada, aunque ella mismo también volvió de la muerte.
En una de sus misiones con los X-Men, Lobezno ataco a Magneto, quien se lo devolvió arrabcando el adamantium de sus huesos, acto al que Lobezno sobrevivió por poco, y a partir de entonces estuvo viviendo durante una temporada sin dicho metal en su interior, por lo que su proceso de mutación se aceleró, ya que su factor curativo había estado siempre ocupado intentando expulsar el material de su cuerpo, hasta que Génesis le volviera a inyectar el material en cuestión.
Con el tiempo, Lobezno ha llegado incluso a convertirse en un miembro de los Vengadores, y comparte su tiempo entre dicho equipo, los X-Men, y sus propias aventuras en solitario.

domingo, mayo 13, 2012

The CubesPaper, Número XXVIII (13/02/2012)

Otra semana en el que las noticias son escasas, pero, afortunadamente, hoy me ha dado por probar el navegador Opera, el cual funciona bastante bien en este ordenador, por lo que para la semana que viene mi búsqueda de noticias probablemente sea bastante más fructífera. Entre tanto, ¡disfruten de lo de esta semana!

Marvel anuncia "Los primeros X-Men"
Un nuevo teaser de la compañía anuncia que llegarán en agosto.
Más información ZonaNegativa ComicBookResources

Fallece Tony DeZuñiga
El artista filipino ha fallecido al poco de haber sobrevivido a un infarto.
Más información: ZonaNegativa ActualidadComic

Nuevo juego de los Vengadores
Ubisoft y Marvel unen fuerzas para crear "The Avengers: Battle for Earth".
Más información: Marvel.com ComicAlliance ComicVine ComicBookResources">