Mostrando entradas con la etiqueta Informática. Mostrar todas las entradas
Mostrando entradas con la etiqueta Informática. Mostrar todas las entradas

miércoles, 12 de agosto de 2015

Carta a los estudiantes de informática y computación.

Se habrán dado cuenta de que su ciencia tiene un impacto directo en todas las sociedades del mundo  y que no es fácil el generar soluciones,como también de que en la escuela no encuentran la solución a dudas muy puntuales sobre el día a día de su carrera, cosa contraria de lo que sucede en otras carreras.

 Les tengo que decir algo, la escuela solo es un encaminador de algo mucho mas grande, pero es solo una pequeña probadita de su carrera , que en ocasiones puede que esa probadita este ya algo obsoleta, lo cual ocasiona la frustración y decepción de algunos. Algo que deben comprender es que ustedes están en una carrera que avanza mas rápido que todas las demás, están en el auge de algo tremendo que esta cambiando la manera con la que viven las personas en todo el mundo y prácticamente cada semana hay algo nuevo que ha desplazado a otra tecnología que no lleva mas de un año de existir, es una ciencia diferente y que para poder adentrarse hay que comprender su naturaleza e historia.

¡Ustedes le están dando la forma a esta ciencia!

Que sean ustedes los seres que están dándole forma a esta ciencia los convierte en automático en participes principales de esta historia de la informática,  y aquí es donde se pone a prueba la frase que alguna vez dijo Sir Isaac Newton, nuestro trabajo sera:
"A hombros de gigantes" 
 Ya que su esfuerzo y cada cosa que hagan tendrán forzosamente que mirar hacia atrás ver trabajos como el de Linus Torlvals, Bill Gates, Larry Page, Serguéi Brin , Steve Jobs, Richard Stallman, Jon "maddog" Hall, Dennis Ritchie, entre muchos otros. Deben de mirar el trabajo de las personas que trabajaron en el desarrollo de la informática  para saber hacia donde debe de ir encaminado su trabajo y que es lo que sigue. Se tiene que comprender muy bien que es lo que se vive en la actualidad y ver que es lo que llevo a esto, en alemán la expresión se llama "Zeitgeist".

He pensado que al seguir las reglas que vienen en la imagen es tan solo los requerimientos básicos para desarrollar cualquier actividad en nuestra vida,  y que la informática no es la excepción.
Jamas deben de estar alejados de estas reglas, considero que fundamental es la humildad.

En las escuelas de ciencias e ingenierías se da algo muy común debido a la alta exigencia que en estas se practica, se cae en una falta de humildad tremenda en los estudiantes. Esto conlleva a que se caerá tarde o temprano en una que otra zona de confort, y por lo tanto la joven promesa para el futuro de la sociedad queda totalmente cerrada a nuevas ideas y practicas por creer que se sabe todo. Los invito a jamas caer en esto, siempre sean humildes, y mas con su conocimiento, nunca le cierren la puerta a nuevo conocimiento, ya que ustedes vivirán en constante cambio e innovación, cerrar la puerta al cambio debe de ser una aberración natural.

Nunca dejen de prepararse, aun cuando consigan un buen trabajo o estén en un proyecto que sea la meta al trabajo de muchos años, no significa que deben dejar el estudio de lado, todo lo contrario es lo que los debe motivar a prepararse más, que es lo que hace la diferencia entre lo mediocre y lo profesional.

!Están afectando al mundo entero!
Recuerden que su trabajo puede tener un impacto global, lo cual significa que su preparación tiene que ser integra. Aprender idiomas, entablar relaciones, poder sostener una conversación productiva y una amplia cultura general son  cosas que deben de tener muy presentes. 

Tengan amigos, salgan, diviértanse, y nunca descuiden el aspecto humano, que todos lo somos. Todos los grandes en esta ciencia estuvieron rodeados de verdaderos amigos que los ayudaron siempre.

Steve Jobs y Wozniak :http://www.apple5x1.es/wp-content/uploads/2014/12/steve-jobs-and-wozniak-1977_1024x796_91966.jpg

Los amigos se cuentan con la mano, y es difícil encontrarlos, pero cuando uno hace lo que le gusta, la vida siempre nos ayuda a encontrarlos.

¡Latinoamerica cuenta contigo!
Joven latinoamericano, te pido un favor, no temas ser líder, latinoamerica necesita más lideres que guíen, inspiren y enseñen. Nuestra sociedad, esta habida de gente a quien seguir, que guíen por el buen camino a este pueblo, que ayuden a abrir los ojos con el ejemplo. Te pido por favor que tu lo seas. Ser líder demanda mucha energia, mucha empatia, don de gente, entre muchas otras cosas, pero la recompensa trascenderá entre muchas generaciones y es la necesidad de tu tiempo y de tu pueblo.

El conocimiento demanda una responsabilidad social.
Cada que obtenemos algún tipo de conocimiento considero que adquirimos de inmediato la responsabilidad social de ayudar a nuestro pueblo con el saber que acabamos de adquirir ya sea enseñando o haciendo. Amigo, amiga, tu tienes esta responsabilidad al estar dentro de esta ciencia de la informática y más aun si estas en una universidad publica, es necesario que sepas que el trabajo que realizas en la universidad publica no te representa a ti, ni a tu facultad, mucho menos a tu universidad, representa a todas aquellas personas que han pagado sus impuestos para que tu estés ahí,  sin lugar a dudas esto motiva y empuja, y te debe de dar una idea de la calidad que se espera que tengas en tus trabajos, que claro estará bien que te equivoques es normal ya que es el tiempo de que lo hagas, lo que si sera imperdonable es que no des lo mejor de ti, que no seas profesional.


viernes, 17 de julio de 2015

JSON en Android con PHP y MySQL

Para iniciarse con esto, una buena recomendación que les puedo dar es esta librería y empecemos.
Primero descargamos la librería , es un .jar:
Ahora en el paquete llamado app de nuestro árbol de archivos del proyecto:

Hacemos click derecho  y de ahí:
new->Module
y nos debe de lanzar a la siguiente ventana:
Y elegimos importar  .jar
Ahora nos lanzara a una ventana donde elegiremos la ruta de nuestro archivo .jar que descargamos de la pagina.
Ahora nos vamos a build.gradle (Module:app) y agregamos lo siguiente en dependencies:
compile 'com.loopj.android:android-async-http:1.4.7'
Y ahora veamos la pagina con la que vamos a interactuar en el servidor:
La tabla de la base de datos que consultaremos es:
Todo la comunicación la usaremos desde un método que llamaremos  ObtDatos(), lo que se va hacer es obtener los datos de apellido, edad  y puntos y los mostraremos en un listView,

public void ObtDatos()
    {
        AsyncHttpClient client=new AsyncHttpClient();
        String url="http://192.168.61.13/loggeo.php";
        RequestParams parametros= new RequestParams();
        EditText nombre=(EditText)findViewById(R.id.NombreLgoTxt);
        parametros.put("Nombre",nombre.getText().toString());

        client.post(url, parametros, new AsyncHttpResponseHandler() {
            @Override
            public void onSuccess(int statusCode, Header[] headers, byte[] responseBody) {
                if (statusCode == 200) {
                    //Llamar a la funcion
                    CargarLista(obtDatosJSON(new String(responseBody)));
                    Log.i("Respuesta:", new String(responseBody));
                    Log.i("Datos:", "No Fallo");
                }
            }

            @Override
            public void onFailure(int statusCode, Header[] headers, byte[] responseBody, Throwable error) {
                Log.i("Datos:", "Maldad: Fallo");
            }
        });
    }


CargarLista(obtDatosJSON(new String(responseBody))); nos va a llevar a cargar los datos obtenidos de la consulta del servidor en un listView:

public void CargarLista(ArrayList datos)
    {
        ListView listView=(ListView)findViewById(R.id.listViewLoggeo);
        ArrayAdapter adapter=new ArrayAdapter(this,android.R.layout.simple_list_item_1,datos);
        listView.setAdapter(adapter);

    }

    public ArrayList obtDatosJSON(String resupesta)
    {
        ArrayList listado=new ArrayList<>();
        try
        {
            JSONObject jsonObject= new JSONObject(resupesta);
            String texto="Nombre="+jsonObject.getString("Nombre");
            listado.add(texto);

            texto="Apellido="+jsonObject.getString("Apellido");
            listado.add(texto);

            texto="Edad="+jsonObject.getString("Edad");
            listado.add(texto);

            texto="Puntos="+jsonObject.getString("Puntos");
            listado.add(texto);

        }catch (Exception error)
        {

        }
        return listado;
    }

Hacemos una interfaz parecida a esta:
Liga xml
Al correr la aplicación tendremos:

Espero les haya servido este  tutorial, por su atención gracias!

Fuentes:
https://www.youtube.com/watch?v=oLm_5GKHJCI  consultada el 16 de julio del 2015.

jueves, 16 de julio de 2015

SQLite en Android

SQLite es lo ideal cuando queremos trabajar con bases de datos en dispositivos móviles. Su uso es bastante sencillo, así que a continuación mostraremos una manera sencilla de manejo de base de datos en Android.
La base de datos que crearemos no tendra mucha dificultad, solo contendrá una sola tabla llamada Alumno, pongo la sintaxis en SQL:
 CREATE TABLE Alumno (Codigo INTEGER PRIMARY KEY,
                         Nombre TEXT NOT NULL,
                         Telefono TEXT NOT NULL,
                         Carrera TEXT NOT NULL);

 Primero crearemos una clase llamada AlmacenBase.java
AlmacenBase.java


package com.example.ultron.practicabasedatos;

import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;
import android.database.sqlite.SQLiteOpenHelper;

import java.util.Vector;

/**
 * Created by ultron on 13/07/15.
 */
public class AlmacenBase extends SQLiteOpenHelper {
    public AlmacenBase(Context context) {
        super(context,"AlumnosPro",null,1);
        /*
        Se manda al constructor de la clase padre para genera un entorno lógico de tu base de datos.
        Parametros:
        Contexto: Contexto de la aplicación
        Nombre de la base de datos
        Si se tiene un cursor que se puede utilizar como guia o referencia el objeto es cursorFactory, si no lo hay, null
        Número de versión
         */
    }

    @Override
    public void onCreate(SQLiteDatabase db) {
        db.execSQL("CREATE TABLE Alumno (Codigo INTEGER PRIMARY KEY,Nombre TEXT NOT NULL, Telefono TEXT NOT NULL, Carrera TEXT);");
        /*
        Se sobreescribe el metodo onCreate de la clase padre esto con la
        intención de tener una estructura lógica de la base, en memoria ya se creo,
        pero aun no esta almacenada en el teléfono.
         */
    }

    @Override
    public void onUpgrade(SQLiteDatabase db, int oldVersion, int newVersion) {
//Control de versiones de la base de datos
    }


}

Ahora crearemos la clase DataBaseManager.java que servirá como ayudante en el manejo de la base de datos.
DataBaseManager.java


package com.example.ultron.practicabasedatos;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

import java.io.File;

/**
 * Created by ultron on 13/07/15.
 */
public class DataBaseManager {

  //****Clase para administrar la base de datos con la que trabajaremos****//
    /*
    Tablas de la base de datos:
    CREATE TABLE Alumno (Codigo INTEGER PRIMARY KEY,
                         Nombre TEXT NOT NULL,
                         Telefono TEXT NOT NULL,
                         Carrera TEXT NOT NULL);
     */
    String nombre="Nombre",telefono="Telefono",carrera="Carrera",codigo="Codigo";//Variables que serviran como referencias a los atributos de la tabla Alumnos
    AlmacenBase helper; //Clase que realiza la conexion
    SQLiteDatabase db; //Objeto que nos sirve como enlace lógico con la base de datos
    public DataBaseManager(Context context)
    {
        helper=new AlmacenBase(context); //Se crea el objeto de conexion
        db=helper.getWritableDatabase();//Si no existe la base se crea y si existe se habre en modo escritura
    }

    public ContentValues generaContenedorAlumno(int codigoP,String nombreP,String telefonoP,String carreraP)
    {
        /*
        Contenedor que genera un diccionario para los atributos a ingresar a la base de datos
        Un diccionario solo son tublas de elementos con algun significado, en este caso lo estructuramos
        con los parametros que recibimos.
         */
        ContentValues valores=new ContentValues();
        valores.put(codigo,Integer.toString(codigoP));
        valores.put(nombre,nombreP);
        valores.put(telefono,telefonoP);
        valores.put(carrera,carreraP);
        return valores;
    }

    public void insertar(int codigoP,String nombreP,String telefonoP,String carreraP)
    {
        /*
        La inserción de registros a la tabla se realiza con un metodo ya establecido de la clase SQLiteDatabase
        llamado insert, es conveniente y recomendable hacerlo por su facilidad de uso sus parametros:
        Tabla:El nombre de la tabla en la que se realizara la inserción.
        nullColumnHack: El nombre de la o las columnas donde se recibiran valores null, si no los hay, mandar null.
        valores: Los valores, mapeados en un ContentValue para su simplicidad

        El método retornara el ID de la ultima fila insertada se se realizo con exito, de lo contrario
        retornara -1
         */
        //TABLADestino null ContentValues
        db.insert("Alumno", null, generaContenedorAlumno(codigoP, nombreP, telefonoP, carreraP));
    }

    public  void eliminar(int codigoP)
    {
        /*
        Metodo establecido de SQLiteDatabase para eliminar registros:
        Parametros:
        Tabla: La tabla afectada
        Clausula Where: Campo =?   ---->WHERE Campo=
        Argumentos del Where: Como pueden ser varios se utiliza un arreglo de Strings

         */
        //TABLADESTINO  
        db.delete("Alumno", codigo + "=?", new String[]{Integer.toString(codigoP)});
    }

    public void actualiza(int codigoP,String nombreP,String telefonoP,String carreraP)
    {
        /*
        Método para actualizar las filas,
        recibe como parametros:
        Tabla: Tabla afectada.
        Valores: ContentValue con la lista de los valores de la tabla, junto los no actualizados, como si se realisase una insercion.
        Clausula Where: Campo =?   ---->WHERE Campo=
        Argumentos del Where:Como pueden ser varios se utiliza un arreglo de Strings

        Retornara el numero de filas afectadas.
         */
        //TABLADESTINO   
        db.update("Alumno", generaContenedorAlumno(codigoP, nombreP, telefonoP, carreraP), codigo + "=?", new String[]{Integer.toString(codigoP)});
    }
    public Cursor buscar(int codigoP)
    {
        /*
        Este método retornara un Cursor con el resultado de la consulta, los parametros son:
         Tabla: Nombre de la tabla afectada.
         Columns: La lista de las columnas requeridas en un arreglo de Strings
         Selección o condición: Columna =?  -----> WHERE Columna=
         Argumentos de la condición: Arreglo de Strings de los campos a usar como referencia
         groupBy
         having
         orderBy
         limit
         */

        /*****Un Cursor es un contenedor de resultados random para resultados de Querys en SQL*****/
        //TABLABUSQUEDA DATOS_REQUERIDOS  
        String[] columnas=new String[]{codigo,nombre,telefono,carrera};
        return db.query("Alumno",columnas,codigo + "=?",new String[]{Integer.toString(codigoP)},null,null,null,null);
    }

    public void EliminarBase()
    {
        /*
        Para eliminar la base de datos se tiene que hacer un enlace lógico con el directorio de la base
        para eso se pide el directorio con getPath.
        directorio es el enlace lógico.
        deleteDatabase eliminara la base si directorio es diferente de null.
        Retornara true si se concreto la operación, false en caso contrario.
         */
        final String path=db.getPath();
        File directorio=new File(path);
        db.deleteDatabase(directorio);
    }
}


Terminada la creación de estas bases de datos que son esenciales para el funcionamiento de nuestra app, lo siguiente es crear la primera actividad llamada "Agregar.java". Esta actividad servira para agregar registros a nuestra base.
Agregar.java


package com.example.ultron.practicabasedatos;

import android.media.MediaDescription;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;


public class Agregar extends ActionBarActivity {

    AlmacenBase Base;
    EditText nombreTxt,telefonoTxt,CarreraTxt,CodigoTxt;
    Button agregarBtn;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_agregar);

        //Referencias al layout
       nombreTxt=(EditText)findViewById(R.id.NombreTxt);
        telefonoTxt=(EditText)findViewById(R.id.TelefonoTxt);
        CarreraTxt=(EditText)findViewById(R.id.CarreraTxt);
        CodigoTxt=(EditText)findViewById(R.id.CodigoTxt);

       agregarBtn=(Button)findViewById(R.id.AgregarAlumnoBtn);

         agregarBtn.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataBaseManager dbm=new DataBaseManager(getApplicationContext());//Manager de la base de datos
                String nombre=nombreTxt.getText().toString();
                String telefono=telefonoTxt.getText().toString();
                String codigo=CodigoTxt.getText().toString();
                String carrera=CarreraTxt.getText().toString();

                int CodigoEnt=Integer.parseInt(codigo);


                dbm.insertar(CodigoEnt,nombre,telefono,carrera);//Insercion en la base de datos
                nombreTxt.setText("");
                telefonoTxt.setText("");
                CodigoTxt.setText("");
                CarreraTxt.setText("");
                //Limpiamos formulario
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_agregar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}


Ahora nos dirigimos al  layout, al activity_agregar.xml por cuestiones de espacio no subiré los xml de la aplicación puedes descargarlos de este link para que te des una idea de como sera diseñada la aplicación.

Ahora crearemos la activity Buscar.java
Buscar.java
package com.example.ultron.practicabasedatos;

import android.database.Cursor;
import android.provider.ContactsContract;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;
import android.widget.TextView;

import org.w3c.dom.Text;

import java.util.StringTokenizer;


public class Buscar extends ActionBarActivity {
    AlmacenBase Base;
    Button buscar;
    int Codigo;
    EditText CajaCodigo;
    TextView nombreTV,telefonoTV,carreraTV;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_buscar);

        //Referencias al layout
        buscar=(Button)findViewById(R.id.BuscarBtn);
        CajaCodigo=(EditText)findViewById(R.id.CodigoTxt);
        telefonoTV=(TextView)findViewById(R.id.MuestraTelefonolbl);
        nombreTV=(TextView)findViewById(R.id.MuestraNombreLbl);
        carreraTV=(TextView)findViewById(R.id.MuestraCarreraLbl);
        buscar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
            DataBaseManager dbm=new DataBaseManager(getApplicationContext());//Manager para la base de datos
            Codigo=Integer.parseInt(CajaCodigo.getText().toString());//Se obtiene el codigo
                Cursor res=dbm.buscar(Codigo);//Buscamos resultados
                if(res!=null)
                {
                    //Mostramos resultados de la query
                    res.moveToNext();
                    nombreTV.setText("");
                    nombreTV.setText(res.getString(1).toString());

                    telefonoTV.setText("");
                    telefonoTV.setText(res.getString(2).toString());

                    carreraTV.setText("");
                    carreraTV.setText(res.getString(3).toString());
                }

            }
        });
    }



    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_buscar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

En seguida creamos la activity Modificar.java
Modificar.java

package com.example.ultron.practicabasedatos;

import android.database.Cursor;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;


public class Modificar extends ActionBarActivity {

    Button buscar,actualizar;
    int Codigo;
    EditText nombreTxt,telefonoTxt,carreraTxt,codigoTxt;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_modificar);

        nombreTxt=(EditText)findViewById(R.id.NombreModTxt);
        telefonoTxt=(EditText)findViewById(R.id.TelefonoModTxt);
        carreraTxt=(EditText)findViewById(R.id.CarreraModTxt);
        buscar=(Button)findViewById(R.id.BuscarBtn);
        actualizar=(Button)findViewById(R.id.ActualizarBtn);
        codigoTxt=(EditText)findViewById(R.id.CodigoModTxt);
        buscar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataBaseManager dbm=new DataBaseManager(getApplicationContext());
                Codigo=Integer.parseInt(codigoTxt.getText().toString());
                Cursor res=dbm.buscar(Codigo);
                if(res!=null)
                {
                    res.moveToNext();
                    nombreTxt.setText("");
                    nombreTxt.setText(res.getString(1).toString());

                    telefonoTxt.setText("");
                    telefonoTxt.setText(res.getString(2).toString());

                    carreraTxt.setText("");
                    carreraTxt.setText(res.getString(3).toString());
                }

            }
        });

        actualizar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataBaseManager dbm=new DataBaseManager(getApplicationContext());
                int codigo=Integer.parseInt(codigoTxt.getText().toString());
                String nombre=nombreTxt.getText().toString();
                String telefono=telefonoTxt.getText().toString();
                String carrera=carreraTxt.getText().toString();
                dbm.actualiza(codigo,nombre,telefono,carrera);

                nombreTxt.setText("");
                telefonoTxt.setText("");
                carreraTxt.setText("");
            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_modificar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Ya casi para terminar el Eliminar.java
Eliminar.java


package com.example.ultron.practicabasedatos;

import android.database.Cursor;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;
import android.widget.EditText;


public class Eliminar extends ActionBarActivity {

    EditText nombreTxt,telefonoTxt,carreraTxt,codigoTxt;
    Button buscar,eliminar;
    int Codigo=0;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_eliminar);

        /*
        Referenciamos los elementos del Layout con la clase de java
         */
        nombreTxt=(EditText)findViewById(R.id.NombreElTxt);
        telefonoTxt=(EditText)findViewById(R.id.TelefonoElTxt);
        carreraTxt=(EditText)findViewById(R.id.CarreraElTxt);
        buscar=(Button)findViewById(R.id.BuscarElBtn);
        eliminar=(Button)findViewById(R.id.EliminarElBtn);
        codigoTxt=(EditText)findViewById(R.id.CodigoElTxt);
        /*
        Primero hay que buscar el elemento que se desea eliminar.
         */
        buscar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataBaseManager dbm = new DataBaseManager(getApplicationContext());//Se invoca a la clase que nos guia a travez de la base de datos
                Codigo = Integer.parseInt(codigoTxt.getText().toString());//Obtenemos el codigo
                Cursor res = dbm.buscar(Codigo);//Buscamos el elemento segun el codigo ingresado
                if (res != null) {
                    //Mostramos resultados
                    res.moveToNext();
                    nombreTxt.setText("");
                    nombreTxt.setText(res.getString(1).toString());

                    telefonoTxt.setText("");
                    telefonoTxt.setText(res.getString(2).toString());

                    carreraTxt.setText("");
                    carreraTxt.setText(res.getString(3).toString());
                }

            }
        });

        eliminar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                DataBaseManager dbm = new DataBaseManager(getApplicationContext());//Se declara el manager de la base de datos
                dbm.eliminar(Codigo);//Eliminamos usando el codigo como parametro
            }
        });
    }


    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_eliminar, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}

Por ultimo nos vamos a nuestro MainActivity.java
MainActivity.java


package com.example.ultron.practicabasedatos;

import android.content.Intent;
import android.database.sqlite.SQLiteDatabase;
import android.support.v7.app.ActionBarActivity;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.view.View;
import android.widget.Button;


public class MainActivity extends ActionBarActivity {
    Button agregar,buscar,modificar,eliminar;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        DataBaseManager dbm=new DataBaseManager(this);
        agregar=(Button)findViewById(R.id.AgregarBtn);
        buscar=(Button)findViewById(R.id.BuscarBtn);
        modificar=(Button)findViewById(R.id.ModificarBtn);
        eliminar=(Button)findViewById(R.id.EliminarBtn);

        agregar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, Agregar.class);
                startActivity(i);


            }
        });

        buscar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, Buscar.class);
                startActivity(i);


            }
        });

        modificar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, Modificar.class);
                startActivity(i);


            }
        });

        eliminar.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View v) {
                Intent i = new Intent(MainActivity.this, Eliminar.class);
                startActivity(i);


            }
        });

    }

    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.menu_main, menu);
        return true;
    }

    @Override
    public boolean onOptionsItemSelected(MenuItem item) {
        // Handle action bar item clicks here. The action bar will
        // automatically handle clicks on the Home/Up button, so long
        // as you specify a parent activity in AndroidManifest.xml.
        int id = item.getItemId();

        //noinspection SimplifiableIfStatement
        if (id == R.id.action_settings) {
            return true;
        }

        return super.onOptionsItemSelected(item);
    }
}


Ahora en nuestro AndroidManifest.xml agregamos el permiso de escritura y lectura en almacenamiento externo.
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE" />
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE" />
Y nuestra aplicación se tiene que ver así:





Google Maps en Android

Hola, vamos a hacer una aplicación usando el API de google maps.
Primero crearemos el proyecto.
A continuación elegiremos la versión de android con la que trabajaremos.
Ahora elegiremos la Activity de mapas que se nos da por defecto.

Le asignamos el nombre que deseemos.
Y nos posicionamos en google_maps_api.xml, en su proyecto esta en la carpeta de values.

De aquí seleccionamos el link que viene en los comentarios y  accedemos a el en nuestro navegador, es la linea completa solo tache información de las direcciones y claves que se generan por desarrollador.
En la pagina solo crearemos las credenciales, solo es cuestión de aceptar términos y condiciones y dar siguiente, y nos mandara a una pagina que contendrá una tabla como esta:
Esta clave nos sirve para muchas aplicaciones pero se distribuye por desarrollador, no la podemos pasar a otras personas, por si hicieran mal uso de esto. Lo siguiente es copiar la clave que esta en la columna derecha la tabla que les mostré, la "Calve de la API". Solo seleccionamos y copiamos.
Ahora nos vamos a google_maps_api.xml de nuestro proyecto.

Aquí lo que haremos es sustituir la leyenda "YOUR KEY_HERE" por la clave de la API que acabamos de copiar.

Y ahora nos dirigimos a la clase MapsActivity.java y  nos aseguramos que nuestro código se asemeje a este:

package com.example.ultron.practicamapasauge; //Aqui es el nombre del paquete de su proyecto

import android.support.v4.app.FragmentActivity;
import android.os.Bundle;

import com.google.android.gms.maps.CameraUpdateFactory;
import com.google.android.gms.maps.GoogleMap;
import com.google.android.gms.maps.OnMapReadyCallback;
import com.google.android.gms.maps.SupportMapFragment;
import com.google.android.gms.maps.model.LatLng;
import com.google.android.gms.maps.model.MarkerOptions;

public class MapsActivity extends FragmentActivity implements OnMapReadyCallback {

    private GoogleMap mMap;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_maps);
        setUpMapIfNeeded();
        SupportMapFragment mapFragment = (SupportMapFragment) getSupportFragmentManager()
                .findFragmentById(R.id.map);
        mapFragment.getMapAsync((OnMapReadyCallback) this);
    }

    @Override
    protected void onResume() {
        super.onResume();
        setUpMapIfNeeded();
    }

    private void setUpMapIfNeeded() {
       if (mMap == null) {
            mMap = ((SupportMapFragment) getSupportFragmentManager().findFragmentById(R.id.map))
                    .getMap();
            if (mMap != null) {

            }
        }
    }

    @Override
    public void onMapReady(GoogleMap googleMap) {
        LatLng CUCEI = new LatLng(20.656945, -103.324512); //Enviamos coordenadas de nuestro objeto de latitudes
        googleMap.addMarker(new MarkerOptions().position(CUCEI).title("CUCEI"));//Agregamos la marca con su titulo
        googleMap.moveCamera(CameraUpdateFactory.newLatLng(CUCEI));//Movemos la camara a donde correspone la marca que hicimos.
    }
}

Ya teniendo esto, corremos nuestra aplicación y lo que debe de aparecernos en nuestra pantalla es lo siguiente:
Pueden agregar cuantas marcas ustedes deseen en el metodo onMapReady.

Para obtener las latitudes de un sitio, solo se van a Maps y buscan el sitio al que desean hacer referencia en su aplicación.

Damos click derecho sobre la marca.

Y elegimos la opción ¿Que hay aquí?
Y nos devolverá las latitudes del sitio del marcador, las copiamos y las llevamos al objeto LatLng que usaremos para la respectiva marca.
Espero les sea de utilidad este tutorial, gracias por su atención.

Fuentes:
https://developers.google.com/maps/documentation/android/start consultada el 16 de julio del 2015

miércoles, 15 de julio de 2015

Expresiones regulares en Python

Primero principios básicos:
Anclas.
Donde se encuentra lo que queremos encontrar.
  • ^patron, coincidencia con cadenas que comiencen con "patron"
  • patron$, coincidencia con cadenas que terminen con "patron"
  • ^patron$, la cadena exacta es "patron"
Expresión regular.
Una expresión regular, a menudo llamada también regex, es una secuencia de caracteres que forma un patrón de búsqueda, principalmente utilizada para la búsqueda de patrones de cadenas de caracteres u operaciones de sustituciones. 

Clase de caracteres.
El dominio de posibilidades que puede llegar a ser cierto carácter.
  • [abc] el carácter puede ser a ó b ó c
  • [123ac] el carácter puede ser  1 ó 2 ó 3 ó a ó c
  • ciudadan[oa]s puede ser ciudadanos o ciudadanas la cadena que se busca obtener.
  • [a-z] puede ser cualquier carácter de la a a la z.
  • [0-9] puede ser cualquier número del 0-9
  • [b5-] puede ser un guion b o 5, si se quiere usar un guion, este va al principio o al final nunca intermedio para evitar confusiones.
  • [^dbz] puede ser cualquier carácter que no sea ni d ni b ni z.
Cuantificadores.
  • ?: 0 o una vez.
  • +: una o mas veces.
  • *: cero o mas ocurrencias.
  • {x}: número exacto de ocurrencias que indique x siendo x una variable entera.
  • {x,y}: al menos x y no más de y ocurrencias siendo x e y variables enteras.
Código.
En Python el manejo de expresiones regulares es bastante simple, y bastante útil, es una herramienta imprescindible si deseas hacer una aplicación con una alta funcionalidad y código eficiente.
Pondré este ejemplo:
Validar si las cadenas que entren cumplen con las siguientes características:
  • 5 caracteres
  • El primer carácter es el símbolo "#"
  • El resto son números del 0-9
  • Ejemplo #12345

import re #Modulo de Python para expresiones regulares.
import os

patron=re.compile('[#][0-9]{4}') #Declaracion de patron y almacenamiento en la variable patron
prueba='#123a' #Primera prueba
if patron.findall(prueba)==[prueba]:
 print "Es correcto"
else:
 print "Fallo"

prueba='#1234'#Segunda prueba
if patron.findall(prueba)==[prueba]:
 print "Es correcto"
else:
 print "Fallo"

Aquí tendremos como resultado de la ejecución:

Vamos por partes:
El resultado del findall siempre sera una lista con los resultados encontrados, lo que se trata de encontrar es que toda la variable sea un mismo resultado, eso significa que toda la cadena es parte de la expresión que declaramos.
La primera comparación nos dará como resultado Fallo, esto debido a que solo se cumple la expresión regular hasta el "3" y entonces el resultado que retornara el findall seria ['#123'] cuando lo que se pide es que sea igual a la variable que entro para comparar, a la cadena original.
En la segunda comparación dio como resultado "Es correcto" por que el findall dio como resultado ['#1234'] que es igual a la cadena que mandamos a comparar y por lo tanto es True o "Es correcto".

Este es un tema complejo, te recomiendo practica y que no dudes en escribirme tus dudas, recuerda que pueden ser dudas que muchas otras personas tengan.
De igual manera si deseas más tutoriales de este tema solo pídelos en comentarios. Gracias.


Fuentes y lecturas recomendadas:
https://es.wikipedia.org/wiki/Expresi%C3%B3n_regular consultada el 15 de julio del 2015.
http://www.maestrosdelweb.com/guia-python-expresiones-regulares/ consultada el 15 de julio del 2015.
https://docs.python.org/2/library/re.html?highlight=re#module-re consultada el 15 de julio del 2015.

Muy en especial checate esta pagina, te puedes encontrar muchas herramientas para tus programas.

Funciones, ciclos y condiciones en Python


Para explicar este tema necesitaremos algo muy especial mi muy apreciable lector, necesitare que se sienta un completo novato en el mundo de la programación, si en verdad lo es, mucho mejor. (Considero que por nuestro propio bien, todos los que nos dedicamos a esto debemos siempre considerarnos novatos, te recomiendo ver el tutorial de introducción a python).
Antes que nada, para declarar una variable, solo mencionamos el identificador con el que sera utilizada, y le asignamos un valor, el tipo del valor que le asignemos sera el tipo de valor de la variable.
Una variable puede cambiar de tipo durante la ejecución, según se necesite, esta propiedad se llama tipado dinámico.
Una condición, un if en Python tiene la siguiente sintaxis:

if <Condicion>:
        <Sentencias>

Es importante seguir con esta sintaxis, no hay paréntesis en la condición, solo se escribe, y el doble punto  indica el inicio al modulo que procede al indicarse la sentencia. Este modulo tiene algo muy especial, cada sentencia que se encuentre dentro del mismo va distinguido por algo muy particular, en la sintaxis del cuerpo de este modulo. Tiene una tabulacion superior a la que tiene el if de la condición, como en el ejemplo de sintaxis anterior. Esto es lo mismo para todos los ciclos o módulos que se generen en tu programa, lo que va dentro del mismo tiene que tener una tabulacion mayor a la que tiene  la condición principal de dicho modulo.

Una función es un proceso que siempre nos retornara un resultado dentro de un dominio establecido.
En python la palabra reservada para esto es def. Y la estructura para este caso es:

def <Nombre de tu función> ( Parámetro 1, Parámetro 2, Parámetro n):
       <Sentencias>
En cuanto a los ciclos no es muy diferente  a las condiciones, en este tutorial analizaremos el while, su estructura es:
while <Condicion>:
        <Sentencias>

Para que esto quede más claro presento este ejemplo que es la famosa serie de fibonacci en python.
def fibonacci(n):
    if n == 0:
        return 0
    elif n == 1:
        return 1
    else:
        return fibonacci(n-1) + fibonacci(n-2)
i=0
while(i < 10):
    print fibonacci(i)
    i+=1

Este programa solo muestra los primeros 10 elementos dentro de la serie de fibonacci.
Analicemos la función fibonacci.
La funcion recibe como parámetro un numero, este si es 0, retornara 0, si es 1 retornara 1, y si es diferente a estos dos números retornara la suma de la resta del parámetro menos uno mas la resta del parámetro menos dos.

Se inicializa un variable, que sera nuestra variable de contro en este caso i, esta variable se incrementara de uno en uno en cada vuelta del ciclo del while.
Cada que se ejecute el ciclo while, se validara que el control sea menor a 10, y se imprimirá el valor del control en la serie de fibonacci, dicho con otras apalabras, imprimirá el valor de fibonacci que indique el indice que es nuestro control. Terminado el ciclo, termina la ejecución de nuestro programa.

Ahora la parte que genera más emoción en la jornada de un programador, ejecutemos nuestro programa (Para ver como ejecutar un programa en python, checa este tutorial).

Este es un tema extenso, seguire publicando del mismo, esten en contacto, y estas son las bases para todo aquel que quiera programar algo desente en este y cualquier lenguaje, si tienes alguna duda no dudes en ponerla en comentarios, te la contestare en la primera oportunidad.
Te recomiendo ver la introducción a python. Checa el Zen de Python!!!!

martes, 14 de julio de 2015

Cargar imágenes en HTML

Hoy les traigo un pequeño tutorial donde explico de manera breve como cargar imágenes en HTML.

Pero antes de comenzar me gustaría compartirles el tutorial anterior acerca de estilos de letra en HTML.

Para cargar una imagen dentro de una pagina web, utilizamos la etiqueta <IMG> con el parámetro SRC, esta etiqueta no necesita una etiqueta de cierre, y solo debemos indicar la ubicación de nuestra imagen, ya sea en nuestro equipo, o directamente desde internet. como asignar una ruta para una imagen lo explico en este tutorial: color e imagen de fondo en HTML, solo que no con la misma finalidad, pero la idea es la misma.

En las paginas web los formatos de imágenes mas utilizados son: png, jpg y gif.

Ya que indicamos la ruta para acceder a nuestra imagen, solo indicamos el nombre y formato de nuestro archivo:

    <IMG SRC="NombreDeNuestraImagen.Formato">

A continuación les comparto un código de ejemplo:
<html>

    <head>
        <title>
            Imagenes en HTML.
        </title>
    </head>

    <body>
        <IMG SRC="Color e imagen de fondo en HTML3.png">
    </body>
</html>
Y el resultado que obtendríamos seria el siguiente:


Las imágenes que carguemos se pueden re-dimensionar, para esto existen las propiedades width y heigth. que indican el ancho y alto que tendrá nuestra imagen en pixeles. A continuación les muestro un ejemplo con estas propiedades.
<html>

    <head>
        <title>
            Imagenes en HTML.
        </title>
    </head>

    <body>
        <IMG SRC="Color e imagen de fondo en HTML3.png" width=100, heigth=100>
    </body>
</html>
Y el resultado que obtendríamos seria el siguiente:


 Se puede indica que el texto que esta alrededor de nuestra imagen se alinee en una cierta posición con respecto a nuestra imagen o indicar en que parte de la pantalla se alineara nuestra imagen, esto se puede lograr gracias a la propiedad align, donde se tienen los valores: top, middle, button, right o left.

-top: el texto se alinea en la parte superior de la imagen
-middle: el texto se alinea al centro de la imagen
-button: el texto se alinea en la parte inferior de la imagen
-right: la imagen se alinea a la derecha de la pagina web
left: la imagen se alinea a la izquierda de la pagina web

A continuación les comparto un pequeño ejemplo con esta propiedad:
<html>

    <head>
        <title>
            Imagenes en HTML.
        </title>
    </head>

    <body>
        <pre>
Texto alineado en la parte superior de la imagen<img src="Color e imagen de fondo en HTML3.png" width=100, heigth=100 align=top>
Texto alineado al centro de la imagen<img src="Color e imagen de fondo en HTML3.png" width=100, heigth=100 align=middle>
Texto alineado en la parte inferior de la imagen<img src="Color e imagen de fondo en HTML3.png" width=100, heigth=100 align=button>
Imagen alineada a la derecha de la pagina web<img src="Color e imagen de fondo en HTML3.png" width=100, heigth=100 align=right>





Imagen alineada a la izquierda de la pagina web<img src="Color e imagen de fondo en HTML3.png" width=100, heigth=100 align=left>
        </pre>
    </body>
</html>
Y el resultado obtenido con el código anterior, seria el siguiente:


Y por ultimo, como un dato extra, la imagen que estoy utilizando para los ejemplos, es la siguiente: "Bosque de sueños" de Mario Rafael Lince Benavides.

Espero y este tutorial les sea de utilidad, cualquier duda no duden en comentarla por favor. Muchas gracias por visitar este tutorial.

Fuente:
http://platea.pntic.mec.es/~abercian/guiahtml/imagenes.htm consultada el 14 de Julio del 2015.

Indroducción a Python.

Python es un lenguaje simplemente hermoso, y no lo digo solo por que su sintaxis es limpia y trata de hacer que el código sea legible y simple de comprender gracias a su estructura.
Es muliproposito, bueno la definición formal de mutiproposito ya se la imaginaran, por eso mismo la resumiré en que sirve para todo un poco, y si le hacen falta atributos para cierta aplicación se pueden agregar. Sirve para aplicaciones web, de escritorio, móviles, para paralelizar tareas, juegos, etc.

Los programas en Python se llaman scripts, y funciona gracias a un interprete, los scripts son interpretados linea por linea según se va requiriendo. Siempre para los scripts sera necesario el interprete, pero también tenemos un interprete para calar instrucciones simples, muy similar a la shell en linux, de igual manera tenemos un prompt que nos marca donde vamos con las instrucciones ejecutadas.

Para la gran mayoría de las distribuciones de Linux no es necesario instalar Python, ya esta instalado debido a que ya es parte funcional para estas, esta incrustado en las librerías básicas de las distribuciones.

Para la instalación en Windows paso este tutorial, en la primera parte del mismo están las instrucciones para instalarlo en este sistema operativo.

Para abrir el intérprete de Python en Linux es necesario solo escribir la palabra "python" en shell y este aparecerá.


Los programas se pueden hacer desde cualquier editor de texto plano y para correr el script en terminal solo se accede al directorio donde se encuentra tu programa (tutorial de los comandos básicos de Linux, ahí encontraras el comando para navegar entre directorios en el shell). A continuación en la terminal solo escribirás "python <nombre de tu archivo.py>" y ya se ejecutará tu programa.

Ya hay IDE para hacer este proceso mas sencillo, con solo pulsar un botón. Los mas recomendables en mi opinión son pycharm y geany para Python en este caso.

Python tiene una filosofía que es necesario conocerla para comprender el paradigma y al mismo lenguaje. Debido a la importancia de la misma es fácil acceder a ella, en el interprete de python solo escribimos:
import this

Y aparecerá esto:

Vale la pena echarle una leída para comprender bien este paradigma. Crecerás como programador si lo aplicas.

Ahora vamos con el hola mundo en python, es bastante sencillo, primero lo haremos con el interprete y en seguida leyendo de un archivo.

La palabra reservada que nos servirá para esta operación sera "print". Print lo que hace es imprimir en terminal la secuencia de caracteres o variables que se mande como parámetros. Cuando solo se imprime una variable de cualquier tipo no es necesario castear a String. En cambió si se  tiene algún texto como "El resultado =" y enseguida la variable, la variable si no es de tipo String se tendrá que castear, no es difícil, pero es material para un próximo tutorial.

Primero haciendo el "Hola mundo" en el interprete:

Ahora en algún archivo. Primero abrimos el editor de texto en este caso usare nano, un editor en shell muy popular en la comunidad linuxera. Para llamar a este editor se tiene utiliza en shell la palabra nano y enseguida el nombre del archivo que quieres crear en este caso sera:
nano HolaMundo.py

Y esto nos llevara al popular editor:
Y escribimos el programa, en este caso solo es el mensaje de hola mundo:

Y ahora presionamos la combinación de teclas "Control" y "O". Esto para guardar el archivo, nos mandara un mensaje confirmación, solo le damos enter.
Y ya enseguida presionamos "Control" y "X" para salir.
Para ejecutar solo escribimos "python HolaMundo.py"

Este es el primero de una serie de tutoriales de python, dudas o cualquier cosa en comentarios por favor. Por su atención gracias.
Te invito a ver funciones, ciclos y condiciones en Python.

lunes, 13 de julio de 2015

Instalar OpenCV para Python en Windows

Hoy les traigo un pequeño tutorial donde explico como instalar OpenCV para Python en Windows.

¿Que es OpenCV?
Es una biblioteca libre orientada a la visión artificial.

¿Que es Visión Artificial?
La visión artificial tiene por objetivo modelar matemáticamente los procesos de percepción visual en los seres vivos y generar programas que permitan simular estas capacidades visuales por computadora.

Para poder instalar OpenCV en Python, es necesario asegurarnos de que en verdad contamos con una versión de Python, de no ser así, debemos entrar a esta pagina: https://www.python.org/downloads/ y descargarlo, yo recomiendo la versión 2.7 ya que es una versión muy estable. Ya que entremos a la pagina, seleccionamos el botón que dice: "Download Python 2.7.10" que se muestra a continuación:


La descarga iniciara automáticamente. Una ves que ya contemos con el ejecutable de Python, le damos doble click para comenzar la instalación, y se mostrara la siguiente ventana:


Presionamos "Next":


De nuevo seleccionamos "Next":


Por ultima ves presionamos "Next" y se mostrara la siguiente ventana:


Aquí nos lanzara una ventana emergente donde nos pregunta si queremos permitir que Python instale archivos en nuestro equipo, seleccionamos que si y comenzara a instalar:


Al concluir la instalación de los paquetes nos arrojara la siguiente ventana y solo presionamos "Finish".


Y con esto ya tendremos Python instalado en nuestro equipo.

Una vez que ya contemos con Python en nuestro equipo, entramos a la siguiente pagina: http://opencv.org/ y seleccionamos la opción de: "OpenCV for Windows", que se muestra a continuación:


Al seleccionarla, la descarga de OpenCV iniciara automáticamente. Una ves que la descarga de OpenCV este completa, tenemos que darle doble click a nuestro ejecutable de OpenCV para comenzar nuestra instalación y se mostrara la siguiente ventana:


Seleccionamos el boton que tiene los 3 puntos y se encuentra a la derecha, para cambiar la ruta donde se instalara OpenCV, sera una ventana como esta:


Estando en esta ventana, seleccionamos "Equipo" y "Disco local (C:)", como se muestra en la imagen siguiente, y seleccionamos el botón de aceptar:


Y dejamos que se descompriman todos los archivos, una ves que concluya la instalación vamos a la carpeta "Disco local (C:)" y se vera parecido a la imagen siguiente:


Ahora entramos a la carpeta "OpenCV":


Posteriormente a la carpeta "build":


Luego entramos en la carpeta "Python":


Entramos a la carpeta "2.7":


Posteriormente ingresamos a la carpeta "x86":


Y copiamos el archivo "cv2.pyd". Posteriormente regresamos a la carpeta "Disco local (C:)":


Ingresamos a la carpeta "Python27":


Luego a la carpeta "Lib":


Posteriormente entramos a la carpeta "site-packages" y pegamos nuestro archivo en esta carpeta:


Ya que hicimos lo anterior, ingresamos a la siguiente pagina: http://sourceforge.net/projects/numpy/files/NumPy/1.9.2/numpy-1.9.2-win32-superpack-python2.7.exe/download y se comenzara a descargar automáticamente la librería numpy para Python, una librería necesaria al utilizar OpenCV dentro de Python y que nos ayudara con los cálculos matemáticos.

Una ves que concluya la descarga, damos doble click sobre nuestro ejecutable para iniciar la instalación de numpy y aparecerá una ventana emergente preguntándonos si deseamos permitir que numpy instale archivos en nuestro equipo, seleccionamos que si y se nos mostrara la siguiente ventana:


Seleccionamos el botón siguiente:


Seleccionamos siguiente de nuevo:


Y comenzara la instalación automáticamente, al concluir la instalación se mostrara la siguiente ventana y presionaremos el botón "finalizar":


Nos aparecerá la siguiente ventana y solo presionaremos el botón "cerrar":


Con esto OpenCV estará instalado completamente para utilizarlo en Python, pero ahora instalaremos una librería que nos será de mucha utilidad para generar interfaces fácil y rápido en Python, esto es porque la mayoría de los ejemplos de OpenCV para Python utilizan esta librería.

Ahora ingresamos al inicio y en la barra de búsqueda escribimos "cmd" y presionamos la tecla "Enter" y se nos abrirá el "Símbolo de sistema" como se muestra en la siguiente imagen:


Ahora tenemos que escribir: "pip install matplotlib":


Presionamos la tecla "Enter" y se comenzaran a descargar e instalar archivos como se muestra a continuación:


Esperamos un momento y cuando termine la instalación se vera como en la imagen siguiente:


Con esto ya estamos totalmente listos para utilizar OpenCV en Python, para probar que todo se instalo correctamente, vamos a el inicio y buscamos: "idle" y nos aparecerá: "IDLE (Python GUI)", lo seleccionamos y nos mostrara una ventana como la siguiente:


Ahora escribimos: "import cv2" y presionamos la tecla "Enter", si aparecen una flechas como estas: ">>>>", quiere decir que OpenCV se instalo correctamente:


Ahora escribimos: "import matplotlib" y presionamos la tecla "Enter":


Espero y este tutorial les sea de utilidad, cualquier duda no duden en comentarla por favor. Muchas gracias por visitar este tutorial.

Fuente:
http://sabia.tic.udc.es/gc/Contenidos%20adicionales/trabajos/3D/VisionArtificial/index.html consultada el 13 de Julio del 2015.
https://es.wikipedia.org/wiki/OpenCV consultada el 13 de Julio del 2015.