sábado 14 de marzo de 2009

procesos hijo

Sencillo ejemplo hecho en C, en el sistema operativo Ubuntu 8.10

El programa tiene un proceso padre, y a su vez crea tres procesos hijos, los cuales

van desapareciendo

link:   ejemplo

lunes 2 de febrero de 2009

FILOSOFIA UNIX

UNIX

En nuestra vida informática, desde que nos adentramos al mundo de los sistemas operativos, hemos podido notar el reluciente nombre de “UNIX”, cosas como: “de ahí se baso el sistema operativo Linux”, “Ellos hablan de la simpleza en los programas”.

Para poder entender a este sistema operativo portable y multiusuario, debemos comprender los motivos por lo cual fue creado, y las bases que le dan sentido a la razón de ser.
Luego de chequear su historia, los programadores: Ken Thompson, Dennis Ritchie deseaban llegar al término de “programa transportable” luego de la creación de Unix se adaptaron a lo el Lenguaje C, el cual es portable y podía resumir milésimas líneas de código Assembler, tomaron la iniciativa para poder crear su sistema operativos en pequeños programas eficientes.

Filosofía UNIX.

Ken Thompson creo originalmente la “Filosofía Unix” para diseñar un sistema operativo, de características pequeñas pero operar el sistema con una interfaz limpia aplicada a servicios. 

Cuando se dio a conocer estos principios, se aclararon muchos aspectos para no tener una idea errónea del sistema.

La filosofía Unix no es un método formal de programación.

  • No utiliza la teoría de la computación para obtener “teóricamente un software perfecto”.
  • Su programación es de “abajo hacia arriba: bottom up”.
  • Es de conocimiento pragmático.
  • Basado en el conocimiento Empírico o Experiencia.
  • No se encuentra en los métodos y las normas oficiales, sino en el medio-reflexivo implícito el conocimiento.

Aparte de las aclaraciones, hay colaboradores a la par de Ken Thompson, los cuales dieron una explicación explicita sobre las condiciones que se cumplen para Unix. Entre ellos tenemos a Doug McIlroy , creador de las Unix pipes(Tuberías de Unix):

  • Hacer que cada programa haga una cosa específica, y que lo haga de manera correcta, es mejor construir algo nuevo, que modificar programas viejos, en los cuales solo se atoran de pequeñas mejoras.
  • Se espera que la salida de cada programa para convertirse en la entrada a otro, esto permite conectar los programas que hacen cosas especificas para tener un mayor control sobre que pudo haber fallado.
  • No dudes en tirar las piezas sin sentido y luego reconstruirlas, esto permite la reusabilidad de código.
  • Utilice las herramientas en lugar de ayudar a trabajadores no calificados para aligerar una tarea de programación, incluso si tiene que desviarse para construir las herramientas y esperar para lanzar algunos de ellos después de que haya terminado de usarlos.
  • Escribir programas para manejar flujos de texto, ya que es una interfaz universal, lo cual permite la conexión con otros programas y poder obtener mejores resultados.
  • Escribir programas que trabajen de manera conjunta.

Todo lo anterior puede resumirse en la siguiente frase:
“Esta es la filosofía Unix: Escribir programas que hacen una cosa y hacerlo bien. Escribir programas para trabajar juntos. Escribir programas para manejar flujos de texto, ya que es una interfaz universal.”

Todos los colabores de Unix se unieron a la creación, también aportaron valores a los principios filosóficos, que luego de mucho tiempo se aplico a la forma de poder programar como en el lenguaje C, dando aspectos que podrían ayudar a programar en base a los principios filosóficos:

  • Regla de Modularidad: Escribe módulos o partes simples conectadas a través de interfaces los cuales comunican a otros programas.
  • Regla de Composición: Diseñar programas que se conectarán a otros programas, una salida del programa es la entrada de otro programa.
  • Imperio de la Robustez: La robustez es el hijo de la transparencia y la simplicidad.
  • Regla del Silencio: Cuando un programa no tiene nada sorprendente que decir, probablemente no tiene nada que decir.
  • Énfasis de la menor sorpresa: en lo que respecta en el diseño de la interfaz, no es necesario sorprender.

Una forma simple de ver la Filosofía UNIX

K.I.S.S. : Keep It Simple, Stupid
Es la manera de simplificada de Unix, en lo cual exige ser efectivos a tener exageradas interfaces notorias. Los puntos más importantes rondan en:

  • Todo lo que puede ser una fuente y destino-debe ser independiente de un filtro.
  • Lo pequeño es hermoso. Escribir programas que hacen lo menos es coherente con la realización del trabajo.

Ciertas invenciones en Unix
Me queda la duda de este video que encontré en youtube, pero ustedes dirán.


Fuentes:

http://www.unix.com/
http://www.geocities.com/v.iniestra/apuntes/unix.html
http://www.faqs.org/docs/artu/index.html
http://es.wikipedia.org/wiki/Unix#Historia
http://www.unix.org/
http://en.wikipedia.org/wiki/KISS_Principle


miércoles 28 de enero de 2009

Poner una imágen como textura en Java 3D

Como siempre programando en Java3D, cree un box, pero me dije, ¿Porqué el box no puede tener como textura una foto o imágen que desee?.

Terminando de cuestionarme, investigue por internet como colocar las texturas y por fin llegue a mi respuesta. Se deben crear ciertos objetos que serán parámetros para las figuras geométricas.

  • Crear un objeto para el tipo de textura:
  • int paratextura = Primitive.GENERATE_NORMALS + Primitive.GENERATE_TEXTURE_COORDS;
  • /*Nota: Esta sentencia pide ciertas librerías, las cuales en Netbeans 5 ó superior indica cuales son las que deben declararse o incluirse.*/
  • Crear objetos de Carga de textura,textura y apariencia:
  • TextureLoader loader=null;
  • Texture texture=null;
  • Appearance ap=null;
  • Inicializar con parámetros:
  • loader = new TextureLoader("pared.jpg","INTENSITY", new Container());
  • /*Nota: "pared.jpg" es la imagen que deseamos sea la textura para nuestra figura geométrica.*/
  • texture = loader.getTexture();
  • ap = new Appearance();
  • ap.setTexture(texture);
  • Ahora damos la textura a la figura geométricacon los parámetros ya creados
  • Box cabeza=new Box(1.2f,1.25f,1.25f,paratextura,ap);
  • /*Nota: Ahora ingresamos el primer parámetro de paratextura, y el otro porsupuesto de apariencia, y listo.*/

Y podemos ver los resultados,  para una pared que en si es un box:

Saludos....

viernes 12 de diciembre de 2008

Batallar hasta el último aliento

Gracias a Dios puedo contar que me he librado de una asignatura que me atormento como loco, y pues no me da pena decir que es compiladores 2, dirán seguis hablando de eso.....

Pero si lo hablo en alto y muchas veces debido, a que pues fue un gran logro ganar esta asignatura, debido a que me parecia peculiar muchas cosas que en ello pasaron.
Lo que gracias a Dios me ayudo bastante fue el hecho de no tirar el curso la 3ra vez que la cursaba, tomé la decisión de llegar a última instancia, y solo con esa decisión pude ver resultados íncreibles.

Debido a esto recuerdo las palabras de un entrenador de futbol americano que una vez dijo luego de ganar un partido.

"No hay ganadores en el partido de hoy.

En este mundo, sólo los que experimenten
la decepción se harán mas fuertes.

Todos los que juegan en el campo
saborearon la derrota alguna vez.

No hay ningún jugador que no haya perdido antes.

Pero, los mejores jugadores hacen todo
lo que pueden para recuperarse cuanto antes.

Los jugadores normales tardan en recuperarse.

Y los perdedores, se quedarán llorando en el campo."

asi que ...........

jueves 1 de mayo de 2008

Gramática que reconoce el lenguaje Java


Sígo con el bendito dolor de cabeza de compiladores 2, espero seá la última vez, pues nos han pedido de que leamos código en lenguaje Java, y pues lo optimicemos por el método de mirilla, y luego lo pasemos a tres direcciones de C++, y luego optimizarlo y........... todo esto utilizando JLex y Cup.

Bueno, el primer paso pues es tener la grámatica que pueda reconocer el código de Java, la cuál por medio de un amigo llego a mi manos( buena onda Yylex), ahora pues teniendo esa grámatica y traduciendola a mi antojo he logrado reconocer el código de Java.

Los archivos necesarios están disponibles aca-> DIRECCION que pertenece a la página de CUP que esta dirección -> CUP.

Lo único que tuve que crear fue el método sintáctico, el cual con un buen rato sale, bueno otra cosa recomendable es que vean la especifiación del lenguaje java, la cual esta disponible ACA .
Así se puede estudiar las partes en las que esta compuesta la gramática..

Éxitos.............y que Dios se apiede de nuestro código

miércoles 9 de abril de 2008

Usando Janino para crear un FastScriptEvaluator (Ejecutar código de java en tiempo real)

Bueno, estos días angustiado programando mi proyecto de compiladores me tope que una parte debía generar reglas, o mejor dicho procedimientos que se resuelven en tiempo en real, pueden pertenecer a una clase o algo asi, digamos,l lo que venía es:

Duelo { Definir total_vida=vida+resistencia; vida=total_vida-daño; }
lo que logre convertir a java con mi parseador
public nodo_personaje duelo(nodo_personaje primero,nodo_personaje segundo)
{ int total_vida; primero.vida=total_vida-segundo.daño; return primero; }

Tengo eso en una cadena, y no que hacer con ello, es por eso que utilizo una clase llamada Janino, la cual permite ejecutar Script en tiempo real, entonces logre meter esto es una cadena la cual ejecutaría con el janino el cual pueden encontrar ACA , bueno el ejemplo que mas sirve es el
de CreateFastScriptEvaluator que está en la documentación de janino, áca esta el ejemplo:

 Foo f = (Foo) ScriptEvaluator.createFastScriptEvaluator(
new Scanner(null, new StringReader("return a + b;")),
Foo.class,
new String[] { "a", "b" },
(ClassLoader) null
);
System.out.println("1 + 2 = " + f.bar(1, 2));

Ahora podemos mandar a llamarla con este bloque, las líneas mas importante son las de new Scanner, ahi pueden meter código java, al menos yo le metí if, while y funciono de maravilla.
bueno, yo cambie mi interface de ejemplo y la hice de esta manera:

nodo es esta clase:
public class nodo { public String cadena="";
public nodo() {
}
}


La interface la deje asi

public interface fox { nodo bar(nodo a,nodo b); }

Y para ejecutar:
nodo un_nodo=new nodo(); nodo dos_nodo=new nodo();
un_nodo.cadena="beta";
dos_nodo.cadena="gama";

fox fx = (fox) ScriptEvaluator.createFastScriptEvaluator(

new Scanner(null, new StringReader(""+this.jTextField1.getText())),
fox.class,
new String[] { "a", "b" },
(ClassLoader) null // Use current thread's context class loader );

System.out.println("" + fx.bar(un_nodo,dos_nodo).cadena); //ejecutando



NOTA: ahi puse un jTextField para meter código de java, puse en jtextfield:
a.cadena=a.cadena+"$"+b.cadena; return a; y me ejecuto esa línea y dieron los resultado, de ahí varié el JtextField con if, con else while y funcióno, la verdad me sorprendí que cuando meti otro código, me lo ejecuto a la perfección(siempre y cuando metan código de java correctamente).

Y gracias a Dios funciono, recuerden que aunque sea un día antes todo llega a la luz, me costo un cacho usarla pero heme aquí, no quiero rendirme ahora seguiremos programando....

hasta llegar a ser ....

sábado 5 de abril de 2008

Atributos Sintetizados en JLex y Cup

Llevando mi curso de compiladores 2, en laUSAC con el ingeniero Byron me di cuenta que el usaba mucho los atributos sintetizados de una manera libre, como de esta manera:

E -> T + F { E.valor= T.valor+ F.valor}

  • El no terminal “E” recibe valores de atributos de “T” y “F”, todos son el mismo tipo de no terminal, entonces me dije, como puedo lograr eso, ya que solo he usado como si fuera String o Integer, decidí lograrlo de alguna manera. Logre crear mis propios atributos sintetizados a mi manera, este es uno de los métodos:En el archivo que usen para el análisis léxico despues de agregar los import y todas las librerías y paquetes pueden declarar una clase de esta manera:

import java_cup.runtime.Symbol;

class cadena
{
public String cad;

public cadena(String cad_){
cad=new String(cad_);
}
public cadena(String cad1_,String cad2_)
{
cad=new String(cad1_+”,”+cad2_);
}
}

  • Ahora como vemos tenemos esta clase en el archivo léxico, nos disponemos ahora a ir al archivo donde hagan el análisis sintáctico , y en la definicions de no terminales declaran de esta manera:

non terminal cadena expr_list, expr_part;

  • Ahora pasaremos a usarlo, esta es la parte que a todos nos llama la atención, como usar los atributos


expr ::= expr_list:a {:System.out.println(a.cad);:};

expr_list::= expr_list:a COMA expr_part:b {:RESULT=new cadena(a.cad,b.cad);:}
| expr_part:a {:RESULT=new cadena(a.cad);:}
;

expr_part ::= id:a {:RESULT=new cadena(a);:};

Nota: id devuelva una cadena de letras y COMA es lo que indica el nombre, este ejemplo reconoce una cadena de palabras separadas por COMA, pero pueden ser creativo, en su clase creada pueden meter lo que quieran, Arrays,Vector etc, todo lo que Java les permita.

Además, si tenemos la clase que deseamos sintetizar en un paquete, fácilmente se puede usar igual, en el archivo que utilicen para el análisis sintáctico declaren ese paquete o la clase a usar import package.clases_a_usar; y en el área de no terminales pueden declararlo libremente, non terminal clase_a_usar E; y listo.

Acá les dejo el ejemplo si desean compilarlo y probarlo, recuerden que en lexico.lex esta la clase y en sintacticup.cup en el área de no terminales esta declarado.

Ejemplo: Atributos sintetizados