viernes, 16 de diciembre de 2016

Pendón 2016 en Chilpancingo

¡Ya estamos listos! Pendón 2016, el H. Ayuntamiento esta dando una amplia promoción al arranque de la feria de navidad y año nuevo de Chilpancingo, por lo que invita a toda la población al pendón 2016, este próximo 18 de diciembre del 2016.


Recorrido:


Más información: https://m.facebook.com/Paseo-del-Pend%C3%B3n-Chilpancingo-509919822418540/

domingo, 4 de septiembre de 2016

De los compromisos con el blog y otras cosas

Pero si este blog pareciera fuera un anuario, he visto lo que escribo y es cada año que vuelvo por aquí, por cosas de la vida cotidiana postergo el compartir cosas nuevas que he aprendido, la tecnología avanza demasiado rápido y en ocasiones es difícil seguirle el paso a los nuevos lenguajes de programación y a los existentes estar al día con las mejoras es desgastante.

Por el momento he trabajado mucho con Javascript y he conseguido aprender cosas nuevas que desconocía se pudieran hacer, tendré que establecer un nivel de compromiso decente para dejar un articulo que sea medianamente de interés y que el indexador de búsquedas de google considere colocarlo en las primeras paginas de resultados.

A lo que escribí arriba esta imagen lo dice todo. Buen día a todos

jueves, 27 de agosto de 2015

Utilizando el emulador DosBox

DosBox es un emulador que recrea un entorno similar al sistema DOS con el objetivo de poder ejecutar programas y videojuegos originalmente escritos para el sistema operativo MS-DOS de Microsoft en ordenadores más modernos. (referencia  wikipedia: https://es.wikipedia.org/wiki/DOSBox)

Pagina oficial: http://www.dosbox.com/

Quizás el uso común que se le ha dado a este emulador es para poder ejecutar videojuegos, pero en mi caso lo he usado para instalar programas que se usaban años atrás.

Aquí dejo una pantallas de como ha quedado con Windows 3.11 y los programas que instale.






He instalado por supuesto el primer entorno de programación que conocí cuando comencé a programar, me refiero al Turbo C de Borland versión 2.01 (Lo admito en aquellos tiempos no instale nada, todo venia en un diskette que me dieron y listo)





Dejo un ejemplo de un programa que escribí, pues la tentación ha sido grande (Algunos programadores comprenderán esa sensación)

Código de un programa que invierte una cadena de caracteres que se escribe por teclado

/* Programa: Invierte cadena de caracteres
    Versión: 1.0
 */

 #include <stdio.h>
 #include <conio.h>

 char *inviertecadena(char *cadena);
 int largocadena(char *cadena);

 void main(void)
 {
   char cadena[60]; /* Para guardar el texto que se escriba */
   clrscr(); /* Borrado de pantalla */
   printf("\n\tEscribe un texto: ");
   gets(cadena); /* Guardamos el texto escrito */
   printf("\n\t***************************************************");
   printf("\n\tCadena original: %s", cadena);
   printf("\n\tCadena invertida: %s", inviertecadena(cadena));
   printf("\n\n\tPulsar cualquier tecla para continuar");
   getch(); /* Funcion que lee la tecla pulsada, se usa para la pausa */
 }

 /* Funcion que retorna una cadena invertida */

 char *inviertecadena(char *cadena)
 {
   char cadenainvertida[60] = "\0"; /* Para guardar la nueva cadena ya invertida */
   int longitud = largocadena(cadena); /* Obtenemos el largo de la cadena */
   int i = 0, j = longitud; /* Asignamos valores a los indices */
   for(i=0;i<longitud;i++) /* Un ciclo para recorrer la cadena */
   {
     j-= 1; /* El indice de la nueva cadena lo decrementamos */
     cadenainvertida[j] = cadena[i]; /* Colocamos al final cada caracter */
   }
   return(cadenainvertida); /* Retornamos la nueva cadena ya invertida */
 }

 /* Funcion que retorna el largo de una de cadena de caracteres */

 int largocadena(char *cadena)
 {
   int largo = 0, i = 0; /*Variables para el indice y el largo de la cadena*/
   while(cadena[i]!='\0') /*Un ciclo mientras no se encuentre un valor nulo*/
   {
    largo += 1; /* Incrementamos el largo */
    i += 1; /* Incrementamos el indice para leer el siguiente caracter*/
   }
   return(largo); /* Retornamos el largo de la cadena */
 }

Resultado de la ejecución



martes, 14 de julio de 2015

Chat básico con Socket.io y Node.js

Ejemplo de una aplicación Chat realizada con Node.js y Socket.io, hago la aclaración que todo el código de esta aplicación es propiedad de Smitha Milli y lo pueden ver en su canal de Youtube, por lo que agrego los datos para quien desee conocer mas información y para la explicación personal de Smitha.

Canal Youtube: https://www.youtube.com/user/smithamilli
Twitter: https://twitter.com/SmithaMilli
Página Oficial: http://smithamilli.com/
Facebook: https://www.facebook.com/thisissmitha

La aplicación consta de 3 archivos y los módulos (dependencias) que serán creados con npm (gestor de paquetes de node.js) como se vera mas adelante.


El primer archivo que se necesita es package.json que en este contendrá el nombre de la aplicación, la versión, las dependencias que vamos a utilizar (express y socket.io)

package.json

{
"name":"chat",
"version":"0.0.1",
"private":"true",
"dependencies":{
"socket.io":"1.3.5",
"express":"4.13.1"
}
}

Para conocer la versión que tenga instalada de socket.io y express ejecute el siguiente comando: npm info socket.io version



npm info express version



Ya con este archivo podemos ejecutar npm y copiar las dependencias en nuestra carpeta de la aplicación, ejecutamos el comando npm install


Y al terminar ya tenemos listo la carpeta con los paquetes necesarios para la aplicación



El segundo archivo es app.js

app.js

var express = require('express'),
app = express(),
server = require('http').createServer(app),
io = require('socket.io').listen(server);

server.listen(3000);

app.get('/', function(req,res){
res.sendFile(__dirname + '/index.html');
});

io.sockets.on('connection',function(socket) {
socket.on('send message',function(data){
io.sockets.emit('new message',data);
});
});

Aquí en app.js lo que se tiene es un servidor que responderá los eventos de entrada y salida (ver video en canal de youtube de Smitha para una explicación mas a detalle)

Por ultimo tenemos el archivo index.html que solo mostrara un cuadro de texto con un botón para enviar lo escrito, en la parte superior se mostrara lo que se vaya escribiendo y recibiendo.

index.html

<html>
<head>
<title>Chat con socket.io y node.js</title>
<style type="text/css">
#chat{
height: 500px;
}
</style>
</head>
<body>
<div id="chat"></div>
<form id="send-message">
<input size="35" id="message"></input>
<input type="submit"></input>
</form>
<script src="https://ajax.googleapis.com/ajax/libs/jquery/2.1.3/jquery.min.js"></script>
<script src="/socket.io/socket.io.js"></script>
<script>
jQuery(function($){
var socket = io.connect();
var $messageForm = $('#send-message');
var $messageBox = $('#message');
var $chat = $('#chat');

$messageForm.submit(function(e){
e.preventDefault();
socket.emit('send message',$messageBox.val());
$messageBox.val('');
});
socket.on('new message', function(data){
$chat.append(data + "<br/>");
});
});
</script>
</body>
</html>

Ya con esto tenemos un pequeño chat que recibe y envía texto


domingo, 12 de julio de 2015

Ahora vamos con Node.js

Chilpancingo, Gro. a 12 de Julio del 2015.- Pues si, ahora vamos a probar con NODE.JS no soy el mas indicado para explicar que es esta plataforma, pero a grandes rasgos con Node.js ya se puede ejecutar código JavaScript en el servidor, lo que desde hace varios años se ha venido haciendo desde el navegador en el equipo cliente, claro que no solamente en eso radica la gran potencia de Node.js.

Otro beneficio que podemos enumerar de Node.js es la posibilidad de ejecutar muchas operaciones de manera rápida y que en todo momento responda a eventos sin la necesidad de estar sujeto a terminar un proceso.

Existe en la red un cantidad muy extensa de material de apoyo para aprender Node.js, pero dejare aquí unos sitios donde comenzar:


Bueno es todo lo que puedo decir por este momento, aun no tengo códigos que mostrar ya que estoy en fase de aprendizaje.


viernes, 9 de enero de 2015

Feliz 2015

Chilpancingo, Gro. 09 de Enero de 2015, pues bueno ya es 2015 y aquí he regresado a escribir un poco y desear que sea un año de lo mejor para todos, que muchos de los conflictos que se viven en nuestro país México se resuelvan de la mejor manera, y claro que se empiece por Chilpo, ya que van varios meses que esta un poco complicado.



jueves, 15 de mayo de 2014

Proyecto de gestion de contratos con Java y MySQL

En esta ocasión traigo un proyecto de ejemplo para gestionar una tabla con datos de contratos, para ello se utilizara el motor de bases de datos MySQL y para la parte de insertar, editar y borrar se programara una interfaz gráfica con JAVA.

El programa final se vera de la siguiente forma:



Primero se creara la tabla con la siguiente estructura:

CREATE TABLE IF NOT EXISTS `contratos` (
  `Numero` varchar(60) NOT NULL,
  `DescCorta` varchar(180) NOT NULL,
  `DescLarga` text NOT NULL,
  `Importe` decimal(18,2) NOT NULL,
  `FechaIni` date NOT NULL,
  `FechaFin` date NOT NULL,
  PRIMARY KEY (`Numero`)
) ENGINE=MyISAM DEFAULT CHARSET=latin1;

El programa constara de cuatro clases que serán necesarias para la correcta ejecución:

  • Clase manejadorBD
  • Clase Contrato
  • Clase ventanaGestion
  • Clase GestionContratos
La clase manejadorBD tiene los métodos para manipular la conexión a la base de datos y la acciones de insertar, actualizar y borrar.


La clase Contrato tiene los atributos y métodos necesarios para manipular los datos del contrato como crear uno nuevo, modificar y borrar.

La clase ventanaGestion es necesaria para crear la interfaz gráfica que vera el usuario.

Por ultimo la clase GestionContratos tiene el método main que es donde iniciara el programa.

Aquí dejo el código final, que casi en su totalidad es propio pero no niego que algunas partes han sido tomadas de foros y de las paginas http://docs.oracle.com/ y http://www.chuidiang.com/ 

import javax.swing.*;
import java.awt.event.*;
import java.sql.*;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import javax.swing.JOptionPane;
import javax.swing.DefaultComboBoxModel;
import javax.swing.JOptionPane;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.text.DecimalFormat;
import javax.swing.text.NumberFormatter;
import java.text.SimpleDateFormat;
import java.text.ParseException;

/** * @author http:// dataguerrero.blogspot.mx
*/

class manejadorBD {
    String host = "localhost";
    String bd = "obras";
    String usuario = "root";
    String password = "123456admin";    
    String mensajeCorrecto = "La información se almaceno de forma correcta";
        
    public Connection nuevaConexion() throws Exception
    {
        Class.forName("com.mysql.jdbc.Driver");                            
        return DriverManager.getConnection ("jdbc:mysql://" + host + "/" + bd,usuario, password);
    }
    
    public boolean ejecutaQuery(String strQuery)
    {
    boolean resultado = false;
        Connection conexion = null;
        try            
            {            
                conexion = nuevaConexion();
                Statement st = conexion.createStatement();                
                st.executeUpdate(strQuery, Statement.RETURN_GENERATED_KEYS);
                resultado = true;
                st.close();                
            }
        catch (Exception e)
            {            
                resultado = false;
            }
        finally {
            try
            {
                if(conexion != null)
                    conexion.close();
            }
            catch(Exception e)
            {
                resultado = false;
            }
        }
        return resultado;
    }       
}

class Contrato {
String Numero;
String DescCorta;
String DescLarga;
Double Importe;
String FechaIni;
String FechaFin;

public Contrato()
{
this.Numero = "";
this.DescCorta = "";
this.DescLarga = "";
this.Importe = 0.00;
this.FechaIni = "";
this.FechaFin = "";
}

public Contrato(String Numero, String DescCorta, String DescLarga, Double Importe, String FechaIni, String FechaFin)
{
this.Numero = Numero;
this.DescCorta = DescCorta;
this.DescLarga = DescLarga;
this.Importe = Importe;
this.FechaIni = FechaIni;
this.FechaFin = FechaFin;
}

public boolean insertar()
{
String strQuery = "INSERT INTO contratos VALUES('"
+ this.Numero + "','" + this.DescCorta + "','" + this.DescLarga + "'," + this.Importe + ",'" + this.FechaIni + "','" + this.FechaFin + "');";
manejadorBD conexion = new manejadorBD();
boolean resultado = conexion.ejecutaQuery(strQuery);
return resultado;
}

public boolean modificar()
{
String strQuery = "UPDATE contratos SET Numero='"
+ this.Numero + "',DescCorta='" + this.DescCorta + "',DescLarga='" + this.DescLarga + "',Importe=" + this.Importe + ",FechaIni='" 
+ this.FechaIni + "',FechaFin='" + this.FechaFin + "' WHERE Numero='" + this.Numero + "'";
manejadorBD conexion = new manejadorBD();
boolean resultado = conexion.ejecutaQuery(strQuery);
return resultado;
}

public boolean borrar()
{
manejadorBD conexion = new manejadorBD();
boolean resultado = conexion.ejecutaQuery("DELETE FROM contratos WHERE Numero='" + this.Numero + "'");
return resultado;
}

public String toString()
{
return this.Numero;
}
}

class ventanaGestion {
JFrame ventana = new JFrame("Gestion de Contratos");
JPanel panelFormulario = new JPanel();
JPanel panelBotones = new JPanel();
JLabel lblLista = new JLabel("Lista de Contratos");
JComboBox<Contrato> listaContratos = new JComboBox<>();
    DefaultComboBoxModel<Contrato> modeloContratos = new DefaultComboBoxModel<>();
JLabel lblNumero = new JLabel("Numero de Contrato");
JTextField txtNumero = new JTextField();
JLabel lblDescCorta = new JLabel("Descripcion Corta");
JTextField txtDescCorta = new JTextField();
JLabel lblDescLarga = new JLabel("Desc. Completa");
JTextField txtDescLarga = new JTextField();
JLabel lblImporte = new JLabel("Importe");
JFormattedTextField txtImporte;
JLabel lblFechaIni = new JLabel("Fecha de Inicio");
JFormattedTextField txtFechaIni;
JLabel lblFechaFin = new JLabel("Fecha de Conclusion");
JFormattedTextField txtFechaFin;
JButton btnNuevo = new JButton("Contrato Nuevo");
JButton btnModificar = new JButton("Modificar Contrato");
JButton btnQuitar = new JButton("Quitar Contrato");
JButton btnGuardar = new JButton("Guardar");
JButton btnCancelar = new JButton("Cancelar");    
int ancho;
int alto;
int opcion;

ventanaGestion()
{
ancho = 640;
alto = 300;
opcion = 0;
ventana.setSize(ancho,alto);
Dimension pantalla = Toolkit.getDefaultToolkit().getScreenSize();        
        ventana.setLocation((pantalla.width/2-(ancho/2)),pantalla.height/2-(alto/2));
ventana.setLayout(null);
ventana.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}

public void interfazGestion()
{
panelFormulario.setLayout(null);
lblLista.setBounds(5,5,120,30);
listaContratos.setBounds(130,5,280,30);
listaContratos.setModel(modeloContratos);
lblNumero.setBounds(5,40,120,30);
txtNumero.setBounds(130,40,280,30);
lblDescCorta.setBounds(5,75,120,30);
txtDescCorta.setBounds(130,75,(ancho - 160),30);
lblDescLarga.setBounds(5,110,120,30);
txtDescLarga.setBounds(130,110,(ancho - 160),30);
lblImporte.setBounds(5,145,120,30);
DecimalFormat NumeroDecimal = new DecimalFormat("0.00");
NumberFormatter formatoImporte = new NumberFormatter(NumeroDecimal);
formatoImporte.setValueClass(Double.class);
formatoImporte.setAllowsInvalid(false);
txtImporte = new JFormattedTextField(formatoImporte);
txtImporte.setBounds(130,145,140,30);
lblFechaIni.setBounds(5,180,120,30);
txtFechaIni = new JFormattedTextField(new SimpleDateFormat("yyyy-MM-dd"));
txtFechaIni.setValue(new java.util.Date());
txtFechaIni.setBounds(130,180,140,30);
lblFechaFin.setBounds(320,180,120,30);
txtFechaFin = new JFormattedTextField(new SimpleDateFormat("yyyy-MM-dd"));
txtFechaFin.setValue(new java.util.Date());
txtFechaFin.setBounds(470,180,140,30);
habilitarGuardadoCancelar(false);
panelFormulario.add(lblLista);
panelFormulario.add(listaContratos);
panelFormulario.add(lblNumero);
panelFormulario.add(txtNumero);
panelFormulario.add(lblDescCorta);
panelFormulario.add(txtDescCorta);
panelFormulario.add(lblDescLarga);
panelFormulario.add(txtDescLarga);
panelFormulario.add(lblImporte);
panelFormulario.add(txtImporte);
panelFormulario.add(lblFechaIni);
panelFormulario.add(txtFechaIni);
panelFormulario.add(lblFechaFin);
panelFormulario.add(txtFechaFin);
panelBotones.add(btnNuevo);
panelBotones.add(btnModificar);
panelBotones.add(btnQuitar);
panelBotones.add(btnGuardar);
panelBotones.add(btnCancelar);
panelFormulario.setBounds(0,0,ancho,215);
panelBotones.setBounds(0,215,ancho,60);
ventana.add(panelFormulario);
ventana.add(panelBotones);
}

public void show()
{
interfazGestion();
btnNuevo.addMouseListener(new MouseAdapter() { 
@Override public void mouseClicked(MouseEvent e){
nuevo();

});

btnModificar.addMouseListener(new MouseAdapter() { 
@Override public void mouseClicked(MouseEvent e){
modificar();

});

btnQuitar.addMouseListener(new MouseAdapter() {
@Override public void mouseClicked(MouseEvent e){
quitar();
}
});

btnGuardar.addMouseListener(new MouseAdapter() { 
@Override public void mouseClicked(MouseEvent e){
guardar();

});

btnCancelar.addMouseListener(new MouseAdapter() { 
@Override public void mouseClicked(MouseEvent e){
if(listaContratos.getSelectedIndex()>-1)
listaContratos.setSelectedIndex(listaContratos.getSelectedIndex());
opcion = 0;
habilitarGuardadoCancelar(false);

});

listaContratos.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if(listaContratos.getSelectedIndex()>-1){
                    Contrato RegSeleccionado = modeloContratos.getElementAt(listaContratos.getSelectedIndex());                    
                    llenaCampos(RegSeleccionado);                  
                }
            }
});
llenarTablaContratos();
ventana.setVisible(true);
}

    public void llenarTablaContratos()
    {
        manejadorBD losContratos = new manejadorBD();
        Connection con = null;
        try
        {
            con = losContratos.nuevaConexion();
            Statement st = con.createStatement();
            ResultSet rs = st.executeQuery("SELECT * FROM contratos");                        
            while (rs.next())
            {                
                Contrato objeto = new Contrato(
                        rs.getObject("Numero").toString(),
                        rs.getObject("DescCorta").toString(),
                        rs.getObject("DescLarga").toString(),
                        Double.parseDouble(rs.getObject("Importe").toString()),
                        rs.getObject("FechaIni").toString(),
                        rs.getObject("FechaFin").toString());
                modeloContratos.addElement(objeto);
            }
            rs.close();    
        }
        catch (Exception e)
            {
                JOptionPane.showMessageDialog(null, e.getMessage(), "Ocurrio un Error", JOptionPane.ERROR_MESSAGE);
            }
        finally 
        {
            try
            {
                if(con != null)
                    con.close();
            }
            catch(Exception e)
            {
                JOptionPane.showMessageDialog(null, e.getMessage(), "Ocurrio un Error", JOptionPane.ERROR_MESSAGE);            
            }
        }
    }

public void nuevo()
{
txtNumero.setText("");
txtDescCorta.setText("");
txtDescLarga.setText("");
txtImporte.setText("0.00");
txtFechaIni.setValue(new java.util.Date());
txtFechaFin.setValue(new java.util.Date());
habilitarGuardadoCancelar(true);
txtNumero.requestFocus(true);
opcion = 1;
}

public void modificar()
{
habilitarGuardadoCancelar(true);
opcion = 2;
}

public void quitar()
{
if(JOptionPane.showConfirmDialog(null, "Realmente desea borrar el contrato?", "Advertencia", JOptionPane.OK_OPTION)==JOptionPane.OK_OPTION)
{
Contrato registro = new Contrato(txtNumero.getText(), txtDescCorta.getText(),
txtDescLarga.getText(), Double.parseDouble(txtImporte.getText()),
txtFechaIni.getText(), txtFechaFin.getText());
boolean resultado = registro.borrar();
if(resultado)
JOptionPane.showMessageDialog(null, "Se quito el contrato con numero: " + registro,"Aviso", JOptionPane.INFORMATION_MESSAGE);
else
JOptionPane.showMessageDialog(null, "Error no se quito el contrato", "Aviso de Error", JOptionPane.ERROR_MESSAGE);

}
}

public void guardar()
{
boolean resultado = false;
String strMensaje = "";
Contrato registro = new Contrato(txtNumero.getText(), txtDescCorta.getText(),
txtDescLarga.getText(), Double.parseDouble(txtImporte.getText()),
txtFechaIni.getText(), txtFechaFin.getText());
switch(opcion)
{
case 1:
resultado = registro.insertar();
if(resultado)
{
strMensaje = "Se agrego el contrato con numero: " + registro;
int fila = listaContratos.getItemCount();
modeloContratos.insertElementAt(registro,fila);
listaContratos.setSelectedIndex(fila);
}
else
strMensaje = "Error con el guardado del contrato";
break;
case 2:
resultado = registro.modificar();
if(resultado)
{
int fila = listaContratos.getSelectedIndex();                                        
strMensaje = "Se actualizo el contrato con numero: " + registro;
modeloContratos.removeElementAt(fila);
modeloContratos.insertElementAt(registro,fila);
listaContratos.setSelectedIndex(fila);
}
else
strMensaje = "Error no se actualizo el contrato";
break;
}
if(resultado)
JOptionPane.showMessageDialog(null, strMensaje,"Aviso", JOptionPane.INFORMATION_MESSAGE);
else
JOptionPane.showMessageDialog(null, strMensaje, "Aviso de Error", JOptionPane.ERROR_MESSAGE);
opcion = 0;
habilitarGuardadoCancelar(false);
}

public void habilitarGuardadoCancelar(boolean opcion)
{
listaContratos.setEnabled(!opcion);
txtNumero.setEnabled(opcion);
txtDescCorta.setEnabled(opcion);
txtDescLarga.setEnabled(opcion);
txtImporte.setEnabled(opcion);
txtFechaIni.setEnabled(opcion);
txtFechaFin.setEnabled(opcion);
btnCancelar.setEnabled(opcion);
btnGuardar.setEnabled(opcion);
btnNuevo.setEnabled(!opcion);
btnModificar.setEnabled(!opcion);
btnQuitar.setEnabled(!opcion);
}

public void llenaCampos(Contrato RegSeleccionado)
{
SimpleDateFormat formatoFecha = new SimpleDateFormat("yyyy-MM-dd");
txtNumero.setText(RegSeleccionado.Numero);
txtDescCorta.setText(RegSeleccionado.DescCorta);
txtDescLarga.setText(RegSeleccionado.DescLarga);
txtImporte.setText(String.valueOf(RegSeleccionado.Importe));
java.util.Date fechaInicio = null;
try {
fechaInicio = formatoFecha.parse(RegSeleccionado.FechaIni); 
txtFechaIni.setValue(fechaInicio);
}
catch (ParseException ex) { 
txtFechaIni.setValue(new java.util.Date());
}        
txtFechaFin.setText(RegSeleccionado.FechaFin);
}
}

public class GestionContratos { 
public static void main(String[] args) {
ventanaGestion ventana = new ventanaGestion();
ventana.show();
}
}

Como nota final debo mencionar que el programa no esta terminado, ya que requiere de validación de datos que se capturan, manejos de excepciones y otros ajustes, pero la intención es de mostrar un poco del uso de MySQL y JAVA.