Publicidad

viernes, 31 de octubre de 2008

programas, proyectos y portafolios

no muy interesantes mis cosas que subo pero a mi si se me lo hacen... pero pues aqui les dejo esto:

Mucha gente ha escuchado los términos proyecto, programa y portafolio: sin embargo, pocos están seguros de lo que significa cada uno de ellos y cómo se relacionan entre sí. En este artículo desarrollado por Julio Matus Nakamura, PMP de la empresa TenStep, se da una breve explicación sobre la diferencia entre proyectos, programas y portafolios.

En general, se puede dividir todo el trabajo de una organización en dos grandes rubros: proyectos (grandes y pequeños) y soporte (operación continua). La administración puede considerarse por separado o como parte del soporte. En un nivel alto,
Los proyectos se dan cuando existen actividades nuevas, incluyendo mejoras nuevas. Tienen un inicio y fin, objetivos específicos, entregables y son únicos.
Los programas agrupan proyectos relacionados, que pueden ser ejecutados de manera secuencial o paralela.
Los portafolios son una colección de programas y proyectos que pueden estar o no interrelacionados. La persona que maneja un portafolio puede ser llamada Director o Vicepresidente, dado que este tipo de trabajo involucra la dirección de todo el trabajo, gente, presupuesto, proveedores, etcétera. Muchas veces como representante de un departamento o división. Esto es algo complicado porque los términos y los roles pueden significar cosas diferentes en su organización. ProyectosLa literatura está llena de información alrededor de dirección de proyectos que hablan acerca del rol del gerente de proyecto. Los proyectos, por definición, tienen una fecha de inicio y final. Existe un punto en el tiempo en el que el trabajo era inexistente (antes del proyecto), uno cuando el trabajo existió (el proyecto) y otro cuando el proyecto dejó de existir (después del proyecto). Este es el aspecto clave para determinar si una pieza de trabajo en realidad es un proyecto o no. Sin embargo, otras características del proyecto incluyen la definición del alcance, el presupuesto finito, resultados específicos (entregables) y unicidad (que aun cuando hayan existido proyectos similares anteriormente, estos son diferentes entre sí).ProgramasNo existe, ni cercanamente, la misma cantidad de información disponible para la administración de programas que para la administración de proyectos. Típicamente, un programa se define como una organización tipo paraguas sobre un conjunto de proyectos. Tomemos como ejemplo la puesta al hombre en la luna. El programa espacial para llegar a la luna se conformó de varias docenas (quizás cientos) de proyectos que se encargaron de todo el trabajo específico para llevar un hombre a la luna en un periodo de 7 años. Ningún trabajo es entregado a nivel de programa. Todo el trabajo es realizado a través de los proyectos subyacentes. El programa está ahí para ayudar a la dirección del esfuerzo, ayudar a iniciar nuevos proyectos, asegurar que los proyectos están progresando de acuerdo al plan, etc. Quizás por ello, toda la acción (y en consecuencia la literatura) continúa centrándose en la dirección de proyectos, y no de programas.

lunes, 27 de octubre de 2008

Propiedades de los lenguajes libres de contexto

Hola que tal compañeros espero y les pueda servir esta información saludos...Son algunas propiedades de los lenguajes libres de contexto


-Una de las definiciones alternativas y equivalentes de lenguaje libre de contexto emplea autómatas no deterministas: un lenguaje es libre de contexto si puede ser aceptado por ese autómata.
-Un lenguaje puede ser también modelado como un conjunto de todas las secuencias de terminales aceptadas por la gramática. Este modelo ayuda a entender las operaciones de conjuntos sobre lenguajes.
-La unión y concatenación de dos lenguajes libres de contexto es también libre de contexto. La intersección no tiene por que serlo.
-El inverso de un lenguaje libre de contexto es también libre de contexto, pero el complemento no tiene por que serlo.
-Los lenguajes regulares son libres de contexto por que pueden ser descritos mediante una gramática regular.
-La intersección de un lenguaje libre de contexto y un lenguaje regular es siempre libre de contexto.
-Existen Gramáticas_sensibles_al_contexto que no son libres de contexto.
-Para demostrar que un lenguaje dado no es libre de contexto, se puede emplear el -Lema del bombeo para lenguajes libres de contexto.
-El problema de determinar si una gramática sensible al contexto describe un lenguaje libre del contexto es indecidible....

sábado, 25 de octubre de 2008

AUTOMATAS FINITOS NO DETERMINISTAS

Un autómata finito no-determinista (AFND) es una quíntupla



donde:
1 es un alfabeto.
2 es un conjunto finito no vacío de estados.
3 es (una de las dos definiciones, que entre si son equivalentes) una relación,
o una funcióN.
4 es el estado inicial.
5 es el conjunto de estados finales.

Trei y Tabla Hash (una respeusta)

Jimmy hizo una entrada sobre el tema de trei y hash table, pero pedió una explicación más clara. Entonces, decidí investigar el tema. Aquí es mi entendemiento.

Imagine que se necesita un sistema para almacenar cadenas, donde cada cadena está asociada con un valor. La cadena, entonces, puede sirvir como una clave para encontrar el valor asociado. Sabiendo la clave se puede encontrar el valor asociado. Los dos pueden ser guardados como un par (clave,valor) dentro de una matriz. En cada indice de la matriz se encuentra un par. El primero elemento del par es la clave y el segundo elemento es su valor. El problema con este arbordaje es ¿en cual indice guardar cual par?, pues sin saber el indice ni se puede encontrar la clave ni su valor.

Una función hash resuelva el problema, pero en una manera problemática, mientras un trie evite el problema.

Una tabla hash usa una función hash que mapea cada clave a un número que sirve para ser un indice a la matriz. Un problema es que la misma función es, a veces, capaz de mapear dos cadenas al mismo número. En este caso se tiene que guardar un par en un otro lugar de la matriz o asociar el lugar dentro de la matriz con una otra lista, agregando a esta lista todos los pares cuya función hash mapeó al mismo indice de la matriz. Esto implica que para encontrar el par se tiene que primero usar la función hash para llegar en el indice cierto de la matriz y despues pasar por cada par en la lista guardada alla hasta encontrar el par querido, lo que hace mucho mas lenta la buscada.

Usar un trie evita el problema porque en vez de guardar pares de (cadena,valor) en una matriz, se crea un arbol que implicitimente representa las cadenas, en sus nodos terminales, pues se puede usar cualquiera cadena para seguir una trayectoria hasta llegar en el nodo que representa (implicitamente) la cadena. Alla, se puede encontrar el valor de la cadena.

El nombre “trie” (o arbol de prefix) viene de un juego de palabras en inglés. “Trie” viene de “retrieval”, que quiere decir buscada y recuperación de información. Pero “trie” suena como “tree”, lo que es inglés para “arbol”. La idea es que se puede tomar el conjunto de cadenas para cuales se quiere guardar sus valores y formar en una manera sistematica un arbol que contiene nodos para cada cadena y cada prefijo de cada cadena. El nodo de encima es una cadena vacía. Despues viene una capa con nodos que representan (por su posición en la capa) el primero carácter de cada cadena, listado en orden del lado izquierdo al lado derecho (o vice-versa), seguido por una capa abajo con nodos que representan los primeros dos carácteres de cada cadena, etc, pues entre un nodo de la primera capa y un nodo de la segunda capa se va agregando (implicitamente, por su orden en la capa) el segundo carácter de la cadena. Esta continua hasta que se llega en nodos terminales, que representan las cadenas completas. Si más de una cadena comparte el mismo primero carácter, el nodo va conectar con más que un nodo de la capa abajo, y igual. para las otras capas. (Vé [http://en.wikipedia.org/wiki/Image:Trie_example.svg] por un gráfico de esto).

Asi guardado, es fácil, entonces, encontrar el nodo que representa cualquiera cadena, y asi encontrar el valor asociado con la cadena, guardado en el nodo. Se empieza en el nodo encima del arbol y se busca para el nodo abajo que debe representar el primero carácter. Por ejemplo, se todos las cadenas empiezan con “a” o “b” se sabe que el nodo que representa “a” es el primero nodo y el nodo que representa “b” es el segundo nodo. Si todas las cadenas que comienzan con “b” también comienzan con “ba”, “be” o “bo” se sabe que se encuentra el nodo para “be” en el segundo nodo por abajo del nodo para “b”, etc.

Como Jimi dice:

Un trie es un caso especial de autómata finito determinista (S, Σ, T, s, A), que sirve para almacenar un conjunto de cadenas E en el que:
Σ es el alfabeto sobre el que están definidas las cadenas;
S, el conjunto de estados, cada uno de los cuales representa un prefijo de E;
la función de transición: ; está definida como sigue: T(x,σ)...

Σ es un conjunto de todos los caracteres (o sea, letras) de todas las cadenas (o sea, palabras) que queremos guardar.

Se puede notar que un arbol parece a un tipo de automáta finito determinista para procesar las cadenas representadas (por los nodos terminales) por dentro de si mismo. Piense en la representación gráfica de tal automáta. Su estado inicial, s, es la cadena vacía, el nodo encima del trie. Cada nodo representa un prefijo de cada cadena, siendo uno (o cero si se toma en cuenta el estado incial) o más caracteres de la cadena. Asi, se puede representar también un estado del autómata (elemento de S). Los nodos terminales, los que representan las cadenas completas, son estados de aceptación (elementos de A). Asi , la función de transición T(x,σ) sirve para crear las lineas conectando los nodos de una capa con los nodos de la capa abajo. T toma el prefijo representado por el nodo arriba y el proximo carácter de la cadena y mapea esto a un nodo abajo. (Por ejemplo, la función de transición mapea (“tr”,'i') al estado que representa “tri” y luego toma (“tri”,'e') y lo mapea al estado de aceptación que representa “trie”.)

Asterisk

Me intereso esto y lo quise subir talvez tambien no tiene q ver con la materia pero es noticia.....
Puede que la noticia no sea nueva para muchos seguidores de las noticias sobre Asterisk y VoIP, pero ando poniéndome al día y hay noticias por las que hay que pasar.
En el Astricon que acaba de terminar Digium ha anunciado un nuevo proyecto de colaboración con una empresa que todos conocemos bastante bien: Skype.
Este proyecto consiste en un nuevo canal compatible con Skype para conectar esta red a Asterisk de forma similar a la que ya hace Asterisk con servicios como GoogleTalk, y de hecho las reacciones no han tardado en llegar.
Skype es un mal protocolo a nivel de red (aprovecha el ancho de banda del cliente para transportar audio a terceros) pero muy bueno para traspasar firewalls (lo cual puede hacer que en empresas el administrador de red lo vuelvan loco), podría abrirse un debate sobre las ventajas y desventajas de utilizar este sistema partiendo de la máxima que es un protocolo cerrado y propietario de una empresa, y esta dependencia nunca es buena.
El funcionamiento es similar al del canal chan_gtalk únicamente cambiaría el ‘gtalk’ por ’skype’ por lo que para hacer una llamada únicamente habría que enviarla así:
exten=>1001,1,Dial(Skype/1001.dominio)
Cuando adelantamos las novedades que incorporaría Asterisk 1.6, comentamos que los desarrolladores se habían propuesto varios objetivos entre los que se encontraban:
- Un menor consumo de memoria
- Capacidad para funcionar en entornos realmente grandes
Cualquiera que haya seguido el desarrollo de las versiones betas que hay actualmente y que compruebe el consumo de memoria de Asterisk 1.2, Asterisk 1.4 y las betas de Asterisk 1.6, podría descubrir que Asterisk 1.2 únicamente cargaba en memoria los módulos que utiliza mientras que Asterisk 1.4 los carga todos aunque solo habilita aquellos que utiliza (una prueba de ello podeis tenerla si provocais un crash en algún módulo y con el servicio Asterisk activado, reescribis el módulo en el directorio /usr/lib/asterisk/modules, vereis como de inmediato, el sistema completo explota sin haber cargado a mano el nuevo módulo). Asterisk 1.6 vuelve a sus orígenes en cuanto a la carga de módulos y únicamente consume memoria por los módulos que realmente se utilizan (algo que era evidentemente necesario).
Ahora parece que se están centrando en mejorar la integración de Asterisk en sistemas clusterizados (varios sistemas que virtualmente se comportan como uno solo multiplicando sus capacidades de procesador, memoria, espacio, y un largo etcétera.)
Concretamente, uno de los primeros objetivos en este sentido es el de propagar la información de los usuarios (libres, ocupados, hablando, no disponible, etc.) entre los distintos servidores que forman el cluster.
Para ello, el equipo de desarrolladores de Asterisk están utilizando un framework especial para programar en este tipo de infraestructuras llamada OpenAIS y así han creado un nuevo módulo llamado res_ais que permite controlar el estado de una extensión situada en otro Asterisk perteneciente a uno de los nodos del cluster.
El siguiente paso será propagar esta información a través de Asterisk conectados entre sí por el protocolo DUNDi.
que es DUNDI:
PBX Asterisk, ha lanzado un sistema P2P para encontrar gateways de red para servicios telefónicos, llamado DUNDi (Distributed Universal Number Discovery), completamente libre (aunque no he verificado si es propietario o de fuente abierta). Según Digium, este sistema permite "un bypass verdadero sin cargos de suscripción, sin publicación de información, y con una aceptable política de uso para prevenir llamadas no deseadas en VoIP". DUNDi es un protocolo codificado para intercambiar y descubrir rutas de dialplans arbitrarios, además de ser ligero y ocupar poco ancho de banda: por medio de éste, una empresa puede crear un completo PBX federado, "sin punto central de falla" y puede agregar nuevas extensiones, gateways y otros recursos para un sistema de servidores de comunicación confiables. Información detallada de DUNDi puede ser consultada ..... En los link que les deje........
Bueno espero y alguien lo lea si no pues ni modo adios compañeros....................
ATTE: Jimmy

Máquina virtual

(VirtualBox)
Hola compañeros, bueno como antes de empezar este semestre no tenia ni idea de lo que es una maquina virtual aquí les dejo una breve definición y algunas características.

Una máquina virtual es un software que emula a un ordenador y puede ejecutar programas como si fuese un ordenador real. Este software en un principio fue definido como "un duplicado eficiente y aislado de una máquina física". La acepción del término actualmente incluye a máquinas virtuales que no tienen ninguna equivalencia directa con ningún hardware real.

Una característica esencial de las máquinas virtuales es que los procesos que ejecutan están limitados por los recursos y abstracciones proporcionados por ellas. Estos procesos no pueden escaparse de este "ordenador virtual".

Uno de los usos domésticos más extendidos de las máquinas virtuales es ejecutar sistemas operativos para "probarlos". De esta forma podemos ejecutar un sistema operativo que queramos probar (Linux, por ejemplo) desde nuestro sistema operativo habitual (Windows por ejemplo) sin necesidad de instalarlo directamente en nuestro ordenador y sin miedo a que se desconfigure el sistema operativo primario.

Ojala y les pueda ser de ayuda esta información, por lo menos para que tengan una idea mas abierta de lo que es una maquina virtual.

Saludos y hasta pronto.

MySQL

Hola compañeros soy Vicente Alfredo, esta vez subo algo que considero muy importante es acerca de mySQL espero que les guste.

Conectándose y desconectándose al servidor MySQL

Para conectarse al servidor, usualmente necesitamos de un nombre de usuario (login) y de una contraseña (password), y si el servidor al que nos deseamos conectar está en una máquina diferente de la nuestra, también necesitamos indicar el nombre o la dirección IP de dicho servidor. Una vez que conocemos estos tres valores, podemos conectarnos de la siguiente manera:

shell> mysql -h NombreDelServidor -u NombreDeUsuario -pCuando ejecutamos este comando, se nos pedirá que proporcionemos también la contraseña para el nombre de usuario que estamos usando.

Si la conexión al servidor MySQL se pudo establecer de manera satisfactoria, recibiremos el mensaje de bienvenida y estaremos en el prompt de mysql:
shell>mysql -h casita -u root -p
Enter password: ******

Welcome to the MySQL monitor. Commands end with ; or \g.Your MySQL connection id is 5563 to server version: 3.23.41

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>Este prompt nos indica que mysql está listo para recibir comandos.

Algunas instalaciones permiten que los usuarios se conecten de manera anónima al servidor corriendo en la máquina local. Si es el caso de nuestra máquina, debemos de ser capaces de conectarnos al servidor invocando a mysql sin ninguna opción:

shell> mysqlDespués de que nos hemos conectado de manera satisfactoria, podemos desconectarnos en cualquier momento al escribir "quit", "exit", o presionar CONTROL+D.

La mayoría de los ejemplos siguientes asume que estamos conectados al servidor, lo cual se indica con el prompt de mysql.

Ejecutando algunas consultas

En este momento debimos de haber podido conectarnos ya al servidor MySQL, aún cuando no hemos seleccionado alguna base de datos para trabajar. Lo que haremos a continuación es escribir algunos comandos para irnos familiarizando con el funcionamiento de mysql

mysql> SELECT VERSION(), CURRENT_DATE;+-----------+--------------+ VERSION() CURRENT_DATE +-----------+--------------+ 3.23.41 2002-10-01 +-----------+--------------+1 row in set (0.03 sec)

mysql> Este comando ilustra distintas cosas acerca de mysql:

Un comando normalmente consiste de un sentencia SQL seguida por un punto y coma. Cuando emitimos un comando, mysql lo manda al servidor para que lo ejecute, nos muestra los resultados y regresa el prompt indicando que está listo para recibir más consultas. mysql muestra los resultados de la consulta como una tabla (filas y columnas). La primera fila contiene etiquetas para las columnas. Las filas siguientes muestran los resultados de la consulta. Normalmente las etiquetas de las columnas son los nombres de los campos de las tablas que estamos usando en alguna consulta. Si lo que estamos recuperando es el valor de una expresión (como en el ejemplo anterior) las etiquetas en las columnas son la expresión en sí. mysql muestra cuántas filas fueron regresadas y cuanto tiempo tardó en ejecutarse la consulta, lo cual puede darnos una idea de la eficiencia del servidor, aunque estos valores pueden ser un tanto imprecisos ya que no se muestra la hora del CPU, y porque pueden verse afectados por otros factores, tales como la carga del servidor y la velocidad de comunicación en una red.

Las palabras clave pueden ser escritas usando mayúsculas y minúsculas. Las siguientes consultas son equivalentes:

mysql> SELECT VERSION(), CURRENT_DATE;mysql> select version(), current_date;
mysql> SeLeCt vErSiOn(), current_DATE;Aquí está otra consulta que demuestra como se pueden escribir algunas expresiones matemáticas y trigonométricas:
mysql> SELECT SIN(PI()/4), (4+1)*5;+-------------+---------+ SIN(PI()/4) (4+1)*5 +-------------+---------+ 0.707107 25 +-------------+---------+Aunque hasta este momento se han escrito sentencias sencillas de una sóla línea, es posible escribir más de una sentencia por línea, siempre y cuando estén separadas por punto y coma:
mysql> SELECT VERSION(); SELECT NOW();+-----------+ VERSION() +-----------+ 3.23.41 +-----------+1 row in set (0.01 sec)
+---------------------+ NOW() +---------------------+ 2002-10-28 14:26:04 +---------------------+1 row in set (0.01 sec)Un comando no necesita ser escrito en una sóla línea, así que los comandos que requieran de varias líneas no son un problema. mysql determinará en donde finaliza la sentencia cuando encuentre el punto y coma, no cuando encuentre el fin de línea.

Aquí está un ejemplo que muestra un consulta simple escrita en varias líneas:

mysql> SELECT-> USER(),-> CURRENT_DATE;+----------------+--------------+ USER() CURRENT_DATE +----------------+--------------+ root@localhost 2002-09-14 +----------------+--------------+1 row in set (0.00 sec)

mysql>En este ejemplo debe notarse como cambia el prompt (de mysql> a ->) cuando se escribe una consulta en varias líneas. Esta es la manera en cómo mysql indica que está esperando a que finalice la consulta. Sin embargo si deseamos no terminar de escribir la consulta, podemos hacerlo al escribir \c como se muestra en el siguiente ejemplo:

mysql> SELECT-> USER(),-> \cmysql>De nuevo, se nos regresa el comando el prompt mysql> que nos indica que mysql está listo para una nueva consulta.

En la siguiente tabla se muestran cada uno de los prompts que podemos obtener y una breve descripción de su significado para mysql:

Prompt Significado mysql> Listo para una nueva consulta. -> Esperando la línea siguiente de una consulta multi-línea. '> Esperando la siguiente línea para completar una cadena que comienza con una comilla sencilla ('). "> Esperando la siguiente línea para completar una cadena que comienza con una comilla doble (").

Los comandos multi-línea comúnmente ocurren por accidente cuando tecleamos ENTER, pero olvidamos escribir el punto y coma. En este caso mysql se queda esperando para que finalicemos la consulta:

mysql> SELECT USER()->Si esto llega a suceder, muy probablemente mysql estará esperando por un punto y coma, de manera que si escribimos el punto y coma podremos completar la consulta y mysql podrá ejecutarla:
mysql> SELECT USER()-> ;+----------------+ USER() +----------------+ root@localhost +----------------+1 row in set (0.00 sec)

mysql>Los prompts '> y "> ocurren durante la escritura de cadenas. En mysql podemos escribir cadenas utilizando comillas sencillas o comillas dobles (por ejemplo, 'hola' y "hola"), y mysql nos permite escribir cadenas que ocupen multiple líneas. De manera que cuando veamos el prompt '> o "> , mysql nos indica que hemos empezado a escribir una cadena, pero no la hemos finalizado con la comilla correspondiente.

Aunque esto puede suceder si estamos escribiendo una cadena muy grande, es más frecuente que obtengamos alguno de estos prompts si inadvertidamente escribimos alguna de estas comillas.

Por ejemplo:

mysql> SELECT * FROM mi_tabla WHERE nombre = "Lupita AND edad <>Si escribimos esta consulta SELECT y entonces presionamos ENTER para ver el resultado, no sucederá nada. En lugar de preocuparnos porque la consulta ha tomado mucho tiempo, debemos notar la pista que nos da mysql cambiando el prompt. Esto nos indica que mysql está esperando que finalicemos la cadena iniciada ("Lupita).

En este caso, ¿qué es lo que debemos hacer? . La cosa más simple es cancelar la consulta. Sin embargo, no basta con escribir \c, ya que mysql interpreta esto como parte de la cadena que estamos escribiendo. En lugar de esto, debemos escribir antes la comilla correspondiente y después \c :

mysql> SELECT * FROM mi_tabla WHERE nombre = "Lupita AND edad <> " \cmysql>El prompt cambiará de nuevo al ya conocido mysql>, indicándonos que mysql está listo para una nueva consulta.

Es sumamente importante conocer lo que significan los prompts '> y ">, ya que si en algún momento nos aparece alguno de ellos, todas la líneas que escribamos a continuación serán consideradas como parte de la cadena, inclusive cuando escribimos QUIT. Esto puede ser confuso, especialmente si no sabemos que es necesario escribir la comilla correspondiente para finalizar la cadena, para que podamos escribir después algún otro comando, o terminar la consulta que deseamos ejecutar.

Eso es todo, si quieren ver todo el tutorial completo pueden ir a: http://www.programatium.net/cursos/mysql/

Autómatas

Esta entrada es a petición de la compañera Patty, nos redactó este breve resumen, espero que lo puedan estudiar para su examen.

Saludos.
A continuación el enlace:
http://cid-c6255721a9cb37f4.skydrive.live.com/self.aspx/P%c3%bablico/automatas.pdf

¿Cuales son las ventajas de Linux frente a Windows?, ¿en qué se diferencian?

Hola compañeros, como hace poco el maestro nos dio a elegir si seguiamos trabajando en linux o regresabamos a windows, les tengo informacion para que ustedes comparen:

La instalación:
En Linux a pesar de todos los esfuerzos la instalación no resulta sencilla siempre, pero te permite personalizar totalmente los paquetes que quieras instalar.
En Windows la instalación es mínimamente configurarle aunque es muy sencilla. La
compatibilidad:
Ninguno de los dos sistemas operativos son totalmente compatibles con el Hardware, a pesar de que Windows se acerca más, los dos están cerca de conseguirlo.
Aunque Linux no esta detrás de ninguna casa comercial gracias a su elevada popularidad ofrece una alta compatibilidad ofreciendo, además, actualizaciones frecuentes.
Windows al ser parte de Microsoft intenta ofrecer una gran cantidad de drivers ya que su gran poder económico hace que las empresas mismas de hardware creen sus propios drivers. Software:
Linux al tener menos software en algunos campos sufre una menor aceptación por parte de las empresas, aunque gracias a los apoyos de empresas como Sun Microsystems o IBM se ha logrado muchos avances.
Windows al ser el más fácil de usar en las empresas, posee una gran cantidad de software. Robustez:
Linux se ha caracterizado siempre por la robustez de su sistema ya que pueden pasar meses e incluso años sin la necesidad de apagar o reiniciar el equipo, también si una aplicación falla simplemente no bloquea totalmente al equipo.
En Windows siempre hay que reiniciar cuando se cambia la configuración del sistema, se bloquea fácilmente cuando ejecuta operaciones aparentemente simples por lo que hay que reiniciar el equipo.

Conclusión:
Tanto Windows como Linux tienen su ventajas y inconvenientes, aunque desde un punto de vista más técnico Linux sale ganando.

Razones para cambiar:

  • Es software libre, lo que quiere decir que no hay que pagar nada por el sistema en sí.
  • Es un sistema operativo muy fiable ya que hereda la robustez de UNIX.
  • Ideal para las redes ya que fue diseñado en Internet y para Internet
  • No es cierto que tenga pocos programas, solo en algún campo muy especifico.
  • Es 100% configurarle.
  • Es el sistema más seguro, ya que al disponer del código fuente cualquiera puede darse cuanta de algún fallo, se puede decir que decenas de miles de personas velan por tu seguridad.
  • Existe muchísima documentación, también en español gracias a los proyectos como LUCAS.
  • Cuenta con el soporte de muchas grandes empresas como IBM, Corel, Lotus, Siemens, Motorola, Sun, etc.
  • Puedes encontrar ayuda en millones de sitios en Internet como los foros.
  • Es muy portable, si tienes un Mac un Alpha o un Sparc puedes usar Linux sin problemas.

viernes, 24 de octubre de 2008

cultura general

hola compañeros pues aquí en busca de nuevos temas para subirlos al blog encontré esto que no tiene que ver con la materia pero es algo de cultura general, bueno espero y tengan tiempo de leer .

BlackLight Power, Inc. es el inventor de una nueva fuente de energía primaria con aplicaciones para calefacción, generación de energía distribuida, generación de energía central, y fuerza motriz. Se basa en un nuevo proceso químico de la liberación de la energía latente del átomo de hidrógeno, el Proceso BlackLight. El 20 de octubre de 2008, anunció BlackLight fuera de sitio de validación de un reactor de 50 kW. Rowan Los científicos confirmaron la BLP 1 kW y 50 kW de potencia fuente de las pruebas correspondientes a 20 kj megajulios y 1,0, respectivamente. Análisis químico del producto reactivo y R-Ni polvo podrían representar menos del 1% de la energía observada de la química conocida. . BlackLight los resultados han sido publicados y ampliamente reproducidos por grupos independientes.
BlackLight del filial, Millsian Inc, ha desarrollado un potente software de modelado basado en un revolucionario, clásico-física para resolver los átomos y las moléculas. La versión 1.0 del software está disponible.
BlackLight está investigando aplicaciones de la microelectrónica, las películas de diamante, baterías para portátiles de electrónica, propulsoras y enérgicas.

bueno niños me despido deseándoles mucha suerte en sus examenes que la gran mayoría estamos teniendo y estudien para el de sistema va cuidense y que tengan bonito fin de semana ok....

lunes, 20 de octubre de 2008

que es un trie y una tabla hash (duda)

Como no pude subir ni el sabado ni domingo por problemas ya que fui a un mandado donde no existen las maquinas y pues no pude pero quieria subir esto aunque no cuente pero cuando busque automatas finitos encontre esta dos cosas que no les entendi mucho:
Un trie es un caso especial de autómata finito determinista (S, Σ, T, s, A), que sirve para almacenar un conjunto de cadenas E en el que:
Σ es el alfabeto sobre el que están definidas las cadenas;
S, el conjunto de estados, cada uno de los cuales representa un prefijo de E;
la función de transición: ; está definida como sigue: T(x,σ) = xσ si , e indefinida en otro caso;
el estado inicial s corresponde a la cadena vacía λ;
el conjunto de estados de aceptación es igual a E.
Su nombre procede del término inglés retrieva.
y
Como sustitución de una Tabla hash
Un Trie puede usarse para reemplazar una Tabla hash, sobre la que presenta las siguientes ventajas:
el tiempo de búsqueda en una Tabla hash imperfecta es del orden de O(n), mientras que en un trie es del orden de O(l). Esto es debido a las colisiones de claves.
en un trie no se producen colisions de claves
no hay que definir una función de hash, o modificarla si añadimos más claves
los contenedores que almacenan distintos valores asociados a una única clave sólo son necesarios si tenemos más de un valor asociada a una única clave. En una tabla hash siempre se necesitan estos contenedores para las colisiones de clave
un trie puede proporcionarnos un ordenamiento alfabético de las entradas por clave
Las principales desventajas de los tries respecto a las tablas hash son:
en determinados casos pueden ser más lentos que las tablas hash en la búsqueda de datos, especialmente si los datos son consultados desde dispositivos de almacenamiento secundario, como disco duro, donde el tiempo de acceso es elevado con respecto a memoria principal
no es sencillo representar todas las claves como cadenas, como los números reales, que pueden tener distintas representaciones en forma de cadena para un mismo número, p.ej. 1, 1.00, 1.000, +1.000,...
a menudo los tries son más ineficientes respecto al espacio que las tablas hash
los tries no suelen estar disponibles con las herramientas de desarrollo software, todo lo contrario que las tablas hash .
Estos dos conceptos: trie y tabla hash, alguna explicacion mas entendible, se los agradecederia...
Adios...

domingo, 19 de octubre de 2008

Self, Morphic, Squeak y Lively Kernal

Imagine un sistema operativo que deja uno modificar programas y si mismo mientras los dos corren. Esta idea lleva muy lejos el concepto de un ambiente de ejecución dinámica. Es el propósito del sistema Self. El ambiente gráfico de desarrollo es casi un sistema operativo. Se puede modificar objetos (instancias en memoria) dinámicamente sin modificar código para clases. Se puede accesar y modificar gráficamente los valores de atributos de objetos y aun apagar y adicionar atributos. Se puede hacer igual con los métodos de un objeto. Los atributos y métodos se llaman slots, inglés para un lugar donde se puede poner un sobre, una hoja o una ficha, o en este caso los valores de los atributos. Un slot es, entonces, una representación física y gráfica de un atributo o método, en vez de código dentro de una clase. La representación gráfica de Self se hace con una interfaz gráfica que se llama Morphic.

Dos aplicaciones de Self/Morphic son Squeak y Lively Kernal. Squeak es una descendente del lenguaje Smalltalk, y el lenguaje/sistema operativo conjunto Smalltalk-76. No es exactamente un sistema operativo, porque se puede correr encima de diferentes sistemas operativos, desde los más sencillos. Como Java, es un lenguaje y una máquina virtual que corre los programas.:

Cualquier Smalltalk, también Squeak, está compuesto de una VM (máquina virtual) específica del sistema operative donde corre y una imagen.

La imagen es el lugar dónde los objetos viven, objetos del ambiente como el compilador, el debugger, etc. y los objetos del dominio de la solución. [http://www.programacion.com/articulo/squeak/]

Porque programas del sistema son escritos en Squeak, y usan objetos. Entonces, ellos también pueden ser modificados gráficamente por el programador/usuario.

Self/Morphic fue portado a JavaScript para usar con Lively Kernal, una herramienta de Sun Microsystems para desarrollo de aplicaciones para un navegador de web (ahora Firefox o Safari). Porque utiliza solo los recursos de la navegadora , no se necesita instalar nada más para poder usarlo. Tampoco se necesita usar XML, HTML, CSS, etc. Solo se necesita usar JavaScript. Pero ni se necesita saber JavaScript, porque mucho de lo que se puede hacer es con objetos gráficos. Se puede decir que es un “Visual JavaScript”, utilizando SVG (Scalable Vector Graphics).

Para ver una demostración,[http://www.youtube.com/watch?v=gGw09RZjQf8]

sábado, 18 de octubre de 2008

ARBOLES DE SINTAXIS ABSTRACTA


Árboles de sintaxis abstracta (ASTs)

Los ASTs (Abstract Syntax Trees, o Árboles de Sintaxis Abstracta) sirven para
manejar la información semántica de un código. La forma más eficiente de manejar la
información proveniente de un lenguaje de programación es la forma arbórea; por éso la
estructura de datos elegida es un árbol. Además, construyendo ASTs a partir de un texto
podemos obviar mucha información irrelevante; si un AST se construye bien, no habrá
que tratar con símbolos de puntuación o azúcar sintáctica en el nivel semántico.
Al contrario que los flujos, una estructura en árbol puede especificar la relación
jerárquica entre los símbolos de una gramática.
Los ASTs pueden intervenir en varias fases del análisis: como producto del
análisis sintáctico, como elemento intermedio en sucesivos análisis semánticos y como
entrada para la generación de código.

Diagramas de Flujo

Hola que tal compañeros....Les paso el siguiente link para que leean un poco sobre los diagramas de flujo..es un archivo en PDF lo estuve revisando y se me hizo interesanta y nos puede ayuda en la realizacion de nuestro proyecto de Programación de sistemas...Saludos y por esta semana es lo que puedo subir..

Yrvin Ossiel Dorantes Carreon
http://usuarios3.arsystel.com/pnfsi/docs/pnfsi/otros/ejerflujo.pdf

Little Big Disk Quadra, de LaCie


Se trata de un disco duro diminuto en comparación a la gran capacidad de almacenamiento que puede albergar en su interior. Y es que en el dispositivo diseñado por Neil Poulton para LaCie podrás guardar hasta un terabyte (TB) de datos y acceder a ellos a gran velocidad.

Por su reducido tamaño (ocupa el mismo espacio que un teléfono inalámbrico) y su peso (650 gramos), esta unidad resulta tremendamente ultraportátil. Y gracias también a su sistema de alimentación a través del bus FireWire, que permite prescindir del cable de corriente.

Cuenta con cuatro interfaces diferentes para lograr una conectividad universal con ordenadores de sobremesa y portátiles, Mac y Windows. Tiene un puerto Hi-Speed USB 2.0, dos conexiones FireWire 800 (compatibles con FireWire 400) y un puerto eSATA de 3 Gbits. Alcanza una velocidad de rotación de 5.400 rpm y presume de una carcasa de aluminio con disipador del calor para un trabajo intensivo ultrasilencioso. Su valor ronda los 549 €.

EPOC, un casco que lee la mente



Aunque parece ciencia ficción, se trata en realidad del EPOC, un casco que llegará a las tiendas estadounidenses a finales del presente año y que, según sus diseñadores, revolucionará el sector de los videojuegos teniendo importantes aplicaciones en áreas como la medicina o la defensa.

Desarrollado por la firma australiana 'Emotiv Systems', EPOC es capaz de leer los impulsos eléctricos cerebrales y transformarlos en movimientos del cursor.
Sus creadores han adelantado que costará 299 dólares (200 euros aproximadamente) y estará disponible en Estados Unidos en los próximos meses, aunque todavía se desconoce si se distribuirá en solitario o en cooperación con alguna consola para videojuegos.

"Va a cambiar la cara de los juegos electrónicos haciendo posible que los juegos sean controlados e influenciados por la mente del jugador", afirmaba la presidenta y cofundadora de Emotiv. "Cuando las neuronas interactúan, se emite un impulso eléctrico que puede ser observado usando electroencefalografía no intrusiva", explica, "EPOC usa esta tecnología para medir las señales". El casco es capaz también de detectar más de 30 expresiones faciales y emociones del usuario y "ha sido probado con cientos de personas y siempre ha funcionado". El resultado es que el jugador puede realizar acciones básicas como mover o hacer desaparecer objetos en la pantalla sólo con imaginar estas acciones. Además, EPOC es capaz de analizar el estado de ánimo del usuario y, por ejemplo, aumentar la dificultad del juego si detecta que está aburrido.

En un futuro, la capacidad de EPOC para interpretar las expresiones faciales también podrá aplicarse a los videojuegos, afirman en Emotiv. Así, por ejemplo, el jugador sólo tendrá que sonreír para hacer sonreír a su avatar –personaje que representa al usuario– en Second Life en lugar de teclear esta acción.
Emotiv Systems ha trabajado durante un lustro en este producto y ha preferido centrarse en sus aplicaciones para videojuegos, pero sus responsables reconocen que los usos podrían ir mucho más allá. "Consideraremos también en el futuro las oportunidades que ofrece el sector médico". Entre otras aplicaciones potenciales se han citado "la televisión interactiva, el diseño de accesibilidad, la investigación de mercados o la seguridad". Emotiv ha firmado además un acuerdo con el fabricante de ordenadores IBM para explorar el potencial de esta tecnología "en mercados estratégicos empresariales y mundos virtuales".

Los que han tenido la oportunidad de probar el casco afirman, no obstante, que cuesta un poco hacerse a él. El usuario debe ajustar hasta 16 sensores y es algo complicado acostumbrarse al funcionamiento, pero una vez logrado el aparato es muy intuitivo.

Si se cumplen los planes de sus fabricantes, EPOC promete ser la sensación de esta temporada navideña, pero algunos expertos dudan de que vaya a convertirse rápidamente en un fenómeno de masas o en el sucesor de la Wii ya que aún no se cree que esté preparado para ser tan preciso como sería necesario para funcionar como un sustituto de la consola en la mayoría de los juegos.

MEMORIA VIRTUAL

Hola compañeros, el contenido que se refiere a la memoria lo vimos en arquitectura II, pero aqui hay informacion sobre una alternativa para que como programadores hagamos que nuestros desarrollos sean mas efiscientes,y s epueda ocupar mas memoria principal de la que se tiene, ojala les sirva, creo que es una gran alternativa

La Memoria virtual es un concepto que permite al software usar más memoria principal que la que realmente posee el ordenador. La mayoría de los ordenadores tienen cuatro tipos de memoria: registros en la CPU, la memoria cache (tanto dentro como fuera del CPU), la memoria física (generalmente en forma de RAM, donde la CPU puede escribir y leer directa y razonablemente rápido) y el disco duro que es mucho más lento, pero también más grande y barato.
Muchas aplicaciones requieren el acceso a más información (código y datos) que la que se puede mantener en memoria física. Esto es así sobre todo cuando el sistema operativo permite múltiples procesos y aplicaciones ejecutándose simultáneamente. Una solución al problema de necesitar mayor cantidad de memoria de la que se posee consiste en que las aplicaciones mantengan parte de su información en disco, moviéndola a la memoria principal cuando sea necesario. Hay varias formas de hacer esto. Una opción es que la aplicación misma sea responsable de decidir qué información será guardada en cada sitio (segmentación), y de traerla y llevarla. La desventaja de esto, además de la dificultad en el diseño e implementación del programa, es que es muy probable que los intereses sobre la memoria de dos o varios programas generen conflictos entre sí: cada programador podría realizar su diseño teniendo en cuenta que es el único programa ejecutándose en el sistema. La alternativa es usar memoria virtual, donde la combinación entre hardware especial y el sistema operativo hace uso de la memoria principal y la secundaria para hacer parecer que el ordenador tiene mucha más memoria principal (RAM) que la que realmente posee. Este método es invisible a los procesos. La cantidad de memoria máxima que se puede hacer ver que hay tiene que ver con las características del procesador. Por ejemplo, en un sistema de 32 bits, el máximo es 232, lo que da aproximadamente 4000 Megabytes (4 Gigabytes). Todo esto hace el trabajo del programador de aplicaciones mucho más fácil, al poder ignorar completamente la necesidad de mover datos entre los distintos espacios de memoria.
Aunque la memoria virtual podría estar implementada por el software del sistema operativo, en la práctica casi siempre se usa una combinación de hardware y software, dado el esfuerzo extra que implicaría para el procesador.

Operación básica
  • Cuando se usa Memoria Virtual, o cuando una dirección es leída o escrita por la CPU, una parte del hardware dentro de la computadora traduce las direcciones de memoria generadas por el software (direcciones virtuales) en:
    la dirección real de memoria (la dirección de memoria física), o
  • una indicación de que la dirección de memoria deseada no se encuentra en memoria principal (llamado excepción de memoria virtual).
En el primer caso, la referencia a la memoria es completada, como si la memoria virtual no hubiera estado involucrada: el software accede donde debía y sigue ejecutando normalmente. En el segundo caso, el sistema operativo es invocado para manejar la situación y permitir que el programa siga ejecutando o aborte según sea el caso. La memoria virtual es una técnica para proporcionar la simulación de un espacio de memoria mucho mayor que la memoria física de una máquina. Esta "ilusión" permite que los programas se ejecuten sin tener en cuenta el tamaño exacto de la memoria física.

MEMORIA VIRTUAL

viernes, 17 de octubre de 2008

¿Qué es M4?

hola compañeros buscando un poco lo de m4 que es procesador de macros encontre lo siguiente espero les sirva de algo.

M4 es un procesador de macros. Por macros se entiende expansiones de texto. La mayor utilidad que se le ha dado a M4 ha sido en las famosas autotools de GNU (autoconf, automake, etc). Realmente el procesador de M4 se limita a subsituir ciertas cadenas de texto por otras (a lo que llamaremos expansión), así podemos usarlo para tantas situaciones como nuestra imaginación nos permita. Otro ejemplo es utilizar M4 para escribir páginas web (creando una abstracción por encima del HTML).De M4 lo único que cuesta aprender es la forma de expansión que lleva a cabo al encontrar una macro.

En M4 existen dos tipos de comentarios: los que se se omiten en el resultado de la expansión y los que no se interpretan pero pasan tal cual hacia la salida estándar

DEFINICIÓN DE MACRO:

Una macro o macroinstrucción es una serie de instrucciones que se almacenan para que se puedan ejecutar de forma secuencial mediante una sola llamada u orden de ejecución.Una macro o macroinstrucción es una serie de instrucciones que se almacenan para que se puedan ejecutar de forma secuencial mediante una sola llamada u orden de ejecución.

Bueno niños no vemos en clase va...............

Definición del proyecto de Programación de sistemas

Definición del proyecto de Programación de sistemas

Diseñar un programa de sistemas que permita generar el diagrama de flujo de un código escrito en C.

En términos generales el programa deberá permitir ubicar un código en C y generar de forma automática su correspondiente diagrama de flujo, dicho diagrama deberá poder almacenarse en un archivo de texto. La alternativa es manipular imágenes y guardar el diagrama de flujo en formato de imagen (png, jpg, gif, tiff, etc.)

El programa deberá diseñarse para ser ejecutado en cualquier distro de Linux, y en caso de ocupar el estándar POSIX, se podrá ejecutar en otros sistemas operativos que hagan uso de dicho estándar.

Elaborar un reporte:

Explicar el diseño modular del programa.

Explicar de forma breve cada una de las funciones ocupadas.

Entregar:

Documentación básica.

Código.

Ejecutable.

En CD en un sobre bolsa.

Cualquier duda podrán enviar un mail a: ocruz22@gmail.com

martes, 14 de octubre de 2008

ANALIZADOR SINTACTICO

Hola compañeros aquí les dejo algo sobre un analizador sintactico, que por la información que encontré creo que tiene una gran relación con los autómatas pues aquí hace referencia a los autómatas de pila eso ya me confundió un poco mas pero en fin estos temas apenas los veremos en clase espero les agrade la información.

Un analizador sintáctico ( Parser ) es un programa que reconoce si una o varias cadenas de caracteres forman parte de un determinado lenguaje. Los lenguajes habitualmente reconocidos por los analizadores sintácticos son los lenguajes libres de contexto. Cabe notar que existe una justificación formal que establece que los lenguajes libres de contexto son aquellos reconocibles por un autómata de pila, de modo que todo analizador sintáctico que reconozca un lenguaje libre de contexto es equivalente en capacidad computacional a un autómata de pila.

El autómata de pila (se abrevia PDA de sus siglas en inglés Push-Down Autómata) tiene una cinta de entrada, un control finito y una pila. La pila es una cadena de símbolos de algún alfabeto. El símbolo que se encuentra más a la izquierda se considera como que está en la “cima”. El dispositivo será no determinístico y tendrá un número finito de alternativas de movimiento en cada situación.Cada alternativa consiste en un estado posterior para el control finito y una cadena (posiblemente vacía) de símbolos, para sustituir al símbolo que se encuentra en la cima de la pila. Después de seleccionar una alternativa, la cabeza de entrada avanza un símbolo

domingo, 12 de octubre de 2008

Reflexión y Metaprogramación

En mi entrada anteriór, definé un metaprograma como un programa que genera otros programas y escribí que reflexión es diferente que metaprogramación porque se trata de ejecución, como un intérprete y no de generación de un otro programa, como un compilador. Hoy queiro examinar de nuevo las definiciones y mostrar que reflexión, si, puede ser un caso especial de metaprogramación. También queiro impartar una idea más claro sobre como reflexión funciona.

El prefixo “meta-”, en el sentido moderno, quiere decir “sobre (su própria categoría)” (http://en.wikipedia.org/wiki/Meta). O sea, quiere decir que algo tiene la categoría de si mismo como objeto, ou algo de esta categoría. En este sentido, un metaprograma es un programa que tiene como objeto un programa, sea un otro programa o si mismo. En el último caso se denomina “reflexión”.

¿O que quiere decir que algo es un objeto? Que se puede ser representado y manipulado. Para un programa tener el poder de manipular si mismo o un otro programa, tiene que tener el poder de representar y manipular los elementos del programa, tal como bloques de código, clases, métodos, protocolos, etc. De los elementos que se puede manipular sin restricción se denominan “objetos de primera" (http://en.wikipedia.org/wiki/First-class_object#cite_note-0)

Cualquier programa en cualquier lenguaje puede facilmente manipular datos (siendo en si mismo representaciones), pues los lenguajes son construidos para hacer esto. Los métodos sirven para modificar los datos (que normalmente refieren a cosas fuera del programa). El método tiene aceso a los datos, sea porque son globales o porque reciben los datos como argumentos. El método manipula los datos, y (en el caso que no son globales) regrese los datos al método que lo llamó.

Programas Que Modifican Sus Elementos

Unos lenguajes, como LISP y Scheme habilitan que se pase no solo datos al método, si no bloques de código, clases, métodos, protocolos, etc. Asi, se puede modificar estos últimos y, en efecto, modificar el programa. O sea, se puede definir un método capaz de generar o modificar otros métodos. Por ejemplo, se puede definir métodos abstratos que toman como argumentos metodos simples y construyan de ellos un método compuesto, que el método dá como salida, ou que descomponen métodos compuestos, criando mas simples métodos. O se puede definir un método que agrega métodos nuevos a un clase. Entonces, un clase, también puede ser pasado como un argumento a un método y regresado en forma modificado.

Programas Dinámicos: Programas Cuya Ejecución Pueden Variar

Una otra manera de variar la ejecución de un programa depende en lo que pasa en el tiempo de ejecución es dejar abierto cuales métados se van a llamar o por cuantos ciclos se va a procesar unos datos entrados por el usuario. Por ejemplo, un programa puede usar declaraciones de if.. o case.. para responder diferencialmente cuando un usario selecciona un item de un menu, o el programa puede usar un ciclo de for i =0 to string.size() para dejar abierto por cuantas veces operar en una cadena entrada por el usuario hasta que se sabe el tomaño de la cadena. O se puede definir más que un método con el mismo nombre pero donde cada variación usa diferentes argumentos (sean un número diferente de argumentos o argumentos de diferentes tipos o clases). Depende en la acción del usuario, los tipos o números de argumentos cambien y entonces el método llamado cambia.

Reflexión

¿Como es que se puede habilitar metaprogamación dinámica? Un programa que modifica sus elementos tal como métodos, etc, es un metaprograma, pero no es necesariament dinámico, pues su comportamiento puede ser determinado en el tiempo de compilación. Y los ejemplos arriba de programas dinámicos no son ejemplos de metaprogramación, pues los elementos del programa no se cambien.

Reflexión combina los dos aspectos de la metaprogramación dinámica, metaprogramción y dinamismo, y agrega un elemento más, datos sobre (o sea, una representación de) su próprio estructura y su próprio ejecución. Cualquier programa dinámico deja su comportamiento variar de acuerdo con datos entrados por un usuario, un servidor, etc. Con reflexión, el comportamiento de un programa varia de acuerdo con datos sobre el próprio programa y el comportamiento del próprio programa en el tiempo de ejecución.

Un contador de ciclos como metadata de reflexión
Creo que se puede tomar como un ejemplo muy sencillo de reflexión un contador de ciclos usado dentro del ciclo para determinar cuando terminar el próprio ciclo. Se puede ver el contador como una representación de lo que está sucediendo durante la ejecución del ciclo y la própria representación de número de ciclos sirve para módificar el número de ciclos ejecutado, pués la ejecución del ciclo para cuando la representación muestra que el número ha llegado al máxico del ciclo. Asi, la representación sirve para afectar la realidad representada.

En efecto, cuando un programa tiene y usa un variable como el contador descrito arriba, aquel programa está pidiendo del intérprete (lo cual es el entorno de ejecución en el caso de lenguajes compilados) que esto use el variable para monitorear y controlar el comportamiento durante ejecución del aspecto representado por el variable. En el caso del contador de ciclos, el programa pide del intérprete que no deje el número de ciclos pasar el máximo querido.

Reflexíon, entonces funciona asi: Un aspecto del programa a ser monitoreado es representado dentro del programa como variable. El intérprete debe (a) modificar el valor del variable de acuerdo con la ejecución, (b) leer el valor del variable, c) comparar el valor con lo que el programa dice que tiene que pasar y d) modificar la realidad ejecutado conforme con b) y c).

De hecho, el ejemplo del contador de ciclos no es claramente un caso de metaprogramación, pues la única cosa representada y modificada es el número de ciclos ejecutado y esto normalmente no se considera uno de los elementos básicos de un programa, tal como los métodos, clases, etc. No obstante, unos lenguajes como Java extienden está idea de reflexión y habilitan la representación de otros datos sobre un programa y su ejecución, tales como cuales clases estan siendo instanciados, cuales son sus miembros y la estructura semántica del programa. Si entiendo bien, la idea es parecido. En el caso del contador, el intérprete monitorea el contador y modifica la cosa contado, por media de terminar el ciclo cuando llega al maximo querido. En casos de monitorear clases, métodos, etc. el intérprete modifica ellos, ou por los menos (pues, todo de esto ocurre despues de la compilación) actua como se fueran diferentes en el programa.

En el caso de un contador de ciclos es fácil entender como la realidad de ciclos puede ser representada dentro de un programa y como se puede modificar la realidad de número de ciclos realmente ejecutado. En otros casos no es tan fácil entender lo que es posible representar y como se puede modificar la cosa representada. De hecho, yo no entiendo bien como reflexión funciona en los otros casos. Pero me parece que todos deben ser de acuerdo, más o menos, con el padrón de reflexión descrito arriba.

Para alguién que quiere entender al fondo lo que es reflexión y lo que es para un programa representarse a si mismo, alguién con el tiempo (lo que no lo tengo), las ganas y ha habilidad con el inglés, le sugiero la tésis original del fondador de la área de reflexión, Brian Cantwell Smith, titulada "Reflection and Semantics in a Procedural Language", disponível como PDF para bajar a (http://library.readscheme.org/page11.html).

sábado, 11 de octubre de 2008

AUTOMATAS

LOS autómatas vienen a ser mecanismos formales que ``realizan'' derivaciones en gramáticas formales. La manera en que las realizan es mediante la noción de reconocimiento. Una palabra será generada en una gramática si y sólo si la palabra hace transitar al autómata correspondiente a sus condiciones terminales. Por esto es que los autómatas son analizadores léxicos (llamados en inglés ``parsers'') de las gramáticas a que corresponden

Controlador de dispositivos (DRIVERS)

Hola compañeros, aveces cuando instalamos por ejemplo ubuntu, escuchamos que "le faltan drivers etc", entonces me di a la tarea de investigar sobre eso, creo que la información está muy sencilla para que podamos entender, espero les sirva:
Un controlador de dispositivo (llamado normalmente controlador, o, en inglés, driver) es un programa informático que permite al sistema operativo interactuar con un periférico, haciendo una abstracción del hardware y proporcionando una interfaz -posiblemente estandarizada- para usarlo. Se puede esquematizar como un manual de instrucciones que le indica cómo debe controlar y comunicarse con un dispositivo en particular. Por tanto, es una pieza esencial, sin la cual no se podría usar el hardware.
Creación de controladores
Normalmente son los fabricantes del hardware quienes escriben sus controladores, ya que conocen mejor el funcionamiento interno de cada aparato, pero también se encuentran controladores libres, por ejemplo en los sistemas operativos libres. En este caso, los creadores no son de la empresa fabricante, aunque a veces hay una cooperación con ellos, cosa que facilita el desarrollo. Si no la hay, el procedimiento necesita de ingeniería inversa y otros métodos difíciles o con riesgos legales.
Los controladores de dispositivo (device drivers en inglés) son programas añadidos al núcleo del sistema operativo, concebidos inicialmente para gestionar periféricos y dispositivos especiales. Los controladores de dispositivo pueden ser de dos tipos: orientados a caracteres (tales como los dispositivos NUL, AUX, PRN, etc. del sistema) o bien orientados a bloques, constituyendo las conocidas unidades de disco. La diferencia fundamental entre ambos tipos de controladores es que los primeros reciben o envían la información carácter a carácter; en cambio, los controladores de dispositivo de bloques procesan, como su propio nombre indica, bloques de cierta longitud en bytes (sectores). Los controladores de dispositivo, aparecidos con el DOS 2.0, permiten añadir nuevos componentes al ordenador sin necesidad de rediseñar el sistema operativo.
Los controladores de dispositivo han sido tradicionalmente programas binarios puros, similares a los COM aunque ensamblados con un ORG 0, a los que se les colocaba una extensión SYS. Sin embargo, no hay razón para que ello sea asi ya que un controlador de dispositivo puede estar incluido dentro de un programa EXE, con la condición de que el código del controlador sea el primer segmento de dicho programa.
Fallos de controladores
Al ser una parte crítica del sistema operativo, el fallo de un controlador puede ser más grave que otros errores de software, pudiendo bloquear el ordenador o incluso dañar el hardware.
Debido a que el hardware es (necesariamente) indeterminista, encontrar y solucionar un fallo en un controlador es una tarea complicada ya que no sólo hay que monitorear el programa, sino también el propio dispositivo.

Memoria Flash USB Corsair de 64 GB: casi como un disco duro!


Hola q tal compañeros..pues aqui subiendo algunas cosas...y me encontre con esta memoria usb..es increible como algo tan pequeño pueda tener mucha capacidad apenas va a salir a la venta en los mercados..pero se me hizo interesante espero que a ustedes tambien...aunque no tiene que ver con la materia...Saludos



Las memorias Flash USB Corsair han tienen una muy buena reputación en cuanto a durabilidad, transferencia de datos, y protección contra humedad/agua. Siempre pensando en innovar, la empresa ha decidido dar el próximo paso y comnezar a ilustrar a sus competidores al lanzar la nueva Cosair USB Flash de 64 GB como parte de la serie Voyager. Esta nueva memoria flash incluye software booteable para casos donde el booteo no es normal o hay errores en el sistema. El producto se empezará a vender próximamente y incluirá software de seguridad, drivers y un cable de extensión USB, además de una garantía de 10 años!

Su precio rondará los $250 dólares.

viernes, 10 de octubre de 2008

leopard


Este sistema operativo viene a modernizar 'Tiger', la penúltima versión de Mac OS y que supuso toda una revolución, por ejemplo, en cuanto al concepto de búsqueda de archivos, gracias a 'Spotlight'.

En esta ocasión, 'Leopard' ofrece cerca de 300 funciones nuevas, como 'Time Machine', que permite ir salvando de manera automática las distintas versiones de un documento mientras se modifica, de manera que se pueden recuperar a lo largo de su historial.

También destacan sus nuevas interfaces para visualizar rápidamente los documentos para clasificarlos ('Quicklook'), las mejoras de la organización de iconos en el escritorio ('Spaces'), el enriquecimiento de las funciones de videochat ('iChat') o nuevas maneras más prácticas de actualizar las páginas web elegidas.
Ofrece además funciones mejoradas de control parental de acceso o de búsqueda en el disco duro, y nuevas posibilidades de uso del cliente de correo electrónico y del navegador Safari.
Apple espera que esta nueva versión de su sistema operativo, presentado como más innovador que Windows Vista, le ayude a recuperar algo de terreno en el mercado mundial de los ordenadores personales, aún claramente dominado por Microsoft con una aplastante cuota que alcanza el 90% gracias a Windows.

No obstante, la compañía de Steve Jobs no ha perdido el tiempo en los últimos meses. La manzana ha seducido de manera creciente a los consumidores, quizá impulsada por productos estrella como el iPod o el novísimo iPhone, y logró vender en el último trimestre 2,1 millones de ordenadores. Por primera vez rompía la barrera de los dos millones de máquinas vendidas por trimestre.

Alcohol 120%


Hola amigos, en esta ocasión encontré un programa que seguramente no tiene mucho que ver con nuestra materia (programación de sistemas); este programa es una utilidad capaz de grabar CD y DVD y que crea hasta 31 unidades virtuales. Estas unidades virtuales sirven para reproducir desde el disco duro como si tuvieses insertado el DVD o CD en cuestión.
Imagínate la utilidad de esto, sin ir más lejos, tendrás los CD o DVD que más uses "montados" en tu disco duro con lo que te ahorrarás buscarlos, ponerlos y quitarlos cada vez.

Alcohol 120% realiza copias de CD a CD, crea imágenes* a disco duro, graba imágenes a CD/DVD, e incluye un buscador para localizar rápidamente las imágenes* que se encuentren en tu PC.

*imágenes: refiriéndose a archivos ISO, MDS, CCD, CUE, BWT y CDI (los tipos de imagen creados y usados por CloneCD, Nero Burning Rom y DiscJuggler entre otros además de varios estándar como el formato ISO)

• Alcohol soporta los siguientes formatos: ISO, MDS, CCD, CUE, BWT, CDI, NRG, PDI
• Cambios recientes en Alcohol:
• Cambios y mejoras internas
• Correcciones
• Para utilizar Alcohol necesitas: Sistema operativo: Win95/98/NT/ME/2000/XP/Vista Procesador: 700 MHz Memoria RAM: 128 MB

Mmm, sin duda lo más interesante de este programa es su nombre. Jajaja

En fin espero que también les parezca algo cómico su nombre.

México se integra como participante a comité ISO, y COBIT

bueno compañeros aqui les dejo algo de lo que encontre en la red, talvez no sea importante pero lo subo:

México recientemente fue aceptado como miembro "P" (participante) en el subcomité JTC1/SC7 de ISO/IEC, el cual se dedica a desarrollar y mantener estándares para ingeniería de software y sistemas.

La membresía tipo "P" le da un rol activo a un país, ya que lo obliga a emitir su voto respecto al desarrollo y aprobación de los estándares generados por el subcomité en cuestión.

El JTC1 es el comité técnico de ISO enfocado al área de Tecnologías de Información. Éste se divide en varios subcomités, y el subcomité 7 (SC7) es el que se encarga de los estándares para ingeniería de software y sistemas. A su vez, el SC7 consta de varios grupos de trabajo, para atender los diferentes estándares en desarrollo. Uno de estos es el WG24 (Working Group 24), que se dedica al desarrollo de modelos de procesos para pequeñas organizaciones (Software Life Cycles for Very Small Enterprises), y en el cual México ha tenido una participación significativa, ya que MoProSoft (Norma Mexicana de Software) está siendo usado como base.

COBIT
Los Objetivos de Control para la Información y la Tecnología relacionada (COBIT®) brindan buenas prácticas a través de un marco de trabajo de dominios y procesos, y presenta las actividades en una estructura manejable y lógica. Las buenas prácticas de COBIT representan el consenso de los expertos. Están enfocadas fuertemente en el control y menos en la ejecución. Estas prácticas ayudarán a optimizar las inversiones facilitadas por la TI, asegurarán la entrega del servicio y brindarán una medida contra la cual juzgar cuando las cosas no vayan bien.

Para que la TI tenga éxito en satisfacer los requerimientos del negocio, la dirección debe implantar un sistema de control interno o un marco de trabajo. El marco de trabajo de control COBIT contribuye a estas necesidades de la siguiente manera:


− Estableciendo un vínculo con los requerimientos del negocio
− Organizando las actividades de TI en un modelo de procesos generalmente aceptado
− Identificando los principales recursos de TI a ser utilizados
− Definiendo los objetivos de control gerenciales a ser considerados

ITIL


El marco de referencia de ITIL establece al menos hasta ahora 5 fases por las cuales todos los servicios deben de pasar

Pensemos en un ciclo de vida estándar en donde se suele comenzar por un nacimiento, también lo hacen así los servicios en donde un nuevo servicio se piensa, se diseña, se construye y se opera para medir constantemente como cumple los objetivos establecidos en el inicio.

Este ciclo de vida sigue los procesos definidos en cada etapa, por ejemplo para gestionar el portafolio de servicios (service strategy) o gestionar los incidentes y problemas (service operation).

Estos procesos están alineados al COBIT de una manera significativa, por ejemplo cuando en el dominio de COBIT Delivery & Support, en el control DS8 Assist and Advise Customers, y el subcontrol DS 8.1 Help Desk, se requiere un punto de contacto, el cual en ITIL se refiere al “la funcion de Service Desk“, que esta en la fase de “Service Operations” en donde menciona que características se requieren para habilitar esta función y recomendaciones para que funcione como punto único de contacto.

Estos marcos de referencia no están peleados, sino que se complementan, ya que hablan de la mejora de las áreas de TI, COBIT desde el punto de vista del gobierno corporativo e ITIL desde el punto de vista de los servicios mapeados a los procesos de negocio y sus habilitadores de infraestructura correspondientes.



Acerca del autor
El Ing. Edgar Velazquez Friederichsen se desempeña como ITSM Consultant en Itera, empresa dedicada a la mejora de los procesos de TI y de negocio.

lunes, 6 de octubre de 2008

La Máquina De Dios o El Milagro

La maquina de dios, el milagro o el colisionador de Hadrones. Si yo sé, suena raro hablar de una máquina llamada así, pero la verdad es que este es el proyecto más ambicioso y costoso en la historia de la humanidad, ya que se supone que el principal de esta máquina es inescrutar los secretos acerca del origen del universo por medio de la aceleración de particulas subátomicas que deambualaran libremente dentro de un tubo de titanio reforzado embobinado que segun las especulaciones de los cientificos se podrá alcanzar una velocidad considerable que ocasionará la colisión de estos elementos creando una radiación aproximada a la que en teoría se cree que tuvo el universo cuando se expandio a través del famoso big bang (es decir, recrea el big bang).

Dicha máquina esta instaurada actualmente en Ginebra, suiza y los limites de ese pais y Francia.

Supuestamente, los canales de la máquina de dios le dan una vuelta a la tierra (pues está enterrada 1050 m bajo tierra aproximadamente) para conseguir que las particulas subátomicas consigan revoluciones superiores a los de un agujero negro. Algunos cientificos temerosos dicen que este proyecto podria ser una amenaza para el planeta, pues dichas metas ambiciosas requieren una precisión perfecta que cualquier error podria culminar en un cataclismo.

La maquina de dios funciona con VMWARE Fusion para la comparticion de codigo informatico basado en linux a traves de máquinas virtuales de VMware ejecutadas en apple.

Los fisicos desarrolladores de este proyecto utilizan hardware macintosh que ejecuta software ejecutado en linux como scripts para los controladores externos escritos en python.

La maquina de dios además, esta enlazada con el LHC Computing Grid (una red de más de 150 centros de informática con aproximadamente 85 000 cpu´s que manejan más de 15 petabytes de információn nueva cada mes).

La capacidad de VMware Fusion de soportar y permitir a los usuarios de Mac ejecutar todas las aplicaciones de PC que necesitan en su hardware de una manera directa y sin problemas, ofrece al CERN una excelente solución para los retos que presenta la carencia de una plataforma hardware estándar, a la vez que es un elemento clave de la iniciativa de virtualización del CERN.

Si quieren saber más de este gran proyecto busquen informacion en el google (yo no les puse una liga ahora, porque les resumi lo que lei de varios articulos publicados en la internet).

Bueno pues espero que les haya gustado y nos vemos en clase (dios o demonio).

Recuerden que hay que estar orgullosos de nuestra sangre indigena como herederos antiguos del continente perdido Asorajal... Yo soy Mexica y tu¿?

domingo, 5 de octubre de 2008

¿Que Es Lo Que Hace Metaprogramación Especial?

Me fascinó tanto la entrada sobre metaprogramación que en vez de hacer un comentário decidí escribir también sobre este tema. No entendí muy bien la explicación de como metaprogramación hace su “mágica”. Pero las reflecciones abajo me convincieron que cualquiera “mágica” que tiene metaprogramación viene no del hecho de producir programas “automaticamente” pero del hecho de que no se puede prognosticar el conteudo del programa generado solo de ver el código del programa generador y esto es la misma “mágica” que tiene cualquier programa interactivo.

Un Metaprograma Como Un Sistema Abierto

Metaprogramación es el ato de criar un programa (que se llama “metaprograma”) que cuando se executa escribe otro programa. También se llama un metaprograma un programa que analisa o modifica otros programas, incluindo se mismo.

Hoy en dia un programa no es suficiente en si mismo para generar resultados. Requiere datos del usúario y bibliotecas escrito por otros. También un usuario puede, en efecto, hacer una llamada a una función, o por media de escoger un item de un menu o de hacer cliq en un icon. Y el programa puede buscar datos en un otro lado para dar una respuesta al pedido del usuario. Entonces, el programa actua como intermediario entre un o más usuarios y una o más fuentes otros fuentes de datos y funciones. El resultado de ejecutar el programa normalmente no us un otro programa, pero si una actuación que no se puede prognosticar del puro código del programa. En efecto, el programa funcione como un tipo de intérprete para el usuario, similar a un shell o un intérprete de un lenguaje interpretado.

En contraste con un intérprete, un compilador si “escribe un programa” (de código máquina) como respuesta a un entrada de un usuario. Asi, se considera un compilador como un metaprograma. La salida de un intérprete (o casi cualquier otro programa) es una (o más) accion(es). La salida de un compilador es un programa, una cadena que se llama código. Pero se puede ver la salida de un compilador también como una acción, la acción de “escribir un programa”. Asi se puede ver que es un caso especial de lo que hace cualquier programa interactivo, producir un resultado que depende en fuentes afuera del próprio programa, un fuente siendo, por ejemplo, un usuario o un servidor web.

Imagine un programa que “escribe otro programa” pero sin entradas de un usuario. El programa simplemente tiene código del forma:

string x ;
x = “main(){...}”
print x;

Este es un metaprograma, pero no agrega nada de valor al programa entre comillas. Seria mejor solo escribir el programa entre comillas que imprimir este programa. Lo que hace una metaprograma útil (y interesante) es que su salida depende de entradas de afuera del próprio programa. Pero esto es también lo que hace útil la gran mayoría de programas hoy en dia.

Metaprogramación y Inteligéncia Artificial

Lo que hace un programa, sea o no metaprograma, poderoso y interesante para mi no es solo su interactividad. También estoy estudiando la inteligéncia artificial y existen dos tipos que se puede incorporar en varios programas, incluindo metaprogramas.

Programas que Hacen Inferencias

Hay programas como de Prolog en lo cual el usuario puede introducir hechos como “Socrates es en un hombre” y “todo los hombres son mortales” y reglas como “si x es un hombre, entonces x es mortal” Prolog puede deducir de esto que Socrates es mortal.

Herencia ayuda un computador a hacer algo parecido. El programa puede decir que un clase A1 herede de un otro clase A. Entonces el compilador (un metaprograma) infere que A2 tiene los mismos métodos de A, aunque el programa no dice esta. Entonces el compilador genera código de máquina para implementar esto.

Programas que Aprenden: Algoritmos Genéticos

Wikipedia describe algoritmos genéticos asi:

Estos algoritmos hacen evolucionar una población de individuos sometiéndola a acciones aleatorias semejantes a las que actúan en la evolución biológica (mutaciones y recombinaciones genéticas), así como también a una Selección de acuerdo con algún criterio, en función del cual se decide cuáles son los individuos más adaptados, que sobreviven, y cuáles los menos aptos, que son descartados. (http://es.wikipedia.org/wiki/Algoritmos_genéticos)

El resultado de aplicar un algoritmo genético sobre muchas “generaciones” es una población de “individuos” más “aptos”. El programador no sabia como especificar directamente el conteudo de un individuo más apto, pero la “evolución” disparada con la ejecución del programa cria estes individuos.
Hay una aplicación a metaprogramación de esto. Se llama “programación genética”. En este caso los “individuos” a ser evoluidos son programas. Quiere decir que un algoritmo genética está aplicado a una “población” de programas para evoluir una población de programas más aptos.

tiny

Hola compañeros esta ocasiòn decidì subir información sobre tiny, un programa que entre otras cosas nos sirve para administrar las conexiones con nuestras computadoras.
Tiny Firewall, se trata de un programa diseñado especialmente para administrar cada acceso a nuestra conexión, controlar cada intercambio de información entre el ordenador y la Red, y sobre todo atacar cualquier tipo de intruso o infección que desee robar datos de nuestro sistema o perjudicarlo respectivamente.

Tiny Firewall trabaja con un menú de opciones práctico y muy completo, que protegerá la PC de toda clase de virus y cuidará nuestra información personal de ajenos. Es con Tiny Firewall que se puede obtener tranquilidad a la hora de navegar por sitios web, intercambiar cualquier tipo de archivo, descargar o subir algún fichero, etc. Trabaja además con una gran base de datos, a través de la cual es capaz de filtrar cualquier dirección de IP no permitida o indebida.
Es muy fácil de usar y sencillo, que no necesita de mucho tiempo para ser configurado ni requiriere de nuestra presencia para ejecutarse. Puede ser la solución a los problemas de inseguridad por infiltración/infección indeseada. Es importante tener en cuenta que trabaja con windows 2000-xp. La versiòn que encontré no funciona en Linux.
Si desean descargarlo necesitan licencia de tipo Shareware,pueden provar en el siguiente link:

sábado, 4 de octubre de 2008

GENTOO

Hola compañeros, me interesé por las distribuciones de linux, les confiezo solo conocia ubuntu, pero he estado investigando sobre debian, fedora y gentoo, wikipedia, es unas de las paginas donde encontre informaicon concisa de como surge o traba gentoo, lo pueden checar ahi, sino aqui les dejo esto, ojala les agrade y podamos hacer algunas comparaciones sobre las diferentes distribuciones de Linux
Gentoo Linux es una distribución GNU/Linux o BSD orientada a usuarios con cierta experiencia en estos sistemas operativos, fue fundada por Daniel Robbins, basada en la inactiva distribución llamada Enoch Linux. En el año 2002, ésta última pasó a denominarse Gentoo Linux.
El nombre Gentoo proviene del nombre en inglés del pingüino papúa. Nótese que la mascota de Linux es un pingüino.
Características
Portage
La piedra angular de Gentoo es Portage, un sistema de distribución de software inspirado en Ports de BSD. Portage consiste en un árbol local, que contiene las descripciones de los paquetes de software, así como los scripts necesarios para instalarlos. Este árbol se puede sincronizar con un servidor remoto mediante una orden:
emerge --sync
Cuando un paquete de software es seleccionado para instalar, Portage descarga los archivos con el código fuente y los compila al momento, generando los archivos ejecutables y documentación correspondiente. Es posible especificar las optimizaciones que emplear en la compilación, así como utilizar una variable llamada USE. Esta sirve para indicar la compatibilidad con otros programas que se desea aplicar al programa que se está compilando, y en consecuencia, se instalarán automáticamente los paquetes que proporcionan dicha compatibilidad. La posibilidad de indicar las optimizaciones junto con el uso del parámetro USE, permiten crear una distribución a medida, según el uso que se le vaya a dar al ordenador. De todas formas, Portage también soporta la instalación de binarios sin problemas, ya sean paquetes precompilados por el mismo sistema o paquetes que se encuentran exclusivamente en formato binario.
Portage permite mantener el software actualizado y controlar las versiones que se encuentran instaladas, proporcionando unas posibilidades similares a las de APT de Debian — excepto que APT utiliza por defecto binarios precompilados. Así, por ejemplo, con solo una orden:
emerge --update world se actualizaran todos los paquetes a la última versión estable conocida, sin ninguna intervención del usuario necesaria.
Binarios
Una ventaja de Gentoo es que las versiones de software se actualizan de forma continua, a diferencia de otras distribuciones donde los paquetes pasan meses en comprobación. Ello permite tener un sistema con las últimas versiones de todo el software — ideal para tareas de escritorio. Por el contrario, aunque es algo poco habitual, a veces el uso de versiones del software insuficientemente comprobadas da como resultado bugs que pueden suponer un riesgo para servidores de producción.
Otra desventaja de este sistema es que poner en marcha un sistema completo, o actualizar un sistema que ha estado desatendido durante una temporada, puede requerir una respetable cantidad de tiempo (horas o incluso días si el ordenador es muy antiguo), mientras se descargan y compilan todos los paquetes nuevos. Aun así, Gentoo permite por regla general una actualización sin problemas, a diferencia de otras distribuciones donde puede llegar a resultar complicado o casi imposible. Esta actualización también es posible a partir de binarios precompilados, lo que requiere menos tiempo.

La metaprogramación

Como no podia entrar al blog no habia subido nada pero ya lo logre, bueno encontre esta nota y me parecio interesante ponerla en el blog es sobre la metaprogramación, espero y les guste sale:
Nota: no se ven todas las funciones del editor y del blog no se por que pero la subo asi:

La metaprogramación es una técnica muy poderosa, y muy socorrida en el terreno de los lenguajes dinámicos. Puede llevarnos a reducir muy fuertemente el total de código que escribimos - Y lo que es mucho más importante, a minimizar la cantidad de código repetido innecesariamente. Nos lleva claramente a aumentar la calidad y mantenibilidad de nuestro código.

Programas que escriben programas

La metaprogramación consiste en escribir código que no ataca directamente al dominio del problema que queremos atacar, sino que al código que lo resolvería. Dicho sea de otro modo, el código que escribimos no modifica los datos o el estado de nuestra información, sino que el del programa.

Las ventajas de los lenguajes dinámicos
La metaprogramación no es una nueva idea - Nació hace ya más de 40 años, con el lenguaje Lisp, y se popularizó tremendamente en el lenguaje Smalltalk, a principios de los 80.

Ambos lenguajes fueron revolucionarios en diversos aspectos, y si no gozan hoy en dí­a de mayor popularidad, se debe a que, en sus implementaciones originales sufrí­an de problemas de rendimiento en el hardware de su época. Sin embargo, sus ideas básicas han servido para conformar a una gran cantidad de lenguajes que han ido adquiriendo una cada vez mayor popularidad y aceptación: Los lenguajes dinámicos.

Podemos categorizar a un lenguaje de dinámico cuando no requiere de ciclos determinados y claramente separados de compilación y ejecución. Mucha gente cree erróneamente que los lenguajes dinámicos (por ejemplo, Perl, Ruby, Python o PHP, ampliamente utilizados en el mundo del Software Libre) son interpretados - La realidad es completamente distinta, son lenguajes que cuentan con compiladores tremendamente eficientes, que en fracciones de segundo pueden convertir decenas de miles de ­líneas de código en una representación binaria (bytecode para sus respectivas máquinas virtuales).

La caracterí­stica definitoria de estos lenguajes como dinámicos no es el compilador ágil (aunque, claro está, lo requieren) - Es la presencia de la instrucción (o familia de instrucciones) «eval». En resumidas cuentas, eval recibe un parámetro, tí­picamente una cadena, y lo evalúa como código fuente - Como una primer probadita de metaprogramación, consideren el siguiente código de Ruby:

def crea_clase(nombre, clase_padre)
eval "class #{nombre} < #{clase_padre} ; end"
end

Al invocar a este método -claro está, en tiempo de ejecución- puedo ampliar la jerarquí­a de clases existente. Por ejemplo, si quiero definir suficientes clases para representar los muebles de una oficina, podrí­a decirle a Ruby:

['Mesa', 'Silla', 'Archivero', 'Librero'].each do |tipo|
crea_clase(tipo, 'Mueble')
end

Obviamente, la lista de objetos no necesariamente la tengo representada en mi código fuente - puede ser proporcionada por el usuario o determinada a partir del entorno de ejecución. Y a partir de este punto, para todos los propósitos de nuestro código, sería como si en tiempo de compilación hubiéramos incluido explí­citamente en el código:

class Mesa < Mueble; end
class Silla < Mueble; end
class Archivero < Mueble; end
class Librero < Mueble; end


Pero esto va mucho más allá de una manera cómoda y reducida de especificar clases.

Lenguajes específicos de dominio
A partir del número noviembre-diciembre de 2007 de SoftwareGurú hemos recibido entregas del tutorial de Ruby on Rails escrito por Carlos Ortega. Cuando nos acercamos por primera vez a Rails, lo primero que encontramos es una serie de declaraciones que no pertenecen a Ruby, y aparentan un estilo de programación declarativo. Por ejemplo, al definir un modelo:

class Person < ActiveRecord::Base
validates_presence_of :name
validates_numericality_of :age, :greater_than => 0, :less_than => 100
end

ActiveRecord es el ORM de Ruby on Rails - presenta una abstracción de los datos en las tablas de la base de datos, dándoles una interfaz natural orientada a objetos. El módulo ActiveRecord::Validations::ClassMethods extiende al lenguaje a través de la metaprogramación, y expone una serie de validadores, que presentan una sintaxis natural de escribir y fácil de leer - Un lenguaje especí­fico al dominio de las validaciones.

Reflectividad
La mayor parte de los lenguajes dinámicos son también reflectivos. Los objetos (y, recuerden, en los lenguajes completamente orientados a objetos, todo es un objeto - Incluyendo las clases, no sólo los objetos instanciados) pueden ser interrogados respecto a los métodos que ofrecen. Un ejemplo simple que muestra el poder combinado de la reflectividad junto con la metaprogramación es este simple rastreador universal:

def trace(obj)
obj.methods.each do |meth|
eval "def obj.#{meth}(*args)
warn 'Llamando al método #{meth} en #{obj.class}'
super(*args)
end"
end
end


Basta llamar a nuestra función «trace» con cualquier objeto del sistema para que nos muestre un rastreo completo de cada una de las acciones que éste realice. Por ejemplo (desde la consola interactiva de Ruby):

>> p = Person.find(:first)
>> trace(p)
>> p.name
Llamando al método method_missing en Person
Llamando al método class en Person
Llamando al método class en Person
Llamando al método class en Person
Llamando al método send en Person
=> "Fulano D. Tal"


Aquí podemos encontrar cómo es que incluso la misma clase Person (que no es otra que la que declaramos hace algunas líneas) recibe sus métodos: ¡A través de la reflexibilidad, preguntándole a la base de datos acerca de su propia estructura!

El espacio no permite, tristemente, dar más ejemplos de cómo podemos explotar estas técnicas - Pero espero que con esta sencilla muestra puedan comprender la riqueza que esta técnica nos proporciona, y lo conciso que puede hacer a nuestro código.

Acerca del autor
Gunnar Wolf ha sido usuario y promotor de Software Libre en México por más de diez años. Es fundador del Congreso Nacional de Software Libre (CONSOL) y miembro externo del Departamento de Seguridad de Cómputo en la UNAM. Participa como desarrollador en el proyecto Debian desde el 2003. Trabaja como administrador de red y en el desarrollo de sistemas para el Instituto de Investigaciones Económicas de la UNAM.