Generar código de barras y Códigos QR - Generación de códigos QR con ZXing
Los códigos QR o Quick Response Code son simple códigos de barras pero en 2 dimensiones que pueden ser leidos o escaneados por una cámara, como la de un teléfono móvil.
Un código QR consiste en cuadrados negros dispuestos en una cuadrícula cuadrada sobre un fondo blanco. Existen varias variantes de códigos QR que dependen del tamaño de los símbolos, el diseño, la codificación y la estructura.
Zxing es una librería para java y android que se pronuncia "Zebra Crossing" como el cruce peatonal de Abbey Road
Procedimiento:
Hay que agregar las dependencias de zxing-core y zxing-javase a nuestro propio proyeto
JasperReports es una biblioteca de creación de informes que tiene la habilidad de entregar contenido enriquecido al monitor, a la impresora o a ficheros PDF, HTML, XLS, CSV y XML... y no lo digo yo sino la wikipedia
Está escrito completamente en Java, su propósito principal es ayudar a crear documentos de tipo páginas, es de bajo licencia libre GNU, por lo que es Software libre.
Una de la más notoria ventaja es el diseño de sus templates a través de una sólida interfaz visual, componentes drag and drop para realizar el template xml por nosotros, además de que con un click realiza la compilación.
Nota mental: La ultima versión del iReport es la 5.6.0 del 28-May-2014 y al parecer solo funciona con java 7 en la variable de entorno JAVA_HOME. Pueden ser cambiado desde las configuraciones en la instalación, generalmente C:\Program Files (x86)\Jaspersoft\iReport-5.5.1\etc\ireport.conf o visitando la documentación
Jaspersoft Studio Eclipse plugin página del marketplace
La manera en que trabajar es la siguiente:
Se escribe un template xml con la extension .jrxml
Se compila con el motor de jasper para generar un archivo de extension .jasper
Se procesa junto a una fuente de datos: Collection de java o una conexion a la base de datos para obtener un ResultSet
Se obtiene como resultado un reporte! :D
Procedimiento
Crear un proyeto maven saltéandose la elección del arquetipo para luego agregar las dependencias a utilizar en el pom.xml:
Tras hacer esto obtendremos un error, de que no encuentra la librería de itext.jar:2.1.7.js6, el problema es que en maven central no existe esa version sino una itext.jar:2.1.7.js2 y agregando esa ya maven es feliz
Adicionalmente vamos a tener que declarar el repositorio jasperreports y sus librerias de terceros ya que la versión de itext que espera es la versión 2.1.7.js4 y será desde aqui donde se tomen las librerias necesarias:
Con cualquiera de las opciones disponibles para crear los jrxml, se procede a crear un reporte como a uno más le guste.
Para empezar podemos arrastrar un static text y escribir el típico hola mundo, hello world, etc.
Nota mental: Al usar el iReport 'por defecto' tiende a usar el lenguaje como groovy dando exceptions en la compilación. Hay que editarlo desde las properties del reporte en la solapa de Report Inspector o bien remover el attributo language="groovy" en etiqueta root jasperReport luego de todas las declaraciones de esquemas. Ah y de paso agregar whenNoDataType="AllSectionsNoDetail" para que no evite no generar el pdf cuando no hay un fuente de datos para completar los mismos.
El archivo creado deberá ser dejado en la carpeta src/main/resources para encontrarlo a tiro.
public static void imprime() throws JRException, IOException {
System.out.println("obtenemos la plantilla JRXML como un inputstream");
InputStream template = JasperRunnable.class.getResourceAsStream("/reporte.xml");
System.out.println("compilamos el reporte desde el stream");
JasperReport report = JasperCompileManager.compileReport(template);
System.out.println("obtenemos la fuente de datos");
Map<String, Object> sourceData = new HashMap<>();
System.out.println("llenamos el reporte en un print object, con la fuente de datos");
JasperPrint print = JasperFillManager.fillReport(report, sourceData);
File pdf = File.createTempFile("output.", ".pdf");
System.out.println("Lo exportamos a " + pdf.getAbsolutePath());
JasperExportManager.exportReportToPdfStream(print, new FileOutputStream(pdf));
}
La extensión puede ser tanto xml como jrxml dado que son simple archivos de texto plano con diferentes extension, pero para el caso es indistinto.
Ejecutando esta función en la clase main obtendremos una salida de consola como la siguiente:
obtenemos la plantilla JRXML como un inputstream
compilamos el reporte desde el stream
obtenemos la fuente de datos
llenamos el reporte en un print object, con la fuente de datos
Lo exportamos a C:\Users\Imago\AppData\Local\Temp\output.5354953787413152033.pdf
Dandonos como resultado, el mas simple de los pdf:
Es lo más básico de lo más básico que puede ofrecernos jasper report, pero es sólo el inicio.
A la hora de trabajar con git, existen varios formas de lograr con éxito una buena organización. Existen 2 métodos que proponen una forma de trabajar bajo ciertas normas, ninguna resulta ser perfecta, ninguna cubre todos los casos y es posible que necesitemos nuestra forma de realizar un flujo de trabajo y conocer estos métodos nos brindará una idea como hacerlo.
GitFlow
Gitflow o flujo de git es una manera de trabajar ordenando el repositorio en varias ramas que se corresponden con cada fase del desarrollo de la aplicacion.
La propuesta de este flujo de trabajo cuenta con 5 ramas:
master
hot-fix
release
develop
feature
Master
Este modo de trabajo nos propone dejar master donde se encuentren las versiones finales, similar a los tags.
Desde master de desprende hot-fix, para tratar incidentes urgentes generalmente rapidos y cortitos.
Develop
Desde master nace la rama de develop, una especie de borrador de master. Desde aqui cada desarrollador crearia su propia rama de trabajo feature-xxx.
Desde ahi uno es libre de seguir creando tantos branch locales como se necesite. Lo importante es, un vez finalizado el trabajo, mergear a develop.
En este punto, nace release, para corregir los ultimos detalles y adecuar al entorno del cliente. Una vez lograda cerrar las caracteristicas del nuevo desarrollo, se integra en develop y desde esta ultima se devolveria a master. Para finalizar se crea el tag.
GitHubFlow
Githubflow o flujo de github, es una manera de trabajar mas minimalista, con solo una rama principal(master) y la rama de turno para generar cambios.
Las caracteristicas principales son:
Todo en master es deployable(desplegable a nivel productivo), esto es ideal a la hora de trabajar con integracion continua y delivery continuo.
Cada nueva caracteristica requiere hacer un branch desde master, y pusheando al remoto hasta lograr una version de pruebas.
Podria haber tantas ramas como caracteristicas simulteneas se requieran.
Si un compañero finalizo su trabajo e integro en master, al crear la nuestra desde la misma instancia, se puede traer sus cambios y sumarlos a los propios.
Los pasos a seguir en flujo de trabajo son:
Crea tu propia rama, desde master
Trabajar de manera local pusheando los commits a la rama remota
Cuando la rama este lista para el merge con master se abre un pull request.
Se conversa y revisa el codigo con el grupo de trabajo
Deploy y testing en produccion, los arreglos y adecuaciones de configuracion se realizan en este punto
Launch4j es una herramienta para envolver aplicaciones Java distribuidas como jars in ejecutables nativos de Windows (es posible tambien envolverlos para Linux y Mac OS X)
Permite personalizar el icono de la app, crear un splash screen nativo al sistema, embeber una jre o redirigir a la pagina de descarga de Java en caso que no se encuentre disponible.
Se puede realizar con la tarea con el ejecutable como comandos de linea de consola, como tarea ant y construir con un plugin en maven.
Creando un ejecutable
Para la elaboracion del ejecutable con Launch4j necesitaremos
public class Principal {
public static void main(String[] args) {
String titulo = "Saludos con Launch4j";
String message = "Hola juli =)";
int messageType = JOptionPane.INFORMATION_MESSAGE;
JOptionPane.showMessageDialog(null, message, titulo, messageType);
}
}
Se le agrega la definicion de la clase main al plugin que genera el jar ejecutable
Posteriormente al guardado, podemos ejecutar la fase a partir de package, aunque con maven install hace mas de lo que se necesita es más rápido. El resultado será:
Personalizandolo
Para poersonalizar al menos un poco el ejecutable podemos incluir un icono y un screensplash que es la imagen mientras se carga el programa, para ello debemos modificar la clase main para que se tarde unos segundos antes de arrancar.
Principal.java
public class Principal {
public static void main(String[] args) {
try {
Thread.sleep(5000);
} catch(InterruptedException ie) {
ie.printStackTrace();
}
String titulo = "Saludos con Launch4j";
String message = "Hola juli =)";
int messageType = JOptionPane.INFORMATION_MESSAGE;
JOptionPane.showMessageDialog(null, message, titulo, messageType);
}
}
En la pestaña de basic podemos incluir la 'icon' y en la propia de 'splash', luego de habilitarla, la imagen bmp para mostrar mientras se carga la app.
#ver nombre de usuario
git config user.name
#ver email
git config user.email
#crear todas las propiedades de config
git config --list
#crear nombre de usuario
git config --global user.name "<nombre>"#crear email
git config --global user.email "<email>"
Ver y crear alias
#ver lista de alias
git config --get-regexp alias#crear alias
git config --global alias.<nombre> "git <comando>"#crear alias del alias
git config --global alias.alias "config --get-regexp ^alias\."
Crear branch local y pushearlo al remoto
#crear branch y cambiarse al el
git branch <nombre_branch> && git branch <nombre_branch>
git push --set-upstream <remote_name> <nombre_branch>
Agregar y cambiar la url del repositorio remoto
#para ver el repositorio remoto
git remote -v
#Cambiar el repositorio remoto existente
git remote set-url <remote_name> <url>
#Agregar un nuevo repositorio
git remote add <remote_name> <url>
Clonar un solo branch remoto especifico
git clone -b <branch_name> <url>
#para version anteriores a 1.7.10
git clone -b --single-branch <branch_name> <url>
Realizar un merge ignorando los espacios en blancos
git merge -Xignore-all-space
#O siendo mas espeficicos
git merge -Xignore-space-change
Descartar cambios modificados o agregados al staged index
#descartar cambios not staged
git checkout -- .
#descartar cambios to be committed
git reset --hard
Borrar un commit local y remoto
#hacer de cuenta que aca no paso nada
git reset HEAD~1
#no perder los cambios
git reset HEAD^ --soft
#borrar el commit en el remoto
git reset HEAD^ --hard && git push <remote_name> -f
#alt + 94 = ^ alt + 126 = ~
Crear un Patter para divir la variable en 2 grupos: uno con la expresion completa y el otro sin los porcentajes (Este seria la key del mapa de variabless)
También InetAddress nos permitirá conocer el nombre de la pc y el dominio:
1
2
3
4
System.out.print("nombre del PC: ");
System.out.println(ip.getHostName());
System.out.print("dominio del PC: ");
System.out.println(ip.getCanonicalHostName());
1
2
nombre del PC: Dar10-PC
dominio del PC: algunDominio
Este servicio de amazon, nos devuelve un InputStream con nada más ni nada menos que la ip del solicitando, pero nos vale para obtener nuestra propia ip publica.
Mi problema, windows no acepta caracteres diacriticos para nombres de archivos o directorios, como los acentos graves y agudos ( ´ ) y ( ` ), el acento circunflejo ( ^ ), la diéresis ( ¨ ), la virgulilla ( ~ ), la cedilla ( ¸ ), la colita ( ˛ ), la coma ( , ), el doble acento agudo, ( ˝ ), el doble acento grave, ( `` ) , el carón ( ˇ ), el breve ( ˘ ), el macrón ( ˉ ), el anillo ( ˚ ), el punto ( • ) el garfio ( ̉ )
ja lo saque de wikipedia!
Entonces pense en removeer los caracteres que ningún sistema operativo permite.
Este patrón remueve aquellos caracteres que windows nos informa con una vigneta:
Pero aun asi, los acentos, la Ñ que si son admitos en la mayorias de distribuciones de windows siguen estando, pero justo el servidor productivo no era uno de ellos.
La siguiente solucion, aunque torpe, satisfacia la problematica y permitía a la aplicación seguir funcionando: