martes, 22 de marzo de 2011

CONEXIÓN REMOTA A UNA BASE DE DATOS CON MYSQL

Hola nuevamente, esta ocasión les traigo un tutorial o mejor dicho un minitutorial acerca de cómo conectarse a una base de datos de forma remota utilizando MySQL. ¿Qué significa esto? Pues esto significa que ustedes aprenderán a conectarse a una base de datos que se encuentre en una maquina diferente al que están utilizando por medio de alguna red; para posteriormente poder manipular dicha base de datos, haciendo consultas, creando tablas, insertando datos, etc. En el diagrama 1 se muestra una representación de nuestro objetivo.



Diagrama 1

Los requisitos para realizar esta práctica son:


  •         2 o más computadoras. (En este ejemplo solo utilicé 2 computadoras, pero si quieren pueden usar más de una ya que serán los mismos pasos para todas ellas).
  •            Establecer una conexión a través de una red con las computadoras disponibles.
  •           Instalar MySQL (En mi caso instale el MySQL Server 6.0, pero pueden utilizar cualquier versión superior al 5.0 o incluso pueden utilizar los servidores de XAMP o WAMP. La instalación se tiene que hacer en las dos maquinas).



PASO 1

El primer paso es asegurarse de que todas las computadoras conectadas, se encuentran conectadas correctamente. Para esto abrimos el símbolo de sistema y utilizaremos el comando “ping”, el cual nos servirá para verificar si las maquinas están respondiendo de forma correcta a las peticiones de la red; para ello habrá que teclean lo siguiente >>ping 192.168.1.1, tal y como se muestra en la figura 1.



Figura 1

La IP que utiliza en este ejemplo tendrá que ser reemplazada por la ip de la maquina a la que se quiere conectar. Una vez hecho lo anterior tendrá que mostrarles el siguiente resultado:



Figura 2

Si este es el caso entonces la maquina remota está respondiendo correctamente y podrá seguir con el siguiente paso. Pero si apareció un resultado parecido al de la figura 3 entonces tendrán que configurar su equipo de modo que consigan conectarse de forma correcta(Si utilizan el sistema operativo Windows 7, les informo que para la conexión de redes es un poco más laborioso y probablemente no consigan una conexión a la primera; además en ocasiones no se puede conseguir una conexión con el equipo utilizando este SO, pero si es posible conectarse a MYSQL, así que si ven que el problema persiste aun después de varios intentos entonces sáltense al paso 2 ; si llegando al paso 4 sigue sin funcionar la conexión entonces definitivamente el error se deberá a la configuración de la red o incluso a los medios físicos que se estén utilizando).



Figura 3



PASO 2
El paso 2 es configurar MySQL para que el usuario root se pueda conectar remotamente. Para ello se tienen que realizar los siguientes pasos:


  •         Abrir el configurador de MySQL “MySQL Server Instance Config Wizard”


Figura 4


  • Posteriormente tendrán que seguir la siguiente secuencia de imágenes, tomando en cuenta los componentes encerrados con color rojo.


Figura 5


Figura 6


Figura 7



Figura 8


Figura 9


Figura 10


Figura 11

En la figura 12 se tiene que asegurar que en el cuadro de texto de “Port Number” se encuentre el puerto 3306 ya que este es el puerto por default que usa MySQL y también que la casilla de activación de “add firewall exception for this port ” se encuentre activa.



Figura 12


Figura 13

En la figura 14 se tiene que asegurar que la casilla “include bin directory in Windows path” se encuentre activa ya que este incluirá la consola de MySQL a las variables de entorno de Windows.



Figura 14

Con respecto a la figura 15, si esta es la primera vez que se hace esta configuración entonces solo se tienen que llenar los campos de “new root password(nueva contraseña de root)” y “confirm(confirmar contraseña)”, pero si ya se había hecho una configuración anterior entonces también se tendrá que llenar el campo de “current root password(contraseña actual)”; y posteriormente se tiene que activar la casilla “enable root Access from remote machines”, esto nos permitirá acceder con la cuenta root a las maquinas remotas.



Figura 15


Figura 16

Si todas las configuraciones fueron correctas entonces obtendremos algo similar a la siguiente figura:



Figura 17

Nota: esta configuración se tiene que realizar en las dos maquinas y de la misma manera.



PASO 3

El paso 3 consiste en crear una base de datos en la maquina remota (la maquina a la que queremos acceder). Para esto para esto, en la maquina 2 abrimos la consola de MySQL.



Figura 18

Una vez abierto la consola va a pedirles la una contraseña, tal y como se muestra en la siguiente figura:


Figura 19

Para ello teclean la contraseña que pusieron en la configuración anterior y teclean la tecla entrar para poder acceder a ella.



Figura 20

Después de haber accedido a MySQL se crea la base de datos con la siguiente instrucción:
create database basex;” tal y como se muestra en la siguiente figura:



Figura 21

Posteriormente usan esa base de datos con la siguiente instrucción:
“Use basex”



Figura 22

Una vez seleccionada la base de datos se proseguirá a crear las tablas, para ello se creará la tabla “tablax” con los atributos “id y nombre” utilizando la siguiente instrucción:

"Create table tablax(id int(2),nombre varchar(30));"



Figura 23

Después de crear la tabla, el siguiente paso es llenar la tabla. Para ello se utilizaran los siguientes datos:

Insert into tablax values(1,’Hilario’);
Insert into tablax values(1,’Pedro’);
Insert into tablax values(1,’Maria’);
Insert into tablax values(1,’Juan’);



Figura 24

Si se quieren asegurar de la inserción entonces tendrán que seleccionar los datos de la tabla con lo siguiente:

"Select * from tablax;"



Figura 25


Si ha llegado correctamente hasta este punto entonces podrá proseguir con el último paso que es el paso 4.




PASO 4
En este paso se accederá a la base de datos de la maquina 2 a través de MySQL desde la Maquina 1. Y para conseguir esto se tendrá que realizar lo siguiente:


  •          Abrir el símbolo de sistema en la maquina 1.


Figura 26

·         La siguiente instrucción nos servirá para conectarnos a la base de datos de la maquina 2:
Mysql –h 192.168.1.1 –u root –p” (donde la IP 192.168.1.1 tendrá que ser reemplazado por la ip de la maquina 2 y el usuario root se queda como tal)  después de escribir esto en el símbolo de sistema tecleamos la tecla entrar, posteriormente nos pedirá la contraseña y escribimos la contraseña que pusieron en la configuración.


Figura 27

Si todo salió bien entonces les tiene que dar el mismo resultado que la figura anterior. Una vez que se encuentren aquí ustedes podrán manipular las bases de datos que se encuentren en la maquina 2. Para ello seleccionamos la base que creamos anteriormente:
“Use basex”
Y
Hacemos una consulta de los datos de la tabla tablax:
Select * from tablax”



Figura 28

Para salir de la conexión simplemente teclean:
\q



Figura 29

Bueno espero que les haya gustado este minitutorial, trate de hacerlo lo más entendible posible, ojala y no se hayan confundido ok saludosss.

lunes, 7 de marzo de 2011

MULTIPLICACIÓN EGIPCIA CON JAVA

MULTIPLICACIÓN EGIPCIA EN JAVA, ACM 2008, HCH

Primeramente un saludo a todos, y en especial para los programadores y todos aquellos que quieran aprender. Esta es mi primera publicación y como me gusta programar en java pues decidí publicar un programa que hice cuando participe en el concurso de ACM ok, bueno este problema es del concurso de ACM del año 2008:

Nombre del problema: multiplicación Egipcia

Descripción:

Ancient Egyptian multiplication is a systematic method for multiplying two numbers that does not require the multiplication table, only the ability to multiply by 2, and to add. Also known as Egyptian multiplication and Peasant multiplication, it decomposes one of the multiplicands into a sum of powers of two and creates a table of doublings of the second multiplicand. This method may be called mediation and duplication, where mediation means halving one number and duplication means doubling the other number.

This method has three phases: the decomposition, the table and the result.

The decomposition of a number N thus consists of finding the powers of two which make it up. The Egyptians knew empirically that a given power of two would only appear once in a number. For the decomposition, they proceeded methodically; they would initially find the largest power of two less than or equal to the number in question, subtract it out and repeat until nothing remained. (The Egyptians did not make use of the number zero in mathematics).

Example: First consider the decomposition of the number N = 13 :
· the largest power of two less than or equal to 13 is 8, 13 - 8 = 5,
· the largest power of two less than or equal to 5 is 4, 5 - 4 = 1,
· the largest power of two less than or equal to 1 is 1, 1 - 1 = 0

N = 13 is thus the sum of the powers of two: 8, 4 and 1.

After the decomposition of the first multiplicand (N ), it is necessary to construct a table of powers of two times the second multiplicand (M ) from one up to the largest power of two found during the decomposition. In the table, a line is obtained by multiplying the preceding line by two.

For example, if the largest power of two found during the decomposition of N = 13 is 8 and M =238 , the table is created as follows:

Finally, the result is obtained by adding the numbers from the second column for which the corresponding power of two makes up part of the decomposition of N (denoted by a mark).

Thus, the result of the multiplication of 13 × 238 is obtained as the addition of: 1904 + 952 + 238 = 3094 or 238 + 952 + 1904 = 3094.

Input
The input consists of multiple test cases. Each test case consists of a single line containing two integers N and M ( 0 N, M 1, 000, 000, 000 ) that indicate the multiplicands and the begin addition specification, that it indicates from that row will initiate the addition by obtained the result. The begin addition specification is one of `u' or `b' referring to up row and bottom row respectively.

The last test case is followed by `-1' on a line by itself.

Output
For each test case, print the case number (beginning with 1) followed by the multiplicands (N and M ) separated by ` x ', an equal sign, and an expression giving the sum of the multiples of M (numbers from the second column of the table) for which the corresponding power of two makes up part of the decomposition of the multiplicand N of the form indicated by the begin addition specification. Use the format shown in the sample output below. In the event that the values of N or M are 0, then the answer must be only `0'.

Sample Input
13 238 u
13 238 b
1000 1 u
1 1000 b
1 1 u
0 10 u
-1

Sample Output
Case 1: 13 x 238 = 238 + 952 + 1904
Case 2: 13 x 238 = 1904 + 952 + 238
Case 3: 1000 x 1 = 8 + 32 + 64 + 128 + 256 + 512
Case 4: 1 x 1000 = 1000
Case 5: 1 x 1 = 1
Case 6: 0 x 10 = 0


Bueno en resumen lo que pide el problema es recrear la multiplicación egipcia; dicha multiplicación se obtiene de la sumatoria de varios números, por ejemplo:
La solución del caso 1 es:

13 x 238 = 238 + 952 + 1904


La multiplicación de 13x238 es igual a 3094. y la sumatoria de 238+952+1904=3094.
En el segundo miembro tenemos la equivalencia de multiplicar 13x238 en una sumatoria de varios números. Lo que tiene que hacer el programa es encontrar los números que tienen que sumarse para obtener el resultado de la multiplicación de 13x238.

Los datos de entrada tienen que tener el siguiente formato:
13 238 u
O
13 238 b


Los dos primeros datos o sea 13 238 son los números a multiplicar y el tercer dato nos indica el orden en el que se mostraran los resultados.
Por ejemplo:


13 238 u = 13 x 238 = 238 + 952 + 1904
Y
13 238 b = 13 x 238 = 1904 + 952 + 238

Si se fijan el orden en el Segundo miembro del resultado varia dependiendo del tercer dato; si el tercer dato es u entonces el resultado se mostrara en el orden de menor a mayor y si el dato es b el orden será de mayor a menor. Y bueno a continuación les dejo el código fuente para que lo ejecuten y chequen el resultado.

package _2008;

import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.IOException;
import java.util.StringTokenizer;
import java.util.Vector;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author Hilario
 * Nombre del Programa: Multiplicacion Egipcia; ACM 2008;
 * Autor: Hilario de la Cruz Hernandez
 * Institucion: Instituto Tecnologico Superior de Tantoyuca
 * Ciudad: Tantoyuca, Veracruz, Mexico
 * Email: hil_ch@hotmail.com
 *
 *Nota: este archivo puede ser modificado o redistribuido, siempre y cuando
 *se informe de dichas acciones
 *
 * Este es un programa que resulve la multiplicacion egipcia
 * el cual se optiene de la sumatoria de varios numeros.
 * por ejemplo:
 * 13 x 238 = 238 + 952 + 1904
 * 13x 238=3094
 * 238 + 952 + 1904=3094
 *
 * el formato de entrada es el siguiente:
 * 13 238 u
 * los dos primeros numeros son los numeros a multiplicar y el ultimo define
 * el orden del resultado:
 * u=menor a mayor
 * b=mayor a menor
 * ejemplo:
 * 13 238 u = 13 x 238 = 238 + 952 + 1904
 * 13 238 b = 13 x 238 = 1904 + 952 + 238
 */
public class _4284_Egyptian_Multiplication {
public _4284_Egyptian_Multiplication(){//constructor
}
public void leerLineas(){//este metodo lee las lineas del txt
    String linea="";//la variable linea guarda cada linea del txt
    int caso=1;//indica el numero de caso
        try {
            BufferedReader br = new BufferedReader(new FileReader("MultE.txt"));//se obtiene el arcrivo txt "MultE.txt"
            while(br.ready()){//mientras existan lineas en el txt se seguira ejecutando
                linea=br.readLine();//se lee una lunea del txt
                //el "-1" indica el final de los casos asi que si se llega
                //a esta cadena entonces se termina la ejecusion del programa
                if(!linea.equals("-1")){//si la linea es diferente a "-1" entonces
                    extraerValores(linea,caso);//se extraen los valores de la linea
                    caso++;//incerementa caso
                }
                 else{//si no entonces
                 System.exit(0);//se termina la ejecusion del programa
                 }
            }
        } catch (FileNotFoundException ex) {}
        catch(IOException ex){}
}
public void extraerValores(String linea,int caso){//este metodo extre los valores de cada linea del txt
    int cont=0;//identifica el tipo de dato
    int N=0,M=0;//N=primer operando, M=segundo operando
    char sentido=' ';//indica el sentido o el orden de la impresion de los resultados
    StringTokenizer st=new StringTokenizer(linea," ");//se establece un token para espacios en blanco
    while(st.hasMoreTokens()){//mientras existan mas tokens
        switch(cont){//se determina el tipo de dato a capturar
            case 0:N=Integer.parseInt(st.nextToken());//el caso 0 es para N el primer operando
            case 1:M=Integer.parseInt(st.nextToken());//el caso 1 es para M el segundo operando
            case 2:sentido=st.nextToken().charAt(0);//el caso 2 es para U el dato que indica el orden de impresion
        }
    }
    System.out.println("--------------------\n"+N+" "+M+" "+sentido);//se imprime el caso
    System.out.println("Case "+caso+":"+multiplicar(N,M,sentido));//se imprime el resultado
}
public String multiplicar(int N,int M,char sentido){//este metodo se encarga de realizar la multiplicacion egipcia
    String resultado="";//resultado que se devolvera
//    Vector vecPotencias=new Vector();
    Vector vecMultiplicacion=new Vector();//en este vector se guardaran temporalmente los resultados
    int indice=0;//indice del vector
    resultado+=N+"x"+M+"=";//se adiere NxM a resultado
    int potenciaMax=0;//se inicializa la potencia a 0
    if(N==0||M==0){//si n=0 o M=0 entonces
        resultado+="0";//se adiere 0 a resultado
    }
 else{//sino
    while(N>=1){//mientras que N sea >= a 1 entonces
        potenciaMax=obtenerPotenciaMax(N);//se obtiene la potencia maxima menor a N
//        System.out.println(potenciaMax);
//        vecPotencias.add(indice,Integer.toString(potenciaMax));
        //se adiere al vector la expresion potenciaMax*M
        vecMultiplicacion.add(indice,Integer.toString(potenciaMax*M));
        N-=potenciaMax;//se decrementa potencia en N
        indice++;//se incrementa indice
    }
    //a continuecion se definen el sentido de los resultados
    if(sentido=='u'){//si sentido es igual a 'u' entonces
        //se ordenan los resultados de menor a mayor
       for(int i=vecMultiplicacion.size()-1;i>=0;i--){
          if(i==0){
          resultado+=vecMultiplicacion.elementAt(i);
          }
         else{
          resultado+=vecMultiplicacion.elementAt(i)+"+";
         }
      }
    }
     else if(sentido=='b'){//si no, si sentido e igual a 'b'
         //se ordena el resultado de mayor a menos
      for(int i=0;i<vecMultiplicacion.size();i++){
          if(i==vecMultiplicacion.size()-1){
          resultado+=vecMultiplicacion.elementAt(i);
          }
         else{
          resultado+=vecMultiplicacion.elementAt(i)+"+";
         }
      }
     }
  }
    return resultado;
}
//este metodo obtiene la potencia maxima anterior a N
public int obtenerPotenciaMax(int N){
    int potencia=0;//potencia de retorno
    int it=0;//iteracion
    boolean menor=true;//centinela
    while(menor==true){//mientras menor=true
        potencia=(int)Math.pow(2, it);//se genera una potencia de 2 a la it
        if((int)Math.pow(2, it+1)>N){//si la siguiente potencia es mayor a N entonces
            menor=false;//menor=false para terminar el while
        }
//        System.out.println(potencia);
        it++;//se incrementa it
    }
    return potencia;//se regresa la potencia
}
public static void main(String[]args){
    _4284_Egyptian_Multiplication em=new _4284_Egyptian_Multiplication();
    em.leerLineas();
}
}


Bueno para poder ejecutar este programa necesitaran crear un txt en el directorio raíz de su proyecto y le darán el nombre de “MultE.txt” y copian el siguiente ejemplo en el txt:


13 238 u
13 238 b
1000 1 u
1 1000 b
1 1 u
0 10 u
54 300 u
54 300 b
-1





Cuando ejecuten el programa les tiene que arrojar los siguientes resultados:




Bueno espero que este programa les sirva de algo ok, la verdad tengo varios de estos programas de ACM resueltos pero los iré publicando poco a poco ok saludossss.