viernes, 9 de junio de 2017

Importancia del uso de Synchronized al implementar Threads (Hilos) en Java

Un bloque o método sincronizado en Java es aquel que utiliza la palabra reservada synchronized.

La importancia en su uso radica en evitar o prevenir las condiciones de carrera(race condition) al manejar hilos en Java.

La palabra reservada Synchronized.

Los bloques sincronizados en Java están marcados con la palabra clave synchronized. Un bloque sincronizado en Java se sincroniza en algún objeto. Todos los bloques synchronized sincronizados en el mismo objeto sólo pueden tener un subproceso ejecutándose dentro de ellos al mismo tiempo. 

Todos los demás hilos que intentan entrar en el bloque sincronizado se bloquean hasta que el hilo dentro del bloque sincronizado sale.

La palabra reservada synchronized puede utilizarse para cuatro tipos de bloques diferentes:
Metodos de instancia, metodos estáticos, bloques de código dentro de metodos de instancia, bloques de código dentro de metodos estáticos. 

El tipo de bloque synchronized que necesites dependerá de una situación concreta.

Ejemplo.


He aquí un ejemplo que inicia 2 subprocesos y que ambos llaman al método agregar en la misma instancia de Cobro. Sólo un hilo a la vez podrá llamar al método agregar en la misma instancia, ya que el método se sincroniza en la instancia a la que pertenece.

public class Cobro{
     
     long contar = 0;
    
     public synchronized void agregar(long valor){
       this.contar += valor;
     }
  }

public class CobroThread extends Thread{

     protected Cobro cobro = null;

     public CobroThread(Cobro cobro){
        this.cobro = cobro;
     }

     public void run() {
 for(int i=0; i<10; i++){
           cobro.agregar(i);
        }
     }
  }

  public class Ejemplo {

    public static void main(String[] args){
      Cobro cobro = new Cobro();
      Thread  threadA = new CobroThread(cobro);
      Thread  threadB = new CobroThread(cobro);

      threadA.start();
      threadB.start(); 
    }
  }

Se crean dos subprocesos. La misma instancia de cobro se pasa a ambos en su constructor. El método agregar() se sincroniza en la instancia, porque el método agregar es un método de instancia y se marca como sincronizado. Por lo tanto, sólo uno de los subprocesos puede llamar al método agregar() a la vez. El otro hilo esperará hasta que el primer hilo deje el método agregar(), antes de que pueda ejecutar el método mismo.

Si los dos subprocesos hubieran hecho referencia a dos instancias de cobro distintas, no habría problemas para llamar a los métodos agregar() simultáneamente. Las llamadas habrían sido a objetos diferentes, por lo que los métodos llamados también estarían sincronizados en diferentes objetos (el objeto que posee el método). Por lo tanto las llamadas no bloquearían. Aquí es cómo podría verse:

 public class Ejemplo {

    public static void main(String[] args){
      Cobro cobroA = new Cobro();
      Cobro cobroB = new Cobro();
      Thread  threadA = new CobroThread(cobroA);
      Thread  threadB = new CobroThread(cobroB);

      threadA.start();
      threadB.start(); 
    }
  }

 Observe cómo los dos subprocesos, threadA y threadB, ya no hacen referencia a la misma instancia de cobro. El método agregar de cobroA y cobroB se sincroniza en sus dos instancias propietarias. Llamar agregar() en cobroA no bloqueará así una llamada a agregar() en cobroB.

A modo de ejemplos de alto nivel si no usáramos synchronized cuando manipulamos hilos podría darse el caso que multiples hilos alteren el estado o las características de un mismo objeto causando problemas como los siguientes: 

Un sistema mal diseñado de reserva de entradas podría ocasionar que dos usuarios accediendo desde la web a la vez, reserven legítimamente la misma butaca. O un sistema de conteo automático de plazas libres de un parking en sus barreras de entrada y salida de vehículos podría indicar que está totalmente vacío cuando realmente está lleno (o viceversa). De igual forma, dos personas ingresando y retirando efectivo a la vez de una misma cuenta bancaria podrían ver su saldo incrementado o por el contrario su ingreso realizado pero no materializado en saldo disponible. Si bien son situaciones que pudieran ser improbables, son posibles y pueden ser y han de ser evitadas en el desarrollo de software.

Si los procesos que están en condición de carrera (race condition) son correctamente sincronizados, todo debería funcionar correctamente, por lo que el resultado será el esperado. Múltiples procesos se encuentran en condición de carrera si el resultado de los mismos depende del orden de su llegada y si no son correctamente sincronizados, puede producirse una corrupción de datos, que puede derivar incluso en un problema de seguridad del sistema capaz de ser explotado de forma malintencionada. Análogamente, en circuitos electrónicos se da una condición de carrera cuando la salida de un sistema o subsistema depende del orden en que se hayan mandado las solicitudes de activación o desactivación de sus componentes.


Recuerda que este blog sobrevive gracias a tus donaciones o clics en los anuncios, ya sabes como apoyar este recurso para continuar subiendo mas tutoriales. Gracias.























miércoles, 15 de julio de 2015

Elaborar el presupuesto para un proyecto de Software de pequeña o mediana escala

Muchas veces cuando realizas un proyecto tienes dudas de cuál es el monto a cobrar por tu trabajo o simplemente no encuentras la forma de organizar tus costos y gastos para luego calcular el margen de ganancia.

Este es un problema muy común en personas que inician en el desarrollo de proyectos o primeros emprendimientos o que no han recibido una capacitación adecuada sobre estimaciones en inversión de proyectos de ingeniería.

En esta entrada del blog aprenderemos con un enfoque práctico sobre como calcular los costos y por supuesto las ansiadas ganancias de un proyecto informático de pequeña o mediana escala.

PASO 1: Determinación del problema a resolver.

Vamos a suponer que el dueño de una tienda de celulares nos ha solicitado un software a la medida, en el cuál él desea llevar un control de sus productos y también de las ventas que realizan sus empleados de dichos productos.

Lo que el dueño de la tienda quiere que el Software realize es lo siguiente:

- Guardar datos sobre las marcas, modelos y compañías telefónicas de los dispositivos.
- Permitir la edición de la información de los dispositivos.
- Cambiar el estado de los dispositivos a existentes o inexistentes en bodega.
- Almacenar la cantidad de dispositivos vendidos y la persona que los vendió.
- Generar reportes de ventas diarias, mensuales, trimestrales y anuales.
- Generar reportes comparativos anuales de ventas realizadas por marca de celulares.
- Permitir la impresión de los reportes desde el Software.

Ok, ahora que sabemos lo que el cliente necesita, tenemos que elaborar una propuesta tanto técnica como económica, donde daremos a conocer como resolver el problema que el cliente nos ha planteado, cabe aclarar que debemos hacerlo de una forma clara y sin muchas palabras técnicas, ya que el "dueño de la tienda" no conoce nada de términos informáticos.

PASO 2: Elaboración de la propuesta técnica

El primer paso que debes hacer es comenzar a redactar un documento formal donde colocarás el título de la propuesta técnica, objetivo de la propuesta y soluciones alternativas.

Por ejemplo, continuando con nuestro ejemplo la propuesta técnica sería algo como:

Título: "Propuesta técnica para el desarrollo de un Software de gestión de productos de telefonía móvil".

Objetivo: Proporcionar las diferentes vías técnicas posibles para lograr el desarrollo de el Software de gestión de productos de telefonía móvil.

Soluciones alternativas: En nuestro caso a modo de ejemplo plantearemos únicamente 2 pero dependerá del proyecto que tu puedas dar mas de 2 soluciones al problema.

CaracterísticasSolución 1Solución 2
Ambiente operativoEl entorno de escritorio es ideal para ejecutar aplicaciones que no necesiten conectarse a travéz de un navegador web sino solamente se instalen en el ordenador y estén listas para su ejecución en la máquina donde se han instalado.El entorno web permite la ejecución de aplicaciones desde cualquier navegador web permitiendo instalar la solución a través de un servidor de aplicación o un servidor web local o en línea.
Tecnologías de desarrolloEl lenguaje de programación JAVA es utilizado a menudo en gran parte del mundo y posee elementos de seguridad integrados que le hacen una buena opción para el desarrollo del proyecto, es un lenguaje extendido a nivel mundial y cuenta con una cantidad grande de frameworks y plugins.El lenguaje de programación PHP es utilizado en aplicaciones web de diversa indole al ser un lenguaje de scripting es ideal para la elaboración de productos de Software en tiempos cortos de desarrollo.
Almacenamiento de datosPostGreSQL es una base de datos mundialmente utilizada y provee de un potente motor de almacenamiento para bases de datos relacionales.MySQL es una base de datos ampliamente utilizada y cuenta con una velocidad adecuada para la ejecución con aplicaciones web y móviles.

La anterior tabla expresa nuestras vías o alternativas para el desarrollo de nuestro proyecto, ahora bien, se viene la decisión crucial que dependerá en gran parte de la capacidad de pago del cliente, debes analizar a profundidad que tanta es la disposición del cliente para invertir y de esta forma escoger entre tus soluciones alternativas aquella que sea acorde y no valla a sacar mas de un susto a tu cliente.

Para la problemática que hemos planteado del "Software para gestión de productos de telefonía" supondremos que el cliente es una pequeña empresa local que basa sus operaciones en un ambiente departamental únicamente con 2 sucursales. Para tal efecto elaboremos un pequeño análisis de viabilidad de nuestras soluciones alternativas.


ViabilidadSolución 1Solución 2
OperativaDebido a que la empresa cuenta con 2 sucursales no es técnicamente viable una aplicación de escritorio porque dificultaría el proceso de integración de datos entre sucursalesLa solución web es técnicamente viable porque permitirá una mejor distribución de la información entre las 2 sucursales de la empresa
TécnicaLa solución de escritorio técnicamente es viable porque se cuentan con los recursos para su elaboración.La solución web es viable porque se cuenta con la disponibilidad de la adquisición de un servidor por parte de la empresa para el proyecto.
EconómicaDesde el punto de vista económico la solución es viable porque se procedería con un lenguaje y plataformas de desarrollo Open Source.Desde el punto de vista económico la solución es viable porque se procedería con un lenguaje y plataformas de desarrollo Open Source. Esto reduciría significativamente los costos de desarrollo.

Como podemos observar la solución 2 es la predilecta ya que nos brinda mayores ventajas con respecto a la primera.

PASO 3: Elaboración de la propuesta económica.

Una vez elegida nuestra solución debemos determinar los costos y gastos de la misma, en este caso independientemente que nosotros cumplamos los roles de "hacer todo" porque somos emprendedores individuales o por X motivo debemos elaborar un presupuesto pensando en los salarios que deberíamos pagar como si se contratase a algunas personas para el proyecto.

Que debemos conocer para elaborar el presupuesto?
sencillo, tiempo y trabajo son las claves.

Pero como se cuánto tiempo me va a llevar terminar una solución?
fácil, en base a las actividades que debas hacer.

Para ello nos auxiliaremos del tan famoso y utilizado diagrama de actividades, empleado en diversos proyectos de ingeniería y que hasta la fecha sigue siendo una herramienta clave para el control de actividades.

Hacer un diagrama de actividades es muy sencillo, puedes utilizar cualquier herramienta como por ejemplo Excel para su elaboración, en este enlace puedes consultar como elaborarlo de acuerdo a explicaciones oficiales de Microsoft.

Manos a la obra continuando con nuestro proyecto vamos a tomar en cuenta los requerimientos que pasarán a ser parte de nuestras actividades para elaborar el diagrama de actividades. En dicho diagrama representaremos las actividades y el tiempo estimado para cada una, yo recomiendo no darle menos de 3 días o 2 a una actividad por muy pequeña que parezca por experiencia propia siempre los proyectos tienden a volverse complejos en el camino. Tampoco olvidar la fase de pruebas e implementación.

En este caso a modo de ejemplo en nuestro diagrama de actividades resumiremos el tiempo en meses y semanas, si el proyecto es menor a dos meses lo recomendable es tomar como base las semanas y días.
La parte azul significa el tiempo que nos llevaremos en la actividad correspondiente. Para las pruebas de Software es importante dejar un tiempo prudente ya que no sabemos si nos encontraremos con bugs o funcionalidades que deban mejorarse, a su vez deben ir cercanas las fechas de culminación de pruebas con la implementación para garantizar un producto de calidad.

Teniendo identificadas las actividades y el tiempo a emplear por cada una debemos elaborar el presupuesto tomando en cuenta salarios, gastos de maquinaria y otros insumos que debamos incurrir como sigue a continuación.




Con esto ya tenemos lista nuestra propuesta para el cliente sobre el sistema de gestión de productos de telefonía móvil, proyectado a 2 meses e invirtiendo el tiempo mostrado en el diagrama de actividades y los costos y gastos de nuestro presupuesto. (Recuerden también calcular cualquier tipo de impuesto como el IVA u otro aplicable a su país o algún impuesto si elaboran el proyecto por servicios profesionales).

Espero haber aportado un poco con este ejemplo de como estipular y planificar nuestros proyectos para que sean exitosos, recuerden también anclar y definir los requerimientos desde un inicio para que no vean comprometido su trabajo, de ser posible manejen contratos que permitan tanto al cliente como a ustedes tener una garantía del trabajo o proyecto a realizar.

Recuerda que este blog sobrevive gracias a tus donaciones o clics en los anuncios, ya sabes como apoyar este recurso para continuar subiendo mas tutoriales. Gracias.









martes, 7 de julio de 2015

Como crear una aplicación basica en Swift con Xcode

Swift es el nuevo lenguaje de programación para desarrollar aplicaciones orientadas a IOS el Sistema Operativo Inteligente de Apple utilizado en sus dispositivos Iphone/Ipad.

Lo primero que debemos tener en cuenta para desarrollar una aplicación para IOS es el entorno de desarrollo, ¿Que necesitamos para iniciar?.

Basicamente necesitas lo siguiente:
- Un equipo Mac de preferencia con OSX Mavericks o superior.
- El IDE Xcode, puedes descargarla desde la App Store gratuitamente.
- Conocimientos básicos de programación.

Manos a la obra, lo primer será iniciar nuestro entorno de desarrollo Xcode y en la primera pantalla seleccionaremos "Create a new Xcode Project".

En el menú de la parte izquierda seleccionaremos IOS - Application - Single View Application


En la siguiente parte indicaremos un nombre para nuestra aplicación y la organización a la cuál pertenecerá, este paso es importante ya que lo ideal es que utilices el nombre de tu organización cliente o el de tu preferencia. Además seleccionaremos a Swift como lenguaje de programación.



Luego nos pedirá la ubicación donde guardarlo, para ello buscamos la ubicación y hacemos clic en "Create". Podremos observar la estructura básica de nuestro proyecto.


Para continuar primero debemos comprender un poco los conceptos siguientes:

Storyboard: Es una utilidad que te permite ver las diferentes vistas de la aplicación de forma gráfica.

ViewController: Es una clase que hereda de la clase UIViewController que te permitirá llevar tareas de control entre tu modelo de Negocio y tus vistas.

AppDelegate: Algunos le llaman "El corazón de una aplicación IOS" debido a que en dicha clase puedes manejar los estados para configuraciones iniciales o destrucción de objetos en tu aplicación, básicamente gestiona el ciclo de vida de tu aplicación IOS.

Ahora vamos a enfocarnos en nuestro storyboard y vamos a colocar un botón y una caja de texto desde la bandeja de widgets.


seleccionaremos la vista doble donde podremos visualizar la vista y el controlador principal.


Seleccionaremos con clic derecho la caja de texto y arrastraremos hasta la clase ViewController


Se creará un Outlet que en mi caso le pondré textBox.


Podemos ver que esta acción sencilla nos ha generado una variable que estará desde este instante haciendo referencia a nuestro objeto UITextField.


Procederemos a hacer lo mismo con el botón.

En Swift como en cualquier otro lenguaje de programación podemos declarar funciones, en este caso colocaremos una en nuestro ViewController con el nombre showMessage.


Ahora crearemos una acción(IBAction) con la cuál sabremos cuando el botón ha sido presionado.
Para ello seleccionaremos el botón con clic derecho y arrastraremos tal como se muestra.




Invocaremos nuestra función dentro del IBAction. Luego procederemos a iniciar el emulador dando clic al botón Play de la parte superior izquierda.


Y listo, si hacemos clic en el botón podremos ver nuestro mensaje en la caja de texto.


Bien terminamos nuestro "demo" de como crear una aplicación básica con Swift, ahora te queda de tarea modificar la aplicación para que permita introducir un texto en la caja y desplegarla en otro control como en un UILabel por ejemplo. Suerte, más adelante les compartiré otro tutorial más avanzado.

lunes, 30 de junio de 2014

Conectar Oracle 11g con Android mediante Servicio Web con PHP + CodeIgniter en lista personalizada

Para seguir el siguiente tutorial es necesario poseer conocimientos basicos de programacion, ademas de conocimientos basicos en el framework MVC CodeIgniter para PHP y nociones basicas del motor de base de datos Oracle Database 11g XE.

Los siguientes enlaces pueden ayudarte a conocer un poco sobre lo antes mencionado:

1-) http://ellislab.com/codeigniter/user-guide/
2-) http://docs.oracle.com/cd/E29505_01/server.1111/e25789/intro.htm

Continuemos..

Lo primero que haremos es crear un nuevo sitio web para ello necesitaremos tener instalado LAMP en Linux O XAM, WAMP en Windows.

Yo me ayudare en este caso de Dreamweaver ustedes pueden hacerlo con la IDE que crean conveniente, para ello la estructura quedara asi de acuerdo a los directorios de CodeIgniter.


En el directorio application/config/  se encuentra el archivo database.php que es donde configuraremos 
la conexion a nuestra base de datos Oracle 11g Express Edition (Previamente instalada).


Las lineas de especial cuidado son las siguientes:

$tnsname="(DESCRIPTION = (ADDRESS = (PROTOCOL = TCP)(HOST = localhost)(PORT = 1521))
        (CONNECT_DATA = (SERVER = DEDICATED) (SERVICE_NAME = XE)))";
En la anterior linea se define una constante que contiene la descripcion general de una conexion a Oracle.

$db['default']['dbdriver'] = 'oci8';

"oci8" es el valor por defecto que utiliza CodeIgniter con las conexiones a Oracle Database.

En mi caso habilitare el servicio de OracleXE, por razones de rendimiento siempre es preferible manejar dicho servicio configurado como "manual" para no mermar el rendimiento de nuestro equipo.


Con el servicio corriendo procedere a utilizar uno de los esquemas por defecto de Oracle (Esquema HR) 
creamos una conexion y procedemos a ejecutar una consulta a la tabla "employee" la cual posteriormente mostraremos en una lista desplegable en Android a traves del consumo de un Servicio Web en PHP(CodeIgniter).


Como pueden observar ejecutamos una consulta sencilla mostrando 2 resultados empleado y salario lo cual procederemos a utilizarlo con CodeIgniter.

Ponemos a punto nuestro servidor e iniciamos el servicio de Apache2 en Linux o WAMP, XAMP en Windows.


En mi caso utilizare WAMP Server.

Volvemos a nuestro proyecto CodeIgniter y crearemos el respectivo modelo y controlador.


Con nuestro modelo y controlador listos nos dirigimos a nuestro navegador web en mi caso Google Chrome
y buscamos la siguiente URL: http://IP_DEL_SERVIDOR/NOMBRE_SITIO_WEB/CONTROLADOR
en mi caso cumplo el estandard de la siguiente manera: http://192.168.1.2/codeigniter_oracle/empleados

Si hemos configurado bien CodeIgniter, y tenemos a punto nuestro servicio de Oracle y WAMP deberiamos observar la respuesta de nuestro servicio en formato JSON, asi.


Iniciaremos Eclipse y procederemos a crear un nuevo proyecto Android Application.


Crearemos 5 clases.

Iremos una a una, veremos como primer punto la clase URL, esta clase sera la encargada de gestionar las URL de peticion a servicios web en el caso que debamos consumir mas de un servicio.


La clase Conexion tendra simplemente un metodo que hara una peticion POST a nuestro servicio web.
La clase convertidorJSON es una clase utilitaria que la adjuntare en el codigo fuente.



En la clase AdaptadorEmpleados haremos una herencia a ArrayAdapter y utilizaremos el arreglo que parsearemos en nuestra consulta al servicio.


Nuestra actividad principal esta especificada en el codigo fuente pero en ella simplemente crearemos una clase que heredara de Asyntask para ejecutar en segundo plano la consulta a nuestro servicio web 
y parsearemos ademas los controles Android.
Nuestras vistas se conforman del activity_main.xml y un layout alternativo llamado item donde colocaremos
el DISEÑO de nuestra lista.



Si todo a salido correcto corremos nuestro emulador y veremos el resultado final de nuestro trabajo.

Adjunto enlace para descargar el codigo Fuente, espero haber aportado con este tutorial a todos aquellos
que desean adentrarse al desarrollo Android con manejo de servicios web y bases de datos.

https://mega.co.nz/#!tt0WEAaY!BCGiIKem-DhLh9WuRef64ef25muBSIQIqTsaglfZ0Io

domingo, 15 de diciembre de 2013

Volley libreria de Google para hacer mas faciles y rapidas nuestras aplicaciones Android que descargan contenido en red.

Que es Volley?
Es una libreria que podremos integrar a nuestro proyecto Android para hacer mas faciles y rapidas las operaciones de red como: Descarga de imagenes, peticiones o envio de datos entre cliente y servidor.

Para una mejor percepcion dejo el enlace a la explicacion oficial de los ingenieros de Google:
http://www.youtube.com/watch?v=yhv8l9F44qo

Aqui una traduccion de Google translate sobre las ventajas de Volley al aplicarla en nuestros proyectos:

-Volley automáticamente programa todas las solicitudes de red. Significa que Volley se hace cargo de toda ls solicitudes de red que su aplicación ejecuta para ir a buscar la respuesta o la imagen de la web.
-Volley ofrece disco transparente y el almacenamiento en caché de memoria.
-Volley ofrece una potente API solicitud de cancelación. Esto significa que usted puede cancelar la solicitud o puede establecer bloques o ámbitos de peticiones para cancelar.
-Volley proporciona potentes capacidades de personalización.
-Volley proporciona herramientas de depuración y rastreo.

COMO UTILIZAR VOLLEY:
PASO 1: Clonar el proyecto de Github
Direccion: https://android.googlesource.com/platform/frameworks/volley.

Si no sabes como clonar un proyecto de Github te dejo el enlace hacia un tutorial.
 http://www.technotalkative.com/android-import-android-projects-from-git/

Si no quieres clonarla puedes descargarla de aqui:

 https://mega.co.nz/#!Rpd1TZBJ!NsGKxVL3klmXUl-9qX2SVkxI54do1P_-ub3vjqG9kLk


PROYECTO EJEMPLO:

Lo primero, dentro de Volley se encuentran dos clases java importantes:
1. Request queue: Si tu interés es utilizar Volley para el envío de solicitudes a la red, puedes hacer una cola de peticiones en demanda si lo deseas, pero por lo general, la libreria las crea desde el principio, en el momento de arranque, y mantenerlo alrededor y utilizarlo como Singleton(instancia unica).
2. Request: Contiene todos los detalles necesarios para hacer llamadas de API Web. Por ejemplo: el método a utilizar (GET o POST), datos de la solicitud, escuchadores(listeners), escuchador de errores(error listeners).

DESARROLLO:
A-) Importar Volley en nuestro espacio de trabajo de Eclipse.



Creamos un nuevo proyecto del tipo aplicacion Android:

Recuerda que en el paso anterior le das el nombre a tu proyecto el nombre de paquete(Package Name) con el cual sera reconocido en Google Play(Yo recomiendo utilizar "com.nombretuproyecto.nombretuproyectoapp" pero puedes llamarlo como quieras) luego los SDK minimos Target, compilacion y el Tema de tu App.

En mi caso le puse de nombre "EjemploVolley" al proyecto y al paquete "com.ejemplo.volley" como puedes ver a continuacion:
Importamos Volley haciendo clic derecho sobre la carpeta de proyecto luego "propiedades/android/"

Recuerda agregar al Manifest de tu aplicacion los permisos de Internet:
<uses-permission android:name="android.permission.INTERNET"/>

En nuestro proyecto veremos como Volley trabaja en la peticion de imagenes para ello comenzaremos creando una clase java la cual nos servira para el tratamiento de la cache.



Luego crearemos una clase llamada ConvertidorJSON que nos servira para hacer peticiones de url de imagenes via JSON.
package com.ejemplo.volley;

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.UnsupportedEncodingException;

import org.apache.http.HttpEntity;
import org.apache.http.HttpResponse;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.impl.client.DefaultHttpClient;
import org.json.JSONException;
import org.json.JSONObject;

import android.util.Log;

public class ConvertidorJSON {
static InputStream is = null;
    static JSONObject jObj = null;
    static String json = "";
   public ConvertidorJSON()
   {
 
   }
   public JSONObject getJSONFromUrl(String url) {
  
       
       try {
          
           DefaultHttpClient httpClient = new DefaultHttpClient();
           HttpPost httpPost = new HttpPost(url);

           HttpResponse httpResponse = httpClient.execute(httpPost);
           HttpEntity httpEntity = httpResponse.getEntity();
           is = httpEntity.getContent();           

       } catch (UnsupportedEncodingException e) {
           e.printStackTrace();
       } catch (ClientProtocolException e) {
           e.printStackTrace();
       } catch (IOException e) {
           e.printStackTrace();
       }
        
       try {
           BufferedReader reader = new BufferedReader(new InputStreamReader(
                   is, "UTF-8"), 8);
           StringBuilder sb = new StringBuilder();
           String line = null;
           while ((line = reader.readLine()) != null) {
               sb.append(line + "\n");
           }
           is.close();
           json = sb.toString();
       } catch (Exception e) {
           Log.e("Buffer Error", "Error converting result " + e.toString());
       }

       // try parse the string to a JSON object
       try {
           jObj = new JSONObject(json);
       } catch (JSONException e) {
           Log.e("JSON Parser", "Error parsing data " + e.toString());
       }

       // return JSON String
       return jObj;

   }
}

Luego creamos el codigo de nuestra vista XML. En el cual tendremos ademas de un control ImageView tradicional uno referente a la libreria Volley que es el NetworkImageView.

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    android:paddingBottom="@dimen/activity_vertical_margin"
    android:paddingLeft="@dimen/activity_horizontal_margin"
    android:paddingRight="@dimen/activity_horizontal_margin"
    android:paddingTop="@dimen/activity_vertical_margin"
    tools:context=".MainActivity" >

    <ImageView
        android:id="@+id/imageView1"
        android:layout_width="150dp"
        android:layout_height="170dp"
        android:layout_centerHorizontal="true"
        android:src="@drawable/ic_launcher" />

    <com.android.volley.toolbox.NetworkImageView
        android:id="@+id/networkImageView"
        android:layout_width="150dp"
        android:layout_height="170dp"
        android:layout_below="@+id/imageView1"
        android:layout_centerHorizontal="true"
        android:src="@drawable/ic_launcher" />

    <LinearLayout
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignParentBottom="true"
        android:orientation="vertical" >

      
    </LinearLayout>

</RelativeLayout>

El codigo anterior deberia generarnos la siguiente vista grafica.



La siguiente codificacion corresponde al codigo de tu activity en este ejemplo cargaremos dos imagenes una por medio de URL y la otra a travez de la lectura de un JSON generado por un Servicio Web en PHP.

package com.ejemplo.volley;

import org.json.JSONException;
import org.json.JSONObject;
import android.app.Activity;
import android.os.AsyncTask;
import android.os.Bundle;
import android.view.View;
import android.widget.ImageView;
import com.android.volley.RequestQueue;
import com.android.volley.toolbox.ImageLoader;
import com.android.volley.toolbox.NetworkImageView;
import com.android.volley.toolbox.Volley;
import com.technotalkative.volleyimageloading.R;

public class MainActivity extends Activity {

private RequestQueue mRequestQueue;
private ImageLoader imageLoader;
private String img1, img2;
private ImageView imageView;
private NetworkImageView networkImageView;
String urlimg1, urlimg2;
private static final String IMAGE_URL = "http://developer.android.com/images/gp-device.png";

@Override
protected void onCreate(Bundle savedInstanceState) {
super.onCreate(savedInstanceState);
setContentView(R.layout.activity_main);

networkImageView = (NetworkImageView) findViewById(R.id.networkImageView);
imageView = (ImageView) findViewById(R.id.imageView1);
new MiTarea()
.execute("http://miweb/ws/webservice.php");
mRequestQueue = Volley.newRequestQueue(this);
imageLoader = new ImageLoader(mRequestQueue, new BitmapLruCache(
BitmapLruCache.getDefaultLruCacheSize()));

}

 

private class MiTarea extends AsyncTask<String, Float, Integer> {
private static final String im1= "nombreimg1";
private static final String im2= "nombreimg2";

protected void onPreExecute() {
// antes de comenzar
}

protected Integer doInBackground(String... params) {

String url = params[0];
try {

try {
ConvertidorJSON jp = new ConvertidorJSON();
JSONObject json = jp.getJSONFromUrl(url);
img1 = json.getJSONArray(im1).getString(0);
img2 = json.getJSONArray(im2).getString(0);

} catch (JSONException e) {
e.printStackTrace();
}
} catch (Exception e) {
e.printStackTrace();
}
String urlbase = "http://miweb/ubicaciondeimagenes/";

// urls para imagenes
urlimg1 = urlbase + "directorio/" + img1;// url para imagen 1
urlimg2 = urlbase + "directorio/" + img2; // url para imagen2

return null;

}

protected void onProgressUpdate(Float... valores) {

}

protected void onPostExecute(Integer bytes) {
networkImageView.setImageUrl(urlimg1, imageLoader);
imageLoader.get(urlimg1, ImageLoader.getImageListener(imageView,
R.drawable.ic_launcher, R.drawable.ic_error));
}
}

}

Podras observar que para la descarga de imagenes se hizo en un hilo secundario gracias a la potencia de la clase abstracta Asyntask http://developer.android.com/reference/android/os/AsyncTask.html
de Android, toda accion de descarga de contenido en red es preferible hacerlo en segundo plano a traves de un nuevo hilo de ejecucion.

A continuacion podemos ver la ejecucion de nuestro proyecto y la rapidez con la cual descarga las imagenes inclusive en una conexion a internet no muy rapida, yo utilizo Genymotion como emulador es un poco mas rapido que los emuladores del SDK de Android. http://www.genymotion.com/



Puedes por ejemplo programar un boton y mediante el descargar las imagenes para que veas como Volley realiza su trabajo a travez del LogCat.

Esto ha sido todo en el post, espero haber aportado un poco al conocimiento general, saludos.

(Disculpen si en la ortografia faltaron acentos XD y tambien si el formato no es tan adecuado) cualquier duda pueden dejar su comentario

Recuerda que este blog sobrevive gracias a tus donaciones o clics en los anuncios, ya sabes como apoyar este recurso para continuar subiendo mas tutoriales. Gracias.






lunes, 14 de enero de 2013

Conectar java utilizando netbeans IDE a Oracle 11g

En esta ocasión comparto con ustedes un sencillo, pero útil tutorial sobre los procesos que deben efectuarse para establecer una conexión entre JAVA y ORACLE.

En la siguiente tabla encontraras los recursos necesarios que deberas descargar e instalar en tu ordenador para poder seguir el tutorial.

Software o recursos Versiones requeridas
NetBeans IDE 7.0, 7.1, 7.2, Java EE bundle
Java Development Kit (JDK) Version 6 or 7
Oracle Database XE 11 g Express Edition
Oracle JDBC driver ojdbc6.jar

Ahora que ya estas listo, pasaremos a los pasos necesarios para obtener una conexion satisfactoria al gestor de bases de datos Oracle (En este caso utilizaremos Netbeans IDE 7.1.2).

La practica consistirá en conectarnos a una instancia local de Oracle, pero perfectamente es aplicable para conexiones con instancias remotas.

Existen 2 categorías de drivers (conectores) para establecer una conexión con Oracle los cuales son: OCI y JDBC Thin, en nuestro caso utilizaremos la segunda opción porque en la mayoria de casos es suficiente para un uso eficiente de nuestra base de datos.

ESTABLECIENDO CONEXION A BASE DE DATOS ORACLE.

1-) Inicia el servicio de Oracle en tu computador.
2- Inicia Netbeans IDE
3-) Ve a la opción Window/Services en Netbeans, y selecciona "nueva conexión".


4-) Cuando te aparezca el asistente de configuración, selecciona de la lista desplegable "Oracle Thin", luego clic en "add" para agregar el driver que descargaste es decir el ojdbc6.jar luego da clic en "Next".

5-) En el panel de personalización de conexión ingresa los siguientes valores y luego has clic en "Next".



Name Value
Driver Name Oracle Thin (with Service ID (SID))
Host localhost o 127.0.0.1.
Nota: En el caso de una conexion remota, proporciona la IP o el nombre de Host para resolver la direccion de la maquina donde esta alojada la base de datos.
Port 1521 (default)
Service ID (SID) XE (default SID para Oracle Database XE).
Nota: Si estas conectado a una base de datos remota, solicita al administrador de base de datos el SID.
Username Ingresa el nombre de usuario.
Para el propósito de este tutorial ingresa HR (Una de las cuentas de ejemplo de Oracle).
Password Ingresa la contraseña del usuario en este caso la contraseña de HR, tu puedes crearle una nueva clave desde Oracle*Plus u otra IDE.


6-) Haz clic en Test Connection para confirmar que la IDE esta habilitada para conectarse a la base de datos, has clic en Next y se te desplegara un mensaje confirmando la conexión.


COMPROBANDO LA CONEXIÓN DESDE UNA APLICACIÓN JAVA

Ahora comprobaremos la conexion al esquema HR de Oracle desde una aplicacion Java.

1-) Selecciona en Netbeans File/New Project/JavaAplication
2-) Le nombraremos al proyecto OracleConection
3-) Se creara la clase por defecto y el método Main que es donde ejecutaremos las instrucciones necesarias para establecer la conexión.
4-) Importaremos los paquetes "java.sql.Connection" y "java.sql.DriverManager" necesarios en este caso.
5-) Crearemos un objeto de tipo conexión "private Connection conexion;"
6-) Desarrollaremos los respectivos Getter y Setter para el objeto conexion.

 public Connection getConexion() {
        return conexion;
    }

   
    public void setConexion(Connection conexion) {
        this.conexion = conexion;
    }

7-) Luego crearemos un método del tipo OracleConection. En dicho método utilizaremos la dirección que tenemos especificada en la conexión que realizamos con anterioridad. Con una condición verificaremos si la conexión es diferente de nulo es porque hemos logrado acceder al esquema HR.


public OracleConection Conectar()
    {
        try{
        Class.forName("oracle.jdbc.OracleDriver");
        String BaseDeDatos = "jdbc:oracle:thin:@localhost:1521:XE";
        conexion= DriverManager.getConnection(BaseDeDatos,"HR","HR");
        if(conexion!=null)
        {
        System.out.println("Conexion exitosa a esquema HR");
        }
        else{System.out.println("Conexion fallida");}
        }
        catch(Exception e)
        {e.printStackTrace();}
     
    return this;
    }

8-) Para finalizar en el metodo MAIN crearemos un objeto para invocar al metodo conectar.


public static void main(String[] args) {
    OracleConection conexion = new OracleConection();
    conexion.Conectar();
}


9-) Le damos clic derecho "Run" a nuestro proyecto y debería enviarnos el mensaje respectivo como en la siguiente imagen.

Fácilmente podemos adaptar la lógica para conectarnos a una aplicación Swing o JSP con lo practicado en este tutorial, recuerda que este blog sobrevive gracias a tus donaciones o clics en los anuncios, ya sabes como apoyar este recurso para continuar subiendo mas tutoriales. Gracias.




miércoles, 26 de diciembre de 2012

controles básicos en Android


Este tutorial se preparó para todas aquellas personas que deseen iniciarse en la programación de aplicaciones para dispositivos móviles, en este caso para dispositivos android, cabe aclarar que en esta ocasión será en SO Windows 7 pero el proceso de instalación de los componentes necesarios es muy similar en plataformas Linux.
Que necesitaremos para este ejemplo básico de android:

1-      Descargar Eclipse IDE desde http://www.eclipse.org/downloads/ (recomiendo la versión “eclipse for mobile developers” pero queda a su preferencia J
2-      El SDK de android en este caso descargaremos el de la parte “USE AN EXISTING IDE”.
3-      Luego en la opción Window de eclipse dan clic en la opción “preferences” y buscan el PATH de instalación del SDK que por lo general se encuentra en C:\Users\TUUsuario\AppData\Local\Android\android-sdk.
4-      En la misma opción Window de Eclipse configuramos nuestras versiones del SDK que utilizaremos y también los dispositivos virtuales con las opciones “Android SDK Manager” y “AVD Manager”.
5-      Listo tenemos lo necesario para iniciar el tutorial.

   Utilizando controles básicos aplicación “MiEdad”
   La finalidad como se mencionó al inicio es ejemplificar el uso de algunos controles básicos de android en este caso en una sencilla aplicación para el cálculo de la edad, algoritmo sencillo pero de gran utilidad para nuestro objetivo.
      A-) Iniciaremos creando un nuevo proyecto haciendo clic en File/New/Other y luego seleccionando la opción Android Aplication Project.



      En la siguiente opción seleccionamos el nombre de nuestra aplicación siempre con inicial mayúscula en este caso le llamaremos “MiAge” y seleccionare la API 2.2 de Android. Damos clic en next y luego pasaremos a definir el icono de nuestra aplicacion el cual podemos perfectamente crear uno personalizado, en nuestro caso utilizaremos el que viene por defecto.






      En las siguientes opciones pasaremos a configurar la actividad principal de nuestra aplicación en este caso también le dejaremos el nombre por defecto “MainActivity” pero perfectamente puedes renombrarle con el que desees, si creas nuevas actividades en el proyecto recuerda siempre agregarlas al Android Manifest para que no cause ningún conflicto en la aplicación.





      Listo ya tenemos nuestra aplicación creada, ahora procederemos a demostrar la utilización de los controles básicos de android como el TextView, el EditText y el Button, cabe aclarar que estos controles siempre se colocaran dentro de un Layout o como yo les digo “contenedor” existen diferentes layout el RelativeLayout, LinearLayout, TableLayout entre otros que probablemente mencionaremos en otro post.



      Eliminaremos el TextView que viene por defecto en nuestra aplicación ya sea desde el editor gráfico o desde el editor XML eliminando todo el código entre las etiquetas <TextView></TextView> junto con dichas etiquetas por supuesto, y luego desde la paleta de herramientas agregaremos:
-          2 TextView
-          2 Button
-          2 EditText (hay con características distintas en este caso elegiremos 1 numerico y uno de tipo First Name Last Name)


      Ahora renombraremos los controles esto lo haremos desde el archivo strings.xml que se encuentra en el directorio res/values de nuestro proyecto, es preferible renombrar los componentes desde acá porque las aplicaciones de calidad requieren múltiples lenguajes, de esta manera al guardar los valores tipo string en dicho archivo se volvería mucho más fácil traducir nuestra aplicación a distintos idiomas.



l     En el archivo activity_main.xml colocamos la referencia con @string/valor a cada uno de los controles que deseamos cambiar el nombre luego el aspecto de nuestra vista debería cambiar con los nuevos nombres por cada control modificado.

2   El método onCreate() es invocado cuando la actividad se inicia, allí crearemos los objetos necesarios a partir de las vistas pertenecientes a los controles básicos que utilizamos en este ejemplo, luego en el método sobrecargado OnClick de la clase anónima OnclickListener del método setOnClickListener del objeto perteneciente al botón “calcular” invocaremos el método que llamaremos Edad() que no es mas que un método que devuelve un objeto derivado de la clase AlertDialog que mostraremos mediante el método show() perteneciente al mismo.
La funcionalidad es sencilla simplemente restaremos el año actual (obtenido gracias a la clase Calendar) al año de nacimiento del usuario, pediremos como datos de entrada el nombre, apellido y año de nacimiento, mostrando la edad en una alerta.

A continuacion el codigo que debe ir en la clase MainActivity.java

package com.ejemplo.miage;
import java.util.Calendar;
import android.os.Bundle;
import android.app.Activity;
import android.app.AlertDialog;
import android.app.Dialog;
import android.content.DialogInterface;
import android.view.Menu;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.EditText;

public class MainActivity extends Activity {
EditText txt1;
EditText txt2;
Button botoncalc;
int anioactual;
@Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
       txt1=(EditText)findViewById(R.id.editText1);
         txt2=(EditText)findViewById(R.id.editText2);
       botoncalc=(Button)findViewById(R.id.button1);
       botoncalc.setOnClickListener(new OnClickListener() {
@Override
public void onClick(View arg0) {
// TODO Auto-generated method stub
  
   Edad().show();
}   
       });
    }
 private Dialog Edad()
 {
// anionac=Integer.parseInt(txt2.getText().toString());
// edad= anioactual-anionac;
Calendar fecha= Calendar.getInstance();
 
      anioactual=fecha.get(Calendar.YEAR);
 int anionac=Integer.parseInt(txt2.getText().toString()); 
  int edad= anioactual - anionac;
     AlertDialog.Builder mensaje = new AlertDialog.Builder(this);
      mensaje.setTitle("Estimado "+txt1.getText());
     mensaje.setMessage("Su edad es: "+edad);
    mensaje.setPositiveButton("OK", new DialogInterface.OnClickListener() {
      public void onClick(DialogInterface dialog, int which) {
         // here you can add functions
      dialog.cancel();
      }
    });
    mensaje.setIcon(R.drawable.ic_launcher);
     return mensaje.create();
 }
    
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        getMenuInflater().inflate(R.menu.activity_main, menu);
        return true;
    }
}

3- Ahora procederemos a probar nuestra aplicación en el emulador

4- Y por fortuna hemos finalizado este ejemplo, esperando halla sido de gran ayuda para quienes quieran comenzar a descubrir el mundo del desarrollo de aplicaciones para dispositivos android