Voy a publicar en elkorcho por entregas y bajo Creative Commons, un trabajo que hice en 2011 para la universidad con dos compañeros mas, sobre Computación Cuántica, y para el que tuve que aprender lo básico de física cuántica. Quede tan maravillado con el tema y lleno de inquietudes cósmicas, que creo conveniente compartirlo con todos, y quien sabe, a lo mejor al igual que yo, alguien aprende algo que no sabía:
En la actualidad, a medida que evoluciona la tecnología aumenta la escala de integración: más transistores en menor espacio, lo que implica microchips más pequeños que, a su vez, se traduce en mayor velocidad de proceso. Basada en esta realidad, la Ley de Moore, que es más bien una observación empírica que una ley, estableció que cada dieciocho meses (y posteriormente se modificó a cada veinticuatro) se duplica el número de transistores contenidos en un circuito integrado (los chips dividen por dos su tamaño, al tiempo que duplican su capacidad).
Pero Moore igualmente vaticinó que llegará un punto en el que sencillamente no sea posible que se siga cumpliendo por problemas de espacio, ya que hay un límite atómico para el tamaño de un transistor. También predice que la tecnología actual habrá de ser sustituida por otro paradigma diferente que permita seguir progresando de manera similar.
Actualmente se están desarrollando transistores de 28 nanómetros, pero el problema radica en que por cada transistor y sus interconexiones tienen que circular electrones, y estos se comportan como partículas cuánticas, y si los canales por los que viajan no son lo suficientemente grandes, tienden a su comportamiento como ondas y saltan de un canal a otro, corrompiendo la información (efecto túnel).
Por otro lado, recordando a grosso modo cómo funciona la computación digital, nuestros ordenadores permiten el paso de la corriente eléctrica o, por el contrario, la interrumpen. Traducido a un lenguaje más manejable para los humanos, estos dos estados (encendido y apagado) se corresponden con dos valores posibles, 1 y 0, que determinan, además, la cantidad de información mínima con que trabaja un ordenador. A esto le llamamos bit. Si, por ejemplo, utilizamos tres bits para almacenar información, y dado que cada bit sólo puede tomar un único valor en un momento determinado (o es 0 o es 1), contemplando todas las posibles combinaciones de esos tres bits podemos representar como máximo ocho valores distintos. ¡Esto ya lo sabíamos!
Pero, ¿qué pasaría si nuestro pequeño almacén de información pudiera tomar simultáneamente varios valores distintos? ¿Y si nuestro bit pudiera valer 0, 1 y combinaciones de estos a la vez?..... Pues que estaríamos ante un nuevo concepto de computación.
miércoles, 29 de agosto de 2012
miércoles, 22 de agosto de 2012
Rehab - Rehabilitación
Ya ha pasado más de la mitad del verano, de hecho solo me quedan 3 o 4 fines de semana libres antes de volver a clase (y sumirme de nuevo en una espiral de trabajo+estudios+no dormir+no divertirse durante los siguientes 9 meses), y aunque no he parado de trabajar, las 4 o 5 semanas con jornada intensiva se han agradecido.
Y es que estar en casa a las 17 de la tarde es una gozada, pese a que he tenido que ponerme al día con los gadgets, las actualizaciones y los ordenadores y no lo he disfrutado tanto como quería, ha sido genial.
Ya he recuperado 4 kilos, y he cambiado mi rutina de ejercicio diario para trabajar tanto piernas como brazos, e intentare mantenerla durante las clases para luchar contra la inactividad física de los informáticos y el tiempo que no perdona (que en unos meses me caen los 30...).
Y es que estar en casa a las 17 de la tarde es una gozada, pese a que he tenido que ponerme al día con los gadgets, las actualizaciones y los ordenadores y no lo he disfrutado tanto como quería, ha sido genial.
Ya he recuperado 4 kilos, y he cambiado mi rutina de ejercicio diario para trabajar tanto piernas como brazos, e intentare mantenerla durante las clases para luchar contra la inactividad física de los informáticos y el tiempo que no perdona (que en unos meses me caen los 30...).
Por fin he conseguido quedar con mis nenas de conteos, y a parte de estar todas maravillosamente guapas, nos pusimos al día de las penas y alegrías (por desgracia más penas que alegrías), y lo pase muy bien.
He completado una frikimeta que tenía pendiente desde hace varios años. Gracias a mi Súper Fricolega Alfa Cristian, y a que en los últimos años han doblado todas las que faltaban, hemos podido realizar un marathon completo (en 3 domingos) de todas las películas de animación del estudio Ghibli. Y ha sido maravilloso. Algunas súper sorpresas como Ponyo, otras sorprendentemente bonitas como Recuerdos del ayer, Susurros del Corazón, Mi vecino Totoro o las mas normales pero buenas de Arrietty, Porco Rosso, Nikki la aprendiz de bruja, y los mega peliculones de La Princesa Mononoke, El Castillo Ambulante, el Viaje de Chihiro, el Castillo en el Cielo o Nausicaa del valle del viento. Ha sido glorioso, genial y digno de mención y recuerdo. Tardaremos unos cuantos años, demasiados en poder volver a ingerir 5 películas nuevas en castellano del mágico estudio Ghibli...
Por fin hemos conseguido terminar el Project Zero IV para Wii, que nos quedo a medias desde el año pasado, y aunque se nos hizo un poco tedioso, tuvo un buen final y dejo buen gusto. Empezamos el Silent Hill Downpour, iremos por más de la mitad, y pese a sus problemas de framerate, sus poco variados enemigos y su ausencia de videos, nos está gustando bastante, tiene mucha exploración, muchas misiones secundarias, la historia aparenta estar muy bien y la vas descubriendo poco a poco según lo mucho que quieras investigar y leer (cosa que me encanta) y por el momento va genial. Espero que en las 3 sesiones que nos quedan podamos acabarlo porque no quisiera dejarlo colgado durante 9 meses...
Sin pensar mucho en la factura del aire acondicionado o los carísimos arreglos del coche, seguiremos aprovechando el tiempo que nos quede, para coger con fuerzas otro año de universidad y extrañas asignaturas relámpago.
¡Id por la sombra!
He completado una frikimeta que tenía pendiente desde hace varios años. Gracias a mi Súper Fricolega Alfa Cristian, y a que en los últimos años han doblado todas las que faltaban, hemos podido realizar un marathon completo (en 3 domingos) de todas las películas de animación del estudio Ghibli. Y ha sido maravilloso. Algunas súper sorpresas como Ponyo, otras sorprendentemente bonitas como Recuerdos del ayer, Susurros del Corazón, Mi vecino Totoro o las mas normales pero buenas de Arrietty, Porco Rosso, Nikki la aprendiz de bruja, y los mega peliculones de La Princesa Mononoke, El Castillo Ambulante, el Viaje de Chihiro, el Castillo en el Cielo o Nausicaa del valle del viento. Ha sido glorioso, genial y digno de mención y recuerdo. Tardaremos unos cuantos años, demasiados en poder volver a ingerir 5 películas nuevas en castellano del mágico estudio Ghibli...
Por fin hemos conseguido terminar el Project Zero IV para Wii, que nos quedo a medias desde el año pasado, y aunque se nos hizo un poco tedioso, tuvo un buen final y dejo buen gusto. Empezamos el Silent Hill Downpour, iremos por más de la mitad, y pese a sus problemas de framerate, sus poco variados enemigos y su ausencia de videos, nos está gustando bastante, tiene mucha exploración, muchas misiones secundarias, la historia aparenta estar muy bien y la vas descubriendo poco a poco según lo mucho que quieras investigar y leer (cosa que me encanta) y por el momento va genial. Espero que en las 3 sesiones que nos quedan podamos acabarlo porque no quisiera dejarlo colgado durante 9 meses...
Sin pensar mucho en la factura del aire acondicionado o los carísimos arreglos del coche, seguiremos aprovechando el tiempo que nos quede, para coger con fuerzas otro año de universidad y extrañas asignaturas relámpago.
¡Id por la sombra!
domingo, 1 de julio de 2012
Reemplazo nocturno
Ahore ÉL duerme en esa cama con ese GusyLuz.
Y amamanta a los demás peluches...
PD: No me extraña que el cerebro artificial de Google se haya dedicado a ver fotos de gatitos por toda la red, son tan monos...
domingo, 17 de junio de 2012
viernes, 11 de mayo de 2012
Resumen Java Tema Pruebas y Calidad del Software
Las pruebas buscan errores y verifican que el programa cumple lo esperado y lo hace bien.
Son costosas en tiempo y recursos.
Hay que probar:
Que haga lo esperado y no haga cosas inesperadas.
Se buscan Situaciones anormales y fallos.
Entradas de datos correctas e incorrectas.
Probar primero partes pequeñas y luego las grandes.
Hay que documentar los casos de prueba, que parámetros recibe, qué debería devolver y que devuelve en cada caso.
Debería realizarlas automáticamente una aplicación o un usuario ajeno, no el propio programador.
Cada vez que se corrige un fallo hay que volver a probarlo todo.
-VERIFICACIÓN: Cumple la especificación?
-VALIDACIÓN: Cubre la necesidad del cliente?
INSPECCIÓN DE SOFTWARE: Análisis técnico del código, las especificaciones y los diagramas para comprobar que sea lo estipulado.
Puede hacerse en todas las fases del desarrollo, y en partes incompletas al ser estático.
(errores de compilación, código no alcanzable, variables no inicializadas o sin uso, bucles infinitos)
PRUEBAS DE SOFTWARE: Ejecutar el programa con datos ficticios y analizar las salidas.
Solo pueden hacerse trás la fase de construcción y requieren planificación porque es dinámico.
-De Integración:
Sistema/Subsistema = funcionan juntos el sistema y componentes?
*Tienen que ser incremental, se añade algo, se prueba, y repetir todo el proceso.
Descendente> 1º estructura, luego los componentes
Ascendente> 1º las funcionalidades pequeñas y luego se agrupan
Rendimiento = fiabilidad y respuesta ante la carga de trabajo, buscar sobrecargas
Entrega y aceptación = cumple los casos de uso y requerimientos?
Los resultados a las entradas son los esperados?
Forzar todos los errores y desbordamientos
-Unitarias o de componentes, son correctos y funcionan cada clase o cada módulo?
Descendente> el control es el programa principal, se crean módulos colaboradores falsos, probar y sustituir por el real.
Ascendente> crear un monitor de prueba para examinar los módulos de nivel mas bajo, probar y sustituir por el módulo superior real, y volver a probar (regresión)
-De Sistemas Ori.Obj: es correcto y útil el esquema de clases? Probar: todos los atributos y métodos de cada clase.
Clases> comprobar que hacen lo definido.
*Basadas en escenarios = probar los casos de uso mas comunes, después los menos, y luego los excepcionales.
*Basadas en Subprocesos = en cadenas de eventos.
DOCUMENTACION:
Para la organización y mantenimiento del código hay que documentarlo, indicando información sobre las funcionalidades, parámetros y resultados.
Precediendo de /** COMENTARIO */ las clases, interfaces, métodos o atributos, con la herramienta (javadoc *.java -private –d javadoc) generamos la documentación en html automáticamente. Son heredables.
-Etiquetas: @param, @return, @throws, @exception, @author, @version.
Son costosas en tiempo y recursos.
Hay que probar:
Que haga lo esperado y no haga cosas inesperadas.
Se buscan Situaciones anormales y fallos.
Entradas de datos correctas e incorrectas.
Probar primero partes pequeñas y luego las grandes.
Hay que documentar los casos de prueba, que parámetros recibe, qué debería devolver y que devuelve en cada caso.
Debería realizarlas automáticamente una aplicación o un usuario ajeno, no el propio programador.
Cada vez que se corrige un fallo hay que volver a probarlo todo.
-VERIFICACIÓN: Cumple la especificación?
-VALIDACIÓN: Cubre la necesidad del cliente?
INSPECCIÓN DE SOFTWARE: Análisis técnico del código, las especificaciones y los diagramas para comprobar que sea lo estipulado.
Puede hacerse en todas las fases del desarrollo, y en partes incompletas al ser estático.
(errores de compilación, código no alcanzable, variables no inicializadas o sin uso, bucles infinitos)
PRUEBAS DE SOFTWARE: Ejecutar el programa con datos ficticios y analizar las salidas.
Solo pueden hacerse trás la fase de construcción y requieren planificación porque es dinámico.
-De Integración:
Sistema/Subsistema = funcionan juntos el sistema y componentes?
*Tienen que ser incremental, se añade algo, se prueba, y repetir todo el proceso.
Descendente> 1º estructura, luego los componentes
Ascendente> 1º las funcionalidades pequeñas y luego se agrupan
Rendimiento = fiabilidad y respuesta ante la carga de trabajo, buscar sobrecargas
Entrega y aceptación = cumple los casos de uso y requerimientos?
Los resultados a las entradas son los esperados?
Forzar todos los errores y desbordamientos
-Unitarias o de componentes, son correctos y funcionan cada clase o cada módulo?
Descendente> el control es el programa principal, se crean módulos colaboradores falsos, probar y sustituir por el real.
Ascendente> crear un monitor de prueba para examinar los módulos de nivel mas bajo, probar y sustituir por el módulo superior real, y volver a probar (regresión)
-De Sistemas Ori.Obj: es correcto y útil el esquema de clases? Probar: todos los atributos y métodos de cada clase.
Clases> comprobar que hacen lo definido.
*Basadas en escenarios = probar los casos de uso mas comunes, después los menos, y luego los excepcionales.
*Basadas en Subprocesos = en cadenas de eventos.
DOCUMENTACION:
Para la organización y mantenimiento del código hay que documentarlo, indicando información sobre las funcionalidades, parámetros y resultados.
Precediendo de /** COMENTARIO */ las clases, interfaces, métodos o atributos, con la herramienta (javadoc *.java -private –d javadoc) generamos la documentación en html automáticamente. Son heredables.
-Etiquetas: @param, @return, @throws, @exception, @author, @version.
Resumen Java Tema Análisis y Diseño Orientado a Objetos
Ingeniería del Software: Se buscan soluciones mediante sistemas efectivos en calidad y coste, con un ciclo de vida ordenado en etapas:
1º-Planificación y Especificación
2º-Análisis de requisitos
3º-Especificación Funcional
4º-Diseño
5º-Codificación y Pruebas
6º-Implantación y Mantenimiento.
FASES:
1º-Planificación: captar las necesidades del cliente. Plantear Casos de Uso (que acción -> que reacción), [nombre, actores, importancia, descripción]. Sirve como contrato.
2º-Analisis: traducir el problema en soluciones y decidir como llevarlo a cabo. Ampliar Casos de uso. Punto de vista externo.
3º-Funciones: crear el Diagrama de Clases con los objetos y roles, sus atributos y relaciones. Punto de vista interno.
4º-Diseño: estructurar las soluciones, definir Diagrama de Clases detallado, las estructuras de datos y la interfaz.
5º-Construcción: Escritura del código en iteraciones repetibles de subconjuntos para ir completando partes, probándolas y corrigiéndolas.
6º-Instalación: puesta en marcha del sistema, y formación a los usuarios.
UML (Unified Modeling Languaje)
Es una notacion visual para representar diagramas, orientado a Objetos (con entidades, relaciones, atributos y operaciones). Nos da una perspectiva del sistema. Representan fases o etapas.
-Diagrama de Casos de Uso, muestra casos de uso, actores y sus relaciones:
ACTOR: Elemento externo al sistema que interactúa con el. Rol(es) del usuario.
CASO DE USO: Unidad funcional coherente realizada por el sistema (acción-reacción).
EXTEND: el que apunta aumenta el comportamiento del Apuntado.
INCLUDE: el que apunta incluye la función del apuntado.
-Diagrama de Clases muestra clases(nombre, atributos y operaciones), interfaces(sin inplementación) y sus relaciones. Es estático.
Asociaciones pueden ser entre 2 clases (binarias) o mas. Cardinalidad (0,1,n)...(0,1,n)
AGREGACIÓN: TODO <>--- PARTE
COMPOSICIÓN: 1 <#>--- n Pertenencia.
HERENCIA: PADRE <|--- Hija
Trucos:
subrayar los nombres, ver que relaciones tienen para plantear Clases.
buscar "es", "tiene", "consta de" para hallar las Relaciones.
las descripciones contendrán Atributos.
los verbos indican las Operaciones, y la información que intercambian son los parámetros.
1º-Planificación y Especificación
2º-Análisis de requisitos
3º-Especificación Funcional
4º-Diseño
5º-Codificación y Pruebas
6º-Implantación y Mantenimiento.
FASES:
1º-Planificación: captar las necesidades del cliente. Plantear Casos de Uso (que acción -> que reacción), [nombre, actores, importancia, descripción]. Sirve como contrato.
2º-Analisis: traducir el problema en soluciones y decidir como llevarlo a cabo. Ampliar Casos de uso. Punto de vista externo.
3º-Funciones: crear el Diagrama de Clases con los objetos y roles, sus atributos y relaciones. Punto de vista interno.
4º-Diseño: estructurar las soluciones, definir Diagrama de Clases detallado, las estructuras de datos y la interfaz.
5º-Construcción: Escritura del código en iteraciones repetibles de subconjuntos para ir completando partes, probándolas y corrigiéndolas.
6º-Instalación: puesta en marcha del sistema, y formación a los usuarios.
UML (Unified Modeling Languaje)
Es una notacion visual para representar diagramas, orientado a Objetos (con entidades, relaciones, atributos y operaciones). Nos da una perspectiva del sistema. Representan fases o etapas.
-Diagrama de Casos de Uso, muestra casos de uso, actores y sus relaciones:
ACTOR: Elemento externo al sistema que interactúa con el. Rol(es) del usuario.
CASO DE USO: Unidad funcional coherente realizada por el sistema (acción-reacción).
EXTEND: el que apunta aumenta el comportamiento del Apuntado.
INCLUDE: el que apunta incluye la función del apuntado.
-Diagrama de Clases muestra clases(nombre, atributos y operaciones), interfaces(sin inplementación) y sus relaciones. Es estático.
Asociaciones pueden ser entre 2 clases (binarias) o mas. Cardinalidad (0,1,n)...(0,1,n)
AGREGACIÓN: TODO <>--- PARTE
COMPOSICIÓN: 1 <#>--- n Pertenencia.
HERENCIA: PADRE <|--- Hija
Trucos:
subrayar los nombres, ver que relaciones tienen para plantear Clases.
buscar "es", "tiene", "consta de" para hallar las Relaciones.
las descripciones contendrán Atributos.
los verbos indican las Operaciones, y la información que intercambian son los parámetros.
Resumen Java Tema Ficheros y Persistencia
A través de un flujo (Stream): I/O, leer/escribir, Read/Write, ya sea a un fichero, a una red o a memoria. java.io
Los Streams se abren, se utilizan y SIEMPRE se cierran con .close(). Pueden producir excepciones catch(IOException ioe)
File sirve para manejar archivos, obtener información o crearlos, pero no es un flujo. exist(), isFile(), isDirectory().
RandomAccessFile(fichero, r/rw) permite acceder a una posición concreta y empezar a leer/escribir una cantidad concreta de bytes: seek(), getFilePointer(), length(), mark(), reset(), writeDouble(), readDouble().
Con las hijas de Reader y Writer se pueden manejar Bytes (8bits) o caracteres (16bits).
Con InputStream y OutputStream bytes para datos binarios (imágenes, sonidos, videos).
InputStreamReader y OutputStreamReader para caracteres unicode (16bits) desde o hacia bytes.
FileReader (leer) y FileWriter (escribir) para ficheros de caracteres.
-BufferedReader lee caracteres y texto desde un flujo; readLine(), close()
BufferedReader br = new BufferedReader( new FileReader("ejemplo.txt") );
while ((cad = br.readLine()) != null) System.out.println(cad);
-BufferedWriter escribe caracteres y texto a un flujo en paquetes reduciendo el número de accesos; writeLine(), flush(), close()
BufferedWriter bw = new BufferedWriter( new FileWriter("salida.txt") );
bw.write(cad1);
bw.newLine();
bw.write(cad2);
bw.flush();
-PrintWriter facilita la escritura de valores primitivos y datos con print() y println()
PrintWriter salida = new PrintWriter( new BufferedWriter( new FileWriter("salida.txt") ) );
salida.println(cad1);
salida.println(cad2);
FileInputStream lee bytes desde un archivo
-InputStreamReader traduce los bytes que lee del flujo a caracteres con cierta codificación (€,ñ,í,ó):
BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream("ejemplo.txt") , "ISO-8859-1") );
SERIALIZACION: Guardar o leer un objeto entero en disco.
La clase que se vaya a serializar tiene que implementar la interfaz "Serializable".
-ObjectOutputStream escribe los objetos en un fichero en datos binarios con writeObject(objeto):
ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream("fichero.dat") );
oos.writeObject(objetoaguardar);
oos.close();
-ObjectInputStream siempre hay que hacer un cast al tipo de fichero correcto que recuperemos con readObject():
ObjectInputStream ois = new ObjectInputStream( new FileInputStream("fichero.dat") );
ClaseDestino recipiente = (ClaseDestino) ois.readObject();
Los Streams se abren, se utilizan y SIEMPRE se cierran con .close(). Pueden producir excepciones catch(IOException ioe)
File sirve para manejar archivos, obtener información o crearlos, pero no es un flujo. exist(), isFile(), isDirectory().
RandomAccessFile(fichero, r/rw) permite acceder a una posición concreta y empezar a leer/escribir una cantidad concreta de bytes: seek(), getFilePointer(), length(), mark(), reset(), writeDouble(), readDouble().
Con las hijas de Reader y Writer se pueden manejar Bytes (8bits) o caracteres (16bits).
Con InputStream y OutputStream bytes para datos binarios (imágenes, sonidos, videos).
InputStreamReader y OutputStreamReader para caracteres unicode (16bits) desde o hacia bytes.
FileReader (leer) y FileWriter (escribir) para ficheros de caracteres.
-BufferedReader lee caracteres y texto desde un flujo; readLine(), close()
BufferedReader br = new BufferedReader( new FileReader("ejemplo.txt") );
while ((cad = br.readLine()) != null) System.out.println(cad);
-BufferedWriter escribe caracteres y texto a un flujo en paquetes reduciendo el número de accesos; writeLine(), flush(), close()
BufferedWriter bw = new BufferedWriter( new FileWriter("salida.txt") );
bw.write(cad1);
bw.newLine();
bw.write(cad2);
bw.flush();
-PrintWriter facilita la escritura de valores primitivos y datos con print() y println()
PrintWriter salida = new PrintWriter( new BufferedWriter( new FileWriter("salida.txt") ) );
salida.println(cad1);
salida.println(cad2);
FileInputStream lee bytes desde un archivo
-InputStreamReader traduce los bytes que lee del flujo a caracteres con cierta codificación (€,ñ,í,ó):
BufferedReader br = new BufferedReader( new InputStreamReader( new FileInputStream("ejemplo.txt") , "ISO-8859-1") );
SERIALIZACION: Guardar o leer un objeto entero en disco.
La clase que se vaya a serializar tiene que implementar la interfaz "Serializable".
-ObjectOutputStream escribe los objetos en un fichero en datos binarios con writeObject(objeto):
ObjectOutputStream oos = new ObjectOutputStream( new FileOutputStream("fichero.dat") );
oos.writeObject(objetoaguardar);
oos.close();
-ObjectInputStream siempre hay que hacer un cast al tipo de fichero correcto que recuperemos con readObject():
ObjectInputStream ois = new ObjectInputStream( new FileInputStream("fichero.dat") );
ClaseDestino recipiente = (ClaseDestino) ois.readObject();
Resumen Java Tema Estructuras de Datos
-Busqueda Sequencial: Recorre una colección de elementos y devuelve la posición o el primero que cumpla la condición buscada.
-Busqueda Binaria: Mira el elemento central, si no es el buscado y es menor repite por el lado mayor, o viceversa. Requiere(Lista Ordenda, Nº Elementos y acceso por posición).
-Ordenación por Inserción Directa: 2 Partes: Ordenada y Resto, coge el 1º del resto y lo coloca en su sitio en la ordenada. Nº Iteracciones = Nº Elementos.
-Ordenación por Selección Directa: 2 Partes: Ordenada y Resto, busca en el resto el menor y lo coloca en la ordenada. Nº Iteracciones = Nº Elementos.
-Ordenación por Intercambio Directo (Burbuja): Pasadas sucesivas comparando cada ítem con el siguiente e intercambiarlos para ordenar.
-Tipos Enumerados: Clase con un conjunto de valores fijos definido. java.lang.Enum. toString(), ordinal(), values():
Sintaxis: Public enum DiasSemana{L,M,X,J,V,S,D}; DiasSemana ds = DiasSemana.L;
COLECCIONES (Genéricos, valen para cualquier tipo de clase= Collection ):
Algoritmos: Collections.short(), binarySearch(), reverse(), min(), max(), frecuency(), rotate(), suffle(), swap(), compareTo(), getClass(), getSimpleName().
-LISTAS (LIST: Almacena en orden de inserción):
ArrayList es un array dinámico de objetos. add(), remove(), get(), set(), contains(), indexOf(), lastIndexOf().
-CONJUNTOS (SET: No puede contener duplicados):
HashSet: genera claves hash que enlaza a los valores, sin duplicados. add(), remove().
TreeSet: Forma de árbol, rangos, ordenados. add(), remove().
-MAPAS (MAP: Clave-Valor, sin duplicados, búsquedas rápidas):
HashMap: Diccionario de claves-valores, put(clave,valor), get(clave), remove(clave).
TreeMap: Árbol con objetos ordenados por clave. put(clave,valor), get(clave), remove(clave).
-QUEUE: Entradas y Salidas por diciplina COLA (FIFO,LIFO...)
Iteradores: para recorrer elementos, hasNext() y next(), y ListIterator añade hasPrevious() y previous().
-Busqueda Binaria: Mira el elemento central, si no es el buscado y es menor repite por el lado mayor, o viceversa. Requiere(Lista Ordenda, Nº Elementos y acceso por posición).
-Ordenación por Inserción Directa: 2 Partes: Ordenada y Resto, coge el 1º del resto y lo coloca en su sitio en la ordenada. Nº Iteracciones = Nº Elementos.
-Ordenación por Selección Directa: 2 Partes: Ordenada y Resto, busca en el resto el menor y lo coloca en la ordenada. Nº Iteracciones = Nº Elementos.
-Ordenación por Intercambio Directo (Burbuja): Pasadas sucesivas comparando cada ítem con el siguiente e intercambiarlos para ordenar.
-Tipos Enumerados: Clase con un conjunto de valores fijos definido. java.lang.Enum. toString(), ordinal(), values():
Sintaxis: Public enum DiasSemana{L,M,X,J,V,S,D}; DiasSemana ds = DiasSemana.L;
COLECCIONES (Genéricos, valen para cualquier tipo de clase= Collection
Algoritmos: Collections.short(), binarySearch(), reverse(), min(), max(), frecuency(), rotate(), suffle(), swap(), compareTo(), getClass(), getSimpleName().
-LISTAS (LIST: Almacena en orden de inserción):
ArrayList es un array dinámico de objetos. add(), remove(), get(), set(), contains(), indexOf(), lastIndexOf().
-CONJUNTOS (SET: No puede contener duplicados):
HashSet: genera claves hash que enlaza a los valores, sin duplicados. add(), remove().
TreeSet: Forma de árbol, rangos, ordenados. add(), remove().
-MAPAS (MAP: Clave-Valor, sin duplicados, búsquedas rápidas):
HashMap: Diccionario de claves-valores, put(clave,valor), get(clave), remove(clave).
TreeMap: Árbol con objetos ordenados por clave. put(clave,valor), get(clave), remove(clave).
-QUEUE: Entradas y Salidas por diciplina COLA (FIFO,LIFO...)
Iteradores: para recorrer elementos, hasNext() y next(), y ListIterator añade hasPrevious() y previous().
Resumen Java Tema GUI (Graphical User Interface)
Contenedores (agrupan controles)
Layouts (establecen el orden de los componentes)
Componentes (elementos gráficos)
Se producirán eventos (ratón, teclado), que serán recibidos por los Listeners que lanzarán el Handler (manejador) con el código a ejecutar:
EVENTO(ActionEvent), OYENTE(ActionListener), MÉTODO(actionPerformed), COMPONENTES(JButton)
CONTENEDORES:
-JWindow: Ventana sin título ni borde
-JFrame: Marco con borde y título. Puede tener una barra de menú.
-JDialog: Ventana completa propia que no puede existir sin un JFrame como padre.
-JApplet: Permite crear un applet swing (aplicaciones web java que se ejecutan en el navegador).
-JPanel: Contenedor intermedio genérico de Componentes.
.getContentPane() permite acceder al padre y add(boton) le añade componentes.
LAYOUTS:
-BorderLayout: colocamos los elementos en North, South, East, West, y Center. Es el Default de JFrame y JDialog.
-GridLayout: se colocan en una rejilla de dimensiones x*y
-FlowLayout: los elementos van seguidos en fila uno tras otro.
-NullLayout: tenemos que especificar a mano las coordenadas de cada componente.
COMPONENTES: javax.swing.JComponent es la clase base de Swing
JLabel: setText(), setFont()
JButton: produce ActionEvent, addActionListener(actionPerformed que implemente la interfaz ActionListener)
JTextArea, JTextField, JPasswordField: campos para escribir líneas, textos o contraseñas. getText() y setText()
JComboBox: desplegables con elementos para seleccionar. setEditable(bool). Igual que JButton= ActionListener, addActionListener(), actionPerformed()
JList: Listas de items para seleccionar uno o varios. Produce ListSelectionEvent->addListSelectionListener()->valueChanged()
JScrollPane: desplazador para moverse por mas contenidos.
JCheckBox: Cuadrados marcables, producen ItemEvent->ItemListener->itemStateChanged(), addItemListener()
JRadioButton: Selectores de opciones únicas, se agrupan en ButtonGroup.add(), funcionan igual que botones.
.setToolTipText("texto info") para añadir una nota emergente con información.
Menus:
JMenuBar: la barra en la que se colocan los menus
JMenu: componente menu que al ser pulsado desplegará opciones. addSeparator()
JMenuItem: Cada elemento que contendrá el menu. Igual que los botones
JToolBar: Barras de Herramientas movibles y acoplables, con JButton con texto o iconos. addSeparator()
JTabbedPane: tendrá pestañas que contendrán JPanel con contenido. addTab(), setSelectedIndex()
-JFileChooser: nos permite la selección para apertura o guardado de un fichero. Es modal, con showOpenDialog y showSaveDialog().
-JFormattedTextField: permite forzar formatos básicos en texto mediante máscaras (fechas, monedas) en conjunto con InputVerifier.
-JSpinner: rota entre unos valores con un orden mostrando únicamente uno. SpinnerListModel(array), SpinnerNumberModel para números y SpinnerDateModel para fechas.
-JTable: Tablas para mostrar datos en una rejilla de columnas y filas. Se construyen con arrays y permiten edición.
-AbstractBorder: implementa interfaz Border y permite marcar bordes.
JOptionPane: para mostrar diálogos de opciones, se captura el resultado y se analiza.
.showConfirmDialog( Si, No, Cancelar)
.showInputDialog( recoge un texto en un textbox y lo devuelve)
.showMessageDialog( para errores, avisos, información)
.showOptionDialog( combinación de los 3 anteriores)
*Podemos determinar el aspecto de la aplicación (metal, motif, windows) con:
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel";
Layouts (establecen el orden de los componentes)
Componentes (elementos gráficos)
Se producirán eventos (ratón, teclado), que serán recibidos por los Listeners que lanzarán el Handler (manejador) con el código a ejecutar:
EVENTO(ActionEvent), OYENTE(ActionListener), MÉTODO(actionPerformed), COMPONENTES(JButton)
CONTENEDORES:
-JWindow: Ventana sin título ni borde
-JFrame: Marco con borde y título. Puede tener una barra de menú.
-JDialog: Ventana completa propia que no puede existir sin un JFrame como padre.
-JApplet: Permite crear un applet swing (aplicaciones web java que se ejecutan en el navegador).
-JPanel: Contenedor intermedio genérico de Componentes.
.getContentPane() permite acceder al padre y add(boton) le añade componentes.
LAYOUTS:
-BorderLayout: colocamos los elementos en North, South, East, West, y Center. Es el Default de JFrame y JDialog.
-GridLayout: se colocan en una rejilla de dimensiones x*y
-FlowLayout: los elementos van seguidos en fila uno tras otro.
-NullLayout: tenemos que especificar a mano las coordenadas de cada componente.
COMPONENTES: javax.swing.JComponent es la clase base de Swing
JLabel: setText(), setFont()
JButton: produce ActionEvent, addActionListener(actionPerformed que implemente la interfaz ActionListener)
JTextArea, JTextField, JPasswordField: campos para escribir líneas, textos o contraseñas. getText() y setText()
JComboBox: desplegables con elementos para seleccionar. setEditable(bool). Igual que JButton= ActionListener, addActionListener(), actionPerformed()
JList: Listas de items para seleccionar uno o varios. Produce ListSelectionEvent->addListSelectionListener()->valueChanged()
JScrollPane: desplazador para moverse por mas contenidos.
JCheckBox: Cuadrados marcables, producen ItemEvent->ItemListener->itemStateChanged(), addItemListener()
JRadioButton: Selectores de opciones únicas, se agrupan en ButtonGroup.add(), funcionan igual que botones.
.setToolTipText("texto info") para añadir una nota emergente con información.
Menus:
JMenuBar: la barra en la que se colocan los menus
JMenu: componente menu que al ser pulsado desplegará opciones. addSeparator()
JMenuItem: Cada elemento que contendrá el menu. Igual que los botones
JToolBar: Barras de Herramientas movibles y acoplables, con JButton con texto o iconos. addSeparator()
JTabbedPane: tendrá pestañas que contendrán JPanel con contenido. addTab(), setSelectedIndex()
-JFileChooser: nos permite la selección para apertura o guardado de un fichero. Es modal, con showOpenDialog y showSaveDialog().
-JFormattedTextField: permite forzar formatos básicos en texto mediante máscaras (fechas, monedas) en conjunto con InputVerifier.
-JSpinner: rota entre unos valores con un orden mostrando únicamente uno. SpinnerListModel(array), SpinnerNumberModel para números y SpinnerDateModel para fechas.
-JTable: Tablas para mostrar datos en una rejilla de columnas y filas. Se construyen con arrays y permiten edición.
-AbstractBorder: implementa interfaz Border y permite marcar bordes.
JOptionPane: para mostrar diálogos de opciones, se captura el resultado y se analiza.
.showConfirmDialog( Si, No, Cancelar)
.showInputDialog( recoge un texto en un textbox y lo devuelve)
.showMessageDialog( para errores, avisos, información)
.showOptionDialog( combinación de los 3 anteriores)
*Podemos determinar el aspecto de la aplicación (metal, motif, windows) con:
UIManager.setLookAndFeel("javax.swing.plaf.metal.MetalLookAndFeel";
Resumen Java Tema Excepciones
Excepción: error que detiene la ejecución. Lanza un objeto que podemos capturar con try{...}catch(Exception ex){...} y asi fortalecer, estabilizar y preparar la aplicación para recuperarse en casos de error.
Si se produce en un método y no es capturada escalará hasta el método que lo llamó recursivamente, y si no es capturada nunca, detendrá la ejecución.
try { Envuelve el código que podrá lanzar excepciones, las captura y se las pasa al manejador catch adecuado. }
catch { Puede haber varios, del mas específico al mas general, y es lo que se ejecutará en caso de error }
finally { Esta porción de código se ejecutará SIEMPRE, haya error o no, es útil para cerrar conexiones y flujos }
throw new Exception(): permite lanzar manualmente una excepción (tiene que heredar de Throwable)
public void método throws xException: indica que el metodo puede producir x excepciones y no las controla.
Throwable (padre)
-Error (hija) errores fatales no recuperables.
-Exception (hija) errores de los que se puede recuperar. getMessage(), printStackTrace()
Se pueden crear hijas de Exception para hacer excepciones personalizadas.
Tipos comunes: ArithmeticException, NullPointerException, ClassCastException, NegativeArraySizeException, ArrayIndexOutOfBoundsException, NoClassDefFoundException
Si se produce en un método y no es capturada escalará hasta el método que lo llamó recursivamente, y si no es capturada nunca, detendrá la ejecución.
try { Envuelve el código que podrá lanzar excepciones, las captura y se las pasa al manejador catch adecuado. }
catch { Puede haber varios, del mas específico al mas general, y es lo que se ejecutará en caso de error }
finally { Esta porción de código se ejecutará SIEMPRE, haya error o no, es útil para cerrar conexiones y flujos }
throw new Exception(): permite lanzar manualmente una excepción (tiene que heredar de Throwable)
public void método throws xException: indica que el metodo puede producir x excepciones y no las controla.
Throwable (padre)
-Error (hija) errores fatales no recuperables.
-Exception (hija) errores de los que se puede recuperar. getMessage(), printStackTrace()
Se pueden crear hijas de Exception para hacer excepciones personalizadas.
Tipos comunes: ArithmeticException, NullPointerException, ClassCastException, NegativeArraySizeException, ArrayIndexOutOfBoundsException, NoClassDefFoundException
domingo, 8 de abril de 2012
Critica REC3: Genesis
Sí, Quiero.
El martes hice una escapada nocturna con mi compadre de fechorías y por primera vez en este 2012 fuimos al cine.
El motivo: REC 3, GENESIS, la tercera entrega de la que en mi opinión es la mejor saga que ha parido el cine español, aunque solo se me viene a la cabeza Torrente en contrapunto.
El caso es que tras encantarme la primera parte, y maravillarme la segunda, esta tercera y penúltima en la saga me ha fascinado.
REC 3 Génesis Trailer 1
La temática de la boda, con la que conectas de inmediato, te mete de lleno en la situación. Todos hemos estado en una, todos hemos vivido esas situaciones. Y el hecho de presentar la cinta como las grabaciones profesional y amateur del evento, añade al juego un toque aun más divertido.
Y como yo siempre digo, si al final (o en este caso al principio) se casan, me encanta. Pese a ser una cinta de zombis/terror, el romance es la parte más importante de la historia. Es el hilo conductor, el motor de los personajes, y es tan bonito, intenso y en ocasiones incluso cursi, que no pude evitar echar más de una lagrimilla. Y es que para mí, donde haya una buena historia de amor (y no, los triángulos no son amor, son vicio) como en El cuervo o en Matrix, apoyando personajes, motivos o arcos, la historia gana enteros. En esta ocasión la historia de amor es sencilla y efectiva y está en su punto álgido, dos personas que se quieren con locura, en el día de su maravillosa boda.
Y al fin y al cabo las películas dependen de sus personajes, y normalmente la mitad o más me suelen caer mal, o restan puntos hasta tal punto que acaban todos con la cuenta en negativo. Sin embargo en REC3 Génesis, me sucedió al contrario. Todos los personajes, empezando por los novios, pasando por los amigos, familiares, cámaras, extras (John, Canon y el cura) con geniales. En lugar de cometer una estupidez tras otra (que puede haberlas al estar dirigidos por su corazón), en casi todas las ocasiones hacen lo que yo haría. Armarte con lo que puedas, plantar cara cuando no te queda otra, y huir como cobardes.
Pese a ser una cinta de terror tiene algunas secuencias de acción memorables (+20 puntos para Leticia Dolera por ello), que aunque pocas, se convierten instantáneamente en secuencias a recordar e imitar.
Y no solo de sustos y amor vive el friki, la REC3: Génesis dispone de unos pocos, localizados y más que efectivos puntos cómicos que me encantaron. Relajan un poco la tensión (que pronto vuelve) y al estar colocados en los momentos adecuados no destrozan el drama ni descolocan, hacen reír y algunos tienen auténticos dobles sentidos (¡¡Puto Canon!!).
Lo que no puede faltar en una peli de Zombis, aunque sea de la sub rama de los infectados/poseídos, son mis queridos zombis. En esta ocasión podemos disfrutar de un curioso tipo de zombi, el zombi de gala, ataviado con chaqués, vestidos, tacones y tocados. Creo que es la primera que veo en la que se utilizan, y son ciertamente refrescantes. Tienen las habilidades de los de las anteriores entregas, mas espacio abierto y libertad de movimientos y cumplen con eficacia su función. Incluso nos permiten descubrirles un punto débil, algo que supongo será útil en la próxima y última (?) entrega.
Mención especial a la banda sonora, plagada de temas románticos y casaderos, es pegadiza, está bien situada, y hoy no me puedo sacar de la cabeza el Eloise del gran Tony Casal. Un total acierto.
La fotografía del film me dio la sensación de estar cuidada, no detecté fallos de racord, y algunos encuadres eran espectaculares, jugando muy bien con los recursos de lluvia, nocturnidad e interiores. El tránsito por primera vez de cámara en mano a cámaras fijas profesionales está muy bien realizado, es gracioso, tiene sentido, y da pie a un nuevo tipo de narración en la saga.
El director Paco Plaza sabe lo que quiere hacer, cuenta una historia ágil y divertida dentro de su RECverso, nos aporta algo (poco) mas de información, y nos entretiene con un espectáculo salpicado de referencias a las anteriores entregas, al género en general, con un buen ritmo que no decae en ningún momento.
Una gran película de zombis, una buena historia romántica, y una estupenda película española.
Así no me importa pagar por ir al cine. Le otorgo un merecido 9 sobre 10.
¡Hoy es mi díaaa!
lunes, 20 de febrero de 2012
lunes, 13 de febrero de 2012
Para mí el año 2011 ha sido...
Intenso, duro y muy difícil.
No me puedo quejar ni me quejo porque tengo salud, tengo
trabajo y estoy estudiando, pero ha sido un año en el que no he tenido
vacaciones, en el que mis jornadas han ido creciendo por momentos hasta rozar
lo absurdo, y en el que mi tiempo de ocio ha ido desapareciendo hasta
convertirse en algo anecdótico o en un mero recuerdo. Los fines de semana se
llenaron primero de trabajos freelance, después de la traducción que estoy
haciendo al español de la ROM de Final Fantasy VI de SNES, y posteriormente de
estudio, prácticas y trabajos.
Una gran compañera y muchisimos recuerdos me dieron mis 18 meses de Apolo Media. |
Y cuando no podía dar más de si mi agenda me apunte a la
Universidad.
En concreto estoy cursando un Grado en Sistemas de Información
en la Universidad de Alcalá, y es una mezcla de informática y Administración y
dirección de empresas que me convenció por que a diferencia de las ingenierías
no tenia física y tan solo una asignatura de matemáticas, y no cinco.
Por este motivo tuve que sacrificar lo poco que quedaba de
mi ocio y vida social que transcurría los sábados en mi casa con mis
frikolegas, y le dedique por completo el fin de semana al estudio. Tuve también
que comenzar a dormir menos, porque 7 horas al día es un lujo, y no estaba para
lujos la situación. Con 4 o 5 horas tendría que apañarme.
Y es que para celebrar mi año de la buena suerte comencé mi
primer cuatrimestre con Matemáticas y Fundamentos de Tecnología de computadores
(de ahora en adelante circuitos).
Si, yo que la última vez que aprobé matemáticas fue en 7º de
E.G.B., y que me metí en un Bachiller de Humanidades (letras puras) por que no tenía
ni idea, y yo que prácticamente no se sumar mas allá de cantidades que quepan
en los dedos de las manos.
Fue mortal, estresante, depresivo y agotador, porque para
colmo tienes que tener la base de los bachilleratos de ciencias, pero estaba
decidido a ver hasta dónde podía llegar, y sacrificando cualquier buen rato,
momento feliz o de descanso durante 4 meses, y con la inestimable ayuda de los
señores Christian y Daniel y de la paciencia, tiempo, esperanza y lecciones del
Gran Jon, con demasiadas horas de tutorías y mas videos de youtube de los que
he visto en toda mi vida, y sin la mas mínima esperanza de aprobar en el primer
año, hice todo lo que pude, al menos con el tiempo que mi trabajo a jornada más
que completa me permitía.
Y por fin, aunque sucediese en 2012, tras perderme varias
vacaciones y la navidad, y con el TOC por las nubes, conseguí, no sin ayuda de
los profesores, ¡¡¡¡un 5.0 en matemáticas y un 9.0 en circuitos!!!!
Aun no lo he asimilado y no he podido disfrutarlo, pero el
caso es que (creo) que ha sucedido. Lo he logrado y casi no le puedo pedir más
a esta vida (aunque ya lo esté haciendo claro....).
En 2011 también perdí a mi última abuela y madrina Isidora
Gómez. Siempre es triste una pérdida así pero cuando las personas alcanzan una
cierta edad (90+) y tienen una serie de problemas de salud uno está preparado
para que la naturaleza siga su curso. Y sirvió para reunir a toda la rama de la
familia donde conocí a tíos y primos que no había visto nunca, y a familiares
que hacia más de 15 años que no veía.
Pero también ha sido un año en el que he (re)conocido a
buenos compañeros de trabajo (MC, Veiga y Roberto, sois la repera!!), y he
tenido la suerte de coincidir con unos colegas de clase estupendos (Jon, te
debo muchísimo) y unos comprensivos amigos que no me recriminaron el
abandonarlos y desaparecer durante los cuatro meses de clase. Por ello a todos
les agradezco enormemente el apoyo, la compañía, el tiempo y la paciencia.
¡ARIGATO!
En resumen ha sido un año sin descanso, sin casi buenos
momentos y sobrecargado de trabajo, responsabilidades y más trabajo, la mayoría
no remunerado. Pero lo he conseguido terminar con vida, he tenido un éxito
moderado en la universidad, y vuelvo a tener un contrato indefinido, que le da
a uno cierta tranquilidad. Y pese a que no se cuanto tiempo podre aguantar a
este ritmo, lo cierto es que cuando conviertes el límite en rutina, no se hace más
agradable pero si más llevadero. Cuesta más levantarse un día a las 5 de la
mañana que todos los días, y cuesta más doblar turno un día que hacerlo por
norma todos los días.
Estudiar estudiar, en la universidar! |
Valoración del año 2011: 6 sobre 10 ;P
Suscribirse a:
Entradas (Atom)