domingo, 9 de enero de 2011

Después de estas fechas navideñas...y un poco de Java jeje

Perdiendo el tiempo en youtube encontré un video muy "adoc" a las fechas navideñas que acabamos de pasar con un toque hasta cierto punto geek jajaja pero más que eso muestra todas las redes sociales con las que convivimos a diario.

También les comparto un video que seguramente ya habrán visto si es que son desarrolladores y amantes de Java jeje es muy bueno y divertido! JAVA 4-EVER :)


sábado, 8 de enero de 2011

Project Euler

Me hacia falta subir los 3 problemas que les había mencionado en el post pasado.

Problema 3 dice:

  • The prime factors of 13195 are 5, 7, 13 and 29.What is the largest prime factor of the number 600851475143 ?
public static void problema3(){
  BigInteger bi= new BigInteger("600851475143");
  BigInteger resultado, ultimo;
  if(bi.mod(new BigInteger("2"))==(new BigInteger("0"))){
   bi=bi.divide(new BigInteger ("2"));
   while(bi.mod(new BigInteger("2"))==(new BigInteger("0")))
    bi=bi.divide(new BigInteger ("2"));
  }
  else
   resultado=new BigInteger("1");
  ultimo=new BigInteger("3");
  while(bi.compareTo(new BigInteger ("1"))==1){
   if(bi.mod(ultimo).intValue()==0){
    bi=bi.divide(ultimo);
    resultado=ultimo;
    while(bi.mod(ultimo)==new BigInteger ("0"))
     bi=bi.divide(ultimo);
   }
   ultimo=ultimo.add(new BigInteger("2"));
  }
  ultimo=ultimo.subtract(new BigInteger("2"));
  System.out.println("R3: "+ultimo);
 }
Problema 4 dice:
  • A palindromic number reads the same both ways. The largest palindrome made from the product of two 2-digit numbers is 9009 = 91 × 99.
    Find the largest palindrome made from the product of two 3-digit numbers.
public static void problema4(){
  Integer resultado=0;
  Integer resFin=0; 
  for(int i=999;i>=100; i--){
   for(int j=999;j>=100;j--){
    resultado=i*j;
    StringBuffer res=new StringBuffer(resultado+"");
    String res1=res.toString();
    String res2=(res.reverse()).toString();
    if(res1.equals(res2)){
     if(resultado >resFin)
      resFin=resultado;
    }
   }
  }
  System.out.println("R4: "+ resFin);
  
 }

Problema 5 dice:

  • 2520 is the smallest number that can be divided by each of the numbers from 1 to 10 without any remainder.
    What is the smallest positive number that is evenly divisible by all of the numbers from 1 to 20?
public static void problema5(){
  int i=20; 
  while ( (i % 20!=0)||(i % 19!=0)||(i % 18!=0)||(i % 17!=0)||(i % 16!=0)||(i % 15!=0)||(i % 14!=0)
    ||(i % 13!=0)||(i % 12!=0)||(i % 11!=0)||(i % 10!=0)||(i % 9!=0)||(i % 8!=0)||(i % 7!=0)
    ||(i % 6!=0)||(i % 5!=0)||(i % 4!=0)||(i % 3!=0)||(i % 2!=0)||(i % 1!=0)){ 
   i++; 
  } 
  System.out.println("R5: "+i); 
 } 


sábado, 1 de enero de 2011

El regreso...

Estos últimos meses no he realizado ninguna entrada al blog y es que entre la escuela, trabajo, familia y amigos estos meses han sido una locura. Entre exámenes, certificaciones, vacaciones, fiestas y mucho trabajo. Pero bueno, que mejor manera de iniciar el año que realizando una nueva entrada a mi blog olvidado :)

Como propósito en este año espero por lo menos tener dos entradas por mes y así enriquecer, compartir y hasta ayudarnos en problemas que tengamos en cuanto a programación o configuración de instalaciones.
Este año pinta taaaan bien!!! :) el año lo terminé cerrando un proyecto muy grande dónde se utiliza tecnología de Oracle y que en próximas entradas comentaré sobre éstas, ya que son nuevas y a mi parecer son muy buenas y facilitan la vida.


Dadas las fechas navideñas en la consultora donde trabajo nuestro jefe convocó a un concurso para ganar un póster de Los Simpsons. Y aunque no soy muy fan de ellos decidí participar.
El concurso es resolver de la página http://projecteuler.net/ los primeros 5 problemas. Ayer antes de festejar el fin de año me puse a contestarlos y llevo dos problemas resueltos.
Los resolví con Java, seguramente los algoritmos que desarrollé no son los más eficientes pero los resultados son correctos. Si tienen alguna sugerencia de cómo hacer más eficaces estos programas, se aceptan sugerencias.
El problema número uno dice:

  • If we list all the natural numbers below 10 that are multiples of 3 or 5, we get 3, 5, 6 and 9. The sum of these multiples is 23. Find the sum of all the multiples of 3 or 5 below 1000.

public static void problema1(){
  ArrayList< integer > numeros= new ArrayList< integer >(); 
  int suma=0;
  for(int i=1;i < 1000; i++){
   if((i%3)==0 || (i%5==0)){
    numeros.add(i);
    suma+=numeros.get(i);
   }
  }
 }
El resultado es: 233168


El problema dos dice:

  • Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be:
    1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ...
    By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms.
public static int fib(int n) {
         if (n <= 1) 
          return n;
         else 
          return fib(n-1) + fib(n-2);
 }
        public static void problema2(){
  ArrayList< integer > numeros= new ArrayList< integer >(); 
  for(int i=0; i<34; i++)
   numeros.add(fib(i));
  int suma=0;
  for(int i=0; i < numeros.size();i++)
   if(numeros.get(i)%2!=0)
    suma+=numeros.get(i);
  System.out.println("La suma es: " +suma);
 }
 
Así el resultado es: 4613732


Espero que este tipo de problemas sean de su agrado y continuar resolviendo los problemas que se encuentran en esta página.

Saludos y muy buen inicio de año! Pronto agregaré las respuestas de los 3 que me hacen falta :P

jueves, 16 de septiembre de 2010

Las mujeres

El miércoles antes de clase pasé a la biblioteca dado que habría varios días de descanso por eso del bicentenario jaja y yo con muchas cosas que investigar. Mientras buscaba un libro sobre el manejo de las licencias y el open source me tope con un libro titulado: El primer sexo: Las capacidades innatas de las mujeres y cómo están cambiando el mundo por Helen Fisher. Me llamó tanto la atención que como todavía faltaba para mi clase me puse a leerlo.

Iniciaba diciendo:

“Dios creó a la mujer. Y el tedio cesó en verdad desde ese momento”. Friedrich Nietzsche no era precisamente feminista, pero al parecer apreciaba la mente femenina.

Leí el primer capítulo y éste se centra en cómo las mujeres pueden hacer varias actividades al mismo tiempo y los hombres no, además de cómo las mujeres ven todas las variables y las posibles situaciones ante un problema mientras los hombres se centran a solucionar y dar sólo una solución al problema. Todo esto dando argumentos sobre como los hombres y las mujeres eran diferentes de acuerdo a los estudios realizados en cerebros de ambos sexos.
Me resulta interesante como en la actualidad existen este tipo de lecturas, continuaré leyendo este libro y veré el como nos sitúan ante la sociedad. Aquí podrán ver el libro en línea. 
En lo personal, siempre he pensado que las mujeres somo capaces de muchas cosas y que nuestra manera de pensar va más allá del simple análisis que realiza el sexo opuesto. Hace poco una compañera, amiga y hermana realizó un "post" en un blog respecto a Ada Lovelace. Y se preguntarán ¿Quién es ella? Es la primera persona en la historia en escribir el primer programa per se en 1843. Decia textualmente: 



Este programa era un “método”  que calculaba los números de Bernoulli en la máquina diferencial de Babbage. La importancia de este programa radica en que este marcó la separación entre hardware y software, esta secuencia lógica es el primer programa en la historia de la humanidad.


Con esto podemos afirmar que el papel de la mujer en el área de desarrollo de software fue de suma importancia y que mejor que decir que el primer programa desarrollado fue por una GRAN mujer Ada Lovelace. Aunque somos pocas en esta área es un orgullo ser MUJER!!!! :P Continuaré leyendo el libro y más adelante les platicaré de él.

domingo, 5 de septiembre de 2010

Tipos de Software

Hace un año para una materia leí el libro de: Pressman, Roger S. titulado: Ingeniería del software : un enfoque práctico.


Es un libro muy teórico pero sirve mucho en cuanto a la aplicación de términos así como una vista general del ciclo de vida de un proyecto, las entregas que se deben de realizar así como los pasos "a seguir". Y digo a seguir entre "" porque la poca experiencia que he tenido desarrollando software no se apega mucho a dicha teoría.

Si nos definimos como desarrolladores de Software, debemos de tener muy claro los tipos de software que existen. Pressman (2005) los cataloga de la siguiente manera :

1. Software de Sistemas: Colección de programas escritos para servir a otros programas. Algunos programas de sistemas (compiladores, editores y utilerías para la administración de archivos) procesan estructuras de información complejas pero determinadas. Otras (SO, controladores, software de red, procesadores de telecomunicaciones) procesan datos indeterminados.
2. Software de Aplicación: Programas independientes que resuelven una necesidad de negocio específica. Procesan datos empresariales o técnicos de forma que facilitan las operaciones de negocios o la toma de decisiones técnicas o de gestión.
3. Software científico y de ingeniería: Se caracterizaba por algoritmos “devoradores de números”. Sin embargo, las aplicaciones modernas han empezado a tomar características de software en tiempo real e incluso de software de sistemas.
4. Software emportado(mala traducción en el libro debería de ser como incrustado): Reside dentro de la memoria de sólo lectura del sistema y con él se implementan y controlan características y funciones para el usuario final y el sistema mismo. Ejemplo: teclado de un microondas o funciones digitales del carro.
5. Software de línea de productos: Diseñado para proporcionar una capacidad específica y la utilización de muchos clientes diferentes. Se puede enfocar en un nicho de mercado limitado (control de inventarios) o dirigirse hacia los mercados masivos (aplicaciones de hojas de cálculo, de BD)
6. Aplicaciones basadas en Web: Son apenas un poco más que un conjunto de archivos de hipertexto ligados que presenta información mediante texto y algunas gráficas. Sin embargo, las WebApps evolucionan hacia ambientes computacionales sofisticados que integran BD corporativas y aplicaciones de negocio.
7. Software de Inteligencia Artificial: Utiliza algoritmos no numéricos en la resolución de problemas complejos que es imposible abordar por medio de un análisis directo (robótica, SE, reconocimiento de patrones, redes neuronales, comprobación de teoremas y juegos en computadora).

Así es que, ¿qué tipo de software desarrollas?. Todos son con diferentes objetivos, con diferentes tecnologías y diferentes complejidades al momento de programar pero hay que tener claro lo que estamos desarrollando y así saber a dónde queremos ir y que beneficios queremos.

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.