Wednesday, August 12, 2015

VII ENCUENTRO CENTROAMERICANO DE SOFTWARE LIBRE


Es inevitable no reflexionar sobre el VII Encuentro CentroAmericano de Software Libre-Honduras 2015 Sitio web http://ecsl2015.softwarelibre.ca/
Generalmente se piensa que el software Libre se trata de un producto de software, la concepción va un poco más allá; son las libertades, las personas los que realmente hacen la diferencia y han logrado luchar por muchos años , contra una serie de factores en contra pero que permite unir a muchas personas, organizaciones y empresas en un fin común, defender las libertades a las que todos tenemos derecho.

Expositores

Una oportunidad para encontrar amigos con varios años de no ver, como es Alexandre Oliva. A otros desde el ECSL 2014 que se realizo en Panamá. También la oportunidad de conocer a nuevos amigos que realizan un trabajo muy fuerte desde cada una de las comunidades en sus diversos países.




Contenido filosófico, social, tecnológico fueron aspectos fundamentales en el evento, mientras era admirable la organización del evento y sobre todo el trato único y familiar que nos dieron nuestros anfitriones Hondureños, que desde el primer instante de la llegada a San Pedro Sula, fue excelente.

Tengo que agradecer a grandes amigos: Mauro Rosero quien fue que me ha permitido participar de las comunidades centro americanas de software libre (ya que en parte de mi trabajo es con otras comunidades), invitándome a participar en el ECSL en Panamá y quien me invito nuevamente a ECSL en Honduras, y permitió que la Universidad Tecnológica de Panamá, apoyara mi participación en este evento, por la importancia que representa a nivel de la región estas iniciativas que cada año resultan superar las anteriores.
 A Richard Dominguez quien gestiono todas las actividades en Panamá y por circunstancias adversas no pudo asistir.
A mis grandes amigos Hondureños Diego Turcios, Delmy Saray (atención increíble), Angel y a todos los demás miembros del comité felicidades por un gran trabajo.

Un evento de muchas actividades, conferencias, talleres, mesas de discusión,grandes ponencias,  casos de usos , reuniones informales que permitieron conocer nuevos amigos.

Mi primera participación fue sobre JavaEE (NetBeans :JEE7 +Enterprise Java Beans+Java Server Faces + JPA + Primecaces),





La segunda actividad hable un poco sobre Java8 y NetBeans Platform (desarrollo de plugins)

Hicimos unas sesiones sobre Java y NetBeans con dos grandes amigos Fatima(El Salvador) y Jaime(Nicaragua)
También estuve presente en la reunión donde se escogió la nueva sede para el ECSL 2016, Nicaragua, que tengo la plena confianza que sera tan exitosa como esta organizada en Honduras.
Fotos de muchos amigos durante las conferencias.



Unitec donde fue la sede del evento

Un ambiente muy ameno al terminar las actividades en Unitec

En las inscripciones 

También una presentación de alto nivel de Estefania, quien dio una conferencia magistral sobre el observatorio de software libre, quien no es del área de sistemas y esta incursionando como ella lo definió esta en un proceso de migración, al que ha iniciado de manera muy fuerte.

A los demás miembros de las comunidades y Universidades que expusieron sus conocimientos de manera impresionante, mis felicitaciones y a todos mis amigos un saludo desde Panamá, y continúen con este esfuerzo que cada vez adquiere mayor importancia. Nuevamente gracias por la oportunidad de hablar algo sobre Java que es la segunda vez que se permite la participación en el ECSL, saludos y gracias.














Tuesday, June 16, 2015

Utilizar Github como repositorio de Maven

Hace unos años un gran amigo, inicio su mundo en Java, con grandes proyectos y un excelente blog comparte sus conocimientos.
Antony escribió una entrada  Utilizar Github como repositorio de Maven en donde explica el uso de Jitpack. Una guía muy practica y efectiva.


Saturday, June 13, 2015

Crear Traductor usando API http://spa.hablaa.com/ con Primefaces

Crear Traductor usando API http://spa.hablaa.com/ con Primefaces

Hablaa.com es un direccionario en linea que ofrece un servicio de traducción grauito

Podemos implementar nuestro traductor, permitiendo al usuario que seleccione el idioma origen y el destino y realicemos la conversión.



Para las traducciones utilizamos el url, donde especificamos la palabra a traducir, el idioma origien (3 caracteres) y el idioma destino(3 caracteres)
En este ejemplo traducimos la palabra apple de ingles a español y nos devuelve un json
[{"text":"la manzana","pos":{"code":null,"title":null},"source":"Hablaa.com"},{"text":"manzana","pos":{"code":null,"title":null},"source":"Hablaa.com"}]


Luego solo nos queda procesar el json y obtener el atributo text que contiene la palabra.
Para ver la lista de idiomas soportados













LectorJSON.java
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package com.javscaz.girosjsd.generales;


import java.io.IOException;
import java.io.InputStream;
import java.io.Serializable;
import java.net.URL;
import javax.inject.Named;
import javax.enterprise.context.SessionScoped;
import javax.json.Json;
import javax.json.stream.JsonParser;
import javax.json.stream.JsonParser.Event;


/**
*
* @author avbravo
*/
@Named(value = "lectorJSON")
@SessionScoped
public class LectorJSON implements Serializable {


   private String lectura;
   private String origen;
   private String destino;
   private String languageorigen;
   private String languagedestino;


   public String getLanguageorigen() {
       return languageorigen;
   }


   public void setLanguageorigen(String languageorigen) {
       this.languageorigen = languageorigen;
   }


   public String getLanguagedestino() {
       return languagedestino;
   }


   public void setLanguagedestino(String languagedestino) {
       this.languagedestino = languagedestino;
   }


   public String getOrigen() {
       return origen;
   }


   public void setOrigen(String origen) {
       this.origen = origen;
   }


   public String getDestino() {
       return destino;
   }


   public void setDestino(String destino) {
       this.destino = destino;
   }


   public String getLectura() {
       return lectura;
   }


   public void setLectura(String lectura) {
       this.lectura = lectura;
   }


   /**
    * Creates a new instance of LectorJSON
    */
   public LectorJSON() {
   }


   public String lector() throws IOException {
       try {
                 origen = origen.trim();
           destino = "";
           URL url = new URL("http://spa.hablaa.com/hs/translation/" + origen + "/" + languageorigen + "-" + languagedestino + "/");
           InputStream is = url.openStream();


           JsonParser parser = Json.createParser(is);
           while (parser.hasNext()) {
               Event e = parser.next();
               if (e == Event.KEY_NAME) {
                   switch (parser.getString()) {
                       case "text":
                           parser.next();                        
                           destino = parser.getString();
                           break;
                   }
               }
           }


       } catch (Exception ex) {
           JSFUtil.addErrorMessage("lector() " + ex.getLocalizedMessage());
       }
       return null;
   }


}

















Página .xhtml


<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
     xmlns:ui="http://xmlns.jcp.org/jsf/facelets"
     xmlns:p="http://primefaces.org/ui"
     xmlns:h="http://xmlns.jcp.org/jsf/html"
     xmlns:f="http://xmlns.jcp.org/jsf/core"


     xmlns:b="http://bootsfaces.net/ui">


   <body>


       <ui:composition template="./template.xhtml">
           <ui:define name="content">
               <f:view>
                   <h:form>
                      <b:panel look="primary" title="#{app['application.title']}">
                     <h:panelGrid columns="4" cellpadding="5">
                              <h:outputText value="origen:"/>
                               <b:inputText value="#{lectorJSON.origen}">
                                   <f:facet name="prepend">
                                       <h:outputText value="" />
                                   </f:facet>
                               </b:inputText>
                               <h:outputText  value="traducida:"/>
                               <b:inputText id="salida" value="#{lectorJSON.destino}">
                               </b:inputText>
                               <h:outputText  value="De"/>
<b:selectOneMenu  value="#{lectorJSON.languageorigen}"                
                                                 required="true"
                                                 >
                             <f:selectItem itemLabel="Español" itemValue="spa" />
                            <f:selectItem itemLabel="Chino(simplificado)" itemValue="zho" />
                            <f:selectItem itemLabel="Ingles" itemValue="eng" />
</b:selectOneMenu>
                              <h:outputText  value="A"/>
             <b:selectOneMenu  value="#{lectorJSON.languagedestino}"                     
                                                 required="true"
                                                 >
                             <f:selectItem itemLabel="Chino(simplificado)" itemValue="zho" />
                             <f:selectItem itemLabel="Ingles" itemValue="eng" />
                             <f:selectItem itemLabel="Español" itemValue="spa" />
         </b:selectOneMenu>


<p:commandButton value="Traducir" actionListener="#{lectorJSON.lector()}"
                                              update="salida,growl"
                                               />
                           </h:panelGrid>
                       </b:panel>
                       <p:growl id="growl" showDetail="true" />
                       <p:growl id="messages" showDetail="true" life="2000" />
                   </h:form>
              </f:view>
           </ui:define>


           <!--            <ui:define name="bottom">
                           bottom
                       </ui:define>-->


       </ui:composition>


   </body>
</html>

















Tuesday, May 19, 2015

Monday, May 18, 2015

Autocompletado con Primefaces + JPA

Autocompletado con Primefaces + JPA
Tabla: Nivel1

Con NetBeans IDE generamos los Entity
Categories: Persistence    File Types: Entity Classes from Database


Luego generar los EJB


Editamos Nivel1Facade.java y agregar los métodos findByIdNivel1Like(), findByNombreLike().

public List<Nivel1> findByIdNivel1Like(String idnivel1) {

              Query query = em.createQuery("SELECT n FROM Nivel1 n WHERE lower(n.idnivel1) like :idnivel1");
                   idnivel1 = "%" + idnivel1.trim() + "%";
       return query.setParameter("idnivel1", idnivel1).getResultList();
     
}

    public List<Nivel1> findByNombreLike(String nombre) {

              Query query = em.createQuery("SELECT n FROM Nivel1 n WHERE lower(c.nombre) like :nombre");
                   nombre = "%" + nombre.trim() + "%";
       return query.setParameter("nombre", nombre).getResultList();
     
    
   }


Editar Nivel1SearchController.java

Agregar los métodos complete(),  completeNombre()

public List<Nivel1> complete(String query) { List<Nivel1> suggestions = new ArrayList<>(); try { query = query.trim(); nivel1Facade.findByIdNivel1Like(query.toLowerCase()); nivel1List.stream().forEach((p) -> { suggestions.add(p); }); } catch (Exception e) { JSFUtil.addErrorMessage("complete() "+e.getLocalizedMessage()); } return suggestions; } public List<Nivel1> completeNombre(String query) { List<Nivel1> suggestions = new ArrayList<>(); try { query = query.trim(); nivel1Facade.findByNombreLike(query.toLowerCase()); nivel1List.stream().forEach((p) -> { suggestions.add(p); }); } catch (Exception e) { JSFUtil.addErrorMessage("completeNombre() "+e.getLocalizedMessage()); } return suggestions; }

En la página .xhtml
   <p:outputLabel  rendered="#{!nivel1Controller.nuevoregistro}" value="#{msg.idnivel1}" for="idnivel1" />
                               <p:autoComplete size="45"   rendered="#{!nivel1Controller.nuevoregistro}" value="#{nivel1Controller.selected}"  
                                                 completeMethod="#{nivel1SearchController.complete}"  
                                                 var="p"  
                                                 itemLabel="#{p.idnivel1}"  itemValue="#{p}" converter="nivel1Converter" forceSelection="true">

                                   <p:ajax event="itemSelect" listener="#{nivel1Controller.handleSelect}" update=":form,:form:growl" />  
                                   <f:facet name="itemtip">
                                       <h:panelGrid columns="2" cellpadding="5">
                                           <h:outputText value="#{p.nombre}" />
                                       </h:panelGrid>
                                   </f:facet>
                               </p:autoComplete>