martes, octubre 30, 2007

Tutorial de Programacion III - Tipos de Datos

De seguro ud recuerda que en los tutoriales anteriores trabajamos con variables que contenían un número, y también que pasamos un parámetro entrecomillado para el metodo println de java para imprimir en consola.

Bueno resulta que cada variable representa un lugar en la memoria RAM (random access memory), y como ud ya sabe nada es infinito, ni siquiera la memoria RAM, entonces
  1. Las variables tienen un tamaño predefinido de memoria para contener un valor
  2. las variables preferiblemente solo aceptan un tipo dato
Estos tipos de dato son aquellos con los que se puede realizar tareas entre sí, como números con números, o texto con texto...

Por ejemplo para realizar tareas con números en java, tenemos que declarar variables de los tipos que dispone para números, como lo son
  • int: acepta dentro números enteros
  • double: acepta números, pero con coma flotante, osea q tienen decimales
Las variables se declaran asi dentro de java

public class ImprimirNumero{
//puede declarar desde aqui arriba
private static int miNumeroEntero = 25;
private static double miNumeroDecimal;

public static void main(String [] args){
//puede declarar desde aqui arriba
int otroEntero;
double otroDecimal = 3.66;
System.out.println("Entero: " + miNumeroEntero );
System.out.println("Decimal: " + otroDecimal );
}
}

Para que se vayan preparando, el metodo main() hace que cualquier archivo con un class sea el que corra el programa, si no tiene ese metodo el class solo sirve para crear estructuras que guardan información y metodos para reusar como el println.

El texto del programa que comienza con "//" significa queel compilador ignorará esa linea, es generalmente usado para poner comentarios, o bloquear codigo mientras se hacen pruebas.

Continuando con el código, las variables dentro del main() son variables denominadas locales, lo que significa que si hay variables fuera del método main(), la que está dentro del método será la que importará al momento de la evaluación del código, ya que cuando ud llama a un método como por ejemplo el println, no espera que una variable declarada fuera, sea utilizada dentro de éste, asi que esto se hace por seguridad, al igual que las variables que estan declaradas por fuera como esta:

private static int miNumeroEntero = 25;

tienen otros encabezados delante del int para hacer referencia a otros aspectos de seguridad que mostraré después, solo fijense que tiene un int delante, pero necestaran poner el private; y el static si quieren usar la variable dentro del main().

A estas variables int puedes asignarle (meterle un valor a la variable) usando el simbolo igual (=) un valor de número entero, o un decimal, solo que el decimal lanzara un error en la consola al ser compilado, diciendote que se perderá presición, ya que se perderian los decimales.

Ud puede crear otras variables para sumar los números, pero si quiere el resultado con decimales, entonces tiene que almacenar el resultado en un double. El método println tambien puede imprimir valores de numeros.


  • String
Un String es el tipo de dato que puede contener texto comun y corriente, para diferenciar su contenido del texto convencional, la asignacion se realiza por medio de texto entrecomillado.
Un String no se declara de la misma manera que un int, ya que un String es una clase que permite crear objetos; una diferencia basica entre un objeto, y una variable, es que una variable como dijimos, tiene una memoria definida, cuando ud la declara, ya el compilador le pone automaticamente la memoria que se usará, pero cuando ud usa un objeto, puede declararla sin usar su memoria, y asignarle la memoria, una linea antes de usarla; esto crea un beneficio de recurso de memoria, ya que no se usa la memoria exactamente hasta el momento que se necesita, y que tambien esa memoria se puede desalojar despues de usada.

  • Declaracion de un String
String miTextoAlternativo;

De esta manera ud declara a miTextoAlternativo como una variable SIN MEMORIA.

Luego en el momento que quiera usarla hace lo siguiente:

miTextoAlternativo = new String();

al hacer esto, ud llama a un metodo propio del objeto String, que le asigna memoria a cualquiera de sus variables, pero tambien puede asignarle la memoria al momento de crearla:

String miTextoAlternativo = new String();

pero tambien puede hacer esto:

String miTextoAlternativo = "";

o esto:

String miTextoAlternativo = "Tutorial de progra";


Me dijeron una vez que asignar de una vez "" o con texto entre las comillas es mejor que llamar al metodo String() y luego ponerle el texto que quiero usar, ya que se llama dos veces internamente al proceso que da memoria, y por supuesto, innecesario.

Ud puede sumar dos Strings como dos números, pero con resultados diferentes, ya que aunque internamente son números, ya que cada caracter equivale a un numero del codigo ascii, lo que pasa es que las cadenas de caracteres se concatenan.

Estos Strings tambien se pueden pasar de parametro a println, por lo que pueden probar si pueden imprimir su nombre en una variable...

Intenten a ver que les sale y me cuentan...

viernes, octubre 26, 2007

Tutorial de Programacion II - Compilar en JAVA

Si no tienes java puedes conseguirlo en java.com pero solo para ejecutarlo, para crear y compilar debes ir a SUN y descargar el JDK que son 65.64 MB

Si ud tiene ganas de empezar a programar en java, pues entonces empecemos, y vayamos dando teoría mientras damos práctica.

Bueno, aquí vamos a compilar java como los hombres, desde consola!

Primero espero que estén en Windows no me importa que versión.

Para hacer una prueba de un archivo java hagan lo siguiente:

  • abran un bloc de notas
  • insertar dentro lo siguiente
public class ImprimirTexto{
public static void main(String [] args){
System.out.println("Salida de Texto");
}
}

  • Guarde el archivo con el nombre de ImprimirTexto.java en el escritorio
  • Abra una consola o Símbolo de Sistema de Windows
    1. Puede abrirlo en esta ruta: "inicio/accesorios/simbolo de sistema"
    2. O puede ir a "inicio/ejecutar", y digitar "cmd"
  • Dirijase a la ruta donde ud creó el archivo .java pero dentro de la consola
Si está por ejemplo en el directorio "C:\Documents and Settings\miNombredeUsuario>"

para pasar al directorio "Escritorio" digite en la consola "CD escritorio". El comando CD significa Change Directory, y no tiene nada que ver con abrir el CD ROM como creyeron por ahí.

Como el archivo ImprimirTexto.java esta en el escritorio, y ahora ud esta en el escritorio dentro de la consola, entonces, solo ha de compilar el archivo y para lograrlo, digite lo siguiente:

javac ImprimirTexto.java

Hay que respetar las mayusculas, ya que el lenguaje tambien lo hace, esto por que es una regla.

Ahora si todo esta bien escrito dentro del *.java, no generará errores, entonces el compilador creará un archivo del mismo nombre que el .java, solo que con extensión .class indicando que es el compilado.

Este archivo es de una forma "ejecutable", no como un EXE propio de windows, por que utiliza la maquina virtual como intermediaria, pero gracias a este realizará un resultado semejante a una aplicacion windows, con la ventaja de ser multiplataforma.

Para correr este programa, igual desde la consola, digitamos igual dentro de la ruta del escritorio donde igual se encuentra nuestro .class lo siguiente

java ImprimirTexto


Si todo sale correctamente la salida en la consola debera ser: Salida de Texto

Así será el primer programa es java, a estos programas en pantallas negras se les denomina programas de consola, utilizados principalmente en servidores cono UNIX, que no necesitan interfaz gráfica, por que esto consume recursos que evidentemente pueden ser usados en atender peticiones a los clientes del servicio. Pero no se preocupen, Java también puede crear ventanitas con botones para la comodidad del usuario, pero primero tienen que aprender a hacer esto antes de graficar, el cual, aunque ayuda en el aprendizaje, se omiten muchos detalles, ya que una vez que estás en esta, no quieres salir.

Aprovecho para mostrar un poco más sobre como funcionan los métodos usando este ejemplo, como pueden ver, el metodo println tiene un argumento o parametro entrecomillado ( luego me referiré a esto), esto quiere decir que lo que este dentro sera un texto comun y corriente, que no es variable ni nungún identificador especial, quiere decir que se imprime exactamente lo que esta entre esas comillas. Este método println acepta cualquier texto entrecomillado, demostrando la funcionalidad de un procedimiento como se explicó en el tutorial anterior, ya que por dentro, aunque no lo veamos, este método puede tener 100 lineas que no necesitamos repetir para imprimir texto en la consola, sino, que solo invocando su nombre, y dandole el texto que queremos ver funciona de la misma manera, ahorando espacio en nuestros archivos de codigo, y permitiendonos leer más rápidamente, y encontrar errores de la misma manera.

Tutorial de programación I

lunes, octubre 22, 2007

Tutorial de Programacion I - Variables, Constantes, Procedimientos y Funciones

Bueno, para aprender programacion basica, a pedido de Nitos y Crox, he decidido enseñar los conceptos basicos con JAVA, por que es gratis, por que tiene clases, por que tiene muchas cosas...

Mientras llegamos a los importarnte con java, explicare terminologia basica que es necesaria para empezar, y mientras necesitan descargarse por supuesto JAVA, en java.com, y si quieren para ayudarse con la programada, JCreator, TextPad o algo pesadito como NetBeans que en ciertos casos ya viene con java.

Ahora bien olvidandonos de la historia y de complicaciones, si ud quiere crear algo, cualquier cosa que ve en la pantalla de la computadora, por aqui puede empezar.

Empecemos:

  • VARIABLES

mucha de la programacion necesita mucha matematica, hay conceptos que son muy silimares, pero que difieren en el significado final, por ejemplo

x = 10

eso quiere decir en lenguaje funcional matematico que la "x" es igual a 10;

pero en programacion, cuando se realiza esto, se quiere dar a entender que la "x" tiene por dentro el valor "10"; ahora, que tiene esto de util?
"x" en el contexto de programacion se llama VARIABLE en este caso, osea que su valor puede cambiar; de nuevo, que tiene esto de util?

igual que una formula matematica ud puede tener algo asi
resultado = x * .1

sabiendo que "x" seria por ejemplo el monto que ud cobró por la venta de algo digamos unas tennis en su trabajo de vendedor, y el resultado seria su monto de comision de 10%, al multiplicar ese valor.
Toda esta informacion sera llevada a "resultado" que es otra variable, y este resultado se puede usar en otros calculos, o ser "impreso" en pantalla para decirle a el usuario que monto ha ganado.

Entonces, como definicion, tenemos q una "variable" en un espacio de memoria que tiene un contenido no definido, hasta que se ejecuta el programa.

Ahora, al igual que en matematica convencional se usan palabras para representar conceptos, como ya vimos, el "resultado" es una variable, osea q ud usa esa palabra para almacenar un dato, en este caso un numero.

Pero como ya se dio cuenta, que la hace especial de cualquier palabra a una variable, como distinguirla para poder asignarle un dato?
Bueno, para no referirme aun a java, usare terminologia de action script de flash, q no necesitan saber para entender, pero es mas facil de entender en un principio que java.
La cosa es que UD tiene que indicarle al programa que tal palabra la vas a usar como identificador para una variable en flash se haria asi en su version 2.0:

var resultado;
var x;
x = 10000;
resultado = x * .1


asi tendriamos que "x" y " resultado" son variables por que se lo hemos dicho al programa, para futuras referencias, el programa q lee el codigo es un "compilador"

Ahora, ud se pregunta, donde pongo todas esas variables para que mi compilador java los lea?

Bueno, todos los codigos de programas son de hecho texto plano, que quiere decir esto? que es un archivo tipo BLOC de NOTAS, osea que ud puede escribir su programa java en bloc de notas, y cambiar la extension de .TXT a .JAVA y listo... pero hay programas que ayudan a recordar cosas, para eso estan JCreator y NetBeans, pero no tanto asi TextPad.



  • CONSTANTES
Continuando con el codigo, hay otro tipo de identificadores que se denominan "constantes", que son como las variable, pero definidas desde el principio del programa, y que ud sabe que sus valores no van a cambiar

const PI = 3.141592654;

la constante PI nunca va a cambiar, tambien por esa razon, muchos compiladores la traen integrada, pero hay que saber como llamarla.

  • PROCEDIMIENTOS
Entremos a lo bueno. Que sucede si necesita calcular 10 veces, pero con diferentes valores, el 10% de la venta de alguna mercancia? repetitivo cierto? y si son 50, o mil?
Bueno que sucede si nuestra formula tiene 100 lineas?
La cosa se complica no?

Y ya que estamos con esto de los identificadores, seria bueno tener esas 100 lineas bajo una sola palabra y llamarla no? y solo darle los valores que cambian, como "x" y que nos de el resultado en otra variable, que seria "resultado"

Entonces poniendo ejemplo flash para crear esta tarea enorme y repetitiva hacemos lo siguiente

function calculoExtenso (var x, var resultado){
      resultado = x * .1;
}

Al igual que con la variable o la constante, se utiliza una palabra para indicar al compilador que la palabra que sigue se usara en lugar de todo el codigo que esta dentro del bloque ( {} ) identificado por las llaves, en este caso function; en los parentesis redondos ponemos las variables que necesitamos dentro del bloque. Pero si anteriormente declaramos variables sobre el codigo, por que ponerlos entre parentesis?

Al momento de llamar al procedimiento, usted no puede modificar el codigo de adentro, claro que puede cambiar el codigo que esta entre llaves, pero no cuando hace la llamada, que seria de esta manera

var miNuevoResultado;
var precioZapatos = 15000;
calculoExtenso(precioZapatos, miNuevoResultado);
.
.
utilizamos miNuevoResultado en otras operaciones
.

calculoExtenso(15000, miNuevoResultado);
.
.
utilizamos miNuevoResultado en otras operaciones
.

ahora, como se puede ver, solo lo que esta entre parentesis se puede modificar dentro del procedimiento, estos son llamados "parametros" por que el procedimiento los necesita para funcionar; el segundo parametro siempre tiene que ser variable (solo este caso), por que sino, no podremos utilizar el resultado que nos devuelve el procedimiento.

Internamente "miNuevoResultado" es igual a var "resultado" dentro de la declaracion del procedimiento.

  • FUNCIONES
Una funcion es un procedimiento que devuelve un resultado. Pero para que si ya tenemos que los procedimientos pueden devolver valores por variables?

Bueno, si es cierto, pero va a facilitar la lectura y codificacion de programas...

Ahora, a que me refiero con que devuelve un valor?

Me refiero a que puedo usar el identificador del procedimiento en lugar del resultado que de el codigo que queremos simplificar, por ejemplo:

si ya tenemos que

C = A + B;

osea pondremos en C la suma de nuestras variables A y B, pero podemos usarla con un identificador que nos ayude a ver y hacer esto mas rapido.

function suma(var A, var B){
      var C = A + B;
      return C;
}

para que sirve return? este identificador propio de programas como java, indica que el valor se devuelve en lugar del nombre del identificador, por lo tanto, para ver que significa esto, podemos hacer lo siguiente:

D = suma(10, 20) + suma(15, 30);

por "debajo" suma(10, 20), como ud ya sabe es 30, y suma(15, 30) es 45, asi, sin que ud lo note, se intercambian por esos valores, y se puede realizar la suma mas grande:

D = 30 + 45;

y D de una forma transparente captaría el resultado.


Aqui terminamos por hoy, no es que sea muy bueno explicando, pero es mejor que le expliquen a uno en un lenguaje mas comun, pero como igual sigo con muchas mañas de los programadores, si no entendieron algo, haganmelo saber.

Hagan preguntas ahora, para responderlas en la segunda parte, o en los comentarios

lunes, octubre 15, 2007

Errores de mi Computador


pantallazo azul

Desde que soy usuario de mi tarro (computador) me he visto enfrascado en un sin número de problemas que sinceramente no comprendo, recuerdo que en mi viejo computador tambien tenia errores, pero nunca tantos y tan rajados o salidos de la razon como los que voy a enumerar a continuacion:

  • El sistema no inicia por la corrupcion del archivo system
  • A cada reinicio de sistema se ejecuta el scandisks para reparar corrupcion de archivos
  • Por la misma corrupcion de archivos programas empiezan a funcionar mal
  • Durante un tiempo msn estuvo lanzando un error cada 5 minutos
  • Un ventilador se me fundió
  • El ventilador de la fuente de poder empezó a fallar
  • Mi computador se reiniciaba -lo más seguro por un virus-
  • y finalmente Pantallazo Azul, conocido en el underground de programadores y afines como Blue Screen of Death
Para cada uno tuve que ingeniarmelas como buen programador a sacarme una solución de la manga sabiendo que no sé electrónica, por ejemplo para el archivo system despues de dos dias de navegar en el tarro de mi hermana, encontré que sin ese archivo no arranca windows, y que la única forma de recuperarlo era copiandolo desde el mismo disco de windows, hacia la locación en mi tarro; por consiguiente cada vez que pasaba -y aún pasa- tenia que insertar el disco de windows, esperar a que mi pedazo de cd rom leyera como si fuera a instalar, y esperar a que me saliera la opción de consola de recuperación, que para tal caso es un símbolo de sistema en pantalla completa -descripcion para los ignorantes- y tenia que escribir la ruta del archivo para borrarlo, e igual ir a la unidad de cd rom para copiarlo y devolverme al disco duro para pegarlo, cosa que se volvio muy aburrida, por lo que encontré como solución realizar un txt con los comandos como un archivo BAT para windows, solo que en la consola primero se ejecuta el comando BATCH para ejecutar el archivo.... un problema menos...

La corrupción de archivos no pude solucionarla completamente, pero averigue que separar los "archivos de programa" de la unidad C -o unidad de arranque-, evitaría menos acceso al disco y manipulación de los archivos del sistema, asi que se eliminó un poco.

El msn tuve que reinstalarlo en otra unidad para que dejara de enviarme mensajes de error.

Para mi ventilador malo que enfriaba mi procesador, quité el ventilador de una fuente de poder que me dieron, y a pesar que era mas grande que el anterior, hice un Mc Gyver para ajustarlo y es el que actualmente está...

Mi tarro se reiniciaba por un virus... un buen NOD32 configurado se jala del problema...

y para un pantallazo azul? pues que les diré... esos errores que lanza no los entiendo para nada, como que son para despistar los errores del sistema que los mismos desarrolladores se jalaron... una vez leí por ahi que no perdiera tiempo tratando de reparar el pantallazo azul, que cerrara mi boca y formateara... y sinceramente es mi humilde consejo, si les sale un pantallazo azul... formateen su tarro si tienen prisa para hacer algun trabajo... sino tienen prisa pues... cuentenme como les fue que yo no se como hacerle...

viernes, octubre 12, 2007

Iluminación en Blender

Quiero ahora mostrar como se ven las iluminaciones en Blender.
Al igual que Povray tiene raytracing y radiosity, pero ademas tiene otro tipo de juego de iluminacion llamado Ambient Occlusion, el cual crea sombras suaves cuando los objetos estan muy cercanos


Blender Raytracing


Como ven, igual que en povray, un punto de luz crea una sombra solida, no degradada.


Radiosity en Blender

A pesar que esta ultima imagen es un mal ejemplo, ya q no tiene toda la calidad que quisiera, igual podemos ver que las sombras son tenues, mas cercanas a la realidad.



Ambient Occlusion


Finalmente la Ambient Occlusion oscurece creando sombras, cuando los objetos estan muy cerca, por eso en las esquinas del cubo, por ejemplo, esta sin oscurecer cuando toca el plano.



las tres iluminaciones

Esta última tiene los tres efectos de luz, la cual me parece ha quedado muy bien, a pesar de que los objetos son basicos.

lunes, octubre 01, 2007

La Radiosidad en PovRay - (Radiosity)

Generalemente cuando se realiza una imagen 3D, lo que se quiere es que como resultado final una imagen se vea realista, aunque los objetos que en ella se encuentren se vean muy simples, para esto es generalmente necesario, colocar una buena iluminacion, creando sombras semejantes a la realidad, este tipo de ilumimacion se llama Trazado de Rayos o raytracing, en el cual, un determinado punto de luz, dispara haces de luz o rays en todas direcciones, asi se calcula q rayos den ir hacia la camara y solo esos son tomados en cuenta. Lo particular de este metodo es que solo toma una parte de los hechos que pasans en la realidad con la luz, ya que la luz tambien colisiona con otros objetos y esa luz colisiona con los demas, causando deferentes coloraciones.


imagen con raytracing

Observen que en la imagen anterior se crea una sombra bien definida, y que alrededor del cono y de la esfera, hay un ligero degradado, algo que se espera, pero dentro de la sombra en la realidad, la luz rebota por ejemplo del cielo y colisiona con los objetos, dandonos una pequeña percepcion de estos al rededor.

Esto no se puede calcular con los rayos normales, pero el metodo de radiosity que es experimental aun en el caso de povray, ayuda mucho a solucionar este problema.


iluminacion con radiosity

Como se puede observar en esta ultima imagen, que solo contiene radiosity, la imagen ha cambiado, un efecto mas realista se presenta, creando diferentes grados de sombra e iluminacion. Esto es logrado gracias a que un objeto cualquiera designado por nosotros, al que llamaremos emisor esparcira su imagen a travez del espacio, asi, los objetos que esten mas cerca recibiran una imagen mas iluminada de si mismo, y los lejanos recibiran una con menos intensidad, resolviendo de manera parcial el problema de la iluminacion ambiental. En esta imagen a pesar que no esta enfocada por la camara, existe un "cielo" que emite luz ambiental, que es tomada por el radiosity para crear imagenes de si mismo para crear las sombras; este "cielo" es simplemente una esfera hueca, agrandada 5000 unidades para encerrar el espacio y crear un buen efecto.

Pero la idea de la iluminacion no se queda ahi, igual se pueden usar las dos iluminaciones para crear un efecto mas realista.



radiosity y raytracing

Asi ya tenemos en esta imagen ambas iluminaciones, creando lo que queriamos, la iluminacion degradada en la sombra, que es lo mas cercano a la realidad.



un ejemplo de la galeria de povray

Finalmente este ejemplo elaborado de Hildur Kolbrún, donde solo existe luz de radiosity.