tag:blogger.com,1999:blog-45940838023147214542024-03-05T19:54:04.831-08:00Aprende JAVATodo sobre JAVAAlfredohttp://www.blogger.com/profile/04582406212707215212noreply@blogger.comBlogger46125tag:blogger.com,1999:blog-4594083802314721454.post-42158665779873477032018-02-02T18:20:00.000-08:002018-02-02T18:20:22.454-08:00Manejo de un captcha con JSOUP [Java]<div style="text-align: justify;">
Antes de comenzar estoy muy contento de estar de regreso, espero no desaparecer de nuevo, pero estos últimos meses fueron muy pesados y complicados.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para iniciar, esta publicación es producto de un recuerdo que tuve hace algunos días, uno de mis primeros proyectos como desarrollador independiente y aprendiz (tiene como 6 años eso) era una aplicación móvil para validar facturas, en esos momentos un cliente nos proporcionaba un servicio para validar un tipo específico de facturas, pero otro tipo en particular de facturas no había forma de validar, solo era posible por medio de un sitio, entonces mi jefe con mucho colmillo (experiencia) hizo parte de la app donde integró el captcha que pedía el sitio para poder finalizar el proceso de validación y así podía hacer una extracción de los datos y mostrarlos como información en la app.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Básicamente para poder entender como funciona esto, gracias a maravillosas bibliotecas, es posible simular que visitas una página web y de esa forma manipular la página a partir del DOM (el código html) con nuestro hermoso Java. Es muy interesante porque para el caso que muestro a continuación se tuvieron que trabajar las cookies para no perder la sesión que se nos asigna cuando ingresamos al sitio. Para adelantar un poco, el sitio con el que trabajaremos es una página de México para consultar la CURP, espero no tener problemas, mi intención no es "hackear" el sitio, ya que nuestra aplicación como lo mencione solo simula que entramos al sitio, llenamos los datos que nos pide y por ultimo nos muestra la información.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Primero creamos un proyecto de maven y agregamos una sola dependencia a nuestro archivo POM.</div>
<br />
<textarea cols="100" rows="9">...
<dependencies>
<dependency>
<groupid>org.jsoup</groupid>
<artifactid>jsoup</artifactid>
<version>1.11.2</version>
</dependency>
</dependencies>
...</textarea>
<br />
<br />
<div style="text-align: justify;">
Jsoup es una interesante biblioteca que si deseas conocer más de ella puedes checarlo en el siguiente sitio: https://jsoup.org/</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ahora, si checas mi código a continuación probablemente pienses: "qué feo programa", la situación es que no dediqué demasiado tiempo para dejar hermoso el código, me interesa mostrarte como trabajar el captcha y solo eso.</div>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitkFX0OhJ8d28_svUafXxQVMN_07n6CptzBXdzByMPkaivKXeNv6wL_1OtAvJuM6Zv2ODI9QRy51KbdZX8IGBUQsnTS4vn1IfzbBmGo98h-GMhnuvZxILHz0e9wsPeBPn-Aq_DRd81lSg/s1600/Captura+de+pantalla+2018-02-01+a+la%2528s%2529+23.03.57.png" imageanchor="1"><img border="0" height="312" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitkFX0OhJ8d28_svUafXxQVMN_07n6CptzBXdzByMPkaivKXeNv6wL_1OtAvJuM6Zv2ODI9QRy51KbdZX8IGBUQsnTS4vn1IfzbBmGo98h-GMhnuvZxILHz0e9wsPeBPn-Aq_DRd81lSg/s320/Captura+de+pantalla+2018-02-01+a+la%2528s%2529+23.03.57.png" width="320" /></a><br />
<br />
<div style="text-align: justify;">
El formulario que propongo se constituye de dos partes:</div>
<ol>
<li style="text-align: justify;">Formulario de solicitud de CURP: Son los dos jFields para ingresar la CURP, Captcha y el botón para solicitar el captcha (ese botón es como si entraras al sitio). Donde se puede ver la captcha es un jPanel, los nombres los podrás identificar fácilmente cuando mires un poco el código.</li>
<li style="text-align: justify;">Resultado de consulta de la CURP: El botón de Consultar lanza una solicitud (simulando que llenaste lo que te pidió la página) para después mostrar la información de la parte inferior con unos pequeños jLabels que al inicio se ven vacíos.</li>
</ol>
<textarea cols="100" rows="50">package com.servehttp.janiserver.curp;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.IOException;
import javax.imageio.ImageIO;
import org.jsoup.Connection;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;
/**
*
* @author Jesús Alberto Sánchez Tecalco
*/
public class Aplicacion extends javax.swing.JFrame {
private final String INDEX_PAGE = "https://consultas.curp.gob.mx/CurpSP/inicio2_2.jsp";
private final String CURP_PAGE = "https://consultas.curp.gob.mx/CurpSP/curppxcurp.do";
private Connection connection;
private Document document;
public Aplicacion() {
initComponents();
}
@SuppressWarnings("unchecked")
private void initComponents() {
...
}
private void cargarPagina() {
try {
//consultamos la pagina
connection = Jsoup.connect(INDEX_PAGE);
document = connection.get();
//Obtenemos el elemento de la imagen del captcha
Element captcha = document.getElementById("capt");
//Recuperamos la imagen usando las cookies y la ingresamos en el panel
Connection.Response response = Jsoup
.connect(captcha.absUrl("src"))
.cookies(connection.response().cookies())
.ignoreContentType(true)
.execute();
BufferedImage bi = ImageIO.read(new ByteArrayInputStream(response.bodyAsBytes()));
jpaCaptcha.getGraphics().drawImage(bi, 0, 0, null);
} catch (IOException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
private void limpiarFormulario() {
jtfCurp.setEnabled(true);
jtfCurp.setText(null);
jtfCaptcha.setText(null);
jtfCaptcha.setEnabled(true);
jtfCurp.requestFocus();
jbtConsultar.setEnabled(true);
jlbNombres.setText("-");
jlbPaterno.setText("-");
jlbMaterno.setText("-");
jlbSexo.setText("-");
jlbFecha.setText("-");
}
private void jbtConsultarActionPerformed(java.awt.event.ActionEvent evt) {
//Recuperamos los datos del formulario
String curp = jtfCurp.getText();
String captcha = jtfCaptcha.getText();
try {
//vamos a pedir la informacion de la curp pasando las cookies del sitio anterior para continuar en sesion
Document doc = Jsoup.connect(CURP_PAGE)
.data("codigo", captcha)
.data("strCurp", curp)
.data("strtipo", "B")
.cookies(connection.response().cookies())
.post();
//Recuperamos las tablas del DOM
Elements tables = doc.select("table");
//La segunda tabla es la que tiene la informacion de la curp
Element tableInfo = tables.get(1);
//sacamos todas las filas de la tabla
Elements filas = tableInfo.select("tr");
//Llenamos la informacion (cada fila tiene 2 columnas, la primera es una leyenda y la segunda su valor)
jlbNombres.setText(filas.get(6).select("td").get(1).text());
jlbPaterno.setText(filas.get(4).select("td").get(1).text());
jlbMaterno.setText(filas.get(5).select("td").get(1).text());
jlbSexo.setText(filas.get(7).select("td").get(1).text());
jlbFecha.setText(filas.get(8).select("td").get(1).text());
} catch (Exception ex) {
ex.printStackTrace();
}
}
private void jbtCargarActionPerformed(java.awt.event.ActionEvent evt) {
limpiarFormulario();
cargarPagina();
}
public static void main(String args[]) {
...
}
// Variables declaration - do not modify
private javax.swing.JLabel jLabel1;
private javax.swing.JLabel jLabel2;
private javax.swing.JLabel jLabel3;
private javax.swing.JLabel jLabel4;
private javax.swing.JLabel jLabel5;
private javax.swing.JLabel jLabel6;
private javax.swing.JLabel jLabel7;
private javax.swing.JButton jbtCargar;
private javax.swing.JButton jbtConsultar;
private javax.swing.JLabel jlbFecha;
private javax.swing.JLabel jlbMaterno;
private javax.swing.JLabel jlbNombres;
private javax.swing.JLabel jlbPaterno;
private javax.swing.JLabel jlbSexo;
private javax.swing.JPanel jpaCaptcha;
private javax.swing.JTextField jtfCaptcha;
private javax.swing.JTextField jtfCurp;
}
</textarea>
<br />
<br />
<div style="text-align: justify;">
Para poder saber las urls a las que se debe enviar la información utilicé las herramientas de desarrollador de mi precioso Chrome, ahí es posible ver las solicitudes que se lanzan y sus respuestas.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El resultado es el siguiente:</div>
<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2wOW-C8UEWDSXoiLy0wFCrE6DXfygEobmfUmsDblSHvjYw-XJxSjUyAxj-zXnfP7QwIG1RtwPamCWLg_N6rtsPCVsZmU722aqYH1jd_GIwpZMnqExjQNImFpQYFhmueGq_naFZuLERlk/s1600/Captura+de+pantalla+2018-02-01+a+la%2528s%2529+23.02.52.png" imageanchor="1"><img border="0" height="312" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2wOW-C8UEWDSXoiLy0wFCrE6DXfygEobmfUmsDblSHvjYw-XJxSjUyAxj-zXnfP7QwIG1RtwPamCWLg_N6rtsPCVsZmU722aqYH1jd_GIwpZMnqExjQNImFpQYFhmueGq_naFZuLERlk/s320/Captura+de+pantalla+2018-02-01+a+la%2528s%2529+23.02.52.png" width="320" /></a><br />
<br />
<div style="text-align: justify;">
Considerar que hay validaciones que no consideré, por ejemplo el valor del CURP debe ser en mayúsculas y sabemos que tiene un tamaño específico. También no validé el caso cuando ingresan una CURP incorrecta (supongo se queda vacío todo).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Espero esta publicación pueda ser de utilidad, ¡nos vemos en la siguiente entrega!.</div>
Jesús Alberto Sánchez Tecalcohttp://www.blogger.com/profile/05416570182548174207noreply@blogger.com1tag:blogger.com,1999:blog-4594083802314721454.post-68174646978654347642017-06-28T18:48:00.001-07:002017-06-30T08:36:45.193-07:00¿Que es un archivo clase en Java? y como crear uno.<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUECBqIsH3ciu4ZUWFOCnXIia0fLdcZyL1iaWLsSdpo4pGWy8EsWz1xupNTX8BxfUSfHbMlMpdn_0z70cKUSnCmaQp_9dOesWOWiacFDvsMzcigNJ5YJ80YiLXXV31YepTbiUGKGTbAjxe/s1600/Que-es-un-archivo-clase-en-Java-y-como-crear-uno.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" data-original-height="174" data-original-width="680" height="161" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiUECBqIsH3ciu4ZUWFOCnXIia0fLdcZyL1iaWLsSdpo4pGWy8EsWz1xupNTX8BxfUSfHbMlMpdn_0z70cKUSnCmaQp_9dOesWOWiacFDvsMzcigNJ5YJ80YiLXXV31YepTbiUGKGTbAjxe/s640/Que-es-un-archivo-clase-en-Java-y-como-crear-uno.gif" width="640" /></a></div>
<b><u><span style="font-size: large;">¿Qué es un archivo clase en Java?</span></u></b><br />
<b><u><span style="font-size: large;"><br /></span></u></b>
Un <b>archivo clase</b> en Java es una forma compilada de un archivo de código fuente de Java. Cuando compilamos el programa Java que esta escrito en el archivo de código fuente de Java termina con la extensión <span style="font-family: "courier new" , "courier" , monospace;">.java</span> , produce mas de un archivo de clase dependiendo de cuántas clases se declaran y definen en ese archivo origen de Java. Un archivo de Java puede contener solo una clase pública y su nombre debe coincidir con el nombre del archivo, por ejemplo: <span style="font-family: "courier new" , "courier" , monospace;">HelloWorld.java</span>, este archivo puede contener una clase pública cuyo nombre debe ser <span style="font-family: "courier new" , "courier" , monospace;">HelloWorld </span>como se muestra a continuacion:<br />
<br />
<br />
<textarea cols="80" rows="7">public class HelloWorld {
public static void main(String... args){
System.out.println("Estoy dentro de la clase de Java HelloWorld");
}
}
</textarea>
<br />
Si compilas este archivo de Java por<br />
<br />
<span style="color: blue; font-family: "courier new" , "courier" , monospace;">=> javac HellowWorld.java</span><br />
<br />
Generará lo siguiente<br />
<br />
<span style="color: blue; font-family: "courier new" , "courier" , monospace;">=> HelloWorld.class</span><br />
<br />
<br />
<u><span style="font-size: large;"><b>Detalles de un archivo Clase en Java.</b></span></u><br />
<u><span style="font-size: large;"><b><br /></b></span></u>
Un archivo clase en Java tiene la extensión <i>.class</i> y contienen el bytecode, el cual es la instrucción para la Máquina Virtual de Java o <a href="http://javarevisited.blogspot.cl/2011/12/jre-jvm-jdk-jit-in-java-programming.html">Java Virtual Machine (JVM)</a>, que luego traduce ese bytecode en instrucciones de nivel máquina dentro de la plataforma especifica sobre la cual se esta ejecutando el programa Java sea Windows o Linux. De hecho esta combinación del <a href="http://javarevisited.blogspot.cl/2012/05/10-points-about-class-file-in-java.html">archivo de la clase</a>, bytecode y JVM logra la <a href="http://www.java67.com/2012/08/how-java-achieves-platform-independence.html">independencia de plataforma de Java</a>. Si alguien pregunta, ¿Que es el bytecode en Java, es la instrucción en lenguaje máquina?, tú puedes responderle que es justo el lenguaje para la JVM no para una maquina en especifico.<br />
<br />
Cuando ejecutas un programa Java como se describe en este <a href="http://javarevisited.blogspot.cl/2011/11/run-java-program-from-command-prompt.html">tutorial paso a paso para ejecutar un programa Java</a> usando comandos, proporcionamos el nombre del archivo de la clase que contiene el método principal en java. La JVM primero carga ese archivo y ejecuta el método principal que es el punto de entrada de la aplicación de Java. Recuerda que el compilador de Java o comando de <span style="font-family: "courier new" , "courier" , monospace;">javac </span><span style="font-family: inherit;">es usado para crear un archivo de la clase desde el archivo fuente Java y el comando Java es utilizado para ejecutar el programa Java almacenado en un archivo clase.</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Dado que el archivo de la clase </span>contiene<span style="font-family: inherit;"> bytecode en formato hexadecimal y el formato del archivo de la clase esta bien documentado cualquiera puede moderar al archivo de la clase y romper los beneficiarios de seguridad de Java. Con el fin de evitar eso cada archivo de clase de Java es verificado por el </span>verificador<span style="font-family: inherit;">, después de cargar durante el proceso de </span>verificación<span style="font-family: inherit;"> del bytecode y el verificador rechaza el archivo de clase que </span>violan<span style="font-family: inherit;"> las restricciones del lenguaje de </span>programación<span style="font-family: inherit;"> Java. </span><br />
<br />
Eso es todo sobre Que es un archivo clase en Java y cómo crear un archivo clase en Java. En resumen el archivo clase es un archivo binario que contiene bytecode y el compilador de Java es usado para encriptar el archivo clase en Java.<br />
<br />
***El Artículo fue obtenido de <a href="http://www.java67.com/">Java67 </a>y fue modificado ligeramente para su traducción. Para revisar el contenido original dar clic <a href="http://www.java67.com/2012/08/what-is-class-file-in-java-how-to-create-class.html">aquí</a>.Unknownnoreply@blogger.com0tag:blogger.com,1999:blog-4594083802314721454.post-27397788945390006442017-05-13T11:18:00.000-07:002017-06-28T18:49:06.507-07:00¿Cual es la diferencia entre una Clase y un Objeto en JAVA?<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZzcz7Jrb9dor1kCxn1s8l9qsEwnN3OoEXUrks04TneHQlRF-BNpjmk-_clL7VvzJf2Au1SS4v00YGmz8K7ZbmJlgkRJM5CiktR8ohmh688IDyvPanqVWWkoRV-W7xPxlerzt14pMf7HBZ/s1600/Encabezados-de-Blog.gif" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="161" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjZzcz7Jrb9dor1kCxn1s8l9qsEwnN3OoEXUrks04TneHQlRF-BNpjmk-_clL7VvzJf2Au1SS4v00YGmz8K7ZbmJlgkRJM5CiktR8ohmh688IDyvPanqVWWkoRV-W7xPxlerzt14pMf7HBZ/s640/Encabezados-de-Blog.gif" width="640" /></a></div>
<br />
Este articulo esta especialmente dirigido para programadores principiantes, que estan aprendiendo algún lenguaje de programación orientado a objetos, como por ejemplo: Java, C++ o C# y aspiran estar bien preparados para cualquier entrevista para un puesto como programador. Ahora bien, la diferencia entre Clases y Objetos es una de las las preguntas mas comunes dentro de la Programación Orientada a Objetos (POO), incluso podríamos preguntarle a personas recién graduadas de alguna universidad o instituto tecnologico y te sorprenderás al ver el conflicto que incluso para estas personas supone esta pregunta. <b>Clase</b> ("Class") y <b>Objeto</b> ("Object") son dos pilares de la POO y saber identificarlos y diferenciarlos bien es necesario, pero cuando buscas respuestas a esta preguntas desde lo teórico te encuentras con que <i>"una clase es una plantilla y los objetos son cosas reales creadas a partir de esa plantilla"</i>, difícilmente con ese concepto queda todo explicado. Aunque la respuesta es correcta y funciona perfectamente, no la entenderá de la misma forma un programador que acaba de hacer la pregunta a otro que realmente entiende la diferencia entre una Clase y un Objeto.<br />
<br />
Por lo tanto, si recibo una respuesta así, les pido entonces que creen una clase y expliquen cómo se crean los objetos en el programa, digamos para representar a un "Empleado", "Estudiante" o simplemente un "Carro". Si el programador entiende verdaderamente<b> <u><a href="https://curiotecnology.blogspot.cl/2017/06/que-es-un-archivo-clase-en-java-y-como.html" target="_blank">que es una clase</a></u></b> y <u><b><a href="http://www.java67.com/2012/12/object-in-java-and-OOPS-example-tutorial.html" target="_blank">que es un objeto</a></b></u>, no tardará mucho tiempo en hacerlo, pero si aun tiene dudas al respecto probablemente tarde mas de lo esperado.<br />
<br />
El punto es entender la diferencia entre una clase y un objeto, no para tomar una entrevista, ¿por qué?, porque si conoces la clase y el objeto será mucho mas sencillo para ti trabajar con un lenguaje de programación orientado a objetos como Java o C#.<br />
<br />
Entonces para darte una idea mas clara de lo que es una clase y un objeto, te mostramos algunos ejemplos: si "Carro" es una clase entonces "Merc", "Audi" y "BMW" son objetos. Si "Televisión" es una clase entonces "Sony Bravia", "Samsung Smart TV" son objetos de esa clase.<br />
<br />
Sí "Smartphone" es una clase entonces "iPhone", "Samsung Galaxy" y "Nokia" son objetos de esa clase. Pero en aplicaciones orientadas a objetos, generalmente los sustantivos representan las clases, por ejemplo en una aplicación financiera "Orden", "Transacción", "Instrumentos" son clases. De igual forma en temas de comercio electrónico "Pago", "Orden", Producto" son algunos ejemplos de clases.<br />
<br />
<span style="font-size: large;"><u><b>Clase Vs. Objeto en JAVA.</b></u></span><br />
Algunas diferencias entre Clases y Objetos , se basan totalmente en la práctica y la experiencia:<br />
<br />
1.- Una Clase se crea mientras tu codificas, pero el objeto es creado al momento en el que el programa es ejecutado, por ejemplo: La máquina virtual de Java o JVM de sus siglas en inglés Java Virtual Machine. Aunque al escribir tu código, es necesario para crear un objeto, como: <span style="font-family: "courier new" , "courier" , monospace;">new Student(); </span><span style="font-family: inherit;">, el objeto no es creado en ese momento. Este se crea al momento en que el programa es ejecutado y cuando se ejecuta </span>específicamente<span style="font-family: inherit;"> esa </span>línea<span style="font-family: inherit;"> de </span>código. Usualmente para crear dicho objeto en Java se llama a un <u><b><a href="http://www.java67.com/2012/11/java-enum-example-with-constructor.html" target="_blank">constructor </a></b></u>de la clase, pero se pueden presentar algunas anomalías, como la Serialización (se llama "serializar un objeto" al proceso de convertir en bytes, para poder enviarlo por una red, y reconstruirlo luego a partir de esos bytes.)<br />
<br />
2.- Las diferencia mas importante entre una Clase y un Objeto es que este ultimo normalmente tiene un estado (aunque el objeto sin estado tambien es posible). Este se utiliza para diferenciarse de otros objetos. Por ejemplo, si tienen una clase para representar "Estudiantes", entonces "Johan" y "Mohan" son dos objetos de la clase, los cuales tienen nombres diferentes, un atributo que los diferencia. Una imagen vale mas que mil palabras, y la diferencia entre una Clase y un Objeto puede entenderse mejor a través de esta imagen:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv7YZCQvkeHDlnumisTTXupqD0P6yKX8H7DNSkS9kfzk8LUkylEXuVJMbhrCCdG-xj61UlwVJwISZ5U1NG807A57SH0swVkSYYzVwqJe_D7bCc55F6iXLmvBD_H_dXMJHq5cZ2DwHW1AX_/s1600/Ejemplo+de+objetos.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Ejemplo entre una Clase y un Objeto. Ejemplo grafico." border="0" height="486" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjv7YZCQvkeHDlnumisTTXupqD0P6yKX8H7DNSkS9kfzk8LUkylEXuVJMbhrCCdG-xj61UlwVJwISZ5U1NG807A57SH0swVkSYYzVwqJe_D7bCc55F6iXLmvBD_H_dXMJHq5cZ2DwHW1AX_/s640/Ejemplo+de+objetos.jpg" title="Ejemplo entre una Clase y un Objeto. Ejemplo grafico." width="640" /></a></div>
<br />
En este ejemplo, "Jugador" es una clase, la cual actualmente es como la plantilla de creación de jugadores y los dos jugadores: "Scooby" y "Tabby" son los objetos que se crearon en el entorno de ejecución, en este caso la máquina virtual de Java (JVM). Cada jugador tiene valores diferentes para sus atributos, tambien conocido como estado del objeto. Por ejemplo la posición de Scooby es la 5° y tiene $341, mientras que la posición de Tabby es la 18° y tienen $87. Si aún no entiendes por completo la diferencia entre una Clase y un Objeto, te mostramos otro ejemplo un poco mas interesante que el anterior.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9topwJwnqNSj1JFUlSuU4QApXo0UDWwkALSipbVRaz71dyxdsXblvhwMXHYoVxFRdkg-Dnys8OzMor2IwJDmyKk7TT21jYpnHavxnxXtEQ3vzt8FMylKy4lvVu5Kfk6geJpgyVww36JtD/s1600/Ejemplo+grafico+de+clases+y+objetos.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Ejemplo grafico de diferencia entre Clase y Objeto." border="0" height="296" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9topwJwnqNSj1JFUlSuU4QApXo0UDWwkALSipbVRaz71dyxdsXblvhwMXHYoVxFRdkg-Dnys8OzMor2IwJDmyKk7TT21jYpnHavxnxXtEQ3vzt8FMylKy4lvVu5Kfk6geJpgyVww36JtD/s640/Ejemplo+grafico+de+clases+y+objetos.jpg" title="Ejemplo grafico de diferencia entre Clase y Objeto." width="640" /></a></div>
<br />
En este caso el "Cortador de galletas" es una clase que es una plantilla o modelo para crear objetos: las galletas. Puedes ver que hay tres galletas, una para ti y dos para mi obviamente xD.<br />
<br />
3.- Aunque<a href="http://www.java67.com/2014/03/is-java-pure-object-oriented-programming-language.html" target="_blank"> Java no es un Lenguaje orientado a objetos puro</a>, la mayoría de las cosas son objetos en Java, por ejemplo las variables primitivas y operadores no son objetos. En Java, los objetos son creados en un espacio de memoria especial conocida como "Memoria Heap" (conoce mas <a href="http://www.colxi.info/diferencias-entre-la-asignacion-de-memoria-en-el-stack-y-en-el-heap-c/" target="_blank">aquí</a>). No importa en que amito los crees, localmente o globalmente siempre se crearán en el espacio "heap". Por otro lado, las clases son cargadas dentro de otra area especial de la memoria de la máquina virtual de Java (JVM), conocida como "permgen space". Para Java 8 en adelante, ese espacio es tambien conocido como "Metaspace". Tu puedes crear tantos objetos de una clase como desees, sujeto al límite de tu memoria heap, ya que cada objeto toma una parte de la memoria. Una vez que la memoria se llena por completo, no puedes seguir creando mas objetos y la maquina virtual de Java (JVM) lanzará el error <a href="http://www.java67.com/2013/08/guide-of-javalangoutofmemoryerror-java-heap-space-tomcat-eclipse-minecraft-jboss.html" target="_blank">java.lang.OutOfMemoryError: Java Heap Space </a>: si sigues tratando de crear mas objetos.<br />
<br />
4.- Los objetos tambien son conocidos como instancias en el lenguaje de programación de JAVA, y en la clase JVM tambien se representa por una instancia de <span style="font-family: "courier new" , "courier" , monospace;">java.lang.class</span><span style="font-family: inherit;">. Por otro lado la Clase tambien es conocida como un tipo de dato. Un variable de referencia que guarda la referencia de un objeto tiene un tipo de dato, que denota a </span>qué<span style="font-family: inherit;"> tipo de objeto puede hacer referencia. Por ejemplo, en el siguiente </span>código <span style="font-family: "courier new" , "courier" , monospace;">ConstructorDemo</span> es el nombre de la clase, conocido tambien como un tipo de dato, cd es una variable de referencia de tipo <span style="font-family: "courier new" , "courier" , monospace;">ConstructorDemo</span>, lo que significa que este puede apuntar a un Objeto de la clase <span style="font-family: "courier new" , "courier" , monospace;">ConstructorDemo</span> o a sus clases hijas. Cuando se crea un objeto usando el operador <span style="font-family: "courier new" , "courier" , monospace;">new()</span>, tambien clasifica automáticamente al constructor de esa clase.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiSQBTbIsaMLbrXFgpZaF5AqByPL-Us6LKlGlAB88CDMP5DDgfFT7lMmn-RQORcMcsLK0bh6QsbHmtxBKjJ1NBN_NqXceX0r3fOa8-9jEuI_ODj2RWm04I2DPYuylXlXVJFP1tIvfkuHtY/s1600/Estructura+de+creacion+de+un+objeto+en+Java.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="296" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgiSQBTbIsaMLbrXFgpZaF5AqByPL-Us6LKlGlAB88CDMP5DDgfFT7lMmn-RQORcMcsLK0bh6QsbHmtxBKjJ1NBN_NqXceX0r3fOa8-9jEuI_ODj2RWm04I2DPYuylXlXVJFP1tIvfkuHtY/s640/Estructura+de+creacion+de+un+objeto+en+Java.jpg" width="640" /></a></div>
<br />
5.- La Clase es una abstracción que contiene código, principalmente atributos y métodos que operan sobre ellos. Por otro lado el objeto es una cosa real que operan sobre ellos, pero ahí viene el <u><a href="http://www.java67.com/2012/08/can-we-overload-static-method-in-java.html">método estático</a></u>, el cual pertenece a la clase.<br />
<br />
Eso es todo en esta pregunta sobre la diferencia entre las Clases y los Objetos en Java. Como ya se ha dicho, respuestas como: una clase es una plantilla y los objetos son cosas reales creadas a partir de esa plantilla, es completamente correcto, sin embargo, es recomendable examinar mas a fondo el aspecto práctico de la clase y el objeto. Si un programador puede diferenciar una clase de un objeto en código, puede dar un par de ejemplos de lo que las Clases y los Objetos son entonces su comprensión sobre este importante concepto es lo suficiente bueno para ser considerada.<br />
<br />
***El Artículo fue obtenido de <a href="http://www.java67.com/">Java67 </a>y fue modificado ligeramente para su traducción. Para revisar el contenido original dar clic <a href="http://www.java67.com/2014/08/what-is-difference-between-class-and-object-java-programming-oops.html" target="_blank">aquí</a>.Unknownnoreply@blogger.com4tag:blogger.com,1999:blog-4594083802314721454.post-27603585299311082232017-04-24T18:46:00.002-07:002017-05-11T19:21:34.398-07:00Diferencias entre Abstracción y Encapsulación en Java. POO<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjyoRbxIWJxe4dI9XY86MCrztD7XXF6gKkSDT9fIuwPlcwzMHSmsZN85kfxWQaBQ11ZF0xWBXDrYfA1eRfOn4lq5qFy-nFUBfScU-diV9hYE4OExpXbl_iBnds_SkR27-bley6QyZW4jkf/s1600/Abstraccion+Vs.+Encapsulacion.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="189" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgjyoRbxIWJxe4dI9XY86MCrztD7XXF6gKkSDT9fIuwPlcwzMHSmsZN85kfxWQaBQ11ZF0xWBXDrYfA1eRfOn4lq5qFy-nFUBfScU-diV9hYE4OExpXbl_iBnds_SkR27-bley6QyZW4jkf/s640/Abstraccion+Vs.+Encapsulacion.jpg" width="640" /></a></div>
Tanto la <b>Abstracción</b> como la <b>Encapsulación</b> son dos de los cuatros conceptos básicos de la Programación Orientada a Objetos (POO) con los cuales puedes modelar las cosas del mundo real en objetos y puedas implementarlas en tu programa y código. Muchos principiantes tienden a confundir estos términos por lo similar que pueden llegar a lucir. Si tu le preguntas a alguien ¿que es la Abstracción?, esa persona te responderá que es un concepto de la POO que se centra en la información pertinente ocultando detalles innecesarios, y cuando preguntas acerca de la Encapsulación, muchos te responden que es otro concepto de la POO el cual oculta datos del mundo exterior. Las definiciones no son erróneas ya que tanto la Abstracción como la Encapsulación ocultan algo, pero la diferencia clave esta en la<i> intención.</i><br />
<br />
La abstracción oculta la complejidad para dar una imagen mas abstracta, mientras que la encapsulación oculta el trabajo interno para que puedas cambiarlo posteriormente. En otras palabras, la Abstracción oculta detalles a <b>nivel de diseño</b>, mientras que la Encapsulación oculta detalles a <b>nivel de implementación.</b><br />
<br />
Por ejemplo, cuando describes un objeto por primera vez, hablas en términos mas abstractos, como: "Vehículo que se puede mover", no dices cómo se moverá el vehículo, si se moverá usando neumáticos, si volará o si navegará. Solo se mueve. A esto llamamos Abstracción. Estamos hablando de una de las cosas mas esenciales, y es que esta en movimiento, en vez de centrarse en detalles sobre cómo se mueve, si por tierra, volando o por agua.<br />
<br />
Están también los diferentes niveles de Abstracción y es una buena práctica que las clases deberían interactuar con otras clases con un mismo nivel de Abstracción o mayor nivel de Abstracción. De manera que a medida que incrementa el nivel de Abstracción, las cosas empiezan a ser cada vez mas simples, dejando a un lado los detalles.<br />
<br />
Por otro lado, la Encapsulación trata sobre la implementación. Su único propósito es ocultar el trabajo interno de los objetos del mundo exterior para que pueda cambiarlo mas tarde sin afectar a los clientes externos.<br />
<br />
Por ejemplo, tenemos un HashMap que permite almacenar el objeto utilizando el método<span style="font-family: "courier new" , "courier" , monospace;"> put() </span>y recuperar el objeto utilizando el método<span style="font-family: "courier new" , "courier" , monospace;"> get()</span><span style="font-family: inherit;">. Cómo HashMaps implementa este </span>método (lee mas <a href="http://www.java67.com/2013/06/how-get-method-of-hashmap-or-hashtable-works-internally.html" target="_blank">aquí</a>) es un detalle interno de HashMap, el cliente solo se preocupa por almacenar los objetos y devolverlo, a él no le concierne si HashMap esta usando un arreglo, cómo esta resolviendo la colisión, si esta usando una lista o un árbol binario para almacenar el intercambio de los objetos en la memoria, etc.<br />
<br />
Debido a la Encapsulación, tu puedes cambiar el funcionamiento interno de HashMap con facilidad sin interferir con los clientes que están usando HashMap. Por ejemplo, en Java 8, el <span style="font-family: "courier new" , "courier" , monospace;">java.util.HashMap </span><span style="font-family: inherit;">cambia su </span>implementación<span style="font-family: inherit;"> para usar un </span>árbol<span style="font-family: inherit;"> binario en lugar de una lista para almacenar los objetos en el mismo lugar después de cierto punt</span><span style="font-family: inherit;">o (lee mas <a href="http://javarevisited.blogspot.cl/2011/02/how-hashmap-works-in-java.html" target="_blank">aquí</a>).</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">El cliente no necesita hacer ningún cambio para beneficiarse de este cambio de </span>código<span style="font-family: inherit;"> porque esos detalles no están expuestos a ellos. Si el cliente tuviera conocimiento de ello, es decir, que de alguna manera pudiesen tener referencia del arreglo interno del HashMap, no </span>habría<span style="font-family: inherit;"> sido posible cambiar la </span>implementación<span style="font-family: inherit;"> sin afectar a los demás clientes. </span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Existen muchos principios de diseño basados en la </span>Abstracción<span style="font-family: inherit;">, como por ejemplo, "</span>Codificación<span style="font-family: inherit;"> para interfaces después de la </span>implementación<span style="font-family: inherit;">" que ayuda a escribir código flexible en Java o C++. La idea es que una clase dependa de una interfaz, un nivel de </span>abstracción<span style="font-family: inherit;"> mas alto que la clase, un un menor nivel de </span>abstracción<span style="font-family: inherit;">. Esto resulta en un </span>código<span style="font-family: inherit;"> flexible que puede funcionar con cualquier </span>implementación<span style="font-family: inherit;"> de la interfaz. </span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;">Por ejemplo, si tu necesitas HashMap, tu clase debe depender de </span><span style="font-family: "courier new" , "courier" , monospace;">Map </span><span style="font-family: inherit;">en lugar de </span><span style="font-family: "courier new" , "courier" , monospace;">HashMap</span><span style="font-family: inherit;">. De igual forma, si tu necesitas </span><span style="font-family: "courier new" , "courier" , monospace;">ArrayList, </span><span style="font-family: inherit;">asegúrate de usar la </span><span style="font-family: "courier new" , "courier" , monospace;">List. </span><span style="font-family: inherit;">Afortunadamente, el </span>tío<span style="font-family: inherit;"> Bob ha compartido varios principios de diseño sobre Clean Code, conocidos colectivamente como principios de diseño SOLID, que es algo que cada programador POO debe aprender y entender. </span><br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9fIU3hncmp6jJUUrIz4mif0pCjycDzAjt3kEKtnBXpwf_axXrUXk1sXOMSGju3b3ksSKpaMAbItDZKhv9qlbEmrqtkxOgYHPQA6zJJHFNJZtXGh-KdaWQPYm63RsSm1Z8ulum7CssNXOG/s1600/Clean+Code.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Clean Code" border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi9fIU3hncmp6jJUUrIz4mif0pCjycDzAjt3kEKtnBXpwf_axXrUXk1sXOMSGju3b3ksSKpaMAbItDZKhv9qlbEmrqtkxOgYHPQA6zJJHFNJZtXGh-KdaWQPYm63RsSm1Z8ulum7CssNXOG/s320/Clean+Code.jpg" title="Clean Code" width="240" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<span style="font-size: large;"><b><u>Abstracción Vs. Encapsulación. </u></b></span></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
A continuación y a modo de resumen, desglosamos por puntos las principales diferencias entre Encapsulación y Abstracción.</div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ol>
<li>La diferencia mas importante entre Abstracción y Encapsulación es que la Abstracción resuelve el problema en un nivel de diseño mientras que la Encapsulación lo resuelve en un nivel de implementación. </li>
<li>La Abstracción busca esconder detalles no deseados mientras genera detalles mas esenciales, mientras que la Encapsulación busca ocultar el código y los datos dentro de una sola unidad, es decir, una clase o un método protegen su trabajo interno de objetos externos. En otras palabras, la Abstracción solo extrae detalles comunes o generaliza cosas. </li>
<li>La Abstracción permite centrarse en lo que el objeto hace en lugar de como lo hace, mientras la Encapsulación busca ocultar los detalles internos o forma de trabajar de un objeto. Cuando mantienes privados los detalles internos de trabajo de un objeto, se pueden editar posteriormente por un método mejor. El libro <a href="https://www.amazon.com/Head-First-Object-Oriented-Analysis-Design/dp/0596008678/?tag=javamysqlanta-20" target="_blank">Head First Object Oriented Analysis and Design</a> tiene algunos ejemplos excelentes de estos conceptos de POO, le sugiero que lean este libro al menos una vez para revisar los fundamentos de la POO. <div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJIH2sSfXzxdm2US7uT7MIp9x9gsw_g31olyG3PtC3wmbucnKiRRZW-lXpRBkzKE6dsRM5bkmWp3AsP0f70ZU4b7wsvdcmJJ1SBHSBlN0yvFbnInZ6Ly-RRjNsaR3910fLDloZYwQ5Ji_G/s1600/Head+First+Analaysis+and+Design.JPG" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt=" Head First Object Oriented Analysis and Design" border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhJIH2sSfXzxdm2US7uT7MIp9x9gsw_g31olyG3PtC3wmbucnKiRRZW-lXpRBkzKE6dsRM5bkmWp3AsP0f70ZU4b7wsvdcmJJ1SBHSBlN0yvFbnInZ6Ly-RRjNsaR3910fLDloZYwQ5Ji_G/s1600/Head+First+Analaysis+and+Design.JPG" title=" Head First Object Oriented Analysis and Design" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
</li>
<li>El enfoque de la abstracción es externo, por ejemplo: Desplazamiento del vehículo. Mientras que la encapsulación se ocupa del trabajo interno, por ejemplo: como se mueve exactamente el vehículo. </li>
<li>En Java, la Abstracción esta apoyada por el uso de <a href="http://www.java67.com/2012/09/what-is-difference-between-interface-abstract-class-java.html" target="_blank">interfaces</a> y <a href="http://javarevisited.blogspot.cl/2013/05/difference-between-abstract-class-vs-interface-java-when-prefer-over-design-oops.html" target="_blank">clases abstractas</a> mientras que la Encapsulación esta soportada por el uso de los modificadores de accesos: <span style="font-family: "courier new" , "courier" , monospace;">public, private</span><span style="font-family: inherit;"> and </span><span style="font-family: "courier new" , "courier" , monospace;">protected. </span></li>
</ol>
En la siguiente tabla se destacan las principales diferencias entre la Abstracción y la Encapsulación en Programación Orientada a Objetos:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHvycLfdSD-W8PmZGtcgKHMraCuEMUAD5w3_3sKeQ2Xz_xFALGe8YDDjg-Z_dGAJ_MLCk8U-Q2UxwhdhDk9VYNEFMpn40_pomavr1_zZ3rh6OKs7F_v9u-zMuJFjyrdQNya4iWxfvqCJxO/s1600/Cuadro+comparativo+entre+abstraccion+y+encapsulacion.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Cuadro comparativo. Abstracción Vs. Encapsulación." border="0" height="400" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhHvycLfdSD-W8PmZGtcgKHMraCuEMUAD5w3_3sKeQ2Xz_xFALGe8YDDjg-Z_dGAJ_MLCk8U-Q2UxwhdhDk9VYNEFMpn40_pomavr1_zZ3rh6OKs7F_v9u-zMuJFjyrdQNya4iWxfvqCJxO/s400/Cuadro+comparativo+entre+abstraccion+y+encapsulacion.jpg" title="Cuadro comparativo. Abstracción Vs. Encapsulación." width="373" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Esto es todo acerca de las diferencias entre la Abstracción y la Encapsulación en Java y POO. Yo entiendo, ambos parecen muy similares, pero como he dicho son conceptos totalmente diferentes. Solo recuerda que la Abstracción resuelve los problemas en el nivel de diseño mientras la Encapsulación los resuelve en el nivel de implementación. Ambos son muy importantes para un programador POO pero algunas veces resulta difícil de explicar.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Como dije anteriormente, la mejor manera de aprender y volverse un master de la Programación Orientada a Objetos es escribiendo código y leyendo el código de otros. Cuanto mas se exponen al código, mas se dan cuenta de cómo funcionan estos conceptos en la práctica. Hay varios principios de diseño que se basan en términos de abstracción, por ejemplo, <a href="http://javarevisited.blogspot.cl/2012/03/10-object-oriented-design-principles.html" target="_blank">codificación de interfaz en lugar de implementación</a>, el cual permite escribir codigo flexible. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<b>Otras entradas sobre POO que podrían gustarte:</b> </div>
<div class="separator" style="clear: both; text-align: left;">
</div>
<ul>
<li>Diferencias entre Clase y Objeto en Java y POO (haz clic <a href="http://curiotecnology.blogspot.com/2017/05/diferencia-entre-clase-y-objeto.html">aquí</a>).</li>
<li>Diferencias entre Herencia y Polimorfismo en Java (Pronto traducido aquí).</li>
<li>Diferencias entre Agregación, Composición y Asociación en POO (Pronto traducido aquí).</li>
<li>Diferencias entre patrones de diseño de Estado y Estrategia (Pronto traducido aquí).</li>
<li>¿Que es el Polimorfismo?¿Sobrecarga o Anulación? (Pronto traducido aquí).</li>
<li>¿Cual es la diferencia entre Sobrecarga y Anulación en POO? (Pronto traducido aquí).</li>
<li>Diferencias entre instancia y objetos en Java (Pronto traducido aquí).</li>
<li>¿Cual es la diferencia entre un descubrimiento estático y dinámico en Java? (Pronto traducido aquí).</li>
</ul>
<br />
<div class="separator" style="clear: both; text-align: left;">
Gracias por leer este articulo, si de verdad te gusto, no dejes de compartirlo con tus amigos y colegas. Si tienes alguna pregunta o sugerencia, por favor déjala en los comentarios. Y si quieres saber mas sobre conceptos de POO, principios de diseño SOLID y aplicación de los conceptos de POO en la vida real, no dejes de leer <a href="https://www.amazon.com/Clean-Code-Handbook-Software-Craftsmanship/dp/0132350882?tag=javamysqlanta-20" target="_blank">Clean Code</a>. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
***El Artículo fue obtenido de <a href="http://javarevisited.blogspot.cl/">JavaRevisited </a>y fue modificado ligeramente para su traducción. Para revisar el contenido original dar clic <a href="http://javarevisited.blogspot.cl/2017/04/difference-between-abstraction-and-encapsulation-in-java-oop.html" target="_blank">aquí</a>.Unknownnoreply@blogger.com1tag:blogger.com,1999:blog-4594083802314721454.post-91682448283482966572017-01-17T12:43:00.000-08:002017-01-18T06:28:26.423-08:00Unit Tests & Integration test : Spring Boot Tests - Jacoco - MavenEsta vez explicaré de manera muy básica como configurar un proyecto hecho en Spring Boot para ejecutar sus test unitarios y ademas generar un reporte utilizando el Plugin de Jacoco para Maven.<br />
<div>
<br /></div>
<div>
Comenzaré explicando que en todo proyecto es importante tener una suite de test bien definida, para esto existen una gran cantidad de librerías, que nos pueden ayudar.<br />
<br />
En el caso de Spring, el framework nos proporciona ya un conjunto de librerías(módulo) que nos resuelven el tema de importar las dependencias.<br />
<span style="font-size: 18.72px; font-weight: bold; text-align: center;"><br /></span>
<br />
<h3>
<span style="font-size: 18.72px; font-weight: bold; text-align: center;"> Configurar </span><a href="https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html" style="font-size: 18.72px; font-weight: bold; text-align: center;" target="_blank">spring-boot-starter-test</a></h3>
</div>
<div>
<br /></div>
<div>
Este módulo es <a href="https://docs.spring.io/spring-boot/docs/current/reference/html/boot-features-testing.html" target="_blank">spring-boot-starter-test</a> y aunque existen otros módulos en Spring Boot para hacer test, este es el que contiene lo necesario y más básico para trabajar. Pues entre otras cosas nos proporciona lo siguiente: </div>
<div>
<h2>
<ul>
<li><span style="font-size: small;"><a class="link" href="http://junit.org/" style="background-color: white; color: #4183c4; font-family: helvetica, arial, freesans, clean, sans-serif; font-weight: normal; text-decoration: none;" target="_top">JUnit</a><span style="background-color: white; color: #333333; font-family: "helvetica" , "arial" , "freesans" , "clean" , sans-serif; font-weight: normal;"> — La librería de testing unitario básica en todos los proyectos java.</span></span></li>
<li><span style="font-size: small;"><a class="link" href="http://docs.spring.io/spring/docs/4.3.5.RELEASE/spring-framework-reference/htmlsingle/#integration-testing.html" style="background-color: white; color: #4183c4; font-family: helvetica, arial, freesans, clean, sans-serif; font-weight: normal; text-decoration: none;" target="_top">Spring Test</a><span style="background-color: white; color: #333333; font-family: "helvetica" , "arial" , "freesans" , "clean" , sans-serif; font-weight: normal;"> </span><span style="background-color: white; color: #333333; font-family: "helvetica" , "arial" , "freesans" , "clean" , sans-serif; font-weight: normal;">& Spring Boot Test —Algunas utilidades para testing de aplicaciones de Spring</span></span></li>
<li><span style="font-size: small;"><a class="link" href="https://joel-costigliola.github.io/assertj/" style="background-color: white; color: #4183c4; font-family: helvetica, arial, freesans, clean, sans-serif; font-weight: normal; text-decoration: none;" target="_top">AssertJ</a><span style="background-color: white; color: #333333; font-family: "helvetica" , "arial" , "freesans" , "clean" , sans-serif; font-weight: normal;"> — Librería para Asserts</span></span></li>
<li><span style="font-size: small;"><a class="link" href="http://hamcrest.org/JavaHamcrest/" style="background-color: white; color: #4183c4; font-family: helvetica, arial, freesans, clean, sans-serif; font-weight: normal; text-decoration: none;" target="_top">Hamcrest</a><span style="background-color: white; color: #333333; font-family: "helvetica" , "arial" , "freesans" , "clean" , sans-serif; font-weight: normal;"> — Librería para crear matchers entre objetos</span></span></li>
<li><span style="font-size: small;"><a class="link" href="http://mockito.org/" style="background-color: white; color: #4183c4; font-family: helvetica, arial, freesans, clean, sans-serif; font-weight: normal; text-decoration: none;" target="_top">Mockito</a><span style="background-color: white; color: #333333; font-family: "helvetica" , "arial" , "freesans" , "clean" , sans-serif; font-weight: normal;"> — Framework para crear objetos simulados para pruebas</span></span></li>
<li><span style="font-size: small;"><a class="link" href="https://github.com/skyscreamer/JSONassert" style="background-color: white; color: #4183c4; font-family: helvetica, arial, freesans, clean, sans-serif; font-weight: normal; text-decoration: none;" target="_top">JSONassert</a><span style="background-color: white; color: #333333; font-family: "helvetica" , "arial" , "freesans" , "clean" , sans-serif; font-weight: normal;"> — Librería para realizar asserts sobre Json</span></span></li>
<li><span style="font-size: small;"><a class="link" href="https://github.com/jayway/JsonPath" style="background-color: white; color: #4183c4; font-family: helvetica, arial, freesans, clean, sans-serif; font-weight: normal; text-decoration: none;" target="_top">JsonPath</a><span style="background-color: white; color: #333333; font-family: "helvetica" , "arial" , "freesans" , "clean" , sans-serif; font-weight: normal;"> — XPath para JSON.</span></span></li>
</ul>
</h2>
<div>
<br />
Para añadir el módulo de Spring es necesario añadir la siguiente dependencia al archivo pom.xml:<br />
<br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #007700;"><dependency></span>
<span style="color: #007700;"><groupId></span>org.springframework.boot<span style="color: #007700;"></groupId></span>
<span style="color: #007700;"><artifactId></span>spring-boot-starter-test<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"><scope></span>test<span style="color: #007700;"></scope></span>
<span style="color: #007700;"></dependency></span>
</pre>
</div>
<br />
<br />
Una vez añadida la dependencia, se deben crear los paquetes necesarios para contener las clases donde se escribirán los tests. Una forma sencilla de crear los paquetes es apoyándose en el IDE, en mi caso utilicé IntelliJ para configurar este proyecto, lo único que debes hacer es crear el paquete test dentro de la carpeta src/main dentro de tu proyecto y configurar el paquete /test/java como tipo test de los sources de tu aplicación.<br />
<br />
<table cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuFFicENbidLzXIgMHH9xE62hbfkxW_rsMddWbFAw-a3IGYMQR-mVXbpGKTn5wMXmxEXtXNtn5wDPnjeULggUE49v0E2NudBLVoSO4M97Oc-lMZcqv3mDsmyAXadjE237YpkMFV1qj67k/s1600/Spring+Test.PNG" imageanchor="1" style="clear: left; margin-bottom: 1em; margin-left: auto; margin-right: auto;"><img border="0" height="425" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjbuFFicENbidLzXIgMHH9xE62hbfkxW_rsMddWbFAw-a3IGYMQR-mVXbpGKTn5wMXmxEXtXNtn5wDPnjeULggUE49v0E2NudBLVoSO4M97Oc-lMZcqv3mDsmyAXadjE237YpkMFV1qj67k/s640/Spring+Test.PNG" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Estructura del proyecto Spring Boot- Test- Jacoco</td></tr>
</tbody></table>
<br />
<table align="center" cellpadding="0" cellspacing="0" class="tr-caption-container" style="margin-left: auto; margin-right: auto; text-align: center;"><tbody>
<tr><td style="text-align: center;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrK9Tdze9fby56lfHO7upVIIxSp8QWJ9CFpCip5w61yqafo5N1ehakEGdmbzAlp6Pp_ZPlZKvTMr0lM0YAfc1vwFvBdh2V3MUnDlZwd-7sqEI-C2kdxwn-74VAxDBWkzSb-pmmBLWwV55G/s1600/Set+sources.png" imageanchor="1" style="margin-left: auto; margin-right: auto;"><img border="0" height="228" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgrK9Tdze9fby56lfHO7upVIIxSp8QWJ9CFpCip5w61yqafo5N1ehakEGdmbzAlp6Pp_ZPlZKvTMr0lM0YAfc1vwFvBdh2V3MUnDlZwd-7sqEI-C2kdxwn-74VAxDBWkzSb-pmmBLWwV55G/s640/Set+sources.png" width="640" /></a></td></tr>
<tr><td class="tr-caption" style="text-align: center;">Modificar sources de proyecto java en IntelliJ</td></tr>
</tbody></table>
<br />
Después de eso al seleccionar un método o una clase basta con presionar Alt+Enter y seleccionar la opción "create test" lo que generará la estructura de paquetes necesarios en el proyecto.<br />
<br />
Suponiendo que ya implementaste los tests y quieres ejecutarlos completos basta con escribir en la consola a nivel del root(donde se encuentra el pom) de tu proyecto para ejecutar los tests:<br />
<br />
$mvn test<br />
<br />
Pero esto aún no generará ningún reporte, para eso es lo siguiente:<br />
<br />
<h3 style="text-align: center;">
Configurar Jacoco</h3>
Jacoco es una librería de java que nos permite generar reportes de análisis de cobertura de testing y entre sus características están que maneja diferentes tipos de reportes, está escrito en java y además es open source.<br />
<br />
Otra característica importante es que se integra fácilmente con maven pudiendo ser configurado mediante un pluging en el pom.<br />
<br />
Si quieres saber más del proyecto aquí está la <a href="http://www.jacoco.org/jacoco/trunk/doc/index.html" target="_blank">documentación de Jacoco</a>, Para este proyecto en particular utilizaremos la configuración básica.<br />
<br />
Primero se añade la dependencia de Jacoco en el pom.xml:<br />
<br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #007700;"><dependency></span>
<span style="color: #007700;"><groupId></span>org.jacoco<span style="color: #007700;"></groupId></span>
<span style="color: #007700;"><artifactId></span>jacoco-maven-plugin<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"><version></span>0.7.?<span style="color: #007700;"></version></span>
<span style="color: #007700;"></dependency></span>
</pre>
</div>
<br />
La versión depende del momento en el que estés leyendo este tutorial, por lo que debes buscar la versión más actual en el <a href="http://www.jacoco.org/" target="_blank">sito oficial de Jacoco</a>.<br />
<br />
Posterior a esto debes configurar el pluging:<br />
<br />
<br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #007700;"><build></span>
<span style="color: #007700;"><plugins></span>
<span style="color: #007700;"><plugin></span>
<span style="color: #007700;"><groupId></span>org.jacoco<span style="color: #007700;"></groupId></span>
<span style="color: #007700;"><artifactId></span>jacoco-maven-plugin<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"><version></span>0.7.8<span style="color: #007700;"></version></span>
<span style="color: #007700;"><executions></span>
<span style="color: #007700;"><execution></span>
<span style="color: #007700;"><id></span>default-prepare-agent<span style="color: #007700;"></id></span>
<span style="color: #007700;"><goals></span>
<span style="color: #007700;"><goal></span>prepare-agent<span style="color: #007700;"></goal></span>
<span style="color: #007700;"></goals></span>
<span style="color: #007700;"></execution></span>
<span style="color: #007700;"><execution></span>
<span style="color: #007700;"><id></span>default-report<span style="color: #007700;"></id></span>
<span style="color: #007700;"><phase></span>prepare-package<span style="color: #007700;"></phase></span>
<span style="color: #007700;"><goals></span>
<span style="color: #007700;"><goal></span>report<span style="color: #007700;"></goal></span>
<span style="color: #007700;"></goals></span>
<span style="color: #007700;"></execution></span>
<span style="color: #007700;"><execution></span>
<span style="color: #007700;"><id></span>default-check<span style="color: #007700;"></id></span>
<span style="color: #007700;"><goals></span>
<span style="color: #007700;"><goal></span>check<span style="color: #007700;"></goal></span>
<span style="color: #007700;"></goals></span>
<span style="color: #007700;"><configuration></span>
<span style="color: #007700;"><rules></span>
<span style="color: #007700;"><rule</span> <span style="color: #0000cc;">implementation=</span><span style="background-color: #fff0f0;">"org.jacoco.maven.RuleConfiguration"</span><span style="color: #007700;">></span>
<span style="color: #007700;"><element></span>BUNDLE<span style="color: #007700;"></element></span>
<span style="color: #007700;"><limits></span>
<span style="color: #007700;"><limit</span> <span style="color: #0000cc;">implementation=</span><span style="background-color: #fff0f0;">"org.jacoco.report.check.Limit"</span><span style="color: #007700;">></span>
<span style="color: #007700;"><counter></span>COMPLEXITY<span style="color: #007700;"></counter></span>
<span style="color: #007700;"><value></span>COVEREDRATIO<span style="color: #007700;"></value></span>
<span style="color: #007700;"><minimum></span>0.60<span style="color: #007700;"></minimum></span>
<span style="color: #007700;"></limit></span>
<span style="color: #007700;"></limits></span>
<span style="color: #007700;"></rule></span>
<span style="color: #007700;"></rules></span>
<span style="color: #007700;"></configuration></span>
<span style="color: #007700;"></execution></span>
<span style="color: #007700;"></executions></span>
<span style="color: #007700;"></plugin></span>
<span style="color: #007700;"></plugins></span>
<span style="color: #007700;"></build></span>
</pre>
</div>
<br />
Con lo anterior listo, lo único que tienes que hacer es escribir en consola y ejecutar:<br />
<br />
$mvn clean test<br />
<br />
La sentencia anterior generará los files con los resultados de los tests, después ejecutar el pluging de jacoco, lo que generará el reporte con la información de cobertura.<br />
<br />
$mvn jacoco:report<br />
<br />
<br />
**El reporte de cobertura se podrá ver dentro del paquete /src/resources/site/jacoco, basta con abrir el file index.html para ver el reporte<br />
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVbttLVVTshuWTQw61nZYRA5M4eJ-6f4HDDRZn5fQhW3N5i2FjyhcmUKWtHRlDNnVNWqQPxbJKCkIHVNBdIIOHS6KDCyGZACCAc0MXwds1MQQkelVTUHm6y8grimoXl0P8AWeDByzY84N2/s1600/Jacoco-class-report.PNG" imageanchor="1"></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisYIlMcosd88jWGpRLbuUN1OFy-3Azi6waibe0eJB9fmoQ1hdzb7x03M3bB1hjKBXMeqWS7DeAZvF83sEKgl-5vP_1_TAhLy_LS1WqE1y4fLNnXs77FcU-yqLCfbEakka0gtfmQ3BLyF2q/s1600/Jacoco-index-report.PNG" imageanchor="1"><img border="0" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEisYIlMcosd88jWGpRLbuUN1OFy-3Azi6waibe0eJB9fmoQ1hdzb7x03M3bB1hjKBXMeqWS7DeAZvF83sEKgl-5vP_1_TAhLy_LS1WqE1y4fLNnXs77FcU-yqLCfbEakka0gtfmQ3BLyF2q/s640/Jacoco-index-report.PNG" width="640" /></a><img border="0" height="104" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgVbttLVVTshuWTQw61nZYRA5M4eJ-6f4HDDRZn5fQhW3N5i2FjyhcmUKWtHRlDNnVNWqQPxbJKCkIHVNBdIIOHS6KDCyGZACCAc0MXwds1MQQkelVTUHm6y8grimoXl0P8AWeDByzY84N2/s640/Jacoco-class-report.PNG" width="640" /><br />
<br />
El siguiente es el pom.xml del proyecto, como verán no es necesario añadir las dependencias de las librerías de la lista, pues todo se encuentra incluido dentro de spring-boot-starter-test:<br />
<br />
<!-- HTML generated using hilite.me --><br />
<div style="background: #ffffff; border-width: 0.1em 0.1em 0.1em 0.8em; border: solid gray; overflow: auto; padding: 0.2em 0.6em; width: auto;">
<pre style="line-height: 125%; margin: 0;"><span style="color: #557799;"><?xml version="1.0" encoding="UTF-8"?></span>
<span style="color: #007700;"><project</span> <span style="color: #0000cc;">xmlns=</span><span style="background-color: #fff0f0;">"http://maven.apache.org/POM/4.0.0"</span> <span style="color: #0000cc;">xmlns:xsi=</span><span style="background-color: #fff0f0;">"http://www.w3.org/2001/XMLSchema-instance"</span> <span style="color: #0000cc;">xsi:schemaLocation=</span><span style="background-color: #fff0f0;">"http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"</span><span style="color: #007700;">></span>
<span style="color: #007700;"><modelVersion></span>4.0.0<span style="color: #007700;"></modelVersion></span>
<span style="color: #007700;"><parent></span>
<span style="color: #888888;"><!-- Your own application should inherit from spring-boot-starter-parent --></span>
<span style="color: #007700;"><groupId></span>org.springframework.boot<span style="color: #007700;"></groupId></span>
<span style="color: #007700;"><artifactId></span>spring-boot-starter-parent<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"><version></span>1.4.3.RELEASE<span style="color: #007700;"></version></span>
<span style="color: #007700;"></parent></span>
<span style="color: #007700;"><artifactId></span>spring-boot-sample-test<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"><name></span>Spring Boot Test Sample<span style="color: #007700;"></name></span>
<span style="color: #007700;"><description></span>Spring Boot Test Sample<span style="color: #007700;"></description></span>
<span style="color: #007700;"><url></span>http://projects.spring.io/spring-boot/<span style="color: #007700;"></url></span>
<span style="color: #007700;"><organization></span>
<span style="color: #007700;"><name></span>Pivotal Software, Inc.<span style="color: #007700;"></name></span>
<span style="color: #007700;"><url></span>http://www.spring.io<span style="color: #007700;"></url></span>
<span style="color: #007700;"></organization></span>
<span style="color: #007700;"><properties></span>
<span style="color: #007700;"><main.basedir></span>${basedir}/../..<span style="color: #007700;"></main.basedir></span>
<span style="color: #007700;"></properties></span>
<span style="color: #007700;"><dependencies></span>
<span style="color: #007700;"><dependency></span>
<span style="color: #007700;"><groupId></span>org.springframework.boot<span style="color: #007700;"></groupId></span>
<span style="color: #007700;"><artifactId></span>spring-boot-starter-web<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"></dependency></span>
<span style="color: #007700;"><dependency></span>
<span style="color: #007700;"><groupId></span>org.springframework.boot<span style="color: #007700;"></groupId></span>
<span style="color: #007700;"><artifactId></span>spring-boot-starter-data-jpa<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"></dependency></span>
<span style="color: #007700;"><dependency></span>
<span style="color: #007700;"><groupId></span>com.h2database<span style="color: #007700;"></groupId></span>
<span style="color: #007700;"><artifactId></span>h2<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"></dependency></span>
<span style="color: #007700;"><dependency></span>
<span style="color: #007700;"><groupId></span>mysql<span style="color: #007700;"></groupId></span>
<span style="color: #007700;"><artifactId></span>mysql-connector-java<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"></dependency></span>
<span style="color: #007700;"><dependency></span>
<span style="color: #007700;"><groupId></span>org.springframework.boot<span style="color: #007700;"></groupId></span>
<span style="color: #007700;"><artifactId></span>spring-boot-starter-test<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"><scope></span>test<span style="color: #007700;"></scope></span>
<span style="color: #007700;"></dependency></span>
<span style="color: #007700;"><dependency></span>
<span style="color: #007700;"><groupId></span>org.seleniumhq.selenium<span style="color: #007700;"></groupId></span>
<span style="color: #007700;"><artifactId></span>selenium-htmlunit-driver<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"><version></span>2.52.0<span style="color: #007700;"></version></span>
<span style="color: #007700;"><scope></span>test<span style="color: #007700;"></scope></span>
<span style="color: #007700;"></dependency></span>
<span style="color: #007700;"><dependency></span>
<span style="color: #007700;"><groupId></span>net.sourceforge.htmlunit<span style="color: #007700;"></groupId></span>
<span style="color: #007700;"><artifactId></span>htmlunit<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"><scope></span>test<span style="color: #007700;"></scope></span>
<span style="color: #007700;"></dependency></span>
<span style="color: #007700;"><dependency></span>
<span style="color: #007700;"><groupId></span>org.jacoco<span style="color: #007700;"></groupId></span>
<span style="color: #007700;"><artifactId></span>jacoco-maven-plugin<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"><version></span>0.7.8<span style="color: #007700;"></version></span>
<span style="color: #007700;"></dependency></span>
<span style="color: #007700;"></dependencies></span>
<span style="color: #007700;"><build></span>
<span style="color: #007700;"><plugins></span>
<span style="color: #007700;"><plugin></span>
<span style="color: #007700;"><groupId></span>org.jacoco<span style="color: #007700;"></groupId></span>
<span style="color: #007700;"><artifactId></span>jacoco-maven-plugin<span style="color: #007700;"></artifactId></span>
<span style="color: #007700;"><version></span>0.7.8<span style="color: #007700;"></version></span>
<span style="color: #007700;"><executions></span>
<span style="color: #007700;"><execution></span>
<span style="color: #007700;"><id></span>default-prepare-agent<span style="color: #007700;"></id></span>
<span style="color: #007700;"><goals></span>
<span style="color: #007700;"><goal></span>prepare-agent<span style="color: #007700;"></goal></span>
<span style="color: #007700;"></goals></span>
<span style="color: #007700;"></execution></span>
<span style="color: #007700;"><execution></span>
<span style="color: #007700;"><id></span>default-report<span style="color: #007700;"></id></span>
<span style="color: #007700;"><phase></span>prepare-package<span style="color: #007700;"></phase></span>
<span style="color: #007700;"><goals></span>
<span style="color: #007700;"><goal></span>report<span style="color: #007700;"></goal></span>
<span style="color: #007700;"></goals></span>
<span style="color: #007700;"></execution></span>
<span style="color: #007700;"><execution></span>
<span style="color: #007700;"><id></span>default-check<span style="color: #007700;"></id></span>
<span style="color: #007700;"><goals></span>
<span style="color: #007700;"><goal></span>check<span style="color: #007700;"></goal></span>
<span style="color: #007700;"></goals></span>
<span style="color: #007700;"><configuration></span>
<span style="color: #007700;"><rules></span>
<span style="color: #888888;"><!-- implementation is needed only for Maven 2 --></span>
<span style="color: #007700;"><rule</span> <span style="color: #0000cc;">implementation=</span><span style="background-color: #fff0f0;">"org.jacoco.maven.RuleConfiguration"</span><span style="color: #007700;">></span>
<span style="color: #007700;"><element></span>BUNDLE<span style="color: #007700;"></element></span>
<span style="color: #007700;"><limits></span>
<span style="color: #888888;"><!-- implementation is needed only for Maven 2 --></span>
<span style="color: #007700;"><limit</span> <span style="color: #0000cc;">implementation=</span><span style="background-color: #fff0f0;">"org.jacoco.report.check.Limit"</span><span style="color: #007700;">></span>
<span style="color: #007700;"><counter></span>COMPLEXITY<span style="color: #007700;"></counter></span>
<span style="color: #007700;"><value></span>COVEREDRATIO<span style="color: #007700;"></value></span>
<span style="color: #007700;"><minimum></span>0.60<span style="color: #007700;"></minimum></span>
<span style="color: #007700;"></limit></span>
<span style="color: #007700;"></limits></span>
<span style="color: #007700;"></rule></span>
<span style="color: #007700;"></rules></span>
<span style="color: #007700;"></configuration></span>
<span style="color: #007700;"></execution></span>
<span style="color: #007700;"></executions></span>
<span style="color: #007700;"></plugin></span>
<span style="color: #007700;"></plugins></span>
<span style="color: #007700;"></build></span>
<span style="color: #007700;"></project></span>
</pre>
</div>
<br />
El proyecto que se está probando en este caso se trata de una aplicación básica que expone un servicio REST y que accede a una base de datos configurada con MongoDB. Dado que la finalidad del proyecto es solo ejecutar los test y generar los reportes de Jacoco, no es necesario tener la base de datos instalada, ni configurar ningún servidor.<br />
<br />
<br />
El código probado, proviene de los ejemplos obtenidos de de spring-boot. Por lo que es código accesible para todos.<br />
<br />
https://gitlab.com/curiotechnology/spring-boot-sample-test<br />
<br />
<br />
<br />
<br /></div>
</div>
Alfredohttp://www.blogger.com/profile/04582406212707215212noreply@blogger.com0tag:blogger.com,1999:blog-4594083802314721454.post-53826008777982759182016-10-24T07:35:00.002-07:002016-10-24T07:37:47.549-07:00¿Para qué se usa la clase "java.lang.Class" en Java? java.lang.Class es una de las clases más importantes pero ignoradas por los desarrolladores Java. Es muy importante en el sentido de que provee muchos métodos de utilidad. Por ejemplo los métodos <i>getClass()</i>, <i>forName()</i> que son usados para encontrar y cargar una clase, quizá tu las has usado para cargar los drivers de Oracle o MySQL.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-GNRiC-b8RfG32mwvXRgcM-_LwjT51uw9mrv6vZzSjv1lCrKgvjjpcjGeFtbMrKvGyxh8U29sWY5ItAhzHxSfW3a_41cmj-kgHRA0hZmq7Xz376Yh2blu7ObR6ONJ1rwrNFTEhBCzZAf0/s1600/core-java.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh-GNRiC-b8RfG32mwvXRgcM-_LwjT51uw9mrv6vZzSjv1lCrKgvjjpcjGeFtbMrKvGyxh8U29sWY5ItAhzHxSfW3a_41cmj-kgHRA0hZmq7Xz376Yh2blu7ObR6ONJ1rwrNFTEhBCzZAf0/s320/core-java.jpg" width="320" /></a></div>
<br />
<br />
También provee métodos como Class.newInstance() la cual es el corazón de reflection y te permite crear una instancia de una clase sin utilizar el operador new(). La clase no tiene constructores públicos y sus instancias son creadas por la JVM cuando la clase es cargada. El objeto de clase tipo Class también es usado para representar clases, enumeraciones, interfaces, y anotaciones corriendo en una aplicación Java. Los tipos primitivos como byte, short, char, int, float, double, boolean así como la palabra reservada void también son representados como instancias de Class.<br />
<br />
Puedes obtener la instancia correspondiente a <i>Class </i>usando la literal class, por ejemplo int.class, float.class o boolean.class. También es usada para representar una instancia de un arreglo en Java. Todos los arreglos con el mismo tipo y la misma dimensión comparten la misma instancia de la clase Class.<br />
<br />
Otro uso de <i>java.lang.Class</i> es mientras se implementa el método <i>equals()</i> para verificar si dos objetos son del mismo tipo o no.<br />
<br />
<br />
<h3>
java.lang.Class en Java</h3>
<br />
Cada vez que la JVM crea un objeto, también se crea un objeto de la clase java.lang.Class que describe el tipo de objeto. Todas las instancias del la misma clase comparten el mismo objecto de la clase Class y así puedes obtener el objecto Class llamando el método <i>getClass() </i>de cualquier objeto. Además, este método es heredado de la clase java.lang.Object.<br />
<br />
Imagina que tu creas dos instancias de una clase llamada Persona por ejemplo<br />
<br />
<textarea cols="80" rows="15" style="height: 313px; margin: 0px; width: 623px;">Persona A = new Persona();
Persona B = new Persona();
if(A.getClass() = = B.getClass()){
System.out.println("A y B son instancias de la misma clase");
}else{
System.out.println("A y B son instancias de diferente clase");
}
</textarea><br />
<br />
En este caso, se imprimirá "A y B son instancias de la misma clase" porque ambas son instancias de la clase Persona.<br />
<br />
Necesitamos <i>forName()</i> y<i> newInstance()</i> porque varias veces no sabemos el nombre de la clase que hay que inicializar mientras escribimos el código, podría ser que estamos obteniéndolo desde archivos de configuración, bases de datos, red o desde algún flujo de información de una aplicación Java externa.<br />
<br />
Es por eso que llamamos de forma reflectiva la creación del objeto, la cual es una de las más poderosas características en Java y que es utilizada por muchos frameworks, por ejemplo Spring, Struts utilizan Java reflection<br />
<br />
<br />
<span style="background-color: white; color: #666666; font-family: "open sans" , sans-serif; font-size: 14px;">***El Artículo fue obtenido de </span><a href="http://javarevisited.blogspot.cl/" style="background-color: white; color: #3589c3; font-family: "Open Sans", sans-serif; font-size: 14px; margin: 0px; outline: none; padding: 0px; text-decoration: none;" target="_blank">JavaRevisited </a><span style="background-color: white; color: #666666; font-family: "open sans" , sans-serif; font-size: 14px;">y fue modificado ligeramente para su traducción. Para revisar el contenido original dar clic </span><a href="http://javarevisited.blogspot.cl/2010/10/what-is-use-of-class-javalangclass-why.html" style="background-color: white; color: #3589c3; font-family: "Open Sans", sans-serif; font-size: 14px; margin: 0px; outline: none; padding: 0px; text-decoration: none;" target="_blank">aquí</a><span style="background-color: white; color: #666666; font-family: "open sans" , sans-serif; font-size: 14px;">.</span>Alfredohttp://www.blogger.com/profile/04582406212707215212noreply@blogger.com0tag:blogger.com,1999:blog-4594083802314721454.post-56723005332713587992016-10-21T09:10:00.002-07:002016-10-21T09:10:12.314-07:00¿Por qué String es Inmutable en JAVA?El tipo de dato String es Inmutable(es decir que no puede ser modificada) porque cualquier objeto String creado es almacenado en un espacio de memoria llamado String pool. Y ya que las literales tipo String son compartidas entre múltiples clientes siempre existe un riesgo donde alguna de las acciones de un cliente puede afectar a otro.<br />
Por ejemplo, si uno de los clientes cambia el valor del String "Test" a "TEST", el resto de los clientes también verían ese valor como se explicó anteriormente.<br />
<br />
Debido a que mantener en memoria los objetos de tipo String es importante por razones de performance, este riesgo se evita haciendo la clase String Inmutable. Al mismo tiempo, String es de tipo final así nadie puede comprometer la inmutabilidad ya sea extendiendo o sobreescribiendo sus comportamientos. Otra razón por la que la clase String es inmutable puede ser debido al uso de HasdMap.<br />
<br />
Ya que las variables de tipo String son muy populares como llaves al usar HashMap, es importante que estas sean inmutables de esta manera esas llaves pueden devolver el valor del objeto que se ha almacenado en el HashMap. Ya que HashMap trabaja bajo el principio de Hashing, el cual requiere que el valor se mantenga para funcionar adecuadamente. Un tipo String Mutable, produciría dos diferentes hashcodes al tiempo de la inserción y retorno si el contenido de los Strings fuera modificado después de la inserción, lo que llevaría potencialmente a la pérdida de los objetos valor en el Map.<br />
<br />
Si eres un fan del cricket, entonces serás capaz de relacionar mi siguiente frase. El string es VVS Laxman de Java, o sea una clase muy muy especial. No he visto un solo programa de Java que sea escrito sin usar String, Esa es la razón por la cual un sólido conocimiento de String es muy importante para un Desarrollador Java.<br />
<br />
La importancia y popularidad de String como tipo de dato, objeto de transferencia y mediador ha lo ha hecho tan popular en entrevistas de Java. ¿Por qué String es inmutable en Java? es una de las preguntas más frecuentemente utilizadas en las entrevistas, lo que inicia con una discusión sobre, qué es String, cómo es la String en Java diferente de String en C y C++, y luego cambiando hacia qué es un objeto inmutable en Java, cuáles son los beneficios de los objetos inmutables, por qué los usarías y en cuáles escenarios los usarías. Entre estas preguntas algunas veces se pregunta, ¿Por qué String es final en Java?.<br />
<br />
En una nota similar, si tu te estás preparando para hacer entrevistas sobre Java, te recomiendo que eches un vistazo al libro Java Programming Intervied exposed, un excelente recurso para programadores Java Senior y nivel medio. Ya que contiene preguntas de todos los temas más importantes en Java como multithreading, collections, GC, JVM internals y frameworks como Spring y Hibernate,<br />
<br />
<br />
<h4 style="text-align: center;">
<b>¿Por qué String es Final en Java?</b></h4>
<br />
Como dije, puede haber múltiples posibles respuestas a esta pregunta, y el único diseñador de esta clase puede responderla con seguridad. Esperaba alguna pista en el libro de Joshua Bloch's Effective Java, pero el tampoco lo mencionó. Yo creo en las siguientes dos razones que tienen mucho sentido de por qué String es una clase hecha Inmutable o fina en Java:<br />
<br />
1) Imagina el String pool sin hacer String inmutable, no es posible del todo porque en el caso de que un objeto string contenido en el pool esté referenciado a diferentes referencias de variable, entonces si alguna de ellas cambia el valor, entonces las otras de manera automática se ven affectadas.<br />
<br />
Digamos<br />
<br />
String A = "Test"<br />
String B = "Test"<br />
<br />
Ahora la llamada a String B, "Test".toUpperCase() cambiará el mismo objeto a "TEST". entonces A también será "TEST" lo que no es deseable. Aquí hay un diagrama que muestra como las literales String son creadas en el espacio de memoria y el String literal pool.<br />
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHe1ELsTGpW-MBaLt3jBxIETnF4DbkmEHiUN1FVTpsFTStiC0xnkXjSUc0E8OnYpStNXnsMfDO8Lb4MWCGUTr-Rt-A5CniLDg6xawxK1rON4xHVI-MlkN0k78qGNhJa0Y33GPXiftfix4e/s1600/String+in+Java+is+Immutable.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img alt="Why String is Immutable or Final in Java" border="0" height="248" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgHe1ELsTGpW-MBaLt3jBxIETnF4DbkmEHiUN1FVTpsFTStiC0xnkXjSUc0E8OnYpStNXnsMfDO8Lb4MWCGUTr-Rt-A5CniLDg6xawxK1rON4xHVI-MlkN0k78qGNhJa0Y33GPXiftfix4e/s400/String+in+Java+is+Immutable.jpg" title="" width="400" /></a></div>
<br />
<br />
2)String ha sido ampliamente utilizado como parámetro para muchas clases de Java, por ejemplo para abrir conexiones de red, tú puedes pasar el hostname y el número de puerto como String, puedes pasar la URL de la base de datos para abrir una conexión o puedes <a href="http://javarevisited.blogspot.cl/2012/07/read-file-line-by-line-java-example-scanner.html" target="_blank">abrir un archivo en Java</a> pasando el nombre del archivo como argumento a las clases I/O de Java.<br />
<br />
En el caso de que String no fuera inmutable, esta sería una seria amenaza a la seguridad, quiero decir que alguien podría acceder a cualquier archivo para el cual el tiene autorización y entonces cambiar el nombre del archivo ya sea deliberada o accidentalmente y obtener acceso a ese archivo. Debido a la inmutabilidad, no necesitas preocuparte de ese tipo de amenazas. Esta razón también responde a ¿Por qué String es final en Java? Haciendo final a String, el diseñador de Java se asegura que nadie puede sobreescribir ningún comportamiento en la clase String.<br />
<br />
3) Ya que String es inmutable puede ser compartido de forma segura entre varios hilos lo cual es muy importante en la programación multihilos, y para evitar cualquier problema de sincronización en Java. Inmutabilidad, también hace que las instancias String sean thread-safe en Java, eso significa que no necesitas sincronizar las operaciones con String externamente. Otro punto importante sobre String es la <a href="http://javarevisited.blogspot.cl/2011/10/how-substring-in-java-works.html" target="_blank">pérdida de memoria por Substring</a>, el cual no es un problema relacionado a los hilos, pero es algo de lo que hay que tener cuidado.<br />
<br />
4) Otra razón de ¿Por qué String es inmutable en Java? es permitir a String mantener en cache su hashcode, siendo inmutable String en Java mantiene su hashcode en cache, y esto no se calcula cada vez que llamamos al método hashcode de String, lo que lo hace muy rápido de usar como llave en el hashmap de Java. Esto es también sugerido por Jaroslav Sedlacek en los comentarios. En resumen debido a que String es inmutable, nadie puede cambiar su contenido una vez creado lo cual garantiza que el hashcode sea el mismo en diferentes invocaciones.<br />
<br />
5) Otra buena razón de Por qué es String Inmutable en Java es la sugerida por Dan Bergh Johnsson en los comentarios: La razón más importante es que es usada por el mecanismo de carga de clases, y de ahí que<br />
<br />
***El Artículo fue obtenido de <a href="http://javarevisited.blogspot.cl/" target="_blank">JavaRevisited </a>y fue modificado ligeramente para su traducción. Para revisar el contenido original dar clic <a href="http://javarevisited.blogspot.cl/2010/10/why-string-is-immutable-or-final-in-java.html" target="_blank">aquí</a>.<br />
<br />
<br />
<br />Alfredohttp://www.blogger.com/profile/04582406212707215212noreply@blogger.com0tag:blogger.com,1999:blog-4594083802314721454.post-23848361114424720432015-03-01T15:20:00.004-08:002016-10-21T08:45:50.993-07:00Reportes dinámicos con PrimeFaces y JasperReports [Java]<div style="text-align: justify;">
Qué tal, bienvenido a esta nueva publicación, el día de hoy les mostraré como crear reportes dinámicos con Primefaces y JasperReports.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La historia comienza con una necesidad que tenía para mis proyectos de aplicación web, en los cuales tenía que mostrar reportes en ciertas secciones de una pantalla que constantemente cambiarían de información, es decir dependían de ciertos valores para su generación.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La idea inicial era que pudiera ser capaz de mostrar un pdf que a lo largo del ciclo de vida de la aplicación siempre estaría cambiando de forma, por lo que se me vino a la cabeza que podía generar un archivo .pdf y después mostrarlo en pantalla, pero, ¿cómo podría hacer esto?.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Después de investigar un poco me di cuenta que PrimeFaces nos proporciona un componente para mostrar todo tipo de contenidos entre estos un pdf, hablo del Componente <a href="http://www.primefaces.org/showcase/ui/multimedia/media.xhtml">Media</a> que hablando en términos más técnicos de programación hace uso de un objeto StreamedContent para renderizar contenidos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ahora, la idea había evolucionado, si con el método <i>exportReportToPdfStream</i> de <i>JasperExportManager </i>puedo guardar el pdf generado en un <i>OutputStream </i>entonces este lo podría utilizar para crear un <i>StreamedContent </i>y aquí la prueba:</div>
<div style="text-align: justify;">
<br /></div>
<b>Country.java</b><br />
<textarea cols="80" rows="15">package mx.edu.itshuatusco.model;
import java.io.Serializable;
/**
*
* @author Jesús Alberto Sánchez Tecalco
*/
public class Country implements Serializable {
private String id;
private String name;
public Country() {
}
public Country(String id, String name) {
this.id = id;
this.name = name;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}</textarea>
<br />
<br />
<div style="text-align: justify;">
Esta es la clase que utilizaré para mantener la información del reporte, el archivo .jasper ya te imaginarás que el diseño solo consta de 2 columnas id y name.</div>
<br />
<b>report.xhtml
</b><textarea cols="80" rows="15"><p:panel header="Reporte Test">
<h:form id="frm-home">
<h:panelGrid columns="2">
<h:outputText value="Filtro 1" />
<p:inputText value="#{reportBean.number}"/>
<p:commandButton value="Generar Reporte"
update="@form"
actionListener="#{reportBean.generateReport}" />
<p:commandButton value="Descargar"
rendered="#{reportBean.media ne null}"
ajax="false"
actionListener="#{reportBean.downloadFile}" />
</h:panelGrid>
<div class="column-center">
<p:media cache="false" rendered="#{reportBean.media ne null}" width="900" height="600" value="#{reportBean.media}" player="pdf"/>
</div>
</h:form>
</p:panel></textarea>
<br />
<br />
<div style="text-align: justify;">
Lo siento, solo mostraré lo necesario de este archivo, se conforma de un formulario que contiene un inputText, un commandButton que llama al método <i>generateReport,</i> el commandButton Descargar que llama al método <i>downloadFile</i>, el componente Media y algunas condiciones de renderizado.</div>
<div style="text-align: justify;">
Nota: el componente media debe tener en false la propiedad cache, de otra forma te dará un buen dolor de cabeza.</div>
<br />
<b>JasperReportUtil.java</b><br />
<textarea cols="80" rows="15">package mx.edu.itshuatusco.controller.util;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.util.List;
import java.util.Map;
import net.sf.jasperreports.engine.JasperExportManager;
import net.sf.jasperreports.engine.JasperFillManager;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.engine.data.JRBeanCollectionDataSource;
import org.primefaces.model.DefaultStreamedContent;
import org.primefaces.model.StreamedContent;
/**
*
* @author Jesús Alberto Sánchez Tecalco
*/
public class JasperReportUtil {
public static ByteArrayOutputStream getOutputStreamFromReport(List list, Map map, String pathJasper) throws Exception {
ByteArrayOutputStream os = new ByteArrayOutputStream();
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
JasperPrint jp = JasperFillManager.fillReport(pathJasper, map, dataSource);
JasperExportManager.exportReportToPdfStream(jp, os);
os.flush();
os.close();
return os;
}
public static StreamedContent getStreamContentFromOutputStream(ByteArrayOutputStream os, String contentType, String nameFile) throws Exception {
StreamedContent file = null;
InputStream is = new ByteArrayInputStream(os.toByteArray());
file = new DefaultStreamedContent(is, contentType, nameFile);
return file;
}
public static StreamedContent getStreamContentReport(List list, Map map, String pathJasper, String nameFilePdf) throws Exception {
StreamedContent pdf = null;
JRBeanCollectionDataSource dataSource = new JRBeanCollectionDataSource(list);
JasperPrint jp = JasperFillManager.fillReport(pathJasper, map, dataSource);
ByteArrayOutputStream os = new ByteArrayOutputStream();
JasperExportManager.exportReportToPdfStream(jp, os);
os.flush();
os.close();
InputStream is = new ByteArrayInputStream(os.toByteArray());
pdf = new DefaultStreamedContent(is, "application/pdf", nameFilePdf);
return pdf;
}
}</textarea>
<br />
<br />
<div style="text-align: justify;">
La clase de utilería JasperReportUtil contiene 3 métodos:</div>
<div style="text-align: justify;">
<br /></div>
<ul>
<li style="text-align: justify;"><i>getOutputStreamFromReport </i>que retorna un ByteArrayOutputStream a partir de la lista de elementos que deseas renderizar en tu reporte, algún mapa con parámetros y el path del archivo .jasper,</li>
<li style="text-align: justify;">getStreamContentFromOutputStream que retorna un StreamedContent a partir de un objeto ByteArrayOutputStream, una cadena con el tipo de contenido a generar y el nombre del archivo. </li>
<li style="text-align: justify;"><i>getStreamContentReport </i>este método es el camino corto (fusiona los 2 métodos anteriores [lo pensaba utilizar en un caso especial, no necesito explicarlo]).</li>
</ul>
<div>
<b><br /></b>
<b>ReportTestController.java</b></div>
<textarea cols="80" rows="15">/*
* 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.arsis.corp.controller;
import mx.edu.itshuatusco.controller.util.JasperReportUtil;
import mx.edu.itshuatusco.model.Country;
import java.io.ByteArrayOutputStream;
import java.io.OutputStream;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Calendar;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import javax.enterprise.context.SessionScoped;
import javax.faces.context.FacesContext;
import javax.inject.Named;
import javax.servlet.http.HttpServletResponse;
import org.primefaces.model.StreamedContent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
/**
*
* @author Jesús Alberto Sánchez Tecalco
*/
@SessionScoped
@Named(value = "reportBean")
public class ReportTestController implements Serializable {
private static final Logger log = LoggerFactory.getLogger(ReportTestController.class);
private StreamedContent media;
private ByteArrayOutputStream outputStream;
private String number;
public void generateReport() {
try {
List<country> countries = getListCountriesDummy();
Map<String, Object> map = new HashMap<String, Object>();
map.put("fecha", Calendar.getInstance().getTime().toString());
outputStream = JasperReportUtil.getOutputStreamFromReport(countries, map, getPathFileJasper());
media = JasperReportUtil.getStreamContentFromOutputStream(outputStream, "application/pdf", getNameFilePdf());
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
public String getPathFileJasper() {
return getFullPathResource("/report/paises.jasper");
}
public String getNameFilePdf() {
return "reporte_dummy.pdf";
}
public void downloadFile() {
try {
FacesContext facesContext = FacesContext.getCurrentInstance();
HttpServletResponse response = (HttpServletResponse) facesContext.getExternalContext().getResponse();
response.reset();
response.setContentType("application/pdf");
response.setHeader("Content-disposition", "attachment; filename=" + getNameFilePdf());
OutputStream output = response.getOutputStream();
output.write(outputStream.toByteArray());
output.close();
facesContext.responseComplete();
} catch (Exception e) {
log.error(e.getMessage(), e);
}
}
private List<country> getListCountriesDummy() {
List<country> countries = new ArrayList<country>();
int max = Integer.parseInt(number);
for (int i = 1; i <= max; i++) {
countries.add(new Country("ID" + i, "Pais " + i));
}
return countries;
}
public StreamedContent getMedia() {
return media;
}
public void setMedia(StreamedContent media) {
this.media = media;
}
public String getNumber() {
return number;
}
public void setNumber(String number) {
this.number = number;
}
}
</textarea>
<br />
<br />
<div style="text-align: justify;">
De esta clase seré breve, los 2 métodos que se llaman son generateReport y downloadFile.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El primero genera datos dummys y haciendo uso de la clase de utilería antes mencionada genera el StreamedContent para que el componente media lo utilice y muestre el pdf.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El segundo método permite descargar el archivo pdf, observar que PrimeFaces ya provee un componente para descargar pero si intentas guardar el pdf o utilizar el componente FileDownload el archivo se descargar corrupto, desconozco la razón.</div>
<div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Una captura de lo que obtienes:</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaErNh1CThQGBwsmMpTyM7v_ARJkfABT3fuzEbcZHK5GiReKkSI03n_yrI7d4wCDY1Fq-aOwybA1-0hFeBsuHOrhbr05plobmv4J5F9Boo7xFbLX2mexUTWuI9VLEc4UNC1oK5s08AR-E/s1600/Captura.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="162" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhaErNh1CThQGBwsmMpTyM7v_ARJkfABT3fuzEbcZHK5GiReKkSI03n_yrI7d4wCDY1Fq-aOwybA1-0hFeBsuHOrhbr05plobmv4J5F9Boo7xFbLX2mexUTWuI9VLEc4UNC1oK5s08AR-E/s1600/Captura.png" width="320" /></a></div>
<br /></div>
Jesús Alberto Sánchez Tecalcohttp://www.blogger.com/profile/05416570182548174207noreply@blogger.com9tag:blogger.com,1999:blog-4594083802314721454.post-91723496878546326872015-02-02T15:40:00.001-08:002015-02-02T15:42:09.316-08:00CRUD con Web SQL [JavaScript]<div style="text-align: justify;">
¿Qué tal amigos? En la publicación de hoy les mostraré como hacer una aplicación sencilla que permita almacenar en una tablita registros de Integrandes.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El tema es: ¿qué tecnología usar para guardar la información?. Tenemos distintas opciones:</div>
<ul>
<li style="text-align: justify;">Realizar una conexión a una base de datos relacional (según tu gusto), a MySQL, PostgreSQL, etc.</li>
<li style="text-align: justify;">Usar una base de datos con documentos, con mayor popularidad tenemos a MongoDB.</li>
<li style="text-align: justify;">Utilizar archivos para almacenar el contenido.</li>
<li style="text-align: justify;">Etcétera.</li>
</ul>
<div style="text-align: justify;">
<br />
Me agrada mucho la primera opción, porque es algo que manejo mucho y sería sencillo de realizar, pero requiero de una tecnología del lado del servidor que me apoye (PHP, Java, Python) por lo que en esta ocasión me abstengo de comenzar...</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El segundo caso si utilizo base de datos documentales me llevaría demasiado tiempo hacer algo bien estructurado debido a mi falta de experiencia.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El tercer caso en un caso particular ni me agrada, así que ni lo menciono <strike>jajaja</strike>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
¿Pero todo lo anterior a que viene? Sucede que en esta ocasión me preparo para generar una pequeña aplicación personal y requiero almacenar información, para ser exactos usaré PhoneGap [Ya sabrán por donde va este asunto]. Leyendo por aquí y por allá llegue a conocer Web SQL.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Web SQL es una base de datos que podemos usar de forma nativa desde nuestro navegador, esto significa que para mi caso personal no requiero guardar o tener un concentrado de información de varios nodos en una misma base de datos, necesito una base de datos para uso "local". Web SQL si lo vemos de esta forma trabaja del lado del cliente, no requiero utilizar un "servidor". Web SQL se apoya [o vive] desde JavaScript, por lo tanto para nuestro ejemplo de hoy no necesitas mas que un navegador y un bloc de notas.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
A continuación muestro un pequeño ejemplo de como guardar, actualizar, eliminar y consultar registros de una tabla usando HTML + JavaScript + Web SQL. El objetivo del Post como es costumbre como los demás no es explicar la API de Web SQL [solo es un pequeño ejemplito para iluminar tu camino] por lo que si deseas conocer detalles da clic al siguiente <a href="http://www.w3.org/TR/webdatabase/" target="_blank">link</a>.</div>
<div style="text-align: justify;">
<br /></div>
<div>
<b>index.html</b><br />
<textarea cols="80" rows="15"><!DOCTYPE html>
<html>
<head>
<title>Aprendiendo Web SQL</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width">
<script src="js/libs/jquery/jquery.js" type="text/javascript"></script>
<script src="js/index.js" type="text/javascript"></script>
</head>
<body>
<div>
<h2>Integrantes:</h2>
<form><ul id="li-integrantes"></ul>
</form>
</div>
<div>
<h2>Registro</h2>
<form>
<label for="txt-id">Id</label>
<input id="txt-id" type="text" readonly/><br />
<label for="txt-nombres">Nombre</label>
<input id="txt-nombres" type="text"/><br />
<label for="txt-apellidos">Apellidos</label>
<input id="txt-apellidos" type="text"/><br />
<button id="btn-guardar" type="button">Guardar</button>
<button type="reset">Limpiar</button>
</form>
</div>
</body>
</html></textarea>
</div>
<div>
<br /></div>
<div>
<div style="text-align: justify;">
Como te darás cuenta solo hago uso de 2 archivos de JavaScript [Ni siquiera uso CSS jeje] para el funcionamiento de nuestra aplicación, un archivo index.js y el famoso jquery.js. jQuery básicamente lo uso para modificar el DOM a mi gusto, si deseas en tu caso puedes usar puro JavaScript y te quedará más limpio y liviano tu código.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El HTML se compone de 2 divisiones o secciones, la primera contiene una lista sin elementos la cual usaremos para mostrar a nuestros Integrantes, para ser exactos sus nombres, apellidos y sus respectivos botones de editar y eliminar. La segunda división es exclusiva para el formulario de creación y edición. El formulario se compone de 3 elementos para visualizar e ingresar información: ID, nombres y apellidos de los cuales ID solo es para lectura y no permite ser editado.</div>
<br />
<b>index.js</b></div>
<textarea cols="80" rows="15">var db = openDatabase('app', '1.0', 'BD de test', 100 * 1024);
$(document).ready(function() {
console.info("Iniciando...");
init();
listarIntegrantes();
console.info("Carga finalizada...");
////////////////////////////////////////////////////////////////////
////////////////////////////Funciones jquery///////////////////////
////////////////////////////////////////////////////////////////////
$('#btn-guardar').click(function() {
var txtId = $('#txt-id');
var txtNombres = $('#txt-nombres');
var txtApellidos = $('#txt-apellidos');
if (txtNombres.val() === '' || txtApellidos.val() === '') {
alert("Los campos nombres y apellidos son requeridos...");
return;
}
var integrante = Object();
integrante.nombres = txtNombres.val();
integrante.apellidos = txtApellidos.val();
if (txtId.val() === '') { //Lo guarda
integrante.id = new Date().getTime();
guardarIntegrante(integrante);
} else { //Lo actualiza
integrante.id = parseInt(txtId.val());
actualizarIntegrante(integrante);
}
listarIntegrantes();
txtNombres.val(null);
txtApellidos.val(null);
txtId.val(null);
});
$('#li-integrantes').on("click", ".btn-editar", function() {
var idIntegrante = $(this).data("id");
consultarIntegrante(idIntegrante);
});
$('#li-integrantes').on("click", ".btn-eliminar", function() {
var idIntegrante = $(this).data("id");
eliminarIntegrante(idIntegrante);
listarIntegrantes();
});
});
////////////////////////////////////////////////////////////////////
///////////////////////funciones para el CRUd///////////////////////
////////////////////////////////////////////////////////////////////
function init() {
db.transaction(function(tx) {
tx.executeSql('create table if not exists INTEGRANTE(ID, NOMBRES, APELLIDOS)');
}, error, exito);
}
function listarIntegrantes() {
db.readTransaction(function(t) {
t.executeSql('SELECT ID, NOMBRES, APELLIDOS FROM INTEGRANTE', [], function(t, rs) {
if (rs.rows.length > 0) {
var lisHtml = '';
for (var i = 0; i < rs.rows.length; i++) {
var integrante = rs.rows.item(i);
var id = integrante.ID;
lisHtml += '<li>' + integrante.NOMBRES + ' ' + integrante.APELLIDOS
+ '<button class="btn-editar" type="button" data-id="' + id + '">Editar</button>'
+ '<button class="btn-eliminar" type="button" data-id="' + id + '">Eliminar</Eliminar></li>
';
}
$('#li-integrantes').html(lisHtml);
}
}, error);
});
}
function guardarIntegrante(integrante) {
db.transaction(function(tx) {
tx.executeSql('INSERT INTO INTEGRANTE(ID, NOMBRES, APELLIDOS) VALUES(?, ?, ?)', [integrante.id, integrante.nombres, integrante.apellidos]);
}, error, function() {
alert("El integrante ha sido guardado con éxito");
});
}
function consultarIntegrante(idIntegrante) {
db.readTransaction(function(t) {
t.executeSql('SELECT ID, NOMBRES, APELLIDOS FROM INTEGRANTE WHERE ID = ?', [idIntegrante], function(t, rs) {
if (rs.rows.length > 0) {
var integrante = new Object();
integrante.nombres = rs.rows.item(0).NOMBRES;
integrante.apellidos = rs.rows.item(0).APELLIDOS;
$('#txt-id').val(rs.rows.item(0).ID);
$('#txt-nombres').val(rs.rows.item(0).NOMBRES);
$('#txt-apellidos').val(rs.rows.item(0).APELLIDOS);
}
}, error);
});
}
function actualizarIntegrante(integrante) {
db.transaction(function(tx) {
tx.executeSql('UPDATE INTEGRANTE SET NOMBRES = ?, APELLIDOS = ? WHERE ID = ?', [integrante.nombres, integrante.apellidos, integrante.id]);
}, error, function() {
alert("El integrante ha sido actualizado con éxito");
});
}
function eliminarIntegrante(idIntegrante) {
db.transaction(function(tx) {
tx.executeSql('DELETE FROM INTEGRANTE WHERE ID = ?', [idIntegrante]);
}, error, function() {
alert("El integrante ha sido eliminado con éxito");
});
}
////////////////////////////////////////////////////////////////////
////////////////////////Funciones de logueo////////////////////
////////////////////////////////////////////////////////////////////
var error = function(err) {
console.error(err);
};
var exito = function() {
console.info("Tabla creada...");
};</textarea>
<br />
<br />
<br />
<div>
Del archivo anterior lo más relevante es lo siguiente:<br />
<br />
<ul>
<li style="text-align: justify;">Para abrir conexión con una base de datos usamos <i>openDatabase() </i>que retorna un objeto con el cual podemos hacer lo que necesitemos. Los valores que recibe son: un nombre, una versión, descripción y el tamaño.</li>
<li style="text-align: justify;">Con la función <i>transaction() </i>generamos una transacción en la cual podemos incluir un grupo de instrucciones como creación de tablas, altas, actualizaciones, ediciones, etc. Claro está que no lo hace sola, utiliza la función <i>executeSql() </i>del objeto que retorna <i>transaction().</i></li>
<li style="text-align: justify;">Para usar <i style="font-style: italic;">executeSql() </i>hay muchas formas, un caso es para cuando se desea ejecutar intrucciones SQL sin parámetros (como el de la función <i>init()</i>) que recibe: instruncción sql, función de error, función de éxito. Para el caso de la función <i>listarIntegrantes() </i>son 4 los parámetros recibidos: instrucción sql, una lista con parámetros que serán remplazados en la instrucción sql [se remplazan por los "?"], función de éxito, función de error.</li>
<li style="text-align: justify;">Algo interesante para tomar nota es que la función <i>readTransaction() </i>esta destinada para incluir instrucciones de consulta, aunque en ningún momento dudo que dejará de funcionar si se usan otro tipo de instrucciones dentro de ella.</li>
</ul>
<div>
<div style="text-align: justify;">
Para terminar, como breve conclusión si lo que necesitas es guardar información en una aplicación Web de forma local que sea persistente Web SQL es una buena solución, para mi caso este señor se lleva bien con PhoneGap así que en lugar de usar un SQLite ya saben que usar.</div>
</div>
<div>
<div style="text-align: justify;">
<br /></div>
</div>
<div>
Una captura de la aplicación:</div>
<div>
<br /></div>
<div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGNONPOJraogzpqtj96HuX5yCN4BXqRuaUKbqUX6nQ3mlz_vTyJQFt7Ht0xy-hn0ChiPcty9AoiUNZha8jU12Hrs_62lBj-R1uBlK4rhsbjghrQK3NJhG6hf8iOU8xil_9snPJWcHi5CI/s1600/WebSQL.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhGNONPOJraogzpqtj96HuX5yCN4BXqRuaUKbqUX6nQ3mlz_vTyJQFt7Ht0xy-hn0ChiPcty9AoiUNZha8jU12Hrs_62lBj-R1uBlK4rhsbjghrQK3NJhG6hf8iOU8xil_9snPJWcHi5CI/s1600/WebSQL.png" height="179" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<blockquote class="tr_bq" style="clear: both; text-align: justify;">
Es una pena que cada año que pasa mi forma de redactar empeora, aún así espero les sea de utilidad esta publicación...</blockquote>
<div style="text-align: justify;">
Nos vemos hasta la próxima entrega :D donde posiblemente les muestre como generar reportes totalmente dinámicos con PrimeFaces y JasperReports. </div>
<br />
Nota: Firefox no soporta Web SQL <strike>jajajajaja</strike></div>
</div>Jesús Alberto Sánchez Tecalcohttp://www.blogger.com/profile/05416570182548174207noreply@blogger.com0tag:blogger.com,1999:blog-4594083802314721454.post-39190324311529047442014-12-07T18:55:00.000-08:002014-12-07T18:58:03.530-08:00Tablas en PrimeFaces no se refrescan al usar filtros [Java]<div style="text-align: justify;">
Qué tal amigo, nuevamente me encuentro de regreso por aquí, el día de hoy de mostraré una forma de resetear los filtros de las tablas en PrimeFaces.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Lo anterior se me hace algo interesante y útil cuando te sucede como a mi. Me encuentro realizando un proyecto de la Universidad y consta de algunas pantallas que para mostrar registros previamente guardados utilizo una tabla <b><p:table> </b>que contiene filtros en cada columna <b><p:column>.</b></div>
<br />
<div style="text-align: justify;">
Para comenzar proporciono un archivo .xhtml en el cual tengo una tabla con tan solo 3 columnas.</div>
<br />
<b>aula.xhtml</b><br />
<br />
<textarea cols="80" rows="20"><?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE html>
<html
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title>IGNORED</title>
<f:metadata>
<f:event type="preRenderView" listener="#{aulBean.init}"/>
</f:metadata>
</h:head>
<h:body>
<ui:composition template="/template/template_general.xhtml">
<ui:define name="title-page">
<h:outputText value="Aulas"/>
</ui:define>
<ui:define name="page-content">
<h:form id="frm-aulas">
<h2 class="title-text">
<h:outputText value="Lista de aulas"/></h2>
<p:dataTable value="#{aulBean.aulas}"
id="tabla-aulas"
var="aul"
rows="10"
paginatorPosition="bottom"
emptyMessage="No hay registros para mostrar"
paginator="true"
paginatorTemplate="{CurrentPageReport} {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
rowsPerPageTemplate="5,10,15">
<p:column sortBy="#{aul.nombre}" filterMatchMode="contains" filterBy="#{aul.nombre}">
<f:facet name="header">
<h:outputText value="Aula" />
</f:facet>
<h:outputText value="#{aul.nombre}" />
</p:column>
<p:column sortBy="#{aul.descripcion}" filterMatchMode="contains" filterBy="#{aul.descripcion}">
<f:facet name="header">
<h:outputText value="Descripción" />
</f:facet>
<h:outputText value="#{aul.descripcion}" />
</p:column>
<p:column>
<f:facet name="header">
<h:outputText value="Opciones" />
</f:facet>
<p:commandLink value="Modificar" onclick="PF('dlgaul').show();" actionListener="#{aulBean.elegirAulaModificar}" update=":frm-edicion">
<f:attribute name="aul" value="#{aul}" />
</p:commandLink>
</p:column>
</p:dataTable>
<h:panelGrid rendered="#{aulBean.aulas ne null and !empty aulBean.aulas}" styleClass="panel-export" columns="2">
<h:commandLink>
<h:graphicImage library="img" name="xls.png"/>
<p:dataExporter type="xls" target="tabla-aulas" fileName="Aulas" />
</h:commandLink>
<h:commandLink>
<h:graphicImage library="img" name="pdf.png"/>
<p:dataExporter type="pdf" target="tabla-aulas" fileName="Aulas" />
</h:commandLink>
</h:panelGrid>
</h:form>
<h2 class="title-text">
Crear aula</h2>
<h:form id="frm-creacion">
<p:growl for="frm-creacion" showDetail="true" showSummary="true" life="4000" severity="info,warm,error" />
<h:panelGrid columns="2">
<h:outputText value="Aula" />
<h:panelGroup>
<p:inputText id="txtc-aula" value="#{aulBean.aula.nombre}" required="true" requiredMessage="Falta aula"/>
<p:message for="txtc-aula"/>
</h:panelGroup>
<h:outputText value="Descripción" />
<h:panelGroup>
<p:inputText id="txtc-descrip" value="#{aulBean.aula.descripcion}" required="true" requiredMessage="Falta descripción"/>
<p:message for="txtc-descrip"/>
</h:panelGroup>
<p:commandButton type="reset" value="Limpiar" update="@form"/>
<p:commandButton value="Guardar" actionListener="#{aulBean.guardarAula}" update="@form :frm-aulas"/>
</h:panelGrid>
</h:form>
<p:dialog id="dlg-edit-aula" header="Edición de aulas" widgetVar="dlgaul" modal="true" closable="false">
<h:form id="frm-edicion">
<p:growl for="frm-edicion" showDetail="true" showSummary="true" life="4000" severity="info,warm,error" />
<h:panelGrid columns="2">
<h:outputText value="Aula" />
<h:panelGroup>
<p:inputText id="txte-aula" required="true" requiredMessage="Falta aula" value="#{aulBean.aulaTemp.nombre}" />
<p:message for="txte-aula"/>
</h:panelGroup>
<h:outputText value="Descripción" />
<h:panelGroup>
<p:inputText id="txte-descrip" required="true" requiredMessage="Falta aula" value="#{aulBean.aulaTemp.descripcion}" />
<p:message for="txte-descrip"/>
</h:panelGroup>
<p:commandButton value="Actualizar" update="@form :frm-aulas" actionListener="#{aulBean.modificarAula}"/>
<p:commandButton value="Cancelar" onclick="PF('dlgaul').hide();"/>
</h:panelGrid>
</h:form>
</p:dialog>
</ui:define>
</ui:composition>
</h:body>
</html></textarea><br />
<br />
<div style="text-align: justify;">
Mi archivo anterior tiene asociado un Bean que funge como Controlador para todas las funcionas que desempeña este, por lo cual también muestro su contenido.</div>
<b><br /></b>
<b>AulaController.java</b><br />
<br />
<textarea cols="80" rows="20">package mx.edu.itshuatusco.controller;
import java.io.Serializable;
import java.util.List;
import javax.annotation.PostConstruct;
import javax.ejb.EJB;
import javax.enterprise.context.SessionScoped;
import javax.faces.application.FacesMessage;
import javax.faces.event.ActionEvent;
import javax.inject.Named;
import mx.edu.itshuatusco.controller.app.AbstractController;
import mx.edu.itshuatusco.ejb.ITSHEJBRemote;
import mx.edu.itshuatusco.excep.SaurioException;
import mx.edu.itshuatusco.model.Aula;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@SessionScoped
@Named(value = "aulBean")
public class AulasController extends AbstractController implements Serializable {
private static final Logger log = LoggerFactory.getLogger(AulasController.class);
@EJB
private ITSHEJBRemote itshEJB;
private Aula aula;
private Aula aulaTemp;
private List<aula> aulas;
@PostConstruct
public void init() {
aula = new Aula();
listarAulas();
}
public void guardarAula() {
try {
itshEJB.guardarAula(aula);
aula = new Aula();
listarAulas();
mostrarMensaje("Aula guardada", "El aula ha sido guardada con éxito", FacesMessage.SEVERITY_INFO, "frm-creacion");
resetearFitrosTabla("frm-aulas:tabla-aulas");
} catch (SaurioException se) {
mostrarMensajeError("frm-creacion");
log.error(se.getMessage(), se);
} catch (Exception e) {
mostrarMensajeError("frm-creacion");
log.error(e.getMessage(), e);
}
}
public void elegirAulaModificar(ActionEvent ae) {
aulaTemp = (Aula) ae.getComponent().getAttributes().get("aul");
}
public void modificarAula() {
try {
log.info("Intentando actualizar aula...");
itshEJB.modificarAula(aulaTemp);
aulaTemp = new Aula();
listarAulas();
resetearFitrosTabla("frm-aulas:tabla-aulas");
mostrarMensaje("Aula actualizada", "El aula fue actualizada con éxito", FacesMessage.SEVERITY_INFO, "frm-edicion");
cerrarDialogo("dlgaul");
log.info("Aula modificada...");
} catch (SaurioException se) {
mostrarMensajeError("frm-creacion");
log.error(se.getMessage(), se);
} catch (Exception e) {
mostrarMensajeError("frm-creacion");
log.error(e.getMessage(), e);
}
}
public void listarAulas() {
try {
aulas = itshEJB.listarAula(null);
} catch (SaurioException se) {
log.error(se.getMessage(), se);
mostrarMensajeError("frm-creacion");
} catch (Exception e) {
log.error(e.getMessage(), e);
mostrarMensajeError("frm-creacion");
}
}
public Aula getAula() {
return aula;
}
public void setAula(Aula aula) {
this.aula = aula;
}
public Aula getAulaTemp() {
return aulaTemp;
}
public void setAulaTemp(Aula aulaTemp) {
this.aulaTemp = aulaTemp;
}
public List<aula> getAulas() {
return aulas;
}
public void setAulas(List<aula> aulas) {
this.aulas = aulas;
}
}</textarea><br />
<br />
<div style="text-align: justify;">
Bueno y tu dirás, ¿Y para que quiero ver todo ese código?, bueno es básicamente para mostrarte el funcionamiento completo de la pantalla.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Cuando desde el navegador se despliega el proyecto y se tiene acceso a la pantalla lo primero que sucederá es que cargará la lista de aulas y las renderiza en la tabla con id <b>tabla-aulas</b>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Dicha tabla se compone de 3 columnas: Aula, Descripción y Opciones, las 2 primeras cuentan con filtros (identificar los atributos filterMatchMode y filterBy).</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ahora, si vemos más adelante tenemos un formulario con id <b>frm-creacion</b> el cual permite crear nuevas aulas.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Observa con atención un <b>commandButton </b>que tiene un <b>actionListener </b>que llama a un método del Bean <i>guardarAula()</i>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El problema que tenía era el siguiente: Se muestra la página, ingreso datos para una nueva aula, doy clic en guardar [refresco la tabla y se muestra mi nuevo registro] y hasta aquí todo bien. Utilizo mi filtro de la columna de aula, busco algo, limpio el filtro, ingreso nuevos datos para un aula y doy clic en guardar [refresco la tabla] y ¡Boom! no aparece por ningún lado mi registro, mis logs me dicen que se hizo bien el alta del aula pero mi tabla jamás los muestra. La solución fue la siguiente:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Si buscas en AulaController el método <i>guardarAula() </i>te darás cuenta que hago uso de otro método más:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>resetearFitrosTabla("frm-aulas:tabla-aulas");</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Bien, este método es de la clase padre AbstractController pero para no publicar completa esta clase te comparto que es lo que hace realmente el método:</div>
<br />
<textarea cols="80" rows="5">public void resetearFitrosTabla(String id) {
DataTable table = (DataTable) FacesContext.getCurrentInstance().getViewRoot().findComponent(id);
table.reset();
}</textarea><br />
<br />
<div style="text-align: justify;">
Listo, a partir del <i>findComponent()</i> obtengo la tabla del xhtml pasando como parámetro el id de la tabla (En el ejemplo del método guardarAula como la tabla no se encuentra en el mismo formulario que el botón desde donde llamo el método el parametro es<u>formulario:tabla</u> y equivale a <u>frm-aulas:tabla-aulas)</u> para después únicamente con la instancia obtenida y guardada en el objeto table usar el método reset(), y con estas 2 sencillas líneas logro que mi tabla se refresque aún cuando halla utilizado los filtros.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Bueno, espero lo anterior te sea de ayuda, aquí una captura de la pantallita por si te da curiosidad, saludos y nuevamente bienvenido.</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZpbsgF_Agz1SkkQuFtUJq_4Z9ybSeYVxmoqLxypXu4Y5kRc2hHl2NQJr0HNxOonkWYfhjztVz65KoGtedIZH30uRFF2F_2z_cVM7lBncBee3auDfmvp5_Ij-0tJbfOEOyiwFESOsNZ8o/s1600/PantallaAulas.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgZpbsgF_Agz1SkkQuFtUJq_4Z9ybSeYVxmoqLxypXu4Y5kRc2hHl2NQJr0HNxOonkWYfhjztVz65KoGtedIZH30uRFF2F_2z_cVM7lBncBee3auDfmvp5_Ij-0tJbfOEOyiwFESOsNZ8o/s1600/PantallaAulas.png" height="179" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
Jesús Alberto Sánchez Tecalcohttp://www.blogger.com/profile/05416570182548174207noreply@blogger.com9tag:blogger.com,1999:blog-4594083802314721454.post-25066069995608162502014-10-22T18:30:00.000-07:002014-10-22T18:41:49.185-07:00Implementación báscula CAS PD II [Java]<div style="text-align: justify;">
¿Qué tal a todos?, gracias por visitarnos, en la breve publicación de hoy les compartiré una clase para realizar la conexión de la báscula CAS PD II con Java.</div>
<div>
<div style="text-align: justify;">
<br /></div>
</div>
<div>
<div style="text-align: justify;">
Una disculpa por esta larga ausencia, el exceso de actividades me llevo a descuidar un poco este su sitio, por lo que este mi regreso debería ser algo grande, por lo que espero les sea de utilidad.</div>
</div>
<div>
<div style="text-align: justify;">
<br /></div>
</div>
<div>
<div style="text-align: justify;">
Un poco contradictorio a lo mencionado directamente les comparto el código. Si lo analizas con cuidado... ¡SI! es una adaptación de la tan famosa clase de la Samsung. Si no sabes de que hablo te recomendaría eches un vistazo a esta <a href="http://sourceforge.net/p/unicentaopos/discussion/1126900/thread/7a50b3d7/" target="_blank">URL</a>.</div>
</div>
<div>
<br />
<b>ScaleCASPDII.java</b></div>
<textarea cols="100" rows="100">// uniCenta oPOS - Touch Friendly Point Of Sale
// Copyright (c) 2009-2012 uniCenta
// http://www.unicenta.net/unicentaopos
//
// This file is part of uniCenta oPOS
//
// uniCenta oPOS is free software: you can redistribute it and/or modify
// it under the terms of the GNU General Public License as published by
// the Free Software Foundation, either version 3 of the License, or
// (at your option) any later version.
//
// uniCenta oPOS is distributed in the hope that it will be useful,
// but WITHOUT ANY WARRANTY; without even the implied warranty of
// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
// GNU General Public License for more details.
//
// You should have received a copy of the GNU General Public License
// along with uniCenta oPOS. If not, see <http://www.gnu.org/licenses/>.
package scale;
/**
*
* @author Jesús Alberto Sánchez Tecalco
*/
import gnu.io.*;
import java.io.*;
public class ScaleCASPDII implements Scale, SerialPortEventListener {
private CommPortIdentifier m_PortIdPrinter;
private SerialPort m_CommPortPrinter;
private String m_sPortScale;
private OutputStream m_out;
private InputStream m_in;
private static final int SCALE_READY = 0;
private static final int SCALE_READING = 1;
private static final int SCALE_READINGDECIMALS = 2;
private double m_dWeightBuffer;
private double m_dWeightDecimals;
private int m_iStatusScale;
/**
* Creates a new instance of ScaleComm
*/
public ScaleCASPDII(String sPortPrinter) {
System.out.println("Iniciamos la inicialización de valores...");
m_sPortScale = sPortPrinter;
m_out = null;
m_in = null;
m_iStatusScale = SCALE_READY;
m_dWeightBuffer = 0.0;
m_dWeightDecimals = 1.0;
System.out.println("Finalizamos la inicializacion de valores...");
}
@Override
public Double readWeight() {
synchronized (this) {
if (m_iStatusScale != SCALE_READY) {
try {
System.out.println("Que se espere 1 segundo la báscula...");
wait(1000);
} catch (InterruptedException e) {
}
if (m_iStatusScale != SCALE_READY) {
// bascula tonta.
m_iStatusScale = SCALE_READY;
}
}
// Ya estamos en SCALE_READY
m_dWeightBuffer = 0.0;
m_dWeightDecimals = 1.0;
System.out.println("Mandamos la puta W");
write(new byte[]{0x57}); // W
// System.out.println("Limpiamos...");
// flush();
System.out.println("Mandamos a que se detenga...");
write(new byte[]{0x000D});
// System.out.println("Otra vez limpiamos...");
// flush();
// Esperamos un ratito
try {
System.out.println("Esperamos otro segundo conchas...");
wait(1000);
} catch (InterruptedException e) {
}
if (m_iStatusScale == SCALE_READY) {
System.out.println("Recibimos cosas...");
// hemos recibido cositas o si no hemos recibido nada estamos a 0.0
double dWeight = m_dWeightBuffer / m_dWeightDecimals;
m_dWeightBuffer = 0.0;
m_dWeightDecimals = 1.0;
return new Double(dWeight);
} else {
System.out.println("No recibimos ni una madre...");
m_iStatusScale = SCALE_READY;
m_dWeightBuffer = 0.0;
m_dWeightDecimals = 1000.0;
return new Double(0.0);
}
}
}
private void flush() {
try {
m_out.flush();
} catch (IOException e) {
}
}
private void write(byte[] data) {
try {
if (m_out == null) {
System.out.println("No esta abierto el puerco... lo abrimos...");
m_PortIdPrinter = CommPortIdentifier.getPortIdentifier(m_sPortScale); // Tomamos el puerto
m_CommPortPrinter = (SerialPort) m_PortIdPrinter.open("PORTID", 2000); // Abrimos el puerto
m_out = m_CommPortPrinter.getOutputStream(); // Tomamos el chorro de escritura
m_in = m_CommPortPrinter.getInputStream();
m_CommPortPrinter.addEventListener(this);
m_CommPortPrinter.notifyOnDataAvailable(true);
m_CommPortPrinter.setSerialPortParams(9600, SerialPort.DATABITS_7, SerialPort.STOPBITS_1, SerialPort.PARITY_EVEN); // Configuramos el puerto
} else {
System.out.println("Ya estaba abierto...");
}
System.out.println("Mandamos datitos...");
m_out.write(data);
flush();
// m_CommPortPrinter.close();
} catch (Exception e) {
System.err.println(e.getMessage());
}
}
@Override
public void serialEvent(SerialPortEvent e) {
// Determine type of event.
switch (e.getEventType()) {
case SerialPortEvent.BI:
case SerialPortEvent.OE:
case SerialPortEvent.FE:
case SerialPortEvent.PE:
case SerialPortEvent.CD:
case SerialPortEvent.CTS:
case SerialPortEvent.DSR:
case SerialPortEvent.RI:
case SerialPortEvent.OUTPUT_BUFFER_EMPTY:
break;
case SerialPortEvent.DATA_AVAILABLE:
try {
//TODO: aqui esta la verga...
while (m_in.available() > 0) {
int b = m_in.read();
System.out.println("Quien sabe para que es b pero vale { " + b + " }");
if (b == 0x000D) { // CR ASCII
// Fin de lectura
System.out.println("FIn...");
synchronized (this) {
m_iStatusScale = SCALE_READY;
notifyAll();
}
} else if ((b > 0x002F && b < 0x003A) || b == 0x002E) {
synchronized (this) {
if (m_iStatusScale == SCALE_READY) {
System.out.println("Bascula lista...");
m_dWeightBuffer = 0.0; // se supone que esto debe estar ya garantizado
m_dWeightDecimals = 1.0;
m_iStatusScale = SCALE_READING;
}
if (b == 0x002E) {
System.out.println("Bascula leyendo..");
m_iStatusScale = SCALE_READINGDECIMALS;
} else {
System.out.println("Haciendo cuentitas...");
//Ya me di cuenta que aquí se va creando la cantidad... si veo que es mayor sigo asignando el valor si no pa que regreso a 0s xD
if(m_dWeightBuffer < (m_dWeightBuffer * 10.0 + b - 0x0030)) {
m_dWeightBuffer = m_dWeightBuffer * 10.0 + b - 0x0030;
}
System.out.println("El valor del peso es: " + m_dWeightBuffer);
if (m_iStatusScale == SCALE_READINGDECIMALS) {
m_dWeightDecimals *= 10.0;
System.out.println("El valor de m_dWiihtDecimal" + m_dWeightDecimals);
}
}
}
}
// else {
// System.out.println("Valio madres... reseteamos valores...");
// // caracteres invalidos, reseteamos.
// m_dWeightBuffer = 0.0; // se supone que esto debe estar ya garantizado
// m_dWeightDecimals = 1000.0;
// m_iStatusScale = SCALE_READY;
// }
}
// m_out.close();
// m_in.close();
// m_CommPortPrinter.close();
} catch (IOException eIO) {
}
break;
}
}
}</textarea>
<br />
<div>
<br />
<div style="text-align: justify;">
La forma fácil de trabajar la clase sería la siguiente:</div>
<textarea cols="100" rows="3">ScaleCASPDII scale = new ScaleCASPDII();
Double peso = scale.readWeight();
System.out.println("El peso es: " + peso);</textarea><br />
<br />
<div style="text-align: justify;">
La única ciencia de esta clase es crear una instancia pasando en el constructor una cadena con el puerto al que se desea realizar la conexión y por último usar el método readWeight() para obtener el peso de la báscula.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En verdad espero les sea de utilidad, antes de despedirme debo de recordar que es necesario tener la librería de <b>RXTXcomm.java</b>.</div>
</div>
Jesús Alberto Sánchez Tecalcohttp://www.blogger.com/profile/05416570182548174207noreply@blogger.com3tag:blogger.com,1999:blog-4594083802314721454.post-64058723134774759162013-09-01T19:09:00.002-07:002013-09-01T19:14:42.080-07:00Argumentos Variables - VarArgs - Elipsis [Java]<div style="text-align: justify;">
Saludos, después de mi ausencia en el blog regreso con una interesante publicación, acerca del tema: Argumentos variables.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
VarArgs como le dicen en E.U. es una herramienta que nos proporciona Java para lo siguiente:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Imagina que tienes un método en el que necesitas pasar n número de argumentos, conforme a las necesitas podrías pasar 2 argumentos, 3 argumentos, 4 argumentos, etc. Es verdad que existe la sobrecarga de métodos, pero esto implica una gran repetición de código que de un momento a otro puede generar una clase ilegible.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Por lo tanto, el objetivo de utilizar un método con argumentos variables es que tú puedes colocar el número de argumentos que quieras, siempre y cuando sea del tipo correspondiente, a continuación la sintaxis básica de un método con argumentos variables:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
public int sumar(int... n)</div>
<div style="text-align: justify;">
{</div>
<div style="text-align: justify;">
int suma=0;</div>
<div style="text-align: justify;">
for(int i:n)</div>
<div style="text-align: justify;">
suma+=i;</div>
<div style="text-align: justify;">
return suma;</div>
<div style="text-align: justify;">
} </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Como podrás observar el argumento del método anterior "int... n" tiene tres puntos después de declarar el tipo de dato, esto significa que el método suma puede soportar n cantidad de argumentos de tipo int, dentro del método puedes tratar a ese argumento variable como si fuera un arreglo, es por ello que por medio de un bucle for obtengo todos los argumentos y realizo la suma.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Lo anterior, es un ejemplo muy simple, también es posible agregar un argumento "fijo", "normal" como los que siempre utilizamos, pero ellos deben ir antes del argumento variable.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
A continuación comparto un pequeño proyecto de una "tiendita" que nos ayudará a comprender mejor el funcionamiento de los argumentos variables.</div>
<br />
<b>Producto.java</b><br />
<textarea cols="72" rows="10">public class Producto {
private Integer clave;
private String descripcion;
private Float precio;
public Producto() {
clave=null;
descripcion=null;
precio=null;
}
public Producto(Integer clave, String descripcion, Float precio) {
this.clave = clave;
this.descripcion = descripcion;
this.precio = precio;
}
public Integer getClave() {
return clave;
}
public void setClave(Integer clave) {
this.clave = clave;
}
public String getDescripcion() {
return descripcion;
}
public void setDescripcion(String descripcion) {
this.descripcion = descripcion;
}
public Float getPrecio() {
return precio;
}
public void setPrecio(Float precio) {
this.precio = precio;
}
}
</textarea>
<br />
<br />
<div style="text-align: justify;">
La clase <i>Producto </i>es una clase destinada para crear objetos que tengan 3 atributos: una clave, una descripción y un precio.</div>
<br />
<b>Compra.java</b><br />
<textarea cols="72" rows="10">public class Compra {
private Integer numeroAdquisicion;
private Producto producto;
private Integer cantidad;
private Float subtotal;
public Compra() {
numeroAdquisicion=null;
producto=null;
cantidad=null;
subtotal=null;
}
public Compra(Integer numeroAdquisicion, Producto producto, Integer cantidad) {
this.numeroAdquisicion = numeroAdquisicion;
this.producto = producto;
this.cantidad = cantidad;
subtotal=null;
}
public Integer getNumeroAdquisicion() {
return numeroAdquisicion;
}
public void setNumeroAdquisicion(Integer numeroAdquisicion) {
this.numeroAdquisicion = numeroAdquisicion;
}
public Producto getProducto() {
return producto;
}
public void setProducto(Producto producto) {
this.producto = producto;
}
public Integer getCantidad() {
return cantidad;
}
public void setCantidad(Integer cantidad) {
this.cantidad = cantidad;
}
public Float getSubtotal() {
subtotal=cantidad*producto.getPrecio();
return subtotal;
}
}
</textarea>
<br />
<br />
<div style="text-align: justify;">
La clase <i>Compra</i> representa la elección del usuario de cual <i>Producto</i> desea comprar, la cantidad a llevar y cuanto pagara por ellos. Hablemos de que puede hacer la elección de varios productos pero del mismo tipo.</div>
<div style="text-align: justify;">
<br /></div>
<b>Carrito.java</b><br />
<textarea cols="72" rows="10">import java.util.Calendar;
import java.util.Date;
public class Carrito {
private Integer ticket;
private Compra compras[];
private Date fechaCompra;
private Float total;
public Carrito(Integer ticket,Compra... compras) {
this.compras=compras;
fechaCompra=Calendar.getInstance().getTime();
this.ticket=ticket;
}
public Float vender()
{
total=new Float(0);
for(Compra compra:compras)
{
total+=compra.getSubtotal();
}
return total;
}
public Date getFechaCompra() {
return fechaCompra;
}
public Compra[] getCompras() {
return compras;
}
public Integer getTicket() {
return ticket;
}
}
</textarea>
<br />
<br />
<div style="text-align: justify;">
La clase <i>Carrito </i>es la encargada de almacenar n número de <i>Compra</i>s, la magia se encuentra en el constructor de la clase que tiene "2 argumentos": un número de ticket y n número de compras, es decir, cuando creas una instancia de la clase Carrito debes asignar en su constructor el número del ticket y después el numero de compras que tu quieras, observa que yo asigno al arreglo <u>compras</u> el valor de todos los argumentos que se le pasen como objetos <i>Compra</i> posteriormente desde el método vender realizo un proceso muy similar al que mostré en nuestro primer ejemplo de sumar.</div>
<br />
<b>Tickets.java</b><br />
<textarea cols="72" rows="10">public class Tickets {
public static void main(String[] args) {
//Creamos unos cuantos productos
Producto producto1=new Producto(1,"Sabritas",8f);
Producto producto2=new Producto(2,"Galletas Emperador",7f);
Producto producto3=new Producto(3,"Coca cola 2 L.",24f);
Producto producto4=new Producto(4,"Chicle de bolita",1f);
Producto producto5=new Producto(5,"Gomitas Hamburguesa",6f);
//Creamos varias compras
//Para el primer cliente
Compra compra1=new Compra(1,producto1,2);
Compra compra2=new Compra(2, producto2, 3);
//Para el segundo cliente
Compra compra3=new Compra(1, producto3, 2);
Compra compra4=new Compra(2, producto4, 10);
Compra compra5=new Compra(3, producto5, 2);
//Realizamos la venta al primer cliente
Carrito carrito1=new Carrito(1,compra1,compra2);
System.out.println("Ticket: "+carrito1.getTicket());
System.out.println("Adquisicion-Producto-Cantidad-Subtotal");
for(Compra c:carrito1.getCompras())
{
System.out.println(c.getNumeroAdquisicion()+"-"+c.getProducto().getDescripcion()+"-"+c.getCantidad()+"-"+c.getSubtotal());
}
System.out.println("Total: $"+carrito1.vender());
System.out.println("Fecha: "+carrito1.getFechaCompra());
System.out.println("-------------Soy una barra divisora-------------");
//Realizamos la venta al segundo cliente
Carrito carrito2=new Carrito(2,compra3,compra4,compra5);
System.out.println("Ticket: "+carrito2.getTicket());
System.out.println("Adquisicion-Producto-Cantidad-Subtotal");
for(Compra c:carrito2.getCompras())
{
System.out.println(c.getNumeroAdquisicion()+"-"+c.getProducto().getDescripcion()+"-"+c.getCantidad()+"-"+c.getSubtotal());
}
System.out.println("Total: $"+carrito2.vender());
System.out.println("Fecha: "+carrito2.getFechaCompra());
}
}
</textarea>
<br />
<br />
En la clase <i>Tickets</i> ponemos a todas las clases a trabajar:<br />
<br />
1.- Creamos algunos productos para que nuestros clientes elijan [Instanciando a la clase Producto].<br />
<br />
<div>
2.- Realizamos varias compras (pensando que serán 2 los clientes) [Instanciando a la clase Compra].</div>
<br />
<div>
3.- Realizamos 2 carritos, en el primero pasamos el número de ticket y 2 compras, en el segundo el número de ticket y 3 compras [Aquí el efecto de los argumentos variables] esto sin ninguna necesidad de sobrecargar los métodos.</div>
<br />
<div>
4.- Se muestra la información de nuestros carritos así como el total a pagar, aquí una captura del resultado por el Sr. Frijolito [NetBeans]:<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2nzZ2NDmdfNd7wrvvO9gCQ6COD6_CyiziztFOk-Rym3hH9CUrXvtIV1Wm1ws5b4ascBpkHGhg01-EoK7kL9bFGCw4b5S-ZphGN_db0MvhmP3kBAyS3f0iJJZCrOu-7208ZD-DT2zgPtA/s1600/Argumentos+Variables.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEg2nzZ2NDmdfNd7wrvvO9gCQ6COD6_CyiziztFOk-Rym3hH9CUrXvtIV1Wm1ws5b4ascBpkHGhg01-EoK7kL9bFGCw4b5S-ZphGN_db0MvhmP3kBAyS3f0iJJZCrOu-7208ZD-DT2zgPtA/s320/Argumentos+Variables.png" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Si te interesa el proyecto completo lo puedes obtener dando clic en Descargar.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.mediafire.com/?lxbrnuvrhxalj3t" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh7CAVTWnJjJJR4Fr0xUeQIPExfRiEaM2FZRIeJvXKeWzBKzdOeaiSWRv7It8OOhqZzpwnmOO5NnyKgW83IZxQpSBO7yQi3YAw-6t1iEe9bn2xcicQEem2sMx9ypGSBf7XvahzkSRv5odE/s1600/Mediafire+(1).png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Nota: Desconozco si uno de los nombres que también se le dan a los Argumentos variables es Elipsis, creo que sip n_n, hasta la próxima.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div>
<br /></div>
</div>Jesús Alberto Sánchez Tecalcohttp://www.blogger.com/profile/05416570182548174207noreply@blogger.com1tag:blogger.com,1999:blog-4594083802314721454.post-91524276872142144852013-05-19T17:31:00.000-07:002013-05-19T18:14:08.472-07:00Instalar entorno de desarrollo JAVA.Hola a todos,<br />
<br />
El post de hoy está dedicado para todos aquellos que recién inician es esto de la programación, y es que al inicio llega a ser un caos encontrar paso a paso lo que hay que hacer cuando se quiere iniciar a programar.<br />
<br />
Algunas veces estoy llega a ser tan poco claro que la mayoría(sobre todo los recién estudiantes) terminan por no saber lo que están instalando y para qué(un poco peor). Hoy les explicaré de manera simple que es lo que se necesita para crear un entorno de desarrollo. Y que es lo que estamos instalando.<br />
<br />
Pues para comenzar por lo que se debe comenzar es en elegir el lenguaje en el que vamos a programar. En este caso he elegido JAVA por ser uno de los lenguajes más utilizados en la actualidad, ya que posee diferentes ventajas como el hecho de que está basada en el paradigma de orientación a objetos, también la gran comunidad que siempre aporta algo, lo que lo hace un lenguaje robusto en cuanto a documentación, además de su flexibilidad y recientemente el hecho de que sistemas como Android se desarrollan basados en esta tecnología.<br />
<br />
Pues para iniciar tenemos que instalar el JDK (JAVA Development Kid), que no es otra cosa más que un conjunto de herramientas como paquetes, frameworks, etc. Que facilitan el desarrollo de la programación.<br />
<br />
Para eso iremos a la siguiente liga:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.oracle.com/technetwork/es/java/javase/downloads/index.html" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgeGHKhuLtPKGf0acLnPZPcD8gXRZyDzTdAIhSLigGEXPLWPY3A02J_ySmJl2rN8fjKyy6wgUGB-aqJ8eDabuFeMsfe_yA2j_UFdYK6hsiD-yzuC6YaHzhkka0hlyd_BfEiEwlHqqSgYZXW/s1600/1612441.gif" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Y seleccionaremos JDK(JAVA platform), en su versión más reciente. Posteriormente saldrá una página con una tabla como la siguiente: </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDs8v2ZsF397Ppu_avfDy-bqWhyxo4ytyCZAAay6ybVn1yR3zSec11hxQj9q3WKX9iMYcu2FB_Qt8riqOKfvz7KoYpqadrOQY9QVq4TvnwHvsKMBrqEKNCGY15XvK8Y7TDh7R5jrjrF1bN/s1600/JDK.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgDs8v2ZsF397Ppu_avfDy-bqWhyxo4ytyCZAAay6ybVn1yR3zSec11hxQj9q3WKX9iMYcu2FB_Qt8riqOKfvz7KoYpqadrOQY9QVq4TvnwHvsKMBrqEKNCGY15XvK8Y7TDh7R5jrjrF1bN/s1600/JDK.png" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
Dependiendo de nuestro S.O deberemos seleccionar la versión de JDK apropiada. En el caso de windows existen 2 opciones x86(para version de 32 bits) y x64(para versión de 64). Para saber que versión tienes de S.O. puedes revisar la ruta "Control Panel\System and Security\System".</div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuOEGtQx47XiKYPyeFbjXCXAhEaDl2BE2v4PD0JHt-dMCoLw33b4pQDq_AuvYI0kyza6DAdYxcJkraDwhCq2Eo_38R5IfGfnydV5qD1jJ3yyzSv0plQBU3dhiYATjxVO4i___5IpqrGfkE/s1600/Control+Panel1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiuOEGtQx47XiKYPyeFbjXCXAhEaDl2BE2v4PD0JHt-dMCoLw33b4pQDq_AuvYI0kyza6DAdYxcJkraDwhCq2Eo_38R5IfGfnydV5qD1jJ3yyzSv0plQBU3dhiYATjxVO4i___5IpqrGfkE/s400/Control+Panel1.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Una vez descargado el paquete solo es cuestión de seguir las instrucciones de instalación así como aceptar el acuerdo de instalación. Posteriormente, se debe añadir la ruta de los archivos ejecutables del JDK al path. Para esto, desde la ventana abierta anteriormente, se selecciona cambiar ajustes. </div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAUJ3Bp8DcdaHVAn4UxA02LXY-rcH8ZhyphenhyphenCXfQ8PsWKnwy5zkQ2DqLZaV2vVdeuwWZoZFhK0KwNem5cmcaHiJB-r2D4ncbZkIa6r5u3tpAzrKiTRIwNk7BAFtlBNedgwXBbwWza9j96lfuJ/s1600/Control+Panel2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="220" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgAUJ3Bp8DcdaHVAn4UxA02LXY-rcH8ZhyphenhyphenCXfQ8PsWKnwy5zkQ2DqLZaV2vVdeuwWZoZFhK0KwNem5cmcaHiJB-r2D4ncbZkIa6r5u3tpAzrKiTRIwNk7BAFtlBNedgwXBbwWza9j96lfuJ/s400/Control+Panel2.png" width="400" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
Después seleccionamos Variables de entorno, dentro de la tabla Variables de Sistema seleccionaremos la variable "path" damos click en editar<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZHPsdoTFpMqsy52BvYKqYVvtJLgmvDSV7vGAlgwzIZhIdP5-7IPyrYfQDC7YItH4jrG83xiU5WNszVmad_7P760PQBUNhjy9XjrlpuxOz8jXQUrFr-G7AkFVdWQlw60N7qigfvRcmeMh3/s1600/Enviromental+variables.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiZHPsdoTFpMqsy52BvYKqYVvtJLgmvDSV7vGAlgwzIZhIdP5-7IPyrYfQDC7YItH4jrG83xiU5WNszVmad_7P760PQBUNhjy9XjrlpuxOz8jXQUrFr-G7AkFVdWQlw60N7qigfvRcmeMh3/s1600/Enviromental+variables.png" /></a><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtTmMvwWjo-xDCVkM5gC9w0JSai5UDSp2RnYZUqwGTUowNFJAq_y-fg0w6adUaLNeTF8ms-phU9LZYANQ5SJ8uV_rZT5ZRLKNxbx5YaB6KDWKW3-BLB0ZycWaeP4fR_w9E1AGcjllLAOsL/s1600/Path.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgtTmMvwWjo-xDCVkM5gC9w0JSai5UDSp2RnYZUqwGTUowNFJAq_y-fg0w6adUaLNeTF8ms-phU9LZYANQ5SJ8uV_rZT5ZRLKNxbx5YaB6KDWKW3-BLB0ZycWaeP4fR_w9E1AGcjllLAOsL/s1600/Path.png" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<br />
y añadiremos la siguiente ruta: "C:\Program Files\Java\jdk######\bin"( ##### cambia dependiendo de la versión que hayamos instalado).<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglyIIznBq4kgWx1UpfIOozES7jj9nGsAaEWj73S5qZHsG3-K0gXS56OFd165HfPbcibpcnYT5uVtt-32VUApVXFx_SNTkur_xtvzEvYIczSrxSaz7So96QH3Sm2Rh-1BKY8d4YzL9UG4W9/s1600/path2.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEglyIIznBq4kgWx1UpfIOozES7jj9nGsAaEWj73S5qZHsG3-K0gXS56OFd165HfPbcibpcnYT5uVtt-32VUApVXFx_SNTkur_xtvzEvYIczSrxSaz7So96QH3Sm2Rh-1BKY8d4YzL9UG4W9/s1600/path2.png" /></a></div>
<br />
<div style="text-align: justify;">
Una vez hecho esto, el JDK se encuentra listo para ser utilizado, lo que significa que ya podríamos abrir un block de notas y empezar a programar. Sin embargo actualmente existen algunas Herramientas que facilitan(y por mucho) el desarrollo de programas. Estoy hablando de los IDE (Integrated Development Enviroment) que no son otra cosa más que unos blocks de notas mucho más complejos(aunque algunos podrán estar en desacuerdo conmigo), lo anterior es debido a que además de que nos permiten escribir código también nos proporcionan herramientas mediante las cuales se puede reutilizar código, también herramientas que nos dan formato, correcciones en algunos casos y además son capaces de integrarse a la tecnología sobre la cual programamos. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Lo que nos permite continuar con la programación y depurar(quitar errores) nuestro código sin tener que salir del entorno de desarrollo. Actualmente existen dos IDE's con bastante fuerza en el desarrollo en Java Net Beans y Eclipse, hoy instalaremos Eclipse pues tiene una ventaja extra de la cual hablaré en publicaciones posteriores que es el apoyo por parte de google para la programación de android. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Bien, para la instalación es necesario que descarguen el ejecutable que encontrarán en el siguiente link. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://www.eclipse.org/downloads/" target="_blank"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh16G8O5B3C-SeB7Pc4HWY2_DUNLDlb7HpMC4UuiBcJN3fcg0Zch-yGzdy-5-qnUT_GTClwM5850KgU3LBZiTzEC7BMdB6h34gIxiKS-n1zDO1bD8M3wJq005HWWd_0aH6HKSJXCFE-xAAF/s1600/eclipse.png" /></a></div>
Donde descargaremos la versión classic(si necesitamos algo más podemos descargarlo después). Una vez hecho esto, solo se descomprime en cualquier ubicación(preferentemente en la raíz de C:/) y se ejecuta.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7mP0Si2bL7-TIovol2ewdUR36hhjlkKYubf0fwUPo20dWd2oCGs8cj-QtpxieQmf0O8GwMdeFvvbwix6_3vEaN1CzBs3Lc-YlnCabvAY0E5I3V1E32xX09lCiDgOVM8ZhnLUH2QMisjVj/s1600/Eclipsed.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="212" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi7mP0Si2bL7-TIovol2ewdUR36hhjlkKYubf0fwUPo20dWd2oCGs8cj-QtpxieQmf0O8GwMdeFvvbwix6_3vEaN1CzBs3Lc-YlnCabvAY0E5I3V1E32xX09lCiDgOVM8ZhnLUH2QMisjVj/s400/Eclipsed.png" width="400" /></a></div>
<br />
Con esto tenemos completa la instalación básica de nuestro entorno de desarrollo, espero que les sea de ayuda, sobre todo a los que apenas empiezan en esto de la programación.Alfredohttp://www.blogger.com/profile/04582406212707215212noreply@blogger.com0tag:blogger.com,1999:blog-4594083802314721454.post-12999230150071944812013-05-17T17:44:00.000-07:002016-10-24T11:40:06.432-07:00Instalar Driver Arduino Uno Windows 8 x64 [Error firma digital]<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">Hola a todos, hoy vengo de rápido a darles una solución que me estaba comiendo el coco, les cuento la historia: Sucede que el sábado anterior [11-May-13] me encontraba con mi equipo de proyecto en prácticas de la materia Principios Electrónicos y Aplicaciones Digitales, el Profr. Muy amable nos preparó practicas con un Sensor de Pulso y un Arduino, el material nos lo presto él. El problema fue cuando traté de ejecutar el programa de Arduino y no detectaba ningún dispositivo. Entré al administrador de dispositivos y efectivamente, Windows 8 [Penco] no había detectado al Sr. Arduino. Comentaron compañeros que les había sucedido lo mismo, que solo había que actualizar colocando como directorio "Driver" [Carpeta que esta dentro de la carpeta descomprimida de Arduino], ¡Sorpresa! Por más de 20 minutos de intentar jamás quedó. Al final lo hicimos en la computadora de una niña bonita *¬* y prometí hacerle un altar a su mini.</span></div>
<br />
<a name='more'></a><span style="font-family: "verdana" , sans-serif;"></span><br />
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">No se crean, como ya me había pasado con el famoso "ISE WEBPACK", mucho software tiene una <strike>Pinche</strike> mala compatibilidad con Windows 8 y más de 64 bits, me quedé intrigado de no poder hacer las prácticas y pues hoy aquí la solución.</span></div>
<span style="font-family: "verdana" , sans-serif;">
</span>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">Hoy 17-Mayo-13 por la tarde llegó por paquetería un Arduino que compramos con mi equipo, si se llegan a enterar me matan, pero tiene más de media hora que ya abrí la cajita y me dió por jugar con el:</span><br />
<span style="font-family: "verdana" , sans-serif;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidLE0IHhb2HbZR5zV5TGht60GOYfX0GtWF592jwZ1ZQIqa0BjlQ9bkw8YI1FQIcN9mYsrU1OZBeJgDInp12HpOee5-mPN-LWrZ-bOiYgJbkt8iU1onb3LwEuuCMqLHsxckT3azFXugEgw/s1600/ArduinoUNO.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="265" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEidLE0IHhb2HbZR5zV5TGht60GOYfX0GtWF592jwZ1ZQIqa0BjlQ9bkw8YI1FQIcN9mYsrU1OZBeJgDInp12HpOee5-mPN-LWrZ-bOiYgJbkt8iU1onb3LwEuuCMqLHsxckT3azFXugEgw/s320/ArduinoUNO.jpg" width="320" /></a></div>
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">Primero: Como voy a jugar si no funciona en mi Portatil, me puse a buscar y en un Foro que me hubiera gustado poner como fuente, encontré la solución. Tenía en mente poner como fuente al foro, en verdad, pero como te darás cuenta más adelante, tienes que reiniciar y no se me ocurrió ponerlo en Favoritos, <ni moyo>.</span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">Aquí la solución para poder hacer funcionar Arduino:</span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">1.- Abrir el cuadro de dialogo Ejecutar y escribir: "shutdown.exe /r /o /f /t 00"</span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwhiwXFurN5ypW0Ej0PbEE2BL7F-dpIDFtSBmS6pp2PyoUZchVTOr5OS_bfELUt9YLzyF8HZ4Uz4RfjBVWU1cTF_XCpHxITod3snieqn14BVSeJdfL8bFrs9Ih48_njyyPLJ7YY_ZMt-k/s1600/Cap1.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em; text-align: center;"><img border="0" height="164" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhwhiwXFurN5ypW0Ej0PbEE2BL7F-dpIDFtSBmS6pp2PyoUZchVTOr5OS_bfELUt9YLzyF8HZ4Uz4RfjBVWU1cTF_XCpHxITod3snieqn14BVSeJdfL8bFrs9Ih48_njyyPLJ7YY_ZMt-k/s320/Cap1.png" width="320" /></a></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">No te espantes, se va a comenzar a reiniciar tu PC.</span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">Nota: Mi Windows estaba en Inglés, el foro habla de que Windows solo se reinicia, mi Windows saco una serie de opciones que te muestro a continuación, si a ti no te aparecen y el Sistema Inicia directamente, omite el paso número 2.</span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">2.- Seleccionar las siguientes opciones: [En mi equipo están en Inglés, si es que aparecen en el tuyo puedes orientarte por medio de los iconos]</span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">a) Selecciona la Segunda Opción</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJkK9BwgQ1hE5ISbbkN2qlFC5G81P6fpYHpmipPUS4zz-hZuk3tVPdqP4a5dfH5ytfuSgPLOZOeH74mlOaFXW_JqZ6MU6tWhg9ol25TCynKhsrzbt9ubFR12PKROaLKugQUY9K_Ui1pbc/s1600/1.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"><span style="font-family: "verdana" , sans-serif;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgJkK9BwgQ1hE5ISbbkN2qlFC5G81P6fpYHpmipPUS4zz-hZuk3tVPdqP4a5dfH5ytfuSgPLOZOeH74mlOaFXW_JqZ6MU6tWhg9ol25TCynKhsrzbt9ubFR12PKROaLKugQUY9K_Ui1pbc/s320/1.jpg" width="320" /></span></a></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">b) Selecciona la tercera opción</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzXoP3i409vF-n3aY44Mur4aaIyDlgbEahd64JqmH9C-bMy7LFN_exptO4n6RjDePeL-6SnDauPGESSkBsfVxB6udj4RbazEtuAhn_ZseXHs523YEtGv_nuALKRY7oB4Ngmwjd0WGkkIM/s1600/2.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"><span style="font-family: "verdana" , sans-serif;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjzXoP3i409vF-n3aY44Mur4aaIyDlgbEahd64JqmH9C-bMy7LFN_exptO4n6RjDePeL-6SnDauPGESSkBsfVxB6udj4RbazEtuAhn_ZseXHs523YEtGv_nuALKRY7oB4Ngmwjd0WGkkIM/s320/2.jpg" width="320" /></span></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">c) Ahora la última</span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUF7OG8wRlH8YdsASw_09cHZDR-uuuyTOzdXre5vwvxZilf4AY9h9EmCfyFvrXiPA00Dd6VvwoZgd8wuJDmF0Tq64s0Hw5GJ0IR6lDVa2USAaXJxK9Qp5jUy6EPIFLlciiyiX1PotNa9I/s1600/3.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"><span style="font-family: "verdana" , sans-serif;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUF7OG8wRlH8YdsASw_09cHZDR-uuuyTOzdXre5vwvxZilf4AY9h9EmCfyFvrXiPA00Dd6VvwoZgd8wuJDmF0Tq64s0Hw5GJ0IR6lDVa2USAaXJxK9Qp5jUy6EPIFLlciiyiX1PotNa9I/s320/3.jpg" width="320" /></span></a></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">d) Clic en reiniciar [Restart] </span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2CVNDnCr0whyHcgu4ADR9yyzY1KugWsW1mHo1fBrqgaMqwkJMH3mCNNvobhHeCsPn1f6-aKLDjG_u3e3hnRB6ovL4ADKMaFg_2qO2E0awTc_sL-ywg-uL8K6ezmNn4ZYkd7BEhbC47hY/s1600/4.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"><span style="font-family: "verdana" , sans-serif;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh2CVNDnCr0whyHcgu4ADR9yyzY1KugWsW1mHo1fBrqgaMqwkJMH3mCNNvobhHeCsPn1f6-aKLDjG_u3e3hnRB6ovL4ADKMaFg_2qO2E0awTc_sL-ywg-uL8K6ezmNn4ZYkd7BEhbC47hY/s320/4.jpg" width="320" /></span></a></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">e) Ahora prende el equipo de nuevo y presiona en el teclado el numero 7 y listo inicia windows. </span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitXQo64wQidt7pTU4t67kcN5bpcO_tRv2P1CJyWZ4dBiosW1vLGCMwDfKetDW1pQwzkv1TiX_qNeHpWRYP0s9vQho-cUxTl89M4MFQbTvwM7c44fV1dyVY4Hyy3uUCVqhIub96vdIMg7k/s1600/5.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"><span style="font-family: "verdana" , sans-serif;"><img border="0" height="240" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEitXQo64wQidt7pTU4t67kcN5bpcO_tRv2P1CJyWZ4dBiosW1vLGCMwDfKetDW1pQwzkv1TiX_qNeHpWRYP0s9vQho-cUxTl89M4MFQbTvwM7c44fV1dyVY4Hyy3uUCVqhIub96vdIMg7k/s320/5.jpg" width="320" /></span></a></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">3.- Conecta el Arduino y abre el Administrador de dispositivos [Clic derecho en equipo] y localiza el dispositivo que no fue detectado correctamente por Windows, da clic derecho y elige actualizar. Debes elegir que usaras un directorio para realizar la instalación del driver [No buscar automáticamente] y elije el directorio "drivers" de tu carpeta Arduino [Supongo ya la deberías tener en tu equipo].</span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdcOFNoF5AvIGjJWbHBl7keuUVINEfGh80pRJwBW93kE8foEW99xO2ZBHy7AprDG_RCrjLM3K6aK7QFIr_gxPQL2JKX44qEylMJsawbXHh2qlzzP8rSWOwLAh02ctH6ReU2muZpv5JwwQ/s1600/Cap2.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"><span style="font-family: "verdana" , sans-serif;"><img border="0" height="237" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgdcOFNoF5AvIGjJWbHBl7keuUVINEfGh80pRJwBW93kE8foEW99xO2ZBHy7AprDG_RCrjLM3K6aK7QFIr_gxPQL2JKX44qEylMJsawbXHh2qlzzP8rSWOwLAh02ctH6ReU2muZpv5JwwQ/s320/Cap2.png" width="320" /></span></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">4.- Cuando detecte el driver te preguntará el sistema si deseas instalar un software de controlador, dale a la segunda opción: "Instalar este software de controlador de todas formas".</span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvPPQ7mGwZTT0CyzsiXxoYQSump2qs3HpJeSrLSBBZ4Bs9r6CYBhhhBZpnEP-9nxcxia_VoGs3Tj62G-EV31Q8-EpKWVjC0h0vLCTdXVEc1yA45Csu-CCme5IaFNrtds7GjtfmgCCVWWA/s1600/Cap3.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"><span style="font-family: "verdana" , sans-serif;"><img border="0" height="197" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgvPPQ7mGwZTT0CyzsiXxoYQSump2qs3HpJeSrLSBBZ4Bs9r6CYBhhhBZpnEP-9nxcxia_VoGs3Tj62G-EV31Q8-EpKWVjC0h0vLCTdXVEc1yA45Csu-CCme5IaFNrtds7GjtfmgCCVWWA/s320/Cap3.png" width="320" /></span></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">5.- Al finalizar simplemente de dice que se instaló correctamente :D y listo, quedó todo funcional para comenzar a jugar con tu nuevo juguetito. Normalmente usa el Puerto "COM3", a mi me colocó el "COM5", no te espantes, cuando utilices la aplicación de Arduino en la pestaña Herramientras puedes elegir el puerto de conexión.</span></div>
<div class="separator" style="clear: both; text-align: center;">
</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUjxbyxf0AcJnw2ejjCAfPm0jTO15WrkQGe1rj4K8udiMyq8o_S4OJzYSD89Md_kt9OpyymFUn6lyIHT51Tpr6Apto8f3P-aIceNHIC2NetLH8R-7iezigcZRTtxWXVThkWP6wOOD5_KU/s1600/Cap5.png" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em; text-align: justify;"><span style="font-family: "verdana" , sans-serif;"><img border="0" height="170" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhUjxbyxf0AcJnw2ejjCAfPm0jTO15WrkQGe1rj4K8udiMyq8o_S4OJzYSD89Md_kt9OpyymFUn6lyIHT51Tpr6Apto8f3P-aIceNHIC2NetLH8R-7iezigcZRTtxWXVThkWP6wOOD5_KU/s320/Cap5.png" width="320" /></span></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: "verdana" , sans-serif;">Bueno muchachones y muchachonas, este cuento se acabó, espero sea de ayuda está publicación, recuerda comentar tus dudas o compartir la información, saludos y hasta la próxima.</span></div>
Jesús Alberto Sánchez Tecalcohttp://www.blogger.com/profile/05416570182548174207noreply@blogger.com10tag:blogger.com,1999:blog-4594083802314721454.post-29795584619468902622013-04-03T11:26:00.003-07:002013-04-03T11:32:27.631-07:00Otra MiniCalculadora con Tkinter [Python]<div style="text-align: justify;">
Bueno Señores, de nuevo de regreso, me desaparezco por mucho
tiempo aveces, ¿verdad?, bueno... hoy les quiero presentar una pequeña
aplicación para hacer sumas, restas, multiplicaciones y divisiones. Si otra vez
una calculadora, lo siento, no se me ocurre otra cosa, pero siempre hago una
cuando hago uso de un lenguaje de programación que desconozco, es la mejor
forma de experimentar. Si ya visitaste mis post anteriores has de preguntar:
¿Otra Calculadora en Python? jeje bueno la respuesta es si, pero en esta ocasión vamos
a usar un GUI.</div>
<div>
<div style="text-align: justify;">
<br />
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
GUI son las siglas de interfaz gráfica de usuario. Son
herramientas para crear interfaces gráficas, esto es, componentes gráficos con
los cuales el usuario interacciona con la aplicación.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
En mi caso les hablare de Tkinter: Es
un binding de la biblioteca gráfica Tcl/Tk para
el lenguaje de programación Python. Se considera un estándar para
la interfaz gráfica de usuario (GUI) para Python y es el que viene
por defecto con la instalación para Microsoft Windows.<o:p></o:p></div>
<div class="MsoNormal">
<br />
Si a continuación mi ejemplo no te gusta y dices que Tkinter no es lo tuyo
existen más alternativas disponibles como <a href="http://es.wikipedia.org/wiki/WxPython" title="WxPython">wxPython</a>, <a href="http://es.wikipedia.org/wiki/PyQt" title="PyQt">PyQt</a> y <a href="http://es.wikipedia.org/wiki/PyGTK" title="PyGTK">PyGTK</a> que
cumplen con todos los estándares de componente visual.<o:p></o:p></div>
<div class="MsoNormal">
<br /></div>
<div class="MsoNormal">
[Algunas de las definiciones anteriores fueron tomadas de
nuestra amiga Wikipedia]<o:p></o:p></div>
<div class="MsoNormal">
<br />
Cuidado en versiones como Python 2.7 es Tkinter en la versión 3 se usa tkinter
[Minúsculas]<o:p></o:p></div>
<div class="MsoNormal">
<br />
En el ejemplo siguiente hago uso de 3 Widgets, así se le llaman a los
controles que nosotros conocemos en otros lenguajes como botones, cajas de
texto, etc.</div>
<div class="MsoNormal">
</div>
<ul style="text-align: start;">
<li style="text-align: justify;"><span style="font-family: inherit; line-height: 24px;">Label: Etiquetas</span></li>
<li style="text-align: justify;"><span style="font-family: inherit; line-height: 24px;">Button: Botones</span></li>
<li style="text-align: justify;"><span style="font-family: inherit; line-height: 24px;">Entry: Cajas de texto [Existe un elemento Text pero no es precisamente el que nosotros imaginamos]</span></li>
</ul>
<br />
<br />
<span style="font-family: inherit; line-height: 24px;">Ahora si, aquí mi código, creo que no será necesaria una explicación, está muy fácil de entender, aunque para reforzar checa los comentarios:</span></div>
</div>
<div>
<div style="text-align: justify;">
<span style="font-family: inherit;"><br /></span></div>
</div>
<textarea cols="60" rows="10">#Importaciones necesarias...
from Tkinter import *
import tkMessageBox
#Metodo para calcular la suma
def Suma():
n1=float(caja1.get())
n2=float(caja2.get())
suma=n1+n2
tkMessageBox.showinfo("Mensaje","El resultado es: %.2f"%suma)
caja1.delete(0,20)
caja2.delete(0,20)
#Metodo para calcular la resta
def Resta():
n1=float(caja1.get())
n2=float(caja2.get())
suma=n1-n2
tkMessageBox.showinfo("Mensaje","El resultado es: %.2f"%suma)
caja1.delete(0,20)
caja2.delete(0,20)
#Metodo para calcular la multiplicacion
def Multiplicacion():
n1=float(caja1.get())
n2=float(caja2.get())
suma=n1*n2
tkMessageBox.showinfo("Mensaje","El resultado es: %.2f"%suma)
caja1.delete(0,20)
caja2.delete(0,20)
#Metodo para calcular la division
def Division():
n1=float(caja1.get())
n2=float(caja2.get())
suma=n1/n2
tkMessageBox.showinfo("Mensaje","El resultado es: %.2f"%suma)
caja1.delete(0,20)
caja2.delete(0,20)
#Creacion del GUI
gui = Tk()
#Titulo del GUI
gui.title("MiniCalculadora")
#Dimensiones (ancho,alto,posicion x,posicion y)
gui.geometry("400x250+400+200")
#Creacion de una etiqueta
var1 = StringVar()
var1.set("Escribe el primer numero:")
label1 = Label(gui,textvariable=var1,height = 2)
label1.pack()
#Creacion de una caja de texto para el primer numero
numero1=StringVar()
caja1=Entry(gui,bd=4,textvariable=numero1)
caja1.pack()
#Creacion de otra etiqueta
var2 = StringVar()
var2.set("Escribe el segundo numero:")
label2 = Label(gui,textvariable=var2,height = 2)
label2.pack()
#Creacion de otra caja de texto para el segundo numero
numero2=StringVar()
caja2=Entry(gui,bd=4,textvariable=numero2)
caja2.pack()
#Boton para la suma
boton1 = Button(gui, text = "Suma", command = Suma,width=15)
boton1.pack()
#Boton para la resta
boton2 = Button(gui, text = "Resta", command = Resta,width=15)
boton2.pack()
#Boton para multiplicacion
boton3 = Button(gui, text = "Multiplicacion", command = Multiplicacion,width=15)
boton3.pack()
#Boton para la division
boton4 = Button(gui, text = "Division", command = Division,width=15)
boton4.pack()
#Cargar el GUI
gui.mainloop()</textarea><span style="font-family: inherit;">
</span><br />
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><br /></span>
<br />
<div>
<span style="font-family: inherit; line-height: 24px;">Una captura :D</span><br />
<span style="font-family: inherit; line-height: 24px;"><br /></span></div>
<span style="font-family: inherit;"><br /></span>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrp9gyFryFhC_auO_DkW_hS_zawNiayNf4ZTr2SK8cUKNhDtDYYkEdZUlaC6Q-ut1lIp6_mAe6aJcBcu7ikZQJPhiFu6temS4Ozh9mTUbuzQ61_AHMa0-ak65iurOTinvce7zThZ8MZ4E/s1600/Cap1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><span style="font-family: inherit;"><img border="0" height="222" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhrp9gyFryFhC_auO_DkW_hS_zawNiayNf4ZTr2SK8cUKNhDtDYYkEdZUlaC6Q-ut1lIp6_mAe6aJcBcu7ikZQJPhiFu6temS4Ozh9mTUbuzQ61_AHMa0-ak65iurOTinvce7zThZ8MZ4E/s320/Cap1.jpg" width="320" /></span></a></div>
<span style="font-family: inherit;"><br /></span>
<span style="font-family: inherit;"><br /></span>
<br />
<div>
<div style="text-align: justify;">
<span style="font-family: inherit; line-height: 24px;">Si gustas aprender más acerca de los Widgets te recomiendo esta web: <b><a href="http://www.tutorialspoint.com/python/python_gui_programming.htm">Python_gui_programming</a></b></span></div>
<div style="text-align: justify;">
<span style="font-family: inherit; line-height: 24px;"><br /></span></div>
<div style="text-align: justify;">
<span style="font-family: inherit; line-height: 24px;">Te deseo un excelente día y espero mi publicación te sea de utilidad, no olvides comentar tus dudas, regaños u opiniones, +1 o like :P </span></div>
</div>
<div>
</div>
Jesús Alberto Sánchez Tecalcohttp://www.blogger.com/profile/05416570182548174207noreply@blogger.com13tag:blogger.com,1999:blog-4594083802314721454.post-90472743584524425542013-03-14T16:49:00.000-07:002013-03-14T22:16:15.131-07:00Eliminar Wine (Por completo)<div style="text-align: justify;">
</div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;">Hola a todos,
pues hoy les traigo la solución a un problema muy común y al que yo
en lo particular tuve que darle muchas vueltas hasta lograrlo. Y es
que una característica del manejo de sistemas Linux, es la poca
compatibilidad con software propietario ya que su apertura es muy
limitada. Por lo anterior que tenemos que recurrir a software abierto
aunque algunas veces de menor calidad.</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><br /></span></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDzJEq0w_KYXj_Pbvcl8Uu8rLzNBduSiqPnIGSg6cBwhuhv0CsZENGA4o7XiWsvCrTs2InlA1tkVq9ztvfkKBXS5A9BQz6EoKo_3LpWiDKM34UD30jS0zhWbxmq_NeiiG_J3eOtdetv8u1/s1600/winehq_logo_glass.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhDzJEq0w_KYXj_Pbvcl8Uu8rLzNBduSiqPnIGSg6cBwhuhv0CsZENGA4o7XiWsvCrTs2InlA1tkVq9ztvfkKBXS5A9BQz6EoKo_3LpWiDKM34UD30jS0zhWbxmq_NeiiG_J3eOtdetv8u1/s320/winehq_logo_glass.png" width="204" /></a></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><br />
</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;">Por otro lado
se han desarrollado opciones para poder manejar este tipo de
problemas, como el uso de maquinas virtuales o software que funciona
como interfaz como Wine. Uno de los problemas con este último es no
nos asegura la compatibilidad con todo el software y en algunos caso
es necesario hacerle algunas modificaciones para mejorar el
funcionamiento.</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><br />
</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;">Considerando
ésto muchas veces y después de muchas pruebas nos vemos en la
situación de tener que eliminar por completo el paquete wine. Y si
nos ponemos a revisar por Internet veremos varias opciones sin
embargo al ejecutarlas eliminaremos sólo parte de los paquetes, pero
después de revisar el menú de aplicaciones veremos que los accesos
se mantienen activos y en algunos casos funcionales. </span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><br />
</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><br />
</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;">Para evitar
el problema anterior les pongo aquí los pasos para eliminar por
completo del sistema los paquetes de wine. </span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><br />
</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><br />
</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;">Primero
eliminaremos los archivos que genera wine en el sistema:</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><br />
</span></div>
<div style="margin-bottom: 0cm;">
<span style="color: #333333; font-family: inherit;"><span style="background: #f7f6ff;">$sudo
yum remove wine</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><br />
</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;">Después de
eso, eliminamos las carpetas de manera manual </span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><br />
</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><span style="color: #333333;"><span style="background: #f7f6ff;">$</span></span><span style="color: #333333;"><span style="background: #f7f6ff;">rm
-rf $HOME/.wine</span></span></span></div>
<span style="font-family: inherit;"><span style="color: black;"><span style="color: #333333;"><span style="background: #f7f6ff;">$rm -f
$HOME/.config/menus/applications-merged/wine*</span></span></span></span><br />
<span style="font-family: inherit;"><span style="color: black;"><span style="color: #333333;"><span style="background: #f7f6ff;">$rm -rf
$HOME/.local/share/applications/wine</span></span></span></span><br />
<span style="font-family: inherit;"><span style="color: black;"><span style="color: #333333;"><span style="background: #f7f6ff;">$rm -f
$HOME/.local/share/desktop-directories/wine*</span></span></span></span><br />
<span style="font-family: inherit;"><span style="color: black;"><span style="color: #333333;"><span style="background: #f7f6ff;">$rm
-f $HOME/.local/share/icons/????_*.xpm</span></span></span></span><br />
<br />
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><br />
</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;">Hasta el
momento se han eliminado las aplicaciones que teníamos en las
carpetas de wine y algunas configuraciones. Sin embargo el núcleo de
wine aún se encuentra activo, pues si vamos al menú de aplicaciones
encontraremos los accesos directos y funcionando. Para eliminar el
nucleo usaremos:</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><br />
</span></div>
<div style="margin-bottom: 0cm;">
<span style="color: #333333; font-family: inherit;"><span style="background: #f7f6ff;">$yum
remove wine-core</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><br />
</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;">Una vez
eliminado el núcleo, eliminaremos el resto de paquetes del
sistema(sólo son fuentes ¿para qué las queremos?)</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><br />
</span></div>
<div style="margin-bottom: 0cm;">
<span style="color: #333333; font-family: inherit;"><span style="background: #f7f6ff;">$yum
remove wine-courier-fonts.noarch wine-filesystem.noarch
wine-marlett-fonts.noarch wine-mono.noarch
wine-ms-sans-serif-fonts.noarch wine-small-fonts.noarch
wine-symbol-fonts.noarch wine-system-fonts.noarch wine-systemd.noarch
wine-tahoma-fonts.noarch</span></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><br />
</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><br /></span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;">Con eso es suficiente para eliminar wine por completo, y en caso de ser necesario hacer una reinstalación completa. Otra cosa es que el proceso aquí descrito es para Distribuciones basadas en RHEL, pero el los archivos son iguales en cualquier distribución, por lo que el cambio sólo rádica en el sistema gestor de paquetes.</span></div>
<div style="margin-bottom: 0cm;">
<span style="font-family: inherit;"><br />
</span></div>
<div style="margin-bottom: 0cm;">
<br /></div>
<br />
<div>
<br /></div>
Alfredohttp://www.blogger.com/profile/04582406212707215212noreply@blogger.com0tag:blogger.com,1999:blog-4594083802314721454.post-2530017049426455712013-03-13T15:57:00.003-07:002016-10-24T11:39:24.091-07:00Lee tu correo con facilidad en Thunderbird<div style="text-align: justify;">
Hola a todos. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Después de haber dejado el blog por un rato estoy de vuelta esta vez prometo tener más constancia en lo que les presente aquí. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Bien, ahora lo principal de este post. ¿Cuántas veces no hemos dado de topes al tener múltiples cuentas de correo electrónico? y es que el hecho de tener varias cuentas de correo significa que debemos tener diferentes contraseñas(lo que sería lo más recomendable), otro problema es que muchas veces no recordamos cual de todas esas cuentas es la que dimos de alta en las páginas o en que cuenta recibiremos algún correo de importancia.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Todo lo anterior, hace necesario que cada vez que esperemos un correo tengamos que abrir cada cuenta por separado lo que al final se vuelve algo poco práctico. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La solución principal, quizá sería utilizar sólo una cuenta de correo. Sin embargo, por diferentes cuestiones llega a ser necesario tener múltiples cuentas como seguridad, necesidad laboral, o querer mantener un correo personal y otro para cuestiones profesiolnales.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Pues bien, para lidiar con ésto existen diversos gestores de correo electrónico los cuales son muy útiles pues permiten manejar diferentes cuentas de correo en una sola interfaz. El día de hoy les hablaré sobre el que desde mi punto de vista es uno de los mejores gestores de correo electrónico que existen que es <a href="http://www.mozilla.org/es/thunderbird/" target="_blank">Mozilla Thunderbird</a>. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://www.mozilla.org/en-US/thunderbird/" style="margin-left: 1em; margin-right: 1em;" target="_blank"><img height="200" src="https://www.muylinux.com/wp-content/uploads/2012/03/Thunderbird.jpg" width="200" /></a></div>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Y es que dentro de las principales ventajas es que es una implementación completamente libre (GRATIS), lo anterior no significa que el software pierda cualidades, pues la interfaz se encuentra muy bien cuidada lo que permite una gran fluidez en su uso por lo que no es necesario ser un experto en computadoras para utilizarlo. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Otra de las ventajas es que existe una gran cantidad de información con respecto a su uso. Y para aquellos que gustan de personalizar las aplicaciones, existe una gran diversidad de complementos y temas que permiten mejorar la experiencia de uso.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1RDhQRIdz73ribeVjKFc8QINPDQjIL8U3u-RzPbeBKwrA4E3E5Wyt0XQFy7uoFSVujwq38jFiIJRUbF4l4qqP17jEW1jmfgb5HpUhOkVHqphuaVMU1ChbHN8tZb9R8iJUXnDHRuuZV2uX/s1600/Thunderbird.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="223" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh1RDhQRIdz73ribeVjKFc8QINPDQjIL8U3u-RzPbeBKwrA4E3E5Wyt0XQFy7uoFSVujwq38jFiIJRUbF4l4qqP17jEW1jmfgb5HpUhOkVHqphuaVMU1ChbHN8tZb9R8iJUXnDHRuuZV2uX/s400/Thunderbird.png" width="400" /></a></div>
<br /></div>
<div style="text-align: justify;">
Además, entre sus cualidades esta la capacidad de añadir cuentas de chat como Facebook(Donde por cierto sin duda se encuentran la mayoría de nuestros contactos) evitándonos la tentación de ver fotos o adentrarnos en biografías, Google Talk que aunque en crecimiento también con una gran cantidad de usuarios, Twitter, Etc.<br />
<br />
Pero llendo hacia el punto principal, que es la gestión de correo electrónico, Thunderbird nos permite realizar búsquedas con gran precisión y nos permite clasificar los correos mediante diversas herramientas. de tal manera que es díficil perderse entre tantos correos.<br />
<br />
Bien, pues esta es la aportación de hoy, espero que la disfruten y que les haga la vida más fácil. XD<br />
<br /></div>
Alfredohttp://www.blogger.com/profile/04582406212707215212noreply@blogger.com0tag:blogger.com,1999:blog-4594083802314721454.post-8824195708748570992013-02-25T10:29:00.002-08:002014-07-30T09:17:35.754-07:00Instalación de Python/Ninja-IDE y Librerías Extras<div style="text-align: justify;">
Hola a todos, estoy de regreso solo por un momento, la publicación actual es para proporcionar las ligas para obtener el software necesario para realizar la instalación de Python sobre Windows así como algunos complementos.</div>
<div style="text-align: justify;">
<br /></div>
<a name='more'></a><div style="text-align: justify;">
Los procesos de instalación no los compartiré por completo, para todos los programas es igual, además si lees esto espero ya seas un usuario avanzado o si no lo eres y tienes dudas déjalas en un comentario.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<b>Primero</b> debemos realizar la instalación de Python, yo recomiendo la versión 2.7.3 que es la que uso y me es compatible con mi IDE favorito que más adelante te enseñaré a instalar.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="background-color: black; color: white; font-family: Arial, Helvetica, sans-serif; font-size: large;"><a class="reference external" href="http://www.python.org/ftp/python/2.7.3/python-2.7.3.msi" style="background-color: white; border-bottom-color: rgb(204, 204, 204); border-bottom-style: dashed; border-bottom-width: 1px; font-family: Arial, Verdana, Geneva, 'Bitstream Vera Sans', Helvetica, sans-serif; font-size: 15px; line-height: 21px; text-decoration: initial;"><b>Python 2.7.3 Windows Installer</b></a><span style="line-height: 21px;"> </span></span></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La instalación se realiza normal, deja como directorio de destino el Disco Local C [Particion Principal] que la cual al terminar la instalación debería de aparecer una carpeta <i>Python27.</i></div>
<br />
<div style="text-align: justify;">
<b>Segundo </b>ahora comenzamos a realizar la instalación de Ninja-IDE un Entorno de Desarrollo para Python muy bueno con el cual me he encariñado mucho, si no deseas usarlo puedes omitir estos pasos.</div>
<br />
<div style="text-align: justify;">
<span style="background-color: rgba(255, 255, 255, 0.0588235); color: white; cursor: pointer; font-family: Arial, Helvetica, sans-serif; font-size: large; line-height: 18px; outline-width: 0px; text-decoration: initial;"><b><a href="https://github.com/downloads/ninja-ide/ninja-ide/ninja-ide2.1.1-wininstaller.zip" style="background-color: rgba(255, 255, 255, 0.0588235); cursor: pointer; line-height: 18px; outline-width: 0px; text-decoration: initial;">Ninja IDE v2.1.1</a></b></span></div>
<br />
<div style="text-align: justify;">
Para que se pueda trabajar tranquilamente en el ambiente de Ninja IDE debemos realizar una única configuración, que es indicar al software donde se encuentra el archivo "Python" para que trabaje con el. Para dicha configuracion abre el IDE y en el menú <u>Edit</u> accede a <u>Preferences</u> en el cual deberias encontrar una cuadro como el siguiente:</div>
<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhNF-55k6tZwgERsJsKWObNnnt5beokReUCMCxxji417da_BH3UsoOIrrI7KhWK8cv7ZplbtNlufPoCDw2V04iSZWz_MKDBdG74jmia4wivVZKd1U2oiHPs6LJwt66VrwKWE1QYwnkxcY/s1600/Captura1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjhNF-55k6tZwgERsJsKWObNnnt5beokReUCMCxxji417da_BH3UsoOIrrI7KhWK8cv7ZplbtNlufPoCDw2V04iSZWz_MKDBdG74jmia4wivVZKd1U2oiHPs6LJwt66VrwKWE1QYwnkxcY/s320/Captura1.jpg" height="320" width="319" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
En las pestañas General -> Execution hay un cuadro de texto con una leyenda "Python Path" ahí hay un botón [Flecha amarilla] donde vamos a dar clic y en el siguiente cuadro que aparezca buscaremos el archivo C:/Python27/python.exe, lo elegimos y guardamos cambios dando clic en Save.</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Nota: Para probar el funcionamiento crea un archivo nuevo escribe:</div>
<div class="separator" style="clear: both; text-align: justify;">
print "Hola"</div>
<div class="separator" style="clear: both; text-align: justify;">
Guarda el archivo con algún nombre y presiona CTRL+F6 [Combinación para correr el archivo actual], abajo en pantalla debería aparecer como resultado: Hola</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<b>Tercero </b>comenzamos con la descarga e instalación de algunas librerías extras por ejemplo:</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="http://www.lfd.uci.edu/~gohlke/pythonlibs/by6jemb8/numpy-MKL-1.7.0.win32-py2.7.exe" title="[11.7 MB] [Python 2.7] [32 bit] [Feb 19, 2013]"><b><span style="background-color: black; color: white; font-family: Arial, Helvetica, sans-serif; font-size: large;">Numpy</span></b></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para comprobar si la instalación se realizo correctamente crea un archivo de texto con el siguiente códico</div>
<br />
<textarea cols="60" rows="5">try:
import numpy
print "Soy numpy y estoy instalado :)"
except ImportError:
print "Soy numpy y no estoy instalado :("</textarea>
<br />
<div class="separator" style="clear: both; text-align: left;">
<b><span style="color: blue; font-family: Arial, Helvetica, sans-serif; font-size: x-small;"><br /></span></b></div>
<div class="separator" style="clear: both; text-align: left;">
Si te puso carita feliz ya la hiciste, si no salio cara triste, vuelve a instalar y comprueba que la ruta sea en la carpeta de python</div>
<div class="separator" style="clear: both; text-align: left;">
<b><span style="color: blue; font-family: Arial, Helvetica, sans-serif; font-size: x-small;"><br /></span></b></div>
<div class="separator" style="clear: both; text-align: left;">
<a href="http://downloads.sourceforge.net/project/scipy/scipy/0.12.0b1/scipy-0.12.0b1-win32-superpack-python2.7.exe?r=http%3A%2F%2Fsourceforge.net%2Fprojects%2Fscipy%2Ffiles%2F&ts=1361815072&use_mirror=superb-dca2"><b><span style="background-color: black; color: white; font-family: Arial, Helvetica, sans-serif; font-size: large;">Scipy</span></b></a></div>
<div class="separator" style="clear: both; text-align: left;">
<b><span style="color: blue; font-family: Arial, Helvetica, sans-serif; font-size: x-small;"><br /></span></b></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
Para comprobar si la instalación se realizo correctamente edita el archivo anterior con el siguiente código<br />
<br />
<textarea cols="60" rows="5">try:
import scipy
print "Soy scipy y estoy instalado :)"
except ImportError:
print "Soy scipy y no estoy instalado :("</textarea><br />
<div class="separator" style="clear: both;">
<b><span style="color: blue; font-family: Arial, Helvetica, sans-serif; font-size: x-small;"><br /></span></b></div>
<div class="separator" style="clear: both;">
Si te puso carita feliz ya la hiciste de nuevo, si no salio cara triste ya sabes que hacer...</div>
<br />
<div class="separator" style="clear: both; text-align: left;">
<a href="http://downloads.sourceforge.net/project/matplotlib/matplotlib/matplotlib-1.2.0/matplotlib-1.2.0.win32-py2.7.exe?r=http%3A%2F%2Fwww.blogger.com%2Fblogger.g%3FblogID%3D4594083802314721454&ts=1361815229&use_mirror=voxel" style="line-height: 21px;"><b><span style="background-color: black; color: white; font-family: Arial, Helvetica, sans-serif; font-size: large;">Matplotlib</span></b></a></div>
<div class="separator" style="clear: both; text-align: left;">
<b><br /></b></div>
<div class="separator" style="clear: both; text-align: left;">
</div>
Después de instalar este es el último y comprueba de la misma forma que los anteriores:<br />
<br />
<textarea cols="60" rows="5">try:
import matplotlib
print "Soy matplotlib y estoy instalado :)"
except ImportError:
print "Soy matplotlib y no estoy instalado :("</textarea><br />
<div class="separator" style="clear: both;">
<b><span style="color: blue; font-family: Arial, Helvetica, sans-serif; font-size: x-small;"><br /></span></b></div>
<div class="separator" style="clear: both;">
Listo, así termina esta pequeña publicación que espero y les sea de utilidad :D Cuidense.</div>
<div class="separator" style="clear: both;">
<br /></div>
<div class="separator" style="clear: both;">
Nota: Tu tarea es identificar las librerías extras e investigar cual es su funcionamiento :D.</div>
Jesús Alberto Sánchez Tecalcohttp://www.blogger.com/profile/05416570182548174207noreply@blogger.com11tag:blogger.com,1999:blog-4594083802314721454.post-20362610174604209442013-02-03T16:07:00.000-08:002013-02-03T16:07:12.987-08:00Chux MiniCalculadora [C#]<div style="text-align: justify;">
Hola Hola, edición especial de esta publicación jeje Domingo de programada, el día esta feo, estamos en casa, entonces dije: -¿Por qué no programar?. La idea fue una Mini Calculadora en Java pero, ya <strike>chole </strike>cansa tanto Java, así mejor opté por usar C# con Visual Studio.</div>
<div style="text-align: justify;">
<br /></div>
<a name='more'></a><div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Muy internamente se ha creado un String en el cual se van capturando todos los valores que se están escribiendo al momento</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>private String operaciones;</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En el constructor de la clase se inicializa el valor de operaciones:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>operaciones="";</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La función de esta aplicación es muy fácil de entender lo único que hago es con los botones de números ir agregando el valor de la caja de texto su valor actual mas el del número que se presiona. Esto aplica cuando se presiona el 1.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>txtoperaciones.Text = txtoperaciones.Text + "1";</i></div>
<div style="text-align: justify;">
<i>operaciones = operaciones + "1";</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Cuando se da clic en una operación se limpia la caja y coloco un símbolo "#" al String para separar una cantidad con otra.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i> operaciones = operaciones + "#+#";</i></div>
<div style="text-align: justify;">
<i> limpiarOperaciones(); //Limpia la caja de texto</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Al final de varias operaciones podrias obtener algo raro en el String como esto:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>5#+#8#-#5</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Cuando das clic en el simbolo de igual para saber el resultado se realiza lo siguiente:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<textarea cols="60" rows="10">char simbolo = '#';
String[] elementos=operaciones.Split(simbolo);
float operacion_ant = float.Parse(elementos[0]);
for(int n=1;n<elementos.Length;n++)
{
switch (elementos[n])
{
case "+":
operacion_ant = operacion_ant + float.Parse(elementos[n + 1]);
break;
case "-":
operacion_ant = operacion_ant - float.Parse(elementos[n + 1]);
break;
case "*":
operacion_ant = operacion_ant * float.Parse(elementos[n + 1]);
break;
case "/":
operacion_ant = operacion_ant / float.Parse(elementos[n + 1]);
break;
}
}
txtoperaciones.Text = operacion_ant.ToString();
</textarea>
</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Se crear una variable char con el símbolo # como valor para después en un arreglo [elementos] se guarda cada uno de los elementos separados por #, esto con el método Split, el ejemplo anterior generaría el siguiente arreglo:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>elementos[0]=5</i></div>
<div style="text-align: justify;">
<i>elementos[1]=+</i></div>
<div style="text-align: justify;">
<i>elementos[2]=8</i></div>
<div style="text-align: justify;">
<i>elementos[3]=-</i></div>
<div style="text-align: justify;">
<i>elementos[4]=5</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ahora dentro de un ciclo que va aumentando de 1 en 1 comenzando desde 1 hasta que sea menor al tamaño del arreglo, dentro del for se analiza las operaciones que hay [Si te das cuenta las operaciones siempre comenzaran de 1 y encontraras una diferente cada 2 elementos, es decir, en el indice 1,3,5,7,...] y con switch tomaremos la decisión de que si es un + se realice una suma de la variable operacion_ant y el siguiente valor, mas fácil con dicho ciclo que explico el proceso que generaría sería el siguiente:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>operacion_ant=5</i></div>
<div style="text-align: justify;">
<i>operacion_ant=operacion_ant+8</i></div>
<div style="text-align: justify;">
<i>operacion_ant=13</i></div>
<div style="text-align: justify;">
<i>operacion_ant=operacion_ant-5</i></div>
<div style="text-align: justify;">
<i>operacion_ant=8</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Nota: float.parse( elemento ) se usa para convertir un texto a flotante [Un String no se puede trabajar como número].</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Al final del ciclo se tiene el resultado y este se refleja en la caja de texto y se limpia el valor del String con el que se comenzó.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Ahora una captura del diseño:</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjez6yiWAQ91AS-096iTZHsbTA1F_PdT64m2ZzlRX4ZkrJTM2k0WhAbUWDhXpFaOkHvRiFls-vFtfOuXHyFq5hZyvTqLWJunFOrUmFNRdJ3UIkcaOG5fT3jnOWTzZz1dwEpfijqHng8rQw/s1600/Cap1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="320" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjez6yiWAQ91AS-096iTZHsbTA1F_PdT64m2ZzlRX4ZkrJTM2k0WhAbUWDhXpFaOkHvRiFls-vFtfOuXHyFq5hZyvTqLWJunFOrUmFNRdJ3UIkcaOG5fT3jnOWTzZz1dwEpfijqHng8rQw/s320/Cap1.jpg" width="271" /></a></div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Si deseas el proyecto para más información puedes descargarlo de la siguiente liga: <a href="http://www.mediafire.com/?ecf51sepzq3n0if">MiniCalculadora.rar</a></div>
<br />Jesús Alberto Sánchez Tecalcohttp://www.blogger.com/profile/05416570182548174207noreply@blogger.com0tag:blogger.com,1999:blog-4594083802314721454.post-31958964729853958662013-01-31T09:24:00.000-08:002013-01-31T09:29:39.548-08:00Crear una Página WEB de Broma [PHP]<div style="text-align: justify;">
Hola a todos, un saludo, de nuevo ya me encontraba desaparecido, estoy de regreso... hoy traigo para ustedes una publicación donde pueden aprender a crear paginas web de broma. Yo no me hago responsable del uso que se le de a esta publicación, aunque también comprenderás el porqué de muchos fraudes.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
¿Qué necesitas?</div>
<ul>
<li style="text-align: justify;">Azúcar, flores y muchos colores... ¡jem!</li>
<li style="text-align: justify;">Servidor Local ("WAMP o XAMP o LAMP o Apache/PHP")</li>
<li style="text-align: justify;">Editor de Texto (Notepad, Notepad++, Sublime Text)</li>
<li style="text-align: justify;">Un navegador</li>
<li style="text-align: justify;">Ganas de trabajar con códigos</li>
</ul>
<div style="text-align: justify;">
<br />
<a name='more'></a>Para comenzar debes elegir una pagina ya existente que desees clonar, por ejemplo facebook, accede a dicha página y da un clic derecho sobre ella y admira su honorable código, copialo completo y pégalo en un archivo de texto posteriormente guárdalo en tu carpeta local (En WAMP "www") con el nombre "index.php".</div>
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgW4euhlb6mofHXjOoYNstJ00KqUNDD7mWhIW7mqH6hV7L1GVo2XIfS_DW51XQ0wcd1jZdoFQQiwd6XaaCD_MVCvxLY4J4ucYpFAsC5Zz5KXDlEV3wMl75WFys9-KGWVcZdKvbY0qEISSk/s1600/Cap1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="185" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEgW4euhlb6mofHXjOoYNstJ00KqUNDD7mWhIW7mqH6hV7L1GVo2XIfS_DW51XQ0wcd1jZdoFQQiwd6XaaCD_MVCvxLY4J4ucYpFAsC5Zz5KXDlEV3wMl75WFys9-KGWVcZdKvbY0qEISSk/s320/Cap1.jpg" width="320" /></a></div>
<br />
Ahora, si corres tu servidor local, abres tu navegador y escribes: "localhost" o "127.0.0.1" debería aparecer la página de facebook, ¡Felicidades! la primera parte está lista:<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO9KL0wC7CphIYVwg8nKC0MDsgiBic6U5Q48XV4ApkiN7k1T7iqobxplEfVhfUSb9SMzbwf802tlYGuZxAwCloGCV8LZh0OUAtm98ejzSXEDymMculh32YNnVO_QBt8A02vqa7p8GdF1M/s1600/Cap2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiO9KL0wC7CphIYVwg8nKC0MDsgiBic6U5Q48XV4ApkiN7k1T7iqobxplEfVhfUSb9SMzbwf802tlYGuZxAwCloGCV8LZh0OUAtm98ejzSXEDymMculh32YNnVO_QBt8A02vqa7p8GdF1M/s320/Cap2.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Desde una primera vista se ve que es falso jeje pero bueno ese es tu trabajo, como hacer que desaparescan esos signos raros... ahora, lo que nos cruje es identificar en el código donde se crearon las cajas de texto de "usuario" y "contraseña", para eso nos vamos a ir al editor nos colocamos antes de la primera letra del código y vamos a usar la opción de buscar, -¿Qué vamos a buscar? -Pues el texto "text".</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Nota: En Notepad++ la opción de buscar esta en el menú buscar, úsala como se muestra a continuación:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0QOwMm7uH8I9VNj3oBlOzLNiXUAxAgGkNtQqBuOT61y5Mu5k8uXrzS9mH_VQuaHk9z5kMJZXLLFsKH_7dmV-kH8Xo5WuosY41NMwytFLLPXjnAj45W554yaSYAeWBNf7h7NEzTXaq_qs/s1600/Cap3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="179" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEh0QOwMm7uH8I9VNj3oBlOzLNiXUAxAgGkNtQqBuOT61y5Mu5k8uXrzS9mH_VQuaHk9z5kMJZXLLFsKH_7dmV-kH8Xo5WuosY41NMwytFLLPXjnAj45W554yaSYAeWBNf7h7NEzTXaq_qs/s320/Cap3.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
¿Te preguntaras por qué buscamos la palabra text? Bueno, lo que sucede es que en HTML para crear una caja de texto se usa el siguiente código:</div>
<div class="separator" style="clear: both; text-align: left;">
<input type="text" ...</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: left;">
Entonces para lo que nosotros necesitamos hacer debemos: </div>
<div class="separator" style="clear: both; text-align: left;">
*Localizar el nombre del objeto </div>
<div class="separator" style="clear: both; text-align: left;">
o</div>
<div class="separator" style="clear: both; text-align: left;">
*Ponerle un nombre</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Para lo anterior se usa una propiedad que se llama "name", desplazate lentamente a la derecha de donde te dejo la busqueda y localiza las 2 cajas de texto... en mi caso tengo la suerte de que ya tienen nombres... la caja de texto que es para escribir el correo se llama "email" y la caja de texto que tiene la contraseña se llama "pass".</div>
<div class="separator" style="clear: both; text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Otra cosa importante es que en este tipo de páginas hay un botón de tipo submit que envía la información a una WEB y para localizar esta página debemos encontrar donde comienza el formulario, has esto deslizándote de regreso hacia la izquierda o hacia arriba... [Los formularios comienzan con <form ...]. Los formularios contienen una propiedad llamada "action" en la cual se indica a qué página sera enviada la información recopilada por el formulario. Lo que se encuentra entre comillas remplazalo por: "info.php".</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvjLqK1_4GRbbokiMLHAsuT9kaXfQQOaEwiEaE-AWmPPxxOlC2yYR0d-KQOXRpqPUfPW-m8X3xySB0c59c7QR0yS1PVk6LbgSI3DKxTAWB1mRrwzqnLTf34MAgUGLyttZm9sBiJc_9O8Y/s1600/Cap4.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="100" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjvjLqK1_4GRbbokiMLHAsuT9kaXfQQOaEwiEaE-AWmPPxxOlC2yYR0d-KQOXRpqPUfPW-m8X3xySB0c59c7QR0yS1PVk6LbgSI3DKxTAWB1mRrwzqnLTf34MAgUGLyttZm9sBiJc_9O8Y/s320/Cap4.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
Ya estamos listo para crear un segundo archivo que permita leer lo que escriba en los cuadros de texto, en tu editor de texto abre una hoja nueva y escribe lo siguiente:</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<textarea cols="60" rows="5"><?php
echo "Tu correo es: ";
echo $_REQUEST['email'];
echo "<br>Tu contraseña es: ";
echo $_REQUEST['pass'];
echo "<br>jejejeje";
?>
</textarea>
<br />
<br />
Guarda como archivo php con el nombre "info.php" en la carpeta del servidor local [donde guardaste el otro archivo] y listo :D vuelve a abrir tu navegador y escribe "localhost" o "127.0.0.1" en la barra de dirección.<br />
<br />
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiadP99CGRAFoMPE0XeLvVutL5L741ajQhcjJOEF34tXluuEH3AW823rcXtwn7WWAB6lTm4PwJATTwwZuBYLOlfBnL_iwkEDjlhMdNnBFH5YikjTZI-G9n8kyLDlaCZUb6tDiB93tPmDRI/s1600/Cap5.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="168" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEiadP99CGRAFoMPE0XeLvVutL5L741ajQhcjJOEF34tXluuEH3AW823rcXtwn7WWAB6lTm4PwJATTwwZuBYLOlfBnL_iwkEDjlhMdNnBFH5YikjTZI-G9n8kyLDlaCZUb6tDiB93tPmDRI/s320/Cap5.jpg" width="320" /></a></div>
<br />
<div style="text-align: justify;">
En PHP "echo" se usa para imprimir texto en una web en el navegador [Es como prinft en C o System.out.println en Java].</div>
<div style="text-align: justify;">
$_REQUEST es una instrucción para obtener el valor de un elemento de formularios, [En este caso el de la página anterior] ¿recuerdas que dije que recordaras el nombre de las cajas de texto? si te fijas son los mismos que están dentro de los corchetes.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Así es como termino la publicación de hoy, espero les sirva de algo :D una web así la pueden subir a un servidor gratuito crean una base de datos, hacen conexiones y así pueden guardar los datos sin que el usuario se dé cuenta.... bueno esto es cosa de Lamers y ya estoy dando malas ideas. ¡Nos vemos, hasta la próxima! </div>
Jesús Alberto Sánchez Tecalcohttp://www.blogger.com/profile/05416570182548174207noreply@blogger.com0tag:blogger.com,1999:blog-4594083802314721454.post-58297384340586734402013-01-14T18:02:00.003-08:002013-01-14T18:05:50.804-08:00Crear un PDF con iText [Java]<div style="text-align: justify;">
¡Hola a todos! Bienvenido de nuevo, a partir de este año trataré de aportar algún conocimiento que te ayude a mejorar tu nivel de programación, claro programando sobre Java y alguna que otra vez en Python.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El tema de hoy es: ¿Cómo creo un archivo PDF desde Java?, la respuesta es sencilla una de las clases que nos puede ayudar es <a href="http://itextpdf.com/">iText</a>, desde su página puedes realizar la descarga de las librerías necesarias para realizar tus proyectos, aunque como siempre yo te proporciono en el proyecto que adjunto mas abajo una carpeta "libs_extras" con esas mismas librerías.</div>
<div style="text-align: justify;">
<br />
<a name='more'></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El funcionamiento de la aplicación que muestro como ejemplo es práctica y fácil de entender, en un JFrame (Ventana) tenemos 2 elementos importantes: Un Cuadro de Texto para escribir el contenido que tendrá nuestro PDF y un botón que al dar clic sobre el creara el archivo con el contenido del cuadro de texto antes mencionado.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Al comienzo tienes una ventana como la que aparece a continuación:<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5lEBWlA-Xu_Sn7WcJvRQN6LICJtopeGHrCTKifMEjECgqWZWrS1fQHSr1DTY2ZK3_-CJvgTcG94_nAzkX6HQHFf_FkToVhdCcCzVQF4myy5L3iRvFiKAzd04IYGg0RCA3z3BrZVGWc7c/s1600/Captura1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="305" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEi5lEBWlA-Xu_Sn7WcJvRQN6LICJtopeGHrCTKifMEjECgqWZWrS1fQHSr1DTY2ZK3_-CJvgTcG94_nAzkX6HQHFf_FkToVhdCcCzVQF4myy5L3iRvFiKAzd04IYGg0RCA3z3BrZVGWc7c/s320/Captura1.jpg" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Cuando damos clic en el botón Crear PDF sucede lo siguiente:<br />
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKudHGYCKk7bWJ06WeOxQNcVRelf5LyATtI5o2GuYgwnac2b2dSZv60oAsGUF59L5yo8_9bLkDfz0DouRHIbYSR1ipyXFVf7FncBkI7X5VmFcibxtIAZtH5x0nLdHYD7HEGXQU1yaSF90/s1600/Captura2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="177" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhKudHGYCKk7bWJ06WeOxQNcVRelf5LyATtI5o2GuYgwnac2b2dSZv60oAsGUF59L5yo8_9bLkDfz0DouRHIbYSR1ipyXFVf7FncBkI7X5VmFcibxtIAZtH5x0nLdHYD7HEGXQU1yaSF90/s320/Captura2.jpg" width="320" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para poder trabajar con las clases de iText antes que nada debemos importar las siguientes clases:</div>
<br />
<textarea cols="60" rows="11">import com.itextpdf.text.BaseColor;
import java.io.FileOutputStream;
import com.itextpdf.text.Document;
import com.itextpdf.text.DocumentException;
import com.itextpdf.text.Font;
import com.itextpdf.text.FontFactory;
import com.itextpdf.text.PageSize;
import com.itextpdf.text.Paragraph;
import com.itextpdf.text.pdf.PdfWriter;
import java.io.FileNotFoundException;
import javax.swing.JOptionPane;
</textarea><br />
<br />
Posteriormente analizamos el siguiente método:<br />
<textarea cols="60" rows="29">private void ConvertirPDF(StringBuilder texto)
{
try
{
//Creamos documento indicando el tamaño y margenes
Document documento=new Document(PageSize.LETTER,20,20,20,20);
//Creamos el PDF y lo instanceamos para poder escribir sobre el
PdfWriter.getInstance(documento, new FileOutputStream(nombre));
//Abrimos el documento
documento.open();
//Anexamos el texto a un objeto Pharagraph
Paragraph parametro=new Paragraph(texto.toString(),FontFactory.getFont(FontFactory.TIMES_ROMAN,12,Font.BOLD, BaseColor.RED));
//Escribimos sobre el
documento.add(parametro);
//Cerrar documento
documento.close();
//Mensaje de Exito
JOptionPane.showMessageDialog(null,"PDF Creado con exito.");
//Limpiamos el Cuadro de Texto
campoTexto.setText(null);
}
catch(FileNotFoundException fe)
{
System.out.println("Error...");
}
catch(DocumentException de)
{
System.out.println("Error...");
}
}
</textarea>
<br />
<br />
<div style="text-align: justify;">
Tenemos un método llamado <b>ConvertirPDF</b> que no devolverá nada y tiene un parámetro que debe ser de tipo StringBuilder.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Todo el proceso se realizo dentro de un <b>try </b>para prevenir una excepción.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Lo primero es crear el objeto <b>documento</b>, la clase <b>Document </b>tiene un constructor sobrecargado, es decir, varias formas de "inicializarlo" una es dejando Document(); y la otra es indicando 5 parámetros <u>Document(tamaño de hoja, margen izq,margen der, margen sup, margen inf);</u> el siguiente ejemplo muestra como se crea una hoja tamaño carta con margen de 2 cm en todos los lados:</div>
<div style="text-align: justify;">
<i>Document documento=new Document(PageSize.LETTER,20,20,20,20);</i></div>
<br />
<div style="text-align: justify;">
<span style="font-style: italic;"><br /></span></div>
<div style="text-align: justify;">
La siguiente sentencia es para crear la instancia entre el objeto <b>documento </b>y el archivo pdf que sera creado. La clase <b>PdfWriter </b>por medio de su método getInstance se encarga de eso:</div>
<br />
<div style="text-align: justify;">
<i>PdfWriter.getInstance(documento, new FileOutputStream(nombre));</i></div>
<div style="text-align: justify;">
La variable nombre es un String declarado al inicio de la clase con el nombre del archivo.</div>
<br />
<div style="text-align: justify;">
<span style="font-style: italic;"><br /></span></div>
<div style="text-align: justify;">
La clase <b>Paragraph</b> es para preparar el contenido que tendrá el PDF y el constructor que también es sobrecargado en este caso lo use de esta manera:</div>
<br />
<div style="text-align: left;">
<i>Paragraph parametro=new Paragraph(texto.toString(), FontFactory.getFont(FontFactory.TIMES_ROMAN, 12, Font.BOLD, BaseColor.RED));</i></div>
<div style="text-align: justify;">
Los parámetros del constructor son: <u>Paragraph(contenido,fuente);</u></div>
<div style="text-align: justify;">
Tenemos también un caso especial el uso de la clase FontFactory que usa su método getFont para indicar una fuente, este se usa de la siguiente manera:</div>
<div style="text-align: justify;">
<u>FontFactory.getFont(fuente,tamaño,estilo,color);</u></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Recordemos que dentro del objeto <b>parametro </b>tenemos ya el contenido preparado, con el siguiente código lograremos introducir dicho contenido dentro del documento creado al comienzo:</div>
<div style="text-align: justify;">
<i>documento.add(parametro);</i></div>
<br />
<div style="text-align: justify;">
<span style="font-style: italic;"><br /></span></div>
<div style="text-align: justify;">
Por último cerramos el documento para que termine su creación:</div>
<br />
<div style="text-align: justify;">
<i>documento.close();</i></div>
<br />
<div style="text-align: justify;">
<span style="font-style: italic;"><br /></span></div>
<div style="text-align: justify;">
En el método del botón tenemos lo siguiente:</div>
<br />
<textarea cols="60" rows="8">StringBuilder texto=new StringBuilder();
texto.append(campoTexto.getText());
if(texto.length()!=0) {
ConvertirPDF(texto);
}
else {
JOptionPane.showMessageDialog(null,"El archivo no tiene contenido");
}
</textarea>
<br />
<br />
<div style="text-align: justify;">
Primer se crear un <b>StringBuilder</b> (objeto para almacenar texto) al cual por medio del método append se le agrega lo que se obtenga del cuadro de texto (campoTexto).</div>
<div style="text-align: justify;">
En una condición evaluamos si contiene algún contenido el cuadro de texto si el valor es diferente de 0 significa que si lo hay y por lo tanto se llamara al método <b>ConvertirPDF</b> pasandole el <b>StringBuilder texto</b>, de ser 0 significa que esta vacío, esto último provocaría una excepción.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Bueno hasta aquí dejo esta publicación, espero les sea de ayuda en sus proyectos e investigaciones, a por cierto la liga del proyecto, cuídense y hasta la próxima.</div>
<br />
<div style="text-align: center;">
<a href="http://www.mediafire.com/?07w1aaxi0jn2oqe"><b>PDF - ChuxPDF</b></a></div>
Jesús Alberto Sánchez Tecalcohttp://www.blogger.com/profile/05416570182548174207noreply@blogger.com7tag:blogger.com,1999:blog-4594083802314721454.post-57687777950213862582013-01-04T16:18:00.001-08:002013-01-04T16:18:16.421-08:00Gráfica de Barras con JFreeChart [Java]<div style="text-align: justify;">
Hola a todos, felices año nuevo y feliz Navidad (felicitaciones un poco atrasadas jejeje) si llegaste a esta publicación es que tu al igual que yo necesitas una solución para crear gráficos de barras, pastel, histogramas, etc. dentro de un JFrame (Ventana) en Java, a pues la solución mas clara es la clase <b>JFreeChart.</b></div>
<a name='more'></a><div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El año pasado cuando aún me interesaban hacer algunas cosas en Java (Por ahora no hay nada...) busqué mucho como graficar datos, ya saben datos cuantitativos, hasta algún conocido me menciono que tenia el mismo problema, o bueno la inquietud, el usa la clase <b>Graphics</b>, pero obvio usar esta clase lleva tiempo preparar todo el contenido, con JFreeChart de lo único que debes preocuparte es de escoger el gráfico y agregar los datos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En la publicación de hoy me dedicaré a explicar como usar la clase ChartFactory para generar un gráfico de barras en 3D y mostrarlo en un label. No es que exactamente lo muestre en el JFrame, es en una etiqueta.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>Dato Interesante: ¿Sabias que dentro de una etiqueta puedes escribir HTML y este se muestra? :D pues ahora ya lo sabes :).</i></div>
<br />
<div style="text-align: justify;">
<span style="font-style: italic;"><br /></span></div>
<div style="text-align: justify;">
Antes que nada te comparto una <a href="http://www.mediafire.com/?q8o32i838sinrjo">liga </a>donde se encuentra el proyecto completo, y dentro también hay una carpeta (libs_extras) donde proporciono los .jars necesarios (algunos ni fueron usados) para que funcione el proyecto.</div>
<br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Para comenzar, en el formulario debes crear una etiqueta (quítale el contenido) y asigna un nombre, en el ejemplo que a continuación muestro se llama <u>grafico</u>.</div>
<br />
<textarea cols="60" rows="29">public Estudiante() {
initComponents();
//Se almacenan los datos que seran usados en el gráfico
DefaultCategoryDataset datos = new DefaultCategoryDataset();
datos.setValue(8,"java","Misael");
datos.setValue(9,"java","Don Enrique");
datos.setValue(6,"java","Lupe");
//Se crea el gráfico y se asignan algunas caracteristicas
JFreeChart grafico_barras = ChartFactory.createBarChart3D("Calificaciones Java","Estudiantes", "Promedios",datos, PlotOrientation.VERTICAL, true, true, false);
//Se guarda el grafico
BufferedImage image = grafico_barras.createBufferedImage(500,300);
//Se crea la imagen y se agrega a la etiqueta
grafico.setIcon(new ImageIcon(image));
pack();
repaint();
}
</textarea>
<br />
<br />
<div style="text-align: justify;">
Dentro del constructor <u>Estudiante()</u> después del método <u>initComponents()</u> se crea un objeto <u>datos</u> donde por medio del método <u>setValue(valor,categoria,etiqueta)</u> se ingresan los datos: Misael tiene un 8 en la materia java, Don Enrique 9 y Lupe 6 xD.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En la siguiente parte se crea realmente el gráfico, y se guarda en <u>grafico_barras</u>, en mi caso me incline por una gráfica de barras por lo tanto use la propiedad <u>createBarChart3D(titulo del grafico,Valor X,Valor Y,[Variable donde se guardaron los datos],Orientación,?,?,?). </u>----->>> Los '?' representan un valor desconocido jeje, así que tu ponlos como en el ejemplo: true,true,false jeje.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
La siguiente parte del código indica que se creara un buffered para almacenar en una "imagen" con x,y dimensiones a partir del objeto creado por la clase JFreeChart que se almacena en <u>image</u>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Por último dentro de la etiqueta <u>grafico</u> con el método setIcon(imagen) agrego la "imagen" que deseo mostrar, en el ejemplo anterior tenemos un BufferedImage como tal no es imagen por lo tanto hay que crearla a partir de ella, una imagen real con <u>new ImageIcon()</u>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Con eso bastara para que aparezca algo como esto:</div>
<div style="text-align: justify;">
<br /></div>
<div class="separator" style="clear: both; text-align: justify;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimsxCvq2KhRjX0LSEs6F1I2AUVn_rUXWNZCWyakONUzMtClyNs_6sQeCVSxDieIMCY1ZiY-Grx7BTZ832DrmBQmeIhwmBcSJaNDKCOUxhLGtZCFs9E5nKlrzfigV_8A9tiRYAffw-Hwwk/s1600/grafica+barras.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="259" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEimsxCvq2KhRjX0LSEs6F1I2AUVn_rUXWNZCWyakONUzMtClyNs_6sQeCVSxDieIMCY1ZiY-Grx7BTZ832DrmBQmeIhwmBcSJaNDKCOUxhLGtZCFs9E5nKlrzfigV_8A9tiRYAffw-Hwwk/s400/grafica+barras.png" width="400" /></a></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Fin de la publicación :) te deseo suerte y recuerda, siempre es bueno buscar mas info, estoy consciente de que mi publicación no es la mejor, pero espero te ayude como una pequeña guía, Saludos.</div>
Jesús Alberto Sánchez Tecalcohttp://www.blogger.com/profile/05416570182548174207noreply@blogger.com0tag:blogger.com,1999:blog-4594083802314721454.post-61047514158174748672012-12-10T10:26:00.000-08:002012-12-10T10:52:37.157-08:00Árboles de procesos con fork [ C ]<div style="text-align: justify;">
Saludos a todos, espero y aun me recuerden, estoy de regreso después de una larga ausencia, el motivo: tratar de explicar como crear un árbol de procesos en C como se te antoje, ¡SI! escuchaste bien como se te antoje, que tenga el número de hijos que tu quieras. Esta publicación nace gracias al Profe. de Sistemas Operativos que trató de intimidarnos en la clase pasada (OkNo jeje no intimidar pero si espantar, ok eso tampoco solo nos dio una probadita de lo que podría venir) bueno eso sentí yo, estamos estudiando los procesos como se crean, matan, etc. y como examen nos pondrá a hacer un árbol de procesos a como se le antoje, aunque nos proporcionará un código base, nunca me gusta sobrevivir de cosas que no son producto de mis experimentos, prácticas, etc.</div>
<div style="text-align: justify;">
<br />
<a name='more'></a><br /></div>
<div style="text-align: justify;">
Recordemos que la programación es en C y bajo alguna distribución de GNU/Linux y el objetivo del post no es aprender a compilar o cosas así. Sería necesario que ya cuentes con algunos conocimientos previos. Disculpen la sencillez y brevedad de la publicación pero tengo reducido mi tiempo para dar todas esas explicaciones.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Si lo que necesitas es saber que cosa es exactamente "fork()" te recomiendo visites la siguiente liga que te aseguro tiene mucha información de utilidad, blog de un colega (Espero y no se enoje por usar su blog como fuente jeje) <a href="http://blog.txipinet.com/2006/11/03/46-curso-de-programacion-en-c-para-gnu-linux-v/">Curso de Programación en C para GNU/Linux (V)<span style="background-color: white; font-family: 'Lucida Grande', Verdana, Arial, sans-serif; font-size: 11px;"> </span></a>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
A continuación muestro algunos puntos que yo tomé en cuenta que podrían suceder, checa la figura que muestro a continuación (de pruebas que ya fueron realizadas) y analiza el código:</div>
<h3>
Ejemplo 1</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYT277q02MhFdosC5ELYQjjQP1Vd0Z_t3IHp96HYJ-mNP2LX5Cy9uC0L3VRnXRIDH7UqA1nAMlrilYXEqJQk_Y7EWTEqNVv0LFxulcvC19X4MPVKqFFsxCruZvqDzya7S86Lp5LKj17QQ/s1600/arbol1.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="202" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEhYT277q02MhFdosC5ELYQjjQP1Vd0Z_t3IHp96HYJ-mNP2LX5Cy9uC0L3VRnXRIDH7UqA1nAMlrilYXEqJQk_Y7EWTEqNVv0LFxulcvC19X4MPVKqFFsxCruZvqDzya7S86Lp5LKj17QQ/s320/arbol1.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Fig. 1 Muestra un papá con 3 hijos.</div>
<div class="separator" style="clear: both; text-align: center;">
<br /></div>
<textarea cols="60" rows="29">//Padre con 3 hijos
#include <stdio.h>
#include <unistd.h>
main(void)
{
pid_t pid;
int x;
for(x=1;x<=3;x++)
{
pid=fork();
if(pid)
{
printf("Soy el proceso %d\n",getpid());
sleep(2);
}
else
{
printf("soy el hijo %d, mi padre es %d\n",getpid(),getppid());
sleep(2);
exit(0);
}
}
return 0;
}</textarea>
<br />
<br />
<div style="text-align: justify;">
Se declara pid, mas adelante si te das cuenta tenemos un ciclo que va a dar 3 "vueltas", dentro del ciclo se crearan 3 hijos con el método fork (la parte del else juega un papel importante), el método exit() en pocas palabras te ayudara a que no le salgan mas hijos al hijo actual de esta manera el papá siempre sera el mismo.</div>
<h3>
Ejemplo 2</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSR3c1_69n0_5O6pc1ydSbh69gUMZTwfkh1CvK496LjG_dJMYDeIRhl4f0tXVYOU6bJu6Q0FHbYLLIIekcIBoM6GMp1zyHOPzS9H71xlB8jfofNwV9Vd_Dwv4Bav9kxSWfEFwdScldb2s/s1600/arbol2.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="247" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjSR3c1_69n0_5O6pc1ydSbh69gUMZTwfkh1CvK496LjG_dJMYDeIRhl4f0tXVYOU6bJu6Q0FHbYLLIIekcIBoM6GMp1zyHOPzS9H71xlB8jfofNwV9Vd_Dwv4Bav9kxSWfEFwdScldb2s/s320/arbol2.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Fig. 2 Muestra un papá con 3 hijos y cada hijo a su vez tuvo 2 hijos.</div>
<div class="separator" style="clear: both; text-align: left;">
<br /></div>
<textarea cols="60" rows="29">//Padre con 3 hijos
//Papa con 3 hijos y cada hijo tiene 2
#include <stdio.h>
#include <unistd.h>
main(void)
{
pid_t pid;
int x,y;
for(x=1;x<=3;x++)
{
pid=fork();
if(pid)
{
printf("Soy el proceso %d\n",getpid());
sleep(2);
}
else
{
printf("soy el hijo %d, mi padre es %d\n",getpid(),getppid());
sleep(2);
for(y=1;y<=2;y++)
{
pid=fork();
if(pid)
{
printf("Soy el proceso %d\n",getpid());
sleep(2);
}
else
{
printf("soy el hijo %d, mi padre es %d\n",getpid(),getppid());
sleep(2);
exit(0);
}
}
exit(0);
}
}
return 0;
}</textarea>
<br />
<br />
<div style="text-align: justify;">
La nueva implementación es un ciclo for después del metodo sleep... el método exit se encuentra al final del ciclo for (si se coloca en otra parte ten por hecho que afectara el funcionamiento del programa), si miras con mas cuidado te percatarás que es lo mismo del ejemplo anterior pero dentro del else, el segundo for (el que trabaja con y) controla cuantos nietos deseas que tenga el padre por cada hijo (espiritú santo, amen! jejee OkNo).</div>
<h3>
Ejemplo 3</h3>
<div class="separator" style="clear: both; text-align: center;">
<a href="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMdka8VPpQWRTmoTGZ94QpeAZNaLM2O6pU__HVeb4Zeo3Yr1cCSU7S2hhDicHrSjfz2wACt2__ngPm9g5cEgNRS12NeACjBPjd-W8d7l3Vc3lJFuUIzXd3guXPhHrC7YbeEM0hbNKYlrY/s1600/arbol3.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="247" src="https://blogger.googleusercontent.com/img/b/R29vZ2xl/AVvXsEjMdka8VPpQWRTmoTGZ94QpeAZNaLM2O6pU__HVeb4Zeo3Yr1cCSU7S2hhDicHrSjfz2wACt2__ngPm9g5cEgNRS12NeACjBPjd-W8d7l3Vc3lJFuUIzXd3guXPhHrC7YbeEM0hbNKYlrY/s320/arbol3.jpg" width="320" /></a></div>
<div class="separator" style="clear: both; text-align: center;">
Fig. 3 Muestra a un papá con 3 hijos de los cuales solo el primero le dio 2 nietos.</div>
<br />
<textarea cols="60" rows="29">//Papa con 3 hijos (solo el primer hijo tiene 2)
#include <stdio.h>
#include <unistd.h>
main(void)
{
pid_t pid;
int x,y;
for(x=1;x<=3;x++)
{
pid=fork();
if(pid)
{
printf("Soy el proceso %d\n",getpid());
sleep(2);
}
else
{
printf("soy el hijo %d, mi padre es %d\n",getpid(),getppid());
sleep(2);
if(x==1)
{
for(y=1;y<=2;y++)
{
pid=fork();
if(pid)
{
printf("Soy el proceso %d\n",getpid());
sleep(2);
}
else
{
printf("soy el hijo %d, mi padre es %d\n",getpid(),getppid());
sleep(2);
exit(0);
}
}
}
exit(0);
}
}
return 0;
}</textarea>
<br />
<br />
<div style="text-align: justify;">
Ahora, que pasa si debemos limitar el número de nietos que tendrá el padre por cada hijo, fácil utilizamos un if. En este ejemplo solo el primer hijo tendrá sus propios 2 hijos. Para saber cuando estoy trabajando con el hijo "1" el valor de la variable x en el ciclo for será 1, por lo cual con una condición pudo implementar la parte del ciclo 2 que vimos en el ejemplo anterior dentro de un if que detecte cuando se trabaja con el primer hijo que a su vez se encentrara dentro del primero ciclo. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Compañero programador tu trabajo es tratar de hacer árboles mas grandes, prácticamente es repetir estos códigos en varias ocasiones, lo que si es importante es saber donde colocarlos jeje.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Bueno hasta aquí espero y estos ejemplos les sean útiles, estoy consciente que es un tema difícil de trabajar y mas cuando uno mismo es un aprendiz pero espero aportar algo interesante a su conocimiento, me despido: ¡Hasta la próxima!.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
P.D. Te amo Yani :D</div>
Jesús Alberto Sánchez Tecalcohttp://www.blogger.com/profile/05416570182548174207noreply@blogger.com22tag:blogger.com,1999:blog-4594083802314721454.post-84366999382868773752012-10-23T17:15:00.002-07:002016-10-24T08:28:36.403-07:00MiniCalculadora: Ciclo do, switch y métodos [Python]<div style="text-align: justify;">
Hola a todos, de nuevo regreso al blog pero con una nueva onda, hace unos días acabo de retomar el camino hacia <b>Python</b>, un lenguaje de programación que promete mucho, me impresiona la limpieza de su código, pero... extraño llaves que siempre uso en Java o en C <o derivados C++ o C#>.</div>
<div style="text-align: justify;">
<br />
<a name='more'></a><br /></div>
<div style="text-align: justify;">
Todo va bien hasta que me entero que no existe el bucle <b>do </b>y tampoco el famoso <b>switch </b>y ya calientito haciendo ejercicios hice una pequeña minicalculadora, pero la notaba muy simple, ya acostumbrado a los menús se me prendió hacer algo mas complejo. Te comento que no me detendré a dar muchos detalles de la forma de trabajar con Python, ya que este no es el objetivo de la publicación.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Lo primero fue crear métodos que me ayudaran a crear algo mas dinámico <en Python se usa la palabra <b>def </b>para declarar un método> y sobretodo que me permitiera pasar argumentos, si se podía ya directo me mostrara el resultado. De la anterior idea se crearon los métodos <b>Suma</b>, <b>Resta</b>, <b>Multiplicación</b>, <b>División</b>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Si vienes de aprender algún otro lenguaje y así como yo, experimentas con Python, te preguntaras por qué ya dentro de los argumentos del método tengo inicializadas las variables... esto es, por si no se les pasa ningún argumento al método, los valores por default se tomaran de ahí, de esa inicialización.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Oye y también: ¿Donde se declaran las variables? la respuesta es: Donde tu quieras, no se requiere agregar un int o String o float como se hace en otros lenguajes, basta con colocar el nombre de la variable a crear y un valor, ten en cuenta que debes cuidar el tipo de dato y en algunos casos sera necesario convertir un valor a un tipo necesario.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Que mas? ... a si, también necesitaba un método que me ayudara a pedir 2 números para realizar alguna operación aritmética, e imaginé <b>Solicitar</b>. Tal método me tendría que devolver los 2 números, pero y ¿Como? aun no se si se pueda... pero un doble return creo que quedaría descartado <Ni existe creo...> por lo que se me ocurrió que ya almacenados los números los puedo agregar a una tupla <Algo parecido a un arreglo>, ya devuelta la tupla por medio de indices puedo extraer sus valores y jugar con ellos.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Bueno, ya estamos en el punto de hacer trabajar nuestro programa, mi segundo o tercer problema fue como simular el switch, ya que no existe en python, buscando en internet encontre un <a href="http://www.daw-labs.com/simulacion-de-sentencia-%C2%ABswitch-case%C2%BB-en-python/">blog</a> en el cual de forma muy detallada explica como usar diccionarios y a partir de estos formar una especie de switch.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Después de esto, yo muy acostumbrado al ciclo do, tampoco existe, solución: crear una variable con algún valor que sea verdadero para el ciclo while y asunto arreglado.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
A continuación muestro el código comentado de mi pequeña aplicación:</div>
<div style="text-align: justify;">
<br /></div>
<textarea cols="60" rows="60">#Creacion de los metodos Suma, Resta, Multiplicacion y Division
def Suma(num1=0, num2=0):
r = num1 + num2
print "Resultado: %d" % r
def Resta(num1=0, num2=0):
r = num1 - num2
print "Resultado: %d" % r
def Multiplicacion(num1=0, num2=0):
r = num1 * num2
print "Resultado: %d" % r
def Division(num1=0, num2=0):
r = float(num1) / num2
print "Resultado: %f" % r
#Metodo que pregunta 2 numeros los guarda en una tupla y los devuelve
def Solicitar():
n1 = input("Escribe el primer numero: ")
n2 = input("Escribe el segundo numero: ")
l = (int(n1), int(n2))
return l
#Diccionario que contiene los nombres de los metodos con un indice n
switch = {1: Suma,
2: Resta,
3: Multiplicacion,
4: Division,
}
#Inicio...
print "*****Mini Calculadora*****"
opcion = 0
#A falta de ciclo do se crea una variable con x valor y se usa en while
while(opcion != 5):
print "\n1. Suma\n2. Resta\n3. Multiplicacion\n4. Division\n5. Salir"
opcion = input("Que desea hacer? ")
#Si la opcion es diferente de 5...
if opcion != 5:
#Si esta entre 1 y 4 se...
if opcion > 0 and opcion < 5:
#Almacena tupla del metodo solicitar ne variable numeros
numeros = Solicitar()
#Se manda a llamar al metodo segun la opcion
#Diccionario[indice](arg1, arg2)
switch[opcion](numeros[0], numeros[1])
#Si opcion no vale entre 1 y 4 manda error
else:
print "Opcion incorrecta"
#Fin de aplicacion
print "Saliendo..."
</textarea>
<br />
<br />
Importante: Respetar las sangrías (espacios) ya que en python no hay llaves < {} > para abrir y cerrar un bloque de código, las sangrías organizan los niveles de cada bloque.<br />
<br />
Espero y te sea de utilidad esta publicación, no olvides en comentar o compartir, hasta la próxima!Jesús Alberto Sánchez Tecalcohttp://www.blogger.com/profile/05416570182548174207noreply@blogger.com2tag:blogger.com,1999:blog-4594083802314721454.post-44301818712616265362012-10-01T09:14:00.001-07:002012-12-10T10:53:30.625-08:00Pilas [Java]<div style="text-align: justify;">
<span style="font-family: inherit;">Hola a todos, el día de hoy vamos a hablar de una estructura de datos lineal: Las pilas, el objetivo del post no es exactamente explicar ¿Que es? ¿Para que sirve? si gustas referencias puedes leer el siguiente <a href="http://es.wikipedia.org/wiki/Pila_(inform%C3%A1tica)">texto</a>.</span></div>
<br />
<a name='more'></a><br /><br />
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<span style="font-family: inherit;">Algunas de las tareas básicas que se hacen con esta estructura es:</span><br />
<br />
<br />
<ul>
<li>Agregar un dato al final</li>
<li>Eliminar el último dato</li>
<li>Checár si esta vacía la pila</li>
<li>Buscar un dato</li>
</ul>
<br />
<br /></div>
<div style="text-align: justify;">
<span style="font-family: inherit;">A continuación muestro un sencillo ejemplo de como usar una Pila en Java con algunas de sus actividades: </span></div>
<br />
<span style="font-family: inherit;"><br />
<textarea cols="70" rows="60">import java.util.Scanner;
public class Pila
{
private int tope,max;
private String pila[];
public Pila(int m)
{
max=m;
pila=new String[max];
tope=0;
}
//Metodo que agrega un dato
private void Agregar(String n)
{
if(tope<max)
{
pila[tope]=n;
tope++;
System.out.println("Dato agregado");
}
else
{
System.out.println("Ya no caben mas datos");
}
}
//Metodo que elimina un dato de la pila
private void Eliminar()
{
if(tope>0)
{
tope--;
System.out.println("Dato eliminado");
}
else
{
System.out.println("Ya no hay datos para eliminar");
}
}
//Metodo que muestra los datos *Ultimo -> Primero*
private void Mostrar()
{
if(!Vacia())
{
for(int a=(tope-1);a>=0;a--)
{
System.out.println(pila[a]);
}
}
else System.out.println("Pila vacia");
}
//Buscar dato
private boolean Buscar(String dato)
{
boolean encontrado=false;
if(!Vacia())
{
for(int a=(tope-1);a>=0;a--)
{
if(pila[a].equals(dato)) encontrado=true;
}
}
else System.out.println("No hay datos para buscar en la pila");
return encontrado;
}
//Checar si esta vacia
private boolean Vacia()
{
if(pila==null) return true;
else return false;
}
public static void main(String arg[])
{
int t,opcion;
String dato;
Scanner teclado=new Scanner(System.in);
System.out.println("---Pilas---");
System.out.println("Tamanio para la pila: ");
t=teclado.nextInt();
Pila pilita=new Pila(t);
do
{
System.out.println("1. Agregar dato");
System.out.println("2. Eliminar dato");
System.out.println("3. Mostrar datos");
System.out.println("4. Buscar dato");
System.out.println("5. Salir");
System.out.println("Que desea hacer? ");
opcion=teclado.nextInt();
switch(opcion)
{
case 1:
System.out.println("Escriba un dato: ");
dato=teclado.next();
pilita.Agregar(dato);
break;
case 2:
pilita.Eliminar();
break;
case 3:
pilita.Mostrar();
break;
case 4:
System.out.println("Dato a buscar: ");
dato=teclado.next();
if(pilita.Buscar(dato)) System.out.println("Dato encontrado");
else System.out.println("Dato no encontrado");
break;
}
}while(opcion!=5);
}
}
</textarea></span>
<br />
<br />
<div style="text-align: justify;">
A continuación analizamos un poco cada parte del código:</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
En esta primera parte del código se están creando 2 variables que me servirán para definir el tope y el tamaño máximo del arreglo, opte por un arreglo de tipo de String para que en nuestra Pila se puedan agregar nombres.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El constructor de la clase tiene un parámetro de tipo entero <i>m </i>que será el que defina el tamaño total. Dentro se define que el valor de <i>max </i>sera el mismo de <i>m </i>(mas adelante se usará), y también indicamos el tamaño del arreglo de <i>pila. </i>Inicialmente le damos un valor de 0 a <i>tope </i>para que el primer dato que sea agregado al arreglo sea en dicha posición.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>private int tope,max;</i></div>
<div style="text-align: justify;">
<i>private String pila[];</i></div>
<br />
<div style="text-align: justify;">
<span style="font-style: italic;"><br /></span></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>public <b><u>Pila</u></b>(int m)</i></div>
<br />
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>{</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>max=m;</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>pila=new String[max];</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>tope=0;<span class="Apple-tab-span" style="white-space: pre;"> </span></i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>}</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El método <i><b>Agregar </b></i>recibe un String el cual si el <i>tope</i> es menor que <i>max </i>lo agrega a nuestra <i>pila </i>o arreglo, de lo contrario se podría generar una excepción por sobrepasar el límite que anteriormente dimos al arreglo, mandará un aviso "Ya no caben...".</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>private void <b>Agregar</b>(String n)</i></div>
<div style="text-align: justify;">
<i>{</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>if(tope<max)</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>{</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>pila[tope]=n;</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>tope++;</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>System.out.println("Dato agregado");</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>}</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>else</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>{</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>System.out.println("Ya no caben mas datos");</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>}</i></div>
<div style="text-align: justify;">
<i>}</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Recordemos que un elemento no puede ser eliminado de un arreglo pero en este caso en nuestro método <i><b>Eliminar </b></i>bastará con disminuir a <i>tope </i>en 1 para que simulemos que se elimina el último elemento, pero hay una condición: <i>tope </i>debe ser mayor a 0 de lo contrario imaginemos que queda -1 si a futuro se agrega un dato quedará <i>pila[-1]</i> y esto generará una excepción. </div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>private void <b>Eliminar</b>()</i></div>
<div style="text-align: justify;">
<i>{</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>if(tope>0)</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>{</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>tope--;</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>System.out.println("Dato eliminado");</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>}</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>else</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>{</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>System.out.println("Ya no hay datos para eliminar");</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>}</i></div>
<div style="text-align: justify;">
<i>}</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
Antes de checár el método <b><i>Mostrar </i></b>es necesario entender el método <b><i>Vacia</i></b>. Regresa un true si esta vacía la pila y false si ya tiene algún dato <lo anterior gracias al<i> if</i>>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>private boolean <b>Vacia</b>()</i></div>
<div style="text-align: justify;">
<i>{</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>if(pila==null) return true;</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>else return false;</i></div>
<div style="text-align: justify;">
<i>}</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El método <b style="font-style: italic;">Mostrar </b>antes de actuar checa si hay datos en la pila para ser mostrados, de lo contrario manda un aviso, en el <i>if </i>indicamos<u><b> SI NO</b> </u>esta vacía la pila <El <u>si no</u> es por el "!" símbolo de admiración que niega la condición > recorre con el <i>for </i>desde <i>tope-1</i> hasta <i>0.</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>private void <b>Mostrar</b>()</i></div>
<div style="text-align: justify;">
<i>{</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>if(!Vacia())</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>{</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>for(int a=(tope-1);a>=0;a--)</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>{</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>System.out.println(pila[a]);</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>}</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>}</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>else System.out.println("Pila vacia");</i></div>
<div style="text-align: justify;">
<i>}</i></div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
El método <i style="font-weight: bold;">Buscar </i>funciona de una forma muy parecida al método <i><b>Mostrar </b></i>ya que primero analiza si esta vació el arreglo para después en cada elemento con el ciclo <i>for </i>buscar el dato que se pasa como argumento, si se llega a encontrar, la variable <i>encontrado </i>pasara de <i>false </i>a <i>true </i>que al final sera devuelta <b><span style="color: red;"><</span></b>true significa que si fue encontrado - si existió una coincidencia en <i>pila[a].equals(dato) </i>[El método equals sirve para comparar 2 elementos] y false si no hay coincidencias<span style="color: red;">></span> por el <i>return</i>.</div>
<div style="text-align: justify;">
<br /></div>
<div style="text-align: justify;">
<i>private boolean <b>Buscar</b>(String dato)</i></div>
<div style="text-align: justify;">
<i>{</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>boolean encontrado=false;</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>if(!Vacia())</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>{</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>for(int a=(tope-1);a>=0;a--)</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>{</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>if(pila[a].equals(dato)) encontrado=true;</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>}</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>}</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>else System.out.println("No hay datos para buscar en la pila");</i></div>
<div style="text-align: justify;">
<i><span class="Apple-tab-span" style="white-space: pre;"> </span>return encontrado;</i></div>
<div style="text-align: justify;">
<i>}</i></div>
<div>
<div style="text-align: justify;">
<br /></div>
</div>
<div style="text-align: justify;">
Bueno esto es todo por hoy :D espero les sea de utilidad esta publicación y recuerda dejar un comentario Suerte. Por cualquier cosa <a href="http://www.mediafire.com/?dld25wsle2j01sc">aquí </a>esta el archivo .java y puedes descargarlo :).</div>
<div style="text-align: justify;">
<br /></div>
Jesús Alberto Sánchez Tecalcohttp://www.blogger.com/profile/05416570182548174207noreply@blogger.com14