Páginas

NIMADRES

Automata en C++

La teoría de autómatas es una rama de las ciencias de la computación que estudia las máquinas abstractas y los problemas que éstas son capaces de resolver. La teoría de autómatas está estrechamente relacionada con la teoría del lenguaje formal ya que los autómatas son clasificados a menudo por la clase de lenguajes formales que son capaces de reconocer.
Un autómata es un modelo matemático para una máquina de estado finito (FSM sus siglas en inglés). Una FSM es una máquina que, dada una entrada de símbolos, "salta" a través de una serie de estados de acuerdo a una función de transición (que puede ser expresada como una tabla). En la variedad común "Mealy" de FSMs, esta función de transición dice al autómata a qué estado cambiar dados unos determinados estado y símbolo.
La entrada es leída símbolo por símbolo, hasta que es "consumida" completamente (piense en ésta como una cinta con una palabra escrita en ella, que es leída por una cabeza lectora del autómata; la cabeza se mueve a lo largo de la cinta, leyendo un símbolo a la vez) una vez la entrada se ha agotado, el autómata se detiene.

Dependiendo del estado en el que el autómata finaliza se dice que este ha aceptado o rechazado la entrada. Si éste termina en el estado "acepta", el autómata acepta la palabra. Si lo hace en el estado "rechaza", el autómata rechazó la palabra, el conjunto de todas las palabras aceptadas por el autómata constituyen el lenguaje aceptado por el mismo.

En este autómata nos basamos en la imagen siguiente, la cual muestra el diagrama del autómata con la secuencia de estados, este es un autómata finito determinista, ya no tiene transiciones vacías.
El programa esta hecho en base al ejemplo tal cual.


Este autómata verifica una cadena, si llega al estado 4 significa que la cadena ingresada es un hexadecimal, si el estado termina en 5 significa que es un natural, si termina en 7  es decimal, si termina en 8 es un octal.
Este es solo un ejemplo, ustedes en base a este que esta simple pueden hacer uno mucho mas complejo.

La manera en la que se maneja el programa es muy parecida a la de un analizador léxico ya que regresa que tipo de cadena es, esto lo hice solo para verificar que el programa funciona correctamente.





Eh aquí el Código:


#include <iostream>
#define UDEF -1
using namespace std;
int delta(int estado, char c){
 switch(estado){
          case 0: if(c == '0') return 1;
                  else if((isdigit(c)) and c > '0') return 5;
                  else if(c == '.') return 6;
                  else return UDEF;
          case 1: if(isdigit(c) and c < '8') return 8;
                  else if(c == 'X' or c == 'x') return 2;
                  else if(c == '.') return 6;
                  else return UDEF;
          case 2: if(isxdigit(c)) return 3;
                  else return UDEF;
          case 3: if(isxdigit(c)) return 4;
                  else return UDEF;
          case 4: if(isxdigit(c)) return 3;
                  else return UDEF;
          case 5: if(isdigit(c)) return 5;
                  else if( c == '.') return 6;
                  else return UDEF;
          case 6: if(isdigit(c)) return 7;
                  else return UDEF;
          case 7: if(isdigit(c)) return 7;
                  else return UDEF;
          case 8: if(isdigit(c) and c < '8') return 8;
                  else return UDEF;                  
    }
}

string process(int estado, const char *cadena){
    for(int i = 0;cadena[i] != 0; i++){
        estado = delta(estado,cadena[i]);
        if(estado == UDEF) break;
    }
 if(estado == 4) return "hexadecimal";
 else if(estado == 5) return "natural";
 else if(estado == 7) return "decimal";
 else if(estado == 8) return "octal";
 else return "no valida";
}

string test(const char *cadena){
    int pf = 0; // estado inicial
    string tipo;
    tipo = process(pf,cadena);
    return tipo;
}

int main(){
 string cadena;
 cout << "Ingresa la cadena: ";
 getline(cin,cadena);
 cout << "La cadena es: " << test(cadena.c_str());
 return 0;
}


Si tienen comentarios o sugerencias, no duden en comentar.

Enviar Correos desde java (Gráfico)

Esta vez les traigo un programa que nos permite enviar correos electrónicos usando los servidores que mas frecuentamos(gmail,hotmail,live,outlook), Sabemos de ante mano que para poder enviar correos se necesita saber mas que nada que protocolo vamos a utilizar, en este caso sera el  "SMTP" (Simple Mail Transfer Protocol), Protocolo de red basado en texto, utilizado para el intercambio de mensajes de correo electrónico entre computadoras u otros dispositivos. También necesitamos saber que puerto utilizan los servidores a los que nos vamos a conectar, según CISCO el protocolo SMTP utiliza el puerto de salida "25", pero investigando y haciendo pruebas me entere que GMAIL,HOTMAIL,LIVE y OUTLOOK utilizan el puerto "587", después investigando un poco de teoría, me entero que generalmente usan el puerto "25" o "587" y hay otros que soportan los dos y hasta un tercer puerto ("465"), en este caso haciendo pruebas, coincidí que con el "587" es mas viable.

La aplicación ya compilada y ejecutada, nos permite iniciar la sesión  después podemos poner el asunto, el correo al que va dirigido  es posible también mandar un archivo adjunto y el texto.


Para esta aplicación utilice 3 API's de Java, mismos que dejare en un link:


API's JAR


Para agregar estas librerías a mi proyecto utilice netBeans, para aquellos que no sepan como se añaden al proyecto, les dejo un post donde pueden ver como podrían agregarlas:


LinkCrear PDF, API (iText)


Agradecimientos especiales a Fernando Gonzalez Camacho quien fue de vital importancia para hacer esto posible.

Ahora les muestro una vista previa de como se vería la salida del programa al ejecutarlo:


















Para finalizar les dejo el código fuente (Tres archivos) del programa y las imágenes que utilice:

Esta es la clase donde se aplica la interfaz gráfica:



import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Cursor;
import java.awt.FlowLayout;
import java.awt.Font;
import java.awt.GridLayout;
import java.awt.Image;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.FocusEvent;
import java.awt.event.FocusListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.io.File;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.JTextField;
public class Mail extends JFrame implements FocusListener, MouseListener{
    public String user,pass;
    private JPanel panel = new JPanel();
    private JPanel panelFondo = new JPanel();
    private JPanel panelEnviarSalir = new JPanel();
    private JMenuBar barra = new JMenuBar();
    private JMenu menuArchivo = new JMenu("Archivo");
    private JMenuItem itemEnviar = new JMenuItem("enviar");
    private JMenuItem itemSalir = new JMenuItem("Salir");
    private JTextArea areaTexto = new JTextArea("Agregar Mensaje...");
    private JLabel lblAsunto = new JLabel("Asunto: ");
    private JTextField txtAsunto = new JTextField();
    private JLabel lblCorreo = new JLabel("Correo: ");
    private JTextField txtCorreo = new JTextField();
    private JLabel lblAdjuntar = new JLabel();
    private JButton botonEnviar = new JButton("Enviar");
    private JButton botonSalir = new JButton("Salir");
    private Correo correo;
    public File selectedFile;
    
    IniciarSesion sesion = new IniciarSesion();
    public Mail(){        
        initComponents();
        setIconImage(getIconImage());
        setTitle("NIMADRES-MAIL");
        setBounds(300,150,500,500);
        setVisible(false);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setResizable(true);
    }
    @Override
    public final Image getIconImage() {
        Image iconoVentana = Toolkit.getDefaultToolkit().
        getImage(ClassLoader.getSystemResource("icono.png"));
        return iconoVentana;
    }
    public final void initComponents(){       
        panelFondo.setLayout(new BorderLayout());
        panel.setLayout(new GridLayout(5, 3));
        panel.setBackground(Color.black);
        itemEnviar.setBackground(Color.black);
        itemEnviar.setForeground(Color.red);
        itemSalir.setForeground(Color.red);
        itemSalir.setBackground(Color.black);
        menuArchivo.setBackground(Color.BLACK);
        menuArchivo.setForeground(Color.red);
        barra.setBackground(Color.black);
        menuArchivo.add(itemEnviar);
        menuArchivo.add(itemSalir);
        barra.add(menuArchivo);
        lblAsunto.setBackground(Color.black);
        lblAsunto.setForeground(Color.red);
        lblAsunto.setFont(new Font("consolas",1,20));
        txtAsunto.setBackground(Color.black);
        txtAsunto.setForeground(Color.white);
        lblCorreo.setBackground(Color.black);
        lblCorreo.setForeground(Color.red);
        lblCorreo.setFont(new Font("conoslas",1,20));
        txtCorreo.setBackground(Color.black);
        txtCorreo.setForeground(Color.white);
        lblAdjuntar.setIcon(new ImageIcon(getClass()
                .getResource("adjuntar.png")));
        lblAdjuntar.setCursor(new Cursor(HAND_CURSOR));
        areaTexto.setForeground(Color.white);
        areaTexto.setBackground(Color.black);       
        areaTexto.setFont(new Font("Consolas",1,15));
        areaTexto.setLineWrap(true);
        areaTexto.setWrapStyleWord(true);
        panel.add(lblAsunto);
        panel.add(txtAsunto);
        panel.add(lblCorreo);
        panel.add(txtCorreo);
        panel.add(lblAdjuntar);
        add(barra, BorderLayout.NORTH);
        panelFondo.add(panel,BorderLayout.NORTH);       
        panelFondo.add(new JScrollPane(areaTexto),BorderLayout.CENTER);
        add(panelFondo);        
        panelEnviarSalir.setLayout(new FlowLayout());
        botonEnviar.setBackground(Color.BLACK);
        botonEnviar.setForeground(Color.red);
        botonSalir.setBackground(Color.BLACK);
        botonSalir.setForeground(Color.red);
        panelEnviarSalir.add(botonEnviar);
        panelEnviarSalir.add(botonSalir);
        panelEnviarSalir.setBackground(Color.black);        
        add(panelEnviarSalir,BorderLayout.SOUTH);
        botonEnviar.addActionListener(sesion);
        botonSalir.addActionListener(sesion);
        itemSalir.addActionListener(sesion);
        itemEnviar.addActionListener(sesion);
        areaTexto.addFocusListener(this);
        areaTexto.setForeground(Color.LIGHT_GRAY);
        lblAdjuntar.addMouseListener(this);
    }
    public void Inicio(final String user, final String pass) throws Exception{
        correo = new Correo();
        setVisible(true);
    }
    @Override
    public void focusGained(FocusEvent arg0) {
        if(areaTexto.getText().equalsIgnoreCase("Agregar Mensaje...")) {
            areaTexto.setText("");
            areaTexto.setForeground(Color.white);
        }
    }
    @Override
    public void focusLost(FocusEvent fe) {
        if(areaTexto.getText().equalsIgnoreCase("")) {
            areaTexto.setText("Agregar Mensaje...");
            areaTexto.setForeground(Color.LIGHT_GRAY);
        }
    }
    @Override
    public void mouseClicked(MouseEvent me) { 
        if(me.getSource().equals(lblAdjuntar)){
            JFileChooser fileChooser = new JFileChooser();
            int returnValue = fileChooser.showOpenDialog(null);
            if (returnValue == JFileChooser.APPROVE_OPTION) {
                selectedFile = fileChooser.getSelectedFile();
            }
        }
    }

    @Override
    public void mousePressed(MouseEvent me) {}

    @Override
    public void mouseReleased(MouseEvent me) {}

    @Override
    public void mouseEntered(MouseEvent me) {}

    @Override
    public void mouseExited(MouseEvent me) {}
    
    class IniciarSesion extends JDialog implements ActionListener,FocusListener{
        private JTextField usuario = new JTextField("ejemplo@algo.com...");
        private JPasswordField password = new JPasswordField();
        private JLabel lblusuario = new JLabel("Correo");
        private JLabel lblpassword = new JLabel("Password");
        private JPanel panel = new JPanel();
        private JButton iniciar = new JButton("Iniciar");
        private JButton cancelar = new JButton("Cancelar");
        public IniciarSesion(){
            initComponents();
            setIconImage(getIconImage());
            setTitle("NIMADRES");
            this.setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
            setBounds(500, 250, 350, 250);
            setVisible(true);
        }
        public final void initComponents(){
            panel.setLayout(null);
            panel.setBackground(Color.black);
            lblusuario.setText("Correo:");
            lblusuario.setForeground(Color.red);
            lblusuario.setBounds(75, 10, 100, 20);
            lblusuario.setFont(new Font("consolas", 1, 20));
            usuario.setBounds(75, 30, 200, 30);
            usuario.setFont(new Font("consolas", 1, 12));
            usuario.setBackground(Color.black);
            usuario.setForeground(Color.white);
            lblpassword.setText("Contraseña");
            lblpassword.setBounds(75, 75, 150, 30);
            lblpassword.setFont(new Font("consolas", 1, 20));
            lblpassword.setForeground(Color.red);
            password.setBounds(75, 100, 200, 30);
            password.setFont(new Font("consolas", 1, 12));
            password.setBackground(Color.black);
            password.setForeground(Color.white);
            iniciar.setBounds(65, 150, 100, 30);
            iniciar.setForeground(Color.red);
            iniciar.setBackground(Color.black);
            cancelar.setBounds(200, 150, 100, 30);
            cancelar.setForeground(Color.red);
            cancelar.setBackground(Color.black);
            panel.add(lblusuario);
            panel.add(usuario);
            panel.add(lblpassword);
            panel.add(password);
            panel.add(iniciar);
            panel.add(cancelar);
            add(panel);
            iniciar.addActionListener(this);
            cancelar.addActionListener(this);
            usuario.addFocusListener(this);
            usuario.setForeground(Color.LIGHT_GRAY);
        }
        @Override
        public void actionPerformed(ActionEvent e) {
            //Iniciar Sesion
            if(e.getSource().equals(iniciar)){
                user = usuario.getText();
                pass = password.getText();
                if(Validation(user)){
                    setVisible(false);                   
                    usuario.setText("");
                    password.setText("");
                    try {
                        Inicio(user, pass);
                    } catch (Exception ex) {
                        Logger.getLogger(Mail.class.getName())
                                .log(Level.SEVERE, null, ex);
                    }
                }
                else
                    JOptionPane.showMessageDialog(this,
                        "la cuenta no es valida","FATAL ERROR",
                        JOptionPane.ERROR_MESSAGE);
            }
            if(e.getSource().equals(cancelar) || e.getSource().equals(itemSalir)
                    || e.getSource().equals(botonSalir)){
                System.exit(0);
            }
            if(e.getSource().equals(itemEnviar) || 
                    e.getSource().equals(botonEnviar)){
                try {
                    if(correo.enviaCfd(user, pass,txtCorreo.getText(),
                        txtAsunto.getText(),areaTexto.getText(),selectedFile)){
                        txtCorreo.setText("");            
                        txtAsunto.setText("");
                        areaTexto.setText("");
                        selectedFile = null;
                    }
                } catch (Exception ex) {
                    Logger.getLogger(Mail.class.getName())
                            .log(Level.SEVERE, null, ex);
                }
            }
        }
        @Override
        public void focusGained(FocusEvent arg0) {
            if(usuario.getText().equalsIgnoreCase("ejemplo@algo.com...")) {
                usuario.setText("");
                usuario.setForeground(Color.white);
            }
        }
        @Override
        public void focusLost(FocusEvent fe) {
            if(usuario.getText().equalsIgnoreCase("")) {
                usuario.setText("ejemplo@algo.com...");
                usuario.setForeground(Color.LIGHT_GRAY);
            }
        }
        public boolean Validation(String _Mail){
            Pattern p = Pattern.compile("^[_a-z0-9-]+(\\.[_a-z0-9-]+)*@[a-z0-9-]+(\\.[a-z0-9-]+)*(\\.[a-z]{2,4})$");
            Matcher m = p.matcher(_Mail);
            if(m.matches()){
                   return true;
            }
            return false;
        }
    }
}
Después hacemos la clase donde utilizamos las API's que añadimos al proyecto:
import java.io.File;
import java.io.IOException;
import java.util.Properties;
import javax.activation.DataHandler;
import javax.activation.FileDataSource;
import javax.mail.BodyPart;
import javax.mail.Message;
import javax.mail.MessagingException;
import javax.mail.Multipart;
import javax.mail.Session;
import javax.mail.Transport;
import javax.mail.internet.InternetAddress;
import javax.mail.internet.MimeBodyPart;
import javax.mail.internet.MimeMessage;
import javax.mail.internet.MimeMultipart;
import javax.swing.JOptionPane;
public class Correo {
    private static final String PROTOCOL = "smtp";
    private static final String SMTP_SERVER_LIVE = "smtp.live.com";
    //private static final String SMTP_PORT_LIVE = "25";
    private static final String SMTP_SERVER_GMAIL = "smtp.gmail.com";
    private static final String SMTP_PORT_GMAIL = "587";
    //private static final String SMTP_SERVER_HOTMAIL = "msn.hotmail.com";
    private Properties props = new Properties();
    public boolean enviaCfd(final String USERNAME, 
            final String PASSWORD,final String destino,
            final String asunto,final String texto, File archivo){
        try{
            Multipart multipart = new MimeMultipart();
            MimeBodyPart attachmentPart = null;
            if (archivo != null) {
                BodyPart _texto = new MimeBodyPart();
                _texto.setText(texto);
                attachmentPart = new MimeBodyPart();
                FileDataSource fileDataSource = new FileDataSource(archivo);
                attachmentPart.setDataHandler(new DataHandler(fileDataSource));
                attachmentPart.setFileName(texto);
                attachmentPart.attachFile(archivo);
                multipart.addBodyPart(attachmentPart);
                multipart.addBodyPart(_texto);
            }
            // Propiedades de la conexión
            String cuenta[] = USERNAME.split("@");
            SMTP_SERVER(USERNAME,cuenta[1]);
            // Preparamos la sesion
            Session session = Session.getDefaultInstance(props);
            // Construimos el mensaje
            MimeMessage message = new MimeMessage(session);
            message.setFrom(new InternetAddress(destino));
            message.addRecipient(Message.
                    RecipientType.TO,new InternetAddress(destino));
            message.setSubject(asunto);
            message.setText(texto);
            if(archivo != null){
                message.setContent(multipart);
            }
            // Lo enviamos.
            Transport t = session.getTransport(PROTOCOL);
            t.connect(USERNAME, PASSWORD);
            t.sendMessage(message, message.getAllRecipients());
            // Cierre.
            t.close();            
            JOptionPane.showMessageDialog(null
                    ,"Mensaje Enviado"
                    ,"NIMADRES"
            ,JOptionPane.INFORMATION_MESSAGE);
            return true;
        }
        catch (MessagingException | IOException e){
            JOptionPane.showMessageDialog(null
                ,"No se pudo enviar mensaje, intentelo mas tarde"
                ,"Fatal Error"
            ,JOptionPane.ERROR_MESSAGE);
            return false;
        }
    }
    public void SMTP_SERVER(final String user,final String cuenta){
        switch(cuenta){
            case "gmail.com" :
                props.setProperty("mail.smtp.host", SMTP_SERVER_GMAIL);
                props.setProperty("mail.smtp.port", SMTP_PORT_GMAIL);
                break;
            case "hotmail.com" :
            case "live.com.mx" :          
                props.setProperty("mail.smtp.host", SMTP_SERVER_LIVE);
                props.setProperty("mail.smtp.port", SMTP_PORT_GMAIL);
                break;            
        }
        props.setProperty("mail.smtp.starttls.enable", "true");            
        props.setProperty("mail.smtp.user", user);
        props.setProperty("mail.smtp.auth", "true");
    }
    
}

Al final Solo agregamos la clase Main para terminar el programa:
public class Main {
    public static void main(String[] args) {
        Mail m = new Mail();
    }
}


Estas son las imágenes que utilice en el programa: