lunes, 31 de mayo de 2010

Parámetros en Java

Últimamente en el trabajo he escuchado decir:
"Que pasa con Java, aqui estoy asignando el valor y en este método ya no esta el valor, haber no que muy muy Java me esta fallando" 
Y aunque no vi el código que señalaban, pensé que seguramente era por la manera en que implementaban el paso de los parámetros. Pero todos sabemos que Java sólo tiene UNA forma de pasar parámetros y esto es: Parámetros por valor.

Pero y ¿qué significa esto?..... veamos unos ejemplos.

public class ParametrosValor {

 public static void main(String [] args) {
  int numero=8;
  calculaNumero(numero);
  System.out.println(numero);
 }

 public static void calculaNumero(int num){
   num=10;
 }
}


Este ejemplo imprimirá "8". Y esto es porque la variable "num" es local y recibe una copia del valor de la variable numero que se envía como parámetro y el valor de la variable num nunca se modifica.

Ahora veremos el siguiente ejemplo:

public class ParametrosValor {

 public static void main(String [] args) {
  int[] arreglo = new int[1];
  arreglo[0] = 8;
  calculaNumero(arreglo);
  System.out.println(arreglo[0]);
 }

 public static void calculaNumero(int[] array) {
  array[0] = 10;
 }
}



Pero entonces lo que aquí imprime es un 10.  Lo que pasa en este ejemplo es que como estamos utilizando un arreglo y un arreglo es un objeto, las variables que apuntan a un objeto son sólo referencias a él. Entonces el método de calculaNumero  modifica el valor del objeto. Y es donde entran las confusiones porque Java no paso los parámetros por referencia. Al contrario, pasó el valor de la referencia.

Y si no me creen,  pruebenlo!! XD! Espero les sirva. Saludos

Coolaboración en otro Blog

Hace como 2 meses me invitaron a escribir en un blog de una Consultora Mexicana llamada SoulTech (Muchas felicidades por su 2do Aniversario!!!). Así es que decidí escribir de algo muy interesante como lo son las Redes neuronales. 

http://soultech.com.mx/blog/2010/04/08/redes-neuronales-por-silvia-diaz/

Espero les agrade la primera parte de esta serie de posts referente a las ANS y agradezco a SoulTech por darme esa oportunidad aunque no forme parte de su equipo. 

Muchas gracias!!!!!



Las computadoras actuales son máquinas de von Neumann; es decir,  máquinas de procesos donde se ejecutan en serie una secuencia de instrucciones, las cuales son almacenadas en memoria. Ese fue el objetivo de la invención de las computadoras, facilitarnos procesos donde implique cálculos o razonamiento lógico. Ya que aunque el ser humano los puede realizar, el tiempo invertido en ellos es mucho comparado a la velocidad que lo puede resolver una computadora. Esto hace que el resolver problemas complejos aritméticamente resulte hasta cierto punto sencillo de programar.¿Pero qué pasa al elaborar un sistema que tome decisiones a partir de experiencias previas y factores externos? ¿Cómo hacer para que el sistema aprenda?El realizar programas que impliquen cierta “inteligencia” y que vayan aprendiendo conforme recibe información y no sólo seguir ordenes secuenciales que se programaron antes de su ejecución, ha hecho que se lleven más de 50 años trabajando en la Inteligencia Artificial. Ya que en 1950, Shannon y Turing diseñaron los primeros programas que permiten que una computadora “razone”  y juegue ajedrez, ganándole hasta al campeón mundial de ajedrez.



Para poder resolver este tipo de problemas se han dado una serie de paradigmas de cómputo alternativos, como lo son las redes neuronales, algoritmos genéticos o la computación evolutiva, de las cuales las dos primeras quizás sean las más relevantes y utilizadas.
Hablar de redes neuronales artificiales (ANS- Artificial Neural Systems) implica conocer primero el funcionamiento de las redes neuronales biológicas, para así poder entender más fácilmente el paralelismo que existe entre ambas.



Una neurona es el componente básico del sistema nervioso, incluyendo al cerebro. Y son células que tienen tres partes importantes:
1.       Dendritas: Son el elemento receptor, son fibras que cargan de señales eléctricas al cuerpo de la célula.
2.       Soma: Realiza la suma de las señales eléctricas recibidas por las dendritas.
3.       Axón: Es una fibra larga que lleva la señal eléctrica del cuerpo de la célula hacia otras.
El punto de contacto entre el axón de una célula y la dendrita de otra se denomina sinapsis.






Una de las neuronas será  presináptica (la que envía las señales) y la otra postsinápticas (la que recibe las señales). En la figura 2 podemos observar la comunicación entre dos neuronas de manera química. La neurona presináptica libera unas sustancias químicas llamadas neurotransmisores y atraviesan el intervalo sináptico.Si la neurona receptora posee en las dendritas o en el soma canales sensibles a los neurotransmisores liberados, los fijarán, y como consecuencia permitirán el paso de determinados iones a través de la membrana. Así se crean pequeños excitadores (positivos) o inhibidores (negativos), por lo que la neurona se disparará a mayor frecuencia cuanto mayor sea el nivel de excitación. La intensidad de una sinapsis se mide a partir de los disparos y dependiendo de la escala es el aprendizaje que se tiene entre la red de neuronas.
Así en las neuronas artificiales se simulan las entradas asociadas a un peso (la fuerza de las cargas eléctricas de conexión que reciben las dendritas) y el elemento procesador (simulando el soma) multiplica cada entrada por su peso y suma los productos.   Para finalizar el proceso se pasa a la función de la transferencia para generar un resultado, éste se transmite por la vía de salida (sería como el axón). Y la sinapsis es el proceso de aprendizaje a partir de las salidas correctas. Esto lo veremos con más detalle en el siguiente tema, que será una introducción a los Sistemas Neuronales Artificiales (ANS) así como su clasificación y sus modelos.
















Pacman en Google

La semana pasada en el logo de Google apareció el juego de Pacman esto por su 30vo aniversario. Pero lo mejor es que no era una simple imagen, era el juego!!! El Universal declaró:

"El juego Google Pacman consumió un total de 4 millones 819 mil 352 horas hombre, lo que representó un total de 120 millones 483 mil 800 dólares en productividad".
Y es que millones de personas entran a Google para hacer alguna búsqueda desde su trabajo así muchos de nosotros nos distraimos y empezamos a jugar!!! Y saben que es lo mejor que se puede seguir jugando: http://www.google.com.mx/pacman/


De acuerdo con Rescue Time:
 "Los visitantes del buscador pasaron 48 segundos en total en el sitio, cifra muy superior al promedio de 11 segundos al día. Esto se multiplicó por los 503 millones 703 mil visitantes de ese día."
 Las cifras de la pérdida monetaria fueron calculadas a partir de que cada hora/hombre equivale a 25 dólares. Aunque no todas las horas son pagas igual.

Y además cabe destacar que si se da clic en "Insert Coin" pueden jugar dos personas al mismo tiempo: uno utiliza las flechas y la otra persona las teclas de W, A, S y D.

A divertirse!! pero no en el trabajo jajaja

domingo, 30 de mayo de 2010

Flex+Java+BlazeDS

Hace como tres meses inicie con este post pero por falta de tiempo no le pude dedicar lo necesario para que fuera publicado. La semana pasada (bueno de hace ya tiempo jaja) realice para parte de un proyecto la conexión de Flex con Java. Hacerlo es muy sencillo pero cuando eres nuevo y no conoces al respecto si te lleva algo de tiempo, porque por lo menos yo no encontré la información necesaria respecto a la implementación.

Flex
Es un framework desarrollado por Adobe, la cual te permite crear aplicaciones dinámicas de Internet (RIA's- Rich Internet Applications). Esto significa que es un patrón o un esqueleto para poder llevar acabo la implementación de una aplicación. Nos sirve mucho ya que con su uso es muy fácil de distinguir el modelo MVC (Modelo-Vista-Controlador). Flex cubrirá la parte de vista y controlador y Java manejará el modelo del negocio; es decir este último llevará toda la lógica y las operaciones internas necesarias. Mientras Flex sólo será la vista y mande a llamar eventos a partir de las acciones que realice el usuario.
¿Pero por qué Flex?... Adobe define a Flex como altamente productivo además de ser opensource, el cual sirve para poder construir y mantener aplicaciones web "expresivas" que pueden ser desplegadas en más navegadores, computadoras y SO. Esto gracias a que Flex utiliza Adobe Flash Player. Otra ventaja es que Flex utiliza AS y puede desarrollar interfaces gráficas, juegos y animaciones.

BlazeDS(binary distribution)



BlazeDS es sólo un puente entre Flex (capa de vista) y Java (capa de negocio). Es decir, tiene la funcionalidad de una interfaz.



Conexión
Antes que nada lo que debemos de tener instalado o descargado en nuestra computadora es:

  1. Flex Builder 3 (http://www.adobe.com/cfusion/entitlement/index.cfm?e=flex3email)
  2. Eclipse (http://www.eclipse.org/downloads/)
  3. BlazeDS-binary distribution (http://flexorg.wip3.adobe.com/blazeds/3.0.x/milestone/3978/blazeds-bin-3.2.0.3978.zip)
  4. JDK (http://java.sun.com/javase/downloads/widget/jdk6.jsp)
  5. Apache Tomcat (http://tomcat.apache.org/download-60.cgi)
Ahora si ya que tenemos todo es hora de configurar!!!


  • Abrir eclipse. Se debe de configurar el servidor Apache Tomcat en esta IDE. Esto es en el Window-> Preferences ->Server -> Installed Runtimes. Y ahi es donde añadimos el servidor de Tomcat

  • Ahora debemos de agregar las bibliotecas de BlazeDS. Para esto es: File -> Import -> Web -> WAR File. Además se debe de escribir el nombre del proyecto.

  • Después de esto solo se deben de realizar las clases en java que se necesiten en su proyecto. Y para que flex sepa que clases son el código fuente se debe de modificar el fichero remoting-config.xml.  Como se muestra a continuacion.

<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service" class="flex.messaging.services.RemotingService">
<adapters>

   <adapters-definition id="java-object" class="flex.messaging" />
</adapters>
<default-channels>
   <channel ref="my-amf"/>
</default-channels>
<destination id="ClaseServiceDestination" channels="my-amf">
   <properties>
        <source> ejemplo.NombreClase</source>
   </properties>
</destination>


Así en las vistas realizadas en Flex se debe de agregar un RemoteObject, como se ve a continuación:



<?xml version="1.0" encoding="UTF-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">
<mx:Script>
   import mx.rpc.events.ResultEvent;
   import mx.rpc.events.FaultEvent;
   import mx.controls.Alert;
   import mx.utils.ObjectUtil;
<mx:RemoteObject id="remoteClaseService" destination="ClaseServiceDestination" showBusyCursor="true">
<mx:method name="resultado" result="resultClase(event)" fault="faultResultado(event)">
</mx:RemoteObject>
<mx:Button label="Obtener Resultado" click="remoteClaseService.metodoClase()"/>
</mx:Application>