sábado, 17 de marzo de 2018

Aprendamos Vue desde cero hasta un SPA | Instalación y nuestro primer hola mundo



Hola amigos en esta ocasión vamos a realizar la instalación de vue y luego nuestro clásico Hola mundo.

1. INSTALACIÓN

Vue es un framework que tiene varias maneras de ser instalado:

  • CDN
  • NPM
  • CLI

A TRAVÉS DE CDN

Basta con linkear la libreria de vue en su plantilla HTML:
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>VueJS Example</title>
</head>
<body>
    <script src="https://cdn.jsdelivr.net/npm/vue@2.5.16/dist/vue.js"></script>
</body>

A TRAVÉS DE NPM


Recuerdan que en el capitulo anterior instalamos nodejs con la finalidad de usar npm, bueno aquí lo usaremos por primera vez:
mkdir vue &&
cd vue &&
npm init &&
npm install vue

VUE CLI

Vue.js proporciona un CLI oficial para gestionar la creacion de SPA el cual nos provee muchas herramientas pero en esta ocasión evitare hablar de este debido a que más adelante le dedicare una publicación entera, cuando realice esa publicación actualizare esta sección.

2.NUESTRO PRIMER HOLA MUNDO



Bueno para la realización de nuestro primer hola mundo usaremos nuestra plantilla html con vuejs incrustado en este y usaremos las etiquetas <script> </script> para crear nuestra primera instancia de un objeto de vue:

Como podemos observar hemos creado un objeto vue el cual esta formado por un json (key:value) este objeto entre sus elementos podemos listar:

  • el:  Nombre del elemento principal
  • data:  Define las propiedades de la clase
  • mounted: Grupo de instrucciones que se ejecutan automáticamente cuando se renderiza la vista
  • methods: Grupo de funciones disponibles para ejecutarse dentro de la vista.
  • computed: Funciones que alteran las propiedades de una clase.
No se preocupen si no entienden mucho esta parte más adelante lo harán ya que tocaremos a cada uno de ellos a través de ejemplos. Lo más importante aqui es entender que representa elemento "el" y el elemento "data" dentro del objeto vue.
Podemos observar en nuestro código anterior la existencia de un <div> </div> con el id "main" y si nos ponemos a analizar nuestro objeto vue, podemos observar que el elemento "el" tiene como valor a "main", esto quiere decir que todas las propiedades y metodos definidos en nuestro objeto vue solo funcionaran dentro de el div que tiene como id a main.
Analizando tambien podemos notar que tenemos una propiedad "saludo" el cual tiene por defecto el valor de "Hola mundo" y con la cual podremos trabajar en las vistas mediante la interpolación {{ }}

El resultado






Bueno amigos esto es todo por el momento y conmigo sera hasta la próxima oportunidad.

Aprendamos Vue desde cero hasta un SPA | Preparando nuestro entorno de desarrollo



Hola amigos ante todo un saludo y agradecerles por leer esta publicación, cabe recalcar que más que una publicación orientada a enseñarte temas de Vue, esta es una recomendación de mi parte para poder crear un pequeño entorno  de desarrollo que nos permita trabajar sin ningún inconveniente con este framework a futuro, sin mas palabreo comencemos.

Puntos a tratar:


  • Instalación de Nodejs
  • Complementos para Sublime Text
  • Complementos para Atom
  • Complementos para Visual Studio Code


1. Instalación de NodeJS

Node.js es un entorno de ejecución para JavaScript construido con el motor de JavaScript V8 de Chrome. Node.js usa un modelo de operaciones E/S sin bloqueo y orientado a eventos, que lo hace liviano y eficiente. El ecosistema de paquetes de Node.js, npm, es el ecosistema mas grande de librerías de código abierto en el mundo.
El objetivo de esta publicación no es profundizar en node sino en lo que usaremos para aprender Vue  y que tiene como nombre NPM. NPM es el administrador de paquetes para JavaScript y el registro de software más grande del mundo.
Este nos permitirá más adelante el uso de herramientas como VueCLI, VCG,Webpack, etc.

En Distribuciones Linux:
Nota: Los siguientes pasos los he probado en  Ubuntu y sus derivados así mismo  en Debian.
Abrimos la Terminal y ejecutamos:

curl -sL https://deb.nodesource.com/setup_8.x -o nodesource_setup.sh &&
sudo bash nodesource_setup.sh &&
sudo apt-get install nodejs &&
sudo apt-get install build-essential

En  Windows

Basta con ir al sitio oficial de Node y descargar la versión acorde a la arquitectura de tu S.O:


En mac:

Haremos uso de homebrew, el cual es un gestor de paquetes para Mac que nos simplifica la instalación de paquetes que no vienen incluídos en macOS cómo Git, Ruby, etc.
Abrimos la Terminal y ejecutamos:

brew update 
brew install node

2. Complementos recomendados para VUE

Como mencione en una publicación anterior ,Vue da soporte a typescript y ES6, a continuación les recomendare una serie de plugins y/o complementos que les serán de una gran utilidad al momento de estar codeando.

2.1 Complementos para Sublime Text


2.2 Complementos para Atom

Atom es un editor muy completo y no hay mucho que recomendar aquí mas que el complemento oficial de vue para este editor:



2.3 Complementos para Visual Studio Code 

Al igual que atom VSC es un editor muy completo, por lo que mi mejor recomendación es instalar el paquete oficial de Vue.

Espero les halla sido de utilidad, cabe recalcar que apartir de la próxima publicación ya nos meteremos de lleno a estudiar Vue. Conmigo sera hasta la próxima publicación

Aprendamos Vue desde cero hasta un SPA | Introducción



Si estas metido en el mundo del desarrollo web seguramente has escuchado hablar de este grandioso framework. Estos últimos meses he estado trabajando muchísimo con vue por lo que he decidido aperturar una sección especifica para hablar un poco acerca de este, espero que lo disfruten al igual que yo lo haré.


¿Que es Vue?

Vue es la nueva herramienta JavaScript creada por Evan You, definido como un framework progresivo para construir interfaces de usuario. A diferencia de otros frameworks monolíticos, Vue está diseñado desde el inicio para ser adoptado incrementalmente. La biblioteca principal se enfoca solo en la capa de la vista, y es muy simple de utilizar e integrar con otros proyectos o bibliotecas existentes. Por otro lado, Vue también es perfectamente capaz de soportar aplicaciones sofisticadas de una sola página (en inglés single-page-application o SPA) cuando se utiliza en combinación con herramientas modernas y librerías compatibles.
Vue se está abriendo hueco en el mercado de los framework para JavaScript y está siendo muy utilizado por las empresas de desarrollo. Es uno de los frameworks más populares para desarrollar aplicaciones modernas y escalables en el lado del cliente. Si quieres ser desarrollador front-end o full-stack, o incluso si ya te dedicas al desarrollo web, es muy interesante aprender Vue.

Número de estrellas recibidas por parte de la comunidad de Github en cada uno de los repositorios oficiales de cada proyecto Angular, React & Vue 


Número de descargas a través de NPM


CARACTERÍSTICAS (Fuente: Web Oficial)

  • Proporciona componentes visuales de forma reactiva
  • Cuenta con conceptos de directivas, filtros y componentes bien diferenciados
  • Utiliza Virtual DOM
  • Externaliza el ruteo y la gestión de estado en otras librerías
  • Permite focalizar CSS para un componente específico
  • Cuenta con un sistema de efectos de transición y animación
  • Sigue un flujo one-way data-binding para la comunicación entre componentes
  • Sigue un flujo doble-way data-binding para la comunicación de modelos dentro de un componente aislado
  • Tiene soporte para TypeScript
  • Tiene soporte para ES6
  • Permite renderizar las vistas en servidor

Me interesa pero ¿Como aprendo?

Lo que me gusto de este framework es la excelente documentación que posee y la rápida curva de aprendizaje.A partir de aquí estructurare las publicaciones posteriores de tal manera de que aprendan de manera rápida y clara a manejar este framework:

1. Preparando nuestro entorno de desarrollo

2. Las bases de Vue2
Instalación de VueJS y nuestro primer hola mundo
Two way data-binding y reactividad
Directivas condicionales
Directivas de iteración
Eventos
Propiedades computadas
Filtros
Binding de clases
Ajax y HTTP

3. Componentes
Que es un componente y cual es su ciclo de vida
Creando nuestro primer componente básico
Plantillas en linea y props
Componentes dentro de otros componentes
Componentes dinámicos


4. Desarrollando nuestro SPA

A. Introducción
 B. Componentes:
    • Vue CLI
    • Crear componentes con VueCLI
    • Vue Component Generate(VCG)
    • Crear componentes con VCG
    • Crear multiples componentes
C. Routing
    • ¿Que es el sistema de routing?
    • Configuración de rutas
    • Interceptores
    • Conceptos avanzados de vue-router
D. Backend
    • Explicando funcionamiento de nuestra api rest desarrollado en laravel

      E. Fronted
    • Descripción de vistas realizadas para el desarrollo del SPA
F. Programando SPA
    • Página listado de peliculas
    • Mostrar datos de pelicula
    • CRUD peliculas
G. SPA en producción
5. VUEX
  • Introducción
  • Estados y getters
  • Mutaciones y acciones
  • Módulos

6. Temas avanzados
  • Como crear un plugin
  • Animaciones
  • Sockets
Espero que les sea de mucha utilidad las publicaciones posteriores y conmigo sera hasta la próxima publicación




domingo, 25 de febrero de 2018

Despliegue de un proyecto de laravel en un servidor Apache y Ubuntu






Hola amigos en esta ocasión regreso con una pequeña guía pero a la vez muy útil. Crearemos un proyecto en laravel y realizaremos su despliegue sobre un sistema operativo ubuntu server , cabe recalcar que esta guia sirve de manera genérica en cualquier distribución linux que tenga como servidor web apache. Comencemos:

1. Creamos un proyecto laravel:

cd /var/www/html
sudo composer create-project laravel/laravel your-project --prefer-dist

2. Configurando Apache:

2.1. Asignano Permisos:
sudo chgrp -R www-data /var/www/html/your-project
sudo chmod -R 775 /var/www/html/your-project/storage

2.2. Creando virtual host
2.2.1 Creando laravel.conf:
cd /etc/apache2/sites-available
sudo nano laravel.conf

2.2.2 Configurando laravel.conf:

<VirtualHost *:80>
    ServerName yourdomain.tld
    ServerAdmin webmaster@localhost
    DocumentRoot /var/www/html/your-project/public
    <Directory /var/www/html/your-project>
        AllowOverride All
    </Directory>
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>


Donde:

  • En donde yourdomain.tld debe ser reemplazado por tu dominio asignado para tu proyecto.
  • DocumentRoot: La ubicación donde se encuentra tu proyecto.
2.2.3 Activando laravel.conf

sudo a2ensite laravel.conf
sudo a2enmod rewrite
sudo service apache2 restart

3. Configurando proyecto de laravel
Como recomendación personal les sugiero que realicen esta parte cuando su proyecto ya este listo para ir a producción ya que se modificara la estructura interna de este y dejara de funcionar el comando php artisan serve.

3.1. Cambiando la ubicación de los archivos public y configurando el archivo index.php

En este instante procedemos a mover todo el contenido de nuestra carpeta public a la raiz de nuestro proyecto laravel asi mismo procederemos a editar el archivo index.php. Buscaremos las siguientes lineas:




y la modificaremos de tal manera que quede así:



3.2 Configurando AppServiceProvider

Como paso final configuraremos el archivo AppServiceProvider.php que esta ubicado en

/var/www/html/your-project/app/Providers


Básicamente lo que haremos sera agregar lo siguiente a la función regsister:


        $this->app->bind('path.public',function(){
                return base_path().'/';
            }
        );

Con esto obtendremos lo siguiente :



Observación: el comando php artisan serve nos permite crear un servidor interno el cual corre por defecto en el puerto 8000,los pasos realizados anteriormente tienen como objetivo dejar de usar el servidor que artisan nos provee y usemos apache.

Espero les sea de mucha utilidad y conmigo sera hasta la próxima oportunidad.

sábado, 16 de diciembre de 2017

Instalación de Ionic




Hola amigos en esta ocasión les enseñare como instalar Ionic, asi mismo realizaremos nuestro primer hola mundo.

Requerimientos previos para la instalación de Ionic

Tener instalada la ultima versión estable de Nodejs:


  • Si vienes de sistemas operativos Windows y Mac basta con ir a la pagina oficial de Node y descargar el instalador acorde a su sistema operativo y seguir los pasos que este les indica.
  • Si vienes de entornos linux basta con ejecutar los siguientes comandos:
curl -sL https://deb.nodesource.com/setup_8.x -o nodesource_setup.sh &&
sudo bash nodesource_setup.sh &&
sudo apt-get install nodejs &&
sudo apt-get install build-essential

Tener instalado Angular

Para instalar angular solo basta con ejecutar el siguiente comando en su terminal de sistema:
npm install -g @angular/cli

Instalación de Ionic

Para instalar Ionic basta con ejecutar el siguiente comando en su terminal:
npm install -g cordova ionic

Con esto ya tendríamos instalado Ionic en nuestro sistema operativo y estaríamos listo para crear nuestras aplicaciones.

¿Aplicaciones híbridas?¿ Ionic Framework? | Introducción




Martin Cooper(creador del primer dispositivo celular) una vez dijo "Junto a mi equipo de hecho, bromeábamos diciendo que en el futuro cuando alguien naciera se le asignaría un número de celular y, si no contestabas, estabas muerto".Si bien esto aun no se cumple, me refiero a la accesibilidad a estos,podemos afirmar que pasado 44 años desde su presentación la más de la mitad de la población mundial tiene acceso a uno y si nos ponemos analizar números, la cantidad de teléfonos móviles ha superado al número de personas en el mundo.

En la actualidad estamos disfrutando de una nueva generación de los llamados teléfonos inteligentes han revolucionado la industria de los celulares y ha cambiado completamente la forma en que las personas utilizan la telefonía. Ahora un teléfono móvil , smartphone  o como desees llamarlo no solo nos sirve para comunicarnos, podemos ver películas escuchar música , leer libros , etc. Este conjunto de nuevos usos a traído consigo un aumento en la aparición de aplicaciones destinadas a esto y al mismo tiempo a incentivado a la evolución de las formas de desarrollo de estas, años a tras si deseabamos desarrollar una determinada aplicación para un determinado dispositivo teníamos que aprender un determinado lenguaje de programación o dominar un determinado sdk pero esto con el paso de los años ha cambiado y esto se debe a la aparición y evolución de lo que hoy se conoce como aplicaciones híbridas.



¿Aplicaciones híbridas?

Una aplicación híbrida es aquella que permite desarrollar apps para móviles en base a las tecnologías web: HTML + CSS + Javascript. Son como cualquier otra aplicación de las que puedes instalar a través de las tiendas de aplicaciones para cada sistema, por lo que en principio usuarios finales no percibirán la diferencia con respecto a otros tipos de aproximaciones diferentes, como las aplicaciones nativas.



Las aplicaciones híbridas son interesantes por diversos motivos:

  • Con una misma base de código serán capaces de compilar apps para funcionar correctamente en una gran cantidad de sistemas operativos de móviles o tablets. Generalmente nos será suficiente que nuestra app funcione en iOS y Android,Windows Phone.
  • El coste del desarrollo es sensiblemente menor, ya que no es necesario contar con varios equipos de desarrollo para cada lenguaje concreto de cada plataforma.
  • El tiempo de desarrollo también es menor, ya que solo es necesario construir la aplicación una vez e inmediatamente la tendremos en todas las plataformas a las que nos dirigimos.
  • Es de más fácil adaptación para los desarrolladores que vienen de la web.



¿Las aplicaciones híbridas tienen un pésimo rendimiento? ¿Híbrida o nativa? ¿Cual elegir?

Esta es la lucha de nunca acabar y esto tiene sus orígenes en las primeras versiones de aplicaciones híbridas desarrolladas por ahí en el año 2011 con phonegap, las cuales si tenían problemas graves de rendimiento,  pero esto ha cambiado mucho debido a que estas tecnologías han madurado y evolucionado bastante, no por algo empresas gigantes como lo son Facebook, Instagram, Airbnb, Uber han optado por realizar aplicaciones híbridas para sus plataformas.
Les comparto unos enlaces muy interesantes en donde se abarca este item, les recomiendo que los vean seguramente les resultara muy interesante:


¿Que es Ionic framework?

Ionic es un framework javascript open source con licencia MIT. Según sus creadores siempre será de uso gratuito y es impulsado por una gran comunidad.


Ionic es un "framework" que nos permite crear aplicaciones en formato nativo, pero desarrolladas desde HTML5,JS(Angular) y CSS(Sass).



La idea básica es que yo voy a poder programar con "javascript", voy a poder utilizar HTML y CSS, y una vez que he terminado con ello podré compilarlo, y lo compilaré como aplicaciones nativas para Android, IOS  o incluso para Windows phone. Esto es verdaderamente interesante porque así con un solo proyecto, yo puedo crear aplicaciones que sirvan para estas tres plataformas en vez de tener que desarrollar para cada una de las plataformas de manera independiente. En realidad, el uso de Ionic va más allá de simplemente utilizar HTML, CSS "javascript". 
Ionic tiene como herramienta base a Cordova , el cual le permite crear la comunicación entre el HTML5 y el dispositivo móvil, osea que hace de puente entre el sistema operativo y lo que nosotros vamos a programar como HTML5. Se va a ver traducido en que, por un lado, nos va a permitir instalar "plugins", que son los que se comunicarán con las diferentes opciones del sistema operativo, y por otro lado también porque va a ser el que nos permita hacer experimentos, hacer pruebas y compilar la aplicación para luego poderla ver tanto en emuladores como en dispositivos móviles, y por supuesto, también para crear la versión final.




Espero les halla resultado interesante esta pequeña publicación y conmigo sera hasta la próxima ocasión.


viernes, 15 de diciembre de 2017

Comentarios,Variables,Constantes y Tipo de datos | Golang




Hola amigos continuando con nuestra serie de publicaciones referentes a Golang, en esta ocasión nos toca hablar acerca de las variables ,constantes y uso de comentarios, si vienes de lenguajes como c/c++ esta sección te será muy fácil de comprender ya que la sintaxis es similar.


USO DE COMENTARIOS

Los comentarios son exactamente los mismos que en C++. Para obtener un comentario de una línea, utilizamos la combinación de caracteres //, mientras que para un comentario de varias líneas, se usa la combinación /* */.

//Esto es un comentario
/*Esto es
un comentario*/

En Golang los comentarios de varias líneas, no admiten anidamiento, así pues, el siguiente comentario sería erróneo:  


/*Esto es un
comentario
*/

VARIABLES

Una variable es un espacio de memoria reservado para almacenar un valor que corresponde a un tipo de dato


CARACTERÍSTICAS DE UNA VARIABLE

  • Los tipos de datos son estáticos, es decir que una variable no puede cambiar su tipo de dato durante su ciclo de vida.
  • Los valores iniciales, de las variables a las cuales no se les ha asignado ningún valor, son asignados a su valor "zero". Es decir: Los tipos numéricos inician en 0, los tipos string inician en vacio “”, los tipos boolean inician en falso, los campos de los tipos struct inician en su valor “zero”, los demás tipos inician en nil (nulo).
  • Los identificadores de cualquier variable en un programa escrito en Go, deben de ser alfanuméricos, incluyendo el carácter " _ ", teniendo en cuenta que las letras y números deben ser  aquellas definidas por Unicode.  
  • El famoso " ; " al final de cada sentencia es opcional, pueden colocarse  aunque deberían no ponerse. Únicamente son obligatorios a la hora de separar los elementos en la cláusula de un bucle for o elementos en un if .


DECLARACIÓN DE UNA VARIABLE

La sintaxis de Go es muy similar a la sintaxis utilizada en C/C++. A la hora de declarar una variable o un tipo, se realiza de la misma forma que en C/C++, únicamente que se invierte el orden del nombre de la variable y el tipo, quedando este ultimo al final. Además, hay que añadir una  palabra reservada al principio de las declaraciones. 

var a int // a es un entero
var b, c *int // b y c son punteros a enteros
var d []int // d es un array de enteros
type S struct { a, b int } // S es una estructura con dos atributos enteros, a y b.

Otra forma de declarar una variable es seguir la siguiente sintaxis:

nombre := expresión

Si usamos esta manera de declaración de variables debemos tener en cuenta lo siguiente: 

  • Solo funciona con variables locales, es decir, variables declaradas dentro de una función.
  • El compilador analiza la expresión y le asigna el tipo de dato adecuado a la variable que se está declarando.
  • Hay que tener en cuenta que se pueden asignar valores a diferentes variables en una sola línea de código.
nombre:="Making Code"
nombre1, nombre2, nombre3 := 10, "Hola", true//nombre1=10,nombre2="hola",nombre3=true

Dado que puede ser bastante tedioso estar escribiendo todo el rato la palabra reservada var, Go posee una característica muy interesante, que permite definir varias variables agrupadas por paréntesis, y separándolas por puntos y coma:



var (
i int;
j = 365.245;
k int = 0;
l, k uint64 = 1, 2;
inter, floater, stringer = 1, 2.0, "Hola"
)

CONSTANTES

Las declaraciones de constantes están precedidas por la palabra reservada const.
Todas las constantes son inicializadas en tiempo de compilación, lo que significa que todas las declaraciones de constantes deben ser inicializadas con una expresión constante. Además, de forma opcional, pueden tener un tipo especificado de forma explícita.
  



const Pi = 22./7.
const AccuratePi float64 = 355./113
const pepe, dos, comida = "Pepe", 2, "carne"
const (
Lunes, Martes, Miercoles = 1, 2, 3;
Jueves, Viernes, Sabado = 4, 5, 6
)

TIPO DE DATOS

Go posee únicamente tres tipos básicos: Números, Booleanos y Cadenas de caracteres. ´

Números: Existen tres tipos numéricos: Enteros, enteros sin signo y números flotantes. Cada uno de estos tipos tiene asociadas una serie de variantes dependiendo del numero de  bits en el que sea almacenado. 




Bool: El tipo bool define el tipo booleano usual, con dos constantes predefinidas que son: true y false.
Hay que tener en cuenta, que a diferencia de otros lenguajes, en Go los 
punteros y los enteros no son booleanos.

String: El tipo string representa arrays invariables de bytes, o lo que es lo mismo, texto. Los strings están delimitados por su longitud, no por un carácter nulo como suele ocurrir en la mayoría de lenguajes. 

Bueno amigos espero les sea de utilidad esta publicación.Gracias por visitar este su blog y hasta la siguiente publicación

Aprendamos Ionic sin morir en el intento


Hola amigos, en esta ocasión he decido aperturar una sección en el blog donde comenzare a realizar publicaciones acerca de este grandioso framework javascript con el cual ya llevo trabajando alrededor de 1 año, comenzare con temas introductorios al framework y luego a través del desarrollo de miniapps ire explicando el uso de los diferentes componentes que ionic nos brinda para el desarrollo de aplicaciones híbridas(Android/IOS).

Temas a tratar:

  • ¿Aplicaciones híbridas?¿ Ionic Framework? | Introducción
  • Instalación de Ionic
  • Nuestro primer hola mundo y análisis de la estructura básica de un proyecto en Ionic.
  • Que es ionic view
  • Probando la aplicación en un dispositivo - Developer Mode
  • Creación de nuestra agenda telefónica.
  • Creación de nuestro lector de código de barras.
  • Creación de nuestro mini instagram
  • Creación de nuestro buscador de bares

Nota: Los temas a tratar irán en constante actualización, la idea es ir experimentando con todos los componentes que ionic nos provee así como la interacción con los recursos nativos de nuestros dispositivos.

Esperando que las posteriores publicaciones sean de su agrado me despido.
Gracias por su visita.

Mi primer hola mundo - ¿Como se estructura un programa en Golang?


Hola amigos en esta ocasión vengo con una publicación corta pero esencial en la cual realizaremos nuestro primer hola mundo, si ese hermoso hola mundo el cual varios de nosotros lo hemos hecho cuando estamos aprendiendo un nuevo lenguaje de programación , ese hola mundo que nos hace sentir un crack en la programación. Así mismo procederemos analizar el código realizado con la finalidad de identificar las diferentes áreas que conforman un programa en Go y dar algunas recomendaciones, listo?, manos a la obra.

Mi Primer Hola Mundo



package main

import (
 "fmt"
)

func main() {
 fmt.Println("Hola mundo")
}


Analizando nuestro primer programa en Go



Todos los scripts y/o archivos que forman a una aplicación realizada en Golang deben de pertenecer a un paquete(package):
package main

Golang al igual que otros lenguajes de programación ya tiene por defecto varias funcionalidades implementadas las cuales son agrupadas en paquetes que el mismo Golang trae por defecto. Cuando nuestro programa necesita usar una funcionalidad implementada en un paquete externo al que se esta trabajando, como por ejemplo el fmt, usamos la instrucción import.
import  "fmt"
Si necesitáramos importar más de un paquete colocaríamos el nombre de cada uno de ellos rodeados con comillas dobles:
import (
 "fmt"
 "log"
 "net/http"
) 
Función principal (main), en Golang al igual que en otros lenguajes de programación disponen de una clase principal que posee un método que se encarga de ejecutar la aplicación en general, en el caso de Golang no existen clases sino archivos o scripts, y el encargado de ejecutar la aplicación en general sera aquella que tenga a la función main en su interior.

func main() {
 fmt.Println("Hola mundo")
}


Nota: Las funciones en golang se definen con la palabra reservada func, seguido del nombre de la función y paréntesis(cuando lleguemos a la clase respectiva profundizaremos más en este tema).

Como anteriormente se menciono Golang al igual que otros lenguajes de programación trae consigo muchas librerías y/o paquetes ya por defecto que nos facilitan la vida al momento de programar,cada paquete puede tener todas las funciones que necesitemos, en nuestro ejemplo importamos el paquete  fmt del cual usaremos la función Println que nos permite imprimir un mensaje en pantalla.


 fmt.Println("Hola mundo")


Bueno espero que les halla servido en algo esta publicación, se que no hemos tocado cosas grandiosas pero creo que es necesaria para comprender como es que golang funciona, gracias por tomarse unos minutos y leerla.Hasta la próxima publicación.

lunes, 11 de diciembre de 2017

Instalación de Go


Hola amigos en esta ocasión les vengo a explicar las maneras de instalación de Golang por motivos de alcance les explicare como realizarlo en Windows y distros linux, omito sistemas Mac porque no dispongo de una, manos a la obra.

Instalación de Golang en windows

Vamos a la pagina oficial de Go en la sección descarga y bajamos el instalador correspondiente a windows:




Una vez bajado el instalador procederemos a realizar la instalación para ello solo sigue las instrucciones de este:




Una vez instalado nos toca verificar si tenemos registrado en nuestras variables de entornos del sistema , para ello ingresamos a propiedades del sistema:


Estando en nuestra ventana de propiedades del sistema seleccionamos la opción Configuración Avanzada del Sistema:


Seleccionamos la opción variables de entorno:



Una vez abierta esta ventana procederemos a verificar en las variables de entorno con referecia Path la existencia de la ruta de Golang  C:\Go\bin , en el caso de que no exista procederemos a crearla: 



Instalación de Golang en Linux

La instalación de Golang es mucha mas sencilla en las distribuciones linux debido muchas de las distribuciones mas usadas ya tienen por defecto en sus repositorios a Go:

En Ubuntu:

sudo apt-get install golang-go

Si esta trabajando con una versión antigua de ubuntu que no tenga en sus repositorios a Golang basta con ejecutar los siguientes comandos:
sudo add-apt-repository ppa:gophers/archive
sudo apt update
sudo apt-get install golang-1.9-go
En Debian y demás distros de linux:

Primero actualizaremos nuestro sistema:

sudo apt-get update 
sudo apt-get -y upgrade
Procedemos a descargar Golang desde sus servidor oficial

  wget https://storage.googleapis.com/golang/go1.9.2.linux-amd64.tar.gz

Una vez descargado extraemos los archivos y movemos estos archivos a la carpeta /usr/local

sudo tar -xvf go1.9.2.linux-amd64.tar.gz
sudo mv go /usr/local

Ahora procederemos a instalar las variables de entorno , para ello es necesario saber que Go cuenta con 3 tipos de variables de entorno:

  • GOROOT: Que es la variable de entorno que nos indica la ubicación de la carpeta donde fue instalado Go.

export GOROOT=/usr/local/go

  • GOPATH: Que es la variable de entorno que indica a Go que indicara al sistema donde esta la ubicación del directorio de trabajo. Por ejemplo, mi directorio de proyecto es ~/Projects/Proj1 .export 

GOPATH=$HOME/Projects/Proj1

  • PATH: Variable de entorno que indica al sistema donde se encuentran los binarios de Go:

export PATH=$GOPATH/bin:$GOROOT/bin:$PATH

Bueno espero que les halla servidor y hasta la próxima publicación

Introducción a Golang




Go es un lenguaje de programación creado por Robert Griesemer, Rob Pike, y Ken Thompson. Es un proyecto open source desarrollado inicialmente en Google y Google sigue siendo en la actualidad su principal impulsor y contribuidor.
Go es un lenguaje moderno, por lo que une de lo mejor de muchos lenguajes. Combina una sintaxis parecida a C con las características y facilidad de lenguajes dinámicos como Python. Lenguajes como C++, Java o C# son más pesado o voluminosos.


Características de Go

Los creadores de Go inspirados en la versatilidad y las características de otros lenguajes como Python, C++ y Java (entre otros), se propusieron en desarrollar un lenguaje que tuviera lo mejor de estos y así nació Go, lenguaje que tiene las siguientes características, algunas únicas, y otras compartidas con otros lenguajes compilados:


  • Compilado: No necesitas instalar ningún programa para que el programa que desarrolles funcione en el sistema operativo para el que lo compilaste. Basta con escribir en tu consola de tu sistema operativo el comando go run nombre_del_archivo.go  y listo se generara un ejecutable para tu sistema operativo.
  • Estáticamente Tipado: Lo cual nos permitirá tener el control de la interacción entre datos y el programa, desde la redacción de código fuente, que además se traduce en el código objeto directamente, y los errores relacionados con el tipo se identifican más fácilmente.
  • Concurrente: Está inspirado en CSP. Todo ello se cimienta en una excelente implementación de la concurrencia que permite de forma sencilla y potente, crear software preparado “para la vida moderna”. Una de las principales características de Go es incluir dentro del propio lenguaje funciones primitivas para la concurrencia.
  • Uso poco usual de POO: Go no usa clases, no usa herencia y el uso de interfaces se realiza de manera implícita. Esto con el fin de mejorar el rendimiento al momento de diseñar tu software.
  • Uso de paquetes: Se usan los paquetes para organizar el código. Un paquete puede tener varios archivos “.go” que permiten definir lo que va a realizar el paquete. Para usar un paquete en tu programa, debes importarlo.

¿Porque debemos aprender Go?



Algo que mucho escuche en la universidad fue "El lenguaje de programación no te elige tu lo eliges dependiendo al problema que se te presenta", y es verdad, hay muchísimos lenguajes de programación en la actualidad y cada uno de ellos se adapta a nuestras necesidades pero aquí nace una pregunta ¿Porque Google decidió crear su propio lenguaje de programación existiendo ya lenguajes como C,C++,Python,Java,etc ?. Uno de los creadores de Go, Rob Pike, nos explica el asunto: El punto clave aquí es que nuestros programadores son Googlers, no son investigadores. Son típicamente jóvenes, frescos de la universidad, probablemente aprendieron Java, quizás C o C++, probablemente aprendieron Python. No son capaces de entender un lenguaje brillante pero queremos que los usen para construir buen software. Así que, el lenguaje que queremos que usen tiene que ser sencillo para ellos de entender y adoptar.Querían construir un buen lenguaje, pero simple, que permitiera a la gente construir cosas.
Ahí esta la magia de Go en su simplicidad, potencia y curva de aprendizaje.
Aquí les comparto un articulo que encontré donde detallan los pros y los contras de Go en frente a otros lenguajes, vallan a verlos seguro les gustara.
Espero les halla gustado esta pequeña publicación y hasta pronto.



domingo, 10 de diciembre de 2017

Aprendamos Golang sin morir en el intento


Aprendamos Golang sin morir en el intento





Hola amigos hace un par de meses me puse como objetivo aprender este lenguaje de programación que en lo personal me parece un lenguaje muy potente y sobre todo fácil de aprender. En este ultimo año estoy muy involucrado en el desarrollo de Api Rest por lo que mi objetivo es aprender las bases del lenguaje que me permitan la construcción de un API REST y posteriormente meterme a temas mas complejos referentes al lenguaje propiamente dicho.

Temario:


Espero que les sea de mucha utilidad mis posteriores publicaciones cualquier duda o sugerencia no duden en comunicarse con mi persona y desde ya gracias por seguir este pequeño minicurso.

martes, 7 de noviembre de 2017

Android Asynchronous HTTP Client (LOOPJ)

Hola amigos  en esta ocasión vengo a compartirles  una poderosa herramienta que resulta demasiada útil cuando queremos desarrollar una aplicación que va consumir recursos de un webservice.




Android Asynchronous Http Client



Es una librería para Android construido sobre bibliotecas HttpClient de Apache. Todas las solicitudes se realizan fuera del hilo principal de la interfaz de usuario de la aplicación, pero cualquier lógica de devolución de llamada se ejecutará en el mismo subproceso que la devolución de llamada se creó mediante el paso del mensaje del controlador de Android.

Caracteristicas

  • Hace uso de HttpClient 4.3.6 en lugar del clásico DefaultHttpClient
  • Es compatible con el API 23 hacia adelante
  • Realizar solicitudes HTTP asíncronas.
  • Gestiona respuestas en devoluciones de llamada anónimas.
  • Las peticiones HTTP ocurren fuera del subproceso de la interfaz de usuario.
  • Las solicitudes utilizan un subproceso para limitar el uso concurrente de recursos.
  • GET / POST constructor de params (RequestParams).
  • Subidas de archivos multipart sin bibliotecas adicionales de terceros
  • Cargas de JSON en streaming sin bibliotecas adicionales
  • Manejo de redirecciones circulares y relativas
  • Tamaño de la cabecera a su aplicación, sólo 90kb para todo
  • Reintentos automáticos de solicitudes inteligentes optimizados para conexiones móviles irregulares
  • Compatibilidad con decodificación de respuesta gzip automática para peticiones súper rápidas
  • Comunicación de protocolo binario con BinaryHttpResponseHandler
  • Respuesta integrada de análisis en JSON con JsonHttpResponseHandler
  • Guardar la respuesta directamente en el archivo con FileAsyncHttpResponseHandler
  • Tienda de galletas persistente, guarda cookies en las SharedPreferences de tu aplicación
  • Integración con Jackson JSON, Gson u otras bibliotecas de serialización JSON (de) con BaseJsonHttpResponseHandler
  • Compatibilidad con el analizador SAX con SaxAsyncHttpResponseHandler
  • Soporte para lenguajes y codificaciones de contenido, no sólo UTF-8

¿Como usarla?

Abrimos el fichero build-gradle dentro de la sección Gradle Scripts y agregamos la siguiente dependencia:

dependencies {
  compile 'com.loopj.android:android-async-http:1.4.9'
}


Habilitamos los permisos de internet:
    


Hecho esto solo nos falta importar la librería donde deseamos utilizarla:

import com.loopj.android.http.*;

Para consumir recursos de un API basta con instanciar la clase AsyncHttpClient:
private static AsyncHttpClient client = new AsyncHttpClient();

Para realizar una petición GET usaremos la siguiente sintaxis:
client.get("https://www.google.com", new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // called before request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
 }
});
Para realizar peticiones POST usaremos una sintaxis muy similar a la anterior solo agregaremos un parametro extra que nos permitira enviar información al momento de realizar nuestra petición.Para enviar datos basta con instanciar un objeto de la clase RequestParams y usar el metodo put para enviar el valor que desea enviar:
RequestParams params = new RequestParams();
params.put("key", "value");
params.put("more", "data");
Sintaxis Método POST:
client.post("https://www.google.com",params, new AsyncHttpResponseHandler() {

    @Override
    public void onStart() {
        // called before request is started
    }

    @Override
    public void onSuccess(int statusCode, Header[] headers, byte[] response) {
        // called when response HTTP status is "200 OK"
    }

    @Override
    public void onFailure(int statusCode, Header[] headers, byte[] errorResponse, Throwable e) {
        // called when response HTTP status is "4XX" (eg. 401, 403, 404)
    }

    @Override
    public void onRetry(int retryNo) {
        // called when request is retried
 }
});
Espero les sirva , la librería es demasiada útil y fácil de usar.Si desean conocer a mas profundidad esta libreria les recomiendo se pasen a revisar su documentación oficial.

domingo, 7 de agosto de 2016

Reconocimiento de Patrones mediante redes neuronales

RECONOCIMIENTO DE PATRONES MEDIANTE REDES NEURONALES

Hola amigos en esta ocasión les comparto una aplicación que se realizo en un curso de Inteligencia Artificial que estuve llevando en la universidad espero les sea de utilidad como es de costumbre comenzare con algo de teoría para luego compartir con ustedes el código fuente de la aplicación.

REDES NEURONALES

Una red neuronal artificial es un procesador distribuido en paralelo de forma masiva que tiene una tendencia natural para almacenar conocimiento de forma experimental y lo hace disponible para su uso.

SIMILITUD CON EL CEREBRO HUMANO:

  • El conocimiento es adquirido por la red a través de un proceso de aprendizaje.
  • Los pesos sinápticos o fuerza con que están interconectadas las neuronas se utilizan para almacenar la información.

En esta publicación se describirá una aplicación típica de las redes neuronales multicapa, concretamente el reconocimiento de patrones.

PERCEPTRÓN MULTINIVEL
Dentro de las redes neuronales, las que más utilizadas son las redes con múltiples capas que funcionan hacia delante. Esta red esta compuesta por un conjunto de nodos de entrada que componen la capa de entrada, un conjunto de una o más capas ocultas de neuronas y una capa de neuronas de salida. La señal de entrada se propaga hacia adelante desde la capa de entrada por la oculta hasta la salida; este tipo de configuración se conoce como MLP o "MultiLayer Perceptrons".


El hecho de que este tipo de red se aplique para resolver con éxito multitud de problemas se debe a la utilización del algoritmo de aprendizaje que actualmente está más extendido, el algoritmo o regla back propagation, el cual es una generalización de la regla LMS "Least Mean Square", por lo tanto también se basa en la corrección del error.
Básicamente el proceso back propagation consiste en dos pasadas a través de las diferentes capas de la red, una pasada hacia adelante y una pasada hacia atrás. En la pasada hacia adelante, se aplica en la capa de entrada un patrón o vector de entrada, este propaga su efecto a través de las diferentes capas y como consecuencia produce un vector de salida. 
Durante este proceso, los pesos sinápticos de la red son fijos y no se modifican. Durante la pasada hacia atrás en cambio, los pesos si se modifican de acuerdo con la regla de corrección del error. La señal de salida real se compara con la señal deseada y como resultado se obtiene una señal de error, que se propaga en dirección contraria a través de la red modificando los pesos, de forma que, al volver a pasar el vector de entrada hacia adelante, la respuesta obtenida se asemeje más a la salida deseada. Concretando, se puede decir que un perceptrón multicapa tiene tres características:

  • El modelo de cada neurona (figura 2) incluye una función no lineal. En este caso, a diferencia del perceptrón donde es la función escalón, y debido a la necesidad de que sea una función continua y derivable, es la función sigmoide, donde uk es la suma total de la actividad interna en la neurona k (la señal de entrada) e yk la salida que se produce en la neurona.




  • La red contiene una o más capas ocultas de neuronas que no forman parte ni de la entrada ni de la salida. Estas neuronas ocultas capacitan a la red para aprender progresivamente cualquier correspondencia entre la entrada y la salida y almacenar internamente esta información.
  • La red posee un gran número de conexiones, estas vienen determinadas por los pesos de la red. Un cambio en la conexión entre las neuronas equivale a un cambio en los pesos.
La combinación de estas características, hace que la habilidad de esta red para aprender a partir del entrenamiento sea muy potente, por ejemplo es capaz de resolver el problema de la OR-exclusiva a diferencia del perceptrón.

De todas formas, este comportamiento hace que sea difícil conocer a priori la respuesta de la red. Esto se debe a dos motivos, el comportamiento no lineal de las neuronas, las cuales están muy interconectadas, (lo que hace difícil un análisis teórico de la red) y la existencia de neuronas ocultas, que impide poder "ver" como se produce el aprendizaje y determinar cuales son las características que mejorarían el aprendizaje.

El desarrollo del algoritmo back propagation proporciona un método eficiente para entrenar este tipo de redes. Aunque no es capaz de resolver todos los problemas, se ha demostrado como el mejor de todos. Su importancia está en su capacidad de autoadaptar los pesos de las neuronas intermedias para aprender la relación que existe entre el conjunto de vectores o patrones de entrada y su correspondiente salida, y poder aplicar esa relación después del entrenamiento a nuevos vectores de entrada imperfectos o con ruido. Esta capacidad se conoce como generalización. La red debe encontrar una representación interna que le permita generar las salidas deseadas durante la etapa de entrenamiento, y posteriormente durante el funcionamiento ser capaz de generar salidas para entradas que no le fueron mostradas durante el aprendizaje pero que se asemejan a alguna de las que si le fueron mostradas.

EJEMPLO DE APLICACIÓN:

Para simular el funcionamiento de un perceptrón multinivel entrenado mediante el algoritmo back propagation, se plantea un sencillo problema de reconocimiento de óptico de caracteres. Su descripción es la siguiente:

Dado un panel de entrada compuesto por una matriz de 7x5 puntos, se consideran 12 clases diferentes donde se pretenden clasificar las muestras que se introducen. Los patrones que definen correctamente a cada una de las clases son los números del 0 al 9, el punto y el guión (figura 3).

Cuando a la entrada se presente una muestra distinta de los patrones correctos, el sistema presentará a su salida la información decodificada de la clase a la que pertenece la muestra, o bien, de la clase a la cual se aproxima más. En base a este planteamiento, la red neuronal dispone de 35 entradas que se corresponden con los puntos de la matriz numerados en la figura 4. El valor de cada entrada puede ser 0 si el punto es blanco y 1 si el punto es negro. Por otro lado, dispone de 12 salidas, una por cada clase. Cuando se introduzca una muestra a la entrada únicamente se activará la salida de la clase a la que pertenezca, permaneciendo las 11 restantes desactivadas con valores próximos a cero. Se considera que una salida está activada cuando su valor es próximo a la unidad.




RESULTADOS DE LA SIMULACIÓN:
Se realizo la implementación de una red neuronal en Java.En él se ha programado un perceptrón multinivel con 35 entradas y 12 salidas. También dispone de dos capas ocultas a las cuales se les puede modificar el número de sus neuronas. La red neuronal se ha entrenado con el algoritmo back propagation fijando el valor del momento en 0.8 y el factor de aprendizaje en 0.2. En este proceso únicamente se han usado doce muestras diferentes, es decir, los doce patrones sin ningún punto erróneo.
En la tabla I se muestran los resultados obtenidos para una red neuronal de tamaño 35-30-20-12. Se aprecia que tras el proceso de entrenamiento, el sistema responde de forma casi ideal cuando se introduce un patrón sin error.


IMPLEMENTACIÓN:






package digitos;
import javax.swing.JOptionPane;
public class digitos {

        int filas_entrada = 7;
        int col_entrada = 5;
        int neuronas_entrada = 35;
        int neuronas_oculta = 4;
        int neuronas_salida = 6;
        int i, j, k;
        int respuesta;
        int[][] patron = new int[5][7];
        double[][] pesos_entrada_oculta = {{1.658270037469468, -0.49277400626557, 0.8458827274104553, -2.648551432075224},
            {1.1603936240938337, -2.518757565059801, -0.21162501186454472, 0.4483509644280242},
            {0.9770989216075385, -1.1100683771308992, 0.5996520501870459, -1.5726273589648947},
            {-0.013373815758508401, -1.8088573544737623, -0.1806466969385013, 1.5619996308946966},
            {1.5477043440927314, -0.7451285620786131, 0.9078974238442922, -2.35721899617673},
            {1.6375625959682456, 0.05352515438526517, -1.7744239541344213, 1.4633986290892553},
            {-0.4895683338278625, 1.8177553658981087, 1.2455793786819767, -2.190482442936407},
            {-1.6471092496923165, 3.229636202454947, 1.2981497902378096, -0.7057775268591435},
            {-1.5667407635246655, -1.3245937353788448, 2.136912211349784, 0.006483361683210399},
            {-0.30620712895539964, -2.082257488430547, -0.7831144540926332, 2.860170068975273},
            {1.90730880729867, 1.786324022652642, -2.7987064218352016, -0.01985271542781151},
            {0.6073378720265543, 2.964084801890168, -0.8036519556281736, -0.11124911355434831},
            {0.8920664710707924, 1.2889968423497409, 1.4524992877441234, -4.5753301334234395},
            {0.5438102680069633, 2.732096021393861, -2.46484031199823, 1.077136757466367},
            {-0.5920084064677441, -2.0176453417628553, -0.8929972447944864, 2.9295974905024473},
            {-1.2273348838814682, 0.9665674119959388, -1.5098278165865484, 2.3855936692870223},
            {0.00303354357445883, 0.001581271588014359, 0.5078086841379089, -0.15023910421206893},
            {-0.2793511488473059, 1.4245803844405784, -0.8720662059686077, -0.5734228021484368},
            {-2.0275946046978293, -3.0777889662395226, 2.599080818031238, 1.6382349764441964},
            {1.7261757824595334, 1.8271668605813292, -2.6230163017984798, -0.023102087227872905},
            {-1.0400284786362686, 0.7483028076885504, -1.4201964658386028, 2.5893497462079242},
            {-1.2173094553360448, 1.0413190887119863, -1.3232448940438146, 2.7280471684208245},
            {-2.0889500107780266, 1.2113367713729557, 1.834844976337663, 0.48588965399759093},
            {-1.3959767352554984, 1.340974141434604, 0.4669554523335953, 0.8396877795787216},
            {0.5504882733683742, -0.007280194521717799, -1.049601349327548, 0.10628579988651637},
            {1.443454707114963, -1.1329167860893807, -1.202733639186253, -1.1206540048585907},
            {-0.4331284905557263, -1.5624137840495447, 1.116280151906849, 1.4607759610209936},
            {-0.5819930384824622, 1.758192614385909, 0.9171022839298032, -2.0753538337866986},
            {-1.3256304624056356, 1.044596834400223, 0.26717962626473013, 1.1753997160814336},
            {1.5797847092614183, -1.103413366841749, -1.1869484693704706, -1.0426817633297494},
            {-0.42533166857338317, -1.5201849827392802, 0.8863374072683927, 1.5286999085413167},
            {0.7681134972990639, -0.9328664559674184, 0.3210235342096992, -1.6081085875846808},
            {0.8656526958020259, -1.075079526248985, 0.4316305641408157, 1.4876790164633573},
            {-0.3418033974126609, 0.26137924890846875, 0.44588921383473606, -0.44772778571106026},
            {-0.5446034869269726, -1.7972802169693622, 1.143196716800601, 1.244775128422288}};
        
        
        double[][] pesos_oculta_salida = {{0.43621096542085136, -4.4770098664620495, -3.4380683245083805, 1.8296159164887345, -8.118120689656921, 5.695458556119513},
            {-1.027258581059679, 5.023126898792579, -7.757507526435068, -7.156764734520939, 4.478145059142636, 2.0603488963286387},
            {-8.390374693334456, 2.4451631927893267, 1.1247117391293466, 3.3697153535415416, -1.6716192668623555, -5.293714775954221},
            {5.151637910542471, -7.364970554525968, 4.923974784168798, -6.575339204075441, 4.552711228559867, -6.736958999045322}};
        
        
        
        double[] bias_entrada = {-0.4332161363101981,
            -0.5121521114762152,
            -0.39471528129652694,
            -0.5445351790184725,
            -0.4226637563836109,
            -0.5350195879964442,
            -0.3350043955733998,
            -0.38791367789336956,
            -0.3785593217087376,
            -0.5461130438610313,
            -0.554558738450257,
            -0.44288964426354815,
            -0.4380540832801621,
            -0.5350394221895475,
            -0.5580057611292775,
            -0.5560034483432901,
            -0.12912939908250873,
            -0.4139805211691567,
            -0.48481548633114296,
            -0.5388170156483836,
            -0.5565657646610173,
            -0.5633684138684646,
            -0.26352247776223936,
            -0.17951484914217863,
            -0.3253386781429675,
            -0.5422856630504476,
            -0.3859925425287016,
            -0.2926752007933522,
            -0.33661294128974667,
            -0.5351966380727077,
            -0.43172146451991633,
            -0.3614435550912756,
            -0.3009252579538338,
            0.13116124654486072,
            -0.42061848358615506,};
        double[] bias_oculta = {-0.5396208362695601,
            0.2293253598179893,
            0.9023280877608804,
            -0.5367884581404073};
        
        double[] bias_salida = {-1.3662965402953284,
            -2.7832950402557444,
            -1.5508290258166995,
            -0.47188562328444716,
            -4.298755314842922,
            -2.4180200713742552,};
        
        int[] entrada = new int[neuronas_entrada];
        double[] sumatoria_entrada = new double[neuronas_entrada];
        double[] sigmoidal_entrada = new double[neuronas_entrada];
        
        double[] oculta = new double[neuronas_oculta];
        double[] sumatoria_oculta = new double[neuronas_oculta];
        double[] sigmoidal_oculta = new double[neuronas_oculta];
        
        double[] salida = new double[neuronas_salida];
        double[] sumatoria_salida = new double[neuronas_salida];
        double[] sigmoidal_salida = new double[neuronas_salida];
        public digitos(int patrones[][])
        {
            this.patron=patrones;
        }
        public void reconocimiento()
        {
            //procesamiento de la capa de entrada
            //linealizar el patron de entrada
            for (i = 0; i  <  filas_entrada; i++) {
                for (j = 0; j  <  col_entrada; j++) {

                    entrada[i * col_entrada + j] = patron[i][j];
                }
            }

            //1.2 sumar la entrada con el bias y calcular sigmidal
            for (i = 0; i  <  neuronas_entrada; i++) {
                sumatoria_entrada[i] = entrada[i] + bias_entrada[i];
                sigmoidal_entrada[i] = 1 / (1 + Math.exp(-1 * sumatoria_entrada[i]));
            }
            //2. procesamiento de la capa oculta
            // 2.1 sumatoria de productos de entrada por peso
            for (j = 0; j  <  neuronas_oculta; j++) {
                oculta[j] = 0;
                for (i = 0; i  <  neuronas_entrada; i++) {
                    oculta[j] += sigmoidal_entrada[i] * pesos_entrada_oculta[i][j];
                }
            }
            //2.2 sumatoria mas bias y calculo de sigmoidal
            for (i = 0; i  <  neuronas_oculta; i++) {
                sumatoria_oculta[i] = oculta[i] + bias_oculta[i];
                sigmoidal_oculta[i] = 1 / (1 + Math.exp(-1 * sumatoria_oculta[i]));
            }

            //3. procesamiento de la capa salida
            //3.1 suamtoria de productos de salida x peso
            for (j = 0; j  <  neuronas_salida; j++) {
                salida[j] = 0;
                for (i = 0; i  <  neuronas_oculta; i++) {
                    salida[j] += sigmoidal_oculta[i] * pesos_oculta_salida[i][j];
                }
            }
            //3.2 sumatoria mas bias y calculo de sigmoidal
            for (i = 0; i  <  neuronas_salida; i++) {
                sumatoria_salida[i] = salida[i] + bias_salida[i];
                sigmoidal_salida[i] = 1 / (1 + Math.exp(-1 * sumatoria_salida[i]));
                System.out.println("Sigmoidal [" + i + "]- " + sigmoidal_salida[i]);
            }
            // 4.construyendo la interface de salida
            double mayor = -0.999;
            int neurona_activada = -1;
            for (i = 0; i  <  neuronas_salida; i++) {
                if (sigmoidal_salida[i]  >  mayor) {

                    mayor = sigmoidal_salida[i];
                    neurona_activada = i;
                }
            }
            if (mayor  >  0.80 ) { // heuristica para saber si el patron es coherente
                switch (neurona_activada) {
                    case 0:
                        respuesta=0;
                        System.out.println("RESPUESTA:"+respuesta);
                        break;
                    case 1:
                        respuesta=1;
                        System.out.println("RESPUESTA:"+respuesta);
                        break;
                    case 2:
                        respuesta=2;
                        System.out.println("RESPUESTA:"+respuesta);
                        break;
                    case 3:
                        respuesta=3;
                        System.out.println("RESPUESTA:"+respuesta);
                        break;
                    case 4:
                        respuesta=4;
                        System.out.println("RESPUESTA:"+respuesta);
                        break;
                    case 5:
                        respuesta=5;
                        System.out.println("RESPUESTA:"+respuesta);
                        break;

                }
            } else
            { 
                respuesta=-1;
                System.out.println("RESPUESTA:"+respuesta);
            }
        }
        public int getReconocimiento()
        {
            return respuesta;
        }

}


RESULTADOS OBTENIDOS EN LA IMPLEMENTACIÓN