domingo, 31 de agosto de 2008

WALL∙E y los deportes...

El básquetbol



El Baseball



Futbol síííi



Con el hula hula

viernes, 29 de agosto de 2008

WALL∙E conoce a....

Algunas aventuras del pequeño robot.

WALL∙E conoce a una aspiradora...



WALL∙E conoce a un imán...



WALL∙E conoce a un hidrante...

martes, 26 de agosto de 2008

SÍ NO PUEDEN ¡RENUNCIEN!

Vale la pena escucharlo y recordarlo siempre...


sábado, 23 de agosto de 2008

jueves, 21 de agosto de 2008

Misterios de la historia(y de las olimpiadas)

¿Qué tienen en común Michael Phelps, 8 medallas de oro, Hitler, y las olimpiadas de Munich 72?
...
...
...
Escuchemos a este conductor de la televisión venezolana que nos develará esta gran incógnita



sin palabras :O

lunes, 11 de agosto de 2008

Estas viendo y no ves



Resulta que así como dice el titulo, estas viendo pero no lo verás,
Científicos de la Universidad de Berkley en California hicieron un material es que capaz de desviar la luz, y así nuestro ojo no lo puede ver.

Citando de la noticia:

La forma en que los científicos de Berkeley pueden desviar la luz de los objetos es con una capa o cobertura de llamados metamateriales de manufactura artificial en laboratorio que "doblegan" el espectro de luz.

Los metamateriales son elaborados con mezclas de metales y fibras, como el teflón y fibras sintéticas, que desvían microondas, luces y reflexiones.

El director del otro equipo científico dijo que el proyecto está lejos de tener a una persona que pudiera caminar por las calles sin que nadie la viera en su trayecto.

Que divertido, ¿apoco no?

sábado, 9 de agosto de 2008

Albañileria de gran escala en el DF

Pues resulta que estaba yo vagando por el internet (es decir estaba de ocioso) me encontré este video que muestra varios proyectos de grandes construcciones que se tienen para la Ciudad de México, hay unos muy padres, algunos ya están en construcción (como la sede del Senado) y otros son sólo ideas, otros más estan en el limbo, como la Torre del Bicentario porque dicen que sí se hace, que no se hace, que sí, que no, quién sabe... el punto es que hay mucha inversión en construcción en el DF, y eso suena y se ve bien.


viernes, 8 de agosto de 2008

¿Un oscar al Guasón?


Después de ver The Dark Knight lo que uno más tiene a recordar es la gran actuación del Guasón.
Pero ¿es realmente tan buena como para que sea considerado al Oscar?
Según cuentan a la Academia no le agran mucho estos blockbusters del verano, y en general nunca reciben premios ni siquiera nominaciones.
No obstante hay muchos foros, comentarios, y rumores en internet que hablan del posible oscar al desaparecido Actor.
Críticos del periodico NYP, de la revista Rolling Stone, y de otrás prestigiadas revistas y columnas de cine apoyan la idea de la nominación al Oscar.
No se si lo deba ganar, pero creo que una nominación si lo vale.
Es una gran película que tiene como cereza del pastel al mejor Joker que ha existido.

jueves, 7 de agosto de 2008

Una boda en una galaxia muy muy lejana... (o no tanto)


Resulta que una boda con el tema de Star Wars no fue sólo una idea algo fumada. Sino que realmente ha sucedido. Y para muestra unos videos y fotos.


La siguientes son albumes completos de más fotos de una boda de estilo Star Wars.

Creo que lo que más me gusto a mi (a parte de los muñequitos del pastel) es este duelo de espada láser en lugar del tradicional y a veces aburrido vals.




Es curioso y divertido pero no lo haría para mi.
Es muy extremo, digamos que soy más tradicionalista :P

martes, 5 de agosto de 2008

Tips para el SCJP VI

Creando objetos
Thread[] threads = new Thread[5];
Son importar que el código pareciera decir lo contrario. El constructor de Thread no esta siendo invocado. No estamos creando una instancia de Thread, sino un arreglo de objetos. Es decir no existen hasta ahora objetos Thread.

Debido a ciertos atajos de sintaxis es posible crear objetos sin usar la palabra reservada new.

Si tenemos un arreglo de objetos, este arreglo no guarda los objetos, como lo haría un arreglo de primitivas, sino que guarda referencias a estos objetos.

Los arreglos tienen una variable publica llamada length que da el número de elementos caben en el arreglo. No obstante no nos dice si los elementos ya han sido inicializados.

int[] dots = {6,x,8};
La línea anterior realice 4 cosas:
  1. Declara una referencia a un arreglo de ints llamado dots
  2. Crea un arreglo con un tamaño de 3 (tres elementos).
  3. Llena el arreglo con los valores 6, 9 y 8.
  4. Asigna el nuevo arreglo a la referencia dots.

Esta sintaxis funciona de la misma manera para objetos.

Perro perrito = new Perro("Nash");
Perro[] misPerros = {perrito, new Perro("Blacky"), new Perro("Nala")};

Y por supuesto también se puede usar esta sintaxis para arreglos multidimensionales
int[][] scores = {{5,2,4,7}, {9,2}, {3,4}};

Existe también otra forma de crear arreglos e inicializarlos, para después asignarlos a una referencia que ya había sido declarada
int[] testScores;
testScores = new int[] {4,7,2};

Los arreglos de primitivas aceptan cualquier valor que pueda ser promovido implícitamente al tipo declarado. Es decir un arreglos de int puede aceptar cualquier variable menor de 32 bits.
int[] weightList = new int[5];
byte b = 4;
char c = 'c';
short s = 7;
weightList[0] = b; // OK, byte mas pequeño que int
weightlist[1] = c; // OK, char mas pequeño que int
weightList[2] = s; // OK, short mas pequeño que int

Para arreglos de objetos, es posible colocar subclases del tipo declarado dentro del arreglo.
Si el arreglo es declarado de tipo de alguna interfaz, entonces los elementos pueden hacer referencia a una instancia de cualquier clase que implemente esa interfaz.

Bloques de inicialización
Los bloques de inicialización son un lugar donde pueden realizarse operaciones. Estos corren cuando la clase es cargada (bloque de inicialización static) o cuando una instancia es creada (bloque de inicialización de una instancia)
class Ejemplo {
static int x;
int y;
static { x = 7 ; } // static init block
{ y = 8; } // instance init block
}

Los bloques de instancia se ejecutan después de la llamada a super dentro del constructor. Es decir después que todos los super constructores haya sido ejecutados.

Puede haber múltiples bloques de inicialización dentro de una clase. Es importante notar que a diferencia de los métodos o constructores, el orden en el que aparecen es importante. Cuando estos son ejecutados el orden es de arriba hacia abajo.

Utilizando los Wrappers o envoltorios.

  1. Son clases que están correlacionadas con los tipos primitivos
  2. Tienen dos funciones principales
  3. Envolver a los tipos primitivos para que puedan ser manejados como objetos
  4. Proveer métodos para conversión entre ellos
  5. Los métodos más importantes son:
  6. xxxValue() regresa un tipo primitivo (intValue,longValue, etc)
  7. parseXxx() Toma un String y regresa un tipo primitivo (parseInt,parseDouble,etc)
  8. valueOf() Toma un String, regresa un objeto envuelto

Autoboxing
Desde Java 5 existe algo que se llama Autoboxing que permite manejar un tipo Wrapper como si fuera un tipo primitivo por ejemplo:
Integer y = new Integer(567); // Crear objetos
y++; // quita el enovoltorio, lo incremente y pone el envoltorio
System.out.println("y = " + i); // imprimir
Este código pareciera usar el operador de incremento en un objeto. Pero lo que realmente sucede es que el compilador hace el trabajo por ti.

Cuando la JVM ve un método que toma un tipo primitivo pero que no concuerda exactamente entonces busca ampliarlo al siguiente tipo primitivo. Es decir short se puede pasar a int.

La pregunta que surge es, ¿el compilador prefiere ampliar una primitiva o usar el Autoboxing y los envoltorios?. La respuesta es, el compilador prefiere ampliar un tipo primitivo. Es decir si el compilador ve un short lo hara int antes que hacerlo Short.

Lo importante es entender que la ampliación de tipos se basa en herencia. Es decir usa una prueba de la relación “Es Un”. Por lo tanto no es valido decir que Short Es Un Integer.


En resumen:
  1. La ampliación de tipos primitivos usa el más pequeño argumento posible.
  2. Usados individualmente, el autoboxing y los Var-args son compatibles con la sobrecarga
  3. No se puede realizar la ampliación de un tipo envoltorio a otro (Prueba de Es Un va a fallar)
  4. No se puede ampliar y luego realizar el autoboxing (int no se puede convertir en Long)
  5. Pero si se puede realizar el autoboxing y luego ampliar (un int se vuelve vuelve un Integer, mediante Object)
  6. Se puede combinar Var-args con ampliación o autoboxing
  7. Usar == con envoltorios es engañoso. Ya que valores iguales y pequeños darán == verdadero, pero para valores mayores a 128 ya no.

Recolección de basura
  1. La recolección de basura provee un manejo de memoria automatizado
  2. El propósito de la GC es borrar objetos que sea inalcanzables
  3. Solo la JVM decide cuando ejecutar el GC, aunque tu puedes pedirlo.
  4. No puedes conocer con certeza el algoritmo que usa el GC
  5. Los objetos deben de ser considerados elegibles antes de que puedan ser recolectados
  6. Un objeto es elegible cuando ningún hilo vivo puede alcanzarlo
  7. Para alcanzar un objeto, debe haber una referencia viva a ese objeto
  8. Las aplicaciones Java se pueden quedar sin memoria
  9. Existen formas para decir a la JVM que puede eliminar a un objeto si lo desea.
  10. La primera es poner la referencia a ese objeto a null.
  11. También se puede cambiar la referencia de un objeto a otro.
  12. La tercera forma es cuando existen instancias que hacen referencias circulares entre sí pero no hay forma de acceder a alguna de ellas “desde afuera”.
  13. El método finalize por un objeto puede ser ejecutado, pero no debes de confiar en ello. Así que no pongas código en ese método. De hecho se recomienda no sobrescribir el método finaliza nunca.

viernes, 1 de agosto de 2008

Profanadores de tumbas


Este libro de Brad Geagley trata sobre un Sherlock Holmes de hace varios siglos (milenios incluso).

Sucede un asesinato de una sacerdotiza en Tebas y un hombre llamado Semerket, el cual tiene problemas con su ex-esposa y sobre todo con el vino, tiene que resolver este asesinato.
Durante las indagaciones Semerket se da cuenta de que no es sólo un asesinato sino un gran complot en contra de alguién poderoso.

Es un libro con referencias históricas ya que en verdad sucedió una conspiración en esos tiempos y hay papiros que lo prueban. Es un libro de tamaño normal poco menos de 400 páginas pero que es tan simple y sencillo de leer que en unos pocos (muy pocos) días se puede terminar.

Aún cuando no te interese la civilización egipcia o las novelas históricas los recomiendo ampliamente.
Vale la pena.

Tips para el SCJP V

Primero hablemos de como se representan en Java los diferentes tipos primitivos y los objetos. Después tenemos el tema de como trabaja Java el paso de parámetros por referencia, pero no como C o C++ lo cual es muy importante entender.

Representaciones de números y valores

  1. Existen tres formas de representar números enteros en Java, decimal (base 10), octal (base 8 ) y hexadecimal (base 16).
  2. Los números octales solo usan números del 0 al 7. En Java se representan colocando un cero al inicio del número. Ejemplo :070
  3. Los números hexadecimales pueden usar 16 símbolos para ser construidos: 0 1 2 3 4 5 6 7 8 9 a b c d e f .Java acepta las letras en mayúsculas o minúsculas (uno de los pocos lugares donde no hace esta distinción). Su prefijo es 0x. Ejemplo 0xAAF453ab.
  4. Los números de punto flotante se definen como un número, un punto y más números que representan una fracción.
  5. Los valores booleanos sólo puede ser definido como true o false. En Java no es válido usar números para representar valores de true o false.
  6. Un char se representa como un carácter entre (‘) comillas simples.
  7. Una referencia a un objeto es eso –una referencia variable. Es un espacio para guardar bits que representar una forma de llegar al objeto.
  8. El resultado de una expresión que involucra algo de tamaño int o más pequeño será un int. En otras palabras, suma dos bytes y obtienes un int. Multiplica un int y un short y el resultado será un int, divide un short por un byte y el resultado será un int…etc
  9. Si tratamos de asignar la suma de dos bytes a un byte aun cuando el resultado sea pequeño para que pueda ocupar un byte al compilador no le importará. El conoce la regla mencionada de expresiones y que el resultado será un int. Por ello para que funcione sin problemas debemos hacer un cast explícito.
  10. Todos los números de punto flotante son por default doubles (64 bits) no son float.
  11. En Java podemos acortar o recortar una primitiva, y cuando esto sucede se recortan o truncan los bits de mayor orden. En otras palabras, se pierden todos los bits de la izquierda que no quepan.
  12. Los operadores +=, -=, *=, /= realizan un cast implícito y no siguen la regla del int. Es decir podemos sumar dos bytes usando += y guardar el resultado en un byte sin problemas.
  13. Cuando igualamos referencias de primitivas lo que se hace es copiar el valor. Por ello los cambios que hagamos después no afectan al otro valor
int a = 10; // Asignar un valor a a
int b = a;
b = 30;
Aquí a tendrá el valor de 10 y b el valor de 30.

Alcance de las variables.
Existen 4 ambientes distintos
  • 1. Las variables static tienen el alcanza más grande. Son creadas cuando la clase es cargada y sobreviven todo el tiempo que la clase permanezca cargada en la JVM
  • 2. Las variables de instancia son creadas cuando una nueva instancia se crea y son removidas cuando esa instancia muere.
  • 3. Las variables locales viven mientras el método permanezca en la pila.
  • 4. Las variables de bloque, viven solamente cuando ese bloque se esta ejecutando.
Valores por Default de tipos primitivos
Tipo de la variable Valor por default
Referencia a objeto null (no referencia a ningún objeto)
byte, short, int, long 0
float, double 0.0
Boolean false
char '\u0000'

Otros
  1. Los elementos de un arreglo siempre son inicializados con valores por default, sin importar donde sean declarados o instanciados.
  2. Las variables locales, incluyendo las primitivas, siempre deben ser inicializadas antes de usarlas. Java nos les da valores por default, deben ser explícitamente iniciadas con algún valor.
  3. El compilador no puede decir siempre si una variable local ha sido inicializada antes de su uso. Por ejemplo en bloques condicionales (if) un bloque puede que nunca sea accesado pero el compilador no lo sabrá así que habrá que iniciar una variable que se encuentre ahí, aun cuando nunca sea usada.
  4. Las refencias de instancia siempre son iniciadas a null, a menos que explícitamente se diga otra cosa. Pero las referencias locales no tiene valores iniciales, es decir no son null.
Copiar valores o referencias
  1. Con variables primitivas la asignación de una variable a otra significa que el contenido (el patrón de bits) será copiado de una variable a otra. Las referencias de objetos funcionan de la misma manera. El contenido de una referencia es un patrón de bits y si se asigna a una referencia a el valor de la referencia v, el patrón de bits de a es copiado en b. Así que las dos referencias tendrán el mismo patrón, este patrón es el que refiere a un objeto en el heap.
  2. Es necesario comprender que sucede cuando se usa una referencia para modificar un String
  • Una nueva String es creada, dejando el objeto String original intacto. Y
  • La referencia usada para modificar el String (o el construir una nueva referencia) es asignada al nuevo objeto String.
  1. Cuando pasas un objeto a un método debes de recordar que estás pasado una referencia a ese objeto, no estas pasando el objeto en sí. Y aun más importante es saber que estas pasando una copia de la referencia original. Es decir, ambos el que llama y el método llamado tienen idénticas copias de la referencia, y por lo tanto ambos se refieren al mismo objeto (no a una copia) en el heap.
  2. Entonces ¿Podemos decir que java pasa objetos por referencia? NO. Lo que realmente hace Java es que, ya sea una primitiva o un objeto estas pasando una copia de los bits que representan un valor.