lunes, 28 de diciembre de 2009

Actualización de NB 6.8 en Español

La principal razón por la que no se usa un software traducido al español es que está mal traducido. El trabajo de traducción de NB es realizado por la comunidad, y no recibimos ni un duro por ello. Nuestra recompensa es la satisfacción de que el software salga y (al menos en mi caso) ver que compañeros de trabajo o de estudios usen esa versión.

Pido disculpas a nombre de la comunidad de traducción de NB por los errores gramaticales, contextuales y demás encontrados en el software. Algunos quizás hemos traducido con prisa, usamos el Google translate, no revisábamos la semántica.. o la dificultad más grande: no sabemos en qué parte del IDE se encuentra el texto que queremos traducir: solo nos presentan el texto y nada más. Solo se puede encontrar el error una vez que ya está compilado el software.

Afortunadamente, la gente de NetBeans.org nos permite aún actualizar las traducciones: lo días viernes recopilan los cambios, y los lunes lanzan un nuevo "binario" (más info: http://netbeans.org/projects/nblocalization/lists/dev/archive/2009-12/message/71)

Hemos encontrado algunos errores que ya están disponibles en la versión de hoy. Por ejemplo, esto decía (reportes trackers, operador XML.. que por cierto, no sé de donde salió tal traducción)


y ahora dice:


Otro, en el menú archivo, cuando se quería tener el código fuente en un archivo HTML, decía:


Ahora dice:


Y otro que me di cuenta cuando usaba las bases de datos desde el NB. Al momento de truncar el contenido, decía:


Ahora dice:


Y así más errores están apareciendo. Si encontráis algún error, comentadlo en este blog.

viernes, 25 de diciembre de 2009

Hace mucho tiempo...

Hoy es Navidad.
Los anuncios en las calles y la TV así lo demuestran: Regala felicidad, regala alegría, regálate un celular, regala.. regala.. regala (por no decir: compra, compra, compra).
A esto todos estamos de acuerdo que la Navidad se ha comercializado.... entonces ¿qué es realmente la navidad?
Ah!.. sí..!!. navidad es amor, amistad, solidaridad, compartir, estar en familia, estar con los que amamos, estar con los amigos .. celebremos, champagne, pavo, etc.... eso. eso es Navidad.. "ven a mi casa esta navidad"!!...

Hey.. no!. Tengo algunos correos que han enviado a toda la empresa donde estoy, de diferentes oficinas.. ahí debe decir lo que es la Navidad. Veamos:
  1. Navidad es ese niño que nace en nuestro interior y que motiva en nuestros corazones los sentimientos más nombres y la esperanza por un mundo mejor. Se cambia de año; se cambia de sueños; se cambia de objetivos; se cambia de aspecto. Pero jamás, jamás se cambia de amigos.
  2. Brindemos por una Navidad y un hermoso año unidos en familia y con la esperanza que Jesús llegue a nuestros hogares con amor, paz y prosperidad.
  3. Que la Navidad lleve PAZ, JUSTICIA, y DESARROLLO SOSTENIBLE para todos nuestros hermanos del planeta.
  4. Que en estas fiestas, la magia sea tu mejor vestido, tu sonrisa el mejor regalo, tus ojos el mejor destino, y tu felicidad nuestro mejor deseo.
  5. Que esta Navidad convierta cada deseo en flor, cada dolor en estrella, cada lágrima en sonrisa  y cada corazón en una dulce morada para Jesús.
  6. Con alegría busquemos en esta navidad la unión entre todos para lograr el bienestar que los niños y las niñas del Perú necesitan. Y que la riqueza de todos los pueblos y culturas fortalezcan nuestra labor día a día en este nuevo año 2010.
  7. ¡Felices fiestas!
  8. Estas fiestas de reflexión y renovación son una muy buena
    oportunidad para compartir con todos y todas nuestras intenciones
    de alcanzar, con el balance del año que se va, mejores decisiones
    que renueven y fortalezcan nuestros ideales y nos comprometa,
    desde lo cotidiano, a mejorar nuestra labor en favor de la
    educación en nuestro país.
    Feliz Navidad y un Año Nuevo lleno de desafíos y satisfacciones!!!!
  9. Que este, nuestro pequeño mundo sea cada vez mas humano Que todo lo que Soñamos, imaginamos e intuimos se transforme en "realidades" Que el amor por el prójimo sea nuestra meta absoluta Que nuestra larga jornada de los próximos 365 días este repleta de cosas buenas FELIZ NAVIDAD. (he transcrito tal cual.. con errores y todo)
  10. La Navidad y la noche de paz que la precede es,  para la humanidad portadora de sublimes experiencias como: amor, alegría, felicidad, jolgorio de niños y niñas, regocijo del espíritu, espacio para compartir con nuestros seres queridos, tiempo de reflexión y propósitos para el logro de nuestras aspiraciones, ocasión para mirar el futuro con optimismo y confianza, y mucho más aún, que todo esto colme nuestros corazones en esta navidad y que el año venidero nos depare dicha y felicidad, son los sinceros deseos de....
  11. Felicidades en estas fiestas navideñas, y que esta noche de paz sea tan solo el comienzo de un año pleno de esperanza y alegría, son los mejores de deseos de...
(hay como 5 saludos más y quizás hayan más.. aún no paran de llegar)

Ajá! la Navidad siempre viene (al menos en mi país Perú) con el Año nuevo.  Siempre en estas fechas se dice "Feliz Navidad y Próspero Año Nuevo 20....", y cuando pasa el 25 y se acerca el 31 cambian a "Feliz Año 20.." ¿Ya no lo dijeron la semana pasada?

Entonces.. eso es Navidad: prosperidad, estar en familia, que es comienzo de un nuevo año.. y todos.. TODO el mundo dice lo mismo.

Ahora.. vayamos a Wikipedia y veamos lo que dice que es Navidad:
La navidad (latín: nativitas, 'nacimiento' ) es una de las fiestas más importantes del Cristianismo, junto con la Pascua y Pentecostés, que celebra el nacimiento de Jesucristo en Belén.
What? y entonces? todos esos saludos que se dicen la gente en estas "fechas" ? alguien miente.. no señor... que venga mi abogado!!, que venga mi contador!! o Wikipedia miente o los saludos mienten!!.

Aquí es donde todos toman un segundo y dicen "pero Navidad es cuando Jesús nació.. " y luego agregan " por eso debe amor en el hogar, amor con los hermanos.. que todos los días sean navidad.. bravo!"

¿sabemos realmente por qué nació el niño Jesús? Si hubieras visto a un niño recién nacido (fuere tu hijo o sobrino), lo ves tan bello.. y cuando vemos la navidad nos imaginamos que es como ese niño recién nacido.. claro, Navidad no es Navidad si no hay un nacimiento. ¿Pero si te dijeran que ese niño que tienes entre manos y lo contemplas.. ese niño deberá morir porque te ama a ti?  Pero Dios es Amor ¿Eso no dicen? Sí.. así es. El mundo, tú, yo, nosotros, ellos.. TODOS nos hemos alejado de Dios.. nos hemos perdido, y no hay manera de acercarnos a Él. Por ejemplo, unos mineros atrapados en una mina ¿pueden salir bajo sus propios medios? De ninguna manera.
A Dios le dio mucha tristeza ver que su máxima creación (el humano) se pierda. Por ello, hace mucho tiempo.. hace más de dos mil años, Dios dejó su Gloria de lo Alto, vino a ser humano, nació  de una mujer virgen (por el Espíritu de Dios, no de hombre, porque el hombre había fallado a Dios desde el inicio), creció, curó enfermedades a su pueblo, dio el mensaje de Salvacación... luego se dejó crucificar, se dejó morir. Por lo que todos nos hemos alejado de Dios nos corresponde ir al infierno eterno, a la muerte segunda, a la muerte eterna.. pero Dios, por amor, dejó el Cielo, se hizo humano, y murió para que TÚ ni YO muramos en esa segunda muerte, para que nuestra alma no muera. El cuerpo morirá, pero el alma no morirá SI CREEMOS QUE JESÚS ES EL SEÑOR, QUE VINO A MORIR POR NOSOTROS, Y QUE DESPUÉS VENCIÓ A LA MUERTE CON SU RESURECCIÓN.

  • "Porque la paga del pecado es muerte" (Romanos 6:23a)
  • (Juan 14:6) Jesús le dijo: "Yo soy el camino, y la verdad, y la vida; nadie viene al Padre, sino por mí. "
  • "Porque de tal manera amó Dios al mundo, que ha dado a su Hijo unigénito, para que todo aquel que en él cree, no se pierda, mas tenga vida eterna. Porque no envió Dios a su Hijo al mundo para condenar al mundo, sino para que el mundo sea salvo por él. El que en él cree, no es condenado; pero el que no cree, ya ha sido condenado, porque no ha creído en el nombre del unigénito Hijo de Dios. " (Juan 3:16-18)
La Navidad es total amor de Dios, total Paz que solo Él la da, es el Perdón que Dios nos dio a través de su Hijo. La Navidad comienza con el nacimiento, continua con la vida de Jesús y la muerte de Él, y la resurrección venciendo a la Muerte.

Porque un niño nos es nacido, hijo nos es dado, y el principado sobre su hombro; y se llamará su nombre:
  • Admirable, 
  • Consejero, 
  • Dios Fuerte, 
  • Padre Eterno, 
  • Príncipe de Paz.
(Isaías 9:6)

Que tengas una Bendecida Navidad.

PD.: Si tú murieres en este momento ¿sabrías a donde vas? Si quieres conocer la respuesta, visita: http://tinyurl.com/como-ir-al-cielo

lunes, 21 de diciembre de 2009

martes, 15 de diciembre de 2009

JavaFX Composer

ya está disponible el plugin JavaFX Composer desde el Centro de Actualización de NetBeans 6.8 (Herramientas > Complementos)


Ahora, al crear un nuevo proyecto JavaFX, habrá un nuevo tipo de proyecto.



Luego, el diseño de la aplicación e totalmente visual.





Aquí hay un vídeo sobre el Plugin

http://netbeans.org/project_downloads/javafx/fxc_simpleapp/index.html

A disfrutarlo!

lunes, 14 de diciembre de 2009

Conferencia virtual de java EE 6 y NetBeans 6.8

¿Qué es Java EE y por qué es importante para los desarrolladores?
¿Cuáles son las nuevas características de Java EE 6 y cómo puede ayudar a los desarrolladores a ser productivos?

Obtén las respuestas a estas preguntas y más en la Conferencia Gratuita Virtual Java EE 6 y GlassFish v3.

Día: 15 de diciembre de 2009.
Lugar: A nivel mundial.
Hora: 08:00 - 17:00 (PST - Hora del pacífico). Verificar las zonas horarias respectivas de acuerdo a tu país.

Regístrate ahora
Agenda de la conferencia (PDF)

¡No faltes!

jueves, 10 de diciembre de 2009

NetBeans 6.8 ya está aquí


NetBeans 6.8 ya salió a la luz.

Es el primer IDE que soporta Java EE6, incluyendo Java EE Web Profiles, EJB 3.1, JPA 2.0, GlassFish Metro 2.0 web services (JAX-WS 2.2), JAXB 2.2.

También crea aplicaciones JavaFX 1.2.1. Soporte completo para PHP 5.3 (con namespaces) y muchas características más.

Puedes descargarlo de aquí: http://netbeans.org/downloads/?pagelang=es...

Si quieres ver a NetBeans 6.8 en acción, revisa los siguientes vídeos: http://netbeans.org/kb/docs/intro-screencasts.html

ah! también está disponible en Español, gracias a la comunidad de Traductores del IDE al Español. GigaGracias a todos ellos.

lunes, 7 de diciembre de 2009

NetBeans 6.8 / JSF 2.0 / EJB 3.1 / JavaEE 6 / GlassFish 3

En NB 6.8 existe un mejorado asistente para crear un CRUD usando JSF 2.0/EJB 3.1/JPA 2.0.

Aquí está un vídeo demostrativo. Las tablas se crean automáticamente a partir de las clases entidad que se crearon.

martes, 1 de diciembre de 2009

Convenciones para JavaFX

Tor Norbye (Ingeniero de Sun) nos presenta una actualización de las conveciones para el Lenguaje JavaFX.
No es un documento oficial de Sun, sino es una propuesta suya, una sugerencia para poder desarrollar mejor en JavaFX.

Está muy bueno:

http://wikis.sun.com/display/JavaFxCodeConv/Home

con referencia a: Home - JavaFX Coding Conventions - wikis.sun.com (ver en Google Sidewiki)

lunes, 30 de noviembre de 2009

NetBeans 6.8 RC 1

Se publicó (por fin) el NB 6.8 RC1.. el cual incluye la traducción al español.

http://download.netbeans.org/netbeans/6.8/rc/

Spring ROO - Para desarrollar una aplicación en 10 minutos

En el JavaDay se expuso Spring Roo, al cual quedamos mi esposa y yo sorprendidos por la rapidez para poder crear una aplicación.

Aquí presento un vídeo que muestra la simpleza de este framework.

sábado, 28 de noviembre de 2009

ApuntesDeJava.com

Gracias a mi amada esposa, ahora mi blog tiene dominio propio:

http://apuntesdejava.com

Ahora, cada vez que se acceda a apuntesdejava.blogspot.com, se redireccionará al nuevo dominio.

Sigamos con los apuntes de Java...

viernes, 27 de noviembre de 2009

Java Day en la UNI - agradecimientos

Anoche se realizó el Java Day en la UNI, donde se expusieron interesantes temas respecto a la tecnología Java, los frameworks (como Spring MVC, Spring ROO) que apoyan enormemente al desarrollo de aplicaciones, las tendencias del desarrollo de sistemas basados en SOA, y más. Fue realmente impresionante.

Solo que el tiempo no nos dió para más. Habían muchos temas que se quedaron en el tintero.

Agradezco a José Luis Casiano por haberme invitado como expositor a este evento. Estuvo todo organizado... y (como le dije).. su tranquilidad me desesperaba. Otras personas estarían golpeándose la cabeza o gritando cuando algo no habría salido como espera.. pero José Luis mantuvo la calma de un cirujano en plena operación.

Los que no pudieron ir ayer al evento, aquí les dejo mi presentación sobre Java EE6.

También me tocaba exponer sobre JavaFX... solo que el tiempo ya se nos había acabado. Así que aquí publico la presentación de JavaFX.


Anoche no pude acabar con la demostración de una aplicación usando JavaEE6, así que en un siguiente post publicaré el código fuente (además del proyecto para que lo puedan bajar) y de la misma manera sobre JavaFX. Tenía unos ejemplos monos.. en fin.. ya será para otra oportunidad.

jueves, 26 de noviembre de 2009

Unit Test para EJB 3.1

NetBeans 6.8 viene con una (de muchas) característica novedosa: Pruebas Unitarias para EJB 3.1.
Para ello, primero recordemos lo siguiente:
  1. EJB 3.1 es parte de Java EE 6
  2. Glassfish V3 implementa Java EE 6
  3. NetBeans 6.8 tiene soporte para Java EE 6, y por tanto también a Glassfish V3
Hecha esta aclaración, probemos lo siguiente: Hacer un módulo ejb para GF3 llamado CalculadoraModule.



Ahora, recordemos algunas de las características del EJB 3.1:
  1. Existen los @Singleton que son como un Stateless pero único y perpetuo en el contenedor. Permite también sincronización para evitar "datos cruzados".
  2. Ya no requiere de una interfaz como local o remote, puede ser una clase y nada más.
  3. Para acceder a través de un JDNI no se necesitará de direcciones raras según sea el contenedor. Todas serán "globales" para un mismo estándar.

Hecho el recordatorio, crearemos un SessionBean pero que sea Singleton y que no sea ni local ni remote. Este Bean se llamará "SeriesBean"



Para nuestro ejemplo, crearemos un método llamado "factorial" que hace justamente eso: calcular el factorial

package ejb;

import javax.ejb.LocalBean;
import javax.ejb.Singleton;

@Singleton
@LocalBean
public class SeriesBean {

    public long factorial(long base) {
        if (base < 1) {
            return 1;
        }
        return factorial(base - 1) * base;
    }
}


Con la clase recién creada y seleccionada, entramos a la opción del menú principal: Tools > Create JUnit Tests. Seleccionamos a JUnit 4.x. Luego, en la ventana de creación de la prueba, seleccionar al menos las siguientes opciones: Method Access Level: Public, Generated Code: Default Method Bodies

Clic en OK, y veamos la clase que ha creado.

package ejb;

import org.junit.AfterClass;
import org.junit.BeforeClass;
import org.junit.Test;
import static org.junit.Assert.*;

public class SeriesBeanTest {

    public SeriesBeanTest() {
    }

    @BeforeClass
    public static void setUpClass() throws Exception {
    }

    @AfterClass
    public static void tearDownClass() throws Exception {
    }

    @Test
    public void testFactorial() throws Exception {
        System.out.println("factorial");
        long base = 0L;
        SeriesBean instance = (SeriesBean)javax.ejb.embeddable.EJBContainer.createEJBContainer().getContext().lookup("java:global/classes/SeriesBean");
        long expResult = 0L;
        long result = instance.factorial(base);
        assertEquals(expResult, result);
        fail("The test case is a prototype.");
    }

}

Modifiquemos un poco el código para ver si es cierto que nos ha creado un JUnit para un EJB.

    @Test
    public void testFactorial() throws Exception {
        System.out.println("factorial");
        long base = 20;
        SeriesBean instance = (SeriesBean)javax.ejb.embeddable.EJBContainer
                .createEJBContainer()
                .getContext()
                .lookup("java:global/classes/SeriesBean");
        long expResult = 2432902008176640000L;
        long result = instance.factorial(base);
        assertEquals(expResult, result);
    }


Ejecutamos la prueba con Alt+F6 y listo.


Ahora podemos crear y probar EJBs con más comodidad.

viernes, 20 de noviembre de 2009

Discusión de lenguajes

No sé cómo llamar este post, pero es un extracto de los comentarios de un post de SinergiaSinControl.com titulado "Dominación mundial"
Me pareció buenísimo. Aquí les comparto:

 UN puntero a null que hoy sale del stack dijo...

    Hola, hoy quiero gritar al mundo que soy un puntero a null, y no me averguenzo de ello.
    Sí, hoy he decidido no ocultarme más y reivindicar desde este foro de Sinerjias un día anual del orgullo null. PORQUE HAY OTRAS FORMAS DE VIVR LA SEXUALIDAD QUE APUNTAR A UNA POSICIÓN VÁLIDA DE MEMORIA, COPÓN YA!!!



variable del PHP dijo...

    Al puntero ese que ha salido del stack; ¡anticuado! ¡carrozón! ¡ahora lo que se lleva es ser BI. Yo ahora mismo soy un string, y puedo ser una fecha o un objeto, o un puercoespín rosa.

    ¡Dia del orgullo SCRIPT ya!



UN puntero a null que hoy sale del stack dijo...

    Variable de PHP, por culpa de entidades promiscuas como vosotras, que lo mismo les da hacérselo con un tipo de dato u otro es por lo que la sociedad nos mira mal.
    Con Ada Lovelace esto no pasaba


Malloc dijo...
    aaaaah, los tiempos de Ada Lovelace... ¡qué mujer! ¡la primera programadora! ¡y fiel al estilo femenino, era programadora cuando no existían ordenadores!

    mujeres: complicándose la vida desde tiempos inmemoriales

    Para una función de edad, como yo, sois todos unos drogadictos, jovenzuelos indecentes. Y tú, puntero, un poco de decoro, que eres de un lenguaje con clase, hombre, no como esa pestuza del PHp o esos delincuentes de javascript.


UN puntero a null que hoy sale del stack dijo...
    Hombreee, malloc()!!.... digo...Funciooón, malloc()!!!
    Que alergía verte por estos lares.
    Con la de buenos ratos que hemos pasado tu y yo.
    Te acuerdas cuando nos dedicábamos a apuntar aposiciones aleatorias? LAs caras quese le ponían a los testers. Juas juas juas, que tiempos


Objeto dijo...

    Estáis todos locos. Todos ahí enseñando vuestras vergüenzas sin decoro, que todos vean vuestras intimidades... Luego que os hacen un DoS de nada y os vais por la patilla abajo. Si ejjjque...


UN puntero a null que hoy sale del stack dijo...
    éramos pocos e invocaron al construcor de la clase Abuela.

    Objeto: No vengas aquí a dártelas de casto y puro. Os creeis que por ser de alto nivel perteneceis a una estirpe superior. Me se de unos cuantos casos de colegas tuyos, y tengo papeles que lo demuestran, que generan NullpointerException cuando se creen que nadie les está mirando.
    Si ejjjqueee.


Nacho Álvarez dijo...

    Legalizar punteros nulos xDDDDDDDD...


Un NullPointerException dijo...

    Para el puntero a null que salio del closet, nosotros no somos seres generados por objetos malintensionados.

    Somos generados espontáneamente cuando la nada quiere hacer algo, lo que motiva una ruptura en la continuidad espacio-temporal de la cual somos el resultado palpable.

    Y los programadores quieren dominar el mundo, jajajaja, estarán preparados el día que puedan controlar su código para que nosotros o los StackOverflowException (primos lejanos nuestros, que se generan también en rupturas espacio-temporales) no podamos aparecer.

    Mientras no lo logren, seguirán siendo dominados por los releases retrasados y por los logs de errores, y nosotros seguiremos dominando el mundo, buaaaaaaaaaaaaaaaah.


UN puntero a null que hoy sale del stack dijo...

    NullPointerException, vosotros sois los pedos de los objetos decadentes, pero no teneis que avergonzaros de ello. Estamos todos en el mismo bando, hermano y lucharemos...
    Lucharemos hasta /dev/null si hace falta, para que los pérfidos programadores no dominen el mundo.

    NOOO NOO NO NOS MOVERÁN...
    NOOO NOO NO NOS MOVERÁN...
    DEL BANCO DE MEMORIA...NO NOS MOVERÁN!!

public static void main dijo...
    Yo soy el alfa y el omega,
    el inicio y el fin.

    Un metodo para dominarlos a todos,
    y hacerlos punteros nulos,
    en las tinieblas
    donde habita Mr Puertas.


Duczen dijo:
(...)  Como erradiques el 99% de los errores, me sé de un sector que iba a sufrir paro a mansalva.

Pascal (lenguaje zombi) dijo...
    tranquilo, Duczen. los errores, por definición, son infinitos. Son como los zombis, cuando matas uno, otro distinto ocupa su lugar.

UN puntero a null que hoy sale del stack dijo...
    Pascal, no menciones la soga en casa del ahorcado, juuuurl
    POr cierto, tu no te dedicabas ahora a hacer anuncios de yogures bio y leche descremada? O era otro Pascal? Es que con esto de tener las mente a null a veces pierdo el hilo

Una consulta SQL dijo...

    Jajajajaja, ilusos, ustedes hacen mi trabajo sucio, yo soy el pu** Stalin de los lenguajes!!!

fichero binario dijo...

    stalin, stalin...¡hasta tú me obedeces a mí! ¡pringao! ¡eres el oficinista que clasifica los datos!

miércoles, 11 de noviembre de 2009

Sun en el mundo OpenSource

Aquí comparto una interesante presentación realizada por Ezequiel Singer. Sin duda algo que no deberiamos pasar por alto.



martes, 10 de noviembre de 2009

MVC / MVP

El Modelo - Vista - Controlador es encontrado en casi cualquier artículo y muchas tecnologías demanda usar estos principios, por lo que genera bastante confusión en su significado actual y sus variaciones.

Aquí podrán encontrar una definición sobre el MVC - que fue creado en los 70s -, y el MVP que fue creado en los 80s. Vamos, el tiempo pasó, y en el mundo de la tecnología, solo un año es suficiente para cambiar radicalmente el mundo.

Aquí el enlace.. un interesante artículo.

http://wiki.apidesign.org/wiki/MVC (en inglés)

Java: Primeros pasos - La revista

El grupo "Java: Primeros Pasos" ha lanzado el segundo número de su revista digital. La podéis descargar de aquí

http://osum.sun.com/group/javaprimerospasos

Los temas que tratan en este número son:
  1. Java Web "JSP": Cómo crear una JSP. (Usando el único IDE que lo tiene todo: NetBeans*)
  2. Instalación de MySQL, Apache y PHP en Fedora

Muy recomendada para quienes recién se inician en el mundo Java.

Felicitaciones al grupo

(*) La publicidad de NB en este post es mía :)

viernes, 6 de noviembre de 2009

Java Day en la UNI

José Luis Casiano, miembro líder de OSUM UNI,  anuncia el Primer Java Day en la UNI.
Se realizará el día 26 de diciembre en el auditorio CTIC de la Universidad Nacional de Ingeniería.
Los temas a tratar son los siguientes:
  • Presentación de Open Source University Meeting (OSUM) and Sun Academic Initiative (SAI)
  • Test Driven Development ( Diseño dirigido por pruebas ) – Juan Carlos Vergara
  • Lo Nuevo de JavaEE6 – Diego Silva (Sí, yoo!)
  • Spring ROO- José Diaz
  • Spring MVC- Susan Inga
  • Service Oriented Architecture (SOA) – Javier Rosado Carrizo
Habrán premios para los asistentes.. y coffee break. :)

Comienza a las 7pm.. así que ahí nos vemos.

LA ENTRADA ES LIBRE.


Actualización: Comienza a las 6pm!!

jueves, 29 de octubre de 2009

migración de netbeans.org

Netbeans.org cambiará de hosting y de todo sus contenidos y servicios.
Según lo planeado, esto van a migrar:

  • Sistema de seguimiento de errores. Usarán el Bugzilla (bien por ello!)
  • Proyectos y usuarios. Algunos proyectos van a tener que ser retirados porque son obsoletos. La lista completa está aquí:
  • Listas de correo: ya están trabajando con las subscripciones, moderadores y más.
  • Contenido de la web. Puf! la web en español sigue en menos de 95%. Espero que nos podamos dedicar en ello algún día. Aunque mencionan que ahora usarán subversion para actualizar el contenido, y no los .html estáticos.
  • Archivos y descargas.
  • Wiki: Conversion de JSPWiki a MediaWiki. El MediaWiki es el usado por wikipedia.org.
Es muy probable que también ofrezcan el servicio de mensajería instantánea.

Más información aquí: http://wiki.netbeans.org/NewNBOrg

miércoles, 28 de octubre de 2009

Plugins curiosos para NetBeans 6.8

Considero que la capacidad de un software también se mide por la de sus complementos.

Aún no sale la versión oficial de NB 6.8 (en este momento está en versión Beta) y he podido ver algunos plugins que me llaman la atención.

Para este post, estoy utilizando la versión construida el 28/10/2009 (o sea, el día que escribo este post).

Los plugins (en orden alfabético, y no por preferencia) que considero interesantes hoy, son los siguientes:

  1. Entity Relationship Diagrama Support
  2. Explore from here
  3. Graphical Class View
  4. Java Go to implementation
  5. Run Terminal
  6. User tasks

 

Comencemos...

Previa instalación de los plugins desde Tools > plugins, y previa lectura de la licencia (la que nadie lee ninguno leemos), y después del reinicio del IDE, nos pondremos  probar cada uno de estos plugins, y ver si son buenos o no. Ya ustedes hacen su veredicto.

1. Entity Relationship Diagrama Support
Tenemos una base de datos, con relaciones, contraints, foreing keys y demás cosas propias de una base de datos. Le podriamos pedir al DBA que nos dé su diagrama de entidad-relación, pues para saber qué vamos a trabajar. O quizás se hizo la base de datos usando la capacidad mental de un DBA: de memoria. (Recomiendo usar mejor una diagrama ER antes de crear las tablas). Existen diagramadores de ER que hacen ingenieria inversa a una base de datos creada, por ejemplo el MySQL Workbench, y otros más para otros más. Este plugin de NB no hace ingeniera inversa (ya que no vamos a hacer un modelo editable) solo nos muestra cómo está la base de datos en este momento. Y esto es lo que haremos:

  1. Debemos tener una conexión desde NB a una base de datos en el panel Services (Ctrl+5). Naturalmente, el JDBC de una base de datos ya debe existir.
  2. También debemos tener un proyecto ya trabajando. Desde ahí, creamos un nuevo archivo (File > New File o Ctrl+N) y seleccionamos la categoría "Persistence" y el tipo de archivo "ER Diagram"













  3. Clic en "Next". Indicamos el nombre del archivo y la ubicación.









  4. Clic en Next. Seleccionamos la conexión de la base de datos que vamos a trabajar. Este debió de haberse creado previamente, como se mencionó en el paso 1.






  5. Clic en Finish. Encontraremos el archivo creado en el explorador del proyecto.






  6. Y al abrirlo, veremos la tablas de la base de datos y sus respectivas relaciones.






2. Explore here
¿El proyecto es tan grande que necesitamos concentrarnos en una carpeta o en un paquete?


Bueno, aquí está la solución. Clic derecho sobre la carpeta, seleccionar "Explore here"...


... y listo.


3. Graphical Class View
"Una imagen vale más que mil palabras" (dicho popular)
"Perdimos una imagen, consigan mil palabras" (Dr. House).
Tenemos asociaciones de clases, interacciones entre ellas, variables de tipo clase, etc.. y perdimos el rastro.

Clic derecho sobre una clase, y seleccionar "graphical view"


Y después de un instante, se verán las asociaciones



OJO: no es un diagrama de clases UML, es solo una representación de cómo interactúan con la clase seleccionada.

4. Java Go to implementation
Esta funcionalidad la vi en Eclipse, y recién vi un plugin de NB en la versión 6.7.
Tenemos una interfaz o una clase abstracta con métodos abstractos. Queremos saber y ver las clases que lo implementan. Clic derecho sobre el método que el método abstracto. Seleccionar Navigate > Go to implementation


Se mostrará los métodos que lo implementan.


Seleccionamos uno y el NB nos mostrará la implementación.


5. Run Terminal
Para mi es muy útil: Quiero entrar desde la consola del sistema operativo al contenido de una carpeta o paquete. Tendría que abrir una ventana del consola del sistema operativo, y luego hacer cd hasta llegar al directorio. Con este plugin es más fácil. Solo hacemos clic derecho sobre la carpeta que queremos acceder en la consola, y seleccionamos Tools > Run Terminal.

Y listo.





6. User tasks
 Si no tenemos una lista de lo que tenemos que hacer, no sabremos qué vamos hacer. Es mejor tener una lista de tareas.. y además saber cuánto demoramos en resolver una tarea... y cuánto no hacemos nada.
Este plugin lo vi desde la version 6.1. Es muy útil. Permite al desarrollador listar todas las tareas que tiene que hacer, y también permite definir subtareas. Todas estas pueden estar asociadas a una línea de código especial.
Podemos acceder a él, desde Window > Other > User tasks.


Es un panel inferior al editor. Ahí demos declarar nuestras tareas. Y cuando queremos hacer seguimiento a nuestro trabajo, presionamos en el botón verde (o clic derecho y seleccinamos Start). El plugin detectará cuanto tiempo estamos trabajando en el IDE. Y cuando seleccionamos "Pause", no registrará el tiempo. Se supondrá que hemos detenido nuestro trabajo. Luego, podemos indicar cuánto del trabajo hemos avanzado. Cuando esté el 100% de la tarea, el plugin nos dirá cuánto tiempo realmente nos hemos dedicado a esta tarea.
Así que con esto podemos asegurar a nuestro jefe que hemos trabajo....  o nos puede condenar.

Hay muchos más plugins, que ya no me dió tiempo de postearlo. Así que después seguiré continuando con este tipo de artículo.

miércoles, 7 de octubre de 2009

Symfony en NetBeans 6.8

 Ya sé que este blog se llama "Apuntes de Java", pero el objetivo es también dar apuntes sobre NetBeans (ya que también fue hecho en Java... y apoyo al proyecto)
Así que este post está referido al framework para PHP Symfony. Espero que les agrade

Symfony en NetBeans 6.8

(También se encuentra en la documentación de NetBeans: http://wiki.netbeans.org/NB68symfony_es)

Symfony es uno de los mejores frameworks para PHP que permite desarrollar aplicaciones web basado en MVC. Ayuda enormemente en la construcción de aplicaciones web complejas en PHP.
Aunque Symfony fue ideado para trabajar desde la línea de comandos, NetBeans 6.8 lo incluye dentro sus complementos a fin de ayudar al desarrollador en la elaboración de aplicaciones complejas.

Instalación del componente Symfony

La instalación es bastante simple. Se puede descargar desde el centro de actualización (Herramientas > Complementos). Debemos tener instalado el complemento para PHP. Si no lo tenemos instalado, este es el mejor momento para hacerlo.



... y si es la primera vez que instala el PHP, es probable que le pida la instalación del JavaScript Debugger






Lo dejamos que cocine, y cuando termine nos preguntará que si deseamos reiniciar el IDE. Y eso haremos: reiniciar el IDE.

Instalando Symfony

Ahora bien, lo que hemos instalado solo fue el complemento de NB para Symfony. Lo que debemos es instalar el mismo framework. Para ello debemos hacer lo siguiente
  1. Descargar symfony desde aquí http://www.symfony-project.org/installation/1_2
  2. Aunque existan las instrucciones de instalación que explica Symfony nosotros seguiremos nuestro propio rumbo. Extraeremos el contenido del .zip en c:\ de tal manera que se haya creado una carpeta llamada c:
    symfony-1.2.9
    . Cuando digo "contenido" me refiero a no usar la opción "descomprimir en symfony-1.2.9..." que consiste en crear una carpeta con el mismo nombre del .zip y dentro descomprimir el contenido del .zip. En su lugar, usar "descromprimir aquí..." (desde c:\).
Listo, eso es todo referente al Symfony.
Si ya has tenido instalado el Symfony en otro lado, no importa, igual sirve. Lo importante es recordar donde está.

Configurando el componente Symfony

Ahora, en el NetBeans entremos a Herramientas > Opciones y seleccionemos la opción "PHP". Luego, abrimos la ficha "Symfony". Lo que debemos hacer aquí es seleccionar el script principal de Symfony.




Notemos que es el archivo que no tiene extensión. Realmente (si lo abrimos desde un editor de texto) es un archivo .php, solo que no tiene extensión.

Creando un proyecto

Ahora, crearemos un nuevo proyecto PHP usando el Symfony. Presionemos Mayus+Ctrl+N (Archivo > Nuevo proyecto)


Clic en Siguiente. Establecemos el nombre del proyecto. Para nuestro ejemplo será MiApp






Dejamos las demás opciones por omisión. Clic en Siguiente
Establecemos la ruta que se mostrará en el navegador cuando ejecutemos la aplicación.


Clic en Siguiente.
Ahora, seleccionamos el framework "Symfony"




Notemos que está pidiendo una clave especial, por fines de seguridad para evitar ataques CSRF con tokens en formularios. Para fines de este tutorial, usaremos la misma clave propuesta: UniqueSecret.
Clic en finish
Dejemos que cocine nuevamente, y listo. Ya tenemos nuestro proyecto.

Preparando el proyecto

Configurando el Apache

Esta aplicación debe ejecutarse en el Apache Web Server que deberiamos tenerlo instalado. Lo que recomienda Symfony es ejecutar la aplicación de desarrollo en otro host. Este host será local y virtual, de tal manera que se ejecute bajo otro nombre de host y en otro puerto. En nuestro caso lo ejecutaremos en el puerto 9090 En el margen izquierdo de nuestro proyecto, abramos el archivo config/vhost.sample el cual tendrá un código similar a este:
# Be sure to only have this line once in your configuration
    NameVirtualHost 127.0.0.1:80

    # This is the configuration for MiApp
    Listen 127.0.0.1:80

    
      ServerName MiApp.localhost
      DocumentRoot "D:\home\DSILVA\Mis documentos\NetBeansProjects\MiApp\web"
      DirectoryIndex index.php
      
        AllowOverride All
        Allow from All
      

      Alias /sf "C:\symfony-1.2.9\data\web\sf"
      
        AllowOverride All
        Allow from All
      
    
Pues, lo que haremos primero será editar este archivo para que ejecute se ejecute en el archivo 9090, de la siguiente manera:
# Be sure to only have this line once in your configuration
    NameVirtualHost 127.0.0.1:9090

    # This is the configuration for MiApp
    Listen 127.0.0.1:9090

    
      ServerName MiApp.localhost
      DocumentRoot "D:\home\DSILVA\Mis documentos\NetBeansProjects\MiApp\web"
      DirectoryIndex index.php
      
        AllowOverride All
        Allow from All
      

      Alias /sf "C:\symfony-1.2.9\data\web\sf"
      
        AllowOverride All
        Allow from All
      
    
Las rutas de la carpeta del proyecto ya han sido establecidas por el Symfony. Ahora,
  1. copiemos este contenido,
  2. abramos el archivo httpd.conf que se encuentra en el directorio $APACHE_HOME\conf,
  3. pegamos,
  4. lo guardamos,
  5. y reiniciamos el servicio de Apache.
Para ver si se ha configurado correctamente el Apache, abramos el navegador en http://localhost:9090, o ejecutemos el proyecto con la tecla F6.


Configurando la base de datos

Ahora, nos toca crear la base de datos. Desde una consola de MySQL (puede ser útil el de la línea de comandos, o el más sofisticados que uses) ejecutemos (como root) lo siguiente:
create database tienda_virtual; #crea la base de datos
grant all on tienda_virtual.* to tienda_virtual@localhost identified by "tienda_virtual"; #crea un usuario con acceso a esa base de datos
Ejecutarlo desde el NetBeans también es más que suficiente.
Recomiendo que no se use el usuario root para acceder a una base de datos desde la aplicación. Por ello recomiendo crear un usuario por cada base de datos que se va a crear. Es por fines de seguridad.
A continuación, debemos establecer la configuración de nuestra aplicación con la base de datos. Para ello, hagamos clic derecho sobre el ícono del proyecto y seleccionemos Symfony > Run command...






Nos mostrará una consola especial para ejecutar los comandos de Symfony. En la entrada del filtro escribiremos "config" y se mostrarán los comandos asociados a configure. Seleccionamos de la lista a configure:database y escribimos como argumentos "mysql:host=localhost;dbname=tienda" tienda tienda




Luego, clic en "Run"
Podremos ver que se ha actualizado el archivo config/databases.yml

Creando las tablas

Las tablas se pueden crear desde el archivo config/schema.yml. Un archivo .yml es una serialización estándar y amigable para los lenguajes de programación. Tendremos dos tablas: tipo_producto y producto. Para ello, editaremos el archivo config/schema.yml con lo siguiente:
propel:
  tipo_producto:
    id_tipo: ~
    nombre_tipo: {type: varchar(255)}
  producto:
    id_producto: ~
    id_tipo: {type: integer,foreignTable: tipo_producto, foreignReference: id_tipo,required: true}
    nombre_producto: {type: varchar(255)}
    stock: {type: integer}
    precio: {type: double(10,5)}
Notar los espacios que hay entre cada declaración, tipo y el valor.
Ahora, haremos que el symfony cree las tablas. Para ello, desde la consola de symfony, buscamos filtramos los comandos propel:, seleccionamos propel:insert-sql






Con esto, creará el esquema para nuestra aplicación y también las tablas en nuestra base de datos






Si ya tienes una base de datos creadas, ignora la edición de config/schema.yml y ejecuta desde el symfony el comando propel:build-squema
Y para finalizar con la base de datos, debemos crear el modelo de datos, que consiste en un mapeo entre clases php con las tablas de nuestra base de datos. Para ello ejecutemos el comando propel:build-model
Después de ello, veremos el resultado en la carpeta lib






Vaya, hasta ahora no hemos escrito ni un archivo .php.

Ejecutando la aplicación

La aplicación no está del todo terminada. Faltan los estilos, colores, etc. Pero ya se puede ver algo. Antes de eso, debemos construir la aplicación. Para ello ejecutemos el comando propel:build-all. Con esto construye todo lo referente al esquema, hasta los formularios.




Luego, ejecutamos propel:generate-module con los parámetros como se ven en la imagen.




Y así tendremos el mantenimiento para la tabla "tipo_producto". Clic aquí para ver http://localhost:9090/frontend_dev.php/tipo










Finalmente

Como el fin de este tutorial no era un curso de Symfony, sugiero leer el manual práctico http://www.symfony-project.org/jobeet/1_2/Propel/es/ que en 24 dias (a razón de una hora cada día) uno puede hacer un proyecto funcional con Symfony.

viernes, 11 de septiembre de 2009

seleccionar / deseleccionar todos los checkbox (con JQuery)

JQuery es un framework en JavaScript que realmente hace maravillas.
Aparte de AJAX, la manera como maneja los objetos DOM es impresionante.

En este post haré un ejemplo de cómo marcar varios checkbox usando otro checkbox (check all), y si se desmarca este checkbox, todos los checkbox se desmarcan... y cómo bonus, si se marcan todos los checks uno por uno, el checkbox general se marcará automáticamente.
A medida que desarrollaré el ejemplo, también explicaré cómo funciona JQuery.

Cómo obtener el JQuery
Hay dos maneras:
  1. descargándolo desde http://jquery.com/, y agregándolo a nuestro proyecto como un .js más (sólo pesa 55.9KB!)
  2. Usando el API de Bibliotecas AJAX de Google.
Los pro/contra son
  1. Lo bueno que si se descarga el jquery y está integrado a nuestro proyecto,  tendremos la certeza de que está en nuestra aplicación. Lo malo es que si sale una nueva versión, tendremos que actualizarlo nosotros mismos, y revisar en todos los proyectos donde se utiliza.
  2. Lo bueno de usar el API de Google, es que siempre podemos tener la ultima versión (o una versión específica si así lo queremos), ya no se formaría un cuello de botella para descargarlo desde nuestra aplicación hacia el cliente (aunque 55.9 KB no se sienten). Pero lo malo es que debemos asegurarnos que el usuario final tenga internet. 
Para nuestro ejemplo, usaremos el API de Google. Porque si has podido leer este blog es porque tienes internet :).

Instalándolo en nuestra página
La instalación es fácil. Basta agregar un .js de Google, que se encuentra en la misma página de Google, y luego pedimos que cargue el framework jquery.

        <script type="text/javascript" src="http://www.google.com/jsapi"></script>
        <script type="text/javascript">
            google.load("jquery", "1");


        </script>

Nuestro formulario
Ahora, debemos ver nuestro formulario que tendrá los checkboxes.

        <input id="chk_all" type="checkbox"/>Marcar / desmarcar todos<br/>
        <hr/>
        <input id="chk1" name="chk1" type="checkbox"/> Opción 1<br/>
        <input id="chk2" name="chk2" type="checkbox"/> Opción 2<br/>
        <input id="chk3" name="chk3" type="checkbox"/> Opción 3<br/>
        <input id="chk4" name="chk4" type="checkbox"/> Opción 4<br/>

Notemos que los checks "dependientes" tienen el nombre chk1, chk2, etc. Es decir, tienen nombres parecidos, al igual que sus IDs.

Importante: se recomienda que cada tag que vamos a manipular, ya sea por jquery, otro framework javascript o javascript puro, debe tener un ID único. Esto será más fácil de manipular entre los objetos DOM de html. Ahora lo veremos.

Programando el "check all"
 También notemos que ningún checkbox tiene programado el onclick. Los eventos lo podemos agregar en grupo.
Ahora, el JQuery ya se está cargando... y es posible que nuestra página ya cargó pero el jquery aún no haya terminado de descargarse en el cliente (por la red, vamos). Así que Google nos da una biblioteca que permite ejecutar una función JavaScript solo cuando se ha terminado de cargar. Esta función se llama google.setOnLoadCallback(fun) y tiene como parámetro una función cualquiera.

        <script type="text/javascript" src="http://www.google.com/jsapi"></script>
        <script type="text/javascript">
            google.load("jquery", "1");

            google.setOnLoadCallback(function(){ // se ejecuta cuando se cargó la biblioteca

            }
        </script>

La filosofía de JQuery es que se ejecutan consultas a manera de SQL, y lo que devuelve es un conjunto de objetos DOM que cumplen la consulta o un conjunto vacío. Luego, se puede aplicar modificaciones a ese conjunto de objetos, recorrer todos, tomar uno.. etc.

Volviendo al ejemplo, primero debemos obtener el objeto con id="chk_all". Por regla, para identificar un objeto por un ID se antepone el signo #, si se quiere seleccionar por sus clases, se antepone el punto (.) ¿Te recuerda a la hoja de estilos?
Para obtener el conjuno de objetos con id="chk_all" basta con hacer esto
$("#chk_all")
Ahora, a todo este conjunto (que solo tiene un elemento) vamos a programar su evento onclick. Pero JQuery lo maneja usando el metodo click().

$("#chk_all").click(function(){
//esta es la funcion que se asignará al evento onclick() de los objetos de la consulta
})

Ahora, necesitamos obtener todos los input del html.
var chks=$("input");
Pero, no, queremos ser más específicos, porque pueden haber hasta input-text. Así que lo filtramos solo los checkbox.
var chks=$("input:checkbox");
Uhm, necesitamos ser más específicos... solo queremos los que su nombre comience con "chk"
var chks=$("input:checkbox[name^='chk']");
Bien, ya lo tenemos en una variable chks. Se puede omitir, pero mejor así para saber qué le hacemos.
Ahora, debemos modificar el atributo "checked" de todos estos objetos y ponerlo en true si el "check_all" está seleccionado, y false si no lo está.

Recordemos que aún estamos dentro del evento click() del conjunto de un elemento #chk_all. Así que podemos acceder a las propiedades de los elementos del conjunto usando la palabra reservada "this".
chks.attr("checked",this.checked)
Lo malo es que si ese atributo no existe (por algun problema de versión de navegador o quizás un error en la programación nos olvidamos qué objeto estamos manipulando), podría lanzar un error de javascript de que ese atributo no existe.
Pero podemos usar la función $ para manejar el objeto this como si fuera un objeto jquery.
Al usar la función JQuery ($) nos da una gama increible de funciones que nos hace la vida de programador más fácil. En este caso, si queremos saber si el atributo checked está activado (y si no existe el atributo, no devuelve nada) podemos usar una funcion llamada is() y poner como argumento si coincide con el atributo checked. Devolverá true si está checked y false si no lo está.
chks.attr("checked",$(this).is(":checked"))
Por tanto, nuestro código final será el siguiente:
        <script type="text/javascript" src="http://www.google.com/jsapi"></script>
        <script type="text/javascript">
            google.load("jquery", "1");

            google.setOnLoadCallback(function(){ // se ejecuta cuando se cargó la biblioteca
                $("#chk_all").click(function(){ //aplica en el evento onclick a todos los objetos de la consulta
                    var chks=$("input:checkbox[name^='chk']"); //obtiene todos los objetos checkbox con nombre chk
                    chks.attr("checked",$(this).is(":checked")) //a TODOS los objetos obtenidos, lo marca si esta marcado el #chk_all
                })
            }
            }
        </script>

Es más, la función attr() se puede aplicar sobre el mismo conjunto de objetos jquery.
$("input:checkbox[name^='chk']").attr("checked",$(this).is(":checked"))
Ahi hace todo en una sola fila: selecciona los checkboxes con nombre que comience con "chk", y les modifica el atributo "checked" dependiendo si el check_all esta seleccionado o no.

Que se marque el "check all"  si todos los checks se marcan uno por uno.
Esta opción es la más interesante: si el usuario marca uno por los checks y logra marcar todos, el "check all" se debe activar, y si basta que uno check no esté marcado, se tiene que desactivar el "check all".

Para ello, debemos asignarle una función en el evento onclick() de todos los checkboxes con name^="chk"

Primero, debemos seleccionarlos

$("input[name^='chk']").click(function(){
//aqui se pone la funcion para todos los check boxes.
})

Haremos una formula simple: obtendremos todos los checkboxes existentes, y luego los que checkboxes que estén seleccionados.
$("input[name^='chk']").click(function(){
   var todos=$("input:checkbox[name^='chk']")
   var activos=$("input:checked[name^='chk']")

})
Si tienen la misma cantidad, entonces activamos el #check_all
    $("#chk_all").attr("checked",todos.length==activos.length)

Y listo.

El código completo:
Y aquí, el código completo
<html>
    <head>
        <script type="text/javascript" src="http://www.google.com/jsapi"></script>
        <script type="text/javascript">
            google.load("jquery", "1");
            google.setOnLoadCallback(function(){
                $("#chk_all").click(function(){
                    var chks=$("input:checkbox[name^='chk']");
                    chks.attr("checked",$(this).is(":checked"))
                })
                $("input[name^='chk']").click(function(){
                    var todos=$("input:checkbox[name^='chk']")
                    var activos=$("input:checked[name^='chk']")
                    $("#chk_all").attr("checked",todos.length==activos.length)
                })
            })
        </script>
    </head>
    <body>
        <input id="chk_all" type="checkbox"/>Marcar / desmarcar todos<br/>
        <hr/>
        <input id="chk1" name="chk1" type="checkbox"/> Opción 1<br/>
        <input id="chk2" name="chk2" type="checkbox"/> Opción 2<br/>
        <input id="chk3" name="chk3" type="checkbox"/> Opción 3<br/>
        <input id="chk4" name="chk4" type="checkbox"/> Opción 4<br/>
    </body>
</html>
No tomó ni dos líneas para estas funcionalidades.

Si deseas descargar este ejemplo ya hecho, haz clic aquí.

Salve JQuery :)

y aquí, en caliente:
Marcar / desmarcar todos


Opción 1

Opción 2

Opción 3

Opción 4


jueves, 3 de septiembre de 2009

Cursos de SUN Microsystems - Sun Academic Initiative(SAI)

Nuestro amigo Jocluis nos comparte un post en su blog referente a los cursos de SUN Microsystems.


http://jocluisuni.blogspot.com/2009/08/acceder-cursos-de-sun-microsystems-sun.html

Siempre quise saber cómo acceder a los cursos.. :)

Gracias Jocluis!

viernes, 28 de agosto de 2009

Estamos en OSUM - Open Source University Meetup

Los "Apuntes de Java" ahora están en OSUM.

http://osum.sun.com/group/apuntesdejava

Cuenta con espacio de foros, comentarios, y todo lo que podría tener una red social.

miércoles, 26 de agosto de 2009

Curso de AJAX

El 06 de octubre, en BitNet Perú se dictará el curso "AJAX para Java". Será dirigido a desarrolladores que tienen conocimiento en programación Web con Java.

Usaremos NetBeans como IDE, aunque eso no restringe que solo vaya a funcionar en ese IDE.

Serán 36 horas académicas (09 días) en que desarrollaremos una solución usando Ajax, desde un parser hecho por nosotros mismos, hasta usando frameworks completos.

Este es el temario propuesto. Aún estamos haciendo ajustes. Pero es la idea general.

  1. Programación avanzada con JavaScript
    1. Programación con objetos DOM
    2. Manejo de estilos
    3. Manejo de peticiones HttpRequest
    4. Manejo de archivos XML
  2. Frameworks para el desarrollo de Ajax
    1. Scriptaculous
    2. Dojo Toolkit
    3. ProtoType
    4. JSON
    5. jQuery
    6. jMaki
    7. Direct Web Remoting (DWR)
    8. Google Web Toolkit (GWT)
La primera parte se va aprender a programar con JavaScript + DOM + CSS como loco.
Luego desde la parte 2.1 al 2.5 veremos frameworks genéricos que pueden funcionar con PHP, Java, ASP, etc.. pero lo veremos desde la perspectiva Java.
En los puntos 2.6 al 2.8 usaremos frameworks más especializados en Java.

Si estás interesado en el curso, ahí nos vemos.!

Encuesta: conferencias

Hace un buen tiempo hice una encuesta sobre cómo participarían en un seminario o conferencia tecnológica.
Solo respondieron la mitad de los visitantes a mi blog.. o sea 15, jejeje

Hice esa encuesta porque quería conocer cual es la tendencia de los participantes a una conferencia. Porque si queremos desarrollar uno presencial, no queremos desilusionarnos con la poca concurrencia y el harto esfuerzo en desarrollar el contenido.

No estoy diciendo que mañana vamos a poner una conferencia. Pero está en nuestros planes, y según los resultados de esta encuesta, todo apunta a realizar uno virtual... de esos que llaman webminar.

Naturalmente no haremos uno simplón, que lo podría hacer cualquiera. Vamos a desarrollar uno que de verdad valga la pena... y no solo uno.. sino varios, todo referido a la tecnología Java.

Así que no se desesperen... habrá pronto una serie de webminars sobre Java.

Sugerencias para realizar un proyecto

He estado desaparecido por un tiempo. Tanto que a mi blog le han crecido telarañas. ¿Por qué? Porque estaba liado con tres proyectos, además de mi trabajo, además de mi licenciatura en la univ. (que por cierto, hoy acabo!)
Y en todo este tiempo, he aprendido algunos puntos para hacer mejor los proyectos.
No pretendo mostrar los top-10, ni top-5 de hacer un proyecto perfecto... solo quiero opinar y compartir de cómo debería hacerse un proyecto de acuerdo a mi experiencia.
Comencemos:
  1. Documenta todo los acuerdos con el cliente. Esto suena trillado..unos dirían "es obvio". Sí, es obvio.. pero por eso mismo que es obvio, a veces lo ignoramos. Si quieres ser más exquisito, usa un formato como sugiere RUP, o XP. La cuestión es que en cada reunión con el cliente, se debe documentar lo que se debe hacer y lo que NO se debe hacer. Esto es define el ALCANCE DEL PROYECTO.
  2. Utiliza alguna herramienta electrónica SIMPLE para documentar desde el Alcance del proyecto, hasta los avances del desarrollo del proyecto. Sugiero que sea SIMPLE. Puedes usar el MS Project, Primavera, dotProject, etc. Son efectivos y son muy visuales. Pero el punto exacto es que se debe documentar lo que se tiene que hacer y qué ya se hizo. Puedes usar el Google Sites, o si tienes un host, instala un wiki. Si tienes un host propio, instala el jspwiki. Así trabajan en NetBeans.
  3. Utiliza SIEMPRE un sistema de control de versiones. Un compañero de trabajo guardaba todo su proyecto en su disco duro, hasta que se malogró. Se logró recuperar los archivos y ponerlos en un disco temporal. Pero cuando se trató de restaurar del disco temporal a uno nuevo, hubieron carpetas (justo el del proyecto principal) que no se pudieron restaurar. Es una historia muy larga... pero puedo resumir que después de algunos días se pudo recuperar el código fuente.  Puedes usar el Project Hosting de Google Code, y ocultar la parte de "explorar código", para que tu código no pueda ser accedido por terceros (si es que no quieres que tu código sea accedido por terceros). También puedes usar tu pendrive (USB) para que sea el repositorio de tu código fuente de manera local. Lo importante es guardarlo bajo un esquema de control de versiones tales como Mercurial o SVN. Si no usas un IDE que utilice SVN o Mercurial, existen herramientas como TortoiseSVN y TortoiseHG (para SVN y Mercurial respectivamente), que hace que el explorador de tu Windows (si usas windows) haga el control de versiones. Es muy interesante, y lo recomiendo mucho.
  4. Separa un momento para agradecer a Dios. Gracias a Dios tienes un proyecto entre manos. ¿Por qué no una pequeña oración sincera a quien permitió que tuvieras ese proyecto y que te deje tener un ingreso?
  5. No juntes dos o más proyectos para desarrollarlos a la vez. Primero acaba uno, para luego hacer el otro. Si quieres hacer tres proyectos, y cada uno toma dos meses en hacerse. Mejor has uno por uno. Porque si lo haces todo junto, los tres proyectos durarán dos meses, pero no terminarán después de dos meses... sino después de seis meses. La duración del proyecto no asegura la fecha de culminación de él.
  6. Si eres casado, utiliza a tu esposa como la mejor tester de tu proyecto. Esto tiene beneficios por partida doble.
    1. Tienes alguien de confianza que te puede decir exactamente lo que está bien o mal del producto que estás desarrollando. La puedes tener 24 horas al día, y no te cobra!. Y si es de las que les gusta el Internet.. con mucha más razón, porque verá tu software desde el punto de vista de usuario. Si te dice cosas que podría despreciar tu proyecto, no te molestes... considera sus puntos de vista... estarás muy agradecido por las opiniones de ella.
    2. Ella se sentirá útil hacía ti. Una mujer siempre quiere ser útil hacía su pareja. Y si su pareja le dice "no, tú no lo hagas, yo lo hago solo" cuando ella quiere ayudar, ella se sentirá rechazada. No estoy diciendo que haga todo nuestro trabajo. Solo digo que hay que darle lugar a nuestra esposa ya que es nuestra AYUDA IDÓNEA de entre toda la creación.
  7. En tus tiempos libres (cuando no tienes un proyecto entre manos) revisa otras aplicaciones o páginas web, así no tengan que ver con los proyectos que estás acostumbrado a hacer. Eso te daría más ideas para desarrollar los nuevos proyectos. Quizás haya un ícono, o alguna acción especial que no es común pero efectiva para ciertas circunstancias... y que podría estar en tus proyectos.
  8. Si tienes familia: del tiempo que estás con tu ella, separa un tiempo prudente para realizar tu proyecto. No al revés: no separes un tiempo del desarrollo de tu proyecto para estar con tu familia. Si tienes hijos, una línea óptima de código no hará que ellos tengan una sonrisa.
  9. Utiliza siempre pruebas unitarias. Recuerda que cuando construyen un auto, no lo prueban cuando todo esté construido. Sino prueban cada parte en standalone (como el motor, el sistema de ventilación, etc), y luego lo ensamblan todo para hacer la prueba final. Existen el JUnit (para Java),  PHPUnit (para PHP), .NetUnit (Para .Net), JMeter (para diversos componentes.. muy bueno). 
  10. Implementa log en la aplicación. Eso te permitirá saber qué está haciendo la aplicación en un determinando momento. Si bien es cierto que implica hasta duplicar la cantidad de líneas de código, lo estarás bien agradecido, ya que si hubiera un problema, no tendrías porque desarmar la aplicación para ver qué pasa, tienes un control en producción de lo que está haciendo, y puedes hasta tener un histórico del acceso que está pasando en tu aplicación, tanto que podría enviarte un mail si hay un error fatal. Existe el log4j, Commons logging, y el Java Log.
Estos son algunos. Espero que te sea de utilidad.

miércoles, 5 de agosto de 2009

Java SE 6 Update 15 disponible (y cómo revivir a Glassfish con una nueva version de Java)

Ya está disponible la actualización 15 de Java SE 6. Incluye mejoras de seguridad, rendimiento y el nuevo colector de basura G1.

Lo pueden descargar desde aquí http://java.sun.com/javase/downloads/index.jsp.

¿Y si malogro mi Glassfish?

Quizás te pasó esto: tienes tu GF funcionando de las mil maravillas, y quieres actualizar tu JDK. Luego, tratas de ejecutar el GF nuevamente (ya sea directamente desde asadmin o desde el NB) y no funciona. Y lo que puedes  hacer es reinstalar todo el GF... o peor aún: regresar a la versión anterior del JDK.

la solución:
  • Si estás en Windows
    1. Edita el archivo %GLASSFISH_HOME%\config\asenv.bat
    2. busca la línea que comienza con set AS_JAVA=
    3. Cambia la ruta para que apunte a la dirección del JDK que acabas de instalar. Por ejemplo, si acabas de instalar el JDK 6u15, escribe así
      set AS_JAVA=c:\Archivos de programa\Java\jdk1.6.0_15
    4. Guardas e inicias el GF.
%GLASSFISH_HOME% es el directorio donde instalaste el GF, ya sea el que vino con el NB (por lo general, está en C:\Sun), o el que instalaste independientemente (por ejemplo,  c:\glassfish)

jueves, 30 de julio de 2009

NetBeans 6.7.1 (ahora con JavaFX)

Ya está disponible (desde hace dos días) NetBeans 6.7.1, ahora con JavaFX 1.2.

Pero si tienes ya instalado el NetBeans 6.7, puedes descargar la actualización desde el Centro de Actualización del IDE: Ayuda > Verificar actualizaciones.

lunes, 20 de julio de 2009

Anydump

Este es un proyecto creado por este humilde blogger.

http://code.google.com/p/anydump/

Lo que hace es   descargar los registros de cualquier base de datos (que cuente con su Driver respectivo, naturalmente) en sentencias INSERT, lo comprime en archivos .gz, y los envía a un URL através de un POST.

En el URL debería haber una página capaz de recibir un archivo (tipo upload), descomprimir el archivo .gz, y ejecutar las sentencias enviadas desde Java.

¿Para que sirve?
Bueno, me he topado con un par de proyectos donde su base de datos está en un servidor local, y quieren que sea visible desde la web, pero ya que no tienen un servidor web público en su oficina, han alquilado un hosting. Así que lo que se les propuso es que con un programita ejecutado desde el "Planificador de tareas" haga el "dump" de la base de datos local y lo cargue a su hosting. Su hosting cuenta con MySQL + PHP, por lo que se les  hizo un .php que haga el gunzip y ejecutar las sentencias INSERT.

Funciona con una base de datos local Oracle y Access. Si funcionó con Access, entonces funciona con cualquier base de datos decente. :)

Este proyecto no va a quedar ahí. Tengo en mente más funcionalidades que serán útiles... incluso contará con instalador!

viernes, 17 de julio de 2009

Robocode

Para los que le gusta los retos, aquí el proyecto Robocode.

Fue creado por Mathew Nelson de IBM Alphaworks allá a inicios de 2001. El objetivo es simple: tú como programador programas una estrategia en Java para el "cerebro" de un tanque, luego se pone en ruedo con otros tanques, y gana la mejor estrategia.

Los tanques tienen un radar que permite detectar al contricante, girar su cañón, guirar todo el tanque, moverse dentro de la arena, detectar si tocó la pared, detectar un disparo enemigo.. en fin.. todo lo necesario para entrar en combate.

Es una buena manera para aprender o mejorar la lógica de programación.

Autenticacion Google

Este es un pequeño y minúsculo tutorial de cómo usar la autenticación de Google.

Aunque este método no es el recomendado para autenticar una aplicación usando una cuenta de Google, esto nos puede dar pie para conocer el SaaS (Software as a Service) usando Google desde NetBeans.

1. Crearemos una aplicación Java ya sea Desktop o Web. Igual da :)
2. Abrimos el panel de Prestaciones (Services) Ctrl+5
3. Seleccionamos el nodo Servicios Web > Google > Accounts Service > [accounts] >[ClientLogin] > accounts_clientLogin

4. Lo arrastramos y lo soltamos sobre el editor de código de Java. Debería mostrar una ventana que pide parámetros para el servicio de Google. Yo lo hice sobre un JSP, y me muestra lo siguiente:
Naturalmente que el passwd es de cada uno.
Clic en Aceptar y con esto nos generará un código especial.

5. Hay que definir un key único. Lo que recomiendo es hacer un md5 de cualquier texto que le guste. Por ejemplo, para la frase "Anita lava la tina", el md5 generado es "064439084cee1308a77cb7a9aa67773a" y lo usaré como key. Así que, abrimos el archivo googleaccountsserviceauthenticator.properties que se creó en el proyecto y colocamos ese valor para la propiedad api_key.
6. Editamos el código fuente donde insertamos el SaaS como algo a lo siguiente:


<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">

<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>JSP Page</title>
    </head>
    <body>
        <%@ page import="org.netbeans.saas.*, org.netbeans.saas.google.*" %>
        <pre>
            <%

            try {
                String accountType = "GOOGLE";
                String email = "diego.silval@gmail.com";
                String passwd = "loremloremlorem";
                String service = "xapi";
                String source = "apuntesdejava-demogoogle-1";

                RestResponse result = GoogleAccountsService.accountsClientLogin(accountType, email, passwd, service, source);
                //TODO - Uncomment the print Statement below to print result.
                if (result.getResponseCode() == 200) {
                    out.println("The SaasService returned:\n" + result.getDataAsString() + "");
                    out.println("Response: " + result.getResponseMessage());
                } else {
                    out.println("Hubo error en la autenticacion:" + result.getResponseMessage());
                }
            } catch (Exception ex) {
                ex.printStackTrace();
            }

            %>

        </pre>

    </body>
</html>
Y listo.. lo ejecutamos, y nos debería mostrar los tokens de respuesta.

En otro post comentaré cómo acceder en sí a los servicios de google. Son bastantes y muy interesantes.