Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas
Mostrando entradas con la etiqueta Programación. Mostrar todas las entradas

viernes, 14 de mayo de 2010

La privacidad, Facebook y el futuro

Acabo de leer, sobre el problema en que se acaba de meter el creador de Facebook, y es que resulta, que se hizo publico un extracto de una conversación por chat que tuvo cuando tenía 19 años y acababa de lanzar Facebook.

Zuck: Yeah so if you ever need info about anyone at Harvard

Zuck: Just ask.

Zuck: I have over 4,000 emails, pictures, addresses, SNS

[Redacted Friend's Name]: What? How'd you manage that one?

Zuck: People just submitted it.

Zuck: I don't know why.

Zuck: They "trust me"

Zuck: Dumb fucks


En resumen lo que dice esta página es que
  1. Todos hemos hecho cosas estúpidas cuando teníamos 19 años, y el creador de Facebook no es la excepción así que no hay que crucificarlo por esto.
  2. Facebook sí tiene grandes problemas con la privacidad. Ya que tus datos son altamente explotados por los anunciantes.
  3. A pesar de lo anterior pareciera que Facebook le está apostado a que la gente no se va a salir de Facebook porque ya está tan acostumbrada a usarlo, que en cierta forma se sentirían un vacío si cancelaran su cuenta (por decirlo de alguna forma)
  4. En el futuro, otras compañías como Microsoft, Apple y Google, integraran en sus servicios, esta parte de socializar, por lo que no será necesrio pertenecer a estas redes (Facebook).
  5. Debido al punto anterior Facebok, MySpace y hasta Twitter, serán un bonito recuerdo de nuestra generación ya que desaparecerán.

No soy Nostradamus ni el Brujo Mayor, pero estas teorías tienen sentido, ya veremos que sucede en realidad.

miércoles, 25 de febrero de 2009

II Coloquio Universitario de Software Libre PUMASOL


En abril de este año se realizará este coloquio que tiene como finalidad

presentar trabajos de desarrollo de software que haya sido liberado como Software Libre por el grupo desarrollador o que mediante el empleo de herramientas libres, estén desarrollando soluciones computacionales.

http://pumasol.org/ es la página del coloquio.

La fecha límite para enviar trabajos es el 31 de marzo y la presentación de los trabajos será del 21 a 23 de abril en la UNAM.

miércoles, 11 de febrero de 2009

El futbol nos une (para hacer Robots)

La Robocup, es la copa de futbol mundial de los robots. Es un torneo internacional de vieja creación (1993) pero que tiene una meta muy ambiciosa:

El objetivo oficial del proyecto es conseguir para el año 2050 un equipo de robotos capaz de vencer al ganador de la Copa Mundial de la FIFA siguiendo sus propias reglas.
Una cosa importante es que los robots son totalmente autónomos, es decir no hay ningún tipo de control sobre ellos.

Hay varios tipos de categorias para los robots, entre los que destacan, robots con cuatro patas:




y los robots bípedos



Genial ¿verdad?

jueves, 27 de noviembre de 2008

Barack Obama sabe de computación

Resulta que el presidente electo de los EU, supo responder muy bien una pregunta de computación.
Si no me creen vean el video.



Su respuesta es muy buena, incluso es mejor de la que responderían muchos maestros y estudiantes de computación :P

miércoles, 22 de octubre de 2008

El futuro de Netbeans y Java

Es hora de ponerse psíquico y pensar que será de este IDE.


Yo creo que tendrá que ver mucho con cómo se desarrolle Java, por ello mis predicciones sobre: Java, Netbeans y la programación son:
  1. Sabemos que Java es un lenguaje que tuvo (y tiene todavia) un gran boom.
  2. Pero ahora las aplicaciones ya no son centrizadas sino web.
  3. En web ya no hay que crear código desde cero, existen decenas de frameworks que hacen gran parte del trabajo "pesado".
  4. Las bases de datos seguirán usandose mucho, pero será mas fácil la interacción y más transparente al programador.
  5. El paradigma de Modelo-Vista-Controlador será muy usado, tanto como lo son los objetos ahora.
  6. Los closure serán tan comunes en la programación como ahora lo es la recursión.
Por todo ello, creo que Netbeans va a tener que:
  • Soportar más frameworks de forma más sencilla
  • Soportar plugins como Hibernate es decir ORMs
  • Tener un mejor soporte para crear GUIs en Web
  • Soporte para el MVC
Por supuesto se resolverán los problemas de la tardaaaadaaa incialización, y algunos bugs que aparecen de vez en cuando XD.

Generador Automático de Exámenes con soporte para LaTeX


Este proyecto lo realicé como servicio social en mi universidad. Actualmente sigo agregandole funcionalidades.

La idea es simple: hacer un banco de preguntas, meterlas al generador y el se encarga de seleccionar al azar algunas y crear los examenes y la solución.


Sus características principales son :
  • tiene soporte para LaTeX, por lo que las expresiones matemáticas tienen una calidad tipográfica.
  • tiene salida para Moodle. Cuando se genera un examen se hace un archivo GIFT que reconoce Moodle el cual puede ser usado en línea.
  • Es multiplataforma, debido a que usa Java y pdflatex para generar el examen así que no hay problemas con el sistema operativo.
  • Además tiene conexión con Base de Datos (por ahora MySQL).
  • La salida del documento es un PDF y un .tex que puede ser reeditado.
Todo el proyecto fue desarrollado en Netbeans inició con el 5.x, paso por 6.0 y ahora uso el 6.1.

martes, 21 de octubre de 2008

Eliminar problema con Substance y Swing

Si has tenido dolores de cabeza con esta excepción:

org.jvnet.substance.api.UiThreadingViolationException: Component creation must be done on Event Dispatch Thread

gracias a esta página puedes resolverlo.

Pero más aún, si estas usando el Framework de Swing lo que puedes hacer es algo parecido a esto. Sólo debes de cambiar el método startup de tu clase que extienda de SingleFrameApplication para agregar unas líneas.

El problema principal se debe a que cuando se muestre la ventana lo debes de hacer dentro del invokeLater, y eso lo logramos ponienod el método show() dentro del run().


Y listo, no mas excepciones!

sábado, 27 de septiembre de 2008

¿Cuántos lenguajes de programación conoces?

Name That Code


ASP, C, C++, Cobol, Fortran, Java, Lisp, Shell, Perl, PHP, Python, SQL, Ruby... son sólo algunos ejemplos de lenguajes. Realiza el test y prueba que tanto conoces o desconoces del mundo de la programación.

martes, 23 de septiembre de 2008

Hibernate con Netbeans 6.1

Este es un pequeño tutorial para usar Hibernate con Netbeans.

Lo primero que tenemos que hacer es bajar Hibernate 3 y SLF4J de sus páginas. Después tenemos que crear una carpeta y juntar los siguientes jars que son necesarios para que todo funcione correctamente. Dentro de Netbeans damos click derecho en el proyecto y nos vamos a las opciones y agregamos las bibliotecas siguientes (todas, sino puede haber problemas):


También podemos bajar un plugin especial para Netbeans, esto no es obligatorio y de hecho todavía esta en versión beta pero puede servir un poco.


Después necesitamos los archivos de configuración de Hibernate y de log4j. Para Hibernate tenemos a hibernate.cfg.xml y los archivos de mapeos que terminan con extensión hbm.xml

Aquí esta un ejemplo del archivo hibernate.cfg.xml el cual tiene que estar en la raiz de tu proyecto para que lo encuentre. Contiene las opciones de configuración (en recuadro rojo se marcan las más importantes)
Finalmente están los archivos de mapeo, cada clase va a corresponder con una tabla de nuestra base de datos. En estos archivos se especifica el nombre de las columnas(para la tabla) y atributos (para la clase)
Después de todo esto podemos empezar a programar y listo.

Aquí hay otro tutorial bastante bueno en inglés.

Y uno en español para casos más avanzados.

domingo, 21 de septiembre de 2008

Usando el Google Web Toolkit (GWT)


El GWT es un framework que desarrolló Google para evitar el complicado trabajo de usar AJAX puro.
Podemos verlo como un traductor, ya que uno como programador generará código en el lenguaje Java y el GWT lo pasará a HTML y Javascript, con esto se oculta complejidad y se realizan páginas de forma más sencilla.
Es un framework relativamente nuevo, pero que con el apoyo de Google seguramente será muy usado.
Yo lo estoy usando por primera vez con el IDE Netbeans y por ahora todo marcha bastante bien, sólo hay que descargar el GWT. Luego en Netbeans existe un Plugin especial, también lo descargamos e instalamos. Después podemos crear un nuevo Proyecto Web y en los pasos para la creación Netbeans nos pedirá los frameworks con los que queremos trabajar, seleccionamos GWT y listo, tenemos nuestra primera aplicación bastante sencilla de Hello GWT!

Aquí hay cierta documentación en español, y aquí unos ejemplos.

miércoles, 10 de septiembre de 2008

Ruby sabe plurales (sólo algunos)

(Ruby) éste genial lenguaje de programación sabe "pluralizar" por ejemplo
sabe que el plural de Person es people
sabe que el plural de Sheep es sheep (no creo que sea una palabra muy usada en la programación o en los sistemas, pero Ruby lo sabe) sin embargo Ruby
no sabe que el plural de foot es feet.
Entonces podemos darle una pequeña ayudadita, hay un archivo inflections.rb que contiene estos pequeños detalles, en general esta comentado (con #) pero podemos hacer que quede así

ActiveSupport::Inflector.inflections do |inflect|
inflect.irregular 'foot', 'feet'
end


guardamos, luego podemos crear un modelo llamado Foot, hacer más cosas y Ruby generará las vistas Feet y el feet_controller.rb

sábado, 6 de septiembre de 2008

Ruby, la joya de la Web


Ruby es un "nuevo" lenguaje de programación que viene con todo. Además tiene un framework que lo acompaña llamado Rails, juntos hacen a Ruby on Rails una gran plataforma de desarrollo que tiene un nuevo modelo de programación basado en lo que se conoce como MVC Modelo-Vista-Controlador.

Tiene una comunicación directa y muy sencilla con las bases de datos.
Además de que tiene características de programación funcional como los closures, que están muy de moda.
Parece que Java tiene un serio (muy serio) competidor.

Por último les dejo con una pequeña historia que revela porque Ruby puede ser algo grande en el futuro(no tan lejano).

Había una vez, tres pequeños programadores que debian de realizar un código para la www que diera acceso a la base de datos de la compañía.

  • El primer programador estaba con mucha prisa, asi que escribió el código lo más rápido que pudo.
  • El segundo programador tenía tiempo asi que uso su metodología de ingeniería de software, realizó su análisis, diseño, creó el código, probó el programa y lo depuró.
  • El tercer programador fue meticuloso y uso un framework bastante conocido y con mucho peso en la industria como Enterprise JavaBeans, realizó un código cubriendo cualquier detalle.
Luego llegó el lobo (un cliente que era quién pagaba por el software) para accesar al sitio web.
  • Primero visitó el sitio del tercer programador, el problema fue que nunca podo acceder al sitio ya que tenia una leyenda que decia "sitio en construcción, apenas voy a la mitad del trabajo". El lobo sopló y el sitio cayó.
  • El lobo visitó el segundo sitio, el cual ya estaba terminado, pero ciertos aspectos no cubrían las necesidades deseadas. El proyecto cambió con el tiempo pero la metodología de Ing de software no pudo tolerar el cambio hasta el final cuando todo el trabajo había sido realizado. El programador prometió una versión 2.0 con todos los cambios pero el lobo se desesperó el sitio cayó.
  • Finalmente el lobo llegó al primer sitio, el progrmador usó Ruby on Rails, de hecho realizó el sitio en 2 días, además pudo realizar cambios sin mucho problema. El sitio era fácil de usar, inteligente y sencillo.

Y todos fueron felices...


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

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.

miércoles, 30 de julio de 2008

Tips para el SCJP IV

Seguimos con tips para la certificación.
De nuevo hablamos de interfaces. Vemos un poco sobre los casts. Un tema amplio pero no muy dificil de entender, los constructores. Y finalmente vemos la palabra reservada static
.

Casting

  1. Existen dos tipos de cast.
  2. El primero downcasting (hacia abajo), sucede cuando se tiene una referencia más general y se desea una referencia a una subclase. Se debe realizar explícitamente el cast para que funcione y así poder accesar con esta nueva referencia a los miembros de la subclase.
  3. El upcasting (hacia arriba) funciona implícitamente (no se tiene que escribir) ya que cuando se realiza estas restringiendo el número de métodos que puedes invocar.
Interfaces
No te dejes engañar por código que muestre una clase concreta que declara haber implementado una interfaz pero no exista código que lo haga. Antes de decir que el código no es valido cabe mencionar que las superclases de ella pueden haber implementado esas interfaces.

Una clase puede implementar más de una interfaz. Es válido decir
public class Pelota implements Serializable, Runnable, Rebotable
{ ... }

Una interfaz puede extender (heredar) otra interfaz, pero nunca implementarla.
public interface Rebotable extends Movible { } // ok!

Una interfaz si puede extender (heredar) más de una interfaz
public class Programador extends Empleado, Trabajador { } // Illegal!
Aquí sí
public interface Rebotable extends Movible, Esférica { } // ok!


Regresando valores
  1. Puedes regresar null en un método que tenga un objeto como tipo de retorno.
  2. Un arreglo es un tipo legal de tipo de retorno
  3. En un método con un tipo primitivo de retorno, puedes regresar un valor o una variable que pueda ser implícitamente convertida (sin cast) en el tipo de retorno declarado.
  4. En un método con un tipo primitivo de retorno, puedes regresar un valor o una variable que pueda ser explícitamente convertida (usando un cast) en el tipo de retorno declarado.
  5. No debes de regresar ningún valor o variable de un método declarado como void.
  6. En un método con un tipo de retorno objeto, puedes regresar un cualquier objeto que pueda ser implícitamente convertida (sin cast) en el tipo de retorno

Constructores
  1. Los constructores pueden usar cualquier modificador de nivel de acceso, incluyendo private.
  2. El nombre del constructor debe ser el mismo que el nombre de la clase.
  3. Los constructores no tienen un valor o tipo de retorno.
  4. Es valido (pero sin sentido) tener un método con el mismo nombre de la clase, esto no lo hace un constructor. Si tiene un valor de retorno entonces es un método.
  5. Si no escribes un constructor en tu clase, entonces el compilador te hará uno automáticamente.
  6. El constructor generado por default nunca tendrá parámetros
  7. Si quieres un constructor sin argumentos, pero ya creaste otros constructors en tu clase, el compilador NO te proveerá de un constructor automáticamente. Así que tendrás que escribirlo tu mismo.
  8. Cada constructor tiene en su primera línea de código una llamada a un constructor sobrecargado (this()) o una llamada al constructor de la superclase (super()) aunque esta llamada puede ser insertada por el compilador (como primera línea de código)
  9. Una llamada a super() puede ser con o sin argumentos dependiendo del constructor de la superclase.
  10. No puedes hacer una llamada a un método de instancia o acceso a una variable hasta después de que el constructor de la super clase haya sido ejecutado
  11. Solo métodos y variables estáticas puede ser accesadas como parte de la llamada a super() o this, por ejemplo super(Animal.NAME) si NAME esta declarada como static.
  12. Las clases abstractas tienen constructores y son llamadas cuando una instancia de una subclase concretada es creada.
  13. Las interfaces no tienen constructores.
  14. Los constructores no se heredan. No son métodos. Y no pueden ser sobrescritos.
Una ejecución típica de un constructor es:
  1. El constructor llama al constructor de la superclase, que llama a su vez al constructor de su superclase y así sucesivamente hasta llegar al constructor Object.
  2. El constructor Object se ejecuta y regresa al constructor siguiente, hacía abajo de la cadena, hasta el final.
Modificador Static
  1. Las variables y métodos marcados como static pertenecen a la clase, más que a una instancia. De hecho se pueden usar los métodos o variables estáticas sin tener instancias de esa clase
  2. Un método estático no puede acceder a una variable no estática (de instancia). (Por ejemplo desde main() el cual es un método estático.
  3. Los métodos estáticos no pueden ser sobreescritos (overriden).

lunes, 28 de julio de 2008

Tips para el SCJP III

Ahora veremos dos temas muy importantes y algo complicados de entender. Override y overload, sobreescritura y sobrecarga. Además dos temas sencillos, relaciones y referencias.

Relaciones

  • Relación “Es Un”
  • Esta relación esta basada en el concepto de herencia o implementación de una interfaz. “Es un” quiere decir, “esta cosa es de tipo esta otra cosa”. Por ejemplo un Cocker es un tipo de Perro, en terminos de POO “Cocker Es Un Perro”. En java se usan las palabras reservadas extends e implements (para interfaces)
  • Una clase solo puede tener un padre, es decir no hay herencia múltiple. Solo puede extender de una sola clase.
  • La relación “Tiene Un”
  • Están basadas en uso más que en herencia. En otras palabras, la clase A Tiene Un B si código de la clase A hace referencia a una instancia de la clase B.
Referencias
  • 1. Una referencia puede ser de un solo tipo y una vez declarada ese tipo nunca puede ser cambiado (no obstante el objeto al que referencia si puede cambiar)
  • 2. Una referencia es una variable, por lo tanto puede ser reasignada a diferentes objetos (excepto cuando es declarada como final).
  • 3. El tipo de una referencia determina que métodos pueden ser invocados en el objeto que esta referenciando (muy importante).
  • 4. Una referencia puede “referenciar” a un objeto de ese mismo tipo o a una subclase del tipo declarado.
  • 5. Una referencia puede ser de un tipo de clase o de una interfaz. Si es de interfaz entonces cualquier objeto que implemente esa interfaz puede ser referenciado.
  • 6. El tipo de referencia (no el tipo del objeto), determina que métodos van a ser llamados.
Polimorfirmo y sobreescritura (Override)
  • Polimorfismo es que puedes tratar cualquier subclase de X como X. En otras palabras, puedes escribir código en una clase Z y puedes decir, “No me importa que tipo de objeto seas, siempre y cuando hayas heredado (extendido) de X haz esto”.
  • Siempre que tienes una clase que hereda de una superclase, entonces existe la posibilidad de sobreescribir (Override) el método (a menos que este marcado como final). El beneficio de la sobreescritura es que puedes definir comportamientos específicos para cada subclase en especial.
  • Los métodos polimórficos se pueden aplicar a métodos que hayan sido sobrescritos en métodos de instancia
Las reglas para sobrescribir (override) métodos son:
  • 1. La lista de argumentos debe ser exactamente igual que el método a sobrescribir. Si no son iguales entonces se hará una sobrecarga (cosa que no se deseaba)
  • 2. El tipo de retorno debe ser igual o de una subclase que en la versión original
  • 3. El nivel de acceso no puede ser más restrictivo.
  • 4. El nivel de acceso Si puede ser manos restrictivo.
  • 5. Los métodos de instancia pueden ser sobrescritos sólo si fueron heredados por la subclase.
  • 6. Una subclase en el mismo paquete que la superclase puede sobrescribir cualquier método que no sea marcado como private o final. Una subclase en un paquete diferente puede sobrescribir solo aquellos métodos que estén marcados como public o protected.
  • 7. Los métodos sobrescritos no puede lanzar nuevas o “mayores” excepciones que las de la superclase. Por ejemplo, un método que declara una ArchivoNoEncontradoException no puede sobrescrito por un método que declare una SQLException o Exception, a menos que sea una subclase de ArchivoNoEncontradoException.
  • 8. El método de la subclase puede lanzar menos o “menores” excepciones.
  • 9. No se puede sobrescribir un método declarado como final
  • 10. No se puede sobrescribir un método declarado como static
  • 11. Si un método no puede ser heredado entonces no se puede sobrescribir. Recuerda que los métodos sobrescritos implican que estas reimplementando un método que heredaste.
  • 12. Deben de tener el mismo tipo de retorno. En Java 5 el tipo puede ser una subclase, esto se conoce como covariant retun.
Es común que desees usar la versión de la superclase de un método y además sobrescribirlo con cosas extras. Esto es fácil de hacer con la palabra reservada super.

Sobrecarga de métodos (Overload)
Los métodos sobrecargados te dan la posibilidad de reusar un nombre de método en una clase, pero teniendo diferentes argumentos (y opcionalmente diferente tipo de retorno).
Las reglas para sobrecargar métodos son:
  • 1. Los métodos sobrecargados deben cambiar la lista de argumentos.
  • 2. Los métodos sobrecargados pueden cambiar el tipo de retorno.
  • 3. Los métodos sobrecargados pueden cambiar el modificador de nivel de acceso.
  • 4. Los métodos sobrecargados pueden declarar nuevas o mayores excepciones
  • 5. Un método sobrecargado puede estar en la misma clase o en una subclase ya que los métodos se pueden heredar y una subclase puede definir otro método sólo en esa subclase.
La elección de qué método sobrecargado se va a llamar NO se decide dinámicamente en tiempo de ejecución. Hay que recordar que el tipo de la referencia(no del objeto) determina que método sobrecargado va a ser invocado.

En resumen:
La versión del método sobrescrito se decide dinámicamente basado en el tipo del objeto. Pero lLa elección del método sobrecargado se basa en el tipo de la referencia en tiempo de compilación.

jueves, 24 de julio de 2008

Tips para el SCJP II

Siguiendo con tips para la certificación de Java, veamos el siguiente capítulo, donde hablaremos de los modificadores, de las variables ya sean de instancia o locales y de otros temas menos conocidos pero importantes como las Enums o los Var-args

Modificadores

  1. Es ilegal tener un solo método abstract si la clase no esta declarada como abstract.
  2. Sin embargo puedes declarar la clase como abstract y no tener métodos abstract.
  3. Un método nunca puede ser marcado como abstract y final.
  4. Un método nunca puede ser marcado como abstract y private
  5. El modificador abstract nunca puede ser combinado como static.
  6. El modificador synchronized sólo se aplica a métodos.
  7. El modificador native solo se aplica a métodos.
  8. El modificador strictfp solo se puede aplicar a clases o métodos
  9. Si un miembtro de una superclase es public, entonces la subclase lo heredará, no importando el paquete.
  10. Los miembros que son accesados mediante el operador punto (.) pertencen a la misma clase.
  11. La palabra this se usa para referise al objeto que se está ejecutando.
  12. this.unMetodo() es lo mismo que invocar unMetodo();

Variables de instancia
  1. Pueden usar cualquier de los cuatro niveles de control de acceso
  2. Pueden ser marcadas como final
  3. Pueden ser marcadas como transient
  4. No pueden ser marcadas como abstract
  5. No pueden ser marcadas como synchronized
  6. No pueden ser marcadas como strictfp
  7. No pueden ser marcadas como native
  8. No pueden ser marcadas como static, porque entonces se convierten en variables de clase.

Variables locales
  1. Las variables locales, de pila, o de método, no pueden tener modificadores de nivel de acceso.
  2. Final es el unico modificador que pueden tener.
  3. Las variables locales no tienen valores iniciales, por eso deben ser inicializadas.

Otros

  1. No es legal incluir el tamaño del arreglo en la declaración int[5]algo; Esto no va a compilar
  2. Las Enum no son ints ni Strings.
  3. Las Enums no puden ser declaradas dentro de un método, pero si dentro o fuera de una clase.
  4. Las Enums pueden contener constructores, métodos, variables y constantes.
  5. Los constructores de Enums no pueden ser invocados directamente
  6. En Java 5 los métodos puede declarar parámetros que acepten de 0 a muchos argumentos, se llaman Var-args.
  7. Un vararg es declarado con su tipo … nombre, por ejemplo : algo (int … x) {}
  8. Un método solo puede tener un parámetro vararg, y si existe debe ser el último en la lista.

Tips para el SCJP I

Dado que estoy estudiando para pasar el SCJP he empezado a leer algunos libros y he ido tomando notas. Así que puedo compartirlas para aquellos que también quieran certificarse en Java o simplemente quieran conocer más acerca de este lenguaje de programación.

Para iniciar hablaremos sobre aspectos fundamentales tales como: Clases, declaraciones, identificadores, niveles de acceso e interfaces.

Estos son tips sencillos y útiles cuando ya se tienen cierta experiencia y conocimiento del lenguaje, son cosas que a veces se nos olvidan o que no prestamos tanta importancia pero en el examen si son tomadas en cuenta.

Clases
  1. El acceso por default se indica si no tiene un modificador precediendo el nombre de la clase. Es el tipo de control que se llama también a nivel de paquete, ya que una clase con acceso default sólo puede ser vista por clases que se encuentren en ese mismo paquete.
  2. Acceso public. Se antepone el modificador public antes del nombre de la clase. Esto indica que todas las clases de todos los paquetes pueden acceder a ella.
  3. Clases finales. Cuando se usa en una declaración de clase, la palabra reservada final indica que la clase no puede ser extendida .En otras palabras ninguna otra clase puede heredar de ella.
  4. Clases abstractas. Es una clase que nunca puede ser instanciada. Su sola razón de existir es ser extendida.
Identificadores
  1. Deben iniciar con una letra, un símbolo de dólar ($), o un guión bajo(_). NO pueden iniciar con un número.
  2. Después del primer carácter pueden contener cualquier combinación de números, letras, símbolos de dólar y guiones bajos
  3. No se pueden usar las palabras clave como identificadores
  4. Java es un lenguaje sensible: Perro y perro son diferentes identificadores.
Declaraciones
  1. Solo puede haber una clase public por archivo fuente.
  2. Si existe una clase pública entonces el nombre del archivo debe de ser el mismo que la clase pública.
  3. Un archivo puede tener más de una clase que no sea publica.
Interfaces
  1. Piensa en una interfaz como una clase 100% abstracta. Pero ten en cuenta que mientras una clase abstracta puede definir métodos abstractos y no abstractos, una interfaz sólo puede tener métodos abstractos.
  2. Todos los métodos de una interfaz son implícitamente públicos y abstractos.
  3. Todas las variables de una interfaz deben ser public, static y final. Es decir solo se pueden declarar constantes, no variables de instancia.
  4. Los métodos de las interfaces no pueden ser marcados como final, strictfp o native.
  5. Una interfaz puede extender una o más interfaces
Niveles de Acceso
  1. Existen 4 niveles de control de acceso para métodos
  • public
  • protected
  • default
  • private
  1. Debes de tener en cuenta el efecto de diferentes combinaciones de acceso. Para ello primero ver el nivel de acceso de la clase y luego de los miembros. Si la clase no es visible en si misma entonces tampoco lo serán los miembros aun cuando éstos sean declarados como public.
  2. Los miembros marcados como private no pueden ser accesados por código escrito en otra clase que no sea la que los declaro como private.
  3. Un miembro que usa nivel de acceso por default puede ser accesado por otra clase solo si pertenece al mismo paquete (package), mientras que un miembro protected puede ser accesado (mediante herencia) por una subclase incluso si la sublclase esta en otro paquete.
  4. El nivel de acceso protected se usa para definir que una subclase de ésta puede acceder al miembro aun cuando la superclase y la subclase se encuentren en paquetes diferentes.

miércoles, 23 de julio de 2008

Acerca del SCJP


Primero hay que decir qué es el SCJP = Sun Certified Java Programmer (SCJP). Es un examen que es considerado uno de los más dificiles en la insdustria de las TI.

Este examen trata de probar tu completo entendimiento del lenguaje Java, no sólo partes de las cuales conoces más. La experiencia de proyectos es importante pero también hay que estudiar y leer mucho ya que aun cuando creas que lo sabes todo, leyendo e informandote verás que no es así y por ello este examen es considerado complicado.

Acutualmente existen 8 certificaciones en Java con sus respectivos exámenes pero el punto de partida es éste.

En resumen el SCJP esta diseñado para:
probar tu conocimiento del lenguaje de programación Java. Requiere conocimiento detallado sobre la sintaxis, conocimientos del núcleo de Java, algunas APIs. También prueba el conocimiento de conceptos de programación orientada a objetos (POO). No necesita prerequisitos


jueves, 3 de abril de 2008

1... 2... 3... Probando... Probando (JUnit con NetBeans)

Todos los que programamos sabemos que una parte escencial del software es la fase de pruebas, y aún si no sigues una metodología en específico siempre habrá que probar las clases para que se vean que hacen lo que debe de hacer (y tambien habría que probar que no hacen cosas de más).

Entonces hablando en este contexto, una JUnit es una unidad(es decir una clase como tal) para probar código en el Lenguaje Java.
JUnit también es todo un entorno (framework) para hacer pruebas de las clases Java de manera controlada, puedes manejar métodos por separado, especificar como debe ser la salida, verificar una condición y al final la JUnit te dira si fue exitosa o fallida.

Pero... que flojera tener que escribir tanto código para una clase de prueba, es cierto, por ello existen los IDEs que nos facilitan la vida como NetBeans y como había mencionado estoy probando la version 6.1 así que aquí unas pequeñas imagenes de como son las JUnit en NetBeans.

Para crear una JUnit ir a New File y buscar en la carpeta JUnit (no es mucha ciencia)

Cuando se crea una JUnit no la encontrar en los paquetes fuente (source,src) sino que esta en los de prueba (Test) por defecto la el nombre de la clase es algo como MiClaseTest.java

Como verán es una clase Java normal, sólo que existen ciertas "anotaciones" como @Test
@Before, @After, @BeforeClass, @AfterClass que van antes de cada método e indican ciertas acciones a realizar. La más importante es @Test e indica que ese método tendrá una salida en particular (mostrada más abajo).

En el Menu Run buscamos Test "NombreDelProyecto" y automáticamente NetBeans hará correr todas clases clases de prueba con todos los @Test que hayamos definido. Por supuesto también podemos probar solo una clase en particular.

Finalmente aquí vemos la salida de una prueba que realice en un proyecto, como verán esta desglosado primero en Clases, luego en métodos de cada clase(que contienen @Test) y luego cada método tiene un resultado puede ser Exitoso, Fallido o que causó Error.


Lo anterior fue probado con NetBeans 6.1.

Si no conocen este IDE es hora de darse una vuelta por su pagina y checar todo lo que tiene, ya que cada día crece más y no sólo para realizar activiades específicas de Java como las JUnit, sino que también cuenta ya con:
  • Administración sencilla de MySQL
  • Soporte para el lenguaje de programación Ruby
  • Modelado con UML
  • Soporte para API's como Google, Youtube, Facebook
  • etc...
Suerte! (No se olviden del concurso para bloggear sobre NetBeans 6.1)